From 2cfbb891421da04a2c85a659ad92faea25123bb0 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Fri, 28 Feb 2003 16:06:22 +0000 Subject: [PATCH] added libtommath-0.08 --- bn.c | 391 +++++++++++++++++++++++++++++++++++++++----------- bn.h | 13 +- bn.pdf | Bin 152877 -> 152917 bytes bn.tex | 22 +-- changes.txt | 8 ++ demo.c | 26 +++- etc/makefile | 1 + etc/pprime.c | 281 ++++++++++++++++++++++++++++++++++++ makefile | 13 +- mtest/mtest.c | 11 +- timer.asm | 6 + 11 files changed, 656 insertions(+), 116 deletions(-) create mode 100644 etc/makefile create mode 100644 etc/pprime.c diff --git a/bn.c b/bn.c index 6d258d0..0debe07 100644 --- a/bn.c +++ b/bn.c @@ -25,17 +25,116 @@ static const char *s_rmap = #ifdef DEBUG -static char *_funcs[1000]; -int _ifuncs; +/* timing data */ +#ifdef TIMER_X86 +extern ulong64 gettsc(void); +#else +ulong64 gettsc(void) { return clock(); } +#endif -#define REGFUNC(name) { if (_ifuncs == 999) { printf("TROUBLE\n"); exit(0); } _funcs[_ifuncs++] = name; } -#define DECFUNC() --_ifuncs; +/* structure to hold timing data */ +struct { + char *func; + ulong64 start, end, tot; +} timings[1000000]; + +/* structure to hold consolidated timing data */ +struct _functime { + char *func; + ulong64 tot; +} functime[1000]; + +static char *_funcs[1000]; +int _ifuncs, _itims; + +#define REGFUNC(name) int __IX = _itims++; _funcs[_ifuncs++] = name; timings[__IX].func = name; timings[__IX].start = gettsc(); +#define DECFUNC() timings[__IX].end = gettsc(); --_ifuncs; #define VERIFY(val) _verify(val, #val, __LINE__); +/* sort the consolidated timings */ +int qsort_helper(const void *A, const void *B) +{ + struct _functime *a, *b; + + a = (struct _functime *)A; + b = (struct _functime *)B; + + if (a->tot > b->tot) return -1; + if (a->tot < b->tot) return 1; + return 0; +} + +/* reset debugging information */ +void reset_timings(void) +{ + _ifuncs = _itims = 0; +} + +/* dump the timing data */ +void dump_timings(void) +{ + int x, y; + ulong64 total; + + /* first for every find the total time */ + printf("Phase I ... Finding totals (%d samples)...\n", _itims); + for (x = 0; x < _itims; x++) { + timings[x].tot = timings[x].end - timings[x].start; + } + + /* now subtract the time for each function where nested functions occured */ + printf("Phase II ... Finding dependencies...\n"); + for (x = 0; x < _itims-1; x++) { + for (y = x+1; y < _itims && timings[y].start <= timings[x].end; y++) { + timings[x].tot -= timings[y].tot; + if (timings[x].tot > ((ulong64)1 << (ulong64)40)) { + timings[x].tot = 0; + } + } + } + + /* now consolidate all the entries */ + printf("Phase III... Consolidation...\n"); + + memset(&functime, 0, sizeof(functime)); + total = 0; + for (x = 0; x < _itims; x++) { + total += timings[x].tot; + + /* try to find this entry */ + for (y = 0; functime[y].func != NULL; y++) { + if (strcmp(timings[x].func, functime[y].func) == 0) { + break; + } + } + + if (functime[y].func == NULL) { + /* new entry */ + functime[y].func = timings[x].func; + functime[y].tot = timings[x].tot; + } else { + functime[y].tot += timings[x].tot; + } + } + + for (x = 0; functime[x].func != NULL; x++); + + /* sort and dump */ + qsort(&functime, x, sizeof(functime[0]), &qsort_helper); + + for (x = 0; functime[x].func != NULL; x++) { + if (functime[x].tot > 0 && strcmp(functime[x].func, "_verify") != 0) { + printf("%30s: %20llu (%3llu.%03llu %%)\n", functime[x].func, functime[x].tot, (functime[x].tot * (ulong64)100) / total, ((functime[x].tot * (ulong64)100000) / total) % (ulong64)1000); + } + } +} + static void _verify(mp_int *a, char *name, int line) { int n, y; static const char *err[] = { "Null DP", "alloc < used", "digits above used" }; + + REGFUNC("_verify"); /* dp null ? */ y = 0; @@ -52,6 +151,7 @@ static void _verify(mp_int *a, char *name, int line) } /* ok */ + DECFUNC(); return; error: printf("Error (%s) with variable {%s} on line %d\n", err[y], name, line); @@ -64,7 +164,7 @@ error: exit(0); } -#else +#else /* don't use DEBUG stuff so these macros are blank */ #define REGFUNC(name) #define DECFUNC() @@ -76,13 +176,18 @@ error: int mp_init(mp_int *a) { REGFUNC("mp_init"); - a->dp = calloc(sizeof(mp_digit), 16); + + /* allocate ram required and clear it */ + a->dp = calloc(sizeof(mp_digit), MP_PREC); if (a->dp == NULL) { DECFUNC(); return MP_MEM; } + + /* set the used to zero, allocated digit to the default precision + * and sign to positive */ a->used = 0; - a->alloc = 16; + a->alloc = MP_PREC; a->sign = MP_ZPOS; VERIFY(a); @@ -96,8 +201,14 @@ void mp_clear(mp_int *a) REGFUNC("mp_clear"); if (a->dp != NULL) { VERIFY(a); - memset(a->dp, 0, sizeof(mp_digit) * a->alloc); + + /* first zero the digits */ + memset(a->dp, 0, sizeof(mp_digit) * a->used); + + /* free ram */ free(a->dp); + + /* reset members to make debugging easier */ a->dp = NULL; a->alloc = a->used = 0; } @@ -118,27 +229,26 @@ void mp_exch(mp_int *a, mp_int *b) /* grow as required */ static int mp_grow(mp_int *a, int size) { - int i; - mp_digit *tmp; + int i, n; REGFUNC("mp_grow"); VERIFY(a); /* if the alloc size is smaller alloc more ram */ if (a->alloc < size) { - size += 32 - (size & 15); /* ensure there are always at least 16 digits extra on top */ + size += (MP_PREC*2) - (size & (MP_PREC-1)); /* ensure there are always at least 16 digits extra on top */ - tmp = calloc(sizeof(mp_digit), size); - if (tmp == NULL) { + a->dp = realloc(a->dp, sizeof(mp_digit)*size); + if (a->dp == NULL) { DECFUNC(); return MP_MEM; } - for (i = 0; i < a->used; i++) { - tmp[i] = a->dp[i]; - } - free(a->dp); - a->dp = tmp; + + n = a->alloc; a->alloc = size; + for (i = n; i < a->alloc; i++) { + a->dp[i] = 0; + } } DECFUNC(); return MP_OKAY; @@ -233,8 +343,7 @@ int mp_init_size(mp_int *a, int size) REGFUNC("mp_init_size"); /* pad up so there are at least 16 zero digits */ - size += 32 - (size & 15); - + size += (MP_PREC*2) - (size & (MP_PREC-1)); /* ensure there are always at least 16 digits extra on top */ a->dp = calloc(sizeof(mp_digit), size); if (a->dp == NULL) { DECFUNC(); @@ -270,7 +379,6 @@ int mp_copy(mp_int *a, mp_int *b) } /* zero b and copy the parameters over */ - mp_zero(b); b->used = a->used; b->sign = a->sign; @@ -278,6 +386,11 @@ int mp_copy(mp_int *a, mp_int *b) for (n = 0; n < a->used; n++) { b->dp[n] = a->dp[n]; } + + /* clear high digits */ + for (n = b->used; n < b->alloc; n++) { + b->dp[n] = 0; + } DECFUNC(); return MP_OKAY; } @@ -513,7 +626,7 @@ int mp_mod_2d(mp_int *a, int b, mp_int *c) c->dp[x] = 0; } /* clear the digit that is not completely outside/inside the modulus */ - c->dp[b/DIGIT_BIT] &= (mp_digit)((((mp_digit)1)<<(b % DIGIT_BIT)) - ((mp_digit)1)); + c->dp[b/DIGIT_BIT] &= (mp_digit)((((mp_digit)1)<<(((mp_digit)b) % DIGIT_BIT)) - ((mp_digit)1)); mp_clamp(c); DECFUNC(); return MP_OKAY; @@ -697,7 +810,7 @@ int mp_mul_2(mp_int *a, mp_int *b) return MP_OKAY; } -/* low level addition */ +/* low level addition, based on HAC pp.594, Algorithm 14.7 */ static int s_mp_add(mp_int *a, mp_int *b, mp_int *c) { mp_int *x; @@ -709,7 +822,9 @@ static int s_mp_add(mp_int *a, mp_int *b, mp_int *c) VERIFY(b); VERIFY(c); - /* find sizes */ + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ if (a->used > b->used) { min = b->used; max = a->used; @@ -735,9 +850,11 @@ static int s_mp_add(mp_int *a, mp_int *b, mp_int *c) c->used = max + 1; /* add digits from lower part */ + + /* set the carry to zero */ u = 0; for (i = 0; i < min; i++) { - /* T[i] = A[i] + B[i] + U */ + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ c->dp[i] = a->dp[i] + b->dp[i] + u; /* U = carry bit of T[i] */ @@ -774,7 +891,7 @@ static int s_mp_add(mp_int *a, mp_int *b, mp_int *c) return MP_OKAY; } -/* low level subtraction (assumes a > b) */ +/* low level subtraction (assumes a > b), HAC pp.595 Algorithm 14.9 */ static int s_mp_sub(mp_int *a, mp_int *b, mp_int *c) { int olduse, res, min, max, i; @@ -800,6 +917,8 @@ static int s_mp_sub(mp_int *a, mp_int *b, mp_int *c) c->used = max; /* sub digits from lower part */ + + /* set carry to zero */ u = 0; for (i = 0; i < min; i++) { /* T[i] = A[i] - B[i] - U */ @@ -849,9 +968,8 @@ static int s_mp_sub(mp_int *a, mp_int *b, mp_int *c) */ static int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) { - int olduse, res, pa, pb, ix, iy; - mp_word W[512], *_W; - mp_digit tmpx, *tmpy; + int olduse, res, pa, ix; + mp_word W[512]; REGFUNC("fast_s_mp_mul_digs"); VERIFY(a); @@ -866,7 +984,7 @@ static int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) } /* clear temp buf (the columns) */ - memset(W, 0, digs*sizeof(mp_word)); + memset(W, 0, sizeof(mp_word) * digs); /* calculate the columns */ pa = a->used; @@ -876,21 +994,41 @@ static int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) * of output are produced. So at most we want to make upto "digs" digits * of output */ - pb = MIN(b->used, digs - ix); - /* setup some pointer aliases to simplify the inner loop */ - tmpx = a->dp[ix]; - tmpy = b->dp; - _W = &(W[ix]); /* this adds products to distinct columns (at ix+iy) of W * note that each step through the loop is not dependent on * the previous which means the compiler can easily unroll * the loop without scheduling problems */ - for (iy = 0; iy < pb; iy++) { - *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); + { + register mp_digit tmpx, *tmpy; + register mp_word *_W; + register int iy, pb; + + /* alias for the the word on the left e.g. A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for the right side */ + tmpy = b->dp; + + /* alias for the columns, each step through the loop adds a new + term to each column + */ + _W = W + ix; + + + /* the number of digits is limited by their placement. E.g. + we avoid multiplying digits that will end up above the # of + digits of precision requested + */ + pb = MIN(b->used, digs - ix); + + for (iy = 0; iy < pb; iy++) { + *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); + } } + } /* setup dest */ @@ -908,11 +1046,12 @@ static int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) * N^2 + N*c where c is the cost of the shifting. On very small numbers * this is slower but on most cryptographic size numbers it is faster. */ + for (ix = 1; ix < digs; ix++) { - W[ix] = W[ix] + (W[ix-1] >> ((mp_word)DIGIT_BIT)); - c->dp[ix-1] = W[ix-1] & ((mp_word)MP_MASK); + W[ix] += (W[ix-1] >> ((mp_word)DIGIT_BIT)); + c->dp[ix-1] = (mp_digit)(W[ix-1] & ((mp_word)MP_MASK)); } - c->dp[digs-1] = W[digs-1] & ((mp_word)MP_MASK); + c->dp[digs-1] = (mp_digit)(W[digs-1] & ((mp_word)MP_MASK)); /* clear unused */ for (ix = c->used; ix < olduse; ix++) { @@ -924,7 +1063,10 @@ static int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) return MP_OKAY; } -/* multiplies |a| * |b| and only computes upto digs digits of result */ +/* multiplies |a| * |b| and only computes upto digs digits of result + * HAC pp. 595, Algorithm 14.12 Modified so you can control how many digits of + * output are created. + */ static int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) { mp_int t; @@ -963,7 +1105,7 @@ static int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) /* limit ourselves to making digs digits of output */ pb = MIN(b->used, digs - ix); - + /* setup some aliases */ tmpx = a->dp[ix]; tmpt = &(t.dp[ix]); @@ -1001,9 +1143,8 @@ static int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) */ static int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) { - int oldused, newused, res, pa, pb, ix, iy; - mp_word W[512], *_W; - mp_digit tmpx, *tmpy; + int oldused, newused, res, pa, pb, ix; + mp_word W[512]; REGFUNC("fast_s_mp_mul_high_digs"); VERIFY(a); @@ -1023,14 +1164,29 @@ static int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) pb = b->used; memset(&W[digs], 0, (pa + pb + 1 - digs) * sizeof(mp_word)); for (ix = 0; ix < pa; ix++) { - /* pointer aliases */ - tmpx = a->dp[ix]; - tmpy = b->dp + (digs - ix); - _W = &(W[digs]); + { + register mp_digit tmpx, *tmpy; + register int iy; + register mp_word *_W; + + /* work todo, that is we only calculate digits that are at "digs" or above */ + iy = digs - ix; + + /* copy of word on the left of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias for right side */ + tmpy = b->dp + iy; + + /* alias for the columns of output. Offset to be equal to or above the + * smallest digit place requested + */ + _W = &(W[digs]); - /* compute column products for digits above the minimum */ - for (iy = digs - ix; iy < pb; iy++) { - *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); + /* compute column products for digits above the minimum */ + for (; iy < pb; iy++) { + *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); + } } } @@ -1040,10 +1196,10 @@ static int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) /* now convert the array W downto what we need */ for (ix = digs+1; ix < (pa+pb+1); ix++) { - W[ix] = W[ix] + (W[ix-1] >> ((mp_word)DIGIT_BIT)); - c->dp[ix-1] = W[ix-1] & ((mp_word)MP_MASK); + W[ix] += (W[ix-1] >> ((mp_word)DIGIT_BIT)); + c->dp[ix-1] = (mp_digit)(W[ix-1] & ((mp_word)MP_MASK)); } - c->dp[(pa+pb+1)-1] = W[(pa+pb+1)-1] & ((mp_word)MP_MASK); + c->dp[(pa+pb+1)-1] = (mp_digit)(W[(pa+pb+1)-1] & ((mp_word)MP_MASK)); for (ix = c->used; ix < oldused; ix++) { c->dp[ix] = 0; @@ -1085,13 +1241,26 @@ static int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) pa = a->used; pb = b->used; for (ix = 0; ix < pa; ix++) { + /* clear the carry */ u = 0; + + /* left hand side of A[ix] * B[iy] */ tmpx = a->dp[ix]; + + /* alias to the address of where the digits will be stored */ tmpt = &(t.dp[digs]); + + /* alias for where to read the right hand side from */ tmpy = b->dp + (digs - ix); + for (iy = digs - ix; iy < pb; iy++) { + /* calculate the double precision result */ r = ((mp_word)*tmpt) + ((mp_word)tmpx) * ((mp_word)*tmpy++) + ((mp_word)u); + + /* get the lower part */ *tmpt++ = (mp_digit)(r & ((mp_word)MP_MASK)); + + /* carry the carry */ u = (mp_digit)(r >> ((mp_word)DIGIT_BIT)); } *tmpt = u; @@ -1119,9 +1288,8 @@ static int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) */ static int fast_s_mp_sqr(mp_int *a, mp_int *b) { - int olduse, newused, res, ix, iy, pa; - mp_word W2[512], W[512], *_W; - mp_digit tmpx, *tmpy; + int olduse, newused, res, ix, pa; + mp_word W2[512], W[512]; REGFUNC("fast_s_mp_sqr"); VERIFY(a); @@ -1144,14 +1312,23 @@ static int fast_s_mp_sqr(mp_int *a, mp_int *b) /* compute the outer product */ W2[ix+ix] += ((mp_word)a->dp[ix]) * ((mp_word)a->dp[ix]); - /* pointer aliasing! */ - tmpx = a->dp[ix]; - tmpy = &(a->dp[ix+1]); - _W = &(W[ix+ix+1]); + { + register mp_digit tmpx, *tmpy; + register mp_word *_W; + register int iy; + + /* copy of left side */ + tmpx = a->dp[ix]; + + /* alias for right side */ + tmpy = a->dp + (ix + 1); + + _W = &(W[ix+ix+1]); - /* inner products */ - for (iy = ix + 1; iy < pa; iy++) { - *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); + /* inner products */ + for (iy = ix + 1; iy < pa; iy++) { + *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); + } } } @@ -1168,9 +1345,9 @@ static int fast_s_mp_sqr(mp_int *a, mp_int *b) W[ix] += W[ix] + W2[ix]; W[ix] = W[ix] + (W[ix-1] >> ((mp_word)DIGIT_BIT)); - b->dp[ix-1] = W[ix-1] & ((mp_word)MP_MASK); + b->dp[ix-1] = (mp_digit)(W[ix-1] & ((mp_word)MP_MASK)); } - b->dp[(pa+pa+1)-1] = W[(pa+pa+1)-1] & ((mp_word)MP_MASK); + b->dp[(pa+pa+1)-1] = (mp_digit)(W[(pa+pa+1)-1] & ((mp_word)MP_MASK)); /* clear high */ for (ix = b->used; ix < olduse; ix++) { @@ -1185,7 +1362,7 @@ static int fast_s_mp_sqr(mp_int *a, mp_int *b) return MP_OKAY; } -/* low level squaring, b = a*a */ +/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ static int s_mp_sqr(mp_int *a, mp_int *b) { mp_int t; @@ -1212,15 +1389,34 @@ static int s_mp_sqr(mp_int *a, mp_int *b) t.used = pa + pa + 1; for (ix = 0; ix < pa; ix++) { + /* first calculate the digit at 2*ix */ + /* calculate double precision result */ r = ((mp_word)t.dp[ix+ix]) + ((mp_word)a->dp[ix]) * ((mp_word)a->dp[ix]); + + /* store lower part in result */ t.dp[ix+ix] = (mp_digit)(r & ((mp_word)MP_MASK)); + + /* get the carry */ u = (r >> ((mp_word)DIGIT_BIT)); + + /* left hand side of A[ix] * A[iy] */ tmpx = a->dp[ix]; + + /* alias for where to store the results */ tmpt = &(t.dp[ix+ix+1]); for (iy = ix + 1; iy < pa; iy++) { + /* first calculate the product */ r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); + + /* now calculate the double precision result, note we use + * addition instead of *2 since its easier to optimize + */ r = ((mp_word)*tmpt) + r + r + ((mp_word)u); + + /* store lower part */ *tmpt++ = (mp_digit)(r & ((mp_word)MP_MASK)); + + /* get carry */ u = (r >> ((mp_word)DIGIT_BIT)); } r = ((mp_word)*tmpt) + u; @@ -1334,11 +1530,11 @@ int mp_sub(mp_int *a, mp_int *b, mp_int *c) return res; } -/* c = |a| * |b| using Karatsuba */ +/* c = |a| * |b| using Karatsuba Multiplication */ static int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c) { mp_int x0, x1, y0, y1, t1, t2, x0y0, x1y1; - int B, err, neg, x; + int B, err, x; REGFUNC("mp_karatsuba_mul"); VERIFY(a); @@ -1396,9 +1592,7 @@ static int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c) /* now calc x1-x0 and y1-y0 */ if (mp_sub(&x1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = x1 - x0 */ if (mp_sub(&y1, &y0, &t2) != MP_OKAY) goto X1Y1; /* t2 = y1 - y0 */ - neg = (t1.sign == t2.sign) ? MP_ZPOS : MP_NEG; if (mp_mul(&t1, &t2, &t1) != MP_OKAY) goto X1Y1; /* t1 = (x1 - x0) * (y1 - y0) */ - t1.sign = neg; /* add x0y0 */ if (mp_add(&x0y0, &x1y1, &t2) != MP_OKAY) goto X1Y1; /* t2 = x0y0 + x1y1 */ @@ -1538,7 +1732,15 @@ int mp_sqr(mp_int *a, mp_int *b) } -/* integer signed division. c*b + d == a [e.g. a/b, c=quotient, d=remainder] */ +/* integer signed division. c*b + d == a [e.g. a/b, c=quotient, d=remainder] + * HAC pp.598 Algorithm 14.20 + * + * Note that the description in HAC is horribly incomplete. For example, + * it doesn't consider the case where digits are removed from 'x' in the inner + * loop. It also doesn't consider the case that y has fewer than three digits, etc.. + * + * The overall algorithm is as described as 14.20 from HAC but fixed to treat these cases. +*/ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d) { mp_int q, x, y, t1, t2; @@ -1596,7 +1798,7 @@ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d) neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; x.sign = y.sign = MP_ZPOS; - /* normalize */ + /* normalize both x and y, ensure that y >= b/2, [b == 2^DIGIT_BIT] */ norm = 0; while ((y.dp[y.used-1] & (((mp_digit)1)<<(DIGIT_BIT-1))) == ((mp_digit)0)) { ++norm; @@ -1927,7 +2129,7 @@ int mp_expt_d(mp_int *a, mp_digit b, mp_int *c) return res; } - if (b & (mp_digit)(1<<(DIGIT_BIT-1))) { + if ((b & (mp_digit)(1<<(DIGIT_BIT-1))) != 0) { if ((res = mp_mul(c, &g, c)) != MP_OKAY) { mp_clear(&g); DECFUNC(); @@ -2106,8 +2308,12 @@ int mp_gcd(mp_int *a, mp_int *b, mp_int *c) k = 0; while ((u.dp[0] & 1) == 0 && (v.dp[0] & 1) == 0) { ++k; - mp_div_2d(&u, 1, &u, NULL); - mp_div_2d(&v, 1, &v, NULL); + if ((res = mp_div_2d(&u, 1, &u, NULL)) != MP_OKAY) { + goto __T; + } + if ((res = mp_div_2d(&v, 1, &v, NULL)) != MP_OKAY) { + goto __T; + } } /* B2. Initialize */ @@ -2125,7 +2331,9 @@ int mp_gcd(mp_int *a, mp_int *b, mp_int *c) do { /* B3 (and B4). Halve t, if even */ while (t.used != 0 && (t.dp[0] & 1) == 0) { - mp_div_2d(&t, 1, &t, NULL); + if ((res = mp_div_2d(&t, 1, &t, NULL)) != MP_OKAY) { + goto __T; + } } /* B5. if t>0 then u=t otherwise v=-t */ @@ -2563,7 +2771,9 @@ int mp_reduce_setup(mp_int *a, mp_int *b) return res; } -/* reduces x mod m, assumes 0 < x < m^2, mu is precomputed via mp_reduce_setup */ +/* reduces x mod m, assumes 0 < x < m^2, mu is precomputed via mp_reduce_setup + * From HAC pp.604 Algorithm 14.42 + */ int mp_reduce(mp_int *x, mp_int *m, mp_int *mu) { mp_int q; @@ -2595,10 +2805,14 @@ int mp_reduce(mp_int *x, mp_int *m, mp_int *mu) mp_rshd(&q, um + 1); /* q3 = q2 / b^(k+1) */ /* x = x mod b^(k+1), quick (no division) */ - mp_mod_2d(x, DIGIT_BIT * (um + 1), x); + if ((res = mp_mod_2d(x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { + goto CLEANUP; + } /* q = q * m mod b^(k+1), quick (no division) */ - s_mp_mul_digs(&q, m, &q, um + 1); + if ((res = s_mp_mul_digs(&q, m, &q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } /* x = x - q */ if((res = mp_sub(x, &q, x)) != MP_OKAY) @@ -2626,6 +2840,11 @@ int mp_reduce(mp_int *x, mp_int *m, mp_int *mu) return res; } +/* computes Y == G^X mod P, HAC pp.616, Algorithm 14.85 + * + * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. + * The value of k changes based on the size of the exponent. + */ int mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y) { mp_int M[64], res, mu; @@ -2648,7 +2867,7 @@ int mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y) /* init G array */ for (x = 0; x < (1<dp[digidx--]; - bitcnt = DIGIT_BIT; + bitcnt = (int)DIGIT_BIT; } /* grab the next msb from the exponent */ @@ -2793,7 +3012,7 @@ int mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y) } bitbuf <<= 1; - if (bitbuf & (1<f~*j#-%dr4qA^~4Fp@6*Rru>qLtO5uuZJSGP}xZI4br#!+t0{HkQATP0)a~u9)V9|i+tts%^3}r?UwwbYnF@aO9*#K^ zA*^;+8tNHsrtjOUpRWFMB_>-pv$30G?eDi&Uwy08%ClhY>h>+%Ffga>$_CH439H+O zpSyoQU*9OzZ4UkQjp)YVT6FuT>tAobzxw8Ou`YsS3V$xJK{MxM5tYC=pvEJ?Sup3M zld+r3+Bqs98g+{L)9}XzV1wy?;fCK0;}Jf^r>xQlX1#2~IvcC9O5>QP-bt*t!;V;W z_kI{3BlVjfzl%kPkG*{lo&E8CyE($=YfVuO9L`mnrp(5wO;H}(d$A=ypiJ(t3AfiF zbo3hYr(5K3t5yx z3$P@G8dxw)U{_~g0y`S|ejOYfn4%t9Kqfs@AQwGkkjgs56iznOgW-_1xK?^d)?U$r zVt<@#xT9iTn%M1J>Y^Z8kR?IX$Yw!gWCnX$Dz^>>qj6CXEg+L1Dv(-vfD@;2WsF4A_=i-D+&;ayKtOI;% zU6e%&$|Q>laM-Wtk6!ha;%Y%R4ID~m!27Puo;%|khjXuy>;QQ?{; zk#Sj?qpjd;ji0_Ki3W^G5oJcLEHlELFbWD3UgS+K31Vusz)9v_S>PB- zYpsNk7o*vmm+c66!}AswnMDl>$7DMZCTrycCLz`qH7&T32rFEQD+W{l2^WocX@862 zYXO(kSAo+wg+We}!Rff71_N9(uTDeIpL9C6;0o2s>B(Bz=^SEi5EmCPEx?l3D`1P) zb1-zfsXT>gL6_WKpU%@ z%fjLVj3#u8-)nSQJH~}Np(9mlXMbns3kCz|bDZxrQ@+(wHM3UCH;i}8I(2br(u6E| zze1)sTpQF0ne^1bp&0F(;3fB0@D}%Hcu}0veX;wUVp_IZnP%3??st|sp)amMnvf;; z*T|-)RympA^wi3S;-a((U-Ey2Z+?Dx(sLwF8AlJUJ3Kwf{tN+F$u#7Vjei7?td#{| zF)1|{*Bed9k^pLCvjB23O9BYx$Cgd_k^m}v^JA)e<#FbMqklE5#LN9n+cqUb|)nl?&P9UUU@b~fpq6Jyz^|c01UBB;@kKp#@oTdxdOqdq(Escq%_7Y=W2EUcp<|4H;hCTd`8iemAgi zRDZ$mup(wkw0d5USu6TohrldX7uO3-$QHj>$)@!}PNq0*QAk^i@=f>_$Jh8~$LD-; zSKGMawuA;L1mRjO7cz6NzIUY|9%&CTOUHlhv~ND(-q`cF!@aR<5N7vKl%U7gwpuM& zGi${hBL}S{8BM^F0&8H?9$5~iDDrSAX#dF<15gvnq{9m3ylt9O(raNt`L#mIFnTB;pP9`P2 zwV-(1(^6$gw7^V~s9?@J=_i;xCMnZS`l1QR1lOOf2_qTztyZR)wX!A*1PdE3Cag`! zk|t_o-om7ON)}(r^KvaEN@J}m8BBi*(4>kAs8*WEPeBFE9YIl|rRHKBmjwtA$ISu1M-(qRZ1GaFxQVKq6=xIzd7l zvT>{JU;A-`%Fx~T2-o!^eo=q$Wh(uJ3mgycUJmdtz2bR{Cmv=^Q60=>Uhc=2evH+y z`0fRc$H_PxK5m9Xw7x?-{ktdJ!5y*I!)CII4`=9Lx!snihWLu<_G2_KJmJ@|zaLpt zzkr3B#`H-*r^dzDEjB?Z+dU)O;Tf)U-TpWg?%(34i4Dbqd$jo2AI5)JJ{)5)GVaHC zJnrMUcLX+7?4RN%m3=_i`|RvE?1raz@p$eJG8KD|ZoH@NKuT&ooqmkXk5vKe{WZc< zTlv(==)di72UQO}_SX>o!>(_Pl-;-2UUhruaTt-^=0m@uy>hCuhC*ww7wKfb-Npmz z6!?tZ!b-dwH^=cf9nODLaQsSh@xu7KIXM3o8#vv(j~_`MbO-(kyrM`dFlMNebE$jM357t+V(FkRQ9St{!Bl8?t&j6Ug)(OqJ0OteK~|0(-2 zSt9-7_@7J^dkq3C+!2nk=fJ{wi{JbRXYj|M3PJ6rI%;JirmsbpJ%8cf(}fneHb%{$q0%Ad%NIHQ6Ag zXyNA&csP#n`wsMMO!q&Ow-yct@Y8WT&^UaVe@jd!FkavVbBEF~jSxIKl5c*8@NkUP zhvRwmw-Dl{QgnAe#;VfC!Z?(s>-wmi^PWGB`@;s6?JZx{|^vT(jHsPsinMRBIP?{qfZsoj0c6 zzN6tVjE_6CBr+%=Q?E{<#q%`MC{7EGzu=9rWI3~6nms(EaRFD{Z82(S<+^{oUWW|! z(bOFct~h^XQ6!sgvBP1A-LoAB3=-R6GhJ93E^+z-v#?&E=PfsPlasK3TJ}tX1>l@@ z-G5_m;Ay^$GOS9&=#y(=0Y$U@3x(@9aLA0S6=}xA_}(2Ml;8-PAY;7~5rRP)=ucIO+4}C3(6Zj&Z6~m~=s>ylg2# zJ(GV#XZ>R3wGh9%Ni8*@?{qe*P!Lp<^R zafs>bX}#kdU?`IrD3d@tu3JdRZCZUkRzgowIu|g4YLM=T)j8}k`M?$>yI~F09qgy5ZoPP z!-)k10&Kw6t^g~L9TzoUw-mJqPDB-9Q90&xE&fnDUlo*)|yu&cE_z}6Dt0{T-2L2dqR z0x`BfEpSOm%W5j?vHiK5e}*(H!BAHnFQ>nY{*n791OI zU<-p|{jr%ZUI4hPVUCWLf5?9+f&eaW5FGZ8AOzroK|y~rA2)!@)#INy9}vOzaL{iV zJOD0Rm>YlmAAuJkfZcz~KrHKm=kK#DSmt>@+z5aRh$wRVHUK~UE} ze+!5&;6H2&Mtm?9mei89ho8g0tRv!5Z$mhRZP5e zS_Em%#o;f)7Ci`(6HymOg8d!BFdEnve!zcP+=y=SG4hfgOfE^|2(4Rad9~J9Nwl`b z4?Y%z5#U$;>h7zM$OPDF!vR}p^B7tKiorR=p%vNQ6td=HCr^iE!&Tjn*&AC7=ImULyug_Y<4c_Y)+I6c)OqGb~4dZbr0wH4Hw{Y<_=Z zk}oJNjuToZ^pVj|XrFR0Y7SA^4PjH#Elu&Dpu#GyD~S^95~*j|4Q;L$msiH^?cG|@ z&HKoJ#geCZJwx%RSeTr;xsKE#c$xK2c@2$L_AHXFLj}B3A7lSueOJpkl>0&Q0gZY} ziKlHy_oMxyHDQLd(-jZ<;6Zq1=Ldg=K?%}3rDCidmpzgtVnO!e5!{$t(8;I6`wW|A zaa9)@PO6Nj5%h6ql1~`0oVtYi15@1}u~t)>WEo`aVk%>X12oIz1Uj5?lXeyfebjv9 zLy{V4inw75;zcupC6$V|RTN02tm#>FGN$WK1L$V!N~#6HeLy1xk!WxYm|m96{!(Ayxf5kRvKGX)%hD%>Wcmj!VG=g=+YZksea4jc znQw*3DS5w%2$7MNk^C6kkLCmTdw4Za(K&S4C2-|=e{xl)%_4-i1o0oqt$%d_0;A_V- z?E>JY1kIU- zvIrq{WLn-DKXvmZt(q1){L7Eshk^&4CAU)tY=XnrZo6wjZ;cx!2Q|xaOLx8i8C~#= zW_E#vSfbgzn3#?@#jEu`Ad{-K_uEoTa%rE$9m_OT(v82RU`Ky{jY7sIIe7%%}ur) zj_T-_>x3c{O9!H70rIE&;cSGl`y?{Udmp(5X84K-3Hf+nrDe1ce9kHuA85qKgSO%P z>v-OW&>0Ity(WJfd3Aa3Th%j#jKJ?Vy=I58#xgf$edo9pRkY>NCAzrRa{LF>r?@6) zCMR2hyOg|%PBG_r(L|qk_Q|8~2;A{C=p-qJZ0K`{T;Or8EJzZvEVpq?owwjV*_4t( zjVA6ZN^d*dfgrqAyE<}MlH#XG@7XPHG*1f?56TYQ<%7n@|0?rA3 zb#HnhXu^L4(Hx;t$7#;oF%_zxy)pgV3mlemcuZ>()=b#Bjdz;3h*Yk%l`Hab;fBQE zth{JinhC7cmVFlTo$%T?EbxpsFr#-;5pqKAU@1pB&*m1CkAm(egqBe_l{MAowe!@g zsb1c8Gws_VR{N6kv(A-7kp|+L3PXZ~4Wp%8YRP{&D7>q&nwp4X+N5IFLM$m&@Eph8 zw;#ZKdvqJ&!Afc!4tOA8Yz{IW>m8DJR_Y06p@n89e2qO>d;%n*K2{FE?mbe7j%+jj z2E2N&cOaBC`;*CVKPFGjKG=ZXBSJi4?YT+LH@+E$=g%lI#v9)}sr;IU4UjmXO`ZkM z&&_{F6K;xGj2A3z(wC=8*d28>FY!2b37dqg+e@-j5oEl+y5qXe)K|`^6FB@v?@qjf z*N1v)7f~!@i8F5v4yU<)a#OInP*iU!hUSPDa=RsCz(Lj1CzGC3uv@kArEd1oAy)ge zh8Bu~_+xoL%a|6Ts$(`Ltt4Ji1&3ei#`b>`!kr>*j~O~bF)vUn7DnTPM_Wd9#I=fj z7ibb9KfxSB(snk;&C0F<6&RyOO>NDHANT7j4WBwuYfZ-EG=@UhTd>cp>XB~)*e~>u zT;_)MADg_3H8UR2_(-cum`LNkazn@cjJn#?ji8weDW>|uBXT3Dyt6;5A2TmWtJi;i zjoE|ql=%5e+QvEjd&e5(msQS_94ly^0>Q0TypN^&JU2c{&_~wo{#4%}63vkM5m5_5^0xV&>}HlP}>u=!-(6P5?zIRzIVifgVk%y4;qa1*0F9bV+~qLM%dS$DdygFFc!o{Q#zY(*Je2iM?QHq8!OO z#2;LV5l7}}_+$7z&oGe}G+-BFg8^s#r|#KuLa6-*+~w=ZZo?Qwu;O&h&F7lU1sLk* zc>OOAlcnNJ!949iDq5TKSaL??Xg#Hzv2_jNU(UXMs$ixo2EXaAgOLeEXs&;#Rt74> z>l)rFIny6GknwdDr9b`d_hj)-_7)0 zLXBu+4J9R5Z^FUYgD086E-oTVk4Y$;p!QLrbM0wL$028Hij<6`FvnRR@y|LAZR!lq zEL`-d-QCqQtejo@N%X*T?u~y_$$V7qJAyJSnxFl6wu2)vb48AC%P3LzUmd}q9989D z*%)+UfghTbd(%-1?9qIBGekf0M!swps~dM|tIB?e>tmu;?KX!New^1#;q}Qfpi%yL zhy69toYg=I*J;+_EoXO5tp#e|Tmb!TnJ~~bC=q(RAaUj@lqglRM{w_W$sS3QMiI>}2GWH3r?Xg82JSq94`qOjZsjxSj7O`t)+KsSjIM zep%P>D|9jWI{n~}t)_qJ02%h9!=KdrK?IGsn8tyU!3DPV37n#re~Ed{;IZ5G)|dM0 zoH-#M4-&07i;pm|59S4Q=*Dmst@1CiB}?fgaAa>QP58mdgMO}KM`~k~deEZmr0Iz= z_{SPFD&461jYj0ak7C+#hQ6ze`-G+_>OjPXi#mc-82cO*-41_76hjXaNlHu)=jxTI z2n4&&-m^E|LwR7gPT0H(_P#7Dk7!~vT&64RB*1E;cu263p{6UT zYSO=q<&rB~wvc6NtM4QqcD_yiz|U(!7=OBd-QdOvd@&hbAiBh`Ei8UD1EgenyN)3) zErniRH$-B3pZR~9lTy4XMYNXH|8AvypNz8Fsmq`m6K%{cWEHFC;gDMAhZU&OQ?0x| z7wG)rDM9_%8K&;0962LUC4+?MeVpKXOmV&Lm|7o;S^QW*PrX=8(SGDB(X9~Hj!0rM z5gQ8TYfhVFXJ*OcC|NhYfb_z~ev(`hV`m$ia{aV?DW-oSgVl$C=95+h3N+?wDWJS^#$*lt-;x^3527lMqM!b>{@{_f_UKI29w%3koYmiM0T2H6 z!B)K4oa}!--lK%R!j~=PYxntga8@{rp?=vUs(70J+a$TKE)7{n+pZK^MH;RS)};aY z)f%ytp(AAw)*IeI%~VorZKO^ZKFDk`Stwdw1)rn!Z;W^zPd z+ew8ZNhh=@764!`n)B(3eVx?cHX9PhOqGLIN_Va@fu4_>27)ojEdKJ3+0WHwQ{1@|nkWM{H_gq_zO;#^=gjcV9veP*i!#s~{lU(~0t!hLq>B< z*Jyu&9Oz1^FPvS#cJ#bj@>4p}DLqwi9!#3Ly#sUoXG)QbZ}kvtN#(&xgZ%PJ%ld0} z6tIhun1WSSbo4$jdUz?e-PMfrtuwRuH^M4LlV=jI>08m8SPdu{>bkoMNmTIYTHott z7dD>N!7=wvP(saZ9mS4L=q_0Bm)MpysU}s;4G7O9)dpV(Y11 zn*e+05WG4I{y@eZBb#+0yV(sfPR&ye`9cx@x&`_gjCmg+Kgux0CqlSv^Y)yOt^Rt8 zo9H6k8Wq%^QFE zT?9>ymIkMaV#)Ck5c$=d-4?1q#9)TeQZtt#Yek30BHUB>wRzDg5Sa<%nw!~%#>JC) zaXV}8bCG|qND}5MKWpeWtjE??yfqs;!#B!x$JAB1%))$bm|o4Z_?V_MZK8=zGxwb? zX*sQ=CFYZoDM*H=tA4n8vWp8?X?X6o%vwZ(bx!t=yDMNw~XluUZIHuI7$-OZ=PS!nK#?tY!gZf6x*dZ1{nMJez! z)LZ;@+?c|E#kU!EiJ)Fojjh-Hg#8c8KG%KBekf%Ov~^?_jj1?quIcdi3>M3)R*$kb zhqY?n;AJKfF2x$9J7^d+alL;{Z}$+}tF%!l;dA}^S(U_WEWMzsSK&q|(mM+0!Q)1q$pI`X)JCOS`CDrol;>QO}OL&H{s+EJFk(GT6|(C-ve_GqI? zK8FoR@?WnM{ZW7IrLKS5zKM5lz>=b=&)ocOK5jtvGv81cSB|UHwkq^A)<^i#XR2aw ziJh%o6zE~32qlcDigmBOYlfvl|`5PYtj}?MQz=L-Q>!*~|`Cj>4DH zA4$ZmJJk|;H1KBL+LOs`N7$rbO=V!*G?GM<&m`HCI9#gK?i8)Sg2(tJvsk z(hcd#G{b*=S3Q4lL#+{{b@Zm<4xMyh%~l4f{?=|hV1X0pq2y_!8iL>K-Jl=86nq~uP~4i(xVQ#BEC zdNj6l^4iCpY37dUV>d6z`cx`9H;jC=6}COHF3)lsJa&IH=I}Ll3lDEZ{2m%G4`uAF zbbI=l2WV*S{j2|g8wMPj8JvDe) z?7v~$nVLNGeJ-2Dj#}IPtX1=fhhMEY6=POUL)2cbHEsCu!HXR^O6)sI9BWVb`RNAX`B)`8y(@CF?)|inF zte67SbS(E<3HEHbWSWR@l?OA7s{jJHM<=^1*n%X8F4=3j1i;M-X|;CvX@sV*+50sX zJ-0OTU(1}}1mKieiS4U1$rcalF|+9j3x^d?k*k0mt1Z8U)8a~(fIG92(|pH>wjt8u zYg&IO5w4xl?UQ4M4BAFsB_?5uS*G?LSg!u`?h!V=;Z^MY1ZNN<`pb_R$cx!zO3~vH zgbzV{ZZB)cMFB6@ev-4k0p9b+TYhhD`mPs(ok^t6gl#fm>nKI(@@)S)3o z6KHlbD#-a?6=oIK-(7U>#WCHXUn7fccq9*<_RopPcSZ$z!YWpny1}$By$8ApUO6r_ zbx2N7D8o7U2atG%e0J)Nj!+WbyPW!kted@}&Lvy7XQ;Sld=KnedrnkF*ol8TvLJso zLZ#)=w9%%DGn&p5ROhU&WD(~}lc2V2)?Xv2%|j~ZT2$pG7#_O!Lsu7)WixdV?v33L zEmv5ffst*I|Hf)Nhky1*z`4EtC=-V(hw2)V(<*PYy19tH(g0E|x{QLW%~uWjW67&C zVw(kWrG9ssOK0Y3hLe*fAFnk$Neq8T5ZPk(;H`6L>rqEmSpm`$7moq@l{qpm-S1*a z4Wr^KT$+oItHV@d3=dJfx6%MYyX&1V-{q$DQi49^pb1bV;KwUP*&I1cQ>Hn@yupYu z7`B@{h)q^RyA7}I7<*SiX8sy$Q^8jrkDNffbx@M#5jHh}Kh7D-<$206pY(rwkB7i8 z`k)8}Gs+h#IUki?WZCUw=->w{gkZG=JmEP@#~feKuOR6xf1nr+HQFOO?cIASxN^(7 zRNOL}f2u;IZoaSL>aXX3O-*S2OZyQscBz(f#S&dwvh9!@r6^1wQuBk=S;>!QJUabA z5ZxJe&3%I}7shoIvi@bBxZHmo>o%btNr!V>Hx7?+c$jIj8ez*3^i0f2A1_ z)RKLT<(dqYLfJn(pj;pyG=ge$Q{W<5ryGm!NQ7{iT%3feKY~3p=#mC4iNI#82N>KY zkZ&{%ty=p1Y(T%E8$ zg1fOMGeqXcdp*B?BMn5CKG~6zfAI{SNWvO19Hi(po{44B^NhRAiJ8;emX?7JpY=Q6 z;M2VtHES^fANoG$`JK|n0Asu-d)x<%>;|SA7G<1*s&SW*b5(3;@$bieqGGc;FIH%8 z^kO1WzRri}mgxM%vAloSJgaJ`t;fF1{;V1?KB7>1RnA<@i#9o4pcVpQ*7`Ll*-0cC zVzj z745yN)H(a(*QmC+_PFjWrthM;{~s@`|1I!8qJT97WC?eLIa*xu}*`lox%4ipiAVdfv4Jc^I!=(U-5SWycQ^6f!g+ZcS6s<4_X#gT6 z1p(wd?Ezsh01=lK5tkMgBjp4X(5}AjNP7niz@xzXvq%Dvb4Iu$ZLC}XEh~%z!WpY! zV}%0r&^AZ}##acCL!kiJ&l4U14B>%r_d?hTkwSkUfGyGn16U*MkuId5pN7<2?9hP3 zpJ7{1*S}I;2zL*xDS!uSk{7^Qv_-q1d;wd89VrNk#`Z#Bo&0Z@`lq7mU8I>))zB zi~nHAFUHQs9q9v@f`!0f2(}RW{`F=4k6ubHHfUR<3w9mE!~rXJcPn2~>|S6=4Dg2l zNEcg#4}kE&8U_iupfT7Z0CpmQfF0VM^yhzNih==_(^i=+UM_TMClZKCswuqt}LNE86+|4rBh0a^VbNdRR1i?EtD ze-i{d4iMru#OgTwhGGB+`5R)DP`@Eo%J~;Uu>M?rL##6THx$MW<2S@Ma{mpnjXZyT zL+ns6zah4f_b(L2D*OJ1SY^LI@Zb9*FOT-|7Zj5O1ck-GKZV2q2{CZse=js}LArS& z)D!_RFc>T$F7Zdy#?u{pbC^H=SL|;7#db*SCL<6&2piIm6KETm2*=F&sInlXqTzA^ zK3sYGhGb}M=V%*Q_+$z$s&qiZjc>5jM*cuH9+^R@^+|Oa@P2d z6)($`9KR-J_+E~d?`K!`qwtN(E%jpun_{@yBXe)c(v6E>VF}cxsKCi z>Q&d38zC+MSI$8hL`T+eiCl+KWx18bh(^zPQ>CZk&kltLIYtvV@=x!gTRneiPKt;N z(tg~%Wc$|8@abm@pwdoAo1BfYVFClk~dtU%! zmR;HII#oILu-N2SoA|0|xk{|M1ci-xT6Ng1Zi_~UV`0=Kw!!Rg0X3`d=@c5EBO!MJQ>7xvtO?^naj7>RDMS9*WHwXz$rG$+4I zOD`c8P>&O}ljxRNp5kmwqSzL~Jh!@+f2Qj~Erog$et&2))q0WhdW>Kv#EFz9ucPGD zXvHv=oWsrDg23*FG8NA$fu0aI)cGhVP?&c0u0)g9$wcnyDlbCt()@nlMJhcN=tAs(=k<+owa>WF;Ou9m zU1YMUA$nfJ`+Ff1aM-&NZL|Kl<4szXFbyJ+QBh{mG!KR^LHGGSiaW~)4J$DiAa(-k z#U(9FjH$VRPm$FG+o-fyVi5u;K|PpSLL}}si(}1qoco{sRw#d5EEc_#IU=%sUQ=&M zF3?q~!*6(Knr-mE6r56SxpNOkn{yy>Bzn|>t9W3*dt|IB>MP%@OlS8UBe{Wb=f#8o zht+g7`%d;jgJl1kCxfgf=aQper5<5r(?I4=cpm9#5UePZ;? zxp2`i;ESuNWo_qYCz~AH@Co0fpC~zEnb+w>#NEz#?nOM8OUrm&MDb@=#(17}T~l3{ zzqPzZrkmZ8S(tS-ndL`D&mGq`1%**~kX=5tAV26k>qUPgec??-|8V1>H)JvGpKV_n zgFiwgq=OSsBMLlBu_@n9sS_H=)tj?Tu3qua2fb?e3?gF8uPm6Cf;`n+Pv?9h(NO=m zZC7>)ZY1x}@-`G%JFxQUam>8;YR~Op%W2|Pf7cJf?^A#xZ*Q7y0{^|m#Dt`@NRDYj zk7C19>4ksCjM83nG=5A?!*na_rsqj#^TCG8Mdnki19zweTa#z{+mmKrrwM7$`&_zl z0+~mu+#=Xwtf7C$4EEKn=}K^|3Ah&4z`oo1vZ6J)A1b@)-~XPVQC9X8Q4uX{&7x5( zr#`?6^^QIF)*B(!mS971eaYMc74-U2+FBN|qhg#y)q6}rPXU+waRG;{w4b7;P3A}IUT&Y(~! zQn`PwDbL)UaRsh<=RT$pWBL}hK&9@eki#9Ve4KA%Qq`?8G>V6JT_y5!{lt`oU%Ht+ z)8(Mp`vA?*RgyL&4?>B(U*p90Od)3%nb1c5m}%+@b6{`R5L_Uo-;ySHX%%!9;ffJs z8CNk@D_Ca@w7(gPiVJGuFu#-rj^6R%eX)PzF`4l6SOh*MdTeW|j zTaI6(7OQiSS1xqM#Gubmb#OpwXB(Nt)}L}p7h1v5e#OTZ^Wh#{OR)W0#508zlsQom9kG4_@<*)Y)CuyDV>2LK`&&sv^))oi)m zOkd(sc9{<4Euq6FBGG=w<3IFQ_FszC-d9dR&^MNs!8G1T);8m`c zny8OtaWuculi(RN*RJtrZ~uPt+J`r^Iw_B#m4~%tekR`dJR12Qv|3_Iv{ip01wz~w zsXro(g&Hk(L=}i*U!{h;wXoO`mlc@x)=EI_ENO6*M3=>{v%btNGI^EOQlM5a@xp@I7Qj8 zm7CI4v%rHhWb7Ny%6SyIaMHBR{mIPo^8Chy+h0T!X7Zh?A56dylrfrXk(48SODf-c zLEJ{16zvz1oASsAuO6+@SD6gyZq-8HHZD-S=R6gd2az^|q2`G&IM08Hl7BJ!LnLB$ z-VY|~Oe{5_)nZZkYK6T-964)KrFfmUPor4{bRx8q_}`mFu{4!swcnk_bb{%S z+A{dISs|s)>%({VW(D3uDEXIyigYqeXEvnh1#jS3H@-QNTz)LNm=5L}m#;I^nS4O3 zGD>2nxXLz3Go<__qcg#*^f~ofZ(esZ!>M&BGyYIZ$d&>%Uy|0j_E+2yib`l`EB?hU zD-))0p(sPVVwrz(t12nBWzwlD1L7oL)~Pf&6Y`Agbrho`5Y?l%B9B84?KBFd+ z1dc+P<$CRb>)`>>JtYvoAZ^TdJ`z)@L<7M^-<~obg8 zvNkB)En@f!Q7-IDd9fIsSW%FcSzaOO;c|3u)eLhG>Q7cu4KW7|b%%-|)Jj=>PUE=W^ zn*4t$k8^|HSo#ejb;bWce)Ivk7b~MR&&g}AAq+-wPQTyy@`KFlPRg80>0guX=C}!h z`85-HnKUY^jDqiuoL;v!`YQB&Bpug!Ei3zxC+;wN=xD4rPgEf}4@J|vZThr&ba_g6 z9^&zF!w>}L+*CQw>GB!m5xQlGy;tNwM<9PLexmdhpmzQ7@}}+-&gnPqa*^^a;`fHx z&p9gEKyOCNWnb<-M+>H%jmvPD97X%S9kmFqq$gULb>FgU&12*k^PbESH=PVIXN{&P zJ0XnQ&L_)C6K7Blm0>w-mz%^4ex|fDhW49-hlOo+03|jz|WA${w$0su;NJ=Tm$UE@6ENvYEk0UFV-t2BiEr#*1sM)iW$( zbUX?0f42LLo^>hER~8=rCVc)<$GxSo!LvY>#JZ=7{H*ti(Y9cviL1@$0g(f(ak`e5 z?6zOi=`ufnP$>J&tjrO=AZCAoI=rNThkX;(kC@WoJscz*4)nV6C^fv7grVx2;7g5y zDkL>(a9GcC;yk>**}QC{=f(4tQo^CEd}XMwz2<6WM`xE?WWIxCBtSo67y69h;d@x; z&@k$mfwFrB{&yD5;u?3x95M63%)MZY_?h;$g=<&g-Z8q`C#FQFlXeSoL=IDOBJm=qzIxA8;+I{BfKPK8LCp%UvKeov!L z>DX+trBZ{2Za$6qh$p{}sv^41<0CT<)7HQ%qZsi&3MRytf-m=q4IVp7;>J%{&^JNZ z5;RSPt?G6Q7FBZ6xD9`cDQN(l%zLU@lwLiM^9A(Wa6jjhrn=eQ=7sMH@1AwR9tk{Z zuPM${LGTTjk!dMhCGfujj$*0N|57m^(zzv*z%4;P)YDnBe0!qfdMVp>Ij>YmbUtwa zPi&AJn(qeTIfTmnn2-3H$Hf)p{x5%GZb&-9T()Idi+8ME z%rb`~ig)7mGqMj6XjUtz1?OD;9>GkMAK~5peYe%X-m}9Ki@sM^xGQhL8y&l8dSdKN zg67!N-4^-o@#;oC8PA_9mepwbnlHQ6N8;Dl@42SjM{hEvJ>dc#8#}|}BHtQkxF$^f zQH*0h`?8^~dQE>1Bu)hnoS#iJB2PXkea)4>E%U(J!NtovpVr6lfoh&&;U;o=1gC?v zu383JvEJ4H1G&@Mi<^myS}ATRST;wEk2>TkESrLtPCTTC0Bv@1TjE)m*R%k*rUhwGSDZ z?VY+?&{617a?`E-9BO6`p#u4RPTB*559Cu-o6?yx>0Nse+{LN1?VPK0BqoM_*Eb$t zs)-5+vhJgiIOza!=A9Z(9Ul+x9k(CQT`kCJ7{AN>N#N0uJ!X>8O~`kS;BFftb}iPG zs(btL(xQJ~JlVq`#YkcaMra>+;VHCZ(Dwpka45EZM=tSk( zY~Bu+6gM8Pjdzs1VULVT-}05)L2aSV$^&e~xWu+Fj9&t$+Cjs5P3lHIsjZ4lY65rd zqWw~gGI5?)zgUpt{F7cff%`mnl81^1Dl5yk<}-hir9+PNaS@ue#~>xuA^DaXzy3^I z_!5_8Buv$Y$4fD$VvA!M`8d$F@LJBL78rG5-;Icz133fz?klaO#J80dztp?K29?uJ zSDki)3w-a4im3?)!iD>1%Lbvu22OS*1oCqo@lZ3r)Q>Pxc9DrA&sxt9VKI>~U&}>B z4~~BX?z0~yZ#3EPda?#4%K~s~b#VFi^wzkVw`iGNs`cZ1NWPckGOUr4@YA0w#V3hu zTT5JFScx~I%Fnc@zxH(?A)QC&aEyP)LSv>TFC#k7qDF0(a&^elkNFk&fB2C8zrg>yRFf>yXbetCM_5x-D??2} zSUHzLY5^Csx6%v)0XLJuJ}G}vc|4Ts-zIB=tc4Tx*bXDc490|#E&HA|6=UYXm@&i5 zV8)*8+tDHWl5APCQ;CozNhMSw6>5+piKy_KocEmbd;9(QzJI-+_j#T_?(6zq_jO;- z_j}7p*_=_4(IRi3?rs7CMLo|OC)B+Hini_yv z00B@{1K=nvq#E;s$N>fB4CN8dV{`94-A?BoFQRw zAe9aS^aupN?#B)aUK@bQ4i^EU>56}xogsA+8WJ>fT0jNJ|Y=GZir9hBO zVTJ+}_F_T-W=JfFNT7cMSkM!qVnt$}1~Rk!Z^Zi9+$exRutNL(u>aAh|0ttBGrGM?gs+!f5dwj@egLU zh>W8Fu5cI}j$jIz?_aC)Kb>`&h#_HdL@z)UsR5wLWHcQDXIiNukw6Fnz!9+^4FGA( zz$!2ziOSppFdGvFc#_DFA5%ph2UPr+gCSvm@Ou=BNm>1kj-vn-r@xUVv*z(PLcrAk z6|aATOfCN3AX9%#_y;010hOSCpeh_tq3yx{Y@WV8i53C}lvR<;e?g!S0162Y`|mOb zBF;YmG&KZ}@Z%`8K+5k1@))10FXTY9A}G)8WFWDg$sBp4&;gR2&Q$XqtBRl#~9UyHZu zg${(AQHgmjIKU?YEzUi|wSrkXcVXXPQGXA=Z$ZNQ7f0v(+K#PE%B;@>c5>XXSU{kz zi7zLzS3aBAUJJ)ZJbe9vCmSm>p9wi%blc(z=*XB!d+_yxF{y;~qHIv~T<*H?&I|FL z=~4U?Uyf!{ktN%Ivp~%mA=T0e8Lj*qxCYyqr>E{_!fJ>*UG24UJ|{q{s;x3!+YVAC z54x3|wFh~lI;5U9%444B8^Ol%2xo2DHh8yEIvn2J>F+%4}1TEu<(^J#e%j>tx9&xgNEf$rHX=*Pu5`SrsP^Rvd z@63Mv*8kBpQbIyCut6YleV^vO7BGEnqhXDn#rB)V&DrX}o`vwErpofy7m9Q;f{hRP z^6_!%So!3gIe&k(^9i(12o*3s5f@jMoX%1-KIzbKMewGr_ny2&NHF;K7JD^k29kn(e`b+xN9;XMpFkI%v&Tg%HvHPXCN!Wb( z&0wa+;NJVG3}M5O9RvB??GuMWGZYd^>^|*A5>z&umQ1>g-zYt~CL1KTRH=odS*^E-EzzVn5jFlDHOdoIU zm9O|i9{%c;&%vzve7WB^em&f;zF|=m9rVx^V_t6Z-EYI?KHpvayA!R+Pi8bG4$7{1 zw4ZfkFv6|{G4Ap}tvs?->>^DEpg?7b@ zY&UAaFPT4z7{woTdsqjuU7Z=7+>kAQ1AmSuy*D7<8`jRh$YYN`r0psjRII)FnJZ45 z6Ek|DUujE+#$im{F%{GFV z;5*PvB44y(`cxS)Y?7nKkwJDjv_URtGqiXlAnIhWuu$Fc>@p0)VfNBuGf(SU!OFuG znN?fH>7eaZ3}o}+l8aHRB>ypyKIM~BC%aEN&SepLAFsl1eX!Jg3nha zxGMc~pW?7gEj{Ms3>MK^-g!VPyY+&|d9#7tGP(KvU-utsE_Xa^;M}v0OkR!?gJ$5Q?5Y z6frOsTM@NrljDP47EeT<8ZrGII3Vo$tSI7aZFj@G!b2t3vyyokP3TPVh-<4Ccn5tt z^ENFK|Csv-z*;U3l$uT$DgIvSeYp~xupCq6dzIAqZ0JLov-LIIVKPO3AZl>fc40Z| zu!U4gvi}4nj(Y3LaNRb>W|i-xYg=xkak27T)B6rfIM4VW^oa{kXM0Q=#uW;Ag>%n<4YFs)b=jJx4j+{>_c0AilitLNKrT->uAE;Ng z6A*0knRfY>SW&a(7bkbIBgr~_#f_1o=EYK%5)6abE(4W`%L1Q54wc~e8H#+ggO6OJ z#T!qP^gkCgDW6JWPf#~I?4gQs68&c0%&u;NBkOC73GwJGRqr@|wLORsD{=iIEv4Q@ zgcPSbj>OI{2g^)2=qgTr$}SucLPTT`t&|6b#aDWF!kZ}J#raTVfv$y_sVqm!#BjPz zTK~Z}h8GjD*=g1s7Txx!cP_4<`c}re&SB32@)^oEYD1qZz4C28V|Deuh%($L@h;`^KK6db*~@7*2KMU9NTSE|uW8|m21d7w1TSV~@VGxbaN+fyOsH|8)M2 zM2Y7*spRvy;{EjClq1|#QhpA)>yxV3fq;)i3C~V2(nELMqlf8-A=gfZzYB({D)n85 zl#%=;n_RUHyzV&IlN{uCm0=i5UuvSC_B2wCC|&QG!#`!&8J5PnZ|qAH*pY2J8GB6O z!P7WNlA`T@p_r|2-}>HMs(nc*jGBht=Zw@>v%44S*qQRH9Tn-$`k+};I>5d=T~!Ln z+EFiKoyZmp+9W33ALtJfeCln!WD4$Aq+Zq=O7KNc+%~9!z0_|;fsof6S>#XT;6v{Po~WYeoy*TcgZU4sQVw58|+ zL*F9n3f9e&82!5yG+gy`-+YCZ;V2F|-#`ZNz4z?!1gR&lr+p;rgwnpw_odr-6lay`$-=c`FNY-S?h;*^1;}7k<`ZX`6CpCYu|w*3OA(xse5JEfVs?_a*9DZnbj?_8#%ibkFM3k4O=a~dFq)pc zX^r_}4)^9S$IAfOh@8`?g2cD7b=#)`Gxa|UzdG$vb}kExx9={rW)m+g6?mdIRrR)! z`>4i{1Pi;N4=i+=e=|s{Mf;}Xq^lTcE=1&iaTJ0F$Pr|9U9lI-_*sy;Y^i)RonLrq za`cWDpBL4RkrzAt-LQ>4=CZbw~Py`?AIu+rJDr0|q`zin6VaQ{L^WZOmn;4FVd z&wbHl%FZ-ogfm;Z^epARP_2XP{ZNjeEhV+)cLl>?Ge+>TZBv@c-7d?``k9z@YZXyO3)7hb_i7#BE@}ESSuf(R_&# z*BdG_?o{Iz(NiE@h%#+{XdfF0ZM)G>kA0Ts-;&2TdyxMM-m?v5a3@!7X3AqWuy!1; z12l$`3e}S~j8>jT87r=FuZdbitKKGmt?`*uLz*I{B~%4mlVuyHW*PCbgm|N{6d_(W z^m%7hg&9V85c@$(;oJ|O+FCnb@*c8wzM3z45wDOGSYl&*K2=DGk?-K-)?TABw`gxt zZ2w5C=o0*Y_(1;O;QxdHh5(|;RFW^6jEDRS))4EKWo~41baG{3Z3<;>WN%`VRO537 zLPkqOS6P$I<7f*)MoUCjSt~C%)g(j+tiX(14LuhNl@)Q|)S zgoG9ZDN+PPiik*)A{_()rAsf;5k#aJdX)|WQUrE%t+jQ3`|_Nt^E=7S{6Fs)<9+5B zWAbnq8Vf1I&<=17G|F2@R9I97psJ^*B?<)Ko`FDe9v)RsIK&%)MyWx(;W7YGX=w?7 zHU|?&pbca`p!Bsq+5{k_0Hb!95XB2nwJF@pgv0;c7r3 zNPsaKihz6j2?LaoNPy9=3@?BY+zamM1BVHdi;4nZ2&gx}0q%rAk&FEDq=j-s10??? z!!YjuIr4#fdf`j~_G$slw3|D|8}13vL&M;nsDFl-hUy^#{IvVip%x=3vs!Azwv*sj*1G}*I!6~3WS;{9A=$JU!tk@82ISZY}@AjtJZ)!{NSg zDEZ_V8Y=t9CAlV|I7mHr_%$)V7i((aqk-n|s#ICwjTu?mQP0{T6Zp-2ns6EyLF6vy!Y`@vKgodnzK-*Qg#m$wn-O1@k=jqq*9J(g$5?wG1oFZVtJiS3oT|r%4_B`;lnH1@3puo zpxPprD(;5Tx>gK>~qHw9oU?m&HT8GW@_1i`g7pjC?hZzkb0@; z!zZx8KLBJR{`|O`!xG|u{Cw40S@F&cg;I2v+egLufcj%SfQ9szVEVD5$6S*j@^3OH zZpp6%_3jD0tLsj%R`DEyS~yrZ|Zo%vmAS2PfNwdmUfgUYN_nR z-v`uaU^35RIdWKM-jt@C1MUlm}Ly<5o(~ z1EXK+QGqz|P2T9%qwCN*xPj`fcaM(H@a8Evugpy{6A4;>noz2e;PBQx&XGYG-_oi< z-o_)CCOZC}bYtnzGbH2l9m(ofaWF+}w&A^_>{I#KPp6n*y1uO^gI^oO^c?jrt&CsT zGdlV--5--Ryra5O|5c&w>3{=akO{P!MQ4sB?;c~I&kOWtG^$c~wy0)hw_uoI8pVoG zN6(V(KkHY29v_Zcs3LYNfPaZ)o!A*~8Di5^L{ZriwOxFQBSc*IGid}gvk zO#z2_^wOdsRy4lp->_WCU+?lY!u8+AJqS{ft|R*vbvj61D>th54!Mel5@9}%(*|5Wri zdq59=`C5q?7Wo(z6hC7JYE%~Ou&6#74Q9tI6On)`3s-6<^g?pIxx|h|Z}6&YyVDB_ z986{k>lk^xddQ>;>$iVb#~*2*1hsi&4rT_vzm3^#8DKZs#7RDcNZoBXieox|H z$Zdn$pu)7a%=Ddr%&~U7gW1%>7NiR!nr~88vUwr*B~1qJ6pfd}>Ofv_2CQ)8B|!tN z#^RO%;?@-TXlKdX^I0+{oZyZYAVDpp!C`ru!7}1>P7IB z7S{I8gTrl7ozwa~q3Hdu50QB~u7FK{k&gKdA7cRia5>3Y8C+h#>Mx!AZ{e2DP; zdje;ev=4-|J=j?^-ze*+gIJv{jnI(0e9ScN3S`7?4zk3B5W0#m?dh;}J6j;4uUcu|og|)^8V|!&IsX2mN9cYGwN;e5A2#;g0 zXflJiORn&yZFRC5qjL9Hz( zH^kN!0_NW21hVD24=_Ad2QYcC);?Fhaq2J>7?mHP7hn&S-8Sy(BZ=Y6ze`8Q)P64T zNbDFBwD9JjLS>UVh&#t1yPNGjJJ(|!#s)fLdY+ZtPbWc2a0ZSOzoKz}i@a#gm?{T) z^1U33g$ijkC*pY+_@+Tch>s(_BjGeNv0YJa{QJY!x;blToL3GDoh$myj!3D93agL) zWaE6x*sIJZ9ol1%q-Xg}Qr6S=N_BKR^on)`i=Rgpa)2p*D9o4T0QKwdTz$Vpd+6g5 zmURV78NZSdq4&a&K|ry8jbTY&LXt7f>&C%L$5hjU7HnZ9gX0l@kV1S4RJv^Zu9a}3 zw_x%s(L&4Z7DFc3_qP(bkY_#Nsu#sb0Lj$(QPa zz16@@>v*khqj#%knEt-FOI)~eY3BRXZ|PSx9r>r;%kJe&eLR9d#aIOcme;%ag3*0AU{iVVei% zO|e`&_}6N@OF{#!pt6NceQ)m zEOv3xcG0(Ld@`{wB5PK?{NU8u4p2=&N=s^|IkZ#y4E8a9D^;x^@0NjwZtNvmwUMds zgpsqk^OA9gw=#wmzj)`Kwm{8idT&CG^GK%T5M|zXzEQqYn$~vt*{%fl2zjf94^?Wi zsD@N(crepC6Iu5!?dlkZ8dJ7kI{qM(E9S|;G?31m&D%BJU-W3H4|#pk&hlgLko-}` zrazy{g$Ck(-W<5|yCNtsTpX=rNAoRc?|b{v)x^XrW*Oyt>5Lw_qU8sPW>u zif9UO@A(|P!A0j*C|o?(5?YWbM$LTH|0pNlzB4?)lO+3f~tvi<%!7uADXsS`;bQ&vrQl9etb@Eb#! zI#rT?r#db49;CG2)^C_M4iZ7eerCG&h*oe5>s~O{8f$=woHl{SnTL3J<{XAkxbdlc zp1NFMI9TzbEG(9B-{gE13GR@4di~1T0GmrON8(X8GM?T1bK2*=>=NUMpBx>i36Kf6 zX3jLYU0$nvVE1{M!k4+e`D@YgPHdthDq;wKE`!?lss1WqhkUxAE#_?nzm3qhOk}V1 zRVW^5@h|6EFL8$EWBA{qZ~KWE$e+vjJ#sSf=c`T7#E-0AQ<+w=wM(BIoN=Q_W0^P7 zLe8!Fk=Q8Thp^Ho1sbho``bL4DP<2#40e7Zm3z39Na`CZzRvK>t9T8>&tR&sbPV@@ z?3H-dy=^P0ZO+X;H=3zce*?)7rjG>cN^5a8Ev%hB5Km0s=bN3<#}}j=wUIGTJ-K9Il91e_A}4J=o2sNmoSJOE|H%Jx^V?qN?qtXVXJVLqEoVZW=Enm V z1%7rVB0dI|W04X%VF#kKDZ)cyAiDnaO29E_k5i z-uJil_qAL#T~bbb5PjC3gw<|pOG&HkZsR-&-_RT>6(|UJ$&XnS<`5oN+LrErJ?B8% zCe_y0a_^pCDHGC5A|airoZuQ>x6z=V0XJTgf%E!Df1VEys#Mv1V`-$0eOs&Rv3kVSK$ zUdtao(i2k_(y6}gwIRXQ9n$K5Li6!vwIO9$=a9q|hZ8<2_!Mo20r{?9$rXYcT28%XUO9Iiy9(qq+H$=-5t%6@%Z5$C$Rlc?UyHNW|JwBA`s z>%!70=(MGks_=TTIep?bHn;Zb(+%5&Qv0dwu+sQ7b&0V1Yw5`{DxJB1@?1#~Y>?}O zMP@V4oJ0ei0ZBD+Qt)d|?2%Z(qbgC|bya*>8_gUFJi<$rr&N>bb^?&=*Ak>6d{;3S zTIivoil~}|^sAYdOj)C`#;I@Da`A}VUS*a1JoDi-*YsToz)6jlIfd?E zy!f_jp$}em0kuvY_>^^jTBWi34L9MZ@%txYjtNv@c6n8U3BxrAp@!%c3#P}`mETuO z364T^uX3{Pr$Kx-%lY&tJK~Ucy9n|bVjkQ?8_j1wQn;_8?ltqo^D`UK8^HkT z4awAC12o!fJi+~cWvoDcfqqNXk9>1*tQp5(|BzjmMMLP<5(^r=vRnNgSDZiL*C#Iv z_J(jQ=2D-?Gv?eYdtLV|iJv0@Q;5!J7w9o;h`Wf6YSt!9xeRwM0QqJDNNnx|z1OST z384oqsi|by#+gK+M%tR1vX%s|6T06WBb%RRS<@R=2y(lBhf3d6fj@SiE-dOECR*5N z>Ti7C&)uL#*i>R2`k=Oi#Nkm(#r7fXMQgzrzGOmT=-R4+9KYaeLcwGaW{HuU51i?1 zp~H4MhQV^_6#A0xdlSz$=m{sc{64I_{ucR2-F8g$I4p2N~J@#{j{$fUd@>qXLb z6YU*$bA4rhn#wXQqADRrml|BElxIw`vrGX~PdhM_2a|qgXb|LT5PQsoIdSe!&XJ=&BFTTq^65^ zi&i&pV?pKNl)b{SdDhD1)paper~votqq9VNw4r8yB0nlgVF@LDB)I`{FZF*UGT5^` z{F1Y_w{yGwGVWPp7ZG^pg^EyiV)JIg`1Qp z;AWA3ngN7^ziww}@3>!gk~6Vi%R5359^KuDH&|aZ$z|a$awVsZXE42jreU1@lsMU{ zl>44x=GutnLd(qz&VzN?@vFzt1ax#_bWeA8xY^3ZL#}DK95pwMQS=kT>K@i5%cUGE z<(76(zjQ=X1s3vH%vZsMDeLqp#Z|LFPYd9G2`fVHKsUMZ0g2jhCk6`(e#102d$x;N zgPWWe&r{P3XFKCEwqo9_at}|&!&!`jjOMa3?ps!_(8Yf<-E0V{x6pSXRF=?vkuB#5 zt!K8iF^l)uQT0;>n0hg?b6$Px_;K`cb5FAc;>hrwwxzNpgRr->wmZ>}DM*Eor@GmH z(GqQ5#KeRAm4xFgTf4Lg#X+Zjfi)_XRsmB5x?8oc871nlSmTT%a=w(S!6$(iVu?93 z@3ea5vMx6*1deq^*QFzAMC!jryxOayXpZ1WhFWmhE?WLvXI&Nx;I|2WCZTeRUamWJ zMMqk_w^lNiE7IUuAdkSwxtneob`~UmrgX&_t5aA;FU^*isD0;*n|DMdB&J(cpncIs zZ{9vWZkO1=Yy5$m4Q9UIB>j^#`;VODx=asR%G&+wfULoA?V+93GT}%4Imk2OAW*Gr z;NsoXNKYRLAI{mJTuoPD(aKllmd)2RnvtH(9zFUWKjx}w0IdROnAGddBqptYME8hC zpHeY~Xyw3ogDalb>*OuSWHMj#3&Cg6jUyxX3S0iRSinFcLC9|4XSKT4_a$p$<3L!q zvn=3nKC^khYDSg8NQvXetuC`ft~xSU)AYA-&R~T)(2t3kija`RjY8c7&TvSGf4EBc zi<|HTC$vjspii%%^?XDw(Yqpl&mv_t4r^nN8}(tBuhOm?A403nAG|xO4I_ASM@x{3 zrjKW1u!lY3joVBEQ4rnD0LngUV=g@!#J6K$zE_Zy-qdWlR%-2A+oK{s1@+e=j<*aZ zeoA9{=_kz#w3{H-L#5YUF-xgydqM})X@k8NZLZ8O^HkB9ly_r>4cJ_NU85zDhf<21 zxwW7%^2`Z#qvjf`;tu&ePlUaVc^-H76!DwL01(xl<^~2hT|k% z&HcyK1Th|To2|6k(@)BOpHa|Q4h)Md)9n<;c%)RCtgt23V^U)6=CM9o&#I0`7KN@K z-e9#V&As1T>QV;wXEkFSqHuMP&g!kM%(Bk<+NwH!p7)`Zmu8}I$c6V?Ts#xmr9wt< z)aJTSwO7T`N6ERuiJbte)THmv7gEtzNUB=0Jh*DI#DN!mC%3-@jxkS0t zuCa+IluL;0RA{6+E8U*m{_~u_&U4oKXMNxM{@&mFeDAk(m)ScJ&0)SbV#DVNi699y z0W6tL?jQvKNfd&vt|f**LX>~cvx0<(2>{aRAYd-?0YEB1p_v#^OsF)1E?~*`55iC% zju2RBx#}~C2AKOH7|Mcp022~&5IN{4fP9v3T#j@0^6fP76)KMTmdrGM|kkhR`Bsn86jIU8C#v5 z^}psi1=>R>Pv{)vj{tv^AMB|b{88gm!cZ~bNg+`vAWp>JZ(rMgy3Cr#;=?G<2QZ)- z0T6~kK?Hn*@QMnAfB?#a5ix*>amQp5k1xcJ0QhKj18hD<_#7(*Ap4;_k>GQ8ssRFI ze>^Kb%tCnh2od-@Vt`XcTp{X@U;Uj;1IS2#2;Bv75gwlXcP@Xf%S8kN9K&<|)-}Y% zaf|#w*qi%hLB1hWLx9Xfe5Mv&z=Z^y?+D!(AhWrAKE_4ZKlpU|*Y4kCK#CDS_J**j z#y>-`u;7bBhz4|kNH@ZV1cF8YjYi%5ccKdq4Gc<}q{I?o7(S1wzX1>Y zTg^uCB|#7|!XkgPHuG6)qkK;lMqdfDz9`9@NtTz^UL9ziRpC|~mW0B)ov0}e%Y1~F zUZi#v#8;{9Y*@6Jwf2NEmcKa8?vU5p3(DCAvFFp>jzmz)NspY=f+Ay2Dt^@e79JPN#ygr77U+LDCg?3!r?qCxYL`(}3u^Cc z)OuYUeyV02Yxs{gTZX-wz$W&W2KIUd@3+uc4`DldS3`ro!*lb>rv9$LMeyXjt%u4z z#Y39=m&fRiR6C`MM`Ob@LR#wmXQ}a~CRb|)A5P&(Gg<~=W7eAlPcGJgDJmE{Se;OFdl8nsqg_8rDMmQ#mb2K2*@P2qa$759sbOFq&74$&{JaCUPrc>)w2~9IR;TPX^*n#6a$8f+(4ccitte@t#-aCj^M#wg#2Lud7LxMoDv{LkA{gc*}tOSdguL%j~fFJdG6_ zx;B|Ia#ameQ&>61F>&c<{Zx888}-a!=yxMVX|HrJM`A&Mw(Vs&-wIT=tPgcc@Jlax zRkB@nz0LRsjlgPgW%0f7gK*%723dctd$aGn_HFX%++Hf>hq*#wf;ou~u7M@JtIIb9uyxWRWwwELt`0Z_S)3A#gbYi)$n?Bx#s{4bjyEWRn3iz!cvo#XSUk!T1?iL^;uQW|7u6w6U*ZWw98Hx z0v9Q>%RU`@B!9@f@m**tdUFL;X%(-+^y0LF+Uo4tRKdaI`&znC^X`LgHzvAzqT z$H%h0?!48uc;e==NeEVw*jCSyN-_fyEWCBD{N}zVEi(C_b42t}h0K2&eo;dq3nkIj z@zy#sJa45LhL=p%$@qpWDSWRKH2BC!BO8bw>1wfkBy+Q8&pB<0T$6+aT^~3N-A797n?4>(YPacZe#OX0Ey&?_?ea zKjl=k2<3?Oy~!(24G6*CWM3UnwYw(vsN~pOIF}%oX&y@rXl^XrdT-E|Y-hsCDD$kH zIPYM=9$9|#XveYok?J1z`n3ZmCt^4D9%{`~Zdm^&Ff{`xWwr(O@TT3T<#uC4vxRD# z3kvs{6Fc+e;OQl+18?kF@Q@^s+-Fk$!-w#Hf&U2s78ijqA>R+eb`t&#Z&u^`m%$7H zfd)lQNl#Q%mq-l(X$?h9Nl#Q%D??3FSurq^LF5{@*bM=h1O_N4qok$9w|5c&PA3H2 zBfvP9$vFXn21`grOjJ~tQ91!>21`grOjK02z&ZiS1qMqk6=PLBmykdK!G8ew^!_1n zgs}c^LhLj9O$e9f|B!^>?=!oDoPQq~F`j%5zX`Dk_?r-7j{lGVKSIsv4@4LP{egcS z@edRN@VWefh@QLtfr#US|3HMS`yYtV_4thf2wl%V5TOhC0};Aje;`5#`UfI}y#GK% zqhWs_;_&c45TWb)8wC+U{(pbtf1h+kMTlP@kB}&UM-XxQ0{mk905K8%p#OWJi6{6e z9HgO)7!ZDbF^PW-yCWP51$n~${%b+JqJOh981d#nAU}{J_QEX0Q7Xdibz@X{uu9Q* z1v)3PqDxbfZe8b88&3HAD`fY#U$mZbu6{7TuFQIjzl*+0?|Vz_9e?}jnZbzaY3S3W zjG6mgAN$>`fEH@=?^!zjJ6?=G!jA}A8>cUhMUeF-SBJ_|EsFbczkNP>qtC8vyoa&O zfYfE>Q{R;xAu49Bn&oa19r=M(h{2FB<7xQ|;pi1#!qjB6m9g+(w`j~}uB9``CphtS z5oSTkz4gVxq`Vbb&VP)kjpyjhoa?NIyQ{;?ICU;z`naNm?3RzW*VQ?Ea^pgctVtQ3 z(=s_J4x%c}Ovy7}HmIJ}=LYkJEl)=dz47JVW^AQ}hF7~-fz(S6k-%l)$Fvo)^m(K3 zsM#@W;J{++oB+4A6zQ|Xiw9b=jvPCn5JUk|aZ@NYVVpMNd4^PR^^%03;3 zbXz|)*7lHOMTp=KkPKQ%prRkZ8xgk`l$&%Xl0u_;F%ZiDGWT=ER(8H7l$T*{eND=# z(X7}NvOQ@&IDehUFmC3@lLQnX3&$zSM5*ih{(S{mNea&^vook|({=pes{#1axQzOT zZ|2p&d6zh#M}N_|At`s}$8_0WcCiz*&9zeo4A|t`-F=qxd5sFt6dP$kQO5bnNe`(( zx*JUVRPIEP+d~&!$OkY})!)GNHACyVTJ$s*0DFl(9)Gy4py~M9fMpVTJum08OZf0p zl%J&C(8C-rU4e=`{UO!D632*vv{ESxktrFod+N&Lq07_t7H*$_Ueb?~AT zQu5bSJh1}f6y82vtd@w|;>sZ2H({U7SS1UUYlAxvlV~sk(DS|W`IRDu>`K+Yqw7^? z1t?7)Du4P@v?=KMfCL^tvF}lP<}BELFaEkAj*`udpOUrv-FNsCQEy6L?rZ>!M*V_F z8EYUKErdM0@m=v^?`55Ske6VE6Lux>mQwLS+n7QQS}BA0iw~9;n<*8e3vb){6C4(4 z6tzL9!xWJ}fX#k~>-}ZHn&nJRy|DP#*|hzGr+<$Wo_A}CXO<_^$J-SFC#&^d_~&Jk zt-4*LJ=)5Rd`2Us?ki=yh0|#@wQHYc9iP4E!&0e6$g5@ke$e0u4Px}Zam!>mEkx9$ zsy}_|7#PUZo&JpJTJCi|-5U#o#8^V32j$y*ZCl6l^gx{+LMBKf@ODx9y9sDvg_YFb zzJDY(MfT}hI9jEDLs=uAe&N{!KDz5q{jCj@$ih@{J^gw;zt0LiutXb*RT;r!Vu7OO zqqy#969-b!55WpyV7>c+GMi|Q`)_l(5}9%xm*V_B(T3S6rqr{s=;-W0@2f4}Mi4Jh zCe;9A@VBkr*>rZR7|CJ=QD8lKTqQXv6n~G>8dhxZjJH1I$Ut(Ovo2lT&gXT8mSy(F zO>mxuCbdEwxBN4tn8PAN5%*|&yQqgrJ92b(r_`|xdQ2|sR>zS=L(_`-cZVyb%=#9K z?CTed&e%<=FV8+ta>f4SzWzZGpuNW4xm5rn=lYiN_$N2-@Vd;qIjNd+#vs!941Y7s zlnwOfHltVI?)lq|E^9`^M=CPRliU7+aTFf&C1Foy3?BeeyTWKy-n*kw^0?0{?WHF= z%5Q_8-MuX7P2D(TAV05Dk@&2uyPV%SkLCPqR1KtW`pQgk>H^pdNGdZ>MsIFIq9$z_9F9K!Hb(lzH%e}~f}6oi<|_G9$q!P@N>@H_ ztIBj8`n@pF$6xJFCN;z3^Wsg|1Gls!7W{qq{NIFuk{H)u;z?}zvnS7Cw|}jnlj$Uc z-BBVyY-YlyisaBQ2^W=*l_Im63e8_iIT6?Bj%w2yDv}hFU${kO%%@rW4BTTdwLB5p zEEzpDXtiXv+j{v@TcvAe>?9Wheeu0pUaC|a%zs^Oj<9)ly5BW&MKDY%7$s8Z6&06r zF~?_qW7Uax|LyQ6opr&bq<@_55q*bQpIaSp!WMnopC4hQ_F?TBW$jdTR&cPfqph00 zabCa@3Ob5Xg_*Qx-CDG>tqV%z5gCUTtdC86zbh3N8ICBf7EYIo)9GE4+d_TJ+U2JBl6=Io`uwk*JRGMI zJZ7_7csPs_mG-;YNxncUj8{yPL{BB0uKlas-DtT+06Vh$*`$%(;`pdw63$-ZbboiSaPo7qYZ=5F|9z?B zV>70hVl|Sf-qzmJ=O5`Mr{QyKSLiA?KJ(1&+-Xa6qC*2Be%wCdg+CmDKfJO|Ei*iX z7$^ySf=Cr&BG?uf)T6iRo8Y#{C|3lu=UkI7SVP&PpAHB&0mZ6`DX%@s3rb{qAJLUQ zQgj=)AN;YjC4cNs63TviV;qK_^N8XX`r6$lkLsaVfCfv5$59E}Izm#2(Q82B&1C zTZs|+rMgK+hJtdxaCdcM>Y?$9o4U98`OX|3(*^jEB<$$l=q0l19S;0$=d8DID5Vu{ z75Njdwf}YpV*A=bHWk}X$8au4Q1kdY zXFUsS@P3D*%!Ow`yTX3beb>^&NFSj$sGsXRDeLp$GY58&ilpq&&cNkXM)&67Set9( ziJOL++_w&#AuCgREEsB0{t|8(4r@|OR*?ZzglP^krV}=)CR_HHPO#fA0RV68BgY1a zo_}DAc)x$Wuw5(YXd6*p^HpmuQEre{Z5j;ooTI>X3AWWGJSA)lm%P5i$L<0YZzrA) z$Q1Uip|G@%F@)FNCV$7$c*>f0Pz}lBpTu~PM-N<=b+TeHyHuk0-vCeF?KMWZFk51A z&t7Fn`E;|P;`0Z@I2eDB6Dq~B#5~sr4=pDz<;kg zi+)#5LM_4m1~0%a=eh2+aR6O!+!#h`8<~EjiOC`ZUJ9Ffs}1HP9af=N3!4Sco|HY4 z#IA6R^r^%rr^!dyH)YRr+jxrDxU0TLQI{#%d1-9n04`)-AA+TfYH#!QfP4Hod>tc3 z78%y@=Tp548s#@P=H#cFgno0v<$uN(3`asJsdvu-at(*IW*=yLVA6-q9dpQ`S6K`Y z+J_i8nl-5f_@%#Cm=qc5QIF4fhd$8Cv)G|KNk-X}(6_Jk1xAehQR^G0!ebALnv2V5 z7On}8q=VJoj>n8KpOH-p7butq3J$6F)R=fbsUC1vZVl~d^jKFalAsw?<$r36cM%mT ze$-R~toFnN%OAwJ^WNrW8M)=sszLf7Ee`}T1d~^%zO#mo_IRE+(-Tu0yJ)PsW1Wd{ zbGg`$WT&&pQ(`Gr&zkIflS$~cBeYn0Y#kfltye_v6VOrSdL z?_Sf+ZW@L8Y~IgrxqtFLGsRl-6BiXhqUF61C0YvjI(Zr2VrdNPI63S55&_;&b;3m@ zr71rv?p=^`hI(P&tnVKj2TD(>R@>sT4@nSSKHVYQ8?#%&|hAI9K$1{ju_K+VBuc zHQ9!9Rs*)~JU>CEuJo5AkwYynh5p)ue3TAT`s())f)Da5@dHLd`*oH9k zzSo)GEU~9nc_KEyc!{%dwyeB?QxvWIrih8tx?f?9c5NOOo`F|WbfK@A@SzD62zs_% zaEiZ2xnnNwd@q;+HR?I
  • x{a%hp8x8_F>=q3~flU>NTR&nC+jRpvqv9flBPPm_c z<9!^zm_$M~G=D*!@~Utw-Suq`!E&>Mh&Vxj{Xo;QEl-Ybef9}Q4_<>C_4VHSA?qZRbB3nZ{q#AjTv?t$lOJ!D~w-(Gc!_d`ZFN-DSFv&w)bPjj&1KI8Fb_&8{c&gll zIyyM&Eoe*wiLf=SdktOKXvTh_4ZH9yjOgJAEYP(acSlLKY$C<$PGDu>9rhiH)T`yX zxdyM=Ro*&fW`ELK)o)ShM5Sr=-#-XfYJbuhQNBdaJU~jp>b<%eZJ|)bxnRaDfkhOm zOEwGahe}CSPC!#{k(H<-W7m)Kw(?`#N`YxbO6@g`#%I3r@9}08!nlviuO3ITwGS1t zl_fl?UIisoUnj@C0EIw$zqpL!f_1$1B`5Hg1re2P<)~C1##@Ym zH4SR*H2y@CM)44*K7lDcD;9zTnnKRw;;Qf-#4C#O5Dd)hSzR$2-J{C=;EVBw-~4`W zKD@8uUOjWI22QV*Y&G;Gqik~+fAyBRVB&vzT3mV@%ct<1`GYD6Lz+BY7`&9Cm?>1C z1bd^3gl3!L;HAI}yIGYUCxr|^?Se(RDxf%b!IinDj_vqr#K*hsRh*uHoNKAyTQHbdtW)bCerR)J?2QIp18#HBAS zlMdLK-03*98Pl$BdDaJ_D`L5QJ0EprhmVD?nQZ$6`@L7%3NAb^laKA9dE53juJ6{U zAT2`dy?)MvmGIhBiZ@Gp>;9#)?BIWOTw7se(d?1RwEInVsBg1&$i%+4(|qO1X5NAQ26ZCx+6>n?R=CS+E{GeoP|L z9?)cW!Ln;Gs%!c3fX6FWIt8AIGN{~s^^r(fP%{a zAe`}O8}=*r+#mYA^)3PwXG$s6{ZE&_1ih%VOs715=I4v$VurfJlpGs!4UUnp&NC2s*vKhnoFKpOpNS`!t@h^Y+zSW56;eypA$||fOnyg`0U z8YJ@*RbpC|Axce^xXU}*L^swoN{}ua8YXF!KM_l4i7)C{eD2_0dwy9hD$7X~Xu=`ez2(;a_w>q3p1&grOlL76&r zcTAY`%@#pZQEm46(|{*3IQwMGCpg|(Wb*k!M(ac}6LO-8eO%I%Z{ID-M47DXia8>? zgWm6Unhk85;1U|;=x#De4U)y4?OXU=P#@L}b99X{C?q|fAap-Z@?BnI4*kgHwb5Bs zNXYd@^T1AqPR4(Ake_ANQ^(gvn(#S}v$bbeVbn}gv)WL=6VU{iF zFahdt#a)V47T<+!r4KGuEN2XPgz0)Q4dIonKJSeN8}hKAW%6Hx&%-dEjLx4CH@Qoi zxwA-?F9z;2_>mOKhKM@a{;+Ts=?bm8c_NckKPB2@6moyTS%TA0h2xfMgL?UdS|}zd z3BtS+%ivFa67W!cl{b{A4L9>nO%-xuN@n%MxtUOQ&;5QEC38cB@+;C#+#>c3;YaNq zvE)<@%z6zbHef5Bs$eOMCTC)rC-VypbW0T}(IUp)fXM8*mgwGcC%vFpgaIxiD)#4Pz56eB+CK8TqIPEOp4$^64ewl%U~a-% z-}rHP6&bDxwEIETpK*_of6ltJc#+rnQv^Lt_ZNRKGr63~DV>=zq-DjE>5WnAK11H7 zBa&JaTgvYrE9va5)bTkYbR*@bQ1b8OKF!xWP#;Xx+DQJmR`61b1j|!Frj2JE5+I*T zso5`Rhii&9#>pQD=vt9{peGg5b{bXb#&F+$f89^9K}qc92C+&&7e4bj&wP1WcQ z@$i4Rf6I_O*5)N7S<8%R=OI)Ws!9E>x`tU?{QKe@?Th2$x8$r`Ry;yB=XY;+d_$r? z6`kOf;Y%ZJ8+Vl$XW|URlFp_Tv7GnW(pV>`M5;~6kFQ&YU|D`?w-oE!!2~60-s`cC zW*!d&hh8+B04sD~;1sd{aI4LAPz>cKv~7P8jN(Z%TBm;X&M$mHe>LzEvixr90I{|| zVFEsA%_Y5f-syU7Z+Pc}F)Z#faqZ|i2}9JAAR^TtJ=xH`ojr>&saLHK}{V+iLYmPhVHL}B1?a5%5^LV?Q=X~xn3Ns5?&COH5+k{Y|D6M``bsH zKAxH7OlzkqbNIo#pGcd&>eK=iM>ddw#lmt&^o$GF;-gVk5n0helbF8lxyty#s4Qil zd|fe~w9tMc9kuAC9Cih*!~L*W{rLYMKiL0U;D1B`M|Y3|6bA8dfIh+gFHHl2&1#n( zTmgaxT1!P#Mo*WfTmfebT1!P#Mo%k4O;R|Q;imx@w=i7+q5}aqlfgbIm;7J>8h^A& zYBy#U#>}i?%?w7GO7PORrZD|MdnUxz#~NTQ02^0N698*~L1}5(z#xfDWkR+j zHfRB0&CRiZH75`-!~j?m3nOz2jDI0Y3$S5^aA9g-5F603(Ondo0@e%=rjkhz;7Vc# zfegfhOrir`OfnT@a}5A%Ivwy_Ji!7yK^6#yffNH277I|QWH#Ur22vpudNGd^6u<;b zzt9v;$k$RB2(yq-fDRH;7eFFXm=K){P{05b+Kq|y0+A$tMW}Dh?KyP18-IzhXphY3 zPgN3wO6UHo&SZpe*dPqJGASSoeJk|_zeIBdDO3*Q+o}_rM5mIip+GtaV7^dPmOV8B zq!6fVau5(eqO-sy9)u|0hCs%)6aj7P;^VuQsJC>ROC_qLe>Fi0+3*s#6=-{fgl`k1Pf3h3K#)^5lCLN z0mNh@M*w6bM}Yt)j9R=*V{-t_guq2|3F9yTnjOyk17i^!1cU#fFa*#6Ob)z6{Q0-> zcxJ>AePlQF4G}La*4zj%#bJ*Aw{Ras4dsANwn#e+#?;Jwi6wJj7=MJ=OM8Zl^eYaa zA{PLH5g-}W+r=bX#s#OB{#3xT%M}*N?vTO#a?_o^mIn&{7Bg0k<7@uYCi8XUAZqpwoS*5D^!+tOuoiR zxwk(R6r}FYYsj8x9DmOt=-3iRSN3mRR(BxmPF+@dWTRjysLJJa% zPl&=5Q_sqX+G2UZC*;cY`ra|CI7*USxr-_Dev>cT|8YQt-)V9XYVGU}>SEA?NT(7V z^^Ctu%uUX^TQMiO#z$KTjY_poXFwgh`6(n5yK>F5osR}pqkryX^9*A8JK_a7M^zVQ ze#C#@#%mq+t0`-G5Vh^1x-lW5J!y~NlT1tfJV8scMz*;@Tzmf$Pw+-rH1Lb@u*_s= zqsYLKc z6h3z+toN8{d4D~KnjUn2=jX2UVJ`1zZ_BR8S4kT@q>gGTtFL;a=pqXcJ(maNNp_LV zD(LTAb`Mp&e}&V9hI+c3{KE$|77mBaQ=0yH&-%g@w!?1nHY;QC?y?sQtpz@3$u z{ZVccEa@3DIZ?rs$CO(0blN`IOk2T?xGU=z8FIVCK7X2Ph}RtH?E9Cz=Rz#n&ctjM z=BMXRMVGD^7N=hORC6YORd6(;)a_w_NkMFS`wn)BL78zd-}%r>FTt+pLbCImPGL%7 zi1U-A`@i8ln&4`amDC`3%bp^?}vh-GBmYmTv z&;WY|79#t#0oIJiUnb&^G)1<%0GPc-LxZUj&PZ;N029yn% zD}P1Gc_&gdhs^hpftpMw$+>$_dM22G-+K z^K2518-#7W))8{M^9&8c(o_&MpL{W`w4tWFF>?dWUCEEWC;Sc8B5mZN>g8odk4>I- zs3$Lf*+Y{wjP%z>hNYsP3C`!JIb%xvqkn~U5ANY+ucz`~y^SE8AXgXE)~vN_zR~H+ z*48K~y>_Sf$k|G0>^=BwAmKF5dSp+|GYDk4&k!WANMlT%yK z1U2Px>-x!}rUd5Q51&2k*9XUIb?0F2HHY@)uJLH-43vy?n%~X9FNZRYDbvR^qJLsy zr0bkKR{m;O%3o2kZ`i+HhH!4Mel4xHq$2I@^PLM#IBnwu%Etvv)U$=bF#$*-ZH? zpI(tPGSevW>PwEGd7>2@^kq~yPk&BC?{vhf>SnKnM3v)jhZ3jWWJ-cCkx6^U;(ZPc z8hO<>t`0Nxcb#`^e>$!Hm>cJ_bFM1^AM99^dhTjhyJ*bH!r!G#9q&Dp-yh-ZYZ;lB zVE2d^UvF!Fr#NeK>@@+T3IZlCZ$t($6g)&U#!x_Q ze*meag#-+!{s0OAAT_krw6sx3m^@$vk?3T+e*gtgG=hH>X#xg8AQ_Lv5CJO;B>)U! z*T7;3fCGfZgA}?7U_c-M_FprO0`}lhkW2${DljAxz~QkJz!&t#6Je@f{g@N|AVBjw zjiZwO4ADUHQMM^Sk!=zVur1;sB7qLze?UK&sx`#!1+ty|H%$Fp+>}ZnSYv{|mS@lC zA5lyYo$P0P&r|A2r2? zf;d||1seePVF*XTZ#+oE{cM6gwr>_xZ5@rQtjzX&+vc~BEe21dIMPW!ihk98f5XVX zFncy+d??_KP(dJ&Y$5yo^UL$6RwhI&gu@fr=b)|uV8~<)9mc*3Hc|(|kpP~E1498Y zlcm{<7*_OGB$=hSY5s;A{R{8aIc*+~bQWc}<+oq>ba(oa zt)j8xYpxg494+p&>Xz(y4NX^52Ei%uc;#+2Y5VQxf{T*SiNhh=GtxH?_r^s9CUV#A zc|Hr>qW-#anLGE)y2oN|e@6q8MQELUdkr;*p7vRfoG{O?O!`OamHi1 zpO3GMbUP``L{d!jzS*@AgVSBlQ!r@nhom(`+dOs9;MA~*89dLf>a)bPh@{wkhOuh{ z+m+tTtdHQ#Tmn~wr4;gGcNKL!ML6%kPli?|%*iUwU5o!HtUD=?e{(<~IM2MeWyMh) z4^w(}YSfE~X5NLP6AMkes%q(v zs~b%-_EgC2JGeCpq7t#Es%rTR|M@Y_C zLv*EYDQ`)>j_>p{ExP+P!g`jowr%mt+03LwtvP?6grXQp4~9h)&%BMEymK<5Y?+^D zxKsyg(O)0ve@5oZr=)B2^3zN5g9&KyvGv37T`2XnF&^-F{)$Gsf?AO4HjE)!+{%)nDgJZdQ6&pX*k& z>?@0juCmha8B{Zq52^1qQ!>@tjg9bI>08zfT2PiDf7|-{bkZcAJJ#W8YzK$6DWH z%^rKS|;B{95ZbPx7ho$ z!b$LH<3Oz@irm<4Ywvqmy&`afE1M*U9ovN9c3hWKU$gFhfO!~K1q5v_J?zzZpMP)K zN&fB=qWOk#lb)uf6R%f=WKDv1dwTk%8a_`UG23!zi_OtjEUkLL@+Q!H=!xy5p!FG% ze*&&uo5JRA6ii-zp~vKCQYEZ|6S_?&4vY67LYh6)Dp)dmK(FPiwA8A0WO22=Vy`QC zloWgM)>}Vo)DhE!>}OXbXLpjMQb~tS&sXY;KT8fD4_H3ptn}&f(m{@ogCPcmZ;I3f zv%E_Wj~)ErEUWABMK#AXG8&SRhmc%KfB3HC?D^a?dP+8jPI&q6t9uS5=bf%qf(cc* zDc8roS1?_xrh!~5i@zPVaVaBo@W;GsWxe$)ydhyV)TiyZ0hrVh)CT*>Io#6Mmdf|F z)Vk%>Ei`Y#3$|Q8&kP*71fg>7RH;WDvPij`+M-p)K%ecf?nx;#UL;MlFF6h9f3mdg zs%@>JiB~T!HUh^?Rjx?S8}Fno=^XUWG6)^8JKa_BYN?-y+?JHoHdNDNY}p+3(Hqzq z25g0gn``Sl<>(`>=ezScpR$k$u32pdONvVccu9;Nrt|1TUESFRVb)>-aMvK>^YSK9 z*zm*aA0Ma3$HF+xqHgxPb@Wabf6Bin0Z>sl66>twSIrDwm)o-NufFGP!cAGaqc-qm zftR_*F|*ezt|U5yE4FKzh0Y4xb&^11ouH-s?e^nfrmNG@|Wm&*|;!xFT zeN8jCdZ+!ZDxnt(J+mtxy?ZdQqe9lreP-?SrvVeYjQo+CyeR6eyv|JTe;F4}BNJ_3 zO!gtY>7*OD{+YcD^mVI+s8>#HP5~mWo5nH?^*vwP&~p+6=pzm_UBdcfeSF* zB$Okhk)1x6npR1};xR#Ue|3q5f?smP4gk{P_cm=@G)WsJX4I3UW)-kB7W}GD&N`Gl z$DhBt*Okw!BI_0Z;%0|}<6S4Z%h#BSfoG(mczJ~{2;VOpui-Fzj|f&jC*SoHn-50V z(cMq!Y%~5XlA|Yx`wlF5Xy7f&DlcTU|zLhvl2dS=K}PYgsnFO5i{%BCk_~i5TBbLS?7o_`l^m(B|>Y8&Sk#dOt@PYlm!2d)6ECIxjDNqoG2z&(gJDDTHikIl70f7ck zR6|WoN0)D>0cQqKR6|WoN4MOk0n!1Jz&5!C8QDO!d zYGCN@?(Qx@x;sSakd{V}kdg)gmj$W;B7dM}V0oy$GY60pC<2gCmDUIH0Dzp_n2d}v zFtDjJ1Zpp9>I@bE0ELBt04Wzs01r0+C?LYiC&JH%$q0~vI(Wb!mR8OH78%yRk^})# zc3>F9+|(YRYU*qSwu9F&H?;+5LCqmxXAe$*l&vj5^RG9Y0GePYFw7MU;=}|30e>Kf zxii2FYzeW)XulUHY$eQ#**Q$NywN?HpX3!7zX-6aICFZwCHmcz0kBcYqN$CpR|`o(O;b{m=M6#N_PF zp&*Dod?5G*0H!dQsRt%}GT_7y@B#uL_8_o30PGHT%*AOBb%wtJfVad4V1EIHVgB_w z`2+x54)AXR1^pHOS4bGZ1+@qN!~EO;E@wCBZwA8I3I_fog9pH60d;}>4)DSQ5Z6C4 z_yAl^@E!e|1^5A6QojjqLi#re0=Q&;lMsMQ_BX-3$^AouaA)$r2`;Mmo8UE7eiOW= z>TiPARQpZvny>yLA$U#o-+u((tHy7F?^E+P!S%F$6MTo-{}6oCxlDf(T+i$`!S&4l zAs{zg5cCJa6~TWXT*UGZgsWKnf$%m${y?~@%^wJtwfzI(x^}-22-mg$1L3;RKM=lE zhd&T*!|@M<+kpLna2rm4AiVX?e<0kI%O41L<@yK0UAg^6__fC6{(lF;U3vV0a95sx z>-XWU`1K@P;+w&!l&u4sJROa2DW$p z`-+2~=6|yV1b+6xV0W-N=HfimTr}7^tvR&ZSFY%D1u7e&v}H@YT0`$l7go@h1Vr1? z5oJfVwR-*A_nAbvJAbGz*o}cva7JnHuu4{6we4Ofmvt@W2 zKXy%6=WqNja?2%OHNzmb>fX#~g*F>#WP28!HOqYd-1&7zb+^M(^=xjj;m=p-Px&eo zB9sJiAd&4|#dJCdb@4S!ev>V$g`HL=hH6(dV@2~+R>}&GP2rxRM;nbZxUua$fOKqn zAQSlkZVgKoD}TeI60dT|V%&U)+^?!ezYH3u_&VG@Yx$CzaEo62XX*@d+o2qaYfWDc zM^hH1gFayjys#>cca+t|KM~t9!H^?}wCQcAkW0c>gWqNY(Mk$87z@5CXI=sUSIy^@ zim`G6ls`9UYjl_|x5hkhxPvW~#hF;4;>bLduXT(W^ndjtBX&7}7Db;HBpcq>F;7Zk z1MPn5g}umEIay{b<99Az<9x+otQLzUgQh*{$45cAEY9TCm+Y!mrT;19BKH(s<^c&W zZ+#IV#sX&>D{GPzv>F^?PTLEqwJe(BApH)IqH zGc8Yk6n`T0S-6+C*qiQi?@6)`G|kL+gi!BRmc@T&Lqg!_8UfjTWn4-mHk~{!yp!z2JkEE zu-BQK`vI%&AM&iTFeO zXy|#pU3OU=Xp-i-d(E*|{M1rlyoVS+$+kxv#C(&2Nz!qhf+Yq_b2i9^6h!PO*|&)~ z4hlos;tIyzfTpY30(KNw9fN~43guR>DntVrzgNb}bJsrd%zGR%S5}1#2&ZlqsdXTN#Gx-4 zI!IgJ(*J~@0}4np_G7Y38Dh%({wkJLnSTS~b=2xUE#aFWyXmRO|LrF&y?#K9rh%M zVLSR*riUnO32Db+(j8&fvhV$-x8{l#7&v3F7eglx$YX#Z%s;LwvG1WoC!lULL4Rc> zanwOUOvGv35JTCFDuiuQtvxjFOQJQVwUir%7PJ|qsP}9a__F=cPrRLL(Bm08t>?JM z5C=Am_ksg7oNCQyVrNR4zk8{JR!k8-NuGP8pQ`F&p5d|H8M^v}sm!)p&_AG@e9L{X zr!*SYxR^KmiKT_gL5^`hKk{Bfb$`AM=s}O2^# zO7y6MT0lMOgc{}2&uZ>&aJHZB;@!w5=`3FMS3VmG{^LUWPZsOSD7U`t`hTK0*stSN zj_4h}Ha}ggt4UF?EDKBBIeh}&KuWswNkOZIb?*E;V4iewKI(H}kNMGGv$98#wLXP$ z77p4(?=F9eo>#ZP;p65T>5HWO}=8Ie*G`Jqun>y(RD2znd6caBjx`6lK69+$wwdDikA0F_|Hg z`lVnp2ci2Dtc7rzy%a)5TxC846zZxkTh(B?LkIO*9N(AE&`b29H87%8%BM}oSrQju zk(Q4k?)Xz`_f)Irv!d zU1v;MSDs1IBKl=?JytdA@F7_Rsl@YAmIVP3U}J7ywzAH$r2YN`%+&FAswrYY&ieKN zh0n0)^oC7(INS^7oPV-)S~Et3L4MF;mKZ2Exy58RV?E6NgJdpr4Dh0wlk74=%2;pp z^!am6KJLJc`Kz2xWK?V3sB+sVA;o3(bi;4>MIkq5NY-e=?1VZc*V%cD%LtICBb3c_ zL5J1#?;9!wKGe3ZBWMuKl1T7w4;x{iQyW8nEqUWODX8M4wtupPJ9El^!_bqDk)Lq5 zAT9gO8?ZRJw~m+k!^_8&dUI)4FNH(94$b$+F!aOv%xeWa7lJdYPP+g)NwIA1N57Zj zM|W<*^Ns32nv&|ZSUv4z=Z|HLkca_clunj%p- z4YZklZV5Nvk$(p8-v`lCX!n?(HaVE0@PazYeDM==HOgbCD@+{e_h0p1A^6`~kCt_6 zFX57Bc?IutRja-Ls4k=n*tw@C^no#TtB&2#((GhdVlTTj1!QlaN1gIG%1gfaVm?Xj zYy|n{$d_u7ZE_z^`gcYF5#5a!paBBPz5)TYvf|U;or~6#6IyY56qsr5>M* zzxON}4QK20SA`cpi0p3n1FhwJA16kHFt7UotM)Cu4Fe-5KBxns*^t)jfaV5J zbGFp0DKx5B9wqltYU`B&wOx*a5cYuqo1sI!_E-?d6n@TDPf~7YC?>nS+OIUTADxWF zp#-D#aep7sz$K#_jwRn3SJyp#`sNAK(9JE;c4%MLiWMyR^aUSCSR$!syEUDazxd(^d75^#SCw3wCBun9#4iY1AobztY~#aNj#|QR!Seir7uC9>GB)W zlhoHz4W5WyY1zAttn{>UF|BXKV{WOA#Y*4wya?nrdC2iE(y6y1E@^Ga%Eor?QHjK8 zBDVjGP*i0I3XFnDl}jAyba=h?$*()G>#MiN!lm#jY*Q7iZajELL~7Gb?^IU+Ox(w(u zyindv`wRz(Kw?ugV@NPo9)U;n)6(^?_#Kso`GZkzx2}A`T)_?I?9xi< zN*Ym|vd0CmZNq4-F!o}Kv%UspXL!BFP0W?-ajISWDx&;84))rTi|48h^Zn$#jDNza z`H*``l^d4YC9lLDI28A?RY*1;xLROhno5iQ0VsFr;iky}rnAdstm@MAM>p%&P1}m@ z&KoINUuJ54|G3i$=;)JmD~`LRj}uALNh4<%T?xq#x-*bSfT2ZWXLV6nS6)VEmmVTS zVQ;qLArT&m5TrcvMiCV(P6lX2e1EdwY^b=Mdi{;8xc7AY3d-<^jmdD)IU^+P|AtJRlX~wf_ zbGrv>9Y|2zxSqRRl?1SJUb-=f>AjDL!ulcOSfBlOjz%mhlTE+2?cGQgTz{~?rdflh zTLp!1u3rI;=+9&U&(hqk&)fMX zUL+4ifpN;cRG%~kbokC$TtqO5%CVIck#ZfktDVZ&hO2LuSg#q`)pXCPivd& zsT=5)N>T(iDWM*ZUpTy$`_jrb`{IdRMbxK_@y7TG1x?x8WaZciT7Q07^tb}8f|wsE z-}5n~KPu1G<7J>k9)40HxD2syGs_O5QFLalceG}NL_F<#a^*gfHh`pixK~vh*l6bP zEv$b<`B38R`s-iNt(PkuE05AgBBQIDq%ISD%h#!`Na1F`s>s}zKgaQ?BY!Ts_N8_b zljSUbp8dm|EY7P*=zsj+@vT~-rk1s$rw6U6Uxli0Icx95W3!^%TX&gC4YdyC)2yS?^G+< z1CR%Q)!K)sD71*Aja{Z-II~q+2ogK+kbP`UW7(NK3Z4VTW`F#w7gC*i!NCdLZVb-c zpv$ig2vhTD@gd$Rr$0mxr60|v^U1UCWc)6djf$1yGbxQ6_sw7BlZ7G@I3aPM2N{Mt zQuSkng~(^_UdhI-lxJ}ch ze7RF%m3KLkZGSsyPn?pqe5=K)sG%C{)fD{<18rWrfNK0j4radhXMVh%(ZH{yc%m~> z(x!A&>d(j@X^%VY6rA>>F#DxJlE9&UJ4Zdb!x)cOK>m%;dDy-G(GXd;bxCB8oTv#0 zsYzCS?ui_E)=W^+*J-okviO78<8o`)l1B}9;VcV;Sbxx`LIgwWO?rnpV-c4`J=y?A ziK;kSDEo?rc#4kIG*eykl;}hyJGDK>m)TSE#IP8g+4QK)RmgXmP`_j|uosIALY#!P z%8hPc;uL)wI=44=TUvhZ0-?%aVnuSlgZVsH#cFFNQSD~+1b0To-u9-$!=oCjJC&!) z$3$4-&3_UrB@SQ&_`}pg!Np_5Rr< zc4S{UR%y$|o-BJdmiq)|TZV>}ZQXO`58LXKGek#;$@kB2uL;DAz@?GrTA9HTOYvD0 zW1IP}*pNuuSs<3C3_a9)^k2dXA!mkX-*sz}1b>-Jg(jnv*gYQ~af}~YX$p~aKOo^X z4vi6jc%*IYF~3E-e9)egdiH_Qh0zLF)R1-~tR5XO%K1nd zR)S7O-R@6OH)Z}{uV}ONzL67gn69Ufj5#Z}Hgyg_7(1&NMVoYOYPs=+y^ur~(d4!) z`hU)!`i?+H4D`A{9M~ei?b;UdWwG$rw*G;$1DHf6L(5uSGycBqm<=CUbGrTF=paG{ zkGLgVT|t-f8ENp0y_7%38(Y?&n$J&Q;ynZVKFL4dN(NCRHfAEEEGo~GLN2A>yV^!1 zMS^Z%!bde7s?u9u8?3#GN-T&jOb6V8=YK7he(CuUlId2_e!D2H97J1vS=Z_FdQ2Bn z+t8@Y&Ue6Y|J&B8$6+aLoSR)i>i9M3*YnK0`SSe3{`t4NSEB7Pt(|N-UEZB)&+Z^l zDQcKhT_~}K4@iL%(K-?Q#)ylW3Td#PLSCZP-J)joLnyaLiCs`LFe%S5t1xB=mVdTD zUQ-DvI^$n7V>tczO&#iAMpIMXCq!wH=I-)@&T7R^F<5B%3kU7{8yzD+qOD0;oPw0M z07}^q@%@eX=f@V1i^Xw z!C3=@OQUUmPzD=50o~T!64m5FJdFSeWt|U~n@khuJz{LH%!5JbXn#KEojZp@ zXF-UbR;ccz>>Z0T{wl=*ws@7lR9(!H%vl6_=6wX1v-%OV2R^<-1eZ|m<*H4QWFVyPg z7;sZPD}1v`WD}!Ds>udpV)&8@lOSAybg*)}aSNN%zFZvZRtWJnD%WV#-sXDr8^^B46tt z2oS!vLk79%r(b16&7$!#Iu|t65P&-DDeL+#=v;l8qb` z<__WFgd90`g?tn;=JZJIJOUK*7-B3{70U{$38G1Npv`}cSLueXeMLtP+NQ%mC-A>mf-LZ&nW{op25nrsM z-*24g#Bd>U@iqiw{AzF5zQ3YB-P<$pZJs9Y8Nh3)TYAnP;9a~sI!s*>|83!TE;l~1 zC({o5et#1AG`sKpwcEGctZ7-L)ZFC2V4XPGme@9}3riWwCnN|-HcMW=+9_y$E~*ox zFfQOeNE&6eg~_bMMz)k>KnI@~jV@4FxX!UN8X3it=b(KwAf&Gc%Gf%Z6@+_M*fv~G z^ewpm8h4%%Oe8v{hIPs)?t}ya`YmGI)<>M@n164MqYsy4o2VPMbhAQ*J+12ZU*Sdv zJ~zu_ZjtIjFNh-~!&_9WOQ0=jDAqq5S*IS6@e|d{*Ju{F4Z9(wPTb}J-=Tf`fOeV0 zS9~u9T*3ZfBqxx1jLk=R&Qk{LT6+2FiMKhC;OpsLRmD`>z6V`|>K>TE_%#iEI^{YY zw|}yx>V0li?W4OQK5I|1()PE}wDbc38(miMtWNj*?Y$SElhj^E6x>+Yz+t&j%EA%GxPg#CZLd2xTf(* zW&wOCl0NrG8w6>VL;9ZjRULSe@f##N;C~x9_GjU|+S^955%zy9*KCE^md-C`0bJh;-v2HPL>Ys$?94Ksdm*ONU7x|xFr$@EnFgww>xC9%6 z`@^=zPHccJXDr?02=)dWbUf$J@4;1+oEJ?jMQ8%^9ekJ!mrSwG2$iJeyb82bJb$O> zH}z0_GEDN4q%<%+zthkIg8}}?b;;91flDzgIJgnK`dTiL%l@5rBd9i0VV0ddI4$GJ zx{!>wtpRgTjMu3m{rIeh3G;b+BvD{D8$7$AoLfr9U<^#OCGu9}0u_`-=_`%TmRRYE zK@%pW@t34egYN05D8+wyKnRs;U4I>w%fp;yJZKu+Oxm_x^Mo&$LUvj?@63e4B7k*L zwkr7Z+z131EBujA&CV9xmv=Ap!V-6n3jV$QntWT^ni8&x1z)bjjp2dUXEDNkL^kxn5|?*S{Utg#LxP!ITnw41^YL8C(5Fm7pRtR;vHRM4W=)%eVt z(9X`cD6gA@zI!i+ce(BH@H8h_74eBp!ZI#T^G@jcJ=xVgvj+r}gny>VM$!G{QYq#j zzMq5$u&}z3n>5f-KccbkywIwFKOrCK(SFQyYN*)4S!LrX!%{Ra8ydtM^hVrbc~xR% zBa}J|_VGdvE8t)iB!iDEX4@lWYajGcOOmu|Nl{gdHdf-O^sTNAG_0xzKgp?2D@%e3ZzHDj}9!~5UE{1h|$G8pnA}5^6D8q4Dfbz#u3x93$y^7;&>k&eNp|W^i zN(EUI!M4PB$Zp9SKJ3c8+=pGy)eQ`8taq;AECct{V=}0dbGev{XDw4%^~kvrDU-g}XT|Xh zZHx@I;CeIsVV`%?Cr@aFoesBQWnsG^3pACnk(uExH;i6v@PC0E| zH2*ayA%End*{99P+ytFNN4u%r)XY6)ZBFm&8sqh7-^LsIbfS{rL#ChlYCaUrZ-+@* zfmwcLJx*a;xukmxOuW_HyuVgZ7!iYHUFmzpo@crsg?5emb!l|-PrfKxN2N(gINb_z zynAgxxyK`W3gkI&D>&HW=Sj@Iv2OhsB7$MK|9^2Iqz&Y>$O&z9H>l8W8}#!_ee!g; ztxs*!`GZ(3g4#ca*wslOR`i?S$%qlUjW z`hSLjDtVW+(geKQ38NujL;dj&a8%a}bXQ2&pMOQj z)ZKlaF%q1ZscnLwZLYtysB@iIlzeWK9)E3za04<~wAQtu1Uy>j`*oL{EWVnO%5O+X zjJ5B-ppGc)nsbt89zvbb_Tb!WJ`@dBukV=++fga$h@qy13~2m{V2`5?oscKb&-;Ujo6Dvai{`cEkTrWkbgf~XCB)QE%S}SDpD_6;3!7vPK#;rkp zo#)-|Ule10zP+}5Rd6jT{wq=R$ZDr-J%m}d!TzI?UX`uO=v@VNYmtb%4Wge<>2nOz zHi;xNZH8oPK2q*$a!}vVtkQx134il`Swe3f5~{#npQn&@vt1M}d+7~sH%VqMO*rEK z(o5XPo{vXihnxBvH%DW(ZAQS+4zeGqu_{O>tJyKWw#wlfqx<0v z(U_E`RramhaW1oiz=$Xv?*GFd=KnA7|3m?ETd*n28ER(=v%&mdo5029m$1wMf(A`d zNK->bmpIJbD??2}SeIZb0vWf(%>ms61|srmnnFUisL}z@l`TRSX&{0272s0ZKZCFmV7T2qg!Dl{}CLEDD2G zMqrUr08CO61}J5Hby$?&*0zEmAdMg;Al*y{QldzQlype9(gVmtH%bo(A|R=VfpnKN zDBUSacT0S8zW1E>yuWe&nYr#+d+)XG70+DHGkY&@08JpPafO$cNB9m8w=5-b63E$~ zjlaD{FTgPJ_e<_)GEMX=fnV-tUA=wnP;`L4z&!lv)fkW`Klg|_wZ_wDSII96x37`M zXDU#+tiAlwMJ+ImSg>05RF{AcX`c550zv@Cf+^@p|qKMG=?CP95v!+KUztf}$LccNp0jkd5p33jOA^+1>x#FGWcNL{g zO%^&&`>cQVviM?HnaC;pvwZfm8+QbWIV2>gaqUlg8{_$@uMle3`sRuS?6)z6k>r5& zj7S60aeEU3b~r8<#pPPBM6hhCferzj>55mVf!yoA-ds^*+#M~xco7jvKphGwu#(AW z1M#3Mz>j0ON`nnkZb}*Vi#w!7uP?-CuX235q;`JH5n&oqYWXLc`)b6r^tF~=qM$R1 zXXm$p`x)!gv(&#?4_FpLjQ#Itd|49!O#Ee=3M8zFy((?umZPYxfW>T`lbs$z*vt^+?PP z{q6KbkF^?8FC$7IF=%V|I639+R*m>xViYTLm(GF?!yD+s{>np{;77w-*_)l?(BJQ8 z5Wsu%ML$!omz(>URL$qxVJ;eFaMdlRsD(AvIu=p&3Vuv{#kuQSg*S%d-myPLgiNTW zYO?u|vMN(X@b)%t@h>m5QitQjC+j30a{F|Ki%TZk+DV*cYQgMo%q~#oPp?gMat$

    zTxTzsyQYjZf42>P*dZaVvJpF~Iw-eXca|$(Ey+OBWI>@eDz!sQI|MJRl*k)8YZ~GK z1L;fWNTk4?+%+rs+1@0qTukNGh*=Z`>3&&4Q1;+rn2B=sHoJxT*Ji(H``t{x49u1@2wz41Z$fJdZ6>V<+NlrbJr zrEVTS_<5bto%d3>d~PY*zw7a65Je6EZVk>SG)#e@t>>wO1@pVCJRrrVg!CLJNs7&G z68}M$`}1`=h)pj77f@FcXJbqOEGjUGw^@OIi1DzbUJ*$kB@9Ny_ zy*JU+Ssl<4P>z|CY-g2GHGkk&0)d^D2gbVV1%tQmybbR~1k46U7Y56-yrFf7G8t!D zyFBwuHCy)lg)a{!sz!>*#k$%i&_mB>iZo7>;;(*2Z9XF_tBI*ip_;jw-PId`ZDwD{u=Aa<1};^^&L8HcI3qvZ`WPCy-9j9teobb*@F-WL z_U3A*o4b>txc!<}lB}w|S-+kVAWq+09qg3cwxC>JlDZ2r4e$(jcTpBoe5Mq~+?Jhz z*?lm^uackiR`SV|>yrfuH8;hWTscd1dEJ`0nljgdZf#`i1BILSg*vL5W{QT(J-yCuPiP6vfBI#yab=C5_tSwl9YR`TKpfcHqmDIe- zy!}>TKIn@?mxZ~ggTFu+Yvb(4@sPe^T*DdzR~YZ8TAM&-ojv$@F8@Jg>(04tjqsO* zEU3S2mYNj_Tu9ilcFcc8*hxcDSTwy*HvjjeSph$!wO~2?64mX>Iy@{CcHL1RLqb^j z_LQ*||AJcWanW9rPkH|qaQqdrOOZI=vx4ahD!)%i7<&8S?1*MEgMBj<5knF0l>z~5 z%zYYoo`%SLQsAlQF41K)c!ag13$D{c^(muA**TNh#Oi;1e!ak-DER!tU~f7mEW!Uz za87$=r)DFzEI9oJf{93eggeA(m^)z)L7IZ5_1#;Xm>?|GFH({OejZqb6aVa&UOy!> z{_^?D^acr385zVHs_ zQ);HqyPc60B_GM1A;@i3S8(2Q7i`Kx^Q^`DE^jeoj=p9S3q{}uwEq!nGJTDBjDOLX z(IpQX+bpxJ-2u=CN|O^wJKFfUo3*4459Nu>x4Kqg_0>H)FUIsib!Jn~$=oTQl_Rb# zk!qBbPG7h8_~i6DmcF}#aIvJ~xQy4ttbLIvx#v;t8*5>%5?#w4zl{Fd2?2cza$`)n zlp4TPY5MCCq3vGPVq?s<0+F&`j!F`%gpNxvGQ~P~ksTOKF+Fd>-nse8GjpEvmB6rC z%aWGEo2G-EEB&GNO+Cd*iN$Mi_u;%llQ*h_{SsfR3^e5MOl52ZUy~Cx6s@A4>ls-> zVA!^#%0AYMPS2H8`di41bp*WZj`e`h>RWv8^v$x6{h7S*C^+Q0Pf0OFC6R*1*YdC( zm$t>kGkO{zMnu~|Y*~dtH_ZDlp0$-MyvpH?ffjj9{=Bfao=;W%Q0%Bh z^%?U$?BwO}@Q(c~8PV3`d@4GIE=9fyY!74mc2GYjMed`_J$5#G_pgQXZItYm12$`3 zkI6V2!mKaj@^~LlOv$&K%zvcMW^6XuV60$xV3`mLjJ@w-O2~LlB%t5wq92oriig&r za%fLq4LhzfyyjaTDBcV0sbVMRi%AL7S5)OOc{PyO<#ffmDY2ft&_h*8q-O~oOB6AS zi4SDs{(X0!_hIp8(xaqga$galt#G<6C#pYF>y)W7uhL(QJg4+HlbNwr7dPBFTYR!n zU`?;8d1dT>J$f|c^LYmqrty1Apa}jK!7(43X?OJ5E2baZ%MoMP4EWACXp8$4W0A8@ayd219LBg>-iv#|v8q6476b znoaxY=9ttLl}a<4CufZ`Xjf#kXRS)@3r}vU03ewwd^cY~#RCB-MN(oz&ggx!(!L>a z%)NGN-UUtxy;j+I_K)nPNu&=$NlD@{vD|*-)q z`@jtPV&mutlVk7@%%WTDF8XOb(f2$sNBe+kmol-^!%JO!Y%%(3LU$>zP_=SNl)(#Q zJ-YFb!~Ub7KQuipp*zyI@+&K5sD?h#!pd`(lo{Qy={GBMwIu2~45%lBT!M#=H>OE# z{k&bmUnDVsiSs@Kqp(BD>mqd~{>*S)o0b3;BMXVq)=sj_^6<)DT3SG9A(Is%(xd0zm& zRyDVkvvMSe?zLi~H2TK5)VJ+r8ZrNn^&=6{=0KUg<6Ew(QMyjBRksZ&d`Nv`#Cd?k z2-9Q2(fG)F?e$J|we<{{21|Z*#2X8pJ~NlceA*8sYV}fYrJ!zDcy0MHKbzlUmjE5BM|#`u=7LVV?)n`YBCT7J676TlESuPEK7))reU5U_Eoo`SI>_1$s?2Zgv6|6yCz>j-oQu;FH z$88!>ZS$c5bbHjN^4n1}jFujNi9qj#r_F=Z`fVYD2UD~~GBZt+BcnRd8;Zj>spf1^ zsz;ozmnxh#Bku#psf<^Y&X;g!{p-n>SX5tMiS*=w1eu*pOfr-du#+APHXO!Jsj3zZ zc=PU)550%{crqo=e)x#3->d!umA;%w!wKy5apBv*x7X>MBw$?`okm8zfX=pez1fiX zlU0f1lUv@;SblcS>`tDwh>WQ3dV${=J9l3+zZ*c;9~fP)58PDB&=2Ox`Qh#?(Zywc zKyE57G4HcFqb1#dSV*+GXQB3X*9LcEtSSM~t6JhrCOKG^f7Ueg}fDUF_=N>wSWC0!ZP z5xgsxsbrlXze7<|0tTNn38gq_VlppO6c<{ChCg47$U`2sca!905(b(Gkv%l0e3Q>` zHzIP4A4cY|ct;PlmBs@ON-aP3WaQ-dUJ-3`-*5b+Lw+7(bpuU!z6O+x!3$2|1Ld39 z1H~#=&P4Z2E>C;DjTJ=1*K#|FI6lkSpX(^vHT(J-z_?%L=|JY1Dj3?)ESw+KlSGr&OI46$42HxgCNjM$R-UI}iep zQTHsVF%SPL#%#N$q&zUUhZjgmKj-i8OxI$+R8Yf2ul|%h`wed8i_D@wA!KcEVp1zM z9(7!=e=ep1*=q>!SIUmg-ly zR?*e8hn0UP0V~o zQ?GInxt=o@e?H=AIq7}hrbceh)00j#VJ$yPyFsGl?3lqrdF^XPXZ68=wny|-+F-5Y zx(;Uj2y|~XpAo>S#QOAb3%<+EzqQYspv-oW6uy$nJwcVm#yrRJtT^u!W@0COLZQ$R zn{)~y2)-;W5ISjgvwH7jl>~MYOkLO z*<*QC1NZFH*nQB@yPhK&rubDVKpN=gWzb8-Bl0++L@zQ=T^5e@5<@7r}6 z`Y!s@{E6!bffm_9>@N^+z75{Z@3hxZHj{jr*@bZ7xK7GZInx^|zre zucemvAIl#_)-IH5T(1ds?qV1uMbzS|DfTp%qx)6|x>dg(BbV~sQi+lU>O$9V zl@9jv&{azaVm4+?rd8p4Ny$kCOnSh0yIfT*V3GHcZt2vg?#bX~+kWcX*^=XL<{3GE zXghnM*EfSFw=#;jwkT(0E3pjHBsn^svY#J$klFb6DDG-g4l}}6aK~P`d>tWIS37SW z`EW1ysY8LO0Q?urP;5$y1vYqu@nQe#ar$lr^M6}NWT`a?09hO(Pf zJiv0i(@4txbvUlG2!9#^a8nbF_)&c3tz&72`(06ZQvY@SK(ABjjsBKXQbd{~@A0Iu zgmWQ`t4840Of-VV3UgWM(sXaH-C!mpM~s>9J}u2L>k>B7VEiOwj8f|~^ZU|Vq$b_M zPGX2z^nJsqdk=>4n+=_bM>m6eon3i9^aEyo6#;WsG$X|;gjfkhiX4oClByqKP2>F} z+W)wlcTqQLTB$do%u22;B-vN{HpWtUY`9WuSZvitvZfaWxOICo*2~`}cVyN7*1Pv! zPFqN}YhMz2YURPm8Xsr4o06T^Ze`7vu4A7Ly=ArL-08jOvr|(|o-$PNK>j1y`X9i- z+)J-7)i?E9N@I*by9^>lXp(FHz9Xg=Jej%GKs@yORr z{HWPIN`+hwb;~lH-EsQ}qgh@GCEjfxvNE)sU~Z;!F)@iEwp3Y*H{)N zEadg*k}fZ^o47ER*Qwi`kGC+mE4dFGb6w(EN6`^@iYkO$XIPBde#(1E_5P@24x8}+ zcaL3POH)Bs6U!xsyT|_T&oAW&?1`-GY;4`J7jgtHSciuM3>Co-2`H{&INn&C91M-ZlS82)sDF%Q z#kmUwhNJKp$B_VrAhC|B1ggN_vmnq&6doNQ6bK5%Uk!o6(Tt}70s%$*Lj#-w2ows8 zZzTc_L;ruw?7wjZ!aeMP;A@J2L;oEI|D_U+g5t*{2oC$3HaH5523Mr25nR1WfC5#d zs}smvrN`$H3PBp=3C<5^p-8gQbe;I^EA@SV@MZxfs1O!DR!T&HA!1)S_g8q+R{*POr zxDdzpDHMUmeglT&AG#iv%v+Pze0_ zP-r;%pJQ?SqanCd$DCPk^`e~K@I$KVK5j4 z1LJ88hQjeG46dj_VYs}-8w-Q{mA1Ic#$T?(ML!h!A43%W_xgg%2)ttRuQWmbBU*6_ b!~YI090o>VN3{u5Nzq_39v(UMhh+Z`2h^mq delta 57084 zcmV)3K+C_?stK*C36Q9N_3AY~h{ihz?9`yNyWz0EKo!(Chom|sVD75wTw zY;z_;SnaMf^fTH_-?vvkUH#`uOtx-jV>ij#-*2zJ`c|oxXTjRl?OQluU{2eW4W4lm zR<{p7cmICAzEP^%9Qx}U(T&5k==M+7zuta-_08>KT?EM#e;ig+#b5uYy>J;^-;g1c#2Gjk*4Zj=4BYcWaS)~!odfA3`HdbYo#xYN`lUQ$u z9kJ@}{V+a8>Nh`r7n=|tXZs!|`{Vs~bA->=hN2ueoU1lNnT=J4qCAfG;z)i#ncU$J zZm&b=_PaOzf4mFFc3&IREL6l$?PQ;si=*P1n6!o&0ZDkv9G5h#@1Cw@=zhPJzT4nH z4#x}9_ljwuTS-4zJEN7tFva}|t&qN`^A=!9=QS`;h4tYCOj^B$dE;Ic#oK}}iMPV1 z!Of1J@|l2m&P&9DaR!Kh#(^i|X+BE{PBLvwD!wYrC>qhUdI_1 zvM7ZXU`Yx!uwam50M#a1|aoV}mMM1P6OMJvZXFCpjSTQT7bj$b7NB=x z9pF>zqAXfaCRtP{7g=PK3L!P*5!U17t)VO=e_TYH)l!SGvM7{bfjeT=Je1Rj23$!K z6|Pwl8JDGNv=w}<@zWP2(SR{2qRgn3Wk$FYMnQqXE4{`zah{GX1rC^%Af{FYPBQmO zfnzAGwGu*JjAn0Mwj2z+v6{?lfleMzbImFx`E*3B?z>?Q1 zV2jstFm$`A+=XdDm)u^VTil+}1>?We?*=k6rCZ&?$gCCpZm>>N@=~?Z1Z?qp4Q%#% z4(4K6SiFJJgl_SBjZSOFxKJl_q)P4Vf9!n0U;%xO^Sx%uw<=XLYsGxSc*m?$7fX{S zWXby#GR5K8piao7rwI-;*{=--R~6BvQ=f8Su4BWS>}YkSc5bn zOYX0cO?RzwGQsJtl@G^mx|97G0a z3&3JhYA)6rO~{e}YGktjaxzN-2<6+BP56=kDtz;8s+>=7y1{OJ@j(h&U$v1K=x=k)ZQEv^{ zlHAH{bC#L286nb@20~CCXD&Eee*=$c=ILau>}n06RE0}LMH8^(>k8Q7>X07aYumMTP<-(x_S#o=YY;k)==HhxP-z98tdsiCbk@gU?e{_7D_RR-;HugO3@Y&ck2(x=AO3>qL zTdhjg%vv$W$U!SfMia24z#7=}j4TIJ6nVH5^!&*e15gvnq{9m3{Ma<7)bYNhTx*Vj zXbwXl2$<(Q4E+^BI0bRI)r0iRT3HYd!mf|c{hTdcikg5WLDaxzL1bWoV!a859-0PO ze-uOu$|Q&i<^0$*rxZLsRl57cKxNG7=cY(-eOcIZ}BXJ)N@m9h|zrN5YzHX%!r zsF4NEG!!B^nUwU}g5vR^mMUwa1!mGj1#{6vj!Bv@R;=+wF)7<fNG_g{1jBEcuSTlE6?ZJ z#Rm#~pDPP3n2@cWdS}+kvY_;5zCXo_s%Qb0R8a$)Rgu6{OlJMs3S5b6Yhhttt<;E;TrxYYTp)Q zNftFS$oH){0gGW-X^;ipQ{ro1zUkEjG|8d@y2v6Ubv~xVHa^@pbeH?9Z~ZF3Q3{U& ziJ)zm1PO7-#%FE++K(GlhVI5ke>kom@r!~lQ|m8W;CguXa)5v79nWLj@i1$O`e0f1 zazDQGW9){_cQ3F#PR3#LaWfpE^&Q&j-#y_Y+!1>{Y$mICcZN2W(`|`ri0_zgKSl$? z6Mh~0`;kTU3#imIrcVMUHCAJ{I0U6^_l#_ZXE@Sz`{UHOe~X_c4ip>if6?M&e;8x? zaE#5!xF6&8xR3kZ5!lqRe~O>f_5oqslFX>+E6?N^422gV=H!Tz^6!0F_D{4he^VBb4(du%&m z!*A%I{(!Fz!(5$@aUXpb-!P7H*b}(ts$U<(}Ot#;rcbt>$Y2s|xKco8&d+hXK*!3eR75B)sf8qRpVb|` z20oECbi4gzUmB444oB`gY8(3~dRhZUPEMM>kUlnt>9`)vQd5tId_2Zx^htk=?h^B0 zqAgncPuZ8r66qJ$|74;#YY<@JjIfO}2Nupp{N_j4gTDq<5E}5cahxFquy=8c%j!_` zqSW27-%VRP2p4m#e_%1RNxPcOzr}M&$GndhKFjdZ2slET?w^SCZkWtF)BS|oe{9YI zB=UNuCL5#_E&Ln;563Zn-+`Wu>HdfE*22L8emaf^T8A(5kBMmq#tS@Po>1DR6@ptw z^3CrM9*(j5a6Iq+7DC+Aitg^m*j4)27?;v?TpyKlKJ&+Me}CAZvOR_wob1gZetQ^} zdGWF%PoL_epAMtQ;6++l&^`XP7p-jGqGS5)c-mQ5Ty#FbR8lyFV|JVV>A0MYdhMdF zKfZdR^TG7nceEUa@o|TiL~I<4^lZlggT!{&Ob3>hOT2u6S*RE2e#_0>OX#UAGT%0KW%PDTr(%(MBf0pDQsUX*ljnbc9IiP8lE;)t8 z!G9f(I@18Ok*?q{tK+hFD<}b+j=yD>3~H^Fg5+=d{ZQ-!8P*aTEYsFOdbafWg~zyl z5<%ksHNdAl{p?J!-`ROG0}e<|PV+aM4p{I`x@m9_Ft*Fupq$R?a5Cr5OY(F-9OI=@ zVbTSYfAX@W2=z=7jq3s~rs%t4EvotyRn-(#-;jE8YyA@ZFvxz5K7B`7z(BDJR%;>P z#&`?)ijFA*XnMEDXp38!c8{^8j~|p5eZ(a--1pnqcDG#NHd{Jy3i3jvlL~{cBdWhW~uWWylculX1Xe|-EIRW2nXreQ}P(Zo`^HY}0G+L)8t z7)|0JAL5Spk3&pfPx~F`07IF~K$-Mmo;)$7lQ#k?4lCt}f|gnUicVTO8ZPfKw6NHC z`Ct6Ra0(~a#lL__iN0O4nt2r7^4W1S&o6q$k+Tw?XLwf4gav-f}J7YBR$`FMr|XtU*)EdvB(=x{`n7Mpzr zOHNElR8W(dn`jJ6PE1KuP%A@CQ&~5a9|0M&CY&|_f4F;s(?B3NGz5nr!QI`VfhJ8i zH10uyy9I{?NgzmYhoC`%I|O$p1h<@?nfuP<&iQ!nr}H~iU+Vv?Rck+M?Onx0uc6H; zWdpMU$-$tmoIoz12;ilvmM{Rw#e>bn^b!uTbOpnpGM26&5dctF7zmJZvjgz*0DuA_ ze8M99f5O;IfR`{QFF4rF-W9;|lJ$=yL4cGa2oAQkgaTA8UF|`Rh#JQ=WhNP(y#A#keg<8XGz)-|-;1>W`!r_))*obq1Abx-k5CDeS zfII;pPlR7?E-1_u@d^Mj50f8zW=1lz+wzh&?OxNTu>fAD_s$r@o7^J zTkaNH8QzUl2B#USUYkw~m%;l4&2^J!2mHwD<4c3Z$%X|z*(bgG?=)Csbha_R(<5~l zyVrDNh6o56$Ynru!`@Ue^U-S&ra2dfKMz~95U|;wFe`|3gzRAbT zOL{Q5B#R@mZlUATT4N*C+Lk!@SP(`?Q2DF7uR<~tV5bcSY@y9#Y7Hm`=a7U}WP4M} znvb148I}!KbwB24Y%!p}XA&@7D%vpTV>h=iP?{~|IZ4cimDPET7&P5aY|`9MkTz0U z=#tH_9s#OLq)$d#fyRptGKQt zPOwX)ndLCFxn5je8Mn80YsE0{BL@~so#OWl#iL?lap~qd(um?`)<5AhG+NoSNV*Oc z^iD;``N8(CmT4&WgVX~W&6E;v+mP-@`$cP_jF(PVyc~lE;hCKue;5ZP$?lYjv3Fed zNS8>2IEqK`Vs1evpAPRcY?>uhU1+(eGoC~+#GOe!X2f>t67CO7b$`TGO=Xg0kg;hERz%LaK=m8StRmN^N|lpYNRdVfh|ZB%?OoLD&AI6B9*eGXVJ@;u0IK&pRFsY z76SJLS-vQ$JzW5IaadpIDw zFNVun&8wxeG1?u{n%HA`>Ld|Km;-?v_=Li^zm{FdwJUOIp-}v6RQzNbQl5^(_gqO* z*!eu>{%UqQAg|#xZ#LxWONJ4ggrbpXAurz$CCuezmrobOteR2#87D1t>aK{W4Vd9i z8^Teq5B0lwfANBR*m?!Nc0AKA2yR-i910QhTfuVq@WZfSE$U_UbvgT4)pp&97j7|n z7-qJAr(iu&s6I)qC*P6myuKwbS6@@H*+oH3bjN1nK;D`ZTVzz?Ag1ouChqPhMCwI% zepkFvH|cq{7Z~E?lM@-JEKYc$)zRv4S|?q5jc2^`f7ZfTMME_u&tAg$)Q9N7F&Ud_dZohw0m7E=0HV+9$gh%xlJ?C|HSlqpuI%3bI;glK@x5$N z%MIG6@H7dm>~4nR$%fh7WZU7Yj()jLC_=GxAbuJkf4U#eP87RODzm)zk$YfzHbLNhzaQ*C!>E~YHu(Sg@olRIX zQRg=PY2qSMxz<*$=*NW{QiHSdqUo2+V6C?7vyksZ*T!LiXMBMfy_1TN6AA}QIkI_n zx1f9!3_oGCjKZm`sWz{jCtgkU^0u34-xjgkmz!kknKd5+-aIE#=Zkf6YPR zU5(W=#GKP66}uMVNvT5TxbD9F0G8XM+XxRfGV5@_11VE;knvdWki4@}PcSPTG&A9A z?8)L|ATiCcasW>6kwSE2oAEc`)qA}I;jG!8%!d0hd205-1`Hk%5)o_9Ome>Q&oDlF zN|`a<_~vot*E}46rye?FRMQ`};_U}=+~JYCZ6sH=I2*Re~)BwXEIii4Uk zrt;Wq|%k{$d$)Kj~NVi`-^d24Vu?fv7Mg4KnhdQ)*UNBof6Eg1t& z>YhHC^rV8_s+BKwvyTq3+ov_OP!uH4<^3#UT8OKT*_pMH_{0<(eyJPVe@}>XingIM zc7$SGpjIr5#s`nKjOs{e75gsGCPaRMIfkU|Y*3h$T?HyIMUR@=nvtOQ>naVOI?-rN z#^W}ILO5D*&aCQ@Zv!|k^pITUhW61--o=_34`_U((;+xp9KpR~jq-~s=Sj{LG*7|cRx3Vq=|0bm zkCF_Lb^EyU9vDIIgB}d=-ZwsBwLvqIjMbxmr;js%RkoP9I`{ZXxDUpnFqsoTQJT%q zs4fvnYrB;2apvHfzUm%JX7?}o0$slej7^|NQ>reHC1}Cuhb4WIf4wlP@Y?a`7sCrr zCtyE-X`l3eU2ftmSehtDvJD9YS7OGIdm8>2e$P8h>;(Lw@S|RM^5B?$34gk)dKGCo#*ODSan&Wr<4%UcJVK7 zKKqf^DxwOT8!BH=kotEsf0tAv-dICP3D%o%F!tb0X0(fo$kJmL4kxUAROnoLn$mH| z)tVwLBPGIl)<^QQj#HZ^!!rvHV`_JI^$a^_*M1Ts@SJDke^e?TmFJGI44d|6KfdkY zNX%T35;}qdgHl`|i=kY=0l7-Q!5w)`I=UG+I7xIg3k6RLF27WZt*^SaH7j z{U`uqXQ`(3mk&Q5K3_FGjomYmPq@AG42SWX@wxp!e4@fqYc4yPxMYn%w`?GR{*&lO zb-a_6!wGKZ`-wii-0bSZ)|Fq@HT())OukM(_~WQ)e>y;h{pblMHGdF8BQBo}3xn57Z@UT+INfnBT5rO1zZDsIMC$HNDS#f6YZD(Uc-q%jSQ#(!NhlRqfPeP>qE) zW*4%GUGs2Aqw~WGROzW!-k%F}e*T28e(VfOcTJ~?CZ2LEqKjpYYXl}FJ}ep-L< z$Xk1KrfQFyt4P7-Z?}LCfBRr7(QHnBe;@Br!cgJM9`m*P{5v=+oYhdjY!X!>&HrtZ z+*g-|tfOsLO06OdR|o6Tfc$EW*vin6G6>rZU%V_^J25MCD~_FWU3`kI6cb-(GbDt6 zL7%2QlL=}5zBwOTIiR-Ahq#r9?$n|!S{=<>V6BZ0a$rLfCf1IWz z5GEZJQ}f#NbzIZj!do*r;;-#wB9UYhT9gX_uovz5bj7|-YH*tksbi+f!7HUZSD8Rh z^rnGeObQF3v-%SYoF|N&c(6L zBip3bK1Hhkewf-}u zNXEB%2)3m1V5LEEd8K9jH9HE}MMXl%CM!029~eEn6x;43 z{D^1Z5W;p8-%IjJ@^u5dhKFcZ>$dF=l)+=nkbKv>;4oCHjT@0~QzRg&SM?JVmx}J< z-|kFW0)yCK4^h8l^jE7&URfe@$=q5Z|k`Q7GYe{rXvz z)NCxhpsQEmMmW+t3il&=o2*{}ot!X{5!)K*czt)78jcCL+Y-dZHIrK6W*fd3n|qh* zu1J-rcZsGFQ~oaYpxh*+G$3nTWblkki{vfz}>Jf7Cl2O zlDT7v^f!loe}T5lGVG%&vtNUUNSp8DJXyPgZ}NP+eA5?4C+BY_O%2(pMf;0lt$MA@ zyu!zr-Yb8WT*PORZg4r+JsBCSh!dkqO2oBeW0q-AH+&s=TtOS1Cm|iQ`w8_ZBKDzS zt3mB3OYrE2Zgl8($|-xa(IlV41|<2fSBn0qzxGnse{J8yyEkA<)7EEhem5UCApeOcLyt2Q8tRY}ZLaPfp~RATtpJ0iJlX#6~vGHHxltso3~O%S&!ui4p+f$66P zSfg=df0&{DmX~a1hbKqrOXZIw>eiiV2|XHkGjHw5?6xCfQn02i)EY5!ML#E#ieGY- z%hVV;QRa*e+Q_04_WqnDQkd$yKx((Nslz~3OWCF6T4Fm#AU^X*AdS+wU)C^O<>rye zGjGk6(8gfACkM6X(9J4#hMIIk`ZCS%U*A;^f80=OgylQZ1omop9n)pao$XJS*};JCy4mM z-+@XV7N3;dDb}GvH)N_NO2L4}o=#DV-kE0Zm_By%oV-t^qI1K@M_XarBkS@kx4~ma ze`Ah7bGPvDM%3@20qao4-b%NppJjlS_TE3cTSs5Mu;;C%Us?ojn(IMGtaPTf(KW71 zP?lLX^)$rnE}e|+M1^5*gta>{?89-_5=yK_oHi5Vview;tg z(x%d0tt0jQ9hy%1e6+^Q%fN~$KuyPTzm-tWhD)Z2D0g`<flK7IN zmRk_qtdLe~N03Hj3Y)!OW7Ts@Gyk>B1x^4?nU&bSI+JSgpcylpp0IFO@f7X)e>ERx zfMJ8|E#)JIE>@F4d*-FIqb)h|%H5s$bd5bjy=gBS;>6Tcp_xh26mH#F?L2M6|LJvb z4G$U6v3iv8q(|UcOZ{WPELO(1DQi2wf|*kb`vyAzPA0G$+kS0Lw5{d{q*(Fs)Lw1* zE!-AY`UJe0m7L}~CbSLF7GKjsf5~v|jBcMCGi1;<@+t`_d(1M8_rP-Xr+1HV2n?@c z??OlesNNE z)2F9ZgeqSAVe(NwJfaQ_DVk8Tn@K^=|Ee&n!2a%{b1#nh4&xeGe8VGo=(K-MRK7DR z&=Xd%!rTp}d*MCMP58=jp{YY^f>IgIDKLP^XbtQ{9U)lt1g(_T8WOf#OGH2HX~;Y(pce}c#tvj=aTLtBqJ zvdRjO9=mu9Fs#gxd+B}`Pih#ISmD-OM6V80jWIk#@!m=U2=A_UzId0L)=LHYl!GQn zoj?$;6lHVdFin-_5c38z#$ecP@*p-@5$!g-x?}8J1-bca>`etQ zXZZu=aH!E9@oDeg6QPw`wx!~h(fm^tYIXB{6<2>f2OJtA^IzJJSa3?Ulq;6#(~@n6 zPUD%_ zCOuDi+MHOpylv?i`3cy*^AA4Rt5LHSC-h?bM?oAY9Y_C_xj64mQ`h;E6_Ph883f6cS1hT3|Z%k0mp5#u8YrB~%F z#e8U!;{|FV5EiXpgHoNuVnGg-rRqk~J!PpS+}OXiqs&(&>t9AO;?EWt)vcnu1L^uO zejIm#w|+oX)zd;fz!e!FW7(L%7I(1Y^Vj?IK`y@JcE6H%{%95Wc)2!?pw`{#yK^9x zi{{Rbf1lttWZYU!V4(1jk-$eQ=XReSx6NmdN@FwPU%73Rtg{|o$jZDpGtHF1->M@F zz27Y7mk|${c$ay2za?8vDzBowca=J4fBYKNHrF1{oz?VRG|&Izh5f$;{znwBhJY;L zt}sVS_$%!H0^CfYYh`X^b98cLVQmU!Ze(v_lP0)v21HIqSy4%oow#QUL{3IoQAsO9 zO;S0R5M2QnvnRP_0}zQJr9}|fB3&~>mqGUcL#LCRyf=TYYwHTg+M=xyN@y3108|hv z1;}g48A$?AK?n&4hrBz&3WG$uC|F?-QUFv^5(>zA+5x^(m+E}>&npPMGgfmvd#tH@KqHT}}jISUdi$VeLpC>#3IKl(r z?uD=wB!PcI0b8UE2CzohBV9v@OEj z<)5X7h(Eo_p;7`@2+@@EL?p@e_*LD*^|F*Xi>ofXOh@kbotV*5`E z*s1+t0IZ~-XP_m|_vdZ?k<+$9x?uEtUH?}7S^Nh>e=&A8?nocN6e0+LK(U3`_pdMW zfAmsxu|eA+U9jsQDh61&yIc8^VD|z`qJTdXK)To>d;o+G)-YJm1&zTT0k9JZ1nki6 zBtL&IQv?ElU9H>^E+~W@=4a~9DD*$kKQHgEu(&V)R{cd{09fM}i34EGUnB{Dwf-gv zY!mHYgjLb~MIr!L?{C5`2-xZuNdRE$Uxd}P`J15FaexuOAy&uXHxvcH$lnmFg!&D! zQqI2+iuLF68)B8wzo8Iz7{4L5k^66mZRCIP8)Aoo`3Jo3|9hdn3)0OKp{f9gLLd-vG4Vg5HlFU-o5TF^zhZau zFSbKsHyMHOLD-OdoIu-1M>uBIN0kLB77dpZ@Z!qZHzdPqJ4f3{!zWX4QKbXwZoGeU zHAW{-b7&}52v%6V&zL;oS_5?6Ds6|lC1;KQSn;x4$?U z)2hR6bz3w-9Sfr_u?}W`3#eg_V8S)A&JZt>doPdP*awHskbF-(o>@kUf6R9yk8A7V<5W0R_TBJ*2-?g(wyuv4V}1bKs`>>PNG|8d5W_!u|iu2)7~K>oEeIP$v@VypEDn!xe*AGIlq63j(_zN|fBE1iFG;Fz2J7 zKp}GC8bG?mB%Z<4uI77ToT||S*rI2~tN|xExn~|P^}C}p2xT*qSmb}Bb4BXBPDV0M zS2(+OMxk+mOJ-wv^WM5 zN1{h9IEx1cyhp~GqQ3IZN_TeOF_aw`cV0{ga9B-OweMsb)KB)mc{0dyaxO9Yb&9c~ zezB8qv;E}t2ZpaQO5ITFn@Qz^sAC?!B&It)gau-<14z8`o2Y0el z-VqFH9aXytL_lp_Hg5GPh4YYus-#>Q>l34A&V`DG0bg7VO=~+pJDKF*hEMn={Y1$T z%REjmBJOs^b1mYzTw2EKB8oq|GRFO^>zc~K{H^6RQl0FU%)+dz$;>}8dhWQk$;*!# z1=;0O3Gjixvs`~f(iPrR@DDd0dP5r1{@M1WG2|mmTq-yLH6qW=7@P9#lq#WtOszTF zmIW;tlnW+jeD^j11)*THb~tYX??7J&u|8UhTOZ zY&i{T^>_Us^gabB^7f|QCh*@|OiV~hi)5cB^e8qsm0Evz%pm18NA1VhG)%j)ZhD?{ zHXm%TTx34QGH{1Vpf!1>zddR8b()|$ozJBkC(wDM@-2cbh8nteOb}n4nyv)bnt*Fz z4Q#uuFDqJ;`(ZMh{{8O>8f9co5f#xw*39a~lCGp;Z7ffFJ#RV@bnS6hc{TUh8#mOO z{$OX_@lt=bai|5QCdK=<7cX$De-sU-faKoGpvC_zS-XE>5@Ozk=0BqtdVZ~mE&@oJYhq``|wv23&Mz0%IrQFAt8GEXZK8U>c|_4_5KQG;8E z3y0m%Cd%&MCKLZACO5dGu0!)h6G7Rxc6#|r;mUt?4LPRnj4MVOckW{vF{W?f3zTY( z@;O}5O2_#&CRN?aL!)?j*Oenb*H27Y_@$fKGhPmgy$?_iT_tWqaw8Pk`qfW-&*XD< zkqK>Nj~S=FFa`E@4H@yL^jlH~FRg;lB3v<|%;U<&ss-yTf%Z3JQE@>{?BIRiLm%lJPMdta`I3%O-N zf!9^V#Q8O|Swt@IYPOPqm3Gl16-V9m=YG81qXEznG11w~F&M8~c3c8&2`RmMfv>_&~Gv92s(?&6L9r?3x3Y5g~qmyCZI z0=}9nq8NJ1nr!IlY?!&;-va>QjAt#+y=t~x@20J3QU_~p&m;>sL5WM@w2yz_Y*>$ZkEFSERtm1WTd=ik$^?kVKf^yMb z*v9cSWPCwvR-55613Cq6`ixy6*VT(jvt{$%r#Iy}o@D%cTf*Pj@090ofj@t&i0lP^ zyuB2yr$yAt*jO@BThjkY~`j@)hzJf3>o{zvvM9qCX_U7bAK|k zyga{g;r16{`I&sD>IV~W1VxO-S|r6t-;(n8UNDy-2YLI2#HJiF!mCGf^i?K(x?8p2 zw~Y%F&pCGm=0T**V5oT_+=zesMA5$({UH)DJMRY%nJ+btJ{RcM zw(Ankl-L|LzW6#~Ahn$J@>1OStI@17ncM`FZnV*iteLaxCK+UgzmIpOb`+&BT@Er? zF|2tX-*jaBMVAW?SLA=$q!1Nkt~znsA)R14q_)gx+pLg6`}N_wd$auSp%i>eK}Fgb zrZXFobOJYUtQ+4PNi07WSxkrUj?2}VX-_@?DUTA{DXg+iQV%J8$>>ZlD}7G2)|=Pe zOn+(}%7j1E60#*v#havguJsjnguD_K+KPX%%fg5$Tqw#At5|=g*s4m3ZJBiH%78lY zn{_G<&V)Q8eI3Q%2t@VhuE^og!MaX(1RuScW>Ii%pyz`h*CLvpN&DMY9Xx2!PPP-% zj$x`{8zPWeFiIx=7}PN1RJ6h@L)?V?w)A0CRUAjY%yPZcF%Xa(|N@c*#`X2~CT&;hBFwu&f8~+Sk2{5yA7Gn+@t* z=6#asAQ)S!{e@vEyX~&JCBd;zPtw&`F~QT9j9D8L?iMk8g(w%c!xd!shcrQ$8rbc< z&^`3YQ{vmrPruYfj${_GPM=QGdUzGRPc&*LL78UtZuQ73B!1o`XLxEvb`k28d%IH8 z3p}q|A2WZ7SCe!ZC#juV-Huhqmz4cHv5lGVd%9y$!}e$nKQ)!tar(0!69d5n+K6#+ zXZ?#P-gs-Rjp6+0q+6MaKHTx@&<<}}-C+6<)+q+c#10vrp)0-yCOZV#bxP*RJbph) zGxE3tZ~J_ZilS1i4u8%t#E?yS*LaqNm8!(!IV^wqQy#|#pRv>%MCywFf!yc=GA|Ye zYwnZRUPBm+!kk{e@#P1Z*PWC&6w|*Z-OX_mfbeM~@-V7bRv8B09XY*jZTMC2`$#&j z^;%Z;BTw96w$Ra7Z|M1oD?s)7^ zz8$p)uB0PcnRVZ?Yt3U|AM>8f5;L6)F=vS;FFPTO+s-G=N)w}33zcR*Y?qzH41T7t zGlun>LxzQHc4Z$|wibSN9#4_zPQ@%*t4M#h`c1rUlJnKh_*Bv+ai4piLs#J*tZoXP z-#iljp7BxtJSB)t{Op~0iab1TAoJ9KpL28gZM5HA0&_Y-Hyl5N3E`Sy=EkXc{t;Jm zf}3wYj81Np!m;=gZ!qrnGYMBI&R;mglQDv;;i{}2a0_IUeHD2P-%b7 zG8~N?ez4b}P-}>&gzs0$SX~3rPK;z+`?95*QDMkPfME@wbgZ5(`1oYT1W6$&5qZbx zE^}K4|KrGtr8m3VQHx>R%qn)zG00V91)wvOPu!J7+UqdhkL%Ld_|4L-M)yRrPsXwJ zFlluR?lMgNmY0^(kJh?5m<^SVuS31$1)z(`|vT7WZV|5M67#vRm{GaW9qhnbL^p!CRe-l1`spH<# z*x*^9a$?<61wNL0#b{fI;>6YF^MJ^K);Jx@OLp6@X?2($K*^Q-W>)4vFF=3HFo&1a zMq%GX^dhFTc@76jh6BB>JW37kC8n?XCh$_dpbANa8XVU3oH!4!Z#FO6=y~ycrIc_e zD_;rbYp=1I+0ohM7Mbs0841vh*o8i$fA}8WIW&xVrmy6lf&ZOZqqxSMAxG4FFmo>$ zBX*{>ZQ&Xgz-cSa8+X4>fZBg{8Vm=mv2|XiDe>x+I3uMf-KzLdMU8ss_9Zlgun+Jw zAE)cN5tAY){WhLxKs!Hl(y0(hJyc@-!|!R-DJ`o_wq$D1(9NeYAMxbYQB_3OxqYPP z;aci=W#l9NN5O>nl19tDqJziI61edb7IaN8)&vbxA*;IGf<@(=G%kOGVhU;iC-a_) zCWTiI^n3w5H{8$hq^WMUw|U{a{JUpe@JIZQ+G~n4l@YuHW~7?(R|)*DK%$sy^uAOK z2zPEtCvb_=4fS-^EZ?5!xL(S-UCtvJ5}gkU;EoNFMf2VuTxXK8AdTAafU8mtQWATo~i%I%$MBz@nUPksI0?lFtv*4J^-y@ib z@*}+4zwfph*n4((V$t{N3RmSVqejPW>Yf;Tlb|_PHMd3HdptUkPsa1-ie=QBzUIqp z^%48^^?R-<_0gG3X-&95#>UR@ILWrg>8}Y@1C3M0gXCuujmVKr zN?mj1Ys)M7#sjHSoR;+jR|9~x|X)DrsLChR_Md}2O zXW8!aFyZRUS-!F@dtw&YO?AyGx|%5EbPCqt6v4YcT(aO$7yMbD?4_e*MBe>g!h+T_yrR?6mytIGl7f-Qi}p(~N}xQie$gPu`6s=!{P(%;86;%}qG!p8cEgOV^^quTV z2;}BE;$dcfsUP7YY{C;qp0%DI!eS!fzLtv$9_)V!TxUN@-e|Dm^<)i9mIdI}YUA?m z>8^1$Z_zNhRO`k05PvVprC%c>=A%1Tj878YwidrazY=donV)Gl)LOQqf;TYeJ zh5AfQUPg4DMUCn%#p;l!AJZ$y|L`ICe}VrK0yZdwl{*IQY~}7m@?V8y)y-vYWOH%%fveFC#0XdVwJ}G}vc|4Ts z-!4luAzR@@J+{M$F@rH#k}dmMb`@jh!I&|_%wWczY>nmUkbOx=wz5-+B1@7Y6xj+j z$dN)+_)X4x&iTFl{(RrR-p~6y&mZ@7eXskvujl){WhHISD(PWK9-tA4NL50>5SoC2 zrKKqfU@hTrh^(vu8AMZYB%*&InhI(H2n`K&z$}0OsHg&PlqOP@^+99-1Ck$|jPvrQ z0`dmXA0iZ>=L?c?7&H;EL{q&%UzP_3O#sf4FgTD(hXHy70&wQX4hnDvq=4i=5DSAK z5C9g3p#mPD7mf%~{t?NP=t%-lf6~|hzrRX>Aeq7n1<3ElgaWLPSQ3AcKnJj(Cq&tb z#5xURW%=KT^|QHA0D)kI_Wfc1qf!4+M*HFj^#2l&eEkBbAQ`YEVL>wSXQ?CjXEsX^ ziwp4mxoS#96L1(kq89-Kln`n#xZ0mQj$(wPfmjogHV z!s3WtfC^F_K$FR6It0$LQb8ht5CniDVnG@J(pZ6&VMG#@wFO``CJgW-ks&{(iaY@* z`>_T?!v5fQDHMyc`Wu}<0m_blBMnx~<8Oq3s{+bi{{~rF{J(!emYDDlL}&oYLH|G% zIG{}1h5y++eSH!DTtK70Ed&lIsUTVZfdy%*BVowr3G7@ z)Dj#bH$AfhkA4z}5%9r(Rq&@TnO7-eJ(1I5je4QoA!n6iUI}#b3PTIC&vGqe7SCN^ z>nZ4JKj@ox`TgjzS-+;^%VW}OQ-Q6Vw=L!osOw@&434swBU_)t@exm_M-OCTrRUNi z=L_yxTm>DNQz=irelR8#kw!~;M9yWe32l#xwNDJ<$9c0f5(+GT*ri)bNTTpa^UMfcLyorEi zJaJ-t;^vL&t&(Sd``8x>N`^GF7Hf&W)QBrlcW!LYeErt-(KS+BTqUrEKXQ#tgRKEf z{k&fDnV!M^oBExZioo{y@MES*ayRD-bkc&25Bu`+?$fdI$vJ!e@k;9ev{MijFgy|$ zSCW{zr(k%@zUHdH9b4}nHRye%xG1iU48Oh7q6@)AS$iIThvc1bo_StvY}2f9U}dER zIxf{xW%Hq{s7v*EYOpiYc}~=2bIpsxFUd{Z=F4veQQDh;O)szs8agJRfU}LX z*{d3Q*N(P-m}xN~#m0MUwD*!g$ElVcy`Z)JI6l9EF7CkuO)~fL7ij!Lbz#N#IaawL zr{?14qs&@J90PiDm+P*WQHtgF!tFF-WrR0UhZ{TOO8=09Pfq$A%Baqj{f+b2BVB6i z76s8kPi-;gH%z|!tvf&FeW3qfq%m<|N`2&z%x8~(W*4Usmt@~9C!NjGZ2jM)Q?4~= zBrnod8*b)h50;2btBaW0o81SExui39CSrATZNw2I`K_r0`-2-Jm`sD`t;JH8H(XyC zUY4kbb$1FvU+BDNY6+(3TF`Tn6XP@Dp0?LUh%y?fCL6J#8i`J(VgY+|cJ6q{jrm=* zeaGW}c_VFRzUjeESdSm)ngbUfWJ1*Ch6$%sU(;E(uPEKu({d)3Li}1u_rABC4841^ ztygFOvAIBGk|q%mzSu`Y@2asHYR*iRL)x18>7@*Vbkv_&^E<0tka7H841zXtqUfl{vev_vhm!(&1nWuxcRxpr_r;E-;jS>fs3wJ7= z96$N+q{D0mq2u`q{O%{KkW@*LU$txxmxo)0(qk!T4kLBLHi-(p_viVx;hUvG)xKL>7@HN|ldetK zwZ?@?vvu!VEa3-+|Dcatcrnv%S~D!4&m*W)j@E6C9?XfazEpW5{F~&&`j>$rss(~Z zQ5x;>fj5748uqwfh)arzv;D5ER)4B_2KMx|`T#5?+`KMds;Rn3>9OHjMP8+N5+HdSiHzfz3>@=CpWdhkEDi`l)ky zsO=oq1&~Wqx?L6eN^#P+`K;Bo$HGc*qomhi#YJ_^+S^=WobV@qH}724-Iu>*ZS=6| zZo79em-q4aQ%+uvGcmBqFZ~RUiCrZ+X&lkUGd}SiSCg5s$2)z$708Er8;6sm%?Cv zCGI2TLvNj;JZIy79B3TT_ZQY*Dm_vEhCeuwyDeVixkf5lJy*D&9-MTPyIj)GUUzLw z1=}6)vEcGcZDwldj(c<;{Rrgx$?$i16D2`6n;pBuEN>wufUjzkTa`bE)bzB|mBc z`gmWYzUrArp$@G{zn-BY-SA-Us_vFUKVXJny>d;6~zs>9sDT3V0 z@$va;k_wv|3Ai|JU?~J;q{Q;0ks&7}xO)9}9FO0B=Fk{$lGYB9-ihs1!&?gD6y?gC z92uDjVqOmiw4`ulODgLmyb^#KDaq%?7PI4r8vO zpt&G_@qmLMJV2Hpqw9*jSaNU=QkOlMcdGRZ4^5WdGP=5;dYrt_>hGqRGnOQodh1@) z^_9DNLN&{+U5fHAxcA$(b@X-3r$sic2LMiTSM}T%oX5|YhV<{tlqz#pGU_-xFegq2UaAf%|o&gMTgkZNqlr1I33m@C*Lm z>e$|PybBC!j(h;Apnuq8Zb96-yUl{hylM59C~+O3!o!Z0ZV~NyQu!#;`loiWfzYPg zHPzUcIsOefOqW9kui`zMPzLw2Rj0;1W&*2*@j5_lC@EhpVclr?MU=6^XYS7;*3j~Q zw+WwlO)4OD5fkDn{H}>Iwc|6)_!&aHQCN~7j~n{DlZyNlGdzgnkfl)ehfht7t*?0w zTRUCLmAQzQPY5isF+QIxsL0H`6(PS#g z7fr@P{srJc>$+ubWOH!k}n?F4W5j;fk*TgQ5UN7#I@aR1#?59<1>{O?ZvuXCs?66O2v2#l*6)(hbQ(8a(J z9_W9Dnj!vWP8R`3VqO1vs_6wqAz?~rM-&1eBqAmZ68o2q^i)UsAm9c_FPIa+0gCcO z{MHd@_&=TC`}f-i(A>h<*wRw)-=qC~XaGf`f4z)--4FoKpXlE#@`v$F@<93ktU$sb zkO)2y|NqaE%|9+vL&Gp|B-#-GhKK{89v)C%3j7k`2?FpF0U*(Egbx7WgLe!RMq|A2 zDFA$D0ssye4~k!N#g85cMY%aaf64z+zyP2RAW{Gz4D+`l4gvsC ze+W;{KLWn4CkpE6^hd$hb^Nu|__6#)lMn|0b^eef0I2te@R#WSH%UqWfM)+q_=N)g zxm*gLXa9$OnfqfNgm(u23-P`Xf8nop`wQ`PUH(FRVbmYQj}VCd3-P5eeJ`VE(6e2HOI3~?Aq_m8rf63UyM@?U)04}k}ai*Bd*VSt4Zj&v35|CQtOraXq z3<*fQW2R|x#QHjm7FNWHlGDgzCP0+8SvI@Mqgx}E%I}8Ix|9!r$w{%Ax};JD|vqM(A<2eeN~Y2xE=iA+m}9>M7&cON@EDv@&{ekI})q@&1^M!5x*Ax-asrPy6kO0*zr+ ztlD#|xt5Fp-Y+mC7<7g3Y+?1vZvGI%G@1>mhM6VXf7Yioe?AnsP)XvNkN6zJHnB6_ zJjkx0fWBr++Oa7|tn!k3) zLvOTtfVcKdf7kZ3GA%V%i^x+LomUW%zT;WC>?d}XIAew^nWwupxwN>u--pM&Ex1XK z6*3Q&W0jK(T%un}4=TEmIHSFn-IHF%?wZ%jee^wa9FB4lrSRcsLGphrbel1G+o01C z-&`+ouyRcQdE9XYY^50>EOKXC?TCnd=!b&)*#mm$f0qjE5b$GUVBCxyxIsyz-Ms2( zG>8McOiT)?C|IeP&<)P<;ubv?Vd7KXcB8*7crckEtZnG|>LIfZyzkz-T7igri7=Z- zW)K$8`&-!E=6(*tP22?a^3L{gRUt39jiL$Fv6Zw;#s ze)d?`Dit<-W5VEV1e1%GK3~!}?%JmcLmeh1f06moIFnurNIkiaxDFaO;~VVWO!V8_ z1Jt{{gJlY{IlGnHL!VkC5VP=SL}F;(Y}UeE_iI&}Nu?1VH%=SEmoJAQJrgKp9nC+* z=J&XDF;8(`QnTEyKu-nx`j=c?1C_JBN52S~(!|-`d2qN*rhQtsCls~+6I*1`okg0U| z5DITDOkJfZ2(dK2R+cR{nMxUU{i=P7e|a$x;7JAlp;iBo)4NyTF%I!L<~L6RMnP3O zX61bLoj7Y;5Uxiif|@hX#hzv;uw;|4oai{_vIYy7r}#2o>Q)Dv5hh!|E8#F)B)nf^ zbTY1{wRe!CbEo-OluXyFjB|I4gvVm^M(W_lhh!6$OJC_eBwJ9WQZhO%JULW?e?BEF z>ffOvO{-k&PEd~uo&-|&E}K`F#XZ}7r^}}J%>Y+Z0GNA|9l)OB*3a-*4Z!TqR`Xnm z>C}EOATlpp*Z&?&X4|N7s{nn9ZBZlkQ@5t!QKu84n)%| zBzA>4aqkaXYUiwBv7XtibS{`TJHQg4GMl&FWW#*(*sF{u?OJ2d#AkVplGf9fCED8V zx`n&9i=Iama6%}*%g>i)gY@d|TzS7ld+6;Pnt2&V6}OTeuKU7(K~SNUe_=^aT!Jyx zlj-24LyE~kGp?Y5!Qn_CP(CghCRI9q*GjlSVnx*icuDV=hAneQultnn2Xh*mhM4a& zmLJgadY!BFJ8%pCC~N3d60z!A*IvB6!Jp!cyIIdc>u|Mpqi3soi2lBqb8MJWNyht> zuW45_90aD`%j{)OeLR<)fA^dCz#;()FKFvy)1=a2V?um7s=>*>{i1p!LS}OA`e1AO z7P3^)feNimn5%mi@!VrX$Za6>4Z{b0zfWv8m=+v=nr1i%x$l$LJf-dCt7zm7*CBey zspX=+FMJ+-M~zn)TM1xdeUf?XFYGNSZ1do}F@~F$;A%CuA&6Qbe?QvNS;0y#a66J9 zLB%fvq7gS;pCi>CMzn37ePy^vAG+feOoQn3ZBKs zSPT-^u~GOB&UW+!*cehhXA;yVr&-p&`@B^C^IY%z)hIbfc9CIa zQ6#s1f6e<8KjqLvejV@@%eK7lM#x)c^4EIGl#et8mUFC^xI*%<0&g+5d`0!;&ZT`H zIU4)%*TicOL{zOQPb=HnrA-dZxKgIF&Kqi?=2m@4ZItdq+2|7k4A-*!Y#z;&a0Da- zIX#igIb2F0^9d1KXL#mWv<4PnFp*z6MtJmye?RNmww2H_0hb#KS=GDGat+7dSlxV)g3471X}t6 z(F#!nB`*tg)N4r$m4~lCEgHxg=;GI)tIlthfjPE12#FT!EzmTNYmFqcErdkRCh`$Y zf2?iKQ`fGjXu0azbkow%k1=2x#|tPV^HN$sBQC@w2mO^a;lQ2)ZEpjz*Wf%;iVIi; zLUsp`OcMn6yA$$u_Bpvo7Li6^X@|ptJ6iUAUu$1)^A(dNrGy7jXKjf%t;W{m)S9kV zu9L70jo}i(eE*jM*hOJZ;c>-nsh)FAe~fKnO**zkWWLz=Lv*XuGNsJ1_=aG!yEv`0gz=F=Z~5;^S5m9Aw=tr6x2Ve`i_~ zT$*_fO<1u%;g>|LQC_-xTu;#k@#r8tPHlfAwkF63P2nQ=v1jt^-6ffNGCOjcm$GL_d|EUYk_26NFyB8ZQ~{vx>dY#0(aeM^?wDUCH>#oH-g}l=5~h=Mu5& ztIXmbN1q8Ea4*m}Uwj1hn7j)HII8loB-0&?7u|9x@V=ClPpw@GIc1wxe{Se{!$b6G z{QilkL;ST+yWGlw_@Qc~P<_;jIrC%dif^kWgh#C8zh3f$myC=up{_?Moq9`=@5HDem+RLp)(NsHS?`y$1QEd`v3{xuAHvy@Md* z$&<7F1LXlk)wlU@ng9aFf9%qW({YYlNy)3zM?RAfeL_fHJF`UnOB!6F7&2#37#|S&|o7?`>8xko&`WTGqc)Z)oe;C2Me7)w%?|EjB z7*o!HzCpWA^ZJl4#pX1+r8oQBFFSoAs7qSD-4o2Ym_vOc$Czzd`nvX6q5x++wg8jf zCfIFIAA1oM*`!63{4>lcAMBF>Aho#@_+GbmCzu|*q^g{08*3bi9&T-H%v`#CoyhI( z82S7>>zeMke4wi(e>!bb8S&U{x}dOYhVBuChi9IP*9g&|U!`M60X#ID0Vg}hBJm35l^(_9exuOAX zTrV!HE@&P*tjXST!R6idC3F>7XByf&CplfTTe!M;3kNO>qv{ck$+cE0tE!E*Li@X2 zADt!MqYW_ye}1nZgU1*5lIHl!zSR4kz;KWC;pgnNy`6I|etpWzw)DGI$dOCEBG6%0 znn{0Yq>{g zqNBSTar*0v#yPA4g)S7-aSSGxF*J;`pAsfp6m#A)%v>GTSZKbH&ULUZGk)bbija;@ zlX#0fYXJqk=JS;ZVX9g^DlwHz z@Y8%mfBcHjJMax20ziTm!jZw;T)-fe{T}08lnR(Xad;}EPy zfrfLL>Gv%vR_Nlsnrzkw*O}`%6Df)7yvUOEfYq_s+L*?<@2L1H0Zcp@Ik>L8b@({? zxT(9z9C>8$PRl|`fi zNwpd7v{W_w*8!OWVOoPbtEIw^`m#}HB!S=>nSjN+DG?st;@(`dfjJs3!Xg!~$}F0$ zsyCrLn%ukfK7PzmRR>x5(=e;mnTk(Ze~Ijoj6S`_7_6BM=L;%-UZta3wsW=gbzOU8lTJPt~iH!qcosLrf!}*M+{mK~?217;8?>9S56S!;1 z;f>Q@$GL*!Yr)?qX3B$u6E+HT;<>`0!G2-NVJ~hV7926o5dq#k2G;Z8ImGV@e?1D7 zR5`7U+?nb^v0tQIHa>(@oWKsCZunF6QX6sW z(jdPcgYrBBt#qem%QRDJ-r61&`pT=l20Gl-pZFn#?V+DE%hzgzS`U_7cfl^DtnCRM zP^S*`T(r8dyv$X>WKi9W9@1xbe{qSDKpjddaOKp1$0#x;I1H!Ha0m0wZ$o@8h8=0nzM*Z9eO}Aas#P-odFebQ$Rb@!DY?@Fj_S4M?hr z5ZRY#4DTh+_6&v0{xH|4^$ENpQZ&N>t;;bP`Du6i5mPPf@Yt2OgfU-g;JfJiI7${g8>xswC%rQ;Bma#E;FCagfr*UMjPv zsv^@m^Gl1$_<8P!7CxGZhCye(ud#8=qEMEQ<)%U-)qB$Rx!phC_pkT! zp7YQ7exK*}{GQME`5wKcPOd}-Ebu{W1$+?^B!Omt70cBfqyQj^LeSH*!VpM*gbMi9 zkO(mYKsp@+7-C-lqyiM0nGwZ|N+ak2R)TN~$ z#R1=-9SA1GO#v%#lllN|5f<=&dBFgTa0p~a0e%;PJNa*z`dQpo%;Pyi{-5P1r}PgT z@<(~WUl{`b0I>+c0G0qoF#gZft;iR1ECfcy{y(Ek5yV5;48AW90f?Y6iL#3N1we(i zs04wXP!XF8a3G!#nd~Ec_-8Bl_$G~z*IQY$7)-;jxlV#k5Xu*A3JySj0Ll;cWDWkP z@hM@b1n{JgC=?JU;_tUFub(cn;j;xW%J&6~s3rh}VNfsu-ypoA0-+#)@?k^*AQId$ znZy@}@FM^|nwCD2mY<*p!kv?hy-DO6PgD+o_O;hnD3BI|J`Js8G^;yTao?+dR~tH>n(s?#TP2_KqG0ho zzpl;Kv%&qJdS|GohQCXLwx7#Cp=CV~5_q|2&DdtOn4P2zdGYRlT`H~j+h&E!0b4O1VaAW()YTbjz_Zy{lmpXU(PnoqiG0fR3pAfSVvi+zKQ{LTn z=uUv~n2kq&UZ818UVE(^N2R4;25fW4O~0Q!;QB0O#9|~ngtP#D!I`5`ZJp`VX1Z+| zbzm^C7j|igFj%X6Kx|t0krp<=YDl1m4%s9r)Y|Lc>@s&S4u^wiDP4TGw)O^kI&2)=^64MGnY^6N=r@S_U7EkIq2}rN3lmcF@9rZ z(oS=K&r=KTXc-tAwQs8yCyZA)cmK|qZ~wOaO19G5d|An{<~`$)#5;WHrLc+VI##i{ z6}C==<0)@Ww(dWwQlPkN-T3*I66*SS87-@yRt2uPt(&mTn`QdwjRt*-U5gYkm}ca0 zx-2t#TvHSh6I-s&{bROUi?XlQ@Ou6O=o&4uXbG*`Zl`}bEno~M@I{IpB z*OYG3DmpeG zQ8@EH_rc&jg`}6Iqv=kKch6uAWcP`wqP|g_Ixnfb0O@+XqNZgw>p+j-8S2cz;Y7D`guZO zMqr$!kM5P<+;^w$O+2(|SJW|orHottkprRgrBRi!HoDV1Z>JhZ6i(F0`Gsocy;lkD ze{73UX{w@_AKRb&FBNnRw)^aj2g)j=_c9|SoOdT=i5qBtlp*_r*Oh2- z0fzI_yoZK6Pi>(du`N$1zWKCjtJ7`WOd2s^^u(IKBJel)R|gk5 zUXyr~b8Rmq$0=kmqN#z6^?4ib_xq6@&DiNBp4H>$oh>=T%ZiV+9j_g(>~gPN-FIp{ z+OGR>bB=1=+BZQd=|B;yC8&!(%!OpAca45C{_q{2^>R;orKO?`8$GP@8|x((&K%V*C+) zM9|teeQ_*;tT(wjRGw;4+?V_9^U)i9c4gx|jAaI-E-Rn}={ca!MI53E8A zhJ+bU%U=jbulN$CCZny4g$KJuV>WXwok2dqiLZ+=3sUZ_FAgT60nsX)AGxLX&-bcvI z61IlEHrTgwOR;t2LIQ+Fbk@qnLt2(2W>i%6={Tg@`l+$Dha@XP1c!iR&{6^w{Q%yG zxV@mY5 z!S;Lc*9~!$Y;OFNtljUv!=H$HQ~Gje186kr7evZf1JP(9-2-X1S_1d zD~Y$1iVxbx6mrl?8N^?Fu)NqzsTf^&+t#1put=k*4MH8Ji2MO;_B&kfFALTzXL9O= z#lOy`?H@dSf28odTT?u_s1zN;N`WE%Wz-21jTRqxX$lCd+9dq9#@S=~KtRK&I~WXH3^}uk-2NSQsS6 z5*j@y-{x!EI-aKo>husYK^lR#i_+gsKnp9Zr2h6Lf3YdDPuIfHD*YSE8u|1K&nEEE zU4QCtZJ@2p$s)6g3~kbw`^xkcxf?RtN*@-4B%6M04DK zo6D8Rl(S#X z$w{Gjf0Wj+VuNSA^&v+FlH;6p>FRbquQRkPvo~&n^E5Q672>$%pCQE@78#1TN88&) zJxtn>qq94uj&0Cma#^=Jjw~9QR@A>cTq$MNw^(FfzhHF6Zc=@D_IZ*k_9yrC4~hWo zHTKS}0uVXZx0J^}xp{}zW!}w6)toa1kEzzm1 ze|YH}6#__X@GQ9?5iMi}>O8`@E8I2AWjP(r4W(V`rrO)JM2Gy=ZnBX+ZSF%M{7n=! zY0Kbn^!c|j(l5SIa?2Im3}!M{$)8GokYZN4@_AcTrt8q}g@Hc)YJW1R86KY(Z^9n9 zr6sZ8@5AT+CJdCsxCRqXV#}XBc@Dd6e+`{XCn4;P5&>c}6E;;Ohki-8sC=vxnblNi z{!+?`xJGwWo7PZ~q?r7|Eh=L^&EjX^9)qdniO^=r=&3=gC9~bu%a__JT{B}Rxftk+ z@7?lJrQ%@z>vD61&9l?}u8}K(VN$^;kwUMixSWeQKJy!^PQ?3fhd=483oa$)e{_%N zJIwmr>VOlr=-dAM2qU!*Yu6}ir>e7pgN+?+)%1**ln)MSqIF;Zro87|0VU(z}-_1_)1zKUeVwxm+ zD&chPU+wNj%QXVnk>$@OjqDc3M+GC_f1T8~SdqX2;!yk6GAU@yZpd`le=T-D^HRj5 zCGOZWpUW$F4h`oG-NhM3No^(m=0X(f_*{pFU$3lp?{enUuQ_qkuGQ~I-64D0;0pLd zm5pY9P;+EJ9 z6u;2d?lyT;55)pBSVBCGO4u%Uu|C8%R0Ox+sk5Vg7{`6M4r zCwiV=?yY|3Fds~b}fjaS^% zz0J>e=J1#g$hNB>4IkyY<-;BPx;y@f+5t#GTzpLiW#{=nfLFWMI5OEd-me*75V zDl((o-Unn|E?8@cLG3*aE@ftnqE`2RHWVQx$k@ha$KFKxf8cFAY;R&-XBai(pJZYlwd)fZgKq;7Y>3OdC zXO(HT%$->mfB5>uW_+JBu4GbQTu(cOb3uZd$JaUQSzv?rI~-*$JPXIwHnc8E)P>b@HaLaI5 zlVY-p44@)RbC5Beut_!9vd46S-F^uGcw-+qHbC?Qe_O=+{p*G8T0uwKi1M1RT62kV zgS2YXV3_9|1+Gi5tuEmyVPm-D^&LKT7od1M@q9q0ux|~8rG1Pcy!JNvJC?>%*1Usi zNFM(r#)~|9;JU1n6^q%W621Qhc=~RyG0KJ65{rBGDnrVrn++A8KOn}z_=B8KDV8PX z>DHoke_VM8QNbsCW!T#00m-t%ON#(Ow?QMEITA-C&g+!dZXh_zo!z&)?P_z36-P?l zC#Q5FHqAp;F~e!hv{=yOI>XVr%`G~XGxwCZhRFzn$ZmZVtt8rs`KuXc;uO!y6a+4$?3pBXg=3^oB|bS#KEl2!d!F0IQ^dwy z^*xHZOv%nmV+#jxA^Z9eEM-)Co3{ttRr$%zqv6dKiwqsn-eZK zf4*Qi5<*G6dk&CmIIK1MK;r|GK6LJwLk_*lVt~*-#K6(4NiD!H{l&th$ViWRe8xNU zfmWWy4&6yI%BFdr;I|Tt>5SO?V_7toC+1W{mlaY*M&D!8}lK zNWG`V#QRD0fU|OIXh);Rx>At@&8R9@e_OnZs8I2vrV?PaCni|_AjX~dHaE-2Etgge z(g$gIAdn%LygK!rHFUJc^Te5+nA+GyW7Qq&OpKe$#eO6^okgA!OR;*^WapbqLa!a6 z#nNNz*!XU}B6^>w1|E$2m^?L8pQs@)e^D`Q z*S(WGA`&TaC&qo)jtdjA($KgqjZL>9{oY{$)oFkCns#>6D9mT`etygSllPe^)|#KV zs0b1*?}aGQQoz^A%lH;cV_3(@S?8As@P?`rE-EQa`B`!Af}Atd3;Sk$hnd8R1^fL= zsAQq*j^1)-it58YAI?wIWVHmvf7+}<`}!{>@)8wJ&$^xvZBRLhJ-UzBIJTuOEv~8E zN9#5b@@Yl>W$tLwdldaW^VN6ChZ#90y;o`J3LN#;)F|{uBasxPOXuce+1BKO@D-8; zCitz<;HB{o3Ohp5*F|0u)41HjO?zTa;&^BIvL!~F8BUR^f64p-f9jmZ z=?qP!K&r+%`2bY&^|@w_74pQnqUY<6m5uyyD82{Lu1za)tqYI!O2 z*B<1f97zhc9sXn}RGrs;fwQqS3$<|${%{`729B>%u?)i1HxiGXtWm3cXu?y>*DMk` zK8)J)V&#sJ-yeOy!7@=@fAgV^SUAYb7bnFwgqiof&irPHJ+;acvH8VIoQ<<(2LdLa<6Nhg!K){TZwJUVO{rns6UT-P2>Hvw=uJ>_LQ z%`ogsW|-!|e*&}zkA=*@>VAD?jhFRYV4RxzeE(~`VQ8VGQZ*z*ExbFX8}&K%-RfjO z+!_6kru?U5t8)Y(fBi?(+09=Aib zS);R@N~sz+t&ZFDId&OGFR!lHXha5EWRq#02@|2ue}ugHHDxTw7ea zB^<>Kw|BX6e(mJjA$X{T#d8?QZg;m+5FW!*PX*4@Y2uuI0EpO0s1WDPDI1D+}+i?@**(E!WL8c-5}*)+sallisR+i%KUdO|$?0 zLAX+rf6j>VC3@xoQVLe@)zxSVg(}VkGiC`aqEKD3Sztd@O0seSntF?@L=_pkew??J zALCXEOe<1quW2+s^Ob*(H>(iFeO!L^IFhY>sF1BJ;ZgM}D53f~G1e={QL!*Au7}e0 z9Y9j+CaD;wJe^ZuW?i&pW81cEqhco&TNT^J7uz-}wylb7+qRu_ZvVIYJk6K=b{^I_ zdyKh4(oF_mY2S{D^2Uq){LV$Q7|RL*%m_!YjYnTPcu7t{Xw_0i6L>C-C#D%J9rT*u zVOH)pF>?F&(1n#+(@GTGF>U>UtF-uSRdP%Dmn|Zc>k(S^RI?6=YzEDd08>5qnMhAD zDb&Egbowk}_Jlz73Q|9c^W*5*>web<{rN22irwC`$+#k)65AxR|D~d30vvT2Fuymq zuOSe8JVB@;g*A6@+P71LHYl49LcW5lO2)R12gwL-x-tp#2q;q4)U$wjNP$mXNEO7? zD!QLEUkTsU+>*Wve+hcepuNzkh@z{Tuom3Vg}vUi-PKs0Lsq#Jv{e8GKR&JYpJ?YgkQhb#XKfoMq^=jZ6`i!*p!&k)l0u+}$qN z)M4|KTz@U4<@KiXo-|&k zT)FO=Q?uXoNcXnJoLp~iaqwvo2e&}}bN%QOTMXfIX1;e)!rVD4>yffDc-cJ7xBq#5}|nN%08l1=eS3> z;4DRrUp8$Ws_R?K*^`F7mv6IvrB4cHA|8aI;MVDnQ8eIg7E}t^W%NYW~e?p0hOZrt{qXHPHu)CU#5+}zY8k9FT$G? zG?3hD6W)HbkO`|{J7R`WKRlfN#Y8aMdkJYrZc)SMA?M5ac9N_B$YTPjp>NlZNd6kp zl(krxuBV!()lM0MLJan4w$L^EgVR88M7U#^iR$7FO^dVH`z$x6Ad&x2CrM$T?mDjltd4bn{U4C4aLPc z7jzVhD1axpvC0(?kW(gXPdK^)F0{^4IUGTX)_oO05JOr8VK+HP=HzxysMrC=*&tQYTP}n_^*QJxm(Z z(xJ$7nOAuLZA{ArXL*T1*s+DO4x_#-yJo122+M}$TnN7S-c?E?f!^CClEi6D7A?wz z^f*-2i~WRR?{`~8iZNqd^$Fxv{0HBbd254pu+$kU3AaQk%Q(6x>+QblfVW!Pv;wOr zA>z|lu>5zAgzGyTrxOW|n&_!=Vc}}d3`kd&A0Yq`_(9i@!_&<%7c}jVRmI-{Q(&5q zu^0kEk;*9UOePrP6eV^7-(W2j3jI5j_DZR-{)NGs*2li=54X_>sqAv31yqgkqlX>a zN?a&7ed0HcH$lj&vGZ3{>!|MBM7CJHH?w_iZ*1Xj4$+0#r_kUANpf6iQYI4PJ{5?!q|bf-tj`6w*<)1_a*~3KDjk<3Nk86o52MZwO3?B;jJ(9sV9AQ94p{qE1zg6EjT?2IFJ0d}PrF<)TmTxZ zM?(>kqd8qx&{FkDtKz!Hh6wvLxJjkekd7LF<$V|L9a~F`xZxd_M=kvHc81(a!J<}L z8k}|-r7Ll@n64_Ul)Utu+fO_gS%LWILvkyJNa+Ydrm<@cX>YSZIN?yQTqnqQz6ofX ze~RBmZ(_B2-pIkSa6e7}b3$Eu8;TvT7_pbj+e9q?it>v3a9S!FjO?7sB{{KZ@9_hq zj~=SXpH3tZ)6?e2+C^zSW8ZP$$1nU{QS$xPkTSC?ikU{v$E6kwP5@9oTXY}!zZv{p z62BX63P{x=)5w8gvEe(91A5hwp7a&s)lqI_){BYy!rP?Nxa>H}jBl4I>d!EaLT*pF z+1cX54VD@?dQvpE3F~&XC>M7N3mpc0YKI)uaWE2(YMILNBIft~mOFD>WS`jE+r~UL z*T=)`AvZg$-$SnF?(yo_$3^)pI{~YK)5oz`Z><>MLNy~waptHBJM5fJ8R8KlSF(}z z_1@$G8^4q3DAL$QprBH`*NgRGyLbQDSNwMsOe6mtq$KP!RNJOH@DG(>zD*>+08Jrd zmglj;&36~}t-?Py?$AvcGOXzn8udoVis5wdUVhohtDl!J%FrP-+)83v3hQqU7;@Ry z$!N&c<%MRHRF@?^&f`e;UqF4v39|TAGd$hQgramBhf?nNjw6?}=A=1Wt0d~^9kp}$#c z=hib01R%ZY{nx-W{x!Op`Ja->@ z{Bh49`6i&Xay87$SbK5{9#dE-=mYc<;0MwhoYYCh(D}JJQ;^V<7Z*;=(E&F5-`oPL3*7U+&{FDy0Wb~# zEqN_EJ(!u*N`o~po?-f8K+Vi_+Ni86?n?3jxa*dU^Szrms3V5Z}GXqEi6i!-Z90Eehng+F= zyiN!f$jUYbypkK(j~L=#h6Yx;wgDVKQOggWH4Ro76lB#eCi?2{2wJVFA5*ey0FXKg zFOo44fiVjH&7XuaqD(6wjrmi*<2`7M9q9UBTxf+@d9@mT!sHFWf=qre`7@CoSwsK| zgSX^j`+%NgVWG6(AQ0!cxOO0v_`aYM9Y2t_f*D)cLd-C-SG%CMt&JR!l8$%)R^-!2 z)Rz)DbE)%{;F+vAQz(3&A8jH?-^{a;-HjESdYtefQ+Ewdos=`pDh^CuAkY!5n8~Vg zzYvW77zHHA7a0$%&Yn=%oez|;wG8si);r<~O4mb*ty7sOks>iiJno0Wyx1km&{uf; z>c0j19i$)p;`!uv7WZ}Mi&kM1i{S&@ ztR$~@Rw1D?|IUz$@S$4(UO)`JgR{x^l8H;G@b!|(V0zlyirL(Ac2rN5P2-|6Gif1F z?@J+-Ec0VlR4IK5rn6GDPR%ucLqq}DXmUpq%Qf$7`KMi|%1bsyX#UdF)jtLZ{y1lz zS;gs>(1DGEN-uP$gmdr4;vQ1HI42z! z!z0R%Sewoz!|jav;?VeYhB92#zV*Z>D1q_Dg=y4AGArXu+<_)UfqO8!WHHbl9K>nJu2BTZG}0(NN3Po-A1y}($};$sT9P!d_4fN7pJSitn_vO2*vrpt81UlWPzze{A-(4^jjW_z|aK;Ig>|KJ9J%R;J?Rr|M*53 z>NUYXyT-5bBM@sG+Gl<%q$cXG?#DQ)XJwwqm=v;FF5jrmjc;oZxTUNwYt9>YsIL#nxBT zCi^}fKFUhx(EIlm&U3A%j%r{c{v@^Y-*Hlh$=Pl9$}>~3BJA-JdK{9kpsPx{=FC&e zO2N7MW<2b;Wl7w3ZauYb%LD4Q1@!D2NFyseqIw8vWlH-xmH2#MY4-3C#&D&OdRkR9 zyg}0Rmq>a5c|(j<-DGt$le)vwRPYbaQ^bu*&A!}G>h^+)j^`HggGUSvKw;lszmR2Q zI&ZfcGqZBiSi|}Rl9bfrvKVFT$W33@EGVGKN!DIn3rNaizC^E6#(nw*jvbF!)IC9Y z?KHl8f0c4DmDSYCS8)K0NGB=q!_Ls#v`u5Csyl)KR`9o~Yt9{+xaIK!;{*WYqoSo( zT33a~Ct?`~SI}LL?-M;xi16(*N^IGeQA>v4@V z@o3U43h--(N*6$(_AOPa35Hrh?Y=|PpYgJj=+Vxn`5cN*{*=1GoW4ujT#vriK$Bmq zacxR~pe#2MF{csh;#%BIwvp|M<1VQ&L$bpHb#|^%H>FJnNtcoGEc3!sq>8LsI#UCF z0rqJM;x!`Y^T(JS-fS}qtd!z_yw`a>a<3(6-&KA{VIqc!>Ntv}(xlo@mu5;h9-$ z5fr7=3R=qw80_Rs*FGP6hCKpQdKJ8oPCeX(jBe2qB4&QZh4UYJ5Wd_=4#MdI#mLwI zR8rmJgStD;ex5>YrP8{^F9k)%HIO?1|%g_4gI!0#d$)5 zho+D%VV{3uy4+@|ms4DI;29<9dl?&Z{}+^`nQeMGjlY5sIcf8Vm0?RzYH+fJK~ zVZJ^@6vn5EhpX#5a!sOE?c^~Q^m%v!SS(9O)l@mX=*i0Q0Gvr&j~vPhU2O`CT0``TH1i5%M~4>{E#y*;Br4pcXbv?H$n((AJdSEFlGENpANE-)I|1=H z-kVj&d^2G=8H`AU;MjYIiM;WSO&zFKuHD-ID{zZ-kEO^`~w zj$KV&@T(DcCv%vI@r>rh`BW^0bK9*DmnV3Vn&f;E_>K|gJom?%A5~9jU8ghj{GN5< zswb){L_wY3@g@K-d0%!nf`-3}1If}RjpGb(&Ja~D06nQf7C%&vx|*h_igN0R1+W?H zfBA>fQR4WI(NVMno&bTUD5W*Zn`j}m0al>`n|f6YPxVUvnNrlH)y1^rQbALG_@4jr z&q)=P|Ht>lr2w;m19SZUiqA-#V(nS`5yjP4Yi1Z$BP8JzY+|qGN~5EG^9j!4bVKXa z`a+%Xh2Ny%)}v}EaWj9aBvn%4Fp8`lD&5MRc#d7aI-hIaJGP&vpZTuuyRYxNt}Cdl z&hsoq{k(tCi58cUEXK9_g(r7$_^F8eLqnGVSeHN^anfDb|mn@9*gL=*&!BnRTf&sUU1_OpV}sh$zc98d!7JVrBJ5E=|=n|hC#jv0(>1;xT0@DEdh2f}w> zh-KFdHLK32AQ(Wf;t7B&{uR#MkdGn)#2JJG;(q|e zeNCuOAlTFwcZ=jNd6X4cjNwPrg@Chz0tg$OqoXEWW2*|;?KHK_~ANEl)MX*diW=$_TNE@R61ZsHQb2OE_B_+P*4oACo#fC@$$O0V4`g@-*4xxH|EIR!Caov zu-DkATT7Q<)E6GHiBtcyJ`IUZ@fS5Dprxe5hTtqb8cuSjYW4mPM7!L#%PWlC)T+yK za0cMX^NFU+J)7^q%Zwp4 z8BBfesS}R$HhWO7@7qp*Fxmv|{ky_JF-Kg&M}eqZwze zFX1s0mAif}sbk3XT7|1>@dBTTduT#6cc%^y>!x;Cw$;nIGPmx5mIYclMxz`89c#c2 zHyia1ssXB3?5F&)kdOwas0@C*V>_#5*!D-V>vBKJR{L#ZTAknT3T55~7Sm)LN2h{u zm|TU)(UlBQ)tj#j+J*ic6s3-FmP%`;u$VvFfd!~AOgYKy6O^j(D-ZmKFz-{B9Es=l zn?fvLxH?v#=7(N18hxSTq7#bsAI5+>7fhLOd^a%jEh+rN_%8n(o~=QJaarNZGwI|2uf20kjty>J8Q?zEM>54fQVL)ck$AXLY}G zhrHIb^IQ|XCwpRiS|029F}^+){pD1B*g<9k^KWNq;Uos=JNV?2UHZ2(5FJ1nh({w^ z6@iecgB}tzz5CV`SEEZUm!koJWsJhp+%gO{G!4uaZvz)u%k#;^VA3>y3rwC@tYO#P zB%GmB&L11bypnOw2l2O+PXtZVih78T-JqjPzSBvX*fU2R+EniY2gPKykWEk=(}-Rd zT~iv3z|9x??ZYkd&wn1O+~t6(ST{(KGYeOnvc6hyA=S#F3t{u_^T|?JyBt$hO&F=j zTvaJo(`Q>uRJSpYx@U(Z$p(yG_tQg_97CCY#>J=0C)bMe%u3B9b#Ie-xdH{xCu9T+ zy?s;`V-1wQ$K_j>j0oGmVWt%Q#S^;lBRLS#W?VdLYCm=dP7<6GfA*&fm9k}3Q;etS z3~so;v#2pwac>$06S(E;U;Tls2)wA;RYbyiwURwf7Ja5aW!ApTHPMB)SZ?LZvu@I9 z^HWer)MAC*mY1o{cIPfh+N>n}eT;Uhaw}kgv_+hbi?%-3Wb=Kj+xLL&z;Vb=>|@nC z)L%@i$G+<4d*}dP&J_*VfL2Ryyacq8oR5qkt%RABTK%}Xj{ZQ5MA z2sTK-**d!hdJ!646(@iBXUfF5bMPT;WO_>1o)^03I9volHXDCT zMuhQEn74$6+C|((8pCw3XV%T2xh&3=Q8TfR=baImN(X3i)}=Ak8m+p zfcsO4Rh~AbCr3muMxT{3T%EhJ8N)s=6IC+7(oHO){|X{~RjU zR9Cs@v!lei0)5lPf4UURc*gY^pW@@!e;fhGiVivYOcFs4U|tdbsv9OJ-7Yhou7gKD zPT-Px3?-pOS{nlg#c(9S;KfN-9PFAZes#w7b|l0NR+#VlMkzdwhm)ZaN(%>OCfkM) zZJ+8(er0e#1R)iW%1ZD6Z`q4lUEmUW^Tc<-vsi_>QSnz8ytmYe>J;?GMD$$+G=kxn z&6+7Ot8h!}@U&J5ZS%8R418f(YZSjmyl63nf|8dS{mxchY5Bs|kcDve{uf45oD4XD zCVK3);KjBg!}S?Qm+O&};1C19-3x|bgfDLkX}=Xb;= zke%>#t!{Bvf5K$mJftpv7#G*nH2}$JCBI#H!M@RYgTn{&&+v(arF{=Ok5gz@wVBJ@ z?jMQA%VzNqbM<7=!T_s}U5!{>Ek4kDp(|`1c5N-)Gy$b1oRjTBm41_W{H@kA42%80 ziiS=Axw5wp{d#f)p!$SoP8*%R!kD=Eb1D{AY4;(Tj|{gbo+LKfw3hm1v40JG_f0!} zrlB9G*_0h)ODki*W+o)BuVRc50#sNPM=bAtP;-1WE3a_5kRj{LoAT#2te<9J>TX2W zx*Br^-yN#Y%8=#rI6q<3F+Z)LGHbx1B@kHCl(k)i|j~z=)8j^%uUZff?mR^rFx$K5;AxJ z*6$x90r}rDp(cmAQwHXy1JV`RGFW|PkM)M??{?lUF_{pkqH2U~QET{A0`SMU2I%mH zV&Z~Ybdwe6c6sy4tOE&G?v`R9LkFD|<-UeHYt7^JuM9Q8bd5L7ik18ff|E5}%c$r& z>q)5oD!)EL5ih>MzbIjLq=;gq13?_17Yb?tz<$pCVX522KQp(Gf|!PoMyhGa&&>T_ z{-2qf^ZzatZMi7{ZURod5dfyANz#43wlF+Fio+`u`g4+iAa#mHZt9m05pwnOppX^f zilSK*7R9F|*rvXh0h0g>O_4m(x>zB@P{}}&6qA=AZ-IoeHh{#%vAG5ouwfcf*TzCp-_-^4^elIL76~I3=jzHON)|OhB)B>t`?6jnEu^5tZ`|UqhStu= zs;Z2#P5r~~t2sbb=9-WV{}&~w>G94UoIj|lp#jv!m!R?^(Kibve8VRrwwRf+c4=Eu zR}nqf$Y%}Gf)s$@3<0=8Bzv;T52LtQKCWjU$?FE7^{esH4paw1`tB`*arOJy>#M8O z7N*H<>B;`3hr0}B?k7D#;cD~z{~8MB0c0{a#QX%>Yr4;%o8@N({S2MyGQhqMg_@kRSp z6UP(>Yl`?9`r78NGi6)54JTZS{v%aFAjXY@9D#h}?}&lrRRfG~fZMW=c;7f-Z$R4$ zeNp>@9_&!S97jJWh>21!?1bGD-$TKWrw#z9!Ya3%#FphB6rysA+d-vePnk&U`d=c# zVHsyV(11Gi=8_oFAX!B>h{2$To=R1yPhr`0H0t z*dbxq@46o+!Y1g)kWkJ15hJYLAxWGseMzD6t-gPfA%N&l1;USI5wcGhRtx+Mip-Jq z^-J_T`^T-IO%+7i9sAKOS{>h`!>ppmKM?_b=$klw`L*D`pb8}2?j0gh<4mU&; zXuBF%R3p=u_dS$nDqO$Y)icXkZcz>=xp3y_OCcjN#srD{Jh^~;F z{%ycb=&-HuR8co>s8^p@f%D+jH<~zgYJG-|%3tK!L60;S1&+m7kGs5aUbBSXHqQWB z%r~#7vPpP5*~Je45L`ng3fp#V8P+DA%}Qsv#^s*YJbYbnYyEb189eL9629DZd@4EC zzdyK-OYLfYWs9kKz0Z>1E5*iJi72Sm`sHW~Y8+mZ)uO#3KIg+f+ zX~fmIV41?c_c2%Y2cHx}u?n7k!P5ZTMVAkhUYQm_-8OG1d|whum$qMQ4%%h9EklH? z7qio6No+VqMxMxctRh|?((fyx&KN>p&&oFb^q;4uDZJ32ktBgR`fqzYJB~zPn;^67t%WU_BR==y4KW3RlXApgdszo7TxF&jH*W6!pb>qdO4Ke zzAcbGc`#kWaIcgvsm3`9`{D7Y$-J5S7lv4_8TtA4B1^2)zTZXlV_(j31s*+9$}KM@ zqf_?*lUn3pO79H8{eD574w9MUxskp;epPVP6~npO89F}solbUixdFco zE0CaXw~XmzgYGzp$O?Vm^a;VVjh3k#W%iAv!5#))1pGO+cIh%y4Ct%y;$l(O#VX~) z7vjhwW3~d9zW|v4Ya0aIiSW5!{uDw1lS&}FXWdXp{P{u>#PQU#OSMsh%qTpqMm*w* z^tGh6-}0%ns-F~sWZo{^89sHF??v$`=B_aQgduTFy2vEM^9m-eascnI=|xqo0@jA9 zjOp#g33imhME~m_B}ij**tRWrGvR*0s;(CN09}!+hcd&Nju!$DjID1(`KVLx?EQK| zBOyhJRoK+_ZA2X%Fmm|5e;@TO;a@w^b==ja zz+B8s&p#+7Bs9Us((=L5p1s{qmuH_K1eP7`mgO-Z-%K+dnfu}z$2*b#3A+As*;(- zTD(|W#{=WCGQQ34B zZ@WbZdTe5EbRK8%zLn*$T)k#p?9PwS%ITI3c|8)mYa?APC2Tk|T$#+BLrcQPM8oZw z*xn`iJoA7ESCY_e*|ZuGACm9J!3ZlFbff0Gap@DxIKWObn8%oFfl1)4_oY~@y>GAI zae-~gO?Q0<9{x_{lt3K}m=w>mRBvgBo3-vWb8H(I;X`Zf@W(}!=0^UA7WOa?G-QpTYqDVPL`C-Djl+HP zgV?OE^KgpZGY%wf<~gZi?>U89Xuas?DAzJdS0+z^D^&T-9KVai?x`~duhj`8_(FjR z_ZXmMvq4Xxll(_zOT)@`s2a?k3=Tt9 zNJoT@Za-W1WDm047W(9`zK$$OBln!e(U_$LNn6`$W9|h(AE`PUh{`j zXkUHsDDtj_4`R6BHf)K-h+=88LwlUNz_3Ca?1!#h_>{lov(i=3PLo+6f0DE#bY!>~ zf#>}gVuSNcJf61PxlYnlno`MROmp1HGbVKLL1`8dT6nQ1tC4^r?WU4gsFYXStT zu_=Z~wyij1;F55)&FV872@Jkp-Fcj`UOF=pFZhJVH0(}aR$1i*uKq2iM`j_YI9qL% zI<8X@4}w2A_rnMLjjKRKvw|~pCCN@0zu+4JCp$?L8lz~>`#fuRdrSr)+-|8PvOrSc zPubbTW9sWG?AF9ph;{z8z`k3~*~JSIq@gHJb;& z*qBH4Bm&wj7jcVX$K}mQ&7UiHSFd-Ytu5W*eEI3s>+W6 z28nFp@g%F)*+)AafuXNG+WMJ)mfK^5a|`n(b18ckk>hRwT;W6ibOpaucLxzEIyS!~ zt+?m=!_kQ+&bxgzz+oDP3#d5_!x| z+f9ysYSf(SSN!%M@&FW|SH+wdA)c)b&Ou6^!rDu;f0RF9Jr=2SQ97DwJ-LF?@>l7| zj^o~@;g*Zk%`IeYDPSv_BPo?X=4QhCE@tAbbHK5d~St~t-Xj|u=3!d<;X_5oR9k8RZ|{3jkE82aUk zyT>s_ZmGZ^g=g6ER2c*Ap16VYd{`N-&`-B~W(Fnlpl@)DjV-9YWT5cz^c>U0BqJvB zE9!3%O%7sQ2p{kPScLCYEFT|VS@ud5vl7Thc)t=exj;;=4iq^M21dNKq*xm$jjQo1 zNCF+aep%8Mt^*n>0BbKEZE-D(Io z>pM9{KKv~}*9K1r`Oq0W4Su=b#!2hd^n~o{_JO<|jlbIy#L-GF?162x>$GU1y3+P4 z8GBc;^=fWVoX9(}w-^DKioTeT0F%){r&$l~%SkSf_ z_H9r0MdzI7MzBLLMD7A@;mJ^Tux7b5v(c84k7rkl-X#^etmt2;MBhn*s1Z9A2f&?- zfVGfw=>c5lv{UiGg#zg7(%jck%-(H5neA52yu*rpJ{lq=xadlRpE`P~2N&f~cL|2X zfAvEE`IH}~ZCp9ogm`mmzNP+`%w1pP*;z?Y=~|g=`=>>1oBT}(Y*encZp+JnRABz(E)j&Fvye4*Y#WJ zN*i{4;a9C4IVP zMgd8}FgW_E`1YtfdY$6tyr9g_auO%~7o6dOn75{rxzsf&*_4J4%_jw?dafGr{CPlE zD5qt3hSpL<4nbqFFM4_3VI|=dK?d64R_nNmWhwsaURzTct8bhETvE={)hSJsmlN55 z-1rj(1Yo-Uw~XMAZv=!T7oV;|5iFX{5Z4M}O;K+NTo%+SL_Bs*EK8fsjTej14^CcjSUrKtZ zFB+rfZ-`~By3vC&T@>~uNO}A*x1aZQ&Bx28i2t_Ktr%rdq1i2-kq}ER0Go>_p zcxvw#biC6?99rUKP|e8O3y^J;)rYehc0+jHzIJcQ<&KhLu6X{#m7>WC-ujExm8$~3 zB{=w>qE@pBLe9luif}}f#Os_rU6crHA!$;DCYC_*qx}Y|kmWo5`uw=&x?l8i*zIL* zCq2RF!U}K-z9&m$&@4YC>Cs};bzTB|J2=}dGiZNLd_{ZhP6#Q$?j_e(Kso+y6&s+o zMY(%r_oqO8;$$X)3Ro)0@PCe+^qGUxlq+8Oln27jVImMB^>O63cY9uxxva?z*XCs2`Qne5e8lKGNsMV7;jNbCqiP z&Ns0itn2L7$bIsgL5>)u!_iy0O#ZyZA{-zpli|$`fn8A8-U&zcF5tRjC563-PfA}J zH8z?x?78^8gB|a#J_$A3k`Rhy9L6L?6VwVR!qY|DZENCWVgWTfeUR*z<#XrT=T%)1 z(sW_dvhN!KW^{lf!09V;{HfZkZ5Fz^Z?A@@;`;8rr3Pl6jk${H@w!=SM_uF(07E?P&5T*j!sy1~OB=#4U7fUYklb0*65rS9)(3RBcDJSw5(f zWAAUV@avomG2`r>tzyFibJBXj07EHsQqpmnD%L!rLMDK`rYr~}`(`?w84s}bJM=Ym zb|L8*N>Qt@t%L7xgVuvG9ER4*kkI>;^e|MKxs?(|3DF_FpPK6wYS^(eO({tLt1(BT z4FPYf5Or-q%)vstT|ahj-j}rzqL1rN9aGX%owz{v!v;*nh1W(b@7~4rN=E2b79bp^ zHeM(isdL)YvUQag>uBsPK&Ut7SgBz!F`sZlvew1Pj zE3bnv!#@m&L4YbD_o6}yv%KWSYD9^aZ)2`NM0@oMaUUQtfz7eU%zCL5tW_bZVVH2? zs{=@QVZFYajFj5)xx02(F*8Fh3LSXqFvKriX|B@_R2E5cOr_C|;#s8%pb~uOgxcOc zl6W`>CFVK)>O0%HO0BBBo{(pQZW_vX&du&|HYTE@1jO-u?otm{7 zi&H};XddQ<@w;Lc=Iw(TE$LlQ;=~wy*JpK5e7&O zI?m}jNu*A7(UN6auSpmUNj91wz_Hck!HLqQ_V|6jEM8YWvq7!S!)#_Jb@|8-=@)VR z!|1t7EsxYp;Ew$D92E=Xq{f)wx?R$8q63PIp4Hko?^Y`VQ@2*KmN_RgI-sf-v9-?r za3H+_0b8L$$s9U}iKrr$A|5%O-~^zoXT;XJ@v?~D57z3$1FbGE393m6v-$HN$-cTH z3%9Mbiy|6%Q%$YF-ACdg$Nr1K>(|I*W-(OCh+T874=Kk%y5x0nySTo|I5=FiIkYreNwm?>*Zk$!XtwmZ9Clx5KypjW-YFvP zKudJnsJm(=a4&P1oVuuyGzM`7f-N!KKBYEYpx6~aTt{>u7e z17aiPQ}^|?1M`>{m0POUEuQ#KZUvp%Wsd^!0K;gXbjSlm|27-T9Qn8;KI_*RF#_Qs zwE}jj)7Rj*#MaS3Kn;aJDNXU()5bZ8s#`z2ID^H>Jhl2sYchac_1dvwOR$v|rPh^_ z*2WgDsOTDc<)l8s%%%0%?urkRu*jDv3iBCCTz0&AX#}++H9oo$GZ5Oq)!os&O$^T| zQ8Z4zHF#O1c}|F?W6!yF$1~Sp*S@(&khO=<37FTX`O3^(L{)?FD0{ThtmpCiXR)da78}Iw8--z|cDsw^jSNON#sZ9$ID@Dxs^F z27mgrfmafp{8*Dz207%PEH9zoZWi?ub$mi&mb!mR#4%uCB7-19Aw)_qAqnE&JtRCo z71l|tRwmypAs1nPKqO{wMa>~f+s?KFZIaWf-jP*-QXWcaoi z&ls87uu(1=e?d2phv)}0MnRr;0y(HXNRTtG#MWc*&f3B#`u~<)9A{`EwLQp_++6up zvt0PX_ld3PNuBaSpcFhb0*|8YiUQlAJ-(pEs^pxH@+g9Z$~_Y?iUPko=(P8gSWJFC+c<>)CJ@9VXA z_%kufK=nX^0~*$yPfk0Z*3B5xZGzypJxU0G0#|Ig#i=N*>t$K z?(r%He1PJsWNfoYv60B2=@bpF0(Qz@?9~~fqrBxk3|JYI$cp?0%^L+X#}!~N83Sw( z73OtYYVG$t1+9ca)%%F@KaF)LkVSURE(V6Gn_yD%{92lp6MhY%!W*^#=b>8Kfcry$%i zUEa7E5#u0nj?_X|+Q(}+2GXcGK{koh6w}fQ?st2|Tb*@tGMRa2&NQ9n1U{<^;@%r8 zCVX_~?N7+KBbxGD$%-NSK|qJoucm8&177rD^`$`3pih(A?j)Fc^MI=G+nLLRWpA!z zkGALa9GMD@jTJlHe$BV5(omC`;bJFXCrU<;N5&q%5}awjp;0YXdIBZarSV>U#xQsWP4)Clje4`fhamNFzcfQjZ*_D(WTQD! zvLmH$>0HXU3;cP15ns<0u1Auc|P$go` zgR`GFcTEh}i5u9G>*B5CzPz{r&5}#zgrH6mJo?lIy3&Z+t+BP=Bo;JjKsInaU+Rcx=ehZHPd=eEZ65F6D zLStNwGRxAv#_k%oo=t|v^K%xLA5I6zd*5Z3-z){tE(^|Z*H$A zIMwC11J&ogT85=q_f?(euZnd(ovQM2kwM|9D6az*S&Jw4GoXsOa7m^8HhNG8a@;eI zYQ%ITTD(Ku+}gTLQbQNn+ufl2xa<5cFt66~aftTF*wtJgiLr%E-xOx7th6$lfI^$< z9)S|4bd4l$%OnDTO{gcz~HGe@2)kT(Tg4vZs z?!wc~hQ%5tyjsn94$Qg|wMA@xaqyGHM}$Fa0Rnz9<@5mxdyI|KM|(S39$ljA=b@C% zcGQ8+q^8jLqVXaX7xlyV2CHl`R8rI&C!oXl9_IBP`#tD(Szy)gqJ@@cuCGx(fy)G-CZ}9Rd6PV^(nveU*yG?Gg5O;agV19 zll8hK7>*_7dpb@%Tv*8DG&p85l& zKjV%0JXeVTv*=ASPSkM-vyU#4Bi(EtJ~2pbC` zDMkDNXfDjzO%i5~h-j0fG)R(k^DX9hpoO-MgFjtwKU<8GYdfC5N&~HftMhO`(?#OtRQ{zwXcM^3RosfIR$Z0cQ4?GwTw;Gcm_$ zC+7CigRD|k<|2yr2l#702uMiJ8E<g{v-7uiZ^!lmVqSf@Klj3-eQ4IK>~fdzf_QCn8og|;fO zZCv1u7n1=rgoN2P(6KZINfrY-!s9?ZQr@cZ^tZdCJIDIQP$cNY<1$@XNokD7%nzWY#cQidp^?+ky~-sjw01eW7yXjdL$fhdTuu#*Mw{qt3>LNC zWTnL3k8t*)n&-EpyPP=*I~73GaMM>drY4!nO{0QZj7qDAL*zzdQ0b3Jn$o=z-vvs; z?hO}{W`QZu?a8KOIA*MK8k=%zVF2Silpz`^B!qCaCp3qpA>_k>#tpOHSipF&kqUw)URvS z$b2Vwd^@~~%|z2#ES4e0z|&Lu#@2K@8tv~wjk)bc+c^$WE@aV*%U%gr|AiwAHMjNtp^DP4vidl5*s$ZgM67Zn$LC)`{c$eP-N40JF z!Abb7M*4ScT?qq1Z|=J7=cp`8Q?@;=G&)vQcvl-DU3Tk-g_Ip7 z6^LX*-2J*sg%G2F;iYaDX}XORDMd)C8^&k&&HPC49OuX8h;7D{^rbD8tLdBdZ?;d% zMhLC$_|?Xn%L%&;D;;yyND}8aWUCRFJ#)xE*|Fh>3&}?eD)uN8Z|NM9`3*>E&L3Mu z13;uP?6r`kwNGHp+f%%(;JOeAGpU#YLyZ}u^oz$b`JSvm&%z5**@5pS5f#1Hs}Lj2)2N;zcglnW z8T;;)A@3@k2tT8s>hYMg1Yg}6BRi&i8N}YlrUT3QHvq~}zn?cU(zm?Vo51DJNGpp+ zO3iS^m*$ZHI!JQy-3uza1uYK{m&Vu8%CDY&A(G2Rv+{Mlx3v5tVl8-l-M8sYjU-QG zJgl8RQD0C8@V*iK)d??c<*JkGfB)7#VlI>HrCs9(N0)&U79?#{M~sKS*duEPsH0u! z(@6nh7JVQKBl^`2GVEo4>sDwk{oK@&{kXkkM-=cxz)Z3MB5$yU z9EG_`jNhrXKCR1WNau3oGX-_z$7YX@D^ETGtGZ6W{bN^>6FD^@aJ7g2`qELcC59~P7zi4PuTwChvVFCJ$L7az?? zq^zp%vjWz3-1hB6o*u}Pz^(V@{rmE7i4)AWWL}^@&qkreRQZIycO~5a-BL~Wd4v7_ zS--b`a}ITVUa*h-5%3Ld(X~iRR!<>s?w;PD<$XEO8ogS6w^S_ZdX(vj@)41Z+@?tubgN(Q`_>Y)(O5%m(Q=M>-If5@ z_&}nd@F=uv&Ps(Rw&7#y_fN++S3i2yrm|$@zG-&1Jd0GhHlVT(-qlc%_9^|C_QWe_ zuR`ccMW5v`;reP@A#O*_{SA3lwVruFmB zdK1W--c{f>b&dKJUr->5vimgF#Ke-IjD4=e>^be+qQCZ`@!E}kmEVTbUDd8#1^l)( zp6|j1z-erCBYW9v!!Phq&JkCOLzftH2LeiVR~-#E>oYj*wbxw~b4qxL(bMe`d4|a8}BgO@{0%xNRKca?WwPyJiZ?{G^mk~e5|22qeK3`Zj-0&>a?nG0)BZVxQVA^gJDyn(>SFV)t) z>b)#Kt&Zp*kV~n~99cVl`C*G*(f7M=I8C*W@hXR-JW4yW9?d8BZ7>b$DQbqQv+>#q zQ^KD*y}zl`FnHBhEbB~QJK|wO^r3|@OM*2N`OD!}aP7hG`OS5QZ&`C8eXo!(-_2O# z=;$j1kt045MM$>LouqGlM~gK8MPb%`#^T3bP0>>c>zOpu@ZF3r>V*hiu@CCh9Uoq- z2ZRv`Q0-czn45OV(R_aUHhy>fsZBnOX6`+e_sxMGy3ST2)IajqMh!&i^S)SlE7z7} zC{cW6i5PWcw>0=29sWMFYHkDuApb%o}ZqLj&` zgV(1|Or@Xs=N#s3$p3mjmDIf3hcEJT7@+v#Xq8!Z%BnbsIk#xAlR*S>f&3U*SDjc~;$v;VJ9x z2_9FImMo%f96#ls$6U_T-JObn(hyA8<2cEuld%bh>w&*zEVu37wi1l zH~j03_BpwR9GczK87p+Jff&PX-A0d!UUTe!*r0PdOYUXTX+T-ey;LF3e))qv; z#8WGlPyY3hp4)78c`33r`sM#|7*Fwp)EO$OH zWi(49JPi@yHbIIb$LO7J_w2J2Y-H4Tc;O$M`-)gBnvKQY;c!^Dvo)yRq4Pp3^%@r# z=}1Xz@HDRn33G#sdkhdP4JLXgaer== zoNEd88}H7e{=eCa{Hk#lf! z#dXPYl-Hgbh-2bOO$#nORTRkdOMaBDcyQRn99}#Sp|`9liyqxx(}+sxhDo5Kc1N6A zc-M;V3ujYDeORV=rfM`i>XLJG<2=Pm;y5GbQ0dg|mFi+(P^jaPU_T;;QCFtOx>i%c zN9dy!M%9FNh8M*uu;?n5YSXiDRLhVel|bg$iW#8=m~NMtF9}oZ`;_}TJ|V5nPldzn z1}F?Rr^3W5C+oVV}ca0<$F??jv>N_;sKj^YL9;NpaerHqu?z{4rjzOcM zPVu!f2|rmM^Q%1y+iECOdznUnzt29HAl>4VRbh5zsliWE6m>ju3&Wp#{;H`(yS01f ziVfK55fJ#&%f%CEsVpk1OCZ=8#vYTjX*e9`BgI<3f{UsE@fr#(he@FVydFTJw+ zAfbA|l(1Ik5c$E^2VX}d-c&@&cwcSIP)@9@UI$+F>P4|B4 zynF7CziZ!8@_DCqZN$Fo_IQQmOdQO1zj3(#m`t}Ssi@l@&~&vfT6%)WO6fg1d31Xz z$U$LPGw$h*`8=~^AYsi*t!wYJ>UiS|Fyk#;bhJD7+e9M`FScKkgbP<{%jo9ioEesS zOl1S>IcXFAdL3UNa`*5Yhu;>&W4vnL2?KU>Uoyq-iuD%v1)t|$=+!^B;K{{|)OgpP zaxaScH_v&BvMF+aG3bz}_vYQ7j)nG(vKx9g!qP0&yz|&Qa{*mXo-*4bQmOa0+KV5S zq4#;~C^NXu37qh9?i)1mUygh%6pp;(wJQ%4N3gys*ebkJ&3aa0PHDAPPcDN!Jq!H$ zC8}6Cj1g@$d%x_b)t%JXQ`t(#Gy}sSdSW*pJ+3yRJk*t0M_rQ4@Vm=(B3s?yv6@zk z>%%IC)RuieTfS{Wr>!U+UhkF?zPWVdN$^!U@|hrv=zho(zmDWwj9Xjeu;K)g%~i=2 z2rc~}9PqZ;U`Si`TUk|Wr8LQko3u*W}bB zr3m-h;o=ZnSj}LEn>)W3F(rD(m;;XYoBp$kKc?<>I)?wY;i z7vw6dUw@c%JSpo|Y@kA(pQoPfWGPAQNp5oTIEOoDYt;A|bg~q?TRc~%6?{_a>4&Vk zUumNDWz*f&&Gqhtl*3j#a>LgQPiLmol_~W!3_Fxr^XVR-11JwDR#{~`BR2;gTnAni z$&^fz3{=t2j?5SPrjg?>>lZU`9zUGk`dJX8Gu%>|cGp3P*K*Li;wW}j6-m8#&lO@M z`z|pG@C@4T`J5tNT5#JxVlVqt?sfE&Ifb}uQz2;&H3kZ!*C(t2c1s7i8K#_T6Qu>0 zeL7npjqtVn#2PgtPAY3o^C-8hJOemXSzajJvBn7aKNd02_6uFR_hPAwO-E$aKwAm* z^!<;LW{qcg@mCsZ-l?WWL~?3HpGJKpk0o|g{np!wVrE$07KUDZvFmePtCaRb;{8z} zp4A!|Sp93HA@y}nJaO1X)O$`*%#M@3Gyu<2>o*R5Ao?8r9Urw!g z6`-BDDHWSAJ=#kbADxZ)t=8_g+wX^ou10jH>wE5kHl82c$Q_ZHswCi0Qu!q`j;c|=vouE^ z;n;+b8FM0Gx57)S$rk5}WA6Y64T&)&Wz5KXqGd5!D7Mm#vUXpWGIVie{h8sOiXop9 zge0$xbDo}&-8P%Q`ID*rQocc9C9NFP_Mg=n|A^e1cEQZnAR>S&a!B#JOUJknG=N>&i(hz2!{!Z4wE|+vDeO( z?w}2o4U$!ru-DH2_4)5>=YK!g%9K2&M4(RWV&!h-kj$@4;Fz4OOu*1ktV}?SPYx6N z8|Q+-leJUvSsK3HArK_Qhb0rM5;y~35EtmL7ncJU`Cso~s5l%6$HkCv7z7ssBcTW! z3<5(Sp*R>63`gN|K%h|QzcBcJiNQ$J|1(e=3C0bGg2R%9)d(~JFm6sDBsOINO7D3fl%UbxcEPbK`4+o z426q{!$2?`42cp){X;N2cDj&Y7z#Hawg?bda-uqcIsgOVNCLr82o#Pa5E2A|{xJ@T zLf~c(heHs!WN;)BjH4U`he1()A8YnaE?2@HvK5sq{i6pl5@U-tZO z$zez^3fb^pg8(0&00D3Ks7WA)&xor6B91_UlbN*%_yH)6F+tG3YKI#X0{{2q{+9@f zfc!BRP!Je_J3mka7>W}Q3m_5yO8ozr1p-GPaR!1Qa5w@tK?np3<0SZ(`Ebh(!8YQb z;}GKihzDS62SGwmxLIROio`7~1deSn9Ad0u5boSVK_CRK5GVo(`3EtU7m9$P0Nj8u zChwT9D^%5L)a1_=kI2aO) zT?=tB5SAGi!%hiqJR}N^Q!Q-$vHc6eEf-20EAO8H!B}U4{=}fTr3QnL2pA4A7K8t> zVu6uZc>oRxcJ&s=C4s=ias2^?K(Xr+&av1d|Gj+wr%SM<0)zh;hgJN)#zg<;`vnDp m +#include "bn.h" + +/* fast square root */ +static mp_digit i_sqrt(mp_word x) +{ + mp_word x1, x2; + + x2 = x; + do { + x1 = x2; + x2 = x1 - ((x1 * x1) - x)/(2*x1); + } while (x1 != x2); + + if (x1*x1 > x) { + --x1; + } + + return x1; +} + + +/* generates a prime digit */ +static mp_digit prime_digit() +{ + mp_digit r, x, y, next; + + /* make a DIGIT_BIT-bit random number */ + for (r = x = 0; x < DIGIT_BIT; x++) { + r = (r << 1) | (rand() & 1); + } + + /* now force it odd */ + r |= 1; + + /* force it to be >30 */ + if (r < 30) { + r += 30; + } + + /* get square root, since if 'r' is composite its factors must be < than this */ + y = i_sqrt(r); + next = (y+1)*(y+1); + + do { + r += 2; /* next candidate */ + + /* update sqrt ? */ + if (next <= r) { + ++y; + next = (y+1)*(y+1); + } + + /* loop if divisible by 3,5,7,11,13,17,19,23,29 */ + if ((r % 3) == 0) { x = 0; continue; } + if ((r % 5) == 0) { x = 0; continue; } + if ((r % 7) == 0) { x = 0; continue; } + if ((r % 11) == 0) { x = 0; continue; } + if ((r % 13) == 0) { x = 0; continue; } + if ((r % 17) == 0) { x = 0; continue; } + if ((r % 19) == 0) { x = 0; continue; } + if ((r % 23) == 0) { x = 0; continue; } + if ((r % 29) == 0) { x = 0; continue; } + + /* now check if r is divisible by x + k={1,7,11,13,17,19,23,29} */ + for (x = 30; x <= y; x += 30) { + if ((r % (x+1)) == 0) { x = 0; break; } + if ((r % (x+7)) == 0) { x = 0; break; } + if ((r % (x+11)) == 0) { x = 0; break; } + if ((r % (x+13)) == 0) { x = 0; break; } + if ((r % (x+17)) == 0) { x = 0; break; } + if ((r % (x+19)) == 0) { x = 0; break; } + if ((r % (x+23)) == 0) { x = 0; break; } + if ((r % (x+29)) == 0) { x = 0; break; } + } + } while (x == 0); + + return r; +} + +/* makes a prime of at least k bits */ +int pprime(int k, mp_int *p, mp_int *q) +{ + mp_int a, b, c, n, x, y, z, v; + int res; + + /* single digit ? */ + if (k <= (int)DIGIT_BIT) { + mp_set(p, prime_digit()); + return MP_OKAY; + } + + if ((res = mp_init(&c)) != MP_OKAY) { + return res; + } + + if ((res = mp_init(&v)) != MP_OKAY) { + goto __C; + } + + /* product of first 50 primes */ + if ((res = mp_read_radix(&v, "19078266889580195013601891820992757757219839668357012055907516904309700014933909014729740190", 10)) != MP_OKAY) { + goto __V; + } + + if ((res = mp_init(&a)) != MP_OKAY) { + goto __V; + } + + /* set the prime */ + mp_set(&a, prime_digit()); + + if ((res = mp_init(&b)) != MP_OKAY) { + goto __A; + } + + if ((res = mp_init(&n)) != MP_OKAY) { + goto __B; + } + + if ((res = mp_init(&x)) != MP_OKAY) { + goto __N; + } + + if ((res = mp_init(&y)) != MP_OKAY) { + goto __X; + } + + if ((res = mp_init(&z)) != MP_OKAY) { + goto __Y; + } + + /* now loop making the single digit */ + while (mp_count_bits(&a) < k) { + printf("prime is %4d bits left\r", k - mp_count_bits(&a)); fflush(stdout); + top: + mp_set(&b, prime_digit()); + + /* now compute z = a * b * 2 */ + if ((res = mp_mul(&a, &b, &z)) != MP_OKAY) { /* z = a * b */ + goto __Z; + } + + if ((res = mp_copy(&z, &c)) != MP_OKAY) { /* c = a * b */ + goto __Z; + } + + if ((res = mp_mul_2(&z, &z)) != MP_OKAY) { /* z = 2 * a * b */ + goto __Z; + } + + /* n = z + 1 */ + if ((res = mp_add_d(&z, 1, &n)) != MP_OKAY) { /* n = z + 1 */ + goto __Z; + } + + /* check (n, v) == 1 */ + if ((res = mp_gcd(&n, &v, &y)) != MP_OKAY) { /* y = (n, v) */ + goto __Z; + } + + if (mp_cmp_d(&y, 1) != MP_EQ) goto top; + + /* now try base x=2 */ + mp_set(&x, 2); + + /* compute x^a mod n */ + if ((res = mp_exptmod(&x, &a, &n, &y)) != MP_OKAY) { /* y = x^a mod n */ + goto __Z; + } + + /* if y == 1 loop */ + if (mp_cmp_d(&y, 1) == MP_EQ) goto top; + + /* now x^2a mod n */ + if ((res = mp_sqrmod(&y, &n, &y)) != MP_OKAY) { /* y = x^2a mod n */ + goto __Z; + } + + if (mp_cmp_d(&y, 1) == MP_EQ) goto top; + + /* compute x^b mod n */ + if ((res = mp_exptmod(&x, &b, &n, &y)) != MP_OKAY) { /* y = x^b mod n */ + goto __Z; + } + + /* if y == 1 loop */ + if (mp_cmp_d(&y, 1) == MP_EQ) goto top; + + /* now x^2b mod n */ + if ((res = mp_sqrmod(&y, &n, &y)) != MP_OKAY) { /* y = x^2b mod n */ + goto __Z; + } + + if (mp_cmp_d(&y, 1) == MP_EQ) goto top; + + + /* compute x^c mod n == x^ab mod n */ + if ((res = mp_exptmod(&x, &c, &n, &y)) != MP_OKAY) { /* y = x^ab mod n */ + goto __Z; + } + + /* if y == 1 loop */ + if (mp_cmp_d(&y, 1) == MP_EQ) goto top; + + /* now compute (x^c mod n)^2 */ + if ((res = mp_sqrmod(&y, &n, &y)) != MP_OKAY) { /* y = x^2ab mod n */ + goto __Z; + } + + /* y should be 1 */ + if (mp_cmp_d(&y, 1) != MP_EQ) goto top; + +/* +{ + char buf[4096]; + + mp_toradix(&n, buf, 10); + printf("Certificate of primality for:\n%s\n\n", buf); + mp_toradix(&a, buf, 10); + printf("A == \n%s\n\n", buf); + mp_toradix(&b, buf, 10); + printf("B == \n%s\n", buf); + printf("----------------------------------------------------------------\n"); +} +*/ + /* a = n */ + mp_copy(&n, &a); + } + + mp_exch(&n, p); + mp_exch(&b, q); + + res = MP_OKAY; +__Z: mp_clear(&z); +__Y: mp_clear(&y); +__X: mp_clear(&x); +__N: mp_clear(&n); +__B: mp_clear(&b); +__A: mp_clear(&a); +__V: mp_clear(&v); +__C: mp_clear(&c); + return res; +} + + +int main(void) +{ + mp_int p, q; + char buf[4096]; + int k; + clock_t t1; + + srand(time(NULL)); + + printf("Enter # of bits: \n"); + scanf("%d", &k); + + mp_init(&p); + mp_init(&q); + + t1 = clock(); + pprime(k, &p, &q); + t1 = clock() - t1; + + printf("\n\nTook %ld ticks, %d bits\n", t1, mp_count_bits(&p)); + + mp_toradix(&p, buf, 10); + printf("P == %s\n", buf); + mp_toradix(&q, buf, 10); + printf("Q == %s\n", buf); + + return 0; +} + diff --git a/makefile b/makefile index 95c6465..cbb5ac7 100644 --- a/makefile +++ b/makefile @@ -1,14 +1,19 @@ CC = gcc -CFLAGS += -DDEBUG -Wall -W -O3 -fomit-frame-pointer -funroll-loops +CFLAGS += -Wall -W -O3 -fomit-frame-pointer -funroll-loops -VERSION=0.07 +VERSION=0.08 default: test -test: bn.o demo.o +test: bn.o demo.o $(CC) bn.o demo.o -o demo cd mtest ; gcc -O3 -fomit-frame-pointer -funroll-loops mtest.c -o mtest.exe -s +# builds the x86 demo +test86: + nasm -f coff timer.asm + $(CC) -DDEBUG -DTIMER_X86 $(CFLAGS) bn.c demo.c timer.o -o demo -s + docdvi: bn.tex latex bn @@ -17,7 +22,7 @@ docs: docdvi rm -f bn.log bn.aux bn.dvi clean: - rm -f *.o *.exe mtest/*.exe bn.log bn.aux bn.dvi *.s + rm -f *.pdf *.o *.exe mtest/*.exe etc/*.exe bn.log bn.aux bn.dvi *.s zipup: clean docs chdir .. ; rm -rf ltm* libtommath-$(VERSION) ; mkdir libtommath-$(VERSION) ; \ diff --git a/mtest/mtest.c b/mtest/mtest.c index 576feb2..de04e2b 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -41,7 +41,7 @@ void rand_num(mp_int *a) unsigned char buf[512]; top: - size = 1 + ((fgetc(rng)*fgetc(rng)) % 512); + size = 1 + ((fgetc(rng)*fgetc(rng)) % 32); buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); for (n = 0; n < size; n++) { @@ -57,7 +57,7 @@ void rand_num2(mp_int *a) unsigned char buf[512]; top: - size = 1 + ((fgetc(rng)*fgetc(rng)) % 512); + size = 1 + ((fgetc(rng)*fgetc(rng)) % 32); buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); for (n = 0; n < size; n++) { @@ -80,6 +80,13 @@ int main(void) mp_init(&e); rng = fopen("/dev/urandom", "rb"); + if (rng == NULL) { + rng = fopen("/dev/random", "rb"); + if (rng == NULL) { + fprintf(stderr, "\nWarning: stdin used as random source\n\n"); + rng = stdin; + } + } for (;;) { n = fgetc(rng) % 11; diff --git a/timer.asm b/timer.asm index e8b6383..2393250 100644 --- a/timer.asm +++ b/timer.asm @@ -9,6 +9,12 @@ [section .data] timer dd 0, 0 [section .text] + +[global _gettsc] +_gettsc: + rdtsc + ret + [global _rdtsc] _rdtsc: rdtsc