From 51cfdae50ff91d99d9f1fd1dc9756a5335ee91fb Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 3 Apr 2000 20:56:40 +0000 Subject: [PATCH] Hi, here is an updated version of the bit type with a bugfix and all the necessa ry SQL functions defined. This should replace what is currently in contrib. I'd appreciate any comments on what is there. Kind regards, Adriaan --- contrib/bit/Makefile | 50 +++++++-- contrib/bit/README | 3 - contrib/bit/varbit.c | 168 ++++++++++++++--------------- contrib/bit/varbit.demo.sql | 29 +++++ contrib/bit/varbit.drop.sql | 36 +++++++ contrib/bit/varbit.h | 52 ++++----- contrib/bit/varbit.source | 171 ++++++++++++++++++++++++++++++ contrib/bit/varbit_glue.c | 22 ++++ contrib/bit/vartest.c | 24 +++-- src/bin/pgaccess/lib/languages/ID | Bin 735193 -> 736859 bytes 10 files changed, 423 insertions(+), 132 deletions(-) create mode 100644 contrib/bit/varbit.demo.sql create mode 100644 contrib/bit/varbit.drop.sql create mode 100644 contrib/bit/varbit.source create mode 100644 contrib/bit/varbit_glue.c diff --git a/contrib/bit/Makefile b/contrib/bit/Makefile index 9603cba27f8..96e751d0c18 100644 --- a/contrib/bit/Makefile +++ b/contrib/bit/Makefile @@ -1,10 +1,46 @@ -CFLAGS = -g +ifndef PGDIR +PGDIR= ../.. +PGDIR=/data/build/postgresql-7.0beta3 +endif -varbit: vartest.o varbit.o - $(CC) $(CFLAGS) -o $@ $^ +SRCDIR= $(PGDIR)/src -varbit.o: varbit.c varbit.h -vartest.o: vartest.c varbit.h +include $(SRCDIR)/Makefile.global + +TARGETS= varbit.sql varbit$(DLSUFFIX) +# vartest +SOURCE= varbit.c varbit_glue.c +OBJ= $(SOURCE:.c=.o) +CFLAGS += -g + +all: $(TARGETS) + +varbit$(DLSUFFIX): $(OBJ) + $(CC) $(CFLAGS) -shared -o varbit$(DLSUFFIX) $(SOURCE) $(CLIBS) + +vartest: varbit.o vartest.o + $(CC) -o $@ varbit.o vartest.o + +install: + $(MAKE) all + cp -p varbit$(DLSUFFIX) $(LIBDIR)/contrib + chmod 555 $(LIBDIR)/contrib/varbit$(DLSUFFIX) + +%.sql: %.source + echo $(SRCDIR) + if [ -z "$$USER" ]; then USER=$$LOGNAME; fi; \ + if [ -z "$$USER" ]; then USER=`whoami`; fi; \ + if [ -z "$$USER" ]; then echo 'Cannot deduce $$USER.'; exit 1; fi; \ + rm -f $@; \ + C=`pwd`; \ + O=$C; \ + if [ -d ${LIBDIR}/contrib ]; then O=${LIBDIR}/contrib; else \ + echo "contrib directory does not exist."; fi; \ + sed -e "s:_CWD_:$$C:g" \ + -e "s:_OBJWD_:$$O:g" \ + -e "s:_DLSUFFIX_:$(DLSUFFIX):g" \ + -e "s/_USER_/$$USER/g" < $< > $@ + +clean: + rm -f $(TARGETS) varbit.o -clean: - rm -f *.o varbit diff --git a/contrib/bit/README b/contrib/bit/README index b2ddb904b30..18a1fe1820b 100644 --- a/contrib/bit/README +++ b/contrib/bit/README @@ -7,9 +7,6 @@ make this code as independent as possible of the byte length, but it is quite possible that there may be problems on machines that don't have 8 bits/byte (are there still any around?). -In the input routines I have assumed that the parser eats the quotes -in B'...' or X'...'. - The SQL standard only defines comparison, SUBSTR and concatenation operators, and these have been implemented. In addition all logical operators have been implemented, i.e. ~,|,&,^,<< and >>. This is diff --git a/contrib/bit/varbit.c b/contrib/bit/varbit.c index 257f9766fd6..2a677ec6040 100644 --- a/contrib/bit/varbit.c +++ b/contrib/bit/varbit.c @@ -4,18 +4,14 @@ * Functions for the built-in type bit() and varying bit(). * * IDENTIFICATION - * $Header: /cvsroot/pgsql/contrib/bit/Attic/varbit.c,v 1.1 1999/11/29 22:34:36 momjian Exp $ + * $Header: /cvsroot/pgsql/contrib/bit/Attic/varbit.c,v 1.2 2000/04/03 20:56:40 momjian Exp $ * *------------------------------------------------------------------------- */ -#include "postgres.h" #include "varbit.h" -/* #include "access/htup.h" -#include "catalog/pg_type.h" -#include "utils/builtins.h" -*/ - +/*#include "catalog/pg_type.h" */ +/*#include "utils/builtins.h" */ /* @@ -43,22 +39,22 @@ * (XXX dummy is here because we pass typelem as the second argument * for array_in. copied this, no idea what it means??) */ -char * +bits8 * zpbitin(char *s, int dummy, int32 atttypmod) { - char *result, - *sp; /* pointer into the character string */ + bits8 *result; /* the bits string that was read in */ + char *sp; /* pointer into the character string */ bits8 *r; int len, /* Length of the whole data structure */ bitlen, /* Number of bits in the bit string */ slen; /* Length of the input string */ - int bit_not_hex; /* 0 = hex string 1=bit string */ - int i, bc, ipad; - bits8 x, y; + int bit_not_hex = 0; /* 0 = hex string 1=bit string */ + int bc, ipad; + bits8 x = 0; if (s == NULL) - return NULL; + return (bits8 *) NULL; /* Check that the first character is a b or an x */ if (s[0]=='b' || s[0]=='B') @@ -82,7 +78,8 @@ zpbitin(char *s, int dummy, int32 atttypmod) if (atttypmod == -1) atttypmod = bitlen; else - if (bitlen>atttypmod && bit_not_hex || bitlen>atttypmod+3 && !bit_not_hex) + if ((bitlen>atttypmod && bit_not_hex) || + (bitlen>atttypmod+3 && !bit_not_hex)) elog(ERROR, "zpbitin: bit string of size %d cannot be written into bits(%d)", bitlen,atttypmod); @@ -90,10 +87,10 @@ zpbitin(char *s, int dummy, int32 atttypmod) len = VARBITDATALEN(atttypmod); if (len > MaxAttrSize) - elog(ERROR, "zpbitin: length of bit() must be less than %d", + elog(ERROR, "zpbitin: length of bit() must be less than %ld", (MaxAttrSize-VARHDRSZ-VARBITHDRSZ)*BITSPERBYTE); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); /* set to 0 so that *r is always initialised and strin is zero-padded */ memset(result, 0, len); VARSIZE(result) = len; @@ -103,7 +100,7 @@ zpbitin(char *s, int dummy, int32 atttypmod) significant byte first. s points to the byte before the beginning of the bitstring */ sp = s+1; - r = (bits8 *) VARBITS(result); + r = VARBITS(result); if (bit_not_hex) { /* Parse the bit representation of the string */ @@ -166,10 +163,10 @@ zpbitin(char *s, int dummy, int32 atttypmod) * for long strings */ char * -zpbitout(char *s) +zpbitout(bits8 *s) { char *result, *r; - VarBit sp; + bits8 *sp; int i, len, bitlen; if (s == NULL) @@ -183,7 +180,7 @@ zpbitout(char *s) bitlen = VARBITLEN(s); len = bitlen/4 + (bitlen%4>0 ? 1 : 0); result = (char *) palloc(len + 4); - sp = (bits8 *) VARBITS(s); + sp = VARBITS(s); r = result; *r++ = 'X'; *r++ = '\''; @@ -206,10 +203,10 @@ zpbitout(char *s) * Prints the string a bits */ char * -zpbitsout(char *s) +zpbitsout(bits8 *s) { char *result, *r; - VarBit sp; + bits8 *sp; bits8 x; int i, k, len; @@ -223,7 +220,7 @@ zpbitsout(char *s) { len = VARBITLEN(s); result = (char *) palloc(len + 4); - sp = (bits8 *) VARBITS(s); + sp = VARBITS(s); r = result; *r++ = 'B'; *r++ = '\''; @@ -252,22 +249,22 @@ zpbitsout(char *s) * varbitin - * converts a string to the internal representation of a bitstring. */ -char * +bits8 * varbitin(char *s, int dummy, int32 atttypmod) { - char *result, - *sp; /* pointer into the character string */ + bits8 *result; /* The resulting bit string */ + char *sp; /* pointer into the character string */ bits8 *r; int len, /* Length of the whole data structure */ bitlen, /* Number of bits in the bit string */ slen; /* Length of the input string */ - int bit_not_hex; - int i, bc, ipad; - bits8 x, y; + int bit_not_hex = 0; + int bc, ipad; + bits8 x = 0; if (s == NULL) - return NULL; + return (bits8 *) NULL; /* Check that the first character is a b or an x */ if (s[0]=='b' || s[0]=='B') @@ -289,7 +286,8 @@ varbitin(char *s, int dummy, int32 atttypmod) reading a hex string and not by more than 3 bits, as a hex string gives and accurate length upto 4 bits */ if (atttypmod > -1) - if (bitlen>atttypmod && bit_not_hex || bitlen>atttypmod+3 && !bit_not_hex) + if ((bitlen>atttypmod && bit_not_hex) || + (bitlen>atttypmod+3 && !bit_not_hex)) elog(ERROR, "varbitin: bit string of size %d cannot be written into varying bits(%d)", bitlen,atttypmod); @@ -297,10 +295,10 @@ varbitin(char *s, int dummy, int32 atttypmod) len = VARBITDATALEN(bitlen); if (len > MaxAttrSize) - elog(ERROR, "varbitin: length of bit() must be less than %d", + elog(ERROR, "varbitin: length of bit() must be less than %ld", (MaxAttrSize-VARHDRSZ-VARBITHDRSZ)*BITSPERBYTE); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); /* set to 0 so that *r is always initialised and strin is zero-padded */ memset(result, 0, len); VARSIZE(result) = len; @@ -310,7 +308,7 @@ varbitin(char *s, int dummy, int32 atttypmod) significant byte first. s points to the byte before the beginning of the bitstring */ sp = s + 1; - r = (VarBit) VARBITS(result); + r = VARBITS(result); if (bit_not_hex) { /* Parse the bit representation of the string */ @@ -383,11 +381,10 @@ varbitin(char *s, int dummy, int32 atttypmod) */ bool -biteq (char *arg1, char *arg2) +biteq (bits8 *arg1, bits8 *arg2) { int bitlen1, bitlen2; - bits8 *p1, *p2; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) return (bool) 0; @@ -402,11 +399,10 @@ biteq (char *arg1, char *arg2) } bool -bitne (char *arg1, char *arg2) +bitne (bits8 *arg1, bits8 *arg2) { int bitlen1, bitlen2; - bits8 *p1, *p2; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) return (bool) 0; @@ -429,11 +425,10 @@ bitne (char *arg1, char *arg2) * Anything is equal to undefined. */ int -bitcmp (char *arg1, char *arg2) +bitcmp (bits8 *arg1, bits8 *arg2) { int bitlen1, bytelen1, bitlen2, bytelen2; - bits8 *p1, *p2; int cmp; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) @@ -452,25 +447,25 @@ bitcmp (char *arg1, char *arg2) } bool -bitlt (char *arg1, char *arg2) +bitlt (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) == -1); } bool -bitle (char *arg1, char *arg2) +bitle (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) <= 0); } bool -bitge (char *arg1, char *arg2) +bitge (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) >= 0); } bool -bitgt (char *arg1, char *arg2) +bitgt (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) == 1); } @@ -478,11 +473,11 @@ bitgt (char *arg1, char *arg2) /* bitcat * Concatenation of bit strings */ -char * -bitcat (char *arg1, char *arg2) +bits8 * +bitcat (bits8 *arg1, bits8 *arg2) { int bitlen1, bitlen2, bytelen, bit1pad, bit2shift; - char *result; + bits8 *result; bits8 *pr, *pa; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) @@ -493,7 +488,7 @@ bitcat (char *arg1, char *arg2) bytelen = VARBITDATALEN(bitlen1+bitlen2); - result = (char *) palloc(bytelen*sizeof(bits8)); + result = (bits8 *) palloc(bytelen*sizeof(bits8)); VARSIZE(result) = bytelen; VARBITLEN(result) = bitlen1+bitlen2; printf("%d %d %d \n",VARBITBYTES(arg1),VARBITLEN(arg1),VARBITPAD(arg1)); @@ -510,10 +505,10 @@ bitcat (char *arg1, char *arg2) { /* We need to shift all the results to fit */ bit2shift = BITSPERBYTE - bit1pad; - pa = (VarBit) VARBITS(arg2); - pr = (VarBit) VARBITS(result)+VARBITBYTES(arg1)-1; + pa = VARBITS(arg2); + pr = VARBITS(result)+VARBITBYTES(arg1)-1; for ( ; pa < VARBITEND(arg2); pa++) { - *pr = *pr | ((*pa >> bit2shift) & BITMASK); + *pr |= ((*pa >> bit2shift) & BITMASK); pr++; if (pr < VARBITEND(result)) *pr = (*pa << bit1pad) & BITMASK; @@ -528,17 +523,17 @@ bitcat (char *arg1, char *arg2) * Note, s is 1-based. * SQL draft 6.10 9) */ -char * -bitsubstr (char *arg, int32 s, int32 l) +bits8 * +bitsubstr (bits8 *arg, int32 s, int32 l) { int bitlen, rbitlen, len, - ipad, + ipad = 0, ishift, i; int e, s1, e1; - char * result; + bits8 * result; bits8 mask, *r, *ps; if (!PointerIsValid(arg)) @@ -552,7 +547,7 @@ bitsubstr (char *arg, int32 s, int32 l) { /* Need to return a null string */ len = VARBITDATALEN(0); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); VARBITLEN(result) = 0; VARSIZE(result) = len; } @@ -562,22 +557,22 @@ bitsubstr (char *arg, int32 s, int32 l) ending at position e1-1 */ rbitlen = e1-s1; len = VARBITDATALEN(rbitlen); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); VARBITLEN(result) = rbitlen; VARSIZE(result) = len; + len -= VARHDRSZ + VARBITHDRSZ; /* Are we copying from a byte boundary? */ if ((s1-1)%BITSPERBYTE==0) { /* Yep, we are copying bytes */ - len -= VARHDRSZ + VARBITHDRSZ; memcpy(VARBITS(result),VARBITS(arg)+(s1-1)/BITSPERBYTE,len); } else { /* Figure out how much we need to shift the sequence by */ ishift = (s1-1)%BITSPERBYTE; - r = (VarBit) VARBITS(result); - ps = (VarBit) VARBITS(arg) + (s1-1)/BITSPERBYTE; + r = VARBITS(result); + ps = VARBITS(arg) + (s1-1)/BITSPERBYTE; for (i=0; i=b as "a>=b",a>b as "a>b",a<=>b as "a<=>b" from bit_example; +select a,a<<4 as "a<<4",b,b>>2 as "b>>2" from bit_example; +select a,b,a||b as "a||b", bitsubstr(a,4,4) as "sub(a,4,4)", + bitsubstr(b,2,4) as "sub(b,2,4)", + bitsubstr(b,5,5) as "sub(b,5,5)" + from bit_example; + +drop table bit_example; diff --git a/contrib/bit/varbit.drop.sql b/contrib/bit/varbit.drop.sql new file mode 100644 index 00000000000..54b831ea2dc --- /dev/null +++ b/contrib/bit/varbit.drop.sql @@ -0,0 +1,36 @@ +DROP FUNCTION biteq(bits,bits); +DROP OPERATOR = (bits,bits); +DROP FUNCTION bitne(bits,bits); +DROP OPERATOR <> (bits,bits); +DROP FUNCTION bitlt(bits,bits); +DROP OPERATOR < (bits,bits); +DROP FUNCTION bitle(bits,bits); +DROP OPERATOR <= (bits,bits); +DROP FUNCTION bitgt(bits,bits); +DROP OPERATOR > (bits,bits); +DROP FUNCTION bitge(bits,bits); +DROP OPERATOR >= (bits,bits); +DROP FUNCTION bitcmp(bits,bits); +DROP OPERATOR <=> (bits,bits); + +DROP FUNCTION bitor(bits,bits); +DROP OPERATOR | (bits,bits); +DROP FUNCTION bitand(bits,bits); +DROP OPERATOR & (bits,bits); +DROP FUNCTION bitxor(bits,bits); +DROP OPERATOR ^ (bits,bits); +DROP FUNCTION bitnot(bits); +DROP OPERATOR ~ (none,bits); + +DROP FUNCTION bitshiftleft(bits,int4); +DROP OPERATOR << (bits,int4); +DROP FUNCTION bitshiftright(bits,int4); +DROP OPERATOR >> (bits,int4); + +DROP FUNCTION bitsubstr(bits,integer,integer); +DROP OPERATOR || (bits,bits); +DROP FUNCTION bitcat(bits,bits); + +DROP FUNCTION varbit_in(opaque); +DROP FUNCTION varbit_out(opaque); +DROP TYPE bits; diff --git a/contrib/bit/varbit.h b/contrib/bit/varbit.h index af55f486ea3..44007ad10a9 100644 --- a/contrib/bit/varbit.h +++ b/contrib/bit/varbit.h @@ -1,17 +1,21 @@ +#include "c.h" #include "postgres.h" -typedef bits8 *VarBit; -typedef uint32 BitIndex; - #define HEXDIG(z) (z)<10 ? ((z)+'0') : ((z)-10+'A') +/* Modeled on struct varlena from postgres.h, bu data type is bits8 */ +struct varbita +{ + int32 vl_len; + bits8 vl_dat[1]; +}; #define BITSPERBYTE 8 #define VARBITHDRSZ sizeof(int32) /* Number of bits in this bit string */ -#define VARBITLEN(PTR) (((struct varlena *)VARDATA(PTR))->vl_len) +#define VARBITLEN(PTR) (((struct varbita *)VARDATA(PTR))->vl_len) /* Pointer tp the first byte containing bit string data */ -#define VARBITS(PTR) (((struct varlena *)VARDATA(PTR))->vl_dat) +#define VARBITS(PTR) (((struct varbita *)VARDATA(PTR))->vl_dat) /* Number of bytes in the data section of a bit string */ #define VARBITBYTES(PTR) (VARSIZE(PTR) - VARHDRSZ - VARBITHDRSZ) /* Padding of the bit string at the end */ @@ -27,22 +31,22 @@ typedef uint32 BitIndex; #define BITHIGH 0x80 -char * zpbitin(char *s, int dummy, int32 atttypmod); -char * zpbitout(char *s); -char * zpbitsout(char *s); -char * varbitin(char *s, int dummy, int32 atttypmod); -bool biteq (char *arg1, char *arg2); -bool bitne (char *arg1, char *arg2); -bool bitge (char *arg1, char *arg2); -bool bitgt (char *arg1, char *arg2); -bool bitle (char *arg1, char *arg2); -bool bitlt (char *arg1, char *arg2); -int bitcmp (char *arg1, char *arg2); -char * bitand (char * arg1, char * arg2); -char * bitor (char * arg1, char * arg2); -char * bitxor (char * arg1, char * arg2); -char * bitnot (char * arg); -char * bitshiftright (char * arg, int shft); -char * bitshiftleft (char * arg, int shft); -char * bitcat (char *arg1, char *arg2); -char * bitsubstr (char *arg, int32 s, int32 l); +bits8 * zpbitin(char *s, int dummy, int32 atttypmod); +char * zpbitout(bits8 *s); +char * zpbitsout(bits8 *s); +bits8 * varbitin(char *s, int dummy, int32 atttypmod); +bool biteq (bits8 *arg1, bits8 *arg2); +bool bitne (bits8 *arg1, bits8 *arg2); +bool bitge (bits8 *arg1, bits8 *arg2); +bool bitgt (bits8 *arg1, bits8 *arg2); +bool bitle (bits8 *arg1, bits8 *arg2); +bool bitlt (bits8 *arg1, bits8 *arg2); +int bitcmp (bits8 *arg1, bits8 *arg2); +bits8 * bitand (bits8 * arg1, bits8 * arg2); +bits8 * bitor (bits8 * arg1, bits8 * arg2); +bits8 * bitxor (bits8 * arg1, bits8 * arg2); +bits8 * bitnot (bits8 * arg); +bits8 * bitshiftright (bits8 * arg, int shft); +bits8 * bitshiftleft (bits8 * arg, int shft); +bits8 * bitcat (bits8 *arg1, bits8 *arg2); +bits8 * bitsubstr (bits8 *arg, int32 s, int32 l); diff --git a/contrib/bit/varbit.source b/contrib/bit/varbit.source new file mode 100644 index 00000000000..8b9dc29aab5 --- /dev/null +++ b/contrib/bit/varbit.source @@ -0,0 +1,171 @@ +LOAD '_OBJWD_/varbit.so'; + +CREATE FUNCTION varbit_in(opaque) + RETURNS bit + AS '_OBJWD_/varbit.so' + LANGUAGE 'c'; + +CREATE FUNCTION varbit_out(opaque) + RETURNS opaque + AS '_OBJWD_/varbit.so' + LANGUAGE 'c'; + +CREATE TYPE bits ( + internallength = -1, + input = varbit_in, + output = varbit_out +); + +CREATE FUNCTION bitcat(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR || ( + leftarg = bits, + rightarg = bits, + procedure = bitcat +); + +CREATE FUNCTION bitsubstr(bits,integer,integer) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE FUNCTION biteq(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR = ( + leftarg = bits, + rightarg = bits, + procedure = biteq, + negator = <>, + commutator = = +); + +CREATE FUNCTION bitne(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR <> ( + leftarg = bits, + rightarg = bits, + procedure = bitne, + negator = =, + commutator = <> +); + +CREATE FUNCTION bitlt(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR < ( + leftarg = bits, + rightarg = bits, + procedure = bitlt +); + +CREATE FUNCTION bitle(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR <= ( + leftarg = bits, + rightarg = bits, + procedure = bitle +); + +CREATE FUNCTION bitgt(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR > ( + leftarg = bits, + rightarg = bits, + procedure = bitgt, + negator = <=, + commutator = < +); + +CREATE FUNCTION bitge(bits,bits) RETURNS bool + as '_OBJWD_/varbit.so' + language 'C'; + +CREATE OPERATOR >= ( + leftarg = bits, + rightarg = bits, + procedure = bitge, + negator = <, + commutator = <= +); + +CREATE FUNCTION bitcmp(bits,bits) RETURNS int4 + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR <=> ( + leftarg = bits, + rightarg = bits, + procedure = bitcmp +); + +CREATE FUNCTION bitor(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR | ( + leftarg = bits, + rightarg = bits, + procedure = bitor, + commutator = | +); + +CREATE FUNCTION bitand(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR & ( + leftarg = bits, + rightarg = bits, + procedure = bitand, + commutator = & +); + + +CREATE FUNCTION bitxor(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR ^ ( + leftarg = bits, + rightarg = bits, + procedure = bitxor +); + +CREATE FUNCTION bitnot(bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR ~ ( + rightarg = bits, + procedure = bitnot +); + +CREATE FUNCTION bitshiftleft(bits,int4) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR << ( + leftarg = bits, + rightarg = int4, + procedure = bitshiftleft +); + +CREATE FUNCTION bitshiftright(bits,int4) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR >> ( + leftarg = bits, + rightarg = int4, + procedure = bitshiftright +); diff --git a/contrib/bit/varbit_glue.c b/contrib/bit/varbit_glue.c new file mode 100644 index 00000000000..29b7debd03c --- /dev/null +++ b/contrib/bit/varbit_glue.c @@ -0,0 +1,22 @@ +/* Glue file to use varbit before it is properly integrated with postgres */ + +#include "varbit.h" + +bits8 * varbit_in (char * s); +char * varbit_out (bits8 *s); + +bits8 * +varbit_in (char * s) { + return varbitin (s, 0, -1); +} + +/*char * +varbit_out (bits8 *s) { + return zpbitout(s); +} +*/ + +char * +varbit_out (bits8 *s) { + return zpbitsout(s); +} diff --git a/contrib/bit/vartest.c b/contrib/bit/vartest.c index 732141e8df4..f07f5c5b833 100644 --- a/contrib/bit/vartest.c +++ b/contrib/bit/vartest.c @@ -2,6 +2,8 @@ #include "varbit.h" #include +void print_details (unsigned char *s); + const int numb = 8; /* const char *b[] = { "B0010", "B11011011", "B0001", "X3F12", "X27", "B", @@ -23,13 +25,13 @@ void print_details (unsigned char *s) printf("\n"); } -void +int main () { int i, j; char *s[numb]; - for (i=0; i %s\n",zpbitsout(s[3]),9,8, zpbitsout(bitsubstr(s[3],9,8))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, zpbitsout(bitsubstr(s[3],1,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, zpbitsout(bitsubstr(s[3],3,5))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, zpbitsout(bitsubstr(s[3],3,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17, zpbitsout(bitsubstr(s[3],3,17))); printf ("\nLOGICAL AND:\n"); for (i=0; i %s\n",zpbitsout(s[3]),9,8, zpbitsout(bitsubstr(s[3],9,8))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, zpbitsout(bitsubstr(s[3],1,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, zpbitsout(bitsubstr(s[3],3,5))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, zpbitsout(bitsubstr(s[3],3,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17, - zpbitsout(bitsubstr(s[3],3,17))); + printf("%s (%d,%d) => %s (%s)\n",zpbitsout(s[3]),3,17, + zpbitsout(bitsubstr(s[3],3,17)),zpbitsout(bitsubstr(s[3],3,17))); printf ("\nLOGICAL AND:\n"); for (i=0; i|4kW+z*QPitwJm|hs4J2W~rJ}=;biD~)2Fh0Lv3r5H89G^ZY&v#8s7Yp(< zF+Dc9cyQb{otc@mofj7-+|$D1!pz*nsGVYLX70eKG#wjV7@eFs+%kMtOQU7{_~_K^ zB4fFa}%!%#F+7m}Yiz zc6<(n9UdhN=dfh$;r$bCsKfgYE=~bu4$E=okI3`r7-)(mp|PV21{gm+K1R~C3^!0d zHA-ru*fl_rATvHXf45u5{KC}eJa$N$VbWvcbMq5K9J7thOihhWAGC8s0OQSLiqXTC zbm7^J4sxKyLW2v&+78UjEX*&=jbZ^PwuD1VOf^0|Hgj-d8kEIcj*zUGKZ>3#ni(6N z#2nZ?)XG9<4jvfuWSo=Lqf*U)?w%|S%r-u~Fp7>V-S9hhNZ*;+g^8(&d$?w_j}$`( zRmC+-%p3+^5$(~rdDlL04f;-5tY#1UNx4Onvxm8Y1{d%9aR_X7S>~Ubn8zZvLo{ab zzleE8LE?2p#WU=s8rap+a&QJMuL9kt4g+g+nUV*LG3iStrVo;9_n>HW?(q2jY#jU!0zqFUjK}-*r}Y5Q7~VB}-v2Y}54o=#-2?mT4K@3-T@=I>fc3;rtxX zxEgDj8^?B{?(q208F@H5ecX;dJ$@Y9&1%fruplQH?D*Uq zIhL#8KCiJ8%yG?l9z6(ABXXiKP%wR9VQw5fF~q#cAu10~P@SM;|H1LmgWxOF7oYMTnhMEGDLapdW*BdHhC%6=rW5J_zY!tTU08EK%GPe~S zI_X+q$T;9cY;GmSHJY7kfK;(^ZhX?=MYQJJX7Z6j;yTTF+@(zh@%e)jvi;~Wf9JSt zDjyXlPOZ4178V<`-0}d?PYl=Oe8y7A??f7xn zA8Pf6OhJl}(yr+o)rOE9P3OmtF2X(Xpjsy?7vYMyPRB;a7Of&exn3?o>&f|+6XQZl zRE#&^B<`IA2aXFNb`Z7kv4i6W76q9A9})%$pcPpM(#hn|0I2}UlfE@I*=uI3`9d{) z+C7K;$b=euW@q8@yY4J`sb^x>{tBlI71%W5m2`K!-g3=e4(Vi2pay>VIDDa|uGchR zD!u7&U9TUXU!0T;b_F+#A8i`_2KX9kT=UGw6km?MxCFXaE%*y z+z*3w%)wN8G%pT3I7x9M@DdPregOfJ14vn4fi|;re_WNdV-wSd#9E-^=;DH~<@xa7 z#&;f?r*|MbbUxgovAMggfkf?*1EU-RPvV2`w1zl19@ zIF>}wJUCFWa-A3ahM*40%ax7-$-D0nOs)V8v8Taf1`H45E-;=T2T-bLo7tIggOS>P zyCuHN7R`*$S%n(9K_Sbep@5s5>EuZgTF|g%T4-K~^Di(26Ox6V-Zc4w%rM^5LM2tm zytU|nMkkJQx*DD)XOD=W;`zY5NS=KXt%ApchZoTnwgu0yI^(esqd+&x#N5R3vU{GK zm=5KL0AhO|!?|{h?cC%1m@qVEn4f_|J~6+4qFAf=N)|OxHjiBqI&2^u)1oVQX|*oSry-*XW#Z06-*#Tz5$ix#zLqaSTJ|U}uFRhN;`U9Yuv?TiC-t z7c?NOikjg4;~7bZJ7uUV$U_iEEYl)x!~-@TW}V&=_S$2>=S6WL?Gt=Em^%oIplizxO*E_-v7qziEx>S} za{xLd?1KknAY2g=VWLD>h{rHJ0R*6`)$D?>E*gfA42s4zm~6y372;FaZbbWH@X&GQ zkY9&FijOX;LX$YB_Z(3;zh8|xe+0I{O*=m^jX;4wgUtj&-oV#JoM3r{o6rj0v^3}k zJrHqF<*_}$Ss3j((bNE#E)1@bgMpIoO5T}R@Qp{u8iK`6$g2;S@$8~CJ}pjw64q4$ zIOhBud0dce0&xHc?_YMyJu)#7Ypl!1s=KF0ec))p#^}_<7|6t2h3hcxVkI;fKQ8-i zpX?sv`H-I20wO1@0_otJxRI=3XE^N&4v)_uDnUxp!AIsBHyH8@txjnTyMJ`-FZk*2q5;6Ljj&W3j1l3 zgP~-8qTzi#v1_c5CRrPxgOi70#gG6yWH|>#@OZCn3U$a_&nb@Dl8$-M<*Tk0wU_Jk@xaYitRwe>PKScTMc#;Z0Ld#GzBoT z=sXyJ^RP=+xCnqL$EPGhh5bi?u#1~cp1r4qI;w-oV}j)-4(qdg^TFGAt@1YT>>LC8 zBs_;l>ut2`#iMdIUJLp2-Ue!dw}I#2ZQwb28v@vjG0_F+y$w7%Z-Y-w-i9g)&IZdC zryEFfyOHLdw}A@fZ4e6Hh6RGR0nm9Hcsew397>d9y%HM*(c4M2Z%rXeoar3Ltkw+i z>Bv-r9q@PvDp$qkWuz>karXTf**>3K`cBbJ|LSO zr}byQNewinfGpDUF8u_^kB3JjyI>afGn3AaGiW-w%c=JR1mx&~Re*d>dKb=+n4=E) z1YeM8a1r=~Cp`_guM7w#TlON$Eb%ZNUyi{KkFgL~_(IIVF4nuhTiVmx--SoEcZ&do zKE8r|U||mK8f)3xMI4!@J?&orVIgc*v-#ZVMdXrV;*G(fVg z7P4t9JQr}};`3M*bonUGgi1ox5*|W0>K=U_%YrJ8{X4fNl12gy$yiv@uD!8d3eu-^Cezb`(3v*~@!W3i^ zVX?p_!Xhk*uq-IqtXLEiVNwSF2eX7sSZo(FVX^EQC;~}@#iHx2&4~p*5vEG$hA7Y_ z!fZ){)B8+VY~(Uwwt$&1`$WeWPlL3$VxlbIl3o_DNiX}1Ha6*HL6!8f1*3~NcISv? z>WQ5^i=q<|OMD(IG@%zWKIR(Ow3w}9TFgF$WS0Z2N2meDWe#rGRG5Q&D$Ikk4DMvf zKydb`%Z%AtdbDm7NwA>wT#D@M-Q*(?uRgFf9YkF~>#N`f3@x-fI-_w+rdgPKvsVp9 z*bh9jxS)oC6w}kQ-I)JUkGh#p)}SGDHnenOiY@UR5;Yc#i5d;NJWZy^=4o`1uq^ak&s%0R1EB9!b>bJ|R(~3tgTjQ^X?#RWRoOv0ApAk4({62&Ux-a(+&+HTL2F z6-D+)mQ4W116BtkLKTidoy*_Ziuq}wyRVziRxZpTUK}4ou;5xFZN#JV2rkSZ{tT51 zGm9SL8M3|T!RqtCN7ILy#Q?CHP9XeoJFJDmunu%0Vj*%|=qSE~9fh&^e1kQsIHX*z zamkWQnNOBv3T>_=Q{-|bnKGX%v4s-C<8d?mEf>Pe{D8xuxvh2~y#;*CZlRlPqz(Y* z+~H{3f9=4iZ6oLk4Z{27ntf_6fSFVc8GGShBxLVr!9JMs$hiTOBq?5bDkaKmuNwo)U>nC`E5A{ma!K&P$7VuPoDj3 z7Fd{T*v%rytT(#s2Pxo3;9j4God1GKDCY>s6&u^>xV2trA(w4zp-UG5K)OhoFhJt? zk2i#B3-p1G&e#)AG(PBI3DrF`K9>cV7FLbD7wnsRbroQLI;#52+;m*5if=P>Tm;mE z*i{}8s}8eM864zvRae_uoUHaWRB=39wS~wk+apteN1*5Ji7>Lm4u<0TNKT(vm{%|#J!Mf% zkog+h7%F>?M`;cU=e2|z)G_0;oZ0G&FZqYix$oKHChZeRdg654a4c1tr62ADQ8FPddYyEwUNTF=Tdul{-&$Etui7 zk3PfcAe-R~fX#4PkQq+G7-8c6aW2uG>t187QCaT6YddU)VfZ&td;;8_4h z%8@nGc;X>rh{t_FFe4~H0@F8^!$#XrF5vh_ml8u`Idrtee3VnP05)*yXaQ2+=kd_X zrn+5~T>X&~LR-KS!Wo>ELT#AW|9GPJH)D1!x;ZNMxO4V#bPBhM1;fRht< z%6_8M9TwVhTq$)eywyO9a58Ays3l;2+$xdHWV@LKFs|$G&kreotXp(Pk9Le1Ya~&D z7b3?Sa}T=DP3(6`QPQu$>F03JskgU@m~!lB z$AwvND~M-|wg%cz?LQ#yrfaKAI%dPQAA72aj<1LQcL&9UxC_o+<2fGO+BzO^hNn0L zxY{4^+FE}YY9U;I1 zgvW4Rj+)z@6Du1HV0`+3ApJV@fXTJ-Gl0X0n0U#8@(+;wolUTI7hhg90 zvU`kq1C%3rJLbwK=0*FXa0)kpd7f>%A`|D+DyYK-$>np&YyiH?Zyuj5oAL=t*=2?t zG#$Zkkc#oI#U?BwMDhuCz;F+7&}{3FV3HNw45WDAj#50%pj76^vpYh!6*M8Ele~yw zVSks{z#qjJq26Gb1wJf zPOvQG&ucKI-%;NVnK;k*H&AIzFHTN+29N^YcpDp?S+p9EMU$dvH~>z>0Qp>og@S&y zpd6lsrbpaerBL8Qhy%&y+S!e6V&HNm;<=&SrBddP=f`|WWGi37clraVnV-$egVgH*UUV?{$!f;CulLF>wej?8?U|W+Fc9B7bN*IIWabljSDc$21)|RtT}F>*w)Fz^?O?X`TkF?Isfrj zwtjRh`TXzyw)wNEho(Py{@pKc^yG#IIy;72JNB5}rmdwV zKQdBm>0U0St*x=J)Y82oH{8)FWx2KvX<5p*bhow|vs<9@srpq~y1SN6QK_KZw05>8 z??{(zuha?n>8mZ>J-GveCptS?TZeWNgJm*&4Z|l-r+xhvIgK*VIGL<_-{4?=q@{ah zGwyj*cPA^~)3?)BWqM+Am$GSGRPx=T3B( zZD#jwL;4gzequ|q1#Al>fAYom4sWbt+F`#{1=2Fting(3n*W&TNmf4CzUCXbv3AqZ zF?4?G?xBvMp*@%H?&!=d+r~-KJx`n7q5Mb@Bwe1{B+Z68_Uzf+=~jm~YOza?yssxY z_Tb=(^|?z1PmFZ9T}&Q&aL9DBvZq+VMujaef_y8JZ#}pxIq?48Hqib~Z07pDGe~BP z?irKZc2=_QeHXI{Cs{SP;#4@4uxM8ICO>>%_h~}CQZ2df{rySb`&Z$mw4M07m|Xbi zKyIWwg7Q^u!XU(}%$*DzUB+U1iEn!uY;qQ#ZYpDLY~LB3or0NLb{WJ68+F)1yQO8K zk!$Vfg`O|%wL#l@9 zTD>q+vYR_$oX`1%wN^(G^O>I9NHw24@<>nXNHsb6Nbkr<6@#qE<%GW!cU6J+N>yy9 ztd^5!p6xkvq{>||46N9uL#qTP>8kL+pOmOIdEItHOshDP?Z@9wZF1@@*1F_fUl zvrv8n>%>~D7!h%(x|Z(E%`1maqPRttk$ugNVA)+#n*7g4I(PQz26iwkc?nD9N3iOZ zN%sfOi9#W*fy*b7mw#||F9cf&Yn~=%Wpd94w=`BXRbc)e6bT~=yXNztduLM-kboSi zHBt{{Q!h-&VO`6BRf<9xboF5)kiQB79j{GfBoq4o~F@&{F%wWK00h3NtQph=Ikumv?ifFnLA&!dN|qh*w$-h zx*`w=^spsBAat@NOQ=Z0657~-YtS>jmlr`gtzYcUV2=B92Rep2$)VBeG_K zrSzF6VKGNOv@ChyFS>I1QjtR^w|{6P$$h4)Ghd?e^R^^kN{&9=i$*fPDT%c$2`~J< zGq><|GP9O3>zSHgWdY>}KGWNpFGEfCwU+ISV~>v{H-54!dF=6>{k^(_pb4V9HTn7< z^d-N3d@$|(gy|f}=V>K6m$XdxeA4vZh*}cc8|QolKt^l?4cZGUR~=T1+PN^x}tf^)R_f#GG>h4tIE&2VAcjsCjxH9?llY7i;@~bD;z~x)@k>Lj9P-)Bpl{j=|)E@<_z_X38alw5M z87+(eo2-s4j9}-eP^0ryAb(`kMPb_rHYcOP3L~NfGz$5a2i~9j_#=b2WgAkvXGhCB zUJLG8ArI0u^#bxi`H;&C)ck$P(T`qLrk;%3QxGn=%6aDnZs(?4YySxod|!J14<$eO zNMEBMS|PJoD)@{-EwDMZTT`R}{4i^_2+h2l7pUT!_J}&ZX_x~NQDpY5pp~qwli@{{ zUIi>E<8Tt4yH6$Yg<|sT$NQ2We5{RTEQ&>ekp)>elAPR{v4{mKuGP5}9i1J!YrTJ# z^S*SUh=pV~rwE=|V)hHP7u{aa>vRrfJw>c1qb?~eg;UxPQt<>gstu-EV&h3tfs@35#7~u?nS9()Cndy5}JnqHCX8wquERStw!XS`#ys zxSr(1Q++0%y!)x`rYm{wsci)!;dN?(q0dqz%G}4CN3@)DKGoMK(|QLkVt5oN7zjwm zyx4>U!=t67V2E^zd4cc}Yf~r#nR=sXSd98jzk|_)7Z^aTZEgz0`NFs@R&P8%ASziVFK=t-)ee$!f_9oYUa?QS;B~++^Y2bS6ZL0w}s$`{lQSxWLtKyeBwNPt44;k)D ze*VeT$>%@bJ-`@hDOF$+pZj=kdmSWOp6vTnKaGE1p^n+Px}l(i>UD;xh$Xv!ojmrb zk%4)y{yLSfSsWRGCGE)-M{Gb`97(?M7rg+B?3`TthXY%z?QltvB8{K*Z9)n5r6c*h zKiu3@j!k%L^5=heP9xi#ri`hF7@-vN6m#zf6lvMA@k%idLSXAv5KTQ+q|<+N z3>1|ko2>ZEX|4Hc^2`f8jUuBOYW27yMVi0tCQ)9sBV@>D#f2`H8^p$#oEyhR(36>^g3-KSV5EkGt6xVWPq%l{ zVTui_g=FN@y|1Juw_3#8(qfeh^eVAPrJfB!iqz;$@46sg`xMkT}4?b!uUw>Omlbs&WluUC;p#yh7cQ-8LpGow0-wHn#y z(jxV@C0`&1N)Df5x9h;PX~hhSRwQko+1AxuA*`P4`%L@oO?0D9w@AnNuwjf_)MBaX zo3R2~a4nQl#bSSyeDX8-#$!vdEivJh9ihauS91}Fn$g`QhD>%bP6|;1WIT72nEh(% z(E}1U6;-H;b0y?npLw>oopI8NB>n7m^M>S|f6;f4M=G|1rvcIyON)S86S}k;SxT2^ zH=4(iEx+J%Tax7QuJgnbUJ=eON;D6rDG+3Bk6(;E7%cSZo-X_cwF3E}?w)zJ&p7%P#pIb%vhkaU4v@NevbVhig1k3*=X0w%>DNS_ zqW1kuv??&nPJZxQJGE)9#Ntn5tDuyrKZpN(S2Ffo_hlt4q=~Gc>b+iswSQ4!R%z*? z%X#j-p|Q>A|4{O8cfx)MNL0OojwTv{@r=|9OxIR2^d6vwAr9S;^ zU-IG4UqHNCE7bbEtrgjnu2O}Ojdv?b6%q%P6}zO04BSVR*|d~OJsEwjw+(XlNz5TR zj$Dc71=xVE|3%&`OUxIL4&gRbt8AKF^M%3lt=T@T7TIv*Sp;PE5MJOH+mpwh>`KPJ*lji^$G=!L3(3=8 zyfB+{EmJw1k^JV1n{LmzA!T}uZ5dCa%ybDDP&prEs)6QKSRQ0tw}K*gXL91N1{zJh zorcIX#pXl3W{Q9z_9;^YB2bS6$E-}Jl6#~|D8|{6WXqTOOfI?LOT*@a$?ad-CO&TL zK_4(X23^3Wk|i@2$k%P|D634BlAV?6B#SHkLaMyZyfm;(rav*7Kr3B z$YPCeN`CO={-%UsxeQ**(w{jBjIY^8&S{&9fL;@mm5FlBZ!D7&&BK7KSB6DfveGTh z;!c-Tb~|h~z0vH}VxSKtPk*Jq5zSVaey0XSD~2)Xa4riru1s%JgFsgI#rRpG&RmPbtln!c%r);cOqh;pUmnDDl)y-68$xps&?NYfa z>EL9|*H#J3#<`gd$i>9~lMnm(Vz6DN8V(1C`7-@U-3fEHsWCtwU7MxPl{Fffu(xz5 zvl~(a#j;FU0~NBWfSH4i!L529hVvQ=(v=5^m%4Pno3@6TODYr z1=G!JPk!g?n{hxJ_@EBb#f`7DJowV&OJBd{f;*ap6oGez{^PQo844m;q5G(MGuyr_ zx#RhDrY(8H^XobzJuB4xx#T0yuWP76^nUHBCZaPK5wB3qXNXy0HX$P=6}o{LQdQ^$ zHnm}1bjZ5~6{`HE2B6Tg#47rd0@#cvKJKmX&dr2B<6$)zuJ!>#2> z6psauC$D&6mqhL2JTrNArHsTpCc zP^Uu6>PA@h^r^U$A%0eqS2A~GM3Gm>Gc*WE@;_@teG_lGD5j;86NLe)?|Dn6lZ?16jxN`O~A+vReOfx)pr#~vp@TLoYdFx zuWuC(yJ9qIqmOCPby6<=N zQqkDqLZ>QrsILcjS%QXg!D}6QKYA*>xQ|FAes}ZMtRAm2?54_(E2NLMEP435n?`JT zSUOL%0x!^`RC~e*?6l;k-(B!Z_ieMXjcNP_Kha*99==;OT!GGx9NmWKfW2(Q(6P?qg9VOcDA}D+^`NH=% zCcpms(@iy*{Z8NQ)Na|WCi7*PV(C4Ls%W;Xta9Pmtwz|6D0)wo_bfb%MqGel6SJV% zdzNl*4M!#4>20S%Y)`)X51U7tbOcY20^d+2D&eJ9*qWU8gEbAsOw2Y0fxz>lOXs9# z=p)1`ox(5y{XsPrHD|1&g^rNm<+gKQzDnm%p+@IW4}`8!TUV)NH3&2#SZjIk;UxFs zx#soB$cz2(?<^zN=p4o&Yjh61$6RC9z%RPS{9#0;W{F6t})#%$fHGNo9qi?8Y%V0uYiz5m_9POy^qf0{Z_$|^S`O-hF=LOi-synL{&0&X8RP3f7>3q*I8ARnKe1%- zHLBRKc8R;AxKqh0%2LU;%i3=Rs`N_3GN@E-6>G3~wWoC;80&yw1cZD2?$lcb|0H?x z|2uo+>de!|eXd&t z8*rhD^&3&Af(`vJ>0@5XI_2{GvgDC}8Gy;f-u~&oY;I7G#MX*M>Qt?R|y4I_83DF}Nn4FD#Ri`eEyIi-rG)@OJ zbuD>W4FyD_bkrHkE8Zl-yiag-@r*-N+~+umzTs4-QdY=mrCb-US@i=s)ecfEgOke= zhSs$YP?rp?>X_v_tpByiz5lvJWoYX9ETvBGIqVw_r!<7l3J0sj1M#dLcbiHruA72% zim=e+H)_gaZTAS9fpl;kgSM($ZSKaTE)SSdk$X|D)4LXyocgzcU}fsO6&4ta`2n?; zT2t5QPltx+wAhRb-&d+LBcPT<2RjOWo!+&Kk#zp3-(rUYzEAW0)or*p7 z(jq~%E{mJ|5pKS=9yPnSojBpu0u^{bo$5ORpos!9kd{-b@<2%X(-F`p(VxzdfQk9{ zRXBLQ)Lz)h>=x4rib7QPVM$uq*Qx9SZgdvHob;t*jm4&`jh3rU-S2h~?^*)ZM52Ek zXo=^K1_VbGJ2@A-t4-7f4FLLhNE1)H*mWxZfFPB>xxyL6y0DH{@pZ|)Qu4awoyIzi zfue`?uTgnA(Pt9FB)9*#U@l4S|8WCnOX2W5tG(k%I%pKW`U zS^&Lh$B$@%DTD3-s3)biK0Vjj*#Ws8F;1@0MkaTJ!)iX4bpFR0+)oYIG3OW7E4L^j zl-)Nfblnl71tnA%QLZ=uAgb$tsAF!_)mmC{De>d~vB|tw80TO9qi01}qWIOxng6-w zMl}`v=71Hov7#FFaiBc4vF@iAk8U%`@&8;~RSl?n0~-X*+tPyT`&ev1N|bN%)&E>m zi;Xd@9tac1=5E6s)zR`RSm@wOReS3%`vw`lSIQT!34 zQq)1^pSf3gI(855jwZ1%LM0neRw@=X*mpgKmI#-yxQ_k;T4H0=KFc|lmtW;#qhS_H zYFR}MK%WI)u4+)Ps_`dNa(YVO?Ka&tLri%g zEcOCEt*yz-{~2fmAGVOE+6_%G?q9lhpgVR4t69j?*^Z4MdY=9A)WDJB@ESwZ7xJ2) zA{=$FUGSNpIj=jgGU@uS0j1UCvTz^^M*B(-0_AAn{TN`RR-t@q)CqaK=;f79jXDrW z?JbqGY2E7B#A;~|h@S8OHmfap{=WvzrsUuLYYi@Sx(X^`u0QGf<=N}iz*?!|-94@~ zdDSm3!b<}IFO|%YcX>XO{EuIr9n?df`ZRc#XaHJ-J?DE7VGC?-A`D9{t7g$!7Kh<# zA0>wz(LuMr&RyEDZ_O!ngY)1F$*6e)FHrLaT4>EHFZ!tsvW~AKnmr=(0O%Y!sF7zv zBP`UuBH&u0;rp8-dc0?nMK6=jKrIjq*jk%^VMsoeHR<)YeWa?Lg%Ijc& z`guQf$nN1qE6g31Z*v=Nbmi>Y_p#KLSWO%@Ou0d5ifwSKZveuQ1NPL!3SpH`mUq0q z;PI2#N%R_(a_CN#9D%HeP$9=X$WtYo*0bDF#NSQc_3QGA$lvIGZ}PXl-fF&<{J&oh zto8c^ceB`nFGk=~9MG%q=|G+&|NmAiQo@ahyeseDd8Fjcy9g-pgB1!?!Kg}O(HlG| zj(*2btJ7FqI<&7|5lE?459LGAvde=?h;%8?sSPO5xcl8L@O&9v(kh2*TmDr`m~cElFq`qys; z&1aMCzuAgg_Myt&v4IZV|C`NM3(aE{R;XJFQ^Z=1>GzT9G>Ql5bU69!Z!YAyK%fV8 zYS>dqj^)SUqt zn=5eBXY#}t5!i%=cn+_QDzmq}Kpp;fRMJk;@Wvyk3HU$~Bqmq36#l8-xRN=z( z;WpEU-v?BJSfmOFLuGCqp_iy7hi2wfNZv~RgQaAq8x>Y*y(ZV40x!GNkYGw)5(@Lu zZHfS94P)SW#vj$Yt)zg5#`KUPkX@Q}iQN2FtN|P(cY$S2aYqH^qUZM*w+G_1coDN< zq#G`il0!d*Gd`8@i*(mAbDsHRdiyenZ&Z6FN~YHacrPX{R9=gTHKKbx8YP{5D_O_I zqQSV~fv6mU&n9^sPs1xpbWWm#lytg5UT*O%<<*u5h%Ryy0q+OX;%R31+zgFNI`LKF zl_0+v%og37uIvEA(N74YYC$Yz-2%L+lEIUb8T%=PRMJ9P(n87$I!7Eqe7YlD-(gN` z2;l=o?cs!58#@KGDYR|um&DBIH6X~04yd!+1Zl-}kDZ&jipnyw))xrAA)G`r4L znk~zf7Iy$g%7dHw)`v`Kp38Ro)$dN?coZf#opOBDaWnpXH7VI>{! zyvcIQgFDidXPUhYTUpkIxtz7dWo?V)O&33YS%)gL3ZHLsd*}_88LD_Xlyv~YmsJ`8 z*)k)L*bd8x%wA>$66+L8lU+aHXO(RdrY>vqUA8%OPtr22xgV@iW+pu>$c7(|CJaAf zjnLKAV4EM$@VG2gCuz#rBu&{GcHbS$;1FmO%2t{9Dl9beY1wKJR|iCY;Ic(StwWuc z(&Os1w;tf#gZu$mb;5}n#W;A`BtzHIxmcr`kB6FZ6wukb3^e8MN*l|~$PtH)J*)J9 zkks;H+48mr;#v!3t3rH@-qWmiz;>Ta&sbq98v`~vFH@$*aO{!pUt#*rQM{tH0^Z#S zq%JV9xj+5D3bW-*zx{YcBmM3Qv!;P6MFzU_p$X80JAYd44um=9;**RvZ`eWBromU; ztTu2Yu^Ey*R>`3$Fb>32SrF7lrV7wFk&bqn{zlp6I^5XVd~+F>1?Y0OwRR4j zAX+y69HzGE4&ODq;aXjksV?Gj@DjyFle=f|M6F{e-P36{m;=ORdqFj!+K8mD&~MNn zI8WA`ex}o`LKelNRIv#UixM~XE$OvuOn<(Td1Im=??{89$lCy(mF4ok8j@$`e%o>NU(Icki*5*veKQ%eA6f255hys^|5qzvI#CTSC*$ev zRc1@49vO`q>6=%XTKeTxX1OV+Us+|=FZaaf4!=d_N>>h;-dZe2g&N#C-GQRo(`Kaj zmh|ocbHxtTA$#sC_u9kQp!2=yzYdr+SH>b)SQwuvvB=z2n+1!tSf82-M16C5Xtg=} z7RA?9^0jURIt0>dzLvY^x*@O&Xwfx>xB9u&X7i3WDqE;NcY!Y&VUI!&F@01-qYIcxRR(f>M447NRD5NI`P5T9*u})M~X$NDCUK(wlTTS|pgJu}B zIV`e94kY}m^xQR&9Wg=WS75}LDs=a|Eq`b4cO#nz3dPNlE8QL!xzerbupuAdVpcV@ zGhEY2`x=w>k^VI;Of`EK#czB~hsibVHrKRd)wE>QtYo>H9`sFqE1g_x*1Sw%NyDkZ zEJ9YyED^I8whJ|Jo6|3^HLK6@7OTdPTdhZ1RQf{m>6z=y;JIE!)U@+lv!S>nJ7aGl zY&x^f4675ynvSo@T=VHi)|txnVHdP1tSM6n6;iWVFE@pDd*w#9LL6fK>h!AhhDVpK zxekjZlGDw_-*sf7tqd!q`x&TXPb&R*%G;=w#U(THF}(sE#Rdg#cSlEK=&T_VozEIW z>VQ%TCdeFZYC-e zJ%pai>JVU&er<#4H*ZV-d4s97?=dVH8Zv!B=hpOrVa>YA(u~_i^`K?|;oh8HycrI% z+uE=gQi zJ@YmRnko9!ZM^P~qu$Z|6nD!V=YWw-ue)AQBfsZ~V&kXumSMB}f=Ek!y%~oO8NE}_ zns>S0oJ&72Y}Ty}(`8i+_xJ7Te+-+g9T-U(r5A28MeBkc-DI|!H<4#nHSBwmp10~c zgq9n_3PY+A&ro%$5=95b)Ui&8634{e#JY@1tf#v+L(JbmT-M-?=Fms->*;GYn>$P{ z{qknG%o(PVT&nPtJ!cF3GHJDf+}Dk!tWJMgA)R$CzCAR65i^ldRC3pZ4UlYUkL&$Vg2lGByj zOka0Y#V8krk=C{$R=6*H^)|CE{q1cgKO8Z@sh#c++=}$sZP2xerb5thINXaC2>^E6 zaTEYAi7hPv1T7%~fT-gDXbfyTZg>ibnyBN7-6JZUFQJcsC|^Kd2I3b7L^t zFs)lWr1?u-F)A`$E$X%}ecidHW2I|P3FU&)`_DCanLK^)T(fp{U|oCj(l*63f0KUw zT*%~=>F)DP?@DFJi?~RcF5hX^J2d2eq#p%8?+~SdZvUg{zMVLL61?5mG{at!<M;6b?otF}9Ybw$4*-est6T8(Qnz}CMaJBsR#?Q> zseQ{^8FV$E_-y*dy6H`C-(^}z7(wBrB`&Yd(eU9^ti+iI03su92#nB3zp~4$ z-s56Pd{R|Up$sr;G?MBLqI_@lo!qv*gNk?ZHjnLQQl359<8WH#RZ$>@-iv2mIrOO0 z8w?b1XoHz9#|DQrY1zxGBvvu6Gwy>vUPfIcw7}$i08MFv3s}MbhR5w zdE@wAtk+0Kgx?$xDV$eW6J)w`>vcb~rFhHu&` zmUW-$ws?@!Pk41==gBRD{l-Ucl^o(eT6#yp4Di##M>+hI+#mCjEEmQi;ONrEQ8dp| zZpQswn}_1X8+24f6BX`A#6GNRh;6D5AF8mG-Upy)z+oV>6=U@BrH2+xEcT2F@Cl6@4sq0d_ zvh%<)V}+~}V_j|J*Qijg*O}pAb%cUu8ZUL?N*Cnu^#7L3CUYCNxNlUO4)`}wrHe=7 zw_EN-d1Ax%YDtH&j6`rZq3rsYOnF6myljTkC(34BC29xxshBXH%@FxMN`ujTx;_2( zvRQSR5)JtjbihnIYuJ#;qVC?48x{+{Hl3`P!L?Qg6^UFJgmmG3%k*T$3}~`uZ$A}_ z>Xjk@8dXTzYapln4J9%~70VTiDh~ueZN0wxgc?mwZ8>POt~&*T$xWz0Onlp4ZHKiL zjs{v7-9;!@gAIM}sYbT3oNuHD&iZM^=%>M$%U6{HLh2wCHJW5t=*zRST18k4x1`cH z*UY&al_r%BC5NHu!I7!bKd+fB$f7$$!TdL-zo?mQld(v1w!I(W8)J0Em@4aot8RKL zY!K#qVI8U$pzA14t1k{S+JMV7*J4{#2ccjg%?F5a|3}^IILi+L)ZUT)q;58vThgxc z;o3&=#OH@cS~`rq1CB4)3O9R;s&7uAPUvUZUVhmk#I2}PD|9!fEXw5Eo3fi@mZeXh z4{tH9yF_R4j9dqQx5JHZ6UG4%T0z}jtyXSU={jti1{J5!R$b$fNmrk5mT$H}p2L-f zQ+4&eWO~U3I4#u`dbRdiq#FUOeVd;^+vJi;2t$C;ObwU0j)ht*PS-l-G-=O;iaVLL zxh6e%zUl4okz6`@p&3vCSV?ONd_OodtX3Q)e-M;Dg%RSB9zF!GsRz7XmA-hPKmPkQ z+Flx1OsflgKv-opprd37jzqNHUSV?H>tqp^YXe=fVV>*2xGr|kLur*jb+?b)-S^T= zq6T_UWY!I44~aa0!NLM)gTpj zPvdlUx8hg&u4|`zFE544z3aW{bC;UE>lINe)@0eSD&lUYgO`~t=DKwEWw=uB=`1&M zBA`dGhR2P-RD~CTiuN|Cufp+?WlCP$D^@6Kp@+36ZY+dU`&5;T>^VceLK?aOoeQ!y zg*UtL;}pt6luwK1(sM31YtD`xl|)tSWgIs-IADF6zr)~1SSl2ouy&n@s95u1SxD~Q z#AZM@0vXw$L$^AjdldQolP8Ak=Pz&xUQY&bxGoN(Bf*Le{`9pRjDXp~)R}vB;yezf zhxVGyX}Z^(i~B5Yx!O)Jj$5Dp!(LM!2=(fE41CT~dhSc1HWYhTv?R#w7_SvM@<3cI zGkSL8Z5G4LuOqjL_8Kd}Y;Z%FqX;;?G?TkWrCv7#Y<+gt9KX2%w^;L=xQ=Pp6=u!q zz**YTV1<8}?z_UQy=1s)FurIF?^$h@T(|Ma$qgINX7+|n`nfCMBk6Hm@QrcoEdfgl zd~K5w;qj4+HDOqr3iJ)tf~)EXu1ICJwh3WbeRYEtx2jEpSoXDdY|{ei~FVSG6)1*2*|fHH8pvh@rW0%huvpwaFC@ zu!15lU&<8LOB*jUeZ{Z^%)ti$_<=mkt93F};|I3a;nF{OS;m)*znjeQwb;pbEET#o zCFsbBMQ@ckmYp!rcbJ3fu4)hQ-Ab~#dVHKRaQFFW2`mGRZPe$x>3!F69#iX^(>ty* z1J{S1*06;&T0wR=YFDr7Lp(Q$7HB@NPk(R~V(u_5B{mS05~~QIWwxs0ysAzzR<*$L z7{Kp|kW1bpC|0#e#3v+&NE3&>Hjq`ueK`iGPhD;Lc4Qe)+e`T*q+bM<^~UtyuQumg zMBb@sX_l`*hITexV<{uof?^GKDLwDyW_3B1VJ!hbz_c#%FbuLtP|aU_O=n*o-wniX z1&OSKO`A`-vJc_CP&?7$D$HC)53IVo@&YaLn`@ z*O=Zm)T~Q?0rc!^Gj6c#xmnF-McuqwLTlOKFU^};1;Xq#d2ReDug=xRDkib?KEKeNxQ zy)`56q8{C?89Sc4DB}Szsz+3=!$iK5kN?HGTKcPfX3eGjajPM9*811g4LrPICo0VC zFF-}Jx_ss-z4$t_^Eyay7@QIo0YS-bA50|HMKf@-F3J)B*VJS_Wqk| zZx5_J0HzJYX00V@kF1`UF>7I{#q_Nf0GMy3bMopse5*I?skEEMW-%N#*hcuLaa@}# ztm}ibIs>(Umv&6+`iP>=M5t%mF?e31N#-_2+sL}Qi&B)kC|+C0N8cjQEyC(hv%;D_cfINB!)jtHnH?`3rT=)n zdBE&T7jH0o@$a)Ym{lEKF4E_3Fq?04eUL2$ogxtFB$?CoxiR6Zp^jy{z2k+7=#vA8 zI{*MwYE5sy5n34plmx5$@%mnH<`8Ri#OpFUdI4T>`43|16e_F&F!(X2V`*`(7S=TH(0#zHHQpZ zRt8)jG-FMvkwCi`x$akH&kv4qnWRux_Waz}R zwcp{VR*)dqq_O5hM(akEFr^(EJoviw{*z#j5}9aNrooS4$UJnCaCnFsR5>*O0DY>~ z_5u(_aAVo`9zCE|Ah$W;ewPj}JkPgjnqwoCaDgurTA&754DwSa!}DWyf_3Ik9KhA4p}Sxzi!@1oT5KzBO1 z->fr*6bb*n9V*#Va_9RNG5x`l66uytj~+3->%{f&V~cH$Krww`zuB6ec8BS%;L#R2w%)EX z!88?eqY5=LyIYxxr%)q0!OfzLDg9NuGmVl;B$i6{z|8eP?-4a6UtbVbb6?W%trVx? zhhpP4Q|&@IJBQi2i^5(dySak#UYxs&sdD&hJyWtt316e<(P{Q3@ZwNOv8SY^I}%y6%fMU>@Bc+pIt+9>+9c2ki1xwjY-!l(H(TlQ`7G1?>eS zYQu6G^AS5vNjZBV!{MrOh;kbvpZ+)2vRC;-@(~KJ(aJVG?>bYhsl})aAbt`WwwmXz zz3cI;@mHw^)Kt@3$IX^&HM^;VL8)w&pPLV~bIjl`cU#L-R{1!p@0020#-Z4DP<`}v zsY{0?-ZvBF+xt?6DG_=3&O*QQ@G9!O30)LbEB5_TOJX`Z8#zZ`XWRx+Fz3k3`)pw0 z8fzOxy|c}3PIe_E?mr1hs>&dHa+TQRX5B^ z+#jc6nr78{q+;!d9TQXCmA>V$*=VfJU8#@z@O#_okB*pu9X8^#Gs^4n#^5{X5N&rn z=W0MMJIW>UqPw>iRhyP@6KWBqvdyIA#C4$79ZY|6#Pn@f`MVO6%j$eNrU~d#t`ob{>{2o_WfHksMKsrBRb|7W(@B}E9 zPoJAGt2;#zTMBSz*2>Q1@KW@5zoRvE77r^8%ETHa>hjiZtV!2TnRT0d5|Ek; zHvkZV+lhRPRI3-#sVTGe=FpJ>rx4UGTTKT681O0=0Lwj>qtp(aT^*f0%eEQpG#!Oa z=_7NdcYyZ0wRIo9z)2Q}@7}(9+H6SAoi_VO^App!{?Cci2T|g$w~B``l>TzsY_^pf zX3PMaUoc}Xj#mKD4EXpp*aSbPPM@5?H8&acuV>6)S6o=#z7v!F?-^5Asft0}^=WC= zPxs1MQ?UKtfv5N}?h?sla~g5y((lfi5oMq2DkqN)j4rHoaK2iZ&Z)@Tp1Mx)QQan0(i!yE z6xP8neYn-!+^a2dellkY*QxPzlt8Aj*^n%vWDwOwhp_Jb&2)AiD1=?rp@e%`GyOfZ zAkqF{-VB+I>6hlstuJ{vH!q*ZU3Q{XIP=Pz@FM>J;`2jDXVIA)+?cz?NyeP;Q;`-D7bIk1D z8x=K5p_LR?>PQK7S&XsE>vEU4U=1vH^e)`35_ib0P@O2jw}y6B11n}mU1S&l8XbGu zqxQ!j($3eK{JABbyqMwNv@12UwI+~q5$Fml<}HfpgVT%hen zpx_|rf;Fl+#X`QH85#gBYcy#yMULGIpKbt*7VW#OSGSxbkJOWu0(=NR{b|E&Sp@-E z#VUFx7@Kort^0&SyUI-SYbBUo_(pTn@;*0~^UODy@wg#p~_^(0)`! zH*pPu0uuWkhf{=up^H1sAYo^u7FC6qu+Y=$TsNK7xgOA1`Al15w~V0CQb*SqTXC7_ zusD&%3PbM*SXnL;y%k!kGwZTs%Uw+akj6_L=AlNTrLv}|(P-IAx^9)~%uimJiaJ?R zXea}}g`brv->FmTs8lM;rPSTHK;6+i4Gx9acaq>J5=f+6a8LtD|!dQA?M<-3)JD6<`?`EP>wvvMqSzMGCxDt&%Sjt(M0${$ukJ7e{eSoz`zzzZgdfCLk zoKdC~!Ch;?(GIJSmI5>w&m928c(=p~KgVVy89EX{I?a80B*v2~G6iu7z1C%*Gd&QR zr0;x(8Myr&9+pA59qrDiri#apZ(3ZX7PxKo1#}(VrvohuQtw+DItvAOHvPAE;A`L8 zbth_kAqqCKXITe#j!|bm(*~$#*236xd8P#rwVNtNlY@ZzVS|V+Z9zZ#?7~b!TN(u4 zM1BLfOsk;B#VdT<(r4dkt}!1?SKeo~Ui`Y;)`5|Z&fWMJ5(dGr6&QrUOLN00wPheg z1%CP9mCa?vmccvHH{NG@mS2P_eAQcqXiFc#?<2je8%0CDh$8@dy}uQD=^zsr0TYWf z$ydDbQ-OhbDl{3ZQggqlHPF{K8cHy>D5kRtx-!~Pa`MrX*;2>`6GR(GxT zAfIRO34Ta~ytz2&S0s@{h1Mso0D@hi2?F=IWphsY@mXTg7~zBViZnd?S(7cn;>vz4 zG7J_MlnTG#!dD^(cja2a7mnR3OiY7|J3|4cp3EKYGaaS_KN}h@kByi%yCnMB83NI6 zMPxZIFI-`X3RxPk9(*lO7ulWEC0LQCj1ZRgOyQ4#vkO82cFSus(aIGXHxVemz<814 zG@yn_zma}C0W*e~h%tF66p%S-<$`ca3#=f63pveCE!Z-0%C4Hnt7u}EXvKpO6^1#Z zGf$Bb7Gy>=OFyPXLq8cCL*FMBaGAXPc~1J--!~T?4Esg|`O6vIWyg{R#>|;!#DUqIzD%q1x_6naH+E&pI2+cnVo9OwMozNZ{w2-|)2jW=EkT&M^vmxu z8ye8YiUnxNL8$Jbi#L{69^YD9!)e5031DZqN-JW_)7G?idIS-LPx4&vX{ zb{0p*8iq5tAkS7|8f#0Yl!aKy(n73dNg*2kT%VfBz0si)R`O}y&u$)@CVsmuY}il8 zaZR-IXX<4$cbs7&QkbSbBXu=;p1qET8P{cWf6e`Jhy0|GyyqKuSLVD7YxgBq+T=LX z+XiOepfIClqBD>YX}~wjPU58yAd-=PdIa7qi%8NR2rW22({lakH{WBn4F$cxRWcCF zHmsy0?=`(I0lK}KoYELbX6Pg%12Nz7avoJ1eEsF__nO>|I?ux4Pj{rK12H7u>We^Lc?vf-2VNTgc{7a`xm7^qLMiB@14rya@gF4Ba?C zy@|O@sT4v;-2S5l`NJl&G7 zA5UnKtSa4y)Aioad(hgX$`H82x8RfvgSB*4={f{mK;2!X?~v_74r^^a*O=X`215oZ z6-0r(A3+!zbKWnQucDS(vfZV8a{og;?|#U%?^r?+9;qzZeL4^;(~*a84WRgl=}NA9 zs&`G*`Uh%5hzdP~p7j2Qkc@9O;Z>KZ5>J#?;%j`Q6RVI+u>zyFYc+54lq!6@U zqYF7dQ?2WyFx~R7S$PY-x9>a)83(h{PKrY#1)zOKw&*N`0%?H-Wt0V-gn{&TAI2B; zGqbZXeS*~*B`E}+8Cnoe`Sl+6=0TOQ{?cxsxm}4h>$0(w(_q!_a37zLAJ$mAWLm6b zi3~CsylF{GtSCcrB8c91kcHMXGF4oVjrY~YOCeUdWDOLd7$CDN7PSOZ@^xMI=%N1v$nQ`nsf+GQ3!P0c}$hg z!P@kB416K%ajPglQitxqlHI2luylHISUU7U)7w~DXRk0>siw_eLO|O6CEZZ=mfSyy z>niqUx4HCk-Y0Yt1b<*~oR*Xk^`&BCg?HNN7pzJ@@`lb(=E6u_5s~^Ir0YQ-%)yS2^%*Zs*D9}x?5~@|n zqzKg*@!J^1IS2BKDp0hp4GBV3Osm|SDXGyiHw#;h*4Y-~Cb!o^HCpKIB{M-W z=3%Bqp5<{({`+ z%rFeY`^jc}OUmo3(VA-yNKzE?V=}r_wi_{jTKt&lUJZJ^CU>AizRsm~qdb!S>`Bve zGp)AvJ?xN-_nWY5y?OBHS3h1UoPnhj+x0-gmoP6WMJ$2sg z89SB8GA~aTEz(sIf6n)=RnljkG`;N%=9j0>Jz;t`We_9xFo?fX&5FZ-|9Zk)oDM%} zy8D~x$h-+Ys38>Dg*amn(XwJ_v<3+gIb_n)HC~!po}L6EjU~%ta{UZ7yO4#Jc4(u9fqKGGV~HIIWN8$aJOAYTkwvecU0 zpk(98-gesDw=lLI>|fH3CiKko#79ln#snklyq$^Ad9;O+IGM$DTQ}fhpwId2|v(exXN4D|OmToyd?+ zlW>c@$1EQw(cz2yU{6y4260;OJoyP99U+l|hvYzpzDwkbI^QxpE1mwh+1_B}>TI8U z)g*%=4QW7;t74vAYri_Xhbc)En#;^0Y>2B?#Z-C-soJGan*W&TS;N%H{Hf3_jHKpi ze9;HXIV-*CDYJ16abY$*BPLQi=KX)xbt^ zT;aT(-JRLlwY_KG8J{ueFoyCcV}4?68ek8Zq^SuaDWoX{gpCXeU?9+7AOzNdI7F!Y zrFb0z2~9|Y;+B>J^Pq%qAV}2E0%;>iD4|wTNKgWy;-^#v(l_SeGA(b9g!)PZ(abNlsGLz&EZC{9tOp~PmBl(N( z8rd$sDJxRIV7{n7)U|0h31256GTU2K1nojzKQ{O^uIlIlDYOtD> zx=iOn4o^UC_I(NwM#1?6t*Y(d3N=zqi#esb%6T1PObt%c2uZ1{GGHd_o*IL=-koky z>KLXw0hXE>OTA_9u;9g=kTo-nCDcgtE;*%cPP*SI(dJvS?jBRL3m26f)7rNhkfvV< zF7Kkbir6mDd$fo8|8hzBG)furV5+VCKxM%W{!ER|@34^?e@c}Sd*9PlJ@Hlqy(8GM zi(U}AvJ0{^+P%wCUKWJNnOfPvl>g%@m!;vUj8{Fu4#=wv)?Ry+=&4(ybPY#Hk&eGL z5+h}+{FU~T8T_gRdi3fbzipoQUgxO|o$?fRaWyDR!$P@Twcw6o?r%{_P1=!M(N}+! z&N|j0v^qqj8X$&n{cadA4Bp1WS74lg`53(kqak>!la`GOZo%7D@I$WU<2{%Fu zeOIxf7#zZ}&Fr!RKMvx1SOFB``G0Q~Z~;A_6mT@U&c;+kWuvktSc z`LC??c}K9dpmwJPSJQCASUuj0hgdv^o(u$M7V7)J#HL01n1Q)HSse5&Kk|l{SeGL$Rzb@sbXe};xrN4W@{E}@<>29(b;hE;*lEA9F$|Al;$!1a zg4+9%)5a6ndfM2S2X^q>6=Nr?#Qs-}LLC<46E}<-m5_;*73NPEAGr|4h8)f{ zaBy{mp9T0DYdcX$k?nH}_>&sN-G^QIL<=k|>ctmIuyON1UgknRo*c;&VZ!F+pYl$I zW41FC-<`<6WEocK5=*)%Et;nAGBdr{>1q5m0X=ZR9Nx$?pPp4SyQ;S4fv`?SYpB=p z84irZIm`Lq`8yL=ag*X_(mEahyocA;^9?NjZ!B5n3vY@TGCk?Fj@s_iX8v!+G#5B- zZR9`GVH@7w$OA@7H@?mrK&HH*y4E@tZQ+0JL7@EW2&Z=eEqv@#KDPjVj_+UP#f+@F z_-|g?1+uXyA{+y1aX`M<3UC-tb{37~Fs$t-t}%EBrCKm5-0`;vqfTT}B0FjSyi039Nra*cuGSUp^|n$Vh!e0EmT5M85x41@B z0i47$)5I4_r2{i)O)Gqgt+Pd=hRdH3GYa7oy!49rFdtUn?(O2DfI8fYVlB^-Y$Pp? zb4WlcT7!`X#HI9`4NZzlvcDlIHUs@FIwW><4oBHo&vl*op``B9`lh7kM|J%AbFrGk zdaOGqehn}*h<+tb+g(^(ck{Hos<@B0zY;rjI$t62t+;H4b@0ItnlFkKLZ=8I6?`0W zNsJOug3n(UJtXvLdCT(k@Di3B?fE*bPZM?Be7%BZHv!8HtAdj`OC4)-F5R@CyEV#$ z46N>LeW^nZK3r^_0vH~2EwQ3dfn_CDRw&Idd^~R1Gb0i9K_SqtRAU_-w5oV3aTa-f z&TlPZjDc9*V!dL8XR{N&xIw4U@Yqg|7_DO1kSW;uzO@0M3ob}nzbGJJzByxsbjZS6 zt=0zyY{A3lt>X5`fb+TBb!&SXZeir2!S{rM7ugcj)FbsdcUvA0>S!{~yyUtWdmUwNgc*0T1 zyVCOC>IMcydIri(G6VZSxABq+6v(_9S>>tHGl!QN4IY>x XDzHlJsc<2vEwx9$Y5ZNO-4Ff;)K{E# delta 67288 zcmZ_1d0=HnbtkOSQ@7=%-CDcVQZMR#aks6vzh`W$_HK;#B~A>q)oOLOuv$`UvD*&t z+L^&DF$wksF4zv(VG9lfW57U6z)m1c!Z%>@k%5o|!oVamlLSIClfZn;Fu&h9RdvsO z^7oH)PpzlUUZ?8b_m@B4{}(^rzvEB7)Y0WS_H=c0e5laTQEYW|{6+KG&Q?4akyh!H_B0bvSV9seCk8(si{fM+OaJMWNk3Q{IQ8i%#P{LB5-JGc5?2> z^z1Q#7p9I)osvOObI;Vm;`H2XOKK)3mL_KA&XF`MCu!55?$tZ1JRaot->i%Sa=^D>@+P`A*Ux_4oE2{;0nnw$p_iEKSbg0rmQTYOJPX+rf^G zLr112jzEflI)G4rg3e?0v$LE(Z6COwp>2Z9Df`GY?O`V+U z*w(__hnJ5Y<-|ZO6U`kKxCltkWBq6`aYUE6Gy(bKz#`$OI6`WV0C$lEATmEQ0hVKY zDkrrHlTIxx(14&;ZPvl{IhIZVlD)%q61LFD-S;~iJxd6NGj8IyCfN2iZ@ zfQ*?qa$t#ygP;$m`d zYU$9#(ws~P0vudeICSf=o2MqH=cm|fdq>CZ6AKFy_jzC`Uq{hk4GDA%3UERuex*_g zCX97g2AUCQ2{bRm;SqLWa$)+gOa<`x)Qk*($LZPmWmzMhgLuEz4@dQznVSnu=NI59 zd==E>#C!l2r_?BqyQhSyd^DJNli`P2T5ipg9SKl)+Gc6K?%2N}QVb!PL zTYZaY{t3Sva;6TA(D?#^9kL9Cpbag$XP3I*j@nwCEU>%1i76a;3Em0JN0ug%@9$T1G zvCx_AB2YU$dwdGsFpmxRFQsO(>3NYM9RpVG*fI=ChRX~jYif2%`0U##{S}y-Z^L~K z5d#d0X>T!T9XkY}gCCl_JDb9L=&WGz_{5R9dkwrau>>@x4Ov0LW5+C3OZTb8QnZ5F zW@D%+Yz5{c)|!>!c0y2Qmg(f#mXHQh20|nmAvIlWwlD>xW<_xUB8u=qm~RT6FHDJ) zpmypM{0FUiOQs-2NNL}6fo4NUj;4!KCzlau2GFb%mCJ~ke5ZRRCYRL^q1-N)poXKN z<@A)$5*1S|guPeJKmw2s7|?QwWOM zx?bOcs|>EgcfEOPad}1<>}IPxP&c_2T0jafj09DOnjC4vFX{P;w{i|VtGl# z65+_(0 z7N=&g56C*pM%wcMZKxALS^&;ZEFC8~{Ky2uf=DU&)KCM6p_c)@U*ISUQ!VkPct*eq zvjq&iNTO&F5-3>t&P#zIsDttHr4vB%zWW6eq!o^Vr!is%j0odi2%aDZP^##g*_m*Q zTgpSql2E2ab5jdyP-8b3WSKM;kjc4Dfh4g79b2x2m4$5nCGN$9WU*&(O`#w+Oo+5l zNfWZD9v#rc^eIkv6`p41kBg$>`S7A>o<50H!Q+u*%V-PVf@gT0sjLyVOn#KtT6oJMJi*pFbrxy=Rmm9TE$)Xm@7Qq#vBiqRaHMF>A zA&dlT3sfRBJAKcTh&8$_&rYAZcVa;#03b3%zPsd#{PSdtIJQFP;Acf5w$io*KZ**; zxUfffE?GcC6*V#X$1^fBcgs+hQk)k{gxLq6k5De3I*JWbzU*o!;fzQ|%e1_1Vs={Q z$U5IVbz<(Gw$8UK&okTLNAwvk4SGx9b-;kn%MwEB6Jk5KJ1C2wt7S*0Tk1v>^s&4G z+}3gqKu1M<@PI9_FG9vdj0g+y7^f$I4X9}~za*lIhH*;LuSmyqBjZ6Fjd-6Ivmf zmIl{@9@ufv48Ieo&%}&f6Syr*X7WzLs zaTvRVNG^yJg2J%u`H2~bkne|B1OO7T2ELzLf2KY|88lNR3-ivyw!tGWhe{ZK-;Dbi zLA<5xL)IZQYFiWaDeFf>F{GwUFvC*V&GUHyX>UJ1LPVq=yp=#5(iq4pvvL#>+=Pa% zNN{QPn@MEWvA}1;2@YTd%#2@lLj7leuMu+q=;+je5H=2L*OLd13JMVfA2}4@`IGRU znrMq9i_@(T>!C%o*P-`$=dmSHZ}Z2H@tV!z6D?X^zzUCuut|a40ZYNm++ij+;~!gT;JfEEL(hG>F`$i$kLn+vS9cvhA9$YnporDm05Xz|&vO|UcM}dfopH7}bq=h<~gPD5-%OZyjS-u-%v~ko#8+i7C zfj)`M;ZdWFjw|tKf{mllzYuMpCPo{0j?o65vuHyA&F&IifFatzqmMTD)D~@+q8Mzj zYH8MCSz z;?waHEq1`;QJ7$nre8wdD#Vq?L4BM^AZ0u&an#)kLr2-mLm^NE2ze++0a18TVn8-M zMeomkH&~!`8<5qL0@eWvF1Uq5OjNV-4QM)ZzBli;5|HB>Rsjk*>GN^S!5nqW zCxn7r0|=HR;#vq_xgnV8xDr`r*$?9pNoJ@#3xP!_#2oCR(fxhWp3(mKcw~FO2teo) zD%b}e=E(Vz9ao-99GRy*dNy(PCl}nXJ1x*cSTpmK^(eP?C#Uqj@>=Oed-!+z>V}KDii+VhSymNFWp; zVXH!##=`U7j*eEyV=3tKQJe{tglHuKgzcz*40$XCO&-e^Xw0iX$YUua3!9`z5g4a` zA+M$N$bT{74S)pa3dAIrf+5MJkR-YE(I>eAps9F2;5|%hX$^B&2T!!732vZDWJ#{9 z7@k|%Q$`H zi0f!44)83BK}1#(@?fzEqnN2l-$2u1TF11QKE-602Q?zJ0QY4cZfPpaLm?FwzG<|~&LuwR^-#Ad;_M%sv{&l$Khhy7=) zT$)=BP*lv@}+ zS&}OY$&y^5=1Ou!K39?}3%L?4lr20SuS2}$x9~DQ;CN`R)qYE_K-jY@bi3}<0pOfF z9&IZaw!eUIx=r_q9RPq=GM>?+?g;6{pq9GzjnV)+Y*b$$&w8tc@XG`?amQvBU|)t~ zk!yU&a=8@Uoi8!Y{7Q?B0P4%HY{8U<^K{IGDmm=dM?Fv1=a{@9N@y0((-n;Rk1BX{ zo~LUC_8JS=QbZ^_K9~Ad2ja=>{9OBllPR$^7|`FzC~^?&Up-jzploMR6Lzn%n^joI z#AXAYWU`et@HH(VIjX~67M0k30`faf_SS-6_!W{3TC9^jT7)7o!bTR}%8z4r!E6uu zTf2@9vJFKQB4o1-4Fz!<8Vh6_s!(nl>Wdcc;X*h&_i}zy>LI9Ui$}@|${tl8B?+&O zVV&q57Kuk*DdP#Aw$YH>Kl?4Jhr$+B!LUVDi2K#n3=$s-A_t;!g7N)!)mOyrs=~5E z^_}E7xG;3QQNpEuvfHP5(C564j$3ZLhCQ%@4f|PzT6$Z}*UisBt@wN)RGYyLF98y+ z7+B=a7L?mtRBXXq4zQgMOfKEmQtz=%$3Gw&ssldDgn3a8V+%qFk;ceD?!Qno=<_)K z5!VtTSzbpEg5%B=1$sFGJU&Up#YfQZxOUETa|}>@a&y+Y*|U(3Ur-6-oB?vhMmwES?}Zj}*+vU}x(EQ$MaG2zlE8neB~-hK zG0@35J@G{2lL3~kdVr=D@*vZ~rg4aZL-Sy+A{R`(hXNRj=h^(?6nF5@Go!1j#WQRSB_;3-|cRdJYJ|)KuTFVVx z8;D?4u*6un6Rpi#vavx4+d{KLgQe*srnlTknUb3c82wi%>C;P#2Iga+EUF1IU!#p- zvKM%i=An3AOPHPwIT_BZ_F_&8Bx8*R9@InK3`Vj|VyeP)I;KFQt`4J5;a%7z_1R}Q1K=~93QC4kADQ9wPd3AuFVYO>Br?0e%AcqD7R+$!W5{rNNHd%f z&u|(FrvcVLIEI!gVzTr4%6?d0m`{wOA|+z(_f=<{mupkTLGZ zLqT*SC_n-;G?v3g?I#y-!lO@#p|Kn~YB3+>6fJ@+oH{B%>W4fYdTFZLSIN~MIU&>n zo)FIAtR#bAJ1xetH-@?#nni}zH;ZNP;KByXGTqXA1Rr^pr~}SS-!1$^sXr{#a$G6( zErQoTi+D1qZOjrdKW>!>Gudu#34-hUhx0?~AM2L=(W8zrr%n@g7l#K!t^1Z6eayyoPGfZotC|A#FS%49T#rFuOK^P)EZbr z!+${Jrf+LpI%dPQA3fDX$2(#F{XsDya>4s+JZA^DTE_#<_>>I+sSXFcS{n{S6~gsb z9>D>4y@vJS5vSH%KTA(dP8{|jl!CfUJo{T`+WUxHO2_jAD!eA)F`k#B=8z9!h0y?} zW)BO}ccBMdF0R3$5rAXZG4YZG^&cSRDOfdt%rh8}C$VTZ!)@QOs(;M#1}Mkw?H*q~ zy(rcng(q+mnCIEr6`8n@RzV#YB$v-6vjOXh#(XdTbF{F6VyQYf6)V9dbL&<>fn zAozc=&WrcW3A5cs5j{qi;0pRp`>OnjL++ zR^U?X=$lXeE#16-Th>9bETT#aE$+n7TECMS-u~|eB zi`ZA#mM2UR3)*4uSWOxfv6?+*E-20ZRbJWAx2kZu+wF1V<4(rM(t2eOv$PVHwl?|7 zd$#of^WH)yxF1=Q{O0q6w~+r&6((1??(WeGJI6=6M@J7{G2Y!%SdEjj;#heM{R;)D zK6r4v#|atAK;_)Rb}1e0X1ON>-nZ@RO-?>~;M{eEONUR7b$dxjKKkgWTZ@W;E|B%y zi2tYqe~OV$#jZGonhO0wm#^}|?sPi{1i zPNl}`SW8~BgsEMI@pCV?n*9t|4?D9I)+~BI;+KG_VM+u z#J^pjQcrU7@qrdFJh!mztezf0&d*b=U{#SfRSX6EyS0gmLKS@IDRg%C#1&Q11?s#@ z^lXo3XoV%86;SUNqfx^O*M_35?&Wd6OYk{uuJydC>U1`1>KYEt}AfAWv-9lEp+ z=!{Xu!rX!)h5amO0i|75TL+qF%PhHKG=3<#>V2E9KJz8&gxV`cYLq&LtA%aDU5)Nh zH{r&g@9EMh8s(1R1IfqUHXsiM3 z`c{sRy3e@&ON(Pz(L~|!fa~_svueECD|{2evt~ud<``ykLF<}DPO^H8=Iz|%?N6+0 zL1Zjrn-G~ZqkPbgG-XBkMi>%}a{a8_C}o-}#ij}D&x+oO&64tymt6cSFS#K2EhE0P zUa;aFeP>wgV4Fp*UVL&@QvOh1=U4?IGB8Ak*V|5t;#e)|eZGHnag4Yo=l}NJzV6&u z82ne$7k=0E4;L|&=!sb(%D}edUBA7vbxv;W#Uf}13!wrj%7`MA1*#Y6x}bEv0VSeH z#}%|y$W^4*YA*p2L28P0V9J>_-n16!yVfM;UCmM37P1Wpv0NUDwfn<*b+!2 z)?rJ4a$7Ipy(am?_iyjdBUU0R$xq+E%{`Wkd|+flv@x2;NY4E5$bg!)ZZ&p7 z;#x^aQ!9zoI0;>fwKDaivk1}ui-AJ1MiV-)ss>80NuK=hASXbn5Ouirk}JVlA4qEq6H`8Gjm&{`R+>&{m$UElp|XKa^$&R2L|J@k>Fp)Oam(jSx-Lk z^uSP&mYhOm289s5Nyzbw-&sZD+bTB3MC&xrDmK9Mp}f{nY9L`*Bvpj@rtaF3O2_bx zFJbA6H0@A8+q4QCqL#0MT_3(GdHqLrCg1!(UuUC9YqN?v`VUIKrue{%iVO#-P-ZQ( z$8E%H0<-oawQjV?DMv zy;2b!@(ZT5&m&3mj?np|*Y4(M8COf>{iZ_ay3;O(!!*RN2X-6UDNCCjtt|DS#HLuN zB~VFaB3HDM*d^dY!I!X8`Nqw}NN!;lmO$*BwJp)C=OW!w2@A-t6$mUrnm4po7}*l- zKD=C}A0_T7`g60E(SNY51Pi#<$0sGaiT=X5-96poje*Y>5a22PbQU{oze1@DllG~B z&T^fSy`fYF@>|-iM+u$*=5JLA!@ij^(OD54>@8I&$sz79Rf?h>rAp$S8C+EXl53K& zj}N9_`lRdWDwZnMp=3%$M=cd{>P6GVG9DCER?EZ zg#rD|HwTlsr&nEdL0kVScNtNH39QiJQk8*vur?)bLe?bjdwOu+OSA+Y^|l!>8gcexViw*3=mtlXfwf6?7P6L#ar8;B3$gn!RI{?tHMqvMgTzY5xZJ|EYmw^pjnc zyt30hM6G0WQ))nz+S*V$29ord8vYU4}DL^A%=U~=Q9R$*!Vmw?6C;35rRHz=hhm%ls|82PmQ_BfbxrchPw&}DLopg; zp-l6R9jYw>BIhRW`ScD6W3!eR?ybpIxUT>F>2<^TL6|1uHg^m%mW)2T*`1YK^6WaK z7~1z|Wd=BKaOGn9jmKU8{$iQoa^4)5X^wULutB7OTIAd<22FWyRHjAFak@;4oOg(2 zTIBYAkdXEwn6JD?EYl*N71@&f<7d0CrbX5W-}9tQi`<3+){ygAz~>A>Nf0XTrrFB7iEUx`H2~dlX%fJmT7U@+5nR^$xWXfa33KK z4(9YD1IcfE_VVP?j}H{eFr(jpZlDvX9k41H{T!6{v;F5`6uR6@9vD#fM9TQBJaIfE z(cZnE8%g?~?=6(8rR4Op1D&v~6W{GmzK-F(`5hKlIsED}jp*vc{r=$i>Xn0G(w7jT zDrQz(qJUtK7T0noQ!|C!`fE1YEY~0{tMc`rH|dkDj47J7HjtH7$+N$|{pvg=nTE-! zXPKroPbY@!`4V*cG?3lblkZyR9(mw8M&}f-%L7G`5r{yvZO7!{rv{Sm zJ}0bLMM;>F7`NOQBU7$t?A=C5#@<~ya?rTuF%8BwBN>D4GmL>PWNlCh!L%(>b7`nhVK|+a zt_tI6brf+v2Gn_`R*KbTsaB;~a-GTi7te+X=-bYe$?ACaQK8At66h70`$F>c7b~mP zpC*6x#d@;%M|}*+zBy2+lxU9nlN+C3 zk)-Ral(BWksO55U@{b0F7|5m7moMj9$B zB)K9X>p(L8LBzC7VaUH1z6A4H6?=H`AD*9dzR1n!ixMwrCR5-7^{JP$YVVGrNJ&VlpT7ZQbX7c zT7UA7E=n%{VDBSeT1DJCYaA9y56)DpA!x%t8D?FD<}M#MRccMnu!`aLuTl($DvT0W zgf^9W@(ob)@4qzW&Pg_Yd1o^D-QGf_F4Rt@zdU?ln`B|4Q-S1=Kn*}E4Gi5zwg#!R zw!xSrxLbt%V0!YmUmi)m`8mwes0y7L^l$^6%;-J`$!H{h^W4Dd3Qg6TWd4r_2H&)D zKIR74wn^k&Q)Q_s)CUB4P5Qnvl3ezcekTj*Y?92K&1M3Y_u)XPvoMZ5lWdl%9gl2H zlCRX=>Ex?lxu`$qSgN!SXC}k{VS6hVX;c}mVZ9~>sL~d+7ts*3wZf_}l8i@h=%TxHyp3j@W5%Fvg=XE>D@ z26t`K5vLqVWp7BbwPE=S?IXbi5|ZS`^E6^ ziLb72<%!EPz+8HwO52tfW32Xp70Oj*#+3!k7o4tjqp7^bV@+F| zCjg_&GfiI*ATLEcpkoF*6Aotl^CW0A3h0)c@%3%3kF_fS`4)oDYz(G-^CpE^UxOwy zzJ_f)ip!##DuYqm7&sPW5oa(jQEiIj+*Xy1eYQAm4zpghjz=#~e)#q4uetLjP_8lN z>?*j?sEaj*oTm2}jd9>rjTy8vlM^p)g5~-37dQ1}xYp=8x{}YnxT%%VnKC;6QqwZ* z$aq%^fn+3HjkD&6U!w=e*{d3*sI3j?bq27_xLBhdIxAWFM(JubIU(TWY5MF6sr3gb zAzZI9A7GY457C+Y=o?#m4DxUQ!`qWBf3}AwHoI%wzuQ_cBX9q>BYZq*{n@%TrWqni zBrRLDGD#6ajT*P_YFK@&U*l#!Z)$4{JKNSq571sjb&~bkWAPfjKrSV5MxloDHUwSC zW&f}2^e(7j{8z4|l*Xq_${34RLx{?du!b-i=l1xoXHkgyzK=9$=QoFOWZRn@_~wX& zXf?z>OyS^&>iaLQPu~2^;R7oU^PE~xYzWWKOd^1Wv(2YX>Uq7j@+V1ot6C7pTDfS5+#mm*e&KYYOLl^ zlQsWoW9#;p(iXh{!3}jEOdIu(qpdTN<-gdz zXYnN%U8gwFqD5<5FXG&FpinQCk{7={u$?wAqn&r7!C2K9{&pqjerMB~%q-W74ff+i*XRB!X{x?U7{MaV@K@Vk(Y9QB zv#ieGH3(&$acibQ04cFf?<_I@_F%H*uh-oX9BsYIBhO%2>Wo}-fpMKi5p%;nX~0%z z*h*xgX{$484fZej)xX}fTH7a2{Pkw;7>sGF(=JMw5(eYs9L&R@>B*OpSB9iAX=n#L zNvhaSu{220`4tNLO%q_bDoCVH{MLD6EwVOw;Je#KRyG03;4^Y-$qU~dY((*aKRaGH zTTi%qvW;k+HuQ}4d7xg9jMq>rG(-&u(1>zjSu9^?-n6X|^-UVZZXlGFWcY~ib=Din zC;qa3J+CyhHNZOVNuK}SmgMt)+1=mJw3R2PnAzkXzqjLp{4}(v*jvdyu1~jl zvzA~?lx~_|J0y?_b&ZZkA5YHv{{Ge*R$$p+u$m?N8jMr}85)dCv&kFw&|j{I*nUDW zC0~O{kjz{*XtM>C9q@<3jm+LQsFM*-O#Zs$r{CYv$1Y)+4GG_p(f>R$5iw(!n)#ZB zBsx9G8jMcO?D^zogUQWRu_-2xV`8y)C-42w>u)hjW~>_6++d^{kzyJnBX@%*<8c{G zUt|q|&Z=bS2Yaw-4Q_?r{Kn*lAM9+!!5Nlj0O}2KX{aq|Y0Xrw9Tdc>W^GXpTXp$6m5hzNJ|hE+UUGIT`C<2e-^#V7rW4cbxLiqTJ;P4@a3TC}TX z0vc7bQW{iSi-F?8x%tlkpd$T}TmE)^C(Z(9|90yI1_zqS*qE`X8I{sY1xx<)Z+BWL z;pRRPf(P~)AbJ+r1L*y2WB?UtFU>6C%!8uRUfR02>R%Bl;TAsdr$jBUvrFSmZ4{pMzg!n)6;#@jgPsk z5s(g8HLdY%YVSagCi$HSl$@<)V*}s48DspN1~s%z8_ zp4l|Qk)brfQMPD+Gb7NnF>+I5WIqH(Sf&Y1e){+4w1jswzHuB0i8Ed?9?t53SzH!v zZw6pgGdpc>)=Mx8vx72O&DD9*px6E49gs>v<}8L$O~%7f1SMG($6zX~vojg}hoM^y zk!iRs2=pSZnlkYCSi{|<;m)Q3ZmT+H_?J*T5e(-=n{&=i}A)D-)%^M<&| z-AF`&hB&T)x2m!cErl4@b|x?T$Fp1awG&2I$NWJYhW6UvLW`Z%i3EGZ80SVz80TgH z&;rogrK1BcU)3r$Y0Ztk+31&M^Su#4e@-Ps(4b2!)!RiY-4r_+v7)^~AQtK@!VHHa zFPfFBBPJL_gw3yo!LVS=H|m~S$M8PVHyrc??sANo3dRDU2${E<07c9W?scAqwC!<;yt8Exqh&87uldPH z-3y0YhJN=7^zb?!YJi@ZmX~D<$umFMV^_*7hHaCdj_Fy$PTK1;+MPG%0ktAJSj=xk zbheFW<_UMSfe(YBbNoUzexCd1p*!i6vJpU@NJpA=vwj+O3j$q(AC0?N42}EQ$)El6 zcK7Sazy9-H9F9erOHwyE@Gm1b8+qibco7R@n{ky~2KHz(DmFMUg&WxgeC|sg|Cf!; zC_Oa1W@093v%0(>h&4`r{4a6uj0@}e70Dr3P!a~r1`o7+Yb1P5XBacvhE_DyF#DC! zEECt^2%{iUL^2S``~Sxt>;obp>mWv4y_n&w4pr}q7)4PK&7nb#WH14AX^iIB(2D`I znT{s8a7&;-E|-h0puW!r002GW))ru%X|&1_Z9G4gJoY~g*=cYidbtDy-UY}rjq!BW zRK(L$Pfc#5l-k@31VULqpwQX5!FR;niq-LM1q{jXza}^T>u&c{a{s>$8{L&x(=t-Y zJHx^L$y*0ufknp9wjr>zAjlRlkr&l6AV)NL5zz1+*7uRaE;2ZX9QiBnvc+LCGtHWu zEiBSb2MLq6+Ol52GUL3wy+)*6^6C_TIxXjBCT_r zRjsohkG46}72LzmgWf{4;G|1MwauX;-AVvs_ zjI=Ynt}W(5ZL|fR!DbfoHod565054-dL*&L-^oAyblBaQoc*(rwGn?>=0ayu|Jm+Q zBPb@SE)_#!BYEA=UcNEwh?Qm*m5%n&y21MnHA>E*t0R=;AuH_}S$eFykmUr6>jx^VSOn6sLXy{iXiQ?!hkl4vB&ZI<2 zNOu@f!1GrFhGFM}x1MsLj=b(>cuWiK_6Cz-GRWvCOpff5gh=w4pI6TbXrt?!lmGSe zUG9&Qt^a!n=I6ryJ$zoQG_UlOBoxbPFfe61Y5nh^R`5#lx>?o))Xo4Sxin9Irjk1v z%qk-~ISI?i3uBte3e1rijS;WwbZ%UFwM04sB<4P>SY$G5X)(fhZ}Uiu`lAdA1J-FK zqP>i3@R6)j7MC=)i)qW!Ek7?K*{mbxHS5BdA4s>Zad=097BM!1!azRzUT(}@*ObGL!J_}TXD5&wIUNu&b7qXq_Wl09K~KB z!?QWv5q{GA#5L0VWbHHMNVj*o^(9XT8jaWp6MR0>Om}KBtlErpw$lxnprNDzotF@6 zA4;?c5f9pfI0dGA^Gi*k$3`A0lLW;}gjW8W>B|akc%x7vG&UO8W^0JUYl^UwcfIBK%9h4V;;tGM> z@0fulEm$g38O`ie$H1^M1Cp$}VP)Bd9P$Q_G{a3pQQ#F9p;2lCvaF$q&`o;SIk`Cu zzOt-oK2LZ(X9)l}ADe-=AD}FyPpopiM}V}Ujs_sUm)!uCb{H#;s-b-k$EN z#{uv(^i%11MW_=Y3pFyd0(hJL7ioHiyTH9U{mL0`&t+lGioQOj{pFpMjPUXvO4iU| zN(p>NdVRMWzR~y8J&d1BcQB#G=&rmR5)Vl6!Y{@&^I>Jbl|I|;w&9loBULKapW<~9 z*7$i;S^Ydr>PKX4_JmpSr@XDqZMiGd)=YUTnw;lwumpHZ#LPqikAu@)MjX^xdK@5y zOD{Q-)nB|cV*0BG4gI|>lFd|wn~OLPb=iqda_n^G>?;}fC2#ZvE8gp0KwO#C(lBNg7q1)Qt2b@bUWckqmRxuI~98AVDc;6 zLBz$=AVdHaA2aKbuM;8S$Shs@4`%%`tLG-a^Tm+0p6TV+~03c^WVq z-pI=(0Zn<4Bx|0N>1y5@a9jM*93w<>tD2}#5>#m$f@Q6mSevf2N?VZ$Yn8c)!1Ag! z9aU>Osx%#@7beK>Pr2)m_dVj8GzRw=sng#bAmfg!`7oPO@`bc@t{ZNN=z8v`JqUpC z-jAi`AOKiQrepH`w752_zVdcPtN}s3T6mva#ljuo)2q7Nc;~MkOxLV+oA2~f@)R#J zh&+hPq>V6B(k?{OYc|;9#*9Pk1w6l;CTm^o)v>V}1V5iO2vu`y0v}qC3H+GW98~l1 z0q34b_w+b(od6$Z5YqWcG&~4EUMw^<;HS~lKmZ`;X2JPXF2f%jIi69t3zXbH>bMIdt3TKuUprW7aSt3ZM=^+ zHFI)|b9Q;Npp$k95}e=V%XaER^ml?twcz0pQ749ECjW4kE^rY|ab(`ED5SM+W zuw*%9&Bm(f-GzX>yszzR(@lMD{qC%vu`4xeSGdo6WqMI{uyMb<3lNEyPeayhR3Z2NBaV`WjH#fS-H}sA{zG2y(y#ZqGg~&sz^(rrN;b;C z8vvQ+*7TBqU$KoiYIgTf%bz3FXkyHY8F8ei2H>v#o^)T|(py=P=d>fHIW36=#Ykq2 zb6%lF^^SD0n~s{bGmIVnXQWEHZqW6+Lb`9zjZ8-BYxXkEV>1LbjXknDnbb+L$bU~I ztIIhE8m3>9MW@dVx}L4ZV%BJbg4L_h2655p>UD1CTC;qR^50W~)~}NNMLMz0ZHO6` z8m)xuOy7V`mADd{3aG^m1=PA`V+fkbcgo0T#)j6bRGf{azJQSZEDXLDmE(3@t}CSE%AXCsjH+D>2L_@Pa{n7?kTqWh{&o{UYXDj>Yz23wIBNJwFn;5Ix_`9Ch z0lC&4=gR9qUAN?(av;~66_3Y;T@Q(B78gX@qon)q(9vsi+BxEO9Jo2E=%_QF<15wk zTkE=b&Ge=bx8Z8Dth|eqd)85G=r3(k%U{uu^rItg$o)Fq$htjpz1lRlo>Q(@`?~ZO zBW}=BePkn)pfknM&br>Zx$Z~l`Eq&(YkyfrPaodswj6~JW+al!(Aj))89Jcuzn7=< zYB1~$HbbsL+g>@VOB%gNC)|R!|N2eCaH5#ru*t2zI7gX=Uf2slEjOBNPuPrz7`Xgk z`qU;ja(R%E26Zcq+HGbJmNCO4n|78=|*w*r2;%_v^HHZ%%L8?1ogy}Slr@z?=tw=t+rf4jsq~g7K~U!BkIT|>-ZXY%@kbHS5+iO zd|UeSE!amGd7}j|lUf_lpbfB1fosHpHXs8;-u#N}9-RK?QL6HI7X0=U($-eD`Z{jJ z&FJ>KX-LmTukZ1{-Fjc{|Xs&aq*g zBcI=v&Te%hCKcb1V=?c18ax$?vYwBZ8`e=aqN9W}Y3QxsxJDX^pip@Hc41-o^eDcp zH#X`<$4;)o_tw(&+uXUWe;3Gk&Zs-6=ZxJL4tIquBjplYz^O?`n~~aI5)L!VHDOz8 z*esWXZC!nH#&)?RY$_p1qK<>ABgE&aRg zZkLT)l@bTeBu>ov4nt()bP@ zZJM+ozQG6D#))i#ph@GC)rcLAi;dR>lt4T)FcSm1Unse*nU7(by7Nykf&T6qMR5eh)IEC7C%^wPc9CHz);Y_HpNrsEC@-zqGo zr}w(*7HJa7EFI-!@wd|-?R6s~-UXs4V;2A_a9Z5w*6p{;K?TO~tOJl)TRES66UAVl zi04c$0c1f806PnV2QEH+aUb+F>JwVoSGqlLY>G)`kMVV8I1n<2_cGizceMOxMpmsZlUusH?Hr{;DFh4N>m46 zewjHX9YnP#(?N8Hkt_3-^gp`T@y(PQ+%O0oekek34f zUP!My;5M!Eb7_p>M{JhU-#p+pZiszNyg)JiZu+GIZnwKNeW2$03-}m+y7qjxxurwl zTl$$C70rvP^39636fP@tj(3lCWe2h-7d_C){l&uo7@3rBQ1P+!&&S*p!U^9~Pu&9`n&|;_Omf(& zIH@NMZLFM{gExF@)>6U5`f^3&p*wN|%ZWZJGVTEobLOYf!?gg|hU0hww=vR`LF+AnuQ|7T5 z`1FP_SkQ6AV7TmJ`pJ%$-}@mJyq$gka!&B7M4y3@_v-s7lF7 zJr2&z6jlZB0dHGlOjrKCSQ#gwwxJOaF6P$+<@CRm-R2pgb}$kpb5dO{>4w>(O_f+1 zh=_@&!?Hm)>asGy#IE=-u*DDT|0tKeZmq_Xe%N{`{Yk}bI9JxCCK;c*PXABEZQi)! ztisi&PmlK8;>Nqid-3xy{NXO%D0<{9Cpvv~Nu5qaU(bX5(B@(&IvMek4_8O2YIZ#0 z(zjRLz+NNB{;HQBNq4FWfHm(<|E}t`yIaz;Yi`5AFc1QqjN}LlGAXuKxp3RbFoW)? z!li6GE8|1@Ucli)2jw!8O+jEq4daB6-tz(%yzt4F5AcCxW18gi&zW0@7rE%g^5VYLtoSx15?&R zne;CkZWuR5D*;oOo62E{@{AI~WS<<|^hMbh%=+SMGJiX{;*yD_$P+ED$^se9*(# z^ykFUFb~{2AolvUiXO1~&L-|FSF8i9SO-|K4$xlcLLXiJdoOlF!x34kZ3IB{F(Kw^ zRoe8&XnUi<&F=aty6f}UsVfYCu}Kvh9TJ7}WpSewldHkKQ7d_(pXuvg?lueu>y57f z6Hir8+MWF>*}2>=3=+g4cF}xG=mN54HKM_x1~_Fkf_bPBA@OU%^9rdLO?xhJeRqi+ z_kD8jVw5X-fE0$X(`wo{)Z}KeOU3ic(xaES?YCsstU?PAiIK|_mn+u$Ry0rSQOo6t zDT?n;zi^4$;`XOcjN{CSd0&_Q^b$9=3D^XgkdIJ>xtOXOORpGrFE=;A%JPNX47;i( zS9N7_#VU3OcZNCHhF6>BcDLqlRQbNDuK_SJxV9N+dDfu)BkuW5@w^q z_SKs9NY`HGhOUom)m(?4#N2K!%O_cbwp8_kql#D6Zn78)4+|U8*I(xP@#!ky_{e2W ze$+IxCo~P41Gn@7vY*qYEUH%A{WYS{%;>JaHKaAQjz?~Bh1cS@WqSHL@oSqm@!Ugy z<_cR`{wR`U(;{8d$;(~6AJojqUz1!%`q|6fPIrC!-OJrD5`}(rbNLuy2fE>c`4w(m zH>6?}jZ|8^0w;bO(WmW7I*y3hOh0vn>%*5k4m#h= z%B#QL6Kd=Lm}paa=9M93p)A7}Ix|K0_i}t^yL0mQazc%fe7Thqgoc5XCo5AxC$aT^ z;`Au8XH3x4)S-;Kb&Q4Od!A+y)pGjim2P7tQptvb^2N?<5~J+gF>Ofy;YtW|G3~m_ zHM&F>UVfEZkAmB;a@A@aQSD1LY0*lM1Uc@!2<@cCt&OHE@_nJP?$-ul% z6z->5jGpd+UR(ja=p5I55G}!uY-TxQ>DmK!)i2JS36|x)O+cxxL8BjDuHMA8)K!HB zu5mjr**7Z0n z)PTZ~^;SLWRwL`t$E0_?(ha0PxXJak{N)`#kWJRrHI*J}$XRc*>$$r;co7FA4S`AB zX4dOr{}l!iU2?KDtV@#bwlE|_ZiAdE}TdJirD_4J18+!uTEcko!h&CHZ=e3Lx40e={K%(8}?-4NMabApx%;6ZRo3S>6Ytrr%dwk!GN8= znWG4ij)-G~yJl?-b!I_|>^BDSLXud#&|mCb)-bb3{b*^Fm076G>9g0nt-VH8)Y;D$^v*|56Ruv;OyRTEcg?$nh1of?m}-49Vjwxl1t!EI%t zKU3$1&0@%JJja3Uo~U8oUMtJ>n#fn1E2Qk@C@l`NVfC}IQO~kHj(Y4BfNFZpjc%hc zU6kLgY3oLJ;7X9z|1KZ03Lsd-Gk<#3(9n`%1+2))8t!6&5p;E6MAO#Qmk1)^~T_%1(e+y9FN3;FcDRy!NCD0LHqDxNXDQI%CLg!6x96ul1mHy~9_lT>e58Upq z9AueuKkVqhuUYYU!r`X{y3@bA-R*!32^Odj76?lLU>ZLzfXv4Oz_KHKOSM!U70uuTz|N_Gc&MqRZ@k0py&5qz z(sSIe2YRXq`ex=h9?ddg2OyLV&Fbl2-Qo6~=S7-(RZ&10UCobgsi_(O>9xP?HnfD~ z^zxBu8c_Sz#(hh65G>Q13!~kbg0UFC!-y)28Kh}QS&QGX^vxKuRpf{0<2tEP>(>^> zy1GX@w;dln{e0uiOlmT|dVTtnyKqcIN4Hf*!q=^3C4X*g(W z6HfRcAN0uduvjy%IigaOG>l-E098g9Zej>wJbq9-H=179JgDXnsb0|B%%xX0vs%Gj zuOpx>mTTJre+y!M3tIN)?q|qb!g)h2R5NLLd2={~yIn021!-eKIUz_oSXfn z?Fwy7&XX`mLurmM_CqBVX1CSL;dAF*YWk#)HGTddS6PA217(6!(yNi7rk;M`)oyHy zu}3(mwZ!6y?$-3q*M!q5yc2C3Yl_>CrdOT=hwzSjejpJD-xL@r4Y>%?P&E_pWfRrV z2y`es0Cgi(p87t*6L2xZ9xV;mF~GxlJv8N_!Yjj znUP(%zB*k#U+tGDbrzESo^&S?w3N@iaG&*9zqD#WKeHaP8O8ULSZbuhZvm^b< zjO*|7-*@l?L#MIy8z&e?nygU;dx4I=bza(e=?6)d%tneOK(v~1p=|kzxX{)Z{@}(? zZ}<|N19XUE>}xm zeI(os!$$^0?EOICKFF$mKe%(5&W2a^;|g+$1z(%*LP_vPZ5}CWdi0YCW1f^1^NAsJ zvZOKJOuzwI`u5klb$k6+5&W<=0`tdazNVV?PD0-EA22`@2#!x*002jWqT(kpEnsW` z(>s=+jJDJO%3)Zh$^JOZBOoW#xX|s!NepvM1c05&9FbMH!98DOvgJQi;Q5kwwiR^#=IQ8CVMV;VOd_&$W!|DApa?$;xUOuj`v9rf1N*s_b+_RuD;1BXgpebytOg6q_%2@z$m)dXp_i;8eeW?>3}5=IRLz+d z0GToU@i8})9T1>cnCeHdN>MfU4MmzSAmW2pnOr4`?J`V01vS9VU~cjzq74URuwJ|2 z;Bz_se~x1#WSo(_TOZeqLA?!V=Z{HWK*O5ptESyfyP=ZT+2c6Sx^`P4AwbpoI^gr$ z>5J2Np?sgHN@uN@7VmcJ8|EqkG}CBBjY;P)NzEEOCTRA{D9F`7%7SUAneRJ6t!4ak zEl+BdbnOwheoM`~Oqk*saaL04cIGgrnAxYbY^1H+; zYK-DXiS0nkT+F}$y%DIo-W$|a)-9oEme#HCigj~y9+nHN2vnwU$f+w|SMcse)`iTw zL<)WmtjnGY#O*GAYbmo%b#vLMLNmBk7QWWLpNen0q93q{=ef=4gD2e9ea39aYns7++MfuL&%_LiTP$!G+)j;+FP(EGeY$7PU8_%j6wCe%?RLc_f#8F=5hae2 zpDMwaSI&nqPt3bg_Tp;AXFh?{@6Ednb={Liq$JvDn6GP88s@M809Gw4`uV&YQvBAP zbURBCE2!Ij2CJ~e$p3Z-KEqQ?UvtuJ+?Ux?`-UItAy|cQszyuu%jw5Yx>2_!eet9l z?(1d34L&#fV14@YlepMXOV=*AS1Dd67Tgf2`<4ZFW0otfFtps1x_exI`m+Vs%NFM@ zhPCWjbeBYD)689Glq)FfIQ>AHF1pR(W*f>OBH22c=6o7;&_AKq4;Nht@8+v`(ew zEiAk3*{fZ+C1WJnzYpfIk#H-ZrqNdV^<`Hawu6RAH4Bz*yvGeSB4Qd;`QfbJlHXOx zn)x^)okj0($bl<6#$HR>SE>B$J+48z{PR7o6nB8~&Q=@{9rIcxI)L9X$b44QZY(4* zY%YK6byWSxk&gLkHktu!NWnra!&k9n#B#!e9Al)rP{Qa`b?$ zD`Q`j*=ZRQno-PQ0UBaVZ`1)~UKc=qZivcYoaIc3dGXurW9b90bHjUK`%1CWqd>>( z1q0vG@;aHG@p^YbdfDsU#-Sat1BC=Za!}1Lzus*f#N->>8Z=AktKNW{iuf=(ZjyF# zotUDP{?;2D;`V%Fyfu`~E}uxx2q0fY7gqlC4esR|4Xc^S8ukN;rA#MU?jp+klP!0x zyDd&i#UQdm{K?VZ&Ko0Q@BvUmE0 z)A-UGWHxJ%;}#w77M=DAH$Ezt{jrAtO$-@K$_sTl87Z30DC)r8IFW|g^yycD{u0jQ zWv^%=88pDSLB5J+lZqNa9|NVW2XG`Tq9>t3m1iV3w-HSb?tMLaR3k_)H zndQgV+H4a%1D7}kk@eqBR%A;0o|op6Q6<9Ts~|kk?AVuT;y;D#8-UFN?F~%CgPooz zVQ6jfvK+?86kBFhCdY{pp!k7-HsOhyz(Asvi3I?aiag#{DkKdW2Ne-%>CPE_#VvY_ zt#z{Rx}cdw%j7#yW6?5!v}|pIc0(+L6Y-Db1GIcH zTBnm_bdY%e<`HVrvmSJ}tqI;+tBUXy3tCl53_i&@NYqc21aL@h#&4MY<1lOIR6J1S{>DjN!J1}O5#6v z8^*E7nLIA~SmaC|x5{i3kh7ZWUzqS?R`m7U02!I}Z%l+5ivI;TpWX?Hz7g zab19QTr3yAe5Eaf74pOMA*#awcZjODs&qYrzNJu#?k5x|K8(e-N)zfmqY^rz{?Lgl zrZXA{1=0fS+u;i|x}sM)H`fGMw0c8{i~_!eb?7`;My?MUOcoA<*b=&l0o{Y?>8WxZ z>8v-B13a=on_<*0Ija{a5jDJAj=qF_Af3fJUD#7dB?(Y10;rZ>(B1u`cV zqAdag=^Eo8FOxP{N{|>4Ir_-J9r?+_DjlUIDqeZmn|7z}diSyPmr}QD?R|w^Lu2?I zc6=^JoW?^b0(~a1yEMDO&!!GvS=fd~zDY+1znwb#8kFH{tJ;la_?Y{+DZ{Ez=C7m5 z*IjG8&$Sj!Mr}8{DlDpot6jUGN}UiGU?kF9s~Qh?yp-vCx+npmJ-ch%9EI@| zE8stFxGRSOTg=zOWl=!%hQj2a>vn#da~o7we|WvdeNKK|+}Mm1IuVpcGI6sDl`@NG z?i}}ieF-VY{4Ew^ORzkMyX}SLfdf$!<#@vCY7N1_Fy1wTP;8^v$iN@~gt4bP6kzHj zg=6@tb2|DcZiqyJuraeN&`L8W_tlZ>G9ZHjh_1nukwKo_ct0}!oK}sA!>AxK3)T^= z!^Oe~1`VM^Cjn^h zbjB9?cM8c^WE9|-FIzfr$rxstyja(w(=O#kq}RqA z(FxQzLp9$7Ys++#c++cVB{Bup7JKz}ox?_0+y!}5u0Sb}DdkI1h=m+jQ3&ph*+R~Y zhWDo5c(2=ZI5)IZ$w~_H1$W-v6kX$nGcJ#a(tWR(pQj`FR#?vY>8s!8HeZo12li!8 zE!9+BJFf)#$pk<~Ce*)z+f@AGct&fw>}{cdotx%tzeb0>F;@%RN79ie+#cL% zGM15>*Yk1(ApOR6((&MKWJMv+-@2j@D3AKWD@aLsGp^R;{<$h1IsNn#?$sCH9fRN< zU1M@*5Vt<*#t)8mpYEa_@Po*YcDVHVC*6j9*A=$0je2mY zgja9oJw1epl$nQGuWWUUiqE4^9Jru|USlnh`AS|Q? zjHfUBE-pXGOI|xHIXEWW`Q{acV9p!DxY7#5xot%&2$s0MVCV3%7=*z4=sKOc8F`<` zEJ}fMYywv9S}|-r{lxFMe%vZWZEOj5h!;!{57GGvO1e}vyDR|CZ`ANzUN76%J}$n* zlZ{8;o)Zlj0YkK_4^GOl%zy^H{U$pwiOvSwOkqm|ft&vQrqmarG!6!QY(H%Q9`Cf> z1ToO;(iMduz$9o1KxwSo3y}+a1+=VQ< zzP1UkC7<X`q>}&aFX^XkVBVnuT44HFQe` zqRvo5B+v_>aF03A74n3J*G307I!gam31OnV)|ul0Y02clbUOta=?fos{rl?-JRl*R z(K<8eSV1qQ4*JsGkGO$bS76Bm`3g!g{#Zc}Cd^lKN7?=9gCB8QHrxuQ+r_Q)W#X2F z1Pn#aO26eQ6HF4s7F;!>k9-TTBW{7n3c14IKV1p{82fxuoiRxqOq${w zVXt_~jckqTCZ)jLPJu6l{XBi}DV*2epMLKt93*rH`&l&I z(I|0a6Q{v*j$u41$QLv_hT&qf_z3UzLb$ysQaxu1hX)+KI54X3X7Yui21A5){Yt;~ zF*m%sy;MH7->!9ya?<-3{RMn%KmEqX+`u|4LUkUOMrD&iIVmR(Kh?ii-WjHdX$9#* zH&4E2B_P!6G%~Y6=!_rmcq=$Y#CveOR#8iQF0pk7Ev@zcx z_vCD>C$WsYrM!YTJojyntZD3y77lmIhffU6c?6vE6C@ISz8N+B-sh1M_~OUis?m0v zh?kzx)`yUI>6w)8$19)kAOph^x7dYn9rW*O(+y9%ef!!iGJa5iil5(BGM{^hx;rqy zd;!HQqdBhTx~EWB;11YNo_3eGp0xN0H*k?zwCoQW zG@vUBA>F%k(hY^UFn!mS=^x!RWAQp@azJNzzT*owePST`j`i;k3|9ZJYnWMZ`y3gRWw&Ab0 zNkG-?c(j}z{FJ-c9ZOrEau*`f%=QTKlLyu;%a0!9TYxfA?JU=ylOyfq z_YbTaY|_UC*LyM2ejtz0+WTaPnwYTiVO1)PZvEDWsU zf@TqYX#wP-8C(6XXWh_XyKK_mo)lz;nY?b-WBFNxp7hRV-PY9{u~bgCejXRcOM2~H ziA?9zlRo;a+k0Wobc?ZT`U@MfIh3DC$gx!hg^-_}{?oH~3+wE3)o1V#vw!!T>z&~? zGshn8EOWHx&N5#BOl($IZmBXm9rrFxe(`0+D#gFJX7b_(28NsTDLLsPju`lG`oizK zfxDQV2)Q3|P*M$CxuuOpuE}d)(K9I}DCaqU)TCQc&GUN*{49eI_;Ti%+iJkfw%#;L z-o4Am4YCdtm`VzT80dnO+(QNr2~}a`zyBO0kK4bV^rp|b{x8?feQN z)6TCcY?lOO&v+y*)51Znbw=H&WuaP=flf|V=mNB0ljeGwJo*VubQJWNAWw&`2<4(i z+=R6ifEnIf%FjSp5@;8!W=-1roEvQBG?Lz6#VVPS%I)Pz5A5HlSZV7yd{i!|xuS`c zJRMGEB?jnUy{8Xd=mQ4Y{4Rbsg5wO}?UDzc!={Qhe+9POSFKQi2EO=!9-XlLcVPeq zT!kh)1V`%?(pe9mKKgmLv(|3fG(!~cb{;9lv+rz}Om!`9J1Mk#pSni&`xZg~%WG7a9q z19xB{hdNX#nFBPAMzCBVUHZ^R=aes)wQTYH#}<~vgcQnM*R&ni_4;E;mK9l8@?eMr zLzo;#5?2aSmY22iRhd771r6l436PG*wvt>6y78Mfa%3!Y;lX3XEr&!b2-6mYYJ{Vo zPVGi0z{@YuY#WZE)=7KK;j`#zx!-pF&^*hDSl0Rj;Mx;py#$AZEM>Tjp(8Y9i1fJJ zGgLNMa)zcU@C;U*r^DCZ!t~KH)0!3Lx9t+o^=) z+(Vs8-k-xW8&|H3)-A59YKYEV^K|qFmGQIH>dQ$wr^S{dUkKlVO-<@sVWm{wt>fr+ zb>kTRbd0P@D?!;{f7yGJ6BfJM`Ly^!Rh<8HPqCCv2oyAAZ71% za=<6Bg}C_c5iKndity}dP5$E^L;k524=@|U=d@N8Lb&g9ttG=05187L>6Cu$BM!_v zrL$zu=By9&fzM_`RZXhK~86#j|LOQz$a2qr#@t+>^ z0N%wdFS9n9`Z4tsy$|Xg0HwTVa|8lFs{AITN!+e{r}<}AU&|-2ESkorxC>p zlW;}E$Cj^nmja8t$v1hgo~}|CT#2%m|1EFkflUMw;Nfq136}wh+~qj}M&U@NyULIz z>d$dpC5r%W%5arpc`_3C#bHA)W>PUo(svJ$OYa$_muO((wLJZbBCY>W zGDdV4>hTGKbi=bh(~Z?hA$lTH78rsuQvs3@xkM!A?>coEM#iDvt^ZCBRnt>0zb%X6 zGrP-SmQy@!qK&JL>un%|?A;T3L%Kw!?uwqEKpZw-*H5T2w3Xh_&ojf6W*rOL18_0_ zmR=ewnQkH?i^+DcE?SA4nP-aRzzj<)@v0)->uN~U$HO{&GFv3a!x*d`FLD|D5qD1( zA1UlX#H*YkCL}>8w$B&Ok+^dD33s1&ZA(`67;oX|aQSYi&yF6o6 zz@16>Ov*AW<&KT7FBOHlWPG7gWO7KuyQ_r)5bu#1aR4f?t42JeOSix9Yaz{TBd*^l z#whSUzP?%H^1(QMzEzx0Q8npP7QVMf)Mmp}9QzlsD>k0f<(6xiS>We8fqS1nE!c2K z^DciaR=`}ZxL1sVe5~yi>jUHZ$2a0BFfHnYN&0{}67TVwVv_{5=cY*2rAuD#6IXRf z*`pbYh`of;<8s?39IMy#ze`zFoB@{E2)@h(AkEw*_=s-Y0=YnuVf0ZstuWr`r;=S^ zk`dA&2TRk9M=4Ci9V3hg7}J9|bl(l|3)@(u$Qh647