From 323dcbcd1b772ed6679c432aeb59da110ad558c1 Mon Sep 17 00:00:00 2001 From: dougb Date: Tue, 28 Jul 2009 22:58:40 +0000 Subject: Vendor import of BIND 9.6.1-P1 --- CHANGES | 4 ++++ bin/named/update.c | 8 ++++++-- version | 6 +++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 2fc7dff..1f2c35a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ + --- 9.6.1-P1 released --- + +2640. [security] A specially crafted update packet will cause named + to exit. [RT #20000] --- 9.6.1 released --- diff --git a/bin/named/update.c b/bin/named/update.c index ff07311..b0a556d 100644 --- a/bin/named/update.c +++ b/bin/named/update.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: update.c,v 1.151.12.5 2009/04/30 07:03:37 marka Exp $ */ +/* $Id: update.c,v 1.151.12.5.12.1 2009/07/28 14:18:08 marka Exp $ */ #include @@ -979,7 +979,11 @@ temp_check(isc_mem_t *mctx, dns_diff_t *temp, dns_db_t *db, if (type == dns_rdatatype_rrsig || type == dns_rdatatype_sig) covers = dns_rdata_covers(&t->rdata); - else + else if (type == dns_rdatatype_any) { + dns_db_detachnode(db, &node); + dns_diff_clear(&trash); + return (DNS_R_NXRRSET); + } else covers = 0; /* diff --git a/version b/version index 1b3080f..3245f02 100644 --- a/version +++ b/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.5 2009/06/04 04:02:41 marka Exp $ +# $Id: version,v 1.43.12.5.8.1 2009/07/28 14:18:08 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -6,5 +6,5 @@ MAJORVER=9 MINORVER=6 PATCHVER=1 -RELEASETYPE= -RELEASEVER= +RELEASETYPE=-P +RELEASEVER=1 -- cgit v1.1 From 2478455da9828632def98db40b50d3f74d3fc3d2 Mon Sep 17 00:00:00 2001 From: dougb Date: Mon, 30 Nov 2009 02:59:30 +0000 Subject: Vendor import of BIND 9.6.1-P2 --- CHANGES | 6 ++++ bin/named/query.c | 68 +++++++++++++++++++++++++++++++++++++-------- lib/dns/api | 4 +-- lib/dns/include/dns/types.h | 34 +++++++++++++++-------- lib/dns/masterdump.c | 5 ++-- lib/dns/rbtdb.c | 6 ++-- lib/dns/resolver.c | 33 ++++++++++++++++++---- lib/dns/validator.c | 12 ++++---- version | 4 +-- 9 files changed, 129 insertions(+), 43 deletions(-) diff --git a/CHANGES b/CHANGES index 1f2c35a..fd065d0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ + --- 9.6.1-P2 released --- + +2772. [security] When validating, track whether pending data was from + the additional section or not and only return it if + validates as secure. [RT #20438] + --- 9.6.1-P1 released --- 2640. [security] A specially crafted update packet will cause named diff --git a/bin/named/query.c b/bin/named/query.c index ffd9b35..6029484 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.313.20.7 2009/03/13 01:38:51 marka Exp $ */ +/* $Id: query.c,v 1.313.20.7.12.1 2009/11/18 23:58:04 marka Exp $ */ /*! \file */ @@ -116,6 +116,8 @@ #define DNS_GETDB_NOLOG 0x02U #define DNS_GETDB_PARTIAL 0x04U +#define PENDINGOK(x) (((x) & DNS_DBFIND_PENDINGOK) != 0) + typedef struct client_additionalctx { ns_client_t *client; dns_rdataset_t *rdataset; @@ -1761,8 +1763,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { */ if (result == ISC_R_SUCCESS && additionaltype == dns_rdatasetadditional_fromcache && - (rdataset->trust == dns_trust_pending || - rdataset->trust == dns_trust_glue) && + (DNS_TRUST_PENDING(rdataset->trust) || + DNS_TRUST_GLUE(rdataset->trust)) && !validate(client, db, fname, rdataset, sigrdataset)) { dns_rdataset_disassociate(rdataset); if (dns_rdataset_isassociated(sigrdataset)) @@ -1801,8 +1803,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { */ if (result == ISC_R_SUCCESS && additionaltype == dns_rdatasetadditional_fromcache && - (rdataset->trust == dns_trust_pending || - rdataset->trust == dns_trust_glue) && + (DNS_TRUST_PENDING(rdataset->trust) || + DNS_TRUST_GLUE(rdataset->trust)) && !validate(client, db, fname, rdataset, sigrdataset)) { dns_rdataset_disassociate(rdataset); if (dns_rdataset_isassociated(sigrdataset)) @@ -2601,14 +2603,14 @@ query_addbestns(ns_client_t *client) { /* * Attempt to validate RRsets that are pending or that are glue. */ - if ((rdataset->trust == dns_trust_pending || - (sigrdataset != NULL && sigrdataset->trust == dns_trust_pending)) + if ((DNS_TRUST_PENDING(rdataset->trust) || + (sigrdataset != NULL && DNS_TRUST_PENDING(sigrdataset->trust))) && !validate(client, db, fname, rdataset, sigrdataset) && - (client->query.dboptions & DNS_DBFIND_PENDINGOK) == 0) + !PENDINGOK(client->query.dboptions)) goto cleanup; - if ((rdataset->trust == dns_trust_glue || - (sigrdataset != NULL && sigrdataset->trust == dns_trust_glue)) && + if ((DNS_TRUST_GLUE(rdataset->trust) || + (sigrdataset != NULL && DNS_TRUST_GLUE(sigrdataset->trust))) && !validate(client, db, fname, rdataset, sigrdataset) && SECURE(client) && WANTDNSSEC(client)) goto cleanup; @@ -3716,6 +3718,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) dns_rdataset_t *noqname; isc_boolean_t resuming; int line = -1; + dns_rdataset_t tmprdataset; + unsigned int dboptions; CTRACE("query_find"); @@ -3933,9 +3937,49 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) /* * Now look for an answer in the database. */ + dboptions = client->query.dboptions; + if (sigrdataset == NULL && client->view->enablednssec) { + /* + * If the client doesn't want DNSSEC we still want to + * look for any data pending validation to save a remote + * lookup if possible. + */ + dns_rdataset_init(&tmprdataset); + sigrdataset = &tmprdataset; + dboptions |= DNS_DBFIND_PENDINGOK; + } + refind: result = dns_db_find(db, client->query.qname, version, type, - client->query.dboptions, client->now, - &node, fname, rdataset, sigrdataset); + dboptions, client->now, &node, fname, + rdataset, sigrdataset); + /* + * If we have found pending data try to validate it. + * If the data does not validate as secure and we can't + * use the unvalidated data requery the database with + * pending disabled to prevent infinite looping. + */ + if (result != ISC_R_SUCCESS || !DNS_TRUST_PENDING(rdataset->trust)) + goto validation_done; + if (validate(client, db, fname, rdataset, sigrdataset)) + goto validation_done; + if (rdataset->trust != dns_trust_pending_answer || + !PENDINGOK(client->query.dboptions)) { + dns_rdataset_disassociate(rdataset); + if (sigrdataset != NULL && + dns_rdataset_isassociated(sigrdataset)) + dns_rdataset_disassociate(sigrdataset); + if (sigrdataset == &tmprdataset) + sigrdataset = NULL; + dns_db_detachnode(db, &node); + dboptions &= ~DNS_DBFIND_PENDINGOK; + goto refind; + } + validation_done: + if (sigrdataset == &tmprdataset) { + if (dns_rdataset_isassociated(sigrdataset)) + dns_rdataset_disassociate(sigrdataset); + sigrdataset = NULL; + } resume: CTRACE("query_find: resume"); diff --git a/lib/dns/api b/lib/dns/api index af155ca..4bcf883 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 52 +LIBINTERFACE = 53 LIBREVISION = 0 -LIBAGE = 2 +LIBAGE = 0 diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h index e07a796..8c7773c 100644 --- a/lib/dns/include/dns/types.h +++ b/lib/dns/include/dns/types.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: types.h,v 1.130.50.3 2009/01/29 22:40:35 jinmei Exp $ */ +/* $Id: types.h,v 1.130.50.3.12.1 2009/11/18 23:58:04 marka Exp $ */ #ifndef DNS_TYPES_H #define DNS_TYPES_H 1 @@ -258,40 +258,52 @@ enum { dns_trust_none = 0, #define dns_trust_none ((dns_trust_t)dns_trust_none) - /*% Subject to DNSSEC validation but has not yet been validated */ - dns_trust_pending = 1, -#define dns_trust_pending ((dns_trust_t)dns_trust_pending) + /*% + * Subject to DNSSEC validation but has not yet been validated + * dns_trust_pending_additional (from the additional section). + */ + dns_trust_pending_additional = 1, +#define dns_trust_pending_additional \ + ((dns_trust_t)dns_trust_pending_additional) + + dns_trust_pending_answer = 2, +#define dns_trust_pending_answer ((dns_trust_t)dns_trust_pending_answer) /*% Received in the additional section of a response. */ - dns_trust_additional = 2, + dns_trust_additional = 3, #define dns_trust_additional ((dns_trust_t)dns_trust_additional) /* Received in a referral response. */ - dns_trust_glue = 3, + dns_trust_glue = 4, #define dns_trust_glue ((dns_trust_t)dns_trust_glue) /* Answer from a non-authoritative server */ - dns_trust_answer = 4, + dns_trust_answer = 5, #define dns_trust_answer ((dns_trust_t)dns_trust_answer) /* Received in the authority section as part of an authoritative response */ - dns_trust_authauthority = 5, + dns_trust_authauthority = 6, #define dns_trust_authauthority ((dns_trust_t)dns_trust_authauthority) /* Answer from an authoritative server */ - dns_trust_authanswer = 6, + dns_trust_authanswer = 7, #define dns_trust_authanswer ((dns_trust_t)dns_trust_authanswer) /* Successfully DNSSEC validated */ - dns_trust_secure = 7, + dns_trust_secure = 8, #define dns_trust_secure ((dns_trust_t)dns_trust_secure) /* This server is authoritative */ - dns_trust_ultimate = 8 + dns_trust_ultimate = 9 #define dns_trust_ultimate ((dns_trust_t)dns_trust_ultimate) }; +#define DNS_TRUST_PENDING(x) ((x) == dns_trust_pending_answer || \ + (x) == dns_trust_pending_additional) +#define DNS_TRUST_GLUE(x) ((x) == dns_trust_glue) + + /*% * Name checking severities. */ diff --git a/lib/dns/masterdump.c b/lib/dns/masterdump.c index 5eac96f..1dbb1e6 100644 --- a/lib/dns/masterdump.c +++ b/lib/dns/masterdump.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: masterdump.c,v 1.94.50.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: masterdump.c,v 1.94.50.2.12.1 2009/11/18 23:58:04 marka Exp $ */ /*! \file */ @@ -775,7 +775,8 @@ dump_order_compare(const void *a, const void *b) { static const char *trustnames[] = { "none", - "pending", + "pending-additional", + "pending-answer", "additional", "glue", "answer", diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 9741c15..b163441 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.6 2009/05/06 23:34:30 jinmei Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.6.10.1 2009/11/18 23:58:04 marka Exp $ */ /*! \file */ @@ -4005,7 +4005,7 @@ cache_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { } if (dname_header != NULL && - (dname_header->trust != dns_trust_pending || + (!DNS_TRUST_PENDING(dname_header->trust) || (search->options & DNS_DBFIND_PENDINGOK) != 0)) { /* * We increment the reference count on node to ensure that @@ -4548,7 +4548,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, if (found == NULL || (found->trust == dns_trust_glue && ((options & DNS_DBFIND_GLUEOK) == 0)) || - (found->trust == dns_trust_pending && + (DNS_TRUST_PENDING(found->trust) && ((options & DNS_DBFIND_PENDINGOK) == 0))) { /* * If there is an NS rdataset at this node, then this is the diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index a5d7c25..3b90af4 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.384.14.14 2009/06/02 23:47:13 tbox Exp $ */ +/* $Id: resolver.c,v 1.384.14.14.8.1 2009/11/18 23:58:04 marka Exp $ */ /*! \file */ @@ -4293,6 +4293,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, * for it, unless it is glue. */ if (secure_domain && rdataset->trust != dns_trust_glue) { + dns_trust_t trust; /* * RRSIGs are validated as part of validating the * type they cover. @@ -4329,12 +4330,34 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, } /* + * Reject out of bailiwick additional records + * without RRSIGs as they can't possibly validate + * as "secure" and as we will never never want to + * store these as "answers" after validation. + */ + if (rdataset->trust == dns_trust_additional && + sigrdataset == NULL && EXTERNAL(rdataset)) + continue; + + /* + * XXXMPA: If we store as "answer" after validating + * then we need to do bailiwick processing and + * also need to track whether RRsets are in or + * out of bailiwick. This will require a another + * pending trust level. + * * Cache this rdataset/sigrdataset pair as - * pending data. + * pending data. Track whether it was additional + * or not. */ - rdataset->trust = dns_trust_pending; + if (rdataset->trust == dns_trust_additional) + trust = dns_trust_pending_additional; + else + trust = dns_trust_pending_answer; + + rdataset->trust = trust; if (sigrdataset != NULL) - sigrdataset->trust = dns_trust_pending; + sigrdataset->trust = trust; if (!need_validation || !ANSWER(rdataset)) { addedrdataset = ardataset; result = dns_db_addrdataset(fctx->cache, node, @@ -4682,7 +4705,7 @@ ncache_message(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, for (trdataset = ISC_LIST_HEAD(tname->list); trdataset != NULL; trdataset = ISC_LIST_NEXT(trdataset, link)) - trdataset->trust = dns_trust_pending; + trdataset->trust = dns_trust_pending_answer; result = dns_message_nextname(fctx->rmessage, DNS_SECTION_AUTHORITY); } diff --git a/lib/dns/validator.c b/lib/dns/validator.c index c62b714..46a7491 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.9 2009/05/07 23:47:12 tbox Exp $ */ +/* $Id: validator.c,v 1.164.12.9.8.1 2009/11/18 23:58:04 marka Exp $ */ #include @@ -1607,7 +1607,7 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { * We have an rrset for the given keyname. */ val->keyset = &val->frdataset; - if (val->frdataset.trust == dns_trust_pending && + if (DNS_TRUST_PENDING(val->frdataset.trust) && dns_rdataset_isassociated(&val->fsigrdataset)) { /* @@ -1622,7 +1622,7 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { if (result != ISC_R_SUCCESS) return (result); return (DNS_R_WAIT); - } else if (val->frdataset.trust == dns_trust_pending) { + } else if (DNS_TRUST_PENDING(val->frdataset.trust)) { /* * Having a pending key with no signature means that * something is broken. @@ -2243,7 +2243,7 @@ validatezonekey(dns_validator_t *val) { * We have DS records. */ val->dsset = &val->frdataset; - if (val->frdataset.trust == dns_trust_pending && + if (DNS_TRUST_PENDING(val->frdataset.trust) && dns_rdataset_isassociated(&val->fsigrdataset)) { result = create_validator(val, @@ -2256,7 +2256,7 @@ validatezonekey(dns_validator_t *val) { if (result != ISC_R_SUCCESS) return (result); return (DNS_R_WAIT); - } else if (val->frdataset.trust == dns_trust_pending) { + } else if (DNS_TRUST_PENDING(val->frdataset.trust)) { /* * There should never be an unsigned DS. */ @@ -3337,7 +3337,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) * There is no DS. If this is a delegation, * we maybe done. */ - if (val->frdataset.trust == dns_trust_pending) { + if (DNS_TRUST_PENDING(val->frdataset.trust)) { result = create_fetch(val, tname, dns_rdatatype_ds, dsfetched2, diff --git a/version b/version index 3245f02..ccb7b87 100644 --- a/version +++ b/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.5.8.1 2009/07/28 14:18:08 marka Exp $ +# $Id: version,v 1.43.12.5.8.2 2009/11/18 23:58:04 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -7,4 +7,4 @@ MAJORVER=9 MINORVER=6 PATCHVER=1 RELEASETYPE=-P -RELEASEVER=1 +RELEASEVER=2 -- cgit v1.1 From 146495b70a1336e9f03dd144cc0b656c5024166b Mon Sep 17 00:00:00 2001 From: dougb Date: Fri, 11 Dec 2009 04:14:44 +0000 Subject: Update these files to match current reality. BIND 9.6 has diverged sufficiently from 9.4 to warrant slightly different procedures, so stop pretending that they are interchangable. --- FREEBSD-Upgrade | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/FREEBSD-Upgrade b/FREEBSD-Upgrade index 1da0e8c..d393780 100644 --- a/FREEBSD-Upgrade +++ b/FREEBSD-Upgrade @@ -9,9 +9,6 @@ svn co $REPO/vendor/bind9/dist - NOTE: For RELENG_6 (BIND 9.3.x) s/dist/dist-9.3/ throughout this file - For RELENG_7 (BIND 9.4.x) s/dist/dist-9.4/ throughout this file - 3) Unpack the tarball in a suitable directory: tar zxvf bind-9..tar.gz -X dist/FREEBSD-Xlist @@ -51,7 +48,7 @@ NOTE: You may need 2 copies of head/contrib/bind9 at this point, one to do the work in steps 9 and 10 below, and a clean - version to commit in step 13. + version to commit in step 16. 9) Remove any references to the {bin,lib}/tests and docutil directories from the configure and Makefile templates: @@ -125,11 +122,11 @@ Makefile. Please strive to keep those lists in the same order and with line breaks in the same places to ease future comparisons. -A) Build and test. +14) Build and test. -B) Lather, rinse, repeat. +15) Lather, rinse, repeat. -C) Commit when everything builds cleanly and works properly. +16) Commit when everything builds cleanly and works properly. -- des@FreeBSD.org -- dougb@FreeBSD.org -- cgit v1.1 From 1f8512873050d11ecd5684a4118f041b6158e9b7 Mon Sep 17 00:00:00 2001 From: dougb Date: Mon, 25 Jan 2010 04:22:19 +0000 Subject: Vendor import of BIND 9.6.1-P3 --- CHANGES | 12 + FAQ | 29 +- FAQ.xml | 31 +- bin/dnssec/dnssec-signzone.8 | 330 +- bin/dnssec/dnssec-signzone.html | 16 +- bin/named/query.c | 54 +- doc/arm/Bv9ARM.pdf | 14638 +++++++++++++++--------------- doc/arm/man.dnssec-signzone.html | 16 +- doc/arm/man.named-checkconf.html | 12 +- doc/arm/man.named-checkzone.html | 12 +- doc/arm/man.named.html | 16 +- doc/arm/man.nsupdate.html | 14 +- doc/arm/man.rndc-confgen.html | 12 +- doc/arm/man.rndc.conf.html | 12 +- doc/arm/man.rndc.html | 12 +- lib/dns/include/dns/db.h | 19 +- lib/dns/include/dns/ncache.h | 4 +- lib/dns/include/dns/types.h | 4 +- lib/dns/rbtdb.c | 4 +- lib/dns/resolver.c | 36 +- lib/dns/validator.c | 14 +- lib/lwres/man/lwres.html | 14 +- lib/lwres/man/lwres_buffer.html | 6 +- lib/lwres/man/lwres_config.html | 12 +- lib/lwres/man/lwres_context.html | 10 +- lib/lwres/man/lwres_gabn.html | 10 +- lib/lwres/man/lwres_gai_strerror.html | 8 +- lib/lwres/man/lwres_getaddrinfo.html | 10 +- lib/lwres/man/lwres_gethostent.html | 12 +- lib/lwres/man/lwres_getipnode.html | 10 +- lib/lwres/man/lwres_getnameinfo.html | 12 +- lib/lwres/man/lwres_getrrsetbyname.html | 10 +- lib/lwres/man/lwres_gnba.html | 10 +- lib/lwres/man/lwres_hstrerror.html | 10 +- lib/lwres/man/lwres_inetntop.html | 10 +- lib/lwres/man/lwres_noop.html | 10 +- lib/lwres/man/lwres_packet.html | 8 +- lib/lwres/man/lwres_resutil.html | 10 +- version | 4 +- 39 files changed, 7883 insertions(+), 7590 deletions(-) diff --git a/CHANGES b/CHANGES index fd065d0..0e9c9a6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,15 @@ + --- 9.6.1-P3 released --- + +2831. [security] Do not attempt to validate or cache + out-of-bailiwick data returned with a secure + answer; it must be re-fetched from its original + source and validated in that context. [RT #20819] + +2828. [security] Cached CNAME or DNAME RR could be returned to clients + without DNSSEC validation. [RT #20737] + +2827. [security] Bogus NXDOMAIN could be cached as if valid. [RT #20712] + --- 9.6.1-P2 released --- 2772. [security] When validating, track whether pending data was from diff --git a/FAQ b/FAQ index 2846b31..b256ed8 100644 --- a/FAQ +++ b/FAQ @@ -153,24 +153,29 @@ A: BIND 9.3 and later: Use TSIG to select the appropriate view. Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { - match-clients { !key external; 10.0.1/24; }; + match-clients { !key external; // reject message ment for the + // external view. + 10.0.1/24; }; // accept from these addresses. ... }; view "external" { match-clients { key external; any; }; - server 10.0.1.2 { keys external; }; + server 10.0.1.2 { keys external; }; // tag messages from the + // external view to the + // other servers for the + // view. recursion no; ... }; Slave 10.0.1.2: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; @@ -220,13 +225,13 @@ A: You choose one view to be master and the second a slave and transfer Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; key "mykey" { - algorithm hmac-md5; - secret "yyyyyyyy"; + algorithm hmac-sha256; + secret "yyyyyyyyyyyyyyyyyyyyyyyy"; }; view "internal" { @@ -239,7 +244,7 @@ A: You choose one view to be master and the second a slave and transfer type master; file "internal/example.db"; allow-update { key mykey; }; - notify-also { 10.0.1.1; }; + also-notify { 10.0.1.1; }; }; }; @@ -249,7 +254,7 @@ A: You choose one view to be master and the second a slave and transfer type slave; file "external/example.db"; masters { 10.0.1.1; }; - transfer-source { 10.0.1.1; }; + transfer-source 10.0.1.1; // allow-update-forwarding { any; }; // allow-notify { ... }; }; diff --git a/FAQ.xml b/FAQ.xml index 95346f7..65e8efc 100644 --- a/FAQ.xml +++ b/FAQ.xml @@ -17,7 +17,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - +
Frequently Asked Questions about BIND 9 @@ -319,24 +319,29 @@ Slave: 10.0.1.3 (internal), 10.0.1.4 (external, IP alias) Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { - match-clients { !key external; 10.0.1/24; }; + match-clients { !key external; // reject message ment for the + // external view. + 10.0.1/24; }; // accept from these addresses. ... }; view "external" { match-clients { key external; any; }; - server 10.0.1.2 { keys external; }; + server 10.0.1.2 { keys external; }; // tag messages from the + // external view to the + // other servers for the + // view. recursion no; ... }; Slave 10.0.1.2: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; @@ -424,13 +429,13 @@ named-checkzone example.com tmp Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; key "mykey" { - algorithm hmac-md5; - secret "yyyyyyyy"; + algorithm hmac-sha256; + secret "yyyyyyyyyyyyyyyyyyyyyyyy"; }; view "internal" { @@ -443,7 +448,7 @@ Master 10.0.1.1: type master; file "internal/example.db"; allow-update { key mykey; }; - notify-also { 10.0.1.1; }; + also-notify { 10.0.1.1; }; }; }; @@ -453,7 +458,7 @@ Master 10.0.1.1: type slave; file "external/example.db"; masters { 10.0.1.1; }; - transfer-source { 10.0.1.1; }; + transfer-source 10.0.1.1; // allow-update-forwarding { any; }; // allow-notify { ... }; }; diff --git a/bin/dnssec/dnssec-signzone.8 b/bin/dnssec/dnssec-signzone.8 index 84e613f..1e77927 100644 --- a/bin/dnssec/dnssec-signzone.8 +++ b/bin/dnssec/dnssec-signzone.8 @@ -13,163 +13,287 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-signzone.8,v 1.47.44.4 2009/06/09 01:47:19 each Exp $ +.\" $Id: dnssec-signzone.8,v 1.47.44.4.8.1 2009/12/31 23:17:46 tbox Exp $ .\" .hy 0 .ad l -.\"Generated by db2man.xsl. Don't modify this, modify the source. -.de Sh \" Subsection -.br -.if t .Sp -.ne 5 -.PP -\fB\\$1\fR -.PP -.. -.de Sp \" Vertical space (when we can't use .PP) -.if t .sp .5v -.if n .sp -.. -.de Ip \" List item -.br -.ie \\n(.$>=3 .ne \\$3 -.el .ne 3 -.IP "\\$1" \\$2 -.. -.TH "DNSSEC-SIGNZONE" 8 "June 08, 2009" "" "" -.SH NAME -dnssec-signzone \- DNSSEC zone signing tool +.\" Title: dnssec\-signzone +.\" Author: +.\" Generator: DocBook XSL Stylesheets v1.71.1 +.\" Date: June 08, 2009 +.\" Manual: BIND9 +.\" Source: BIND9 +.\" +.TH "DNSSEC\-SIGNZONE" "8" "June 08, 2009" "BIND9" "BIND9" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +dnssec\-signzone \- DNSSEC zone signing tool .SH "SYNOPSIS" .HP 16 -\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fIclass\fR\fR] [\fB\-d\ \fIdirectory\fR\fR] [\fB\-e\ \fIend\-time\fR\fR] [\fB\-f\ \fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fIkey\fR\fR] [\fB\-l\ \fIdomain\fR\fR] [\fB\-i\ \fIinterval\fR\fR] [\fB\-I\ \fIinput\-format\fR\fR] [\fB\-j\ \fIjitter\fR\fR] [\fB\-N\ \fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fIorigin\fR\fR] [\fB\-O\ \fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-r\ \fIrandomdev\fR\fR] [\fB\-s\ \fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fIsalt\fR\fR] [\fB\-H\ \fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...] +\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...] .SH "DESCRIPTION" .PP -\fBdnssec\-signzone\fR signs a zone\&. It generates NSEC and RRSIG records and produces a signed version of the zone\&. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a \fIkeyset\fR file for each child zone\&. +\fBdnssec\-signzone\fR +signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a +\fIkeyset\fR +file for each child zone. .SH "OPTIONS" -.TP +.PP \-a -Verify all generated signatures\&. -.TP +.RS 4 +Verify all generated signatures. +.RE +.PP \-c \fIclass\fR -Specifies the DNS class of the zone\&. -.TP +.RS 4 +Specifies the DNS class of the zone. +.RE +.PP \-k \fIkey\fR -Treat specified key as a key signing key ignoring any key flags\&. This option may be specified multiple times\&. -.TP +.RS 4 +Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times. +.RE +.PP \-l \fIdomain\fR -Generate a DLV set in addition to the key (DNSKEY) and DS sets\&. The domain is appended to the name of the records\&. -.TP +.RS 4 +Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records. +.RE +.PP \-d \fIdirectory\fR -Look for \fIkeyset\fR files in \fBdirectory\fR as the directory -.TP +.RS 4 +Look for +\fIkeyset\fR +files in +\fBdirectory\fR +as the directory +.RE +.PP \-g -Generate DS records for child zones from keyset files\&. Existing DS records will be removed\&. -.TP +.RS 4 +Generate DS records for child zones from keyset files. Existing DS records will be removed. +.RE +.PP \-s \fIstart\-time\fR -Specify the date and time when the generated RRSIG records become valid\&. This can be either an absolute or relative time\&. An absolute start time is indicated by a number in YYYYMMDDHHMMSS notation; 20000530144500 denotes 14:45:00 UTC on May 30th, 2000\&. A relative start time is indicated by +N, which is N seconds from the current time\&. If no \fBstart\-time\fR is specified, the current time minus 1 hour (to allow for clock skew) is used\&. -.TP +.RS 4 +Specify the date and time when the generated RRSIG records become valid. This can be either an absolute or relative time. An absolute start time is indicated by a number in YYYYMMDDHHMMSS notation; 20000530144500 denotes 14:45:00 UTC on May 30th, 2000. A relative start time is indicated by +N, which is N seconds from the current time. If no +\fBstart\-time\fR +is specified, the current time minus 1 hour (to allow for clock skew) is used. +.RE +.PP \-e \fIend\-time\fR -Specify the date and time when the generated RRSIG records expire\&. As with \fBstart\-time\fR, an absolute time is indicated in YYYYMMDDHHMMSS notation\&. A time relative to the start time is indicated with +N, which is N seconds from the start time\&. A time relative to the current time is indicated with now+N\&. If no \fBend\-time\fR is specified, 30 days from the start time is used as a default\&. -.TP +.RS 4 +Specify the date and time when the generated RRSIG records expire. As with +\fBstart\-time\fR, an absolute time is indicated in YYYYMMDDHHMMSS notation. A time relative to the start time is indicated with +N, which is N seconds from the start time. A time relative to the current time is indicated with now+N. If no +\fBend\-time\fR +is specified, 30 days from the start time is used as a default. +.RE +.PP \-f \fIoutput\-file\fR -The name of the output file containing the signed zone\&. The default is to append \fI\&.signed\fR to the input filename\&. -.TP +.RS 4 +The name of the output file containing the signed zone. The default is to append +\fI.signed\fR +to the input filename. +.RE +.PP \-h -Prints a short summary of the options and arguments to \fBdnssec\-signzone\fR\&. -.TP +.RS 4 +Prints a short summary of the options and arguments to +\fBdnssec\-signzone\fR. +.RE +.PP \-i \fIinterval\fR -When a previously\-signed zone is passed as input, records may be resigned\&. The \fBinterval\fR option specifies the cycle interval as an offset from the current time (in seconds)\&. If a RRSIG record expires after the cycle interval, it is retained\&. Otherwise, it is considered to be expiring soon, and it will be replaced\&. -The default cycle interval is one quarter of the difference between the signature end and start times\&. So if neither \fBend\-time\fR or \fBstart\-time\fR are specified, \fBdnssec\-signzone\fR generates signatures that are valid for 30 days, with a cycle interval of 7\&.5 days\&. Therefore, if any existing RRSIG records are due to expire in less than 7\&.5 days, they would be replaced\&. -.TP +.RS 4 +When a previously\-signed zone is passed as input, records may be resigned. The +\fBinterval\fR +option specifies the cycle interval as an offset from the current time (in seconds). If a RRSIG record expires after the cycle interval, it is retained. Otherwise, it is considered to be expiring soon, and it will be replaced. +.sp +The default cycle interval is one quarter of the difference between the signature end and start times. So if neither +\fBend\-time\fR +or +\fBstart\-time\fR +are specified, +\fBdnssec\-signzone\fR +generates signatures that are valid for 30 days, with a cycle interval of 7.5 days. Therefore, if any existing RRSIG records are due to expire in less than 7.5 days, they would be replaced. +.RE +.PP \-I \fIinput\-format\fR -The format of the input zone file\&. Possible formats are \fB"text"\fR (default) and \fB"raw"\fR\&. This option is primarily intended to be used for dynamic signed zones so that the dumped zone file in a non\-text format containing updates can be signed directly\&. The use of this option does not make much sense for non\-dynamic zones\&. -.TP +.RS 4 +The format of the input zone file. Possible formats are +\fB"text"\fR +(default) and +\fB"raw"\fR. This option is primarily intended to be used for dynamic signed zones so that the dumped zone file in a non\-text format containing updates can be signed directly. The use of this option does not make much sense for non\-dynamic zones. +.RE +.PP \-j \fIjitter\fR -When signing a zone with a fixed signature lifetime, all RRSIG records issued at the time of signing expires simultaneously\&. If the zone is incrementally signed, i\&.e\&. a previously\-signed zone is passed as input to the signer, all expired signatures have to be regenerated at about the same time\&. The \fBjitter\fR option specifies a jitter window that will be used to randomize the signature expire time, thus spreading incremental signature regeneration over time\&. -Signature lifetime jitter also to some extent benefits validators and servers by spreading out cache expiration, i\&.e\&. if large numbers of RRSIGs don't expire at the same time from all caches there will be less congestion than if all validators need to refetch at mostly the same time\&. -.TP +.RS 4 +When signing a zone with a fixed signature lifetime, all RRSIG records issued at the time of signing expires simultaneously. If the zone is incrementally signed, i.e. a previously\-signed zone is passed as input to the signer, all expired signatures have to be regenerated at about the same time. The +\fBjitter\fR +option specifies a jitter window that will be used to randomize the signature expire time, thus spreading incremental signature regeneration over time. +.sp +Signature lifetime jitter also to some extent benefits validators and servers by spreading out cache expiration, i.e. if large numbers of RRSIGs don't expire at the same time from all caches there will be less congestion than if all validators need to refetch at mostly the same time. +.RE +.PP \-n \fIncpus\fR -Specifies the number of threads to use\&. By default, one thread is started for each detected CPU\&. -.TP +.RS 4 +Specifies the number of threads to use. By default, one thread is started for each detected CPU. +.RE +.PP \-N \fIsoa\-serial\-format\fR -The SOA serial number format of the signed zone\&. Possible formats are \fB"keep"\fR (default), \fB"increment"\fR and \fB"unixtime"\fR\&. -.RS -.TP +.RS 4 +The SOA serial number format of the signed zone. Possible formats are +\fB"keep"\fR +(default), +\fB"increment"\fR +and +\fB"unixtime"\fR. +.RS 4 +.PP \fB"keep"\fR -Do not modify the SOA serial number\&. -.TP +.RS 4 +Do not modify the SOA serial number. +.RE +.PP \fB"increment"\fR -Increment the SOA serial number using RFC 1982 arithmetics\&. -.TP +.RS 4 +Increment the SOA serial number using RFC 1982 arithmetics. +.RE +.PP \fB"unixtime"\fR -Set the SOA serial number to the number of seconds since epoch\&. +.RS 4 +Set the SOA serial number to the number of seconds since epoch. +.RE .RE -.IP -.TP +.RE +.PP \-o \fIorigin\fR -The zone origin\&. If not specified, the name of the zone file is assumed to be the origin\&. -.TP +.RS 4 +The zone origin. If not specified, the name of the zone file is assumed to be the origin. +.RE +.PP \-O \fIoutput\-format\fR -The format of the output file containing the signed zone\&. Possible formats are \fB"text"\fR (default) and \fB"raw"\fR\&. -.TP +.RS 4 +The format of the output file containing the signed zone. Possible formats are +\fB"text"\fR +(default) and +\fB"raw"\fR. +.RE +.PP \-p -Use pseudo\-random data when signing the zone\&. This is faster, but less secure, than using real random data\&. This option may be useful when signing large zones or when the entropy source is limited\&. -.TP +.RS 4 +Use pseudo\-random data when signing the zone. This is faster, but less secure, than using real random data. This option may be useful when signing large zones or when the entropy source is limited. +.RE +.PP \-r \fIrandomdev\fR -Specifies the source of randomness\&. If the operating system does not provide a \fI/dev/random\fR or equivalent device, the default source of randomness is keyboard input\&. \fIrandomdev\fR specifies the name of a character device or file containing random data to be used instead of the default\&. The special value \fIkeyboard\fR indicates that keyboard input should be used\&. -.TP +.RS 4 +Specifies the source of randomness. If the operating system does not provide a +\fI/dev/random\fR +or equivalent device, the default source of randomness is keyboard input. +\fIrandomdev\fR +specifies the name of a character device or file containing random data to be used instead of the default. The special value +\fIkeyboard\fR +indicates that keyboard input should be used. +.RE +.PP \-t -Print statistics at completion\&. -.TP +.RS 4 +Print statistics at completion. +.RE +.PP \-v \fIlevel\fR -Sets the debugging level\&. -.TP +.RS 4 +Sets the debugging level. +.RE +.PP \-z -Ignore KSK flag on key when determining what to sign\&. -.TP +.RS 4 +Ignore KSK flag on key when determining what to sign. +.RE +.PP \-3 \fIsalt\fR -Generate a NSEC3 chain with the given hex encoded salt\&. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain\&. -.TP +.RS 4 +Generate a NSEC3 chain with the given hex encoded salt. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain. +.RE +.PP \-H \fIiterations\fR -When generating a NSEC3 chain use this many interations\&. The default is 100\&. -.TP +.RS 4 +When generating a NSEC3 chain use this many interations. The default is 100. +.RE +.PP \-A -When generating a NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations\&. -.TP +.RS 4 +When generating a NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations. +.RE +.PP zonefile -The file containing the zone to be signed\&. -.TP +.RS 4 +The file containing the zone to be signed. +.RE +.PP key -Specify which keys should be used to sign the zone\&. If no keys are specified, then the zone will be examined for DNSKEY records at the zone apex\&. If these are found and there are matching private keys, in the current directory, then these will be used for signing\&. +.RS 4 +Specify which keys should be used to sign the zone. If no keys are specified, then the zone will be examined for DNSKEY records at the zone apex. If these are found and there are matching private keys, in the current directory, then these will be used for signing. +.RE .SH "EXAMPLE" .PP -The following command signs the \fBexample\&.com\fR zone with the DSA key generated by \fBdnssec\-keygen\fR (Kexample\&.com\&.+003+17247)\&. The zone's keys must be in the master file (\fIdb\&.example\&.com\fR)\&. This invocation looks for \fIkeyset\fR files, in the current directory, so that DS records can be generated from them (\fB\-g\fR)\&. +The following command signs the +\fBexample.com\fR +zone with the DSA key generated by +\fBdnssec\-keygen\fR +(Kexample.com.+003+17247). The zone's keys must be in the master file (\fIdb.example.com\fR). This invocation looks for +\fIkeyset\fR +files, in the current directory, so that DS records can be generated from them (\fB\-g\fR). +.sp +.RS 4 .nf -% dnssec\-signzone \-g \-o example\&.com db\&.example\&.com \\ -Kexample\&.com\&.+003+17247 -db\&.example\&.com\&.signed +% dnssec\-signzone \-g \-o example.com db.example.com \\ +Kexample.com.+003+17247 +db.example.com.signed % .fi +.RE .PP -In the above example, \fBdnssec\-signzone\fR creates the file \fIdb\&.example\&.com\&.signed\fR\&. This file should be referenced in a zone statement in a \fInamed\&.conf\fR file\&. +In the above example, +\fBdnssec\-signzone\fR +creates the file +\fIdb.example.com.signed\fR. This file should be referenced in a zone statement in a +\fInamed.conf\fR +file. .PP -This example re\-signs a previously signed zone with default parameters\&. The private keys are assumed to be in the current directory\&. +This example re\-signs a previously signed zone with default parameters. The private keys are assumed to be in the current directory. +.sp +.RS 4 .nf -% cp db\&.example\&.com\&.signed db\&.example\&.com -% dnssec\-signzone \-o example\&.com db\&.example\&.com -db\&.example\&.com\&.signed +% cp db.example.com.signed db.example.com +% dnssec\-signzone \-o example.com db.example.com +db.example.com.signed % .fi +.RE .SH "KNOWN BUGS" .PP - \fBdnssec\-signzone\fR was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys needed to produce a fully\-signed zone\&. This permits a zone administrator, for example, to sign a zone with one key on one machine, move the resulting partially\-signed zone to a second machine, and sign it again with a second key\&. +\fBdnssec\-signzone\fR +was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys needed to produce a fully\-signed zone. This permits a zone administrator, for example, to sign a zone with one key on one machine, move the resulting partially\-signed zone to a second machine, and sign it again with a second key. .PP -An unfortunate side\-effect of this flexibility is that \fBdnssec\-signzone\fR does not check to make sure it's signing a zone with any valid keys at all\&. An attempt to sign a zone without any keys will appear to succeed, producing a "signed" zone with no signatures\&. There is no warning issued when a zone is not fully signed\&. +An unfortunate side\-effect of this flexibility is that +\fBdnssec\-signzone\fR +does not check to make sure it's signing a zone with any valid keys at all. An attempt to sign a zone without any keys will appear to succeed, producing a "signed" zone with no signatures. There is no warning issued when a zone is not fully signed. .PP -This will be corrected in a future release\&. In the meantime, ISC recommends examining the output of \fBdnssec\-signzone\fR to confirm that the zone is properly signed by all keys before using it\&. +This will be corrected in a future release. In the meantime, ISC recommends examining the output of +\fBdnssec\-signzone\fR +to confirm that the zone is properly signed by all keys before using it. .SH "SEE ALSO" .PP -\fBdnssec\-keygen\fR(8), BIND 9 Administrator Reference Manual, RFC 4033\&. +\fBdnssec\-keygen\fR(8), +BIND 9 Administrator Reference Manual, +RFC 4033. .SH "AUTHOR" .PP -Internet Systems Consortium +Internet Systems Consortium +.SH "COPYRIGHT" +Copyright \(co 2004\-2009 Internet Systems Consortium, Inc. ("ISC") +.br +Copyright \(co 2000\-2003 Internet Software Consortium. +.br diff --git a/bin/dnssec/dnssec-signzone.html b/bin/dnssec/dnssec-signzone.html index 5eb8626..652d5c4 100644 --- a/bin/dnssec/dnssec-signzone.html +++ b/bin/dnssec/dnssec-signzone.html @@ -14,12 +14,12 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + dnssec-signzone - +
@@ -32,7 +32,7 @@

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -43,7 +43,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -258,7 +258,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -287,7 +287,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -312,14 +312,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/named/query.c b/bin/named/query.c index 6029484..a56d2e6 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.313.20.7.12.1 2009/11/18 23:58:04 marka Exp $ */ +/* $Id: query.c,v 1.313.20.7.12.4 2009/12/31 22:53:03 each Exp $ */ /*! \file */ @@ -1160,7 +1160,8 @@ query_addadditional(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { goto cleanup; } result = dns_db_find(db, name, version, type, - client->query.dboptions | DNS_DBFIND_GLUEOK, + client->query.dboptions | + DNS_DBFIND_GLUEOK | DNS_DBFIND_ADDITIONALOK, client->now, &node, fname, rdataset, sigrdataset); if (result == DNS_R_GLUE && @@ -1645,7 +1646,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { goto try_glue; result = dns_db_find(db, name, version, type, - client->query.dboptions | DNS_DBFIND_GLUEOK, + client->query.dboptions | + DNS_DBFIND_GLUEOK | DNS_DBFIND_ADDITIONALOK, client->now, &node, fname, NULL, NULL); if (result == ISC_R_SUCCESS) goto found; @@ -3718,8 +3720,6 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) dns_rdataset_t *noqname; isc_boolean_t resuming; int line = -1; - dns_rdataset_t tmprdataset; - unsigned int dboptions; CTRACE("query_find"); @@ -3937,49 +3937,9 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) /* * Now look for an answer in the database. */ - dboptions = client->query.dboptions; - if (sigrdataset == NULL && client->view->enablednssec) { - /* - * If the client doesn't want DNSSEC we still want to - * look for any data pending validation to save a remote - * lookup if possible. - */ - dns_rdataset_init(&tmprdataset); - sigrdataset = &tmprdataset; - dboptions |= DNS_DBFIND_PENDINGOK; - } - refind: result = dns_db_find(db, client->query.qname, version, type, - dboptions, client->now, &node, fname, - rdataset, sigrdataset); - /* - * If we have found pending data try to validate it. - * If the data does not validate as secure and we can't - * use the unvalidated data requery the database with - * pending disabled to prevent infinite looping. - */ - if (result != ISC_R_SUCCESS || !DNS_TRUST_PENDING(rdataset->trust)) - goto validation_done; - if (validate(client, db, fname, rdataset, sigrdataset)) - goto validation_done; - if (rdataset->trust != dns_trust_pending_answer || - !PENDINGOK(client->query.dboptions)) { - dns_rdataset_disassociate(rdataset); - if (sigrdataset != NULL && - dns_rdataset_isassociated(sigrdataset)) - dns_rdataset_disassociate(sigrdataset); - if (sigrdataset == &tmprdataset) - sigrdataset = NULL; - dns_db_detachnode(db, &node); - dboptions &= ~DNS_DBFIND_PENDINGOK; - goto refind; - } - validation_done: - if (sigrdataset == &tmprdataset) { - if (dns_rdataset_isassociated(sigrdataset)) - dns_rdataset_disassociate(sigrdataset); - sigrdataset = NULL; - } + client->query.dboptions, client->now, + &node, fname, rdataset, sigrdataset); resume: CTRACE("query_find: resume"); diff --git a/doc/arm/Bv9ARM.pdf b/doc/arm/Bv9ARM.pdf index b56a05d..fbb664f 100644 --- a/doc/arm/Bv9ARM.pdf +++ b/doc/arm/Bv9ARM.pdf @@ -480,596 +480,608 @@ endobj (6.2.10.2 The category Phrase) endobj 325 0 obj -<< /S /GoTo /D (subsection.6.2.11) >> +<< /S /GoTo /D (subsubsection.6.2.10.3) >> endobj 328 0 obj -(6.2.11 lwres Statement Grammar) +(6.2.10.3 The query-errors Category) endobj 329 0 obj -<< /S /GoTo /D (subsection.6.2.12) >> +<< /S /GoTo /D (subsection.6.2.11) >> endobj 332 0 obj -(6.2.12 lwres Statement Definition and Usage) +(6.2.11 lwres Statement Grammar) endobj 333 0 obj -<< /S /GoTo /D (subsection.6.2.13) >> +<< /S /GoTo /D (subsection.6.2.12) >> endobj 336 0 obj -(6.2.13 masters Statement Grammar) +(6.2.12 lwres Statement Definition and Usage) endobj 337 0 obj -<< /S /GoTo /D (subsection.6.2.14) >> +<< /S /GoTo /D (subsection.6.2.13) >> endobj 340 0 obj -(6.2.14 masters Statement Definition and Usage) +(6.2.13 masters Statement Grammar) endobj 341 0 obj -<< /S /GoTo /D (subsection.6.2.15) >> +<< /S /GoTo /D (subsection.6.2.14) >> endobj 344 0 obj -(6.2.15 options Statement Grammar) +(6.2.14 masters Statement Definition and Usage) endobj 345 0 obj -<< /S /GoTo /D (subsection.6.2.16) >> +<< /S /GoTo /D (subsection.6.2.15) >> endobj 348 0 obj -(6.2.16 options Statement Definition and Usage) +(6.2.15 options Statement Grammar) endobj 349 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.1) >> +<< /S /GoTo /D (subsection.6.2.16) >> endobj 352 0 obj -(6.2.16.1 Boolean Options) +(6.2.16 options Statement Definition and Usage) endobj 353 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.2) >> +<< /S /GoTo /D (subsubsection.6.2.16.1) >> endobj 356 0 obj -(6.2.16.2 Forwarding) +(6.2.16.1 Boolean Options) endobj 357 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.3) >> +<< /S /GoTo /D (subsubsection.6.2.16.2) >> endobj 360 0 obj -(6.2.16.3 Dual-stack Servers) +(6.2.16.2 Forwarding) endobj 361 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.4) >> +<< /S /GoTo /D (subsubsection.6.2.16.3) >> endobj 364 0 obj -(6.2.16.4 Access Control) +(6.2.16.3 Dual-stack Servers) endobj 365 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.5) >> +<< /S /GoTo /D (subsubsection.6.2.16.4) >> endobj 368 0 obj -(6.2.16.5 Interfaces) +(6.2.16.4 Access Control) endobj 369 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.6) >> +<< /S /GoTo /D (subsubsection.6.2.16.5) >> endobj 372 0 obj -(6.2.16.6 Query Address) +(6.2.16.5 Interfaces) endobj 373 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.7) >> +<< /S /GoTo /D (subsubsection.6.2.16.6) >> endobj 376 0 obj -(6.2.16.7 Zone Transfers) +(6.2.16.6 Query Address) endobj 377 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.8) >> +<< /S /GoTo /D (subsubsection.6.2.16.7) >> endobj 380 0 obj -(6.2.16.8 UDP Port Lists) +(6.2.16.7 Zone Transfers) endobj 381 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.9) >> +<< /S /GoTo /D (subsubsection.6.2.16.8) >> endobj 384 0 obj -(6.2.16.9 Operating System Resource Limits) +(6.2.16.8 UDP Port Lists) endobj 385 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.10) >> +<< /S /GoTo /D (subsubsection.6.2.16.9) >> endobj 388 0 obj -(6.2.16.10 Server Resource Limits) +(6.2.16.9 Operating System Resource Limits) endobj 389 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.11) >> +<< /S /GoTo /D (subsubsection.6.2.16.10) >> endobj 392 0 obj -(6.2.16.11 Periodic Task Intervals) +(6.2.16.10 Server Resource Limits) endobj 393 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.12) >> +<< /S /GoTo /D (subsubsection.6.2.16.11) >> endobj 396 0 obj -(6.2.16.12 Topology) +(6.2.16.11 Periodic Task Intervals) endobj 397 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.13) >> +<< /S /GoTo /D (subsubsection.6.2.16.12) >> endobj 400 0 obj -(6.2.16.13 The sortlist Statement) +(6.2.16.12 Topology) endobj 401 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.14) >> +<< /S /GoTo /D (subsubsection.6.2.16.13) >> endobj 404 0 obj -(6.2.16.14 RRset Ordering) +(6.2.16.13 The sortlist Statement) endobj 405 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.15) >> +<< /S /GoTo /D (subsubsection.6.2.16.14) >> endobj 408 0 obj -(6.2.16.15 Tuning) +(6.2.16.14 RRset Ordering) endobj 409 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.16) >> +<< /S /GoTo /D (subsubsection.6.2.16.15) >> endobj 412 0 obj -(6.2.16.16 Built-in server information zones) +(6.2.16.15 Tuning) endobj 413 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.17) >> +<< /S /GoTo /D (subsubsection.6.2.16.16) >> endobj 416 0 obj -(6.2.16.17 Built-in Empty Zones) +(6.2.16.16 Built-in server information zones) endobj 417 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.18) >> +<< /S /GoTo /D (subsubsection.6.2.16.17) >> endobj 420 0 obj -(6.2.16.18 Additional Section Caching) +(6.2.16.17 Built-in Empty Zones) endobj 421 0 obj -<< /S /GoTo /D (subsection.6.2.17) >> +<< /S /GoTo /D (subsubsection.6.2.16.18) >> endobj 424 0 obj -(6.2.17 statistics-channels Statement Grammar) +(6.2.16.18 Additional Section Caching) endobj 425 0 obj -<< /S /GoTo /D (subsection.6.2.18) >> +<< /S /GoTo /D (subsection.6.2.17) >> endobj 428 0 obj -(6.2.18 statistics-channels Statement Definition and Usage) +(6.2.17 server Statement Grammar) endobj 429 0 obj -<< /S /GoTo /D (subsection.6.2.19) >> +<< /S /GoTo /D (subsection.6.2.18) >> endobj 432 0 obj -(6.2.19 server Statement Grammar) +(6.2.18 server Statement Definition and Usage) endobj 433 0 obj -<< /S /GoTo /D (subsection.6.2.20) >> +<< /S /GoTo /D (subsection.6.2.19) >> endobj 436 0 obj -(6.2.20 server Statement Definition and Usage) +(6.2.19 statistics-channels Statement Grammar) endobj 437 0 obj -<< /S /GoTo /D (subsection.6.2.21) >> +<< /S /GoTo /D (subsection.6.2.20) >> endobj 440 0 obj -(6.2.21 trusted-keys Statement Grammar) +(6.2.20 statistics-channels Statement Definition and Usage) endobj 441 0 obj -<< /S /GoTo /D (subsection.6.2.22) >> +<< /S /GoTo /D (subsection.6.2.21) >> endobj 444 0 obj -(6.2.22 trusted-keys Statement Definition and Usage) +(6.2.21 trusted-keys Statement Grammar) endobj 445 0 obj -<< /S /GoTo /D (subsection.6.2.23) >> +<< /S /GoTo /D (subsection.6.2.22) >> endobj 448 0 obj -(6.2.23 view Statement Grammar) +(6.2.22 trusted-keys Statement Definition and Usage) endobj 449 0 obj -<< /S /GoTo /D (subsection.6.2.24) >> +<< /S /GoTo /D (subsection.6.2.23) >> endobj 452 0 obj -(6.2.24 view Statement Definition and Usage) +(6.2.23 view Statement Grammar) endobj 453 0 obj -<< /S /GoTo /D (subsection.6.2.25) >> +<< /S /GoTo /D (subsection.6.2.24) >> endobj 456 0 obj -(6.2.25 zone Statement Grammar) +(6.2.24 view Statement Definition and Usage) endobj 457 0 obj -<< /S /GoTo /D (subsection.6.2.26) >> +<< /S /GoTo /D (subsection.6.2.25) >> endobj 460 0 obj -(6.2.26 zone Statement Definition and Usage) +(6.2.25 zone Statement Grammar) endobj 461 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.1) >> +<< /S /GoTo /D (subsection.6.2.26) >> endobj 464 0 obj -(6.2.26.1 Zone Types) +(6.2.26 zone Statement Definition and Usage) endobj 465 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.2) >> +<< /S /GoTo /D (subsubsection.6.2.26.1) >> endobj 468 0 obj -(6.2.26.2 Class) +(6.2.26.1 Zone Types) endobj 469 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.3) >> +<< /S /GoTo /D (subsubsection.6.2.26.2) >> endobj 472 0 obj -(6.2.26.3 Zone Options) +(6.2.26.2 Class) endobj 473 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.4) >> +<< /S /GoTo /D (subsubsection.6.2.26.3) >> endobj 476 0 obj -(6.2.26.4 Dynamic Update Policies) +(6.2.26.3 Zone Options) endobj 477 0 obj -<< /S /GoTo /D (section.6.3) >> +<< /S /GoTo /D (subsubsection.6.2.26.4) >> endobj 480 0 obj -(6.3 Zone File) +(6.2.26.4 Dynamic Update Policies) endobj 481 0 obj -<< /S /GoTo /D (subsection.6.3.1) >> +<< /S /GoTo /D (section.6.3) >> endobj 484 0 obj -(6.3.1 Types of Resource Records and When to Use Them) +(6.3 Zone File) endobj 485 0 obj -<< /S /GoTo /D (subsubsection.6.3.1.1) >> +<< /S /GoTo /D (subsection.6.3.1) >> endobj 488 0 obj -(6.3.1.1 Resource Records) +(6.3.1 Types of Resource Records and When to Use Them) endobj 489 0 obj -<< /S /GoTo /D (subsubsection.6.3.1.2) >> +<< /S /GoTo /D (subsubsection.6.3.1.1) >> endobj 492 0 obj -(6.3.1.2 Textual expression of RRs) +(6.3.1.1 Resource Records) endobj 493 0 obj -<< /S /GoTo /D (subsection.6.3.2) >> +<< /S /GoTo /D (subsubsection.6.3.1.2) >> endobj 496 0 obj -(6.3.2 Discussion of MX Records) +(6.3.1.2 Textual expression of RRs) endobj 497 0 obj -<< /S /GoTo /D (subsection.6.3.3) >> +<< /S /GoTo /D (subsection.6.3.2) >> endobj 500 0 obj -(6.3.3 Setting TTLs) +(6.3.2 Discussion of MX Records) endobj 501 0 obj -<< /S /GoTo /D (subsection.6.3.4) >> +<< /S /GoTo /D (subsection.6.3.3) >> endobj 504 0 obj -(6.3.4 Inverse Mapping in IPv4) +(6.3.3 Setting TTLs) endobj 505 0 obj -<< /S /GoTo /D (subsection.6.3.5) >> +<< /S /GoTo /D (subsection.6.3.4) >> endobj 508 0 obj -(6.3.5 Other Zone File Directives) +(6.3.4 Inverse Mapping in IPv4) endobj 509 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.1) >> +<< /S /GoTo /D (subsection.6.3.5) >> endobj 512 0 obj -(6.3.5.1 The \044ORIGIN Directive) +(6.3.5 Other Zone File Directives) endobj 513 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.2) >> +<< /S /GoTo /D (subsubsection.6.3.5.1) >> endobj 516 0 obj -(6.3.5.2 The \044INCLUDE Directive) +(6.3.5.1 The \044ORIGIN Directive) endobj 517 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.3) >> +<< /S /GoTo /D (subsubsection.6.3.5.2) >> endobj 520 0 obj -(6.3.5.3 The \044TTL Directive) +(6.3.5.2 The \044INCLUDE Directive) endobj 521 0 obj -<< /S /GoTo /D (subsection.6.3.6) >> +<< /S /GoTo /D (subsubsection.6.3.5.3) >> endobj 524 0 obj -(6.3.6 BIND Master File Extension: the \044GENERATE Directive) +(6.3.5.3 The \044TTL Directive) endobj 525 0 obj -<< /S /GoTo /D (subsection.6.3.7) >> +<< /S /GoTo /D (subsection.6.3.6) >> endobj 528 0 obj -(6.3.7 Additional File Formats) +(6.3.6 BIND Master File Extension: the \044GENERATE Directive) endobj 529 0 obj -<< /S /GoTo /D (section.6.4) >> +<< /S /GoTo /D (subsection.6.3.7) >> endobj 532 0 obj -(6.4 BIND9 Statistics) +(6.3.7 Additional File Formats) endobj 533 0 obj -<< /S /GoTo /D (subsubsection.6.4.0.1) >> +<< /S /GoTo /D (section.6.4) >> endobj 536 0 obj -(6.4.0.1 The Statistics File) +(6.4 BIND9 Statistics) endobj 537 0 obj -<< /S /GoTo /D (subsection.6.4.1) >> +<< /S /GoTo /D (subsubsection.6.4.0.1) >> endobj 540 0 obj -(6.4.1 Statistics Counters) +(6.4.0.1 The Statistics File) endobj 541 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.1) >> +<< /S /GoTo /D (subsection.6.4.1) >> endobj 544 0 obj -(6.4.1.1 Name Server Statistics Counters) +(6.4.1 Statistics Counters) endobj 545 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.2) >> +<< /S /GoTo /D (subsubsection.6.4.1.1) >> endobj 548 0 obj -(6.4.1.2 Zone Maintenance Statistics Counters) +(6.4.1.1 Name Server Statistics Counters) endobj 549 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.3) >> +<< /S /GoTo /D (subsubsection.6.4.1.2) >> endobj 552 0 obj -(6.4.1.3 Resolver Statistics Counters) +(6.4.1.2 Zone Maintenance Statistics Counters) endobj 553 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.4) >> +<< /S /GoTo /D (subsubsection.6.4.1.3) >> endobj 556 0 obj -(6.4.1.4 Compatibility with BIND 8 Counters) +(6.4.1.3 Resolver Statistics Counters) endobj 557 0 obj -<< /S /GoTo /D (chapter.7) >> +<< /S /GoTo /D (subsubsection.6.4.1.4) >> endobj 560 0 obj -(7 BIND 9 Security Considerations) +(6.4.1.4 Socket I/O Statistics Counters) endobj 561 0 obj -<< /S /GoTo /D (section.7.1) >> +<< /S /GoTo /D (subsubsection.6.4.1.5) >> endobj 564 0 obj -(7.1 Access Control Lists) +(6.4.1.5 Compatibility with BIND 8 Counters) endobj 565 0 obj -<< /S /GoTo /D (section.7.2) >> +<< /S /GoTo /D (chapter.7) >> endobj 568 0 obj -(7.2 Chroot and Setuid) +(7 BIND 9 Security Considerations) endobj 569 0 obj -<< /S /GoTo /D (subsection.7.2.1) >> +<< /S /GoTo /D (section.7.1) >> endobj 572 0 obj -(7.2.1 The chroot Environment) +(7.1 Access Control Lists) endobj 573 0 obj -<< /S /GoTo /D (subsection.7.2.2) >> +<< /S /GoTo /D (section.7.2) >> endobj 576 0 obj -(7.2.2 Using the setuid Function) +(7.2 Chroot and Setuid) endobj 577 0 obj -<< /S /GoTo /D (section.7.3) >> +<< /S /GoTo /D (subsection.7.2.1) >> endobj 580 0 obj -(7.3 Dynamic Update Security) +(7.2.1 The chroot Environment) endobj 581 0 obj -<< /S /GoTo /D (chapter.8) >> +<< /S /GoTo /D (subsection.7.2.2) >> endobj 584 0 obj -(8 Troubleshooting) +(7.2.2 Using the setuid Function) endobj 585 0 obj -<< /S /GoTo /D (section.8.1) >> +<< /S /GoTo /D (section.7.3) >> endobj 588 0 obj -(8.1 Common Problems) +(7.3 Dynamic Update Security) endobj 589 0 obj -<< /S /GoTo /D (subsection.8.1.1) >> +<< /S /GoTo /D (chapter.8) >> endobj 592 0 obj -(8.1.1 It's not working; how can I figure out what's wrong?) +(8 Troubleshooting) endobj 593 0 obj -<< /S /GoTo /D (section.8.2) >> +<< /S /GoTo /D (section.8.1) >> endobj 596 0 obj -(8.2 Incrementing and Changing the Serial Number) +(8.1 Common Problems) endobj 597 0 obj -<< /S /GoTo /D (section.8.3) >> +<< /S /GoTo /D (subsection.8.1.1) >> endobj 600 0 obj -(8.3 Where Can I Get Help?) +(8.1.1 It's not working; how can I figure out what's wrong?) endobj 601 0 obj -<< /S /GoTo /D (appendix.A) >> +<< /S /GoTo /D (section.8.2) >> endobj 604 0 obj -(A Appendices) +(8.2 Incrementing and Changing the Serial Number) endobj 605 0 obj -<< /S /GoTo /D (section.A.1) >> +<< /S /GoTo /D (section.8.3) >> endobj 608 0 obj -(A.1 Acknowledgments) +(8.3 Where Can I Get Help?) endobj 609 0 obj -<< /S /GoTo /D (subsection.A.1.1) >> +<< /S /GoTo /D (appendix.A) >> endobj 612 0 obj -(A.1.1 A Brief History of the DNS and BIND) +(A Appendices) endobj 613 0 obj -<< /S /GoTo /D (section.A.2) >> +<< /S /GoTo /D (section.A.1) >> endobj 616 0 obj -(A.2 General DNS Reference Information) +(A.1 Acknowledgments) endobj 617 0 obj -<< /S /GoTo /D (subsection.A.2.1) >> +<< /S /GoTo /D (subsection.A.1.1) >> endobj 620 0 obj -(A.2.1 IPv6 addresses \(AAAA\)) +(A.1.1 A Brief History of the DNS and BIND) endobj 621 0 obj -<< /S /GoTo /D (section.A.3) >> +<< /S /GoTo /D (section.A.2) >> endobj 624 0 obj -(A.3 Bibliography \(and Suggested Reading\)) +(A.2 General DNS Reference Information) endobj 625 0 obj -<< /S /GoTo /D (subsection.A.3.1) >> +<< /S /GoTo /D (subsection.A.2.1) >> endobj 628 0 obj -(A.3.1 Request for Comments \(RFCs\)) +(A.2.1 IPv6 addresses \(AAAA\)) endobj 629 0 obj -<< /S /GoTo /D (subsection.A.3.2) >> +<< /S /GoTo /D (section.A.3) >> endobj 632 0 obj -(A.3.2 Internet Drafts) +(A.3 Bibliography \(and Suggested Reading\)) endobj 633 0 obj -<< /S /GoTo /D (subsection.A.3.3) >> +<< /S /GoTo /D (subsection.A.3.1) >> endobj 636 0 obj -(A.3.3 Other Documents About BIND) +(A.3.1 Request for Comments \(RFCs\)) endobj 637 0 obj -<< /S /GoTo /D (appendix.B) >> +<< /S /GoTo /D (subsection.A.3.2) >> endobj 640 0 obj -(B Manual pages) +(A.3.2 Internet Drafts) endobj 641 0 obj -<< /S /GoTo /D (section.B.1) >> +<< /S /GoTo /D (subsection.A.3.3) >> endobj 644 0 obj -(B.1 dig) +(A.3.3 Other Documents About BIND) endobj 645 0 obj -<< /S /GoTo /D (section.B.2) >> +<< /S /GoTo /D (appendix.B) >> endobj 648 0 obj -(B.2 host) +(B Manual pages) endobj 649 0 obj -<< /S /GoTo /D (section.B.3) >> +<< /S /GoTo /D (section.B.1) >> endobj 652 0 obj -(B.3 dnssec-dsfromkey) +(B.1 dig) endobj 653 0 obj -<< /S /GoTo /D (section.B.4) >> +<< /S /GoTo /D (section.B.2) >> endobj 656 0 obj -(B.4 dnssec-keyfromlabel) +(B.2 host) endobj 657 0 obj -<< /S /GoTo /D (section.B.5) >> +<< /S /GoTo /D (section.B.3) >> endobj 660 0 obj -(B.5 dnssec-keygen) +(B.3 dnssec-dsfromkey) endobj 661 0 obj -<< /S /GoTo /D (section.B.6) >> +<< /S /GoTo /D (section.B.4) >> endobj 664 0 obj -(B.6 dnssec-signzone) +(B.4 dnssec-keyfromlabel) endobj 665 0 obj -<< /S /GoTo /D (section.B.7) >> +<< /S /GoTo /D (section.B.5) >> endobj 668 0 obj -(B.7 named-checkconf) +(B.5 dnssec-keygen) endobj 669 0 obj -<< /S /GoTo /D (section.B.8) >> +<< /S /GoTo /D (section.B.6) >> endobj 672 0 obj -(B.8 named-checkzone) +(B.6 dnssec-signzone) endobj 673 0 obj -<< /S /GoTo /D (section.B.9) >> +<< /S /GoTo /D (section.B.7) >> endobj 676 0 obj -(B.9 named) +(B.7 named-checkconf) endobj 677 0 obj -<< /S /GoTo /D (section.B.10) >> +<< /S /GoTo /D (section.B.8) >> endobj 680 0 obj -(B.10 nsupdate) +(B.8 named-checkzone) endobj 681 0 obj -<< /S /GoTo /D (section.B.11) >> +<< /S /GoTo /D (section.B.9) >> endobj 684 0 obj -(B.11 rndc) +(B.9 named) endobj 685 0 obj -<< /S /GoTo /D (section.B.12) >> +<< /S /GoTo /D (section.B.10) >> endobj 688 0 obj -(B.12 rndc.conf) +(B.10 nsupdate) endobj 689 0 obj -<< /S /GoTo /D (section.B.13) >> +<< /S /GoTo /D (section.B.11) >> endobj 692 0 obj -(B.13 rndc-confgen) +(B.11 rndc) endobj 693 0 obj -<< /S /GoTo /D [694 0 R /FitH ] >> +<< /S /GoTo /D (section.B.12) >> +endobj +696 0 obj +(B.12 rndc.conf) +endobj +697 0 obj +<< /S /GoTo /D (section.B.13) >> +endobj +700 0 obj +(B.13 rndc-confgen) +endobj +701 0 obj +<< /S /GoTo /D [702 0 R /FitH ] >> endobj -697 0 obj << +705 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚÁJA †ïó9¶‡M'™d2s´T¥‚Beoâai·Rp·t­ïïÔÕ*êArÉÿ‘ü /A}È–ՓºsžŠvíèƒ ¨B)þP+!ÃlQ¡bJÕÂwìNì1úÈP©)&>áóÚÍ®˜€-A½bEM¦pæêÍÃd¾¼[L+V?ÉcºØt»~÷ršã~[÷í¶Ú~ÝNë a¤(±ø˘’å÷9·MÿÚ<ŸwYŸÝQ DËr;yƒ|ê~üÁÁýhÌ–ÁbïVV_§æŒlåP}&ûÿsßC+WDendstream endobj -694 0 obj << +702 0 obj << /Type /Page -/Contents 697 0 R -/Resources 696 0 R +/Contents 705 0 R +/Resources 704 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R +/Parent 711 0 R >> endobj -695 0 obj << +703 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./isc-logo.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 704 0 R +/PTEX.InfoDict 712 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 255.00000000 149.00000000] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << -/R15 705 0 R -/R9 706 0 R -/R11 707 0 R -/R13 708 0 R +/R15 713 0 R +/R9 714 0 R +/R11 715 0 R +/R13 716 0 R >>/ExtGState << -/R17 709 0 R -/R8 710 0 R ->>/Font << /R19 711 0 R >> +/R17 717 0 R +/R8 718 0 R +>>/Font << /R19 719 0 R >> >> -/Length 712 0 R +/Length 720 0 R /Filter /FlateDecode >> stream @@ -1085,7 +1097,7 @@ x FÑÞIca­Ç0Ú) ¹A¿+ÇÀº ¸|-Tuùa>‚s:½¯•~K“ÒÞV׋„OÒAŠI… ɪÁr2Q“°Ø¨Á>.zÎCN’¦{Õ«'^5Mã»Åûæ¡æÔÊý¹U1z6õßvãpF)ÂÏåìÊ›C£i#]bÝLkS#ˆQÁŽv–¨Ô­«•ÇcHŸ$¬Áê³DI­ÌÑptÅ73*_åª'ŽÚ¿¢ÚòQŒ×è Œ‚,É*Ñ+ôÚ™%vŽ&u߉ xœÉ-¾kz˜ Ï‡Ú Q´Pë3ÈZ§q¢Æ0¯ˆwMÍ?©=õ*_Ç£RïѪëƬ¡”’¢g!SeRâÅéz·ÝŠFLÚŸv ÏÆ狼eÇNdæÌdï"gK2cëÉ—GoOá8GëÏϦ:B Àht[~Ðåõ—×SÒÜ£uˆQk·%È´ÔÛ†ëiATÆÌp[OU‡Ç(zßQã³* *Ñûø®á¾FÅÍ„Ï'µV‡¾;1aŠÑüËŒÜr$¿Íâ9Ë8ˆü ý‚TóþÏÍ÷_oôô¢ññCÙõ"ú*~uÊqæþéïÛ{Ç"ß~±Úú"ú…bùz+·£]OZ,SÏ¥._^·§_\^þ†56g‡3^®Ç5Z©®©¹Uý¶õòÇí÷O¿½<Ó#rYëé»Ë^~¹ÁÇ<ц®5%¥Ü~ÿñsõ\êídŽ3¼4ü~èé[iþÂÈg óžµ|¥Ïà5³m“XSô7…ÿúáò¬ä>!»Î“O÷hKYð¿þîÇ Ó3/¡úôÃgë¾4EO=öï¦üì“­‡v5”ùÜþû‚ék”ùôñR”Ì¡ÌlöÅ·ß_DÍη„Rf.{úÏåYӎͧÿ^ž©í5¬?ývýüeûMüó?Ò ƒendstream endobj -704 0 obj +712 0 obj << /Producer (AFPL Ghostscript 8.51) /CreationDate (D:20050606145621) @@ -1095,46 +1107,46 @@ endobj /Author (Douglas E. Appelt) >> endobj -705 0 obj -[/Separation/PANTONE#201805#20C/DeviceCMYK 713 0 R] +713 0 obj +[/Separation/PANTONE#201805#20C/DeviceCMYK 721 0 R] endobj -706 0 obj -[/Separation/PANTONE#207506#20C/DeviceCMYK 714 0 R] +714 0 obj +[/Separation/PANTONE#207506#20C/DeviceCMYK 722 0 R] endobj -707 0 obj -[/Separation/PANTONE#20301#20C/DeviceCMYK 715 0 R] +715 0 obj +[/Separation/PANTONE#20301#20C/DeviceCMYK 723 0 R] endobj -708 0 obj -[/Separation/PANTONE#20871#20C/DeviceCMYK 716 0 R] +716 0 obj +[/Separation/PANTONE#20871#20C/DeviceCMYK 724 0 R] endobj -709 0 obj +717 0 obj << /Type /ExtGState /SA true >> endobj -710 0 obj +718 0 obj << /Type /ExtGState /OPM 1 >> endobj -711 0 obj +719 0 obj << /BaseFont /NVXWCK#2BTrajanPro-Bold -/FontDescriptor 717 0 R +/FontDescriptor 725 0 R /Type /Font /FirstChar 67 /LastChar 136 /Widths [ 800 0 0 0 0 0 452 0 0 0 0 0 0 0 0 0 582 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 841 633 576 686 590 540 923 827 407 760] -/Encoding 718 0 R +/Encoding 726 0 R /Subtype /Type1 >> endobj -712 0 obj +720 0 obj 2362 endobj -713 0 obj +721 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1145,7 +1157,7 @@ endobj stream xœ«N)-P0PÈ-ÍQH­HÎPsõ, QE¸zFÆ`^-=1°endstream endobj -714 0 obj +722 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1156,7 +1168,7 @@ endobj stream xœ«N)-P0PÈ-ÍQH­HÎPsõ LÑE ‘D Êk8/«endstream endobj -715 0 obj +723 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1167,7 +1179,7 @@ endobj stream xœ«N)-P0TÈ-ÍQH­HÎPq ôLLÑD\=C 0¯=D³endstream endobj -716 0 obj +724 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1178,7 +1190,7 @@ endobj stream xœ«N)-P0Ð365³TÈ-ÍQH­HÎP€Š™X ‹™›#Ä ô -,ŒÀüZ&‹ˆendstream endobj -717 0 obj +725 0 obj << /Type /FontDescriptor /FontName /NVXWCK#2BTrajanPro-Bold @@ -1191,17 +1203,17 @@ endobj /StemV 138 /MissingWidth 500 /CharSet (/Msmall/C/Ysmall/Nsmall/Osmall/Esmall/Rsmall/S/Ssmall/I/Tsmall/Ismall/Usmall) -/FontFile3 719 0 R +/FontFile3 727 0 R >> endobj -718 0 obj +726 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 127/Nsmall/Tsmall/Esmall/Rsmall/Ysmall/Ssmall/Msmall/Osmall/Ismall/Usmall] >> endobj -719 0 obj +727 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -1224,44 +1236,40 @@ x ȼLçÇ<;— *X³«¥×ÛGâ_Y1ETïƒ4ˆÒ-U…_>´üØ¢æ}õï÷v¼ §ádù#¹rÛŸå¥@ÔÁ\5l…hð<8Ús·’?h¹†!-¶‚*JŠ»,\G/Wé9OW—×µ.Ÿ—­€&¨[”ÄIÁÚ´Ó½7ýáÐäKý¡«¨ðúš.cxQn<¼À°üÖëgöõÁúhíY8³¶+oî^÷ë°‹>9p¯“°¥!ÑÚÙ®ŠðK´¢†#©óRÄlxŽJ”ب¬Ò–àá•{ϳwÿaû’ožÇ£ëHõÅâH9”ç/.~å÷Ë »O·Øèv61Bá5*È<6ÞÍ,‡bh‘˜¶ž\Î]Çé#¹#ØÔÍ1Oúñ°Ï¤5oÂ]цÆß4}h˜î0$å,6ü¼”A,¯?/å;Rôcy6Ò½UJ¿§Y½X^é¶ÙÉŸ‡‹º–2¸K|o½Ø”/Ȩ/ƒ( Â2Ð#žNMKðrˆ rœÛf9ËyZ¸Ú}$«Ö õ–©)  h`iÎGàAç÷´€H+Šˆ…Õ&*áX$žèìVŽhª”—›¾÷‡A1Ý£¤œÏ0‰÷—Hi éƒw~I(Áö2;à]¸L ™x4[¡OÜ,¾®ÆûÂQQ°”FdQ“ƒ¢¬„%\î¢Åâ:Ó;ÈÑ”ÌEb1ž’¡ˆÿ§=$¸¥?Iš¿CÐõ3¾C=VÐ'>·¯ôÌÒ+Ü~8 ç#;úÁ_£×á*qň+ô 8®‚ãÆpêŒ_YR”¾d%a ç¡H\eÄõãDf£Ñ¨­ŽR[kφG¸ù/WT®ò•A5”H¥ÛVoo8hnû)¼ÞÃDn…ñëqÌzfåhý&þcQbµXÇß‚çLŽúõ;{²Ðñðué¿ÊÛÙ†-©[SÄ-Û¼ÔyubÜñhüm´œ4^Ë™ ääšLÿQ‹¡endstream endobj -698 0 obj << -/D [694 0 R /XYZ 85.0394 794.5015 null] +706 0 obj << +/D [702 0 R /XYZ 85.0394 794.5015 null] >> endobj -699 0 obj << -/D [694 0 R /XYZ 85.0394 769.5949 null] +707 0 obj << +/D [702 0 R /XYZ 85.0394 769.5949 null] >> endobj -696 0 obj << -/Font << /F21 702 0 R >> -/XObject << /Im1 695 0 R >> +704 0 obj << +/Font << /F21 710 0 R >> +/XObject << /Im1 703 0 R >> /ProcSet [ /PDF /Text ] >> endobj -722 0 obj << -/Length 999 +730 0 obj << +/Length 1001 /Filter /FlateDecode >> stream -xÚµV]“¢:}÷Wð¨UC6|å‘AT¶\ÀÚÚÝGq†ªQ¼‚;5ÿþ6$Qï¼lÝò!ô±ûôI'„h~D3-dqÊ5›ÈÄÄÔÖ»Ö^À7‰ÁšŽãNëügðó7Ö6ú:«ï0ÁˆpNµÝÀ02 ÆÔÊÛ |;‡ºðª€×Ùtƒ˜È´¨¡éÌ@°»DÝ ·e3GÓm“#‹QÖ ³Á— ˜q‹ZZ¶Õ88M“hgT¶ù9ôÊÃDZxy­G¿³¯š‰‘yK cX7Ž/b\DÒ)²-n·š(Ü/PN@{I EP0DlAcãa¤S7¦Ù™VgÚé+Ø×ùqŸ×b–~Tu¾«ÄÄ+÷Uy¬‹ÓîAa×h¤3‚‰Qj©× 0% ¿Ÿ•#Œ‚Ì–¥Ùàæ§2ŸÑú%üVgÂlØ`›wQÿKhú -;IgÒÎdwÕ-·õûê8"Î0¿–]ëgaÄ©åh6eÀŒÏäS`ý}«že"ŽÒÅlÊYäÇ]QUE¹œêRŒ§*—õ¬AÞ!d(ç»rSl{+«ýF›¢ªÅó©–Ö¯…ì¦ê¦ømyTÿþÆát<”•t¿õ«°®Y)ORÌm.q Ùu8øŒ€„ nš´-í5ùžeü—ã -6d#IZgù§ØäÅvU+KF_=—òNÑeít_ÖÅ:¿ª¿«÷p%k~8ä+YT!ý«··¶Âؤæ$\V¹‹¼j›sÄŒæR"6âŒÚ-$›ù²ÍâIö4âtè&r%HŸHâïÁØ‹YsrÝT!š™°Ýh¬=aŒÁ -Ý`.Án -CfIÜ( |é| -²™°ê&cq$á¢e¤_RÖ¨ h6Sï¼p9¢éUò`¾UË=&ñDŒs?ñfàÙÆÐ}  ûÑÚ°³7[±#-»IE~š"ÅAŒ‘äë÷!ž <ë)½%õ0pCiOâDe•éÓ…ïnø 4N|¯å¨nÛèf B´ @029ç}=½8JýoK AeLwîNÏr\çïyŸfn“(Kc¨-Q˜.Ãvõ¬þ$‰ç²¶8ítnXa÷âÕ/S_•'·{ÐçM b§Š‡œôewÕèeAõwÊη'SäOÃ`êGžßÏ·‘ÛËÂ@Ô!¤¿å¢!“³¡àx™^攑Ý$HÏZÄˬO%¾¢ Ô"ÿ‚rw4ÎgêmmsøáÐqá'Ðä„g#å×£¤îc(ãIœ¨ª²|ºð½À ”ljïµÕÓ6ºY‚mŒLÎyßO/ŽRÿÛˆAR™Ó»Ó³×õ{»O3·)”¥1hKԦ˰]=»?Iâ¹Ô§Ï +Œà¹xuÆËÔWòDúö ú| )ÁìôAñð¡‘“¾í®½,ˆ£þé‚ì,q{6Eþ4 ¦~äùýJq›¹}Xˆ:„ô\4d2b6Ž—éeM™ÙM‚ôìE¼ÌúTâ+Ú@-ò/(wWã|WÁ ÞÑ6—>z&.üšgîvz&ŸÝš›7‰úc&j¾’î~Œ©zý1¦«jºa#æ8ôþ›ˆ:ðƲٙTû^½!}N™Eï0ÿŸûh~endstream endobj -721 0 obj << +729 0 obj << /Type /Page -/Contents 722 0 R -/Resources 720 0 R +/Contents 730 0 R +/Resources 728 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R +/Parent 711 0 R >> endobj -723 0 obj << -/D [721 0 R /XYZ 56.6929 794.5015 null] +731 0 obj << +/D [729 0 R /XYZ 56.6929 794.5015 null] >> endobj -720 0 obj << -/Font << /F23 726 0 R /F14 729 0 R >> +728 0 obj << +/Font << /F23 734 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj -732 0 obj << +740 0 obj << /Length 2891 /Filter /FlateDecode >> @@ -1281,1389 +1289,1394 @@ W M…­æ:h¾nêãô¨ýèá·oðÐkƒh—#öùlk…lMfR,`5("qP,Þ„b‰Ðø˜Ž~]í»=Ãמ,Åzž%húg°º ÁîGÓäm2ƒÅREŽ7XD‚ ˆ \@pÁ,tûµDÀ'/œÕ½ÊýØø@Á_™'Hûd !E–•B*Åéö®ÒŒ‘@aaëêdz¿µÍ:ê°uõÕ¶HA‰©”!;2¬3ÁX$1Ò5–$LCK¢[ÎÂéÌù›ödŽ÷ÇršgľڀŠL% Ù¤a½ Ò"AP‡…r=|Ê?SRxÐRèWywqqvê:ûñÌ7ƒÊ'*SƒVZâï<Ž`¨ðwæ2ciìÈÛÕ÷ Ε[~©‘&Å3çë™SÿÀóøóp%ðö?ž­®Bendstream endobj -731 0 obj << +739 0 obj << /Type /Page -/Contents 732 0 R -/Resources 730 0 R +/Contents 740 0 R +/Resources 738 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R ] +/Parent 711 0 R +/Annots [ 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R ] >> endobj -735 0 obj << +743 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 688.709 539.579 697.2967] /Subtype /Link /A << /S /GoTo /D (chapter.1) >> >> endobj -736 0 obj << +744 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 676.5858 539.579 685.4425] /Subtype /Link /A << /S /GoTo /D (section.1.1) >> >> endobj -737 0 obj << +745 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 664.4876 539.579 673.3442] /Subtype /Link /A << /S /GoTo /D (section.1.2) >> >> endobj -738 0 obj << +746 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 652.3894 539.579 661.246] /Subtype /Link /A << /S /GoTo /D (section.1.3) >> >> endobj -739 0 obj << +747 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 640.1914 539.579 649.1477] /Subtype /Link /A << /S /GoTo /D (section.1.4) >> >> endobj -740 0 obj << +748 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 628.0932 539.579 637.0495] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.1) >> >> endobj -741 0 obj << +749 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 615.995 539.579 624.9512] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.2) >> >> endobj -742 0 obj << +750 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 603.8967 539.579 612.853] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.3) >> >> endobj -743 0 obj << +751 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 591.7985 539.579 600.7547] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.4) >> >> endobj -744 0 obj << +752 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 579.7002 539.579 588.6565] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.1) >> >> endobj -745 0 obj << +753 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 567.6019 539.579 576.5582] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.2) >> >> endobj -746 0 obj << +754 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 555.5037 539.579 564.46] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.3) >> >> endobj -747 0 obj << +755 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 543.4055 539.579 552.5112] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.5) >> >> endobj -748 0 obj << +756 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 531.3072 539.579 540.413] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.5.1) >> >> endobj -749 0 obj << +757 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 519.209 539.579 528.3147] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.6) >> >> endobj -750 0 obj << +758 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 496.7003 539.579 505.4125] /Subtype /Link /A << /S /GoTo /D (chapter.2) >> >> endobj -751 0 obj << +759 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 484.5772 539.579 493.5832] /Subtype /Link /A << /S /GoTo /D (section.2.1) >> >> endobj -752 0 obj << +760 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 472.4789 539.579 481.485] /Subtype /Link /A << /S /GoTo /D (section.2.2) >> >> endobj -753 0 obj << +761 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 460.3806 539.579 469.3867] /Subtype /Link /A << /S /GoTo /D (section.2.3) >> >> endobj -754 0 obj << +762 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 448.2824 539.579 457.2885] /Subtype /Link /A << /S /GoTo /D (section.2.4) >> >> endobj -755 0 obj << +763 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 436.1841 539.579 445.1902] /Subtype /Link /A << /S /GoTo /D (section.2.5) >> >> endobj -756 0 obj << +764 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 413.4314 539.579 422.288] /Subtype /Link /A << /S /GoTo /D (chapter.3) >> >> endobj -757 0 obj << +765 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 401.353 539.579 410.4588] /Subtype /Link /A << /S /GoTo /D (section.3.1) >> >> endobj -758 0 obj << +766 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 389.2548 539.579 398.3605] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.1) >> >> endobj -759 0 obj << +767 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 377.1565 539.579 386.2623] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.2) >> >> endobj -760 0 obj << +768 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 365.1579 539.579 374.164] /Subtype /Link /A << /S /GoTo /D (section.3.2) >> >> endobj -761 0 obj << +769 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 353.0597 539.579 362.0658] /Subtype /Link /A << /S /GoTo /D (section.3.3) >> >> endobj -762 0 obj << +770 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 340.9614 539.579 349.9675] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.1) >> >> endobj -763 0 obj << +771 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 328.7635 539.579 337.8693] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.1) >> >> endobj -764 0 obj << +772 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 316.6653 539.579 325.771] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.2) >> >> endobj -765 0 obj << +773 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 304.567 539.579 313.6728] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.2) >> >> endobj -766 0 obj << +774 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 281.9139 539.579 290.7706] /Subtype /Link /A << /S /GoTo /D (chapter.4) >> >> endobj -767 0 obj << +775 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 269.8356 539.579 278.9413] /Subtype /Link /A << /S /GoTo /D (section.4.1) >> >> endobj -768 0 obj << +776 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 257.7373 539.579 266.8431] /Subtype /Link /A << /S /GoTo /D (section.4.2) >> >> endobj -769 0 obj << +777 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 245.6391 539.579 254.7448] /Subtype /Link /A << /S /GoTo /D (subsection.4.2.1) >> >> endobj -770 0 obj << +778 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 233.5408 539.579 242.4971] /Subtype /Link /A << /S /GoTo /D (section.4.3) >> >> endobj -771 0 obj << +779 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 221.4426 539.579 230.3988] /Subtype /Link /A << /S /GoTo /D (section.4.4) >> >> endobj -772 0 obj << +780 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 209.3443 539.579 218.3006] /Subtype /Link /A << /S /GoTo /D (subsection.4.4.1) >> >> endobj -773 0 obj << +781 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 197.2461 539.579 206.2023] /Subtype /Link /A << /S /GoTo /D (section.4.5) >> >> endobj -774 0 obj << +782 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 185.1478 539.579 194.1041] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.1) >> >> endobj -775 0 obj << +783 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 173.0496 539.579 182.0058] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.1) >> >> endobj -776 0 obj << +784 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 161.051 539.579 170.0571] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.2) >> >> endobj -777 0 obj << +785 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 148.9527 539.579 157.9588] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.2) >> >> endobj -778 0 obj << +786 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 136.8545 539.579 145.8606] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.3) >> >> endobj -779 0 obj << +787 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 124.7562 539.579 133.7623] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.4) >> >> endobj -780 0 obj << +788 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 112.5583 539.579 121.5146] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.5) >> >> endobj -781 0 obj << +789 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 100.4601 539.579 109.4163] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.6) >> >> endobj -782 0 obj << +790 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 88.3618 539.579 97.3181] /Subtype /Link /A << /S /GoTo /D (section.4.6) >> >> endobj -783 0 obj << +791 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 76.2636 539.579 85.2199] /Subtype /Link /A << /S /GoTo /D (section.4.7) >> >> endobj -784 0 obj << +792 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 64.1653 539.579 73.1216] /Subtype /Link /A << /S /GoTo /D (section.4.8) >> >> endobj -733 0 obj << -/D [731 0 R /XYZ 85.0394 794.5015 null] +741 0 obj << +/D [739 0 R /XYZ 85.0394 794.5015 null] >> endobj -734 0 obj << -/D [731 0 R /XYZ 85.0394 711.9273 null] +742 0 obj << +/D [739 0 R /XYZ 85.0394 711.9273 null] >> endobj -730 0 obj << -/Font << /F21 702 0 R /F23 726 0 R >> +738 0 obj << +/Font << /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -787 0 obj << -/Length 3167 +795 0 obj << +/Length 3159 /Filter /FlateDecode >> stream -xÚí[wÛ6Çßý)ôh?‹ûå1מvw“4q_¶ÛVfJ¢W’›Í~úEZàÈØ­ÓØR{Z;1‡3žÿO ’lBý¿l¢4ÑŽ»‰q’(ÊÔd¶<£“kÿ³ïÎXÌ44…G=¿<ûËka&Ž8ÍõäòãD*E¸ÚÌj-›\^ý|þâí›ËWo.?\ürùÃÙ«ËxVè™QÑžò_g?ÿB'W>€Î(ΪÉgÿJ˜s|²<“J%…³8ûpöcÖëz5«Ç3N~ïñ`ã- Z°ñŒÓa™ÚóšýL1KŒéWuo³©y=s‹W‹zY¯¶~¢˜9Ö~e”ÒâO0Ä>YP2Œ“L/¨÷0i¥š©UÀe¼Qù{µ} -EyÓ¢¢ ?õ´wP é,Fb¨@¹G%† -êqM¤`r¢<4†I›`Ùá"Úõ/«mõï‹©pê´´zPb*KA†(©Prq  àÞ(–m ð”—u[‡VóT…ªÕUè{«ëvuþ[˜éUö˜¥b€!ÆTAˆq2q`  Þûº¢ %Zy<®²/Û™F¿ŠÚÊšÓ¨¢ÒYŒ -0ÄPra¨dâÀPA½§áBY¢™3 –S]ù_A ©,b @©0P2q`  Þ(ReSsãA9Õ•}B–Š†P!ÇÈÄ1€zý­mÑ¡°ðûõ·ß­«å²jWŒ8µ·wp -Æb¸@Å0\2q`¸ ÞÃ4„s¢¸ •¥­+ÞýÁˆµTzíQÕlÑ3‚áŒÛþ˜Ûj[§iL¤Ëp{êc΋y†OPS¡ÆyÊÄñ„z<ùÃ¥'þ8.eÖ±§7 õ©-¦&ÙaÐá0föƒÀÁ\÷ÄHg‰Ô±âDDfÖ¬¶ëf±Ép#¡LðòîICcèÄ—² x"ôäâ@ðÁ½~¬Ÿûr—*˜|0~î1…Vü1à2ÊIÈe1'Àãj%Æ·5æâÀ8A½NŒl7`GLÔALæ«ÙâöªÎQ¢‰qìÐdÇ2~Tóäábx’ÆÐCg?ŒÌuGûš¤ušÓè‡"çðøòµ¯çÿÁ›5b*‹†#P*1¾%6F ê=`¢(tRæ &¿Õ_rS__‚œ!ìiÕ7漘'`ˆñ5ÅxÊÄñ„z< KM£Ž}œ8Š>½N*¤¶˜šd‡A„ØÙCsˆážÃ2î 2‹æúºÝI–)TÆyNZÏQò¨vÆ£ 1v „<™80zPï&ýáN§¥@úPüÜc¢óçì²úÃîËbN€!Æ ÔJŒïïÎÅq‚zW™$å„Sã)íõHÛo[Þ‡FSßUË0ë}ªV«:·êç9©”î{÷i]m< ZðãšÕ„ôà 1x |<™80xPïá<,´Sí -àñÉu³ÎÍt$%Úš;ðHjªBÅô– xòI: -O.Ü{_¡„±„I *Ôá«U‹Ïë:·ÐÇ}}Š°ŒMo¸ÒG|Ý3¦»%`ˆ¡å”ã[ðrq`(¡ÞJZ{z8(aüAP:<Ó‘Ì=¡Ñ'¤µ`ˆ!eÃÉÄ!ƒzÈ(I¨eý•{ÌýUÌe1'Àãj…q’‰ãõ8í„vW‡/U57­Ô›üëÏvðR;®©MÈq1?Àãjˆñ“‰ãõøa†8«AÒÅÏ}.XÉG]B.‹9†'P+9¾q"Æ ê=µâT§$¨H:¬ã,!IÅC ãÛ{rq` ÞFM‡ã;Ñ››fÑ\û†ÁszÀIžÃbB€!FÈ@#„L!¨÷DˆfD9,¢'äÛ7~æ¸ðsÆÜ•.I(gnÿJ—°ê8nŽÉ-Fbè ÄŽc. Ô{BG:¢$ÖÙ¡óþý¦î;Š·Ý…Ž:¼äât›UÊ\1Àãb Ìøâe.Œ Ô{âB¢†}S±æÐóÛþYËúhŒSKŸÎbV’† - !e? Ìuâ„+"ÍEw <¿/¶Óðš“ èWæ«»×ÄÿiVíZ¸1îQY(Öb²<¾&™‹“õž4f‚Hy§19_-o¶_Ò;³Ú«ßÐÔÃö !IÅC ã›brq` Þ”Éô€Ûðìêj·Õ©Z„kݳô¹~QÍ>í -…Óú iÝg£Xêd‡) s=¾Ðœ ÓsÝŽ+Á=H‡oÖßø†À7óÙfÚßÀ–Û.çû\©ì¡'ƒøIÉ##ÆØI,eØ!l $ß • au^MeˆP ök°q;ñÝŸˆÂèûªúd¿®*Ùao«‚R o¸Û{Wæ:<õ_ÁAKpøNú~ΗYV ¾„èƒ7Òsó”‰ñw²ìò\þF–`†¾%ih·±Ü`øß)w^òìkHüŒ8¥øÿÿÂàô^cÙÞXfGödqK‰kßÅ%ü°"úû1‘ZvÈÿ 9†Sendstream +xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±÷¥Û}`dÆÖ‰$z%9©ûé Š8´À‘ÐÆili÷ìÚ‰9œñüÂ`@d#êÿe#¥‰vÜŒ“DQ¦F“ù ]ùŸ½9aí1ãpÐõüâä/¯…9â4×£‹Ï#©ájs2K¨µltqùûé‹÷ï.^½»8?ûãâ—“Wñ¬Ð3£¢>åŸ'¿ÿAG—>€_N(ΪÑ7ÿJ˜s|4?‘J%…3;9?ù5žütcšüM%\hžøU¸¿JýCÅFF9¢…ÿIý‹Hb ;3Néé›rQ.‹õtqu6択þµ¼[­æ§äl¬üï‹tî»ì¾ÔÔgÝÝåsK›åÕ¨ùæ#T+Ø¡á¶ZÛç¯õâz+Ž ~*ŒÔ{`E¢)Õ‘Þ²r>½ZDPÖ×eóÍ?ª…ÿÎP}$%&d5›`ˆUÈIăzÄE”¶.#Zb^T‹Rʯn—‘›órùµ\Öc ‡ŠÊ #!ÙŒCŒ¨7ÃŒ$âÀA½æ‡íË#÷UMÞBâ<"ÔóðöÃWÝ’q{sS-×ͦ‹æëó·ï^6ßyÇÙãd~@!ÇÙC ¨!·Ã%âÀB½‡A†1?ÏQ¡,¹8…yvy¹Ï«jæ§ÃÙ |ûe $âÞ:ï&kn8kàtX¶¶¼¦*©ÖŠ0Él“­Í8XWÒ˜¯áô´?þ´,–w¾œJù”Kæ !}ÙŸ$`ˆ}’ <‰806Pï‘ %c”·lð–·‹®u+RT¼,Êyå']Ψƒ›U ’’™M +0ÄHba¤$âÀHÙòžs%–ºSÝŽ¹[Cm×Áëiµä|.—åbRg.œ|ïñ`ã- Z°áŒÓa™ÚòšüL1KŒiWuo“©y= s‹W³r^.Ö~¢˜9Ô~eÒìO0Ä>YP2Œ“D/¨÷0i¥š©UÀe¸Qù{±ž\‡¢¼ªQц{Ú{¨„tf£ 1T \‚£’ˆCõθ&R09Räí`Ùà"êõ»Åºø×ÙX8u\ZÝ”˜Ê\P !JO*”T(¸÷ˉ¶‚Px Ê˲®C‹iW…ŠÅeè{‹«zuþg˜éÿˆUö˜¥l€!ÆTAˆaq`  ÞÛº¢ %Zy<®²Ïë™F»ŠÚŽʚ㨢Ò™ +0ÄPra¨$âÀPA½wÃ…²D3g:XŽuå¿%¤2`ˆ¥Â@IÄ‚zï@‘š(Û57”c]Ùf d)›`ˆ1Ur˜D¨÷Ðß*Q + ߯¿}³,æó¢^=2âØÞÞÃ%d4`ˆáÃpIÄá‚zÓΉâ2T–º®x÷÷l#ÖRéÔG“Y{LoR„3nÛcÎןì¦1‘.Ãí±Ž9Ïæ b?{Ltþ?»¬¾[Ãr™Í 0Ä8Zaœ$âÀ8A½Ç«L’r©q€”úz¤m·-oC£©ïªe˜õN®‹Å¢L­úùAN*¥Ûã>\/‹•gA ~X³šÞlx€!”O ߊƒõáÎÃb@;UŸ ?\UËÔLGR¢­¹¤ö *TLo.<Ч'Ÿ¤ƒð¤â@àÁ½wðK˜”°FÕ·§î ÏŸ·åòn\.—Õ2µø§,q҆ſ4/´Ô r2™Í 0Ä8JÉáýu©80NPïíLÆ÷ê„1êÓî«š³oË2Å÷ó˜8¨ Mƒ¹Ò|}<¦;%`ˆ¡åÄPJÄ¡„z()I¨e¼C‰?J»gÄ’¹'T¥BZ³‘†2P69¼ +† ê= #9¡Ò©™ÝW4çÅj]&kRÝGI§wöáú°f9!ÇÙüCŒ¨!ÆO"ŒÔ{àGÔsØ]ɇâgŸ>Ü=æ><æ2›`ˆqµÂ8IÄq‚zœ0CœÕ 4í¾¤YÝÔR¯Ò¦¬w¹ó’&;¬©MÈq6?Àãjˆñ“ˆãõø¡Š8%AÒÅÏ>6壮G!—ÙœCŒ¨•¾°™Šãõ»nîqœ[@JXï{^U³²hE}ßÒ1VÂðUɘ®\ !CO9¼~—Š÷ÞÁ`ýˆà`G¤ÃúÝëjù­hžÄ³y<¤üxûÉ=6Bö²Ù†P5\PRq`l Þ;6´#VÁÖG‡å¹—·Ål¼Z“/÷ž'~¾[Û~È R• 0Ä@€R` $âÀ@@½w (C,7½Š!žM&ñ–ùõFÌz¼¨fuÑ8Þß%. `ˆa…Á°HÄazï°Š§ÄB5X¼]øösáÙ8kÊŽ·¹¦ñ ÌÆbx@ÔðFîT¨÷!ˆÑ½Ž„è_ë+7íƒÿàƒ7„1G*bÞ²©†PŒŠD¨÷Ž +ΈýîÃ4T4O+®¡¸8sôtY,VŸ7“ +eØ‹˜¸l,€!†F oBIÅazï° ŽÊzµÄ6XüöòCCŇøÚö‰Øg'åò™M +0ÄPéé5ü@¥T,¨÷Ž&ˆ”÷:ÝÐòüv:[ÃëpV _™.>o^_wHü»ZÔkáƸG¹s&f![c`ˆiÜËòðšd*LcÔ{§1eD2ݓؤ$~5¿Yßu¯V«/nüDKPÛ‚´9Ê ³Ãô‡ + oˆI©¹Žâ[G„•¢'¾mÄvy¹ÙäTÌÂUîI÷‰~QL®7uÂiýtdÙÈ•Ø!2÷r=¼Äœ‘u^PeˆP|Âw?ΡÎõŒè÷Rsó”' +ƒo¼jý«Î{ß”yÝÕvØÛ®0×Ὂšû@øìó,¼§Ðs¶ùÌwK0CßÜÒi…¼+k+‚-Dâ»~ÇÜyi“/,ñÿ1â”âÿû«…»7 ËúÖ";°=‹[J\ýÖ.á篢½s¹%fsˆü?ìÑTÿendstream endobj -786 0 obj << +794 0 obj << /Type /Page -/Contents 787 0 R -/Resources 785 0 R +/Contents 795 0 R +/Resources 793 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R ] +/Parent 711 0 R +/Annots [ 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R ] >> endobj -792 0 obj << +800 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 758.4766 511.2325 767.4329] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.1) >> >> endobj -793 0 obj << +801 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 746.445 511.2325 755.4012] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.2) >> >> endobj -794 0 obj << +802 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 734.5129 511.2325 743.3696] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.3) >> >> endobj -795 0 obj << +803 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 722.3816 511.2325 731.3379] /Subtype /Link /A << /S /GoTo /D (section.4.9) >> >> endobj -796 0 obj << +804 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 710.3499 511.2325 719.3062] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.1) >> >> endobj -797 0 obj << +805 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 698.3182 511.2325 707.2745] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.2) >> >> endobj -798 0 obj << +806 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 675.998 511.2325 684.7301] /Subtype /Link /A << /S /GoTo /D (chapter.5) >> >> endobj -799 0 obj << +807 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 663.9862 511.2325 672.9425] /Subtype /Link /A << /S /GoTo /D (section.5.1) >> >> endobj -800 0 obj << +808 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 651.9545 511.2325 660.9108] /Subtype /Link /A << /S /GoTo /D (section.5.2) >> >> endobj -801 0 obj << +809 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 629.6343 511.2325 638.4909] /Subtype /Link /A << /S /GoTo /D (chapter.6) >> >> endobj -802 0 obj << +810 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 617.6225 511.2325 626.7282] /Subtype /Link /A << /S /GoTo /D (section.6.1) >> >> endobj -803 0 obj << +811 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 605.5908 511.2325 614.5471] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.1) >> >> endobj -804 0 obj << +812 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 593.5591 511.2325 602.5154] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.1) >> >> endobj -805 0 obj << +813 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 581.5275 511.2325 590.4837] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.2) >> >> endobj -806 0 obj << +814 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 569.4958 511.2325 578.4521] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.2) >> >> endobj -807 0 obj << +815 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 557.4641 511.2325 566.4204] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.1) >> >> endobj -808 0 obj << +816 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 545.4324 511.2325 554.5382] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.2) >> >> endobj -809 0 obj << +817 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 533.4007 511.2325 542.5065] /Subtype /Link /A << /S /GoTo /D (section.6.2) >> >> endobj -810 0 obj << +818 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 521.3691 511.2325 530.3254] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.1) >> >> endobj -811 0 obj << +819 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 509.3374 511.2325 518.2937] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.2) >> >> endobj -812 0 obj << +820 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 497.3057 511.2325 506.262] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.3) >> >> endobj -813 0 obj << +821 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 485.274 511.2325 494.2303] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.4) >> >> endobj -814 0 obj << +822 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 473.2424 511.2325 482.1986] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.5) >> >> endobj -815 0 obj << +823 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 461.2107 511.2325 470.167] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.6) >> >> endobj -816 0 obj << +824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 449.179 511.2325 458.1353] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.7) >> >> endobj -817 0 obj << +825 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 437.1473 511.2325 446.1036] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.8) >> >> endobj -818 0 obj << +826 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 425.1157 511.2325 434.0719] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.9) >> >> endobj -819 0 obj << +827 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 413.084 511.2325 422.0403] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.10) >> >> endobj -820 0 obj << +828 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 401.0523 511.2325 410.0086] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.1) >> >> endobj -821 0 obj << +829 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 389.0206 511.2325 398.1264] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.2) >> >> endobj -822 0 obj << +830 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 377.0886 511.2325 386.0947] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.11) >> +/A << /S /GoTo /D (subsubsection.6.2.10.3) >> >> endobj -823 0 obj << +831 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 365.0569 511.2325 374.063] /Subtype /Link +/A << /S /GoTo /D (subsection.6.2.11) >> +>> endobj +832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.2773 352.9256 511.2325 362.0313] +/Subtype /Link /A << /S /GoTo /D (subsection.6.2.12) >> >> endobj -824 0 obj << +833 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 353.0252 511.2325 362.0313] +/Rect [499.2773 340.8939 511.2325 349.9997] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.13) >> >> endobj -825 0 obj << +834 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 340.9936 511.2325 349.9997] +/Rect [499.2773 328.8622 511.2325 337.968] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.14) >> >> endobj -826 0 obj << +835 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 328.9619 511.2325 337.968] +/Rect [499.2773 316.8305 511.2325 325.9363] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.15) >> >> endobj -827 0 obj << +836 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 316.8305 511.2325 325.9363] +/Rect [499.2773 304.7989 511.2325 313.9046] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.16) >> >> endobj -828 0 obj << +837 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 304.8985 511.2325 313.9046] +/Rect [499.2773 292.7672 511.2325 301.873] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.1) >> >> endobj -829 0 obj << +838 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 292.7672 511.2325 301.7235] +/Rect [499.2773 280.7355 511.2325 289.6918] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.2) >> >> endobj -830 0 obj << +839 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 280.7355 511.2325 289.6918] +/Rect [499.2773 268.7038 511.2325 277.6601] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.3) >> >> endobj -831 0 obj << +840 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 268.7038 511.2325 277.6601] +/Rect [499.2773 256.6722 511.2325 265.6285] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.4) >> >> endobj -832 0 obj << +841 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 256.6722 511.2325 265.7779] +/Rect [499.2773 244.6405 511.2325 253.5968] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.5) >> >> endobj -833 0 obj << +842 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 244.6405 511.2325 253.7462] +/Rect [499.2773 232.6088 511.2325 241.5651] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.6) >> >> endobj -834 0 obj << +843 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 232.6088 511.2325 241.5651] +/Rect [499.2773 220.5771 511.2325 229.5334] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.7) >> >> endobj -835 0 obj << +844 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 220.5771 511.2325 229.5334] +/Rect [499.2773 208.5455 511.2325 217.5017] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.8) >> >> endobj -836 0 obj << +845 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 208.5455 511.2325 217.5017] +/Rect [499.2773 196.5138 511.2325 205.4701] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.9) >> >> endobj -837 0 obj << +846 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 196.5138 511.2325 205.4701] +/Rect [499.2773 184.4821 511.2325 193.4384] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.10) >> >> endobj -838 0 obj << +847 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 184.4821 511.2325 193.4384] +/Rect [499.2773 172.4504 511.2325 181.5562] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.11) >> >> endobj -839 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 172.4504 511.2325 181.4067] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.12) >> ->> endobj -840 0 obj << +848 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 160.4187 511.2325 169.5245] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.13) >> +/A << /S /GoTo /D (subsubsection.6.2.16.12) >> >> endobj -841 0 obj << +849 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 148.3871 511.2325 157.3433] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.14) >> +/A << /S /GoTo /D (subsubsection.6.2.16.13) >> >> endobj -842 0 obj << +850 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 136.3554 511.2325 145.3117] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.15) >> +/A << /S /GoTo /D (subsubsection.6.2.16.14) >> >> endobj -843 0 obj << +851 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 124.3237 511.2325 133.4295] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.16) >> +/A << /S /GoTo /D (subsubsection.6.2.16.15) >> >> endobj -844 0 obj << +852 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 112.292 511.2325 121.2483] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.17) >> +/A << /S /GoTo /D (subsubsection.6.2.16.16) >> >> endobj -845 0 obj << +853 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 100.2604 511.2325 109.2166] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.18) >> +/A << /S /GoTo /D (subsubsection.6.2.16.17) >> >> endobj -846 0 obj << +854 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 88.2287 511.2325 97.185] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.17) >> +/A << /S /GoTo /D (subsubsection.6.2.16.18) >> >> endobj -847 0 obj << +855 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 76.197 511.2325 85.1533] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.18) >> +/A << /S /GoTo /D (subsection.6.2.17) >> >> endobj -848 0 obj << +856 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 64.1653 511.2325 73.1216] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.19) >> +/A << /S /GoTo /D (subsection.6.2.18) >> >> endobj -788 0 obj << -/D [786 0 R /XYZ 56.6929 794.5015 null] +796 0 obj << +/D [794 0 R /XYZ 56.6929 794.5015 null] >> endobj -785 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R >> +793 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -851 0 obj << -/Length 3445 -/Filter /FlateDecode ->> -stream -xÚí[SGÇßùzHÕ½}¿ì>laÀ){1©lm’YƒÊH"º@¼Ÿ~{4ÓÝG¨ç@oÖáW -æÌ9:ÿßœ¾Îˆõ¨ÿÇzV*œì'‰¢Lõã-Ú;óï½Ùbí1»á ]xÔ«Ó­¿¾¦çˆÓ\÷N?ƒsYB­e½ÓáÏÛûïOO?îüzúÃÖái<)t̨¨ÏøÛÖÏ¿ÒÞÐûÿa‹á¬ê]û_(aÎñÞxK*A”"üåbëãÖ?ã Á»+ÓÜQÂe¹É|.À'aœëŒN9¢…¯þ(špÂiýAüá .±–Jï£>l^Í®ªY{<«ðqk­ÛÃ>.ú‹j\M;»\ÑíƒêJùd´M'Í_ú“aóâÇyÿ¬ÚÙµŽn“]Eïå‡t®Èà†ÜŠ[¢9e)£úÌÎzÍ‹¨X°Û…†›Šmž¥˜Ýˆ#‹ãõžx‘†(Eyâ…ÝÊËb¶œ/ªáî—êëáøc¨ÜFLÈi11À#fM3×ML&ŒÔ{"F("µÄðoJÌíu†+ñÈJJHa1 ÀdM"L ¨÷DXÍ âV@®FÕu .ý2ê–R¢„x0¥äÿY_îSHw1LÀƒiMN¦LL¨÷cDP `’ߦ۫Œvúñ±Ó MHk14ÀƒfM6šL4¨÷vηJ …R·2óŸé¤Ê3C3· kŸrå¹…¥íR”€BÔÒ°N2A ¡®FÖ&Eú›Pt{å1Š=æªMj1,Ñ c% fD7*`¤ ~™’ÄãzÚ(B•‘P!Ìq¼„ÿ®‰X‰yºã‡Ã_/«¹Ï|à–{("!…Å`C (G& Ô{DsâüˆÂ@ö/ús„ ü1!ñÍ9¹ —Ðb\€!† ÌÈn\2q`¸ Þ.ŠúHXˆ‹¸YOÞ_Ö-F)#Q·¹b.€!ÆTƨn.2q`\ ÞÞÀ2¶Æ…l¸8ø:éGƒ¶ßp9ô]Œæõ‡éÅh0ª[©Ô“•=$¦Xv`ˆÉoL·ì™80ÙQï¾ê¬=ÿ+1ÜwÕ}!`t­¼]øWJ¹Gß‚<èŽk¡˜1`ˆ1e6ÝCæ\c¨÷4Öa’hi"duÿ•qºÖm­Y›~n~žTóér¶Ãìö  -LWÎo c~:¯Ú‘Íb6¡S|^ýLj‡7I3R¬70Äô†ÇôÎÄézOM åDiô^).n—Ö -ö,{!aÅ8C (†C& Ô{ÄA9J¤àÀ[|àÛÕï‹eÿ¢¡¡úýrC5ŸÇ)‹XNVcýT˜§R - !BÁš–wR‹¡÷e,‘”% -xÛŒæƒeFîwÿÊy¯òß÷ÌzÌa1!À#j„’‰#õžÑ æT$D´„|¬‹Ñä¬mÕOß®8/ýËr~B†‹ù†?PAÛ=–‹ãõžøñ &ñ#[~Ž&WÕ,ô -ßõ//#L£¶æ}¸òs+^†"1‹ÅŒCŒ¨ÆH&ŒÔ{bDrÂü±‘Õ2ò~q^Ín~W )£¦[2XŒ®êáŠì9·C!‹ÅŒCŒ¨’íž!ÍÅ1‚zOýUA 50‡/~H™Y§Óþx&ÃÜwïOŽÞg–ê¤ñeŒóö¸5¤vvbOuÏZLh1.Àà -†á’‰Ãõžpa†8ÇÀ…—àrt¼ÿöǃÃÜÖ5E¨]¼pñôêJHe1(ÀJ…’‰õž@¡Š8ê (¢ßóÍ­ÿkb¥ë€ÄÜÏ´üýu^BŠ‹†@PB  L@¨÷Øy‘N<é¶óòêèø ônç‹ÐI½—ÃßÕ¤aÿÍ÷\Ý^dqcF{PUØÄöÝ›ÃãÓ½z†æ4W´ ” -™OÿIãô.bªJA€†kRØ\¸÷‚eÄH•@0-{Ãáj¯O˜NK¼žÎÆý…ï¹j£_91ÅxC (ÕÝxdâÀð@½‡5=©ÑZ„m­²]Ó«‹„k`¨w‰æ‹Ñ Þ/Ä_–ïþ0N!ãÅ8C '¨(†S& 'Ô{ì·He¼‹<º6Ú *gùsœf‹ +Æb8@Al÷Ž\¨÷ÔøHE|# a1÷&ûÓåÄ÷EêU=êžyýè$¥Íe1(Éã(…a²F æ:Õ !ˆd&AKÆqjFskh¶~$x$·Zá6Å -';LafLáÍ 0…1×IaΈÔ8í‘&PßõG^ÆI2¨nÓÙ—–‡>?r±˜ÀS¦Ôvß­›‹Óõž¥ŽpÅ¡ ìÚ¸¸Ãµj5Bµ9ä£Xm`ˆ© ó©‰SõÕÎf¨jËVíýéøÒ+üit1Z|m$¾-Λ)áÖúÆ·4Ü\»š†ÈÌP"â *ö&3Z<´ÎA1e¥@@Cˆ5Il÷.\›ÞYæ1ÂH¢™m–þëéº6¯ŽÕ`9‹TìO'óÑ°šõ›Íây §öÜ-_À`3âÍóÖ!»îÛ·àé°isØáäªYN˜Nš{Y…ϧ vr2_Ì0ĸ‚Êb\eâÀ¸B½'®êÛM\…ý¡?Îãv­üº•Ñþ ŒÅNu•5J «©¯—“AsW´4Ï¡±í„*¤½*`ˆAeÅ ÊÄA…zÍ+“„S˜ -w7uÞÏ–º·Fé—)Ë<0!§ÅÀC ¨L& ˜ ï¹QwŒhÕ>ƶ£ ÓÆØölºütQÍÏ}ûU×£®ôÄ3Üu° ÁÎZd®{ÁžIǦ×ÜõÃ#Ê´OZ±q°³?ÃnýM;íS3®óR¾ŒmŠ/©˜æÒK -"—ÔšŒ;™80†Pï±a纞$â¡Ø_våâ œûçýÉÙZ/,Â.–ãåøS=ù,´{Ýø6IÅÚG3Lú$¦üF˜ðˆß¨»Dðö(6ö³~ª·Ô§‹tÿÆeü¦j/Úï«‹KJùÒ\Ü  íb„€!TÃ(Ò†÷lŒÓzb³¤¹ç 7çÛ{——Õd8TÝsÌÑìÎÝ.`€u»`8®{…žËÁ†×ìåD½w'ÚÔ ¦1> ƒ/“éõE5<« i½ÚÆÝKg«üê É-¾z€!võ@ñ0b2q`ä Þcg‹9M4kïàÜkz[®¾„šJûj6ªÚÛk¿ÍÓÙ×õ{ncó{püñF;ݬiÊž -1Y¥(@C…51rq (àÞCaVÅ] 7EäM5©f¡_E>©>·-uܨq4ù¼Ú1¼š"Óîy­9Å܃ 10 6®{é?ê=ÕÉ”í˜{Í ~]#Ž>\éö¢ÃS³Y~ñº=ÿŸÿÉêE{ó²ë7汘`ˆQuÂ(ÉÄQ‚zåCS"´ -ˆ¦|¼}ºMÏfýË󯉋ØF|\žUõÃØCYéýÈ®AFpþLŠGÈ\1ÀÃ*ƒa‘‰ÃõžŠ‡ô#{ÛÞk¹×<Ë©.'ÕoK/}#¼o:ÂVˆqÛY ¬œ¼ÞŸ7@XÁŸG3¦¬`ˆ%Á€ÈÄzO@M| Þ¶&õþ®IâÌúŸk œã/ÃŒA´°&eõ®Ì´v»Ð0ÇÌÍóת1ڽ̒ ƒuŸ á’0ÖÞG¹×<ꥆ<…á`:X‚Ú±÷)Îñ6#ÅžzùR…\£ 1 ( -™@06Üçæ{eDiÓÌY¾ª[±ý®?‰»ìŸå¦}BìÁú¶iŸ˜`›ö¹yÞ&'ÝO)çÃr±á6×粎H«ÚT¬Vᶇ£³'U6Ám\-AŽÒëØ!—#,ê;pf ‘T´˜ñ³óiÝySæ…³?³VŽRÌ’BšQäûß6BÀ¾(qŸ+¬ˆà¡’‰¶’Mæój°;œnfÇ_*?ˆöûMAß Ms):É AHÈEžF~3„ tâ—QîrG¬µ¹ÆÒÿψSͽíì»/Ó7tÖ\²]ß)&¨ó‘SÙ«¿yL4׈B6Ó®‘ÿî£A{endstream +859 0 obj << +/Length 3451 +/Filter /FlateDecode +>> +stream +xÚíKSGÇï| +ŽX8P®gWÕîa’qXH 8¼±¶£™tˆéÁóËŸ~«§»ªr˜êj½2°# †ÎÎœüÿ:ëÝ°mêþeÛF*¬ÜÖVE™ÚŽ·èö…ûÝ›-Ö]³ç/ÚƒW½:ßúöµÐÛ–Ø‚ÛçÁ½ ¡Æ°íóÑÏ;ïNÎNÎÏv=ÿ~ëè<Ü:fT4wümëç_éöÈùÿ~‹aÚ¾uÿC ³–o·¤DI!üO®¶Î¶þn~»4M}% Q†ëÄ'á|Æ91V»è”%…p¿k>JA¸sÜ|w9— FŒ¡Òùh.›Íój6¯†³½á堮˫Yg#V“%•±Í™³)Çe=ßÝãŠî¼™ÆãÁtwOr½Cv÷¥øEZ{¿+ïH¬¸!§,fqM“éÅvûÍ)TÉÛíAÃu•Öï¿TÉ®ÅáUOÅ1‚zŒHM”¢<0Âé_ÁÈaù ¥¼®æÕ¤n2¨Gí7?Î¥Å> ½,øle³ 1VÔ@XHı€z,'Ya l# óéb6/G{ŸÊÏ)”!–›bC¡0’>|¡È­÷$Æç4›`ˆ5Ó´Ÿ˜D1¨÷H D˜‚Ebø%fsÙàJVJ‰âÑ”’ÿg}¹'L>ÝÙ0C &('S" &Ô{€©°ÖÐ<É/ÂÒæ"SØâëC§ŸÕ\d€B ÔL³^`A ¼ ®#.F&#-j#-Lê2M ÕVoª<Æ<å’³‰¢6ÙÙ3Œ¡(¤æý­E€„øi7ÌWÚF„Š/‚Ðæ‚£{:THk6,ÀÃʦe?0‰80dPïLI¢µûmQpbÝà@C˜â81ÿÓ°±”õ|×n?_—3—+ùÈ;,PK| +³† P" D ¨÷ˆ¢®¼á- Wƒ™CBPþ5!ñÅ9Ù„‹Oh6.Àà +¦U?.‰80\Pïg`[ÁEÜ­'ï®›¶£A‡¿”‘ ›Ï\6Àã*£‹~.q`\ Þ#ŽÍ]—p![.?׃q5ìz×#×Ùh¿?¹ª†UÓêH¥ž¬ì>1Ù²CLv˜xmúeOÄÉŽzwk„Ø.˜¹JíUw…€Ñ•Jðººj&Ï•ýê[GÝ…õ2d3 1Ơ̦ž%Æê=Ž{('ªP²¦ÿÊ8]é¶6¬M>¶_OËÙd1ÝefgXúŸ 'ËŒfw4?]–Ýg>ñCß)¾,Çn¨£Å㛤 ÉÖbzÃŒcz'âÀôF½‡¦DYJ¤EÔ{©¸Ø,­ì9ö,BÂrq€†+‚ 8¤â@pÀ½G´!’2ˆïpp€ï”¿Ïƒ«–†ò÷ë% ål&/BY8]ŽeŠ§Ú„ãÙ8C '¨(†S" 'Ô{ì·HE\úrÕ††ˆÚ+ù¶ý›2Rq jãÞ£ÚÍ+'ŒjËNí³ÉðSÙ%9þöÝ&Ñ‹¿x)ö ©íó‘­60ÄÔ†ùÆÔNÄ©zjëf²¦]·å—X +9¾vÒ~¨®ªùçVÛÛj~ÙNø»ÒÔ®“HýQêå¤Sb>R&™5XÄcëöáS– 0Ä€€’Øþ“Œ©80 Ö¼³ÄKiœðD*Ù.Ô7“GteÑO”ÃÅ4Pq0©gÕ¨œÚ£½yó·vÜ/_À`=âõû.óÕ¿7ÞËÓš×ÔTŠp× Í»³‚ËŽl3•²?–³PëùrêsÒ͹ýàÊäòwòe^%ÿ©ó Ï~ê€!öÔAA1Šq`4¡ÞMÍÉ,K=M©W[¸¡¶e’uåóàr:™ÌEVHB]?½»¬Ù ˜Î·D(-üÑr¾¨F©[×9”¦»ì™oòÿ_ˆõ¢f 1b!4¶¿L*ŒXÔ{˜òLNM@6nÝO.!)æ¸4ž¹a/¾n¬Ø<-íeGõM»x4©Û3Ì¢ϧ örå3ŸÍ0ĸ‚Êb\%âÀ¸B½G®¨C‰"påwÿ8 ›óÒ«”ºpw`¾ôÍzË%š†µó׋zØž†—ú94¶½Pù´gC 1¨ ¬T‰80¨Pï¾yuåÌUé™ògÙzO/Æî­VÅË4u˜Ó\` !ÌŠf0©8`Ö½§FA¼h´ÜT—ƒ ó]ÆØÎt²øpUÎ.]óÕ”£Þìt7¸ïP\Œt`X¶±Ü ËÄ]—É'G)Ò½„É„AÎÁd<ög2Þ·í³ËɸÄKù2¦É”Ú$g?HÁ {Œ¢€1k`à ~C3Î¥ ‚w¯F1ÝRÏrËýüoÝø¸žtS‰·“é'÷0ý£ý¿ËÉmûÍpà÷à·_šW×\´G»:=Yø;\Âmo»ãÅ?]ùfæµ±!'ÙJCLk˜sLíD˜Þ¨÷P)š®»T^pÞÕŠãzØ*ÖtàC.Ò=¸Ô+ý:¿ +XùJ'‹ñ‡fAö tÞCš²†PŒD¨÷À³„ÝûKLègýÔ ˆOíÁçú_Rø®¼ºv­”/ÍƽPòÙÎF b(A51”q`(­yOõÀ˜-HÁº#©û®’s¾³}]Ö£jXöÏ1³ûv¼ ÒóZ Çö/ÀÂÛ!9X÷šzœ˜‘DqÛå iAµvY~ª'·Wåè¢)©ÍÚ*·/®ì§'$7÷é†ÈÓ³"FL"ŒÔ{è~1͉”ÝyËý¶ûe›G¨­´¯¦UÙ¦þ®šÍ'ÓÏ«'¬CC|xrv§Ånׂ +Êž +>YÙ(C (†B" Ô{("%¢PžÞ‘7e]N}+ˆ|Z~ìZê°-ç¸þ¸Ü¾œ"+ì3YsÄ5P:æî¾`tv{Ð0ÆÝû7Ú0Ú¿öŸ +#u‹„týtÓ¦Üo§ð›"qüþ¦èžúÑÈ¿tÿŠç×£Ûwÿ¸¯¬Yµ×Ïx“·—Ñç1`ˆauB1I‚a‚ºDÄU1O‰h È«êÃU5¹˜®/?G0B+q¶¸¸(›—ïûÂ2¹Q^ËŒàü™”Ÿ¹l.€!ÆTå"Æê>–. cÝ™Éýöå]Mù8-[8í[å]ëáwCŒ»þª‡åôõÁ¬%ÂþÄ;^1Ÿ²l"€!F”%"Fê>Á¸½éHï”fWí‡ù‡ÓÁdžkùËå>Ðø¬fC 1h jŒö/µ¤Á AÝhšvFuç%÷Ûwû4Ì€×nN† P;ö?„yßv0¢Ø3)>U¹ ;„(†A" +„‚5ß©Ù­‰¤-€¯šæ@ì¼ÔáÕo׃‹Ô”Ovg»iÂÇç"^žšîY½g›‰þÃÜñ^ØŸ¹ã0ù²UEoWi^-›QawFÕÅ“ª‘_Á1½NýNܧ,š!P#k=„5ÂÂrÜã–$÷§7ÿe,<~îïFÆ¿nÙ¼¬ÆôýÁ.A­‹œ6‰Is¯æƒ*dKîò"ùû\,Œendstream endobj -850 0 obj << +858 0 obj << /Type /Page -/Contents 851 0 R -/Resources 849 0 R +/Contents 859 0 R +/Resources 857 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R ] +/Parent 711 0 R +/Annots [ 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R ] >> endobj -853 0 obj << +861 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 758.4766 539.579 767.4329] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.20) >> +/A << /S /GoTo /D (subsection.6.2.19) >> >> endobj -854 0 obj << +862 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 746.3946 539.579 755.3509] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.21) >> +/A << /S /GoTo /D (subsection.6.2.20) >> >> endobj -855 0 obj << +863 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 734.3125 539.579 743.2688] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.22) >> +/A << /S /GoTo /D (subsection.6.2.21) >> >> endobj -856 0 obj << +864 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 722.2305 539.579 731.1868] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.23) >> +/A << /S /GoTo /D (subsection.6.2.22) >> >> endobj -857 0 obj << +865 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 710.1484 539.579 719.1047] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.24) >> +/A << /S /GoTo /D (subsection.6.2.23) >> >> endobj -858 0 obj << +866 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 698.1661 539.579 707.1721] /Subtype /Link +/A << /S /GoTo /D (subsection.6.2.24) >> +>> endobj +867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 686.084 539.579 694.9406] +/Subtype /Link /A << /S /GoTo /D (subsection.6.2.25) >> >> endobj -859 0 obj << +868 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 685.9843 539.579 694.9406] +/Rect [527.6238 674.002 539.579 683.008] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.26) >> >> endobj -860 0 obj << +869 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 673.9023 539.579 682.8586] +/Rect [527.6238 661.9199 539.579 670.926] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.1) >> >> endobj -861 0 obj << +870 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 661.9199 539.579 670.926] +/Rect [527.6238 649.7382 539.579 658.6945] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.2) >> >> endobj -862 0 obj << +871 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 649.7382 539.579 658.6945] +/Rect [527.6238 637.6562 539.579 646.6124] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.3) >> >> endobj -863 0 obj << +872 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 637.7558 539.579 646.6124] +/Rect [527.6238 625.5741 539.579 634.5304] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.4) >> >> endobj -864 0 obj << +873 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 625.5741 539.579 634.5304] +/Rect [527.6238 613.4921 539.579 622.4483] /Subtype /Link /A << /S /GoTo /D (section.6.3) >> >> endobj -865 0 obj << +874 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 613.4921 539.579 622.4483] +/Rect [527.6238 601.41 539.579 610.3663] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.1) >> >> endobj -866 0 obj << +875 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 601.41 539.579 610.3663] +/Rect [527.6238 589.328 539.579 598.2842] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.1) >> >> endobj -867 0 obj << +876 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 589.328 539.579 598.2842] +/Rect [527.6238 577.2459 539.579 586.2022] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.2) >> >> endobj -868 0 obj << +877 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 577.2459 539.579 586.2022] +/Rect [527.6238 565.1639 539.579 574.1201] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.2) >> >> endobj -869 0 obj << +878 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 565.1639 539.579 574.1201] +/Rect [527.6238 553.0818 539.579 562.1876] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.3) >> >> endobj -870 0 obj << +879 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 553.0818 539.579 562.0381] +/Rect [527.6238 540.9998 539.579 550.1055] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.4) >> >> endobj -871 0 obj << +880 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 540.9998 539.579 550.1055] +/Rect [527.6238 528.9177 539.579 537.874] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.5) >> >> endobj -872 0 obj << +881 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 528.9177 539.579 538.0235] +/Rect [527.6238 516.8357 539.579 525.792] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.1) >> >> endobj -873 0 obj << +882 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 516.8357 539.579 525.9414] +/Rect [527.6238 504.7536 539.579 513.7099] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.2) >> >> endobj -874 0 obj << +883 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 504.7536 539.579 513.8594] +/Rect [527.6238 492.6716 539.579 501.6279] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.3) >> >> endobj -875 0 obj << +884 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 492.6716 539.579 501.6279] +/Rect [527.6238 480.5895 539.579 489.5458] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.6) >> >> endobj -876 0 obj << +885 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 480.5895 539.579 489.5458] +/Rect [527.6238 468.5075 539.579 477.4638] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.7) >> >> endobj -877 0 obj << +886 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 468.5075 539.579 477.4638] +/Rect [527.6238 456.4254 539.579 465.3817] /Subtype /Link /A << /S /GoTo /D (section.6.4) >> >> endobj -878 0 obj << +887 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 456.4254 539.579 465.3817] +/Rect [527.6238 444.3434 539.579 453.2997] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.0.1) >> >> endobj -879 0 obj << +888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 444.3434 539.579 453.2997] +/Rect [527.6238 432.2613 539.579 441.2176] /Subtype /Link /A << /S /GoTo /D (subsection.6.4.1) >> >> endobj -880 0 obj << +889 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 432.2613 539.579 441.2176] +/Rect [527.6238 420.1793 539.579 429.1356] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.1) >> >> endobj -881 0 obj << +890 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 420.1793 539.579 429.1356] +/Rect [527.6238 408.0972 539.579 417.0535] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.2) >> >> endobj -882 0 obj << +891 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 408.0972 539.579 417.0535] +/Rect [527.6238 396.0152 539.579 404.9715] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.3) >> >> endobj -886 0 obj << +892 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 396.0152 539.579 404.9715] +/Rect [527.6238 383.9331 539.579 392.8894] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.4) >> >> endobj -887 0 obj << +896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 371.8511 539.579 380.9568] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.4.1.5) >> +>> endobj +897 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 373.4431 539.579 382.2997] +/Rect [527.6238 349.279 539.579 358.0111] /Subtype /Link /A << /S /GoTo /D (chapter.7) >> >> endobj -888 0 obj << +898 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 361.3809 539.579 370.4867] +/Rect [527.6238 337.2168 539.579 346.1731] /Subtype /Link /A << /S /GoTo /D (section.7.1) >> >> endobj -889 0 obj << +899 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 349.2989 539.579 358.2551] +/Rect [527.6238 325.1348 539.579 334.2405] /Subtype /Link /A << /S /GoTo /D (section.7.2) >> >> endobj -890 0 obj << +900 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 337.2168 539.579 346.1731] +/Rect [527.6238 313.0527 539.579 322.1585] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.1) >> >> endobj -891 0 obj << +901 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 325.1348 539.579 334.091] +/Rect [527.6238 300.9707 539.579 310.0764] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.2) >> >> endobj -892 0 obj << +902 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 313.0527 539.579 322.009] +/Rect [527.6238 288.8886 539.579 297.9944] /Subtype /Link /A << /S /GoTo /D (section.7.3) >> >> endobj -893 0 obj << +903 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 290.4806 539.579 299.2128] +/Rect [527.6238 266.3165 539.579 275.0487] /Subtype /Link /A << /S /GoTo /D (chapter.8) >> >> endobj -894 0 obj << +904 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 278.4184 539.579 287.3747] +/Rect [527.6238 254.2544 539.579 263.2106] /Subtype /Link /A << /S /GoTo /D (section.8.1) >> >> endobj -895 0 obj << +905 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 266.3364 539.579 275.2927] +/Rect [527.6238 242.1723 539.579 251.1286] /Subtype /Link /A << /S /GoTo /D (subsection.8.1.1) >> >> endobj -896 0 obj << +906 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 254.2544 539.579 263.2106] +/Rect [527.6238 230.0903 539.579 239.0465] /Subtype /Link /A << /S /GoTo /D (section.8.2) >> >> endobj -897 0 obj << +907 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 242.1723 539.579 251.1286] +/Rect [527.6238 218.0082 539.579 226.9645] /Subtype /Link /A << /S /GoTo /D (section.8.3) >> >> endobj -898 0 obj << +908 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 219.6002 539.579 228.3323] +/Rect [527.6238 195.4361 539.579 204.1683] /Subtype /Link /A << /S /GoTo /D (appendix.A) >> >> endobj -899 0 obj << +909 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 207.538 539.579 216.4943] +/Rect [527.6238 183.3739 539.579 192.3302] /Subtype /Link /A << /S /GoTo /D (section.A.1) >> >> endobj -900 0 obj << +910 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 195.456 539.579 204.4123] +/Rect [527.6238 171.2919 539.579 180.2482] /Subtype /Link /A << /S /GoTo /D (subsection.A.1.1) >> >> endobj -901 0 obj << +911 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 183.3739 539.579 192.3302] +/Rect [522.6425 159.2098 539.579 168.3156] /Subtype /Link /A << /S /GoTo /D (section.A.2) >> >> endobj -902 0 obj << +912 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 171.2919 539.579 180.2482] +/Rect [522.6425 147.1278 539.579 156.2335] /Subtype /Link /A << /S /GoTo /D (subsection.A.2.1) >> >> endobj -903 0 obj << +913 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 159.2098 539.579 168.1661] +/Rect [522.6425 135.0457 539.579 144.1515] /Subtype /Link /A << /S /GoTo /D (section.A.3) >> >> endobj -904 0 obj << +914 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 147.1278 539.579 156.0841] +/Rect [522.6425 122.9637 539.579 132.0694] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.1) >> >> endobj -905 0 obj << +915 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 135.0457 539.579 144.1515] +/Rect [522.6425 110.8816 539.579 119.9874] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.2) >> >> endobj -906 0 obj << +916 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 122.9637 539.579 132.0694] +/Rect [522.6425 98.7996 539.579 107.9053] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.3) >> >> endobj -907 0 obj << +917 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 100.3916 539.579 109.2482] +/Rect [522.6425 76.2275 539.579 85.0841] /Subtype /Link /A << /S /GoTo /D (appendix.B) >> >> endobj -908 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 88.3294 539.579 97.4352] -/Subtype /Link -/A << /S /GoTo /D (section.B.1) >> ->> endobj -909 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 76.2474 539.579 85.3531] -/Subtype /Link -/A << /S /GoTo /D (section.B.2) >> ->> endobj -910 0 obj << +918 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 64.1653 539.579 73.2711] /Subtype /Link -/A << /S /GoTo /D (section.B.3) >> +/A << /S /GoTo /D (section.B.1) >> >> endobj -852 0 obj << -/D [850 0 R /XYZ 85.0394 794.5015 null] +860 0 obj << +/D [858 0 R /XYZ 85.0394 794.5015 null] >> endobj -849 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R >> +857 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -913 0 obj << -/Length 762 +921 0 obj << +/Length 844 /Filter /FlateDecode >> stream -xÚíÙKOÜ0à{~…»‡L=~Ï• -*q jÉ q »a[Á†–mUµ¿¾NˆƒaWá!$X¡aã±ÇžO–qÿƒL0$ˆYR 9j¶Xœ­ü½ömÊШŒ[íUÅ»iaXuÎ”Ö t×™î²jy2{ÿñ¨Ú?ªŽç§Õa±_ ½Æ##—m—?Š“SΖ>ƒ$§Ùoÿ$l](-A+)Ã7—Åqñiè0ºÛ…&g‚„4"1!£©X#ON“¿ð·Ú™ìš—$i¶l6›zQ^ÔίçèfWë˳/õå¼tœf0/5ç¯å—¢'˜Ñ½Ê+òNÈ/ê°º[¥º^±›‹ÏQñ†¸2Ü.Þvÿmõq‹`ÐJ$g';ü`GY0ÖboGß·³ª¿¾J¿21/§)¬÷dMQ`NS\OD9®)‘HNSvøA“Ô`R¯ÉÜÑ´ù¶jþ^5uëIî =RXêÉ¢À¤¸”ˆzR"‘¤ìð$!ÁãzHöRs¶®—åâk½¸X\5çóÒh±ô`Aa' Šs‚â"ºqA‰Dr‚²Ã‚Á!š^ÛÔoEz·=\PXãÉ‚¢Àœ ¸†ˆ4.(‘HNPvø ÈÓFõ‚(äÑô–ŽDÏGë?†Lf„Ý©1 -1*,•HFX~øA˜³@Ãr¿¨-±Í¯ï˳Ÿ~wÒVíx='¯P€É¼¢À¯¸À(Ô8¯D"9^Ùá^V)žíü£eÇëºY.üº·¾½€·P‘ÉÞ¢Àœ·¸â(Æ\©DrÞ²ÃÞŒ"žþ°ÛMß(ŒÚ -„ª¢mÔR„î(ßµ¼Ó«Áö”gû–;£Oê0Tj²Ã(0ç0–€büà–J$ç0;üàP àR‡‡G”·û^ÙbëÞiI”»=îiQ…eŸŒ* -Ì¡ŠËŠrüEi*‘-TËøÒ Ã…M½‹÷ÒÿæÿöÊ‚tN¤§+²’˜ÔÐöÕNÖŒNµoeþwã¹endstream +xÚíÙOOÛ0ð{>EŽí!žŸÿûÊ“80mô†8°&” Ún”iÚ>ýœ66¯ÔyR ì!”@ýìg¿ŸÒ8’‡(µaÆ _Z¯˜æ Ëù²àå"|ö©€®MU¸Õɬøp&mé™7”³ÛRiÍ„ÞvæwÊY}5ùøùbvz1»œ^Ï΋ÓYê \¶]þ,®®yY‡ΠΤwºüþà ¼å²PZ2­¤Œÿy(.‹/©Côé64;àLH#2SMÅ3Ò„ä´'á£v&'LL+/ýän½yšVÚŠ ÎÇÃö ¼?Zg/°(hùP‡Tƒê>.ÊÝÉWTïWáÀÃzö߀¨€r‰PÜÈá7e™±:nrÇ­^m6ͼª7·Sp“õò¾ù3­¤s£¦W3Š =˜ +¤áBˆ~F™D(Fäð‰‘ÔÌ +ð#µÇ(à‰Žn¾5ÓÊq?Ú`'®î`;(²ƒ« ûíd¡ìÃ';B2kŒëìè—vÍ*¬¯Òã÷Ú‘4Åõ¬ Ršp=t¿¦L"”&rø¤ €9Ói2{š6ß«¿ëUÓz’#¤·BŠK= +¤ áRØ~H™D(Häð’ñž9mTÉî ­n–M]Íïšùý|½ºVF‹QÐk¥5*‚öjzå!ÑÃ'AÎ2Ï!nåÜ îR¤ÇkÐëÅ5,R‚p AôßVç¡‘Ã'AV3¯LÜy$(ÜD{=îÿßÿŸj0X +¤„áƒPýÂ2‰PÂÈá“0#™÷ySœqÇãîo÷ìÙÔVæAµC´ZŠl{+¿m¹×«vÃi»–£Ñ£:Œ•ìR±Ä[&Ê!9|r(\À§ãæäóu¯j±mŸiIã5â²F…)T¸¬ ‰{µL"¨ÒëÃJ{ѾšT¹7ˆá˜×Z¼ý}åókUe™tNä§+gÞJ_JÍÚ¾ÚÉšÞ©vPæÿ¾ªË“endstream endobj -912 0 obj << +920 0 obj << /Type /Page -/Contents 913 0 R -/Resources 911 0 R +/Contents 921 0 R +/Resources 919 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 926 0 R 927 0 R ] +/Parent 711 0 R +/Annots [ 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 936 0 R 937 0 R ] >> endobj -915 0 obj << +923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 758.4766 511.2325 767.5824] +/Subtype /Link +/A << /S /GoTo /D (section.B.2) >> +>> endobj +924 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 758.5763 511.2325 767.5824] +/Rect [494.296 746.6211 511.2325 755.6272] +/Subtype /Link +/A << /S /GoTo /D (section.B.3) >> +>> endobj +925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 734.5663 511.2325 743.672] /Subtype /Link /A << /S /GoTo /D (section.B.4) >> >> endobj -916 0 obj << +926 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 746.5215 511.2325 755.6272] +/Rect [494.296 722.6111 511.2325 731.7169] /Subtype /Link /A << /S /GoTo /D (section.B.5) >> >> endobj -917 0 obj << +927 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 734.5663 511.2325 743.672] +/Rect [494.296 710.7556 511.2325 719.7617] /Subtype /Link /A << /S /GoTo /D (section.B.6) >> >> endobj -918 0 obj << +928 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 722.6111 511.2325 731.7169] +/Rect [494.296 698.8005 511.2325 707.8065] /Subtype /Link /A << /S /GoTo /D (section.B.7) >> >> endobj -919 0 obj << +929 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 710.656 511.2325 719.7617] +/Rect [494.296 686.8453 511.2325 695.8514] /Subtype /Link /A << /S /GoTo /D (section.B.8) >> >> endobj -920 0 obj << +930 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 698.8005 511.2325 707.8065] +/Rect [494.296 674.8901 511.2325 683.8962] /Subtype /Link /A << /S /GoTo /D (section.B.9) >> >> endobj -921 0 obj << +931 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 686.8453 511.2325 695.8514] +/Rect [494.296 662.935 511.2325 671.941] /Subtype /Link /A << /S /GoTo /D (section.B.10) >> >> endobj -922 0 obj << +932 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 674.7905 511.2325 683.8962] +/Rect [494.296 650.8801 511.2325 659.9859] /Subtype /Link /A << /S /GoTo /D (section.B.11) >> >> endobj -926 0 obj << +936 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 662.8353 511.2325 671.941] +/Rect [494.296 638.925 511.2325 648.0307] /Subtype /Link /A << /S /GoTo /D (section.B.12) >> >> endobj -927 0 obj << +937 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 650.8801 511.2325 659.9859] +/Rect [494.296 626.9698 511.2325 636.0755] /Subtype /Link /A << /S /GoTo /D (section.B.13) >> >> endobj -914 0 obj << -/D [912 0 R /XYZ 56.6929 794.5015 null] +922 0 obj << +/D [920 0 R /XYZ 56.6929 794.5015 null] >> endobj -911 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R >> +919 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -930 0 obj << -/Length 2197 +940 0 obj << +/Length 2175 /Filter /FlateDecode >> stream -xÚÝYÝã¶÷_áG-pfù)‘y¼»¦¸ ¸¢Ý òæA+qmádÉÑÇnœ¿¾C)˶|wé-РX`M†äpæ7¿ÚlMá­µ"T¹ÎŒ$Š2µ.ö+ºÞ»¿­XБJ%…€‡…·%4QšgëÍ|‘·«¿|ÏÙšS’¦\­ž¦½ÒL#¤Y?”?'ïvùa°Ý݆+š°»_~Ài’d:cn…-É Õ~‡fèÚr,†ªm‚ºXbRžFí 悹Nûagaiºi¶kì€OïÛ}^58þ˜ïƒÎý±ìÇÿ¦Š¾ÿxÌ ²¤h›¾ê‡_·Oø9Äõûc3ä¿ad[TOÇ Íö»XÅ6C5T(Í’êŽ% Ý$8£;cÄ(Å£Âa§‰;ˆà,ÉñqWÙ.ïî˜NŠ]Uä5J÷yÓ€›3™¼Ðh{ÓÝéd¬Ýæn‘±·%ÊŸÚ¥­í6ªfö‡]ÛU˜yDIûlƒ®?\Ø!oÂJa+Nò>;ó'ªö‡ÚîÁ¹ë†ƒ¡Ã.wáÊT’Ø×õåûüÐã(ºT¼ÏA4‹³›X–Þ¶ïmOÀ-ˆ*ª–ù£ZÕÇ•+° jœ ܳ‡ˆ[·~­v< ¢·›@ÒUãàQKñpR·ùcî­Š˜g’™ò€bI Obž!£”&÷E{°¸‚|¾o‹Ñyn9¸&ifÎ’&om÷ ‚êýiÎRƒÆtù)I¨O‡·>¾ùo§ˆõ¨‘ãG'J2‹&½í /£OüÓãö\•6¼ÏW« ÚGØ lÇ0sÖ+õp®Õ”8(0¶^Q† ÌfNÎ]8òMa|üÒvC5îñÙyüÃý»àp8÷ã\ÙChbð£oŸ†—™)49äŧ|ÐéN/rŒór_5®ùÐvDobô |Ž©ú…M#öÂ1=½ŒÚEÛ…¤;´M¦ûüüÌ)Húu‰ÀC"ü£ÛæMõû‘“M'“¿>3>8 -¥ŽrÜ\AÕ„ 78Y˜ÙdÍHÊ%¬áƒh±ùùla+°_¥™ê@0ˆF(ažsý®7 °t2ÏRN†, -ôœA)*ìaˆÔqf§†dJfKÖñ›Öñ  RyEÃBÛé kÑFdœ(&ø9˜Q÷×±ÂÁÄ S¬4MƒÙ Ï 0Bš1ÉsÞUíæÙæk¿d¹äÄjž°8ùÚ‚§D -}å7A,û+£c”ú…%%”Æ8yÿiU ¢¿^OI¢ LQ¦=úP -F”Qò܇‡àðYÔ

ÑÚШ€<øÈÌ; 3š0ןW±9ùºtKD8h¬o ՟⻩Üb’Âvƒ/µî¡=¸Ó/3B -½´HÙ5#¤‰ºÁFˆ%FH#U¥362(¨«ínx±î  ªˆàF.ÑDßÖÏغҥ¡5ɸm *Þ¹ À.ë2ø°¤òŠƒÝ„t)ø0dY$ƒS™Ì®“ Dyغ -+úF…ÓŸ°3±|;•>cÊCºÍ–âùÚfÛbJù©Pì&ÀD1"”¿³Œir܈rLLÊÂZô2﮽d2¢…WN‚©Ù’“àǦ 9kÃ~¶¡ï?¢þBTBoë‘ç -hÇqÕR®°„ë%KôMK¢á³´ýP>ÇG¸²ìÚÖçâMÎiªÏñ¶³õÁqØÚ_‘ĶV&myœ³žŒ|ÖB‚¸ -ä8'&éˆÉK{ h ,$_ÆœQ“SÛ”•«ü ‰—¦áöŒª/»ÀKÒ;2b²îhOcãJx=Ã%úú8­3sîY»ûƹE%ýèöqï?‹Ÿ"\Lèx¬ëªÝvùaw\ª~‚}‚’oa`a讀ì|‹ã ̬;ºlô]:‰©âˆX ý+OD0ˆ·7öw—L†p.õy2aÃýu¦&ôåÏŽvÛ&t•?öñfW5ßÖqbçž:Nÿø:köE¯ w šlmãÁ‡JÇF¯7®ŸÌÿÎYµúëÃôÕI¡UÔॠM¡¡+ö«_W?ÿB×劮XQ"ŒVëx „Ã×û•0¤JGI½º_ýó¿œí˜5 7-ÀyÖ -Ãêó¥6ñLæÒ‰j6}ugA˜°Œ„«‡‘á¶ã[§pS‰•ïÊm‚+zz=ßâÛ¬ž–ü‚ÙÚFérúÌìŸî8MnÂ¥Žõõ!”ëS¥^ñ’ÃÕƒBÖoÂÜÿœ8ð„øœ)θ 'DnŒ8}·)áäÚL‰l“»VXÂ=|عoBÝJ÷zÊk; xòã¿þþ5wm?Ì4×êXÝ.¾9¨H1ºAß_€Ã¿±/¶ÛŸ¿ -}ëmDÏNùmŽ›!úÒsàž%DÏ<÷}õ›ãØè÷¥*‡Ým𾚽"ðÆ@¿"RC¤Té—ÀË¡‚Gˆ §²¬ÒÅšw?ƒŸÙF¯Æˆ—ÆCU_ÂÏÜø€~òò÷m]Þ†Ò«™þ %¸SPÃÌ—D)´:°Åé[ ×–D6‡Ïh¶ÅkaèÒê4·ú -B·€ójæþYpÃÝ]KÝ‚ˆŒËùÏ~W?ÿqOÁ@¨0_k½øaüéo#q¿$.¢G@ -Nå:(¹(dWn¿6žVŠ»ýñG¬endstream +xÚÝYÝoã6÷_áGXëø%‘ìãî¶ÅÅî’¢½>(c kK®>’ºý 9C[ŠåÍö6ÀE€ˆ¤†äpæ7¿Ê|Éà/M–2iÕR[•fŒgËõ~Á–x÷ý‚“ŒÊdš))¡3óv•I“fFèåj¼ÈÛ»Å?¾|)Xšç"[Þ=œöʵI­TvyWþ’¼Û‡Þµ7+‘±„ßüz÷NS©6šûi ¶ÈRm™ >Ô}۔ú¯ššÄåÒ¦6y”Ö0ÔõÒw[K›ÜOsmízì½oöEUcûc±'™Ûc×»=¶ÿÃ2öþã-<¸Ðɺ©»ªë;|Ý<à³ëwǺ/~§Á†Æn]=ŸIÖ°ß³U\ÝW}…£:©nxRcÓO‚3úSqžÚ,Ñt)Xâ"O +ìn+×í 7Éz[­‹Žî‹º3k•¼iPÿ¦½1É°ó›ûE†Î•8þдØ(ÝÎmŠ¾ª7´ÏÐo›¶êAÍ#Ž4ŽdÃáh‡¢¦•h+F +žœˆ‡UûÃÎíÁEðëJ€¢ý¶ðîÒYR¬û¡ØíŽ8¾/¶¢)A$؆F~öË2XÂuëRPÂȼŠ¢eÑ(Vuqå +4¨joßñË`wÖj†Ž‚÷f|SHÚê~èÃ"Ùœ?ü¨ßü¾ZEÌs•J• B±b©È%bž§BÎKn×ÍÁá +<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||OñoOëP¢ÀG'HM‘Œε"~4à*ÎðRÃþÞÑ<.Xl5ga‚¢È$*x–[8_p$Œ—Ñ&¡w@¿=V¥£÷`ùjͪ…öv0PÜ7MĘ B]KÕ%6ÖèÛ ¨È)£™'ãÎù¦C7¾~iÚ¾öØ÷ÿpûŽ ÞüØSv¤K,>ºæ¡©Â’C±þTl¨ƒF÷r‘ã ]”ûªöp-ú¦E 5Ð3ð9B¦êf6Ø£cz"´×MKAwhê’¦‡øüÌ)ÒüËAP ü³ÝuõÇÉ#gÎ*yd|8QNE|ô'K;šl §e<‡E¦ à3{)éÓ +†A8Bs]ÜÖá®—0F4•Ò`„LC‹ÖîÐGî˜('˜NY.ÔœvâEí BÖÀ^Q1òc3 a2ZI-RÃa‹ šQö·¡ÂF¤- |Щ¦®1|¡O$ˆieòX´U3ÐkòiLaÕýeÕ¦¤jŠóGϾMM¥åO]¼ÞUõW–¡ŒŽsÏegè>Q¬ƒ¿Ÿ܈Aâ–l\À‡BÇzï8;Qýo¼V‹oïNßolu …gêF)üǛ߿üÊ–å‚-X°TZ“-Ÿ ÃÀšP)îJB“e&Žì·‹ý³¢£Báª8ÁZÔŒèž.µŠgZqNÌðÓ©)šàC*XFAŽ¶Š®<¡|¢ëJÌ~f“‡s³oñuZŸ–|Am ¥£‚ÊgªöÏ7‚%WáÒõÇÝå!2‘§*ϲW<„Pf1ŸôiîÿNB¦\ü'Îg\…“€¢ÝZyþÀ)gá$5P +²MáÓŽ‚Ëx¿õŸC ®•’p¹gbçN"ùéß?¾AÉmÓõ#IàµPÏ|>Ø‘¢wI>Ü‚éž_»'‚€k÷ÓWT¾^Gôè”_g¸¢Ÿ[Ì3‡è‘徫~÷›ý>Ue¿½ÞWÓ÷/ÞèèWäB¡Êò—ÀËeʤˆëÏiX¥9ï0|?£^Ÿ+¯Ì,~ÆÊôsPh¾mvåu(½šêk(Y2ËíKHbpMÓ°Åùˆ/K" ýç@4Úâµ0ô\ë+4ÖúB×€ójêþUp#àŽÍ4‡Ú #µPãßþ.~‚ýíÔ7ÆÌþPÿƒÛZêNœE„”‚©% y/è ³ÇŸÏ+ÅÝþ üLtendstream endobj -929 0 obj << +939 0 obj << /Type /Page -/Contents 930 0 R -/Resources 928 0 R +/Contents 940 0 R +/Resources 938 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R +/Parent 951 0 R >> endobj -931 0 obj << -/D [929 0 R /XYZ 85.0394 794.5015 null] +941 0 obj << +/D [939 0 R /XYZ 85.0394 794.5015 null] >> endobj 6 0 obj << -/D [929 0 R /XYZ 85.0394 769.5949 null] +/D [939 0 R /XYZ 85.0394 769.5949 null] >> endobj -932 0 obj << -/D [929 0 R /XYZ 85.0394 582.8476 null] +942 0 obj << +/D [939 0 R /XYZ 85.0394 582.8476 null] >> endobj 10 0 obj << -/D [929 0 R /XYZ 85.0394 512.9824 null] +/D [939 0 R /XYZ 85.0394 512.9824 null] >> endobj -933 0 obj << -/D [929 0 R /XYZ 85.0394 474.7837 null] +943 0 obj << +/D [939 0 R /XYZ 85.0394 474.7837 null] >> endobj 14 0 obj << -/D [929 0 R /XYZ 85.0394 399.5462 null] +/D [939 0 R /XYZ 85.0394 399.5462 null] >> endobj -934 0 obj << -/D [929 0 R /XYZ 85.0394 363.8828 null] +944 0 obj << +/D [939 0 R /XYZ 85.0394 363.8828 null] >> endobj 18 0 obj << -/D [929 0 R /XYZ 85.0394 223.0066 null] +/D [939 0 R /XYZ 85.0394 223.0066 null] >> endobj -935 0 obj << -/D [929 0 R /XYZ 85.0394 190.9009 null] +945 0 obj << +/D [939 0 R /XYZ 85.0394 190.9009 null] >> endobj -936 0 obj << -/D [929 0 R /XYZ 85.0394 170.4169 null] +946 0 obj << +/D [939 0 R /XYZ 85.0394 170.4169 null] >> endobj -937 0 obj << -/D [929 0 R /XYZ 85.0394 158.4617 null] +947 0 obj << +/D [939 0 R /XYZ 85.0394 158.4617 null] >> endobj -928 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F48 940 0 R >> +938 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -944 0 obj << +954 0 obj << /Length 3187 /Filter /FlateDecode >> @@ -2690,66 +2703,66 @@ W ½þ`J9ÿdÑÆÇVþ¢Ì!ûȨÀÌBÖ?e‘úñcΗ`ùX¹žŸš¦-zXæç-@fØ:\a½ã¶Gî7žÛù¨ß•=Éȧv)½»@2wl(kz+0h´zx6éqŸSS> u»žQ¶àðI¼þ˜CÍ-í‚f¡œoMoqÓâ›äÚµ|Éï…2VDÓWÜãÒ|ññþkÿ=êø_bP*˜4Õ/øÃ[Df@ ž!þêóy©òendstream endobj -943 0 obj << +953 0 obj << /Type /Page -/Contents 944 0 R -/Resources 942 0 R +/Contents 954 0 R +/Resources 952 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R -/Annots [ 951 0 R 952 0 R ] +/Parent 951 0 R +/Annots [ 961 0 R 962 0 R ] >> endobj -951 0 obj << +961 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.8897 207.1951 329.1084 219.2548] /Subtype /Link /A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >> >> endobj -952 0 obj << +962 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [190.6691 179.6723 249.6573 189.0819] /Subtype /Link /A << /S /GoTo /D (rfcs) >> >> endobj -945 0 obj << -/D [943 0 R /XYZ 56.6929 794.5015 null] +955 0 obj << +/D [953 0 R /XYZ 56.6929 794.5015 null] >> endobj -946 0 obj << -/D [943 0 R /XYZ 56.6929 756.8229 null] +956 0 obj << +/D [953 0 R /XYZ 56.6929 756.8229 null] >> endobj -947 0 obj << -/D [943 0 R /XYZ 56.6929 744.8677 null] +957 0 obj << +/D [953 0 R /XYZ 56.6929 744.8677 null] >> endobj 22 0 obj << -/D [943 0 R /XYZ 56.6929 651.295 null] +/D [953 0 R /XYZ 56.6929 651.295 null] >> endobj -948 0 obj << -/D [943 0 R /XYZ 56.6929 612.4036 null] +958 0 obj << +/D [953 0 R /XYZ 56.6929 612.4036 null] >> endobj 26 0 obj << -/D [943 0 R /XYZ 56.6929 555.4285 null] +/D [953 0 R /XYZ 56.6929 555.4285 null] >> endobj -949 0 obj << -/D [943 0 R /XYZ 56.6929 530.6703 null] +959 0 obj << +/D [953 0 R /XYZ 56.6929 530.6703 null] >> endobj 30 0 obj << -/D [943 0 R /XYZ 56.6929 416.0112 null] +/D [953 0 R /XYZ 56.6929 416.0112 null] >> endobj -950 0 obj << -/D [943 0 R /XYZ 56.6929 391.253 null] +960 0 obj << +/D [953 0 R /XYZ 56.6929 391.253 null] >> endobj 34 0 obj << -/D [943 0 R /XYZ 56.6929 164.815 null] +/D [953 0 R /XYZ 56.6929 164.815 null] >> endobj -953 0 obj << -/D [943 0 R /XYZ 56.6929 137.4068 null] +963 0 obj << +/D [953 0 R /XYZ 56.6929 137.4068 null] >> endobj -942 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F21 702 0 R >> +952 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -958 0 obj << +968 0 obj << /Length 3415 /Filter /FlateDecode >> @@ -2768,60 +2781,60 @@ J$ ?6`³> endobj -961 0 obj << +971 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 463.1122 539.579 475.1718] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj -962 0 obj << +972 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 451.8246 133.308 463.2167] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj -959 0 obj << -/D [957 0 R /XYZ 85.0394 794.5015 null] +969 0 obj << +/D [967 0 R /XYZ 85.0394 794.5015 null] >> endobj 38 0 obj << -/D [957 0 R /XYZ 85.0394 570.5252 null] +/D [967 0 R /XYZ 85.0394 570.5252 null] >> endobj -960 0 obj << -/D [957 0 R /XYZ 85.0394 541.3751 null] +970 0 obj << +/D [967 0 R /XYZ 85.0394 541.3751 null] >> endobj 42 0 obj << -/D [957 0 R /XYZ 85.0394 434.1868 null] +/D [967 0 R /XYZ 85.0394 434.1868 null] >> endobj -963 0 obj << -/D [957 0 R /XYZ 85.0394 406.5769 null] +973 0 obj << +/D [967 0 R /XYZ 85.0394 406.5769 null] >> endobj 46 0 obj << -/D [957 0 R /XYZ 85.0394 301.1559 null] +/D [967 0 R /XYZ 85.0394 301.1559 null] >> endobj -964 0 obj << -/D [957 0 R /XYZ 85.0394 276.6843 null] +974 0 obj << +/D [967 0 R /XYZ 85.0394 276.6843 null] >> endobj 50 0 obj << -/D [957 0 R /XYZ 85.0394 200.1512 null] +/D [967 0 R /XYZ 85.0394 200.1512 null] >> endobj -965 0 obj << -/D [957 0 R /XYZ 85.0394 175.6796 null] +975 0 obj << +/D [967 0 R /XYZ 85.0394 175.6796 null] >> endobj -956 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F21 702 0 R >> +966 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -969 0 obj << +979 0 obj << /Length 2458 /Filter /FlateDecode >> @@ -2834,39 +2847,39 @@ Y K³ËZ! U¢|õ },ä-T\Èiù)¶†—™M¬)¢Ût‡KBaŒÂ´˜ŸS7`\&Ö^±¡‰&&Ú¡Ù’å^_ˆ¼=¢ µŽ¸Š©/@ð$.˜Á²n 0ãf—«{/Qc‡çöùŽ±Éñ¡ÚÖ=¯tñÍX>Ëî)z /{0„öG1Y C*5÷Hò|ÅjAÀùеa0ÂXë–KƯ,†•p=†”Fä9‰ñléÜî|uÚ$1Sû52Ñ”*?õVù8ijÞC@üû 3ß‚ü¹=á¬zÛ”SsÀÖ'¨‹«ƒNøÒÕæOwíi¸þáñé=|ë5ë~ÒÅÀªƒtk¨€ƒ6¼Ý ]´Né!)½=Á˜*5$ÐyúÿPŠrla±Ö¯æj§›íb5% îÖfÏX.]äü©pšwzc 4vÖ׳Ü]Õ°»“™2_$¡OæÖ#ç’_åpÚÐØ°ö4uîëÜzû.—H38Bn«‚'äô°…ïúýuoõÖV1J¹–cݽŒñ=Ãm}„R/"$•§Ž4÷•>‚tùª[«_Ð@âIŠý[†a{ÓШk/O \¯\iܽŒ‹µyîbm^`8O_Š­j˜=:9M®<uH&)!Íf¹² E ¤òïFÜÙ Ív¤Yžú*Ï]‚ÍŽb7KFY!ëö4¹é>a±¬z Ù\˜"T‘2»Œ·SCNE˜"¿ÄTz[Õ•=L A05h1„u”»œdkM9C€/¥x$ue¿r~EÇðyΟ¯Ž&áèBg Ú½.ßóh¦·\Q&ɧw%±»Üéu©®Œ¡™ÐÙ^ôÃo)Ó$TK …3¸U£©UPk\‘;cpËÜÓ…à8~*”©DGÊR³)=„ò6MÄU$ä¨U“—¿pf¥ÉÖ\:âç¥Z¾þ®Úé=YO½å¼zxã¿H_ø‡ÈÂ?!á˜èþïÿ]¦¿Ÿ¢4PY&—ÿRÁá("Ì”K©á çþš[Öÿ xK:óendstream endobj -968 0 obj << +978 0 obj << /Type /Page -/Contents 969 0 R -/Resources 967 0 R +/Contents 979 0 R +/Resources 977 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R +/Parent 951 0 R >> endobj -970 0 obj << -/D [968 0 R /XYZ 56.6929 794.5015 null] +980 0 obj << +/D [978 0 R /XYZ 56.6929 794.5015 null] >> endobj 54 0 obj << -/D [968 0 R /XYZ 56.6929 717.7272 null] +/D [978 0 R /XYZ 56.6929 717.7272 null] >> endobj -971 0 obj << -/D [968 0 R /XYZ 56.6929 690.4227 null] +981 0 obj << +/D [978 0 R /XYZ 56.6929 690.4227 null] >> endobj 58 0 obj << -/D [968 0 R /XYZ 56.6929 550.0786 null] +/D [978 0 R /XYZ 56.6929 550.0786 null] >> endobj -972 0 obj << -/D [968 0 R /XYZ 56.6929 525.2967 null] +982 0 obj << +/D [978 0 R /XYZ 56.6929 525.2967 null] >> endobj 62 0 obj << -/D [968 0 R /XYZ 56.6929 393.0502 null] +/D [978 0 R /XYZ 56.6929 393.0502 null] >> endobj -973 0 obj << -/D [968 0 R /XYZ 56.6929 363.1913 null] +983 0 obj << +/D [978 0 R /XYZ 56.6929 363.1913 null] >> endobj -967 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R >> +977 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -976 0 obj << +986 0 obj << /Length 2095 /Filter /FlateDecode >> @@ -2884,66 +2897,66 @@ D Õmíš™Q‘‚z â~ó ¯ fÙ"‡èâ9Lt¨ž¹£j¡ mK(ÈÏbµÌ¥X2¼É6õpT!h_¥^ÁO8,uU•a¸‡àk"¿°•6ª ÇsÓ÷Oã_IZ:ä[²ÑiÉ*Np’êZÀu ‰¡‰ñìK—!Gµ&¯!cÖ`þû$8‘ôbGÊ=6ü¡ºJ¬« z¸Äã5Âr‘> endobj -982 0 obj << +992 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 268.1131 539.579 280.1727] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj -983 0 obj << +993 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 256.1579 143.5361 268.2175] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj -977 0 obj << -/D [975 0 R /XYZ 85.0394 794.5015 null] +987 0 obj << +/D [985 0 R /XYZ 85.0394 794.5015 null] >> endobj 66 0 obj << -/D [975 0 R /XYZ 85.0394 769.5949 null] +/D [985 0 R /XYZ 85.0394 769.5949 null] >> endobj -978 0 obj << -/D [975 0 R /XYZ 85.0394 574.3444 null] +988 0 obj << +/D [985 0 R /XYZ 85.0394 574.3444 null] >> endobj 70 0 obj << -/D [975 0 R /XYZ 85.0394 574.3444 null] +/D [985 0 R /XYZ 85.0394 574.3444 null] >> endobj -979 0 obj << -/D [975 0 R /XYZ 85.0394 540.5052 null] +989 0 obj << +/D [985 0 R /XYZ 85.0394 540.5052 null] >> endobj 74 0 obj << -/D [975 0 R /XYZ 85.0394 447.7637 null] +/D [985 0 R /XYZ 85.0394 447.7637 null] >> endobj -980 0 obj << -/D [975 0 R /XYZ 85.0394 410.3389 null] +990 0 obj << +/D [985 0 R /XYZ 85.0394 410.3389 null] >> endobj 78 0 obj << -/D [975 0 R /XYZ 85.0394 348.7624 null] +/D [985 0 R /XYZ 85.0394 348.7624 null] >> endobj -981 0 obj << -/D [975 0 R /XYZ 85.0394 311.223 null] +991 0 obj << +/D [985 0 R /XYZ 85.0394 311.223 null] >> endobj 82 0 obj << -/D [975 0 R /XYZ 85.0394 189.9853 null] +/D [985 0 R /XYZ 85.0394 189.9853 null] >> endobj -984 0 obj << -/D [975 0 R /XYZ 85.0394 156.0037 null] +994 0 obj << +/D [985 0 R /XYZ 85.0394 156.0037 null] >> endobj -974 0 obj << -/Font << /F21 702 0 R /F23 726 0 R >> +984 0 obj << +/Font << /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -988 0 obj << +998 0 obj << /Length 605 /Filter /FlateDecode >> @@ -2952,77 +2965,80 @@ xÚ¥T 4‹$çÉ™‘•2' £JëØé}•ª±Ö¶Ìì¢öìJçÕ¥-ÙZ³ØÖ>ðAY³ìöwªv™÷ö»)ó?A‘ÿR¶Ph÷ÑÆÑ~»¥Ý…ÁeêsƒLÕù“éÛôÖwC’œ[yžTÝäºgGE8ìIƒ‹|7ðÒ¾omè[”—™~nlNÓímhë<ïRBHì640; ó}å*!²á ]ÖÑUA«ƒlÛ*kyÓÚ Ë54<ªàmgvd¦gíTúä,¥ì¢}Tã?9_¸ûÿcZ8^¾Klue…zR…]fù •Úµº~±®Û´î0lÒqÐÝPµS#HÓÖù]ךÃ@ÿ;ÆQ?+G†Ä¼îPÿ{$ÿ©0BLz˜¶éTÐH PGª—œÐÌÇÙýHý/š@endstream endobj -987 0 obj << +997 0 obj << /Type /Page -/Contents 988 0 R -/Resources 986 0 R +/Contents 998 0 R +/Resources 996 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R +/Parent 951 0 R >> endobj -989 0 obj << -/D [987 0 R /XYZ 56.6929 794.5015 null] +999 0 obj << +/D [997 0 R /XYZ 56.6929 794.5015 null] >> endobj 86 0 obj << -/D [987 0 R /XYZ 56.6929 769.5949 null] +/D [997 0 R /XYZ 56.6929 769.5949 null] >> endobj -990 0 obj << -/D [987 0 R /XYZ 56.6929 744.7247 null] +1000 0 obj << +/D [997 0 R /XYZ 56.6929 744.7247 null] >> endobj -986 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R >> +996 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -993 0 obj << -/Length 1222 +1003 0 obj << +/Length 1215 /Filter /FlateDecode >> stream -xÚÍWIãD¾÷¯ˆúäH¸âZ¼©OÍ°‰Hs`8TìrbSeìrBƒæ¿ójs6sàÊÁµ¼ý}ïsŒW üðªHQBK¶ÊK†Ò§«êø”¬öp÷ýö2,¥(e”Âfá6NiÒ‚ä«øÚÈ×Û§Íw¯H‚²Œ¤«m3ûÊrP  °­Þx¯Å°ŽIšDtýÛöG§ÆP^äب%à"C¸¤Vþ'~Nø1œ‚â;%?$ ÙO×­’Þ ]•¨ÌHæ­d%yά™$(i¤íhV,EeUíñY¸Ã~Xã"R§¶îbTG5Nû½µ¨ÝEuÁGJŽî‚wJî½ÕVœò~‹]+…jŒÆB­_N£€ ´ŽfÑûuI¢Æ´M’&-ŒQ™¦Ä¦e"r± >*Éw¯Ø‰w“õëFùÒUbм•n£z_XBëVîG473DYF|9FYRbë—"¼Žq’@Wø±þîº2^ …­!ŠÉ<ÀÐlêÕ[áÕ∕ìÞÜÉÛMRƒ2W—íh…V]§Î­éˆÙŽ-T¸ó·ÕŒì¡ˆyòÞ£¡Z®ƒ=ß8+àÜÄkN¤×úó˜¥s0‡¦Ëv±óòU× -©Ç¥·†EòS€Š2Of=§&ü¡W.tÀLFXôÚyÉß'1´¦÷fÓ¸<Žn§&=Z|KÁµ½áDnãÖ [;ÑiteL-dçÞ^z@3Š Ñr0¡sSùØò¶Ð°´@EžQ/ëph‘@#†I¨„ƒÜkg+¡Û“€:cŒ£¯&L0À3LDc‚o`Â=æÕÔÕn¹ó"¦iâ$ü©ÏÍZ™Z}!W‰37µu£VDS' 0|‹Cš R&®}› ô ½=+·-n;N;)LùÍæìÏíxp+íµl)Ýrn¬Ù4ƒ:¢[ظbñª»ø»xøË=pIÎ -ÄP²!ìåö0¿>üô²J×­Ù¦‘ %*Š¼¼•«ÛZ  ÿVòy#tµ1ÃQïžs*ô^ mÌ梸”Û®®³ -©Þ†/F¶œWˆåçÁ¿líÝc° £?;7ÌÁÚ¹¶Ý:øëN©~Ç«Þ@]bôÕÂê ?¼”ÙŸJz ÏVd[}ćž?±àú­Ÿ#„WÕ°˜eÓvÁK§*ÞÔ¨¤÷ü²“Tºm|¡¥úrMøžÒ`^g¾'ïý‹çuÒ5ÀÔ™Ùþ—´oÉ—–è-ËÃè>²<8Á³2pÁ¢1‚3•ƒŒ>píNƒ?Û{³p…T™ý| „-KR”x+:BØ#†Ë›‚WÀè%Á9*))¼ëÍžô\Ç=Ïuü$îþ\¨tÚÕê8ÿMøLÌ:›$4 1Ë= -q/ÇV”ðç^Ƕġà2…¿@¡žKñÿ‹ubóÆ7Ü#ar/¼o°+ߨ £ØœWÕL ìõ…Áýñqùvå»`W¾Ý@˜UxÎ$U‹†O^re˜†ÑŽJûÓÌ©¿¦L¯ -/9ƒ¶‹Ôïè˜PTâ„ý'tüôívþÊ ß.4EæKhé;(ˆÄ÷txšd¨ e ™¼0½÷6R=ºû*Š™Üendstream +xÚÍW9ã6îçWSÉ@DóЉ©&“Iˆ-²)h™¶…•EE¢ìL‚ýïyä#e{¬Ý-¶HàB<Þñ½ë“Å~lQ¤„Š2YäeBRÊÒEu| ‹=ÜýøÀ¼L’ +’&BÀfæ6NEAÒ‚ç‹øÚÈ·ë‡Õœ-8%YÆÓÅz7ùÊrP °Þþ½dgT¿ŒyJ#±ücý3ª%$/rfÕ(¸È+…“ÿE +ÿ¦úSP|Ñí{Jù~쥩uë͈EIÊŒgÞJÆÍóÄ™ù©ÅœEæPvE£jÇg…Ï®_²"Ò§z«PjÐG5Œû½ŒÚⶺEàÊF·{o²6\íG0×Ô­òB;Ý0ªöËqPd‹œGï–%.>c›†1R¦)wÑX ˜‡WÉA·rÓøDd3:_ið‹JõFÖ-ntç²æÖƒ2¦n÷™jÁ"’Œû,&Œd´dί l3J¡òØ/oS1 +!ÁÏ|€¡ÉÔ³·"«àˆuÛ¼âÉ]ég«ÌSÛ\˜—õD–BØM£Ïµ­…Ý€vÉ¢Æß¾©Ú¾°OÙù&èúZš`´m&€7rƒ×ž´¯óç[Ud VÀB‰q±ñòUS«Ö s®[hÍV6 ˜¦‘Ñö™8Ï©…ßw¡CÏd<‰ž/ùç¨úÚÖÞnvÇwz4ƒkkk)¸v7›7¸ÞØ-ŠŽ¦Ñâ€ô†Ú^j 2A Ðb°Ð¥Í|l¼Î,-H‘gÂËbºÎƒFãœð„ñ l¹çÆeÂÔ'yfŒEß`OX0ØÀS›¨¿S•ŽJÍ—/b‹¦NÊŸúØœ•±6—²í™8K›[µ"%a·}((á%Åò­VPhíõYã"”Láv7­²é·›³?<×ÃWÆk¹Târ*¬Ýìz}$·mƒÉ’Usñwñð>XÉ Ë +’ºâÉÓía~}øñi®)±Z“M+ÁKRyy+·­{(†ú;ÉÇ•2ÕÊÇvóhØáwºÿàj`7Źخúê:ªê-ôxÙ|\˯½'~—{|ôÐ,ýàÏŽÀ X7×®ZÝhÝmdõÁØn{5øl1ù…›‹ìoÝz Ndë6¶úDö|übÂÍk7!„7T?å®n‚—FW²9èÁïñiS«M½ó‰nõ—s:Ã÷ tÌëÄ÷<ð½ñ<æ {˜:;Û_IûŽ¼YéˆÞ±<Œî=˃ +ž•á@ú 9ƒÆ +NT2æ ž®öv‰¿W™ü¼ç<™!Ž„¦$çðVDBT¹#†Ë›„WÀè÷)a9)/¼ç ¯õ\'=Ï5ò¤Þü7¸Pé¸Ùêãô7á˜T–R‘ÌížÜóØŠþŠkls +.Sø«ê¹”ý¿X'¶o|uÃ=-Lî…wà våã;d̛˪š¨!=ZŸÜOŸl_¯|É•o» +ω¤¶j'ÇÆÌ9‚4ŒýàF%Œ}ÌÄgcê®)ÓëŸÂKÆ ®Ô,u°7tÌ)Mþ:~ø~=}Ü„O‘û4÷ùDâ‹ ~û\w¼ )x™C6.&Þz›¾¤îÝý ?»˜endstream endobj -992 0 obj << +1002 0 obj << /Type /Page -/Contents 993 0 R -/Resources 991 0 R +/Contents 1003 0 R +/Resources 1001 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/Parent 1009 0 R >> endobj -994 0 obj << -/D [992 0 R /XYZ 85.0394 794.5015 null] +1004 0 obj << +/D [1002 0 R /XYZ 85.0394 794.5015 null] >> endobj 90 0 obj << -/D [992 0 R /XYZ 85.0394 769.5949 null] +/D [1002 0 R /XYZ 85.0394 769.5949 null] >> endobj -995 0 obj << -/D [992 0 R /XYZ 85.0394 575.896 null] +1005 0 obj << +/D [1002 0 R /XYZ 85.0394 575.896 null] >> endobj 94 0 obj << -/D [992 0 R /XYZ 85.0394 529.2011 null] +/D [1002 0 R /XYZ 85.0394 529.2011 null] >> endobj -996 0 obj << -/D [992 0 R /XYZ 85.0394 492.9468 null] +1006 0 obj << +/D [1002 0 R /XYZ 85.0394 492.9468 null] >> endobj 98 0 obj << -/D [992 0 R /XYZ 85.0394 492.9468 null] +/D [1002 0 R /XYZ 85.0394 492.9468 null] >> endobj -997 0 obj << -/D [992 0 R /XYZ 85.0394 466.0581 null] +1007 0 obj << +/D [1002 0 R /XYZ 85.0394 466.0581 null] >> endobj 102 0 obj << -/D [992 0 R /XYZ 85.0394 237.1121 null] +/D [1002 0 R /XYZ 85.0394 237.1121 null] >> endobj -998 0 obj << -/D [992 0 R /XYZ 85.0394 206.4074 null] +1008 0 obj << +/D [1002 0 R /XYZ 85.0394 206.4074 null] >> endobj -991 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1001 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1002 0 obj << +1012 0 obj << /Length 1860 /Filter /FlateDecode >> @@ -3038,185 +3054,187 @@ g:+ n9ê®ÐB©ªWúQEBŽ| ÌNuë`:ôkn‹}8ÔXÅÇtªëmý÷­¯ý=^¤8æñ Ç̃€×á<ÊÃ>%Åê+'Йú>êçòE@Û߈¶¿4E¢þhh!V²ŠúO@º¬bºMæ1áwÿ$‰%7BܲÌê½>ìsëD7c¸¦1êÿ0§‘ÌÁ¬‡^˜yö·èl™ê.$ ˆßf’È:®Ò¹ïXÀŽ2³—à‰+YÔÑ\÷¦ =n ˆi¬¢> endobj -1007 0 obj << +1017 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 190.8043 126.3509 202.8639] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1003 0 obj << -/D [1001 0 R /XYZ 56.6929 794.5015 null] +1013 0 obj << +/D [1011 0 R /XYZ 56.6929 794.5015 null] >> endobj 106 0 obj << -/D [1001 0 R /XYZ 56.6929 480.2651 null] +/D [1011 0 R /XYZ 56.6929 480.2651 null] >> endobj -1004 0 obj << -/D [1001 0 R /XYZ 56.6929 441.7923 null] +1014 0 obj << +/D [1011 0 R /XYZ 56.6929 441.7923 null] >> endobj -1005 0 obj << -/D [1001 0 R /XYZ 56.6929 373.7178 null] +1015 0 obj << +/D [1011 0 R /XYZ 56.6929 373.7178 null] >> endobj -1006 0 obj << -/D [1001 0 R /XYZ 56.6929 361.7627 null] +1016 0 obj << +/D [1011 0 R /XYZ 56.6929 361.7627 null] >> endobj 110 0 obj << -/D [1001 0 R /XYZ 56.6929 167.4388 null] +/D [1011 0 R /XYZ 56.6929 167.4388 null] >> endobj -1008 0 obj << -/D [1001 0 R /XYZ 56.6929 126.8733 null] +1018 0 obj << +/D [1011 0 R /XYZ 56.6929 126.8733 null] >> endobj 114 0 obj << -/D [1001 0 R /XYZ 56.6929 126.8733 null] +/D [1011 0 R /XYZ 56.6929 126.8733 null] >> endobj -1009 0 obj << -/D [1001 0 R /XYZ 56.6929 98.4089 null] +1019 0 obj << +/D [1011 0 R /XYZ 56.6929 98.4089 null] >> endobj -1000 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> +1010 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1013 0 obj << -/Length 2705 -/Filter /FlateDecode ->> -stream -xÚÕZÝsÛ¸÷_¡—NåéÅA°O—Ë%×ÜÌ%×ÄiÒÌ”– ‰w©);Îôï À$EJÎø©ãàò·ËÅ~f3 -l¦SBE.gY.IJY:[ì®èl Ï~ºbž& DI—ꇛ«¿¾Ù,'¹âjv³ê`iBµf³›å§ùË¿¿øõæÕû넧t.Èu’*:ûâ—W¸ò¥éüŸâå»·¯ßüôñý‹ëLÎoÞ¼{{d4—ðæåwßýúêñ½ןo~¾zu¿¢û¥Œ -û \}úLgKøàŸ¯(¹Ng÷0¡„å9Ÿí®d*H*…+Û«Wÿˆ€§îÕ1Í¥B“TólDuœ©.͉\8ÕÙof„]'ŒR:ÿ±,ÖUÝ´å¿öæš16¯ëmc¿ðDήHγÜ!ÝlŒ'ê2e9¡)³²Zše¹b’äRhOóÝŠ$Z$Ø€€c(9*ã%á’Í‹j9Çaw¸–ž´j¶uýûq?‚)SÐ>Ë<áþpÍô¼^Š]ðBÏ ·bì$ŸÛ-®.êÝÎ2v“mYµNŽtUp èŽðÞÎþ8šÃCY­qV;ܘÃ94ÄJ8KÏ@ëvž1’§)êÀM[–++ÕÊp^VøÛ´[ƒC”õ±Ý[ƒP»¢%'6MaÁÑ”ÎÁ¸r6(éRM›`¤êE—g¯hÁÏó D#<{vAÁ¼”LûL­µ&œfóe½+œ†¨M¡ʺ‡kÜñ½S%ÌÿMS:fäR°6ñ VH 1Ë™·A¢µo7²›Ò¸] -Ü5XÛoMëéëUhü’7h7vfqçjþÆoŠÆÛR -’S¡ú¶ÔÞ×׉  DYšæo׉d|Þ”–)®—UkÅ¢-ïÌ#!Žœi ˆ%ΰçðš³oRÀ=“øEöÉmÑ.6C¨ûMͳ8¶¦ÁYÑ…³ßAûò£{I›Ât ÀŸmÙx«wÚ³Þa@ÛÅ'ˆì)+cÕ'¿Øž>¯÷Ö\ã,¦iÊÛàt+4¦Îp»að-<·S„TÇ5xƒTD0H‡#ÞÀ  •ÂxÌU¼@Šèbœú'£0–ê‘“ÕæǦX›I™„$"ÕêY2u0œLrT¦@\,Q`eŸ¾GWK»®&R¢UšzWÃè‰d=d¡·õdŸG€‚Qy¿ÆPq -$ÑR O#@)ɳLyg=Iû°7#Xœ³,ÕQ(üÊ1Ù ®{˜‹mÑ4# *%Y*äô/#¨\ÜV.]T4ñØŒ‘Lôô7K„t¿ïŸ’ËÊ-×ӌƕò§‹ò[ß2U{qË>Äkˆ9‘”C‚Ò‚Cñõ˜7ÀSÍ1D‹qÙô㊳T;¸/Côh‹ßÍ ؼ3’Xhw„úÞ›42 ,Ä%´¬Î¼cîƒþ:Í]ÝbýœØ­&CiqW”Û"Æ=àšaéó»~;*9U„çOËÏgØŒH!ƒÛODÜCøš¬jR0Õªš.ÕtU©ºUj—© y’*užk¤a+Qز¸Çwº g’Ÿ¯ 9¸3ñð…GÙºÊ4›Ýj†òšÍ¿š—œÕ—‹Hâ+^ I×ù,9ƒ€p -›Ai:ÿÁ/ͪ8n[»ùJ WufÝ6øÖ­iï©ðÑ‹"X¶e±¯^$ôLŠòkPÑÀÞØ"¥2Þ8‹åͺiL0ºÛPú–­·ÎÕ±ZX³,ü§[ó vtë-Ô|iMµ4ËàÖífàÌ'1À›údbO)'TÁN>#‰v1¦{¤º˜ØeÊ….é92u1¦{¤Š¦‰á=)^.·Õ¡¹¹¿ ?YŒå~¯eÈnS9çÐDSHòöbùP-ëv/6¥°½8‘øû™+âýë2^¹3ÐÇ=!ÉyÈ÷#·5Q9—ýÄ}0í¡4ÍÓ±wÅ]m‹õØçCÐË4âÉ8RcZ¯±¶ãšæ‘B,è+´o+ûeÏA3>÷ÿ5¹NgF{Zv•<³GMò|víRMg×H5<³éeX®¡ŸÍøyΑêk‰•iØÂIÞ§çEZçá¼ÈvÙ ÏöÓvúi‘fýÚ>Ä̓AUWIç©MÚ§³.=6ÊîÍí¶¾¼6~²ÐÓ¤Ê œz|'RfKDÈê®›…™?s‚‘whàqŽ=u–=Ú,ÕPKA¤êÖÈI['«2!÷[_M Žþ_ä“xvè:ŸÇ³„ÑTå½äÐ÷l£„‘3Jø5–ÄYÕî7®2Î)D \Á³§õÑ6¼MwÉC­¾Â¡=ÆDû…‰/ÅqâY‡3gÏ [W¹8w%îÒaŽ.škQÅÊØ2¦ü€fÝéÐsç½0Ý<ì"E‘ÿ“üÙ›Zçl]ðÆ@ÿ°¼„佂ÎQtÕiFBL§‘dfü h4¨0“sÜ®#ÐI<< §Ÿ0²Û_ŒGv„ -µ#÷‚+ÏÌ.¹cWø}ìzì¬'¬#[õBcå–jü½õO¬ ÖÖ•,¿r4êÓ’À°Á_T3 ·Ü>íl‹ëµ?Pgè£îLfq3où§{³(-²²ó» -#¿UÃ¥ìœôý©e0fÆOØGG÷ãÑê‹aº°¿®™´”úGGà32’ØMZ ÿ&ƒÃ`3GÕÚK!¤M4Ý×Û•[³)îÊÚIdÒ¹žß{¤¥—¡ª=-â9ØÅðEàð{»]ëÈ•™&™Œ%â¹J&•…>ËœlÌø5œÚo8Ó¢¡5Å’Œ€%L䶵U6‰%™ìÜor¿ùb¹++På¡ÀSï8±;{?\ëÙZx[<„B<ø­YÇk…}qhû×ñÌêiH£ÞÂOƒÊÀÇjm&3BµºPkw©¦kíHa™,6fñ;Xâê¤äV)š,?/@¤‘ ¿ß”@$æ}&µ˜ŠɈ˜lÍIÆs~z›ë[)ûj3Ø—æ¡j‹/Ã=9­œõÉxýì„!r(N¸Ri¼ ¤|;}éco{5eâ9Tcºª‹T«:Ơϱ¥Òsdê`LWu‘jl‡}q÷ÛÝ׳§/L1F­cœ9˜E[ãÍáð˜@ÅSö­—/«rk&ÀŠ5§ª{`0æ¼SuÞui¦×Ó ´õµ®Ì©ÛÂFI¦Ï±Ž4'¼ûº€,Âï2?ç°úÔaƒ€C‡•°qâI[„0Ú´áb+Þ¯œús<-‰ v·ÓÓ7°)œ=ë®3"œ¹}Eši7ô›-Rbÿ5h„!—kÏþ¤ÇÌSZóq#T¡çYÊ -ÏÒ¡äñ_•NEÿ…6_0endstream +1023 0 obj << +/Length 2720 +/Filter /FlateDecode +>> +stream +xÚÕZÝsÛ¸÷_¡—NåéÅA°O—Ë%×ÜÌ%×ÄiÒÌ”– ‰w©);Îôï À$EJÎø©ãàrw¹Øf3 +l¦SBE.gY.IJY:[ì®èl Ï~ºbž& DI—ꇛ«¿¾Ù,'¹âjv³êðÒ„jÍf7ËOó—ñëÍ«÷× Oé\ë$UtþöÅ/¯påÛ]ÉTT +V¶W®þvžºWÇ,— +MRͳÓq6fº4'JpáLg¿™v0JéüDzXWuÓ– üÚ›kÆؼ®·ýRà':üè,áŠä<˧›ñD]¡,'4eVWK³,×#Œ˜$¹ÚÓ|7ÂE­A l@Á1.9*ã‘KÂ%›Õr„‡ÝáZzÒªÙÖõïÇýO™‚õYæ ÷‡k¦çõúPì`/ô¼p+ÆNòy±Ýâê¢Þí¬`7Ù–•ÁQëìèHWõ×€îï=àì£9<”ÕgU±óœs¸3‡†X g ãXÂÎ3Fò4åÁü¸iËreµZ™ÎË +›öakpˆÚÁ >¶ûc‹cPjW´äħ)ì šÒ98WÎÆ£×%]ªiŒT§èÊÌá-øy™hDfÏ/(¸—’i_¨õÖ„Ól¾¬w…³Õ`)´AYWøp;¾w¦„ù¿iJÇœ\JÞ&¾ÁËCžeƒÂÛ ÑÎú·ÙMmܮƒí·¦õôõ*2hü’wh7vnyçjþÆ3Þ÷¥4§Bõ}©½¯¯A¨²4Íß®Éø¼)­P\/«ÖŠE[Þ™GB9×K +œ7àÏá5çß.¥@x +&ñ‹ì“Û¢]l†¬î7eX4_ÌâØšgE—ýÚ×à \Ú–A7 +üÙ–÷zg=¬]lq‚œ=ee¬ù£óÛÓçõÞºKã¹Ç|`'‹…išò6Ý +i‡3Ün0 +NåãSÅ)#Ɉ–"0ú4Â(%y–)Oà¼'iöf„ç,KuT +¿rL7¨‚ëÏŶhš¦*%Y*ä€é_F¸rAr‹\º\ÑÅGØfŒd¢g¿Y"¤«øý€ü”\6n¹ž4n”?]ÔßÆ–©Ú‹[öy$_Cn̉¤ + @ àë±n@¤›cÈ!3ⲉye¤PPPMçç EF¤Á{ïËtÚâw3ȶ\ˆˆ !£wyLã‚HuÈŒ ‡¬çèÔå1 "UtM¬Iñr¹­ÍÍý](Éb¬ ˆ{-Cqœ*¡<‡3è°%o/¢jY·“üâ™62l/2œÀ ýÂùýë2¿rgàø„éY¾a e_•sÙ¯ûÓJÓ<÷«m±û|Hz™æC~2ŽÔ¾ëë;îÌ=‚?ÉòÈý"Àû6ÄÙG<ËøÜÿ×â:]týýiÕUòÌvªäùêÚ¥š®®‘jØòéUX®á8œñó’#ÕÑ ++Ó°…“²OÛMC»ÉÒž <ŽÛA8Ž‹4ëÁíCÜ<Tu•tžÚÒ©}9ëÒã9Û½¹ÝÖ÷AÖÆ/B:`™T9a‚óA‹À©”YˆU݆aæ[V0ò!çœã‘<Ë}ž9·…µâ¶v¥†w°\Êúèß³Þä‡þ•‡¬~ùª¨ÐþߎK®ø €‘i¯q€Å0Çð^;ügó·}³"¡7"к6¬€Ý–8rÁ“ ,ývlüÈW{Lf…bô‰9†8XˆÙÜøÕA°óÐå€ýëxÄcƒ¹‡ô'Q„È8ÔAö,Ñå1""ÕE!%)WÏêxtyL£ˆHÕ Q_;0B š0>u—‚HÕÅÈI['«2t û'gM þ_”“xq:ŸÇ«¤ÑTå½âÐl§„‘sJø5–ÄyÕî7ç²®`ëj}´ç妻äY­}…CÛEÿ…‰‡â8ñάCËÚ Ã#,ŒÎÄ]ºèˆã¢»FUDÆV0åtë¾ÂH‡!˜»è…éæa,RTù?ÉŸ}×ÕÒ¸`ë2o œ–—x#¹å^EB稺êFRLç 1¨Ìø¸Ñ`ÂLÎIdävä#ÁÓÐ<…‘UØþb>²#4¨¹\yavÉumá÷ñÔcg=eÙªÇ!¬ÜR¿·þ‰ ¡ Ú†’•WŽfÝàZ6ø‹f†Áã–Û§mq'Bíû1ð cÔµd`7sð–º7‹Òr6Cq~Waä÷A¢i¸Tƒ“þ|jŒ¹ñöÑÑýx´öbX.ì¯;LÚê çGGà+2’ØMZ ÿ&vÑa°Š•£jíÒ‚%(îëíÊ­Ùweí4²}x®ç÷žÓÒëPÕžbm‰jx8üÞó/@L™ŒñȤ²pÎò}÷¿ÅÓ@û = ­)–d´e&r{´U¶ˆ%™ì\r=úb¹++0å¡à©W¤x:{?Ü +Z,¼-¿5ëx+±/mÿ6#ö OCõ~šT.8†µ™ÌÕêÖîRMcíHa™,6fñ;xâêr«”&ËÏ+©F4èï7%‰y_…ɦSñD2¢æ€·æ$ã9?½ öG)ûj3Ø—æ¡j‹/Ã=9ÅÎûd¼½vÊ ='\©4^$R¾¾3²—Åš2ñÕå1ê"ÕETÇœs,TzŽNÓ¨.Rí°w¿Ý}=Û}aŠpjóÌÁ,Ú/‡mIOÙ·Þݬʭ™h<€kNU·a0¼Su>ti¦×Ó ¬õµ®ÌiØÂFI¦Ï‰Ž4'²û¶€*Âï +?°ú4`ƒ‚À•°qâI[„4Ú´áb+Þ³œÆsì–Ä»ÀËíé Ü”ΞuU9œ¹¼Ešé0ô›-Rbÿ³hD wsÏþ¦ÇÿëWZóq'T£çYPÊ*ÏÒ¡æñ?NUÿ£^mšendstream endobj -1012 0 obj << +1022 0 obj << /Type /Page -/Contents 1013 0 R -/Resources 1011 0 R +/Contents 1023 0 R +/Resources 1021 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/Parent 1009 0 R >> endobj -1014 0 obj << -/D [1012 0 R /XYZ 85.0394 794.5015 null] +1024 0 obj << +/D [1022 0 R /XYZ 85.0394 794.5015 null] >> endobj 118 0 obj << -/D [1012 0 R /XYZ 85.0394 769.5949 null] +/D [1022 0 R /XYZ 85.0394 769.5949 null] >> endobj -966 0 obj << -/D [1012 0 R /XYZ 85.0394 749.3395 null] +976 0 obj << +/D [1022 0 R /XYZ 85.0394 749.3395 null] >> endobj 122 0 obj << -/D [1012 0 R /XYZ 85.0394 221.8894 null] +/D [1022 0 R /XYZ 85.0394 221.8894 null] >> endobj -1018 0 obj << -/D [1012 0 R /XYZ 85.0394 197.4323 null] +1028 0 obj << +/D [1022 0 R /XYZ 85.0394 197.4323 null] >> endobj -1011 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R >> +1021 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1021 0 obj << -/Length 3394 -/Filter /FlateDecode ->> -stream -xÚå[Ý“Û¶¿¿BoáÍX>‚lŸœÄN™Ú‰ïÒ´ãø'RwŒ%R©;Ë“?¾»ø")‚’'éL;é܃Àår±X,~Ø]àØ‚Â[È„$Ï*‹‰¤L.VÛ+º¸‡wß^1˳tLË!×W·W_¾j‘‘,áÉâv=•š¦lq[¼‹ä$Ðèõ󿿸^rI£›o¯¥Œþ?úùÍ÷/Þ>¿VqtûêÍë›ë¥¢Y}ý·çßß:ŽË2¾~óúå«oìå\¿¿ýîêÅ­Åp¤Œ -¯WïÞÓEþ¥rñ”°,ã‹íU,‘±Ž²¹º¹úÁ ¼ÕŸ†,KJ¤Œåb)b’Bÿ!.–L$Ú! -ôf)‡†ÌH"¸ðÆÙÀø)#2ËäÂs¡ñë|[ËÕC¹úð©©ËëeBiônYüòëã7ïÝÓ --õåK)Ò˜‚yCPÊj“·­auÉ3’¦*³\^^'$Œ^:Í¡Ûº€Ä1›—Ø]”XTûrÕ5ûc@¨ŒIÂ%;ú -³„sÊÔbÉɤä¿Wú‡‹*ÿL%­îëf_VXcFÒX8©¿„q¢[†§|_¤pA2tõÏ”²Î« hÅæ¦:=dý'äÔŸ -: -O‰¢iÃú,cÆ ';tÕ¦êp}-Ê«r×:H ¶"È×üm—ï»@W°ÿdIìvfVЈEòäT侜 -¡~&=Ÿ¡;Ðè顺fÑêÁ|üd‘À<国H‰¨n:«°™!M¯ê燔B5&Ò2óûÕ­¿zÈëºÜáÛ¦(Á¹xý«µñYŒù’D&cÐ;6\ûë4:„T -"¿T^ð7MáÔ~ªº‡æ`1¯-€6;\­ESûö©Bo4€Úî6ùq²‡6¿·ˆ¼-Ûþ!oÚêåý— ÔBr€VL%”³ô¤#CS$véˆçÂáÿ¨QIbÖ˜Àrùý* EÌgHžËOÛ™Dr‡ÑE–²±5‡SïÝÿ¾z,ë~’gç8Î(¼° -†\ósì¹Ì¯! yMò(=7É“´yvzþ˳C’,žµ¦çššód–4„J#{Þ@&[Ü -þäo›W˜{æ:†·9àïõˆuy¦Ä_pñÇe|œº]»=x4 ¤øÒ—AÿîcÏ8¬Î³õ\S‹ŽÝ ”aldÒ·½IÏN¶õ “HnOx·9d¢6œó A‰<¾à®3>á¸t¡k_–Ÿ\±üO‰˜HA ËÎÕsM­:ö ˆš!)äc³ÞÚ]‰Û»qtØyW¶æë -”¥ð§8Öù¶Z™ K™pLØ4©núW¦UYAº µ´¥AbqZŠ0Õ.ÌS3Þ¦k0Ò¤þ<52[Kói+<´Fù²ÀÊ‹!bÔq^ -)¼¶>äVRYT%›º‰ŒîJój›åð)È¥¾l­ËeXbñÐqjjl‡†½;â/C£AÎmíφ µM Õí ³I¾±µÊ­6?¶!A¾7LWóh‹4ú¥9ìë|c\¨†œugÛ#½Õ -€¿±\¶4DÇó`×÷’sóqW‡âƒ>ñÁ‡‡ÐÖöÎ;ûì*lzb°ççû™÷"|0Ö0ßæ]Wnwzn¸Ï³9=‘¹ûXµžªMp­z8sÑ¿…µOe=‹_°0ˆL“ô<~ ¹æñËsµò§yô#Ê -dÿWÀËŨg-ÚG²“†#Ù‘M_ÔùvÂ$í±‹'™ñH æ江wCî½^Z,I¢± ß×MÿÊP*+±ÌA™HIœÒ“SÉj€eÊc™rX¦ÆºÀ³Ç65Ä6¬ÑãØ4²·;dK=Fà¶D¬\ÁÂÃh„ÙPÈìðL ·yø ¨ÚÏBЦ¡’i+riTChâl°/C¿ÀC¾Ö`"† ͨƒ­‡Ü -À3¢MÙé¡J.£çî3®·ø±[ -ðVV4.&md#¦,C8à¦XÒoŒjxzšáwÓÒÚ¸è®tF7³XÁñKßbæjN?÷®3sï¸LîÓ×3G!˜Ö˜Ó ={®i×㚈IŒw†F}ûÊ€HÜ©e¨ÑoÿÐ6‘4úkpÝÐè†`(2w^šDEc¹KA<—«¶«êû^Æ°×ÖžPp󘡪4ÉL–Eby–â8Ž†ò?–†fb+­2qØŠß´æýÚÅA@¨© 57„õðcZ—ä‚“8ñ§4Ã’ÕÈò‚AúêÏŸžœ¾ §‡ÿÌn8@ÎÍãÆì úD¨õa{gL±’iŽ‰“k¶|Œ‚n{ÑЦ÷Žñ‰FþØTE{âùuYºú…Èò# © §ú|°)ô~·Ô »jë:œÔXÊØ©œ__”¼$j C®3ëËqéÚ~—wí´ÜÊ`/Wò|·žkÚïxq±\ xÔñO˜7ï«ÎÚÂoÙØÐãWíØêÞp§ Æz³ÆËbT° ÓkÞxž Çðë¡Ü7Í<8í¹§I×apõ}{ñ¨¹¿×™SFlÂê2ÀŒG?L^˜V¸‘j. é,‰ù`ËíÇåÇݦZUÝæhèEe誳"S—G@Á)4qo»ª´wB`Å”÷þîÚhô8?Üo™ýåÐY6"óÇ`öD59Àׯë›!öZJÆa©tg¿€L`ãOÂZ4Jc@:=p‹ ïÚÜè¢N`¥9Ñz[©8+þzÌúØk5ìEq’òÔ}ª=ÄFëBé}îd»@WÖ êX¶ >bþ|ÛÝ©™µ\œ%þ6¥=>Ë„`fb9˜AËɘǟc9™AÔ#‘çáÏÐTr¡†?ä:ŽK_É£¯éáó ˜Ú:¥éÆäï‡ûCèsqšú궛½EAÀ0î_ýó%^×gÃ3Áö¾íÌ›bçÂе2WO‚¯ÑEèú…Žÿ†œ¾FŠT{–¬ãYíƒÀ°Ü™wÚó°[çy`3÷FÀ/,ƒ½A·*Ûvî_ `Fñÿ³Mýuˆ?üoýcགྷ4;ªSX3!V)4?K¦W/)¬þ„Tÿ7ˆ²endstream +1031 0 obj << +/Length 3424 +/Filter /FlateDecode +>> +stream +xÚå[Ý“Û¶¿¿BoáÍX>H€lŸœÄN™Ú‰ïÒ´ãø'RwŒ)R©;Ë“?¾»øâ·äI:ÓN:÷@Z,‹Å» [Qøc«H™ðd¥’D”E«Íîá·o¯˜¥Y;¢uŸê«Û«/_ +µJH"¹\Ýn{¼bB㘭n³w ‚\¼~þ÷×kÑàæÅÛë( +þ]óý‹·Ï¯Uܾzóúæz­h_ÿíù÷·Žâ2¯ß¼~ùêÛ;>×ïo¿»zqëgÑŸ)£§ðëÕ»÷t•Á„¿»¢D$q´z‚ +%,IøjwF‚D¡®¥¼º¹úÁ3ìýª»Îi.Œ(‰¢0Z­EHbŽŠI’AyŽ…¹YÌ¡%D +.¼òCÖS~ÌH”$ÑÊS¡ò«t—gëÍC¾ùð©®ò뵤4x·Î~ùõñ›÷®¶AM}ù2=nLÁº¡DÈeS¦McˆCò„ıJ,•çWÏðÌ>r ëc»?¶3‡džc{‘cVòM[N3L£H±1Ó§¦°J¸¦L­ÖŒ‘$Šøïåþá¢È?Óˆ÷U}È ) {¤!#q(×_f˜q¢¤ +-ÁSz¨f¸pA4õÏä²M‹¤bKK'Yý '9µçŸf …ÇDÑ8ÊzºŸ)èÌþµB +½÷/±y7Ã&"‰RÒi®(s”N¡"1§ª/ÐzQŒÉ•¢QJÍŸ1–fÝ#Ò(ÇÙÜc‰z Wïö  ›jx&„±HßM(ö;MHpSìŠ2=ÀA$¢ µø7;Œ¥Ì©zËÏl‡þ8±[ð½´ÔÌ ý ƒ´|JOiËŽ»}cšÛ‡Ü´´Ç¦M]µyÕzÙLwSmöù¦ø™Ržg(ÂjÍiH¸¤ÌY5³VMy™›c-¼=í‹MZ–'ÓTT曚OVl¯Yló~ÌÐм­»´Eƒ&Kæ!¥ ñ%óè-›‡#BéU¶¨a2JÎŽèh¦#Ö‰*1ñV¯BÌ£]ÝÚºÞ=PbA–BseZq…4e]šÔñŒ 1˜ ý¦vó Ä)Ay<ü2ÃsoF¸?¤;ÓëW?5FšÖ Üœš6wÙ®¨Š¦=¤pò™&m>s#m@ ´FµÖú°XïsàRà„ ƒzk¾©ù­*‚&?<‚Ù€î^¨8l¬j“ª¯^½þÆ”Ÿͩ' ,8» 8ß©?-šã~_ÚÆÊS–¦ õ•]ZeÏÉíîdŠçŠRéàs^žuÈ8¡b¤°c[”E‹û t‘Üäûvf ¾¥I¿¦oÚôÐÎ çO"Cw2ôf•^$—c–‡|‘)¸úIäôù ÍOÅ5 6¦ó“ESKË­H‰ ª[+°Y!Ý^T Æ!…:«Lp¤£ÄŸW_4†ýæ!­ª¼4Ìwu–ƒq °úW[c³èóIÉ!è꣮ÃuçD +<¿8º`oŠÂ‰ýT´õÑ"bZY­÷¸7‹¦öק­Ñj³/ÓÓdMzoy—7]%mÚêíý— ÔBp€Z”ŒÊYü‘>‹)»pÄSáôÔ‚.ˆaÔ(a»ü~‘ú,–#$Oå—íL 1„³Î¾ø¶Åý\à" D‚bì:6d y³9ù˜ãþ"GÜJsÎÞÀMöüNù}ÈçÂîo”ÈÏvA-’ÎùŽ1á,aŸë…ža¤ýkKFy?·"Á‘Pèá(’ÄIwbÏ‚!“Þ? <Ä@Eçn¦…Ý‚ÆÃÂÖ|Í)ë7gQÝO¶§³ä(¢x–]°öŽÈ{îòP¼7&V¼{e­/ ¼³u—a{Ô ƒ#?/m7oEX1Ú0}Ó¶Íw{½6ÜÇÙœŽxnA?V¬§‡¢œ„G«Îœ÷oaíS^-âl Å2>_}ªeüòTF¬ôi½†ˆò‡Ùÿðr>êYvžìD¥óžì@§/ªôN¡Œ;ìâ21 ©©vënš;+„-– )5–áïUÝýdZ +˱ÌA™ˆIÓÑ­dÑÃ2å±L9,SCY î±Mõ± sô87l`íÙbØÁ¦ˆ•KX˜ÆÚfÖÕï;öHÚ²Æͤ•,BÄ”õ¸%ŽhÏ69<½Ìð-k@ZëÝå.Áèñf+8Þ)yÁ×éS-c…§Ò¢×m±=ý_Å»guÙ¡ÄD™ó(1ÐæÛ¼É]ãõ›ÛW/ÿ5ÈÑ6KaÐÙ؇cê[,<ÍéÖ¾Guf핉}º|æ #ËrzadO5z˜! ñÍÐ`lŸÒÝZÊ™ì4úãÊÆS€B×¹cÐn†"q÷¥2ÈjKUÛ†TA=ÿX4mQÝw<ú£6ö†€‚™‡|U¹ f’$(Ë“çq2-écnÚŒo¥±5’[±Oc~ß:?Új*Óšš†íðcš—ä‚“Pú[š~Êj yÁ |õ÷OON^ÓÃbhNMµ4gƒ¾Q€Ö긻3ƘÉ4×Ä2Äœ-¢ ;^4´é³cx£‘>ÖEÖŒ,¿Ês—²™4uîTÖ™>ï6½¼a[ìÜ€“kO»”Ëû‹r€y!·Ð§:³¿•Îí·iÛLÓ­ ÎrÖSMÇn.&Á‚ÿ„qó¡h­.ü‘e -~Ó µî7&0Ú[T>£‚]8˜úTËÊóT8‡_ùáTÖËàtväœ&CσÓ`ìÛë„õý½Žt˜2²`v4\ ÁxðÃäÓaƒ[mÀM:JbÞÙ²¶sþq_›¢-O¦=+ÌÝ´–eì⨌¡‰{ݹ};&¿÷o׳ÇõáþÈì‡ÌÝe! foTg èºëuý2Ä>K™1EX¹ ‰Óß O`ãoÂTJm@ß8Æúomt3¬%'°Ók},W\ÿ2-Äø¶nêÉöŸ”éTpƒA/£&èíECFùý´I¯û3ë5¸J3²mÞ}±’‰œ ‡’. +{DËöçˆÌÑ^ïý•üÄ*D4"QñÙÁ=Ñdôá R°×„ †¿Ñà »4]Ü{;…±*Á.ý€¯pôùA“ 9:¥!µ~{‚{ÎègzXïåc›§4Øøýxÿ`ºXœÆ>»†åú`Q°”;ÁWÿ|ù-°—€À +.ø¡i±"ƒ|çÌ´£²D9»W>kè:•Æâ•öÿ°³§ô9R¬Ø»dða¹}õ3~!Îð1€Ùæî•ÅÈU€øRŠÞ-?²=¡¿G¤°·ÔàÙçLS%ý¡/,gûbo“7ÍÒ¿2€áÿÌXõÏ/þð¿9tÿýïâxéjPaŽ +˜X¡p*LNŸz¢F$Ÿýßð3*endstream endobj -1020 0 obj << +1030 0 obj << /Type /Page -/Contents 1021 0 R -/Resources 1019 0 R +/Contents 1031 0 R +/Resources 1029 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/Parent 1009 0 R >> endobj -1022 0 obj << -/D [1020 0 R /XYZ 56.6929 794.5015 null] +1032 0 obj << +/D [1030 0 R /XYZ 56.6929 794.5015 null] >> endobj -1019 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F53 1017 0 R /F14 729 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F55 1025 0 R >> +1029 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F53 1027 0 R /F14 737 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1028 0 obj << -/Length 3881 -/Filter /FlateDecode ->> -stream -xÚ­ÙrÛ8òÝ_á·•«"' î>erÌxª63›xª™<Ð$eqC‘‘ŠÇ[ûñÛx ’\5[©q4ÐFßù5ƒüÚèˆÉT]'©Š4ãú:ß]±ë˜ûþŠ;˜µZO¡¾»»zýA&×i”Æ"¾¾ÛLö23†_ß¿¬Þþðæç»÷ŸnÖB³•ŒnÖ:f«oþúžF>Ô֫xˆ·?}üpûýß?½¹IÔêîö§7ë„¥ -V^^ûÓÏïÇuŸo¾Üýxõþn8Åô¤œI<ÂoW¿|a×øÇ+ÉÔèë'è°ˆ§©¸Þ])-#­¤ô#õÕç«¿ NfíÒç´4‘6" °NÈ ë¸ä‘‰¥¹NtÅæwUq³–±YU}÷7ܬÊþ°oʸÇzu·õ“Y]·O¾Ýзü½/÷MVc/]=Úõm^v¬oé[”¶«š’ºOÛÒ­o²]éhØfí’·»ÇÈ`8åšó(ÕZXŠ»¾}|¬š‡hÉ}ÎV%× #“0d×µž‚Yv)3eƒ¶ŠÇÍ÷6«{` -c«_Ö_Žˆe”(%/à¡Ž ˜ßWl¢DèŸáô ŠB®úm‰ ±êÊý·rOƒÕ¸Ye}Y?ßpÎWp…’ñÕ§2/›ž@òmÖ<”7|ÕQ—¥ß‘nïð°¥ân§Ê Íá±€}i¢uènÿõᓽ#¸6.næW•‘4 \¯š¶§F—}³7M+\ÑYp`—u=žÛ¿2&ê²{=ÉW÷·ü©ªkjÝ»EDu]û]7íþ‰P´ý† v©Göïöà$wÄæpx:à™Ò5 ËË#¼2Œ”é¼êï\E•Š þÍß69ÝÏŽtY¹uÌ#¹é;Íõ -2(²šG‰IùÌêóœ£:Ž’„©9êÿGÙ¾éÇù6;Ã7…ÄoêC·=©èçñŠ~„7¬è3ÄqùÆåY¾='R"†Fj.±fv†5j` šé€2ƒ cR§ÌhF` -V BÐ z¨cçÓàHtveÖ¸íý¦÷ýÈ¡¥å© ²¥Ga Í qÁ” FqÉ2Î’sŒ1m$1B   ÞžNc}Y*“HÈá–â0Ï‘«­5®éðØV–ÔÍëìЕݟƒ&=¡:K‚(\Ÿ”Ä=;/Ñàüøb¿^ -2ûj Hy2úl[[j€–«5rAœR.ñkl÷áànGlZ |tðN¹¯¼aŠå ùBÀ(dغwp`˜û,'¿][tBêÚ€e_ûÓÍTyÝVSffò‹¡\䩧‰NA3¡}«lJè -oœ{ŸZJ,Dõ`ÜÅË$ ì+3bq=Zyœz(kW ¢Ì º_­iÁ¾;@Õ»µÓkrI…Q6q¼('Ú•‰ž†Øµ±V‚o©ÉŽËÁcœð*i$UrdBÌRà¸4/Ô›$ÒBzÜcNãNA,ƒ†]NC-}É$î -IÅ!v!‡©ðnÛCí8ÂÚ@F+ª‰v¢ -š* xW½Èäq“ÚݤÞïC¹IÞ4H³çàön Ÿ åPEàÛãøn–}~[è-!:V¡¨î„‡/‰ä·*àŒÄ°£nF’sh«t–¾à2lr P`Ô€¨ -m^p·)÷èž÷ùXáò©‘CçHˆ’ˆ‰A'¨:äsšÒkó¨tuÛ»ÃvÏ`ö~÷¹2R-R Œ€Ñ\Dæ±ÚýˆDŸ*|%¸Á¹+Á¿Åd¼‹­!4cÐŒ¿‹ÒÅõ›>¹Ð$P:伕ˆùy -x¤âA¿üA7-þàÊFÛšl’$ãç°Ž„½ò‰­ŽRÃÞÀGc¬vëë„«‹ÀHF[¥fÑî2«UE{»¢—ÿaPº²/ŠõT×jÝ8®CVÛÝ˶‚LÖ²(ßâÍý…êYýö`)=]¿'aƒÅuõµ Er¿ -¡B5p<º\ÈúòMXëÀB&«Lü’è ØÕ˜ðÏóÖÃŽëé–Gy©€{;c’(•C´gÏ:+eÔõ¦è’\Õ)l•R´Â­KX%@@A+姖FÎ…«°U¬‡žÕí¬Æ.€T%¿ ©æÉœIê!ÉÃÔ¤ 9FG`8ÅhZÿÜV¾¸æÇ…Õi²¿3‘ -çâÕc¶ïl¼¦b¥A+Ëóò±wí晃Ø*M!…òI’Š—1£ryÎxæ ¨äè @(·žíçjË/ÑŒí.Ë×»B‡ïÈ!sp¢gÅåe¯q/k˜¾Ùßu RçQ&™ãÄ¿gî-$ëÊu¬üóFÞþoàw¡ŠíÄÕúðÖýÖW+ãœ4wL¼ÈE|Ç3—bM© -!Ù˜Owd©2&? ýi4 ã÷þ(Ù 'e‘ ¯}'TŽ–j¦ÈåÞ#-³g~ÈËü#»à®°^€ª”¾0» È⡺l=—àSÏ%¨r‰_ô\‚¹„ (²Ç–­#Șpá±› qÌ` #yAhg’1p¸v@fåÖ®aãlqò§“fÔ0u¾ -´VÀØ$ ÄÄá;çéĬņŸàl<Æñ')†íè°pp«l7ôhh›øÚ$4Ü5%®l9N¹ÐÔŽ´4pïÖPhŠ#®Ÿ¨é{"ꃤ÷D»¥«ÛÀáÐÆq €¯?ÿdi hÔ`/„]’¥é‚ãûÑäýÖ…Ú“÷Y˲Íó"]™`š‡âà Œ¾øþ6ç(Ë¢Ç#—eM8J•¦:âO¤Žðï pøïäñÿÙÂø×èááRºd1é°# -Í“%åÃß7“þ?(†endstream +1038 0 obj << +/Length 3965 +/Filter /FlateDecode +>> +stream +xÚ­[ÝsÛ6÷_á·“g"Ÿ$x÷”¦IëÎ\ÚK|3mhŠ²x¡HW¤âúæþøÛÅIA’;½Éd‚ `±Øß.h~Íà¿6:a2W×Y®͸¾.·WìúÞ}wÅÍÒ-ÇTßÜ]½~/³ë<ÉS‘^ß­Gs™„ïïV?/Þ~ÿ槻wo–B³…Ln–:e‹oþúŽz>Á+­ÿðoüðþö»¿|s“©ÅÝín–ËŒ¼<öÇŸÞÆ}ºù|÷ÃÕ»»°‹ñN9“¸…_¯~þÌ®W°á®X"s£¯Ÿà%<ÏÅõöJi™h%¥ïi®>]ý-L8zk‡Æ$§¥I´YDtBŽDÇ%OL*Íu¦ó$•ðeW¯n–2U‹ºÇ_½ØÝp³¨†ý®­V TËÅÝÆ¿,š¦{êi@ÑR_õÛPíÚ¢¡ÞG;¾+«Þ‘ ‘­* ÛÖmEÝO›ªEé|Ä£d:áW°3d®-¶ÕÊ‘·"U’ +•:ªMáöPvÛÇÖ±C®—RæI–§×KΓ\ka‰û¡{|¬Û‡d~vœ)˜_e×O“1v ZŽÉ¬°• ›A8 TÄh3€H[ü¼|ü|Ä@*“L)yOuÌÀô´S“dBÏ8ø»Er1l*lˆE_í¾V;ꬷ ﺪæù†s¾Œ/>VeÕDRnŠö¡ºá‹žž·Åªò3ÒÙï6Ô±z†ó«KZfÿ¸‚yéEç–»ý×ûǔ›éQ¤‹À׋¶¨Ñ_«5­nqE{ÁŽmѸlÿ˜hªþ*W€,Šìï¬t½9`°Æßê·Ç¦.kwV_‹fFêÚ °—¤>&;-õ@e-­‹«,8¡ÌäüÂÊžêxå©DušdSÓ¥ÿ_egä¦3X8½(·Ù¹y*d~ÝìûÍIC?¿n0ô£uã†>Yø=.\½@peQnΩ”H¡‘›K¢‘§ +¢A1fPaL>róG æàÕl_`ÐS38•a(V¤3ã2|¨¿VÎ8-c¶u@PÞ*OžŠKò“–w "] ûþha~“Cr~aOu¼ðÌ‚xx;YùÛºl + Lx6l»[㯇¶,@[€Þ‡np¯†M1ø–ëj÷Û{ Ê` +šJ,þaÉÍ^·e³_ù§0ªn(ežÌ(´ &œÞÝ×íêõÛï#àoŠABLÁ .îÝ÷j¦ +«j]ì!›8^pR®™\ÉëÛ‘(2Sølj½KÖë°¢‡á¶Ûé…ã§# éow4kÙµˆ@ö4çêŒæBæ«ØÅ?&;£¹ž +w»«Êý®Gß~*;¿vHÀŽÖŽ'`“Å¿ÝogGÙÔ½“Sçdþë¾ÚÕU¬Ì$¹‡ò{«?3Ø6‰½šçÑ9y8 væP„Ht~ŒÉΊ§BŠÔ Ö]ëä®ýo·^vO§Î…N´Èý&¿ÖÕ'IⲦñª`‹F0Ÿ¹%ßÂä‰È¤>¿Å@u¼Å©yAŽ&´Ê§{|×÷ :„›ãïªîß~øôéÝ[jb}#ßш7ébÕö}U.+Z)æi4p&nc§_¤ØÃëvÀ¡¶ðdvä¤Z@§³ªê BBL«Zy®Z€}Ò3xKÝÖº¡YÂÞ‚û«¨¬ÜT•ËÞ†WØ‘º0c'<8} ´~ÛŽ^?Ùè ƒëpiø×zåFxŽähzÓÙ¹=Ûm¬:BE!ÆÕñá é+.¶B¥wÖ™Jâ¢×te °®C W”™0—€Ý:åܵ«2¦Á"1,õH2—r|Q»î#õ“%R4úºÊ׸Z³­#K yaê ëéº`ÉÕ¬bk\Bå!&Å&ó@÷H9¶Ôì{T²/Ü9@+Hl²aí9øÔe¯D)ż“îC³¶½>L>žMxÄ©òø€Žu·oW¯"‡‰Ò‡žåS :U—™ðLº +!ãÎ-b«éº/ÔªÛˆ$2•è”§GGú¥zŽ( Z–y—ý Ó 5'³©ÐU/‘b“ÊkMÿÜ£º¬ê]dþTìÔ¾ü÷Tô4ùªBY¶ÖÛصl‘Z䧠ñÍí‡o]=–ñ$Õ<›æý¾nP7ÐWá¬Â#:؇Vï¢ZÃAÚ© +à䌜ýƒP³ '§ÎSãâU[íÈb·­%ÁïîÆ,ömë ÞQÍO'êP?Åõ—(Ë›†ÁèeáNXpå­6"íË]}.2™äBÏ”Ž4f‚§‡Ã„\\‚1H´EÐËÝÃ55>Ž‘•§_ŽD çѼTñ(V™p¢b•,™2>á'ZɲT—¸8šÍ&"$¢„ÏŸÆhë½ñ\ô‡L)³Hþåq*¯‡+,!r[7Ån|ÿäc$öt±¢: µD+ÎÇÀú”GÖ9Ú— y)sá.`úV§>Z½k1&Ó÷;§-à%Oóùýè3–SñæB¤Ù‰hÉEÎøÄ­öñ‹26s”ÂHæ“ŸrÈMY–½tv¢w"Ï=bšMTÂ…K¹cs¥`hÊÁAfZ@ËA¡zt ùÃ;|V‡K%|ùD0ZEßw%Þ|ÑÙ¼4Ãäbâÿ(R™t +jL†‚ëéEDøK¤Ù¨ ½.¢bkS—¢Ògê<ðÛªhÝô~Ò{¿|rèiyîàPvtoeÚ„Œ…d„Kæ83äôˆ1-Œ0$tf±ÑÓÓyª/ke–N90‡yŽ\l¬sÍÃ}bUÑcÙû¾êÿu镇\DpyRSŒ@ì¼FCðã³ùND)Èð Ïy¦Nh7DžÃ¶ý¬ÝnˆM«’Ì(ÏBsp ð³9×’‹$Íæ÷©'å!ì=¹‡/CñÅ&òô³él…Z®DÉÝá"Éjår?Æ>>ì݉bM+ A„ŽÞ©#÷;L±ü½()ô ÃÖ½£Ç<%Å}x´µ*䮋xö¥ßÝÄ”—ý °š33Ñ_´å§':+zCÚ£XûÂÖÕë4w­5×X@õàÜÅË4 ü+3bv¾ë>£ÖÊ¸ðŽ°‰wƒ7€æšØ”:b’2ñž> endobj -1030 0 obj << +1040 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [120.1376 318.9001 176.3563 328.1154] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1029 0 obj << -/D [1027 0 R /XYZ 85.0394 794.5015 null] +1039 0 obj << +/D [1037 0 R /XYZ 85.0394 794.5015 null] >> endobj -1026 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F55 1025 0 R /F21 702 0 R /F41 925 0 R >> +1036 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F41 935 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1034 0 obj << +1044 0 obj << /Length 1676 /Filter /FlateDecode >> @@ -3231,78 +3249,79 @@ x ¹#„@Ë1!ƒìTÛ•mÕLæªÔpßÔ8ÔBZ»Ï\Ðüp—ç6ºàS[êë¥eˆHh" •êƒi¸ 8”5!lK-ñX*+k°¨’ìö~ÀšVU”?$ì!E4 hÔtmuAë" M5À1óG„à°›äéća¦ïl^FƒhÓ C('骉²6Þd|u>ýÅÜÕv?,h×gá¹'ˆë”ZÔuJýº2;šè£{»LãL06ë(nç»ïœ| gu¼ÊnÌ]¹Ü±¶Õ"µú› ºì­‹òN;s'òYu©µùÿÔ¡¢HH!=%so£t9={qõf7FD…œy}ÏÉN倗ÛI Ñ•±å扆½3NoP;²ý,â`€ ñ dàg3»î¸’DPQî¡-€ù†õˆdŠ!róŸú_E0}L3`ՀЯ ˜{ÂÈã<;½xuÂ=•á=7‡!Ü÷óÁŽóÔ1e×HÓ?²æ0Æí¤ÿoŒAŸPRð¯`ŒRÄE@Ʀç³Ãëi|4ˆíy9 ±¾›ÿÄí¤ÿˆH8$„‘ fE±ýrï[%üSEBaðšÂ,Äà'Mì}µý€ºù® íIy€r€d`>b¦¤ui4¹÷y×}iµR=×ÿ„­gÚendstream endobj -1033 0 obj << +1043 0 obj << /Type /Page -/Contents 1034 0 R -/Resources 1032 0 R +/Contents 1044 0 R +/Resources 1042 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/Parent 1009 0 R >> endobj -1035 0 obj << -/D [1033 0 R /XYZ 56.6929 794.5015 null] +1045 0 obj << +/D [1043 0 R /XYZ 56.6929 794.5015 null] >> endobj 126 0 obj << -/D [1033 0 R /XYZ 56.6929 424.8255 null] +/D [1043 0 R /XYZ 56.6929 424.8255 null] >> endobj -1036 0 obj << -/D [1033 0 R /XYZ 56.6929 397.5211 null] +1046 0 obj << +/D [1043 0 R /XYZ 56.6929 397.5211 null] >> endobj -1037 0 obj << -/D [1033 0 R /XYZ 56.6929 368.0037 null] +1047 0 obj << +/D [1043 0 R /XYZ 56.6929 368.0037 null] >> endobj -1038 0 obj << -/D [1033 0 R /XYZ 56.6929 356.0485 null] +1048 0 obj << +/D [1043 0 R /XYZ 56.6929 356.0485 null] >> endobj -1032 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F21 702 0 R >> +1042 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1042 0 obj << -/Length 2335 -/Filter /FlateDecode ->> -stream -xÚ¥XKsÛF¾ëWð¶`•9™7€ä”õ#åœZK{ØJr „´#ÿúížžÁƒ„äT¥T%6æÑÓÓϯGl8ü‰MfW¹Þ¤¹f† ³)7|ós?݈°FÅŒV ->VfwFeÌd2ÝìæLþ}wóÝ;)6’3k¥ÙÜídzlš2#­ÜÜ•¿&¯Ýq¨NÛ4<ÑÛßï~¦mš¥Y*p‡#R&r؉~,?»¶¨JÚñæÃ-ï*7œOU?rš)‡xÖ0asã9h&¶;Á9O>tC½ -[Ô&g¹•6ìPœ¥:³~‡?E)›|øåîý»ÿ]÷ø›&Ž>UñèÚº?Ðçðè†0ß4Ý—>,r½¿,Ò}uú\ÂÄÐÑâ–$ -,ª:®mÜçêj[št{Ä£ª ^/†W‚åƾ¿vmõ/X(•IJ78k¹IÞ·4tÚŠ,©úc×ö 7üu£f'5 i™i‡ ï kujÁ¬ViX¶÷‡t‡È×ÿDÍ MWܦ:y…j"ÌüR7 QÅcU|Z -ÛWQzo¤ê!ܵWwá¾ @TÒNؤ×](‹ÎïB­…VÇßqª8ŸHií@øpmù*lÜÓ/X8Ž´õP»!ðq—' '×ö{ÒM™ƒW Š„wzO“CGÐWÝî»ÓÁ ^p÷Ýy yÅŒî,uú-3*8œK–½"–^ÕHx QV}qª“ÞKÊ5'‚H"žÞ>“jt¢nÆ¿nqùÍÛ»)e¥‚A(‘ &ŒÍ1%ÑäéaCÄÇY×ïæ(‡-ùŠ/Êr[“0–IH5b.DÓäü„’éË‚Ä\ªmÎ$å¡àlà:ÚçM±Éh Ck,—Ó:*uÅFpL¦µÊwMßíž5x“ÍUt“kã@ƃ£&¢ð/g\¿›o¸ÖÉ5ß…qðªÁ8é•HV‹…@W¦ k¾%Ä'ÁçØ,¹[u¨tPõßH¡©æ6,;R -º¢kèf>/ ûcUÔ¿q.¡Bú̦ ô¥ -Ù"³Õ!?}|÷š¨¯–]ªeô2ÒàV¸òŸ7¿þÎ7%èççÎTž™ÍøàX¡åæp£…dyntinnoþ3r„–)fHXçEû8ð -dܱdµ‹Òí”æp3µ°ÈxÙý&Çü’A̘’šböÃLÇÆj4gÿ²ÝY‘ÜÁ™¼½Ô ðÔDS¡ ÷Qºùs#×y®hÑŒöwtà¾{›7Üh3»Td¼›sö—,3Oš)ã©2È5†l„Ng¾–ä9VË­„‚´•‹Î|Ý -Èmø*\K+1 iè¾Z°Ë2 aI™ã´rB¼}UPIëUéiÜã’'Ú[Vû­‚bwn†°²¯Ú2 6{ÁȆ"ÆVód -Ž…6 0i“‹`¸CÕ÷. !øó|¥„ -?HZ_;µÔL-¸ªè·é\é/l„Hn1¶öOuû°"¯äY¹¼(cžOP"ha×µ 2|úaå¹b:S&0ðø†"X¥ŸŒZFpá΢¥)›Ho#ø…sžˆBý®ˆ+Ip+ò1Dތå\E”7*¹þ‘N¾ÕQzU‡ß™>/ëuWT à<”ÿYvÀü:ú9TÃcç}'{o$œ+KðYD% *W ûù¸®¬šjGiaAز Çøº1;.šè€Ú=}ÿD"€‡Š¤-‰'|ƒ'¬ô$úúÒåú@ KT·¿hõb|cYÜ—Õq‹FÜCS柱‚ÖWKfKt?¯¢«_ÔK)”]E壥À’s°” -ǪÖÝ7È?PQ~²-š3é ‡Ý<Á4ö(„A_¹;?ç@V±Ô¤0€×7ËDãš8íŽ]Sk°ÎZèÚÓ늆òJ‹ÊQQ^Ÿb!˜ÌØ\x°yÍ\bȨ˜Áû%¡ì§e‘ùÒeÐný5uX¥Gçy~¼}ÿÓ+šÿ[iå»0¤ˆ¼Làk™ws{h‘¼ÅrJHP·‚ö{tãµ`ƇŸ -ÐçÍÓôCÕV'wʼnü.·S:jùµ4¥ná%…Qð¹-ø7B0­g¥Ï ²[»¸Ù©þÞ?æIýÞõÑ/ã”cqÅ´¶¯Z|H¤g°‹Z]½úë>Y·¯tpVx|‰œZ¬êÐIK_"åø9–±?ºó©ekPó >À@p‚?úÇ03{ ”ÕÊŠ†)¢-•Z;¾2™Ñ0XNÀdª\~Óh~ØÐᵩ¤IªŒ6>ˆÙé…ÏîbÃ]°jË®Kf‰ÃYC[5îÜñ„J -%8 ܇ ’F¨É:@y¬Ú‹i<üä|±ô=êw¸O^«@"vÂk`?s!'ʧƒù“ÂM˜¨/b’’/ÂpzÞñXEÃáé&Oª¶ßlôòU:ÛÔÆšÊþh× -¾àæZÅZÖÍÀ -@ׂ!z6šMAb™^‹'ÙâkR>3,OΈÀZøŠlIO°›ó:Ù…Á;°Þ©.¡b_½µ8YÄ{Äl^Þ×­;=½ûÇîÜ”ã+í²¬Ue=ÄìqpíÙË=ÆùÚ£‰2L#¤Y{Kš:‰iÑÊ[‡â™nd… -ù³/‹+'þ¹ö|endstream +1052 0 obj << +/Length 2367 +/Filter /FlateDecode +>> +stream +xÚ¥ËrãFîî¯Ðm©ªQ§Ÿl29eç‘š&µcïa+É&)›ŠTDj&ž¯_ ÑÝ$%Ú“ª”«,°o@l8ü‰MfW¹ÞØ\3Ã…Ù”‡¾y€½Ÿn„?£bF++»;£2f2i7»9’ßÝ|÷NŠä,M¥ÙÜí#­ÔZfd*7wÕ¯ÉëÇâ8Ö§íNžèíïw?Ó5Ílf^ã@Â2‘ÃM¼ðcõ¹èʺ¢o>Üð®.Æó©"¡™ÒHÄaH inÍÄv'8çɇ~löOþŠÚä,Oeêo(άÎRwÃQQ*M>ür÷þÝÿnüµIAŸ‡º|,ºf8ÐçøXŒ~¿mû/ƒ?T î±õés}òcO‡;âÈ£¨›p¶->×W×lÒïiI?Ô¸ +|>E–CòþÚwõ¿à T&©Š±`p–›ä}GK§­È’z8öÝPÓ +bÃß"Jv“)SÂf@q{é\‹S –jeý±½#Ò^÷$ƒ0=qkuò +2”„ß!9 ø¥i[‚ÊǺü´dv¨÷N 5£5J¯éý{A€(¤H-p ¦»ÑëB©„ZÇ߸UžO$´n¤… ?|]õÊ_ÜÓ/h8¬tÍØ£ÇS\ROE7ìI,ª2«ä ïz´n“COÐWÓíûÓ¡¸PÜ÷ç‘@4ä5x³Ôö[jT@œKé½"”NÔ8‰ PÕCyjŽÎJý‰5#O"PïžóItH¨Ÿáo:<~óön +YV0p2Á„Is I´yzØðqÃâùÝüÅ°…!_áE^nërb&eB „˜ –b˜œSx!˜¾ÌHˆ¥:Í™ä <äŒ LGoœ *¶"‰ÚÀ5ÔÆâ79­ƒPWtd2­µ~ÑýîYE5¥¹ +fr­ˆ p”D`þeåÄó»ù…k™\ã](Ÿê•c¯XÊ0[,ºR?ó-&.0! .ÆfÉݪùC¦ƒ„¨ÿFµš§þØ‘BèØ—}K/sq T8ë²ùs ÒE6©Ï +Hd‹ÈÖøøôñÝk ¿¦ìR,ÑÊ€IƒWáÉÞüú;ßT ŸŸo8Syf6_àƒc†–›Ã’å¹Ña¥½¹½ùOÄ!,S,õEÂ:.ºÇ—Ã%ª]àn§4‡—©…Fâc÷›ãK> kJjòÙ3›T»JCpfà€—ñ/Û]*’;ø/“·—’œZk*ÅÒ„;/Ýü¹Œëjü '»œ¸zMÍd‹§š‘~Û¾¨œd +!’[tÐýSÓ=¬IŠCÝËåE.tx¼&@»¾káÓ+¯ÈÓ™2+’( ( 5¸å" ”Åy¨×øÀ2#·ßR˜f™ÍBõçÌÂytíA¨ä&­Šï%d,ç*PˆZ@äÑ2’èÓ}5þw¦„ËJ!¹(àoDþY\ÂhrÈÜ;÷GÍe¨ ‘8´X³N'œ“ð*)­ow¤owÞ<&›’þÖžßî}â¥4—ì2üôs¨ÇÇëË“½SîU::+±T¤Û¢Dãwûá\U·õWé`IUmåɸŒ5#Ô°ï|ÿD,€Y‹¤«'|ƒ%¬tC¾èvI³hé«g‚úýE“‚&tÁ]BWŠ1Vüá0´ƒŽü „Ρ^"[öóüí»„‹L-…JWû¨)°†äì5¥|m€kuWÜ·ˆ?PPn³+Û3É —‹µò*¦±; +åt´»ós”*f ¥ +hq­æg™ˆ‘ƒ0íŽ}Û”keš2#m((ËÖ-Ç- +GùZöšJ +Îdb[ãÊÜkä]F…°?ŒÈ …L QЙ/Mæè_sõLA§¡‚Ïcì?ÕO»Ðô±Ù•§º‚Ûhi×|®pxî!t.å–C"M³9îª?M·&5ˆgBd ©¹ú@MÁï3b“LCýºh´†µ† +!ä\rê‚5ÙÚDÆÞQ}B’ +±ÌÐ.‰`—\?ô³æûîàhT¼pªËÇà6ÅHeÃ¥>x]³jßûy«ëoÚ£aÆNèª –¥FÿM‡Œ bÎf^>6eiéã.û –QT±Øƒ—ç0pù0äB›üÆ ÿ:¥Æóà/»YÀíÛ×°/hkßûA~P´SŠsûý»ˆäãÇÛ÷?½¢ýp•P¼óKŠÀ˾y÷¸·‡æÌi,§€yËK Å"> vŠóØã`£y>Ñ>m?Ô]}*®0‘Ýåé” @|-AÅÒtž†o†aln öu›Ö³ÔçÙ­½ ÌìÔ|õ“—yP¿/†`—aËMwŠr:;4Ž0iw‘K‚©×Á&oÖñY{c%†ã tj‚0«C/e˜Ê8iìþ|êBÄÔ>S`ó!8•?º1œ™Í ¥Áq^UÓ2ytJ©6ó-‹ÕT˜L™Ë]Šê‡ Ãèç\mRfLÃ(.f›pxö–Ô¿³¶´ð\RKXöÈüÚتrç†'TR+Þè`áÞo7Díüå±î.¶‘øÉ(ø @ÅRÒw”Þ(>9©ˆµ>Cæ™×,buN s“<ÁÖo4>IÁË÷íë(´¼ã±e,û¡Q–8ÖݧEz9O„žÚ¦!§²?ºµ„‡³ã<6…ÎL"Ìô,X¢Õl Ë4§žx s¬|¦Xžœ±l¡Öº¨¯H—4ü…²9·ü¢7êA{§¦‚Œ}Yî­ùÉÂßCÍæËËû¦+NO/”ŠÃcn«8^¦µºjÆ=Ewv|G?_×(Ã4–4kS¬©“˜­L±8$ˆt +DäÏÎ4W(þpu˜endstream endobj -1041 0 obj << +1051 0 obj << /Type /Page -/Contents 1042 0 R -/Resources 1040 0 R +/Contents 1052 0 R +/Resources 1050 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R -/Annots [ 1046 0 R 1047 0 R ] +/Parent 1066 0 R +/Annots [ 1056 0 R 1057 0 R ] >> endobj -1039 0 obj << +1049 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1057 0 R +/PTEX.InfoDict 1067 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 27.00000000 27.00000000] /Resources << /ProcSet [ /PDF ] /ExtGState << -/R4 1058 0 R +/R4 1068 0 R >>>> -/Length 1059 0 R +/Length 1069 0 R /Filter /FlateDecode >> stream @@ -3315,12 +3334,12 @@ q n*Œ1½÷¨¾x¥Æˆpîâ‹&XîÃœ§³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãêʱ„£~Ï“a³tŒºìZDß!#Z¶ÚÂk! e'jÝ=§ _tsÙ¬ûÍ&­Nå@‚i¬ˆ3t%kÐE„\H–YZxÿ/U¥Ç™åë—Φ@±¯iW H þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ&F°ÑTÆG%V½ Î'ÌØR5¬BÔ‹`qUžv-UÍ=ëÆåQv2ë_ ”¿­qq‚~èr¯Ú5ÌJ¼ð˜°h»P¡õ‹kÜàéÚýªå>Ò¸D °o»Îi¸CrT]¿MJ¥ ÆÖ¹’°;¿ö‹ûóZ¼¬ å[Ç-œÁ¤ŸBx¿ýpü|üÈÂendstream endobj -1057 0 obj +1067 0 obj << /Producer (AFPL Ghostscript 6.50) >> endobj -1058 0 obj +1068 0 obj << /Type /ExtGState /Name /R4 @@ -3330,56 +3349,56 @@ endobj /SA true >> endobj -1059 0 obj +1069 0 obj 1049 endobj -1046 0 obj << +1056 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [470.3398 477.3512 539.579 489.4108] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1047 0 obj << +1057 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [316.7164 465.396 385.3363 477.4557] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1043 0 obj << -/D [1041 0 R /XYZ 85.0394 794.5015 null] +1053 0 obj << +/D [1051 0 R /XYZ 85.0394 794.5015 null] >> endobj 130 0 obj << -/D [1041 0 R /XYZ 85.0394 769.5949 null] +/D [1051 0 R /XYZ 85.0394 769.5949 null] >> endobj -1044 0 obj << -/D [1041 0 R /XYZ 85.0394 580.0302 null] +1054 0 obj << +/D [1051 0 R /XYZ 85.0394 580.0302 null] >> endobj 134 0 obj << -/D [1041 0 R /XYZ 85.0394 580.0302 null] +/D [1051 0 R /XYZ 85.0394 580.0302 null] >> endobj -1045 0 obj << -/D [1041 0 R /XYZ 85.0394 539.9341 null] +1055 0 obj << +/D [1051 0 R /XYZ 85.0394 539.9341 null] >> endobj 138 0 obj << -/D [1041 0 R /XYZ 85.0394 315.9171 null] +/D [1051 0 R /XYZ 85.0394 315.9171 null] >> endobj -1054 0 obj << -/D [1041 0 R /XYZ 85.0394 282.0038 null] +1064 0 obj << +/D [1051 0 R /XYZ 85.0394 282.0038 null] >> endobj 142 0 obj << -/D [1041 0 R /XYZ 85.0394 146.7217 null] +/D [1051 0 R /XYZ 85.0394 146.7217 null] >> endobj -1055 0 obj << -/D [1041 0 R /XYZ 85.0394 117.3479 null] +1065 0 obj << +/D [1051 0 R /XYZ 85.0394 117.3479 null] >> endobj -1040 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +1050 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1064 0 obj << +1074 0 obj << /Length 3348 /Filter /FlateDecode >> @@ -3401,54 +3420,54 @@ A ©mø¯(¡Ÿ¡AAÉM@rgJ'Ï¢«PÅ*s5M¦ õ@¬ðù T$±/ãx¬ÖÊ`¡ð+|*س«ñsröçÇI_I!Oç…DòV»·¹à ;“_q‘©¨´ž9k¢Vó2‹T…Kd'çiÏ(L5Ú&uU¿¥ÖÜdpÄ©)AìÇy‰M‘#¾ÿÈ5H% b“ Ü6è;q* ó§ñº«¾¸Ë8‹W‰=öÃO¿PÚ¾þ-ÿ.ˆî˜ÕšÃ0«QΩ\þzÄwþ맋@Ç‚ÎWlb?@~Hš²ôO"BúøŸ •¶`´—ÿûHNÿf+_¤i´\²‹TêÇ)ÂD!ߢà‚r÷Ÿ&—¤ÿbÈendstream endobj -1063 0 obj << +1073 0 obj << /Type /Page -/Contents 1064 0 R -/Resources 1062 0 R +/Contents 1074 0 R +/Resources 1072 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R -/Annots [ 1067 0 R 1068 0 R ] +/Parent 1066 0 R +/Annots [ 1077 0 R 1078 0 R ] >> endobj -1067 0 obj << +1077 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [464.1993 488.466 511.2325 500.5257] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1068 0 obj << +1078 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 477.5271 105.4 488.5705] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1065 0 obj << -/D [1063 0 R /XYZ 56.6929 794.5015 null] +1075 0 obj << +/D [1073 0 R /XYZ 56.6929 794.5015 null] >> endobj 146 0 obj << -/D [1063 0 R /XYZ 56.6929 556.0057 null] +/D [1073 0 R /XYZ 56.6929 556.0057 null] >> endobj -1066 0 obj << -/D [1063 0 R /XYZ 56.6929 521.4772 null] +1076 0 obj << +/D [1073 0 R /XYZ 56.6929 521.4772 null] >> endobj 150 0 obj << -/D [1063 0 R /XYZ 56.6929 361.9951 null] +/D [1073 0 R /XYZ 56.6929 361.9951 null] >> endobj -1069 0 obj << -/D [1063 0 R /XYZ 56.6929 325.2573 null] +1079 0 obj << +/D [1073 0 R /XYZ 56.6929 325.2573 null] >> endobj 154 0 obj << -/D [1063 0 R /XYZ 56.6929 133.2872 null] +/D [1073 0 R /XYZ 56.6929 133.2872 null] >> endobj -1070 0 obj << -/D [1063 0 R /XYZ 56.6929 104.8892 null] +1080 0 obj << +/D [1073 0 R /XYZ 56.6929 104.8892 null] >> endobj -1062 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F55 1025 0 R /F41 925 0 R /F48 940 0 R /F39 885 0 R >> +1072 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1074 0 obj << +1084 0 obj << /Length 3001 /Filter /FlateDecode >> @@ -3468,29 +3487,29 @@ I! “7 `©gŒN¡wbAÎÇü&ePÁ†¬¶ÿL„N|&‚šÒŒ†¸;ô3½ú ¥G=û/mýù©ÏlJ~59ÿÑ0†r_Å (ˆÊZá¢jA¤ãC1×Ξ?µƒ:>v”¹ÃX'Ãc¿…Ì‘.Mi# 'øËQ|¢$Q†™„«Ëe¾J­yBÙ¥ŸY“¼Ñ Ì?%Až2®­½ ÁêŒÔe ž;5’àøØi ÆÇþ/%x¡'(ÒÄ>£‚~J›PfÃ6ãIAJkYzIŽÐi1 ‹R¨ËŒ:wjÄ©ñ±Ó¬Š½éJ£Â1|öë?ãåg†Ç™Æ&÷Q>´ì2ž$£²®ÏOòÿTÆö¤ "•†*Î\ø%J uFF게ÎÉh|ì´Œâcÿÿ‚ ä•Pn»ÎK0‚:#ÁuY‚çN$8>vZ‚ñ±—­ $ZWÅ“¤h$ƒÜ.}’“gÇ“ÿRŠkáÄŒgÙtÒ ©Ù—jêä¤:êäÀ¤+3°–ñß[qú4´SlýµÎ`xðKÿpÂp´.šÕ¾\Ò3à¨eý€¿‚Rdþ¦n‹€*oÃ(žþÇ81E“¥eG£|$þbT† ¾ÇNo2æP`Žê,Z|¬ï÷ýOƒ¢Š£m¿¦(Æ*­AV+;øyXRð¤Íýû ~Œ”»ƒ_Ä/+÷1^dÄ[¬†Â­GÔ$œ ‰9²¯t‰‚1®è±²ØŒMÆõužFµûñ'š‚Zâï)HèùjK; šþË·S€MüÏ?“ú ¿˜á¢e"^ü÷A§B3p€>Õ!zßRX”»fñ¾^lŠ}q¦¢{‡àŽ¸Ÿ9è_1v:¿7 ½8!2øóÖð»$Ùût E«µrZøŠ'ÌÊ, D!éòHݺ_S“þCHá endstream endobj -1073 0 obj << +1083 0 obj << /Type /Page -/Contents 1074 0 R -/Resources 1072 0 R +/Contents 1084 0 R +/Resources 1082 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R -/Annots [ 1076 0 R ] +/Parent 1066 0 R +/Annots [ 1086 0 R ] >> endobj -1076 0 obj << +1086 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [417.8476 181.7231 466.5943 193.7827] /Subtype /Link /A << /S /GoTo /D (sample_configuration) >> >> endobj -1075 0 obj << -/D [1073 0 R /XYZ 85.0394 794.5015 null] +1085 0 obj << +/D [1083 0 R /XYZ 85.0394 794.5015 null] >> endobj -1072 0 obj << -/Font << /F37 791 0 R /F39 885 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R >> +1082 0 obj << +/Font << /F37 799 0 R /F39 895 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1079 0 obj << +1089 0 obj << /Length 853 /Filter /FlateDecode >> @@ -3498,21 +3517,21 @@ stream xÚÕWMsÚ0½ûWxr‚ƒ…¾üÕœhBÚf:™4¸½$9¸F$Ì›X& íô¿W²°‘ƒ€PÒÎt˜Y^½]½}+VȆâƒl×^ˆCÛ)p!rídjAûN¼û`¡¥S9ºÕûÈêßAèaÏŽÆV` ;]w(  +`gxùùSÔu° ;§îƒê“ýËhp¥ækÓþé·.B¨Ó¿8œjKäàlÐïú´}½ »·Ñ¹5ˆšHõÝ Hd˜Öõ-´GbSç$ \ûI<@€ÂÛS‹º¸”z&µ†Ö—P{[-5²ƒ ÀÄÃz(Òè ð €òÝx“Š€Ü„@r¡ëâjzœOq1ê:„)ì¹ÊHòéÑJjoÈÔTH¦ÎP…%}Ôn[þËŬµÆ,óI |4í­tlÚ¶¡4…zFGy-ÃbZׄpQÄåäQŽ}*j8ÛAiÊÓyÙdV*r…Y¶ê°‘§cÆ<@¦Eo¬9ƒîª°Œ9z•Fð¾áiüÈö“Hµd—Bxo=#=Jpmy äñM6P‹w¨kãð_f³Ié›—rãaÏ:>€é½ÿ£ÖŒÄ"#±Ô\.¯!R›xŨÿoä䟥¤w&z®U;&\ÑÕQÑÂJ›AÓÉ&SžâËÆGMÜ缬Žïv3ªº'5NòìB|÷N9kõ~/œÅIjda-°‡érƒ¢³“@ú¤Yl |s¤´àN ùLšó'ÀŽäÏ[Bì½eK¸]—q¶Ð]»PïØ8ž§Ûš?Óe„¸@Þ WØðxðEeuG£> A€›;HKôØ È2(ÉÆk‘×7šõЫendstream endobj -1078 0 obj << +1088 0 obj << /Type /Page -/Contents 1079 0 R -/Resources 1077 0 R +/Contents 1089 0 R +/Resources 1087 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R +/Parent 1066 0 R >> endobj -1080 0 obj << -/D [1078 0 R /XYZ 56.6929 794.5015 null] +1090 0 obj << +/D [1088 0 R /XYZ 56.6929 794.5015 null] >> endobj -1077 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +1087 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1083 0 obj << +1093 0 obj << /Length 1946 /Filter /FlateDecode >> @@ -3527,159 +3546,153 @@ eS ^Ebêf›C“Áš‡Gô¯ÝàÀ7Õ?ú¦ú¦rSª+a~žÄä'¥|«ŽcexÆ ¥j3Œ–nˆîʾí88Í“¡¡=# ½}[}y´b&fqšŒ Æ¢ècç(»î»º„&œ:þ$þý€!BìøYãf2JE8<æ8‹án‰g8iZ¤Š°8pä”!í·§Î £g²z÷óõkç盀Nd3$ÒÒ:Œ‘ÌSoëÛÉÂhõ×ƽنÊC6ˆa Äj70ê*xc§mš_âç^Ýæ M>1:C‰õ¾î¹³S©:nJý5/ûò̃6ðEµ·n憥 R±Ày‡ßˆ*Q$ÔLC-ÈKúüE¦»a´NE\–Ã,Ô ç2,’ðq=c³>å—š–‹c9Èq@ãèôãiP§™¬j¡â8ðâ…>®Më¡Ô©SfC·üé¥b0ú»¿ÝoøÁ(÷žû%Î þ|6ó»™{®×ÿ÷¯t—Ÿ%ýút¬Î?ÀMòËsCjÎ,ÚCyO%?ÿœ÷­èÿ¢ „êendstream endobj -1082 0 obj << +1092 0 obj << /Type /Page -/Contents 1083 0 R -/Resources 1081 0 R +/Contents 1093 0 R +/Resources 1091 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R +/Parent 1066 0 R >> endobj -1084 0 obj << -/D [1082 0 R /XYZ 85.0394 794.5015 null] +1094 0 obj << +/D [1092 0 R /XYZ 85.0394 794.5015 null] >> endobj 158 0 obj << -/D [1082 0 R /XYZ 85.0394 427.2881 null] +/D [1092 0 R /XYZ 85.0394 427.2881 null] >> endobj -1085 0 obj << -/D [1082 0 R /XYZ 85.0394 390.6298 null] +1095 0 obj << +/D [1092 0 R /XYZ 85.0394 390.6298 null] >> endobj 162 0 obj << -/D [1082 0 R /XYZ 85.0394 229.0656 null] +/D [1092 0 R /XYZ 85.0394 229.0656 null] >> endobj -1086 0 obj << -/D [1082 0 R /XYZ 85.0394 200.0179 null] +1096 0 obj << +/D [1092 0 R /XYZ 85.0394 200.0179 null] >> endobj 166 0 obj << -/D [1082 0 R /XYZ 85.0394 151.3455 null] +/D [1092 0 R /XYZ 85.0394 151.3455 null] >> endobj -1087 0 obj << -/D [1082 0 R /XYZ 85.0394 127.291 null] +1097 0 obj << +/D [1092 0 R /XYZ 85.0394 127.291 null] >> endobj -1081 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R /F48 940 0 R >> +1091 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1090 0 obj << -/Length 2296 +1100 0 obj << +/Length 2314 /Filter /FlateDecode >> stream -xÚ¥YK“Û6¾Ï¯PåbªlÁx|Ä•Ãx¿Kÿõ¼iÙç/4㟗×?üàQ›טYùûf>cWÉ O„µØ7ìÉBABH‹¦~l/gßó#fÇ¡ÅRIbÈÛÑD„p4v‡#|¸'ÉLåÝCuûb<.äÑ0ýì”{·öüà3•º‰ÁEø –‚;`»lF¯O\_(ãÉI™¡‰ì=K€7EÝé“Ý>0ŒHiNÆÎáëºøSƒ¤0`#Hf!§Uæ®,Ŭj%Õ6 æ`s31³Kµm¶¶3ŠuVŠuž EWRª›ý _œë¥!ÖKª[«¶Mþ„zƒ¬3¨¨0ê¯éêkLHÂD„¡ýb¯öey8n£œŸ/õ‘—Áùíu{ºŠQSµçD×û´Ú?µL -C9¹‡h?ƒÆÃxÿ¥Í£òE¶‡ M”˜-¶²£ÓÁ­G Îóî!Ïkìt 6^˜Ùú EoCð kŸÄE•jWû¶Ãõçf´kJ³ÃÃÆ.F¤®±¢à×–UPLÍ6^<›Í»Åéã`²Hü¯8l+„¯ÒaDÄ,½Té0"ãÄr™¯8-Ħb&ˆ%Ûã8Žï×XübeMǨºYá­0DÈH$e:„fëUØé_©0˜MžÖ2©O^ýí/ø“‹†÷Çkkœš-y Qš47C[cÕObUÚë/2—Zh¡7`ºòý®5ãÚpð5Á*ÒÈËÀy -mÀ·lr3£n:ä‚€ë2ý Ô¬6Ûký€ ®Í0˜;gñ²{‚gQS£åäPzïÄS_t¥$‰¸\À‹Û‚ìºÔJ#È(8‰bÅ橆3좰_öyk,¥³y0£—ÚJáÑMƒ=Š²ÄÖÜ ;hÓ£ú[R»ÍG ž 'T~†â‰Ü=_>íªcÄÔÏ• @g"ý2¬pG¤¦Vó}N£øà…NÁn ”ƒûø4ÕïýzÆ\µÝ“„êtPCaÚa1áx_–ýtCBQû.x1ÔªQxñœ ÏÜí»VÎ[ïÍk &ºC[·%ÕÚ{6f°±ü¶“ÛîÛ‹Gõ°…D?@DR¦ìò12·ö¥¶÷º6^á‚H)£a\3ǞĦ$ߤ69÷£ Ü3Ô/-žŸX¨„ÿûã/XaLD’pÿo5꧊P½Š¡”àø2>ÜþòóXôÿL?øñendstream +xÚ¥ÛrÛ6öÝ_¡éK¨‰…àB`3}p'uw“ÍÖê¾4} $JbÊ‹"RvÝNÿ}pˆ´¡ØÙgB\Îý± …?6‘ I2žMÒ,&’29YÖgt²½wgÌÂÌÐlõj~öâ­H'ÉžLæë.E¨Rl2_ýÁ2 4š__½›Î8ã^ÿxñq~ù3L%¸xóŸ)c,ºøðúò n½ùpƒ·—Ó4Žæ¿ü|y=ýmþÓÙåÜÓ7äQ¡‰ûröëot²V~:£DdJNnaB Ë2>©Ïb)ˆŒ…p+ÕÙõÙ¿=ÂÁ®9” £„‹„„ÂEH(2#‰€--”ù¶¶@¿w8(;ýeQÙà¼wŸ(åU¡Y~ñ6fÄ™ œÅšñÛ¶ëÙLÿÏÉs&ÓçTÿ#»}y“÷öüˆ0¦$T: ƒX°èCÛoËfƒw¯Êý”©¨Xö•%óÐ#БŒžOg‚Òhqè À¥“O‘ dÀ/$ÓÖ@•AºÌ, +KÍý>_öŽžµ‘A[ã õ"½^Ì8o,,ˆÇŽòÎ~-SÛEé˜,–8ï¿04ciJ˜àqL‘˜‚ùxÆf HùŸù‹Kùúó»ì_ÏÛŽ}þBsþyuñöéÇÜÑ?ó ¹JN¸Nbßp'‹‰Á5õCyyùž–±7Ž%–I’‚ßNf"‡£©>ŒðéŒ/DïóæWˆî]Ñû¼/Û&,3.µ·D&Ò1I"„ûÆ!ôzYïŒÃÀZŽŸ=˜ˆ1!sìË,Þ"m׸º(û|ˆÇCw€uÎ: Ñn&£÷àç¸~qýúêÊ"6*íìÅHNnòª\w¤§ÜP¨ñùOTÒ¼ë5Z l÷NUÑlú-.–Ý€OÕ‡ª/wÕˆ7Yüè&z½Añ(K˜Y\‚tµÛí; =d@ +PĬ„ºvD’ª&ÀåHQ!;¬e¢`¶AÛ(VÄ#xÐEÕµšŒ”¦“4ú½ioz¯‚1Þs |÷SìZ¿Å°rØlæÌ'"É”õ ºF“˜*øhœzm÷ˆÝ†XV¹]Ûá…›}^[Zü:v-±Þ"`â,9x–‚1–í*ïó£GúãDrŸ²^¤]Ñ9âëvwçƒ÷økСóökИӖ¡¾¯ZctR;ò’d¢Ç]×اJÐN•]ÜµÆ a o†ÅnÙî +\3& _(<n^àØÐÁ[¤>> endobj -1091 0 obj << -/D [1089 0 R /XYZ 56.6929 794.5015 null] +1101 0 obj << +/D [1099 0 R /XYZ 56.6929 794.5015 null] >> endobj 170 0 obj << -/D [1089 0 R /XYZ 56.6929 691.7741 null] +/D [1099 0 R /XYZ 56.6929 691.7741 null] >> endobj -1092 0 obj << -/D [1089 0 R /XYZ 56.6929 668.7722 null] +1102 0 obj << +/D [1099 0 R /XYZ 56.6929 668.7722 null] >> endobj 174 0 obj << -/D [1089 0 R /XYZ 56.6929 579.8329 null] +/D [1099 0 R /XYZ 56.6929 579.8329 null] >> endobj -1093 0 obj << -/D [1089 0 R /XYZ 56.6929 549.1878 null] +1103 0 obj << +/D [1099 0 R /XYZ 56.6929 549.1878 null] >> endobj 178 0 obj << -/D [1089 0 R /XYZ 56.6929 502.9124 null] +/D [1099 0 R /XYZ 56.6929 502.9124 null] >> endobj -1094 0 obj << -/D [1089 0 R /XYZ 56.6929 474.9173 null] +1104 0 obj << +/D [1099 0 R /XYZ 56.6929 474.9173 null] >> endobj 182 0 obj << -/D [1089 0 R /XYZ 56.6929 277.7919 null] +/D [1099 0 R /XYZ 56.6929 277.7919 null] >> endobj -1095 0 obj << -/D [1089 0 R /XYZ 56.6929 249.7968 null] +1105 0 obj << +/D [1099 0 R /XYZ 56.6929 249.7968 null] >> endobj -1088 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F39 885 0 R >> +1098 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1098 0 obj << -/Length 3185 -/Filter /FlateDecode ->> -stream -xÚ¥Ùrã6òÝ_¡·•«" ;O'™“¬GÙ­T&´[ÌH¤"Röx·öß·/ð2=NÕ–«L 4¾!½P𧩠”É¢E’EUÚ.6û3µ¸ƒ±oδÌYùI«á¬×볯ߚd‘YÆ‹õíW¨4Õ‹uñÛòòÛ‹Ÿ×W×ç«Ðªeœ¯l¬–oþy®µ^^¼¿¼zÃCoÞàÆÛ«‹ó$Z®¹¾BˆÊ`^IJrýýկ翯¿;»Zwô Ï •Aâþ<ûíwµ(à(ß©Àd©]<@G:ËÂÅþ,²&°‘1²;ûpöá`”–ÎñÄš4°i˜Ì0%Ô ­ƒÌÚpÄ›± qVö|¥•‚#}x÷ ý{÷È×yã -n^l6®i¸}YWí±Þáùa3`½Z¬Â(È"ú×ïÞ#[S½Ìw»ú—§áòÝÏ+Šã¹N—€×5ª -nóêÎÉü¶fØãosp›ò£R!ÑÊŠ..àFáp¸*Û²® bfzõ€^é@Ù$‘^¢rÅóàý¼0 ’Dg2ívS$i$ãžÜñqK˜$ô›ý1ƒn#‘áXÐܺã ¸òPgÑð¬"«€b›-VÀÔÓ¡È[7‡$6‰áÝÌÅ&A¬;ÒŠ’ïmÓ–÷®0Ö,×ÛYÛå6§Fæ*n¹Ï­« -º/˜@ -Pb7ƒDøøÉ=6~¸© 9háÖ ì¦¾w¼äI)ÀêÓ®ð;òX᪺uÅ,gtd:ñŒaëðÉKü¶nZ½Âÿa0/ß: 2—ˆË.*^å>çûÃÎq§¾åo.ƒ,TÂz‚ŒøÇ hÞ¸¿óΑžhV¤i’ $Õ#A}ÿÃ: 6F'!È«ÿ¾zFeˆå=ÝÒ.«|_n¸Ã»ÊÝ%|›o,êj'ü,…íVÊ' iZ9y.˜šò®òndyΟîz€ -?åcFs¡FwÊñÂ}Z4™ <QÒ,’T1Žâñ}ÿzž…ËúÄìóG‚ª3ƒ™ ¥ ³§v†}Ís¸w¨Üñö´›9Oˆb¡Y¿:Ô»ró8sž ˆñzÚ´0yï$M. ÀtÓðݗͦ®0"¹;sT$ܨžpë ·Âaá©T72ê>@óË–Ì+ô{¼´w!Èj«*Š—¹Ç¡éí%c`ÐÄw‘—x‚þšƒ-™Ë„ТüéÄÕøaiÁ¡´à€?3¶…å#‹ÁêÄÒ -!Ûè+h^ÅßSõ©ª*^…ž#|ฉRf3Âå® -J–Bè<"Ùf†ce»…YF JhÈñŒD;ïÄš»›ºp<­q­ ¨ùûúâ ¦HoÀâ |s^á·Ð#B·ã ´'4ŠWë¡Ó N"òöÔí¡b8(*ªQɲ¨ 3ÀH¡tŸïJtMÈçPüÂ'|†%Âg»HÇg‚ -a´¡ ‘chÀY•Œ8 ƒÂY•ggÔ™øYä3` ¸C,ŽbbRäQl YõŠ‰í ‹ûÕ=‹¡#'‰,Âʽ A@Д…ïÜò—Ï‹Ó1ò¢CÂ"Ê„­qöÔL…3Õ1Y+Ïd­˜Éº®x”Óþžt'Y*²àCCWX¬½ðj6ø¦®ßýxõ÷ȲŽvÃC dåD|ó„ΉyàkñANÀAÕ’@("„ífOx€vžÐð¸(Dmˆ³È|¸PI$)Ï)Kòê‘dÃiG×ã…t-x¢úíåâÿÖ ¨!f͈!ú½ ¹–Y+Žc5»Ihùþ§5ÚÛ‹_ÖßJ Øد¡>EU[n@ Ä6u"ÉâPÂÁKæ#ßø¢Æ$Åè& â$ãšÁ`–™$·6ò)2»Æˆöl¶yU6{†ÞÖG†½5ø —ïÆî\åÐKR¼„SÄ¡oó3À˜„>>h8Ý„Áö¡f(þ” *QÙ0DÄ+¦‹£(ö÷' $æ{¸¢†ò˜“¡lÌdðQ ”öéÇ3¼2*Ъ+ˆ4Fò¯·ÜÙbnl”2€p â.|…WÄ$èÈ ò†´ý\SÌ\K!æd‚óUL ^""©Üðx‹UŠÕ,•;¼>À<â -©}èM¶Z¾ÄØKʵúÖív{ÒFœâ>£LÜ9ObF‰Þx²úK¸OËNˆ;µ¬Êïeïœó$๔/G{¢¥¤]ù®ÝÖ§;¤Î  .± wæ–ÐåÀ—•ÒÌÑÃD·áh¿1 ƒÃ2Šñ Å?øù7\ k49»õÖÍe¿~EY—>¯ªVi_‡$)¼“„@©â:%°ÖŽÂ'.Úš>¢„øÜ»á6ãľ‹RËÙª;£‘<*Ì&‘õ3šBÊž@²÷âÙ#•Ø‘™’ô$›™tbd2¯©Ðbç‚O?.GßÌ31(‰EŠç9&EòÉØZSlòô|X–(Ž^<^¬Sÿ›¾ÕÔ¾º$Eœ®²ë=KávÎW¨FŒ 7äáË>Ì ôTòÝúr‡ò}YŸ_ê •”Wth‚8½å ó2ª ´6~Ñ¢&ÊFs"m,LúbM˜ &v)uˆ9@†îfW’öa›l)|»°ÏO'XU¬í5dJ~ê¢Ô_¢ßŒ -È„uÒÄÝIv'¬‰6 lOˆô'™ ú´4ô¸/½‹î"ƒ‘¾b¿Ó×W˜™~¦ûœo$Ú~Â~Én|ÀE¤v^)S¬Û¿æX? ãòõÉò_['ÑÀI -cýaÒ±ãIׯª‰ÏñNý)yQhTŒ—ÈKmjäÁ-Fà[Ÿ‰ÿ8aÛG&öRPÎ~©GáôáQàYpb)h ÈHî¬&{@’*âCbÚp̆¡¨}1Þ—$ð}î3eÍAà/A¤¶D‚´Óƹ´9õ±•bâ›÷>\]òÈh¥×­Ü׃qñ°à (èeÇF~0Pʢ뷗 ­± b½Œ…™ÑÁ\v9¦ÇdÝaíÃéfWn¾#pÏÖ`rí™”jà;L´âÝ9ˆx/Å!4j¬k;”~/wDí§ûÎø“6Ù -Î&ßÏ&ü Ù"tíM6t¯%Í+ï‹Ëûrçº(£ |p÷ÐvÏ6G Te÷Ó?ûÒ}÷ˆ1z–™­Š¢®@‚¥ŸH‚±}¤£}íÑHuÕDÃb U|1ÄnyŠTva’ä/FJ¥és{AwË_¦ÞDBý`#)µ•P÷–.}±?öXæÊfä_MøÔÕt­¯ÌÓº¤½mÝþ0Éówõ¦{/j¾öwã m3WÁuÙ[˜0]ÞÚØð,÷_—®F%àõåϲ¦•g­}3®QtࣼÉcéÚÓÚ¿¶u½ógy8xAëca19Ðʦq§)…ˆù3NŠÚ=á3©“I‚0Õ>N«šácùøQ) ”íòŒà¹Ÿào7fž¯T÷îôÿD¤ÿML”&MŸyƒŒ1HÃ,ñD!á¡RÞý–ä)éÿ±I9´endstream +1108 0 obj << +/Length 3203 +/Filter /FlateDecode +>> +stream +xÚ¥Ùrã6òÝ_¡·•«" ;OžO29&Y²[©$´[ÌH¤BRöx·öß·/ð©8U[®2€Ðh4ú¦ôBÁŸ^¤6P&‹IVi»Øì/Ôâ澺вfå­Æ«^¯/¾|g’Edq/Öw#\i ÒT/ÖÅ/Ë7__ý¸¾¾¹\…V-£àrecµ¼zûÏK­õòêÛë·<õöÃGî¼»¾ºL¢åú§›k„¨ ÖEA,;×ß^ÿ|ùÛú›‹ëuOßøZ$î‹_~S‹®òÍ… +L–ÚÅ# T ³,\ì/"kã!»‹ÿèŽfiëO¬I›†É SB½Ð:Ȭ '\±Y›ÐW`G`/WZ)¸ÒÇ÷_ñÕ¿uOÜy·®àîÕfãÚ–ûoêªkêÞN1#Ö«Å*Œ‚,Ò¡ýþ²5ÕË|·«q{.ßÿ(°¢h.uº¼®PUp§É«{'뻚a·ŽÛöà6å¯J…D,(+ž¸zów +‡ÓUÙ•u%H3Ó«GôšHÊ&)Žô•+^WÖ…i$:“ew3˜’ I#™ÿã蚧9,Y`’Ðöû xD¦;`A{çš<ðä¡Î¢?Á³Š¬Šm¶Xõ"K‡"ïÜFØ$„÷3›±îI+J~·MW>¸4ÂX³\oKdul—Ûœ:<˜«¸ç>w®*è½`=(@‰Ý áà'÷Ôúé¶&ä …['°ÛúÁñ–O$¥{¬»ÂŸÈs…«êγœÑA’éÄ3†­Ã'/ñÛºíô +ÿ‡Á¼|ë$È <"n»ªx—ûœï;ǃúŽÛ¼š9>EUN’‰¼_erZ©Šô×ùsèÞº¿3†hr[™ T:½Ì‚4M²çç®bPþÿpC|À΄yõßWg~„X„oïúÅS•ïË øT™!I€¶=‚yñ¦¦®vò¥°²ÛÊ…™ _m'ÈS[ÞWÁ­lϹé¨ðK~ ÃhÎdhzÕzA,\P-^Œ(iÈXŠGñTZ~¾ÌÂe}döù“¿AÕM™Á—Ì…Røcw†}Íkxt¨]swÜÍÜ'D!PȬ_ê]¹yš“74?Æ gÛÁâ½óÔ•Õ©¿‹4س(Œ`mÀ}çáÉæ~Á›‘«êׯÆØUÉxŽÉùˆ‚_‹ÂÅA„q=#)¶qBÒ3ŸÙ¯z‰gØ çóÈ»®"¥‚, íb¶4¢´÷¯±ø×릩›öe§É¶N'Ë=r~·¬îFÆEÇÞ^¤|èïaiÎ~F›¼âÅâe»Ž'È_âV÷àš|Ç×ðq ô0K—ïïx"?{Ž`kù”–E $ÈÃΪ®È§’õy#¹CVý1k€0Œ¾¾@@Fˆþï¯onxð«²ê®nöyÇãž~˜Ð z,w;îÝ +f>¥;6pÁ ¼ÝÈ,ë×@À p)Ü9‚+k@=(X‘}“û±SsͺZ 'S¡·¡]ú6“&`zih÷e»©+ŒgîMŽ*€„5n=ávD8l<¶‚êVfÝçh~Ù‘y…ñ€—Î.YíqUňBñÑ3ï86½ƒdŒ šØá>nO0áBØyBÇ㢵m!Î"ó xàA% ¥,<¦lÉ«'î §Ý€’]´à‰Ž—‡ÿ[;¢†˜5#†è÷NȵÌZq|«ù Ø„–~X£½½úiýµÄÁ€ýÚé#PTuåT±@l£P'‚,%\1¼d>Âññ/‰œ„ ݤAœd\q­2'©±|‚Í®1bÇc€=›m^•íž¡wuÃp ·ÿôò›Àܽ«zIŠ—p‰8ôm>òq³‘PÀÇÝ#'«0Ù=Ö ÅÀŸÒ[¥1*‡(£xÅôqÅþþ&ÄÜ`OÔRÞk2”™ü? +”Ò>ý8Ã+£­úbƒH3`$ÿz÷ă-fÖFy!§AÐ!îB+¼"ž A oÈ[ÒöKM1Kr-eX“ Ìv15hy‹dlˆ¤rãë-V)ÖÂ@V&ìðúëˆ+¤ö¡7Ùjù?`/)×êk·ÛíIý%p‰ûŒ2qï<‰5%¾xëÉ à>u,{A îÔ²+³sÌ“€ äQþ<ÚÃ-%íÊwݶ>Þ#ump Œmy0·…ZVJ3G7N݆£ lb8‡m㊰ù7< k49»õÖÍe¿~EYŸžWU‹^4JRø$ ;„c+Ä!tJ`;¬ +„O\(´5CD ñ¹wÃ!mƉ} "¤– ³UG#yT˜DÖg4/„”=dïÅ»G*±3%éIvbdÒ#“yM…;¼xlýu9úfž‰AI,ªP<Ï1)"OÆÞšb“ç÷ËÀ²Dqôâõbú÷g*©–ÓÖ¾Ê$Eœ¾.ì=Káv®“Ù #È yFø²s=•´[_îA~(ëcëË@½¡’òŠMÇ w“|a^¦C„ÖÆ/ZÔDÙhN¤eƒI-V”Ù`âR‡˜dnv%iöÉ–BÛ‡}~9Áª‚üÓhï !§ä' .Jý%úͤüLxQ' MÜåDapšhÓÀÆñ‰§ÊrýCSRuŒš¼–£ #é½áô¢) —«qÈKÕ…!½[Y­Y!G3ÔïC0‹Í '0þp¶ì¤–m¸lH8“Å>\M0¡ír´|LÞl02©@œU }aç3+­RùN¹‡z9åÎb-›ª)ñòê®#+¦0$Ã=ïľà +Ê-;1ØxÈkÊCN.—²ƒÂ9W‰;hYq  c>ú ÒŸe.èÓ +ÐÐf_zÝG}Åq¯¯¯0!3ÃJ÷9ßH´15ü„ý’Ýú8€‹HݼR¦X3¶!̱~Æ äë“忶N¢£ƆˤSÇ-’®1^U'>Ç;õçäEa Q1^"/µ©‘¯o=9$þÓ†Iì™ ØKA!8ûI¤…ËÇDã‘gÁ…¥ - #yp²›ì Iªˆ‰ ThÃ)Æ¢ö§ñ¾”ø£ ‘€ìsÏ”5G?‘&‰1ˆÄ†æÈÝ$¨Ó0‡º¡è o?|üxý†×NŽ"}Ë¥$Œ€IÍ¡eX.¨&_ q¢”M7ïä€Ð+{˜û ÍÍä–af0€{=£Ê _l¹w8ÞîÊÍ—` ،̿¿aš˜IÆÅï×åÿ٧к±ÒíäÙ9”ÄîÁ5h ø~FîgÎ¥üm¾÷_òª"»„n¾BˆþËIûÊûåò¡Ü¹>âèƒÜÃtý'œÆGUÙ•>&û2~ÿAcò‰f¶(Jo¸ VÊ|œè£F˜êF*­&^¨ú‹ávÇK¤Ê ‹$—1R6Èç º;n™z õ£ƒ¤„HÔVB<]ºôÕÄþ4`™{"ò‘¯NøÔ×w­¯ÒÓú¾ëÜþp’óïj–.þ&Y|éßÆÝfž‚kˆ3¯pÂtùîÆFxôés±v )âjR^¿ùQötò‰kßNëýEÀ %ðßÉg×µ§uøRØÕõΟåáàmˆ‹%‡…^vƒúðRˆ˜¿ãI{ |&2I¦ÚÇlU{ö/8eûœ#8÷ƒcüȨ̀,Õƒú¿l2üº&J“¦g¾‰Aö¤a–x¢È$ÚSÊû_¥<'ýôJ„endstream endobj -1097 0 obj << +1107 0 obj << /Type /Page -/Contents 1098 0 R -/Resources 1096 0 R +/Contents 1108 0 R +/Resources 1106 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R -/Annots [ 1101 0 R ] +/Parent 1115 0 R +/Annots [ 1111 0 R ] >> endobj -1101 0 obj << +1111 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [418.3461 611.3335 487.0181 623.3932] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1099 0 obj << -/D [1097 0 R /XYZ 85.0394 794.5015 null] +1109 0 obj << +/D [1107 0 R /XYZ 85.0394 794.5015 null] >> endobj 186 0 obj << -/D [1097 0 R /XYZ 85.0394 769.5949 null] +/D [1107 0 R /XYZ 85.0394 769.5949 null] >> endobj -1100 0 obj << -/D [1097 0 R /XYZ 85.0394 749.4437 null] +1110 0 obj << +/D [1107 0 R /XYZ 85.0394 749.4437 null] >> endobj 190 0 obj << -/D [1097 0 R /XYZ 85.0394 597.4103 null] +/D [1107 0 R /XYZ 85.0394 597.4103 null] >> endobj -1102 0 obj << -/D [1097 0 R /XYZ 85.0394 573.0707 null] +1112 0 obj << +/D [1107 0 R /XYZ 85.0394 573.0707 null] >> endobj 194 0 obj << -/D [1097 0 R /XYZ 85.0394 410.9267 null] +/D [1107 0 R /XYZ 85.0394 410.9267 null] >> endobj -1103 0 obj << -/D [1097 0 R /XYZ 85.0394 378.8211 null] +1113 0 obj << +/D [1107 0 R /XYZ 85.0394 378.8211 null] >> endobj 198 0 obj << -/D [1097 0 R /XYZ 85.0394 204.765 null] +/D [1107 0 R /XYZ 85.0394 204.765 null] >> endobj -1104 0 obj << -/D [1097 0 R /XYZ 85.0394 171.4256 null] +1114 0 obj << +/D [1107 0 R /XYZ 85.0394 171.4256 null] >> endobj -1096 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F14 729 0 R /F41 925 0 R >> +1106 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F14 737 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1109 0 obj << +1119 0 obj << /Length 3252 /Filter /FlateDecode >> @@ -3700,77 +3713,75 @@ R UˆÄuV¼¼Ô)e ç/> –|}Ä[¾¸»¿‡CÔMT4ÃðF‹Ó üIT¸ ;?ðËPñVUè‚èô7 øpiKìOD“"VØØŒ66ð8uRÈ(L0”lÙuÇ]‰¥¶â§s$ôuJAï¡þœ .ºj2˜dàJU>¨¡“Ï•ÝPK'ºÈO1ta  øŠ#~Õ Ä9ÖsåÖåqÛ³ºÊp0ºÈe©ó['‚|ËÅežÿ~(!ˆA§Ò`xË0zDúÜMç8kO&.βºóhB×íÄe¡þ”LGOéßã¬ÎV¸@8¨aÔ8~?{%ÚÕFªµ›ðËþ”sÁ4µÈOJÆÃN//çì„èð’q$Ϙ}¯\èžôv&ÉŒ® hΨY*“Ìæêì]ºmÖŸsewvèëÆ “ +â~Ú;Ä(>õw¥üÎÄŸoDÌvþç¿úœþÝ’QÖ¦§ñŒ“< ÂI˜)Üvš_pþtÉú‡B¬ðendstream endobj -1108 0 obj << +1118 0 obj << /Type /Page -/Contents 1109 0 R -/Resources 1107 0 R +/Contents 1119 0 R +/Resources 1117 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1110 0 obj << -/D [1108 0 R /XYZ 56.6929 794.5015 null] +1120 0 obj << +/D [1118 0 R /XYZ 56.6929 794.5015 null] >> endobj 202 0 obj << -/D [1108 0 R /XYZ 56.6929 769.5949 null] +/D [1118 0 R /XYZ 56.6929 769.5949 null] >> endobj -1111 0 obj << -/D [1108 0 R /XYZ 56.6929 748.4014 null] +1121 0 obj << +/D [1118 0 R /XYZ 56.6929 748.4014 null] >> endobj 206 0 obj << -/D [1108 0 R /XYZ 56.6929 549.4516 null] +/D [1118 0 R /XYZ 56.6929 549.4516 null] >> endobj -1112 0 obj << -/D [1108 0 R /XYZ 56.6929 521.7105 null] +1122 0 obj << +/D [1118 0 R /XYZ 56.6929 521.7105 null] >> endobj 210 0 obj << -/D [1108 0 R /XYZ 56.6929 231.5025 null] +/D [1118 0 R /XYZ 56.6929 231.5025 null] >> endobj -1113 0 obj << -/D [1108 0 R /XYZ 56.6929 201.1114 null] +1123 0 obj << +/D [1118 0 R /XYZ 56.6929 201.1114 null] >> endobj -1107 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F48 940 0 R >> +1117 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1116 0 obj << -/Length 2902 +1126 0 obj << +/Length 2922 /Filter /FlateDecode >> stream -xÚµYI“«F¾÷¯èx«§Ýˆ¢XÃ1mOûÚl @b‘-hbþûÔ´ÔÛá˜Ð¢2++óË­ -WýÀ«,0,TøWIá«῰¯6¢µ_@Æó‘3}‘­Ôš‹7@¥6j´š”ÔÍéà{«ö&ñU›µÐ P¢ur¶±Í[·ßÕÞKK-4|´°«wzùõwöÕDÆô^X*²ðzE/,…{õ_x2a>ã½Ì_¦…À*YZ†ŠeF9©”Á"(Œ9H`1ƒ8¶ŒØµƒ{XØ ´ >,“$F í…ù¯®ç!|d©¢{qHGÇè È•Ð<VF¢ƒ•ÆV’M&È3.æ~cYγâ'©7 tÏKŸ„™ÞåËBä žÕ±â|_¢ˆE7:Ç–‰ÍA°d|À 7rÄ)+qM Oð•Ä±2J&.H(àC(ºé»'‘ž„QL©W7q( 0òèsex^æ3Qüô[ë¸ožg)‡û7V`èëFt3#Œ¨nñ1 L7°K6¬Èȼï7/Ù -8?r*‰ÆO3F[ƒ|c=¡HBEb  +ÏP~ÂŽÒ†À‡(¬Î„c”Òá1t1¨„=ü² £Ìdº‚×b›Rò - d%šÏ8!ÊK–e+0À!aŸ# 3·¢‹•á‹äpÈnaŒå¨o -WÁJp©¨o=«ØüÁ'AÅd@ºOCë‹d9ãJ2¡ŽÂ\E?f1wŒ\=±Hœ#>ÊÏe¨Xx:[qÓ™]猸Š~ýtz5<Áÿ\b -r!ŸÇa–ÿO–?Úôe…"Ÿ]îŸãÌÛÂÝ_<šZ1ñ#HŒ¢ ºô8”Áÿ\dž—þpž‘d<Ž…^tÏ5°øEu%¾Z$Ié@L -QÐE”gáBæ·ˆP¢ÇrþIäDd³ÄæÉ…Ë[™HFŠ¸Ê$fú£"Xê 2¨ÈÚ´°â™Ð/ƒš¤tI„Yæ.Ý%» 2£pEÁøqS£HDŒÙÆ(ÙÃÒ%1’À‹Nf„]ÙÆ -#¡¾•±2%f| ŽÆÈ>ÛÛó0÷h‘B@‘)G÷&  €ÙÑ9Z´éx6‹é`‡ë3æ•+›#“Œžd’–Dxq¬f‹ý|IÆ„Œâ„òynp Ónð…ψÒcÚ‘~t\ƒ–çÜœ§Ð0¯å@ìÀÏ$zÃý1ÁÂJ´t4OP"#ÏŰѱ”À PI”eùO† *!PTz J$üÇNF¦ –´á×Ïâ†^LËòsÝH±AOëæ’Xļ¹è0@¥•à±¨2s|Ѷh)ZNa,g QvÒyˆnê¾Ç——óKËQ ¥‘„EÆ™õ§æ™×§²gÿjd£L¿F6ÞÄ´b#r·ŸÙIŸ~øÌ”ènf¿‡,Œž™ÇÍ`2Cãì£fÃ!Hö}ÒU <÷€K°RïŽðI¬åŸñS)f`E¡3$‡B4„ BÅÙÝ¥tŸUõ$+1cP>/ÔÍL,9"=¶abæ[4Grôsâ„‘› r{ɸ²4ÆT3¤SX¼“=dV`}‡¢ø-Ãʼnüä"B>+%­ôd2?×–tÍÚŽú€ú¾X±-z6 jDnìXÈÁ™Cã TÒ£kè}\þ£h2 |4òÂð@G¸w Ÿ“ôÄêN4¢q¸’y^xELT]’œbÅÑc:Ðéƒú"ú|ˆBTãŽg¤<²Ê ¯y}3*ùþh@3'$5—Ñ­ÀÍwÂzåãü0@d|ž¦°ç$&w€'©T[Ü{Ž®Á!¥n­g[i])ŠRB…Ú.²«“  ܤ ÏsøÕ¼¿Ý[U^˜÷ÏFÇ®š°·vÃä$Šv?4§û÷R‰nµ¶°¤³¢,ïê¡sònM綞N9öûT‘æ¦§Æ‰“fRM…Õ…à̦·¹Ñ-³ztºw~¿>mšÜnjÚ·­ÑTžÆ6fuÓu­t0ÝWmøí—âk -uïß rÚ$äH…Ãðœ¢ÏzõS\p¡+®I_ò/U¯Tðw6øWƒ!Ã(=£`Ýtÿˆz¯_¥"dR»¶j5ý63îÆv¶Ó¿´6u1l5Wï;ŠBë¨ûh 6zmæOœÖfCÕ0+~¹»ÁµâîìÖù$]6Õ{{£™­öh™¾÷6÷sÌzÚ1¹ÚûöÕÑæ@äΖïõµí¶,8ƪ1”ו·g[î -†Íï ßóV–¶7œ×°Ã¯†5cö~suŽštµÉů†ér&×—UgiÞÇ— ÌÄyCu¼ÎÞܵg5·I5cuÊ*5öŸy¼:íÿðîý¸ûæÁMÏPÈÝ $ð—ʾ„îZœ$<›É1øë2ÇtGµfs6©1£–úGq>sþT»öX;Ö'=¸ íûո͑~c%0òô´ ¦Óiª«†#ß¡¶XDïîÀi«Á¨}„p9hÝ{?ê-6ðnÛ)\^GªxØ„¢Á–9<‰ïëÓ6¹ŽoOrãÞ÷Ãꈮ8lW-=ô­ÁØÕÇæœ-ss:îŠu{_ß×óî­‡z·×ÞñCÞLÃ~×¹››tÊm×ÓhŸNË”àuÖkHú8ˆ‡éºß鬭مî<¹í»Ó•ožìq¯}z¿ s\›KÖòÜìuÏQ¢Fwø #ݾ &mî²R›ÕY0X½7¡ -µA™R§·îôœÚ¦) eqÙÏ'ñ¦×±š -]®£ËdcÅ›fwvqšÍ²ýnÞ¿lËR{š/¶œÃ=MF#n>RÄéì ï«nWv·EØ—zóß¿ä’i2Ð?è'ûò£Ðãj†aþÛ?&…:„eÿo°E2ýíS>ÿ@BêAYæ>ÿ(yú¬ˆ¿œ£s~®É é«æÅß.?ªþÛúÞendstream +xÚµYI“«8¾×¯¨x—qMua$±FǼ=ï;^»ç€6‹ x˜ÿ>Z€²ë1óº£c„”Je~¹ +ƒWÿÀ«"rŒr¾nÄ3ˆÉÂÀt»à@ÀKœ"ˆÙyÓ‚£€Hâ##a1kò4c|4ÈÖ†$Re‰Šú å'ì8l(|d€Ýêô¸€qŒnlx]*%¿l#(s©¬à5?f‹…ü@"‡x™Å3 E„ã’çùR- ˆKاˆ@AÙL­èlEEøb>ë 1Æ„ö¦Â",¢¾ñ¬üð› 'è>s­/œâ JJ•¤L E&`I?¤>wˆ\=±¨Ÿc:FÓ”o<ž¬8‰ÙÌ–íósB’‚èŠ~ù4~5<ÃÿR  +›PÈü0ÿ'Íuú@ŠÊ!I@Ï&÷OqjÀMnî/½Y1µ#Èœªâ¼ô8RÀÿ\âTA¸ÀÉŠ'LϺçšXòÆã¼_,¤xé@²b§‹ØBœº ßà…™ 1úƒÈIXg™Ï‚‹¤·"–œ$æ~•rLåÇI°Ð2âp +Pþ°=Xb%3¡_5 éÌ’3²Ì’º NN…yÂøñP#DêŒéÁ8ØÃÂ%s²(HFæ0‡mÑÁ*'㺕’rj|àŠÆ)=;ÛÏõx”Y4! ÊX•ƒKjP±ÃlÙKÚl<™Äl°%ù™P‘Ì•ÎÑŒIGO.6\î‚ôÜ'Ygçî c•ªíé´qg­üBžj>ƒJ*[0CÚ≠LØNÎîöÆ&I¯ª'iŠI ÀÑy¡n¦liwŠ—XÛFSÛâ9³d Ÿ'ŒÜ§ÛsJ•†1Y5C6EÄÈ*ÙCdÖWÈ“ïÁ2\È_AÎ=ä3S²LO'³¾¶ jV¶ÌPz¨ûRɶXo a$\ˆÜر(ÐÆâ„ñJ·ƒkè{Üþ£x2u|<òÂpÏF¤v`›Óð$ ÌœxÄ‚$“y^xÁ\TmœRÉÑc6Ðكن "ö|ðBœã',<ÖÊ`¯Y~’RªÙùxÀ"'¤9MPð­ÀÍN"re㬠<>»)"À)‰éà‰+“ÆÖ÷ž!DrpÈV7Ö³®,¯äI‹‚Êt—ò„‚GéÕIT1Ôí$R¯±ë)Aª(1E1%¾$éMãRæLx`”põŒºa}Y*P@¢Þ—0í½8•2»FIŸ)©ÀŽ¤abæ!{hÇ%Ö>>=ͧ†¯Pìϸnü¼©CrÞú+–®ïŸèõK`ÑFæŒÐO;iß­Œ0H‰œT˜Ìß³Øå‚$!"H2Sbziq“[¾L“€ƒ_o=×Ãìâs}¹pà7A’~Lܾ¾ü‹ž"Èœy|KÅ}Œ +x—é’Hn„$§r²€ØÂßéB&ÏÃÂ$$9“°íZ¬ü‰ôò ¶§|æË™Â"'B=;ö7îã E™ ÐÓã[u°.Ñ¢‚Ú¶ó^[š|4_ÞV~¸Iä¸ÑØv‘áM6M]»L;ר¹¿váú$µåѽsbG㻺ÌÓúñuCµ¯Â¬îÍJË[v͆p_µG¯vƒ³Qƒ3Õ_;{sv0Á<Ë­Š¹XJÏï{Á}…Šüø~ƒË›°÷ÃJ]ݧgÕÒý2ʨÕÜU{úT¶×ßË»Ív=ëžÝHkEPlöä©6žÝ«q_ Û,ųƒ›6kÅ AKm%:ݵT;~¿ú•ùzy×ÖÜ«”Aψìe¹Ûo4Ír¡Šîéü]8vj7óäZ­Óþ´B-aÙ¯“÷««C¦bОÎ~9¼-&JuQvæ}xŠTœÖ4ÇkmÑÕ]yV}“”C0ÔƼZáÿ‘ùû§Ñþo‘Æ”î̹Y†ÍÍ @*íËø¢eñYMÈ‘OÓk>*õúdTá íg~>Sá”Ûöpv¨Ž:hÚ÷‹qšýÊË ”ñqŒÇã +W¸ÄÂ/içóèÝí9M-4¨.ƽYûÞ:ó5ºÛö -.MÚ¯CÉà‹ žÄ÷Õq“œ Ç·Ç5¥v~y$Wê7Ë–žbÚœ¡ØÕ‡æ”/2ómØ–ªö(¾¼¯ÖæÝ[õõv§¹ú‚y »mçn®oc¸Y£Ým\$„Ыò^MÖ‡AÜ¿­º­ÖÊšœÙÉ£ë®=^úæÑvšÇ÷3n›¼TX°ïàj¯:ŽÕÚÛÀMâéöµ7jÂóR«—'Aoù^GšõŠ”[U«ãTÖu±'ªóón:Š×–U¯Ín‹Ut­­x]oOÎN½^t¾§ÝóƱ,­3󥆳¿ß’ÁNª4žì•]Ùm+î&wûBkþû׌3 öûÞ_Ü +=îæ8î¿ýÝ‚°«#TôçŸÓ_þ+æóß',Røù/ËSûJ>»ãKB& ù«äù6?Šþ¢Ó, endstream endobj -1115 0 obj << +1125 0 obj << /Type /Page -/Contents 1116 0 R -/Resources 1114 0 R +/Contents 1126 0 R +/Resources 1124 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1117 0 obj << -/D [1115 0 R /XYZ 85.0394 794.5015 null] +1127 0 obj << +/D [1125 0 R /XYZ 85.0394 794.5015 null] >> endobj 214 0 obj << -/D [1115 0 R /XYZ 85.0394 717.5894 null] +/D [1125 0 R /XYZ 85.0394 717.5894 null] >> endobj -1118 0 obj << -/D [1115 0 R /XYZ 85.0394 690.1986 null] +1128 0 obj << +/D [1125 0 R /XYZ 85.0394 690.1986 null] >> endobj -1114 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1124 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1121 0 obj << +1131 0 obj << /Length 2380 /Filter /FlateDecode >> @@ -3787,48 +3798,48 @@ w ¯7^5t\ç.<7SQK„S£Ýš£ˆ^GfˆŠ×/†qˆ€[èò::-vÞ¿÷ºÇo aàÍ>Ô)ø¹) ‰I˜ö 2±/.âF'~QÖN°vt¦yxJ2ŲÇ3àƒœÃ‡þÅyCO‡7ãƤþ#'!þ_BÆ?݃UqzD:QØÙï¨ÍüäIòà@á'*¿'ÒC}¤àùáì1»«¸«Î÷³>_±Ó$ÏDŠ÷ÜI5á¿ö.ª¸vv÷ŠÌ=ô!ļ"xß½t½†rZ¸¯p㺛Í,‚HHDÏØë ƒ±Oº ‹pt8³?ð¾ì¼Eµ«# StìÙ 9µØ¦.Ëú0øâPïK¿fý„¯b*r¹f1“"÷ôÕƒ©1Ľæ_a”²C¾¼@Í™JxèØ[çm`2‹#Õ'›‡o2耵_EQÎNöÀrh…ëIvâÉ)Ä Æßú…ìK` ¡5¯£ïíê=ÀÉHlŠåsÇ!¹õ|ÑÁ8øî/¿ ê˜)¬’f«xÝaõ¢z¥œ³’š÷ÿ‡x©úÿC|upendstream endobj -1120 0 obj << +1130 0 obj << /Type /Page -/Contents 1121 0 R -/Resources 1119 0 R +/Contents 1131 0 R +/Resources 1129 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R -/Annots [ 1124 0 R ] +/Parent 1115 0 R +/Annots [ 1134 0 R ] >> endobj -1124 0 obj << +1134 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [349.4919 384.4828 408.4801 395.2672] /Subtype /Link /A << /S /GoTo /D (ipv6addresses) >> >> endobj -1122 0 obj << -/D [1120 0 R /XYZ 56.6929 794.5015 null] +1132 0 obj << +/D [1130 0 R /XYZ 56.6929 794.5015 null] >> endobj 218 0 obj << -/D [1120 0 R /XYZ 56.6929 594.1106 null] +/D [1130 0 R /XYZ 56.6929 594.1106 null] >> endobj -1123 0 obj << -/D [1120 0 R /XYZ 56.6929 562.6395 null] +1133 0 obj << +/D [1130 0 R /XYZ 56.6929 562.6395 null] >> endobj 222 0 obj << -/D [1120 0 R /XYZ 56.6929 370.2937 null] +/D [1130 0 R /XYZ 56.6929 370.2937 null] >> endobj -1125 0 obj << -/D [1120 0 R /XYZ 56.6929 341.714 null] +1135 0 obj << +/D [1130 0 R /XYZ 56.6929 341.714 null] >> endobj 226 0 obj << -/D [1120 0 R /XYZ 56.6929 214.6004 null] +/D [1130 0 R /XYZ 56.6929 214.6004 null] >> endobj -1126 0 obj << -/D [1120 0 R /XYZ 56.6929 186.0207 null] +1136 0 obj << +/D [1130 0 R /XYZ 56.6929 186.0207 null] >> endobj -1119 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F62 1050 0 R /F21 702 0 R /F39 885 0 R >> -/XObject << /Im2 1039 0 R >> +1129 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F62 1060 0 R /F21 710 0 R /F39 895 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1130 0 obj << +1140 0 obj << /Length 1913 /Filter /FlateDecode >> @@ -3842,59 +3853,59 @@ M&P ïp,'èñ+)jä‘jåQúk ©ï¯‘ÙYºÝÕ¡Eâ¦Á§âÛð´â·I-§Ñ;ÀÍÍ$b®»Ö¬Ý‰ÜQµ㩺›{JýÐà4;,ÿ‰f`¨º ‡W$‚7€Úù«1[Ë/¥nÆÏX «Eš Q S£»»·ž;šWïP{“øÄDN)ój=u”ö¬ÊùßC;»òÕ]Û Ñ_;Œ`ÝÄF q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb¼¹]mþpùv¹ÿÐÆ}endstream endobj -1129 0 obj << +1139 0 obj << /Type /Page -/Contents 1130 0 R -/Resources 1128 0 R +/Contents 1140 0 R +/Resources 1138 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1131 0 obj << -/D [1129 0 R /XYZ 85.0394 794.5015 null] +1141 0 obj << +/D [1139 0 R /XYZ 85.0394 794.5015 null] >> endobj 230 0 obj << -/D [1129 0 R /XYZ 85.0394 769.5949 null] +/D [1139 0 R /XYZ 85.0394 769.5949 null] >> endobj -1132 0 obj << -/D [1129 0 R /XYZ 85.0394 576.7004 null] +1142 0 obj << +/D [1139 0 R /XYZ 85.0394 576.7004 null] >> endobj 234 0 obj << -/D [1129 0 R /XYZ 85.0394 576.7004 null] +/D [1139 0 R /XYZ 85.0394 576.7004 null] >> endobj -1133 0 obj << -/D [1129 0 R /XYZ 85.0394 544.8207 null] +1143 0 obj << +/D [1139 0 R /XYZ 85.0394 544.8207 null] >> endobj 238 0 obj << -/D [1129 0 R /XYZ 85.0394 403.9445 null] +/D [1139 0 R /XYZ 85.0394 403.9445 null] >> endobj -1134 0 obj << -/D [1129 0 R /XYZ 85.0394 368.2811 null] +1144 0 obj << +/D [1139 0 R /XYZ 85.0394 368.2811 null] >> endobj -1128 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1138 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1137 0 obj << +1147 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1136 0 obj << +1146 0 obj << /Type /Page -/Contents 1137 0 R -/Resources 1135 0 R +/Contents 1147 0 R +/Resources 1145 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1138 0 obj << -/D [1136 0 R /XYZ 56.6929 794.5015 null] +1148 0 obj << +/D [1146 0 R /XYZ 56.6929 794.5015 null] >> endobj -1135 0 obj << +1145 0 obj << /ProcSet [ /PDF ] >> endobj -1141 0 obj << +1151 0 obj << /Length 3113 /Filter /FlateDecode >> @@ -3915,47 +3926,47 @@ h4: ²>Ÿ2˜ÄáÎG9ü)¿²ÁrÔ™½ã7àã~€ª;'è¼UðB4²nÃÑ2–'ÁN;ú3Þ*ü?ÚªŠª•YZêð€rõ\¾ÄE^í…ºbYS¦iM5> endobj -1147 0 obj << +1157 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.2946 363.7923 412.5133 376.6291] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1142 0 obj << -/D [1140 0 R /XYZ 85.0394 794.5015 null] +1152 0 obj << +/D [1150 0 R /XYZ 85.0394 794.5015 null] >> endobj 242 0 obj << -/D [1140 0 R /XYZ 85.0394 769.5949 null] +/D [1150 0 R /XYZ 85.0394 769.5949 null] >> endobj -1143 0 obj << -/D [1140 0 R /XYZ 85.0394 576.7004 null] +1153 0 obj << +/D [1150 0 R /XYZ 85.0394 576.7004 null] >> endobj 246 0 obj << -/D [1140 0 R /XYZ 85.0394 479.565 null] +/D [1150 0 R /XYZ 85.0394 479.565 null] >> endobj -1144 0 obj << -/D [1140 0 R /XYZ 85.0394 441.8891 null] +1154 0 obj << +/D [1150 0 R /XYZ 85.0394 441.8891 null] >> endobj -1145 0 obj << -/D [1140 0 R /XYZ 85.0394 424.9629 null] +1155 0 obj << +/D [1150 0 R /XYZ 85.0394 424.9629 null] >> endobj -1146 0 obj << -/D [1140 0 R /XYZ 85.0394 413.0077 null] +1156 0 obj << +/D [1150 0 R /XYZ 85.0394 413.0077 null] >> endobj -1139 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1149 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1152 0 obj << +1162 0 obj << /Length 4061 /Filter /FlateDecode >> @@ -3980,102 +3991,106 @@ S žèͶKê-‰?˜^À¡E×°NžÄô;,)ÒJ”¯0¬•;ªå ëÉ3½&„–˺/ÐñÐè›»ç“_A½Îì±ê%”ÔTÚêÏk]ß­ëËAt•Û…e›(Cµ|LÌœÜnè?cX/J•–±È[Mì©ÂëJka5ó\Sî€[²Ä%ØùØê ŸÆkú2|¼uÀ(ƒovY m‰S»f?PÛûŠŒºüQ[·¨>Õ¡Ëãiß×onBË—Z1ycr®ÒíÇ™'¿ö„g 5;_{þgOå,- k€±3Á1kΆ_‰î}-ÊÅüuò<ÎÛ.β¶>¸eR°øý$~pË@œ)¥Ó···ëXîN§ßÆbsh~Ó`.g¿¸ŸâˉTmIeb?U…—þì‹Û•˜™ùC¸ìßþ¹^ÔKˆvÂýß{ŸV9’üOQø}@ Ÿb jLŒ˜æxqºñ¿IýÅã=þ\%öúoõ꾈CþuèÃcUJ‡w7žæU¿ú£äí'ÛÒagÐ;ð-JZœòEð½™3[BóÂÔÿ Æ+h:endstream endobj -1151 0 obj << +1161 0 obj << /Type /Page -/Contents 1152 0 R -/Resources 1150 0 R +/Contents 1162 0 R +/Resources 1160 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R +/Parent 1158 0 R >> endobj -1153 0 obj << -/D [1151 0 R /XYZ 56.6929 794.5015 null] +1163 0 obj << +/D [1161 0 R /XYZ 56.6929 794.5015 null] >> endobj 250 0 obj << -/D [1151 0 R /XYZ 56.6929 165.9801 null] +/D [1161 0 R /XYZ 56.6929 165.9801 null] >> endobj -1149 0 obj << -/D [1151 0 R /XYZ 56.6929 136.242 null] +1159 0 obj << +/D [1161 0 R /XYZ 56.6929 136.242 null] >> endobj 254 0 obj << -/D [1151 0 R /XYZ 56.6929 136.242 null] +/D [1161 0 R /XYZ 56.6929 136.242 null] >> endobj -1154 0 obj << -/D [1151 0 R /XYZ 56.6929 106.2766 null] +1164 0 obj << +/D [1161 0 R /XYZ 56.6929 106.2766 null] >> endobj -1150 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R /F48 940 0 R >> +1160 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1157 0 obj << -/Length 3064 +1167 0 obj << +/Length 3096 /Filter /FlateDecode >> stream -xÚ­]sÛ6òÝ¿B{ˆÜX4A€y}J]§u§ur‰3w3M'¥%Øâ˜"U’²ãéÝ¿]ì"%Z¾´7z¸Xì.‹ý$&!üÄ$ƒPfj¢3Ä¡ˆ'óÕQ8¹…±ïãÌÒ¬õíÕÑék©'Y%Q2¹ºéÑJƒ0MÅäjñËôì‡Wo¯ÎßÏ¢8œ&Áñ,NÂé·—ß$£æìÍåë‹ï?¼{u¬ÕôêâÍ%ß¿>w~yvŸ@æ ¦ðÄ„×?Sïü§óŸÏ/¯ÞÿzõãÑù•_LÁ"”¸’ß~ù5œ,`Ý?…ÌÒxòa ²,š¬ŽT,ƒXIé åÑû£x‚½Q;uL±Lƒ8ôˆ•èiP„QéHLtœ‰Œ¤Uáy<ž%aˆOÅ‚úÿ¦&Ÿ—Ÿª|eÀ?xl±hLÛ~ZåÝ|ù©,ÚŽàÿ¡æc ÔÎéë¨/ÃLè “(«u‡:²2 æEÏDS¿3Ã0ªŠ®¨+Rw^-¨ó¡Ío “•=²á†AC±²ô^lÇ"‚|0OË©’º(©…FÓœ¾nŠUÞå#}nZ³ ^WS»0iVEexò|îÉÏ몳´ê’7uC{ Yo˜_kš{ÃõÚ49®°›“:›^-a#`e¸!‚,ŽI7=!iÙÖÔÛ‹)‹M‹ŠÚniFtž¦`Y ˜¥‡ë7Õ T»¯F%ƒ0‹5c¢Ö÷©‰,ˆµŒÓÖMg÷~Ÿ˜TA$SG¬íòάLÕÑzc\/ mJ‚Ó×ò ¨Õ¶+ºMçϫ̇»ñî¢îfN Uêt(üšÉ€æ9›Ôµq¦õHú†ÚnÉ#7uYÖEuû÷§Ny¢b8P:9ìÖúXöP -ÕÓRÝTöh¡¼C¡w™Âª`’Ò‡¹z¬}¶ƒÍ!ôU2dëtsñ–u3Ptluxñö^±Æ‡~Ÿ¸ã>ª¦HZÆé3jêaP“Ãz^M‡¸öÔ´Ëv\M}¶»jZ“’Ði}Þê©`¬ßN_P§ª;{ઠ-ø©LfϨª‡u@UëyUâÚSÕ.ÛqUõÙæ´tc¬Ê¾;aÓb‹Z¯7ì߯·‡pÄõ€ïQJ8ßsGsWŽ |X*wÝÎS3<1°9¨ñ>ÖÓ÷XÏjü ×­Æ÷ØŽj|ÀÖ»/ŠÛ}ÏæìvïX»èÝ­§ÜÙ™‡¢[Ú›(RAªUìbǼÛ›8ˆD”þÏ{£!qu`ozXöÆa=¿7‡¸ööf—íøÞôÙòi¨ DàÅ—ì…©æeݺ9γ\79¤ ÷@ûY˜$ƒH :}çÛÈ*%‡>èØÐ'#ã6'AÈû ½œšÒä ~ôa>ÏË|•sF&1ä6w4„¾î·¯^ Wó-ÎÖ`ˆlQnÓ/)Ý¢ ‡Úµ`=ˆ±±4´…Tue4H‹øxÁ@YÏórY·OT3—™Ø"T¦kñƒÀ>ÂöÜÞÔ!5Ñ ÙÏõ Õ Ùœ[;Îrm¬™¯»VÍع汛zãd*üL3–ê-L;oŠõ6ïÝËIðXÙŽ?;'d7ž"åVq‚æåÓè„ÉÅŽ\âür2…ÝÝ´ \å ³ƒç|‰#‘ÀPÑR¯}¬º|ÞsšÃÙÕ+˜ÖŠz“sB]m Y6,¤Ó¶¨æ£ªiÍ|Ó'ç ·Mýµf£îåíÊçí÷yY,rJ"Õ mG›¯7}Жߒ}ìÈ©AS£—Þƒm=Ôö$ iw–15·in*¦—`ĠǘŽÚ±ßZ,.8{ÀÓðŒ_ ƒ¶Þ uQ”lï*º%•%›[^hߘõ|ƒ{eM{ÇŽÈüsiP½)išÛÖvï€6ÂÁ°°êI£ÝÌF -Ƙ׫5ÅA¬®SÎòLj: ¤äDÐbø(ÙyD±hkžßåw†g®Kp”Ì¿Û„|M’ÖŸ¡ì Ö€2Ó7èÛ„Í×ìwW¬ ÞDÑô‡úÁÜ{Ó•2£³$£°'HKÓh¿o -ïUÖ2ï\A䱇I‘#äÚMkr`k÷?7ì:uó±ccuÆ篗†9›±®éd§ÆyHÐïɇ•î» -ûµéãi$m©Ú ™†M£s~†ìª±¾ÃF¸ýFȬMµh îЖƊj£ÏJPÑäÚX ˆmŽ çØ+ã1š„‘K‚Àˆv·¥4ÕP ·'ÃÚÈÅêÜéŒÊå]ûµ hÏ—ŠK™9lª™,8WçbNµcNÿz`Ë xá¼—†(<Ûf -è¶'’X!;òž¬rëŠ='æ/LU?6¦c$Š®T@ñ€áCe[¥OgÌUMß–þ õ½P=<ËC½ 3)CŽ€íXf«D&PÐpf‹kžA1WÜŒ•q%Šv·'#ô SÓq< Ö`tk‹Ñ;-ˆ#ÉŸ$H:ëNƒT©h¨ÛQ~€=y€_‰~šøý¾1ͨ6â@×/§5~?¥Ã Jãì9zz„Þ<Ÿ/ÇnSÄq"þŒˆ–丠Y -5p–}UðíU{¶½O/QHÓäËèÑÖ+( ´ñ0âmÖ6%¹µA¬ÄaN¡H£'¢6§ú7 ö–{v…7sZyÊ3ÉžbäÈ%A:‹¾†è}·¬Ë1iUô}^ŒÅ6 ¤Î ‰Rù Â•HËþï‹UQæ ~!„“b -cú+S¨µ" *P;gÉ¥íP¼Pc:g»ýÜ F(ºáð„¥ŒE%{!§qqœdÅ #¶¶PðŠ-Ħˆ!Ö”+¶~C½c’ª I¼»CQšÑ«x‘RFîÌŽó’‘ö²è½¼Àþ¨$ž~k؆­h7NB„a˜í–2Ÿ2–dæO›‚•/óû¢ö3'$8´ÝY©Ü¢¥ôPL3§¦Ý\·†q­¹á˜2e‚»ÔŠÊQ5Ôáô AET.¨)û¨Ý_÷s`í.40§¤¤)_¸çæŠiXÓ°–,}Ái.ž>ÝÃ÷Âõ¹<²u%çxÖ8_×õs¾Z—Ærɸ–ÙqRË KCçÀEò4Rß`ù£¦_A „üfÄVfžÂ@´tù¹ôµMQeÜÄ -¨4TGá7Øë@`:[ªyy[C}¿\Ñ'{Pyç„8ÖÿÁ¬²®ï6kÒKÛž\Ö±Šhß¡‰ZÉ»–+Êlú¡Ý°áóid™¿áüŠ°·ª„¸n $/:H3©z‡õ³õÎB³ÑG`,\‡^ƒD4doÄ¡ÅÓcë8è÷—šB|¬çw6¹î¡³b5Yç÷>¦‚4ÕÙŽ»»Ü]!ÔÛr„¸}MxâŠGÜ»e¼â<}û:+Ô ;÷ÚëÞzÏêÕ¶ÄyWIŸŸÞå§Cå^úáÀd|äÉÁGKäèÇU*÷³ŒÝö/{^˜œ1ÀäzÕ†vþ {R;Ó®éjÁ¾1?îP{÷ ‘¿N´zs| -£ÛMãîX“ÔšH‰2Ó«ã ð Jši¥†– ç¶ÉaMMK@ëopBÉØw”Ñ'ô¼Ú-íu Ó% ÛÒÚ8Ša`ÁâIàì„Û—/OÈ/ÕÍØ!k—¦,Oצñw–¸œý“…ö n¼ý3@6¾M(ñ´MœZ ø1s&­$YÛ×vÀi¿7peÃþWÁµ95´-ØóædGvEíNAˆ0#4Ù­e±º'6˜@7X(4NÞ+ÐíX&SÐÆÅzꔤ&jê¨jšÑ×u¾Êê¼x¤×McÔj+z.lkëU^Z<ŸwâçUÙ:YUA„›ª¦Æ=ˆ¬6<_cë{ËÕÚÖ®°ŸÓq:½ZÂFÀÊp-RŠ4 É6=%aÒ¢©¨µ9–SVQMó’žíÒŽØ— JizVJ¡™èž,Ô÷c ãÝIaU0Èćgí¸ö§lŽ  m¢á´Þ6oÙ6C‡.¨ƒ‹·÷†-V{öûȇû¨™T,b&Ϙ©ÇuÀLžëy3šµg¦ÝiÇÍÔŸv×Lk2&­/[;åÌõÛé j”Uëþ ©`>“êôSõ¸˜Ês=oªC³öLµ;í¸©úÓf´twÆ8“}w®Åµ \o9¿_?nƒp$õ@î1FúÜsG sWrX¢wÓÎSS8xB˜æ Åû\O[¼ãzÖâgÝZ|oÚQ‹¦íÒÛýÌæýv/¬ýéÍm¦ÜÙ™‡¼]Ú¥ŒHbú³c^ŒíM(”TÉïÞ›Î#†Qö¦Çu`o<×ó{shÖÞÞìN;¾7ýi9J 'ðâì…-çEÕø1>³\×@:÷ÀúiEx +e$EßùödÕš>h¸£O+Ðã6#E€Èû ­Œ…ÍpøÑ‹ý2/²UƈLã‘[ßQæºß¾zY c[GŒÖ ‹|Qoá—Ö~QÐBmHÚGð8ˆñádÄŽRV¥%ÒqxAGQͳbY5-4Š'שÜ2”¶mð…ÈœÂÎÜ«4‰A³Ÿ«-šÐœ_;ŽòϦfA¼l:3cãšûnª×)ïFÚ1¨·°Í¼Î×[Ü»‡I0¬\£‹Ñ rO'a«0B÷ê`tÄâB/.òy9šÂîn&®²…Ýáó¹Ä‹ˆ +o¨Õ<–m6oó9a4Ç}Õʧó¢ÞàŒXWySCE–;’i“—óQÓ4v¾©ó–Á9èí Ÿa§ŽÙ©{¸Ýt¸ý>+òEF Ò `;ú|µié…¶ü–ücGDFt5êðð|ë¡r‘€¢},#4w07‘ÓKpb°c“Žúq·µX\0zÀhx&/C»lÐxÈ vŽM—*Ú%•%›[^hß™Õ|ƒ{å\{Ç(üsiѼ Y·9¬íÞÂβ@pæIÔ.2‚žœ9æÕjÍ¡¸ Š³uÂ(L¨·@BI=†CÉ#‰ySñø6»³íH,ǽøN¬ñë ;OŒ_Ø2·ÝøÙX¸ PÌÛ*<«Lºzõ‘SVôîäŸP»SªÇç&E\¡ƒÔË·ÍŒ6R‘ñ(—<ƒÂ1¿+uÂÊ¡8î¶{_ Â8 Òjol=j¢DÉç„%ûÂÆc6„JÂäÏÈ›góåØ5e¢EFZ⸞iõvšþ1©pŽ”Í ¸ö¾¼È™$PKÚzeHËpxºnÖ~§+sÐÝB‘èáî“°ä^lóЭð0ÞúÐÑ×™*ÄÅxë]R¸[Vض&i¥[m0Q¤S‡›5dˆ`Á€AÓ]:#tÑô}¾Ê‹¬!¥ôÊ=qá‘D"Nõﹺ©…D“ÃÎWPS=@„ÖœÑ>4¹F‹¶—ÓH¬èÉ8 cF_¤ +/^,Ý "áfGä*Cða_ð€ž¼ Û ÍÏ ÙŽ]Ñ?U/¡=FÑÆñb1œ±°H71·eŽç< o¬¼à!«m)#´•,²´ÔèŽOš€žžëÕÙOé|-“Ý æÄ|bÙaã8@ØcŸž0¥:F”éš}Ⱦ%'ÝðA†–c%УK ø™äÔ «@òŠÅ!×KÝ{­Nû!•E]ÖFUêQ¸"S¡µRÌ—û™—<Y(‹Þ!Ø…Óo-û°Sí†OžÀˆ ÒÝ +ËY_¯ÉÌ›H×v™ÝçUäº`×vgá…­uw/Æ23z4›ëÆ2¯s7ìW&€º+-/½TK F­( +µbAm¨$FýþºÍcÏ‚P—àU¶ð_™xV(àM÷èê`¸Xw?Ëä¾ÍU›+w:ç|]yÖ/Ùj]X7KÊ%ÖN&Ó±iÒaX)”ЧÊ|ƒU™™~EUHýÍX~ë$ LAK—ªKo[P+©@"f…¥òßÁØ«Ÿ¥ÜJÍŠÛªC¬è•3¨T]rB—ÿ`TQUw›5éàž^.±JµŸÐäÀ,ÈÔ¥…n:ýÐŒW!2ˆà\ê.^¿"î­)gJ%[Á#0'IªM/X¿¸ì,cvzÎÂåñ5hD]=®¼„v© ¥ÕüÎÁð;6&O‚p>ñŸíŒH’8Ýñse‘ù›j[ÀÐl_Ó ÞÌøš¶cî]~ˆÎp|W¿éHH¶ó¡ý'è³jµ-ŠÞã ×—ç¿:óMãÿ€“ò-U'^GK¾¦z÷͘¹›þ”Á; +›1¸ÜC¯.‰}~©­mÖtãá>}?î +0{× ª»ŸŽb¯>´æøµ*P·›Ú_ýF‰s‘ïAt$§WÇ)?®ÃMPÐH§5<Ùqnë ÖT7DtùÌ}—CuB_}Û¥»¥€nºÛƒnwãÏÅÖ21guÈ¥€pvÂÏ—/O(/UõX5K[§k[wW©¸œÑú^·ÿQPB²ƒô}Âȧ}âÔiÀßXgRÄF“·}í:¼õ{Wî¸Â¿PøgFÚluîäz=wIÏ3œ€Cƒ»s²2=ú)CR¡B±Ôé)ÉýËz½|9vÅø·ÿt쬸ýáòâ_Ôr[íå•üß·óO|qÒ¡À?ÛŒ|ù º½úËÿéÙ~º‚’B'‰ÿ„¤!±'*½Rh-­w5ïþü³¯úÿÊì~Óendstream endobj -1156 0 obj << +1166 0 obj << /Type /Page -/Contents 1157 0 R -/Resources 1155 0 R +/Contents 1167 0 R +/Resources 1165 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R +/Parent 1158 0 R >> endobj -1158 0 obj << -/D [1156 0 R /XYZ 85.0394 794.5015 null] +1168 0 obj << +/D [1166 0 R /XYZ 85.0394 794.5015 null] >> endobj 258 0 obj << -/D [1156 0 R /XYZ 85.0394 731.767 null] +/D [1166 0 R /XYZ 85.0394 731.767 null] >> endobj -1159 0 obj << -/D [1156 0 R /XYZ 85.0394 703.7216 null] +1169 0 obj << +/D [1166 0 R /XYZ 85.0394 703.7216 null] >> endobj 262 0 obj << -/D [1156 0 R /XYZ 85.0394 229.6467 null] +/D [1166 0 R /XYZ 85.0394 229.6467 null] >> endobj -1160 0 obj << -/D [1156 0 R /XYZ 85.0394 201.8883 null] +1170 0 obj << +/D [1166 0 R /XYZ 85.0394 201.8883 null] >> endobj 266 0 obj << -/D [1156 0 R /XYZ 85.0394 144.1965 null] +/D [1166 0 R /XYZ 85.0394 144.1965 null] >> endobj -1161 0 obj << -/D [1156 0 R /XYZ 85.0394 118.9605 null] +1171 0 obj << +/D [1166 0 R /XYZ 85.0394 118.9605 null] >> endobj -1155 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R /F14 729 0 R /F39 885 0 R >> +1165 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R /F14 737 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1165 0 obj << -/Length 2262 +1175 0 obj << +/Length 2474 /Filter /FlateDecode >> stream -xÚ½koÜ6ò»…€~¸ÝÔ+“"õ`ûÉqlŸ‹KÚs¶8Ú'k¯P­´•´qÝ_3R¢lÙIϹ€ÅÇp8ï— þx'a¢"¤J†1ãqPìŽXp {—GܬÐʇz½>:¹i B•DI°þàáÊB–e'ÀX…‰ˆ„ F ÆØâþ™±¨.û²©‰Õ¼ÞÐàÇ.¿ÕÈ/`V¬"*É¥ÁwÖìvºî;:´Ëï-šý^ç­Cy·Õí’g M+ý6ïit·-{ÝíóB?ƒ t´ÑgÔZÑÔHÿí¡ÍGp¥Ò!’ŽÄò4T"ʈØU×ßWp•v” !]Ÿ·=mÜ•ý–û­…íïZ)¶y›½n;Ú8yEë?³˜uUÞma:Xãe„Š`šþ¯NhÅ`€Shy "D,h®q¶x­‹üÐé3ª8&¿JAp‚¥‹Ü 'Àã¾Ò½®ìæFWå$¾¡©¥‚%x¾sg‘Œ˜_òÅ€¾ÈkÜXp Èbë›áR,MšÚÝÓgß´¤+³ûÁíMxŠ OUY[«h¬!à øƒ±ÊÞª¾ÜWOt4ŸN5M4 ŽÕMO;7ЀB$N,.Ìõ°ªÏQœÇ8‹É8pùCSUÍ]YßÒ´´x¤óªÜ8ü¤A0 ZÊÁ=Fúædd]tGÞ¤GËo;ëY¯N¾!ï•|ê½¾Cœ˜;âP¥i;a*¹õ+³ánö6Ö[ä/Øá¾æzXÂ!ê¿9},Cáœå>FØõeUÑpÿãpÛçÀÔDX_‚;443¯‹¦muaÉÉû^ïöľh5Æ žb]0fq’Íc©ôÖ‰ú•€hŸ )§¬=&´nè[5õ-[K´câ~†šˆ È#韠æA*XEQr™A&ŠT˜e©"_ûúëÁÛ¤ò½ fÖHph-FdÁ8À8kyqç''ôõã¬AçB$M){™KÁ§êƒCÛ<¸G;84«ÉÎ~{ß­æ<¯,ò -ãab¢ Fd‘L\„EEplB#®Y"64Í ãäM×Ñ|Œ]8˧wtßÂ8‘Wam›´°MmUs;žã.LLˆœq·™€yLcÛqÕ…WN(jùÑƨ$F-MҚ͸.tÛØùlL¢PxÑV_iV<28´sÍßíÃÜŒ~ݵƒã»ƒwÌÇ4Óuíˆj·[{¶Ÿâ°ê øÌ…Ïĸ}«?–Í¡{ì¼3E™çï·ºª|D·qšØëÖîY*­Ü7 AÉèƒnGÏú”–á;¡ eA…J¿ša&¨i )¯» iææò¶¶T Õªïï3 ,OÁ‚µ«uMðwFgtþ`$ï¦%)Ä:WŠ’|f«?å™Ì_ëÜ¿õ/ó¯^às}˜ˆY˜BAùYB¥b9߈¡Y¦ŠÉ§qÑ9¸ìИ¢Þ( Kê©_C&D¡Hy‘†Îtþå9Hœ€Å‰S°òSM´¸6ÿ¡_MøâjG‹Ë‡¢‚KX -È#%€h‘!-Áo Å¥ÈæG¡˜…“«Þ4Àbàqé¯|̆KhUG;‡n Ò@KÆk"mìQì¯`´°Ès{ŸKœæ€iÐìvô½_F†¶¹Ã‹šC…>–&*`ã–Óô%m®†õ¥¸„ÅCÊÉ/qÇãO—õ<ÚbÚí5`º&X°×Œ]°aÛvWÔ„öz¶˜™u"™¨0ÊTX3ý–>«L|Ïx™_N)–\ù\†B&‘ÿúEä‚8qÏGöåãlîéà¢t…Ñe›ïvyûDªÍÂ$UÂy_nfß$`¤èóøi"¸Ø•I¢b²|š\rMìkáp9e%dºxÿN;8›‚ñ¨Åè Ê?ù¤!˜œ»\OR}<¾'àĦøضõ8Ò•ö íËb1-:"p/90FJ›ƒ@{.ª¦£¾ön fІW¦oMË‚ËžtfèǼŸ?xº©šâ×ibï7«Ññðöä*ÞÜÊ«ÎU -ºÝ•unÞK¦=·½ÊôLÚ_»rÂ!ˆÙTáoï{|"Ñ›oúg–† R—жIÆ?Ç—„_â «‰/ýo§¼Ì Øî¹óQ|p'8³e Tª ã©lþ!ò‰Èx·€ö9å”2ò¢šñNÎ2èHS›7ô¼i"i¢L¼„Qç;Ó’ÁÊÕ´”o6¤ƒÎ‚îò¾Ø…ávN‹aJ*[‹¬(:5ï=õvÕœ‘oªM¿ÕíÐOu#p -IZòÀ—ÇË$ŒºŒy’Ž}>Jwâ)¥1(SR™|Biʉ„îÚ6U÷š+*ëÝðÖ;Ș¶P&誛> ÞèA¾Vè7÷cqO×údrÅ°qÅT[oŠâ iQ‰pÄú²*ûû%ç|ñŒ=ñ¼LàÿGª8„*ŸW¡RL ´„˜}ØèOêÏÂu“hé½ÌÏJÌ#æK ì‹Gªjo¦øóCà˜Q#÷«¾ÿ¤´º½.J”ŽXÂÌ!ôæ5œÝPB0Š?¸C2‰mEá›À¡ .†‚ƽ‡ÙÍf5W¶å^tè†,µ~uù´®<9¼L°|+ ,ˆªÐ@$s?y±ÀQüâØÆúQ‚{fYä÷bžÃ§Y(3@"À&•zB>j;Ý/qÊ#ý¿ÚÕ.endstream +xÚ½koã6ò{~…~8{»fH‘Ô£ý´»MÒ·Û^6ÅáÐ8ÅæÚBeÉ•äMÓ_3R¢åÑ&Wˆø‡óž±˜qø3³8‹²Y’)¦¹Ð³ÕîˆÏ6°wv$ÌÒ-C¨·—Gǧ2™e,‹£xvù)À•2ž¦bv¹þi³ˆ-Ÿ¿ûþÃéùÙo‰š_žÿa±Œ4ŸŸžÿó„FgoÞ¿s±XŠT‹ù»oßüpyrA[±ÃñöüÃ7´’Ñç¤'§''Þ,~¹üîèä²Kø^Á%>ä·£Ÿ~á³5<û»#Îd–êÙ5L8YÍvGJK¦•”~¥<úxô¯a°kNòOpÉ8š``$¦¨3ËH: +`a\áœÏ¿1?sUEWÔ=5¯Ö4ø±Í7ß Xe€•Ï–‘b™Êâ{Wïv¦êZ:´ËošýÞäGys½5ÍB¤sC+Ý6ïht½-:Óîó•yAái£Ï µU]!ý›C“/À•Ò0$‰ Ëd”±Ë¶»)á*)#8ì)—RÎÛ.o:Ú¸.º--v[Û]×´²ÚæM¾êLÓÒÆñ+Zÿ™kÞ–y»} sMè`M”e*‚„w¼:¦‹N¡æy$ˆ± ºêtþÖ¬òCkú— –iMv”ã$Oæ¹g4NàûÒt¦t›kS;àøš¦Ž +ãù֟韈dDðø…˜÷èWyEƒ+9l]Ý_ŠŒ¥I]ù»súìë†dew?ù½Ñ›"û¦²¨œVÔNðü‚Â8aïeWìK‡'Ú[’OÆ’F’¤ÀUuG;WГ'ç§özX5¿çÈÎ×8Ó¤¸ü©.Ëúº¨64-Þéç¼,Ö?IÐô€–¢7¾)ž€9S#Ù‘5™Aó›ÖYÖ«ã¯Èz•[ohÇöͲ$‰a‡%J’Y¿²þæ`ãr‹ï‹Áwø¯½΄pˆrÅoN÷ 6¥¹w¶]Q–4ÜßÁØß6ÂÙ?jĬ—x*šW«ºiÌÊ‘“wÙíû }Qk¬Ü÷tÉKuœN㨠։ú¥oŸJ¥ÆO»KhUÓ·¬« 8[G´ÄÍ5—G’?AÍ­P°Œ¢„ •B$Š2–¦IF¶öå—½µ©,´6˜9%Á¡Ó`‘ãý¬=øYœÓ7ô³w‘4¥èe/›ªm}ëãáP­F;ûíM»œ²¼b•—ècëeÐ#ËÄ`ý",z/‚cëqͱ¦i¾²F^·-Íß…3¼x|Gû5ŒcE~Ö¶ùg[WnPÖ›áÌàwab]䄹M8Ì×46ùj;¬z÷êÝ y­ÐÛX‘h´ÑÂ-ô–‚;o‰øÈ[>Å “v>Ï·,EdqoŒ¿»ö9¬ð×ö¦î^0¿¦™ùl*OT}ØlÝÙnŒÃ bÞ„ +ù ðjûÆ|.êC{×\'Ò°Àæ>nMY†V‡†â%±7ÛsVS8­¿©‚ÂÏ'Ó ¶ô˜Ýöºšë„°!…`*7Â-¥_L<&Èb )¯»+tböæbS9ªúü4´pò’’³ –Ç ÷ùB¯³Æg·ÖîÃÁü¼8³ÈÛq +ÞÍ'ŸÄŸ¿¢÷‰cÅß«öQxëߦõ_8Z˜†:»ÛÒ÷fYÚ&ÂÄ5^TJŒâZY?€ÅYNÓ?B»x 3ª=q „D]âNð"<]Tk°(}i·ó`T €­Œ`Á]3TºöÙ®‚¢B³3“ ˤ©8cQš¥3§¦Ùó5m ìTèY<Ï.ÇƤx¢Â‡PLª8 +;Q¬€4Ñ·ˆ\wãÝT{à´ðÉÏY“ïvysOpMYœdÒ_Væú0Êès·ýK\l‹Ö†M±q¾VL>œÆ®#@8†(¢’ùÇ[pÆù ‹GF¯PáÉ{ÁFqí£§w=ô p₺v¥;ŽLih×½A,¶ G¾[c¤´>XÔçUY·TÃÞd ƾ•gó÷¶,Áå€;ôc¤Ïoõ€®Êzõë8”·‡«å€èuß_òYmv ò²õ¹ivE•ÛžÈ¸®vWŒžh,\ú"ìh>øíÛÛÃÛ fýÕmûLÁ_òd&’Œ ®ã§Ø’ÌÀ–ðjdKíT# ûµ4ïøâ–1»'-…Ö§åt³2“L¦¬;á,‘ÄÛ|UN§à)‰ Œkê`ZGgÖ]B|¨ò­º`åüZÊ×kAë@wy·ÚZyáv 6‹ý®,I6ÙjEЉm5vT¾•S:Ú·Mënkš¾djï:`¬†ª{²ãy FQj'EOGéOÜ'3%Y¤¸xDf*fi'½µ6uÙ>Ar«ÒYEÛ·s{Ó²S¶ãîß•éùë˜~u3dótmH¦È8 >•jªõj‚8¨R²Xzâ]QÝÍB1@†{žÇðÿ§ ¥€¯²Gd(KA©Z^û°6ŠÐÁµ#ôߧ™ÐóRL{ygÅÈÓUüÓPiDLY¯ææQ†µ{³*A–g1·‡€kP’Wàvv}ÁÉ áu^bWÂ7?€žCñ»ê³ßør›õr*mŠ?‚4èÐö¡êòãùÙâ +8ñR~ŠÔˉ+…41VÑÃÒÊ bá1ý´Po6øþ?'/™@>as¹î} +ùAóÙº|X¼6óP¾Qa ¿} ç,,!ØAÁßÚļ¥Ÿ+LÄ™v2©÷² +Øð²¢zAËÒ@«–x£D3ži +(åuc&ad#ÊÝ8 2DZo3QŠp-øÁ8‘ȶ^1°é¢M#ð»4Î8Êb³í–×?´á©K«¸²Î]‚¾L¡†‘Ù­žþnøSó ú#ÍRÕØ2ù¨ìStÓÄý +ãyÒUà SÉSûã°ˆx6õË5Ÿ=Üžú;ùP"*pOi…í–€eIÊT +H¤fˆ 9"ÕÎ’ÿAÝA¤ÿC9 endstream endobj -1164 0 obj << +1174 0 obj << /Type /Page -/Contents 1165 0 R -/Resources 1163 0 R +/Contents 1175 0 R +/Resources 1173 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R +/Parent 1158 0 R >> endobj -1162 0 obj << +1172 0 obj << /Type /XObject /Subtype /Form /FormType 1 @@ -4095,3034 +4110,3137 @@ x 6\>RgÈbÏWÖ¹j[†› WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream endobj -1166 0 obj << -/D [1164 0 R /XYZ 56.6929 794.5015 null] +1176 0 obj << +/D [1174 0 R /XYZ 56.6929 794.5015 null] >> endobj 270 0 obj << -/D [1164 0 R /XYZ 56.6929 769.5949 null] +/D [1174 0 R /XYZ 56.6929 769.5949 null] >> endobj -1167 0 obj << -/D [1164 0 R /XYZ 56.6929 749.9737 null] +1177 0 obj << +/D [1174 0 R /XYZ 56.6929 749.9737 null] >> endobj 274 0 obj << -/D [1164 0 R /XYZ 56.6929 246.2071 null] +/D [1174 0 R /XYZ 56.6929 282.0726 null] >> endobj -1168 0 obj << -/D [1164 0 R /XYZ 56.6929 214.3631 null] +1178 0 obj << +/D [1174 0 R /XYZ 56.6929 250.2286 null] >> endobj -1169 0 obj << -/D [1164 0 R /XYZ 56.6929 155.5938 null] +1179 0 obj << +/D [1174 0 R /XYZ 56.6929 191.4593 null] >> endobj -1170 0 obj << -/D [1164 0 R /XYZ 56.6929 143.6386 null] +1180 0 obj << +/D [1174 0 R /XYZ 56.6929 179.5041 null] >> endobj -1163 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F62 1050 0 R >> -/XObject << /Im3 1162 0 R >> +1173 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R >> +/XObject << /Im3 1172 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1173 0 obj << -/Length 2334 +1183 0 obj << +/Length 2134 /Filter /FlateDecode >> stream -xÚÍZÝsÛ6÷_¡·“;%Š/â£}r'çNâö÷)Ídh‰–x¡HŸHEuïú¿ß P”MYv­Îdü@`,»‹ÝýAf# -ldRB…•#m%I)KG“ÅÍ`ìÍ s’8)éÏúñêè»×B,±Š«ÑÕM—!Ô6ºš~Ÿþóä—«³Ëㄧt¬Èq’*:þñüâR,~N¾x}þæ×Ë“c-ÇWç?_ ùòìõÙåÙÅéÙqÂLÊ`=v,x}þö [o.OÞ½;¹<þxõÓÑÙUw–þyî ÿ9ú𑎦p쟎(Ö¤£5t(aÖòÑâH¦‚¤RˆH)Þý«cØõK‡ô'¹ œ[1JRJ$c»wÅ(ìš°Ò:9·7MK‰H…3‰”„Zº1 g=“0Έæ6éÔ%¸ð6)ëÙ¬¨fN70_ôçSC˜Ôn7±¹Í'Åo”ò¼­ -=^ϳ[í¾f³IC¤´ûµRÀÈR ×îøpEŠI“LæYUåå“® xz ÜPå(0Õb±ªŠI0”'Ev¾ç"³ûÎòÙd’7~P»Áð)¡œ‹=ñ?éæmçßî\˜µ§¯C™5Êðt–qÅn³ -E¤•û¬*)Ô²T…êÃߢýe^ºòe›!¡=¼xîÎtÏu1ÃÏ-VNIw{v5ÅcÊßœêeŠú{uÏG³/“)jå©Ä"d¹‚œ0M>çwÏKgNkÍدÇþ«‹÷ïÏN±í>¢Ðž¨‡Õ(;¨F07Çöh”)Â4ÅÜò¥È×ÏÖdpM¿Öòñ#ŠëIô5»"¥üloR¦’pJT_§üEŹµ(­'Í¡”¶¦û®[cðÚBºmU„YF¤VG¸&To#äHYPE · uª}÷ì"<5ˆQš¦`£½Â¯æù@Âc–€:¼°ú -MDÀàJ A^"í`ÑîÚ ‚°¡LÇtÐÕB±¸½‹á¾Œ­Éd‹¨j’oÂÿPâ d]j¾q.Í ÂàÒ€ )˽˜°ã„Qê@[‰üÞGÂSÉ2[,²×dÿ¼ÔÕÄJ†!Ø3PÈ)q•öþë‹Â˜Ã·ê…l:|Ö|ZdídþÉ£üîMÆkõçC$xŽJMw ¾ç@¯ðæ›,‹-4~uï »wÒÝ®ÄLt%·û@å+aï›Þ=Šjšb擽ôË}š»Åu]ì¡V]Ë•v~Z¾ J¬ ýz5ö:Å1§XàŠšñyØj†5´ŠØØð¾A¤°ØävY€ÜaZJ@Ü3Ül›µ¾ jÝ’É»6Ê”R/Só=Åèø$T¥þ©oTðÖMÜ@þ“Ó·M×=Ô8$8^ñ‹º…#êñ/QB(¯ GÙÆ aܘæŒjpÔŪ <®%Æì)’×E;ª¡µ„ÖúŽ ÀieŒ×¹CIø æ6*ÂÆ“(=J œâ§H"?ïÏ~pÐÙŽ«:Ü Ϊ™yÄÖ ‚·ãÚ›ÀKÌEÝ‹œë”e½Î§ƒú¾š‡I7µ›å"§ï:# °º^e›Õ÷÷c’h­ùHÀ-O|xpHª´~n:Z¡-"¡ÀÇ’ÅŠn¸ˆ`©#ÁBŒænÀk¬õ¤1 ½sÜ­ f^7ƒ°ÚÁ.ˆÿ}a^ZC¢Œÿ-:£nµµûtF!U•"Z.¼QZU?Mg=a¥³>EDq èÎXµGg*2*X|ìŸd¥;þ3§Ex§×||þˉ$L¢HR´‰¹q¡Ï 0 ÝUÞ®ëågìU›/o²‰ó ªíG%,Úyš;€m‹Ý¦ëëä¥Ï ÑtPpNŸ]âŠÝ¦,«”Ùçî\9ÈË6–«ò¶yºå˜•>°@CxŸG’+ƒpGЦ~d‰_4©ëÌåÈ7q|=/\.u¼e -3ô"8w? p&°xa|cv‚‹ïk_ŠÀ dÒà´iĪn±q‹•Âð–bVdøYû*- †uÓ¶YU¾Û£¸ L}¦ÿ)e^“Y;o°ï}ØÑ°|Z[>ï«.6>¯p¬Yùò‡£”@˜dMþíà3œ& -ŠÉ–ì6uÒÍÝ®Á:ð°è¼îÞDÙ¡dß.ØrÿKÐþí« ,Ù>•½Ü¡SnD_ÖERHp*F\ÚÞmxÙ Û\ÚçàÜÃÌÅÜ”§ ‘ jµ'â\f”å[ï=ô¯†àì%ï0È¿ûã›ÿs‘Ôy©–›_<—  ‹uà–×}ÀpÅZlù_évûÉ»—ïüY0A` ‰–÷ú& !ÓÞ€«úquØå¶^¶ïMçc¡®"'ŒS:7qàO,›£mÅÿ Ù¸ÂZ×Tvõ,´&šµG+„­etpþª*~'Íh` ¶ªÕâ:ê¬×Ulöɳe½º}H~Ö‰îEÉ¢Ý;ÊÐ?Sˆ”¸ÿ€ø×:Ú[9>õ-6ÿ…VÆðá—¡îf¡Ü™Dú  CRÃõ€èÿÚÄ6endstream +xÚÍYMsã6½ûWè¶òVˆàƒˆääx<§fœÄvN“©)Z¢$f(Ò+RV¼»ùïÛ$ʦ,;ÖTmù  4¯×´pøƒ4a\Ùx`lÌ.’Áh~ÄS{w$üœ(LŠº³~¸>úö­2ˬ–zp=éèJOS1¸žþxòËõÙåq$>Ôì8J4þp~ñ†$–~N¾x{þî·Ë“c¯Ï¾ ñåÙ۳˳‹Ó³ãH¤‰€õÒkرàíùû3j½»<ùðáäòøÓõOGg×ë³tÏ+¸Âƒüëèã'>ñ:âLÙ4¬ Ã™°VæGq¢X+$åÑÕѯk…Q·´¿X*&¥Uƒ(á,b÷®´‡]}VZ´s{ÓHˆ„©D¡Kâ˜qË7.‘¢ã!3Ò&“X¦•TÎ'ó¬ióEƒØÀ|ÕÏS&bƒûàÄqþ;ç²Ê›ãH™d˜áO<¬²y>&IÐä:eÑ´4cR/HTT£rÙuº4޴˯²òšš2»ËÑ"ØŽÇl’Hgÿë*'—®7ÃΨ̖MÞ°‡N¸a©ábÐæu`++Y"´DaÂ!ý'afÊå>ÿ©Â:HêÛ }†ÿFuÕ.ŽE:¬K„ͦÃiYßd%¶í°Éwù‚ä0]=].²Ö¹ '„}Ü ç)l4yÛÐø8Ÿd˲m¶ÝF÷Þ…:ªng¹o6mÖæó¼jŸr[C¹-„ÓóU†»Ý@K¹÷ÖžTíñpïušÇc<_´Þ×yä!wí!ìxaF?·¹s}´v3Èn²¦x +üÍ©^ÔW½2:™Àö€¯­ei¢cBÒS1j¢Ñ,«ª¼|Vúƒ,ã@Ä ˜h N˜Ï—U1ò.p¢ ÎõÚš~§yKl4Ê7hpöìÚ+cÁ¸3hOJ®M‹Öó¶®Ùæ\»½ÚÅëÿøJi#¡e÷Ý)mfcMÇoKxÆÑ—üþeÏ^HéЭ§þ›‹««³Sj£Â'í˜z¨‹ò5Õ@7x¬ö!ªÁÛ–ÓÛrWä«#é3Ž[kåð à:8qPàâ”űÝ÷(ëD›LÒ Où›ÀáÚ'@ëXs(Ð6luýÅ5V€®-úû÷VC„,6r™4Œ›mÚüˆ>+®Y*-X­X#;~Qê5Ð\ÉGÀ¯gyOÒ– Ö;¥¬§Ó¢šöxO¦4xšæ!êÕ¥ò÷nn¦à\˜ðʯ¹P ·÷á/Ck4ZUòÍ«ÞÇØÚ²5yž`HK¦-¼ðG!81,£”TœCŽJÒw òõÓ"›Ï3OWâîy9¾E‚ìhÒáëE½ÿ8RÞ‘-FŸÇ x?ϳv4û쪜=˜Lþ¯ïû6Ä9Úß=<Üs 7tóŠ y"F ßšlÚwwœtw(‰4„îÞ“|­ìC×Ãî1”@MSL‡‹]‰…?Íýü¦.‹õUl!½pÓ*ÿ P?qëõÐaJc,TËŠ§Ãs¿Õ”¨%´ŠÐØèžP¥0ß2ävQ@ÜS +.ò”Š™LeºíÖzâaݲɅ6ÙM´©ùŒ|x♑«ÿ7… + ÞãDjþÎ~rú¾_ÁÖ¥†aVIã6¾¨[8‚RÏ,à +TiJ¶ŒÁo Ž¡1ÿðb‚¥óeãuÜxIÈÙc¯ŠvÖÇãLÊ,_'ú !hãnr¬’Ð:Ú¨ð‚õdFàÇ$¢™¯fÄìóï±t¶Ãªö÷ÇB°ñÀ-°ÅŠH¬vZ;ñ: ±„·(˜â:eY¯òq/ÞxܤI³0sº.:©GÕͲ(Û¨¨¾{øÀ 3cŒ„, ùH‰ç½FPÕkc^úõ­ +vðƒ’/¦HÕÔN!¥àUPÌhésiuß4V}OÂ#ôxí³Òß—YÝôVÕÈ ýwy-…PLkÿ*˜ÅXÂ+µ3H)7ßU?ïz´ª~fc…Ù«á5f«;®öa¦°–žïŒ²OÿÜŒ‚ìŠ7ÚÈáù/w1‰è %‘ö¢MÆ ÝË“(ZAPåíª^|¡NQµùb’Áð êû¤Ô†¼ÓÜCÑ6ÂsH^[ðÏÝH%I Vìôœ4šÅ©Ýí ^a6®«ò¶y¾ë„]b†r1O"dA4D#äT7² _ò)Ž­ý…âI_Í +|Jq‚s ÊÈ5}ßqg:W(â.BnüÎè»âUí˜Ì % M×$¬ê–·Dî \Š±_‘ÑÏÊ‘hh´0è×sØf^T½—)¤d앺‡þO’”yJ¦í¬¡¾ b”£¨éƒZ[AïH—žW4Ö,û‘d%FY“Óû%È0 \r]•ìvu´ž»uC6µÃ¼›ðÖ'ØMoû6_Ë›oHö‡#AÄؾô±^‰Å©LU×Ö%æô½†fî¾µÝëðº+¶¹µ/)sO,Á<‘ þˆÁ NŸYæJöµ•Ò;ÅOø–H¡ŠN즦S¾rŸýé“ÿ ;v&žŒl´lê¹@·.ÑGšW¬¥2v/»ýìÂËuþK*„b‰‰12«Ä©ø§"¥$ý´Úïr[/ÚµîM瓯A‘ƒ#!9ï«6ià/bÍ!†¶Žä¾'5ø¿{P”ú] +c˜á©Þ¾‹PaŒm-ã½(.«âOÒ ê jA£VµœßäÎzU…fW<]ÔËÛÇâhŸiâ˃´¯tïûï«JXLáýððÁ^ZùÜÿÌnþm .Viºã«ÑúÚy£Ðr•<ÊR*eI*MéÿUÜU?endstream endobj -1172 0 obj << +1182 0 obj << /Type /Page -/Contents 1173 0 R -/Resources 1171 0 R +/Contents 1183 0 R +/Resources 1181 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R +/Parent 1158 0 R >> endobj -1174 0 obj << -/D [1172 0 R /XYZ 85.0394 794.5015 null] +1184 0 obj << +/D [1182 0 R /XYZ 85.0394 794.5015 null] >> endobj 278 0 obj << -/D [1172 0 R /XYZ 85.0394 537.224 null] +/D [1182 0 R /XYZ 85.0394 585.0446 null] >> endobj -1175 0 obj << -/D [1172 0 R /XYZ 85.0394 512.8844 null] +1185 0 obj << +/D [1182 0 R /XYZ 85.0394 560.705 null] >> endobj 282 0 obj << -/D [1172 0 R /XYZ 85.0394 444.1158 null] +/D [1182 0 R /XYZ 85.0394 491.9365 null] >> endobj -1176 0 obj << -/D [1172 0 R /XYZ 85.0394 414.002 null] +1186 0 obj << +/D [1182 0 R /XYZ 85.0394 461.8226 null] >> endobj -1177 0 obj << -/D [1172 0 R /XYZ 85.0394 336.6639 null] +1187 0 obj << +/D [1182 0 R /XYZ 85.0394 384.4846 null] >> endobj -1178 0 obj << -/D [1172 0 R /XYZ 85.0394 324.7088 null] +1188 0 obj << +/D [1182 0 R /XYZ 85.0394 372.5294 null] >> endobj 286 0 obj << -/D [1172 0 R /XYZ 85.0394 175.0326 null] +/D [1182 0 R /XYZ 85.0394 206.4979 null] >> endobj -1179 0 obj << -/D [1172 0 R /XYZ 85.0394 144.8676 null] +1189 0 obj << +/D [1182 0 R /XYZ 85.0394 171.8379 null] >> endobj -1171 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1181 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1182 0 obj << -/Length 4254 -/Filter /FlateDecode ->> -stream -xÚ­[Ýsã¶÷_¡·ê:C|ÀÝÓõ¾êLsIv’<ÐmqN"]‘ŠãÎôï.I ²œ¹? `±ØßîÂl–Û©"+,·3me¦r¦fËíE>»ƒ¾ÌY„A‹ñ¨¿]_|÷^è™ÍlÁ‹Ùõíh.“åÆ°Ùõê—y‘ñìÌÏßüøñýÕ‡Ÿ?½~¡åüúêÇ/\åó÷WÿxGo>½þá‡×Ÿ^,˜Qlþæﯺ~÷‰º -?Çß®>¾¥K“~z÷þݧwß¼{ñÛõ÷ï®ã^Æûe¹Àüçâ—ßòÙ -¶ýýEž kÔì>òŒYËgÛ ©D¦¤¡esñùâŸqÂQ¯ûi’,ϸ(x‚’¥¨lV.ÿ÷ -÷ðÝ{ÎfŒeV)ŽCs˜ÕdZæ&rYãò<Ÿ/ۦߵ›Ž8ñ¹/ûj[5=}¾­~ÍsÞÔ}Ý6ÔR6+zù¹+ï*¿–QK‰<Ë Ø.u½®"Aà ÛWZÃ`I8žM+€ï4®ˆ…¯ªå¦Ü½`f^õBû½`C»¡!ËuÙ4ÕÆw÷-µÞTôÜwÕŠzn©¥{ì`j+WÛº©»~Wöí®£þ0Ãt!œš¶9[y’§g‹È} ¼½¯`âa¡çí->û‘khÊmEM]µû½Ú¡tf¸Gþu¾o²(þlØv{VPm ßpka±ãƒ9ÈB.=ƒwÍj™8.2&´ñƒö}½©ûGšBt7~½e»Ý‚x¢ ß±Ep› ÉÌ”/Q˜ˆô~WW¿WÔÒ´ÍâíÇÏãîn¿é½˜Þ¶^&ýOˆ‹ð6æ".2ÉY&½Š¼nŒ`*3@°ßcÝT}‚ ^ ãc±çÁ£´á‡™×5–ôyýæ'úîÚå—ª§÷ ˆWÕÔÍ)}3É4t÷Õ²F „ÃL(‘,À:¨@òý¡ñÒfynĬà*“ÆÏ1_vhLÚx-⌋ñ”Î2M¥JÁ![͆•‘Âûv—b*œLnƒ)p*ò|hø­aâ$ ¤»­At¿ âŒgX •ÎXQè) ÊÕjw‚‚ù]\ÂÆ…˜?¬ëåš”GB¿Êåò,Kä•1Îœq’濯~ú]RK»‹-½9œ2u``$W'´ÌãZžd,çè ‡í1phBʯflœq1žò˜± ™aàã°§+2›ËÀY°»nÈÄ‹K ‘ƒ³eàÍö×ÄT&3 -ìúhÔ¯¹ÊKPà]Ý}wFvz¼¯è¹÷†ÍcdGOoÎÊÌêÍjI6|åÏs8«W$œiQA`Á5ÕÝ‹ós -§rnI’§ƒ–r¹¬î{òvÊ)ö–Í£o¸¥§# _Èþ¥£qD¤›g ©B* À¨–Ï[ê'ƒF¿¢UF“’z‡½z=ñ Ã2  ‚qôgð’#þH›i”>)­L˜ŒÂT‡ãÿZa .Æ3Ë*“ Œ€5ÃÂOɪÌrV¨3²ªAgý—/S.ʳ‘† Ž+²[bÞc»Ѳ6H4µÍæ‘ÞÅǬµ:Bó³A*£F6'$!‡Õ6í²ôË­Û®GêßÁÈöþ¦\~ñg=ˆ—…§RBÔóD&˜41Ë•f,A=àhP@¨ß¥o -%#ãSÓ€nZÁ‚ðÀHÝA Â#ÀJ•>·ÎDÃ˶ü£Þî·¿,÷;ÄXŒ1a A2—ÅÉà¹X¢§ó°“EGîóòpŒUb:A#ÂN–;ØNØÊ8úú•s™`ø+@ü`Ɉª“FTeVëb6åftsƒ?kZOÚM5P40*! _F³ÓÈ™å@˜ÂCUøzf\Œ§L@ ïŒóaå' çÂì ´™ ¨ˆŸøu0¦åGáhj{o~ë®Ûûþ†;p˜†®ã€I£ôêfzÁæþ·^œ/£¹yl{"¨Þ£F•›Mû²/( ÆÉ@±ÈópÀ_ªÇ.m9u!ƒªCP¸wÞ‰°`vÅ"NLÆ›±ËäJP£¸·DÐ0÷ØÁ= b-èàn[÷äãáó¦ôBË Íâìé Xƒ:Èpêh켡›Hpa3=Sœƒ ‚˜ù«%8̸O™`®!¾ˆÃÌmÙ,ªFwR|C"ÃŒgˆ”9ÿØyB$”šÉ „Ö¾QÀ!^¯k/ôäÁ&‹yWoï7þ¯~ -Z™£›f'‹7`e´\h}7hD]˜§Èå¾ -Ù”Çú– -šB„¾A¨‹"~³­Œúzôf\Œ§L¡ožÒ²aegxWi$bÀÅø]T—¹ñìi½ãJ+FgÏ-;£F!pÿf<ˆ3žá sìiÅÐy¦ €‚oGd˜ñ‘¢#vcLä)ŀЫˆÐsdÜÜ5-}¯‚_g¯%ì$§’cД<㾩ÿHÙnžiÁŠtJES*…O©hJ©èùϯþE«v[Ö µù=ͯ>¿¢CrAO’ nÄ}Ù¯©+LçǤÆáw.é¦Ázh&˜»]»¿O;|«clý4øh=ÿØöž;Îi:.m}Ëý¦ìÁ(o;bâýÏûæÇÏÔë)Âè, -Ü$:þÜnJ°³p¢ðâüv×y C q Ç°;•›?Ãëa¹A›ðãþ~S»f>w:d@úh¬Ë¾CǪö1CßîýݹM8öGDiƒ÷ºïªÍ-±‹“ÑÓÊ©l@£¼°óû]½-ðQîûu»«ÿ3Þv¾­P‘ënKYaJ€‡,ŸË§;´ê?¢ÎÇÓ?44‘t¡_ÂU€7öR‚nr°G_oÃŒ‹ñ” lÕ0mqس¡ †j€Õ)sÿ`â<3Jz¸¹Ü[ÈLXLò ]”`ø -c˜I€Û«˜¯æQ˜p1žñ˜Eü†oqÔI0á‚ß`¨œÍfþ®${”} Ííi™ÀìÅôÍ7Ûoœñ̆ÑlÛ¼°ÏØ1¡d ˜ 9å ¸É${B €dEû 7f<³aøÜhðˆ“ ŸR ¸OÅLG[æÄ™MdAKÏêj¹wN>FU'ø¢p7ð ^ô²À_•ñ¢ô¹ªNÕ~en2‡†¤¾ÝÝŒ^>¥ªÞãñÄ‘(ÚÆQ¸Õ_>U[òšÏ?RK‹ùÛšj}3¡:+Y:ûÛQ| TfJLh?ª3ÇQgH†#ÉášëæhUÀíŠqö\ŽÅñçÖ?š×ùuŠß‰;"¢ãœ•gøG¡ãx¶‘§×!n„£©D+å@^yÓî{ê9D”w·÷ñ ô†¬Æ >àG&§.¹NVh\æËžÉËæ™Ôâ ­Ä0гÇyD¦0˜0.,@LÓç ²7¶×½àK#åcï -G%fi±ëåK6J36¿jhHï2Ø·,»ê’ðsœ³Üt-{X»RŒ‘§À“²+”yÖ- !£/_ÃÀM„ØÇ¢šærŠ6F籓œßìý˪­\<‡bç›Ö¥+ÿÃ[™yŽaÏ$F*P‘’4eXÉ>+h !y=pàÞSíGÑ(W¾eí·1àZübYé¼´ûÕè*—Ã=ѳÄêA©Ã¡‰E¦Ü°‘9È<8ô?9’`E²Ø!L`àwUŸ´,Å8/‹¿¤¤ã÷*UEQ( QÞ ˆ‘»Å çxþ‚ÃîU¸öèü JÆK:]XµjèÍßù¶Ðy³¯7=ÚéŒ.ë„Š%ö-I>Kò¾y¼ ÝT›.ôAÒïi.Ch""{ðÔ.CÈÌ÷íf,k°†ˆ('_ îpcÀëù¢LU¥1m'ôÔÄ3ÄÕyq\9Hœ5 –µŸ#7Ŭ¾†íc¤ˆÕëÒ—½~ú’7e?,4uÕ¤ø /»²éÂÝ2c),„vJ¯ø Gú]þtáÍ\úRæk.N‚Ñ«Ú/K6ZœMqlш@åF­ê»º§ê$, oÜÚØ\ûj¦ñ¶:׃NcëP4-üò.ü0Žé×{ßä¨Ã&G¾ÅsÓ…Rž/äv0ãÎâ!¬pÕÓäÛò ‘…ûðæZƒ«›}`®Û®«o\žKx¨-4Uß±Á]1ˆ½ÁM’“„n(Ðnè1€œ‚„h0 öó„_jwAö rôŽª•ÂúbÐË9ã CÉUÜÀn¿Ëñ7ÚÝ¿Õ`x~eLš]ï”K·2•²w‘6 g^t-×Åxi§#Ò;àéÙ!½tcýKÔæ2‚0Šâ¾ I9$QŽM ÎðªÌŸ²-€ŸŒíò¶wAÕˆL §æ]¿†ðWä=CY¹n1l6G9$‚ñu³¬(‘Ú'-”„8TIþ, e†+K …³;Ì”óxá¹:T‰w«·ô¤je$ÈDÀ÷àï«ã¶÷ ÖNIpÔÞ]„¥¹oéI Â_jf/ˆUVd“BGn}¬,Ö+ Þ~³óˆÛ§†<ŠÁâ P” <ô¬ë»µ]ÝÑ+êqWرÂúº2Ý<â‹ù¿»Üû‘¡J/ÐÊwµNAI»;¿lÐ¥ü8ñ„Ag¼¨©è‚š -ð^:ˆó}×í¤K⥛Êé&6iÝjÁëv¿YQ#ZGO vblâ9µ ,];wŽ;éýË4ϬB¬…/{ç|ÚÐÒ·‘’MN–ª ©£U#X ìèWXÅïøÄÚ<¸£ç&®˜( æ™åÑm>î‹@7T Ÿù–(Céï8ÿ‡Tó¡²qï†ùÛ8"œºmëê!.çwù3ì[€+ W9pLí¯ 83ä‰óöî·Œ›÷—•™D=Ñ2J™@bÂUaÀšó7ºdÄ÷!»vI—ƒzÛ°ˆ¿P¦çMEé9ןk¤'µüÔZžPC=ÜÀŠR‹7~e¯òËÔB o]6>=E«ò&üÖ¹Ô@ø%€9‘½ñ,®f]ú[J£¤¼ -—ØèÒÒη=¬ýͬÁ4åÁ>cùßQÊ-ÆF­êÎS<^e-ñƒ`èe$ \/ 'ƪ)ÔÂ1‹¤Šg¤vº0Á/Sâ…Y Â&çdòäœþBÀ]2î‡Cáè_¥¤5“˜ŽA‡ÿ³ŠgÚ -Lò$UÄ„Qþaˆlö«*ù0v%p;Óü»KœQÕm½©Ðø¼:•ZÆJ…©¤d‰ÿê9e¦5& ø‰,«6„ "…»Ååá“ŽIÿ?hPU‡endstream +1192 0 obj << +/Length 4496 +/Filter /FlateDecode +>> +stream +xÚµ[_sÛ8’ϧÐÛ)W ó”Í$sÙÚÍÌ&žª½š™Z¢-V$Ò'Rñø>ýu£” Û[É•HP£Ñhtÿºæ |¡Ë¢tÂ-ŒS…f\/Öûlq }?½àaÌ*ZMGýõêÅ_ÞK³p…+E¹¸º™Ð²³–/®6¿-ËB/[¾ýùãû?ýúéÍK£–W~þør%4[¾ÿð÷wôöÓ§7ÿøÇ›O/WÜj¾|û_o~¹z÷‰ºÊ@ã¯>þH-Žˆ~z÷þݧwß¾{ùÇÕß^¼»Jk™®—3‰ ùŸ¿ýÁXöß^°B:«÷ðÁ +îœXì_(- ­¤Œ-»Ÿ_ü3œôúŸfåÇY!d)2|Áyá´3 jW”RÈ$ABaŒ-×];º]O«ü¬gL´ÍÐt-µTí†^~í«Ûe3ÊÉ–±ÅJ}&i³®¶qŸ °4m Æ1‰…sjŠ!©0®™“¥[nêõ®:¼ävY÷Ò„µ`C·£!ëmÕ¶õ.tµ^×ô<öõ†z®¨¥èaj«6û¦múáP Ý¡§þHa>’¦e.V%+@«Ìb•öïîj B2,Ͳ»Á§õ?ò mµ¯©©¯_ëj^3 ”_úf“âÏÆÕawuÑÒð —';ßÉp¯Tð¡Ý¬3› dÁ¥±aÐqhvÍð@ÔQ Äwæ[wû=(I` +ú½X¤p…TÜF¹r$e"Ö‡CS­©¥íÚÕ?O»ûãnjzCrØ ?!)ÂÛTŠ8=è$·…qÜøiß´Ip]Xà8,²ië!# ¯–‹©Þ¦ IÝðÃ.›ž+ú¼zû }÷ÝúK=Ðûô«n›ö–ÆT¡™ú»zÝà„ÝÌœ"UÂÑבå»SË$•+³rQ:VaÄsl“€Z›·L«Dq5%ÍÎD­4ì²3|œ9¼ë9¡ +^0m?#ÏßZ./Š@i0Êt÷»‰ Q|BJ›‚—¥™‹ ÚlD yXÅ+X¸”Ëûm³ÞÒéQЯ™²s«²®PVÖz{&,hZøþðËWE-Ý!µ”ôæ𧩠£„¾pÀŽqaÔEÁ +0òVXž“õäš®&ÏÅ +ºQXî.ŽzLª²pLE±‚ÕõCÔl¼"7Ê £¤òÿ3CÊVƒUŸŒúiVÁé=4ýxç$^èAðM =wÁ¬ySŒ²ïéIº £âFÙå}³Û¬É‚oÂfŽõià´@–s +F¨­×è\¼—ÓHÊ;%E~Zªõº¾È×i°·jBà ==[øB^ð?zGLz:#K5jOi ½tbÙQ?Y3úÍ2!J*×ÍóD¯'ÓÀQ\ 7ƒ†è#o”Õ梪ri ر„“kKðߪª‘àjJñ\U¹â`œ'~LWUÁx©ŸÐU6 yý:矂ip ZvCÂ{莠ZÎE ¦®Ý=Њø\´ÎRñ$6pTÜv4wÁÔÍT¸´€ŽÁwh&­¯óÍ*)®¦$3*ì±5„i²¹¯B¥ós†Ñ’ß‘ÉHñ &à¡:ϘD ’;gª¥u£w”°‰WÛ&è=E´ÊrÙ7û»]Øä¿ÄcÉÐQó‹%X°*™.4¿;´¢>ÊÓätˆÙ”‡øVZŒJ¾A©Ë’¼-`.¾Ý®%Š«)ÉüE©gö–w“Ç"|LXE½ó™› ž.x®üÁ(aï…ãO £º7$ŠOÈ@*Ð9~*ƒüÁ0¬Ð`Á÷c2R|ŠI# mÐnL™¼t0 ô*øœ7·mGß›è˜ÀÛ¥åÜ1½Éé1–öñØ6挷(Œ"Ù”Š™¦TÊR1”R1Ë_?~øulº}Õ´Ô:æWÌ<¿R†üŠ‰É3K.øwÕ°¥®H.Œ-éÇßù -Ë7^EŒ*a5ê4ýç‹-cÜWŽ,Z"Æò„hð‰»ð«œà…(eÜ3ôAyhnYʽÊÐÑ…)÷rßÖ¹ØDB,Ü£~̇á2Ž¹=tÇ»¼Çw&…'ÉQƒ“6Ëݤ㽦—Ò>´Üíª¬ò¾'‘!äÿ|lþL½# Àä ÂÍäÏÝ® 9; +/Þq÷}@Ð0Æ'z «ÓÌþ;²§~ÜÝí¿Ã<$OG†,hõéwèØ4!lºÃC Ð?µ/¾éˆ¤mðÞ }½»!qq8È ¤hôøég8*J·¼;4ûÊóÕqØv‡æSÊÛ-÷5ä¦ßSZ˜2à1Ëçꮆtæáß045‘u—°_ÆW„?„&˜AˆVªïWS’l×[Töll‚Á€uJ¦ä?˜¸ ŒŠž–‹ ƒ+‰ âR•óÎ œ…uV.„7`²¿YD‘ÞjBð\@܆oqÐE(áƒßh¥¼ÁPvù®"{–z‹ÆÜe…ÀìÃôÍ÷Zl"øøjÑb;Vº§—Ë_hU¦RfG.ùaÁ»?¢þÀ0*¡û~«_­`n xÂéj/é¾¼§S饧õF+â­%®¿£gýg½>z_“j|Q˜…/æPà/ȸ%ú\×—ê¹Êª‚iiq}Ôw¸]Ð˧\%{:žä!3•ì4 +—úÛ§zOnψåG*_¹ü±‚æ–ZßÎø‡NïAÖÞ´þqh]€u’3ÞÏjÇiÔ,ÖƒïÏM{6+àuÍ®ÄÒø§æ?£ëÝ9Åí$ˆù +ÀAç±`^©žCõçÔ&ÞÄx¶¦i¤T#{Õuw¨ôÁÝí1Äг ´õ¹š—&[˜ñ)/÷DF–ÊÈ“|ÇÏÍ+¡>ƒÈ5f3¦E€Hù™GŠô`ÿ zàçUz$í3±E@§ˆá&éTdëÒFþ¥²¦¥œ&d1`"ëÇ@ë@;¾Ö¹ŠFIúÁ3¨Ü 7çôK«×Qãî}¸cØItŒ·sú8kÝÒ[¸È…m±óúØì4ÔÝÒ‰ÅJì[“~Vä~YT¼ßT”.ÍIDù¸”!$‘I<¸k¯bÈ.Qìvªk0‡L‰¯P>·¸0õrUå +Ò˜¯“fnã9"jV깑OW°ÔIÄ®±¤ýÅ)Ç4õ Hì˜BD¬\W¡ä= +4”»)íá ©¯g…ox9Tmo•YGñ ´S^%œè +Û oöU(cn±Já$½i´dT Å/à +¡”›ï⦹mªLÂÄ馅¡‘e&T2m0ÖÌŒ‡[Çr |ìÁâW·ñ‡iÌ°=†&Ï6yîð…Lžž-¡˜¢TêéÂs£÷&-ø€ßW_ˆ-\G°×|-í{Ýõ}sí\2€mi¨òŽ þn‰Dô ~’¼$t‡MvKæD$͘9ƒM iüµKh8¶(Ñ[*TJî†ALç­/ ;zVlÃõô-6HDºsxß¾„¥FË ¬àÊž¤ö{‚å +ô­Ê%ë}ˆÍã䧆³ÆL9ÚŸåHð âPA»±t‹Å‡jó©@E¡I_Å쉳'ç¶E€çàÂÿ=ãâù©TÌ®nVMØt°kÁ÷ˆ}µ9A®!Íß´v»³äÙ¥ÏM»®)…:dM”‚@T+ñ,eÇËJ3…Ô=jb"Ývàþz•áýì=©P™ò#ò݇Ë* ¹ýèµ?%8êèïÀíz’„ð—–@Ú+’•“…ÁtÐLT§§Å…Ó‚W_`óæÃö¹å…†€£d4yÒE%)C=ÛævF×·ôãšz¼É•nzbCI™®óåò¿½Ã<†‘±B/ÑÌ÷×NIéºÛ0m?ä8b‘8)ŸÁÉÿ×ã <ásä £ %Æ$*“瓱^}ð.CFó/ó¸]NªèÐY '£ïº&’»G«±ÎÅâ(œ3¢üFÎÓurpóëXh·üÄÔ^¤–ÏaÇàÑ3v¬YÞTkt +ÐÖÏ® ˜é$5±HN‘³É^6 +»§tŸÀÄëjä`¦ä£L=tç’JÖɹ[¾?4C¸Â[ô«CÉ[·P«Ïüac~595_È3fù¡ ¶ÖVxá +]`‚ëYÚ‘aˆéÍ)ö¤Ã‚íw‡æ«w9øø‡n0²Nð-·3õÄCh– ý{ØÌ_üW£\! +’RæJ,…oþ§ÁIÊ`FP\¨©[( DS¸rYžqÿ»ðœõÿK]mendstream endobj -1181 0 obj << +1191 0 obj << /Type /Page -/Contents 1182 0 R -/Resources 1180 0 R +/Contents 1192 0 R +/Resources 1190 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R -/Annots [ 1184 0 R 1185 0 R ] +/Parent 1158 0 R +/Annots [ 1194 0 R 1195 0 R ] >> endobj -1184 0 obj << +1194 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 404.4849 256.3816 416.5446] +/Rect [55.6967 480.2482 256.3816 492.3078] /Subtype /Link /A << /S /GoTo /D (rndc) >> >> endobj -1185 0 obj << +1195 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [268.5158 404.4849 332.4306 416.5446] +/Rect [268.5158 480.2482 332.4306 492.3078] /Subtype /Link /A << /S /GoTo /D (admin_tools) >> >> endobj -1183 0 obj << -/D [1181 0 R /XYZ 56.6929 794.5015 null] +1193 0 obj << +/D [1191 0 R /XYZ 56.6929 794.5015 null] >> endobj 290 0 obj << -/D [1181 0 R /XYZ 56.6929 724.3071 null] +/D [1191 0 R /XYZ 56.6929 769.5949 null] >> endobj -1031 0 obj << -/D [1181 0 R /XYZ 56.6929 689.0661 null] +1041 0 obj << +/D [1191 0 R /XYZ 56.6929 749.0409 null] >> endobj 294 0 obj << -/D [1181 0 R /XYZ 56.6929 117.0915 null] +/D [1191 0 R /XYZ 56.6929 209.5509 null] >> endobj -1186 0 obj << -/D [1181 0 R /XYZ 56.6929 87.6248 null] +1196 0 obj << +/D [1191 0 R /XYZ 56.6929 183.9497 null] >> endobj -1180 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F14 729 0 R >> -/ProcSet [ /PDF /Text ] +298 0 obj << +/D [1191 0 R /XYZ 56.6929 147.0778 null] +>> endobj +1197 0 obj << +/D [1191 0 R /XYZ 56.6929 116.7981 null] >> endobj 1190 0 obj << -/Length 2372 -/Filter /FlateDecode ->> -stream -xÚµËrã6òî¯ÐQ® -<,Ÿ&ÛëìÆÙxœÓdjŠ&a‹>‘²W»É¿§)R¤,ﺶt`h4ºýB‹-(üØBKBE.TI™\¤å]<ÁÚõó8A‡ ±¾»?ûöJ¨ELâˆG‹ûÇ-M¨ÖlqŸ}^~üÛ‡Þ_Þ\ÒeDÎÑåw7·ßãLŒŸ?Ý^Ý\ÿr÷á\…Ëû›ŸnqúîòêòîòöãåyÀ´d°Ÿ{ -G6\Ýüã¡ë»?þøáîüËýg—÷½,CyVßÏ>¡‹ ÄþáŒk¹x%,Žù¢< ¥ 2¢›)Î>ýܬº­sú“B©¹šQ g ÆH,%iPÆ$\8 Z¡#P¥t™Wi±Í Šø©MZSšªÅá÷æWJy•·y]áLReüÒ$Oƪƒ£ X&Bp¼«ûU‡ÄH,&”Ó-NÇÁ”˜ˆH†^3`NHØÖ˜MÛà ]šµIs˵±ŒŠhiáÂ/&íöºÎ;r/+³9gzip[;Ë85‰ÀïãÜ3mª´ÞV­?7#–Î"!#\3½úk|M‘R¼…E˜ŒÔ ;Z-“4/r;gùÒ‘W¬$Y™WyÓno°X?âZZWVµOÛá"*»AŒ‡~×fSæm›WOäQî$ëWê ª@‚öt,:  )½lr¤!(r!(\w]œiW°ØàìöÅɪnq¦†C7 xz¨Ôò -Îq³æ_I¹.Ì70âùrD÷ú±Dà’Š Wzg±óëMþ ˆ8øÍìÎÙ²éxIüÞÄÛ”‹Žo´“>y(¼÷ÕU±CèÁQUTIé!0úg°ˆQ¤7ˆ¿Ã!`{àØ{OWÞÓ-‹s^~½IÊ2Ù µwfG BJ_ó áÿ8Ù¸ ± ~£KŠ§.mU"&Ø\ÑÅœ.“nL;E è"öŸG$•…½äú„äÿ¯øÆ)x?½»ÙÓ§„G*1! æ/3dÌz’&øiVÞœ2?­¹±ßåÄ´À£3p¶A஡ûO7×ýJ%mŒ9Ìg!U$âÀ¤ä Î0v 7O dž0 žÒµ‚2)jßr™l”òt<âf’{¬SÈq;æÐ4$“j*A4„”SÝáà 3®4¡ûF‡– ZmH~êÐÖ).&ÔöaÒ²PnŸA|UÒ%,Ÿ=“ö ~AÀ¡ –8åÇ¢‚<´?ØèHœÃ3(Š\ˆt¾åÆI¬µž…=Å`HÒ)kÌÔa UGæjñl΋¼›¢ßX“fàM WËߪú¥B0ið‹ -´k®„á‘«ÝNŽï‹Œ+Y]&¹ßïëE€¶UþûÖ¸ÂF¦ª6ÜaÉÍ£ñŒ±¥sM¾¼iq]€‡Žžum¬ÒÁããèóš£Â% -I»²È²3^J e|îédãFˆ4éC–@ cÓ=› :ävÆŸŠ³õ0jÁ¾ü©œX0áÞÜ©NENýX,ŒB\–!/Ç/“6]ùà¢G6“cK‘#Ëðr¬h½Þàvü2 <;êÒ¿’ô¡À°¾Jž ®=Sá\/ À^í*I;Ö€c±§ìEÕª·²Xí«ønìË¡™‹QÒ/Ÿtk[(+ѹõþ½pèܸ(NH™-!ùû}Û †g\;„Æjpðq׆ÊG²þ%j„=VÝöƒO„ñVCp1ת€G£ëV48×m0PºäíîÛd  -›ú -ÄíÔ® -UÕòî*óû¶ëum›"Ó·\‡àV”omU&iPfrF"xLiNU¬¦$%Q²¯%x¡°RRkqŠ”> Åy8C,²¸ýÃéÍ|q%&ÿ[bBÏrY3êËRï'ä€*”ô$ãGéu‘Ð?ÜÉ6èJÈ B´Š†C°µqSˆð ¬`³ta£Y¹f}£Â-x3B<á»Ó×k(Ò0ZÀ´Oîbi›Då¶D¤j[>¸ ®¢–û÷ÏWG6wñ Ö×8Œã -ÉÔ`Yû®Hì¼Ê3`߶nÀî y"3ÊŽ¡>f‚Zh éŒ¶#Jtµ¡íAn>µ"ÈcQŸ¡°wq²‹H³p•Ë{CVG0Rœ†,a[‚1Óûƒ1‹º4[+©å lYÍâÍÆlÔap µ¿ ¿îëüÁÝø­t˜6°“Õžp1wh«}¿Åm EßkûRÒ/$¾àLD!l5ëQÆ·6Åbß*ê§'oÑÿKc óxGcßc -êUÛž -û1ú†Á`𠶿ïài')"=æ…G_'í -wíÃùs¡¶h $48ÚÓê<ÖÂàg[y™»;𸠡/s©ßÓoò› 9n¸3˜•ËŸÚìPåþê{Ó»¹ÈÐíj3³ÙÌñõG'_Qìå¸òÁæ1¶ kw{E¥¶÷œ&ÅHIpj=VÛK²©zCèN¯a§é¦ìÙ>ÐŒdÉ«Çz´-3[OÈså;¨Ëê®?O‡"5>>n$è<¦ lF_õâîŒ7N¶ª¾8}÷Hi¬¸7SbSJmÞ¹Ã)*óõçxËÝNy"6ýÈ£Ë:ºNy'÷–nÇ6èÏý?)à™*fÛ§´—ñÝÿ]îÿØ…òQhÍç ‚FP\ƪcÊr.Ô!çýŸœSÖÿkɉáendstream +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F14 737 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1201 0 obj << +/Length 2349 +/Filter /FlateDecode +>> +stream +xÚµ]sÛ8îÝ¿ÂÊLÅòC¥ÉS·›ô²w›½K½OÝNG‘[³¶äµäd|·ûß$HY²ä:½Î’ €ÀlNáÇæ‰$T¤Ñ\¥‘”Éy¾™ÑùÖ>̘à =RØÇúa1{{+Ô<%iÌãùâ©G+!4IØ|Q| +ÞÿíÝ?7W!—4ˆÉU(cüpwÿ#ΤøyÿËýí݇_Þ]©(XÜýrÓ7·77÷ïo®B–Hû¹£pfÃíÝ?núððîçŸß=\}^ü4»Yt²ôåeTAþ˜}úLçˆýÓŒ‘&rþJXšòùfIAd$„ŸYÏ>ÎþÕì­Ú­Sú“"!2ájBœÍ#©”| A™’Xpa5h„V Jið»> xÛ¬Õ]µNÚ]¶Ùd;#íÛÛˆõ.…ÎCbšXb–@Œ”¾”Âÿ1ûæ\Ô¨$ìül½¬we»Ú fÓîÊjymñ©ÇÄ‹nt¾Óí-œ¤û×5ò:”HJJ¨¢¬“<¹ ùú7JyU¶e]áLVüÚdKíŽS*Qö”ÅJw¼‘8%qÄS@öj©ÌÕ£ŽŒ%2¦føiVpK, táÆ 5;v»¬˜xªwìÀ \B‹wúJÚh}jåU$æÀdÌa +” ö†‹»å‡žvøah_à1]#øG£ö G`ß#n¤$à½é€›‘“tX—xQ3<€"2àõÖ®œÞò\l£P”$ŒË¡5櫬ªôÍæŒNYÄà¶c5iJø%vØá},Ë)Í61`r8IAlóHz¤ÍçëçŸPòš$¨,Æ(Q±0ÊJH"hú Å È|Í_'ŽØ„¿pyV!Pçù~‡`æÖì]r*ƒ¶ÞâÌZ?Ûû2øO$ TWÆõ–û]æ4 “ffíjG¾¬š²psÙ„L‚J"¹òB=—úe* +ÀK¢¨<• +*žÊàïúÐà … ÆŠ€ECÄhaB—0œáä QÔ1wJÁ£rAãiDGo:ª€G_ˆ5$Äÿ5NáI€$N&‹ÖêªÀMc–£3”cJ»\I"˜Šspkí®^7RÀó™˜gæÔn¬6#0Rˆ røsb‘˜I5—qL"•$—ÜØã‡ý Ž4¢ûJW– ZÁ¬O~ìÌë#jÇÐhXØì÷jÚ ‡¯¤Ü‹™¹et%XÀ¡ J˜ q.*ÈSûsÚè@œCBÇsÁÓ©ô5'iÂMæcaG1쓴ʲÆ%‰RO6,–Å”97E)Þ“fàM WÁïUýR!˜5øEš5›¶ð8¨²¶;yP:¤ WŠz“•n¿ÁBh_•ìõú€#SU[> «ÂMƒcuMܵ8® À£§g\Û^Ÿ;dŒ£Ï×.QHêS¡FïžõnÊK!sc|"¸Û8†"ϺЀiÈØ`8’@ù½]enÆŠ³u?jÁ¾rÙNL’poé‚”W‘U?&ƒWÈKãð7Y›¯\pÑcóŠöc˺D–…¬$I¼Áí¸9d ²‚ܯ pN†õUö¬qíQë +ç:avÂ$6{4hMX;ÊNÔDuV–ªcæîÇ.¢Ã‹?& ¤[¾èÖ&9V»õ±F8uî\E)x¬Äªçû|Û û'\;„¦ªwðy×–!v’5F”u›–1ã­FàbÍVç島npÎoк”íám¶Í]b‰z5«BVÜÃ]nß~»­wm3Q¿…P1RFÙðÖV›,7…œ¢Y©ê‚Õ˜¤$5{K ª6A +J[¨åÅ%RÉ )Σ b±ÁÑ·òÅe|–˜üVb"™ä ì=îÒRç''ä€*’'ô$ãgéùHèŠ5F²}Ê/¨É0¬ô-ÆDsNƒÅUJ!n@XÁ<¾Ò„fe K¸jœ!ž8m·¤a´€i÷¸‹BS¹Ùo©Úom€…›QËcˆ.»’Õ’-mü‚õ-·Sq%ט‚–Ôz•ÀþóZ±@“%™Pv +ù1üÔBÄNh[1¢„Ï Ao¼Íg¢V ïXܽPد8 Y‚Å$†„9’ÀCwÄòôÂÁqÀ`^2eIw,>¡6úL¦ÃJ&²³ŒZñZS6h)Ø…Ú]ƒ[wI~ïbÜVÚ3°u©ž°wÐò {´Éñ‘cŒ)ÈVM›®/í'ÄèZ½ÁL×zܾ“ÂNRDz*×}›µ+Ü=Ñycýs!³h 48:Òòþjà?ñ³¯Ö妴—àpBŸ§ÔÑoÊë/\g8)—;µ94 Ê>üå)ËË5<ƒSmB¿«-ôn7Åן^¾õú(ÇuŸ6-ˆ6IX{8**‡!ÄÓõ@Ipj=TÛK¶«:Cð§×°Sû)s¶ 3YÊê©l+ôãÞr\¹>êr€z€ë/ó¾ˆ}º—iCó€³:qÚˆ—­ª¯/ß=R*îՔؘR[zw¸DeÚ¢þzÏC¹ýè’'²~›¯‡|=¸¬³ë„ïäÞPÀ­Ãþ­Îè+Bàÿ±%N…òïŽç`ò}â"emq¡zÍ9¬¹Ì,vÇ…)xL;Î@ÏÙ®ÔÆ&ÍÀä#«ÚNn[Œ‹f€Ýrá +oƒ‹wh¦\é¨"“HejäfªÙ'S9‰O}¼‹é›"R%'ÿhlW» k[óþ5u^‚Ü ö +ê}»Ý·¸¶Ñíª.š7Xkã›Ì­tÙö‚½2Ñkfdã‰Cy1U–»˜\Áºk ÚÕÎÌ·ùlŠà ,Ù±+pb®®òt­  e¥„JŸ1w.9QŒ@¡˜x•v’.)1 €^ëÜÙíª~AÀ\~½w9D¾mj7ÀÌÔ(±1–ìÓŒcŒž¡ rî?!‰ù·n¢ÍF;ßûî?ÿ˜B5&’äLû]ÐjµTy¦Œ’„:å¼û÷pÌúâØ\5endstream endobj -1189 0 obj << +1200 0 obj << /Type /Page -/Contents 1190 0 R -/Resources 1188 0 R +/Contents 1201 0 R +/Resources 1199 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R -/Annots [ 1195 0 R 1196 0 R 1197 0 R ] +/Parent 1210 0 R +/Annots [ 1205 0 R 1206 0 R 1207 0 R ] >> endobj -1195 0 obj << +1205 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [406.6264 524.1437 456.8481 536.2033] +/Rect [406.6264 617.3695 456.8481 629.4292] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1196 0 obj << +1206 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.5805 512.856 196.7992 524.2481] +/Rect [140.5805 606.0819 196.7992 617.474] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1197 0 obj << +1207 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.6195 470.0794 159.8382 482.1391] +/Rect [103.6195 562.6731 159.8382 574.7328] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1191 0 obj << -/D [1189 0 R /XYZ 85.0394 794.5015 null] ->> endobj -298 0 obj << -/D [1189 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1192 0 obj << -/D [1189 0 R /XYZ 85.0394 749.3189 null] +1202 0 obj << +/D [1200 0 R /XYZ 85.0394 794.5015 null] >> endobj 302 0 obj << -/D [1189 0 R /XYZ 85.0394 679.8163 null] +/D [1200 0 R /XYZ 85.0394 769.5949 null] >> endobj -1193 0 obj << -/D [1189 0 R /XYZ 85.0394 652.1211 null] +1203 0 obj << +/D [1200 0 R /XYZ 85.0394 749.0225 null] >> endobj 306 0 obj << -/D [1189 0 R /XYZ 85.0394 573.4726 null] +/D [1200 0 R /XYZ 85.0394 668.2594 null] >> endobj -1194 0 obj << -/D [1189 0 R /XYZ 85.0394 542.9681 null] +1204 0 obj << +/D [1200 0 R /XYZ 85.0394 636.8261 null] >> endobj 310 0 obj << -/D [1189 0 R /XYZ 85.0394 335.1831 null] +/D [1200 0 R /XYZ 85.0394 425.0299 null] >> endobj -1198 0 obj << -/D [1189 0 R /XYZ 85.0394 307.4879 null] +1208 0 obj << +/D [1200 0 R /XYZ 85.0394 396.4061 null] >> endobj -1188 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R >> +314 0 obj << +/D [1200 0 R /XYZ 85.0394 136.3155 null] +>> endobj +1209 0 obj << +/D [1200 0 R /XYZ 85.0394 104.8822 null] +>> endobj +1199 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F41 935 0 R /F23 734 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1202 0 obj << -/Length 3489 -/Filter /FlateDecode ->> -stream -xÚ­Z_“㶠ßO±“'ïÌYÿJê=]’½tÓæ’^6Óé$™ŒlË»êYÒÖ’ooÛéw/@€”ä¥ïÜöÆ"A -@ø²¸Lá'.Ml!‹Ë¬Ð‰I…¹\7éåŒ}{!xÎÒOZNg}u{ñåk•]Ia¥½¼ÝNxåIšçâòvóËÂ&2¹éâëÞ¼¾ùöç·¯®2½¸½ùáÍÕRštñúæÏ×Ôúöí«ï¿õöj)r#_ÿñÕ·×oiÈ2¯nÞ|C”‚'˜¾½~}ýöúÍ××W¿Ý~wq}t™ê+R…Šüãâ—ßÒË ¨ýÝEš¨"7—ÐIQò²¹ÐF%F+å)»‹Ÿ.þNFÝ«Qû‰4‘Êʈ¥¸")Œ‘3 š"±Jª`A‘‚UÒ4]캻»º½#-Ê¡jªv î7Õ¯i*Ûz¨»–(e»¡ÆÏ}yW¡-`E5Ù²ô†“ãò°Ôí½Ÿ$&“dš¤*30çx ž3S9hYž×Â)•-Ö]‹ÒÝöW"_T=RóEIƒõ¦¢Öûr_WÃuº-Í -J;âê×SgÛí©1ÜW4·-fÕWû÷Õý'“‹›¡h§ÀÖ*‹½¾/Û¶ÚEÔ[j‘%&ËÕå2l¼ðp¿/{XR*°wßwëôî±/Ýax8 4ÖTÃ}·é_`O£àMÉ#A#|…¶ ¨}Ò×h -ìí ·ã)õ•…y>“ÚØX¬ËÖ“*n­*:ôÕUD eè´>ÖŽ¯qïÄŒU$©QÞT è]·ŠØJ§‰Í½Iƒ…mGϾÚUköÛûùÝ¡§ÎzÖ¬¸ƒž€Ï¦êÑ“™Z’/Q¤Ú$N+8gI¦Aµ~¢€¹å󆧥Ðó1l†z}Ø•{êSÞ¢ö¶\×;ÄŽBˆÅÑëtvð…ùiƒå¦§ÍM ‡)fáFôMݯ™‹‹}áÍ@ Ñ!"¹’ŽD2na;v= -‡H¿nêˆ$'ÐØÎD¢âœP±ŸN°7÷8h+~©\¯«‡ÁA2_=-0îPMMFNÀ‘ºÂÆ<)„)øDÔí¶‹Åš<ÉEbMjÄ ro­³$SFÌ]ÃÁ?%²Ñß°ã-<ƒ'c§Œ!7a’\ûœ†•Á&v’Ó¤(” !²j+õ¯<Ô ¯nÒ¸äb<G´ƒ=®¹PœvóeÇòŽ[…=Þ*lzÓ×6ÉUnç QŸãCÛ ó7žiWë>¡a“àpc¼ˆ—µkìÔïb³ˆ•¤H2ëóÈ<^vŒšä@å -Ð]’Fâ$F˜ü]¡PÐ^"…<­˜Æ1¤vDtþ ýÙƒ «dê6q(/@¡‹€Îy y˜€£ŽæXq‚á¶! GóÓ¬Èjª²<±µÎ7´L-l¼ßaˆè!Òؘ­Uf‚­U†!¡ÖCOƒä˜8Ë‹ŽÓ܉É\ÄĘñ ¬,) VîÕ²¥Ññ€ÕE¤Ò_9aÕa‰Œó¼dX¿:[H4Zê¹­wd@À¬`#CÃc)l;‡'øM÷èâÎì蹪Ö]ã’€Õ\•Šfhpf…·ž·z.ÏžZc¤ãNϾ|ï®Êõ=¿ë¢”'ÅŽFw%›˜{`mªtA‰^;цêâ:·6Ñ©òŽÔ‹\7ˆÄZ;)Þ‰k€«ÖáùÈ4]ˆ<_¯Ôh•üTàԉΔdI\\r(”6þ"Gh‹°µ*×ï4>nŽtÛÑnx<'€vÉ4; -’˜ÈT&ya—~&[a‹Ë7há¶Àtú,[¼vQÈÕïc€©ÀF*í4Ö÷]G§Nòq’‹wUõàסµyB·ÛPc¢’·A*l¨Y˜áöôøè4À(Áý|¾ ¦H²,@QÜXñM—’ùâïùakUm»P®B¿fº+´àIþ«"`§m–†+ úçò@P™÷AÏ<ìK¬@ºÈJŠ†,²ŽŒ­I‰ ösf (Ôœ™Ïð.Ø~~^q¡4æçš 8…ÒâH¡ô´BPNÈ3-7×̤\œ{Îê!‹b§Ÿv¨s#>³ô駤Gü )åoW¸ýÖ¤¼ ¨#bµ£‚°S€óÎ}Ì!ËZ—‡¢ñ*$­ <² ° © ýqðЬ\m—'àéDà$Ý09 -0sÈèi.AëÆò9¤}kÂé e5ð¬=Lò×å’oŸG\d¹Ø-ÆRˆoÍÒĤG †o¹= -ˆÒ†–/º°µáúØpˆD ;&9^UÌÅúHáÈÕ‡uUmú£ëvS¯Y!˜„–Á{Y™-Þt4ÃglO3ÚqÁ®wP¾ðÕ(WÑ _ìË÷%ê~׬á¦`ÔgDÓ} qŸ_+@³Mu‰àóã´víø¶rJcòš4M;ð•Õ‹HÍa“ ¿é|*’ŠBûIGde2uÖ!‡86wº>úÁMdvAç35C…Ÿ±Êöw. ~ŸÑùKœJ -ü“Ål7·5Ú'}Á¯"´ú‚HcÀÀž¢í¶dÚ¼Œ~?Ú×í°¤jç=U}ô#Í›ª s—QqÏùw2Eš<\{ðõl$a@Z)ĉ+&9¹b’ók$0L’Óë#Ép2 -kî²Úc¯0¹¿C8_Pø;v! ¹(Éï3S|µŒ@x"BÉ_– IJ,Ç÷xc$†âÖ•Æ'Ëý н.ô' &O¾ÐjJæù‹ÛÔ.þÔvLå›p÷ûåôÈ|»4N* wվߦÇÕ×üÎ"‘"ü™vn»é‚£j3y.—¦¬wñ  ƒ¸'™xÿÛ”¨c9\"ós…)ùO s¶J'7Wæ 8Qv.ŸÝCÔ¾*ù¨BK%@¤3‹bñÂBV¤É$Bhï·‡Ãú!ÆE&6×ù§¸xаÞG7 <§æ\Qp¯ ä½ízÈCŸËi;<œ²s*Îe²ëÖå.VBKpA›ÊÿŠøßù˜)ù™äQŸ‰þLz™Ï$ñÁo²á¾ê$Ñ6ÜÝ:VÙ"-¥Ux·]ñ¿$bÿÝT&Á?\Fþi™†¯úÿ÷ÿ:Ç?½ê,Qy.Ç¿lÎäÏòDçÀ„…B-TþLrÿÐç¢ÿ¬@Ùendstream +1213 0 obj << +/Length 3704 +/Filter /FlateDecode +>> +stream +xÚ­]sã¶ñݿ“—Ê3'†ì=]R_â´¹¤Ww:$“¡$ÊbM‘ªHÎíô¿w»I:+í-ÀÅb¿wAqÃO\k™\æ×ižD:úz¹½Š¯`î›+ÁkænÑ|¼ê«û«/ߪô:r#Íõýz„+‹â,×÷«Ÿf&’Ñ `ˆg_ÿðîíÝ7}ÿæ&Mf÷w?¼»™KÏÞÞýé–Fß¼óý÷oÞßÌE¦Åìëoßüxûž¦ ãøêîÝ’Óã Ò÷·ooßß¾ûúöæ—ûï®nïýYÆç±Âƒüóê§_âëû»«8Ry¦¯ð'ŽDžËëíU¢U¤¥¤¾úËÕŸ=ÂѬ}5È?GR` T!ê<2 +¦?4õ*IfmSâqà%1z)‘Qždì„«ëöá¡jxݹJ#%·®ë‹¾Ü–MO¨«ŸzvèÊAú– «òç8–°³…¼n[4LÔrS4MY3¼høõ% h÷Ué&:F°¿Ù¬$à±húr¢Uq6»[°ß”ÃKœåzž 2×s!¢\kiOÑ´†¥2K.bˆÉõ)C^‘4pìŸeÛ ;û¢¯Ú†€Çª®i´(O%c‚@þQœ§`?"‹’ÔäÂæ&Žgÿ¶‡”y”evÝèŒÌÉ'Z¸*×Å¡îÝ[cدÝSH_O«rqp°ÿ¼¶ÛÄnØàÐl‹~¹A5mÑêzŠd$–&O û©8J”¤ýî€mÀx¶eåÀs0â9É:\¤lW.+<=Š÷¹ÍEšDF+¥J¢\eÊGmZbq 6ï¨f6П7û¢+Ã/u”&qf‘½qîÏ”úÝ¡§ñC[vSf¶M9åò¶e£µ[©|Ì q<Ì v £X»ð÷š?µ>WÁ|Û¼¹c ‡:$gávºÆãÁˆ‘ˆ,„†,hâõoÁ†IG¼4Æ…ÙŠ%ÓÛC×Ó\Õ,ëê$páÖw`bÅ°|Y¼i²ß=A»â©#xCY ·7:»¨¬Ëe_‚­¯°ny»ž3Æk2m­ Ÿ=?‘ÀÌ°Á¡¹äÉtÎz›¾ZêbOÿ)pÑx],«ºêŸn„³“×Éxð…©¹Ávcs³ HcŠ-£pCþVU·d,Öù%à ïzBˆ–dcàÊPˆ +ÄQwHœÊfuµE/@¢`Ìg‚v%ÈOFËá_í–[q3 €-ø¥b¹,w½MÊ`~ñt²Á €þëØÏøDgª.˜8fQ.tÎ&Q5ë6äl²(¹w6±¯H¿“$R¥ÅT5l¨D:èþ±žž^“ñOÊÝ„Ž²Äµ¦ØÂɦGy¹ ó‘eS‚¯/yç¾Úò &[}¼“àîà?Ü‚ÉiV_¶Lï *üǢ¡c1Yxb¢Le'9éÀxtûì š¶Ÿú¸Á¦Ñ4OÈØÈ+ÜÈaÜ£¿À!v¢Ãì,À&)¢Ô¸H2u¹FŽ©`~!`Ü¥uŽ²M{$fCž¨™L™]­ 3‚¹ —NáØê82´Ä$%ü±Ÿ#ÓÀ@¡¦È\4€w÷SƒÅâžKúÁ(ÎOŸ?”òBÎMOlRÖÑ=G 5‘A²ã—ÕªÀL‹ÏL}üõ˜CLùûMj =)°ÀJ‰Pý¨Àíä ¼SÝysˆó‡Æ¢ ?‚*)Irg.· | .«Î]ö“‡íÂV20¶žnC<XÒƒƒ9f!=öÓ®úW( CÜ7Ú[/­g奮k—åHß±ÂØ:ÊŒ ¼ùP qç,Žt|’ÖíC +qâ¥ÖœEnváhÅ5²f‰0NÌå`zQ2ã<…——e¹êN^¬šUµäÁ"ä 6ge:{×Ò +p<Žh§at’x=BÃýQ®¤9G~íÓ_î™|¬ºÞ÷Z}·`8ÏPwø}~­ØÁÉVg¢öÙü9óAð¼dFŸjVkª2¦¬ã↟ÔCÇiWö°Û¡î˜RQ½zì7Øu’Ò ‘ºB%â?±á‘“œÝÀ5x„¡Ð eÊ@–‘¦æåô@hh›óU&Ò|L•¶ë[TjåINq+ÀÕ\ð„18ÈÀiL³¦6+‚öŠÎ0‘ò‚D +ìJšS“E´cSUÞT±{ØÛëM¦¼†ÃxäÅÔ¸uP§_ Å8Ùu¬"e29åÑHGä€C A†ÞÖ5©‹ä†¯Äêa¹¯¼h?ð\]K[À£)4€ƒ +B+Áä úÁ\³RÉñ¥ +þ­x§àý‰ÂZ&õåO'®2—bÂðWä0š–vضã}WE_pµ P’Æfê68)³Ç'êUo³¢˜Š +ûÜð,Y M_ñ›]»åÙöÐÏÛõ|A\À¶Ä +«ê¶ô—(Ûw;~aÏø÷7 DWØÛÑÑBÊLkŠà/M·ÅÇj{Ø:FÎUŒº«“ÖÁ¢Ü*ß?>×Hpr\[‡vÚ²ûÒ §¼¥\šÖ¸ou‚#Pu˜(…ëEW*òÄ-òÙÑ©KV:UY98²©ÖuÁ{7‘C’MÏé«l¼Í*š_¹†øuç 9åxK<‘çºB&á¢/øUÌ®¾ Ðà2ðŸ¢ÉG2Þ¾^#í«¦ŸSÅŠëžÊ.xWGë¦7v~í;—œ£Y?Éïs*¦¸Á îÒvbPð ³o–fâ´›7øb¨omu|¶âO!ÁOòäE†Éò'Wkm ƹ‹Ãú66³?6í‘¡Ü·éø¿_…LÅ•@í¤¼=–û&ÜŒO °iÛ"’B8â@rûP· lÕ¤òR,Û¢ªÃ^!ñäžEâôoU€«Èf&2»”˜â±ÿ1é¬pe¥—â©wAþªè“š'øIæ:ïé@Èa‚[HóøS$éHˆÄéíá°Ü…°ÈÈdIö—6,÷AaæäR_J +Ê +\Þ‡ÔsÌ=’K1­ûÝ9>ÇâR$u»,êP-AM,ñ¿ãÑc<ò3Ñ£>žä3K&zL^Íú–ÕÙ|$1*£J/ i.Âþvé?–Hbìõ%êôÓ%ª„»oOo'|½ºÃn×î¹× f\ýËØ Æ+0ªÀp¹ ˜¶¢Ôì[êñŸÞl@¸Òùº}*¾gþ„Ü|‡= b¯j&o|W$ü]_àsã¾ãRq +aÖœ’þÖ2MÅÉn2¾ÜÐ3|ñêP¤ZMŽ-Ûfj¿â7bb‚3‡`¼£²õ ÐÀWû ÓâCI ‚>)ñqSÙk˜å›4ò:¾ñ‡)ÛafPÇŸj(̯Cße˜,Êòtêà?%#™zoÈ÷jöS +×$qdAlÇ·c”6|‚q†Å¿côqJ@Þ‰âõe(UÇXç¯ ×PRq‰È{4näÊŸ,NZ=5èÎQ=4\Rr¿kp¦Î/ìûH¡ü7îš7øÕ”þ«O•žÛý#«g]=³@¤ÂWÅ& +¿ë=~ͯÝ[G€ÿ^ ;j£i/_Ûay"Á’¸/lïžüQ'ÌÑWHÚ)õøsL=ôpèrÛ$Qžfê´á³/ª‡ î.sÒx¢¢«QŸ@àŒèk\¶±´ÁèРߨMS×,Yú“+Û¹Q³ïß#so‰27l\áŒP~ÖeÑñÐV¸ÊUÉ}ªaWÒ§0|¨>”|× }]¬t„Ÿ¾Žý×[ÿ÷—ÇÃgÙI©,“áŠ%êcH˜(äœÊžQî>Q~Nú`UðËendstream endobj -1201 0 obj << +1212 0 obj << /Type /Page -/Contents 1202 0 R -/Resources 1200 0 R +/Contents 1213 0 R +/Resources 1211 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R ->> endobj -1203 0 obj << -/D [1201 0 R /XYZ 56.6929 794.5015 null] +/Parent 1210 0 R >> endobj -314 0 obj << -/D [1201 0 R /XYZ 56.6929 769.5949 null] ->> endobj -1204 0 obj << -/D [1201 0 R /XYZ 56.6929 749.2381 null] +1214 0 obj << +/D [1212 0 R /XYZ 56.6929 794.5015 null] >> endobj 318 0 obj << -/D [1201 0 R /XYZ 56.6929 540.3599 null] +/D [1212 0 R /XYZ 56.6929 607.7662 null] >> endobj -1205 0 obj << -/D [1201 0 R /XYZ 56.6929 517.4049 null] +1215 0 obj << +/D [1212 0 R /XYZ 56.6929 584.6557 null] >> endobj -1200 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F39 885 0 R >> +1211 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1208 0 obj << -/Length 3336 -/Filter /FlateDecode ->> -stream -xÚ¥ZYoãF~÷¯0ò22`1}‘lÎ%A@K”DD"’²â]ä¿oUW5/·í Ã`_ì®ó«ª¦ä¥€?yiãHèÌ\¦™‰b!ãËÕáB\naîë Ék–~Ñr¼ê«»‹/?êô2‹²D%—w›Ñ^6ÖÊË»õO‹ß¼ÿçÝÍíÕRÅb‘DWË8‹¯>}þdôøðÃ矾þ÷íû«Ô,î>ýð™†oo>ÞÜÞ|þpsµ”6–ð¾âžyáã§ïn¨õõíûï¿{õËÝ·7w=/c~¥ÐÈÈï?ý".×Àö·"Ò™/ÏБÌ2uy¸0±Žb£µÙ_üxñ¯~ÃѬ{5$¿XÛ(¶* Péã,J4L¡«ºŽ2¹È÷{jlòU¹/»²hy¢¹’vQP§=uÓkêÖÕäe±¨E“weµååmWZ*ð°ø¦>£À€,9"K¥qC˜A‚à•}½åucòµŒ+ü²sééÝåÕzÏ䊶ͷžò¶¨˜¹®æç®lqëË¥i¤Ò¬NÊ(‹cåveÞQÉzQâ>±Y¬‹vÕ”÷Ži®èÙíŠ;RÆ‘Lc=a'ZÕÕ&Àh7U2嵇œw> 3­ÄâÓ†hx¬O4·Ë -Êi€dLíó®\íhöÔ:1À ¯{(šGšª÷ë~¨-k>´Þ¸YÊÄF6K§bzIG*U†ùévyGîRWûGjy²Ä¢;×Ô Ûž .?ÇSψ8‘Ò©7°¹ -ÈùYÄþe€,ž-¯’Í©ZuÀöuFå[%Ÿ¿Úç@(µýX[î@ÏG¹­jrŒuD2ã D¥tæ» sA:ö6R€"Ðê×–’× TÅ‹sÝüÆæ¹/ ‘ÚÈ€q½æVÊF©íMðMKÛÿ¬”96eÝ8 ÀÞ5M¬ŠcGm¯_ƒ2|¤±Ù0Xç¾­ièžIÚ×4Wnh„ÚŒ0YÃC«-IU&&ÊR«gØ5y¹Ýáé*#k'º‹Ÿ…P`ÀhW4¼lçhƒÖ©åýçj16’6MÿžÌÐS…^|?`á=Éê™âoq”Ÿû"o¹Yoh Z½è ƒW>{jnˇ‚yq@H¢J 0ë!MŽ,öží¹-öÅŠz›º\lÄTûwÔ!*úñ†ž;~Ñøýz"¡çˆäՌѣ³óZw1u„:#3² -lô‚ÃÎé -=¬6°t èþ÷´ölÉÞ„±,Â&ƒ§¾Œæq¤Ó>B îCû“4_Î5 ð¶.º¢9”óxv…-bÕ ¬>Rÿ˜·œ4 ^mLäG&3ÉmÃV¥˜K–M‰ÎyS Ë'Ù0¤Œ'ö¡Ìƒ+Š•6͘ „ˆÞZÉxfV´P#ßÄ ôME“)¾ÉrD¿iYmêŸÈÈêÞäê†)¸ðS®Šj¦l^&ÓHè=“¿&ƒ=ûªmeÚÚ)‚}rŒÅ„PØhKpÎ%.Ø='´HÔÆ̦XƒÅkèËnâòàLÆžÑ*?ëÒfm½"88¹“Ç -ˆY1Y^(14Qo¨Ï[(I©Ä+É91ìÊ –í¸Ê¹žùZjzrÉÆBl!þDIjfð¹>í94€U;räÓpPò4É|U@Tòa…t{Ç– ü?Ÿ)ÅYÏN·.š&d³Y$J{¨hAIl"ðú(sÊë’ÉuÉfÒS— ˆJA³a¶-šŒy 7üfÛwP”ZÓ"¤oøŽÎʘ$h LR:™-úgÕÕš,”I›P3€¢mÕ‚xh?SÎ -CDžU=yØv{òæÊ.NA=Žç-?é±á vË‘a_;Rº¾¦²®§€CÉœ -‡ÍÛáz²a¨Ùžš|Ùk|äبŸgM+8f -h Ì’kP—†Ã`ñH¯-xý˜è"À5o°œ)Æ)® ¨`¦¬;€½×ëÂU¯Š*1WCΈ#ƒ˜ðÇe_ßçhN6áèÍ´Ïã`”•,¶l&i0õ¹*Lý‡Ð­všˆ}µK&2O¥4q.!Ur —yÁt%σc ƒä ³A -“ÂtQ9k‹Ž µ()¿ÖŽz¤1ðŠ†1zÏUÉ -J8¼Ž½€Ò}™Dòî!ÝÚïo&)¡€û,dÚët%<úƒ¡êœIÞÔû}}F(³•ÓãXCøq‡=ô^öv@fdäsä† -[A£ÍPáo4ÕzÅÔäÁàjL”€EŒŠ°fá­^³ˆx¬ÙØöšE´Ë)9·¤Ô1ôMRe—â±åÁ2¶<|ñÔT#!DCå5!åý#¾( -ˆü‘1ƒ½¡¢Ö‘HŬ„´ãÑÀrЬDcT¼xO.‘MÇŽCšµ„Öþµ#\ÍüÝ‹µ„pvð®Îœ“Z–Ì÷uR`-¸%ð²(GÎc(b&,C½—{dëSwCh^Q¿7Q5'¥\\ÏjDFÿ·‡›!xJáI(W¿ºs~eÄ™ÿ:^•†M¹ÌžÌ65Ï4´zFF#yõH®<ÜÚq£G8¾vÂ14È'ÇKçt7©Ïx·œ‡ 'Ñ…Þ“ ë³ºGmÍds˜r|€]¥`ƒ]áÌ3©´""õ`´~@/W!ÐÒ‘”z~ï嶦²ÆšÂYÆ…sÑÚ뇽àa´«Yõx”š×z£‚ÛÝPôn2Mlýý£KŸ»¬x*† PJË¡þ¯º¥Ór@6²i_ î\bf$@±‹îF Pjð–ÑhüÏYan 9µtpÎñŒÛ˜žP l¹Üš«0îL_ ý êùãø¼x@ÔÙ$žÕ¡R9 TŠÿÂ7mŸ 0è\sX;u®(ÓNÁÀøB5ðG¾‚smY­ÂWÍ’æ%û«„ø»Ï”ÄØÒ‘\I¤^g±0„‚v!\‡-KeY_àvV°Ï¶nB÷ÆI¥I_úÆ$À˜ÂßOP4¹’S{¶4@¢:Å›]>ÍõÜM`Óì@ô^Ê—¿ð$㶳ö ÷=¢Œ†Œó#”k¨u°ˆ ÉAYÙ_)^¸?{K¥Ɉ¯®ûê©bÑ°8¼D €¥Tc¨‚ž‡h:è—rXÙË;F uÏ#Þ—&Kž)yb"­ú»1âñ™šWô `}Ä2§e"òÇé±t÷Ž-O¤C«´Ã=Ë× hôÚ}É{©³UHoY¹mæûsþØÒ¨S4Œ9r ^ê²)í­f)µ¦Ü‹2ew Ú¼¥«!tT Tʽ¹y“ÐvšœDtßóM1\¯Ç¤axºÜÎêU$|7Z›¸K@méEP5_:‰_Õ È/SÙ\3ÃǮ ¥RËXã}¶™e—‹û%DZA9ŽŒßŠø-6Ñ4²-ª¢É÷ K|‚¯å|¯™¤ÝúùÔín$¥DNðÆàÔÐð‘?~Ñe²Ó7Œ®†$4Q> n¢ýw hq\xbÿPf"{­6DDì+Hº’Á¤`“Ÿö€ÎF¶†4´þP4Aü& U—û&í†ù¼•Óp˜Š”_¶ûOYÃ×ÁÉ7bw0ûi€L±^SæR¹Fê>ÒÓd³½¤Æíè«~¿~9~áéWý§û"?+û%Ü龜Ԝ$Í‘ÒNHzòó‚~Õ+„<ÝŠ¯€ËHJ”y¡f`=þÊ÷µja¼Œ®êßÝk4ü/¿ä*¤@ÃfwnĽ„–3¼FGàÝ@6«Èý>ý·þ3Yªu ÞB=¡†>OLéâ/F£×BÔ¨ 5¹™KM.{04èö5‰Ð> +stream +xÚ½ZÝoãÆ÷_aäådà´ÙOry÷tIíä‚äÒ:îS4EÉD)R!©SÔ"ÿ{gvv)RZÛ) +‡÷{çó73+‹kÿĵ5Œ«L_§™f† s]l¯øõæ¾¹~Í2,ZNW}õpõåJ¯3–%2¹~XOβŒ[+®V?/¾þöÃ_nïo–ÒðEÂn–&ዯ>~ú dôùúÇOw¿ùûý‡›T/>þø‰†ïoïnïo?}}{³ÖØ/ý Ïl¸ûøý-µ¾¹ÿðÃîo~yøîêöaäeʯà +ùíêç_øõ +ØþîŠ3•Ys}€g"ËäõöJÅŒV*ŒÔW?]ýmDÜÜÇæ~WÕÚWgùd ¡¹ þh “jNö<«=ú¿‹8Ü‚¡4ᄪøÕÝó«·Aœù·ãU*ÈÃø™¬+ 3¸è‹uÛ~ñ>°§z×y.°©ÞûR)vòï#&'c¶j”žæÛ]{ ÆÄlÔ(|šr™|=gØT~¦£Õ5äÍ‘Cµ-}ëÉ7F„ÃÜʯGƒ¼¸^8§C¸ICÆ»ñyÈé¦v ºî2«F„PVχ)ÇØU +6p²+œy&•–œ3ÎÓF«#zUÄ@K1!Ôèc9 GSYÄŒže\8w"Z}ãp<Œ­W=^%Oµž +n÷B1ºÉ<±%ô)ðs—bÈ¥”8ÕÿÍ°tZŽÈÁ2›‚­ÑÒ'—˜iP좻æ'(…ѶAGÔ*rV˜[AÎ@-œs†…CþÆL_(6¾Ü:W¡±Œë±ú/¨ßæÇé%x €¨%šÙĜձR +ÁD˜×žtÔ³IÀy9®<þ!€sŸáe`_þ=;»Ø#WÁn_5E4MIã"ýstˆ¨Ðûž «ý >k̼Â0RΔ1H™4nVB%,Uv®šÎÙ´Ý1BM’2‘ÚF}·Ô:aZò³ˆBàñÛ*&W/c^ïÍ  …¨NÍb¼ÍõÜ3`jNÓÞ{h“·:~ôÓduÔv¦žbÕ^#Ä(H7ï VCÍ„ƒLLJKfÅøž@r8{î˜É +n1•ß¼K§Æ‹†§Ìà â +‡„œâôÖ@Óᾧ•£°ãc´ýHð¾¥Î’gê]©2¦d¢g<>Sðò1ûkwXãôžˆü8¿uE-LDBK´í£¯”ßzÜL StÏ]ÔÙ*ä¶^¹jæõ!?ö4ê cŽÜÒ/u©” +V³”WSâEi²{íÞÑ»ºªÊäÑÜ‚I(;ÏL=ö|;>ý¸ =5.±…ûNÅ*þ4Y›¸ht¤EQÕv©Ä¼ª_&³s͸ôk¤ˆ&–G-ÂÇl=6Ò.ïÊÇ%„YN Ž0ï¸y•ƒMlʦìòd Qû7¹Ðëf9·z>o{˜H)Q‚|.Øw4L¥Ivú†Ñâ”&2d óC”·Elù paÿPf<{­0ä,ËÆò‘Þc0#Xçûz ÐÙÈÖ†>\Š&Ø£ùh»ø¶=Ð0˜è‘våÓ¦˜´ç/힟£QþÜ]õ87ç?‰‹5©¡21#¤)þ€C“Ýæš÷“_|ÆõËé†Ë_|.ÏE*‹ðôÅÝo^‚3yNÄe¦¸°3’.~zW½BÈåiTyE \ )‘ú…‚ÁëñWo_+¦Ëèþ=ؽBÃÿòK_‚”`ØÂÔθMh9§mt> dgµf8güaÄÿ3[*#E >A]PC¿MÌéò?M¶Å¨‘3jò°Ù×™¾æÁРÎøc, H„úy©OꨨÐÅy}朔Æ|œ +=áŸË˹àÇÕÓ×ùtÄ×vÿt>íè­:0tŸyØú©¬éñ˜nõz'_&: ÊW±2sTÛú‚á—®®ÖgÔ‡zfJ€{,+W/Co]³“Þ,×o> endobj -1210 0 obj << +1220 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [173.6261 273.4719 242.2981 282.8815] +/Rect [173.6261 333.9221 242.2981 343.3317] /Subtype /Link /A << /S /GoTo /D (the_category_phrase) >> >> endobj -1209 0 obj << -/D [1207 0 R /XYZ 85.0394 794.5015 null] +1219 0 obj << +/D [1217 0 R /XYZ 85.0394 794.5015 null] >> endobj -1206 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> +1216 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1214 0 obj << -/Length 2391 +1224 0 obj << +/Length 2569 /Filter /FlateDecode >> stream -xÚµ]sÛ6òÝ¿BÓ—H3B€ ^žÒÔιsIZŸûpÓv2´IœR¤Ž¤âª7ýïÝÅ.ø!ÓŽï27z °X,ö{œð“3‹8Ué,I#¡©g«ýE0ÛÂÚ» É8K´b}{{ñê*Lf©HcÏn7ZFÆÈÙíúçy,”X…`þö㇫ëw?ݼY$Ñüöúã‡ÅRé`~uýK½»yóþý››ÅR-çoÿþæ‡ÛËZŠ™Æ·×¾#HJŸGˆÞ\^]Þ\~x{¹øõöû‹ËÛN–¡¼2Q_üük0[ƒØß_"LžÝÃ$2MÕléPè( =¤¸øçÅÁÁªÛ:©?ÆjB‘œR`”ˆ8IH«]V–¶X,ã ˜¯í&;í§¦]Ûº&ØPÆ™ -E*ƒh¶”R¤Z+·—Ð^ƒF“0_½¢÷uÞÚ†ÆmE_¦ˆ¤O„hìg N„——› - †j@°* ^nl¹¦Ñ¡Î«ñ6âSjPc8æÓÓÉüæ]¾ÝYâf©ÂMu&ÚŸ¯=¯$yøPYå±(†*’‰HCeÆt åI‡ò´UÓxŽNí./·tm§6'’B&A<ÖXGf—3Ï×zu¥ÂG x©0&IÎíÎ2ÒÐmT "…=äÜï%¸`G³X¢«ä9Ž¯DjŒ™vû¥'¸Rt.=âMÊP„”Þ¡“wÇ털¡: ¥3f˜Äó]Öà ¥Z‚4»Ê3^>Ô iæÕÁÖèqiwYK;ò– ä¥ìõqe^;¶‡#ãßïléiø³l A°XB’yÑ 1í-¯‚¹T@Ø4D/ÀoY•X:òY(ƒùuëWê}V {8óñ‰cŒOüfôù%Tai¼‚vMjåXœ†õXf{»õ±œÐ8¤eLʘyɇîøˆ±ÜÄ\Uÿæ'ë܉cWmUŸRʹ í„A,¢$Aõ¸¨#»_U@K¥Ð])9àŒhdMU6/¸•M€kÄ - ~Q*šUF¡0©”,Áò8!¤·¡8BŽäªÚï]ÊÁI‘—î$ ^ÔæïLßcc׎7í8šàC§"cý<'*õÛYtpÚŠ5ÒÚ5³„®KŠM”PR%lÓRºÇi¾«ìÐÉØDJ.‘¾P³&èIìM;äÉ9£ ÿ¯8¾ÏÛÝT=ï‚û‘ˆ‚’¦LêSÂrûÜ€Š]äèÀ;CÀÑÝg -Î,- °Æ‚íª¶~"ñùì -ié“‹ql|,WÀ¸%ûú0 -- æAJ%G3„¯·âñ%̹ßf¢Šð‘i‘UF›ãyV´v!ç5Í8}Íc^´K—`q±ÖR¯›‚’è˱ÝÈI::ÖÖõ¾Zç›ÓYîöU£j»í²ö£ª¼l;è -r -›¯<oð:<|—}îêô0†g-)×송ã - /ºÝÙÑáÌØ»:kì#ýP$ÒHF¾òÁ¦ú‰™ï]Bp/Ø< -õ¼©hÁÉ‚¸N‘¡öATúškÄè¯2lqÔV´ÔXƾ÷¹0|°‹ÀЄøžî¶-Yü‚ŽVžSç*Uù¢%Òs.™R¦UFKz4n“œs †˜pÞ0‘j3ŠvÈ Õ鿳9'ŽSPIHÀ&¡ímÓd[Ë<çå”s[¦ÌÀä¡JA%˜xŽÑ‡j¶â´ v²ý•‘†@‡àó:¡EêsÖðp¬6­Í0À58j¡d98—µ‰°N›ÏÖ¨*2žoP„‘PõÙígSEußÅ!¦ÓQìò¤O³¾ŸÄ¦äo<w]½¬ƒ+¤¿¯•§Œùz t5œaϹ¤¼ÁpQ…1¦T<·¿gûCa. Í²í‹†šìD˜¬èØ€Èäš|Ë!w#‚!¼Ê–ÉxÔŒ¦T(ø4—3GGdEÃøþ°xþ›µ>ÖE=€^tîÁãTj!ÂEŸ¸§ÿ×"UP½_pYëão˜œ;›?i?óðR»?}òªø4Z˜| œ²ÁöÊ!}3ÜŽào^O‰8uåç«ëÄ+߯§ÙØëzó}áÉbB¾IÏ]v‚ƒ3þ’½zD·ÎªþÖÓ5{\* ¾é 2 Æi9jaÎSäwLôðR‹$ìosøªñ]èÚÂñ½yʳ@þDHlìa#[ý¾±õËÓ0Eð;IŸÎ 2¦íë) -O§‘«AV ¢¾¶ã„¡Ÿ³¼Èî -h¸2êbõ¡0¸؆†kÛ¬êÜõªŒUmF„¡?ìÙ•9`<Àu[]ÚuâÓ«²ÍòRL)è}Õ‰0Ñmí³“Ï(ì4ëµ]ýhs\ôð5” Ü¡m#¼ý)4`A -•R hôs n‰$HÎ^=ÿ·]žì¡VÇú h_´xèwœ¿?y¡` m¢ÇÞŸð -™Ìd‰ÀÈ/ti$ùHsÍi&}ÉŒÂA/ÄKÔû64miKÜ „VÞÕp‚½Õd_T5¸7–#×Àù}ßåF1†]êÀÓW¼­*q¶=ÖìšÄËüÔ]ÂÚrªyºM¤I¸}üu6Cï€ÖÑôo¶Ï'éw<êF‰8 “§Ý 5Ò©v: Gˆâyn S—ZV»%äz ®œ¿w7 é©ÀÖ ù ‡œ³\óèYÓ8“ad#î_UG|9e©þæ2ºTsÊÖë׎¾¡±Û“ï;H~öÓÙ?;‚ƒU³uR~ÜcÂÅ„>%@³Ð¾àÎñ@h)|s/0Ðt›…ÎËÐóæE›ÛÑ¿ .Xì 5[rÎb)Iˆt²à½yCøMY×4JŠC³ÍŠ Íj]4Â3y¡£) ÍŽÌ6³d_¸ŽQÈÁx]èÍܯ¿:^/fJE±Á¹Ýj‹4”ðX#Ï ¬ô:ióæXÁdí‡Á, q)ä9 +¥¦õ»t—CŠFw#Þ8÷™/Aè1y×n&®ë &}/²Wé”éGá|›Ô8ˆ@¨š õ^§Yb—÷Õ‚«y¹×Us H³MÚ‘5)‹ü0Â^µ©®íZÛì[‹ÿ°Õ…£áÎÒÕ½®Kð¦W5iQãcÍÓÅŒ¯åúyÇ!Zþeñ§¦£Áq}îͯ·Rí’ÙÃÙC•5ÚîC3¿ ýüêy"×4Na‡^‘G‹ŒƒÑX9ÉN¯XÕßJÅ3+ì¡[{ÄøÞÄ\Y}1“Uf®£Ó¦¬ Îùœ‘t|/dA¡xŒ×E†þU ´DÝ´…KhF4’º,ê× ÜjU€kÄ + ~"˜¸+|¦bÎí –íÄ%†Å2$Ór·KŠMò¬0'I°¢&+íñFuðÛÖzex“†£ >Lp +åËd‰Ø9l§ÑÁi©•H£W–%4]l$˜àâ(x$ëÔ4S\‰!SSn±Z*'BãiBFÆÿ6†©¬FÎ4Ô¼ÐùùúÝk‘,a ¢&A:P‡!x£ ]ÙÛIt¸,Ÿ +l m¨8úKìg–ûºIªÆªš·{+¾HŠ€‰Ï0F^7æ V ØUDæF*‘5ֲěD>ÐUV§‰YZÞÁP”˜_¯iíP¶4(´¶çiÂošì›–”Mô(eàÉ %«¼žÄ®­›!–œQ +òoýÇY³u9r˜ñ:ç~£ ¥ »°Ü¼Ô¡€bç9°È<ëÝ}¤°‘¥+1‚èŠD[|.ºøL’»à¢ ŸŠÔ:0n‰Ã> Œ\K‚zRa½™’ÂSÀ-íøN˹Ûj ‚’pki‘VF›Ãy’7zÁçÍløšm–7K`q±VR/›œ‚èë)½ÝµVtt¬IVÖ»r•­G±ÛU”Êͦ‹Úwu_fEÓASpÈMYe.ó$vë€×ááÛä¾;¨ÐcöŒ¶8Ô½XöAÅåA]t»Õ£Ã-c?n«¤ÖOÔC‹¸zÈ9Cüé'j¾3AÁýÅ@ç/çuI æ.ˆk‰(ðV¢Ô \M ‹ñ*Á2GMIKµ¶ØŽ#ã†vYÐ5Á¿ÇZ¦P”H#`t´pœS)‹W Áž1ɘ" ¬Z´¨G³e’1”%œÕ–H¹ùŠ5È5åé¿Ó'8ŽPAHÀ&¡ít]'myΊ©ûÙ²L¨Ê}ƒH0ð"½!Tl#ÄH ÍdùË €ôÀÇyB²ØŬáá +X­ ƒKpp”&BIsp®•&Â:i"VGŽ½.ó¼|èüÃéÈwí¤³®žÄ¢äoÜÆþ®ØŠt¤©1Â>ׇ”y>šna/iR.Ð]Daô)ÎõÉnŸk# (³t󪦅:9¦tè @¤rI¶e»ŠÁà^EcÉ8Ô„¦”(ìi&fŽŽHòÚâ»ÃÂù­÷öXãõXѱC©†8˜»@µ5ý¿±€ìýʦµÞÿ†Á¹ÓùIýE›ÚÝá³ÅçÑõ¸®q¼ÆòÊ }7ÜŽàïΧƒ„/#lÜ”ëòܵ®#òü¨Ò[]¯¾gx¸ßùT6<6Ù Ž xê§[ï¡nV]×Ó{6Uæ¶ÓD@ôÓbT‡†I똨á¹d‘ßwsøªñ˜]¨ÚüqßhÙ¡Ûqüþä.µäaÈ| ËPØCF3ûLÉP=S#Ä‹dà|Í”§õI3ðÕ]¢ê·¦iC[Â>M ´tƆ¬®&+£²Æ½!Îú:7ѹl‚žžÚme³M[YãD ¶óSÝ„ÖÅTù>4œ@F,àÐEüujCêQ¹Hìÿ’nÇÓ–åpøŒ%À­â˜Ó32½Dä/³›ø’n—ðV¹|þÁ´ܼTºkÛwÚÀe*HC OêÚh Ý!Є•ñå”iôí˨³¶qg˜€´[k÷¶M³–sB¹©}&Ž•|SårŤ˜§•ë̳½æ*i’»é>r¬Ü]Öö¥t±\² +:0M‘)](ƒŽ¸Ý„¥8-€6uUÐc.®Ü¦ÝÆp|Ô¿µ?êf”4þ, }di’v ?°tBÍù}+5»½œ¤Ûñ´š½I<£eîÑg*Vmiùœš/ööÝÿ>ɤ¸ÒEæ€&ßw9õ÷V×M}B¬=¿_'‚c©òo)UD(Ô3)2V jMúBãRɳB}{œsŽ¿R쓪îÚ¥NàV)x,>-ÞãßJ¼ÿ‡Øy,âO#ñª‰Ð£´SéºÌï»'û§ÅûîãO‹¥„‚”¬vµ(æ×øÝ7š×mºÅezF4W`_[þ½¦µ¼,¿´ûšÖ÷”&Ó –·®öt*ÅF7_=$Í3jÇŠI—:µ? +r¦[~Jçi~‚( ¨ù°ìJN~†öfÏF±—~ôîÿ# ˆ˜¯Ô WZµHAà +i¡ÈïÑ'y÷uÜb Xÿ/LN+8endstream endobj -1213 0 obj << +1223 0 obj << /Type /Page -/Contents 1214 0 R -/Resources 1212 0 R +/Contents 1224 0 R +/Resources 1222 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R +/Parent 1210 0 R >> endobj -1215 0 obj << -/D [1213 0 R /XYZ 56.6929 794.5015 null] +1225 0 obj << +/D [1223 0 R /XYZ 56.6929 794.5015 null] >> endobj 322 0 obj << -/D [1213 0 R /XYZ 56.6929 496.5566 null] +/D [1223 0 R /XYZ 56.6929 556.3324 null] >> endobj -1211 0 obj << -/D [1213 0 R /XYZ 56.6929 471.7746 null] +1221 0 obj << +/D [1223 0 R /XYZ 56.6929 531.5504 null] >> endobj -1216 0 obj << -/D [1213 0 R /XYZ 56.6929 154.8032 null] +1226 0 obj << +/D [1223 0 R /XYZ 56.6929 214.5791 null] >> endobj -1217 0 obj << -/D [1213 0 R /XYZ 56.6929 142.848 null] +1227 0 obj << +/D [1223 0 R /XYZ 56.6929 202.6239 null] >> endobj -1212 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R >> +1222 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1220 0 obj << -/Length 3046 +1230 0 obj << +/Length 2985 /Filter /FlateDecode >> stream -xÚÍZÝsÛ6÷_¡™{¨<­pø 2o®-çÜIìœí›¹»¶ŒYœP¤*RvÜ¿þv± D9´X_œ™ØX‹¯Åb÷· ‰‡1Š5ã*‰F6‰˜æBfË#>ºƒ¶·G"ðLZ¦I—ëçÛ£¿Ÿ+;JXb¤ÝÎ;cŌDZÝf¿ŽOÿqòávz}<‘š ;žhÃÇ?_\žQMBÅéÕåùÅÛ]ŸÛh|{quIÕ×Óóéõôòtz<±Ð_†žép~ñnJÔÛë“÷ïO®¿ýåhz»ÝKw¿‚+ÜÈG¿þÎGlû—#ÎTëÑ|p&’DŽ–G‘VLGJµ5ÅÑÍÑ?·vZ}×>ùE\0!µMTÌ"­ã秥)8LH!X¢õÓY'BYÉâ™hÃ8Û3‘¢s&"R,VJ¬N˜QRùC©Ýl³Î›G”tP «# ³ ãÉjµ>ñ¸ºO ’kZfDd®ÌÛÊjN¥çul\ÝÔì©è#½5FŽº+þ:)¨(f -T ä^S°QÄxÂõ`#ËŒµ¤í³ªüsy7(ØÓÀ¸Y§M^•$>¬)Ñ«t]çåÝ¡‡Ó˜¹ˆ¸³ö×±T,9xe¾²íñ¼ˆ%pÆ\‰XÁ¶¤H¼äÖ®®Š{·ñÙå Ø -®‚VB¯ Šú'4 v\of lŽÆiMlÍÂQñà ©ó{GmEU}Ú¬jj_9Ï1ÁÀ\A÷HæÕzéÂaµÇúÑ-Òb¾SfEîʦ á˜C[:[l¾L—A#j·Æmƒ½;pî~Ý!}Û«Åc&åàÍ‚qb!Œìçyz^žü«2ȬY§e =ƒ ýwdéé¼î¯™Ëï_­ÝÚ¿cãeð•&‰Dl’„ÅÚDû"®6Í7’qíÊì t»ë~]ñŠWo1%¢!§kbË.Èé–U“χ]îm+¿Ë«Û‹óÿìÙý¦šUÅáuVõ=릕Lédèú«Y™àX½½Þ‡=ÿØgr_Tº }-y ³öE°íñ¼<…d:VƒÊhÀÒ'œ¼è¦\¦Íl®jH¤ïA–éƒ , ·;mŠ¼cʨò!­©nS¦ÀxΊê2׸õ2/ÛêE fEZ×û.Tú ñ¼TœŒ+°*áèR©âa‘£ÏÆ:…Ž0´à°¾¬¨Âo5€v·'X^3aw÷¹{è”L(“&ˆ9¬ŒÇ'4>\öDr¬É>(üV¥c·Y.Óõ#}x eZÔR0Å݇ -PÛT¡\¸¾%kXNF‘¾ Ò2«¬nÙÒÆÝU0¿· ÇÜ.r’ùDX°ü±Uû²ßö™(¥üš•ŠÀÔ ÕÔþa®kRúl¡+Vù󂺺ÉÜÚÀ\JGç`Cææé¦CæaÀ¼Wêí•õ"Òωî‰ -[/7EÑ'ÁZŽÙ"-KwÈ–v.Õ×]ÔokK9gFƃ¶”GLŠ ¡¥kªõ§Á›øÈŠêõ¡Ê!{ÙYÌwìtƒPj@f:‘Lê$ØËUWc8æx³˜ÏHdÔ瀼º ùŽÁŽ¶†YEi:†Ixwä5ùV‰†p/ðåÝM¼š¬eÊÊè%c¶]ž•vĦ"=„ܵUD G°ùuîêA)᪚ 1¨—Û÷âg;áôEµ)²6|¥r민1f}Öúlu„n¢I×Íff?Ša0šÕ2lõ‰­·éqy –­¹~~ƒ - ¿2ð=ä`øýØÞÏ7 (NAĶç¦]€*Ò&8ú±{O _¸Oð±) W×} g+#wø={V'f#øªUH÷ÀØ D-ÒÆ aW¶^™³$Vñ'ˆDë²^±SÈùU‰kñ8жŽŽ{U­›0qÓv$HñC¨¾ø@ L³,äNBÞÉž¤ŽNÜXp¼ËnëòC·[üTH„5*c<„ |„=îËãÊn1FŒ/š¾},%ô“A(·Çˆþƒ¶ Ä5euüÀ癫sê™QÈX¥wa„4 U»ÞÉãšÿFs´J°àü ©d<¡ -jÐúm9 Ÿ\m3­šÛó3íôØ%¿+ýúŒösÞl0ã)æ¸z„ðp++©ÜÔ(ý(ò#LÞaNåٕ؃ÞLOéûê2Sßí¨(‘wg4ühÔ‰žµiNÍOnöi¢å5ÞÆŒæòÆ)Ýf šN/d`tÇ¢îm|2Sê ãEåð/þf¤Væ D’“¹{|Ó+¼‡æ>§ËUáجZÒ(—TžÀQ?ÞLû6ÙúÍšÔšT~1iéšç&Ф½®ë8¾Ò}Ó¤¯‚GJAÖÀdb-‰'Ëë†tÃ,0’j)Iˆʼ„³ µb¼JgŸœ·ÐDÁ— ׈mæ -èe•m -W÷*ʾ…îmw¯ºÚw£~0罧ٕÒwœÉUV1ðñCXZY¸„Æ–ÎJØúì¯äï½Úƒ·7o¿L‰½ìq¤»æׂ‚J³Ø¼è´ÚÏ‹(#¢! ¨Œfá[J>€Gú£ÁwþiAé$(|ÎVY„uhØj2~,óz¶ÿlå=6'/ ļ¬(Pú2”÷“ (”oô¬ºw[÷«Aù(éy©„ -¸i%Q€eü%ötE%yÍž Ú,ªz/|J1Iëzö‡(Mç4¾î„¿­Òph3¼2ôj‚qu…»óç9©Êb8V;Ûò#*Tcß©M2l|WÝÕÔ²‹)¬ -©C¤é½#Ê#_Oa–Nbæ¡rW}:tùﳫ÷'þµßŽ #˜öÉÁ¶‡ésKøMᢥ‡5óÅF}ÛŸá!Ã"zéQ¢´üƒ´mr KÏF,ŠxÊäåÞcxªpªðVR7›Dý¹}cÉdºsT´sö¯¥¢€™xÑmgU46Lk3¤¡2QLŜ̚—1ÉH¶k>ôᦣ~Ü´êÇu«~PÔ¨=õCîŠx=pÆŠU‘æ×?,#‘mz yüdÜäKWm0)¶\SîÕ7P ®jÞøù¡ -‡òuÛΤÓ{FÕ3t,Yâ‹ýèB !Ïù)€ "¤ Öªfæ©×;K žøH‹‡ô±&šfn6ë2ŒfÆçWד¾-¿Ÿ^ãO|$%¥Œ lYæ ²Té7•SìZ¨&ïŽCÌuî3Ȧö>æ++BT „XYÞº -j{$jçÅàÃo97erlª*£¨bbÀì\„δ’>ÐGŠ’¡“A£?MWÛ²¡éî\Ca˜Ÿ†ÊÝÑ™¸ÕG¨ž§yºVT;¶ª¼`LüŒ5$i>ÍÝ„÷iV•?„Ê°myo.áí æm‚YU*äXÒ[}ÌÒ’ -Ñúš¼6+Z| ¢$’ w;`]³>éþìÂEDeOT'®'L¢Žò¾¶óKªµAÕ¡ºUõYÿE%ùØN¾ ¢rÔm‹ &«é mÀò–wß´°GH£à5ප˷!]i·oOçÇEïVˆfœhk& ÌpŠØËÈÐu÷nßuˆ°älót»- -Þ$diö2ªs8E7YUuÞø_½ì°‘ϪÒ•ØZÌ&-Ыj©Û×A$)'§ó‘áÅ:$–pýVÔÖÐdi^í¾@þ÷:˜ôhÍ*}µi2 &Xn(I€Ú€ù&XŒéª ÒŸ×òiÌðàØ]žG9¨vCdûú|„'[mODÐö‰U||ŽR.Ìõ9¯|þØkQéà£Ý½AG"* %m¿m(iÛ@„mãqã% ¨coçÀ•/{g‡I½€cI=c± Ç î>-ò¬E€ð^f‘­ÍƇÄZ$~ æý(k«›Ý¨/ü"§µ¸ýñôÎK -§; ãëpÌí~ð9ô Rìc¹}ò Òÿ¯×v!Z²Hà -8³’~óñô‡§|4ñÿÕŸ¹î~YÀeq¾íeã¹a±L,K‹Î6OE«˜éXîØ:‹ÿ®æ¹÷endstream +xÚÍZÝsÛ¸÷_¡™>=W±ø"@æͱåÔ7;µÝ™¶w÷@‹°Í EêDÊ>ß_ßv!Q +e6M2“x&Xâc,»¿]ˆOüñIšÄLfjb2'Œ'“ùâˆM íݧ>ÓÐiÚïõööèoçÒL²8ÓBOnï{¼Ò˜¥)ŸÜ¿D§?ùp;»>žŠ„E:>ž&šEo/.Ï°&ÃâôêòüâÝ?¯OŽŠn/®.±úzv>»ž]žÎŽ§yÿþäúø·ÛŸŽf·›½ô÷Ë™tùýè—ßؤ€mÿtÄb™¥Éä>X̳LLG*‘q¢¤ 5ÕÑÍÑ?6 {­~èüã1‰œLe«$IO‹S0˜–HÎã,Iögri€“qg’蘹9Á{g•ŒS)“‰I²XK!ý¡üqoWÇ<¦eícdo ˆÆ$ÊÀD®ïšÚ¢H»U^·0²¥ÏGªoíê øyº¤FÏÞÎmùTÖñþ)(8£µ˜ôÿe‘*%hˆ†:|M+³Œ%c2V&ÖÆð]7ëî ¹µuñºx{ëþžÅ+EÌe"ÇÄ+a[‚g^buÓ•÷/£‚½ ò»¼º½8ÿ7ÒK0M×Ì›êááªÔ÷.<=S&Æ„'¤ÛVê¥2¯J[kå”Óܶ-¨Ê®¹Ç’Xô.ûïkÛví+òì-ôkÉŒš1ŸeOȃòԚŊ)5&OX[ʹö‚Z׋¼›?ÚbT¤ïA–ùƒ… œp·;§ÐŸD;S kÁ!u¾d,ÁtfJP¯çœx®ëü®²Ä¿Á²°]-Ê:TÃ¥~°kg#aÅDíÈ[`&é´} –Gª,º÷T•P^PJÔw]UCâá± ÂyÌëÚ¾b‰ûWòË®ù7µÄ˜+•YbÀ  ZâÚvÏÍêã¨Ý¸¤~hƒ—v•weS¿bmû‹ùŽ½—+¦²1c«ƒˆ‚‘±]p3F%vö†³œ£ÄpÌkâÚ®ã{–X»D¦é˜¸œí`|¶âš¶v¾^•Ý8b:Y‡'Q‡¥ ÿÇ\ë1Ô¯¹Ž¹aYÁæW%¸÷1)ß,íÜáW/·ç­uŸÝÇf]‘üï¨ÃÆYySÙì°Ô•‚ÝÏWÝz F_¥À gõ`εúèÂ_3àï´Š…æÁXÞ Ä¶Ìð )Áì{ÞÞɒDZ”"Ù]ª%À"Læ¸óÝtæ÷‰À>ÖuØihÂÄB‰´·À9°B81£‚_j–΂"ïÇÜðŠÖÖ ‹³T¦»À ÐùW[ Šà `äW¤[‹'À}†:<îe³êhâ. D<ñU_|ÀæECZjpwr`~ÇP—6àvw68|™i¼Å®ÅOåZ£ÔÚcLêÐtØyYZ‡»4.ö Ê…€Oöv Ü!úÜ&×εxðyfÛGX2–ùqȉUkñɯ,a?BD¥³JÚa£ÎáES¬À†Ä…›0ŽS¯ÐŒëƒæp~:Lµ_ŸNüœ7:š]Þ ­ Ñ°‚•ÕX®['}¥<‡qðî±<»ÂÒµÓ›Ù)~_}tq솫“ȶwvÏuà¸N)ûæF>ÚùÇMxwV¶î68—xá_×å:ÄxÇTÿ6²ýXÃDÍXä.*øñ˜ÿE‹Dê7ÇS.š»—7ƒÂ{~ŽíùbYÙxÞ,ËÅ%–'ð©ofC›ìOýæ Nj>oÒÚv‡&⤃®ï8¾Ð}S8¡T ÎÇò. +Ö`2“mÍëb‰f5îå.j9Z}ò;— óäÖËÁ‡„=EfB4ÜßQkÛ,,ÖÜçeµÆŽ‡aFs_ fg¯f?aF>1>vO!æ4^ªEÙ.]L=©#Þn)´AYÖp¨–GË|þÑzs-)ø•‚,!›Ä#Ћ¦XWèü÷oÛ†ánòêfÉ,·&ò¨Ãg¹Ò—ÉýÛ^'–Å`sÇйââ~輨açóñ“$G°Çoo.Þ}šÐüD°¯fˆûkþZ·D&qª“ϱ~aÄAÑJ#c°£–Šh3 y˜fŠÚ;n©~Î>•‘¾·îHã]K ù6Ë•E‹²7µC‚kŠÅTbèç¡v^4©îßšÄÁr¡Ý…ž7Ov€dÆ}~Æ•øTæ¨ ¸h5R€&ýötƒ%â–·Ö=6íÎSyõ¢ÂàüÉö6ÕÚmè°ÒôOãËNøÛ* Pš«±û(usÎɶÚÊ>øóœ6u5-Ÿmú;\.#?“| ´YôsóÐbËÖßüPù“EÊÇžrYV8‰9&$¥;ܽü×ÙÕû“ ÿò XÝŸ§F¦çHñvã“„Ðo£¾íOz†2?Áüð ¤mBÐ7.=£b¥X&½kw& pT1zéj»õRn^È + ! +Þ¹WT´wö_KE!žŸåýiÄAåBÄàÜFUTdâjŠ—ÁgL Âéã†ÍGŸL÷ôé , úu¤@íèŸëÝ`_»¸Še•—Ô×Å=ž(ÖvÐîxŸE]¹°€ýœ]……474` ¾ê¾óóC•cåë6ƒQ©w¬ªïÐ3e™í”öÎR¢ÎóS$(GA¸ÛÒ/s¯xã(Œá#¯žó—iœ¹[¯j⦣ó«ëéЖßÏ®Ýï„D5 +"ÇE :‹•~SP9Cщ¾i€jtïn0…ÍPgÿÙ´Þɱ4œ{ #Æ;ˆ´hꨒ¶ 2Lç\‚¢½q©3²«RR:Ç |ÊÃy^#™GÝQ“×f)A‹A”H"ä Û6’î[KÑ){&{©TÁLõ„˜¡Ûðµ5Ø_Tu¨%U‡ê êóá‹Šò1½”£Î¨› ¦mñ ayÃú‹ne²XTçÝz³|Cc³y4ÚŸß-z»Bg&À‹3£`f*|')ŠH×>Ù]ß"Éb=D`›VP¢l'©}§h§Ë¦-»òi'¹í[¯éJª .fWÕP>5U.ÐÏÆwybÌN25 ¹NxFo»`»f‰T‡KÌ;zluî…ʼnd{ï»íÚ=ݺ¬U0Êøò\h~5Ù}(Q—€ ]r Cx´î+2ÙOLàuyhQÙî2=h-ábtHúÄt"ãÉpW ïÊÔH»3ª%û¤eyÿ2hQmÔöÖ9ÚqB*§·­P²®ÄmAÛvÊâ®0–C¯r18;Lêœ +™òm4uOyU@Â7=¬»ná9…2£Ä„ÜP÷à m£Ùý ‘~ìõp4¾õq¯ã}Ìòe8h ­¶?žû5žc˜Ùû5Þÿ7*,„ë _¦‰†nøŒ~Å÷ɯù„à±ÉÂQu¿=Ȇ~óÇ&£ †ÿõ†ÛŸ_*Ë4íÁ;ƒé8™q8V¹çw§ Šïc"Ó8IŶ[oñÿÕ¾$§endstream endobj -1219 0 obj << +1229 0 obj << /Type /Page -/Contents 1220 0 R -/Resources 1218 0 R +/Contents 1230 0 R +/Resources 1228 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R +/Parent 1210 0 R >> endobj -1221 0 obj << -/D [1219 0 R /XYZ 85.0394 794.5015 null] +1231 0 obj << +/D [1229 0 R /XYZ 85.0394 794.5015 null] >> endobj -1218 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1228 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1224 0 obj << -/Length 1962 +1234 0 obj << +/Length 3540 +/Filter /FlateDecode +>> +stream +xÚÍ[msÛ6þî_¡™ûpòŒ…øæ~r§çNãô·s3i¦CK°Í E*$Õ½¹ÿ~»X€%ÊRr¹»$âeñ²Ï>Ø`1áð_LˆEiNâT±‹p2_žðÉ=”ýp"l™«4ók}sò쥌')K£ šÜÜy²Æ“DLnï¦ Ø)HàÓ篯_^ýðË›‹ÓXMo®^_ŸÎ‚O_^ýtI©Þ\¼zuñæt&’PLŸÿíâç›Ë7TYß_]¿ œ”~ö}sùòòÍåõóËÓ÷7?ž\Þtsñç+¸Ä‰|TuÞfmþÉJhtýI[ÖqPÙ6ÐHÚÎ#Õ(äu +Ùf Ð鲇Ũ^ i¬6¯€áÿ°]ä%Œw C«Ê¡LÓ|]74ê.«©Š5V·ch²vP 𣞢o„÷Ž1t$cám¥K «îm…UõÁ¦òúói‚ÖýN·Èdh¥`Ì`Ó­£g¼5NTö ;?À”Fˆ¿h‡s‘HÇ9m¾„F¸¢Z·Ïšõ|“¥¦ïÕ2ËËsOúY­ï€²â<€dÓ¤Ïã³õcø=OÎP8È9ÏŠl©ÏùY Ó©kHÜf h°:gÙâ–²î`Dڃ䧬 Ôû§Ø)î¼”YÀ#cþuƒ@à±±.ʾõ·BY@C•yUÀA^þ@ãŠ3+"£ŒmvY„”G&Í ÷ú-©÷…•o° Õ@Oè¯øºÓ‚‡ÕQ"½)»^Jì?Œ“ƒ•ÌL1W¦Ì +Êõý,¤ cªÐ®a劬€]sÁj†º±©»^SÛö@CÞ˜2@±CGc>•ã·¡ò1ð£SGã½)Œûžq&“"a2£íû•ÒÚ©Ùº©Š À!D:F”ÊÛ±0»[dü8‰PÕèÄk  +>\cK‡µ%­ +俸~ûöò9åIä ÑÆITnÌ +%ÁòÇlÛ˜£Ød&-¦IcÁæA—”*+*î»±MAörÕÒ‡“·ÌC-ˆ¿®JjG›Z@íËnÄÖ¹Á*C–6’­4ÄÙl 0žóÀÃéŠ|ÛìÖDs«í&‰R3®U ìCY´ë5¶Üñ~,ªMI)ãËÀﺤrp-¡3#ø,t¶ ߪ ¥Iö“øŽ>r+Nr×µ1R6¦©NÓ°d¾ +Ìã6‘ál1§¬¬mÕ„›Ö`/÷)2AÐÈAÊ";QS]Î ˆ¢”o¢øm>®û¸¾oëlþA·-µÖÍô)ðd'ÀßÌÜê‹Â™I"-O&Ò¹Gv,ä ‘HG¯³±•ê8WÅnÖÆ ’>\F³J]øb¶°±øi!p‘*Ú².Ô‹›¬r{‡BoF¯È|!÷Ϫ´Ùvó0)= MQQ*½øsÀC¶‚(¾ó÷’7.®³4~(¥®Mç(zNùA–£|m{:èæÜYçzš³“ëÔ Ý§f½\fuþ§‹•òrK‚ϲ˜ÖÅöÁ¨€³H%Ñ1‡0Ö–#†§0_ØÌÄCàÞ1P;ÂlÒµŠêÉO %UwÆ3@m$`î"`v‹ržÖvÁ­`AÊ¥o§Ær½¼ušrZ´‡FT3÷Píræ<Ÿ…«LÈZß?¢°îÙË’î9fWÛpÈn+”ØÍc;€r¿öÝÁ +6îX +[5mï‚;˜£ke£¡Å°1E¿kzBàQ\(¢‰¯¥ÿLñca˜x¡ãדL#`¹DîrEœÀd ‹@¥ÎuBw}Ìo* ££Ð4œºƒQÖT[çIT¸¬ÚA<Ú¸ý¬µËéA’°€‡êR#wt…dºÁþÔÈÌäàð!¬qdGÌv‡6D‡!_UM“w´Í:¶ËÛ3Ǿ+?¿*Ç»7YtìcŠ«í¡(çbtdü/ºßað1:eIÚð}Îbîµ_Ùn¾& ã©PœHñ´ÝH€›ŒRò¥lp;zr¤ìSé1†ÓŸ(\{”Ep3ÑqJG*Ñ[oY‰qÀ’ N(1Žh($GÉúé# ”býn!ŸT¢•â¼ž¼œë/ÚQÝùRæ6/ßòŸÒ7ñoysŠ8KbpcFõ‡Œ*˜È¬'Léæ O‹Æ,,†ùò£tSl1áaSó¢ùÃæ¦"–p!¿xºØeiçã ÇáèþVoÏKç½~û8<îÍKDî»éN‡Ýn;¨HÇþZVÕ‡õjèËãkúW×~±°mÝ2ðé³F÷ÛâÅ‹ïqëü7í»m{”5píæ&`zÊ<˜}Ël¥–Š8ÚÃV)ã*‚É„ ¹¢°ŽMGà,‚šÇ؃‹K`¬f[ÝŸãÁér^­ËÖêo+Â8:ƒ=îi{’¥'ŠG_lO¯7îüÒyRóù¸ùo;ŸÃÊ[Ç?[!Äqß íòêù«ŸŸ¾¶Û{†§0ïé[ƼŒP…êÀ­8žíÕÚëÑ‹æ€qž¬KýÇÊ#Óí+zËMÞ˜@9Æ÷Ž q®Ýží)  ®º3¤m—}`½gwûxQO[€LS~]çÏÓÙ·ì\à?ðX Ó aa* [tá4²>",Š•[Ç—Y^¬­.†4gŽÑz¢{ŠL¼­q÷~xÔµødF‰Ï§Â=‡m°ó2J ÉÝ{ëüÐÆ°;çXMWУ‹Êͽ;°~È>uŒú¸Ç‹Øº?{ +¬ +¾e¨.OžùIÑKslïDÇ€§9i¤ö¢uxä‡tòùˆíN†·!‘9jk³b?ßí ê?;?Üoe¿epÁx +U!˜I¡ª½ +¥«„ÅBF0~¹dUû+ÞBoÝ8íªmèŠð+÷[pÇ E¾Ìw‚Ÿ=Wx8ο ó‘[7äF_,ÜI\÷"'[­tSm½à€E"dI†þ]ô {ùj@îþ.P‚@°/(fAÄ„ §Â½Ýy®U"L)&}¨4<¦¶F`¯ÂúWKî¢. +ûWK‘÷jɾ©„@ü§EÙr©wT£È›V—³ªt èíãêwãÔÒ+ÆUU·]>~¼§¯ïlù´aŒQÂfÿë;÷9bÓ¶ƒO¹Þô©ßqhÕè¬vÏCíìÈçø¢­Ý‰ì+>r̃å-UkuAÞ¾ßfìí¸=øG/#íÂ'½ëcÿ¶Æ{ShN‚q¡s+ì p^*عû#œÝ¡ÿgH[Pendstream +endobj +1233 0 obj << +/Type /Page +/Contents 1234 0 R +/Resources 1232 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1210 0 R +>> endobj +1235 0 obj << +/D [1233 0 R /XYZ 56.6929 794.5015 null] +>> endobj +326 0 obj << +/D [1233 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1236 0 obj << +/D [1233 0 R /XYZ 56.6929 749.9737 null] +>> endobj +1237 0 obj << +/D [1233 0 R /XYZ 56.6929 433.0023 null] +>> endobj +1238 0 obj << +/D [1233 0 R /XYZ 56.6929 421.0471 null] +>> endobj +330 0 obj << +/D [1233 0 R /XYZ 56.6929 173.1316 null] +>> endobj +1239 0 obj << +/D [1233 0 R /XYZ 56.6929 148.792 null] +>> endobj +1232 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1242 0 obj << +/Length 1976 /Filter /FlateDecode >> stream -xÚÍ]sÛ6òÝ¿BôL…üÀõ)Mœœ;W·g»OnÆC‹°Å)?T’²›»Þ¿],@‘•(i:ž1‹Å.°_Ø…ø"„?¾ˆbk¡‰V, -y´XUgáâ æÞŸqG³ôDË1Õw·g¯ÞÉd¡™ŽE¼¸}ñJY˜¦|q›ß1ì8„Á›¯Þ]¾ÿùúõy¢‚Û˯Η" -ƒw—ÿº èýõë~x}}¾äiă7ÿ|ýÓíÅ5MÅŽÇw—Wo £és„éõÅ»‹ë‹«7çn¿?»¸Î2>/%ä·³»á"‡c2©Óhñƒq­Å¢:S‘d‘’Òcʳ›³ G³véœþ„ä,‰äb)KAü˜è8I™J¥mGšÅRÈAÛ‚/8g:ŠÄDÝB±˜GÑ nÎA…aåKk:RÈMŸõ¦2uïTÝfU•µ¨`+GF aŠiÅ•åw».ÿí׆€'ÇÚÇÝ,1å#¦œÃ™"wdJû:”-&ÓÄuÓõž5H&ž}U&g«¦~œ‘ &âØ“þ†¢4ÿ˜á¸)g<£ñ„i)’ÑΗ1(÷¿¸h!$ÓèGËÁ0@uGeÑõ¦^6µ_`?Åæ>Ëó–w›¦í<>Ðè[7ÿkc8ôÿ¾õCÜp8»Õç¼ì {Ôàü*>^Õ™¬]­'§Ë›*+jË`î Ǧ¿fÏuÞôÎõ¶z0ídÍrÖ2À×{ç(’€¿Š™N¸ÞÅøl ½5è=uÑóͬΠø¹ËžÌ)Á5,š¥‰âŸ‹È±à–‡Á"À÷qoOÛöœ§î±6r õKlŸMë¦úfeç¡•ã—9}ÊâiÝ¿üO'¦)³1$eÌÜBB¤Eá1ûùXiÁ”–‹( -Y ›i®}Zp=JŽž|9¦§Ü8VÎWÔÑY-É5”ŒX†|êdG®U1±¿ÏX¦‹H¢Þ“Ù4ïi–#¢Ã½ísBÑ ´I[hŽ>AÚ¤­TÙG,BÕ¶ì‹M9ë8aÊ%Ôç<'f©ˆÕ¾çt$gç:EýD"'æFš©¹Cæîˆþ¥èׄ΋G$}tG÷´úç1$z'Ó¤²±DÍÆ´}a:6D¾M¿é'F€‘!tÝ©‡¤{xr%Y"g"FFA·1«nƒEÆÖÕì7bl"¶çïˆ6²¾mcé0!wdOœë×™cÐÛ«qE Òë•Ùcì%Žƒ æIšsÝŽ ôÔq‡¸ã<È3S¡#Ü­›m™œ­Vfƒ yèþ¶5g›¢&¸|$DÝЗ®„ -GºSTþ †z<¢Ñ‚“O¼íà"žrvZ@N# €™›¦©Š¾·¢0¯NwŽ˜—¢, zpe Ô¸LìS3‡ÚÜ„qlj6m IÁ¿À× 9+;²·æL€)Üÿ\“ÊࡨóŽ@RB;‡À‘­¥à›Ñ§,Îy0ò ÄM#1Þð–q3a@—;Éñ’¨·W7à•Ðùô¨ XãûÑ™­ êN¦^Â:4º¶°NnpûÚ4ugˆ Û/iðàÈ Ét}{žÛYÊ…çêˆ:{K!TeumωqÙ.£OÝ´Uæ¸Óa Ò~ôKûÕÚf2áCp¦¢°ÒÂÞU!w¾ª_US_•Gï¼SJWãtn3HÓDCÚGȯ¨°±£©b°sƒÈ!ýQ<ª=ΠX·q·ƒ¬¦ÓR.mÁ3‡îÛâéÉIË÷B ùtp¥÷¦ð0 - çJ©™(P)5ÊÆrñœ•Þz®ÒÇÚàÇ’ÿ9ÑõLµ½Ôp3¼2ýêUkƒëX¡#+î€×ÈP—=íÝÝcÏEnÜ)3úÐ]‚PóH‘&c`”ˆ½|NE²OpëKl›Ù¼gØÁfcêܧ9«·!A–Y_<;:ØÓ -Ããð†ýŒÉ÷µ&ÕݳݛN5Ÿkߔ룩ÁO>ap¨ø$Éâˆä#öN£ïWYjZkñSW^¬@hçÎD2$Í—U%vó¶<Ûº¨¶0S±ëaN¨$u8ˆAÛ!&£áÔÎDŠNC³®¾W>E#4ÃêŽ Ìùu™b~§ÊP6¶lš_·B?˜ÇÆyãLfÁÀÄI︛¬w)}­yÔ¡Ù‘ jö -Ç]‡&]‡VePñµ'¼sL<9‚è8¶&¶ÚÓ£½¶kw±ò#È1¸§ GÌ_Ò»ßýj>À‡9Ÿ6ÑÐ&ïäYu‚šNleùñVÖsŸIÆPëïJ&T·~Y6/¢3Ž>«¦ªüN:ÓOŸ˜&ñ‰ÏW&ëŠò#ÁxϺY‡š'âÜoöNÛ•™Oœÿij—#÷µ¼ôGr>™î”9e7TåßñíÍïlÆP!ÿúç7¥ÿÚ÷7²H'ñô~{Ú6¥…€sƒ{(=¡"<á}kÝtý.øÑ'׋éûvÅË"ï‹ütyÑšUß´.7`"=õqòÈòË–O_×ЈËß±u?¾vîebŸÃgHÂ!ˆþô«ûî' …oÆé‘w ÷–.ý¦ð|êàm'â!ƒî@Ìlýÿ÷Ür»endstream +xÚ¥YYsÛ8~÷¯Ð#]µBˆƒ×ÎS&q²žÚñìÚž'ËE“°„’²Ç{ü÷íF”(Ó^Å©T…Íf£Ï¯€Ì!üã‹4b¡ÌÔ"É‹B-Šú$\¬àÛ×îd–^h¹/õãõɇ/2Yd,‹E¼¸~ØÓ•²0Mù⺼ >ýíã?®Ï.O—" +ƒ˜.£8 ~<¿øLœŒŸ~¹ørþõ×˧‰ +®Ï¹ öåÙ—³Ë³‹Og§KžFÖ §á•_Îÿ~FÔ×Ë?ÿüñòôöú§“³ë1–ýxy(1?NnnÃE aÿt2™¥Ñâ ^BƳL,êI))=§:¹:ùç¨pï«]:—¿H¦,JE2“@Åçe,–BÚþ÷ŒáÃÁœ³,ŠŠ†‹¥JXËÈ +ab¸€,…aTOî) WC>èZ7½~Ö¿…¡hÌ`Ú†8ySñkŸ¯´³$÷|C"b"ã‰5t½Ö£;;!ž±4Q/Êý—ªÀ"“ÂIõ;פàAÑ6èÛjÛò4@ÿ‘;€9K4ym©0èu÷¨;÷¹¥g^õž*œ¾ÜiÈéQ™ÕzxÒø?1œ™¶rÊFÅ€'ĘÁoa^i}¡H„,Å2ÅiÌT’p,&}ìV ".÷«ïå—û lõ'éy©Ót¥‹%zõ–KËð‘êÈ3@‰ý两¶ª#Fû@œ¼,]ü=ÉFáv Ü¦í†žê‰ß†uî kãäMÖ›B(ö÷[ ¾“5‡ÞBPÙ4qc÷q”¹®ÌH÷ëv[•DçE¡7¨‡Ná[ÝcÑñkÛ@¯*(Ýù1š–ž QƉîUþ>Þ“É' ^xÛëò@³ËjÚ«ð·±Q߶µk +§ëÔsä<™ª" +ÄŽb©vóØh.0aÜi"§íÖ)øÖäÛ#Ze±ÃУÑOs ¦Ðÿø%ÐD*ƒ{Ó”=‘” +¤v€À7>sz Ny°Ãò¦ˆ_x«¸(°n:;Þ²3õùâŠÜz?!S§…Øä…ÆÜÉ4ÀMBX@#´…¹&Âùµi›^“¼¯èåÞ‰Áé‡î4 ¶UÊ6…×ê„z»W!UçMcãľ쉗ӣi»:wÚ)`@ºg¿t(Öv’ ß‚”‰]!3aw¬;¬ª«jŠUxöR†n—…Ï¥~ÈaL“ e)¿ +»ÂöNFçûm49Žÿ}CÔj_³½væó†dtGƒ´­ÎDïn{4¥vQæô ©öÚLÆ (ülëÆ›nk1ÒXó°°/›nJ?ãlÞÆéXåƒytr¶«‰4nbo|Ûö +%ܧ½)ÛaöP‘°,ÍøLÖ#¾ˆ¢iÁOŽGo> endobj -1228 0 obj << +1245 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [491.4967 546.2465 511.2325 558.3062] +/Rect [519.8432 682.6714 539.579 694.731] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1229 0 obj << +1246 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 534.2914 89.457 546.351] +/Rect [84.0431 670.7162 117.8035 682.7759] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1225 0 obj << -/D [1223 0 R /XYZ 56.6929 794.5015 null] ->> endobj -326 0 obj << -/D [1223 0 R /XYZ 56.6929 744.5408 null] ->> endobj -1226 0 obj << -/D [1223 0 R /XYZ 56.6929 717.3918 null] ->> endobj -330 0 obj << -/D [1223 0 R /XYZ 56.6929 594.9189 null] ->> endobj -1227 0 obj << -/D [1223 0 R /XYZ 56.6929 564.805 null] +1243 0 obj << +/D [1241 0 R /XYZ 85.0394 794.5015 null] >> endobj 334 0 obj << -/D [1223 0 R /XYZ 56.6929 340.8686 null] +/D [1241 0 R /XYZ 85.0394 731.9325 null] >> endobj -1230 0 obj << -/D [1223 0 R /XYZ 56.6929 316.529 null] +1244 0 obj << +/D [1241 0 R /XYZ 85.0394 701.4683 null] >> endobj 338 0 obj << -/D [1223 0 R /XYZ 56.6929 259.8095 null] +/D [1241 0 R /XYZ 85.0394 475.6865 null] >> endobj -1231 0 obj << -/D [1223 0 R /XYZ 56.6929 229.6957 null] +1247 0 obj << +/D [1241 0 R /XYZ 85.0394 450.9966 null] >> endobj 342 0 obj << -/D [1223 0 R /XYZ 56.6929 197.042 null] +/D [1241 0 R /XYZ 85.0394 393.3855 null] >> endobj -1232 0 obj << -/D [1223 0 R /XYZ 56.6929 169.8331 null] +1248 0 obj << +/D [1241 0 R /XYZ 85.0394 362.9213 null] >> endobj -1222 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +346 0 obj << +/D [1241 0 R /XYZ 85.0394 329.3761 null] +>> endobj +1249 0 obj << +/D [1241 0 R /XYZ 85.0394 301.8169 null] +>> endobj +1240 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1235 0 obj << -/Length 1102 +1253 0 obj << +/Length 1168 /Filter /FlateDecode >> stream -xÚ½XKs£8¾ûWpŒbyjN™¬“ÍÔNf×ë9eS.„QYHŒ${ÿ}…» Ù§»— çÈ#§+¹-Õ/ÀÛ˜ƒG(ÐéöïUcÎRá8FÑ°Ú¦-Ïê¦\³Û ŸÒ°ûT* -¢ð‘ ÈÑRý A9h×JÂØ -¡æù\¿ŸÎÊWn…ññæö—r$(/G@gÓ«élz{9ÜÏ?¦ó†K›¯¡[‘o£»{]‹íO#ZïhOêA‡F˜Z2² :¶eÕ#tôçè°õv7õ ~†MË5h-}ºº‚òœº–ií¼›W×Ç(—+n"– ’–C[,Œ/Rö¡|¾/È*‹À0`à8f{z„¥,D–¼!ò ‚hžµï,“„¥‡çí¹1zÄ€|Ë1ß7c®ÀÍñ si.Vào–bQ0«\Fì©Ÿ‚+¤hBJp*ÅpOVLH $’DH¾$hS¾Hód‰y II‚(àXd,ø'’œJ’Q Â%§¤L’øe”Ïåo2JÂ:B«Á ‰¹ZBºíA”ã0çB…æpÿxš–î¹Í°1|z.TœG cŒ±"·¥úds°Dâ„€ßM9K@Dâsœ†õ2ý¥;úaÉKu;C‚¢5V3Œ>•!‡§hIñpÚÕô5¢$Bò¤U« (cH¨r¢]-%ÏUú 4\1Þ~Û<)–ˆ"¸X82 +CœIU3ÂqtBucü ñh¿¼å]‘%ÅŒ ²ùÊèŒy;ßËKdÙEQ¥ã]ƸlÆ‹‡ûò©2!¬íí.?úè“«2¥j]ø¨äæëÆ£¶¾ïÀL ŶÞa´×¥\­EQ¹þîyW£tàúq/d®U( À ¬’m#MWpG%M¸ÂJ•VõÝó;–Æ‘ºø·üì! +†´RˆÐÎyHÇG‚ì%#ã5£dó’Îmêÿ"ß¡QØdΔ+ç«:8‘Ûá©_³-wÐwä,øúým’%%éÃp•Švõ ´›…ª¹‡…X$H5… Jêºö£‡O%h« =/&¨w®Ó`c°!Rbþ/ïßèöpÉQ*âºM]ÝÙÜmpϯDž©ŽŸY‡T[t“^gpºB.s÷Q</RE• 3¥i¬¼Xšøkˆm*WXq6vKªú‰£çË¥¢Û_Û 2Pìý]W‹‘¡ë»fêÇÃ_{螯òÐ=çâk¼O½»=P§¯ê´gXºÆ¬"ó¾–ËÒ+XÎÃW[ñþŽdv«Ï¬úQ/€–é9 +z¶eïPê´ª­Mk ׃–gÚõßSlo1¯{a :žmT¶c¶½í¶nÏ•'¦38ÜÙV¢öRÂò íÛöpoŽZ,Nñßé â› ÷'©¶Zß7›s@Ójšž¯È)Ê©‚‚m¿ò¼>U|íú?ÌÕÌendstream endobj -1234 0 obj << +1252 0 obj << /Type /Page -/Contents 1235 0 R -/Resources 1233 0 R +/Contents 1253 0 R +/Resources 1251 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R +/Parent 1250 0 R >> endobj -1236 0 obj << -/D [1234 0 R /XYZ 85.0394 794.5015 null] +1254 0 obj << +/D [1252 0 R /XYZ 56.6929 794.5015 null] >> endobj -1233 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +1251 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1240 0 obj << -/Length 1162 +1257 0 obj << +/Length 1152 /Filter /FlateDecode >> stream -xÚ½X]sâ6}çWø:#U–mMž²)I³ÓͶ,ûDƱEâÆX¬-ÈÒîþ÷ -l° Ø&Éð€-ù{t¯t%l ýó Å 7lnB†03¼Yºï¦ƒ³oÀö#Püêðóë5µ ¹E,c8-`996†þ¨kA{u¯>ß]ßÞ|\öl³;¼ý|ׄ¡îõíýôéfpùéÓå °Ãp÷ê÷Ë?‡ýAÚeenï~K[xú÷è Ýôï®ú½ñðc§?ÜùRô#ºvä[g4F†¯ÝþØAr‡ÏúAÌ91f“QÈLJ·-açKç¯`¡wcZ©FP‹Thâ‚€‚ÒP6ãТ„nõ€…P× Cù –HV‘zI¤íÿeݾ‹$™Ì\å=N QiûÏ‹ô¼B³CÎ)B߇®÷ô(Cñjˆ‹D€¥ þÌe¬ÊT×-§ñpÉù¥ üsZ¯‡—1´^Ïçõ×"2J_G9PúÌ'ùËøÕ¦n7¬væ}Gþ¶ñ -$r{Y$þÚ -ææd=Júöcƒ‡m)±™†…¶IÍ ê/iW6N¡CcáMÀ– ©MÌJýs‹ƒ<ÏÆÆ:ÿmÆéØ쥱Y>vQ· #œVÇV*j-%¨ MÇ4›³Ii˜š”[•4Ú Rg2Š‚ä G©á—Bg·ÕÑcjÆmH,Dh–2r¤úíÅz×è±NEOƒ©;=Eï#HÝè9Ø 6´&£o¦í+‘Ld<‰dÝÅkg_Ü¢Åì^Ä5ü=ˆ R"^ºái”‘™û¨Ø’©ˆ -fB !ª¡3%ŒÀÏ¥±¨E£„¡¼9ðÂ@DgC猖_øzUñžDsR6÷q,EýáKözðÀ Ó°±«DCúû@$-TËê °MÍ·“6•±.ö³^FèžÅníɦ;Zeíùb…k¸º.Ù„&m¨&mbkg;×¾FMl§Ò~ÅS£Â).‹ rÛ¶ªWÅÑAÑ6®\íd{JÙ¼z« h$kmÃ+r5Ûrå`ƪ4‡\OJK†ØFÖIKlˆM‡¼¸G¾(o“2’*˜®€/Bwµ]ª<ùI¥êÄÉj¥M^àW -ÆÎK›Bjr~ÌϺI“gà[ä7Ç8Ä>FTIÍÕÝ›ÏÚs↉)Ré<¨Y实b;ja!,€?kÁ÷i Bù’à_Ñ¢0ùGÏk¤7ØÜ|ý4Iæ«!—'uyqhyLîßUî9öÓ ÜµŒË¥…r½§sF÷BáFAôжÄ}n¬î…«”<ؘM]O´e %Pº> -¼¤-‚’s©ÃoUïöd|ql>tRäß6…*W­q"±¿­Í2´MËá$Žöî§fž¡GnŸ\}ÚP*lqÚˆ<×{¬i|Î'm«î)ƒë‹ßŠ_´;¬ž}¿œ_¾›z/s²»:&´puLlGÝ5HFjíŸi0ß^DRÿv2°endstream +xÚµXÛrÛ6}×WðÑê P\^&OŽ+»Î4N«ªOªFÆ"r¢4ý÷‚I¤EY$DƒÜƒ³g±‹°…̶<õmËõmÈfV¸!ëÞ¼»áê°ûÔ¿z;ý|M]ˇ¾Ck¶ªayy¶fÑüâê×Ëßg“é†.8ÌAooï~)GüòçêÃÝõíÍ_Ó˱k_Ìn?Ü•ÃÓÉõd:¹»šŒö6ö¤B8ap}ûÛ¤|º™^¾9/fïF“ÙÞ—º¿ÑÜ‘Ï£ùY‘qûÝAê{ÌúbþAû>±Ö#›QÈlJw#ñèÏÑ{ÀÚÛ´M?F=È<â¶h㚀˜è9[.ó¡C -œƒÐE*•.ŸþF •O"]†¿ç¾Z>®º6eÄOÕ+è3†­Ú …KëÅ»x³ÏM¶}hSß1O +©Sû¼áj 2¹Q!ÎS–u¾Î2ˆ"Õ ì»8&§“#Â%#JŠÌÛ6FÃIJOÍm·‹õ½bBdħ;&¸Î$w—gY'%¨ mÏfýCw>D?jõ¿z6Å +ÊÉ€Tʸßòl)Õ2‘ ,ÔªrÓäO•äÉfý‘«vò „H4WAÜe|ZI¶â +h±æè<~BnôKhˆ(îFã D' Wt˜‚0<é “3F~™ª~âÌÃÊÄ#ï>}ƒ¸™\q¹, +4ï9Í^ð¾äsÕb‘ižäÞWô]ÐVR­ƒ£¬— æƒ/|_{ªp'ÛjüP¬p¶ÕtY±Ä0éåéÞvÀÚÚÛ¦Æפ·È;•Êmë ’HíãÊìú·­23è»®Ó^ç‡òZÕÚEku,w2Ü…gc{í°Ú'¨ÚèD!¡®ß¾ÕÅô’µ†ö +²äC‚k•µ…ëYi Á»Èy%ºÄ…ØöÈÉ=ò¤¼}6ÊDj±Ú‚ˆÇÁvWªB™DY ¥öÄ©:¥ãBêû”`ìeiãRHmß?Ïò|Ò2ð’û’¢ý?- ×àI<;Ç$ˆ3 J¤ràß=«ƒ«çØÎØ@ à ñu¥@,ïA&¾ñýÑ?&®‰Ù`æùÓ2KyØA(M{qlÙYî(ÐAOû†+ïš‚þ“g:?½„}ó É}·ÁþJäÚ#f« äCŒÚôG"̆ú e*ÍòkfKuT[š¦)|XæXµ¨ož#c’âðí‹ ”ʸRE»Þ¬B+FŽƒ<öíÓÔk‘%eïãSÞnä%ºÇ~Ô Ÿ*ù(¢VŒN‡7sìÉô@k­òÒ*d Kƒ£&©³…x|eøPÇEÀ¬îî m7•”Áüz±å^íïd^|‹y¸âµMËæydAIhí‚’"zÄww¤rGmö”ùþºó˜úÿ;HÏÌendstream endobj -1239 0 obj << +1256 0 obj << /Type /Page -/Contents 1240 0 R -/Resources 1238 0 R +/Contents 1257 0 R +/Resources 1255 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R +/Parent 1250 0 R >> endobj -1241 0 obj << -/D [1239 0 R /XYZ 56.6929 794.5015 null] +1258 0 obj << +/D [1256 0 R /XYZ 85.0394 794.5015 null] >> endobj -1238 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +1255 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1244 0 obj << -/Length 1750 +1261 0 obj << +/Length 2305 /Filter /FlateDecode >> stream -xÚ­XÝs›F×_¡·Ê3ÞÇÇôÉMíÔÆiuúfÜœ$&(v”6ÿ{wÙƒŒSYi<–»½ýüíÞ">gðÇç¡°™yó òlÁ¸˜Ç»›o`ïÕŒ«c²†\ß/gß^ºÁ<²#ßñçËõ@Vh³0äóeònñòÇó_–7g–#Ø·Ï,á³Å÷W×?ÐJD—o®/¯^ývs~x‹åÕ›kZ¾¹¸¼¸¹¸~yqfñPp8ï O¸¼úù‚¨W7ç¯_Ÿßœ½_þ4»Xö¾ ýåÌEGþš½{Ïæ ¸ýÓŒÙnŠù=¼0›G‘3ßÍ<áÚÂsÝn%›½ýÚ ì¶G§â'ÜСLÐãƒrÚ‘ó@D¶ï:nÁwg–ÏØ¢N7ÖÌÒ$Õ{+͵ªà¶òf·RÑßÑã=:Ú-ÎíHçPüÏÓ|cåE¢ê¯–‚O©›êxQü)Qz_ª“ìÙ¥¹U…™pŦVVúqmíU}[T·yq´ñeUܥɤŒ#´Wê¯FÕúÄÓºRR[qeÉÚªK«Shƒ§ÖÀ­¥Ó݉ÿ!­%ºÚ?KlÇsEŒ¬(‹J•–·ørÄ™@i¦E.3k];K6z{j>eÅ2Þ>'¹cŒÉ<‰ºK;„”RoosÙEçÈä¶V@¥~R]Ý~R·u©âg¤FÇ[k'ËR%8 X©»¦ñà—€3UU d“5Æš?˜`DÓãóÿF ×o®/ú#üm*Ék«IÊë_j/ÀxüÑqÞ ›AÖ2µ‘ˆ«È³=ítv}Œ³&1bÿ6Ò!©YZô~î´›fèFÕ>+6§7Ik¹Ê”%³MQ¥z»3ÉÊ4YÚ³|7rêpÙØþù˜ -$€ªM8µZŒ8S²½¦®Ú#ó.O*˜‘5q–ª\×V©*«ÍÍÉùdInÕŽu -)^”óCíiõQÿSÉ{,ª£-S»Æ™"Üñ¬®DÇã"×2ÖÇçÏ*rU%l:à?H¤u¤ž×i?©ª€¹Ìª iiZ‰bŽ½B,ǵ#œŒG¦AõÁæ·—Ÿ÷ËkT Ó¯ãù¢eÂéœû0ª3V”سjÆßj©ÕàG¯?¨?sòö†£¸¡ˆø­–et¹ƒÑT9í ´ª–[Õ4˜Ÿa|Ž"˜‘§³à±0ׇéÚ†¯纋Zá‰TSÒs“+¬¤Ü‚]àÓ[¬”9P«„¨Õžžø¡c¹Ü¦æØÂ4Ìx+ÊÊèi{=Q±¢Ìfóqf°©º¾¿øP -ÛMSIŠ.îáJ¦À_D‹«5-ê-TŠ¢q¸  ˜¬ÚañÿŽl$ #ûdG²Lºú ¢ÂUVĈ¼OqbB`¥5â%RCÛx\Hum@Ë|;Q8®„D­e“ÐݧYFT›.ÑNþ‰ýè‘ÙLÀ·+"ðœpúƒØ0YC®ö{n¶îc³çjJ+ëúïfp¿¬ºçšÐ=Ìw™¾?VŽuc¹ŽXÜÕ¸ÝèLj‘-”/вvµXÓSwgL—†nüÜŸç†5‡éD®ê"k´áÅ»&Ùñ¥CYq -‹„S“Q±cþì”C×£’s=(AùAå´$kz’/ȽS´Òºeȶ -‘zp=朷^EÜÄ9:ø "@ig)lÁÝGÄ®¨5Q݆ÌE£ËƬ“Su÷"˜²76•Îèãÿ ‹cð»jò‰*ƒ¦D¡kªŒî[ÒÒ6˜ s©I'ÝÐi»2È)¾‘°¼ÐDàÜ’¢7*zvBFÙÄ­M“²` -2г¦…¶sïŸp}׆û¨k"öTÚA×ç¿yAˆñàærñ#Èâ<~h–ë9‹u»Rìˆá~›¶MHsÈ$ö `ÛZ¥±uX"\&ðaÈŒ¼mÑd m®Ì¹¶+Â^_@£–ÓÓ­Šq›‡¾øV5àúB«ê¸Pëµ·žnWdÁaÞ—Õ÷\úGíJ@»b<ðû¶-n|0t¼I-‹E‹d’Æ´Ù”‰lÐm׆ZÅM¿qšÃêÔ(½œ=J,Ý®EÓ³–Í*ëôá´Bc˜¢ð WUzGæ8†ˆ‡6à„0€•á\MŽ…åzÑ"]_ز6&áÄ€¬zÛbÆéÌœó |øD¯ó‚î>ˆ8&8‚2Þž»¦ÖãûTvÃ\àÛ4t Ü\aão§Èaý ùÕ?Ñ>ü~í¶†Î4]œ!œ(èŒB¯=qhyÿ[îcÓÿÖ½ endstream +xÚ¥]sÛ¸ñÝ¿Bo¥gB„?1yòåœÔמÓ:¾éC’I)’8¡H…ã(½ûïÝÅ‚)ÓŽâØ\.»‹ýÅüóE±H +¹ˆeÀB‡‹l{æ-Ö°öúŒ[·'rÇT¿Üž=åÇ Éd$¢ÅíjÄ+a^’ðÅmþΉ˜`çÀÁs^¾¹~uõú›‹ó8pn¯Þ\Ÿ»"ôœWWÿ¼$èõÍÅï¿_Üœ»< ¹óòïÿº½¼¡¥ÈòøåêúWÂHz<ÀôæòÕåÍåõËËó·¿]ÞgŸ—{>äóÙ»Þ"‡cÿvæ1_&áâ^<Æ¥‹íYú, |¿Ç”goÏþ=0­š­³öã~$f ð‘E°ŠCÉ"_øÆ€ïÎÝÈóœmQ¹ÒÍÞÕÅV®ê¶KÕü‚ðÀ ÕåœÉ0éןe±«MP±ûˆ/ó{øxOšç….ê*-ÝUSoÝ´ÓZÙ«öcÝ|¬ê“åóÊÒl£žÊ¬I«xäêK‘Y&»To>VioN‡F5Z¸mñÍnCèc»SÙ¸Fgw›îv*wáj[Õìÿ4j¥š˜¬ËÎjóÞ =‚.èñ§}ƒ¿ âúÍõå°…Ÿpv•W­Ûå»ÑÑ)žN Æ'nmêZƒ×JµN1ܺ*÷´Òëõ5+»Ü²ýŸåN-‹ÖFï_½”SÝü¹S;¬×Oµ¼hÓe©Ü´\×M¡7[ë\À´¨&š$/&‡:F[Ýÿ:%k(@U…*üÀ ø “¬TiUTk·¨´j¾¤åüžþ|Âde¡*ݺ;Õ¸Æ7§–³ûÉûTNGÇjÁ«\¼ªHçCîiõUÿÙ¤w˜T'óSÛÞ»-X¸W⇪mÏêJ§™>mÿŒøou¥Ú›ÙÀ?p$ÌF¾Zºv¤œï;­Ò-AÝŽžë²^bú#|8¼èŸ³TvC«r‚–{zâǼÝvÛ‘Àmj‰±)¦•cJ=A™"Ç„!ª-¦ŽÁšêG‘“â#v жë®Iɺ¸†˜RQ(«!õŽ'Ž¢¨¢!&f %,‘’ß²1€^rlÙgÀ[†àe’5.Ë:ûDà]R(ˆUÂ-ÁàZFÃ#¢Ð­Y/bI(å4ŸrµJ»ÒÝ]Q–wÁÝÅîÍ͜ŜG Ÿ,Jbÿ9—ˆÜ1•s'fëgðÊ(U4*Ó5”ß#É2fQ$Kî‰f$ýÀ=±â‰©hÌסsW7Ÿ µÑ (dâê'wP/ƒ­WôÔý[¢áöWˆú‹Ê’V0š¤Ë¶.;miqºÄ’‡.Åè˜×ý($E©õ'‡\÷¢i¨“ý€Î ÓOª"TÚÒ“ÎRß/=QM+Ú$ B‡ãq9çæH’[!E9È´W– ë°­[M1 Ï.ÔÞuv‰Õö/¡§ØšQâLnDG—³¦«fr îapñ6Ǩ٠+p‹)/qN„fÏé'ÂÔ$Hçè&̪Z€CK§Q9d³H<ò&. Ñ4Ë  mcìÙÂÔM ýïŒ!üȇ»¡×q6g&ã8²{F@Ûòã(œ† E\ÀÕòᬠ¦ÞÁݦ0%@»Iô!Oë`‹Z£±p¸aö3#€Mfùmê®Ìiqi÷™škCÍ4tL§ •ðC†Þw +Õ˜êáB5P¡ÔOjï>X¬8YKï‰f¤OŠ•°úSñÿÙ˜Ôæp׃yFM*Xžtò=¤G‘Ñb·ËSSv65 Z•uCoã4‚µÏ¨‘s¹wÏa€ºµD`3îºeÙËÃI…ÎC%GžjŠ/¤Žh@E@$‡ €…¥¥\Õ]…iåÒ)VD—º¬¬J8- ©Þ˜ˆ½zÀa§4£òž*{ º/Ü—ã¸åPª$4ã‰tšó|?9Œ.¾¯‡öQZÍÕ5)™ˆe` Û•¦Tx€M—ˆ2ýžô‘×B˜VOã°ÕÞ"Ÿ¨ïÊSZ=;J‹ dâ0#OMz¤· u—E\ðiÛQ}]7éÛL W&H’áãfâHì%Ç©Ó¼·j—6©žBü€…2”–t¤I1Í ž•R¹Ê_  +ÂÌ’»êªŒ>½z?ÞùÚ4N¢´ÕÙ‡P8½Ï§¹CÇdP¥„™'£ä;)1¢z$%z*Ó±˜¯Û6ÝnÖÀ©+]À•æ8=B0± ÂÇõ¨f™”õH@G† +9ÑÄT.=*ÒÆÂø–Q ê38ºˆš3‚ú°Ÿš³mME¿º"—ÌÔaÄÀÙ[‚HÈçNµÐÁÉiº0LøS§™ë·%VÀž×oߺ·o¯^Ú”®³ºÄÛ”ÎËC .íf{…ä?T³¤2^·´Òc¤+]…¹5\û’%}@4Ý:Éc“Í|O(ìõÇ<è,Gj`}nŠ*+vær Ö̸BR9˜‘ÙPå³Ï]Ñ·J¤ÒâÛ­÷Oî`í ¿¥ÓIÝñ½TøM©,÷Èä£çJgÏ?5Ë'.ç +*\˜ £¤‰Ø¹î%¸~õ—€F¶À×mf +Cˆu3 qþßê½Õ3™|…HX¾›Wíó™Óô_YìMÙX™Ù¤÷OÇ,ö’¾£`sšÄ¹=—©I3hÓ~²ØŽ®O} ?›)®A¢0îk«©êá7¢?ÞaH˶žp_gý.£þ˜4S`¼á ÓOÿfuøA›G’ˆùJ%bðXL¬Rx® º_¤í[÷Uÿ?ž> endobj -1245 0 obj << -/D [1243 0 R /XYZ 85.0394 794.5015 null] +1262 0 obj << +/D [1260 0 R /XYZ 56.6929 794.5015 null] >> endobj -346 0 obj << -/D [1243 0 R /XYZ 85.0394 285.8176 null] +350 0 obj << +/D [1260 0 R /XYZ 56.6929 418.3076 null] >> endobj -1246 0 obj << -/D [1243 0 R /XYZ 85.0394 252.9894 null] +1263 0 obj << +/D [1260 0 R /XYZ 56.6929 386.0953 null] >> endobj -1242 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> +1259 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1249 0 obj << -/Length 3961 -/Filter /FlateDecode ->> -stream -xÚ½[_“Û8ŽïOÑo箋٤(ŠdíÓlÒ“ÍþÉÌ%ÞººÚÝÙVw«bKŽ%%éûô$Mɲ{î¦ê*•˜¢ ’·þˆ[U°ÂföVÛœ).ÔífÃoŸàÝûái–h™Rýqusÿ³Ô·–Ù"+nWÉX†qcÄíjûEÁ2v#ðÅÛ_>þüáýß?ýt§óÅêÃ/⋟?üõZï?ýô·¿ýôén)Œ‹·úé×ÕÃ'zUø1þøáã;ê±ôsaÐO??|zøøöáî_«?ß<¬â\Òù -.q"_oþñ/~»…iÿù†3iºýœ k³ÛýM®$S¹”¡gwóùæ?â€É[÷éœþre˜Êòâv)sf€ÿ¼–ÓB‘V–2“QË™˜Ór B-7å¾Ú.u]y¨—›#̺éërwæ -Tlsu]ŽH5#Hº¢È˜ÔÊŒ%Y¡5 -‹êØ G§a|Ú¸5Š‚¹¾ïuÿì[ÏõÆ7ûÓ÷NÔ~n‡Ý–Úå$0ÊÍÈõÀÜ;j“¯CÕõàKnÑ gZ2,áô×]Xb–Á7ï?^®>xOÝÞ úvÓîÀ´3ko‡# Þô;ÿqÛPË,þR×}ÓÑ;E?‰¬)¸ö$å·²Þ•ë— l¶#™ìTe8>¶=2[P üäv*¼8ëfSPáHàÕŒoˆ ô5cç¦lü€›¯CM쉪¦q‡§é÷Ûê±Èi`^@ñ{z«Bÿä<ÛUoè¡iûrŠsN§†=™Ü}Õoî¿׊ÁH}¹žTÅŠ\@…•*2½ø8,¥*@N‡ÌÐJt¡»} „ˆ›J-á{êúg–å^N“Ú½1,×¹ôl·Mw?3›L2+x´Ì¶í¾p?Ÿ‰ÖLsл٘ÅêÎf‹–$ƒA6-bZbˆM:Øð›pÍ +”ØêÐâ¢,gÏÂôöCç·Üu-µÖñú‹Pƒ1£§®B]Juê"ÕŒð#|qðüæ‘j†ûß„eÚ¨ ûÙ‰Yx\»<î`ÃÖEp僯 -±C„‰Žšdqô¹£Žî¹ô®NÏ„gØzªš -Ãå–¾p€y¾¸2 ¶¼ð+¶úËÃÍ,k¦™ÈÌÉWpüÿtò3–…†¨Æž¸ÙÕ€Aˆ°EŠ°s}9‘H –+n_È2® 퉪›ç²yr8ÁÁ==¿}ùBöHìbGÓz’˜ ák> -À¥®ŽZuô.P#Í#Uœˆ«„ öbñᑺ)TÌþ éGpÉ­ž(ȃaà-\dü¯ÒEÆg‚Gh|¯wžqyw`Eþa]Í€ŠÐS… «¦àÜk¡ÆáñÒ¬~Fç¬Àš€ÿ>ðÍØ߆BJ&è+¹]ü>~¯»Ê+Lêœi›ec¨ò)kP&¯Î+dqz5ò - p -ä0lÍëðKò,xÃk»'¥ ßÝA£ÈŽ¯ë.¡º¢»@å`|Ø.¨NpÁ”È_a©f¸•W°w´FìW!JwöŠóTÉKè’‰RÈ°!¬ip*Ýä»m uuÙù'Ú0„üŠŠhÕM×ïÌbØP ’m[Ï"|4_š@*ËŒ-&y˱Ùn¼g‚TÛõ|ö’©"K’Ë$>F£pI¯ÄíÔgGûu7—("¬«Ó Çé*CJ ôBÜæÒ2H¼íïN?âˆËtHg#餀arkOœƒA²Y…å‚™\Š¨°K®ì…Î_ÙL©®¸J rûÕ¾ëËr¿zÓ]òˆÈâ«RDª1F>S–ÞŽäð!‹'>ƒO®3Á> >“tŠ$ÌA9Ö½ /ІÉaäpí¡+Ÿüw§ ûqZϬ¡_H…{0ÝœSI‰]hº.¨a(U6vŒßgÏ\‚¯ÙÔœ™_•¹RÇ@šd»`0²(pGà•¸”R]6˜Håvíëí31–ÿÈë¬Ñ ëQïΠŠ1ëÕü‰ áª>¨œp59e9ªŽ6âmzŽãw7Uç;>¼ Ç:Xê̾p8æÆ­»,ø‰]\wÊt¾îhþÒØàú÷d_y†–œV@}pš{gô/ƒ…˜«„¥†‚&OËûB{ï‚*6Y=÷ì¢;üúÜZ.w.lz:ãiú粧Ö÷²ñ-ç:–¢ÿ¾«Ÿšr×%¯5?eÈQ¼QNè‚UÓ¸¬Bj¶t6:œYÚ,>Ó®’ÎdÌJ2X…xÀ”LÖ Û6³7|$òXÖæÅ}Bë ‚ ÄYt”ôø«³hœeXêÀÒ÷$bøh­Ã •OÃÒr´èh¥}媜̧ޮñB»]®`÷5TME ¿/e}š¿”DïÛoX>BøR‹mïß¹59fT9˵ (sAq™Jwœ)Y§üä’ydí|ƒg>üŸ(H'~— pŽ¤Ã×ê|»Ž¦òئõuHPcvQ5›]Köœ”Ûvˆö×Ð]ÄÎÌ&5ϯcgJu;#•³s<[úñR šqà~U‚H5#ÂxÓ”g´Ë@P TháÉZ…±¸#NíJ…€¦’ƒ'’ÓÑû¯C#ë*¾p¨­dWD-6“ƒ9èòÅiˆº\NK¸Èiÿn„“D×Þ6,·O5ýï…DWp(Ÿó"8ÿ)ÃK5¿?¨ôhõÿ%Ée×d‚¸ZÒ¼–àýËÅ+%WJuÅ´•K^M"qG}]„H5#Ãx·È@½ÅÅXJxž&ðä ›{ÅŽˆÆÐŽ1AÊòp€€ÖùIºè¾hé×\@>-¸¢­ÿuW~Ûhn«œ:Ÿá=Ê‚„˜Kóœ)³G ’Š²Vüˆüzœ¨8à¯èÕ)Q)ä[Ì ñ8C½$OIÖ!p¸ƒ¶"(L6Zð]‚^¢¹mœÖ*Þè( >H;Ö—Þ§ÚljǠì0¶U·9Öë$PLL6Ë$(ÂP†Hj¹+hèåñé–ŸãôËôƒsã=åÿ\mümw—,gPˆžIdÔײItæD‘ê59ÎF»Š -H - -u;RªËØ©\žÖÒ¡WÊTÆâÕ¥«LÑ Ó6r–[ÀëSfñ÷w¿Þ¯ÞþJNhA’?ìסˆà&ÁƒaG¤nk »¼ÝVõ7Je¹¿BŸ6ÛØûîãgú4½²ây˸_¼Á|ÍäÑðøa1) ’X¢ã *ȃ±òÈâ>žŽ·ÞN÷¦ô;v/ñâ”?Ç7~·/Ù9ÇSqÚùûÝ +Ï âQ‡oIŸøÎ9Q'¤Ms|?†`ܧ°i0 ;¶§C’è7í~?4þZQŒôcïÚµëÒ ª¿láÂê•› ÑûöD§£Ìå¶úVoÎÃb–3]hq•w$:g>Nø,Ó`/#]íàŒmãŸÛGúÜ%#<ø;_¨Yü]{Bª ]ÏËüe/*Ï2èx˜Vû+^‡c½/õÎwÓ?jûs}·4ŸÞú|Ï@^f&ßðÄÌØ» -(¼%9FG¿î”ĵÀ‘š®t˜ÚÑ)¨÷E@~<ÀC |[g;ئL»"¶òÄÿ ÅO‡Ž¨l¸DŠ”?° ‡ø˹«^.æ"•AP`Èu–m,wð!BZ=‚žãqŠ{ò·Àð#—\@á ÙàSº>j*¿…Eìk/Hø-ƒþ¢—”> +stream +xÚµZÝsÛ¸÷_á·ÊÓˆ!‚Ó'_ìä|½8i¬›¶sw”HYœH¤"RvÜ¿¾»ØR”|Ó›&“\,±Àb?~ H\†ðW\¦:U]&YèPèËÅæ"¼|„¾‚y¦–iêsý0»xû^%—YÅ2¾œ-½±Ò LSq9+~¼ûñúóìöËÕTêpWS‡“îîoˆ’Ñãݧû÷w~ùr}•D“Ùݧ{"¹}ûåöþÝíÕT¤ZÀ÷’G8ñÁû»Ÿo©õáËõÇ×_®~Ÿýtq;skñ×+B… ùvñëïáeËþé" T–êËgx ‘eòrsièH)KY_<\üà èõšOÇôé4Ð2Š/§* +ÒÆÕr„´6MtÄJ*§e)Æ´l¹PËÝ×òeZ4›¼ª‡+‘ +„—þ¨G²-ÓˆlåÉQ%Âg«òjªt:á ˜v¾Ý^‰IYeA„®á§å®óMÙR³Yâ3™äë5ÚU¾»éÄ~ ËcÖDz.wyGÉä¹êV¸â’””°a «33üûí¿™Ë_ŽL!“Œ™ðÏUi—€ŸÀž¥I„QZA¦µ4Ü‹uUÖØeOhªßöeÛµHÑôé`N‰"¦¯L) Â$¶Lå÷Å*¯Ë7`Óa<©XÞ&¡F³#qŽP7ÌÒnËEµ|¡n£r¤e[9½~ØâYÒXñt~%„@½ÈLLî–DÞÒ-¬þ )H„!˜w÷Dûœ%,[f›áéºzÛœ™m¦ŽçÊX´æ%i)òU)bˆ(¬&»qòÂ+_·ù®Q³=G©Nx€¿ŽÈ€V¦,ÃÀ¿£Ál­¢ƒ%«>Á*wÏU[²–T"ÎŒ„§%ewB)Ö’Š]=-i :XKÐ:¡%J뻼†ZVåwjÕcF;¢¡0‚v¦Ïj\#ûß4¤ãlrWÓä7MÛÑÊy[¶oȳqùÇN4 "CõŒŽ—A¬…]I»jökФL3T<9&!¡-wO%8$•¿´D²A ùPúb–×CR^[c·›^릞–ß«¶3†‰Œí~~*›¬«¯%†^oA¿IEr¡ÁÏÀpâ, RG${É KÓt*ò.Ÿç­ý¬a8EÈZUÝv»«t²_P¡á1ülu¢™BK³xSvu±`·„Yóq°"u,½šÄK„Î Ê5Ñ°:lQ.óýºsf7‚ 1¦ˆÌb[Tn1Ü`¥RÀŽ€éu %ŸÉŸÆnÄ©?¤1‡ÞìT$‰šslÖƒQ…{)ávÊKT@ÙðJŒñ¹Îx‰åB‰›rÓvyP¯Z´§Ü%Ž ŠgÙùY8®‘iô&†â;²?ÎW¡ç0ø†ƒÏÎv[‡ñˆÂËq>vUgr ´aq˜6L{ßæüÝaÁ¥Õ¶Š8Az@¢ƒ„’QÀƒtÂgÈ€k$}D¥õÑÉ-eÙøõ´…¨d”õbÝP=è•E³wõ·=( =B GI¿B=®3!ÔrU.ö;¬OÒHcâó3p\#SèÅ `G ¦@éVk?Ýj¶jxvWbb9œÍjëZ2.´¢öú¿íñø|W•®#ï¨å‚è è^ënýB$®÷HAD2È–b#B¦}{ ]“}»ÙŒ7ùyíŠ +è(¶)øsÝFŸ êÄ?ü¿!Ý´ ÎÍ)d»Sß“†­b¸¬™=a“qˆÆ7È’ 69;S³¸Ú!„òDQ¶‹]5÷òÃÀ\¥†áC‘AI…Ž N¥ÎÝã%5¾x–ëø§þǦ{<.ÎÿV\5µ½hŽ(CªZØ? EoFGä¸^™Çñh烤8K_©@}®3aÃrxÖÐW/T`M¤Óø¼TÇ5"V NQS%VO.G‹tòËÍç·³wŸéÅÌZ€ñ÷›9[C@ã%RÄ‚-±šc1$±í–Õ“I^H2ˆ>­ G½¹ O_wÍ¢Y³¬]îN‹ˆÔ+Zãà‹ñÀò½<’°u§­0#)éÎð’I³µ–N, ¯5(ñb‘Óñ}7öðIŸwnŽ—ßtê÷7x‹…Áow©‘Ø^Ò'ö™+&"¨í<ͺÂ~Ücðê'R{^{¸±I~Ñl6ûºZÐa´Íòýð¸næ9 ª?iäRÇ`)â•Ôès6rÇu¸½œåSµ8NŒ°[B¨ø¼xÇ5"¿÷Ò Ì¢¬?Ý‹#Ú“[ð{³¤'D`2Åí P¿øœ3#Õ††b9ܘ~y&p;¬jé¹ÝU›|W­™\—eaGå+|³A·ïð¥€ÌÒÁ­s³Å[0fsÙ*ä¤Ý/Vè<`-=ÍM‰i;Õmn‚kKwŸì‘ðn/6ðe¿-Œa›±%3ÿŠŸÝQgìT†sË+{y?í´t7&X›&_c °A‡&ˆ O€"èÝ]©˜·çUe $Š:xmƒoþFrþÔ|’Eâ+žˆ}æv +(5ªBOžˆoûjG!l gdÉìÃPý/óŠ[™dbï–¼Sl¯p÷°wŽÅƒe-¿¯ò}Û™ªU%|$—ØÐaìÄ–!À{ˆ Þ¦®÷,iê¨( "<æãØŸ·ü«ƒ¨“Qd‘ïY¬ÐAE$‡ªù 3ÚWeVQÖÿQŠ¡PeTs›–»¢G=„™Í Ã’]b®üj‹;ƒe$a µ-b\†i]þÕÔnÐ,M:Z@¡÷bOF`Ø*Ëð,+Ž‡µYÕU6ð.šwéqO–ED¾nÄÈÞõ/âL»ËwÝ~ËѼ²y¤ÌŸ6‡»[ÍG¹8À~ÞâO›jœ˜Pè麞cîpÏ&Ÿëtp\éìÊe¹Û•Åô-ñ( „ˆ Óóò×ÈúY@)Dÿþ è8[]&s—½j²Æ_}ðo÷²å+`´ðkb ŸŽÈÉ5üacª=ͲWËjRnðܪ°Dï´a0]ä•@¤—ÈÃ\ò¢àx +a7ÈÔðh ÍÈZWëh[äö §4×ÎÚ-D¶’‹öÙ©Š¼@,Þ`g]Z¥“8d m™zC‡÷ŸîoQ=§ÍLšK“WNè}®3ff¹ŒÏ7M¿.ŸMÍõìÐØ(›“$=? Ç52ž±¥ +ÂH&úó˜]!jØaÈ—+*…p±½fcX”*ü€nrnŠ›ÐŸ¸!V<Èìç›–ØQÅ]³%òº|*×ü¹ù©NËÙ3åX_P²²÷8 ?B ìÉäø!ˆÌ­Mm}s+¿/Öû‚÷}&°IPÂÖ…‚øñ@å?`Uò‚;×ò;¸âѱÁœ{7yQö{¼XÝ<—‡ØaÏ Ÿ=8Mò9©ZË$jòÀØé0É‘dNReß}p9RxË‘ˆ¶‹ÐŠ°·¥Žœ^Am%gÃÞùxÓeè_Çèâ0Oªà£iR ä'œïÕÅý¿n>}¼¾»?­ïáÍSUØtÂqäÝýõÇÛᡨÚEóTö²Mi®ñÑøOJl¬ƒhü'ð÷åOÿöûðÃx>*Må‰s‚Ê™%vR¨Â(Î\+©LF¦þ_˜ Ìuendstream endobj -1248 0 obj << +1265 0 obj << /Type /Page -/Contents 1249 0 R -/Resources 1247 0 R +/Contents 1266 0 R +/Resources 1264 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R -/Annots [ 1251 0 R ] +/Parent 1250 0 R +/Annots [ 1268 0 R ] >> endobj -1251 0 obj << +1268 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.5592 220.8351 286.2499 230.2447] +/Rect [250.9056 343.4991 314.5963 352.9087] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1250 0 obj << -/D [1248 0 R /XYZ 56.6929 794.5015 null] +1267 0 obj << +/D [1265 0 R /XYZ 85.0394 794.5015 null] >> endobj -1247 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F39 885 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R >> +1264 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1255 0 obj << -/Length 3390 -/Filter /FlateDecode ->> -stream -xÚ¥]s£Fòݿ•—ÈU a`€¡ò䬽9'YûÎÖ^.•äK#‹ZŠ@v|W÷߯¿„äMÝn•fšéžþî©óþ«sûA”éó4Ó~¨ø|¶: Ο`íû3%0žòúPßMϾù¥ç™Ÿ%ar>]ôö2~`Œ:ŸÎ¼ÿÛåߧ×÷^“Ä¿ðâ$˜|ws{Å3?ÞßÝ~¸ùþÓýåEª'Ó›»[ž¾¿þp}}ûþúÂS&Vð}(;ùàÃÍO×<úþþòãÇËû‹ß§?œ]O»³ôÏ«‚òÇÙ¯¿çs8öge&>—ÀWYž¯Îtù±Ž"7Sž=œý£Û°·JŸŽñOÇÆCœ{‘öM{Œr9ðƒ¸æ¥qæ'Qu\Õ—ry½± »Ùع÷Tníþ¡UøY ÌyçüÔQǾ1‘Rp³¾›pÒ¬í¬ø-B;3™š´K‹KѤ,šÖά}][ýÄÁ%Ôžº„0­xö¥(Kž”ìªh»í¾Sf"‹5à“}ˆ4YT‚ÖÑ’Ïç…‡|BéøY”"”ŸÅqHÇi‹ºÊKV¥ÆÎð•_ê?s~ü±µ›W2ͺ® Z©`2%t°6·‹|[¶üR4ü¬j™hk~®y‹Ñ8*ÙZ¸#äÖíÝí5²Ç?PnÑ T%¾6ÙZ¶:¡d„,ÙÔuëÍmiŸrd‡WWå릥 éijN’ÐÒ0Ð3–gj@Äô" &Û #2 z*½šT¢3»²UËó(,„Û§š& ÙdúÓUÃàÈܶ^ótiŸm)Ÿ×«¼¨VIœÈ«9A/¬Iiä'*ÚÓ¤ו¿íÒIV´iÝW4ûç¬ÜÎEÒh-$a`š§2?ŒBfÁmÝ -HS¯dÄg ;[èkØŽ‚—¸àÊúO¢°¿…¡¾ºÆ¿ïd†?]dáäŸ{“Ÿð¯;Í|·ðñÓÃõ§8êtô›º¯\pžHùÊ:³¨O‚`ò:°N}é£êGulãèñÕÜ~õ­ Ëçn¸mºájÛØíʽþ÷[qc¨yqÌÒb“ ‹N›Z긭uPˆr^4ùci½¼|ª7 6«æÐÔߥ'Ip@#$ L-ý|ú†+¦D›hñœIÔwð¼ruûðpýž{äÒZÞÊ“4mY¿¼µc•¯ÈƒBÄÿ^Ó9ê⎺²Y—–UlÀSðJgȆãÌÜã1~ ø“¦Í[r$cf•—p;›¹ël©uî~U7bxÝÙfΔbìn³õº,p³c*¦#?Sɶ:¡`D,©k^Yן󦘦 I['ÑIôÐ!þv%Fi2 àç¥E_”¯í»jpúqÔ‰p„Þ}~‚Yg ¹æg€mè›™<çe1Ï[Ê6àU¼2Œr¡(/[»©rr³I6YÙvYÏe“ºÛC´SôÍÆ©%§½ˆ>‚íãÇë_pœHŽ0ãH5oŸD (8Å/„à†P: ˆÙ×[ëc)ö6Æ“â¼_ï+Žl< ;=C{D%×Îlu1Å®mÓŽˆ.Iü@œ¿Xt*ÉäŒ2:ŸÑÇXÕ›ÅJ˜ä]y,åèp˼á…Ò.Zž’=ô䳕sl«vsa&[ÌI#±Lµöƒ²ùaN(ð^^Í–ÌÓT š¹+¬]¯-å$ÉhF3èãÞç rÅñ–ç† -s %òÖÊêvÝG€y P!ÊTˆVÌ@ÝrfÍfÚ•RÒ?Eé>Nw:ûÕI·osDmSJEšbU”ù†r4ܾÞ3—\VÜ÷Çù4¯-çl#ÚܹjG•›÷à‹†9:(ùÊ·iºóÜ;ý9ê¼uN0Ž“Þ»uÜ}wP=£Z¡:>ZÆÛÍ¡‡hžé0=MF5BÇÀg°îÑñ€Nc&¦“ea7(g0lxòeYÌ–ŠÕ|ŽÊb²ç9Ù>qÄ9*ŽòÙÌ®[WÍ‹Ý4ü‚V‰O؉@“]ªÓ»ãû\M’ÆX…²ª#^pŒxq¬8vŽÇ=ÇJü AtDCÁ Úu¦97*ª'|‹& r“0 åSO踀pdç0ùè‰]”b¥ZqpƒT»cV/sÛl«¹ò‘8µï6d̺ºCÆØúêXçÉ:•o’Xÿ¥”%ÒX>óè熳¶x¶þ*Èì¤ì¬6J}¤, -laî â  ªù®®KëjÍ;)´Ž¸ªHC© Þ¨dz@Ç•"ÝضK¯úSÄtЗÒ~šÀùOá»R™Ÿj¨)ûØGà¢ø¯™z*±–(0.MØÏW! Ô©K?//Çö5~œ(òèq—®•ÝdL‘Õ’ÝþëêîãåÍm?Üq¯©í³K ]¤—¨‰)öæÙn:l’ã(?LM:´eö¿&CÕÛ‚-¿ÊˆK§ I%©¤Cú[°¾ëo#ö¸®À§&N¾ÜK}ë¸M±¸gÎÙ2¯ž,£\p¶¿âi/ÃÈ¡‰t'³Ék½•=v-à b89,ÜèÛyÌŸ ôN{Ñ£.ç]Þàš0‹öE¶“þcÁ:0—Ê°²ûIÄ.ÓØ5G¸† wÓU¥§ÔÕÌÑ\òY?UúJ²uÜÄ;(rtþ b¯WWžý³h«I(ÝÃ8;MC5BÄð¼ÔÔ‡TL—.g㎒ÔÛT -Ä -dì$PÈÒîÂ0jwÍC[IçVgK;ûÌ -oÑH¶vUsëWA‘vÈ+×Ë+Zj(FÄ ¾ƒÁ?ôúÀÈ4M‡üŒ—Bà­Ŭ°=,”jG½;±sÆL1Hþ9 ÛS°øø:âþÃÀø)yàÉv# PigºÔ-dB\jA¡:uDíœ,&TcNÖ‹¢ÈÃ0jظ³Õ¾Ö±Ë·UiQ ¯½UÿFÃU_+£![zš¿Ó¿zµêôµ,*;´?W dÞØ¡7=„Â{ø‚÷QíWYæëмQ™õ¡ŽkÅÍƼ„|_íÝ™Ÿuo5‚x(3P61«lpôåñc˜ -ºâ yA—EÐ$ëFNýÑ€Z¢¼à®;p®á)LGðÝ•8ýèàí -9W÷±Àn >XH•„ÙøÆmÍÓÈkŒ9sKŠF>6JüX§{ Bñ¢8FMüŒ)“ -â,vCh@µCœLãöiÙò‚ûaø"Ý]üR¤§¢³§ú`vy }A! -GÂJpS`ä ‰^¸DÍ+Ül^ÐöxˆÌªÚ±n˜ -"RT9‰½20EÅ<™»4C÷‰NÍ'篫àØH‡FIÛmø&ñ-ÄF剦v°Ôk„Q!OR,©&{R©Øò±žL)&™8A4¨>ßñkMqd]‚vPz; ;³_Ú|Ó>‚zzn§1çù&ÖÎ6ÄS…“e½¶‹-§¾ð:ßn$ø»ëc"H38'…yÈ1…vÀ¥ˆ1øÒl×r« Š˼3™wºw‘±»ÌsWÌ#íúž0¡ä²' îGõò­è‘&Bùx+ûf‚®ú¾"4^EtíÙ»¥œŽI‘àUn°ç*÷ðD¡ot抴.ÿÉŒdÔèJb1LQ± Ͻ8m8Ј!%6P7w•àsa_F( c_&îéÈè¡LÔåè$ ‘ ‘O‚ôàzéËÉÑê‚"/AÒò³~f_ 7!„)àïrúa#7}z*ëÇÎú¤C&­S~<¢Ä å!ÒWÊ* -‡Ò§ö°‘„ -âC`D~ÎÄÔÀ…Ç*oZ*Mø¡Uæªíþ]k\‹gù.>WÝv¾½›Þ|ø…Çl‚lm#0äÖí³CSæÏb©{þ [bFÜcôtž;CÿµÅò0JЋ§'¢69à@¸P,-Фq\mW”rvÞŽ|eÿk¢Œ‡HÊ=}ÂÙA‚×_:z -f‹ü¼Æ]fvåM§2‚¬_²÷¹Õ«³ÜÎ꺒©—VUÿ×3.yt­¡êjbçYäM¿@Þ€½,Ò |¥ÒoA8Ǭ†Í5 ³˜º,];šÚ«LùQÚ¥UÝ"F¬$ðU’¼é+¢8uU:1ïè~ *ÖÇ3Y×n‹}üýÙH>t•ÿûgn»ßêÔŒ ÇÓ(H „ÏRG®Ó}ÊãÈø± ÓÒÿ‚+Iendstream +1272 0 obj << +/Length 3458 +/Filter /FlateDecode +>> +stream +xÚ¥]sÛ6òÝ¿Âs/•g" Aœ>¹±“K¯qîlçz¶´YœP¤*Rv|7÷ßo»€@‰R’¹ñŒ ,‹Åb±_<ð'ÏÓ,ÊŠ¸8Ï ¥B¦ç³Õ™8„±·g’q¦ibýxöý›$?/¢"‹³óûE@KGBky~?ÿm’EqtÄäõ‡›7ïÞ~¼½¼ÈÕäþ݇›‹iœŠÉ›w?_Sëííåû÷—·S©S9yý×Ë¿ß_ßÒPÆ4~|wsE‚>GˆÞ^¿¹¾½¾y}}ñÇýOg×÷~/á~¥Hp#žýö‡8ŸÃ¶:QRèôü:"’EŸ¯ÎTšD©J©ÏîÎþá £vê¨ü¤ˆâ$‹G'µŒÒ¢HÏ󴈲†P€ïÓ¶^âGNæ¦6e_µ Û¦~¡Ö¿ÛÆP«3›'³!ü²îÚÚÄÄd¶¬ê9áífW=;iZ”õsùÂÖm×U5Oé[Ç\o6« +(ØaïS)£"Mc»‘ç¥é—ÈVœ[⬘”M÷ì@³v…ì!x±¹zÒ®hfQ#Ü;¢ÑÞq„¸·°M8 ¼G‡!§ÅäîÃ% ßÜ1C #]ÝÜýíú×± X¦Ì¬µß9²šd“’ ØÉ'åÚ|&0³°ñYv5œAýUÙŸÍ#õhJ·n›Ž ÷˲§±YÛôeÕtn%_ÇJð®î¨_¹y„]öf>Ü)]ÚÑÒ„˜‚vp&)ñ,\h:á&ñäööîÝ[‚r…“½Ì°c[æs‰ºÃôz†v†«,ÍË®zôs,‚r9r¢¬ô‚Ô&‘•6¡´žÜ£!¨ÜöËvSõ/„Ù™ß>èØ;‚8t˲ÛÂûÖMbb¸ Ø›@̇tÌS57ÍÌ8$u¼Ó2uøíú 9©ìÜ”lTêL]UW8øB°vAß¼!’5MÖÂâX»fìxJÇ _o»6 ß:6ÚóÈSÒ‘”‚DrW­ªºÜXó¯”c›À±e–¸AȬl¨Qn*‡œôÌjm5\%p2s7ïw‘Š¦¥öÁU¶ôzú’žáäre`–$pÕ †UhÂG„ÃVs +HÛ"“?·fÃxýËzOxV¯°qyóë…”r²'s -“‰Ycuuÿ_ñ04¾(âÉ?=P[àÇ;üÏkZ—ÀØï?Þ]|-”%Ó½_Ú=J]uÌ“ƒ “#×Æ|^–ÛÕÒJáû7Jñ '"YJ‘F»Æ½ÁLˆÉ,9•G:ùžlÛ~ºƔ䀓ÌçY½GÁ~þ27ù›õ“on;ß\m;³]¹î°+OG—¦ÁA@'£\Ê ¾E¤e‘ ÀibQü%GX…KΫ®„@gZÖè–«nŸ©âHe"=̓Ça" %l\)©‡\\³(Û$“nmfÕïBÄÖñÁ/wׯi0`ØŽÙ¿VÑáÁÔíó—(â}Fýƒˆüý¶î«)N–FZ߃ÓY׆´l U™ERAÜ,Nˆs?Ö¸o7¥ë!NY™¦ç^†¦,}ûŒÒºÄÞ€xc±j;6~o3¶,ÞÒ?8bëu]±¹S2•çd7ú´’…XÇ•ÌcY©4ÄÓºm?•„*–¨(…>ÍÇaa b ä…”C~!C«bp:ý«‘ƒTiT $Ž²¼Œ"RqîŽqMþ#œŽÖ¡3‚ÆSYWó²·Ñ*tŸA/¨U2Ge 1HS’Í–“d휉´;¬œR+XXMáœf§‰‹ðm{$>M覤îV o×Ô ¿ŸO|Ì '½ÝX¸ +ù&¾‚HfC_ww³æíª¬˜Ðð.ÂtkGœ¦ÏtæƬMלä¨Bùûô'—C/³‚' ÇÊÕ.Eò+6ífUÖÔö¦ø<}¢¶´  ÔfÑÈÓød8‡Û6•è ¸+3ç‰N4‘è§äÞÎZ6³¥àEη:¨³²µAÖ±MyîꌖG:ÆwÈ%¡\‘ï&ØPaŽ-‰²5<º]‡Kgœ ˆœsœnøb6âÃY˜f„q +o ]‘T&0ç_â:ót»`³¹W[lcXÓQ&’Êö^òˆ›w\NóÖt66<ªÅ©î€DLÑ0¼%_Žœ)EÜ™ïþµà‰ÎaÍ/«Ù’šÈ.µ¬ ákMŽ”L‚ÂßÃnÍyàØi 'ß1_l8›S k/²Ž£"×ãÕ¥ØT›+ XŠ 3%HØuç‘ÒV1› ƒ£KS͸x×ç#“$ʵ”ŒÅñvE6l•³™Y£@r—‹w4`«Z¸ê„Ô¼„†÷ÂÜÑMÇ"‰À—9.Û±M³à7mõY‹EÖÖ"cBÈ2*’1Ädû’s›Œ#!ë§SŠ±(%…¡¹é ’»* ¢—ˆÊØ1“M´$­è(T\_AøÐÍïa4 ³mæ»fևǡ´?ú5 S4œ‡rM±0ëåÚnÆYé,Ußÿ¤î'Mà­„áæ,ÈÌKMe^@œAúƒ:)eê‹éN_L¥ú±mkSrvü³·#†/Ö2Šã$;møB¬ã†ÏcY±oûå´ù̇¶oðâ #1yzy5²þ0n•‘` 1y¢Š¯0zw“’XòMBýäØã0†tÛYˆËË1º:J3oDœw¯œŸuUt¦´§Å¨ž˜e®å23hžL3 Øë]ÙŸV£ÀI¤r½—F“M×jàn÷ ÷¸Ò –¢$ÍœBüÎ7Uc€¹(!ÄŽæöÄ.Á¾ç:;ނýà¤m¼¦R¨e†>³eÙ<Z2(AÿAK[F3aÿ¥Ý2 oœ ³íÈ„¡'¬‘| +H™”ØóH­«Í]ÙçÌÛEÿÌä^ˆVÁ ³äœ³1û‘É.|éýÀˆÔðUHëäÔõh€Ž5´øÂ=°NÜs‡eíA70>m›©ù\õ‡I*šÛBæÁc01¬ƒØz‰rÁ50,Á®Ù[a&OÎØ@ÅC»CM(¨Ý-5MÃ5WöeWòqx¶fÕR­QBòR~r‹3uƒ-=HZˆj#ü„Œ‡*Åï•'µ|­÷êá~(„JwOn¶m6ÀÖj•µêƒÔ`± —:­!Öq}ðXÖ™fª®¯f‡%10‚™*ŠÓË{¬‘õª'Q–€D ü‚O¾*ù)òƒ'k ºo¶ïŽ›Kž‚A‡=ÿBíE!0øð2F +é"s1À@S&7ÄÏ+wum°Wˆò7¥ØÈxgd«Q# !A¥q¬‡áÛ¸±U‘R>îÝ6µéX¾›®ÂÇ—©}·÷"2¬Aì4§íjåõµ®ü[†»šœl féžbª]Rw¸=pQnþbÿãÚ¯  Ù¬aˆuBû•1Ëû½eu ™ÈO/ëF– wXÈl‡.;ëÀ%ÂÖ·¥Jô¨‡$ WŒ»_X {#îh̾©áV½¬#Í~„Ë~²s½ž·Ö²ºÉŒ»taaÓ;aFÞ½s¤ Œ‚F‡37VË(} ¢Cf/t"Ó$MQ ?a¼¤c§¥G0hØ*M +)­¸}\ö4àæãû1~Å¢pÑç@|ôX5pçqCˆ<£á 런Ţ7Ž]Ùr›W–ü‚#›~,¯1Œ3ëí#±ÂDŠ/+1 [–/¿µ"Ä>ŒYt[Î’)>´Î` ×|¤{–ÌÃ(¾ÇHÐèZ‡KÑŠêUHØV½ ±´6¦iŸü`µrl/Ä—öîÇ\fié+ê¶vAl¤_XÕõJ¼4å¦õœ:Jc–7‰tªÜÝ`3O–íÚ,¶÷Bw¾Ý°çw5iË7f°Oëã!ÀdÞÝoä¤Û®×ìÏ;ãbîBCÌ'CýäwÆàñØ›PŸ´>'Aå­@ùÁãÞÑعcv5Î “Ìõׇæ\²‰ó’©$> Þ¦G²‡® ÿÖãŒä~%Ž´*\bì#ŸBs,æ€D\Ðï ð»ç¡5¹¶^#¬¤âÇÄ-òT™çNâ4’B§‚ŒnJ'>:·4BBøLäOV¯ø·Ì«s‡À>»CÜHOßö‰ Wib|?É0RõhÃï'¡=Öíƒ×ÿAý(ä*ÿŠóH2=<èØOç’4Âß»¸6áèÿþYÝî7‡*­ãq' ©m¤4a¦}¥£þýÝ!ëÿf ^‚endstream endobj -1254 0 obj << +1271 0 obj << /Type /Page -/Contents 1255 0 R -/Resources 1253 0 R +/Contents 1272 0 R +/Resources 1270 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R +/Parent 1250 0 R >> endobj -1256 0 obj << -/D [1254 0 R /XYZ 85.0394 794.5015 null] +1273 0 obj << +/D [1271 0 R /XYZ 56.6929 794.5015 null] >> endobj -350 0 obj << -/D [1254 0 R /XYZ 85.0394 396.2024 null] +354 0 obj << +/D [1271 0 R /XYZ 56.6929 333.8409 null] >> endobj -1060 0 obj << -/D [1254 0 R /XYZ 85.0394 369.4308 null] +1070 0 obj << +/D [1271 0 R /XYZ 56.6929 308.7186 null] >> endobj -1253 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R >> +1270 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1259 0 obj << -/Length 3376 +1276 0 obj << +/Length 3312 /Filter /FlateDecode >> stream -xÚÍ]sÛ6òÝ¿Bo•gB” ><¦©“sçâ\wnz½>Ðeñ*‘ªHÙñýúÛÅ)Rt.—™ËxÏš¨(H¶ñkz—$Y+¿"ÿ´+<µtNáÏË–Ë¢)ªpzE¿u^.‹òÁ1%V£.$}æo>Ü]¿ý•´˜vÞë¦f­¤RfE’:ä·E‰·&;_Teãð«ÈJîáN„ˆçÙb]äùÒ>Óï¡ö}ÿVš›4Ëê©Ädcµœ&¥Å¡EœôþœÿïówwïBßö}fÛ<¨*NäŸ@uø¼¦§å!'À+Y^<:-Á•¯ßÝ]ݾEžOšªüfËÊ‚A®‹å´Ýj–¤æ¤yš•Ï>húF«{ðmi€žöE“×hâ<Eò£¾Þm•j7]3”·&;y-§Šm;}Ô± -ܳðB¸®OK3­f]¬ójÖb¹F\\l–ÑbSäe3Høx"@ ¸œ& Å¡ Çl‚¹<ä©=ȪEª[çŒðSæ Ъ¼”פƵ–q|»Ûä[ ÚµµqÀ¯$›FC·Œý[‡ö|(«ÖUˆTQK¼·Ö‚ªhcæw—ô’O¦,æ‚Ÿ(õÖÍO`[³\澕š·9=ƒãÑ4Ž”m†6r3'ú¥ 8}z<Ñ¢¯ S™8™×»|5zŸäæ© -ß]¶Ï?L—2j;¬<(ovhÖQùiYm³bÌ@98‹í‰ÝŽ“ÄL&"°ÖöwûÇ[ˆ¥i0Ìýj‘ˆØD˜Hñ1aa¦.'MQ‚øUèßòlyÞ"cY£á/XdkÂ"–»÷ªn¢º ­nŠÅÐ"Ñ©`'d’€k„‚¾E‚å‚{ë“à2 Å;ÑÑ%ÁŠ‡$ J|}€ü#ÏwÞçrŠêðÛáÁ!­Ü›I\úHi/€Èl¿òoV\,†ã· -9Àî…A¶ ‹›L zçéÉ{‘¢Y{Wꤞ¿på 8{Û‰VLj=}Û]¬ó·Ýb!¥h+ üGÅ'j\G÷Y=Le Ž3}ŽkHä†}»UÖœP’+yÌ‘¦1q¬`FrZÃTÛ6„E"áóë†Ö;7Ž€ÏtqK¿u;”Xt†Kláq çì·En‰I'¨Äž2úiöYYƒ@lhIÝTþí*‡ª(':á(‘”ÕeÒ‘Fp].( ~¸¤ÿA¹ƒŒ1ÄsVíð³ú¼Çœ/}¡QÝÅšPã€ÕÏÙ=ÖHȨŒ™>6 ÛK¬°À‰yÿØÑxªÔNŒ„3Å•é¼ì§^Žný -:8ìʘ”tF¨ÎW[º÷u̴ΧjÈ+"¿ìh€Ò „è#×0i›O´”(G®áEsû‡·]—УþˆK9݉úºšH˜dü”(ºéKÑÎÖÃ×Jiš€Á^>ë–ÚP¤@:Wwâ"Nù«Š)ßÆéfÝNá½Ôô°Ú͵G£ð¬µ˜x©ßùݪÄbà¤(‡JÞJqâÏ\þ´p‰¸2tekü»‹[·eS ;p$ ª"zK?~xMÀ{çyèl–A±1%)ýzÇ<üº¾áñ¸šZæONfÅ'-êlSWÑÙO ÐßH>‚£èÃÎ}§,ÃkQ•xöâ æÏý†ùø·Ä æL …ˆ„/;D -É—fèsýÇÎCÒÿù§3†endstream +xÚÍ]sã¶ñÝ¿Bo•fŽ ñE—‹}u¦çkg:i’Z¢,6©ˆ”}î¯ï.° A‰’®éÍôÆãá +\»‹ýØ$?6Ñ*N„‘“ÌÈX%LM曫dòïÞ_1‰¼½ŸýöðýÕõCÇKÈ/K2òÇÕ/¿%“°ýýU £Õä~$13†O6WR‰XI!üÈúêÇ«º ƒ·öÓ1ù)¡c¥y6"@.²`™N2eâTÀ+àír ­¦íªpÀ¿ëŠ ²qÏÜ=6yÓ»éÍ,’Ìà‡ÕÁM±{ö˜/åzíG«…ƒê};˜ùîãÃíÍÏÞ͘ž싆pÚšpý<ý2ëü¹hp @c±QŠ[¦~MT²(–ù~ÝÈ`SS™LV–#e¦ÍªÞ¯‘ØêvW>=Yjñ‡’@ÀL™¯\í7u¾*æ¿»éÊêàkK™‘”­eª~.eõä†Ë–0÷Ûm½kG¹pbAœÎê;þ²‹!@‹Ù±Ú=Aúåò`iz<ÇB/«r]Ì2¯«ª˜·e]¹ß(*»(Œ= AÁP‚~Í¢u@½ô¸åMGÆ€gª°ê|åü†‡ zÐœóœhxìik×ëbAï^q Ðpj¸a±ÈKãŠUÝ¢^h l-M¡å —csÅBeÒ㬛::9Ÿ41W2#ÜØrq«H­A +Yl×½ñ”“à mÈJž9>X·¯0Rïܳi÷ýWoTd€ƒ9½"ì ÐNºæÌ«i>pÃOûuN_ýʹì)Ûo ¿vÏEÞˆA¸ ân‚hL—´æŠ49ͦ`Þ»²hÜ¿êjýê m±[Ö»ûDôBœÚ±‘-ãŒÇ~Ð>¬Š|×>y•x®g°âã­Ó2N¯ ŧmIÔºuJZ/_,J² \½vOôhh´Ý)ú^>TúPÓ×ÖĤݸ)+ë]¸ UžÐ(@£ sUÏhvôÕ=÷ ôÍÔ¡6gYÌSyÙ2 è,|™„&‹»ÍA¹nØ9n€7 UùSѼ]—†Ð®î”s +lD¹Î +, äkV/¨Æ™NÕ%)ì™`€‹*vÎJ¾fA2Ä—ñZ³Ì\ˆê'öYî+ äk¶H•d–^ôÿ‚Ç:¥ª²é?/¶³†ô¥äÖ·²þ 3Y (JÀIZÐS;ê­ üƒë‹¤'¨™>ßZ“¸´Ô¿©Û®ËÒg)}öÖ†‡Y{Ø ¦œx‰HËbÞží‚p(‘  öNyر^ÀÖê,Óa×bÐËñ(Í —ÖÀ›9Ñ»%¤(Ä:Ö\ßí°lc ÿ½ˆJ,9ŽÒ6&tÌR“_¼ÃY}˜ ³Tl¸ú-óQ³XË©ÆÒÃHØ-+ylTn©è‡·E…å½hÊÍ~·n«|O±êǦ^vßaø»»à˜´íë–ÞÞþðÓõý RÙŸgŒ1Ø€=jj¨@1Zâ ^ª +×ßÁ:¦ö5L0Ÿë¨‘uuzo“4fI’^ØÛëÌÞz,»·E;_EOë}q¼µ | +¹ÑÙµ;¬‘Å[+liÈ ®î:½<Õýb3ÇÑaS3N`˜ía@í)µð=Œ€A¨Ž’Y$TøBa÷Þ~3Ï÷Õ XƒZoYЫÓÔXÒÓ¼m‹Í¶ »MÚ­H½¦4‹µ0Cp´p£©`jê½æƒÑymŸØÀAìCãsQ.ª¿¼r}G€¨áм®šv7ÓÓýœ´Þxðí1ëÙp¶¼ÍÔt=eøa›ÅÆLó™[˜ºˆÇ:‡´WøÒµ„›rQ¸)Èæäsú ïó¾™`£“¡QC*Û“#ä&½à C¬ÓÓa¹-ûfaÓµ‰ê*jVûvQ¿T‡”pÍ\rsž”k„–A ³á€8$æîLGj‰ ÈEóMÑëÀ‹âSÙ6îÕb_¸1Ò°¢|vçðîÇÛ÷×÷Þ8bÒ½ªi¦EM+`˜ ±¬ª /Ó|¨yõJa“:°‡»²-šÃC *;éùc—” ÙÕÍgöäÐ=0§F²>Ë)ʉ… W$:–2»à”C¬3:æ±l‡..Ö‹h¾.‹ª=Jú DÆ‚³tX# ˜…"²+6$Î಴óÌ¿ä4XÎØ´EšÔÚž3Žo¶ëbDÛ~7ЗΠÂè-:N°(~Χªîü<Â"¯‡Ÿ<$Ôzú03 šN÷$Tñ Óòî¹¾{ßµ¶<«EAmÖ¢KÔÜop|#ÊÆQ.]š6²9*e¸LöˆŠÙã?'&4 Ÿ6ÛbnÏ$·/µo +oó]ÞÒ°Û—QëØ}e^ó}»ŠªO‹z“—cÁ•A‚}p 2N6ObÉ;»;w çcén9ç Y¦SlLXP!u²:Õ"“Rù^r ñ­È'’CÁJqÁñ‡X§²Ã²û^7mÔ´§5m9?6J f¤Syž€k„‚¡QÂV¤Y6$Áf@ŠÑѦŠùT —þR€ü½(¶äv³iÀƒEZÚSKüôÙ%¿"³Ã’ˆõGÐbh*Ÿlò9‘G’Ç gÙÁ™IÙ®ÈÛßùbià2ì@u”œÞm–Ätçw;À:³Û )E[iá?*?¹†vô˜7Ç92˜ºIåy2<Ò1†A@†¬èð©•ì3d€Ý˜è«˜‘ŒVÇ*KLÃ"ÁÙô¶uß[?Žå¹8%Mí¥e–[ÃÝU•a7¥ ÝSNPˆû‘»G»Ë«TüvG꺦sW¦8R$4ÂR"¨ªÍ£rúÀm5wñµÃ¦¬0øO—<à5‘žŽÁŠK #“–Gˆ+Ä ÷ð[I åîáiu„ÂjL¦)Û„_Û*}°(šýv9veâµÞû4Õk±¿âAÇWt cß>Õ}ßàˆ¿ArÔoþ¤mߌž¥§&‡â»Û^_)œÚŽœËAÞžïžL~Ø¥äË,c’ ~6Ä:my–µ¼²*7ù:ÚQÅqìi3 ‚òy:¬†85æƒ"n—#Â3sêô3ººÊüÅ¥|ÐèØÎ7&T:¨±‡BþV^Ö_ÓÂ/èŒAUç€ãÊðœ"Óå{:Ñ7Â~ÂëT¹]Õ”ãÌê»zL°aá(¸/ó…cãƉAa£…ŸÄ‘å†ýÝŠ²¯…»™RÄOÖÆÐÓ¬‹'Û±ª/˜þ¶Õ®àCY¹{cg‹ÒMþÚ…ºáux«Š.²äÕ¼Þ—êoo¹M ?s±\({‰’_ æ`P/úó„3f`1;eÍX(!Gs[AG: ÃÕy:¬ +̦i,2¡‡$ÐŽ™ Ÿ°‹&õ± +†JzE® íP¬®ånàè”ýZ,Ê_Œêð}'Eubp˜ïîÞ~¸vÆU’äXM…:vlp\8ê8Ÿ>—µëê¹a«QÜßå‚×täx[ ì,§9¬ t)¼¯CT/ù`¡|ý’¿6~Ž]éÊ0|STËšzJÍÁª=KÉ!/zºï2ÇǺ] Ó1­a(¸y‡Ú5m¯ ÙrNÑj‹—ÏšøÔÍ[¡b¼.;¢EÉäâ×çÞÊí¯,C‰(´>q/B$¸É> endobj -1263 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.2681 85.4256 203.5396 97.4853] -/Subtype /Link -/A << /S /GoTo /D (notify) >> +/Parent 1280 0 R >> endobj -1260 0 obj << -/D [1258 0 R /XYZ 56.6929 794.5015 null] +1277 0 obj << +/D [1275 0 R /XYZ 85.0394 794.5015 null] >> endobj -1261 0 obj << -/D [1258 0 R /XYZ 56.6929 679.1143 null] +1278 0 obj << +/D [1275 0 R /XYZ 85.0394 625.316 null] >> endobj -1262 0 obj << -/D [1258 0 R /XYZ 56.6929 667.1591 null] +1279 0 obj << +/D [1275 0 R /XYZ 85.0394 613.3608 null] >> endobj -1257 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F48 940 0 R /F39 885 0 R >> +1274 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1266 0 obj << -/Length 3662 -/Filter /FlateDecode ->> -stream -xÚ­ksÛ6ò»…¾=2x’àܧ4qrî\œ;ÇéMÛ4EÙœP¢"RQ}¿þv±Å—¤ôÚñŒ‚Ë}a±/ˆ/üñ…Ñ“©Z$©Š4ãz‘¯¯Øâ Þ}¸â&ô@aꇇ«×ïe²H£4ñâaÕÃe"f _<, ÞþãÍ¿nî¯C¡YGסŽYðÃíÝ;ZIixûéîý퇟îß\'*x¸ýtGË÷7ïoîoîÞÞ\‡Ühß ‡áÄïoÿyC³÷o>~|sýÛÃW7,}y9“(È׫_~c‹%ˆýã‹djôâ,âi*ë+¥e¤•”~¥ºú|õïaï­ýtNZšH‘Ì(PÈž9ƒ¹Š‰N£XÂ+Tàí -exý^™d™$‰;B¬³¦-va½©^t€4ÖQ¢¥r°¯®C)Ó`S·å¯Œ‰¢g!‚lwÍMPà,"»Ü›–ÖVõŽ–ˆ-þ·Þ nˆPólrÔ²ažxñû¶*ó²áR%‘,ù\zÞDÇ/ÚQ/BÉT ¨žó(ÕZX¬M±ûVì²Ï ~ŠÏU r-i¾oÊÍ“c’÷Å‘ t™hÇeV5uˆ<®æô®ÒHhå%-IÎNhIE‰ê 7õ 2ƒÕƒl¤jÂçNMø€jŠH+‚ÅQÂ(%d¬,ª‡çbFPÁ¢XpÕqtBDÉŒy®êm[Ö3ÁJ^h‚:¢ÙcAc³-rbw‰ :(Ý7í,+ìW$ÜëMn†¡#-¥ç¤i³¶Xƒà (%EGáð\æÏ4ͳÆñS¶4Ö`»rimí$7¡P2b*Y‰Žê7éiuÅ ìó˜E0 %âඥõ¾ZÒ”ÌZcUg1yÑ4Ùî…Ûš^·ûÝÆ}²Â_¹×Ï¥ãÈï —îméæÙ¾±vïš*ûV4rk4Äô@Ú|—5ÏÑij²ˆipúq2òD$q@aŠ!Ÿ‰$ÔÑ Ã¶›:Sç°/\3sž|5CpÜ”‰8ú³‡×€zRox/ ½ã¡;׶ÄMc¥¡Iþ\ä_pšZ›£—Ùº8z+X@ Ʊƒ¸ûLãý}S´ôuö”•›¦~þô†&ïÞ|¼‰Ü×õnU.@1D!†›œ$øÖ»O·ïÿCó5ßSAÖ¶`$9ºX!„$»„â&ÄL,4ý•iÖ­º¿ýp{Kœž3‡¼l‡Äšýv[“¹"þšèå5PæAf•„ôéè‚ÂCï7­ý€R@ÆxLìH Ê$ØWm¹†IË.ÄAb^›éàs½. hÐñB\z®Å7‚p+}iM-Ë€º*5ZàÑJv$;ÝÀÄë¿Ýðs¹\›¡,¢ò*1(>ºÓ§ý.ó^(B›%½¶È´ˆ¬¥Wäûpí¥ÞÓ’w;°vÈì>&Þ†’z`¹OÛn@4mYU´và09Û™cŸ,ÉÅ«Öű̢À…g¼†ç`¥­`}h{&0kÄ3qÒ?éT‚¹Ëø¼êCöO -µ+òý®AG;öM²tgIwP3´¾I -Èm؈ø‰,QŸõM(¥R˜^ÞÅ„³TX³NyðÎjž¿î |`J9,4mCP´âtà0ÁÞlžv). £Od5H©…p¸miÙ,.ÝH†/<’C½ûBÎKcVž˜¡}yæJš 4LZ&A¼æ`9À5ò“ʉÆ9ÇC/R›ÐÚ±=Ûðêná”Æäe')Ì—µµvxí?|PêlùBo¾lêÈ+Ǫs4\”<]›Ó£0Ž[—ÀsÖ_^A†“ ›-8Œ"¢Íz m‚e±ÊàÌÓCÙÌ&öI$uòLËÒyZGÄù#ΣhÛù„Ûp<ŽÒ¡ØõvA˜ùDYC„Ôõ—ý¶qÙç¢ðÁ§©gËHŽŒðiûªhóçð©ÚÏ!4*îí={„‚âtb"2Ê\ -B=¨3AÈCÙ3²Ê…d&l_¶Ÿ&É -?‘œ'ßAÍÐœop½Rèö‡C²ÄU vVÏ8‘êÞ˜éK¹sjR¯~òsˆÐ–-žJAÆéíÈ´#e#8Æ£óçµ— }šUµgúP¶ÏÄ åh6ü–üqÄU’O™í—ئxÓýæ­Ìúso|>s9:\Ìkf®N¡vï -3MÑ9Üñî»î’ÉÐéwô¾¤±­<3ßû‚ã—ð(f±>‹¾c€ËMýCT¡ç.”&Žt"Ò¾ÑušE!u •,”RðAJ'ÿ®§+NÝ´HËîä~ºc<ÀÜLTH¥Ðf¡‹ wÄ_~TšJ‚êÍ­´G-Ø…×·k±xWƒL‹¾XsØGmåŠÅ`ADÃ$2Ú‘XµKÅ_® -÷P®·•í£ßµUa–Nv_¥Ø‹å¢¯ß?·eÒÊ”ÉExì}þ9ƒ‚Ä+—pÀµðsîÈÇ PL0ÎzÇ -õ >#,—ᶮ«‰ ÈÐÊtÑG;õjJû äÁbä¨#g¼ëÈÐy§µÇ¦®Šv.²€Ò”ŽÍ°—8i¢gÕ!{iºZªÎ¡ds>q‡éí;·ÖË!ðP5'£–„íÑüRk§uf_<”ïê…؃ò®Ì›iÜJ#ÁŒ8Ï@5ÃÁ0naS:ÕCNP1ò;²Ü~ãšùê>Õ½bGwÅŽ‚Š½ª( B/¶Ív`Áey)&…4ºúGSÃp`ÿd¿©(­A4¾­šÛÆŽ]Ã2ÀúÄåj³à@'Žæ {²½[,h€œ ¿mÇÕ®Üþüþ~ø:£a›íÀˆ÷U¶#„àxàJx´7žæx—ÄñÚÑ¡õ]f0E8šÜB¹Ya“ýhju¯]9ã`Ï’ÔŸ°í®þV.6>\@Шxtïæz¢£ý…XU–Àr-‘É…ƒÕÁ‡ý¦f=Å;s¸¸1CÂ/ƒD·~boè\½ôhRÙ˜HcH4có½Zéà/14Á;ÑŠŠä$7Wèøy•x  Lpw7p®™Vê‚»éAq7j΂‡©68)åyêÔ ùá]"G'ߧßí~{¬±›|WöÎJ½š9‡P%1¡Ìÿs§gÌüÄ;ç¬ÌÃ_yŠ÷{Ï^Œo¯fŸ‡ºÄÆÛY[ãP.&Xµµ>Ôi[ë ¨/l¯!NØš‰¸†€t–z5C~hk2âŠÉÿ5¦6bljJ–ž65† —ÊyÎÔ<ü‰§x¿ÛÔâˆ'â¶wP—ؘ`;oj~žo Å#ÐCs@H®ÝYæTeMØl³¼˜8(­â³NâãvC¿€¥ƒ½Ä Ûº8§GÚ\;µ­\xÓfîÇ’lsÆýèÞ­²¼¬ÊÖÝ–C•UgKw;“Ð ,RM3* i»™È - ?ÝÝþìØ}Rm=wåánÑRt?û‚§§bƒw&d ®“Ë™ïh´¢ÁøîÓgš¬íÝšàÖ{Šƒô5vÉq渄٩ýç&Ssiÿå`ðÓ©ˆ™Dôöß‹³ôò¼v"èSl$ò¡®†½ÈÅnN´Bõ×ÊaÍV HÚ´ýÎjSªr3û«¾A«/Ï‹-ìô+Å°…£¹fcù´©ÝåøI/jÒHH.Ï{ÑÐi/êìÅØrY"?Y®võ:Ìöíó«î®nðÊ^fN -ƒq“‰³ìu@Sþ†EŒ€úkŸAß -JÕñw}Òví6äk¼ƒJÝE?¾y,ž³o¥­Sû«;f7‚€õ]^QÉh€®¶þòûTü= ö‡Jpwed]¾ÀNn‰6AP¶„ÓgûË#ûA§EzƒýD,^ci{; VuUÕ‡û[úÑ]Î9œwîgJ°]àËMú‰µÔþ.zf{Xw¡ó§~}ümºJ"iÌ™4ƈ4ñL¡$*sÞýN{ÊúÿR]òendstream +1283 0 obj << +/Length 3798 +/Filter /FlateDecode +>> +stream +xÚ­]sÛ6òÝ¿Bo•g"Ÿ8÷”&N΋sg»3½iû@S´Í‰,*"×÷ëo Pü’äN;™1A`¹»Xì71ãðOÌLÂ’T¦3›jf¸0³üéŒÏ`íÓ™0‹´èBýx{öö£²³”¥‰Lf·÷\ŽqçÄìvùëÿåêã姟¯ß[=¿½üru¾†Ï?^þë‚FŸ®ß}þüîú|!œó÷ÿ|÷ïÛ‹kZJŽ/¯>ÐLJH¯/>^\_\½¿8ÿýö§³‹Ûv/Ýý +®p#ßÎ~ýÏ–°íŸÎ8S©3³gxáL¤©œ=i£˜ÑJÅ™ÕÙÍÙZ„Uÿé”ü´qÌHÌJ3ô§¥,˜€¬IY¢¤j¥,Å””#Jy]5åýËp³N3•87ë"‘@dU‡¬K™‚£ï“½¼G’o?jלIcSÀŽ /EM0=lR0#Œ 0¿qÛÇâ|¡àˆ—Å}¶[50'ÞÀŒ³óW700éüêËíåÇÿØSQ×Ù ÷+Ùö\¸yÀPë†FÏÅ:ÐÄÿªu"z°RÛïÅ–&ˈn×äFrIJÛE>ÒŒêclÈX¬NÜüÖËØè—ƒ¥p`0j*ZnÛ%<š^VeÝK‚(ÃîZH<Úv¯00GDòÊ?—5¤œ¥Z¹þQ¢äÅ9Q:à…ÁSD·4nuÆå¸.ã\z–pf=øôæË;|¾z÷ù‚†þƒÕ2ª·1ól¾÷›‡g¶~é’«é¥Ýü€W×Cð¸3:ˆlUW‹½ƒzmL°ÄjƒzÃHPqi!Àö-›|Êœµ6à -ªõjŠ^b˜5JXJ½ûò‚Á½Ê®vH1÷ˆütИ#éöt`5 Æ@!õÏ„Nß×'âÅ›U™—Í— ÈNrû'¸Œ¼É–_J¾CXô™}…kãUd¿Ä÷xØ8ÞÕåúa★â JEyü˜u +NYG‡ËÐOñBÒpê«x,Èâ6Zé ›ž{)á{+%|A)í’ÆÍã:}Í¢­£ø]zX\‰e­î´,¢Ó–Éü²¡Ÿ«ÝjICÒjéœÇ\äèÒ·/ôŠÞ —›Ýv>¹Ç“¿Ëeà(ž —aµ ólW{½‡µz•}/ê¹WbºçÞòmV?²Qž’©LÏ}<áêη"Ð^Mµ¨«lêÁ‚‡TáíhL¼oi)³ÎØõI³u ˜TOº8ã<‰‰ÙÏ‹;Ü òÇ"ÿŠÃ”"˜_Ì l·Ž +&PyñÙB`¨Åçõu]4ôuö•ëºú`ˆ YøºÚ>e+ + Š³øIÈÜ$xÕ˜ûá8¤ôâÕ +ž´6JHIÙÎ0 `21ð·ó_®/?]^ap¦÷, /›>±z·ÙT¤©ˆ¿"zy”Å<óB’*Zí> ÓŽP¨ ´ÿ$•Câ[>-ÒtnPÙ Ãæf~S=àM é±z.¾D˜ÉèKo;4ô,êU ¬…¨¯~g{ÒI ¢lðÛ5?–KÈvú{`PÖáöÑ“>ì¶Yt@ÖRzƒË™EÈZ"·‡s/ÕŽÏpINß2”6ª‘íI¦»äý)DÝ”«M*LA}&NcŸ—b€jBË< +ê×z¦0ˆÑ~o]hoXˆ¢YôNFÙ +-Ž»§.ÔaÿÔBᦶE¾ÛÖèf”S¶\Úã”#ÐåžsâšI§û”ä‡ÆqsÔ9K•tŒ «|©ôj +ªñýÛ®ðq†”^ÀDÝÔ²~À›¶ X<Q*Ûd?y&•AJ DB,pÚkL.Ó´"’çjû5dËØ°ƒª"2WÒwÃ)Ñ—PždëúÙsÀuô“:lMF/SŸÊú…Þ¶·mXÚGZ®ƒÐbi„3íNa¼¬¼ªÃrpüðÁŠPgËZùº®ž\Vƒ£jNióИ‚¥ ܆dÞ³îô=$7Y°Þ€Ã(Ö-ùk{ôRÖ“)½eÊXñ +ݲä6yU5JpH\GÑ4ÓɶŒó¥m礛N’ …m b—1ÞÂ`C;ÿŽáŠÊ¨å…4j߬J€ðÎÔÌïý7Õ½=vá%™/³&› +žÓ´ZgøCMßäý„T¬!°èÁ¨Ã` ¿.ž»+?†p/ <«§”%óÑÅ€:xí-ò¦MØ9Í}ÛA\(¶¥/ðOæï=ÑHŸàã ú~Ä’ÃÑ,Å:&‚f‡"RX@€Y{e…·jSPp á¶ÞA +?µµ#Ú¬CÊrt=ªúºÛÔ¡»)Šzêj²ô€ìÈɨ‚÷E“?.V»©D;¦Eô¥ÙCÆžHG Ðá¼ÜçRq·h^6…'È–q‘¨£´[ 1ñžiKzj“õ›hŠÛPxøQ5á@(w“± F.’'‡}µ©¤—m‹ˆú'¥!8¢Æ”5¦ü§ÙªŠL?—Íc± Í$ë{Z Ú¦íIŸ»ÔÊ$ó¾<êÝmLYöÎÖðÎÖ@5"Ú*㽑Ú5ijfšKÈõÓô5 xåü}‚›nÀƒåY¨üy’ÆEßqÀ†ô… ZDîJ ¦°¥ÙQºV² ,ƒ¤RΔó1~¯Wiß.ó½p£Z›ýrÕÞüþÊùèfÂy[P2¥ dKÆß$Ì¾Í î€˜uÆ~¯{ø‰·—Orö¡‚ͺ› +ˆ]Ì~S‰ìY’b ìy¦Œd‰Lmª + ø˹äó"¼”O›•ïƒÜ>ÜÏÀ(½NRHoW¸í¼D’rpûÛ—¿¦Mq1çФ&ErÜ1BQŒ)yÜ3¶P(Qp‹r¹ØTÕjä9ä ÜšYíØ3F¨1u•ö,7Ú#K}0ñ¶CæNswuµ*š©˜bÓ&tG÷qÙê9{©ÛªÊ¡T ¯1g‡áå‡0×Éðz hÆ+i©è8z, Ã§b#o]0¨éʼ D—{”z 4&ßX†90³.ùES6ùg‹¦Xѧ¦Sà˜¶ÀÑP¥¯V”ù HܲOp`"$v)æô 5¡ö:áÀžÉn½¢LÑÄ.jî›9~SïW¨O|¬[¶Î%ƒže¸ÎÉèi~±÷u0s—Õe¸º{ wCHõþå@w”A«Dv:µÝö&ħDŒqÝk¦‰Î´c¦‹Ý` Ög‡Vì1ù+²#p¯»bbKÝrðâZšAïÓ·bg9¶b©‘¼0pà:Ö0ëeN_#Ñ)íÒŠéTên›ßÅ®5~t +(.wOš9=…QEk¡%býÍת É}ïĆÞÉ¡·äk¹H;ò#-¾‰Ê ^bºžJµéuÒ¦×SY‰T>q6'.gÛ4¡ ?qe>ÄÚ»š¥Ÿ5hÆÇ׳$/Sk{üŒýM„:ÁÆÛdfÖ:X8Ç,㸇í@q±ª |€Ç¶¤‘;N8 ÷b^šà͋覧ìþêÇíÜá—J¦D7ä%©õíå8µ,ÁºðwG–®@ð¹,ëìU_.ùxÝ_Îè±É¶ Ç»U¶%„àÄ<ðêo8mü}v|µþ§„,ô–!1\÷ýi¹¾ÇÖú^ÕªN‡rÂ5ȉÂ>7Ûê{¹ÜŸÕк,†-3¸f MÐáï  fÕà´ E†òDŸúÑC_tá'~o0Ä:aW’ 7äœKazìŒ4­…:ÁÅ['/ó=>š¿Z,-ü)ŽFxG‚ÑLÒraÀ=èRi¡Nð0ÆvÔÙ@ÏœÔ'Ú]¨ÃΦ…šRâ~ÿRv}”z 5A¾_ð‚6&P öè· +ÐìËë:ß–s©î' 1¿%õŸ2ÅdŸª Í"DBÓÛè1û‹ð'¶<ÆûZ Ô‚ Û=«I ŒP'Øc;®kJ2Ã!ÿ9®k¨#º¡¨ìo¦uC= ÐÇ©·Päûº¦™õÖÕ¥ÿ÷èÚpC]olÖ5ëÀ‰ÞFéZ„?±å1Þ×êšÂßð˜çÞB`cŒí¸®qPM—˜ºÖ:¢k +)6Û"k9UGY½¨7Y>þ±¡L! JÅq6Z¨ >zJ§43’›>#¡ Å>€ñs&ÃÏ8t¸…™Ð*€‘£‡/àù”}-ÂŒ×_Í÷•+N†Ë©†^ól»-éò_‹þ-¼caú›”šXè^¼†àÇyû3¢ ƒÐ,+Œö0õ#欉Nø¥òõ˜m³|nr ZãûÀ†nŽm²¿Ì®é—0õìo0誄®Íé•Î×}3Všì.ÜÞx’ÍþZÎ…Ÿ<ÀÚ}–—+ükøxUeËp5cé‚&©ºÆÕR´?Ld…?_]þØ}ªíiê¾#\¡iØHÑþÞ ÞŠ5^˜.„žLgáyuKO¿5x~ørCƒ'»C÷n~À£ +%óô =ï*ì“ã(p £Cç/,µ_yþë©ßLA–leçüãv–q?oÃÌ!6¬aʶåìkµ°¿“®þMûðj«±l†M†uñ¼*ד?çëuûrüñl±|/–ƒ 4Õo,ÖU¸g‡~ª¯ Íâ¡ ãmOþ/ÿŒÿ´eÊ9y8i§Td +åcø8 +p&±÷4fýÿK€ä?endstream endobj -1265 0 obj << +1282 0 obj << /Type /Page -/Contents 1266 0 R -/Resources 1264 0 R +/Contents 1283 0 R +/Resources 1281 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R -/Annots [ 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R ] +/Parent 1280 0 R +/Annots [ 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R ] >> endobj -1268 0 obj << +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.2681 743.8714 203.5396 755.9311] +/Subtype /Link +/A << /S /GoTo /D (notify) >> +>> endobj +1286 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.9497 292.4924 172.6404 301.7078] +/Rect [80.6033 237.2629 144.294 246.4782] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1269 0 obj << +1287 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [293.8042 246.568 355.0043 258.6276] +/Rect [265.4578 191.3384 326.6578 203.3981] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1270 0 obj << +1288 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [395.8905 246.568 444.6373 258.6276] +/Rect [367.5441 191.3384 416.2908 203.3981] /Subtype /Link /A << /S /GoTo /D (incremental_zone_transfers) >> >> endobj -1271 0 obj << +1289 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [309.3157 215.2488 370.5157 227.3084] +/Rect [280.9692 160.0192 342.1692 172.0789] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1272 0 obj << +1290 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [305.9683 183.9296 367.1684 195.9892] +/Rect [277.6219 128.7 338.8219 140.7596] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1267 0 obj << -/D [1265 0 R /XYZ 85.0394 794.5015 null] +1284 0 obj << +/D [1282 0 R /XYZ 56.6929 794.5015 null] >> endobj -1264 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F21 702 0 R /F62 1050 0 R /F39 885 0 R /F14 729 0 R >> -/XObject << /Im2 1039 0 R >> +1281 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F62 1060 0 R /F39 895 0 R /F14 737 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1277 0 obj << -/Length 3827 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿Âo'ÏT,ðóÑIž;mšsœéÍ´} %Èâ…"U‘´âþúÛ/€¤D;—9ûAÀb,û ªËþÕeœI®óË4‚8Tñåjw^>ÂØJp–i9Æzsñý;“^æAžèäò~3Z+ Â,S—÷ëßI ƒ+X!\¼ýõý»Û?Ý]_¥Ñâþö×÷WK‡‹w·?ßpëÇ»ë_~¹¾»Zª,V‹·ÿ¼þpsÇC‰¬ñæöý Éùç…EïnÞÝÜݼ{sõçýO7÷þ,ãóªÐàAþºøýÏðr Çþé" LžÅ—Gè„Ês}¹»ˆbÄ‘1R]|¼ø—_p4JSgù§Â@›DÏ0P›3Äy_¦q$†¿mm}µ4J/šnË­fÿÝÖ¶›jÑ컲©[†‡+•-,wZÛ vƒÜøþ]”öT)Ò"­¸Û³miB˜VAhò\pþãvæE×vSôU0%{×ki0aõöðÌRÈ{°eýè°Û£ejeÚ†zÍNÆû%Òs¹T¹ -t -¿*ÈãX!ݶ9”]Ñ•O@ŒŽòźè -¤±`àßMm¸jê?ÂP?ö~C/k` Ó¡ÔÚÓ=à™¾;)Öë]T< ;Òœ0/<¼ã¾zfø±¬dKç §'C2«Š(Ì‘BüÍ}K|Cì À_vÒ@ÑOù“3+Z­eññüLðªXm-h]Ç‹Ûšam³“ѶìúBŽ§•­ÐÚNÏÃV ¯×¶-ÅCe£&4‹¶_mq\1Í4‹# :Bè ,À8ÀKk¼¾•=NóÄç4Žd?ð´UÇ”Ué&xMÁƒ ,QÊ¢|ï=BÅ̵UALM¦&ÙbW<3ìAÆ@\èÇp€íšu‰÷k¥ÿðÌ}Ý®ð’;7\% -d…}qèJÛÂ¥˜$Y\WmƒÒ v¯xjÊ5‹Fâ®0A‰d;@Œ†þŽ;s¹»LO…;SNÈ`Dä`íÞyì÷üË\ãáfo^0pÉŽ™(@Ø7m[‚0Ø~ÙÛº•!ºª324YÒÎÊ•Ó\¾¨¶©žDߎ[Ú[M_­E+Q°Žek½êÑïž5à©ä»HYÕ§j/Ê8štD`Õ‘¤w(Tà(àlÅnOò®CЋ B3´Š8(V›Eû¹åÖ†§¢¬0à—ó¯ˆuã¤q6nŸmÓvbØÕØf¤YžŠÑÞ4M +Ðös#ŸÓIL&øB6I-îB¬À}ÏiAÂ{‡'ú¿÷€oŒOìšÖÑ ­Qg*’ñÐI.TÈ¿»¢¬<éµífHW†ØAªgØÀ†eVJ±_!µÜqÎzjx¢œ¹—hИQ4!4HFgkìÝØè[?Ž¿Ñ$z¸aYòáqH¼$úИ}(By¢™†~–Y<•öØsèºëìnßáuÌ&]'¶`kw~è\(T©1¯K… ²Ô˜c‰/«àFeý]•›g‘×™] é¬éÁ®úCËá,2»iœ)\üTqyU³qK¾v€y)1 |¬¯‚ÌQ¤ ™—¦Së1¨O,æ -Uó(ñ†Å¡æH:;0Å£ób_cF”™J\:0ˆürshvK -°0ÌÕ/\†J•(g‹„’Æz¬±‘ÓBh0Ç"-õhd²['Hµ[Žõ2½9fÕäŒ"‰ƒ<ͦ\d}5 r®ùÜïQ…bˆÑP\Êâ‚-Wq19¡0Eä)qú‹é)ÅÄä ¦”ÁP)«÷­p~"EÌ>3B"¼Õ¢Éµ[N§æ´4Š‘†0{ìœÇÑ.£™`!ãד,(æ#±º~ÛÛYkÅy-9ö–Â`:•Ó"Òšù‘`‚1æƼ`DVG…ƒÄxky’0øì/‰…‚hH`°ÍvÚ8sb"E‘ -J[°E܇ßQìÅ€)ÅÑ”b‘á87ªFé Ë¡ýªU5/YÕ¥Ÿ?¹½-ƒq‡ u3B~ŽPL% æ÷skŒ %Gæk.ýh÷ {•LÒ®Ü%ñq9šÌ춌pwóîÓÇ›†³å£‰[—•e¢‡q.ŽqΘÕÏ“L îa'v¦eÂæ„÷CRèyOfilðdc‡øW?˜[ŠµšÃ‰ÉóYf?Tz„¤Êà¬Ø¨‚T©ä2RäB‘~¡8ÈHË1×ÕLqÕcqjÑ­¶Ë]±ßÛõs ‚å1 -ãf“ůÓá±f™¸ï4 $‚SJn7sµE*{¾ZY„X 7z”tšŒr r­œ›8]Ü~xŠäœ<€„‡&©DƒãŒÙ#X(B´â):#qD9k–åSá«Êí@¨ÐرŒ›P‹?A°ÛšlQÂQ)Š”†ƒÇc0ˆ ,²%Ñâ¦ûâ19WAÌfa ËvÌæº+wŽÐœM_ÍY<Ô”öN–7!ÈÏeÝáfû `×R=)aõè±9|æë gùÔçŸÏöPÛŠÛ¨>‚-¾Z¤Ò­' âÖýÛ2ÜÔ5WRÚÙ"›˜Å)-üºôö8€3ÝHb¤Å")©éÀ„ÕÊî¹=VV%Q‰éÁym³úL‰@]y5Æ;eQ£IÃUYâPÌçäÉ]ÎÂÉG’’,µÜÄèî±&q†çaIê$Zäcp¨(+®ø9-ˆŒõ={ÑT8h°'N!d/â3ÞˆGOûþ°oÜ:ó…\ˆÏWM€¬aý¢¹3: L˜™×ÍÝëesç±póò ûxöˆërƒ >àÜêÅ:ÓȼNŽÇš¡gb§â4ã8™ô›w廧sôÄúkO*Qî2R~3‰S1 `¦|HÀª)(œˆ©zˆÚ¹aßm,7? í -ÐiY‚õGQÀËN&1‚IEZÏò[—Tï"W½‹bbã?Zþ› WÐqw‚m±ÃQì,û°B´Xm‹úÑÊ«B6xõérve×9 -ÈPÃïR‰¶cú‹ìƒ"ÑòÄ¢]þD$¦µ³±HÌ&Ÿo0 DY¬ õcC½óU½ é‘ µÒmø÷A†Á¯¹Å‘#*HïúòŸrÅ#ôV„>Äø73T(1ÐØn…0ûDi9Ç…c¹¦Ô14 BŒ‹<Ìð¢bBÎ]èVzûᓬP dgw ¥lÐÇÜö;ç7Î÷‰œuá²F”äôHˆôJ…‚ïR¥X~IëЃ’ÖaÃkv¸ä ¹t¥ýõj)2Pò·¯lÇ¥€Ø zÓžâÈè‘3ÖþS5¦=)ƒŸ q!ÒÓcæÕÈÜÌh %¹,óðõoË)['Î/qÄåWBCŽeÍÉ0qXQሕàH0w¼ÞÁ½m“|Ïcú݆"Q>s&-.Oò¯çv·oÅ¡tµ&T®Ù?.6²x§l÷4'Ê@Õ'¾T©,ñÚÕ±º`&‰>Qó¯ 'N9ÏH°½WæÒpžJ4ÙÎlÇA¬ãÄ?õRœ/lL`ò$¹û™3D :u©»Ç™¸! t蟃Èç©{ÝN©Ê>yàOG…aèTöÉVÒ>nK~ƒO]œ~NÔŸužœ„ßÌØ4ÈR¹Ûwï¯CR2κ –»z²ÂGC/ó[¹N܆î‘nÊndI}ÝñøqÁ=õµ€=¦/TŒTJ¡)4*\ÜvÓbhÃì‘S‹ȇ3/FÑ*ÑR*}=Šc½E{,bìZ.ÖM‚f³¼º»ÇšÙ~4ƒ.mÒéþRËã«@‰–/&”X[hÈç ÐznzÆÙÊ7ŠÏ°¯\ÎÒNžâ8GM|Êè Ýð¸w’Ú1ȵ‘[|̉Ôi245Nô­>X¯¶`¬éC<Ÿ/€¥Ñ¡2ßVÑYJÅÔ5ïã>Êp•¬Ì=÷¤¹ã^æªWU}ËÂMèwüÉF(‚|@t‰¶ùÓX˜h=yqV$2S$8ñ_^8RѨ÷Ç#ç¶E+êrïêk¢^yf*J~Ôe¯>ö 1Œò¢~%ÑF}%I!½¬]‰D¢QZIåL»@²Tå¯îí‘Î7ŸêVd±Ñ“Ýoj‰!²lñÃûoÞbë´{pÍP@º Þt¼øT» ÎD³|þ{AßÆJý’›Ž$’—ÜŒ_²H㲜k;H׆û¥Ð¹nŠ·¼|‚32i|Z&r§±ácÜùÉŠ¢ Ê’o©V/}\j⿹ÝÐKçÿýáéðUn”&Ë^(×BDç‚E„($<Ï•B¾P='ý¿L+•endstream +1294 0 obj << +/Length 3853 +/Filter /FlateDecode +>> +stream +xÚ¥Ërã6òî¯ðm媈!‚£3ñd'µ™ÌÎ8•­Jr %ÈâE*"ióõÛ/€¤L{vkíFh4ú ©ËþÕen£ØÉeV$‘•½Ü.âË{ûáB ÎÚ#­§XßÝ^|ûÖd—ET¤:½¼ÝMÖÊ£8ÏÕåíö·Õ›¿_¸½ùxµÖ6^¥ÑÕÚ¦ñê»wï¿gHÁŸ7?¿ûî‡_>^_eÉêöÝÏïüñæíÍÇ›÷on®Ö*· +ækYá… oßýã†[?|¼þé§ëWÜþxqsÎ2=¯Š äÏ‹ßþˆ/·pì/âȹ½|„N©¢Ð—‡‹ÄšÈ&ÆxH}ñéâŸaÁÉ(M]â_bóÈê$½\r¢s³Ìå8Š-pm%*Š3£—µZâ²ÇB.—ÛmÕWmSÖëÝ©=¬Ë¡ßÃŒ8Ú”›½;g‹Î³(Ö±¾œîýŒÂ€µ@¢™¨ űJç4Þî]ç®Ö@ûª="Ew6mÓŸ®T¾jk˜U¿´;·/ªö$“vü-ùÂÛSÕ—}õ@º!­F+ÖòÆ;=8X$Ññêqïl)X¦{t§ª¹ç?è¸ÎcU›=7'#yd[ö%ð8Iͪ=[=^íÚºnÃêoÞ_ÿtã÷ݱ±'’õä{ÆÀÛì˪颀Âc Æú•60J¯îÚ~Ï-â |{á¯Rþ¼$æ:ît®ì×ÿöm’O.Neq¤MŒŽ»=?i~» +°œßcó…Á¢[·+‡º˜’½á°Ü`ÂËO ©„¼;G\bl¼¢V¦íX02>¬åž élÎÀ©0¬uRÐý0C‘Æ’µ.·Íïq¬ï‡°!ŽW 0†ÆéPbñÁ3}s62•iÎŒ„@žÞñX?1ü±ªe;7 -,Žu]…Rˆß|5tÄ7ɾù…p”{˜+ "+:mdñéü\0Ù °¼‰µ«w úö £]Õ¥O«:¡µ[:ÏÐl]WÊ»ÚGMlVÝ€êfcUÒL#š„: 0ðÒ¯oãN‚Ó>ð9'ÇOººF6@‚ˆ ÏMûØÌ=É(¸Šáí„"ƒú$Ë3 ¦í¹Q…922* IŒØ3|r}¦‰írf(ˆÑ©ƒ –Wf¡p¦#“s˜M»$ I¤HXe[uèu:Þ@l¬>šãlà¦>¸ŽaÁ¾!… ¹p‚N­«feÄ™­€±¢)¹bCžF©^`Û–1^©Ä„qÔqÇûë%Ûããmc&ñ tÆxÐ ½kHR°GdccèÂ8~çÁ6Ø%·æ³ãøIô¢–½(By¢™a–Y=TîqãNÎ~Ý÷îpìñ„Ú²Q×)®Ø»Cz.*N¢Ì˜×…ÂDyìËc…ò.«—àHeãÛT»'×…] ééÉm†SÇ,²¸)ä€Üû\oyS³qK¾u€!›0 ºoÚ ÌÑ£™—…ãöX±VبÛ{ˆ?,O Ç +Ð9€õ+ïÝbâñé5n$y”«ÔgË 'Dºú…ÛPY¤RåÍc¹h²æØXO56ñZ fY¢%¶žŒÌvë©ñ˱^&¢— ȬšœT¤6*²|ÎFÖW“"ëÚÏÃuÈB˜†ò‚P–lqÄŠƒˆÉ9 €1.B çH©×_,[€QLMzJ© U²úÐ &RÐ’#$bLSSxý%¥ZRCŽ]DÒ(L#íi¼ó<”öIÍ ¿%B–ÄèûÝà–¬g¶ägØñ4åA­âÝ&6|âM¼ý$[}ª ‰;Ãô§E¢5ó#ÅcÊ LyÁ:œ NJ© Öò,s ù_j…‚dLa°ÍvÚxkbEJJ\°E܇ï$ôbÀœâdN±€Èn<·©Fé(/ ýªQ5/Õu˜?»½=Å‚6‡Cº!?Ç)(&“3|È:Ë-†…©’¸#U +Ÿ}tÇ–½J.‰WáÓx€„jÏì÷Œðñæí/Ÿn¾Ά&î}^–‹ÚBã’-kžf¹ÜÃAÌLÇ…ÍïÇ´0ðž¬ÒÔÞÉÆñÏa´¶jµ§3‹òÌa¬õI°“ѳڳx!a²Ø~¥ +<Åz¹ +°8³è7ûõ¡<Ýv) PÁ©ò¬ÖÇQš'Åët¬Bæ鈅4âš%ïvKÕE,.¦¯Ö!(ŒÎÆœÓä”ZgÍÙØlõîÃC"çä¤<4Ëä lsf`¡ÑŠçèŒÄ¤¬y^Ì…¯®:´±BcÇ2nb-þÁ~h²E‰'Å(RŽ `Á2°Ì–&«›ìKÀäT1!®ã°…» fsÝWOhÎn¨—, jF{§k‡›€äU3|áf÷àÐQE)eõèc{úÌ-ÖNò©ÏŸÏîÔ¸šÛ¨>‚-¾Z¤Ò] áÖí›2Ü6 ×Rë;Þ¼(Îháë³#ØãÎt'y‘‹¤¤ª6wäRôXY•%J¤çuíæ3%õV‹wÊ¢F“Æ«rÄ!ËçäÙ].ÂËGš‘,uÜÄàî¾!q†çaiæ%Zäcp¨¬j€ÖDŸ +öú–i&94Øg^ˆrd‹5Û‹uG½‹ÏVÇátlý:çÕ\åsêM;œ qؾhñ@Š"È¿bñ¦X/[¼€…›W_ØͳSÜV;ì€8pÏ Ÿ‚g¯“°è™™* (‰õœž_ƒ3ŸY>] /6_{VI +’(z8±™Ø°T!*`Ý–QX*!"¤qÜÇHŽïÖÊÍH‡ÔZ–`ÕÁÁI 𪗅 Aì`å‰Ö ¯Ž#NúS_5swATmžŒÐ‘˜ðt†*%&Û0fß0­—øðXm)ŒÍŠ#ÿŽð°bbyFÍx¶’ÈDЛ¿È +@îÐRÞmðÎÝpðžãù>‰·/\ÚHÒ‚Þ +ƒ«PôƒJª kÐ/éºQÒ;l½Ã—4ׯt¸`-…ʵë¹`ͨ)ôšÛb£éypòÜiõ¸õ\—i[ÊägH\ $™eD²9 jÈÁI! |&|NýËq*Ä&ŠóLñy–ÐP Â]Õpd2NWDüi…àH%°ðì_ă“¼/`†ÝÆZQ±p&-o>_ +ïèîplOå©ò%'T± A.:²„M§ì[ÿH'ú@E(¾W)0=ãµ/gõÑB2=×õ¯ gž¹È#ȳ}¹X*ÄE&Ae·°Ÿµ‘Õ6 >¤Ï6&2EšN\þB¥Bùçv‘ ÁCé8< +‘E.2ÿÌQ±}öÒŸMêÃЩ݃«¥-¿}Á¦„ëωZãc¢†ÞüòÿgÆfQži!Ú_¾ˆs“iò]²ØdžE”©pC/ó[G…Ný†þ©nÎnå©M¾Æn;}cðoþcIàˆY Õ$•Rh ŠWïúyI´eöÈ©Eä4/FÒ*V‘ +_¤§X/GÒ‹˜»Vë‘u³À91Qšçù뻬…íçOry”f±šï/Å 0<¡”jùé„c ù]´žÚqöòã Åg8Ö¾Ggéfrœª¦!s vn|â;ËðjG‚ÚÊ»-¾é$j®綉r_ ¾7{°Õô‹B-WHð‡“6Mþ‹Éø,¿`}"£ÂCV[·Ë¶'³úì9 +Èä*X–ÉSQ–y–gÞždøwªJ?a8Ü_ ÝÎÇŒÛt¿¸0¿!š> endobj -1278 0 obj << -/D [1276 0 R /XYZ 56.6929 794.5015 null] +1295 0 obj << +/D [1293 0 R /XYZ 85.0394 794.5015 null] >> endobj -1275 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F41 925 0 R /F21 702 0 R >> +1292 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1281 0 obj << -/Length 3465 -/Filter /FlateDecode ->> -stream -xÚÅZÝsÛ6÷_áGy&B € ÁG×qrnÇ'»÷1m‰²5–IHÙqÿúÛÅ.(P‚äæÚ™‹g"p±Ä.€ß~§ üÉSkD¢‹ô4/RaiN§O'Éé=ô}<‘Ì3öLãëû»“ï>èü´E¦²Ó»y0–‰µòônöËèâoç7w—“³±2É(gc“%£ï¯®ß¥ Ÿ‹Ï×®>þ<9?ËÓÑÝÕçk"O.?\N.¯/.ÏÆÒ ï+áÀ ®~º¤ÖÇÉù§O瓳ßî~8¹¼ëçÎW&'òŸ“_~KNg0íN¡ kN_à!²(ÔéÓIj´0©Öž²<¹=ù{?`Ðë^­_j¬0*ÍNÇ:6ƒ1¢«œˆÄÀªsSˆL+ݯ²’±Uö\¸Ê³ºm«éø¹\.fe·hêÝyËÌ•åÅi8øž -=WDè óD¨´ÐC%.ëò˲:ƒIÊÑûëÛÛË jZ¹çÿÖåS5Ãý´ztÝtê¼3Y•$"Ë - êÓ¬H±‡ze¹0yV0w¹l–TU³–š“¾°¢mÕõnÀÔŽµ‚­3°2RÆ(7îkÕFd«D¤J§,Å Q þVó3iGójÚ-ž+˜³–Éèî;gÕ¼Ü,;zX´=¤*À¤üàqd. -P—yÄò^¹Ì„Íù®#ô\Áæ”ÓiµêÆÕ×Õb]ÍöphS‘)£«ÑsEôLÙü’,*rî4€5ÖräÔÀ¥U€ŒÚÅ}]v¢µÄôòPÕÔû\­ó×E}O=Š¡=|a Ém!öö[ˆÑ-ç PN2%Òµnb;É`ó;éÐr[uS AÒ=€ ×jVdXŽÊ ûU©0‚?DXVåsÅ/8«£æófYWk2Úð}šãjY¾ÒsÙuåô±=©,Ggj#*`: (Ï„óþϦZ¿.›û=©L$‰IŠí™öåVZ'¢°Y>|»ª¦€˜{š"6º‡jšT":(vOÛíC³YΨí,xÛ®\wÕ¬¥¦–_~| 9I:±£«yÄýi ë"¥GB¸";I5„ˆ0ÄèÀšŽE­ª39šŽñMpjÅ4ÍvÜÚâ×$QÕìGXU÷-jøÙ# úÙ“Çb7ÖUë§Eíáõåug€OUO™ÒÌwXOË®ºo@fde RYÝ»[TmõŠZ‹Ühõ–WÌ´âô¸Ž€Øs¡ÄéC5}ã®·{@†MËlñ†ðž+"}åÔŠ,OvÄß9G¡Ó¢wšw i›Ö¹E6}¤ðuëÅ´ãçâ kúP®Ëi‡¶€ôÅÀûð†üÊ$™G7/@ÜäÌö{S;'Ÿ{{ʃ¸„T—†¨µÊÉcÌËÅ2‘ŒH iƒˆcÇUW`pEî=Q»„ÈË– $+}¦öWhþR®ë˜ L*ß×Ü )ëö¥Z· ¾ r½³Žpë†àA·´ÏÀu1x8'&‰¨,•‚tÒO{Í0ùsWNx·£ÉiÑœq <¤ÙzHÈ^šut' -¡u‘‡òÍÁ½&¸V@啳3Aᙂ5±£3C•éÑÜ­&—Õ}¹$ÚCÓvlßØãÒŸ_ŽDž€‡`£àðå´Øð,6ðM>\¹0Šß¬™‘»ôÈ*ÉByð§f¶Ǭ’Þ0XÑ0Ѐ°«EdY¿&Qÿ¾[(xë ’ÕjI¾ŠVçqsÍÎÍKí¼мgDêœ~ÏßQ×9ü# -9] }ú©ì‘0±È¬]uÄÅÕ¾¸UC³©SÃm½Wy°RÞm«¢wÛØ$’eTaòž -rüïœH.ÄÃïõí;b¾ýÌ=´uÐÀ àïþR“¹ 8v7×òp²™øGt¸¹› q C÷rW*LÙzPÂ#  Þ&lâJPkQϘ­à„$îiÙq‡ÿåQKú¡‘¡Úhy€eÓàõ¦DOèXXít(¼¦'ÇyUÏ8C[pJwu=>ÿ~"Î'7g…rØrä›l—äL›»®®ïÐÌ¡RH+%„‰ã9TÈu8‡ê¹¶6öôu¿°B¹:.¹çŠˆÖMs› e_ l\”F{GLÖ‡¿C €Z•ë–ßhBÆy?“Kú¹ºáÇÙŒ3W!ÈÂèÐõkN¾u|1Ì’ ”7I¡¾5D‚´Ïnª‹\h›î” «¦m}éø\.7¾ÂôÎ<±!H­y#×È¡$S>n¡“ˆÄQZ&×ÿCl‹Wg0Áü Ün™ŽÀ–™¶¨}Y,gÓr½bR‘§¹9*¼gÚ—>ÌÎ -H›­ˆ§Ì_ét{DmOÛ¸ô}F‚ð;e¬C“bºÆ²SYçB;PxF½ÖIÊØäqIèüØû\ˆ¦ ·Uv¬~l`W p…ñë !¶!‚-Aù—òµåGÏB?l7d"ðìTñÝ©ƒÝ¦wíŠ-~75dP”»°¤¼‰C#œ1QžÊnú@uªS ªÔE÷ðDÐEcqÅ2Ñ)ùP<öÕY‚Ç8XMQe\È‘¶¯ ÓeËýõ¶NdŸJçP"ªã§ˆ©(Rm‡‰'†zVÔ‡[h:¬`ßÎ^C×+>µT"“ÆC0-ºKeÛ û”’~ÐkÁR´^(#D.SsÜ|C®ÃöÛsm xQwÕ=ìîë¾Can¤9®@ÏÑ`hÃOÒíP…›j «ëp• Çuˆ–-”3¢!¨µÕÓ±8å[êrÆ¿DØïA„ûÆ®8¶oIŸÄÕ…8Åe>vÝNÎŒýƒ·™VMÛ” -ÏEƒÈ§5¤Tù†šA´#VDð95©Â—.ó%<âQ”k¯;¶î—›ê€ŒèÕ×E˯®5$XÙttš½kÒ½5ÂQ]i3Z1›óŠÁ¯˜£îç›ÀÑÔËWê^ÔcÞV ‡…Ø;.ès»årNèÁ›{ùͦ7ó~˜<&’ÿnÚX°†8œHéã°;·;‰nÔ}ÏaaÄD™Àst)¯J"GxD£’ÈÞa'Ï?Q}‘àWšeóBÔ®Y1ãœ<9hm%‘Á¢$*X|1X‡ÜŠBêRÇK÷ÇZØ ¹#I¨× U=åz±·hZÇT@®bþÜB¾ýÁhx€$Ejå7xúƒîUR$hßGÝkÈuؽö\aV?žúÂeøÁ26M³ãò{®ˆƒ¹âq±2ÅPƒè™{!ŒJüñU$쌌 mr¼ƒý¹¯ŠÊŒ$L;Þ‘A¸<œì”íÕe°½eöYÜS°c¶°”°Åf _\Ÿº¼å£ 9¡5vçTë ”ü‡ ¤´È³>/ÿƒµÄ!PAÐÐ*}#幎€Êsm7¬]?E•9®@ÏÑ ‚*;Táª4”•ß‚*ØH¢*³Œª¬ð¨’GU®=ª€Hçqvˆ*xm„ sZ™õÐê» Z(±!ò´ŒÜÍßÿßÐJŒ0øÊqh\G å¹hAÍ‹‰ÿÞ·œ KÛì¸øž+"˜ ‚Wüy¨À?ù#b6ZQZÈßóAî—r^о£>>6ƒ–OÙÓÞ…ÑÏÇ‘9ÎÙ¥AþÛ$í(P·; -ÌѸCÙ«ÕEäÁÀ™óÆN†\‡w²çr)[µnÆu3n›rÜuËýÄÌ¿vU çŠh0ÜKp¹–Cx/¥ÏB» 9»j¹é°¦,ñ¾’ðûÂ}ÿ$w?s!ÉÙ(Þp¬@ð_E•œ²=ð€ww?…ýÇ à”ÛQ¨\ËíÃ+8  ¾Øý|ì§Ä‰S‹wavo.üNg®Í·'< -VW™¿&å‘f[èô à\G€ç¹"ÀOËéÃ~ŒÂãGq\ž+¢ÇðŠL - O.‡Šü$ä"¨‚³Y¸¤m‘†O!Òˆ w {˜Ýá é|AimØpÛmŽÂo{ Yí5Òý^;ⵌTÊa½@!2Ùoí¡k5ÐÒoí¾-„ÒRßü€éðÞ{&Wc­fPARÞ?~lcô¬ÌŽ‹ï™öåï^ÏË‹|¨{å?³ÜWx÷‡¯io§Ð=™Ü^}l‰8o–P€ñAWáNd€úó b¹ „ÝwçšÍy˦¸®r{9Ò‡§¿ª¥C_Ã_uÌèÇÛ)yþ5ItyODç> -³åz}ûã忉q2áΆ~ûë)Ô½˜ûw]j­Çꕺúë<@üÂ#ÓU ÅøE -/`µ£‚[>+³ý‰¬ÙÎAg#OÛ&k3î˜SG|ˆ‚Çm±‹ÜLˆ“ ù¥é¨õ² VÆ5-“ "f*Ñ`‘µø@7¸ûàtŒ˜§€Z[ý)ÏëÏߌÀ»´ì'ý­¸?}ew{Ÿ9ÅVÅ­H'P8áí -V -7rWs£­0VåÕÿ ƒ^'endstream +1298 0 obj << +/Length 3366 +/Filter /FlateDecode +>> +stream +xÚÅZÝsÛ6÷_áGy&B‰/|t§çN㤶{×™¶ŒDٜȤ*RqÜ¿þv± Š” )¹væâ™\,°‹ÅûJž'ð'Ïm*Ò\åçYn„M¤=Ÿ=%çÐ÷Ùdži`š¹¾¿?ûî­ÎÎs‘§*=¿_ ær"qNžßÏ›¤B‰ ˜!™¼~óöú‡_n//23¹¿~s1U6™¼½þéŠZ?Ü^¾{wy{1•ÎÊÉë]~¸¿º¥®”çøþúæ Qrz˜ôöêíÕíÕÍë«‹?î<»ºï×2\¯L4.äϳßþHÎç°ìÏ¡sgÏŸá%2ÏÕùÓ™±ZX£u ,ÏîÎ~î'ôú¡1ûë„U&=Ÿj#È[YŠLJ`Êl.R­toe%cV\håyݶålZÖÅÇe¹»f©á29ßsEäë|©¬pV«±W$yªœš¼¹¹»»zMív³Z5ëŽ^ªUÛYTF˜l’ø‰êâ©œ3ÛP¬NDž܈ à`’tòK½,Û–%•,¥kh¸qƒá©Ö暇¿”mD„ÌD®Uñ*¢«:ËO)ª…K”a®åcñ¹d ~V ~²Æó&pÔM‡SP”ª©”"·Vù¹¶¶„“‘½Ü?–Ô˜—‹b³d–ªB0·KÓ¯°„ë½{ˆ©™L2‰<ç×8®œ?Ëj^tUSïAZ§"WàˆŽªÐsEt-×€•XïH‰i­³ÒØhåßã¨ÑéW€eÕ6““›¦+#S°T–`íø™ÓLØ~âbÙ6¤l]–ó–š“>òýâŽ}Ü"È œSƤ<‚p%Fé * +B<~d–‹ é&‹rÖUŸKX³–߆`•Cx1ÿ€Ó £€;ŽßÓaø¦ÁÖ³Y¹ê¦å—Uµ¦Í!FªÌ¹£:ôLûJŒV›J¡R€íP‹K/wTN¼htÐɤ­ê¢Û­%¦çDz¦ÞÏåºZ¼TõulÁ/w"`!TûÍÃÞ~óð%ºyBˆ4MÒ±g«›Ø2C6'we×yÅÝcÕR«YÑyôT†ÛïJ@>ˆ°,½+ŽV0s–$ú´g7ήϛe]®9ê Ä’iVËâ…Þ‹®+fŸÚÃÔRhÈN€pÀu… üsS®_–Íîà<©uùqÁ)"x´G‰©IÔXòݪœ€`ý&AXuå^tN:4{ zûØl–sêðni]±îÊy?KÌÍ*N1OäéÓ. .ÃOŒØÕB\/b®Ö “¦zCCîL âµíýŒG#(‹Qœ–†˜r@à[ì¸Ïê÷$QåüUÀsY÷-jƒÙ¡ÁÈ3²»ìÊõSU{;¡}Ù™`ÅGµ¬gLi;,£‰gEW>4 3bH¢œîÝ:ªVE½/˜;à ñ„÷µÒbAê(ò‡\‡‘ßs¡ÄÙc9û4E0´{nWBgÔ á=WDú8†¬6z,þÞ»%mòÞ-iÞ1¤mZï„Ùc …w¨[W³Ž{¼C…®Ùc±.f¤SˆzQϩѾÔ]ñ…zqcý rÝ‹7OÔ†²iS3,!¨+cÆîø©hI¤N'Ð%…ˆÅ~×pDj°ú«¦n‘f%Ä÷9QžÔ<Ñ­uÙ=7ëO¾ºs!Ž¤Ã8’B¾åaF +ÌfŸiÎÑ)ålömt°6mñ€ðÎÀ“6øLMÞÂûØÎ(lSËeD‘ éGH«þjjŸ¸gá0eƒˆÔ*m*ÊØà²EµŒ?+L.‰¡†¹ãª+8myXÛ%¹XJf!#JÝ?¨ùs±®c‚À#ÑÜ )êö¹\· ¾NMnÕ}cð OÚ‚gä·<í›D«K…Ÿ yøšqså¾€N ¦“;⢙éH™[ÿ™R³ŽnE¥]ž Ýã9LšsM°äsP_KÇ®…§ +Œâ&Uª' oN /ˇbI´Ç¦íø€c÷HB€y¹ž‚O÷€''kÃËÀÚÀwûö5‘aŸxd͌ܥ'NIÊ“?5ój:>–ŠÍŠánªhhH ؉˜5ÛdÇ»ïÖ=P7ã->«Õ’œGfÈßfš½šçÚ»9 ׈Ô=/_Q×%ü# +y] ½û• UvI˜R¤NN®;â⪠nÕЬ†ñjø­*,ü¶ÊlP›Ä§ÖNnßÐÕþwI$àáys÷Šwï/¹õîWnÐ&bßí…µ“ÓËþz´³~=~Œ_ÊR\Ï…œÐ’ðÝ羧µŠøé÷xÃgöDñG†© ÓCƒ7›hjUõ¼Âìe˜‹Ž;“g-†¡Öiy‚eÓ|Ú¬XÂbĽ¡¯ÙÑ%‚uæÇ‚·žsºVq~w}3½|óæV\Þ~¸È•‡š'HwIþ¤s×õÍ=ú¥ƒ •Ñ)ä¹'ò©Óát*0mÏÛÓ—½:"‡3 Åæ1©g_긊0àû@‘¡Ø×(×®%„ÕÁÓ!Äç9D€–źåÍqÑOÄä‚×øu>çŒÆã_æánB#€æ \÷·%ãTÙ&"ß^j~u¨iïýR)>B¦Ýnv¶jÚ¶êËÎÏÅrS2º‚ODnH'Lgr(çÈÀÀ„"O!vÙLÿ!.Xk‘*s¢ör†lϵÅìsµœÏŠõþÝ‹J…¢ñ¨øÀ?2¾H#ùT(m¶7Ð4*”f eÆ`‡&ÅvhÔM=¥â·x ðz¶Î91 Nš”%.ŽçrÔä"sP¸ŽÕÏ ìŠ®0Ž=ûÃ6D²åsñ¾¿å×ÀB>8tFàÝ«ºÇݦw芗ÏM ”å>(©pÆ¡1\1QžŠnöHÕªW jÕª{|"è˜1ˆ™hCÎ?Ç„-Á«#X—iðZô—“¸´<ßCÐéÓæ~†’¶^^¤¡Jg"ÍÔñ;K#r£óq +SE½±ò¼Ç +4=V°og¯¡k„•b*‘J»“hÑ}JÛnØ©ô@·¦>||áˆ@Z¨Oßב㸶Ƿª»òv÷eÿüByžØãòSDþøü&B¹TøP®Á¶U :\gÈxšbN4Dµ¶Zz¯zK]þÜÃ3@û„p×ØKÇv” ‰ P}„ƒ'Ÿ Ù'kt„H]êÆ0ßK£ð&vø´V|ñ/‡‘ŽÞKjR•/}òKPÄ‘ÑÙ)+ÖAql=,7%Ø“¢üRµ<” ­±&Á⦣û¼Ýܪ?ˆ`ª-]Jær› Ûܨû &p4õò…º«zÊ{ +äa-…ö> úüVyÿ =h±Eßlºi³è§ÉÓD–°icbp"¥ÞgN½D?ë¾ÓpþË•8 ü$˜¶J"'xM£’ÈÞa'¯ºÃrø±\6ÏDíš3.ˆÀ‹ƒÖÖ(‰z¶FÁ£xØæNäRçcØé6Ùú#‘¿“„’RÖ3.ûãíCv4òû÷ yúËÔøI +ãäW8ù“¦ Z™©üë°gí¹†ÉütæË“½ÏªJ˜–pT~ÏQ`ìZ3a²ÜŒ5ˆ^¸çª$¤‹ï¿33Úf£kw8ü îÑ„Ç+:>§sÊçÕg¯ýɶì?Ò¸§`¯ì쨌p\ûùõÍ廫;¾ÍÁϿκø¡> E ¥E–*ýmuÄ!P%VXrT®#  +\Û kן¢ê¸üÀ‘Á”+pSÚ¸oì¢B*u ©4R€T¦¤€H÷qn )¶@й+ 2®únÂJlˆ¼‡++wóöÿ3®dª„KsWC®Ã¸ê¹¸‚bþ½/9NÈD©ãâ{®ˆüñ—-ñb¤Àh×M:YQBH…‡ÉFYŸá¤ }E}|O­ª›Þ1¬Ç“9ÈÙç@”†â¨ÛæhÐÑ)”rÒ}Kmqx'¡˜Ís}j'\Gv2pù|­\7Óº™¶M1íºå~B¯„5VW çŠh0ÞË ÂIšUཔ!í6PÜ@éçw¨Å¦{ÄZ²À_¥ ?0<ôor÷;’üÅ_%¼¿$Bø&ê©ä<í‘'¼¿ÿ‰(>’áãpÊê­ÈU&eõÃßà*Â…zµûñ8,‰³¦q³û+‰¿è†µùölGAŠ¥¬û'pçr¡´> endobj -1282 0 obj << -/D [1280 0 R /XYZ 85.0394 794.5015 null] +1299 0 obj << +/D [1297 0 R /XYZ 56.6929 794.5015 null] >> endobj -1279 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R >> +1296 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1285 0 obj << -/Length 3124 +1302 0 obj << +/Length 3178 /Filter /FlateDecode >> stream -xÚ¥ZKsã6¾ûWèªj„‚äq2ãÉ:µ™ÌzœÃV’MQ6k(Ò);Ú_¿ÝèÅ—ì­ÍL• 6@£Ñ¯AÉUÿå*²Â¦*]Å©Q(£U¾¿ -WÐ÷ã•džgÚ ¹~¸»úþ“ŽW©H­²«»Ý`®D„I"WwÛß+”Xà aðá—ÏŸn~üõöý:6ÁÝÍ/Ÿ×…Á§›^SëÇÛ÷?ÿüþv½‘I$ƒÿxÿåîú–º,ÏñÃÍçDIéqaÒÛëO׷ן?\¯ÿ¸ûéêú®ßËp¿2Ô¸‘?¯~û#\maÛ?]…B§I´z—PÈ4U«ý•‰´ˆŒÖžR]}½úW?á × ]ÒŸ‰)cA“J$¡ZV²±”À 2¦g%+¹¤dÏ…Jî§M—?mÅîP´ÓMK%EšÄj5œz&@ϵ H •…vbÇ"Ü­Ó08œÖ g×5ø„÷µLÉ=@.ê|,¨ñŸ¦.ˆïØ–õï>|¡F¹£¾_?2áÏcq(‹–^vYYMX©‚OÍhd8&!BÞ쟲®¼/«²;­¥”Á;舭t„'#´Ö°õ(Rn'Ûb—«Ž ©l‘qrF #­µ!ÿ©ð<#-‘0X˜e“h¡l š×J(cÎþ"áxA†¸¹—ì°EõÌ×W…ËHCGàÚ`ç¡Ò·¤×0…å¤Ç‘g5‘ïyȱ-¶Dqg‡,tjYÇuW4ñSÛ²+6/嶠Þ<˽ ¯±LÅ (ÏÅ¡Å“)[Èö˜³ p6‡l‡ÄßÃPåî”Âñù40XMTeý­¥¦“Z§AñWWê¬"jí jñªFâ4¸éˆJj€FVµ µîy+¦ìÏS5/Ô<›"Ž8/ÁòÓQ鼨¨#^%«O/9 -*Ê(6¿%W“çÇhêêD“Âq/œU÷Ø´yR¯3|ÙáêØxy,óGjº½aƒÙûŸ{:ía#;Âœ‡²¿~fþ¬ÞRcÛSv§ìñôYݾôÓ×üìx 3`1Ë›mh!~Gæõ>äºÀ{.Ôyìvºn -BEÑëëz¦…u‡Á’² -m2^÷î¬S4O]é\6•AO£ÓʾÈj0€Ý±¢œSË09ä@«Ê¶OH>„bÿÔõ†ë(xOôç¬:òŒÍŽ"ž*O[)À9ªîʬ0‹*IÒs‹ô‡>æ‡O w-F}`VÖ€€ÿ£IXÞ#6z»´”áð‰V}šðMu4Œf(,½(S‹L×R¶£I2fBc®¿ë<ÛìpX»ÅC{·Mˆ+‰ÎR'¢CUºkjQ|À^rJ꤆[v-¦ƒ—ÕN 2Np³t>JF"V½ê-œ±±š™œ‹£ OE^¢žŠ-žBªßÚ™'¶ð@ÌÓY|wÒÊ(ab£Æ'=>ž‹¾º £7°Ú€é²§{¦££]LAøe‚¿¶pÏ4_y>`¿&g.ýµ×/*Ü;¯W»ùB„l»e¨Öö< ±ÜôNi[d-©œ  ´m‹àÀ3šâ80Z™â€£Q´ÀÖïaÖ¼.®3oø@cëñy‡‘Rø³im#c‘Bªr¬Ótq“06`Ëm»šõõpd”BÔÆóÓã© ·Í>+¹ë>kKD8J3lèW#­)ïcÐx¨š{Ä+Ü;“sË£š¥,ëäµÚ!£C¹Ý:׆(æÄzFç °S7ô5;"BÂGT„¨ùßk »G¢“Z€±-:¢=9™F »(anß|y6c{Šõ2Ê€Þy®=ÈVÖ—‘±ND¡òõt9亜/{.‡ËúcÜ´ç£%N -©õë"x¦ÆU»þŒeeNm"Ö ^¾z¢+¨à9É¢ÈåìºX‹<àŽ…úûRÏpý%]C½™›Útº3syÎ*I“LÊ® 74 í6µÖ6:N\1õ/Êϵ1:*:‚eéq=ôyä…ýû£Û5P]‘ ” L™(Nê8íý¢zöÌë×ÃuJðWNÂКY¹oÑ”ü|Ìps&ŒÝæÂpQy53KO4$léÀYƒÌ°GÂʯ?±J°~‰âÄ°lÓ\Aè“~×  Ö?ô,8‘å¼—c]áù»2IÍ$²…8÷l8Íðë@?®âe¶û¢¨}âlñ¤¶¼0œÞñ¡©»CS½– ´›£diÏx -„¾¸€6¡è½çN¶çîPæÛ#ÐÝQS’.:Oæ ´AiêpúÌɹ  Îa=åÔvÅá˜õ×9v0 ¡C¤J#!±†};ôü›á€yØ›Ï;Æ ¥óè -¥­ɳþ™ë )|üWx1 -.à!qÑeeÕŽmøoä†>áŠÈÝÉg6v”Ña8#o»Ë• ¡õ©lÀt9“y&çÁXl<¢xÓ&µÊ^]ºgš¯=®ý!•­=.ý”ì¯Ý”r¹€©=$Bº“—j.áÉâ;†ÎÝ!•=ˆ¡2^$G[Aäc’³å/ý±ÀNýà¢ÊIáQ•Îè(Bµ«Ô$ºT“øÌ þŽ­=à3_ÓOŽ$MDÚßKLÏb¢B --µ/"öÙ‰fçKâ„ó<WDpxŽe›Ë !®…Æø‰Ü ·#‘0‘‰™ R „(vÜ5–êWàÄfñˆõ2NeŽA±¥ÕãåÇQèlÀ&ú(„nÖG! Ÿ£PB ÓÛoDhü]Iæ.a¡ëãç¯Ôå/Gƒæ!e{L7ÑË4-A% ­Få£yÔ -i(åØì‚€cÅ$¸PÏå‘(˜Ë¤o„*Yˆ* ûù½vcC‚Gcõ0\–E&¡ˆ•ÑÓH€#^×æyø7¬0-Â(™ÜãÝì&÷+ÿ¯ãò‡ºùG§±oºkd.rç` ‘"ÂoÛ³ub¢ÿå—ha’$Ë¿LKa5—ç¢q!ÌÅM?b<ÕÆK·Tëdz‚1ÅBÅ`æRBõ1 þ<8¯È"Öƒ“E¤!ÑÒyý‚Öƒ;ø«‚Ù/(‹‰Ô¬âH„Š~Ë°ús%!±¥©&žAÛíô¬Gøþf¯VØÏj¸%žw3˜ØmÉŽ| …Õ`’à'!þ¤ÂûïZBAíì …à´É³| oØN–âo6Ôð”ª5MB/|ÑÍ¥->ÏÐ i_Q È:ã„¿‚Ã\3«26¦ð+\nÏ4œ±MCð¥óPþžž¯Î}c!„½™ýí_Ðœ^dbpµäÂ7 P¬0XEjÀGšêºH]¬H˜k ú‡Z+Üendstream +xÚ¥ZÝsÛ8Ï_á·Ufj­ø¥Çn›ö²½íöœtnvv÷A¶e[YÊZrr¹¿þ¤%YNæî¦Ó’AºbÁ1KM©LÏ’L‡&f¶Ú_E³-Œ}¾Ì3wLó>×O÷W?~RÉ, ³XƳûMo­4ŒÒTÌî׿þöþÛýÍâz.MÄáõÜÄQðÓí×Dɨùðë×O·Ÿ¿/Þ_':¸¿ýõ+‘7Ÿn7_?Ü\ÏEjÌ—¼Â… Ÿnÿ~C½Ï‹÷¿üò~qýçýÏW7÷þ,ýóŠHáAþºúýÏh¶†cÿ|…*KÍì>¢Pd™œí¯´Q¡ÑJ9Juuwõ¿`oÔNÒŸ6ih¤Žgs¥Ã4†5&µ…‘­Í“…±’ÊkYŠ)-;.ÔòñqwÅ|µ+Vó‡öa|l›0±˜õ×>“ÀsMˆ z"ˆ$ +“,ÉðÏ]Qƒîe®EÛ¢.yWÖ[ ª(èv /w·Ÿ["nšªjž‰†r¢~ÿö‘.ö¦¿à_Ç¢íx­fÀß«#ñùßM]¼Ã!X• :fó8 +ÁˆÀŒ…3c¤•š¤ÊLðåî vtðG©|KĦ¦Ös}üz÷åæ7b\,x°¡v]tÅa_Ö —7·l©÷P¼ÐP»kŽÕšˆK^ùØku뱋‘V}¡=R4<Ë=í¤Ìé *­ÜÖ )iÍ€•½òà3?}ÄAÝtDõâbÁK.›nG½ç’zq×ë©9vL%(9¤ÞýŽwX›üXñ. +œkdñÎ(#)á¸xÊ—Â1 lR‡™V)ó„g~ÏΕD:Ô—üôä=®W<ÐqY;:¼Ì»ÕãüPlE»;s@ø ._ÀsMH08¬1¡HpEÁ,LR¢ )€AºË 5  ¢î±ƒ~B|ÇÖú ï?|£ÚŽ}ÿÈpÀC Ú·›¼¬à.c!ƒO`W–F¸ŽsR"¬šý#@À²¬ÊîåZ€[ª$¶"X§Ôp’8ÚñÉ$`¥i“P¡qüßZÄh•yªBƒ¶UšÔŒaŒð„œ(ŠðlÏùaÚ9ßüOÆa)ç¨Í(TÃI¨ó5©52 ¯iÁr¬òšÈKžBî{uÈB—f¿s®há-SÛpÿ¹\4ºÊWNˆ†wÈY¦â™g‡§âÐâE­ë㊅«9ä$†ÈÕf(¤70XuTeýÐR×J­² ø€`WD­ó}A=ÞÃw’·QI ÐÉ«¶¡Þ’'€B®E°î­nÙ ZP÷dŒ8é…vç]xÒ.çmÖ<Ý¢vvùS1… ë’ô±B>™ùjU´-õ­ 2eïÂmG-:Ô¤Žƒå±#†çÒ:šŸ’UÓq&@ᶠ_ò:à îŽç]¹ÚQ—‚Œq×å=ж  “aÍCÙg?1?¡¾AUcv«ìáòyÝ>ûåkn;žhmø"‚Cöþg²×¼ÏuÁ=ꉜv}†ÜR„&Ùë{®‰ xa ¤‹ƒ­)p«LÍcWZÇÍDàitÁ@Ùy 6°9V4b:s€„ð­*1kê/Hn„bÿØy[K þ¾'úS^yÅfC¸§ûúS1ž6chÝ”Øáe¦©ç/Ñèø#¨-‡ØÂÐÉ[ É[(€Vó±ãM3¦0‡-öˈo¬ ¤!¦l‰R&Ô#ë)äÑ"93¡=×?tŽÍ¶¿MKáÒÞM;r¥æ$uª ªŠ¨åÌÐ#ˆÀQòËÔœæúma¼¤¨6p]Zèàvêr¤0a"½Þ­õL\N&:ÖÌd]¥|,V%*©Xãdê­mbÔx}x9Én¯YjêD«¡Z†wsÑ×u¦Â4I^wõÓeOwL=GG£û:Ög âkû:žó}~®Àø!•l|çµk gCàe·ßˆ¯×œªµž§!ª„¯J&FéÚ>÷níS6Å0Ø™ ÀÒ(°÷Gd¢š÷ÝPÑ0çë´>=ºÍÞæ0S„îæ!3‚m.2ȲRb3) %Ø¡${ö°8ÔÔ¨¯íñT¸H®Ê¤Íl°y¤òe¾nöyÉC˼-ÛwTæ½Ó°Ö¤s/èl«f‰ žÉG˜Üò¬fÊÍ­¼±²©Ñ¡\¯­W€Yq€žSó”Cøµê†±fCD÷˜aÖüÛ5"î‘è¤`l‹Ž(ù¡+WGÌí7¸%.‚Beó&-m·áâ®îˆoèzh!W<Ðày^D°œsp?[r"5OÂÄDX\PµÓ,~t|I© c¹2oY€0˜!%c‡e½³p^á2”ªzç™bìå*NñÉÜ\¥‚ʾrÐàa;£Î¢çñžÞŸpîóçëZ§‡dÒ†tz“¡4c .¢Î’@ç¯HŽë 1ÎW»Xÿ(çD5Y)®€>ójÞvùêÎpÇ9ö›åP¢R\x`ŒhéÛ?4à×?øþÐö؉×XgAb•Ûd(Œ“Í¡£*@LðÜúë7ÇzM߸·%-«bÏ» ‡bËÅÖj—/]™‹­,ž‹g#¿¯¼V¬7£½­Lƒ»(í#‹íß~{ÒC{Jì4uwhª·£Ÿ¤%iO»,¾¸€>å=0ºäA¶çîP®:{F A~G]AºÔò´˜M¦õ ™¦‹Ñ'NÑÿ]²=å¥íŠ=&d`ÖwçÙƒNu¨U¦fZB%åÙƒçŸ÷'L„í³u‡ÙˆFŠ±<¢¼Ie2ç |=×R¸ 䱯—؆‹./«vhÂ;|뻄­!7/.´±Ÿ îÂÚxÛ].üDš`*¿Ìú\—ƒ™ç²>ŒµÀH”pÆÀGtš¼±»çšØ~øü §£ý‡% þñMJ˜zú èVfª}¸„–`ø&éßF8eÆçDâh+À?&Y/îñG!é©·N ª $ÞXiM1”ãßÎ0à¤.¾@‡O€Þò4WÙî%KÃÌ¿NŒïc¤Ä8 +•P†™÷ù ­Î¯Å)GAh{D°yËv.ƒP2Œ´v? X¹'ÞHL¨g‚€ÀE}É’~¾A쮕X_—I&’a-mì–®L´I|v‰'Å„L(‰3w|_‡âœ7JqœŒEÇT$1ôüžHÎ:ü #ô/Œ ¿1Øý¨±†D]Tš[oC$,ÌìññâLÅrh/£×¥~üÿä3@”GÊÚOAÇ?æÅ@Í·E{*19÷¦IûAœF™h]B&Š¾r†d„ðÆTŸër\'³§WË3›O…~}sÏ5±û…ð÷5ÀýÁöC:Ù0ä…ÐÍ< +ý„B)¥š–Ø>¡qo&9½føƒ1 ¹÷ÑI0™¡Ç¡hJ/£Ã˜4”"–}4 ÈëRÀ–Hˆ‰Ç¸æF ÁB´Ó‘JXKgo@„€òhÖ‡™F~§ÞDDÐîµ xÿ .Ë#R ÜZÑg¼®7бâ Xg +íxô»=µü¯¾Ë¿Øÿú4tOûžÌõîDZàêRäé×øË7þÿžÓwÒ øXz!SRQ¦2KœP¨5£.fgç¢ÿÓÅh|endstream endobj -1284 0 obj << +1301 0 obj << /Type /Page -/Contents 1285 0 R -/Resources 1283 0 R +/Contents 1302 0 R +/Resources 1300 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R -/Annots [ 1288 0 R 1291 0 R ] +/Parent 1280 0 R +/Annots [ 1305 0 R 1308 0 R ] >> endobj -1288 0 obj << +1305 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.2005 483.6075 400.4005 495.5077] +/Rect [367.5469 435.097 428.747 446.9972] /Subtype /Link /A << /S /GoTo /D (zone_statement_grammar) >> >> endobj -1291 0 obj << +1308 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [455.0966 291.3684 511.2325 303.428] +/Rect [483.4431 226.9165 539.579 238.9762] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1286 0 obj << -/D [1284 0 R /XYZ 56.6929 794.5015 null] ->> endobj -354 0 obj << -/D [1284 0 R /XYZ 56.6929 712.783 null] ->> endobj -1287 0 obj << -/D [1284 0 R /XYZ 56.6929 687.8416 null] +1303 0 obj << +/D [1301 0 R /XYZ 85.0394 794.5015 null] >> endobj 358 0 obj << -/D [1284 0 R /XYZ 56.6929 470.2923 null] +/D [1301 0 R /XYZ 85.0394 671.5763 null] >> endobj -1289 0 obj << -/D [1284 0 R /XYZ 56.6929 447.8217 null] +1304 0 obj << +/D [1301 0 R /XYZ 85.0394 644.6731 null] >> endobj 362 0 obj << -/D [1284 0 R /XYZ 56.6929 335.2388 null] +/D [1301 0 R /XYZ 85.0394 417.7762 null] >> endobj -1290 0 obj << -/D [1284 0 R /XYZ 56.6929 312.9276 null] +1306 0 obj << +/D [1301 0 R /XYZ 85.0394 393.3438 null] >> endobj -1283 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F63 1053 0 R /F62 1050 0 R >> -/XObject << /Im2 1039 0 R >> +366 0 obj << +/D [1301 0 R /XYZ 85.0394 274.0842 null] +>> endobj +1307 0 obj << +/D [1301 0 R /XYZ 85.0394 249.8112 null] +>> endobj +1300 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1295 0 obj << -/Length 3121 -/Filter /FlateDecode ->> -stream -xÚµZKsã6¾ûWè¹jÈà ²ršd<‰SOÖñž’h‰¶X#‘Ž(ãÝÚÿ¾Ýh"(JždjÇU#°Ñ~|xðƒ?>+tÎd©f¶T¹f\Ï› 6{„ºï/¸çÉS6äúöîâë÷ÒÎʼ4ÂÌî}9+ ->»[þ:ÿ?ß]Ý^fB³¹É/3mØüÛë›wD)éç»7ﯿÿ×íÛK«æw×nˆ|{õþêöê滫ˌšC{á{8Ñàýõ?®¨ôýíÛŸ~z{{ùûÝWwq.Ãùr&q"\üú;›-aÚ?^°\–…ž=ÃËyYŠÙæBi™k%e ¬/~¹øgìpPëšNéOé"×B™Y¦A¶,§µÌr¦Ak™• SÁMÔ²àSZ\¨åj½îž³?öõö%ëÚñ¤¹Ö¹Z̆=¹&¸©2cR ~yªÍoŒ‰º‡ÅüyÕ,VT\w‹jE;¯–Ëí%/æußÆEÕR¡Z,꧕;ǵlÚjûB”w7¿P0Ë~×tm¦rÌïVïiS} 6¾Ÿ§®ÏP zÚ0XÎóRÃ4Qê¾¹_×o °¢3“ -Ú¶ý®j¾ë\’Ž©ˆŠnp(ü}»ß¦½äó]½m«uöP-šö1ЄÀ¿ßQaÙôƒ>w«z“vXÿé{s`©äa´õ®­û7T|nv«À¶†AûjÛ¬_ˆð±ížc+ -NÀÖ­k´{êé3Y°%Ù#ÊUæ–³S–82+rÅ-4CîM…’qÍúŽJ÷5ýöÑ –DhÐL¸tr‹ÁÏ´ÜwüoÐÉÄàBæVxXä]½©ÛªNpß¿Š† ÅEÕ{iœ=Áo÷©Þn›¥33øµX~2µ²+&B{v*•&ºä£ñLà-ÞÚWr‹É¹dâór  %¥ÏM)ÄEqÆGûu9 -tf's"·pû3ÅÕßO.âï%iKVŸ÷Ö!×io\&6•ZòJ£Šó2D® !äh‡+1<%R¤.+bj8R RG©k]jquþ ‰cw6¸+¢>À˜MÑ9 -V§;\0lÐgà³cÆæô¹Ùd$É—î„£9H+¿{=c®3æ¸æ°ZV»ã ‚¡åùÑ#×Äðé¾öDR‰tüÆ8BÆ÷±©1v»»‘É­ûýýƽ@ùÝK[mš1Ði Pi’àR7U¿«}‚z?î‚9@z…#R€z0SúÐä;—µƒ @9 äè±Á€ìf‰”P¾év5Qw«jÃQÐ=BÕ}EÁÐÐI “aå; …¹Pœ*¤£¯|«ëŸ§N v˜yÓöhϮ·½¾>²Á!1Y¥g:ÕÒ¸3ªÜ>ú£‡ÛÕDþlØàØjŽûuVS/𠌤±¹<’Æ°¼…M¤9²ÜÈõš °!“=g(YË#»ªYŸö]¯°ôÎúîë´ïF®±ïf Îsµ]¢¡Œ•ÁSSœ$rMH’(ƒéœ‹á´ŽÝØÈèÆP n ŃãGtcø ß‘7†òÁñù1>5h¶®>y-A¾BðÔ_gãrù&ZÐé1|“âÜ‚ªˆE¨ C L'¹uÑÁÕ ò‚D—q0²â@a°Ãe\$ÿ… Z[ô&,þw -ûÀ–¾,vxCÝ¢@5짼°)€Øz±}4wµt=â1Üšq¡S×Ó§ £ 7.8©‚””§z =m°d’•ó»ËRÌ;â©Ûê~íùâÐÊ =¿!æpœ7¡§öOZÈN7•yÞd^µ°a šýæ¤jeÜ.e`#d¿/t#ÙüSµÞÓ•ÇþôiUµ¢s ÐÆ -û×–Øâa`–i¢_‘£Fݦ7Õ+(/X åÞ÷{Ðç },º=^ãî:@÷u€`¨#ŠZŽâgàÊîªË ûçS××HÓ=0÷S£ÑÖ/ƒ¿ã4NÀcJ„+°.¬”tí`¹†ðw·«ûÓà@–%¸k¡Ý9“tZ~DþlØà8÷û9à@`-9xë°óã›øÀõŠ JA-“2•!‚ƒM7TùkPA¬¯œÑ ¹NC…Èuˆ¦ŸLÖ¿´`¾=eªt×Çr¡ÊWdˆ\B¤»> Ét*…¿·Ú_tRù¹rDƒ·Ë1&Ñ&_{EBÁ_óèy¿é: ¸…4Ø„®L±õü-üó|§úÅ#·´íü@èB²ãoB¨¶¹§MÖÕ}½î‘JßԷ߇‘seQΔsˆN¢8Rà¼÷s1^6d›êÊÏu4)kè Çñ/ë'¿û„ äÏHÙøp4 ú¸ø  -7øtµî uØ—=0FÛß6lz›ÇÖ›ùòð¶ÀGƒnS‡Q¶mŒJ|mðxfÃË$²Â¼rþ1ä:ã ëà Îpêíñ–·Ì…(Θ&†O7¼îU¦ã'HY P=RVÂ2Ò#RÆ´7üõëS»s$¸‡ Äâgçû:x…«\y®áAåÄ•˜Ö¹Á\C8&ŠtG?‰m T:ŽÓ!W™¼äe07(9˜ ¿éKYÒK Yž|É!aÏ/‘O¿ä(-çSo9#ÄGHexË¡˜T&o9NKƒw'˜Ò·~ªõÁv’[nÿŠúJØ¿è ¯ü?<ÞЈƒ -þÌâÄ‹9<ß‘“÷×,¾øâ×t‡§†ÊÒÍ4D`öø¥ B¡õ$вÈu!ì„èÿ¤â/ -endstream +1312 0 obj << +/Length 3041 +/Filter /FlateDecode +>> +stream +xÚÕZKsã6¾ûWè¹j„à ¢æ4Éx§6NÖã=%9Ðm³F"QÇ»µÿ}»Ñ_¢d§&[µ›©ŠÁf£Ñh|ý%fþ‰™±ÌzégÎkf¸0³åæŒÏîáÝwg"ò,Ó¢ÏõÍÍÙ×”›yæ­´³›»ž¬Œñ,³›Õ/sË$; |þíOW.¿ûÇõ»s§ç7—?]/¤áó—» Ñw×ï~üñÝõùBdFÌ¿ýþÝÏ7×ôÊFß\^½'Š§?G„^_|¸¸¾¸úöâü·›Î.nÚ½ô÷+¸Âü~öËo|¶‚mÿpÆ™ò™™=ÁgÂ{9Ûœi£˜ÑJ%ÊúìãÙß[½·aê”ý´Ì˜UÖÍ@7¦¸¯YVeÁŠÙô²C0«­>.‹æq‡iÆPÔ"Ìxof ë3ÝáJ5‚yc$žnæ˜t1NÜÒé^¡}§gÆjŒ‚3£¤ÙÈñÓùŠù ü_ÎN#³ÌÃI€b‚eJâʳßg‚qí½"žÞ8l´3@ |}¹‘³÷5lgÖßQ”»è [²ª‡W!‹V°|\Ö…óõº>fþ´ø}_lŒ|þ¼XæËs<´_+{b2q¿etÙ¼"!ô°oŠv5ým‹ey÷LùrY4Íak…, CÅÆÖÓÖ3™ùlÖÛ—AÁ[^±èÀüe0]HϲÌAèšY¡³éø"”: ØGi!(&âKË•Ž‹ŽêyQWc ‰Híú’Öo¹&F;X.†|Ä£ü•sYàªlþôP.h¸®—ù‡nž¯VÛs‘Íá¤ã2¯h€xÜѸ\«²Ê·ÏDyõ‘DÀ.›]YW DCÅíüæ¡Œ’6ù§$´Œrëfæó¹Yæ%o&ÏmÊÛuñä@ܼƒ5JÃܪÙåÕ2Ñ‹J{²1 ÑÐ%.…`ïð·¬vçb^l«|½¸Ë—eußÒ‹-ÿí~GƒUÙôdÔ7CÅ;’6À“æ2hžVÀ8_WEó††Oåî¡Æð¡*Уòm¹~&§ª~jg‘oÁ (X… +“vOõöÓW =ŒÅ@×Ç#ê…ÝÉ#HÁ@£…‹qb“£fBô¦¦ÑmA›P+"”¡‚Þ‡j)P ÿl2±8Ä:'yb‚cÞ›¢Ú¡ñ¤ˆ+èº0\æMÔ' +þÖŸ‹í¶\ Áãmœ…X%-T?À$]%žçkì朵cÕ Mogqy´Ž€èÙôÍ«â.߯#_?„aÁ‡-ô xíûch$º˜buLsŸýÚæ %¾PÅæ׿°00‡k£ÿú /ùD`„Ãu²¿²ø/çýþqýŸg~í8sÐZœÎü-×8n±ÆÉ_s&uoÖdîL `¢ “ + 4Paú•)~âð¡nv‘šSdˆ¨6ÂB) +3H¼/vñmÕ<Û8ï.Ì«7ôƒ°YlˆŒÂ@wƒ¡6` +O™*b@wN qkÄqêÈ fÁvØVFRhÅASÄ(XMh!ì• ”ÙËý¶)§Ã½àx?ZŽ\ Gå]»n¨SÀB°òö©l&óx¿2ÎÚbbi}€áê5Kã@Í÷Õ=øpY(c êp­‡UW·o`0`÷ZX ~Õ¦ê ðÒš0(ÃdÛb H!W*á9Ë’+( ¦7å\û‹á–ѸÖ÷ŒÞ +aù6m"õWnø”ñŒ3•¤‡jª¬æ-ÌòŠžÑO¦å¥ôéÜ`A“ÊXLh¡! +J9Ä0*~0S”3é¥z!õ¸N„¢Ä5Š¦Zè›…—Ùi-Z® 5ñÈBÔumz [îÚzš…ÔŠðÃVÞR+ïîËÏ‘ÚP„ä.á+JR@N¡HzK5¼¤š ^j.ªÕ2fœ¶Ã#ûÓ…Å©5Yõ|P“½™@§„vÂ6Fçµd™k})¯VS`÷hXGlOIãÌk›ü(\•…Öî4\û\ÇáÚr‰Áæ»Óæ´-ׄæY1nÌH…aæ´mӌÔ9aØeN|h3§¥z ÿbçK#b {úI]·Š3Ãûû‡D(㫦ØBoƒWˆ€ekÍtZE›kÕã ¤¿*¡ñL»Am(¢›¸˜Lr,bœ¹üX¾†ÊW/Fë¥Z”²R(JçN'P(&„âòµ Jí“KSµcÆù¨‰ +¡+wIçx¯v,éè@!;L$œu2鵬$~4:™^‡þHKñ‚¿ö¸Nøk⚀ØTrÑàd"Ó§uh¹&”»ŽyïÝP‹¡ËÊ6¹(Ù&¤Ž’ ¾ É%¼‹÷\H»«tÉ]±´Õ<äd¤BSŽòI¨AâÄ |JÔ1œ^›OFš|i¯ŸNZ‚ãZ¯Íi8ô¹ŽÃ¡åêà°\å»Ãž»X¥ÿÉÕ[®‰åÕèjÉgÎ ×UÝ…'äü»‘ÚÆîðb72…3b³¿Ý„Ë%¿®òM¹$ºñ*m2Õ xM‰ÔMÞìŠ8Æë®&V 7 `!ÂÈcp€ª–BS„<¯ŠP4¥[Ƚ²Ç%9ì’Q}|Uï +¢îò]˘®ÞI„W·9CK·A‡‡(€ nyq«Ž¾Š³.ބƸÐápò²jÏá] {Mqˆ•Ì0‡©E‚½\¦Ãgz¹½×+×}Ô$þEÂjäÔË]™\É15ÖF*Ét‚úÂÛr½ ƒT:\ôœ¾„ Gvy¹>á»/5„Áw{\'|7q}wê<åÛe|4N`~T§i¹&4Q£;Y—õ·uèÆVµn ÃäÆ0ìÜZ7†òÕ¹1Œ;7ƇàÆ0èùToÚ:ÿýÕCÓ“ÉQøžÇ§@ßnÈá™ ¾“eðò¡Ž¬‘' ªé”p!:„7½¼Úɯ?è¬i!QêTËÿ ŠBÎc †ÿžª}sÐìÆ9oH|²)*T@G•¥HÄ*ª£yx{GŸ€â]tžeBš¡qÒö)ÈhHÆeN:##å±Ø‚¤ ,ïýüæÜËyMÿa&:úšÊ@Cµj¬êrø#›Äõ‚ +ZrÆõCÚÊ`S÷íýRy&ÁO— =¦ãUBbêâèg»hž+nC9jØï~¸t'h™5v{–eÐö5ˆ¿,p&~À¥ñSˆ¿›·‘ˆZ{-èLú‚eæͦ®C@â’_™DÙAamæïà¿ÈWGŠ¥¿xÕ6œ@ýža2ë.×) +ü*¥®Ê[Jl0eßë©ôL²Ýü6ý¶¢åÁ ™ùù÷PÛt1If]øÎÛ¸u³I·)4~*Z,9K×;U<ÆžBQ¼Åº› +Áà±s:€ÐŠ6uBh_V(u LŒšÞ*µºå}ñ½ê~5c@½)Ò*ÛªEüÅýT››n* ß¿M·ßŽ¿øWvÝOµ£Önºêwt $*…–4úÐy9 "Å¡êÿ6=Žendstream endobj -1294 0 obj << +1311 0 obj << /Type /Page -/Contents 1295 0 R -/Resources 1293 0 R +/Contents 1312 0 R +/Resources 1310 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R -/Annots [ 1297 0 R 1298 0 R ] +/Parent 1280 0 R +/Annots [ 1314 0 R 1315 0 R ] >> endobj -1297 0 obj << +1314 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [213.0783 309.0057 261.825 319.7901] +/Rect [184.7318 238.2538 233.4785 249.0382] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1298 0 obj << +1315 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.1622 184.6228 446.9089 196.6825] +/Rect [369.8158 116.018 418.5625 128.0776] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1296 0 obj << -/D [1294 0 R /XYZ 85.0394 794.5015 null] +1313 0 obj << +/D [1311 0 R /XYZ 56.6929 794.5015 null] >> endobj -1293 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F63 1053 0 R /F62 1050 0 R /F48 940 0 R >> -/XObject << /Im2 1039 0 R >> +1310 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F63 1063 0 R /F62 1060 0 R /F21 710 0 R /F48 950 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1302 0 obj << -/Length 2626 +1319 0 obj << +/Length 2727 /Filter /FlateDecode >> stream -xÚ­]sÛ6òÝ¿B÷tòMˆà“É“›Ø=w7q}ssÓö–èHc‰tDÙ®çæþûíbIQŽ3éøAàb±X,öV jâR‘º˜d…N*7™­ää3Ìýx¤' HI뇫£×g&›¢Hu:¹ºéÐÊ…Ìs5¹šÿ6M…Ç@ANßýrqvþã¿.OŽ3;½:ÿåâ8ÑNNÏÎ>¥Ñ—'>œ\'*wjúîŸ'¯N/i*e?œ_¼'HA?ˆ^žž^ž^¼;=þãꧣӫx–îy•4x/G¿ý!'s8öOGR˜"w“GøB…ž¬¬3ÂYcduôëѧH°3ë—ŽÉϺ\8mÓIb¬Èaÿq)+‘)H™+Dj´‰RÖjLÊ ¥|½*g·‹fU Ï«¤NÁÖ]¢{[G¬‘½Mgo%Sa 7Øü×»j¶ü]J]µÇ‰ÑzZÒÏjÙniÔÜðÄ|¾9Vù´jÛ€»]”Û0ªhÐV›‡jCãÇåjE£ºa¼r6«îxüå¾Ú,©O»YóžLá¾õdÍtÛ€9hVU`„6I4ÜM‘Z†…sÚŸ 7x:VJMA’ÓOaGT³ÝŽøÀ½p88(‚è$8ò'ÁÁ5c3ê]SÏ«9Ójx¿«#Í«›ò~Å+—-òüúÌæÛ1&6“Ü)²^7uEX½;ÔF¨ù„$£«a‰ÉÁjó õµ­V&Z²J…û”RNÏëmµ¹)gU;²‰qf §)-¥CjºÜ-‚o}=§‰»f³miH³Û°,hŽYŽ~qû Qð£s-€¶.ŸìÅ €6ê+o~ß.ëÏaójD"V¡œS,4TìªNšzääIÄíéQs·]6õ˜´M*réò¶F¤¹eÄmyëõÞ(ýÒ%Ú‹‘^¢¯`èI™1Imº (“Ÿ¹f¨º ¶CGbø°\å“4ÍÁôí‹\§EžçãŽ3‰“.Iïtzü Î)“éngds]ng‹=&ÒÒýuLŠ_cÒ9!-ÜzIï¿n‚ h Ù^Rt&(;ŽH1ø¢kºâ&½ë/&tª]_çzÆæD`œH|ç·¼[š§0*^bBZäY0Ûm¹­ÖU½ "ô¤ÅÇ>Ãp‚àêÏr \¼1¤$‡TM™ùÖv’ÜæéljTd"K_ÿ{Oܹ¿ÁJ’Ž”6¶Gío -|³–ÉÁ×k•öhïûgéFjHOù …ªêòz…È «ër͠舊|!Œo þVrÓ0J¤pþ‘fúJ†KH¨ YÁá`”6a˜L ¤¬ФÅ6øò¡X×ål±¬ù–—5kmÅš ² †QÒl–ö¨šû¨›E3Í ûÍzØ·¨h½ñbzFœŽ›ú†™2,;ÿø`ƒx‚ ¡Ã&©Y†¥@WůFƒ&`ÈÔî6yHGŒY­2™"°`Yú¦ðŽ ˜È!Ä‹ãæ‰^Vö½ž :1r ËG‡ßÇÅòXM½»ëÒŠR…U,UÛ‘*@QÕ½`2Ðä,˃ª)öÀ³fM¹óK7ulÁí1@ðé@«HÂÿ^Tc¡{€ÅÞ ¬Ÿ‚í›~W_½xe6HŠd>-y"fD½3Èî¤-žÏTÆ É$Ixþîp)&]’ûáXe…ÈÀìv>˜3h%…VFýuLFŠ_ap„–ªè3y(gp¢ÈÒ&’‡íÞN?§„€hz±éAVœõLÝ‹JÙP;‚!€bÌ›ŠUƒ"€®1µŠ–Ü•ˆ¯\\¥…°«Û®+n›Ù­w¼&g«7^z3„Z¢MÓgßãÖU“M—L‹Y„ ŠˆY&vÃ.˜\sW£d„ðÙ>¸Ö4^”L§ª›ûÏÌ×ÉÇsƼ¿óÞ´dTç‚ ¤ñ!r9ý]:­lÎö‰0WJh)Õ›ùuþæÍk£ßŽïð’jÂH« #¹@ UŠ: -P¯–#Ö‚é)B¼æ!¸ ÛÌ m &ÑÍ>.· F ¦X‘ž_£Y¯çè8ÑÄN âjD Ä£*‹OÖk4Bˆ7 xC$ò,8¹dˆ¡PÓ¯ÎÜÑb´¯?iªw3Ú—D[öst*ÞÇ ¡d¾8òÙP5‹^]׎b³£«ãBO›Ð*¸­ž)Hbá4Vø[ Éï!?‚Mܯ¦¿ ;¡ß ¿>ŒYu°„ˤ{¹HµÎ÷ªEŽÌî•t64=m§éiU§ø YÚ]ChWÆ(–¥²´j+ÁÔ}½âT}˜4* ² y`2vHlÓÂÙnYŠŒvâ€Oö¬JkúVó¸ þ•ñÀw$µ§ eýÐÜz'é\Ž70ROêT˜<–?…Ud·lFÚ½8…›n÷91±Õf:­6Í­¶ÐˆÀ‘wKðÛ0F–±Wò‡Ù• ø áÉË;­þž±qc¬7,G;ð)wà?ù· -»ìùN<ê¶ vj:vŠ}bL›ë¿oiâ¶n¸¡áî ÷–éjÛ– “9ŸkšØŠ`d—4òʱ òÑŽvÈ +ŒŽ6ç)%ms¿™½o$½ŸËô©R®mLêú‚3äýaÀ—8Ô|@E#´÷>û‚I®ëAwS—Q€G„ÝÛbûr±7À8Ÿ5äõCïq–“°x—£íkÈÞsËfÜ%…>…ì=Kø+µ:k…ÌÍ~? ‹OO¹êx†}JP‘[çãc¬a=p†‘­;Ü,Û[‚ „4”Óïw=)DÝõr»%×IâÂÉ~€G4ß~L‡­Bà.cN^¦PÙGGw~qòþýå°qçÚ€à³Lè,UßÝ7ˆ“Åý`›[¡ÁïÆ}}rñŸ±¦Ë·éN¤Š´“@ ºUÏ4ãÇžÐøî=òž,'A'¿ûy}÷¿6Cï¯Ç¦u–ƒþf -ãìçؘ1©aýÿˆdM3endstream +xÚ­]sÛ6òÝ¿B÷tòL„@É“›³sî4iâúæÚ>Ði,“Ž(ÛõÝÜ¿]ì")Êq§=\,‹Å~Sj"á§&Î +©½™Þ+•Ìoää ̽?RŒ3‹H³.Ö—G¯Ït1ñÂçY>¹¼îÐrB:§&—‹_§ïþyòéòôâx–Y9ÍÅñÌærúÃùÇÄÓãÝÏÏÎßÿëâä¸0ÓËóŸ?øâôìôâôã»Óã™rVÁúŒ)XpvþÓ)Þ_œ|øprqüûåG§—é,Ýó*©ñ _~ý]Npì¤ÐÞÙÉ#¼H¡¼Ï&·GÆjaÖ²>úåès"Ø™ KÇäg¬63ùdf3ád6.d)¤¡Í +£DîýNÈ™rÄB!—ëuó8Ûnʺ½®6Ã3+ãE–¹I—ðÞöid{ÝÙ^Y#2éuÿ_îªùê7)³ª=ž™ÌN—«ù’†Ë¦Ýh>-7ÇÊM+‚ž«½lz¼Z=0ÖššGñtLë: 6·<¹d¬¶Ú<€@)Ša Þi4Û†FW=Û$œV5=‘é}U¦…2:cÂAû»’/”b¤v[n«ÛªÞ¾ÊF¥øp8/[äÇÈéjKµY-ðÊžá¦p"³.J¬¹Û®šºGíˆ/® UDñ©ˆÏË æ­•œž_“×Í–!¾"H¸r,ªëò~Íx«–gz´S  ‚¢Š=‡Áf™;dXéçm·‹uØvýj]Îo–ͺÚ3Û 5ò;G¤‘{f«p&lÝ3[eÓ’ëU»¥QsÍ‹™fÛFÜí²ÜÆQE6¾0~\¡\qî0™Ï«;½¯6«HjgËaO¦pß²:ܘƒfýPEvƒîep6Ÿ›¾åâOÇJ©)«Ôç¸#ÞõnGV¥–•ipPÑIzÚxÅØŒz×Ô‹`ÜA­x¿ËCúlMÇÀL! 6†ú°ÉcÈ"¤1÷6Ó"¤+ ÐèLh©L@Ũ©ra!ˆJ ¶Uo«Íu9¯Ú‘Md§7¼”áÑ£¤Eð¢¯4q×l¶- I#pv—EÀ1Ë1,n#4)¾t®Ðȧ8ˆ}O +÷íªþ7s_F[BoDBCÅ®êYSœ|–p{zDo4˜à}i£…Ó:bnË› øbMOÚ¤Dƒ16ˆ4Î/"©MÏ7*×yŒf º ¶C7E¡•›ä2…/õ‚œ'Þ97žñÌÅY—dp:=þ´q¢È@­EÊ-Ĥ!“d2×ß‘ÉHñ[L:0·Þc2xÀC&h’ ά/ÈFð’’ûƒ1»?‘bð=×tÃs(lfJÈ<è\ÏØb‹æêiÿ:.‹$á0ÄÍ!µ¤)Y7d>kwÈVbô…à®ÁLЇ(ˆ2:+Âi>€ó[Ý­GÍS +ù—˜$ÎEʶRºËŽ´øØgN\ýQÞ¯F iæ ‡‡ùvv@…äô¿ô€R½¥·ÿ½M'î¤=ƒ•$=AngzÔþ¦À7ka˜¼½Vyöˆ†ˆïˆE¾Èv«º¼Z£ +ÍšÀº¼ePòÃE¶Æ— +p©¹n%Q8ÿD3}Ã%$ÔÂs4¥MGFæ)ë4i±‰®|(ÕÛr¾\Õ|É!ÃE¥­X1AtÑ.ÊCŠÍÂh)‰r—qŽèiÚçÍŸVÓÈÀ3Ékº˜žMEŸã¦>dƒq&e°çŸLOô tØY.»È|ß2/ÇS~.ÉìvöØæ"‡ä²Wp™ÁUú‚l›NAtýÄÀe,KºNOGJ‰©†á£Ã +œc5 Þ®K+Ik ’ªéH ¨êA0hrQ¸¡ž7·”Z€0¿v3ǼNtx Ÿú¾/«±È=Ð=veýMÜò»”ƒxe1ȉ¤›–<‘¢ÞÎE°ñϧ ™„B¢­‘àõ+þR0Žg]Šû±Ø²Ð~·ñÁ„!ÓNXë¿'‘â·˜4JXãtŸÉC ƒ…2=w,nò¯Ý»é'” V/649”â&Šê4Q˜»pãÁ¸UÄëXêà†“…vEÁ&ÚÏGöJˆWÝÎÆÖ¢uª-N“—p¼Ùkŵ+ZÉ„I1:¹+ÈÁb†ï;Õ=g¡ò®£ »‡ëÜ/j^^HøBh£ÈO7ûïüç눴ð¹R"“R½Y\¹7o^ëìíøª‰ÂwÊ -m*'´äbTN (é(@ƒZŒ»Áü!Aó\Ѐm 憶“èiWÛ%#s¬ÈHϯÑlÐstœhb§† q5bÄ#”û,>åMÐh„o8ð†HäYprÅE ¦gÎÜÑb´¯?hªw3Ú—$[st*Þ'¡d¾8 + QõM׎b³£ËcŸM›Ø*¸©ž©HRå4V„[Ùï!?‚MÜoæ¿ ;¡BC3ê` WHûr‘ã×°aY£È‘™½šÎĦ§é4=êT$K%Y¦:F±,M’¥Qƒt ¦îë5çêüQáR÷x6vÒ[Ó­K‘ÑNùž‘@ bM_©SÓ(Þ ß©Ð9,ƾó‘Y[tv¦PøÐÜ×jÆ{Û'Ÿ¡ ÿì¡ Ï¥î7Ð0¼—1ö¡ð+Tá^Ä~l±ÆÅ®«0ö€  q¦¤e19& ìÊ]œHÈ3œPÒeýHÀßÆÚÐ26ûm·ÙŸs³ÿsø B±xWì=ßôG3ÒÑ%èŽKÐV…$½þû–&njü¸Öý}ÍŸØpMI¯PG·\¦è†´V§¶# ³¸¤¡ì¡víh3Þƒºdɼ¥YÛÜoæcŸRf ½_Øô¾‡å\IéÜög(ÐÀ€/p¨Ñ0 +|0hïC¢“ÜC…ÏmA¹"ì>ƒ!vh- vCâ§ÎšLls"Î*rïÒÁ±?> endobj -1303 0 obj << -/D [1301 0 R /XYZ 56.6929 794.5015 null] +1320 0 obj << +/D [1318 0 R /XYZ 85.0394 794.5015 null] >> endobj -366 0 obj << -/D [1301 0 R /XYZ 56.6929 725.2846 null] +370 0 obj << +/D [1318 0 R /XYZ 85.0394 658.768 null] >> endobj -1304 0 obj << -/D [1301 0 R /XYZ 56.6929 700.2184 null] +1321 0 obj << +/D [1318 0 R /XYZ 85.0394 636.4568 null] >> endobj -370 0 obj << -/D [1301 0 R /XYZ 56.6929 148.5316 null] +374 0 obj << +/D [1318 0 R /XYZ 85.0394 119.9909 null] >> endobj -1305 0 obj << -/D [1301 0 R /XYZ 56.6929 118.3446 null] +1322 0 obj << +/D [1318 0 R /XYZ 85.0394 92.5589 null] >> endobj -1300 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F41 925 0 R >> +1317 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1308 0 obj << -/Length 2999 +1326 0 obj << +/Length 3170 /Filter /FlateDecode >> stream -xÚ­ZÝsÛ¸÷_¡·Òˆ‡Olžr‰“úæ.ISg¦3w÷@I”͉D2"e'íôï.vA‘2e;I'3!´X,‹ýø°œ ø'gÎÆBgf–f&¶BÚÙr{&f×Ð÷æL2Ï<0͇\?_ýôZ§³,Ε̮ÖY.ÎÉÙÕê÷èåß_¼¿ºøp>WVDI|>·‰ˆ~¾|ûŠ(}^¾{ûúòÍÇ/ÎS]]¾{Kä¯/>\¼}yq>—ÎJ¯X‰¯/½ Ö›/~ûíŇó?¯~9»¸ê×2\¯òùì÷?ÅlËþåLÄ:svv?D,³LͶgÆêØ­esöϳô½~è”ý¬v±u*0 ÒS´YœhèB^®q À)œÐo\Ò‘£©wó ¥)§™fž²"E,²$c–¿NÈHaQ©d†z¦ÍÊ‚oÕÛ²ëŠÕ³ó¹–2Ê©s—W«zK ͹ŒP7ÿ£ÚoKXïÎ¥‹l<±˜/ëê!Ôõž~¯ˆ ä^ãù›rù‰º]´oXVÅ„»r³!Ò¢À…ÍæÆÅ™¶Él.eœY«üšöm°¦å¥Q‘/oˆôy_쾞KXxlttuÃ*4¼¬”ôúCXÑÂr¨`u7yG”¶)–%®*ÌVV¥˜Ø•ÚX»Ä°áAÉù­™ïWÍ'n'6ʉØhvõY‡íº|k‚n©7Ðý ð¼Ôêá|ɜͦDì²c³=  -ØY(cUÑJ¢* ©¢•Šê¦+ëªEÿÑYT|Ynö«²º¦N4Œã ÜqdFìD3î 3ZKg‚ƒç·u¹zÌ™€Ð2ÁòÓÖ‹ˆ$KÇb{{ATeJÛ`0ù¸Á ʤR!Êz«`£Àuwåm± ÞH3ñ¸¹Ìbi!ãprQ¹*Öù~Óµô«^ÓwÚPÎÄ©•!νÛÏÛz¿[ê&W„{Ð@ ¶©™všJ3rh26雓þFƒÌp’¹22Ö‰²cŒ´Ÿ'd¬V»¢õ–ŸIS)H‹sX…]ê3ß,ø÷ #dÖ™ÊbçÒlb”³4M†ƒžÓîÈTÇ/P“–¸¯žÑ±IÏcNigÒÎœÐδ;2?ØOÆÊ(-¡,ºì¡Êc¥“ß”˜ÀI%dÂ[T¬dš“ÏÓeúlël´¯éáÙT’K†IµÊ·ÅjB¸Ö±ÓIðo.# ~yS,?a3‰Ê5‘|ŽÂFÝ»¼ó¹ ûÛ¯mWl©‹ªZÍÉŒ Hà89Ü–+Ÿá´ÅZ¨µ £®wùvK)úʪ+ ¢îÖ9z6Rºš¾$Ý®„îâ6tÞpë=Û¿ð$œx,äWF¿(UC£hnŠ-Ôk(ì¢øÝððË kx=Û=ÖJ¯xåW(Æ*³¾ -€šßª˜oór“/6ÅÔ6e¡ibߦT93Þ&˜܇æ Íʲޅ,ZWT`°¿ß$`é ‚¾à<ÇÝK£¤ìîʶÀtìDT2ÏÄ|%¹*¬ÂQ “-QßUã¼<•ÒÄ8•Ý /Ÿ/þCDØ”Po©•X«ísjÿ÷ùxGätx}‡Ì£­ã´ñ¶î _nH¢mþ ýJ¤à(´ø˱k -w(îÐ^0­Ý¯‘ãxYUEÏÓ7T ®Y"y*òËý®ì@Í™èuAXaHìÐÕ˜¹üwúš¢ZñÜuEßÛ|WÖ{&6ù|ʧ!& ðj_¡Œ{ô 0wè¬ lPm$Óº—õv[xl -%¤Ûå ¡sSä-÷ËD;CMÞ+d@D%™¼(‰šQ‡^0åŽæ+"­—’ø=ái6mM-N'<„G†4†IÒó F + q ßÝKKÜ÷¯Ô¹`Q]]¡Ýæ>r€FU"öyHÍ~×ÔlJ3–—=ŽF9A·6/Ý” Ì­H!+AÚ+¼¦o[o™ œ¢×˜X|É· #lh%ŽpüÇ·—ÿÂWœ#[úÁ¨ZUÝQâ¹¾›Ä¼ÖÞØY%’t´öŠ ŒŸ¯»©÷a&ú!ÂôÍ®¼…<ç} 2*Æ(’ ´`?—hnð â[àòµø -"=âó FÄG8‚Úʱ³³@­ìÁµäWáéžr…åc» !eöÆ9º5@¸ÚÁñ·X…›€EG]¸§H ›Oòà‚ÑùðhXÞÁ>6ŒáŽ -í«€[ŸÑ•˃’Hâ ·dÁ]õfOFrJl‰ð˪Øäð¢(Ó¢8fìB aÅ<€¨r‹KÍ+æöù¾Çùw¸R¶ξf²ãñ¢¹èBzXæ ]œXÚ|]„dtH,eu” ¥ú}ã|3̾»º-É[+€FÝdâù?Üf<éÖÇAS«o¸Óè/}ž,õé×NCÂ;¾Ö˜X!÷c˜¯Né7d?…àÝ(ÝgýM½È"8øÇ1î4cÌÕ~IÈäÔVà}†„Ä *û˜C@­z3}'\ŸïÉléYÂ)&³fúR2ýÄèì´,'@7ȱ¨Ãc=ÔQg…¤Ïû¾Ê¦x‘(^*üƒÜf€%ôHl+sr{0BFWð¿Š.Ž 2ͤLc©éu}öy&ca2ÿ-Fm¿Ôƒ <á§Ë­š½ªaA³Áš‚àùP²_T¢F‡ª4©4œ,úÇÐ~xhz|â0þ„Bß¾Ô$£HÓÊG– j EDuá\JÆ%i¬tÿš¼ÌOÇz~FÊú\ (À 8žSëã«÷ÄÉ°]]ÂÎ=®ãW/ßã ÝÝ©@uÏ3z”X ’þ°xx¹0XN@: ¢ÓeSK}uå‹•£w¤x]p<}B’¼¹CÆù•'Àb7…]ñBÝŸ¢ü­ˆGn)ž|–IGÚ‘ûÜ‹S“¥q¢q}$¤?[Åÿbb~økŽ|k±ÄMÑGìÿÊ!/à³±s'*Š†üèT–δQǖíÿ …¹ªÿ˜5@_endstream +xÚ­ZßsÛ¸~÷_¡·Ò‡ß›'_⤾é9©ëÌ´sw”DÙœH¤"RvÒNÿ÷îbŠ”)ÅI:™ ©ÅX,v¿ýZL8üc™Íd6I3Í f2_ŸñÉ´½=Ag•¦}­ŸoÏ~z£ÒIÆ2+íävÙË1Ü.~K,“ìFàÉ«w×o®Þ~¸¹8Our{õîú|* OÞ\ýí’ÞÞÞ\üúëÅÍùT8#’W½x{yCM6ŒñóÕõk’dô82èÍå›Ë›ËëW—çÜþrvyÛ­¥¿^Á.äÓÙoðÉ–ýËg*sfò?8Y&'ë3m3Z©(YýãìïÝ€½VßuÔ‚3©¬q c4³J*ïÀO»bûeÚÔ»í¼˜>X\tS½n©a6MÌ…úõ¦-ë +ü¥ÀWˠߟFkØÔóÅb[4ÍÈ°*eÚ ôÊfd¤Œ¥Ú˜ ñç1Ó×&Zö;7˜° ËJÉ.Œï&¤Og`š´÷yK’fSÌK\Uœ­¬¢J1–ÊÙ˜`äôAOw‹Í'Ç™VZõ²z·ëêýƒŽ¶¥ÞAO'´†ñÔ¨þ|vÜ&9sÙ¡ÛN˜~æR›CS”hŠ%S””Œ•%Åçùj·(«;jDÇø>ÞÁ nÄFtcÔq£‘ êVDÕ‡º\|͇Ôêü8î,p·Y:¶s$Uèý%¾î/H2!å T SŒÂ²Ûò¡XÅ`¤™B¿Öw§…ž‹b™ïVmC¿ê%=Çý8—Ó¼_ÜF̵€+Üt¤LªGÆ;Z,M‡Ád/•—â/ÔI÷'™23(àfˆ—맖ó~5 SÉLA(“Êìoûבu"3æ\šô2,KSÛïô’vG¤Ší£@Žzâ©yZ1œÄ§Y§OY§X§÷Ö¸üÑÉt@θJÓS•Ç'¾ — H{d$Z$“"͆Øóü1=Ø:“ìª:¼Ã8ÛÇÔ*_‹1†¥˜S6Æw¨"0üü¾˜ÄW›”KyˆÂ—zSlóÖC¶7_€P­©‰ŠZÀœÌŒ; ‹‡ráN,…JéØën›¯×„ˆÐVVmu»Ì1²QÒÖô¤$i·%4±ñ>¼xs eý§0I€†Ðà»Ñ/Bjx)6÷ÅÊ5ÔõIünxʯ14¼ÍK¥7¼êÈKöÐä`¯„³€ßª”òr•ÏVÅØ6e¡©5_ߦT:=Ü&˜‡æ ÍɼÞF­+ª/ØÞm¨tÁ_o^âî¥I £l˦@8v<)ƒÎÈ|%…*¬ÒQq ÷¸~¬†¸<iÔïIzy¼ø=ÂWå–Þ¬1ʼ¤÷ÿ¾îˆO¯ïó`+ø6®ëðhƒMÖùGŒ+žB Ðà/B“»}m‡÷Y5»%ªbÏË¢j¡èyùŠjÁ]‘"õ‹ùn[¶{žætrAMV˜[ µ \þ»ˆm›¢Z„¹ëŠžù¶¬wA¸É§c„œ, ª}…Ö"™í0&€¿£1õñ%ð¥ûr†ØŠòçT ½ÁKz6õ:H"£ó@òÑ…Åç|½ ̸AH~@Ø>\_ýS\ŒlèG`ðVÕ-½@>×£œ×ÁÚ»s扔•Ü¦ƒµWDaü|í}½‹3у§ßlËÀ9c€¨˜£(&Ò‚í¡¬ÀëŠ.ëüY:¯è I€¯ Â3>¿`d|Äsà ¨Œ{PI³c%ùUx¸'¬0áÔ®cJ™Ãs½öEŽ. ®¶pü-ñâhgÑRî) +è¢Æ‹¼x¥ Õ~üxÐ-oa7Ãñ±Û:O:€·¾ ‡0”DZËÀ"BS½ÚQ"Äž’Dþ²(Vy¼HBZ.(¶1‡°bîIT¹Æ¥æUÐöø ÏCüí®4xg_’ÑñpÑ¡è<ÌójxWÙäË"‚ÑXÊêRý¾¼éã…o®JŠÖ +¨Q;zùù¸ÍxÖ­ƒW%¿áN£»ôyö¨Ï¿Öp +ïðZcdÄÜÇiþˆ}}õg1x™ußvx–ÀÁŸqä ¸Óc.vsb&Ƕï3„í¾F`Uö9‡YõjüŽ»ïÉmaŽšLiv›pÿ +Âœd~0/ðÁO:›b[w% ÒìGêN(8k”>ÌO’€>wFp“DYU?†Ædzáù54ÏŠyNð +M´Ë»†›GFjM¾:‚áµ S-Å#£†6ª, ™Qz3à±ÈÏï+œõî(݇ƒL0 Þö¤ÃŸq$X4q?|ö8Ø3„CuGHײٳCTñ[‡ªôËÐ/§Ç&ßóÝ!òÃÞB ´8] +oSŒ|öµ¥Öžºˆšj­!\=}k÷¼ûË—ˆZwüÒZÙà©´9ÀL +ÄQì©5Àhp¼Ñ÷"lƒ¯©‚¥BØ œ™ËŽ|û$•é^çø‡Ï s<û“§Á^âÔìΓéÕ:2fSeúóßRFúj2]e!{„§ÌúÚwÂ'=­^‰Z]„t>Ù׃gŒdZ÷{Žú&j˜1ðŽI™†ÔÚñƒþ©eNhsÚ?}­ãþé´Fü³Û,ò¶ðwƒùÓÊàX`œ;mN§5bÏà+(@´¹ô½ŽŠ‹ƒðÏúKçÿ{ì[4€1”{«Uv|,êÇa¬ð{|Öîþ"Är–‚y}‡tx@(™Jq·¡ä #BÉï¡š±@Hèë°–`í‘ÜÂÿ2yò0&Oe:q)ãXÌ<ù4J¡³L‘Nïݯtï/øéj-'¯kXϤ·¤8î´7°_’•}ÆàXŠÇnÁ-heéž:BŠtßWà‡4´?˜Ð³«0vf +  +|Þ+1pJä •ƒs ä8vëdS&U÷4†˜Ÿ.ØA´%ËsÅýYÌàTNo^¿'ÍÀFdº> )·¯ðo.œŽ¶A¢ô-b†Fú3âþƒ…Æ*£CÝ!9Ý15ÔVW¾F9ú¼€o +çÀ³¡UGl ‘W¨˜ã"¿„ °ÆQV¼G÷‡'â [ŠÞM“N² w+x’¤ÚfLºÌM( Ä'¦°Á¿“˜îÿžè‡ÓNÖ>2n¼K×þK¨=(à×b7…þ¢cÚÁ Ê0 ÷Ãاu"üÉTÐê™þ?náÒ1endstream endobj -1307 0 obj << +1325 0 obj << /Type /Page -/Contents 1308 0 R -/Resources 1306 0 R +/Contents 1326 0 R +/Resources 1324 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R +/Parent 1323 0 R >> endobj -1309 0 obj << -/D [1307 0 R /XYZ 85.0394 794.5015 null] +1327 0 obj << +/D [1325 0 R /XYZ 56.6929 794.5015 null] >> endobj -1306 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> +1324 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1313 0 obj << -/Length 2984 -/Filter /FlateDecode ->> -stream -xÚÝZÝÛ6ß¿Âo•šå‡(‘i²ÉmqÝäwm´¶¼"KKÎvû×ß ‡”%[ò¦— ¬Fä3äü惔Ōߘé„%VÚYjc¦¹Ð³ÕîŠÏî¡ïÍ•ð<‹À´èsý¸¼úáµJg–ÙD&³å¦7—aÜ1[®‰&ÙfàÑË··¯oÞüóý‹yGË›··ó…ÔÒ辬ﲒšÊ¢i‰r†„Þ›wžã\˜’#O=‹‰ªl—ÕäûÏ„"é Oci¤Á°åš¼ò ·o—7¯ÿMô$d÷¹spˆ6ÒÆ:Ö·y•v™ªR\ÄðWoK­«úá‰(‚¤xåî9•Ð…hÍ×ßc¢7Þ‰\)P ¤èü¨7Ëq­ð‚û–¯‰#ŒÈûÎKºý0æ ¤úªvÏ5àr+ÈJ[ÔOZmóòÁ“ÎðÌ«æ¶UZáw{`åEî¹qínÔÖ³¡.¾ï±(K¢>ŠÕGç/nx…[ 3ßç~’ŠÆ³²ÝR£_¾Wõf3¶¬¬òQ­ïBõòlj?œ€<Í$Ry^¦„Dí¶6ó¾øœW¾É?³‰%ÒcVsÖ?—%áDb“¥Œ’;Àç÷8-Ô¢-Iô{‚jXý¾Xçô†û;¶TG±ØúI -½¸r™ßp{ª #§PæÕF½â_[·Vn‚J™ÐÊö7ÁñNo>TÝ<‰OU QLE ‰¶‘i$3R«®V‘ *° ò8 U¹àã4 >N·Ö¯ccV€+îVò ä Yà k9˜=8‹Û0o…Ú -¶t€ù»³h¯€ -Á é.¸ù ¶™.kYê4Ñ­óMv(=CÑœ$Ç|÷ÐúTçÕêW®yå_ˆïHãº1¬2Šlað‹élÈ¢1~&ö¸.dÃÀ…{µË~_„dŒæ]´Å._ÕYjÔP³›Ëzxž5pTëD¨¡7ÕT0îh‡ìT¿*2 -‚´‰UEçGè.ëêžNŸˆÂ¬ -[cX]õD#wEuhsßLHBê.ÈÉ÷»bA Jè*Ò!¦*ð½õ¡BHîD4H"·P©7díát`‹bwØÑËç¬<äÙ¥ñb³§Þ¬1W'/"IAYœè©{®€¤>×4’:®Q$ërIqÊ ÔP—5é¸FT¢I²Ô -3Ôåˆ&Ñ¡I Ñ$ I@£§âóÁé^߇XG­®ž²D‡,¡qÓ¡¨÷à‚w.áÁ%NÀ% ÇIù¿‚+™Â–8bëÿ-‘2-éBî´z\ ¸¦ƒT}hÏ£œÒ…—Ué¸Ft`+cqDj_™·‡Öƒ «ŸÅ±*í¦àµªð½øhå¸]´"*ÔR„)Guæí<‚éÊ2͹Ö!™h%ñ:ÄÒmÝ4¤ú\Ó긦£Õ(¤ XŽí3ªt\#º ÕaJñeŽR<@Jq>ˆW\ãÐ.^Ás$^Á@¯xÀuñŠ¶æˆ!ßãã'x¹Q~K<À–BF,˜ä¯³$œd?sÍÐ纰Àåªõ|_dåâÓ!ß?-öxás -,…ûyYÏ3"*•0« ¢(ð¡Ì>ãŽ)y<'KÕ…h~ëu±ÊJwð„>§-uuÁ -š{ã%~áéî1ÖÄ€~ã‹ 5ø°H²‹Ì ¬»;Ï›   qpµ%ðVíÞ!,–It­¶ÔÞ”ò@g 2zé}“¿“†®T°Jwœ®ì$Ò*ç‹4Ž¾ó³UyûXï?ÒË]V­‹u»eÃ6…Üå܉8!ừ:$µm@;-°@3/¬/@¤á3ðØÞ”ÍÉœV4»÷¸ÅÆ•Ÿwˆî!¥»ª€—Ædá0e¼¿7¹ØÈ‚S—O°e´áŒ:†ú¸¦)€Tä¸j!"—9Þ$´9fJ°„ïq>ÏýÕ²ƒ¸"Ž ìqí\„“ w˜M«ºZ3:Á.iex·§˜Ñúä@9Ö$Ÿ *xÄ‘)¦ÆîsM•Žëd{ ºžDaXòŒtÏ3"|Q¤bI e ýÍ#m§4‘Aó(5ŒDÃá<œOè~"4‰™Œãx HW Ì-Góãåg0?t8óCwuØäíÝ4>ÑŸß”ägqÈͧ”9ÂH)ˆ$xÛíî¡ÇÝFÂÓeMxB lZphJÑÈÝRe^ ü]öa‹_ôS¾)@¿¥‡ÿŒ -}FvPœØ­—Výõf,$ 4"¯÷p\ ǃÎ}UûRâkFîs ˜Öv×J_bZÁe20­?7ÞiRÜ“tÉ7wáz t9 w1†;ˆutK[8Y¥'žÛ]Ñ—‹Ÿ&ºP8¸%ÊšPÅÐýš^M÷cb7RÃ4lÉŸ‹iœš“ ™'Æ2‰éýb4é1M“ÀÔÿøãJ½M½ße絯Ô0N©‹tLç* ‹Îüh××¾Ä «û¥.¾®0 qçûÉJHys¸A5k¨;`~5+­ªù~,k©”‡¼z,@G˜`äB2ójqúIöÄ#˜áîË(.ª'?ߨ;hH2;øe(sðŽtˆßå8à` ãN¡ Cž"N0˜³èªOh©+?¨%ôxï1ÇbP§]™äjz®sw$­<;¹¥ãöú ÿ[®éÃßé¹@£˜žMüÖpƒ(×Ãð6i/(‡%þ´‰¦¡ÚP¹eaè¥^Ý~ L­®4ÀVkú¸ã¾âv­á [O}ë±5Ið=Ð?þBdX‹îîû![}ôº»ÏÍ Ñã&~Ò¥4ÃßX8)ï~¦ñÕ?÷:~†S¦Œ‘ãî.!&Æ&ñJártrá8ƒDŽ¨þ_r›Äÿendstream +1330 0 obj << +/Length 2839 +/Filter /FlateDecode +>> +stream +xÚÝZÝÛ6ß¿Âo•šå·ÈÇ4Ù䶸îæwm´¶¼bKŽ%goû×ß ‡’%¯ì$H€ŠÑˆÎ ‡¿ù ½bÂ៘8øòz’zÍ f²Ø^ñÉ|{s%"Ϭešõ¹~ž_ýôZ¥ϼ•v2_õd9Æ“ùò·äåß^¼_¿›Î¤á‰eÓ™±<ùùæöxz¼¼»}}óæŸï^LSÌoîniøÝõëëw×·/¯§3ጀù2J83áõÍ߯‰zóîů¿¾x7ýcþËÕõ¼[K½‚+\ÈÇ«ßþà“%,û—+Δwfò/œ ïåd{¥bF+ÕŽl®Þ_ý£Øû¦Žù¯ã™iǤ_¢VHæ½Ñãj9l†e6ÏŸ•Eó8ÈŠd;c(긽Özf¹O»í•j"óÆHÜ_ÏY*`[S¥Ç!ØÞ[tp`ôÌX-Opf”ÃÇÝtfE2‡ÿer}º R£?¬sÌ ‡Š''‚qí½"žVzô@øéf+'¯*XϤ·¤Vî¬'8¬ÈÊ`…LO58†sæœrÁà÷Õ&ÛàLRÔÓ™r<‘Ì0AdV.‰È#ϦÈ÷4²¬òÈ_V õa·«à³æI;’7MQ>ÀKê“fÇÑê°_D:[.÷y%­¦Š'UT0ùý‡{ßí +Ø[W‹©äÉü/oê)ÅNý¬}ʬ²j·Ø};jŸÆ[?™‘ÿ͘–– “~Y©`Ö +õ5+ 3ôÙø0À ¼4Ÿ‰+=sR™ï Œ°Î›ï!}ÉBÄxɬ֔ÔßçV™º$ÛÔ-ЪÞ,-`ÊÆ6û¬¬WSðÜ#Hgw$ò4·¯15LiÛÎÅx{._x¦\Y ÚŠÕÓe¡°ÂaGhÆùðèïð·æû‡G‡øô†b¤ +Ã0§µ+ÆÂ),K!eqΓÿTeNer>B$aƒò}ÝÃj+.¥p¦Ê­¬MÖYMÄ6_¬³²¨·ñ½(é¹Ûd!§ÙTøL“U¶(¦rf“59 ýL Lá•2-2‰ØÛ¢‰_«¨„R(²o«C«UœPeKÒÒ¬³f,wöt¢7¢ÉH¢|HÔOu“o¡ýPäy;ºª6›ê1dô0k×U¥e»Ýæ)J©èùgçøNó30:ÕÒˆ¶ =Ó’E¦YŸë<:®S´3ŠšSÝBi&½þŒòŽkDû L•g25'ê_å¿s.ËP,%¤|¤ÉæºÏ64´)ꆨ°“ðõæmd†â8.ÙÎoYÊl›ÓHï?ŒdÜyšK3ã &®ÀPçed¸½›ß¼þ7Ñ[Ð=ä!"  ßHŒ¼>v×y™ +ÕR\¤ñU4oM£‹j÷DaR´€åð9µð áš/Äbïb…v @LÑROÊq­ð‚~Ë—ÄÑÎèû!jº}? Êêdú¢ +Ï%*’¨ûŒIÖùfÉ`<ó²>tnÅqò6P°ò"ÜaíákdC[â·Çb³!êã¡X|À€¡é%º$?Ä9Áð„%f›f_hùl,¶ïB,f‰9ü*µÁ}’Z'Ж5Dm³'"îszÖ»|Q DÑ•8ðX :¤òl±Ž9²eÚGŸjÕÖ¬a|…záL[ü{€&!S yÕS"Š$«[|&e®jµ>~àvÉiRÈ=’7¬¤Á¨v>_e‡M˺¢A8Á€Ç¹OnVô¦=w„°p¾‘Æ~©#RÉE䥘GÉEM*ŠOy´­(i(Ñ õ*{«2DÕs]RCºì6¨Æò³…¸ÿ‘ÄQ3aG*@Õ¾XæäO% é„ :lÄ)œðxÛ›tõ@iÑsÔÀ1@O¦Œ§Vâ‘×Éä_kt‡Ò|Ô Î3Š¾‚ÎóÞ·àþÌ#4 ‹t4šª/M5¦UCË«ºFlDx ¨–“›U1€Ð×5?Éëät +0 AÒšh%ëÆsÓŒgP§ä—AQ2•ÊQvÌM@щˆû V¶UFºªô1*ñmnÁØ,2ãÆÀvj洞À±.Þð¥¨ë n€ÔÅ ‡fvà†|»kbk¨ßaCËØh´åi\6æ³EF…¤üâl÷¡ R¤—»>×ùî£ãBÓ·Ùgmóƒ[>kŠm>+Êg­H +'wiõeK:®S0t +N©ÚrSÞC×Nôº  ú¨SP]r(K:¶ÃçMU>С_ÇüI]`E)Ÿhæ¶(M‡#šUš0%ßo‹ís +öYá†Û\BT.O[Îc~6Ô;àSHND§²E„$r Ç£šv|(ö£Ø¶ôò)Ûò¡dé¢Úì©'Usu¢ñ2šxÊž/£©ÇuM-×(šŠåfMx³Ç±‹–t\#¦ Ñ$ ¹89´åˆ&Ñ¡I Ñ$I+:=wÁöêáØ +à(åºY¢C–0Áé¤ \¢k£D—8˜ë¥Ö¯/—=‡-qÄÖÿ ZÒÚ‹‹Ðês‡VÇu>QU‡æ¶  +j íÁES:®[†Ø‚º§ƒcîM—„þ=#ñ Ð;ÀÂk?UÉp¤P¶ +ÜÔíªˆSSê¶^b/Ô}«ª(E‰û¿h¶’RÂH÷Hõ¸.@ªå:Ÿ­F!mԃ˦t\#¶ !…W¸é‰1GH)ÞBJq>ÈW\ó”¯à9’¯`bÈW¼ÅÍ ùŠ‹a¾â-¼ +ùŠx—D€Y–B „ü5r–€øIuª/¬Ïu`Wèãó}‘mfùþi¶ÇK¶S`YΤ·æ² ׈ `AŠ’)tU#Þo²Oè5%×Ru)†w`fµ,áp¾‹éã6«›°”èÏ—tÊ…g¸>ZÆN,V4S#é.²¨°ËfÍÆ®mæS/t ýpEŠd¼lÁ±Î + ƒØ$´‰V÷NRŠö§Yàñ=‘õ‰Ì-’Õ=®ñиˆÑCáú'°´7DøRÓV¶' ä¦0¹Â æryæ¨--3Š?ý¼¦p8·F ç¸n!’PAUQ69ÖKØ‹ø%D>wnÈrL¼Eq´æWÏE<)âð®å«óEU.ƒtðô¸bîxÉ@Ím’ŸÏ,Z=g?siÜçºYZ®÷tD¤2Î1­\Òßq0H+:½Ã´Ò·àwHú¡Ò%wH©3ð°¸ s~Æþ¥V3‰?—ô±A +Ãê#ÀÈ0Ú!>Àìïâ°'܇íbb>¢9±Ð üÅé4yJ¹#’”‚t‚?5„û]øn`áÊ'0íሕúçW„!bËÅß…º|ˆ?+>p¸nÛú}dI¯‡ºûuéÜ£c\òuyªµ;qÈ™?•Q†áß®Œ4ï~ýþæ?£9þ¸ 9B¹s‡#Å-sÒ§­Qh¾IO-7 +<âd:búÿæÜ"endstream endobj -1312 0 obj << +1329 0 obj << /Type /Page -/Contents 1313 0 R -/Resources 1311 0 R +/Contents 1330 0 R +/Resources 1328 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R +/Parent 1323 0 R >> endobj -1314 0 obj << -/D [1312 0 R /XYZ 56.6929 794.5015 null] +1331 0 obj << +/D [1329 0 R /XYZ 85.0394 794.5015 null] >> endobj -374 0 obj << -/D [1312 0 R /XYZ 56.6929 573.6377 null] +378 0 obj << +/D [1329 0 R /XYZ 85.0394 548.8286 null] >> endobj -1061 0 obj << -/D [1312 0 R /XYZ 56.6929 551.8981 null] +1071 0 obj << +/D [1329 0 R /XYZ 85.0394 526.2567 null] >> endobj -1311 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F21 702 0 R >> -/XObject << /Im2 1039 0 R >> +1328 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1317 0 obj << -/Length 3275 -/Filter /FlateDecode ->> -stream -xÚÅ]sÛ6òÝ¿Bo'ÏD,¾?ÓÄé¹sMs©;7sm(‰²9•HU¤ìº¿¾»X€"%JN&¹¹ñŒ¹Àb±ßŸ0øã§3&½šX¯2͸ž,6Wlrcß]ñˆ3KH³>Ö·wWß¼“vâ3o„™Ü­zk¹Œ9Ç'wË_¦oþùúÃÝÍÇë™Ðlj²ë™6lúííû·ÔãéóæÇ÷ïn¿ûùãëk«¦w·?¾§î7ïn>Þ¼ss=ãNs˜/â -g&¼»ý× Aß}|ýï?^ÿv÷ýÕÍ]w–þy9“x?®~ùM–pìï¯X&½Ó“'h°Œ{/&›+¥e¦•”©g}õÓÕ¿»{£aêÿ´t™vÂŽ0PÈ9X™‰Õ>3†»kî¦ESï°(àxÜÆÞE¾Ë†:óøÝÖMSÎ×µ¬Ú:ŽÓgS4M~_dÈ €÷)ð"ƒ›ƒÓ„½7yõ<Ë«æ©Ø5»O¯{æÒGä2î¾!¢âîÅ -¿2&eQµ¯ WÈé|ßFâ⤺Z?Ôì·Ûz×KÜp2†eÎk1™qžy î5dÉYdÃ:oËÇÌO«â‰›uþXD°Ø=Â`w)l±x ~äÎ!Äptê1—ý‘«%‡1•ùLSg]=åñ6@F•óÓ»‡b„ÅÒûÌiåû,¦£v#ƒ£žg¿ô fZÇ…Võn“#W™ ®Â7_7xõLö¸øbCíÊE誛z»þs­5Èв~jh©*"~ÂA…Wá wY¬òýú@ÄÈéá:­|ñôü¥ÓÛŒYfãBc¬3m=í–Zát³È«ÓE-ÏT7e“?“-™ô­áÌ»r¹,ªØŽßœ>Û¸:1'NÍ›pÆÕöMYÝØŽJˆ&“:QWaØ#cÒõ7mÞ¸ÈìÄ䱌i°ÆÆËL)æÆM|Dšõ±ÈBñßaõYÛÌÊêxs×d·—wï°F¶H%ÀÊáöAúP­7ùŸåf¿¡FµßÌñ®Wô-«y½J ¿ê*ÎëèÍT#„yEÀ 0ª¶H…ê©¢“ -á@P!泯BˆzF…Hs€XkŽ\ÿæá“I-Zâ}Ñ´Mú. â‰÷¿:¾ÿrS¶>•ëõÐàÓš«}S,3òòwiÞÁÕA#jpØtLƒ%‰Ìsñ9*|F -µ7™R\–Â>Öy)ì°†R˜üXÕœ£6™uÞ\¦¢Ã!cpbÃ3k™ÒAæì ŒØHÂ( è -wÈÙÁœcƒd¡ž,†æEEQ±k1Odo0& °8ŽLV(!}žBøÜCZHËn궠6†ME µðñȾ/Tþ TþŒP ¥ ”âÉ/ˆ1›ykMÏ+HöI^¸åO¼ÂP,Ž'NÎÙAä„G Þ!*3ßm¢Ûà3@ãÉgp1â3`4ø ì"z~ðÂFŸeKxä°‡üt ½CoK½"¡wPÓ¿D K ¤ô.ñ”‡lxÊOe"¸XÝ‹‘t'(úpr~b¿9 ‡Ÿa*…Ÿ|&´~b×™ðSAN#<€‚ÁëåæöaGÌEÚV´Ûø3 ©£Uz¨Q_-ÒÕV·Æ¼`#{XldÂ:I"0%_§&R€-S/Ña½@×6óLÇÒ\³ÎE®-‹¶ØmJPÐL0O%&Á¦Hòi¾\ÆzCB#Ÿ(£ÑÄo´¹€ê -hR><*‚îÞ| Ô¸*mY“ ãEƒ3É8Rÿ&d¤ÚÑZð]m  À âq4Ùä@\œr°ÿÚÇìÊ%Çî†VVJ‡[H¡£òd0·_mv< lÓcЫp0vœ­zÌ´Þâáóuð*ÐŽkÛéÏo?Pæ㯨/±Áb?À7)‰»>P'„9»’È6‡=arªA¤õ–Ï`²Êï·KPÌÚ¥€C­¥ªÛáI’6R±Æ« -1còN µÂ…‰`}ðCÁ3Ápù-yÇõ:}É›˜DA/€öÍ>2KÅ {%$‰…®b·ÊqίB¨Åºnfc÷Q"r¨á¸vÌ> Æxq÷ì)à HB¤Í>­™o·E¾£Þ²Šû<ĵ†kK\û£•n2ÍMòÃÀœúiÖiþH1ÎfŠ‰d‹Iüh”©è‚eæ!—:rNR‚¾3«Ø˜T¥€LöHùP*¤™–+B¤¸KÆ¢t€Ï_”X𣠙©È´0–l7M‹ã~B2È…+á\2{‚u¡6él“)p †X‘Ý!à Éá„Žù?7ä¡cà±Çsj&üXR v„FbÑF’gFð™ DYï—ä¡; -•iñ¹áF»Ï$t(w–=•íCY]*R)›Y͛ÉOw -›¨­wcgˆ­NÄþŒ®Ã¬OìÖïïKçÀô èÝïw9)vbϺ8 R¹]1™Iãͧ<HÞ6Üøck2cÅ…µhƒµ"˜f —š%ê@…ÁÛ~Õ]òO•HëIOï{LÔâŒðºaHœþñzføôþ‹éÍ g`Q Žo"•ÉÓ!›ü1AR>Ä{l‡Ã˜:¾¹ÝˆÉÛŽ4éŸ*­<ë/ÎjØ|àˆŽYRÌŸê5šUêdCú©ÈtÆ ¤ê<EÄY—! -†že]D|ôu z8dD ;±§h[Ò=hµÆ^R*Ú,>Y{h¬®!ʉ†õÈ·Pd1ŒX\ 6ýÿ¡¥¢N„Py ™DÛ½kþ2Á4 br2;…äñS5Ⱦ§xˆÐ7ÏclZ!™¶©aé;Ì'±±ƒôŸRh`êlDҗ犾R|™žýŸ# -ÎA¼µ•—R‡uÁ)E,2ÄþýMNýRD!eà—FdViA¿$,ëû%lö^¯ 5¨8YNÙµM‰e1Ͷ¬óKû%æ2λ ø<Ž¨w*S\‰¡o -„û&0M‡ß_ ¶’Z(0ÊNXuü^{6J8&ŒëjÊ—|SŠZ¬Í„5/D6=¤ó2”NíÏåØïÝÀu_¢¤C:%e CDM93 åçð¢í’}p~ LÎõ…Éùž054\Ç°háÉISñF0qoâ’]” ý½"¶TÃq®_Äþz¬¾úb™0úJU={*Ö$E5œo®)½¥¶ƒ·Ö( -£;rÈá­ð©Ôð\Œ=W@ÀÂù•iË­ý_$ºTHØl󶜗ë²}Tžû)¡ÔþþoäÎY„|ñÏ ¿ÁT6ÛzæIÜ.(d‘‘(<§¶Ç”w¿G<%ýo -~_õendstream +1334 0 obj << +/Length 3252 +/Filter /FlateDecode +>> +stream +xÚµZÝsÛ6÷_¡·“g"_üÀcš8½t®i.uçf®í-Q6§©Š’÷¯¿ßbŠ”(Û™äÆ3ÆX‹Å~Cj"ñ§&I*R§Ý$sV$R%“ùúBNn1÷Ã… +8³ˆ4ëc}}ñÝ;“Mœp©N'×ËÞZ¹y®&׋ߦ©Ðâ+È雟?¼{ÿïŸ^_fvzýþç—3Èé»÷ÿºbè‡O¯úéõ§Ë™Ê5}óÏׯ¯>ñTÖøþý‡·<â¸9³è§«wWŸ®>¼¹ºüãúÇ‹«ëî,ýó*iè ]üö‡œ,pì/¤0.O&èH¡œÓ“õ…MŒH¬1qduñËÅ¿»{³þÓ1þÙ$‰¶)8™K3Y‰L)àdÆ4w`²VcLŽXÄäݶ¨Ûe¹½Tùt¶l¶ëbw|p¥|:ûËŸÑaPazT(#EšáD2þÛÔ%nÏ%A-wçEÍÀM˜oËzÇо­êÛðÑCÃÀ¢ZÒIÂ:T>XûŠŽvÄm2‘;Kç B@Ç <`ÆíÓž@†UQ‹z1²žÊE.qQŒ³.êÇ°^;²`šˆ<ÈÈ‚0pç:Š®\)á’Dû¹ë»rl3'´í:s—G{fJ$inãy7»ª©IôóiÕR›±å‚GâÌ»{`]´;làÑÚr{Ï0n%¦×UÐîªùczx£Ðâ.­9—Qt)yïNkdN¢žDÞ¨pgîËÀ„ªò28hü±J²éÛ¿ðȺlÛâ6ŒnèT4ÊBÔ6{ÌËþè¼ñí‚?‰¬ç¹ÅØ™4ôôÛJ†V%I@Þó?íEË;Ò÷Ì“j!ÕC9¥]«ìˆö–‹Ðnš¶­nVµªý¥Ò<7GbTµ€Ù~©ÔÃÈ+ãrv_3Qa÷ÒëñïRêy5~…Qm¦7û] .|ÔÔ«G†ÚýfÓlwå‚™¢S JÔ)7@6J6¬Š]u_ÒFºi]>ðd»*îËz‡Ý˜m± 3ûKÀ7ìThÄyœ$Ž`.Ÿr½`à0g… 6õCnžÊæç`+lÞgq¸žqcJ1Æ~Ø]™w¢Õé¥ÔÌU´Åª¥«—¦ÇU?Aü£6ˆ‘·¯Ôÿ©šû¡¦m–aè?—IZ4-/U æ'ªõõ¸‹rYìW"FNëÌRgŸ?½~îô™™Ìú&÷ØOŠ$s_lS­Sª£î‘c‰›’Û‡ÞV‹EY‡~h n6aùƒAŧEËæX2ÓÑGànTD4ìIdT¬°Ü Ž¤i€vWìÊ5®RœDøè°úÌmgU}uHø6ºÎ'wï°F¶DÊ +°'îï4{]|®Öû5wêýúÆ{ÀÍ’Ûª¾iö^Ñù›ý ^°â»w¤Iù°…€›€¹½Ì§ûºö7èšz¾ßÆ(6H)5¥PÕèh ÛZ¤ˆ“’Ý銑Éô¾XíK£ÚX5”ËÜØ(ìJŽC\;êÃÌ"~_³>—…—¹Aà"Mz¤$ñÃ&h”ë…DLq»)É®¸ßPk9Π°çžµâ¶¬çaÐ_} 4@º +ožéƒgÅŽÙ‡Èq·ÎŽ #7hQ§§Õá¸åAÁ<°jŠÅPi{SóbÅ`ûˆ°h}V’ Q¼ÒöiêcW kÈøf·C摬ا·ï°FöʉY–dC¼YåD¨AVKi4ƒ +QUˆ ž +:«Mx"à&`öUˆPϨkN.T–yN2üF«î{¼Ä_û²ÝµQ ¸-?Ïô„û_ßµæ@VNªÕjhòyÍ%…Ò‚ýuüîàíÐ ì7Ó`ƒ$Qº.²z‘ +Ÿ“B˜>™9óŒö°žÂˆ5”ÂèÉêö4‰Ì…µF=ME‡5BÆ0‰4Â"óÒÁVò ŒÔ‰Â¨wù;Tò`ΩòHPO}÷Ž£ ‹4t0Odoðý6MÏÖ\'KŽ•ˆ>ÇAš[„¢5ƒ¼ìºÙ•Ü§È‰¡àÒa¡ÉPkŽìúBåBåΕ¶ÐùTEó­Çl¶pY–ö¼‚‘/ò +à–;ñ +C±8Ž,œ\žb':ª÷A™¥Hòì(Àõ>Ï>CéŸYï30Ùõêà3t|«ã±w öSz‡Þ–*xB"ï0 ¦‰4Á—èIé]â)åPV^ÊD¸Ø¤é¹æè#7ƒ”Æ›Ð<}€úO9õà#£…”†Î iIͱŒlH­‹˜›»-3—h[ònã[ ÛÍEf“!—¾Y¨K5¹,Gzð¤ìc·‘ÖIAYù¼<5‘™Gö Ö3T(íH$^Dű0iY£Æ®¤CVV ÖtÌ!2jZ,¡âÑØ%š`3© &ؾ²@åã½eèúÍG Åu9§¢T¢8_ÁÞø¡FKOËrǵ¦œ5<Ì 3¡þÔ™ÿÄ…ôªWãYc ‡rUŒó!Oßöë-è‡b›ƒ|ò èª«&1 ¹bå +úaílúëÛaƒ‚혎q3$ÓìÒ#£¢‰ðj{`Œ¦~˜/¸ð}ÅEH l!΄šf¢c&ð‘‘¡¬ö vÎ.F…nC)G”:µÇÞ3Êb›ŶÕŸªRÙLd‰Œlö'>ÝN.ÕY¤¶ÙŽÕœZ§I$Îógt¤1Ž½Ãús˜áuÙL‰Þí~[ÄéëÏ«ò$ZÈ4’‰¡­ÜKÞâÒÓf>þ#“!lÈtz~-þNb­Æ/†KÍ"uävpC껫å$Ï„ÎàWa[„sŠâ>ô˜˜¤ÈˆÓ¿Mg ~¾œ¥jzÿzzòHš§È‡ba‘'™œü5Yç£=9€ýY<ðß½_ëÉÛ'šôžõWö‡‚ö£Ä•Æš R(¨áÄð—fEVUù*"H7Õ"ŠA.Ï(Ϊò10FMðÉÕy€ âȇ :a¤ÜíXõÐacM£¬S¼ >{t–—r‚]=r-eEÌ/µœþIÿÈШ´©šÞÈú·üu‚c ©“°ò‡é¯kdr"÷™›†O’ò™Úƒ¦‚g"Ÿy¿î°Î²Ù}zZ›œžÓÒI‡ÓÐ:b2¨> y1.Ò•wZÎÖÿJ4’#§¡ù™a8è<視¯¥©M("ý}RØ +5«¢{RãgzÀ('Ï ˆRÓ³)‘–”ègªÿ}¬'®.bq`²›½$-2ozó}’k„’áÝYa·¤¼&wœeDR¹­ aei¯LH“ƒw`ô)Ž¡–uèì¢1²ªZÿdæ±ê±DYAÓÒ,ÿRoœšøɲ¨Vm zôw²IeÝîí{FüŽofVäÎØñRóQ’ÉÓ¼%¡/wg½¤J¬0ÖfßÄKæT70î Œ]ü✗Ä2)ógœ¤²J(Ï·t’m.í·÷‘½…Ÿp‘Рiv‘ïýÛŠœ>’ÏiöÜYP)Lªàý$%õ”G^j$« Á4è MB†èÝ»õÎÎëVé\"a4ÜÞ„>å±T’“é‚ö®Ù¯.ÃÓkjÎ×Ë¢ ³0Ø z& +õ'JÓ3b4±HöÍ&D 8e—V³¦ÑÏs@#½h ÁÙóD$“`Ï,妬Ãà~ÓÔ±œ¶¤R·1ˆ ÷ï‹Í¾m‰á~즡ïùT:‹õ‡Œ0±¥l’:[$ÿœø£C‰?ñ‘h3ÏÇ=}ø: û„ôx›ÂÝ°tüçprûÕ¿Ð;ü|I HÓã>…BR›DÒ‰ÀZ|£I~êP%½AÐzÄÿ.:Xendstream endobj -1316 0 obj << +1333 0 obj << /Type /Page -/Contents 1317 0 R -/Resources 1315 0 R +/Contents 1334 0 R +/Resources 1332 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R +/Parent 1323 0 R >> endobj -1318 0 obj << -/D [1316 0 R /XYZ 85.0394 794.5015 null] +1335 0 obj << +/D [1333 0 R /XYZ 56.6929 794.5015 null] >> endobj -1315 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> +1332 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1321 0 obj << -/Length 3347 -/Filter /FlateDecode ->> -stream -xÚ¥ZÝsÛF÷_¡·Ò3»ß\^žÒÄɹÓ:9Ç}¸éõ–(›ITEʪ{sÿû ,EJ´L’s?@‹Åþ,%'þˉu©ËU>Ér“Z!íd¶:“;˜ûp&™f‰¦}ªŸnÎ~|¯³IžæN¹ÉÍ¢Ç˧Â{9¹™ÿž¸T¥çÀA$o?^½¿üðÛõ›óÌ$7—¯Î§ÊŠäýå/Ôúpýæ×_ß\ŸO¥·2yûÏ7Ÿn.®iÊ1Ÿ.¯ÞÑHN'˜^_¼¿¸¾¸z{qþÇÍÏg7ÝZúë•BãBþ<ûý1™Ã²>©Î½ì¡#R™çj²:3V§ÖhG–gŸÏþÕ1ì͆WÇìg¬O­2,©S-­·²L3)(32•ÞÉÎÊJŽY9R¡•×u[-§M½ÛÎÊã5K™¥÷ùžHD/H—J¦yžéÄÃ[º÷–ƒe[‡²z^¶åvU­Ëæ|ª…Iö÷Õì›6YÖ³bI£Èì\ú†©b>ý²i^Á´ŠõœHëM[Õëb¹|¤þoï>Ñ;›zÛ2ñ¾Z2ãÛ !¬Xè4³:ǵ§¹µ*(·kJäê|ÒÖôlÊ ÇeÉÕÇ›Ë÷ÿ¦ÑèQÜ• 8¦s:¹¹¯šèéÉ”»¦å©Í¦,¶Ô®Öij½/Y̲xˆÍrûP¸ô ›³¿ Úå©TÊ°=WEmFì®Ñï´bº¿ë5/݈,uƺáÒgËV*h0é–žAM­ÁÖ#z€ÆÏ{°½Ÿ’+Œèbó4Ë´eb’NµŒÆqM[´åª\·Ü-[ž@3* Á Eî"Ó¯pCg¼gêE\c<h à\¼dÇ:Ìhé4Cš{a¢ÑÈõÁ›¦*óI ;¶­æórÍýðÌ’‚º›28Å4ìl‡3U¹§Wn‹í“·ô¬Ö³ån^­ï¨[ŒØBe€hÖ¸¯·…ÈE¤îÙùï«ö¾âŒ[¬‘¥Ê€ç \(ºØ‘0eR‘åQ¬|d+eê.Œ1ÊÇ©,n÷- ÅÂû ,<ÃiÂƬ^ÿGu·Ûˆ 4ˆ#Kpº#|ô2µyn'ÎAÃå_´1Î0 -0ÖOò¢÷ðâf|cÈjµ›ZoRŸ»ìÌzÒÙ~1ñ°™WððTkŸ]õŒh‘ÁÒ"µº€_pá¯JN¢¥wi‘râ„I•09Šžü9Cgr°S êµÃZ6?^®Ôä] +šôÅŒ§}ÎaQN ¢ œXmôP&•™È‚ÊŸë%¢¨´ anž¨Ô¦’š Q2Ͳ*·42¯K¦‡ÃAf·ÙàA4à:F$žÁ=OçZ°Cã®÷ÏÂÍÛOtššzv®Dòÿ  R'>hK•Ïý¤¿Ëßç8<ÂåãL©É÷¹õTå©÷DL8ˆFiÿ| {cžÏc:ªÔš>¸“TF‹ÔJôYŸ¦2L4¢@L¤¶©×V5ø¥ú2†wöd˜Ò~%¸‚m•ŽÔ¯}BDÁ¤à” #VMOŽ›¡s ê5Ë=ÚËO`buH60Ái  ¦¬†íЗ뺬Ž”‡"„ „ ù}‚„‰Z¿TMÛD·VöŠ_…°=}0ÓÝ|3Åôj,íÈ2È âòOÕUœyIñPWó—x‚3#Í×ò ZºoÒrª4ÁÇÈîCüòæHßç¹{HwzñuSÎh{µ )<–æ…JÛ¤^Ðì«á\ÃYH³¹!JÀ6¥|t•óÎÁéší}ÑR‹’^¤ i -ŒPz‹­À3`!’¦ -fÔOÁ‘¢'c_ïè%ÄZèäsyR‡£1„l¦õ=hn{Çãº_5EòiþôŸp !¢œqØÍØÙOÀÄB$³«¾>#hÆDÏkÑÌdpT´"-ŠÛ:žùûz”¡Eµ,n—ܶÅ:ÒÔ銥9VB½,3å_Åj³,]0e;’°¨1#§¤q$% ->kún' ÓiÆÏDk‘ü—Ûb}WRS«Ìyj:kµ}Míÿ½‹Š#‡§ÏÖ‰×'",³ˆ‰8ÚŠn:¤bPuÖJ†‡CtŽpä¹8N‹ã‹°õj,c…¸ !;BÒºX•ó±Ì`¬™ŠËP'%„ - ú¡0è+GÉêpØGfiþI‹•ÑöHêU˜×9ü{E8¢À{Á%³á ‘å0¤z‰ü/ÀŒ%SÑ…  4¸Í Ú©oÀt¨¦‡^`ê3}#ôöØbý6UB -qNÅpdCîwýTƒ23Ûʼn'·ê)!biÒ¹M3»¯ë†Î!H è -£U8ï0:'ò -r•m؈ 1µ0–ß`ð‡V¨!áʤ°dÃ% >"ÇÐBL õïC!ŒcbŒ'îù³ÜÙš=Ö58.ó™Î,ÀMóšß[ôÏ“?wåöqˆTWï鈎¡7Ž!‡ -z ®ˆ€€ôÄ™nÍ¡óØ{Ë-øU?ÓG¢u³´÷õn9§—¨b€±»²ísu‡7 IÜæª4DoÂûÙÝùh«:¹0|O—B–7<Éb®¸+ª5^@I“\Õm ˜`¥b`~^6iÄÜQ±Ž6ŠeSù-OÑ+|( -ãëõzÉ’ÃVŒƒÀð.íEPÑw‡ë‰ì „˾#³ ·<´5õC5/ç1ÔsRp[̾ì‰Ã<†ýÕNàmµ¬ÚÇ#€¨¾©›¦º]òtSA^Ñ#]:±éjƒÍ¢»ÓÑ~"ŒÔ9×7%&!13ùüØ´åŠoîËXkS²ªF·ø¨(¹¹çüvxuÊ)oqdz!цDvU¬™>Š†6;|*ü>hÄz‰JQ>†‰î¬XÆÄù¡Xîâk‡,;Á‰*Oö÷%sä² 1Çú ä:UÒ>/5ÒœJí»qî.ÜPêMijćÄéï²C5Ê´b6¸ÒÙ­6 7\$”æ<½œQJâÕ¼{1,¦»|~z;$¤Fºö£Gõ̆Dª YÑOìH†aæYÁ‘hDðÑždÆÊ¡`2f.{› -´ÔÛ’‹ "“–«Ë)l·ñýîø^<ë2½…[ÊQ&T¬— ccô_‚¤¥„Ùœƒ©¦ªyb‰¿Ühù•>ïŠe—ÍÂG³ O'£jÆ3¨Že›È¢.Š ð•»x· ­$VÚÇŸ’à(oœc  ßm¹µ,CU#ûÃ2@çiHPÓ"ÆŠ:ï®>Þªf”yž|ÿ»§/û%§R˜&ê\Ъ1sT£vÛrÝ*mRïÅQÛéps„c=öÓ„Há8@ðÇË7œO@Ÿ4n‹˜“€[ØÚGj>ØLP^ñúª…édK1¨\‚2+©É—DšÍ ÔÛ¢jx2Ò¢¹íEsÏ+´bûÉ­ë’[GÓݺfú]j¡>4LJ0s‡þþÄOÄ´Mñw]#(%ºïîßýó±Ãoë ìÐÞ«q¼S$I˜°R¸Ö?ùAãTõÿ5µùÍendstream +1338 0 obj << +/Length 3258 +/Filter /FlateDecode +>> +stream +xÚ¥Z_sÛ6÷§Ð[噈Å‚—§4urî´NÎQnÚ>ÐesB‘ªHYu:÷Ýo P¤Ùé$™1A`±X,v» ŠOüç«&35I3•hÆõd±¾`“{{Á=Í,͆T?Ì/¾'ÓI–dF˜É|5àef-ŸÌ—¿MßþûÍÇùÕíåLh65ÉåL6ýáúæGêÉèñöÃÍ»ë÷¿Þ¾¹LÕt~ýᆺo¯Þ]Ý^ݼ½ºœq«9̞Ù ﮾¢ÖûÛ7¿üòæöòùOWó~/Ãýr&q#^üö›,aÛ?]°DfVOöðžeb²¾PZ&ZIzª‹OÿéFÝÔ˜þ”¶‰ÊLfZ$™Ui\Ë,a´6KO47¶×²à1-*Ôr^u³n›×íªØ^r;µÍn»(fæXÜòÄdf2\äD”@EDáÖ$&MåX–75œ@ÊP¦b[ç]A¯½xî åCAn”OË•§zðäMíUÙvÅ’ÚeÛ9Rˆ`6ᜠ—?¯†#é­JWaÚ*/«Ö ^/#Ë(–蔥ž|×3$‚ÃeYbE +ÞÁy’i-ž;˜:‘,“žoÙ’ù¶E—œØ®7“e‰ÊXö¼ ©Î[QO6õŒàc3‚£7pôÏ +ÓSE¤Rö¦¬‹ók‹&`­7 +›L +û&ƒ“ji¸ñuºœ)¡§×+y,‹}ëYº9ža»)åïŒ gp0Ú=”žÙ²X廪ó³º&b!3ðš”AÛ[`ÝDúð`K ìo»/ÝnáèËŽžƒá-º" X’ŠL{FO°óÈZi¢¤ +4¿3ÍVN3zˆÃ–‹f½É»ò®¬Êî Hùy#ÔÀÖÀŸ7ÂÕ3F¨H_]¹z:gv +¼Åýüò=Õ ës  ­¤}A€#}™Hm¸×粓\—5djº(ØÔÓªYäõá‡òå’ì®m_A´ti³éʦΫê‰Þýñ#ÍÙ4ÛÎïËÊ3¾+…œ%h™Q¹‹æãžmáÖ1éôæÃüúÝ©w rä÷E nbŒœÎÕãÀ@NO¹k;?´Ùà<® ¸ìx:GuËTùchÛGtQˆÓßµ–&K¸ÊësÜocv,1ˆÊ€×_0@xN<ô‘Û-ª|‡%¥r@€O'¦” ëˆ †2Üxö ÿf?#SˆÈ¢³â^ð)ZËe&<(–k;@ªuQwþµèüª)âÌDYf‚"¾Â 2m_a¹³ h ‚œqi°’—aA[Ÿ  hd/w.ær‰mË岨ýû%ŸúfN_|œöh;AŒÅžtz—·Eaðe½¨v˲¾L#a=ŒÔÊ|½:XƉ Tü÷%yMÒÄ• +I¡4+$XÙÑbB%,Í‚h°óÈiòÄÓ)#ÊLj4}€ñÙÇ€Ú£þC€¹Æ¸t¿ÛæÔ‰=UqÑ2’ §SHŒÒìkr\i]Ênã9.ƒD3=ú,/šÇ€—o†cV³ Ü ê¨%ÀÜA¯zÔŸÝ@ª¬‚ 6u*º(8ÁDË?>„Â_1½:Ñ 0•BÛ‰,±\¹ýLþœ€ã©Ìå`lÔv»=hÁu|½“ØÓd¸­Ày6díöeÄ(äpô;@Š$µL9¡?5B)×SÞl*pjRd€Fáiª²ØRϲ)<=¸5ÚÝfƒ®¨Àx|OÑuÎÓðÅ#4eK ßF”÷ŸMW—’y“ƃzÃüíGò§¶Y\ +6ýŒÕ@¨+TÀ²4r2<èo³ie† u(¶¾Í²g’wœ¡Ggò¹lMš&Œ«겞êµbÕÁ¶†¼Oó™@a”é«@éfÇ2ü\~Ž!ž€dµ/¢+¨VÈó¼"øqQ +€MU÷ô±ÓµC~j›ºÓ^Õ«CÂéH¨¹á‰Ð{²1ù%›nHc9cŒ’&ä÷’&jý ud¬ZhPhfûªçQÍvËÍ S¬Xê‘bzh³~û‘êÐÞ†Ü$lÊåK<Á–ÔŸ_ËÓIiþ‘”3!³3Å,š»UGò>ÏÝBÊ“±ó\¥äŽW—À+uléi³¢8Wåó £“,cÇU2B›6€ÈüÉAÉášÝCÞQ‹_¤s© +ôPŠ‹-—€ÀÓA!’†rÏhtëƒ5Vaz/À )–LN?'ÕˆJÁè8äŠÈa™ƒ8ÜÞûˆq;¼ +ô³á„S?>åë‚D±ð¡„óö~(³d+Ò‘H'€ÒS½ HÀ4‰·e&Ú]ÿ¡Ùå)ùc^Vù]å_ƒ‚q¤/´]m뫦%j—³é»P’åëMUxˆÁÄíh…Uƒ©9¥Ž‘ÄÈ®Ú:¸»OÁv£Ž43Óc›×÷5¥H¥¦Ñ€7¯©ý¿×±Èñ ![˜Ä^Ÿ,¡±Û/1  %ŽŽ¢ß%BTŠ^ÃRpçuØE΄=ÜÅ~Â]ì_¹³hÖ±¼b¯°ý}T¯‹e¬ÃHc•¯Ga tK\Á•ZÂ_ã …£e8œ#ö;µ´ÿ‚ÄEó {$s…+ŒË þ½"0ò©ôPñÑ ’ù8®(šDöç°F“ªèÜÇ¢ 3Þ.jõ€ +Ieƒjâø Lm*Í?Ä_`âr3Á8á ìi {6äpxê§dRèCü?wÌPU±ô{³që,š¦%?„ÕÄBoéü:à@—da©ÁtE–Žl„ƊИZP”tø-WIÂÓKnËÊ—•Ðù„] 1ö¿w1ö9ˆQTÂŽ–;åîµ9`í.é¼t˜î,Ü´¯ý¼Õ@ðlúç®Ø>ÅpbO.¨ Dº’\qØ•ÓctW$'Žô{v/OƒYæhï†Ù>ÕíÞ ÐÞ7»jI“¨j€¾û¢r5‡™ÇŠ$nËÕh—¼·&¼xàýåÔ¢_ºèvH{÷†'iÌÑå÷yYãMWÓ›¦+4^"_mIynQ±éÜyÕ6D~ç‡hŠw +„Â0½©+¿²;Š8Œ/Õ^„µkŸ‰IÁÐ%Lú é»îqGÁÏ]k(‘X!Æ8ssØžâ5Ý@¶Ä·ÛøâÕ¾«—¹³cèr@ÏCŽ†= Û¶xí÷¡xó!× —=º¬¤£iËe± ¡Þ'wùâóž8,#ÕGP}Ó´myWùᶄ¼¢¯HútbÓýå?¹ö™p):2_t|ؘ„„ÌäÓSÛkÿ!³õ6•"ë2zÄG•ÉüÁ'¹ã;TŸ÷æ÷~ÔeÛÍ®óúÉÓ‡¥¡í ~ôqº)€@#$Ò +Eùf»‹¼ +Ùóc^í´C‡/Á‰*›î +ÏÑרˆ˃ë ZSme %ƒ‚IŸ F"(×ýµûò©L*‡!׺ókúÛqh•5è+÷/ ÎØ—‘ÈÕg©L·BÅ.‡ÑéXð&‡pÀ¶¯˜ð%욶êò#\½öÒÝ—÷ùÝSWD‹`ÉTbGÈTûCŒ¥Ò$åýçK:ÝÖ…k(Ùséµu)¸ôeôÇ@cÿU®wkzæûøºnvuY¼í?Cù[ñÌ2³Vp±=Zß+úrßÚ瞬 ÜJ%ÚÈt™QBÆåÙì‚«¹á<ÜXtù¶ëk¬Ç“ $-¶åæp3µ!H´ì¯{ÛòËIE)µ„ÄŠ~.íyúUW\ø›‚³\=ÇÙåéõ•ÔÎ'=,ªüصµHÞˆùOÖõÉ.2ÈÏ KG»x¦.îé#2ŽLã„ï¸.v¿0á'U:Þìs•¤9ýF zA†Sn(Câ\ºt¨ôÆ¥•®ðÚÇYA_‡Bï!ŠÀkåÐ>…NœIÐVØR£ kR.F+xˆ^k!Ðõ†š~jÝA€z“8˜XÈÄšú;„/ËýµsGý­ã…-äðt‘ éÌÙÍÙð§LO?ÔžÁÎ}CÅ­X¤ Ì©Rš +G|¡ÚÓR)„=eÛî²c{°^d;»Ú RŽ.ø Æ;?†‰g>ƒ'P¥¾ô<Ð<÷ ÜѸ8Õl‹6pÁÑijkö4'‹Žâ¢0ø›¥Ñªó€exwIÓ—¢G4ʲBþ5ºÎÙ­7çL$„º<½˜ ,³Ö¼„Õß>'ç~Ó%<þ+¢ÖYúæß{~ UZ+Î@8ÅŠ× …‚ëììmÝ©èÿ½°Ñ½endstream endobj -1320 0 obj << +1337 0 obj << /Type /Page -/Contents 1321 0 R -/Resources 1319 0 R +/Contents 1338 0 R +/Resources 1336 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R -/Annots [ 1324 0 R 1326 0 R ] +/Parent 1323 0 R +/Annots [ 1341 0 R 1343 0 R ] >> endobj -1324 0 obj << +1341 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [442.7768 483.7823 511.2325 495.8419] +/Rect [471.1233 402.3147 539.579 414.3744] /Subtype /Link /A << /S /GoTo /D (query_address) >> >> endobj -1326 0 obj << +1343 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.118 212.4953 409.8647 224.5549] +/Rect [389.4645 133.6118 438.2112 145.6714] /Subtype /Link /A << /S /GoTo /D (configuration_file_elements) >> >> endobj -1322 0 obj << -/D [1320 0 R /XYZ 56.6929 794.5015 null] +1339 0 obj << +/D [1337 0 R /XYZ 85.0394 794.5015 null] >> endobj -378 0 obj << -/D [1320 0 R /XYZ 56.6929 540.8756 null] +382 0 obj << +/D [1337 0 R /XYZ 85.0394 458.5915 null] >> endobj -1323 0 obj << -/D [1320 0 R /XYZ 56.6929 517.8101 null] +1340 0 obj << +/D [1337 0 R /XYZ 85.0394 436.0118 null] >> endobj -382 0 obj << -/D [1320 0 R /XYZ 56.6929 293.4989 null] +386 0 obj << +/D [1337 0 R /XYZ 85.0394 213.7989 null] >> endobj -1325 0 obj << -/D [1320 0 R /XYZ 56.6929 267.9627 null] +1342 0 obj << +/D [1337 0 R /XYZ 85.0394 188.7485 null] >> endobj -1319 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F62 1050 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +1336 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1329 0 obj << -/Length 3260 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿BoGÏT<|$8÷”䜞;iÚsÜëC¯Ù¼P¤*RqÜ_ß]ì‚"eJnç&ãp±X ì÷Rr!àŸ\X '‹,Ob#¤Y”Û+±x€¹o¯$Ó,ÑrLõöþêïïu¶Èã¯òÛÕ/¿ŠÅŽýÝ•ˆunÍâ "–y®Û«ÄèØ$ZL}õéêߣYÿêÜýmccU6sJ.P -€“t‘™·8‘È£§ª{DÈF}K˜ºÚV=£áŠm{hÙn·uÛvÿL¸CçÖ„]=Ÿ¼Ú¹ý·Ç ý2CÚ# \$°+Gì*8L¦s<&2º-¾.Ë¢|tË®ú=ЗÁj™3yѬgÖ”n ÑL³wåaßU_ÜIKmul¥Ñ‹¥”qnŒòTe]¹¦ïfvÔ*ÖÆ&¼Z»ë«¶éH?ª¦ë]±Ž_(ˆˆ…Ýͤ‰³DËyƒ`¢å˜Šä)ç "P!ÿBÕ®;Ý”1¶‰Í.ox¿s]{Ø—ÌíT›9!K•ÇɎרUmÚºnŸªæ‡öè8p®s=5-J áú°B¸Gp¦ãÉ ºtýàá’iÁ^ºÃÖïV)x‚^¢M\³iùÅ5MWMïöMQƒù1¸tô“bêg…»/½Ò/š=k -þÍgð–Û³Ve2 ð9—­jLuÞªªSª¯êeÝ>,g-,•q¶p™j†‰…¥iœ¡ŠM¹¬PŒ¹fe@XEnÕµµëÝ?®—IšD”ÇÓEYº]ï…†£fÍÓ É3Ì x=@ùÒXB”ívâXUuÕþ4ÏyO‘•BdLÕTòÌëK‹Ò2ÖB#÷ÿÀ\@“ÎÆnˆ'²=z”xÝr(-XGÀê‚UjshJº' -¶ôå}çuIÙX*™¾¢K#ª º¨ÎòT¡’Ë T3,œª¤+vÊÃ'ç=Fâ/ ƒÃÆçÊC¤ 8H¨bÖi@:ÀFtîÅqt–Bì´éä84¹Xp7:Ø@ÿÊÁ^®Kcq#G :æS~ÀÅÇ&‡ôïâõT¯pñr5Ê­ŒÄÁŠèçGÇÜO>sƒ”V*§‰É§ÆSìvÞ:[ÌiQÕ³ Ðí\Yá>›FÈÓf«£®Ý2•ºã×Úzíºž‘û¢éŠ2䤀ñf2&8ÆÁSU3´âéâз[p ¥ÏOyy—mûÅ­ÿz—"‹iò?|é!„óVUw’Hu×´BRHPš‰3ã}þïmÔ«¢«º³^#g W¢/{1Õy¯1PáaÛ®_BÖÔW\t·ƒ}é8rPA­.31PÍp1qV¦PNظÅëImð iYÔ¶L4±#ÒŽÉ`:ÊóS® á‰g£Ùãiòö}E fTnrÅë~†`†2Nuô±íÉ„R`Ú ó[PµÝÕn ky#ù‹q ÃÖØE¸,ÑÕ‰ªiQ9*'ò„ò;SPË_da šáa Jy>eb.c—G!3v˜®û¢qí¡#*²j>Õmûù°ë&Iœœä{ì=È´0x eàmÉTçS÷±rElXIì€_å;ù'Bó1ìØí¼;ÔÝæÒ°“ÀŒ}Æ“(çØ—< ÄÚè­+ êEÀâ݃ÏSîhÞè*hrST{B¬ª~|*j!L¬¼·ÃÅÈë,igRjÁÁ3±Æ[Ö’>¢• ñçªnWϽë`U­Mx/‹¾õ!,±!Ô|“EZ ^X¤/:"ç»Y¹šÊ']ÚÊ;bÜ‹ÊvD¡q#fÅãµ+é^ ß(ò‡â«PÒ¨T›éU é‚Žõ¬*Æ…&e­g¬]§"6Ö¾’õ©Î[û@å%UîÎÚ¹†ߨìòæÕÌîÓÊ<ƒíOv'ûÈÓ‘™Ã`0s€½ÂóÄÌ3è2À÷ï~ddÛ4nÈAµ"A~¯Q£löQ³(3ìÐN­ý/¤©‚#&#SžÑB uµVÙk  |šçæÁ¨.>P‘¥ø{X/»¶üìf¤r‚{1—9¨fX˜zyƒÁÚNyðW -9Ô ñD’Ärx„!+,÷Õ®o÷!¸YàO@¯ù’§P$ûßаë×U‹°É"×—à2­H9ùò[;·fmŸ+GK®ªöþ&ÖúÔǹ¦=½Ü}¢ÑÆÆ"3r²=õ[;î‚¿`á„Ï€{Õ8ï3–ÄÒ×)¸Yº¯€9í¾Ê³°L{É#Îgf E)XWèäG}H°³Ë“®@hª§Šë(­‹¾ Èë<¹S´-œVq3!•@äU¦|ºä=¡9¾:„q€9Œû),9奨XS‘ûº«BóÇ;Öÿ"hó|Ç`EiŸ$õL"ê ›èÃÝO 4 Ÿ}Ñ»‡gš â> 9‰ ‡ |ª„Y²L-¹¯%Ä(jQ¨$zCdÁ½ 'zŠé¾ò-j¼7ïŠ]õlÜ÷ÓùòÊyl²'pOC{þÁç¿€¢ös»%jV2D‹`Ûø<@O¬Fž®ÚÓ÷÷x«£T|›JGoà|gù@ôÒg÷üÄ|²sµÓã^lÎd˜„`‚×ÔQo™N’Ë‘ù6T&9UGˆÒj¹ -=íCÓU u¬¥ónÏ ¢k_ÉË]þÝ7æ,*ƒ«|‹ÓóñL 5¡­xŸè(/6´öèŠ-Cc'‹ctÄøôð•Å²»|įŽëÂR¿Ñv»vσm;(‡ JÒŠž+úd©^÷oW…Kí ÂN½ éÙ3»¶«úŠª1M— Ê„ƒ!BPUIo†8Pß¿%à ùG·€*ß’“o -°bH${^ª%4¬æ¶!LAÃàuEõb±6©vuà²rOTÑŠÁ[žk°w}ÔšR+ßïÛè2êðá±=ùðæ¨Â?@¸ñ5èÇkÍLÿgƒ©2Ö‰yåsÕ˜ê|8¨B±Iùíʃ›ë,ÉLä—9¨fX8í,I¨ TsN´ &n–ÚßÕ®ôAÏi‡ ôØ `H45_+"5¿{»™ÝÖ¾q5ÁlC½:DT“ÄJ¤zjÎT˜¢Áð/z¯8R*ÁØÊ‘sýŒš¢Ø‰õ”‚Ú¸'W]óÜcûDÀ¶hž ò?S+iZ²`.(Ú"äÍÊZº¿5áªfNáÃé•”dö>E…!H@_âÔA*Øj3øœY¹á½]ÑQÄØ > +stream +xÚ¥]sÛ6òÝ¿ÂoGÏT,@$8÷”¤I/6í9îô¡×Š‚l^(R©8]ì‚2%_î&ãp,X`¿!y-àŸ¼6iœæI~å:6Bšërw%®ïaìû+É8«€´šb½¾»úöÊ®ó8O“ôún;¡eca­¼¾Ûü¥qß½ùùû÷ßÿzûê&ÓÑÝûŸ?ܬ#¢wï|KÐ÷·¯~úéÕíÍJZ#£7ÿxõËÝÛ[J™Æë÷¾£žœ>gˆÞ¾}÷ööí‡7ooþ¸ûáêíÝÀË”_)2òçÕïˆë °ýÕˆUnÍõ#4D,ó<¹Þ]i£b£• +=õÕÇ«'£~êÒùicc“èNWM’åS–q&% eiåj8åD.rÀÂSÞ}ÑU¹Svsg)\Ҕ䳅ÒÂÂj²0Üj¦œ/|÷ààÄsíŠ/ÕF±kMOp»Å¯ð[dT·kO÷a~çŸÝ!ÐâÑcçàâµJÆu6n[k¦]uÈð·ïôô€”~òÌsþhx‚Gœ1¤elµ’ŒçR°¿^©<‰3›&×+)ãÜ’kÏ‹‰ŠÃ´Ñ†Zuµ«zÛ†¾#_z¸ÖŠ{Ïœ6Ñû-õñaL'™¨è{·ÛßÀQuŒÕò@]·eÑó”)íŠ×v_J×ñ¬vXƒùŸÄóã·þÍÍJ‰,ì# KTÄL=VuMж¨jm£Ç‡ª| ^¾¸”wFýñÀPíŠÏLu ?²™FǦXס¥ïÞ¶íaGï>|gU%œÝ &þ>Ìó_Ü#Ÿçz¥Ò$j÷Ä¡ï@—èê'jƒØm5Â**§ ÏcÁ8xžøõçV5÷Ôò¬ytÖ€)j¸"^bC ¬ájŸÄÙ3¦HÔø˜ÀÀ7‰Ê£õ…LÁEûo•ECsÒ +ùãìCQu<ð[8₶ÝSÂFC¬¯yÃâǃ|#ч‚!¯/ +å²eü]áÅ÷óDc¬„1JLŠò¾pwOíERÖ¡¸U0¹'†%O¡dÎèE³Y )mœk­çàÊã¡«>»Û«b+šŸPYW®é»…U+c5S#ïÈV Üi±‰ŸyBv7`ùcm…ºì“¦Xç}Ò€…»ø—IíºÓu3!lþâºiaÝ)ÛVÀ Jçë’«PÙÄ%A£9îÖÞÖìža‡¾Ñ‡iƒUò$¼[°óŸyT¦!¨l¸52MÆCJy7ã&Fe•©X£ÿ¥Ë;6^ÚÝfáš z6«uîJD]ùKaÆë•,o‰ú¢ü´gdq +>óòÊiaå)“ Å©f¾4(Èóx«ÐŒÀþVáë7ɸÁÁ÷‹ãá~=1¥HCI1.4ÞjÑr¤!b+ŒýêHã¹9Xi0&M è>ÈršÑ³L!f„ X}œìýÖuíñPònD¡Y2 `e“4†ˆz¢*É£m Îý‘Ù‹,# uÁ"µ=6%ÇÆÞÏÒw’¢ž—%câÔf/øÜ)ÖY +Xç¸<#a^Ø@@ZØÀ© p^ó|tÞ^hdøì56(”DˆäW`ö€oœä›lDçž1£´e’È74x¸¿&àvÂ×€ÿcÏéc|Ù¸#vùt?Z¨89—OwÀzaÏ©QPâq³2VD¿=8Þ Yä3'Hñd"ãT›|n4‹ýÞëf‹Á, +z º½++¤áÃh쀻ÃxÙª¨kwŒåîtZ[o\×sç¡hº¢ Á(ôx%™¢;Ƨ—­y¸8öíŒBéíÿBnD¶e×~v›¯÷ßRdhóÿ!ò⥪î$Ž(ê®%h=8¤Ÿ43S²§LuõWÛ0æºèªî¼Í"6Öæ/ØŒ Ö›°™‡¶ëW4õUÝ­@aŸ™ -â,KíåM X »˜mâÌX9ßÆ{<žÔû™f‘EiË’‰$v„BÒÀ ¦“?儾Ȏ ÒD쇊f”gBçšé~WSNþ¡íI…RƒÇ4s ªvûÚ퀖W’¯ôÊ€øi0´otŠuþF¬y69Éçn|£B·0`-ìaîÒŽJÏ7±°Ëñ’¦; ×}ѸöØi53AHuÛ~:î»Y'gÑ[R-® +žôš¥ÊÎÍÇÚ=5nÃr¡ì*ŸÖæ„b6ìÔœØ3…G©òØæ2dá°/X’DŹzRuIôÚ•!€8yD„&çà£Ôaw4 3:‚ +ÜÕ:ÖU?åj(ºbXå¸F¦ +²ij…Î +œxÊJ’ÁÇîDPûSU·ë§ÞuXiS&ÌË¢ÏE} $¶Ôµ\]‘ƒQ‘>+…œ/wdDjI>+wÐRÞãZ”°c*7ö¬¹½q%kA58dŠ"I!áJÕ‰’£é‚Œõ,ì*¦y&Ŭg´=ɱlþBN>A:¯ëÉ_S¹?«ä@dÂåK+HÏ—žçäc3[û.Ôq'µÿtÔp€©èœžj8ô b ðÝ›_¸³m7„ ùPdkÆÙ¬f<–£)ûˆù3|~š+úWDiNI›Q‹PfqéêK…˜DgÃÁ^._úë­,R›U×–ŸÜ²ÏÍåõgaùSãž+©æëûã„Ði¸m-鶱/„îC0Xª}ß:êà +ß=Mó™¡HÈð¿¡f×oªa“E®/ÁRZ‘rÌå—vnà ª8~׎H®«{6ú&VêÔ´¹¦=Þ£kMž_còIR…]^T$ƽ$CŸ¯Fl‹Òu‹–,‰ó< v©)v‹±$&é‰ ‰i Q‰óäÛ曺D \Ɖʟ¦ 9¸`$³`ºÎkŠVC1®#Î>WGÔnwœ8HІDȹ6ù+óïÇþ¾å烠Èüyt\ù·~‡¨HñdŽ{ñ)Ó„­;tü<ÀµÓtZ;MÏTàD +9èàrLÎ*k6‰ÝÇ-¯ª Uâ48­³µZH¤À}§ZÎ%J&vÉÓ ŸÔä8˜2=5›z\Y›3Á…Ì1~I‚Yú/V¬éñÏ/é‹_´f0¾©õê#g•¸8ç4:Ü*M{"`Í{Ÿä]ÔQ5#wV@pŸd'º·=öGš;¾ßåq¢’|R‚¢âÜXZy(ºàtû¾fCî¶Hf þbž^ývcðtÓ>žÏ¥$h‰™¼l—§Xçíò€µü44³Ê Ä 2ù‹ëX ˜‰u‘Øt¾ªïj;­»Œe8à£1DÏ‘0îc$mé! .Ï„j/ôœV{¡ËsŠq_¦üýcŸA–RбP¡ÈG©ð¥•üÄœ U|~,Å/??â+mC_ÎúZ–@ä¸|‘J~èMÂÃ,†º©§Ñ>åRôà Rì=,9èeR”&‘û²¯B±Û{Ö‚"Èt½X›^S ™þU€Ñôþ +ío%`ÀÑà÷EïîŸh€Ê ÀÂŒ(23>ÈÂ4Rp‹-#áë¿ÛP]$ÑÑ+B vÆðOà+æ|º]àë~b@ó]Ñ Í^¬¹û¾–ÏO ;Ǻ¾†£^î}Ð ]Tñnw„Ír&Ãí"Ø6¾èÐ#K’Ç«DàîîG^j¼_SÑ+8_úÇQfˆ&}rO¼O¶²vþX2Ì‹¡ ô?Ž©£r6q2ýI ö†tˆƒ]*Y­CýØtÕ}CEr飌{w`‚h£Å2w—ÿC;ŽS’…_e¨ðs$Ô„ZFØû<Í¡ŒÉ†z"]±chjm±í_AŸ~YÌõˇ +nºq] UðŒî¸ß·nìÚA8lx›AH%ô]Ó«“¥"Ÿ¬’ÚøûU&Üô¢ÎíÛ®ê+J>”š½"B¼,Œ'?½¦.° °ûš”0ê“7 ©†¶g:í@%¦ž÷L· f°:ØE$öbJTíë°ÅÊ=R-ÎýdPv•Ûš,_aÜh2êðÒÙž> endobj -1332 0 obj << +1349 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [375.4723 524.316 432.5882 536.3756] +/Rect [347.1258 451.8816 404.2417 463.9413] /Subtype /Link /A << /S /GoTo /D (journal) >> >> endobj -1330 0 obj << -/D [1328 0 R /XYZ 85.0394 794.5015 null] +1347 0 obj << +/D [1345 0 R /XYZ 56.6929 794.5015 null] >> endobj -386 0 obj << -/D [1328 0 R /XYZ 85.0394 661.0164 null] +390 0 obj << +/D [1345 0 R /XYZ 56.6929 585.2486 null] >> endobj -1331 0 obj << -/D [1328 0 R /XYZ 85.0394 635.6995 null] +1348 0 obj << +/D [1345 0 R /XYZ 56.6929 561.0275 null] >> endobj -1327 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F48 940 0 R >> +1344 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1335 0 obj << -/Length 2714 -/Filter /FlateDecode ->> -stream -xÚ­]sÛ6òÝ¿B÷tÔLÄà‹_“'7uzî\œ«{jûKÄ E*"eÇ×¹ÿ~»X€%JéLn2Åb±Xì·ø„Á?>IÒ8-D1É -'Œ'“Åö†MÖ°öÓ w834 ±~˜ß¼ý ³I©H'óU@+YžóÉ|ù[”Æ"ž½ÿøðáþ§?ÞN3Íï?>Lg"aчûÞÑè§ÇÛ_~¹}œÎxžðèý?n?Íïi)u4~¸ø‘ }.}¼ûp÷x÷ðþnúÇüç›»y—ð¾œI¼È—›ßþ`“%\ûçË"O&/0a1/ -1ÙÞ¨DƉ’ÒCª›_oþÕ VíÖQùq ™Š ->&À¤ˆS)d/@žÆœƒ\cÑ'³/›e¹ ‹Î§œóH·Ÿiz_wfÿ¬«öìÞ<Î8O'™à1—B]à“f!Ö6=²¹¨Œ®Ëz=+ §p Oy~…k„ðÀes%ù‰ù¦l§3™‹¨ç‚fjVSžG+³èÊgS½°yj›ÊtSвŒ¥Ñ§=¢™ç²9´€…~3)žDÝÆЦ¨›=_šCµ¤!mÜ6ÏÍ|Ý•[¢<@Äj ˆ˜ó¸HaÙ&Œ¶9ØÁ÷&…ƒ.û]¶\ÙY³¥±ƒ…^ø¡¾^ñ°“WãY ¥ -óÅ÷:rÎc¦RîvlËúЙd”ÊÌY"XЧn^h°Õµ^›6dÌ^]€Þˆ‚û«“{Ø‚°ö¯„[ÂÔ4ÔŽ]ÞÞ,ÚfïÛ• Ý™eVmŸ–uí€Ë†Nϧ.”¥}q7õ@|y´ëmÊòìDãɾ™‰íuØð Ý™E¹zµ»Ð;«‰8jv]‰ÔU1o´Ã­úõÔÑ8î§W?pzw{ŸÌFƒÆîÑÆ—Ì?MT,ò,½nþ!Öeóï±ðþ£÷Ý“ÑÝû‡¨ 3y‡k„‰ý+3ž§C.æ(Åò^>ŠeÑKYU…gÁo üŸ¦vÈ[<׺^ZêÀŸ¶´†eaÚÁ}-Á¶zÿ5Áº±9)³XBXp´,uuØÚ pâ,É‹¡R½lLmÈÍd¹S)™¡søÑÇXÛ,.-ÍJªŽ&~wÊhØ3ìy4ºmjýT¹­@þ`Íƺ·BØ vúr/õë˜]üÎ Ü)GŠ,ñGÇè 3bÕ.é¯åö°ÅIJ‡Üš€DNs8ÇA´bR\ F÷+BlMG(È2xsÞÙšÀIp%T…ÁmÈ[Ymp†Ø:Stú€CÒ4k°‹Åáº%&y+%²ë–b]¶Ä y´Ê±Ò sÅ!¤Yr‡k„‰¡%Br£ò|Ƚ+xMo‰"=Ê  ]Ó¨óˆµé^šýgÂì/Ak¸}]ŠnB2¬Eæ,m\çá'ùYt“2·ìÛ %3Èë’l¨Ô½Yñ"µ -Š_4+ü ‰B,Øë7/2¯ßávÔoü’~ã(ÐÓo¤ú+V¿q€úä­~ƒ²µ$® ÜmhQn÷:yá#¥(¼[ :#Ñ“Á`ÑÔ¿3&Ö‡½v1¶ ¤rÖxá[5zi–À¶yt»êÌþ„òLKƘ×<¼çíɬKwj…©gcn‡¢·LÈbqðå1Þ:4©( ÅvÔæ¥rÃeÙ.šgã³6 ëÕ©¥9>ÍŽ2±çrIX -9w4Ž'UÕ¼xJO£#;yŽ¶”8tnÇB†Ç\üäIP[ÞK²éÑÐKµ]³£Ôg/>ßïMnOw>eyvþoMÎOxÑ”,_vz,Óo;½ëŠÓóXxí¶ƒëbjØ^­?Ò¼ø=Ö§õGš±6ô=H@ì¸gç>!Á•'‡]5ëµÕ–_Îß‹*LáýÕ…dð©LÎ|œÊ¥ËØ1K ‡HDvâñ|2›2tœyÿ΂¸ ·QuÜ·áëâvÂq ã6жqÛ&¹NÙ:—³7Ã49ìP³Ÿ$Ø3}±$E‘LTªb OþWÚho,‡87Úÿ“ñ8eir™íc@Ë ýŽ!©™ç²BC=Z„*Ø¿ -—< õ ”&u&Ù]~¥b&Š"ðúVåÝyàéÏÆq§ë‘s0)Ç,žöë%¥K3…ý³$SÃp¹7m;â,YÎp ÉdñWÔ[ÄÅUå¶g!ÅsåÎáæÙñTÀt·Øœv&IûÿÁžâ78äB²€ñ€I«™çɳ8“Â7Ó¨Y%3J±œ2v­ƒu~ ¿©í†Á´Å“­úar̵fIÆ£; ‚±  K³ -’ˆŠö’à‚©¼æ iw”nÛr]ÇŒ;RàK`êtͲ4–¶%ZÕCSÏj³v­8Á=y¤ >zNÁšæž$Ÿtë·ÙT\Ø´¿Üh×´%Õ¸`…P²OA¹*³´5IŸi æQ8åþHÊc‡e;VY땹Ûäå}G0t2rkyÏEÊüM³·µÍ€Jpuéº0S¿îŘšPJwŠÓŠàçm':‰n ~½,ú›Üå– ¥1g¼·è ²8„†o5è8‡;†Œ›Ã¬Íaߤp÷¥œ ç–WœòĨ—K×ÁrØî°ä‰ZÂ2P¤‘˽lJ”C˜~®{Šc®|©}1ôêSÉ@}%äš°¤Ð§å“×­KCbŽ„Ëk?øî‘ùª1uyC^Bña4æx|Ňa–B(ÿÓ^2¤º\³·ù»1™üC> ß -õnLåÿ$€ó–§ïh"‘’ý÷ëÜH‹çɱ/-„[š» L}8[nðØ‚ gôuýmkqØX5¾¦F ¬©ñ»„«A,vd± -Õ-ýt[D’ÄøX‹ŒÕ¥²JF™R \¶ÛÐ2± óua|û0щ Ø3ª¨KEe•4² ˆžM˪/ïñt§û°§t´2‚:Ñ€Êh¯ð«» ¹9þƼf_óõý/*μŠ:»;Wê£þÔNUÛ~ªR+Ï»`÷o9öƒ®Lbüv¤¦g}ÍôÝ?ö WY )¼o@åC…-=S6-gçM÷«ð9ëÿ‹aèendstream +1352 0 obj << +/Length 2983 +/Filter /FlateDecode +>> +stream +xÚ­]sÛ6òÝ¿B÷tòLÄà‹$8yrS§çNëä\ß½´}€%Èâ„"‘²£ëÜ¿],@¥t¦7”‹Åb±Xì'd>aðŸè4a²P“¼PIÊx:™¯¯Øäæ~¸âžfˆf1ÕwWo?È|R$E&²Éã2⥦5Ÿ<.~¾ÿÇͧÇÛ‡ë™HÙ4K®giƦßÝÝO˜‚>ï?Þ¸ûá_7×¹š>Þ}¼'ôÃí‡Û‡Ûû÷·×3®Së…çpfÁ‡»Ÿn úááæçŸo®üñêö±?K|^Î$äËÕ¯¿³ÉŽýãKd¡ÓÉ+ X‹BLÖW*•Iª¤ ˜êê—«ö £Y·tL*ÕI*T6™±H¹×2KX +Z›åŠã½–Ór B-wóͬ*ÛÎÖ³/;»³ÇÇæi‘𜓘÷‰=Õˆ2g ¼PWöz&U1%A&ifnda7Ý +®/cú@»°K³«:˜zAÀº¬ËõnMëÊ–Ò¯½[Ò¸ <>Ûmm+‚ÛÝfÓl»––" hô®Á2 GäI‘¦Â læs (u>ý1QuvëGB¨…éÌöšë©5‹="hª[9y2UÛ4oêΑ6•Ÿ[5¯¬M½'èñý§žº¶ó®lê6°4^Š×²ªz³iMú[®¬ÝaX8©=œ^p>m7fn |5eWÖÏ4X6[OЬý<![á4”fžl¿ncÚwG¸kèKZƒ»E>ý÷u!@;ÛÒde[Á¡j‚¤È6ô”•­»j?<ÝÍÖ”°s‚SGö?*)XÎ$U’ .=Fž%œC¤`ŒM?ÙmÙ,Ê9ƒÇkŽ’·ŸixWÃM¿ÀýDï‚™”h/Ùe?©ÎûiO…bÎ+kjPï¬ô"œ8j& ÂjyY„žjD†¡£æ‰ÒE6âÑ›°˜öRÐÈcí­a‰6úb«=!›§¶©lwͧî>gÙôÍKÙìZ B ¿¹ž)žzÏ„E-p'ŸÓ×fW-¤…ëæÅ“Ù¯›’p ï®9ÆÔìÈ$EÛì0wQ¥ðØ9Yð¢%ä’¼qM#€¹™Ђ\ûëâyš¥ +ÐóÙû:R²æ S÷+ tí:Ûb¬’¹Ot¸aAŸÚ 0˜gÛÆ‚¹£‹L¹àã¯AYÛ=Ñ–p5ƳêÝW¦\|÷Û•sÓ¹ÀA{Õî`šb,  í®A¦.Ö¥»q@7õ@}zºé}ÊÉìUØî‡Â$c±ê——Ë=ÅŸÑæj6Ö(.ze÷!lz/„åp§¡/'ôÂŒf»ßQJÁ–"Oր䉯œEã”ùJ…‘È3ÚœðÎ%4aAÖŠIq†wæÊ)$lmG$.Ñ‚A4»žLgbSñrª6È[ïŠÞô…:ì|¾û†'2–héeOŒ¨.xb Bq,¡Zºà‰2ɸº,B a˜‡¡(R9”nbfðC‘´ع« BF ¶Ýk³ýL”ýh«n‚Îå6!¤U¨Øœ&7žê“Ü&%Õð.eÉzŸ4+†VÐ{/2gŸøE¯Âï“€Ò)¡ƒys¨-½yÇËѼñKæPdÞ_oÞÈÍgœy#€æìyCxrù´×$Πâ]fñT=º€lƒ‰RÁŒcAtg@¹ÍÅónk|Šƒ%®ÝðÎwá[5f%ïL =½YºfdÀ å¡%c.˜nÞËödŸK¿“ï +ÇÎBÉ[¦ä°@·±-]<“Šò? )µPÛ×ʃ‹²7/6m×ÛSKc¼š b/储Jîyâ%ªªy œž<…oߎӅÖP¢A«MFéØÔ£#ÐLóèJÐZÞPDrÕÑ0Hµ]³!ˆvê‹—PnÄ禨gºP±¼øð÷L±wx5T+ŸyJˆ$Sâ1/¦:óz*êç–Ðþ ÑöËÎTø6’r_!±%ʾ ä|Õ4­õ, }j0qö@IïqˆÃœ½'ÔáÙ£_-|]è]Æñ©ˆ{‹%FÁ§%6D`üß‹Ã "¤€—Óc[/©GöãTYÜß,¨dš)Y@œ=/¶øÐ90f®›É?0xñEëv gÇSëæ\$Šƒ¿*—ÆL7_H¨X’i&þ†ßPA›”| ¡3ÌÓ[äy’Cì ÷àž«dNU–·E÷¼¸.Ìá7sïa0lñ•Éõý08”[³4çÓ[Zq`H³ +ꈊ֒›à„­‚á k¿•iÛò¹¶^¿TÁ6ÁôÖ5˳Š"=´”û¦žÕöÙ?Æ Ø#_ˆÑϤmhXòÉ´a™«Æ…«üË-¡6M[RKN ‚{÷T®¢/K×–ôŶ`„“Ond9,Û±8áœWj¿؃ÈÛŽpcåçt/EÆ"úU³¥ßZb.ÑÑ¥‡‘Xýu¯Öýš$¥ßÅ[E´Œî-.:Þþ zYô'¼//%öJcoÑ}‹~›¨Cl|Wƒ7çxÅP0å¾"ŠÃþ¼T¶áØÉú&þ¥ f±ðoXžÚ¦¼!Ñ£°Œ i¬‰]•¨‡¸]Æ|S‡~hªÉÈŒC3äŸaÉ ;¨`[çÆÌ< _Ú~ïGö«ÁÒå E ŇɘëDjÁ‡Ya–A&ÿÃZȤÀŸxGçì­~7¦“¿q(ä[¡Þ™ÃÄhÞòì $rrÐßù·û±iò´–ˆÅ;²-}N¦—8×qòð ÎèëŸÄtÝ8Ãw€eÚj¤À¶¿+ ¸È4m& °Ù5ýxKDš&ø(°Ó%Ù€R[%§…R)¶[Ñ4‰ €ýŠ¿)ÒëPbAtTÑcNE•T8ƒ˜NÔÐáãîÞöaMéytÿut¦Êš`ðo½ ¶IÎý}L%åèÏìl,ë/ÿñÁá/3éZ‹ñ>‹c-Š¼—Ê•¿üXöTê$Õ"þÔüendstream endobj -1334 0 obj << +1351 0 obj << /Type /Page -/Contents 1335 0 R -/Resources 1333 0 R +/Contents 1352 0 R +/Resources 1350 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R +/Parent 1356 0 R >> endobj -1336 0 obj << -/D [1334 0 R /XYZ 56.6929 794.5015 null] +1353 0 obj << +/D [1351 0 R /XYZ 85.0394 794.5015 null] >> endobj -390 0 obj << -/D [1334 0 R /XYZ 56.6929 769.5949 null] +394 0 obj << +/D [1351 0 R /XYZ 85.0394 688.9861 null] >> endobj -1337 0 obj << -/D [1334 0 R /XYZ 56.6929 751.9325 null] +1354 0 obj << +/D [1351 0 R /XYZ 85.0394 663.3646 null] >> endobj -394 0 obj << -/D [1334 0 R /XYZ 56.6929 369.5823 null] +398 0 obj << +/D [1351 0 R /XYZ 85.0394 285.7302 null] >> endobj -1338 0 obj << -/D [1334 0 R /XYZ 56.6929 344.1885 null] +1355 0 obj << +/D [1351 0 R /XYZ 85.0394 261.2794 null] >> endobj -1333 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F62 1050 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +1350 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1341 0 obj << -/Length 3169 +1359 0 obj << +/Length 3004 /Filter /FlateDecode >> stream -xÚ½]sÛFîÝ¿BoGÏDÌ~’ËéSš:­;­Ó:¾¹‡¶´DÛœJ¤#Rq2þ÷XjIÑqñŒ îb±X‹/J.üÉ…³©Ð…Yä…I­v±ÚžˆÅ-Ì}"g–1Ö·W'/ßè|Q¤E¦²ÅÕMDË¥Â9¹¸Zÿ–¼þáÕ/Wg—§KeE’¥§K›‰äÛó‹ïh¤ Çë·oοÿçå«ÓÜ$Wço/høòìÍÙåÙÅë³Ó¥tVÂzÅYðæü§3‚¾¿|õóϯ.Oÿ¸úñäìj8K|^)4äýÉoˆÅŽýã‰Huáìâ^D*‹B-¶'ÆêÔ­ÃÈæäÝɯÁhÖ/“߀œ¥ZXùEÛJ•…5óÛ -P†L3Eº˜§EëÐb0¬“:¨7+òÔæ¦Ô«ôBÊ´°V¡~ ‘æÔš[ :ÏH¿(aY¤63¥H­VÀ¹Çx{ºÌdrÿUr6ÕÐ4Ò³&S§î¼x¿©0E¡ '‚ýQ"ð/Ï·jñ] ZDg -t—a¤LE+UžŠÜàö.u…Ôžá«»Š•é@mùL}{ßnÚÛOŒÓ4ö“±½ï붓Ì]RwôlÚž¶÷›j[5}µæÆäûP‘N%f@I™Öbm=ÏÐÔl‘‹åÁˆŸgžc›’yf6%g\FfËÙÜË o¹ÌR©áÖ !¼>üîÚ]¿©»žÞÞõeï¥Y`  ×TkŒ”ƒF—J›dw*]Ru÷mÓù š¤™’^¿»xGïï÷ÕîÛòM®`m£í n÷›¾=Ž6h÷XFW­®;Zø»°âò²ƒ‡$¬›v·­›[š-ÿz <òpWáÈ]…|&lSõ¸xOc4Ë&›rËPWí>T;‚ê͆ç¥r³ùDo´m¿ß5ôÞ›ý°²¿«Ç³&ñ»æʆÖ§2iÖU_áÉA4ÊçvF#]ây®÷HOäÀuE@îìȼàÀÎZÍwq·>–íŽ OLÆŠTIp»Á¸Ø´«rC`S¢ŒD[W7=›¯ñΉ•ÝÌV ; ùÊíC…ðÅœ‰S€0.)ý= lGC+‡X㦦Îkžjw¼œ–1~»c·Ñûû쇚߅P·ä\ª5²'Šä_w“.‰ò bÃA žA¬Ë ‰?óÆ\  Ç…3‹äò亢ç}µC—胣ËIø.cZ.Ÿì6y]v¹eZ2á½EZA—¨0ÈÔ]Xêåã‚™¾ß׌˔©‘â]¼?õÆȪ7Iˆ\¤_H¿ô!Ä›]:) Ø3ÎKF>12’­!D;8 ¹;ÄØc§!Æ¢WõÎ_®«MûÀq©å•âÙq¦læ8И<SFÙ‚\ý$Á¹ËÐu^¨/É2 ÇpÎ=’c —1Éã$Cƒ¿´Yn;#›Û²_Ý1IÙ›úŠLŠO1iòÔ)!ÇL>¢J™§Ê ðfMÚ©!“ܱoêYcuOJ‡ÓÐȶ nߺûjU£=¯|œ'Ïëà,F»± ƒoÅK•ÉG‚-Z$§³òˆ{ŒqJª™H ´×­¿gP+ IE]]@9`ÀˆT–ežŠº}áÏDÝ)ÕqÔÍäuÕ±U‹ÔIó3s çóLL)Eñl(9+ÁZIúí=Ðé†d5býYEI05] %Êç]†ÔƒoÙî»@¿ïªÍ ‹@M;aèÃu®|¢§! Vï7õªîgØÉLjõóÞC:å”Г¹âÙs ¸ŒI_Léò´PJv~Ô{(4g‹¯Çä@ñ &D™£ÇL>æ=½.\TLÙIWmS‘²0Àþ¡% ¢2c%øQÊýýÆ"B -3V<ÜÕ+&íK(®y%Ù…JÎ!+’VAúm&¹Þ!JCäÔûý2[à2ÿdg‡||œ ¼zýTã äÏÏP‡WVÞÇ©60¬}"  Å«™ (Ÿ¥Î¿B¬`ŠË˜ä\¬0àA…=ìüx@ËA®Ò÷¯Çd ø“¹MUAjÄäc&i 晋Áí±ÆnèYyï‡÷~°÷ó –‘Þ áÓ8|®îªÕŸ¤^`Z˜4¢Œí붬›ÐNè]†¨ØÆ$í`…4à+ÿxEè¸oúšsº’¤ÖLà¦Ý7ëÙï­/%Àˆ81;Ú¨1;ˆàe¯`vù®d¤ëʇ€¤¿42ráH­¡'cÈé-†)Ê‹FHÛº©·ûíÜž5Æ;vo÷VŒ\À\P»€Q¬°žÒ9jÍ9¾lÜ´¨Û=EírH¹Kü¾ðûšz_ˆ…Ñ¡öõüÐáXUµçÚ¡®Ú–Þ†U>ÈÄ›MZhHìç®õA .]" ,2]*_*CSÌ:j™±]byÓSÕ…†'àV57…;4SIÅ$¹7Íèa†7£oý3§h0têù(ŽwwíCCà5У¬C+ä¨cª*´Œåm­N~ ð'† Ø‘aÂ[I¶0Mý[OÝPIs®ÉŽ«ml è`þ[¹NMÞ’qŠ“›ÉúDÆxh§úðD}dµS…P}ä3£ˆƒ´l1•–]ãCÁÃÒ¼º¡f¬v7¼{(–fPì”Aš"t!#<”g,Ì‚…9sšé]F‡Ø ±Þ¸®Gll—F7«±Ä^¾1rüI0δß3!’¿ì1‰¢ñ=@ú6Ð÷4$>培À /š»ˆº8ЋG¢D_ãÔ4Ïâcà,ÃSléy(ªà%ÎT‰‹G~„…:þ*p曑~w÷ì(~Š…Ÿ}œS|~Üú"LùbÉ)çøqÒ:•Ï°þorc\endstream +xÚµ]oãFî=¿Âo§k­æK¡OÛm¶MÑfÛl÷ÐöA±åD¨-e-¹é¢è?rÈ‘F²¼É]¶ùâp8$‡_²X$ð'&Ó\æ‹,×±I„Y¬vgÉâÖ¾= ³ô@Ëê뛳×ïT¶Èã<•éâfà²qb­Xܬ‰ÒXÆç€!‰Þ¾¿zwùí¿¯ßœg:º¹|u¾”&‰Þ]þpA½o¯ßüøã›ëó¥°FDo¿{óÓÍÅ5-¥ŒãëË«oh&§æÒë‹w×Wo/λùþì⦿Kx_‘(¼Èdz_~Kk¸ö÷gI¬rk0Hb‘çr±;ÓFÅF+åg¶gÎ~î«në,ÿDK•ÊJ5Ç@“Ç©‚%dàÍ}IwZ—›â°íhÐ5Ͷ¹ûD£ªÅ{¾~§E€Mª8‰^,E'"5Û°/M’è/j¶ÍªØÞ7m÷U0®Ë®åñß_bcšƒ|sý<> +ç¹Ñó|L€9"N%ñfíKwýŽ1ªA_S©ã4“6d·qnŒD¥2V™H©Uq’jÇ +⤓‹I¡â3Jáâ=0ED7ð_FGú(“Lf‹TÙ8wlY|\ˆ8Ñ9ŒHÐwà&^_îäâ›®³näÑ.¼î> SƒÀáÙ œ­Mœ[`Ww£4Ô4P‰\¾P¯¢Ô:¶JxÀæ¡«šT.³¨r®­›Ž'vÛrWÖ]¹æ †ä7 ½<ž²K§y,mn¡¤^&|T3“§ ýáE¾L5Çú$3=ð_Š™çkl+“ä½ýi,˜µÞRÿœÛfßm«–ßó‡®è÷õóxáiÈ4P…Aéh.lT¶Mݺ’¤•‚†ß\} ñÇC¹ÿDÝ]ñ‰W°Ž‡ÙfC“;00Èqt@spÕhvÕ¸vÝÒÆ_“\_·Ð‚Ú4û]UßÑjñ¿àà•ûw +WnK¤3×þ˜²ÃƒÀ'h­˜°X;îµåþrOýÇj»åu ©Øn?шŽíûšÆ¡1à÷;»ûj¼ª#w:uýZQÓÆê\DõºìJ¼9ˆ“fù^@ÎÌÅð>·Ä—d@uIοٱz‰Øã­Ð~t,›=#žzp8BH†m{årèîÉ3”^_š›…Q`:ÀÒ ‚ÓâþŽmÓuàÐzøe¸áØ¡ãEr>”+¶#@Œúˆ&‹[€áG®µ‡zŠ’#lÌ~Ô"™§¬E@Ðj[õœò +»%mÂÕfÍpí}sØ®C¸b¿/ê»@†®ƒê„’_J ¶.ë2Ò€ÂÙQKó°¯@Z¯p6,EGëU릲èÐÒ³Â=õ'î¬×Lj[2>²Ó‚逎sêÔ­K”èèrSR[¯x³'ˆ °ìgŽÞ)ˆ»¾kKät_µœb@òÚF…{ŠÐ ÛÒÔÊ=#è¬ñPå/5{ÞNÛ¾Ù³åèÜ“vSõ¯I"ïȾ”k$/É£ÿÜ—Œº ̽ˆ5û1h=[=”í]¶'î~LSV7μmºÍ¢Û’Ú‡rVÑùG›ómʸl69tò¶h=pøz`ºÃ¿ZRA«(ÑÏT­ßêøc½š~l«UÕÍ“êXèç퇀t2…r, “Û¿Íã2Dyü6a%6™É†“Oa3HÁ~9"=ƧˆÌ“ØJ«ÆDž2 lLï +0n'Y5uIÂÂ'ºÇ†:%åªè-ÓÌPô‡€h:ö¨_1Éã}µbÔ.ÂÎ-ï$½ÑåO¤EÂHˆÁõ$Úü4øNÞßm39ns-Û;¤ãÏ È›·?P‡ì¹{A[`ÉxÙbú}¬‘Rb Ã<áÒ¤Á©RµRªÂ x¹»`ŒË圻0þëáàÓ. Ìm®2ûiôŸ¢Q§q.ÓtLä)Ô±ÊLÎü¦Øà lCméŒöœñÃ?×ÅTÒi! 0ŽÃvu_®~'éÑ dVI>±QÅ]QÕ¾¤Ð •† áÆ(mPBšpÙ¸Ã×  {¨»Šƒº‚‹¯;ºvÓêõlŒ÷ÞåJs"‚¥å˜p< +w09|_0Ðméè9zÊ5>–’òñfÉüÕ½sq$Á" !îq|¼‹—q+š™à—Í(9|Wسê˜0( Uµ«ºê’†ƒ! çt8͔ӠÇ3âþA +€‡¶ßÛP > ܼ?æäþz.I#áË|ZV’9¥Ðîš?&3ý¦Ûò®ªkJ $©ùh=DêÒ2]NaB—/Iï±-¨áZYˆü‘©ðÆü”:Ê÷õlöw¬³¡h,sÖF'ô18óÌ„|L/ô +;‘@ŒžéD=•C€“ƒTc¡ÒBàÌ|‚1.C”s9„Šmhz°Ï$,ji¾‘=Æ'ˆD¯ ”Pc"O'FKË ÇxÑIiÎ&`Ÿ¤zVdo ˜Föø-JøøÕi‡31p™2Ð +ƒ,«gMÆœl=!ö,Ú¶º«]¦Ÿ’•…f ·,¨ƒ“õzˆifdÄ[M-Cˆé;†% +ŒF@»ª®v‡ÝÜ™#ÆWïOoN[“ŒŒÀœ[oq‰R³–Ÿt6ÍRw‡QÙ bî¿2¼Â‡¢òB¡¨\Jß9Veå¨vH¨°¶£Q¿Ë¹™ð°I ‘ÁàW2êqÆàúTcÆÞ]ÙÍYœðæ-Õ…‡š×]°’<©ãaù¸/2≠µ}EÚÕ©¶¼ +†­à†%ïŒäþwW‚”ëªü³#¸»‚tPÕŒ†ZÖ˹[‰Ml䋺\ü´‘È1Ñ´±x-5-1EhªEÊz €Å¦£«õ5O€-+®;&v¨§z”’Qry0XQý +F§ý³ÕIš/‚â|{ß<ÖÔ½|w(‰µ Bi…!¿QÑϽbüD1:PLÔ°†)*á:ìNùÈ›3ò诫LæuzÁÅܘ«¹Øª¼!â‡)&£u¡†ñÑLåá:ßj¦¡Åóg†ü[&ŸrËŒžññ0·0²®i† ËûÓ5Ÿî³¥3%–= ­ ‡üŒ™™33gÔjú–Ñ Ö½A¬öüQ¿±±b¼`¬­†›|áOÆßö‡/Šôm‰¢¨1i3Ÿý¥û8ùú5­\¾Ãa$lº{Xê:–¸'î¯ãŸ›¸o¾»¸¢Þ¦Ú{b7wE)—orÊ7ñóMüc|S/ä›z6ßÔsù¦žâ›| ßäËø69@`Ædáu±Þà® 'W2|ç‡=9 ²jE×[¥S¿©R&Æß“ÍTÞ“þÇK/þÙÚð›,[{ê³y ±€„‰r¿h9újÐÿ¾í˜ôÿ]ýЬendstream endobj -1340 0 obj << +1358 0 obj << /Type /Page -/Contents 1341 0 R -/Resources 1339 0 R +/Contents 1359 0 R +/Resources 1357 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R -/Annots [ 1344 0 R 1345 0 R ] +/Parent 1356 0 R +/Annots [ 1362 0 R 1363 0 R ] >> endobj -1344 0 obj << +1362 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [242.0197 602.0286 315.2448 614.0883] +/Rect [213.6732 532.1015 286.8984 544.1612] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1345 0 obj << +1363 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [238.0484 522.6184 311.8142 534.678] +/Rect [209.702 453.3093 283.4678 465.3689] /Subtype /Link /A << /S /GoTo /D (topology) >> >> endobj -1342 0 obj << -/D [1340 0 R /XYZ 85.0394 794.5015 null] +1360 0 obj << +/D [1358 0 R /XYZ 56.6929 794.5015 null] >> endobj -398 0 obj << -/D [1340 0 R /XYZ 85.0394 673.0194 null] +402 0 obj << +/D [1358 0 R /XYZ 56.6929 601.5665 null] >> endobj -1343 0 obj << -/D [1340 0 R /XYZ 85.0394 649.1998 null] +1361 0 obj << +/D [1358 0 R /XYZ 56.6929 578.6548 null] >> endobj -1339 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F21 702 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +1357 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1349 0 obj << -/Length 2450 +1366 0 obj << +/Length 2639 /Filter /FlateDecode >> stream -xÚÅÛrÛÆõ]_ñØ ×{Çnò¤8’«L"·4;Žãˆ„,N@‚&À(Š§ÿÞ³7`q¡$Wét<–‹³gÏý’`øG!‘ÔT'™æH`"’Õö 'ŸàÝÛ3âaæhC}¿<{}ɲD#-©L–·.…°R$Y®?¤Q4 8}óîúòêí?糌§Ë«w׳98½¼úé­Þ.Îþù|1›%Húæ¯ç[^,Ü+éq|uýƒÛÑîqéââòbqqýæböqùãÙŲå%æ—`fù|öá#NÖÀög1­Dr?0"ZÓd{ÆC‚3vʳ÷goFoíÑIùŒ(“tB€”M Ph$¼2¬š»â\)–ÞUuS›%M«ÛÊÝc½9̈J‹US>8€UµÛÁÏbívEs_~u?î7eé öîØm¸!_¯ÝN]µÛr7Ñ´¹Ë·SçÛ¢‡”ñJE½¯víÁ¦2Â Ì AZÚc”ôùX6~xš`µ«·¸)ܳ®À2Ø^_r ÌàÎfTYÜ°ÜÔp\bœ~±×K2Áx ÂåQV«¼4Bý.ú <Õþ÷¿¿›âàË£ÀóÁ…îŒ{ êPÏ£­§‰À€p±¨ /‰w‡5ˆj÷É#a}$”#Í ·HþyW}I‘ne³Ù—F†R¦Þ<*û\×$w»1Ds<ì¬ÍÀëÍνÉ=Æ|Wß[Ý™w{·ÍÜÆGs¬‹ÛcéöÀìlñŒé§c|Ø{ëir˜eZÝúÃw'HŸPɾÌW–j΀j{-çly“¶Æ ¶ÊÀV—ðn¬Â¢B*ÀoРye„?!y‘ÈÀ[lÝäM±-v»r_¶ë¬@HÇÞl¬?„åž-•­Œ¢í¹È”( Z¤¨Îú&n•¦“»Gd ð«'Þë„Dpú¾ððyYWnÕLËMe¹²~8ãS:”Ù7Ã0ͨDàÕ"Î -¦LÀt/Ÿ·XD¶…ŸÇÆvŒ×Ðñ¥Ó‹M5Î Ùˆ& ¡FiÖ£ië[¨§(a3” §RÆÁµä!¼eöåùnJôaÀå%ÚÚjL8Ü$•Ê¡(Ÿç$= -Ä)5òæá<ÆèX쑆1’Y&º‹­Ò÷ÅjÂ0(E‹àMŸÖ…q‘ŒúíÛª,«ûú[qA§‹~.ø°*óºv‰ÞEA%AüE-T,0Bʘ‘˜ä¦’a/–X‹q£´"ëG@5" `†ÈI¸"cHÌ='h>4ûb‚mˆlDÒ`'¨Çµ9b%ÿD®Ƨ¸€Æ_ÀuÜçZÀ’‡xþj]móÍnäؘ I˜øóo1>Á8ÃI ì5ŹFàuºÏy—='¸§ˆ?bÃta¢=²ŠŠãͤ&4d橼¯Ø­ÍŒ¤~iüyc¼´X;Êgvs`]Üæwü‘z2z)ðÆ,(èüú_Ó¡AjØ@#Nyâ4X4´/Ú»ìË“´é˜6u‚¶Œ!NÛ¤ömòqÚ¬qF¼!a2Ed¿Œé“Ò­„ž\ó#DÇ_(åS„c†Í#ê/dsàŒ²hB,p^7`&õ¯°&>™èÅ0Ëúæ± ´•Å§Ü×î¿åå±hƒôa‚8¥ƒ`OÛ$¤ÀL·å•/U¿-¬?PA€Ã ‰gø.ã -ePw÷½÷¿;1u¸LDw.¿ '†q305çYœH°D þÍ5…ì"2Á|~‡|9(4&ÖÒœ@½f€ã¨àdØ Àk[Oò`‘—ínÿa„¨ŸÀáÐ Nÿ¨vÅTEoN•ª›‹ qåN,˜— Û¨’”êî>Êpâ´þ@è”iò„þ -**œ[ò¤©¯ÔŸˆÅÞó­þnûºÚwÑ ‹d<}Dê;/Q'užï8û -”áÄi©C¯âOH]H¤2¨mø°*7«ÿ™Ô}æo逫ãn=w«›;ÖÅÐ9®|_è§a¦éµNL‡¶o‰ï7ÍÝ “41þËb—ß”ÅÜG¹íx}>0-é>ô«4Í›>)®š_UÛýƶ• ¼Ú”ÛÂä.fÛïß··RÈË»M³±¹‚áa¿ ¯m¿ÇkçC°¹Í›ÕÝ”XÚdibŠ3ö.¡öõÑ‚þÑÂ>q"£z™¡v¶ßÍ ÿ)‹HXÖ>gß%qC;jli¦Àm5Å CÒm1™(îûÚËÊÏüŠßóí¾ty|<Ì£P…B| _¢y^èñzš÷•©ººvOÛáØÕ¹{¸"̬^™‘ò” °àWn?ºËÅÆÉñ_åÜÙÏý„‘þÜo0²ƒnLgÚÁxË–2]åǺ3·‡xúÕ Vef +7B³<šÕùÉ)ŸlÇx^Hfi„d0ù™.ìÜå¿yT]QÙÓ…ƒe$nCN°©èŸ ŠLÚ'"wúxk¨µÈDŽŒ„É1šB˜Ð¬¯€¼¼Ïêþˆøtä}$ËÙ×y;Gƒé±Ÿéã?É­‘ó.ÇÓ¹q½Ì!©uì“IÉ´N×û}‘[Rºæâa‚·vþj…¤fƒà Õ ".\RnŠúîB¡Ñä”>ïà &[ ~²à6qˆM@¶ ¾ rû}‹P‰²,êÖÐÖô °. H€¸8u)Úxâ:0$ ¦ÿ¢I—𗦣R€g`âD0„t÷può9!s­™ŠÖ–×NvãõÕ–&?TÀQ1ÏcÌ–)Ic/Ufà÷g/´ãé -Œ™3ƒ7……YŠ²ÈMp2?Lž6OW˜•“â\wãaÙ›ïpcòR·F<ƒ#ÎgwËa‚£Œ´u4^7÷­«Âf­Õ,êã~o£é.ÜŽ­qLX™AýP¬C`3s)À “˜¦ ‘:½1ä=¸5tàéÂMè€færã1;€‰ó+÷éDû¯#:5å–ÁY†C.þꨎ‚Íf[Œ °ÅÌíƒï–G STйæï½Â.Sî£<+üêŠÇ¢ƒ¶BÝÂÑݸJ‚R‚*­’؃^æ”Æû…£ùŠ*éñˆÑ÷s–i5Ý 0ÍŽ¢÷qNøsËRô¸óÚ˜ -u Ú Æ¦>àäÉV󹟟;ž¸™():]”ùâ¢,KtDyøN=&ý?o>¤Uendstream +xÚÅ]sÛ¸ñÝ¿B“'¹sBðIÉ“/g§¾¹sZÇN'—Z¢mÎQ¢"Êqt™þ÷îb¤¨Ø©¯ÓñØÁÅbw±ß°˜pø“Ì0®¬ž¤V3Ã…™Ì—G|r ßÞ 3 @³êÇ«£—g*Xf™L®n"\ãY&&W‹Ó7=ùÛÕéåñL>MØñÌ$|úãùÅO4céñæÝÅÙùÛ\ž§zzuþ/OÏN/O/ÞœÏDf¬—Ãgç¿œÒèíåɯ¿ž\¼úùèôªå%æWp…Œ|:úð‘OÀöÏGœ)›™É¼p&¬•“å‘6Š­T˜©ŽÞý½E}uKÇägTÆL&Ój PðŒYmÓIj,K”TN‚ÿ~LLfR1‹$Ï„`Ö}|y°0)³Jfæê®™$Éô¦®ªú¡\ÝÒkñ%_®+ÿí¡¬*Ý–ŸýÜæXdÓ"oêU~஋»üsYoF?؆=ªzž{Dwu³¥Q¾ZtS ë=%m3ßV;š™×«¼ Ç7 “>­ŠíC½ù½=þ¦ç¸ƒI¦%b5é´)—e•ohr[û§#Îôˆ‡·úfð9_,ˆ–¦¡‰¦Þl o¹¢™ ¹ÉT3˾x*.‹f]¯š",+VÛ>Ÿî‹MYxoÜ&õ²Ï§£E)äˆC’#Žè”ʦ7ùgd'óÕŽÈ>[}ÑâL'Z÷ Ó¤IÌ~%6Æšž-øÒ²ÑR1ÂO Ä ¸3Õž}&éìa*§Ç@ ¢<ôâ5 Ö´ì&쟓5LÑNd’oi¦É—E+0¯yÿ á#°<¢}p0Ñ‘ò@ŒVõ–×=Q‡Š#3í™ûÀL°*ñ¨Χ_Ýö‰a©QºOÄW‚p‚B}½O÷~cp _¿ <l8p2ê58ÓT‘—B×,&4¸j//›ÂKâÝf¢¯3ê©$’„äŸw…ó +fº¼¯¶e뜼zÔî¹h$§Ùb{¿Y9Ïå*ø¾jÜÙá7ï—–ùŽ&®=šû¦¸¹¯hÎÙ.áÙRÙÊ ¬ÛÄuÁ2 1¯'r·Ü9xDÚo}<ñ\'$Á§ï ŸWMM£í¸Ü²B¸6AÁ÷…¦4ãReöÃ0ÉPF³$50$&9×íéÛævBƒË(=à³Þeý͇X‘ˆ÷à%éP\zE6¨†i™0¥LÖ£h/Mi¡!dRÂè<•%´‰îû¶“Õ˜ÜÌÅR/ÎVQcÂ…DP +À2IÓ§$l’Ù,ËÆÓµY‹q£$&{ÄI g­»Ý‘¯‹ùˆZHÉ47ÁîJš ù#ÔB?MIXóÊû[¥åi}˜WyÓÐF¦·Q ù~£ª'1-!ùþ4dáJiû|‰Œ³¥“X8áÂî6véFÛ‰ù\–ùH’ù°Ý­‹®Á­‰D= @1Ó‚H‚áñOcºÅøÓR¦,ÑÊ>ƒë¸Ïµ¡úÅ¢^æåjÏÓ€–ZcíŸÇx‹ñÆ•4Ðì1þbŒs˲,µ}λÐ9½d2Ë’Ø7ŒgèêQ=m0!²ÔsÌ… d¸˜¹šÌÛŠ›*ÅÔÑžK´ÒbñÌd>®ã‚Eq“CÔñKšQ÷U]’³?¹ø׸kH¬ºË—yâ ½ÞIë¢ÝË}Ú‹\ãëÑfEÖìû~£„º\PtÊRÄîî æù}S„žÛ.î~uÕ$® 8:9ØåKÚ6žQHˆÉ÷tñZ!W]ZÙ;i%(‹©ÛP„#lZu]»ÀûdÍ‘Ó£¹¿AjBÇ‘ŠÐ9†<9c\ÈAžœWù®é·ˆ;Þo9×ã: mç¨1½/Ƨ;úØÃpä‘’;G·çöSfm¡v×OnI&h{ƒöZà`½.rGKW_ìF˜kðp®”‡p‚éÀy‚Fm6©Ê¢a‡® …ÑLiý¤6”P![£æÜ™¢ÖÁÓ]rX1pÉÝý,&ç=×Öê¨4|¶ˆ0sÐäÛ.¢ƒ0 ñT„1£d8ˆwà.Äô +þÊééP0€S  ÌbOõÃäÓD0®­U§ÜÄËó¥œüT?“ˆ¥€w!v,A(‹›t)¶œ0M3XDÐ-Â9(³؃ǼG›¢*rtNø‚aŸ”~àÈ‚Fim»öpÒïkqÆeb[>†%¤ÇÇ’wý‹e '©hk먽Žû-êÂæ”ÍýzŽ« šq)º•cHŠEpl`pÄࢻÀ‹w¿k§×HÞŽÆPƒ#¬ÃÑu@1sVzÌ0²~NW'ÖߎØ)f[ˆ³ +‹ÈÿÚ(‚—m¹,ö p¹ÌÍÎ×Ëðçs´Ã,â½—×¥]êÁ“,ø©Ë‹[Òå3¼Tà ðìö“$›‚çCìçy‰¶o,èÌw$Iú ¥Y–X9Ö»ç“GË¿§þCCçM4öy2yà6"$TÊ0ÀEǘìÝ<´ÿúÀ"âÿžóN»endstream endobj -1348 0 obj << +1365 0 obj << /Type /Page -/Contents 1349 0 R -/Resources 1347 0 R +/Contents 1366 0 R +/Resources 1364 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R -/Annots [ 1351 0 R ] +/Parent 1356 0 R +/Annots [ 1368 0 R ] >> endobj -1351 0 obj << +1368 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [325.3322 596.1482 398.9856 608.2078] +/Rect [353.6787 530.3947 427.332 542.4544] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1350 0 obj << -/D [1348 0 R /XYZ 56.6929 794.5015 null] ->> endobj -402 0 obj << -/D [1348 0 R /XYZ 56.6929 666.7383 null] ->> endobj -1010 0 obj << -/D [1348 0 R /XYZ 56.6929 639.147 null] +1367 0 obj << +/D [1365 0 R /XYZ 85.0394 794.5015 null] >> endobj -1352 0 obj << -/D [1348 0 R /XYZ 56.6929 513.4583 null] +406 0 obj << +/D [1365 0 R /XYZ 85.0394 600.9849 null] >> endobj -1353 0 obj << -/D [1348 0 R /XYZ 56.6929 501.5031 null] +1020 0 obj << +/D [1365 0 R /XYZ 85.0394 573.3935 null] >> endobj -406 0 obj << -/D [1348 0 R /XYZ 56.6929 101.3093 null] +1369 0 obj << +/D [1365 0 R /XYZ 85.0394 447.7048 null] >> endobj -1354 0 obj << -/D [1348 0 R /XYZ 56.6929 74.6262 null] +1370 0 obj << +/D [1365 0 R /XYZ 85.0394 435.7497 null] >> endobj -1347 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> +1364 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1357 0 obj << -/Length 3401 -/Filter /FlateDecode ->> -stream -xÚ½]sã6î=¿Âoç̬´â—$>¦»Ù^zmö.Ioæ¦íƒb3‰fm)+Éɦ¿¾êÖ“v:sɃH$@Ðb‘À¿Xä&N”Õ‹ÌêØ$Â,VÛ“dqcߟƉR4Æúîæäý'•-llS™.nîFkåq’çbq³þeùáŸgÿ¾9¿:¤I–i|™4Y~wqù‘ –>>_~ºøþ竳ÓL/o.>_øêüÓùÕùå‡óÓHäFÀ|É+™ðéâÇsj}uöÓOgW§¿Ýüpr~Óïe¼_‘(ÜÈד_~KkØö'I¬lnÏÐIba­\lO´Q±ÑJÈæäúä?ý‚£Q?uN~Ú䱑:]DJÇy -kÌJ9‰R‹2cãTIÕKYŠ9),”ò¦Øº¨ë6ûÛ2‰µNÕb¼æåk†´‘ÒÄZfé”öµëZ¹–ËîÁaC-«ÝöÖ5¬ïèÛºU]­[Bèj®ŠÍ‘Ë‚Fp'aBó)«u¹*º²®àüU’/‚¯Ë¶¸Ý8^W+«S±¼g¬_“Ü<”Ì|A<{âT9´…Ô ÜÌåçFo<Ò‰‰½[c¤ÇmNE¾„]m·®Z»u ÔÐÉòÆo -´píîŠÝ¦£N ¯Çô¨„Í{úi’ÌÐÇó‘*àà®DBknËj×¹–H# ¨ÖÔèÛâ[¹Ým©óTlvî5v²,–VI&%òy~ÒX'bÄŽ:d'>0=ÖïL¤±•&{ÃFX¯AÀBF`£Qå5jÖ€%-­}~5ÃÀÄ ˆ@5åàæԂƒ(¤aíXïV(n©—•ëžëæ vMq‡ã¿&‰\Ñ8Œ•ÕŠæ­#È£kîêf[T+÷!–†z#Ú®¦‰-UîLæ‰1‹ª}vMÏØ@¤a3©QSõ>çž Ò‡æn4×Y0¶dÞÚ”ïl c ~xõ¶G͇z× †·o/2¶‰–ó`à«¢ªêŽ¨¸o+çÏÚË«xanP…½€E‚‚(Ôs¹Ù›¸eÔ–8øÍ {¬æ4_ÎVÓ7coÊ”ÀwÝñ®›bô¹g ê¼.¿wÔ%¥noY^wIc¬ã.©Ç -’>î‘4\*Z毓ï±fèO=ŒJ-¦ ðålÒp¤ãûÀ[0Ù4žÊÕÃdÎÈÍà8cÚßÞÐ$ϳ.«¢y!ªæcÝ–] ¦÷ä •Ž(R2÷fçuF×Y¾§2Ãý™kò0ð­+$š›å³s_„Ä2j¢’DZ¨åAý‡ÓïhöïÎó\t[¼PcUìZÆ,üFõëÎ5¥còÏ`ϵk*ê_C” ¢úï' IÏ.~|Gso­ˆ›L¦.9Q*_nê¶Ã–%‰¶¥Q n ´xëÖ%h3\]µþX±;owx`ˆ[0ôòš¾þRÁ{¿}Áßû3j‡†£¢I^ÀK½Ùy?=Ù Õ#IsåÚö¨™\Å©öu;c·³ËÛYYEM]wíalc%Àz^%ÝcÍÐV{Áš´ZL‰óÍ‘#Á²ì:Jü’ˆÈ—Z6ª–†º‡¢£–WsDþuWr$A£l¦9yº˵ݯPÍ÷¨Ö„rËF(5øš}#,V+÷>9þSÁm>–W’ƹÉ,_$ræª1±Í £ „Å `Bâd”MÌŸÉ×TîÓÏ|>_K0²‹'q|-š—ÀZܤûKE;ˆŸ€¤z¬5½A ÂÄ©„{Þ@à¬Ò„Äz9’†IA©¼Àb£úãói” -*£T.ÏD‹*8Ã…†Ë]ÊÔ'•‹¯ 'ÚZEX£¶ßí x±•‹5ìi1ÞVX9/í÷Íñ[ÌäÀÆ‘S»ôŠ–o7R#ºÍPÑ—³hÙƒ×6ƒÌRѱHÿÞ)©–´ëGCŠþ÷t(wƒh.Y¦^ @†Zƹ"u;îÍz,â•÷\Xåºì^"ïþ¡wpþ™‰³<—‹1CÏ°fø˜x6`7K!Èœ0rýèV%æ(þîËB@eƒw ÷nYx® Æ ¼ØÁMé}õŸ\E(/¯¯Ï?v^±¥ñb×Õ[Hd"rQYçR™©‹ZÁU÷·N—÷®r ‡Ð-ZþÒ‡W&·¥™wø®_ªb[®¨³{\Ã</Ø}Ù+ -Ÿ€JiÜ€¸P¨4Øܳy]N¡ÇÆOáp]ŠáVœ;pp“‚àxÇ‹hBõ«q’/ˆÿ å¾=òÝäË-o†þˆa¼œŠ¾~Ä]<™Ò¾u LÑ ÆgêõnƒñK"BPŠÍv¬”x¨Ÿ©±©«{jݺ»:°‚}Ïê µé¦¥﫧è÷I‹Ñ—†{ýÂ3UË‹;õ)Rà/š ÷ˆiÜ ´§ ò”¼éÉ&oÈ#òŽÅ{M 5â,_=ÀVp 1Þ&’®oO˜NÀ/3È'0 ƒ ÃÀlàÌÞPV_6zÃLø¡àŨǦiš÷/EEC}†ÅkXµy.û»éRf‰"}}^Œ - -±øMðFC踜Ù؈g›Ïçï:‹¥Èr¾¯Õ\ö.tl¥!ïÖ»/ŸJTWl£…ØŒO8Bm쇦Lxwߌ&ˆ÷’ú¸,ê£Q¼G€ yt|þÔ‹ÞH¡ã ‰°Ô‹+š–Ë#2ÊfSåõ•†4M†L¼¯5x¹åqfS5Š‡¥œšÊ -cI.õȾÔ#¹|$1ÿ­,ÉUxŸ>T$—”$§€ÐÀÓ¥ÖØä=jàbµk^uûDÃr@ }H(9Íè×6å¶ì«ŶÞUþÖ\XmêÕ®M|qÏXÜ“‘ìetX¦A÷oT¨» ö4Ì*LüC Ý‚H6ëÖcš’›@ÀÆmÇ°ÖAà ¶` å#UÒû„%ÔpýùŒ ƒÓ§>ñ,¬R -’©W(!$DfY6)'*É2T;áÄo7¡8ËáÞó%£Òýj¯¶ýT4e½ã¢žk³WŽŸ”.õ£¹)Ä£«¨7j@c¬ãÑ\Ž‘M:ªêµ;ÌQSÈ -r•¾ÎB5ÃÃÄß@¬Rm§LøHî!BP&Æ.BŒB:hûóâ—&Õº…³æéîÄL•7@ðן¤/ä뮨º°<|€€Âà`.±¹Ý»'½ïŠy¿“µCë¹ì&C•{¦‘ÿ:ÿß©ìÍCþÂŒ„4ÕŠ¾Þ)f«°"‹­’Ù±LµW#•ÆBgê 5a½¢Fk_‚cÑ¥<Á­g¯óÑcÍ02Ù³±Ì§| š„ -üœñÀ±ËC½áWŒ^› íµ ñûѽŸê}´8°D˜k@¯|¹Ë? •%R0j«Rj¯ö^èºðìÅÊçKÎárý*X¦ ^Õfõ‹ù~C¿x{­“7^ÏÆXÇõ«ÇÚׯîåѾŸYÈ…“ôuz¬&»Mu,29eaP-«)&Òpøåit®>Ò{¿¯°ȳJ-tPÖÐãôù! -Z|úÐâ虣+½üâ˜Ú(æÒûeQ ¬´*ÕFcQäX¡ú˜hØ(øððÎkŒ2s/«XYè fü^Ú£m¦Ä\o:ÈÉë`V¾0‹¦Ø:ŠµE¨xCà L„moë'Z„ChAGŸI -ÃXF¤ûY`Q~åA7Æ"êý"mw3E LOð¸º+²ÊÞ¨±^Q÷€ÕWŒÝ¸Ð‡‡wýcù,ØcwÍË!ndåøÃÞóÕ-ôX3{˜dåÒ¥åt7ô, -ÇÙuK¡;ršøá! èîË€%¢±Bߺ‡â©ô!šRKÊ*¼ÖÞoO£èe>ìH=È|Ýa¨Ð¼0–æˆð(š„Æ -ò½ûþç H¨êúɘåÆ+&´»¦¨Ú;~DJÌòçIb¹†O”×ĹXž¨[;JŠ,ófCÙ ¼h&ëÝÊ;¬„CŽ½ëž§÷Öœ$Z”Ãôö¥ŸD-Ääp&p$¼îÚe»)ž¯„å׳%|hA:]Ý´!céºTOÔÂg-O!`fÊfÀ‚\©=–ÛùºBªƒh3dP§ÊÂÖ#vx¬¦¯†Ç¡~ÿrâa¾*ОbgOõöP{}!x0È}ù¸Ò{'ÿk¡GrSž3Z´Ö=詤Ô̓ )¥–ËûM}ë“RŽð'F,\°v†³‡ŽÏâ¨Izp°ˆë³üÉS·»%2Õ2ykÙÛÇc¿hS&ÆŸ¡Í8™¤-þö¯Ý†Ÿê ²‘\ñVøî#m˜ò7žÚçr“Øä2›aýß9oendstream +1373 0 obj << +/Length 3269 +/Filter /FlateDecode +>> +stream +xÚ½Ërã6òî¯Ðm骃'IϬ³‰g×v¶j+É–`‹5é!){œ¯OÝàC¢äì¦jí›@Ýhô›â ÿ|¡Ó$5Â,2£͸^,·glñsŸÎ8áÄ)c}wöî£Ì&1©Hw£½ò„å9_Ü­~‰ÒD$ç°‹Þ¾þxõé盋óLEwWŸ¯Ïc¡YôñêÇK„>Ý\üôÓÅÍyÌsÍ£÷¿øçÝå N¥´Ç÷W×pÄàãȦ7—/o.¯ß_žÿv÷ÃÙå]–ñy9“î _Ï~ù-VpìÎX"M®/ðÂnŒXlÏ”–‰VR†‘ÍÙíÙ¿ú G³~é¬ü8K„LÅŒŸ 6I*…ìÈÓ„k c,º;çÂD»ª¬Ç“Œót‘ ‘ˆLçG˜A¤xŒu‚—€åxÙ[wÝfŸ° 3&?M8 Í–#Â&åá|JøÖv-ܬQ·¶QµÛÞÛë|¶vYW«º—Å׈¨ÀwŒ° y›”Õª\]YW l’åÃñUÙ÷K»ºÝœèyDX¿2ÍîÖ%±OÍž,e0äàsýùŽÆçŽÓ Bjsž­…ÇmÎyÁ©¶[[­ì*jèrÐ(Ðõ•}(v›_}5¦Ï¥JLÔ~ÊØ }Á%¤"w*ÎpÏmYí:Û"i7PT+ºÀöøVnw[|y.6;{Š,K„‘žÏó“&Šñ;ò䘤9+7Ùi c·€Ë1+¯QsvÀ…å•ú4ýk†±¸?šª|ÊÁݹ…QMÚ±Ú-¸…Š*Û½ÔÍœìšâÁÍÿʘXâ<^Ì•Õ×­Å‘'Û<ÔͶ¨–ö;7bèraª7Ø¡íj\Øâ\eÁdž ³¨ÚÛ´ÉŒ Ä +î3ÕrªÞ‡âÜ“Aš')ïµÒ[™Ñ®µ+„¼‘óµò9($Œ!Ç­œqÓºÒ»€àÔ4´¶-Ñ9ð¥¬úù@+È#LªàyüÉݽ"×tVŒ„d°Yo°‡B‚XÂ?ñg„c´àƒpm I®²`ilÞÔ¤H”2ìàDWox®ë]3XÝç¹H Sâã|YTUÝ!ûmiý圑¼ŠWâÆ鯰„ˆÈœ`'ÚôRn6è#îÉÿ´ån}óJîª9Ï!r‚“·ÁÕøÌÈ•%p\´í¦˜>É|:¯Áé÷G\¿R¼áFX'üQÀ +’>îŽ@JƤò4ùk†þÔ¨³,2@‘Y§!¤ã` ƒ¡Á0/ër¹ž¬ù7Oטö¡@t;«²*šWqªùT·eWB0~¶!<¥ƒŠ¥È½ÙyQ¡eùžÊ Á3Wè^àYWŽh®£k¿à#–!è”Í V\F8‚ž[þ€«·žçG·Å+Ëb×fá +¨_w¶)-‘ïh¹­]Sáû-dà ªt¹îÅÕßáÚ{‹;ºC²©ËqœH™G›ºídP¢-Žâ¬Z¼µ«´gnnZ­v'owîÂnA£×·øôÅM<ú㻡 ø{wpH_ðò(…@šˆàÀ PT©7;ï¤'‡Á«zBi.mÛµ3­2ÈtÒ7âþë¸õXÞÎÊ*nêºklŒ1X Ös’t5C{bc•eSâ9rÇE°,3$À¯Ò=QDèK U‹Sݺèòj®ƒÈ¿îJJ#p–Ì4GO7`Ù¶ÛC ã5ªùÕQîÉ…J¤Ú7Âb¹´Oà““?•Ùæy¥I®³œ‰˜ 5"(NÎm ôi¦%±&y« ”¹¯oóù‚´6ƒM3#Žï…ëìE`X1Ý*ÜÅ +Bt®Ót¬5½!úBBåb¡ OÓ +ËŒ‘0t +Y—WŽ;¤SŸÏÁåCB§":¨”sˆ +P®.h"˸r¤_mwö‡‚ +yn$ÁJB…­œ¸±¾öZ–oŸ6Š" ån Â'µ2·­R“ˆjб<ÿÚI}jXöÐøk + “äyf¼±W’tfŠå ½áÌz,Ÿá•1Ä«rUv¯±÷þðvàØàv”âÙbLàб¬>&ŽM W^Nù¸}²ËÒ•'>òe!ȲÁ·Á ÷mYŸÂ°\ã-€äbqÒ{*|YÛ +Q>\ßÞ^¾ÇQ8xUÄç‹]Wo¡†‰ÑAe,JYOÔµ‹Þ*meJ áµhé‰Ú–"Þá¹z­Šm¹Ä—ÝÓ +6 ….¼î‹^`BË|!M +†m¼RádóHæuói¬0„^ÂᾘÁ-©.v@ãö¹‘2ÿö7Þü@z¬7x8Üê{Ž PòýöD‘ÉwZŒ‹ ýÃ|9}ýäNQÐb,b(æhˆ)˜Û$7òz·qÙ ã!%u`;VJ7°®_ØÔÕ#B÷ö¡¬¸wÏê+Âg¢é}µóý9q3|ât¯_.½Letõ€³¾@ +üÅsù2½‚¬Pê,$V‡:/¥Äaöž°öˆ#š?Lòw +Ìa•o8”à=|6ÃÐí©¢ü=ê,Dô£e)ÜLb{£,cÏäz¬pdÑqU¯ìay*!Õ”™8ÍB5ÃÃÔÝÈ„qHg'Lø4îÁ ‚‡ŒŒ=åsûûäÕø¼§µödK•7õÎÖ_£oÁÈ×]QuaoJõÁI‚Ò¸”'Šçfßç>Nšx¿£¥ôRvëÉTe_€ôñ—ÿ9çÜðq#ÿŇå©á¢o¿Îºp(ô¥È¨½ +1™dJ¥o¨Ðë„ +¬} +>uFtæ:¶â4=Ö #“3C0ô§œ zä>%ÐGŒ5%.ëzCß.z]Øë’k¿ï'ö~©÷L"¤;~Ì6 X¾Ïå?z -%Ô°S1Ò%¨Â¥Üû.×…]¤}¾×"ëÿSÃ2ÿ-‰÷*6§aÄ÷ÆÁftž¿QnŽ±ŽkXµ¯aÝë“=ôQP–(%NsÐcÍ°09­ÔPÁi=åaÐ-£0#Rpûå3ª¼Ü|ÀŸøÞ*y^rþÉhôOðNߟ¢ëˆrgÊ­TôŵQÆ¥ö¢.­RrèQkWñë=·õ¶€[V< Q:ÕZê¹/ªÔWéÔ»à™ÒÓâÊãÔçÚE:(Ñ«`X +OESl-¦Ú<4»@ν­ŸqÊ 9Þ<&õ;L»"ÆgîúñKÚ1Rï7i;ˆÍ˜€w…Çžñ„ç©~CáGX'>`õÍbûnt»Äá»þ#ùì°Çîš×CÜ0xP’ƒj§,U§ÐcÍœaR’§) +¤P“CÜáçPn•Ö-¾@Ý¡ÛÜà€øßpÀ‚þFÙ¾ÈÝ/öû½÷v]<—>E“2ò·,ÃWÚ‡àïÑd$~Ñ…¹R‰ßb )tßL^ KQÆx˜M°„rï±ÿÙ‚#ÔŒ uýbÈË‹rãà®)ªö¾1ýÜî|êËéUp.‡G²ÆŒŠ!CL™Ð*‡:@£BÉx‡â +wˆ÷»ÇÂ÷è½='Ö.0zÿÚ/B` É8\Üí;”„&j7Å3áõÞÜÖ«x®Tu_ZKW7m¨Tº.dÓ}ðÕÊsÈ”™²° FšI‘É€Àk»_QÍè1ëØ_þ±ÖðK6¨­ežùÒ)²> endobj -1359 0 obj << +1376 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [318.204 427.0782 366.911 439.1379] +/Rect [289.8576 392.4739 338.5646 404.5335] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj -1358 0 obj << -/D [1356 0 R /XYZ 85.0394 794.5015 null] +1374 0 obj << +/D [1372 0 R /XYZ 56.6929 794.5015 null] >> endobj -1355 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F62 1050 0 R >> -/XObject << /Im2 1039 0 R >> +410 0 obj << +/D [1372 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1375 0 obj << +/D [1372 0 R /XYZ 56.6929 749.8269 null] +>> endobj +1371 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F62 1060 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1362 0 obj << -/Length 3826 -/Filter /FlateDecode ->> -stream -xÚ¥ZQÛ8~Ÿ_‘Ç 0ñZ’mÙ¸ÃÝît·‡Ûv¯=°»žXI|uì4¶gšýõGŠ”b;Î ‡jJ¢%Š"?‘ŒÅ"„b'A’Él¡³(ˆC/Öû›p±…±oó¬ÓjÈõýÃÍwï”^dA–Èdñ°Ì•ašŠÅCñÛ2 dp 3„Ë·?¼{ÿ㯟ÞÜêhùðþã‡Û•ŒÃå»÷ÿ¸'êÇOo~þùͧەHc±|ûÓ›_î?ÑPÂs|ÿþÃÔ“ÑãʤŸîßݺÿðöþö‡¿ßÜ?ø½ ÷+B…ùzóÛᢀmÿý& T–Æ‹gh„È2¹ØßD± -âH)×SÝ|¾ù§Ÿp0j_ÕŸ©9£@© -LEgY¼Ðq$ -†PÝÎО>|CÄñV¤K³¡G»£Î¼.†£ÝñDͮܛ–ɆŸnÆö`Öåïa( ¿û”W½iƒ ¥‰@ ‘,´LÇÙ•MÓjÈE{sFâ¸p¦¨ÛU_Vmù§™®.d¤Zd//ï¹fÖêXÈ8Hc%Ç|6U’vÊI–yñdŽ]Ù’nôòþ‡Ÿiä×~¡®Ç~ƒÊÞ˜#µ­ô–¥¬™ãÔ¡>WJ…ËÝfr™WeA,¤kbËéШ It^z…YBÔïaò{ ¤Å*Š` àƒ+!‚,ŽÉãš¾kË'“¸×Éò˜×[î|.«Š¨GîiËÊÔ]u"Ö¼øOßv¦€å -ªåƒU Œf“÷UG¯YYˆtË °Ówú¶ÏyAÚhÞ65µ7Í‘%0]WÖ[»¯ÐmHÎXÇJ&¬šGͺ©WgÁ’Ä –°`þ•d¹5ÌCLj“Ôí³9NØyÛÒp·³B7ývGCÔþbjj£ѾžóªòoåÝÜf«fý…¼msÌ·{P»ó¾C¾þÂvhýù;« ï°íM˜íbôÚÙ’Â喵ݙ£ç«‰b# …^ñø$A("ñ²Ç¹®{¼çB5ìóo×^¤àµ/®î¹f–;¼ -ÂL%ãõÉáU‘Ã#"•û~O òv¤¬Æí¸iÛ|ËÌdŠHÕùIò+;ljîC$À§C-ä phäÑ"ˆ²hl2ƒ3Uîà"FåÑ!¢ƒ9²@·‚Ø ŒÜ3è Ù©óìoÀèü úÝ2¤°ïŒ\ÎÀÁB(Ç°m‚ ,ØÆÈhlUOïm#`¾znSTX)'^2Ìøg]˜X8ÈLÍfYŒ/O”¬MùÄ ã«3´¶‹M°Cê"!À˜p>N˜øzAΘ™Œö -°Åk¥B¿lC®ëÀæ¹ØÀaŽxø•Yïéᛊ©uô²žkFŠ¾E\Æ©‹ñÙ‡vh i‚9 H4¢Y>KãâóϦq¶®‡­¹Àj°¦t G{¡ÁãvAħÁ®<ÿ+»ºœ—P{Ý•ˆ(Q¨@_È“B¨ Q·žë5).f;XIDhˆÂxÔÁ£’eKf tËvÚ™oÝŒ-õ•a†BLw|=È$Q2ÆÑç]¹†ÐDEÂz(>é´#ÀÏ„À à!XÎâ.6È/œJ€?ç¨_ÜÜKïJ:}œ·¦g‰$Ûii(“*™JËä•ê@ f9ãŠz:”kÏ5Í·iA¡ç¥2ƒX<…Rš/GÓµí­©Í1çaè>1ÛÎÌ€ŽP*ˆx‰d/øÕºÙ@Ö;.·ÅˆuìöÙ4‚gª–šÎК£ÁªÏ;9B_NärØáœ{Ë1SQzÄD Õ]BìœBÒec]8Ç–Z];›8 -²,Ô¯ (Z©”™,þÃŒU“¦¸›Q] -²«¡æffýjt¦óDÓ6û’5Ô6{Ã}· ÖÊzgÖ_X6|«Ó¦¯nÅ’ÿ‘ß>˜#jÂYFVi" 0ËlìG¨h03`×ö ØŸfTèaè«*Tè²áà`l‚¤—ïyöCw庯ÀøAÊ9½fQ Îˆau°Bí¶s— „¹±Ê†¼-­S4´«ºé¨#?l¨GîLƒó[R±”Î'ŽùóÜVÃ@)=·SCïjØŠÊ&öº7|q̉é|:üyMyµº&d¹}e¯ Åa<’’&ÝC¬K‹?òrCØ€æsÙ툵ló=SVÑDVæÉTĘ·N`·Ê°èBÆh-$žýdyê -D!dÆYòºŸE"ö–ÐÔ¸ì¶?æt‰âô¤\{J©‹ô ®Îì)¾Ã&ešWÅ©ûô8q%º¬v…a20Z!·) híÒØ=K²ÎYðGÃöB˜NnÄ¢ÏcYg•^ÚݪÔÚ<„¡+¶1d8ŽGžJóL#yk•ƒöÖ€®²^W}AY‰tæ|b Ig"ÿ7…„°ƒÐ×𔶶Wò6æa@„‘cCºrcÉ(µ· Æé©BÌ“ÄÎå­JfçI¤¿ù•Š²žä—ögã~²¿+az·”Æ’è‹aúëz˜î¹¬3T%¨¶]¹ÿÚ›ãéŽdÂ4sv|*¥TY¥‰xYLÏ5#çX“Q%vŒ…³µl‚^ˆDÌ* ±ÌXv%åÐñ9×Ml°¾‡Á}¿Ç`•Æ©B £¾Ðºß?-J8q=Áf{«Ìåpý±¥,ºZ˜§‚Ó4}K=k¸„IuÔ&·"¯ODláíšHRª%ÏùŸù˜t¬…3¯¿Î t”:ùŠPx÷Gø]aî~9i -x›ø åo¯ÍÉ!Ä-å4`ŽO†ÁÃVS” '‹ .žÔqÖks°ÅG¼aP3\ÖvAÕƒÃ`zò¢(ÑOìñ&ÂY,Bu”¸ª2r_é1hÁ…L¬ T¢º¾æÕ¸”œ $øvÍ®wX!jçJ6®`òB,¸ÝšÂ— -¸wP -•îI}R„“ß.D~Yð)$;•Wœ »@¶;ˆù -¢iVIuíšg"ödz@¡½•Víy"‹Tð$["§‡³TAê3“ Qú!^¹Ë¿×‚—¯mª§ÙJ˜‹¨šÈ•¶÷W¹ãƒ]ÕvRÅE ¶æÛÚ¸XÅÕû¸¼xwž¾˜ÖþÀKú½/º8¥ì†õ<¬÷åç Šèö›Ö‘°Ç[>4µÃ‹dy¾péÈ¡‹Å€.çÔ?2åÏÎF* éF±ÊáÝ-(ŠÎNy…ãênÅ •Áapâl0ȳßÍm×€€•%ÂËgÅN{8ØgZ0¸±±Ä§ä Ãþé¥Í±ñÈÃUóÌé]A6ï†R@½ïlR ¸Ã`ÓÊg§ØçeÍ1æ´ðZ“‹³ÎºI@Jß]½/u œ!Ñ5†&ÚPÇŸ4McmÔÞnµ·üaéÛMPó{UI #–ºë‘¯D³¾²ötܨ»„Ðê¯`q<Í‚8I'0>p¹p½q]¨W\W¯€ÐO%‰_@¦å¿0 -¤òA>ê(’)) ´³†Èž#-YÏ–ç¬glº9jûž^ö«,ìzlzÔ’\ -¢÷óšXËý¡±E_Ë|š‹R…ˆ¡eÓƒLG“"³Á`Î4 —ÈBð‚&2¤†î‘Àßí -ƒpù}_VÝÊe>þ²¥V>¹°äŒ!GB-¤ÎÎzUéy2•Š%ÕD›§²°p‹£6`@jgªÃ¦¯ˆ±(ómÝʯip$vŒ~?Æ7rêw…]¶øžâÏ"nsØ"ù-¸Gé¡ -WØ¡5}Ѭºæ°²õ‡UÑà 0W&Q2HbíÐü±¬‹ùª¬ÔÂEÉV$¥¯•#àzð…Ÿ·?½ùøyfBˆ‰³ÔGÕ68ÇB3 ç88¿Û2æÕ¾Œ»ËQVU”Ëcs 1hQÞŽÃW~¯pŽ-€ˆ´zíç -ÿåÓÿÒ_/fýX!Ef­XªKÔˆT:g5˜ë).g¤/ ƒõuxò¢Ñ)*,Ö§É+Ç\©ð…@W‚…i)DÇ”ËF=†.5^ïx´-5ÚÞª ÓXí›»ÛEÊÔ¹[^A”wõ:‡•UèymÁ6K¹` „+ØfîC¥ÌÞÞ-“Ö{À©"flˆ }§¦'bclQ2KÝ«zYSº€]¼RQ¶ùc5šÙWÌ…Ò“:›+Ñ©$]öÖ…#÷A^I -+x¶ß=Xvª¸aÿÎ~¡0zÏ»ôÌùÃ'“¾5X×zX¹¢™O´h©¢¬í}ˆýyMOóíP•kOC˽æ@Ï5³„´9tšM‚šPˆÌAëùã¸5Ö;Ÿ)»ÀÒ'þWâÁW¨—ÃÓõhÇ1Y¥Çšzºh†Õó—×d–Ë%'?˜EJ«Ñ’N¤~mÛè\¯÷?¤]î4ÿ†Ù;~»Ì‰à‡ ðuÊÑÎ`N›×_ÞRCœ¦”ƒB–'¸rSjü¦Óÿ¢À©1®r:˜+¿‘)Æ>üûaÀTñ‹¿ýÊó5:ç(^ñò5,×A"ý•ŒQ]&9âü›vFŸÏà³s£üMIE-dØð‘ ÐÖu2WrBŠÏQG¸ †tÜ~«°9ñ×ÓK)„02Õ“£àuæKÛG»¨x V mì^ß­!ÖåªÆÌg,¾èp%ŠPhų^.Ü)ýß_ŸƒH*M¯ä ø©L”Â$,”£KÐàO‘/Eÿ/²Wendstream +1379 0 obj << +/Length 3862 +/Filter /FlateDecode +>> +stream +xÚ¥ZYsÛF~ׯÐ#Ue"s`pÔnm•ã؉·6vÖVö%ÉDŒH¬A€!Éʯßîéž!‚RR[ªçhÌôôt}òZÀŸ¼ÎL$t_§y!Íõf%®·0÷ý•dšµ'Z©¾½½úæN¯ó(OTr}{?Z+‹D–ÉëÛò—Õ›^ÿtûöÓÍZ±J¢›µIÄêÛ÷¾£‘œ~Þ|üðîý÷?z}“Æ«Û÷?Ðð§·ïÞ~zûáÍÛ›µÌŒ„ç¯páwïÿõ–Zßzýã¯?ÝüvûÏ«··á,ãóJ¡ñ ¿_ýò›¸.áØÿ¼‘Î3sýÉÒx¿³Á’Ð@ ¾+¶–:#ÝV ˆm„ŒY{›bw}®â:ŽÒLyƒx¬Ð¼ÝªÖ¹eTf`¦¡&_À¯#Ò3’>g*ŠÓÔLõ9(:wwë:1MÄŒKØãö.9r‡K8̸„MæZwLv% +b”"%†ñç‚ c‡M›´a ZÐoZAHØ#ö"aãDRi”¥ b‚­‰Ž +³ç™T \L°5É¢D€VNØø_§×ƒ,4ˆ5j3®wˆ¿»);ß1¢³g~BCÄ©ÒDMÎB“Çí55>Nè_8Õùºä36˜¤GI1îœ-TôyÙª¸8_í¤Xk#c…ÙL¡Ð'C“qjO¢s­Ç2ûµ_Ðeô•˜UÑ+ŽˆUÓBÑã®Ú`XSø…¿tÛ.'!0(y +¶#ØŽ} yàD ì¹@ùâá²xõ®¢ÛÇuúm)Å&éNGÛ89?¨†ðN§Ð~þ¤iâÒ“«DVŸÕÆ¥¬®k¿®I +Ú$Q’©d +c ñ¡iLágj(T‡þÖ6yš†á'&Û-ÅRküt?¬7íþòpÖq~„ÜDrìÚÁ3Ó«moiOÆfØõqç|DêÜÉá€7N­¦De%Ôô>‚Î"“ÇùT%¼a«T_º0°<é W‚Ö€Aâ”ÀŠu[”¶|µ ºØD:3ú¥È W¦*8þ'Z¶ÝW,¡®Ý[»÷‡`©lvvó…ù`Åw2mÌÐøúïøéƒ=¢$¼V`PB.=Qªf‰%Ê´,\AÌ©.›Ó‚E”I™½(A+F÷¹á{^ýP€«Ü 5è>0¹$Ö<Žô 0œÖ(ÜnÉJp^:Óv´OÙÒ©š¶§âp ìÕg±ºpT©$æiÞ$ŽÅãÒQE¤uºtRBé¦pçSÓÝÛÂUž <Å[0Ê› „û€¶»£/1)L”%qþ“±fÂ%-ºÇôÝm~ÇÛQºU¿#Žsôª+öÜr‚¦fmlM„Eçö»Œ+R¤‹NCL<+4T4[F(DL“'/›Y,MЄ¶Ám·Ã± ŠË“pC1°âòxÞî)¼‹]½³{Ž™iÐÏB wè©HFêÂÕDª²Lkˆws²)˜ñ;Ëú¤ Ëf±…àóX•¥ƒY®Üiuæt ~Æ¥S&8Ng\ÕÍÜ•ƒ2r0T5›z(1§áEîǤdOê¯ B]#üu¯6EÝ«øË—°œŽDœÎj)–Š#‘ "\œßªk2ÞäH×ITp|>Aq9Â,%8×?#‚þ]ˆÒc þGèøù(}Lu9JTÎê +DÛ­ý…ÿ>ØãÓ+â ÑÅù9—*ðy6ÕŸÓ(H;àž0ê ô"¡·J_TM@ÆU_¹š )/Žc¬Îï$0V¥y*ŸÃlx/fØßÙàƒ$…Îc5”R¸áØQç + {ˆy‹Æ¶Û˦ɦ¡Q4OÔØ£ 5I¢¡Kª%'F„ozÒPÆùû‚ö¥Qgv~G|õ;ðSsþ>[4°MB€òKk¦£’«È„à®åo–‘Ãb‘bð0ÏJ@›=8@bQ2¾D˜¯Jª„)@Q”e…FâîÖ±F‹Øë´%{Ù˜$äÑT6r;õ€2ÄWÊa°³õ=µú¡a&¹,nBv㞦W29x?¬I…¢®€¬IšY–Â{rý~ëv»ÅZ?WxôTY¯k¸¦0.«J1{)$…Å*Ø_ HÈ€ß2 |C³Ûµƒ‹¡M«iÈhh‡/±±'Í…ªkå8‘ lÏ 9”ƒ_RuhôãšM1'&ÂF¦xç¾øb™]w¿®­ìòË3Š,¤ÛÈ S­ÞßÓƒ¯ôf>*ÖÈÑ‘ æVKqŽ WÍâ_ +HÑ6³,àþsH>+±â`›ÃÞúÝ +¾ìŠR1O¥-j6 ‚/A.ðR£ ›ØVYb‡¶ñP•¬N¾ž4†˜òHããÓáê]”h5ß<»¥ØHÓÕëp_¸»ßñžŠÿ093u˜äÕ_-¾ ÂzBž3§±ÓVîvÎ0„c¶=‚`«Ó&#C×ࢸ㹺}䬲¤ —îÄÔg2¸—}8y(1w; rsn‰}Q5ÛÎŽ34墡‚`ŸH å±í¢S>¤FOÚ³û4šQ²nZ¦unß°XpÂÕ8<Ôè°@ÃÏÕå©0Õžž`š`g1Û™ùDCïè]Ãû?ã_ ÓNµ³À:›r#s `4믈WBÈ ¢Uàÿ¬Œ¥ˆ#Pè‘Œc•‘Œc•:ãÀHÆqª¼ê©l,cìúš–žNP8t×(lrõ‰ž/"­ö‡ÖÕ™ñÓRd,¥‡¤féèƒè¥`ÂÛ,÷qüÅ8UIˆ÷QÏÆ©cªËqj "8ë«û§uiëâéüÞ^®Ÿß=P-l?¹ÐØD9D„ÓýÉ+§‘ŽürÍ%ãT<ŨûÒ%j^úGkÃTÃi,À9$´¨¤“ðÙhŒ_ëu4CÞ† úAðvõ´|Ì ª p†4ž¹¯ƒKÑä’Q.’KÂ<*ðâ§Q„Ëäf a…X};Tu¿öMû\–Cé\Hh\Öº Hh)¾üLG¯Ð²ÓbøŽ‘Ê°íCUZ~3Ju0líl}¸j",«bÛ´ïšœpAoTǯËéÍ=Ž{xÂ!WïÏðMŒ?öˆGf7_4ú^Gƒï:tv(ÛußÖ®æ±.[Dÿ¥ÒŒVQbRäwUS.‚U*½µ9–`— %p :õ¡Å›^ü¼°"*¢y—`q È +¦ÓpfLæCùW{j9YQ»#‘AŠ8}ቷl)u$!»{áIøBpLn°g«N^(™;5Vú6t”ÇBMØY€ ¦z‹óÕFiðàŒ~GùØô¾ È’®¨2ª¾ì ËRl©\–‹u ùXчcížæ8Ü‚.ñxá©K,*‘E1(/ïþþÃ’;ÀHc¯¹ ó‡lœî!Hª„Óa  /òª?LzáþÁGÀÍd/A ÖÝC†Í €+?Ѧ%昪qÇ‹†~í×C]m\0 =ÿœ!Ì‘Kj¹V‰‰Ò,ŸE5Ï ¡”¹ŠOI¸Í.¤Ø>ª–  m¼üM¸öÜüߟŸ0N#eê«b‘€®ç©gÊyp3ç<|7|Îúÿé5£ +endstream endobj -1361 0 obj << +1378 0 obj << /Type /Page -/Contents 1362 0 R -/Resources 1360 0 R +/Contents 1379 0 R +/Resources 1377 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R -/Annots [ 1364 0 R 1369 0 R ] +/Parent 1356 0 R +/Annots [ 1381 0 R 1386 0 R ] >> endobj -1364 0 obj << +1381 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [324.9335 578.0115 381.8296 590.0711] +/Rect [353.2799 540.398 410.176 552.4577] /Subtype /Link /A << /S /GoTo /D (zonefile_format) >> >> endobj -1369 0 obj << +1386 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 152.6674 116.59 164.7271] +/Rect [84.0431 109.336 144.9365 121.3956] /Subtype /Link /A << /S /GoTo /D (view_statement_grammar) >> >> endobj -1363 0 obj << -/D [1361 0 R /XYZ 56.6929 794.5015 null] +1380 0 obj << +/D [1378 0 R /XYZ 85.0394 794.5015 null] >> endobj -410 0 obj << -/D [1361 0 R /XYZ 56.6929 226.773 null] +414 0 obj << +/D [1378 0 R /XYZ 85.0394 184.8801 null] >> endobj -1368 0 obj << -/D [1361 0 R /XYZ 56.6929 199.6254 null] +1385 0 obj << +/D [1378 0 R /XYZ 85.0394 156.8765 null] >> endobj -1360 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F11 1367 0 R >> +1377 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F11 1384 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1374 0 obj << -/Length 2801 +1391 0 obj << +/Length 2882 /Filter /FlateDecode >> stream -xÚ½ZÝoã6Ï_aôå Vù!ê£÷”Ý$=]ï^’;×íƒbËkaɵ䤾¿þf8¤D)²œEC`h4ÎÌoHÉQøŒÁŸÅÊg2 fQøŠq5[=]°Ùhûé‚™¹š»Rï.~¸•Ñ,ñ“P„³‡£+öYóÙÃú7ïý?®>=ÜÜ]Î…b^è_ÎUȼw‹å5qz¼ÿ¸¼]üô¯»«Ë(ð—ľ»¹½¹»Y¾¿¹œóXqè/Œ†n¿ÜõÓÝÕ‡Ww—¿?ü|qóÐbqñr&È¿ýÎfk€ýóóe«Ù ¼0Ÿ'‰˜=]Jú*ÒrŠ‹û‹¶ -VÝu,~Š}%‚p6W`5Œ‚ñ(3Ÿ)ˆÚ< -@— xeÁÇ¢l¥0ÊÛªnÊô)Âå"ñ%—3Wå+ÃVhÄ°t sø" –¶< ;ô[cÙu¶Îö†ÞV‡btäí/yìe»jßPÛsža²ý‘Èj3Ði‘þp¸‘1÷ƒ(L•ÿ1/×$ÞÃñ–¡‘}É›­1rÜݽ¨Ïeú0!Jœû‰R‚Ðÿú0¢™)•Qýý%ôUÞªHëzD±d~"`"2»Z>Þh”‘Š82R>©|Øæ5R¡·Î6é¡hjâ7•yb¼°¹dc8få=¥«m^:²yùe b{wã‰ÜT‚™ûAØÈмØT‡‡:ˆ¼GÇ 6ãŒ/Yc]ú̃'‰Í¡\5yU"@–˜¹vûü)ÕÓ_û]UgÔCÏ `Ö‡Õ–88qò¬&vnžlÌ×YÙä£ée›Û^ ¡°þðâ\?¾èÉZvôªmÂ3-«´nè…â‚æXLfQbÕÒ¢8Zùú|Ãàâë±:ì‰2.j‘„Þý.[‹(72]`n‰X¨Á'=eUf™=‘ô#Ì,Ôg×éc‘™±“‰ôYÀÂ>ð!^euMþBFÕ°áIÃDëö0ÇšD†Ü!ãÓÙΕ:íZ)ôÎÌAðpž¯_§<å ‹ió­Ôˆý~Òc¾‰ê;@3Ž¼Å5=ËhÓÒ6ÝŃtãÔËJ·e•åÏi`¥ôXÒÀuïh]è)ü™1a9¸†–÷‹k³Ž€CÉ“sŽÙG$‘Wí­f=è@a†ê¹É¸<áz¨yb†'2.¦PÅíd\\û÷7wÿ¾¹™‚Jùaª^ºEÅ'Òm›jÙ|÷¶,‹êNeYá$[– »,‹*(¬KBÈm“¶P¸¸IBȱIˆ¢ÂÆ$a?AêÜÍekxv© ßLjBRçkx¦ôp’Q¯Õ&#|i“‘Vlž]2"ù6á+%#¤ºd„g’Ñ [ö—%d–ètF -`õ³WI÷æäi”‰YgHt^FJL{)8L¦vïqÒ&Ñ1G˜·"i§mQP—Uz¨3“@c ‰!äýX >\ú‚ÑÞ#¸wÐ{–° '{C{Z×îœ@êšÚã;'vrwNfô4'ƒ±Dq?âq2—ׄðÀçck ‘±]b8ð#Z„€4Äí -9hàS"‚ÈÂrÄŠâÉŸÃ ,‚õÅà»C^4ó¼¤èæi׉ü®G,3\‡~D4>K©¤·ÅÀKxu¥9Àzlµã[FÚQä¿Z»æbüï?^?-²å==MV¯ôsm TeqÄ!ƒA -…¤ÚLIž^6˜­ÖšmÚ/iW9­”ÕþÉœ6àñ˜Ñ“ºV¿&NQ­¬˜"Ï‘kCIè¡çÐtY5}å5ä,¢ô,OÌ‘‹²ÉöeÖüÍè¡Um˜ …YN_8]{€(Eª‡>¸Õ­òVžÒ9gÉ õø«ŠvH‰±ÒqEJ½KW™é@qhû’Ú—¿^üpµXÒµÖ»ª¬©ƒ$XÐÑÑ٥ɀI»tßä«ùظ -^¸¦â^‹VU¤Z§#7 È Äh-| iv ?]¯Ãä-°6ä'z»»}O]`oŠM=Ú]›ò¤„íaŽF¬¨+êš—«â°ÎÆ`‘ÇR <–¼ç1´“ÇÀ_|z‰¥§ 1Ô† «›¢(Á—2[ãÒÁÊ°ÕĽ"/¿NéÌjÓŸÛ÷¢ÚÍÇ&ÞcºúJé¤ï2tÝc°ÑÔ¡üZV/å«ž~kïIÜË@B$f_A*mÌ6èžÝ8Èá°’žô _󑥇ÎUÔA§C`aÞ02ù®ÄÈþÌë¦&š†…ÑmEèÛJþl:â Ðì´‰M;Ë7ªý %®õSÛØ$qdÚ‹Ä:ƒcÚ>ÅíÊl`n\M0€¢lÄÊ€hLÄSzd]Ö7ˆ•‰žÔöNël0î)%{²Pš.E^7ýKÏÀ–™ yýã©S–x̃邚+¥/@:;*±tt¡×Ÿl‚Ã;  SM[m¥^›í¬ÐAØ7ËüÅr~u}}ç_Ý}ºL„wu -¹·ãXÊiä®Ôiä­ÔYä“V;ä¯ÌŽ"ï™åpyx3v¸©Xñ3Ø© ìVê<ö)«ö¡Ùqì®Y¡ –ÉÛñã-9“3ø© üVê<þ)«þ¡Ùqü®YácÑW¼¹/Žã3ø© üVê<þ)«þ¡Ùqü®Y¡°LÒýÞ}Ðgá™88Rq°Rçã0eÕ‰ÃÐìx\³Ìÿk‹Oáù˜1éËDœÙ1\©‰˜Y©ó1›²êÄlhvÅ!õ”–¦ÊÝÖ©/}…Ñë̵ NaÊËÍ>­›ýeìVÍ¡°ˆ;õ[x1µLS1$Rp"Þ•I¡Ïî’{XÄÅõIï¾">yìvÚ@tl÷ÔPuºÚçNyèÄKæúWfÙZO ÔQ3[ÆÚÕÑ®Jq!nӲ̊‘Oå¦|TT©é’¾¤†çä4·×©0BS[??u™€£Åx1~f¤þòÿ>9u¬È—q,Æ÷< {],’È:¥¿ç¨¡çJƾŠE4âúÿx``endstream +xÚ½]sã¶ñÝ¿B“—Ê3B| Ó'ßÙN•i|W[ídšä–è3çdR©sÜ_ß],@‚2Dú&ŽÇ`±Ø/‹Ý¥ø,‚?>‹–d"›éL±8âñlýtÍ>ÁÜgÜâ,ÒÂÇz·:ûîZêYƲD$³ÕƒG+eQšòÙjóËåæ8àà°ßÕMA+ÌÙ`sX?ÄÞB—¶E“àd¹)ª¼AŸK· +è *‘S‚â<‹ Ç'ºý‡ Ohóêe7- È.È.J‰-b¬ÛC¾Ý¾8üæd3þ†/õaO½Îq,D6åààl‰TÄGgœè ‡ûkèÉ‘LÇ©sïg3{'3É"éáîýOü]"4SÑ”¿ó±Nû» ¥³g$\”›WaGÂ2Îõ8w‡à>tyœ¥™r§S™êùò’ÚÖ:_‡}çëÒ#_—â¹+*f]”_ÈÌÊ©¹¡]…ÞGuiÎï¯Q$/ÐÍÝòÒ^"€ç䜣뙞×{GÙ츈˜ÈŽŸ;ënyÆÍ>óÌî3N¸[ôŸ1wtyÉî®nÿ1óëóÇ°‰É0äA§Bj3­¿&ä1äNF7OøÛ\lÒ»X$¹"D½Bhçp†ÌÅ­Bˆó@díD1¡²dèXŒãŽ¹jh{¿„#ë—°kœ5´95ž'Ì:O„ƒÎ¶í=áwž‡ä‰°×{"•Lx¢hx€†wÜŠ>펃CËÝ‘YsìxFA¡vÁ¤ö¤Ô±—Rp8LÝÃÒyРw$"ëŽívKKÖù¡9#H1Z©‡âHÇ2®Ü6'!Ss$NÙi«ü×ÀyCPû¾"ßWÙ2ü¾šEýûªUäbwÕÅî÷F ÈÐ24àk$¶2s—¨ ÝFÈL8‹yï€èFœˆÎ…סÒîV†èÁŸ2ù­þ¹ÌŸCĦÏ1¾…ÜýPnÛEYÑËuõ´k_¨ûoàÛÃñ&Ì¥M¼1›¸±œ?š-ˆÕ¼©Í¦è¾£Ž£‚¨#Ê uŸûpAð¼²ÄnAmÚePWÛÜ<Ø®D˜íj,Ãœðið€þˆ[û˜·VJzˆÑ=˜õþÉF'vÜÔ’o0ä7ÙÖk‡“äuÁS–x!WæùЯêvH¼7G=‘e6ÄDÀ²j‹}U´±tÈ8Ö©¡c‚h n \Gkðu\—˜j +)½¸LªNf€¯kzT¥¹i&œ„.^™f—¯ »€ìÐöÍßü|ù᧋å h¶ÙÕUC $©%•O³÷V2R &!ìò}[®¡}9ls“ðâóŠŽ”Ž;¡µ³tHÔÑ:p˜Ðé@x¾ÙXIZ=‘Ÿht{ýž–Às–Ú5f·û¹x.%d,” +À.¼X´mSÓÒ²Zo›"¤I,Å‘Ä’$†y’àË_™#H@O šÃ‹ÕQÄ€·ãSUlðê  eÒQâómY}£Y4vI{ÎçNb_z·½û|ý™<ÊP@#ú‘³¥½Cõ¹ªŸ«W+YÇ#…hMqß !ík„½¼mÑáÐÀ?h7\¦'“Ôá°ÄÐ]([ +ß]὆%µµešÍ Š?ʳJì›MAZv EùÅ.Ä- ³é܆ gÉc +»úLnk³@Ç:"N—vl +ˆëö9>[6ÆõMjí=ò5ÐY[%Zk윚¢÷ùVcè¹Ü¥Y7EÐø+·yëÞ8TvɶlÚaŠtÄËžƒ²ùþTEX¦œ ®ÔxÜÇ2É +¼z^XÅY"JýkOàS ô8¤ƒ£LÒk¦Ã" +¼åY™Fly³¸¸¼¼e·Ï31¿8©w"¨ü1®·‡5¢·ÃšÔ{Œi¯÷1Ó°Þ>S™Æ›5‡P h‰ Í=¬ÍÖ¤æcL{Í™†5÷™Š¿${»ö"aRB7®½‡5¢½ÃšÔ~Œi¯ý1Ó°ö>SÁðëŒx»öQÊ"™N(ß#èn‘&UáØk~Ä1¬¸ÇQ@bïÿ¿U‘fL«)øX§-ÐaM™`”igƒWLƒF0ØŸû[~L¦-ê*•é ‹yX#sX“cÚ[ì˜iØb>Sþÿ°X,ãdÂbÖˆÅÖ¤ÅƘö;f¶˜Ïô’]£¶oÓÜ|çúšîchî°&5cÚk~Ì4¬¹Ï4eW_£;äüq¢'â(kDw‡5©ûÓ^÷c¦aÝ}¦ÙWéÎ3ós"–ò±NëÞaMé>Ê´ÓýÓ î¦_§»r:›ˆ'|¬ÝÖ¤îcL{Ý™†u÷™¾;©;#Ų?Öú¹‰«gñ¸Ë7¸ê‹DoŠ¶Å:+L¶ÃmÉ_Êâ™z[ÈÌ·–€É²fò5Z¸ÛQWQ®i—6令o@ËFKªón£Hw‡j;$‚Œ!g{,öek(AžîÕ0`²Þa¢ØДI{¥©•t¦po˜«jnzñêă '@¬4›/–·1£tÅ™83JkFSó‰ç+Ü?˳ä}9V!Á<²Ó"˜^z²º ó[ê¿Ô—ÆVÜ£„W\äÃ. î­B(*dÙP…Ý?ò§Ý¶ø>ðy®“–£Jüþ!ýZÿ˜wAl“(šþ Õß!˪’ª™¿08œó¹ýd™%}qqX“Áêb^}rËaåî¸à§ûH÷œüÒæ°V’ÅóÇüKáU.»úVÖ!Çk _è³ó°R‡U\#vXžX$BšJ"Bv{,Ŭ Ù_Î`y·+ò½˜Ï К* vî ¾ûÄ,|P>Ðaï)¯l!»+ñÒZú6c06…Ï!v:óüWð©€{þôoâzw¯4“iz"´D¬Pæ£AòúS6œ<Èñ¢ÿ7Ú‘endstream endobj -1373 0 obj << +1390 0 obj << /Type /Page -/Contents 1374 0 R -/Resources 1372 0 R +/Contents 1391 0 R +/Resources 1389 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R +/Parent 1356 0 R >> endobj -1375 0 obj << -/D [1373 0 R /XYZ 85.0394 794.5015 null] +1392 0 obj << +/D [1390 0 R /XYZ 56.6929 794.5015 null] >> endobj -414 0 obj << -/D [1373 0 R /XYZ 85.0394 592.2428 null] +418 0 obj << +/D [1390 0 R /XYZ 56.6929 551.4149 null] >> endobj -1376 0 obj << -/D [1373 0 R /XYZ 85.0394 565.4551 null] +1393 0 obj << +/D [1390 0 R /XYZ 56.6929 523.4719 null] >> endobj -1372 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R >> +1389 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1379 0 obj << -/Length 3229 +1396 0 obj << +/Length 3167 /Filter /FlateDecode >> stream -xÚ¥ZÝsÛ6÷_¡·£f"Ÿ$ñ˜6NëNëÜ9îô¡í-Qç$R);Î_ ì‚%ZI®“™\,‹Ýß~²˜qø'f&e©•v–YÍ f¶Ü]ñÙ#Ìýx%ˆg˜1×÷÷Wß½WÙÌ2›Êtv¿ŽdåŒç¹˜Ý¯þHR&Ù$ð䇷ïo~üíîí<ÓÉý͇ÛùBž¼¿ùåG?Þ½ýõ×·wó…ÈH~øéí¿ï¯ïp*%ßßܾCŠÅÇ+Bï®ß_ß]ßþp=ÿëþç«ëû~/ñ~Wn#_ýñŸ­`Û?_q¦lnfÏð™°VÎvWÚ(f´R²½úxõŸ^`4ë?²_ϳÐ9“d|ͲB2kž^–Ï9ÍôYøY4 _ŒE îMSÉ2Ž î•j&³ÆHç_˜U™Hg™RŒ;¸÷ÖØ3ZfR-ŸàÌ( Š{ŽóE*’{ø_&gî‘<“Ù,ÍsfEîžý=ŒkkòDc¿ÓÁžðÝÍNÎÞ5°ŸY´¥ w ö;JeXÀ)0e³Œg,7wt¿)CYžÊbëF6Ù‡²îÚ–‡ùBñäi.MRZ¤®ç@jÈÞmÊ–d|ž “4uIlí¦9nWȵªÚâa.y²%Þb»ÅA¹Ûw/Ⱦljc½*8„5œ-zò½¦y›gþXìçÆ»pŒ`*SÉû~#9.âd -shšnJ„¼)ËỪE&|f´7 ø«- ©j|†-ë`2¯Õh“‚…&€˜hö]ÕÔ8^5J|ÀÖi‘q&3cÇźn‹WûŠ®Ú9 ±é­ïj©å)xIAîÑÙpúJ&r8ÔpΓ·«Uå4*ZËePÎ2ÅrSÕQG„C$A -Ôù¡EUÚ$E$Ni ŽÄ¹É%ˆ+!'¨Ôõ–mƒ,K€5lí|"‡$#jÛ ÿù„. -V–åÄFò½½B5®RÕ]y µHœè$U»½w`óD[éúµÝ7uKSІ­1‹.ÐqRhÆ9ô-#ÏíŠzYbÛܬ]^í‹@±6O~ÇäsÎvŒ{o©7ŸûbIÞð3Ž³Å!…òìV£ðê»vÄ‚dfñËmšC·X»©&×·¡2£JƒØ×R摲0éŠ6þðâ[7(Ad.êö¹$êÝÃÁmÓ•a‘¢›€Dƒ1_‚„k ácÏ)LºE›M³ÂÔ®\nŠºjwÔ Á9ÌrטÆ~õÎ4£³?Uº¢^‹aÝPFm‹.D±7gÜ+½»ýˆƒA!WM©Ctãõ±öÎ p\Ô9V8Uf£È‹¡£ÀË«ÆþÙkççaÓ%Ž÷™=ŽÈ€z¿º÷?¹áå§e¹ïN>½»kËŽ¡v£<  îóWŽŒ#\©>‡8+‡²Éå¶y „ŸÈ’‡c‡˜VÕIH»´µ: iGÁ ·.ÂkŸyAb·}™ !ü©”›ä†Öò~n8ævÕò¸-À7ºOÇaö‹]ÞáŸ,šÃ -#8Á¬ÎáLÙ7eîÒ "¸žqDJ¿<9Jø©ÍQè+Ì¥T²ÁÇQB{'ðøê>"Oº¡o EàáÎ,øxõ÷Kjý|óþÿx³üóö׋ËÛþ.ãûJ¡ð"_.~ÿS,Öpí_/D¬lnOб´6Yì.´Q±ÑJ…‘íÅç‹õŽfýÒ9ù•Ç&O²&jN€ÆÆ©‚)`UoEÛ–yt,»ãa)óÈÁ3µîðè-u6Íu±sºªSãà\ÏßØœµÍ Þ¦j1v¥ïóNŒƦv±òÂ÷ÅŽ•Žm.Õ„kGó™ZÄ€³¯Rab•fÙäL¢é©PC^+ +†§’B Ôéb¼ï‹Ó{ª™ãÇyNjgÖØéùŸ÷®¬6`PJÙèɧl1C¾©ç½a«Øï]Áó¨rüz•cƒÂ<ØP¹G>z?ž*ÿåIŸC±Á¦Í¿Ð¬u€]m¼i¯”sˆnS ¯Éc1×´œXðF˜-Ýú]ŸŽê“Ä„ûÿÐý°ÅN­"­[¿LQ¬o“"#IþºQŒ©ÎEO5EÙÔ¢Vaã$yëøžjæü‰U'â”Þ*0‘U`À ùa ³Ø`,˜¶CÀ⨨O̧¼Y SƒYà$A+˜ì#žîÍBKÝ›˜’*ý=fñG’èÿûÿÌ@ÐT™}à FT¯˜A ÌÀßy…Q{ë^ØdbHÄúuzª&&¶Ë8ÏM6åâ’Nörð*AäˆÉ8 AZAQì_ìB¾øñ9ÀÍMqÜvƒôy¼ÃBºçyaëA4^ö˜ê¼°{*¼&_i5ý¥° ä)‘¾ÎCO5ÃÄTØTÚ)zÁ*¬ ÖÕcµ>z0ý _höòšä c#ù*<Æù"°ökU*‰š}5JÕÔÔ-‹šÜpZeÀ.”HS79©o Tû`]µs„ðO4°³"!A‘¦2CQ M™Æ2‡ÂS½_¯«8*ؾ>»²#±x-ʇª¾Aê°9` @ª@3¨J¨m§´†ÇÛád Û¹wêY¶ ‘”`Ûpµ—9T²I®·~ù / ä¬ ‰Èx¹g¨¦Sªºsf‹9¡‰®¡¡j·§úꑯÒ +Rm»oê–§‰m(Ž®Hq RB’Ÿh*ÏÒhn6\û÷±h6~£ s(;0^¹ć+JÖ†ŸAÊ–šìÎ tG'Ð'dnƒï9ˆÅ÷кUyìæp¼G¢Iƹc]C1 “˜ÆöC‡Ò 4p@ÄEÝ>9½¹‰©qÝt.Rt3&Þƒƒ˜·LB‘k™3™w?d˜y]8Ä +S;‡¥yÕî‰ |±éX¯^™fòØ÷¨×ÓŒXûÒdDÛ¢;} +èáÒ‡ëÏü8Ð3Ô—ðüp¬½„‡2j\¨™;2¤•‘çMG–× Ö~8ì¹óópé{Gm²ûÌžÚ=ìêõŠý?„îkéöÝÉÒ››Öu|w Øpù‹‚‘Ä;±+ÕÇsÑÊ ß¹móH?‘EwÇŽ&8¬ž¸4άթKã¹tðXXÜ¢‡Ý×ô&TÔÝöy)¥ô5©0ÑŸE‘Ý`‘ÛUåq[€nÆy ¸ƒ7x“G ŸcôÆvc–KÓ²kì…bµæþ±­º"ìc éÏ\½r­­ÃKŒ=¼7?ŒÁÐÚmÝ}B橧ª{ )O4£¤ûí‘ít=kWÞöô êúx‹Ãw]Q1 Û ²ôµÚwÔ™¨FúÜ‘ Âàð*†½IþÉ Ù(’ÁG“Ñg»nÈoršßæMrµ94»Õ¹¸#…ŽS­B.¢§ÁÓ´–Ä©´!6ÕÍÜ6&6&‡/eMàwpùµ÷°C[‘|l#P–Ç{!Yï [/³‚cP7›¹«!à¥6{3À*¨‡EHÍQ¬ñ…*Ȉ©HÌÔ †CP—iqBÚ1©joÃÀ™wÐIü ¯¯EWÌç'n)˜ácÕ[ê p[?‚³÷azNHR‰ØêD}CJ”HÆY¶dO„VÅ_ÒÕ—cÅa‰FwGŸ+±Õ èSôŸi†üÝoÊ rô'Þ}ÜïTÙV»êÄÉ{»5'z÷>ªÞbä½wÏáe`^ª‰‘PB«4(­øºbɶÕ_srÍ¥&ë%Bw:ɤV‡S#BÙ~@h0ÃT!³*ʾÐßU5ù§åš¢zDb1ÑØ0y”Áçöøe +‘LàŽÁÉoK!¿{XÍ9Isìf 4Î2•[©•÷¥ÖËŸË4ä¿ò¹ÜVåÜ>ylàL6FÂR €ï fÂ!zÆiBc’ðÅöâ$ïôä¶Ûé­Ç‡v®Cü¤QØ`”õÜïÉu>ÞXyR {Ü„¢OTôKóäñ%Az’ÛƆdƆ3ˆ4¿úèo‚aɉ5˜8z+m7ìé¸:4Œ&˜ ¯~ãCÉÕlÑ8·cŽFF¥N@‰UQK•ö…[ŠP«)„Â÷?¾jÀ–·nÜÿX–Îù8,§–¦±{zqYo]Ûò¡› ?ºÇaöM”w8À’UsXÓÏ'6«s¨){P†ïæ`ôð!Ó‰ƒ+™Q#SþÝ GÂm8zÇ«(B±(¥¢‡‰ùàH€w’ÊW\ĚĦÐ2 æ<µ6ìî€TÏ{¶ãp—Éõ1¯n½Éûuhù÷èªn©WЧÝäQYTwwä@|i=“cÈ^•³ð¥ºÃï]´Ž)Ñ”¿å`PèÖ…S¸úoþôPr˜±d<ë1žºVÀ0“Â=`zy+fáämØrÓl¡*í÷ ÏãÚãnW„òb³…×™g‚™ÄáZH•ýoáúì{o–ÅI–¾ñÜ;":ÿÚˆfAÎô–> endobj -1380 0 obj << -/D [1378 0 R /XYZ 56.6929 794.5015 null] +1397 0 obj << +/D [1395 0 R /XYZ 85.0394 794.5015 null] >> endobj -418 0 obj << -/D [1378 0 R /XYZ 56.6929 489.6987 null] +422 0 obj << +/D [1395 0 R /XYZ 85.0394 453.4423 null] >> endobj -985 0 obj << -/D [1378 0 R /XYZ 56.6929 463.7183 null] +995 0 obj << +/D [1395 0 R /XYZ 85.0394 426.3513 null] >> endobj -1377 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F21 702 0 R >> -/XObject << /Im2 1039 0 R >> +1394 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F21 710 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1383 0 obj << -/Length 2832 -/Filter /FlateDecode ->> -stream -xÚµ]sÛ6òÝ¿Bo'ß„(>I }JS'uçšæRwî!õdh -²9•H•¤œøîúßoø!ѱ]÷Fø^ì.ö›b -?¶ÐŠPaä"3’(ÊԢ؞ÐÅ5¬½9aaO7%ã]ß^œ|õZd CLÊÓÅÅzKª5[\¬>,_}ÿòÝÅÙûÓ„+ºLÉi¢Rºüöüíw8c°yõÓÛ×ço~yÿò4“Ë‹óŸÞâôû³×gïÏÞ¾:;M˜V ÎóឯÏÿq†½7ï_þøãË÷§—?œœ]ô´ŒéeT8B~?ùpI+ û‡J„Ñjñ ”0cøb{"• J -g6'?Ÿü³8ZõGçø'•&ŠËt‘(N4MÙ<—)¡ -¸–d’‘Ô(Ùs™³9.Ç]ŽËÛüs’yqc“¶ü·=¤š4Sl1}„@¿k1€¥0MP¸¸±§‰ ÂáRn÷[äÛz_uد×aƒÝÖÍöË -Û«»Î¶Øíjl÷m¸®›°¯hmskaÞþoáRÒ!S³ü×­†#À ༠ŒQaƈQ -…3bÇ•ôعv•w9ön®õ׺Þýæ”é¥uã6î*CoSnËî…ë«álDÙõ?•› öŠÍÃ-À2\u}ö-oíæ.©ã]y7àæ裑0î ó(¸l‰XñeU‡ û¹°veWÀ+Áäò¼Âé›Oxv78»Ýoºr·±8º-í§öî ²ñ•ùn·)‘/à.oò.ÐÀýóºùþàÀUîa†ÇfÔjwó©áK;E™só+»ÎEÅä«×r¬6 -Î8Àv Yú#nšJvFŒà:ì!aèODfí´,GJA™…"ŒKDÑY&–™¢”.Û.ïʶ+‹6)nòª²›1ûìÖVÑ7M¾ÝæÍ ¶À.‰‘™ðÐg¦pÓ<»ílÊ´¸£¬l‡½_©¢an÷1_­üA00c ÏƒdR(âïa ŽÃÓá–]Ýt=ìap6å›Mý)bœ0­C„ûã6 .,üŽ~Axõe\ 5â !禬Aµÿ㛹—žË  ‘Ëê'¾èwöWJyUve]áL^­°óK›_Û™ëŸz0£¹‘`’i‘ÁœÃæ°N9>ŒƒÂ›¯pßÕδw-Üý|µ-+@²É“ðT­ôÁ vu8‰v.¯màe^ ÓÅò ê8‡m>°­8Ö….«|zÁ²Ï ½‘qÒ‘êÀxo)Y:f•–Ug«UXóˆ°Ì3Áá¹…ý\^mìx`ìw¨n0²ž0:`´›Úù—¨»º¨7m¼5ô„Àë}·Çs–—Ã;ì;\)p>™šNu@Ç÷‡Æ]x‰«Þ -û‰5¶˜|:×裟wÂ>DÒÃP²N€R-—.Y©q-žÂ[F@Q -‚­3ÉÐèšhÖ}¢ìü±¸¦†è,»ß²¢O‘µdššŠgKk1ƒ<–VO@͆›¿,­ -žøiå2‹[¾þzÎKFŽ<—[¢ŒSWx"É*„ž!œÃüÊÁü¾8Ü£ét/ˮ竮Ü;ôb¤r˜ÕFÂѯœËªdn2¥&(©¼WI1Y–.F» †]Ušw6Ù¯vøñÍOUûíUdí#nwðž kòª]Û¦}ìi6w:Árêჺ² lødûoéê.Ì·ý6½ôK8ÿfïúï¾qæÈ…P#î_!„\ýãÉ|Jœ•+ì@i¹“Ç_E2CÏÔql=MEŽ>‡\Îàç>iCڣؗ_ñL\z8 š£j2ÂS¯ ‡pƨª?‡*§‚p‘™Y–‚å+×wc(¤|¢¹ûªžÇÐL!Í#°|˜ÃÛü?^r'®?KDÁ”5Sn†…ú>ü5CìÊ2÷òi_ó.ïù¨7¹l˜¬™óˆòÉ—My"\ñ0UröñÆ<éßîélÆýécNúâ;̾êsØ¢ž|Ù”-.…•F³Y¶@xָ˓]íªíöÓ?=Ÿ¸ÞćŒAÌý“÷÷—™?”ÐþýŸý/›á/H ˆÖ|þŸ)‚¦DC"‘òASvT˜€dV9í;Fý˜°Mendstream +1401 0 obj << +/Length 2863 +/Filter /FlateDecode +>> +stream +xÚµ]sã¶ñÝ¿Bo•;‚O˜<]’»«3É¥uœig.ž -Q2'©ˆ”ïœ6ÿ½»X€2}¶{ÓñÅb¿°»Ø…,fþÄÌd,óÒϬ×ÌpafËÝŸm`í홈8‹„´b}}uöåegžùLf³«õ€–cÜ91»Z½ŸgL²s ÀçßüøîÍÅÛŸ/_[=¿ºøñÝùB>sñýk½½|õï.ÏÂ1ÿæo¯þ~õú’–²Hãë‹wßÄÓ碗¯ß¼¾|ýî›×ç×Wß½¾êtê+¸BE~?{Íg+Pû»3Δwfö&œ ïålw¦bF+• Û³ŸÎþѬ†­SöÓÆ1#u6[(Í🶲`V@²Æ³LIÕYYŠ)+',´r¾Ì—·Åb¹-òª¬6‹²j‹Ã]¾=U_d–)cålÈã$Ö„(j Š°’)Jd¹º-ट7 Bq ñ‡r»¥Ñá\¸y±«ïV›oq¨ø<(AТjeÑ| j~“7ÅŠꊾyü~ù3màäÛM}(ÛÛݨÿlá9³Êÿ +Á¼12ˆY€l÷¸~b_™1ǵKd˜Ý•Å‡H'*(†,óý~[’]à>?ämÔARȼÛØ[Uâ!Lhƒf¦àBÎç^΃ì<æ€÷9& qÈ%ZŒr‰`J +s‰È~˜J8–y%]Äa].ë„Yƒ`ãÕc˜pÖt—²°pÑrÎ6äóŸZÐ}WTQ¶·‡|·Ë‚ÎR3o£k&Ð+÷¿æ«Õáý—ûC±.?n‹êšþ¬%óxóŽlöž0nêͱ¡á}ÑüZ~Ňӯès=eð¸y¨ïÊU±(?®/ !†4ÅïÇ¢i_Jc$G±ªšÏÙ»8®ö”¨:în’iŸ¡&Ö—‰ÐòªY‡æ³v/ î0ìø 7œFuU,áC¢øŸ$tuáM·EŒ™~Jéߊû&ùXø4P=À 8$ðþñÆØuôÑ?_®iSË¢×´ÜëIC$!¬‡x¶x 3«Eá_Ã’(‚°À{ÝßïëCÛEN®'äÃz™)Øô9wÙPÔ졨Þ2™…E‘ô©¨Ùl±¨’+&•õ“ÇI¿\ß?Ï X¢Z©3höyµ + +àIsŽd|Ú˜ýÉü?Äô‚I'í¤ Èc[Æ”.êÓÐŒi{(½”® žM¸Bb8é ×#~½.#f=8šJY¦Ö/f6¶‰r’™ÌèIÚ¤;»—›Jj¸Á¦|/ñœ<ÕÏ1‹y1³±Y4çL{7" v]Ó óž®·'÷×3ÒáxÿG£äW× ‰®ÕzŒÊb²”øó«©B8jË„†`é + ÷tômñ ç²*Û2ôÉ« ~nòM1Q•TFW·ÅD“)ËO­bà!-hp2ëSØ dãªÈ [¨\aº¼…Âu &+›¶\F`(_á{SÐ7ošzY™ÍcÍÌ© †OêÎÛ°êð|·F!C«í©¢ö´ß¹§­(ÓGÚ ¸˜Wà@.è §ú“dê}Ô÷ŲĽÅ*ôü¡A“+ +Üc›‚†¡ûQI¦†Ð©er¢,¡iàzþcÊy•Êxìê¦=á¼$27 ©mú:÷m‚JfÚäá»Ú†¼›§;‚6þÔ4­’³AËö°²†ÖÏÛÌÇ3Gû¯Ø²®Öîa ÿµÆd¬˜5Ð,°?0Æ~Ê =>Zé§ÜPáÛ–nhÕ|ZBÐSBæq—ië=A¶ô‡=BJu…ç°9BFñ@„l#BÉ—U…>QÎ'ÔRz£RgÚ°‰àÒÌ÷@+ô_¡—ŒgŽ[=>æÇùX‡Ö3unó² +ݧÃò˜ÀAStmöÄÙiΠŸ{ÎáI-°§ŽßÓ¨ÕupuÙ£¯'hM èÃŽ´$,J…÷©Þ/è„c}‚.'µ^]¥§“<=!`Œ–›ªî£V[N  Â] ÙYã¤7b@ƒ5ak!y:ó ûdÞÉ)û(aI7zèèvÊKh(Ä´ü_yMØã^3¸‰•Á¢ÔŸ\áñ-¡a]âD}0¡6óûúHƒUÙPz 3z˜Q: 6À0ûã<åBczÅ寮 ŽëcÜ“¯"ƒ¼ÍÑr™‡¦îð[‡Y¶ôÍ#•ØéãÞ—p¯»Hv}<€ß¦r* ñÕ†G'…„Ú~ò©Š‰cÊÄëÉrÌ@\Çó!'OQdYÂJï7#Jpo‹.ÿtî9~-ÆgYu’»= à#Í3r·„‚Nwî=zü˜¸)ʼn[ºÖ0Ï­ŠoK|zq  ·E°z˜Ð+¦uóm½ÄZ a})G­ÁÜPwÐIÃb8aÀßåM;@éœmú  ÙÛsH`*‘@ "c@ËÌшãz¡ZF'' òðlþGÈ›8JÍ.Î *REømDïM°‘³ól¬•žÀ·ù] ÉãžðFÔÐjp9mmLWñµ>ðœÊJÊq¸³Ó• ö”k@ù¨U‰œO§” ÖJyòËFo¼,ãó­•T„Â,øË*‡Š»´c_7My³-äE¼§ég+§ƒ¦žÎõó}/ Ÿoc=0xx +ÓzTÈqijûgõ¡’**‰ÈÕ"v Ú5™Ùñ5tbOL?–„/UGÁKŸï­ÿzƒÿN ôIÇ_˜C¶QzØQv?\Áò*.“¥︧—\í GWX~lëô1àÔ|êùšRŒnò Ð€ï+ ÁhxuÛ×u,ˆCC¿oNË!j~=ý$¬Ü¼*‚B°«ŽI¸ÍKêñ¶/ÃïUÊ•wC }§¡E?¬öQI£Ub_·_ÁH§ô KÝñ*7¨Êp÷T)¦T,Þ›ñE9õŸ +¢QMþï€>û¿<úÑ–)çäôOÍpŸaêSI¨ðÔäþ²-™Êä„èÿ¬O*endstream endobj -1382 0 obj << +1400 0 obj << /Type /Page -/Contents 1383 0 R -/Resources 1381 0 R +/Contents 1401 0 R +/Resources 1399 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R +/Parent 1398 0 R >> endobj -1384 0 obj << -/D [1382 0 R /XYZ 85.0394 794.5015 null] ->> endobj -422 0 obj << -/D [1382 0 R /XYZ 85.0394 690.4757 null] ->> endobj -1385 0 obj << -/D [1382 0 R /XYZ 85.0394 663.4801 null] +1402 0 obj << +/D [1400 0 R /XYZ 56.6929 794.5015 null] >> endobj 426 0 obj << -/D [1382 0 R /XYZ 85.0394 582.7428 null] +/D [1400 0 R /XYZ 56.6929 654.5469 null] >> endobj -1386 0 obj << -/D [1382 0 R /XYZ 85.0394 552.623 null] +1403 0 obj << +/D [1400 0 R /XYZ 56.6929 627.5235 null] >> endobj 430 0 obj << -/D [1382 0 R /XYZ 85.0394 310.6261 null] +/D [1400 0 R /XYZ 56.6929 355.4402 null] >> endobj -1387 0 obj << -/D [1382 0 R /XYZ 85.0394 286.2805 null] +1291 0 obj << +/D [1400 0 R /XYZ 56.6929 325.2926 null] >> endobj -1381 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1399 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1391 0 obj << -/Length 3884 -/Filter /FlateDecode ->> -stream -xÚ¥Ërã6òî¯ðQ®1x$P9M2ž¬S›IvÆÙG%9P%s‡"‘²G©Úßntƒ/ÓcOR:hF£ß ¼ð“—&‰§ÜeêâÈi.×û q¹ƒ±ï.$ÏY†IËá¬on/¾z«ÓK¹D%—·Û. kååíæ—E©è -0ˆÅ·?¾{{óÝÏï__¥ñâöæÇwWKeÄâíÍ߯©õÝû×?üðúýÕRZ#ßþíõO·×ïi(aßܼ{CGO }ýöúýõ»o¯¯~»ýþâú¶;Ëð¼Rh<Èï¿ü&.7pìï/D¤5—БtN]î/b£#k åŇ‹t£~é,ÿ¤ˆ”NÔ c9` Q"Uj\”h¥=¹Z&B,~?åÇó¡>¶ËC]—Ë¢jóã}VÒ`uÚ¯òã×Ôù Ï|¹T:rRÄ—K)#gŒòÈþ÷5~õVÉ˼"—±‹L*’îÊ”€k€­mò#qõC›µù>¯Zê¾ÉBUE[ÔA²jCŸ›l—óVzpBØI%‘ˆeìwº½Ë;zúIÒF‰Z„ŸÃ<Æ¥€I)ÜOÐ&äbC´å u×wÙ1[ËŠ¦-Ö lkú_åôŸ5M½.͆úE{Ç#ôw¼’v‘ïëÖ/P‹*ÛóR&dU9½¸ÙŽVh)Òô‰Ö–ù•\T;ØÁßVl#mœ ·EºS ¡°òukóÍ+„˜E{—#˵òÀ”cVírjÖ[^åijhZ@µ®‘N¤e”j/~¬Ê3Rjìë¦ì¼&44 ª2;5¼";Ê"ç=ÿ.óÿ›2o˜ Ï*Æ"I»‚ÌÔ4?[QÑ4”Í¥)_9²­ëj;# Bij,OˆËRê(5 -ÙŒ2&“ÏI¡C…ŽŸ“BzŸÊ)LõbUÔ¨×ëÓ‘šѹAbÚú@2¿ÏKž¿MLu…×°;3V7"¤ä 5£/ª¦Ø0ælæXZšHí˜àû"˜Ó­8²óºC¡Ä¤Ždû ôKm]dE%ùémRÇÌ3)¹Íà8س‹ºÊ ì -€=ÉËìÕÅ"²©yÉÝ©X>Ú¾A%3¶ôš{µwuÃÛ£¤hM –`K§¤Yd-4Î<©>,é‚I‰¬tcU¨½½Ò„„Ïæ5´ØUu¯³q*ü øi4á¾[‚[c§gΨê9þ¤)˜NpVÏó'qVÍñG˔Ά›ŒÎ6ÝKÆ‘²±ú³{Íð¬Î†Á qSƒ]ó)ÇìÜäÛìT¶MÔ™¯ôÆzÆfq®OÔØ GßkïPOuœx`hû±,!¶Ñ¸âÿ®¸/ªµë¯_eÞ k3ä\âûìø±›Y´ôŸ1–U½;qó¡(Kj±¹÷Úh·§#ÈÝq΢b¨@ÆÌ( )˜S¯½Rxkç!Ìê@(q -vx;«R62 ×|?Dãì-Ê$ ³Šfxm©ƒiéÄSD&‚–ž˜n@©_bº•ˆâ¸ïñ¾“¸,>mçÏÀÁv N íÜ&oÑW.öé%€îrÏußñz¯S»(ë5Fbë¸êØ QÝ4 ú†ùû¬i“d¸g˜B×Ü`ÛmˆßÔÇ!AEÌH]$‰£k/ª5 )‰§G$‹?¼ÝÄV !B³õ´ ƒ©~Ç@zl$ìÐJKG†àevŸ#H ^²×Ò&$rqš²¹B4-ï9g•4„¿iÓ9Ÿ“/0&.îœï<=8™0°©Rnì‡z& ¯$¶«TQR3//žŒÊïÊCÝ4ŪÌ#ºÈvÓþ`ˆgö`J§ô‹øå2Ðg%‡솻õ(:PãÀÔÓs¼ŸRó!!l­«%çöKúú9AÂKT’ÎjSXÝRt:!+Íš§·óÁUj"#{¡Š‚»2:ès}à°U¿ Q@.Ørœÿ»²^¡6x˜_ÚPgjû‘Ñ0È{Ξ4X27IŸ26ªÙÈ‚Îú—'ƒÊØêà厤.OÛD®—‰.ܶŠ,›%eeo–py!ƒYBØH•ëÍÎ󧲔Jà\Vje]«†êM«fµ®5ÎŒ¹F6H¥ÉXŽÍbKÚ¶çA’f ÂÆ‚m&ç`ša^oQQ3mš™°´ú•í«!`,H+ŒÖÛž†Ë«Îi=m61¤°l¾!愘Èé'¡F -ŽuE/Ãëd:A†ÑÁ3ˆ¢#/¥/—Ö›¿ÅJ‹Ž'fÔ€¬ Œ òɘã#Þð0qçX§ Ñ1‹À²S[ï!é¤Ô3^lÉÔAk•ù ö} ("jÞÞqòºå€Ø§Ã^ýûd`QêëÐî¿]T¹g@h ǪS ¼yAÙ/zûb}GÍÁáíð„®;¡ã Æë(¤ÇÖ&l_·_C+憺ëÕv•áê¹P,Ö±8g>ë(—ݬ/š»úT"•„fåCvn¨ýP?¢æ$ LJ;œŽJ{G -’¸§Ì¹UQ¬µy±9S‚DäÚ¬¡4q§DÏk\êÜÈNò¹ -þ÷7íïþ@ÖGÝþ”ìÑ»y=@– :“Ž£H2šjÃíA£³Êäò:™‡VN†ÌjŽ·pÖªöU%€±Ñòm’hxëK3á$Åž7«y´“<èäåb[3–üS¶ÇÐ1ÐX0Ed€­îHäkœªJ/僲:ívçI}o}Ìš»b+µ®Ç+»8ZÀŒ‡Z||h1s&kb”ž©ËØX[œoªæ‰ÂBÜÉcÔûúRï:1‰í#zi9hˆèÖ%zÐæ8sßòÓCËËjúçMÒÅõ›wxÅÙËûý©£ç/ùr*£ÇBÆUGLÝ‚CyA#ÆÕƧsºÙôK&i$”Œ¿ ̘*Oî‹2°¤«Šá%-O›Ã²)þ˜« -I.±nâ1!@¯÷d¹8‰ æ-´~~óy´Äi»%é±l¬j *|u&¸/ˆïÈr‘Ò5ÞÒŸÜZ°nÉXUF)’tã;1ø畃ð¤,64–¾šF*‚’¹P AVç–ÄÔ-~F QÔ§–ê|8ØÞ æ20YVM ±(!TC7ç‰Øü÷ög˜e46’o–ê¢¿í²¾=•c”«)ÀÓ¢¹£A¬XôÑ<#ðl0c˜ʣð {´óÇš1q$$qWÎ$͘ºŽœa„¼‘Ž¿"Ø66oVËüÕÔ–õaÇÈ ±ÍÃê, ?PtƒCísª]„GXCCŒÁEíÐ+IŠv#D¾ -ÿeÆ4MgÍÛgŸ>«¦`®t—tB!uPS©ƒEçö©ØŸöØQ=Ô¬³8ž7þˆÖ“C+¨¥Ô±Åì¥ò•O7Ñ*´Š´4Ž´5íTM)Eª¦¿ü€T !¬jªuª†ƒ$/.äÐVñS@zUCèXÕ–ZHV.>$Š_ià?(Ž³¸ô‘$“ž~¬ê‡©È|¹dþyqceés9èÑÓÌSrÖµ¯Qè>¬ñ&r‹‡šÀ\¼²zX¼ÂÀ \v½9_¦Áù!Ø« hÆ¥¢aÞï>ÌV¢ŠLªL_Š‰¥¯ €Eb;²Ø ¥:.Ë‚™Õ‘L¥œóM}òµ<ãٚÁ&ºSwÅÿV&ÒÂt -\ù`sn=?ÖÅèg5´µÏa»==VtÄ|žÄÉâaÅŠ¸éqƒæŽ°”_åÌXªŸ? -Äë}Ù'TÝ“ô$‰Øñ—(#ZïòK¬ËãdZ¤Â+@P‘*zêc.™AÿTm€Ž¶®7 ?œ¿Gˆcü=ÄFŸFa3L?díú.”˜ø#ÙÀ蛲{,/b´Žÿ„[—Eä>qñâ?h -½¿…ÿÒˆ ÿb»=S‡Q_sö:CmïNÓ¯BÃ{:ldŒ$è&âàê³}ª8v×Ä*ÜE§©Àû%à…D.=íVÀ¼-DSo}qu&ùÅš˜ø²ÍR Û½2úB8ªW`ð<~]×*~â Öa´þvlD$øXTŠ'öK5hvÜíì›Ki×ñðˆŠ[x×Äqé$|b°Ê'IØ„ˆ‰õî xéˆÁnje‡:™v娔.@Êbï“ï4„Aiø€…æQ-ÓÉj}:öa!ŠjUŸ¼6A'Ô帮8òEÃMFüÇeã<ŠÞU)1㣌„sþ)L—ê¾x†=žØi5wàp'Ÿy ÃÄÀ³áìœÙ:˜äÎY‡G¿yÁRõõ’ŽæåÅyVÊÒ8R±çhQx}•‘pþõõÙ8l- -üú˜ŸŸÈÞHÔ4{!ûØ€(‚Ì}„`u÷´Â&Ó¯À”€{u  RËT½ä;09kíüW`ËãrˆÒâ59?˜p›$ýÎ^Y6sI¸ŠlMღ Û›Žø©z¸«Í„S& ´MÌš@~bòû0ãùÍZä+pk|GðY@Œ9è+~ŠÐžùÅÀNMQ0¾¾ýpóÝ«é­@š_¦¹È&HCÇÝ%5Þ>ª ³—ƒéÄïá)§8‘€y Ú¦àQÍ”©“(M3$äÑ7}ݤÏïÿs@Òî¡ô,Ú¬äOð9«æ -mÓqµÁ&cË•B6ÿ/F”zÞ­à÷Ío\´´j?¿ ¾=· >¸P–WšN‹!¸§q“= VvUÖžºr‡éJh†E þwy•é«;ìžbƒ é<,B &„# -€>ÏÁž´|ãp€œ1LjñD#”®H—‰N¯ç«ñ“—/t»¢ÊÚÎÎŽ“žçêu#óMÏ%¦7/8Ê[ðUWØUaluûdÈ,\Ìf\¯KˆüN;âbÁDbcwÌö{Hê|}nsr„Ø$ÏXm ùè¹±B’Y?4ÔöæûSÙ‡’§ NLµ4~éUÂ}îÓF™L¥ú+eþb»àj€Lâ(}ô…Õ  (™‹œ{rø3÷­°6ø¸1gD÷í_þŽ¸ÿÈ:†xÎZ5oOTjñY¢ü÷ºöåáƒãǤÿC_ý¢endstream +1406 0 obj << +/Length 3514 +/Filter /FlateDecode +>> +stream +xÚÅ]sã¶ñÝ¿Brç„â“ 'O—œïêLsI}N?&Édh‘–Ù£HE¤ìSÚü÷îbŠ¤¨“¥û†ÚOõö#0CEÑüö!'Øf·ÝÔÿ¨ïé¿…^à¬%zk‰X2 Û…¸Êf[?Y¾(>Ýoýè>eÆ2ma48­²)Œ 0„Ûü—]Þ´'f“Ä]–é®Éý¾ +ÿßÖô¿N?º Åó¢õ»¬›¦¸+ón Ÿ-”0 L‚%ÆH‡:+š”†ÆÊqÂ5vŽG±$àúŸoo¨•?浞¨%çwuû@°uÚ´ù–ÚÈ×hÊôÑãƒk¿Xí{w›M½mé£h_A#óûÚcÉ?¥ëÍ¥˜ OQ]y@ Ñ‹X6Ø`“oómCJ_øÿ»Ýjµ§&Q å6mr?À­ŽÀz»½Œç»Më;²´M©å·-Ïœ~à_Æ:jfmLÊz;­k ‹µˆ½´ó¬j&4Bjfu§¤ Þ"žg9ð|]TH¼)fl©ÓÉ¡e½LK‚O¨ýT”% HÛ6_oZ?­¦¿ˆ_½yÿÁÏpGز^¯wU±LÛ¢Z‘–i°ßب¡ ž +§ÀÒ0hl/S¾®[ÿíIg…6+¸·Yäx~Ÿîʶcðû"˸Ú³fŸO±Oh–h,Š„N¨Œ¹g…$9Ó²3IÒb—mMñk>±”‹üèzÓ52ÍZØ)ê’²‘íx  ïß|çG!Z×jÒ–:‹† i¬j Ð1ú¾ÛO‘ ’P‘ JU¥ë<› S¡VEÊò¢œàœ¶{”jG)9‘9‘¾0•H†Â4øûe"Á9õ?¦åÎ)«û£ÉÔa„$(©_2×<‰r·oI¿“ùÜð>Šz×6à›©³}(83˜xéò |Ê'c`ÉŒ•a(x 1Â*D€Ø ƒrä;‚ á„íKÅ„C‡N¼oêk,]¬,<‚>üw9ïvL}Ö=‡ápÓyŽjï75ˆD1Ó]V‘.?6´tÚÐr8»OÌçIMîGþb^T”#§³ˆ›ø3µP îÏ ÍâüV Ãð{q*¯Aug5ZÎsw¢¡B, °f<6´†ø»¥Á4 òŒÊÙ9@Ð+:êtçqíª èhë:óð=Á}¶ Äã?@böÉÃ(Їᛴ]>õÌ~ ƒ]c¾îÄE[±Ë/ðŸpb "If@ç£DÏÿ…ÎÔôбtg/4šM¾,î÷ôñôP,¨IöBmwŽÛaCñØH=’`—ˆÃEÐnÚäÙÖ +É¥ ²è¬x¿¼kðKÇâ[t³¦AÎÔ×÷«iÃÉ_¶˜•ŒÇRõ”¥ªnérC5ɳW“éÌ/þÀʽ…ˆÔ¢pZ¯gX¶Öƒs~Ê”e*éøß´)äRÀq~’/J8DåÎ÷î.¥#"FáKØö|¦’qß&-!Æ–?µRkW.°!þ‚Fµ[ß¹äƹ¬Úb\-wÛC<Š°¢º«wÎšàƒŽ‡º#Ëut‡Ùp‘ÿqÚ0óƒ¤rJú­ XUÕSþ\—ŒõH+N°G)’èþ‰=TÄA|xÖ{@º .¹;í«Í)Å’O*<Í‹WçI-³šIÝ^0Tº Æ“D<3•F~}Ì÷'ê †Gr\oÐöd  +Ä£† 锥*¦´Â"ãR£„`Eii ¡„˜à9¥FÉ’8Ž§ ‹ßâ€jˆÃ8,Z)Vuf2J É⃀²÷[9§¡½ÓЧj‡p¨ÄÊŒ¶>f/G¯:?«|’—Pº +ÿdÀØ¢S—F•I—>ñÐ⃥‚‚ŠùžT”TBŽŠ1šß~¸~÷j,!"£h¦#Á"¥cd unW3jÜôª¶ÝøEÂqÕö/’ñ!¤ÇNTsDMd˜j@ÌQá8 :GÁ—烠Õ}ÊGó6-)ZG°“þSXk‡e=ð\Vòù?<"ëŽðn†+ôÀ{njÕ~vbXÈözE’A°ÂüašƒM2ZÓ`B¹ªÒv×ÕYLWô3^Áà•Wùt0£Ï]Cl0¡Ž“P áàÀ!QÂ/h¹ÆfYg„ŠYP&‡€t);=Uyl‡J³Åª¨¨ä8ÌšžUa¸o~ÿ²+|”?ôàw]AbU…¾»}X/ Cþ`Åd²äðº„Èo·‚ NsO$6VÛt½†¬Ð}à™z§9@™èŒ×6Œ‹®ž¼6b…,µ~j¨íœ6Ö»²-6¥‚81ÍRÀÎ +kî{„»ô»Q'zC©çõzþb»ðõifc1Š¯{Eé¹èóΗVͤôS± &MË©² dŸJ&ñ¹{>ë4ÞÅc4bi‘ÝøÊF›C: µ¯ú"ôú»GM Ÿš8Pä§ôÓ>’e>ô8)9Š|rdè„ ¦'kÏ£"\‡\ž›~.pŸb œêVzèð £ï‡ÜU€'iƒ¾ü1/ƒþã<K š¹KŠí!C¼ú¯K§²Ã"G/ù¢›5TÂÔU„<á¿çÕ\}IÎ?@¼W¦Û^!T…‹)Íi¾ 2ÈÀãÈh¸-œ{b[Ò@Fi¤y±Æ)–ØÀŒgìç-‘n):EŽ*†t.6C¿›åmZ”Í«à<ó‘{Íòf¹-BÝÍ8ï5å´ VÃ{ä—©5ú¬‘«~‡‘J¡ê¢G༘Œ•a%Ti+ÏÄ@ÝøEÂqrŒwÑÝ¿ÂìI„O‘’’Ž"¡nÔ9BŽ°õ …x&UW(Ô缯€ƒÜi‘FÎ.+ÏûÝ.7`œ¦XÄ|¹Ç5ÁãF'=®y¦Çu-ô äz­e1×#S¢­`¶Û•(új|N­}^®†>Ćâ¬3C›œô· +úȺ­&ÇSýnO" Ž æžò·Ö0™tOÎ +Y1Þ•6ÑQîEin¦K#/%ø„×í_?¥áÎäöÙ›d?÷”×…x +øf^¦o¦»Ó]R&·âŸ\DŒ+!Ÿ™“«ˆÏä®_?kN çÑgÍ Ýå¯}„'wgUw¶vÖ¤BÍÆ•3£¼[ÎsëßP`IÅMéY“Ò·&埯`ÇЋ_bG¹™Š_TävRÐÅ© y€>5<„ñû`@˜Ãœ2 yÂ)tƒ… *{iXÌé€%ÂK»ÎKž—ª‰†:.v—‡zÓ<Ukÿ$ÑÿZó| 3 ×H<×~Ür +` Ç›Ó^-à4ÕÄwn&— Á1 i!1lÚbÙ,–iUå¥OÎ>*²îõ›Ï»Ü2zTk•ì±P˜9BÁJÿqBøÌãP£$Š~ E…ÅAlaÉÅÃ6?;Kpÿ%B1c5V3è¢ø“ï"¤½ªZàl¿ +½ò¸?ùA.ë /„ädŠ`†?¯ñäç²ÀÄÚuüæ§~P9BJid2ª"í‘16šçX3z)òÛS’åøC–D%¡DßP®8TÝË®ïÝ¥à±>ŽD}úU@ÜݨNQ3e‚Û·ÚN\ óÒßÓ{ÙFå +b`µ‡­âz #ýãªBøË 9oö ¬Aí4[¹M^Ü°ØÄj¨¥m^Å…2ǪW̦¨§×yع/¡TtáÒÿ‡ÞQ?î:ñÞT|m9ÚòNSþð[ÔÃC]m™Šã12Þ—Ç2±(§“ɘòîÑê1éÿ—ðl endstream endobj -1390 0 obj << +1405 0 obj << /Type /Page -/Contents 1391 0 R -/Resources 1389 0 R +/Contents 1406 0 R +/Resources 1404 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R -/Annots [ 1393 0 R ] +/Parent 1398 0 R +/Annots [ 1408 0 R 1409 0 R ] >> endobj -1393 0 obj << +1408 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [87.6538 116.0624 137.7628 128.122] +/Rect [116.0003 457.8291 166.1092 469.8888] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1392 0 obj << -/D [1390 0 R /XYZ 56.6929 794.5015 null] +1409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.2874 346.5415 467.9594 358.6011] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> +>> endobj +1407 0 obj << +/D [1405 0 R /XYZ 85.0394 794.5015 null] >> endobj 434 0 obj << -/D [1390 0 R /XYZ 56.6929 718.7806 null] +/D [1405 0 R /XYZ 85.0394 240.6473 null] >> endobj -1274 0 obj << -/D [1390 0 R /XYZ 56.6929 687.5668 null] +1410 0 obj << +/D [1405 0 R /XYZ 85.0394 213.5966 null] >> endobj -1389 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> +438 0 obj << +/D [1405 0 R /XYZ 85.0394 126.6995 null] +>> endobj +1411 0 obj << +/D [1405 0 R /XYZ 85.0394 93.8745 null] +>> endobj +1404 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1396 0 obj << -/Length 2509 +1414 0 obj << +/Length 2970 /Filter /FlateDecode >> stream -xÚÅY_s㸠ϧð[™µJ‘")Í>ew“m®wÙk’{èäv2²ÍØšµ%Ÿ$ÇM;÷Ý ¤þØò:¹›NÇ")@à@G ~á(–I4ÒIHÊÑl}ÆF x÷ù,t4O4éR}¸?ûë•Ð£$HW£û§¯8`qŽîçã»øùþòö|Â%«à|"¸¾ùD+ =>~¹¹ºþüË폎Æ÷×_nhùöòêòöòæãåù$Œeû¹ãpdÃÕõ—4ú|{ñÓO·ç_ï8»¼otéê2Šüvöð•æ ög,I,G;˜° L>ZŸER2¯¬ÎîÎþÑ0ì¼µ[‡ì'EȘër1d@™JÀ+4àýÒ @vHÃ$9çÀiê2Í«'Sž‡ñxRÛræ÷tÙk‘'±Û“æóa¾" Õq¾“g5À:k*íYÏVé¶2\D$ÇÕÆ̲§œ¨q ÊØÕ럟#ZB9ü’r[à$,ÿ»È Žd«š]ßeõÒ­/ -щë¢v*S>9¸Û;X€wN$P¯ÎžÍêå< Ã1¸g¤ÅøŠ” q#}q¥Ï7:ä[äÀëðfx‡’±zÓ•Oš]={ÌP,Îái/éWƸ™(ßeël•–N-‹ìˆô´_û;ƒ•®Z–cW-Ü{D-.#‹Ë7{œíñ -}®Ht=^$*ù‹€ÐL8Ä­³ÖÜÔi¶ªÞ”TÆЀ¼sSÍÊlSgEN ÅÓP, @ ™·©–ÑÉ •Zü å¡ð¬³|#Ƥk.­TŒ(E/Ëň·Xkè'Ý ‡°vÈϿøñöC`U DR -ØÞé_ªS‚pCAç 181bH”úú†þò¢€;~¥ŠÃašŸÆ]q¾L­Å$;âJ¸ê(âÊW"®!&ôjÄ,’}¨!U€Pq ìÒ…f•ÉkEÄVzb)Clêä(Þ -xGÑ ¬,ÀV§íQ¦˜`ï1¼Õ2à Æk/Y¨{‹GÖ&À‹ˆØ¼LŒì¡TÈPÈuaºhq÷£žrªºÊ!0A]þ¦ù6“¡î.ðT…â ♉¿&ž8€žb™~Ûšòûá”0¦¾NÀPFI2Àð¨vZ4¹µ‰&¡YMB%®:ÐÌçsÍ(šðÝŠÝÒ‰&KÒ&˦ SGЩ_b+¹ª_„²šdV2¡]á²å'úIçm y¼`‘Ên±‹P^A8f˜©/Xäñ‚.*Œ”<}«Rõ:6uy:âQ Yœôéÿ@ñWË×{˜„{UákãÇ׸r ¬)…´ðJtäƒy“‡Ð1åI¹­j3Ÿ|3/q½«ÓÚ¬ g±'*Óõ:-‰ÔU‡ -¡½‰”+)ºœðþ½H› 4=ç¬ê2ËD–o×S¬©¿7îÒ¿·lYŸáÃ!ÝÛùÚÇC_¿’íÉNôûû!cƒ<¬8̲Fæ¯5ò'ƒ×˜gmqCù¿`öðÆú'jŽ¨m±zbr„’cUËÜ µÆX½Z m†é§›»»Ë4®Ìl[fõ ÍlpE]aWÃÂeVyfX -Om5€Ë‡U%Â@ÅÐ)GPã$úTUéé'Ý CÅÜ>ß~U ÂDA¼/d`™(é sد;¢ð¢jëâñ…·ç¤Å/Î’ý>Ìú#olšYóÂÓßšW°ñnirzAu 6Ûé*›Ñ¼¡Û¨Á ¥G^ä“t[/ 8/Eô§ej‡‘±?ï[^ìrÛ±Éñt넴ʽ`S·ÕzŠOÂÇ6ˆ)²Š)´PVn(@ZRo»XÒ¸Ò;h½m"ÚÏ0óÒ$ÃäJ+ñ0Í^´&ÙëíaT ³s|6)Éìó'mó*[ä¾’ÙC§/¹Më×øpFÇù2­hejð–piVäx gª¹ÛèèRšÖåy<¶áLsdè²—ÐÎ’®wÕÄ+­ûì€à‰ü†e:÷òœ‡c)?§«lÞÙœ;¢ YóÙäCZ·×íí½ï…]UQ¬0oÞÕ€6›ÚÁc0vg·m³GÈÕª!vvZ§4ÊMµÎ‹5øTÕ´Ü´×'î&˜d‹\í Ú”²Û…= *‡á0ú•IF0 “YQúR©Èç6§à2úI„!MWÝŽ õ[ºýFq -±c N|}í\”¸Ï €·;ɶJð4ÿ‚ãiH¤ Ú2_QËëÖ@ðÜ-SGÙñ|J‰\2Ñ{ùÜêIÝ^•¶]K:Å•}K ƒßç¬Aaà -£Æ:0¶ŽŽÆãW'Žc_ÎÛ’Ì5·Eeönmߧª¦ƒõþßk-¨üýòŸ¾TPP+¨¤o—ÛÛÊÔûÞßšô/Þß[rî2ïߣºåtÒ£E“2y½ÕB¥Š‘¸ -TÄQˆÔ´ºÞ®êl³24sé$Aõ°íÀ¼’¤³e³·‚‹v!’8—K|r²¬]€–‚—–ótmÞ‘­ñ£æ{ý`¦H¶o‰¤G¦º˜+·”®˜Ê–k;ŠqŸ$`ð!…Ü«"šÐm\Tƒ6ƒðÊÜÛIxΥŠl@ø»M:3^ž:úanv«Ì†‹àÊ÷¢û©p––e†•_/ëmé¬õWD»E^4¹¢ Í·Gº‘þ e±GÔæÚ®Ó—ý¦c•9ÜnüqµãÕq˜Y-ƒ#ÅòAG"\±üœ™ÝŸëDˆƒr¼Ñq¬‰… b%÷Üæ÷ªúÚíXöÒØ:­gËÉl•$MgcØ£t>ZŠÇ•EW\ÿýýЕ¨}Á÷­…ÿ³®P%&° -J³ áÒ¿˜ê±(óât·dÍSØOÒ®ùÁÞgHv·aþ±…ý=“A¿¾]ŠNyÀÿ°Mâ<ñ}¶=þã -Ê2Jªñ™ÒcSìLù´µ®ÇOPwA1µmcÖ%Z ôÿj*úW!%uý§ÿnÿ1t â˜7‚© æPô9¡lô$-«ÿ÷øPôÿLÎ8Èendstream +xÚ­ËrÛ8òî¯Ðmè-‹K$LNy8Ïî$YÛsØJR)ˆ¢%V(R!©8Þ­ù÷m )ÑLùÀÐh4ý–Ù,‚?6KÒ0Õ\ϤŽÃ$bÉ,ÛœD³¬½9a„3÷Hó!Ö‹ë“¿¿r¦Còtv}3 ¥ÂH)6»^~Ò‡§@! +^¾{ûúâÍï—ÏOe\_¼{{:çI¼¾øç9Bo.ŸÿöÛóËÓ9S ^þòüýõù%.¥DãÅÅÛW8£ñsÑËó×ç—ço_žŸ~ºþõäüº¿Ëð¾,ö"_O>|ŠfK¸ö¯'Q(´Jf·0ˆB¦5ŸmNâD„I,„Ÿ)O®NþÕ¬º­“òcQÈEÊ'ÈÅ”¦–¬¯×E —biÐv¦Ë7yÕá°¨º¼ZÒZWÛ¯ 9Ž?F‘È¿‹2®Ýv[7Da³+»bëQ²z³ÙUEfº¢®pjÛœ2Ô]ÕeëO%‚ëO¼Ùu;‡–ŸÁçÁb×áJ†ósû ˆ9c¡Nîn…;ª®¼\™uå¡_®¯ß#d²,o[„ úÿùB¨$¸°gÉ”è}Ýv·6B¤8iü8AÁn½-Ê|‰£Û¢[#T‹ï›’?ƒ‘Rî¶p x/6x¯ÞU§"ËÙ;Ù÷)Ú®ÈZ¼ò¼_]=[›ªÊAžHp¨±yÌÙ€žo•¢”„é¢,qÊJhÛ9æa!ÿ–W„zCßWpk +OS”4eoZïˆ4>&Ì­ÓÜ2Æûœ:¡ç„5SÝ!6½߶ž çêÆ% €îC÷G@2+5~óõ¬±FzuáQ¨RÜò¼š>KBÅSEÂ*ª¼›(P1NHY]ux”e•kÿv PJ0ipxýò=ŽÛ:û’w—ðÀyUT+Ä14„‰v›g‡G9f™Ç)˜¿×—b{èD¬Ã(Rb&#ê(QOñO€©”šöNóžâ|H]Ï3‘À iÉö'[«8*ga¤%ÝÂùŠ§‹@Â^ÅĽ"ˆpÌRª¿N=ÅGD'2di*Ç"0Ëes„7Tk)B·ë"[“âÃzÅêÀòƒ;qÎGéÀ/Þ‹qlÀϤ9œOkÁçÅ<¹ÇR¸=—ñ½‚å<{ár–jðJI”þ°`{Šó!ÉcÁ‚v„ŠAÐëѬÙÇ^²õ ¢Ä£«2ˆŽDSʼ«EüÛ)ª$’³ÖÇ(‰ pS´_f(aôŽÚÔC^NNÄßî#€Ãòo¥¬Ç[fÆá/é=÷oõ â (‚H¡¯“Ù8 Ô…‹;Öy +pV5?tíÂ…G\u>ØMÜà×±eöîµù©Eg¥×µêÅÁË¡‡tÇÖûã<„P!˜¨{ÖÑõ´¢ë² Ä1º°Û¼ÙÞPCídP¹`Å%505÷ó( +%õ 6 > ¸šƒðä` "…lᇮ§8’œ¸Rc ÷h–Íé0=eœ’#žÆ“=ÅG˜ðúð1“6MYDBÒ½E@R'ÐÂ#3œPAÐÀ˜óÇ4P…1Sz¤¨Î€8å-”agSé,€|…TfÓ'½Ãc mãaCÎ.ô(æUƉRÅü@8¨¼Œ=¢^‚­Š}ME…¸» fOÆî¼äÆÝžQÄ÷ŒôÊ +*ÌE y‘â6Ùò(íÛ{òhEð\Í’ƒåüK~G×»ßúMc6ÓL$ ö)´mhGvL)Úÿu/f«ævàóå,ZµÛ,òæaxˆÿlJ?ãýÿtÝçC†Ÿ>Q)0ÅûϦ„¹ž«J¡zé…ÌŸ*äW¹Mÿªbÿ°¦"Kû½5«|B¼ôEŸTL˜2º>q1‘Ö5®’©FV,‘Aפƒá«·WWç/nól×ÝŽÐpëξa­'ÖfM±Àr-²íÉÃŒ¬CÅJÌ„„JÆ.áb³š!p9hÖöøóá†ãfí1]{Õ«Þ3q¨Ž¸Á«Oô˜ë… n®„v k¼ÞnµÆ Ц3„ò®Ò ¼È3LìÀ†2Á°û,|Ó›ö"°™áe,TO“#:[ãû߇ûüI;ˆÅ«Ê¶¹'.öÎ…xa-Û~Hèv¼¶í +;³È]Q!ҾߊDµ¤„gpØ5§*pcKzÀB’(jÙ]ØDÍM7&¹Æ³EðÖféùYbÁ7SËÁæŠ(RÛ6ö„WÞ?÷aIJ1´.¿åTÆ’§dàa¦³{ßØûH4ÝÓZ° kÂiw‹e½jÇY¡ œW²w^“ýlw˜9q€\kÊùiduCwÚÖÕ’J8éÔ¤¥¾•Øº¡ÅdOê©eúDŸ­¹oëî % ¾Ìó? 1äßmªî@D]Q{¨ÄŸ`ëP .Ãæ@ñ1&&TèÃ"ÎÝ6ÄiП°AY¨ƒ«bS”¦qé$¬¢_(@½tâôé@îqõdá@É£ûž·çü™«FGïeêXÄô|½ú{ +€âýãüß>WH!YHõX.——mÞ*ÿ^¤?yu'vèNä„ÃŽÊXG#ýp%}%ö©±4H„¦n¸Pƒ*f¿Iˆ¢‰¶×kŠÜõcp$&[÷{[›Š£‰hR9ÿkRpr\´]œ¶©ôÊZJ(ªùÁtö÷S³²ç‰8ýJS¦\ÙH¶Þ¸qLNŒûÀ ¡7q€o4ÈöÉÙ5×ËîDwÎç‚ì/ßÀüÕÖd¹ç§3 VùmY8s±;-#3 T?«‘»ìv÷c{}µÎnUÕ}¨z¿¾ÃG!yæ ´¤}Ø8[,<Ê×nK_.î¶þ8_TFî–á=Ù2–$É>[”-+òÛ?YŠ`2ŒR"õÙê“°°-–$9(²Ò´í§aÅrð® 3ÏÊé+÷¡.Òg‡ñÙõAÜüÏî§É/¨¾¡6ÙŸ 6è ;ZHÌæèÞ,þ]Þ~®›Ï¶ÝápÏ|RÀÈÿÔ?tºý/Œ‰l:êuå‡ÿÙcÿŸ0± …R|:-ç¶+¤€1e9—Ñçþ¿BŽYÿu´Éendstream endobj -1395 0 obj << +1413 0 obj << /Type /Page -/Contents 1396 0 R -/Resources 1394 0 R +/Contents 1414 0 R +/Resources 1412 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R -/Annots [ 1398 0 R 1401 0 R ] ->> endobj -1398 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [399.2874 719.9611 467.9594 732.0207] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/Parent 1398 0 R +/Annots [ 1418 0 R ] >> endobj -1401 0 obj << +1418 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [461.1985 450.514 510.2452 462.5737] +/Rect [432.8521 368.6685 481.8988 380.7281] /Subtype /Link /A << /S /GoTo /D (DNSSEC) >> >> endobj -1397 0 obj << -/D [1395 0 R /XYZ 85.0394 794.5015 null] ->> endobj -438 0 obj << -/D [1395 0 R /XYZ 85.0394 615.421 null] ->> endobj -1399 0 obj << -/D [1395 0 R /XYZ 85.0394 585.8633 null] +1415 0 obj << +/D [1413 0 R /XYZ 56.6929 794.5015 null] >> endobj 442 0 obj << -/D [1395 0 R /XYZ 85.0394 502.9736 null] +/D [1413 0 R /XYZ 56.6929 543.7303 null] >> endobj -1400 0 obj << -/D [1395 0 R /XYZ 85.0394 470.6064 null] +1416 0 obj << +/D [1413 0 R /XYZ 56.6929 512.1243 null] >> endobj 446 0 obj << -/D [1395 0 R /XYZ 85.0394 298.1533 null] +/D [1413 0 R /XYZ 56.6929 424.5706 null] >> endobj -1371 0 obj << -/D [1395 0 R /XYZ 85.0394 271.5604 null] +1417 0 obj << +/D [1413 0 R /XYZ 56.6929 390.1552 null] >> endobj 450 0 obj << -/D [1395 0 R /XYZ 85.0394 137.8852 null] +/D [1413 0 R /XYZ 56.6929 210.2494 null] >> endobj -1402 0 obj << -/D [1395 0 R /XYZ 85.0394 105.518 null] +1388 0 obj << +/D [1413 0 R /XYZ 56.6929 181.6082 null] >> endobj -1394 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> +1412 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1405 0 obj << -/Length 2683 +1421 0 obj << +/Length 2930 /Filter /FlateDecode >> stream -xÚ­ZYsÛÈ~ׯ`ù%P• Ï…+~’½²W[±ÖÑ*IUv÷‡Ê$À%@ÉJjÿ{º§{pP EÇ*— =zúøúˆr&àŸœEqg*›%™ #!£Y±>³O°öþDòž¹ß4îzs}òêNfY˜Å*ž]/¼ÒP¤©œ]/~ âP…§ÀAo¾|wñþWg§‰ ®/~¾<«Hï.þvNÔû«³ήNç2dðödz×çW´37—?ÐLFL¯Îß__¾=?ýýú§“óëN—¡¾RhTä“_³¨ýÓ‰u–F³{ˆPf™š­OL¤ÃÈhígV'¿œü½c8Xu¯NÚOŠPéXMPé)FYkXBžçÅ-j{å`¯2p^„G঻ÒÞó¦!C…ÊÈ”75mÞÚµ­ÚÓ¹–*XØß„P•mp(ƒœf'GÕKZho-Müpù ÍTùÚ6›¼àùö6g–÷åjE[nx­±¶"êæatN³»il;>©X• ]¾6Yœ¡B3 Á1€OÊ0‹"åT¡àë4 Öy[Ü¢8Èñ‘‚§2@EpP.i­lySSﶧ2 P_|ä— 7o›†Þ±F;8›‘¢$”J¶1²À×÷`§Áµ°SΓ„qÄÀSa–¦é4ìæÇù¥ÃÔH> XR&îF)^dL³0Ñ2~F=ǧdÌT˜(aÆB®Ê¦ÂtÂŽˆí]/{ç8ñû—f"`ÀI,|,8 ÌaJ…Q”¥Sk&$Ð::ö«|×8´§A^-ˆpPCba›¶¬ò¶¬+š@¬¹­C¬áD‡5ÀšFÝɱ…BÅÉ,јUfÏ€5æ8²œÂ$~ÅýÉ_[Š‰P=£žãSBf24ÙXÄCPKB‘dr5ïG„Z,Â8ÕñP#¤@2…7@®ÌR3ÂÖÃ( .P&­ƒªn‰h6¶(1¯ÛÅK˜‰LpS·SõCj B¦r$äaÌÇP.ã,ñÈœO”$pL9>¡Z†¯€Ûa™ïV¬I[ÓÓñ)«Od@ˆ»Ð(­Æ±šcÙQ`ATY¬#ZÇÁEÕ­•‡8Böø„˜+>#{7r•`ŸÏ”ªP~“ú‡#­§C£…úªõdEßb½_Q]"ʽ¢«†•kóÏv⨹ÎÙ^#+~¶S§€ªqd<üîoKˆfðƒ 6ÎDõ]¹À€ˆu€àÂÚ·yU6k.ë-­SäÀŒ/ßH;?ÃbcW¶ðs~£ëF2€+cè Ïh+÷(ÈÈI:#uà"·L9rîµ$Yk‹Ý¶)ïì¼®VSè…œúŠᦒØÛG%ÌW ‘Ô"©DŽ•›#€ñé?vàv~qI6^3G Ž•Ç›[¢Ö«Û48ÖÅ ‹:ò÷À¸ZDÁµ+¡: -jwæÂny¸¤gW“F„^?…Õ'úPš$ÙoCâ[ò³)?UÎaàÔ–¦~S*Aʸ¾&º¾è±h‚MÔniêÕ‚ÀVõÊ8ÆE]µöKÛ©ê¬ ]¨…Ø‹zn(䶫£âfÖ]æ?lX%Þd `[ò“;db’ÆR:¤ŠX‘(ÿ®]ß=S×Æ£‚BƒÚ[§¤@£M¤¡ÀZ>)¢Œcóøâ€lÙÎpƒYPÔ¹#‹rfy³²´Ã¥YaXÆ«,t‡UaÀK™Ú6“Ð×±žFPÔ!Ýb®‚œD¦Ü”žïUæâ€'\pˆï-ùéÁ«¤._\Ž·ÁÂnmÌ÷²nùt_äb¾¸Ãª¹ý®z½s JÍH>œd!ïpŽEHr*oÊÞ?”ØŽ¸¸ô¹›t@.9E½Þ”+»˜{öðåÚÉìíÌá§?ÛYúóÞü°¦¸kð±8"3“Mõ‹À—Dõ &ÀjèÚO4B’‹œ"«©¡Vþ 'qÈy®ÿЇ/Qe’}·‰§úÅ][Ã>2Óon{i¹ S€èî2#±e&½pêâ2$â¬z˜lÕLÀËå  cÁÝ2KÓ c!çQÖÁã늜õQoheeïìŠæ°$6ÉÎÄ»-ÊÂU²4ÑçywS. ßR'aíÝÛ]w˜ -*±ðÜäÛ–(ú®‡(v†O‡ÈLú -õ’¾ÓR±Le ™(È@ÙQµCdÙÄ÷räÍm/P¾äâuð@ÌS‡µT -dQ1ûÚ¦¢l'ï¦.øY–|O à@Df—Øßm—¢&ì5®ú üJ8˜“¦¦` >&¿J‰ÐD™ü– T¢¯Pp ^Þ†…âG;´@éÍÂi[ct9êkÛ‡ FûM.óE.(‹å6z×ð½cÿ^÷fè­þ?=ÿ:ñm´Ö¡HÍžÚ”ìb@Þ ßì¿ ñ±t·Ë(#ìÕ+Úrí‚©æ¶Þ­Dó Iü;Š#&a”)3ìŒb:ÅŽ…¤„"ŒòÕ„ì9>!¤Q21òDȪl»9PÇa’Hüf=œŽ#Àkg¢} ï Î>)FQ–Îa¬‘@kH ±— ¨r'ˆà”²kH¬l ñ$§„6·t 6èÁ†/€ M£~çGÁ¦ChµˆãÓJüÀÆ—c–s`‹C6þÖâ05Iòõdì9>!£\›âéM„| k à·Ï˧RÓDZ HÕàœOcê·JæЕYj&€Ã-Ê‚ ”Ië n:"Ú-JŒìvõF"Ü4Ý\‘Zb=!'B>úJ¹8K<ôè39 Ž*È Ç'TËð™ñ'+»Î!1’&˜6ñéø`2u„£ B,Ž5¯\©“ÝÊb&Ñ:.ê~®¯Ü2ÎÊYNW|â\Q.8æ3§*äß$…Úö™ÖÓ¡ÑB}ÑzLc¢èÏX/ÅOT‰r¯hÕ²r]þi®Þ„2 6±â'{ß>RxFÆÃïnS‚?Ã9˜`çLÔÜ–+tˆX(Nlm±Éë²ÝÒ«+±pž<F|GÚ3L¶¶²…ó ]=’©Ž2†Þ䌖r•‚Œü–¤3R7,ÌÈxÉÜA.½v‡$ëïmqØ·å­]65”Ž3è…¶¡¯È_`Q{û¨D‚ 6&’«êDŽ•#€ñã!¨šÛŽ?\“·ÌÑû‚cåñ榨øê¶u~âNÎ{d\-"×›,•Ž‚Æí¹rE=¾®éÙÍö.Ї¦0ûdù¨m‰oÉ϶üX»ƒCíhèW¥¤Œ«ì` ¯ü€‹Ø@ÝØñ’¶©nn³zPÆ1.šº³Ÿ»^Ug-(éB-Ä‘Ð7P¯£û>cLR ˜Y÷‘ÿ œJ¼É|Ã%‚’Ÿ\ +P;°„d’ÆRN»‚7®rWÂô…<*(´kJœ’6f„‚³ÐO7›2ŽÍL³ lÙΰƒY×¹-‹bfyãZAQǬ +ãUºÇª0ÀK™ê6“2Xå]NL8˜qû!0ðEI9Ï®nÏÌÜ™¦Ô~αÇ}Á †Vö÷u^!}t¡CàGÓÃ1"^ý%w±Ü.ãE ]j—gûÚyín4_Ehï^0°£„ç^ØH–õ°pØ&ed¼ïy&3õ;TŠZ©¹‹퓨&hê®Q½áº9Q"mš¨§Ã@Ô`½îxŒ?§míkŸÊu ÜÝÎ9a–ywênãŒÔ)oÀÞÊ”.|àJЩÔ{%Œƒ‰’à_=³º,û[ð`^,‘%3w‡÷bt‘p¼®žÃé#ç Ÿé}ü Ç uý\àÊ ‹eüIf®& '=¸E½ +Î/(7’»â’œ—Hlò[;aA/NU^;©Gœ4üí¼ºËHC¿3Ü|Èçg”^ëW|É„3×ÃA™½ÚÕŒŽÚq…bW¶.x¬á{?äÚx®>Ìk¢vsF=Ë1…|P&pÔ©ÄJÃø0Bªÿ< ©C¸ÅXyÇ)°XÈ[Tæä€N8DO×–üôàUÒŒ§/.§Ë`â°µ+æ{Ùt¼»Or1w'n³zé?¿„Þ\ƒR@1’Ï;Yˆ;c’ÊÛr8 +|Ž¸¸ô±›t@.9E³Ý••]-ýðåÍæo%ù"¼ü³Ã­²™æÀ´3­±†3ψŒÆdsõ"ð%Q}@°íGzC’“œ"«©±Vª¿Þï«r®úð#ÊLr¨6qW?yèX]pª÷„Ì4ÅÎí(,d +Ü]f$¶Ì¤?º¸ ‰8«ïgK5BðÆr1hÆXÐ[fà-&Q·ojšpÖsD³£™ÊÞÚŠÆ0%ÉÞć=ßeá,Yšèþäyu[®+_R'aõí®:L¥XxâU=Qt±‡(v†OÇÈL† õ‚nj)Y¦E ™(ˆ@Ù³r‡È²¹ßX€7—½@ù”›Š^¾€ôbž¸è}œK… ÇA53°Ÿ¡l*Ên¶7ÐàgYòWr;úÈ3ûÀÞújC¸5c7ȹÐzè'hð–,~dcnš +èu}Â@|ÌÞJ‰ÐDÏù)lNUŸ) á׼ŷvlÒ›…×Æ,èzR×v÷;ôö'Š\æëD²\FZî;Žû蛡¶úÿôüûÌå0h­C‘š#µ)ØÅ€¼o|±ÿ ½ÿ×KGÐ]FÑa/_Ò’kç|Hµ›æP­ˆæž Iü%Åž7½Õ¶»köŸF©cäóÓ»2Å=¤ÝßËô üñÊ3PøC¡Ðé~Üóվ쇋'¯Ýß–¿ >r"¦ÍYi™/†<\woÛçË”óF ‚¢ãÁá@fN¼ O1ï{pÀ;ܱP~7HûÕ~uûѶòŸª U[70Tã:¨Œ$y-àÖ#£…­^Í1_—Õó¥—+\Ý|óŠ=wÊŸ>ýc~RŽ'ûã0Ǩ÷=ìóQÿaÀ·«Ü€Å]¶÷ž`Ù-ðÎÉqîöö¶lípîÒ G<Ë®ìÚýõ\?ð&™¨öô×ÍŸ?²Û—Eç­ô5áÏÕrª}é7TýÛøNê/»€ÊÂ4M²¯ãþ$z˜û7+þïËÌ?½ˆþÿZþò¿Ø ÿd’P§©þ{fR èÑT$,ê•ÈcÉûÿÅy(úÿÛ"›ˆendstream endobj -1404 0 obj << +1420 0 obj << /Type /Page -/Contents 1405 0 R -/Resources 1403 0 R +/Contents 1421 0 R +/Resources 1419 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R +/Parent 1398 0 R >> endobj -1406 0 obj << -/D [1404 0 R /XYZ 56.6929 794.5015 null] +1422 0 obj << +/D [1420 0 R /XYZ 85.0394 794.5015 null] >> endobj -1403 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> +454 0 obj << +/D [1420 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1423 0 obj << +/D [1420 0 R /XYZ 85.0394 749.1193 null] +>> endobj +1419 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1409 0 obj << -/Length 1124 +1426 0 obj << +/Length 1106 /Filter /FlateDecode >> stream -xÚÍXÛnã6}÷Wè1)@®¨»§lê¤Yt³­×}rƒ‘(‡nKÒqœzÿ½”(Ù’/Éq…aHâåðÌpf8C¤éò‡4φºé[šë[ÐÖ‘­É@×f²ïf€ª1 š£>Ž®MWó¡ïŽ6ŽXÔ=iãprvõÛåãáè¶~æÀs`;úÙÇÛ»_U‹¯W_î®ooþ]ž»ÖÙøöËj ¯‡£áÝÕð ÏFr¾Q!˜p}ûûP½ÝŒ.?¾ß? †ãµ,My‘n‚|Lîu-”bèÐô=[[È"ß7´d`Ù&´-Ó¬[âÁ×ÁŸkÀFo9uŸþlÓƒ¶g¸{h !èÛ¶ÑÒ íCÇ4ÌRƒ…І-5 ëúÙk–%àWIH**yNÌ -y?\[¨±-ºLº®«6D!8Ö4ÅIõ9 bÌù½úø·Ò ú…–Àš£˼š‘`.»(‡êõ µÊDÀqœ-À·9aËWµ‡!#œO,‚ÇiL¹Píß/Ôó¾iÀYzbXÁpÊ#ÂÞ»Gó<”»u2® -äYLƒ¶bUÏTõLÙ<®7BxßG<i&hÔ†§ù´à]aæëöâ£Z¡Z`rÄI³f×YÅÁ# ž@aÈ\5ü­Ûú³ta¯è,Í‘m¨µÒÄWˆÉËIá4ÌBÕ¶$|š±išu¦‚ÌË-€Î4BŠãyÞ|Ÿf¹ µu@ˆhmO\0šÎ~4±%ŠÅteLšüF³‚¼ˆË^ý'›³Ç]¹m./ š8}­’oSž“ ƒ4R„Åz# ²4^®"ʸè%E…Co9Ùÿè7­åéKÄÀæÇmi9;bYBɈIÒ ö¿7l{—„HrÐǶ¶öSz†üƒ-y:9Ú¶Œ$Îf ÓHçÉC}"t´¯ú4”&ŸÍÅû‘Mz!µ$k†ò-½¬Ôƒ¼äòÈ ¢Õ¨ÜæÝ™´Z -„$ÆÕ$N‚, y_‘žáþÑ2Ÿ?<‘定½÷4·Š—$ ›@s«á®«9.4]C&κ–i—0¿”]6ô]×Ñí›Èñ–¯+v¹&”sßäž&Mg—¦L;M¹zEÓ:@Ó:’¦ Q&¿{öªHA—™¬LhÀ=Ù8gÓPžŽå9Éžëá§ËHòŸJ‹ùOXG´žîÖD)žXÌYw¨ƒ„6™wO™â£}"C+#‘à± BG‡²÷ƒ”L„Ìûû@ ]}!Z,dp‘G#Èêª&Çⱬ¤:L%¬H­‹Ø„ˆß6y°U…)y¾¯Ë.Õm½·¸C[Åñ3¹x³`ÚS$œ¨¸;q öŒÆ¡‚TâÚ]O  -YÕOü©ÊVzO×þÜàç¬.÷]™6,îvö\êèë{›w_!mî×,™/xž±¹2÷8¦î@ÏðÝšT¡Pm3_ß5íRÿŽ@íendstream +xÚÍXÛnã6}÷WèÑ)@®H‰º OÙÔI³èf[¯û”#Ñ»º-IÇqêþ{)QräKÉNÂ0$ ÉÃ3Ù!‡È²õYă^ˆCË]HlD¬(ØÖ\·] PÝ4@»×ÇÉàÃ¥ã[! =ìY“Y +€v kß=ˆá™F°‡_n.¯¯~ŸŸùîprýåæ `b/¯™·«ñùçÏçã3€‚†?Ÿÿ:M“Wc|¼¾ùÉHBóxt<ºG7£³»É§Áh²Ñ¥­/²R‘ïƒÛ;ÛŠµÚŸ6t€XKýaC†ØJ.q q§‘$ƒ¯ƒß6€­ÖjèAû!bÇà 袖C \Ë'!ôìTüûÇR 8!@†„àVã‡KŒ¬x¦'®¯çñÍ`¢ÍjÛöð9Ϙ±ÑWEKY¦jë š¦T¼-Zˆbà ‚WcM3šÖŸ·QB¥¼3U¬±ÃÒÌ5iãjUÔ#R*FA{[³[Óƒ&I¾ßL¬\#cÁ¤œ¦TEÓ„KeäÚ Õó®&ȳS`Ñ>¬4“3&Þ™í¢ˆõj½¨EžðhÛ°¦ejZ¦b‘4‹ !¼ëc ™ƒ,W|¶ Ï‹iÉ»Æ,r¡6òò£ž¡žàöˆ1šfî³5¢}¥#K#øÃ&ö’Šl=£Ü’'qDEld+&§¹˜fyg:¾µ³ž:2ôìèÓ?@JϨ@’|Þrl‘Þ7;BG”f<Ö.Ÿ/TW$ô*’âi/¤-NíT¾c—µy°§Bo\m MØ‚Ò½{Nb–ÐzdQžÅ²³Ú5‚ÊÌi*÷ßØjßL¯½÷ôûšÔ$b/)€n+\×ò|èøØÕ8Ðw·‚ù¡j"0ô}ÏjÉ_2Ç[±nØä;Ð!ÿfAÃÍ€@GÏ^Ó$¯Ð$GÒ Äö³<‚©O²úøÃ#ylàJ>4á±Þ«}R<6›CÏ+‘ô?Ó¡Ï?q“Ñz†[¥|Rµïõròî©•>Ò£}ªS«`3­ÀC•„ŽNŠÇ€ }&JŸûOäq„N.zË,RySÕT=T•T%ž™(ÖenJ%o»<Ø©ÂÚ¥cUÜÕÍ'wx§¸“ }do×vŠ„Ó«°ÿkÁˆß³`> endobj -1410 0 obj << -/D [1408 0 R /XYZ 85.0394 794.5015 null] +1427 0 obj << +/D [1425 0 R /XYZ 56.6929 794.5015 null] >> endobj -454 0 obj << -/D [1408 0 R /XYZ 85.0394 769.5949 null] +458 0 obj << +/D [1425 0 R /XYZ 56.6929 720.2271 null] >> endobj -1292 0 obj << -/D [1408 0 R /XYZ 85.0394 748.6299 null] +1309 0 obj << +/D [1425 0 R /XYZ 56.6929 692.8842 null] >> endobj -1407 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F23 726 0 R >> +1424 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1413 0 obj << -/Length 1090 +1430 0 obj << +/Length 1141 /Filter /FlateDecode >> stream -xÚÝX[sâ6~çWø:#Å’ï³OÙ”¤Ùé²-¥O”a[NÔõm%± Yúß+_³1`C2³í0ŒeÉçÓwnÒ‘¦«Ò,Úö4Ç3¡¥#Kó㞮ݫ±›ª¾ë@ý«÷“Þŵáhôllk“°†åBÝu‘6 ¦}b8PzÿêÓèúöæÏñåÀ1û“ÛO£À–Þ¿¾ýuX¶nÆ—?^Ž¹ê_ýrùÛd8.‡ì -ãýíèç²Ç+{@ÇÃëáx8ºf“½ád£K]_¤¹"_zÓ™®Jí=žkiêE‡Èó°÷LË€–i램÷Gï÷ `m´m´Ò!6lÜ`@Õ èêÐÖ”cyÐ6°Qp:¶®÷ýê ‰©(;þÒ-ý‘ðd­Ø}’rªúP9ú®|Ìrý €ô, ×F¢EVoÏÓL²4i²ˆ–-!9Kî ¢º`L„¤<aÊc"·*Iú$Wœ§ B©öcæ‹S«€HÒ¥:ÚÝ^T=ÂiÈ©x(v—“÷¨S@ÐK&’/ÏåqÄ"’ ”{Þ©y¦<I±s)£ã0ÐCŲ[c¤ê§jŽõpÞ›Í6|æù¹«ŠH?"Blj¿bÍi‚•Ë¬’xPõè»&[ì+qÄ è=ÉÏhµB¡•åðùgÉ‹‹ò9J«Œ¼³ˆÆ4‘4€?€…\Ü2‰¢ô|YP¾Ü©Üó¥Š -1WÇPÿ¡Vµ·)¬k˜`}p~ØW9ì£×=ì¿Rìý0wÿÝSûÿøÚíxÙt±gX0¿k¸†SÿjÒ³/ý¶7¢¦ª¿\oîó°Q»ÏÃŽ MWT¤reü‚ùúvð%õõ~Lendstream +xÚÍX[s£6~÷¯à1îŒ$!@³OÙÔÙf§›m]÷ÉÍxˆ„†Û"ygÝÿ^q1/¾@6ӎǃЧs¾óݦ«Òl +u Íb¤:¢ští^µ}¡ê°ù4¿z?_Kc™ØÔf~ˆºm#mæÍÏ.¹øm6™Ž¦ú™ Ç€šúÙû뛟ËV>.?ß\]øsz1¶Œ³Ùõ盲z:¹šL'7—“1@6Eª?®öt¸ºþuR–>L/>}º˜ŽogG“YíKÓ_¤“Ü‘/£ù­®yÊí#fSíI½è1†µhdP©AȦ&ý1ú½l´]»ø£Ä†ÔÆVjˆt2ƒYšE4 &ƒó10uýÌ Ãä ,SÏ‘øIöäd^ߗߪoI]ÀÈ(}´µÏ –êvü©­è©Rq„ñoÛ¸·º5æÃuŸÎy5©Âm Þ–Ñ\¸Çä‘k¼ #Lî"—ÑÏzeŠÌœX¨ð‚ÀSÉħáÃ@ÉR¾IQ“Ða ¡&5”ÍU:àÏi¸A[¥j@>uô +xo’*#¯£4ä%÷à!žQ'ÏÆkyF;< ¹¼;D^y£ñeɳÕ»Åh`‚ÍÁy,úööþã;ƒ®û8Ba~‰Öq{¦þÕد¾«Û^dj•¶m\_ÃaÒ¸†#º m̬Q¹ÏÙµ¼¾ÔûÞôh÷Lendstream endobj -1412 0 obj << +1429 0 obj << /Type /Page -/Contents 1413 0 R -/Resources 1411 0 R +/Contents 1430 0 R +/Resources 1428 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R +/Parent 1432 0 R >> endobj -1414 0 obj << -/D [1412 0 R /XYZ 56.6929 794.5015 null] +1431 0 obj << +/D [1429 0 R /XYZ 85.0394 794.5015 null] >> endobj -1411 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +1428 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1417 0 obj << -/Length 2117 +1435 0 obj << +/Length 2154 /Filter /FlateDecode >> stream -xÚµYÝsÛ6÷_¡Gú&DðÉñ““Ú9w.nÏQ_êf<”Y¼£HAYQ¯ýß»ÀmÓ‰OÇX.‹Åîo ™M(ü±I¦¹œ¤¹$Š25™¯èäæ>1/¡x(õnzôö\¤“œä O&Óå@WFh–±Étq½ÿçéÏÓ³«ã˜+%ä8V Þ]\þ€œ‡÷?]ž_|øåêô8•Ñôâ§Kd_Ÿ]]¾?;ŽY¦¬ç^à Î/þu†Ô‡«ÓO¯Ž?O<:›ögž—Qaò¿£ëÏt²€cÿxD‰È35ÙÁ%,Ïùd}$• J -8Õѧ£÷ -³né˜ÿ”ȈÊx:â@Éd4#¹ÌÓIªr’.œ¯ã„Òh]|‰»¶¨ÍR·qW®u\Ö8So×3Ý"}‚Ãg{nØ[}o£i¶í\#ó7ªh¹‘7ÅbáµþáT°4'‚§ -4‘T -éýÃM)’§i2ðA ÃÅ×›¦í,77öãóˆ}3DÀ¢`'ûŠñ]245yljžždÐTõ„©êûLåT.Ò|Ô¥EÕÅ/rë@ÛßbkN8S깶~Óµœ3ÂRšü=(à<%Lf|[£ã'Ý»×æ¦ioêæ°ÿ½©ulº¢+MWÎÍÏΞEѳÂèç¦Þ½Ã¬Ë:nõ²Õfå*Äw•[g^¯ÄYÒµû©`íx©ŠûVl«®Œ×…颯$æ‚äÌ%ø@ÕŸ'aƒ0m¹6Ú‡¸ßÔE°ðz^ÆxþÑ=¦¶ÛoüŠeÓîŠvqòWx‘C5uµÿcY¶¦;dÃ3üáõèÖûÐæ>‡‰ù­Ü"„„ýÜðçs°­+} ÒÔ±=ÀË#ÂF#"_ö "ì<ù&:Þžs6éÙKk\à”£bÛ´p¨€Œzã°AùµB¯uÝáçú7Jy]Úm‘SÔ $~1Å­î÷9´ Ö&ûæwúµßizœƒŸ7Úzï9ï#€âo«rPUÔÈ.*ÓŒÝm†±×Ú Ç i7u#ìÚZ2ë#åøv/F@„¢w{ä-ô²€nå F?t£~AÜ.`zÌ%æùÌMY„×7Oy¤rܵ#º Ørå€ |<2¬œyÁùª¨oõ?°:Q¸Bb‡Àw¶ œÃÝrïzY!¥Å¾Êi¡±³Ü™^ö8³sÎ`;1²,çaàX:}C‚E‚ u²5ÊcNÛh·.î ¹’´ßÎ@Ë.p=‚¤‡ý½=-  –§PX9éá—§ƒå‡+æ¡-Îï‚%5G9p1@‡KEËÙ•Ý -©‡¦[ÞôÓŤà…oÍR4.–^-ê²^ymöœvtñq©¿x3šxp. ç°Ä½º&”ð7“šy‘\2]¿° -ܦ@õ†ØÅ°Æc 7Áªj©ÒŒº ‘i#Î^’‚ro[Õ@¦xÎ!9ì—·¨Þ P`,pèýÚ+„×]ÛÙúœ$Г…UË°jľ žS†÷B¯kÞ¬¡Ê,œíœA2–õ<v86Kç<»â£Ù=T-m-ÚnP{àêª\—£´†Zéoy{ýÈ<ªAqFæ΂IW9A`jwå¢[Y3]6A"ÔðÐ1€p…•êÖK`V›qÏ(j¿¡"‰4êÚ Ë%/pVÛÚgÙ"Ì,½ìªÙ°Íà è0Åj Jm\ûbg,´%Ö¾j:œÖLãu |sûC2 -üîvM\d+äBùwÕÍN™ùJ¯½´o¦xßø  -w_LÉs‘þ2¶b½©ô›Cw åºo=€6n—…*Ÿù}]ƒp¿ùQŒdðtð-‚þâö Ë‘n"ɈR]Gy»êp—MUÌu¸?tø¹…©øƒ‡’Ïd¨Ëp¹wx¿Ú¯²v…¨‡>#­(Ü1Á#ÖKNhÊUoýÛ¯ K T™Ä‹ïVÚß/5 Š¥<(ÑÆgbp‡u‡WzÿÜÿÙ: AuˆaOØöÜ]ƒDu ‰Ûù†¾]þ —ye¡Cì# siô± Ê€;Ü=‡ðiöÍk3†¨™^!~¤ˆ<¶[’TÍ®Ú#·\â¸o¶Hl¶JÁ!‘C13~¡‹¨¥ -¯ ªü^‹Ò—¿®M>âòwü™1ìß_÷&<ó¿0f”€Qc?ÓÓIðЫÿ)pø 4ÙÐÿñþr¿K§ ÉxžÂû›X]62©xäŒðß/50ý/—$Šendstream +xÚÕËrÛFò®¯àÚ2Ƙ^å“ìHŽRk%+3—UT*ŠH@€ €¢¹ñþûvOÏ€ Z²T9¤t@OOOwO¿‡â£þø(ŒX”Št§Š…GÓåI0º‡½'ÜÒøŽÈïS½Ÿ¼½ñ(ei$¢ÑxÞã•° Iøh<»ñ"&Ø)p¼?_]\~üõúì4VÞøòç«S_„wqùÏs‚>^Ÿ}útv}êó$äÞ‡Ï~Ÿ_ÓVdy¼¿¼ú0)}Ž0½>¿8¿>¿úp~z;þéä|ÜÝ¥_H¼ÈNnnƒÑ ®ýÓIÀdš„£ ,ÆÓTŒ–'*”,TR:Lqòùä_ÃÞ®9:h?0!#1`@Å{LÀ*SI!oNý(¼yUo²zF‹ß‚0¨Êbûuž×M +Nøwô¹Å[ƒhŸs–†¡à£ë†ÖÒÇîæ«»l6«-nUÕm‡ÇÅížƘ“g>ÿ{†øeÖ´ì£þÜ]sïØ]‘7öÀ×ïQøæ½%€ÛŽù¾Õnà>ß¾ ß¿É¿­³²™ëÚÏg…öó’vÊõr¢ëg{dQ›/_Ìhµžt÷ì=7m—÷ßb¿wáNǦZ×S½sQ¾R='|5,xœ2)â8±XÉÐ0ú‡Ù +YÇѨ‡ß¹â©#ý°@0 ‡Íp §ÿõU«šÆL@Þý5ªŠ@BîÇé ªYÑúßeÖ7ÔIÑU½T×” †ƒîÐõIÓ +Áƒè/2­ˆW‰4íºÑþQónusWÕweõŒ¬úoUj¿i³JO>m<;{fY›M²F?7õöKD^úµž×ºY˜ +ñâ:ó&ü±&m½}­¯c±.Úܧ¦ð´C|!YÊM‚÷.5Þ + mÊôöÎïweæ4¼™YÓtýÉD÷Ûv»Ò{öÝÓÍøoØÔ÷c[ú¤*}¼À÷{D zD¾Ö#âÀ#z¾{R—·‚:ôUƒÑ,»ÑV@äUŽfÏÏP+ôR—--п(sK˜¬œðk“ÝëNÎnD (–*.{r·’þÝIŸ¦`ç•n§Ü„³(ŠùHèÇÏs¡µ„i¸?å¾èÓ¢çÈ£òé\¬,èNì³òÝ|‘H¨X OÐœ£Ý`rð “”œi ZöÈcÅbž& ÉÆ ´+˜´Ñõ„ä”HR/£µ+:O«Õ– jND­cåž ÈMº=*ÈÓD 6yQ4ÑCyžM +ëó¶¢ïª>å‰W=ä3»‘­ÛEUçبªl6¦&à‚ô oÙa¼¨D±$’ѨoÝ×9 #ƒ§Ì0Qô]1`O‹(fI¨Ž†@ÌRÉùH€w£8IŒ›"{ÐCˆä6ÎÐ+±¥5 sUâå a2úëëU‘O3Ú§èö»0±L ¨*!Lˆ=Îwœ»b´zÐ ×f@[³X8mé-d^éiîÛj¦b¦¢Díj,AÚBìÙò*ׄXVtZ]þB»¦e ºiº“s{À]È(W,A»ÈZY!Θ€›BÝ +î6›¶Ž‰îÈ[¯ 챜6#—n"‘“Ò™XÊÀûä^˜H`mPú±&;VYIè¬hª! } ¦ÅvÓˆBͤÖ&»×,âQVJ€‡¼÷[ÂÍô<ƒYå yßÍ¢ö@æÌ.MÀÌôP‹Sž/Aݘ{Ô¼E,¼PÆ4ø’)°y‡¡"&pOW†“K8]d彞тª™)D@¶s,`'Û!#™¸›oÍ$+•ÂØ—*´J"Âuˆèyg¸gÆ ò¢Œ…ƒ!høõCl(# +ZC[m6¤ØJ›s~WÈCåÁðmL`6oÖF²a¿' +|y…"2ݵpeã´w|×bhì.yD¡f \¢Ã¤"b6y» èPuÄ?_~$Þ÷¨V¤Þåܲ%^˜á…å†÷įñIýÙ›Áă{¥»{uM†Òv&ÜšX’ 4™¶;X9F(@"xhºF_UU„òfH/™èqR“”°ºdŠÅì’WV€:6ߌ>];†ð¶«[¬ÏQ™;5w§\êØ‹€S_èxM«%T™™Ñ]pHƼœ:–¾ÕÜÏ€ô¬!tª£FëÑŒX]äË|°€–P+m—Çö£R¯Æ„0!7œšÊ `»Ég태ÞUå(\ wT©î-eõ çÌhpW‘d uÙÊ$/`ëÒfÙÌíÌ-í¢Z7 [CïŸÝ7QÓÕÊx°+vøÛ/–X|Ó´´qXÜVujÒ&°ÀŸ ‘ѺÝT~![Ê¿©n¸ÕLzi©í0%º±_Ú 0ý‚QJ^‘ôô—A·eËU¡ßì¦K(×ÝèÑ @“¸ÄUùÄÊ5Âþðr–ÀÃÁŽú‹‘Á ,¦‰Fä0nêÈï-IYÙT»þ¡Ý-S¡8x&ÙL†º ͽ¥þŠ«¼4… Œ>]F")ôÈàí•`A,ÂNû·ß¾@3¨2‘%ß,´í/9KŒ•Ú1à&`¼-- 4ƒgW¼H¿¯M Au"€7¬;ì¦" 8…Ämí@k“ýc6€ÂÐaøHL}ª³ +Âz‰CX6[Èæe3<µ,27üCðl jŠjSX8ŸÓw[­í;bm³ß–A@0yËVò¥+.ÈTqÏ‘Yn _[8%™Ì=öÀèî¯{ (‘àO‹à)˜\ ýç%èï¯þ?ÏîŸ`0`Ãì'º×Ç~Å S 0‘!C^è•X=ú/”û‡¥ê©þ&4Cendstream endobj -1416 0 obj << +1434 0 obj << /Type /Page -/Contents 1417 0 R -/Resources 1415 0 R +/Contents 1435 0 R +/Resources 1433 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R +/Parent 1432 0 R >> endobj -1418 0 obj << -/D [1416 0 R /XYZ 85.0394 794.5015 null] +1436 0 obj << +/D [1434 0 R /XYZ 56.6929 794.5015 null] >> endobj -458 0 obj << -/D [1416 0 R /XYZ 85.0394 421.6574 null] +462 0 obj << +/D [1434 0 R /XYZ 56.6929 373.8367 null] >> endobj -1419 0 obj << -/D [1416 0 R /XYZ 85.0394 391.5435 null] +1437 0 obj << +/D [1434 0 R /XYZ 56.6929 343.7228 null] >> endobj -462 0 obj << -/D [1416 0 R /XYZ 85.0394 391.5435 null] +466 0 obj << +/D [1434 0 R /XYZ 56.6929 343.7228 null] >> endobj -1420 0 obj << -/D [1416 0 R /XYZ 85.0394 367.1321 null] +1438 0 obj << +/D [1434 0 R /XYZ 56.6929 319.3114 null] >> endobj -1421 0 obj << -/D [1416 0 R /XYZ 85.0394 367.1321 null] +1439 0 obj << +/D [1434 0 R /XYZ 56.6929 319.3114 null] >> endobj -1422 0 obj << -/D [1416 0 R /XYZ 85.0394 355.1769 null] +1440 0 obj << +/D [1434 0 R /XYZ 56.6929 307.3563 null] >> endobj -1415 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> +1433 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1426 0 obj << -/Length 3415 +1443 0 obj << +/Length 3493 /Filter /FlateDecode >> stream -xÚ¥ÙrÛFò]_Á·@Uâx.\µOŠ#;J­å¬¬­Ýª$ ŠHH€!@ÉÌ×o_‚$'ërÉÓè¹zº{úš‰†f'*Ém>Is¯bmâÉl}¡'OÐ÷þÂȘi4ŽúöáâÍ;—Nr•'6™<,keJg™™<ÌŠeÕ%¬ £·ïÞݾÿ÷ýõe꣇Ûw—SëèÝí?ozýáÃõýåÔd±‰Þ~ýãÃÍ=w%²Æ··wß1&çæ•EïoÞÝÜßܽ½¹üåᇋ›‡þ,Ãóíð ¿_üô‹žÌáØ?\håò,ž¼À‡V&Ïíd}ác§bï\À¬.>]ü«_pÐKSÇøçm¦â$Èf¹Š÷¯ïË{hØW@›8¥ 0úxßifT’¤(íUž„âÍ@(Æj•ÃB“4ÎUâ¬#©´ÝîYóæ ƒ“L¥Þâö8èxéR PýÑÔ%ãªVúªuµ*¶ÜÝ5Œ,¤oU<—‡‰WæQùyVn:Ñ- ªŽn/M•›U5+ºRöhêÕiª¦Æ¨<Ž-‘×-augóèLž5ÔÎ[îlÜYðçºh»rË(>b«°ÅüxF¿~Yw¯}˜‡úè“è“ðñ”6‚äkaªÕ:ª›N°üÝvE=çsîØÛŽûĈøîîÓ?zÔžqƒÕûEeÑí†øvSΪŸµ¶³cZù†’ØàÎð>ñð’Uëͪ\Ãù‹®jj5vRâ°Å‡3;G³¢fÜcɈ][΃»!¦\êÔ eA/¨KG‹f˨§ÕN–aIûI‘U!†tÑ™¹JSêŽÑ"zè)ÃP~Þ”—&ª[ù&u€v]TÀ‡ª®ê'™Éx¾ˆ‹¦¸Ïv?Æk6r–ÔÑÆ0¹ìø›„ m]¬Ëе}FM¥Ñó9Ó߶¤V€‚Òý=¾ìI¢2›¥rq±¹š5õb䮃9HÁ&ÈPÐgç\ô°¬dý][< %€Â£L­ã©}rÌiRi÷4e -3'!’…@]¾0ä *>í¶¤T-ØçÌìgíC(ç¦Ým6ͶkGÅŒ{g Û‚HðK'‹#Ô²ŽˆÜK±¿4ÆàaS õV†ÊŽù7ãMd ¸n[Ôí¢Ü¶²Ób°~¯XÓ1a“¶Ù$› ¡™­vÄÄóõ»Ï,v.è«Yó±Æ€Ÿ-«•¨EÍR"#v5 ¦j„q,h—êh]t+RMóðü`2ˆ€jÔG„fèõj¼Î[™>kv«9ƒO%­vM¨—ª[†qõtŒÑºU6MøTÆtÔ–±,_„0ìdÞ"Xtšî àIó‘ñ‘ÀŽæ°àX!ÀiR”f»¤e³®>ãD°kàÄKÚÆ°?/º`‰{ѾZà'èRO¢{_¡ép´ò²U÷;·U–Z°Æ°µQ…zÀ>±çåÜô,³lf˜ù‡ GŒê%BË¢e€Å4B¢è§ö‡sŃ;OëΑNã¢bµâ~qq¾teËxæpäÐ!4BO±j›1©²g!O'oÉ› }_+öW÷ŠˆH>S¬û3ÅúìLæuÖ{GÙ;@”D~RgÁObŸ .¸á¥ùŽc+"Ÿ±;Ò!\Ñ! j›Õík?k„ºm]=UÏhAœ7èæΈKˆÛ¡'ôìK±Á¥ší(ìÃoòa8I£q»nÙl+ žË0†„9zÛÞ±ŸOÀóo CðqˆÀa -:%ŒaÿˆP¯øAç´l•aÊf[=KhSÊî¥ÙþÆ»v:.àúIÝ¿{kr“ñÇÀíÊ öÜI"ƒöT+†/éãƒ$éU aãtî¾Oˆ2ZUõ‰PÅvSŒøðÜ)ðÚF|8…VIÆsà -þ&9ñØB SnëbÅ£„¥40°4$gR²û›4Dz¦ÛÒ_\øà‹ëà“bS§™™Ï¼Ê—L†ùÌWæH^;Ä@³3¹&ÙßX´ŸòZâåR§|ÆIäHâElrñÄç6™,!~?^Ší|D–iªR £úÜËû<úÙZÏS$E@$êvðúqlñvz1øM×Úýdä`MÒlÄáêÊ£M9Ù°f3aM=m{jÁo]˹†|&9ŽEVúüìÖ©ô0’¢Ž²Þ€¢¯»ý¦[?Å×ÉÜ×ùë2•¤YÈmÉãêÀžN΂æã|}ˆ“íA.bv§§V¥yœžzéQ0zβL‚x÷M0Gû¹X¥ÖgÇçÁû4Â;¡úÛ®$öZV3´A­zZ„ŠÍ†"e4° £~ß•Ûª”ߘØdíñ-GkF<ÒiðÀÙA tïB|Üs·ŒK{Ïœ’¥!MI¢Û… š@l bäæ_áQYÚ‹Ÿx„“ÄÊ; g-9 £‹ƒíFl¼t؈ü†'5·åzÓí\U­ ZŒ -Ï$`Àžü­Êmò¯@ 1òª/@Ì%8’ñ`J\~|¤ÓËì|:8ù)®2/‘1¢ØÅzqû˜ô^q·c zXLƇ–vÖµÜsW„,w/©Ë2ö”’Ÿs晲Yâ…+͆Rıۜ¨¼çs¯ù'1ÄÅ»°Ù‚7Û7;^ -NÊØ>Zñ–¬úpóljüi•©WFögj}.Ézù‡ålYÔOG1% ,!Ь‚# “ûóiœoÁÜ Éǧ -5Æ\i«óžo½òʧùé™(.´ÞBökñÌ’>Ìï¬÷çn{Ñ‹lÛŽ=NîîDQi½±‰˜¼a‡,NŒôs5+y† ÅÕ˜&=î:®­°Ü"³e‰rL*7‰Äîõ õ6 e…§rhÒ±a ©R}lÃÆaÔ RYm±?'É2D?ý=äF_BžÔ€Sý;Q”Lx5ÜÑÐïs÷…:3\@±OJ,¯Ñ}±Îü@¬3Xt¨ºŠx\€ý¿eI4`¥PFC¼‰KHÛ—<)çÄŽCx\¨` ª$ÑG_!¨Mãþà -nr3}©á®ÀúÁ» ª¹¹¤.Ù çO’ˆ†[$œ*…&gjOçÐéGîKOf/´T—oêMI´nÚŽ!©8I©*‡“âáÆIÈ¿êSº©‹SöçØßp?VGþ°ûÅöXRÖJÊ=³UÑÊ Û»+ø8-œ`a±eÑâÌf½©Vå|JÎórQìV£Ivd$;2ƒã× 'Ò,*8qFï-RÇùÌå:‚`Nk†nïd•S7Ü>îªU7åî©…Tq:²ã«†cp'¿ê–ÌFæ ‚IìßX1ÌxÍpX“)¸W¨2èôr8Ì/3 -VåÕ‡§áùçÄ„89dUyoCØMÛ(´\JAˆ³Ê:MÈTe‚žÓí‰QÅNc§ ‹×‹mÑvÛKˆfý#ËŸ?¡ÅõD±¯Þ~üpÅ]w7ønyÅÕ¿÷ïÑ%)î»®ÃOݾp‘Ñ„,K…²z¸ÀÕ3lQÊ#ÆëÍ®Í8r+?ã+ÕÏ!k !>ø°¶Ho}f}ö¿g| ¡ Îú4ÅtìùŽ)/¨:orK~Úä.ºûïw?\ßÞ)F³dš7¥ ¡7šÃé ‚(eì#â -²8ªüL¼7¼Ú˜Xrï?Òð(.w©N‹‡«²„|G_«ç˜¿¨ÔpLì‚_¤b«#‚°ñ‚ˆûœQÄí8(‰Œ?èE3ñ°“Ž“Ø°éiûå°ex±¿ÎVÌÏáý‹ïò0'ÎããgùÿkR (P™ê ò³Ê%¨ðšöªoÓ ‚6ç&ø{ˆ}ÒÃÏ"Ž ò“ãS•¦&éaá?PP ·™œÉˆBhÜF´ð}¤drV¹oZ†Ù%#DµI8o—¿eÀ¢Y­š¾pš2ul nÈÝÒ5ÑäÎO»¬Â®|õГ³2úü:@f )¯ õ -p#fݩ̧!ßAÓ9^*5©Êµ ·TÐ,ÇBMå!4œhL=XZŸÛ“ò@Höà;|<Å$@÷ÞE÷ý³f+·¬;+tŠÕx.Zé[¿Š•&€ô v7så]œõb92€:Ü[–mÕ¼– æ.ÔDrøh^IK¯Â öOìá½¾B¹&ô<4“·ù¯·ßÈ’?rǯl–q)a?’p6ºíŽ 8ÿ1@»,®tg*ÏO“Ö#ÒPG‹GtqdÕŸ‹mÕ¯F…Ü·]¹n¹ßâååÒáO!vX£é2‚Þ2©r7>Çn†o¶T+—•9¢†9ølƒ-þ&bê‘0¿•û—ÁÏþÜ!|ÿiì@Æ)ÿ .Dú(µõ}ÝÔûõ‰Ê±.¨×~ëä¨6öË$øõï ?ƒç²ÌŒáQ4M! -Ϙú3ÊVÖ!>'ýÿÞüendstream +xÚ¥ÙrãÆñ]_Á·@U"vN•'y-­åÊj­RI•íˆEØ$@ ´Ìק¯Aò‘­-í4z®žîž¾†z¢àŸžd>V6w“4w±WÚOfë 5y†¾ZÆLàépÔ7ïnm:Éã<1Éäq1X+‹U–éÉãüÇèýw×?<Þ<\NWQ_N}¢¢oîî¿eLÎÍûO÷·wþõp}™ºèñîÓ=£nnonîßß\Nuæ5Ì7²ÂnïþqÃЇ‡ë¯.~üþâæ±?Ëð¼ZY<Èo?þ¬&s8ö÷*¶yæ'¯ð¡bçf²¾pÞÆÞY0«‹ÏÿìôÒÔ1þ9“Å>É2Y{íÜÛûò +öÐ$6V}¼ïTk…ød2õÊÅy–ê^*N¤¢]›$#ûA³]Ò²ˆYW_ð +"Ø5pâ%ícXȈŸ]°Ä½è_-ðt©'ѽ¯Pt8ZyYªû@­ÂÛ*K-XcØÇš¨B=`Ÿ‡Øs€rnz–63ÌüÄ#FõŽ¡eÑ2Àb!QôS¹Ã¹üàÎÓºs¤SÛ¨X­¸_\œëcdÙ2ž…9yD#tÐS¬ÚfLªìYÈÓ‰Ç[òfCß׊ýU½""’ÏäU&¯ÎÎô{ÞQe½w½#D)Aä'Uü$öÉà‚¾QŠï8¶"ò»# ¶Yíоö³F¨+ÐÖ¥Ñsõ‚Áyƒnጸ„¸zBǾŒPªÙŽÂ>ü&†4·ë–Ͷ ᥠcH˜£·í–ý|ž·Àx‚ó!"‡Q€(è”0†ý#B½~àÓ°U†)›mõ"¡L)»×fû+ìÚéx¸€ë'Iôpû^ç:ãÛ•칓Dí©0V _ÒÇIÒ«@ÂÆéÜ}Ÿ~UO‘ˆ¸ØnŠžÛ¼¶N¡U’±À,ø‚¿I@Vü¶ȔۺXñ(a) ,MDÉ™”ìþÃfÇͱ¬é¶ô>øâz|@¬cñijæµ 4ƒlæ+S$§, €Ôgª­†Ä5Éþ¢ý”7ó.›ÚØeœDŽå]°øÄå2é,!^/^‹í|DŽi§ +Fõy—syô“1Ž§Hz€HÔ!ìà/ôáØâÍtb$ð›®.´'ºÉÈÁš¤ÕˆÃûÓ/”G›r,ªa­ &Âh=m—zjÀg]˹†LYŽEúüìÆÆéa$De¼E4ZwûM9¶~Šá®•¹oó×fq’f!¯%û‹«{:9 šŽóõ!F6¹ˆÉJ4œš8Í}zê¡G ÀÈ9Ë2YbÝwÁíg}œ—ŸïÒHø·Åggl»’¸kYÍÐþ8´Dèe*6Š’Ѹ6ŒúmWn«Râ{­=° Òÿ£Ž–Œx¤Òà}³ƒ¨Þ} ø´çn—ö^9%+Cš’Dw A5#,€¸ öÈÍ?Ãgi/~âANâcg­?ÎZò?KÛØwé0ù" MjnËõ¦Û3¸ªZ´žN4Ùÿ)ÂMœ›,ä^bäU_| +˜Kp$íÀ”ØüøH§—Ùºt qòQÝ:e3N¢bD±{uâò1á½âànÇ ’󰘌ï,Áë¬k¹ç4¦î^Ò–eì (ý9$>ç ̳Ød`®™+͆ÒñۜÄyÏç^ó1&N<ÄÄ»°Ù‚7Û7;^ NÈØ>ñ”¬úpóLªÝi…©7Fögj\.‰z÷‡ÑälYÔÏGñ$ *!Ȭ‚ “ûpóyœožÀÜ ÉùS…ãG+£òžo½r±KóÓ3QLhœÌË+ñÊ>ÌíŒsçn{Ñ‹lÛŽ=NînEQi½±‰˜¸a‡,NŒôK5+y† +ÅÕ˜&=í:®«°Ü"³¥‰ptª6‰ÄíõA õ6 e…çrhR^3†Ô©< ¶aã0ꩤ¶ØŸ‰“d"Ÿþ¿î ƒˆ¯ŒLáNªÁ¥þ•J&¼ê(àrû%f¸1¤§)qœF÷‡%æGâœÆzCÕUÄ:øàªìþ ¢i+52BM\BÚ¾ÚIé v½ãBcP#‰>ú +1Õh÷oÖo‹”è« w–¦ÞmPËçj6"¸Z7œ;íªU7åêí©…Tñ9²ãvcp#¿ê’¬FÑŸÓeÅ0ãM»aTk•½a6tÛ,O&3ËL¥ÂƒUùL•áixø9± Žžè¼· ì£MZ®¡ ÄžÙDeª%d§ƒ*AÏén„Äb'‹±Ç†ÅëŶh»í% ³þuå÷_~ÐÁâSBüL¯‹ÞúxÅ]÷7øryÅe¿OÐÅÜw]‡·º}åê¢é3Öeõp}«Ø¢”×# Ö›]7˜qØV~Áç5*œCÊÂA|é9`l‘Þú(Ìú´Ïø¢BœõágŠáçØ»S^PY^熜´ÎmtÿŸo?}¼¾»Í’EhÞ”2„hç2¢”±ˆCD¨Äâ¨ò ñ^ójc6`Él¼qü:À“øsÜ¥:­®Êbò }«£ÿ¤Nà ÐÞ¯HUVKq{ˆ½ñ[s¹Ë ‘Á… 8ÆËÏ8é8} ;žf¯GËY9³ ÅQ°kE0Tl̆FÊdŒ\|Kã$wô.ÎÛç ƒò~üt8LÆqH|¶.Rµ‹=áñ" Á0ØKsDÑÙK}?j„Ž£ˆûl5~C·Õ+øu†õ`«¿6øß/ÀŸûã_/ü_“@AœA²‹–U†œ<ç¨ÂÉ«$i+«ßløa†v´“Cñ÷þƒË¬Àò‘Û¹< ¤OŸä‡˜Rç|=ÿÖ2ÌÁ BTÀE€LLøûI,šÕªye㤨¤mÁ &dR>§] VaW6WjéÍ72úÜt@ +çF‡Â#ÐÆ™KCbˆnf¼ž¬Ó8W&¼ßQÕ· ÊÖÑTzXPsF6uà•@Ïý±= Y1œ`‡/̘-©Þ«¾ÖlÅ(ugÕ`1$/E+}ëâñ(ÃL™^¶T(Í}/æ‘#¨|`Ͳl«æ­”9·!†Éá/ *iééœÁþwáG †ëàAoh3ùÃÀèÂ×ǻǿɒ?pÇ/lÅq¹s¿$±&ºëŽ 8ÿÅD»,aÇÔgqž²{‘Ì4ÔÑâ Ãò€/Ŷj(®A…Ü·]¹n¹,Ÿäy×âïEvX<¤é2‚|©’\>Çn†o¶ô  +sîsðm [üáÈÔY-É`~-÷¯ƒßnüþ+ÈwŸÇnX ç³AôQ öuSï×'*Ǻ¿õ‹0KC=æàOXüÕ?;ü–®œÍ2ó† V3P…§Lý™±Yì3“Žÿ?EØ endstream endobj -1425 0 obj << +1442 0 obj << /Type /Page -/Contents 1426 0 R -/Resources 1424 0 R +/Contents 1443 0 R +/Resources 1441 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R +/Parent 1432 0 R +/Annots [ 1445 0 R ] >> endobj -1427 0 obj << -/D [1425 0 R /XYZ 56.6929 794.5015 null] +1445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.2146 205.1117 375.7455 217.8489] +/Subtype /Link +/A << /S /GoTo /D (root_delegation_only) >> >> endobj -466 0 obj << -/D [1425 0 R /XYZ 56.6929 167.2075 null] +1444 0 obj << +/D [1442 0 R /XYZ 85.0394 794.5015 null] >> endobj -1428 0 obj << -/D [1425 0 R /XYZ 56.6929 139.8789 null] +470 0 obj << +/D [1442 0 R /XYZ 85.0394 162.5022 null] >> endobj -1424 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R >> +1446 0 obj << +/D [1442 0 R /XYZ 85.0394 137.1661 null] +>> endobj +1441 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1431 0 obj << -/Length 2969 +1450 0 obj << +/Length 2962 /Filter /FlateDecode >> stream -xÚµ[[sÛ6~÷¯Ð£'jYµÕºÚÚ[뮧ÈÛbã$í-´ÚŽ]¹Y-q±ç„/ÿ[íÝMÞæüP9 KgÏ:ß›ØCV„ -í¼¹/ìð4‡b]þ1í´BÇsÙ>Ú–Ñ O~ÅÉ 6ÂŒˆs¤úðÑ‚‚2Š˜T™C­·y6[ØPÖŠP”ʲŊIÄ” ´!Í®aŒ{/Á ‡¶¬öMD%Œ°–g’ Aù‰©ã@«!ÊŽ<™y2åÛmõ¼‚á/^ÆÊ 'ˆ+9£Ý£&ÔãFx†x¦Fú?ÅqDºÆ¦hÖuÙ…ÃvTáÕaʵ…±#ÕB!Í@³—û±£Œ0”ŽÚ›õ§…mÜ\öø—c¹ÖåõÑ9C‰L‚A¥ZÏÄÞ£æ ‰¤CÐI¶qH4ÉfØ6@%ØÖ£Žãô婨'È8ExZ¹GMhÉ&à.dÃ@ý[’Í;1æšDŠâÓ\ƒé‚GANrÍág<Žå¾žkÒ¼Ke–½GÍIKs kxå)9õ*Áµ5¦U @ -/Œ¤~š0  [®bÈõÿŒn*¦›óc¤\R$e&N34ÕB®¦×ãgœŽå¾šqK¤¥`éè{ÔŒ!±´$ã„!(3Œ¢N3ΣŽ#ÕÖù¾y€ÅT”à4¢T¥Õ÷  õßGkêK¾ ½)Ï2”IÐ}’oFxšâ[Ÿq:–ûú §’ -Ïß£æ ‰¤¥ù %aPÓ| |ëQÇ‘z:À -¹ˆÙ™KPÖîQêC¾A~cœ†úß’oG/Æl£HaÐ|šm\ a˜“lsø—c¹ß°v3´ÀY:ö5gH$-Í6äÄzŽmT‚m=Êh´#´:TÛr=±zSˆPÊÓê=jBH7f6Î24à£ßÎ56þ¹ýóHüXî[GB£'»ß´×¿u†”½vB Š°¾Â‘ÇcotÂ`Í7´4E«?ãZ,w’Vtê¥ °ôeé{ÔŒ!±´$­¸â¨Ó´¢NÓÊ£ÆÓ;üç¼Þ”ûOc;(†¸Áö1mˆGMX2tžbDºõÿÉg#‡Æ4' ­ÈÉÜÆ6W8 ¡ÇϸË}ýÊ œÍˆâéqð¨9C"iiB^`ŠÍ‘p€J°GÙ1kªSEK-Íg”{Ô„ö`Ȭ朗ÿ°ß¾@Ø©^îŠ|dyxÚÚërŠoàŒ^¿à?Yõ€å’²ßµvµ;˜Ã -lÛÔ Ñ>ö·ÿ®ö…ÉŠ˜-ï¬)ZÛö[+óõc¹/šþáÜÝ.·În›×…W•O”Ûh&—ª·ÿxÓ•Û „CFâ}QÏÖxo>Ü]_ýgª§¾¯Ç튦É?ÆçŸiXÿV¶Ïög6®çé`ÿ7 67ÞØÇb[6] Ó´÷ùÎõ6Eýµ¨‚?°À®˜jÍ÷#!‡ºÜå¶v`VÖú €¹ËAM ’<Á©óVg½ÐuØ>5¶•ï_lãúW×±ÙØqhš¢±Ï%QƒéJ¢1Å(,»¨ÈŽ9-˜Ñ,,ïK¦x®äò™WÕ­mírgÞ}1²åœ,Á,ºD[·5Ñ-€yæÂʈI*^e­ °¥Ïzk1²ÚªÔýÆõØSýL³¬±< RfEÒ°u›"¸c‚Š™ àõò?m{能 ‰aªœ¬ÊÌÉ@0)f<%HrÁ‡ 2;Àm#È5pm³©›·O÷¶ehÖ¸EÒÝñ¥è¬6½TÿÊ,v‡öÅ6Íl9™Ë™äˆc{:r:—Q§s¹GuùÇbýyefg¯RÊ”žQîQÚÃ# ‰ÉSú;›j8¤·n`.L¦ï©é&ž Xe{ûÚº\·îŽä<ÉkH×Ì°0Q&ïÈ ˜æeßæÙÎŽAæ¹¢nóÒiÞT;Ûæ6e5Π½Ï?’òQ®µù€,[š ºíž‚ Pû}ån˜tÝ5œ‡jßô¸AúßØž{&´³WÖEhì‹ö¹ª?wnÊRÌt'\|ÍëÒ°^W¤nIeeUSg@û“•öåP8 -_UõÄÔÊ2„a)Ö¿@¬ï“ç>Ò¢ƒu3#Z-†câÍ-‡çd<äåvjYoEMéô´élR¬÷5ÛüëԚŸ1ö†–ÚvªI¢œ-?5õ‰†,ÉÌÔ S¿G§þî¯hÞSØwjIÓš=jBu¸†ƒÝ©9 t¿ÍæaèÁø-+PÆÕé2/…!‚¨ÀÉÄfÁãgÜåžÚ,h ï2I4KÇÝ£f ‰¥%YF gÆgX6Df™GÇÖº›5líâƒo])Òú=j€0hÈÏJ…¼%׆~Ä D+•8X0»mLW“ ?ãt,÷ÕŒãØT5´LGߣf ‰¥¥' ¾˜ÐÆ P Æõ¨ãH•û¶øT—m¼E…‰‘ X4' ð¨ BÊ)óaˆ -MxKÊŽŒ9GÁ4Á9&aäXàkŠs=~ÆëXî7pŽ£ŒJ™¿GÍKKsÎ|eÂÔç¨çzÔq¨šò~;Që¾åàð -Lª÷¨ ý!ãâTëЀ·9¬Ü/0¤´Ö‰ãóé =M/8üŒÏ±Ü׿U5F”Òtì{ÐœcYI² Ü4­I² Q§ÉæQÝš´¨Í>vÕTùªm·q‚Ã0JD¥ ð¨ Bº¯’‘Є·¡Û„#cÂ)Äxâð¶œ*¸šÌo?ãt,÷øfÎ]OGß£æ ‰¤¥)T:G¹*A¹58βùásó9â\,!ÙŒ5aBÀ9‰‘ÔrdÃÛ¼T§<ô ³L&>€3å>94oî´ËágÜŽå¾þ­ -»1-2Ž¿GÍKK³Î|äÉ2iÖ P Öõ(£±­_Víú°ª‹‡ºh§ìÔeÚš°`œè,ø Þ&ÏMø1ÎsÉÄn•1¶ÁBoèB2Ï9üŒÏ±ÜoÈs°Ôð2Lß£æ ‰¤¥‡a᫲™|‡¨ãz”Ñh>Ÿ¾Ï›øÊá-Ûú¤fšPPj¤2X¬º»û®bÎû²&Ó]AÎvÙ‚%>ÚhïW¶÷Þ¡\Í”» -µ4mUÛ Ìq(÷Àî÷5EóÌñ‘‡ÊÒ¦¾à†64,,ã«Â›Í?þ¹xyvµJÐB¥­›¿°ý©í7ò…=M¢j™»›¹ýcJç¶ÕÅÏe[4‡|]¬6ŶܕîQ¹ìµ˜B=,)ÇpÔnë^ÎÈ–M±oË•;osv~ú-´t©Çêºa ¿³‡]=Úôu‡P¦Ñ<Ý7Å—'ûÛ=°ÒáüpqÈ›nŒ»àÓ“ùõAoF•6Çݾ/‚0q)huj«àÃ/Ižó—Ñ/Ö.WVãœyÔìKÌ'~Â2?ݘ˜]ðßüÿBäøón~lpr¹o -£Þ()Æ–ûŸ’Ħÿýì{endstream +xÚµ[[sÛ6~÷¯Ð£ÿÞ®Qæ³õ€Q„õ·DŽ!¬é°ôsÏ¡Xëð®…rGiEÇh•*Ä!óÆcìPS†Ò¢´âŠ# `§UužV5œþ 8ã?gÕºØG…1‹âP#–x“ ŒBß­ÿO>84rL©:ŸÛ8¦ Âs:BB‡Ÿp?”ûêÜ`8Ô’4>5eH -NBÁt)eŠ„=T„„ÊŒY]ž«‚`û\Xú¢ÊjD»?äÚï÷Ûˆ:Mç»<ÛW6Ç­ù\ŒÑM‰~=ãlÙƒBSÈŽ•mñ$f0ÆßrÓ65h4OÝã¿Ë}®“"fóå“…Õyc@~ce¶z*öyݽœÙçÏÅÖÚmÒï*wª²‘zMâRQkáOwm¹ "1’˜wU=Sä½»_ÞÞüg¬§ ð¤;ÿìòºÎ>çÚëŸnÿV­¦ÏôhgÖ¶çx0µ››ioÌë±-궆©Ûûlg{ë¼ú–WVÁ',°­¦šW³ý@È¡*v™)@¶¶Ö{Ì]j*Dà N­Ð028ëÜ€®ÃöX›V¶1ÛßlÇzmÆ¡®óÚ¼çÕD5¦­‰†£°ë¢"9 ¼é1œÄ0‡ïjºŒ®äüÊšWVií2kÞc>°å’ÌÁƒ úüÓ‡)ÜêèæÀ¼sacÄ$¯²VPÄhÒYÛ‹‘ÑДݠî×¶Ç œêfšaá™÷’Ò’v„ÓXWÁ-TÈ«Ë&;n;èÆ<…Ä0VN†Õ:ÑWÞ¤˜ð"¼Ÿ ±Ü4¼\ŸM6Ð…óæøhZšfµÝ#-Ok¢µZ褺3ßšÓÔ³ål*g’#ŽÍõÈùTÞGOåÕVäŸòÕ—…žu¸I8¡Ü¡F´û›T LbõK“j8¤»m`6LºïX·O¬4=–}MU¬ûÄLò<É*H×-ô°äéÏZfB£~Ù7Ù_æiKýR^5YaÕ®Ëis“¯jkÍÞ%Iù Ñšä@–ÌõìܶoÁPû®´t®nÖüC¹¯;\/÷¯MÏÆÜíÌ'ã4öyó\V_Ú{7eø¥»O³>|˪°Z•­¤v;ed•c7@»k•æå[þÞ”ÕȼJ„aÖ­Æ÷ÑKŸr¢…µÓ"Ø)ú³bdÙÖEÒmö6Y±ÛÂ’˜’^.=o:›ë¾z›};>SØÜ3ÆÞÐrØÏŽÕ!)C”Ó“åçæ=lù&æ}™÷ê4ïw §)R«¸â4¢ØÌuyŸøšß¦ìÖ·¸À +”pu¾ÄK…^÷|Œ•@:ü„»¡ÜsÇœUwL×*¢aw¨ CBiQŽQ¥À(>Á±>ê<Çê4F°Í]¯àP7v©À1‰«ï@#ê‡W +LA—§ÿm¨¡á•B[G?¥1„#ˆçiôJÁâ'œ從oRÁY‚±xðjÊ@ZœoBWQ à[á[‡:T±oòÏUÑ„GS=-°ˆëï@#ú}ÂaDUÂ|Þ’pžCÆDpäÚ6Æ(ÁDy®F¯,~ÂëPîw0ž(ÂâÑw¨)CiqÆéûÈŒë¡"ŒëP§¡ª‹ÇíX N…SWïP#úýý3CX1áð–‹iÏá¥C*MÓÈ¥‚€˜ÏÓ襂ÅOøÊ}=ß‚”cïP†„Ò¢|#)G‰§µ>ê<ߪÝæ•>Á.ê2[4Í6Ìp ب5bÏ8‰„>û{&¼ ãFrNÁ±’‘HŽã0¨ð|æ8‹Ÿð:”û9#™4~‡š2$çLRIb‚s=T„sªw‘erÄ—úK@:ç$°À¡FLðHÇ)âlx›…uÌ“zDzDF.ëC)°²ïDôšËÀ'œ¤¾šrc”دDƒïPv„Òâ”Ó_îÔßi‰S®‡ŠP®CiMõ²hV‡E•oª¼~ +Ó\{½Nã8Ôˆ~šK ­ß„·Is#Ž ÓœD§¯ÇŽe9 +PØgö}ˆf9‹Ÿp:”û++l¹Pñè;Ô”!´8å0l}U2ñÍÞ>*B¹¥5ê/N?fup±&H08ÓGw Å~=D—ë¹ô5·÷ôm¡œwÕL–¶¥8ÓeJ•ød¡y^šÞG‹²¥Rn ÓR7eeJN0ÇÝ]<×ÛëÜUõ;§W6¥¾šõ$Œ}qÚDP¿¤Øæ0Ç0Øîân‚|É_žm•´PiJ¿ú/*óÝøÜ\"Q5ÏìÃÌüÑsÓjc€ç§¢ÉëC¶Êë|[ì +ûªœwZt}^pj=†ºh[ur¶¬ó}S,ì5›µÛóÓ}½"•6Q@ã4Pm7 ä殢­Dë¾öîI7êãc=šß ¤=+-Î}/>²ºãöø|Ô¿:èÌ(ãæØǹ_ +&6 ¢NMý»ÿý‘çìeð‹•Í”å0cž4»âò™_0ôO6F&ü·ÿÇ¿ 9ýl†ëßœ=uèr†!Ö(™„Éþ„$4ý—Qëendstream endobj -1430 0 obj << +1449 0 obj << /Type /Page -/Contents 1431 0 R -/Resources 1429 0 R +/Contents 1450 0 R +/Resources 1448 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R -/Annots [ 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R ] +/Parent 1432 0 R +/Annots [ 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R ] >> endobj -1434 0 obj << +1453 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [312.6233 667.7189 381.2953 679.7785] +/Rect [284.2769 667.7189 352.9489 679.7785] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1435 0 obj << +1454 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [310.4119 636.5559 379.0839 648.6156] +/Rect [282.0654 636.5559 350.7374 648.6156] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1436 0 obj << +1455 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [340.2996 605.393 408.9716 617.4526] +/Rect [311.9531 605.393 380.6251 617.4526] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1437 0 obj << +1456 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [328.1051 574.23 396.7771 586.2897] +/Rect [299.7586 574.23 368.4306 586.2897] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1438 0 obj << +1457 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [320.3548 543.0671 389.0268 555.1267] +/Rect [292.0084 543.0671 360.6804 555.1267] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1439 0 obj << +1458 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.1386 511.9042 427.8106 523.9638] +/Rect [330.7921 511.9042 399.4641 523.9638] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1440 0 obj << +1459 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [429.9426 480.7412 498.6146 492.8008] +/Rect [401.5962 480.7412 470.2682 492.8008] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1441 0 obj << +1460 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [286.0435 315.5214 354.7155 327.581] +/Rect [257.6971 315.5214 326.3691 327.581] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1442 0 obj << +1461 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.144 284.3584 407.816 296.4181] +/Rect [310.7975 284.3584 379.4695 296.4181] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1443 0 obj << +1462 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [336.952 253.1955 405.624 265.2551] +/Rect [308.6055 253.1955 377.2775 265.2551] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1444 0 obj << +1463 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [322.5463 222.0326 391.2183 234.0922] +/Rect [294.1999 222.0326 362.8719 234.0922] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1445 0 obj << +1464 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [331.4327 190.8696 400.1047 202.9292] +/Rect [303.0862 190.8696 371.7582 202.9292] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1446 0 obj << +1465 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.2812 159.7067 429.9532 171.7663] +/Rect [332.9347 159.7067 401.6067 171.7663] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1447 0 obj << +1466 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [330.3165 128.5437 398.9885 140.6034] +/Rect [301.97 128.5437 370.642 140.6034] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1432 0 obj << -/D [1430 0 R /XYZ 85.0394 794.5015 null] +1451 0 obj << +/D [1449 0 R /XYZ 56.6929 794.5015 null] >> endobj -470 0 obj << -/D [1430 0 R /XYZ 85.0394 726.6924 null] +474 0 obj << +/D [1449 0 R /XYZ 56.6929 726.6924 null] >> endobj -1433 0 obj << -/D [1430 0 R /XYZ 85.0394 700.1172 null] +1452 0 obj << +/D [1449 0 R /XYZ 56.6929 700.1172 null] >> endobj -1429 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R >> +1448 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1450 0 obj << -/Length 3050 +1469 0 obj << +/Length 3111 /Filter /FlateDecode >> stream -xÚµZ[sÛ¶~÷¯Ðô¥òL…q{LS;ÇÓ¤Çq§iú@‹”Íš"uD*®óëÏâFñ -6§éd2†€Ø]àÛÅâ‚WüÃ+ÆWD­„Š‹0[m÷ÑêÚÞ\`‡ÙxЦ‹úîîâÛk*V -)Nøên×éK¢HJ¼ºK[sDÐ%ô­_¿{{}óæçÛW—"^ßݼ{{¹!,Z_ßüûÊ–ÞܾúñÇW·—,^¿þ׫Ÿî®nmw}|wóö{[£ìŸ™No¯®¯n¯Þ¾¾ºüý«»Ö–®½8¢Úÿ^üö{´JÁì."D•d«gø!¬Yí/bF‹)õ5ÅÅû‹ÿ´vZͧ“ã‡#D('Hhg%FL)¶L!N¡IàÝc6Åxf»äT4öG^k˾½Žeç{NÅ‘¡úïŽ÷ÍWÕ“B’R(‡úF÷GýÀBÏêëK¼®m¹Lšü£Ÿ—›}¶¯Ž/öçñËu–nî‹dû´iìO¯iÒ$÷IÁ¤ÑH€¹é/j¬Ê¼œªÑŠ®6ŠÀK¾Ú`ŒcĨØ$O™ÖĈy8í³²©‘ù$¬³±4ØwÍcv±4^LŠ“@)uf¶áPÕu~_d¶)ßÙÚ$Mó&¯Ê¤°õg]ukz„8ºÞ“®ú>ËJ[WäåS–ÚÚ¼l*[Û<:`á{MRÃd¼~_í³Öc¬õ—:Ù -gn+ôl»kÉËmqJµ<ýë9omÉÈ3ŸæusÌïOÚ"[e[(«2›èÒ`»wß¼¸Þ,õÐÈ›0ó— aíÓì· MeÉ'¢G‹Ò£‘æ0‰‡¡XÉÀó XšÛõ>Ç@‘žØ÷Y6ϬÞóÃy8«s­® J ˆ€KFå2)ø)Ès0ì}èÓ3Ð6V¶pÛ1µÅ/Ø:î×»=›¥Ã5æT‚˜.1‘á1oQKŠŒzÓŠÌÓ b¬<^ W —G™ÊŠì!ÑÖoª²xÊ É‚-jBƒ®Ñ0òˆ:PÁ†wÅ×¢ˆ&ºÌÖFS›EnÂ$üÐQEÿ}„cI™Úªº9ÝÛÒ'poˆ›8ë›kÍz/ L ¡åãKVOp ¤(‘çUCGvpÒ©æÍød£ Èz΋ÂQÔNó{óàc…"%å ÐÛx”4>%.öémþº–û˜h;Ö%ï¦ý µNürp^¬•›g¬Ò–ò–uP–y”6kWŸ“c:”«("„±°\šÛ‹b‘ˆË¾Üwf(eë}–”yù°;nÚÙz·<17kºé1©mUbÿXåõ¼¤ný‹a©¨³ŒÅ†¾ã8cDÄ}&â}kŽ ì@f¹¶2·É©Îœ¬VÅ¢ªž šZ½+Û¸KòŠ@Çô •ì $8¾Àè2vd…Ê¡qºÑº4>dMÓ~RV¶2)ëg»ŽëÄIðõóc^LF\Jê¬ï&Ǻ™“8úQx®N…“ŸEõìt²5euÜëôDWùá0¶U¶Î{p0ïʳt–ýŒ1 &4Ï}êP_î0¶F°>GÀìà4–Ü‹M`f,þ]Ñ?×&Š`a‡渂d꘧™«}tÍf[ªvøPT÷fœ¡®O¤Ã˜²qs÷¡‰GÑy¬©¨Ù6×sîu0 ûÓEÉV¦°AjL# -[A`ë CÉ0§€‘¢„·ñÙV%ˆì¼Ÿa–.dv,³4ïÖ´Í5H…>óÇ2´µ#§3$“-Me¯v˜ n`$&ˆ°X-P²ƒ -pÒ£LÂõçÎh³1éý0*sDUaé4!½ÇË#W¤/þ—KEÌʆa‘<–b†è»Ó%i4}õOé݋ýaF\·–É>³UšI&(!Z%.¹ÓØ¢z°-"ýQŽ°Ù"ö•)\¯fÖueúò­Sö›"c`Ó%(}jYBÀîææ×ë[d‹ngÉí–*òˆc† µ­°ìáž1¶²íj ‚Ä@®OÛfø5^W7:7áµ3Ïâ¼iºÁìi´€Ã!+óáçBb—u  ªòþ‡¼_¹Ú^€ý£,'#ÆúL5ðgŒÝ[̹œµdÖgb;±Æ»¨yŸiQ=Ÿiö‡ÎaD‡±1[P¢EMhÑéIÂj´¾cË"eZmÍ™€Ï«ÎFÍïeÏGGRŸKàh}Ó1ƒªù‘& ²—H.Œti2,rÄîy’:MÊõ  ¹½l1†ý‡Šûr_¹tCz'’¤sä$[úº¶?- ikø,MbþºÕ6ÍJ½‰˜ÛéHÜïÕ¬8úsߪ¹>'ÃtØðy±Pªï€s>Œ`LbïÁÓ^ -¹¨ÒçC/µQB¯R†2î(«»Ñ´mrïÏlü«7Ñ8ˆóØë°Oj—N ¨ób¯CàD_ -Öá5­ }5aƒðL½@·'œ¡2•1)‚F5OåeíüsãX³©óOãˆ;âˆ-(àA -ôw×EÆ¥§Á—9È™²c ^H$³G:&ø%z¶ŽtZü‚Ùã~gt¢‘NƳðø·¨%MF½Ït((dÄ ¤ë ¤ó(?Y&óÙenÅÊ÷Ùf<#ö¨L†õp˜ 5zÔƒ]ã˜öõørÔ›³fÕ!)Õëä,y„0Ã}“CôøóÇýÎQP UÒûI1 ÏB‹ZPdÜ[˜°óŽ÷]T€59gyZL2VX~YX“5¡JŸ… ¥§¡«Ë?ÄÂŽECRÄ#IæYÈbÄ1=£C,ôøóÇý~ 1"Šð<´¨EƽYH¤DB.„Áhžƒ46ªS3Ž‚°2`…ƒz´ ±"=r « 0µ«É?=»n…¹š§ €¢QÏæ=š“䣈Æ*¬G +ÒQõ5ù{äSÁè7M>¥¯RÚì|jf0`¸kqp ¶è°éÃ>?ƒxRí°ñoAa%F}…‰K5añó:¨õ<Ên6úŒl¸yŽõ…« ‹õ  ±½Gzÿ¥Ý¼+öËí¬üp†!Ãâ¶×汶­ÐWXºìnRà+m®©j?ÿ˜Íí69‹4W1€®ó‡2Ù¸³gˆ 1¾]9ï´ˆ½ÍÓ¿ûþýÕk[Ö}‰ÕÃAŸí#bÞ:¼ØÒùº”èk»$õßÙ[˜jo¥yýdY¶×lP©\[åØëVb ܽœ•IÎJO¼Dô. Åî{ûWxÝð`§k–¿B "øBÚ×ͳ׃üñö¦n`Úê&ߎŸÀF\r,‚Ò[ÐX|/Lê+ˆ¦]ñ7»‰GUJ¿õ’ÿד*ÿf˼5åóSª§,;ø_ÎÞÄ5ååN¿qÜ… -Kló8+¯Ï¯³Œ ©®lmí6)ÛçYæozÚ²Ô²¶µ2ŠpŸÝËˉ·/B?Çðéêyb:‡Ã”CATh¿H3 ,‡×r-ÉÚ¡9¿2@s½)C3¯á¿óß¿ýüüB>ˆJ9—à C©WJÛ*øØWÜkñ±êÿ×è"Rendstream +xÚµ[[sÛ6~÷¯Ðô¥òL… ®iêtÝÙ&]ÇÝ™¶´DÙl(R+Rq_¿Wñ +¶Ût2Àœs€ï\ƒW üÃ+ÉP’*ºŠ"–`¶Ú®’Õ#”}w…fãA›.ê›û«¯ß¤b¥â„¯î÷¶$J¤Ä«ûÝÏë×ÿxõãýÍÝõ†°dÍÑõ†ñdýÍíÛomŽ²?¯ß½}sûÝOw¯®]ßß¾{k³ïnÞÜÜݼ}}s½Á’a¨O\ 3ÞÜþóƦ¾»{õïÿþêæ>ØÒµ'©6ä¿W?ÿš¬v`ö÷W J•d«gøHVŠ¬W”¥ˆÑ4õ9åÕû«…;¥¦êTÿ±T"&‰˜è@’v:'¦|%˜B<…"Ý÷O9XDñz—ï³sÙڢі}ý†ÊN}NPŠBuÅ/NíÕ“B’R(‡úJ·—ú–Õ—×xÝØt•µÅG'¾¨6‡üPŸ^ìçéËu¾Û<”Ùö浟^ӬͲ&‡±J¦½$8X{9u«]m>–|µÁ)ƈQ±Í>ävP3#æñ|È«¶A¦JX‰ˆb¶·ÞµOù Ħtý1+ÏZ@š¦®bn ŽuÓen‹Š½ÍÍv»¢-ê*+mþEW]º;AGœ\kOÙG—ýç•Í+‹êC¾³¹EÕÖ6·}rÀ&?A}MVC`¼~_ò`@ÇØ&;Kgnz±Ý•Õ¶<ï´<ýõ\´O6e䙪EÓžŠ‡³¶Èæ@Ú&ªºÊ'šôØæ]ך¥yS‚ŽÎ¥@Xp<=hÓEYòã‰èPº7v âq(cŠ$.7 &÷¼ƒCh×íI~ŸçÃ.Í›í©8^z´Þ;ïêš¡JõÞuÑ 4Wå Ó ¿&ž *”è™h O+›¸ëð ÆŽÛµÆn/fé ‹9ÂC•R5˜Zèõ€ZPdÜšVdžaŒ#E_`Xa˜G™ÊËü1ÓÖoêª|QMc¥ŠË÷  ù=¢qðs‘ °ñ]ñõ/I’f:ÍÖF“›eaâ$|è°¢Ÿ ÂX`VílVÓžlêø7Ç ¥b}»w¥¹ÃC ãyƒ¤ +aŠ¹cãKÞL0 ¤R"/Ó†íà•SÍ›ñɆõ\”¥3¢lœæ6èAe…%å ÒÛ€”µ>e.øé m~] +|P´ ë”wÒþpZ~9:ÖÊMÎÁÝ·Û³¶ qpÈ‘BWÉæZŽ¸`K~ð›n…17Çíj­NuÝnJ8T\ô4Q4 &ôèLJakQ·dŠ#Jè‚[vQónPZâ¾>=g§Ý¨û FL`P’{”ƒµ[Oô;Û4eëCžUEõ¸?—n^ßÛ|7«3Çu]ô”56+³?VÍæ[6P˜a›ÖÌþÔ8ýxîÊ!‘p¿€ó£=¢I,°™UŽ•¹ÍÎMîd˺þ3Õ»¶…û¬(­…N1î»a¶oõ"ŠpÓ ô€Ncçâ94NÚ@…yÛ†*Um3³ªy¶Ë½Þ|ýüT”Ó]€àÖ:ˆ‰äÔ´S½`ÖÛ¾žëséägeY?;lNUŸzU§³|wÛj›çcö-œcR‘ïæ€D8lƒâÐAEÀ£: ûwè)E”‹Šö  Ñ=€È/Sí]Ù?5&þba»ƹ†uè©Øå.÷É%4£mªÞ[àcY?˜¾†¼>Mž”‘ °pM$ˆÞ˜Œæ˜o =î^³Df?Ýüd +ÞÇTJa%'Ž"ˆ2\Š@H 3›!…Ø€)žaaåf›Ži–ë9iÖ×€¬!?]ÖÞÕnPºN/-Í2sjåoû àëZ&.§e¡¥G™•êï{£ÍÆlFÑ™Bü‚]uT|@MÈïGgØC¤ë+ðïkE̲à +ãlˆŠ5$Ñ9v«SÒhëOC«ý‹ý0}®K«ìÛ,M¦N$N´2·.Öز~´%¿$,ù­>Ÿ`«Iì3RºV͸ëÌÝ (¶NÙ#l)]¨-‡H™„]C ØÞþçͲI°¶ãßÚeŠGˆh†Í°âž663´¶"ÁÂJ®ÏÛvXÁÚ¯³Œ3]ŠðÚYhqÞ:]`6…ZÀñ˜WŽþðù !Ô­-»,¢„ ΔÔÈ{—ËíuÀoU¹¸ð4b¬ãÔrÆØÙœßYKf‡R›AØ4F§‹šwœ€ê9N{8n\w݇ê&² D@MhÑë6(…Uå@à>6¹PRíê­9TñëÍõ‡—C;©vp²¾ DÜÍAÕ|Oc†8å 3géi2,rÄÀrŸÂ/*8 &$÷ƒSŠaª/ú•[{HïG’tŽídpª/ûiyàx XCiiV$æ×M»»¼Òû¹„¹Í¢ÄýVÍÌ£«ûRM÷9æ°È!0A(Õ÷Á97† .ö«24í¨Ð% +Ãövè¨6PèÙÊ°Ævwqz»Íü¹—ߤöwHT Ωoþ5z‘:y²¢.³¾Ž‚m)Ñ×›Ó”úÏ©Ì–!óRÄI"ÌÝô1ùÅ’(ï:jø°Í?Î9ªï%%õ}ÀDU¶e¬Z`#¨b^5ϸ€šõ¹‘NRD9ãqUjB—>ñz gO™¿‰z]“F×Í°îÃ\Í“O)Äg=³côóø…·ûÇ)«²4´ Æ¨­8 A4U $¼€"t ùP1IAŒ¸âq=h¬HŸ€úl_ô5ù›&Ý®=ÃاoÐB‡ Ö59Ê>?jõOp/A‹èxL\‡aKqâPGÊ¥ð×AE¨çQö0³Õ'b£}2ÝX—P‚û—ëB3’÷%®]ôqãÇùüå:ã(LöLŒ]®{ü‚±ãvÿÄå:ô'[êõ€ZPdÜZ”aXÁD;¿(Á: y~yÐexôõeö2uÔ¥R•FEÐXöð K‘„÷„N†]LHf¥z­<ÀÀI:úǘ‡Çíµ:K26^MR åÑn 5†mÅ)Æõ½žXb]T„dÕ¢¶Þ4u6¦ìfX"ãâjB~Ÿh6 ÷ø<붑Ù0að„àÕ¸~:¨z–F¹æð 6Ûýã! öö\ŸD;? –µç[Šaf]8\î€"ls -îx~øO̘P+ @c©ýseŠ¤T²'öV÷´ þXRò+ÊlÎP!'œØCú9s™EÕš“WýÅÜu$d»»0wKOí=9ÕÖ•ú²J§Ý… ÔÒ›¬Pýc~2´Ûì"Òܸº)«lãΗ)P'>ñ9_®®ˆ½·Ó¿ß¾}ÿþæµMë6ŒÎÄêá Ïö­1^lêr5Jô]¶óõìeK}°_»¢ù`£b߇©\YíØ«Ub Ü¿\”É.JO¼Øô~ Åîvû7uÝa‡k–¾B ²øž²š§¯ù#ìMÓ°5m±?,€M9ч1é4ßã1Ó³쩺òo÷ϸu*ÿ¯§gþm›yZkÒ—'gòüè_Æ9ƒ3WTT{ý"Ä‘2,³Í#¶¢¹¼b3‚¤~ª²}²¹Û¬ +ÏØÌïî|8æ;Kw‘L’Áƒî%åÄk¨ä~q™ÎápÉ¡e¡Æ.×ÀjxýXºæò¤Í½ˆOÒÏØ'ÆþÝÿòkùË% ¥RÎÜ]¦ G’(á•Ò¶ŠÑ~,<««þ?çme>endstream endobj -1449 0 obj << +1468 0 obj << /Type /Page -/Contents 1450 0 R -/Resources 1448 0 R +/Contents 1469 0 R +/Resources 1467 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R -/Annots [ 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R ] +/Parent 1432 0 R +/Annots [ 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R ] >> endobj -1452 0 obj << +1471 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [231.137 681.3376 299.809 693.3972] +/Rect [259.4835 683.3704 328.1555 695.4301] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1453 0 obj << +1472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.152 623.0288 267.6829 634.8294] +/Subtype /Link +/A << /S /GoTo /D (root_delegation_only) >> +>> endobj +1473 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [324.1075 378.783 397.7608 390.8427] +/Rect [352.4539 369.6354 426.1073 381.695] /Subtype /Link /A << /S /GoTo /D (server_resource_limits) >> >> endobj -1454 0 obj << +1474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.1555 347.5161 427.8275 359.5757] +/Rect [387.5019 339.3849 456.1739 351.4445] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1455 0 obj << +1475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [353.6164 316.2492 422.2884 328.3088] +/Rect [381.9629 309.1343 450.6349 321.194] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1456 0 obj << +1476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [370.2338 284.9823 438.9058 297.0419] +/Rect [398.5803 278.8838 467.2523 290.9435] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1457 0 obj << +1477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [364.6948 253.7154 433.3668 265.775] +/Rect [393.0412 248.6333 461.7132 260.693] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1458 0 obj << +1478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [226.7331 222.4485 295.4051 234.5081] +/Rect [255.0796 218.3828 323.7516 230.4425] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1459 0 obj << +1479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [283.1811 191.1815 356.8344 203.2412] +/Rect [311.5276 188.1323 385.1809 200.192] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1460 0 obj << +1480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [287.6042 159.9146 356.2762 171.9743] +/Rect [315.9507 157.8818 384.6227 169.9414] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1451 0 obj << -/D [1449 0 R /XYZ 56.6929 794.5015 null] +1470 0 obj << +/D [1468 0 R /XYZ 85.0394 794.5015 null] >> endobj -1448 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F21 702 0 R /F41 925 0 R >> +1467 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F48 950 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1463 0 obj << -/Length 2955 -/Filter /FlateDecode ->> -stream -xÚµ[Msã6½ûWè(WEX|¬=MϬS›IÖqjI‰²Y‘H‡¤<Ñþúm D$¨©8•J‰Ÿ¯»€njLVþ#+-f _©„#‰Xm7xõÏ>܇Ùt MõõãÍ?Þ3µJP"©\=î{¶4ÂZ“Õãî—õ7ÿz÷ããÝÃí† -¼–èv#$^}ÿñ[;’Øo~øøþþÃÏïn_?ÞÿðÑ?ܽ¿{¸ûøÍÝí†hAàûÔY˜ùÂûûßÙ«ï¾ÿþÝÃíoßÝÜ=z_úþÌŒ#Üüò^íÀíïn0b‰«ÏpƒIº:ÞpÁàŒu#‡›Ÿnþã öž¶_Š Êåj`"ŸŽ2FX@Ô6ŠÄ\uQ¦d*ÊÊD¹ÎŸ6¯é!ßåÍy“MVÁÝØw¢RZÓU‚€†GMð`=ø*™ˆ!‘Ÿ²ÌÆ¿yv»¬ÞVùK“—…(÷†ØÈ«D!L¹ -QwF†( -ö[y1ö˜iŠ(%jà±}X=­ìÅCÏw_ð=´k}ß^¼4R%1ædáñ,xÔ“Кa‚Ù;m)BÌÒLØCEØ¡ºŒÁÿE^ÞJž Iü5ñ%=ñ®Œæ×uæ¿1!<É'tèmLx~ÁïÐîAâãñ xÔ“ÐZTx.4Kd\x}Ô¼ðj^YÕ.é?÷¶ÒÙWåq³Ë÷檟¬ØNýz§ÐEéxÔŸa_!Çtȧ -“ -…I>Šy2¹³L Šœt;Õ’[ak µ†#l×}—¢­…Ã/Ä ´;P£q·ScØZÀ kÑdxÔ‘КÕãF -¾þ ü±l|fÒƦÆä(Lņ àLÌ&Oì‚^›8™g•VÔeä˜Ö ”äaâ`W†é:XZì&,¨O…ïëCú:U`1 -uŽ/è·Ïenxµ›gÚw'-œšnô5Í駃O›Ñ‘ü¿²pW‡ì5; ˆ"™]ß ÂÏéBµÒGEÖw‡2~üž!Öª¬ÎSÕqB1OïQó«ãC±0 ð6¥JàƸ:f<¢"Õ1EÐ7Ò§ÑêØá|íÎÔ)á‰kÞ½0½G-ѬÅO,N–ÄvE´æ@í=š|sY©C¥1$µÖÑ©=(œ{ 3®‘T˜ &›wcÆ*#\LæUF E1{è…~Lc÷vlsöÇPa) Mm,ä´@bl+*/ª’œ-üÔGÍ Ì£.§À¯ÓC¶Ù—ÕöÜàí;hˆBŸ%áQ,†ÝH Ã6 ñ6[ÚŒ3ãwïa%"’ªMHߘæ|ÁïÀê—üÎ åµXJ€G- ­yåUçHnŽ)ŽuŒáI%âPÙcŒ×ßž‹ô˜o­?¿ìÒÆeðÇòoóÉÚI¨TµuŒû7£\¶ÿf>êÓËKY5¦VàP}.ípz€ôi“¿fvà˜5Ï家7 öó©J‹&¿%ëâÉlyV4eUþôܸ±ÒNô’UF5vpçý‚›SëW݇ã™ñ¥_“™Å5ˆÛ²0Z|:ÙZggG?/JŸ*ºMш//óåç}æ öº/Õ†ÛR­û¥ÓšÚ¼˜ÜLžúZ(Ö•le»þœ;Ö‹úÅhŠ¯ó-!ÄêÆd“ºEbZD÷{öã´‹ RL\é`[„tuæöžjS2cµþ\V¿×öÒö5pQ§Çîiz¶©Ãä¦ôÇrýb½xÍË“{òšU58é̧‘$²—÷ýluå`OÂ^vêjã ‚ ŽÊt¿§¾Žy]ûß - >O½U“ç~¸·eû¹ó{àT´›«¼˜¨•‘WèrV4Jß\!è3“Q^(c뼶ŸEöÙ bŒv‹Fûaäj/ŒÜ׎¥o àÎ,Ÿ"Û@äó"shXUM‹)Öp ´>·m”¹º¬Wcß™´âÀ“a†ZÙÎ$œ²õ;@±®³¶ýà.ê2¢×§ƒí`„uFÍ‚È Ñl×. 4`óÉ. ŽXgéöy`à ç­Ê>èÔÕNXÙ绬È37vÑŽØw(×]¾æc8Øžlò`Œ-¬ú4_Êì½ÙÎ ží 5n.*û — Íb“7ÀbÇ _ßï-ÌÊ—mÔOaÖ̧¬nìC V§OîiîHš¶f9‰¶gn;å‰m7¯Ý.•7ÝzØN»®Ý¼Dýxüéþƒ[Uî ˜)pÛUN¬A3þÕh•¹œ‡ëÓ?né;óÛÔ-ÑO¾ÄiLR #¼‰uúà´&U¯[†›žàÌ€´+Lª¹…0„¥¯‘®XÙŠ“îHq 7¿Š¸¥;$pq8Ûác–šl¸?ì½Õªy`û€nlÙ0IÖÿ}Î -»>‰Òp¦µ'Éh pÍüŠŽÅõž%Ltèºð’g´%ÞTw>ÔðÀøš+¨"µ·—Ã=u% f•Ý™*{kÝÖs™¡ -wrõAH¤œæn²2ºjCÈ´ù3:\ø=ÇLÌ•š9(û÷µ$*™à¥h§ÅÖÙŸ©ÑymÇíê€a¿: xoÇR{ë6ƒöwóÒSÛÌÂÒÝÎùU[@îæ0¯”¬ž(ƒƒ-¡C=Ù/²×Ô„cæ‰rl²Éƒÿ±¿üGF—¿Àâ -1óÇ9ÓíÔ…š&ª#eœPÁ5PÖ#¡©š þ4A‘endstream +1483 0 obj << +/Length 2952 +/Filter /FlateDecode +>> +stream +xÚµ[Msã6½ûWè(WEX|ƒ¨=MϬS›IÖqjI‰²Y‘HG¤<Ñþúm D¨©8•šŸ¯Ñ@7$“†ÿÈBH$5Õ ¥9˜ˆÅzƒOðîà q˜UZ Q_?Þüã=S ´¤rñ¸ØÊÎ2²xÜü²”ˆ¢[°€—ßüðñýý‡ŸÞÝ*¾|¼ÿáãíŠ +¼|ÿï;{÷ááÝ÷ß¿{¸]‘Lå7ÿz÷ãã݃}%¯ï?~k[´½\0úp÷þîáîã7w·¿=~ws÷è}úK03ŽüqóËox±·¿»ÁˆéL,>ÃFDkºØßpÁàŒõ-»›Ÿnþã Þv?.2$(—0’ Éøô(¤â1ã×2%S£Ü£Ì(7åÓê5ß•›²=­Êª-ð4öp…8'j1ì ¢áQ<Ø€qh xüT6í³»ÙÍúP¾´e]Ù†zkxœÒ +aÊ50Hz3¢ ¢Ls÷©²;Ì`¸3%hà°}yxZØ›‡ë?ãzl×ú¾>{idO$"b̉S“éô ‘-CE’wº‚ÿ™i©gÄ7@%Ä×£úpÁ¿ª¬žVU „Ç`A`Š¦)xÔ‡@xœ! KDHâ¯)/(/reÔÁg^«ªca)IàmJu=~ÆïØî¨K¤¨ÔéxÔ “ØZRx2Ã0bZ¦…7D]žG£e®y{FÅŒ¨„{”é1ßµ«k–=K!"MÄ£&˜„ +äˆkš…TÞ¦ÂM84Ö @ kšÐ TM„gÏI :üŒ÷±Ý/Ð ‡r–ƒG͉­¥5h¶+Í茨„{T"dS ¡€¥‹k‘æâQdÂs– Š{œ…lþVN¯†Z›1¡D)`؆Dg”Øãg ¶{½äk +Ò´d$Çv¯¯A`«„…Š¥ÇÞ£fˆÄÖÒjƒÌ!ãbæ°eˆJ¨­GEš,@0Ê RLèA¢£oƒà¦÷ZsÔ"ˆJµh¾ÎµüŒÛ±Ýë5—)Ø5K¿G͉¬¥5庘;a€Šs Óݾ¬V‡b{(šçU[ììó?'›;t{8Åؾ1N™’Xò$ŠÓ$‰D¦TàA'X¢`ÍM XÓ‹‹C‡D’lÈ*¡-Oó‹¬Ê2L.â H¼¨I’aîAi‘­¤®˜‚̈Ë,-¬!ê²²<ª›ÒnmŠ³=ÔûզܚH{Šj=õ EXA ”¤ãQ|‚V#!dH¨S +¤ÚV)LòP)æÍäÒF0aôg$snÅ5™,QSVsxž¬)~f b»·½ãšBA> ²t00yk#cBGösàLÌ×8²%!èµ!ÙìU™¯òöyÓB.Ve讇åÕfÂÜT¨>¸Í.J¯º¢Êgòëçº4¼ºÅ3vM×úš—»üÓεçíhKþ_]¹»]ñZìŒ"¹8¿DØüŠ!=¿¨ÄüîQÆß‹ŒõUNS™±P<Ý{šè=ÌŒ)öÇ û·©É"'Æ™1”ƒŠd‰Ìª4ÙÄÐ…dfìð3>Çv/d)S?a\±ôÈ{Ô ØZz/ÁRê9©A ¥9P7C»¶\çi¨3)OvíAqß¡Î0bÊ aço#³± c•AÞÀ1¹¬²L#©¤z™YOûY½øc,2iÖÆä ÷˜4‡±¥¤¼¨9™€í$­¯!ê²À<ê¼üŠ1Ý«m}ØÊU^Q‹U’„GM°Þ1¢Ê†4ÞHkÓÎŒÝ dR‚$Ê/q I–_?ãyl÷K~âCÅ°%càQ3Lbk^|QÚÁ9„›„ÃáRÓJÄ!µÇ/¿=Uù¾\[~~Ùä­ âõ®\—“É!’qEm"ã~ûÉe÷ÛO¸4Ç——úКdCzô¹¶Íù"\åmùZ؆}Ñ>×›Æ>€FºëÓ!¯Úò–,«'Û°Þ•EÕ:”ÕÜʧçÖµÕ¶£—â`„c7Þ/x8v~5C8Ð1ž_†I™ÉQ\…¸®+#ǧ£Mv6¶õÓé,ö©¤ qæñwõç•íýÂædœ«…»\­Oã­©Õ‹‰ÍäÆ/ 5ñGbu7;Ö‹æÅh²¯Ó-!ÄêÆD“™ßÁPdˆj÷uöã´‡)&®ô¯KCú¬wÇM_nžG&½<þtÿÁÍ*÷L¸«*'æ iÿj4ËÜœÂùé_wôùuî¦è'Ÿä´&¨•ÞÄ<}pZ“jP-ÃÃ@p¦AÚ&Õ¥ …0„åù˸ù™­8éwWpƒñóN ˆ›º!1Ø«ÝÉ6ï‹ÜüÚp{ÜÙg«UóÂVÜØ6²a’,ÿû\Tv~•Á–&t¼„N¸9­ÂâzÏ4=ºi¼‡àmI§7Õï ¼0¾ja5@äöñ¼·ç.ƒƒÆâ`W¦ƒ}´ng—"C!öÅÏüFH¤œæn'²2ºê†eÃŒ†à˜s¥.ìˆýŽ{Z´Ò¼íõ Ø²ø37:ol»Ðìg‡om[nÝbðÏájb>QÛ\j]XX¾Ù8¿ (]æHÉê‰2ØØ4 õd?´+^s3þjó×?¹6üsÆþòÿ‹+IJìÂ(L žGÊ8¡²¸`„òŠI:AýÿD’‘Fendstream endobj -1462 0 obj << +1482 0 obj << /Type /Page -/Contents 1463 0 R -/Resources 1461 0 R +/Contents 1483 0 R +/Resources 1481 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R -/Annots [ 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R ] +/Parent 1432 0 R +/Annots [ 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R ] >> endobj -1465 0 obj << +1485 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.2254 737.5325 454.8788 749.5921] +/Rect [352.879 737.5325 426.5323 749.5921] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1466 0 obj << +1486 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.4163 707.2832 436.0696 719.3428] +/Rect [334.0699 707.2832 407.7232 719.3428] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1467 0 obj << +1487 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.2465 677.0339 475.8998 689.0936] +/Rect [373.9 677.0339 447.5533 689.0936] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1468 0 obj << +1488 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [348.0303 646.7846 421.6837 658.8443] +/Rect [319.6839 646.7846 393.3372 658.8443] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1469 0 obj << +1489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [335.4973 616.5353 404.1693 628.595] +/Rect [307.1508 616.5353 375.8228 628.595] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1470 0 obj << +1490 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [363.1733 586.2861 431.8453 598.3457] +/Rect [334.8268 586.2861 403.4988 598.3457] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1471 0 obj << +1491 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [365.365 556.0368 434.037 568.0964] +/Rect [337.0185 556.0368 405.6905 568.0964] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1472 0 obj << +1492 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.041 525.7875 461.713 537.8471] +/Rect [364.6945 525.7875 433.3665 537.8471] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1473 0 obj << +1493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.9837 495.5382 471.6557 507.5979] +/Rect [374.6372 495.5382 443.3092 507.5979] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1474 0 obj << +1494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [320.374 465.2889 389.046 477.3486] +/Rect [292.0276 465.2889 360.6996 477.3486] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1475 0 obj << +1495 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [348.05 435.0397 416.722 447.0993] +/Rect [319.7036 435.0397 388.3756 447.0993] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1476 0 obj << +1496 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [488.512 404.7904 561.5676 416.85] +/Rect [460.1655 404.7904 533.2211 416.85] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1477 0 obj << +1497 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.3443 374.5411 467.1586 386.6007] +/Rect [368.9978 374.5411 438.8121 386.6007] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1478 0 obj << +1498 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [321.49 332.3366 382.69 344.3963] +/Rect [293.1435 332.3366 354.3435 344.3963] /Subtype /Link /A << /S /GoTo /D (options) >> >> endobj -1479 0 obj << +1499 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [317.0267 302.0873 385.6987 314.147] +/Rect [288.6803 302.0873 357.3523 314.147] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1480 0 obj << +1500 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.8967 271.8381 430.5501 283.8977] +/Rect [328.5503 271.8381 402.2036 283.8977] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1464 0 obj << -/D [1462 0 R /XYZ 85.0394 794.5015 null] +1484 0 obj << +/D [1482 0 R /XYZ 56.6929 794.5015 null] >> endobj -474 0 obj << -/D [1462 0 R /XYZ 85.0394 256.8016 null] +478 0 obj << +/D [1482 0 R /XYZ 56.6929 256.8016 null] >> endobj -1106 0 obj << -/D [1462 0 R /XYZ 85.0394 231.4888 null] +1116 0 obj << +/D [1482 0 R /XYZ 56.6929 231.4888 null] >> endobj -1461 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R >> +1481 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1483 0 obj << -/Length 3014 +1503 0 obj << +/Length 3016 /Filter /FlateDecode >> stream -xÚÍZ[sÛº~÷¯Ðœ'¹c!¸ìS}'õ¹8©ãN§““Z¢-6©ˆTœÌôÇw R LYJÎt|ä£,û—ÎTêÌè>8i*GËm3Z©¶eqòþäoè×ÔŸàL*+(ÕMʬ‚.Tàͼ¨iQm9¯¨’Q±>uãÍ"§Yþç²,š¢*©eQUŸê?£"^¼Ö"šŽ&2eÎ9?ÏÜðÓ‰å||¿Îʆªÿ¦b–—ߨT‚j46EÚËl™7ßVùö‹j¨À®šªI’ÞÂ[I’Ô‹r‘Mç »µÑÒàÃËUS½Zc™ dEÚVëâK±ÈïóТŒ¿-§ahFÅ2¯ëì>§¡ó,Œ«7Ó)tÜm‹o.k¦ó|ÖD9ƒ¯4œ«U¾Î‚²)ì,$K‘~AÅr™ÏŠ¬Éý.¥¥ø œ£µ@£_ËŒêY*eEåÝf s®iD¥´ëSáÆ9}ä_³eQæ3P–v|N­[=‡ÇpÙ®æyI5ZTê⾄{ë¡CM#‘N½v"°a˜/fgÔ×4 bÒõ']¿kPsQRc6V~¹³Œ6úŠf>À…àq -¢ jöˆÆÂ*Õ¶Þïmõ*Ÿžû,Ñr€˜jAÖÍ°TÉÄÏ}U!`E«q¨K¿KØF›ûySPeF½w՚Α‰Ï‘†9e€½_Ñt5©óÅÝÀ3‚))’@8ÌK2—˜–Ä6•ÞË,a2MU ë”¡EÒÊ[7 vê,^PÖd™­VEyO½/¨Xêî«WÜDª„)¢÷6oZ•È©³yËMÝD{¸³)P÷nŒ ÆwÛi M `9#¢-’ý‡–Œ>ŠÅlÚé¢=h³(¬—"!ÄøŒÆ5t ýãÒ›än§ëæýå›þüЀVž{#>p¬?å°>ÅÓñ¦ö8ƒZS‘XˆÌÐâ·‰V3°hToAš× 0.ÿðöû2*n~½ø'Õò¯ÓyVÞ‡¡Þ ã·ù©ûAð±#”Sš£›2°­çÙö`  y lÎöžr¥c à*Ë®»ÇVÇlÃð: ™»1~/°–Õ;ìÌFŠ×ݲ±¯ -¬6@c§´ðx”×èÀ[ýzDÙ xLŠ4jœ-êŠZ‘ã2¿¯š¢½Èð4æͼšQ¤ÂÚí7*ß¼?A|Ñçü C&Ç€€ìvQÔÁnJ0·aòèÐ)Ò[ÖÐÇî¥)¶[%R3þ5_ßæ^ûUM-pÓ—Ób•-èõ‰e7bº(`2Žûë}NÍY¼ Û9—€×Å]0_?Áb×™WäYµÌŠò§‹'xÂLj[C Š–© oylQuʼ£H.A«ŽÇÜ.±ZÂÎÖ ãØÖxs¨À¡ÔNï˜C44ÎîG÷"ªX ‘7€jºýW>mˆ®©¨ñÕÕûaVP¶ÊJ´¸žŒC‚ûûnïèÅ‚šÁÊ“d»Y–›ES¬ZÒ ™ݸtß êV¤LXp*×€Ÿ.„ÚUnÿÒ€ë¤ÉÚ»’ -ö·D°äxážr‰½ahq‚„^`e”IÔ1>qoØnBp°Wðfåêá>"¡´c OvÿݨVŒ¼ÃØ+ãÀ+T[ëÐg5é³,‘JviŽ¾!JÑ.{&™„Kô ;”p–"RãÅ×lÚL‚G¯gj™¡o„¿u<äJ°§»|ð£‹ãðƒ]•èàHAS;ùîUs›ûxM;9»³~"†®™)º!>¾¨vâ ¼FrJYòúÚîÇ·€„‰¥Õî€]¶LwWE¸ÄàÒi‘‚‚£mxÞÖ"ˆw®E‹ú¡h1j -™@‹ŒN^8}Ì´é3§ÉDÚ‹6÷ÑÆ«X qÔ:ˆbܲͨðM†P´õª»³PYïÐÙ3$œc\KóCmÍB2ÌYc¾ƒe;b?‚„e©Nôið•µV‡üŒ] WW‹C§¢„D§»›²ÈcÙyÝÊ’×ÞëÆJßëÆ–ØëViÒ%³Àä‚Úm²íRœ*#{¨c{¨ekµlKÀ”üØØ?¦i* Ì†B8ðB‹`3;ÁCÙWâ¥>Çh£Ÿž-[äx–툽xTJ1‡î?ŽžH¿ïñ#†Œ(b»Ÿ"µÛýÄž‡…&m8lÃnaSØOlìöÛ{‚yÙµc[[¤¤¦†Ô{l„?p¡%G„clVªvíÑÄ(¹çäÐ!àUOžPÈ[ù‹û² -JÁÒ5sȹáÛ?œzÏ« ^ƒ©*([;雩áºL¤Å½ 8.Ò¡ßËñQ{Ÿýë¼íO!lTÎÉáÞÁ†"€‰2øDKg?q~<ØþŽ¯%‹„ÿþÍendstream +xÚÍZ[sÛº~÷¯Ðœ'¹c!¸ìS}'õ¹8©ãN§““Z¢-6©ˆTœÌôÇw R¤LYJÎtP%¥b}êÇ›EF³ìÎe‘×yYPË¢,?UFE¼x­Eg9>šÈ„yïÃ:pÃO'–óñý:-jªþ›ŠYV|£ŒTË¡±ÎëØ^¤Ë¬þ¶Ê¶_Tû@vUTýHœôo8qI`å"Îwk;¢ÁGà«¢z¹ÆÒ!gyÛVëüK¾Èî³ +@¢Œ¿-¦qjJÅ2«ªô>£©ó4Ϋ6Ó)tÜm‹oq\ZOçÙ¬77²r_šGÊå*[§QÙ@öÄC„`‰12”/—Ù,Oë,,à%,à=ÉA–ÕÓ"VŠ’Ê»ÍÖ\ÓŒÈKÇ®O…gô‘}M—y‘Í@ZÚñ9µnõG@e+%4>̳‚j$Tªü¾€{òС¦™HF»8^û"°a˜-fgÔ×"hà€‘¶ßµý¾!@ÍyAétZqg)m.ô=äõ|€ +Á±C)²‚ªØ#šk«TÛrhx¿?¶U«lšê³xD‹ÁT‹L°vmÇ6×¾*°¢Ñ8ÔeØ%l£Íý¼É©2£Þ»rMçÈtÏ‘†ye€|hºšTÙânàÀÁ”.¦%™w¦bëRï%æ˜DÃH#Á:e_HAz@~«ÔN@uå‚‘U²LW«¼¸§ÞT¬hêîkPÜD*Ç”¶¿yÓ²@J­Í[nªº³‡;›ÒêÞñÑø`;éBÓw@±œÒ -’Ç–”>òÅlÚê¢9h³(¬—)"!ÄøŒæÕt ýãÒ[än§ëæýå›þúЀVž#>p¬?e ŸâÉxSœA­.‰-Dfl [ŠƒV3°hTo@šU50.ÿöûR*n~½ø'Õ²¯ÓyZÜÇ©Á ã·Ù©‡Ið±Ã”SZ£]2’­æéö` £YXŸí=åJw1€_¨<,ÛîYÝ%§WqðÜÎ {µ´Ú!w`5R¼nÅƾ2’ÚÀ(˜;%Á»³‚Fdlôe£âe4)Ò¨qº¨Jj‰GBŽ‹ì¾¬óæ"ÃÓ˜ÕórFuâ +k·ß¨|óþýñuFŸóœ™ÒÛE^E»)ÁÜÆÅ;‡N‘ÞÒš>v/M±Ý*‘˜ñ¯Ùú6 Ú/+j›¾˜æ«tAŸ¨O,ÛÓE‹!s<\ïsjN«èù®óŽÙ„ûh¾~a×™—äY¹Ló⧋'¸c&±¡EËDFÈ7Œ<¶¨:aÁQ$— QÇcê0ÎYÝ lm îÚš`Á]dÚk×Gow §{Õ¤òš‘7€jºýW6­i\]Rã««÷ä, l•hq=˜§D÷¡ë»y¼£ j+O^mWYnu¾j†FÍäèÆ  ûfP·"a‚ûxP¹üt!)·iÀuR§Í]½ìàN>oÒEïÆ'PÌxØ {íàNì]ó{X‡àÀq9j=—a\eã‚“ÅŠT~I`Œ‡¼~¯™”­îÇKIÅ hÐÙŒcTÃ4`'êa@áŠA@x4©´ÙüŽyÉÝÑL {+$šþ* Þ;‚yÝŽ;Š +÷|Á>­oÍ^_ì ¶'ÚI¦¥Ûñ –Õ>’ÇÈ™øöHwOÂ+f½•ÇÒCÆž æsÇ3÷”K Cƒ‹$ìÐ+£ŒSÇøĽ}`»i^¬6NêB}8ÔG$"”öÌq·“ˆøïf5Œ`äÄ^hZ±ÚX‡>©I+@Ì2'•lÓ}-jQ +˜ H&á}Â9Î$Dz¼øšNëIté•Sp¨–):Gñ[Ïc²{ÚÛ?Ú@?(ÒUNGO +ššÅwïšÛ,$hÛÉÛõ31tÏLÑ F¹hà=’QÎÂÛ×t?¾$,,­ö ³eº½+º‘K]Úð àˆu÷áy{‹(RÜû.ê‡ÂÅ@¬)dr.x0Ú¼rú ih¢›(Ýà^4Ù&bÅJŒ¬ Ö¢@tQ Æ Ù”ŠÀÑdF[¡¼;‹•õ=BÂ{ƵÔ?B½ùQR†ykÌwlf쇰,ÑN‚wYkuÈÕØEÐà~u›CÙ§lœÙuÙ”¥PËÖïV–ünl ~7Vú~7¶týn•¸6FÔnÝn¼K‘ªìDÝ5ˆZ6QË&´”ü82‚[ðwGÄDŒL‡‚8ðCóh4[ÆC9Tº¢>ÇÎF?<[<6Éñ$›{ñ¨”k.Þ€ÿ˜ßãJ Y3ßn¨HìvC±ç!¢®‰ˆmÜ.lŠŠí†b{B´/»†lkŒ”Ô”Æz1‚®4wDD&Àh%j× MŒ’{N b^uðä •<:yÀoùÏï‹2&y(W¢kæ‘r÷›p:!úž—:¾³UP6>vÒ°†²?v_@hÎŒñæ(ÅhÔü®b¬Ñ[Åô}]ˆ‚yïÁÓD‚G/än +u›2«6n¬Æ²¬jjÙT„À}‹wßbQ>D cZcQ‘RÌmÉñj÷-a». 𚌟W–`ÞÀºâRÍóF3" £)ØíŠ;áU‡vwЀ™Š—½²!1URõ66mVÐN +fÔ¸ÝÇ É¸oIOç ÐPÇ€—0Ä(Uû/ ª“»êîwb™ç7’9­È‘þÓà–›„q£Á0 NDzyòK›,GUgë¼úD|ý·ŒÆݦU¶ß2wMÞóÌèÿÔÙTƒ8~ÈÙÁ|‚O&]MÛ{“n“èË|‘®©Ð>°¡†%ÊË pà¶ÉÇìë4[Õ´@SªÉÖ=ŽK—wCá¬ð¨ÿïµtd¦-rb6™ÓÙÆJO@¥³ÿÇq‰~µæöT †O||®"Í3„Å»žÞ”-Vðc+àì£b%aw°h¬`­,ßâ¢Ô„ž!ÔLÄÕ·ãO€µ6ZÌ”îü(¤€[À$7ßC3Ny"Ú2L«> éãNÊEõ‘rŽw,úeÍ›[pÒ|ÜAlž§_2ªÝfäúA\‘±÷KžRåæå;ª„_à |F-ñ«{|¿þ ®Tjû`‹wô@³¤/rêÁËñ—(iÝ»|Ge:›Ñµ^UÔ!{² c¯£éóW¯®Ùùõ»ÓD†Ÿ7  *bŒqùÎv»âiµJ§Í“ýÐ{pêóxÐv½ƒCh•B3gà–àtzcÍ1Ù<)ÃËØ›—s–Y<:Ç£”f<ºN[ö&\J0äºûó£VµpV!¤7BŠ¤ï«@†Ã÷¼±=oÁ'ãø/Ç”D¸Ã#¨Ö‰ þÁèó(xýÁíç½zw«†Ððâr)G¯JjÔ•«¡<é’rëd,s‰Ð#á% ã:0}Yã/ÉÂã#”Á3,×YÈÅ 9Ä®UYUùí©äc´ÎØ‚ŲZ•dÞ—ñ÷ Òy:mX©äöV§Â<Îkå™×Àzwož¹ß€,0M¶¿I{¥ƒâ PÔøC¶äXN —¦“Í1€És‘ ýtŽšsøìêmÅá£ò^ÿü{:Ì-2.Ùݶö'}Í°óÿ*HÞendstream endobj -1482 0 obj << +1502 0 obj << /Type /Page -/Contents 1483 0 R -/Resources 1481 0 R +/Contents 1503 0 R +/Resources 1501 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R +/Parent 1507 0 R >> endobj -1484 0 obj << -/D [1482 0 R /XYZ 56.6929 794.5015 null] +1504 0 obj << +/D [1502 0 R /XYZ 85.0394 794.5015 null] >> endobj -1485 0 obj << -/D [1482 0 R /XYZ 56.6929 512.9872 null] +1505 0 obj << +/D [1502 0 R /XYZ 85.0394 512.9872 null] >> endobj -1486 0 obj << -/D [1482 0 R /XYZ 56.6929 501.0321 null] +1506 0 obj << +/D [1502 0 R /XYZ 85.0394 501.0321 null] >> endobj -1481 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R /F48 940 0 R /F62 1050 0 R >> -/XObject << /Im2 1039 0 R >> +1501 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F48 950 0 R /F62 1060 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1489 0 obj << -/Length 2789 +1510 0 obj << +/Length 2779 /Filter /FlateDecode >> stream -xÚÍZYsÛ8~÷¯à#U!8ûæq쌧f•¬¬©­ã!‹5©ˆ”ϯßn4@Q‡íÉ$S»•*l4€Fãë Š8üAªWY$YÄ4:X¬/xpcï/„ã{¦ñë»ÙÅÛ•Ëb³å`­”ñ4Á¬ø%¼úþòãìz:KÍØÆ:æáw·“wDɨ¹ú0¹¹}ÿÓôr”DáìöÄÈÓë›ëéõäêz4*ÒPn‰Ÿ?L®‰éæöÇëÑo³.®g½ÈÃc ®PÞO¿üƃN÷Ãg*Kuðœ‰,“Áú"ÒŠéH)O©.î.þÕ/8µSÏ©)â‚ ©U0±f åóûÒöu]¡2&¹ÖGû¹é”Ë”%™V½ò#1P¾ˆK•ÒA¢3+©¬ö㮉ƭ©–¨ ·7@ÝÏH8ˤB!󲪚Çœ! »•¡ΦÞf;ih~å\~vL ¶i8w¼»M‘w®?¢6¯]gvõ‘:‹¦6‹®lj”v Á2­¥ai7iÖ£±ŠR’BE^ -$Õ¦{l¶¿¹Ùñ™Y‹fK2·›¦.ÊúžÆo?>DÄãsBnV 8SZ„³UÙÎâ(¤V…eÝ™º0QQØæ¤?d˜Ü %ÄöÝäòŸ×44¶¦kg‚ä »É Ún±Å³a‡D|0ÛÖ:¢vlRD,Ñq$‚³HÄ韱)#¥€®³–r&1‹#þ%èö3ŽÀÝ‹7Ž•bI=n€j-Ë@J_öã,a"µÕÑd€jƒÀhœi%#‡ê£q wexâ$pQ¡`­Œ›ki­:øÆ£,SÄ5èÛãîÕ` oo×2x×À¡‚á¹üÊãáÒö\àö&(u &-¢ ‡Á5O¬Ð·º8e§(+ÓlMW.cO4´iÚ¶œ$+C ¶÷fyØ°Š…K’’9b§œƒ1¶#¡ÃìD*ei$eàî&ù÷ È⩆û޻ѯC£Là†x+BdJeö <.¸ ¦ ~}‰8'áÉQðøk³¼ "ΘJÜcpüàÐÓaÐ9 >ŠÇ Οä8g¸èÀ’Nc4èŠ ¼! ¸šÜà‹:‹ñfïu¬™éá:1`C <ê|mÎD3ˆ‰Žc‡©œK[ïÚŽzíÆ,Êå“€šå€>þ´Ë«ÒÎr“Šf—NTÜÑ"6gšA“€ö„eJ:ZaÝPÛ=m ú].Ãœœ%ÑÍçMU.Ê ¿­8´)ž_ÀL -0¶¥á®r×y·X7BŠ;ÜÆ|^˜MGäéôîöýêOî\çîÃeOº¾r ÕÍF’bçìx6Êxè¶I3%b$ NàžhU*Î!„-ªEùlìròl|hþþ¤0B'j·¡?)ÝQ³.ö$õæ\Œ{\•‹0©‡«@JŒkD³'R>µ(@(A™Çá¤éÜX·Ê;â~\·-•†y×™µ ˆö¸Î ?µ!Ja*ã—£ã‘0I¶EëFÛ¶Y”(‹Û²ìVnäÜM9……n‹¡Ö὇"ÝÊ,~÷X_Úä:&·*ÂÞç²íèÎúÀ èv;aÎÁDLE± Ÿ“S HJY!SPsÂϹ,º¬Ì~ê>òrt-,ND?• 7yˆDX¡Yº¤Ý´Ín»0þ d,üyk'é¿é²ÉÍO>—™­ÌúŒ/9 dKkÖ*•¼›‘mN‰àNã°"­Þ´i䘻T°yDí*}3ÂøôæŠÈP)Dn‘´‹m97-PZ©mK`G*ž‰9}ÒÁqå…ãž.9Ю¦S²›ú8tJàépo!°•P H+ÝØ®5ØD”%áµ!*I 6»9x·Ü&ÜvÄJ -:þÈ“°¼¼"zmi ÈX‰²ÊÜòsã* SwÞÙœ9HßåzS™50{|{?ÞÆ»Éëà±p`yÕ6~2º/<¹ìN ]•Ÿ¯=bÏCóU°]¢×Iûøƒ}ñ — uÐÒXîXšÂàݤ*¼¦‹sDê­òCv( hA{GÜ» Hµ¬Á5¬sw)½ÅA ”«Ê°Eÿ÷4ÆØ9<£jI¸Í¡c7ĹÍ#>ܜ؆¿É#Új6ù×Ú¤ývzƒž…0¬¹hÖÍúüþ­™¶ Ä/!–ý ÉÙÊœš³2Œ -ÊLRaæÀ º6²TÁ½®)*`[7ŽÐ–÷µ½LHŽdAl™Œ)ŽØIÏ}}Üšíƒåv-¯C -zª-ÖlöÚ¢^ÃÕ€ÖxùÁ,¶çΉê´ù9é«u$8 Ò÷àé0Š&Qh“˜$l›­ ƒ™ë]Õ•›ÊM·º’N'HؘíºìÈbá“" -·éÊuù‡CåÜmñ -[·YÏi>çh÷gc¿÷ûùŸ‹æûLp›ö™|;w̤NêÏûB¸ô/qÛvŒnãΘãúFEÇ" —à¢3fÜÞ» -o:Ì°=ÿx8á4Å>]Ï{çÞ=Ü;²@‰xRs Y<”¯Ã-Nš<×+’@ÁÏÀM‹CI\Ð9,õ4ŒsýgUÑó¿&ÀɺϪ":– ªa¦°ÄxQ=×+’œ®†’¸ -Š\&3ÈpJˆ™MÖCÕàå|˜ïx7Ù–A^æÂØ?ŽØ¿íI(õt’Æÿ«Rsàe¾ ~v3ž}°”:a±TÏÜHÿ`)cÁ$9…æ±öMn -‰dÇ õÑWîÓ„>£˜ºGç²õ)õ®.N_9 "NbH“‡Ò~öR±ìÅçç“%ýŒç•Š1hÓ¯(5ʘÔQF¾’ôÑ8Žb^¢ú²84õ¢¡ÆL‡"ÏËŽòjg¨ë¼10ìkÊÖy»4òX«Ñ¥Ð#kªÈó³c³9,i^¸© -¾N­û›Šð¨üKž¸üŒgoJ€¼i&_…¿ÔP§Eô¢9›ý¥3î@Ÿ€>˵C´á¸*Ñ*;ñÊN4€ŽWiÿàdOÌéSIwã@Â÷ì{kvÈW?_»º´.PQŽŠm ×U6ðG¾¼réØ6ÛroKû¸Ÿ»Ö8†¹£$AD²åι„aepR ÅdÓ†º”BÄuúÂÇ^T!v%~®èyž‡Uc¡Ø樴ˆ_·¦ÎülŽi·-|¾±l†N§ô¯Y«fW‡9IQ¶‹Üå§/ z—¯ƒàßê ³aY*_ó?"I˜–î½aQA¸˜;” P:p@ÙÞ¥½ÊŽŠ,Ëi€ï¦kME”e¾FÀA±ð¥‚+"Û.¯½ï9ŠéÃe_¸².¾•#ú;®L¥ŒãÎ+W¦‹…"G4}G?ÅâŸK|`ˆ#W-¦ò\qÔ"ïr0FH÷öœT.Rße©p¯nõl-EìáK‰y&x¬ ºFÜ-Äèa¥¯*l÷Âí Ôò­nïÿ惎vø3õ ¿üÑ,‹Ò—2È qŽåaj¼lðgÏþQÒ¿×Ø• ASå~  Çã3?(pB;.o“àÊÂçtíóY4¸œ(K³¿®ý}U!Y„åTr<Öé¹ÊƒÞ©|õÿ-Øÿÿ -pè*Må3u¥¿/(ª`-òfIvR7¬u*÷láÿ êê]endstream +xÚÍZKsã6¾ûWðHU0x ±7ÇcOœÊzfe¥¶6-Â+©ˆ”=ίßn4@Q–lgâ¤vkª†`£6º¿~A‡"J5ÓFš(3 K¹H£Åê„Gw0÷ñDxži`šŽ¹¾™Ÿ¼¿PYd˜ÑRGóÛÑ^9ãy.¢yùS¬™bØÇ?~º:ŸLeÊã‹Ëïa$T’ÊøìÛÓÏóóMhÏúÍåÕ¢zœ}ºº¸üøÃìt’%ñüòÓ‘gçç³ó«³óÉ/óïNÎçƒÈãc ®PÞßN~ú…G%œî»ΔÉÓè^8ÆÈhu’¤Š¥‰RRŸ\ŸükØp4ë–SSÂ2UÑTè”e\Ëç¿Kßàð]?Ê0ÉÓôÉw§‚&à¿hªeÎ2“ªAù‰)_ˆ”%ye©aZIEÊïÛdÚÙúõóþ¨»gF*”9Oëº}˜ÀLÜ/- p5Ö›‰Ècû3çò‹gjñ™Ç7žw».‹ÞoéY4~0?ûLƒEÛØE_µ Ê_ž +ÁLšJ'­ûH»šLU’“* R ©±ýC»ù•È톈ϬZ´’¹[·MY5w4ùù>!†¢œ¢ô«:@¢JE<_V`M'1=U\5½mJ[õ€Ï‚ô‡ W×DB ñùáêôŸç45›u¶ïöW‚÷ä ·)Jú€Ü1âφñÞn:Oè‰bÙS7¹f‰à2ʇÎÿˆ#H™’\GäÌÀ¹þ5à+žb;ˆ7ÕJ±,ÓzÀ6@u0 €ÛHŒ(&Ò&c°*u:º¡:Õ 0rr–*™xTšL5Øþ—ñAŒF€?E<›§Ò¹tô[$OŒQÄ3»Ãî”àï/W2úБ¢ñ©hßéxcw&ˆ;÷“àÍI’FBOyæä½ì1þ)‡µ1²´íÆöÕàõHSë¶ëª›‰äqm‰‚øÀ' ½½=†iØÅ!%ËÉqÐÄÁ»‰HãØ$ˆ“æ‘7KövS#¨xžêhº  o¢ÌÀ<ÜÀŽ“rˆõoµ!˜œ}¸&ãÙ“´ñçV ÈÔ†© p=@,ÏÇéæ í€9AMš¦šs†›Žœè0;ƒ®˜@ 9À5A_4X€Œw»€ã<,ï£s–+òFS¬ì‘ä"Á±¹ð<˜6lí£ÙjÛõ4êÖvQÝ>zèq» OÛuåVùEe»**/*~Ñ!6šš”Aƒð!2f”ô>t |\ÄMKÏþqm1är'‰n¿¬ëjQõèXøîÄ¡âù¬¤Øs›Iok¿pUô‹¥õ3¤¸ýÏØ/ »î‰<›]_~|Gã«k?¸þt:ÎÏüFMI«‘¤Ø1?žO ýgrr ä@ÂŒ„Ñ üÄ#M ÊàƒŠsÈ^‹zKùg~;½ú><bhýî¤0C'j¿a8)ýQ³)w$õîXz{XV‹%0©‡†U %¦4¢¹©PU” ”À|Ìu|Õö~®_=q?,­ß‚¶Êã¢ïíÊ DgD ®Š2,m‰RÚÚ†íèx@$Œ@ý€Ï²ó³]×.*”Ųê—~春¼ÂŸdm‡¡Îã}€":ÝÒ.~ X¿uu láT„£/Uד͆ôô_›0ï‡?¦í2'Dz”A푇j +o@øJ1_WµÝ-Ý%]Xª8Ó™–2á‘;´·¾·]»Ý,lxËpÞÆKúo2Ö¨®ù!”1ó¥]‰% $“ˆ„¼Ày¥Jïv"bWN"¸sפÕ;‹>7¾ +lP»*Ý+a~vqFdè¿Ii»Å¦º±ÍPE™ºÚ•ÀŽT<1 z¥ƒãÎ Ï=9Яf3²_ú8 JéðÛBz`+¡<Vù¹mgKð‰Ädñ58µ%*I ÖÛˆn…«µÝŒ“žtd„#K,ÀóŠšè} - X%ʲ¸÷ÛßØ PUÚ¦ÁæÈA{W«umWÀðâøà®®Ù€€…=ÿ(ê® ‹1|áÉ`÷p劣ÆS ˆ=ÍWÁvŠQ'òŽ]ƃQ6ÖAGs…giK‹¶ÉU|N†óD-‹}vè hCg#BФ€Z5VEÀ»”!Šâ¤KÊ7døÄø÷8Æر<§FIøÃÀ}<Ç>žðñljmñ"¢›¡ÇºØ@áºEŸtï^o0r†=í +ªÙ°Aø~ga¥ë%ñ @ˆw ÉùÒš÷2Ì +:LR¡ñà…™Þö‹TñW…¡¿Ãb*gïm^¶Xª˜ŠÂÐìý´ŠÿⵂN|˜Ëc-!PË¢/À3žî8©I¤±kÅráï$ü¹æ ž”Jp„÷#áNä™Ì±²}bw£ë”¡—pÍÛ Æiå¯2ÞÿÍïmÿgéç~'pzå,5Iþòjf-÷«âÛç®"Ã-»GQf´IŽçÊÿ@WÆG~&P3„ö\Á%! Te¨çºç hˆ8‰ÉÍŸ×þî$@KɸNócMBLyóßìþž¹Êsy܃½ø«RÌr~ð§`L©ôŽm$ü>s †endstream endobj -1488 0 obj << +1509 0 obj << /Type /Page -/Contents 1489 0 R -/Resources 1487 0 R +/Contents 1510 0 R +/Resources 1508 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R -/Annots [ 1493 0 R 1494 0 R ] +/Parent 1507 0 R +/Annots [ 1514 0 R 1515 0 R ] >> endobj -1493 0 obj << +1514 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [341.1654 298.8688 414.8187 310.9284] +/Rect [312.8189 298.8688 386.4723 310.9284] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1494 0 obj << +1515 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [434.6742 298.8688 508.3275 310.9284] +/Rect [406.3277 298.8688 479.981 310.9284] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1490 0 obj << -/D [1488 0 R /XYZ 85.0394 794.5015 null] ->> endobj -478 0 obj << -/D [1488 0 R /XYZ 85.0394 509.1791 null] ->> endobj -1491 0 obj << -/D [1488 0 R /XYZ 85.0394 477.0735 null] +1511 0 obj << +/D [1509 0 R /XYZ 56.6929 794.5015 null] >> endobj 482 0 obj << -/D [1488 0 R /XYZ 85.0394 477.0735 null] +/D [1509 0 R /XYZ 56.6929 509.1791 null] >> endobj -954 0 obj << -/D [1488 0 R /XYZ 85.0394 447.2177 null] +1512 0 obj << +/D [1509 0 R /XYZ 56.6929 477.0735 null] >> endobj 486 0 obj << -/D [1488 0 R /XYZ 85.0394 390.5598 null] +/D [1509 0 R /XYZ 56.6929 477.0735 null] >> endobj -1492 0 obj << -/D [1488 0 R /XYZ 85.0394 368.2486 null] +964 0 obj << +/D [1509 0 R /XYZ 56.6929 447.2177 null] >> endobj -1495 0 obj << -/D [1488 0 R /XYZ 85.0394 281.9323 null] +490 0 obj << +/D [1509 0 R /XYZ 56.6929 390.5598 null] >> endobj -1496 0 obj << -/D [1488 0 R /XYZ 85.0394 269.9771 null] +1513 0 obj << +/D [1509 0 R /XYZ 56.6929 368.2486 null] >> endobj -1497 0 obj << -/D [1488 0 R /XYZ 85.0394 89.8526 null] +1516 0 obj << +/D [1509 0 R /XYZ 56.6929 281.9323 null] >> endobj -1498 0 obj << -/D [1488 0 R /XYZ 85.0394 77.8974 null] +1517 0 obj << +/D [1509 0 R /XYZ 56.6929 269.9771 null] >> endobj -1487 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F62 1050 0 R /F53 1017 0 R /F21 702 0 R /F39 885 0 R >> -/XObject << /Im2 1039 0 R >> +1518 0 obj << +/D [1509 0 R /XYZ 56.6929 89.8526 null] +>> endobj +1519 0 obj << +/D [1509 0 R /XYZ 56.6929 77.8974 null] +>> endobj +1508 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F62 1060 0 R /F53 1027 0 R /F21 710 0 R /F39 895 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1502 0 obj << +1522 0 obj << /Length 2893 /Filter /FlateDecode >> stream -xÚí[]oÛ:}ϯð£4\~‹Â>¥iÒúÞÖÉÚ)°»÷ÞÙV¡Žåµä¤Ù_¿3Ê–]ÛJÈö@9Q4uf8s8TE‡Ã_Ñ1–ÙD&8ÑÌpa:£û#Þ¹…{ŸDèsRw:iöúx}ô· w–Xi;×7±ãΉÎõøÈ2ÅŽaýû²w~|" .º_AJ}9½º>ïÓ º~ìö>‘&¡æì²wÑýü½zëèº{Ù#uÿüâ¼Þ;;?þëú·£óëå”›¯%¸Âùþçè¿xg o÷Ûg*q¦óœ‰$‘û#m3Z©Z39ýc9`ã®tLš &¤Q¥™ƒßÎÏ*íXÌã?Ë;'R±Dp½{,zŽÃXA¤'ÔÆP'‚'LÀ?`FeX,E²4£T 3 -a˜vq'6‚I F3žŸØX[l•TÑ]QV$¥ãñüX¸(+K4žL¢î”îTw ݵ£IZ–@Önæ%i©ÕQJ—Jž ó0v÷jËo€¥;±f‰1ÞI€Sü”•£y>ÌÆäù4øÈÅ ‰a›Ž¢MÌ´Hàm˜¼g´¨ÿ¯g'^0dý>»M?[ëZL'c¦ŒÒd:øs|¢µèƒ%0Öͦo‡Ï9»¾Æ¼^÷®+øÀ"Îó‚!ë'vÂg]Ì.T |ÐÂo[bV‚ëïOD×ÞñÞ( À 3lú5^ÎÒy•§“_ NrÃCÇrqƒ·þä\þµOLÇa¸éîOÇ9;ªò—!ت­_Ž LÓû =ÞeÔ/ŪG˜[EWÅÍÆk³GÎïâÄøÊíqJ3êÙ|€’@ÁƒíM±˜ŽKžDç?gÙ<¿Ï¦U: ª¦oBï<½%Åã]>º#†¸"i4É¡[x" ¼å°$ÆáÁ¼ºÛm†jÉjÐÔÏä‰:†mÐNÛ5A9”í4 (yü‚!ë'vÛNk¦íàvÛÎ@¾s‰ ,ð)¬!>ßÏf“tä×OG¿„@÷©‡ ä°~@*gÙˆ–ܘÞ.^‚%W!MÛxXÝN³!©‚¹G“¢øªDE‹ÙϢ̳ËdˆÙä‰zúõê½É_Mét²%?}¹VtQÏ b†[¸ßò]¹ªgÎzÌRÎÓðjƒLº¦¡ÌgRw$R[øvL÷Ó’îÑ/ÔQ -#d9kÓ!XˆñЋ -d1ï½}FB›wKHG{¼»á6¯sÅ7MFrf¤k‰LFYÆc"Soðûù¿ÀÜ*áÑ *ÍAúx‹A3[ 'ùˆäÙSHΈƒ7‚g¯ž*óÛi 7ü -)ÿ[LWñæd·«·„"®öl š(6ÔXÀv˜®…*!™°<„¢nY¥Y3”H‰‰îÒòŽ$\ئԣ¶!ª¼ ý½µ¬¡ƒ —O™¥ QFn±…„5»¾ÆxMT»›8(ÏÕNƒUz¿ñ´s=@Ÿ¯.Áxð˜ˤPn®ÛI1¬‰î¬(sÜöT‹Yéf¤¡FvVâ×˳=x6&úŽ©­¶œÅ°ÓjÁ3¶L&ÚyD¿t{—©pr“ÛŠ8` -ÂÙÕw¨Ò‹ -"`(y$áNJ—XÅ´‘¬(àŽwfèø -’Û|ÓwLr5$ §eÜbØ•Â^€\¼{58?óÉDÆJGW>B@j˵PtŸUwE*úB¤ˆh¯‘Êl«–ê{ˆTs_kÃ+´EˆK¯(k.÷«Â{N%$%Û¢‘tLÇšpé>õŽO 71’ÚL°bA¥&#©>h°ZO]åZ0Ãm @<7ª^÷ŠÜ¾¿ØÔ|ÓCä ÊÑ*Ž·¶…ˆi®™±ŠÂ™_8Ñ: SÊ/lê Ž²Ïàþ^#ƒã5eðÆSžy¡vzÆšè{YwÏ÷a=ÞæSŸŽhXݧ šžß -Iã#(u£@ƒ7æxD$•‹†‹jÛ®¢¬òIÈ}!2ƒX%Hƒîg,Gs,6·2rYõ1kevP%jÏ.¶i·ÃV”ºÞ•QLÛB•uÌ&Ž¨ãïÿê(”ØL•°þ}™ÍÕÌ ûs{¶[¿3¡:B]5pΛxY>Pëå è²Ï³V›.©øc4ÞòSA¥“\´_;ÈØÑR ˆKtá±…€¹LR&À¤Í§7…?)QkðBïëÒ(A!\lC×õ€¼ÝÆ´ßñÁžâ†A¤j‰¤JIæ”$x¿«›Düâê˜À°Q@$ò Iµ¯Ó¹z}Ä,K  ±HªzaéHåBoöä½p&7õU'¢‡t²"F¶Iñ藜㾪‡êaVã Çkp}SL°×8Ü}¢–& Ñá=ªBU$Hâ[bírÇ©Fâ™»¸$Ö^tß4ä¡Bë¬fÈÀhy ï•°KMlL¡µwzuÝÇâ®âQ€ÇŒ³–;Ï«§z;—OÁ–ø™Ë N-ùKD»QmN÷ '2-iAÕÆ…$í N¯ÔØùoS|­:«‹ùpšžÍòQõh´:™C 7 HwÒ͘ïùú!Ìû †ºYƒTÌŒ0-UmØ•1àû]¤ÖE×>¨xé¯)ÖI¢Ht¬L2IåBQuíÛg³æÖê™<`äh¾Ý;>Z ÙD·ù¸†þH YáüÌ…\ÍɵGÌ·KÚL—þshag¼ Dâ‹üþqŽ§¡¡ß]Z‘Ôï‡Gæ¤}™S4±–uúÐÿp2¨I©ÁÓ×”trÙKD>´=àVAûœF)*²ŸyYmŽ·%+aZ,ÑuïWôn õûÔVO3¿MB»úäÅF-)¼×ÒÐÔúIl;O öÂñ½EͦkêøvÉÖÙ—,Šú‰,¤eœ»–óe LIHäµ+0©ú¿ ¿;ÖréÂàJKSIü¢"ÎKRÜP­îË©I–$ïʃE¼&´av0»rÛ @w²éâ©oJK¨Ã€¼kÄÀȋ嫃vTÜÏTŠJ'ÞGb¤ê³lZbrÚ‚»Œ2,¼ŸH^¥*–¹ e2Š¬?‰ƒnõa:)Ó0 "À¨Ccå+ï'ÛÞv OíÉdÍöºEû¦åÁ%ãIË—RBÄÌÂo¬ÂÀÕq"£Óþé7 ÖÖáÀ†p`×à áÛ ë>^òVaƒŒ jiF鳈a xºÿ\èÖzý9Qíbþâv>ép.q.¡òô̈ßb鄯³ŠæœÅÒ:üŒY»õuÞi¥ìÏý~õ_ )çvPJ;pxŽ…¨;þËÇú‚3©¬¬{5¦þ?ʽ+fendstream +xÚí[ÏSÛJ¾óWø(ªâÙù­Qí‰Hü^bX U»ûÞ;ȶUŒåµdû×o÷ôH–lAaª8l8¨Õš¾îéþ¦G=¢ç ã*ѽ8ÑÌpazã»Þ»gŸDhÓ¯õÛ­>^üíTŽ„%VÚÞÕuk,Ǹs¢w5ù#:þrt~urqØ—†G–öåÑÇÁðiºŸ OŸ¿_Æ:ºœ I}qrzrq2<>9ì ¥„TâßgÃjt:øzrø×Õo'W͔ۯ%¸Âùþçà¿xoo÷Ûg*q¦÷7œ‰$‘½»m3Z©Z3=¸<øG3`ë©ïúLš &¤Q½¾ÒÌYã?«´c1·ü,ïõ¥b‰àzûXÔÃXA¤jc(@0fÚÄhFeX,EÒ˜Qª–…VÌ)ez±LZ01Úñè°ocmñª¤Šn‹²")L‡ÂEYY¢id fô¤ºÍH é:ž¦eùd-àa^’–®:JéVÉþ(cΟø 0u/Ö,1_J  ý?eåx‘² ùE> NtzL`bئ§hp•ØZÙkƒò: Ñ¤ +@=;ñ‚!ë÷Ùn;øQ˜¯ë²Œ™2J“íàßa_k!Ñ{Kh¬ÛM ÞŸsv~­‰½îeWøIœ5æCÖ=¶âg]Ì.T~ÂàcdV‚óoGODWÞ¡ñÙ8 È2¼ +ôl¼§‹*O§¿ @þ䆇†åòýɹü jzÌ&a¸Ùö5Ï&9;®ò"DͪW¿ A˜¥wAz¸Í¨9ÞŠU‹0·ŠîŠëÖf +œ=>ʼnñ•ãã”æÔ²ý6%‚ ®×År6A,yüœg‹ü.›Ué4¨ÚÎ ­óЛœé­ÎÙ¶úë¾8½;4ÉCôè­Ñe7ak¿à¾‚ÉÄt“H&MÒÓyÌÓ?}9ÀIóÄE€~)Z–ˆÍu± Uîmtý˜ÏnHñp›oI„!ÎIOshz„Á€‡ãÅ$tÌ«Ûív¨jƒ¶~&[Ô1l‡¶¯Ê¾Œ§AÉã Y÷Øn<­™V´“Ûa<IÏ%‚2Á§°Š xýE6Ÿ¦c¿‚’8ª ÆøEò¤¸K=f ‡R9ÏÆ´è&¤ð†ñ,º +ÉÚFàv[í†Ô +&M‹â¨-çèe K}¹UtŸQÏâ‡O0Àæ]¹ªgÎÌR.ÒðjÃLš¦¡ÌgZ7$j[øë„ž§%=£_¨ã(ÆHuÖ¦C°/â¡!VÈbÞ}/ ]î-!#ípï–ß¼Îß4GÉ™‘®+6eyˆMÃËßOþöV .«"pdá‰7\æËÑ4“ü#{ ºsðApíU¯2¿™Õxïò¿ÅlqúÛ}½#qµcwІa¿™d¯ÖÆìp]|ÉÉ„å!]âÖUš5K‰$¬‘˜è6-oIÂu×”ZÔFD•7¢¶–8t0bÓË4FDø„Á((¬ö5ÖkòßMÅ^Ù®vh¬ÒÖÓÎAbô}>?ëA?]6y¡Üˆ]7ÓbTÓÝyQæ¸ý °^.縇Xq¨¡…µøõìx ­™¾c‚«-g1l¸º-“‰vÒ/ƒáé`*œÜd¸" ‚p|þª¹À²AK ‚XJJx’Ò-D1u$ë¥ +xâݾ‚ê¶_õS] yÂiwY¶§°% 'œ_žû„"c¥£s¤Š{ ¶åZ4ºËªÛ"Ä•@€!Ø@P ä×ÀHe¶ +Wú‚Õ—ÝðBÓ+*ÉšË]ÖjÁðžÓ ä‰DÉ΀$Ó±&`—Ÿ†‡}ÃMŒÔ6$¬]PÕÉHª¬ÝSS¹V,Ìp;(ÐϺ‡×½"Áï®;µ_u_yƒÚ´ŠcÆ­í¢cškf¬¢ˆæ—`´ÎÅ ™?OKÆQöiÜ?k¥q¼§4Þêåù +aÇg¬‰¾—uó|GVäM>ó)‰Æõýwº¡éùÑ„4>ˆR3Š4x«ë(Ç#©\4ZVOm.Ê*Ÿ†ü‚3H[‚t9øŒµiŽ•çNºQ6õ³VsU¢vìfÛ†Ûoyy¯+^Å„±]RYÇlâˆ@þþO B‰Ít ÀWÜ\MðÁ²?Ç°w»ñ9Ê(ÔåX½‰›:‚Z/ A“]®µÚ|IÅwX£õšï˜*-˜ä¢+þ*ØJÆŽ;Ð6XŠÀ^¢S.ÄÌ&J™c¼$m>».üÁ‰ZÚxo—.` +ábš®Çä­ð¶æýŽú7 ðë +¦JI$áû œÝ$âgÇ$†l"Ÿ’T{;Ý‘³×‡ÞØ¡)z€2„#©êa„¥Cn”C½Þ‘ûÂÝÌ×KœˆîÓé2ˆܦŃ_tŽûªGY´'·Áýu1ÅV“ðô‘®4YèFÇù¨ +õ ‘?n›G@¤‰gîæ’XxÑÉ|Û’ûŠ®o°ž!E­å]ìWÂv5±1E×áÑùÕz†„fÍ©Õ3‰ÀîÀÑ~½w|È y|Kwz¹N˜Ð@kÈ 'Ǿ6äjZ®=dþÚ0gºõŸÀ¶ÇKJ$¾Üï;Lr< ínÓŠ¤‹‹Ð5ì @ÚõÑIñ0CkY§ ù'ƒš”.x›’N6­Dä#Û=î´Ï™a”¢"!û™—ÕæxOd%,&â‘‹%ÆŽBëÝàîÞ ¤‹ ºVs¿SB"»úÆF­]-)¼ÛÒÐtõ“ê?u²@Dì…çd;‹›mßØ×Aì”­³/Yu­.,¤eœ»®Ãf LIÈäµ +°©ú¿¿;Ö²ñað¥ÆT¿¯熋’×T±»£»!¤L +M’‡×åÁ(^®a‚÷0Áò©I,€ñd³å]¶Hñ蔾gV¼à½#V^4oÚqq7_RI*z7‰‘®Ï³Y‰ê èýÀ`—Qá]EòúÛUÑ$0”É.²þLšÕgë¤LÃ0£­Õ¯¼«<õ¶M,€dµ#µÙëî›V—Œ']O 3 ?² +燉ŒŽ.Ž¾Á°¶ 6„»l xÍ°þã%o6( ª;‚LŸIl ÁÛýD·°ÞëŒjó7÷°ýIGÓp‹s ¨g†ýS¯0|Y4ç,–Öá·…ÌÚ'?\ç½NêþÜÏäWÿU²rn ³TÀLbܧáXˆº›hàWXÆɦUkêÿÈ:0çendstream endobj -1501 0 obj << +1521 0 obj << /Type /Page -/Contents 1502 0 R -/Resources 1500 0 R +/Contents 1522 0 R +/Resources 1520 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R +/Parent 1507 0 R >> endobj -1503 0 obj << -/D [1501 0 R /XYZ 56.6929 794.5015 null] +1523 0 obj << +/D [1521 0 R /XYZ 85.0394 794.5015 null] >> endobj -1500 0 obj << -/Font << /F37 791 0 R /F23 726 0 R >> +1520 0 obj << +/Font << /F37 799 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1506 0 obj << +1526 0 obj << /Length 3252 /Filter /FlateDecode >> stream -xÚÍÙrÛFò]_Á·€U"‚9€lžYŠ•8²–b6®Mò#kà dùë·{z†iÊZ®R±Šèé9Ñw÷€õ"ø±žŽÃH¤²§RÆ‹{“ÙIÔ»‡¾ŸN˜3ðƒÝQ?ŽN¾¿ª—†i“Þ讳–#­Yo”ÿœ¿=»] ûGAöq?^]¿!LJó÷×—W?ý6<ë+Œ®Þ_zxqy1¼¸>¿è˜1‡„[âßï¯/hÐåÕ»‹þ_£ŸO.F«#w_‹EÏûß“?þŠz9¼ÝÏ'Q(R÷¡…,Myov"cÆR™žÜžüsµ`§×NÝE&±ñXÁ’«$Þ¿-mÁ¶ŒÓP©Xoí -o­B+$}¤CÎ×”ç¢Cy&E¨…ˆ{ -ÖIô!é¯?Œ€V’‰à·ÆäýÔiPVøÔÁ›ëÛÛ‹sµ5=3Y.úLfúäGçå$kWd-AÃaCÀcÙeò §d˜Æ1žœ!ÀíAêÇÊ,`gA•Íp5Îé$€Éè11‹6#_b0ª5‹‡lJø¼v«Ô-æSÙ´Ûëá9¢Í|®+XPÄ œ3'`ýnØz´ï†ÐpHÏöinUU?§Fc*7á®^ø¥éi5Ø<)CY̦݃Ҿ ²”Üñ‘ø<A½(ïË -߱ĩ¨A{ϧÙÄO?ÑóÚ²Ó-³ƒ´Ì¸l`[Á¢ài&‹rl—%²{£Æ]žr‡Ûj%A¯T’ð^G¿NÀ…Ô¡cÑp¦Uõ‹%ýŒ½:“h -&Õ¥IÒ4Ôq"-nFC40" ΀PRóÚÊ 5PUð™9Ï-AõVòzf…aj„š9ðí0ûìR’—Ã,‚w?À¢îËA·y$_”GIÊHŠcÀ"‡Ës§àiÂý6í¨þ°D`Nç­_–9/«@" e*ñ&æàmA·‘.ÃË\U`gY[ÖHÅÿœ›ESW 5­ç€(ÇSCHkQ¹¤Gˆ!=BÓ¥Tpñ –Àyƒýì)g`Ÿ³é3cú³ÖTxͼb<Œµ8jì¸Æ …ŒÝpx{õ¸!°wÁy]¡¶Ž­Ý6yД÷UÖ.½DTžµ—EQÜ¥/vQÁ-}÷rHFB yçm^Šè`-uÿ§ågì%z¬’P1Í=’!gΨûB#Ô "X/[3h 2dË{ˆ¦¸ˆƒ1F'6X.À@ ¨›¶!b1„0&§‰ì¨ìÁøA¦tS!ÛÏŠ¼$ÆN0”Õå† ù`Œ&£ sZ/>º®MC9Ð^3ת§•^ù·èoy¶ƒúØ%ú×1òÛʆŒ ¬àÇ2Nà 2M,Y¬:Æ:M;ê¨x´ -×ÞÒEDy]D˜âI„¬ -"âU<¹ß™ùS°x+Æ„ÂƘØãÌ¢lP¨•8…¶`ÁxÙÒ€¦-§S³Äí’k`7¬úgGü±£»Yǧ‘GT*Ø©é°ã¥¤æÄC1K ÐáÇâ¡XðPjI„¼}†‰Ø«t¯ü3Š¸ ˆ[»Ð¦µaªõÄwôÌh%G˶©iŸúŒ±ÀºÝ #cJçÎùÃ!j÷]_±g•©€øæ˜!%Šx,Ë‘›KÔcÑÕcé í³‚ð­©r›|SOËÉÁ— Hœ…fÙ£aÕlâp_>§2"§)ë(ê1|½Ÿuš¼fÎ%);ì˜ E -“DPLt;ìÇqð/L¹ÅŠòƒqmM\¢ƒGc-@+ô¯\ùHl4fñPNlZhã:Ƶٯ6¿ÿrël!râhª¡4?À© ^q(e !;f÷$$N*Îîݾ½¼ÁÐbÍíT0¶ÖM'ÁcöDmÌݱYæžùr<-›‚º3­G¹Y…å6v}4Oß5„EK[HCîÍb¾(«ö¹:Çãæ²K¢—â¤?ìó—ô3ösRˆÇªá$dUZr²—#[ªL €õS˜O-ÄÅ¥µ}æÏ­]ö:Ýó}Ý;[Û¥BV}„Œ\†Z«ÄÛ #fÎv+æ±·[>å¤@0q& ‘΄!¸2a8›°ÓýBÞ,q9Š¹àìö×ÑMŸñ48¥¶ËVpD×Ü,çózÑzæ¾-›b f{YØ¡Í+v?Î QÙ±¢½Œ¢0UŠˆùÇ9Ä*šN©Ù{ -¨ÈÏ!Ehís ±—©(ÝÊËöF _W&é¾íK1e}Ûrìúç¨Hm]ßü³üA¸N¡€i膑ڼöùâúGD`Ðxª0™T@T½‡ïþnJ@BñØ@¦ïêé´~ÄÜèüý¥H;3 §Ô¶Ã)“i†,¦q;ð4äBãlP¿²¥MMnmbvZX§¥+Ï ðƒÔ¬Zë0õMË-!iý @FømY©„@k•J¾-G£oâñãa©cz.˜­#’®]]÷ Þ­8…×  Ê4¬³ÏKy®oPøà -´EË—D$ÃXèÔÝãmX¯ó"« Âé:C… ûÝ^CM±nëI=%ÌÄU¨Zkµ0@o©ã׫!¬„‚$€Y™Xª¢CåýaÖ ™ @¾8 ¨ÒÖâ(V‹Úóåb^7_GTA4-¸c!¼ ÿ®ÙU!/Ëi;X9JpÅfáÕ®[]&ñs·&¼OÉ.€´uh¯€­`QÈ.ÀZ L±Ö¸Ãˆ(*ÁÜØý2Ùaö+®ÅqÉBænäÈ$HG˜(—¾…X*a @o Ð)GÚji/y!áÚb€ZåzÔÈ̓™Ösª•hº¤UV&mæ ËWþƒE×½Rx2[ae/æ:¸Â´/º1ä^$co%Óë›j{#ÞÍ]¡ßç®Ð÷-ÊzéVjžšEÚÖÌœCÀã8kVöeȧYøÞ{WÍž{„Í «`×Ôô!Ü/_픀½–¨B` å3£ -Î õÅBñÁ¨‚¥ e9YGŒûAw õáÆuÞµ¦r¨Ù|ZNÊÖVsu°ÈÜ-7·1¼„Re/'°á‘Èàûš@l¹+q»¸ŸîvC.k·²ù”Á¶Æí9˪§]0йQɺ,ß -V•M)——öpµ¤ †ÆYc Ø"£D2| ƒåÄ—Ò›Õn~á¦vvÆ‹ûSúJÃ]Ë`RP*£cú.qðÖ°ä5ª:·‘¸dÒrdÇËÑ 0'¢[Éìw(\rKʆPë°LúÂ.Xƒød- Œ.Lf‹ŠÔGø X -Š<½Ãsù N/ÝN¼mZû ¶‰(0 ³E{<¿BÚ/ypš– ïrwX’ Ôy<Üð }ï…gî<Ù"¾ZÛl˜•1>Nõ¡íªowŒ;6DU4d>Å WÇÓƒ¸ H_à43“'°ðmEXù¯:Ô#Œ-´OsjXuR¶îdG—37|ZÎÊ–Öó¨]_M»cAŒýþÚ“Ì»e>š¹[¥¬6všd“?'I ~þ´ëYËk[Tî3*¡@‰çsÔÄY_‚(wîãÁP:‚è.èøï׺>·x6mÜRH‰œàN±xí/Š wì7&êzÞ9VŽ ,˜c¼ôgG‰Üå²ì*©´GÃìäräqÄ·Ô± -u¸ÁË4{8÷)>Wkd9Ø9P0ƒÖV¥Î:àÔz,ÌÊý®—žn€r7q-%æ +¿åt§Ah€ø¨šá©‚¬H 06ôtÁ¤f®¸É<ð¬ülü„ Òφ.©·X¤¨ðøLÇ­WÛàbì¢S„ûÅ:Î02Ç)ÈÛÒ¸‘V#áé“™]ï67 ˜T¨4Ëû{ӸȄ´Ÿ Ó¸(B\ÔË© |Æ®›î \:K¾‹;'„ß,<¹UˆÝ)`))„ÇÞ´‡T»rs3z€µ¯îwÚ6RXžºS!½[Ø9¦&èÛ¤ö›¥NøbÑ4_Òå+ v¢³¦.Îë,ãÓéL;€­²Z™r¼_BT¾\8ïM¬ÜÁ!Z÷t+\Ã`Ôg>íj|±hœM>ºa.ª+½åFfû¼å!›.¿¨tlÚpÚ<Ü÷I¯À*“`»¾ÀzG“ûç~ï»þæYªPh½ç^bùS!õ4Û>;ä¹a¬¹ÚuøÿV!Ó•endstream +xÚÍks£Fò»…¾UY„yÃå“ãµ³N6^Ÿ¬\¶.É$Æ‚[:ìõþúëžž‘¬‡skW¹T%zzžô»{`½~¬F~”ð¤'Òö&³“ 7…¾ŸN˜3pƒÝQ?ŽN¾¿q/ñ“ˆG½Ñ]g-åJ±Þ(ûË|á÷a…Àû÷Çë‹þ€‡wyõ &dȽó÷g7£‹!uDvèW×ï“ÐãüãõåÕO¿ Ïú±ôFW¯ =¼¸¼^\Ÿ_ôÿý|r1Z¹ûZ,xÞÿžüñWÐËàí~> |‘¨°÷ÀgIÂ{³ +?”B8Lyr{òÏÕ‚^3u™dÀ|ÆCѨÈçqîß–¶`[ †‰Ç¡ÚÚuÀ‚Ägð¤”Ïùšò\t(ÏXèK÷bX&Ð…”¿þ4jJ&¼ßõR%^QáSyï®oo/Î ×Öôlôd¹è3åéòÑΊIÚj;.O[‚†Ã†€‡¢Í J+dA/–~†ÎÀƒÔ•^À0μ*ájœÓI“Òc¢mJ8¾Å`T«÷iIø¬¶«Ô-úKÑ´Ûëá9‚Í|­+XP„œ3#`ýnØz0ï†ÐpHÏöq®c/%ª~NFWvÂ]½pKÓÓj°y Ò…¢š‚Ü&Ò¼ ˆº”Üò‘ø<^½(¦E…ïŒXâÔÔ ½çe:q“Æô¼6ì´Ëì -3.ØV°À{§›É¢›e@‘ÌÞ¨P—瀇þ¶VÉ0ö%K@ÎÖÂømò-¤òØŠÞ€ ?9¨©O–t3öªL¤¤/˜ŒëL”$¾ +#iÈt3¢‰wt’Ò›×F©š‚Ï0wÈyºh ªïì°\Õ3#Ó“L#ÔÌ}hè€×ïô`—Þ¸æ¼úußýÛè¹Í"ù¢,Š_RaQú‰Œˆ*7ŸúƒÄÓ»1ÚPß**W±7KçsÐ1ÛëöAëŠD6çK€À'8A`qYfջѿߢÕ‰¼é¼ôËòæeÕGD¾LäÖ„ÜAT†,ÃÃî]U`gi[ÔH™˜{î9׋¦®jXRÏQŒKMHcNy,H‹CZ„v+Ž½‹/°ÎìçN1㜖ϴtŒ©C¼Zá-³Šq?T☥ã +ã²tÃáíÕOà‚ÀØyçu…Î×8u¶vØä^SL«´]:ˆ¨,mS . ‚°K^좃òîe „<@òÎ˼ÍÁTª(ü;ËÍØKó0Žü˜)~„æô9³}ر7BQ €õ²Õƒ6'+¶œB ÅEè101q‚°±yÝ´ †!„á>M8dF¥÷Ú Ò… +Ñ×~Ndñu‚Q”À€.ÓÙ Ã3xØÒzñÙvmZÉrz¹V<«•o þ–W;¨]š_W4d!?¢ŽaGId¨b”1TIÒQƘ«@á-MD”ÓD„)’D©C,¼Š$÷;2] +nE—=˜è{¬±@”‰gµ²§ÐÌ/[дEYÒ˜%žh‡X·aÕ?ƒ0à5×Í:2%ˆ<8¢ÁM‡/%4¯ +…,‚ ‡ …BÁá)‰Ž·Ï0ëq•æ7±PÌÖî³iM€j¼ð=SBYÑFDzÍAhÚÇ>cÌ3.wÃÂã˜ÂºòƒþppÚ}Õ7ìUe" ¶9bàCH…¼•aÈÍ%j±èj± ”×ö™‡ü@øVW™I‡¾©ËbòHðå2kd¡YtC(D¥A ÝŸ1L‹{mFCÐT¸ žµWû9×!É[f\gGì/¨‘E‚¡Ûa? ½aòÉÍøUDŒkcß"å=hcÞú\¡o5àÊ?b£Ñ‹ûbbªÐB×±¬Í~¥ùý—[k‘GsŒXñŒêà çR†±#FOB‡½Û÷—7•@”¹†Æ´©È{H©);"6‹[Ø3_ŽË¢É©;%Üz”•fc×gýø]CX4³ÕücªóEQµÏÕ8°•] +½#ÝaŸ¿¤›±Ÿ‘Bø<„ý0#!›R’“±™úd±Ã¨ŸpOi‰6"­Í3{nÁê°ÇéïÛ^ùu @BB6}˜Š\úJÅ‘3@EL˜7ŒVÈCg´|È‹IŽ`dí"­ýBpe¿p„³_§ûE¼Yâr&³aÙí¯£›>ã‰wJm›¦àˆ®"¸YÎçõ¢u¼}_4-„Lör°Cš7ìz„‰ðH^ŸÄ1Ñò1hco¨;Õeç}” Â"ÉV>¶7`ø¶âH÷e_Š'ëû•c68'â­ ›ÿo–;·)bà„¸~o^ô<¹ð ì„p¯ €¨jÛÝm”€L$à¡5&@ßÕeY?`ÎtþþR$™‘„S* Ûá”I™"‹iÜÆ<ñ¹ŽÐ8ί,iS“O›èöÕ*éÊíAœ 5«ÖxK@ݧe±%$­{Hÿ±-#+h¬¢CÙ×ër4xw'÷“ >¢æ‚™â!©ÚÕuáýЊñWx³š|@Á:Û¼”Ûz…zAYä‘DIÒ…J 1ÎßãýØ®ó<­ Áé:3…pûÃ^ðBðLö°nëI]fbëR­±Yš·ÔñëÕˆF>Aò À¬È@ÍàPE˜v¢C&¨t+Hª08ò•»¢ö|¹˜×ÆWàBM îXo·¿kvFÆË¢l+/ ~X/œÒu+ê€Àä½±¾VûSÿ”¬[‡ô1pì YX«é>Vw˜˜ù±`vì~‘ìðú Wà¸d>³7ðûE„Ãb›¾‡8*b ?ï5)CÒ*i.uÁÌoÑ?^%yÔÈô½.ë9•H]ÊÆF$MΠÍTþƒ•Ö½Bx"[a=/äÊ»Â|/¶1äN"c®!Óäë›isÞMZ¡ß%­ÐwŸ.ŠziWj›•ÙVϬ7À²â8mVö4܃Ó,\ïÔ–°ça²èß*Ó55=A÷‹W‡q/%_o%¤èý•|fHÁ$½X>R°„ùJˆhR°Aö‹ í½3V…Ûy×êÊ¢f󲘭©á*o‘Úkmnâw;¥ÊÜH`Ã!‘ÁÓZ@lÙ;p³¸›nw}.k»²þ’¶Úî9K«Ç],йQÉ ÚüÞV•–”ÅKs8‚ZÒM㌭lžRŠ¹= PÞrâ +èÍj;?·S;;ãMý)}•a¯‹¥7É)Q!}ƒ8xkXòŽU™0\2i8²ãåè˜ÑUdæ».¹!eC¨uL&]=`õ¡Ï¼/ÆØ@;ש©'â ¬5á‡+xf)(^´ðhô‹K4Φƒ8½°›Mð¶iÍg-Ø&ºÀ€ÔT@Ì ÝZD i>ÞÁ!h]R¼ÁÝaTH4PíñpÃwôþÙól$‹øvm³`VZ»8Õ…¶«¾Ý1îXaÑ–¹Ç_OAb¿& •ÓÌtJÌÀ’·‘âØ}É aL‰½Ì¨a4*6E'3º˜Ùáe1+ZBc ϼ~°}5íB¾1æ“#hOR;vl—ù¬çv•¢ÚØi’Nrü„$‚j”»cЮ;Ä-«M12¶_N‰ôx>GBœq'ˆ²Åð ÷šºÐD°aÇx¸ÖöÙÅÓ²±K!%2B‚ :źµ»!‚Þ±Û˜¨ëxxgY™[60oŽåñÂ%r—×2«$Ò ³_Ë‘ÃßË*TãoÑÌáì×Sø\­‘f`ê@ Às•XS76"è!×+¼^F8ºÊ^Áµ”˜ƒ®üžåN›ÐñQ ÃS7‘@`¬éiÃIÅle“yxàYñU» ¤Ÿ‰^g´HQáñ•Ž[¯¶!ÀFÙy1¦÷É:Ö62Ë)ÈÛBÛ‘F#áé²™]ï6× ›T«4ËéT768!í'H7vŠPcçõ²´±ÏØvSŒÃŸážMgÉ}që‡ðS…G» +ñ±;,%ñØÀvŸê_WvnJ0øÕt§m#…å‰=Ò»cr‚îM*·Yb%€'“ˆ¦Ù’n]á5±¡^g{˜NgÒ‘lÕÊ”ãÕ¢²åÂ:pbåѺ§[Æ£.ÿp‰WãŠEãtòÙ³]á,72Ûe.÷i¹|RéØ´á´¹¿ï#^U&Áv}sôŽ&÷ÏýÂwý•³Œ}¡Ôž;  ‰Õ©zŠ?9;Do\D|×áÿîÐMendstream endobj -1505 0 obj << +1525 0 obj << /Type /Page -/Contents 1506 0 R -/Resources 1504 0 R +/Contents 1526 0 R +/Resources 1524 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R +/Parent 1507 0 R >> endobj -1507 0 obj << -/D [1505 0 R /XYZ 85.0394 794.5015 null] +1527 0 obj << +/D [1525 0 R /XYZ 56.6929 794.5015 null] >> endobj -1508 0 obj << -/D [1505 0 R /XYZ 85.0394 337.2163 null] +1528 0 obj << +/D [1525 0 R /XYZ 56.6929 337.2163 null] >> endobj -1509 0 obj << -/D [1505 0 R /XYZ 85.0394 325.2611 null] +1529 0 obj << +/D [1525 0 R /XYZ 56.6929 325.2611 null] >> endobj -1504 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R >> +1524 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1512 0 obj << -/Length 2929 +1532 0 obj << +/Length 2932 /Filter /FlateDecode >> stream -xÚÍ]sã6î=¿ÂÎL¢?ôÁ{Ûf“6^Ú˦7;×íƒlѱneɵädýï @™väì^»w×ÉL’  ‚“þÄ$I£ÔH3ÉŒŽ’X$“ùê,ž<ÂØ·g‚q.=ÒeˆõÍÃÙ_nT61‘Ie:yX´ò(Îs1y(™¦‘ŠÎB<ýçw×ç—2‰§7·?$”Näôê»7?=\ßÓ@ʨßÜÞ½¥CŸ«ïnn¿ýùþÍy¦§·?ÞQ÷ýõÍõýõÝÕõù¯ߟ]? ,‡Û±B~;ûå×xRÂî¾?‹#eòdò 8ÆÈÉêL'*J´R¾§>{wö÷`0ꦎŠIÄ‘T©‘“TcrJL”*B9=,-ì ö^}APÕàWL{?tÿ–öÿÞPWgç}Õ6ÔhŒwßÑ̪£Žy±ÙT¶¤FÁ¼Ê¼]ͪ¦ðTÄ@{7;^¦ßTÍ£ŸØ0¥²]žÉ¦XÙ.B=€0.…ˆL’È`gI€°C'°Øœ‹|Ê8 jü¶µM_ï¨oÛ9Öf¾¤Ôë¶jz»é¦Þ¾¥o Ûð’$Ì„…‰Hž›·wï» (˜W*"0_I°Ö8ŽAòBˆ©ýÔo‹š¨ØOëí:^Â*HHD\—:2ZhGœôdd h¼¦Orp»7‚¶ƒb^´›A4ê­:ÖÅü£íyÇ|‡QØ>áÓBmßÎÛúâüRÅŠ c|m;Øu½{•IÇƈ ,«Ç¥›šš©mæmIÆh<ÿY<}^Ú†úº¾%ºŒSqA4šÒÙÍ“Ó4ô¶üeŽÚGàœ€GQi6½mh -Ÿ%àâS±Z×ΡÅBxªÊãEïo®h&¸}q¸72‘…&ë]m¬VU ²s ´J÷]=B‚íûpü®Š®·Œÿ!Ž¥ã ϘmwÇóHN¥=XJL»eûìe–æ-¨¨é™Z~ÁA>:M|hBÕ)õTô`R&ÓUÛÁV$,M,L`)ðÁõݹ¤;/R[ꪫÆ:‚zZÔý²Ý>.iy­š­wI0 Q;ƒ…@m-½YÍËn‘:0ZèB¿”EFÉ<ô¸ -4WlzÉ÷)o&Ê­Œœ>VOd-Á(l“ìodæý}DÀ-DÇSTÓ™}¬&ù\õË ë¢ùˆâåô|4ÆW®˜DÑuÛXȈ‰zÏ8³GN°£³¸V2ÓЕ È|ÚŸªvÛy/ð rK ×Õ±go½m¼/ž×ÛÒ;õEËΚ°‹²˜UuÕÕÜM[×í³S6žm2rH(pèÑ™túÌýu…öz€úððÃwíÖ–ñßþy Âdš‹£™nÏ\푆‰HŒ 8äGW]µM5ïÆ4TZ<÷Í£gí“;©÷ÆbgN †@ÌaÎö#™êxÑr³â !\ÊÖ%îC r÷÷ÎÄ¡·Ô]<µ•ç -2…Ç-ªæ ?Æ'ÙuËŒxÚ†Ò^¸îEâš{{FYuÿÂdUŽ›Ãâ­w+Û/B»F€v,†­„dˆÔêçbÇ00Ö£PbÍÎðnïB®Oî Ì—ÔÀSQo?wÚUÕ÷à  è³ò)Å™Æò—õPë»Ã“ -. )ã(7)ì%O£,ÉéÒðR"oÞò8-Ž`¥¯*ñUå‘Á]K¤Ÿ5˜LGy¬èâ|h˜«ƒÙ€¯Ê ÊH摉€%yZ2ÁšbKI Ð* -',%•Q®ùî:$¯È  þ'–Î"§êsÖ‘ 0¤!ë$y¡m§ ™K°àŸøШ$R‰Ÿ3 GAeù¡iøó¡N ! ÿ•„°¯¡ý?BÈ`CÚ˜ ¸Š(΋y/ŠzàN"pž(gÑy¦åëE=•›}Çå[J*ç´•Ô”4`Dzxâ!LâÝÐaª…CCª…çe5_*\»Êe8àn(Ò]qP¤—³ª§®f»š¹âÀ wirÀší‚Ij(ÍáÖW^/äeɉXw” ¹[OÿÀÕº))äéö§4¨ÂpXÉÃJ@q”R)IûráÆö/H¾’ý&|»:ÈüöYsÓUŸ†­ù´®èÈÞs{´oϸ-æËãÛ3ñtª:zÁ}G$_KH­}‘LB•*¥'J¦ ´,û²f~×3ÿ£\ÒïéR‰$‚kkrÊùã¨I&JäQ’ -€ïßG?\½‹þvûÀ)¥4Ýè0o‚C–‚_Ã8€Z¿tpàM Öþ£.Ð|åð¸„XgêTБ°2Ä3œ@Ññê»Pbº—öJ-ãÓ2 –ûJ2ùOÂÂ×·Z‘H0,(eF˜/ ¨æIj^ pf£X˜”QÕ½î~ø4»w”ô´px2 ù¬˜þÈSÜÒ<•Œ~qÊ}±Ó-«r±°¾¬:Ø׺W”!X,@,Iå⥑^Sü[ÊÛª›oG^N0T:ßjçí¦<õŠ’E™âSþÆáä´´Ý|SÍ\„ò—ДÙ{]ì§Gž3<5ÐXÕP¢  ããÃÜÊrÕH)G©wÎ5µÎñ!X¾álŠê#A}®2%œ”«´õÕ|ëÞ\»²®v£øÕN‰Ã-¸©³v‹êR±§âË1áH ÿ®Ї8‰9Ýp$™ ÿ„å¥ ªŽÍˆ4Ln zÚÅh¥ ¶, õi»Vøò`2Α ¿«\Ù S/;êv½L`‰»œð„ô±æ„MäÛ…ÿòÄÝÚÙô¬‹jCDB¹Ú*Gæ}°%‘ £bÊ”( UF¶Jê¯íSᎊvµµí -¥¦.BçÁK´9ÅÀ‘Ö) ðjÓU´òM­T .m‚ïÒÖk&³ëz»ê˜ ÙÒŠžp1zUÐTr1Á{~•÷Î*ÜÔ>mï§25”&ØÀ‘ñSçPTjxÈ©WQªGeКJ[ƒâ;§bóƯåÔø+D±å ª«["Ô­AEv^¹ -7¯à”©¸þ’=Fò\Òg½©ZWJ¥Î¦ô£c¥{o0:ãÜÙEOâúZ: ÷ÙÑxïÃ×\R>Ý€´ÛUí«ØÁú9x&ì}¸[»ç/}ïfö’sFÇùàÃ×mSòCÆðTžë) ñz`°Ük!4‹GŠ„9žÜšqApÇ*æy^Ë_O²±Ÿ˜FMŒ<:LJCÓ¼-âéOƒ áÒSGèe;f“äŽÁ©Ñ=SJF¼£®bÖµõ¶·ÔZÙ¢¡’<à|2£nàÔ£‚’æدI|à­Ñ /­~Q·qÄâŸdèâû@*p8HÅ{·¾S+àññ:ñ•Dø«œ‘ŸãÄ“ÏæØ_úãŸý ° ”ç'JCNÈL¡"òE7þ•aýßû -õendstream +xÚÍ]sã¸í=¿ÂÎL¬Šúê[6›\ss—ÝfsÞÞƒlѱº²ä³äxýï  L;rv{—¶;™‰@AAÐbŸ¥QªL’LQ(¢ÑlyŽ¡ï‡3Á4G4ñ©Þ<œýåF%£,Èbæ¯4ÓTŒŠ_ÇW»|ÿp}>‘Q8ŽƒóI‡ã7·wo “ÑçêÝÝÍí¿Ü_ž'züpûîŽÐ÷×7×÷×wW×ç¡t$bÿ|wwMD7·?]ŸÿöðãÙõC/²¿,*”÷÷³_ G¬îdz0PY¶Ð‘er´<Ó‘ +"­”ÃTgÎþÞ3ôzíÐ!5E* ¢T&z’jHOQÄ +ºPO Ë…y—TÖøãÎuÝ¿%ýà¿KBµfÖ•MMfÎt÷-,[BÌòõº45rFò,³f9-ëÜq=Ä®wé˜iæÔø}cê®ÚnÓZÑ#¾Ÿ¤Ô«¦¬;³n&l×з…­yJRfÄÊD"'ÍÛ»V\0ŽðŒÂ+Áî‹' þ†!h^16_ºM^óeµ6mKÊ‹Ø™€˜«CæR™Ú2';eÒS4^ѧ=ØÕg‚–½až7ë%AÔ뼫|öÙt<ƒ• ¾}/,Ÿèi¢¦kfMuq>Q¡bCß\›V]í^ÒŠ1à‹òqa‡ÆÙØÔ³¦ gÌœüI8Þ.LM¸¶kˆ/Ó”ŒÏ郮CCZ³~²–lÃ_–¨©°ö „ 'ãÛš†ð^)¾äËUe}Z¬„§²8žôþæŠFBчk#ÉQi¤ÞU†ÁrYV ;Û@¯´ßEÞ!$ØŸ‡“àw™·aúOa(­\ØØæ ¶Ù#=æ`*1nÍÖMÊ"Í0QÝ17ôü‚‚~t[ýЀ²2 Ú)ïÀ?¤ŒÆ˦…¥H˜š‘·x½°Lò¿‘÷÷·Ü“ÇQ§æ±¬™å¶ìtVyýÕÆéxk Ï\2‹¼m7Kðu‘qjŽ‚`K{É ­ä¦~(ë‰y·?•Í¦uQ. à JK ³Õqdoæ©],žU›ÂõyÃÁš¨ó"Ÿ–UÙíl¬´ÜMSUÍÖ÷699¤ØôDzx¼e|U¢¿><ütÁ¨ÝÊ0½{ˆ›U Læ9?i׌ÀÕž¨ˆÌ‚M~4pY›eS—³vÈB…Á}_÷gô´y²›#vÑŽX™ƒþ æcöö#¹ÚxÞôz÷³’ !œÊT®C +xî%o?5¥“ +2…Ç šæ ?͆;ÅµÓ DZ†ÒN¹îUb›{FQ¶ÿÂ#Ùª?DÅKo-U²Ÿ„V­Ú› [é¹UÛ|Ç0Ö¡RBÍÁènï|©O® Ü—ÌÀS^m¾¶šeÙuý ÓgéRŠþdÊ[lÖC‡\×îTq}bã$~ÈÓý)¹±ÀŒ±.õÔ|šêç§ö3NÍQÏ©ÜÓw¿nh`èä.Fø¹n¶•)Í V`¹rfó¬^`/ß Óaø¤:Ò.kP7Ž”U~A­-[BÒ±NÔ®tôE~r홋³NHrÛü±±=¾§% ÷¥Q&pg’ò[n**ƒ8–ÑáMår‚xJ<) ƒnÄ!«I¿¨‰Î¢@€²Ý5Hû™¶PIFQ6Òp_L„Š­Mn?Ü×om«4ÿüñ|’¨DBúHÁÿq}w}ôdG +Õ™­Ò‘7õŸ[ ê <𿣟n‰H‡$uH gžNã ‰Rº4<×ÈåÇ^§ÕáÍôªú¯ªîZ"þªÃ$:HCEçC‡À\ÜbU’¡Žddˆ$OkÆ›ó;ö”|!ö* +'<%–AªùîÚ+&D/èÀãþë@' +cõ5ïˆÂ ÍdFÞáoHò|ßIA-29­oÂïxÓ¨(P‘_s [A%é¡k¸ý¡N+ÁcÿJJØ×ÐþGH`A:ËF*‚09,æ=+êýƒTf èŽè4Ñò增J³}Çæ[J*´•Ô”4 b‘?q&ñ¶ë0Õ®>ÕÂÆvQÎD +䶴ÙvØŠ´GìñdZv„ª7Ë©-<·—&[AªéΤúÒva}ååB^^œˆµG¹½õxù\­ë‚rANnߟàA†ÃJVò£”JIZ_Ÿ צ{Æò…ì7âÛÕAæ·ÏòXš¶üÒ/Í¥…tEGñ¶ÍѺà&Ÿ-ŽoÏ$Ó©èà÷\t(!5æy2)ã àˆ’äÛvXö‡vXö¿J&Ý¢&JÀ et*ü+Sþ•À*|FGàÇÁOW‚Ÿo8©„Lw:Ìœ`›ÅÙð$À?­ŸÁ‚'Aî?³×> ÷ +UêäÄ)#‰6 AH‹•Êø}Æ×…ïU…X89ÂÓJñ¦{%¥ü''Ãëû­H2ÈžðdP2H2‘}ãÉ kÅÙË'lÛ Y̱¨l_Ž@}ñšÙÇJz]8܉ „‡¾?ðW‚8“_œŠ`w‹rŽRÌ«¬ö5·ö!¥?/æ –( +RPâDCªâ½§¸×”·e;Û ¼àai£«™5ëâÔ;J$Šwù¥-ÃÉqaÚÙºœÚ3 g\DSÙ>î"žž xLÿØ@}eMç»ÐŸ3]Þ- £¨4¨Š)ØKØWÕZ+‡`õú£é\( òágkSÂZAÙZ[WÎ6öuÁ¶Kc«7Šßí”8\‚:m6h-:.® ` )á^VúF!'–% ក°ÀtAõ±)±†Á TQ»¬•Á’$?MÛÁ ß²„³$À·¥-|aò"ðícGhû¬!ìÛ™e•'¤cˆU'l¢œØÎÝ—îVÖ'³ÊË5!‰…²Õ!4ŽLyï+ÐK*A4 +êcljÒše`©dþÊ<åv§h[]Û,Qk:â¢! Þº ÍIö4ÖA(Ñš¶¦•+ij}dj@ØÄ ¾ S­˜Í®í̲e äKKz€ÀÉè]ASÑmÀïùÝÞÅ*QûÄ‚ŸJT_œPàGÎOȾ&¨Tÿ5¯¢d +¡u¦?Å—NÅî_Æ©ðG‘bÏAR[¹D¨]¡f¥­qó Ö˜ŠKáÏÅc"'%}Vë²±ÅTBÖ…ë*Þ;‡Ñ gÏöð$éçñÒ±¿Î–ú;Gè¿çA“xÆ}ê(»z=õ mK´yæ^u¦@ŸN„sS¼À&pZw_À‚;*pÍõð˜±TƧtóšl0ĶW•O]õ=£÷%ŠšcXº¶‚’‡Ï &PHJÇkÐv³¬\Û›?…(ÃŒ] ·swü¥Oݲ½æ‡‚Q/qÚÇðUSü”Ñ?–§zLJGº„*û^Íü‘ÂwnÅ4óœ ¸eå³Ï<®á¯cY›/Ì£"Amàî^h^¿áø}ïB8„ìÔyÑ ù$…cjtÓ”2'Þ*Ÿ¶Mµé µ–&¯©(4Ÿ¤L ’:ò^Q2;ŽkŸx+&tJÄk«›Ô.©øGÚó½gå ì¤ò½ßšèx{ø‰Šü]ÎÀrÂÑWsìoýùÏþ'PXJÓE€>%d¡Ðé³ÒJÿ;¡ç¢ÿ6³.ùendstream endobj -1511 0 obj << +1531 0 obj << /Type /Page -/Contents 1512 0 R -/Resources 1510 0 R +/Contents 1532 0 R +/Resources 1530 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R +/Parent 1507 0 R >> endobj -1513 0 obj << -/D [1511 0 R /XYZ 56.6929 794.5015 null] +1533 0 obj << +/D [1531 0 R /XYZ 85.0394 794.5015 null] >> endobj -490 0 obj << -/D [1511 0 R /XYZ 56.6929 729.6823 null] +494 0 obj << +/D [1531 0 R /XYZ 85.0394 729.6823 null] >> endobj -1514 0 obj << -/D [1511 0 R /XYZ 56.6929 704.98 null] +1534 0 obj << +/D [1531 0 R /XYZ 85.0394 704.98 null] >> endobj -1515 0 obj << -/D [1511 0 R /XYZ 56.6929 519.4358 null] +1535 0 obj << +/D [1531 0 R /XYZ 85.0394 519.4358 null] >> endobj -1516 0 obj << -/D [1511 0 R /XYZ 56.6929 507.4807 null] +1536 0 obj << +/D [1531 0 R /XYZ 85.0394 507.4807 null] >> endobj -1517 0 obj << -/D [1511 0 R /XYZ 56.6929 339.3113 null] +1537 0 obj << +/D [1531 0 R /XYZ 85.0394 339.3113 null] >> endobj -1518 0 obj << -/D [1511 0 R /XYZ 56.6929 327.3562 null] +1538 0 obj << +/D [1531 0 R /XYZ 85.0394 327.3562 null] >> endobj -494 0 obj << -/D [1511 0 R /XYZ 56.6929 227.5589 null] +498 0 obj << +/D [1531 0 R /XYZ 85.0394 227.5589 null] >> endobj -1519 0 obj << -/D [1511 0 R /XYZ 56.6929 200.4217 null] +1539 0 obj << +/D [1531 0 R /XYZ 85.0394 200.4217 null] >> endobj -1510 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> +1530 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1522 0 obj << -/Length 2732 +1542 0 obj << +/Length 2721 /Filter /FlateDecode >> stream -xÚÍZKsÛ8¾ûWè0ºj„Å“çæÉ8YOMœ¬¢­Jm&Z¢-ÖJ¤V¤âdýv£%Kv²Ijb6¯F?¾¤FþÕÈ;!MnGYn…“Êf«39ºƒ¶gŠyÆ‘i<äúuzö·ç&å"Ou:šÞÆòBz¯FÓù»äÙß/^O/'çcíd’Šó±KeòëÕõoDÉ©xöêúùÕ‹N.Î3›L¯^]yrùürryýìò|¬Œu0<Ä¿^]_Óó«?.ÏßO?»œöKnKIƒëýÏÙ»÷r4‡Ýý~&…ɽÝÇ*ÏõhufÎ)˳7gÿè´†®ÇÄäŒÎë순´9&'—‹Ô@Ê©.V%l-Õ:™.Êó±q6™7«¢ª©ŽíT»«>”L¬Z*»ØcUÌUÍ]Cåý¢š-0VKn­–\»‰Ó–K˜bs®|RÎyMWŠ<l6!¤ÍP¸…Õ¶e®½íj`’yÊL‹âOSÔÈ<[êâR›R"wN¾¢m›YUtåœN¹˜ÏiEmKúš5¡d¦?¥“Tz(/àÈŠ´ÎXã®/^²U2T·DÑÓ’é3L -åMÓ-°–Åqâ ú`‹8[ÝW¨|ùö3OÎû4×p)YRñˆå&´cÈ„i£Â)‘u“òè\åÁ²º«›êX'WuÛ•®ÈHÉ+ò9k vy8Èž •»Q ´åY¨¾.gWä[Á^ç*‰‚ò#Š´uSÕÝ`ª½­’BÞ|"å D :Pl ÀR~,VëeùË¡{Ê3!5Œ›fZdÆëÏòO:.SÙ¾úÿzÅu ¶xrÔOÂX\=ö‡Ç=ÓTŠÌ›Þ÷Y5pàŒ…•ÊŒÒÔ -“‚[@±œÄ¬Y¡¿1Ö&WŒ– ¹àû“·ü¡äù8“ì¿Ä^·;Âr½ –óuDQªÌèï"3ëD\h‹1*¥N «¬ Bc åA±C…¥c‚tôgŠ‡fÎpù˜Tø Ìë ùX)¬ËÍ ùè¡|ÄM1û÷v-šÍÝ#ÒÌûKBl®2÷”ÉiÀ'Ò’ç~h@c³gwGJ%ð_–Ñ`öXFJ£DžtK*œçó^FfÁð!éÓBLÿ­„´ƒ¢Eìƒ^Z7‘™ícâØØH0$Ès­wæql xPÀæ)<¼$¨0”†b­"pzP]W®ÖÉá“"ùáY;9Aj#j=0„#”È;,C¡ÃQs‚˃ê'FEóÚkî‚Ø5ÀÜFÍ;dRnÂ"Ó¾‡bc“)áS¥öqJÀ›ˆfË*@NB÷¼4mAîlV–(:9¬“'ä–‚: —ÈmçC‰M ål”3–c”‡>–àΪ×yè PT‰Ô§6ê„‚ Ã`hHÀ’oÊ®«ê;m:ý£=²€8èŸ j†îSBoiÒU«rÜ5cÜ6QHFYxi2™P€årN”,Z‡O£Ç7UÇM!ïHâ)£Ì5ç,%£ËÀElëªk‡3§igM=oÑD¤ßO™&ëMµ*6ÕòЖó“@55¼‚¶Y¹¶Dº_PŠbp“Ì6ƒ”±¤êdÒb°žÅ$*Uæe;ÛT7%´hlÂ@­ˆƒÄqyª›r0Ñ<Òn›]6d’ B(ÛE³]ö<Ç2ŽyÕÎ -¶ -Ì0Œ’ñPerÛ,—Í}¯Ý‚æàÖîÓºl÷í¶‡ºØ¯>f[Ê€àÔ–lAØ”-Ö܃Šÿ6u“O©ÁØC€R ~.³#ëRa³ÏÂú&7"“™ù2}¼×ë[ðcZ~ ˜‰=bP¿§±•^¤NðæJ+fÆ, Lðwdƒo^AØ´àJâÁÙdY´ÁˆÌÐØ ËÚF“4ÔUóͺ8B]ÞÛ2é«AÐaALÓEì†ÖQ–»l© 5õ-u¤l{6ÅZî\ÒD§ê8eãŒîÍõÕºƒ›]ŒãEÒÐÏ_¿ýíÕË‹«ëx1ᢱ®›º-ÛczK«]‘®}j¶â˜í÷–°*>V«-s£¯‹²‰Ña'.9×î:ÄP¹iw×+f‹~ˆ˜Atš‚Æ âë” ÕÙHïÁ˜òK†Œ=Nê­ñVdÞžP[ ˜ÎsVÿSpV{Ã7t‹‰y?ø%¾W ©bcÑQI—nÀÓ5k¢ û „8y¬‘¡f”÷ÐSî ¦@êƒT¼|jyÖÓZŽ{ ÇÂÃöæÁ)ÆŸã0×`éÿ3RºNendstream +xÚÍZKsÛ8¾ûWè0ºj„Ń Á¹y2ά¦&vVÑVMm&Z¢-ÖJ¤V¤âdýv£$%ÓN²qjW`£ñjôãk@j"áOMl"’Lg“4‹…•ÊN–Û39¹ƒ¶_ÏóLÓtÈõóâìo/M:ÉD–èd²¸Œå„tNM«·Q"Œ8‡dô¯ë«Ëó©¶2z9ûjÊÄVG/þ~ñzq9§†„Yž]ýB”ŒŠ×W/g¿þs~qžÆÑbv}EäùåËËùåÕ‹Ëów‹ßÎ.Ý’‡ÛRÒàzÿsööœ¬`w¿Ia2g'÷ð!…Ê2=ÙžÅÖ(›³7gÿè´ú®£bRRh“è9i3&'›‰Ä@Ê©Ê·ì>Ñ:Z¬‹ó©±q´ª·yYQÛ©vW¾/˜X6T¶¡Ç6_®ËŠ?ÚšÊûu¹\?`,7ÜZn¸v¦-60Åþ\¹¨Xñšf-Š<lÄÀ6eœjØ>na{h˜ëh»˜d–0Ó:ÏÓä2O¦±u±‰›L•™µÚóåMS/˼-VtÔùjE+j"Ðײö%3ý)­¼ *Ð}yÿ€¬˜Aë”5êêâ«cÉ#VuK•æp‹ƒþ)¥^–EÕ +¿P LEf´ó |égH\”SÁÇ‚U:·á#ÕQyKD=-™>ý¤PÞÔíki', ª¶ˆ³U]…ÊWŒ1óäþ¼ç.%J±ØûVàcó?m‚?%²nRI¯ËéLØT¥ÇîèÿëÖ1ØÔ£+ ~Æâjèq<Ô4ìi +ÿ‹TÙ´óu±jÁ¶c"ÐÂHöu,'±¬·è^LG3ðèFK:(¨¸HÉói*ÙU‰£.'â³T8«² /Å}ýîPŽ*5ú›,IDšÈd\` #Ç°˜+JìT)jŸµ² +Àxzb#PÕ¢ P•1Ïé¨!Œ©?1(äÂiP2bTOpoñH±G¨ŠK»rMMª„K”>†^W"j-J- õÞœR7E³ËeQx@håP®V>"¶´Á€*ÄÖ;Ð1©i¡,è‡BBËh¡{8+ÁU§òÐ §‰ƒc‚¬@(%Ó.o4$JÀŒoŠ¶-«;m±ø½Y`H4²Xžû‚€Zµå¶˜¶õ·M’Q°\ÍçTz¹YÑ%„ÊáÓèéMÙr Å;’x€rǹIÁ@Òsчªl›áÌ @×e]­$ÑwS&Ñn_nó}¹ùÈ4Å(öö˜41¼‚¦ÞÀ¹6Dº_S*bp“̶„Ô° ê|Þ`ˆ‹ H Uª¬Šf¹/o +i]ßSeSû€Z ãòT7Å`¢U ÝÖ}Öc"/B(›u}Øt­³Ê ­¬õ‚ýÁ{‰X;ÃWp„‰ft +‰ïH¤Ø˜·TÒ­ð´õŽ(èw¨…=t‘Gƒî o—žuL…Ùi·ùaÓžø¼N!Š>òÏùÆõÀC}h\]w›²<¨)Ú'”b ï¯;Âo©¯û?©x¯i$»… );Þ¦&ºÌñ>UkKÚr„ +]ob-§‚„‡ß •äÍ´e@õÞ#ÂGYpÎç&á&iÛ¡›{ܹQ‡m/'{/'‡^Nò^Øc'÷^å0”ísiÀç§>ß"–ª w +*ò…©ï©Ò>™ú»´&ñtáoá3E®#óW·á‘Dª‡ÄUq®"¶qÏTƒL$Q5™±wDõán}Â¬è¬±× OU|ØmÊeéñÒ7«~¤„¼ 6qÖóãH +q‚TÕÚȱÌÒNçÒh<’0σä æä`V¡ê²z¾Êw»>ȱÏ^¿?1Ì Çd2¼¶¸¬Gׇ¶¬+jE·Ý®½÷Ž’d öºÏ«f“3´ôñ{Í^õè%ÃðÕ66à¤ìñ3 +ÑžÂ6,mETýHÝ0‘èÀÉF¾ÑœEYMýüi‰|¿ËGäb ˜‚ éj÷åRÊTŒK¢×‹9UŽ¯Ó1«HµŒ.Á!•>\9zU@VŠkžp²ß|4O¡a›¯Šã‘6 IÌé¶5=8M¦aÍGÑ°)ï*Šcy…Îé>ÏO ò4Y¾"ŽMqëy ¿8èh_Þ­[|Ëi—@¥2€Sz·«›²-ˆÜOäÃXÌ Zþ‘(¨X´¢à¡û\ÚÍ!ßø,{ïËv:† Û¢ò¯.˜Ù~rÉà ¿ Ò›‹vBýâ§ZȉzjÖ/lPà"…ƤÜÀ 4pÌ˺™@z¬»"{ô2§¯Y뻉FÒ\sâ=Ž8íîï1u‡÷] Ræ.½*¯.¤òŽ”¿ƒi|eYPóÃwÅâ._§%os"²×]p .†rPìóôÈÇ¢û77#Q£Ð•øSWJÕD[pþånÃh3P9±D"ú;¢,¨TüdBÂ|ëœ9·}šîùI+` “ߧc“ð{×0ø…•Õ¨FäðvpKöŽ/£¼ÍÿôX&­0“¶:þ 3ég»î¨J´ˆ³TßN3U˜J;CÍ?\Ïg¿âE´UFFÇÆÐùðQ@6œëë–ß²o +…?! ˆŠ<ÂùÔ¥ +”IþÍÛVnëú釰N0ý”Ï%—ï¨B¦¥ôÄ÷8PÕJ¤Àî)>š,û9‹œ|ò¨?÷Ç3ýˆ`uÆ9=Ž‹;ü PdzvñƒŸö„_Ù0×`éÿ‹³ endstream endobj -1521 0 obj << +1541 0 obj << /Type /Page -/Contents 1522 0 R -/Resources 1520 0 R +/Contents 1542 0 R +/Resources 1540 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R +/Parent 1507 0 R >> endobj -1523 0 obj << -/D [1521 0 R /XYZ 85.0394 794.5015 null] +1543 0 obj << +/D [1541 0 R /XYZ 56.6929 794.5015 null] >> endobj -1524 0 obj << -/D [1521 0 R /XYZ 85.0394 685.0919 null] +1544 0 obj << +/D [1541 0 R /XYZ 56.6929 703.0246 null] >> endobj -1525 0 obj << -/D [1521 0 R /XYZ 85.0394 673.1367 null] +1545 0 obj << +/D [1541 0 R /XYZ 56.6929 691.0694 null] >> endobj -498 0 obj << -/D [1521 0 R /XYZ 85.0394 537.6026 null] +502 0 obj << +/D [1541 0 R /XYZ 56.6929 555.5354 null] >> endobj -1526 0 obj << -/D [1521 0 R /XYZ 85.0394 510.2982 null] +1546 0 obj << +/D [1541 0 R /XYZ 56.6929 528.2309 null] >> endobj -1527 0 obj << -/D [1521 0 R /XYZ 85.0394 468.8256 null] +1547 0 obj << +/D [1541 0 R /XYZ 56.6929 486.7584 null] >> endobj -1528 0 obj << -/D [1521 0 R /XYZ 85.0394 456.8705 null] +1548 0 obj << +/D [1541 0 R /XYZ 56.6929 474.8032 null] >> endobj -502 0 obj << -/D [1521 0 R /XYZ 85.0394 288.1559 null] +506 0 obj << +/D [1541 0 R /XYZ 56.6929 306.0886 null] >> endobj -1529 0 obj << -/D [1521 0 R /XYZ 85.0394 258.1665 null] +1549 0 obj << +/D [1541 0 R /XYZ 56.6929 276.0992 null] >> endobj -1530 0 obj << -/D [1521 0 R /XYZ 85.0394 168.8733 null] +1550 0 obj << +/D [1541 0 R /XYZ 56.6929 186.806 null] >> endobj -1531 0 obj << -/D [1521 0 R /XYZ 85.0394 156.9181 null] +1551 0 obj << +/D [1541 0 R /XYZ 56.6929 174.8508 null] >> endobj -1520 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F21 702 0 R >> +1540 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1534 0 obj << -/Length 2208 +1554 0 obj << +/Length 2210 /Filter /FlateDecode >> stream -xÚ½ÛnÛ8ö=_¡‡}šÃ»¨ÁbLêt=Èe6õLÓéƒb3µ[J-9içë÷‡”¥DIºÛ΢@uBžû…f …,QšèœçI–K¢(SÉr{D“°÷戜iDšö±~Zýp*²$'¹æ:YÜôhBaÉbõ>ÕD P éɔ+šžÎÏbB*žžüóø—Åì -7t@ýi~ñWrüœ\^œÎßüzu<Édº˜_^àòÕìtv5»8™M>,~>š-:–ûb1*¿ŸŽÞ É -¤ûùˆ‘•ÜÔ°<çÉöH*A”"®lŽÞý«#ØÛõGÇÔÔáoDPžêZÆIž+9~-M¦F£Í3´ðZŒ'†¤VÔØãFtVä"aŒäJqgF͉ȘN2¥À´Íxá4ì1s¢´d‘Q¢Î=ÆådªYº€ÿyúÈ@“f%ŒP™çqz°õ ¿ðÃ|Ë“×5”ôdŠt§=Â^$Í{Ž þHp» DÓÜx~k‹2iÑCåÀ‡bQ¦¿]^Íß̃ì’R£¨x›²²Íd*rš–~[ ï;4ý\lo7¥Ø…­·UïðÛ]=a*½+Weõ—–uÕâñ6­Ÿ#\‚FÀh”'S4(¯®6_ŸÑôÎ3„ NÓ°¾ªñ[ÕmìÒ6M¼Oe<^ÜÞZ·&CAYäÅm.Û}±Axß­ZJê•}¸ À±}cW^Yçžõµu¸<3^v÷-«U¹,Ú¸º.Ú…¥žN‰¿;»)ÚònÂUú€fwvS6-0âá:ÿ±¬ÈC–:'Ü€'õcéÛÂÓ%•kˆÏCŠù¶äÑxI0‡ˆgýˆxZfÑÌt‰[(¥é%(h‡)÷÷º²!‹—›½.wv šE Y"F -õéPgâvSnLz^€ªwR&OOëÝÖ[V*Û²Ø8_q®ì”òÊÛÉïâÑ«Ó\€„¯*ª€³FRyÚì¯ûio«6R»¶¶BÈ~nmµ²+ç³à#ïÖŽ«ŸDo¹;ÚèD¸l»¹ pƒßå¦h¾loÝUÀ!ØM0´¬ýwÕ¡¬ç®ßî›@ì:¬ÔŽï¦ØÚ/¤Ò)˜ðBŽK#chíÀÕr³_…d -Žu0=àê™fcÙtà#.›rh+ïÕ)ð_ÃD$4¿89ûõõl„’‚ Êøê«Zä’a²Hs±8CEL¹†Â–S !IfT/ ±ˆºŒB áå8xû¥j‹Ï?Žð%QL«1¥©Ò2"çoUo‹²šVδ/׆p)£!ÞP@,‹—.ëíÖù䈥 Ì‚¼#ìOY® ® B’/äà2Ú¡±­÷+Ý•ÑÌÓ*¸.‹™ û£†ç¾N¹H˜5~‹ê ûêTªÒeÄá㸪$ Øpo'ÿ Ù…hf©#²kZôœ(Ê ú"éÂ]Ä$Æ0|}FuaÙ‘ƒ‹°]Bù*—e;U JNfò1aƒ˜ÑÀDô¿#‚ì#d$“Æ'ZÏ}” ±…¦>’úÇSRd,0‰TyôŒs¹ß¡ª1I!˜MvˆÐ§=¨/(jRö}À©»îÔŽŠNåÍ&p!7HóÍ­]ö|ä~ÛõX²ƒŽ€e¹~™ÙAØ^üûmWÊX.ÚaÙð­™Ïf×M½Ù·–ŒXÐDæP§Ðë -2õ¹™jH]{#ANÆÊÛ»wïÀû]’;¹8>wƒšøüx~1};»ú fµÑäÖ¿/ò •¶¼+6l`…ÇŠIAšh£»Êè20éwºàТ„8wv°¼Ft *¤Aš°øW×E¸ïvWº!ôáÑ‘|£ɺà®=†|#eô«ºZÚY7…jb`–zTß‘p”òã…­úÃJ±"O=ÃqµKðßãA,„s˜“¿~âŽ'žoÙû…1NšæßóAŒ©œH-Í÷ëS~úIŒ¹× -¤Ÿ e–‡ ZÚK9 na4#dÇEƒ·Ú{5Á…f]ï7+Ätý¹[ÛÙ¦­w6¬7~ÒtE5ò&''Z‚ÊìÛÂÆÀY{¾?†9(¡ü0J©Òk÷,µw¼Kík‚[téÂ}›[×âܯ->†¸ETÀ18tLžXÔÀŦ©Ãý!î"sÃÉ!¨Éõ@B…Wq‘)÷*.2÷\¼†”ŠøÝØÛ†³ _£ÜâÙð'l\ªší¶·+¤]ô?+ÿªvWÓÑ‘Ò©Ç=šÝìê-Bø“ásÌ+‹€ähÙ¢Ýïüá«Ã{›û:9ž~pëÇê·…ÿ_ùàÆ8Lš±þƒÛãJr -ÄdÿyAôƒD{û$—EQÀçÈ©~\]S\.hiHG¤ìä~}gvv)Ò¦í´IŠáhwvvÞµqø'FÖ0®2=J3Í f´ÜñÑGØ{s$Î4"M»X?/Ž~:Ué(cY"“Ñâ¦CË2n­-VïÇ'ÿ8þu1»šL¥áã„M¦&áãŸç¯i%£ÏÉåÅéüÍoWÇ“TóË Z¾šÎ®f'³ÉT(m$PÄï—3B:ŸÍ&¿Í-Ë]±WÈ泥÷øhÒýręʬÝÃÎD–ÉÑöHÅŒV*®lŽÞý³%ØÙõG‡ÔÔâ[Lq#¾êZ!Y–=|-å+fû -:ÇVã‰>©ƒ€”´ªµ¢T#!XfŒD3fœ¥Ž§Æ€i2ãjØcfÌ$Z ¢àÌ( œ{ŒËÉ4ãü/Çì4µÖR¸Ç*‰7>ã:Ëát`/êA~á§ùVŽ^W Ш#S¤;íö"%²ã˜B¦Œ§®Wœ%<³žáÅÚ‘P‰êàJ`Ĉ(Ô_.¯æoæAøM­™5< x›¢tõdª2>.Jú6@Þn¢øøs¾½ÝD”|¶np«ÚÑÛ]5f|W¬Šò#--«²¡ãM Z=G¸ë‚Õ8h„,JÖ«ÊÍÀ|ü‡”)AHBòqX_Uô-«&néê:Þ€§"Ïoo®)!HPyÁÍe³Ï7ïëü£Cq \µæ^Ù‡ÛHÛ×nåà‘uéY_;Ä•©õ²ã·(WÅ2oâê:o"–:: 'júîÜ&oŠ»‰4ã4Û³›¢n€WAøEÉ:´ÎR–(ðœn0}[|b&0Y’¦‡ómÙ£òše¿ yÑ ùˆ—èBZP|`®5 Îùø´£tû{Uºx‹M€^;·Í’†4#…û|˜¤êvSiíø<Uï¤l6>­v[oQX½ÏkŠ²hŠ|ƒ¾‚?WîÎeéíäwéèÕé -@Æ7åeÀY©l\ï¯k÷iïÊ&R»v®$È}n\¹r+ôYð‘wkäjÀ'É[@îV„ž6Z.šÚmn\Ów¹Éë‚/»[¼³ ø $»‰†–•ÿ®Zô€õÜõÛ}ˆ]‡•*0Ðò]ç[×á…µBZ¦•P^Èaâ`ibŒ¬¸Znö«LÁ±:‰W«§‰ʦ=Ál*¡¯ ¼W¤À­P‘Ðüâäì·×³J‚(•J¤¯r5@Rj¦”M#ÍÅâŒ1• T¶ŒC)ÍRk:ñÀDˆˆEÔeª/ÇÁÛ/e“þë_Ê0#’ÁdzJK™R¼UµÍ‹rZ¢i_žX&µŽ†x?@M±4êmYm·è“–‚: >ð> °?Y¤Â>ˆüI¿d|Cêh‡Ú5Þ¯DtWDCXŽËàº"f~€î Š<^ú:…‘0+úæåöå'¨Tf‘ãaUR\¸7§“†ì'B4‹1ÙÕ yN¥W}‰tŽ M1 _ŸQq#,#9¸1Û”¯bY4CQ% ä¤6rÑ‹™˜ˆþñ7BÐ]„”¥ÚÚ€€¢uܧG :[èê#©¿0Õ#ņ“i“E¿¡è1—ûi¡’‚Ù¦‡}Úƒº‚’&u×PÝU«vRtp*o6¥€€HL?Í×·nÙñ‘CúmÖCÉ.ɘH³äef{a›{ñ?î·m (b¹húe÷f>›]×Õfß86`Q a:ƒ>…^WY©ËÍ4Ôå¨7bäl¨¼½{÷¼“ÜÉÅñ9Î^àóãùÅôíìê_0Ì &·î}‘g¨´Å]¾ie+<æùÁY¸žÍþ}|þëÙŒ\ž3b:°’ô9é#>¶ ßHµèdpù(ƒÇjòÃRx¯\õ².ÌX‘À hH´ðÅ^í°m œ¢M›¿½ÌCäÀ›¥Iÿ—zJR8ÎÉ´ßQ\QT±-S)Ì<èýŽ´Cá ÆÝÆ x‹W5ZÛ¯R™°möÈà >¼àj^ðûþ†q—z™À^Qú´1À—ßΛ¸Yâ·ÁÚÁ“ñüf¨çŠq+Õ‹fâ @•uSïf$ª7ÇÐ,}¢?m™í¤‘ŽÊc^»/šõ`+ª6S}mFƒÞ{H—±†T°w¡'«°Þµ{Л>_D +ÖÇQþ¿ã) +SfhòTšB—ÂmßG))h-ãarW½@g=&ýNÛ¢Z€çÎí–×ÈŽ%…ÔD¿Ðê:÷Ýî +BÈ7‰`iüϵÇo´Ž~U•K×#‹ShÂ,Ì’}ê:R~¼pewXÉWì©w8)¡£Æÿ=^Ä2Ť„9ùë'îxâ©ñˆÌÞ/¼ˆIŽh‰üž/bÂdL'Ú~ÿ'±.ågÞÄ>GèP!ý­Ó,ŒÐÚòNΩi‹Â™ G8>pµólB õºÚoV„‰ :®í\ÝT;Vó?jâF^<Ê)%YbQõ?6na£ç­çïÉ ÓÔPq˜ µ6ãk|—Ú#ï:ñE1_à·.¨wA¸* ç~íè5IT?b6@tÊžXÔÀù¦®Âý!ð"sýÑ!¨ › e»¹J ¾›«TÇýš¯!§„?~½m8»ðE +—Ć?áâRY7d·½[í< çôYùgµ»"Ÿ>‰¨|5»ÙU[‚è=&¥÷˜Wæ i¹¼Ùïü#á«Ãƒ~QŽ§_ܺÁúmñÿ#_Ü„„‘"¢ûâöøO%¬Y¦»ï êQwºXœý¸Î‰?îý€w«³öeÁÝäûM3mšÍÿùea¨”€ø7–?Àð6góŸ{vÄ>ÂZÙ­ Ý. %¡ý +L!ãÖ<äÜ( ÅO¦¬ÿ…ŸžÊendstream endobj -1533 0 obj << +1553 0 obj << /Type /Page -/Contents 1534 0 R -/Resources 1532 0 R +/Contents 1554 0 R +/Resources 1552 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R ->> endobj -1535 0 obj << -/D [1533 0 R /XYZ 56.6929 794.5015 null] ->> endobj -506 0 obj << -/D [1533 0 R /XYZ 56.6929 663.594 null] +/Parent 1560 0 R >> endobj -1536 0 obj << -/D [1533 0 R /XYZ 56.6929 640.0743 null] +1555 0 obj << +/D [1553 0 R /XYZ 85.0394 794.5015 null] >> endobj 510 0 obj << -/D [1533 0 R /XYZ 56.6929 573.5829 null] +/D [1553 0 R /XYZ 85.0394 663.594 null] >> endobj -1537 0 obj << -/D [1533 0 R /XYZ 56.6929 548.3076 null] +1556 0 obj << +/D [1553 0 R /XYZ 85.0394 640.0743 null] >> endobj 514 0 obj << -/D [1533 0 R /XYZ 56.6929 357.2459 null] +/D [1553 0 R /XYZ 85.0394 573.5829 null] >> endobj -1538 0 obj << -/D [1533 0 R /XYZ 56.6929 330.4365 null] +1557 0 obj << +/D [1553 0 R /XYZ 85.0394 548.3076 null] >> endobj 518 0 obj << -/D [1533 0 R /XYZ 56.6929 105.6253 null] +/D [1553 0 R /XYZ 85.0394 357.2459 null] >> endobj -1539 0 obj << -/D [1533 0 R /XYZ 56.6929 82.6167 null] +1558 0 obj << +/D [1553 0 R /XYZ 85.0394 330.4365 null] >> endobj -1532 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F21 702 0 R /F53 1017 0 R /F11 1367 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +522 0 obj << +/D [1553 0 R /XYZ 85.0394 105.6253 null] +>> endobj +1559 0 obj << +/D [1553 0 R /XYZ 85.0394 82.6167 null] +>> endobj +1552 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R /F53 1027 0 R /F11 1384 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1542 0 obj << -/Length 3049 -/Filter /FlateDecode ->> -stream -xÚÝÉrÛ8öî¯Ð!¹ÊBc!¸ôÍí(O¥Œ­éêšt”HÛ¬¡HµHÅI¾~ÞøHìžt×T}„åo_@1áð/&±f\%Á$J¦¹Ð“ÕúŒO`îí™°kfnÑl¸ê§ÅÙoT4IXÊp²¸ÀŠc1Yd§W»ü°˜ßžÏ¤æÓÏtȧ?]ß¼¦‘„š«÷7o®ßþóöò< -¦‹ë÷74|;3¿ß\ÍÏgBZeAüëýÍœ½¹~7?ÿ´øûÙ|Ñ]yˆ–à -ïûûÙÇO|’v?ãL%±ž<ÁÎD’ÈÉú,Њé@)7RžÝý£8˜5[}dÒ*f:–‘‡NRùè¤*˜B:Ýå- “ðiû˜S'ËïÓ]iGçZO‹uî~%rZSÿ]ñÙŽþÆ5_,ÞA#hà¾ÞR§Ù-›ü÷]^YhÛsOóUmÚ¬¡Á§¢}¤Þ®Êòß8—UžÙóï { øô<:-‹Á öÄ4% 4\ß÷Èk€>3!X¢µ4ÈnÓê!'îñ™AÄ* "iàbUçÁF œPÁD,Q26`^ÁévÕ¾2dq [pQÑØ!J𳨬ˆ½¹¢ŽT<îÏìn{?™9x3¥™<4`QCK·âüsÚ´ùÖÊeQZç_Ú¼jŠºúñ|¦„c1L¼z;¿™ƒÐIVš_Û|Õ"OôeÀ’@$2_«6ýò£‡NpQ-ÂÀR`|ŠY­‡`CÅ8WÚ®ð¦|l<·Ð’Å\ÚÕ=ðS"ràÚ¶ôÀp\¤5Ÿè8¬„ ©C»nU¦ïF2aqÜ;„¢áƱˆöëÆâ·õâ»e¼ÁU½^£by %Æ÷ñi¦xÂT”8±ŽŽñk7”,Ò¡Ê·ÔÓ]cDz-ZNW¤‘i›ÓxJM“o‹Ün2z --­lêé¬rph&úcÚÚÍUù•zYqKîèÃï{³£^˜<]=Ú ùvÉÒnM+j Л´…£ÀøTæ°’gIæ?Ž+W`9ˆæ÷‰™´¨¹¹£ön~ûËüö›ÿzùó‡wó—2¢î+j®n.¶“¯÷Ø!FÎu ?§%¹Oø L~ÚÇ–íºcP³'ŒØ`%¢C‘R0¥Àó:baƒàP9¢€8D¶tñh´#ŒÉªb­*¶ue:yhŸjê@@ºnÐ`ôÚtÛΚ¶ÞØ][jûñ –Ú04ˆjzí@=ÚC0˜Û6­ONð ?R`hÑÎ_ Ý¯›àAùf¼¬¡T6¯ƒÜ·ùº^ÖeCS˜¶GvéÖ>éHUBYØ~š‹BºH»)²œÀ÷i]èH¸)Ó… †q&>‘r~‹±tÛ˜IõÑù¾t—£Õ’.•Åñ‡¼¥NJÍ+»¹¢¶ƒVïÚÍΨìýZïh´Ê)ÈR6ÈRÀìUºÉûÍþ„rAxƒjÈ]6°C@™˜;B³LWÿn –z¤­š ¶‚¤£ -ÓÞÊ—"°$.’G„€"9{``…F¢K™*2XpBÄF§a%ˆ@»|tÿ™p~ -Öˆ,ëô+Q£Þ`°˜–¥ýmÚ{åúÉðGöBƒ6% ‚½¨v]gZw~‰ O&*­}¤ì‡Ic”1ù0Ö÷Ùné– 3 $u¤ŒÉËÌSdí#uÑ{Œõ2mPl#Lôá’çbÚß3‰zUQIBÛÒ5²Q\€9Î¥öŠ•P8a¹÷’y 'pv¨ |xv(Mߘ¨ˆ’I×›2¿ð\)ÔL(­ŸÃ*x)V3É/ÔEæ3 Sê#@RiY.ã‹Fјå-ˆ &²’Ë©äتaÞÎ¥µ`xµÛ’h›fŒ’BN7[õfo‡õµT¾„‰Ô.Hi:ËWÅ:-iÌ8¯~î[N—˜yÃ¥4Ë\vÛ)/þ0™æN‰¥S¬£7ÕÏiQ¦KW#B}“R·÷u°½¿£¦Òª×LrÊ®¾ù*ŒÇ‘è•V\Ø+¬Ú´´ü‰À´óXŽùsäÈQí©ö•ç˜V‰ˆ&-¢Øíá#ˆr‡Î9(NX :…ùâµGAÐi3(ŠGá!"ìaüê ; ¼ä]¨g -Öx§ÝfCb°}F$LŽ§Œ·2 ºâ8þè=¡XøŒÏL€ú„(ªÏå‡âܯ­H«N6ŽZœ``q´´‰NpÄ -+E0ýl$§“QyàUuKtÙÔå®5êÛ'TÁHÉ}œFÉ®¨îj=œ"8]F{§§ÀÏ -5—øE½²Ábm«+®:Ž±¼7Ü6VYIµ×MÚË¢,Zqö'ót[F$`KiX'ópE,N’ηùœ›P ±Âš¶ÀÄá»4â¡*¾Q˜£Ñö¨²Ây_pC<Ù¯b®ã}ÑÙÒ»‰V¬õy5.çu"3vkëYIg0bÎ@TçV¹pF?÷RE"\Û¤`ÐiºS3w*¤}göd¤¹Ì‡ómÑ:g³±R€»rr4îK«•{Ù8§»2?úˆ6¾c*ã:qᦈ÷Y‰ŽÔé§ LSrX‚¢ æ&ï*äC)Ï ûX€‚N$Ïû׿¼äèÏ*•üânŒψ»Àçäà$“NÉ»vñ˜Vv¿£Hi07”r÷H¹ˆ\¹–ÛŠ¬\§­yØÑÊ“ÓoXüó˜ìîÀ`ª6sUöÞœ[ñÿ&¶Cyø³ÄV*–œüðá¤Ûq\lÁ5ˆ(ŒŸ[K‰X÷o­Ï‰íeK2¶±YƒI3”p©;ÌÐK#Ùw3ãbaá74Ógß0þaq{AÃæUà‚F_wýxzyá-äÁŸõÕeìÍÝ Î Hò}dÔfíuþ€Ï¶;ŽsNk&¥xο -ã;¹ýDbK¹ãc¯ä ³1Ðtï# ½dõ:u -AQœÉÄ®÷4ž^¯ò¦qjÔkHÔ¶æa™^ÚÜ—'¸0@ïûHÖs¡ÿÌçñ„!Ž€Þ³ `B‘ipß|w¤8~±˜üòÑ8<ýÙQÓçT[Ïýö$;9þùˆ<ü|ÄEÏ™}ï¦oXFì¶ÂÑ-“»ïböTŽB)tÛŽóû.j ÚÉHçí®oôîd+.ÕÇô>¥y2Ó$"HÜ â:I¢AŸØIoÞì]¤{®Ç߶ÚI¿ðc¤1Wï.ïîFÅŠC)v\‹ŽŸ—y¾+ã“gMÂK¿bë¿ä L­Hú%¥({)¤R¬ôÏ}îvxõÿA‹¬Àendstream +1563 0 obj << +/Length 3050 +/Filter /FlateDecode +>> +stream +xÚÝÉrÛ8öî¯ð!ºÊbAöÍí(O¥Œ­éêšt”HÛ¬¡HµHÅq¾~ÞøÈ➤jªÆ>Âò€·/ ;àŸª8ŒSžžêT†*bêtµ>‰Nïaîí ³kfnÑl¼ê—ÅÉOo„>MÃ4æñéân+ £$a§‹üc‡"<Qð¯÷×ó³WQðæêô˜Š—»ø°˜ßÐDl—þruýšFRj.ß_¿¹zûÏ›‹3-ƒÅÕûk¾™¿™ß̯/çgŸ?™/ú+Ñb‘ÀûþyòñStšv?‰B‘&êô~D!KS~º>‘J„J +áFª“Û“ôG³f«—L, +¹ˆ¹‡N\øè¤Ò00…tº-:À)‚î¡ N^Üe»ÊŽ.Δ +Êuá~¥3ÆÂT)nÝfõ}A,ŒfœI-KM#-\¬Îá<Ø”c#Ê!¦‚'Ì+8ݮӗÇa"ƒ‘YT¶vŒü,k+Bo.©ÃE” gö·½;9x3¡BÆ¢¸—ë„8ŠÆâúkÖvÅÖJyYYç_º¢n˦þùl&˜c1L¼z;¿žƒPIV7^—ÛbÕ!OŸ#ès¦’I™§ºË¾üì¡\T±XY +LO1«Õl,Â(Ò®ñ¦zh=·PþB üe@ å0ô#ÀõKQ°+œ7ˆÆX”‚ÕÃHÅ/ E*Bé½Pñ¿Ûå®™ð"‰•:|Ú,Ûu;¦ f% Ø`a4ŠCÇ ”I ¡­ãDË‘÷®ZÈŽ.ŒfÄ YTì EŶ©MG“gD£ëƒ×eÛnÖvÍÆîÚR;ŒÿÔ&Dc(‚+êÁ‚‘ܶí|2‚§`ì™’òB‹6þmCxÝ*6Óe-à)yOhF¼*.ªŠ(¨Mé’¢E fuî¦èõ®µ0—…OÌ7M[b¨÷L&¥ʳx3bà÷ÉJD¸ Ü Örpù`ö[ çœ0HùŽ +‡xˆ³Ôàî-}b†ÎÊùµ¶ç#75Æ8Vgk7x··êypƒÓÏ6‹È=C»´‹†*÷š¤‹c&ƒ¶¬ï«Â·(B~»X܃t)jâbaLâò¦ª²­ƒ{_SFg~=­—MÕÒLØÐÃcß&Z{g3e…îéé§9‹ͶÝ0! }J‡?¨¿©²D&$áøÊ$› +µ‰ë´SV­‡ÀÎ ƒÝ¨×©ÒX¿7êŒv½¢_&‚CkvÝf‡ÚÇ<5;š® òÀ|gáÀd&Ì·›ýÉä8xðr†Ç‘‹³w-†§xGl–Ùêß-„Q´Ò²ÑVõ8v”¯}Ù(sÀÑœÈ4(ÂûÐ 2PÍút©ö c€É#B69 Ë,Rƒ~ùè®3"yT`,nÁ:{"j4Œ³ª²¿ +A{ÒÜ<šøGŸHxФ¤Rî´ë&/ѸCÜKy|(1wôö2S&Õ–Æ&cÞaŒ7þÜÒ/'Hj-Œ)ªÜSæÝuÑŽ{lõ2kQl5&ùpÉ3 ÷LõHUÒ„¶£k仕Á Zà\æa/Ó©ÄÌ Ë—ä©`ñÈFTÅ]G—[PIk"࠲ѼƒUÙþ3Ks `RžLiÌ1‚Í%? )2 SÇ$ÜühAÖúLWÁÅÆ„ + ½;$ãnÁÀøç†{Ï‘EŸ>y §pvÜWî_ "ÒÁc²€(Å—l½©ŠsÏ•b2ÑÛ΃XÉ—b5ãѹ8Ï}& …8‚Á„OZ–spÑ©dzÊòDsXñ€GØŠqÊqkoaxµÛ’h›ÜfŒGûËx°_áàô;¬·¥Ò%LdvAFÓy±*×YEcƼs_ ºÄÌ-eyîÛ^yñ‡‰ËT䔘+`Íݸ) |ÎÊ*[ºb9ê›”ºCù¶wTTVõšÉ(Œy_ZÈ}Ň0J4”–Û+¬º¬²üÑ`Ú±45áÏ#'e§ÆWš •è ŸÖ$€7¡)ÚÃå7œ9pP’†Rô +óÅk¤ìµÅ£ð0~÷]Ân ºáv› ‰Á +ô‘0é0ÞÊ,è ãøcð„bé3>3êkPTŸËÿ+G~m…Zô²qÐâÈ‘ÅQÜæ9‡‚9Á°þ¥¾ËI•N*ƒ¯n:êd˶©vQß!Ÿ’%÷qÅS‡+óxpÒp:×{§gÀÏ:ïƒFà§Öƒ"Ý6Q›UÆ1š÷ÜÆ* ®°ìºÉºrYVeg"i_0p²È¶UiD†±Š†%2ŸgZ‡Išö¾Íçܘ1°Âڮļá»Dâ¾.¿R˜£ŒÑö¬óÒy_pCQº_À\Æû¢ ²ew­XëójZÉë Dfìpæ8ÎȾ3ËRÇ_¡à³M¹’`nRuäAaš8ÞnÀÈ«€2(m*h:庘uͬ¢W31ÞCFÃWõÍéç^šhƒ£ª0Kª¶?2wG’)ÚwcFn…ËÂñö¡Ø–óm6Ϙª8*'øè5Þ—Õ+÷œq–»ª8øt6»CO)2ŒTꌌ…÷uB¥åñ|\w£ †¦èËâcù.JûB€"N$/†'¿¤DèGÕH~¼ íÇhਠ³$T‰<Ê¡c’®\¦„ÝoÆ(@ÍEÆ="δ+òÁr[Ç‚•ë¬3O90ØA +äà}ŪŸÇX÷wÛ ­´¡—+­ôæ¨Ø²ÿ7± Ä[.ö±Ïžt;Š-ø¦ãä¨Ø²„‡š%jx]ý–Ø^t$c›,˜ìB0—±Ã ½-â})3ž&~K3£ú”>,nÎiؼœÓè뾟çÞ +üY÷[[®^ßaÛˆ ßGãQEÖ^ç/¸j»ã Û” +9gÇÝ*S =‹›Â?Ä“f'‡ÅAZ èÞG6bÉ›uæT"7“}]íé:q»Ymë¨-לmÍ;2=¬¹/Ž°`„Ü÷Ñk`ÁðYÏÿâñmA‚‘×LÊ 2 +îû¢gßq ÙW"L 9hÿÌ(Iðóe+ê…ß2‚X§‡?á‡?Éíó6}³2a·Žáë˜Â}³§oD¡€dÛnšÓ÷P qNN +ow}¥§&[ pé=¦ôÅÅ t’53Nœh0Ü'qÒ[´{é_ç§1·­pîÅa=—ï.no'ŠçR츶?'ó|G~Ó¼ô«µáË=iêCÜ/)½@ÙK!•’øÙÍÝçmϯþ<õª÷endstream endobj -1541 0 obj << +1562 0 obj << /Type /Page -/Contents 1542 0 R -/Resources 1540 0 R +/Contents 1563 0 R +/Resources 1561 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R +/Parent 1560 0 R >> endobj -1543 0 obj << -/D [1541 0 R /XYZ 85.0394 794.5015 null] +1564 0 obj << +/D [1562 0 R /XYZ 56.6929 794.5015 null] >> endobj -522 0 obj << -/D [1541 0 R /XYZ 85.0394 713.4234 null] +526 0 obj << +/D [1562 0 R /XYZ 56.6929 713.4234 null] >> endobj -1544 0 obj << -/D [1541 0 R /XYZ 85.0394 686.2623 null] +1565 0 obj << +/D [1562 0 R /XYZ 56.6929 686.2623 null] >> endobj -1545 0 obj << -/D [1541 0 R /XYZ 85.0394 478.4096 null] +1566 0 obj << +/D [1562 0 R /XYZ 56.6929 478.4096 null] >> endobj -1546 0 obj << -/D [1541 0 R /XYZ 85.0394 466.4545 null] +1567 0 obj << +/D [1562 0 R /XYZ 56.6929 466.4545 null] >> endobj -1540 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F53 1017 0 R /F41 925 0 R /F14 729 0 R >> +1561 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R /F41 935 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1550 0 obj << -/Length 3201 +1570 0 obj << +/Length 3287 /Filter /FlateDecode >> stream -xÚÝZKsÛ8¾ûWè¶rÕˆ‹ ‚Ç<œYOÕ&3Ž÷²³s %ØbE"5"eGóë· € DÉÉćTÊ%³ñn4¾n4Ðà|’©D¢˜äEšdŒg“ùú‚M ìç îêÌ|¥Y\ëõíÅ?ßÉ|R$…jr{õ¥¦5ŸÜ.~Ÿª$M.¡6}}ýþmq9›~¼½ÌÓé+üw{ýñöúÍÇËYQh1}ó¯W¿Þ^ÝP-5¤×ü͇÷ï®þÏëàÃ{ʾ¹zwusõþÍÕå·¿\\݆ Ä“äL"÷^üþ›,`®¿\°D:›¯Ý˜y…ö­Q–Rɲ„Mm|îD³.[P*Z Y¯¯âÔ"Lû6Í0ÉiÀ§¥©GFR0Ñ,¬ÚH×VŠç½hXݼÈ.á—x2“¶1-ô;°zXg$Êûή^æm²ÕÒmY·÷>¿q_Ë75ÚlVû Ó ª¾ÊnfÆ´žÓV+$a‚¥~4–öº ´Õݾ’·ŽH-º6fÑ H%BºYØ¥—(q—27̶u‰õÎSV_Y†byDÞ’ÊBB©!Ò±Óë«ãÇu±Û½Nà €\e_§›…æòX7A^­¬uÏA sÓ¶$+HAyí²Ù­D?à¼2EF ÒÎXçv†DѪØM@ÃÒWóå RN˜¯Ìr}4q‡“;‡'”­lÆܨÑ–9c^¬˜»ï«)¦7ˆ‰¯”$—ÙP’ÑeUlgBëDgààûjÕÁÌ–(x~boQ"Ñ…äÏ9`úä¡ã}îZÓö½[¢6ÝS³ýD‰»}ç²òä¬SI; K<6ÕÂõAÞÞ|Yu&ìô³…Ù˜zÚOuÈ'°µWÕC=£ùkp¦…<ØqÖ¶‘HÅ´mèÛ-K—Sù/ªd*­_„éõ΂(ôÉo”/ß4m[ÝÈÒô ïTÖÇHíŽë·ÛÔm·©Ûná Âs%UÝV ãy4ÄR ðpìƒÝr›ë¶{°íkÐ,¥9ÖJD­ -ò_!˜)Q^IYÎ¥… oÐ0×ú°Øp0`[’Œóg£Xz„èÔú×0Ⱥüd¼ôòÆÌ»rþi·qó¹ïù±AÏáÀc—K«Ö©‚ÈγtÌ EýA0(µÓõ 6~Lý‡§[ mp8#§×µ$Øž‚»£„;¥p:SRû3ª;jÅgTlß‚“qêx¥•tZs^µâö„ªÒ`&:øµ”»jì> -(WÌiûÞm~UÓ‚‘VNY±$xÌ ãzk HÎÎÚ6„ù¾œûBò©”EúÖåYI*ô5;×ù·Ê„»ø^EĨõó”=LA‰ŽO9Ê”®êùj·ðuí4RkÞìjØ?;âUÞ\õd¹ãx4ëÀ×I*hÊ ¹!áZLnmÊÔû~·ò' £Ã‘;ÕÃïΖT;^* ÐÒá¸j¸Ñ¸®XpÔå¹ÞKgl¨0¸OͶúË÷08T—ûfµjž‚ûþ8öCN×àv$W‘«I*³D@|ÑõOr¦†·#«‘ç5 -vê³×3ÔŽAWŽô-†]ÍüŒf)¬zŠNQ¸y‰•XAkÃÄÁz1!¹»)ƒ„vcþÜ™–nXb™I–'™ƒðmL‡.ŸáZrthx6d› ”Óz·¾³HÍɈc^ÕÏ Roߤb‚§› -Bã1¢/¦$¯ŽM?üúæÃÛ«c1 s*ø ŠÁ"É&³þŽíA¥Ô°[æ"{•L$9OÅ*Û™meNƒ2à¥@yžé”1×”2—”H[Ͼ=(1õ§›’MØ= ¼ í7ÛoÌi0¾œ¾0‚‰Ö*ûšù'Á˜±¤`ú0Ê\')Ëè2ùî{h¾ŒÑßÆsƳL0¸¶`L`DÁh¿aJàŒXdÁˆÄ1Ec&”#Q­=e"®ól¥¡ìþʳÇÚ¬Üåe2ù;Òoø ž0 ÉX¾˜¾3X¦/ KØO(ï3°„Ó„–˜òÿo¸Ÿµ6ÃÔe=7_ŽÍhÀÃæÙIôØŒg1À¦`Sy>¸ËB¦ÊÃÝŠ¢¸™á3’G³ÁøžŠÜiçݲ=uÙÝžAô‹Éîv8„RplQÏ Z2É„¤óñß¿Äñ/åsœç;€xÀx âT¥ˆS•y‹µÝJ038;{êñ³x+`ãR9§›ÃÜÝaR†w.0uì\Ì|Ð4ŒjÇßô1^Nâß ôS°F‚}Íöä[œ„>8–«g õEV‚Þ€Óé ÐÛ×îNâ¦5gn$âA¾ïûgï±sNþ6€/øÛ<'òÜ,½¡Bmi¬DŽ4æ`ÄvÓ´£@­ºê«eON3 ÷=”˜K1T,±÷w¶ìøgPEë™c j\;¦^mׄ{;©)Ôˆ_Ò/ æ´$Hb`ä®lá :˹ˆ}ô1¿è+´éÅÖðûÐ&%rž?i¢Šbðbêèå”Àc›–ø¦%ÐiqwþáOAlL’”_a¬UÀN~×ÚÛnæîÜáçüuÈ þ:Òñ+sa%øΛÕÊ’˜¿Çž—ÍSMäÆ÷áƒÔÂ]¿áC¡Ì…élÓhØeéÆ ¥å®[6[|*5ž0î’§>T‰lÌÚsq °ÒJù·t™Œñ„.D\(ö¤cíÎ’þ¹ÁÞŒõêèPŒ€2€þ·Æ pp­ÝoƒXZöÏ‹x.¾#¨º%e‚ˆªƒÇ~A€°êd ­N»è,…¼8xuíúnt›—6œ:¸9?èÑy„ñ+(8 u!N}ïŸ5„æ¾Ü­ºuw§ÍT¸•ðýJɇ/ËŒðÔPFwˆŠ@Ò{°ª öÈ(ØÓúÈñ …ŽA*¦jWRµ¾7´o²Y•”ÇÝ3Ia'ÿ&í¹øöÄJJiˆrQE¢ŠD^Ü`-ØÇVã}Pÿœ‡'ýDfý»¨Cƒ,‹>°_c͇Ý6„Ý´{„ƒV™»TǪ‹þ` ¶¥¯{ÞÖtÆž1¦jåŒjÅ7™Jã±Â7"šžvi1T Èž/˺6+*t/i4?%‚4ÃÇŠc¸nÆ”UgIž µ1.h¯iÑ-[ƒµÐ„, •CF¤§£çuP÷îÖ˜SoqU–H¬ƒe§¢íĈ›±—ÇQõÓ¯d]o -wù—Äìä!+œ[ñ¥1/G›Q¨tž…£¾¬%´ŽÈ €]ÅÄ#c²ð:ø›*÷Ds¨µç>츎)d^«#Îý‹æcÖÿQ(Tendstream +xÚÝZÝsÛ6÷_¡·“g*_ÁÇ4qz¾™‹[Ç÷r½>Ðls"‘ªHÙuÿúÛÅ(QrÒø!“Ñhˆo,¿],°Ë' ~|bòŒÉRMŠRe9ãùd¾:c“{¨ûùŒû6³Ðh–¶úéæìÇ÷²˜”Y©…žÜÜ%c™ŒÃ'7‹ß¦oÿùæ—›‹ëó™ÈÙTgç³\³éO—ÞQIIŸ·WÞ_þüŸë7ç…šÞ\^} âë‹÷×Þ^œÏÊÒ诒|ß7ØÉ÷üxsùöãùï7ÿ:»¸‰ HÉ™Dêÿ8ûíw6YÀZÿuÆ2Yš|ò–ñ²“Õ™Êe–+)CÉòìãÙ¯qÀ¤ÖucZ.M–QŒpMð çY™çbÀ¶¼Ì´Ò±Mg2+Îgœ16}³XÔ}Ý6Õ’ü¾^ZŸj7«ªïp½0ªLö‚MfBe¥âÊ wٜϤdÓÊE¹¾õßK‰®¯šEµ9çfºðUöÏ~‹cæÎM÷dò°‡X\úÎÛõºÝ5Ã1«ÛzY÷ÏÃݶò“´ú.¶«õ°Ý_mã‡ùcbiÝRqq‘°¸—#òi sn(I”v™Oo€Ç"Åo3¦´€áp”Mõ4ÂGÁ3^pß„F¥ꎾóí†ÓôËg*ª«zYÝâ&¹¬oYy2«d;w´zR/÷†¯ès[7Õæ9mï1ã@Ÿà… !™#‚Öô進º¹'À$‚÷ŽuÓÛMÄÖ¢ê+JuýæÜL·ó~Kãøúšrs\-ç|ú•;ÖcÅí3PnUm>'|Y½"šÚÇHƒ &–mµØ•Ö+›Å­.²R +ãVö¡"J|ÁÏzS¯cDɧÝ< ¢,6"aŠ@DiD ~ûqp2SŠ§ÁÁ2#K½‡7xG_ûçÚžóé¼· ?[Kß[OŽm즊ÕwÄŸ-ÈÓept1„P1Âp9 ·€˜¸D‘.Q”™Tyî©oª•]Ìæíj ÚÅMr¸^˜Dk¡|h»u‘¯ig„rDÃœ·¨KžCÖíK·þ{·×eñ DÔsÊ ˆ-ýº§"ÇTl¾í[àt=¯–€,/*c¬(‡r0Wj ËY}GévåÁ d¢\C:”uk;¯‘Å¡72Sjy„™pH ŽxYUHíÐl'°{ü4"Ì„>íµÉi§ی̤a¥¹Òé¶ -a«xa|+T¬~]¤—!öx2“Ž16l_ªÃk‰ê®wÛ—ìÄtS5Ý](oý×ÑMÖëåsjÕÐd»=c»=/訂Œ@ÁT˜©ðBÚ ï®QP˜ŽbéÆÚEGI€*ɦۅÛÚy…G”qI(óÓl:ŸYmCÊ ,Ë‘-€»!™…„RKIOÎN`==~ˆç±ÓëžÀ(ô +g‰à@8A‚Þ,z/€!sÛuÄ+ÈAeÝC»].(}ëÊ5i-È{m]¸RŠvŶ¾ž? †!é„õʼ0 ÷8¹õxBÞÆæÌÏšœq›sØŠ¥Ï»fc‚)Á bâ 9Ée>ä¤Gô}U7Û™0&39XÀø¾Yö°òûdÙ-;~cám5ÿ´]ûõÜíèqQÎáÂã¶kë΋‚(2Îs5f†¢ü ˜ö„ÚËúž„G?&þÃÛ‰«ŠŠ6Zœ‰Õë”ZuW`ïháoGŠeBKã/[Ê_µÒk%öïÀÊ8v½2™.Jº­y³ZswŸÕiP=ü;*]¶î… +ä+–t»Ñ]yÝІ‘Ö^X±&šÌ ëGë,pέÚu„ƒù®š‡J2ª´CúÆ—9Nj46{?ø*„Ê#§_eB¨3ô´»LAI¯9Æ”¯›ùr»mÝ4ÒjÞn8?{¢U–A]@êÉÆ‹Çál΀¯ç<40T@|Äï=²¸•­ï»í2\nGþZ¿¿[Rët«@+㺋àFåBø`?`ÂQ“ç&AøŽ;cSÅ À|ºo7õ_at€Á¾¸ÜµËeûÍ/0Èq2ºö^GÊÜL”Ì3Yrýy¯#<+˜>Žü­N(8¨O¾ÎP?Cùdè1jæ4S°ç +M¢øî28åE&%hYº‹ Éý; ¨«È²kûÇÖvô¾’rL«JÎËI:Ã×ч|j©àÎ`ÌjÂOQN›íêÖÁ´ ŽeõnI{÷á#U6ýú\jŽa±™tlzõËÛ«wøTi®_‘É +=™íؾLJ'e!ò0ÉDVp%F0ùëÖnj{’é¯ÉÓDGH¦D;HÊBFHbÚðÝAsø¹Œ;¾0á`7€#aýÚ?%÷Ïk{Š¯Ç…oŠ°Fç_²¢Ðãs–•Ì¼EY˜L±œž‘¯¶ý}ûùPL&ø:’(ž$:@q@´ƒ¢b2€ƒn– GCÁ»ôcwmx>˜WΕ?ðÚìè/&i\Éû#qBjâ {Wm—ýÈÉãöÕd¥R:Øa\©^`f?¬Qà O-Õ¡g‘R©óQzG#6uŽF™8w•!jaàE U‰éUãkê.Œï§]ÖˊʸA‘äò ‘{ºãž§´ñNPïÑÑ£MéA´¶rA%Øk<¨$×YÁcxÎn!³]PÞN]po¹ *i°åýv]¾Æ€!„uî}:è¼÷žG èèëc+ÛÞº ôç;>c„wÈcü(ó7kŒO2WhÄP4 xþP5]R¥â2ü lŒ•‡,ðÃŒ +hÍ¢:éc}Àˆ¡Mwd ö +°‚v =àžIb;¡š‘µÇâÀužIá;Õlî'”¸ zßµ>~ ø6îÐ&?kxp&íÓ‡†PºL98ˆb›“óïät ³†,4*Æ­ÌÈbLúW‡Çïx‡ŠÐqÄæ g­' +‰7Å¡aâãèIÿ?äßGendstream endobj -1549 0 obj << +1569 0 obj << /Type /Page -/Contents 1550 0 R -/Resources 1548 0 R +/Contents 1570 0 R +/Resources 1568 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R -/Annots [ 1555 0 R ] +/Parent 1560 0 R +/Annots [ 1575 0 R ] >> endobj -1555 0 obj << +1575 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 62.1828 116.8967 73.5749] +/Rect [84.0431 62.1828 145.2431 73.5749] /Subtype /Link /A << /S /GoTo /D (statschannels) >> >> endobj -1551 0 obj << -/D [1549 0 R /XYZ 56.6929 794.5015 null] +1571 0 obj << +/D [1569 0 R /XYZ 85.0394 794.5015 null] >> endobj -526 0 obj << -/D [1549 0 R /XYZ 56.6929 769.5949 null] +530 0 obj << +/D [1569 0 R /XYZ 85.0394 769.5949 null] >> endobj -1370 0 obj << -/D [1549 0 R /XYZ 56.6929 752.4085 null] +1387 0 obj << +/D [1569 0 R /XYZ 85.0394 752.4085 null] >> endobj -530 0 obj << -/D [1549 0 R /XYZ 56.6929 542.1781 null] +534 0 obj << +/D [1569 0 R /XYZ 85.0394 542.1781 null] >> endobj -1552 0 obj << -/D [1549 0 R /XYZ 56.6929 510.0725 null] +1572 0 obj << +/D [1569 0 R /XYZ 85.0394 510.0725 null] >> endobj -1553 0 obj << -/D [1549 0 R /XYZ 56.6929 447.7453 null] +1573 0 obj << +/D [1569 0 R /XYZ 85.0394 447.7453 null] >> endobj -1554 0 obj << -/D [1549 0 R /XYZ 56.6929 435.7902 null] +1574 0 obj << +/D [1569 0 R /XYZ 85.0394 435.7902 null] >> endobj -1548 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R >> +1568 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1558 0 obj << -/Length 2647 +1578 0 obj << +/Length 2644 /Filter /FlateDecode >> stream -xÚÍZÍwÛ8¿ç¯ðQ~­¹üDqöÔ¦I'=¤­ãîÎÛéd[‰5+KKvšýë (YvìÊù˜÷ü|‚ ð¢EÃOô¢€qeüž6> ¸z“ùïÝAßÇ3áx5Ó Íõ~töK¥{†™P†½ÑmKVÄx‰Þhú»wþë»/£‹a î…¬?Bºþ@CóÏ×—W¿ ßõµï®>_yxqy1¼¸>¿èŒ‰$Œ÷[ÜØ›r#oFWç7ý?FŸÎ.Fm#W¨ý_g¿ÿÁ{S°õÓgÊDAï^8ÆÈÞüÌ |¥jJvvsöµØêµC÷¨ˆ‘Ô{P“bja¡’Ê¢††ÂÌýàœ{£YâL­â*-«tRÒûeš%h,ˆT-‘¼7>3¾ð­°fx•ü¨¨u[,ç±k—;B§«ù‚Zãä.Íõ>­fÔŠé‘¥yò¶nþ7ùÅé!¶õš%#«Ç›7oö›ñ¡™±aùÎn´‚P2¾±ßL¯7f*®½|5'Kj§9>#o/û"ò’¼š%eRºN÷Œé@äSâ›Ò¨oyúcPV™“\¥ó¸æ 0\IáÍ“¸\‘`7"v"ËdRäÓú%Í'N§8_ÅËboÑ*k‡`&¤µCÍ2„Þe‘eÅ}šß(>øof}¦ŒŸZh>cb)ÇQÜÒsË»Àæ·E_xèþ´ÈѾôîgéd¶-oWÉ]±Lÿ‡–áÀØuL“r²LÇ–ŒóŽ‹uÂȸ‹¤lYD9ÀÀÉþ¦ "öëx^/’d¹F÷ï‹4àîŒ#kÅ@ -ÝÒ[„ø³Q%uYxበ-—¨±T^Ò Þ*Nsr¼Wv -½í +t•WVYè\ÇÙÊñÝZÇ[Œkü@Ô´žò*Îè…²ì‹%T",(;i ˆÆ&N³$Z¼ŽÓ,gŽÅ©Uº¡—5Û˜b}V}!„‡†kÑ°“P¥À>‹× Ñb"Ô†@ qÇ@’‰–QËYqŸ-ÍkéÉ>Cw“ØwÎeqY³>Ê2Ú.ñaOBKh¡H«h˜vkI÷³¤V{‹£I@@L t -¹' Ó,oAäªVfk ,Ð|KfDËÆFÔëQ¥6™ÉÈSÙÏ—ò]JÝ•˜7<‡2³è5ÙTÀ„àº)gu1Û㼞ãê˜RW TgF¤T»ˆ´^¹šÏcL\ÔµåeÕV;Ð+ÒiO‚4C„…õm±ÏáB‚€²ÐRG.bº'25«ZSÒëí¾¤H<]r[Í‹Õ¨^¶šçÔccGðšU@²mV ¤gÀ`Jôòa>.2bÎm"Ä–ÕFˆÚF Ôé¶J`‘obZ:vRº™šÀÆZ†V¥¼–yÄ24¶Ú¸RƒËòüd’”¥MlÐ fP#vÝ¿ŽF_ˆ²% z&³8Ï“ 3’Šê-ñ–éÝÌ¡g¹ldXñõ.]'NJÁ@ëJ—”ÒlzÒÒ Ûä8„Îf=ÝMè´E¸ã¬,ˆRg.ìÌwDm™ˆ W×xUÙ)ÂÖÐÔñN‹Éj™Äé°(Ê2gÔéÊ) (3Äe_ØÍ‹iŠNœST (g`cœT¶a› žÆã4ƒ|+À…ñÞM§)¶¹ 8!]ÛµÍyü@ B‚dÒ³µœ¦DIÝôd¶(øqɽÏÇïóÕYh9^8G]û®™P>í¾-¦q•P¤†Rº@éF÷ÃCÏÓ‰ÛèZ/„·¥ú©Â+Œ`Qgia&´ÑnIã‡@ü i@y7ïòò˜<@ƒ€e’W‡sJô.à`aWÝ‘bRúaÁÈžÀ–«/™ˆÉQß`´E^=¢~Ot£ìÉâjF² P-˜ ߊçOþäðûéÇ‚([zž,–AÀ´ÔÕ]†)áËMpy48åæ(Ð iwÒeZËŽ‚.|ÍT`DƒË±ÇÕ>>¯v ÙÒòµ“¢§}©¯GìG*‡ DײVó¹¢ò »Ì›•½,í†òk½ŸTÆÔiq•ÙDéswgkì_„ðQ’ØÛUæÈyyßÜ ã‡Û}¸…‘ó$¦²ö袔î_Õæk­jîCét€ƒ.ýÑGÑß{”wýùb8ü<¤—vþv\ ÿÞ»Ë,‰í5y =»ĆÓÚ¡72"ŽÜâîµ#Ú?_ÍIvÜ!yĸ¤·<è…Aù…ÍæJ0 ;x|.ê{ûbUn}),·ùZÿŒ<ñ­hzYtþ}©J¾1aGî4 "%ëxÇÃéQÛ¨¯ÏOu¼Óçwwúø°ÛŽõCè¶T?ÕÏ^Z‰Ttäe°Pº›a@÷ºˆ¾ ýÞÍuüš`7Ÿž‰zˤ—¢1Á¡ TÈBùûþË{.9ö¿À›GcŒ¢Ö·È6ªŠ‡°áð€I^ÑD¤Ãáþ4ì¸ZªÿHIÝSendstream +xÚÍZKsÛH¾ûWèHU¢Þ~ðÕ³§Ä±3ÎÁIdewj's $Úâ,EjDJŽ÷×/Ðè¦(Y +åÇT©\e5A4ø€úAÑãð'zAÈB-u/Ò> ¸z“ùïÝÁ»gÂò Ó Íõ~töKõ4Ó¡ {£Û–¬˜ñ8½Ñôw/d>ëƒºþ ûpïfÔ|ïþ]ÝŒ®Îoú­céÿúîËèbH\a«#Ql÷óÏ×—W¿ ­€Ï×D^\^ /®Ï/úŒ>]ŒÚF +®Pû¿Î~ÿƒ÷¦`ë§3ΔŽƒÞ=ÔÍB%UƒŒÜι7š¥·:©³ªÎ&=_fyŠÆ‚HÕÉ{é3í ßkº×éšZ·åržØvµ#tºš/¨5Nï²ÂRï³zF­„~ò¬HߺæÓ_¬b[1­dlôxóæÍ~3>4#6,ßyÀu¤ ”´¯áAì7“ÄG3¼b5§KjgþÆÞ"YöEì¥E=K«´²/íoB?D1%¾)õúVd?Uý[Éu6Ok¾Ã•Þ%Å*Y>³x‹V;ÓA BGœ!Cè]–y^ÞgÅ€âƒÿfÆgJð©…6àoB,Uj9Ê[úÝò.0dø¾ª¹,оôîgÙd¶-o’Ôé]¹Ìþ‡–aÇľ˜¦Õd™ Ç—딑q HÙ²ˆr€ƒýMAEì×ÉÜM’t¹F÷ï‹4àîŒ#cÅ@Š¨¥·=ðg¢*zeà…_T¸B¥òÒ¦#ðÖIVãà¹63PDÛÞ0BWEm”…—ë$_Y¾[ãxƒ1pˆš¹Ñq"¯’œÈ!‹Á¾XBõÑ9!‚²C–‚hlâ0K¢%ë$Ë“qnY¬Z•ízéØÆëë¬~è !<4< ; µQ +ì³d-!‚³0´‰[’L´¢¬‰ZÍÊû‚hYᤧû ÝMbß9—9Ä¥c}”'d¼Õ^ÚćoRšº@£EZMÝ";÷t?KÚ[MbfeSÈ=ÙfxK"×N™­>0?‹-™1MQ{¬G•þÙdvj¤? Oå?ŸBÈw)£®Ä¼á9”™E¯ÑÈŒ &šræŠÙîç.xŽ«cJIœ€ËŒH©1v+jW+Loós—¥´­ÚñjúšxE:-4¦‰°0î-×à<œ AÐ\@šíÈEL÷DƸFbí”%ÕÞîË‹Ä# ×¥·õ¼¬P êå«yAoLøîXäÛfB†K§D¯æã2'æÂäBlm„p6ÅeX9E¾keÙIHeGjbßÐL4*Næ3QSÁ¡jƒ3Rýd’V•ÉmðÌ Fb_ÿ:}!Ê–$x3™%E‘昔TìV5Ú[fw3‹žá2ÁaÄÇ»lZM( ­+cRV3*’¶Û&Í!t&ñEMÝ„—¦nw’W%Q\ò—Ŏ¨-Óà™Ò1á¯j3DØêšYÞi9YÍ!™XeUeãü^ÚŠ +ªqÙvóršá€ë(Jاµ)HئH¦É8Ë!åãdðC¡½wÓi†M:NÈØfúAsž>gÓû)H¶t:îZCðˆ åÓâÛbšÔ)Ek(à ”n|?<É<›Ø…¯‘ñB€[ªŸ.ÀB hÕ±Ã:`¬² ñ¸’ònÞÕ1Ù€:Y«´¨Cg•:ñ® +&bŤôÄ‘Ù•-WÞC—£¾Æˆ‹=×£‚Ot£ì #F,Œe¤‘`2Ô~)îJù“Cð§‡`¶ô> endobj -1559 0 obj << -/D [1557 0 R /XYZ 85.0394 794.5015 null] ->> endobj -534 0 obj << -/D [1557 0 R /XYZ 85.0394 769.5949 null] +/Parent 1560 0 R >> endobj -1252 0 obj << -/D [1557 0 R /XYZ 85.0394 752.4444 null] +1579 0 obj << +/D [1577 0 R /XYZ 56.6929 794.5015 null] >> endobj 538 0 obj << -/D [1557 0 R /XYZ 85.0394 549.5629 null] +/D [1577 0 R /XYZ 56.6929 769.5949 null] >> endobj -1560 0 obj << -/D [1557 0 R /XYZ 85.0394 524.9842 null] +1269 0 obj << +/D [1577 0 R /XYZ 56.6929 752.4444 null] >> endobj 542 0 obj << -/D [1557 0 R /XYZ 85.0394 417.5407 null] +/D [1577 0 R /XYZ 56.6929 549.5629 null] >> endobj -1561 0 obj << -/D [1557 0 R /XYZ 85.0394 395.2295 null] +1580 0 obj << +/D [1577 0 R /XYZ 56.6929 524.9842 null] >> endobj -1562 0 obj << -/D [1557 0 R /XYZ 85.0394 395.2295 null] +546 0 obj << +/D [1577 0 R /XYZ 56.6929 417.5407 null] >> endobj -1563 0 obj << -/D [1557 0 R /XYZ 85.0394 383.2743 null] +1581 0 obj << +/D [1577 0 R /XYZ 56.6929 395.2295 null] >> endobj -1556 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> +1582 0 obj << +/D [1577 0 R /XYZ 56.6929 395.2295 null] +>> endobj +1583 0 obj << +/D [1577 0 R /XYZ 56.6929 383.2743 null] +>> endobj +1576 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1566 0 obj << -/Length 2456 +1586 0 obj << +/Length 2860 /Filter /FlateDecode >> stream -xÚÍ[[sâ8~ϯàÑ©´º_Ó¹Ì25tf«kfç`gâ©Û$ýõ{dÉF€ÁÐSTWµ…Ðåè;ß¹è8†¤'$’†šž2 LDoòt‚{Áw?Ÿ?¦_ꇣ>NþuÅTÏ #©ì4ÂZ“Þ(þ#’ˆ£SXGŸ×æ´OŽnG§ŠGgö¿Ñàv48¿=í£itþï³/£Ë¡%ƒ‰®ÇO?¿¹¾üüÛÐ/psíº‡—W—ÃËëóËÓ?G¿œ\Žš„‡$˜YéŸOþø÷b8ë/'1£Eï>`DŒ¡½§.œ±ºçñäöäk³`ðm5µ 4Î5`ÈôFœÍ»º0ìê›”!cå\Þ´/ RŒÁ‚Šs„ ^¨’@ RÃ!ê)ad”Ujøš¿ “û$Ïǘ‚)DÕpاκϒõŒœÁQÚEXEQbjÊ\Ïó")÷` ¥j…1¶Ç2Æ>¯o.‡Ã›áÒ0 CQÏ|MËךfîË1j#‹c1ë̪:-—ªg+—{ÄìJNúéÆc2†¸d•KveËû\æ’í.Ù®~%vŸ5e{ñ[|7Ùjü1\«QÝ}ÉzÆ&®I&(ÞN6i ÒBòšl·à÷ÁsüçêTˆèlð+`¡±Œn¯Æé>>˸Â@è©h#lËÃ&6 ~ÝŒtxˆá² -59$Ôš#F¸ê€Z+d0iBÁÕÍð3X¢…D*@ø,èPûµ·ˆ|(`C匱RBÔÆœu«2\’Æa~»¸ù|6€„„TÈÂç}Â-a«á–øp ßÔk#÷чVh­9@; `[ˆmw‡1¬eã ãìi »® ) §šüc¡5TÂñ†VI!+fºËÝ Š0j‘ŽMæ0V_”Eë×øëždy}H'žãyáÃ*-W"Ém0r™{Î’ü>ËŸB¶Õ‚,Æqº"3QVŒ«Å8v‹A÷1¦ÓØ÷U»Ö.%Ä+)¡Ò5oaÜ:oÝÊïämžc•¸”€ù?GÜ€‡ŠÓÎ+%öY²ž±‰¸|‘’].P& -7±ãb>{L'ãÒ*›2 ¡cÞBL­yk›kl£æªmË2yš¹ÐbÇdî¹`«Ÿs7/]#N‹~o&™OÆìR²‰ñÔ=“ïiQ¦Ó¿Ü§ç¹½¹O. µ­J8Û(ÆO¾5øâŠcOÞ⧶gY^þÂ1^­þfÓY .ª>MaAÿuù6KÜ·ckJöÛÉã¸(|ߣÛf¿¹ïî’JlÛt”Íúm†;Á’lNUÛœj³9åð­žíV^_J©¼"ãFÿ-f©äÚÕË® æãÒa#¶Wçe´i|­?f(?Ôö@Z£Ýn|B¢†79òEžÍfÀåÝÍM(¿w ow¶YQÛ6j»³m0£%‹±}Öbì3ù”j5²"}±žMçOw• C»R™Ñ¥ÙÞ àÔ“žÏ`¼¨¶áü̯L¯…àµiY[ª-ÈòÜ[PÓ§qôê溋ù]‘ÀÞÓòñÍõ8ƒ®Þråd²ÍŠ¼—br£ môoT$§c½fC²²¡ê¹d-Ϊ ¹€{*]ø#6ÐóPFtø$k‚°’™‡›œ$'Ô·¸PÎó¤Ûˆn@•ô¢öáLÊ辚îÔoý« 3D3¤g†ØTØf(Éßô~£týfäJŒûÑÙLó¡ÒðÃW¸4ˆP";È ÀR°vÐ}»Ï‡ÉóE6Ý Cë,Šæºû?;É•+sÈqï]÷q’=Í“Òûv<¤ê𥅃â)"Rv” 9\Ñ”`Î'ÿ6‹!1¤à.Ó¨Ö*„=Ž ^ÇþÖ± Ë@Ê#Æ. ”ŽTÛ¾2€C™%,‹Ù;Á\TV÷@3óˆÑd Q!Iš¶ðÊ© -à$w«&^¼Az‘NvóÚGßëmE4õxˈqÀUº P¸Ôj­dèn®³Í=œåB´#f$6ˆqÑ•ˆŠ £ %5‡ê3L‘”zaJÌ,ÝB¨Bõ¶/Éýâöíé.{„› 74ºHŠIžÎJ_G ‘³©'ÆÎ^ìñ1¹-B k}À˜¶€‚HMÉ&¶ÕPÀDÀ.½ÎÊôþíf^¾ð#•àu!lðUT›Â,[ô®J‘LK´½P¬Ã¢wP"Y«…ë<ë@OSˆ/ܬ 'wAO¾ ½@¬cFOBò‰é@OÁÚ¨½ÁôCÔóõµ$}iÉ - Ò³ H8¹îÀP@ta\.cøîˆáB¸cæ!§HÚ…!‡0« 0&wC8…üÝ•v7ÂèÒª-03Ž rO¦dŽ¹8‘ «7gû˜âÏáßZt8Ä@²c¶e¢‘Ñ´+SŠ„4$pS~€dÇÌ@¬¦ª+Œ$a.Ÿ}»“ç½(h笕ä¶p ×ÃW½wT´# £‘Z-Á·÷†/”ë˜áÓ ZÒtÀ§á^ˆ!µ­@yû{ÃÈuÄÞ(WZÒ†‰X¸æKðíþýá ä:fö ƒ(–Ñ—HŠ”aÍ«ÛùÄþD'~¿¯½ÊÙôN¢°+&ñVDQQ®„w *0ÒL×€n(V¾Í µË”NƃæÝ«f?¢äŽ -1àÙº™ TíR7«^ê+¸ec¶½n¦9¢2øÙ A̗͆I‘=¾ÔšØµRÖÔ〠Ì]WeĽNnîú›šÅ¯Œ@íL‡…¶ô3_L¬¥²§ÕzMvȃ(“´Møÿml ºendstream +xÚÍ[[SÛH~çWøÑTŽ}¿ì[`ÖS3f+µ3ó l4k[F’C˜_¿§/’Û¶Œ0xS.Ôêë鯿sk ÒÃðGzZ Ì ï)ÑÀDôƳÜû +m?ÐgPwĽ>Üœüã‚©žAFRÙ»¹‹æÒkMz7“ßûÿõþÓÍùèt@îKt:÷? /Ï|ñW—ß~½?U¼3¼ºôÕ£ó‹óÑùåÇóÓ1šÂxÍÆ^ßØAaäõÍðãõéŸ7?Ÿœß4ˆ7I0³Ò?œüþ'îM`¯?Ÿ`ÄŒ½GxÁˆC{³.œ±ºfzr}ò¹™0juCÛ@ã\VTõ#NÈîUý +V Eʱr®/:0`…CàaƒW‡@It0’ô”0H2ÊÜ!|.žFé]ZÉÔbCX4„h’>Øw^¦E––§Æy¿8%ºŸ–Ëi•N|M6[¤®&™—iaÏÁ’aý›û,L3΋0Ó"ŸOJ+¬6 !¨[¶ÊýqV÷i1ÞUˆk)‚ˆÅîÍ0‰¨`2tçËy2¹™ó;ÿ\xQ¾eù²ô5ßÒ¢Ìòy¹Þ/b)Ú¤”` ÎD/>·/ç a S˜@°×}¦¬Gì` ÖˆÒ.ÂÀŠSæò{Q”iµ_(U|±5–/öyyu>]ÖºÊzäcVÝûÒ<÷ÏIR%¨*žWÄlóÊUZ&¹g+“yÄìL^úùÎm s%È&“ìÌ–!ö¹Î$[L²U'ö€5ƒ£â{“øjª­Žñm´X1­FõåSÖ#Ú™&MTý<Õ¤1H Ékª]ƒ«ñï‹S!úËþõE’íc¯,|üƒÇ?ë&`˜±ÞbøËnœãM¼ •M Éá€Ö1ÂUÐZ!ƒIã.®F¿‚Z@¤|ÏA{…o˜ûX#‘«7¥ü`¾UJðÕ˜³X•@†KÒ˜Ê/gW¿¾BÐB®ð¾›%lÓÍ’àf¡¥žù×àR¡´eúì(0}m®µÝJÄ°–œä³VÝN5ùa.5>„cu©’B$Ìt—¡"O¡VAØxé`±§EYtñ8ù¼'Uï³ñ} @²,=_˜;cW(ÓÂ:!_™ûç"-îòbs­d.žÑŽzÌôs×sâ&ãØOÕ`Lç“PçV­+} ˆ7A¥kÖB¿mÖú™_ÉÚ"ÞÇ&mû˜ÿ8ÚF”8”† ^)±Ï”õˆvÚ‚ÓEJv™7À˜(Üx³åbš“Ê5e¢?‚Š}X ¾´f­-:ÎØBÍT[Nª*-¼S±}rÿ\q5Œ¹]V¾0ÉÊAkÆyÁìT¢ˆdîŸé÷¬¬²ùWÿö°´½úOþÍÇž¶ä„³…2™…ÒðS˜h2 Ô-ßµ­¼È‹êǸ›ýɱ¦?[¨wnËvçöÍ`+V;mr²´–@°pýAƒuµ›NÊ|îÒï‹)Äg>ìfuº,èN? i®¤¦ÖÌi;.‹Ÿz µM«A3n ‹eË¥ Aš’Úϒ.1;2ÔÔIx¾¨¼æs0]`ËÔ_£ƒ=†ÚIZŽ‹lQ'ÖT"%¬^­E .²¢0,¹Í—Õ¦¹`ŒCFrpÈD¤d.mðÅמ/Œ¢¼¦ÿ °­¼Ûó>‹x,'ÂH5㶯ë^-‚¬ã­Ù¬ %¢àÈ -¯`+èÛ§í@g`!7õe—‰âA¸ðãò†ØľÍfoº~07ÀC\㎌C¤kL{²,Òn7pGg ©u ¤ìß¹áþ¸m| d@¿íøF¸øw\ÆOòÚ¶Üí”nÐô܈Ñ8cîˆ9þu*Ø–l»ïÇl Pa …î_æUúOØ–²òfe{TØ&¤ï#£zÅü[6©M€§O¾µñš·Éø¿‰Ï…|Ó8Ÿ-’*»Í¦­XV=ùlÜÛh——ûìlóÆЦcõ.mª„)l¦˜%Ói˜!ñY^{0ûær­´5úýZÔ.B©zÓ¥+—.‡RR¶ù °@½šHï—Õ½KXÿj9Vž(ÖuÐ×îˆA’*± +OvÎ"uRr3ýKl¨/Dÿ1_N×<¦eî+ï$_—Í«PWyó&Dll`P žm‰ý»«7°yŒv%†ëYmiÅ"ÜHe‹ó¼ò…ÛÔ?] ϙÜAòA²áÆ:M«BåÜw[ɸõ8«lœî¶w±-9”½;ô…0“ ê/>wÛ;05ˆâïI¾Ü£ôá,Ÿ§/ {ÁÌ•Í]äßvÿ©Hæå'?¼Z¦• év¢Iz¬·¾ŒÃî;R&`CBJ‡Ïo‹ äm€ÒÅã ’ß;¾èuè Á ÖfðY‹â9ÉK×qwÇlø‚ _ñ\¼ÈÕO]{ Éy´XR°(ÂÈ,)x .iàø²ŸwΞ ãËƹel„b¨€ùžÅ3’õh5œ0¤0ïø­–…¨!$Âóeö²Ì=,d$ÛÑò¤¸éˆ¯Áé"Æ„‰ùøZ2–/$_$ر‚Ga³ÊðgM CLc÷!™|*Ò"}x ‚ÞPþ•Žw.GpómHˆžkß”•Yc V)Îî3ˆ÷w¨3X}ÔùIŒ±6pí‹¢W ªÅ DZN)89ؘýU$º=غE€ˆiêzÛoƒôŽ8¢þXŠB¶/¤ÖîÔì‡WàOcÜÿOfý +éF•Î“ù8T\W•·†CýXç gBÀ·q¡`¬¦êEe1®a›Šíaû¨Z|@5j6åï¼]i3k÷ë i°?$iðHÚ«ÒõÓì6‡œÒeÚ?ó×]UøikíÎNHIàD¼ÈÛ·1¬õÿ êG¤i§Û + dÆP°X@JŸÝ=]-«o¼Å¤Ž”àuþ9üÙ Ëlr\[”2Wh7|‘\‡…>E‘DwÁ§®ù|ò%ðÉWÁÉuÌìs—RvÁ')¸F#ø†ó7‘/üâ‘fßZ‚Š‘xÇŒ"‡€SÞ…¢ÀPÐë ¾…‚/ÑK'ŽD& jßõëû +D¦‘G¡Ø~q¶âBxÿCñN }põ ‘„Ç $…4|RýÁª‚w½z¿¯;!¾ð×a#ÑŽAèÁ´èôÉ„#£¨ˆÜG_… íØ ¢1ˆÃä]øaHÀ3û+õ/£Qú°혭û¸ç48’ëˆÑÓÊ~ZÝå“ ‹Ò5ðöaßÞàEb1xJ Aq—+V‘£_A¼á¾ØERq0-ä´¢ËK…ˆÿ 1|ñö/ë÷#E¥»ËAÄþûOË÷¸×ÉÊ—þ#Ôê_à cµ´˜Ð\=@|aç²pi³}O£‘дé‰þ?¥w¤‹endstream endobj -1565 0 obj << +1585 0 obj << /Type /Page -/Contents 1566 0 R -/Resources 1564 0 R +/Contents 1586 0 R +/Resources 1584 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R +/Parent 1560 0 R +/Annots [ 1588 0 R ] >> endobj -1567 0 obj << -/D [1565 0 R /XYZ 56.6929 794.5015 null] +1588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.4761 480.8577 413.3061 492.9174] +/Subtype /Link +/A << /S /GoTo /D (clients-per-query) >> >> endobj -546 0 obj << -/D [1565 0 R /XYZ 56.6929 352.0981 null] +1587 0 obj << +/D [1585 0 R /XYZ 85.0394 794.5015 null] >> endobj -1568 0 obj << -/D [1565 0 R /XYZ 56.6929 326.9775 null] +550 0 obj << +/D [1585 0 R /XYZ 85.0394 244.5016 null] >> endobj -1569 0 obj << -/D [1565 0 R /XYZ 56.6929 326.9775 null] +1589 0 obj << +/D [1585 0 R /XYZ 85.0394 219.381 null] >> endobj -1570 0 obj << -/D [1565 0 R /XYZ 56.6929 315.0223 null] +1590 0 obj << +/D [1585 0 R /XYZ 85.0394 219.381 null] >> endobj -550 0 obj << -/D [1565 0 R /XYZ 56.6929 102.2008 null] +1591 0 obj << +/D [1585 0 R /XYZ 85.0394 207.4258 null] >> endobj -1571 0 obj << -/D [1565 0 R /XYZ 56.6929 77.0802 null] +1584 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -1572 0 obj << -/D [1565 0 R /XYZ 56.6929 77.0802 null] +1595 0 obj << +/Length 3080 +/Filter /FlateDecode +>> +stream +xÚÍ[YoãF~÷¯Ð£„:}ØÅY{ÆR‚ì&yàHô˜‰tDÊÎüûT±y´lJ”Ö + À"›ÝŪ¯ëìn²…ÿl 4ÑŽ»q’(ÊÔ`¶<£ƒÏðìû3Võ×Æa¯ï¦gß^ 3pÄi®Óû€–%ÔZ6˜Îj"É(Ðáw×7n4æŠ'Ó‘‘Ãwøgz=™^ŸOFcç,žÿç݇éå弄¾¥~~{suýýOwÛß|wyuywys~9ú}úÃÙå´ ’QÜÿqöëït0Y8£D8«ÏpC sŽ–gR ¢¤uËâlrö±!<-‡v&)#Œ+1 K¤Rvûký+(¼¶ºdŒ8¥^¾ų# þÀD€HT*ÓLgÁD0¦ˆ´f`”#ZpQNÄ/÷«Éz6‹óá"À% ¼»þ/Kci±ŠÒü>^ù»ÕˆÙaüÇ:΋ܷäH1žÇsòs`ŽH扖շ‰/¤% €¨:Q) uTõ * ÑÆ°Ñ«(YÎ{ ·Ë€ÉcaÙªpŸMàCÍ ›øÿFÕŒ0íˆ0Þ˜;èfMhK¯lŠ0%+8LÄY!º§«6xm)±¤¯=#b“NÁYÄy¶xª§bRDE’ɬšˆólñ*9š#„h¸Ã2{¹)ˆÔü0Ô:Õ\Ð#Z@-ÑXK˜ mßîDµÏ `"o“¯ËOÙb„Cyé¥m…fÕ.¸äË8Ÿ­’Ç"ÉÒW~™‚8°¦ðÝoq£Z¨¿!f¸Mç„$%þ•}\Ç«¯Oâ˜Òz8¹zžìpÌ:«NVþâúŽ@ Á7¬’¸öµqZíÌBvL9øQey„à ¨”6€P ¡>€¹ÖBð|Šö)!3‚9]‚®î1KóµJRm†ww‡(¡SžD6Íâä©#Zµx¶œž0œ¦A¨¶=xRE˜rO}žú­x¬ž®‰+”Ûq³PåaÆùÔôæ—‹Û÷ï®!BªáÜ÷ÚÚÁ·ÓUIe ÉFõ há\V‘j&¨…~¾)5|wý#(¦²rx·%?}%Ž†q0«2}¤³' ©VD[Þã5$£\[º¯nïÞ_‚ee©“W—«U?’Í  X;a«†Š×pÓ¸*‚ ¸o‹‡x¨e+ÔFÆ >ßÂr˜0^•f«ƒÜdÈê k¤„«^<¥"BYÆ//n&t?ƒÆ®¿QE)üamôµ­2×UÚcËà £™¢eº'z+Å>z¿OòeTÌ@)‚Ø}±~Ü#|·£ÞÂC~OØØ!{´Bö Ê$݇ð鈅¯Öé,*ây?žÓ‘CÌì°ñF\ŽOX[!‹tT÷vêˆtÂö£e<Šî³¼îEÖ@èæñ"þaá}–—§‹% XOD—Î%Œ«òö]` æÌ~:òcë5=xE[L>Æ«ûlµÜeÈäéš»„LÒ=PZE 8ŠòwŸ²U±† hŽ©Í}¾®×E³:HeEä/gYZøè¿ØoÀù±ð +— ÑþzÄV|¥†â‘ö¸SiÑÜèßI6û²_¼¿ +":ÀGÙ0Iýoö§IúoÚÚs þÇÜÉám¹@ ͳl¹Ìª¡ž^”ûu»pÑ_yis·ðŠoäþY’û'‘¿ :øöìÞ?h¸ :§ñ³¿÷¬úFÔ˜fjý©tg‘,“¢t|þ¾þýR¾hœ£_–„är‡~3÷6eø[]¡PK«ž°"…!FsÖê׋¾dgëâ OXø1»p 8:áÂ9TÐ}Ki’ÃŒRíCÈ÷‹u|Cˆ‹cÂ9œL¾æ­éÞL*]Ï+[©7ní'“ô)û²3´ÌŸ0ÄŒBEí£Õˆ™ R¸ëƒ!ÖÇ…Ø3â% „š»`ʈuZ¿Ôáý¢Ë¾º»s³Aµå÷„1µênÙSV +€ÉI&_ªíÞ¨ê#¢p|¸ ƒîÁÕâ¬ö¡ýç²°ŒïŠ"^>î¨.n&“ËsÚS´HæA"y";ô,žx%)4‡Ú[ö„|¡5¡‚± o¿¼ ÃíG>Z !‡JŠîê[1jCÙSö€Qj”ÛÀð&þ|ŒFº M•“b{Z–èO±oMR,)ƒn€ö¸+ãí‚@¸·áõ·ª1×DAu¾{PÓJoÌÀ~>v—÷zÔ–·£ùjˆr‡­¬ÔC¶AÈ™gÉû<ôâŒúPõqõµÜï™NÓtÚ²9¦”ΰ€*¬ˆ>•eVn©¯ }©¾NçU(­ª+(r‰+Òw#aàŸú—W‹ÓHåÞS©6ëI—Æ_F =·¡„\â9Q1Û-"BBòã»äñ,ÁJÙ\†ÅCŒŠßU»9/ëQ|~¿ªžKdjxúqH†T *ëÚ5šò}~$¾C”ôµ xBŽ1µ!C¨“¨Š’B_ÀˆJÙ>ÇŽ8¨…µÝˆÆ ÅqHòµþî€4¤8M7äu€,áu¬ž†o:„„JÚJ¹]F%¼QÆšbŸŒ?Ì󦈼_DÈf@é–&Hj·K‹ ƒ †OÚšbŸ´NG©ÛwÙ!®…šL›Mq½­HÞt½K¥5€råNhw<Š=H óÈ•Ù é@chí6’ÜÛ8˜€d› PÞ‡ðaº^~ÂíKȺJ¯†mÍ$¼y~ÈòØ?}¡Õ‹cxó).žã8íòyÕiÔíà*b[²\ŸtG·¢8Iv ZJÓôBÑï'ã>F¸4n>V†‚ÏMñ¸F=%t¶Xç/UÁC@RŸÎ»Ð eïv ”–@ܳ7€†uæíXS‡$»ü #š¡7¯»mS@ý¤ÿ|%ý2Y,’<žAÄÂÕ\Aåð +—fñY˜œ#šJ³ z}AMÓÔ+ª.×ÜŸâ4©¢4T ‹(/<®–bvÆ6ÓrŸIX1̲õbŽ×ÒÓƒ6oãUªãªC”wâ+ oÃN¾ ¥Kˆéò¶·ã[Q‡$»ðÓÀZÓ­ %ÿè2dIl“QB,¡à \Ý@H–q”Vþ•Aý n¼Ë¿Â46þ¸Ï¡-8âijÿŠí›þ6þC^-|»ß?À“&Õ/ =t3³{=¥E;(¸9ç RîíQ­¡8I¾ž n Ù±í{·uàbv­M›Îc[%–o,[ÚZhÿÏŽ~ž3íï!˜|ŒnFõ|tÀ”"F™ð£Y}t0©¶²°þ¼þö¶ÿÛƒ³GÑ$Û5ÇI³3V‘Ë< ‡÷³š\yµÛo­[ŸûÛÇxU‘è_ãüÜäµÅ†t:’aÐè:òþtñAvH‚'¼¡” +btüWš1´u¥Ôàõpª%«!«·‘Wå¡0vÓáLÏ»Ù6PvЇŽ»Ù6„«:†Cg}U½ÕŸÒäÏ.ª )Ú†P`?Hàäð"[FIꉗxwå1¶‹WÏ娎ºH@¢ldð¦jwÙ¿ 7w˼^y2ýM[7 Èóµ/ +çÆXÔp™Í׋2ëÁ‡ë²öæJ×A ï³Å"{ö[ÝØ^.Q”¼²pŠþT5yá¿:¤†É¶Æmúß—dðK-k7úïîÔ•ã!ßãUÌÏ=בç6 ®ò&+üóh±ð[c.G·á ú> endobj -1564 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> +1596 0 obj << +/D [1594 0 R /XYZ 56.6929 794.5015 null] +>> endobj +554 0 obj << +/D [1594 0 R /XYZ 56.6929 698.798 null] +>> endobj +1597 0 obj << +/D [1594 0 R /XYZ 56.6929 673.6774 null] +>> endobj +1598 0 obj << +/D [1594 0 R /XYZ 56.6929 673.6774 null] +>> endobj +1599 0 obj << +/D [1594 0 R /XYZ 56.6929 661.7222 null] +>> endobj +558 0 obj << +/D [1594 0 R /XYZ 56.6929 173.6899 null] +>> endobj +1600 0 obj << +/D [1594 0 R /XYZ 56.6929 148.5693 null] +>> endobj +1601 0 obj << +/D [1594 0 R /XYZ 56.6929 92.1409 null] +>> endobj +1602 0 obj << +/D [1594 0 R /XYZ 56.6929 80.1857 null] +>> endobj +1593 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F11 1384 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1575 0 obj << -/Length 2081 +1605 0 obj << +/Length 2016 /Filter /FlateDecode >> stream -xÚÍšÝoâHÀßóWðÒÒ×ßÙfYí$àV+íµ€lå¿¿j·mÚl¸äNh¤ 6U]å_WWUÓ& ÿHG „™áe8˜ˆÎly…;ßá»/W¤é—BýPêçéÕ¿†Lu 2’ÊÎô)K#¬5éLçvo~¹þ6Œ{}*pW¢^_HÜýytwëïÿçæþn8úòïñuOñîttçoÃÁxpw3èõÑôy0B¡;™:¥Bs2ÝLzO½L«’`æ¼ÿqõç߸3‡gýõ -#f´è¼ÂFÄÚY^qÁàŒ•wW“«‡jÀàÛ\õ4Î5°¢ªÓgi cœb–3Ä%­[ý¯”J?p§O2B4Ø÷z†*>–õ¡úüBp…¤Rd&ˆ“$$é(A• . -&oËÇdÑëKnh>wº˜»â>£œvom:ÛÄë,NVû3(C„3Ñ mìa5,aÈÏçÃR”˜Š%‡ø0ƒŽÏÃÖnÞ^8Ķ²;¾ÎPe*ÑB -çJ£oNÃaüê±MýEjW:0pîs’ÏHRRê€T!&ʳÊóÎ]lÂךÙg€æ,Æ6]'«ÔºâXªîx|NnzDw‹!ÒðÖÌÆ/vÞ€3põRqJc’·àĆ9«Ó”çÑ”¤zz©«[j… &¬™¦4q­LNæîÛû¯×#è -ã¢;†ëvœ;¥3ø¾]l4* —¤…ŸŒå0h~ö„è^~ƒ šwÇÃ(^´ƒtÚ Ú®ÏrÚg œ½X ’!cpK½–R!¡”¯×Ãûñ׬é>Ïãq8ØlÚ9VJgà \»X|‚B{-T >!¤Ô§ÇûìÙn€Y²q‘H4ú§ÌÕ<>»É&›óÒcàêŦGîþâ–Ú-Á>D¤¯ÝƒÛ» >m-;Ñ¿°Àþ#»ÞçÍ|‚1¶Eñi xx±AI5"T´”lÉRÄCü§Ë(›=CDûv»>¡fï´>V·w/)‘ˆ(L[ƒ”€öØÑ™ö,îÍv5‹2;o§9íGLwKRõ_v5ÇQ"Úª9VHcâ«ùoÑÒöú -»¼™nåê5¸¹]Øï‘ÛbŸG2ðòRI -C¦¥Œ #æRmzæR_Žr þ„=ãÃ.[ztÙn㸶›§d³l:y± 5¨bÞRÐ…fHâ ú—ÅÖ-äA·dŠñîdò–žõÆÝÄÿæóbÁTŸÜ¸%âxõ’üÓØ;ÑÛsHˆqÓRâ…‚A˜¤{€åÙ€å眿XÀB‚*o©þBÀ½âgê €Ok¤N Ü]cÕ5pøb¡rŽ83-õ_p0z?jO¦*?‘jàñ¥¶û°GG\ó–ú/˜DXa_ÿÏ»ªhqev¹ÎÚ©BÏ?Üxf/Ñ"žç @Á×Òˆ1pñbƒ“b$¨n+þ”#B„¨a¼ÿçcÓílfí¼‘`àÝg¤ rVo[j&)I¢ÛŠ¡ˆHÌjïì÷s *nj@ÌÿÂýUÞ¾X7^¹~*Ö}ghw¬åÓwÛ„÷1Zÿ»†%[zÖR´¸ÖÐ@ÖðŸ–Z›B¸-‘†®}VüîŽNÿÿ‡¢6†m -VìV±Vá \†%ÒÔIsÁ”ê#%°Áwo’å¸?Æ‹8+v¯qöìg6%ÁìQ…\tûÉËÌý‡©F° e!Tœ©Þ$ÛUf7éèè3¿„çÈpâϾ&iæÎ`i7ÍÀ»4‹g©»&ÝY9Vþmör¯Öe/½@üD ë¿ŒW‡\…,“ðˆï(tÁTRº{7\T3µH“ÂÕízlò Ž%0sô £¦0ZHŸ“×Ue¡ ï¸!.´‚é]*pDÉK±ÙΓÁÝ_*dyÙ /VIV¶ß ½ÍüÇd÷kçnòaóiÈwóI5@¡¾^ÛhSvò¥¸M÷Ú?tl ¢[B§qø/Ó…Ž/J*ße_çãŸÜ™ìxß2Ôb„Ýn¼Ñv%uÀz-ãIp’*]7?õÏϸ îvÅ…Gèî†q—vmS{(¸`+/dµúŽ—K»à‚1ç‰-\(¬ -hs“uဋ¯òËšÇó#G: Ú M°h9—€©†˜+¥ò˜»þcø>Úˆ„y³ÙJê€ÝZ´A -eœ¨ºáésœÖm±Ëõ ½bšÆy®Ü[¤þÃh5K–n–ò«‡ú{ 3GaRM‘¡T6à ¥ŽÃ¬¤r˜£‡w(1ä>,e³ÑJê€ÕJ ÈÝaoÍìç¢Û[›f§²Ч0®ZXR ,K©œåý:Kß&„’pMg“ÙJê€ÝMÀ€½n¸…fUB‚üç.òŸ„þRuNJ0eݲûfgµŠ”ÁÑ·¢®ƒ_­ßÍõ_ÓMZ¨¬ÑÌŸZêºZÿOÃÔR S[Jùsrˆ¹¿NŒä¼Ùj%uÀìþ:1\¨ºÝ#3 ‹j lËõÂ.-ÈÌ*¾)1¿‹ƒ7»èØ{•L ÷2ä'ÃÖ]Ò©ï\îÞBåÐIjM#ªšõ©¼™÷;èœ5U\ÿðçœendstream +xÚÍZ[oÛ¸~÷¯Ð£ ±¼_€ÅÚ4ÙÍÛKâv±gYm„ãH^KnпC‘’)[¶šÆ1Š‘H gÈ™o†3¤I„áDZ Ì ”áH`"¢ôa‚£Ïðíç ñ4qK‡Toæ“WWLEIe4ÿðÒkM¢ùâ¯éÅ/¯?Ì/of1x*Ñ,Oß\¿{ëzŒ{\¼wuýóï7¯gŠOç×ïß¹î›Ë«Ë›Ëw—³ØMa<8ø±·s;ȼ__ÜÎþžÿ:¹œw I0³³ÿgò×ß8ZÀZ`ÄŒÑ#40"ÆÐèaÂC‚3Öö,'·“Ãàk3tHiD¨`QÌ8Òx|ƒXÆ5RX‹£˜d„8ÂËÃÀË¿¶#ú¬bÂâBY£r…¤RdkT•p†4c"R‚ *ÁàÖª·_îÊå,–ÜÐéÛ¬J×ùªÎËbWóT¯¤¤Q(äy·*b¯(¦ ™£æÜcÙŽ8¬  €ùêN„ ê‚;Ñèâ'»èWW4¤THq­€»%˜ÿùáÒÑô¸Q¸äÌý÷í Þ¯²ÂÓ°€¨ 5žè¶LÿŸÕ8†&ÓFd ûŽ§Õ&M³ªú´Y.¿Î!Sð#ŽÙt~ŸWŽ"-7E­ÝÐܳ(ÊÚ½$«Õ2­ü…VdšÜ-3ç‰uéŸ÷ÙÀjEBRâgzõö1©Óû’9“íŠê¯« †U`¯ça`Vü”°’Æ -$ƒV=7¬®’|9 +-K´Yψžf†Í´üO‚œåÅg×Y9Zxiíáe‰:xY¢Üshàe¿þ ð +ív*x¹Å‘SFp©2˜°xICÀÇœ^˲ʞ¶À¼©²8b”`µ§ÚJ^`[•J Ã%3Š2H0ªÎi”7y±øŸ·Æ±>oŸwÀ¢ñyÛè|þ É]üÈ&“༛1“I…„RgÝý/Ê¢x¦ÉR`‘¥õ¬¨ãG¶D~Ì„³šHRÐÜ™­6j± o—²ð˪6½¼ºo’71˜¼´Y ŒSÙŒ ¨_„xËvÄa›‰ˆÂtÌfðÞvÖ„è5èzU‡¯ Æ_ŒM“†Iãj¶;/Òò¡k¥Á]ÛqøgvwÞ¸›ù$ð&‹š‘©ËÓ¡Ýö»<0—Hµ9|hr&èΙˆàá߸õüþöÃÀš)·u_«ž¤X 1ÒÀ‡'_1ÅQ(û ´Yر@ åy|QP £1 DX!‰Çq}ðroP°®“×Z©q[¦Â§m™ªl´ul³xÐÕª,UWšî¯„ÃZic‹f)Ãë q"Z­ma\â6ÀT!°A—ÉÛƒÔ¦IÜ™BAh`úS¸/Y)F‚ê±Ä\À0úœ½ÉÒ/OE(Å¡Ó¡¶Ï-Íò/™ûØ*5¼Íšñér³È|+Ûr@ª«”÷*dÀØ}±©ˆ}&îá#æ©m|u ÚÉÂ;„îüÓl1”²Ü}uN +÷¼¾øíƒÏnÛ©ºæl(Éç#g0¡íOD·Çößw ÿ¼c|" b +°S…°êßìÝ#0,‘¦FE17 aA¶^ÐCe{ÉÁô1æœÀ^˜$`kÆC¥ñ°«ßå˼ööyÌk¿ßIºÌÌ¢g/ÊôC¸ŸK¶ISÁåÝJà¦~£îJ@Ûú¸ÉÖy*W V&TSœè1¨Ž(³¥j”yýqO•¢Ÿ­îŽ +í¨¤öT‰Aåöf¤'ö´ª¼ñ'<ߦKj`Ûfîò°.CªÃºì¨]¾_ÕÕ>0JÂ&÷ÇÄvTr{Ú´µ÷h³ÛD‚ø×\4ŽFÔSB‚iw®lWlÚÛƒðÚç­å*8¢Ý³µÍ„ו²Z&é~F»Èþtd@Ã8=ÿÖ_¨l³c F­Ä.¹ô“jtDvgYhšª©ÿ aKendstream endobj -1574 0 obj << +1604 0 obj << /Type /Page -/Contents 1575 0 R -/Resources 1573 0 R +/Contents 1605 0 R +/Resources 1603 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R ->> endobj -1576 0 obj << -/D [1574 0 R /XYZ 85.0394 794.5015 null] +/Parent 1611 0 R >> endobj -1577 0 obj << -/D [1574 0 R /XYZ 85.0394 769.5949 null] +1606 0 obj << +/D [1604 0 R /XYZ 85.0394 794.5015 null] >> endobj -554 0 obj << -/D [1574 0 R /XYZ 85.0394 439.3709 null] +562 0 obj << +/D [1604 0 R /XYZ 85.0394 477.8665 null] >> endobj -1581 0 obj << -/D [1574 0 R /XYZ 85.0394 411.7795 null] +1610 0 obj << +/D [1604 0 R /XYZ 85.0394 450.2752 null] >> endobj -1573 0 obj << -/Font << /F37 791 0 R /F39 885 0 R /F21 702 0 R /F23 726 0 R /F65 1580 0 R >> +1603 0 obj << +/Font << /F37 799 0 R /F39 895 0 R /F11 1384 0 R /F21 710 0 R /F23 734 0 R /F65 1609 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1584 0 obj << +1614 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1583 0 obj << +1613 0 obj << /Type /Page -/Contents 1584 0 R -/Resources 1582 0 R +/Contents 1614 0 R +/Resources 1612 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R +/Parent 1611 0 R >> endobj -1585 0 obj << -/D [1583 0 R /XYZ 56.6929 794.5015 null] +1615 0 obj << +/D [1613 0 R /XYZ 56.6929 794.5015 null] >> endobj -1582 0 obj << +1612 0 obj << /ProcSet [ /PDF ] >> endobj -1588 0 obj << -/Length 1324 +1618 0 obj << +/Length 1321 /Filter /FlateDecode >> stream -xÚ•WKoã6¾çW99@D‹¤DIÍi7ÛmS,Š¢ëžº=Ð2m ‘EUdÝbÿ{9R¶lÁÛÀ08¿΋…æGgiLBžE³$‹HÒx–ïoÂÙÖ¬ýtCLsGœ›ÉÄjó”Ä)KfÁ)ÈûåÍâ#£3!X<[n]"Iå,-×Îw²îTs°8œ'w-ÁmI҄¶ШHHœ±Ìnxÿôë”Îpø¬ò¾)ºÎuÕkÕÈ®0Ô€G#Â#ÁžˆI,¸…3¦Ü4 Ãù»&Œpu CkÙt…¦ÄB•.ˆ5ºûEU2ÚZk›z.šöÌ@¬UUÈr6°©È•{~Пá>p[»ÎT®Ó-·²¨ÚîA¸wúvܼ@‚ aÌõ~¯+ð‚=Oë·•ß®õÆf¦Õ†‘$c‹°eÊÜŸÅŸ§ÿZá(1 :LƇ‰ý-Ò¥gsv¾žÇü,ò"¦}£˜ò½Ð‘0S+–EÙ .)2Ń»Æã!¿ J' £7æEnš¾w±ÉýÜD\ÜU]B°]ŽøaãDÞ`é\ íÒ¦[¿_©æ;qñú|Xìð•ØßÑ¡ƒ:Æ·I¿ê¤'!öË#9B&º`³‹Ò©•Þô«&?aÞpÕ¨ã»ãqÈò«6yÈàÌ9ײé]9U·®±S¥·W\íÞ,‡ÚíÛËÖ\Û“m -ŽÛýâþá-ñÕa|ìkç›üÌYˆ2K›éœòá=4v{Ix ¬°7L ÉsaMc¸ ½ÁF¿ÇÙ 2܇0é«ïر2H`í¤[[)U¡*Cæ©Fç-´L`¯‹6˜,»•)tü›—Ã×¥ÿf„W¢ùúþô"ÁQ?>GÐP˜î”%4fô\Ûð){©î?‰Bá_endstream +xÚ•WKÛ6¾ï¯0öä"ZEJêž’MÓnEãžšh™¶…•EUlÜ"ÿ½)[¶àÔ0 ‡Ão†ó"Eg¡ùÑYÊIȲx–d1á!å³|ζfí§;êdbÎ3“‰Õ€³”ð4JfÁ)È»åÝâCDgQH„ˆøl¹t‰$!”Eél¹þsþ´“u§š‡ âá}lÍHqQZQå&ë5N=Ö^vùÉòˆÒíd‡Ìƒî‘Èe…D«ÜR_£°¬ÖȨŠü¥’{§j£Gô]jCß*8/œR’qÙÕàÏ£Œ@ÈhddAD–¥~ *ݛÄ˸ qœ$NøÍ\LR.F`÷ª™Äâ&¤ÑíP®&Ð’D)Ͼ7 ^©×Ó€&5R*n²oÀ›¶1&Ûxü?!W¥Ì_vºTH±Œèmq°ÄP™‰©q—ÔJt¬Ú)ãKUŒ“˜Š£*[RªË âùå€f$a1ÖømQm¤0Ui*)k…£mÎÑiwò‹BêsF•m(‚ÎsãG:?–"ðô\ ç¯;·ÛVŽÕá{êprX1@µªÝIl"ØüµèvºïLÙw¦—íÕÅgw¸†2Öµ[œY*×€©]¿UH¹êRop|þ Ç“¦¡Z2h·.Å>û -³yÑâ(1T,; U”‘hˆÔVëµÛ²Vr*‡(I³„:qCë°Î8‰%™k?<„òQ{k|ï44 +ÅÎOÀ9z<‚f¦›î‹Î¦^nf—›-½:`Ò™Ú¤"¦ãø˜0ÂÍ­eÓ>˜ Uº Öèî/ªêÑÖZÛÔsÑ´gb­ªB–ã°ME®|Üyø^ÂëÀní:S¹N·ÜÊ¢j»óÔ9uÉ(ÚX@?+ßÎA¸ðXîê«Ü×¥Û´Ó¯HØ’Ž¨kÕ”în•uíIˆî˜1½¸Z±X˜p…pCwH@ À†ÀhP€ +[#y¿ÒÛ¾­T×Þ#o: ^‹²DjUêüÉß?<ÑŒ¦8ik™O^]Þ+©¡¦j”uæúáÓ·+àæ\c®÷{]ìyZ¿­¨üv­763­6Œ$[„-Sæþ,þ¼8ý× +ljiÐa2>DHìo‘>¢(=›GçëpÌÅ^Ä´obS~¢:’ÈÔŠeÑè—Š™âÑ] c‹ñß%# ãó"7Mß»Øä~n".îª.!Ø.G|€°q"o°t®†viӭ߯Tó¸x}>,vøJìïèÐAãÛ¤_uïÑ“ûå‘!“F]°£‹Ò©•Þô«&?an¸jÔñÝqŠ8dùU›@§>?½Hp”ÁoÏÑ#4¦;e‰;×6|É^ªûaáŸendstream endobj -1587 0 obj << +1617 0 obj << /Type /Page -/Contents 1588 0 R -/Resources 1586 0 R +/Contents 1618 0 R +/Resources 1616 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1611 0 R >> endobj -1589 0 obj << -/D [1587 0 R /XYZ 85.0394 794.5015 null] +1619 0 obj << +/D [1617 0 R /XYZ 85.0394 794.5015 null] >> endobj -558 0 obj << -/D [1587 0 R /XYZ 85.0394 769.5949 null] +566 0 obj << +/D [1617 0 R /XYZ 85.0394 769.5949 null] >> endobj -1590 0 obj << -/D [1587 0 R /XYZ 85.0394 573.0962 null] +1620 0 obj << +/D [1617 0 R /XYZ 85.0394 573.0962 null] >> endobj -562 0 obj << -/D [1587 0 R /XYZ 85.0394 573.0962 null] +570 0 obj << +/D [1617 0 R /XYZ 85.0394 573.0962 null] >> endobj -1591 0 obj << -/D [1587 0 R /XYZ 85.0394 542.127 null] +1621 0 obj << +/D [1617 0 R /XYZ 85.0394 542.127 null] >> endobj -1586 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R >> +1616 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1595 0 obj << -/Length 3437 +1624 0 obj << +/Length 3449 /Filter /FlateDecode >> stream -xÚ¥Zm£Fþ>¿ÂßÎ#1ý4Ñé¤É¾\&íæv=º‹’|ÀÀØÜbpãüú«êªÆ`3™•¢ÕMÑTWw½=UXÌ|ø'fAè…±ŒgQ¬½ÀÁ,ÝÝø³ <ûçà9 7i1œõíêfù^E³Ø‹CÎVO^Æó³Uöó<ò¤wûëêûåû0Ì•¾HìqΛï>}ü¸¢Y#ŽÚxZÉÓî?¼âzR Ís>¿[=>¼`%¥UØ/yÿãêݧۅ |ñöèÏ¿}€,%¦Ëçwo?=¬~¢»7?|~xûîÓým¤ç«¸ÃunÞ­ú“ž¦ðÓo7?ÿêÏ28Ôïo|OÅ&˜áÆ÷DËÙîFÊ ´RŽRÞ|¾ùwÏpðÔ¾:©áà „rB=pÂê b/TðÏá}ÝÐæv0fžÓ]Q=ÕÍ.銺"‚»në# ºš®‡–_¹óC;~´·ë.O;"œê¯ÖæÍsÞà9Þ9³é¶9ko¨d%…™ØiïþñóP^ÌÙjFÕ‘gb_ðÜ${.Úº9û¤û†ÞbðÆB…p&QÍ`&"ˆûêß/õjOkÍ"-<éˆôAO¿ÌÜè_gݸÃ7¬jôpý+¾¸úS·ÿf¹„¿^rhӼ鼺ÙÀx¹?¬—LZºÝ-ïX€ûs0¢Øó}íeU{)¾V`d‘/Gò¿f Ò‹1Óæ¹è9¾²A0a8Öx¼Á¬¾–0ž_ð…Å÷³®W©õš.û61ÚSÇZølÞwxI¡‹^· áûàüÛ¦®ÙŽ“*ãøw‡"›0A¶¨†˜ é#z æþ‹£ Eëõ¼èˆZ´4o_·m±.s¢Zjsk懊hª€Z0ïdÂm¤ˆ<ÔyBº%‡œ’Y…^Gnr^=4½ÚåUGküâþ¡-ª æ|UO]ø¡gtÜS{pø&üSëO†~ÌÓŸUŠaÇN¶‹®Oøj(ö´/5ø¨ðâ  üÒîó´x:Y™”RV&Èù/RjZmd‰‘ï¹@²è&rìiŠåcY×{ sE`æ«-* J“ŠžoórO£bDZï9'B{j»|GóÛ<=4Ew¢'k¾îË$åMHÖ®åļ“ó¦Z0¿uý;ïèdŒ„à(#w0ÒÊ}Üé–ÌôX”%ÊbWtç@kY²K6n\W.<±­6=â8ŸÖn›»¢Í3›æÑò‡!ô¾ªa!|QÛ\ñt@I´˜?åIwèSŽöÉŽáÉv áÊbÞR2‚ûú‰f°ÅŠ¤Ý¦€¬‹Òž±¥Ötíh¸L–ä;Ç8a6 ߪ}S<e¾!±»œ1lˆÏí{ÂÚ$GÁÖv )ÁÈÚ0öÎü-Çk“£ûŒ†®V¨„?ÿÏm,]În›MÞ²vi«¹*ª±u¡‹Óöpg.‘ó^ŽÛÜÍj{Ó¾.£Òƒ0#_ŸòqáÉH:6нǾ |”2áØx¾Ë([ãÕº\óߓݾä‡`‹;–ñ¦,*&£æ-¥Nø»°-˜O2µ/x Öê+ö±Ó/{æÝC­<_úŽßò9i–U²›ŒÃ \i"7õ?œ÷{s;b[¾^ `^`Œ{½_òš”€%ã‹0Ѿ” ³G>¤Lâ3€{l%Ò— ¥´A)~o¤Éå¡m–e&år]T¼õEy|Â^:º^‘˜õrÛ«Ï„`S®Êœ©W.°¥ƒ”ýÓ§²ét€… -Êú`ZFs‚ÄîXËpþT7DŸ²˜@§âUƒ;P}n¼J²È—;ÖÍ¢p”ÝçMy¢gEå$¡ IÓé¡LXÒŒ¸ð¶À§`€ê7À®s7±X‰é!ƒU‚3å…Ap‘~_2b@?ÆDñ b¡!GkhÃI GUŽÆ€#kÜp£¤ÁªŽÈçáþêÀì[Û„GE•–‡,oy2äS·¥¬ -÷ìúÀWlÇK’?yh{zþžÓíÜíeä7ÈìoTãàZae㳩 HÏE~ÄØ];OÛ”¡;°^¶Ü‰ÚNA¶ ]ÀŨ8@cOm_d :ˆ)w ¼Ð„1.IÓúPqàxr2RËÙJD¢ÅE²z¬x›€ŽE·%$‘'MYþ±8¦åSÑl*@EKº£¡u‹XNû‚eyrü@Qð^ƒø±pòW“GÀœ¨O'¬h@ ŠÅå Z d`.3ÉuDSqßÛ.醒Wuãà<¢]`¹ ÛáE*Ú&¶PÂÓøºIšÂœAÈb#1>! 7h·G¢8O@\›ùwõ14LQ|ŸWÁ˜oŸé[Hð -²Smã3b¿£B‡ôÔ]r¢Ù|ŽÆ‚Ë2.­rÂÜ÷æSmÚK/—&B„K¸Ë,^þ‘7õBP^÷m±©£•é!«|…Úeˆ Ä(ý35dVÖ›ú.ÒÎÀÅÕʸXÜcžy—:èŠÝ”›…nê6ìM°)å‰(4=0p%üãÍr]cá¿çÒóÏqý±)êfèFr ¸¹¾¸v©Ø÷ †_ãR±s<*Pl„PÜnƒõ¦ùGPLHyh('’3(*ô]=t}©$,Lp[J·IµÉÝFPK‡ø˜·-WL¶Ä]8)uMC<Ðfëª~8A8ÂHéËLÑüi¶åé¶>NiGI/–¡ºÚ×e.®÷>ÙkÿŒf À~–N¢ çÁEÆ=‰A;”3ì¸ï9¨¼)p -q åÜdîç7EG…ÐT/YÁ©éX_ÕLp1`´Én1„˜ ×yÑ{>ðâ¡{ã¢ñ×¶Û -õë çŽýÁdsn—+p»É»¼ÛÖ‹Á4(Ð8ûàèPÊçgí춦)îÁX¸¢+I#p¿*—‘)0Ó-ŽßâéØBI¿>0½XyÒ¶ñ5ƒ6Ö`±#_¶5ŸxÝõ¢&ŽÅÓHøˆ´8:çeìùRÖ)¼¨+Oʾ¢™E?}¢6‡el#ÉvL膄…Áød`­Ð¥-“gžÚÀŽìH½å ~Dn‰Ã#•w\„ ¸ö!oh7ö˘g‘v ÔcÍ”á§ÔÓ¦0#pZìls -ä¤ëP·=\3µí«ÁÀ¹y ¦¡ž9—‚Ýõ{Œ§ú¯+z¸GzDßZ&Xñnø}Û,ð3`;Ãô€9€Ï6å_:ÔôÉa¢Ö9/zÆžÉ~ð¥Ê¢ÜÎ}37=ð Å0tæ‰O<ö'Ê·æÓZ qèKZˆÝâ0íç4 ³¾íßmlèçb?·Mnˉ To t³fîisÚwõ¦Iö[×kÀÇÉ$¨°ýÐåÌhÍkìò¤š>[4A™ÔÇm’²c„øµiSõ_)Zš„ÅÄêóÃ?ù N[‘ÇÃÚl¨_Š©qèiÝ—f¯ÇÔXônÞ;,,ãò*.Žé‚¨6ý‘@ Ѿä'Tà‹à¸b¾C§$1×-ÂÂ6†hyù]u¶\ãê£A¦q?öÈmŽÉ[þ¼ÿtÿöîãíu¤ç«{xÂ}®îVNRCi +_¡˜¾\ýú»?ËA¨?\ùžJâ`ö ¾'’DÎvW:P^ •²”êêÓÕ¿ÃÁ¬yuR; „rB= á õ‰*˜B9¼kZºÜ"žôTÖM»Kû²©‰`·Í3 ú†~¿rûæ§n<µ7›¾Èz"›ïÖíSÑ¢o,ÙôÛ‚µ7T²’‹âÄjïöáÓP^ÌÙjFÕ‘'¾àµiþTvM{$öiÿ ½!Äà… +A&QÍ`&"ˆóê?ÏõjOkÍ"-<éˆôA³ŸgvôãI7ö…Åð £=Üÿ‚/îþØï¿Y.á_/=tYÑö^Ón`¼ÜÖK&-íí–·?-Àˆý9Qâù¾öòº;?¾V`d‘/GçÍ@¥—Äq*¼$(¿tû"+æLJGæL0ˆç¿I©i·‘%FÂÒ‡E?q boaøÖÍžâ!r‡ð8qu±qÅüfî¦í{Iâ2äžÐ—óÕ•¬³´¦ý¶Eµ§Q¹ãXúÄ—ëŽ]_ìh²+²C[öGzZižJ3'²Éϟ’LÁw=8Jde*Ý•;0òuó9D?oËlËòªhT•»²?En3ÈÓ]º±ã¦¶)å‘g”hŠGÖØ{îÊ®È n@WÆäÛºðEm’ÏãO¢Åü±HûƒËaÚ'Ç€ :Øû€„;‹yGÙ ž›GZÁ^s$m/„t]VFȆÚЯóÈá6yZì,ã”Ù¤ü|¨÷mùTVņ,ÃÜn y¸ËfÂ|%D$¢`ó=Ð’`d¾˜LëO†ã¥ jÒÎ Ð×À •ðçÿ¹N¤Ýa³):Ö.]µ&ßG5v62ÞÌ"ƒÖZNaWuŽÁtðQùFÄ£à1åC“‘´¨o {ƒðQ*ÇÆó}a D‰Äè¿ÁoñGºÛW< ¶¸3qª²f2jÞPš”çØ·€mÉ|Ò©{)‰V_q¯$H¬~Ù o&jåùÒ·ü–Oi»|)Þ€reÙ¥àÍJ…sw7{#¶åÉ ı:j(¥pšœa/ò!Ÿ~d+‘¾dl¦ã6ã÷Fš\ºvY5YZ-»uYóÝ!’úèæø1¡§ß ! ê)e«Â7•­[çþ•lÙÜa‚ää8 0QA8âLCKH!Æþr¼²–¡É"†>e2!ÀX)Ä«† \¶½HÛÈeÛ=7íg¢p˜Ýmu¤¹²¶'¡iÛ—Ù¡Jù¤9q(o 4.Áå.À¾s3²˜Iì@ˆQ‚µå…Ap–Ð_²bÀSq%ƒ…–I¬*(§QVÂQ] 1àÈX7&Ì¢§ÁSjʉðB`æ­mÊ£²ÎªC^pj. qû-çÕxWqÇn¼%9”IïzþŽóÝÜÞeä8ÈìU“`iÎÆgržÊâƒó”ˆAu$¾&„Ò‹‚ÈÎ’÷#Ôäc˜'„Hd»7å6üæû²*}ÀÍtÏÁC¡ +pžUŒHæå†~Óü‡®?Ûï)­Eçv#Pb\ ƒ±x}uv|.£Kç‰àš2´ëe˨¤ËÐF\ ‹6ñÔIhû2_ ¦Ü1ðÂ8< ri–5‡šÇ£-¹Á:Ïâ0ˆÑâ,[=Ô|MÏe¿%(Q¤mU2@¦c©h6 ¢%ÝÐÐ8‡,Ç} Ѳ:Z~ ¨‰‚AÃñaÏ_OFk"—OXш€!Œ+«´ÈàU|¬ sAקýðäuÓZ|St ,à!`ÇAx–‹¶)…-õ¦;÷‚q±)DØŒ»Ì‹§åŸEÛLAåE‰k´M…°LYµà+ÐÎCL!Féט©!³ªÙ¼ÐÉ‘~tB.¶úžÆšðó,úŒàA_î¦Ü4Vè¦ÒÕ`€lJy" +c  lSàa g¹°1øÇŒßq1ûW¸þÜ–M;t#9FÜ\`\ºTâ{ +ïq©Ä:U(&B(nàÁ~Óü#¨&¤<´Ô€Éú6ˆzW+ 앲mZo +K7ÔÐ!>]Ç%“i®q×ä%.ÊleÚìl$"Œ”>Ïí_Va](϶Íó”v”ôª‹ûpafãºóI§ýœµ6÷YÚm(¨X.sîr ¬œaÇÔAéMi©M(§¶µ[ß–=UBSÝiRÓ‰ ¾ª=-@ `´Éþ1„˜ ×yÑ{>ðâ¡}㬕è>2HÓ¿…vП%€…°ZÁÉd(Iåï: B ¦åÊ•ˆ‡‰ù +þ•ó»‹¾®ôüHFPƒqHˆƒ°õìËLx¾NE‹csד ay¿“³· Üh6¸”e¼r6—‚Ø3pâÐJûÇ°M,cºSÓ¤-…6QˆÂ¦ŽoL’½ˆ£Í ˜ lù csïè¬U.ö %53ŠP3w¢F}ê0¸uh¬ÏþÑÓ€púÖó÷¼sìRP¨ë“KšßvôÑHÅyNq–{{S*3 +-û<í ÛþæÎã« ð[ðJ(n8(®„œç–?RÌÇiÆŸºms¨r¯ùUÐ8(»â¦‰ÚZ€«šš©0ã 'ÀŒS˜ñ—óàT0WWÇ©ݳl‰âºFÏ󆟷TM½›æÖiGU¢øžh[J©ùýÏDHóœ0jÇ/QÑ¥ìJ=ß6T6)¤Å¨˜V—‘änØ¿øUé–jêÕ½°õ⤬…^ÖSç@P™^ <Tü×”Ãÿ ºé¶ñ‹ßÀ£Äâ-€íÍó‚U=Y£Æ±‹cr 9æ¹ +¸aŽä]Ño›œÁ4(Ð8Ý'Mpt(å‹ÓÍꮡ%vb¬ ÜññÔ'W!T.#S`>±3Z?¼EéØBÉ>>ˆÝ±Š´+M!Ð'Økc Bàü¶ê–xÓ»£¦–Åãèðiq|è‚·1ò¥>lL¦ð¢fT¢<)4|E3 ·|¢6‡mL#ÉtLè ƒ±d`¬'觫Ò'^ê¾ `ÇŠv¤ÀÞŠ?KwD€á3•w\„ ¸º‚tó­M‰Ó‘v)Ôcí”ágÔÔ¦0#pZlms +ä´ïQ·9M®™Ú¹j0°n¨ih†gÖe`n}Cc‡ñ”û¼¢‡w¤)úØ2ÁŠoÃï›fA€»©† —ìÈ|¶)ÿÜ ¦OµÎiÓöL÷ƒoUåöö£¸é(†¡3O|ã1” |c>Á@‡¾´ƒØ!Ó~A‹0ë›þÝÆä·;ø…érN¡œ5ÐÚ¹gíqß7›6Ýom¯§Óœ ÆöC_0£5ï±+ÒzZ¶h‚2{¨»4cÇñsÓ¦vŸ):Z„ÅÄêÓýwü—­Èãa²4&ê—bjzZ»Òìõ˜šçæÎaa›WqsLD5éç#ÚçâHƒ|WÌwè”tÌÀv‹°°M Zž©°-[çØúhiìŸ&ÇŸº­Àà@ŒåSçBØ®€³IlàLT}ÐH¨lCÄ´Ø7U™§[Aä>Ñ:iGàÁúTñå/—ZPi)5õG ¾«iþö pÀ<ŠŒ³=öt LøPx³D_œÜþ5ÑåÑÿk$§/endstream endobj -1594 0 obj << +1623 0 obj << /Type /Page -/Contents 1595 0 R -/Resources 1593 0 R +/Contents 1624 0 R +/Resources 1622 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R -/Annots [ 1600 0 R ] +/Parent 1611 0 R +/Annots [ 1629 0 R ] >> endobj -1600 0 obj << +1629 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 738.9144 452.088 749.0762] /Subtype/Link/A<> >> endobj -1596 0 obj << -/D [1594 0 R /XYZ 56.6929 794.5015 null] +1625 0 obj << +/D [1623 0 R /XYZ 56.6929 794.5015 null] >> endobj -566 0 obj << -/D [1594 0 R /XYZ 56.6929 723.0302 null] +574 0 obj << +/D [1623 0 R /XYZ 56.6929 723.0302 null] >> endobj -1601 0 obj << -/D [1594 0 R /XYZ 56.6929 689.3491 null] +1630 0 obj << +/D [1623 0 R /XYZ 56.6929 689.3491 null] >> endobj -570 0 obj << -/D [1594 0 R /XYZ 56.6929 552.677 null] +578 0 obj << +/D [1623 0 R /XYZ 56.6929 552.677 null] >> endobj -1602 0 obj << -/D [1594 0 R /XYZ 56.6929 525.9649 null] +1631 0 obj << +/D [1623 0 R /XYZ 56.6929 525.9649 null] >> endobj -574 0 obj << -/D [1594 0 R /XYZ 56.6929 411.5673 null] +582 0 obj << +/D [1623 0 R /XYZ 56.6929 411.5673 null] >> endobj -1603 0 obj << -/D [1594 0 R /XYZ 56.6929 383.9327 null] +1632 0 obj << +/D [1623 0 R /XYZ 56.6929 383.9327 null] >> endobj -578 0 obj << -/D [1594 0 R /XYZ 56.6929 225.6356 null] +586 0 obj << +/D [1623 0 R /XYZ 56.6929 225.6356 null] >> endobj -1299 0 obj << -/D [1594 0 R /XYZ 56.6929 193.4614 null] +1316 0 obj << +/D [1623 0 R /XYZ 56.6929 193.4614 null] >> endobj -1593 0 obj << -/Font << /F37 791 0 R /F69 1599 0 R /F23 726 0 R /F39 885 0 R /F11 1367 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R /F48 940 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> +1622 0 obj << +/Font << /F37 799 0 R /F69 1628 0 R /F23 734 0 R /F39 895 0 R /F11 1384 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R /F48 950 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1606 0 obj << +1635 0 obj << /Length 533 /Filter /FlateDecode >> stream -xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6Úýõµ3·¶ôTEóÆoÞ|x€"b~ Ž “1JeŒ9¡•[ µ9ûêQÇ Ï¤ð–u—{Ÿ¿°I,“(AùË–ÀDŠòêÉÍóé"#Nü!Oˆ—Í&à‘ðXNÇ‹,4þ1[f“éb¤±Ÿga,ˆ0ñÌ)Lg£ïÙøó P§Ôžó{oš_¹m–f»øí==T™žï=‚™ ˜J¡­s†yÌØÙÓxKïçEðæô:4<Îæ"J¦±¡éq‰fŽìô–z«lO‰ßÕ½êÀ,7ZwÎÝkûäþ/¥và)šŒê­-¶uið[xØUE¯*8˜ØyžE_€U· ã`wXUz[€×H¶.²RZ!—{Sô7üÐŽÛôRŠ%çÑ©'ÂTÊä)…Ú{2è]·ÊÜ,#‰Ÿoê˜Çâ- ”úŸ Œ‰I§Àßë]بWÕ\cÁ*uÛ›|u»vx_÷v溵¹å¬Â¥rÚÂÏæî ªö¾ê:å8úe¨ÁÝaÕÔ%ìÝQ­Àp#¶ý¬Ní_Õ¾Ð*å­î]HÓè#˜îâÀÍ9Ε‹ÿµÛŒc»›hþ®îÿÞûë!6¯¤ÑðJ›ëÄ"’é¹(;/É>V~yAþ.ýÐîÌendstream +xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6Úýõµ3·¶ôTEóÆoÞ|x€"b~ Ž “1JeŒ9¡•[ µ9ûêQÇ Ï¤ð–u—{Ÿ¿°I,“(AùË–ÀDŠòêÉÍóé"#Nü!Oˆ—Í&à‘ðXNÇ‹,4þ1[f“éb¤±Ÿga,ˆ0ñÌ)Lg£ïÙøó P§Ôžó{oš_¹m–f»øí==T™žï=‚™ ˜J¡­s†yÌØÙÓxKïçEðæô:4<Îæ"J¦±¡éq‰fŽìô–z«lO‰ßÕ½êÀ,7ZwÎÝkûäþ/¥và)šŒê­-¶uið[xØUE¯*8˜ØyžE_€U· ã`wXUz[€×H¶.²RZ!—{Sô7üÐŽÛôRŠ%çÑ©'ÂTÊä)…Ú{2è]·ÊÜ,#‰Ÿoê˜Çâ- ”úŸ Œ‰I§Àßë]بWÕ\cÁ*uÛ›|u»vx_÷v溵¹å¬Â¥rÚÂÏæî ªö¾ê:å8úe¨ÁÝaÕÔ%ìÝQ­Àp#¶ý¬Ní_Õ¾Ð*å­î]HÓè#˜îâÀÍ9Ε‹ÿµÛŒc»›hþ®îÿÞûë!6¯¤ÑðJ›ëÄ"’é¹(;/É?V~yAþ.ýÑFÎendstream endobj -1605 0 obj << +1634 0 obj << /Type /Page -/Contents 1606 0 R -/Resources 1604 0 R +/Contents 1635 0 R +/Resources 1633 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1611 0 R >> endobj -1607 0 obj << -/D [1605 0 R /XYZ 85.0394 794.5015 null] +1636 0 obj << +/D [1634 0 R /XYZ 85.0394 794.5015 null] >> endobj -1604 0 obj << -/Font << /F37 791 0 R /F23 726 0 R >> +1633 0 obj << +/Font << /F37 799 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1610 0 obj << +1639 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1609 0 obj << +1638 0 obj << /Type /Page -/Contents 1610 0 R -/Resources 1608 0 R +/Contents 1639 0 R +/Resources 1637 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1611 0 R >> endobj -1611 0 obj << -/D [1609 0 R /XYZ 56.6929 794.5015 null] +1640 0 obj << +/D [1638 0 R /XYZ 56.6929 794.5015 null] >> endobj -1608 0 obj << +1637 0 obj << /ProcSet [ /PDF ] >> endobj -1614 0 obj << +1643 0 obj << /Length 1964 /Filter /FlateDecode >> @@ -7135,86 +7253,86 @@ i ­è×ØÚ:‰óÎÐÃBYn?z·XdÌqâd¾©Üä¤ÚNí:ørðï»QÕaáƒL·CÕMucVìâªV.Wª4 Û8Hü»Uoy)”@»Zìo+B)ˆ×­©ôD9ƒ©;B.ÊõTyåvÂ)Î6™îZds§¡ÁÓÏMí­µ°r=¶öä&vÓž®é^/yr€¡¶¯ÓP;«y Â1{9B€FãŸà{ËוÂM>p\×-ž‘7>å èWˆÌ¨WKÐÆ 5m"û¿À¥–€ã6WUŸÔž9ZØוå,¶VHbžþ‹'¯´=Í\¦pÀŸ'8TÃ[WyÌ#‰6Éyè5µÒÇî:4 ßál 3,•ßbÏ[œ+ªë/WF".ƒ›ËÊ?@”€/jŒu“1Ô¢+l',{_¼2ãâ•sä®ÏñÛªÊ ¿&–Bú–åç !G˜ ¥Ìrcø-Š¼ûãËü “¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀUßÄx³Q³Ô}\Wù¸·ö߶ -ߣ«ª]qöü´Þíâ³äZÄ^d{‘¡Éep …E\æÞ†RÊ[oóûæ½»ÿ¡êŒêendstream +ߣ«ª]qöü´Þíâ³äZÄ^d{‘¡Éep …E\æÞ†Ræ·Þæ÷Í{wÿ¢BŒìendstream endobj -1613 0 obj << +1642 0 obj << /Type /Page -/Contents 1614 0 R -/Resources 1612 0 R +/Contents 1643 0 R +/Resources 1641 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R -/Annots [ 1621 0 R 1622 0 R ] +/Parent 1652 0 R +/Annots [ 1650 0 R 1651 0 R ] >> endobj -1621 0 obj << +1650 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [348.3486 128.9523 463.9152 141.0119] /Subtype/Link/A<> >> endobj -1622 0 obj << +1651 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [147.3629 116.9971 364.5484 129.0567] /Subtype/Link/A<> >> endobj -1615 0 obj << -/D [1613 0 R /XYZ 85.0394 794.5015 null] +1644 0 obj << +/D [1642 0 R /XYZ 85.0394 794.5015 null] >> endobj -582 0 obj << -/D [1613 0 R /XYZ 85.0394 769.5949 null] +590 0 obj << +/D [1642 0 R /XYZ 85.0394 769.5949 null] >> endobj -1616 0 obj << -/D [1613 0 R /XYZ 85.0394 576.7004 null] +1645 0 obj << +/D [1642 0 R /XYZ 85.0394 576.7004 null] >> endobj -586 0 obj << -/D [1613 0 R /XYZ 85.0394 576.7004 null] +594 0 obj << +/D [1642 0 R /XYZ 85.0394 576.7004 null] >> endobj -1617 0 obj << -/D [1613 0 R /XYZ 85.0394 548.3785 null] +1646 0 obj << +/D [1642 0 R /XYZ 85.0394 548.3785 null] >> endobj -590 0 obj << -/D [1613 0 R /XYZ 85.0394 548.3785 null] +598 0 obj << +/D [1642 0 R /XYZ 85.0394 548.3785 null] >> endobj -1618 0 obj << -/D [1613 0 R /XYZ 85.0394 518.5228 null] +1647 0 obj << +/D [1642 0 R /XYZ 85.0394 518.5228 null] >> endobj -594 0 obj << -/D [1613 0 R /XYZ 85.0394 460.6968 null] +602 0 obj << +/D [1642 0 R /XYZ 85.0394 460.6968 null] >> endobj -1619 0 obj << -/D [1613 0 R /XYZ 85.0394 425.0333 null] +1648 0 obj << +/D [1642 0 R /XYZ 85.0394 425.0333 null] >> endobj -598 0 obj << -/D [1613 0 R /XYZ 85.0394 260.2468 null] +606 0 obj << +/D [1642 0 R /XYZ 85.0394 260.2468 null] >> endobj -1620 0 obj << -/D [1613 0 R /XYZ 85.0394 224.698 null] +1649 0 obj << +/D [1642 0 R /XYZ 85.0394 224.698 null] >> endobj -1612 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F11 1367 0 R /F41 925 0 R >> +1641 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F11 1384 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1625 0 obj << +1655 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1624 0 obj << +1654 0 obj << /Type /Page -/Contents 1625 0 R -/Resources 1623 0 R +/Contents 1655 0 R +/Resources 1653 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1652 0 R >> endobj -1626 0 obj << -/D [1624 0 R /XYZ 56.6929 794.5015 null] +1656 0 obj << +/D [1654 0 R /XYZ 56.6929 794.5015 null] >> endobj -1623 0 obj << +1653 0 obj << /ProcSet [ /PDF ] >> endobj -1629 0 obj << +1659 0 obj << /Length 2543 /Filter /FlateDecode >> @@ -7227,116 +7345,113 @@ R ’ r”OœBç=Á 1j"«¢ºÑpQɧUäzý"GöÄÙ G,ØÝfS6ä ÐBdz˜€z²Ó„Q™DÏ B0q¶Ah3>£Œ7«®sÙØ£FfÁ'‘«RuJãÆÕùö‘]ôçÛ/¨N‡ÝVM)gQø|$¶Ì­} 8Épat*ÌÒ¹Ã^‰©€ck ˜Ö…/ ‘úf8ùtTù‘w)Ë¥áZ½RÜ0†Oå:»^•˜Ã&Ù:v3*LO„Y‰ÅèÖt4™\a¼°[`\ÃÈÈö®ž„Ž—ÌÉAM´Ěû«„Ä„ €É,Ö£ÄvFø[vAé÷Aô´QêÜéüY4²³Álˆ†±ˆC¶ýB=ù¸!‚nÌÊw‰P‰ü¨jiˆ¯ÔàbºHêØ슆 Â÷ZÁµêμûž¶ºž–Ï܈RvµïY×ÛæÕ¨äjµ¤½¬s«I˜ŒéT×wìDDåïÛÍêv{K‹<õ0Ø>Þá0(î9±Þs@ܘe·ž«„D±é Ønu»ÁƒÖÄqE?cÔq,¦…îÀ³ÆúE£ÁĘŽAÄ)ôkÙ>ËRži6”šQÑÇÑ í%"Û2R¡q¼µ2$Q†£5ÄÞÞ3Xßñ±bɾ¾Ûºù~­(z‚Hׇ î †FX³Á¿,0x,ã&þ,<^ NÖÀY_Ö# ÆÃkfÝOUÿÕ‰[¸‘{Y›åj_¼ˆ1î𥑈6Hy ÿ/óŽ#窀Š ã”U#7Cã@Q²€.ÿ¾ô™Ñ„K ÷yIJ­¥¥tG6µí a)\§ë€Ö&tÅŒ‚þ[år Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ópBµÙ>~æÜpËBtG‰ãÉYxEìÅbè á¥…9`°8#Û–8Ϲ6aù/3!(¬ÝˆUÐâ£:J¼TœpŠq«ëÄLM³ÿ@ÏM •($Ñì]€B‰±c€2i ?P‡nþmD4“Ç v;)*¼Q¾Ý3,$¶×`(‡æJý× éz`ê„Þw§Y1J†|%\‹B¡kùüEÙi¸U³“eÉJ}“/Ë…ü¦¯KÑX%=›4øªQÕ‘¢®óñg¯,•Ä²áŽg k ¥TŸ%#.Q=( ‚ש©ö¦7F ŸgàÑ[¦Ã–è@±¸ˆ$ŸægH@Ä%²ZI(Ž":ž( 6SaUŸiQc¢õFêƆEiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡›MÔºõÁùˆ4òK®øbðج–S€¼V(Ø&ˆ0ð[P£ ÄNg[iÝÑÒF´åêNuЧ—%KÞ©gI«w}o }U¯K­yHÝ2Ž"ÛüÁ×ý ÆŠýô3À‹¬ÉC–Påú‘?{°GÉÏæ#Sð¹c"ˆ£oë¥yó–þ®‚¸åé·žøqsˆ™Ìy™Àfá:ã¤m,ßû¶¿š°f¬…´íº¥®ÙÀoçÁâgþe5ñÐ7þùçìÀשŸ%ÃF¨g–¼=mü‹Áßû j=¢Xendstream +®o¬ƒñ+ñ'E\2}8Ç’;i %Ò‡ï&ª°Wõ\~jÀaÛÍ{³˜¢GË!zeoA_^†NmÞxš^Xð”Ð;’ù‚Ïr{z8Ø'"Hóȃ…×UØNÑô©|hÑçò+Å™X‡¬Yzœï_wEî”b8Iù‹Oï×WHÎÄšæÝǧñ#þði>ÀoçÁâgþe5ñÐ7þùçìÀשŸ%ÃF¨g–½=mü‹Áßû j•¢Zendstream endobj -1628 0 obj << +1658 0 obj << /Type /Page -/Contents 1629 0 R -/Resources 1627 0 R +/Contents 1659 0 R +/Resources 1657 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R +/Parent 1652 0 R >> endobj -1630 0 obj << -/D [1628 0 R /XYZ 85.0394 794.5015 null] +1660 0 obj << +/D [1658 0 R /XYZ 85.0394 794.5015 null] >> endobj -602 0 obj << -/D [1628 0 R /XYZ 85.0394 769.5949 null] +610 0 obj << +/D [1658 0 R /XYZ 85.0394 769.5949 null] >> endobj -1631 0 obj << -/D [1628 0 R /XYZ 85.0394 573.5449 null] +1661 0 obj << +/D [1658 0 R /XYZ 85.0394 573.5449 null] >> endobj -606 0 obj << -/D [1628 0 R /XYZ 85.0394 573.5449 null] +614 0 obj << +/D [1658 0 R /XYZ 85.0394 573.5449 null] >> endobj -1632 0 obj << -/D [1628 0 R /XYZ 85.0394 539.0037 null] +1662 0 obj << +/D [1658 0 R /XYZ 85.0394 539.0037 null] >> endobj -610 0 obj << -/D [1628 0 R /XYZ 85.0394 539.0037 null] +618 0 obj << +/D [1658 0 R /XYZ 85.0394 539.0037 null] >> endobj -1633 0 obj << -/D [1628 0 R /XYZ 85.0394 510.2426 null] +1663 0 obj << +/D [1658 0 R /XYZ 85.0394 510.2426 null] >> endobj -1627 0 obj << -/Font << /F21 702 0 R /F23 726 0 R >> +1657 0 obj << +/Font << /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1637 0 obj << -/Length 2893 +1666 0 obj << +/Length 2810 /Filter /FlateDecode >> stream -xÚ­ksã¸í{~…¿Õ™‰IÔ3ÛéL.›ls×Ë¥‰;íÌíÍ”–h[]Yò‰r²¹__€õ°•½›i“&Ê›¹ðïÍÂȉR?Åià„®βݙ;ÛîÓ™Ç4 K´R}·<»¼ñ,uÒÈfËõ€Wâ¸IâÍ–ùÏókÇw΃;ÿtûpûtý·ó…ºóÏ4xº½»}º}¸¹¥éýÃÝOO?^ŸÇÁ|yÿÓÃù"‰Óp~ýøxûðñþ_Ds ]×BonŸÏY~v»ì$žÊsŠûëÙÏ¿¸³÷ý™ëˆ4 g¯0q/MýÙî,…BXHyö|ö÷Žák–NjÉs_Dþ„š|1¥¦0u"(TÓw÷át~2Q.ê -'é<%Ø«Ô4hνd®J%µÊ‰¢¨ó¬ö­Ú­TCSßu]"UN ‚yH‚ïäêfÈõµ)ZE¸zMˆJɦ|ãeeÉ õ^e-3³”í–—ª\~ 4 -hfáyN†¾9fùVT²"ŸFÒÐg[Ø>k$ŒÓ­%ya4P’~¯$œø#Ìùp -"‡Ï®ëgýFÐ\í‰s&[ÔÂŒjp`‹1ãÄ.}Qe½ß©ª%€Ý)«+]ðq‰§µU«*YejRueêd9ø]ËcmzÂê ½7À$Ç÷ÓdþPÓ\æyÑV–4 j¶ÐŒ¨+Eœ-«wvXŽæ=ª‰%dÅ\ ¡a»•Ö5ƒ´Êà_o ö`2bö²Í¶JÃà>¨u|4Ì_ëæ ¡Ì!æsE¸}­u±*ÁÛ:—o4\½y+ôLX7z[ì c,€د1z…IV7ûº‘¨j} ˜oÕË‘r(üµ…½²ZÓyYp)㨠¢–Qfsø­;rªúÀ˜¢Ê‹—"?È’!Å›y#ˆ7S`× t’Tؘ{¾ð Ì?©Š1Š¹j­Ê1·væx=ok`Ã[Ç DÚtÙß?¾D|‡ó¼#*–÷³º×ð¿ó†@`éÇNà‰Ð°d6IlØ}1«$áè ïùÉbU´„«WµÅ¹gî:ø'AÉå€ïa³–YÇȘ Z…ÃÈ(9Hãùë¶È¶o~]½½'¤º` ¤ˆ„w ‰ã:¸¹•Í€TßH(ýæÀù„x^:bÞ÷ÇCÙ¾«ÆÔ bOü?$$õ®Æ^<öÁ^nð¢ -æíœH¸>ø8þzduÖ+ž™ ‰èMY¯0† Ð:„™ ¼‰(5Dòâ=@¶«‡›}´ÁãBnÑŠw|º»!&ñÅÔeúìûÁ'ãL'Ž© ‡â àÎläࢩìÒG¯ÃÍq Iôo£´œ²<Ô‰PÓlÏÍ@ÔÁUæÄG» y¿Nxø¸ë=ãÝ=}ÊSK¨+Š˜5†þsºC:¡'¼£ªÜ¦ÂCìDPÚó’έþÐv±püPص”ï8AâÇcË,)?§½Er¤@@Žh T -$Œ©!cš JÓ©ÍüÉü°×Ê•Ü Ù™E AL&ÚûçÇsjÛ sîOM–c©6ÛòÍ$;³ -v!¨/rÍ[×½® ÞLh܇l›„´¦5õÃD œ$ŒlH„r«å&Âçݳ5º?¾·hdµÁk+ §/-UçI0> -è¾ÏÝG$”uf,Õ­DC¡Æüx¾;˜t -(–"—ÜYi4¹B™º¦qfèY'ÉíŽÑ–\z ¬nÌ\³&ÊKŸ ‰•v(Äð1“‘㣓Æ|ÒØŠž«Ëˆp}µ6eè£[SWöj›ŸMñ¢Âú`K@®Ö j]¼©VP%Ûc4ºãê#‘œ*Õ-õNB'V½S“ÖÂxl˜gr/WXÖà= #’qcYaç 8êò®• õ•Ëö0î$3£–F®ÁØÑ‚𪕲€¦)¨Ùˆ1|L7eX¥s*-qPC+a©÷Ö> XúØö±°ž  WÓgÀÀ´ëð{SJ­¹ô‡©©í>ÖØ"à© g0Áhrsÿñ ÃÈó1‘¦ß,°Õd0\>M„4Ê‘Qƒ+KŽ\”c.¬ŠhÙdEÛ¤Ašäèe<à‹uÝ«²ä~É°?Òì¿A{É ”Ôøø¾ÿˆ8"UÐ%1t\éÁî`ªŒ˜ ‰HÒ¿˜Þtè£}VÕÐ_àrÉhÓ±#}à'nLsD¯€“‡¶Æº$ë) kL蘌‘¦Ö¹aTìö¥ÚYu›ºÊ£²Ýbf`’–5ýv¢àdб¦œ)à·7En¡vÛ\­%””4é-„¼×ô[)¸ìZ6oçÈõX˜Ì¯'ûÓ·}‘ÙeÜÎJ©]±ÙrUQÖ57°eñE]u-ã "‰„“aë_ßu½«|•\ùð›^I×…õ¾Wk•xWþJø)mÑñ™*ÛÒã@ ;L/ʨY'²zÝššbb™Û—¢ÏÞ’9” Cfb‚ ã\sÂ]¨ ÏvHÆïV¼×V¾("+ª¬ÛÀ8«KsÕaˆWýßWW¢K =ÉIøô¥;^4@%(SÚÂdà†¸¿ÑʸSî”bÙH^šÉÉÇ!4F{\Zf6ç¬8€´} âç13êêʪ«Hó›!¾}°ü\ñœ­¨7Üoßú؉õ|Ø *¬(OJæpþÁÆä³H`7é^EžÄ)Û-t/`7õÄàÚýÇHžÇ~ , KÌëì`9B»EœLçsyÛÖà&Ñð\´Md½•ÌÙ|4o.hÔ¿4~^Wè­QâX†½lx7ã/Ñ»ÏbŠ„rS ƒ^E8©È@´ÂŒLcÓ’Ã/ܽmE! §UÝš&7!'\×JÌæ(ÎËñ.iU¾XvÝép’›ž¢2‰¦Ø;ðšÉ½W3ÜðÛjÕ“jº˜¼ý¿ÉY2„endstream +xÚ­koã¸ñ{~…¿ÕbEõ̲»É6w½\š¸hÛ*K´­®,ùD9Ùܯï g¨‡­ì-Ð&L‡Ãyq”˜¹ð/fA脉—Ì¢ÄwW³lwæÎ6°öéL0ÎÂ"-†Xï—g—·2š%Nzál¹Њ7ŽÅl™ÿ2¿v<ç(¸óO7÷7×;_x;ÿxÿDƒÇ›Û›Ç›û74½»¿ýùñ§ëóÈŸ/ï~¾?_ÄQ̯nî?Þý‹p®‘ ëZ臛§ó_—?œÝ,;Ž‡R W"»¿ýò«;ËA¸Î\G&q0{‰ëˆ$ñf»3?NàKi!åÙÓÙß;‚ƒU³uRKÂu<zjò䔚‚Ä %,¡šÞßÝé¼xþ¬]ÔN’yB°—TÓ 9ñ\•*Õ*'Œ¢¢•'µoÕn¥šz®ëBZå*˜FJð]úŸºR}iŠVÑZ½¦…J¥MùÊÛÊ’ ê½ÊZ&f1Û-o=T¹2ôhÐÌB' ψY¾Õ†¬ÈÃ(5øÙŽÏÚ1ãØÝžë¸Q4Ôì`išùðã[AaÉ*šŸ0ùìº^V€$¯´%W{BÊÒVåàVR¸óûš÷çyÑÂ)iIó\=«²ÞïTÕÀ(©Ô•=¥:–­·¦atB%Æo¡ )˜’þü¥n¾Ð’a~wi®hm_k]¬JEð¶ÎÓW®^ ¬½íÖÞ{Z1vÆ8¯1IV7ûºIQIúAáˆä„Ôma]Y³™q)c«uÝ´º3žù­;ò­úÀ+E•ÏE~HKmôWMÌ„ïHî!Ü58Õo%£ó…€«1ÿ¤*–cŒÔZ5ªÊØœw0±3òõÄ­†¸”N쉸‹t‚Éß=<‡5 £b†?»{ ð+˜æ06 ™!x&‚¢“‰#CÆ(ŒIÅñÀ¿a]xñbU´´RäàŹ0þÎDеñ4À-ªV5ë4ë›Á‚VFã02GJ#Ôhþ²-²-U¾A$Ëä‡LåöZ;qÊ ¤õ(G¤_8§(‹65Qæ:KË”ÜfwÈJ¥Zš±´NðÚ&Ñ|¹í„t8i·4³Ó×½(âH‡èCý^‘ed2°Œ?Ë 2ÿªÈRÝN˜P +'’^‹8Ó1d2 VAå,dÃF1¾&«¥/æÄD=HßíMòn‚ËØsd,=>üºz}‹I xþ€IJÃ$ž6f!ÆuðpËš¨¾SúŒÀù{")½ˆÏýéP¶oª1qü®ÁÿCR¯ï:A$¢±~{¾Á‹üПÿµs"ézàãø+ Êê¬)V<3Q—7e½Â‚@ëf2ð&ÂÔÙVíŸqkx´]=<¬è£ Š+|‚O|¼ý@82ˆ£‹©ËôÙóüOÌÆ™ŽS0 ÙAÀ­9ÈÁMÙ¥^‡!•ã  a×m”N§ õÔ:>›s3àtp“ À)­ûuÂ1ÀÅ]oèožé9P¶YD}XQðÀ¬1tŸÓÂÀ „G'Øê"­¦¢Cä„Pòò–Ϋ¾ë¸H:^ í^J÷ ßó?†›24Ì’ÒsÒëOÆGúƒÅ‘þ „*˜WjH˜&Dà +eéÄ&þx~Øk +ä*Ý É™M ALÜ»§‡s%ß9õ'&Ç1W›mùjRÙõ{”¹æ£ëž…‰BœÑŸP¸¹6) ,kʇ‰0â;qÚ€¨¡ÀäÚÚãÒUØÒÕßZ4iµÁK+!£/-VçH0> +çÑD”’-Ê:3–êv¢¡Pc^4ßL2…%æâVº³Ühò„ò4c­ô¤ˆRÊ]€Ñ–\ŠV7fžYæ¥ÇˆDJ;`XÌxäøñHÒˆ%,ëñ±ú¸ˆ0×kSìèÒØú7¥ŸMñ¬Â½³ ×j´.Þ T+(’m|ik»sPÛ` JÛ­âb¼Ý¦Õ{—BƒR)=UŽ“Ò‚hl˜gé>]aMƒ×,9DF]„e-+à¨îû–+8©¾rÑDcfÔÒh@Õ¿3zr‚ÞµRÐ4…‰HàÐNv&¦hñçTWâ †î.…}¦ÚYù°ÀÜG¶ƒˆ¤ud½˜.¦‰…ßeª5þ05…ÝÇz—Zj]4ƒ “w1Š\0húÃ|[Júó‡åã”$¤QŒ<9m» ÀDX+вI‰Nɘƒ—q€/ÖSt¯ZÈ‘ûAÃîH³ÿm!o€~½×ßt…¤ º2{Ž«@ØL…‘ú·ã£D£ú{VÕPŸïr¹Ëè{††>PKŒÀiŒZ•ÓZzhk¬I²rÆTCgl‘$Ö·aTìö¥ÚYm›šJ£²Ýb^`”–5ýv¬àdЮ&œ'à·7En¡öØ\­S('iÒi¯é·RpÕuÚ¼ž àk± ž_O…"èŠÌÖ'ãVnTFíŠÍ–KŠ²®¹{-‹/êªkåH½¢”¶öõ\W\å«øʃßä*u]Qã{µV±¸òVÒ›Hh‹ŽÎDÉ–Gaè‹ðµÆ8QF:¡ÕëÖÄÓ³2XÈܽ]†ÔÏ¡2bø;÷ßú‚ÞJtMël†xü–ÃgmÓgEhE••*>zˆÂƒ¶ÐéO¾m»Î´ë]4k~EŠÍÁ;4%¤NŠÂËëy Œ³º4†xÑÿ}uõ'ºÒÐþ˜„„/?º£ET‚2e-L^ˆç­Œ›äN)–LÊ[3ªÅBc´ÇeefΊÃÇžøL*47ÂŒºš²êªÑcßü¾‡É/ïA¶¢Þ4é~ûÚÄŽ­§ÃUaYyTiò^/¾ý""»‘Gqʶ +kûèõ¡Þa€<Ž@«£¿ïqäiìØ@:ļΖ"´ZtÀɶ¡?|F0·m ~B}×Eã„Ö]ÉÞ¡M7€éæ‚Fý+¬ïÁí +½5ºÂ5æaŸ6|šq˜ÐëA¤S‘ônhaЫg#ˆV˜ilÚqø…Ë·­(„á´ª[Óà2àdƒûÚ“9òŸóv¼LZ•Ï–\'NrÓQT&1À;Þ3Y¶÷j†+~Sm vRM“—ç V¸_hvK%OÆ1e¼»YÞrîMlk‘ă,ómúOm?‹çŸ¸ÙÓ"Ñú„ôÂ@•ÒâwÖÞÊz…±rp3 ûöû\p©z»|à;Ù^Mdûu»¿º¼|yyA8….•.‹ja¬t‰­¾qý`èúÂOàZ…¶þ +Ä“N"\‹ä´_ùaEŒóŠÈ¶Å>þtâ¾%AlZv&>}ë å/3;ú±ÿîÑíX ·˜ïþðàSÊ#u UßwÈk/ùó‘ÿ8ŽŽø;úÓaò4RÆ)5äé/SyW01bŒ‰®ôÒ=<žÚ ¢¡'ñf ßµ8…¶ˆê½W¶-±O,Ý"x‹õbšé‰oi©í'ç´°OªC—íèýR­Fþ{¤²~¶¡éáÄBßñ}zÒqEðÇ^d7,†;Nè„®©ÚÞ‰T»vêfsÙ¬³ßñÜÈI\yÌÕ‘ïtX§¬ŒqJí-߉œÈ£áÏqz7!Ø$MÓ’3Ðo}ᔃŸ%'äp»Äü?ýì?s2Ž½é›^À 13…@î?aÝ~'=åý¿xÇðBendstream endobj -1636 0 obj << +1665 0 obj << /Type /Page -/Contents 1637 0 R -/Resources 1635 0 R +/Contents 1666 0 R +/Resources 1664 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R -/Annots [ 1641 0 R 1642 0 R ] +/Parent 1652 0 R +/Annots [ 1670 0 R 1671 0 R ] >> endobj -1641 0 obj << +1670 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [253.7995 146.8976 417.685 158.9572] +/Rect [253.7995 149.3637 417.685 161.4234] /Subtype/Link/A<> >> endobj -1642 0 obj << +1671 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [63.4454 108.9117 208.8999 119.0735] +/Rect [63.4454 110.455 208.8999 120.6168] /Subtype/Link/A<> >> endobj -1638 0 obj << -/D [1636 0 R /XYZ 56.6929 794.5015 null] +1667 0 obj << +/D [1665 0 R /XYZ 56.6929 794.5015 null] >> endobj -614 0 obj << -/D [1636 0 R /XYZ 56.6929 652.1213 null] +622 0 obj << +/D [1665 0 R /XYZ 56.6929 662.0717 null] >> endobj -1639 0 obj << -/D [1636 0 R /XYZ 56.6929 614.8935 null] +1668 0 obj << +/D [1665 0 R /XYZ 56.6929 624.1661 null] >> endobj -618 0 obj << -/D [1636 0 R /XYZ 56.6929 614.8935 null] +626 0 obj << +/D [1665 0 R /XYZ 56.6929 624.1661 null] >> endobj -1127 0 obj << -/D [1636 0 R /XYZ 56.6929 584.5024 null] +1137 0 obj << +/D [1665 0 R /XYZ 56.6929 593.0972 null] >> endobj -622 0 obj << -/D [1636 0 R /XYZ 56.6929 289.5256 null] +630 0 obj << +/D [1665 0 R /XYZ 56.6929 294.2701 null] >> endobj -1640 0 obj << -/D [1636 0 R /XYZ 56.6929 251.3901 null] +1669 0 obj << +/D [1665 0 R /XYZ 56.6929 255.4568 null] >> endobj -626 0 obj << -/D [1636 0 R /XYZ 56.6929 251.3901 null] +634 0 obj << +/D [1665 0 R /XYZ 56.6929 255.4568 null] >> endobj -955 0 obj << -/D [1636 0 R /XYZ 56.6929 222.7156 null] +965 0 obj << +/D [1665 0 R /XYZ 56.6929 226.1045 null] >> endobj -1643 0 obj << -/D [1636 0 R /XYZ 56.6929 53.7852 null] +1672 0 obj << +/D [1665 0 R /XYZ 56.6929 53.5688 null] >> endobj -1644 0 obj << -/D [1636 0 R /XYZ 56.6929 53.7852 null] +1673 0 obj << +/D [1665 0 R /XYZ 56.6929 53.5688 null] >> endobj -1635 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R /F53 1017 0 R /F11 1367 0 R /F41 925 0 R >> +1664 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R /F53 1027 0 R /F11 1384 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1647 0 obj << -/Length 2824 +1676 0 obj << +/Length 2825 /Filter /FlateDecode >> stream @@ -7350,724 +7465,731 @@ xÚµZ]{ ´ ¸ ¤ƒùÈ ’Tï*ÓªA<—Ǻ·ÃÐû"Âa‡˜%(ŒÏ´’–Û µ9Te>#ôá¶6Ø6Ay2¾b$´ÌHÜ)³|Þ‰zA 4lY3ª#Óò`ï§6c¿ŒI0‚¶Æ¾[g;µú,{Ù•oúùFÿÍ+”Ÿë¯’ù Ø.…‚1¦‘•ß‹WñÈÌvìï&}•/\ u˜sê 8˜$Ðk“3©-å¡ZKY\{h½ÐÙ}lÛ6ø´Üïå®+Ö›­ßÁä\²Z*)#ý&ÇÍ:±¦‚ñwù·á£s£˜cû‰†Íçƒb‘÷Ç}ªO]žkÓçÁj%¬¼SƒS5ø´‰3zÝÏÞs–äWœ¹Ïw;sâû}&ÁDÂ(ò[„%ä6-Ô~P‘xN|¸­9ô‡­ÁF^d‡\•<ÛkÒlIdu¾ª2!³ðôtÖÅ:Úsq\û½I$Ø‚?Sÿ[Bn…k¡6ãû>ûòᶠ-ï+ÜF6Þuþ}^=gÛô5Õ Œ@õµ®­Ñ LKç„ }RÛˆÈBFo_#y5Y«YÈ°ƒŽAóañEXûDó*å!¯¶yJIŒ/…—(™»¼Øg¹vB½fgÉ>ÜprªÅ'¸ª LnÿË_úZ;‡1¢Iâ8L£A„ÂcýRâWpÞsóIðé«ÿ+Ab«endstream +ï+ÜF6Þuþ}^=gÛô5Õ Œ@õµ®­Ñ LKç„ }RÛˆÈBFo_#y5Y«YÈ°ƒŽAóañEXûDó*å!¯¶yJIŒ/…—(™»¼Øg¹vB½fgÉ>ÜprªÅ'¸ª LnÿË_úZ;‡1¢Iâ8L£Ð|Rʱ~)ñ+ppò!²ù&øôÝÿ ‡ÿb¿endstream endobj -1646 0 obj << +1675 0 obj << /Type /Page -/Contents 1647 0 R -/Resources 1645 0 R +/Contents 1676 0 R +/Resources 1674 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R ->> endobj -1648 0 obj << -/D [1646 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1649 0 obj << -/D [1646 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1650 0 obj << -/D [1646 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1651 0 obj << -/D [1646 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1652 0 obj << -/D [1646 0 R /XYZ 85.0394 746.3107 null] ->> endobj -1653 0 obj << -/D [1646 0 R /XYZ 85.0394 731.5461 null] ->> endobj -1654 0 obj << -/D [1646 0 R /XYZ 85.0394 728.1497 null] ->> endobj -1655 0 obj << -/D [1646 0 R /XYZ 85.0394 713.3851 null] ->> endobj -1656 0 obj << -/D [1646 0 R /XYZ 85.0394 709.9887 null] ->> endobj -1657 0 obj << -/D [1646 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1071 0 obj << -/D [1646 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1658 0 obj << -/D [1646 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1659 0 obj << -/D [1646 0 R /XYZ 85.0394 648.8377 null] ->> endobj -1660 0 obj << -/D [1646 0 R /XYZ 85.0394 634.0731 null] ->> endobj -1661 0 obj << -/D [1646 0 R /XYZ 85.0394 630.6767 null] ->> endobj -1662 0 obj << -/D [1646 0 R /XYZ 85.0394 615.9121 null] ->> endobj -1663 0 obj << -/D [1646 0 R /XYZ 85.0394 612.5156 null] ->> endobj -1664 0 obj << -/D [1646 0 R /XYZ 85.0394 585.7959 null] ->> endobj -1665 0 obj << -/D [1646 0 R /XYZ 85.0394 582.3994 null] ->> endobj -1666 0 obj << -/D [1646 0 R /XYZ 85.0394 567.6349 null] ->> endobj -1667 0 obj << -/D [1646 0 R /XYZ 85.0394 564.2384 null] ->> endobj -1668 0 obj << -/D [1646 0 R /XYZ 85.0394 549.5337 null] ->> endobj -1669 0 obj << -/D [1646 0 R /XYZ 85.0394 546.0774 null] ->> endobj -1670 0 obj << -/D [1646 0 R /XYZ 85.0394 531.3128 null] ->> endobj -1671 0 obj << -/D [1646 0 R /XYZ 85.0394 527.9163 null] ->> endobj -1672 0 obj << -/D [1646 0 R /XYZ 85.0394 513.1518 null] ->> endobj -1673 0 obj << -/D [1646 0 R /XYZ 85.0394 509.7553 null] ->> endobj -1674 0 obj << -/D [1646 0 R /XYZ 85.0394 483.0356 null] ->> endobj -1675 0 obj << -/D [1646 0 R /XYZ 85.0394 479.6391 null] ->> endobj -1676 0 obj << -/D [1646 0 R /XYZ 85.0394 464.8745 null] +/Parent 1652 0 R >> endobj 1677 0 obj << -/D [1646 0 R /XYZ 85.0394 461.4781 null] +/D [1675 0 R /XYZ 85.0394 794.5015 null] >> endobj 1678 0 obj << -/D [1646 0 R /XYZ 85.0394 446.7135 null] +/D [1675 0 R /XYZ 85.0394 752.3015 null] >> endobj 1679 0 obj << -/D [1646 0 R /XYZ 85.0394 443.3171 null] +/D [1675 0 R /XYZ 85.0394 752.3015 null] >> endobj 1680 0 obj << -/D [1646 0 R /XYZ 85.0394 428.5525 null] +/D [1675 0 R /XYZ 85.0394 752.3015 null] >> endobj 1681 0 obj << -/D [1646 0 R /XYZ 85.0394 425.156 null] +/D [1675 0 R /XYZ 85.0394 746.3107 null] >> endobj 1682 0 obj << -/D [1646 0 R /XYZ 85.0394 355.0758 null] +/D [1675 0 R /XYZ 85.0394 731.5461 null] >> endobj 1683 0 obj << -/D [1646 0 R /XYZ 85.0394 355.0758 null] +/D [1675 0 R /XYZ 85.0394 728.1497 null] >> endobj 1684 0 obj << -/D [1646 0 R /XYZ 85.0394 355.0758 null] +/D [1675 0 R /XYZ 85.0394 713.3851 null] >> endobj 1685 0 obj << -/D [1646 0 R /XYZ 85.0394 352.0499 null] +/D [1675 0 R /XYZ 85.0394 709.9887 null] >> endobj 1686 0 obj << -/D [1646 0 R /XYZ 85.0394 337.3452 null] +/D [1675 0 R /XYZ 85.0394 651.9592 null] +>> endobj +1081 0 obj << +/D [1675 0 R /XYZ 85.0394 651.9592 null] >> endobj 1687 0 obj << -/D [1646 0 R /XYZ 85.0394 333.8889 null] +/D [1675 0 R /XYZ 85.0394 651.9592 null] >> endobj 1688 0 obj << -/D [1646 0 R /XYZ 85.0394 309.8192 null] +/D [1675 0 R /XYZ 85.0394 648.8377 null] >> endobj 1689 0 obj << -/D [1646 0 R /XYZ 85.0394 303.7727 null] +/D [1675 0 R /XYZ 85.0394 634.0731 null] >> endobj 1690 0 obj << -/D [1646 0 R /XYZ 85.0394 278.3282 null] +/D [1675 0 R /XYZ 85.0394 630.6767 null] >> endobj 1691 0 obj << -/D [1646 0 R /XYZ 85.0394 273.6565 null] +/D [1675 0 R /XYZ 85.0394 615.9121 null] >> endobj 1692 0 obj << -/D [1646 0 R /XYZ 85.0394 246.9367 null] +/D [1675 0 R /XYZ 85.0394 612.5156 null] >> endobj 1693 0 obj << -/D [1646 0 R /XYZ 85.0394 243.5403 null] +/D [1675 0 R /XYZ 85.0394 585.7959 null] >> endobj 1694 0 obj << -/D [1646 0 R /XYZ 85.0394 173.5556 null] +/D [1675 0 R /XYZ 85.0394 582.3994 null] >> endobj 1695 0 obj << -/D [1646 0 R /XYZ 85.0394 173.5556 null] +/D [1675 0 R /XYZ 85.0394 567.6349 null] >> endobj 1696 0 obj << -/D [1646 0 R /XYZ 85.0394 173.5556 null] +/D [1675 0 R /XYZ 85.0394 564.2384 null] >> endobj 1697 0 obj << -/D [1646 0 R /XYZ 85.0394 170.4341 null] +/D [1675 0 R /XYZ 85.0394 549.5337 null] >> endobj 1698 0 obj << -/D [1646 0 R /XYZ 85.0394 144.9896 null] +/D [1675 0 R /XYZ 85.0394 546.0774 null] >> endobj 1699 0 obj << -/D [1646 0 R /XYZ 85.0394 140.3179 null] +/D [1675 0 R /XYZ 85.0394 531.3128 null] >> endobj 1700 0 obj << -/D [1646 0 R /XYZ 85.0394 113.5982 null] +/D [1675 0 R /XYZ 85.0394 527.9163 null] >> endobj 1701 0 obj << -/D [1646 0 R /XYZ 85.0394 110.2017 null] +/D [1675 0 R /XYZ 85.0394 513.1518 null] >> endobj 1702 0 obj << -/D [1646 0 R /XYZ 85.0394 95.4372 null] +/D [1675 0 R /XYZ 85.0394 509.7553 null] >> endobj 1703 0 obj << -/D [1646 0 R /XYZ 85.0394 92.0407 null] +/D [1675 0 R /XYZ 85.0394 483.0356 null] >> endobj -1645 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +1704 0 obj << +/D [1675 0 R /XYZ 85.0394 479.6391 null] >> endobj -1706 0 obj << -/Length 2889 -/Filter /FlateDecode ->> -stream -xÚµšKsÛ8Çïþ:JU1>´¥ØJlÅ+ÙÙ™Êä@KtÌ2E:"•Äß~ă E‚™ÝÚòÁÐÄ_ÂÝ@7I&þÈÄõÒpâ‡r1q'Ûýž|ƒ¾«3"mΕѹiuqöÇ{æOBzÔ›Ü?c™Üï¾L#ÄÐ FÀÓ‹åÅÍòÓÕ:º»þkvN]<ý»8ZÍŇÍÃÕÕbs¿׋h¾\] ™û^ˆ§ÑÝÝb5_þ)ú#>*Ö­—‹Íìëý‡³Å½þÚæO#˜ñïüýìËW<ÙÁ/üp† wò>`DÂNögŽËë0¦Z²³ÍÙ¿ô€Fo}kïTŒ(óhÏ\Q2!…®K[“å†Èc”Õ“µNÊâxØ&r -’mq؉ëûÌÀÛkRþJFï;@ÃJ|)ÖPYñïôeýþ’€}í*Ja:\ß.­­NµYhhê#—úmíUò~>aÓùj#.ÖkÙü1ÍÓ*-òzN:?…`¦•yð%ø@ïà.Š§—èý,¤S$ÆXüH3LŸãCUéìŠêÿtzïã—¢”½kÙûeû8Ïå q¾Íw3BC5øm±}‰_“êÂÝðý`&ÔW:Ë@øǧmU<Â÷¨)âÃhˆ°†(ðœ¦Õ0am¥ ûØ&l•nŸh÷ni °ðÓW›èN-{îLÛz1ƒ¶ú¡ì/ø Òü›ø 0ñÑdïe‘%YË{ºœa>è3âp0¬,”•æø66iƒCW»Ÿƒ©ñµìOo“Ü .½éSqm‹_¯5¤,ÅdBçM±¹ë ‹eÆ{ÝàMSÙQ='âb^ìãTv®â½lݼ•U²ïÁÊ0A.¢ VFÀ{å`ñ´”mÏAÇç™ëNÓ_i"=Ns®/Œv?ó)z×YK¹*æéö%ÍË"—âüÞôºð†×…ÛžÃÆüÓ°²¬ e¥ÖÅ.µ¬ ›´±.ºÚýëÂÔ†uÁˆ+Ü”§Ž¿¼¡^übóšlÓ§·zeðÏ5rnÙ,Þ\ÊüéCžrP¢±³ÍBËr—äUÊÏUÉ¡MGò™ŠåЦc9Ó±œYc9C~à23–‡bæƒÅyšdb‹¡ñ©ø-om¡†=*Ëàk)ÖÇ<Ñ ýaÐ.EÌÙhÃÊZYiДa h›´º«ÝÚÔþ˜È5¾øµ}Žóor"æI–|SÛq'‘Û:\žÜzµé;Y.$2¬}°RG§¨jí‘ݳ“…£Èq¼1 -†•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý -?â7?Òù1Щsàží’9(ô½6¡¹$´ˆË*‹_ÙÌjGß½Sçbá÷ÏšX8LŒÀÌ6 + 1eeó-ÄlÒ±®v?1S{½‰þ¸»°³øŠó‰,ú. çøÀ ǨVªÊª¡êXÎ1ViƒjW»Ÿª©=Oªxûœìþ›QdïF¢Ì.cŽûÞ*¤‘!ñFИVÃh´•Fã–€UºAs¢Ý‹¦¥]m|U§ Dä92˜–F€wH'óyJ¦Ï ÊWýi) ¢U‚]›5¯Ì|ò9ÇG$ð&D_ja £:Д„\£$t# eªb­°•]<?f„µHÞ'‡Y0m²IŠñp‰–y.Â4 #+À°²¬e¥W@H\Ë -°I+ «Ý¿Lí{Ôqî‹5eÇaÓèX=ö[½‰®»"ååÑÇ¡®¢»ûµðOÞ_3æ}í¬“wÉä¤?Èz®Óð†hÁSÃú.•®‘Wä‘ÊïlEÕMò -ñC§)vŽ ¶á‘#occa(lAFˆ%¼ZD ~mÕ~z*?èn®£s"`Èl„Ê£.¥”[ˆ™¼À•(ÔU½¥Fõ–èê-i2\l—ðÀŒ˜cˆˆ¿´uæåE\#þò‚tü&™ª1ZP"¦}Ô Ç‘…£4j@RKÝΦkì÷£4„£&]ÉøZ?¤üÑ`'¿¿IËJ¦ž"öâv1Ž7܉üðô+)‡²w7JcðìLÚ[ªz!¯*¶Ï'5+0ˆ8ˆ‘ÐÌ0¦Œ407´”lº °®p/0SXÔP8þª’¼¬ŸTÂŒEMþ—Ç××âP £åhü‘JQ6‡F¯¯2ㄽÐØêN7HÜqÿ\ìE¾À[/eëõ1_eëg]0‡®ešÇy%»D - ͪ§ÕÚÁ´8¦e™öÕ€0&Ì‹· !6¬,Œ••ÙRM°J”»Úý˜Mík˜´L?gTÎö¿äÅϼë´7ß“.×rí²·üC㇌¤ó]Ë*~*›ÌñtûcêL뽈KV0£ü LHû9­®lé:–~p0ÀòYÈqðH6­†™k«æÍL†™[¥æ'Ú½Ì[Úz>ù¶ØÀ_%ÕÏâðÒä0ݺà'˜¾Ão@Æ¢Ø ,aö³ù¡õÖX¯‡4SÉK0œ¼7D«˜VJʪ¡dÛ/­Ò¥®v?%S{|?¦bÛ'¹ÚõÙ<ò⟮ ½až«¹{ÍÒ­QHoʺ2r÷¹¥É“Ó)œ_â]2P.·Aaðcg¤^gZY (+ Å m®c“6 tµû¡˜Úãéý¦:·•“Igæg=[cè"ÏgN{ò?Hç¸À“þϯíUq± 8¼P2ڮ嗪+ñŸ|uõ‚ïéwÿ–¡OYendstream -endobj 1705 0 obj << -/Type /Page -/Contents 1706 0 R -/Resources 1704 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R +/D [1675 0 R /XYZ 85.0394 464.8745 null] +>> endobj +1706 0 obj << +/D [1675 0 R /XYZ 85.0394 461.4781 null] >> endobj 1707 0 obj << -/D [1705 0 R /XYZ 56.6929 794.5015 null] +/D [1675 0 R /XYZ 85.0394 446.7135 null] >> endobj 1708 0 obj << -/D [1705 0 R /XYZ 56.6929 748.5056 null] +/D [1675 0 R /XYZ 85.0394 443.3171 null] >> endobj 1709 0 obj << -/D [1705 0 R /XYZ 56.6929 748.5056 null] +/D [1675 0 R /XYZ 85.0394 428.5525 null] >> endobj 1710 0 obj << -/D [1705 0 R /XYZ 56.6929 748.5056 null] +/D [1675 0 R /XYZ 85.0394 425.156 null] >> endobj 1711 0 obj << -/D [1705 0 R /XYZ 56.6929 743.7078 null] +/D [1675 0 R /XYZ 85.0394 355.0758 null] >> endobj 1712 0 obj << -/D [1705 0 R /XYZ 56.6929 719.6381 null] +/D [1675 0 R /XYZ 85.0394 355.0758 null] >> endobj 1713 0 obj << -/D [1705 0 R /XYZ 56.6929 711.8197 null] +/D [1675 0 R /XYZ 85.0394 355.0758 null] >> endobj 1714 0 obj << -/D [1705 0 R /XYZ 56.6929 697.0552 null] +/D [1675 0 R /XYZ 85.0394 352.0499 null] >> endobj 1715 0 obj << -/D [1705 0 R /XYZ 56.6929 691.8868 null] +/D [1675 0 R /XYZ 85.0394 337.3452 null] >> endobj 1716 0 obj << -/D [1705 0 R /XYZ 56.6929 665.1671 null] +/D [1675 0 R /XYZ 85.0394 333.8889 null] >> endobj 1717 0 obj << -/D [1705 0 R /XYZ 56.6929 659.9987 null] +/D [1675 0 R /XYZ 85.0394 309.8192 null] >> endobj 1718 0 obj << -/D [1705 0 R /XYZ 56.6929 635.929 null] +/D [1675 0 R /XYZ 85.0394 303.7727 null] >> endobj 1719 0 obj << -/D [1705 0 R /XYZ 56.6929 628.1106 null] +/D [1675 0 R /XYZ 85.0394 278.3282 null] >> endobj 1720 0 obj << -/D [1705 0 R /XYZ 56.6929 601.3909 null] +/D [1675 0 R /XYZ 85.0394 273.6565 null] >> endobj 1721 0 obj << -/D [1705 0 R /XYZ 56.6929 596.2225 null] +/D [1675 0 R /XYZ 85.0394 246.9367 null] >> endobj 1722 0 obj << -/D [1705 0 R /XYZ 56.6929 569.5028 null] +/D [1675 0 R /XYZ 85.0394 243.5403 null] >> endobj 1723 0 obj << -/D [1705 0 R /XYZ 56.6929 564.3344 null] +/D [1675 0 R /XYZ 85.0394 173.5556 null] >> endobj 1724 0 obj << -/D [1705 0 R /XYZ 56.6929 549.6297 null] +/D [1675 0 R /XYZ 85.0394 173.5556 null] >> endobj 1725 0 obj << -/D [1705 0 R /XYZ 56.6929 544.4015 null] +/D [1675 0 R /XYZ 85.0394 173.5556 null] >> endobj 1726 0 obj << -/D [1705 0 R /XYZ 56.6929 529.6968 null] +/D [1675 0 R /XYZ 85.0394 170.4341 null] >> endobj 1727 0 obj << -/D [1705 0 R /XYZ 56.6929 524.4686 null] +/D [1675 0 R /XYZ 85.0394 144.9896 null] >> endobj 1728 0 obj << -/D [1705 0 R /XYZ 56.6929 500.3989 null] +/D [1675 0 R /XYZ 85.0394 140.3179 null] >> endobj 1729 0 obj << -/D [1705 0 R /XYZ 56.6929 492.5805 null] +/D [1675 0 R /XYZ 85.0394 113.5982 null] >> endobj 1730 0 obj << -/D [1705 0 R /XYZ 56.6929 467.136 null] +/D [1675 0 R /XYZ 85.0394 110.2017 null] >> endobj 1731 0 obj << -/D [1705 0 R /XYZ 56.6929 460.6924 null] +/D [1675 0 R /XYZ 85.0394 95.4372 null] >> endobj 1732 0 obj << -/D [1705 0 R /XYZ 56.6929 436.6227 null] ->> endobj -1733 0 obj << -/D [1705 0 R /XYZ 56.6929 428.8043 null] +/D [1675 0 R /XYZ 85.0394 92.0407 null] >> endobj -1734 0 obj << -/D [1705 0 R /XYZ 56.6929 414.0996 null] +1674 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1735 0 obj << -/D [1705 0 R /XYZ 56.6929 408.8714 null] +/Length 2889 +/Filter /FlateDecode +>> +stream +xÚµšMsÛ8†ïþ:JU1†øy¤-ÅVb+^ÉÎÎT&Z‚c–)Ò©$þ÷Û >R$˜Ù­-LM¼tÝ$ž8ð‡'žüˆD“ r‘ç`o²ÝŸ9“oÐwu†¥Í¹2:7­.îÏþxOƒI„"Ÿø“û'c¬9aˆ'÷»/ÓQ4ƒœéÅòâfùéjß]ÿ5;'ž3ýÛñœx56WW‹ÍýB~\/âùru&xvø‘3ïî«ùòOÑóQÝz¹Ø̾Þ8[Üë¯mþ4ìPþ¿Ÿ}ùêLvð ?œ9ˆF¡7ù „£ˆLög®G‘çRªZ²³ÍÙ¿ô€Fo}kïTaê“ž¹"x‚1Š<´&Ë‹O ­'kÍÊâxØ29l[vâú~3ðöÊÊÁ_I1 +<ahX‰/Eû*+þ¾¬ß_bÒ¯]eLL‡Ø¥µÕ©6 mLä‘ ­½b?áçc:¯6âb½– ìoÇ!yZ¥E^ÏIç§`Ç…i¥>| >Ð;¸‹8ÓKô~‘)c,~°Ã ‡ÓçäPÕxz#»âú?™Þ&ûä¥(eïZö>dÙ>És9h’ïDóÝ “H ~[l_’WVR¸¾Ì„úJçbÿø´­ŠGø5eXt"ìG +}w„°i5LX[iÂã¶J7„O´{ ·´Xøé«M|§–=w¦í½˜A;ˆ‚ÈÀ öHü¿HiþM|˜øh²÷²ÈX–%òž.w˜Cú# + e¥9„ƒMÚàÐÕîç`jÇ|-Ó[–€;Á¥?}*¢mñ뵦ÁÊRL&tÞÛ„»ž°Xæ`¼× þ4•Õ3óbŸ¤²s•ìeë歬ؾ+u0òxm°R Þ+K~¤¥lk|:>ÏX’§,CˆX ·HÅoyk 5ìQY_K±>æLƒ†A{Ñ ¢#  + he¥AêX@Û¤ Ð]í~ЦöG&×øâ×ö9ɿɉ˜³Œ}SÛq'‘Û:\žÜzµé;Y…$2´}°RG§¸jí‘ݳ“…%Èuý1 +†•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý +?â7?Òù1Щsàží’º( +ü6¡¹$´HÊ*K^˜l¦µ£ïÞ©s±ðûgM,&†af0 †•…˜²2ˆb6iƒXW»Ÿ˜©½ÞÄÜÎ=ØYEXž(E_q@ü¿Ø&ÁFQã‚Z}ƒ¤Æ¯G¨ù +\'4v¹@`ã£Ø\ÇÄÆ?5ØÄaFÔÊ'­0ÝÐA>Lº¦i5 S[0-»Uºy¢Ý ³¥½©ŠC½KáˆN/ÙAlapød%osk†¼¯fÈCÞ(ò+Å[Œ0$aH;†ü~Îßkºžã)†Â¦^aüâ“4¾:îöG8ÔÊùŴ‰´ÿÄs]8Ç4 #° + leeÀŽ,°mÒì®v?lS›ÃNÄ>ŠsÁÙô©>µœ_³º2#zas,E*[dè ÐéС7[‹8K¡7”¡7jñ÷[¡×Ç'>,ú. çøÐƨVªÊª¡êZÎ1ViƒjW»Ÿª©=gU²}f»ÿfcÙ»QèÁ³K©ëýŸ·J +id„ý4¦Õ0m¥Ñ¡¥`•nÐœh÷¢ii×G›@ÕéBQ€…yŽ §¥QàÒÉž’é3¨òÕ`ZÊ€h• E×fÍ+3Ÿ‡|Î ¼ 1…ZȨ4%!Ï( ÝHÃE™ªX«leÅÆX-’÷ìñ0 §M6Ig¸DK}9$Ä#+À°²¬e¥W@„=Ë +°I+ «Ý¿Lí{Ôu]î‹5e×¥ÓøX=ö[½‰®»"ååÑÇ¡®â»ûµðOÞ_3æ}í¬“wÉä¤?ÈúžÛð†hÁSÃú.•®‘Wä‘ÊïlEÕ {…ø¡Ó;G +ÛðÈ‘·±±06Š ÅØ^-¢¿¶j?½F•t7×ñ90d6BäQ—Â-D‹L^àJj±ªÞ£z‹uõ7®G¶Ëx8›c°ˆ¿¤uæåE\#þò‚tò&™ª1ZP"¦}Ä Ç‘…£4j@KÝΦkì÷£4„ã&]ÉøZ?$üÑ`'¿¿IËJ¦ž"ö:íbo¸ùáé+‡²w7Jcðì··T#ôB^UlŸOj4V`qÅ‘˜a4 Li`^d) Øt`]á^`¦°¨¡†p"üU±¼¬ŸTÂ숚*ü/¯¯Å¡FË;ÑøƒJQ6‡F¿¯2`äø‘±ºÄ›n¸ãþ¹Ø‹|·^ÊÖëc +¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿa:L˜o©3†Ø°²0VVdK5Á*mPîj÷c6µ¯aÒ2ýœQ9ÛCþ’?ó®Ó<Ül|Oº\˵ËÞòFnu<0–Îwu,«ä©l2ÇÓíªg0­÷ .XÁ”ðƒ< +ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹ +…º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ãóa ±~ãcðÆÓÊ‚AYé´ŽbË®e•60tµû1˜Ú—YR–™> +.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñÑ08¼2ڮ嗪+ñ9ùêêßÓïþ–ùO[endstream +endobj +1734 0 obj << +/Type /Page +/Contents 1735 0 R +/Resources 1733 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1652 0 R >> endobj 1736 0 obj << -/D [1705 0 R /XYZ 56.6929 382.1516 null] +/D [1734 0 R /XYZ 56.6929 794.5015 null] >> endobj 1737 0 obj << -/D [1705 0 R /XYZ 56.6929 376.9833 null] +/D [1734 0 R /XYZ 56.6929 748.5056 null] >> endobj 1738 0 obj << -/D [1705 0 R /XYZ 56.6929 350.2636 null] +/D [1734 0 R /XYZ 56.6929 748.5056 null] >> endobj 1739 0 obj << -/D [1705 0 R /XYZ 56.6929 345.0952 null] +/D [1734 0 R /XYZ 56.6929 748.5056 null] >> endobj 1740 0 obj << -/D [1705 0 R /XYZ 56.6929 321.0255 null] +/D [1734 0 R /XYZ 56.6929 743.7078 null] >> endobj 1741 0 obj << -/D [1705 0 R /XYZ 56.6929 313.2071 null] +/D [1734 0 R /XYZ 56.6929 719.6381 null] >> endobj 1742 0 obj << -/D [1705 0 R /XYZ 56.6929 298.5024 null] +/D [1734 0 R /XYZ 56.6929 711.8197 null] >> endobj 1743 0 obj << -/D [1705 0 R /XYZ 56.6929 293.2742 null] +/D [1734 0 R /XYZ 56.6929 697.0552 null] >> endobj 1744 0 obj << -/D [1705 0 R /XYZ 56.6929 267.8297 null] +/D [1734 0 R /XYZ 56.6929 691.8868 null] >> endobj 1745 0 obj << -/D [1705 0 R /XYZ 56.6929 261.3861 null] +/D [1734 0 R /XYZ 56.6929 665.1671 null] >> endobj 1746 0 obj << -/D [1705 0 R /XYZ 56.6929 199.468 null] +/D [1734 0 R /XYZ 56.6929 659.9987 null] >> endobj 1747 0 obj << -/D [1705 0 R /XYZ 56.6929 199.468 null] +/D [1734 0 R /XYZ 56.6929 635.929 null] >> endobj 1748 0 obj << -/D [1705 0 R /XYZ 56.6929 199.468 null] +/D [1734 0 R /XYZ 56.6929 628.1106 null] >> endobj 1749 0 obj << -/D [1705 0 R /XYZ 56.6929 191.7053 null] +/D [1734 0 R /XYZ 56.6929 601.3909 null] >> endobj 1750 0 obj << -/D [1705 0 R /XYZ 56.6929 176.9408 null] +/D [1734 0 R /XYZ 56.6929 596.2225 null] >> endobj 1751 0 obj << -/D [1705 0 R /XYZ 56.6929 171.7724 null] +/D [1734 0 R /XYZ 56.6929 569.5028 null] >> endobj 1752 0 obj << -/D [1705 0 R /XYZ 56.6929 157.0677 null] +/D [1734 0 R /XYZ 56.6929 564.3344 null] >> endobj 1753 0 obj << -/D [1705 0 R /XYZ 56.6929 151.8395 null] +/D [1734 0 R /XYZ 56.6929 549.6297 null] >> endobj 1754 0 obj << -/D [1705 0 R /XYZ 56.6929 137.1348 null] +/D [1734 0 R /XYZ 56.6929 544.4015 null] >> endobj 1755 0 obj << -/D [1705 0 R /XYZ 56.6929 131.9066 null] +/D [1734 0 R /XYZ 56.6929 529.6968 null] >> endobj 1756 0 obj << -/D [1705 0 R /XYZ 56.6929 117.2018 null] +/D [1734 0 R /XYZ 56.6929 524.4686 null] >> endobj 1757 0 obj << -/D [1705 0 R /XYZ 56.6929 111.9736 null] +/D [1734 0 R /XYZ 56.6929 500.3989 null] >> endobj 1758 0 obj << -/D [1705 0 R /XYZ 56.6929 97.2091 null] +/D [1734 0 R /XYZ 56.6929 492.5805 null] >> endobj 1759 0 obj << -/D [1705 0 R /XYZ 56.6929 92.0407 null] +/D [1734 0 R /XYZ 56.6929 467.136 null] >> endobj -1704 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +1760 0 obj << +/D [1734 0 R /XYZ 56.6929 460.6924 null] >> endobj -1762 0 obj << -/Length 2542 -/Filter /FlateDecode ->> -stream -xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾cEÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#€Œ‘%d8ú·õÝ (Šü6ÄÄyqÏïÕ2CT8ìP1¥^jÂ.ËCšâ½ÓÝ!+²º—/«Z¬•.Úóý)Û1?ãà•pH½ cx ~ßBü‹'þ.¸ç, -ÔÆCùÎ/¬g8‰#Ϫl Η6äP·!åP¸’Ò*§$r¨Üm(}ˆmQ» ~S¥T¼¶¼eÚ¤âè.Ë™8º)‹_ò÷'ÁƒX¼­ªŽ§œ¦*@™A>O3ì'SÉÇ5cUéÜ{Ü6¥AFB¬d„ †t!T™Rv2´”&#Á¾ 'tGÆö8=ðQ2tHséÅîÏRâcê…qì÷)Y*6ÒÊô;öRÍâé)­~hFB;#¼9EñF )#JJ1â#ŒŒ¸  F†ØFLð3åßTYêLºÇk)u]–Œ(éAz̆UשׁG£Tƒ ÆaŸ‡kÉ×´(²b?`»ç8ÿ˜Q:Í~ϘÅs<>Â_ ©r°$…4I>N$9p ŽÀŠ 䯵Twù:pœEž¥5«L=°æ{Yý»£(Û²qŽÂØ‹ü Ï$ÓC–7Êé4Ik¹ý ÷£*Û¿5‚"Ù+æ>I¶Pn ü@ÄHB;I ¡]Ktº8ól«ËGXáÝÄjù°P-Ã0MÀL(6ƒ‹º 'wiÞ@‰Úh¢¾ÀG°5Ø|=¤E»KžùóHž5Ì\‡€¶¨–ç¥fºÙ¾i¾íU…ôN‰!¸›RÆ•”A9vPî‚68b[H7Á9£ÂÅØ|šÒ„»>»i*°µÇ×€%Á /ŒxéÊÅÚØÏ÷Fâ(ßWæÃEtšDœ@Æ6}8@aÇ8¿Á¸¸WK8ßù¢W7é~§Åö5‚ð &ÐA]Ê榔p-eî(ƒÐágØã„÷ÀŸNÅm¹c<€Ó¨ó™^C‰U·„óó`Ê -‘gDDvXýZdüR±(’>¬Ž%PØ×q#êâ,«%7æ-y¨^ôB0WD¡õˈ…§JøŸrö³:û ¸ÊY'ˆŒ¨2”¨‚æËÓF @¨µ> ‡ÐÈ¿P˜R3RRº›‚ÐaF.hÃŒ†Ø32Á¿Ö­uˆ]Vçê(•:_ÝübU”¥ÜàÓ\ÄÞ¢zÉšªí‡Än¥ œ¼œKðˆ zløÓô´Eé˜éÛ EðÂñ…v”r¡¤4$pt‘Nhƒˆ!¶…\g„P×üPÔnppSŽiñ£Gkñž½y#$¾Äæt‡$dúÉWþ-gd¦vÕ×îÁw~áì”ù«¼@?½Ü„þ¯~ùÑEy¹Ns˜-b+Ÿ~D½(¼”.L);ŸZªã“:ŠG'tÇçö8Ÿ=ð…ž¾³¢‹Þ)—’UÁÀùTõÇg9µcºrÖ(£úÿ¬·é¶ÝM ¼ƒ ¼tBZ¤.éQäèá\¸)` 'òšA7FØÖ¨™-b¸"2ú]¨JÑŽ¼¡ Ý—àyõ`è×’5J%^ƒúû“¤¨sÆщ7àØN¡^€‚ ¥€)å JIi¦ 7;˜rAT ±-\™àKþåW²­›$œ.Nͨ¼ŒóÎÄ’ˆƒüH¹ùI4}çsñvõM42¼ùàç¼+KëFÞo·›u=êTt„) ºC(ù>Š»ïÚñ7ßµ„ž©«{ˆôíDB—-Ô…/{¦”ƒH%¥‰LËå\БCl ‘&¸®éVOÅxê¨Ò¢îŠ¼³/÷üÓjžlü›òž:Gkêå©Òžª”«­ÞëÊÙ6ìØ¥0Xfâ{1Oý™øãK]æ¬a4°´Ã1gˆýªó½ý^1ã+êyˆ±Ø&GÁXܶ`JÙmAK]”#):¡;[8÷…¸°?œÞvC8k£'ü¿gå¾JoहXùì(0Cß‹)MÌá(žÞxâ»T|dy.wÚ/&>tËÛ·Sþ“«)ÿ”³¬)˜þîH°äö–RšŽ]Ydd¥£ð{ó˜ÿ¡…×РînJ9(VRºî #G£ì„6(b[(6Á¯³B§­Ïé S=sv–iG{ -9±ôIŒ»©Òï¯bF²SÁà´?Õæ!±ò¡‘n !; J¨û$9úhnÇÁxœY8YŒ!à4¼ªÅœ7%ÿo6×°(£2ùP.ì÷ba¯¾ëÇÊ+à.kVœ¸¥7álE‘9ôˆAWܧ«»­Ì›òž[ݨϧÌøƧSþ3ŸŸxYAFméÿÿ ˘OF‰m3Ù…«‡j»#tö{1ýÓ­ógÿ/’#÷ðendstream -endobj 1761 0 obj << -/Type /Page -/Contents 1762 0 R -/Resources 1760 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R +/D [1734 0 R /XYZ 56.6929 436.6227 null] +>> endobj +1762 0 obj << +/D [1734 0 R /XYZ 56.6929 428.8043 null] >> endobj 1763 0 obj << -/D [1761 0 R /XYZ 85.0394 794.5015 null] +/D [1734 0 R /XYZ 56.6929 414.0996 null] >> endobj 1764 0 obj << -/D [1761 0 R /XYZ 85.0394 748.4854 null] +/D [1734 0 R /XYZ 56.6929 408.8714 null] >> endobj 1765 0 obj << -/D [1761 0 R /XYZ 85.0394 748.4854 null] +/D [1734 0 R /XYZ 56.6929 382.1516 null] >> endobj 1766 0 obj << -/D [1761 0 R /XYZ 85.0394 748.4854 null] +/D [1734 0 R /XYZ 56.6929 376.9833 null] >> endobj 1767 0 obj << -/D [1761 0 R /XYZ 85.0394 743.3452 null] +/D [1734 0 R /XYZ 56.6929 350.2636 null] >> endobj 1768 0 obj << -/D [1761 0 R /XYZ 85.0394 728.6405 null] +/D [1734 0 R /XYZ 56.6929 345.0952 null] >> endobj 1769 0 obj << -/D [1761 0 R /XYZ 85.0394 723.1655 null] +/D [1734 0 R /XYZ 56.6929 321.0255 null] >> endobj 1770 0 obj << -/D [1761 0 R /XYZ 85.0394 708.4607 null] +/D [1734 0 R /XYZ 56.6929 313.2071 null] >> endobj 1771 0 obj << -/D [1761 0 R /XYZ 85.0394 702.9857 null] +/D [1734 0 R /XYZ 56.6929 298.5024 null] >> endobj 1772 0 obj << -/D [1761 0 R /XYZ 85.0394 688.2211 null] +/D [1734 0 R /XYZ 56.6929 293.2742 null] >> endobj 1773 0 obj << -/D [1761 0 R /XYZ 85.0394 682.8059 null] +/D [1734 0 R /XYZ 56.6929 267.8297 null] >> endobj 1774 0 obj << -/D [1761 0 R /XYZ 85.0394 668.0414 null] +/D [1734 0 R /XYZ 56.6929 261.3861 null] >> endobj 1775 0 obj << -/D [1761 0 R /XYZ 85.0394 662.6262 null] +/D [1734 0 R /XYZ 56.6929 199.468 null] >> endobj 1776 0 obj << -/D [1761 0 R /XYZ 85.0394 599.7666 null] +/D [1734 0 R /XYZ 56.6929 199.468 null] >> endobj 1777 0 obj << -/D [1761 0 R /XYZ 85.0394 599.7666 null] +/D [1734 0 R /XYZ 56.6929 199.468 null] >> endobj 1778 0 obj << -/D [1761 0 R /XYZ 85.0394 599.7666 null] +/D [1734 0 R /XYZ 56.6929 191.7053 null] >> endobj 1779 0 obj << -/D [1761 0 R /XYZ 85.0394 591.7571 null] +/D [1734 0 R /XYZ 56.6929 176.9408 null] >> endobj 1780 0 obj << -/D [1761 0 R /XYZ 85.0394 565.0374 null] +/D [1734 0 R /XYZ 56.6929 171.7724 null] >> endobj 1781 0 obj << -/D [1761 0 R /XYZ 85.0394 559.6222 null] +/D [1734 0 R /XYZ 56.6929 157.0677 null] >> endobj 1782 0 obj << -/D [1761 0 R /XYZ 85.0394 534.1777 null] +/D [1734 0 R /XYZ 56.6929 151.8395 null] >> endobj 1783 0 obj << -/D [1761 0 R /XYZ 85.0394 527.4872 null] +/D [1734 0 R /XYZ 56.6929 137.1348 null] >> endobj 1784 0 obj << -/D [1761 0 R /XYZ 85.0394 502.0427 null] +/D [1734 0 R /XYZ 56.6929 131.9066 null] >> endobj 1785 0 obj << -/D [1761 0 R /XYZ 85.0394 495.3523 null] +/D [1734 0 R /XYZ 56.6929 117.2018 null] >> endobj 1786 0 obj << -/D [1761 0 R /XYZ 85.0394 420.5376 null] +/D [1734 0 R /XYZ 56.6929 111.9736 null] >> endobj 1787 0 obj << -/D [1761 0 R /XYZ 85.0394 420.5376 null] +/D [1734 0 R /XYZ 56.6929 97.2091 null] >> endobj 1788 0 obj << -/D [1761 0 R /XYZ 85.0394 420.5376 null] ->> endobj -1789 0 obj << -/D [1761 0 R /XYZ 85.0394 412.5281 null] +/D [1734 0 R /XYZ 56.6929 92.0407 null] >> endobj -1790 0 obj << -/D [1761 0 R /XYZ 85.0394 388.4584 null] +1733 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1791 0 obj << -/D [1761 0 R /XYZ 85.0394 380.3932 null] +/Length 2542 +/Filter /FlateDecode +>> +stream +xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾cEÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#€Œ‘%d8ú·õÝ (Šü6ÄÄyqÏïÕ2CT8ìP1¥^jÂ.ËCšâ½ÓÝ!+²º—/«Z¬•.Úóý)Û1?ãà•pH½ cx ~ßBü‹'þ.¸ç, +ÔÆCùÎ/¬g8‰#Ϫl Η6äP·!åP¸’Ò*§$r¨Üm(}ˆmQ» ~S¥T¼¶¼eÚ¤âè.Ë™8º)‹_ò÷'ÁƒX¼­ªŽ§œ¦*@™A>O3ì'SÉÇ5cUéÜ{Ü6¥AFB¬d„ †t!T™Rv2´”&#Á¾ 'tGÆö8=ðQ2tHséÅîÏRâcê…qì÷)Y*6ÒÊô;öRÍâé)­~hFB;#¼9EñF )#JJ1â#ŒŒ¸  F†ØFLð3åßTYêLºÇk)u]–Œ(éAz̆UשׁG£Tƒ ÆaŸ‡kÉ×´(²b?`»ç8ÿ˜Q:Í~ϘÅs<>Â_ ©r°$…4I>N$9p ŽÀŠ 䯵Twù:pœEž¥5«L=°æ{Yý»£(Û²qŽÂØ‹ü Ï$ÓC–7Êé4Ik¹ý ÷£*Û¿5‚"Ù+æ>I¶Pn ü@ÄHB;I ¡]Ktº8ól«ËGXáÝÄjù°P-Ã0MÀL(6ƒ‹º 'wiÞ@‰Úh¢¾ÀG°5Ø|=¤E»KžùóHž5Ì\‡€¶¨–ç¥fºÙ¾i¾íU…ôN‰!¸›RÆ•”A9vPî‚68b[H7Á9£ÂÅØ|šÒ„»>»i*°µÇ×€%Á /ŒxéÊÅÚØÏ÷Fâ(ßWæÃEtšDœ@Æ6}8@aÇ8¿Á¸¸WK8ßù¢W7é~§Åö5‚ð &ÐA]Ê榔p-eî(ƒÐágØã„÷ÀŸNÅm¹c<€Ó¨ó™^C‰U·„óó`Ê +‘gDDvXýZdüR±(’>¬Ž%PØ×q#êâ,«%7æ-y¨^ôB0WD¡õˈ…§JøŸrö³:û ¸ÊY'ˆŒ¨2”¨‚æËÓF @¨µ> ‡ÐÈ¿P˜R3RRº›‚ÐaF.hÃŒ†Ø32Á¿Ö­uˆ]Vçê(•:_ÝübU”¥ÜàÓ\ÄÞ¢zÉšªí‡Än¥ œ¼œKðˆ zløÓô´Eé˜éÛ EðÂñ…v”r¡¤4$pt‘Nhƒˆ!¶…\g„P×üPÔnppSŽiñ£Gkñž½y#$¾Äæt‡$dúÉWþ-gd¦vÕ×îÁw~áì”ù«¼@?½Ü„þ¯~ùÑEy¹Ns˜-b+Ÿ~D½(¼”.L);ŸZªã“:ŠG'tÇçö8Ÿ=ð…ž¾³¢‹Þ)—’UÁÀùTõÇg9µcºrÖ(£úÿ¬·é¶ÝM ¼ƒ ¼tBZ¤.éQäèá\¸)` 'òšA7FØÖ¨™-b¸"2ú]¨JÑŽ¼¡ Ý—àyõ`è×’5J%^ƒúû“¤¨sÆщ7àØN¡^€‚ ¥€)å JIi¦ 7;˜rAT ±-\™àKþåW²­›$œ.Nͨ¼ŒóÎÄ’ˆƒüH¹ùI4}çsñvõM42¼ùàç¼+KëFÞo·›u=êTt„) ºC(ù>Š»ïÚñ7ßµ„ž©«{ˆôíDB—-Ô…/{¦”ƒH%¥‰LËå\БCl ‘&¸®éVOÅxê¨Ò¢îŠ¼³/÷üÓjžlü›òž:Gkêå©Òžª”«­ÞëÊÙ6ìØ¥0Xfâ{1Oý™øãK]æ¬a4°´Ã1gˆýªó½ý^1ã+êyˆ±Ø&GÁXܶ`JÙmAK]”#):¡;[8÷…¸°?œÞvC8k£'ü¿gå¾JoहXùì(0Cß‹)MÌá(žÞxâ»T|dy.wÚ/&>tËÛ·Sþ“«)ÿ”³¬)˜þîH°äö–RšŽ]Ydd¥£ð{ó˜ÿ¡…×РînJ9(VRºî #G£ì„6(b[(6Á¯³B§­Ïé S=sv–iG{ +9±ôIŒ»©Òï¯bF²SÁà´?Õæ!±ò¡‘n !; J¨û$9úhnÇÁxœY8YŒ!à4¼ªÅœ7%ÿo6×°(£2ùP.ì÷ba¯¾ëÇÊ+à.kVœ¸¥7álE‘9ôˆAWܧ«»­Ì›òž[ݨϧÌøƧSþ3ŸŸxYAFméÿÿ ˘OF‰m3Ù…«‡j»#D†®ºuþìÿ’{÷òendstream +endobj +1790 0 obj << +/Type /Page +/Contents 1791 0 R +/Resources 1789 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1843 0 R >> endobj 1792 0 obj << -/D [1761 0 R /XYZ 85.0394 365.6884 null] +/D [1790 0 R /XYZ 85.0394 794.5015 null] >> endobj 1793 0 obj << -/D [1761 0 R /XYZ 85.0394 360.2134 null] +/D [1790 0 R /XYZ 85.0394 748.4854 null] >> endobj 1794 0 obj << -/D [1761 0 R /XYZ 85.0394 345.4488 null] +/D [1790 0 R /XYZ 85.0394 748.4854 null] >> endobj 1795 0 obj << -/D [1761 0 R /XYZ 85.0394 340.0336 null] +/D [1790 0 R /XYZ 85.0394 748.4854 null] >> endobj 1796 0 obj << -/D [1761 0 R /XYZ 85.0394 325.269 null] +/D [1790 0 R /XYZ 85.0394 743.3452 null] >> endobj 1797 0 obj << -/D [1761 0 R /XYZ 85.0394 319.8539 null] +/D [1790 0 R /XYZ 85.0394 728.6405 null] >> endobj 1798 0 obj << -/D [1761 0 R /XYZ 85.0394 295.7842 null] +/D [1790 0 R /XYZ 85.0394 723.1655 null] >> endobj 1799 0 obj << -/D [1761 0 R /XYZ 85.0394 287.7189 null] +/D [1790 0 R /XYZ 85.0394 708.4607 null] >> endobj 1800 0 obj << -/D [1761 0 R /XYZ 85.0394 272.9543 null] +/D [1790 0 R /XYZ 85.0394 702.9857 null] >> endobj 1801 0 obj << -/D [1761 0 R /XYZ 85.0394 267.5392 null] +/D [1790 0 R /XYZ 85.0394 688.2211 null] >> endobj 1802 0 obj << -/D [1761 0 R /XYZ 85.0394 252.7746 null] +/D [1790 0 R /XYZ 85.0394 682.8059 null] >> endobj 1803 0 obj << -/D [1761 0 R /XYZ 85.0394 247.3594 null] +/D [1790 0 R /XYZ 85.0394 668.0414 null] >> endobj 1804 0 obj << -/D [1761 0 R /XYZ 85.0394 223.2897 null] +/D [1790 0 R /XYZ 85.0394 662.6262 null] >> endobj 1805 0 obj << -/D [1761 0 R /XYZ 85.0394 215.2245 null] +/D [1790 0 R /XYZ 85.0394 599.7666 null] >> endobj 1806 0 obj << -/D [1761 0 R /XYZ 85.0394 149.4956 null] +/D [1790 0 R /XYZ 85.0394 599.7666 null] >> endobj 1807 0 obj << -/D [1761 0 R /XYZ 85.0394 149.4956 null] +/D [1790 0 R /XYZ 85.0394 599.7666 null] >> endobj 1808 0 obj << -/D [1761 0 R /XYZ 85.0394 149.4956 null] +/D [1790 0 R /XYZ 85.0394 591.7571 null] >> endobj 1809 0 obj << -/D [1761 0 R /XYZ 85.0394 144.3554 null] +/D [1790 0 R /XYZ 85.0394 565.0374 null] >> endobj 1810 0 obj << -/D [1761 0 R /XYZ 85.0394 120.2857 null] +/D [1790 0 R /XYZ 85.0394 559.6222 null] >> endobj 1811 0 obj << -/D [1761 0 R /XYZ 85.0394 112.2205 null] +/D [1790 0 R /XYZ 85.0394 534.1777 null] >> endobj 1812 0 obj << -/D [1761 0 R /XYZ 85.0394 97.4559 null] +/D [1790 0 R /XYZ 85.0394 527.4872 null] >> endobj 1813 0 obj << -/D [1761 0 R /XYZ 85.0394 92.0407 null] +/D [1790 0 R /XYZ 85.0394 502.0427 null] >> endobj -1760 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +1814 0 obj << +/D [1790 0 R /XYZ 85.0394 495.3523 null] >> endobj -1816 0 obj << -/Length 2121 -/Filter /FlateDecode ->> -stream -xÚ¥YIs㸾ûWèª*B°pÍM¶ÔŽ»=¶cy*™t÷¦`‰eŠÔˆ”»5¿>x J$5•”Äòà}x 6¢ðc#Ï'~Ä£Q¹Ä£Ì%›+:ZÁÜí34“šhbS]¿\ýí“F‰|î^Þ,Y!¡aÈF/˯Δ2 Ô¹¾»¾¿{¼}ž>ýã·ñ„{ÔùF=:}˜agñëíí|ñ27Ýçùtv÷p $l< üˆ:Ó§§ùÃìîß8?URi3z3_Œ¿¿|¾š¿4˶·Æ¨Pkþýêëw:ZÂ?_Q"¢Ðý€%,Šøhsåz‚x®õHvµ¸úg#Кլ¦b”páó[q6bŒDžÇ[Æò"â .´±_Ë"“•\âg c™ìwiu0¦ùtSönV¸Ð Ñ-*\›è±¦RKû -Z9õ½ï§šç`/VÝPë‘¥›ñ€xÇù>Þ”VØr­hÒÀúà\¤=ê’êxG¢ì QÁtz-äNwg)Ö¨(ëIsž Žª8êÃmpÔ‡<Þ¤ v~Ý.ãJvA1âòÈ‚PóüÖšaƒŸéM·»4Ãæ ~è“0 | -›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ Q?~H"\ÈK6Õ5Uƒ 4ÀaHµ…éînlÝ5" ªUã Û " tž„\°˜ß`:Ôé*Oóv¦ûj]húsœ¸Ï ]EV¸ãܹ&Èø¯qÄ™e ©*tãÂy(>äæUî0ŒÕü­(Æ)¥ý˜‰ˆP7º„™E5€YMuÄ,¢˜ ©¶0;ÕÝ™­»'7.‚Ý›,Þ¥ß(åI\5ƒõ÷?E^»\Wû.§â, 4àaÛ«æÆ«îå´ìv"„õÂaÌ/bQ RS5€¸îP0Rmrª»[÷}ºI+ôÈÒÕZy¤àERl%Žo8dæ\çËü7y–e™)1SÏ2)vKl+w{~Ö®Ö¬! -¸÷‹Š{Jð/qYÊŽéZA/‰E©¢—›ÉÄv±Zæ©ñ^H=Hœ‡ê<›ªÒ†ªÔ÷ T}„ôLw'¤-ÝÏr)•óä):‚_í" :ÖɼJÁÃT¬çâ*Æ–¾QÌL”„þkZuaHC°ÈcL¤ c"ð´c"Ž!–Ðx4D·ûåfŸ/ËREM±Ú±‰¥µ—Š~HU uÙDD€" Ï<7¤×‚óDq7š–â™ÌäÊŠ‚*aÕvÐ m0éMËqý±¦îõGŽë†¬1MÄlÁ„JíyW—†j@›j’šªÁ$ô±!Õ(§º»Q±uß(Éáhö죶ÅM±Ù^¯iÖd··bW[íOÙájªD7j£³0è §¥H -\§Il‡·îLx‹j›šÊÂfà²4¨ÚÂæTw76¶î¦>wëºPµšúÚ:ƒ©†) ¡o¼ÆN¼H/2Æ‹P¬}9ƒþ<¯vl>i^¹ó§#Û§,^uà,à²ËÁ uLlF[1±vÎ/EöŽwgÕûlFÉ:;T­#¡£o_!dÝèO rÄ /Ý$lªþÓP5'&*‚UOÌ™îÎÓÒÝS•ž^ô…Oþ¬` u!Wt-ªçÙtìy΋òÌ)}*v›¸3ú°ò»mçÀqº_íËê«Ó‡±‰€á2ª!áA¹Gýæ‘' .Î]rsi$Ívñ[ÕULSHÊ.Dæj WèÕ\ÐÆ‚ïnV+ÀdÜ :º]ìWëÉRñààb÷®‹OÅ¿,’ýj’çTÉ¢¾ºîTómÍó|•æRî »1v\¾#1˜]X½01˜]K|P¢m/2kÔÅKèèëd8êÏ<ÁÑ_ -aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp -uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉Wà -BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚™8 -ÓÙ„õç‘A­Ç> endobj +1816 0 obj << +/D [1790 0 R /XYZ 85.0394 420.5376 null] >> endobj 1817 0 obj << -/D [1815 0 R /XYZ 56.6929 794.5015 null] +/D [1790 0 R /XYZ 85.0394 420.5376 null] >> endobj 1818 0 obj << -/D [1815 0 R /XYZ 56.6929 749.4437 null] +/D [1790 0 R /XYZ 85.0394 412.5281 null] >> endobj 1819 0 obj << -/D [1815 0 R /XYZ 56.6929 749.4437 null] +/D [1790 0 R /XYZ 85.0394 388.4584 null] >> endobj 1820 0 obj << -/D [1815 0 R /XYZ 56.6929 749.4437 null] +/D [1790 0 R /XYZ 85.0394 380.3932 null] >> endobj 1821 0 obj << -/D [1815 0 R /XYZ 56.6929 746.6461 null] +/D [1790 0 R /XYZ 85.0394 365.6884 null] >> endobj 1822 0 obj << -/D [1815 0 R /XYZ 56.6929 722.5763 null] +/D [1790 0 R /XYZ 85.0394 360.2134 null] >> endobj 1823 0 obj << -/D [1815 0 R /XYZ 56.6929 716.7581 null] +/D [1790 0 R /XYZ 85.0394 345.4488 null] >> endobj 1824 0 obj << -/D [1815 0 R /XYZ 56.6929 701.9936 null] +/D [1790 0 R /XYZ 85.0394 340.0336 null] >> endobj 1825 0 obj << -/D [1815 0 R /XYZ 56.6929 698.8254 null] +/D [1790 0 R /XYZ 85.0394 325.269 null] >> endobj 1826 0 obj << -/D [1815 0 R /XYZ 56.6929 684.1207 null] +/D [1790 0 R /XYZ 85.0394 319.8539 null] >> endobj 1827 0 obj << -/D [1815 0 R /XYZ 56.6929 680.8926 null] +/D [1790 0 R /XYZ 85.0394 295.7842 null] >> endobj 1828 0 obj << -/D [1815 0 R /XYZ 56.6929 656.8229 null] +/D [1790 0 R /XYZ 85.0394 287.7189 null] >> endobj 1829 0 obj << -/D [1815 0 R /XYZ 56.6929 651.0047 null] +/D [1790 0 R /XYZ 85.0394 272.9543 null] >> endobj 1830 0 obj << -/D [1815 0 R /XYZ 56.6929 636.3 null] +/D [1790 0 R /XYZ 85.0394 267.5392 null] >> endobj 1831 0 obj << -/D [1815 0 R /XYZ 56.6929 633.072 null] +/D [1790 0 R /XYZ 85.0394 252.7746 null] >> endobj 1832 0 obj << -/D [1815 0 R /XYZ 56.6929 609.0023 null] +/D [1790 0 R /XYZ 85.0394 247.3594 null] >> endobj 1833 0 obj << -/D [1815 0 R /XYZ 56.6929 603.184 null] +/D [1790 0 R /XYZ 85.0394 223.2897 null] >> endobj 1834 0 obj << -/D [1815 0 R /XYZ 56.6929 579.1143 null] +/D [1790 0 R /XYZ 85.0394 215.2245 null] >> endobj 1835 0 obj << -/D [1815 0 R /XYZ 56.6929 573.2961 null] +/D [1790 0 R /XYZ 85.0394 149.4956 null] >> endobj 1836 0 obj << -/D [1815 0 R /XYZ 56.6929 558.5914 null] +/D [1790 0 R /XYZ 85.0394 149.4956 null] >> endobj 1837 0 obj << -/D [1815 0 R /XYZ 56.6929 555.3634 null] +/D [1790 0 R /XYZ 85.0394 149.4956 null] >> endobj 1838 0 obj << -/D [1815 0 R /XYZ 56.6929 540.5988 null] +/D [1790 0 R /XYZ 85.0394 144.3554 null] >> endobj 1839 0 obj << -/D [1815 0 R /XYZ 56.6929 537.4306 null] +/D [1790 0 R /XYZ 85.0394 120.2857 null] >> endobj 1840 0 obj << -/D [1815 0 R /XYZ 56.6929 510.7109 null] +/D [1790 0 R /XYZ 85.0394 112.2205 null] >> endobj 1841 0 obj << -/D [1815 0 R /XYZ 56.6929 507.5427 null] ->> endobj -630 0 obj << -/D [1815 0 R /XYZ 56.6929 477.5928 null] +/D [1790 0 R /XYZ 85.0394 97.4559 null] >> endobj 1842 0 obj << -/D [1815 0 R /XYZ 56.6929 453.2532 null] ->> endobj -634 0 obj << -/D [1815 0 R /XYZ 56.6929 369.7201 null] ->> endobj -1843 0 obj << -/D [1815 0 R /XYZ 56.6929 345.3805 null] ->> endobj -1844 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] +/D [1790 0 R /XYZ 85.0394 92.0407 null] >> endobj -1845 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] ->> endobj -1846 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] ->> endobj -1847 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] ->> endobj -1814 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R /F14 729 0 R >> +1789 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1850 0 obj << -/Length 1945 +1846 0 obj << +/Length 2121 /Filter /FlateDecode >> stream -xÚµX[Ûº~ϯ0Ð>x#†wI穹µÙdS4[ô!Ù­MÛBdI±äÝEÿ{g8¤lyåcÅ+r8ü83œ-fþÄ,3Œ«\ÏÒ\3Ã…™-¶¯øl k{%6Š­L&V£2f2™Î’S·÷¯^ÿUŠ™äÌZif÷«á,›¦Œç³ûå×ù›¶uõ²üy“HÃçooî£]š¥Y*p‡Rf•±~ǧ¢Þñ·ÅÚuá™ÒV†=Ö0ËMæ÷¼eâ&œóù²\#?2¨”)kIŒ»b뎚å,·Ò%˜Ê@fäÂÍþÜoR¦4z÷…UÓ|ß·4Þ÷eUö‡£`‚åÆDÁ´`2¤Ì—CÝ´]éuxõá~°©åL(°¨– “«)» S}áR2Î@{Ç!ühq¢a¼’kÐÓ‚µ¾þ¥s»'·{Óä‘t2§F2e™äé9æ÷ÿævµè‰B¯7Y6KÿÝm³ëÿtÉÙù?®Š}Ad©X.¸:Çë¯âõ‡öÀûyÝi -O3i_Üüá*Ü×ͶXüú€ZÿúÝ&sÎtÎí9´FöÁgDr®¸ßÏW„Ž¼hŒ8öN'?önwhÚž1öp)öU*™NʼnýSˆË±?pc?Ù\ÍHfs•þÑN ~G´È5m]5E•Œ¬˜9X6šõJö}ÿáË»ÜþýþöóÝÀ=Jþ#P“ÿË -! ˆ(ñ7|Ùl‹²†B ù¼¬WÍn[ôeƒ•Ï×»‘Í›Öí€U¦ŽÖ -š~ã\¹ŸåcåˆÜ7ME+€a{·#¤5€×kâ¤Zë>¦=‰ÒwÇnÅÓùmOT8åꈷy‡ŽºŒü™ê°*"ÖKH,£][‡@î7ŽÈEÝ=Ãq‘Zôa›—5ðиßïj·¤å©²=#-DZ q;2.ááȈ3t€Ò-Ae³OM×Ç‚ª–·•²ò˶¬Ë1ïú]Ñ7^x ï;7á l>Tœ .ݲ1Û÷ ö¤äîµÛ4 ŠnùQŒ––auÛÑÒ£[(…_nVô-û°½„ kþ ,d`…â|Oáþöè¢gZ¥h«ìÁ| ƒ›ýwß·ûýGðùg¸›ÝËv=´ C‡BDúnŠ'¶`WàG«}½À˜(ªá<¸ÍzÂà -³‰1éï\³\«XûXÌΚeyn@Çœ¥iJÿ¦ê7Í~½™8Jè8•ºvµ2eàÁÀUJÎkŒñª:àÌ›{Iôç²ßmÑl·`ý¤*kGkëýÖÕ}‡Wg$\.qU×צè‰æE¿Ûf ü=ãšR7€ÕB¹»ýB(bŠ%%}r¡h©ëCŽ8†(ÎŽ™JVÎç;C´Gˆ½ »=(½;Ф DïÀxÆØ$õÔ$ä½ ··¨X7$̉ˆnw˜‘ßêùóÆÕ4Âtò²È§9Âêp‘ÉfÚ«Lfc@¤OØð]—O®Fõšÿ³®ÊïŽè®ØU¥˜`úEÑÁiJÙMZ3{{÷ž8ò€ºm!øA÷âxR³šŒ x‰¡¾X—Lj¢7ƒw6ÏdµDãÓ*züÛ}Õ—måN£»GòcX,»nïB”Ÿø…âÀ.7€Á ³áÆN‚lF)A‘ïK¥B1”phµ$Š?(¾°© J׺E‰N¸ y,{*Œ›TCV|i@ÉsïyÍ€^5繬ª XŠ2 —Ô«‚QÕ%jUvä–¨e=á‹Â&¤ˆêk×/^à ª©žb*Ëàá$@º‘¿/šz5!÷¸Ñ‘82ÿ¿(Fd ¿éɵ1&ŒÎH>ÀŽc\|a“ŽIëë ³É®Z_Èll}@ ^ñ}Ûßè!0\E᥮þ#:ötM0!ßmzì)¢¡,<ƒyfÇ–ò}“ÍBà§ðëºÐ Õ;(P;ØZêG¨;ZZºUÖÑ: -7Ñ[¤ʘÐ×ìbyíòTSþ*¤Ñ›þüïŸ?}øÏkx»Åb¦˜Í¬ü:5¿ßDU)ÇŸªŸ µƒ8Èa€\Ô¢7…r$sÍ´gõȇ½á'®ƒ“¶…ü¹ŒYÍu\¼œcN‘‚³N¦{ß`Bɺ½£/uµ0x÷‘¾ô{ƒo™1§tDm ¦«¢¥I¨í0ê¯ÂõMK`•{rÑè•ý!`zfó%5YH§Î-œ1ñ³¼eL–ÅBç£ëMÓÙ+5´‚çžy1W±»M—ª¢T£ªÊ!Å¢´¼:Ë/ ðw¿F“™C]ôª^®×"‡¤aÉ~\”,†Ïpî‰4êHi0Fë)šP´ƒ4ʧۻ˜@`eè¡¡„*œžõÐÈøîcäw H¨©Ômá/„íàÍ]tì¦}²÷/açïðãó˜áϲ“íÀ’yèÙÑo#\Ó/U€:q~ÜðïËóþ Ðažƒendstream +xÚ¥YIs㸾ûWèª*B°pÍM¶ÔŽ»=¶cy*™t÷¦`‰eŠÔˆ”»5¿>x J$5•”Äòà}x 6¢ðc#Ï'~Ä£Q¹Ä£Ì%›+:ZÁÜí34“šhbS]¿\ýí“F‰|î^Þ,Y!¡aÈF/˯Δ2 Ô¹¾»¾¿{¼}ž>ýã·ñ„{ÔùF=:}˜agñëíí|ñ27Ýçùtv÷p $l< üˆ:Ó§§ùÃìîß8?URi3z3_Œ¿¿|¾š¿4˶·Æ¨Pkþýêëw:ZÂ?_Q"¢Ðý€%,Šøhsåz‚x®õHvµ¸úg#Кլ¦b”páó[q6bŒDžÇ[Æò"â .´±_Ë"“•\âg c™ìwiu0¦ùtSönV¸Ð Ñ-*\›è±¦RKû +Z9õ½ï§šç`/VÝPë‘¥›ñ€xÇù>Þ”VØr­hÒÀúà\¤=ê’êxG¢ì QÁtz-äNwg)Ö¨(ëIsž Žª8êÃmpÔ‡<Þ¤ v~Ý.ãJvA1âòÈ‚PóüÖšaƒŸéM·»4Ãæ ~è“0 | +›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ Q?~H"\ÈK6Õ5Uƒ 4ÀaHµ…éînlÝ5" ªUã Û " tž„\°˜ß`:Ôé*Oóv¦ûj]húsœ¸Ï ]EV¸ãܹ&Èø¯qÄ™e ©*tãÂy(>äæUî0ŒÕü­(Æ)¥ý˜‰ˆP7º„™E5€YMuÄ,¢˜ ©¶0;ÕÝ™­»'7.‚Ý›,Þ¥ß(åI\5ƒõ÷?E^»\Wû.§â, 4àaÛ«æÆ«îå´ìv"„õÂaÌ/bQ RS5€¸îP0Rmrª»[÷}ºI+ôÈÒÕZy¤àERl%Žo8dæ\çËü7y–e™)1SÏ2)vKl+w{~Ö®Ö¬! +¸÷‹Š{Jð/qYÊŽéZA/‰E©¢—›ÉÄv±Zæ©ñ^H=Hœ‡ê<›ªÒ†ªÔ÷ T}„ôLw'¤-ÝÏr)•óä):‚_í" :ÖɼJÁÃT¬çâ*Æ–¾QÌL”„þkZuaHC°ÈcL¤ c"ð´c"Ž!–Ðx4D·ûåfŸ/ËREM±Ú±‰¥µ—Š~HU uÙDD€" Ï<7¤×‚óDq7š–â™ÌäÊŠ‚*aÕvÐ m0éMËqý±¦îõGŽë†¬1MÄlÁ„JíyW—†j@›j’šªÁ$ô±!Õ(§º»Q±uß(Éáhö죶ÅM±Ù^¯iÖd··bW[íOÙájªD7j£³0è §¥H +\§Il‡·îLx‹j›šÊÂfà²4¨ÚÂæTw76¶î¦>wëºPµšúÚ:ƒ©†) ¡o¼ÆN¼H/2Æ‹P¬}9ƒþ<¯vl>i^¹ó§#Û§,^uà,à²ËÁ uLlF[1±vÎ/EöŽwgÕûlFÉ:;T­#¡£o_!dÝèO rÄ /Ý$lªþÓP5'&*‚UOÌ™îÎÓÒÝS•ž^ô…Oþ¬` u!Wt-ªçÙtìy΋òÌ)}*v›¸3ú°ò»mçÀqº_íËê«Ó‡±‰€á2ª!áA¹Gýæ‘' .Î]rsi$Ívñ[ÕULSHÊ.Dæj WèÕ\ÐÆ‚ïnV+ÀdÜ :º]ìWëÉRñààb÷®‹OÅ¿,’ýj’çTÉ¢¾ºîTómÍó|•æRî »1v\¾#1˜]X½01˜]K|P¢m/2kÔÅKèèëd8êÏ<ÁÑ_ +aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp +uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉Wà +BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚™8 +ÓÙ„õç‘A­Ç> endobj -1851 0 obj << -/D [1849 0 R /XYZ 85.0394 794.5015 null] +1847 0 obj << +/D [1845 0 R /XYZ 56.6929 794.5015 null] >> endobj -638 0 obj << -/D [1849 0 R /XYZ 85.0394 769.5949 null] +1848 0 obj << +/D [1845 0 R /XYZ 56.6929 749.4437 null] >> endobj -1852 0 obj << -/D [1849 0 R /XYZ 85.0394 573.0107 null] +1849 0 obj << +/D [1845 0 R /XYZ 56.6929 749.4437 null] >> endobj -642 0 obj << -/D [1849 0 R /XYZ 85.0394 573.0107 null] +1850 0 obj << +/D [1845 0 R /XYZ 56.6929 749.4437 null] +>> endobj +1851 0 obj << +/D [1845 0 R /XYZ 56.6929 746.6461 null] +>> endobj +1852 0 obj << +/D [1845 0 R /XYZ 56.6929 722.5763 null] >> endobj 1853 0 obj << -/D [1849 0 R /XYZ 85.0394 538.4209 null] +/D [1845 0 R /XYZ 56.6929 716.7581 null] >> endobj 1854 0 obj << -/D [1849 0 R /XYZ 85.0394 504.6118 null] +/D [1845 0 R /XYZ 56.6929 701.9936 null] >> endobj 1855 0 obj << -/D [1849 0 R /XYZ 85.0394 432.7569 null] +/D [1845 0 R /XYZ 56.6929 698.8254 null] >> endobj 1856 0 obj << -/D [1849 0 R /XYZ 85.0394 303.3232 null] +/D [1845 0 R /XYZ 56.6929 684.1207 null] >> endobj -1848 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] +1857 0 obj << +/D [1845 0 R /XYZ 56.6929 680.8926 null] +>> endobj +1858 0 obj << +/D [1845 0 R /XYZ 56.6929 656.8229 null] +>> endobj +1859 0 obj << +/D [1845 0 R /XYZ 56.6929 651.0047 null] >> endobj 1860 0 obj << -/Length 3824 +/D [1845 0 R /XYZ 56.6929 636.3 null] +>> endobj +1861 0 obj << +/D [1845 0 R /XYZ 56.6929 633.072 null] +>> endobj +1862 0 obj << +/D [1845 0 R /XYZ 56.6929 609.0023 null] +>> endobj +1863 0 obj << +/D [1845 0 R /XYZ 56.6929 603.184 null] +>> endobj +1864 0 obj << +/D [1845 0 R /XYZ 56.6929 579.1143 null] +>> endobj +1865 0 obj << +/D [1845 0 R /XYZ 56.6929 573.2961 null] +>> endobj +1866 0 obj << +/D [1845 0 R /XYZ 56.6929 558.5914 null] +>> endobj +1867 0 obj << +/D [1845 0 R /XYZ 56.6929 555.3634 null] +>> endobj +1868 0 obj << +/D [1845 0 R /XYZ 56.6929 540.5988 null] +>> endobj +1869 0 obj << +/D [1845 0 R /XYZ 56.6929 537.4306 null] +>> endobj +1870 0 obj << +/D [1845 0 R /XYZ 56.6929 510.7109 null] +>> endobj +1871 0 obj << +/D [1845 0 R /XYZ 56.6929 507.5427 null] +>> endobj +638 0 obj << +/D [1845 0 R /XYZ 56.6929 477.5928 null] +>> endobj +1872 0 obj << +/D [1845 0 R /XYZ 56.6929 453.2532 null] +>> endobj +642 0 obj << +/D [1845 0 R /XYZ 56.6929 369.7201 null] +>> endobj +1873 0 obj << +/D [1845 0 R /XYZ 56.6929 345.3805 null] +>> endobj +1874 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1875 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1876 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1877 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1844 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F14 737 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1880 0 obj << +/Length 1945 +/Filter /FlateDecode +>> +stream +xÚµX[Ûº~ϯ0Ð>x#†wI穹µÙdS4[ô!Ù­MÛBdI±äÝEÿ{g8¤lyåcÅ+r8ü83œ-fþÄ,3Œ«\ÏÒ\3Ã…™-¶¯øl k{%6Š­L&V£2f2™Î’S·÷¯^ÿUŠ™äÌZif÷«á,›¦Œç³ûå×ù›¶uõ²üy“HÃçooî£]š¥Y*p‡Rf•±~ǧ¢Þñ·ÅÚuá™ÒV†=Ö0ËMæ÷¼eâ&œóù²\#?2¨”)kIŒ»b뎚å,·Ò%˜Ê@fäÂÍþÜoR¦4z÷…UÓ|ß·4Þ÷eUö‡£`‚åÆDÁ´`2¤Ì—CÝ´]éuxõá~°©åL(°¨– “«)» S}áR2Î@{Ç!ühq¢a¼’kÐÓ‚µ¾þ¥s»'·{Óä‘t2§F2e™äé9æ÷ÿævµè‰B¯7Y6KÿÝm³ëÿtÉÙù?®Š}Ad©X.¸:Çë¯âõ‡öÀûyÝi +O3i_Üüá*Ü×ͶXüú€ZÿúÝ&sÎtÎí9´FöÁgDr®¸ßÏW„Ž¼hŒ8öN'?önwhÚž1öp)öU*™NʼnýSˆË±?pc?Ù\ÍHfs•þÑN ~G´È5m]5E•Œ¬˜9X6šõJö}ÿáË»ÜþýþöóÝÀ=Jþ#P“ÿË +! ˆ(ñ7|Ùl‹²†B ù¼¬WÍn[ôeƒ•Ï×»‘Í›Öí€U¦ŽÖ +š~ã\¹ŸåcåˆÜ7ME+€a{·#¤5€×kâ¤Zë>¦=‰ÒwÇnÅÓùmOT8åꈷy‡ŽºŒü™ê°*"ÖKH,£][‡@î7ŽÈEÝ=Ãq‘Zôa›—5ðиßïj·¤å©²=#-DZ q;2.ááȈ3t€Ò-Ae³OM×Ç‚ª–·•²ò˶¬Ë1ïú]Ñ7^x ï;7á l>Tœ .ݲ1Û÷ ö¤äîµÛ4 ŠnùQŒ––auÛÑÒ£[(…_nVô-û°½„ kþ ,d`…â|Oáþöè¢gZ¥h«ìÁ| ƒ›ýwß·ûýGðùg¸›ÝËv=´ C‡BDúnŠ'¶`WàG«}½À˜(ªá<¸ÍzÂà +³‰1éï\³\«XûXÌΚeyn@Çœ¥iJÿ¦ê7Í~½™8Jè8•ºvµ2eàÁÀUJÎkŒñª:àÌ›{Iôç²ßmÑl·`ý¤*kGkëýÖÕ}‡Wg$\.qU×צè‰æE¿Ûf ü=ãšR7€ÕB¹»ýB(bŠ%%}r¡h©ëCŽ8†(ÎŽ™JVÎç;C´Gˆ½ »=(½;Ф DïÀxÆØ$õÔ$ä½ ··¨X7$̉ˆnw˜‘ßêùóÆÕ4Âtò²È§9Âêp‘ÉfÚ«Lfc@¤OØð]—O®Fõšÿ³®ÊïŽè®ØU¥˜`úEÑÁiJÙMZ3{{÷ž8ò€ºm!øA÷âxR³šŒ x‰¡¾X—Lj¢7ƒw6ÏdµDãÓ*züÛ}Õ—måN£»GòcX,»nïB”Ÿø…âÀ.7€Á ³áÆN‚lF)A‘ïK¥B1”phµ$Š?(¾°© J׺E‰N¸ y,{*Œ›TCV|i@ÉsïyÍ€^5繬ª XŠ2 —Ô«‚QÕ%jUvä–¨e=á‹Â&¤ˆêk×/^à ª©žb*Ëàá$@º‘¿/šz5!÷¸Ñ‘82ÿ¿(Fd ¿éɵ1&ŒÎH>ÀŽc\|a“ŽIëë ³É®Z_Èll}@ ^ñ}Ûßè!0\E᥮þ#:ötM0!ßmzì)¢¡,<ƒyfÇ–ò}“ÍBà§ðëºÐ Õ;(P;ØZêG¨;ZZºUÖÑ: +7Ñ[¤ʘÐ×ìbyíòTSþ*¤Ñ›þüïŸ?}øÏkx»Åb¦˜Í¬ü:5¿ßDU)ÇŸªŸ µƒ8Èa€\Ô¢7…r$sÍ´gõȇ½á'®ƒ“¶…ü¹ŒYÍu\¼œcN‘‚³N¦{ß`Bɺ½£/uµ0x÷‘¾ô{ƒo™1§tDm ¦«¢¥I¨í0ê¯ÂõMK`•{rÑè•ý!`zfó%5YH§Î-œ1ñ³¼eL–ÅBç£ëMÓÙ+5´‚çžy1W±»M—ª¢T£ªÊ!Å¢´¼:Ë/ ðw¿F“™C]ôª^®×"‡¤aÉ~\”,†Ïpî‰4êHi0Fë)šP´ƒ4ʧۻ˜@`eè¡¡„*œžõÐÈøîcäw H¨©Ômá/„íàÍ]tì¦}²÷/açïðãó˜áϲ“íÀ’yèÙÑo#\Ó/UÜœ7üÀûò¼ÿйž…endstream +endobj +1879 0 obj << +/Type /Page +/Contents 1880 0 R +/Resources 1878 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1843 0 R +>> endobj +1881 0 obj << +/D [1879 0 R /XYZ 85.0394 794.5015 null] +>> endobj +646 0 obj << +/D [1879 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1882 0 obj << +/D [1879 0 R /XYZ 85.0394 573.0107 null] +>> endobj +650 0 obj << +/D [1879 0 R /XYZ 85.0394 573.0107 null] +>> endobj +1883 0 obj << +/D [1879 0 R /XYZ 85.0394 538.4209 null] +>> endobj +1884 0 obj << +/D [1879 0 R /XYZ 85.0394 504.6118 null] +>> endobj +1885 0 obj << +/D [1879 0 R /XYZ 85.0394 432.7569 null] +>> endobj +1886 0 obj << +/D [1879 0 R /XYZ 85.0394 303.3232 null] +>> endobj +1878 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1889 0 obj << +/Length 3825 /Filter /FlateDecode >> stream @@ -8086,124 +8208,138 @@ h £L¨¸Â›2Ž¤Šà˜ÊjŽŠåû]>ê|“(ÑÆô®³av½Ò»^q¬$C“¡Ç|qYðw)Ð÷þæ Wr–ÇëçbÙ–Ÿ‹ÿx…f&@Ã2Ô \ÙZ6Ýmž _•˜¡ áÁKa¸t…'z ù²ªr±ØðPý–‰¿¬>åý¿È¦endstream +/ÉpÚQœÀ¬*VË9pcÐ-Zq4õM´ÂRˆû2G„/%þçï¥_ƒk)k'¾ñ‰ $†´™)‡:Dzú-Y}ÊûXȨendstream endobj -1859 0 obj << +1888 0 obj << /Type /Page -/Contents 1860 0 R -/Resources 1858 0 R +/Contents 1889 0 R +/Resources 1887 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1861 0 obj << -/D [1859 0 R /XYZ 56.6929 794.5015 null] +1890 0 obj << +/D [1888 0 R /XYZ 56.6929 794.5015 null] >> endobj -1862 0 obj << -/D [1859 0 R /XYZ 56.6929 752.1413 null] +1891 0 obj << +/D [1888 0 R /XYZ 56.6929 752.1413 null] >> endobj -1863 0 obj << -/D [1859 0 R /XYZ 56.6929 501.191 null] +1892 0 obj << +/D [1888 0 R /XYZ 56.6929 501.191 null] >> endobj -1858 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F53 1017 0 R /F11 1367 0 R >> +1887 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F53 1027 0 R /F11 1384 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1866 0 obj << -/Length 2981 +1895 0 obj << +/Length 3111 /Filter /FlateDecode >> stream -xÚ­Zmsã¶þî_¡o•' ’èL>øΗŒ;éʼn}Ót.þ@‹”űD:"eWÿ¾»X|IwÚÎÍœ@`‰]’-k¯?Ë›ü°/Jûèð€—j€ÏìíL\Pž®´¬ßÈy°å“1p¬Ê&Ͼ·§¼[V0ÇÁRº«­ï€F±Ï«c3x“€h̲à±np@žŠ¼¼M:Û¥±ésJ[·¬I|0Ânã: ˜N·qp0òh¥Sz„sÿVåvû‰³ù:Ï&ÞxÙíäuñdÕal9ÀÀ‡ ‰絿;¸Žcç0:B­xÒµ°&mDnYÄû,BCm°< É>a &£F-ï-7™„£€ëdÊ`ì #'¡½„Ø&t¹#©$5Z$Δ՘¯àÞBçÞL´¹Ëü ¶™ÞêÛò´$ß½†¯Æ -c §‘]×/HDëágp YÆqÞÇ%­i?µåkº;¢Ë\ðÏ;%ìÜÏ9uS&ƒ ÇkÇÓq€YÀ©c„ùDÛôuøâ¦:ìÇÈã N´K ¾£ud?ÛFàLD%QèC€SLzéœØûW²Ì[Ÿ‹Ç’¶þ¯g©2 ˜‚4\É8C%£¹½Zu¥Lf+“‘ÌÖK™U~+«‡fý2TÌP9bïhöRçªÌ‹á`ðî¯x¬þ[†[.!ªêŒåZ÷ŸniÌæÕÐe ¥ÔßÁTÌôS*l1mw²|“BL!™ÇQà9Æ'ôZ(b(Gj©ñõúÖR ×jp¢å.¯ÝΕô{õû¿YŸl}÷ïq>ÓjlÝ/ Ô­W/ìT.p@sÖÖ‹§ôcà0#UYRTéOL¹Þ˜„²ŽEïШ#5C#'åiôº>c&0I¨æ{©sÍq`ää=ÕÄ"éYÄ,‹¤g‘ô,bŽE’÷XÄ‹d—E -ªŽû-q6`¦4®ÒˆÊ&ýµëmU/ÿ” >í´aHâAÈ´+ñ -ë4eÈÅ…êS¯“áÙ@¾q|{L×Ïoi¸ Iö/P=»¢9]rÎÑM Îèp Äa(_×ø¿Ë C¨3¡âÐÓ·0jÖÇ¢Á±I¾ĮE¨çùÖ•šæ›—òhBô¨ùç b&óʽԹöAù­ Ñ—¼¯þ5»¬–—Pe•®ö„¢™3#Ob:lÎð>ß$ç <œþ4£qŠ²ÄÌÆ_Fe¬‘AóPã.âÀÇu[‡n„;Ñ™ ’:K)$a2 Ã~!˜f挎3.DBR'Ãæ·´#5³¥NÊliVíÓ¢üóiW^÷ö&Ï[à¥ÎMèï+ØAðî™p‡ ˆ\ª:'xЋÓÚ‰Tô ~¸Iq³ûïÁæíl›Ö5â!Bɨ–®ˆì.|`-DÍ$dq{!4£«˜¿ØmõK¾ö™·°V¥#ÅåJ@Mª åé'%][ûÕtÈHGþÊĦªMa²«ˆÔJ‚ ®Tÿ7뇼®v¯Seµ†]Á<¡]hb+E\ÀCT ¯¿3¼³3ÖE®!D“{‡Ñ>V¼½SýÛ‡$€ZÀÙûêXoG̳ W<»óñ¼{®ž§ròLe@Ú0œ?S]©é3奼›lW1ê&g•·nòLû¸›ì©7¡]’ Íã(4c…flÙšC÷vhGq$Ë‘Ö%Õ‡ÌÖ‡£oÚw¸ÍÂà×2šæéÓ‡Gi 1ÚÊÝËZÊÚo°ótn&è ‰d¼-6ò²Æ“­={ѸòtÒ;Ðæy6îŸ\ýo¢À4Ë8žx©ÞaYGj†eNªeÙ¶z›`Z,ƒ˜‰w ðRç .¼4 F{&ÜRÜ" ˆm]°lX{è¥ÒC°qþ>ÓÔ“ ª}Ænn§&!Èù$'ßéJMCì¥<Ä°Á£Q#c&çµ{©sõ}|#ÄŠÇ}ý×¹»œHÛz¥¡.ì±ÀÖ}€OeUžöm29âq#HýÃPw“äqyˆUp©Å;w¤f vR^wšVåî4é+g•·¾òLû¸¯ì©‡Ü£\Üaj¦mnî/+;µ¢¦“Rü)èBÈ7T”¼]Gj:'Õn³KŸ¦¡›SÞn¨}º®ú«ÿ˜n‘†Eú þÁŽtE J Õ½á/ÞâH¾»»RÓ z©ÖºlÔYå-¨gÚÇAí©§\X)[V+é.g^‡>På»ÐuuMãü—8ÊÒ&¥¯€(ðXØILrª”›Bö¼ŠBi/p`„&Wî] uç\OÙìN4¶54Ò™RÇ·©»|Bµ÷œø`ˆ`¾’ã §W³a6ª" ƒP^ˆ>çÑp¼|<ÚaZ4R[~SoEÌÝqOŒV×™×Øë#cX=ÿ=îìRovy“— Osj(âïøÔ®Ô ‡”çðúÏ)ïpx¨}‚Ã]õ†ÃÀ›@ƒ2‚„[c‹<(4>]Ó/rx½Í×Ï” @OVÔXxdöc6ô˜Í†ñÃÝYz4–LØ$êÜù™ž°}Ë0Æ©ª -Sz¸þrw÷ùµ_Ó]‘¥m!Rmzù qy’ -:¢K§Y&t„¦‰à„Zì&¯ç´¶·ƒCµã—ƒ]½×ô­p*-´Ÿ¡ôÓÏWwwî*6/;à|zèemVä?†LÀ -ÁD„ïÜ™´2Ó Z™öB±Í>ƒUÊ á@˜­^f¨vðGŽ_¤ºzÿ;Lïïþ?!ê*à_üŒ¬ùðÿóµ6%ñ¯<’‰*˜ „ÐÜ…0q¦†¦û?A:·ýßh @endstream +xÚ­ZmoÛ8þž_áoç k•õÆöCÚtYì¶Ù‹ÛC›Š¥ÄBlÉkÉÉùßß gH½Xrw‡5E9ÃáÃg†däLÀ?9KBO(Ìbx¡álµ½³'hûùB²Ì +-ºR–ïRñL{:ò£Ùò±3Vâ‰$‘³eöm~u{ûéóõÍŸ— ?óÞå"bþÛÕç¯W¿RÝí¥öçW?ºƒÏ(>I‹ÄüúæçËûå/Ÿ–Θ®ÁR(´ä¯‹o÷b–Ý¿\Oé$œ½Â‡ð¤Öþl{„Ê ¥lÍæâîâw7`§Õts@¨/Lüxľó@¨½HAzàczhŠª¼\(ÏëuuØdT~Èé·IŸsn~]ÛÒ¡.Ê'n_çè…÷?²£K&—$" QËâH2={$Ø#•d‘j×Úa·‡MS,u¾gûŽu“okúHëÖSxÎXˆæ«´ìÏᥨ‹‡ %Ú2[€·½D«JÒÓaè3Ìh~¬æÕ¡Ù,óÇý¥LæÕ–Zvõw^†ÿ$‹îI F6ßnŒzo6«éc]ÔMµ?’èw!üM@R‰˜ÿÃøeدX\Þ¼Œ,¬4Å*%aëkѬ٥]·+í{J|öiV<ù=ð4±Ì8 nm.ÓmN +DìáX=ÿÀZ¼àrø!öIÑAa2/jªùëï‹<£2ϳšÚ›ŠªžËêÕöͩɬÖ¤%÷K7OÕæ·å¾¬E;-9y zQEó›’Z?Ü|¾þÁ*)ê¾YUæ<ˆ$8§G„°£•~)2V!æéŽ+wû"mò¯K!Š ]z¾›eÿúéË0œÿ“ ùr»¼ùòùndžàt@¨å9”ÆžôeÌf´ë’ã4% ’yyØ>¥´´q‹šÄÅ"¬6Ìu€<à`ämÃoÐòÀÒ)}¶­Œr^~Âl¾Ê³‰»Í¯‹'V‡¡edÿ¼$J,i¿Û·žŽcK +œF¾ÖF2éZX“6‚‹dÉ>ŠÐPŽ•Jú^DA=ÉMFM8_26E[ç)B±bà l9R ­%TÀ2!ãŽdÓh•X"(«1®P@&¾e7l`ì2B¾6ó°-OK¢v¨5x5V˜5ñ¼¾ I¬ç?ã_$`œ”ý ’Ö´žàµùKº9 e)©ŒaXçH +7ÅsNÕ”È`ÁâÛqwìa0'Ð1ºùH ëôeØñ±ÚoÇÀ##/N´Í +ÞÑ<²m#îL”%‘ï"€ULziŸp† ¼ GaÁ{—9òï'™²ðDYx†(Ba4µg¡EWÊ$¶A2’Ø:)3Ëoeu߬vCÅR”#ñ†f'uªz€¼6†èþŠ;AÁì¿e¸ääBUC5°ÜSiùñ–Ú8­†*ãZʬ±fb¦ž2 °E$4¯dùc +1…drDû¿µPÄ@ŽÔRáëõ-C ×Ã¥;”›¼¶+WÒïÕŸ?ýÁœÌÜ}ãj,g²Æ–~¡¡nY½à¡là€â*­™ÅSú1î0-UYRTéL©ÞŒ ©RúoÀ¨#uFVÊÁèeu‚"ø8ñÃóŠÔ©æŠ$  RòžjBQàP$ECQàP$,ŠÙC‘°( +º( +áб\F`6À0¥¡J#v,›ô_Tn˜mÃ^ú$p.pùgw£ C’ô|¡í ¯`Ò |é…R…S™wÎüÑâí!]=¿¦mà2 Ùîà8ôPlŠæx)¥DšRRÐæ@‰ï¾¼¬ð›@†PF6Bž9¤·0jV‡¢Á¶I¼±ïIçñÖ•šÆ›“rÞ„èQíó̅‹µŸœWî¤NµNß!äùì«¿AÍ6«€ý%²J{ô„33mfALb*8gØç›ä\à†‡ÝŸfÔNQ¶“˜qütŠ52cék\Eløp¤jf8¤i)¢3$u ) _?‘ƒtÓMÓÌ|Ññ …p¬òÃ8|cI;Rg–ÔJ™%ͪmZ”?b>mO×½u…Á£DÄç-pR§&ô×lˆ x÷L¸Ã„NE6U€B“{U„iHmE*únR\ì~?X¼ —i^# áKHFu`Ï݉¬ +ù"nï"”t³ãd[½ËW.ó6 lU:r¶\(¥½Rž>½tmí¦/ˆtänL8Um +“]Erü<@ÊžÔßçÍêý>¯«ÍËÔ©Zê`žÐN4á“"NÜC÷S ¯¿2²³2L‘+ÑDïÐÚ÷•l¯ãÂþåCâÁYÀÚûu¬Ö#f‚Y+žÜŠ¹ñ¼»¯žÀOåäžRqä~øÆžêJMï)'åh²Å(MžUÞÒä‰öqšì©7¡)É„fˆqš±†B3–øÌ¡{+Š ´¢Ø’åë’·‚χ£=¹ä, ~Ñ4N¶Ø< +[ˆéPíµ,C–Ïx£+?gHl!Ûæ@üQÖxä³g/÷\:tÒ;r çy÷öüo¢À4ÊTà…A½²ŽÔ”Y©eëêuiqàÅB½a€“:µ`pá¥àƒ°oÂ-Å-r¡­ë,k÷½Tzèlœ»Î4çIˆƒ]Ænn§¦],/òã7<Ü +q0 9ÿÂêŽFÅà‹à¬j't¢»ïÚHzq(ãžòëÜ^K¤íI¥¡*¬a—Ö}×˪±™Êª+Þöå™Ïë:çËJ?†S=i}¾”÷ùÔ´ØkxSÎH +gˆ¯nGªïÜëÃ]51ŸVÍ›%”^ÒM‘1aúô,‹’0ÂÁ%ŠX¿ZñÝ)…"´¨"Ñ“çÉï_0[”ÌwÕæ’ñÕ±;«¤{-ÌM€P°~?Jj*Ê OóÚv1·½]q è\Ž÷f=1Ù¤;Y0®3ߤõì[!ZR¿Ö¡ÐypÖ{ òËí_×_¾.©bŸ–Oø†(3[Áƒñlé‹'«ÝsÔíÒ=ë1^Ô’½…®U¯imGì,æÈTìmŠËJœ—&)ïM%û<Åt¥¦)ÆI9ŠY§˜³Ê[Š9Ñ>N1=õ†b`crª–Ø5M$S –ÈÛPøxM¿H1«u¾z¦­5YQã‰0ã?2€Ã2X0a²;Je@>± 6õYÆOü¶—{ÈÇ¡ª3¬2Ì5éãúóÝݧ½åv'Äê±—XÒÅÐ$àdìo¥–¡i X¡›É{ÛsZÛkÛ¡Úñ[Û®ÞkzÄÊ×ù÷~é|üõêîÎÞ‘çeçeÔåíN¶ÏU“n…X¯ü7žUZ™i§²L{ÓÛÀbŸ¸r—D`Îhu2Cµƒ?NÑ°ý¢°«÷¿óérùëÿÉ£öäzø—X#sî#þç?øjÿœ-À¿¾I&^ ð £”–Ö(t“ñÐt÷§a§¶ÿR+¯^endstream endobj -1865 0 obj << +1894 0 obj << /Type /Page -/Contents 1866 0 R -/Resources 1864 0 R +/Contents 1895 0 R +/Resources 1893 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1867 0 obj << -/D [1865 0 R /XYZ 85.0394 794.5015 null] +1896 0 obj << +/D [1894 0 R /XYZ 85.0394 794.5015 null] >> endobj -1868 0 obj << -/D [1865 0 R /XYZ 85.0394 674.4719 null] +1897 0 obj << +/D [1894 0 R /XYZ 85.0394 679.319 null] >> endobj -1864 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F48 940 0 R /F53 1017 0 R >> +1893 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F48 950 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1871 0 obj << -/Length 2837 +1900 0 obj << +/Length 2838 /Filter /FlateDecode >> stream -xÚ¥Z[oܺ~÷¯ØGITÞ%èC‚¤9hOÝ-øA^Ѷ­´Yic8¿¾Ã«HÝö´Å>ˆ"GœáÌ7’‹w~xÇE* -R첂¥a¾Û®ÐîÆ~¹Â–æ#zR½»½úÓ_i¶+ÒB±»}æÊS”çxw[}IÞ¥8½†Pòþã/×oˆàˆ$oon>üöþã¿á# „’¿¿ýíóÛ¿™¾›ëÈ~ùðéúîö׫·^˜P`Œ¨’äûÕ—;´«@î_¯PJ‹œïžá¥¸(ÈîpÅ8M9£Ôõ4WŸ®þé' Fõ§K -`6òú Íq2<éIz9 ×8©ÛGóÞ=D8ùý½y~E®qžèEÔ]kè+Ùצ» -lhïëÁ4êvÂîûYž^®1Æ €"C,¹}ªûéG¶D3Ý¿(•iäˆg  œ–¨VVɇòÜ ¯“äù©Þ?ÄŠ"9ȲíÕ‡  (Ð+2Î@«úóúÑÒDJÌÒ‚ˆÂÒ´ÝéP6Í‹™·—m¥$Dúø!ͨZ`-{X€*ù=PЫ•)¢ò€ýëØbT¤˜d|·9MgŒräá8Øi‡Î<¿"DÚÊ "MùÔê0ùÃvµåA:N?äÉNó`ñ߬æýã­¶îØégå¨ÊÁŒÊRG†ˆ±Yš*u´åE Ñ 円ZÚ:~)Ió<£ðPmà×Qyüz/ŒÀ Á‚‰<ßæí©æÌcœ2(bîQþ(Àú ˆÉ…09£pp‚F%ùXZhÁ±žÌȃ¶Mwˆ>Ær]7˜n ½"„^á ÔžÏHh¤ñΗsÄc+:X)䞪 ÁT- -@ãâ]0ƒ±î½±½&Óè‰wç<ÐE0…lõ KžLQ– ¹ìÉ>ÊoÒ:`=È“wÓÜå»t¡Fà8^»ö|B­{ô]£¿%ÌêF¬¡e=Qz•A·QEÉÇÁ >×P44yy蚦{™<ÈÓ©lz;<Ú<ÓÀæ@d-­Ò8ƒÔÿÔ={A\¤ñŽi*OÈîÏÎwG§C+ôï1<—ý˜‰ì`†«£Èë•:”Vüž ‘f$Û~R­û½§ò~¿?T3¯GP«cz³§š³ŽáÙ…lÂ{ôz¥0aCMŽ§ºLІn‚au_=(„”yßw‡ƒl78™¬;dz¬€®~xñs{*Q,ÇÇÙ)R¥þviÇ3ìhTjÑ®ÃZÙ¤´ô¶_+kFH=•0÷ÒiåñØÔªÔGE¶ÐUý£2¸- á©êÐxo™ùˆ³:IŽ.$›jtŽÊƒœð4¬&›MÞc²™1_N6÷ãÍ? V“VÝRížLqþŒ%^½2ÒY¬]çÞZËÇãHÝF r÷c éç°j ¦¶«y†·-R­[ÂSyK8§X-[7ÙeëŒÿrÙ ðéI‡vpÀ/:ÿ‚óUéhuð†®ïLŸ ïÐøxcÆʪ²Aµ7ºšS#G/3Ñùp/On‚ÒÍz6MÌœ½ÌŽ0K³œ.n“(gkÛ$žr&üÎÆÃ|º³m»=’«ÔaZãáis< Pœ||0½f>ÝT1-#´ýÎï†Ô‹iC„éU.À†×b“r:‚9dkÔ®–×-ä,-hÆãôØk»EHﻳæ¶wÈMc\Á cÕr¦Ñ±ïa:ábz=Žî[-ûšvÛ5O½9½HCª OrTc"5±·_÷¤-ö'Mù¯xR(@XCGZ·5’£,ÑÔ­ìãå¿6Ùó ƒN!ëö€Ê@ˆ_°G@µaG5æØrö«9f“÷˜cfÌ—sLÄݦcšûäMçäª=øºG½hµB#¨{ýƒyªUÔýPïû?«Ó¦BT?íä〓)A¡q(+ùZmFñH××?¥g°¾§ñ0N|l^&^Ü[swí&:î%T/µÛæþ‘”ÔCãÒWDE–2F.äÆjAžÊ#èûiÊ·ÈSN/°µ4s®“ª˜Bõ [àˆíͨ‘/•Õ’ŽÉ^]wëúr[zâš=8¡µÒ»¸ú{½>™û8æ¾qºFi–b¨ò·-1mÂvPLyÏZdÝâ=Ö)óå¸rwæPŠ6‡«Lü>E™Cq'áEÕo½Ü/f'Cuh(µ®¡i_ažÒÒúÂÚÚÂm‡ó©5…?+´Ó­+ÿu¹¯a³_¶Ê(´¯‚@™W t!Ó†TëpðTc™ßup$A·™{ª9÷Ih·$°m‹Ø¿ÓéÜCm¶½ÛØDZu ¹œ[{‹ñÇÓn”çë Ö -”]H¹!Õ†aÕh{Ö;ßM0”Ò¬ÀÛü=Õ\€Ø6PfSX,ÁhælÃœmXdæOŠQ2Š¬_GóИ‡ó°%ó Ìš‡…æaÖ<Ìš‡E§ËÛæ`E1»°ë©6Ìã¨FóTU­VW6sûu×’m à©æÄöI)Íc ógáÌ#"ódÎ<" DÖï£}˜°öÆ>bÉ>…³í#¬}„µOæí£ƒ©(Ҍ擊hÃh¸ )b]@´n2G4Z¬iVç¶ØŽgsS¾ËGs!ãOÒÆW¶íYÚ¦’go¾"DËÇõ* uF.\¼…T*rTæê°>È¿Ü®Ti›l]•6ãº\¥ElAC?.ï«ey§ÏáÝ\í@£4—íi·t% -®’ñÌÜß.äPŸøÛPðƒ®­ú8‘äF&+¶ˆ' 7øû·­Ö\ëy9-é° 0(Žd0‰ÝdYpØK¹SQ—°2»{›±=C¯Êì˜õâ3´ \פUìSnçö-Áu ?C]C-.Ô?7.¤ÊjµŽÊ^xײŸÃvôì-ÎkOY¯øvÈÛB×Ýt©†?†±×mzÔéè:ûÔª†Æç÷7¦áî‡"2ncúæÀ!œ¦Æ|éá¹%¨Û~e5‘Ï üEpLÕ#X®ÎË\ 6ë9¿È×Ý‹Õöâ ¶f^ßÁ¥ß|]¼”ßÏe—g?¥9¸šn¸À¬RÃ\Ý@µí6áfªsëÏÀôevÀ ¯b:ËR’‰ Ûå€hã/H–Hú$€Þb;âyÊwÎ!c‹fê8ð¨Qh›3ìѬšyÚÍ”93ÁÓÐ1{L›¾%LCš±b[$+f…t+öæ”'$5Ç>ŸÕ¡OS[:uO@iÎ -Óš8³tüÌÕÿoœ'xL:´Uœnþëvßœ«éᢾŠsPÿ~µòÇ;à«þ-·€´sÎõÿ)oüË!Ë cædO$ã)|,œPJ‰¹ã ”PH»sÙÿn þ¥endstream +xÚ¥Z[oܺ~÷¯ØGITÞDQú éAÚS÷ÄA $~W´-D+mVÚίïð*R·=m±¢Èg8óÍ…äâ‚Þe<å)vyÁÒ ál·?\¡Ý#Œýr…-ÍGô&¤zw{õ§¿Ò|W¤'|wûÌ%R$ÞÝV_’w)N¯a”¼ÿøËõÂ3D’·77~{ÿñßðž! „’¿¿ýíóÛ¿™¾›ëÈ~ùðéúîö׫·^˜P`Œ¨’äûÕ—;´«@î_¯PJ ‘ížá¥¸(ÈîpÅ2šfŒR×Ó\}ºú§Ÿ0ÕŸ.)€e"Íã  +š”“e5á4Ljr†SR0êÕÄÄ’š•RÓ«/mww’ûó©—Ó%c"RFhðÅwO5gOhÀSš2”‘˜ÿ­Òw÷øØÈë7TàdxÒ ’ôr®qR·æ½{ˆpòû{óüŠ2tºÆ"Ñ‹¨»ÖÐW²¯MwØÐÞ׃iÔí„Ý÷³<½\cŒEŽXrûT÷Ólˆf>ºQ*Ó(ËA8-2X¢ZY%Ês3¼RL’ç§zÿ+Šä ˶W‚‚p  @/Ï3Z՟ז&Rbž„–¦íN‡²i^̼½l+%! :ÐÇiFÕkÙÃêTÉï²€^­L•ç¡;”C½7³ª¡ªîËûFVf¥³”#)Zêó“lû(}j©³Pj–Ïyf¥~Õö½,O Žùú£D·¾î´00Ü«éÕp*÷ra&*RšqbÉŒyµˆÝq€u÷æ¥4š2/ç^VéÌï­sq‘§¨@bÛCªuôTÞC•D.H8 ¾MöžjÎâ‚E +¸±ÿÒÖ£8ëiˆCË(É´]Àþõl1*RLòl·‚¦3F9 òpì´Cgž_"m呦€|êNõ˜üa»Úò @§òd§y°øo VE–"ˆN1Vv­27+’}×eÝêã°« Õº—~´éºoàºû|4ÏRÉ«ÁIŽMùbzý<ŸþñÖ [wìô³rTå`Fe©#CÄØ,ÍŒ?•:Z€ò¢…èrCC-m¿”¤Bäô~ª ü:*_ï…x!X0.Ä6oO5gCˆà”AsòGÖALÎ(¸É…ƒ4*ÙÈÇÒBŽåðdF´mºCô7–ëºÁt[è!ô += ö|FBƒ Gp>‘¡,¶¢ƒ•Bîù¨ +LÕ¢4n!ÞÅŒuïý‹í5™FL¼;‹@Á²Õ3,y2Ey +$ä²'û t(¿Ië€õ OÞM…Ë7vé$ƒ!ÃñÚµçjÝ£ïý-aV0bõ-ë‰jÔ« ºÊ(J>f𹆢¡iÌËC×4ÝsÈäAžNeÓÛáÑæ@à™6"ki•Æ¤þ§îÙ â"wLSyBvv¾;²<Z¡‘à¹ìÇLd»0„XE^¯Ô¡Ô°â÷çiNßöûjÝï=•÷ûý¡šy=‚ZÓ œ=Õœu 7È.¬`Þ£×+…q‹Âir<Õí`‚6t« 3¨ûêA!¤lÌû¾;d;¸ÁÉdÝy8žÝ`tõËŸÛS)xèˆb9.8ÈN‘*õ·K»,ÇŽF¥í:  •OJKoûµ²f„ÔSés/]‘VM­JpTd ]Õ?*#³%!<µBï-3qÖ@G  èB² ©6@ç¨<èÀ OÃj²Ùä=&›óådq¿1Þü°`5iÕ-ÕîÉôçÏYâÕ+#ÅÚuî­µð¤)ÿO +kèH+ã¶&Pr”%šº•}¢ü×&{þ¯aÐ)dÝPðeìPmØÃQ9¶œýjŽÙä=æ˜óåq·é˜ +ŸÜ¡éœ\µ_÷¨­Vhu¢0OµŠºê}ÿgušÃT‚ê§|p2%(4e%_«Í(éúú§ô Ö÷4ƉÍËÄ‹{kî®ÝDǽ„ê¥vÛÜ?’2ƒzh\ú*‚(ÏSÆÈ…ÜR­#ÈSy}?Mù"Í趖fÎuRS¨ža ±½5ò¥²ZÒ1Ù«ën]_nëQO\³'´VzW¯×'sÇÜ7N×(ÍS Uþ¶%F¢ CX¢Ñ*ƒ)ïY‹¬[¼ÇÀ:e¾WCîΪBÑæp•‰ß§(sp2î$¼¨ú­—ûñÅìd¨. ¥Ö54íá+ÌSZZ_8B[[‚»íïp>µ¦ðg…vºõbå¿.Wá5löã‹ÃV…öU0(ó +„.dÚjžÊãa,Ó⻎Äé6sO5ç> íà–¶mû÷a:{¨Í¶wÛ€H«.!—Ó`ko1þxÚò|½aÎRŽò )7¤Ú0Œ£ cÏzç» †Ršx›¿§š ÛÊlÊ‹%mÃœm˜³ ‹lÃüI1JF‘õëhZó0c¶d”[ó°Ð<Ìš‡Yó°ètyÛ<¬(fvÝ!Õ†yÕhžªªÕêÊfn®îZòm<Õ\‚Ø> )¥"– 0wæáÎ<<2OîÌÓ@dý>Ú‡qknì×ìS8ûðÐ>ÜÚ‡[ûäÞ>:˜ò"Í©˜TDFÃI¿ë¢u“9¢ÑbM³z8·Åv<››ò]>š ’6Ƹ²mßÈÒ6•<óxó!Z>®Wi˜«0ráâ-¤ÚP‘£2W‡õAþåv¥JÛd몴×å*-b Òøqy_5@(Ë;}Öïæj¥y¸l¯H»¥+Qp•<ËÝÁýí¡€úÄ߆‚tmÕÇAˆ„ 72Y°EI@Ç ·ØŽxžò]†sÈØ¢™úæN(¥ ŒÄÜqPJ(¤Ý¹ìÿnøþ§endstream endobj -1870 0 obj << +1899 0 obj << /Type /Page -/Contents 1871 0 R -/Resources 1869 0 R +/Contents 1900 0 R +/Resources 1898 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1872 0 obj << -/D [1870 0 R /XYZ 56.6929 794.5015 null] +1901 0 obj << +/D [1899 0 R /XYZ 56.6929 794.5015 null] >> endobj -1869 0 obj << -/Font << /F37 791 0 R /F48 940 0 R /F23 726 0 R /F21 702 0 R /F53 1017 0 R >> +1898 0 obj << +/Font << /F37 799 0 R /F48 950 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1875 0 obj << -/Length 3266 -/Filter /FlateDecode ->> -stream -xÚ­ZÝsÛ6÷_¡™¾ÐÓŠÁ'?òàÔnÎmš¤µÓ»›¶”HÙœR¤*’NÝ¿þv±DŠ”Üi/™„¸À.¿]ì.Å þòE¢C&SµˆSjÆõb½½`‹x÷ö‚[š¥#Z©ÞÜ_¼úFÆ‹4L#-î7ƒµ’% _Üç?W?Þ¼¿¾ýÏåRh¼ /—š±àû«÷Ÿ®ÞÑØÇËTWooî i&€ˆ#YÄ‚ëÛ·—¿Þ{qsï… -Ì™DI~¿øùW¶ÈAîo/X(ÓD/>C‡…ýqà z#ƦÝôu^äsn ß‘a8ÛÏ›Ï֦᣹»} z gc¹p:`aï|AfWø“nœ†zÖ!Akõ­µÇŒxêÔú½/öÏv!;qeiÉ­ž²5ŽWb¤_°µÕ[sTÆÖŠ¼n_114…C}ž±§šr> -_пÉdÌú QnŒ6gl‰×U€µeSÛ÷ =½sãè+w^engú£Kh/&´¶ €ÑwÖHÏÊBÁ œÿiÿ¿ó?¾tjºàà˺Á#›q àõ¤%ݺ‚û¨=ºéHÛÂD‰6Z h7zˆ:Ž@šHžâê4=•Ù×Ïuóë‚°²*ëb‚Ç( cð­çù{ª©c<Æ °(Kðq_bÜ£Dbõ´nÌ3oi°*+¨eô‰»W؈ç'`ø€ÏŒ ÚUÓÚ™f§K³UÓ‡èd›YîJaë±ßfõ’PÌ;rßÄ7˳U… 1Áðã7¼âHÓ¥€ã>ÄÅ:Vbû;»u*²õ# Ž÷DchŽH•Q/6b,Ü ¢J¦~ÙM¶†ÓĘH¶°¶=ÜcG½°Zdtù ã.14P„â˺(èaÆx*© \+»þ´sÕ`Ð $7/`z@uÓŽÊcz“•Õ4;„ÐQÆÑyÖžjÊû(Ž‘ï¤cÞט$)HEšŽ:©,zÍ«âû®-öO&oT6m€çsÓ½ÅAa¢L|“ÑãîæÇK­ƒŸ¾¹ŒUpuû.¤á{·ü!©‚EL&¥lî6#–Kž€ÔˆE! ì+–Ç=‰jîÜÇÁj"ßyW‡î¬ƒªFK³®ºíúÕ£b·øª€,¹ôÃîNBGANÅ‹ÏCgHu:žÊCgU@.²×ÐMkÌä xª©GÖb{=᪃Äu‡ÁpDžBDàFÊvWeÏvÐ(HtètˆÆhFm¸ÜRÏVÄw2Re:¿"7ø± _xü`§l­„]&zŒ w•P™0ÏK ÏÀÞÉu ùi{úHeŠˆ½j ©Î©£òG -Ww[¬'Ç©d""9ÏÜSM¹š8V|ÌþÇ‚ψCÖ þÝÍ×Ôž\^œÒjólM1ÀŒ<»+aÇ@àxÁßÙ¥ú ÓìúüÏ©7#O£Ãìïçd¡3WÜZrT»™dñYž—„.Þ¶1áhêé2Ä(ä?™ÂE“0qCªÓ@ðTmù°~ÌÚ™HG„1¬q–»#šr²ÉX¤rÌþkÃv) ¾p‡&æ¯uÖõÞ4O°.‚v —7âÇVZzW¯i˜V`!n»++ch>ŒÁÖòz¦ ¬ªTªÑN_* ‹0M’d¾ ¼ô+¾ §´b¬–»Û·_ÿëêîæ4@éÂï<Tgðਠº}E§åoÅóë/àÏIÔ‰Èo'£GÆçÊÎì[GcP1S•*Ô©/¦}94#ù±”Ÿ&‡òÔRÀ²7&lE€éïnþëJžp,I*ç‚æC`k. ØÆ8s®£ì\À•0Ò } 1Z”&fá[ô2© nø·Ö+5Ÿ dS¬IË—Y—ù¹’gTMó1ØÌ–u i¹ÏMÅo±þÍq"Ô,v³ÀSΖª(Næ—WMbÜ'¯Æi§®´ò¯ÉßØG‚ÇpIÌWí¯vWõl†üp©¿íÞÊL|ðÀ[iæ¼´f½•ˆÑ•ªt!ÊøO½•_q9\rj®\KÌe|àü—¼•èó„½ðÅkHuÚ[y*{uÍΔÒ&qL‘Sç¹{ª)û£ë‹‡±æñ˜ÿ¿˜Kajû™Íyz¸ÊàÅñUÆÝUFí]±Ç€:M‡ -mq›R™g)„NÓc8Ák®›AÒÅt<ÆìßÃÇJœ´Ð x•þsŒ¹—Ã%g0†f­„>pþk1H”¾8©Î`ÌQyŒáG½“‰óYÖ‡ÄyÂ{6qñ¾­×UŸ» ²>.™¯ž6À> +stream +xÚ­]sÛ6òÝ¿B3}¡§‚O~<äÁ©ÝœÛ4Ik§w7m(‰²9¥HU¤œº¿þv±DŠ”Üi/™„¸Ø],ö›3Å,5Œ«LÏ’L3Ã…™-7|öïÞ^3÷@ó>Ô›û‹Wߨd–±,–ñì~ÝÕ2ž¦bv¿ú9ºúøñæýõí.çÒðè »œΣï¯ÞºzGk/3]½½¹ƒil¸ `1®oß^þzÿíÅÍ}`¦Ï°à +9ùýâç_ùl|{Á™ÊR3û ÎD–ÉÙæBÅŒVʯTw?„½·vë”´I™‘:žÍ8Q™˜gÜÀ±ç‰æ,‰¥bÒ锘<ŠéËzÕtíëëãã +%Ys1ëãQPcÒRõH •°T‹#ÚwEw9W*‰ºÇ‚õ~³(v8Ž£fMkÈŸË݆ÇüÉíèzæÛmq)¢|GӲƽúÆô¹NÜ•J\ƒ·àb•7`<&âç$&oZ«’Dµt’"†ÇÈd"VñßU.6òäÎ]Ɖf<ÙyŸÚ‡:íS”õ©‹ýº-ÿ,^¿yU­AäpÅgi¨1ñ¡WÕK²Ø ©[¯*½5ãàÓõG€¶ùƒ[&Qük«ëhèÀ1Žâ(_=»®lI¬“@Ûë÷wÜ¡ŸòŒ2N0{ey3q;ÑTâÏ]Ñ2ty‚¼™e3ÿ£Üì74A‹!ó†éÄdC;Ù”µƒM2{„–†=ðÙ=–nep^˜,&±1ʸuk¢0àô °vKzZ=_ +!"d9K¢Ÿ0…@wë©î;ôäÒ)v9ÈOXZ0¶ãf_¯ŠÕ”ØoÉ0¼í¯šÏΦ!àÑÞí®ÝãKð!_¸taç}Aî0üI§¡™sH0ZæûÖÙcN¼uý¾/vÏ‘Û¸p°äVOÙšÀ›l­uÆÖ<”µµbU·¯¿šŒ¨¡9O8@)¥/èßT:$}*Q®­4RoliUµeS»÷ =ƒSq¬êk_åÊí W—ö´&|ˆLã€ÑwÎHÏòBÉ(8ÿ¡¦ýÿîÿ86˜Œ“ùäà˺Á+›p àõ”!ܲ‚xÔE:’Ŧ°Y¢Ë–† ºƒžTD“ÄÀM¬Î+bê´"({®Ÿëæ× $aeUÖÅHã”%à[ÏÓPc†ú˜@5ÀãlÈÁÇ]‰y–©“Ó²±ÏUK‹Uù[A#+OÜ}¸ÂA2½Ó|æôÑ.šÖí´'Û£Ú9d'›ÜQ§T +GûM^ÏIëbà9æGî›èæ«|Q!". Þ`þ†A!‰ \).Nбj¨ØPq¾uG‡¥"_>ÒâðL´†æˆP9M1°aáY Õ* h×ùn`Ùnw¹ÇŽz Êê Sðéç]²o - –õYÐÄ-ˆ„i¥= „•íþ´s5`Ð)7/ètêŒN{¨ Ó뼬ÆÕ!¤Ž*‰Ï“PcÚGyŒ‚|'Ò¾Æ"IC)Òt4èÐñ(í´×¾*þpïÚb÷dëFíÊx>7{‚wzPØ,ßäô¸»ùñÒ˜è§o.]ݾc´|ïÑŠ*@b+)íj· ¶|ñ –-JYà\‰:Nì‰UsKTV›ùN»:tgÅP©j´4çªÛn¿èƒcVì‘/ +¨’KÐ~8ÝIÕÑPSqÍ“óªÓ‡:­:*¨Î¢€Zd ®¡)d¬ W/0 ÆY‹-ìÍ…« +×-&Ã1y +ƒ)Ûm•?»E+l@!Ñ¡Ó!+iXuérK3Y±èÅd„Ê+t~ÅÊêóXø"èNÊÖyAHÙUj†:áC©U*›æ.a¸˜\·PŸ¶§¯TÅLÆü…T«uæJ=T¸RÝm±]§áP‰Èô<ñ5¦>¼NHk’D‹!ù H>Z¼#U3ü»›¯i< +^‚Êjûlm3À®<û—+áĪÀ1Âß¹¥Ûú 7üúü/hŽ‘Qdña÷‡÷S¼Ðkn-=êÝŒªø|µ*;H]‚mcÁÑÔãˆÒKÄ(å?¡*ƒ@“ry^úP§!@EhˇåcÞNd:’%€ã,u4¦>T¨&™©!ù¯-Ù¹„üÂ_š”X¿>Ôy·¦)±y‚}´KÞ¨?®ãÐÒk ½v`SX‰¸Í¶¬¬¡…4Gó뉆°N%Ó™Òƒ“¾Ô–,KÓtº!<_‹†[X9ËÝíÛ¯ÿuuwsZ@è1ªßy}èAÑeõ¡Ûí±é4ÿ­x~ýüéDtªÎ³ Æ< µ",VYp©*hŒn4Â?XÓî2öÔ/Ã9ðï6£GÆçÂíÜ·ÆjÅD Tif²ÐLû²oGüc+?Kí©¹´76mE ÓßÝü×·<áZÒLM%͇ÄÖ 8Æ°ó®£ì|À·0Óe!‰…-ÎR‹øÖ6MŒ‹CIµA¨«¯&2ÙD0¡âø¥L6NC¿ÇU™@£jšßˆÈz²¥h&uh)Ú®_OÍü›"&%“™O›ÁYNv«%Sæô"Ò ¬R +~pÛ‰‹Èý’<Ž+rTª@$=qauî¾ïÙô]øá2²ïzþÊn|^qÏ_îýŒ&ý•LЙêl¦¸`BÙ?öWã¼rl°œK"Tr ü—ü•å)á›Wê´¿ +P!~uÍÖ6ÓF™L ¹×穨1ù£&XbD2¤ÿoÔ˹´ÝýÜU";3xqÌ„f4Þ;L i’Óv8Ðܵ…m!•«¼³­p0Ù±:Ág¯PAÙÅÍ‘Îþ=Øë›–&eUãë˜Ç8Ð1°j£¥9Pþk:&à({¡tîCÑ1t ?ë,Ï’>”Î#Ú“¥ó€öm½¬ö+ŸVÖÇ-2ûÝÓ¥˜‡Zôöº_HÚTÛ©E:|«ÐãÈ'óP ‚­A·R0ˆÕàÑŸS§êûOï°*½¿ýøî†ÐüðéæÇÛ›» ï ^QÆL‰ôðÅSB‘ýæö=2¬³(£…r³­ì—¿ÜeÍÚ~-­‰¥x±ÿ"2µÚýv ElK”Zêû’$€Šm…m+Ç +¤´&† Ô´HÑ°»EtQ÷ GX_”Ži¬\4ÁB(KÅQø§ó)®¨ÁµçÏrdק¿÷¡÷5܇ÔùÔ§3¡Y–d^6‹¼Ã¬I`p)"<%N›-r~IM„Ë_¸ýn Ý£mâR ®/sÇý¢8p_•ö‹4¬’‡Áu›¸XŒŸki0@4H@"fþ@@À«ÊÚ¯\ÚcYm½5¬Fl0á¥(å¿åÀh IbV1µÇßÀà ÷IÑ™ø +‰ +O½ ©¡ð°w_® ™¡ûÆ܆åÜñS‚%>•«½-• DZ¯<Ë…ã˜tÎ5kq¥}3ùƒÆ«¢]îÊ…ûü4bºÐGÅj¾hž +üm „ wÓ’ÓïlEŽ3{ï¿Ÿ=÷¤«YqÐvÀFî³V„ wƒ¯íÝààp‡‡Hï·,Ɔ¶/ÜsÉÂmÞoÝ>«fÒ_o^MumûŸ3ž·Å‘Ž,«¼=Ö{ºi +ßלãl›}µfl¹Wõþ”Ö#oz¬W¤wU³ ‹OÈ$¤û¹ >ƒ&Äž/«­Yè_á&Ï™û +>œ¹_¨ØE›­;¬`ÁÕ’Ôß· íðh¼1Û¢Û6Ãl­ŽëÓ· °?Ûí¶¦Q¶¿ïz¸«‚^‘RÀôK;ƒÕý¶rëä…¤UT¡é:ÝoÛMOJø¢§{0#•äò$‹pÜù©_Š)¨ÒÕä‡Bä?þÙá7r2üò>™'€÷d +?æ˜B± ž³n06¦2™àýÌMÀxendstream endobj -1874 0 obj << +1903 0 obj << /Type /Page -/Contents 1875 0 R -/Resources 1873 0 R +/Contents 1904 0 R +/Resources 1902 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1907 0 R >> endobj -1876 0 obj << -/D [1874 0 R /XYZ 85.0394 794.5015 null] +1905 0 obj << +/D [1903 0 R /XYZ 85.0394 794.5015 null] >> endobj -1877 0 obj << -/D [1874 0 R /XYZ 85.0394 179.5067 null] +1906 0 obj << +/D [1903 0 R /XYZ 85.0394 179.5067 null] >> endobj -1873 0 obj << -/Font << /F37 791 0 R /F48 940 0 R /F23 726 0 R /F53 1017 0 R /F41 925 0 R /F21 702 0 R >> +1902 0 obj << +/Font << /F37 799 0 R /F48 950 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1880 0 obj << +1910 0 obj << /Length 1912 /Filter /FlateDecode >> @@ -8215,83 +8351,87 @@ xÚ¥X[sÛº~ׯ  aWš½ Ná¸Æ~<ö¹$ø¥?'q•è`á?í4Nû*mUx‡S`ÎH†o;¯ïæ³÷Ÿn†ÈÇ'TÊ–¤TùšcØʵ2üj@xM sŸ Sîû¼½<‹¹ÅÓanö†YÈó§ÌI—(u€B`b*©#¶mwB^Ëë£BÛòøÀ}5ãùK ÙF¬šDÞ¶¬ÏP- HeˆTËã8¶¹½û„ï»Óº½G¯WªI¯*Uëâ•À _¶iÇ0ˆìŠ¿üû·ÏÜü犀U:d=Üx~sƒÞÏ>Í?_ä÷•®ôÌpè;ü£áŠÌ£ž0+ëZ¥Óïjÿ¢ÊÞ¤Ý@Ä}è¨Ád‡Ý—Ûð”õ‡J‚ˆ„~·n\*Á³·kìý×ó‹nAεgßeý£×gH÷új´ÆÎÚ¾‘νÍ:ûÀtØÇ^ÙÝ ä¼› ®m0ÁOx8ûvŽáásϩɸ‹ -nþó{×mEÑÖý¦¿mò"oöçÓ1›ïK½©á|ÑŽ`$Œà1FPQ@å1ðy€‘Ü7—Óð·0šÁ©ìi8å˜îË[ôæ¢yb>N“YQVõb÷úÔŠÒ¡BS˜'l/Ó´HêzðUB,-ÚEÂû…Â'Qà· Xfº9«/Œ~¹¬p»~VƒÏÅ€p.Ù±Ææ¢Æf¿üú!H̨<Ö÷÷‹úvIÞœÕ':}ø ‹‡à­ Â0>N×»´,’—¡]$‘at‚‚ìzëaíbeX <ûnÞ™]™J»£ñS{ûd(M‘ñáÏe<ô ü9h2N2˜Þ~};µý¿p"5endstream +nþó{×mEÑÖý¦¿mò"oöçÓ1›ïK½©á|ÑŽ`$Œà1FPQ@å1ðy€‘Ü7—Óð·0šÁ©ìi8å˜îË[ôæ¢yb>N“YQVõb÷úÔŠÒ¡BS˜'l/Ó´HêzðUB,-ÚEÂû…Â'Qà· Xfº9«/Œ~¹¬p»~VƒÏÅ€p.Ù±Ææ¢Æf¿üú!H̨<Ö÷÷‹úvIÞœÕ':}ø ‹‡à­ Â0>N×»´,’—¡]$‘at‚‚ìzëaíbeX <ûnÞ™]™J»£ñS{ûd(M‘ñáÏe<ô ü9h2N2FOLo¿¾Úþ_nê".endstream endobj -1879 0 obj << +1909 0 obj << /Type /Page -/Contents 1880 0 R -/Resources 1878 0 R +/Contents 1910 0 R +/Resources 1908 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1907 0 R >> endobj -1881 0 obj << -/D [1879 0 R /XYZ 56.6929 794.5015 null] +1911 0 obj << +/D [1909 0 R /XYZ 56.6929 794.5015 null] >> endobj -1882 0 obj << -/D [1879 0 R /XYZ 56.6929 581.7741 null] +1912 0 obj << +/D [1909 0 R /XYZ 56.6929 581.7741 null] >> endobj -1883 0 obj << -/D [1879 0 R /XYZ 56.6929 460.6765 null] +1913 0 obj << +/D [1909 0 R /XYZ 56.6929 460.6765 null] >> endobj -1884 0 obj << -/D [1879 0 R /XYZ 56.6929 366.7195 null] +1914 0 obj << +/D [1909 0 R /XYZ 56.6929 366.7195 null] >> endobj -1885 0 obj << -/D [1879 0 R /XYZ 56.6929 293.4426 null] +1915 0 obj << +/D [1909 0 R /XYZ 56.6929 293.4426 null] >> endobj -646 0 obj << -/D [1879 0 R /XYZ 56.6929 247.3727 null] +654 0 obj << +/D [1909 0 R /XYZ 56.6929 247.3727 null] >> endobj -1886 0 obj << -/D [1879 0 R /XYZ 56.6929 211.2315 null] +1916 0 obj << +/D [1909 0 R /XYZ 56.6929 211.2315 null] >> endobj -1887 0 obj << -/D [1879 0 R /XYZ 56.6929 172.539 null] +1917 0 obj << +/D [1909 0 R /XYZ 56.6929 172.539 null] >> endobj -1888 0 obj << -/D [1879 0 R /XYZ 56.6929 96.3402 null] +1918 0 obj << +/D [1909 0 R /XYZ 56.6929 96.3402 null] >> endobj -1878 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R /F39 885 0 R >> +1908 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1891 0 obj << -/Length 4197 -/Filter /FlateDecode ->> -stream -xÚÍ[[s㸱~÷¯ðÛ‘«F\\xOU¼3³'Yïdìœl*›Z¢,ÖJ¤F¤ìx}ú¢¨ÕlååÌ<j‚@£Ñýõ°¾Vð__»$R6¯³<Ž¥“ëÅöJ]?ûﯴô™ûNóa¯o¯¾ùÎf×y”§&½~\ Ær‘rN_?.ÿ9»ýôéãý‡»Ÿnæ&Q³o£›y¢Ôì‡Ûû¿Ýþ…iŸnr3»ýþãþL v2Ø-U³?þøðxó¯Ç?]}| Ü 9ÖÊ"+_®þù/u½Æÿt¥"›»äú~¨Hç¹¹Þ^ʼn’ØZOÙ\=\ý5 8xKŸNI ±.JœÉ&D`ôµÖQž$æHI¥ÖX’Á‡ï?ß}z¼ûñWCßôbS×s“EF©Œ:¯›¶“^vÐËèÈÆ:cŸª½™ÃJf?Új»Û”Øv³CWmªî_¬š=7våÚÛª~æßiš_»ämr;»ëx?~ ß›ŒvhË%·º†Ÿ‹¦~)÷òQ]lËöøýÝ'ás¹Üßh7+ÛºÀâ`ɼžy,«¨a|“ºÙKµ(¥UîÛ¸³©ý}]ÖL­~4êóa[Ö]Ë$\1=w]ÕÔí° ™Íž«—²~7± }‘Š“X„|n# ìpâwb·¯ÂÔ?Úuƒ"¡æa»-öo*›F™GÆ<Sv‹oöeÛl^"@äÕÿ°Æ4ÖV>ˆØ,¬5‘udŽ^>®Ë‰)¡‡N3/¥y11‡Ž£8Àø³J¸xè!Hɪd¥å—CõRlH9HFGב¯ò‚›`(«Â’æ/92 ³hÁ‰NÕ™H[m.˜²Ž\’ù <÷ÛâÚ'ª´ám'}nïÿq£Ðü¦À˜iœ»cÜf×gµ=#8…„ðD„ñ~J æ™ŽGÂÀ!Éá‰þ}Ê/‚¤•±æ"ªÅ.Ö#T³³@|»ë„ùŸf¶¬ÚݦxëWD‡o¹Áæ½hè¹îØììצ.'`Ì€à@Ž Îyº Ö’ùµ¬h†f+¬zžEÆ`õ -Æ„µ#£·OkâYqèÀÝW]ÑATÁ$>IoÕHfþ¡!À -\ Fºàc×ò5Î_3¬õãÅÇã1z¢»øY)S{†È‹Ð,òFzØo,T\ :†3qé!Ú ]5o.+XÍx ~°¯Á‘<øŽùbZOMœÕÔjBÕý D¸ €¬e¸À7lpH)˜@á-6Ðònôì‘Dá¹Øm;¥BZEn7O>èv¬Cyä\ÀBÜÀÄÀr+áŠ"œæ©ä'ÇÍC†ƒÃÚ˶j–ÂàÞƒIä´ƒï×EÓÖ¥lsGMq‡Í‹rH ŽA4ÄE~ãB˜1ÌcóÝ=?Èïê®ÜÃ̈æ£Íf|ú?‚°rÿÔ´4<ćnwè¸ÍCBä]Öå¾ß–¡ªN„P^$IP‘óÀ›Іƒ$;‡Ž6JÁ_x­[N»ŠD§^ëöSš SÚ$½ào`}âoz  *D¼×²Àók#" ) üX`6ð“â% ¾JóQþC¢›‰³Ùº@42±%$ÙmÇ`÷R-i€ÂÖŒŠÅ/¯E€[|ÉÉ@퉳IvPs« §;®|©šCË£ 6U`m°†wL™Þ›Äà­R{a?b"œ J˜·}­ºÅš—Ë©Åm¦.‚Pæ$È: —ô†UM1 -ûgÕ8ZÇÊR»+F9¡¾D -¾:Ê…‘ -þŸëP˜Ý#å¸Å£K'%.&Ò.cãîSÝÝ?ò_ ¡š–|ÞÇ_¿G‰³Ù±vU’v|þî½v`L¿åŠ½ÿõÙÄÁ -rrû™«¥¿CòFE*f9¿Ÿ¹l–œÄ\±ÅD £šØÇ“@ªÛ'J©HЖMß‚[ ± "ún>É >­EðI‡<ã|oCŽ©q¼N¦jø÷“L ép þŽ·|ÉïŠ'È”EÞ¹öRŸ -*o@ïÇ.Äï È|ðw>£m’ÄÌÐâØáÐ2vPŸ’5 -›-¤ %—Eh¸Éh)8ùììž Áø’p‹Z«ò•áÞ‰¶`«rp@ 2e4q|leø’ÉI³R÷³0îÒtoÆ1RÁ³-y‰‘fïçã)|¶7J†ØÖ§K2ã‚ŽŸã¸¨ê¦Ø®pegK;`þËÒ&ñ9Å°ƒ&|ƒéÉž²›Ùß>`…-ö¾¡ÛWe˱3Cù<6hÑ’ÂÀOÎx ÁfÎk]ÔÏloFtÉÓÑ‹É!â×}%çó„JN¢—S±Y¤MˆÀª&K˜& éCU/«(¾,vݼŠs ÝÆÙÿ¶¨ßø´¤«¶“Ñ„·Î9{±^bœMê%8(Ë~WzT)˜ìKH8­ Ân)†[7Bz.¥!Ï«Ç=°ËØ:ñ7øÝÓ<žã ªN&DàÑNËPw«©BrÒÏô1Îo‚Ã=Ö‘Ñ*êò¹èměү¼”æÝÈôóƒÒÚ1ó@Ꭽw°ÚÛŒðsd3÷M=Ë=@vó"þëËáÓ]1ë-À;Z²”®/•Í™Ø=O£,s^µçû3Úº'ÎÍ|¡”'¨„Þ…ƒqnž„Þyøü ?CÔÍ”Á"}Ne iÑqzâÛ*øS£´Œa”š=¡F¡žòû¤tP_hòÀDâA~æ.\m’/JWè\)öI LŠò0Ù¶,+…0'L)–¤P’W!0.«öߧËàŒ.M@8™;vR÷T[$6ú(ü øž¾b³y™Ìw`™&¶ñ×ä;=ðÏc§ÏÅ€Y¤t@¤s:¦úêiP à•SÜ) K3ºøòyi Ì FŽƒn«mµ™RBã©„˜±"W£ø¸”ä'òä*¨ÊSX(ƒ)OF*J5Ð,Gý`ãÈð(ûÔŒ;ÊV ?(Ž°NÍÊïÐSûo‰ixöªQúdÛã^Ýšj'£KhìÕU$Ú±… ¼î™ë¾ØŒ²‚†ÌYûS¤Éäà[”‰rOw3Î#•¦—7ÓjÙÊ¡pT`s¸G;ì…¯E¤£ö\†˜)P•ÇsJêâ %åÊMF¹<)q -îï½ðTÛËß:æ™Õ)I!Mããm «çµøcq,„‰Fêp¢—Ål…¹Ÿ*ç ŠPŠCaaÝ«àÏ}©;È9‡(O8mÇ÷¬_UP"<‚ïÞÉÁ¨EÎøô5•“b_‚‘*ïíOß}îÏëü©íegR{mT¤mª/ßÎHÃôd-V$QÖ&óÙ4ä&A֟Αd²kö”ÉdæÜé@,”Ãæéÿã5¦>¶1xY*PìPõ+ÿ=[Ä.:vÓbp&=9u’>:'‡#Æ1~"…ÍÛìy ¬"ímWNÅþ:K#•…*(°N^uÉœö(÷Pœä‹SÉ7æÆ×ÇžëêWæð„‰ÿE4ÏfïïoøøŽÉXd$Lâ¢Q,üðã-u4³‡»ï¥õç|þK?õ PÞ@î‡x¢óÉNÚáX1þ(ÙIM(}½lò<Trwêuû˜a[4 íSËSÂ_±“c†Ý¾‚”J„‘Û(NM>­}¸õ´¥ó²òo…4ÈQA:±¸×r“ÓxxÇÍgXG•&× ñÃOÜgTìÄny>{:È°Tqù¹ã -GV÷æþþŒžŸO8ä+0€¹uF{d—[y¤“Þç’6•SÄÔgÖ_ñ˜Ûdb}6‘²ö«V“æ¢ð #¹Xn3}âÍGœ| ãZHc\¥NG÷t€KÏ6_Í^À²é«tžñ)ìñÝÀᵬ©[w`ÐÜ"éÁs"ž¬ -Ķ+öq*º9PÂ_Ÿ@_ÏS™þXØ 0,Q¡:?0y! ÆYÖËpæ¿'_lüùþfÓ¼Ž¿ë+]I 7+ÿá0ÇX¢Œž¥Ê=—tåðmlœ¤™;{Ì5 -SqEZ ?_ ‚+W)°QðCj&Lð“b¹ÚL„¦î•6|Vg1fÊáy-ÓLgN‰‰²4ä8ó¿Ÿ9aqý ËäÁ"ޟʳpPózn˜ôCèÐT`Úÿ&Y”¤yòõ¬`‚åž;êK5øÇ`ð_{Ž5‘w¯L®üz2ªødy ÄÞÓˆcB®Ú‚íÕdwI’O— ÑX8ûªQÇìl#ØDEµš[.~zÛR¿.ªQ¿0ÖÙ0L[Êk¾ßAcø7Ⱦp/—¸¬=[M"[÷[J2c%x¹þÈ]ô.'•( ;ËE:M/c¥1#°ÄÁËZÍŠëØ dÞ2]êƒÛ’«)B >ÿîMU®Ä:£‡NbôЃÁñÐÔ(øxƒX‰|ã¹Ì$šKic7sA¨6NŸKÿf5Q?ƒk¹?!÷(ÊÿiýmÀWÛÃVnÈÒð*•‡aÔ­g?=@rÝõ7/Îü „Å3;õ *üQÂý÷ýŸÄHÑ™þOŽŒ[A˜dsí™B k•YIqÊû'Á endstream +1921 0 obj << +/Length 4192 +/Filter /FlateDecode +>> +stream +xÚÍ;]sã6’ïþ~;¹jÄàƒ$À«ºgf’õîÆ™{osµÙZ‚,V$R#Rö:¿þºÑ ¢¨Ñ¤öåì4› Ðhô7 y-à_^Û,ºH¯M‘&™Ùõb{%®ŸáÝW’ûÌC§ù°×÷Wßý Íu‘¹Ê¯Wƒ±l"¬•×ËÌn?}úxÿáî—›¹ÊÄìûäfž 1ûéöþo·%ܧ›BÍnüø€¹ÂN +»åbö§Ÿoþùøç«‘š!ÅRh$åËÕ?þ)®—@øŸ¯D¢ ›]¿ÂƒHdQ¨ëíUšé$Kµ˜ÍÕÃÕÇoý§SÈ´M2«Ì ”¼–2)²Lñ +’\+íyðáãÃûÏwŸï~¾ÇÕøoz¶‰ë¹2‰ÂøÎë¦í¸—ôR2Ñ©…Îاjoæ°’YIM[mw‡°ºjSuoôbÕì ع=ÀÛª~¦ç÷lšæ·Ã®~«BÏî:$Œ_Ã7åfãZ·$¨k¨]4õ‹ÛóGu¹uíñû»OLçr¹¿‘væÚºÀâ`É´žyä,«¬a|•ÛÙKµp ¹}[u:׳¿¯]Mغ¡¶ô£>¶®îZBáŠ}»ëª¦n‡ýüfö\½¸úÝÄF€ô%"ÍRfò¹P°ÃY؉ݾŠS—Ô´ëYâÁÃv[îßhÞfEÈ*ô_4ð–Lü0¨4RŽölªÚ‘–Œ—Š(Ï.x­ Q›écá’E’.Ü£©5ÁÂE6.%Ŭ[;–Ͷ¬óRÒüºìŠ4Ôç‰{ l¡Ä |Øy3^ı(kÊM;ú® Óv[ΗnQîîÓKJ"E¯üÆ÷_/šMSÏ™·´¼#Y[ºMµ­:¤OËÎʆ¿ŒÖ3\;¾y]W‹5u_”­› iT’ªâ¢eRn¿V› ùôFÓ,ݪƒYb¥ƒï×eÓÖŽ·ˆ¨ó »Ãæà…bã†c qÑcظfŒ ¶ùîžZ4äwuçö03ZóÑf“}úoÂÜþ©iýðºÝ¡#˜†„ÈÛÕn_²o3(ª!„YEä¼á-”Ö†ƒÌœ³Ž:ÉÁ_©[N»ŠLæAêöS’ Sê,¿ào`yâoz ($´×¼@ókÃ,‹) < 4Ð ü${ _äÅ(‚!Ñͤf¶.Ñ©Ô‚zÞnGÆî¥Zú i3v*¿½–ÑÜâ;HNv`Ôž(›$5×rº£áÜKÕZmSÚkxG˜éíÐY +Þ*×ö#•1‰¬„yÛת[¬i °œšÝfneN‚ü§ÃósIìË…$O§¤$%ðßT¸º|Ú„`í¥WÁ +Àû%%d™5ÇZóWoëĦÛféò’më6nAª¢¼ªøöL,Ît;¤óÍ4ÙJæDZßÑ`º<`HÛ©`(‡à·H/êd®là]L\pÜ’ï¹iû²nW> +VAC‡S»,Q•È/¸vR¤½Yök»)ÀòdäÓA@lžçÇ’Bþ Ô’iȧö$;hš½1 ö¼@) þéñ3a(ªÔãä' "ѲÞ~w dW=ònE-èßSå½:>̯§4É 0ªüBX®²˜ßøç,E>l#}²6ɱväžX¶=kÐ’M¸‚3~†ËzŪ¦…ýÓb­ce©Ý¹E…QN¬/ù@_åˆà‚= Ã§:f÷ˆ9®DÑèœÄq‰‹~—¸û”'w÷ô*!¾¦ÅŸ÷ñÇïIfµ9–®ŠÓŽÏ?¼—”ék®8øßM‚AAJn?Sµôp^‰DQ-ç÷Ó!—6ÙIÌ•jLÄ0ªIC< ¨ú°}ò)5 }@¸eÓwóÁ-àÈyúŸxÖŽ"ø,Icžq>€×±ÅÔ8^ÇS5ôüÄSC:Ü‚¿£-_Ò»ò 2åCç#ïB®O‘W ÷cöø>ø€»ŸùmÇÌ qìphÉvø>Ž€š…` )ƒ£²ˆn2ÏÏ ìn,ýá<ÿÙ@o]aJIMµ¢)}u‚(.šéL'¢±cv0Åʲ£²!h}póéÙ=‚ñ¥·[Z¹W2÷–¥¡>ÈÁ1ÈäÑØñ‘–áKBo8ÍBLÝÏBv×OçÍ›²d© mÍÁÒìÃ|4EÈöFÉéútIf\Ð subÝአ./àlitÀâQÀ¿YÚÁd8U§ö4@¡ +ß`z²§GÒb5ûÛ¬°¥Á7tûʵ„`=S>¿‚fƒÍ) Tõ²Z€àób×Í+3±ÐmœýoËúNKºj;-Axk­Õë%Êêü¨^‚ƒïw.X•’С„„Ó²ÅA³ëXqë†QÏŽy^ƒÝ½Lµeƒß mZ°çøÂW§",ˆÖNòPw«©B²î9²ç7ÁâžëȨµ{.{ ªô;-¥y7R½Hü ´vL< ˜¹cG¬ :ÃôéÌ}SÏYsݼ°ÿúr¸Át—D ŽG”,¹ëKÅJs&v/òÄD{¾?#ý§¡{fíì!Ji‚ŠÉé]8(çÌã»`> įuf°ÈS)HZdšŸ8ĶŠþT Éc(!fOè†å­žû$d_é`"ñ‡ ßØËWÇä˧+þ\) I L‹ò0ÙÖ•‘”’‰c¢D8ËT,É‹»ê…ü÷é2(£Ë3`Ž±ÇNƒëžÂF"Ð@áÁÇ'ІŠÍæe2ßeªT§ß’ïô†žZy.4‰Ñ"“1ÑWO£­”âNºÜ€¡K/Ÿ—¦È jä8è¶ÚV æ‰JžÄŒ•w5‚ŽK=ÿ˜ŸTfp0……2ˆŠl$¢¾j +”RƒGÙ§Š hÜQÒbxðq„¶bæþµCO¾õDCÛ‹†  ‘m{uk_8Cc;¨®"úÐüûQBë n¹îËÍ(+hèÈÌÛ@ãþi29øþô„MàTrP](yÙo±ÎhÉC¤< ÀÅ8pýˆeN ”¦ç¤t´êëBÓÙ¬µr,¦8Õ.ÅìÀ'b >ñ¼ß“X|9TQŒð¾{LJ:¤>vÆ6TUNÊý}†ë¼·¿üð¹?± ó¸¶kÿHª»hbŠ6O§w1ÏäIuÏP¤ékØ“öF$Rç—Täqz¯/k’ÈkeB> (¾K`úó9@zžìš½ÏeŒúŠ¤ + bóüÿñóÝ(¼.•Ov,Ž†•ÿ‘­ÎR»3 +«ò“3XË $´t<¢,YPÄ:L¾€@*âÞvn*ú—&O„‰uPÆ:yÙÅXªtÅrÆh1™|#jB…ì¹®~' +OˆøO´çföþþö§ïUA²$‹@d4Š†~¾õÕìáîG†þò‘N€ý£œ¡òÈþОˆ,Ü}²ŠÒvh#)*&[®J¦¯˜Mžè‚h@öaó‹R&MÌñÈlùYü>µ4uÉô•;>hØí+Hª˜…NÒ\ÓÒg o)¤\Š<•±½§‚aÙ¦CG¬ïµÔ2yÀy–b ïè•÷Ó/ÔŽê<ꓯêB_1ç +ì`WAŠ3õÕóõ41ÒžþÀ˜¯%Ì7ÏüÌÁ¶óMŒ‚® N“:ç“ÄÄÅU@¶]¹ç¸SøûUÉôõiôõ<‡LŒB²c™ˆ5ú àlèAA]½Œ‡bá;pôå&œòo6Íëø»¾Þ‰ä ³ +ÓqŒ'\ò̵î9'Ýȇÿ’J§YnìÙãdªTèÔ—Xj¨}-½%Ð|¡’®œxãÄM5ghêŽ,Ó†Nì4&Ä„9<¯yšéü)S‰ÉÓxÀö÷3ç,¶?g™<^Ä[T…‰Ã¼žft†ìÏîA¦0D¬Y^|m'NX§gOür N2ÿÆ[q#Q¤-›“«p’ž +?B£ ‚Ø{Úè€äN-(_í/ËŠéêS¦!$ë¯U~˨dÊôlÃæÉ×Öj‚ fö&4(' úuùRõ ™;‡i¿¦k~ŒðÉgêù.—Ögë¡Y¢Sm¿&%˜E%™µ£"}x•s(`Îß겉Ìss9ÛSâø®*îV¨6+*gS8`‚jÚ> endobj -1892 0 obj << -/D [1890 0 R /XYZ 85.0394 794.5015 null] +1922 0 obj << +/D [1920 0 R /XYZ 85.0394 794.5015 null] >> endobj -1893 0 obj << -/D [1890 0 R /XYZ 85.0394 751.6872 null] +1923 0 obj << +/D [1920 0 R /XYZ 85.0394 751.6872 null] >> endobj -1889 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F53 1017 0 R /F41 925 0 R >> +1919 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1897 0 obj << +1926 0 obj << /Length 1971 /Filter /FlateDecode >> @@ -8304,50 +8444,50 @@ xÚ½XKs ]uI7¢Ý(ñ¬¢û-ìxM’o}À&à £áàý&ËÕ«ñÅ.XšˆoÏÄ•ø:­×ã —•kqÒÝðaÿ÷( ÖsC¶ºÎ“ºþþÊHß4˜Ø{ý£’„9ßE!´à°! Å †0JHvëÍ|ùáqñ°ZÜßyüé<ÐtA‚#(0ÇJËcs8¶œŠrË h4¹Q¹Ú:`‰e¶-ZVc š7KË8A×ÝšŽí`­Œ–‘® ÏJO_>>:†O»®£V¯el0ýxûÁXÄ…ÙkÃ8p»Ðóaȱ´@ßR˜Á½i›=+ ˜!íT}v¼Šœ÷m.ÿÇ°mI˜]!¯÷n_ËüíàëÝN«½B’ó%#(IÄõ%’gÉ~ED0Œ!–ƒ%?»;óò³€˜ar~Á†ƒÕPa=™oË n1{wïäø¤§6É1oήéew×µ—ß²Ù]®Y¤'åQ—*o€Êgáo$ §u%N«M}5×–<%àbIoúKÿ_Rðj€b ºqD®Ç§§ôzxœR‡ë|póƒÓNò®Ûê8óŒÍ¤¨ã5×:¥K߆´ BúŸ™¾oK€²µŽ\ŸLÐb~ -{AÈf†¬ë‰ç$?Úa¹ñ‚>dICß/ÿKÝåð|T‹ý¸kàeXoЕV»E[QIw%†—uâT²®ÇuÖh¢×þ¿…#RÿéêÉîÀô‡ÿÛ=ýƈ Aý5‚žƒ±uJÇ„|Ùö_àKßÿ üî¡Uendstream +{AÈf†¬ë‰ç$?Úa¹ñ‚>dICß/ÿKÝåð|T‹ý¸kàeXoЕV»E[QIw%†—uâT²®ÇuÖh¢×þ¿…#RÿéêÉîÀô‡ÿÛ=ýƈ Aý5‚žƒ±uJÇ„zÙö_àKßÿ ýF¡Wendstream endobj -1896 0 obj << +1925 0 obj << /Type /Page -/Contents 1897 0 R -/Resources 1895 0 R +/Contents 1926 0 R +/Resources 1924 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1907 0 R >> endobj -1898 0 obj << -/D [1896 0 R /XYZ 56.6929 794.5015 null] +1927 0 obj << +/D [1925 0 R /XYZ 56.6929 794.5015 null] >> endobj -1899 0 obj << -/D [1896 0 R /XYZ 56.6929 684.0716 null] +1928 0 obj << +/D [1925 0 R /XYZ 56.6929 684.0716 null] >> endobj -1900 0 obj << -/D [1896 0 R /XYZ 56.6929 572.8605 null] +1929 0 obj << +/D [1925 0 R /XYZ 56.6929 572.8605 null] >> endobj -1901 0 obj << -/D [1896 0 R /XYZ 56.6929 509.4701 null] +1930 0 obj << +/D [1925 0 R /XYZ 56.6929 509.4701 null] >> endobj -650 0 obj << -/D [1896 0 R /XYZ 56.6929 470.2699 null] +658 0 obj << +/D [1925 0 R /XYZ 56.6929 470.2699 null] >> endobj -1902 0 obj << -/D [1896 0 R /XYZ 56.6929 433.5878 null] +1931 0 obj << +/D [1925 0 R /XYZ 56.6929 433.5878 null] >> endobj -1903 0 obj << -/D [1896 0 R /XYZ 56.6929 401.47 null] +1932 0 obj << +/D [1925 0 R /XYZ 56.6929 401.47 null] >> endobj -1904 0 obj << -/D [1896 0 R /XYZ 56.6929 335.1577 null] +1933 0 obj << +/D [1925 0 R /XYZ 56.6929 335.1577 null] >> endobj -1905 0 obj << -/D [1896 0 R /XYZ 56.6929 244.1508 null] +1934 0 obj << +/D [1925 0 R /XYZ 56.6929 244.1508 null] >> endobj -1906 0 obj << -/D [1896 0 R /XYZ 56.6929 168.8052 null] +1935 0 obj << +/D [1925 0 R /XYZ 56.6929 168.8052 null] >> endobj -1895 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F39 885 0 R /F53 1017 0 R /F55 1025 0 R >> +1924 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1909 0 obj << +1938 0 obj << /Length 1658 /Filter /FlateDecode >> @@ -8363,47 +8503,47 @@ a ¦×ã)]»Ž‘VÊÀí,1ͨ1)À«»h·uB¶q¸»+°#Ii«€Îâ!©÷ÏqlXz¼”âmŒš¡Ñ+ëþ•c¨ÄÍ>‹ìÑI$.ž”òVLK¿rS¤æ­Sø¨Šl¾çý–Ý_Yµ®Ðq¢˜ŒÇvG|5ùtü”ÝÙ{ÚJmÃÿ”…n¼®õÂèÑH¹fÞ(òE3º¼9·J"']fœ*È;ïNϵŠ™;æuRl’¼«#B+¥»ôèB£€">1î.άF&…êÎ"ÊùÏê¸ÀÑQuÝYÉ'1‰Úiž¾ÿtw> endobj -1910 0 obj << -/D [1908 0 R /XYZ 85.0394 794.5015 null] +1939 0 obj << +/D [1937 0 R /XYZ 85.0394 794.5015 null] >> endobj -1911 0 obj << -/D [1908 0 R /XYZ 85.0394 575.4191 null] +1940 0 obj << +/D [1937 0 R /XYZ 85.0394 575.4191 null] >> endobj -1912 0 obj << -/D [1908 0 R /XYZ 85.0394 427.1073 null] +1941 0 obj << +/D [1937 0 R /XYZ 85.0394 427.1073 null] >> endobj -1913 0 obj << -/D [1908 0 R /XYZ 85.0394 329.3834 null] +1942 0 obj << +/D [1937 0 R /XYZ 85.0394 329.3834 null] >> endobj -1914 0 obj << -/D [1908 0 R /XYZ 85.0394 262.8864 null] +1943 0 obj << +/D [1937 0 R /XYZ 85.0394 262.8864 null] >> endobj -1915 0 obj << -/D [1908 0 R /XYZ 85.0394 196.3893 null] +1944 0 obj << +/D [1937 0 R /XYZ 85.0394 196.3893 null] >> endobj -654 0 obj << -/D [1908 0 R /XYZ 85.0394 155.0304 null] +662 0 obj << +/D [1937 0 R /XYZ 85.0394 155.0304 null] >> endobj -1916 0 obj << -/D [1908 0 R /XYZ 85.0394 117.4002 null] +1945 0 obj << +/D [1937 0 R /XYZ 85.0394 117.4002 null] >> endobj -1917 0 obj << -/D [1908 0 R /XYZ 85.0394 84.3344 null] +1946 0 obj << +/D [1937 0 R /XYZ 85.0394 84.3344 null] >> endobj -1907 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F39 885 0 R >> +1936 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F55 1035 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1920 0 obj << +1949 0 obj << /Length 2406 /Filter /FlateDecode >> @@ -8417,32 +8557,32 @@ H :ÍS½--ú){É=6]´põ9ØíncUm…2hÔ¬N±,˜o±HÉÖæx¤¦{7¶±ß~ƒEΚø ‰ ðœ6ƒ>ê¸t(c‹`&U‰P{wjÏÀN•œËbyW5 õsÂ|±&¹)†ìåLw|­ÄÌÖºÏ1öÑ»I¼hå¥]eb{¹‹yHÊ7)­õXØp¯—W¦*‚žÃ-«â¯ HX†Ž˜€<”(ßé¿L¾ì²ø—ÜZ“biÍ>`Ô%¼ài13‘H‘8–g’{uÂDʘÈÓ>Ke¼õ K °ì«?f„­Ígù°)*Wtf¶ }ª7­ínW«lóæS]éT¯Û¢®š½›-ÆååV—Ù®4«¯ ª›S,wº9`ÔMŸåçJ¦ÌÝÐo$Ýó{Ä€ÃÚÅ((«9š}ßïØÕú¡¥h°TÔ’TØâ[tì;gÝ÷J¸ÂE”f;›åPynNØ1HAV=ÖW?¦·ïÇŸôXïph|0Èì E¸[¦QØy&1¾wkí*gõªoõÊZ½ò$ »!Ý“6D.ò›wÝ:’ÙcQí›?›ma¾jÍá[ÎY›iá…}™Öc†iÀ¤»lº£-탴yeÞ'ì»=jî*!LÐ3@=Ðqcw cë/á˜-¢8Úÿ»Â+[c’ò„Ÿ”Êa¥òo.œ¤4•žX“Dzyþ¸].»¢ÎHEŽýG*$Ñl¤¢Ýüÿýÿéîßâ(_JŽd#K‹•Jï1~¨gûOë¡ìÉŒI2endstream +ÝPWrAÁêJ.˜»·ÆÝuÝ4Åci)u˜;=Ø>9š}ßïØÕú¡¥h°TÔ’TØâ[tì;gÝ÷J¸ÂE”f;›åPynNØ1HAV=ÖW?¦·ïÇŸôXïph|0Èì E¸[¦QØy&1¾wkí*gõªoõÊZ½ò$ »!Ý“6D.ò›wÝ:’ÙcQí›?›ma¾jÍá[ÎY›iá…}™Öc†iÀ¤»lº£-탴yeÞ'ì»=jî*!LÐ3@=Ðqcw cë/á˜-¢8Úÿ»Â+[c’ò„Ÿ”Êa¥òo.œ¤4•žX“Dzyþ¸].»¢ÎHEŽýG*$Ñl¤¢Ýüÿýÿéîßâ(_JŽd#K‹•Jï±èPÏöŸÖCÙÿÉäI4endstream endobj -1919 0 obj << +1948 0 obj << /Type /Page -/Contents 1920 0 R -/Resources 1918 0 R +/Contents 1949 0 R +/Resources 1947 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1907 0 R >> endobj -1921 0 obj << -/D [1919 0 R /XYZ 56.6929 794.5015 null] +1950 0 obj << +/D [1948 0 R /XYZ 56.6929 794.5015 null] >> endobj -1922 0 obj << -/D [1919 0 R /XYZ 56.6929 748.122 null] +1951 0 obj << +/D [1948 0 R /XYZ 56.6929 748.122 null] >> endobj -1923 0 obj << -/D [1919 0 R /XYZ 56.6929 665.5133 null] +1952 0 obj << +/D [1948 0 R /XYZ 56.6929 665.5133 null] >> endobj -1924 0 obj << -/D [1919 0 R /XYZ 56.6929 579.9397 null] +1953 0 obj << +/D [1948 0 R /XYZ 56.6929 579.9397 null] >> endobj -1918 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F53 1017 0 R /F23 726 0 R /F55 1025 0 R >> +1947 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F41 935 0 R /F53 1027 0 R /F23 734 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1927 0 obj << +1956 0 obj << /Length 2100 /Filter /FlateDecode >> @@ -8452,50 +8592,50 @@ xÚ­Y_ çíŠËK¾—9IC.I ʾ‚=Ò—GÉ qìúžkx(–µª_ÔtZu «^^!êòêPÛurq6of• èº*UìÒ˜ÂÁäõ‘£eYI;[V1\r' =Ãm²WÙ-9Šn‚Èl=´“ûm^×"ŽpÕ©_Á¼4ôkŽ³‰=ˆÑÇÙç›EêÕ`åB›ŠT¥„ùXçëR9Qç³fKÓnd$p~©C…wSU4Ó$HÍc´Üæe0•5‡aêI®¤Ñ³\H3õ)+™VI ¸Ê#wè>‰pû?½¿7#NS?F!1ûûìãÿv&–(C a¤ï Sê³ A >OM×!F_矟nzÂ#d“})m%<{«!Š-ŒÞƒ·Wû&?l›2DU3`Ø°ñÔ’ÐBwˆ1îû–Ê>"®I§ì.È8‹ù¹‡ÚlE‰™®ó$ýÛâ½­¨šª*~ nÞÊjWC,ŸÔ;14 òKSu†ÄWãõV`†]ç¥+ÔZ*ö1˜5´Õ'ï9&(&Â%#ö-׺>.|ñqƒ¾¶96¯ó?}˜Í$"ìèÂò"+aITyÓ¼í|¼ £ORáÄzf…»XY]û2IŠ„p;~3F{e;Zy8Cù™ð¶¨YÙÚÇšu0Ž³‰aHm„“\×7å·~ xè±Tm{Oˆ\sw ±‡2®Ú.å«_ø·Ö2­o2…ü Ë5”·\­åÙxx†T©o*ºîŃßïúgÒ2~½)l!_eñƒîW‘î°Hy‚YŠÆ“ÙýÓã—ùã穧=¹’À=`§ˆGiÔw9ÓbÙfdoJDQ…®gªüÑYºýî*xËìò¥TÅOiÚ5¨yš¼ ÈIÜ®(—'ß Ý1u×Cyðؘ)UâêàrÒ÷2+êªMÓ&€úäÞçPÛo®ÃÂÁ|öøáØ·)V¾\g‹c˜AÁ“5VíºUîz¨§.¶êb§Öe”jŸõÏÎÚz›/DŠ"JèõœÒ!rW›ç)Åi”véƒ÷ÒJDÊ}Ù£×û³ÅQr]´–è\¶^bÐ(!xO¸™, QVfÌvo0XìßvMµÞg»î)aªs)ý‰Ð=|àÁ+Ô$8Ø·jå P@ì”ÆÄŸ+û½F ²µ¨³=ÔÙþÅJ¦[+=X™ Ÿf£Ocn›j( D”Ò¾÷*¯*åUæžVûªÐKg#íj) Ƴ‘¾ÇeÁâ‘ö?ê)GÁƒñƒy*Öã|¥ÜVw7föAÅ6+Ãr·ãçÑ}â»4-'q]š °éÁ]•fG0€†+s$ª-ë¼É_/ß|ª+{Ïà6Fþç_Ž÷]1¨è\ìõ¯’0°4%N(¥1!ôTôö7„sÙÿ(l7wendstream +QƈSg·¯šjá‚Às‚ñé>{Oˆ\sw ±‡2®Ú.å«_ø·Ö2­o2…ü Ë5”·\­åÙxx†T©o*ºîŃßïúgÒ2~½)l!_eñƒîW‘î°Hy‚YŠÆ“ÙýÓã—ùã穧=¹’À=`§ˆGiÔw9ÓbÙfdoJDQ…®gªüÑYºýî*xËìò¥TÅOiÚ5¨yš¼ ÈIÜ®(—'ß Ý1u×Cyðؘ)UâêàrÒ÷2+êªMÓ&€úäÞçPÛo®ÃÂÁ|öøáØ·)V¾\g‹c˜AÁ“5VíºUîz¨§.¶êb§Öe”jŸõÏÎÚz›/DŠ"JèõœÒ!rW›ç)Åi”véƒ÷ÒJDÊ}Ù£×û³ÅQr]´–è\¶^bÐ(!xO¸™, QVfÌvo0XìßvMµÞg»î)aªs)ý‰Ð=|àÁ+Ô$8Ø·jå P@ì”ÆÄŸ+û½F ²µ¨³=ÔÙþÅJ¦[+=X™ Ÿf£Ocn›j( D”Ò¾÷*¯*åUæžVûªÐKg#íj) Ƴ‘¾ÇeÁâ‘ö?ê)GÁƒñƒy*Öã|¥ÜVw7föAÅ6+Ãr·ãçÑ}â»4-'q]š °éÁ]•fG0€†+s$ª-ë¼É_/ß|ª+{Ïà6Fþç_Ž÷]1¨è\ìõ¯’0°4%N(¥1!üTôö7„sÙÿ(Ä7yendstream endobj -1926 0 obj << +1955 0 obj << /Type /Page -/Contents 1927 0 R -/Resources 1925 0 R +/Contents 1956 0 R +/Resources 1954 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1966 0 R >> endobj -1928 0 obj << -/D [1926 0 R /XYZ 85.0394 794.5015 null] +1957 0 obj << +/D [1955 0 R /XYZ 85.0394 794.5015 null] >> endobj -1929 0 obj << -/D [1926 0 R /XYZ 85.0394 752.0811 null] +1958 0 obj << +/D [1955 0 R /XYZ 85.0394 752.0811 null] >> endobj -1930 0 obj << -/D [1926 0 R /XYZ 85.0394 529.0618 null] +1959 0 obj << +/D [1955 0 R /XYZ 85.0394 529.0618 null] >> endobj -1931 0 obj << -/D [1926 0 R /XYZ 85.0394 453.6936 null] +1960 0 obj << +/D [1955 0 R /XYZ 85.0394 453.6936 null] >> endobj -658 0 obj << -/D [1926 0 R /XYZ 85.0394 414.4777 null] +666 0 obj << +/D [1955 0 R /XYZ 85.0394 414.4777 null] >> endobj -1932 0 obj << -/D [1926 0 R /XYZ 85.0394 377.7886 null] +1961 0 obj << +/D [1955 0 R /XYZ 85.0394 377.7886 null] >> endobj -1933 0 obj << -/D [1926 0 R /XYZ 85.0394 345.6639 null] +1962 0 obj << +/D [1955 0 R /XYZ 85.0394 345.6639 null] >> endobj -1934 0 obj << -/D [1926 0 R /XYZ 85.0394 279.329 null] +1963 0 obj << +/D [1955 0 R /XYZ 85.0394 279.329 null] >> endobj -1935 0 obj << -/D [1926 0 R /XYZ 85.0394 194.9705 null] +1964 0 obj << +/D [1955 0 R /XYZ 85.0394 194.9705 null] >> endobj -1936 0 obj << -/D [1926 0 R /XYZ 85.0394 119.6023 null] +1965 0 obj << +/D [1955 0 R /XYZ 85.0394 119.6023 null] >> endobj -1925 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R /F39 885 0 R /F53 1017 0 R /F55 1025 0 R >> +1954 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1939 0 obj << +1969 0 obj << /Length 2835 /Filter /FlateDecode >> @@ -8510,24 +8650,24 @@ xÚ¥Z_s LJ$ä—«ªiòå l¬i €M*™ÚÜéüÙè?Ž¦œ ÌÁ|;{0#üús9æ7x,¿/èP¤ç.›õ>)pX™£±½›-;«;¡T^(€{ÌyÍÆ(nw±øÝíë¶^ÖåÙâwD¬¾ô=–k°ðuƒ[Û¼)z+:™øƒÂ˜)*`õ¤©.<8=€¸rŸ±$Yœ§Šáƒ!|v/fÂyÇÐŒ`àXXº*ÈçYâ‡`!¥ÉžéáLîD3ø0Ñ ÚP7Ì–kPìÚr æžÈ€ kÃ'~uÅ›U€ÄÛF÷\OwGhuy­Ùc™©%©°5]w °KZF[<*ÿ ?šÃr™CÕº±ÝŠä’õ:¨ûµ(cÁûKYçį·«üõ4£€š%‰’qá:Ô€t¾Ë€ËؗΈeöå“A¥UÌa˜'T†Ù¤nQÚ*7UWKÌIú•€Üõ¹‰&ôg¸Å©Umù˜MO“}¿+Zž ¼ô„`¥\ ëò7 ¬kÔiDiêŸ< 9p €°0±wú$Ü_‡lÕ˜¡ö _,ss„Ò¾«Þ/ôO=<¥få¨Ç‹¦sïç:³µ°™©v¬‚Ž7BÆÇX:dGÛ%¢tÒ{÷ðO5²gš72ÂóÄÔšåK¶Ï–­ $€C r­&XÒ˜[Èk<)ÜÌ­²–ˆêGÝ>wJ·`¤¨À(²•/ÊxvEÏ8 ›=˜Mf%~`¤=Õ¥þùAòî‰Na5üDrn-¬pÞ9ð^l»b×9G“ïésì2|¼pž–GŸx"Çœs>âÆÄ›æâÃQÓîójÓ¾œÞ˜øh}D¬s"—ÿ«Ü5"Ž\ÁŽBýÍ: ûF&3b/NF?ݸh÷÷žØþÞ3H¥ F6ÝEÉÜ‹>ÁLí.µëóй:Ó -2å{Ùò°'Ž­ýð%#ƒ©èyq•ëW9Åî°‡2·†Ó¥ZpŸž·¨Y,.S>{ýîIJØ×ùžÀæ±[·–dö\”EûîÏf˜¯Z£|â ‘\ r*Ï`Ì0H¶ºª®§í<³çÕrÿ¾£0©Éžÿ \-¼Ðȯh2¶þzña§Ì_ó“"BA©+ ¨“ÊbN¥òŸÓTÍJzbaáÅ«üù°ÙtocFªàÜßž@¦ ÿ`d@*6±‡óÿ]Jÿ÷7Q¾t®‰ `ql…ÒûƒÛâôœé/XNeÿïN¥Qendstream +2å{Ùò°'Ž­ýð%#ƒ©èyq•ëW9Åî°‡2·†Ó¥ZpŸž·¨Y,.S>{ýîIJØ×ùžÀæ±[·–dö\”EûîÏf˜¯Z£|â ‘\ r*Ï`Ì0H¶ºª®§í<³çÕrÿ¾£0©Éžÿ \-¼Ðȯh2¶þzña§Ì_ó“"BA©+ ¨“ÊbN¥òŸÓTÍJzbaáÅ«üù°ÙtocFªàÜßž@¦ ÿ`d@*6±‡óÿ]Jÿ÷7Q¾t®‰ `ql…ÒûƒÃ:=gú –SÙÿ殮Sendstream endobj -1938 0 obj << +1968 0 obj << /Type /Page -/Contents 1939 0 R -/Resources 1937 0 R +/Contents 1969 0 R +/Resources 1967 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1966 0 R >> endobj -1940 0 obj << -/D [1938 0 R /XYZ 56.6929 794.5015 null] +1970 0 obj << +/D [1968 0 R /XYZ 56.6929 794.5015 null] >> endobj -1937 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F55 1025 0 R /F41 925 0 R >> +1967 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1943 0 obj << -/Length 2184 +1973 0 obj << +/Length 2183 /Filter /FlateDecode >> stream @@ -8541,47 +8681,47 @@ Zì¬ ¶Äm-n˜\A¥9îh„Ÿi=(ä=Ì]%ò~ÐÙ`{>µÕròiþy8XCTÙc¡«¹®ÝB—WkB*»l’9¥®nfö‹„´ÓuVdà‘IízÞ¯êAÛKë”·I±ƒšäsÎyð§ @'Ú:þõݵáÓ¼ôð‹ 8j üev"bÿ;»è˜8=dç70• ‰ˆÄ~òmñáó×aÃÞ@»¾-”Mó— Z'Û»^C«Qnël·Þ‹…ÊqWP"h[¥Я‡²€!—¹Šë(œÞmˆg0Lô¨&à\±×ç쨆±Y™¯xf½®©ÛTW—e>\ ç/E¹©²êx”„Ð#’ SǘžIRGwÈ´5½Ã-t”L4ѽgq:eº¸¥òž^׉ïArçVKs2v8‹HÑý˜—'•/é… »œÔrL='Á™ËЯC¯^n_¹¬ú o¼@WˆÑv#–yƒ3ôIí¯³1=qŽ_uþ5«Ai -…asœ r¬Ê$€q5Kò~m t œˆ“)¹ÃœðøW¬öÙ‹0£Ž'6çʽÇ=ĉ§mÚÕÖ#ë0¶ÐÔëT=õÄ7f'€WÀ×ɶî‹p PÜ6 -׺]=õ*íøç0Qå¯ÏrÞÙÞKH(fòhNûPÀ"I°C©JòÚû„&¢Çò> Çe­‡R˜6«×4±+]šäfö!!„îú>Å‚\ý;”§Vá¶>þß?wí¿éBV¡Bì¿ó~.m¾ïCb•ÒÇ#„«Þþ0vªû<¥ø¾endstream +…asœ r¬Ê$€q5Kò~m t œˆ“)¹ÃœðøW¬öÙ‹0£Ž'6çʽÇ=ĉ§mÚÕÖ#ë0¶ÐÔëT=õÄ7f'€WÀ×ɶî‹p PÜ6 -׺]=õ*íøç0Qå¯ÏrÞÙÞKH(fòhNûPÀ"I°C©JòÚû„&¢Çò> Çe­‡R˜6«×4±+]šäfö!!„îú>Å‚\ý;”§Vá¶>þß?wí¿éBV¡Bì¿ó~.m¾ïCb•ÒÇ#§tÛÆNuÿ/<ýøÀendstream endobj -1942 0 obj << +1972 0 obj << /Type /Page -/Contents 1943 0 R -/Resources 1941 0 R +/Contents 1973 0 R +/Resources 1971 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R +/Parent 1966 0 R >> endobj -1944 0 obj << -/D [1942 0 R /XYZ 85.0394 794.5015 null] +1974 0 obj << +/D [1972 0 R /XYZ 85.0394 794.5015 null] >> endobj -1945 0 obj << -/D [1942 0 R /XYZ 85.0394 752.3199 null] +1975 0 obj << +/D [1972 0 R /XYZ 85.0394 752.3199 null] >> endobj -1946 0 obj << -/D [1942 0 R /XYZ 85.0394 504.8188 null] +1976 0 obj << +/D [1972 0 R /XYZ 85.0394 504.8188 null] >> endobj -1947 0 obj << -/D [1942 0 R /XYZ 85.0394 359.3246 null] +1977 0 obj << +/D [1972 0 R /XYZ 85.0394 359.3246 null] >> endobj -1948 0 obj << -/D [1942 0 R /XYZ 85.0394 298.3625 null] +1978 0 obj << +/D [1972 0 R /XYZ 85.0394 298.3625 null] >> endobj -662 0 obj << -/D [1942 0 R /XYZ 85.0394 260.8495 null] +670 0 obj << +/D [1972 0 R /XYZ 85.0394 260.8495 null] >> endobj -1949 0 obj << -/D [1942 0 R /XYZ 85.0394 224.9084 null] +1979 0 obj << +/D [1972 0 R /XYZ 85.0394 224.9084 null] >> endobj -1950 0 obj << -/D [1942 0 R /XYZ 85.0394 193.5316 null] +1980 0 obj << +/D [1972 0 R /XYZ 85.0394 193.5316 null] >> endobj -1951 0 obj << -/D [1942 0 R /XYZ 85.0394 129.6476 null] +1981 0 obj << +/D [1972 0 R /XYZ 85.0394 129.6476 null] >> endobj -1941 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R /F48 940 0 R /F39 885 0 R /F53 1017 0 R >> +1971 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R /F48 950 0 R /F39 895 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1955 0 obj << +1984 0 obj << /Length 3093 /Filter /FlateDecode >> @@ -8597,29 +8737,29 @@ ZDh ˜}ˆ|gW­ï³PÁ 6“ÝaQyœ½e0¯¦­0Œ{5èyÞcçûR6Å‘%pš¦\´rÉ”kz>0UÏ%]«À[SוßÌùÐ0U±´§ïXž×ù‚[¿4‹mb÷ LBuÔeéTÂ÷Úöo !°Õëè”(@|Á°†³m·iIÖÀ§õ_"þP´/9Y{ð}‹@5*t]eˆÃýEþXw5}h.Wt\ñ}Ä¡ûX»LšÏ(ÐDlŒ •Üäm(rà²ÏmhͼûŒŸÌG-í(˜&ÀDjäçÇyüÀ®C¾|ó‰» ÷÷yË­´jÔJï™Õ)]á0á^`XŸ"ëS´Y#BsÀœp‚{¤K`§E€BOÜÅ;½ÿöÏ´¥§†C&Pò2ÿI —û[I‡ø Ó‰;/N~¦çÂwWti—¾mw᣻¿öÏuÑt·Ï9ÃèxͲ „Ï%ÀK½ ÷®G}u*'ƒJU å×É”ÜC:ž‘’OÈ7ç mŸÂæ ù YÈ°ÒÎb) ®<Å\‡tȵL"˲{÷¡–fú06\hÛ}¡Í¥'ÎQZF ¡¾~6чºiÊ*À oÖpѼ·‚ƒê*Áï£Ý÷ èÓÚâÏŸ.§@jÝý -æ1¬t+ä)…Ú|èÚØUhÓ#²Í_ŽÑÀV$Sã2>â~ä¯|oëì>Í;Ø󶄚´\¿2œÑ]óoÔ?'dðN=#ŽÈÙa°|…â¾\ÐËþg4vÿ#×¼ÿ–Ɔ†–ï6Ï´"‰B›úa—¶1þk¨D÷K’ÿûG_ûŸ·šYväû©J!a83S(dp¹Co埇òþ_0¥Åendstream +æ1¬t+ä)…Ú|èÚØUhÓ#²Í_ŽÑÀV$Sã2>â~ä¯|oëì>Í;Ø󶄚´\¿2œÑ]óoÔ?'dðN=#ŽÈÙa°|…â¾\ÐËþg4vÿ#×¼ÿ–Ɔ†–ï6Ï´"‰B›úa—¶1þk¨D÷K’ÿûG_ûŸ·šYväû©J!a83S(dÐÅ¡·òÏÃyÿ/0w¥Çendstream endobj -1954 0 obj << +1983 0 obj << /Type /Page -/Contents 1955 0 R -/Resources 1953 0 R +/Contents 1984 0 R +/Resources 1982 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R +/Parent 1966 0 R >> endobj -1956 0 obj << -/D [1954 0 R /XYZ 56.6929 794.5015 null] +1985 0 obj << +/D [1983 0 R /XYZ 56.6929 794.5015 null] >> endobj -1957 0 obj << -/D [1954 0 R /XYZ 56.6929 752.112 null] +1986 0 obj << +/D [1983 0 R /XYZ 56.6929 752.112 null] >> endobj -1958 0 obj << -/D [1954 0 R /XYZ 56.6929 665.106 null] +1987 0 obj << +/D [1983 0 R /XYZ 56.6929 665.106 null] >> endobj -1953 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F55 1025 0 R >> +1982 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1961 0 obj << +1990 0 obj << /Length 2978 /Filter /FlateDecode >> @@ -8633,718 +8773,739 @@ xÚ¥ZK 5‚']R‚ðy¸/þ¶L]ÒèwÖ72žÜåÉ`B[êõv2RE\„Qþ{6RõQÓ‘ªC™HUç 2êY},Ë겺!$bžµ5›Ÿ„$PÔKå3÷ài Y£aÆäÃŒ Þ¾÷8—NùwC]tÉžÓD{9{wå¤lÉŒg*úý0Ñtyl7‡ãkB2å üDÎ믚Ö_‡2úûx-Ó€Šêí‰,ƒ'$ÂØYþh„?O‡Ð çHú Ê„u)„L8%Ž‰«¶¡ALRÛ)ö:ï–Æ]!©ãÒlÛ´#†þsÚq^µ¡¡3iG‚i7¤^¯'·Р7>žuXÛÍ”†x“³ç©5’óTL¥}Áù‰#q%“í£fìË¡Œ}†Kê(Œ¢èÊ’4²dwêw¡Kþ‚7¡ÀHphŠS^/éÆIïgmFÏææiÝu’É:€êÑH‚ šrBÛ²P›¬i»k¦Hò`eŒT˜"µ½L°ªL±ËOÄÛ²…Š]ÎB%ι+‘c_$°¾+I,S"‘çËcì³jPAmN`þ;z¥]# wI(¼ @™‹bê1—Éðt]¥$Ȩ®?Ø5›š6¼¶Ó”ÍØýĮܗPqMš¢HÁåkyÅÕõQӦءŒ)Gï¡ãÂë‰:/ž.SÙ4ÃÅué•Ùdv¾e;Ýks®BÅ• EV ùxY+9wVVy¹¶ßàè~Ï&k¾éŽØ$†¥m}Úå~²…{žv;ôètâ;äÙíôP3nÇ¡ŒÛ¹Hš4ã$Šæ—t ‘%½‡±R‰¿ä§cé*º¦…óß`!æ_h®ëýaW`à˜”Oñ­ó飦%Ò¡ŒDž®Ö »â©ØÝ[ŠŠ½YÎ:ÔkÃ{K¡bŸ5¨ÚšAfž«ÓãcWíΦe¦¤ÎúJÕGÍÈÌ¡ŒÌ¾]X‘ ¥„ÌnvIYÒ³¢NœVþ’«ºÿeå§ûŸº*GfVîÚ#5l¢`>lï¾¥›.g}® Â$dZ–‚Á`WjÖ>jF–ed)Çì…Iª]&Ðd»ËZ‡CÞ-ÁPfëP#œyæ'¢0Lù¬½·o—  \ÇÁÝý»7’(ð¯ H¥OÒH4¦Š¤Çò©¨ˆ¶-¾R£¨ÖuŽ¾¸-pÞÿBÝyÖØY°±rñ ˆ4†¤&M‚–xóÁ¢s-Ã-¿™åve·Dq)hHqþÝ&B…ªùÁGÓÎr*g9ȇWgKkZÉ7I÷YÐYdwÈ­ˆgDOÿK"çó+’8ƒfþ#aAÆ"ÿy­ -‡”™>ê]~ÍQi¨…³¬u KÞü«,Ð#“±Çܯ“âËÆ…×Éß Ù©hŸU/.Rwû&]n×W.g,œúGähÑxFÎΈþï+ÿ—%¡LÓ‰ ¹8\ÍS(?Γ!ëÝÿš.yÿgH,endstream +‡”™>ê]~ÍQi¨…³¬u KÞü«,Ð#“±Çܯ“âËÆ…×Éß Ù©hŸU/.Rwû&]n×W.g,œúGähÑxFÎΈþï+ÿ—%¡LÓ‰ ¹8\ÍS(?ðCÖ»ÿ5]òþ?gvH.endstream endobj -1960 0 obj << +1989 0 obj << /Type /Page -/Contents 1961 0 R -/Resources 1959 0 R +/Contents 1990 0 R +/Resources 1988 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R +/Parent 1966 0 R >> endobj -1962 0 obj << -/D [1960 0 R /XYZ 85.0394 794.5015 null] +1991 0 obj << +/D [1989 0 R /XYZ 85.0394 794.5015 null] >> endobj -1959 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F55 1025 0 R /F41 925 0 R /F53 1017 0 R >> +1988 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1965 0 obj << -/Length 1813 +1994 0 obj << +/Length 2340 /Filter /FlateDecode >> stream -xÚ¥XKsÛ6¾ëWðÒ©4 Q¼ˆÇQ±•ÄMb»‘2M'É–(‹Dº&åDùõ]EŠˆ“iG.ÁÅ>>ì "†‰„¦:’š£“$ZîF8º…o/FÄñÄž)îr=[Œ~{Îd¤‘TD‹uG–BX)-VÆÏD€Ç—Ó7³óøìåììÕÙÕåóIL¤`|<½¾ž]ž_¼ŸÄ4ÁÀÌßL/ßM_۵뉦ãé‹Ù|òiñûh¶h ëO03Vý3úð G+ðá÷FL«$ú/­i´ñ„¡„3æW¶£ùèV`çk³5OJ(QÌ8R ? A’`’‰F‚QÖBFI2Ïe ‹§§Ž -‰¤ ,ê -¨ôL•¬£RR$9=•n²b3ªÇ·Y‘ݧu^ÜÚ÷Ô>.ç³3fÉå&Ís•Õ–¨7™%®®¢ÆWïöý#Æ,u¢J·+ÝnBïÍ®lY6ÏUå‹•%V¥}eݳ23@E -©DF1!H' müq’Mô $›Å5¼6D^TÙroyìÊ*Ûf·@YThpîT%ˆb¢pô®GŽÞs»¿•EÑmvªZS$„Ô«öLÕÝÐ ÛS½Ø8œþ†^–E §ÝDƒy¯=“1Ô-•öyãÞ«ü¶ÈVß…N(Ž$êqèº\߇®å2öΧ:%C ãèôL½´Qˆ*r¢s~—-óõbüe“/7–[*KU›r¿]YºAžû*s+ v† 0s+Çd†ZÈ5¾XÛ¥¢<•ž¶k„cÌáe«§°"›ÓjÄʾXgnnÒÐÙeÒp ò$²¯é./s™ÏH¿óËù«Ù_vq˜_&skûÑêem¼˜OwÙWãæÖ1[=*ÇwôÖ×å¾pªSOo—åÈßvi½ÜØX…·»ûüÁ—ÜwË øÔ€“Ȇj`eµ+¹s±.ïBÈøi»å¸¹rÛ¬„pÇÝ­:æ¼ÁÎ&IšØn[G1åHcÁ1âФ‹gï§o®_Ï܆n`‚kT"*Y'‹]ÛmùÅ‚!HäÝÎbߌúÊ’ÆíF&W™ú ÅÐqwÛ €B!¦„çõƉzc•×Þ¨óùÔ&YÂò•å¼9´t¬€ˆ ¬†UQAÍŽAl؃5(Q\÷Ïü#Nð«Ž'è ´¦'DR.á”D[ü@@ãǯ¦) ÖNÈøà^vûª¶,7Žµé†Ê%™YØ¥U QÚоšc‚C»ëc:˜òîÝ ÇñV %¨cïÙžWM´Çœ˜c@I¼x(—Mgsx2Þ–åçÊ’&2‡†icUâq7Iý~hÓPA¹l 2›ôbB[l¸ CôÒ‹qN/³µ*ýÖ´¶ÔùÜ>‡Ã‚œ:Uͱ€àNh5.6ÜQÀ…QH.Ü–;;¬‚•;ßýQõB‘*Ä)#ÎÕø6t}ïÿ7– ó§YÜÿ¿ÿ›;þ É¡ß(EÃ÷t*›…7Ê8ãÃðïŒ(ƒpÚþ/?×>3endstream +xÚ¥]sÛ6òÝ¿B/RÓ%>J¬¦nÛ9ÓÞ5} %ÊâD"U“râûõ·‹(’¢Ïuôp±Ø/ì >‰àÇ'±f:éĤŠÅ'ËÝY4¹ƒµ·gÜá„)ìb½¾9ûùi&)KµÐ“›u‡V¢$á“›ÕŸÁk¦Ù(DÁùåb1..Þ^þçêr> yb¸ f××óËó‹?¦¡ˆ#@ä( +>Ì.?ÍÞìzšŠ`öv¾˜þuóÛÙü¦¬+<$Jõ÷ÙŸE“èðÛYÄdšÄ“¯ð1ž¦b²;S±d±’ÒC¶g‹³µ;«vë˜1Tœ°X(= ¥b ð7g†s@2qÊ´²5™àc&óXh²p6TTf4—“.±–i„¥ì°4‚ÓËß7y9 ¥Hƒ»¼Ìﳦ(ïè;£áŽNÒt¹É +‡\ç MšMN“«ë›)O‚«O7ôý9ŠdæHUnW¶Ýž½Ç]ù²²ãªvˆåŠ&«ŠÆ²jzRæh¨IÂ’ØLBÎYÇÂêã(£÷œPFà>í¤(ë|y ‚¬òm~¨Êš8œ;UÃ5SI¤¾sô¬gŽÞc¡Üÿ­ÊL&¶ùu*˜Ö&}žµGaÝuÔ0­Àq{¬o6ÎŽ¿/«²Ó¶Þ€ßGBA¨¢ñÖ}×Å]™¯ž4Nb&ÈÏš®‹õ´éZ,”ÿKþ8äi$“Qôži„g/lXäž‹}¾,Ö ¸ÖÁ×M±ÜÐd©iVoªÃvEsk!uî Övˆ6sCBC.”q\¬ TVCêYë¸H…ÁÃËW¯bìiY²¦OÖ‰[`:¹0ŒÀÜ â(ÿ–íŠÒŠ+}Ô@øA*7ÿ7Oã #·¡Eâ+[Á¥}þ ‹)FÙ£vxG¾®¥cù àvQŽø°¶Ëšå†|¾ö÷ŃOQ_-´à+Ÿž Ù€h–K…S±©î§œóàU»å¸¹vÛY;Ꮋ›uð¼AN$Ö·[áÖ“P(–FB¦P…Pâù³×ïçnC×1A5¡¡u£X+àµÝV_É:†@ÞíȆ°†ìkš¢Ú–¦J:49ÔAë¨õ‚ý6g@dD0™hëL%š 1o¼Pç‹M0XíÄ'òaÞ>¶&éH£Á"Iš:«²†œ Ø<"OÒ°8Q©?sjD>Gqô®£ û JÓOÜe`‰ƒKž’ý€€ÕãG¬C‰i§eBq +ò¦¡†Þ×98F)E]¡]}¿±°Ï\ª±ü÷DŒ¡öÉ2ªî}Dî„ÍM¤Ÿ¶(ý\˃ì¶z€Ðr_ŽÏ«»§)ãÙ +nEÝ@)…‚k”-ÏQìšY@mÓ¶íé½XÎ|–âˆ9ú¦ eÃDÝ¡…À­p謰ÁÏíýZ±êÁí c] NÈãi…­ÞÀJ cF à`•m”Ôg‡ýóˆ£;M1+¸ØÏî2Ÿ |¢j³tKæ¨g›†¹`fÛ™$8”`éæPÚì%•~«<ÌרèÒ a¡WábcO!øò’+n‹mÑ<Ò¢_²~?ÒÜ;ç/¯² ãZ´U¹Ê}z¦†ËM¾üâxVÚe_r‚Ôí³ ~à¤Í®•PÃ8p·&Ììî]Ê%ÈÒv©|¤Eì-[˜+R4Y¼ÆÛ-¾:‚,Ö怓5P?÷nÙJ#³]&@ŸwuhìœèRh÷û<»§u <æN‡å2§+¼Ž:ÑíÞ` 9œ¯Šgó2A‰@ç }؇=kœÙm‰”Kä±&Ul¿Ç@ +½÷Ï?¸X¨wûm:2?ÒhÆbßf¦“Ç¢a³HùIrÑZOPk#´þ¾ºÚö@ö¢ÁÍѽ¸ï9¶yVÛü—ÛŒâ +ÝL`²Ë³²)v6‘ X_¼énÅ t^®œHô.✱¥!p‚=ùÀ­g½îúe¬‹0ß…@Áîë~盬yòyηžÎ‘ ×÷mïúËüã…o‘°åYWÝ÷Q_çl¾Á ™{•~1ŸÓžÙûÅÕw_1zW|¼Š%x‘r™vo[œ©Hz½¾¸<'6©ãÖ+^ô±ÛIèCV²íX?¯lyµ#?&>Mpßðüå Q™ä=ÅÁ¿cÞ^FŸÒ˜%©Øoöéæ׫ß5ÜE Ío™;wX<ÖÇÜ9¾©Ê +IqØ=õ7ŠŒþ÷1òHµþã¿XŽ&)¸2$‰n&f°Y{¡P9.¢ÓWåˆ ©ÅˆìÿÅhØ^endstream endobj -1964 0 obj << +1993 0 obj << /Type /Page -/Contents 1965 0 R -/Resources 1963 0 R +/Contents 1994 0 R +/Resources 1992 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R ->> endobj -1966 0 obj << -/D [1964 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1967 0 obj << -/D [1964 0 R /XYZ 56.6929 612.518 null] +/Parent 1966 0 R >> endobj -1968 0 obj << -/D [1964 0 R /XYZ 56.6929 335.1485 null] ->> endobj -1969 0 obj << -/D [1964 0 R /XYZ 56.6929 267.4555 null] +1995 0 obj << +/D [1993 0 R /XYZ 56.6929 794.5015 null] >> endobj -666 0 obj << -/D [1964 0 R /XYZ 56.6929 225.2657 null] +1996 0 obj << +/D [1993 0 R /XYZ 56.6929 614.1369 null] >> endobj -1970 0 obj << -/D [1964 0 R /XYZ 56.6929 190.8284 null] +1997 0 obj << +/D [1993 0 R /XYZ 56.6929 339.2217 null] >> endobj -1971 0 obj << -/D [1964 0 R /XYZ 56.6929 153.8399 null] +1998 0 obj << +/D [1993 0 R /XYZ 56.6929 150.6999 null] >> endobj -1972 0 obj << -/D [1964 0 R /XYZ 56.6929 83.2251 null] +1999 0 obj << +/D [1993 0 R /XYZ 56.6929 84.3474 null] >> endobj -1963 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F41 925 0 R /F39 885 0 R /F53 1017 0 R >> +1992 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1975 0 obj << -/Length 1710 +2002 0 obj << +/Length 1439 /Filter /FlateDecode >> stream -xÚíYßsÛ6 ~÷_áGû®bùC”ÈG7qÛt“Åκ[ÚÕ–µ–”JrÒô¯(’²$Ëö’f»ín—»„¢!ü|cÒÇðCú‚#̤Û÷¥‹8&¼?{¸ Ÿ½é#ãX!§.õjÖ{ùšù}‰¤G½þlYÓ%‚ôg‹«Áèü|<9>ù}èPŽ¯ÐÐáNG“ËÑ{½w>”t0z3žâ{”€PbLF§ãcçèíøè—?Î&ãá§Ù»ÞxV9Vwž`¦¼úÖ»ú„û 8ûFL -Þ¿‡Œˆ”´÷\Îw³;«Þ´÷k¥°öiùjœ Äõ;Р¤O’œÓ\"QVÂq<ž]œœÏNÎ&ê4å;qß¡.’¾ï•ÂI‡ g~οÎÓdi^`uÈ)ò)—ò¥d®Q-nB½È’"øþB?|^z‘¤E[.Œƒ¤ˆæ¹M—úo`^P¾è%øòcz½Î‚"J½©vV!ªU±^:ŒêL'ÆY Ât+¦a¹ãyq*dwB!§.eC°•”²ëÜ´MB]×=`Ò -u˜¬DJäRÞ2yžEIîu\[ä×qdîÄ ~ -´F‘GÐ<Ìs¨/pQAÄ‘ë)¬l s©ëÈ”e6ƒµ©½ÏRÍ£8ZÙÊìÎ+Ìl—µ¼3·¸ÄÈw…·?·êR»s«’*sën«òÒ;`Ò -u˜lTž€Xú-“]•wfyE[–åÔ§Û| Mª{&AËÇ&¶×Y?¦¸¡ó!Áá¿Ú¿*ÑÿÑ>c‚îµge¶íµ°gDò†½ó0[¦YÜÈÌ"ÌM4Vi°hõ™ÕJ/â /ÂL¯¤Ih™®-zQÒQõªsà‰Z¬ÐŽ0AGö¡-ÑÝ`IÊøHÔ¤ö„ÂJ•±ø² ‚<ßu÷›´B&ÑðÇÕ&?Ü„Éú(¹nFál)J³‹b(¢ªt¾¤ë, VM&ŠŠ*§ó"ß &†ø| ¡×¥ö€i¥ÔÉ´ß*Þ[ †)‰¹ßv%Õa¼Ñ‘¨„,g´i}VbÃü2áÔJ茆 llLði7@+÷>ÛÅ(Š†Á'K½«g6ËoÃy¤ÞjXsM @d.ƒõªÈ]Ý‘¹0ã˜ä󗛆3L.B¨]o?; -‰2$ vë…´5ý¹@ÌÄ·Ã_)x1ž]^LtÚü6`£÷—ãéóOÄ: ÈÚÜ2ð†€M·,‚b7¹ˆ43<Ì4‘gFì>´\=-ÂfÛ[+ŠÇF%dAvå§ã±~yô~zÖqÆ.P>bŽü"/j=^#¥‹»ú¸ÔÇd=³]ÅòĆñÕÉäX+‘ÆE%Pܾ©!æ‹pi@Hæ‡Ó Y7l»K<¨çy{³„Á—¢‘&£ËÙÛ³‹Ãœ$Ð0’Ðtúý#6¡:J“<ÍŠho¬B¹»5z\lžÔÁ‘€;(Æ[è••ÂÌEž ÒÄN‡kù„óvÂ*EÍà¤ñm´ -KúE©¿áãú½ÊL.Á*ZDE5×ÒŠÈm` ,`À)ªý"MW]€ãVÊ=$émåm -…†”çhpt":gz§Ww¼ŸÚë*Jvu»¨½’ê@oèx›+gñÉ®nªÕ—jõ­ZÝU«¹¹Õ4¸ ÒRJb†ù*Èó®¹BúvV¨4.;4 :¯UÓOPt1pC¬Òøúù4–Dî¹ÛM"¿r¢.,J·PÄé"ìB¢Aö•ß_ú½Wkë‹Nß–§Ïì_òÌúÒÃq6óMû®ë#A±ßÖ™wèt˜¡´0m&D^<¬Â¿ž÷ÓgŽNqP_ëßPÊ,('m¥÷‡Òãjõ¡C½Ç‘Ï™û ³Ùèªñ ‰le@=«;¯ -~:;×4ì&g+Tãæzk³ó8™«KœàOãä£gÎ͆ã&|Ä]ÏoÖåcUGÏ|ø;­ÿwi˜ u?' añ?kîdÍòi?Zâ‚c¨¯u:WCñO{´ùž Ò A»ÿÀ°úƒ$Ö)u(BdÛõê{¦mßÿÅl”–endstream +xÚ­X[sÚ8~çWð3EÕÝò#Mh›nK²ìîL›Dp×—®mÒ¦¿~,ÉØ`Èdv§3Yþ¬sôï\bøG†J ÌB> BŽ&b¸JxøïÞ ˆÃLuRµŒÓ8‰ŠäÉ÷Ï™Oà:—Oj‹©1 fÏj«:­­Ukëñ(ó D†ò“Ôc²“y +b˜ì˼G]”MÙòUμ=®Ç0@ÖcéòÒzìbûPDéK’› ˆ<1¹ìÐB €GÕøÕÆ=oÒƒzL€‘PtMÞèb“iGŸ•.]L’DM}ËwE%ÝzW²ËªÑ)3 c Ì£]¾ó}EYO„Ÿ8—ï®ðoˆ*„°§›IK@ÒJb™yKt¥¦-ÑHYKd#–<¸ -™ÝÔ‚Ý"æÚÌ«„FÔê%naŽßSëÚe¢«„´´¬êº‚»õѨì%»Øá²S µY^—U•Ùs%q•“J|N6‰ÅD¢&$Ýh%Hýrk­á¶ÅqÇ4®Ÿ¨¢>H‡Köjdx) ÕFŒ¾B-ÁÇ'f‰ †‹bÖ¤IÃaæa2êǹ8\^®“)í! R’©™q%1šuµµÃS×)LP·î‘¡âîÈXtJON"ÕÔAˆ 홊û(êg·ï=Q­ -lV1?ݨæ°ê"$æY˜ •ÞÿâZÖ.ÅßTÝÆ;›Õ,¦¡Ø|ánË¿…cƒ8)¤Ò-¤5N"+VðÊ…v¤}½*ïVáD…=WÉx?÷ƒœ¤Æó·BJú=j%{s}hî)«•˜ÚÀÈí“M}ˆZœÚs©ƒ6>=dë‡n¿…Ìî«eHšVí9×,$íÎÕiöט^²“í¯Å¡ù¹懫?Ÿ+µü‡»r€›ðÑÒý^¸ŸÒ7{ qct8-àÆqGp@ 'h#øŸr ëÿ„<ŠôÉD€C)Ô_ÃNÀUÉdžÞ7ù·ZB"mGªú«‹üêì΀?¥ov¬âÚZVà]˜(DÉʲÂÓ!&"¦…®@àpCakÁØ—äUé®?€kïpuŸïý(Éfã”­¼ÐÐ+ ÑÒìö1¾lÕØ&5rÀõÚ2Š’Ž:«\5ä°¬u;Ѳ|s„ߊÄ2f/â7›å·³ø™Ú>Î ²¡"U•Û4°B«Ø”¶Ü$_ö™»ð§³Sì¿:6kÔM‹L­:®ÀÜ ­¤}7ö:É'©¤ñ c"I¸–òXÁ´d/_xÔD¾›¬ò•#!–þA¼áTÑy#­®z-ÚÓ¶6J×çÀÅ] $FߤzŒ,Í0®›ß¶`Ð'Ä_òmóÞÑ!­©³¯i·ñ>Ǽ_ž¼3yb¨ ¼Õ¬o”jàþ.öŸÈŸ˜åh¤æó§®ÔtþÔHÙüén4Š°Èävoc”.ù¼bAhD±~&”êk6žÉzm¦SÙ~)Ùn§m*ÕŽòÖéd -ÒI›2Ú¶N¿Õs¼eã¹T[yë¡Q]7ß%OSsÄÂÞM%F©‚)—1úU:R3T R–*oÇŠŒÙ8ãW1TéyÕ©Ýúl0QÃ1ØS®a‹ÐÒŸÑZ4lÁFd ¶ùNÙ¾YÒ¢}/¤{¯h€@W7o­œð4 F B0}v™™bj”A+ˆ‘¥éöâ‹—QɺÉ[8²Gü€C-¢?ñ^Ôzh8zý+òn‘iì매ðþžÞ!¬w°M{é}‘§¡„ªá…êø^¨N; -ÃÏŽùI+4ã&^ÈzÉçq/ÑF‰™Šî|FÏ+d†JõêQ1‘±é+ÊQ#U kÌ…t±Æ]¹°zœ=1èÁØa–©Ùò)³ŸæÁÉØÁûNh¸K²|â l@4ÐϨìùkj^0Ü\ÍKëîp† ÍW6 ¾8JZwkΈ±Íb‰¾+ÌŒHñ6#(¬A,atwŸxJvÅt0™h¸M¼Xï“]øØÆ!¼‰T×Ù}Qî&£!ˆÞhóͤsÆÄ›wΎдs!ëœÛ1ç”$Šš/?FSAX ÜœRAf¨Tÿð¢ÙÓª=»(Ã4n¼á®VGÇ2Rh¬Ê}¾q×ö{xÀš5õ¶rƒ‚©ïÅ×'¶ã!õ³5‘¾½ia,P¬dÔsIÀ¹¤Ëá4ÐLÿÔ™öSæ¡À&©šÏNªëþoyyXv§å$§Ã‹ X›}ÝF›oþô—‚í7‘2†Bóq"òXAð×^)Tœq:tGÿMáP÷ÿ–-–endstream +xÚíZ[wÛÆ~ׯà#tŽ±ÁÞw[I•V²©O?@(Á™­°¿¾³7ARŽÕ6µÎ1»ÃÙ™ofç²$ž%ð‡g\ ¡‰žIÍO0ŸÍ—'ÉìÖ~<Áž&DqŸêûÛ“ï~ r¦‘DÌn=^ +%JáÙmö>ú)t +’èêìòüMüú/ç¯ÿúÏ·Wç§1–‚àèìúúüêÍŻӘðÈ8I¢Ë³«¿ŸýÍÍ]Ÿjýx~súáö§“óÛN°¾ð8¡FªÏ'ï?$³ tøé$AT+>{‚—a­ÉlyÂ8EœQfÊ“›“Ÿ;†½UûÑI0p‚d ‚g˜!Ê`±׈(I xVé2ÏâùC>ÿô¯ºÊn°AL’B1K|$f8ÓÎ@E’:Ñ–jÄè•ÍÏÖËÇ¢Ìívú7B¤õæ’„”~ü%-‹¬h7îÍ2-ª{÷V¯ül]}ÉWm7ßÖuéÅ0Òœ/'åˆ +&­œ7›ª~lŠflEŠ‘T‚΄!öf£ŽA{ÂÁ.{L‚$Æb÷YX‹0<áŸÕz§±Û¼³aôÐ>v£ÏÝèK7š;xßRD(¤56r›½æeÚ4Žl ÑH)©=UÇq1ÁDW‚sOº¨WË´à8$ë8þðr»Æ KÄÀßgqgvX|SXP¤qÂ<ƒeåSHX":–ûÓQ¹¿ŽßòÛø±1¿Ë–¯zaùêãv‡(QuáfÀ“I¤H"Æ<› ž1• 8!Á!\hÚM™?ßïo^Xûö(¿¬Xåó¶^m&˜r†áxÌôé?ÁôM7úu‚½àHrÊþ&²ë‚‘¤7HÐÃSÛ÷€©ð̆³.ð7„ç>‹ýá¹£ê…ç~è?–A¢„+þœ°¬Æ6zýÂgý¿åcª$”6BŽŒþ•¬‹>šöÀ^½°|/ˆåó1WÈ0ý–8üÿ¸ÙÅMû64Í°Ö)áµ´Ö¼oÎo^ÿrq}{ñöªûÔ°ç‰Èd!?Qù+†‘]9i(SƒÓ¨}°<‹šMÕ¦¿»É´ÊÜdQµùýÊ—õ4ª~Ý­†N€úNZ0 +ÙEë&ó• ;Y\ÌÔV¥Í„ž”*„ àZ='´‹!£ô(Feun˜+==ä••uš¹þC95”SDg˜D·EãÖ–é§|J$,¹IJª/Ò1è%Ñጬ›|±.ݾ ÛÁ ×-ÁÎU˜w¨zîrCUä¡™2ë÷±ËÍr3ƒ²zÁzµm¶ò¥Qk7J·-Ÿ5ù +:´SÉ"4ív:ôDÉ=)vW{ÍÁ"œ;.lS,‹2µÚcè'¶‚óªÓÏG”NHˆ¦•U*º[·n¿¢u[¥åSºñ2dëå£:ׄõ½mUÛ¼jAí?ïÅÌçv¨r4££xYË€«Æ4á]—Lл¹Ô½FZ—V3JeÐPu•–åæclÔ¢X[m,“ÇDz0îaYµ«bÞ‚íì’…Ê-”ù—¼lÜôÝÆ=³|‘®ËÖð#ÆÕ\ë÷©ÂåØn­ßQ™}ãl¼%+ÑòÈ–hbË>Tj~©F[žWé]¸úÊò»õý=Z´Ws …¨yXñ-ѽ=‘Uûa¯ÚöÛj=ÞoRéÞ~×LÚ­ïÙÁºI®—Ëtå/}‘DùïE»½EB(9 LŸj?2•…æó>hnÙa³»å8ƒ-^¹GÇVŠvoAW a©®|Tßö\Ó#èô¨ ¨,:_vÐá¦~:²e šØr€N‚8MF[NùTMm\i¹/ªAGÕM"¾¦ê¢š†ºãÑNõý*]~•{Ð@svÄ=ªTÖw @%RÞ2Ml9h[üépK—m*êJà¾1¦oõ]Á™f#âõzU™tnó‘·\pq€´i›½ b-†°rÔ>Õ~P;* j¸±áÇAP¢í\ØôÓ) =ÆAÁÑ„`t°( ©JvcRøb3Ñ ³ãü5L7…“è¯Uu»S¼ê¾›aWæo‰&T“ól¿))䑼ԧ:`Š@eMQL˜BC+Ç娙4tJJ+Mˆ5è; ë2×(±®]C +¸2èNë¦ÍYp¯¾(eƒž×,¸&ÕÔ‘JG×uÓ6ñJ£Dã¨RßšMd2¨Ö¡‡5V‚°´ÖÚ[†Rý-ቯÕaˆ_M°g %JÓ÷ØH ‡|Ï.J9!q×-í²…–Z <þ‚Æ°+ëyºOzh†8Ãü_ÕîKkÙW›’ ®‰ÝB#ÊeŸsÝ''A‚KÖõ¶Âǯ ù‹a“{ÙÝúÑÍГçµs€péA™i·L`\éò›qn4w~Öô'¶¹ZÓšé3÷Z¯ü+ü›b⨌+ÝAwã(Š*Ï]2´œÖm\/âî[å˜-ñèKhMZ“€ã’>HíAÉfa¢ÆæÞgpeJ¦¶>Ú~™ìCÚå»~bêád&ŸŠùCÝBæ¾i½S¼Mt"ÁÀîŒðçÙß|?ÛÕÇí¯Æwo”¨`~ÝürÊyô÷²ëD|À|´vÏ3÷¨ý´÷&ŽGÏ€bëðâ|ÀpÚñ…¤Ða øŸú@֟ĈêÙŽIIî\ÆH@¸€n²Ìï»6œGÐOÛç„¢|¨ðÚÙÈ`µŸv^±ËÄÍm½Â¼õ€¡LæÖ+¼;HDeÂG·B‹àJÐÏŒ}ƒij¯„ÍZZ6µuçÆþÀè¾\{.i–9aO´{*`ÒÞ§Yöc$ÚŠ±L[ãnÕÞ¦8¶ö(MžíûM5×ñ“ PÒ]|óï…¶¿Œb€§R{M"9„{¡ Ö˜ÝzÎÿ²hWöÉ #ùendstream endobj -1986 0 obj << +2014 0 obj << /Type /Page -/Contents 1987 0 R -/Resources 1985 0 R +/Contents 2015 0 R +/Resources 2013 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R +/Parent 2012 0 R >> endobj -1988 0 obj << -/D [1986 0 R /XYZ 56.6929 794.5015 null] +2016 0 obj << +/D [2014 0 R /XYZ 56.6929 794.5015 null] >> endobj -1989 0 obj << -/D [1986 0 R /XYZ 56.6929 752.1653 null] +678 0 obj << +/D [2014 0 R /XYZ 56.6929 769.5949 null] >> endobj -1990 0 obj << -/D [1986 0 R /XYZ 56.6929 611.3886 null] +2017 0 obj << +/D [2014 0 R /XYZ 56.6929 748.2469 null] >> endobj -1985 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F55 1025 0 R >> +2018 0 obj << +/D [2014 0 R /XYZ 56.6929 713.4785 null] +>> endobj +2019 0 obj << +/D [2014 0 R /XYZ 56.6929 650.1391 null] +>> endobj +2020 0 obj << +/D [2014 0 R /XYZ 56.6929 514.9018 null] +>> endobj +2021 0 obj << +/D [2014 0 R /XYZ 56.6929 376.6996 null] +>> endobj +2013 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1993 0 obj << -/Length 2490 +2024 0 obj << +/Length 3046 /Filter /FlateDecode >> stream -xÚµZ[wÛ6~÷¯ÐÃ>PçT(®$ðèØJënìdm§íé周ˆ§éåe]ï¯ßÁ…)”ÛdOŽ†À`ðÍÌ7ˆÉ Ã?2“a¦ø,Q LÄlµ¿À³ÏðÛwÄé,:¥E_ëÍãÅ·oY2SHÅ4ž=nzsI„¥$³Çõ¯Ñå‡˻뛟ç *pôÍãèöòîãå;+û0W4ºünù0_$¦”¤V‹qtwy»¼^\}¿¼úç/ïï–ó߸X>zÃúÆÌ´Uÿ¾øõw<[Ã~¸Àˆ))fÏð‚QŠÎö\0$8cdwñpñ/?aïWóiÈ\H$(g Á‘"J†]†à‚E‚Aâ]FIÈe–vÙâVoôÛ·Bô4‰@I‚%Ì®Uöå:;ö¡%‹YÉüVÀ2Ö_*”`¢†¦]m³Õóã,Ê7ö™ên¶¯ÕœÈ([•æ¹îË6YUÛ÷¦ì}Ê¢+}ÌÈNó¡¬ëüÓ.³¿èmºoR;‰õÌÀ‡TRÄ™Œk~£”oÒ|§ŸN»¿/*‡#vÊßæ‹a‰èÍöœVÅÈl,F€ØN ¼Î6i»k`HœÝÅ:°Æ‚%qœ08‚”Ô¯–.Ê*!†ig=: ‡ºX ° Ÿf_kš^Ë@³A“ ©›„&F’‹i»:¥€]C` -$i|dØÃS¶Ê7/Q‹ž·Y3'Ñ6«ìû݃}±Yk!êmÙîÖVáSfe+ óÌ 5Zb–YF¾4ÛÌ-ØÓˆÓõÚ¾ÖuVkXcуµÖp°î€D¼”˜Ÿ"d -Ý R\œâÑfÚ ìüt!ASŒºŠtŸ­«rÿ”ï²ÿ–EXEAÀQ*ËPID•T¯Œ#8J%ÔW0\ŸÜˆÙüˆiÏ;ÄÎQ€‰E?|•ÈÅB©3‘ÙÓšˆÌNËDfŽLƓΨ œ¨öÒItrŽ(Nø´q^+`Ý >¹BDÊdhÞOó„GUÞèÄÎHdNF8*Ûæ©m¬´q{àýݪÉ„ÒÀŽæ äœøX@ÌD7›À”¢D€ÏN ; Dtù=¯CsA'¾\,BÑ‚hB:hCÎ(ìfŸ;o`[AT7ÅÔWN€wÜF·ymµ­³M(ñ×S4eõ29qŒ¸Ää/‡¼: oœh›Î û 4n§d¼Z‡°e¤s|ݼìebXH9i–W:µkkŒ‘c20ìPu¤ÒG …-FVnŽ~[·û'SX@hƒ@~Øî28iN•­P¾l¹èæ«­æ Jt¸‰¤OƒÚÝh¡Pˆ{tB\ÌJÁ¬c$ÕçZU¶K›ü?cyQg„Å}à‡¦@²4…î#÷qkÂAFÚl7*«}Úر…¿„âY;IÝæMj¹¢Õµƒ'ã¢rõ7/>[YÚ6%Ì”¯ÒÝîÅŠ>¹gê&ËžÒ*mÜdõªÊŸLè%"z_XaÓX6šZèàn ¶ÙÙ‚Ó¾A:eìH‡õ‘•vE¢.¨÷eG!´tÛB/¬$]w{´•jðY³mk—;Z€ÌÁ¤óŽ²uÞ8G·kl,u™åm0Eàáá¼¢ºrKL}žÓ&ÒDEë2s£¢Ôå<‘Ñ*mëÌÊÒâŲÞí&[5N»-ônœ»uô8‘¨ÄGŒVeÑdEc8—Š£›Æ-±«Ëž)€±Ã=–ŽnlS}T–¸<ºÏÒÂ8Q¿(°³AŠ˜Ë¸ætbmŸ~æ&û³MžØ”ºx:{öµÆÓ§×2ùóá‹Xû¤]žµŸÚdíúvPhÚIx¦öñp?"úѾœô”⨧SCßûžR zJáÉ·Ñè)c„ ýŠ=%ìõ=eèhS© o*áâÿÓTrÉ"#× -ž}­qxz-Ï&O ‘Ô³u^AbФ愺•‹›6Îk¬€: -Å¡. Ì»ÚÚ‚¢c˜af©\ !㠽ǜRóY¿3šÌ¤ÛÔMŸ«]»Îì Ld±¯«Gí ÑÝWNRŸæŸ[(ayé~µ¬ÂŽ}‡ª_z2[Û„¨A<&Cä¤õ0ßUs iÙŽ?¹Ä˜ÚGïó]Zíœtå}fÈŽNº€Œc 0¨Ä¹ ‹¾Ö¶:-ƒ­çPêÓ×…ç±åÑ0eœ× -X7Ä`ÆCëV[}À@‡øª€ãJúPI„)§=P™9 ¨ôhHB´Ä‚CŸJ­pgاu“U}%;þÇÍÝÕ»×KûvL‡!Hs2>ªªÏeõ‡NÄ»¦_l\q,ÊêaßϬvŽ;èIŠ€Ë(†Ã¥¾ß²°ƒðØ„¼¦P’ˆ³M S)y®«ékƒÓkp^/ Í®áð“KvJ%ˆÃаd¸ä50(ë=Ç›`Ô²ó©õsZ”…¦Ë}R3zŒéî9}qcÀÔÚõTû T1ÆØß¾r?ª·@LUOkâ¨:-sT?}Ùü¤a‡;ùSË‚wòÓ|ªI¯¾ú4÷žúÅp"x®ÍR‰ë -@Ç»€8ßç…>cói¾[¯ÜíƒæÐ —ÑÝ´–j ,îLƒf˜+ ¾†E¥Ã -§.ÒyÇðj{áï¦oæ†Íé‡æ^­¿cå–íég[¬6¦/LØ7ÓJ¿«­¥ðzâÝç²Ê›íÞ¾j–uÿöʾ̸æZæîVèc áënru Œ’I}1E0ÿ 7¡ñhc>z]©s™òWU¯ä|ül=ixe –®Úìì¦Ôú9¯GÜÓ™;pÏÃri?¾|÷ð>°ÇStöögÜzJ¢ÞÏf>¦™üßØܨ݀™ÝòD¹Ï>¡ 9,ÒUü77w×v>åvµ†“×M¥¯®­è^7÷ƧÅʹõ6-Z¨C§Ë“X"ǃ[Æ¿2! kø÷{ùññû÷÷ç=zS@,2‡‡ É{wöWeQ—U“·û±?P€¤®ÿª ”Ø›øżpø3 (8LJŽn†uP¤3Joó±é‚Ièhi°ýî“;!endstream +xÚÝZK—Û¶ÞϯТ Í9Š',ñ8uOÜxÒä4É‚#QO(r"Rž¸¿¾O‚IkoÚ™…@ð¸¸øî ÿd¡ÂLó…Ô LÄb½¿Â‹÷ðî›+âiVh•R}}õ×WL.4ÒÍ÷Ûd,…°Rdq¿ùeùâíÛÛ»—¯¾^Q—_£ë•ÀxùæÅÝ/¾s}o¯5]¾øæöÝõŠÈŒ R†,ÃË»on_®nþv{ó÷}w{ýÛý·W·÷‘±”y‚™áê«_~Ë ¬áÛ+Œ˜Vbñ­ébÅC‚3zª«wWÿˆ&oí§cÂL!¡¨‘e‰4†6ÏRh”1xe¤ñðÑ­¹Û®±Þ•ÕVË¥Ùf‰0ŠUriæ7#üJ)¯šu^™†§N§edBuSWÃDÅú÷ÖµïÞ¹ßÃ5QËbÝØßù´+×»ôý¶8x¦÷[Ö«7µ_À®i»:ßþë&ÐîòεÚfoWµX¢‘” th!-µ,ºIþ8–®±q_½¯Ž~‚âϲíÚ¯N‡-#»E}"SËNqøø¤¥'ÌÑ»¦Y²Lb`N!F¥°ÌMl €s,“-Ù«jÕ–UY¿ŸØ™Œ#ª8÷åõfd`Qül¯/¬ÍD`gS¶ùCedÁØÒhh*tG4@ïñs¹Û×Û€8Oeë?pÂ5‚pEÞŽ,¤‡a“¹›L"šXÕ ¬.‰† É?I ¨§v k‹uW~(@%!K·á+Eç˜?wß)IY¨8SD¸"ÃMiÏÔßì:3läßf™BÒ`fÔ*{¢UJåì±Ê‘Ê°³Ú:Ž…H(ÁN)&<ÃÛæ°];aŒ0 ÆOñyÎ"Õk 2™–CÞÞÁ6•ÛSCéùqFf{ò²7G¿bL«ÂÔ·Mkð?Áï@ÀúÈsŽ8(wWüÙÍ"WbhoŠm~¬:h?Õ(œÁ+H-h2Ë!ššD"B"”¦Ñb<&êZª´*‹–W#hõf\² p¡ˆ +PÃYÖ"ÕoC¸H&H ™‹paŠ;D0Å"\L§‹éó/¡ãØ=;×éãú(MGa\²Ñ#¨´uÄÓb„"ƈ~‚@W˜"“²S"hÅ$ì)&lèOŸ%¡dõäxíE H+–yRãT7+k¯¬¶­€ LƒuŒ;xßM¬_Ýx=^çǶJâ¾Ø±nÁR{êc f3xpÿáæ¸l'mÀº©»¢î¦ÍªÐ8Ì V5!šV“@dµä÷q-QZ-Ù{·2Њ‘âb–©@sÎÔ@?¨@ʼM¹z[ lGö—ÃJ M½™ÝÝ• Ÿ&à#ÁY’`ˆBð]>•ÝδhÐ2’j“ëØæeu 1†é0â0Š†ù@ÑÜ‹Ö 7c¨%GJ*‘Fa0Ãç+ŽÄVôT[z}‹^bÌZƒFC<1Ô…fÿXVÅ„6h¥ªWkòÕXl¨V*YÁS~¨§ŠLgçvâ“ù¾¨Ã"áz·ÞH&Ò (ß×Ía2"‚SvÉ ±ÍèõL¨fô3PYÝ)(GYÆÕ¬‚2”Èäf‹T#œ •|—zÈZïÄ01) ¾Í]¾ùÙužåj¦³Ý5G“ØöCá>°Û[øN“²Y¿-·þÅ®ð³Å¨ß>l6>Vn °Ÿ+ž Tpªéò9…2®õP¡¦õ•¤áïyê +Ðâ‚÷ÎdÄ|w"ìóTçyAù4€ó‹yIÏ<¡šx ²3pùž8G’b1ÏX¤álp†€fÀÚA% ˆ3AøÍÍ8<žöm‹Cëž-œÃ§lycêCÈ “ ÞÂÙœ1©SÙ§ ’Í 2C¡Šg"2CY¬Òœ}†ïé cÉÎóë/a{y¦‘8›‡fJ5 ÍHe¡YVp4ËWŒŽÎù ŒõÙ&cÖò^“¥5¾æÙÊ)”1¯!xð5‘h|mͤñ„…¯ä›g|ÏJ.§Æ—a‘¦°,ßÁ—c%X§²Ó +Ì º%Ò\|àâKEú,»ÐÿÿQ‡‚ÄòBrŸRÍhf ²šÙ\NîaG”δ“sD±äóÌEªîúÉMñSÉ!{?]K¾<”1ìŒø,1Ü'ñ̆9v <]-$AJÆ`º†“‰¹» >æèAÐåëíÈ´Dh~yHA ÍŽCÙŽvœDw±ÓDe, t¶Îmû¤á*ò¦«íŠyôœÐÒñ ¹·¸¡.}ÜF!‹Ë´C±7CtÍáãœædâ +“OVy} ÞÌ`S+³ðN©¦á©¬`Û1xcD ²o»Õˆç5›Ír©FX–®0"“!o½ïQÚ24öìØ>[èLߙ‡u/Ðé ЊEONµóàÄœÓ㵎r.›&¬Öé™ÆtÙ“ÇXè< 63ÚÆ #!uqŠ*7Eù‰‰Œí±åKöœB¨eR­4ñ¸·u¦–†mß +E@h;%PàB[ßÓËΔxZ×x´"jÖà…íÁ‰éË]#•ë¼2çi¦ëÁÿæ~°â1?ä¬]ÊG«€R,¿¯]g´G+ñ´)Y„öЈÜ“‘ëéWE–Aµ÷MÌâ wwe^¹ž|ÖèüÕà³nwl½9dzy ¼,6eçAüª±åÔÛ—ñâ!—gøXÈæÑÚÙ²¡Ô¡l-W6”*– ¥öeCh ˆÐˆÐ.ý‡¡l(ƒFɨEÐêˆ+¦³åëÎOQµMŠ;3òÌv/–5wù‡Óªæ¾Èkw gª˜§ÇÁ•žs”§SSFž6¡8CZ^*ÿ§T3&4PYúî³b÷Y¾bì~Î×hì>`,$•Â×5à7w?ï~¸bùO÷p–YŠ“Ìh¬'í¿™¥d–"†à–v&³ÌLmõ f–T°çg–òÐÉÔÒ0>Z2ÂÅùy—`a÷dŠ Ñ48‘Åf7z xéÃ`L\s½B4—16ËY$:gm€OH)4—”òv³s®Äh/Ãz5‡ßýå}\~yüåâö±§-2Ž¨–寋O_¢É$ÿå"BTI>ù?"„•"“ÝãqF©_Ù^<\üÞl½5ŸU€#D¨ <Á Q/ÛJà -¯„ËŽ`‡y²K—zG@vF9Šá;ƒr/ô:У-Q(æ±Õ¦ýÜèç3!±…æy•ò´²¿–Å.Ér kt •éá9=8 0FŠsâ8ÐqÁ¤áðð=/öeVöµN1Š¥ AA‹–0ÈM8èqD…(ÖÎÚ$ŒXQƒÕÚ· ~š±/ ´°[ãmÝa‡s{McQä«l=[e[§è[gÁ)s¸ Ýe€.›œ;ÔeúT¯gÛô9Ýþ8ÙU­h`¥8 ûÏWÛdàAb±Ä}y€ÞŒJ‚0àË À7?-öu¢¬”±êSÞŸUʾ8T!z) ´Q6ÐC€rW…?í’—YY,¾†äŸ‹c.ûô«ó‡˜ÒEU¾‡ˆ2$¨·>K´.½Çõ‹ˆNŸ¿˜¨0£°]‰á4ÝY¿ÿ4ûWƒù`  ¢.ñ–ž,6阡[ùB S‰˜Œânh¸¹}¸þ0¿œÿv×|ÕTEXµ#Õ0 Q0VyŸ„83ƒ8MìãÆÅ. ›€h ‡ïe•î,ü9âÑÍÝ<°]p-fÓ+Xˆ£é>Ó3¯Š•}VGèÍüîÆBÊ>–YY²§ºÊ -Çuu¸ÄrZ8nó‡kd¡·ÅÁ»Â`¤î´Ün:Þ”å«â°K,Q|ýÓ¢ØÁ•ËnéÃÛëÒBÓèU2&ù²YãÈg,‘‚¶lRÃGÏÅW›'äô[VmŠº²o#üºÞ¥yU^NóQ w>£§3Ž¼}˶[Kßê&q¬Ý~ÄÈURo ‡?GYׇFErªW‚æŠã1ÚÄŒWiµxe¤B:žD“ -TB} ¸²çÄ ùDœôª-­Öðw dyVeÉÖ¥Ó¤JúG°³IÝ™®´ahà¯:=di‰~ Çþf|hXظÉ BˆÑZÌgÑ6–¯C†Y´ÁÒ|g¬ÏR0¤–§Yz¤ËNœ0¦¸Ëòcéì{~ÿ̼7l¢!g:-f«ž‡lŠÒÕ3;fYî–3ç#‹dŸr•PÎm]%ò”úÒÄ=ŸÊb[WnuŸTmv£Ñ…( $’ÓÑ¥5],]–¡è‚‘Tœ†ûæntÑóhÜOÊ×`ìFˆØ°ÒðÁŒK”;H ,“tWä?—΂VÄ…æ Œ-0f`Q…ÇÆd¼—_f<žÞèOÖÆêD‡d¡N3lÚ‘@¥Ž¡“W‚ž¯Ô!ûxù”Î\AŒ9Š`¹g…~\Ôt9æxôSáSxRö’´W•.Œ­ªl½påuéŠâ BsM;S궱N Ç2¸9B.äö“,=R€eÏ!¥€R¢ÃòCÝoó|0´úè½\9¯í×¾¹Ðn†RÝwb=Ís“¼Â÷Œ™fÿNu <®W¹"&gŠÇ6Ö ½z,£×õ@¯q¦Î°ôH–m½B¯ÇiÔcù7éµéÞÂÂÛóÖYì¶ðNÈžÞ+!¡‹<ÎwÊj™!ŸëŒF C‰ ‡x¦¶kcRƒeiŠ¾Ð• ¦z£Ä¶\Š#"$>-—G -ÈÕ Š”’L±®`PµDÓú`f-tjg.lº‹6ùÖê2Y§\âƂœJ“u©o -€È½ÏóÕ½³?’〦_;BA¢ˆf>§y -®ÎÔ3”Ŭ!câõù£T )˳Æt–N ¡a´ˆd½©ÑŸŠnhºžn’ët=»Eõò#•ªŽ`›Ô§Ø¡=›r_xo¬Šžÿήû†©Ã¬€VKð?µÓ\ùhö´öC>3OpÖ¦84bu ±<2Öûzû~  ¤ˆüwJè)žQ -DpwE¼¹}óñÝŸðϧç6]—‹Cö䯑²<Ôã2ª…ó6õ¬\¼/E›ŽÖ4磋ϥú6Ö‰hç±L´ËÏÖšÍýF'ÜI !ÈiÁŠ)8Œ_긇™í„ô‹äkjW’ås’W6 Â ÓÁÂs]k¶ß:¤ëû¥»~;Slèwå>]dº™I—¡a1Å:6Ò• Ð-ƒ1ÚëyÜÔ"v¥£¿ -s? 6 -åÎÎ{ôòÆy½{2‰ŸÙÝh\-¿]Ù»à’æ•]°)€Åñ Ì7Å‘rk¬Ixê@YÜùÊ®dŽhæ¸Õ¹›=1æª3ou¸í]´#\³‹ÖÔJï™]‘™Ï϶ü¹[2ݱµ¾›Áãn—£Þi\Aø?íŒ-¤q_ôHÆ÷g]Ñß v<‘ ¦äi¡<ÎP¨Î}i Þ§ºBýzbZß½Ÿ9ÞZöî‘™Ž±dp·y"úä7_õÊ÷ŽGõû¨æ’ä8â4Ì ÄéèaB¦Ÿ¹topÆÒᘓ,CbF¡c<ÁÌ£ ˜õ†rÐ|â6³?ôõÝ!óc _jØÕƒFuURÁQf‹òD‰®›qÁȱB×W_°*¡œÍŸú’UhìÏM Ó#ØwÔ\õü׊rüS¦ïáäÈHƒÄ`ß -`'”Þ&dhîV†²ÿŠfendstream +2028 0 obj << +/Length 2003 +/Filter /FlateDecode +>> +stream +xÚÝYßoÛ8~÷_a`Î"–¿E>¦Mº—E›æbgw¶Š-ÛBmÉkII»ýER–dÚ)p¸—C€h$ g†Ã3e2ÆðGÆB"©©Çš#‰Ï·#<^Á»_GÄéD^)êj½Þ¼gñX#-©Ï–[ +a¥Èx¶ø<Ú™5ã9ÄcPB±¼˜'ÛtÍ×éüÛßEžº¬3@qš™8þþ‚¨IZÕû¼´Þ’Ü^ÓïYe¥²JªÚ½-–öJì%s·é¾±SìÚKjíÚ»EZ¥ó*]xNÀÎdµN÷/Y™¢vvìD>܈I˜‚›åôæƾú0ý˜c()_°À +þ‘K;´“©y‘/;¯{LwìN#J»¤=¼çÒ€™¸mÊ…OqÈ GZæÞÞÞ][{ÚÍj±Íò¬¬öIUìí£‡téršÏ]Z?&ylî‰TˆJ)ùp^™H¢}bE£{õ8û÷§‡sµø¼Í«tŸ§!Óe•nÝÚ¿+ò²ØWY½=ø…5ä’:;œ"ðûÍ~ŒÝr˜F… ÄcˆÍ¨ÜÁ‹iÄ5g‡%¶|¡4¶R?ÊE±M²ü°øÝéþ2H`îG^ìʬVFP¬ -œ)$)‘¡j@ n*Ìz‡KŠ Œº&šJÁI Z¶ZyKÈàçˆõ’l¥¹šèâ‚Ä þÙ*Zf—èž[i–q§ÛÚ]ì²))„S]¤Oõ*Ú¤ÏéæçÍ.[iÕJÛ€+-äÄ_n’UÀå#E†>ò€½ˆ)€%“°ZÀ˜_滺 YÖH©X-ï^MʶFÈCšà£l”­4 Xî§ð—mò=*‹ù·P¼Ð[âX¨¡ýêõEÌöP»‹ýQ8Gé­_5Z—~Ç —‹Ê£œ>mªìES°`5ÝY¶ð9ú½Õüp ØõHO ÞŸºÍÑÁ¨jØ{\á¸_5¯o¦ïnïg·Ÿî~²C +°rì÷$Ô™jæ$±—kW»ŒÜÄF²u×ʦ]ßMM³\a‹94 ˆÅx²KzÍ+ÓÅÍ:¯l2’¶—…é>ÙS]e…óº´Þy»¾CVzo:”¶…ëùvµÜlz‹•åËb¿M¬Ñ¦÷»kˆ`—¾.»GÐl˶۲ËVä—>aš1ò„˜uŠmüc6~4ð\|³}BM^²j]Ô•}“4Á¯êmšWåe`‰ˆ3ñùUfc¢—l³±ömnçÚÍWC\&õÆÅuø ÆtUïÛ©‰y„+‰1⬭oÒjþ¦‰ +™z"~À/%S]V-š4î—½n´&Ã?Ý˳*K6®&U2\‚ À&ukºôÔå¯:Ýgi‰~¢Ç~jöÐ1w ’ª4¡â|íjy¾}ÜE[-ã7âC—Þj¢Î»ôJ—½: b ¶çò±tø¾½æ~7l\¢¡gæ}†ÝîuQ:>³…b–åîqæöÈ<Ù%O›´ÏÖÁ…D¡‚ P«ØWp›…!™4¹íf¥PÔˆ‰ØÓÙHž4ã÷EÒ=lë +xl;õïóM]fÏö8D[R«WPÐÑ:ƒ¯u<ˆ‚s.(8rDA×eòþÿƒs„)D}]­Ó(hµšÀ=cÝÀÍažˆ0aî†GE2ŽõùøZ­@€½|±I¡i?Bšc¦C1˜Tê§bQ*áYQb¸†Žh~܈Ì[׈9ˡΛö`´6ÑîšÚekD"€ªS+˜pº×Ä^vEYfOA&AFc¦ü½” "qË㋃‡ Ô]- +X€Í˜‡6—¡U +áX’ã¥?ƒc…(ç¾r•@ç6Ž‰<¥ýÏYÉSYlêÊ=Ý%ÕÚÀîtuÁ1J¿R]:Zgª‹×jªË"T]RZ°ð¹¹_]Ì—8¸Ÿ¯Õ +د.P±áI/Àió¹D»…4Â"I·Eþ¯ÒÝ™è¬hCŒ¾lÏ \ ¦É©ÏôôYö2ñäÚ Y5¨o"Ú's³éŒÃö8`êNòZ²×™:ôc_/ŸÒÈb"†ÇúÏEí)§¹ƒýTøž”ƒ&íSeˆ±M•%ÑsG¯KGŠC„|0úJs;蜟Ói ·<¢7 Š-tõ3μʑ³Á6TšSÇÙC=<Úùhs0x¹ti]Ùe­ýÂœj3”š³&1_ðÜ×»ÂÒk ™ýšc/:õÝß|Md,4=ÜžEþëß¿ypsPT4œ*ÙÒ » L®åÇ0p¿Çþ\¹$-endstream endobj -2000 0 obj << +2027 0 obj << /Type /Page -/Contents 2001 0 R -/Resources 1999 0 R +/Contents 2028 0 R +/Resources 2026 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R +/Parent 2012 0 R >> endobj -2002 0 obj << -/D [2000 0 R /XYZ 56.6929 794.5015 null] +2029 0 obj << +/D [2027 0 R /XYZ 56.6929 794.5015 null] >> endobj -674 0 obj << -/D [2000 0 R /XYZ 56.6929 769.5949 null] +2030 0 obj << +/D [2027 0 R /XYZ 56.6929 752.1483 null] >> endobj -2003 0 obj << -/D [2000 0 R /XYZ 56.6929 747.9385 null] +2031 0 obj << +/D [2027 0 R /XYZ 56.6929 689.4255 null] >> endobj -2004 0 obj << -/D [2000 0 R /XYZ 56.6929 712.2038 null] +2032 0 obj << +/D [2027 0 R /XYZ 56.6929 626.7027 null] >> endobj -2005 0 obj << -/D [2000 0 R /XYZ 56.6929 645.6981 null] +682 0 obj << +/D [2027 0 R /XYZ 56.6929 587.9664 null] >> endobj -2006 0 obj << -/D [2000 0 R /XYZ 56.6929 561.1687 null] +2033 0 obj << +/D [2027 0 R /XYZ 56.6929 555.0457 null] >> endobj -2007 0 obj << -/D [2000 0 R /XYZ 56.6929 455.008 null] +2034 0 obj << +/D [2027 0 R /XYZ 56.6929 519.5738 null] >> endobj -1999 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R /F55 1025 0 R >> +2035 0 obj << +/D [2027 0 R /XYZ 56.6929 453.9292 null] +>> endobj +2036 0 obj << +/D [2027 0 R /XYZ 56.6929 370.2609 null] +>> endobj +2037 0 obj << +/D [2027 0 R /XYZ 56.6929 265.1402 null] +>> endobj +2026 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2010 0 obj << -/Length 2569 -/Filter /FlateDecode ->> -stream -xÚÅZ_oÜ6÷§p•®Êÿ"qOÎ%¸hÝ\ãÞÐöAÞ¥m%Zi»’âäÛß ‡Òjwåu{N°Èáp8ÎüfÈ Oüã‰Õ“N%¹S™f\'ËõKî`ìõ<‹i1åzq}öÝ?ež¸Ìa’ëÛ‰,›1kyr½ú5½xóæÕÕËËÿž/„fé‹ì|¡K¼¸úå⢽9w"½xýê-t•’˜²–^]üøêåùï×ߟ½ºÕ™ªÌ™D]þ8ûõw–¬@óïÏX&ÕÉtXÆÉúLi™i%å@©ÎÞžýk8 SçL „ÍŒ49´l&8ÈøËJ aç—e`Ï<3ÆœØÍc +6‡û¢œÁ1(“,Œ=¹HÈ„óÌi-ð„8×™*Or)3†48¡+4pàt™6ŠF–i)GŽŸÎ†§×ðW¤¯eJ¡mb`·Ž[\:ù#áSÎIbš´ÃVw&„ï.×"yÙÀ†’éžÁ‹‰ä°)#&^Ç5ìÏ2›ä  -”F•¯ïËÝ+O›MW65µ‰fÒuQÖÕ§8~ÇêÎo}ÛQ¯kèûâòê%ÍqDXùsÉÒçB§¾j6~—)ê5Ö2|¢I7žˆ[¿nιŽóVhC<ÿñh@ãf ¬¹M—÷E}çWÔ)kúô¹í»~멽õ•/ZR³Ã3Q.Go•ÉÄžç`ÒÝA´-vAò<÷_—á ØÜC‰yäaà¦èJfœvç×|xF.´çâ-ùµÖSgá™uZF¿þÛºø¸h›åûöÈ©µÉrÎL2]øH»‘kF?9]Õp0wû -^TUócoº°Knsu¬‹5ùËL`eÕ°rW–ö­ }a€¬0«U&%ØeÎ -Ë‘ cVäò]{äoüÀ\J~päÒe*‡xþóÎ;Ny UÎ3f{5ÔtNÿ™ÃGžé,Df¹Èøsø{°òrl‹ôõ£ˆ©…ÉÀD„L §Áä´ýdÊS9}3u®ÀNN1ÓÙfB»½oújEígðíëÚ/}Û€Yì€z‹À` :Ý}ä W\…Þºx‡Ze¦EF¡-‚i€³…b -ÔñãÀ,`Â<)%¬„jK)Fµ‘º$­±9Aìšq8rúú¶¯ˆrã—E"d {@j»ñËò7Æ„"iSUÇGÌÇYa¹‹}•©Zz x­¸L«r]vé¸+¤G¶^y²Xõ©¬ïh´ýÔv~M o.3¢^žó´£&š$®³õñ`⊭ïâR˜g ûpvRÌD% ±"E_uDX65Úã®ßžs GýqÍ×R›,q”ÝxØÓ)ήFéí2:Ŧk¶q6fÔíèP Æ0ùŽ‹x~l ¹€Ã.·M½öuGœÁ?`ð}’ðCMdM$·ýfƒN©X'Œkì<ðÖ¸b¿¾Á# JÜÎ3à$ªñÿ^F§ÎÿªéÂ1@ÁPµ ¶0TŠŽhñÐapÙõ¸%l<—kZ–S°Og ô&zsQaqäЧ*»®š ¢p¬õ|@©(RõÐòÔØ3…S 1Nç‰2OÀK³—sH|2Ï“Ú.Iù”G&(Æ<á ÅnõhÖQ£Á…°=u! -½…`yf•ÍÜ'øW(¦F¸ÂB«k‡Š«ódÆàSH꟪²¦Yå™™ê+×YJi°Ùôþ0Wg\¡Îêfê,—q({ãA®Ê­_‚Ý?%B•Ã (‡¦ËWY׌v{>¦$yÈò{êýã@2Zƒ H˜ù‚Ê2'场k@ÁÇZ:p·ä+ vC«`R – -¡#,×kº@§*ë@†Ø sîzªö[ IžÞôQÏÛ„ñ(ƒÚÅ -¥÷æJ`W3舅ß ‹áþÃbÄ1¾ïºð ûˆ×ë¥ßtÔ·V—ît@j3“›à.– ©†ätSÖ«S© -j½ËåtoÒøÙ×mE*ì]¨-½Žc#<>Ь&ÞÓ¸EÜÑæð©Óþ÷À¦ßböV2§÷’áF H”þR9\¯¯‹ÎÃõ—3–Ð(Hoô@„“×¾¨£Ôxé–æ±Ç@T0{ºÄe‚ï•8$s|ZÁ< nÊn¡á²ÂÞãq -GÏ.Ç^ eâN=íµÒ -;)PäP(aÏR•Ô¦A‘‰Œ[b@ÅVˆî:œe¤Ïp .Qn±ÙzI;wŸ ªÓ£_9°ÜÍònM¡>c˜8èÁ®lú–˜Ö‹Ô&3œP‡šëÊ¡8¢îqаøèÃâ ô·¾+ÊP^ !Ÿ{ÃáûNH¥'‹9™åÎ ÿñBi -âÏL _¹Tr •öt¥40…úph¨­3<™ˆ:Znà9^o4Îf6Ï÷×ûÙcÂ?‹ ×ä~ÛŽ×ã:>ªa;þž~÷±ìŽÎ6̓I‹Ÿ° 4v<'~¹"ž`–™Åd ù©Å–£ÅöÊBȘ̺ébÿ§Mnú²ŠMB½ð|ñ´Õân¬””³;aÉgÏþY÷ßTcżU$Ã_õB»p!•×Pj+ò9íÿ Ï'endstream +2040 0 obj << +/Length 2882 +/Filter /FlateDecode +>> +stream +xÚÅZmÛ6þ¾¿ÂÀ}8-P+|§„;°I¶ÁÍ^®Ùâ +´ý •µ»jdɵ¤lr¿þf8¤,Ù²Ý"-š+Š‡óòÌ2_0øωŽ™LÕ¦*ÖŒëE¾¾`‹G{sÁ=Í2-ÇT/ï.^|-í"S#ÌâîaÄ+‰Y’ðÅÝêÇèêÝ»ëÛ×7?\.…fÑËør©‹Þ^Ý~õ-õ½»LEtõæú=¼*% ¥HfXt{õöúõåÏwß\\ß âŒEæL¢,¿^üø3[¬@òo.X,ÓD/žá…ÅÔ“­>fuG  +Í=×}Õ•›Ê½z÷}ë«žOP7µ›"/Á}D±òà3±z)3ƒtu¶.æPl)S%÷°æ¹tùP»Ã ૱ÀI»b».ëÂw?ùFݯï]úW´¤Eù©gãñ¥¨;ê Ä|g7§ÙqJô,wàíÍõ”žiéWëëÌå ¤¡šÔ0Ùàxcvm· xâ.¾òe‰/u ûU~F°;±‰Œce(cîÒ»]G–Æ ró™pQÇ@åÂqs67Ͷ;ŒF'JŸ–+ÍÈ5­? m +³'Ø·eÛõ®t_ûb[?äÛÏ‚€µb‹;ªóiðÆ[Ù–3î8°¦Þ±*2PÏíH$ׂ³À1›jkc©RqÚ¦cªã6¨œMÀ3±M@'— D3KNJ[ÃÍtÉÿ^ZmËÎ+%”‰Øöe¢Sc—u`Ö2oOÔî\i@±+Ý›~Îp2"ÇpO|¡øTv +çàW)ÔÁZGØ4ý-é^&îÐy$árÀî1'Ž‹4/ß 3öj‡ ÝRõº4cµø„þ z4¤"¦Rã6~;R6 H¤d±–"¤ø_. ‡r~iDt} `*…N +Š§”k·øâ×…[!•D5j»Ýî´à:^ܬÅâu{ZŒ·8/ǬݾŒ›ŽjiÂ@‚õ@g' +$5›®$ÛZ\&Zge]}öã~¬ì.ÚŽÞ¨NµÑË›Û×4'¥ŽUq)YôñR訨È~ä´À >Ó$h õþº¹äÚÏ[ÍåPΪOYýèŠ5xq'^xfôxè»~[P{[TE¥6p=pW…éW‚£ŒâË|L&ПÌ-ww_KdçSe"8€‡äf'!l röþ|•¸Î>-Û&ÿpX*jµ3‹ñ‡Ù)PÍÈ7É#†Ãy:𪪚ç™ ÔbwÒc%”‰*Qa'áXÕ‡³W¿™âã$¯iK92§ZدõE,ŒnA€ªèڣ𨘕J’?¹Lce…ú¾;L9ÂØ8µFHð&<0rŸ™fNkV„óÒ•ƒÆïÜß[–7C[DoŽB¦„Úsk=d29¥&Çí#)OAæ˜õ È”Jø4ÓdšÐnŸš¾ZQÛá<ûº.ò¢m3<šÚAï"ŸÃ1x¡òó2¬ð¶Î~A +@­²sÓ<#ÓÑÔáÙR1…W ÃÀ,bâáEbIbK)±±7'©±9‚ìšq8ò”¹²0Z?ôõÜyæ¢ÉÜ°wT½Qmªêýøú8Ë-÷i9™\)/âžµ‚£WU®K,jPnÀ]).]¯ +ÒXõÙÝáhûjÛ5\½»‰©÷æ’G5Q%~má ãWl‹Î/…IpF±ÏO¨'ÅŒ+âAu*väMúxìáèý^~@õµÔ&M`Ž–o<5q¢þCÊ·Ô¨éï‰0ãXñÆ™Œ¥ågO·<FZ$rñÆ¥†b>åBñ6f}¢xã†ÅÊ$ɤxxS3*Þ¬/Þ,™ï)=8Ë/}‡i6z.»'j¡CÍ|*é Âe?ƒå\x¸C ¡¾B8çP óüi 9¸´L;ö¨è†z³uÁE/ôP„Ò÷BèÉÂHC7Ù"Z5E[ÿ½£î¢†|–û[ñ¶ÈûQ ê.ÊkQÞ´~Xí?°¤cA ûiþÓ‚/ýf” Êl¸†¢½þÄ4ð‡Ï( ÀE+²Ÿ³¦ÕØ0jkºÀ|[Q ã† Ý èzðÅ[Z¤" ,«â±ð“ݱÑbjͳ íŠÂÊ#ÐÝD`˜D¿deu<#ŽcõËÂÿ¯MˆÖÆ ¨3÷h +'®ðœsì6|´ÞñËð¡fïÂÇR½/º¾tA/Žd@[0Þž„û7ÝxºŸý€%$¸MUt”ùà}³õ~æ—ÄJÝ¥¡ÖVÜù  l –_ÃS TíÄNºk,2;OKõ2ήÂ?.R“ƒU”JÓi¤N$ò×ë‡÷Á ¿øë›#°!ã|ñ|v?b‚<öØ_†·5 ¼P¸°ñ¾èZ&±N„‘ýÿ$Áendstream endobj -2009 0 obj << +2039 0 obj << /Type /Page -/Contents 2010 0 R -/Resources 2008 0 R +/Contents 2040 0 R +/Resources 2038 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R +/Parent 2012 0 R >> endobj -2011 0 obj << -/D [2009 0 R /XYZ 85.0394 794.5015 null] +2041 0 obj << +/D [2039 0 R /XYZ 85.0394 794.5015 null] >> endobj -2008 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F21 702 0 R /F55 1025 0 R /F53 1017 0 R /F63 1053 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R /Im3 1162 0 R >> +2038 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F55 1035 0 R /F53 1027 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R /Im3 1172 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2014 0 obj << -/Length 1639 -/Filter /FlateDecode ->> -stream -xÚÅXKoÛ8¾ûWè(÷HìÉmu‘ºÙØÁ.Ðö Zt"¬-e-9iö×ïP¤Ù’Ý]`aÀ¢ÈáÌð›'E ?‰¤¦:ˆ5G,7#ÜÃÚÕˆxš¨!ŠºTo£³KiIe°Xux)„•"Á"ý¾E£1°Àál~ws>Ç<\\Œ#J9“áäææbv>ýÞb Ä8ü8™ÝM®ÝÜÍXÓpru1]|],Zµºª̬N>ÅA -'ø0ˆi%‚gxÁˆhMƒÍˆ †g¬™Yæ£ß[†Õzë\($(— -CŒ*6 A1!@s‚HÌh %C€5T°è»=èÙ¥JÀ0VZwK²L–&Zeksˆ ¡1¢´ê -î©×R èǺRE”i¹¯àu‘¤Î4iR%n´ÚŽ‰ -‹W½Ë$ÆHÆØêò$ˆ“²9e–W…ã^=7¨w»a±:XKÍ*Ù­+÷ò”™gë7è EÐdŒ5b’ÿ”×0Uû³ö (ÆH1}œ•Û†•ú ûŒ¢F·H2QÁºV!i!¨…IõbE©@‡eÖ<…䤶°‰iìñœŒ#IÃÛúÿ$œ¶c^õ’HChœYѸV&ø0Єn–¨;®ÿŠI=q6ݰༀ3ÝczÆQ—s}LI»ÎG’ ¸KÉ‘$®±xÈÊqÄDUVän¼îÊʽå…|3î¹+Mj3‹‚#û¥–K¾~ñ£•_É+³5Ž— ­ ÚÙ·ÓÙ¹i÷H͘Ÿ©ͺx4ÛÒh½¡µ¨›ä6TbnKþâ^¬^ö¹5›bL„çâ)‹­{.’ü¾™Ìr÷LÜcµ«vÛ–ÉÚ$¥±|zÞÎ¥FTit=ê—|”óI Ù6zM’¿?ûnO¨TÝdÙqû&[ -ͬ?°àùôj6¹ž$°†¹¨ §A*C—¨vU–7am—XWzevŸ'ëÒ-–Ånmm@½[ÙÉo~§u+7ª<—E^9k·Çe'XÉ“)ÍöÉlóºv ƒ„SÅ}¤nót9p"JH6™ôUµ¾FÖ‹ËÊ$iÏ#šÊ$˜•|O–¯.ÕñòÕRyƒ¼¿»9«c„5!§Å6Db÷ª¦Ç”ï˽,jà—¾øºTÏA|6«W5œMlOr*#†ô¯Pu¨N@ÕPy¨¦³…-Soœ20±¸¸ýØ+êò¼ŠùiMZªUöà¶%Dã¾.;_:Óâ9? XŠCÐ…¸ÐħfÓ½l‹qziò4Ëï½ò¿ -b¶ž  =+½Ö¢gžh—§æ Æ47ÎÕs$&‘Š†ï>Í.§Ww·‹ùbúiöã´aÕW¢ÁœV]$ÚØNX1Ž0‘´é|ŠÜjz¿sÙªf¡YÛ*…¹+I0W…,‹ÍãÚ|w«•ŸLM¹Üfßš=y3[%ÙÚ-œÖPñxŒmÙ·”ŽYeº\_qÂyøèÒWäì =nl»[Òž²ÔøhÊ:ŽRêEÇçâ’0|W@-µvIºÉò¬¬ŽÂ[õÖ¬¼îyÇ“|—¬À%RÙf±É†ƒÖ‡L ±Þó‚ËéõÀeÂÇ1cÅ®õQ_\ „zCdEž™jyV» 7Xõ\"h6â“Ò[¢žøƒð&ˆ1µ'~1Ø#÷ÒN:‡<š ™m›û>ª5T5BOÉöl»ËJ«Ç,=T„bh"ק5i©úªìWT,a’íë2 —Œ¥)Ë(K{hõ|pÈœñ=ß›_\xï¿žˆ™ƒìs{ùnC¸ß² àp·â²ÉCoÚû:#ž ËŽÿ·ìÄO°³P—,#¸Æ-ÿ²¡ð ¬àô—ÿ)rs¸l;£Ã¹õ³/8é 3Ôˆn¥¨ˆ0(‰\$ºÿ%cµD]¯™Ü-Þºý™®.¹ñ;pã å»"/‹m•í6¯b9b\6e’CSE9m¿Ù€e1Æa^îášošË ƒ¤î:ï€{D% Môgumlö»xÖÔÎ_À8ÙÒ¿Ì澜wh¡E_gÕ˱¯>µ"ƒ__p è/zýòÅ¡WRêÈwè…l–Röà„ò~ň2@¼¯û¿C¤•endstream +2044 0 obj << +/Length 2113 +/Filter /FlateDecode +>> +stream +xÚµÛrÛ¸õÝ_Á·R3Œbúä4Ž«GI¥íÌî>Ð"dsV"µ"i;¿ç LJ”ÜmÚñŒœû 4‹(ü±(QDn"m$I(K¢åæ‚F°wsÁδCšö±Þ/..? +bWÑbÕ£•š¦,Zä?Çï‰! @ãùÕ§ë“)—R¨øêË—ëù‡Ù¿á=¡€(”ÆŸ®æß®n=ìËÄðøêæúëä×ÅO׋½8}‘(Ëï?ÿJ£$ÿé‚aÒ$z†J˜1<Ú\ÈDD +ÑAÖ_/þ±'ØÛuGÇL yJ”PV)á hülEê ‘Ž³¥Ñ”1EDš°ÓÄüA +ÄÂrdHlš2’“DSÅ Iæ{q‡ˆIŽNJ5á:å‘‚Pæhb‡hH¢$Cœ@9ó¡l¹a[TÒ8ˆ–•¹_Ô¶éNUS¯0µLÔP㥭AM¬;[WíniñMÇëbS4õBI™‰¿•+´Cǯ-³Æ®¿CÐø€tv)jxc³2Pm³¦[Ù q9AStž¶#fÁ줜”jÛUéiV%ˆà´ã¢ŽQÝiç å3Fiå ÷º“›øùÑ–#Q P2#ߎZ‘ò.¶‹@Ò3h19xW¥‡°ßä„–z ak0åÃû)ßÃG ˆ1ÓíÎ +¯¹a$¥œÝêHP6$Mu\%zÌ ‘áû©¨ÚÚ#ð мÈý²j<²©ÂÈxö¯ÇI@¼pèÞú÷m²¢ta‹V(Öq4СÅmq6c Ë@gÁä°ŠJeOMõ ø6Õ^è‘Ó×ÖöcMkŠÂ¥fAHÑ n*<±}3b#ÃË¥ÕÓ¡e”iTÔ'vIJCaÙOm°¼³P›?v¸Š‰‹'»«]òâKÙnî}´Q_¸pa_ŠæÈê pÒ”‰óöéc¶ÏËÙçŸGöÑD+Ø=˲Ca9°^®†,ÿKûÜ·Å:,}!¬ßý) Š”&Þˆ°>Ö vX΂/>;“¤_¸Aßæ'ŸËlùh§+¨‡Ò1m24>+ÞkD>1hºPd…QCo«,(Ϛ̯V» ƒz½ ¢Ä´ÒRŠ~ÀO;¥:-‹KßÀ«îtðÙê`/·«¬]‡8x*ì3NèGîëÑ„Â]A0ý?”µ†9Íü‰Šœ’!Ä10ôC²„†Å¸/ÿ’žæÝ`xåÆã;÷;wól¿æñÍ©±YÂjŒÔal¦Ä0¸"9¤þúÄØ,ÎŒÍ}ÊgÆf s eÆ! 7‰Dï‡\oÜ]7þÍwWX¸Ž O‰s¼Â¥ rØÚSÁ±Ç¯Va§„†j=-å›/@ßÏæüÊøGî[þ¼]W[¨6n†8h»¾”è4ÞdˆþÝ¿ \øÜÙëþžJÀÄyŸ8‡?tÀ¢ôÏÌ?VmÓîöDÖ6«­Ÿ/O5í~@ýPˆþZö 깑¼_+{QßK˜a¾L½¿ÎnæW·_Gj x/ÅPÂâ -Èa6wuªm`‚òô]†¡„Õ_0˜ëÊ '6ܬ«Ö5  +÷á$†•_¹:ÏeU6žÁÚŸñÅ vp +®íºÒ_ƒ¬ý>  kžv#ó®Ì—#qh~PÒ«hÇa×Íò“ÝKpFÔÉùîÕÇ:ݽöXÁ!ÿöå­Ñ„ÆγíFØšå„j¸ûø~¬œá—¡„¶ä`Ÿ]Ã:jÞ'-㓦‚"ôAéç´™N0Òl¾ÀþF,®ï>us¸ÆšTËs2ìqŽ„-b­ ûR<¶¡[æÕsyÞ0à M'ÁÉš)¸åØö ]ïûogèÚ–yQ>tƒÕ÷° lÂ8öšnȽ—­‹€Ô–¹ý…R^ZÞ‡u_ +"5øEüÛçùÇÙÍ·»+4÷böyþv­Xt÷ë™?š‘1RBB³RÝg +((êCëK ^ÙDŒµ»ÌI߇ÖT•_,«Ívm_ün€¹­—»â¾;SvP¸®ýí‰ øb¯GLO¬±}*ÛWA.OÖA°=ƒhyãFýŠtÚD’³ÐS¶»Üµ¥·R°Õ¶È¥à ƒ+ôY1öHGr )M`W‰ ㆠ+©ßö¦E~ÞN];„£µšîãô‡ÿ)ðúO© Xü„¦šƒu +e\»˜Â=ªÖ±ìÂkè±endstream endobj -2013 0 obj << +2043 0 obj << /Type /Page -/Contents 2014 0 R -/Resources 2012 0 R +/Contents 2044 0 R +/Resources 2042 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R +/Parent 2012 0 R >> endobj -2015 0 obj << -/D [2013 0 R /XYZ 56.6929 794.5015 null] +2045 0 obj << +/D [2043 0 R /XYZ 56.6929 794.5015 null] >> endobj -2016 0 obj << -/D [2013 0 R /XYZ 56.6929 586.3808 null] +2046 0 obj << +/D [2043 0 R /XYZ 56.6929 374.0222 null] >> endobj -2017 0 obj << -/D [2013 0 R /XYZ 56.6929 444.5078 null] +2047 0 obj << +/D [2043 0 R /XYZ 56.6929 216.7302 null] >> endobj -2018 0 obj << -/D [2013 0 R /XYZ 56.6929 369.9671 null] +2048 0 obj << +/D [2043 0 R /XYZ 56.6929 132.6902 null] >> endobj -2019 0 obj << -/D [2013 0 R /XYZ 56.6929 265.0122 null] +2042 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F41 935 0 R /F21 710 0 R /F55 1035 0 R /F53 1027 0 R /F39 895 0 R /F48 950 0 R >> +/XObject << /Im2 1049 0 R /Im3 1172 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -2020 0 obj << -/D [2013 0 R /XYZ 56.6929 190.4715 null] +2051 0 obj << +/Length 3048 +/Filter /FlateDecode +>> +stream +xÚ­ZÝsÛ6÷_¡·“§K|ûæÆnê¦q|‘3½»4”H[œH¤*Röùzýßo»à—áÄ7wãsñµX,v»$f!ü‰™‰‚P¥z–¤:ˆBÍÖ»“pvm¯O÷Y¸N‹a¯nN¾ûQ%³4HcÏnn¼L#f7ùÇùÙõõÅÕùåßN2 +ç?§‹( çoÏ®>œýBuק©œŸ½¾XBQjC'b¿8œ_-?\ŸŸ&z~sqúéæç“‹›N¬¡è"T(Óï'?…³VðóI¨ÔD³(„HS9ÛèH‘VÊÕlO–'íZíPŸ*"e‚ÈÈÄ£ )fBiÉ‘2¢4ˆ•TVË‹ ZóÙ/Ëw¸Ð`:Ð`8ƒVXL(m÷÷?¾:]ˆ4œÃòuF}w±Ž ÃÞßz¢ˆJp‡!;ýÿe½€ÝB†r^e»"_¬7Åúóº®n £ÐÀ?ñ´ù_uUL›U¾žÖm§ÂÌ‹&÷2 Ü4µ<]ÔB¨0Huåöþáòêœ6+å=ËweU6í!këU½/n š½ZTõ6«ŽÙÖ£›@Æ0 é#à.#£Yt* +tÂfsöáæ§wï=<'örYµÅ¡*Z’dùØ´Å®¡Â«ºjêC[wý¼:P:–ÌwKF-XÂÖ†à¨UsÜçY[à(ì¦t`D”ØnW ßg„2Q†„ê8X9~“2!êüö§\sájIÄ°ï±-·eûèST8VÐò±ª÷MÙL!"?Wà¬:MIísi’ËHí…¾0#€²Å…uw-<Ð×õ¯<M~\äŸuÞQwDü›>‹z\äµG#;‚)d xGvôq³ËÖßú\ :‹ï›b}°ÃF +%Ày;wt3|öÌ ÓÀ˜$åžÀù¶Ü–ZFwpÐ-©õ°\¨$ +¢Ð’}Œ‚C[îŠúؾœ÷Ñà ÁÄ`¹Ôõ˜ïŸç +Xœ$‘™r=¼„+¨õPͳ\Ó)×÷_åzȪ¼Þ厩âŒ}ÂôÞQ¸'¸ãŸ¼8¢´!¨¹ÉùÅòÕûËë›ËwWݨgÁdèùSd‡€«µfÙJ„îÚ9QmMßæ¸Ú•-ѽ» çî@|pî4éïÇ¢i™cÆßA(+Ǿ¬è H +çÌ胪a!ŠÃ=€4¤SÈ4™ßl(À§y#Ü϶Ûú'Ž‹ÔÔGKXˆïj×µý涫¦ù¡qŲ<·òi£t¡q»úÞ5ÜÚšzÇ#èƒqú?”ííØVïl\Ù>R©È˶¬î¨Ðnx€ªæ¨¯m V¸x—ÙÀðmñt»@ë¬b¢®Ú¬¬žtãc_X8.Hö˦òŽÇ¥vãø“ðÝ€‘Ö»Z§õ [äš:Líšþ,@%-Û–¨Ì͆…c•ƒ-X2w‰\mÆ–*îËÌã"Â@2'ºþ%‰©Cç¾5Ï™Ñçü§W×D±q ›½Í‰®j–~Å‚ã†ܸz¤/hŽõ°—#@÷¼r.bÕ‡ ·‘vÞS0U®y³ÑäˆÊ‡á™–ÉÃaVgàòÜ;k³±¬¸e[7­w³nÐjU”z¶»¯8Vò®Õï*XVr‡Îù°Íª¾ãÇ·v©O·X…äšX¿h‹c™:Øßd÷, j¿+.£Ëð\ÑpÞ„àRÄjìšèÆèºa fçbZö‹–Z€éT-U[•ãwÃMÈà/,HA Z¶0w9{uöö‚HÛÏÚt¨oGbH'Æ|È0—ïÎ^ìÔh'žtIåq‘ûntAábm iA;¡²Ï.ö>VAœ&æE[¯”éY‹ŸÈ»ä9òbu¼ãéê÷3Ò)++÷7÷ p®ƒÅÚb:±¹­»Œe–`ð+ +lÇ ›/\â$€=ƒæM‡·ìëÙ†wY^LÜ›ö±c²ß–x׊’"Ô "Ùp$Gáh…ÿ›Mq—ˆ.Î}›¬­»ŒÎm2­è™M–ã¼È¿´t¬Y p†êÂ\‰“9|µû}G19šìã¢o +ÒÜðËfÌ[;86b~ã¹$qZ4¤ÅS8CRÙdk6œp¢¼«²öÈ(Ku6¦#a1 +¾”»!eÑ ¾Ùv `M–2 Ñ¥r¶€©œeA1 =Q +7´éyOÜ,/_ûrO$Hô#¨®}Üs+¸ÏúP® +n°î—(›Q¥8jÃ`~¼ñJàùI¼¬5²V‘bÖÖ[¸V¦Jø–e§‡¤ìõr¹°K·%LnU,G³@µ%¶ P1à ¤ûˆ!„½EÒºL‚ÛÁÇ=:gÁì‹j}xthål{W âï¨x[sH$ÅbE@5ÿéíÙ«Ew>°¢vóíyd¥0ó‡M¹Æl ö‡›ÑIŠ6[†¯½*C$Ú..¿£+#¨¬a9";1™ß â?aÎk0v ß’Ù`z} +î‹Ko¨ò¡Ün©gU¹ÏBmaRÐZsìf4õüH-M±-l’h8‘A"ÛÃLÈö‡’¢Ö”ņ¾…•øºšŽÓgšuZT<ª BU”/³ +7Ngd*Z&óëƒ/Ñ(«¦Í@Ñ R6DzÍVxì4&E‚œ8Œút*a`[ì@‚†Êì.ÐmÅ \šj?¼K±îŠïŠvý])éñ•TBÒ]45ó&Ÿ…‰ À ªêSÈ$ ^ZOw¼‘j{$²¦©×´KX´Ì ¡ÑŒ÷[‡Àe«,Ë•e‰~—±HG‡ãËkî™ç í U`ª8è 2 U<Ù0…NŸ­’6DÌv”ÝøJ €dÄjhHue Ì4رRÚW[Þ€&ÂÂI}wÈö‚"ftƒ¯uÇ‚§¤ÏÓIã˜RªËä&Vë@8"Ïbwl8ß_1ø5mÝa½E0‡uôysñwê?mž¾|sà@˜;­ŸÁj5Í禇(âÙ(zQ’¥áîùòº`¶`$Hø,÷¸äøòN.î¿îfxŠ•éR*Øšp퉷qÉî›â°¢KþÚŸYëhTÙ¶ñ)`á¦e¹_»/Ð.d[”]®?Y¹J 0àÒÆGÿéGè$î/ <Ù§ ¢8qºwWÁ_ââÎP’ÎùJŠá9¦—ضŒR{×1HE ƒ‘k#náü®¨ÜY +zðu »2T<ÉÒ õ–‘!dDû}éIIÓÁ]$ì]$ݹ)MGç&;DßÛì¸m©òO¤lº9ơȸ¼[H[ ú@…ݱ¥»<¼ÿ\oÆîí @"æ¿žFÑœne’çÌÁÀÂE˜~q#5F"1ÚÈo½ž æª_v:J´£ÓQf/CwL‘ ÈDŒlÛçÆá0º¾ô=~à‹Ž”Ú÷61oô~€ÙQArQ7<#ˆä.ƒ•‘A*ä$u¿E#“Ψ%ZÛÎw[¯‚ؤQÞüìÿ ¾Q|ó]óÿ@x½÷+S` {DŠdls;é¦D¨Ç .*³¶°.4Nöò 57vv-#íÑeQ`”NÆþÓ‹‘ȃ¥ø¬”¸×( +RÊ€ïnmúb(\aÍžsðF<$Bó«Mö°Ío×"ÀÜ×p.‰ÔôyÚ›˜϶ &-´39;‹€rÛÙ'ݲ⫠+>ߌlä£ï'P¢ÛNûBçݾ³õQ_á2~áã· ®ôéEÅ kwµàiÈÅÎú{o'ÜT ’)R›ðy> endobj -678 0 obj << -/D [2013 0 R /XYZ 56.6929 151.8306 null] +2052 0 obj << +/D [2050 0 R /XYZ 85.0394 794.5015 null] >> endobj -2021 0 obj << -/D [2013 0 R /XYZ 56.6929 115.5088 null] +2053 0 obj << +/D [2050 0 R /XYZ 85.0394 752.3578 null] >> endobj -2022 0 obj << -/D [2013 0 R /XYZ 56.6929 83.5219 null] +2054 0 obj << +/D [2050 0 R /XYZ 85.0394 679.8301 null] >> endobj -2012 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F53 1017 0 R /F62 1050 0 R /F39 885 0 R /F48 940 0 R >> -/XObject << /Im3 1162 0 R >> -/ProcSet [ /PDF /Text ] +686 0 obj << +/D [2050 0 R /XYZ 85.0394 642.5879 null] >> endobj -2025 0 obj << -/Length 3855 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿Âo•§ƒ$ûæÆI›ë%õÅÎô®i(‘¶9‘HW¤ìº½þ÷ÛÅ.@‚¦gn4#‚øX,ö{”Ç~ò8K"¡óø8Íã(29^oÄñ5Œýp$yÎÒMZŽg}yôü•Nó(7Ê_^`e‘È2y|Y~XœžŸ¿|{öúß'K•ˆÅ÷ÑÉ2bñæôíûÓRßùI®§?¼¼€Wk“¤ÀyF,Þ^¼??;=IãÅåË“—ÿ8zyéÑ£.…Fœ~?úðQ—p‚‰HçYr|/"’y®Ž·Gq¢£$ÖÚõlŽ.ŽþåŽFíÒ9R$:‹’L¥3´PòXÊ(O#É#£•¶Ä¸xhÚÛ®î¦G1€ ©ÖQjÐÌÖ­’Ú³,‘H€äË1‹V,çXäf!VM·¿-‹¾:Y`͇eùѵÎ|ëQ~þ*Ñ#`R§QœÅˆ‚ùp³-Öß}üT=4Ŷú®«Ö»ª§eRK œÉyÙi‹å§™TeYêfä«zSÍ€Œe”ÅZòiæø1¨~ì%k©¤X컪¤VßÒ³Û¯¶uOí3”ÏzÍ/o/¨ñžUÛ»™-ªß÷U×3Ä‚Ÿeõ›ªqà놞ï^½PR›pÏ‚HF¢ÚÝU;4f`ÝTž..oÈ/Ý9X€H/‹Í¦½Çf”ºvoëjÜ»ní³´ScÚW<©(K‹/4a¢Bë¶í¸²=í–WÐã϶©hþ}Ýß ÛîmÑìµz«Êº¯›kzéox[ªH¯MÖ`êOíiE¨',ßTä œ!Âöˆ Ô±.n´M_ÔÍ£iõXÀN {l?Mï["¿õ7>!ïT÷½Žê‘?xCâý+@d´²P{jn3|Ù7%ˆ‚m–NñF¼ØPÇ]]ÌhˆÌÀ«HcXð?§!I¤bá´·å= zœýøâœZ,›Ô^oJj7-c¿bÄ‘ß®è „c2,•Ž£,1YÈâ7Vdˆz s|´û0KARt½f^£ÄQË“g^»:ÁçÙE_„R°â‘MÛõs¼ºD™ÕI>Ãì¡w¤bØÉL…ÖÀTxaTI9´NõpÌRÞÃcÕÃ{ÒÇÖ‹ÌÄOâ°Q¹s%7ÅcƒÀçŠßQayîèÐ2Y®nFJš‰C%FÅéâÝ `±­b ’ÓôÔm)ŽÏBßðšmÑõ(`Ø !‚·†ÐÑS.êÀÖh<¬‰‚6aèjñæíé›—Ô´ó¬(Á„ö*@C94ÓCöâçÓ§ª4ŠÉL,ƒMíÔpYΰG¢Jçh[ˆ Zd„óS|r^<`½Ñ‘ÉÓìIœ×:@W;k<vÍ{”ÕjÍÛµ%²3‰s¦7vÞ’±¹zsO¿+ÖÖ ˜«v·-gò¾²~ÀN¼aéÏ…GŒ'áϼ)ï¼±eM/Æ6x[”ÕD¹‰Èí¦vúÏL«jrcÐ3rcã•ì‚“Ð¥ñAèòlŽÇqÇ>îr<¦ూœåIÚ f V4Ó ÝõÞÅÕ¸™3®–Ý×ä“ ûØ(ÎPC¬+>/ÅÌYšÂÆ^dzŽ4$âI.0žìŠ5‹MF¢¾nŠ~Ï&–ú¬;dž5P𤰠[ÖtÁ³ØÁ¬I®sÖ~lø(ξ`gA1‡ ùÙ °'./^ÿ0ŽÌ¹31Ô×?Üò((ÏzW¯* KklX˜Å ½0Îüšìÿ›€dþäáMƒÖ‰¶ SÒ·aéÕœ­³ç]J89mCz$s w¨¿ GwÃ*YÒ0&rö½§qR]šIœ€ Ó“ÌN|~jÚû†Ø* ¥"}J £áNöìa¥ã$B'õ¶…¶X¼Øï÷¦ô¤”‹g0 ô`¼´‘Ir -;†ÌáÕˆán³Þ=°~ã{±¹nwàÁ·ø/®ËØ鶴­GÃçoN_,ßœ%dqS¯o£äÂvóÀTj@ÛsÉÅÏͺ¢[8ÉnNŽ=fh-Ó±ÓNƒ­pÌ¢ýˆö3ž ¦vmmGGƒ÷õfCcME+5ù|è©€}ã «éªMe£ºÔåœLõí®&/‘Ži9#¾˜ic÷"¡Mê{H¡ ãSõÀsÀhPkd@ȧÁ´ª@Âã(ÑŽ¤d`ñÊê(L©›®/€ÄÏÐT$ u_¬6­âmœÚAž¡öÕöìæ˜rϯ&5Á§KÏ´š·ÎYå:sÒÿ¼ê×ÏQàËBæ«eÉa;“òô®¥MØÝj>Áfìµ×Û¦ Ñêºvͼ–ÉÎi˜œ„$¢Ð 5QŽÅƒP4­oùX{0Aæ _pŒŠ×çœL—%æŽl”çgÂŒ54‰"ÜAvݬ¢w{X!Sµ€ü%t‘ÖZ#ÁiÎ׋=#£àd;˜ÛýjcsÐP+/Øi-G{½+noÈXHúÑcªEKs(‘U½‡N{2 v„Îl™¸-ãÅvo“gèZñ´®o½uÇ6†~Þ輪ÿ¡þ©/ÂÁaîŒhÿé³f+O‘Ù¨ýI±Ø4ÃÅ’Hö$ïDHeëÂC›ºqbQÎ(„aà²'+¦ÝF§ã0h‚7E"ŠS‘AÑ—ôØ—÷º¡p0Œê<Ší.T{˜O8dì ×îæ">˜¥®¸éJ¯ŸƒâÒE‰µVrœ: Û‘qAÅ…Á<à8º7FÐÄâºj\ú¢¤«O>bÇ£ÐF¯èl@h•F‰N'éëÔöCŽ<ªýá‹­ýAç*y¤*¨b ieuUì7=SЇ-çÐQ‹“Ì›8BÔêèeð»ð²Ý÷T;›±Õë Ø¢;›s§rñËI*g-bzH28¸ùgG&ö¼&ÔžÍâH ¥ÔÏë[Ç2ÈH -[|Lž§"•ÊÐE¤Aª6^Få¹Ë¼#Q*ž» Ñ -÷6˜Áh«íx6@€’+¾‚wr9ñQè_´RN¨mŒ´«ŽC²žå΂üô‚ÿ;úV&iôí_TVÿ;_y7OL™æ‘ ½EY&Êp ›BžöKJôÎÔî@ºP8c1à7¦\¨ì±Š2™Æs(2Ò$Êtœ†Ðgw>µ…xJG`ÉÓè twƒQ•»ÌYŠ -+E˜™‰xñ Eh™< ×2‘‘^Ù¹4ÑÓ¤aÚâì %)–ÖâH‡Ž'Ko€JZëå“Êš±µåI¨±æîU"-=;íØ êö^k¸¦ù”ðFc‹6€«OçÝ¥Jrt!ac()‡j[(™Û8mF%ämJ9 ßóxè›ê«¢«LLUµËÀ{t‚uO±Þx{‚:ü{o3|®ÿ9͘±˜ ëÞ­’+=5˜ÑŠ -ìPÖݺÝïŠk+,1Ö˜¹­]{7‡&p SL^–Mkb*ÑÃàºÝn)Ñ€¾MÝpÚšg`6ÀÊ…Ï‚¿Þo)V)Elð\oª#|•-úêÞ–]•+»Âø¶x ÑÕ‰´¾ -šwuWÛ¤g ˆØvßßÚ!˜9²å0rÛaÄ*9bÅ©»1ŒÌ†šðJ¶í^Øz12µ½ß±ï+ÆÍåì£nØÂÈo8ðën GüªúžH¼?äCµN]ØGÄÒ9[:lQ2—»›Ç˜¯ §»­Öõ•[@IP=°tî„50=1Ú1zÄè0ˆ±¼6‹× k˜–Èz˜Ä)ˆúÓâ5‰£ðû³sjX‚ÚhÔ¦ŸjtÛ¨•¨ý|g•F·eH³¡¤”"`>ÎõYH¼õ†5´ -1B’ö¬×àTÍÄÔ‘Þ°ôøå“ R•û‰\[ÂÉÈOê¼|ÁË8VNjé¾ÜŠ‰> " -\J*¹›×==­Ã6kà22¹ÖOâ¬ÖF¬ èá9[S­)_çk-åY–N -¡^ØI‘Gw„¨\A °rWÒTL²ÂÍ“‹~Íw“Ö¾¶îB-Á˯3KÊ×}–ý³$ÌÔS³@@íæÚ¸ÂÝÿ¨·û-÷Ö[î.xÅ`>ÌD° cífõÀJj­ª«áöÞkžj«¼(ª)[ŸK‡ÅKù¹f¡…Œ“ž~Gn³mJkÇ Tøµ"g3ù$ÀqíçèþœõÀLoÓøËœ¯`G†AH÷óìBÄSvˆÄ±C8v@i148$°ŽP`¥ãRl"*µáĘp8©£§và…T–þŠzÿdJÙ`.vv;\Wã -D_xîÉ}þ{6÷¹ß=ùmÆ×yÍ~»ªv¡ú-¼îد›¾JQTª|H·›çL’ˆi1Cá8cœ™7# ß%‡¡‘!†6@#™q™À°ÎC§æY–)ð>f -~ÓÐw4’¿91#[âwsŠh|õÒØò±S™LéIòúÕ–Ff¾†0÷±˜„P¿OœýX, 4ä”änBÕ(x訣àþàëÅB¡x—|«Õü”H˜¸{}œi/¼ù²=t}µ¥¶«*š¨ \E®Vf&× 3ôI!®p²óŽýœP›9½É"!39úØãW` ¤ÿÊ3”»ÚÞ- …uÛëÄ–DÁúŠ& D᚟a­ÚÂ×ja&Äx³…›UÅÍϱs©ó> endobj -2026 0 obj << -/D [2024 0 R /XYZ 85.0394 794.5015 null] +2056 0 obj << +/D [2050 0 R /XYZ 85.0394 575.5077 null] >> endobj -2027 0 obj << -/D [2024 0 R /XYZ 85.0394 749.1471 null] +2057 0 obj << +/D [2050 0 R /XYZ 85.0394 512.0134 null] >> endobj -2028 0 obj << -/D [2024 0 R /XYZ 85.0394 677.0612 null] +2058 0 obj << +/D [2050 0 R /XYZ 85.0394 442.4505 null] >> endobj -2023 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F53 1017 0 R /F23 726 0 R >> +2049 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F39 895 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2031 0 obj << -/Length 3132 +2062 0 obj << +/Length 3460 /Filter /FlateDecode >> stream -xÚÅ]sã¶ñÝ¿Bo•gÎ >I oÎÄÉ\§ç\Ͼig’{ $êÌž$*"uç×w € EÉ—¤ÓŽgLp±X,ö{Añƒ?>Óy–[ag…U™f\Ï–Û+6ûs?\qsnR¬o¯¾ù^3›Ù\ä³ÇuBËdÌ>{\ý4ÿ6ã,»l~ÿðþíw·×…š?Þ]ß¡d>¿}ûöîþ»×ÿ‚wÍ0›¿¹½ûw‚½½¶b~ûÃÝÃõ‡Ç¿]Ý=F¶RÖ9“ÈÓ/W?}`³œàoW,“ÖèÙxa·V̶WJËL+)dsõpõH0™uK'E§2²rJÚf¹„)”ÅãSgbjÞî«e]nðEÏ?—›c…‡ûæ{ÅE‘‰V2·öSõ¼hÊÊ{)›](XïVõ²ìª–¶êžÊŽöñ®¹™¯h®Þí~²}jŽ^x.mµ…«óº%ÄfßÕÍŽ¶å3é¹~fLTŽÏÙ Eƹ-`Ä3«µp,n›®Þo*RpWo«6óçⳈ¸†ÝH8¦•Æ-{}ÿöý#­ùþÇwonÑ0ãº^° ¶eF[·l×÷+È”äT&„.¼äœhªr…'…Q ×nªÙ ’(t¦-÷Öõ¦Ú•ÛjZIÖª Íæ@„ۮܭz„]AêÜà®\>tÙl·€éQ<ƒp®ý¦®<Ô)ðk¹ì6¨nXtSï*¯’Ì…ó òÒf ; -w×BÏ8ˆƒúÝ[z#vÝŸ¯ñ$ºÚÖ»ºíeWöëöÇþiQ¹Ž 3„7ÝSuh‰@BMÌ«ghì•æÙÂ×f~\¢ñµî lhSŽÎç{¢Gÿ9Ömíˆp6_>UËO-a¡°ðÙ=…Éf×U».L¯GÓ¿ á --î©j+šN)¶U)­jbÓÓ(;Bg#´Ó¡_>u*`DäÒ›fÛÝ`‰JÍ•‡.²Ÿ–Pfš½{ô`À ÄêÆ¿‚’ZZßxXí—–‹d@sÑäÝŒ¼ $ø BÓ3ãûöØz2 ±­:¿×š&âàÀdˆ°,BX­ÇA§•#n=ßðìz¶Çå²r1KI;ï–z”/õfC£Å€Ú¿«eç<ÈzÖl8,* &§ giL¨t]Ö›,NXH5 `âîsu·•EÞÛ~Q O“@¾%â´3UxþV]sÄ¡9Ë‚‰m=  S\{J.¾ Îo4Ýø MéžCôìÜXŸ‘ͦù2yîè¨îÊÅÆ,îò•cÂZBv1>;i'è j›õš¼áFI.Jˆ¥>„ N|Qû ÷ªÈ5p àNXî¶nÛz÷LÀ˜Ô{àl!Œ@0¼%ÈbSî>Ñ0ä㣵¡7;ÓódN³"“*Ï}f6§j¡2¥l¨|@÷H/KHöíˆÛr¹Šr™DQ®‚ÀpXîhAå_&V4 “Fœå4¹;‚.ž æ;GØêÖv*¹Ë=. Î‡#bÈÒ1Çs®Ïãx&È¢¢'z(¥BV~òs§iwIE3Ìõu«£OèíKzG1äÖíš~ÊC¼Ÿã¸£;Äà¸" IŽÆ>/¸º«­?îb)y6L@iüÜ…f)Öù0±B&¤íq"ù 4¼¹3—YH, 8ŒP µQj®áŽYúj -¹î-_úÒ‘›´7×`«ÁLÈ5€â;-$‡òD„ž#ÄØ (Y‘„ íSPîRÐm›Á›žv­BuÔccŒÆI;44—[ U})²€Î¹ˆÝÔå»C+cÙé 6(;`fßÑ˪‚jeë»9Z+;¨ºÀ[â4ôŒ±Æ‹²¥ÌÒ5_Jʇ'OÇ¥T?MIñŒéQN÷×|ç\‡ËŒ©^pë‚ë,¸6eHªnxÖyDa/s±&Ø8qfÅç>®´<[¹8þ2º­{íË”IsåRfÖê`¯tÄSkÁ¼W˜|PO~}•®n'™€V\ë`Œ¯ï'8úžxFùÂ@‚—:¿¬üë¼ò#–»è6¡YÅ ²öDñ r5ã—H ÏÊ ‘Ѐƒ^í¡ÅÄA/h„Ö[vnÏ»ÍÆÔbľ5½vMð~=äæäëIuò©góŒêÓûîLÈÓ ?1 7@r¹©ÊÙ#ù’ËBŸ>®êAçM@B1*Å vŠuÁ–ÿ†uzm³<ÐÕ÷0ØŒ[ö+k‚—¡w(¨ùˆ™a5,äPŠmÃ’jÒëão¢Œ¿ç‚çãÃën°2¡8Ý߆õ÷vCk ÈÆKVÀK/˜ñi   ÁB¾/ëäÖëF1 –ÏFUÖãäÍ!ñå…é˜Ú ÈY#‡÷†¾ú‚Föi4^ŸyåF-n`©^¹=é £Ïu9ñ=}Y«ØIßL²‹×œñ‚§9L¹˜<†Ê›O5Fœ‹¬-½:éûäSé_âÓ‘šC2k;¹‚˜[9iPãï6¯|ƒ©Yf¬(&>¢¦ -í ¿}œ×¾/),Aý Öý¬SÏ>Úª;Õ?Ý:¹šïCÏð‰Y`^gyq™Ùˆ5Áíø]3ävhÐô…)ýEäS_¦#4¹ÛXüò,é;Ñó F¿9é7-^…ˆÄ1>Tâœ×~5u墠qä*çCùº¢½ÜM±†™ PþŽØ£“f˜º‹ ª*+”ÊÿPSÑlkhACC½€{¢ÛÕ;èFwñ—É+Ð?n/\ºâo‘ŠüHλC@: ‡Ò ÈÖ9H§¬}A‚ôœÒnÅúo’½_(üçË-u‹Ú».EWÀ9ç -8xÁú¾øï¹ÿߺ‚É ä„"Öÿ^DûÄÉ30YýÿwŒp¿¡3üÅà„µ±XFþé&ö?ÀTømölr/ EÄÞž)<;ù©OûŸ0žòþ -¦ˆæendstream +xÚ¥ZYsÜ6~ׯÐÛRUMIì›+^§ÖŽ×’+[›äCr,®‡ädȱ-ÿúíF7Àc8²][)‡`£G_”¸Œà?q©“01Ò\¦&u$ôeÑ\D—ïaîÅ…`žkÇt=åúñþâÙÏ*½4¡Idry¿¬•…Q–‰Ëûò÷àÇPDá,¯ïÞ½y~s•ÆÁýíÕµ”±J‚›7on_?ùox×0g¯n^¿»ù'ÑÞ\ܼ¸½»úóþ—‹Û{¬éÑE¤ðL]üþgtY ~¹ˆBe2}ù ^¢P#/›‹X«PÇJ9Êîâîâ_~Áɬýéª(à6R%rER­ÉB›0Q0…²è«âp%² ðž™ÞõÕÕµŠEÐmñÃC…×|ös,&‹e24iÀE®‰c¶Ð¡ŠSÁ,Ý~¨»–V¬{Ú¡¬û¢;ò÷UI›ªÈnÜ×Rû‡œŽXÒÄxäùrýq¿ßÕn­¼ç'M]Óä-ÏíêÖÞéòÌ$B"4ZK{VÚîý±©Ú" ꖞŮ‚IfÁP}F‘©H÷xœoòGšÝ\‰ ¢áǺ¯7»j¾½ºã°?ŵûv Íìû?"P&üO0ëaºF†7ÃWØ|èôòGI·W“×íÿP"ø¾á³±BA1³[ƒàað„¿õdåýCµÛ…žÕ€¢fõ~Õ$€#Ò&s6ñaÍ&âP©4e’–2A¾ë;m*zÂaðÔh~<Óï«¢ÞºÐãîå ”QÄ2ʇêq¶ŒÜù.Þu‘-ýü±Í›º éç¯ïø—û’8`Lvö×±ê‡Þ*; ^¶d9Jt221s>XéÂ|zK‚ñÂ’&×äeõAEfÒÉ|8T¢d™h€¶ÀDíîÊÙ/ šüsÝ¦Ö “sþÅþɲ€P8®tI£Mµí¼•Ã{ͬö¶Jù¦; lW‰½¢f_Ÿò&´ð¡gnÿõtmi£ˆ‚ÿT„I.Ø´srôÓ>á ¹Ö¨M‘P|>²0…4Ùé㸮¾x©H;}Œx¢2i–ö`™qt|É!ÿ¸–F³ä¢©ä©§§rË;IzKÔ/,*ŒÆ"wv;кŒ@ßð'?¬«Fë(Yª&‰œjλ‘ä˜P1€4:"fG´6©¦F%ìö@TÌeµïS­$.&ÛZÞÞ»¢ß͹"L²º`jSy§Éä2$?؈Ì8¾%=`%]{uvMY­E†B$f)j-'Ù_O„œéP á=‹ŠÞÉ,$ïÒB€µÎŸ’ a‚ 8÷€ÕCݾç…û¡jh\vnÎ-%ã{÷±.]„A+KEЊ|ÒPÆÎxžÁµŸÑÑVnŸ@¹-|Âè*Ð` ®ÀeU–ò±.lš¬œÝYª³øÉL(Xm‰i +Eü„yÓQ†Q'ä"Ø3È-.¤dÆþ˜O©óZ¦±s˜ëR¹ÂNùDIetd äô( œÍ‹Áz–r2 )+'5©â½³E)W¹‹Ó8/JENÊÉLæˬÁr~qGáSzY‡k!cnL—ÌAÇ5ßIÁ8Ÿ’³ʵ<Æ„™N]x€|ÙVd=mE¥î³P$ÌÕ-UʈôœÎ#yçäü¢…‹ cô‰9ÑñÏÊ0ëB¢Óšt"  z¿›€{úDÎ3nQ| +®iTjöòõ›w÷ô›Ÿ}ûê{F÷+ `„õDeÚ|C(¥öàc11/ñ¦"óÒ“>Â)~¥:ÔÆÙû¶WD3]U’1±šú/,Ù`|£NÜ®6»‰‚ÛÜf„謮ÙbYø€c{߬RðŸÁ,ö ÃØÔ±AfbÑ ±­))ýîZêà®CC*ïÞÓ›/B”&kD-ð©~@ØüÈ¿Ûû®·ñ ´æô¼åÐÓ“ÕdPÕ8Cc­èX°ð8¡MÃû¹o /Q•<çÚ.¾Õ}m ¯x¨Š=qÙÆ™p-1œPuÓÛÅô$Ü"F‹{¨lC ¦§+ö¶yF+•5“×°µ:²@‡ Ìît¾‚”%(6Ít'1S Ê—­Ù+öoÞ¾…õ¸‡$'V;þ\S¿ï˜VóOóMO‘æ&™X¢\ +£œ ø ©Ó;ã{sìy™ s4ÕÀ{miâLÏ ûI>ý7jÌYŒZä,†Ïm¨ÝÏþX•Å¬X™àý)³pz£ÍlµÿBeg=ÈðÑŒ»,¸Ø‚¡µóÙ亡áÌD+†ºÍëõà-ÿØFIÇ¢I¥éüÖ8 Ë÷¤Cœ¶¦ +Ï/ÕguOèÙør +¼vj^‰š¹Àó¥:]'™­ãšèÙIf8<ØEv;ìÖ¬hÛÆ)¤RÇz€ºÉ^TÍZˆ%1Œw—Ë»sc+õj›õ–ØÇR9o Ž‹M}pâCÈ:‚’ß«"×ÀŸt‡5½6ußSN‘ÍÏYÆ6#†7DÙìòö ]¼É­í½Ùš^–ß fÑNJª8qY¤íC†LËbßFa@g„€¥íW‚~qÚ¼(ŽªI5–ËÅêÙÅI˜²35»òØÎŒ(š¾Øâ¬å©±[Œ/¶[|¾é1/¾}eÈI¡ï⇧³õ •ö>” ¸u“»†Š§Âê5W’M•s¦ˆ ™&×ÙvÖäÿ~òåJ„)Ô+—Ré0ê̇&⹞0Ñg&±ò™É1‘š¹Wèo>Jâ÷}wþ\žG$i5Iúä<Óé‰æEØ\’ÍNtWQ†é`ŽX‹ƒÒi_¼cûÞ„ëf)ÌS;š¡ Ž‘¶ aïzš{IÈßt,|Kz”ÃJõÅFª]«0ÕÁoØ„£b×h̉j‹‡‚ŠÇIÛŽ¸}ÈÂW |ðœÔ€åZÇYÄYGþ»ÁSI©•ŒÜI)pÑ!,@Ãèè"¾ |F š¼üa'§ÏŒŒzŒ~Ü&Ø'Ư3`s »v›I‚W¯o^ÝRi`!Ö–@·ùŠÑ®ê +þÚ~ÿêݯ7Dœƒ.Mº B öË”Ñ.à&þ^HôætÍËMÃY„$ô“5¬L+]9eÝÜöG0Š'' åévø-4ê[Ì3‡±³ŽOÕ5“½Ë1ã Pê“î°ÞÛ„Kk À˜±É˜ÛÚšµ¿ +i>ƒ‚)‰³…ùOZj®Û< «Ë¯qc›aŠçN^ë:­æËSÍyJ…FÍÄÉÓX:å:¦ž /ºë +ßO,Ëõ@Î#i¬B$ñÓçñ\+R `ÐqšÎOÄh*ÓˆÐT¦b¢ýt&S±Ô>Îr*’º.Ðè’+(*ñ þ‹€À +0‰0‹•!TÁò¿Ñw Y«òûX’ÅÊk×N×ËP ¤"& ê«@šÉ0æ›`Tø㌢° £¨P±ó–æQ”ùõn¢¤™4òP߶DÅ¿@1w ×pÈöE´I¾ŽÆÄÍ.²‡³%Ç#Qì§×Èz8Y†gc?®àè4ì”/Ãܘ²Úõéá½½ w<"Æ‚ÄX0ARÛSLa?Çqí’E{‰3¾$û­¾1m3®¾~ßú$ò,Ld&”êkׄé> endobj -2032 0 obj << -/D [2030 0 R /XYZ 56.6929 794.5015 null] +2063 0 obj << +/D [2061 0 R /XYZ 56.6929 794.5015 null] >> endobj -2033 0 obj << -/D [2030 0 R /XYZ 56.6929 699.775 null] +2064 0 obj << +/D [2061 0 R /XYZ 56.6929 420.5648 null] >> endobj -2029 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R >> +2060 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2036 0 obj << -/Length 2472 +2067 0 obj << +/Length 2757 /Filter /FlateDecode >> stream -xÚ­YQoã8~ï¯p—­dI¶ür@v¦3˜½™¢×f=ÌöÁMÔÆÇÎÄNÓÞ¯?J”Ûq’ÝÛCZ¦h’"©”ÂFþØHIBy*FI*ˆ¤LŽë+:z†¹OWÌñL=Ó´Íõóüê§<¥$£x4jÉR„*ÅFóå·ñìööúæÃçß&ÓHÒñÏd2•”Ž¿În~}AÚí$ƳO×÷𠣆/¦ã›û_o?Ì&‰ϯ'ó_®®çÁ¬¶éŒrcÓ«ot´„ürE O•íá…–¦Ñh}%$'Rpî)ÅÕýÕ¿‚ÀÖ¬ýtÈB*"#¦R’XñtØa”P ˜&\Å’88,bCó\Æa›­Þêèš·×í¶Ö ¾,«u–—Ó2[k$|[Y]?àKó¶qäeÖd„¾»¢4&‚K6jÛtdyà0·Lç”Áâžíó•6jú(Û¼x›¥ (0<ÆXëa²”Bʾáà8@ªûƬu(Ñ™Õ"Ѷ^†ÛÈ ØÂ,Q7òŸŸ†Ð²^]Øê1‰÷[}xs²”°øb鳂¼­¦XEœ¹ÊV½äK½|gH²¥C3iÁáf?gÇÎx4ÞçEÓ¶uõ¢—Ä@¡°@`§ò²ÑÛÒb,¼¬²™.!ºˆn ‡ô®‰ }ɇœ+aH…º€]< ÖK/+×ջͦÈÑhFO WJIDi(ÒM1ä~JDÔu¿1ü¹DÏ¡÷ͺJ¿&ÇâÂa¦Š¢Úû%C‘ÄÔÐ €Öc^äÍÛ„‚ŸÆh§¤H.ÀÊé ª8¦>¨dËå D1^ùûÉ8ò¬íéØø~7'Ru¬Ÿ-MÒò› x”zor ßÍt7ß‘¶Ï›Žl©0ƒz£ùï”Fƒ 1hÈ?Ÿ1,!)½ê»Á¢ ›š™cBiÎgz| I¸Lø$é´›'³Mʘ¨(:Ÿm-¦ÓÙæ™°{®ö}Œš™s*ӱΎ˜ <†S[[釼ÞÙ›Ù‘Iìú,v[L‡²AÂZ×uö¬ÍVVv&´y‰ -³™ÅÏ A'Îö#‹0Àmæ¨íôBB^.ôA*"ƒ8½2¹á‘M—ËÓ±c¦è^@ŠÓ™Ø9&ìÆ1麱ƒ½Ë”8«20ëìÆöu -³m¥÷ ÔA)úÛ`f'p@p (ðÙ=MP^²"𛣊¥›Ú…6è‡Ç"+¿ã°€ÓÍI'‹22J.ì6×i7.ÜÛõ’©ïi”XÅÉy½k@qÇ×QDâXu·öIÛÝ΀ÅÓ¾€¦IBµ¿à‹×_x.‹aúq÷|ì -{›ñój×€ÞnÚ)¢( uGñ|]æn[ú*î»n0ç2Æ5‹œ“$†ön -ý2Pn>ýYã|ø¨¹ †•¦•kµ^狪ðâ§"ì Ö u¯±èð´â Þ¸ÇÆ8M.t7Ʋëßf_o¿\ßTjê0áî/i, -Âñz½)ìzTë',’[¢ƒô^8™ˆLÿç `Y»FãX5X:½jW,Q…í>AÁ®ÖŽb7.Pò²ÖÛiè„#0 õø@· ¬‡k$«ÁÃ/S œ#Ùí_;ÈÂòC›a. î¨x|S59¢¸¹OÊ?r¤¼Üì\¡±g\ á•¡\|q•§Æ·ÌÉÙfÐ#úbäA -& HᨮúÊ3ä~Æ%î6vi´[Sl9sù–°í¤Y3 m­oüÞ IÌøÒî%}5Ôut®¬¡˜i×:M싧†.¹åv—ç‚u“Ú£$N•]Ñß&ÐIÒNÊõýdñ›±O3®ŠåªªÒ ·™˜u…±SÂl'mÐûaI*”z¡öÁ’‚„vÆb_„·oÛ³Ò^ˆq#Ú<ŽŸÓ½kfWk&·}Ôo/s”± KÇS¶4EÇ 6LEƒÎ0ýù6LÜŽvù×òU§Òc紇ɥ÷ÅÛÔNµsó`¤¡­|j;hfþ`ãŽoó¹û)âw*© æ+l×e TöMMÅoÙ_ñ@æÞòÅw³_:nü³i9$£Ÿ—ïof_¯]ÚUk}º¿š¥ós t€Âeîîô é¦ßÅ;ä0ðç‘ÃLW®Ç_éÅwÿE ’º™½ýRº -H8T¶ Hë<`ﱬ&wÔwŽƒ35è}“´\˜‹&`I;6ÂÎFs4‰„ªàª>àªñŒÚŠ•N¬r¿sXâÂ:*íi•ûÔÞŒ;e„É0f¸*{Ð]ÊZ ê°e¾'W¦ç®wιHpqÑ~¥»—¿!ÄÚ3š -*Y‰¶›qUÂÑŠç /›.E7ÁÐp=Oí½²)¨‘ÚNÀ·…½€T¶Z³4ß}|Ï(HD« 9CúÓð· K«õ'Ò²Ú}†·žP–m¨-­KV‘½c1³ù“³§-´îIÅWë6‚cƒWv§¡†Ö ä ,þQÛ0pæÒË$÷Ũnîï¯ßûÛ?œßD’K$ÚÍÇÝ’¬Auwz•½¸;Ä»»ûÏŸÞéÿ¼þ·`[; Þ…½H îžúÑ—Kb~©8ÐÐ$ÿå„?|‹„p¥¢S·W‚pž2o”q4‹’¾é’+"FŽmÿ/Ö°Ö·endstream +xÚ½Z[oÛ¸~ϯðÛq€†Ë«H>fÑlÑE·èi¼ÀÝ<(¶’•%×’“fý^­»“ö`Q ¢¨19œËÇoȆd¡ÂLó…Ô LÄb½=Ë{øöîŒx™‹ tÑ–úuuöËoL.4Ò M«»ÖX +a¥Èbµù²¼üôéêãÛ÷_P—¿¢ó ñòË^~p}ŸÎ5]^¾»º†WÊYB¹/?^ÿùéíå¹äËÕÕùÍê÷³«UT«­:ÁÌèôíìË ^l`¿ŸaÄ´‹'xÁˆhMÛ3.œ±ÐSœ]Ÿý7Øúj:f +.”'‹ ÁãtÂ`a¸f:Ú‹’1{y!c®u‘Öµ³‹m–é6ë/œ„älÑ} BêÀZ:#!DÒQâz—­ó»g§Fó¹Æ&»KEÓRœÄ^¾¿s}ee4ýå7Ñ™€1¤uJ—g¥:j0Š˜“;©Ü[ 6zü1Í6oN*ãšy=ªC‚$¬Òÿþ㈄ -õ"hlÞ£+$NN¸½%5ã÷ eflšÂ/:[Wå¦8ìȹäóD©ºQˆS¥º:ýŽ…754Ž¦6½ùÖw7•{ù£íáË»jïºöçD-aö¹©»ò·þ÷éf“m ‚¨ËU˜ë1-Ùˆ©âHS­½{ʪÌF|Hø/ô”…u]dé~bU0Êâ‚1XÂЇwÉd$‰€ô—óaКŽ‚ dfüšù¤³iÂaŸ5CHøΩd†jt€"ATWë˜xÆyÊä]Ú¸Vj +Ãn“6á{ê\î…+÷¼õï«ë÷ï.êü¾Ì6þ§u^Þ‡GÝ àE•TÞ“`oø¼mÒ_ &ˆR"`—æ{³w çeŽ5ìK°Sx/» j4èx‡hD© +ŒÍÃiÅ´UÛmZnœ×ªÇl¿Ï7™G¥´ô~nA›ÿEÙC¸ÎxE^úîǿƱLc5«S*Õw+“”v´ê{•9¯ -4’J½ÐÎ%ÜŽîdË¿±À©‰OD| ›Xݸ.³ýÙÆX@±^@½qè–DJSÙE¿ê®‡P&Î@ 2í}%ȉÌnKÍø?H 3{¿¯³fèÛñž›£Âƒ°0ŒÎ+¥F´í†¤²\tÕíFe$l’Ð2ùnžC÷{ùnúB˜¶õ‰Ïÿ ½YŒ¤8Ð,@r°Ç º‘6U’z32Χ "¦´iÈMÚåe“íˬ1±K —u}ت:•˜!i¸Â|B´¤f"H ñ§‚`ضg•R#ÚöQ誻z0ã8lhíôà8¤‡ùž¶ÅÚÙqì=f‡ù©ÉóÍf„iœÈ¨e±/Êþ‚Œ ݺà_K …(çÌnµw¿ÅŠ¹ 1{‘/Jä_Hž`Ägó Ò–šN(õ³ âäÒ&Eh 8Õ âLœÐ¿ë¬lÒ&¯üÖÝíF8©êsÒÿøp$D!ØD7?ûyóßå$ê3EœšGý¶Ô4êG)3½;x +ÇÀEÛÐošâfÿ¿7€/~¸¹é/ƒQS8ãëˆR# édì¶X“ÞJÞZíë^¥ÿ’C‚úXô² Ôƃœ×E¸;+ƒ&”Ó®çGÙl±˜JõQÂØ)fD’“[Ÿˆ·I ÔG.ò«Ç|㘠- š ¼½°"³£Òp~ Ÿo;bÛêÑ\3ÌýÁ53ùêØ‘{‹Xe#]@¹Ò…œsòtj‚ÊiÌÕ;eåéP}ØíŠÜ) œq½4Fã¸I7Řù1â´k~£ø}é,yc<·Œ´Ò¹CØóãê),ÙݸÃ΀Öm^äÍó9ŸÆ€Y©“ÇOm©\ R}\I7› P‰÷4¯§”‰æb^ý(5¢ŸR&R¨î.7&t™t”eödb$êÍç~¥eúÜ¢iÙ Ã4NÔZh™bóqC$Ò,2Ö—>üß+­ <éÎɘ£Š…§'Jü¶ÔtÌE)G£«§ÁÝ6\Íì¬QjdÚîy=G,Ñ´;ïÛ¼Þé³ÉN™xnõaï‚¢l\Ç6«ëô>3i­d)P‹¼t` +_Ý]tõCg ‰ZÃþÈb4ŽHðÒ½1y¹ÎŽ£ºMÉ OoK*ÒPñ™®AÍ!¦úD Ú–šñ`räÜE_׃ÆæNmvÖ(52m׃x0ìŒy¯³rS÷¯Œ:îƒネûyÝ…eãšÇ´ˆòöæÎô›Ý̹YØãó¸-Òòëñ:jÚÔX¢ãSÉÒ’š1ury^?eû±\•Èùy£ÔÈÄcSŠ’Du'neKÛÜ^ŸpÁ8f "MÁqê¯DÚRÓ¶ˆRϲÛÃýÐ )àGóÓF©‘y»q§Â€Ú‰WçÀ;û²{kiÕ¹‡ˆAáBÉ„™)4â’¹ýQãmx›p#Ìí:­X«³m¾®Š0ü±Nò£ ujtdZ”ÅÛÝw`¨ãMü-ÏÕ_—|úpu=²C€$p|Š9Ç6 ¡àÞî +wÿMa=ÀjÜ é¶Óc{ÿf™SÃÃfXÖžw §æ©ã=Ѻ:7…»X§ËCùwåN†ÖÙ¾q}Î2ЈEŒUl„ÿ‚èñ`ÉÎ@˜( 5!íÕ„Þhmår˜cƒ;*Y~¬šÜa¹w$2ü%4òrwðÛ­z¡ËbÙ–×½øý§vo©gŸk [R))Â9´êª?yê¤ïÝ;»4<~5æ/âë‘0«#r¦‘èhþd!_»—6µ {bV÷@7âʶ´l?üCýcè¼¹ev4õ÷qL óGm#P€cJüôßÎÿFKà%jªÆÀF˜&A)cgà$}ÕSH(€ž¡îÿbÚÏendstream endobj -2035 0 obj << +2066 0 obj << /Type /Page -/Contents 2036 0 R -/Resources 2034 0 R +/Contents 2067 0 R +/Resources 2065 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R +/Parent 2059 0 R >> endobj -2037 0 obj << -/D [2035 0 R /XYZ 85.0394 794.5015 null] +2068 0 obj << +/D [2066 0 R /XYZ 85.0394 794.5015 null] >> endobj -2038 0 obj << -/D [2035 0 R /XYZ 85.0394 372.4169 null] +2069 0 obj << +/D [2066 0 R /XYZ 85.0394 108.4894 null] >> endobj -2034 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F53 1017 0 R /F41 925 0 R >> +2065 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2042 0 obj << -/Length 2188 +2072 0 obj << +/Length 1863 /Filter /FlateDecode >> stream -xÚíY[oÛ:~ϯðÛ:85Ë»¨Ç´I»>Û¦Ù&],ÐöA±e[¨,ùXR‚üûrHY’e§Ày]o£ápøÍf -l¢4Ñ1'Q,‰¢LMÛ :YÃÚÇ æifhÖ¥z÷pñöƒˆ&1‰5ד‡U‡—!Ô6yX~Ÿ¾#Œ‘K`A§_o¯ß_θ4±œ^ÝÝÝÜ^Ïÿ cE((~¾ºývõ çî.c>½úxsùóáÏ‹›‡Vœ®ÈŒ -+Ë_ßÒÉ$ÿó‚5y†%,Žùd{!• J -fò‹û‹· ;«îÓQ0J¸Ð|DœMàˆ±R¼§-¸pJø0ÿ4rF"Æô$âŒhÅ͉}‘hÖ¥rÛJ3¦ú@ew}›Ö‹·û´*ó'²(‹ÕP¦8BŠó´TÇ"Àé"0Á”îËÐTéï³.±Í–iQg«-ÓUÒä5Šd›b¯J÷Oéþ”ÆtÌåQt^c]ªÓk©¬´ÿ²;¾ýÀd—ÄQ¤·%X!A“$±a¸#3á‚ÄŒJO´~ ùÃjóF’#û]qöI±,·#|„"F+õš@Abò+}Þ§†0®Øùëh©Žï£ÎX³–ý yLªt¦%‚"-å2+Ö8*WØþóóÕûÙçk…#+§ë,ö—ÌLÓ¤ø{ ˆ+ª*]Ì€p?¨¢þ‹:…5M‰y^ÁZ‡ê ÖÕÿ±vk»}ö÷v„7Á Jž¿’–êøNúx¡L›þ¥´xcqovdñfÛÞìÈáÍvzx³~á Þ†±cÆ „ . Ò‚t*k°BÝßÜ t¯>ÝñßuBáÔlFb°ùúá=“~ƒßÀHPF°Ñ©#§Ý5%:k<ìÍÁO/Û£¼yÕ®†ç¤ýó½ûöñþõc=lll€œàá~þÑö˜7vèd.á,›b™uôóH”ØÖ—lú\b¿JwÉÞbÎ~PÊó–+ÈK¤P°wØ[6MpaµJÿj))Î;¯ EÕì–ž!ƒ(ˆnËîºqÀ¶§k5§»¾@5æÙã>Ù{_µÉ1hÖUpk/»º\ï“Ý&[xG¸KAô $ñ7vˆmœá&)Ö>´ºã[ÞMÝ ^pŒý< ¨:·&‰:Üšä$â±j;@8…´m_,áP`ìdQŽä¶uPG“Hs<ºûÚ‰ðƒóèD&€Ç(‹Ú‰Yæ8ÑÔYžÕ/g1†ÒÞ¿宂Û8Üh12&’åø¢ƒ-@ÿl è²ÀÀFb@Ku8º~Ÿ=â)TWS˜B2lU6ûE:K–KHê*ïF»{A´ËBòŸób„sß'Ûì0[ÏVYžŽ°Õp¥JÈ!Û_¯²û<ÅSFÄp yV¯ò;<ÐHKœÉÂr?ñn~{í-L‰R”÷Ü÷áºÌt¾^QÈìxþ”Æ&(ãž‘žÊ_!’>gõ§‹2ÄCĆ›Ì³ÂÔrçâN»˜mâ¤]7[¨mèØ×ø¤€Eíélª5OŒÖ ìâb¤e·BD -tªƒBðõQaÃH³³æŠ/g5˜-yò”dyò˜§!ÄùÔ™L½³q[4è8>«r8kj+dSd H#`k)¯pÛs’ŠH{@Û©)m¿l{ 6ïï,§HuÙMY€Ö%àËó\KyPû¼ ^_¸Ä¡ç…ì!/@AN—Ù:« c)[IÈ3$¥˜Î ¤DmÕ¢Ù#EQã -H_À(ÃCû‡À–¯bXRÚõZ]HL§¢ZŽ°”ÄqëVu_‚1Õ”=”Å=åYä Wi3Žžú’|]îA…[`­…³6Û†ZÃîiä3ä|\iªÔÓ$ØT›¤ÍrÝ8õIcëm›&EZ8Ré\¤@LA'`¤,àÆ´Œ}þk—:Nªêç±hp69ŸUõKîX™¡ -ÜœËj…ŽÂ†æà6ìņ¤ºª=°ÒÒ{Ðë¨=¸ñTÝï«MÍ­üp«<ïmT¥àÂÏš{›q¶ÁfÐEêÓÎmSyÊÇà^çdžäð"1¬dUL”Ž#€O±¿û[Ž³.Ë‘ªWCUÀº%ó±E-Êç¢ÿZwp pylC6:Ù,Mÿž›³g‰Cžê gtÆèî•«¬l¶nÚ`k¾0s(¡˜.Ó:Ýo1ÔÀô¦|Æy\wŒêdQûÉ' †è<¸vËtÇþ3†j»ÜZ)š²?Fß’Cth_¢2`Mî Í×+ã/.g:ýriöÊÃñ(z2},]°îš÷üîIÒ˜ÒžIGŽä  ÿV0öû Ôm¶¹|ÚBþoÿvsømJÚû4ü„ß‹Dp[ó PVÍŒ›cÃò¿òËþ?ƒü¨Jendstream +xÚíXK“Û6¾ëW¨*©2„ñà¼l•<3v&±g½–²•-Ç I,S¤,Pëߧ)RâHÉæšR•4ýBlLáÇÆAH˜Çã(öI@Y0N7#:^ÁØÛs<^Ãäu¹^/F¯Þˆh“8äáx±ì`IB¥dãEöiòš0F¦A'ïn§÷eìOf>Ü?Þ=üý€pP:y?{üuöi¦1ŸÌÞÞϧŸ?î­8]‘F–¯£OŸé8ÉQ"bŒŸ¡C ‹c>ÞŒü@À¢¡£ùè?-`gÔNT£„‹èÀgC:ð#Fêà‡©ÂîJ½ßfI­Ì†ÕÅÄAÀ-Ë¿Å1Øv¦ +Õ´«"[Wº&ê{²ÙŠ¤Õf}0öX’eNõ<Œ$CŸÒÔ~XÄ #ì‚ÄZ•™~õ†‹Ž€YPÐ*¨Ó0ÏÊÃÂ@›ÏnÊäD¥•ýfÚùd ];:¸[3à<ì ~2p?”°BæxÊÎJüd%jT†xÎëõf> s‚:Xk$tteû¹n­ˆ‚ÑÉb­ËÏ!áTHC[' „[?YrÀÆbáåwPg<ÓÕ€Sf¨wÖ0==1ÌŸwÍíNíÔWÇþ=«6I^º^ž~)“ê©ñ¯ºåÆ©_Þ>ÎÞß;·«6êÌtÿ¿—ú– …°WküÿºÏu^Û‘`bt›×yU"ãJÕ[u3×ìyµÚ} ®ð›®Uú¥™‘ÔÈsÇ6I·Sº‰Îݪ½m¤n‰³82¬ÕÒᘠ³+¶ƒ–µqÀ9¨}ã´ÂŸ<° îÉ3œŒ7Ѓ̎›rc[Ón´§t„e’ÚÂVÂLŒÙè ZY¥Z妪﹮Ýb +„Îðâ®$Ä`í¾¿M,ú”©ªßwÊE‚³ ´ž×ÊØY2·Aٺ଑MÊvÉ4)QvÓ®Êß)yÚ šÜâVR_TåÊÓu¾U®†Bg7ÝÀÍbX¤4ßhòñÍ-œ>QjCN€ú4„Í^׎V9«O¤™4c§o1„ÊšÚÒNó’]È8“Í—Nž.¨>AÅ®UÁ¶ÉW6Òp…ÎÆLÊ0蓲f̹—I‚:;õîq>¿¿Åv^â è†"@¢ > &EQ=#É +¤ûÃëä›BÊÇó‡·7-ú/÷ÿse†ÄÇvÁ“$&ïºLÃÆí.0ÕDDpŠ}óðn ²a$b,û~L„ˆâ*dòº\XˆÈB¤å2«¾RuújY¤ø!^.O`f_\– å:¡—]YfAØ—a¯›SÏêÝœ•™*ë|éεL-“}Q»“Ò%Ú$Ó—4Æ$‰ ®¼¢±×5\FÚ_ЖÌï2’8ŠBÀ¶ÙƱ]$ŸÄ’ Ç`·p‰õÓê +ùÑhóÇ Ÿé ögÅÙãQy‚#"à ¸&P#1ù¢§ÖàTÆ!e]4GËunžûp& ¾ý¾Až­¼ÐG§PeZÙ”i{ö܃ïOïg·Þû»{FNÛH1T]ÂSãq¥†¢ÉÆ•*m5ÕOC¾&¤$jª‹®ÖazÙӦ풣mwù7WšöœMpBEà_´GËtf¾«Aj¦,”=‹´žÆ⮧™^µÄïÑÓLÏzšiô<ÍžÜÀO;=/<&á:ÊEÜ?7æ÷÷è´³wóW´܆±È²›c‰ðç@OP{£Ó“~pì™Ò¢3‡i§ vsÌÐY»•›«uå\|ýëÛùõma¡óÉÎiÓb.Ì¡a˲¸¹øeû2Kʺpƒº®™l¹ßzÊ&϶µÚ&;¬b¡¥‡ú¦šÊ*WW9šÉAìªM¹[Úâè6Á@{¹²Ô½Æ„eV]–åwóª±ÈŸvÉÎe)W¬›²V7 í°­«Õ.Ù®óÔ¥À­Ñáz¢%°bƦ¹7¦ë¤\¹CÕnß`ïëý±ºo‚ЫùDøac5Ÿ?¢}ä§pÓÚ•YÚl +"=änê±ÍNg†IèÇ!& 3oµœG/Ô¸ª¬­˜U„}y}¸èc(ÊüPV[ëÓŒ" yËPŒ# ‰x +É! }1ûw.<9¦ã¾ÍMõ“÷„[ºj +‰bÙ¤Vs L•y@Ø™ˆóK¾$”`)dÿÜ §ÈýllŠÂ|å-óB À†‰áŸÂ~¹ + Áù¦ÉitŠ©¯b ÂDnrø âvÑ!t"ôp[íê`> endobj -2043 0 obj << -/D [2041 0 R /XYZ 56.6929 794.5015 null] ->> endobj -2044 0 obj << -/D [2041 0 R /XYZ 56.6929 752.0628 null] +/Parent 2059 0 R >> endobj -2045 0 obj << -/D [2041 0 R /XYZ 56.6929 615.2568 null] +2073 0 obj << +/D [2071 0 R /XYZ 56.6929 794.5015 null] >> endobj -2046 0 obj << -/D [2041 0 R /XYZ 56.6929 551.6561 null] +2074 0 obj << +/D [2071 0 R /XYZ 56.6929 479.6712 null] >> endobj -682 0 obj << -/D [2041 0 R /XYZ 56.6929 500.3546 null] +2075 0 obj << +/D [2071 0 R /XYZ 56.6929 343.3873 null] >> endobj -2047 0 obj << -/D [2041 0 R /XYZ 56.6929 467.1661 null] +2076 0 obj << +/D [2071 0 R /XYZ 56.6929 280.1555 null] >> endobj -2048 0 obj << -/D [2041 0 R /XYZ 56.6929 431.4263 null] +690 0 obj << +/D [2071 0 R /XYZ 56.6929 229.1103 null] >> endobj -2049 0 obj << -/D [2041 0 R /XYZ 56.6929 364.9038 null] +2077 0 obj << +/D [2071 0 R /XYZ 56.6929 196.0344 null] >> endobj -2050 0 obj << -/D [2041 0 R /XYZ 56.6929 292.3128 null] +2078 0 obj << +/D [2071 0 R /XYZ 56.6929 160.4072 null] >> endobj -2051 0 obj << -/D [2041 0 R /XYZ 56.6929 107.6861 null] +2079 0 obj << +/D [2071 0 R /XYZ 56.6929 94.2535 null] >> endobj -2040 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F48 940 0 R /F23 726 0 R /F14 729 0 R /F41 925 0 R /F53 1017 0 R /F55 1025 0 R >> +2070 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F14 737 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2054 0 obj << -/Length 2477 +2082 0 obj << +/Length 3151 /Filter /FlateDecode >> stream -xÚ­Y[oÛ:~ϯðÛ:@Äò.ò1mÓ³9hÓnã.8=Š-ÇBm)kÉÉæßïŒHên»§SÃ9œë7›Qøc3£VÎb+‰¢LÍ–» :{„¹ß.˜ç‰SÔåz»¸xóAÄ3K¬æz¶XwÖ2„Ãf‹Õóë/_nîÞßþç2âŠÎß’ËHQ:ÿt}÷íú££}¹´|~ýÛÍ=´@”&þï3YÔ( Ôr›@À»q­Yøuš…Añ„J+ÝC× 8·n™Ç -ägTÈa(â6äû¦ÂÕ›4 cŸª`ôà)˜ªŽÇ34eµ9Ï®ñ¸êx~:[@ŸŠ}5ŠfðIë¤\iB®^,s…G»OÑqj«¶ùMT¸ßÅ»/nÄfn‰€Š<8ÄÐjšHòt[:;.ñööî½Ùx¼ëéòªN…·çr“äyºm…»ò¯CÕ;f^ƒ÷p+N›·Ëuܼ WmÞ·´8)$Γ[¦‰-{:¦“íoy“'ÁË!2Š‘Ûâñ1Ë+ArkvÆÇ»\'”¸j%¼Nû¸hsžG=g -sÌ{rk @àËdû5+Ž1 ÕýCd«q Zb4ã§×pMh®_Q%+Wý]¿ÕÆÓ>eã Áa½hS´IÕqmr -x‘ õë´Ù¬8¡Í^ˆ:‰)œuB#O”Õo¯]Xï -§v ºÔN&ó'‚Ùø¸j4‘Ð>È_§šfÅ3ªÚÚ2]5»Öm<øCp‹¼xñºÀú͵%I/YµiÕXu„ȱÙ{ø¦tHL©y²},öðÚÎ?ºj †,2«üsµ‡¤âÆ®æKDqÀ±r°@Õ°¨ rµšïß%~Ççd›­šr­|¥ËeŠµ9ÜÁ"¤,šºšQ„iÎ蘅ü  ÂP­ÿ¶±›£î’cc+¨ušÇªÝù¨±¤¯Dß3Nú(€§§t™¡Ç§«« ¸¤0Ëq}. èi¸äЮËîkPH±b?\cY›I‰û©ûKȇc4?þ:x o5•ö>byïðÒïCZ».¨ìÊyllPè u ƒtý ­Ý¢~n1¿êc~éÛ5òF3áüÔb$ž„ù -%Ñ(iYhºùÈuÛðb€­ïý­j¹[drí[%ȤçwEÝ#S$¢Æ/GíD„Ùâ:†*Éê a¦Ü$î¼+7ÛƱgMÌyNG÷-< -Qø¥4DÆN3¿š:ÌM‚Iߪà%;£ó[òÊMqØ®šÁ‰·.1q‰Âón’gOzLótŸøoƒ.}Çò)Îs'eÊ’øì(h8Œ!œq‡¬>ÔoÉp#!ë«‹§mZ¯ ñ~¢räÚô@è¨Ø¬­µ “¯S­Sx¡ùºÅ«°w:Íg YG¸^í²<ƒ|Tá _ÓµWf¾ô¯}JòèÌiA(ØipT·¿ßÈ'Îé²æòå§Ú5¬OÅÁÐyßãaà'î”Ø]†™Mº}r#_KH#Q#ô“4¤pj°4*•+´o?Ý.ê[ü·¸ý|w?qðhh„âìçÏão‘ºnùš_vnàϺЦMîH·1´Cf²SÖØÝO‹Ê,~ þs¨²mV½^2ÆæÁù!ÓZÃXßû!îðbѺ, -¿ËÃÞ{Pµ}u¤:ÃïKâ •'¸Œ[ñÒ«fБHaü@<¿bÔ]²®ú=Ù -Bo-ÚOA<ÞôËmDÀ¡¥ƒXܶ§ v`ð Ë Ôxjƒ¥ïëŸÛ¤˜:Û…ö!TOlrn¸#YnSo§ýe,瓱FûAvsãÞ½þxÿyâÔáUìøNUðùö'"œ€¬Žs¦3W#ÝIâäR°R‡¹IØ®?I˜†éÜ@ø“ )†‰Hm"}´sh­»mF K*ŠL¶¯Ìëo‹~þz^‹·y•îóqî_KÀ?Þªï‚@úÉ»v_lu0žd$|HÃ/ >ÞL— XŒŒ»wšÝïS½£ÀA-¡:v¨÷ëý8ñœìä²=, AeL膾s·NÒ\ ½œ,~žï¾æÅS™•Ãt¢!'Ž—ßDJ5ùá -’¬…VÆg¾4+ŒsGûÀ1´2õµK¶˜¼U¢Íÿö—èöS¼Œ‰0ä׿ö§àÊ‘ -À¸õdÂe@ŸcÙÿ9Īendstream +xÚ­]sÛ6òÝ¿Bo•g"ßÓ$í¹Ó¤¹Ú½¹™^h‰²8¡HW¤ìó¿¿]| EÉéµã\,Åb¿WlAá-Œ"TX¹È¬$Š2µXï¯èâæ~¸bg‘V)ÖwwWß~/²…%Vs½¸Û&kBa‹»ÍoË·Ÿ?øôþæß×+®èò;r½R”.?¾ýôëÛŸ<ìóµåË·?|¸…Wi¬$ÆOÓå/ŸÞ¿»þýîÇ«w=9)ÉŒ +¤å«ß~§‹ Pþã%µx†J˜µ|±¿’J%…ˆêêöêŸý‚ɬûtŽJ¢ ÏfxÀÙèµJñ”%Zpá˜ðþÃí»_n>ßÝüü Oã¾øF+nˆÌwȇz³X"Áâœ(& `#Òº©»Ã53˦joT-»]áÍcqÈ»²©ÃëÖ?sÿ¨ó}Àk‹ÃSq¸ÎԘͭZÞtaâ+´Å¦HV>¥šK ìÒžyš™3<α+«²{‰‹æa»ç<ìóèôTnŠ‡”ñ U|wóé=î³”(EùbÕ3y‡+U‘·E §’Â,o¶3Ä+JŒä‘øsD˜Èð‰´Hzj¾8ú@jŸËnçÁuã!ëf¿ÏëVe]xpóˆ–hþ™;jŽû¢îÚ7×+AaùÎðx(ðü£Ý5‡0Ûa—ÃKXnë9’IÂÕ‘!^ý¼T€–Á¥>Â÷Žrx t¶þÍS ƒ=ÊË*¿¯Âë@ÿ»<XzrFÈA¿À`\â81ÑËø~¬ËuÞ¡$ +TÏo9BE¦ƒ<#(ȳ7ý(÷»wŸ=>(N]¬»òš-›˜.i_Ö›²~ð˜gÜçGØ©î› yÈ‘àEIËMùPvyåUª-ê¼;z±t)Åò¦ö˜žÙ€µ>¾W¸£eËç]¹Þù™c[œÜ?ÚAÜÛ½kÿÞùw4‡ø,ò¸DQ;Té,$¼LÁ ÊHSÃii—w»HQb£Zw :Ö·»Û›Vm÷R¹¥Ì”¶E t74ƒÕÀOöÇ¢íÂq¦ÇB¯³^è3¹ü¦M¿oA~ +¤Nø¶ªFMH÷wÐzñCmwKŽìÁz—O*ÿ²?¶ó>ZóhZî_‚Ið/ÅËÔƒs“Ë4[€s Ô2ö5>œkÐÏyðU¿â*]Ò»ç‘>€×°TÚaggÛå_êæ¹o& ˆÞR.ç¬:'b´R_eåð(–EÍuו{Sì½B?Rÿ‡Rþpì]9Ì!Ä[dËMч½w4Þ5ÏîçÝB]¾îpÐB D/@ †]ƒ€ûñ³wÔ8Ý+©×äpŒ±"G߀×îep_Ç*LQ2#“à $R +Â7n±Ÿ]Ät{RB„— +¬g™™YÒ*ÅŠñÚiÌÚcᾫ{O\gb&1VESÚ6ÇúXå›Í¡hÛ)… vלÚË$öX34Ž£(E4å|Lä¯mˆÊÔH¶(‘R«³TN–µFeÑ?8§Ç¢såî{Ïuá'p!o]¦7e€>a‰í k5„‰"!ÀI#Ç‚ôñXuåcŒ?ʺíòz]´i´æQþ»>²‰š›W•×ÔÝ®sþÝ·m0SóØ©Žß|~’“@:,’ð¡ ¼(|Ä3'£23ÄfT^–Ñ뼌öXNF×s2J!djȶåÃj[Vʼn€jF(—â2}=Ö #ÕšP +b4¢p^@1%Ð ó³$NÖÕàf2‘Nfƒ$1;c#m$ŽQjÀ²ú¼wfÅðù¦Øæ doüÆr\Q¸™ŒE*¿-ºõ·hÌ Ò;§F‚h£y@?/ RñŠ0$X„!b9aøòªÁ{ïÖ»"|”Ÿ¢‚7ïŠ}Èw­¯ó¤Ë‚¬¬üµk`?Sv|ëc³/Ì`ö…ñAÉiˆn¤W²ed¢t9£ +ËGnQ,ðàF}•`.)D¤½Ué2Oxó$Å(Ê$5!„bMË,Ö0¶k\ªgxHÀÓ(ÕPN˜œÈ°d«!Œ‡\­ÊAácà4‰qF•œô’ÐèLÁO@f#Å+,„¤@‹lPùiC“,†FS•d’hªÎ볌Ê+4ź ÏËéóã« 'Ú̱Ž¨.Ó‘fèé2‡ ’ë a·E=[±‹Q®«k¹(87µÜ‘õ¥›k|kšHíôà:‘p…W7²ß‚èEêúzôLÁ·}>¯wöz)C?Æ^¹ÞëÂõF,w½ÿšniÁpR4œ—¶ŒH3[Žx ³ÔØñ–ê¡z +šyßD¬š‡HFÎ2k Á$,w‘ )Öy&ôXŽ /ó2.›7S«aL‚cÎøˆ®¿T«éW<=Ä„4 ¨¢Üœê %F3~™q=Ö çÆUbg@wýÕ]žŽMôqØHÛ”nRuž›œB¼È„úû¸Ù¯8ÃÍ‘ŠCt’Q8ë ;O‚x¢¬ŽñöÖ«õ~€SÓ@oÚɬâD0›g€$Òù÷±¦_ñÖ˜eÂüyÖ„:(ü>ŠE¨ "C­£KGPhh58u ‘3cù¸ŠÜ†òœJ ãîÕ{5*o»÷î*¡k¦$Fq€±ñaòµLlµZî!¾ËÂŽOyUnzw­‚§Á®àz] o^ îÃ"„BXtzÙÂ*Â4çç/+YZ˜lÁˆ¯æ/_v¿â*]òô²ø:Í35ì|ö²!H\ý(ärQ…àé±X—(ñÅæÍ\‹­ÜW´å.ùh×Æe.(¤è1š/>±ôå6êjëøpù%bȇc¼~|úð’²!d¥£ˆ_]ëcÀ¥#ÜûÂ7Å` ŒÊÞ„6£€bÚ¿ñ ƒôù U¡*“˜_c~ÒØõ-Ú~ÂË©í[ÄÂyè:Ûg}6¿òÙ6öÓblCîoUÒ­Z±¦Õ\# u}q½üÔ¸™Ú¾imb·ÝÎØA˜íC\Ðå¥ÛfÒ6ÎzbsC•à!…G"š°” ñ¤I9iíœFg³Ádì +D1À†¥`Ôÿ0`R‡=yÛ&-Æbºî»ü)€Šº8äaãØíÑeÈXžÁÄŲ*X™¶%}«"=jª|ï>’± !]åâ±*ÜË»›@rV€¦-J˜¼™Ët˜ÂzæŸH߼‹ m!nõ€·›}Y—`®ó.ä—bxY¯Ãgóú,óL +v23 +çø ¢QÏœ’5ÊúÚËWekèžšc7ÓЋ‰?¥kí„™]Q=†Ö w%³Ý°Ñ`Á©‰MŸ?Ý|¼¹s?Â}ÃçÿýLržPDJ¥ò¥èF?‡è[ÓvçH?Ò¼x’ ™ÙDYËûß™ŸÆXü”˜ü4†1Û"ké˜M¤ÂµËŠÖÛPx&? p­x9 Ïç<ºH:؈¦ fF¶‰ÛqŒïÞ0s,è̔̕…øRéKž€¼B|lg)ó7„wa½Õ° ó÷#º0„¬ZÄ]/…v¼Ï“U€ã[Zq;ðêÔì0 ñ‡ ¶ØéHïï¶xlaá/-ªrP6J`ojcid]ႆöÙÜãÐ^Ì×"h¯ŽùGsÃ%ö ŸÏ§…”H€.¢ L°“x0þ¼î”öÿ…Á ‰endstream endobj -2053 0 obj << +2081 0 obj << /Type /Page -/Contents 2054 0 R -/Resources 2052 0 R +/Contents 2082 0 R +/Resources 2080 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R ->> endobj -2055 0 obj << -/D [2053 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2056 0 obj << -/D [2053 0 R /XYZ 85.0394 409.4177 null] ->> endobj -2057 0 obj << -/D [2053 0 R /XYZ 85.0394 311.5951 null] ->> endobj -2058 0 obj << -/D [2053 0 R /XYZ 85.0394 250.1972 null] +/Parent 2059 0 R >> endobj -686 0 obj << -/D [2053 0 R /XYZ 85.0394 212.3815 null] +2083 0 obj << +/D [2081 0 R /XYZ 85.0394 794.5015 null] >> endobj -2059 0 obj << -/D [2053 0 R /XYZ 85.0394 179.9082 null] +2084 0 obj << +/D [2081 0 R /XYZ 85.0394 751.281 null] >> endobj -2060 0 obj << -/D [2053 0 R /XYZ 85.0394 144.7976 null] +2085 0 obj << +/D [2081 0 R /XYZ 85.0394 555.2948 null] >> endobj -2061 0 obj << -/D [2053 0 R /XYZ 85.0394 80.4778 null] +2086 0 obj << +/D [2081 0 R /XYZ 85.0394 126.1169 null] >> endobj -2052 0 obj << -/Font << /F37 791 0 R /F53 1017 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F39 885 0 R /F48 940 0 R >> +2080 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F55 1035 0 R /F53 1027 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2064 0 obj << -/Length 2904 +2089 0 obj << +/Length 2725 /Filter /FlateDecode >> stream -xÚ¥]oÜFîÝ¿b{¨Üf'ó¡’''qz.š4׸@^ä]Ùª•Ü•Ö®q¸ÿ~䣕vå8ÅÁqF$‡ßäZ-$ü©…uÂå:_dy*¬Tv±ÚœÈÅ ì}¢øÌ2ZŽO½¹› g´ ·}wþùíÏŸ./~úH¢IÕH4r¹Oéð¶Y¯Äªm®é¨ËÛfBç2 -±êN—ƪ¤¿-q!øêßRê›Ý¶è«¶¡]„Ô|àºÝ2Ö1J§Âé-20C[K‘f†Ï¼|™ÛS~sññ‘Ë Ð›’]¹½/·ƒýöTù¤­is×WuÕ?ž*¥0§tryK÷’#ÎUr[0°@Ö@bR ™§v±„luÕ¦ª $¦mÒ)ŸìVý., Z4kÞ~lúâ/Z÷íŒ^T*…O]ÊWÆ­ŸTL.²Ìz>Šællò¹/úrS6}ǤÇ|”ͪn»20“&UCЫm±*»Nûr»©ÀÅïU¥ …ÓZG)·àA9 -~S-WmÝ6ÀOjÒäm]ì:Ä®Áµ"ž -*D@7â7nÃKݵ|lÀÊßÌ1•Ëˆp×튚­Ú bf¾úÇ:r‰àmä.wwwíð¾v½p)ÊvßR”¸^X”L^~K°o_N?Èèƒï¾›ùä%Áú–ž%Ší5=ëª)ç°ýÒT£ûÇWb;ã«}18¡'D?Ñ©O6»Õ-®r´ÿ» ÁýmÑÌPË­0~Àñ÷¬ÚÈœõ Ä¢{"-¶+€ö·¤RÞØ[Õ+ú¼hè\{‡!ª;8õ‚6£“ƒ=¤Æ©Ãà€BÒç鵈/èñGùxpNÌi¯4ãÿp{㢠"¿ÇRJS‘K­ø܈##³ñŠ -ï‰o(²û’wÈÑk¼zŠ— -ieÜëòºØÕý’%pÌŠw"KmÌÇD¨UÌÁu[×íCˆ$ðvõHOŠã°a;ÈÞ(+ÒTªihiCl…x°^“š»Žhâaƒþ5F¡S•v³4Fmbˆ‡ÝÛ¶ëiõPÕ5­®øËGGØ»-ÆÛâSNðszuÄzSÝÇ -ñ=°}³c $Æ~}è’#“ûš”ˆwKíŠÔ™ð™özDó<Æêr!µu‡JÔžï—•РD³…“³V¹*s‘Éù‹h%´Ló±c,ɸR ¾e±K™üséœK.qçQßÇÄ!Bgö´«õ uUÍí¸VryrGåÇ}V¹7`(•\” ú Ì\”ˆŒñ+ŸÜsr†³jÕ®´Ùsâq25‡zœÄ¬=ï"™P 8Ò$¼nŠ~uË zjÕÜÌ(êõ ‘§ÂˆÚÕú£ˆWO•)þ¼ŠvL/d\^FOöìÉ~ðdO©!Åd ö¶Ô!ÙÑèÐ.¾a:¬~#ÑÃIŠ@,(ÏSÅ„lŠ±Yö„k:……zzàšXzÌH&K1#ù¦t`í$À:°6X—¼aÕƒ¶´„$Ñ”«oé“`”2ÖØ ënÚžQ±›ÃŠEl†2N¤ÒO…|J>áSЀ-ÆõÄí¡ÝË¡±™dDÂÓËà^ä[°O )†} @{ß’{ßÒ:`Opj€‹!ì~«{EùQ&ÜE:óXÐNp®yÿÁŒˆ÷‘K=ëIºÅ9O‚~—=)“#OÂE6’ ®«àJðdWÊØ•2ÉÆÆb'žÈ@`ç9tR‡¥D»Û®Ê%æsÌåÇ7PÆBÓ¬¢ nfÄUšp˜&7OdyïæèX-”³Ópˆå!X5§+¨|“U¨†A !¡ìHWö •*,.>ݧ´G"o©?\ñáQiSvìN‘·iQ@§îÀs¡Þ¨c;Ó¬œ]÷û¢|N9©¯çⲇ>ݧû¬òÐ&Ö/bí«îX"kkz­ ïÜ­K.¼ îú-Ú{Ea§~h0¼X®QØ %¡!,FM¾Þµ]W]Õü›Î«9'À,‘%É|^†Ü›¡V{1W€ï•}&epu¥¿è6P?JH'ñ ¹G9ç…Öˆ,÷zTjê,ŠIǺNËw¯…•‡­Óf‡å¶v†b-I».e (4¬ð,èAm”›è?3„=Ã-¡ IÍe„R<ÃU³Û\»D\à8TovXâyvi€ 2œk™ÀÅõtnÀÓ¹¦W!Ý08û¢¤è$?ÌðZSU†OLÔUˆ:TuÇÓÈ@ÀquŇ8^!¾¦ëË‚_‚Äc¨D†5*&tß&9/‚Ú¦ÔHåÐ7¨T8ÅK ¢,þ(iE‹ù²¤ð0¥Ê=Q¡Và³sÂtPüëXÝ>›B¼¹DGS”X öýUùBáíдÌðX9!4ÊÔdI'ä$&ƒô¬ꤠ)Síx LöšG -¤)4CÊ.ãñgüdœ]ðÈXù7òÈ™]B/•ê/÷ZH™ûãE*Ñ4o„×a¶e¾ f‚j ¯C‚@% ,abÊA(\¡*Á°…,ñ€7óžâ!š°¢;.ú‡6¶‰"séADZɱ °Øò&šeQß´[¸Íf~Ž®”æhûÖó‹áPdŒÆ)íö1Ö¹°±G^Ÿ˜§gP2ù¡zjx!}(Ts&”3¯±®K“ÕnK–Ñôõ#m¶ ­tòÏgo—ÞYž“åª/£§’¢ìíöƒÔa€G;Ùpbß³ {„ôÚ•+â£'ða=Ô -ãAnpÅÈŠ®\º”  ÍvÍ…FF.;>;÷›n.°u‡{lV8|½Œþ¸'\ÙÀºêâ\6ŽÞ”Ñ­Û](!pý纬î©Yá0ÆÇ–aÿ’Ã:j|²ä¡xì¸j rS6å–ßqc4ðÐÈ7®¯ÃÔm?¦ó#„ñ¡æRvø‡8œ€;²›m±™1UÄø‘©NG4±ÅÀþ|§#åðS ¥(¯X·LS’>÷Rº'àBh»¡uÔï z¥j3ÛWÐSŸË½Ðrè -ñç°µrÎ÷µÐ^Æ"z$¦Ã?u MûÐ0{ÝMéEjÒˆjS}¨Ê D_°ˆ­ -¹©™“èW Cˇ*‡ò±è2šuãñÁìݨ ‡ýkºâ†vâ¥ÂLén׋™‹ig…ö—e™Â:ö”-•r8ë‰vw[݈ ®ÈDq7gÎw}œ9{!s=Ç0uÞU] >ÃÀ¦hâÿ -ªMÇñàsY$êó_Ï>|úñœcº8‚‡h? ÐzOÄŸnºƒÃ%Ôb{ñ~†•Eê-ý¢éÎd,è$öG{Ž<üÒ°tR&ÿ ’‰¸ç»k®•†óu»*jlÓ^Ï…ÐñࢃŒ†÷×ÜêÎQúï€ 2²å[E²nLõY¦åÌ?OY}eÓýøý9Ò:å"á¹-µàÿÌü#€Pÿßÿv°ÿ‡Œ4Æ{½ÿ‚iiqÚí"Sx%G¬ÇP8æý§vÝ7endstream +xÚ¥Y_sÛF÷§ÐÌ=Tn£Íþç2÷ä8NëNãäbeæfš>Ðms*‘®HÚõ·?`±K‘§sãk‰±X?»3bf,³©LgIª™áÂÌVÛ>»ƒ¹ŸODàYD¦EŸëíòäõ{•ÌR–ZigËÛž,Ǹsb¶\ÿ>Ë„d§,}ýÞ¨³fÁ%,€\Ÿ¯Þ³óWï‰s V& K„JëÙ§OWï.ÿ{º†ƒøÓ…á|þáìêËÙoDûtšÊùÙÏ×(ìäbÙm¤¿YÁî⯓ßÿà³5ìù×ÎTêÌì 8i*gÛm3Z©HÙœ\Ÿü§Ø›õ¯NOp&••Ö“b&K‘ó™”Y%•ßíõÅmêì·ëdÙ7#ŸÁ,,n¬gß•ë[UåíWn¸â½Ž œ¸ËKœs½¹2ÛæëIâ¤(Ôc&¥}9É8ó’¿Þ^^½£Ó°“õ¶(‹ºÙeMµ#Òçü6ß +7ÏËUN¤YÙf›‰ 똴Öñ!¶†¦\hÑ BVY&´v:_–¿|üü²/Ë&ß•yCš\?×M¾­éá¼*ëj×ív¿®fJ[ähÁdêºÐ'.X¿Ç,N'IØ@ç²)‹È»P† Aº×¹b´‰” ¥Ì¤\5Dªt."ê«”É>Jh/~å\޵ॢ*‰ˆ”M>ið(1Ø;¥à}.«‡º¨Ç8T‚%ΪÄ$¥§p#@[i0ˆ¦A)AXôDxL L!Õq1ø~#|1ï.®Ï?_~Z^~¼:bñ)ðMY<°àÑâ`p¨˜7÷9&̳ÁÜžá ÕíaAB¨(n{¡4±¶äL'Žb•ØýÊO\.%Ÿu¾{XFÐjC“mSlŠæù‚0¸°BΗ÷´/ÞÓ\Ìï³@ÌP5°‡ôj3[tfµêb[l2\Lš9ä†S7oWMKI¨Y¹ÓÏe“ýM㦚ð‹ÐPcuØò>•M9&eIb\—MF™ùu“äó²©ÃÒ}= Gmª:÷ÊèyQõf—­òz¤)¤Èu +¨ÞÐëYI|Õf¨zÄõŠ&#Æ!´²b!ŸõËô˜E‹gôógþ<âcS¡[š€?ì^Ùh¨¨ï¡•´f)—"ðõ4R<ñ /+pŸø„&{Ìà AãÄ1¬fÜXd¯óÛ¬Ý4‹`CUœe‰6±¦hµ"hp[m6Õ“O$ðtóL¿”ÆaP†žÊ—0Lk>²}åS+¤ƒõšÜ\×DÀ÷ô²¿Ä$t*æ^ÝDû¼(UÌð0{_Õ žŠÍ†F7áÍ6$G˜»ÏË ·Â_>ª Œ£Ô»â1¾RŸ½ÚwmðPbê—cHöê÷TDÜ›6G)æéF~Äð<”jSÆ¥±c'Jö—öTïD™'!' ^qäGp@úÓ})£/³XƒE + бÜlj?©`"éºçéHèa¹NûÀXPpiè0ƒGÁ~p>ДÏ/QqëÐ߇‹C„3”Ú¯]¬'VWp¦2©é·J6?P÷ñX@T®ýNè;%-ËR‹$,\T‡ŒùŸÔ…Ú “JgMn’—Ìc¹Vc?ƒLRÖŸÛ¸Œï,y·Y³ºÆ1g…³(ï¦ +©eç‘ciDÁÉѸƒŒ[×B•¼~NÄ8¦ +.Ç#’]@²ëì¨4"%kÁÖo+M²=°D@Cºø!¬œžÈôÀI(X:cë1Ämý)›rl’¦xLÖ#hbç1a™DcE<À&·!ÁšA‚µ!Áš˜`íÜËõ£"°¢!‰2_EzE¯ø ä±Åmw[5AT€9Œ‚É|‚õÆpøÐ|Sü¦à±Ô‘ÝK^bÒAE$™±¼tð"lÁLäèJLÀöØâ{lI9ïhG4U E—v¿KÕ½£\¯¶q"è˜ÑŒ×4~°b€àqæú’Œá“Hâ<")á=$aŽ¢I:(ÁÈC ~”’¥„‡à`ò¹G*Äy +©q+Qµ»U¾ÀzŽµ|âžo Rñ¾™0 tiÌb=Àoz‘Å£ZÇH&¬¦Cl!ªC¹‚Îw¾òý#ÐÐ H ƒ Å·Ý@©ý |§ +ƒËOšæ¨A$’ ìW¹×Úäu€SÔmàôÀõÈ…~cÏ°ýåÙm³oʧœ£ñ&#/æeÇt§÷Uå©òJ¬_ÅÞ;vݱEî÷ÖôXÀ±³]ç¡ñι¡Ùa¼{R4¶vÝ£“‹í¥߇Í Â-Ãlá8ÒŒÎè¡ëP׆™Ã“(ãè&0…|…òʺɳðà-›x¿J„0ŒÑ1þô­æ™wÛp5r9œ„æ#°Q¾”`ÊìÏœFD1X¿¡j@ ÷—4@@»ûe„ïï”1-4ÿ2v·/–gX*:“ÆÈ¡Hì…»øþ®zÁs¦;TAá¾s|(»¹ÉO$*ò,G}ÒMøt<Õ»Ðñ!{®ÈS†T]úסºà+ýê‚,£1üÔ‘#•ÃYJËoŸ5ð[Jêï(4Çмó78öW‹Ðæs&H¡ƒáí³/H b-L,9H¥ä#t +è¦P¥p¿›8Gy ÔðÙÍS‰,±zÐñÚäÐØl9Ã2ÛÜU;ØÍvú]ÕÝ£í¾X_THEJI¼¤Ý=Ç>&öBýã‘ëôZ&ןŽ]@Jß3ùnNùvæßØ×éùªÝ…oYÍæ™&«’Frþˇ³óŇw&Ü“¥º/5º¦êm÷÷¨ÝÍ$ÇþÌ‚T<³ 5£Ç:_‘ ‘»”ã®Wè_táDè@XVç «‰ +Ö¬Ö¡ÑH²}Þθ?ÔS÷Á}_Ä˽VxùºŒxÜ/é/þBg㢎÷²ñæÝSƒ¸uÕúǵpÊ¢›úð -1~­ø¢Ä»@ÿ÷Gáýçr0åœÜïöoClT +-%”>Ôý€Û-Òendstream endobj -2063 0 obj << +2088 0 obj << /Type /Page -/Contents 2064 0 R -/Resources 2062 0 R +/Contents 2089 0 R +/Resources 2087 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R +/Parent 2059 0 R >> endobj -2065 0 obj << -/D [2063 0 R /XYZ 56.6929 794.5015 null] +2090 0 obj << +/D [2088 0 R /XYZ 56.6929 794.5015 null] >> endobj -2066 0 obj << -/D [2063 0 R /XYZ 56.6929 752.0756 null] +2091 0 obj << +/D [2088 0 R /XYZ 56.6929 752.2635 null] >> endobj -2067 0 obj << -/D [2063 0 R /XYZ 56.6929 252.6303 null] +2092 0 obj << +/D [2088 0 R /XYZ 56.6929 690.7232 null] >> endobj -2062 0 obj << -/Font << /F37 791 0 R /F53 1017 0 R /F21 702 0 R /F41 925 0 R /F23 726 0 R >> +694 0 obj << +/D [2088 0 R /XYZ 56.6929 652.8084 null] +>> endobj +2093 0 obj << +/D [2088 0 R /XYZ 56.6929 620.2916 null] +>> endobj +2094 0 obj << +/D [2088 0 R /XYZ 56.6929 585.1376 null] +>> endobj +2095 0 obj << +/D [2088 0 R /XYZ 56.6929 520.6753 null] +>> endobj +2096 0 obj << +/D [2088 0 R /XYZ 56.6929 462.0998 null] +>> endobj +2087 0 obj << +/Font << /F37 799 0 R /F53 1027 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F48 950 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2070 0 obj << -/Length 1788 +2099 0 obj << +/Length 1782 /Filter /FlateDecode >> stream -xÚ¥XKsÓH¾ûW¸rY¹ š‡4ÒRLp‚8ŠâqP¤q¢E–‚%c»ÿ}{¦G²ìˆM(ÊÍô´zúùuËtèÁCŸx<C â{Ô&Ë7¼„³ãµWø<$~Èd/íø‚rFÂÀ£CéG$àŒgÄiºRU¥ª‘€~à#/“8¿*«·×åÊ®|îóG¸ü÷‘6èRJ"ßgÛ…k½¡+hÇCý¬nðÝ*^^çªÝþ0̽‚âü²\eõÕr’€õj'î2õ[ù]æJ%+…šzÎApt²ø[ðÓê»Èo.˜8*–O¾Gù‚æùóÓ?óïý6ÐûØP«ªþE ‚ûÀ„6àŒ?›†¯‚'/6Ñûͻ͌¿}ÿbýúñã{hýð⻽Ë}ˆ½ïÃÂ#ƒLÒ¬ÓÂÜäÔW -z+Œm@Ίí%;IFm’¡j€khk¤t’²Ð.׫¸ÎJýº MÉ2l q…šÃ1hn‹v…ÎׇÈ#:ªÖÞ4_Y4U³Ôq­–ª¨‘ži–¥j®1aÇ{¬‡z -fm‹‰° wè<;º'O}ÜÅùˆ:mŠÑYm_Ý*‹û$1Pz]uœ†Sn/¹ˆ+å7ªHÊ4+.qW.~¦ÐO -¾½:ˆÊËÊv&ðLËõ…‰¬¿¬Kpi……$…M=Õ’úB·X¡¨ãj‹83(fâvË„‚Ûw³ -ß\£zÜäWÑs£/ˆün|RîáH*©í%·h@“|·Þ€[”>Ð-ªÑƒÂ›zšÚÂ7V8"Aà®»­õ*vȹJtþ¥*”ˆ EŒdT¹Äõ~Ð(¨Ÿ(ò E±eW<,nŠ46ÁI›öÉ ƒ˜ïVd¹®¯×µ(b> ”J] ÷8„RȨ©‹Qû™îÁÚrÐèÓ#'"Ü— ÆœU™W}~…T½-c ¡fÛ¢\õÙ±)5 ÖéÏÂ0‚ aEo5ÉŽ]V׫L»Ä g! Ç’îBÑE³Ð_©šæ°PZõthxU""!eáÿU "ô°¼S*¹*qN;ø\”›Âοy¬Mþf‡`íf³ˆí4k¦¶Üüƒ=åh;bÝq¨PJsçl|2A»Ï'g#èÊoáaöú3czüæl¬½9ŸžÎú‹˜Äc‘u¼Éwئ̩ߢ§¦â¡WötÛúMR<5åÏ8IÔuœØ<4Õ‚4L -•e+RäiÞCaIyYdß­BX‰Àc XSªk•dúòæÖ¬èë‘vŒÙ/™€D<ˆîƒEÀIå-,â,j:§¼QcõiõuJgRÑÛ¬èU*ÓïSdðù¯ÑFD‘s®ÔžUÇÃÜ´½æ¸‡(‘\ȻĞO$ƒÍîÒÆ:ƒ¶Mý•<=ÅU„qºÌŠ¬ª¡°u5hÒ™Z(Œ{‘Ø×Nâbç[pÂiFÁD•ãsGiœOleŒ_žŸÞü: ôgA¨?ØîÜéûgM‘šO ¤›;xÔõ­Ô½Œ5 ø{ž¸m B¹A›=^q¹€ï7£w½3~3vzv·[¦€]«¢×ó› -Bm;Æ!$LNÙz¹½WÀ4Ñ€O_)àãȘ@?r©þ¸ÞŸ,Là ±„°˜¦Ñ§_1Èþ@²Ûó‰Ñç#|õlã†+Ù¶?Ptv–eþ³¿`@=Éõüaⵞýí¿g¶C Ix²öŸ—«¹.åm”Ò¦SN÷Uoÿȹ­û`&ã±endstream +xÚ¥XKsÔ8¾Ï¯˜ÊeZ,ô´¥¥8’@€„Ù-ŠÇÁ{2^ücCØå¿oK-{<ÁÙ„¢æ`©Õê—Ô­¯‡M)üØT+B…‘ÓØH¢(SÓY9¡Ó X{2až'ì˜Â!×£³ÉýCO 1¦gó,M¨Ölz–¾öNONöÞî†\ÑàÙ ¥ÁñÞÉŸ{/vºkx°÷äà L¹Œ#`bœì~<{vÿP‰|a ‰¥²fYɯOö“Ç/O-ëäଷwè£Âûyòþ#¦àÚ³ %Âh5]Äf Ÿ–©QRˆŽRLÞL^õ«nëXŒ”ÐDi‰‹± )C"KÖ•³E¶Üe:ÈvCAul&qЮk¤Î견+$®“«©m”‹¬Ê–Ië%´ ¿ûpév$»-6³ 8ÐÎ_˜#8ªé{/L*ÈOíôFCµ·ZíTÇúvÕ쎪۬i‡óÛtsé7õšé6W’¦Ë¬i²þÆ<¼¬—~¤„pøýç=q&EÃhÜêER\ÔKH&Ègi|Q&³°LÕ¨3ö¡ÈÐRìD‡Çó¿¥xÙ|“ÅÕ9—/2ž?9øfŠ9+Šg//¾íü‚>ª?ãAtWܱí¼OôiôèùÚ¼[¿]Ÿˆ¿Þ=_½zøðV_«\aŸzB!(²¹rß• a‚ä¼þ’!-ûêŽèÞH½„·'fLÑœ­ŒòLë¼(PîùªòɉD¨ùHEK$íï¼³Ês .¥% €exL(üLra ÊÂD +l/ð]v7Ð?ýŒ3¢bj¶OÂ_Oû"W=‚ÇX mYä'ûuZ8۲轰ä½*::Ü6ÈK¢hj‘ϸR®P4ëžl {!iöÀHå|r^m”ŒÔÅδX¿YoâØ+ábï,>±,ŽÀà߳أ2» –ûŪaðãkMÙ, ºjYZxÓá±m‘žWi>JÓ©qÇŽz|„Ffå*—ZxÜ:xz¼÷8<ÞW¾ÙeAŸ€ŽRyh–·~ëÆXœÏŠÊŽëªMòªÙ 1z=ü€‰ @,r›ßdÐ ß«¶l5+jD@0ËýƒÖ«|^Õ$Ò ƒË+b©1Ÿç#Ùª‰Ü?LVÈ„Ö#Á‡ÊIk¢e20  w¿ªJB3$n¯q_« â]Vñ +j$nªC $¶ó Xñ‰² ö‰ê,ÅC]¾ÍÖ—oÌp¬…í¦|T ¶@¶ ¬1ø(ªŠÂ§Gñˆ³¶ÎÓåÍ––Ù¨ï\#rs³AwNxæ?<²ÒÃúΩ!LCзL¿E.ÝæÞƒL‚om6à”"‘ܪüÄJƒÊ1ÔÔ¾!ÆJ5MB°s¸â+L«»<íÃÉZWHè‚"ã 4Z1xeì‚­‚ö»†$o³Ê‹­‡âcÛ#€|ì_Óîù„Ùogd½j]ŸàPµ­ùP¡²4¬µ_ c”ĦË_£®ßtJ$ïÓÁVŸ9†w<¶æ,뢋+\°Û3ö%t€ÕIb´êRÍëô¦c‹ [Œ¢ŽµïöÝeÇWF—ÐlAH|Ò®¡Ù‹Ùv)º5i6ôg²&"JëøöNM¢Yßçf 3‘öÏ­Èf‹qÚŽoþ-ëòW‚]Kd‰G³µíàä_ü û ™­4#ØÐFþòßC›ÿÇdL„Ö|üŸhÕÖeÁ„¸nzÿGÒ¶ÿ n 8endstream endobj -2069 0 obj << +2098 0 obj << /Type /Page -/Contents 2070 0 R -/Resources 2068 0 R +/Contents 2099 0 R +/Resources 2097 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R ->> endobj -2071 0 obj << -/D [2069 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2072 0 obj << -/D [2069 0 R /XYZ 85.0394 343.1761 null] ->> endobj -2073 0 obj << -/D [2069 0 R /XYZ 85.0394 255.6488 null] ->> endobj -2074 0 obj << -/D [2069 0 R /XYZ 85.0394 192.0319 null] ->> endobj -690 0 obj << -/D [2069 0 R /XYZ 85.0394 152.6743 null] +/Parent 2102 0 R >> endobj -2075 0 obj << -/D [2069 0 R /XYZ 85.0394 115.923 null] +2100 0 obj << +/D [2098 0 R /XYZ 85.0394 794.5015 null] >> endobj -2076 0 obj << -/D [2069 0 R /XYZ 85.0394 83.7361 null] +2101 0 obj << +/D [2098 0 R /XYZ 85.0394 668.3939 null] >> endobj -2068 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R /F48 940 0 R /F39 885 0 R >> +2097 0 obj << +/Font << /F37 799 0 R /F53 1027 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2079 0 obj << -/Length 3192 +2105 0 obj << +/Length 2487 /Filter /FlateDecode >> stream -xÚ¥ZYoãF~÷¯Ð£ D=}اIf8Øxf3°@6´HÛÄH¢"Rvœ_¿Õ'5%?°Ý,U«¾:I²ÀðGB"i¨Y(ÑÀD,ÖÛ+¼x„{?]‘@³ŠD«!Õ÷wWï~dja‘T.î¼4ÂZ“Å]ùûò{Dºxùëí‡V?|ºýñ§·×+b¸âË÷Ÿ?¼ýpóßëˆãå/ïo{ÿo¿÷ùÚÐåûŸ>~¹þãîç«wI¬¡è3+ÓŸW¿ÿ%<ÁÏW1£ÅâþÁˆCÛ+.œ±¸³¹úrõŸÄpp×ý4« -‚e’ftAÉ‚d„ #eƒ$£Ì)ãËë®Ù·u;}FÒ’-c+ªsGP4 ÜŒ\H"A¬ ''9E*+ÕaW®Wëf÷ðXí®Wôÿûªø#®î­°ï~„“{6X8Û2øZ½¶õß•'Ç Òœ‘@—x®3<™@Z -ѳ|¨7ßÀò)­¾f˜K”`¼g¾+¶ßÀ|QÞ}sè2ü(CÆbsÂïá·bàG9@+ÁȧؕÍvF€-¥„ž²o/Š[”å¡jÛ·k »Èrýthš®¬99ÁCE‚Kbz¼ÈôØV9~”#:`çÆî·b„‚3kXh¤ŒðÁèÃÇ/?üzóùîæÓmúQÏ/VT"!Œ8u O=‚CÓ) ©EWµ´´YÂÏþ‡1}<Â^Ýìü¦ÝÙDŠ‡æp††È„“™£)F\EPAÈäT-oºprN»¯üTXúUŽ.’ŒÏÕ®®vá—Ŧ«;÷9ü²küõåPw++è‡*Ä4—cŒÖ»G 4rÙ=åP -±Æ¸°šž Yµf “â4âÙëËs/° áŽp;ëæp¸&zYµûfWZ2êMQa"RàÔîÐlÚÌÉÌ .U„½=-ÃÍ MíƒH†ЀV"Ÿ¶HlAí—¹ÞeÔ#Á㌎lm`*çô#)R4…“ûWÏõ ÄEÞ>œpÈ]ÜŒíó¾·ìæõš²ü~ÉAkzÎh¸ð Ãµ^ÃÞKÝ=ùÝdÞ±Z„FDs¤Z9µ`¤˜ˆ‚7ûàÀÝ x·Uç7Ž{¿QdT¥42˜!’òfÖîŠNì=,ÿç¦.ƒ Oá±wU¶¬{ΊA¨@B©‘Aÿð!zñ¨q—³&ŽÉTF(y¼Œv‘Q7D ê~¤1at -ÅÀyÓ5<øáª0” ¡kÄ0 1Ôƒé“ Ÿ§ÕX(@‡¸«•<_¥ ©bñtZ¥$ªWÃ#%GÆ}þÈH”9räY°TöFG~p‚ϱk¶à>ëŒ9À%µ‚€x>`3ÄhŠk“ä`8ı»§ºõÇ­}\‹ÙDú€-#D2xä‚doò ©pÌ®ÙpÉ™ßUÝ:\%qï^;w_ž@ìçlÒ†bE3cqûÚZ·Hõ×BRC€õØ^l#Ú}µ®­:¬»ÚxãåÉ–°võýÍ퇰oÞëMÂÿo¢º6dY‚ ÷ÀÓ†Wwm þž -¨)%%,O')ðÍäxV¬Í0äÜ™"Ó«¯ n}èŽ{d3 åàauI¥vM–`>p³X3Á¶Æn6ÍK>Ë35#7â¢%6Ñ\.íÉŽ;{dtÙŒQ%Æ:q90ƒÈÇœóK–cˆCM=°œÀ>éÀbÓ¬‹_>5mˆÏ!éÂj×øëÃñàµûç$„8Ù!nB”Q :„~ƽè¿w»¼Þ ÔÇ‚šÚú.²g>“+(P™Š`rVi=¹÷8*äÒø<Ú5Ùøó3¬‡Æ†®:þ¡¤µG„³KçºÍ~UÙ½+ï7Å:Õ_ðCŸÕ²ª¥Ž…-GXˉ+ÌÖL¤ú;ÿ £býnΨÖçXD4dTÕmç‹k; 2c/ó4l+J%½^*#!ˆ‘/Q¥¬àB~lqó`ÏõƒÄËmãµë7«MqßØÖÇÿ{ÚùÀ&„Ú~Õy.±c*ýûלqhpͨuBÔÌCT«—UÔËüç±ö‹ÒÚDÒ xŽ¿Ší~£P@±?Î?5èQíAëV–¹½ZÓÙ«E¨½B!š•Ü¸mºAõ͸^¾6GOÐ>5ÇM"v•wFvòÔ§’ËÝ©0©¸´Àk ÀzY³U² E# Î;/[¢Ê7¶2T’„ª±t_R¹eáΩPvá$r«æar ú(›Û=—Íí¢÷u×Ú™/TŽ¿mîs›U¼v/U(IàêÀ A¨]0Çâ_°Ô Ù€1:›@¬¯HÀÜu0;¡zÖÚ¶Ð`vÖÚCªyk'*gíuÎÚv°L2óÏ‘µ¡%Sª“³²%ªŒpck3[ÿM¤û-d×a¾ÊÇ è­˜Jv¶ñש4Kÿ Û¹Zþá5v¾©=u‹A‰Ôÿ2ÎÆ@C“õ†ˆ+¨†±JÓ³9ãS “üB;¤:cüHåÔôtÒÇJ„ºpd$Ê9Ê}PÓ)=9òó¡%v9ÜjýɬýòÅù! y˜Ô Þdít0á‚åã1ÕVΞùN)UoLZJoÆ.™† =7xõYÓ ©æM“¨œi¾¾% -ÇWÙ(|V¶> -Ÿ -—Â#éFQØV³ÁF24I°p¢¹•·ã€Æ×,v5 Ì‘ƒ­LOÜa7¶Gß‘ÈT|þò\lÜø –e³-ê]/:„ï"®¦Ñ8Ó¶ÚILj®tþ‘GSÁ ƒÆÌl»¹Ö>ûl(#Œ"0:ˆTóÁ,Q¹hÖ^ìrŸ!d»œ³²õ]ΩpÙ.g$ݸš¢”,o>û +œÁ(ÎeD¹s¢.‚‰Örš-w?ˆ‚óûa9Ńa9Åã\é~3Ÿ+)–ˆöm¹2¼Ã„$1}Å?[·MgÙÍþ¾X ]ÂHƒ®ÛVÙE£6ì<DóXŒDŠ]6±šZ£¯WÆ•=$`"ÍYÉÑ©h#$RŽ„}Õ?”-´ÛÆÄvÛ˜¹v[ Í´¸0¥£Jòi»mÂÇpíÛmãºFf_Í!Ü9‹uaß,srëF¥Ï%^êÍƳNßÀÔîܸ©ÛŠCˆneøæ­ïô-UYÛgó™gì_‡É’Í|Š¢!djEßô¢”³ä¨Ax`ëÓ sßÄ\C¨vƒhøß+k¿ž±4Qç%6ÉOÔ 7ÛDäC>óŸdØê ðŸœúÐ]`°[¯}OÞ”&‡*87õUöæŨU I5(šû“A×ʲ‚Ówÿø#ÍþcTn?EÒ3-4Ud¦2 -e‡øvÂ眧²ÿ¯îŒ—endstream +xÚ¥Y[oÛÆ~÷¯Ð£DÛ½_pžÜØÍqÑØ9¶sp€$2E[D%R)»î¯?³W‘ÒÊrQ×ËÑììÌì7ß,ÉÃ?2ICÍHŽ&bT¬Îðè Þ}:#Af…¦}©ŸïÏ~ú…©‘AFR9ºìéÒkMF÷óoãŸah*ðøöúâãôãÍõ/Ÿ.¯'Sb¸âãó/_.¯/®þ7™RA$1>¿þzþ›Ÿû21t|þéònòãþ׳ËûdVßt‚™µé³o?ðh;øõ #f´½ÀcèhuÆC‚3g–gwgÿI +{oÝO³® Q&iÆ”ŒAF:p†0H2Êœ3®Ï?_ú]Ý]ÞN`ûÿ…‡ûÛºåêÓ×Ûs»Ûû«›k»[ÐÉzþÅ#E˜3í”Ý/ÊÉ”9®g+7ã¶Ü<—?»Ú¶=„·ESǘ>m7¢ÇåÜ¿íÿœE¹î¼ä¦ž~~S—EW5uÄê¹—‰¿óÊŠæ©®þ +u‹°âïå«Ÿi×eQÙÅãªUm7h·ä}æ“ÅþÐ훓޾‰D†IÂVÆÚ†À¬ÇŒ‡Àé†($ízËò,HÍxÛVõ“]›Eó˜Ý\çÌo–­Ÿi»YW®Êºóz+Ìü:,b??jAJ%QHnnÌø®,÷ìh{fã¦Þ½Î¬þRŒGn ÖüÃŧ ¤(UÑÇÔý¢·E›x°E÷tƸ3xu}áGÆ?Î竪®Ún3뚟º-K÷º?û<«·³¥?F¹yÙͪe‹‚uƒ¡g1bͺ» 'ãü·»›ÓÉo³à;XÃäƒÿ¥›ÚH<•õþ»ì¸hæ¥'~Þ­ÁLß·J!¡`ì}ûÏß”mû~t'U‹MÓtój“³èHé’”nO*Ý]ȹ•JíÔeAŠP`Jzxø..ï>Þ^}é‘’ª ¢‡dˆbS* Ai‘L›‰“¾Ø [€M œ!… í‰ÌÒ`P±^ɦj|Õ…•ga5K©ì\8÷£YXz–l|.ëÊ—Y;½´À ö>‡_ZúdŸ/›ª›:\ "¦¹樣-ÔÈ#|€Á!pœõ=äHqªäÈkvœŽH€±´oã«Z»nê¹5!ãNðÆœf"Ì .UL{»ZF›Ašº‘\5¼õ$"Óz›³dM‰3š¾‡¬I +l)ÁÉë׺s‘·õÒp3ŒÏù.²Ë× Ð³±¥챡ç<$ >i`b3Ñãm˜{©º…ŸMáºEhD4WÁªé,ç ŒPDÛu8Üst«»uŒ&¶k?1˸Jid0!ýLʇAظï±l¯Þ'’ÕÿÜTó`Ã"l».Ë0åùá3À„Pj`Gð?> ö G¢I%â˜ìÛTÂÛhwB`p÷»RF÷S1h^vÍS ßØ/ÏóÖˆ3P0Ô³…Ÿ‡­n à3`)àú79J_*v¦‡$%Iíòª¿¤„·†è·—ŒB™%' † +ÊÞ`É €>Û®YÁñ)2á€#©—'›!Fi¯!ê à€c÷‹ªõË×b5‘°eL‘L>rKæ${×¹ +ÇêšïÚ¥ÃüSÙùÌUÀ/ 0û9[´¬h&"·¯­=‰/ ûB}ˆ–XqìÅV0E`Ыۉøâea)¬ùÎÈÍÅ—ÛjÙÙÆÊÿÙ©îŽg\à÷ Ó«{6€‡§8¥¤äDä)â$ß‘º{ÅÚô @î8SdvîkÂ6áXoºíÙJ@Ý}K¦À€~*å!Z1í×zˆVG t^f­0ÛŽÓÚ%+.YÝìãl»ìüE³ZyPêU].ý›4 glBÆ>8f‘3áp=ã—Ëæ%_åÎÈ8 M —+;Á²mm—,ƒO š1ªÄ^æUù€zÌ9?9†8pê^ä·˦ˆ·‹¦ øŠ.Œê&ÜXl7®ÝâlÜ”±—)aËMíz·ÛºÎû ¨>´iÕoU¾’+ ¨LÅdrQi½x¼‹þ.BÉv FîþqÀÄ ë~°@¡c' ?PZ»DX{îïÈÖÓ*Øîòz9+ÿ‚†[Ÿ­j¬#±åk¹8Gy ‰ç7@$FEýp,¨ö,<•m¼AØËŒòϪí<¹Üzél+°J%¿ž¢‘€bp–C +Q{¿döRèêÑ®ë‰Ç«Æ{×O–ËÙCc[ÿça瓵»QçµÄŽiî_<¼æÎ‡× Z‡~Ššã)ªULWUAÔÛüǶ +WË6&’Æ”€}ü9[­— ý½>çÑ^Ôêx÷ #«Ü>ÝM3<Ý=6Ò…ÆÆÁ(k8aü0WÃÇÞCÛÿk™·*endstream endobj -2078 0 obj << +2104 0 obj << /Type /Page -/Contents 2079 0 R -/Resources 2077 0 R +/Contents 2105 0 R +/Resources 2103 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R +/Parent 2102 0 R >> endobj -2080 0 obj << -/D [2078 0 R /XYZ 56.6929 794.5015 null] +2106 0 obj << +/D [2104 0 R /XYZ 56.6929 794.5015 null] >> endobj -2081 0 obj << -/D [2078 0 R /XYZ 56.6929 748.9271 null] +2107 0 obj << +/D [2104 0 R /XYZ 56.6929 752.3759 null] >> endobj -2082 0 obj << -/D [2078 0 R /XYZ 56.6929 674.5821 null] +2108 0 obj << +/D [2104 0 R /XYZ 56.6929 668.0781 null] >> endobj -2083 0 obj << -/D [2078 0 R /XYZ 56.6929 573.362 null] +2109 0 obj << +/D [2104 0 R /XYZ 56.6929 607.6906 null] >> endobj -2077 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F53 1017 0 R /F23 726 0 R /F55 1025 0 R >> +698 0 obj << +/D [2104 0 R /XYZ 56.6929 570.577 null] +>> endobj +2110 0 obj << +/D [2104 0 R /XYZ 56.6929 534.8112 null] +>> endobj +2111 0 obj << +/D [2104 0 R /XYZ 56.6929 503.6098 null] +>> endobj +2112 0 obj << +/D [2104 0 R /XYZ 56.6929 440.3004 null] +>> endobj +2113 0 obj << +/D [2104 0 R /XYZ 56.6929 370.9227 null] +>> endobj +2114 0 obj << +/D [2104 0 R /XYZ 56.6929 274.6697 null] +>> endobj +2103 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2086 0 obj << -/Length 965 +2117 0 obj << +/Length 2188 /Filter /FlateDecode >> stream -xÚ¥VMoÛ8½ûWè(+–ß"NâdS$N6v€mª-;ÂÊ”×’äßïP$]Ùa›CÀJ3o†oF$ †?’(0Ó<É5G‘,·#œlàÝ͈xL@Ùu±}ºfy¢‘–T&‹õÀ—BX)’,V_ÓÉããtvuûeœQÓ 4ÎÆéýdö<¹sÏÇš¦“›é|œÍs Â,Nâôivu™]>Ì®o¦³ñ÷ÅçÑtq¤5¤N0³œþ}ýŽ“dðy„ÓJ$¯°ÀˆhM“íˆ †g,<©GóÑ?G‡ƒ·ýÖX)¸PHP.“LP¤0× #, ÿ,çI­Ö‹’X½ÊÖ+;Ø{ì¶pÂ{äÂvzã)Õuó©)‡Ödš Î.â—R0aö8Pç]þðÙœRÁòJËx̶0‡¢ö©6ÆVqs€ƒýýåžîÇ*=/+5šIs†*8šiFó#à <­A1ãLÂl‹ -‡]ê¤ Ët·¯LçÌÂýk‹í®Ž)[Ä؉®m䘰%4ú¹®ûfåŒe³w¢hwYUf9 ˜ªHæÄêöMÝFâ1PmN¹Ú o`)<&Þ€‘"~Ú:p[+S˹óûá“q‡i[î*“ù¢ne:ì!š]쉔—kÄqnŠ-´Á¯ê«íˆ 'ñ¡rÖˆäZÿF:‘vç}6ŸN]œÉÝüáãf³Þ¿aüÀ0Hƾƒ}²tï”68NQ"hêâvvå¶jOjµ­LÕvÐK%Oåºt3Kßš÷®ý"/¢R†Y? >¾¾§u™¦m¶'‹6ÍiR`Ý}P,9*K^Inýõgx“%™¶ÏÁA€ˆ¢Fäpæ›ofd²ÀðGJ Ì4_¤š#‰X¬¶WxñÏ>]/³ B˱Ôû§«w¿²t¡‘–T.žÖ£µÂJ‘ÅSþGróðp{ÿñî÷ë%8y®—ãäËÍý÷›ÏnîáZÓäæÓíãõ’hžr"ÌÈIœ|»ÿøaùáëý¯Ÿnï¯ÿzúíêöiPk¬:ÁÌèô÷ÕáE'øí +#¦•X¼Â FDkºØ^qÁàŒ…™êêñêߣ§öÕ˜)¸PHP.KA‘Â4n/Œ°€ó/SNÔú`/Jbö +RÆ^ËÍüœp<Î9YŒ;Ú2E¶d£-µFœŠÙ–mY÷sFæ.ݦi{?Üo·Yûænšµ»ö›ÂOìú²©ÃËuîí5QÉË~[ ÷9×Ì”kD)Má F‘¶ÎWËUS¯_ŠÚK•—àʨFGxðVO AŠyÁ5#©3® RÖ5?œRBŒ$€Ì+õ£x«³m1W0…Ò4Uçu¤"Êí@8C©ÐdªÝã®X•bL kq|$Rn`U³#çÇ‘Œ1½e{˜¬ûr•ÏV „€Í—ŒªäiSú=¶û®w£g¿Pæ.?³ªÌÝ0o¶YY4°Ž[,Ý™96AZjñp•ël_yÂnÖð|ì"I‘P\Œ¡cÔ<† O‘¢X^‚”æ•a?Àf,u6ƒ”…Íî"lv&Ú昡™óÕ+Eôš † +°œ)6A Ó f°j æM03-’Õ&«ë¢rO¬¦vôº)l”±¸ÆÁ0Ïx=x†q¤Y¤ª²ë‹Ú«²nÚ  +l¾ò$cÔYÛ]›md[€×1ç#LDv“ñaS@tÊ•ÅE%ÇaJø–s4Ú+¸ï4˜¨BÄíy0¤Î€)HY0µ0i$"×l×euÌB’„Vê¼vƒTD½ ¦ä…ÉT¿)¦7|À„Hºfoý¶*Ü´! suÚ:™<ë37ë¼HE DT¿8‡P³,°TÓ–ÿX’'JÊ’;¿¦œÂËη ÆgŒÓ½ê@*)0•åNI’ºéÝÔΡíg™n"‹P! +*íð./~¾óçŠ$1•88˜ӬZü½/2wÝþ°D¹*~17þÐV¿† 2¶¨yh)®nçºè:wj¢¤É"Û•eÀ2Ÿ—®=]—õnߣÈ)•©Ž(™À ôŒœQHÄxìÑLLÇùÈg œ6[õ…±Ž†µ†—lÝÕ,Xù9àˆRŒE‰MfƒñMRÕÀ´³p¶@3F„ª®Øe/¸ßwEîfÊp‘ånÚÙ6”=Ö?Ö&rê³<·GÍ*'þÜ;R®<‡’Áx ƘŠHåË:7I9@´ßd½ÛuæCxf}èÎO¡—©b3Ôoš}勵gŸrÍÙOšºœ%´±ÔiB¤,¡u±ìˆeƒ…²v­»lìJ~*ví[älì‚•)ÑóØ Ä“®èඃ浶å”®gûO‹YF¡^Äú¿C>@ß ìàËv© °•ùñASúòÀ½ÓÏUðbÐK²ª §òsî @˜Ïʽ¦®Þf9èP=šJoöð ã¯Y…ÿ4¶É|¢*ç­`ZáRñ‹/£ìq=ÖPŠA»‹¥4jBM‚Ýg›Ûßo¾<|¾}Œœ»W8q­Õ“ùNÚx•ªªyØ”CÞdš\HèÔ$¡Ê}s\º‘G*Œj/5ÇÞ©°…†±â˾µ=Ø/nÖS¶ƒ•mº”PÖ`jØr £éñ¿¥Ä8xÞRK0,¡A+MÓd†™»tÙvWE) Æ&¸6;ÇûÅ縶;Øo"Øt­¯Zv ”å®Ãœ'?l¿pÞ1MJÛT]Œ5µ) ¹ØlY †DŽš†/h$EÖézˆ@ÿÖèÜ{‹=ûÃ8gšÐ0we’(%¦´“³†¡hû€ 0x1/´×óq‚8i_m(.xâ"r†Ä•j}:‘pÃÓ8{¼½uûÜ|~üz9ØÌêb(¿à ȘbôÀv$mW¤Mû ¢DÀÔû»ûþ#’W*ßBÿÚõK§’oÅÚVõʇæ~ÇKÓRÊIÞ=¢iƒ €ÙÄ.7ߟþõõÛeƒÜÕЎׅ§ÄGûÕÄóßè5š¶/÷ÛS?ÑÀ†æw•HVŃŠÿ÷Ï7‡Ÿ© ÊfJÑx~f˜ A)s8ÂÄ\uÁ òV€µcÝÿ* +zendstream endobj -2085 0 obj << +2116 0 obj << /Type /Page -/Contents 2086 0 R -/Resources 2084 0 R +/Contents 2117 0 R +/Resources 2115 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2091 0 R +/Parent 2102 0 R >> endobj -2087 0 obj << -/D [2085 0 R /XYZ 85.0394 794.5015 null] +2118 0 obj << +/D [2116 0 R /XYZ 85.0394 794.5015 null] >> endobj -2088 0 obj << -/D [2085 0 R /XYZ 85.0394 687.41 null] +2119 0 obj << +/D [2116 0 R /XYZ 85.0394 400.4859 null] >> endobj -2089 0 obj << -/D [2085 0 R /XYZ 85.0394 561.6045 null] +2120 0 obj << +/D [2116 0 R /XYZ 85.0394 274.6805 null] >> endobj -2090 0 obj << -/D [2085 0 R /XYZ 85.0394 501.5525 null] +2121 0 obj << +/D [2116 0 R /XYZ 85.0394 214.6285 null] >> endobj -2084 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F39 885 0 R >> +2115 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F55 1035 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1187 0 obj -[694 0 R /Fit] +1592 0 obj +[702 0 R /Fit] endobj -2092 0 obj << +1447 0 obj +[702 0 R /Fit] +endobj +1198 0 obj +[702 0 R /Fit] +endobj +2122 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj -1598 0 obj << +1627 0 obj << /Length1 1628 /Length2 8040 /Length3 532 @@ -9354,7 +9515,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅå‘æ‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ -Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.SEM#¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 +Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.SU}9=¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 @@ -9377,146 +9538,144 @@ $O t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•Ã¸©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6붡²BSHQøר.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôŽ±§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ -*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿÐ$õ»endstream +*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿFsõ·endstream endobj -1599 0 obj << +1628 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 67 /LastChar 85 -/Widths 2093 0 R -/BaseFont /ZIFUNW+URWPalladioL-Bold-Slant_167 -/FontDescriptor 1597 0 R +/Widths 2123 0 R +/BaseFont /ZJTCSQ+URWPalladioL-Bold-Slant_167 +/FontDescriptor 1626 0 R >> endobj -1597 0 obj << +1626 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /ZIFUNW+URWPalladioL-Bold-Slant_167 +/FontName /ZJTCSQ+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/C/D/E/H/I/O/R/S/T/U) -/FontFile 1598 0 R +/FontFile 1627 0 R >> endobj -2093 0 obj +2123 0 obj [722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ] endobj -1579 0 obj << +1608 0 obj << /Length1 1630 /Length2 6133 /Length3 532 -/Length 6981 -/Filter /FlateDecode ->> -stream -xÚíVuTÔí¶VA!¤†”ºQº¤»{€!f€J¤SJº !¤‘RBpé–NI%‰‹~÷;ßYß=ÝsþºëÎZ3ë÷îgïg?;~ïFZu-Ik¸%DCrpsr‰€t4õÔ--¬¡pe)¸£µ"ÒÂtñ¥]!H(&c„ˆ€ô Ö ˆˆ‡Ä-,, `Iý\¡¶vHó  û_–_. K¯?‘›HÔbºyp‡8 0ä Åÿ:P !í ¨#$­¦n ¨*b–WÕÉC`×›"ÔÝ,¡V e¨†€°€là® Ç? +8Ìú«4ç —$dB8C¬ 7aO+ˆó/ˆä qu‚"7Ï (dëjCÞô AaVŽnÖ¿ÜØmà¿9»Âo<œn°2u8‰°r…:#A7YÕeäþЉ´³@þÊ€ÞÀ ¸Í§5ÜÊíWI¿±ši…!@Hˆ'òW.KÈŠpv´ðºÉ}Cæì -ý-à …Ùþ¥€ä -±µpµv„ 747Ü¿ºóW ªÞÂÙÙÑëw4ü·×?4@‘ˆ£ '€›ç&§ò&·-ÿZE˜ ÄÍõ‡ÝÚÍùOÌâú»AÌ¿v†åF„…5æ貆ØÀªpäMJóÿnÊœÿ¹!ÿFüðd¼ÿÞpÿ>£z‰ÿÝ÷ùïÔrnŽŽªNßA ?ï2è×EúuÓ@­þGŒ…ÔÑë_EýÝSò‡Ô_dÇþà–„ÙÞÌ„C˜Sø+!õ„X«C‘Vv  Ç›ný¶ëÀ¬!®ŽPäfª¿ -âàæâú¦mµr€ýj?ÿfýwí7ƒú­¬£©¡¨,Éö¯o×ß¾ê7[€Ôör†€þ;‘ž -Üú‡_LRRpO7· ˆƒ÷F7— /H˜—ßç_dýMÄý×YÅé -õqqrqqƒn~ÿüþu2ù,Ì -nýko´0ë›Uû‡álåæêz3áßoÿMáž/=â ±LOÀ­DƒíS3ÒUä9=ý2F:¸1zBœ‹k´_çûWÀÛýRÃ…ËÌ/*C8kE®š¼Æ·/W•X×z;È·'Cöò¨|èYÞçÍ3½d[ ›ã§}Õ‹òÞS^À4àÒ][ê×Ð4-º¸|Ç늽ÊâOïžïOÊpâLàk•òöÕƒÂÚ[ÄUÛ_™6OOwõ}ìén?¼û~•’-û£¨;&>S¤¿K6åSCRÙò·ª·ãòŽXXðð+yÏ—×ro1XçFèÅR61žêDžeâ§Á ×^‰mùkT³ïT ¥ØÜ KCvá)µKö±éû¬l´¾úï.ú¹üA¢IὬ}‹xp—ÆÌ:…x÷dlt×VEæ¹®ëºB4ߢé:°h`M$z¯=Ä*óù ?7l &?QäÔ…ÚvÆ<=yÊÙûÃ㎣²=÷'ºçä ÄAŸßÊ}gw‡U¸'b%6—=\5Æ„¶O€X)Ô| 6*˜Ö}ØŒôDVs§Up ˆíbëÞ­×…+Ïo_MX`êÁWÉC.Âß6¼|í½ÏÊ)¥2ÉP0–b®G+kGõýZŠÿåÆ~+`çÑáËé#™~KˆjîβÍ5—‚ ÿ3zë5½ó-o'‰ŸžoJ| öñ Õê…k¯Hî÷’ô¿/üž“â«7Rîõî°F˧€NÚ´…”QOÆYÃÃöLNßÆe‡··Q&8LëÀ…cÙ Õˆ€éëèqo£F‚®ºqG’*¦²óà‚‹¥"ýbmÍHàv{(Ž?ªÍü-ë&wU¼m_A±FÀͼX[ÝuÞ80+l8]ò)áß½WMœ½RY.þä© Èóqº:Âo£ù¶ãí•MÑJôßY$‡‡Œ’`$íŠN î÷Þ×ó¨‡caíó )¹ óSçãa¼&ßi·õã¬P2ó§Ð„]¬ûãð#l3oñ{´„îªÌ ÁºqÙhiµGH‡:!F[ ŠcÙX±¯Á,þÙñ°“ŠÊP)½±×3 gwµy—Þ)¥åB¸*!œˆ—ÕëLwÑÔëe5íÕÄÆú¦d„’ÅÙ5jY®yr!Þ8RÖwòd€éî¨h:³ìç” Œ”´¹©¦úa!ǼÆêëÝSY·ÊhHçú—J§=\½ WšbN,8‘T‚Y³0©ÝZH;V$Ìëü›HÙñÙÞ¦eÊgTr>R‡>Ó£*X¿l WTh‚ˆsÝÍötº·)tÊ`D"ŒN€d÷¶kÅŸ×Ë)~>;ûHé¬\ýÉò%Œæuj Û²!>2M¤ |N¸»OŒÀ¸Å~Hª´+ˆ#Å"QÒ µl’9’kСA}S÷†né^W©]+žSüÁèû³,>VsIì)Í’©^ cFièr}Ú]ÜAƒŒ±9“"³ºÓÜö1x«ßiëÍ‚5ÃèÕp:¯©+Œ*‚_øˆ'û´”eÞW1qáÊã»NÞ`Ðß 'é »Îk+ñKÚ+ŸQÉ8¤¿'u l(-V;K!ªÆ¹áK‰IúäUW‹ÇtÎœ%6QK(ŒžJAÿÝëáæ…\™F{3dk*ƒA¸Äg5’òœA±ë¥ÙgwA•,Ï\÷3jT¢÷Åɪ™œüRÅy÷wF#«(Ùá²Zá”Y„FÞì¼\>LÉÈäAÝ ŸËi6ô¸ý•dèEͤ„ o€8qørŒ0m+êñûƒkŠ a6u÷} ÓÁÙ&Qûó©„rìî:?†:è -ù£ÜÛõŒÚGa¾Tµ ˵µ;¥¬W~òn+–lO­4 o¥ø!=ËMS¸âØ(kb¡,D ZÆ8T'p—.ø;2S•cf‘¦>dÇvË%·*­7 }Åçj£&ã—6Y”«Dd¥×VÑà›lh`2爙0#·êZ=4í%牵7h%Å Y$Zü¬ˆv±?‘©‡É=áមð;Ïcc„—÷:IêÖá°5ž’”ö×yÇUµD2>ÃÙ}ÐŽvk2š>2òQ× ›yôASLPkQ¡âZõ>×_À -ZŒvR¸pdÎ& QºÒàî¯E¦âx|E&ù'Ar0Ëèh" ’çÏvÙý½Ï»ÓçêßV¤0²iRÂyO„jßÌé&šH¹£(Âμ4™ -V1-S8`_3D ÝËúÅ7BëbØ r¨Ãt©aÊÓêغ0‰¼•5ï´ñïâ¨Î)9É@[gbL¦')Ä?Ê„ãÐ÷*éT“꟱Eê+ãIõ_â‚R§—«·>noߢiŒ!L½<©35¢$2MIÝs™ôäu¢¨bâ8 ûVÇÌšDT£ä¶"Q TFÉ…Cóuø9dcÝI¥Z’f@A -»<¶ÚL9’00#†ô}à…ê¬ëè¾>€à)†fbˆù†7sÑ¿×ÀÅ}ä׊³ÒgÍ¿?FІæNP˜ké÷2è´à2|Ö§™¥£[¶WDMåtè3?èù:28¢È;Xf1S§³EŠ$´×å0Ä0d—5ŤÐ4|ybæ)OÄ|˜léË@Èu±}µ\"üSÀd5ŒÃkùp ü3ʇ×Î -+˜^p€&9I‘òÝÂcJ-Ù.Eâ.ÂÄSL”„Ä`4œÚÁ¤7\N>frÖi¼ÝÏPüTì,1êÈ@^'èMuèï\ ékJj§^ æü12Ït¦ˆLVéøŠ>iÜ猆ž=ZƒÎÈVO(Îʾu™÷ѶÏÐÔfh=}̹öm{âý”2¶£ÆI±»põ-¾¹+ýZC—±­ËôKo¹‰nÞ”×|ßòË?mztÖ9ÖåçÄe/°¦Õ•äÂúö*~”2è½ÞQšKþ´$Ï*§ú·æøšÿ]íùu¢@ñÁâ°ÆÈzúçîߥnK~£ÒwRdˆµU -”kx±saóÝÒ÷ÁÜ÷Kk ]ö¾ô3 ·/*ÉmÌKgƒwõÇ–ˆýIô‰ù¤ŽòŒ¿Ù=a£ïe€üvû# }Llb9_ÚEƒˆÓFHRòæ›=ë­GýTùH:ñ9ˆe¬ù6PÃ%BÒ§4ž£Ò.n+¿ƒª°ÿ9ÌèÙïc‚4Ã_gÇÓ¶ú‰s+>傹»˜‡¬9,Épª½è!׉·ïhuF ÒiU2Æâ-A6L;iY­"Û ±+hô3…RÝOïi¦¹Í —Š‹ä©ˆÏHžn5÷ò”JDýÉ›³¯pôÝÞó4ÇÃøJ~t‰•|§›19äÚ¸N±)¸}> ˜5.¶5Œ¥¿þ“ <ö¨õëGš±×1{!•Å²ê3‚A-üMÉcÂ[ ×%Üû/¾¶°½9oØPO;fiv±}½•@ÃœJ#(G9j>2š?¤Æ ñ?~ªÑWåïBç¡ÛµO±B¥™Ÿ†ñúÃ&e“v”3†­ÉÞ&™<)ïÈxbý'.¼Ï\Ì_³Ÿ±‡Ý'0þààõªckêUPe¤cne„žÁVó“pÜ Ê½ö>ÄÐ -½c–î3Ó5¬´0ÏÚEdÊŒƒH(‘©,ðÉôä‚Nnád¥,_½ù°/ä -ecŽ¡ñ³b2•ßÃÄœ¯ît¸âËA".0mÕjÛ;÷$èÓ#Ó“]Q;Ò­vü‘‡¦ýO ¢Â{'ˆÈ‚1N ;$F_Õ~@Ü©Jw“+gfCš§¸Aëßå~üv»s=í,€–ƒÔÊ‚ü À† -ÈÃñôß[Ƥ7œàÀfIŸŠ¿iÍPŽêb FDt¨%Sc<ØCÞ±‰¤_¥}#툎~áß\°ÕÃjC¾35𮾌ŠãÖEf˜ä÷q}ÔUp¬$Ú¿•×çyD*û*ݷ÷î@òQŒÞ7¬â¢¾yçã,£êìª%É0®š¹î³È6¸½}ˆŸ^½÷s®Ã´ÔøÛܪ{‚€79»#¼¸ùߣf²sË©W½ørÄ(€Db^Ð*A|üÙÀø乪“ÐzÜÙ™N>uêתͲ, ¤Õè/‡üî¥IM€©*õO ÀgÆC”kìþ‡•Â—•ß×±GJ«€ŸVp+;çÔñG—ó±Ð¶"u¢»}e/—¤ÜbÎò7žÖ®Œ•0ð¥ëŠ[Fv7íXëÕ5Ì›ì¬É„Ac_ü¯ƒò{LEÊgL®ç'õÇlÒé'‹½6I Þž {Ÿ¯¬iëdºOIi옂-i©Š“b«U«B굦 HìK¹cÈŒƒ´úúipÏÈêµE[ªOâáÏx’"‹V)úÌZWïŸÖ‡ƒéüL¯Pã}<ÇY:{ˆÚ%~Ëõ( cΧçƒþCN…ˆ§tO&Žç„V™(7íuq›]©&Ä=5Þ¬£éÖZìržOÔ¯énuÏ)§†£9‚¨¢ß–Eä@Šz?»a`Yû äÄ Vnœþ˜`~i·R‘öÁc\Æ—ïî§%DJ^Ÿ£h˜Ö„ýΨڦ·.Jú«ùt…F^ÈòcXþ3OQ¡d϶0§,÷”Še&uùÙ¾ˆï‡OÄY˼zõ¹Wô,i9d•0nçvKîhQ"K•Q¾Zø@0M¨âÒ¤xÑRõ†‚›ÇŽ$J­´çwR0ˆ+Û6UÕ¾/שM”B®±XÆçÅÚ«'ªM]D›„]ÊQÈî]Ä-ucIg|ÇZÙdŽg>ÂŽï|ê™5È(ü…ëù®êè –ÄмÂNЕë4P“÷ÞÏîèÖ ‡8—‰$—ØBt¹úÑBCšÛöç™yxWûãz×±ÛýD0ϛȘÅñÅ„oJXOWi öì»×.çä_MàSgDd]ÞíR–}Áõ÷ã¶ÂŠ”È[¤«Ý†\~‘_ZÞ}ÕRë\à=cÆmï¢æŸH4Òn˜ ®/™Ë[ßlÏ¢œ\mÓŒ]Ë; 1ÐBVû \±–·´åµ‚µ¯ÊN*I"/ïm?áIÂÙNr©ä —ë?>}7›ùâžàÙZ˜æñ`kËG.¯–*O˃åé]®$£lì©VÌú‚§«/]´~è µW,=ÖÞDÞýQ C96­DñtÏeŘ'”V[ĶtûPðôÝûîú@ò$Æ.ƯúÅœï}ù½Ï *[7›#lUÊ[“|öÄcÃÅšgêDE2_¡ÃMÕ^}üÆkOÛŒäCã±åSPΟZc¯\ð̸™ð '-ÖÄ®1švÆeÐË“=û’Òk÷Óc½æÁ×í%ƒ‰á½: °C¹Ø\Ð`]“˘ˤ¦¸Xºr©·! îη¯Œ_‰_Tó¾ -Ÿó/°Kê¼-œ [—¿çÃq-øz~Ii‡³®>ëGGÈF¶Üšqˆ‹¢À¤^Ý µºÜzœòŽLy*Ø!$ëȯ²È¿Äøý9Àõ—x»Ë+Jé.Õ­”÷yKr¬àKñnD$ïÇÇûùSŽ¸+¹ºfS4æHõ¿ÞzyàÂ*/ç%Šâ׻͠ÏØõæãmº'7]ìå±ÅöK)ØÑÁ@£b…î\çÑÄÝÊ‚×[g“©»U©«ÅÖ¡’v'¯ÔíÌ¥ºiMD?3AqÑgœ‡ ÊŸ¼ίªóÑÓ3NoTšv [YAóOL®·´MHËJ°ý‡ãĬí«å Ä\]NG”¤;F¸<D†ŽR›æ.MÃ>ÂW5ßÏI“1øi^{Ñz·ö´·‰¾¯½bÅ=YV6S$øqr,påÑr·¦s<Ýþº•l+¢dÙôú~«ÉR1xøà`äÛÔ€²K[å.Nµ;ãUûŒ2ó¾jÂÓ’D€Ì»«™Ï5o~"Çý'…|¤0i"í.>_0'BT¦ž¹{Ñ`IíJÓ(`ÌW¾­ÇaKPÓŒSÃ$(L÷8k•·ýAcc·òd3–âm¸L>b@”©k?OÙ#ün*3oÄHóÉÐàCíúd“GW;¯y‡™¬.÷Ì¡@Ðñ}“à¤Ô-´ý^½R¸'EæòÑ¡wuº>ó<5{Ž´€KÃ7®Ì[NŠpÓèªÉš•Q•Ýk|}kÑçc(?72•­ã»9 -Òí¸FúïšyË«mn£°MWÑl‡ög2w™SçäSCþ¹A¡‰&Š²Èkª|3Ø`ê‡ÄcïÑ+Ó\ºŽ’3®óø‚ÿVŽ W$ÜÉÂÕð_0y§endstream +/Length 6982 +/Filter /FlateDecode +>> +stream +xÚíVuTÔí¶VA!¤†n†n”.IéΆ˜f(‘N)én$†FJ Á!¤[:%•$.úÝï|g}÷üuÏùë®;kͬ߻Ÿ½Ÿýìø½ki5´8¥¬á–y8 ÉÉÃÅ- +Òy¦§aáèha …«pJí•Ž HÀÈ(ã +±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå +µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`Y=ͧ +ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK +ïeë[ă»4fÖ)Æ»'c£»¶*2‡Ìu•ÙÖ£™øM×E;k"±{åè!6ÙÏgø¹a1ù‰¢§.Ô¶3àéÉS®Þ?pUì!¸?Ñ='g€$NúüVž;»;l"=+±¹ájy4&ôøë´}‚ÄÊ¡æ °Q™Ä´îÃf¤'²š‹8­‚{@|[÷n½.\ex~ûjÂâSÿ ¾jrþ¶áåkï}6KiÕI†ú€±s=Z9;ªîÕÒ/7ö[;_NÉö[BÔrw–mF¨¹]žÒ[¯éÇhy;Iþô|“Pâ±_®Ô(\{Er¿—¤ÿ}á÷,˜4½‘JÿШw‡5Z!tÒ¦(¤Œ2x<κ¶grú>0.;¼½2qøÀaZ.Ë©EL_GHx5tÕ;’T1•\,ék?‹n·‡âø£ÚÌßÒ¸nòTÀÛö• +atÜÌ‹•±Õ]ç°ÊÁ†Ó%¿2þÝ{ÕÄÙ )•åŸ‰>§«#lð6šo;Þ^Ùû¡LÿUjIpÈ(F²Ó®èê~ï}=z8Ö>ß’»0?u>Ægòv[?Îú 3MØĺ??Â6ó–¸GK让Ƭ—–Q„tÈ¡f´µ 8™ûÌ⟠é?;©ª•Ò {=ÕtvWŸuéR^.„«È‹zY½Ît+@½^V×^Ml¬oJfE([œ]£–å›'â#å|'OF˜îˆŠÖ¡3ûÀ~.IZÀH)L›‡jªrÌg¬±Þ=•u«Œ†t®q©,xÚ3À-ØËpõL܉'òA€ªC0[&µ{C iÇŠ¤y)>û›çeLcÑ%/³FTU§€ÙÕô¨5« ð +½’•sJÜkŒ "êC 3ó®cUÉÙ4eHÎH~0+¾÷ìEÑOÁY^€ÝˆF›ÍŽTU§h§D´çéíçǽ8IÉ{éBDWžñ»ïÝR±FêÏVë®fûÆʦîíqßÇ´L…ŒJ®GЧzTÅ‚ë—âƒáJM î;£2þñN÷6…OŒHâÑ ìÞv­øózy¥Ïgg)Õ‚«?Y¾„ѼN-áf_6ÄG¦ ‘”Ï w÷‰·8I•w…p¤Y%K:¡–-@2GrMú 4¨oêÞPÀ-Ýë*õk¥sj€#}–ÕǪq.‰ã!Åp£Y2Õ tÌ( ]¡ÀC»ëƒ;hbЀ16gRtVwšÇ>oõ;#m½YÐá³0zuœÎkê +£Šà> ä>-e™÷CL\¸³Äù¯“7ôwÂI:HÁ®óÚÊüÄRö*gTréïI(J‹ÕÏÀÒˆª1!øRb’>¹`ÕÕâ13W@‰MÔïÒ335,Gƒ÷î Ã'V? 9ZŽfjW]èUªŠÛ¬[ßÑY@ÞCLAíŸjÙÙ*+òæÅõÁÉÏ5~šj}‰Ûy]ç¼cñvË‹ Bxi9]'±|¤“²w/±2X®‹‚8w^+ÐKºDœ~$ìl‚Ý‚I®J5`žV¯ipw/¢6’ +}ˆçã õF´£ögºts£ng]á„Ö|Õ`ˆksÕ8;¾Ï»´²?…&@È™!*¦54[«*/„“¶sÈo?87Æ…ÑS)ê¿{=ܼP‚+»Ñho†lMe$—ü¬NRž3(Þc½4ûô.¨’õ©ë~FZBô¾Y5““_ªßþÎhd%\N+œ2‹ÐèÛ—ˇ)™¼¢{ás9͆·ß¡’ ½¨™”qá 'N_Φíc%}#0~?3¸¦fSwß2œ]aµo1ŸJ(Ïá®óc¨ƒ~ P ʽ]HϨ}æKU«Ù0¼Q[»SÊvåg à¶"hÉþÄêYá­ÿ/¤g¹iŠWœeM¬”…¨AˇêžÒGªrÌ,ÒÔ‡Øn¹äV¥õ†¡¯ø]mÔÅbüÒ&‹’j´¥‚LsNù£97œ{xØ4()Ûó’:ÍÕJ QɉÓ4âQxŸ6êw´êú|©:T™$·Ü½Ê·ƒµ +Õý‘–”øц1öã9ã^Ìæ‰ÍDqfÍEK–º¨ÖÆ¢ñ—Šˆ™b+oŒÝ-.4‡u˱A—†„‡ÖŽñŽ\ß·ì$&ªH=ˆð~„v^f-ÔpžYÆSD“Ÿó=²AŠ5bµXî òàGzŸV·å|ñ¯¬ ôùÜäµqFÿ‚Ox·Fšk†dMÎV{žPzÛ`%õÅl˜m—eYqªÆXÿ»t›y_o‚*…»”ëü`8™dÈWLUeÛ|êæl UltŸÙ|¹»Dl3Ö£=ÍÒshí.‘È/œxK÷,,AãaÓ¬)ŠWtíB²J*=Ý{†!f»Rq„mÃoœ5¤pìhrßµïdé0æÀ&øyž•Š÷Ïï[P-qµÎ“ `ýB!aþa`Wf +pR°‚šL\(hG»µM™ŒüÔuÃf}ÐÔZE¨„V½Ïõ°"„£.™³ÉJ”®<¸{çk‘©‘IþIü€dLÔ2:šH“äùÓ]ïóîô¹…z¡·)ŒìÏ)á|'µoætM¤ˆÜQáŠg^Ï™ +V1-S¸`_3ÄÝËú%6BëbØ r¨Ãt©a*Óغ0ɼ•uï´ñï¨Î)y©@[gbL¦Ç)Ä?ÊDâÐ÷*éԒꟲGê«àI÷_â‚R§—«·>noߢiŒ!L½<©35¢$2MIÝw™ôäs¢¨bâ< ûVÇ–DT£ì¶"Y \FÉ…Cóuø9TcÝI¥zÒ³€‚*lõ™s$a`F éúÀ µ (X×Ñ | |ÁS +5ÌÄ÷ o榯‰‹ûȯg¥Ï.š%~2Œþ  Í“ 60×Ò3îeÐiÁeø¬O3KG·l¯„šÊé:ÐgyÐóud6pD‰+v°Ìb¦N f‹Mh¯Ëaˆ>.`È.kŠI¡iøòØ"ÌSˆå0ÙÒ—ûbûj¹D䧠Éj§×òáøg”ŸV0½ÐMr’å»fJ-¹.%â.ÂÄSL”2 „Ä`4œÚÁ¤7\N>frÖi¼ÝÏPúTì,9êÈ@^'äMuèï\ ékJj§^ æú12Ït¦„LVéøŠ>iÜ猆ž#Z“ƒÎÈVO8Îʾu™ïѶÏÐÔfh=}̹öm{âý”²¶£ÆI±»põ-þ¹+ýZC—±­ËôKoù‰n¾”×üßòË?mztÖ9ÖåçÄe/°¥Õ•äÂúö*}”6è½ÞQžKþ´¤À&¯ö·æøZà]íùu¢`ñÁâ°æÈzúçÃîߥoË~£ÒwRbˆµU”ox±saóÝÒ÷ÁÜ÷Kk ]ö¾Ì3I·/ªÉm,KgƒwõÇ–ˆýIô‰ù¥òŒ¿Ù=f£ïe€üv™ý‘‰>&6±\/í¢AÄé#$?)ùòÍžöÇÖ£~ª~$øÄ:Ö|¨é!åSš‚@ÏQi7KÜAUØÿœ fôì÷1Ašá¯s`„i[ýĹŸÎzÁÒ]ÌKÖ–d8Õ^ôûÄÛw´:£é´* cõ‰ ¦´¬V•ë…ŠÚ4ú™B©î'Œ÷4Ó\fKÇEòVÄg$O·Æš{yÊ %¢€þäÍÙW8únïy›ãaü%?:‰ÄK¾Ó͘ro\§Ø‰Ü>ÊßÇÆÒ_ÿÉ ž {Ôúõ£ Í؃k ‚˜½Êb9™¡ ¦ä1‘-kˆ2n„ý—_ÛÇØßœ7lh¤³6»Ø¾ÞJ aI¥’§5ÍRçƒø?Ñì«òw¡óÐíÚ§X¡‰z–Ÿ†ñúÃ&e“v”3†­ÉÞ&™)ƒÿÈxbý'.¼Ï\ ,P³Ÿ±‡Ý'8þààõªckêUPe¤cne„&žÁVóãpÜ Ê½ö>ÄÐ +½c–$îSÓ5¬´0ÏÚEdÊŒ0ƒh(‘©ðñôä‚Iµ±¾»Ú» :—2´Ä!<|^Þ‚X2›/¾5obÿd¬ë¥KºÃwƒø‰Õ˜ÞMG0C&ÊØjãž;áÔ+=ÃÜãÍEXr#à]Cg "}Yá¾.¶aýìY³ÆIˆ/^Y»}$oί8 lU†ø„=O'aFX²Åï9hRÔ¤[ÞÞ[ù~ˆ[ró—M~“j…<·ÑVG½‹Xî//¨šá‹ÉVà²hÑi·¢·æÉå6I?,·%F\œÖô™–@êõ~ø†Yý E>eUλGwü^‚}« 2ë$¶Íð‚ +ïcñ•ñZ×™b”[DÌÛ³>Â&Õ—ÂaY Kê{@”¹¸’QeUSæX6»ð¯CvòàªÇ£hœ½a¢ª§é›ßôóƒòêªÎ1‡(‡(-Ô±ßV”ÓyCC..& +®Æã +7/ƒ[\ÉcçtFqóÍÍhF4®¾¡õz»Bö¯ ÐØóÜE™Œ® #ôÃëÅš[È +ŽM®Aµì)ÅŽ¡ArjgWLØ;'·p +²RV¨Þ ˆ|Ør…²1ÇP‹øY1™ÊïabÉWw:ÜNñå$‘œ¶jµí{ôé‘éÉ®˜ ,éV;þÈCÓþÇQá½DdÁ'†RG£/º÷ê‚*8VŠí_ŠÀÊëó<"•{•îÛá[w õ(FïVqQß¼óq–Qõ vÕ’Tw͇\÷Yd›fÜÞ>ÄO¯Þû9÷aZjümµ=!À›œÝ>ÜüïQ3Ù¹åÔ«^ ü9â@"ñF/h•>þl`|ò\ÕIh=n‚ÜL'¿õkµf9VÒjt‹ƒS~÷Ò¤&ÀŒTú'§$à3ã!Ê5vÿÃJáËÊïëØ# ¥UÀO+8‹•sø€£ËùXh[‘Ñݾ²—KÒn1gy‡OjWÆJøÓu%,#»vlõꀖÍF¶d À±/þˆ×Aù=¦¢å3&×ó“úc6 éô“Å^›$oφ½ÏWÖ´u²Ý§¤Æ4vLA‹–´TÅI±ÕªBU! õZÓ¤ö¥<1dÆAZ}ý48Ì3r:AmÑ–“xø3ž¤È¢U +ƃ>³ÖÕ;À'uãá`:?Ó+Ôx`ïq–΢vIÀr= +ȘóiÀù ÿK1â Ýc‡É…ã9áU¦ÊM{]\¥fWª OÍ7ëhºµ»œçõkú‡[Ýs*©á(DŽêƒØ·eQyУ¢ÞÏnXÖ>9ñB•§?&X^`Ú­T¤}ðØ—ñ组ûÆi “R§×ç(¦5ác¿3ª¶é­‹’ùj>]¡ƒ‘²Ì ËÊë)&œìÙæ”åžR±Ì¤¡0Ûâýð±[ùW¯>óÑ{EO“–C6Q ãvn·äO0€%rTå«…„Ò„û(.MŠý!UoH!¸yH¢ÔJ{'Eƒ¸RñmS5íûòÚD)ä*‹eü^l½zbÚÔE$±IØ¥œ…ÞE¬ÑÂP7L¶Áw¬•M–x–#ìøÞÈ'žYƒŒ"_¸?‘ïªjy@ Í+ì”]¹N5yßéýÜèŽn rJp›Hñz‰/DW‘k-4¤¹m^‘‡gq·3ÿл¾ˆýØî((ŠyÞ|@n Àœ(–Œ/&|SÂvºJK°gß½v9§ðjŸ:#"ëòn—ŠÜ &¨¿>P´DÁ"]ý6¬àò‹Â‚ôòî«î”Zçï3~h{5?øt@ú¤‘vÃu}ÎRÞúf{åäj›fìZÞ‰²ÙOàŠ'°¾¥-¯ª…|U¹ÐüpRIyyoû1oBÎv’K ¹\ÇÌ|ún6óÅ=¡³µ°gǃ­-¹½Zª/¨lÝ4nlŽ°U-oMôÙ“ˆ o:œ©Í|y„7MT{õ ¯=i3RÇVHA9jQ¾rÁ3ãaÂ3œ´X_¿ÆdhÚ—E/Oö\ìKɬÝOõš_·— &†÷ê$ÀuæbsAƒytN.`.šâb™Ê¥܆€ð6é瘯l¾}êÈg|ëwRŠžhXŠs×L84ØGê} 1Y³mgzÑìÅÓŒ$»9ñNh‹Í”ŸâÕ÷ºXsm{Ôg"'H±¨ª®RU\O¹<Š>ÊlSñ" + ‰ôt.CB±|…—(z?п)|Æö…›‡8csa4«ªy=~U»+jð*Ì8Ó“«&ÐÐåÇw?´,IpöÛ7oå¡#½Ëõqw¾}eüJü¢šïUølœ]Rçm‘LغÂ=Îk¡·ÐóKJ;œuY8:B.²åžðŒC\„0&õê®X¨ÕåsÊ;2•©`‡¬#¿Ê"ÿÿátökä÷g\âiì.¯(å»T·RÞç-ɳ/%º‘|™÷ó§qWru?̦hΑê¼7ôòÀ…U^ÎK:%į v›AŸ7pè1ÌÇÛtOn4 +¹Ø+`‹ï—Rp 36‚FŊݹÎ%:b‰»•¯·0Î&SwjÒ V‹­C%#N^©Û™KuÓÏy,ÅEŸq&¨ãò8¿ªÊ{D LGÌ8½UTmÚ5leUÍ?6¹6ÞÒ6!-+ÁöŽ·¶¯T(wu9eQ–éáö:Jmš»4 û_}ö~N†ŒÁOkôÚ‹Ö»µ§½Mìð}íîɲư™qÀ“ë`Á+–»5ãéö×­d[%˦×÷[M–ŠÁÃ#ߦT\Ú*wqªÝ¯¢Øg”‰˜÷Õžà$²dß]Í|®yó9¾è?)ì#IiwñùŠ€%z :õÔÝ3°ˆKzW†Fc¾òm={‚ú³8uL‚ÂôwÌY«|í»U&›±”n{ÀeóbL=Xûy*áwSYø"FžN†j×'›<ºÚyÍ7Ì4`u¹§h‚Žï›Ô'¥o¡í×ðê•Ã=)2—½«ÓõYæ©9rd…Y¾qÏà`ÞrR‚›FWM†Ð¬Œz¬ì^ãë[‹=Cù¹‘©nßíÈQ”iÇ5ÒoÔôÈ[A}s…mºŠf?´?“½Ë’: Ÿ’òÏ +M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿ'yžendstream endobj -1580 0 obj << +1609 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 66 /LastChar 78 -/Widths 2094 0 R -/BaseFont /URQILA+URWPalladioL-BoldItal -/FontDescriptor 1578 0 R +/Widths 2124 0 R +/BaseFont /DGWQKG+URWPalladioL-BoldItal +/FontDescriptor 1607 0 R >> endobj -1578 0 obj << +1607 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 -/FontName /URQILA+URWPalladioL-BoldItal +/FontName /DGWQKG+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 /FontBBox [-170 -300 1073 935] /Flags 4 /CharSet (/B/D/I/N) -/FontFile 1579 0 R +/FontFile 1608 0 R >> endobj -2094 0 obj +2124 0 obj [667 0 778 0 0 0 0 389 0 0 0 0 778 ] endobj -1366 0 obj << +1383 0 obj << /Length1 771 /Length2 1151 /Length3 532 -/Length 1711 +/Length 1713 /Filter /FlateDecode >> stream -xÚíRiTSבª¡¬2©¤j=,ŒiF !¡€D ¢a”Abî ¹%¹—^n )ƒˆ•TeYÄF—Œ¢¢TXUê€RK¬B 8‘VJXÖ"U«"àÔ ÖÕUúó½_o½sþœýíïìýïlš[„Œ!‚° p0† “#R©„Ãä™Í¦Ðh8,' ’°p/°R«Üe€Íò– y| - bizIQÀ#>Aâ‘Æ…R9¡‚5d …\ d˜ =ˆÔj°vâF:X §Ãx 1)€6À)JaMh’ J ðßÀ6ím*ÆÓIQÀcR&"! Uë+)¬pŒì“Zþ²¦ÖªÕárÍDùI§þ•—kµþ/¦IÓ0¤ãèTj üFœ†­fjVBÈÕˆB„¦¨aÀà,g²—¿Á‘ô`DC¡P¥\Oâ0 -MUBú7©ƒµZíù××N&#äJDêÓ`Àþ›=sþŽI“pDâÙL6›CÉýö”8¥™U`‚¦.Ï Èq\®§CDF<Å -Á:ëHÅ,&Šä@:“”N™øW/6`©áôô ô À¬”‰Ù#Ý›Àþý´€L—ÅXÆ .lÅ^î ø¤Aoc%Bz -Ã:XA1ßÀ>[>Þ{j[M®¸ªó¨-=}¾ñð–ös[O}˜C½>N×ðÆ#áþpÜêø1rÌ¡d8ì+¤äõQO‰²MY2ÖÖG“½ ½bŸlÆÅPBÒ´Kem­ïil¿k^hIkô|ð“ûÓ;çlëVÝãð+©Ã…ÓknÞxù87ucGŸÙîKÈ}°„’XvzÕ8ú×;EWÆï‡`U˜¹úÒÜ„}O_™©­·»SoÙ†2©Íu£ï‹YlºNÙßAáìO]hŽ-¬” gÎ÷º]nVïûºcýš›Â¤¿Ïè¢ ÜŒïvKòsJBc$Q#óŽV8)jæ©}Cª©Öp}ëºz¡ÀR¿&ß)µ¾“ë[ÌIkÜC[›<ö’öÇ¢ÓŸ$>ÞûìµÚò@‘åfåz|ZŒ§÷~ÿ Ï!z;›j{õ3“[œ\õÅ]BäÚk·ÂЦùÁ¿?»yT -b×ó\nùÌÝ̥܎iö–(]çùu“iw‚Xg%ˆ»ˆ~Ô_ùð·‹-†ýܤàÀøÞä3‘7=/Õ6œ¯ -r®-˜žhj -®ZÔ4ë˜ëæç<ßg¶ƒ(Á T;ͺuE÷Ug³xãc Ž ½t¿ðü±$ÊÔ8|ØkA®íàæy©;™÷#—fyÿns.¬6Yßé]{Âôýœ%{¡ÈlÆš½©ÇjÂj¶iô³öÔ?äØ”gŸ}"júNY†:°O—ÒÛhë/×>"Š"žW&3ñ8ÿ3-­(ŽZŽeepϬ^ÏóIHyÕíwxíÁê¬]<º¹|Áöõ¡]Ï€€š&þ´$÷õ–‘ž­£¸©=ÞŒÞ=j¼ý}"Ø|ö £ÖÝ7ö«Å~-Ժ󿌮XÃà:*#³Øê8ÏBëþqÔ\©©u¡A.–Kò³«Iêü­ä‰+jjN3l &h‡^ž¨*‰fåZzVœôr#VV -QÙbÉ)õR«i·§>.qµ<Å7¸Êo(ß ùߪˆX7R1î{§k\›ç|y¸°ãçÓˤJéëxÙžä¹ÊL½®sNfSWé<‡r] ÃcËéÕYŸs¿8ehÜd5—D@ßX«Ú·]s¾m¯álŽè¸ÏŽÄväÛ¼›S¸’Jý5,®Õí« -µôÙq13êýÓh×RqÉ+ë¸èºÁv버C\¡S£¢±Þ°ûBe±ýGÑê@¼42_Ñv+ióÊ!i]Ãñ]vÛ9UÙÅ]³ šgÌß±é'—GK2d_®ó;ÇÏψ>ÌëóŸõ­ûÂ"%åœ,WH¹+î Í~æÿÝ{Ð;¶A#‹Çœ1<·¨zO{—K†.wŠn¶î¦Õv©›ªK vKg×8­'ÄáPûeáUß]íÅí¼OÚƨKˆ¯âO.uùZŸ\Ä ê6< iY• ¡‡[° ûðÞF§6f^ž¨4 ëúÎaURCǵ²¼ŸÑ(Yu¼­jß,NT˯m¾P`3ãÞWâ>ý&¹š?0z^Ü’xµçó‘5;ø/̉,zbCN¬èæÍ1ox’q(¿ŠZÛÏþåÿþ' -(Ô°'0O¥ü ÛGŒŸendstream +xÚíRkTSW‘ª¡¬òRIÕzX%2yj   `, ‰¹7ä–ä^z¹¤D|PIU–EltÉST” +«Š@} Ô«0|‘VXŽƒT­Š€¯¹`]]¥?g~ÍšsþœýíïìýïlšG”Œ!‚°p(† “#ÁR©„Ãä™Í¦ÐhÁ8¬  Q°p¡Óî +Àæ y+„<>…‚±tŽ¤ª àLŸ$ñH ãˆR©‚PÃZ²†R¡2L‰À„ D X7y#¬ƒ3`<†˜@ˆ’áT¥°&5IPøoaH—þ.• ã¤(à5%“H‘†j ‚UÖŒì“Zþ²¦Õi4kÚÉòSNý%¯Ð"Ãï L›®#`H1ÆÑéÔXø­8) !:íô¬„Ph¥MÕÀ€ÁYÉd¯|‹#¡ˆ†¢B©*…&žÂaš®„ôoJ+V'yÿþµSÉ(‚цt°ÿ`OÅœ?bÒ$у6“ÍæDr¿;%Mk&F•„ ©€Ëó +W(ä‘9A!X`=©˜ÅD1‚¼Hgr€ +Ã)“ÿêÃ, œ‘1‰¾¸€•:9{¤{“Ø_Ÿ„éŒ\ÀàòÈV앾€Ïcçü‰¨Ôá8ŒSãCô.V!¤§0¬‡•ëMLé·õÓ}§·×䊫:ÙÓ3šlm?¿í”Ù9Üëçroü)þè7çmΟ"ÇJF"¿aA*^õ´(Ûb”±¶õ8[Ýèûe³*‡“g\.kký@{pÇ=ëâÁôFï‡?{>»›yÞ¾nõ}¿’:R8³æÖÍWOrÓ6uôY¾†<‡J(IegVï…åÿ¼[tuâAV…Y«/ÏOÜÿÌõµ•Úz§;í¶£Y`*“ÚÝ0û¿œÃ¦ëUýδÅÖ¸RA„L8{¡Ïuy¹Ø|èïaŽ hnŠ”þ:{ ‹.ð0¿ß-ÉÏ) •ÄŒ.8V᢬Y ñ«¦ÚÂõ­ë[´èÅ‚Áúµù.iõ\ÿbNzã^Úº”ñW´ß–ìœù4éÅ‹ÞçoLÔ–‡J£‡û‰±Þ¾3½¼‡éílªýµ/,ñ +õW÷Q`x¯Ã*S›öïýÙÍcR'¸‘çvóèžV.å¾p\»¯üoÒõÞß6Yö$Šõ6‚øKèÇý•þu©Åt€›œÐ›r6ú–÷åÚ† U!®µ3“,M¡¡UKšfc=Aó=\úÍu%Fõ.ëÅn}Ñõ¹lÞÄø¢ãBŸƒÝ/ý†~*‰±4ŽñY”k?´eAÚ.æƒèåFß_íÎGÖ¦:}kOZ~œ·lÍX»/íxMdÍv­á±`ÎÞc‚úG»òìsOEM?¨Êð"Pç¹éÙrzmÕÚÇ„SQÔ‹Ê&x¶¥ÅÑÁãÆLîÙO6ðüS_wYw¨Ú¸{ÓÃÇ·V.Ú±"tèïPÓÅŸ—ä¾Ù:Ú¦sp7µ'XÑ{ÇÌw~ìC[ÎrÖyúÇ}³4 …Zwác«Ö2¸Îªh#[ï]hÛ?Aƒš+µµn4Èmðr"ÕËên‘º~/yêŽZšÓMÛC ÚáW'«Jä¬ÜÁžU§|<ˆÕc•BT¶TrZ³ÜfÆ™cOJÜŸá›^ ç7”ï‚oWD­­˜ð¿Û5¡Ës½2RØñË™R•ôM‚loÊ|U–Aß9/«©«tS¹>˜áµõÌ'Æ/¹_65n¶™‡¯‘DAßÙªÛ·_w½.wÔr¶Ä +ôÜçGã:òíÞÏ)Œ R?CMKëÆôûëÂKûŽî¼”óa宗ܽT\òÚ6^^7Ôn[–x˜+tiT6Ö›ö\¬,vüX® ÆK£ó•m·“·D KëNìvØÁ9¤Î.îš[Ð> endobj -1365 0 obj << +1382 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /OICPNV+CMMI10 +/FontName /WVJXVA+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) -/FontFile 1366 0 R +/FontFile 1383 0 R >> endobj -2096 0 obj +2126 0 obj [778 0 778 ] endobj -2095 0 obj << +2125 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj -1052 0 obj << +1062 0 obj << /Length1 1608 /Length2 7939 /Length3 532 @@ -9527,7 +9686,7 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP£¡O†P@jÅÄÄXòGw$ÌÆ àÐ×1ääææù—åwÀÒýžÛ(˜€íöà G8ÚCзÿãºP(m XÃàP€¼¦–1HCÀ¡¬¡P†:@‘`8@ËÙ³¨Á¬ (('ÀÀÿZ¬ØïÒP|·X²(€r„ZÁn·Aݬ Ž¿]<G(Ò†BÝ~`(€ 쀾í€9XÁ!¿ ÜÚ­9"·ö·¾[0- ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿‰ªš–¡÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† +JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿ž†‘’‚÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† uƒZ|™BX‰¼LLIB—Qdt ( Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke ¸éÛR§ö ]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8 @@ -9559,35 +9718,35 @@ QH; ‡á{__bçâ.°ßþºæó}<¯½kb¶Þý9\¥™àpDË\TL[\a·¿«NüÆW¨œµ>¿¥t®tÉQÀRD‚!$Dr£G¢1¸AÌý¾ ¥Y í–.ç#_©ØÉ#¬w¥Å¹ò«|Sþ?Z:è:”—fÆ×’¸ʵhúÏÈ×XaÛfÚœ¯Ú3™B¶“—£Ìü¤‡uቇôä·ÏÔϾʉltãp)’&ÿT+p•°e –íZ­M31I¡ÒÏL«êÈcýªG’«ô"Hx¾çS•ö$Û_Œ*[£n~OYgÚC¢ã® ø LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a*¦Ûåõú/5 JÔ†½ó'lï 0Kf›/Ð^‰ˆÖ½žO¼¡M [If§€ãC `æÔbï1}ÚU*÷i g#™HÓÄ+¸"î2X|F#êLq¶ÀØÙªþr#g <¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ  -†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüì|*endstream +†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüðI)æendstream endobj -1053 0 obj << +1063 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 36 /LastChar 121 -/Widths 2097 0 R -/BaseFont /ZKLPWP+NimbusSanL-Bold -/FontDescriptor 1051 0 R +/Widths 2127 0 R +/BaseFont /TNXFDF+NimbusSanL-Bold +/FontDescriptor 1061 0 R >> endobj -1051 0 obj << +1061 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /ZKLPWP+NimbusSanL-Bold +/FontName /TNXFDF+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 /FontBBox [-173 -307 1003 949] /Flags 4 /CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y) -/FontFile 1052 0 R +/FontFile 1062 0 R >> endobj -2097 0 obj +2127 0 obj [556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ] endobj -1049 0 obj << +1059 0 obj << /Length1 1166 /Length2 8309 /Length3 544 @@ -9600,7 +9759,7 @@ x r¶Cž! s{¦îâèhY¨ .Îæ (ÐòyeÿY(îàèá ¶²†é4Õ´é™þaçååšyü…%@P°øöyà ²spü£Ò3…4r~^´Å¹*–¦’`Øíé¬a0G>VVGKSÐsŒjÉÁXéŸ* ±w°ÿƒ øC3 °3Èü¹)Ö¿ëf qpƒxýGØ ±ø³% GVMØÉ$+ñ?ÉÏ!À¿bV ›ƒ—r‚ÜÍ­Yÿ(©ááúdÿ#l -±ðörtpZšÚAAÞ`KÐóà5uaÎ. o¯ÿø÷€h6‡Í@VÏÛð/öç0ÈòsES˜3بÏÆÂÆÆdûãÿÏ‘áó†Z8@ì<þ•®dj²Š*ȨÈ)2þ½÷f‰‰98–D2ê›-¯X 2n‚LñK€ú +±ðörtpZšÚAAÞ`KÐóà5uaÎ. o¯ÿø÷€h6‡Í@VÏÛð/öç0ÈòsES˜3بÏÆÂÆÆdûãÿÏ‘áó†Z8@ì<þ•®dj²ªi©+*Ê3þ½÷f‰‰98–D2ê›-¯X 2n‚LñK€ú ÝØ)[7q\ä딬Ÿâ}2Ç”¥Wº4BâÃ8êÁø¾d7z»{NÊ/IÈKsËQ•÷fèy eì|Tù^N ~“`³ IA“k¯¿¥•ÓC«?¸Æ-oÃ1™žéÃàö –ÀªOÌHt‹ßñ}n縳.i±¼«tÌå–ã4t\dêÍFÔÏZïÖEη2Úú`¿Lè-Š²FsŽ]Ä!JÞlø*@çìwÓ>ׇ&ª©æˆy²¥@¥]kU>=­rEÞ-çŠÇ™°V£¨ÙaQmL1!h²R%^×àj¸Öl;ÓÛì^R‹×5{/¶ ¸»ßËwU°s:NXµ‘÷ 8ÆßÆûOvj(øÏñTÔ¤\¥+Ö#2\…¿n5;ÿH¯i}¤ß®£Ñå~º9$m`Ƶ'4É)ù6b›•½.†eC[•+ÚËG}*”µ>A¼­dÏGæjøf¬%€Ê4ìªÉ$›Š ÛwÃPoÄd‰÷ú´ÊÈÓƒ8~Gžõ‘÷Èe¦_h‘Q¤Ç‹×g\<©‡3Ѿ¯òJ­’ûÁ«‘e‚gìº N¦bŽO+ÞÀ“îS­™c­Hœ4ÞCØKH÷²m:§dÔ’ÆC»t½€!…Âæ©.—IóÉ^!Øæ¾ÔD’ZÐZ¢˜ÝËMïQ•¦ùÜȇ®CÄTÄZÅ‚zŽz­‹Ä#EÄ7ÏLm}.éF?:ÃÓ¬v­Ä3*ŸH“¾˜sLfZžÓ$Vf‹B4®»%DÚ”6òÛì!Ó7ôRI¿S{ŽØ¸Õü ØKÒG;ë¢Od€V@Sp¾¿–_Û«°ÅníË5n̈XÛØ~ô¡ ½ÖRb…LKúÄ6!T²ªNËg¡å‹Åí„\æ |7AÏâO“fgYPg~ø¡õ´Æϳ譑!†Øç]äÆÀ @@ -9628,106 +9787,103 @@ s Ëȯúô$ šü=Z¤ïs£öjïM ­È"±óBc!¤d³£©Ëb”ű‰„g²@›€³y‹u[ñBQÊüñ‡2+QÉnÎÕ…lÍ É¬Ë½p¤+M)zÙ>û!Ÿ>ÅÏ ¢ï,Ý™Š£°ƒûüµ±ÒI‡c&”ü¼ün®'ñ°~ÅH¿ßýø ‡é+RúŸRû#Ì»’ŒŒ[È1Z‚«„äî<úüEþ„þ'¢DEPˆ¨½|”‘s¼j#U(»1é·–½,ÝÓ4Ešç×Ü WŸuÓ‚S{:D¦àæ }ª¯ÏB%Ö^‰$—Y –Œ8Ǹ %³šc&h˜!ç¹ÙG£ÀŽ–+([;3ˆý¡ŸA`´ž°ç£G°øªlV˜SÞRÿS”W~V'¦—,É*ZÊÿëH™­ >FþrRZ§³¹™ª$@!È¿Æf'%N¯Íqg'á4¤ÄÛeù+¡D‚A¿x0J1»ôÖ©Cøp:©¡Ý69‡Ñr;âš>ã|º‹Úˆ²;h“Ùé gÖÐŒíõÒ½Ó’iH)è¿iŸö&Iû RKÈÜ-‹Åx°VÅ Ec°ÖH·1ÁïX™hF¸íµnQtCç¬``*s¬Räxƃ<¬ˆI·$¿Ã“,Wp¨þ>VDI`×Ï!JØÁÁH¡aÆJC××J\ë(üÕ7“íÿòøÿÿO˜ÛLaö¦Î¶/gæàüÇgR€ÿ®äendstream +Å2ÑÈùðîì”í êzTóM¥ŸýØc¶ªáq_Ø™­¯cr¤&®tƒ9ëàWüéâõŒK(ÅðX02†å_-x¿ ¹”.?Ý7ÒpÒtÔÑ\»d»9›5Ð~錪ò$õjü2r‰7NNï²Ú°ŸD%DPüyýôG]4йˆñ%3¾j)þäÖ NŒ`¸ÝÅÁT„wÁ_¡@Ò€îz¡yæNVÈë9=-á9rEÔ”#Ï3p|JÉ–2ÿGõ¸E¯§sÞL]G˜¿c‰Š³ˆìš¹äf¡8RâDÊž Òy—gìn›01-ík*l)o ùˆÐÜ/Þ³¶U&¨1à#ö-©r\+çUIufÁ“$Ž¿?ãÉãÞ¢I}gu?rYREÝikoiï}ý"Öˆo’H†ã÷ÊÁ©ãš”©¡bD˜2¾pòV…;YfÑÿà×C®ƒñÕ{Š)BøÝîO|ßÃŽý}àãFU'~Çq-m%ÄÖ´½è$iÑü’¹9¢È`—k˜Ë£öeƾ-kØ‚.ñ>s¬Räxƃ<¬ˆI·$¿Ã“,Wp¨þ>VDI`×Ï!JØÁÁH¡aÆJC××J\ë(üÕ7“íÿòøÿÿO˜ÛLaö¦Î¶/gæàüÇgR€ÿDlendstream endobj -1050 0 obj << +1060 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 2 /LastChar 151 -/Widths 2098 0 R -/BaseFont /ALHPJM+NimbusSanL-Regu -/FontDescriptor 1048 0 R +/Widths 2128 0 R +/BaseFont /RVSMMK+NimbusSanL-Regu +/FontDescriptor 1058 0 R >> endobj -1048 0 obj << +1058 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /ALHPJM+NimbusSanL-Regu +/FontName /RVSMMK+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 /FontBBox [-174 -285 1001 953] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/two/three/five/eight/nine/semicolon/A/B/C/D/F/I/L/N/O/P/R/S/T/U/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash) -/FontFile 1049 0 R +/FontFile 1059 0 R >> endobj -2098 0 obj +2128 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 0 556 556 556 556 0 556 0 0 556 556 0 278 0 0 0 0 0 667 667 722 722 0 611 0 0 278 0 0 556 0 722 778 667 0 722 667 611 722 0 0 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ] endobj -1024 0 obj << +1034 0 obj << /Length1 1624 /Length2 8579 /Length3 532 -/Length 9445 -/Filter /FlateDecode ->> -stream -xÚíwePœë–.Npwkîî îNpo Fº¡iÜ‚ \Ü!Á îî4¸CȽï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕLôÚ¯¸dl¡Ö E(ÎÅÇÍ+лX{¸k@!ê\²Pg[-kg0à Âdb’ƒ€p0"„ƒÄ† [€<ÈÀÏàÃdÈA]}``{8€U_׃ƒóŸ’?*kŸ O–î`{€ùéÁä uuAàOÿcÃW îØA9-mcM%«’¦>@ Á€Îm§Tlê`ÄÄ°ƒÂÎ6Pˆ-øOjîÜO\2î ÀÝd~2yÛ€\ÿ@œWÌìîþô »ìa@ü©p( ±qö°ýÀ“ÜúW@®0蓆ËöD¦ u‡»ÛÀÀ®pÀ“WmyÅ¿ã„;á|»ƒŸ`ÔîIÓjãñ'¥¿°'š'CÜp7ü/kÀìîê ôyòýDæ -ÿ†‡;bÿÏ80=fë rw¢yâþSæ ø/Ù]]}þ²†þ¥õŸ1€áî g;nL>þ'Ÿ6ð'ßö`&ÏŸaQØA|¼Ëm=\ÿy‚`ˆõÏÌ°=´…Bœ}¶ ;LM(üÉ%€õÖeî_“ÿ -þ·4øßÒÞÿ]sÿµGÿåÿoïó¿R+z8;k]žàï%xÚ2P€:àÏžüY4n ÿËèvöùo¬þUÑôw¤ÈþSŸÊ!±j ?7ïßb°»"Ød« †Û8ì€ÎOÕúK®±ÁœÁÐSWÿ*è“/ï¿`z`'ÈŸò ý ¶ÿûS£þŠœGAAOÍؘã¿Û­ij?Í\ÏÇø?n 5 ¶ÿyøÃ#+ õøq ó¸øED¢‚¼Q¾€ÿÆã_4|ÿ³ß]¶UÙwºHY:Ó@'ÔÏÙ¾¬2·‰pì„òX”àdÆùΨ¯£˜óìlŽèèZ|ø…F3Ö&{vzËüܳ0˜˜ñÆ7Ð&½þ I;~#amÑ÷Cæ”ýÛ–ÞÁ¯ý}ç¨_¶©8rß`0Ix¢à0Ç»åRI™èWøÅ0¾T&À2K‘cXöà ŒñC¤[ÔÉ¿&˜,£u®NKz½A„þßlH‹µc@™ê -qh<ë/=íq|ÜÞ>“f¾WV “Ž]m(;Íe J[<ÃaÃlœùb\¾¡ æúžè×}#-#ÈÉq©¾çeÏ[9Já¼ù¢_¸ØWaøáÖß -ié”ç-ÚX'ÕE1xãÕ^r%LSõ)çœ+眛 Ë -õÞÇÂ[&Zêy#ƒ0Xæ]&òCO#ÅÛ¤ø²¹2Eí úIlºgÌéÝ·akÃÎÇáòû¥Næ ´ÃöÚ™5ÍËÓV¾“/M,-±çDÇZÛ>Wk˜DCÏ7rRIÝŸ’¬ð1È‹diøÚ¿Sü€Ar%çÎ{*“AèÊôŽÙ.… ®mÏ«Í–ÐW®ýkD -ca¥ˆ:ÚŒás#ñ€îÀpolí›ò¾°ÍDŠNsíò2¸‚Ö#Œe -·&üÖ!Bë}àBA¨ÛÀΡXÐm|¢]æpvKºXKõ‹•‚Eí3MâɤáÝìdtÉa~´K_\ â4HÎý**iœ·É\Ìe:ŸHÄ6]«W•}]¿­ÑêS%S´w< Ü‹åîOìkkQ^¸ù‹Kû`ïJí¦¼W&MÕ½%)–›D6Bc<\ë¿ï’+8H„ -uŸ1Í‹K -|TúÁ.øó-x{dœñØZWäû¬eÙ—n¶R^v&ëgD& Ê&>2P&õ£±•_aG*Þëýï°`eNNAU{yßÅi\îÓÇê#‹0xðØï†×c¥•¾\ûõL$ü•ü¦ð·ÒæªØ,ªl'<]ÔLI½à†ž­Ñ¦°¥ú_Ûµtk2aÁŽ§ØÚC~4¶âµm1²¯I+ðí^a ¤Ft(†VP É Ç[è>C×ÿ:_!yà»uµ ÎVfVúôz–ÙÀOX¨{ëµW°{מQcVõª)ÝŠ…?÷dɱ8~EÎHo)3'ï÷*Ò]_™¾ÓÄÔ~Ÿ®vx¥ÞòÊ¡ÀØÕ&˜žØHHyÛbœ6ÅFÝM ÆèD,y5¨˜ ß~2‘{Yî ”±¥¥r¢­ãÉÕ>»8Ÿz“ –R…•RÒõÐò˜ç·ÇoÐÁÀTÊ]ÈÂD9îæìðêàkÎdߨ².pÔáò[ ¥`«Ë„‰ä9“2Cƒ‘i‡“žÆáWö.—6Æ™ÖE(}Ruã̱«˜10Ë _S0-ÏkH“¢JéG³ÂÌV³ßz/gѺÇ;Öö#ejö¨0Øt5¤^yE½mqÝ(X q(Ú2”*n#œ³tWtV¡èžã`Yõ±Á±º l/W¢Ù©kü:e·´\úö†K+=à7éë¥ý7§B´ÌYUÄØŒbTáœü"¡ o–ãú£ùwh rU ‡¾á%y›?qp©V«?e4¯Ue iPŽ—YFüF$Má…­s¥E>œŸ²G»ˆÏIÝ®6‰"t:Jí¿Sy“]Åá·IߠȼhåiÖ'«šÜÝ_Û¯Abí±šŒbuQç“:)õµÕÃR)Xß–j“rJ=Úð†6þÒË+ï«‹ jvð©´OÞ'”¥‰änÑ ›éí’Lp¤Xk²W:=KO$ÛÝó#VÅ­Ý Gèwua[¿ÍL5DIÊiÜ·Bj «½x[$K@"šà­ ’ìeÀ¸„^Y·5o`f^œñ2é…ÎXÐï•rN}þix—PÕÊ WõÀÍê݉ aä{âÕÃÄ¢%F'SÛI-ºàLÉž@«ò­Vê–¹Ö‹y+ƒM"º%ãÁÞ÷d¨Oª<ïË5F¸½‡·¨t'ù :rÕت}O¥nÌåðêsú|I5cd ô<™Çë,©ŽO¡ÏtûgM]O ááÓ÷ƒ™YÌzt/xßõk?ÖH¬¾·ç±SÅånÍT3‹št:°#ž'º -ýL?ë´êpUn¿TöùVnEÁê?Ø×_¾´pãúâ`(ý”b z@¾‡ínüºSw©õÙ,"ÃeçÝ4b‹x™-R†ÁÊÚî™â “”„üKKëšÄ¶´Ÿ­äü”Fõ.Ÿ1´c~¯U¹¯M]p¤)ûIoΰ2$Z`8+B5®Óµ³ÎJ}ô²?ä\ –³[¢›.ü ¤Æ°Yd¶SêZDh»¹áYºœü€~IÒG>\ {áxÊ/õÉ®[ávÅË/¡‡')Ù®oº«;ùqÄuj 4Ö„bùàgÈ•ÝçOñsÆJŠwí^ùÏõ £†þè©ÿj/(xý¬Úñõôó//]ÈÝÅüæOë~Ó×ʶ•àt`e/ûïè ãûcOû) …WU/“Ñ‚¯Í–Þ´Gù­ÙïÜwTîÏW.¼)ð—«{žÿE4%ŽxôÕ×ñO‰Ö¡ìѱüBú®^?² Ò7Ú‡6i–”“´šü»;ÈÂœ{Ô¯6-®dó7 -DŽãlÀŸ_¶—s@“Mú§„ây¬ödæº/ŠP‡}øe(x¿ÔR^¾ŠÎæ -5ËéZôO±N>%¨ˆ¹aâôOZ3)€å}íÖN¤§fQrÍ›d²~©d›Ã«°]µmä_—–õo‡öé´6š·§¯t`0ˆ'¬bXšz˜g­âA;Ìƺ‡:ÄŽ/0´ ³’YÍ“Ó^O¬œ.~èÿé“1 m«ð(¦Ìÿ#~+ÿÄ@è…†–1‡¬üþÖZš‡ÑÏMŽc…#ë,…põ «—½ ãQ›q„~ݶDwRÉ­±­ðç}ˆãêЀlqâÂmƒéN¡òºât»ÉÒy•qÝGŽó©6ƒïXd,7DýiF}/JáP*Z°ýƒ[ïÊñåx´NÞl¾d¯÷ÝêèïM‹Í¼:,ýdÅx#µÅøÇ—ÄæÂч7jèÜÛÓáöâ¡Ï˲¬¸x›·wê¾Â'_=Sz<Ï,NîË!É.öš«çY¢¬-j=-¨¦a”%m].'Û¦œ|ó+êçÞ Û!)Žoh\ð(~r£hc*o±q× q+fõ³ïóäÒå62†™·«ª vVij^×Lb‰—'ä¦ÜÌÖR8ˆ -à–¨ÞÏÙCãr±`Í1º'Þ3©$.GæEHÇçʚʗrhüúŸ·Òb¥éuž!&¨qΉ6öQnªÒ$:ZC}˜i%¹Ê­»ßàÅË]¡;J¤ü¥íÄáÈ¡¥æê?^0ß-±9,ƒÖ?¾oŠ¯*4ë™XÏ¢ÔVúåœó5Ë%`*fÝÓ áõ €¹Jx¬ŸÁ«|ÉÜ-MW¸Æ1–Máù*ȼRé¹!;vúŽËE”¨Km+F´ˆ´zç*ëئ‰å›«ŠÍ5¥êi¼Áa}4ÞU•Õü<4·ˆp2IÝb“I{Ù·¥ÙGL‡<‡¨)L™¼§6<{OÚ‰õJëù‡)=Ž`W Ti+Ô/ëy§Oul3`C¡Zª¬8Íçë)ƒz5f(mNnLe[C~‡HèÝ:«é3oî=vc"¾53b/Ba•Pâž‘Á©gtgºeغîõ`Έê;¶Õ$´T¨z‡Ró™Ú$F2æz__híÜže .#‡9Öžc蛫w¿YøIoÇÑÛ>;V;Íúå¥~$»Ï¨AÒIK(¢Û³@Õ0¦Ô£20¸Ê )$çÔ*í> Lª×5z(Ro,ÙõÝ#ÿ}àQàÉçÙÛy\1°Èöºc.FÚËcuÉÎÎý D­P”0Çj XS;ióé,¶hqPÞQ×I®y² Y%Ó&tÅú­;ôþþ ¹„ÙsQdÐ+-\yª×¹L&¯Ÿc݇)ùÈ69ëzTê|øÚÞo–ÖÕwÙY\9C -¹oú•ÿ™„WÀ ßóÇÓNV]UÅw¥Uf]F}å'Æ ~’Ò›Xœ#Ëçž¾cvB¯W/¤™iÐÂò:Èû°?¥Zï³ÚÜt!r¨±w(P¶¨^á ô Û}3e/¹N \J¡ñ¢ufý\˜‘ãLT(1 „™YÍdãºIé;o¤äú9oÒ>ÒçMªá8rCŒuÁÀ߉DL6¦ëÕŸ¦D¹í[v¿ 8½£ÉICxY'ž%¸)4ãl¤Ã!þ"2J)/E¼4²%º㉜Ɵ1gr P -×¢<Ð;’A m&%`»‹ý,]@QwÚÛ²R×jArÝ;Â9†¤q›~ c<Ÿ;–º¬#v·K÷ñI2`=Ìáä4 H™óÔ~÷ïAÀ–fZrëÆ)8UFžRÓT*¥¸¼ý  -b&c,±í™Ðò´6@ýMãÇlå‚¢Ý+§¤õþŠ´JX)Ò~Ú ®~_òŒ`|µ*ÊOw`à™]ÃtíÓ?³Ý…‰ÎZÖz¾xï¥ÝQøP&_DFáî?¸jÂÎóï¨Ùšø•À„¯çäHËlÅוäÀŸ/¢p«·ýj/ -¿¼I-*-]‚×X![0O²h¾µuí©±°njî¼Ùõˇix6·ÇüvàÁ~ó©O‘Àù‚˜lMT(Ûf™)Ea¡ -«f\‡Ð¦¡$ƒ±È=Ñ3{UvŽyo{VîÏë ù P`üñŒT¶Ve¤âZ­²<§EnÚâ)ÚQû´%¾ ¦¸7ïI¸tƒæ¹H)w)I¿¯r8Ú'‰uŠ‘VäaÊ^äZ¬Øy·ºÉ’ðô`ù³d^z¸)Æ6Â:F´lÙGNŒî;T“Aß<68açÛœ\Í„˜P&-‰*Tù–†‚û9n‰ƒMŠ.Ö _®¾˜ì»[tTç5u|e±ô(z¿‘1­ÄE¤m½9FGyü…Çݲýu %b«º&Ü“k®[“Jf—õvbè,úS0ëò£KvæOìÂT€l,Jc§wyÛezŠJ{ÍG¿+Ö¤²)¹¶Ú¯ã5ßõzÕ~^Ñ™,UËÜíj4¤fÒØÜÔ–Ÿ"^£Î|ÏvDÿpï2®ÀžDrng/ÿ¨F1}ël†±ùÝ/àíÀÈ/þ€%À!yjå—rG?v’ŠÁ÷ão¿1ÎÞVlJq§FÅã®|‰ú^òñ{¾°ì¤&>M†J|)§C'[¸@wÑ„¾»üë’N¨€‘ÇA,‰MÒ[PÊqu RÏëgì N™*>rˆÞÌþs“°Š¶ì×,¹v¸5½âz*¬Çsu€yÂ<·@t%'ºÎ)>þ÷k[1ÞyãçM–i‚Óµ»ùêÛ9ûÙhYéTŠDá]ô-$@auS¡s™ -wñÈ6úà ”mÕé²ÂþYTñ0¶ŠŠn˜ÄVûÄ*ª¾“z<ÓËåoœÈ-ÜÌ€9ð®Éü̸˭ojÊÁª&ÁU/ðޭ목;íNˆ"ç}%éÁ´ä}£‹>òΰLžž4^ùÂí°Ä`üÃ\½[s!ªÝÎLð.ó¦ŠÜlµ ò"±Úu -Ú匓$S¢’ 6CSûT ßé3çDIЩ49VTÑÞê_Eb:ÚÃæšúa,M[a¥1a=“Ûÿ³6]<·1Š\KŒŒjì…¹¯ònð /u Än锊ê&½7Sl x±*#Á ÆxpC‚yC[ >F=ÂT@Dæ©F ¨j`ŒT-Fbj ×t0ÿJ"Ã.c0@mY{PJ 5¤Ì'¶WŠô(æ -w:©ÿrŠ®­|¢©Â¸¦z$:S÷5ýe!Óné³úÇÈ‚®¥kîciqç`“&"Œ»ñ¯[’¿ +Þ^aæ’W~Þ¸‡ï¼¾L¥ [þ¼RB ¶¸¦ÓP?¸O/Kch™iÆìɶ69eý«Æñ0C¯zÚV»\€3ÓF6F’×PK(Â}<….õñG¢7uª–íöx?Q:¢/³«¡ÝUf7ù0ýÖgß´—-hyŽéT¤ÂpÕ äX´Ùð!Gf“$~°Úù‡A—ñÃ0¦é!Áy[—¬Ê™kØtó̸Ã[x-¬Vgûi æ_£,îiH0Ÿ9´>fDâ´¼µ¾éþ…¯P$ÞÏa$ùÁÌ È«×ÅØ¥p*7'ZtÐg;9N{9*Z—ê^‹Ã@jò£ -É]g¤ÌÒìÃ<¥)7‚Ñì¦aìnd0² ã‹ï»¡.{tm)«ÿÚ;ðÅû¥™¢ËÀOû&*‘8$nÎ ¢7ï A -/TÍ®vi6Ð9¸Í>4â|ßï½@G_C )$œôÀÁ¡S霿<+sK…¦–s5KÃóøêÄ寶Pþ}JýHgëeC÷ÁUf2‹ïU ¦(^9g­5Þ’‡®?¯¸ËÎïPrtAFžÕŸþzo…‡“Œ:¾æ$žýf¾ ÙéÝ›S”¦]¾‘õÉŒ·‡¶3­×žÂBR­Ì]þ -诮ñqÂmdàÔ`7nƒ¨RWºÓE[œ–™Ù6‘9¶?`ƒ=p®ç3Lã,oئDLß÷˜¯ÙTýŽ§Ý¯eW‘öîònQÆ—a)ähF%ö¤5ÙÍqXÒÜâDÍPá±S)ô|ÒÞôÔŽUYïÃÛ›ær¬f~0?rén#º«mH¼Ÿú„Âl#¦u¬…85ˆ#FìEeU§ ¼¹Ô_ k<ÿk¦°ÙbA%R7@"ÿÔ÷»Â2aë}ñó± Í„½![/©¬‡DpÙn/Éo ´=ý!"o×Ï¢ðœoâ}Nó’Ïúýk'´$ó ’;ŠTÅã8æWÌuTš+Èó1pT>×v€n -^õ,mÝ>µsªÇÍóQ™“™:…&ÚÞ0Å(ÛHj…`ÌðSòèí$¬=Ý3UÊõú”ûµ̒yæMŸ"¦*lÊKÓã)¯ý¼ð^lØb$vÖˆH 0癥l{< -ø_Ê'Œ.ÌGöª‹é–Q}é•.t(f2‰ûjéŲ¼[Õ -§m#dì^Àz#ÎHc3ŒÕA›Þ@4ýÆaù ÃM¸gGs´+l®ºhXÉ¿N5ÙbHË5toï<Ÿ¶¤UxÑ£(½¶§b^j -Ûó–ÊŠEVÛ*l‘(¯;Ä¢føqOóÊE½WÇçT(ÝkEfAó¼žýÂdù’†¸æ¦n®»Æ8ô¸©%ê XVŸP®Hè¥SûzëÈÑT5JÊ»khOiÅ©Sá[$#þÀ~yÖÓ àŠuq~»ty5ÈßZäë¸îE¡Í ƒ£ç<–õ?ž|¡ÿk7Iä¬óX‚Ö†¯¨Ãw¨JÀÆ!¶vŸ]@ŒÆ „˜ì¦{SL+SªÕT5ìÊnÂI’8˜$ØÛwk:P—zŸm”ñ¢7dTyïÍšVìL~åò0„­(ÕC‘¥H›â{*SniNƒ;о ¸î -rW²tˆjêÏéIœmyhžrñšxÓÍΔ{.2û˜Ö=2£&Gl þhÕuµÈ}«ƒË±GgYúô‚á1*ëlänȹ¹YEÒºOúʼÓ\/QÐ4Çê§ JLn%!ê‡-ÛêÑ–tzŒüâ!rÈ~¶Ç*¥ì”o‘‰šo6õÖÆe›DÈ7äð+÷&³áøÚsŽNvÊ0± -¼õ¥¦Ø[?°qI„Kõ⬟5~•)ž¢7StûŒ•_ÑባûŒÒOLû-ˆè•ÕóåÉú¹@¡dÉE’]_VJDù»ýõW……¿].²dt~ˆ˜ˆ ëM„í[z:ð1¼meãðÎW &If° ânË5èŒqJ ùHçq$?HÒàºN÷œ³ÄtÉÕ¶øhÎ=øi2Ó1\‡>ÆQºO€Iep3ó¡5_€lª§~—å6í×ðnþ4à ;h·M±VH½r4­ÊvV & ¯Ž¼ ml߇K€#×?xÇ”³îL3sÆ™¸Ö‹ô¥{Îcj+;ó÷ˆ™¢à#ÃZIü7£aÛG+ˆñøÝÔ›QEíÀ’¢#­ƒ™)­ìÕ¼`¤øÍíø´) ’J±4ŽL_$/Ö.,ÇÑYéácòwjÖlžvÉ[ÓáþhÉðþð‘æó|[×L.6y¾WLMèJÕ€¯ŒþØ;©>âÏ  ‘Y‰è4‚ïÓ+Å·®‚›m=Ø”°YXÓIp}å°ñ YÙ߉ŽqûN<Ëúæ=´ûÔg·>ÚܼŽq9ºT†¸ÃèGSyçm÷p0ðÞû[  ‡s‰³3 Éî%ø¥/ÝðúµnAi•wÖ,[é5SõˆcÜÕ°Öº×èÏÕÇFÍ,Œ;nòAï-´´€Ä߬ug¬À!ˆ <*’Ïã´ñ—Ü›£D•îÔO/ý-?*¹Ww×%sUc‚ö6a u¤´ƒ·¶ªVq«ù|4F;2¤¬«šßh1Î2éj˜ô÷8æºÚÀ¤¨Ä•½š:q‘— 8roBÎJìÞÉK<<æÓ?6tð4)=Oö¹nÝ úy33ç4ç«"s_ʯrXZœ´¿":¿y€Ø`eóúþèÇi™f*õÀdP[S Ú^D$24³ªSpÙçr«u +¯X£ð\½àá)™—Úùìû.¹ò‰¬vY·S‹È¸w´þÓÄœŸ£ãì/âìœb†Î#aÂ]ôG1ë-ñÒ8;iµ¡ø LÃ,c¥&]#¨£V¥¨wʈտ™f_ŒWi—²]Šã—â¬3—ÄGBßèòQB]Pö½!FUßs³Ó¨ú­™¼‘JÂÀFGí -†Þ[ÕñºòŽABjÙhaLMô\¸©·UÇ2lucJQ¹ô@!5@ç;*>ƒìïâ _\Hñà‹Ea{¢ê’7ÎV[ˆso'Ƈ.–¼{èãrœÇ<˜Ê¢©5û&/gý©~ò†…p´F7Û,‹™éÞ& ƒ–PvZœÆé<ÙX<Ç~ÚñDRx›±Î°mé¿,œÏxIÀBµüïgE/Hý£öÓçVB[1úüû¼×+,(ëÈj‘õ8¶DšÈ1éV%á*>ºÑÌÏ-ÉbW®V§…* ßcoÃÉ«Šx›B¶>GžÀ>­š-QFÜHÑÃâ•°8ð8—ÿTO¼VJ›Jfo!ŠËKÌ4,pB@<ɵŒhÛ*ô¬W¤ˆ¿™Ù³[¯6€œÚ§óªE:§…¼L¤åê•B¼¦aíe®7·víÀe™4U8Žm]èÝÜA±ÁYažr}‰Í#1ã™Ûµ*j”ÿ ÑŒáè+àu–L _#Ƶö»Ìñ˜S}­—qmm(›1öÑà kªuÊ}$ìL„_hH÷,½ÔtÚšw½álœADöâ‹Ctkôq¶ÁîV1)Òö" Ô»gFbØ_ p(xÿ—ÌÿOðÿ3ƒC]€0'Ìÿ_‚*-endstream +/Length 9443 +/Filter /FlateDecode +>> +stream +xÚíwePœë–.îîNCpwOpw‚{ 4ÖÐ4îî \Ü!h€`ÁÝ,÷$À½ï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕŒtZ¯9¥m V ˆ Œ“—‹G  v¶òpW‡¸¨qÊ@œl4­œÀ€g@ƒ‘Q +ÂÀ9 $0Ùä@Ö>>¯¨¨(#@âêÛÙÃ,z:¬ììÿ”üQXùüy¶tÛ¹˜ž-·öìÀò?ë2׿¯Éÿ†ÿ[üoiïÿ®¹ÿÚ£ÿr‰ÿ·÷ù_©<œœ4€ÎÏð÷’Äþ|WØ^[ø +Y`Šù½'‡•”ò7;)uƒÉ5ð{yi¯ôlVÇtùŠ°ap™$=Ú¼| ¿Ã2¥ÔD$mCG75vܾU‘'Ÿ·^¨%Qëê>±Œ­v¤i¢œÆœ\DÅæ$Uyœrï…¹Š]îI“°pS{ÕZXÕkÝJ´ÎÈw\xTû ni¨ õà=7¶Yˆ}Mäo“ÊÊôA6'¨'qž1§?õýµuÞ†mŒ:‡Ë]”9š5ÒŒÚieÕ¶®ÎZúN¿‚ 4¶°ÀZ™hïøT£n q8ßÊM#ù}J¼ÆK/'œ­îküNáNñu”¬;Ïa¨t&+ã;&ÛTüøŽ}¯_ÙÎ/åP”Ì¥µbªhSúOMDC:C£ýquo*¶“Ȼʹ*ÊÕã Û ¯ò“»í6ãµXp— +C݆î°|Dƒn’l³Fs*™3DÛj^®.kmiM' +ýœêe#¥M ó£Yùìì"Fà4¨¬œÎq›Â邱Jë ß¡cùºj çÉ +¥!M"Uk×ӠѽDöþÄ®v¸é5¾›¿˜”ÖžÐvÆ{mÚDÍ[‚‚µYxë04Æõáû™¼ã¡x¨`ï㢘ÿGÅŸl¿Þ‚¿M2[韷(ÿ<Æ%ÏúSÒKÜÖxóŒÐTÕÌK +Ê¢z4²ô+êŠBÆ=ø ÖYäæVwv \,‘Äçí0~¬94¤6ƒ M<5îº+® äÙmf!à­4‡¿•2SÁbVa=áî¡bLïW7ÖrïŒ7‡­4üþVG»!\èpÊŽ¥5ÒäG­o#V×#KR‰gû³p(-¢K餒|D5Á\ UïËb¥Ä¡ïÎÕ*8G‰mT±%vžIßOH°w“3Ö+ؽgß°)»œjÝ„¯~ÍÜŸkºôØœ°&k¨;™¯—Öì$‚Å— £ + +ûäаQoâIÒîGžaWŸ¨•h‰ˆx=}«Ïí“|ûؼ‡Ðé6ÙF£¹VàjÁÓllyÛÃüù5N†¹á±£LtÝ“¡‰>åìÉ÷¾ƒŽ´OT ôNó˜yûõ²ëáô—p£KTóÓ+±Áz’ÈÜ™ ªÌ@¼Îâü/Œœê}í“Xñ$R¨ÅኾÝë;toK’Ö~ÕŠç7~g¨ nX,ÿ\¡Žˆ/νtD¨scÓÐý#íã‹™%¦”ƒ~¥@Úë+“wZï34ÃŽ®ÔÚ^Ûz:d3 +Žš(nÛ¬³&XÈ{‰TXíþ¯FeS¡Ûï#Ʋ¯*ì3w4•O£µ=9;ç—SCoES«1SK{^âÚó½q÷yô»è˸j’˜ƒè"'Ýœì_~ÉW²„凒¿yZÙŒ|^©ìÂ=¯ù•PIÞk^z¯ ~½±NoT2Ž^ªt‡}‹8”›Ô"bÇ +oaguÊ!ÛçÜ…ÒŒ9dëÉ’¿Õš[»Ó7õ§aNLÉH•.‹ð·ä“q#t|%öuþÄRÓ¹+Ænvê–‘¦žh}í½B׫üsóø‚Õ9*«¼ª¡M‹E“½h|íøiG½¡^¨!¥®_œÍeÜŠáâuç±ýïQÎ`Ÿñ‘Eôï þ©¦%³u£:GPb²Ü"â ž$•Ç…t“3=òáüŒ€-ÚYlAòv½YŽ¿ÛAòàò›œjv¿mºF­$ÎàeKOÓÞ|±•”.ÔèÁºAu–>Ëé(gEp‰ÃˆbP3P-,œYàm™Y‡ä£5OhÓoÝüŠú˜ V{Ÿ*»” +ð„pÞõ¨©îñ{ª•[•#ZòPxéÞ¾‘ +NÝ^8Ü «3ëæmVšRrnÓ%B#mÝÅÛ + i"á4O%qD?=ú%äʪ£u #ë⌇)H7tÎœno¤Œ]`æ«Ð/ƒ»Äêv.˜ŠNvÿn1W@XlˆW#³¦4õt N7•Èœkx"ò×:É[¦:/¦LVñè¶Ì;ß“ƒ‘ÉŠüÏ×èávÞ"RÝds¨ˆÕ?ãª<](t¡ÎGWŸ2Kk"Û ç)Ü^o|dH´}Š|f;?8ièxŠäÊ Žž¾ÎÊfÒ¥}ÉónPë±V|ý½˜(Ÿ2¾`¨hg®†IĸÛiˆ þ<ÑÀUðI ã¬Û²ÊU©óRÉçcXC¸%9‹ÿðÀ`IøÊÒFŒëËÑŒSòÈ!Ù>–»Ql†ÎJû-¢iD¦óî»Yø6±r„Lýµ½3…aFIq¹WVµIé¿ÚÉø( œ=>¡kÅä^ W°Y š,ý¤ B·ÞfIJUìY†ë¸¹á^¹œþ€zî’¬‡8z´$NúÒá”Væ“S¿ÆåŠ[PJK R´ÙÜ*rWsôcï"P‡kª ÅôÁË”-¿/˜á㈓ëÙ»ò_èCDýÙWþÝYXø ­Æ!vöÅçWÎdî¢~‹§õO´Fu2¥Ø]˜9úB«þ»:@ƒ„ÁøÓú$Š"¡uå£Ë”àkÓ•7Q~v£·ä” ”Šn +ýeë_|I'ýe²%É*”-:ŽOPÏÕë—|6DêFëÈ:Ý‚bšFãƒoi˜SŸÚÕ¶ù•LÁV¡ðáx{kð§WìãAøÁnË}é…Þ‹bäQ>irîåÏu×㯣 ‚9CMs{–=&SíFSNñ+cnç9ü“7Œ ¡ù_zµ’èh€Y?(8³X>× +°.àVجÛ4ñmJÉŒûwB´Û›Ì:3ÖºÐéÅ’ñ×Ñ-ÌŽ<̲×q!]¦½M#Ýò¢ÇèšEÙ),f)é±³Gk§ËùdIÙ(<Š*ñýLØ)8Ñ|©®iÄ.#w°³‘.Ìnøk›ýXþ‡¿U6ÿR¸Z¦å«~úɨíx>$Ž$w‰íqí°ð“j.¡9bDE߬õg»oÈêK2´ï¦Ë¡”’¤DõÙÏO$;ô¿c’2ßVª¦¼z(ƒA(iÀvnýkÇ—“ƒÑÚùó‰Ü<ÞwëãOÛæÛùõ˜z) + †ª¥ + cÎI­7ã*oTQ¹¾Í†Û‰…¾(϶jääiý¶[ÿ6ýMññ<«$e —8§Äk¡ág©’–ˆÕ¬€ªºa¶”U…¬L‡RÊÍï¨_û7¬G$Øö<¡ñÁãx)M"Mi<ÅDF='Dí¹ThßÉô=¤Ì]”:H闤߮«4~ØM\§®­˜Æ«HÌK½™¯#·áÇ)U%¸_°ƒÄçaB[ctN½çÒˆõ˜#dŸÛ+i(]Ê¢ðé}ÚI“¢ÓFƒOTåXi Ø9U¡Nr°4‚ø0ÑHpVXõ¾ÁMV¸Bv]ª +V¾%FŽ¬´~Tûù’én…ÕÞðd´ùñ}sBu‘ißÔf6…–âo§Ü/ÙÎ3Ô›n¼¦p±s¦J¡‰Az¯Š3sx”t¡Z‡8Vùë ³*ÅlX¨»ÎQ"Îõ4,èÑÂRj[È´,ÛÆwn®ÊÖ×*§ úG ѸWÕ–‹‹¼b‚éd5óyPL~bÞ@LøÀ†ú>Ãå¬PU~Æø­•ÁÙ{’nÌך/>Ìè²»¢#KY"÷yY-:¶ÔW²ÎU‚ h(³ã5^l¦vëÖš¢#©w8º1–ïŒø! öj¯g̽¹÷Ø‹‰øÚÊ€µ VAˆúƆgÐhÏtʱtÜÀÔ5w¬ëÉÊ(iµ.A„Ö%RÕiôŒÍz¿Ðº…}‹ZZv9úüT§¨Dã…,ïß ÅØg£ÙÍ…pBõ:—"aâ»7,ôdUÇÀ(®¸C·0`UÍüuƒÒ Îy”ìj–Å)”Ã8ÿ8õ–”3›FTÜ·Üü]ãúžc‚HTLã[?˜àä:AõUéC5¥´·$kl†2f-õ'»/`3_iªÞ‚Óe]ë¬G¢J“$áˆE㜦5¦q*=I³ý1„lï}¿èè×(ãËñ>¹Vž…¨ÛëwONÌ|$·“¨Ÿjçýr‹Ó¾ÞgÖ"h§'Óî›#«QèRêë_å…‘qh–õ&7è>«5•îùL=Ý°ã…p¸Èspïï>®é™çxÝ1• ìg‰²8çää}¤’/N\`ÑW¨­›¶n9‹+^–sÐq”m²(GTβŽ]±‡~í½¿=H¬`ô]ÛtËŠÖF´/SÈXÀaŠ>ú2ÍN:UÚ†¾tš¦÷ \bD–Ô»œ!„ÜŠ5ÿ.øDÌï_àùsŒñg7‹ŽŠ³Â;þ²jÓÃîŠÂv#z? ©mÌGŽ±Õ‡sOß [Á®Øõ )¦cj”°ü.²¬–4«ë›xvU¶.yŠ6•+\þ!Û¯&l¥×‰+©T ”îì_«ü³!²IJü1PS˹7I={¢­ÂÔGÂÂ'‚‚˜HJmú¦4=­ô‘Ÿ¨ý˜,‘´úe5ß_‘T )FÚÍšÂÔîKÑð'׫£üt††Ðlgëžÿ™í-Mu×±|Ôõ}À}/é‰4¶OÛvGâEš~…sð¨ïª=/¸£bmæSÄ.È’”Ûˆm)Ê‚?^FáÔ|ó«»(úü&­¸¬lVkùîØœišYã­kïX­¹Us»P÷Íž_TÝ› µ3æÉžëMË€¾Ó醈`Žõ*cªüR5fí¤6uci&C±{’g>׺ÞüÓî·yÙܱ]ârA¡À„ ¢9ÉÍ|ŠH…:%9]ò¼ôåS”³xb¶Þ<'áRçÂe\¹$ă¾Já(-â›äc툣ôýˆu˜q‹nõÓ¥áÁrg)Æ<ôÄt0ôoôp›èÑ2å9Ð{ïÇ|óYaÝosó4cBù5Å«‘åÚBèoðï¸Ä·É{X. ¼yz¢2ïnQ‘6Ôð”D3¢èüÆ&4“ƾévÉ28àËá-=î•l)àÛÕ4xažœ ½”Ò{,·S#`áÐ_Ù—s²~a¥d⚺½+:.3R•;k?ú]±$—ÏÈÖ²Ö}™¬ý®Û—¤úëŠÖxùGôÝA zcZm€õM]Å)ü5òÜ÷Ô÷ΓòlÉÄç¶vr_ kbPwÎæZßýÞýæ X\¥U}®pðc#®~?ùö+Ãümå¶$WZTÎÚç¨_᥿ÉLËbàQg*'”qØw³†óq•Nyá¹ËM°¬h‡òzÆ['¿¥×"ôÅ¢±-9f)ûÈÂy1ù»œ‡U†°–b}¼fγũíÓUf9^¨,ສg(+:ÒvÏÐóò½ß؉ñΟicÑ&p!ÉÖ3ÇH«Ä]˜ù" î¿ôR3§†_ã’J­¬iÖ}3ÃJ§<œh„ 3À_4°çeÐ%HD fª‚ª‡&HTcÄgvpL†£ñ®Ä3m3‡TWµ†%ùÓBÊ}âú%I~Ä\áÌ&^ÎÐvTL• "TÕÖ GgpèÄ2Ò]á;þÀ)C‹ {Œ,ìY¹¦7è9–s +ö7n&„B¹š.p{%ø*\¸ %ßÖ˜8e•^4íã9m®RÊgAW?­•â«.oh76 ÐÉPXd™2{²nLÏXý®u8ÊÔ­ÙB¡2‡Ö­bÏuNç7ÖsÏ J~ü™äM•¦ióíF¬‡0Þ—ÉÕ¿ÈöÎ2«—l”nç“oú«6”|‡Ç Jr!˜ÊbÊ|øˆ¶“q2XõüðóäQã콿À¢ ®ÉáÁcl×Ï—Ý~ΔêJ¢1¯ª"…‘Ê Z¸ÆÐÃü¹\ÌKðÀ$5wÅ¡¦á‡ZJ4‘¥*4› +IÅD³H?4“ÂÜœJ“ƒ•›¿$%èY}e‰ŠÕÉ$L(¯ÝyI 2Uü$4ðUðú3ÿpXé%DmßþAלÊ Cšv&¢J%­ ZŸ¬Úõ8…b¤CÁÜ„±÷'Ë*šÓ‚®Õéxô¨w |D$Ø•8Ò->IÝ3?Z‰ŽÉu;–ò(Ð]'üMÇUàJ"ôUøúÕAƒÆy¡¼¿1>ÝèPx,õ)òat{³Ü׆(ÿ¶f­()è­ßš§W²P<ðIˆþ^òÉÓØNiÉÇ«ß$x abzî¸8j_, Ùböa’è¨Ï`KÔ«Âu+«Û·kc·­¹| +IÌÐI íßòÓÇi€39!5ÄäáÃ^,$)¿Û˜p©P]¾ÃRÛéòfû&Ú_Àå„ÿ"r¥–VkDqO½`D’Õ3 ÷üà‡x|ÚR¶¸òÝ/0Å4oÈ@ݤýûÀçp»¶ ĉS켘=ÛY¸ÛÄkánšqt¢úþPoBÉ6rÊ.Ô«‹´òÕÇÂÛ^*6I7õ4·áJøÐD붩»ö¨m~Íb½®G¥!$ @ž¨KÌU*Y±ÂA§lnw1P‚™ÿ$­cV¡¿Û;ûŒ—lׯN„Ho6ÐÄ¥‰QDÕâsÉ¢”µE»È„Ó=ºƒKÞÆb9…~vÞhö%Êüžæ;ý¡(3»í ´ýMïo<ùb±AvC‰ö¤úÅ^ýÎFÎE3y¹Ñ"Ã>ßRâµV£¢u(ï5ÙÐõ%§?*ßuGJ¯ ÌÑ/R˜pÁéÎoÄí…¸ Gf~ö}7Òc‡ª%)o9çqâ_wǾ|¿ò2ëBdØ2ºg¬‰MÜíáÔ(rñ$ÿRÅôja«•ËôCîÉ÷ƒþûTÔ÷µT.EÓØØ´ÊÝ‹—gon)QTsï¯æ©¹¡_9ýuÁæJO§T´6^Ö´<‘¥§³ù6x_Ç`X‹àVpÔYá®xèøãûŠ9Ÿa?…’¡ +0s¯ÿò×}+4šlØõ%7éì‰é.d·AAŠfõ>DÆc,+ÁÒɸYw + I³4sýõ;`°¦Öǧ‰žCͨÃE…ªÊÕˆ@ Òöà¸ÊĺÈþíØûz1Ó$Þâ†uFØä}ŸÙ†uõSÍA›²”ww›ž4s{+2‘'¡ð^®ý2ú;ú3tŽ—R¾¯EstÛS+NyswJ,˜Ó¡j”môÁì‡soá]¥LcÒýL “µ¨æ]°&üÌ0”¾™E"ðJøÐp-¤þâ'´•Üz‡™PM¬eà©Ò"qç}É‹‰-.¸ý/Éì‡$íp™^/‰¯‰4}ƒ!Âo7Ï¢pn|NŽòSÎýë¦4%ò]$w(K&›°Í>®™i+·>V’åb`ȼ®TÜšyšú*§41êCãÒ‰Æsõò7Œ4ýa +Q6‘TòÁØá§dÑß’1÷uÎT(6R_m]Ô1Iä›5·DÌTÚ[W”e$']ûyá¾Ü²AOê®5 +)“âgÊ7Mýæñ(xâ)—8¾°Ù¯&ªSNù¹_ªÈ¾„Ñ8þ‹†óê^u;Œ\¤ƒ€¡w óµUXÌ(fMF#ÂìûÕÃL7¡¾]ñž°…šâQEÿz•óM×ÐQÜýóšÒv¡eôâ Ôº¾ÊEÉ,Ï[J[&i]»y’œÎ3³ªÁÇ}+gµ~mŸSÁ ¯-$é%ó¶ }Å+j¢Ú›ú…ÞZ£Ðã涨Ã`=ÙbÁWŽ›íc?fº¨RßEXAúÊ*O‹Þ"bóʱœf׬J +:¥*j@þVÂ_&u.Š¬çè<1­–øpåŠücÝ$<†³ÏãðÛ¿t!Þ!+·šFX;µ±÷Ñ›‚àbršïM0,M(×ÓT±ªzÙ ¦é‰ã¡`oßYÌÙ@qªÖq†‹þq¥mÜ7šqsU«£|6"”Í„Â +?í(M<¸¤8ôCî@Æàú+—»Ò•#d“P{—¤ù¶‡Ög¯ù©7½lŒyçÂóé½c!sª²DFà–=÷WË\·Ú8ìû´eÏ/nÃBÙî&¡ô˜››uÍûä/L»}Á â…Í ,~ ¤”vbÂAèªÐeE»ÏÐ/ÁEÑÏæX¹Œâ-¢aëͶîƤ´C³0Ù–,^Õþ”C,OkáÑßÑV *º[‰»¹Ò÷sç'¶±P™n¼ZÓ§€qé’:S·Ÿˆ˜QI •]žØ:h~ª¤Zoá@„¯-_¬N7,¬Š$J/’5i²S#*Þl¾.*zr¾È–Öþ)l,Œª;v`áiÏ-Dÿ¶•Ý»@%˜8…ÞB$ˆ«#O¿;Æ1‘ú#­Ç Ùa²:çu†ç‚†sž–ÿG3®áOpŒÓYáÚt1r¨Tü¼ÊÃÛYíÁ „BDùxµ»lûôY¿øÆw‹§™n¬XA{ +u‚jUãá(Õ6óü1ùõd…é†Øœ‚(øìyþÁ»&õgzYsNDu^$¯lÝsÓÚÙ¸¾GJÿ0¨“À{3†þíÇ|^/Õvyaq'°´¸ËPópnF3g=?!a;D+!}Æœ¸J[4=ËÁ‹¥Óa|_j´Ëˆìª«§mÊÎl¸?Êhl0|¬õ¼À†Ú5‹“UŽ÷5c3ê…b à ƒÖnœØ }Hdv*õ–ÀûŒ*±«àVVE,f–á b_Y,\þ#¶w"\¾ShÙ_½Gö¾’øì5D›™Õ3¬F·‚Êáwü¨«î¼mŽ†Þ{ ôq¬pt‡!ø¼„?dؾ@¾ ×/)®óÌ›æ(Æ2S9Ä_jnzÿZylØʌΰë&ôÞ\SËHôÕJgþ‡%>8”OIüi’&á’k{œ°Êêù% ·ã'L)ûúîºt¡zBÀκ),1³ž„føáÖFÅ2~½ ’—ÚpWš$€e]ã+ úYm-£Þ>ûBO˜™¨*³_C;>ò²[öMÈY©í;9ñ‡Ç\!ºÇÆ.îfÅ)>·À{?o&¦ÜV£D£K¹uŽB ó“Η’„ç7.Ö˜9<þ?Àñš&YŠ}PiäöTýŽ—)Ãô­,jäœvy\ª=B +ÁkVHÜW/¹¹Kefv?ù~‚I¬µÖ­êtKcuâŒ7´L-ø9è2Ìÿ&ÊÉ-¡ïþ!D°‡ú(jµ#Vo+¥ú1/±q”y¢Ì¸g yܲ ùN ¾æ‰ñpþÀhf%ǹD!a%Þ*kEty,ô/ÄéÀÛÅ°ú{^N:•ã Õ#£BiØðÇT§¼÷NM‚N“œC jJc38'NZ÷mõ±4ký„bWTÞ?PPÐ}ȈŒG/óTô›!|±,dGXSú&ÓÉr~áíÔäÈÅŠw]|Þ’Ó„cÅR4•ÆÀôå¼ÿo•oh{{t«õª¨©Îm²á1hi·Íq’Ö“•Ùsâ—-!w$¹·)ËëŽÎè«¢ÅÌWøÌ$Q« ~–tTÐëZ>µØèkOÐÜç©Ç®1#m"v©F6`Ûj ÆdXzˆ—Š‡+ûèD‹3½° [»Z{œ¬tùwNV]ÌÓ²ó,òÚ´nºBq#IMMPÄdÇûéTñK- «˜>“ÂÖFŸŸ”ePè’gÑq T6ìÙ @9y3·o»Y£ïrj—Á£è”ò*‰†³_þšš¥Ÿ©ÁÌÊ}¼ ‡yÚDþ8®}©{É+dQhÆõ·ø¶gN\Ïv¨ˆa¼)7Ü‘%8@l¶toúµÖ»¬É3í—ñHÛ]1vÑ£K•*õJÄlŒŸ©›€÷ÌýT´Zwýá¬A„vbCËø#´tñ6Áî–1©RvÂð!T{g†¢X_ô±íÉyþ—ŒÿOðÿµ…AœPGŒÿ_º*-endstream endobj -1025 0 obj << +1035 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 35 /LastChar 122 -/Widths 2099 0 R -/BaseFont /EETKYY+NimbusMonL-BoldObli -/FontDescriptor 1023 0 R +/Widths 2129 0 R +/BaseFont /JWHHZP+NimbusMonL-BoldObli +/FontDescriptor 1033 0 R >> endobj -1023 0 obj << +1033 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /EETKYY+NimbusMonL-BoldObli +/FontName /JWHHZP+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 /FontBBox [-61 -278 840 871] /Flags 4 /CharSet (/numbersign/hyphen/period/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) -/FontFile 1024 0 R +/FontFile 1034 0 R >> endobj -2099 0 obj +2129 0 obj [600 0 0 0 0 0 0 0 0 0 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj -1016 0 obj << +1026 0 obj << /Length1 1630 /Length2 10814 /Length3 532 @@ -9735,68 +9891,72 @@ endobj /Filter /FlateDecode >> stream -xÚíteT\ë–-w‚-Ü ®ÁÝ]A (\ -ww‡à…;AÁÝ!¸÷à—Ç9·»oûúWwÿzãÕ»ÆþÖ\k.™kÔä*êÌ¢fö&@){;03 +?@ dkââ¬ho§À¬´pQ6±Þ.djjq' 1do'a ò´f  )€ÀÆÇLJL ·wðpYX‚tšjÚôŒŒLÿ´üå0ñøwä-Òda y{qÚØ;ØíÀoÿí@u ¶ÌA6@€¸²Š®¬’4€NZI ´:ÛT\ÞZ1(€LvÎ@z€¹½À怩½è¯ÖœYÞ¸DÆg )è- èn -tø b8lAÎÎoï3ÀÂÉØü6°=dgjãböWovsû¿ rp²ó°}ÃÞÈTìÁΦN 0à-«Š„Ô?ê[ƒÿÊí zƒöæožfö¦.µô7öFó†‚AvÎ0ÐüW. À äì`cìñ–ûÌÁ ôw.Î ;‹VÀpZ;™ÙßhÞ¸ÿšÎ?ûü§îl<þŽ¶ÿÛë?j6æ,Èlìo9MÁo¹-@vÈÿZY;s{ë?ìf.ÿŽ¹þÝ_;CÿV„±™½À hŽüQÉü–@÷ßS™åOäÿ‰ÿWþ_‘÷&î¿jôŸ>âÿé÷ü¯ÔR.66Jƶo ðKðvËØÝ36ÆN€¿îGàÿfl ²ñø/ÿÕQøbÿï_aY°ñÛPDí,Þ„afcgaý‡ä,rš©€À¦–sc›·™ým×´3:Ù€ì€oÚþ=Ö· VÖÁ4,A¦Öv‰Àõhgö¯å¿Éõwñ5%Tµdÿ«öoO•·Mkx8ÿ–F[ÑÞì?ñˆ‰Ù»¼˜¹ÙÌì<N/›Ï‘ño¶žÁN wÀgVVV6ÀÛÿ¿?ÿ<ü ¤©½Ù_›£6¶3{[¶ÿ0ü›º89½iü÷÷ÿÖô¿Ÿÿ^{ ÐhŠ¼4oo*l•–™®ÅÏ“øÜÓÅ3âPÒ QTà_mßé—¾ÁWaôTÂÒ8ÁÿÒê1wäð¼#Ç°;Ô…gCÛùxšOìCIß]ð~¦‡q7ðã—´ôcíh¯³Y…uX=nV­ÝÍ1Uµ/'x’‰6'ij[zJתt_ÓÔú8ÜvÌF(¬Ú£cš¤ƒÛÚ¾áÁþÎ ¸î"Æœ8$jWX4š(Ç"a=Í -¯Æíwu»d±Ý‰¹ÜÆXæ§R÷)Áxãi³åyª¶š—ܾí9ÞYò<0”jûˆ/²­pÛ2 D¯"k<û¶¨ó¼ˆ­pΛlxEv'Ê%Ëž…¹`|R_•·–ñÿd{÷ç9óÙ¢Ü߶e@°-Q–äÿˆO$¯ê2Á³|ÀnåäÉ4¸Ø¢¶œ£íG>ÐK´®‹²üE{ÝsÔGµ÷Î~ï—¶Gí'Ä”›’V¬Éà‡$¾}¿6?dÊ—|ñÔ'Hr;ùMŒ]IJd÷d“ÂUu?¥¾q¬Àe¢zœUú… ~Æ¡dë/O *‘¶²læ ³,D/L§­„Ÿ5)¹;+În3†Ô¼Á¼ô× ÃXؘA¢(¦! rµšT ®çjm¿‚ˆ"ê:=8„é‰ÓvÅÒýÒ´ÉoèwÌ»ã¿ÛŽû«h»‚¬Î.zµŒ4Í$‚Ÿ!‹8s»wè«© }ÌT8-TCšP×í±¿Ò‡š…ß¾*hÔ>_˜A‚»êEžä>A£%»Y÷¾¼Ó‡— -bEh;m&¶2q@¤}Ï7 ëX£ÇuénÉ=µLiØ®Z#‹ ÒÃxLçÜȾÓ>•ƒàÑYô…Í ¤qk#è3‡ãMà¸ò“üLvq|ìD\0D¿Åv „|uw•­ K³KòÉôﺸ씪ÊÌ=½Ðz ¢˜A‘'¨÷GêîéÃä}-.ÍÒ!˜ 1†Akµ§„öŒÜ̆(;¿+ñ‘7ÕÖÊ(C²I|ÒAÿG÷CŒuŒrQÑV…=3åŠè’>·uŠ?œ5Trh¯©ŽòÒ^¢HNåç4 ’/Sîˆë‘~_Ë.ÿôa÷rû»õPã ôdìo0gùš²þ›D"îbHèœé–š”¢‘:æ]jx6Ϥ0õ!5½‹%CDAçK*Ë3W'Á¤='€.I5p4¬›#CF¢NóÕ`Âv'F.ÛB|Ê]ÞOŠá€íú #&ãøÆ6“¦P~…‡mŒo7±™›1Ϩ)b´S«ü²h*^‹ÅÇâçü¸ð1~çŠæÆß_ÒEàj¦cþسի9ôžÆP±&*Y £ xkâÇ¡r_u¦Ó«8¦Ca1è³M/FìÝHHºq˜ÜÂb¿Ïá[l×êkû¬úËƦ¡¶¯F$¹äÆÇ´vyW -†üdË‘È)ÜÑ˹ʱ„ƒ¡¼(«BuV•ÚèHbNÒnAÂé¨X^‰$2a€ÕóEч(¤hÉãcTsë5V»´"ËŒV÷o¿=ÍÊ~€íçÙ7¡èûÉ;ÊÝ/ÁP®}€ ƒ·õMDK°+Ãä²4'ø«<£¥sâáÙ9,ìú)t aúBD.ÈÊ?ÃîƒÑ $ÜjIàsT¦9õ¸zNÓõ% (ªÎ»é}ìsZ^N Û÷FÎ9PJ‡¦4k[«ç f4e«’ùN·C Ì«üj}B¨ª–^xÄ€(4ì—ß«qe Ë:m“®Æ ö¤¼êͶW=§µjØÊo„’Œ 3²8yj‰ê`nûÁâ'YÚTKM”‹ùÂÔì %Ù³¹Â]¢þãEš ®ßHœÑ"P/V,N~οPóÙ3ãþ™Ç ­ù¡cÈeü¤S¯ƒ´ -ýÏTa%ª£3»Ùª]`ÁQ êó}³x:HX¿U;úŒ hHØõKጬ‰•Y)f.¤«â£Þ„ÇG8îàôº¯a»p7åsÚBc£µÎ¥7apx X&_­ð¬)wMÔY„«9y™ÁŸe!Ë×÷*$“ §E¿jéŒ)f?ÂwJ×ÓŽRIßU±($ {û‹xÜ©ÎMYÈÅäJõÅc?—Þ^Ì:yðý¡_nA7üÕ©Ô–?Ài¤kðÉPHRòÎzçiÞY­Ýû+Öäˆ2…tzW3¦Ž­à:]q¨¢–½¾:µ;›ôšÿL±î\ì{¯1üÛüë]¥ôî•ÀJªÏªœûÄøø¾z$A)ŽöNÏÊþû>ϾЇÑu—ßR±Â ö’ºÛua{Ø°¨ï•›)wËÜ%ÒUùœ×“ǘy‰–wè–š7ô¹ÇÑöˆøoµÃî:5Nö˜~ø§•ûß¾ËPéä—b@3¢€iÓ,m ¥däg àø¤'®/}"Lø¡-”ÉP&kB;…}ü§D7×±0œ^þ +ú)[¾ž¤.ª×VYzd,Ò#áx]RÁÜõ]òe&`”2Ÿé3WÀâ•ZŽ°X…Eµ®ÙßWÌ¿vAJ|,„$={Kýë§Ò/Ð0Ñ4ͨÙEiÜ.äîOîþŸmÏ)¶9ÜÂOq?¸ ííë[ï]ÄtŽþF™]ðL7 -—ÑÅW%HkÂE©(ˆö6i°¶&b°Þ¨ïnwÓ÷߀MÙð#îVbjXèÿÞ«[k‹ÄA³±8Õ 7j/I$Êý¥í¼ž;‘zJFžÀÊÓÔµFÑÌ®mÆ"F̶ƒ°‰¢2­`Ÿ¨3pCQŽf©:ÇvlÔÁþZ[zCºåçš8ÓîŠu¤ì5í¶rÅŸßÛ¾25ùŠ †ÒVÔgó°Õ_Γæ@ÒïÅ™…Á)DWÐ6+Þ­ë ‡ñß¼©MüâÆaªƒi>_ªóCËLD CP]ÐúÂL½\=ö›ŠLE Ñ:Ç¡õ>_ç¾”ÕÓDÀ`h{#oÜ1§ÌT«®X²é¦ nh¿,ÿá2ž’ ‰ˆFÙ`TMN>ÜïO?èdÚg>|Y×ð²,"ë•ÊWBJ° ‰ëÊw ª7¹·DþAG—/Øi¬\¤C§õœ.óbƒAÆ.Iµ +ËÁúŸõ#¤½ü?PÝuØ¡™BŽTÜksmuçÛÇ¢,3ÔZ’ÌQ|7û³Û;eOŒF<¸7ƒWÜRgò Ó· pVÖÿÐÄ÷èæjnr–+zóX܆;$¾Ô%€ë›<«×³!ãq/:˜µõϼ¾†<…ö  ÝðáÌ´w4`›x©¢†1ÖñÉê^ah¤K¸$J^¿ö†[ÖÓ¯õîs ¼ëÿz†¢Ä?÷å~.õŽÇá[„P¬€Ûð»-kë‹ý‰ÕL°§™ªï 4ÁÚ‡þ Ir¾ëýéÝ´g3ì=jï©l¾\þd×Gpá"V‘tÏÀ¶5Øq\ Ýv¿r›âÝß {?ƒ™1¿"‰IRœ<-²*Þ]²=¹E7œA©B±:Ž#¼²ôäÃSPÇ­^1¦?˜"PPŽuáùíWý˜òiÕÒ‰¸’§‰_D³-ZV4áÐ%TLo bæñÛR_—žãö“øì«úá”ýcuW Ÿ¡Ï9 GÓZ¨Œh2Ù×’Þµ¨,©û)õ悃Lµâ·õ $Wjþ%ÚZ¯Ôfß¾«¦W¹êdî-î ±íynæÂÄ(è1ö2|N¥ô]kÃÅ%200*«›ºR„1¬/ÊðN÷ìóùû‹¨HfÅ¥KÂe«]ú,fY…b!Ã)ã¾ íÜà…F˜´ïú¾rùª‘œ4å*Ù÷îÝ`ÿ6[ítïhwýÞ¿}ù´¨Å0VÅ‹IE™B;§5 ÁÁ"MLýÝI'òÛlo©?œ¸Q Mù%K²Ñú—¦ŸŠ½¤†Â…¬–ŽŠ6tÙÌ ª‰ÃjºyUqjRì™IP?þ3i^p…úÊ*÷a]mVºúÔ†‰lHÑ!_ €è&c[Ï“â)¬;²ü´®ÅêüôÕÒ¤’ÞúÞž¢ùI1c¥3N¨œ£´ ’©JçâçESNÝ“Qˆ8jn'Z, €"¬ õϧwßÊ[…—~Œ»÷‡zÖíO‘ -rÍå…Œ†ê# Rßò,"lêþ¨¨T"‚è:‰¹'\â­CrÞ×z,Õ¸ §A:æ‹Ïg<¬>Ú'dPîÐÿ¡1ŸibT,­L”¡ïéd¢º6[*1½[)R«¢x úJ6Ž°ÉÊlÅß ùЇº¾“¾%ß6%€ÌZ€ÿ@ ×/Û:œŒœPœLö'½<Òpk\yOO6ÒÐÆÈÔ©B"ÑitÚ>€Bµ8o)vçùêµFÕ¬$¾üESúÀŸüY=ÁÂýŠŽëWÝÏ¿6nhϽ±ý;]¢f%(ÞŸèA¸Ž‡yÛ$o/Aûv sÙzOÖÆ’±È^d¡›_Û"Õ3ôܱS+­¸Œâz»ö­‡?5Šž:¡ô´Ä)lI_%Š¨ ªÂý»6}ê™;Ç]CË‹/—øMÊ›md>&ö3¾OÝÑzÙ¢²ÛbÒ¿'•?OäºÈ"`ùÌθrÌJâ˜ô튓yðYtè»;íAýºû);†1åO¯º2¶€ér´¥Ró˜”LÓ Á©^šv¤öŸ‡G/„ß_ú±Ø«'.‰ªÔM“k—K26é÷ÿôWSºÛ§¯÷ŸšN×V¦KÃã|³DZ£…C3¿åB”‰…³[ÏY *J“›Ûä—añüïM–͇»‡[R»³Ÿ"ýŽ‚fç¹8¬™^} µö:›QòbSpìØcø±gÊX?KÀð~íó‡6ÞOX¸:âZôÍ  -+Ë,¶öyL,Z&1ÝÍz*ÐßeÑIå²ONçÓ‡õ™Í#ùÝ1Éq…•-eÀh‡ÛQ$ßn:pEä®Àì]05‰°=5˜®‡¶­2P‰5eÃí+–an„UÐŒºÎ’x Ù?ò­ëue¢¯ÓÒ )Ý7º:n:<\6¶c¬ÅÎjt(âHe¸¹Tس`8œâß?0­•ÇÌщZžôOöŠ¿^üŠõ·="æ>ÖÝJ+u@ãW•DÞ,똒7•|›ðÝ쨾ýµ€€@Ò¾g[^VÙMÅÎÁ/kÍô)$œ4Â}ekñ{3ç~ÖOøA)D*v"ŸX{Rwª*S -aÉÁ_¹5wCs̲ÕûÖþŸjÆàùØ÷–¯ž™‘ÌJþ¯swQ⢃³F‘1b˜üÒ|ë FžøßIµç+x-Jï)#ÌÙªëÃn¾(ýpð»*tYÜÇÎ}Å›Ço¸Æ³jÞÒ±ko{!dhÖ- \˜`[Kþ)pLžXlø ÈÖQø~‚¸×Çl7¬S¹þ›¥*¼”>§Â.öÝìþñÃdi‘;`‰‚j#–•µß¯XB`ZdHnh“¿èI¤Ž$Ì‚Õvz!Œ^ !+NypÛÈŸVͧÁ`f–fU®äi l'Nªw!]ÅúŸÑ|È'Žb&‘$US —ŸÞF`'CŠ‡r(¾Kª‰;Æf+eZ´X‹+öÿ说oÙËøX9—í¸*¬^™FRЙÿ£ÑFï…ÅAUÂ͸)¡Q#>£0Æ*Ú¹:R…€à”%áee¨±¸ì¤|üi3bNdoÊåo3Ç\³RŒ†ø9`S? — ®ó·´ƒQEûõï©3ë-1F]ÚKé"Np÷#Ò~ ‰JIa†ôTA}Zê˜ ÷V¸ ƒnq7; v›™QC'C÷"¸®_o†™»NIÆgŸìø‘Y¿_µi´ÿgD>Øæ° âe©!EG² 'f«µÙ_—ï~r›þÊÂIöÉéS·y_!ºn×®æHQ–r5¡XÓh€šé©)Ñjw(üÜ}ÌðÏ4|Dp_CSàë€ÚÏ!œñ)— -Á?§†Ï9?³7mhÓÑzô±Tk¤Mˆ»’jÕ´¤Ò«ÑÞ™aä­"5šÑ´ïGZ‰CFp)6õçV{d0¥álƒ%8ç= -R §Ïò‘”-ý©¿+ÛU4¢.^1Q0¼[ç>ÙÙg¼9!‹/JÂ@¸N´eiÁ—23Âoæ+Ãçu#•!O°éÔ ìâY@—!WùAŽ…ó¢fÂŒpV[¾Á)?E ‰/Tc¹Þ]¬É0×aH¥RÜóªq¼¯)XßúdᎪC…Ð鑼gˆˆzéže¯¶-…¼ÏΩ?iž¡}Q'ÓÁfü Þ÷ž¬c6_|5µMZ@·1úf ñ9êês ª]ÜÔæBZ -®0QU?Åt v¤T1_¼Yp¯ÏÑn1×’äê'ŒWÔZB¾y¶¦}Âw’ ë°È‹G¤Î -f‡dúë‘|3ÝÖ¬9»pï°h1ûó¸í•½ÈW©”qn‘9¤pÙ²Q@ýDîã6Ó>ëo\,«m÷º·óSP¼ÕÆé‹cŠ˜/»f€¾-Ïxˆ®;SëP´JáŒU'â#VúÝ](ëeQb}–¡˜hïá\¢°»­ŸÓ¢aKY3Ê´R°ÝĦŽTWòã?É ç4ÙÚ¼~pÕôÉs;.“=@K?ò°ÞŸmG¢«Óg‘n1»€˜ótÆ[;ËæW{¼«ó¼¶¤êqáãï876} ÎÆEòY‚i›XëzPD}ÕÓq>ÌÖ=¨[ÓeÚÚÛ-DuoãáTç+ÄGQ½Ma.Ù¹êÜ×,r„U16W Ý¡UPÎQâ sªÞûÛT—ž´Þ>UtB%®Q?™†o\?‡c ©ãàò DíDÞÌÁ<¨‘‘å±cW'}¿ü%)yõ(¶Lz,£›Ú÷=Á‹º“Ûˆƒ„ªk_mÖø'\ÿg:óÈm§j³.”ŽÑ}½³‘šÞJAàȶ¨â>ÓÇBt^¿æt8Lyäån¨ðª~ÛÓœ„×RD"Ÿ"nN4U¨·áìDz./)6dÏXã¼;Îi8D• ÊV7yüöX¨å! v”kÝÛÓ¬ÙÛ’Æ9G -#ª5¶ãƒýŠŒ[ônjŸÛ\vù$/ãRÖyÕ\-¨üKŽà|B8x“AíÁ.O_JŸqD×=®_ž~:? ³7—2⊦Ý|jèÚ~e“hŒ¬Ò`2Æ`PzwL˜,Á”‚Ó­à¸=] {¸â>uD-‡UÙð›Ãí÷Qri|& -Ô>ÏíFŒòóGL2Õ×i#yûyNÕÓSáÄ.ì(¢ ê—´®u߃]bùž¹Tè²ÕV YŸ(uAyFìT½ª7?‰ã[×4¯#ã:ªÞš|1¥·cÿÂÄ=SŸ¶Q,hÛñðh]©¤ßûàzÑ÷ùÝQywÚë\ç£V}—À&}nJÎ_#2ž½+¢û%Ì°Ë=NIW™H9ถÃM”†òó?¹>HÛÀh[ÃdýÀ#þñøV¸°ÏjT̆Š½Úß'9Q£•ðD -ƒ¥=Ûe!sdê)‚.l4lóþE¿‹'@ÑN“Œ -žKXø4¼]íywbZâü™rœ¤ÂQ-<µÏ¬À¯´)"‡£]·ˆçÚ\¹çyy/Àbý‚ .G¢×.èßY÷®! É>a'c6CU¢y{nÞ#‹MÝ¢UüišB|!# V­}'­5®Ð±äNÆ ]túPÑ:/­ò¦X˜f9Žó¦žWv·Ô•©:N"õ³g²N î‡íæV¾–HYÈ.J°M¼FWÁqAéoÑxJ!&Wðˆâ­Tþ“$(®m Xïe{Ì××Ð8]/^¾g«Äo‰M·9}SO‹ý‹³n£zbÏ<3³ºÍö½9dÏDy6ÔDPM:Žð˜S“ wh…µ„cK´Äã‹{:Qö¦Ò-‘þh[N½œ;M7 !ìX¶lç -ûÆnÅOøÙ/šåvýÑ;Á¿Š(æÀêzÑÊ–>ì9¬Ç”°n÷ùv®Û·Y^+ùå+ÔÅKl—‰æÀ+gbïç6Å”E”vÕ8÷¸Ü¯¸.ÔF,ÜcjÇqx"3¦Ò™L•*×5FžÅVÝMçï©Év%¿ã´Þ'£N·ò6iM¯È-ËÅ8ò̉Xµ3<³ƒE´p“®Rºçègk,¹,1MwðM»¥&©v#(&aWgXñïs’ÓCˆoRlãB& ¬Wb_ÎíîŽNGW 6Øgåëg5ˆ¦:”'réÑü_³Ž§ËoÈtö¤¶egSÌUlåÓuD%ÝÐ=Ü~¯à0Úò•K èñ”ê ƒ\¼Úˆ½ À'&Ñ>—Ä÷VåTËïuXg2YèfôŽ ¿™€!m†×<^¢¼™=¹†\„¤žºŸ3>hÙà …ìwÈc>Ûºa/AØÛŒk1M,ø}GΨ|ÐÕ¿ÕSÞ=t@†šÆZ‰œà¾‡_ö}ô€–d0£¹¯”xP× òóvSF¢Mv˜Hv¶y@¼ ½„uØ1åÐØ,*Á×ÍE -® v'ö½Îln;mÿFN• +/Ÿ3Áô1êˆõí‰~4HFz>5#Ε{}mBl+ï Èà+S>îϵ ³3™ýžYZÍ?º°ü|(ø«8EÛN¼-Zr^’3©ÒÓ8 3ÅX£n Õ¤îc„Ô#gAGŒT3$kÿu‰mßêÃ0¦ô%BV¾®”ÍXKƒ²ÿ )¦|¶¼,–…WTгOð Dt&’vm‚¿[ñ²âñ‰hÿOr£æ§E·úÔ‘”˜l LkO$&¿Tƒc¶“Ùå€ýfSœªÝËX¿aП‘$ŽÒ(HÆ[®²—|þ§¸™¬b 5Q*ëkbC™%x=ÒqYŠ€¢y•#HÏGNJq¥RÚ‡o•C¡ -«÷îõç‡k¥¨9îx]R Éé !lŸàk<“™HÏÕ2Ú3'Ð_}Á±nwYíÖP¤z™$z¸ˆå¬uBZö˜ò,ïД‰ˆ6”E׋8'<óٔ᭦ó'îôÇÇ)§Óˆ%£‰[LgPÌùÃ[VëÁçµü÷=iˆçv¸#¨<¼‚¿ÏûN¶Ë9·©\qwqVb§E9¤»çóÆØ';†0€z!1q*L»_E³%)dª8„qb" Béãkë}™`_ölz?d(d𠺢¼ùŠú·nöM|Îëv N–È1@´é}Þ…gðvÉ–ßoµµRj¸Mk5"YŸ~bÐW¯ÔÛǦ¤}wQ1øA³x/ÆP/3Þ‘,¼#[¹3'Ì™^4ªýJw“çM›vŠ%Y37ÚZ-í!ÚZ„¯Nêý÷ÆA@U/#ÀJG4½øˆ®Lš„(Ûq¤—ZDÉŒf%)1[1$EβU?ç]ùÅÏ÷àº|/»çº86е"¿(8°™NWÎÿJÙf[ÙÉ(áåÊ=L 1û•œãBJ9 q•Cqƒì.¤Cj]ÃðÎ/b J:Hüäë0=—›g»W†0¡N¸ 4Òa,‰FˆÐtoÕ¬’«]G=ç#þ*½QÇÅ[àr4XÅ,[‹LŒÑÆÀ%D줫v‚SËBYtD\éLrg¡ÒsX?ìbW,%´ŸOZM3 Ý$Ë ÓÑïÜ„u“={Êãe†pæëaú<ž¬,®O1·—ŸbÍIÞÐÅPE¿p’·^¼à|ˆüÔµC?Ìçm£ù kòúšQ ½ U*<\£›Œj¶sP‘>N¯Ý(Ó ñjùz£¼uRX,Ã"É"˜z2Â[°À´3Žœ}ØÏ"/³Ö@~Ž!¶Q'–Mªý.¤äøx®9Í“xNKÚ¸ìì -ÏÆ^é(t{äg^Ì)¾^Äyoߊ“8E˜‰YjÚ é]ÁØ¥ÙDf’ø iÌÌR¥®Û·‘•¿#ëÊቛ¯½ð“_“9>~"iú -M)Ã9Âp:Ä'°ÂyFJv5„yfù¾ZF|šÿ˜Œû;àcêØBüß›©î¬ÃŽNÌtèÔd/O7ðŠëË–“Õ7ÑyD¿‹31ÓóÏ÷ÈJ¶b@=­Ö“4Õ -G‘áR웸5™UP®ÇÇ°H„×5Åã>½,TGè±8ñª4ô~È®š††,h»®ß z¿š l–,hËÐ%ˆÁC}ìÜbÒŽy’Ÿ&þÕöZïtï|çil¸#é¹–8!}BÌ’ñé{‘ˤFX.K·¿ìܦ|ºgÀM¤ûÆ¢•Ü=ÿ=²X_S`ìÿ<ì)ú¸Ô#»oøý–‹¿ˆ‰´ƒAF;ûû -Ûwôd¡Üw÷xgXøÉ\›ôi3“ŒIDί¹N%àŒ±éï\á>Ø°tmÖ$¼ãÅ,ñá…uÛæþCU˜Å6é*xsÈé4矾½–çëOf%,RKÁÖñ¦¤EÎL_2¾›Š‰iŸ¯œ±zÇÍÃÁs}~± à)Ë~ת0üÈ»€ñ¹R.Ä•!/`9ºz\h­õx–jÖ‘þ:9OñÉÉjð‰¬”ÔÌ°–˜Þè.h1ýdftX*ÿ7=™q FB1w)ÝúiC$ü9œsðàÒŽžQÔÄÚÂdÝ@BN~CªÝ©.ÉÊ¢^r’¹º¨JªÂ˜ †C4|¡" ‰j&m¤cYõ"¡ -#‡O/$v$R®cià¤Çâ÷Û¹6AçU‘©®¼n„ ¥Ä£Ïš‘mÛ«ðáäwãëuÃ&µ!¿®êÐ0š{©Ld"Ö½þ¤´4¡æmTu{5v÷­õýT_ekp¤¹¾r§Ð~ Q4ËÍRK2'¿ÊÀRŽõ‹l9Ù‚<£G{{©ÅVØeÞ=þ½ãøkæÈr by&?Ý!`@Ê‘Ъu iBškÿSéɾûmE@Ï4Y×^Y´ ~MÅǨp¸ägÃýö¥fÜtUAJgi/MüañD…+×»v­ø‚|ø¨.‡£0å÷]°k{r|xœ4Cäcüá5üº)µb2sàŠyÄjÌð%Ç)œ¯¹©ß81-?­ ‘#™ÄJ›áå#“DtC=ýHn¥?n^p ǧaÎ’òÆClÍOäË°¡·¯?xæÇñô, $Í 0ôfD ~xa*îD«­†S˜Å8×ü¼Ž/ÐÞQ]‘E „7d+À©'8Ôô«÷Õ™X²ü¾†IÓ:Ùÿ=Õ-¼°îŠ1tgþFHHÙ´.ʦ¤œGºßFúÄÇÜ=f¯h®N½]Ï©6»‘Cò°xVÍgŽÓ´¯*ʯÃÛ2†Ÿln»`Oêçl~’»×&PÑàoÇAóa|TtžòP—7ÿÂÖ›xS4ð‘Ìâ»[kSø˜¬O¡Ås§EÏSa$(’§œ¹¼m1¾>¨AAç¥ü‹#’ëµñاw“t“Í•…EYOU)-&5[ÍÕ” ÐYÙ>uï¯tH¸KJrãGÛà´ç«š4¥`Ê,c%ò¤üš½›õêó­‰îÖ­æda WÓæ'öj¹·„x!o“E¬{Ÿ×I„¨€>×ô¯R.ÁŸ_fnÇŽÜgJúvájï JPnÑ‚ûÇO⮊²]À¼^Aî^‡H_¾ö•ÑJr(•³¡ I[ Pȇy°ôQëG»ÉöQ  Ø}ê˜;AÊýì:ìº#=É“(þÊ|>ä®ö’ÚJ³òW³§‹„²ý:wR­äL -5«€ßbÑdûClC‚eÑ3›i“É_É>`"cGKó‚+îœÂ”SË%ëŽX½úð±Å­¾ç2]p ×9¢øõÛu“°WÙ8å{‘+cc"]•Á½[ˆ‹uÔ§Š®åëÜe\¾"Õ?M!©Ø‘5Yñ>>ƒg™. faSçõ"VY %¨öôÒPâÀ}ç_~[Š3šXh¬Xâ&4ã‡4ó ZòU‚õ(c˜äœMÈ>õ”D{Ê=ëÚ -B4½0üÂåZ8CÆzh¹Äõ ë­ÍÙ”™\ÛÑíÎ¥+ò—áE¢ì¹:BZ -ï!ÖdÙÌ>‡·‰—´ß•D¿l,¸Y‡þl½P ºñé:®DÁUÃñî+k#/™P¼|±ÔTa=Õ*¥­T^훳ø®Q¶t°HKZ®Åœ~`LgÊ`ømq%['=§!Y§ù“%–±y»¾nrI Kvß3g&r–÷é¹ÄÈ<j<~o™4iu¶ßL‚Ó´äÛðrœ..½¥×hÀ³È*ÂKÐh©Oañø.[ždZÏáƒçÆ"òŒ\#`"*äªFí¾a„tßÓÅ*YõaJFÏ*‹÷öýä(ŸÇ%hmdfRñ›„Æn[C ñŒSÄoÖÿáùÿü?A`j4vÛÛ;Y#ÿch»Žendstream +xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü- )@h`g°ñññ!SÄíìÝAæ`†š=##Ó?-¹ŒÝÿy‹t™ÛhÞ^\€Övö6@[ðÅ;P€-€35 ®¬¢#«$  “VÒHmŽFÖç·VL +  ­`fç°þÇ`bgk +ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øêš +š’JŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 +k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–># +sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦¢'¦ãfü¯êäœíe'×ijÞ ^ú«úò!,lÌ@Q“àx¹ ªy—3µ€ÖßDáµîÂôÄ©;bi¾©õZä7ôÛf]q?Žlcß?‹}…U´YFVg½\BšÃfÁOAœ¾Ý=ðÑP†>b*˜ª¦ ‰¯írß[îEÍÀo]æ7hÍO#Á]ö aOp£Ñ’ݬyÝGÜéÁK² ´dÝŽ½6[ +Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâº$ÉvŽÏÊ~{ÞÏ>ÐQµßS°Ââ¡v»Út`{æÙ°¨ï•›( wJÝ$ÒTùœÖ’F™yˆç·é›Öõ¸ÇÐv‰øoµBï:>ï2ýôK-ó»}—®ÒÁ//Ä€fHÓªQÒBÉÈÏâÏñIW]1NúX˜ðCk“L2 Ö¸V2ûØ/‰.®#G`1¼6ü~fÔ R–|Imd¬²ôðh„{üÑš¤‚™Ë»äË´ÿeÓ.ÿ…Kµla°. +‹jm“Ÿ˜=~ͼ”øh0IzÖ¦ú·O%_Ã% óa:¢hšP³ +S¹ÏÉÝÌŸÜü¾ØœQlq¸†=žà~pFÛÝÓ³0Ú=î,ùƒ272ï‘,n&£#:$Š¯JÚ0ˆ/ŠRžåe\ßoeEÄ`µ^×!Üæª-î¶ÿš¼îKÜ¥8ÈT?ß÷£G§Ö‰ƒf}a² nÄN’H”ûkëYwõ¤.<¥‡‰Kµ¢©mëŒy´˜M/a#EEjþ >Q fÀº¢Í.RU¶Í舽ݕ–ôºtó¯Uq¦SÜe«Ù+Ú-åòëhŸÛÞR5ùò` †’Ôg³Ð•ßNf@ÒEAÉD—ÐÖËå^-ùkõqß½¨}cÇ`ª‚h¾_¨óAËŒ‡ŽAPÐúBM<]Ü÷ MD Ñ:F¡u¿\å¼”ÖÑ„Ã`hy!¯ß1'O—©.[°é$¬k½,]sMʇG¡¬3ª&%ìõ¥íw0í1¼¬}ö´($ë‘ÊSBŠ· Žë̳§ª3¾·†DþIG—'Øa¤T¨M§ùƒœ.ã|AÆ6Q5¿3ËÞêŸÕ#¤­ì?@ÝeȾ‰BŽTÜscueûû%Ç‚,3Ôª?’ÌQ\û³ë;eŒŸ†<¸7ç—Ü×)Óyi›ú8Ëk×4$qEÝ:9œeŠîG<æ÷_àˆ/tàz'Nët­ÉxÜ +÷glü2®® O!ÝèCÖ½93ìôÙÆ_*©a …õD¼3»–èâ/ˆ’Ö®¼à–tõÊC¼z]îú¾¢(ñÏ~½ŸM¹ã±ÿ.#à:ônÓJÆê|ošAb%¬Äiªê3 M°úá]@’œïjoj'õÙ{˜D—ÚëF*‹/‡?Éå'Å!\˜ˆeÄ£Ýó5ئ;– ¤ÓÌî[f=O¼ótï«?=ê[("1AŠ“K£IÖOÅ»C¶+·àŠ3 U VkÍqˆWš–tpêþÌ1N«[„©Ë¦”cþpëY7ª|Rù³d<¶øiü7ÑL³¦%Mt1ÓÛ‚˜†ºĶÐÓ!E§ç¸ý$>ó*€€~0i÷ÄXÕÀÃg`ÈsFÃѸZ *%šHò± w),M,Ä~J¹9ç S-ÿc5 É•’w¶Ú#µÑ»ç¢áY¦:‘s‹{hh}ž>76 |Œ¹›U)y×R~L H€Ê좮!DG íM†2¸Ó9ýröþ<2‚Yqñ‚pÉr‡>Ÿ‹YV¡HHààCò˜O}÷x¡æŸm;>¯\>j$Ç9Jv=»7ØŒBW:ÜÚÛ\~ôm]<-h2ŒVòbÒGR&ÓÎjÎ@p°HRþtЉü1Á[ì #®W@S~õÇ’l°ú­á«b'ùÙáÜVS[E ºtz“ÕØ~%Mˆ¼²(51f–L›$°ÿ™Î¤/¨Ü}ù•{°¶&3M€}rÝX6¸ð€/@@t“±µûIñZ +ëŽ,/µs¡*/m¥$±¸§Þ˜¾§Û›§pnBÌHé”S*û0uœd²Â©èyÁ„Sçx"ŽšÓð§ÍïB½þôÁü{Y‹ð"ÂÏ1·¾Ú½IRA®ÙÜà‘=$Aê[ž„ÍŸþ媓D¸“§B1·ø ¼•"Höû÷Åj·Â¡Tˆû\ÑiÀ´G¿åG»xÿtÊí|ú?Ã4fÓmƒŒŠ% 2ôÝLTW¦‹Å&wË…j•¯?CÈÆ6X™-ù» "zQ׶Ó6å[g#Yóñäúd[†’°‘ã‹’È®óÐË" 6Ç”wue# ¬ MË%òG¦ìü) T sbw^˜¯ž«TMZ‰âK_5¤÷ýÈ¿“ÕÌß/ëâ¸|cÐùò{ý†VðÌSÛ¯Ã9rFòâý±6„ëhˆ·u^òö´g?›õ¡çxu) ìEºéµ5B=]× ;¥Â’Ë0¶§s7ÁjèSƒè‰#Jws¬Á¦ôE`"¨€:¾2̯sû6Œ¹cÌy!¤¬èb‘߸¬ÉZæc¼`ãû”mÍ—áM*ÛM&½{Rù³®óL–/ìœËG¬¤Á‰ß/é0™'_D¸ÑîWÛ­¹ð°cQþò¬-a ˜,EY(5JÉ4Nœè¦jEh]?L;x"üùÚ‡5Ï^Å8~AT©n2T³Tœ±¿A¿wÝWINîjK˜z¼Ú{jÈj9c¨(Mll‘_Œ‡Äñ›¿7^2êjNéÊzŠðë? œ™ãâ°bòY- 3cjåaŠ|Œ8í•»è‹p¹•2N¥€¨Z(Ó÷:c½JÈúMÈî¾vN›êè¥û}pÕ¿À kCn-,xŒ‰á¯Y®UÛ” ãç‘O(¥ÙýÎø'ó–CEƒºªëØeŠ ÿ€O¡•ÎýáÜ!ÄÕ³0ŽÿÙ™2"s¬o£w²;ÜëA¦{J(…5 ¡YlYÏšÈÚíi®Óâœûhå5ÄÊótZÉ“MÁ¡}—ágøN¬ cÝ ‘?ÃûÕ/Zy?aáj‹‡kÒ7}€*¨(5ߊßã1¶PhžÀt3íù¥@—I'•ÃB>1•GÚk:[„Pè{Ç$ÇZºô£ n[ý‘|¸aÏž³ ³{ÎÔ(ÂöTo°|кÂ@@%Ö˜·§X „¹=VA3ìB8Mä%dÿÀ·¦Û™~´FK3¨t_èl¿i'pw^ߊ¶÷?­Ö¦ˆ%•áæRaÏ„ápŒ{ÿÀ@´Z=GD'jqÜ7NØ#þjpþ;JxvVÔïÝô°˜ÛHhW ­Ô>oqd"y“¬CrîdÒm‚ÿÓú¶sÔ|I»î5lExYeW[{ßÌU“3¤à0Òp·åÍ…Mœ{áX¿à¤©Ø‰¼ƒaíHݨ*M(„%~çTßõÎ60CÈVî³Yû~©­ƒ?>æaßCX¾ydD`0+ù½ÎÞEŠ‹ÌFD‹ còKó­1zØãÿ Õš+çµP(¹§ 7c«¨ ½õÿž¯ôÓÞ÷²Àya];ço¿©ÿ +ϲiSÛz´­õ…¡I§ `~œm5é—ÀyyB‘Áƒ"[{ÁûqâoÓÐåºïªðRBøœ +;Øw3øGæüõù¤…Þì€E +ªõVÖ>ß"‰Ï“Br{´5ë¼â@u´@a¬Ö“saô| y\qÊýÛþÔ*¾Ï|ffi&Qå +žzÊ6âÄ:gÒ¬?yéM|â(¦‰RÕùr ði­æp2¤ˆp(â 1¤¸£œ¡æ1Rᨅ 59©ðÏ~J{ÖÜñÙôu³Y+ÂJàå)$Müà¹kMˆz,ª.hÚU ñ…1FÑÖÅ*§, /+CÅe+ÅàãïG›},{S&›1ê’™l8ÈÏ›òIø°°€¸¤•·©x€*Ú§wH™^kŽ6ìÔZ$Hq¼Æ!Ü Oý#$*%UˆÜGP õi±}&ÌKá6ºÙÍ(ô@€ØuzZ Ý^ˆà>ªR|­ fö*9 Ÿ}&R°ýgFÝ^å†áÞõ°(|õA~øo,"ÊŠöjes>@vôfK=²ŸßýÄý¥¹£ì“ã§.WòÞNBtÎáÂLå*B±Æ5“¢MÔ®øÙûè¡Cž)øð nßúB¦€×~µ_ƒ8c“Îãš(‚×'ÏÙ¿²6¬iÓкõ°T«¥‰;kÔ4¥ÒªÐÞ™bä® 5˜Ò´íEXŠC†q)6ôfWº‘d0¥àl‚$8ç< +Ì“ ¦Nó”-ü¨(Û–7 .\2Q0¼[ã>ÞÞc¼9&‹+LÄ@¸J°aiÆ—23Äoâ+Åçu%•!·îÐ èä™G—!WùIŽ‰ó¢fÌŒp V[ºÁ);A Ž+Pc¹ÚY¨N7ÓfH¡RÜõªv¸¯Î_ÛüdE…Ð鼦‰ˆzèže.7-„ê½NϨ?iœ¢}U'ÓÁ¦çÿ +Úóž¨e6[x5±IœG·6ünñ>ìlu ¬YØÐâBZ *7VU?Átr T1[¸™w¯ËÖj6Ó”äê#ŒSÔ\D¾y¶¢yÂw” k7ÏC¤Î‹ b‡døé’|7ÝÖè¯:9so³h2ûñ¸î–¾ÈUªû—rl’9å'sÙ°Q@ýBîå6Õ:íkX‹(­ió¼·õUðW¼ÕÂîcŠ˜-¹¤ƒ¾-Nyˆ®:RjQ4KàŒTÇc—ûÜœï¥&)ëdQb¼‘– ˜hïáœ#±»¬žS£`KXÓK5S°]Ħ~ WUðã?É g7ÚX¿~p™ÑðÎu=*•ÝGK;t·Ú›iC¢­Õc‘n6=‡˜ñtÄY9ÉæU¹¿«õ¸² êvæão?32y ÊÂEò^‚iYk»QD}ÔÓp>ÌÔ>¨[ÑeØØÙÎGuncáTçÊÅGP½L`.عjÝVͳ…U16–!]!•PN‘âñ³ª^{[T´^Þ•tBÅ.‘¿˜ç‡n\¾„a ªáàïëðõGn‡ ÜÌÂí?¨‘‘å²cýP'}¿ô51iå0¦Tz4½‹Úç=Á‹º£ë°½„ª&koMæ!ø\ß"g*ãÐu»r £6„ŽÑm­³šÞRAàÐ,H¶ëUõ@=ÒØೞTÄ2–‰ÆŽ÷ã3él~ éÅ»{ º;j•ÜvÓœ:Ý×I“ª]:³Í~ÿòYŒ“o4|l‘E½&$è0¼¾Mi4p˜òÈK]Pào½Ö§Y[5¯…ˆDEì¬h.«POýéµû’%.71&x—Ïèó+xgŒÓ`*”¥n*04üøý±@Ó]ì ײ»«Q½»;(s†'FTkhÃ…û53èÞT?>·:ïðI^Ä&¯ñª¹˜SùÂysð&Ú‚œŸÊ¿–<㈮¹_½<ýrz@go*aÄM½ù Uß¹õÊ&ÑQù™ÉS€AéÝa’S2N—‚ÃÖT¾ÎÁ²Ûä!µVEýn×?ÃDI%q(P{<·ëÑÊÏ1ÉT_§ åíæ8UON„·:°#‰©_R;×|öwˆåoxr¡9ÂÃ8smª¾F¶¦%ÄM‡(è99ÄòîúÄc˜†Å‘¼öJj¬ªÅ2¦<¤®nt [.K©Ã`-›]ì†ý0HýÍþ©.l7ƤSÄBîÆ\+õ;ŽÑ®Bs…ÈþöÕ¦ÙG•..vè»6ˆ_RÙ]¿Åâž¹AÿNh¼ãšc A4Ì×Ùrí¼Ülwƒ ]ÇL`©xNªe–eé;ø»¯çnðœB622ݧ1‡n7ú½+n¶ôHàû:/øå%5†}ÎœÐüÇ*cK[\µ)/0Zõ:Tx ×WÇ`G,96\=k°ß¼0 ô¸z{—Už I[ë‹p†¨`ûq … T¶dp½”z2¶º£H5³SÿæGPýŽÌ.\Œ¸p3àzW‘‡~Qh¥ÞNLè¾\‘YŸnÕ­^o…Œ)Èó”å~vûL·Îò‡*´Ž¦9u#ü=]KÝÅ7:l1ãž(oìÅc'ç1tB¨® ií<‹½n°ÖÚGT¼8 Z-á{#Ý_H7©2!j·´$PˆïBë*ÇÛ¿˜øÀ3¹ø Ûꦶ §Al(,8(ëC=»Òt(Ø‹®=8û~b¶ˆ†Ð¡~á§=\õvÉ' AG+‘¤¯Ûœ’Æ—߆%{R ;Ò毲íS~0²L…r”èã«3qû¹$¸^Ï„Ò4VÔRJ»Ã׶J™~rë/×a«)G²:Vê„ ò ÛªzVm|Ç·ªnZCÆuP½5þjBoËþ•‰{º.u½HÐ8¦ýáÑ»BI¯ïöÁå¼9ö˻ò®ÔŸV9N‡-z(~ÎzÜ”œ¿‡eÌ?‹÷¯¸™Ø?ÎÝS“íHþÀi¹OB*jám<ÕœZ–[’‹và™±lcxf‹hâ&^2$w +ÎÒOVYrX¢ïàwJŒSôm‡¯)&`WfXñï³’Ò‚‰oRâ­‘cƒ'ò­–c^ÎlïŽOF–õ×Ùgäëf>MÅ·+(çÑ£ø½fM•ÝiïJÍ+lÉÎ$›©Øȧi‹ Kº¢»»þYÆa´á+“Ðã)ÕÕ;{¶ +{郎£¼Ã/ô‰ï-˨–ÞëijNg°ÐMë"@þ0ƒ[ ®xžd/mý€p @{ m·bÊ3ö£±™W€¯>š‰øç_ìŒïyž"ÿÜßXvܺ†FŽ• -+›5Æô™6ì{ˆñéŽzÔOBz>1%Α}}mBl*î Èà+’?îÍ6 ±3™þ™^\É;<·ør ø»(YËV¼5,{n½@Ø`2Ÿ<Þ#‡æé6~p/Ø t+—¢44bOT§UŸPʲÁ%Ï™Ý×êmŠ¿¶kš¹ÒÍ»¿^Q6R|Vœ=¡ÒÝ03ÉX­®/Õ¨îmˆÔ-gNGŒT=(k÷m‘mÏòæôB"VžŽ”õhs>ƒ²ß€ ¦|–¼,–¹g,Tà³wÐ Dt:‚vmœ¿[ñ²ìþ‰hï:©AãÓ>ȼK}êPJL¶¦¥;“_ªÞ!Ëѯô¢ßn³1VÕöe¬W¿FèÇHKi(ã%WQŒK>÷K ÜDV¾ˆšƒ(•‡õ-¡•¡¯Ô¼a†¸$E@Q‡¼Â(‹gÏ#'%‹¸\¡íͷ¡P‰Õs÷úëC¶•Rä,wœ©¹äÔº1¶wЕ@®ñút„À—ª|­écho>àW{ÿ»Ì6+(RÝÇ ]\Ä2ÖZ!M; Ly–whÊDDëÊ¿£êDœâŸ€ylÊð–Syûwzcc”S©Ä’QÄÍ&Ó(füaÍ+uà³þ{ýîTÄ3[ÜaÔ +^Á?g½Ç[eœ[T.¸;8Ëñ1S¢ÒŠs¹£ìãíÃ.õy‡¸MnÕ\v¡.Tü©Ä%ñõdaÑÉ•%úh¡æÍ".‰„%{O÷0+íøHæ¢D!‹fäYvç׺X¿R+b-Ý°M&ã\ †Úç¾5 +7³”rÁ©£håIËC3L—ÏÝ| á`õ|,bÂd¨VŸŠFsbðdQãØ*Y„ÒË×Úó2ξäÑø~Ð@HÿtyYÓ%ô@웸xœ×­j)œL‘S b(€hãûÜs ­âMß?j«%ÔpVjÖD²Þ}Ä ož)?·ŽLH{ï"£ñgð>ž¢^¤?¼#™G¶|gF˜5¹ÒoPûæ*Ï›:åC²fn°±\ÜEÞ'µ1[™Ðý-î…ƒ€ª^J€•†h$>rþ]™4Q¶â@/;¸€’ÅJRlºl,HŠœi¢~Æ»ü›ŸïÁeé^v×eatÀ cI~ž¿o=•¦œ÷²U?¦¢)‚QÃ-Ò…{ˆbú'2)Û™”²ÿóe6Å ²›6©U5Ã;ßðþ4(é@ñ㬃´nž­ÂøZáNÐp»‘$!¢ã½e“JŽV-õ¬·xØ«ôz-o¾óá@%³hL 21F+—t"±£ŽÚ1N eá!q…cÉM¬¹J÷AÝ}²m‘”Ðn.~,r%UŸtg€|d4N[¯]rÖUöì!—q4Ì™§M†éýx¼¼°z4ÉÜVzv‚5+=rCMõÂ}@Þrþ‚ó!bàS_ä6ýŸ—µÆw¬‰«+FE€ô¼f‰ðPµNªéö~yÚ½VƒL½Ä«ÅcÈòæqA‘ ‹$‹@BÊñ0oþ<ÓörÖq@‹¼Ìj=ù†Øz­X©Ö»à⣣ÙVæTâYMi£ÒÓK¨×l´—틧¡{¥»¬ëe˜R™ÏJñ­j}Ú§ÝoìU¿ë à{™ä–\©†õ6Ü:ƒ·¬ct5I/« €,¸Eð=÷ Â8i¢+~[‰2ðL~¿%˽ΨEdµÄ3C}®éX…VÇÝ?àëV!CŽä‚à`D2Òé4Û%‘çÖ9¿×õH„)¥ð„ÁúO”P7tt1iU~½&=I¾òèÏF}=шû\XUêÅá[&¹î3=ûŠ†ž2¦8Š¼á"GĘ›À[pClC½ÆXÊÉÍÿQi¶Qk bºmj‹df$Àw =õ´åƒ‡”]·¨¼þÑØŸKƒ©ÄøÄ[¨žúÝðq*ø!y›%Å…øØLÏ?×-+Ù‚õ´RGÒX I†ÿI±`dìÚhZN¹Í"VÛ‡ûô2_®ËâÈ«Rßó!«r +2¯å²vƒêõj:¨¿Q<¯%C/õ±c“I+úI~ŠøwØc`µÝµýƒ§¡þŽ¤ûJâ˜ô ]8 SÆ/¸÷E.ƒa©4Íî¢gb‹òéž7î;‹f"pçìÏðB]u±¿‘ßó‡èãb·4îžiÀ[.þB&Òva­¬7*l?TГ„ræÝÜnàœ`á'r¬Ó¦Ló1&9¿å8ƒÓG§~p…QxcÃÒ=´Z‘ðŽ±Ä5ä‡Ø×n™ù VbY§©àùÏ"§Ñœ}úþZ–§75’¿@-[Ë›œ1=u˜Oÿa"&¦u¶|Êê;ÏõåÅÆŸ'?Hl4ëE\³Üà#ï<Æ— +¹`†\ÿ¥¨ª1¡Õ–£ªø«¤\Å'GË'²RSƒbzûÀ…´ãé‘!©¼?ôdFÕ±EÜ%üÝtk'õð‹äpNA‹Ûº†‘ã«óµýñÙyõ)¶'Þ¸$—( ºI‰fÞê¢*) +£ÖöQðŠ,$ªõ@˜Ôáö%Õóø*(lŒl>9h¼à˜áxJ¹öÅþãn ˆï§šxíWE¦º²Úa2”b÷^+BBF¶-c¬>À‡ ïç ›Ô„üR¸²ý³áìKE±®èÕ'¥Åq5/ÃÊÛËÑ»ï-ï'{+Z‚"Ìô”{9…Öñ›‰ò¥YnY’8ùUú³­^dËÈæõqàÝÝÚJÌ7C)[yðîñïÆ^3>@–cÉã1ùéóRŒ€Í}hH˸À ÒlÛu…ûÎ÷e]“$;eÑFøUo¡â_õ÷[±S}•ùÉ%=4qEãå.\ïÚ4ãòoðá#;íC•ßw®îÊñáq–Ó ’òS„Uóë$׈ÉÌ‚Ëç«0Ã&q¾å¤üPàÄ´ø´€D g+m„• OÑ v÷ù#¹r”üœ¿yÁ(›‚9MÌ ¶1;–/ņ޺úàËÓ=’8s(ÀÐgŽúá„©¨­¦ +NaãLïñ˾œ[{Uy<-Þ€-§Žà@÷ÎG{|Ñâ'ú*&MËDß×°‚ÚKÆí¹W!¡ÏN¤µ‘ÖÅe<Ò}øÖÐÇÞfnÑ»…³µêmºŽ5Y ’8&€ù³js¬†]ea^å(Þ¦14üŒ`pË{B/{ã“ÜŘÊgþ6<ÔÆGE§Iwuy³¯<¡= 7…ýÉ̸¶ä3…}€ÉüR4{Ò^ø<zN‚‚!y™ÃÛíÃáxVRο0,¹V‡}’Op7A7!ÐTÑQP˜ùT™ÜÞl,P½ÙTE™>>™åÝ°^ûþR›„»¸8'n¤-ìJk®²QC + ¦Ô"ZñwOòï™»ÏöP÷ê¨.ÐJî~&Ö>zm^B¦[s°'òYøš×Y­D˜¾ +¨ÿKuß!å"|ÐÙEÆVÌð}†ô¡¿ O'®ÖÎþ€å&-¸ùhì8ö²0ËüÀëèæy€ôõ«`o­$‡Rš´y?…|¨ç>K/µ^¸°«l/J¿í§öÙÄ¿Ñ׶ݶëÒ“<‰âïŒçî*O©ÍTK?5;º(›o³ÇUJN¤P3 +øÍæ6?ÅÖ%X<²˜6˜ü” èýÇÓ·55ιbÏ(L853ïáˆÕë¡›íÐêº/ÂÐ7q‹^¿_5 +r•ŽQ¾¹42"ÒQyܽ…8[E~*ï\ºÊYòÃå«&R½n<NÁŽ¨ÎŒóöÀ8mÈpf0 <«±Ìœ/Fµ{ —·î9ýöÝ„PœÒÄ@cÅÿ4¦; ™«×”¯ü¨K­ À$çdLÎð©»$?ÊCîYÇF¢á‰á&Ø,ØÏ<Ú#@Ë%® ]g‰hƦÌäÒ†F`{&(]ž·/iÇÕÜ\p±"Ëbö>¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ +®ŽW_hi+yñ¸âÅ‹…† +ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦v> endobj -1015 0 obj << +1025 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /TMDQVH+NimbusMonL-ReguObli +/FontName /SVLVEN+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 /FontBBox [-61 -237 774 811] /Flags 4 /CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 1016 0 R +/FontFile 1026 0 R >> endobj -2100 0 obj +2130 0 obj [600 600 0 0 0 0 600 600 0 600 0 600 600 0 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -939 0 obj << +949 0 obj << /Length1 1606 /Length2 17112 /Length3 532 @@ -9808,104 +9968,107 @@ xÚ¬ .†ÖF #['*€©#ÀúßÀÈÎÖØâŸÒœèÿb 9 Nö&F™¸™Øÿc¢Ø›8ÚX89ýýX8Ì lÿöÀÙ`akdíbüOõ¦vÿJÈÞÑÍ_Û_0;'g'#G {gÀߨ ¢bÿÎÓÙÜÀùŸØNÍ;Ó¿žÆvF.ÿ”ô/Û_˜¿Vg ['€³‰»ó?± MÆNöÖcÿ³w´øW.N¶fÿ•-ÀÑÄÌÀÑØÚÄÉé/Ì_ìºó_uþ·ê ìí­=þuÚî_^ÿ+ g'kSz&æ¿1œÿÆ6³°…aøgP$mMíLŒÿÖ»ØÿO›«‰ã¿DùÏÌPýMÂÀØÎÖÚ`lb à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;ÿ^0€¿Æ øgÇüÿ| l,¬=þÞÿé¨fòï ÿO ’ÎÛ dkö— -FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒªšœœˆ<ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T -Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B -pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m -D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè -ûÙ £)¨Ž&‹"º–Qª86Æ…‡â9xV6jƒxlˆÊù†º’2–^ù -|Ò Ä;c g¯lt_´û•jP°– ¼ãT³mê=-ŽÙ - ËÖ /¨é?&§ Ã­¤oø -%Ñ]µÃ³V‹Éµ‡†#hižrX£2¾K±²Å?²©Ç‹t3V<«×üHl'}µ“œ7ÂnhJ권buKÉ)O^Œ Z5‰OßöÚÖ?ý<ÿs88z™l­; %ÔVæ ËŒõ”ððßEôÌH«íjÚ ~öÖ´Öb}ë­MùñÍê+GÝq’Yµ£[N¢+C1¸Ë¯öýµgî;ƒBµÖcæ4vP“"d×sžåxñ^ÚÁ9O^jŒŸ»e: £$‰µåf~)Z–Tz=a“2¨ÕæSÐÞ»V›áçp"êcýK¹Wåã»/Íx=‹ -RÚ8Ýw>SÓ¯S®A˜Ç©ó-×;%¾À˜úeiH—faP$÷Då€ãCã&¢A†C ѾB&eQ/MN¯µÊQg¿NÊèÑ8o©­?²ËˆR(iæŽO¿Œz‹~€èßöØ°ŸŸÊ€ù#!Î4uðÏU¤ KqŸV!rÉœt„Èä´n"/«åâPH<8±Ìà%!*áÂÇbhO‰†o‹›Cd¨· †Q>ÎN{©’ÑòíÀkÕÍ=ý.8}"Æî™Ux§ñ~Ê©jG¤SY¹Ÿc[kÑ‘pœr)h‹xŽ7ó—Š›Æ]BöTx¿0¬ÝcàÏ}0p²¢A17y,óUø‚‚¢·…ø¿K,ZS¥VÇìóK—Àd=ˆúÓ‡j €Ÿ;¢’Ÿ×¡ôã+J‘RPl3ï˜ùÆïy4¬Ôx_½´oõƒŠHÅÔ·vS_ü AåÒg˜Î_Ý„õ’~w?@’4ýQîï(á"[Eq¬ã si5׳¬ÄÈ—D|ÌŸ|çå¸K¬m@e½)ÿø’– -ß$TAÂrü—ÇDUËx,¬mCFË„vh”V¬èæÝod%·Ýͼc‹ò¡R´©kð97Aa¸ö<ër Ñ¿5{ßîRÖÀª—Öì6 °¿ÒÅŽð.Îe“ž¿|€³ÉŒÎ¤Àa;ó›c ø1憀^Ñå݈2ð#"ÎúÎøYkK?¤ãž4rIt\IIÛaë°†;ÒD™øÃW=ü÷œ÷YÅ+˜©rM‘!ˆÑ'ëâ§λ‡Þl è‡ÕŽ¿MZaÆ©wO/ˆ¤ÿä‘¿<y±Ç-û"å{a«Øçé¹WÑs<¨ðÀ%ìÝH(*ævØÃíý¢_õ¦fŽÏZ5X¥¥6­›Þj<ßó±/¹ç*£ÅJÏ“o“¾™ˆÒ¼¬¡µ6"£Í·@¼çÂKtÛF3c‰¬#«;¾HõOR¹éGA½qW/}gTHLŠ‡Ö-'¾ŸÔkí2„}ÆÅ6ðû {î56Ë!l<À-€èÇUq;=t}ÃY)¬8Ýø3yìáœ9oÙìF€s#MSþ‘»Ží®@§$Ùýû(§îºÑ¶±ý¯ë È>loD‚K{à[ì1_s©–¤ ÑLâ”Z|µÙÿ‡L§/:OMz}ÈÔïKHï~-ð_Åt¦¶Ÿ ë­‹­åÁüW“Ý$ýAƘ¹ß3¯œl×âr,ëâ€y¥&0•²jmÚqý[„ìÑL6Qb~´+¹PÄ-sÙø¿µ$ÈÑ*ªï ¥ ðÈOÓ…¦JûèY[éýSækŒ¹©[üm}ÿ˜Ð6L÷èO³[²ò½¼ƒëÆÐNOp:„ùHïä7CĬ“ü]½yî´¶ïïÃ>Õ“·aý'×M½®qê äîbà_w– ž]4ðÚÀˆ²öÒøÞó¬n +: § Ìô 8û›cÑJR[2£mXÅw‹}y7ˆ×ÅLeD$ç,?Yh{³ÛÆBÅΙki¿ŽøК¿ Ø1ò°ºŸ;eó‚T›n|˜)94µ9uæÐ¥x´ ƒã½R ->ç³]æoM%„£¬ÎG)³‘4°ký‡ïbZ~ø ¼`_[hã»8ë<¾4²}$.îÁ³ÖÄ‚(¥ªæu†&ÿaÜÀ™y£Û2¤³‹Ô»¹T+ªJÀҙçÍÁØØJJ,šëò¾v\TP‚Êü´iÚõ pÃsùâäFáã!ÌnT)^”"²À±R'ºƒÀ q)J‡4`¿s]¼ÉZGâï”œÒ Òœƒ(BÖqˆú(““v&ø­3UÏ‚Bþñè› ™Œb‹Zˆüù Ir2Ÿվ ¾îÄ›7ïX)c¼5&•‚OϺ÷•—2nµÏÄGýÓ¯?74¥Ü׳ Ž²Å­Tj(–Eãs‹ &‰Rð³ÐѵL‘ˆÁ3²pæuy6©Ì7k‰¨‘}¤TêÄoÊ"´wÂñls ò­Eâë2¦'jQ®,ßéàHˆ]í„äÛct? ÁÕÑÊ,Ga³ýý¥­Ý2^¤d0•NUx¤$"e`à%~7*ýþ¬Ø挭©Ÿˆ{cÃl³?hZFCH7U£*´Ü‹Ç‚Ìy|±°8ô.šÎXAÐufóË ".Ä-_Z “MÄâë뙤—¡¹Â‡Ý÷í[áÉ\DZQR÷¡ x“à¼K)Ý)‚pÊåDÃ’«¼m“­HÁ• <¨üˆ´Ÿ_Ä1ÉðkH/·)(_|ýû2ª,B³i‡Ðñ4V®ÌCøY¹5õB2Ey»…yö47£h¬Bù\=m‡r94ÚOäjùãwiºð_w ÎvMíð¬òüò[°4ê©—Tÿ³š™\Ó¯r»N1†c-8!âΤұtzžK,בZÅ5…ÍCÅg€„ »öˆÍÐJÎÑ=–|üËÊ,u‘,Yƒغù‹ÑîÇôBÞ¬ƒé\¦SM„ L¿ÐÛºp`i5U])ÖìUæt™PÚŸhlA¨6`¦ãqµ"~g2è2êþ6d`{#Cn³W!Ïw¦I¼Lwdk J)ýK‡"™¬ô&¶ºV0ÀfÓ¡?þr83)J‚$È4?$ àE•´Åì²›¯:Ÿ -Œ(iýŽà-º 7~õSLcüýkÅ!.0Yü:7— `hPêoˆÜä¦ójÂlƒG¥v‚j»8Ç«Á¨›ÕäÅÆ6nÂN'éú3ÑX®ÐH¨Ïü%›zl½ ýƒ©´T~Ú}ÂwlzŒ(D:ooV¯Ãúe@Xrݪ#ç‡ d4C:«G‚nxŠôÒ¤Xç©þƒê¢dÑ^øÎg’´k½›Ú}Áîí{åÅÄõW·F°;ª¬ë§Â×òh`7d H—”µNº’7G«5–-™¥Ïà 1‹†d ®\É(¸¬®&Á€%þg› R¤q[â’ÖÀ.Ê¡\ÔýÔG&ùƒÔä1Gô!ríØŽHÀÊÏôØD¾!eeÈ2¯ª ­òûôÅ![é@8Í1J©áRJËÁE·¤]wú³{D1Â_¤ Ó¿’²\ýz¯ö §D‚ßìñ¯Ìd$!ÉÝ–#/û$ÅVrþlAŒÕ„ž­·:@¬RÏhV‡ƒTW÷ði¼&ßVQžb‘¦°$Í?^ªøŠJj ¹vQÕ±:³´FRƒK«}ÏGL©ôÐ÷±ûûAÜ8€)dä±”Z®N¨æîuQÕw_ ºLã®páý±•¯ŽÄ—¢9Qök¼`EËih[úª•³Á5?M”õÝãõû ØÃ)’'¸Q·*ó4yΊìðüC[I&«Ýrx”/Ø`x0…oÝûsËÙsïsìêƒø—弫Œ诗´% \˜Ò„-qBÏÐá¹ †^ n u^CE ’¡ù‰ÝĶAµXþ¤@á¼ömÿÒ’JÀf)Ë‹MÞÈRÁëVSi•#w6VBÐù£®QŒßk¨£1#ð9‚ïq?ô¥VAØAÿו° ¶ì.Ü5.óQøw¿­'zÁ7°…#|ÝX#c½r"ëòUt™îÖÔRìáϳ—åd—ã0Â{)ÒuŒÉô˜t’’•û6°Aêõvƒz»§ö»`~LÑ%óÌ·«š™,"QW½^CDDûa.˜ª¨ƒµ ÜöBŒvUÛaÀvæƒ~ç÷%ƒ#™D@¬Êž±H •e—„7tà›¹¬6–O_pãÊÑŸÀ)ÏÐ÷#lžtñôË.jLt•¤ÍÊv)nè>¡á˜T‚nü%´öª•K]^sõ'lÙ²k2]¿÷þ5#Ä®j@o^'Å|³ÂÎp?èÅyIß»7ç ¶ÞJ\pA·F¾#Û÷jYó\a@D‚Y>›‘Sa? -)‡¿ ÕÖÏéÛNÄD]*¾ÔŸæ›õ· ­‡.kÙõ£a ü:ræ\e·ûá&ÈÉDŽ¿Œ™%_$$3}9šü• Š8$½¬€È¢þàÎg×™„¿ZuÎÚ8רË=~³a#›L]gŽyiðÎ+.ÐÇå‹6{™jšSksÀ›ø¥qéD¾ ~Èͯõ{Ó·Æm'¤v;?«A%qÐ7ú"úpM°!(ïx[„Ô]Ä,…u‹0~‘—Ý›°ùot…ÿ‘vm¸oŸÓÔ/˜àyÝSÝñ}Ó"‡ÍÿImñ@üñ¥Çýawú™¿9Zôèý öI„÷,`¯ImJ /¿!UÕ†[ƒÒni$%µÖwjÂíÏ÷•y†’Úª? ü¸Ôî¿¥8«?—ÇÍá4êµq5‡g7¶}E¹l“lRŒg{ ©Ò2±°Ÿ. nÇL^ªJéˆYç¹¾‡(Š©?fÔ2ciÛŒ<¦É¥¼""—@ƒ Èí•Ú!kŽ 5+V=ÑÅQA+žß͸ÒË;vƒô% ÎFº+s*)¼Xs9NÛß™üÑ¥˜L¦ºÿ[YÛyt¼ÿ²ô„ xÚ:tés®` [Öx³(³û¥šrvrÓ vÝW+—ºù.myÙï=Ÿ†Ì†Q54ÕxÑîÊa•Ÿ‚T`ò—`È „^3¥>5¥UºaÝH‚c™'x‚.löÓ°g™~»uFˆÄÈ8ˆò€ b ÿ.¸%Û »ðPâ*¡L;.w_÷<Ê/¸‚óŸ‡o£ ov£~8ù8‘ïV¶qãf -åÚ`qÈoa’:Üà}ÒË’àóI¡ Å¡H±`í ¾‹¢R¯u²Í3}›’«˜Œ(-ž ŒßDÇîwëôêé‚t­»Ìt«Ã¯W¹4#UâRwXPƯY“4ìg·FRß vßû<ÔxP>†uÂËe&+W-\O+NcÓÈ«¦ˆdÉÊç°Ÿuµ‚^¸Îö%oH¦£¾]ü¨G,ïjçís”'Ù#~3’âø‘JÝ’J¯E«N²A»‘_l ØÙ1U¶c3  ˆ¾G»m+–¦VÙû©|¬-íÛ`»õ¿lf³$Ú«ôŒóÌžÕÅ›±Ëšûvy7ÅtU¯Z¥lÂÙñÏ,¿ Nªä@Ëäþ‡¼%NRs¦P†[¼‰P?ß”ÛI¤eo Õ wö¹¥@´!è&/Ä8Ù×öÐŒëÝñ‡þî…l<œ%š.Ò™{A•£@lŸA µÆ? wR,»SQ,H›ÀuQÚå¯>¡UAﻵÔ/£²­™Ï&/Ö…JVíù9@(üˆõ›œÏt\ F;éœt­Ha|þ­ZÇ)Ýb®4¶H„¸îbtÜ©. -Dì2Çüߢ¿¢‚IÔnèEYÒÒÇe)ü²:V ùUš>иɚúq:…mɲ¶þUñNžY±B§Ýêƒ&³Ã¼]Rý*ÃŽûý=*n…ѽKv„hf0ó;!ØÅ .&f«RÚ„ Ï‹ë&e¤ãe}|“x$Ó½ââ;£kgž=çyÅg©Þ+a…¶’û.Î)†Ú`NËiߜʼnW«Uäç*i¼/W 6æø>±§“ t6ó –p2/ÉõÚzî„øÑ=h>±` -n5TÁšëÑ”’ÐX"GEÉ.4–ú&µ¼ ØØ…'Àú|€PÜLêar ¾0N1fo÷í¼Á¶Uå" ‹*0âù$]s¨>ÓΆ”'â¾ÞÑØèÝf6qì©)¡}mZ€šÍûIÄN§ -Îþ@PD # V{¿Ö%þVõ|3ùÈ”JE3)&Níð{_’ Ê m3™Î1 oåñ S“•/bì~O«¸8/*™Œ²éëíZφä(.Pÿ§žÏdÔö¤¾X<é§îrî9YJÛ)E抰z6Ø/v0 ¡ ªD °¾T㹋˜€7ýP“Ú¡ûµ¿^¶û°iDØF…ṳ̈9Ô\ðØDˆ“Ï%Ë;¥Ø—qëŒà2ß œNý.¶8bWÉI0Uy®ƒÎÈfPw³‘ Õ8ŒÌ" Çsäs -ZmØFÐÃʶÞïPhzI÷™ð€*qaBrÒ·Ø^ðƒMâÝàí-Õ¨ô¡À˜å®™ÂÞžÑÉö>u¼ ‰ŠÏãonŒ{óæâ<ŠéU¿˜f);›Íp±OË,¾†ª™ŸÔL~‡(ÂJšWQû¨ -`þ* ÎŒÔÀh0±ì$(]J+?!uR[LGÓOÁ ->DGÓyØ}—(l ø &‰åSß}fÄ †ù©»7«ôÖÞ •ŸÑ;!)îüP_©cEìì_Ï“Á’TYj¥àê§ïS({ çÑd -± éÇ¥µ¨ÿ‹0Ò±«ö¡`¢/³I Ph¦€ZhtDįcÅxBkô¹õ¾z힢Uˆ1áû-C^­î@\’ž¶Ê#f„†µ]òOÍÕ5 Ñôh‚˜CGÚc(hƼ<@žðŒe/ºˆ¾]úyèŸãgT —–B„W‹:ƒÅ‹"p+EŒŒûE|ë7p<*6~¾R—”{N f.]Æ&‡•è…MÀNsr'=d/UMzW¿¨8ûÎ=ªŽ´n¸ÚvDôÓM=×ArY8sœ‹ªf(ú²"’å®êvj×;¥ôŠË7/“æÖö¹]Ë\Ù”7Ùë•azgòá¶gÌ)RàÞ%H}!³¡i°Re<Ñ 7¡%ý¿¹a¢d:£gteµIˆ­¨*’ -‡–oü‘éO' °xd"뙂T¯·3z ^‡ø~LËÿ¡IÖBcP/giй.^ÿâ×úÔ¡/jƒX©ÛQÕ ­€ÒÆ-Ô¦4Ê{Ù·hïgZ¼'ªF§ó.²$2ÈÙB Æúž07êÅÌJFØ “|Àmv®å·Ìù´"Ëæn0jª8xB¯QÎïïˆþ”âÞþÐßÙ«À|˜­jiu›¡lQæ5ý%ßzÅŒãÎv¥ú…>GïÀ•Nv.óY‹=Šð ðô"¦k ¿E)û›™,$i{;vÓSë œ†œSW¿BPPúËj…+ýá{ÛÏáûg¬ššLœ/ -¹,6:üâƒ^ÔX'€å9U¿œ‹fkM6¼¿tî˜è^‚(Ò2g¡I›yÕ²˜RôÓ(.ãcÃÿBM¶SaÓv¨‚/uø¹!&jìdR¥ *ÿ!´BSJ‡ã !DË¢FT=B–žýÏm+›ä’…0Ñ¢­½ãmëIÆ}ÈATZS¾Ø ûú=óÀrèƒ!÷v§} ‚ü |8âìñ,¼ - ’¦ž~o8LÃć4»DÜ϶ÒlÊô‰'´:Y'ϵ:X–¹ȃKKÖr97…ü dé2 -{¡„Fuœ·3žÍÇoÕ‹Ü2C7§jy¸-Í@Šæ,dL//¢„KàôÌ°FYîÊ„³Ýþ9Å™êVþ©\ªGôZמL6ú3‹:—g›:‹¡RB£–†‘ž/Îç»v­KH©—Ôï[¾­mÁò¥®S%{ D4ÌuBÞ…ø,&ñ~‰‚F?Âì–\WöÉ¡r€ägµUê—ÚqqÜ6Mgy0#Ï•`¯Ô&Â~Œ[¢é°ŒnÒ#u"%`£–ŠžÏr­çgäeùÝy£ç#HZ@#‰F•Xý”ÚèíTÃl’Ä’2”XÇQ[ľN1’ÔD͸©ØÎbÜÙ{òdEÿÍžó¦˜ßTŸß¯£Y4v̪ߔcƒ>´ã¦´ŸÆ½;åø³U>.Y'²–¹.NŸöLM-©Í•åÂ߈¾x6·w\uÂTõ *ÁtÛ©X„ø6‡{AFi íDñËèŒ}âýì¬pK?N2%-MK2{%¾,æ)ÝPÍh5WtK¼˜/ä%‹(ü¦„¶â VÝ?Èþ¾uôÎEšwž]“¨Jb $Ùd+¦_wZ+MVÇ3”Fíh¹ÝG{>ôº0 ¬{ðÀ“ [^Ž O0~öãÊô`1õYû -*–÷oz ×PýÚúŽÇä–G”30¢ ò ¡€?Žê)^¿)’£Êw8:B-sìFDò±û¹Õ.¯ýaËmwñ¶ÀBUôz8sš3&¥JÎ|ñ$¡9ê -¿’ƒ½[žBš´¾™Kåd H*ž±yÈ"ýƒß ýzêXê>ªµÌWÕŽ“Ѥi$&N“yu°BIsŒŒÓoLª¸IòD·»ñŸ’ÆãÇ•ÑlèE)÷—¡OŠÌ:˜¶O-h/_cÂ:u* ý ‚(ÖÛõî9ç}y}F)ß×]>9]¾¬šæù%†­Ž8[pµŠ Úˆììˆ4eAäÙoÀÄÜ# Ò¹äY¼I©[ˆˆu÷Ìp•)ÁæDÚøõ l¡ù})¼ºjoÌa %h1•l­õíP”Eöd¡‹#ò!Œí±Y‡q4NaB¢#@÷3ÁÜ´*ìåFÖ‡ù–[>¼üózëþ2‰ØMÌDn…Þ ÜwKØ¢Y(i£X‹ßüƒd¤ú9ò ¯L,ÿì“^^ñëàö­ÂóY%)µ4ÙZ\ÔötôÕW¯ù­i ¢7,qK“ñâ”-Ç?ÑúE@•àë#¼‰&+ƒÄ0¸Ø¡¸04ºœ5Ö–›ÿë“WåÔ/¶fLƉèß‹›¥0³Å¡u±yØ°Ðu:¯Û{®[’ĸ2Ï}’ cu¶Þ÷²' )¦Z`‡`\… c¬—ÖÙ±{OÑØD°Çré ám;€¸LÐl} JÜ„Ž6 ‘nþ‹‚>°§nºxŽPc=‰6pÊè)L[‡+»†%ª}'¿P°aŽ‘45¨lG½>(ÅûE&-#Èkií·jEüÅ×Ö "ŸûmUó˜SvL „„§=ªA2Ÿ¶_5J¶Ôø¿ÒU‹‡_O·V°mîl= -æ7ÒÁÒq3‚`¦ t.Ó„c‰Nä•×wíÝZKGº¦Ô›.(ðÔà^æÕ—w[.,ÕZåŒ -cGM}!;4šÍCnœ®2'ÖÊïìù®? Œå¯@9ÖË'Ñ®æp]CÖ-C¼Dû]QPÓ-}yhÎëzqã©Ýcô‚®ËÚ+›ß™A;tocšn’Éæ¤-O‹ÛÃWÓ•ºžÛóÛž:]‚é#Â_fbÈ°g‘øÌÇ õPŠ€Ú†ÑPÅŽO£ªõdU “ï6dÍpŒ‹bçÆ©\¦©Þ÷Œ­;£&{"ÿÚé,–ŒO_»ÔÇÐ9V¼47M=ÍaÍ]:mÎïGAã›P.4”ªþ3€ãd—&•É–è*HfÅ„÷‚¼M:ÞÌk(g -4–·öÈZýjH sóG··»èV üY).üjcPÌ¥’»nÞÝtïw¼RÓTÔBÇA4MÚgw†çsI2½¾C®æÀɳ/™CŸÈ<€µƒòðð½·J'“8.}äjðg$Y[ì3úØ“ü=¸ ŒdÇäRŸ\4˜Y^ ßZóÖãD`LŒ³8äûX‡¸xã-·òú:Õ]PUˆo3‚¡©q¢ÎÈí¯¸âçü%­F~Ÿd¡Ü17br'ÓP¯Ú.~ÈFôêg´ªš’í2\x%ÃE…§é[#ùÍ[8‘çðÞÞª'Õª{±ôV2ZâvWùS×ve?sL¾d5׬¨sôßaJý.–óÌê0Í›øñ(#­FÎv}MD"]˜2?µfÕ_kÜ͇±MÞí'–‘nÇ[ gÞi×ê¨SÖ—¬€ðp:ªÌð/šEù3/ùkÑÍ Û1Æ•U -ŠéÑ:kÅÖ ›r}’õéŽVbbérªïHÎ7Õã³ßêí¥‹_©¼“×2[ëAõ°çô­JCRz!»‘<ùq3mÔ¢W[M0hÒ VÊíaL¦3zb¥ÿÐCNãú?O“lVŠšßÍÒ4Øë>Rj•·•ÛéD[÷87ž9(ÎÔ ëR„Ç?Jáf±;V¬32Ýy‚¢ÈÚ«òßü2ž°é: ;QU–8Ííx„µt¾n -vÚÑKâåÅíÍÓ¿½Í~¬?קS§ÎªôÉžµè6.¤K±“H?R‡yþnv8Âax9™:¯¼&ýµêo<çßb%ðórÿDí;Ú%§1M–UΗUÈÁXÒ6G«NJ"€Ùíì£â%Àì”w¶ðtý—_7×¾`!—ø§‰×o>v²|îÁÈç™±ÈBu:ºXXv9’nn*Ç÷ÝŽ#*%)½—-“u¸3ôž¶ú¯?N ` -;ÜÆŠF¸*Cb&Znf]C¡ÈN‹×6Á.þÂÑ, èW91£ðà«iK;m+úbTèSpïGsÊuÊkÏ&ALH^Ö™FV{ð$ ÝkúÝMbxáñå6ÿa˜ƒØÅYå›a¹5°þ¦J0Ëšëö“©¾é™ý¡ -Ó†©"S—Ïz_¥¬Sþ@Î lÀ£ì†D/®¨÷þ¹B­c0ˆb( º -ƒËsˆŸ.ÍÏxP£þþ\ næèJµõN*·ƒ7A—^…¯f£èïnò˜Øc#ï|<ÐŒ¹a=íÂèœL¹Çt}N9@œí2ò“º¬ð;ŒÔ’`Ÿš瘓gÛ–» “(kw“Hˆ«fz# ü«TU5aQW.;ì§øtÁTK!bñ6Û¨Ú±A2®Èü„è-£þ|âáŒMÍU5j2~áúˆ^]i‘åe-·¨^žÿWeoÙ~äèžÞÊ„×Cô®ïw= ý² {ì}Åï÷šNå)àÒ„½\Š*‹Jò|±WŽMí¡±Òøòo- kÈ“èZ±Õ6"Ù™þ\W7ϧGÂ}VÁc§Úª4ØXoM7ùwÂá›P«cþÕ’Ûl{lY B‰©Ù/šÌÝÖíü¾ì–­˜T¡ÁÜ?ï°êšš+‰¾Å’Ñs­êŠGô†äv5¶ÈÍÌ?ÈÖ§éBÄ<wsÕÆصŸ×ŒD¦¤9 ߥKòã_Ý»›’«á`Ž]} ‰µñnÃáhDÜÀÂ\É&*NNk…¤û0œ†»™¥ ›ýÔº˜Å9}­Q}lêœDª0ŸœÛj2wü“¯µJ÷‹¡œéÃvµvz¬,Æ}úè"öìijƒŠyñý›·î ’±¼cæOˆq¸Ìpãd:3ö¬Õ¹$c¿_W#ò4ºÑ1¬ç¥†Á z,8ÚÈÕD-æ h•’ö5Cº ͧáƒ_%wÒªu¿ â#¤Ç”g!]7¾ô/BŒ]eh©IKôŠ2¦WTŸuÊÊŒk84æÍ¥0Ç‚AÞÈ;b•1b°mÍH;í>nôÏ¢ÖR /#NìqHºà0gÚ…>tí°§Vûa¶ ˜/æöŸñü |¥sçYà¨q³Ý,ÙŽÆ™(®” ¿œ^õÏ‚~¢­Ö>ʧÐÃwHv«;ø´þâÎMÌÿ$ìe ™´´_ÚژтX–KµÆZåÀËÎ)\uñ–Ã2îvKËý XåEÛÒ7ÉG’”¡":1£ëV G½°â”ÀÑ&–Ê(è1ó›Û9‡?³3˜FÛRâåGcM-,‘kÖ!í¯±òÎuÈþ7æ;r…½VÌ+r“l«á¢ü” ³˜¿4{k{#í"øKMaëb³y÷ý©ÐØ l/W^ïo<9[<˜W(§H‚I§,âkíŒ{·)G<«ªfÉÝqIbÙÈKá«J-p_¶×&,xÖú~Ã!C‘FŠ‘Aã”Vh0–à¼ùMeœ·È¾„B‰?MÓQNqXA÷žŒ#´wøÏ4æm¼ðS"u^5^á1vÛv"®3P£ÂîƒÃ Âù^Ú&5ÄùïzFƒ@PD‹oŽ+'.ë²Üãa9…@4uÝlXÃÇ1ߟ¡X3Žª‡µ?c(µNn¢--0žà1ò†´Ñžácó—W¬¼ˆÉâL¦â™w ·9 -Ú…W¨•fI•M@ï±–KÉ­7‹û)Cc¢ïS`…,8'Îl[stÂ<¡\nc«¡T&8Ñew‹¹ƒã'}'ÅrW÷ ŸMì7#X1nfœ÷ ~¸ŒÓ2Û*¡U§ %›ˆÁÇ:èDMÂ|Ò.Ž«ªˆàc:š®)IËü*ŠÎ¿žê³Â:rê2:Ò©iWLÁÎ=¢wßÎÙàì­J5 d'XZ;UïÑ[ˆÉô+j£"dgO5!nYÙÚõmÒ/‡`ÈÛZ¦  Ã9LcZp)©Ê›ÓQ$7ÐâänX튌X,ðO“˜£Òâ'ؾe6\0˜`À2ÊâL— ÁøÁbÂrQu -ºâreA5n!Ñ…êì]Œ¨ÁºØ»‚õOWìõHƒ:Ô…—‡uÀÏk2Q:ú†Édf¬š¢ µ‡$EÏÐï8f±æ™€âNØÔ@Gœ¹}\=ñõ°¨öˆ¨‹¼_W/nÀÄbÛíÿ¸¯ß0^8U¤>¾û=O?°g›¾U̧[aý;óþÓSX¦ä”gÚLÁ´·¹‹.võ@/Ò&ÿ”i:dÏk0G£u¨ð“rÏBž7gO‚w üúàü•–”À‰KY&j øœ7¼r 2–á°WNÎxëh“õÒ¿Í7§LŽ„×VC@]ÒÖóºÁ*óë-Å ÃA;}üvñïiCU…—.úZl¬ õå?²ŠcHÕ¸´Ôu½ö!» »†ó±œW‚Ñ/ðó\Hvq•bf€úOÕy3¹;¾Ð¤ ² ÜŒ°š'ÿˆêIܯE|Ÿ¹ š­p:ÔC9èc!¦²VûCÕ7òÿ2]„2ø²âª³ç½ã,}Êø%(ê’r‡ɆfQþÏÈéª{ÃÅ3’u7õ(;†>Dî`…°éö'xN°?1jaóXDOÄOTÕYe¸S;&bïæ„Ÿ"=_ƒÕL+Æe)ëõP -gŽ}“ú£qÍòÛ¨ù›ÂN•¥•îÉ/­„¼Ÿ¿¨ÎwýéN­ъ”⃞êöÉ(ú˜i.ŽJÓY{Ê…ë߃ˆêo&ãX -Ë|åT¬N!{¶ L•„«a` K=ETBÔSEÐATMb§œ -Q‡Æ~ËJlQ‹Rü¶×ZB§©{g¯ ^x™‡¾m€ï¨LŽ1p%õïø×ké\¤~}ôO½Ü8Ûu·×çqÏÜV»ì*æGj¸ÙÛ9ýèOâ÷Žû’VuûtñCv.¯ÉÞ¯²”ì U=Ú·rèöI3 Í¢¹ØO7( S~ãÈ”‡ «ÒÛšt”š®`½öÈl/ÅY¦37›„Û¦š ;ŠôÑ à<‹ÆN–T‘Z.!`ßêã…”´I¼M%0,(`Y³¡mm¡ §&ymr¦-åɽ.§æo·œ¢ŒEŸ¼B91Œâƒ!ÈD4B\\ò.½ Ÿ†‡b.ô¾=ƒq™“s,|Ö?¼´~8£»»³­ -Ñÿž¶l ÷ö" •äjÓ`Zo…hbµÌ}åÏ0—ŸùoÎ*˯µŸÞµöñæ/~ úÕ'Kü@Tƒ¯k5{<‹i»ö—ROBz@-+µyÚª«1èûŒÂ·–µZë¿ÊnòEp7âPi«ú€pV¢;g.Oã­pÈTA3V.ÀÙòV…I’]UAÍÊ&¯æwú{¥,¿f -ý’OP\h{†!Ë/:9*ÁþNª‘À„y†Ý¢›¼~¸®<rÍ¥Ø.k¹áR\ÄKÀõ=™Ê³ô¤µéšàš)É  -Ìó¬¤^©êzX-Ta’•éÔUÚjLØ–‡ÁPϲ ‘ Ú €,j%‚‹Bè_|³yŒß]¶to7ɹ¿"Á¡ÒW¾7ÉÔ9NÙbdÌ÷Î2s—O‹D"—MêÓ†l›Ñc,Å=Æ/¿ÎWDk¿þ-ţø¬‰tF%ÿÐjwÕïS;ù^É£ ñšo?ñ -ÆQ'?ßœ†*×3;ùQhþà“R¿«A±FÌb<\gÜÝ@ƒ×oìfg,ÙS¿´íw*0=a{ æŽ!Ù5"OBŃð4ûbü[ïR«r‰2Ó'VìÖĵv\PjÐÝh «»Œd ­ªÌ'3çÜŸ¬ô£uªü”.ø¡×cšÎO -DSmÝ÷dU«TòȨr7)z¡mYÅÀX˜Ä5ê¦[Ø÷ËÅŸ"f ‰@êéqD„ç™Õ'~ñHA[€‹Vû¤“õ^C -ݓ׀-xú€°šNceŸ[å˥ߺŽ1½é˜Ê®aYÝ«ÀF5PYåaÉ|3ãä¡ïbøM@©Nyav.åh­nî×ņ®ô²¡RŠÅ—ȬŒWyŸ¦Þtƒ7×ÔÀOkB¬œC@ƒž©êo´dÏ “I¿ü“Z©þä}\žÅ’gÎBT…bM+5êõHzJžìfy®âq -C¸ÎÞ•¡‡›û/ìë aLãdU±Å,[g¯úWСÖX·V7~æQÈ¢%+ð?éצµ!ùUè³Êk5ãø&Z£Q‚É [äxŽ-b÷uP…#Ïñ¾†E@qIÀ$ä;®ŽVçæ$#ÜíkôëtJ€\¶p5žr„º‘¢€$|H{U¡øæòƒK]N}¬ò†Ÿ€E×D° -FÏ-¶ 6© †Â ߸ŒçânVä^… ]šMg\ÔKÇ·ä 9·/£‡õü7o¼¾¾Ð¼­ÎÉSö'ž”Q®¬þ´òB†‡Òe|°ià”¸[‹_Ý‘†6ùŒë.'¸cä½M½åÕr\S>‚K䃔t§C稶h5uREæ‹LU§­Òƒ˜Oôz VÇ‹;¬¤'áS™ÇOXñË€¿®›¦™;µWEƒeÔ #:0츜BøUª,ØÞèb -Òó…2pÈ^Ù†:0|&e¦Õ,?‚HFkJæU'ý!qÆYµwß³HžÿÔ«œ;…ª»ž–3ª[œé@—hžÏuãrnL‘;®ˆ=bªy7¥E>°áíîä=HøŠõzŒ³šâs|Ó߶ª`KA -Œõ_P-ç'„HS -Л¨'ÁÚæãy¿ˆ Re†êi[‘¯²2Ê2ýQ%™ÒZâû®žm-c¢‰LPe³o“=ÒÜi:èÑ'Ðr^ùÑ­ßÔ{?z$É&aM%*Æð®iÞ ïÚ‹š%4Üôí#6¼± -´!;h¾þGáÁj2Á|O¸D ‡?ûµ“îw¹´`ªÓ¢¿¸‚’cçÅò¢†‰‡Î·¤ÌaŸŒÄÆ툗62A»wÆÕ(†“Øs/A'viÙ.Ü]Á‰µ‚7*‹4¥'O ¢ °vŒ÷øF34§¡Æág¢O¿u¬.t¼“®rõ–s}/¸šä”ôÛºö˜#=ÕdrõÔVL­WVŒªÙÄKã‰éS.“ (Õ;ãh"’€}R>•lÏs¯ì³²Ô!¶‹lAËE:ßy&ôœh»Æ2©×Äë2+Ù®HѳÁŸ¨0An´ë‡Lš@°ƒy‡ß[q8^:ZËÄc hjð-¦B _¦–¨ñº€ÛJT§ûš5j9È«>Ú)¢Û»nSÑj=³ÕXër÷Hl_—rß:¯0)]F: ”Ùtë,,pQ£î÷s²•õÒœúåx.Þ!ª±…» šMdÙŽ%󌥢À>­×בtÍýh;ÑN}ÅO™~ìx[ôÒ[ ô)Ò`Ç™[z€Ð¥Ç;ÿµbä¸ ý· ZÛ±ýW=mVùD×®9, «Ÿ³e,ëKj}Ü üï J¼,®bðýÂò3Þ2¼ ­h=Á‰U,jï% -ìé×¾ Ä92¯kƒG`µÕÂKþ{|*Œ”)ÎêÒˆÁÄRéAîCêD´Ó®ïÒ‰svѬµ>cj -6müÍpHr£\Ik[xi×$¼šÉH$S<ÂÐ]­H;"þÏ] …h!ÎK Ùç wœÙƒaƒ!Wo§têQ‘21¸¦e}œDó—ýªM¢Ê&ëÅ"þçÍÜ1IpÅQè—{ØAÛ»kJ‡³÷4°6ŒíîO«Ö*“YŒÝ*³A"Õ±«Ì Õ r¤eKãùŒ©$a^Hœ›Œ×ý‰ÞFïNûé)•7µ»‹i?¦: ¤®ý§"×ñ—á -¦y¼5âéx Î?8€†,ÄÙ%š¼ø*%q$GÐ]È%\íðÀ¸¯±ÆLÆø¤z*­Ë"7›U0ž$¥¨ ×”€ïøq*櫸×\~ghL[ü ¢rñY{âkây9‘ä¹_­-¡„­“ߣ|ÒœZ¿€ë˜û.†zžÜbé>1aNÓßø–à—ÒK!5hI¾?K3²< áŸ,ÞÅÁ¸²Ü$j:=úzåmÈ_N4ƒ˜Fäûq -°’胱«T«þÃ5jíaƒ"¯‹¬Î×Эô'7kˆ]ú†A§òuSà‰epÀƒZ˜%ÆÅ…¹­Â¬¾=úð¤´~¸Pù*€üÕÝ+àŒVd˜¥ódqɈÎEX—dÓJHÁ+°:ƒÊ}Ð)#ôø@ײ!R»ÿ©€£ì–ù -;\ùˆ¹¥e7ÍHÖx³¡l½ [sÉHù[êƒáëXôËUNÑõ¢i X–Ø«c4ë7û\Aº0«<{ Evg]8xp[lZщ5õè¹r÷ûGâÈm*Nêê:Q+|‡gµ}ÁÞ\d„äO¾>hžDä¡GXnöº +b¸¬óÇ;½tÛÓÆŒ£6lÄ”Å>4ÌÑÑ0a=‡ˆ …˜Øà zb¸»6û€x{³IÝ)KÞí­[×î÷7ÑÙ€ ï²jP8b*æñÛGŒŠw4£V³ü2ÎŒfu3^üL9OOW3èPq½*z5la:ÏÆ> ?Òæ3zîÔL¢Ãùïú÷~¾­ÔŠŸ+qqj²„îÌoƒ¤ 2^›6Mäck~·H‡Ogi$q5|©/̾®¿îÁÛë3úï.7ÿ”,—síÃ[|EØ9 ®+Á -ÐQk|/Û9¾ÑxÜÜúÙP7˜ªl©¼å© 敱<ý6œÍ¶Â=Ÿù …3ñTI‡@TƒÌ07ƒI`5¼áô‡lcoƒ|áþü]¤ãÏ(^¡¥µºÈÕ6ÿCÞŒ Ú롾—lšÒÚ´ë÷aµ1Óþÿ×Îœÿ3¡¹—çÈÊ–#Ɔå‘yLî£æhm+÷U¹bó±'ñ˜#GÒ,Ga<ç,÷s¤„9a§¥|I@µ>¬Ó ‘ŸÂînÞñ ±mŒ¼?Áá¼ÃñqJ˜.áC{¸Ús oÐþƒ–B•(­dfá¹È|ÄÕñÂï„Ó84šÁç2ˆ¥(phëž7ÓŽd5ÈìDÀµ€ÛæIl]Bå'IÑ¥ôFÛ܊ꨤ!šFó…L`0\ÁàÛ˜‰¾Q¹u3!skA$TˆBØó“É°`¬ âŒéúŠƒŠ–%¹Î× Aä÷öoŽûŸ»­w‡¾ÙºïÁ° bCL?í<:Ú _Þi 8eT)ŠD¨á~ÑH½ØÏ7ceÐès6µ™Â$ï|ûŘ‘ùË âæIPÈkfåöVÔBÓ(ü -šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p -øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸ -^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD -­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öžä÷³endstream +FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ÃQ9õ4ÿ¹Mÿå¥ð—ugeû¿‰ý:díŒÿ—ð†°°;À‹Ž•@ÇÌÁ `çdpr0ùü¢ý †é¿dYgG w€Öß’™þUøÿøþKÒù˜¶FvÆÿL‰’³­ñßÁú_ŠÌF.ŽŽùü×]ÿ[ðÿ”ÿ5â&&î&F0kËvF<Á–é¿2œë0sG&Eµú˜@GBìK•‹ +ükìzýÒÃw¹*õ?kC蛦¹¿Û=–Îí¿¥¨Æú0¬)zSM®óñ|H¨ú ·È;9hŽtKá3.Ô¢½nevÀ4ÙUö&ê–|BàOw²8BݼPù“¸ø£‘>Û#ø¥5Ä¡w!5¡Ôž_'¾}Û kZÿôóüwÎá\àèe"°µî€”PX™/,3"@<ÔSÂ{4ÂÑ3#­¶«i7.øÙ[ÓZ‹ ô­·6åÇ7«¯uÇeHfÕŽvl9‰® Åà.¿ÚCpôמ¹ï +ÕZŒ™ÓØANvŠ]Ïy–ãÅ{iGçý2ê-úA¢ÿ}ÛcÃ~~*æcd@Œ„8ÓÔÁ?W‘2,Åi|Z…È%sÒJ CÓº‰¼¬–‹C!ýñà Ä~0w‚—„L¨„ ‹¡=%¾,jl‘¡Þ‚Fø8;í¤JN DË·¯U7÷ôw¸àô‰¸gVáÆû)§ª!‘Neå~Žm­EGÂýqÊ¥ -â9þÝÌ_*nÿAv ÙSáýÀ°v€<÷ÁÀÉŠÅÜä±ÌWá ŠÞâÿ.±hMe”:X³Ï/=\“õ 8èOª~îTˆJ~^‡Ò¯(E>JA±Y|̼cæ¿çÑ°>Pã}õÒ¾Õ*"SßRØM}ñ7•KŸa:uÖKúÝý HÒô D¹¿£„‹lű"ŒƒÎ¥Õ\ÏR°#_ñ1ò—ã.±¶•õ¦üã7JZ*|“P9 {Èñ\U-ã±°¶ -Ú¡QZ±¢›w¿‘•Üv7óŽ-ʇJѦ®!ÀçÜ…áÚó¬Ë9€FÿýÖì=|»KYg¨^BX³Ø€ÀþJk8»8—MzþòÎ&38S‡uìTÌoŽ $àǘ^zE—w#ÊÀˆd8ë;ãg]¬M,ýt’Ž{ÒÈ%Ñq%%mw„­Ãî@Jeâ_õðßsÞg¯`¦RÈ5EB† nDŸ¬‹Ÿ"8ïnx³E4 V;þ6Qh\„§Þ=½X ’þ“Gþòüåŷ싔셭bŸ§ç\EÏñ Â—°w#¡<ª˜Ûa·÷‹~uÔ›š9>kÕ`•–ÚX´nz«að|ÏǾävœ«Œ+=L6¾Møf"Hó²†ÖÚü‰Œ6ßñž? + ,ÐmÍŒ%²Ž¬î|ø"Õ?YHå¦õÆ]½ô!P!1):X·œø~R¯µËöÛÀï/ìº×Ø,‡°ñ·¢WÅýí`ôÐõ g¥°âtãÏ䱇sæ¼e³Î4MùGî>8¶»’d÷ºëFÛÆö¿®3 û°½i.ío±Ç|Í¥Z’2D3yˆPPjñÕfGüf0¾è<5éõ!S¾/!u¾ûµÀÓš +Ø:|‚¬·.¶–ó_Mv“ôacæ~ϼr²]‹Ë±¬ˆóÄa©Öbß:g× ¯ïëb¥-±÷#ƒP!»‚ŒCîîœbL ÓÞ˘]÷]¯* dÏÕ §„n˜"}x3< `C X‰ì4áJrÛBHõ“ÁÊ„edÔI¿Ì | `Zþ©Å 9;LgÇp™or¬øæ•šÀTʪµiÇõo²G3iØD‰ùÑ®äB·ÌeãÿBÖ’ G«¨¾7”2À#?Mš*í£gm¥côG=èÞ[|T^Êh¸Õ>w~õO¿þÜДr_Ï68È·R©¡XVÏ-‚˜$JÁÏBG×2E"ÏÈš×å=Ú¤2߬ '¢Fö‘bP©¿)‹ÐÞ Ç³Í~Èo´‰¯Ëd˜ž¨D¹²|§ƒ#!vµ’oÑý$WG+³…Íö÷—¶vËx‘’ÁT:UYà‘’ˆ”y€—øÞ¨ôû³b›3¶¦~"î ³Íþ i !ÝT=ŒªÐr/ 2çñÅÂâлHh:cA×ušÍ/[L€ˆ¸?´4~i-pL6‹¯¯g’^†æ +v߶o…'siEI݇‚>TàM‚ ó.¥t§>À)— 7J®ò¶M¶"Wv,ð ò{ Ò~|oÄ$ï!½Ü¦ |ñõï˨²ͦBÇÓX¹2á{dåÖÔ ÈåuîæÙÓÜŒ¢± +åsõ´ÊåÐh?‘«åŒß¥éÂExÜ%8Û5µÃ³ÊóËoÁÒ¨§^RýÏjfrM¿Êí8ÅŽµxà„ˆ;“JÇÒéy.±\Gj×tP6;L` Ÿ6ìRØ#6C+9G÷`Xòñ/+?þ±ÔE²d n`ëæ/F»Ó y³¦s™N520üBoëÂ¥ÕTu¥X³W™ÓeBi¢±¡Ú€™nŒÆÕŠøÉ t¢Ë¨ûCØí ¹Í^„<ß™&ñ2Ý5’­*}¤ô/Šd²FЛØêZÁ?˜M‡þøËá̤( ’ Óü€þUÒ³Ën¾ê|*0¢¤ô;‚·èb€ÜøÕO1ñ÷¯‡¸ÀdñëxÜ\6€¡A©¼!r“›ÎWL¨ ³ •Ú ªí⯣nT“Û¸ ;¤ëÏDc¹B#e >ó—lê±õ2ô¦ÒPùi÷ ß±é1¢é¼½Y½ë—aÉu«Žœ.@’Ñ é¬ ºá)ÒK“b§úb¨‹’E{xaüá;ŸýIÒ®õnjgôO¸·ï•×_ÝÁ¬Ÿ +_Ë£Ý% }\RÖ:èJÞd­ÖX¶d–> /Ä,n’5¸r%£à²ºš–øŸmV$H‘Æql=ˆKZ»(‡ruP÷S™äR“Çчȵc;"+?Ócù†”•!kȼª6´ÊïÓ‡l¥ýá4Ç(A¦†K)-Ý’vÝéÏîÅ‘‚LÿJÊr ÷è½Úƒž ~g°Ç¿2c‘„$St[Ž¼ì“[É]ø³1Vz¶ÞZè±J=£YR]5Þç9ðš|[EyŠEšÂ:4ÿx©â+*©æ>ØyDUÇêhÌÒ>I .­ö=ý1ý¥Òc@ßÇîìq㦒ÇRj¹z8¡v˜»7ÖEUß}-Hè2¸Â…÷ÇvV:¼:_ŠæDÙ¯ñ‚-§¡mé«VÎ#PÔü4QÖw×ï7`§¸o¢JžàFݪ<^ÌÓä9+²Ãóm%™¬vËYàQ¾`ƒáÁ¾uïÏi,gϽϱ«â_–ó®2 ¿^Ò–L€pi`J¶Ä =C‡ç&zM,¸M,<Ôy 1H†æ'vÛÕbù“nx…óÚ·ýKK*›¥,/6y#?H¯[M¥UŽÜÙX AçºF1~¯¡ŽÆŒÀç¾ÇýЗZ]aý\WÂ2ز»p׸ÌGáÜý¶žèuvßÀŽðucŒõʉ¬ËWÑeºwXSH±‡?Ï^–“\ŽÃï¥H×y0&ÓcÒIJVîÛÀ©×Û ê ïžÚï‚ù1E—Ì3ß®jf²ˆD]õz I퇹`ª¢Ö6pÛ 1ÚaTm‡Û™úß— Žd±*{Æ",T–]BÞÐoæ²V4ÚX>}Á+G C¦2ží-L¤JËÄÂ~º0¸3y©*¥#fç^ø¢(¦þ˜QËŒ¥m0ò˜&C–òŠˆ\ ‚ ·sTj‡¬A:&Ô¬XõDGi¬x~7ãJ/oìØ Ò—48é®Ì¨¤ðbÍå8m{|gòG—b2m˜êVüoidmçÑñþËÒ6ài;è<ҤϹ‚%lYãÍ¢xÌî—jzÈÙÉuLƒÚu_­\êæ»´åe¿÷|2Du\Ô`ÐTãE»+‡U>| +RÉ_‚!'zÍ”FøÔ”Vé†u# Žežà º°ÙOLSÀžeúíÖEx!#ãp Ê^0ˆ1üS¸à–lƒîÂC‰«„2í¸Ü}Ýóx(¿à +ξ.¼ÙúáäãD¾[ÙvÄ›)LH”k€Å!C¼…eHêtrƒ÷I/K‚ Ì'…&‡"Å‚u´ƒø.BˆJ½ÖÉ6Ï<ômJ®b2¢´Û}ArL®'îz“$ær,ýíæ%¾Ù£ÔYª„ G…&ûÖÙ9s_CÆKàöÐÊÝQ"K+‚M=2èy_*ê‘®VrÇbæ“–©|.()$Yám¥¥ÎWîw‚45…[ +Ý÷B#?ƒôúT×ϧxß :ÉÜápø»ß­Ó«§ Òµî2Ó­óƒ׌Èð“- „Z°è–¿ + cHì›R¤»°C\qbl +pïswóH +kç„¡ºØ-y*ÄmkYÙ>â2š¸’Ë»§ +À§i°~†Ò°ŸÝI}ƒÚi|ïóPãAùÖ /—™¬\µpe<­8M#¯š"’%+ŸÃ~ÖÕ +zAâ:Û—p¼!™^ŒúvAò£b<±¼«·ÏQždWŒøÍHŠãD*uK*½­:ÉíF~±1`gÇTÙŽÍ€2 úí¶­XšZeï§òA°´´oƒíÖü²™Í’h¯Ò3Î3{VslÆ.kîÛåÝÓU½jh•² gÇ?³ü‚:©’-“ûò–8HMÌ™Bnñ&Bý@|Sn'‘–½%T7ÜÙç–ÑN„ ›¼ãd_ÛC3®wÇú»²ñp–tjºHgîUŽUP°}Ö7þ€ÜI±ìrLEm° m×Ei—¿ú„V½ïÖR¿ŒÊ¶fn<›¼X*Yµçç¡4ò; Öor>Óqí¤sÒµ"…ñù·j§t‹¹ÒØ"⺋Ñq§º(±ËóˆþŠ +& SºY e H;Hÿ—q¤ðËêXæWiú@ã&kêoÄé"´%ËÚúWÅ;yfÅ +v«šÌóvI]ô« ;î÷÷¨¸F÷.Ù¢™ÁTÌï„`/ ¸˜˜­Ji‚>S,®#˜”‘Ž—õñMâ‘lL÷Š‹ïŒ®zöœçŸ¥z¯„Ú^Hì»8§jƒ9Ux,§}s'^­V‘Ÿ«¤ñ¾`<@\-ؘãûÄvžN‚ðüìAåqy|ª“™Ç>$’ïÒÍÇH¬ðù·ÆHÄUÇMXá –&£‰.BÍÓTøÐÙ̃DXÂ5ʼ$×Chë¹âG÷ MøÄ‚)¸ÕPk®GSJBc‰%»ÐXê›XÔò‚bcžëóBq3©‡É%øÂ8Ř½Ý·óÛV•‹,,n¨Àˆç“tQÌ¡úL;Ržˆ?úzGc£Wt›qØı7¦¦„öµij6Cì';*8ûAŒ,XíüZ—ø[]ÔóÍä#S*Mͤ˜8µÃï}I‚(/´Íd:Ç€¾•[ăLMbT¾ˆý±û9<­þá⼨d2ʦ¯·Cj=’£¸@ýŸzv<“QÛ;úbñ¤ŸºË¹çd)m§™_h(ÂêÙ`¿ØÁ4t„0¨ ,ÀúR æ.bÞXôCMj‡î×ZüzÙîæaò3“æPgpÁc!Nn<—,ï”b^ÆM¬3‚Ëpü}ƒp:}|ô»DØâˆ]%'ÁTå¹:#›AÝÍF‚Vã0b0‹4pÏ‘Ï)hµaA+Ûz¿C¡è%mÜgªą ÉIßb{Á6‰wƒ´·T£Ò‡c–wºf +{{~D'ÛûÔ ð.$*>>¿¹1îmÌ›ÿ‰ó(¦Wýbš¥ìl6ÃÅ>-³øªd~R3ù +|hD +i^Dí£.(€ù«483R£ÁIJ“@¢t)­ü„ÔIm1iM?!+øM{äa÷]¢°A4àƒš$–O}÷™'ä§îÞ¬Ò[{/T|F¸óC}¥Œ±°sH|=OKRe©y”‚«Ÿ>¼O¡ì%œG“)Ä6<¦—rÔ¢þS,ÂHǮڇ‚‰¾Ì&%@¡™~j5¢ÐW¼Žã ­ÑçÖû:èµ{"ˆvfT!Æ„ï· yµºqIzÚ*˜mÖvÉ?5{T×0DÓ£ b9h¡ óòyÂ3–½è" +øvéç¡ŽŸQ-\~X^Y<.ê /ŠÀ­1F0îñ­ßÀñ¨<ØøùJ]Rî9˜¹t›V¢6[8ýÍÉô½T5é]ý¢âì;÷¨:ÒB¸ájÛÑO7õ\CÉeáÌq.ªš¡èËŠH–»ªÛ©]ïd”Ò+>,ܼ`LšoXGØçv-seSÞd¯W†éɇ۞ 0§H[x— ô…Ì>„^¤ÁvJ• ð@FƒÞ„–ôÿ憉’étŒBžÑ ”ýÕ&!¶¢ªH*Z"¼ñG¦?€Ââ‘Š¬g +R}¼nÜÎè-xâû1-ÿ;„&Y A½œ¥AçºxýˆK\ëS‡¾¨ b¥nGU/0´J·P›Ò(ïeߢ½œiñž¨Î»È’È g 1ë{"ÀÜ|¨G3+a/Lò·Ù¹–ß2çÓŠ,›»Á¨©âà ½F9¿¿#úSŠoxûCw|g¯óu`¶ªu¤MÔm†² D™×ô—|ë3Ž;Û•êú½W:Ùe¸Ìg-ö(ƒÀkЋ˜®5ü¥ìTlf²¤íiìØMO­3prN]ý +AAé/«®|ô‡ïm?‡ïŸý±jj2q¾4(æ²Øèð‹zQcaœ–çTýr.š­5Ùðþ~йc¢{ ¢HËœ…"$mæUËbJÑO£¸Œ ÿ 5ÙN…MÛ¡ +¾Ôáç†8˜¨±“EH•.¨ü‡ÐFM)ŽC‚†-‹QõYzö?·­l’KÂDŠ¶öŽ·­'÷!QiMùbƒìè÷ÌË¡k †ÜÛö +ò7ðሳÇW°tò>*4HN˜zú½á0 Ð\ìiüp?ØJ³)Ó'žÐêd<×ê`YæV .-Y#ÈåÜò/¥Ë(ì…ÕqÞÎx6¿ATK,rOÈ Ýœn¨åá¶4)š³m0½¼ˆ.Ó3Ãe¹+Îvûçg¨[ù§r©Ñk]x2ÙèÏ,Rè\žmê,†J ZFFx¾8ŸïÚu¶.!¥^R¿o}ø¶¶Ê—ºNy”ì1€XÑ0× yⳘÄû% +ý³[r]Ù'‡Ê’œÕV©_jÇÅqÛ4åÁŒ¢ð›ÚŠC.Xuÿ ûûÖÑ;exhhÞyvM¢*Š%`d#­˜~Ýi­4Y}ÏtRµ£åvíùÐèÂ0°îÁO.,ly9.<ÁøÙ+ÓƒÅÔgí+¨XÞ¿é^Côkë;“[QÎÀˆ2È7ü= „þ8ª§xuü¦HŽ(ßáèµÌ±mÈÇîçV»¼ös„-·ÝÅØ UÑ7êIàÌiΘ”*9óÅ“ „Rä¨+üJ^ôny +QhNÐúf.•“"©xÆbä!‹4ö|/8ôë©c©û¨Ö2_Uÿ9NF“¦‘˜8MæÕÁ +E$Í] 02vL¿1ý©â&ÉwxÝîÆ;|JWF³¡¥Ü_†>)27ê`Ú>µ ½| ëÔ©$@ôƒ +¢Xo× ¸çœ÷åõ¥|_wùät ø²jšç—¶:âlÁÕ*‚h#²°#Ò”‘g¿s$Hç’gñ&¥n!"ÖÝ3à T¦x›iã×/°…æ÷¥hüiXðꪽ1[„n” ÅT²µÖ·@Q Û’….nŒÈ‡0¶ÇfÆÑ8… ‰ŽÝÏsÓª°—yXæ[vlùðNðÏë­ûË$b71¹þy/pß-aÿEˆf¡¤b-~Kð’‘êçȃ¾>0°hü³OzyůƒÛ{´ +Ïg•¤ÔÒdkqQÛÓÑW_½æ·¦5ˆÞ°Ä-IL>Ä‹S¶?üD#èU‚¯ð&š¬\ Ãàb‡âÂÐèrÖX[nþ¯L^•S¿Øš1'¢/n–ÂÌò$µën/&glÑiø‡ÖÅæaCÀ^@×é4¾nï¹nIãÊ<÷I‚ŒÕÙzßËž€¤˜Zh‚q‚rŒ±^ZgÇî=D`ÁË¥ƒ†·ílâ2A³õ5(q:Ú0D~¸ø/ +úÀžºéâ9Bõ$ÚÀ +¢§0mA®ìR–¨öüBQÀ†9FJÐÔ ²õú ï™´Œ ¯¥µßªñ_['ˆ|zì·UÍcNiØ11žö¨É|Ú~iÔ(ÙRãÿJ T-~=ÝZÁBd´¹³õ(˜ßHK?ÄÍ‚™&Ð=¸LszŒ%:‘W^ßµwk-iéšRoº ÀSKd€{™W_Þm¹°Tk•3*TŒ5õ…ìÐh6¹qºÊœX+¿C²ç¸:ü€2–¿ýåX/ŸD»šÃu Y· ñíwEAM·ôå¡9ÿ®ëŧv[ŒÑ º.h¯l~gfíмiŒiºI&›“~l<´<},n_MWêznÏo{êt ¦™‰!ÞEâ37ÔC)jFC ;> ªÖ“UL¾Û5Ã1.Š§r™v¦zß3¶îŒš8 î‰ük§{°pX2>}íRCçXñÒ@Þ4õT4_d„5wé´9¿ 5ŽoB¹ÐPªúÏŽ“=^šT&[¢« ™ +Ü ò6éx3¯¡œ)ÐlXÞ:Ø#kõ«!1ÌÍÝÞîv¢[m4ðg¥¸ð«AA07–JîºywÓ½ßñzHM_PQ =#Ñ4hŸÝžÏ%Éôúz ¹F˜'Ͼd|"óÖÊÃÃ?öÞ*Là¸4vô‘«ÁŸ‘dm±Ï@êcOò÷à&Tp0’“K}rÑ`fUx~kÍ[q€11Îâïc +àà·ÜÊèëTwAU!¾Í†¦vÆIˆ:#·¿âŠŸ?ò—´ù}’A„rÇ܈ÉL{@½j»<ø!Ñ«ŸÑªjH¶Ëpá• ž¦oHä7oáDžGÀ{{«žT«îÅÒ[Éh‰{Ø]åO]Ø•ýÌ1ù"Õ\³¢Î}Ї)õ»XÎ3«Â4oâ#Ä£Œ´9Ûõ4‰taÊüÔšU­q7Æ6y·ŸXDºoœy§]C¨£zLyX_°ÂÃé¨2ÿhfåϼäo¬E7ƒnÇWvV)(¦Gè¬[ƒHlÊõIÖ§;Z‰‰¥Ë©¾7"M8ßTÏ~«·—.~¥òN^Ël­ÕÞӷ* Iée„ìFòäoÄÍ´]P‹^m5YÀ IƒZ)·O„1™Î艕þC9ëü(+3®áИ7—Âgry#ïˆUƈYÀ¶5 DP í´û¸Ñ?‹ZK '¼Œ8±Ç!é‚ÃœiúдÞZí‡Ù€b¾4šÛÆó3ð•Îg£ÆÍNt³d#8g¢¸R&ürzmÔ? ú‰¶ZûX(ŸBßv"Ù­~ìD ãÒú‹;71ÿw°—1dÒÒ~ikcFbY.Õh•/;§pÔÅ[˸ÛAp,-÷ƒ@b!4–mKß$iHR +„ŠèÄŒ®[1õŠSG›X*£ Ç|ÌonçþÌÎ`mKý‰—5µ°D®Y‡`´W¼ÆÊ;×!søߘïÈöZ1¯È O²­†‹òS6ÌbþÒìu¬í´‹à[,5a„y¬‹ÍæÝ÷§Bc/°½\ix½¿ñälñ`^¡œ" Z$6²ˆ¯µ3îMܦLñ¬ªš%KtÇ$]ˆe#/…¯*µÀ}ÙB\g˜°àYëû ‡ E)F^SZ¡ÁXRP€óæ7•q>Þ"û +%þ4MG9uÄbÝ{2ŽÐÞá?Ó˜·ñÂO‰t8ÔyÕx…ÇØmÛ‰¸Î@ +»3ç{i›TÔç¿ë bA!-¾9®œ¸ ¬Ër‡åÐÔu³a Ç|†bÍ8R¨ÖþŒ¡Ô:¹‰¶´Àx‚kÄÈÒF{†Í_^±ò"&‹3y˜fˆgÞÜæ(h^¡V˜%U +4½ÇZj,%·Þ,î§ ˆ¾O²àœ8[°mÍÑ ó„r¹yðUýF]O“/ñúó°6;^dï¾ ê'7zSí2¯N ,Ó$œ’*ÆÐru>‹ÔJ#*»"¦;ˆwá1Ô2nœ@f'=/M`AÕ÷ 9£ fqLwËÛ”Û.„­¶gReЛJZ^§í'~êúºÃÓ(ømawÇÃ2•ƒà.„¦n‡@¢.÷DVäý»±–dgÑõþ.ëßH±²9•P´G‘è&D1ÊnÕb"£B³¦˜ë*c°#•l'xýù¬†R™àD—Ý-掟TôË]]܃|6±ÿÝHŒ`Ÿ™qÞ7ø5â2NËl«„V.”l"Së [5 óI»8®ª"‚éhþ¹v¦$-?ò«<*:ÿzªÏ +ëÈ©ËèH§¦]1;ÿõˆVÜ}8gƒ³·*Õ€’`iíT¾Go!&Ó¯¨Š=Õ„¸eeWh×·I?¼‚!okuš‚6@ç0IhÁ¥¤*oNG‘Ü@‹“»aµ+2bü±À?MbŽJ‹Ÿ`û8”ÙpÁ`‚Ë(‹3]6ã‹]ËEÕ)pèŠ_È•Õ¸…DGª³w1¢ëbï:ÖS<]±×# êP^Ö}?¯ÉDéè&wv™±jŠ2Ô’=C¿ã˜Åš{dŠ;aWPqæöqQôÄ×âÚ#¢.ò~]½¸]‹m·ÿãnP¼~gÀxáT‘úøî÷<ýÀžmúV1Ÿn…õïÌûOOa™’Sži3ÓÞæ.ºØÕ½\H›üS¦é=¯ÁFÔ ÂOÊu< yÞœ= Þ ðëƒóWZRw&.e™¨1àsÜðÊ1ÈX†Ã^99kà­£MÖKÿND4ßœ29V^[ uI[ÏèN«Ì¯·ƒíôñÛÅ¿§ U^~¸Lèk±±‚Ô—ÿÈ*Ž!UãÒR×õÚ‡ì‚îÎÇr^ D¿ÀÏs!ÙÅUŠ™ê€jlp0Âjžü#ª7&q¿ñ}æ6h´Â9èPå „˜ÊZíUß ËþËtÊà ÈvŠ«Îž÷Ž³ô)ã” ¨HÊPJ$šEù?#§«î ;ÌXHÖÝÔ£ìú¹ƒ¦Ûœà9QÀþĨ…Íc=?QUg•áN혈½›~Šô| V3­—E¤¬×C)œ9öMêÆ5Ëo£æ;l +;U–Vº'¿P@´ò~þ¢:Üi<8ô_¤;µ^D+ +SŠzªÛ'_P èc¦¹8*Mgí)ÿ®O "z¨¿™Œc),ó•S±:…ìÙ‚0U®f„,õMP QOAQ5‰r*Dû-+±E-JñÛ^k z¤î¼.xáeú¶¾£29ÆÀ•hÔ¿ãC\¯¥s‘úõÑ?õrãl×Ý^ŸÇ=s[í²«˜©áfoçô£?=Šß;ò4]·ÓóUµkÁ”^ÚÖfÊÜúìKZ=lÔíÓÅÙ¹¼f${¿ÊvR²ƒVõPhÜÊ¡Û'Í$4‹æb?Ý 0dLù#S&¬JokÒQjº‚õÚ#³½g™ÎÜlZtn›j‚zì(nÐG7€#ð,;YREj¹†D€}«ÿ9RÒ&ñJ4•À° €e͆¶µ…‚œò„ K +\=c¹²E®¾98wyÖP—Vg••ÄÌÀ÷ æy©é“ÜŠÎf´ÜÄ0pѼ!€Ÿ„üú†z·®Jn%ËAÈÐ=Ð +âÚ?ÆCÏz| þ±rèou¤¥J¡ð9`º · 5àñ û˜ä9X´É™¶”'÷ºœš¿=ÞrŠ2}òzåÄ0Š„ Ñq9pÉ»ô2|Š¹Ðûö ÆeNαðYÿð6ÒúátŒîîF̶*Dÿ{ÚF°€ÜÛ‹,T’«Mƒi½¢‰UÔ2÷•?Ã\~æ¿9«,¿>Ö~z×ÚÇ›?¼ø1èW?œ,ñQ ¾®Õìñ,¦íÚ_J= 鵬Ôvæi«®Æ ï3 +ßZbÔj­ÿ*»5ÊÁÝtŠc@u¤A®èÂY‰îLœ@º<·Â!SÍX¹gË[&IvU5+{˜¼šßéüš)ôK>Aq¡í†,¿èä¨û;©Fæjt‹nòúá¸ZðpÈ5—b»¬=æ„7Jq/kÔ÷d*ÏÒ“Ö¦k‚k¦$ƒ*@2ϳ’z¥ªëaµP…IV¦SWi«1a[C=Ë.D‚j/²¨•. +¡ñÍæ1V|wØÒ½Ý$çþŠ‡J_ùÞ$Sç8e‹‘1wÜ;ËÌ]>-‰D\6©O²mF±÷[¼ü:_­ýúc´ã²&Ò•üC«Ý W +¼Oíäwx%2Äk¾ýÄS(GQœü|sª\ÏìTäG¡ùƒOJý®Å1‹ñpqw ^¿±›±DdOuüÒ¶?Ü©Àô„í˜;†d×xˆ< ÂÓì‹ño½K­Ê%ÊLœX±[×ÚqA©Aw£-¬î2’5´ª2ŸÌœs°ÒvÔ©BòSº ã†^i:?)Mµuß“U@t®~PÉ#£ÊݤHè…¶eCcacÔ¨›l=bßS,Š˜&©§ÇžgVŸøÅ#m.fXí“NÖ{ )tO^¶|àéÂj8”ñ@‘eX€IÑa.²~SfÈá ay_èŸNWú-¬Þ7ºÒu<õÃà”µ}™î¸I ÁTðg Ãg´œä¥~%>Ðoë÷°"« q96.9 ÓNüÿcSd÷¾d&"µ7‰GâxœÝ´EþïñDµÔÝÒ–Ó~í4íLÅ…oÅßìx2b ÊS:_…´Ý·¿‚] £Âih£uÄب‘³XKbâf¨üÚ½¼‚• X®O”­…ÿ5ÿ0¡Y8÷PÚ-ö¥¶÷ãtR× +DãäÈ¥1™ÈO¬=1ô'¦9ö‚ã²½m.6Ëš '{`ê¡8à^†ÎD(|s÷éz¡¹¯Gœ1nßNqø‰f*O‘[Ö\Lbî,‡–Íáó±up¹÷ž!º«hÆ8j"cÔóΨڢë¸Sô²—59Ø™ +*Ÿgj.[‹šœ²¶'iº`Ǿ‚+¤ª$›ì¨éƒ?Îy¤*ÓÌmx¾'˜|g'%ï\Äu,áºn–¿öÓfñQ‚[P0¶ãW~Ø0N(GC¦û|n•/—~ë:Æô¦c*»†eu¬:Õ@md•‡%óÍŒ“‡¾‹á7¥:å…Ù¹”£µº¹_ºÒˆJ)_"³ +3b\å}šzÓ JÜ\P?­ ±r jx¦ª¿Ñ’=‚N&ýòOj¥ú“÷qxKž9 iPŠ5­Ô¨×#é)y²k˜åñÀ…Ôi¾ ëk'ƒØ™{Ξ`Î숉 {é5züñ-à@¶–bo˜zP«uxÿâ/ëSôê„¢ k¸ÎCSx¤`ŠÇ]ÒdÛÎ’E[”kÏîéÉç[DÁ†8ºÒ’èû¸ŠÇ) á:{W†nî¿°¯ƒ†1eŒ“UÅw°l½ê{\A‡ZcÝZÝø™G!‹–¬Àü¤_›Ö†äW¡Ï*¯ÕŒã›hF &6l‘Gà}8¶ˆÝ×}@Ž<Ç_øÅ%“ï¸:Z›“Œp·¬Ñ¯Ó)rÙÂÕxÊ=BF@èFŠ’|ð!íQT…â›Ë.u9õ±Ê~r]Á*=o´Ø.ؤ‚jP +'|ã2žˆ»Y‘{‚vi6 pQó 9$¦û,ß’ƒäܾpŒnÔóß¼ñúføBó¶:'OÙŸxRF¹²úSÐÊ fH—ñÁjx¤Sân-~uGÚä3®»œàŽ‘?ö6õ–WËqMù.‘RÒ£Ú¢ÔÔI™/2U¶JC~ b>ÑëZ/î°’ž„OAf?aÅ H,Oþj¸nšfîÔ^ –QƒŽL èÀ°ãFp6 +áW©²`{£‹)H ÌÊÀ!{eêHÀð™”™V³ü"­)A˜Wô‡ÄgÕÞ}Ï"yþS¯rîªîzZΨnq¦]¢5z>×˹1Eî¸"öˆ=ªæÝ”>ùÀ†·»“÷ á+Öë1ÎjŠÏñLC~Û>ª‚-)0Ö?~AµœŸ"M)@o¢NœCh›çý>^ 6H•ªW¤mE¾ÊÊ(ËôG•LdbHk‰ï»z¶µŒ‰&2Ay”;!LöHs§é GŸ@ËyåG·~Sïýè‘$›„5•¨ÃG¸¦y'¼k/j–Ð@pÓ·Ø ðÆ*Іì ùú…«Éó=à1þì×nLº?ÜåÒ‚©N‹:üâ +JŽË‹&:ß’nd0‡}2·#^ÚÈíÞAW£Nb_̽Ø¥e»pw'Ö +Þ¨H,Ò”ž<1ˆ2,ÀÚ1BÞãÍÐœ†‡S\œ‰>ý~Ô±BºÐñNºÊÕ[Îõ½àBh’SÒoëÚcŽôT“ÉÕS?^X1µ^Y1ªfg/'¦gL¹L‚¢TïhŒ£‰HöIùT²=Ï ¼²ÏÊR‡Ø.²-é|ç™LÐs¢íˤ^¯Ë¬d»"EÏ¢Â4¹Ñ®2iÁæþ}oMÄáxéh-¢©Á·˜ +- |™Z¢Æënw(QîkÔ¨å ¯øh§HˆnïBºM}D«õÌVK`­ËÝ ±}]Ê}ë¼Â¤té\40PfÓ­³8<²ÀE ŒºßÏÉV>ÔKsê—ã¹x‡¨Æ^ì‚j6‘e;–Ì3–Šû´^_GÒ5÷£íD;õ?eú5²ãmÑKklÒ§Hƒgn]èB—ïü׊‘ã6ôß.hun?Æö_õ´Yå]»æ°0¬|Îr”±X¬g,©õq€ð¿/(ñ²¸ŠÁ÷ ËÏ~TxËò‚¶¢õ'V±¨½—(°§_û6çȼ® ÕV /ùïñ©0R¦8«K#K¥¹©ÑN»b¼ H'ÎÙE³ÖúŽ=¨)Ø´=ð7Ã!eÈr%­mái¤]“ðj&#‘LñCwµ"íˆø?w-¢…8/ ,d?œ3Ü9TpfR„ †\½Ò©GEÊÄàšz”õqMÌ_ö«6‰*›¬‹øŸ7sÇ$ÁG¡_îamï~¬)ÎÞÓÀÚ0¶»?­Z«Lf1v«|̉TÇ®27T 0$È‘–-ç3¦’„y!=lpn2^÷'z½;í§§LTÞÔî,¦ý˜ê4ºöŸŠ\Ç_†+˜æñÖDˆ§ã58ÿàZT²<g—hòâ«”ÄMHAw!—pµÃã¾Æ3ã“ê©´.‹|ÜllRTÁx’”¢,\S:¼ãÇe¨˜¯â^sù¡1mñ'ˆÊIÄg퉯‰çåD’ç~µ¶„R¶N~òIsjýB®cî[¸êyr‹¥g@øðhÝéGÔz.Ó]8ß½¨DN¨÷9ÔPÙ;ÐLtl=«ä‡Ûä…^íH”K)cÞ˜ôª)骙Sg qWY¹›òÁ—n«ëlte¯Ë•K~Ǿֶ«uVÔél“µûÄ„:MW`à [‚_J/9„Ô Q$ùþ,ÍÈò0„²xã^È6>r“¨Eèôèë•·!9Ñ b=’ïÇ)À^H¢Æ®R­úרµ‡ Š¼.²:_C·ÒŸÜ¬!véÊ×M'–Ája–k>ä¶ +³úöèÓÒúáBå«òWw¯€3Z‘a–ΓÅ%#8ae\’M+!¯<Àê *÷A§ŒÐã]ËF„Híþ§Ž²[æ+ìpå#æ"”–Ý4#Yã͆²5~ô‚lÍ%K åo©†¯c=Ð/W9E׋f¤1`Yb¯ŽÑ¬ßìwré¬òîÙqxœuáHàÁm!°q8hE'ÖÔ£çÊÝï‰#·5z¨8©«ëD­ðžÕô{s’?ùú y‘s„aq¸Ùë6¬ˆá²Îïôò¸Õ3ëÛÊ¥=áØÕOx#U®Ù÷…ÅÉÊP|×ð1;Ò…\j1+‰zùkakÛŒ“|£Ã öËa?ªåå]íÉ ?çúåûÐlO3Ž6bØ°SøÐ0GGÄõB €bbƒèMˆáîÚì_âíÍ&u§,y´·n!\»ßßDg2¼ËªAሩ˜Ço1v(ÞÑŒZÍòË83šÕÍxAð3å<=]Í C}ÄõªPèÕ°…é<û,üH›Ïè¹S3‰ç¿ëßûù¶ZP+~®ÄQĩɺ3¿ ’2ÈxmÚ4‘­ùÝ">¥‘xÄÕð¥b¼0ûºþºo¯Ïè¿»ÜüS²\εoñ a瀸®+@G­ñ½8lçøFãqsëgCÝ`ª² §ò–§&˜WÆòôÛp6Û +cô|æ'`ÎÄS%Q 2ÃÜ &aÔð†Ó²YŒ½ ò…ûów‘Ž?£x…–Öê"WÛüy36h?¬‡jø^²iJkӮ߇ÕÆLgøÿ_;sþÏ„\ä^ž#g([Ž–Gæ1¹š£µ­ÜWåŠÍÇžÄcŽI³…ñœ³ÜÏ‘æX„ñœ†ž³ /rMåýï·÷yß?à»sÿâY#é» NØ3íY¶À:U ®[‰‚‘¶BàkÝz™=iïÒA• áÓ>8â„ÒXò¨Dƒv–ŸxÃSê^c6GÑÃeï©z¬.£Yÿ¸O£Ø0^¬7“Seã¬ô ˆˆMî«>Ý…¸4g䯓Z}:ͬÈòjùÚqynýKs*)oŠ .¬Èøœ–ò%Õú°: L/D~ +»»yÇ&Ķ1òþ‡ókÄCÆ)aº„íájÏ1¼AøZ +U¢´’™…ç"óWÇ ¿NãÐhŸgÈ –6¢À¡yX¬{fÜL:’Õ ³kÔ6n›'±u •Ÿ$E—Ò9ls+ª; ’†hNÍ2Ápƒoc&úFåÖÍ„Ì­‘P! +aÏOB&Ã~€Y°R0ˆ3¦ë+*Z–ä:_7‘ßÛ¿ 8ò~Bî¶Þúfë¾Ã2ˆ 1ý´óèhc4|yC¤1à”eP¥(¡†ûuF#õ`?wÜ<Œ•Ag ÏÙÔf +“ü½óMìcFæ/.ˆ›'A!¯™•Û[Q M£ð+hú#¾,¹¡.a£à#_°FÜÝ™rÍ”®Q‡læ tD³ÁoF•}àº}l£Iâ¼Ò›Ëñ UÝU>DM¦ž=:^颗fTAÅ–ú2iÁWÜ\£˜!@³ç°2‚ˆ™1ÈÝF‡ßjB™÷Ám(Dàkªl¶çõ‡OŽï ½Æì±ËTgÏTOmÌÆ~DÞ½ ÇWÿM>Xuw·Ûuò¾–çrï½JbYëçœd¨è8lxK#Z §Mé)>¦`eô_| N+Zõíêñâ^ÆÖŦÐåþW§® ÉD¥ÝžkÇ^'Z\‹…­)ýþ‰Ú% …­I–ëlÆ!ú¡ª#K27¶¹žÑphÚùqq&¥â*xõ³ÛòÏ£|yìÏŽ‚œx ÉPÔ4ç7lUðì,W`üm_p÷-¢1u¦Ó´5µY§J;¾÷QˆDŸ Á”H¦[uúÕŠ¡”I‚R–ÏVVÉ?¾§9Mö§­®sîa@0ö]Lo•£ör$ü? "ÁPŽZ©7t>ªn¬Ú½CPŠM( 4 Xi«—3ayýåäµ¥iu@Áåc +Õ¬²ãÎ]­¨€¢¦ b<Åwù.©D<ãçáĈ:Ïe]¿8%âÜY›>¸ØÚ¹8Èùß—’¿ï#6{†ç"L’îX¤¯ßî¹"V»³ãGZe &¿3óu_9û_fû^nlê +R ‹Ï¡ev,;è+c$?  âÍ{µázÊ*¯ì>èD5É'_›oa9Iyî¨áÆFÜæk$Uj‚×À$ì‰áÉRJDµ=%¤¥Z¥³Í’fLãŽaíORŠ>’|„AÝŸ…®Å©Tï Ⱥ៱ JòÊx €dUº|O¶ÖO±Ñ;~·”´ô¾Þ–]ÂÁQs\Íâ¤^Gš‡Rh÷8ú/‰ýü'¿ŸH|x¨Od°Ø?µo÷¡endstream endobj -940 0 obj << +950 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 34 /LastChar 125 -/Widths 2101 0 R -/BaseFont /VWNNCO+NimbusMonL-Bold -/FontDescriptor 938 0 R +/Widths 2131 0 R +/BaseFont /EUDNXE+NimbusMonL-Bold +/FontDescriptor 948 0 R >> endobj -938 0 obj << +948 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /VWNNCO+NimbusMonL-Bold +/FontName /EUDNXE+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 /FontBBox [-43 -278 681 871] /Flags 4 /CharSet (/quotedbl/numbersign/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 939 0 R +/FontFile 949 0 R >> endobj -2101 0 obj +2131 0 obj [600 600 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -924 0 obj << +934 0 obj << /Length1 1612 /Length2 18760 /Length3 532 @@ -9914,239 +10077,226 @@ endobj >> stream xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd[;wsS3'¥š² íYþ ütÿŸž¿™Žæ¦6ò¿.@+[;k Ó_ˆÿëD àd˜˜[" -ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢ÎðC\S^X™æ?ßÔE)þÕÞIÕÝî/±ÿÑŠœ­ñÿ:üƒ!,lëð¤û{é˜Y8ì r21yÿªý †é¿Îr†Næní¿-32ý«ñÿñû¯“îÀˆÙÙÿ³+*N†6Æ×ëþq9;8üUõ_7þoÃÿóü¯EÝ€Fp«¿mx‚,Ò2Ój±r‡'Eµû{™À‡ƒíJTøUÛöø¦…ípU¼×Ó7Ns¶¹/Ú}ìKSŒöbZQô¤/óñ½I¨ú -P7É;8hôJÓÏ4¢<¯e·!´ØÕv'•”õŠß¡¾Ow°8À\=Qù‘¸ø¡“>Ú!ù¥ÖÇbt¢4‚|«-<=#O<~z¤ê¹ìÛǣɉ…%ãq@$ô³ÏÁÐR«ð §‚JoBÀ»i¿ú$ÔèöÔË##Å%°–}U4Í_³i—}O‚LoàM”slݯüy=?É+”8Í5—ûµîL&æˆÅÛ„?Ø;kI8“ ]O0üvMÙïæYk]MýÚ‡”»02£ÔYRïÚµOÆH7î\‰$ÒjçH桳,,c|/ͳ‰M|\ÔøÉ×Ñ;gYs&kœ«ëP›‰­HÚz‚qÒÄ^hØx#:0%;Øt­%?!IRt¦äÞáséÒG_æóÈùC¾*íž¡±D­³EvAõ)i´»¨ ¹Í o)([ŒÔ‡+!Œ4Ž óçBÖx¨ö×éÀQ†Û–Í·´Š“çALb¸Ù…B ß%5Vy>©•õ_C äåwÍO?Xjb¸ËRˆ¢kŠìßFÆW‘¦³Âxýùb1£ôB:^‘átlØèöÇóžˆ}† -ß´Ç-_†‘À=DMá¢y;3pîÜÇ£àí •"¢œÍ‰pGÄ/çk~ú’DÎv}û Î|è8|ÔpVx{DžØæÁù¬(™è“‹¿ònc‚"©jȦފòJøˆÚfœ ƒ¡J÷ôy¼5Œ³4©aÆGD‰–îQHA²;§Oý|ÍJÑs{+ø}Ÿ£ù-0  <¦L¾F{@ºK4@Ê84;/  y¥)ߢ•èöp9ãÁuaÔqLä z?‚Dô°°Tÿ ½ÒHt<êƒÑ`4×Úú -'ëZ;/€Ü –^dŸ”¹\ ô 0:ŸæëFVEò‘¥0\^ƒŽ å³Ý1wé¡•>Rh’`ÛêüÁT~Ø QaZ­d®ý:<_µ\Lä…5®£¿ºyÃRxy^Ù@I?ÂÄ0ï–~ÿà·à -U~-UÙ1`¿ôB}èÿ[à|ýÛ¢˜‘èþà éz]n¡·†ätœÍOîø -é+¦ÞâwªÉ"=ÖšTÂb.Ê;9§D¿KBr•ZDIé°É¬/$h-5…œë¼_àï_æE݈P`„‰ÆA/Xâ\¥$jœPSj9ìùîåIt·¹özîk^Çqô„êò´GËhžÖ=ëxõ\Se”ãÒx!÷©8aYf«qy·BýÞHÜö˜ãfM¯ocþÊù -eŸCN[hÀÌ"¯5sß¡¶s«ÒVÛBfžáœD(˜Ü¤胢&BˆóáÛ§Œ—=Ü9bª©s ß¨nZîÉÄõn^’¡ïg^í*ªüdïfº×D°>M*|™vži­}ç`1;s~ŸNÀê~m©Ó±‡„æ\£"éc ã9D^ŸÍ1ÿ˜,F»9ÿÙªø¥só=Ê>çR³¿N§EUÝ£¾ÊPäý60|õ‘³9& x¿«é:d=ˆ“ºª¯’!êö9šu96¯¬|öu½nX—n/:s€fHë¸ã~_±›PªƒÍ®Hò£}&Eåæ«ëO¸éT\“Ö¤ÍoMç9œÇ!©Góò eLOÉuA¬¡#_Ôáhr/Щ6ßïÜ:´ëÕÍ©Ï®$V‘ILJÓ]Mèž µÎⲇ  @¾áÓË9äøÇZ›¨6ŠŽ¯7Ï©"Öħ1Ê™‚b½ZôL’ADe2EV ]¼¤X*Aþ8€?¸AÝÈ‚ªºØHüéuyHã”Âs *þ¶¤ÐÏW8=IŠ0Å - œÉò;Fª¥)Ò—³ö­nEä ûÆÀ%g5HF¢´`Æ÷‘1ÌBTï7íVcUðíÏsÔ5#LðÆ}Ì Ó]Ô^žNkHp<¨‹7äÛ!”a¿Ö9âì-OhGô¢µÍæ<¶ªKt VèLUjŽÒ:Ø€ íÚ²"A9ƒýL§@•­ÕÜjF×/áóæX±a¤“á…sy鞆v_Íï[3‰Ó ‰°^¡Ê-à¬ßŒ!œÙl7¨¦ ÍÌÊdnS;Ó>„|d¹—.Ú¬fnßY“ã|ø5ýòbõ"éM¬¢øBÍØ-P_éÀ'´ -S4DB~Öõ‚iJìÞóex1tk/•m›ÙƒlÐÈÍ#ÿ}7©ñ´¸jL¤NB¬O+ϸ WEõ{ç$3W¨† ·°‰ñ6Szuß²]wTé‰2åº -r€Ð5™'­§øÌ·¶YPNøÌHý ú†C¦ÝÖïLS]Ý(…3¹p¬Ï–z«ôtNzTD¨7KŒ:®žh[µg¥Ñ¤ë­‰ ¿ø˜¹Ô¹¶âÂõA?Â}û Ž>uÝ'9*Ë25 ÄÜ£ýR¹'«3Ir¿'ãƒz‡&ù#uf9¯*¡ì@ Œ÷OÑĬyáw‚ÀÙÚÞœ«‚ó—o -s%Ú¸üf„ŸËcÉ£ç ©œ>V† x*sžlKÍ?–‰N£“í³Þ;TÙ6qoam~gfÞÃá¹b:èÅ `Âî ƒ3öæùfÛVÓT”75"úzEÒ²4Yj©sÊNõ Ñ?±Šèqu""¸RϹ·ÖÏð­f†¼ÀA'bϧð!KI4 @·Ã‡u&“w]!&$ià}ߊ½£ƒimói×Y +RÀCÔÂÙ—ð¤ü‡Ö†8ó1…œ)ÛC0H Éª­ÀP[¹@SÝ~w0æOÍ‘àÝÔ´#Þ%ì8MÖ™E -t.Û½«½DŒ/vÄ”õf&|aªŠ«-÷­c†ƒY¨}ÇEWùn¾ß¬úvtÿtšúgÓ±ÇFé…ÁI{>2›Ðø‡¨ÏÂØ#7nPe…cÄ\k¾Boq_„t˜V/|å|ªeE2óFm<Þƒòc):¥¢@y'¿v4œ¸}!™RkÃKnpÁÿ"}ÏHj/Æ*.@¶B™¡áì8³h¨ûÂò0:z$X(q»®%ù9ÞÃX*´ŒEŸ|ÆB¬-$MXÜ/ƒ°I,Ø iÀ~™3Ó &"sÐöb“–ZÁéÃÝog„F#º¡séc¡Êöïpð{Ž‡Lã³EÔ]¥™PÙu`Jvqíªi‘0ñ}ÅóEëg2!­Œ:¾~¤ÛS¶ïgãÞ¨e}èGóíÜ+¶býÂW¦âEñ%,ðÑ„ U |έR †÷Ó¸ ‚“7|Y0¦¡ÐŒ`c”h"ï¥]$¯ÙDøy–¢U”÷³*Ëö;•»°žˆž½X€Vºi<„#ÑÅÒ8ù³‰·5òNéK#Û”îËÏNï‘r®[nXôf$AO"Ý–¸SVµ¼7ê^Y´]VsBe÷ ´g¬KI^¹A5Çr &&# zK½q*Ø" ¥¸ÅS äVOlMš­åV:ìH™/*go¾ |¿Û^B´÷£sä™Í/‚¬¨+“`‡™Dì žº,Âe…9:Cf!3M¯ˆNïxnÀ>9ë·ÞxCaSB$È7{Od¤Ôt †ðˆÍŠcÅø»,Y™B‹áºoÛâUûà¸Í —¢§²Â‡W½`¢ñ"•oû›‹¶»í‹èoœSªÛ>¢UÍAÃo+«îÅ —6/¿es^“Y ?±Py2C™‹ -ÆŒEöÏ´óŸ{.Ô&fÓAÄVUþDØ×™ -´ÂØ÷þÞŒ4à…÷r Å› ‚$Œ¾£Q`ƒ-`¬×ðÇŽMéˆüyÀœJØ ò`’…hQý)*¡ $ˆY -5Ëñò­Àóv3.]”T'‘™×_ìÎ"ÀT'8±ìƒJÕ2,ί„q;§oék9ãñÙ^¼è½þ#±ª‘l VgÈDÝ/tHõÿ¨ÀQ—Œï±<=fYM[=€7 µ¡éPÅ°¯qdt³a³´Ÿ¸®‰ViÉ}Í~‰r¨È ºC`%ÐÔÖòü¤‘ ¨ä=ìíÈ€°ø‚x.«å_dÃñð,öͲ ôpù‚­NŸÛ®}§ˆTÎÒ¶iÒà_/á z¡±íRÒ*Ø Æ 3ýrI›½Z }z+§ðEU-8¬¿¢u6ìú xõ+ðsFúÐÎ3à"Áw}EýlMÚv…U=Iö1ä³Ò±çŠ:lú¡‰àâåŸm•ôònG&±O4 ŽÇ³rŽÏõ¬ß’Š@Î%R¿~W Ø)Ø×\„Ý=VÎáܨVbkcà6æŒ#°ÅóŽùI4MœÑb¸ï=pû{níÒË%ˆfcY¨¬×¿þécaöyqÌÝ1¯Æ ì—n7 -4?äÀYÜéV“yö2RS¨àÆ`{š,#JiHÂâ-ý»€ëbú@ùðsºÄÙÙÇ5NJ;Îið’s7?†™YJÂ’F4TïËý´äb„RêK,k"z’t&¼pwÛkßò1^šDFO²ÌÂ>1Ñk3V¾îÈNŽD{¶æDJ™¼oæà”1•±ææ¯\ÒeÖ/žôG};;’%Ú¨A{½Eì–6¿nn† ê¢Î,%*îp5¤=¾š£Íi -Yت^éιAÈ•Ë5í -Ñaµ+Ë“º±\‹0ïdÅ C´Ð²(Ó©Öצpy§’éÛ …oû x#z–ÓŽú­iÅ6„_´'Æõœ¦?óØ&¢6ºT&V@t½E ­B:3ç|¡7›Ãù)èq‘ y#釪sfWZâH«abzTÆcóY!ë>=ä€Ë„—ö†ÅŒÎF1-Ùòò}\Ò|3GŠXi -TpndØtº7ù)åç«sç/4ƒ8ôÃNE#.VØjÑ6sÇþ·Šª,o¿¢N(Þ-Ú›:ŽoLªḻ9ö8èš?&f¾>©¾*æËäIâ~‹zÅ}HôäX|]ˆ…–5Ö‰¤õö3›‰ø/(‰[ï ˜Vîb6ðÀ—ˆ¨ÔÆ¿<—ªîïáõÑc{R‡vº±£¹ôRåpõ«ý—T6xÍtd=úÈKgû% º`I)„ê6…xVdLñK±¯“þO{e§Ré÷ù+Poõ šZyßÝb*óë6§ï½$¬ôG u\>Ì~ó²=]ÞkÃOáGùÀâ¼’þ4SËÅuÖ¦Ç5´ŒšÈN›Q;|8x -ï‹i’6RNbl¨°› (¾/`Á%àÁ¶åæõ‹¹ÙpbO$s™Ø¶€ŒÑ¾ÖÛw@‘ÖD“Õ˜‚ÍN"­K  &.MæÊj©úŶžÔì¿(`\5ÛZ µ2kyD„ ¬Î[ï*¦à"þFp›aÿ Xf˜¸ÎTb»}-» ÎáÎB%½ 8ê  U‘6J‡(ê¢ØÀµ–…Fíªãʜ؂¯ÀX-ô£-Ýñø>‚q'«o"ty’ЄP.Hòöf;¦—囦 -èýJÇF@´ø¢umŒ¯Æ8|‚…$³(ßUH§k‹ÖÐÓà ÷¹eeÕmÖGJ•#𠜶k%ââ];$ÖJt ‡Ÿû?`ö„i¶Iq~?•°©Âá/üªÄÕÎk‰ÎX¬Êù˜³SÜÛ¶‚ÜHvòÅ¿¯ö—Slöèeî‹*bN¿ÿe¾¢\h¦µð®ŽRöã -oçë÷¤¸Ñ^u¯LÇåô¼ë‘¡—–‰È/º¸ïr£ìu_ -¹ÊGÜ.×÷ÂÌ?áw…_«DP×vÀÊîúðMEi‰Í;èÌjêL¾ÓÍç¸×l£ÖJáðœ4ݘ$í$©QøRdàdzFaÆ -±aÆ°ö¤ûÐq#Ê õ;–>u ßЂÑȲ¨ûÜ î(x­Ô>|»zsÇöMïÜÚ ¡<£²€*¬R¶nè«jt¤g6ö!;¢nÖDJ®Jí¯/i·2»K’HŽc1äÄ¢):ÙØ^Ãô¢šù…Íí>ŒôkÏ\@¡fË yñ6“é‘úGÔPÐ艋ª£5nôXþ8…ZvOç kŠV7ûüÒ6'wÊÅrÒVrô‘àÔóµOoü@ ”Ç}žìÃ3_k¥Wn~— q°ê€Â¡NmHN¢ö.U¿_¤dNß9h‰¼¤‹8 @Qpù7Y^©Æž7RØ‘{ǵºÒ´±Î—ÄA¦WM¹ ³xûû’×*îÞ¡Þxö\(ž§/2Ÿ@\ꩉãù>#ÞÐFÕ³« iøMŒ”™?E¥´bC3%ê5îæ{ÓeR„Z )o UE4´oÆ :[qt ˜O¹èðuÙÎJ’ÔàW-º¤–yÃ*¸Ü,ºq ï7ô/fÁC¬F¤œslÂïJc–R‰¬È3†›…ˆ¸î*\ª‘nu”Íooˆ[í)0"Ï„äÜòR‚zƒi"ÖbhÖ“ ÀI8ŠeC’µ¦ ½`ò6¬¬ÙÈØ—Éýüv¼ÏvB¡¹†5ÃÌé—|5˜,óë··'{Ÿ$ÿ0Ø vYR~=2·NDá…Ü… ´²ðAC£´ïK‰ t¾ú¤ÅÊ´Uäfsä)_©ËŸ÷º1Ó—ÃU»»bî¯41Ê„ kÄßF(Ä -AQé}lߧ‚>œ'Øoy=Û“õÀ!»šp£v SO`MÚ -ÂEdqðÏVŽ<[^/à•‚³mQB(ÉJ4åïPÓ%›ù5`¦—¼<áN]´ÍrªuÓD…8#¯U…ÑxšŒŸžþØë$@Ñrˆ ¥åpT_ç6þ3$$mýñmmòk ŠÊƒ!7gN?¥÷Ó -4“R¥VU»4¦^¡ËþõúB–üLJ#£·nγsl€tŸh‹P¢ÀB¯B¡1ÔÏ’‡’ÀmA8onTƒ¯üàŸœŸ™@©5Ý£ m>è|Ìãé$Œè8L¢äë×RõC™u´„î0a\*;­A° 0‰ì…ÀÏ?'ê=¤†CcÕ×ÇógEw{ñ§X<¬Ö«Î§¢¯‘Ö/¬+±]éÐf¾ë{Î"²Â.`W_‡—ú¸R2´  ¬ ÑßèûnȨ÷„W:È%¯Qý#?‡uÓÌá†8p¶ÄÖKê"“`t@ º^õÛ“TºXÔ+©eÝy,NÄ™‰âJcì³¾ýóiówh²i©1K½à#<í‹6uƵ(E -¬Ç¿Ñ¦‚¤E(#ÍËŽâ~qõ¥]ïãDí -zúÎ}™‹KŠcw|¤ªïhu•ëôSˆÆ¡ÐãË­„[ö:Ò-DqnFå†üô’êP>Âz^ʧÁÒÀ”¬Ì»›~–[T¸4عâXïîif%ŽE„óN˜¸þÒ:Í“dõ¡#d©ðº+†ðŠÊoFš{ÈY_5¡»$ž…Sr25Õ¼îà>Ó ë°+a“^r8Æz5³w ³„­JÚ%uàÏŠŒ²¥oŸP,ã¦8(+{(š\‚J)æ}kŒné?op¡Œ®_@U<º°4Êßo‰ÔYÞ<ìaÁ ŸMˆ§õcDÏSÆ)ÃêNiñZMEèG5­:—ÜüÂ.Ì{á¥Åu[R½Q0È›®iÔú#ÅU·@„ñ`lˆ-gb”Ŭ\ÏŽXIP'°(Gý³»`š˜º„€B@BÖ&íOrÒKn°ÉŽ‡{ûgÕ.V­„Ó á™ÔëuVO¹©’›¦ic{b¨þÈí‹5D«Í÷‘(L˜žkVADõ½mÕTŸÃb|kÊ"¯=^sfÉ̇ ø.Íþ¦úzƒ D?¼fd¥òCRØÇ”½²c+‡ò¼}ÌÉ? Ž²69>jí™e›W"àùï -.^7=º6Š2#0 Ÿ“8uGzƒ)?&¯~Ó&Î^ma€ÐÎÝØ”ÉUk‚Ï]ûl ’4Já–‘—ªÖã¾ß‚•è‹ˆzN“Uæ§z¡Ø„ðcÃÀ4¼âeºsÂiŽ˜›ÈÈu"ÂXÐ MòÂàwB²Iê­Ã>¬qø´d†É¼•§Ç. m"£ûˆëDÊ!‘‰oRêS´½)™FÚêaÜ.¹½<ÙBý 2ƶðÞ+ôBƒÐ­¡+-Õ›3ãò¡5ŠÚR" :zïEñ>©-Óæ° Îg‰lL8y$º›³Þ%µÙJÏX9?ænµ‡äFóà–®Œæ4GÕ'‡“ç@µ-–ýp5i~Ìoãø†Ž…·r–½Ý¢_« -)׆þ®ì¸}Ÿð‘„¨ÍŽà”ÿâMµ3ëîDþþF·X#›Vx„¥Šš9—ÅÁ¨¢S@§¾Õ§+Öf.;™•óÛtÆçÕÍ&…¸eýÁˆQ³ý Qi†•hOr{jY%ÙJw¯ÂT„—lFt{¸ö81÷(Â¥…ô¶äÃÊòûb2ÒJ8cá”ˈÒbÁÀm¼J&­Z‚A -Õ!R3|´î|ܽ$uà×­GY‚œ æ{Âx¡  ~.œú&[qæfôð†hZ³O D_‰Ã`z™7ÊMìòMA•WsÕ [ž„væsÅÜ!ƒØ^ZÉ»‘wïFÞVeGò‚\l¹ÑS\Ÿeæ"þÌDnÚ‘15Nôz{ƒ¸Yów0[° ukz?¡Þì%¥ -Ü0†Ç/OLj[É|Z«×Ûž<Òí°4ûº ·Dɇvk5A´oã ÌtAÔ” -çHBžO+Ú‚ÄîóÎ"«g,Ç}õS?3Ù³”“´§+Ôö·V¥+ÂÜÖ/'Ên³÷^ö/€Õ…Óÿ곕µ°€ùÙ?"0ÁAÉÃ\(à-ŸÍ¹À/¾7mù±y}ýÔm“ýmùkìµ4#±$ß” -¢0ÓžœÇ‹·z´RÒCfwMÎ-‡Ý ’օʹºwvE:…n6OAÆR . ½Ã Kæÿ>©´‹™Ü¾hiÓn#Ç*ëÈÎ^ª ‹{n„œƒ|Q‹évÝ 5¼ã›ènB uv%ò9{d|ÞQP>CöŽŠß$qˆÒÊšÙ8”Ç­š¥«­u#Õ¸)«Û×¼¡ëSœiQ¡zJõÏA*tµÓ¦¤§ 3;Ûtès-|b~0~B-Z)ñBšª©*·?ƒæ–+[L’0o!ìÆ»UÕ‹B"Œ¾ªÏ5jdÝi·©dVéc]Ð[æa÷Ú(i³ ¿=ב;†L íu߆+YÙÔ¯jÒðoAs-á÷!Þ;ýÈž8íöêš«Î~à 0 À„ -Œè†²}­°[^­ÄÊ"+4´Ÿê°»Ç[èë+SˆR·sQª‰’ŠYHX¿™ïC6ñé|W$­µÈ¹ê1±£×Kì¸ËG4ÄÓ:£å9d8—f‘%¬-Uo—@~<Í‚¿<ÀÂ/OY„рƈŸ²7 9ÿFL!Ë·$À#Í‘»%#“ÂÏ®À!¼d^ûÉßì#r8ç7Ôs¹ùáÃ@óî¤D((§vL¼ñgà³wKKf8Õ–u±M„ ,GìÀ±„#†áÎ7n $\*Âä2Þ Ví/@3*Û¯¦"üÔHÏ Ä»Tm’k7ìècƒÀ¶oÝ…æpxVåÓ{'ŸÀVÏQ@Lv¥ày«§ ç-{†Õ#c¾Ùy·Gö=…lL˜ÀL[×nЩ2oY4êðÌûÖË•÷>BX^M4UÓvŒ„l0gz -ó½ýÙ ÍËF£jkN°3½WäfÜÁ)8+í':º/¨%²+žG%$Åw·í=¾tÀÜ~ÆéÁúäi*¨ÐuÙ>lû2{†X’GVM"¹ï§¿äØÞóŠ-I¦./q*#Ú-ÍÌûS­n®Þ~¿5f58O&Ó=ƒSµ@·ŒVÓÃܧçOPkÓÿ hÙ)&ÒªîÏWfzv,Þ6ì,Ïp¸êÉã7­ ‡ixÔÆ­SÆ;Øc¹}¤ÛUŸV¼ðœxç.»wQ~ßÓJ3CÙNcYB»Ñƒ¤3Æ›õ?­ÔæuÅXŽÝʇÌ®þÈ}‹b×"¼ô)ÿÆ;Ñ€¤ˆÍ -Ú‚+m.'ª®ãæáLVò ÊacL-À³…KË+@±ù~àI mªÎw3$‰/pKx÷ÛNìv þB ͽ2ÛÏA‹É]`Kmâd¹êuW‡¶oŠ\ˆ©/QÙî„„!'Ìqzî¿æÞ`rŒjéÒÍd‹ß”¥ -¹•úÑÅ0v ñ>R0Þ{W8ý34®H‘ó£îH±±­ -—0oj+tóH*ßj<šÊ¡ÁYzdÍ¿f1hJãg<+ïa??Â…VMQ·IŠ´Ö`ÁÖK)²jâ‚·8óK×… -t‚i]ÕܹQ7•¬¶">ø'2cq’ÅuE}sÀ£e9L&„MrÐ`yOCÀ´ó'{›HPO˜ÒoÅø8ì»n·Šš¹Î1è˜(]zš¦ÊÜ÷ŒDÈQ–Í’>¸iŒYñvÃ×LT%ù+0&—¢1BµUkæÞê«–Ì«l -¶Û2g§yö$®ö*Îæøe"'WèÖ£“C N1.-ÖsÛòQí5rJ÷ÛYAQ&¢V1R7Œ¾'NI,Ÿ*˜å~Ƶ”›~÷Úrò9!ˆcV†aCPµO;;PÝÌå³(t>ƒ ¯ì~0Óâ&ý¥tdW)T?&ÔzISÆ—µ Ñéô9óóŒl|—T¶·ô¤+NÓÄn“4üÑ«#éÜ‘ñÑÄüÁÉ֕aã_.›+A¯@™øêSÈ3•'üp‡IøÐÌySzùO ‡´æìÍ®¼Ck;ë2O3Ô‰áy/sT²—»ŸŸhŸúĈäomg…Zˆ­‰fº9ðþÒnjĹ.&i&ß7AŸÀ’\aö(±V­J¸ãnÔœm> ØŸ) þêy…ñålkMO¸éX8VEdàŸs][» NÆoñ3F_ 4å`}†v,ïˆnd ‚ì’تLÚB+;1‹h²QÀú·î´¢f)²kß8OÒ# õ:‰É°*NøG0Úðž{Ï·¸Gâ3]ÒB]ÝãŸeõÊUút–Zä¡ÛQ*He'3u}š&ºaVÙ0nÂ_å · Ø5J泧Þ;R~&ôc5Æ¥:3…/ïì&Ó¢.AðáÁÎƸÃÄžR¿nÈ€¦ã~E2Kâèš”¾³klÌM"÷mkòù¶Bˆ)™öøï¿¿ÓIF{/õð·לuù[Š“‹ÜhV¥<õ!1QÏG)9ì(Å¥ ÒtM ËëqÌõþ¸]%tƒP]¦ûtàÆ&Ks:!lg‡€†)®7ì,èøÔ:Åaäæá·ãäQùÔò=•ÃýnÙ,×À­¼kZ^IºgàÁô.uQ³÷ },Œz“¸»•dA@{â^@±ÝƒžÅ&ýþ°Æ¹rVL*ç‹jïRf§ž¦|ú¦ØhwFjPÜ{tnã𠞸Â1LM‰ðg6þ>¬€ä¨è!³ßO’N·3PsÞvz¤' W›Bb×÷d•ª;ì;Ъ"j7Ž”‹98ô©å,³ÑÕ4ÛÕ-뀌éÂçË+[ã®fΠ´=5"ëO_Z§ÝQýJå÷# ;~Æ×:¦ùOuP2Ãþû9¿™Úã†ß°q¸D’!ˆñÛü"Np G“ó TI¹Düˆmu áê°q¤boówH/Xâ¼¹vbh™‚79}Øži• 0!5mù'p¸ªŒÍ-ÖЗXéçQdrîá•fè÷ëåÞ1ŸdÅ˛Σã…ê(?ÞOCüUd;â±ñ.&- ÆÍ á©UÃ&ÄlÈQ¶œFWü ÊîG˜ç;!:XV†à Ž«¦g.šÆÌ" ƒâÝ`”Âp¼](G¦•|ªf?„ËÄŒjݬ~h2w|¶A™¿îÇ숚ˆ‘u #S0g0XÌŠo æ< ~°fC1å¹TËI€I¯v8ì{0®BôÂPœŽì>@;QÐÃ'‡³ †êÉ2$¢b(ŸÜ~¦r Ž}žjÈê 6G\æ«ëVáÃðšOD©h#Œir ~7úsaóÊÀ?Ô³©§²ÆÍ9Õܯ» -%*RŠ 8$ ²Bí¦®ä[D¥ªÝ«ÔGÆ;üÑh<®^‰¨´ÑE—@$|ûÈ89O\2¾ãw3ÆRæò…iŠR)ÇäN(˜$ âBd ±ÈÔ: ¤cCœšÒÅãE…É<¬)2@5ø.½’ë"¼ë'óMÂÛçœÌ„8 -БQöw>}N·>¢Z[@ß HÀ—ÞäN—÷“$wŽp»X0õ•Äƒ<±´Áí¼sÎ*`<Ñú¶øAF‹/©=J^®üݯ‰TÿýŠCX k¯”¢vÈ´ªøƒßnÔ«Ó¨ ÉŽ:ÁCò®E~$œ-b™¶ëþto©ýB5÷ªF¶¬ïϾ¦´]çnÿ¾ãçz£û-&úiý½®€Q“²sxGûÑû¦I`¾|R$I‘õ\‹àX.áçëÑMdù ØGË7DÐÁ`lÈÒák‡)*¢mÁˆŠ‰£ä¾цëmhQ8ð™’¦;¦eP‰Ñ£EçòÎïZ¶úAI -¦£Ò턳`à*ùê™>÷)›td¾ñlË•]“î×=í -9l¿»YªjËŠÍa™°Tt÷W.™”Õ>/žú„ VݪdspÏ#¸îú§+^üƺ§h¥ÔS-b©\LÔåg› llª¦¢,#Un¥`ÙD2ïÑw^´îWƒ…jžÚòHƒ,ߣ4i´Ø$ƒšš4œ¤c„\œÐ9˜n³žK=F™•S'a&È6cS4 EV×#ž°Nšy’ QN¦]ˆ‚{4)gáŠÈZó±ñëÛ¢¸$¶§”tÖ©ç< K·fÐ2o„mê„‘iª:Ï”)Ðö¬ ×ø,m/@=ÉFËi‚tÖ²$Q."]å+&•²jjÄD™Þ}Û­n38e(Ö²õ²·™s,ÒõáÙĽëÃîñ¦Öà#” -, kÉ÷´éhÏ·.rLgâ×hž„—pZ??ÎË;@·aQÞ¦fÍ‘Á£˜ÁüÒ,_g+õÇDê–[ÖË`lƒÿmjC“½ µ‰¹ñ•«ßyÁÙUe°M ©P21=ÑAC6R²ãxÖ¢Ó»ÌiI˜µnþ¡twÙW|$Ø©Ýv;Œ4âcƒäy.,üôFÖm@Ë1›ÚÜÒS½V%¥ òN)®#ò÷~H}ç†/œ¶CDÞË>K†·Õ04 y\·ç¤Í¨ƒÎ¬VD©?qúÉ´K¿¸!˜Ù6t’m3ã˜B. -ÂJY†Z†ûš|ý4-¼©‡ôÄÖ/äNø&vL‰¸y)û÷oæéÆ¡s¨Fâ²JJ–à!`²K-TîÍ$\ \8fÇ®Ÿ™ºˆ¤]z‹9L9‘Ïÿö4ÆðÞ/Tþ&š¥ëÕŽÛîäHŒ7ýø1ô°’ë{ÇnŽrbÍ¤à„©7ëã!ÀÎ|#^ìñ›C§.Öçì1Ê"‰ >B÷‹=^Õäìb—bu/ÙÒXÄ‚™Oå§kY‚O)™:&Bç|i¿ôÚ¸rŽ:7q.8VJG±Ú–= -¼œggÍMÛR9éà½Ù»T¿Ø6žft»@ã.‡±v¸g8ËÃ7ÖÇËñˆùƒs‡@JE¢ ÌL‡²¾ì§£é-ø?ÝÉ8݇uÊ I·ï*"3 Ò÷ËVA¬¢Õ- ¡Z"ÞÆmU{/)tŽÎ›ð?KŸä~_†ÜÙš Ö¶lâ’¡n˲aþq+—ôú¨¤ë1æo/+žQTËq&ÕHdn„Ô¾u ˜Ñ­-ëMåÇ‘sÿÉÅ™[tœ¼¨øµŸÀÄíÞ®ßPx|òúËüá‘æ/¨-epsƒÛ;ʽQÊeŽÍYszgÏLf²Ê%—â -‡3¾•þ4¡´°Ç4s©Ó(œ#qp6ß ïȈLÞè¹xÌ9ÿ*Ͻ-+\NÆ"ìÊלý 4±ëè“B»5ýû/VQO‰Aüp ÈÄ@ˆtö·­ã*EÕV0µ¬7Vn¸¨bÍ[u?¹CöuJ4,Òk|_Ë­|Ïë2•`k”äÅhÅEdÔ<üÉgÁÛ{Ôrä5ø‹›o{Ÿ¬cy¯£ÓJ¥Ò/âðÉÞ28Ê8®9!úzÕP“¤¨x÷6`1©ÖÝ`¯îOzó€Xú8jvƒXq¢™°£»kÌí²¶¡‰2D¾ß•‰”uaôBAwõúà ‰¿ -€ÞŸ|æ`xFÎärãiwÍBÄt·Ñ9”kE‡-ñL¡•´]^`ƒ|ðv?B@ÕÚ,eç¼oì.9‚¿‡ú‚8ÛƒïûÝ -2h°Ø‹­ˆÓçBJ6 rD÷ öy@hÓ©A˜orÉbo»­]hdçb;é^ûxw^c»{$¯öw÷ª(:©]Bæ?0B¨Zt=qsŽ»_ý¾$UÎö×ÐíT! vMIöM»ªéKk¦øy"Óî“hŸQ¨¿tHg½Å#v³ Ë¢¹(^Ë×"F¸Cáß Úï~µÍO[ŸåÇ•ÖZ²Æ~!íg‚dö¯hÙ¿¿«ðÉ×_j¼ºÞÑñ¯EAåƒß€MŽ›_ô?¸M¼½Ñ¹t~ŒÜ+ì SVáu¤T…r©¡l®¥Uƒ0P;Þ‡™OØ~uLáÑwöÞ5gL›É+Êj/1ˆwv_›Æª¥µ[þ±žœh…{eóåa"ë‡u ™rÔc§®–㶭=üdxí†ã%û¡AUì÷È+×¼ Ô4ÞΔEÞ°•ÏØ„ç“ø¡´ûèâPz?¢†Ú mê"ìvbîdU‘Ö¾”ñzñj3¹¢¸j&ÁÄ~¶§‹»‘LͱZ -É5w½‚'☺²¡tg‚ÉGѺÐäQ`Æ9vÉlpúÿÖ§ÿ¢^ʆÁ.¸7%Ò` ã±¬Fœ}a<õŽÞµªž2Ȇ´h¶”RÒ`k‰ÉÓUúÞê¤/˜÷¢ú¹«É«¿ð\”)$q‘1)Ûÿ~3w¿,ᶉ:—ŠùÒ¬®ÊÊ€W6 Ù ƒé‡~ÕiЩ`’××»žÉ v ˜rGK/ÊBˆTJRÌZ[¡}ÙAöˆóÛ¡Ýå熫"ø`™Þ[þö‘±U1²ѵÀÈyþ¸ëhBØ…ÏÃÌQ)¼é‰e‹@Ÿª"´±³ÿ2ŸJÙÒe5> 9UV„ jTÔ׳4ašG}„Ç᧜5ÅHgQz>ÜØÕ"oÍ£i:,®Zƒ…[ªŸo[¿¢!cÝÛ)èu3oÁÜKÄÏ6W Þ¯"Ó  ”ÚðUAtE© ¿#Ibz£±'»PæÜä - !˜s¥8cs;ªÄj­ÌÜfºô#·Ãÿg:‘s2$Œ©ˆ×6'?^1„4=Wk¯^éßÈsê&Ù¸e;ìðìÐégªA¬½Ù¢vXþ]ïz¿Y¬ÍrôÞ= - Þ?”XÉÙTVà†Q¢›‚3=A(ÊŒ®?Ît??xnkà1›Ô›ÔÚ äŸA`ã×0滬²tôŠ¡Œ»*!ÂFë¾ÈÕÁ(»L lô-eFf×Å -§,Éù¾Nª„8’sŽ±©U WSi—³¶,keõ%ï"‚×cQ:Á`c„†3p› Ò£ïט vv„_Y†)„A(@n`'7)$P²tJíòkÓp? ¨OÝï°¸>ózäö o"DXÓº3Êlª‘ûÁ†êÙKß±6ÎÀš9ŒÌ9‘ 寧«Ÿ#Áâw©üljœ]rlXÀfñêjéÙÖ ˆ¹œqwLLCÖŽ¯ËAŒÍƒ•è­0|¦·Ý¢fZ/Ç -qH {ÃŽÆ¡I<Ü“QvÏÍ ‚TD†¶ßûu|s˜ÙöoÜœ¼ •ÁáÊË—1™­.·óüe|î÷œzzEÝ³Ý U1d•1°Æ½™Ä<‚Ǩ‹Ç/œapbÑþ?íÌ÷?à3ÎÙdds_ël_ûÎÞ;33gwÈæì’³ÇÙ„ì2Î(ópvÄÙ+ -eËè2R¼ÄûÛûyŸ?à ·Cžtж‰ä€¢rªØt°W¨ÂÃ^Ã>\\hŠþ…¸­£éÝ ÓùÞ©e‚ & -ŒÙí?ÄSËÜ·7 ¦Mwv½ r#aCp ÑÁ¤»Ê«Z²â™×?åYó›j‚foM¤Ž¾ïhWò÷%Ñq.4ƒ5ÍÞóŒ®:žªFï€uI|Òxóstóår}¤‘(º…íOëËD›ïö0C³Xò™Ï­mtý#¿#/OÙÉU5ƒ|¦ðžË%åOŸ8+‡!ðÕÈïÆÄ»Þpi¯ÏÊ*ÓK(’èÛ¾½ÙR„n9 ½i3Í“~i/]L‰ÙA•+®ƒ¬-ãÐúˆ¿”X£Ôëë"M3µ°hónf;ñˆYþÒ$qW½ÒG_¹jcR2š×»‹7¨Š}r ¼áègJ?%Lë9bBú<–ŽÌ&f·´È’Mµ½>ºç|lÙQs- -Ï7û1'»öoσAü¬¸²a«Í¡K-é¢äþ{." xÊDï ùÐæI~˹G=Ö±?‚§>Èyüñ°“NÐ%îIß×µ¿è4É^)Oïä¥ç¾®ÁÉ’F°³¥1ŽžzÓ€SÚóJîi¸g_ ~`ñ›1E!ûŽ±Ö]Óhcotí¿AàçUpö„ß*&"-š{~gò&ú{ …rO]ÉOœ…È”[‰„î£-•;J×VAЊü$JJX&Ê×"é 5 -¼ØñÆV¼_±  ’™c€AÆ -€~g´¦™L#ZeöܬðrFVU -¨ì¿öžÓpÇ£†äH¶Õ2Señϵt(å¶õOÖt†Ò[ \„¢73}ñƒça-ø{û9…Ô8‚Ãõa8K<ªä-™£UÍZˆjzìɲ¦Omuã–‹ -|BÖÝB|kæZÄ@ºÛt7B5úÿü¥/Òµ׃1šòò‚Æû±®¸—ÜQZÖ¿S^©Àþz?§â7*¬UÌ‘Ž´Á9a¸|ø2DyúQZg‰?D[á4m|‚B–*õ¹÷kîìDRºÚ0„¾ýç–É­wó~ýØÒPÇü>? -»ë~÷aœ¿nïOÝp}ê#Æ)f’’¦„?BË`„ú ~R(hà'Ùç¾óì ØÉ»žOÛšù.»ûe<™“1êÌÇÒïÒÂfÔÕóÏ“¤òÞ!°(íTLÈÃÖ¥råúDÌ|–ÐÅ8Gä|}¥|è+ÏTPDpƒˆíJN5ª,»sa}èàÝ!/ÿhEî:±‰–ÂÖuL¥èmzÍŒÈ%áØß+pJ^‚…®Ù†V§óÕ7ƒ° 3¡‘ áâ9zU¯Ì…‰ò;é–Ÿ·(Nâ°­|&=×ÝÉEr4GîÇ4ê˽/Vñùén :,'劘ʕc(x^µ@$ÛL‰†¸æVìP¤ýÄJÍÏD{¤>pV$QJ¬©ô=˜Ð9 Úp€Õâ«ùD¤å0ù_‡b>éRêVtÃÖ ÄMd~„Ýl{‚òsÉÞ! 5õµPÓÎ!ÓêÕ±·ÍˆoÅï$ø4÷µ£e!Ó†R©û,ÞΦbŽ†lŠ\›»ÆÈì\Ùú$Rk=›‹Tö° -Úð­,6äX€qÐ-}nJ®k^¨£ô@l€¼ÜI>Œ˜×TqÅOшتxín°úâ…õµ4JÌäÅV kw¨Š‘þI’€¥¤\°^0Vò˘íep«%"h* ê mQôB±Ýë“ÙÏXšEÿ¶Éµú0üöA•ÚªÏPbÑËöê6EL7‹:Æ6ÒpÑÁå»ý%Tñ4w bBY6Kn8¢slG›‡œ .ôˆdŸ*‹îí¡ï8‚ìu)+¸"xJmKM Û /û’oË3ÌkŒÐ‘ÜãƒÛ’ÍËïÌk‡;/°¿‚ë’àU¿n¦NÔí]…6sÍ£¹ÛÉi<9s„pÓ4ìЛ•E÷³¡{¨Î¸›Ñ(@£ìª–8¥C©·g{foU>Ñ™vù¨µ«IÈÜÞPœU›K)ʶZQýmk ·çƒe~cs3˨Œ°2è£ßÕ ¾ÄùNs´Añ,ù¡H¾…¼ÀÅt••å;: -œ•F“þ/Eň¢M—íîÒX =r‡K—+hö¦­y¢–éx>39+¥¸®¯k"½…Çl÷ÀJí„MÚÜ8ÁYËÜ&F¶”´Ñnýó'¶±_t¯…´²ÅÕÛ¥ ¼”žŸö8Gojü=ã6ÀçÞ}IP†C?äy¹l÷×MÜ 8ºSJ§Y´%$<-ãw¼S9ðJU&t ŽÞ[™#ÅÀ½5‘µc§O&QNðoMÂM/ …Ìþæ2¼`ÕE”n¼]QàѨPØÅA9TM;x¸á•3O‰­X»ãÞä»ÎúF_s„"oêoì9‘ö-Z%×/ÌÓÀ¨LÒ¬ŽÇçDrU‡¿ ¶Ï­š6ÞxÓÂï¯Å÷†½®w~¿Î~ÁX0nïýe´Ý&¤„’Wm»Š)Ôšë2ÒÄ`ÇŸ­B¢ž}dMÞ xì)㟂ñU‘dIÂçÍ Ê>`O‹5ö7ÕKõ 5ñŽ£ÓÔ‹Á}äIZ-™óDZ´[ŠkA,è3úI—ãq­«E2·:±AÚJÇ‚p9lrEèp¢V —2JÙçï£)m×·ÇѾ&\!H !Wuy§|õ ¸ýkI±3ÓËôì ünŠÐŠµ¼J§UÇ‘º;Ë÷Û\»#QÆ>‰E¼ßå îÜôÕ7;w“«)½VM.òHfÜ7$fÒzVÒþ ®:ëÍ©Û"Ä%yF#u»¶b1:î£Î¦Ð¦ºwI§âtß±.bïö:Áô|š·!/ä‘×…lEŒ];\PâéƒÀJ-†ùfï\gX?ÚÝbÊâ¼q#°È™JZcvr›”)\MUŠÿ½žØ«R#óÞ*{OÙ¥òó£SØÊ3«uS¥Ò+¦Ë?:ô$±ó4£º‹Õ±™o °Î³d q‰ÿ|¡âWV¬I¾ßxo¦Ì=ˆ4Šž%,²——Tí–]x-«GU}¡:¼@šëäãÕô´:+VfÀiIÆx†‡Ë2Ë–„\ü_¢øð?¸ùº»Áý\}(þGªßendstream +ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î §©%£®IóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õ߶Fö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPߧ;X`®ž¨üH\ +üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ +쿵$ œÉ„®'~»¦ìw 󬵮¦~íCÊ]™Qê,©wmÚ'c¤ w®Diµs$óÐY–1¾—f‡ÙÄ&>.jüäë賬9“5ÎÕu¨ÍÄV¤?m=Á8ib/4l¼˜’lºÖ’Ÿ$):Srïð¹ŒtéÇ#/sƒydŠü¡ _•vÏÐX¢ÖÙ"» ú”4Ú]Ô†Üf†·”-FêÕˆFG‚„ùs!kt> +j8+¼="HOló‰à|V”LôIŽÅ_y·1A‘T5dSoEy%|Dm3N†Á‡P¥{ú¼ÞÆÙˆ +šÔ0ã#¢DËFwˆ(¤ ÙÓ§~¾f%ž©Y·˜"<Ø™Él¶‹Ç¹ÿúä2Ý©²HˆîKöÿ¢Õê’2|Cu˜Äï4‡ÙbIYY`AýÝ«!ðc* w¡)óÊ~#†!åÌDŠ¹p¼šÖ™(bðÆ%łߪÇ4òsœ.劎^Ëú0ª†'> +dÇ$[ß4˜h3iï*#§†]Y·6_¡$l¥—\5Š´ +ÖƒGÒgÏt7êz \ÄØSÂèÑÝá Kz¬Å~»šF£¦s>y{­)ÕCóaÑýû²Ú7× Ý#ÓF¾o¯Q2v3äòÔן¼xÒ¾#x9s¬(ÃÇÊÒ÷öUX7Žqb‘ŠŒHö;QºÙö³ˆÊëí:²5p,sÍŠ˜VÚÜýXQý3j .jWô…¼¬[Ç2#oîä2’«²6¢£yé0O ÙÓËø8³)Kz¡l„ïzä^骟|‚gOH)àY îó¸¢e¾,Ùê›Ì,ðŒ‚þ²Êsźy&Ê⥄ñϤì*“@bKiyäúk@WÁ»¾/ÿë÷îÆ5 Ï##êáù@¹‡ŽRƒ;ÇË6ÈV|¶å9{<)¼ç QU+ó؉¬@"9ãå·¾9Ì-–†Æ¬»î³ØŽÈ³¼…„e†t Y.ž±áWËÔÀ;žš¹„PfÙWÐBNûŠX÷a|nÓd5ÕR©¡Ûo÷¿]fǧ_$¿å0[^ž‚IpƒVzrEÄsÜó^Á¤ÑÏJó„½Ë®Ïô—qŠž€3«Çþt¿ipôøɼïÆ/ÑøµÑ7d™§©M’°{<1†/ß{€"Ãg'”Dnnë«J0 VkÜ„},j6ä²6”ª ’nå'Ž`gâ[ö +õ Ò””d³3þˆA*ú<ì;»ãçëȈÏÞr‘U¦Ξƒ ¸R64yEIÝ#ب[@“4ÂS»Ð¯«±÷è(pÖg/ä/ÄX»ÐÖ@­Å»b¾äcŠÅIî n¿¿„îçç3Ã"çU=^ó»\XºwV¯”¡ûB:Ï‘ +[—ÒØ$ ´zEø}:µ`s(éHô‚Å+X—³÷¶*5Â^ÁmøÆÊ$¶ïÉéGH +>êò:Û†ç-àñwN‰ +3“7º]Ç }"}xt¿-i7Ÿè¹½‚• +üƉ¾ÏÑüІž@S&_#‰= ]Œ% ešPŠ†¼RŽ”oQÈJt{¸œñàº0ê8&ò½A"zXXª‰„^i$º@õÁh0škm}…“u­@îK/²OÊ\®zOóu#«"ùÈR.¯AÇ„ŠòÙôÐJ©4I°muþ`*?섨0­V2×~„/ŽZ.&òÂ×Ñ_ݼÇa)¼<¯l ‹¤ab˜wK¿ð[p…*¿–ªì˜F°_z¡>ôÿ-p¾þmQÌHtðFЇt½® ·Ð[Cr:Îæ'w|…ôSoñ;ÕdȇkM*a1eˆƒS¢ß%!¹J-¢¤tXäÖ’´–šBÎuÞ/ +p‡÷/ó¢nD(0ÂDã ,q®R5Î@¨)µŠ ö|÷ò¤ºÛ\{=÷5¯ãƒ8zB uyÚ£e4O랊u¼z.©2Êqi¼ûTœ°,³Õ¸¼[¡~o$n{Ìq³¦×·1åŠ|…²Ï!§-4`f‘ך¹ïPÛ¹Ui«í!3ÏpN"LnR‰ôAQ“!ÄùðíSÆŽËî1ÕÔ9PƒoHT7-÷dâz7/ÉÐ÷3¯vU~2‰áW3Ýk"XŸ&¾L;Ï´Ö¾s°˜9¿O'`u?‹¶Ôi„ØCBs®Q‘ô±…ñ"¯Ïæ˜L#ÈÝœÿì UüÒ¹ùeŸáS©Ù_§Ó¢ªîÑ _e(ò~ ¾áÚÈÙ¼ßÕt2ƒÄI]Õ× Éuûͺ›WV>{€º^7¬K·ƒ9@3¤uÜq¿¯ØŒM(ÕAfW$ùÑ>Ž¢róÕõ'Üt*®IkÒæ·&„óÎãÔ£yù„2¦§äº VБÇ/êÀp4¹‡èT›ïwnÚuŠêæÔgW«È$&¥é®&tÏ„ZgqÙÇCȇŒ† ßðéårüc­ŽMÔEÇ×çÔkâÓåLÁG1‹^­?z&É ¢2™"«….^R,• ÀÜ ndAU]l$þôº<¤q Já9 [Rèç+œ„$E˜b…†F΂dù#ÕÒéËYûV·"r†Š}cà’³$#QZ0 ãû‡H„f¡ª÷›v«±*øöç9ꞧÇ)$¥!€4%J)Æ«B¡(kèè^«£ Œ¢K"ôŒÖIQ§.¾É°UDBó€â¼HÛHzõV¢’éç5柑&xã>fé.j/O§Î5$8žÔÎÅ òíÊ°¿_ëqv–'´#zÑÚfs +[Õ%:P+t¦*5Gil@ÐvmY‘ ‚œÁ‰~¦S JÖjn5£ë—ðys¬Ø0ÒÉð¹¼tOC»¯‰æ÷­™ÄiÐDX¯ÐåpÖïÆÎl¶TS†ffe2·©iB>²ˆÜKmV3 ·ï¬I‰Àq>ü€~y ±z‘ô&VQ|!æ 쨯tàZ…)"¡ ?ëzÁ4%vïù2<€ºµ—ÊŠ¶ÍìA 6hä挑ÿ>„ŒÔxZÜ5&R'!Ö§•gÜ…«¢ú½s’+ÔCÐ[ØÄx›)½ºo +Ù¿®;ªôŠD™r]9@èšÌˆ“ÖS|æ[Û, ('|f¤~}Ã!Ónëw¦©®n”Š\8ÖgK½Uz:'=*"Ô›%FWHO´­Ú³ÒèÒõÖDÐ_|ÌÎ\ê\Û +qá‚ú a¾ýGŸºî“•e +™âîÑ~)Ü“U‚™$¹ß“ñA=‡C“ü‘:³œW•Pv Æû§hbÖ¼ð»AàlmoÎUÁùË7…¹í \~3È +ÂÏå±äÑs‰TNŸ +Ã<ˆ•9O¶¥fÈËDˆF§‹ÑÉöY廙l›¸·°6¿33ïáð\1ôb° a÷ Á{ó|³m«é*Ê›}½"é?Yš,µÔ¹‹ e§úPh‹ŽŸXEô¸º\©çÜ[ëgøV3C^à ±çSø¥$š ƒÛáÃ:“É»®’´ ð¾ˆïÅ^ƒÑÁ´‹¶ù´ë¬†)à!jáìKøGR~ŽCkCœùŒBΔí!$ÐdÕˆV`¨­\ ©n¿»Gó§æHðnê Úïvœ&ëÌŠ":—íÞÕ^"Æ;bÊz³N¾0UÅÕ–ûÖ1ÃÁ,Ծ㢫|7ßoV};º:Mý³éØc£ôÂà¤=™MhüCÔgaì‘7¨²Âˆ±b®5_¡·¸/ H:L« >r>Õ²"™y£6o„Aù±RQ ¼“_;N\¾L©µá%7¸àÀ‘¾g$µc [ž Ü80›=~Øü.¥T¿†ñ¥™^šW`/ž$8¢%S>ô”æý XÞ$'ñ.ά¡¥„2Éÿoƒã;At«!Äò‚´žÖ&\Åžã™dn£˜kjÓ¥³< -YRç˜oiæUìÚÆ‘ÌY Kî%?ê5TXrz¶ë[È/¨£=gU0‰Ü„€UShW´1ûºzcw™>ÔXê1§†S\»²3Š‘ÎBaʉ@,ŒëÂ?/ßu3u¤ð;…®MXÛ;Í0¾z“ƒE9–T¨ÕÖ[x,ÐÏsô1Æ÷Ìó–Q£×©VNcÌ…ËrÖs,¨ ³“eeµ‚l€N0j—;î~÷–ê2›ZoºäÆ JR¸¬ Ý.nìÿ¦ÏR(šF½qqIéì{7¸–lƒ%Jåíi6.’±ñNJ„µ­~d¢Jă÷^Oß«Ñ É s!¨kgw%¼¤ó_†©ë +??zÜ…¤Ÿ'PìE¶e6¹-Vƒú£ò>áÂPe†–½Í•Gèf5©{AuÔ¦JÑø^V¡ÌP +:Ù‰4GÌCe*Z­:?ß"íÖŠS$`ë¾*~=QîFf†£¾d5 ?Užaú9v¢÷"“T!KÈ õð;[ùÛCµÛ²Ñä$|É•ÿ#]±·,ÄgåÂc>t- ƒôÏ/c!Ö’&,î—AØ$l‹ˆ4`¿Ì™é„G ‘9h{±I K­àôáî·3ÂF£Ýйô±Peûw + 8ø=ÇC¦ñÙ"ê®ÒL¨ì:0%»¸vÕ´HƒŒ?˜ø¾âù¢õ3™VF _?Òí)Û÷³qoTŒ²>ô£‚ùvî[±~á+Ó ñ¢øøhÂ…ª>çV©Ã{‰iÜÁɾ,ÓPhF°1J4‘÷Ò.’×l"üˆæ ¿D9TäÝ!°hjky~ÒHTòövd@X|A¼ —Õò/²áxxûfÙ z¸|ÁV§Om×¾SD*gi[‹4i p¯—ðƒ½ÐØv )ilPcΙŒ€~9¤Í^-P>½•Sø¢ªÖ_Ñ:v}¼ú‰ ø9#}hçp‘à;‡¾¢~¶&í@»Âªž$ûòYéØsE6ýPÈ¿Dpñˆò϶J úy·#“Ø'PG ‡ãŒY9ÇçzÖïIE ç©_¿+Pììk.Âî+çpnT+ ±µÇ1*#Xd4-.¹.f(܌̠n{Sš©|ãPtw90¿Ì§­ã=tÜr•xÿ’Yñ©Õa…@.i¾™?#E¬4*872lºGÝ›ü”òóÕƒ¹óšAúa§¢+lµh ›¹cÿ[ÅU‚·_Q'ï–íMÇ7&U6æØ‹{tÍ3_ŸÔ_óerˆ$q¿E½â>$zr,¾.ÄBËëDÒ‰ú@û‡ÍDü”Ä­wPL+w1xàKDTjã_žKU÷‡Š¿÷ðN€úè±=©C; ]‹‰ØÑ\z©r¸úÕ~ÈK*¼Æf:²}䥳ý]°¤Bu›B<+2¦ø¥Ø×Iÿ§½²¿S©ôûü¨·zM­<ƒïˆn1•ùu›Ó÷^Vú#:.æ?¿yÙž®ïµá§ðƒ£|`q^ Iš©åâ:kÓãZFMd§Í‡ˆ¨><…÷Å4I)'16TØ͆Nß°`‹ð` [€r óz‡ÅÜl8±§ ’¹Ll[@Æh_ëí; Hk¢ÉjLÁf'‘Ö%З&så@µTýb[Ojöß 0®šm-Z‡µ<"ÂVç­wSp#H¸Í°ÿ,3L\g*±Ý¾–Ýçpg¡’^uІªH%a€ÃuQlàÎZK‡B£vHÕqe·lAW`¬úÑ–îxüFÁŽ¸“Õ7º¼Î IhB($y{³ÓËòMSô~¥ã # Z|Ѻ6Æ×c>ÁB’Y”ï‚*¤ÓµEkèið„ûܲ²ê6ë#¥ÊxNÛµqqŠ®k%:ЂÃÏý0{Â4Û¤8¿ŸJØTá‡ð~UâjçµDg,Vå|ÌÙ)îmÛ ÁÎ n$;ùâßÎWûË)6{ô2÷Å1§ßÿ2_Q.4ÓZxWG)ûqŠ·óGŠõ{RÜh¯ºÎW¦ãrzÞõÈÐKËDä]Üw¹Qöº¯G…\å# n—ë{aæÆŸð»Â¯U"¨k;`aEw}øŽ¦¢´Äætf µŒu &ßéæsÜk¶Qk¥pxNšnL’v’Ô(|)²FðcˆÇY£0c…‚Ø0cX{Ò}hƒ¸eÐúƒKŸ:†ohÁhdYÔ}îw¼Vj¾]½¹cû¦wní†PžQY@V)[7ôU5:Ò³ûÑ 7k"%W¥v3<ú[j¬ån–E¿kƒœm»ŠìŸ×—´[™Ý%I¤@DZrbÑll¯azQ?ÍüŽÂævFúµg. P³e†¼x€ÉôHý‚€#j(hôÄEÕÑ7z,œB-»§óÎ…5E«›}~i›“;e€b9i«À9úHðêùÚ§7~ Êã>OöᙯµÒ+7¿Ë„8Xu@HáÐG§6¤'Q{—ªß/R2§o´D^ÒEœ (¸ü,¯TcÏ©ÆìȽã‚Z]iÚXçKâ Ó«¦ŒÜ„Y¼ý}ÉkwïPï <{.ÏÓ™O .õÔ‚Äñ|Ÿoh£‹êÙÕ†4ü&Æ ÊÌŸ¢RÚ±¡™Hõš‰ wó½é2)B­…‹·†ª"Ú7cHЭŽ8º̧\tøºlg%Ijð«]R˼a\nÝ8†÷¿ú³à!V#RÎ96áw¥1K©DŠŒ?VäÃÍBD\w.UȇH·:Êæ·7Ä­‰ö‘gBrny)A½Á4k1H´?ëÉà$œNŲ!ÉZS†^0yVÖldlƒËä~~;Þ¿g;¡Ð\ÚaæôK¾L‚ùõÛÛ“½O’l»,© ¿™[§ +¢ðBîBZYø ¡QÚ÷¥Ä:_}ÒbeÚ*r³9ò”¯Ô¿åÏ{ݘéËáªÝ]1÷WšeÂ…5âo#”‰Nb… ¨ô>¶ïÓAÎì·¼žíÉzàá]M¸Q»„)ˆ'°&má"²‡8øg+Gž‹-¯ðJÁÙ¶(!‚d%šò÷F¨é’‹Íü0ÓK^žŒð §.Úf9Õºi"‚Bœ‘תÂh‚0æ£Þ·/Dž¿V™¹6j©Û̇‡o— +_0ß9ø™Ü®Á³@3&i ¯)BBD‚Òr8ª¯sÿ’¶þø¶6ù5EåÇÁ‡›3§ŸÒûišI©R«‹ª]S¯Ðeÿzý!KþãÑÑÛ7çÙ96@:áO´ˆE(Q`¡W¡ÐêgÉCIචœ7·@ªÁ×N~ðOÎÏL ÔšîÑ„6t>æ€ñtFt&QòŒõk©ú¡Ì: ZBw˜0.•Ö +X˜DöBà矉uƒRá±êëŒãù³"‹‡»½øS,VëUgÈÓÑ×Hë‡ Ö•Ø®ôh3ßõ½@gYa°«¯ÃK}\)ÚÖ„èoô}7dÔ{Â+ä’רþ‘ǟúiæpC8[bk%u‘I0: ]¯úíŽI*]¬NꌕԲî<'âÌ€Dq¥1öYßþù4ˆù;4Ù´Ô˜¥^ðžöE›:ãZ”¢‡ÖãßhSÁÒ"”‘æeGq ¿¸ú‚Ò®ˆ÷ñ"‰v=}ç¾ÌÅ%ű;>RÕw´ºÊuú)DãPèñåVÂ-{ i¢87£rC ~zIu(a=/åÓ`éÇ +`JVæ€ÝM?Ë-*\šFì\q¬w÷4³Ç"Ây'LÜi æI²úвTxÝCxEåÇ7#Í=䬯šÐ]ÏÂ)9™šj^wpŸiuØ•°I/9c½šÙ;ˆ†YÂV%íÇ’:ðgEFÙÒ·O(–qS”•=ŽM.A¥ó¾5Æ·ôŸ·¸PF×/ *ÝXåï·Dê,oö°`ÐO„&ÄÓú1¢ç)ã”au§4‚x­¦"ô£šVKnþ?af¿½ðÒâº-©Þ(äM×4jý€‘âª[ Âx06Ä–3± ÊbV®gG¬$¨ˆX”£þÙ]0ML]B@! !k“ö'9iH„%7ØdÇýý³ê«VÂiH€ð‹Lêõº «§ÜTÉMÓ´1=1TäöÅ¢ÕæûH&LÏ5« "ŒúÞ¶jªÏa1¾5e‘ׯŠ9³dfƒC|—fS}½Á¢^3²Ry€!©ìcÊ^Ù±•CyÞ>æäŸGY›µöLˆ²Í+ðüw…¯‰‡›]E™†ÏIœº#½Á”“W¿ig/€¶0@hçnlÊäª5Áç®ýF6PI¥pKˆÈKUëqßoÁÎJôƒED=§É*óS½PlBø±a` +^ñ2Ý9á4GÌMdHä:a,h&y að;!Ù$õÖaÖ8|Z2ÃdÞ‹J‰Óc—…6‘Ñ}Äu"åÈÄ7)õ)ÚÞ”L#mõ0n—Ü^žÇl¡~c[øïz¡AèÖЕ–êÍ™qùÐEm)PF½÷¢xŠÔ–ŒisØ€ç³D6 &œ<ÝÍYï’Úl¥ç¬œs·ÚCò£ypKWFsš£jƒ“ÃÉs ÈÚË~ +¸š4?æ·q|CÇÂ[9ËÞnÑŽ¯U…”kCWvܾOøHB ÔfGpÊñ¦Ú™uw"£Û¬‘M+<ÂREÍœËâ`Ôщ) SßêÓk3—ÌŒÊy‰m:ãs‚êf“Bܲþà ĨÙþ†¨4ÃJ´§ ¹=µ¬l%Ž»Wa*ÂÎK6#º=\{œ˜{áÒBz[òaey}1i%œ1ˆpÊeDNi±`à6^¥ +“V-Á …ê©>Zw>î^’:ðëÖ£,AÎó=a¼PP?N}“­8s3zxC4-áÙ'Ð@¢¯Äa0½ÌåŠ&vù& Ê«¹jÐ-OB;ó¹bîAl/­äÝÈ»÷ #o«²#yÁ?.¶Üè© ®Ï² +sf"7íȘ'z½½Aܬù;˜-Ø„º5½ŸPoö’RnÃã—§cÄ­d>­Õ‚ëmOévXš}Ý…["äC»Îµš Ú·ñfº ?jÊ…Šs$!ϧmAb÷yg‘Õ3–ã¾ú©Ÿ™ì‰YÊIÚÓjû[«Òaî ë—e·Ù{/ûÀjÂé‰õÙÊZXÀüì˜à äa.ð–Ïæ\àß›¶üؼ¾~ ê¶Éþ¶ü5öZ š‘X’oJQ˜iOÎãÅ[=Z)é!³»&ç–ÃîIëBå\Ý;»"B7›§ c)Œ—†Þa%ó‡ŸTÚÅLn_´´i·‘c•udg/U†Å=7 +BÎA>ȨÅt»î„ÞñMt7¡Š:»ùœ=2>ï((Ÿ!{GÅo’8DiåGÍlœ ÊãVÍÒUŒÖº‘jÜ”Õíë +ÞÐõ)δ¨ŠP=¥ŠúçÇ ºÚiÓNRŠÓ€„™m:ô¹¾@1??¡– ­”x!MÕT•ÛŸAsË•-&I˜·ö@ãݪƒêE!F_Õç5²î´ÛT² «ô±.è-ó°{m”´YÐßžëÈC&ÐöºoÕ¬ìêW5iø·Š ¹Ž–ðûï~dÏFœöN{uÍUg¿a`BFtCÙ¾VØ-¯Vâe*ï@ì @uòQµ ä8L°4§2Ir©¶Ð“†¤o§¿Ù §¥ëÁIÆtPÕ'ÆiÎâsëŽÉÇTЃF`Þ™0Úu­5hJ»½ Ù‡,KíÜкÔP¡f|éO7§Hf|dÑr^kç Žß¼¥'@>¢íð@‘…„—Ä”ÄÄJÄÞ¿Ý>3„Œµ¬èZˆ›Ù¡R^XÚ9ÈÍjÕy0”Nš¯s„gA‚îWˆ™[Uú £™2õÞzבl‡KØ6`ñ +î†Å×°æËùß'™+¹O?àªH‡q@…ÑQœÙ–l.vk -3Ô+¸Gç Q@CX <¢â*î>Ö‰?7ëÝSY±ƒ°±÷a~ü¨=j ºíd„¾‚þÔ‘"Ød±ÊUU;•ÞÆrÝJéŒ$AøZ©uëÎñ³‰W´Bšgûû±wæp'Øbû5莵Ë#—½ë ¿É¥M!¹q¼V@«ßÂ=¼8жœÃñ!r1†À`^6]ÈÊü«o†c\'7 V;:šb˜€™Sì +…eȤ½øÛ ]Ûq};—¼¿ý%W[J¨÷¡¼–Þè aÁþ[Ò-@^ŸFðGH¿ ìÏÈÜ°<·eÕ@wô¨‰Îy«(‘«xd;{”«‰U¸otÁªDÕL +˜ªˆÍ|Îóp—aÜ^§9Lî÷‹¥¨`=1OþLˆq‡p–*ÃsqÇwŸÚOuØÝã-ôõ•)D©Û¹(ÕDIÅ,$¬ßÌ÷!›xŠt¾+’V‚Zä\õ‰ØÑk‡¥ vÜå# âiÑò2œK³ÈÖ–ª·K ?žfÁ_ ž`á—À§,‡h@cÄÏÙ›‰„œ#¦å[àŒ‘æÈÝŒ‘IágWà^2/Œýäoö9œóê¹ÜüŒða yƒ?wR"”S;¦ÇG^ˆø3ðÙ»¥%3œj˺Ø&B–#vàXÂÃÇpçŽ7†.arï«ö •íWÓ~ j¤gb‹]ª6ɵvô±A` Û·ŽîB s8<«ò齓O`«ç( &»Rð¼ÕSÐó–=Ãê‘1ßì¼Û#ûžB6&L`¦­k7èT™7„,uxæ}ëåÊ{!,¯&šª‚i»FB6˜3=…ÎÀùÞþì…æe£Qµ5'ØŒ™Þ+ò@3îàœ•öÝÔÙÏ£’â»Ûö_:`n?ãô`}ò4 T躉l¶}™=aC,I‚#«&‘Ü÷Ó_rlïyÅ–$S—‡—8•í–æ æý©ŠV7Wo¿ßγœ'“éžÁ©Z [ÆN«éaîÓó'¨5ˆé´ìiU÷ç+3=;– ov –ç 8\ õäñ›V†Ã4¼@jãÖ)ãì±Ü>ÒíªO+^xN¼s—]Ž»(¿ïi¥™¡ì §±,¡ÝèAÒãÍúŸŽVjóºb,ÇnåCæWä¾E ±k‘ +^ú”ãh@RÄfíÁ•6—U +×qóp&+yPå°1¦àÙÂ¥å Xˆ|¿ð$6Uç»’ÄŽ¸%¼ûm'v»!†æ^™íç Åä.°¥6q2Œ\õº«CÛ7E.ÄÔ—¨lwBÂæ8=÷_so09Fµtéf²ÅoÊRaáÜJýèb;†xŸ)ォG œþW¤ÈùQw¤ØØV„K˜7µºy$•o5MåÐà,=²æ_³4¥ñ3ž•÷°Ÿ +áB«¦¨Û$EZk°`ë¥Y 5qÁ[œù¥ëÂF… :ÁƒN„´®jîܨ€›JV[‘ +ü™±8Ébº¢¾9àѲœ&Â&9 h°¼§!`Z„ù“½M$¨'Ì é·Ç ˆ‰b|ö]·[EÍ\çtHL”.=MSeî{F"ä(ËfIÜ +ˆ4ƬÆx»ák&ªˆü• “KѡڪƎ5soõUKæU6Û‹m™³Ó<{WûFgsü2‘“+tëÑɇ¡ˆ§Ç—–Fë¹mù¨ö9¥ûŒí¬ ( Q«¿˜?©Fߧ$‹OÌr?ãZJŠM¿{m9ùœÄ1+É°‡!¨Ú‚§¨næòY:ŸAÈ‹Wv¿ ˜iq“~ˆRŠ:²«ª j½¤©Gc„ËZÐètúœùyF6¾K*Û[HzÒ§ib·I þhŠÕ‘¿tîÈøhbþàáDëÊ0Žñ/—Í• W L|õ)ä™Ê~¸Ã$|hæ¼)½ü'CZHsöfW^È¡µ „u™§™êÄð‰¼—9*ÙËŒÝÏO´Oý bDòÎ7Ž¶³B ­DÖD3]‰xécFb\“4“ï› O`É@®0{”X«V%Üq7j·6Ç„ŒìÏõ¼Âør¶µ¦§@Üt,«"2ðÏǹ.Š­Ý§ã7‹ø£¯šr°>C;–wD72Ð AvIlU&m¡•˜E4Ù(`ý[wZQ3‡Ùµoœ'é†zDŒdØ'ü#mø Ͻç[Ü#ñ™‰.i¡®îñϲzåª}:K-òÐm(¤²“™º>ÍÝ0«l7á¯r†Ûì%óÙSï)?ú±ãR™Â—wv“iQ— øð`gcÜabO©_7d@ Óq¿" ™%qtÍGJ߃Ù56榑û¶5ù|[!Ä”L{ü÷ß_é$£½—zø[HŠëNκü-ÅÉEn4«Ržú˜‹¨ç£”v”bRŒiº& åõ8æz Ü®ºˆA¨.Ó}:pc“%„9¶³C@Ã×vt|jâ0òFóðÛqò¨|jùŠƒÊá~·l–‡kàVÞ5-¯$Ý3ð`z—º¨Ùû…>F½IÜÝJ² ? =q/ ØîAÏb“~Xc„\9+&•óEµ‡w)³SOS>}Sl´;#5(î=:·qøO\ᦦDø3ÖF@rTôÙoÈ'É@'áÛ¨9o;=Ò«M!±ë{2‡JÕöhU5ŒGÊÇÅúÔr–Ùèjšíê–uÀ@Ætáóå•­qW3gPÚž‘õ§/-‰Óî¨~%ŒŽòû‘„¿Fãk Óü§:(™aÿýœßL +íqÃoØ8\"ÉÄø‰m~'8 £Éùª¤\"~Ķº…puX‚8R±·ù;¤‡,qÞ\;1´L AÈ›œ>lϴʘƒš¶ü¸\UÆækèK¬ôó(29÷ðJ3ôûõrï˜O²âåMçÑñBu”蓼!þ*²‰ñØx“–ãfðÔƒªáFb6ä([N£+þe÷#Ìó,+CðÇUÓ3Mcf‘ÐAñn0Ja¸Þ.H”#ÓJ>U³ÂåbFµîV?4™;> +Û Ì_÷cvDMÄȺ„‘)˜3,fÅ·„@sž?X³¡˜ò\ªå$@Š$ÈW;ö=W!za(NGv È(èᇓÃY†CõdQ1”On?S9Ç>Oµ +dõ›#. +óÕu«ðaxÍ'¢T´Æ49¿} +„¹ƒ°yeàêÙÔSYãæœjî×]…)Å’ÀY¡vSWòÀ­¢ÒGÕîUê£ ãþh4× ¯DTÚè¢Ë ¾ŠŒ}dœœ'.ßñ»c)sùÂ4E©”€cr'L’q!2XdêFÒ±!NMi€âñ¢ÂdÖ |H—^ÉuÞõ“ù¦?aÈísNfBèÈ(û;Ÿ>§[Q-„- ï$àKor§ËûI’;G¸],˜úJâAžXÚ€àvÞ9g•0žh}[ü £Å‹—T€%/WHþî×Dªÿ~Å!¬„ŒµWJQ;dZUüÁˆo 7êU ‰iT†dGà!y×"?αLÛuº·Ô~¡šŒ{U#[Ö÷g_SÚ®s·ßñs=„Ñý}Ž´þ^W@ƒ¨IÙ9¼£ýè@‡}Ó$0_>)’¤Èz®Ep,—ðóõ覲üˆì£å"è`06déðµÃ•GѶ`DÅÄÑrß‹èGÃõ¶F´(øLIÓÓ2¨ÄhŒÑ¢syçw-[ý $SŠQévÂÙG0p•|õL ŸûŒM:2ßx¶åÊ®I÷ëžvH…¶ß]„,U5‰eÅæ°LX*º{Œ+—LÊjŸO}«nU²9¸ç\wýÓ/~cÝS4ƒRꩱT.&êò³Í66USQ–‘*·R°l"È÷è;/Z÷«ÁB5OmùǤA– +ÈïQš4Zl’€AÍMNÒ1B.NèL·YÏ¥£ÌÊ©“0d›±)š„¢«ëOØF'Í<I('Ó.DÁ=Œ”³‡pEd­ùØøõmQÜÛÓJ:ëÔs††¥[H3h™7Â6uaÂÈ4UgÊh {V†k|–¶ žd£å4A:kY’(‰®rŒ“JY55b¢L ï¾íV·œ2kÙzÙÛÌ9éúŒðlâÞõa÷xSkðJ–†µä{Út´çŽ[9¦3ñÇk4OÂK8­Ÿçå Û°¨oS3æÈàQÌà~i–¯³•úc"uË-ëe0¶Áÿ6µ¡ÉÞ†ÚÄÜøÊUƒÆï¼à쌪2ئ„T(™˜ž‚è ¡)ÙqìÔn»Fñ±Aò¼Œ +~z#ë6 å˜Mmné©^«ŠÒŽ†y§×ù{?¤¾ó ÃN[„!H-Èâ–‘Ôyúê³Ból«nsªYòU4Mö¤ ©0lÕÜ´~µÇê½æ`¾ü™ñd™ÿÍ%ºŒ(„ïñÃpY0çh^zÑl™dɄ˱½ú¸çðG0Q'[9R3…m4cA¸Ôá÷¹öîY+x‡}Ê)¹ÕV¹„çþìm‚›sÞi +chô„, 3 ‹ ï‘“#•ÃùG ÖÑŠ9$5à »l|ëQλM}ž¥’>‚ÈÔ!¦}™n¿°B=…_½' qŠ=ò¼²D½JQ:|4ù "V&71¢‡»Ê´XGŽÌ˜Û6¸XÉLjðD^«Pìˆ,0ª°>«ÇŒzK „Uê• Á;ð# zJí™ÛG ÃLtåk ­' , 2ýòô™ÏªÍÑk|Õ[~>'}A–ž­h¦M$™O¤{É™™aý|Fo¾á¦›\basmç­‚‹ÝjM߃½€—RÚ·Ž¤`W 5YC¶]Þœ}ËA… IñFÝi„—¤>4Å1 <ÏÜïQ»ÔäJ!¼@ïµ/g”ÆL…˦Xx2¹Z‰—L¤xó¨jZ‹¿•…< ËÍ(癵uèKvÝ%' ¹ä†¡&$XôÕÝevþŒÂ…--kZ"»À¤Kõ.C!5—ÔÖ² NɆ ÅŸ;DrR,çÖ‚ŒQŸ¥Hâ-A(wYœÐ% + ±(ø'E5 Í0Á{'­WÈÐÐlûù 4·Oÿæþk¨ÕÏÙ€œ“æ¬)Tlý¼SM¢ÌºtÙö:ʇOI[|¹,™á +¸} ³i¼<nU·ƒÊ'D†7Òz;%s}S°l<•’y°46Ê–TZ¹eÛ]DÕ\Y¹ñ}˜en|(xèn)<¸ËŒ¢G/Çê‚«þf$'„ƒ":èuë ìðx/’<€Â?‰CòSÁ064qcZŒz¸ÙÝü\! ;‰^ ¼·'PZÖ‰EvdŒ¢bòjGYþ=Ñh/«¹È´®ŸË $8éÈ'kê¼²à +%gsðùB§*÷Ä•TÝþô¶VÔ½~Þgÿ°s-Ãê¾ù¤‡I3ôÀâʨbŠÅ4ZŨǾdzçÏ—à Áç‰÷ø׳ŠX]"ïe‰¥?ÂÛjš…<®ÛsÒfÔAgV+¢ÔŸ8ýdÚ¥_ÜÌl:ɶ™q +L! … a¥,C-CŒ}M¾~šÞƒÔCzâë—ò '|;¦DÜ‹ Ž‹¼”ýû·NsŠŠô c‹Ð9T#qY%%ËGð 0Ù¥*÷f’® +.³ã׋ÏLH]DÒ.½Å¦œÈçûNcxï*ÿÍRŒõjHGmwr$Æ›~üzXÉõ½c7G9±fRpÂÔ›õñ`ç¾/ŽFöøÍ¡Sësöe‘Ä¡ûůjrv±K ±‚º‹—li¬@b Á̧òÓµ¬FÁ§”L¡s¾´_úm\9G›8+¥£XmK‰^γ³æ&„m©œtðÞì]ª_l„Š@O3º] q—ÃX;Ü3œåá› +kƒãåxÄüÁ‡¹C ¥"QPf¦CY_vŠÓÑô|‚ŸŽîdœîÃ: eФÛw‘éûe« VÑê–†P-o‰ ã¶*‚½—€:GçMøŸ¥ÀOr¿/CîlMk[6qÉŠP·eÙ0ÿ¸•Ëzý?TRÈõó·—Ï(ªå8“j$27BjߺÌèÖ–õ¦òãȹÿäâÌ-:N ^TüÚO`bŒvï ×o(<>yýeþðHó‚Tƒƒ2¸¹ÁíåÞ(å2Çæ¬9½³g¦F³Ù å’Ë?q…ÃNßJšPZØcš¹ÔiΑ88›ï…wäD&oô\<朕çÞ‡.'cve‰kÎþšØuôI¡]Èš‡þý+‡¨§Ä ~¸db D:{‹ÛÖq •¢j+˜ZÖ+·?ÜT±æ­ºŸÀÜÀ! +û:%é5¾¯åV¾çu™J°5Jòb´â"2jþä³àí=j¹ òüÅÍ·½OÖ±¼×Ñi¥Réqødoeל}½j(áIaRFT¼‡{°˜Të‰n°‹W÷'½y@,}H5»A¬8ÑLØÑ]ƒ5ævYÛÐD"ßïŽÊDʺ°z¡Ž »z}ð…ˆÇÄ_@ïO>s0<#gr¹ñ´»f!bºÛèÊ5ƒ¢Ã–x¦ÐJÚ./°A>x»! jm–²sÞ7vÁßC}AœíÁ÷}Žn4XìÅVÄés¡%›†¹¢{Pû< ´éÔ Ì7¹d±·ÝÖ.´?²s1‹t¯}¼;¯±Ý½’×Gû»{UÔ.!ó!T-ºž¸9Çݯ~_’*gûkèŽvª»¦$û¦ÝU‰ô¥5Sü¼‘i÷I´Ï(Ô_:$³^‹â»Ù…eÑ\ ¯eÈk#Ü¡ðï…Š íw¿ÆÚæ'È­ÏòãJk-Yc¿ö3A2ûW´ìßßUøäë/5^]ïèø×¢ òÁoÀ&ÇÀÍ/úŸNÜ&ÞÞè\:?Fîö…)«pÈ:RªB¹TŠP¶×ÒªA +¨ïÃÌ'l¿:¦ðè;{3¦Íäeµ—Ä;»¯McÕÒÚ-ÿXON´Â½²ùr0‘õC€ƒºÆ…L9ꉱSWËñÛÖþN2¼‹ÆvÃñ’ýÐ È*ö{ä•k^‡jogÊ"oØÊglÂóIüPÚ}tq(½Ÿ +QCm6õv;1w²ª‡Hk_Êx½xµ™\Q\5“`b?ÛÓE„ÝH¦æX­Ž…äš»^ÁqL]ÙPºÀ³A‚ä£h]hò(0ã»d68ýÀëÓQ/eÃ`Ü›i0ÐñXV£ξ0žzGïZUOdCZ4[J)é?°µDäé*}ï uÒÌ{QýÜÕ‚äÕ_x® +Ê’¸È˜”m€¿™»_–pÛD‹KÅ|iVWeeÀÀ«‰ „lÐÁôÿê4èT0Éëë]Ïd‹;PL¹£¥e!D*%)f­­Ð¾ì {ÄùíÐîòsÃÕ|0ŠLï-ûÈØÀªY‚èZ`ä<Üu´N!ìÆÂçaæ¨ÞôIJE OÕFÚØÙ‚™O¥ì鲟‹„œ*+aB5*êëˆYš0MŽŒ£>ÂãðSΚb¤³(=nìj‘·æÑ4W­ÁÂ-ÕÏ·­_ѱîíô‡Çº™·` î%âg›«ïW‘iІJmøª º¢Ô††ß‘$1½ÑØ“](snr…„L¹Rœ±¹UbµVfn3]ú‘ÛÀáˆÿ3È9ÆTÄk›“¯Bšž«µW¯ôoäˆ9u“lܲ‡vxvèô3Õ ÖÞlQ;, ÿ®w½ß,Öf9z ïï‹?ŽJ¬äl* +pË(ÑMÁ™ž eF×gº‡@‰<·5ð˜MêÍ jmòÏ °ñksŒ]VY:zÅPÆ]•a£¿u_d„‰ê`”]&6ú‚–2#³ëb…S–ä|_'UBÉ9ÇØÔ*+‹©´ËY[–µ²zŽ’w +Áë±(`°1BøÍéÑ÷kL»;B„/ˆ,à  G70“›(Y:¥ö +ùµi¸ŸÔ§îwX\Ÿy=rû„7"¬ˆiÝe6ÕÈý`Cõì¥oØ?g`ÍF朌‹ÀH‹†ò×ÓÕÏ‘`ñ» ‚ƒT~65Î.96,`³xõµôlë Ä\θ;&¦!kÇ×å ÆæÁJôV>ÓÛnQ3­‹c…8¤„½aGãÐ$îÉ(»çf†A*"CÛï}„:¾¹ Ìl{‹7nN^ÐÊ`„påƒå˘ÌV—Ûyþ2>÷{Ή =½"ž;ôl`¦GS=)ÅhhR:ê bÞ°ã}µ;íYÏHey~aN'¡¦o¦NQ»ð%`\ô?G°2™9×Á>ìSŠ¬7…¾»Ù6ò_qÛ§ÍȒΊŽ¤¦vغä.Ù#*Íõ¹²G-–à°Ã~3º½øÕNôdàÐH¬|ò€Ò>I6]ñs˜öüåÛ{ñ7cÌ a8d?‡ÉNV¦æWíûê^ÙŸ\W’é†;ˆwÒ`–v0zA…füA©‰õ§$=›Ò¥˜ÖÒGVöašMŒs*(±Ó8üì¹äô¶^d•àŒ1÷·»s®ÛCºDdq +I¢BŸîÙ¿¿²ÊXãÞLbÁcÔÅã‡Î0¸±hÿŸvæû +‡ðgl2²¹¯u¶¯}gï™™³;dsvÉÙãlBvg”y8;âì…²et)Þ?âýíý¼Ïð„Û!O:hÛDr@Q9Ul:Ø«Táa¯a ..4EÿBÜÖÑôŽŒn†éü +ïÔ2AÆìöâ©eîÛ›Ó¦;»ŠÞ¹‘°!¸„è`Ò]åU-YñÌëŸò¬ùM5ÁF³·&RGßw´+ùûè8šŒÁÈfïyFW OU£wÀº$¾¿@i¼ù9ºùr¹>ÒHÝÂö§õÆe¢Íw{˜¡Ù +,ùÌçÖ6ºþ‘ß‘—§ìä*ƒšA>SxÏå’ò§Oœ•Ãøjäwcâ]o¸‡´×ç?e•é%Iôm ßÞl)·œ?Þ4‹™æI¿´—.¦Äì Ê×AÖŒqh}Ä_J¬Qêõu‘¦ZX´y7³xÄ,i’¸«^飯\µ1) Ík„ÝÅ TÅ>¹Þðô3¥Ÿ¦õ1!}KGf³[ZdɦÚ^Ýs>¶ì¨¹…ç›ý˜“]û·çÁ ~V\Yƒ°ÕæÆÐ¥–tQrÿ=!ën¡¾5ó -b Ýmº¡ýŽþÒéÚŽëÁMyùAãýX W ÜKî(-ëß)¯Tà‰aß½ŸSñÖ*æHGÚàœ° \>|¢<ý(­³Ä¢­pš6>AÈ?!K•úÜû5wv")]mBßþsËäÖ»y¿ˆ~li¨c~Ÿ…Ýu¿û0Î_·÷§n¸>õã³@IIS¡å 0B}?)4ð“ìó ßùöìä]ϧmÍ|—Ýý2žÌÉuf ‹cHéwia3êêùçIRyïX”v*&äaëR¹r}"f>Kèbœ#òF¾¾R>ô•g*("¸AÄv%§U–ݹ°¾ tðî—´"wXÈD Kaë:¦Rô6½fFä’pìï8%/ÁB×lC«ÓùꉛAØ„‹ƒ™ÐȆpñ½ªWfÂDùtËÏÛƒ'qØV>“žÇëîä"9š#÷cõeŠÞ«øüt7–À“rELåÊ1<¯Z  ¡“gÌ^™7…fÖ¶†Î;xzÍ.—½°õ<µ@|˜¾÷º`ÜG¶ÁàÇ¡ÝQ‘ôÁö¥¿XmQ žh?ÝŠd„Zêภw–_ã÷ëÛ“ÌWsƒÚH ãØ´ðÕHPÎ#razoºÚ·¼§,ýÎ{=M¤LÅ;uD«&RVdz»Qò¿£Ài:ü:a‘Ѽr.<Ó!OÍÁãÏcL­ó*ó@ dbzâ2YÌóŒûäð<îº|¯t$âckÖvzÎÌfPW´ DSÄwÞqŸm¦DC\s+v¨ Ò~b¥æg¢=R8+’(%ÖTúL茜m8ÀjñÕ|"Òr˜ü¯C1Ÿt)u+ ºakPâ&2?Ân6ˆ=Aù¹ä?úZ¨içiõêØÛfÄ·âw|šûÚѲiC©ÔŒ€} +ogÓƒ1GC6E®Í]cdv®l}©µžÆÍE*û‚Xí øVr,À8è–>7%×5/ÔQz 6@^î$Æ +Ìkª¸â§hDlU¼v7X}ñÂúZ%fòb+†Î5ƒ;TÅHÿ$IÀÒR.X/+ùeÌö2¸Õ4•õ…6È(z¡ØîõÉìg,Í¢ÛäZ}~û JmÕg(±èe{u›"&Œ›Å?ci¸èàòÝþªxš» P1¡,›%7Ñ9¶£ÍCN„zD²O•EwŒöÐwAöº”\¼ ¥¶¥&†m—}É·åæ5FèHîñÁmÉæåwæµÃØ_ÁÆuIð*Š_7S§êö®B›¹æÑÜíä4žœ¹?B¸ivèÍÊ¢ûÙ‰Ð=ŠTgÜÍÎh QvUKœRŠ¡ÔÛ³=³·*ŸèÌ »ü ÔÚÕ$dno(Î*ˆÍ¥e[­¨þ¶5ÐÛóÁ2¿±¹™eTFXôÑïŽj_â|§Ç9Ú ÆxŽüP$ßB^àâG:ƒÊÊòÎJ£Iÿ—¢baDѦËvwi¬†¹Ã¥Ë•4{ÓÖÓ/mJûW2S‡êrÚS–V¸&•ˆàúZ(^S'2×ä‹’L3:5¨V}JC9ÜÖË”2Jî(>9c·aïj<Ü(ÎQC…6Ç­ X)sSl„öϲژÑ߬n +i¿5xÑ@>,Ïu> w?tiÓ¶0ûôIÏä#%(ù‰ö +©«ˆ|LO†D¨Å÷¦gîÑå¼Þ8vÉC÷I~®O–ÙÍ>mŒáõÞ¢‰‘}‚ +^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹ +Žµrð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg +‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq +oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿèß2endstream endobj -925 0 obj << +935 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 33 /LastChar 125 -/Widths 2102 0 R -/BaseFont /XFYNBR+NimbusMonL-Regu -/FontDescriptor 923 0 R +/Widths 2132 0 R +/BaseFont /MYZKVY+NimbusMonL-Regu +/FontDescriptor 933 0 R >> endobj -923 0 obj << +933 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /XFYNBR+NimbusMonL-Regu +/FontName /MYZKVY+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 924 0 R +/FontFile 934 0 R >> endobj -2102 0 obj +2132 0 obj [600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -884 0 obj << +894 0 obj << /Length1 1620 /Length2 20127 /Length3 532 -/Length 21036 -/Filter /FlateDecode ->> -stream -xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&ùïòbšŠtÿû½ú/?Å¿úƒTÝí€ÿ?‰†œÉ.þa±sx2°p2X™Ùÿ»¿›Åûÿñ_D,ÿµ–39Z¸´™™™Y¿ÿãó_+ÝÿF#nklgòÏŽQÚšüÝdÿiø6vvtü«í¿Îýߦÿcý¯íºÖWìŒyƒ,Ó2ÓAu¸¹#SbÚ},#Áö¥ªE~5v½¾ia»Ü•µÁŒM3<¿ÛÝ—Ïí?¥iÆúp¬©zS€×ùDÞ4ýè[_;9鎘ôJ‘Ó/4¢:2Ü{ ÝHH— OÉë…ü5ÒÏ!‡Pð‡Z…xUó«Óö”ê&BÏØ>ŸŸÙ‡PvE‘Ŧ—µ‚ÏÕàO͘ƒá†€l¬„ÔÈW"æþx²À £ŽïIx%Q¼Kâ¦No¿­ùWcwúŸò‚ßÄÎ׊ü;L§V‘;fT° £Ö.ãG¶íúÌÓÎõ=®>ÕÎ7èX¬JÌ[ÃZUýùbªÜîA+_®›xF»Íc¨À( ¥ã©ƒv¸\Å$L Ò…õ)_,Ò ¡Ã4ŒR4r-Ø“©¾ˆ3ø‚2Ž‰Œ€$¿ d-ô~“„}¼Dä9&G9?á¬;Ô6®£ÛB‘œ´Xsÿó/w†ßöèWŸ.S?649ú0|‘ßãš@΀ƒëì˜ç3¾>9È%æú!.à—¼Áô/mH‚Þ¹U'g7¬«T¨y㨒Cº4œÖ)7%Š_0iôGàìáä}²›„ ƒåÔ›xêÙÄ6\/ÓÁ¹Ô¢ÑCnoãÐ5-Ûu. ê24|jþb'U//g7~u®›œ÷äkƒÓ—8•†n¤3€j}_R:âàÎ>)[kÛAP++Ïú;iw9¶»¼ª½ ·c¸A{÷¿Y‰ü j¿3à aÉ»ðSr°Ñœ¨t2ýV å -o(:¨Ñ_‚ä¤ñOFuØI)Q’¬¥®‰Í:T\+kÀ2ñ´Ò(ÏË2+­Ô»Ð]é¾çAM¾×Q­?A"tto¯$ÏÊAœÇÛwÎB¼ã¢ü1lþUxq¨eÝÒäöt¼d"$ÀÇŒ‡™M ,tEÃ2g§ö“0ACª•ƒÇ“IyàbLżê|cÔd€&ó­Ðƒ}7ÆÐJVóJfŒ!`/—ö©Ä~iCB2l´–¼â¸¡Å·Û‘ÜÁøÈÆ - )/úh½0HéZ=`|K›@?ôî3Ob¨cËLádÍíìÉQûcz‹þú7¾cèü¹$ Æ>2Í%—¹ß°%F ->@í£dJî'¾T¨WÝ– ’ÆÑë«úþ®@Zl—,P* ï™7o6x©bäÀ×ZëíùOרc ‰^à°HY¹ê¶]¼„qGÝx- $v·úyüJŠÑ‹lüwÝ„ze|5lÇ¢‰Û&^^Y†¯d¤å¸=眫Ø'ZðþžQ.,°#p¯ü°Éøù¨~j‡|i¯ÖÍ_)¢é<-ëqHb_Ò»S3‚4~«Ò/²Jú -ó»kœAUyÑ® D‰ˆ„’"µpVk_í+t·—$ïÒBhtçß’¼`ª-‘C†Èù}îÒôƒ¡OQN¢¾hÉlÙ‚¦X©ÍÉÃÚ-ðÝ󜚮Ӳå‰f]D–„]fp`ÝLWý£ÄÄEäÑOT¢ÿ«0ûž†zܾòïþ׬M -‘ו‡ošDƒŒ ¾”¹yÙÚ<1Þö÷Š3 -9à Ù÷:Å„Ÿ\ÉFlý¹ŽNÁçµ±½F¥1¢{1I#ù#gÐM!Å&Ð!ùf¸¸<:â‘[Ç‚êÞ—dx²UÃü9‰Åm³{¦¨F®Aº/b›ƒÞŸ&ŽiÊù0ÆÊ<É{ –3Á—)t;¾ -I…ÆÄ8á J’«2ðÚÁF–û†t÷+àK‘D:rtËSα£³ÒFX°Y¿ƒw0¢ºãÎo‰Õ"Ú-P¼L>Vš˜ñפ2 Ynîë|CVÞZsZú Ó†x9„ĶU&bNž\@š'üýlNÔÞû1ãWÎèjöE¡¬¨ÿI1©~´Ç)¨¥P#çP&¦B5ãrEò¬é&ÜìPÿgÖ©‘ŽrÏ3ä5ë(h“‹£66q¨ JÄ·­ ï|à·Ë Ç#·û:[‘úìƒîi0žì­ÎÚoœ*3ö8¡|SgrJ_ˆ·¬»TáZ‡%{ÍbË„pøTþÃiK¢`È$Ñò-ž— r38‘nü9jNÒúzzç÷˜ °î¸×ÃÈm‚t ßk–ßnŒ.ƒjÅâGr Ÿ¶~Ýòz^o -g}%ž¿<ÿš¦¢§y>ÕdsŸZˆ—ŸäØt‘ùB<*Cuù­ Xò4RWJY¾?Ôse4¿¦öÁGGøË=1nI6ö>â¶dxøÛzÀÛö§úø÷^`K­™u ÒZ¹$gMÍÍE®Ý§R‰³› |~Π;âIךÚCXFçÔ[ "9Û\(:Ô/œê4Ùè´G÷b^LG9DyÈ‚6ú+ìÖ?óÍv_æÜ@Úz¬ºy4r ²ÕEëæfNfS\ý(„w!Ð+`'èìõö½Ãºk0Ê1pI?ص€ÝK?lÜT›åœ¼lîSè’›šæC`-ëJœª{K'éͺ¯ÊÕ Çƒ„¶õÄ&]_\ãN*Ž²ýÈ˜Í ¶q™â?tâ‹>Ú»ª¿[h]ØÎDi‹Ø?•ƒ] q‚ŒêH¿(OßM Þýa›kP …Ìùj†§lL_Iª3e#9_zÇ…q»¢«¾I¤DKi‹KÂ|Áô-ïì¾æãEP+ëÂû; KOã%; EýkêÂJþþ‰ò{¢M; -%Všy¯Žç½wd`õ\¥Sd˜4¬Å¥øïhj-Ó)¢1Ù¯tê…hE‘¼Æ’§@c]ŒQº,ÃÙPJ±Zõjæ¨u¯žYuÉÔÅ›òÊqzú‘Ÿc¸×µ#Gr<’çâØP|Â~Rq‚a?–Ôà?ÌÕ…¢ò-›ðå&•ZëCnŽ‹¨H鬄™NN~g’±ÜLwgz̹{Q\CÂàkîËãMN®-Ø\ÝmbdDÀ!pŒ,*-eG¾v²M×<Ÿ»)¦Õî°ÚQ ¬Ìô²Åc¬ÇáÓ7/ZÓÀ¥¢–ôæ!ùOInWþþXÞ€8ä„áU„4ƒÜ42ôgYzY,lsûtˈSòî’üZQ”²8 !Êó@¨`úžnLnï¬?'@‰R§³ÓÔcz’jýzçÑGD”ÖlþhkUé.ÁôÅ0…{)ÿûŒ<Ë) ÔCçÆŒ¿v—f6„øzÒ˜êïUì³^¯È€žžs<Œ¨+ (œ× -?>Lîw\_¼__º‚+úˆ—Ï*×5²,Üâ~‡ -ËGBÐ×4$<]q…x\6_ÌI_ϱȸtÓ<< ±ã[ôV(“K—ê£hAÑLÿžƒ«±î«k”“Á™-H¼~„ÈëRtàÆ;ê¬ԧОSŸ«,Ä>x›ºQmMΠà¸ÀöH|’MÇD-2:s»ÁK¾jÍ)yu$–©Ó:ž•([mq!+GŒ™SÞz‚PùÒ†ÞjLñpö«Ys%²Ý¶p¬z.M[›t]Þ§ÀŽKxÀKPų½×ÕêL•ªçLý=à'd{ì-¥?Ö­#†‚­¢E^+#6#– ñ/–“õ­ñ¼ÍTñÖ<ínÀZ‰/”Ú8Y2ÓØ/gÓAÓ›øæ±,dx -v]šÑØ}a(ôÉ:eÝX!±«AÏ[–Ž×ÊÜ’ÀæƹƣÞ3a‘^£ãxR°šË\ì2ª<2€ÿŒÍmxÕîQžæ‘QáE‚žÈ¿¼=±HF,ÃØðªÊжÌ>Èü]¼¾Ø¨ÍqZ\Q0³“×-|/SS´æ;ª? [B«˜jÜë&BØ’ÆIRòu“$€„ƒƒj°i&ÝY³$——½å£-B’ -ç¨÷i ¼%0¸)xëõdïIG•&Ž¿œÃtɳ6†ž7|¸.&õ - -ΈŸçf™ÕÈPMC°3p§î¸eÚìq²áBÞæh‡~ò¨,þ¶¢Æ®¹ÿã -¥;Kƒ{jPÌCÛf¯¨“Ø£_:©Ãb*¬Ž–Ôº°AïhµûÞÈq‚F΃a¹¦Ô9›X´Öò€)t‘ÚQPAng©§âÏíÿ4»š†ü˜©>¹I¡Îúîá”JO¼AÌ°#­úEñÛÅŽÉ<æT»;×ý.Fíô«déÝj¸bÙ«k“ú§V«,þ|D—æ‘,4‡Ûj·vÝ–²ºyAñ—‘ùþP´›ç€8îf3A|æž{a­ --5ù\;³½2>V®±*T# +sê«®0V—0p ÒÀPô4¹7®“Þ¾Ê܃#›}Là®Ižß˜ä•¾9h_ê3ú 76¤Z&!‡Ÿ†‰Y‚Aý±Â;¥§!ûÅóë\š[S±eG»tö™€JË ¾qWp‡þ¬ÎˆN7ÝId¸1c[9H©èMu„hžä?ø³Ùo°‡T2­„Œåm¬ÔæZ5·}Oîͺ!bîÛÉ$<~éø::¥½½ž„2Ž €O1W© -@0‡cz´ëðcL"¸¶©ˆ1tQ mhž7OyÙK/=mŽ1Ü´iüŒÇŠ··ôŒÄŒ%¥”v= \lB­×9Ɔ½‰ü‘“WŽÄõÝ©s;Ú¾†øðýa_ 7,Z±jg[À6¾bV¤ÊY—qá=›TLÀTæù4¸©ŒZä¹xæÇ©D S7Aof„ûoŽ¦¹¶†d¬Å(?# Í”¡4÷Ú7©¯;˜Ác%$P„P|¹Ú“k½T˜dpR(áæÓþ; @UÂŽåo.P -·?å?«ì:º;rº¶;(œåÒHBÐUQ%Wy¯ÇûcEàÝÚóÌãÁÏbמgo@¦ð­q´ÔDÖèÈ' )øóÁ«ÄhåHø*²ï›#™·ZÏYHá( %Òïg!›µ ß¿ûW{|êõhñGÆq¡ÄL»»o–DTèd·ºãú±‚e6D²]}~Ç¢jé‰fÙ1HD,zÉDx¤[®'tC,ôC“2ßíÓ[+'aæ%¬vâ×òAµƒŒc;ÎC:e›sÓ’/ŠVÿ¸lÞ+ã,¬zïpÂ%¿ìg.#C‰ž4¥ì#,þà¦ÉÃý\¬Á—¤&‹öðcç[5—&b†ì~wcÖͳQy•†øÀWœ±k´Ô¨ÿ ³6QÃÁ»kÓÞW´ÌvŽËËf³í®Ào×>¥‹;ùk/E'’r×i'4hözUZj -S(xÚ#oÓÜõç ç‚͘©ØÔäs½6º~ï6?\$Ý“ Ûp¿øæ ´wÅ@¸º·ÑG´=/á1^ØûûWM€Õ}ýÐ駋–Ê{ÅóZˆÔ(sï[6ìÂO ‘züñÉ'ý1(¸MáCªš˜ãôº)–æD8ŸåÏ=’´ŽMæ2_Úû+ࢊ.hmËÞycÀ‹0w¯ƒ&¬í9r7µqB´!KRëhlo:®SZrEýñž:™%ÓF¤ûX¬ö@fÔ3™Ö`¶ÉbcгûË€yŠ|{¸ ¡ïì¹Fn§È…çA™kÙYÔëÚ½ |â­±ôÈìÓDáw E)³*j³sý«‹Û–]vŠSl|œ¦ÆEÔô5L‘–Ñ – :Z™ÜŠ2Mù…%–Ð`ß¿1¹¤²¿‡T@@jL¨Ph˘Ԩs*ô½§ Ëâå®è‚ -I³ÙêéÇ–T©-˜R§5߇›‡þÚ@ÂÇŒçoT§÷uf‘‚‚Ÿ£;?®IÖB,$ÊqªG¶vÚâ¯PIJ •£Æ»¨(¡àœ•SÕ`RHáRp·É/i¼™É6rƳ¬È»ÚôÊvökU;]äW¸é­ysV†$Z k›oÀëãõK„ö Î£ æe*|LÞ¹*p¼§}¸ò× }an²éÜ¥ºÏ¡öÚò´Ú7dîyˆg9ÏÅõð¤éFOdtã’ý‰,5FYrè¼c}í¤Ná§à:†KÐe fŸvE#Ÿ?Íю˪̘ í‘0S(Ó¿£ME J+dL©¬¼I­ð^>|$½g'IàŠ´?"týy0ïù4=:9W8ùÉÝ1ÕØ”D…—ÒšòÒ»³/Ã1ðý¥C¬£ù#öŽi÷é1Dr‘ ?ÇBì6R6VdÒkšÙâ” \šž¯ÀßgÐ>ç¼u]'6ªû©$c6!Çác¢Ä£Ü¢Ãvƒ -6AdQ›¹Í,>N)¥Ò©ðOã’ÛÍ·o}ŠÓ3U¢ªõ3“ÏŠC…}àp)Æó¿a™FK›ó+ •W1{‘¨íœiNŒZ?¿~Ô<îZÛ×Áˆô~ô}“IU?û -^ºö*ÕÊ;â˜<\éæjB† :æ‹ãk‡o™ùžËýtaA=« ÓÔ'ŸÔÐH•ÄN!z^“«ÿw¢ëKËÌ´«vߪý'ZÎØS³_-Ÿ!¡ÑÐ9†˜­yƒ±<`–ìÜkÚìƒ8˹‚®UF¡èýÒ¿äâôëO‹¦3xª©‡ì†°b$pãÀfN2rI[ ÷Ð`-IêѸ\\AIëÇz£AÅ ;²;»¬·Ó@sûÑ’Ðë"ø ,méG(;vø™Ùd×"|‘"¦ŠÄ`྅Óé‘«¬óõlýÖ!|t]Œjø0Š–¬¿Ö¾ª0Z )ˆM&çEî+É÷Éœ GÌ7kʱ—Ed`X]ŒÚE•ÀQd¸À'D5õüDU°p¯)+7sZz Ce´– -Ý)k=g< -ýÀ”å•LâàÛìàwD#XY«yû¸é ‰zp£^àž¡°óRÈÒˆþ‰B˜D²¼¾Ý_v|˜÷ÕìÆ”¡v’S|*B‰ã˜D#ÑŒ¹N7uˆ'ôx’ÎvïNEy-‡UI 9̽Ç|iýB[}¥­ Ó¨ÜE>T ”;pf4_·Ñ%ÙøN} T…—Äï÷uĘ¿”õ‰¦ûñ,Ri.ï -„y„ÑŠ<¦ªòÐYtÍþz`Õ4ŠMÇ>f·ÅH3¯ð(±…¼]¨!9‡çߤ–šà›cà -è°ƒXC#Ä1ž7róѧƒ†1÷‹þØ*:½Ý -¾¬üš"¨ùᶓ°P ¾¢®tþkºô¡ßs˜8ÁºÌÈ8õc°ã9­•Qæ3EåŠü±¹ÙΆq«¿tÔöÙËCCY^"fDzJ -ÛnÂ÷Ù'Î{ü®ÒÿŒŒ®AiD–Xg‰¸N8T£lõß Ý¼ùõšâq’Þ¸+U‹í7›™Z¨ Á©Þ¼{U ìôtœ&ñ6»=¹3gT’>Ë€ijév¦r‚Kºr‚ÞDƒœR7$ál^é•4mtn$êEÒÙeÜã8½¹ƒVã=R¶W…C8.Œ.'~Všë[²­:fÉHn‚™MÂû¯®2P8¼Ï`@¹G´=qHw¾•Ø[_û7*²C™r³ŸºkÞ²¬Ã1‚¤Á7ú>< -Ã2k}„‡Œ°±hd7,=½åÒp3{9 uN4Òœ°T—£b ؆F–i$ïó‹'p‘}¾Ÿt¥™´ð^ɨ"3±Ut¢¡zx²ØÆx4D K¬ZógÜ–z‘xC6‹]äÂØý9&yóï³t6?ðÌ"% -‘¼FøCAÌÑð}>€¶6‡¢ÓVÛþ\ý di B´«ÙQ¯è.Ç~Þ‚´ÈÌ=ìäm’6yS$ý-Ñ¥ª¶™)P‚´)keÅÃvM¡Gã¶Ëe·5%¬_ØYûMŠKÒ}ƒ†Œ8 îÕŸÃl5wìóµ Ô<öÅ·£„²3dz’œVÉ ÷ - žóø.Ñ°\éd¥(š˜>¯–LãPÊ  Ôš3,¿Ô16še¤³Û²˜BG»OåÔÏæ¦_ƵW‚®e oÎP×½'”@ç×Ò KLýº-/ÞJ[ýŒxw]öG8förˆVƒÉcvÄþh;Ìšé£è‡µŸõ!qîL¾Â mÕBÇïã@håR}ºûür†¢'rû⣖í5qq!Š¥¥¾Üt¿°wô¯µžQ8É@Œ‹«}Hë%‚Õ›E1TâìGäìï¢vF9Õ´½Öœþó«õ‚y¦¹ØÍYG$RXs³ ¢ÖÌÄxŒÕ}èÔ²®å†ˆ¶DR¢$GG0!°Ýº˜ÇêQàQv‡{ÎúlÀf×rh`>-¸O×HÿËtÈG¾è¤Â³8˜RG#zÛƒ–´N–˜0NGéìl%¡§¢Ë.læ¦äyð»R×|~e@!ŽŽÔGê`ª0棋«å=,–v_æyN¸À(:¶óÌ¥kÔ/˜´@ÚщÝ2Ï$4;ô™d1Sží±B;·šjü“ < Iiß\ÿ ê™™Î9£<È;ôÈypckÜl"ºÇdcß]ªPí’›öĪ®Ê™x³}YÚð²UöWÓÖ°Å÷ê êy´NpY¨Jý°ÐKöd¢_Ì|¶jUM‰Üßíùº=B78b5í9S]âh?7 ØD) ƒšƧ̗ÌÛgäX‚ǵx–!6YßÃÛ.R8WÐ^õØ!žÃüJ½:±³tñÀ{›lnZú|£€xÎÈ›Éú¾¹[ÄÇÍ U7NÑoÁ/¼\€ZëôJ(šøºa™Ùi¤•?€üa/J£ˆEÿýý"«€ev×!€Ã?ü‡¦1áå©Qá<>ÝZ¬|¥“hà]12fʸ™§ž(Cj‘ÃS¦™úêûW%W%N_ììÉÕÈiü‡Ÿg='tÖ¾Íö¤â„6ùWÊÕfKd2žÊ]'Á±†[–àÎGÂÑ%Zu$o[fìÀ(ÿ÷KŸml>H×ýá<ňe~Òußɯ,gVi®ÔŒ¼³¶FUjé‚YKò–eŸ¨?ŽD‡.^– åª$y6àj)¼¹è 'Ç"äMï{fÅ´cäì²Üz+¢1 -°YN0ÛæxôÞù¾•·Z1#‘pÐG)œïò±ž{+¿ÝªjwÒ±E©áš=P´Þ7±ÙÑ[7û¦“¸NYYÇU¸ydyÀ3yzdC|`×¾„CBݤ0âF½Æ&nœÐ~,‰ÄÖº ô"µðóo›Á·¶±zÚŠ7¡t<=›¯z`é†Fx¿¯!­„OL¥ó¼‰cä¹àåOsLÊ…©V-Ľaw^ß -¢ˆÉd)$± ¶Š¸[a# :‘ÁÜ.‹ÍÉü7LÓ„(èòGÚyö é안øžwbMŽÓüÇÞNËe?ZÎÂfRc¯PÌeš²ªéQÚ"äI8 -4Æg÷ÎüôL¬¾¾Ò?Âlœá6_±Â؈u‡ëî$àÝÌ;ÇDpBÝu¢Cbî›#13º;Ï -*‡Kò·¶‡;¼-’"+ܦ˳-ý<ÎÈt_üöYëÎ’áBÁ‚¡$üé©Ò.&>Ùe¸R¸¡3›Áÿ]u7üaÌõñ.R8‹zAµÓãvnXLûçpYTÓôª['ÒøUÒà=|¹üº*ÚÜOAŒ/–*CØ ¿?CÞêh67÷ Wáïx,V½ªŽ_RÆò^/H–}èÈ;‡¨=+mä káÕÊuS®ÉẇNbnN’²‹Y)êctž-yá¬JHw‡d`‹£Mó®úí}KÕ4¬«–!øWù…sYÚá•MS |•Ð§D Nß"æµdYDéÖáÄúÑ¥õÇ*1öEÒ.úMµü–r±ÀÒüØ -Á4õ5’KÄó}†#‘.§­¤‹R‹« -õS—¸­oïV‚•¦x{ì—?]Ž{øjA}øé{¶$õ†BÇÃh>/o†"U¹»ý´P‡SkwUçn0þ€8âàB¶ü¾F;u¶pL)#–àa–é†EI!ù+hâJXÓP%*;fÑðáCyê¬ã}ÝoÒ¼¿¡ɧR,çÇ?’˜Sl9Ò«W¶ä'j˜¸¬UÆ)šµæ•Ïˆ°gí®œÙ­cø•XÞ|‚qbÈ£!1{¼ùelÇgÅ™0Ù—^už…ÒÊç„D_ºö¡l*·ðd¾Flú`‹Í,¨X KTŒŠf­—;û²#q~hŸ7¡¤Y'ÕynÚsëÙ¤…Ϭâ¾Ü{äcÍ2–ô-ÙþŒÜ×’QîPt®ÄóðZs‡’„¼Å·Q·œêŬÇàâr´iÔhKEF<ýçn|Ñ ;ÃÎ*½½Æ¢¨O~TÍËiƒ„½• ñÑrQ˜šÂ\QxöórÅs]‰‡ÉK‰×Öt©RŒ{±þÄTq>°/í¯ èÀYˆ8~'}j+U¤5]¦tj7ѳø6²ÉOŒô%òœíüØe¡ ÿýkFÁÍÄI÷-IƒZÚ[fã犴Šˆï;£À»¹{ý£›¨æÜ 6pÂédʬ ÊL -}c6!„L¹âP’{ƒá;D¾dçqí¨ˆz`Ë2«f§µ­])ÊFDŠÜ›/˜[öÃð"§Ê^wHZÁ‘³"¯oD{¼_7züä5àb«;ýS@$ú¡W °²ZðDò¢òuÙÙ‡W{fMÞ2ó ¥I*,~…Ä©¹#xÖÖŠìz‰KkVßL™E›)¹‚¢ÞIXbÄSóùÈ»´[N[lº3íLX¬˜üçw^@dqór®©aœ€ÿˆÈ«^œ©úQÔëèŽ0¼KÔÎs?Å$#ÅEA‰i×&ɇݻÁ‘$Ò©ü¥Sy‡1;HèWuP)½N® ‚’¯W¹s×![PÛwÚä” ïÜiCéW.䦄NMb‹Õžçáâ—¢ VTOþNÂ^K_çÛ.€ m†uÅÎåÏ0úvaiÞAœ,g5YaØ‘â×Ái¡Þø\¥œÑÖž-©* -G%vA)ÁÃG¬³¤f‹o¥¿ñ`Ý­LF™óVõ‹ÔK‰óÔÝwø`ø?qŸàÁ¨Í tj@®ÈÎê3cçÈEÑØK×O»Õò:;?I ¡ ýÅ!˜t¿£dæ[)¹¨øLIÃ-…Í6mïÄ;ðëjoà'ø|Q¸>ElŠ§Ôþ"$+Ä/ÊÑótb/w6ŠäƒôÝ~pióÁ …§Î`ÕÊgŠ²g²:¡;÷Y2&Ô%ó -ž(—NÑÄåi¾%¦Še¿€Ù?ó‡ Ÿ›o†`ƒbîª0Ø– õÚ MR¾Ýmc,ÛtóÓÇ@6UÓ -Xá…<§õ0ØC"ôñŸjè(–ŸÚŠeÂÑ_{Ú#‹p7ƒLìÙ5`:ì¥~Áì4«¼„?ãL®Ý8Qó\‡,OÇ™ÒÀ;ŒmhT Î§µVÄ! ¿h¥¦ž;t*ê¿ôŸçq !·Ë,·*¤Z…ΟÐWŸ¼T‘*”„6C‰:(ç›ø9ÖɵQçQÈÔGæǦߑ_<Â9ç×YÛ­ÐÚºMîƒ3u"JL üüÒ¦Q#ÆV_©©…vYTóVKYðçæÄÞU™gÔ»ð¼ òù‘Ïz‘Z(ßC?¢1Ý=žâD®jŠR8€‘%öøg×Èži2v»n›„¸MM¢t QdÂ*l%–¿‡RS7ÌÖgj¿¤‚<ÿWßÊ}#ó9¼ˆ¯†eç^™êgÞÀ Ïõ#²z:Ý¢ -Ha\»¤ÿEH Ü„Ôçì¾f• %bA¯üIÃvÊ¥lPsw‰8º8Ö­æŽÚz1IÝûQgÜûØÍMw­©•—#ŠC$=ꤡ ºí=ŒjâwÔŸD*/ÜÒdêÅÎVÇ ,M¹·KÎ?ß´—GM‹-ø’S,‡rYŠãÙ§¢](?*¢/GØRèÌõݲOR毙(š:4 ú™æÒøxÝ`£BÎ ´;á0dˆåÍvøÈnç”j¶ÐŸôwoå*ra|&£p8`ƒ1ÕªJs‡!ùåækz‡Fíãeo—É1.ƒ&xªMC1b¤‚Ïæ·x±Z8~"xOkËÄ¢¯×¼lT²”XQ  Mo¸cRt¡Þ aY7_.äNéT±JëñM2AJéŸÃ=k§Í"Ž‘Zíë%a]¶•æsð¡|jËNèNÙ Ùcš|GXŽÈc|G¸[«‰5G¶,€/œR\n‹l_`m>üTO‰+©b0é³lG¾u8ÂfÓºÞC#ÏzÆ?/Ùel\‘´ˆW°‡Ý×ôøüº±Bì¯7z%ÀÀ·Ú(»w)ûV§â‚›î»vM†›»ó¨7Õ5K#;ù -ž‘õ÷¦ÝÔÆ.3±õƒ¤9ù]v\_17OnS{‡71¼ôtÝêÅËCgû!Ìõ’+Ì\\j·Äž¸,1Èßß62–e€Æ§¥ì¶£þ&kL¿ÜêWÎc½aàJÚQà&AY¸Úãt¼Å+«8•õàZõг…V|Òœ½ÅÆú¡/½99tsDõbÛ_ÇÜÛWp vµe>‡ÿö²fßé(!‡°~i0bkzì¾ÕIä­ÖÙ²¥©@ œæ‰R&ï…Ãi$|i ׶Π³ùòR¥ñ-f —ºŸ æžæœby,I꾟pXðØ©»›¦Æ)bF°¡K·b¬H‰ÌçubØJŽ%Yô¶yX}<¹ƒùÂ3éîe›i0Û~4f$­z6n/¾˜z¤ðvÀÓx$×ÂìÀˆæÑnmeõaàtçTŠEð­*>÷ËMÉCJÁ0Ýg¿WæWk¡0[(ÃL(”ÂÁÒ/;í:1J ÛÙÞ¯£ùþŽŠ'sÙìYœÑ$l“E! ÿŠ’úë}ÈѸ/áK#¨ÅA­Ž^Uë“Ø~L¿  Š‚±XYC§»¬þÄÜ¥¹¾a.áM\…ætrQ×üÀjq"Üm £ÏÖ¶î½-‡Tâ‚Û%JÅX›M³z¦¹7SÖ¨úf ï0´ô³V˜q7´2AÚ€úË»X®Õ’t•Ö3çfÚÌ3C’{Äc6 b€¸Pek8ÆÉ@G•«EWf¶rˆO»iuw‚xÜÒqÌÿ8ihø©à¬j›—UCÅH»Ê¹b?,£LrE =ƒ¹ôñ5Ý&*~ê%ÐÕc¾îÏòX¿,Û qBN)óYþÁµe¤*±~å`r|"ýç4[ØŒ¢¤¤€í·Ã|­íü·‚PžéÉ+Qu|¸ÃH:^R8MÿÅ›ª¾â,FU-°ràQ„³sœð §gVì5qï¢< êÎŽ -d9ÊÉ„™Ö´š1ìÏ¢ì¶1CZVXÉbןJÐA¹ÒKMöS–GõºwÑ×í‚cþ` È1aeÿñG©n¼õ÷Ñ™7çïŸÊœFŸînŸT‡êO÷6ήpMëgW7a=_ëŽ1T^¶Õo&Œ¦ßÓÔ‡\œ"ÚË •×)-E.eÃîi¨¨Ý·ŸsÿS„/ ü†š(Aæø+ÇŠI*ÎÓüúÆjÚˆšµmiäXý…EŸç¤9q/¥%p¯ëç As=ÜÙ}Ú•;Qlir®©ù“ ÿw-db&Ñ = ¡.b¸ÝÀ¹P¿¤àÅЭÑ#m„ɲ]¶ÇeÕù-÷uÆÇ9—ydrwÙxm£ ]Ô(IÇéÓÂQ„V‹I/öVxÞж[óVmyc~|´‹ÎññF-]£ÇõF$ô{Ç•þò"‡‹Èu*'¥æ/Tw)þñ/ ‰_bbèø†èh³H‚y5(Ô23^K~xɱVÊ+˜H©·1›)¿h¤GP~,”é;¸0ÇPÝîDÀ³Ø2y(ï³³RTkÂì¢þ•KÒíÛ/ Ôkz2,ƒÄUHH,[¤÷žÆ—ù­gÜBþîÕLM*g,ØG‰³Vî«LµÎ¸NÆ›þÜþ$î¯Di$uôìØ‚´)# 1%}>Ò-2¸ßL1­ø¿²s5ûvTëð$‡.2XPPù8ú¹ãsµïõîrRÎÁõ„¡Ï¸¨›â•þI=¹“ NOCÕ4rʷ鯲›lYõéjÀ‹¯>T1w=/&6‹ü9ìæ·äŽui]¹%3ÁÐ.{~Sé…*5s›3:Ô„Ù“ü*·ÂÖ5pFÍšm*sÚ»°©’aÅ:kïÃõb–^4M"s2Ë®EÑ8Õh¿]œ·R´Ɇ¥ŠÚh6lXq¦!JpAW©!lx’YŒ¡›=’ÍÓtúñPJ—ép —Ý@ÿÁ$]C2R7qlnOÊ—*k”(Ú…V¯{­²ÏRw#XLÀ#btJ—Ç-N‰zØÞ)VMÐS“Æ£<^É™¯ŒuK ¥¤‘îdçÖMø³[×ÐÁ÷ÛÞóÞkSÙèðËÄÚÎÍÞÕßßLØUÄ Ô:L}× ¤å°6a@/æ{н6X6ÿ]„Ë1_µ8.·$ñúëý2h¤ñ³O:þÉããhIU½”²·–2 Ÿð3”1®.øºò"îf/’’u.3éªZšœ˜­9µÀµ˜…”Û±†mùlË—‡Ï³'´8/Éu×µF±‹gKŽ‚Ç;`†øç:í·úGj¹ÃÊH‡õi¤ö@É÷²ÇÖiFèÅžo:Ë… õXWzŒ†˜g =çÇ$¥6¸i\üh¸Ôè¢ë9ÃËñüwÑ¿nÊm#p¯=7Ö8wK -†‚˜!Y5ª¬h›Âø IŸsëâÏç ùÕu8᱇¶QøFt“M$Ž×Óå“y'ž‘qŽ²ñÐEW fáx:„˜û;W7·H þ”ãWŽª—g=p.Ä"®¯·4š©øZKGœòÍ£¾O‡¯ wŽù¦Ú&þ¼­ÓØb½êÇý3ËÌ@1"†r=qoÃEó”ä×™v0™ºpݳ³Ë„ƒ"´Å¡‚’¶Éà#’¨¡Ü‹BÕÝkñ:FñHí ç絬¦æÐì âyPÞÛúóÐn#Z\›É72L‹Šã°-*CÌÚº§´á—µ'摃ì“Ùðú”ø>mã fË©¤7i0?˜ûû/‘ªªÚÜAñ‡®¸»¤ß3¶îew´°éÜÐ fL9QqØ]P ×·²¿èýöФ¤5BéÂKÖÔ( ÿRÂM«bd¦ñbÏJ®¿Ü>å#cãv“¯Š1‰«¹Ñrjºé×M —U;hKË’ºDÐWRIÔ®@$š@ì<‘ÍA´¨ÄDú&„IU©¦"ŸöÐ9~D”eùÖÔ ôTê¬ãœé(¤Çn.”.kðÿ´ ¥®ogï=ƒþ½»þsuFÝÏåþ¢‹·cËáäÖ„þ²÷‡ôŒÃ¢§gÖ™EBdeìºf|íö˜ Œ³Zw4Vçvž&Ê=®ÝÂ¥H‡,d|LÀâ3N‹'¹²7,šsL„Ô]øm³ n-@ܤ¬N&…¬$ÿÈûÃõKÐt|]Øl‡¢óJ>h– -’9„©²Íºi=ÿ¨nuþò©­'h¾N«˜4Õ 7<±–¹ûIíÓö†÷Õ=Î)iÇN{À$dQñãTË0¿‡h¹KÝçµÙÚÒ9äóÌèÍï@¢ËG¢ $éðfKvHÀÑ:ÓÝ&îûAoà `žŽ“DGO?Ìd¨ö3ìŒ Â̪i¢ì'Y"-°ö-¸™¸O-õÂ5¾4¡Ã­š6rMŸ4Éì’‰üË¢¸U9F4Ò±SÑU-ÚÆ -¡à£"Ð,‘gÏKîD~^ººÓÜÉ/Zn\Æ$ÿM­Œù–1ÄŒ)Á×BoÅ£E[âcQóh¨X*úêÊÒO>0”ëw+ÇœðaÚ¨F~¶zñyþþ{ ‡gS(êá9‡&IdÑX2)Fžb¡8ÚËp¤‹PX,Gæ(xõš2œS`º faje‰ªh.,w¤á«7 -cLÇý2 Ža®_š²HÎh2+ƒZj@¥üAnÆÝܧúœt`;æßgŒõµzê×îòx¤áï¹Ñ%–ž{æVp¨XU‘Ãí`ß Üv«%¸‰ø×îDß=pNÞßà`å7—Ò‡Rtó ž5•C{ -L­ysŽ>!qÓ±ôm«¢É‰Èåîãéoª#ÙÎÐ^?ï8–y_å¨õOÇ€«j;‚U㌠-¸Kþ­Óp’¹«³>ú±ägWüD³É÷?æKåÖôm#|žZ¡£ ¢Ieí "b0G`½t¢n¢J¯q¨ÜÜPé¢G08mÜ8Ùªç µÝ¯Ýã¤ßRf§2e±;$D/Æ&.mÈ—(Ân¹\çU"S#Ð!=7±æ -’Š±à÷+ÐáËú­qJ®lHsIw¹eòª zDëÞªÔ• NÚšO%ÒçÕñr‰½¯=W¸Ë„TF%:uÀ䀙2º,~u‘\ıáýú”oC}xù‘Žq"4{‰ -@ûÅ#\t£¼ó¿º™/K®Ÿ±UgR¯H€d~È -a«Ç|…Á|e¿g½¯ }ð”uT©ûa3s+³Ì¥•¿½ã1KÇ×1¼tþ~¸O`Ë’tyQ[ýÈ—M!›ªo®J¿¦½Á'‚K›ð⊿Sî|ÿ˜û\WAƒ#‰Å9Žê2]2Z³lp‰Fûû–†ÜûO¯†O &¤ ÜDpªV¦8ï…ñ™÷óìº è™zgØùÝg¢‚5¹’-É}P«†öž/£y+¢rC*î‹#&ï]:x"v˜rNµ4¥‹|ÓWíJû`føZ1mü-msFYîÐ:8[Ž–?[¯+v~ôðá²› ó&pÀs–K‘v£y¨¤}Üšÿˆ÷[â01%¸.cœY‰]j˜ª:Ç¿ùö:Qqæ!åµ¾©ÏÁÈégƒ¡¾{£6jÊÑõ({ö;¯`ôô«î½A$äÆä¥=ÿ7<‰†ÐZLLSXëFŠ}Db62×,èÿv;=›#˜‡Ãc(íˆFrEƒÎUA7Á¾ºñ°¤‘ïμ Ÿ³ËØ 0 - ·‘—Vh/†¸MƒD:•ÄÇNñü°†•:#Þþ>PLÇÒwïÿQ5GbÄñ Òû¦ªð@` Ìz(iVþÉOëµ6 ‘–`.¿ô#°Ý;Uº-AnGûnxf³lTÆíØHºcÍõ7<²q3)‘‘Ç~*Ún¥ ÑB«R‹Ï+K¥È›!®)w™øÄ•™þîêñþœCåaIyƒÎ³<–äxŸs²)¬•¢×®8zÅJäó £n©ÌsÌ™æEHœX-z/è=!s_å™B?Êóíwö;µŒ›ô7M»Õöî‚Œ“˜:¨’PGKÐ'¨MÖí éżAJN{QbÆu:V7^Ð(*mké«s櫬é)7,"[›CÓXåºñªÌq…»¡„GÂmb(GXT€,ùÅbo©ðp²‰Ï÷ÖnròΡÕ`‡ü'íÌI êÁ¤Ë­,,ÿ7üëlþ\K -³ãÆ Y§u ïèœÙ+èï°9¤- ˆíRUöMxöOþúíú¡ÅsC¨3‚Džú›„àyEà·£¸q ›—Rôd}ŽO± æé[ÞÄ™G`c·§;[‰^L–çÎ(Ön^v轈î½—’‚IA?‡Zdߦx¶ë‡0Þê5/„·ï0iñUE°—,¿"7ZE"Y÷­à ŒçÂëáÂBG¾8˜¯§µ#êÂ^ êa¹bÙø´­b÷VîæלuHmzæî -P̪è¥Ôqõ D·Š@ÞDzˆ‹òuçöÿäüfN?ag>-šŒÊM©a7šµjª)Ð¥0c1å˜Åêž&¶Á0®ï¸‚«n9¯ÀMæW )õêP&°C˜Ù‹÷¥J@eôOqðȾÿçx˜¡ù3ÜÏú\åušà$å·=„þ’»:0¥äí ¬ {]Û7°PPÎþm1ˆ’=pËvÑ18Zµ±ˆÀºrG»%±6.«ßÌ¢8Î8П«woZKÉ9'çêí#úG—ïj²X+§ÃšP8†»Œݸ¼0J…®D“-ýf¸=_U0óA­ú¤‰Lÿé-àK‘ú¥Ïã&zŽ^Lqêm²ù›_º´~æ9ö$ |òÔ«*9k+ôûÒ—eL€<•Ëu¼É]ý v¨Œº_rœ!¬ß§Ìèèn"X[,#ѬR;Ry\³¥»VXÀƒ±AA+w -©õŠÊ»üyž+¾û™%’I†2£mÞá­¥\÷¤uçó:µš¥WbÕ‘¹éˆ×h'¢IµCŒºÛ ¯uJ*ÓÉ<¸S!ÙÖdNPÂD)­çcÅkø2æòò›9b«Ë#¸ö••v² û›T“Z#¿FýŒcÄ̦ë»Éz,³ý‹ù¦Š{ªÖœÿV¦(Z‰šavQÖK>T«:œcn -JÎtŒa½µ~öB¿çn 8b¦”W»VŽn$èÍñ)4Üê¤÷VûËÌŒ;µ•èN ‰R£ËÐŪ§ýÿ×>Y¶5( QD‰!%ÝHîfà¨Ñ9º‘n i’"]Ò-Ý1ºKÝݵ÷þ‡÷Û}îùçÃyžã•”4|œ"ïñ`Ûý]_€ßÿ¼Ý²í\£$«:ê¯{¶F†Æ»lìÏ3¢?ÑL$G@Öóå×vmôãŠ#Žª×°tή4ËFIñê\é±¹†òã–ÊcLÏBÙðn¶²e™i¤ÿs;<¶ ¼ÿñÏ7JŸ¨ie/þ5÷“FàEZUuç!í¯îðœJMþ•³ŽôÓ }Ëß–~¸ -Âòé€z{JE‰FªM Û„u–æG0i ž³ÍÀ†^µYkúzþ'ôÍòH¬n“È([ÒKFR}ÿ^÷ôdk -±5b$ßì}Cd%#vﱓ*š°ßÉ ‘ú°»­¥8hñÀÜ_Œ»Ð7¥U½2f -b›oÒm÷ãÅY…½jãnQŒ˜fýÊm½­ªm&*þ8”Èç1|ñ˜a¬~– F‘«•¢ûÎòXQ;( _ÆSI0ü+p˜ý&á¸$BF -ý1ì_v#ZâÍ,µgªìVØ -*‹š@i‰úû¿ž8ëäCî3luRŽn£ÒsbX‰É ýÚNã0Lb£?yrK—Søƒ=ÕˆáÜá@Æ žÀlþ ¦Ã<˜'•AÅ87gñU˜ -Üxäø›Š•XGŠyº'üá9vµ,Õ½OÓà¬KÏýØIC`­” ¿¸9Âò§é¸ˆ ßcZ”Âh.RÕŒI8¬_$òfIKmÌXró–€àÇêŸ%Ŭg”ÆÂüˆßY'ºVR, ¨B~ ÐÔAQäϲ¯u£s¢€Ý_˜Œ\@øt-ò©Ÿ’>ö‡Q÷FÉÎUŽ«l$Ô.ËW(¦8*³Ÿ{>B7@ -7쑘ôy™Ù7º!„³¶ QèÌL}*Ÿ$‚WVÉÉ®š±Èñ×´//2ZA$¼§¥ªb;>~T6EÕ<Õ¿¿Vj3ps[‡Ú[ë #.JìñåY¯ª0ûì©'™„±ŸµQÖ8}Q¥ÞÒš½.HÒý¤ñ‘õ$=¨â¯oñöaZ]‹#6ž/¿¦Ðô¹e¸ÞZ‹ÇM{ªh= Hp¿œ¦-Õôš£åežÂúz‚€ÛÆ«ì(Onû÷söQY²æ‰Ï&¡I(Ja]U›-fø´Û[ˆÿÞóݦ6vº%š.[Íá§KpyJÖˆàêh2nösjJ,©VŽ&EͯU¨•x9øW+0éOžÜX‰3„\´å‚]:aFïz”* ^Ô¿Žààˆ¥A -‚¾¡ÉzŒ:s[­+ž:[´‚r 7À«_ó熈ÑFÂ2Õ:¨Ù˜-Aè -œÆâO­Œ,Eß÷;XM«âU†æüìeçÎ&¾¸cë2“.D£T«h8&Ëe7nV"ÎCøpÁ¨Ö# }&_ot-ç2ÃæXL¦ºŠðï"’‚Áf&ѭ탔w¤éʼŽE9Ãê¶Y|t\dà=_©Ÿiµª¯9ÅÝU5½<}âoCʬe±É·mQJ_”–õx-ºDïä»3¦Ÿëï"‚_ -{8þFÑÇæ–éì é–sEcø ôc/ ¥Xne­£ß Ip’XÌ,X§x©oÞC§C7}yñ8㟑KÓ•F<Ø—¶cÚùc§>É÷"ÊåæÔYxVì#³í³9y«bTjýé‰NÜáù„…ªjŽ\«WÍX!Ì[Ê뺧b'ÞŒÆ)<$1ôÊÚ[,ৠƒ@ŽWÃc3/—°WnY"¬Æ4áé[_Šüå–#xÎöf3I¹[V¦;ñ²è2f’a_ÏãX;q)ö&Öö4FØ…È÷Ÿ ˆMóK¶Ñõ‡ºé€‚œ»&nˆ°¤ý‹ëžÜ[}·R½™Ú¾Nò -=X¤9ƒ:Ø•ñÒ¤áiÁáß”×ëù pj2ã¬#C÷€ù=  Ë#; .§Yº°xB±}!ÝA®í×›< ûFÔ9OµX¥|½D;-^Èê-Èñ(õ8¶ºÞsžj‘ÿû_„1Ìo^}$å©ZR‚„ÒE! -†*Nñ(ßc“À“ -ÎQÓp/6è~E”ª:Ý?ªúÚ Oæ˜%3=/4X ýÄÐuƒä–ŠžØ¨ûáá]°ÄDóÏí¼ G‹Æ˜; sL‘yø‹laÚTKcøþÙÒ5Ìg+Ÿû{Dü±Í9­M9îŒu.ÍÁGBLK¬O%¹ŒÔLM…•“–`Ov’T EíûÐÖ[ï21Êsd©Jéšp•˜éø#ÃYÝEö‰¨õrnâ芻‰…ë°¬&âè݃é3N^Árÿœð•ó+fd-9¸U0Ód‘ ´U¥A}ù®º"äöÔÝ© -ê™ã2ú»‚îY$óµÉ•­ßª2^IÑPYm3ïÜÚ×Juý¼=ÕùÌ~9Äÿ 2©”pmPkDÉ Ç¥)DcX¨Ù콘ûk*+ÇMCÆ{Ù´~­Íµ)²è5¿¯ÅL|yÿ1ª5u‡Êëñ÷Òc9„ÍrU ¶óBDøò3TyÈ嘙 SzH1ß+`Îð¶+§`½°W5Ó㎎²ÁÑÃiÁ™,÷ò}cýö3!§ïÒƒŒ‘Pu aÛ›”Ë tòÍ|T\ÅL,pÈBHðì9çÑô)8H-úäjj*ê=êOŽ<™â:õY9­ªÓ=iƒ‚h¾!‡¶ïh­ðç¼×îöÎWc?|8na|qží+¬A}~é{âV+gê7L7,ðt>ÓSÉr¢$˜@ZýaQ»²L=4›Eb ”¶¼ú¨•ËÅ›å/Dj {h>UVÇêúÓ·×!JÞ£ëp‚FL¦DE8"¸FKËyŠRŠàïQ¶ÖÿcFö,nc$õCèÛn^ºËø}ÃÞ‰ÔÕÃìm{ebèÅß5|:¼ê6ÙÑÑçd®‡ÄŽæùƆ ^Ý+÷/Ø:!\Ø°meCkn+? äm –ùK'S| j&¹qýÉÆJ²¤µúže•xz2ÙÌBwÛÝ:‘C¤·¸:¥½`RÛˆë1ïN^‹r+Ú©:/cm1+Wã¤àûðó·ê÷$â{‘™à‰¾m©¡¯ÈlXCšyÆïÓ»,P°&Ä•–¤–6Aí³è¼XË4ì¢Ljn¢ ér:S#7v°£˜¬dd÷—“dZ«¼rQK¨ý>¯õ®lH}™‰Óüzôßa­ªëµjÈî`ê†÷Vš¬ŠÖôžÕŽopõÄh€— âc—mNá»’E…¡/—¯ñ­(À»¾£ÐgñKÂ¥K_}dÀç²çšøWNy´bJºœñýÎ^y{D¹¿ áöø ȯ×Íó WV?S¢6y‚ D\ë †µÆ†ûÿ -Œ†<\a/r¼ˆvÈxµfíÉCvP€ÕóuóföÈy§Åm4ÍÛÆajùlW¤JÕ4pñûZ¢Aÿ6Ñ®–B][¢µš×´B©®¦Ö{?q£Q4¢«]*ê f1 ¬Œ*w5#Ò”HðŠ¼ª¡–©ÖËCšŒñÌ®¾”ëÓj¯¼Ã'gE¸FŽ:í·²ˆ¯%u0Aü¼$°aXÂ/ ÷ߵƪÂú¬(ß™uklê..Úá¨etV‡rÓ*$ß;>wYp®Ûr¡£îdʈ†éñÇVéÃhKñ«¸óWCÞ.ïò$.¢oÂÞQ#»Å¹* q¦ûÀ6¸JÔ àÇæOŒù[ôÏQ7óeø^ðÏa:iÄçºb¢&ÙgAÑV£ç\tj†yçר™<£È„ì3tçV(ôßÌh©×OѬEf›½ éÝK•X?`Ãþ7ØokÓÈh_y,Ü÷í½?á¬{®Mpóßù‚z¯–ž§ûëeò eÌtÞøa‚s{ú(5J<iKfÙý6ZilX'Å¢ã6ÉñÃëÓÛ)'´Y¬¼ó4a ³Ô4ǸÔ;ÁñUÁÑu]h‡ÎlŽÑJqz$KЪ@ÊÛ3§Üo%ù˜CS÷.õ„ŠuáDâ°YkÊ5N-¸àî )¦uóñ×RÒŽ»—,â,Öò‘ù;²eõ'h=ö:©aCDcjÏç¾µg"ÁÌû'…@ä¡e;éL7FK@»,ƒýëdE’¹¿eÊu]þ¦&ãñ*çXê R\×|ç>¤}Ð8ûÅò´†ïZúI–-ÄŽwp­íô |Mª›…ÞTõèË¥{E-5uyЪ(Cˆ­ÞF‡ÒogçüÚ3‚Æ?Sh`Õæ²2­£=‚II¥ñ“ÆñÎhÆz[ùP.ÍgN#w£é_á£ãäbJýè ¦3eçø1Î?­úw–û’ ë zT4{… BfA]qpeóD=>ö$”z‹Ñ”H"s›eª+è–ÆŽµz lSvöñ©…ï–YöWñǘÛFÆÉð& ëB¼´söÓn>³•Æ¨»VjÔŒw¥¿·x¬ I’ERH· |MÄãzÅsz{o ß–ž›ŒD3e'lÁb=âßç95K7ÁœÃ'ç k+'ÂæxAS5#]¡~ Ú§¾wÅäoV¬1¿AÃÍÝ4šïOFG,j‹`Ý8ðE¡4™üøìi–¢L-C^+ÔÜF«Uݱǭ„ŽŠ(û89Aû[¡÷Ó­f)­Æa|é]l©ì™ùÀ`§ª¶p«B8Lúño@}þÐ’F³’Ùa8 -åUÔwUMõ»gÕ"&ÛQ=Q¿Á²p,æŽ ðrÎfœÝ‡Qã³éîtÜt6.§>ôÙêð97›“¡ÞnW‡•‚ø«Ñ¿}‹!®N‡éi…@lã -C•Á&ûA×"4ÂÌ]iÅ Î|,›ž(mÍ…pêÖ.‰ý³oRŽÕ] ¸kŽ¬¢PÖ¡ZÛZŒŽT2Ê©‚pC¯–dô.Rn®f™7£žØærðk®–-!OõŽž1t¿9~‚ó–‰æ·q¼mxYæó”9gK’}ÃÜÕè×å HéÏAf™\pCÊˬM‚._óBâÚjq À¶]qL÷‡ Âa¯¡n—ˆ›´¢('â¥&Cv­pñf–¿‡OFÙ2ö -# ð:øF(‰¥YäsäLèÆùxÂJßÓ%ÌgæÂîˆñe:‡¯#0®ÿëÊ»3¯‡óíLM¤\“wŒgßRkHäŽÅ_KØwÓªÂìni–ŠØ± ¨wŠlNþj sßÑ8v> +stream +xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&q5 UUIºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•î£·5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o +šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ +ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î +vÌó_ŸäsýðKÞ`zŒ—6$Aïܪ“³ÖUª Ô¼qTÉŒ!ÝNë”›Å/˜4ú#pöpò>ÙMBˆÁrêM<õlb®‚‡é‹à\jÑhŽ!··qèš–í:—… u>5±“ª——‡³›G¿:×MÎ{òεÁéKœJC·Ò@µ¾/)qpgŸ”­µí‚ ¨•Šgý´»Û]^ÕÞƒÛ1Ü ½û߬Dþµß™á…°ä]xŠ©9ØhNT:™~«„r…7Ôè¯Ar Òx‹'£º줔(IÖR×Äf*®•5`™xZi”çe™•Vê]è®tßó ¦@ßë¨ÖŸ :º·WH’gå Îãí;g¡ÎÞqQþ6ÿ*<È8Ô²nir{:^2‘@àcÆÃLˆ&º¢a™³SûI˜ ¡NÕÊÁãɤðÛeã‘[‹}­H}öA÷4OöÖgí +„7N•{œP¾©3¹¥Œ/Ä[Ö]ªp­Cƒ’½f±eB8|* ÿá´%Q0d’hyŽÏË9€œH7þ5'i}=½ó{LXwÜëaä6Aº„ï5Ëo7F—Aµbñ#¹‰…O[?ˆny= ¯7…³¾ÏÆ_žMSÑÓ<Ÿj²¹O-ÄËOrlºÈ|!•¡ÀºüV„, y©+¥, ßê¹2š_Sûà£#üåž ·${qÛF2<üm=àmûS}ü{/°¥ÖÌ:i­‚ƒ‹\’³¦ææŒ"×îS©ÄÙM>?gЀñ¤kMí!,£sê-Ð@‘œm.êÎ@ušltÚŽ£{±/¦£¢a?©8AŽ°KjðæêBQù–‹Mør“J­õ¡F7ÇET¤tVÂÌ''¿3ÉØn¦»3=æܽ‰(®!að5÷åñŠ&'×ì ®n612"à8F•–²£ _;Ù¦kžO„ÝÓjwX í¨FVfzÙâ1ÖãðÆé›­iàRQKzó€ü§$·+ ,o@rÂð*šAnú³,½,¶¹}ºeÄ)ywÉG~­(JYœ…Gåy T0}O7&·wŠÖŸ D©ÓÙé@ê±=Iµ~½sŽè#"Jk6ÿ´µªt‰`úb˜B½”ÿ}FžÎå”ê¡scÆ_»K3B|=iLõ÷*öY/È× d@OÏ9FÔ•Îk…&÷;®/Þ¯/]ÁH}ÄËg•ëYnq¿C…å#!èkšž®¸B<.›/æǤ¯çXd\ºiÐØñ-z+ŠÉ¥KHõQ´ h¦ÿFÏÀÁÕØ wˆÇÕµÊÉàŽÌ– $^?Bäu):pã uÖêShÏ©ÏUbŸ¼ƒMÝ(¶&gPð \`{$¾ɦc¢¹Ýà%_ µæ”¼:ËÔiÏ¿J”­¶¸•#HÆÌ)o=A¨|iÃHo5¦x8ûÕ¬¹Ùî?[8V=—¦­Mº.ïS`Ç¿%¼à%¨âÙÞëju¦JÕs¦þð²=ö–ÒkŒVH‹CÁVÑ"¯•›ˆøKŒÉúÖxÞfªxkžv7`­ÄJmœ,™iì‹—³é éM|ó‚X2<».Íhì¾0úd²n¬ØÕ ŽgÈ-KÇkenI`sã\ãQ +ï™°H¯Ñq<)XÍe.vUÀŒ‹Ææ6¼j÷(OóÈŠ¨ð"AÏ@ ä_ÞžX$#–alxUeh[fdþ.Þ_lÔæ8-®(˜ÙÉë¾—©)ZóÕŸÐ-Ž¡ÀULµ îu!lIã$)ùºI@ÂÁA5ØÀ4“î¬Y’ËËŒÞòQ€!I…ó +Ôû´Þܼõz2‹÷¤#‚JÇ_N‚aºäYCÏ>\z…„–gĈÏs³Ìjd¨¦!X¸ˆÓ wÜ2mö8Ùp!os´C?yTÿ@[Qc×Üÿq…ÒŽ¥Á=5(æΡm³× ÔIìÑ/Ôa1VGKj]Ø w´Ú}oä¿8A#çÁ°\SêœM,ZkyÀºHí(¨ ·³ÔŠSñçöš]MC~ÌTŸÜ¤Pg}÷p€‡€ J¥'Þ fØ‘Vý"‡øíbÇdsªÝë~£vz-t±~ŸU²ôn5\±ìÕµIýS«Uÿ >¢KóHšÃmµ[»nKYݼ øËÈ|(ÚÍs@w³™ >sϽ°V…–šü ®ÙÞÇ+×Xª‰‘†€9õUW«K8†?é `(zšŒÜ›×Io_eîÁ‘Í>&p×$ÏoLòŠJß´/õý…›R-“ÃOÃÄ,Á‰ þØFáÒÓýâùu.Í­Ž©X€²£ÝF:ûL@¥å߸‰+¸CVçD§›î$2ܘ±­¤‚Tô¦:‡4Oòü?ŒÙì7ØC *™VBÆò6Vjó­šÛ¾§ ÷fÝÆ1÷ídž ¿ô |ÒÞÞ@OBG À§˜«T ˜Ã1=Úuø1&\ÛTĉº(Ð64Ï›§¼ì¥—¿ž6ÇnÚ4~ÆcÅÛ[zFbÆ’RJ»žƒ.¶¡ÖkŽãÃÞDþÈÉ+GâzƒîÔ¹m_C|øþ0/–­Xµ³-`_1+Rå¬Ë¸ƒðžM*&`*ó|ÜTF-ò\<óãT¢Щ› 7³ Âý7GÓ\[C2Öb”Ÿ‘„fÊPš{í›ÔW‹Ìà±(B(¾\íɵ^*L²€N8)”póiÿ *aG„ò7(…ÛŸòŽUvÝ9ÝÛ” NŽri$!誨’«¼Ž×ãý±"ðníyæñàg±ë?ϳ· ÓøÖ8Zj"kô 䓆üùàÆUb´r¤ |Ù÷̓ÌÛ­ç,¤p†é÷ƒ³ÍÚ…ïßý«½ >õz´ø#㉸Pb¦ÝÝ7K"*t²[ÝqýXÁ2¢?Ù®Î>¿cQµôÄ +³ì$"½ƒd" <Ò-ד º!ú!áŒI™o‚öé­•“0óV;q„¿kù ÚAƱç!²‡Í¹iÉ—?E«\6ï•qV½w8á’Ž_ö3—‘¡DÏ RöpÓd‡á~.ÖàËR“Eû?ø¿±ó­šK1à +v¿»1 ëæƒÙ(ˆ¼JCü +à+N‰Ø5ÚNjÔÐY›€¨áàݵiï+Zf;ˆ?Çåe³ÙvWà·kŸÒÅüµ—¢I¹ë´“F4{½*-5 …)2x¤iÎ#§·5ž.‰©sV ñº^ñ¼ëÓýªÀ›`õVÙÅ¢UR¸¼ûpœ“åæ41$ûFÐ8ªŸ8 lV{v”ƒîÞw©³î~¯ìýý«&À꾃~èôÓEKå½ây­ Dj”¹÷-vá'†H=~€Œøä“þܦð!UMÌÆ‚qzÝKs"œÏòçžNIZÇ&s™/í}‡•‚ðQE´¶åï¼1àE˜»×AÖö¹›€Ú8!ZŒ%©u4¶7×)-¹¢þxÏ ÌŠi#Ò},V{ 3ê™Lk0Ûd±À1èÙýåÇN@ˆñ€ÖXzdöi¢ð»†¢”YµÇÙ¹þÕ‚ÅmË.»ÎÅ)6>NSã"jú¦HËèË­LnE™ƒ¦üÂKh°ï_ŽÆˆ\RÙßC* 5¦ T(´eLjÔ9úÞÓ…eñrWtA…¤ÙlõtŽcKª¿ÔL©ÓšïÃÍCm á‚cÆó7ªÓû:³HAÁÏÑ×$k!å8Õ#[;mñW¨$¥„ÊQã]T”PpÎÊ©j0)¤p)8H‹Ûä—4ÞÌd9ãYVä]mze;ûµª.ò+ÜôÖƼ9+C­…ŒµÍ7ÈÀaÀõñú%B{PçÑó²ŒG>¦ï\8ÞÓ>\ùë +¾07ÙtîRÝçP{myZí2÷<ijœçâzxÒô £'2ºñÉþD–£,9tÞ±¾vR§ðSpCŠ%è²³O»¢‘χæhÇeUfL†öH)”éßѦ"¥2¦TVÞ¤Vx/>’^Ž³Š$pEÚŸ ºþ<˜÷|š‡+œüäî˜jlJ¢ÂKiMù éÝÙ—áø~‰Ò!ÖQ‡ü{Ç´ûô"¹HПc!v©+2é5ÍlqJ®‚MÏWàï3hŸsÞ:®ÕýT‡1›ãð1QâÑ?nÑa»A› ²¨ÍÜf§”RéTø§qÉíæÛ·>Åé™*QÕŠú™Égš¾p¸ãù€ß°L£¥ÍùŒ„Ê«˜½HÔvN„4'F ­Ÿ_?jw­í€ë`Dz?ú¾É¤‡ªŸ}¯? ]{•jåqL®tsµN!CPóÅñ5ˆÃ·Ì|Ïå~º0È žÕ iê“Ojh¤Jb§ =¯ÉŒÕÿ;Ñõ¥efÚU»oÕŠþ-gì©Ù¯–Ï‚ƒ‡ÐhèCÌÖ¼Á‹Xž 0Kvî5möAœáÅ\AW*£PôŒ~é_rqúõ§EÓ<ÕÔCvCX± ¸q`3'¹¤­„{èF°–$õh\..‡ ¤õc½ÑŒ â†Ù]ÖÛi ¹ýhIèu ü–¶ô#”;üÌÎl²k¾HSEb0pßÂéôÈUÖùz¶ˆ~ë> +º.F5|EKÖ_kßU­†Ä&“ó"÷•€äûdÎ…#æ›5åØK"20¬.Fí¢Jà(2\࢚z~"‚*X¸×”•›¹-=‰Œ!‹2 ZK …‹3…~`ÊòJ&qðmvpˆ;¢¬¬Õ¼}ÜtЈD½N¸Q/pÏÐ@Øy)diDÿD¡L"Y ^ßî/;>Ìûjö‚cÊP;É)>¡ˆD‚qL¢‘hF‡\§›:ÄzPªÂK b÷{Ž:bÌ_ÊúDÓýx©4—wB<ÂhESUÈyè,ºf=°jŦc³Ûb¤€™×Nx”ØBÞ.Ô¿œÃóoRKŽNMðͱŒNpt ØA¬¡â ϹùèÓAØûE lÞn_V~M TÈüð +ÛIX¨_QW:ÿµ ]úÐÀï9Lœ`]fd„ú1ØñœÖʨó™¢r +EþØÜlgøÕ_:jûìe ‚¡¡¬¯ 3"=%…m7áûìç‚=~WéFF× 4"K¬³DÜ'ªÑ?¶úï…nÞüú +M q‚8IoÜ•ªÅö›ÍL-Ô…`€ToÞ½*Pvz:N“x ›ÝžÜ™3*IŸeÀ4µô +;S9Á%]9Ao¢ÁN©‡’p6/€ôJš6:7õ"élÈ2îqœÞ܃A«ñ)Û«Â!F—?+Íõ­ÙV³d$7ÁÌ&áýWW(Þg0 ÎÜ#Úž8¤;ßJì­¯ý‰Ù¡L¹ŒÙOÝ5 oYÖᘠ+AÒà}…a™5‚>ÂÃNFØX4²–€žÞri¸™½‹…:'é‹NÎXªËQ±lC#Ë4’w‰ùŸÈ>ßOºÒLZx¯dTH‘™‡Ø*:ÑP=@[›CQƒi«m®þ²´! +ÚÕìΨWtŠã ?oAZdævò6I›¼)’þ‰èRUÛÌ(Á@Ú”µ²âa»¦Ð£ñ Ûå²ÛšÖ/ì¬ý&Å%é¾ACF÷êÏa¶šƒ;öùZjûâÛQBÙ„ãljÎYIN«ä…{Ïy|—hX®t²RML‡WK&q¨aEPjÍ–_ê›Í2ÒÙmYL¡£Ý§ÎŒrêgsÓ¯NãÚ‹+A׃²„7g¨ëÞÊN óké…%¦~aÝ–o¥­~F¼».û#3{9D«Áä1;â´æ ÍôQôÃZÏú8w&_a†¶j¡ã÷q ´r©>Ý}~9ÃQ‡“¹ýñQËöš‚¸¸ÅÒRß +nº_Ø;úáW„ZÏ(œd ÆÅÕ>¤õ„‹ÁêÍ¢*qöŒ‚#röwQ;£œjÚÆ^kNÿyŠÕzÁ tjY×rCD[")Q’£#˜Øn]Ìcõ(ð(»CÈ=g}¶F`³k940Œܧk¤ÿe:ä#_tRáY L©£½N‡íAKZ' KLH§£tvH¶ÐSÑe6óSò<ø]©k>¿2 GÇNê#u0UóQŽÅÕòK»/ó<'\`ÛyæÒ5êLZ íèÄn™çšz‹ˆÆL²˜)ÏvŒX¡[M5þÉž„¤´‚o®HõÌLg‡œQäzä<¸±5î6Ýc²±ï.U¨vÉM{bUWåL¼Ù¾Î,mxÙ*û+‚ikX‚â{uõ<„NZ'8ƒ,T¥~ Xè%{2Ñ/f>[µª¦Dîïö|Ý¡±šöœ©.q´Ÿ›l¢”„AMãSæKæí3r,ÁãZ<Ë›¬ïám)œ+h¯zìÏa~¥^Ø‹Yºxà½M67­ +}¾Q@°ë_Â! ¡nÒ q£^c7Nh?–Dbk]z‘Zøù·Íà[ÛX=mÅ›P :žž‰ÍW½G°tC#<áß×V Â'¦ŠÒyÞÄ1ò\ðÎòˆ¿ƒˆ§9&åŒÂT«âÞ°;¯oQ +Äd²’Ø[EÜ­°¿ÈÇ`n—ÅædþǦiBŠFtù£¿ mŽ<{ töJD|Ï;±Æ&G‚iþco§Àå²-çaA3©±W(æ‚2MYÕô(mò¤ œFã³{gþz&V__éa6ÎÇp›¯ØalĺÃuwðnæc"8¡n‡:Ñ!1w‡Í‘˜Ý¿g•Ã ˆ%ù[ÛÃÞI‘nÓåÙ–~gdº/~û¬ugÉp¡`ÁPþôTiHŸì2\)ÜЙÍàÿ®ºþ0æ‡zx)œE½ Úéq;7,¦ýs¸ƒ,ª‡izÕ­éü*ið¾\~]•mî§Æ Æ K•!ì†ß!ou4›¿›û‹†«ðw<«^UG‰/)cy¯$Ë‹> täCÔž•6rеð‚jåº)×ä; æC'17'IÙŬõ1:Ï–¼pV%¤»Ã +2°ÅѦyWýö¾¥jÖÎŒUËü«üÂ@¹,íðÊ&©¾JèS"§oóZ²,¢tëpbýèÒúc•û"i}„¦Z~K¹ŠX`i~l…`šúI‹%âù>ÑH—ÓVÒE©ÆÅU …ú©KÜÖ·w+ÁJS¼=öËŸ.Ç=|µ >üô=ÛŒ +’ú C¡ãa4Ÿ—7C‘ªÜ݃~Z¨‹ˆÃ©µ»*‡‚s· @qp![~_£Œ¿:[8&‹”ŽËNp€0ËtÃ"¤ü4q%¬i¨•F³høð¡HÁ81äј=Þü2¶ã³âL˜lƒK¯:ÏÂiåsB¢/]ûP6•[x² _#6}°Åf T¬…%*FųÖËÇ}Ù‘8?´Ï›P Ò¬“ê<7í¹õìÒÂgVq_î½ò±fKú–lFîkÉ(w(:Wâyx­¹CIBÞâ‚Û¨[NõbÖcpq¹Ú4j´¥"#žþs7¾hÐag•Þ^c QÔ'?ªæå´AÂÞÊ…øh¹(LMa.‰(<ûù ¹â¹®ÄÃä%ÄkëºT)ƽØGbª8Ø—ö×tà,D¿“¿¾µ•*Òš.S:µ›èY|Ùä'Fz„yÎv~lˆ²Ð…ÿþ5£àfâ¤û–¤A-í-³ñsEZEÄ÷QàÝÜ=‹þ‹ÑMTsî›?8á‡t2eVe&…¾1›B¦\q(ɽAˆð"_²ó8ŽvTD=°e™U³ÓÚÖ®e#"EîÍÌ-ûax‘Se¯;ŠF$­àÈY‘×Ç7¢=HÞ¯½~òp±Õ¿þ) ’ýÐ+PXY-x"yQùºì€ìCˆ«=³&o™ù…ŠÒ¿$¿Bb‰ÔÜ“Q80ƒÁ˜jU¥9Ãüró5½C£öñ²·Ëä—A<Õ¦¡1RÁgó[¼X- ?¼§µebÑ×k^6*Ù J ¬(І¦7Ü1)ºPïNଛ/r§t ªX¥õø&™ ¥ƒÆôÏážµÓfÇH­öõŒ’°.ÛJó9øP>µe't§l†ƒì1M¾#,Çä1¾#Ü­ÕÄš#[ÀN).·E¶/°6~ª§ˆÄ•T1˜ôY¶#ß:a³áI]ï¡‘g=㟗ì26®HZÄ+ØÃîk +z|~ÝX!ö×½’F`à[m”Ý»”}«SqÁM÷]»&ÃÍÝùԛꚥ‘ü…@ÏHÈúû Ónê +c—™XúAÒœü.; ®¯˜›'·Œ©½C›ˆ^zºnõâ塳ýæzI‡•f®.µ[bO\–äïoË2@c„ÓRvÛQ“5¦_nuˆ+ç±Þ0p%í(p“ ,\íqºGÞâ•ÕœJÈzpˆF­zè€ÙB+>„ iÎÞbcýЗޜ:È3\0/¡4ÜcàˆýÚTÑýŒ§m q¢Òß\cÇ úb{OhD~éì#­Hýð&Åû˜éì¿Íäj…¾d›ÐTC ÿcä¢Be({fŸ9¢z±í¯ãîí+¸ƒ»ˆÚ2HŸÃ{Y³ït”CX¿4±5=vßê „$òVëlY„ÒT PNóD© “¿÷Âá4¾4k[ç†ÙÎ|y©RøŒ³„‚KÝOsOsN±< –$õ ßO8,xìÔÝMSc1#ØÐ¥[±V¤Dæó:1lž ÔzÔ,•é$âλ›¼ôá·µ©¤C}cç +RÐ%åØWÔ糖Î;ÇOÏØŒI“ëöL%Ç’,úÛ¼F¬>žÜÁ|á™ôaײÍ4˜m?3’V=·_L=Rx;`‚i<’kav`Ä óè·¶²ú0 +pºs*Å"øVŸûå¦ä!¥`˜nƒ³ß+ó+ŽµÐ˜-”a¦¿FJá`éˆöF%†m„lï×Ñ|GÅ“ˆ9€lö,Îh¶IŽ¢‡…ÿNEI ýõ>ähÜ—ð¥‡Ôâ VG¯ªuIl?¦_a‡EÁX¬¬¡Ó]VbîÒ\ß0—ð&®Bs:¹¨k~`µ8î¶ÈÑgk[÷Þ–C*qÁí%b,ˆÍ¦Y=S„Ü›)kT}3ÐwZúY+Ì¿¸‰Z™ m@}‹å],×jIºJëÇ™Œs³mæ™!É=â1P1@\¨²5ãd £ÊÕ¢+ 3[9DŒ§Ý´º;A‘þsš-lFQRÒÀöÛa¾Övþ[A(Ïô䕨:>Üa$/)œ¦ÿâMU_q£ªÀX9ð(ÂÙ9Nø†Ó3+öš¸wQžugGвeŽd‹@ÂLkZÍöç@QvÛ˜Š!-+¬d±ëO%è \é¥&û)Ë£zÝ»èëvÁ10 䘰²ÿø£T7ÞúûèÌ›ó÷Ï eN£Ow·OªCõ§{gW¸¦u‡3Ž«›°ž¯uÇ*/[ê7,›¸GÜ°”¿¤Z·R ®²¡Ï”ÊÇ‚À“É*ì5tõŠQ,öO^ÇHO‡^!VçnõYç†ã2?K0eXËk¦·zy*’"\ü®æj‰¸gFÓïiêC.Níe†Êë”–"—²a÷4TÔîÛϹÿ)ÂP~CMH” sü•cň$çi~}c5mDÍÚ64òÀG¬þ¢ÏsÒœ¸—Ò¸×õs† ¹žGîì¾íʨ ¶49×ÔüɆÿ»–21“膞„P1Ün`‡\¨_RðbèÖ‡èΑ6ÂdÙ.ÛNã²êü–û:ããœÀË<2¹»ì¼‹¶Q†.j”¤ãôiaŠ(«Ť{+ÚE +çøx£ƒ®Ñãz#ú€½ãJÿy‘ÃEäºF•“Róª»ÿø†D¯11tü@Ct´Y$Á¼šGj™¯%?¼äX+å•?L¤ÔÛ˜‡Í”_´Ò#(?Êô\˜ã@¨nw"àYl™À<”w„ÙY)ª5avQÿÊ%éömŒ—êÆ5=–AâŒ*$$–-Ò{OcŒËüŒÖ3n¡÷j¦&•3ì£Ç€ÄY+÷U&‡Zg\'ãMnÿ@÷W¢4’: zvlAÚ”‘…‡’>é„Üo¦˜Vü_Ù¹šÇ};*ˆux’ÆC,(¨ƒ|ýÜñ¹Ú÷zw¹)ç`‚‚zÂÐg\ÔMñJÿ¤žÜɆ'Ž§¡j9åÛôWÙM¶¬út5àÅWª˜»ž›Eþvó[rǺ4®€Ü’™`h—=¿©ÆôB•š¹ÍjÂìI~ •[ak‰¸‹ +£fÍ6•9í]ØTÉ°bµ÷áú1K/š&‘9€‡e×¢hœj4Šß.Î[)Z +dCŽREm46¬8Ó¥N¸ «Ô6<É,ÆÐÍÉÎæi:ýx(¥Ët8ÐËn ÿ`’®! ©›86·§FåK•5JíB«×½VYg©»,&à1:¥ËãŒ'„D=lï«&è©IãQ ¯€äÌWƺ¥„RÒŠHw²ˆsë&üÙ­kèàûmïyoµ©ltxebmHçfïêïo&Hì*âj¦Î¾kÒrX›0 — ó=è^›,›.Âå˜/Z—[’áXýõ~™?4ÒxÈÙ'€äñq ´¤ª^JÙ[K™†OøHÊW|Ý@yw³IÉ:—ˆ™ô U-MÎL áÖœZàZÌBÊíXÃ6‚|6å˃ÃçÙÚœ—äºëZ£ÇØų%GÁc‡0Cüs‰ö[}‹#µ\ˆae¤Ãú4R{ ä{ÙãaË4#ôbÏ7áÅÂ…z¬«@½‰ FC̳„…žóc’ÒNÜ4.~4\jtÑõœáåxþ;²![EâOB ÆwkäL•1Ó-M‰Ë㤶@fõ$²&©U"Ë*u A½ +¼ë0å ®ÏØ¿îZïܪc~[Q7µê4è©Hšñq‡Ôø°7ò=­³ž‰’ §™òÆú˜“duˆ?ÎÕ+r^9kæÖq槜a^NžbÁ:ÐÞ“ªC=>JÅЕd›dg‡¼]ÕúˆËz@øeaªCšs5z Q/FÐé­Dú÷8È«âX²D›íŽO@Ñ% U÷Méd>kZ|èdü%ÎÐ?,cYÎMw5ÊÃÃP|øTëZBŒåæxM~`Ô•ä×P +Ïoé†-Ë»ç² ¹ Y¶ñ­Î±‹èÞÛ°ëÙC¼aŸèß7嶸מ +뜻%CAÌ‚¬UV´‰Maü€¤Ï¹uñçó„áÜêÀ:œð؃CÛ(|#ºÉ& ÇëéòɼÏÈ8GÙx被 Š³p<BÌýÀ«›[¤Êñ+ÇÕ˳ž8b׈×[ÍT|­¥#NùæQߧCW;Gˆ|SmÿFÞÖil±^õãþ™ef C¹‡¸·á¢y JòëL;˜L]¸îÙÙeÂAÚbˆPAIÛdðIÔPîÅ¡êîµx£x¤ÀvóóZVSshö†ñ<(ïmýyh·-®Í䦊ŽEʼnqØ•!fmÝSÚ‡ðËZŒóÈAöÉlxýJ|Ÿ¶q³åT ÒŽ4˜Ìýý—HUUmnˆ øCWÜ]Òï[÷²;ZØtnh3¦œ¨8 ì.(Ðë[Ù_ô~{hRÒ¡tá%kj†)á¦U12Óx±g¥×_nŸò‘±q»ÉWŘÄÕÜh95Ýô릆‚˪¿´¥eI]"è+©$jW M vžÈæ ZTb"}¤ªTS ‘O{hŠ?"ʲ|kêz*uÖqÎtR‡c7J—‚5ø Z‚†R +×·³÷ŒAÿÞ]ÿ¹:#¥µI丙û@òñœPœ p9EñxŒ9"úˆçFëÒ1“ä2cÈÝVâârÌàOÜ>KÖ>uÒ»jì¡ír¡Ž#ú$ÝQoë <µ ƒº²#×_›Êÿ~†L²¸Q“Îxêœ-ñ9t­@i_Àš9™’»ÂuŸîçrÿ +ÑÅÛ±åprkBÙûCzÆaÑÓ3ëÌ"!²2ö]3¾v{ÌÆY­»G «Œs» Oå×náR¤C2¾&`ñNƒ§Eƒ“\ÙÍ9È&Bê.üŒ¶Ù· nRV'“BV’äýáú%h:¾.l¶CÑy%4KÉÂTÙfÝ4„T·:ùÔÖ4_'áULšj€žXËÜý¤öiû ÃÆûêç”´c§=`²¨øqªe˜ßC´Ü¥îóÚlméòùfôæw Ñå#ÑÇ’tx³%;$àh én÷ý ‰7pP0OÇI¢£§f2TûvÆafÕ4Qö“ ˆ,‘XûÜLܧ–zá_ÐáVM¹‡¦OšdvÉDþeQܪ#éØ©èªmc…PðQh–ȳç%w"?/]]‡iîä-7.ã ’ÿ¦VÆ|K‰bÆ”`ˆëF¡·bÈÑ¢-ñ1Œ¨y4T,}ueé'ÊÇõ»•ã Nø0mT#?[½ø<ÿ=†C³)õðœC“$²h,™#O±Píe8ÒE(,–# s¼zMÎ)0Ý‚³0µÀ²DU4–;ÒðÕ…1¦ãŠ~Ç0W€/MY$g´™•A-5 Òþ 7ãnîS}Ž@N:°óï3ÆúZ½Fõkwy<Òð‹÷ÜhŠKÏ=s+8T¬ªÈáö@°on»ÕÜDük w¢ïž@8'ïop°ò›KéC©ºyϚʡ½ +H¦Ö¼9Gž¸M‡ôº„þP¼¡ïÒ4Š›µ.¾êJøiˆG•Ä$ …hÎX÷lÕ-DÞßÍ›á/c;§Ü?‚Ë¥9‡l®Ñ{Ä­Æ»òni†n½$›B×:õÒ©~’Xvy x’9c…Y + w/¼ÞU·O§”~EÁÏAç8Q•|ðŒGÇ=gý9,?YÁ2Ë2L"ôÄEñK‡æPüÚ÷AÍí"I1„'{†§³ úº¿¯c¼NøŒß_lbéøûö— m„nĜɫí÷Zäo£‚³|t0ó>ú>S‹Â™ÔRú—°zaI¿ î%ÕA˜">© •N~ú‚×-† ®2-QVçh-‰úó ýÞpܹâÛ/–¹"5vÎf—GWnT66þ8éô^úÞu¾4+k‹O5Q]¬NÙ  ¡-ël_M¸k˜ÚûAú=é&;4³áhgVå°CºìÞÃ5ÉÕMå×\Æ»8Ô\¬è”&fO³úÇ;^‘RÒ.æ,S–¼÷ƒ`÷‰†¹¼3y°f?s&†ñÊ; WÙ,¼K#«©Ù¯®øbj[¸_VM2ë*BWMŠ¬3@¿1(Ÿ¸éŽ÷ÏÉXúŒ¶UÑäDär ÷ñÇtƒ7Õ‘l g h/‚Ÿw˼¯rÔú'‡cÀUµÁªqFÜŠ%ÿÖi8ÉÜÕYýXò³+~¢‹Ùäûó¥rkHú¶>O­ÐÑѤ²v†1˜#°^:á?Q7Q¥×8Tnn¨tÑ#œ6nœlÕó Úî×îŽq + Òo)³S™2áØ¢c—¶FäKa·\®ó*‡©‘@èž›XsIÅXðûh‰ðeýÖ8%W6¤¹¤‹»Ü²yÕŠ½¢uoUêJP'mͧésŠêø?¹ÄÆŽÞמ+Ü¿eB*£HH:`rÀL]¿ºH.âØð~}Êη¡>¼üHÇ8š½D ýâ.ºQÞùÎ_]Ì—%×Ïت3©W$@2?d…°Õã¾Â`¾²ß³Þ׆>xÊ:ªÔý°™9•YæÒÊßÞñ˜¥ãë^:?Ü'°‡eIº¼¨-„~ä˦MÕ7W¥_ÓÞàÁ¥MxqÅß)w¾€Ì}®+È Á‘ÄâGu™.­Y6¸D£‰ý}KCîý§WçRPn"8U+Sœ÷ÂøÌûyvÝôL½3ìüî3QÁš\É–ä>¨UHC{ϊѼ•€Q¹!÷Å“÷.¼?;L9§ZšÒE¾é«v¥Ž}03|­˜6þ–ˆ¶9£,whœ-ÇËŸ­×;?zøpÙÍ„y8àŽ9Ë¥H»ÑHîÍÄû-q˜˜\—1άÄ.5HLUcß|{¨8óŒòZßÔç`äô³ÁPß½Q5åŽèz”=ûŒW0zúU÷Þ r còRˆžÿžDCh-&¦)¬u#Å>"1™k–ôÿ »žÍÌÃá±N”vD#¹¢A窠›`_ÝxXÒÈwgÞ„ÏÙå 솋ÛÈK+´CܦA"Ê +âc§x~XÃJo(¦cé;‚÷ÿ¨š#1âŽøé}SUx °f=”4+ÿ䎧õZ›…HK0 +—€_úØî*Ý– ·£ý7<³Y6ªãvl¤ÎݱæŒú‹Ù¸™‡ÈÈc?m·Ò†h¡ˆÕ©Åç•¥RäÍ×”»L|âÊLwõø Ρò°¤¼AçYKr¼Ï¹ÙÖJÑkW½b%òyQ·ŠTæ9æ‹Ló"$N¬½ôž‡9ȯòL¡åùö;û¿ZÆMú›¦Ýj{wAÆILTI¨£%èÔ&ëö…ôâÞ %§½(1ã:«/h•¶µôÕ9óUÖô”‘­Í¡i¬rÝxUæ¸ÂÝPÂ#á61”#,*@Š –üb±·Tx8ÙÄç{ëG79yçÐê°ÀCþ“væ$Põ`Ò匀V–ƒÿþu6®%…Ùqc†¬Ó:†wtÎì•NôwØÒPÄv©*û&<û'ývýЊâ¹!ÔA"OýMBð¼"ðÛQܸ…ÍK) z²>Ç'áØóô-oâŠÌ#°±ÛÓ­ÀD/&Ësg k7/;ô^D÷‡ÞKÉÁ¤ ŸCH-²oS<ÛõCoõšÂÛw˜´øŒª"ØK–_Š­"H‘¬ûVpÆsáõpa¡£_Ì×SÈÚua¯õ°Ü±l|ÚV±{+ wókÎ:¤6= s÷(HfUôRê¸zP¢[E  ïcYÄEùºŽsûr~3§Ÿ°3ŸMÆ?å¦T‚°ÍZ5ÕèR˜±˜rL‰buO[ˆ`×w\ÁU·?‚‹œWà&ó+Дzu(“ Ø!ÌìÅûR% 2ú§8xdßÿó <ÌЃ|Šˆîç }®rw‚RÕ:Mp’òÛBÿÉ]˜RòöÖ„½®íX((gÿ¶Ä?ɸ‹e»¿è­ÚXÄ`]¹#ƒÝ’X—ÕofQg è¿ÏU„»7­‰¥äœ“sõö‘ ý£Ëw5Y¬•ÓaM(Ã]Fƒn\^¥BW¢É–Œ~3 +ܯ*ù V}ÒD¦ÿôð¥ÎÈ +}ˆÒçq=G/¦8õ6ÙüÍ/]Z?ó{P>yêU•œµú}éË2&@žÊå:Þä®þ;TÆ +݂Ư9ÎÖïSftt7,-–‘hV©©< ®ÙÒ]+,àŒA‡Ø  •;…ÔzEå]þ<Ïßý‹Ìɤ C™Ñ6ïðÖR®{ÒºsŽyZÍÒ+±êÈÜôÄk´ѤFÈZ‰!FÝmP€×:%•éd +Ü)„lk2'¨ á"€”Öó±âµ|syùͱÕe€\ûÊJ;YýMªI­‘_£ƒ~Æ1bfÓõÝd=–ÙþÅ|SÅ=UkΫ +S­‚DÍ0 »(ë%ªUÎ17%g:F‡°ÞZ?{¡ßs·1SÊ« „]« +G7ôæøÆnuÒ{«ýef‚‰@ÆÚJt'D©Ñeèb ÕÓþÿkŸ,ÛšŠ( ¢Ä’n¤Gw3pÔèÝH·„4 I‘.é–îÝ%HŒîîÚ{ÿÃûí>÷ü€óá<ÏñÊ@J>N‘÷x°íþ®/Àï^ÈnÙv®Q’U õ×=[#Cã]6öçÑŠŸ‚h& ’Œ# ëyƒòk»6úq +ÅGÕkX:gׂ še£¤xu®ôØ\CùqKå1¦g ¡lø 7[Ù²Ì4Òÿ¹[PÞÿøç¥ÏFÔ´²ÿšûI#pŒ"­ªºóöWwxN¥&ÿÊYGúéÆ„¾åoK?\aùt@½=¥¢D#UŠ&ÐmÂ΃:Kó#˜´ÏÙf`ÃN¯Ú¬5}=ÿúfy$V·‹Id”-é%#©¾¯{z²5…رF’oö¾!²’»÷ØIáMØïä†H}ØÝÖR´x`î/Æ]è›Òª^3±Í7é¶ûñâ¬Â^µñŠ +·(FLH³~å¶ÞÖ@Õ6Jäó¾xÌ0V?K£ÈÕJÑ}gy,‹¨†/ã©$þ¸Ì~“Æp\!#…þö/»-ñæ –Ú3Uv+l•EM ´Dýý_O‰uò!÷¶:) G‚·Ñ é91¬ÄdÐ~í@§q&±ÑŸ<¹¥ËŠ)üÁžjÄÆpîp ãO`6ÿÓaÌ€“Ê ‰bœ›³ƒø*Ln•OA‚+«ä¿dWÍXäøkÚ—­ ÞÎÓÒU±?*›¢jžêß_ ++µ¸¹­Cí­u†Æ…¥v‹øò¬WU˜}öÔ“LÂØÏÚ(kœ¾¨RoiÍ^$Hé~ÒøÈz’T ñ׿·xû0­®Åψ_ShúÜ2\o­EŠã¦=U´ž$¸_N Ó–jz͉Q +Žò2Oa}=AÀmãUv”'·ýÆû9û¨,Yó‹Äg“ˆÐ‰$¥°®ÇªÍ3|Zí-Ä +ïùnS;ÝŠM‚­fˆðÓ%¸<%kDpu47û95%–T +G“¢æ×*T‹J<Èü«˜t‡'On¬ÄÂ.ÚrÁ.0£€w=J/ê_GppÄÒ A߃Ðd=F¹­ÖO-ZÁ 9†àU‹¯ùsÃÄh #a™jÔì‚NÌ– tNcñ§VF¢ïÎ{Ȭ¦ˆUŠñŽ*Cs~ö²sg_ܱu™É¢QªÀU4“å²7+ç!|¸`Të‘…>“¯7º–s™as¬G&S]EHøáWIÁ`³ “èÖöAÊ;ÒteÞÇ¢œauÛ,>:.² +ðž¯ÔÏ´ZÕ׈‚œâ^ž>ñ·!eÖ²ØäÛ¶(¥/J‹@Ëz ¼–F]¢wò¿ÝÓÏõwÁ/…=£ÆhŒcsËtö„t˹¢Æ1|Pú1—ŠR,·²ÖÑï„$8É +,f¬S¼‚Ô·Nï¡Ó¡›¾¼xœñÏ‚È¥éJ#ìKÛ1íü±SŸä{årsê,<+ö‰ÙöÙœ¼U1*µþôD'î¿ð|ÂBÕF5Ç .‰Õ+‹f¬æ-åuÝÓ±oFã”’zeí­ðÓ„A Ç«á±™—KØ+·,V cšðôŽ­/EþrË‹î ×öëMƒ}#j€œ§Z¬R‰¾^¢/dõäx”z[]ï9OµÈŒý/Âæ7¯>’òT-)AB鈢C• §x”ï±IàI稂i¸t¿@€"JUîU}mÐ'sÌ’™ž,Ð~bèºAòFKEOlÔýðp€.Xb¢ùçöÞ†£EcÌ9¦È<üE¶0mª¥±|ÿléæ3‰•Ïý="þØæœÖ¦wÆ:—æˆà#!¦%Ö§’\Fj¦¦Â‡ÊIK°';Iª…¢ö}hë­w™å9²T¥tM¸JÌtü‘á,H‡î"ûDHÔz 97qtÅÝÄŒ‰ÂuØ VqtîÁô™?'¯`¹NøÊù3²–œGÜ*˜é²HÚªÒ ¾|W]ò {êîTõÌqý]A÷,’ùÚäÊÖoU¯¤h¨,Œ¶‰wnmƒk¥ºþ Þžê|f¿â‰™TJ8‡6¨Š5¢äÇ„ãÒ¢1,Ôlvˆ^Ìýµ•Žã¦!ã½ì Z¿ÖæÚYôšÎß×b&¾¼ÿÕ‰šºCåu‹Îø{é±Âf¹ªÛy¡ "|ùª<ärÌÌ„)=¤˜ï0gxÛS°^Ø«šéqGGÙàèá´àL–{ù¾±~û™ÓwéAÆH¨º…°íMÊe:ùf> *®b&¸Fd!$xöœóhú¤ýGr55õž?õ'GžLq ú¬ÀœÖÕéž´AA´F߃ƒCÛw ´VøsÞkw{竱>·0¾8ÏöÖ >¿ô=Hq«•3õ¦x:ˆé©d9QL ­þ°¨]Y¦šÍ"±J[^}ÔÊåâÍò"5=4Ÿ*«cuýiÛë‹%ïQˆu8aA#&S¢"\£¥å^u›ìèès² ×CbGó|cïî•ûl.lض²¡5·•Ÿò6Ëü¥“)>5“ܸþäc%Y ÒZ}ϲJ¼G=™ì f¡»ínÈ!Ò[\ŠÒ^H0©mÄõ˜Àw'¯E¹íTŠÀ—±¶À˜•«qRð}øù[õ{ñ½ÈLðƒD߶ÔÐWd6¬!Í<ã÷é](XâJKR +K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW¶ ¤¾ÌÄi~=úï°VÕõZ5dw0uÃ{+M VÅkzÏjG‰7¸zb4@ˆKPñ±Ë6§ð]É"‡ÇÂЗË×øVà]ßQè³ø%áRˆ¥¯>2àsÙsÍ@ü+§hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤Òøɉ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl +s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ +¹ƒ%ÔÕÝÙêjýákáüendstream endobj -885 0 obj << +895 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 2 /LastChar 151 -/Widths 2103 0 R -/BaseFont /NHNDXP+URWPalladioL-Ital -/FontDescriptor 883 0 R +/Widths 2133 0 R +/BaseFont /EUFTTG+URWPalladioL-Ital +/FontDescriptor 893 0 R >> endobj -883 0 obj << +893 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /NHNDXP+URWPalladioL-Ital +/FontName /EUFTTG+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 /FontBBox [-170 -305 1010 941] /Flags 4 /CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) -/FontFile 884 0 R +/FontFile 894 0 R >> endobj -2103 0 obj +2133 0 obj [528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] endobj -790 0 obj << +798 0 obj << /Length1 1630 /Length2 15892 /Length3 532 @@ -10157,7 +10307,7 @@ stream xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå  ùËAKOÏð_–\¦^ÿütYÚ¨þ>¸mí€ö®)þŸÕ€@€«`²Ä””ud¥4RŠ) =ÐÙÄ ìfj 2ȃ̀ö.@Z€…ƒ3Àöß €™ƒ½9蟭¹0ýåq˜\f ¿a@O3 ã?Àèlrqùû ¹,Mì]ÿöÀÕ²7³u3ÿ§€¿v ‡äèìð×Ãî/ö—LÙÁÅÕÅÌäè ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.W §ë?¹Ls‹£­‰×ßÜÉAÿ*ÃÍdoù_0œ–&Îæ¶@—¿4¹ÿéÎíð¿íÞÄÑÑÖë_ÑÿòúÏ@®.@[ &V¶¿9Í\ÿæ¶Ù#0ÿ3*2öV–ÛÍÝÿs:ÿ«A4ÿÌ íß"LÌìm½æ@ fE׿)4ÿo*3ýωü? ñÿˆÀÿ#òþÿ÷¿kô¿âÿ¿çù¿SKºÙÚ*šØÿø; øç’±ÿ?¼Mì@¶^ÿ7ÿÿî©üw‘ÿWW“¿­±·ü+ãW&–¯ÿ@.’ O ¹2ÈÕÌ -`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYSWMSG•þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï +`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYI\F[R”þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï ™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖµ?ªª…¹{G.ž'Þ½µ$5õü^oDÌÒ’j8Á¬R/ë‰yÝ࣑<Ì`½^ úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ ¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ @@ -10219,35 +10369,35 @@ MI ¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£ cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …x;³°çlqf—š “d79˜R€2õ¨)iµ†–Gö»€ê&‚—ÜÞ¨CšùŸeVò]ÏÓ~„ð¡T}îY¸dë`XÕìéÎ<òe JË»1ÒXê¤QáÀ#÷gX¹;«ÜÉà{}¤* ½lÈ»€~.ž©kÜõVÅÇ®þÒ€§ú‘7ã$o—#€àkص <Éâ{ -¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,ÊæüfÔendstream +¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,ÊæªlfŒendstream endobj -791 0 obj << +799 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 40 /LastChar 90 -/Widths 2104 0 R -/BaseFont /VZSVYR+URWPalladioL-Roma-Slant_167 -/FontDescriptor 789 0 R +/Widths 2134 0 R +/BaseFont /ODIXFB+URWPalladioL-Roma-Slant_167 +/FontDescriptor 797 0 R >> endobj -789 0 obj << +797 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /VZSVYR+URWPalladioL-Roma-Slant_167 +/FontName /ODIXFB+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z) -/FontFile 790 0 R +/FontFile 798 0 R >> endobj -2104 0 obj +2134 0 obj [333 333 0 0 0 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 0 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ] endobj -728 0 obj << +736 0 obj << /Length1 862 /Length2 1251 /Length3 532 @@ -10256,48 +10406,46 @@ endobj >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2%X4-wDP¤2$H20I0@¹,P ‚A…ÊE ÒJi½ ”‹ÁŠ‚§F„‚Ü4 +æ2%X$-wTP¤2$H20I0@¹,P ‚A…ÊE ÒJi½ ”‹ÁŠ‚§F„‚Ü4 & X¹ê -ºè±KîþÚ³3æ}žç{¿gž÷;ç33ñð&8²‘ ØŠ ¤N®ÞA2É833'†ÄA2É833'†ÄràqçÖÉÚ¸¼ë;Y·î¹0=ð"ç4sÇA;hš}„ àD(Vž#Ž-wUÊ£úìùõîéMþÒ'Æ©¦)fÏZ½Ë¥3i±†Ñ¿ß ÓÄßIË(žùÊ] ×d̸6p[žt]IÊŒßÛhìbÔöКûrs›•›ì£`ò õª‹#µí!|~®S^«47—Å>/‡B jr÷<‰ -ÿ®~çœ>#†øEõ©ƒOKëåÚÝõz î®»½N™/ -µÜ:4Ò(®’+³²Zîñ1~xܦ£ûöÞÒ‡ñ‚÷t ¾ýÊ3 —á9¿ÒÈhcÍ~eV”žÂDV)äqNkÏf¦gx¸yú}¡w¸9/)À=à™ZÝ÷¼âirfÇØ–„1_u2óxë‹Á «)Ѹ·6ýbW©_Š¡y$|±ÁÁf¦@Ó±üÌzSä´ß`ø]ØßÅ-LÎæFM¥žýÍôEÜà“ßm, -!üm94¡ÜÜ—=7âjp¢ŒûLé^g_]flB쵧%õ„DàPYR»rÍü ëÀÎCûîSŒÃ㲎„™xh躗Ë.Ûk'$Ô\—-”…ÌîЉМV*¦…­FÔ=2À5½[wì™üPûR×ÈÉ?ª)–’Öokö³ïOWûlzyàYC?÷£ÐèÎú©_†çÍVS¹Ëúä—pïç7J¿üñ·¡ÒÉðõùWoʯʉ΄։Öþ›E¶TÅÑ“Êk•×Ç$ 7ìÍe$å-ŠOÂé,¶ižï…ÔË*‹GUM=uó)ƒ¢…0订êcú<Êyê<^a?YYêOÿÔ{߯qT1ç„ãó_N’^'v?רk••ù2ªR¦¦K´Z_oõÈjrÔ“ÍYY2(Õk$ûš @šÝî~Ã{8sç—Úµ¬÷U$FÛéx7:á,?ÔyòÓæݯ¸ùOiD§È‡‹øÄuþ÷T«TêSFaô{ò€Š1b]aÚù_Ýv*S’ç#¶ä]k¬Øu ÙìÝò€vlÃlÓËD Õ7™U¦«‹ûJ*ƶábuÁÀ$ñö²×p}Â(5ñiQBCG¸ÇÀ\—$§!7!ÇM~9Šœù¸)ökµÑ)Ç÷D_uo€£ŒÚjnÿ=Õáh׺™;wáÔúBÙ˜‹jU´fŸîNç²QÝÖ…Zöî–[£!CŽWµ$Aü6ÍŸd‡š@Â!ß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ˜ú`v«ç íøT6Ý1¿é0S x}Î䇯£Ž¨Fü׆þÜ×¢¯ª«;rª³+Ù7ÖÅt®]šrZ9µqg{7áø®l÷GÌ}Ÿ3\NkôÏɵV'•Ç²;Bêmиƒ’ž˜l/^·`m`onç=òøàþßà¢vuC¨@h(î_<þuendstream +Z$eñaÖâÔÄ‹ì2AHAXæðŸ 2ÃPˆóaΟaë7ðòÐßᶡï, `…Šøˆ»ÿ58‘F(vÁÎû´h4jÌ¿ Y……⥳‰Åÿ¶æð°‘Á°fáz»–}RH^urEìgçnÿIëE[¥ºW³Ù¯66ŸÇŽñ¡žõ2 —Ž+¯—ãCúŸ³ìOꢗ 2ÜÓ¿œ.ѽp%­¨Ü/+žÚDìñÁG&¦ÉÖ¼²2eÊÃœ*øZiHoBžùfÛöÞémqm:gÙ*Æ¡ssƒÝÚ-½OXšn¦õž×x>ràqçÖÉÚ¸¼ë;Y·î¹2=ñ"ç4sÇA;hš}„ àD(V^#Ž-wUÊ£úìùõéMþÒ'Æ©¦)fÏZ}Ê¥3i±†Ñ¿ß ÓÄßIË(žùÊC ×d̸6p[žt]IÊŒßÛhìjÔöКûrs›•»ì£`ò õª‹#µí!öÿ\¦¼Vin.‹}^…Ôäïyþ]ýιýøŒâÕ§>-­—kw×뺻îö:e¾(ÔrïÐH£¸I®ÌÊj¹ÇÇHøáq›ŽîÛ{KÆ ÞÓ1øö+¯€\†äüJ#£exðص0Š–©¬‹fdþå—ÌÕåkE%›D%ãÇéýGÁª]à}ÕxÆáœXæ$3M/7øjŒ#ÇÛUY6o”ÕéõÔœ‘ÉûtŒ5û•YQz +Y¥8Ç9­=›™žáàîå÷…FÜá漤€gjußóŠ§eÈ™c[Æ|ÕÉÌã­/'¬¦Dã>Úô‹]¥~)†æ‘ðÅ›™MÇò3ëUL’Ó~ƒáwa_·09›5•zö7ÓqƒL~·±(„ðc´åЄrÓ%{&nÄÍàD÷™Ò£Î¾ºÌØ„Øk7NKê ‰À9 ²¤våš'øÖ‡\îSŒÃ㲎„™xjèz”Ë.Ûk'$Ô\×-”…ÌîЉМV*¦…­FÔ=3À5½[wì™üPûR÷ÈÉ?ª)–’Öokö±ïOWïßô:óÀ³†~îG¡ÿÐõS¿ Ï›?2¬>¦òõÉ/áÞÏo”~/øãoC¥“áëó¯Þ”_• ­­ý7‹l©Š£&•×*¯InØ›ËHÊ[”ý §³Øþ¥y¾~P{D².«,U55öÔͧŠ »Šªéó(ç©óx…ýde©?ýS—_ã¨bÎ Çç¿œ$½Nì~®Q×*5*óeT¥LM—hµ¾Þê™Õ>ä1¨'›³²dPª×H\š @šÝî~Ã{8sç—Úµ¬÷U$FÛéx7:á,?ÔyòÓæݯ¸ùOiD§È‡‹øÄuþ÷T«TêSFaô{ò€Š1b]aÚù_Ýw*S’ç#¶ä]k¬Øu ÙìÓò€vlÃlÓËD Õ7™Už¦«‹ûJ*ƶábuÁÀ$ñö²·p}Â(5ñiQBCG¸çÀ\—$§!7!Ç]~9Šœù¸)ökµÑ)Ç÷D_uo€£ŒÚjnÿ=Õáh׺™;wáÔúBÙ˜«jU´fŸîNç²QÝÖ…Zöî–[£!CŽWµ$Aü6ÍŸd‡š@Â!ß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ˜ú`v«× íøT6Ý1¿é0S x}Î䇯£Ž¨Fü׆þÜ×¢¯ª«;rª³+Ù7ÖÕt®]šrZ9µqg{7áø®lGÌ}Ÿ3\OkôÏɵV'•Ç²;Bêmиƒ’ž˜lo^·`m`onç=òøàþßà¢vuC¨@h(î_EÍþ}endstream endobj -729 0 obj << +737 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2105 0 R +/Encoding 2135 0 R /FirstChar 13 /LastChar 110 -/Widths 2106 0 R -/BaseFont /CWTQLU+CMSY10 -/FontDescriptor 727 0 R +/Widths 2136 0 R +/BaseFont /QQRSYH+CMSY10 +/FontDescriptor 735 0 R >> endobj -727 0 obj << +735 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /CWTQLU+CMSY10 +/FontName /QQRSYH+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash) -/FontFile 728 0 R +/FontFile 736 0 R >> endobj -2106 0 obj +2136 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ] endobj -2105 0 obj << +2135 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef] >> endobj -725 0 obj << +733 0 obj << /Length1 1616 /Length2 25334 /Length3 532 @@ -10305,7 +10453,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNMMB^TŠêŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ +xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNLITBYŒêŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ üPˆŸìá|ŒRbQ»š€ê ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””s Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W WâãÆ[.¸N5ÈõëZS† @@ -10399,35 +10547,35 @@ A ­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬ g¤£Ê¾2f~mû„m}…i¶xÄãæužÙÆœ»‚ÙüÂx\Ôt{™C Àåò ›ËøýÈ·'5' ªzqvipd×kµ»¶j©@ƒæ…:Íw¾?bøàôVs,%ãIP¡ÍSÃ…„A³ô‰ìDª`Ïûñ,{r˜¦fY—AÀ˜EÏ¡+LNä^õ,¸¬Y¼B™¡9ÛœÐç†dbTC4è¿JLWl©0Âkž ^¸ùT›Úò«¾¦ét«§^Þí§/‡3SÄ蚇dQœv(CÜ쇵È%#¾j0Æ7›5pEZ‡ì—,í¼éÀOÇéÃõ¤¯(CæýéZb4üÁP”™Γ{5Þ…k`åùÃJÙãpÔféAvs,µp̈Õ.¨±g¸Ño¡µ°±P9:Ý,'c|Ì1eÁh†M~‘fQÞúûdú9’LÈúôÖN0–"/Ó|8׃ҿ]‰/ óûÚûس˜z$©Ôü³[<~q÷é#ƒä2 'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿?qEµÀ¡Glq_åOÎ1ŠL$HülÓ‚|²ëÅ›:vÐ Ø›¨†À<¬è2ëg8„7ë%j ÅL/ARWˆŠmõƒÑ ±)Cðî&œ£Ò(q14ŒED;ÌjdW åqêÒÚ8ß'‡õt˜{r›`üz$¸~ЗV-ðr#QcªžÉ¹=H­EÍëCóIîÁÕŒ–aYÅuz8UG²þºÝ¡HJP+dGR]¤IؘNd'×DóN'é[ºqÆIÒĵF,·;Å—d•”©7•‘W­_ˆF®kô­é¢á£tΘ ~­ yTjænUÀNöÂߥ6”éŸì¶\e>:3‚t{ù^÷p*kõ!1ñÖ3«/¥tŒëÖÈ|æeWç¯ÛQ#`IbýÍÃ$ŒPÍXÉSKUŽž¡’` ËAÅžþ›m­%N©ò’÷Y ¥Ê¡K_º`ÕsYGõ¾ìŸö¨,4ƒ“³›¯HC'Ÿû89cá[ã Û2?ÆN¼ ü±ù#°¥ª0ägã¶,Š¢œ¡. éj”¿ê?ÉxG# Ò+“Å.ă-†cå-Yo¢UÄVõñÈö15Ò»æ¾Ýc@@íéíAŸ LüUÜêÏÉ…ÜÔ¿©ÿÌZÏ‚ñåÎSUn9“mbµf[‘€Š±ÑT8D1¿4г#hqÙך½E9É{Ь¶uîœb…M'­?/ÖGÐÿéε%¨˜Gš±Ñ3 ?hßó¤¸þa¶„çŽØyžÓ€’^`´ý×Þz\‹÷¶v«áP{ÑÑ•Ih~×`5»æ0ïfM…ÂÛ -ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶û?s¹Kendstream +ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶ûG‚¹7endstream endobj -726 0 obj << +734 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 2 /LastChar 216 -/Widths 2107 0 R -/BaseFont /WWIPFK+URWPalladioL-Roma -/FontDescriptor 724 0 R +/Widths 2137 0 R +/BaseFont /GSFITG+URWPalladioL-Roma +/FontDescriptor 732 0 R >> endobj -724 0 obj << +732 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /WWIPFK+URWPalladioL-Roma +/FontName /GSFITG+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblright/endash/emdash/Oslash) -/FontFile 725 0 R +/FontFile 733 0 R >> endobj -2107 0 obj +2137 0 obj [605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ] endobj -701 0 obj << +709 0 obj << /Length1 1614 /Length2 24766 /Length3 532 @@ -10435,7 +10583,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:MAaQiªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS +xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:Me YuªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»šê ÿ\%ý}þ54>:2Ü{Ú„M•IÊå KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó#\2®˜Æíß»OÍß 6.â'¢ÿp$iÊíù2ŸÒ;LÛ–Oòá ±Fóyº)‘ùµ©ãà~ ¥ŸC¡ë­„aø ÅÑ«¨ÙûGæhg [&óâ<1—Xû²Âø{iª_“¸bf)¦Œ²§T˜ ÜÓ»GAe!ógF玦àUa!*ÚZ0Ÿðç/è a0¼€ž~£œ†äwÝo âïfŸJ³xÛw® ÞaÇL¿õ0 è^š `8¿Ú Ù4Ùç÷ Ï©4†V×"”]BÝ3pþà·½_) èIÞ\H$séåXŒ{Òb^Z,ÃÛ6ö©ÉÁ ¬–R2µCÇŠ‰t(£ˆOܲÓ7‚9òó`e€² ä@y%0júAÈëRÿ˜à˜~xƒ4wÖ5çíÂàÖ±åmÝÓ×â}=Ð’tRX[>͔ҞÐRÔ "çH³l/é•_r> endobj -700 0 obj << +708 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /ZBDFML+URWPalladioL-Bold +/FontName /ZTEYNX+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/fi/fl/exclam/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash) -/FontFile 701 0 R +/FontFile 709 0 R >> endobj -2108 0 obj +2138 0 obj [611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ] endobj -703 0 obj << +711 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [694 0 R 721 0 R 731 0 R 786 0 R 850 0 R 912 0 R] +/Parent 2139 0 R +/Kids [702 0 R 729 0 R 739 0 R 794 0 R 858 0 R 920 0 R] >> endobj -941 0 obj << +951 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [929 0 R 943 0 R 957 0 R 968 0 R 975 0 R 987 0 R] +/Parent 2139 0 R +/Kids [939 0 R 953 0 R 967 0 R 978 0 R 985 0 R 997 0 R] >> endobj -999 0 obj << +1009 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [992 0 R 1001 0 R 1012 0 R 1020 0 R 1027 0 R 1033 0 R] +/Parent 2139 0 R +/Kids [1002 0 R 1011 0 R 1022 0 R 1030 0 R 1037 0 R 1043 0 R] >> endobj -1056 0 obj << +1066 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [1041 0 R 1063 0 R 1073 0 R 1078 0 R 1082 0 R 1089 0 R] +/Parent 2139 0 R +/Kids [1051 0 R 1073 0 R 1083 0 R 1088 0 R 1092 0 R 1099 0 R] >> endobj -1105 0 obj << +1115 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [1097 0 R 1108 0 R 1115 0 R 1120 0 R 1129 0 R 1136 0 R] +/Parent 2139 0 R +/Kids [1107 0 R 1118 0 R 1125 0 R 1130 0 R 1139 0 R 1146 0 R] >> endobj -1148 0 obj << +1158 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [1140 0 R 1151 0 R 1156 0 R 1164 0 R 1172 0 R 1181 0 R] +/Parent 2139 0 R +/Kids [1150 0 R 1161 0 R 1166 0 R 1174 0 R 1182 0 R 1191 0 R] >> endobj -1199 0 obj << +1210 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1189 0 R 1201 0 R 1207 0 R 1213 0 R 1219 0 R 1223 0 R] +/Parent 2140 0 R +/Kids [1200 0 R 1212 0 R 1217 0 R 1223 0 R 1229 0 R 1233 0 R] >> endobj -1237 0 obj << +1250 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1234 0 R 1239 0 R 1243 0 R 1248 0 R 1254 0 R 1258 0 R] +/Parent 2140 0 R +/Kids [1241 0 R 1252 0 R 1256 0 R 1260 0 R 1265 0 R 1271 0 R] >> endobj -1273 0 obj << +1280 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1265 0 R 1276 0 R 1280 0 R 1284 0 R 1294 0 R 1301 0 R] +/Parent 2140 0 R +/Kids [1275 0 R 1282 0 R 1293 0 R 1297 0 R 1301 0 R 1311 0 R] >> endobj -1310 0 obj << +1323 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1307 0 R 1312 0 R 1316 0 R 1320 0 R 1328 0 R 1334 0 R] +/Parent 2140 0 R +/Kids [1318 0 R 1325 0 R 1329 0 R 1333 0 R 1337 0 R 1345 0 R] >> endobj -1346 0 obj << +1356 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1340 0 R 1348 0 R 1356 0 R 1361 0 R 1373 0 R 1378 0 R] +/Parent 2140 0 R +/Kids [1351 0 R 1358 0 R 1365 0 R 1372 0 R 1378 0 R 1390 0 R] >> endobj -1388 0 obj << +1398 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1382 0 R 1390 0 R 1395 0 R 1404 0 R 1408 0 R 1412 0 R] +/Parent 2140 0 R +/Kids [1395 0 R 1400 0 R 1405 0 R 1413 0 R 1420 0 R 1425 0 R] >> endobj -1423 0 obj << +1432 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1416 0 R 1425 0 R 1430 0 R 1449 0 R 1462 0 R 1482 0 R] +/Parent 2141 0 R +/Kids [1429 0 R 1434 0 R 1442 0 R 1449 0 R 1468 0 R 1482 0 R] >> endobj -1499 0 obj << +1507 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1488 0 R 1501 0 R 1505 0 R 1511 0 R 1521 0 R 1533 0 R] +/Parent 2141 0 R +/Kids [1502 0 R 1509 0 R 1521 0 R 1525 0 R 1531 0 R 1541 0 R] >> endobj -1547 0 obj << +1560 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1541 0 R 1549 0 R 1557 0 R 1565 0 R 1574 0 R 1583 0 R] +/Parent 2141 0 R +/Kids [1553 0 R 1562 0 R 1569 0 R 1577 0 R 1585 0 R 1594 0 R] >> endobj -1592 0 obj << +1611 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1587 0 R 1594 0 R 1605 0 R 1609 0 R 1613 0 R 1624 0 R] +/Parent 2141 0 R +/Kids [1604 0 R 1613 0 R 1617 0 R 1623 0 R 1634 0 R 1638 0 R] >> endobj -1634 0 obj << +1652 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1628 0 R 1636 0 R 1646 0 R 1705 0 R 1761 0 R 1815 0 R] +/Parent 2141 0 R +/Kids [1642 0 R 1654 0 R 1658 0 R 1665 0 R 1675 0 R 1734 0 R] >> endobj -1857 0 obj << +1843 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1849 0 R 1859 0 R 1865 0 R 1870 0 R 1874 0 R 1879 0 R] +/Parent 2141 0 R +/Kids [1790 0 R 1845 0 R 1879 0 R 1888 0 R 1894 0 R 1899 0 R] >> endobj -1894 0 obj << +1907 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [1890 0 R 1896 0 R 1908 0 R 1919 0 R 1926 0 R 1938 0 R] +/Parent 2142 0 R +/Kids [1903 0 R 1909 0 R 1920 0 R 1925 0 R 1937 0 R 1948 0 R] >> endobj -1952 0 obj << +1966 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [1942 0 R 1954 0 R 1960 0 R 1964 0 R 1974 0 R 1986 0 R] +/Parent 2142 0 R +/Kids [1955 0 R 1968 0 R 1972 0 R 1983 0 R 1989 0 R 1993 0 R] >> endobj -1998 0 obj << +2012 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [1992 0 R 2000 0 R 2009 0 R 2013 0 R 2024 0 R 2030 0 R] +/Parent 2142 0 R +/Kids [2001 0 R 2014 0 R 2023 0 R 2027 0 R 2039 0 R 2043 0 R] >> endobj -2039 0 obj << +2059 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [2035 0 R 2041 0 R 2053 0 R 2063 0 R 2069 0 R 2078 0 R] +/Parent 2142 0 R +/Kids [2050 0 R 2061 0 R 2066 0 R 2071 0 R 2081 0 R 2088 0 R] >> endobj -2091 0 obj << +2102 0 obj << /Type /Pages -/Count 1 -/Parent 2112 0 R -/Kids [2085 0 R] +/Count 3 +/Parent 2142 0 R +/Kids [2098 0 R 2104 0 R 2116 0 R] >> endobj -2109 0 obj << +2139 0 obj << /Type /Pages /Count 36 -/Parent 2113 0 R -/Kids [703 0 R 941 0 R 999 0 R 1056 0 R 1105 0 R 1148 0 R] +/Parent 2143 0 R +/Kids [711 0 R 951 0 R 1009 0 R 1066 0 R 1115 0 R 1158 0 R] >> endobj -2110 0 obj << +2140 0 obj << /Type /Pages /Count 36 -/Parent 2113 0 R -/Kids [1199 0 R 1237 0 R 1273 0 R 1310 0 R 1346 0 R 1388 0 R] +/Parent 2143 0 R +/Kids [1210 0 R 1250 0 R 1280 0 R 1323 0 R 1356 0 R 1398 0 R] >> endobj -2111 0 obj << +2141 0 obj << /Type /Pages /Count 36 -/Parent 2113 0 R -/Kids [1423 0 R 1499 0 R 1547 0 R 1592 0 R 1634 0 R 1857 0 R] +/Parent 2143 0 R +/Kids [1432 0 R 1507 0 R 1560 0 R 1611 0 R 1652 0 R 1843 0 R] >> endobj -2112 0 obj << +2142 0 obj << /Type /Pages -/Count 25 -/Parent 2113 0 R -/Kids [1894 0 R 1952 0 R 1998 0 R 2039 0 R 2091 0 R] +/Count 27 +/Parent 2143 0 R +/Kids [1907 0 R 1966 0 R 2012 0 R 2059 0 R 2102 0 R] >> endobj -2113 0 obj << +2143 0 obj << /Type /Pages -/Count 133 -/Kids [2109 0 R 2110 0 R 2111 0 R 2112 0 R] +/Count 135 +/Kids [2139 0 R 2140 0 R 2141 0 R 2142 0 R] >> endobj -2114 0 obj << +2144 0 obj << /Type /Outlines /First 7 0 R -/Last 639 0 R +/Last 647 0 R /Count 10 >> endobj +699 0 obj << +/Title 700 0 R +/A 697 0 R +/Parent 647 0 R +/Prev 695 0 R +>> endobj +695 0 obj << +/Title 696 0 R +/A 693 0 R +/Parent 647 0 R +/Prev 691 0 R +/Next 699 0 R +>> endobj 691 0 obj << /Title 692 0 R /A 689 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 687 0 R +/Next 695 0 R >> endobj 687 0 obj << /Title 688 0 R /A 685 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 683 0 R /Next 691 0 R >> endobj 683 0 obj << /Title 684 0 R /A 681 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 679 0 R /Next 687 0 R >> endobj 679 0 obj << /Title 680 0 R /A 677 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 675 0 R /Next 683 0 R >> endobj 675 0 obj << /Title 676 0 R /A 673 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 671 0 R /Next 679 0 R >> endobj 671 0 obj << /Title 672 0 R /A 669 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 667 0 R /Next 675 0 R >> endobj 667 0 obj << /Title 668 0 R /A 665 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 663 0 R /Next 671 0 R >> endobj 663 0 obj << /Title 664 0 R /A 661 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 659 0 R /Next 667 0 R >> endobj 659 0 obj << /Title 660 0 R /A 657 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 655 0 R /Next 663 0 R >> endobj 655 0 obj << /Title 656 0 R /A 653 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 651 0 R /Next 659 0 R >> endobj 651 0 obj << /Title 652 0 R /A 649 0 R -/Parent 639 0 R -/Prev 647 0 R +/Parent 647 0 R /Next 655 0 R >> endobj 647 0 obj << /Title 648 0 R /A 645 0 R -/Parent 639 0 R -/Prev 643 0 R -/Next 651 0 R +/Parent 2144 0 R +/Prev 611 0 R +/First 651 0 R +/Last 699 0 R +/Count -13 >> endobj 643 0 obj << /Title 644 0 R /A 641 0 R -/Parent 639 0 R -/Next 647 0 R +/Parent 631 0 R +/Prev 639 0 R >> endobj 639 0 obj << /Title 640 0 R /A 637 0 R -/Parent 2114 0 R -/Prev 603 0 R -/First 643 0 R -/Last 691 0 R -/Count -13 +/Parent 631 0 R +/Prev 635 0 R +/Next 643 0 R >> endobj 635 0 obj << /Title 636 0 R /A 633 0 R -/Parent 623 0 R -/Prev 631 0 R +/Parent 631 0 R +/Next 639 0 R >> endobj 631 0 obj << /Title 632 0 R /A 629 0 R -/Parent 623 0 R -/Prev 627 0 R -/Next 635 0 R +/Parent 611 0 R +/Prev 623 0 R +/First 635 0 R +/Last 643 0 R +/Count -3 >> endobj 627 0 obj << /Title 628 0 R /A 625 0 R /Parent 623 0 R -/Next 631 0 R >> endobj 623 0 obj << /Title 624 0 R /A 621 0 R -/Parent 603 0 R +/Parent 611 0 R /Prev 615 0 R +/Next 631 0 R /First 627 0 R -/Last 635 0 R -/Count -3 +/Last 627 0 R +/Count -1 >> endobj 619 0 obj << /Title 620 0 R @@ -10869,8 +11032,7 @@ endobj 615 0 obj << /Title 616 0 R /A 613 0 R -/Parent 603 0 R -/Prev 607 0 R +/Parent 611 0 R /Next 623 0 R /First 619 0 R /Last 619 0 R @@ -10879,75 +11041,77 @@ endobj 611 0 obj << /Title 612 0 R /A 609 0 R -/Parent 607 0 R +/Parent 2144 0 R +/Prev 591 0 R +/Next 647 0 R +/First 615 0 R +/Last 631 0 R +/Count -3 >> endobj 607 0 obj << /Title 608 0 R /A 605 0 R -/Parent 603 0 R -/Next 615 0 R -/First 611 0 R -/Last 611 0 R -/Count -1 +/Parent 591 0 R +/Prev 603 0 R >> endobj 603 0 obj << /Title 604 0 R /A 601 0 R -/Parent 2114 0 R -/Prev 583 0 R -/Next 639 0 R -/First 607 0 R -/Last 623 0 R -/Count -3 +/Parent 591 0 R +/Prev 595 0 R +/Next 607 0 R >> endobj 599 0 obj << /Title 600 0 R /A 597 0 R -/Parent 583 0 R -/Prev 595 0 R +/Parent 595 0 R >> endobj 595 0 obj << /Title 596 0 R /A 593 0 R -/Parent 583 0 R -/Prev 587 0 R -/Next 599 0 R +/Parent 591 0 R +/Next 603 0 R +/First 599 0 R +/Last 599 0 R +/Count -1 >> endobj 591 0 obj << /Title 592 0 R /A 589 0 R -/Parent 587 0 R +/Parent 2144 0 R +/Prev 567 0 R +/Next 611 0 R +/First 595 0 R +/Last 607 0 R +/Count -3 >> endobj 587 0 obj << /Title 588 0 R /A 585 0 R -/Parent 583 0 R -/Next 595 0 R -/First 591 0 R -/Last 591 0 R -/Count -1 +/Parent 567 0 R +/Prev 575 0 R >> endobj 583 0 obj << /Title 584 0 R /A 581 0 R -/Parent 2114 0 R -/Prev 559 0 R -/Next 603 0 R -/First 587 0 R -/Last 599 0 R -/Count -3 +/Parent 575 0 R +/Prev 579 0 R >> endobj 579 0 obj << /Title 580 0 R /A 577 0 R -/Parent 559 0 R -/Prev 567 0 R +/Parent 575 0 R +/Next 583 0 R >> endobj 575 0 obj << /Title 576 0 R /A 573 0 R /Parent 567 0 R /Prev 571 0 R +/Next 587 0 R +/First 579 0 R +/Last 583 0 R +/Count -2 >> endobj 571 0 obj << /Title 572 0 R @@ -10958,207 +11122,205 @@ endobj 567 0 obj << /Title 568 0 R /A 565 0 R -/Parent 559 0 R -/Prev 563 0 R -/Next 579 0 R +/Parent 2144 0 R +/Prev 243 0 R +/Next 591 0 R /First 571 0 R -/Last 575 0 R -/Count -2 +/Last 587 0 R +/Count -3 >> endobj 563 0 obj << /Title 564 0 R /A 561 0 R -/Parent 559 0 R -/Next 567 0 R +/Parent 543 0 R +/Prev 559 0 R >> endobj 559 0 obj << /Title 560 0 R /A 557 0 R -/Parent 2114 0 R -/Prev 243 0 R -/Next 583 0 R -/First 563 0 R -/Last 579 0 R -/Count -3 +/Parent 543 0 R +/Prev 555 0 R +/Next 563 0 R >> endobj 555 0 obj << /Title 556 0 R /A 553 0 R -/Parent 539 0 R +/Parent 543 0 R /Prev 551 0 R +/Next 559 0 R >> endobj 551 0 obj << /Title 552 0 R /A 549 0 R -/Parent 539 0 R +/Parent 543 0 R /Prev 547 0 R /Next 555 0 R >> endobj 547 0 obj << /Title 548 0 R /A 545 0 R -/Parent 539 0 R -/Prev 543 0 R +/Parent 543 0 R /Next 551 0 R >> endobj 543 0 obj << /Title 544 0 R /A 541 0 R -/Parent 539 0 R -/Next 547 0 R +/Parent 535 0 R +/Prev 539 0 R +/First 547 0 R +/Last 563 0 R +/Count -5 >> endobj 539 0 obj << /Title 540 0 R /A 537 0 R -/Parent 531 0 R -/Prev 535 0 R -/First 543 0 R -/Last 555 0 R -/Count -4 +/Parent 535 0 R +/Next 543 0 R >> endobj 535 0 obj << /Title 536 0 R /A 533 0 R -/Parent 531 0 R -/Next 539 0 R +/Parent 243 0 R +/Prev 483 0 R +/First 539 0 R +/Last 543 0 R +/Count -2 >> endobj 531 0 obj << /Title 532 0 R /A 529 0 R -/Parent 243 0 R -/Prev 479 0 R -/First 535 0 R -/Last 539 0 R -/Count -2 +/Parent 483 0 R +/Prev 527 0 R >> endobj 527 0 obj << /Title 528 0 R /A 525 0 R -/Parent 479 0 R -/Prev 523 0 R +/Parent 483 0 R +/Prev 511 0 R +/Next 531 0 R >> endobj 523 0 obj << /Title 524 0 R /A 521 0 R -/Parent 479 0 R -/Prev 507 0 R -/Next 527 0 R +/Parent 511 0 R +/Prev 519 0 R >> endobj 519 0 obj << /Title 520 0 R /A 517 0 R -/Parent 507 0 R +/Parent 511 0 R /Prev 515 0 R +/Next 523 0 R >> endobj 515 0 obj << /Title 516 0 R /A 513 0 R -/Parent 507 0 R -/Prev 511 0 R +/Parent 511 0 R /Next 519 0 R >> endobj 511 0 obj << /Title 512 0 R /A 509 0 R -/Parent 507 0 R -/Next 515 0 R +/Parent 483 0 R +/Prev 507 0 R +/Next 527 0 R +/First 515 0 R +/Last 523 0 R +/Count -3 >> endobj 507 0 obj << /Title 508 0 R /A 505 0 R -/Parent 479 0 R +/Parent 483 0 R /Prev 503 0 R -/Next 523 0 R -/First 511 0 R -/Last 519 0 R -/Count -3 +/Next 511 0 R >> endobj 503 0 obj << /Title 504 0 R /A 501 0 R -/Parent 479 0 R +/Parent 483 0 R /Prev 499 0 R /Next 507 0 R >> endobj 499 0 obj << /Title 500 0 R /A 497 0 R -/Parent 479 0 R -/Prev 495 0 R +/Parent 483 0 R +/Prev 487 0 R /Next 503 0 R >> endobj 495 0 obj << /Title 496 0 R /A 493 0 R -/Parent 479 0 R -/Prev 483 0 R -/Next 499 0 R +/Parent 487 0 R +/Prev 491 0 R >> endobj 491 0 obj << /Title 492 0 R /A 489 0 R -/Parent 483 0 R -/Prev 487 0 R +/Parent 487 0 R +/Next 495 0 R >> endobj 487 0 obj << /Title 488 0 R /A 485 0 R /Parent 483 0 R -/Next 491 0 R +/Next 499 0 R +/First 491 0 R +/Last 495 0 R +/Count -2 >> endobj 483 0 obj << /Title 484 0 R /A 481 0 R -/Parent 479 0 R -/Next 495 0 R +/Parent 243 0 R +/Prev 275 0 R +/Next 535 0 R /First 487 0 R -/Last 491 0 R -/Count -2 +/Last 531 0 R +/Count -7 >> endobj 479 0 obj << /Title 480 0 R /A 477 0 R -/Parent 243 0 R -/Prev 275 0 R -/Next 531 0 R -/First 483 0 R -/Last 527 0 R -/Count -7 +/Parent 463 0 R +/Prev 475 0 R >> endobj 475 0 obj << /Title 476 0 R /A 473 0 R -/Parent 459 0 R +/Parent 463 0 R /Prev 471 0 R +/Next 479 0 R >> endobj 471 0 obj << /Title 472 0 R /A 469 0 R -/Parent 459 0 R +/Parent 463 0 R /Prev 467 0 R /Next 475 0 R >> endobj 467 0 obj << /Title 468 0 R /A 465 0 R -/Parent 459 0 R -/Prev 463 0 R +/Parent 463 0 R /Next 471 0 R >> endobj 463 0 obj << /Title 464 0 R /A 461 0 R -/Parent 459 0 R -/Next 467 0 R +/Parent 275 0 R +/Prev 459 0 R +/First 467 0 R +/Last 479 0 R +/Count -4 >> endobj 459 0 obj << /Title 460 0 R /A 457 0 R /Parent 275 0 R /Prev 455 0 R -/First 463 0 R -/Last 475 0 R -/Count -4 +/Next 463 0 R >> endobj 455 0 obj << /Title 456 0 R @@ -11213,149 +11375,149 @@ endobj /Title 428 0 R /A 425 0 R /Parent 275 0 R -/Prev 423 0 R +/Prev 351 0 R /Next 431 0 R >> endobj 423 0 obj << /Title 424 0 R /A 421 0 R -/Parent 275 0 R -/Prev 347 0 R -/Next 427 0 R +/Parent 351 0 R +/Prev 419 0 R >> endobj 419 0 obj << /Title 420 0 R /A 417 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 415 0 R +/Next 423 0 R >> endobj 415 0 obj << /Title 416 0 R /A 413 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 411 0 R /Next 419 0 R >> endobj 411 0 obj << /Title 412 0 R /A 409 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 407 0 R /Next 415 0 R >> endobj 407 0 obj << /Title 408 0 R /A 405 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 403 0 R /Next 411 0 R >> endobj 403 0 obj << /Title 404 0 R /A 401 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 399 0 R /Next 407 0 R >> endobj 399 0 obj << /Title 400 0 R /A 397 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 395 0 R /Next 403 0 R >> endobj 395 0 obj << /Title 396 0 R /A 393 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 391 0 R /Next 399 0 R >> endobj 391 0 obj << /Title 392 0 R /A 389 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 387 0 R /Next 395 0 R >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 383 0 R /Next 391 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 379 0 R /Next 387 0 R >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 375 0 R /Next 383 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 367 0 R /Next 375 0 R >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 363 0 R /Next 371 0 R >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 359 0 R /Next 367 0 R >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 355 0 R /Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R -/Parent 347 0 R -/Prev 351 0 R +/Parent 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R -/Parent 347 0 R -/Next 355 0 R +/Parent 275 0 R +/Prev 347 0 R +/Next 427 0 R +/First 355 0 R +/Last 423 0 R +/Count -18 >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R /Parent 275 0 R /Prev 343 0 R -/Next 423 0 R -/First 351 0 R -/Last 419 0 R -/Count -18 +/Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R @@ -11382,21 +11544,21 @@ endobj /Title 332 0 R /A 329 0 R /Parent 275 0 R -/Prev 327 0 R +/Prev 315 0 R /Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R -/Parent 275 0 R -/Prev 315 0 R -/Next 331 0 R +/Parent 315 0 R +/Prev 323 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R /Parent 315 0 R /Prev 319 0 R +/Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R @@ -11409,10 +11571,10 @@ endobj /A 313 0 R /Parent 275 0 R /Prev 311 0 R -/Next 327 0 R +/Next 331 0 R /First 319 0 R -/Last 323 0 R -/Count -2 +/Last 327 0 R +/Count -3 >> endobj 311 0 obj << /Title 312 0 R @@ -11481,9 +11643,9 @@ endobj /A 273 0 R /Parent 243 0 R /Prev 247 0 R -/Next 479 0 R +/Next 483 0 R /First 279 0 R -/Last 459 0 R +/Last 463 0 R /Count -26 >> endobj 271 0 obj << @@ -11540,11 +11702,11 @@ endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 231 0 R -/Next 559 0 R +/Next 567 0 R /First 247 0 R -/Last 531 0 R +/Last 535 0 R /Count -4 >> endobj 239 0 obj << @@ -11562,7 +11724,7 @@ endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 131 0 R /Next 243 0 R /First 235 0 R @@ -11744,7 +11906,7 @@ endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 91 0 R /Next 231 0 R /First 135 0 R @@ -11818,7 +11980,7 @@ endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 67 0 R /Next 131 0 R /First 95 0 R @@ -11861,7 +12023,7 @@ endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 7 0 R /Next 91 0 R /First 71 0 R @@ -11970,2164 +12132,2194 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Next 67 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj -2115 0 obj << -/Names [(Access_Control_Lists) 1591 0 R (Bv9ARM.ch01) 932 0 R (Bv9ARM.ch02) 978 0 R (Bv9ARM.ch03) 995 0 R (Bv9ARM.ch04) 1044 0 R (Bv9ARM.ch05) 1132 0 R (Bv9ARM.ch06) 1143 0 R (Bv9ARM.ch07) 1590 0 R (Bv9ARM.ch08) 1616 0 R (Bv9ARM.ch09) 1631 0 R (Bv9ARM.ch10) 1852 0 R (Configuration_File_Grammar) 1168 0 R (DNSSEC) 1111 0 R (Doc-Start) 699 0 R (Setting_TTLs) 1526 0 R (acache) 985 0 R (access_control) 1290 0 R (acl) 1176 0 R (address_match_lists) 1149 0 R (admin_tools) 1018 0 R (appendix.A) 602 0 R (appendix.B) 638 0 R (bibliography) 1640 0 R (boolean_options) 1060 0 R (builtin) 1368 0 R (chapter*.1) 734 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 558 0 R (chapter.8) 582 0 R (cite.RFC1033) 1767 0 R (cite.RFC1034) 1652 0 R (cite.RFC1035) 1654 0 R (cite.RFC1101) 1749 0 R (cite.RFC1123) 1751 0 R (cite.RFC1183) 1711 0 R (cite.RFC1464) 1789 0 R (cite.RFC1535) 1697 0 R (cite.RFC1536) 1699 0 R (cite.RFC1537) 1769 0 R (cite.RFC1591) 1753 0 R (cite.RFC1706) 1713 0 R (cite.RFC1712) 1809 0 R (cite.RFC1713) 1791 0 R (cite.RFC1794) 1793 0 R (cite.RFC1876) 1715 0 R (cite.RFC1912) 1771 0 R (cite.RFC1982) 1701 0 R (cite.RFC1995) 1659 0 R (cite.RFC1996) 1661 0 R (cite.RFC2010) 1773 0 R (cite.RFC2052) 1717 0 R (cite.RFC2065) 1821 0 R (cite.RFC2136) 1663 0 R (cite.RFC2137) 1823 0 R (cite.RFC2163) 1719 0 R (cite.RFC2168) 1721 0 R (cite.RFC2181) 1665 0 R (cite.RFC2219) 1775 0 R (cite.RFC2230) 1723 0 R (cite.RFC2240) 1795 0 R (cite.RFC2308) 1667 0 R (cite.RFC2317) 1755 0 R (cite.RFC2345) 1797 0 R (cite.RFC2352) 1799 0 R (cite.RFC2535) 1825 0 R (cite.RFC2536) 1725 0 R (cite.RFC2537) 1727 0 R (cite.RFC2538) 1729 0 R (cite.RFC2539) 1731 0 R (cite.RFC2540) 1733 0 R (cite.RFC2671) 1669 0 R (cite.RFC2672) 1671 0 R (cite.RFC2673) 1811 0 R (cite.RFC2782) 1735 0 R (cite.RFC2825) 1779 0 R (cite.RFC2826) 1757 0 R (cite.RFC2845) 1673 0 R (cite.RFC2874) 1813 0 R (cite.RFC2915) 1737 0 R (cite.RFC2929) 1759 0 R (cite.RFC2930) 1675 0 R (cite.RFC2931) 1677 0 R (cite.RFC3007) 1679 0 R (cite.RFC3008) 1827 0 R (cite.RFC3071) 1801 0 R (cite.RFC3090) 1829 0 R (cite.RFC3110) 1739 0 R (cite.RFC3123) 1741 0 R (cite.RFC3225) 1685 0 R (cite.RFC3258) 1803 0 R (cite.RFC3445) 1831 0 R (cite.RFC3490) 1781 0 R (cite.RFC3491) 1783 0 R (cite.RFC3492) 1785 0 R (cite.RFC3596) 1743 0 R (cite.RFC3597) 1745 0 R (cite.RFC3645) 1681 0 R (cite.RFC3655) 1833 0 R (cite.RFC3658) 1835 0 R (cite.RFC3755) 1837 0 R (cite.RFC3757) 1839 0 R (cite.RFC3833) 1687 0 R (cite.RFC3845) 1841 0 R (cite.RFC3901) 1805 0 R (cite.RFC4033) 1689 0 R (cite.RFC4034) 1691 0 R (cite.RFC4035) 1693 0 R (cite.RFC4074) 1703 0 R (cite.RFC974) 1656 0 R (cite.id2504427) 1846 0 R (configuration_file_elements) 1144 0 R (controls_statement_definition_and_usage) 1031 0 R (diagnostic_tools) 966 0 R (dynamic_update) 1054 0 R (dynamic_update_policies) 1106 0 R (dynamic_update_security) 1299 0 R (empty) 1376 0 R (historical_dns_information) 1633 0 R (id2464966) 933 0 R (id2466572) 934 0 R (id2467531) 935 0 R (id2467541) 936 0 R (id2467713) 948 0 R (id2467734) 949 0 R (id2467768) 950 0 R (id2467852) 953 0 R (id2467945) 946 0 R (id2470250) 960 0 R (id2470274) 963 0 R (id2470372) 964 0 R (id2470393) 965 0 R (id2470423) 971 0 R (id2470526) 972 0 R (id2470553) 973 0 R (id2470587) 979 0 R (id2470614) 980 0 R (id2470627) 981 0 R (id2470721) 984 0 R (id2470731) 990 0 R (id2470763) 997 0 R (id2470779) 998 0 R (id2470802) 1004 0 R (id2470819) 1005 0 R (id2471224) 1008 0 R (id2471229) 1009 0 R (id2473110) 1036 0 R (id2473122) 1037 0 R (id2473515) 1069 0 R (id2473533) 1070 0 R (id2473969) 1086 0 R (id2473986) 1087 0 R (id2474024) 1092 0 R (id2474042) 1093 0 R (id2474121) 1094 0 R (id2474161) 1095 0 R (id2474286) 1100 0 R (id2474331) 1102 0 R (id2474345) 1103 0 R (id2474462) 1104 0 R (id2474599) 1112 0 R (id2474678) 1113 0 R (id2474759) 1118 0 R (id2474902) 1123 0 R (id2475169) 1125 0 R (id2475190) 1126 0 R (id2475291) 1133 0 R (id2475438) 1145 0 R (id2476300) 1154 0 R (id2476328) 1159 0 R (id2476522) 1160 0 R (id2476537) 1161 0 R (id2476567) 1167 0 R (id2476718) 1169 0 R (id2477161) 1175 0 R (id2477272) 1177 0 R (id2477419) 1179 0 R (id2477780) 1186 0 R (id2477797) 1192 0 R (id2477889) 1193 0 R (id2477912) 1194 0 R (id2478003) 1198 0 R (id2478197) 1204 0 R (id2478249) 1205 0 R (id2478942) 1216 0 R (id2479645) 1226 0 R (id2479719) 1227 0 R (id2479783) 1230 0 R (id2479827) 1231 0 R (id2479842) 1232 0 R (id2482169) 1261 0 R (id2484043) 1287 0 R (id2484102) 1289 0 R (id2484598) 1304 0 R (id2485793) 1323 0 R (id2485852) 1325 0 R (id2486200) 1337 0 R (id2486839) 1352 0 R (id2488339) 1386 0 R (id2489091) 1399 0 R (id2489142) 1400 0 R (id2489292) 1402 0 R (id2490761) 1419 0 R (id2490769) 1420 0 R (id2490774) 1421 0 R (id2491188) 1428 0 R (id2491221) 1433 0 R (id2492840) 1485 0 R (id2493223) 1491 0 R (id2493309) 1492 0 R (id2493330) 1495 0 R (id2493498) 1497 0 R (id2494737) 1508 0 R (id2494865) 1514 0 R (id2495022) 1515 0 R (id2495385) 1517 0 R (id2495522) 1519 0 R (id2495544) 1524 0 R (id2496017) 1527 0 R (id2496141) 1529 0 R (id2496156) 1530 0 R (id2496268) 1536 0 R (id2496291) 1537 0 R (id2496420) 1538 0 R (id2496489) 1539 0 R (id2496525) 1544 0 R (id2496587) 1545 0 R (id2497018) 1553 0 R (id2497363) 1561 0 R (id2497368) 1562 0 R (id2499022) 1568 0 R (id2499029) 1569 0 R (id2499405) 1571 0 R (id2499411) 1572 0 R (id2500259) 1581 0 R (id2500446) 1601 0 R (id2500592) 1602 0 R (id2500651) 1603 0 R (id2500731) 1617 0 R (id2500737) 1618 0 R (id2500748) 1619 0 R (id2500765) 1620 0 R (id2500964) 1632 0 R (id2501136) 1639 0 R (id2501255) 1644 0 R (id2501257) 1650 0 R (id2501266) 1655 0 R (id2501289) 1651 0 R (id2501381) 1653 0 R (id2501417) 1664 0 R (id2501444) 1666 0 R (id2501469) 1658 0 R (id2501494) 1660 0 R (id2501517) 1662 0 R (id2501573) 1668 0 R (id2501600) 1670 0 R (id2501626) 1672 0 R (id2501688) 1674 0 R (id2501718) 1676 0 R (id2501748) 1678 0 R (id2501843) 1680 0 R (id2501917) 1683 0 R (id2501925) 1684 0 R (id2501952) 1686 0 R (id2501988) 1688 0 R (id2502053) 1690 0 R (id2502118) 1692 0 R (id2502183) 1695 0 R (id2502192) 1696 0 R (id2502217) 1698 0 R (id2502285) 1700 0 R (id2502321) 1702 0 R (id2502361) 1709 0 R (id2502366) 1710 0 R (id2502424) 1712 0 R (id2502461) 1720 0 R (id2502497) 1714 0 R (id2502551) 1716 0 R (id2502589) 1718 0 R (id2502615) 1722 0 R (id2502641) 1724 0 R (id2502667) 1726 0 R (id2502694) 1728 0 R (id2502733) 1730 0 R (id2502763) 1732 0 R (id2502793) 1734 0 R (id2502836) 1736 0 R (id2502869) 1738 0 R (id2502896) 1740 0 R (id2502919) 1742 0 R (id2502977) 1744 0 R (id2503001) 1747 0 R (id2503009) 1748 0 R (id2503034) 1750 0 R (id2503057) 1752 0 R (id2503080) 1754 0 R (id2503126) 1756 0 R (id2503149) 1758 0 R (id2503200) 1765 0 R (id2503207) 1766 0 R (id2503230) 1768 0 R (id2503257) 1770 0 R (id2503352) 1772 0 R (id2503388) 1774 0 R (id2503429) 1777 0 R (id2503434) 1778 0 R (id2503466) 1780 0 R (id2503512) 1782 0 R (id2503547) 1784 0 R (id2503574) 1787 0 R (id2503592) 1788 0 R (id2503614) 1790 0 R (id2503640) 1792 0 R (id2503666) 1794 0 R (id2503689) 1796 0 R (id2503735) 1798 0 R (id2503758) 1800 0 R (id2503785) 1802 0 R (id2503811) 1804 0 R (id2503848) 1807 0 R (id2503854) 1808 0 R (id2503912) 1810 0 R (id2503939) 1812 0 R (id2503975) 1819 0 R (id2503987) 1820 0 R (id2504026) 1822 0 R (id2504053) 1824 0 R (id2504083) 1826 0 R (id2504108) 1828 0 R (id2504135) 1830 0 R (id2504240) 1832 0 R (id2504276) 1834 0 R (id2504302) 1836 0 R (id2504329) 1838 0 R (id2504374) 1840 0 R (id2504416) 1843 0 R (id2504425) 1845 0 R (id2504427) 1847 0 R (incremental_zone_transfers) 1066 0 R (internet_drafts) 1842 0 R (ipv6addresses) 1127 0 R (journal) 1055 0 R (lwresd) 1134 0 R (man.dig) 1853 0 R (man.dnssec-dsfromkey) 1902 0 R (man.dnssec-keyfromlabel) 1916 0 R (man.dnssec-keygen) 1932 0 R (man.dnssec-signzone) 1949 0 R (man.host) 1886 0 R (man.named) 2003 0 R (man.named-checkconf) 1970 0 R (man.named-checkzone) 1982 0 R (man.nsupdate) 2021 0 R (man.rndc) 2047 0 R (man.rndc-confgen) 2075 0 R (man.rndc.conf) 2059 0 R (notify) 1045 0 R (options) 1246 0 R (page.1) 698 0 R (page.10) 970 0 R (page.100) 1707 0 R (page.101) 1763 0 R (page.102) 1817 0 R (page.103) 1851 0 R (page.104) 1861 0 R (page.105) 1867 0 R (page.106) 1872 0 R (page.107) 1876 0 R (page.108) 1881 0 R (page.109) 1892 0 R (page.11) 977 0 R (page.110) 1898 0 R (page.111) 1910 0 R (page.112) 1921 0 R (page.113) 1928 0 R (page.114) 1940 0 R (page.115) 1944 0 R (page.116) 1956 0 R (page.117) 1962 0 R (page.118) 1966 0 R (page.119) 1976 0 R (page.12) 989 0 R (page.120) 1988 0 R (page.121) 1994 0 R (page.122) 2002 0 R (page.123) 2011 0 R (page.124) 2015 0 R (page.125) 2026 0 R (page.126) 2032 0 R (page.127) 2037 0 R (page.128) 2043 0 R (page.129) 2055 0 R (page.13) 994 0 R (page.130) 2065 0 R (page.131) 2071 0 R (page.132) 2080 0 R (page.133) 2087 0 R (page.14) 1003 0 R (page.15) 1014 0 R (page.16) 1022 0 R (page.17) 1029 0 R (page.18) 1035 0 R (page.19) 1043 0 R (page.2) 723 0 R (page.20) 1065 0 R (page.21) 1075 0 R (page.22) 1080 0 R (page.23) 1084 0 R (page.24) 1091 0 R (page.25) 1099 0 R (page.26) 1110 0 R (page.27) 1117 0 R (page.28) 1122 0 R (page.29) 1131 0 R (page.3) 733 0 R (page.30) 1138 0 R (page.31) 1142 0 R (page.32) 1153 0 R (page.33) 1158 0 R (page.34) 1166 0 R (page.35) 1174 0 R (page.36) 1183 0 R (page.37) 1191 0 R (page.38) 1203 0 R (page.39) 1209 0 R (page.4) 788 0 R (page.40) 1215 0 R (page.41) 1221 0 R (page.42) 1225 0 R (page.43) 1236 0 R (page.44) 1241 0 R (page.45) 1245 0 R (page.46) 1250 0 R (page.47) 1256 0 R (page.48) 1260 0 R (page.49) 1267 0 R (page.5) 852 0 R (page.50) 1278 0 R (page.51) 1282 0 R (page.52) 1286 0 R (page.53) 1296 0 R (page.54) 1303 0 R (page.55) 1309 0 R (page.56) 1314 0 R (page.57) 1318 0 R (page.58) 1322 0 R (page.59) 1330 0 R (page.6) 914 0 R (page.60) 1336 0 R (page.61) 1342 0 R (page.62) 1350 0 R (page.63) 1358 0 R (page.64) 1363 0 R (page.65) 1375 0 R (page.66) 1380 0 R (page.67) 1384 0 R (page.68) 1392 0 R (page.69) 1397 0 R (page.7) 931 0 R (page.70) 1406 0 R (page.71) 1410 0 R (page.72) 1414 0 R (page.73) 1418 0 R (page.74) 1427 0 R (page.75) 1432 0 R (page.76) 1451 0 R (page.77) 1464 0 R (page.78) 1484 0 R (page.79) 1490 0 R (page.8) 945 0 R (page.80) 1503 0 R (page.81) 1507 0 R (page.82) 1513 0 R (page.83) 1523 0 R (page.84) 1535 0 R (page.85) 1543 0 R (page.86) 1551 0 R (page.87) 1559 0 R (page.88) 1567 0 R (page.89) 1576 0 R (page.9) 959 0 R (page.90) 1585 0 R (page.91) 1589 0 R (page.92) 1596 0 R (page.93) 1607 0 R (page.94) 1611 0 R (page.95) 1615 0 R (page.96) 1626 0 R (page.97) 1630 0 R (page.98) 1638 0 R (page.99) 1648 0 R (proposed_standards) 1071 0 R (query_address) 1305 0 R (rfcs) 955 0 R (rndc) 1187 0 R (rrset_ordering) 1010 0 R (sample_configuration) 996 0 R (section*.10) 1776 0 R (section*.100) 2058 0 R (section*.101) 2060 0 R (section*.102) 2061 0 R (section*.103) 2066 0 R (section*.104) 2067 0 R (section*.105) 2072 0 R (section*.106) 2073 0 R (section*.107) 2074 0 R (section*.108) 2076 0 R (section*.109) 2081 0 R (section*.11) 1786 0 R (section*.110) 2082 0 R (section*.111) 2083 0 R (section*.112) 2088 0 R (section*.113) 2089 0 R (section*.114) 2090 0 R (section*.12) 1806 0 R (section*.13) 1818 0 R (section*.14) 1844 0 R (section*.15) 1854 0 R (section*.16) 1855 0 R (section*.17) 1856 0 R (section*.18) 1862 0 R (section*.19) 1863 0 R (section*.2) 1643 0 R (section*.20) 1868 0 R (section*.21) 1877 0 R (section*.22) 1882 0 R (section*.23) 1883 0 R (section*.24) 1884 0 R (section*.25) 1885 0 R (section*.26) 1887 0 R (section*.27) 1888 0 R (section*.28) 1893 0 R (section*.29) 1899 0 R (section*.3) 1649 0 R (section*.30) 1900 0 R (section*.31) 1901 0 R (section*.32) 1903 0 R (section*.33) 1904 0 R (section*.34) 1905 0 R (section*.35) 1906 0 R (section*.36) 1911 0 R (section*.37) 1912 0 R (section*.38) 1913 0 R (section*.39) 1914 0 R (section*.4) 1657 0 R (section*.40) 1915 0 R (section*.41) 1917 0 R (section*.42) 1922 0 R (section*.43) 1923 0 R (section*.44) 1924 0 R (section*.45) 1929 0 R (section*.46) 1930 0 R (section*.47) 1931 0 R (section*.48) 1933 0 R (section*.49) 1934 0 R (section*.5) 1682 0 R (section*.50) 1935 0 R (section*.51) 1936 0 R (section*.52) 1945 0 R (section*.53) 1946 0 R (section*.54) 1947 0 R (section*.55) 1948 0 R (section*.56) 1950 0 R (section*.57) 1951 0 R (section*.58) 1957 0 R (section*.59) 1958 0 R (section*.6) 1694 0 R (section*.60) 1967 0 R (section*.61) 1968 0 R (section*.62) 1969 0 R (section*.63) 1971 0 R (section*.64) 1972 0 R (section*.65) 1977 0 R (section*.66) 1978 0 R (section*.67) 1979 0 R (section*.68) 1980 0 R (section*.69) 1981 0 R (section*.7) 1708 0 R (section*.70) 1983 0 R (section*.71) 1984 0 R (section*.72) 1989 0 R (section*.73) 1990 0 R (section*.74) 1995 0 R (section*.75) 1996 0 R (section*.76) 1997 0 R (section*.77) 2004 0 R (section*.78) 2005 0 R (section*.79) 2006 0 R (section*.8) 1746 0 R (section*.80) 2007 0 R (section*.81) 2016 0 R (section*.82) 2017 0 R (section*.83) 2018 0 R (section*.84) 2019 0 R (section*.85) 2020 0 R (section*.86) 2022 0 R (section*.87) 2027 0 R (section*.88) 2028 0 R (section*.89) 2033 0 R (section*.9) 1764 0 R (section*.90) 2038 0 R (section*.91) 2044 0 R (section*.92) 2045 0 R (section*.93) 2046 0 R (section*.94) 2048 0 R (section*.95) 2049 0 R (section*.96) 2050 0 R (section*.97) 2051 0 R (section*.98) 2056 0 R (section*.99) 2057 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 478 0 R (section.6.4) 530 0 R (section.7.1) 562 0 R (section.7.2) 566 0 R (section.7.3) 578 0 R (section.8.1) 586 0 R (section.8.2) 594 0 R (section.8.3) 598 0 R (section.A.1) 606 0 R (section.A.2) 614 0 R (section.A.3) 622 0 R (section.B.1) 642 0 R (section.B.10) 678 0 R (section.B.11) 682 0 R (section.B.12) 686 0 R (section.B.13) 690 0 R (section.B.2) 646 0 R (section.B.3) 650 0 R (section.B.4) 654 0 R (section.B.5) 658 0 R (section.B.6) 662 0 R (section.B.7) 666 0 R (section.B.8) 670 0 R (section.B.9) 674 0 R (server_resource_limits) 1331 0 R (server_statement_definition_and_usage) 1274 0 R (server_statement_grammar) 1387 0 R (statistics) 1552 0 R (statistics_counters) 1560 0 R (statschannels) 1385 0 R (statsfile) 1252 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 326 0 R (subsection.6.2.12) 330 0 R (subsection.6.2.13) 334 0 R (subsection.6.2.14) 338 0 R (subsection.6.2.15) 342 0 R (subsection.6.2.16) 346 0 R (subsection.6.2.17) 422 0 R (subsection.6.2.18) 426 0 R (subsection.6.2.19) 430 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 434 0 R (subsection.6.2.21) 438 0 R (subsection.6.2.22) 442 0 R (subsection.6.2.23) 446 0 R (subsection.6.2.24) 450 0 R (subsection.6.2.25) 454 0 R (subsection.6.2.26) 458 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 482 0 R (subsection.6.3.2) 494 0 R (subsection.6.3.3) 498 0 R (subsection.6.3.4) 502 0 R (subsection.6.3.5) 506 0 R (subsection.6.3.6) 522 0 R (subsection.6.3.7) 526 0 R (subsection.6.4.1) 538 0 R (subsection.7.2.1) 570 0 R (subsection.7.2.2) 574 0 R (subsection.8.1.1) 590 0 R (subsection.A.1.1) 610 0 R (subsection.A.2.1) 618 0 R (subsection.A.3.1) 626 0 R (subsection.A.3.2) 630 0 R (subsection.A.3.3) 634 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.16.1) 350 0 R (subsubsection.6.2.16.10) 386 0 R (subsubsection.6.2.16.11) 390 0 R (subsubsection.6.2.16.12) 394 0 R (subsubsection.6.2.16.13) 398 0 R (subsubsection.6.2.16.14) 402 0 R (subsubsection.6.2.16.15) 406 0 R (subsubsection.6.2.16.16) 410 0 R (subsubsection.6.2.16.17) 414 0 R (subsubsection.6.2.16.18) 418 0 R (subsubsection.6.2.16.2) 354 0 R (subsubsection.6.2.16.3) 358 0 R (subsubsection.6.2.16.4) 362 0 R (subsubsection.6.2.16.5) 366 0 R (subsubsection.6.2.16.6) 370 0 R (subsubsection.6.2.16.7) 374 0 R (subsubsection.6.2.16.8) 378 0 R (subsubsection.6.2.16.9) 382 0 R (subsubsection.6.2.26.1) 462 0 R (subsubsection.6.2.26.2) 466 0 R (subsubsection.6.2.26.3) 470 0 R (subsubsection.6.2.26.4) 474 0 R (subsubsection.6.3.1.1) 486 0 R (subsubsection.6.3.1.2) 490 0 R (subsubsection.6.3.5.1) 510 0 R (subsubsection.6.3.5.2) 514 0 R (subsubsection.6.3.5.3) 518 0 R (subsubsection.6.4.0.1) 534 0 R (subsubsection.6.4.1.1) 542 0 R (subsubsection.6.4.1.2) 546 0 R (subsubsection.6.4.1.3) 550 0 R (subsubsection.6.4.1.4) 554 0 R (table.1.1) 937 0 R (table.1.2) 947 0 R (table.3.1) 1006 0 R (table.3.2) 1038 0 R (table.6.1) 1146 0 R (table.6.10) 1498 0 R (table.6.11) 1509 0 R (table.6.12) 1516 0 R (table.6.13) 1518 0 R (table.6.14) 1525 0 R (table.6.15) 1528 0 R (table.6.16) 1531 0 R (table.6.17) 1546 0 R (table.6.18) 1554 0 R (table.6.19) 1563 0 R (table.6.2) 1170 0 R (table.6.20) 1570 0 R (table.6.21) 1577 0 R (table.6.3) 1178 0 R (table.6.4) 1217 0 R (table.6.5) 1262 0 R (table.6.6) 1353 0 R (table.6.7) 1422 0 R (table.6.8) 1486 0 R (table.6.9) 1496 0 R (the_category_phrase) 1211 0 R (the_sortlist_statement) 1343 0 R (topology) 1338 0 R (tsig) 1085 0 R (tuning) 1354 0 R (types_of_resource_records_and_when_to_use_them) 954 0 R (view_statement_grammar) 1371 0 R (zone_statement_grammar) 1292 0 R (zone_transfers) 1061 0 R (zonefile_format) 1370 0 R] +2145 0 obj << +/Names [(Access_Control_Lists) 1621 0 R (Bv9ARM.ch01) 942 0 R (Bv9ARM.ch02) 988 0 R (Bv9ARM.ch03) 1005 0 R (Bv9ARM.ch04) 1054 0 R (Bv9ARM.ch05) 1142 0 R (Bv9ARM.ch06) 1153 0 R (Bv9ARM.ch07) 1620 0 R (Bv9ARM.ch08) 1645 0 R (Bv9ARM.ch09) 1661 0 R (Bv9ARM.ch10) 1882 0 R (Configuration_File_Grammar) 1178 0 R (DNSSEC) 1121 0 R (Doc-Start) 707 0 R (Setting_TTLs) 1546 0 R (acache) 995 0 R (access_control) 1307 0 R (acl) 1186 0 R (address_match_lists) 1159 0 R (admin_tools) 1028 0 R (appendix.A) 610 0 R (appendix.B) 646 0 R (bibliography) 1669 0 R (boolean_options) 1070 0 R (builtin) 1385 0 R (chapter*.1) 742 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 566 0 R (chapter.8) 590 0 R (cite.RFC1033) 1796 0 R (cite.RFC1034) 1681 0 R (cite.RFC1035) 1683 0 R (cite.RFC1101) 1778 0 R (cite.RFC1123) 1780 0 R (cite.RFC1183) 1740 0 R (cite.RFC1464) 1818 0 R (cite.RFC1535) 1726 0 R (cite.RFC1536) 1728 0 R (cite.RFC1537) 1798 0 R (cite.RFC1591) 1782 0 R (cite.RFC1706) 1742 0 R (cite.RFC1712) 1838 0 R (cite.RFC1713) 1820 0 R (cite.RFC1794) 1822 0 R (cite.RFC1876) 1744 0 R (cite.RFC1912) 1800 0 R (cite.RFC1982) 1730 0 R (cite.RFC1995) 1688 0 R (cite.RFC1996) 1690 0 R (cite.RFC2010) 1802 0 R (cite.RFC2052) 1746 0 R (cite.RFC2065) 1851 0 R (cite.RFC2136) 1692 0 R (cite.RFC2137) 1853 0 R (cite.RFC2163) 1748 0 R (cite.RFC2168) 1750 0 R (cite.RFC2181) 1694 0 R (cite.RFC2219) 1804 0 R (cite.RFC2230) 1752 0 R (cite.RFC2240) 1824 0 R (cite.RFC2308) 1696 0 R (cite.RFC2317) 1784 0 R (cite.RFC2345) 1826 0 R (cite.RFC2352) 1828 0 R (cite.RFC2535) 1855 0 R (cite.RFC2536) 1754 0 R (cite.RFC2537) 1756 0 R (cite.RFC2538) 1758 0 R (cite.RFC2539) 1760 0 R (cite.RFC2540) 1762 0 R (cite.RFC2671) 1698 0 R (cite.RFC2672) 1700 0 R (cite.RFC2673) 1840 0 R (cite.RFC2782) 1764 0 R (cite.RFC2825) 1808 0 R (cite.RFC2826) 1786 0 R (cite.RFC2845) 1702 0 R (cite.RFC2874) 1842 0 R (cite.RFC2915) 1766 0 R (cite.RFC2929) 1788 0 R (cite.RFC2930) 1704 0 R (cite.RFC2931) 1706 0 R (cite.RFC3007) 1708 0 R (cite.RFC3008) 1857 0 R (cite.RFC3071) 1830 0 R (cite.RFC3090) 1859 0 R (cite.RFC3110) 1768 0 R (cite.RFC3123) 1770 0 R (cite.RFC3225) 1714 0 R (cite.RFC3258) 1832 0 R (cite.RFC3445) 1861 0 R (cite.RFC3490) 1810 0 R (cite.RFC3491) 1812 0 R (cite.RFC3492) 1814 0 R (cite.RFC3596) 1772 0 R (cite.RFC3597) 1774 0 R (cite.RFC3645) 1710 0 R (cite.RFC3655) 1863 0 R (cite.RFC3658) 1865 0 R (cite.RFC3755) 1867 0 R (cite.RFC3757) 1869 0 R (cite.RFC3833) 1716 0 R (cite.RFC3845) 1871 0 R (cite.RFC3901) 1834 0 R (cite.RFC4033) 1718 0 R (cite.RFC4034) 1720 0 R (cite.RFC4035) 1722 0 R (cite.RFC4074) 1732 0 R (cite.RFC974) 1685 0 R (cite.id2505777) 1876 0 R (clients-per-query) 1592 0 R (configuration_file_elements) 1154 0 R (controls_statement_definition_and_usage) 1041 0 R (diagnostic_tools) 976 0 R (dynamic_update) 1064 0 R (dynamic_update_policies) 1116 0 R (dynamic_update_security) 1316 0 R (empty) 1393 0 R (historical_dns_information) 1663 0 R (id2466552) 943 0 R (id2466576) 944 0 R (id2467534) 945 0 R (id2467544) 946 0 R (id2467716) 958 0 R (id2467737) 959 0 R (id2467771) 960 0 R (id2467856) 963 0 R (id2467948) 956 0 R (id2470253) 970 0 R (id2470277) 973 0 R (id2470375) 974 0 R (id2470396) 975 0 R (id2470426) 981 0 R (id2470530) 982 0 R (id2470556) 983 0 R (id2470590) 989 0 R (id2470617) 990 0 R (id2470630) 991 0 R (id2470724) 994 0 R (id2470734) 1000 0 R (id2470766) 1007 0 R (id2470782) 1008 0 R (id2470805) 1014 0 R (id2470822) 1015 0 R (id2471227) 1018 0 R (id2471233) 1019 0 R (id2473009) 1046 0 R (id2473020) 1047 0 R (id2473420) 1079 0 R (id2473438) 1080 0 R (id2473942) 1096 0 R (id2473959) 1097 0 R (id2473997) 1102 0 R (id2474016) 1103 0 R (id2474026) 1104 0 R (id2474069) 1105 0 R (id2474263) 1110 0 R (id2474311) 1112 0 R (id2474325) 1113 0 R (id2474374) 1114 0 R (id2474510) 1122 0 R (id2474589) 1123 0 R (id2474670) 1128 0 R (id2474953) 1133 0 R (id2475083) 1135 0 R (id2475105) 1136 0 R (id2475138) 1143 0 R (id2475285) 1155 0 R (id2476147) 1164 0 R (id2476174) 1169 0 R (id2476380) 1170 0 R (id2476395) 1171 0 R (id2476425) 1177 0 R (id2476500) 1179 0 R (id2477079) 1185 0 R (id2477122) 1187 0 R (id2477269) 1189 0 R (id2477629) 1196 0 R (id2477646) 1197 0 R (id2477806) 1203 0 R (id2477830) 1204 0 R (id2477921) 1208 0 R (id2478115) 1209 0 R (id2478167) 1215 0 R (id2478997) 1226 0 R (id2479731) 1236 0 R (id2479859) 1237 0 R (id2480244) 1239 0 R (id2480317) 1244 0 R (id2480381) 1247 0 R (id2480425) 1248 0 R (id2480440) 1249 0 R (id2482851) 1278 0 R (id2484684) 1304 0 R (id2484743) 1306 0 R (id2485249) 1321 0 R (id2486520) 1340 0 R (id2486580) 1342 0 R (id2486934) 1354 0 R (id2487436) 1369 0 R (id2489703) 1411 0 R (id2489789) 1416 0 R (id2489841) 1417 0 R (id2489923) 1423 0 R (id2491460) 1437 0 R (id2491467) 1438 0 R (id2491473) 1439 0 R (id2491963) 1446 0 R (id2491996) 1452 0 R (id2493692) 1505 0 R (id2494007) 1512 0 R (id2494025) 1513 0 R (id2494045) 1516 0 R (id2494282) 1518 0 R (id2495452) 1528 0 R (id2495580) 1534 0 R (id2495602) 1535 0 R (id2495964) 1537 0 R (id2496101) 1539 0 R (id2496119) 1544 0 R (id2496660) 1547 0 R (id2496785) 1549 0 R (id2496800) 1550 0 R (id2496980) 1556 0 R (id2497002) 1557 0 R (id2497063) 1558 0 R (id2497132) 1559 0 R (id2497169) 1565 0 R (id2497299) 1566 0 R (id2497798) 1573 0 R (id2498301) 1581 0 R (id2498307) 1582 0 R (id2499706) 1589 0 R (id2499713) 1590 0 R (id2500089) 1597 0 R (id2500094) 1598 0 R (id2501108) 1600 0 R (id2501140) 1601 0 R (id2501549) 1610 0 R (id2501792) 1630 0 R (id2501941) 1631 0 R (id2502069) 1632 0 R (id2502149) 1646 0 R (id2502154) 1647 0 R (id2502166) 1648 0 R (id2502251) 1649 0 R (id2502313) 1662 0 R (id2502485) 1668 0 R (id2502741) 1673 0 R (id2502743) 1679 0 R (id2502752) 1684 0 R (id2502775) 1680 0 R (id2502798) 1682 0 R (id2502835) 1693 0 R (id2502861) 1695 0 R (id2502887) 1687 0 R (id2502912) 1689 0 R (id2502935) 1691 0 R (id2502990) 1697 0 R (id2503017) 1699 0 R (id2503044) 1701 0 R (id2503106) 1703 0 R (id2503136) 1705 0 R (id2503165) 1707 0 R (id2503192) 1709 0 R (id2503267) 1712 0 R (id2503274) 1713 0 R (id2503301) 1715 0 R (id2503337) 1717 0 R (id2503402) 1719 0 R (id2503467) 1721 0 R (id2503532) 1724 0 R (id2503541) 1725 0 R (id2503635) 1727 0 R (id2503703) 1729 0 R (id2503738) 1731 0 R (id2503779) 1738 0 R (id2503784) 1739 0 R (id2503842) 1741 0 R (id2503879) 1749 0 R (id2503914) 1743 0 R (id2503969) 1745 0 R (id2504007) 1747 0 R (id2504033) 1751 0 R (id2504058) 1753 0 R (id2504085) 1755 0 R (id2504112) 1757 0 R (id2504151) 1759 0 R (id2504181) 1761 0 R (id2504211) 1763 0 R (id2504253) 1765 0 R (id2504286) 1767 0 R (id2504313) 1769 0 R (id2504337) 1771 0 R (id2504394) 1773 0 R (id2504419) 1776 0 R (id2504426) 1777 0 R (id2504452) 1779 0 R (id2504474) 1781 0 R (id2504498) 1783 0 R (id2504612) 1785 0 R (id2504635) 1787 0 R (id2504685) 1794 0 R (id2504693) 1795 0 R (id2504716) 1797 0 R (id2504743) 1799 0 R (id2504770) 1801 0 R (id2504806) 1803 0 R (id2504846) 1806 0 R (id2504852) 1807 0 R (id2504884) 1809 0 R (id2504930) 1811 0 R (id2504965) 1813 0 R (id2504992) 1816 0 R (id2505010) 1817 0 R (id2505032) 1819 0 R (id2505058) 1821 0 R (id2505083) 1823 0 R (id2505107) 1825 0 R (id2505153) 1827 0 R (id2505176) 1829 0 R (id2505203) 1831 0 R (id2505228) 1833 0 R (id2505266) 1836 0 R (id2505272) 1837 0 R (id2505330) 1839 0 R (id2505356) 1841 0 R (id2505393) 1849 0 R (id2505404) 1850 0 R (id2505444) 1852 0 R (id2505470) 1854 0 R (id2505500) 1856 0 R (id2505526) 1858 0 R (id2505553) 1860 0 R (id2505589) 1862 0 R (id2505625) 1864 0 R (id2505652) 1866 0 R (id2505678) 1868 0 R (id2505723) 1870 0 R (id2505765) 1873 0 R (id2505774) 1875 0 R (id2505777) 1877 0 R (incremental_zone_transfers) 1076 0 R (internet_drafts) 1872 0 R (ipv6addresses) 1137 0 R (journal) 1065 0 R (lwresd) 1144 0 R (man.dig) 1883 0 R (man.dnssec-dsfromkey) 1931 0 R (man.dnssec-keyfromlabel) 1945 0 R (man.dnssec-keygen) 1961 0 R (man.dnssec-signzone) 1979 0 R (man.host) 1916 0 R (man.named) 2033 0 R (man.named-checkconf) 2004 0 R (man.named-checkzone) 2017 0 R (man.nsupdate) 2055 0 R (man.rndc) 2077 0 R (man.rndc-confgen) 2110 0 R (man.rndc.conf) 2093 0 R (notify) 1055 0 R (options) 1263 0 R (page.1) 706 0 R (page.10) 980 0 R (page.100) 1667 0 R (page.101) 1677 0 R (page.102) 1736 0 R (page.103) 1792 0 R (page.104) 1847 0 R (page.105) 1881 0 R (page.106) 1890 0 R (page.107) 1896 0 R (page.108) 1901 0 R (page.109) 1905 0 R (page.11) 987 0 R (page.110) 1911 0 R (page.111) 1922 0 R (page.112) 1927 0 R (page.113) 1939 0 R (page.114) 1950 0 R (page.115) 1957 0 R (page.116) 1970 0 R (page.117) 1974 0 R (page.118) 1985 0 R (page.119) 1991 0 R (page.12) 999 0 R (page.120) 1995 0 R (page.121) 2003 0 R (page.122) 2016 0 R (page.123) 2025 0 R (page.124) 2029 0 R (page.125) 2041 0 R (page.126) 2045 0 R (page.127) 2052 0 R (page.128) 2063 0 R (page.129) 2068 0 R (page.13) 1004 0 R (page.130) 2073 0 R (page.131) 2083 0 R (page.132) 2090 0 R (page.133) 2100 0 R (page.134) 2106 0 R (page.135) 2118 0 R (page.14) 1013 0 R (page.15) 1024 0 R (page.16) 1032 0 R (page.17) 1039 0 R (page.18) 1045 0 R (page.19) 1053 0 R (page.2) 731 0 R (page.20) 1075 0 R (page.21) 1085 0 R (page.22) 1090 0 R (page.23) 1094 0 R (page.24) 1101 0 R (page.25) 1109 0 R (page.26) 1120 0 R (page.27) 1127 0 R (page.28) 1132 0 R (page.29) 1141 0 R (page.3) 741 0 R (page.30) 1148 0 R (page.31) 1152 0 R (page.32) 1163 0 R (page.33) 1168 0 R (page.34) 1176 0 R (page.35) 1184 0 R (page.36) 1193 0 R (page.37) 1202 0 R (page.38) 1214 0 R (page.39) 1219 0 R (page.4) 796 0 R (page.40) 1225 0 R (page.41) 1231 0 R (page.42) 1235 0 R (page.43) 1243 0 R (page.44) 1254 0 R (page.45) 1258 0 R (page.46) 1262 0 R (page.47) 1267 0 R (page.48) 1273 0 R (page.49) 1277 0 R (page.5) 860 0 R (page.50) 1284 0 R (page.51) 1295 0 R (page.52) 1299 0 R (page.53) 1303 0 R (page.54) 1313 0 R (page.55) 1320 0 R (page.56) 1327 0 R (page.57) 1331 0 R (page.58) 1335 0 R (page.59) 1339 0 R (page.6) 922 0 R (page.60) 1347 0 R (page.61) 1353 0 R (page.62) 1360 0 R (page.63) 1367 0 R (page.64) 1374 0 R (page.65) 1380 0 R (page.66) 1392 0 R (page.67) 1397 0 R (page.68) 1402 0 R (page.69) 1407 0 R (page.7) 941 0 R (page.70) 1415 0 R (page.71) 1422 0 R (page.72) 1427 0 R (page.73) 1431 0 R (page.74) 1436 0 R (page.75) 1444 0 R (page.76) 1451 0 R (page.77) 1470 0 R (page.78) 1484 0 R (page.79) 1504 0 R (page.8) 955 0 R (page.80) 1511 0 R (page.81) 1523 0 R (page.82) 1527 0 R (page.83) 1533 0 R (page.84) 1543 0 R (page.85) 1555 0 R (page.86) 1564 0 R (page.87) 1571 0 R (page.88) 1579 0 R (page.89) 1587 0 R (page.9) 969 0 R (page.90) 1596 0 R (page.91) 1606 0 R (page.92) 1615 0 R (page.93) 1619 0 R (page.94) 1625 0 R (page.95) 1636 0 R (page.96) 1640 0 R (page.97) 1644 0 R (page.98) 1656 0 R (page.99) 1660 0 R (proposed_standards) 1081 0 R (query_address) 1322 0 R (rfcs) 965 0 R (rndc) 1198 0 R (root_delegation_only) 1447 0 R (rrset_ordering) 1020 0 R (sample_configuration) 1006 0 R (section*.10) 1805 0 R (section*.100) 2091 0 R (section*.101) 2092 0 R (section*.102) 2094 0 R (section*.103) 2095 0 R (section*.104) 2096 0 R (section*.105) 2101 0 R (section*.106) 2107 0 R (section*.107) 2108 0 R (section*.108) 2109 0 R (section*.109) 2111 0 R (section*.11) 1815 0 R (section*.110) 2112 0 R (section*.111) 2113 0 R (section*.112) 2114 0 R (section*.113) 2119 0 R (section*.114) 2120 0 R (section*.115) 2121 0 R (section*.12) 1835 0 R (section*.13) 1848 0 R (section*.14) 1874 0 R (section*.15) 1884 0 R (section*.16) 1885 0 R (section*.17) 1886 0 R (section*.18) 1891 0 R (section*.19) 1892 0 R (section*.2) 1672 0 R (section*.20) 1897 0 R (section*.21) 1906 0 R (section*.22) 1912 0 R (section*.23) 1913 0 R (section*.24) 1914 0 R (section*.25) 1915 0 R (section*.26) 1917 0 R (section*.27) 1918 0 R (section*.28) 1923 0 R (section*.29) 1928 0 R (section*.3) 1678 0 R (section*.30) 1929 0 R (section*.31) 1930 0 R (section*.32) 1932 0 R (section*.33) 1933 0 R (section*.34) 1934 0 R (section*.35) 1935 0 R (section*.36) 1940 0 R (section*.37) 1941 0 R (section*.38) 1942 0 R (section*.39) 1943 0 R (section*.4) 1686 0 R (section*.40) 1944 0 R (section*.41) 1946 0 R (section*.42) 1951 0 R (section*.43) 1952 0 R (section*.44) 1953 0 R (section*.45) 1958 0 R (section*.46) 1959 0 R (section*.47) 1960 0 R (section*.48) 1962 0 R (section*.49) 1963 0 R (section*.5) 1711 0 R (section*.50) 1964 0 R (section*.51) 1965 0 R (section*.52) 1975 0 R (section*.53) 1976 0 R (section*.54) 1977 0 R (section*.55) 1978 0 R (section*.56) 1980 0 R (section*.57) 1981 0 R (section*.58) 1986 0 R (section*.59) 1987 0 R (section*.6) 1723 0 R (section*.60) 1996 0 R (section*.61) 1997 0 R (section*.62) 1998 0 R (section*.63) 1999 0 R (section*.64) 2005 0 R (section*.65) 2006 0 R (section*.66) 2007 0 R (section*.67) 2008 0 R (section*.68) 2009 0 R (section*.69) 2010 0 R (section*.7) 1737 0 R (section*.70) 2011 0 R (section*.71) 2018 0 R (section*.72) 2019 0 R (section*.73) 2020 0 R (section*.74) 2021 0 R (section*.75) 2030 0 R (section*.76) 2031 0 R (section*.77) 2032 0 R (section*.78) 2034 0 R (section*.79) 2035 0 R (section*.8) 1775 0 R (section*.80) 2036 0 R (section*.81) 2037 0 R (section*.82) 2046 0 R (section*.83) 2047 0 R (section*.84) 2048 0 R (section*.85) 2053 0 R (section*.86) 2054 0 R (section*.87) 2056 0 R (section*.88) 2057 0 R (section*.89) 2058 0 R (section*.9) 1793 0 R (section*.90) 2064 0 R (section*.91) 2069 0 R (section*.92) 2074 0 R (section*.93) 2075 0 R (section*.94) 2076 0 R (section*.95) 2078 0 R (section*.96) 2079 0 R (section*.97) 2084 0 R (section*.98) 2085 0 R (section*.99) 2086 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 534 0 R (section.7.1) 570 0 R (section.7.2) 574 0 R (section.7.3) 586 0 R (section.8.1) 594 0 R (section.8.2) 602 0 R (section.8.3) 606 0 R (section.A.1) 614 0 R (section.A.2) 622 0 R (section.A.3) 630 0 R (section.B.1) 650 0 R (section.B.10) 686 0 R (section.B.11) 690 0 R (section.B.12) 694 0 R (section.B.13) 698 0 R (section.B.2) 654 0 R (section.B.3) 658 0 R (section.B.4) 662 0 R (section.B.5) 666 0 R (section.B.6) 670 0 R (section.B.7) 674 0 R (section.B.8) 678 0 R (section.B.9) 682 0 R (server_resource_limits) 1348 0 R (server_statement_definition_and_usage) 1291 0 R (server_statement_grammar) 1403 0 R (statistics) 1572 0 R (statistics_counters) 1580 0 R (statschannels) 1410 0 R (statsfile) 1269 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 526 0 R (subsection.6.3.7) 530 0 R (subsection.6.4.1) 542 0 R (subsection.7.2.1) 578 0 R (subsection.7.2.2) 582 0 R (subsection.8.1.1) 598 0 R (subsection.A.1.1) 618 0 R (subsection.A.2.1) 626 0 R (subsection.A.3.1) 634 0 R (subsection.A.3.2) 638 0 R (subsection.A.3.3) 642 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.4.0.1) 538 0 R (subsubsection.6.4.1.1) 546 0 R (subsubsection.6.4.1.2) 550 0 R (subsubsection.6.4.1.3) 554 0 R (subsubsection.6.4.1.4) 558 0 R (subsubsection.6.4.1.5) 562 0 R (table.1.1) 947 0 R (table.1.2) 957 0 R (table.3.1) 1016 0 R (table.3.2) 1048 0 R (table.6.1) 1156 0 R (table.6.10) 1517 0 R (table.6.11) 1519 0 R (table.6.12) 1529 0 R (table.6.13) 1536 0 R (table.6.14) 1538 0 R (table.6.15) 1545 0 R (table.6.16) 1548 0 R (table.6.17) 1551 0 R (table.6.18) 1567 0 R (table.6.19) 1574 0 R (table.6.2) 1180 0 R (table.6.20) 1583 0 R (table.6.21) 1591 0 R (table.6.22) 1599 0 R (table.6.23) 1602 0 R (table.6.3) 1188 0 R (table.6.4) 1227 0 R (table.6.5) 1238 0 R (table.6.6) 1279 0 R (table.6.7) 1370 0 R (table.6.8) 1440 0 R (table.6.9) 1506 0 R (the_category_phrase) 1221 0 R (the_sortlist_statement) 1361 0 R (topology) 1355 0 R (tsig) 1095 0 R (tuning) 1375 0 R (types_of_resource_records_and_when_to_use_them) 964 0 R (view_statement_grammar) 1388 0 R (zone_statement_grammar) 1309 0 R (zone_transfers) 1071 0 R (zonefile_format) 1387 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj -2116 0 obj << -/Kids [2115 0 R] +2146 0 obj << +/Kids [2145 0 R] >> endobj -2117 0 obj << -/Dests 2116 0 R +2147 0 obj << +/Dests 2146 0 R >> endobj -2118 0 obj << +2148 0 obj << /Type /Catalog -/Pages 2113 0 R -/Outlines 2114 0 R -/Names 2117 0 R +/Pages 2143 0 R +/Outlines 2144 0 R +/Names 2147 0 R /PageMode /UseOutlines -/OpenAction 693 0 R +/OpenAction 701 0 R >> endobj -2119 0 obj << +2149 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20081116011130Z) +/CreationDate (D:20091231231729Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref -0 2120 +0 2150 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n -0000070820 00000 n -0000731720 00000 n +0000071459 00000 n +0000744619 00000 n 0000000054 00000 n 0000000086 00000 n -0000070944 00000 n -0000731648 00000 n +0000071583 00000 n +0000744547 00000 n 0000000133 00000 n 0000000173 00000 n -0000071069 00000 n -0000731562 00000 n +0000071708 00000 n +0000744461 00000 n 0000000221 00000 n 0000000273 00000 n -0000071194 00000 n -0000731476 00000 n +0000071833 00000 n +0000744375 00000 n 0000000321 00000 n 0000000377 00000 n -0000075519 00000 n -0000731366 00000 n +0000076158 00000 n +0000744265 00000 n 0000000425 00000 n 0000000478 00000 n -0000075643 00000 n -0000731292 00000 n +0000076282 00000 n +0000744191 00000 n 0000000531 00000 n 0000000572 00000 n -0000075768 00000 n -0000731205 00000 n +0000076407 00000 n +0000744104 00000 n 0000000625 00000 n 0000000674 00000 n -0000075892 00000 n -0000731118 00000 n +0000076531 00000 n +0000744017 00000 n 0000000727 00000 n 0000000757 00000 n -0000080171 00000 n -0000730994 00000 n +0000080810 00000 n +0000743893 00000 n 0000000810 00000 n 0000000861 00000 n -0000080296 00000 n -0000730920 00000 n +0000080935 00000 n +0000743819 00000 n 0000000919 00000 n 0000000964 00000 n -0000080421 00000 n -0000730833 00000 n +0000081060 00000 n +0000743732 00000 n 0000001022 00000 n 0000001062 00000 n -0000080546 00000 n -0000730759 00000 n +0000081185 00000 n +0000743658 00000 n 0000001120 00000 n 0000001162 00000 n -0000083518 00000 n -0000730635 00000 n +0000084157 00000 n +0000743534 00000 n 0000001215 00000 n 0000001260 00000 n -0000083643 00000 n -0000730574 00000 n +0000084282 00000 n +0000743473 00000 n 0000001318 00000 n 0000001355 00000 n -0000083768 00000 n -0000730500 00000 n +0000084407 00000 n +0000743399 00000 n 0000001408 00000 n 0000001463 00000 n -0000086696 00000 n -0000730375 00000 n +0000087335 00000 n +0000743274 00000 n 0000001509 00000 n 0000001556 00000 n -0000086821 00000 n -0000730301 00000 n +0000087460 00000 n +0000743200 00000 n 0000001604 00000 n 0000001648 00000 n -0000086946 00000 n -0000730214 00000 n +0000087585 00000 n +0000743113 00000 n 0000001696 00000 n 0000001735 00000 n -0000087071 00000 n -0000730127 00000 n +0000087710 00000 n +0000743026 00000 n 0000001783 00000 n 0000001825 00000 n -0000087195 00000 n -0000730040 00000 n +0000087834 00000 n +0000742939 00000 n 0000001873 00000 n 0000001936 00000 n -0000088275 00000 n -0000729966 00000 n +0000088914 00000 n +0000742865 00000 n 0000001984 00000 n 0000002034 00000 n -0000089985 00000 n -0000729838 00000 n +0000090625 00000 n +0000742737 00000 n 0000002080 00000 n 0000002126 00000 n -0000090109 00000 n -0000729725 00000 n +0000090752 00000 n +0000742624 00000 n 0000002174 00000 n 0000002218 00000 n -0000090234 00000 n -0000729649 00000 n +0000090880 00000 n +0000742548 00000 n 0000002271 00000 n 0000002323 00000 n -0000090359 00000 n -0000729572 00000 n +0000091008 00000 n +0000742471 00000 n 0000002377 00000 n 0000002436 00000 n -0000092896 00000 n -0000729481 00000 n +0000093550 00000 n +0000742380 00000 n 0000002485 00000 n 0000002523 00000 n -0000093155 00000 n -0000729364 00000 n +0000093809 00000 n +0000742263 00000 n 0000002572 00000 n 0000002618 00000 n -0000093284 00000 n -0000729246 00000 n +0000093938 00000 n +0000742145 00000 n 0000002672 00000 n 0000002739 00000 n -0000096500 00000 n -0000729167 00000 n +0000097170 00000 n +0000742066 00000 n 0000002798 00000 n 0000002842 00000 n -0000096628 00000 n -0000729088 00000 n +0000097298 00000 n +0000741987 00000 n 0000002901 00000 n 0000002949 00000 n -0000107160 00000 n -0000729009 00000 n +0000107947 00000 n +0000741908 00000 n 0000003003 00000 n 0000003036 00000 n -0000112147 00000 n -0000728877 00000 n +0000112966 00000 n +0000741776 00000 n 0000003083 00000 n 0000003126 00000 n -0000112276 00000 n -0000728798 00000 n +0000113095 00000 n +0000741697 00000 n 0000003175 00000 n 0000003205 00000 n -0000112405 00000 n -0000728666 00000 n +0000113224 00000 n +0000741565 00000 n 0000003254 00000 n 0000003292 00000 n -0000112534 00000 n -0000728601 00000 n +0000113353 00000 n +0000741500 00000 n 0000003346 00000 n 0000003388 00000 n -0000116796 00000 n -0000728508 00000 n +0000117615 00000 n +0000741407 00000 n 0000003437 00000 n 0000003496 00000 n -0000116925 00000 n -0000728376 00000 n +0000117744 00000 n +0000741275 00000 n 0000003545 00000 n 0000003578 00000 n -0000117054 00000 n -0000728311 00000 n +0000117873 00000 n +0000741210 00000 n 0000003632 00000 n 0000003681 00000 n -0000124364 00000 n -0000728179 00000 n +0000125183 00000 n +0000741078 00000 n 0000003730 00000 n 0000003758 00000 n -0000124493 00000 n -0000728061 00000 n +0000125312 00000 n +0000740960 00000 n 0000003812 00000 n 0000003881 00000 n -0000124622 00000 n -0000727982 00000 n +0000125441 00000 n +0000740881 00000 n 0000003940 00000 n 0000003988 00000 n -0000127456 00000 n -0000727903 00000 n +0000128293 00000 n +0000740802 00000 n 0000004047 00000 n 0000004092 00000 n -0000127585 00000 n -0000727810 00000 n +0000128422 00000 n +0000740709 00000 n 0000004146 00000 n 0000004214 00000 n -0000127714 00000 n -0000727717 00000 n +0000128551 00000 n +0000740616 00000 n 0000004268 00000 n 0000004338 00000 n -0000127843 00000 n -0000727624 00000 n +0000128680 00000 n +0000740523 00000 n 0000004392 00000 n 0000004455 00000 n -0000131746 00000 n -0000727531 00000 n +0000132601 00000 n +0000740430 00000 n 0000004509 00000 n 0000004564 00000 n -0000131875 00000 n -0000727452 00000 n +0000132730 00000 n +0000740351 00000 n 0000004618 00000 n 0000004650 00000 n -0000132004 00000 n -0000727359 00000 n +0000132859 00000 n +0000740258 00000 n 0000004699 00000 n 0000004727 00000 n -0000132133 00000 n -0000727266 00000 n +0000132988 00000 n +0000740165 00000 n 0000004776 00000 n 0000004808 00000 n -0000135910 00000 n -0000727134 00000 n +0000136765 00000 n +0000740033 00000 n 0000004857 00000 n 0000004887 00000 n -0000136039 00000 n -0000727055 00000 n +0000136894 00000 n +0000739954 00000 n 0000004941 00000 n 0000004982 00000 n -0000136168 00000 n -0000726962 00000 n +0000137023 00000 n +0000739861 00000 n 0000005036 00000 n 0000005078 00000 n -0000139609 00000 n -0000726883 00000 n +0000140484 00000 n +0000739782 00000 n 0000005132 00000 n 0000005177 00000 n -0000142684 00000 n -0000726765 00000 n +0000143559 00000 n +0000739664 00000 n 0000005226 00000 n 0000005272 00000 n -0000142813 00000 n -0000726686 00000 n +0000143688 00000 n +0000739585 00000 n 0000005326 00000 n 0000005386 00000 n -0000142941 00000 n -0000726607 00000 n +0000143816 00000 n +0000739506 00000 n 0000005440 00000 n 0000005509 00000 n -0000145423 00000 n -0000726474 00000 n +0000146298 00000 n +0000739373 00000 n 0000005556 00000 n 0000005609 00000 n -0000145552 00000 n -0000726395 00000 n +0000146427 00000 n +0000739294 00000 n 0000005658 00000 n 0000005714 00000 n -0000145681 00000 n -0000726316 00000 n +0000146556 00000 n +0000739215 00000 n 0000005763 00000 n 0000005812 00000 n -0000149865 00000 n -0000726183 00000 n +0000150740 00000 n +0000739082 00000 n 0000005859 00000 n 0000005911 00000 n -0000149994 00000 n -0000726065 00000 n +0000150869 00000 n +0000738964 00000 n 0000005960 00000 n 0000006011 00000 n -0000154684 00000 n -0000725947 00000 n +0000155559 00000 n +0000738846 00000 n 0000006065 00000 n 0000006110 00000 n -0000154812 00000 n -0000725868 00000 n +0000155687 00000 n +0000738767 00000 n 0000006169 00000 n 0000006203 00000 n -0000158401 00000 n -0000725789 00000 n +0000159308 00000 n +0000738688 00000 n 0000006262 00000 n 0000006310 00000 n -0000158529 00000 n -0000725671 00000 n +0000159436 00000 n +0000738570 00000 n 0000006364 00000 n 0000006404 00000 n -0000158658 00000 n -0000725592 00000 n +0000159565 00000 n +0000738491 00000 n 0000006463 00000 n 0000006497 00000 n -0000162385 00000 n -0000725513 00000 n +0000163504 00000 n +0000738412 00000 n 0000006556 00000 n 0000006604 00000 n -0000162514 00000 n -0000725380 00000 n +0000163633 00000 n +0000738279 00000 n 0000006653 00000 n 0000006703 00000 n -0000165534 00000 n -0000725301 00000 n +0000166453 00000 n +0000738200 00000 n 0000006757 00000 n 0000006804 00000 n -0000165662 00000 n -0000725208 00000 n +0000166581 00000 n +0000738107 00000 n 0000006858 00000 n 0000006918 00000 n -0000165920 00000 n -0000725115 00000 n +0000166840 00000 n +0000738014 00000 n 0000006972 00000 n 0000007024 00000 n -0000171027 00000 n -0000725022 00000 n +0000172189 00000 n +0000737921 00000 n 0000007078 00000 n 0000007143 00000 n -0000171156 00000 n -0000724929 00000 n +0000172318 00000 n +0000737828 00000 n 0000007197 00000 n 0000007248 00000 n -0000174630 00000 n -0000724836 00000 n +0000172447 00000 n +0000737735 00000 n 0000007302 00000 n 0000007366 00000 n -0000174759 00000 n -0000724743 00000 n +0000175899 00000 n +0000737642 00000 n 0000007420 00000 n 0000007467 00000 n -0000174888 00000 n -0000724650 00000 n +0000176028 00000 n +0000737549 00000 n 0000007521 00000 n 0000007581 00000 n -0000175017 00000 n -0000724557 00000 n +0000176157 00000 n +0000737456 00000 n 0000007635 00000 n 0000007686 00000 n -0000179033 00000 n -0000724425 00000 n +0000176286 00000 n +0000737324 00000 n 0000007741 00000 n 0000007806 00000 n -0000179162 00000 n -0000724346 00000 n +0000180517 00000 n +0000737245 00000 n 0000007866 00000 n 0000007913 00000 n -0000185987 00000 n -0000724267 00000 n +0000187075 00000 n +0000737152 00000 n 0000007973 00000 n 0000008021 00000 n -0000192355 00000 n -0000724174 00000 n -0000008076 00000 n -0000008126 00000 n -0000192484 00000 n -0000724081 00000 n -0000008181 00000 n -0000008244 00000 n -0000192612 00000 n -0000723988 00000 n -0000008299 00000 n -0000008351 00000 n -0000192740 00000 n -0000723895 00000 n -0000008406 00000 n -0000008471 00000 n -0000192869 00000 n -0000723802 00000 n -0000008526 00000 n -0000008578 00000 n -0000198137 00000 n -0000723669 00000 n -0000008633 00000 n -0000008698 00000 n -0000206589 00000 n -0000723590 00000 n -0000008758 00000 n -0000008802 00000 n -0000227810 00000 n -0000723497 00000 n -0000008862 00000 n -0000008901 00000 n -0000227938 00000 n -0000723404 00000 n -0000008961 00000 n -0000009008 00000 n -0000228067 00000 n -0000723311 00000 n -0000009068 00000 n -0000009111 00000 n -0000235196 00000 n -0000723218 00000 n -0000009171 00000 n -0000009210 00000 n -0000235325 00000 n -0000723125 00000 n -0000009270 00000 n -0000009312 00000 n -0000242275 00000 n -0000723032 00000 n -0000009372 00000 n -0000009415 00000 n -0000250260 00000 n -0000722939 00000 n -0000009475 00000 n -0000009518 00000 n -0000250389 00000 n -0000722846 00000 n -0000009578 00000 n -0000009639 00000 n -0000254380 00000 n -0000722753 00000 n -0000009700 00000 n -0000009752 00000 n -0000257620 00000 n -0000722660 00000 n -0000009813 00000 n +0000194627 00000 n +0000737073 00000 n +0000008081 00000 n +0000008135 00000 n +0000194886 00000 n +0000736980 00000 n +0000008190 00000 n +0000008240 00000 n +0000197709 00000 n +0000736887 00000 n +0000008295 00000 n +0000008358 00000 n +0000197838 00000 n +0000736794 00000 n +0000008413 00000 n +0000008465 00000 n +0000197967 00000 n +0000736701 00000 n +0000008520 00000 n +0000008585 00000 n +0000198096 00000 n +0000736608 00000 n +0000008640 00000 n +0000008692 00000 n +0000203976 00000 n +0000736475 00000 n +0000008747 00000 n +0000008812 00000 n +0000212370 00000 n +0000736396 00000 n +0000008872 00000 n +0000008916 00000 n +0000233628 00000 n +0000736303 00000 n +0000008976 00000 n +0000009015 00000 n +0000233757 00000 n +0000736210 00000 n +0000009075 00000 n +0000009122 00000 n +0000233886 00000 n +0000736117 00000 n +0000009182 00000 n +0000009225 00000 n +0000240979 00000 n +0000736024 00000 n +0000009285 00000 n +0000009324 00000 n +0000241107 00000 n +0000735931 00000 n +0000009384 00000 n +0000009426 00000 n +0000248082 00000 n +0000735838 00000 n +0000009486 00000 n +0000009529 00000 n +0000255955 00000 n +0000735745 00000 n +0000009589 00000 n +0000009632 00000 n +0000256084 00000 n +0000735652 00000 n +0000009692 00000 n +0000009753 00000 n +0000260235 00000 n +0000735559 00000 n +0000009814 00000 n 0000009866 00000 n -0000257749 00000 n -0000722567 00000 n +0000263744 00000 n +0000735466 00000 n 0000009927 00000 n -0000009965 00000 n -0000261821 00000 n -0000722474 00000 n -0000010026 00000 n -0000010078 00000 n -0000265032 00000 n -0000722381 00000 n -0000010139 00000 n -0000010183 00000 n -0000265290 00000 n -0000722288 00000 n -0000010244 00000 n -0000010280 00000 n -0000274081 00000 n -0000722195 00000 n -0000010341 00000 n -0000010404 00000 n -0000277408 00000 n -0000722102 00000 n -0000010465 00000 n -0000010515 00000 n -0000281163 00000 n -0000722023 00000 n -0000010576 00000 n -0000010632 00000 n -0000284537 00000 n -0000721930 00000 n -0000010687 00000 n -0000010751 00000 n -0000284666 00000 n -0000721837 00000 n -0000010806 00000 n -0000010883 00000 n -0000284794 00000 n -0000721744 00000 n -0000010938 00000 n -0000010989 00000 n -0000289362 00000 n -0000721651 00000 n -0000011044 00000 n -0000011108 00000 n -0000292729 00000 n -0000721558 00000 n -0000011163 00000 n -0000011220 00000 n -0000292857 00000 n -0000721465 00000 n -0000011275 00000 n -0000011345 00000 n -0000292986 00000 n -0000721372 00000 n -0000011400 00000 n -0000011449 00000 n -0000293115 00000 n -0000721279 00000 n -0000011504 00000 n -0000011566 00000 n -0000297818 00000 n -0000721186 00000 n -0000011621 00000 n -0000011670 00000 n -0000301909 00000 n -0000721068 00000 n -0000011725 00000 n -0000011787 00000 n -0000302038 00000 n -0000720989 00000 n -0000011847 00000 n -0000011886 00000 n -0000306096 00000 n -0000720896 00000 n -0000011946 00000 n -0000011980 00000 n -0000311992 00000 n -0000720803 00000 n -0000012040 00000 n -0000012081 00000 n -0000323134 00000 n -0000720724 00000 n -0000012141 00000 n -0000012193 00000 n -0000330383 00000 n -0000720592 00000 n -0000012242 00000 n -0000012275 00000 n -0000330512 00000 n -0000720474 00000 n -0000012329 00000 n -0000012401 00000 n -0000330640 00000 n -0000720395 00000 n -0000012460 00000 n -0000012504 00000 n -0000341427 00000 n -0000720316 00000 n -0000012563 00000 n -0000012616 00000 n -0000341814 00000 n -0000720223 00000 n -0000012670 00000 n -0000012720 00000 n -0000345189 00000 n -0000720130 00000 n -0000012774 00000 n -0000012812 00000 n -0000345448 00000 n -0000720037 00000 n -0000012866 00000 n -0000012915 00000 n -0000348312 00000 n -0000719905 00000 n -0000012969 00000 n -0000013021 00000 n -0000348440 00000 n -0000719826 00000 n -0000013080 00000 n -0000013132 00000 n -0000348569 00000 n -0000719733 00000 n -0000013191 00000 n -0000013244 00000 n -0000348698 00000 n -0000719654 00000 n -0000013303 00000 n -0000013352 00000 n -0000352344 00000 n -0000719561 00000 n -0000013406 00000 n -0000013486 00000 n -0000356394 00000 n -0000719482 00000 n -0000013540 00000 n -0000013589 00000 n -0000356523 00000 n -0000719364 00000 n -0000013638 00000 n -0000013678 00000 n -0000359826 00000 n -0000719285 00000 n -0000013737 00000 n -0000013784 00000 n -0000359955 00000 n -0000719167 00000 n -0000013838 00000 n -0000013883 00000 n -0000360084 00000 n -0000719088 00000 n -0000013942 00000 n -0000014001 00000 n -0000363183 00000 n -0000718995 00000 n -0000014060 00000 n -0000014124 00000 n -0000363442 00000 n -0000718902 00000 n -0000014183 00000 n -0000014239 00000 n -0000366164 00000 n -0000718823 00000 n -0000014298 00000 n -0000014360 00000 n -0000368398 00000 n -0000718690 00000 n -0000014407 00000 n -0000014459 00000 n -0000368527 00000 n -0000718611 00000 n -0000014508 00000 n -0000014552 00000 n -0000372713 00000 n -0000718479 00000 n -0000014601 00000 n -0000014642 00000 n -0000372842 00000 n -0000718400 00000 n -0000014696 00000 n -0000014744 00000 n -0000372970 00000 n -0000718321 00000 n -0000014798 00000 n -0000014849 00000 n -0000373099 00000 n -0000718242 00000 n -0000014898 00000 n -0000014945 00000 n -0000377366 00000 n -0000718109 00000 n -0000014992 00000 n +0000009980 00000 n +0000263873 00000 n +0000735373 00000 n +0000010041 00000 n +0000010079 00000 n +0000267780 00000 n +0000735280 00000 n +0000010140 00000 n +0000010192 00000 n +0000271179 00000 n +0000735187 00000 n +0000010253 00000 n +0000010297 00000 n +0000275345 00000 n +0000735094 00000 n +0000010358 00000 n +0000010394 00000 n +0000280135 00000 n +0000735001 00000 n +0000010455 00000 n +0000010518 00000 n +0000283544 00000 n +0000734908 00000 n +0000010579 00000 n +0000010629 00000 n +0000287237 00000 n +0000734829 00000 n +0000010690 00000 n +0000010746 00000 n +0000290642 00000 n +0000734736 00000 n +0000010801 00000 n +0000010852 00000 n +0000290771 00000 n +0000734643 00000 n +0000010907 00000 n +0000010971 00000 n +0000295142 00000 n +0000734550 00000 n +0000011026 00000 n +0000011090 00000 n +0000295271 00000 n +0000734457 00000 n +0000011145 00000 n +0000011222 00000 n +0000298928 00000 n +0000734364 00000 n +0000011277 00000 n +0000011334 00000 n +0000299057 00000 n +0000734271 00000 n +0000011389 00000 n +0000011459 00000 n +0000299186 00000 n +0000734178 00000 n +0000011514 00000 n +0000011563 00000 n +0000302629 00000 n +0000734085 00000 n +0000011618 00000 n +0000011680 00000 n +0000304248 00000 n +0000733992 00000 n +0000011735 00000 n +0000011784 00000 n +0000308427 00000 n +0000733874 00000 n +0000011839 00000 n +0000011901 00000 n +0000308556 00000 n +0000733795 00000 n +0000011961 00000 n +0000012000 00000 n +0000312881 00000 n +0000733702 00000 n +0000012060 00000 n +0000012094 00000 n +0000318771 00000 n +0000733609 00000 n +0000012154 00000 n +0000012195 00000 n +0000330157 00000 n +0000733530 00000 n +0000012255 00000 n +0000012307 00000 n +0000337397 00000 n +0000733398 00000 n +0000012356 00000 n +0000012389 00000 n +0000337526 00000 n +0000733280 00000 n +0000012443 00000 n +0000012515 00000 n +0000337654 00000 n +0000733201 00000 n +0000012574 00000 n +0000012618 00000 n +0000348444 00000 n +0000733122 00000 n +0000012677 00000 n +0000012730 00000 n +0000348831 00000 n +0000733029 00000 n +0000012784 00000 n +0000012834 00000 n +0000352195 00000 n +0000732936 00000 n +0000012888 00000 n +0000012926 00000 n +0000352454 00000 n +0000732843 00000 n +0000012980 00000 n +0000013029 00000 n +0000355319 00000 n +0000732711 00000 n +0000013083 00000 n +0000013135 00000 n +0000355447 00000 n +0000732632 00000 n +0000013194 00000 n +0000013246 00000 n +0000355576 00000 n +0000732539 00000 n +0000013305 00000 n +0000013358 00000 n +0000355705 00000 n +0000732460 00000 n +0000013417 00000 n +0000013466 00000 n +0000359352 00000 n +0000732367 00000 n +0000013520 00000 n +0000013600 00000 n +0000363488 00000 n +0000732288 00000 n +0000013654 00000 n +0000013703 00000 n +0000363617 00000 n +0000732170 00000 n +0000013752 00000 n +0000013792 00000 n +0000366917 00000 n +0000732091 00000 n +0000013851 00000 n +0000013898 00000 n +0000367046 00000 n +0000731973 00000 n +0000013952 00000 n +0000013997 00000 n +0000367175 00000 n +0000731894 00000 n +0000014056 00000 n +0000014115 00000 n +0000370864 00000 n +0000731801 00000 n +0000014174 00000 n +0000014238 00000 n +0000374585 00000 n +0000731708 00000 n +0000014297 00000 n +0000014353 00000 n +0000374843 00000 n +0000731615 00000 n +0000014412 00000 n +0000014470 00000 n +0000377514 00000 n +0000731536 00000 n +0000014529 00000 n +0000014591 00000 n +0000379759 00000 n +0000731403 00000 n +0000014638 00000 n +0000014690 00000 n +0000379888 00000 n +0000731324 00000 n +0000014739 00000 n +0000014783 00000 n +0000384086 00000 n +0000731192 00000 n +0000014832 00000 n +0000014873 00000 n +0000384215 00000 n +0000731113 00000 n +0000014927 00000 n +0000014975 00000 n +0000384343 00000 n +0000731034 00000 n 0000015029 00000 n -0000377495 00000 n -0000717991 00000 n -0000015078 00000 n -0000015117 00000 n -0000377624 00000 n -0000717926 00000 n -0000015171 00000 n -0000015249 00000 n -0000377753 00000 n -0000717833 00000 n -0000015298 00000 n -0000015365 00000 n -0000377882 00000 n -0000717754 00000 n -0000015414 00000 n -0000015459 00000 n -0000381321 00000 n -0000717621 00000 n -0000015507 00000 n -0000015539 00000 n -0000381450 00000 n -0000717503 00000 n -0000015588 00000 n -0000015627 00000 n -0000381579 00000 n -0000717438 00000 n -0000015681 00000 n -0000015742 00000 n -0000385344 00000 n -0000717306 00000 n -0000015791 00000 n -0000015848 00000 n -0000385473 00000 n -0000717241 00000 n -0000015902 00000 n -0000015951 00000 n -0000385602 00000 n -0000717123 00000 n -0000016000 00000 n -0000016062 00000 n -0000385731 00000 n -0000717044 00000 n -0000016116 00000 n -0000016171 00000 n -0000409752 00000 n -0000716951 00000 n -0000016225 00000 n -0000016266 00000 n -0000409881 00000 n -0000716872 00000 n -0000016320 00000 n -0000016372 00000 n -0000412612 00000 n -0000716752 00000 n -0000016420 00000 n -0000016454 00000 n -0000412741 00000 n -0000716673 00000 n -0000016503 00000 n -0000016530 00000 n -0000430434 00000 n -0000716580 00000 n -0000016579 00000 n -0000016607 00000 n -0000437928 00000 n -0000716487 00000 n -0000016656 00000 n -0000016696 00000 n -0000440723 00000 n -0000716394 00000 n -0000016745 00000 n -0000016788 00000 n -0000446647 00000 n -0000716301 00000 n -0000016837 00000 n -0000016874 00000 n -0000453150 00000 n -0000716208 00000 n -0000016923 00000 n -0000016962 00000 n -0000462862 00000 n -0000716115 00000 n -0000017011 00000 n -0000017050 00000 n -0000465578 00000 n -0000716022 00000 n -0000017099 00000 n -0000017138 00000 n -0000475305 00000 n -0000715929 00000 n -0000017187 00000 n -0000017216 00000 n -0000481121 00000 n -0000715836 00000 n -0000017266 00000 n -0000017299 00000 n -0000495077 00000 n -0000715743 00000 n -0000017349 00000 n -0000017378 00000 n -0000498576 00000 n -0000715650 00000 n -0000017428 00000 n -0000017462 00000 n -0000504687 00000 n -0000715571 00000 n -0000017512 00000 n -0000017549 00000 n -0000017918 00000 n -0000018040 00000 n -0000025869 00000 n -0000017602 00000 n -0000025743 00000 n -0000025806 00000 n -0000711071 00000 n -0000685128 00000 n -0000710897 00000 n -0000712096 00000 n -0000020903 00000 n -0000021120 00000 n -0000021189 00000 n -0000021258 00000 n -0000021326 00000 n -0000021394 00000 n -0000021443 00000 n -0000021490 00000 n -0000021823 00000 n -0000021845 00000 n -0000022013 00000 n -0000022178 00000 n -0000022347 00000 n -0000022526 00000 n -0000022835 00000 n -0000022995 00000 n -0000027233 00000 n -0000027048 00000 n -0000025969 00000 n -0000027170 00000 n -0000683907 00000 n -0000657386 00000 n -0000683733 00000 n -0000656701 00000 n -0000654557 00000 n -0000656537 00000 n -0000038940 00000 n -0000030289 00000 n -0000027318 00000 n -0000038814 00000 n -0000038877 00000 n -0000030823 00000 n -0000030977 00000 n -0000031134 00000 n -0000031291 00000 n -0000031447 00000 n -0000031604 00000 n -0000031766 00000 n -0000031927 00000 n -0000032088 00000 n -0000032250 00000 n -0000032417 00000 n -0000032584 00000 n -0000032749 00000 n -0000032911 00000 n -0000033077 00000 n -0000033238 00000 n -0000033393 00000 n -0000033550 00000 n -0000033706 00000 n -0000033863 00000 n -0000034020 00000 n -0000034177 00000 n -0000034331 00000 n -0000034487 00000 n -0000034649 00000 n -0000034811 00000 n -0000034967 00000 n -0000035124 00000 n -0000035286 00000 n -0000035453 00000 n -0000035619 00000 n -0000035780 00000 n -0000035935 00000 n -0000036092 00000 n -0000036249 00000 n -0000036411 00000 n -0000036568 00000 n -0000036725 00000 n -0000036887 00000 n -0000037044 00000 n -0000037206 00000 n -0000037373 00000 n -0000037539 00000 n -0000037701 00000 n -0000037863 00000 n -0000038025 00000 n -0000038187 00000 n -0000038349 00000 n -0000038504 00000 n -0000038659 00000 n -0000052318 00000 n -0000042272 00000 n -0000039025 00000 n -0000052255 00000 n -0000654006 00000 n -0000636925 00000 n -0000653822 00000 n -0000042862 00000 n -0000043025 00000 n -0000043187 00000 n -0000043350 00000 n -0000043508 00000 n -0000043671 00000 n -0000043834 00000 n -0000043989 00000 n -0000044147 00000 n -0000044305 00000 n -0000044461 00000 n -0000044619 00000 n -0000044782 00000 n -0000044950 00000 n -0000045118 00000 n -0000045281 00000 n -0000045449 00000 n -0000045617 00000 n -0000045775 00000 n -0000045938 00000 n -0000046101 00000 n -0000046263 00000 n -0000046425 00000 n -0000046588 00000 n -0000046750 00000 n -0000046912 00000 n -0000047075 00000 n -0000047238 00000 n -0000047401 00000 n -0000047570 00000 n -0000047739 00000 n -0000047903 00000 n -0000048066 00000 n -0000048230 00000 n -0000048394 00000 n -0000048557 00000 n -0000048721 00000 n -0000048890 00000 n -0000049059 00000 n -0000049228 00000 n -0000049397 00000 n -0000049566 00000 n -0000049735 00000 n -0000049904 00000 n -0000050073 00000 n -0000050242 00000 n -0000050412 00000 n -0000050582 00000 n -0000050752 00000 n -0000050922 00000 n -0000051092 00000 n -0000051262 00000 n -0000051432 00000 n -0000051601 00000 n -0000051771 00000 n -0000051932 00000 n -0000052093 00000 n -0000065459 00000 n -0000055941 00000 n -0000052416 00000 n -0000065396 00000 n -0000056515 00000 n -0000056678 00000 n -0000056841 00000 n -0000057004 00000 n -0000057167 00000 n -0000057330 00000 n -0000057493 00000 n -0000057656 00000 n -0000057824 00000 n -0000057991 00000 n -0000058159 00000 n -0000058327 00000 n -0000058484 00000 n -0000058646 00000 n -0000058811 00000 n -0000058977 00000 n -0000059139 00000 n -0000059301 00000 n -0000059463 00000 n -0000059625 00000 n -0000059792 00000 n -0000059959 00000 n -0000060126 00000 n -0000060288 00000 n -0000060450 00000 n -0000060607 00000 n -0000060774 00000 n -0000060936 00000 n -0000061103 00000 n -0000061270 00000 n -0000636036 00000 n -0000614704 00000 n -0000635862 00000 n -0000061437 00000 n -0000061604 00000 n -0000061759 00000 n -0000061916 00000 n -0000062073 00000 n -0000062235 00000 n -0000062396 00000 n -0000062552 00000 n -0000062707 00000 n -0000062864 00000 n -0000063026 00000 n -0000063183 00000 n -0000063340 00000 n -0000063496 00000 n -0000063652 00000 n -0000063813 00000 n -0000063970 00000 n -0000064132 00000 n -0000064289 00000 n -0000064451 00000 n -0000064613 00000 n -0000064775 00000 n -0000064931 00000 n -0000065086 00000 n -0000065241 00000 n -0000068260 00000 n -0000066412 00000 n -0000065570 00000 n -0000068197 00000 n -0000066626 00000 n -0000066783 00000 n -0000066940 00000 n -0000067096 00000 n -0000067253 00000 n -0000067409 00000 n -0000067566 00000 n -0000067724 00000 n -0000613738 00000 n -0000593771 00000 n -0000613565 00000 n -0000067882 00000 n -0000068039 00000 n -0000071445 00000 n -0000070635 00000 n -0000068358 00000 n -0000070757 00000 n -0000070881 00000 n -0000071006 00000 n -0000071131 00000 n -0000071256 00000 n -0000071319 00000 n -0000071382 00000 n -0000592977 00000 n -0000574660 00000 n -0000592804 00000 n -0000712214 00000 n -0000076016 00000 n -0000074836 00000 n -0000071569 00000 n -0000075330 00000 n -0000075393 00000 n -0000075456 00000 n -0000075580 00000 n -0000075705 00000 n -0000075830 00000 n -0000074986 00000 n -0000075179 00000 n -0000075953 00000 n -0000330576 00000 n -0000385795 00000 n -0000080671 00000 n -0000079635 00000 n -0000076140 00000 n -0000080108 00000 n -0000080233 00000 n -0000079785 00000 n -0000079947 00000 n -0000080358 00000 n -0000080483 00000 n -0000080608 00000 n -0000096564 00000 n -0000083893 00000 n -0000083333 00000 n -0000080795 00000 n -0000083455 00000 n -0000083580 00000 n -0000083705 00000 n -0000083830 00000 n -0000087320 00000 n -0000086179 00000 n -0000084004 00000 n -0000086633 00000 n -0000086758 00000 n -0000086883 00000 n -0000087008 00000 n -0000087133 00000 n -0000086329 00000 n -0000086481 00000 n -0000087257 00000 n -0000281227 00000 n -0000088400 00000 n -0000088090 00000 n -0000087405 00000 n -0000088212 00000 n -0000088337 00000 n -0000090485 00000 n -0000089800 00000 n -0000088498 00000 n -0000089922 00000 n -0000090047 00000 n -0000090171 00000 n -0000090296 00000 n -0000090422 00000 n -0000712332 00000 n -0000093412 00000 n -0000092524 00000 n -0000090583 00000 n -0000092831 00000 n -0000092960 00000 n -0000093025 00000 n -0000093090 00000 n -0000092670 00000 n -0000093219 00000 n -0000093348 00000 n -0000265096 00000 n -0000096757 00000 n -0000096310 00000 n -0000093524 00000 n -0000096435 00000 n -0000573985 00000 n -0000561996 00000 n -0000573806 00000 n -0000096692 00000 n -0000100548 00000 n -0000100358 00000 n -0000096883 00000 n -0000100483 00000 n -0000561455 00000 n -0000551709 00000 n -0000561276 00000 n -0000105074 00000 n -0000104676 00000 n -0000100714 00000 n -0000105009 00000 n -0000104822 00000 n -0000171091 00000 n -0000107419 00000 n -0000106970 00000 n -0000105213 00000 n -0000107095 00000 n -0000107224 00000 n -0000107289 00000 n -0000107354 00000 n -0000110116 00000 n -0000112663 00000 n -0000109960 00000 n -0000107544 00000 n -0000112082 00000 n -0000112211 00000 n -0000112340 00000 n -0000111759 00000 n -0000111921 00000 n -0000550839 00000 n -0000541419 00000 n -0000550665 00000 n -0000540855 00000 n -0000531769 00000 n -0000540680 00000 n -0000112469 00000 n -0000112598 00000 n -0000712455 00000 n -0000111588 00000 n -0000111646 00000 n -0000111736 00000 n -0000206653 00000 n -0000242339 00000 n -0000117183 00000 n -0000116248 00000 n -0000112819 00000 n -0000116731 00000 n -0000116860 00000 n -0000116404 00000 n -0000116569 00000 n -0000116989 00000 n -0000117118 00000 n -0000389821 00000 n -0000120797 00000 n -0000120417 00000 n -0000117335 00000 n -0000120732 00000 n -0000120564 00000 n -0000122047 00000 n -0000121856 00000 n -0000120922 00000 n -0000121982 00000 n -0000124750 00000 n -0000124173 00000 n -0000122146 00000 n -0000124299 00000 n -0000124428 00000 n -0000124557 00000 n -0000124686 00000 n -0000127972 00000 n -0000127265 00000 n -0000124888 00000 n -0000127391 00000 n -0000127520 00000 n -0000127649 00000 n -0000127778 00000 n -0000127907 00000 n -0000132261 00000 n -0000131363 00000 n -0000128097 00000 n -0000131681 00000 n -0000131810 00000 n -0000131510 00000 n -0000131939 00000 n -0000132068 00000 n -0000132196 00000 n -0000712580 00000 n -0000323198 00000 n -0000136297 00000 n -0000135719 00000 n -0000132386 00000 n -0000135845 00000 n -0000135974 00000 n -0000136103 00000 n -0000136232 00000 n -0000139738 00000 n -0000139418 00000 n -0000136435 00000 n -0000139544 00000 n -0000139673 00000 n -0000143070 00000 n -0000142311 00000 n -0000139850 00000 n -0000142619 00000 n -0000142748 00000 n -0000142458 00000 n -0000142877 00000 n -0000143005 00000 n -0000385537 00000 n -0000145810 00000 n -0000145232 00000 n -0000143238 00000 n -0000145358 00000 n -0000145487 00000 n -0000145616 00000 n -0000145745 00000 n -0000146250 00000 n -0000146059 00000 n -0000145909 00000 n -0000146185 00000 n -0000150252 00000 n -0000149486 00000 n -0000146292 00000 n -0000149800 00000 n -0000149929 00000 n -0000150057 00000 n -0000150122 00000 n -0000150187 00000 n -0000149633 00000 n -0000712705 00000 n -0000154748 00000 n -0000154940 00000 n -0000154493 00000 n -0000150351 00000 n -0000154619 00000 n -0000154875 00000 n -0000158787 00000 n -0000158210 00000 n -0000155065 00000 n -0000158336 00000 n -0000158464 00000 n -0000158593 00000 n -0000158722 00000 n -0000161394 00000 n -0000162773 00000 n -0000161268 00000 n -0000158925 00000 n -0000162320 00000 n -0000162449 00000 n -0000162578 00000 n -0000162643 00000 n -0000162708 00000 n -0000166049 00000 n -0000165343 00000 n -0000162928 00000 n -0000165469 00000 n -0000165597 00000 n -0000165726 00000 n -0000165790 00000 n -0000165855 00000 n -0000165984 00000 n -0000171284 00000 n -0000170496 00000 n -0000166161 00000 n -0000170962 00000 n -0000170652 00000 n -0000170803 00000 n -0000171220 00000 n -0000510397 00000 n -0000175146 00000 n -0000173875 00000 n -0000171422 00000 n -0000174565 00000 n -0000174694 00000 n -0000174823 00000 n -0000174952 00000 n -0000174040 00000 n -0000174192 00000 n -0000174378 00000 n -0000175081 00000 n -0000712830 00000 n -0000179291 00000 n -0000178842 00000 n -0000175272 00000 n -0000178968 00000 n -0000179097 00000 n -0000179226 00000 n -0000183212 00000 n -0000182833 00000 n -0000179416 00000 n -0000183147 00000 n -0000182980 00000 n -0000186051 00000 n -0000186245 00000 n -0000185796 00000 n -0000183324 00000 n -0000185922 00000 n -0000186116 00000 n -0000186181 00000 n -0000189675 00000 n -0000189484 00000 n -0000186357 00000 n -0000189610 00000 n -0000192997 00000 n -0000191830 00000 n -0000189787 00000 n -0000192290 00000 n -0000192419 00000 n -0000192548 00000 n -0000191986 00000 n -0000192140 00000 n -0000192676 00000 n -0000192804 00000 n -0000192932 00000 n -0000194483 00000 n -0000194292 00000 n -0000193109 00000 n -0000194418 00000 n -0000712955 00000 n -0000196016 00000 n -0000195825 00000 n -0000194582 00000 n -0000195951 00000 n -0000198266 00000 n -0000197946 00000 n -0000196115 00000 n -0000198072 00000 n -0000198201 00000 n -0000202789 00000 n -0000202420 00000 n -0000198378 00000 n -0000202724 00000 n -0000202567 00000 n -0000359890 00000 n -0000206718 00000 n -0000206398 00000 n -0000202927 00000 n -0000206524 00000 n -0000210794 00000 n -0000210300 00000 n -0000206843 00000 n -0000210599 00000 n -0000210664 00000 n -0000210729 00000 n -0000210447 00000 n -0000215794 00000 n -0000214662 00000 n -0000210919 00000 n -0000215729 00000 n -0000214845 00000 n -0000215002 00000 n -0000215186 00000 n -0000215359 00000 n -0000215544 00000 n -0000713080 00000 n -0000289426 00000 n -0000220074 00000 n -0000219883 00000 n -0000215975 00000 n -0000220009 00000 n -0000223936 00000 n -0000223745 00000 n -0000220199 00000 n -0000223871 00000 n -0000228196 00000 n -0000227253 00000 n -0000224048 00000 n -0000227745 00000 n -0000227873 00000 n -0000227409 00000 n -0000228002 00000 n -0000228131 00000 n -0000227579 00000 n -0000297882 00000 n -0000232129 00000 n -0000231567 00000 n -0000228365 00000 n -0000232064 00000 n -0000231723 00000 n -0000231893 00000 n -0000373163 00000 n -0000235454 00000 n -0000235005 00000 n -0000232298 00000 n -0000235131 00000 n -0000235260 00000 n -0000235389 00000 n -0000238850 00000 n -0000238659 00000 n -0000235579 00000 n -0000238785 00000 n -0000713205 00000 n -0000242404 00000 n -0000242084 00000 n -0000239019 00000 n -0000242210 00000 n -0000246107 00000 n -0000245916 00000 n -0000242560 00000 n -0000246042 00000 n -0000250518 00000 n -0000249704 00000 n -0000246276 00000 n -0000250195 00000 n -0000250324 00000 n -0000249860 00000 n -0000250453 00000 n -0000250021 00000 n -0000254509 00000 n -0000254014 00000 n -0000250673 00000 n -0000254315 00000 n -0000254444 00000 n -0000254161 00000 n -0000257878 00000 n -0000257429 00000 n -0000254634 00000 n -0000257555 00000 n -0000257684 00000 n -0000257813 00000 n -0000261950 00000 n -0000261283 00000 n -0000258033 00000 n -0000261756 00000 n -0000261885 00000 n -0000261439 00000 n -0000261601 00000 n -0000713330 00000 n -0000265418 00000 n -0000264650 00000 n -0000262119 00000 n -0000264967 00000 n -0000264797 00000 n -0000265160 00000 n -0000265225 00000 n -0000265354 00000 n -0000269455 00000 n -0000269083 00000 n -0000265601 00000 n -0000269390 00000 n -0000269230 00000 n -0000274209 00000 n -0000273530 00000 n -0000269623 00000 n -0000274016 00000 n -0000273686 00000 n -0000531414 00000 n -0000529417 00000 n -0000531249 00000 n -0000274144 00000 n -0000273849 00000 n -0000356458 00000 n -0000293050 00000 n -0000277537 00000 n -0000277217 00000 n -0000274335 00000 n -0000277343 00000 n -0000277472 00000 n -0000281291 00000 n -0000280972 00000 n -0000277662 00000 n -0000281098 00000 n -0000284923 00000 n -0000284346 00000 n -0000281433 00000 n -0000284472 00000 n -0000284601 00000 n -0000284730 00000 n -0000284858 00000 n -0000713455 00000 n -0000289491 00000 n -0000289000 00000 n -0000285035 00000 n -0000289297 00000 n -0000289147 00000 n -0000293243 00000 n -0000292193 00000 n -0000289603 00000 n -0000292664 00000 n -0000292349 00000 n -0000292792 00000 n -0000292921 00000 n -0000292511 00000 n -0000293179 00000 n -0000296310 00000 n -0000296119 00000 n -0000293355 00000 n -0000296245 00000 n -0000297947 00000 n -0000297627 00000 n -0000296422 00000 n -0000297753 00000 n -0000299421 00000 n -0000299230 00000 n -0000298059 00000 n -0000299356 00000 n -0000302297 00000 n -0000301718 00000 n -0000299520 00000 n -0000301844 00000 n -0000301973 00000 n -0000302102 00000 n -0000302167 00000 n -0000302232 00000 n -0000713580 00000 n -0000306225 00000 n -0000305905 00000 n -0000302409 00000 n -0000306031 00000 n -0000306160 00000 n -0000312121 00000 n -0000309387 00000 n -0000306337 00000 n -0000311927 00000 n -0000312056 00000 n -0000309651 00000 n -0000309813 00000 n -0000309975 00000 n -0000310136 00000 n -0000310296 00000 n -0000310458 00000 n -0000310629 00000 n -0000310791 00000 n -0000310953 00000 n -0000311114 00000 n -0000311275 00000 n -0000311438 00000 n -0000311601 00000 n -0000311764 00000 n -0000317105 00000 n -0000315364 00000 n -0000312233 00000 n -0000317040 00000 n -0000315583 00000 n -0000315744 00000 n -0000315913 00000 n -0000316075 00000 n -0000316237 00000 n -0000316399 00000 n -0000316560 00000 n -0000316723 00000 n -0000316877 00000 n -0000323263 00000 n -0000320266 00000 n -0000317230 00000 n -0000323069 00000 n -0000320548 00000 n -0000320702 00000 n -0000320856 00000 n -0000321010 00000 n -0000321164 00000 n -0000321325 00000 n -0000321487 00000 n -0000321647 00000 n -0000321807 00000 n -0000321969 00000 n -0000322129 00000 n -0000322288 00000 n -0000322439 00000 n -0000322602 00000 n -0000322753 00000 n -0000322915 00000 n -0000326791 00000 n -0000326470 00000 n -0000323375 00000 n -0000326596 00000 n -0000326661 00000 n -0000326726 00000 n -0000331027 00000 n -0000329830 00000 n -0000326960 00000 n -0000330318 00000 n -0000330447 00000 n -0000330704 00000 n -0000329986 00000 n -0000330156 00000 n -0000330769 00000 n -0000330834 00000 n -0000330899 00000 n -0000330963 00000 n -0000713705 00000 n -0000334374 00000 n -0000334183 00000 n -0000331209 00000 n -0000334309 00000 n -0000338114 00000 n -0000337793 00000 n -0000334460 00000 n -0000337919 00000 n -0000337984 00000 n -0000338049 00000 n -0000341943 00000 n -0000341236 00000 n -0000338226 00000 n -0000341362 00000 n -0000341491 00000 n -0000341554 00000 n -0000341619 00000 n -0000341684 00000 n -0000341749 00000 n -0000341878 00000 n -0000345707 00000 n -0000344868 00000 n -0000342055 00000 n -0000344994 00000 n -0000345059 00000 n -0000345124 00000 n -0000345253 00000 n -0000345318 00000 n -0000345383 00000 n -0000345512 00000 n -0000345577 00000 n -0000345642 00000 n -0000348826 00000 n -0000348121 00000 n -0000345832 00000 n -0000348247 00000 n -0000348375 00000 n -0000348504 00000 n -0000348633 00000 n -0000348762 00000 n -0000352603 00000 n -0000352153 00000 n -0000349023 00000 n -0000352279 00000 n -0000352408 00000 n -0000352473 00000 n -0000352538 00000 n -0000713830 00000 n -0000356782 00000 n -0000356024 00000 n -0000352742 00000 n -0000356329 00000 n -0000356587 00000 n -0000356652 00000 n -0000356717 00000 n -0000356171 00000 n -0000360343 00000 n -0000359635 00000 n -0000356907 00000 n -0000359761 00000 n -0000360019 00000 n -0000360148 00000 n -0000360213 00000 n -0000360278 00000 n -0000363634 00000 n -0000362992 00000 n -0000360455 00000 n +0000015080 00000 n +0000384472 00000 n +0000730955 00000 n +0000015129 00000 n +0000015176 00000 n +0000388739 00000 n +0000730822 00000 n +0000015223 00000 n +0000015260 00000 n +0000388868 00000 n +0000730704 00000 n +0000015309 00000 n +0000015348 00000 n +0000388997 00000 n +0000730639 00000 n +0000015402 00000 n +0000015480 00000 n +0000389126 00000 n +0000730546 00000 n +0000015529 00000 n +0000015596 00000 n +0000389255 00000 n +0000730467 00000 n +0000015645 00000 n +0000015690 00000 n +0000392694 00000 n +0000730334 00000 n +0000015738 00000 n +0000015770 00000 n +0000392823 00000 n +0000730216 00000 n +0000015819 00000 n +0000015858 00000 n +0000392952 00000 n +0000730151 00000 n +0000015912 00000 n +0000015973 00000 n +0000396633 00000 n +0000730019 00000 n +0000016022 00000 n +0000016079 00000 n +0000396762 00000 n +0000729954 00000 n +0000016133 00000 n +0000016182 00000 n +0000396891 00000 n +0000729836 00000 n +0000016231 00000 n +0000016293 00000 n +0000397020 00000 n +0000729757 00000 n +0000016347 00000 n +0000016402 00000 n +0000421042 00000 n +0000729664 00000 n +0000016456 00000 n +0000016497 00000 n +0000421171 00000 n +0000729585 00000 n +0000016551 00000 n +0000016603 00000 n +0000423902 00000 n +0000729465 00000 n +0000016651 00000 n +0000016685 00000 n +0000424031 00000 n +0000729386 00000 n +0000016734 00000 n +0000016761 00000 n +0000441854 00000 n +0000729293 00000 n +0000016810 00000 n +0000016838 00000 n +0000449343 00000 n +0000729200 00000 n +0000016887 00000 n +0000016927 00000 n +0000452138 00000 n +0000729107 00000 n +0000016976 00000 n +0000017019 00000 n +0000458062 00000 n +0000729014 00000 n +0000017068 00000 n +0000017105 00000 n +0000464564 00000 n +0000728921 00000 n +0000017154 00000 n +0000017193 00000 n +0000476717 00000 n +0000728828 00000 n +0000017242 00000 n +0000017281 00000 n +0000480140 00000 n +0000728735 00000 n +0000017330 00000 n +0000017369 00000 n +0000486583 00000 n +0000728642 00000 n +0000017418 00000 n +0000017447 00000 n +0000496757 00000 n +0000728549 00000 n +0000017497 00000 n +0000017530 00000 n +0000506693 00000 n +0000728456 00000 n +0000017580 00000 n +0000017609 00000 n +0000513987 00000 n +0000728363 00000 n +0000017659 00000 n +0000017693 00000 n +0000519675 00000 n +0000728284 00000 n +0000017743 00000 n +0000017780 00000 n +0000018149 00000 n +0000018271 00000 n +0000026100 00000 n +0000017833 00000 n +0000025974 00000 n +0000026037 00000 n +0000723763 00000 n +0000697820 00000 n +0000723589 00000 n +0000724788 00000 n +0000021134 00000 n +0000021351 00000 n +0000021420 00000 n +0000021489 00000 n +0000021557 00000 n +0000021625 00000 n +0000021674 00000 n +0000021721 00000 n +0000022054 00000 n +0000022076 00000 n +0000022244 00000 n +0000022409 00000 n +0000022578 00000 n +0000022757 00000 n +0000023066 00000 n +0000023226 00000 n +0000027466 00000 n +0000027281 00000 n +0000026200 00000 n +0000027403 00000 n +0000696599 00000 n +0000670078 00000 n +0000696425 00000 n +0000669393 00000 n +0000667249 00000 n +0000669229 00000 n +0000039173 00000 n +0000030522 00000 n +0000027551 00000 n +0000039047 00000 n +0000039110 00000 n +0000031056 00000 n +0000031210 00000 n +0000031367 00000 n +0000031524 00000 n +0000031680 00000 n +0000031837 00000 n +0000031999 00000 n +0000032160 00000 n +0000032321 00000 n +0000032483 00000 n +0000032650 00000 n +0000032817 00000 n +0000032982 00000 n +0000033144 00000 n +0000033310 00000 n +0000033471 00000 n +0000033626 00000 n +0000033783 00000 n +0000033939 00000 n +0000034096 00000 n +0000034253 00000 n +0000034410 00000 n +0000034564 00000 n +0000034720 00000 n +0000034882 00000 n +0000035044 00000 n +0000035200 00000 n +0000035357 00000 n +0000035519 00000 n +0000035686 00000 n +0000035852 00000 n +0000036013 00000 n +0000036168 00000 n +0000036325 00000 n +0000036482 00000 n +0000036644 00000 n +0000036801 00000 n +0000036958 00000 n +0000037120 00000 n +0000037277 00000 n +0000037439 00000 n +0000037606 00000 n +0000037772 00000 n +0000037934 00000 n +0000038096 00000 n +0000038258 00000 n +0000038420 00000 n +0000038582 00000 n +0000038737 00000 n +0000038892 00000 n +0000052547 00000 n +0000042497 00000 n +0000039258 00000 n +0000052484 00000 n +0000666698 00000 n +0000649617 00000 n +0000666514 00000 n +0000043087 00000 n +0000043250 00000 n +0000043412 00000 n +0000043575 00000 n +0000043733 00000 n +0000043896 00000 n +0000044059 00000 n +0000044214 00000 n +0000044372 00000 n +0000044530 00000 n +0000044686 00000 n +0000044844 00000 n +0000045007 00000 n +0000045175 00000 n +0000045343 00000 n +0000045506 00000 n +0000045674 00000 n +0000045842 00000 n +0000046000 00000 n +0000046163 00000 n +0000046326 00000 n +0000046488 00000 n +0000046650 00000 n +0000046813 00000 n +0000046975 00000 n +0000047137 00000 n +0000047300 00000 n +0000047463 00000 n +0000047626 00000 n +0000047795 00000 n +0000047964 00000 n +0000048133 00000 n +0000048296 00000 n +0000048460 00000 n +0000048624 00000 n +0000048787 00000 n +0000048951 00000 n +0000049115 00000 n +0000049283 00000 n +0000049452 00000 n +0000049621 00000 n +0000049790 00000 n +0000049959 00000 n +0000050128 00000 n +0000050297 00000 n +0000050466 00000 n +0000050635 00000 n +0000050805 00000 n +0000050975 00000 n +0000051145 00000 n +0000051315 00000 n +0000051485 00000 n +0000051655 00000 n +0000051824 00000 n +0000051994 00000 n +0000052161 00000 n +0000052322 00000 n +0000065709 00000 n +0000056176 00000 n +0000052645 00000 n +0000065646 00000 n +0000056750 00000 n +0000056913 00000 n +0000057076 00000 n +0000057239 00000 n +0000057402 00000 n +0000057565 00000 n +0000057728 00000 n +0000057890 00000 n +0000058051 00000 n +0000058218 00000 n +0000058386 00000 n +0000058554 00000 n +0000058722 00000 n +0000058879 00000 n +0000059039 00000 n +0000059205 00000 n +0000059372 00000 n +0000059534 00000 n +0000059696 00000 n +0000059858 00000 n +0000060019 00000 n +0000060185 00000 n +0000060352 00000 n +0000060519 00000 n +0000060681 00000 n +0000060843 00000 n +0000061000 00000 n +0000061167 00000 n +0000061329 00000 n +0000061496 00000 n +0000061663 00000 n +0000061830 00000 n +0000648728 00000 n +0000627397 00000 n +0000648554 00000 n +0000061997 00000 n +0000062164 00000 n +0000062318 00000 n +0000062475 00000 n +0000062632 00000 n +0000062794 00000 n +0000062956 00000 n +0000063113 00000 n +0000063268 00000 n +0000063425 00000 n +0000063587 00000 n +0000063744 00000 n +0000063901 00000 n +0000064057 00000 n +0000064214 00000 n +0000064376 00000 n +0000064533 00000 n +0000064695 00000 n +0000064852 00000 n +0000065014 00000 n +0000065176 00000 n +0000065337 00000 n +0000065491 00000 n +0000068921 00000 n +0000066744 00000 n +0000065820 00000 n +0000068858 00000 n +0000066974 00000 n +0000067131 00000 n +0000067288 00000 n +0000067444 00000 n +0000067601 00000 n +0000067758 00000 n +0000067915 00000 n +0000068072 00000 n +0000068229 00000 n +0000068385 00000 n +0000626431 00000 n +0000606464 00000 n +0000626258 00000 n +0000068543 00000 n +0000068700 00000 n +0000072084 00000 n +0000071274 00000 n +0000069019 00000 n +0000071396 00000 n +0000071520 00000 n +0000071645 00000 n +0000071770 00000 n +0000071895 00000 n +0000071958 00000 n +0000072021 00000 n +0000605670 00000 n +0000587353 00000 n +0000605497 00000 n +0000724906 00000 n +0000076655 00000 n +0000075475 00000 n +0000072208 00000 n +0000075969 00000 n +0000076032 00000 n +0000076095 00000 n +0000076219 00000 n +0000076344 00000 n +0000076469 00000 n +0000075625 00000 n +0000075818 00000 n +0000076592 00000 n +0000337590 00000 n +0000397084 00000 n +0000081310 00000 n +0000080274 00000 n +0000076779 00000 n +0000080747 00000 n +0000080872 00000 n +0000080424 00000 n +0000080586 00000 n +0000080997 00000 n +0000081122 00000 n +0000081247 00000 n +0000097234 00000 n +0000084532 00000 n +0000083972 00000 n +0000081434 00000 n +0000084094 00000 n +0000084219 00000 n +0000084344 00000 n +0000084469 00000 n +0000087959 00000 n +0000086818 00000 n +0000084643 00000 n +0000087272 00000 n +0000087397 00000 n +0000087522 00000 n +0000087647 00000 n +0000087772 00000 n +0000086968 00000 n +0000087120 00000 n +0000087896 00000 n +0000287301 00000 n +0000089040 00000 n +0000088729 00000 n +0000088044 00000 n +0000088851 00000 n +0000088976 00000 n +0000091137 00000 n +0000090434 00000 n +0000089138 00000 n +0000090560 00000 n +0000090688 00000 n +0000090815 00000 n +0000090943 00000 n +0000091072 00000 n +0000725024 00000 n +0000094066 00000 n +0000093177 00000 n +0000091236 00000 n +0000093485 00000 n +0000093614 00000 n +0000093679 00000 n +0000093744 00000 n +0000093324 00000 n +0000093873 00000 n +0000094002 00000 n +0000271243 00000 n +0000097427 00000 n +0000096979 00000 n +0000094178 00000 n +0000097105 00000 n +0000586678 00000 n +0000574689 00000 n +0000586499 00000 n +0000097362 00000 n +0000101249 00000 n +0000101058 00000 n +0000097553 00000 n +0000101184 00000 n +0000574148 00000 n +0000564404 00000 n +0000573969 00000 n +0000105860 00000 n +0000105461 00000 n +0000101415 00000 n +0000105795 00000 n +0000105608 00000 n +0000172253 00000 n +0000108206 00000 n +0000107756 00000 n +0000105999 00000 n +0000107882 00000 n +0000108011 00000 n +0000108076 00000 n +0000108141 00000 n +0000110935 00000 n +0000113482 00000 n +0000110779 00000 n +0000108331 00000 n +0000112901 00000 n +0000113030 00000 n +0000113159 00000 n +0000112578 00000 n +0000112740 00000 n +0000563534 00000 n +0000554114 00000 n +0000563360 00000 n +0000553550 00000 n +0000544464 00000 n +0000553375 00000 n +0000113288 00000 n +0000113417 00000 n +0000725149 00000 n +0000112407 00000 n +0000112465 00000 n +0000112555 00000 n +0000212434 00000 n +0000248146 00000 n +0000118002 00000 n +0000117067 00000 n +0000113638 00000 n +0000117550 00000 n +0000117679 00000 n +0000117223 00000 n +0000117388 00000 n +0000117808 00000 n +0000117937 00000 n +0000401111 00000 n +0000121616 00000 n +0000121236 00000 n +0000118154 00000 n +0000121551 00000 n +0000121383 00000 n +0000122866 00000 n +0000122675 00000 n +0000121741 00000 n +0000122801 00000 n +0000125569 00000 n +0000124992 00000 n +0000122965 00000 n +0000125118 00000 n +0000125247 00000 n +0000125376 00000 n +0000125505 00000 n +0000128809 00000 n +0000128102 00000 n +0000125707 00000 n +0000128228 00000 n +0000128357 00000 n +0000128486 00000 n +0000128615 00000 n +0000128744 00000 n +0000133116 00000 n +0000132218 00000 n +0000128934 00000 n +0000132536 00000 n +0000132665 00000 n +0000132365 00000 n +0000132794 00000 n +0000132923 00000 n +0000133051 00000 n +0000725274 00000 n +0000330221 00000 n +0000137152 00000 n +0000136574 00000 n +0000133241 00000 n +0000136700 00000 n +0000136829 00000 n +0000136958 00000 n +0000137087 00000 n +0000140613 00000 n +0000140293 00000 n +0000137290 00000 n +0000140419 00000 n +0000140548 00000 n +0000143945 00000 n +0000143186 00000 n +0000140725 00000 n +0000143494 00000 n +0000143623 00000 n +0000143333 00000 n +0000143752 00000 n +0000143880 00000 n +0000396826 00000 n +0000146685 00000 n +0000146107 00000 n +0000144113 00000 n +0000146233 00000 n +0000146362 00000 n +0000146491 00000 n +0000146620 00000 n +0000147125 00000 n +0000146934 00000 n +0000146784 00000 n +0000147060 00000 n +0000151127 00000 n +0000150361 00000 n +0000147167 00000 n +0000150675 00000 n +0000150804 00000 n +0000150932 00000 n +0000150997 00000 n +0000151062 00000 n +0000150508 00000 n +0000725399 00000 n +0000155623 00000 n +0000155815 00000 n +0000155368 00000 n +0000151226 00000 n +0000155494 00000 n +0000155750 00000 n +0000159694 00000 n +0000159117 00000 n +0000155940 00000 n +0000159243 00000 n +0000159371 00000 n +0000159500 00000 n +0000159629 00000 n +0000162513 00000 n +0000163892 00000 n +0000162387 00000 n +0000159832 00000 n +0000163439 00000 n +0000163568 00000 n +0000163697 00000 n +0000163762 00000 n +0000163827 00000 n +0000166969 00000 n +0000166262 00000 n +0000164047 00000 n +0000166388 00000 n +0000166517 00000 n +0000166645 00000 n +0000166710 00000 n +0000166775 00000 n +0000166904 00000 n +0000172576 00000 n +0000171658 00000 n +0000167081 00000 n +0000172124 00000 n +0000171814 00000 n +0000171965 00000 n +0000172382 00000 n +0000172511 00000 n +0000523089 00000 n +0000176415 00000 n +0000175144 00000 n +0000172714 00000 n +0000175834 00000 n +0000175963 00000 n +0000176092 00000 n +0000175309 00000 n +0000175461 00000 n +0000175647 00000 n +0000176221 00000 n +0000176350 00000 n +0000725524 00000 n +0000180646 00000 n +0000180326 00000 n +0000176541 00000 n +0000180452 00000 n +0000180581 00000 n +0000184122 00000 n +0000183743 00000 n +0000180771 00000 n +0000184057 00000 n +0000183890 00000 n +0000187139 00000 n +0000187334 00000 n +0000186884 00000 n +0000184234 00000 n +0000187010 00000 n +0000187204 00000 n +0000187269 00000 n +0000190703 00000 n +0000190512 00000 n +0000187446 00000 n +0000190638 00000 n +0000195014 00000 n +0000194436 00000 n +0000190815 00000 n +0000194562 00000 n +0000194691 00000 n +0000194756 00000 n +0000194821 00000 n +0000194950 00000 n +0000198225 00000 n +0000197183 00000 n +0000195126 00000 n +0000197644 00000 n +0000197773 00000 n +0000197339 00000 n +0000197491 00000 n +0000197902 00000 n +0000198031 00000 n +0000198160 00000 n +0000725649 00000 n +0000199777 00000 n +0000199586 00000 n +0000198337 00000 n +0000199712 00000 n +0000201300 00000 n +0000201109 00000 n +0000199876 00000 n +0000201235 00000 n +0000204105 00000 n +0000203785 00000 n +0000201399 00000 n +0000203911 00000 n +0000204040 00000 n +0000208528 00000 n +0000208159 00000 n +0000204243 00000 n +0000208463 00000 n +0000208306 00000 n +0000366981 00000 n +0000212499 00000 n +0000212179 00000 n +0000208640 00000 n +0000212305 00000 n +0000216337 00000 n +0000216017 00000 n +0000212624 00000 n +0000216143 00000 n +0000216208 00000 n +0000216272 00000 n +0000725774 00000 n +0000221633 00000 n +0000220341 00000 n +0000216462 00000 n +0000221568 00000 n +0000220533 00000 n +0000220687 00000 n +0000220842 00000 n +0000221027 00000 n +0000221201 00000 n +0000221386 00000 n +0000290835 00000 n +0000225939 00000 n +0000225748 00000 n +0000221814 00000 n +0000225874 00000 n +0000229702 00000 n +0000229511 00000 n +0000226064 00000 n +0000229637 00000 n +0000234015 00000 n +0000233073 00000 n +0000229814 00000 n +0000233563 00000 n +0000233692 00000 n +0000233229 00000 n +0000233821 00000 n +0000233950 00000 n +0000233397 00000 n +0000304312 00000 n +0000237811 00000 n +0000237249 00000 n +0000234127 00000 n +0000237746 00000 n +0000237405 00000 n +0000237576 00000 n +0000384536 00000 n +0000241235 00000 n +0000240788 00000 n +0000237980 00000 n +0000240914 00000 n +0000241042 00000 n +0000241171 00000 n +0000725899 00000 n +0000244802 00000 n +0000244611 00000 n +0000241360 00000 n +0000244737 00000 n +0000248211 00000 n +0000247891 00000 n +0000244971 00000 n +0000248017 00000 n +0000251891 00000 n +0000251700 00000 n +0000248367 00000 n +0000251826 00000 n +0000256213 00000 n +0000255399 00000 n +0000252060 00000 n +0000255890 00000 n +0000256019 00000 n +0000255555 00000 n +0000256148 00000 n +0000255715 00000 n +0000260364 00000 n +0000259868 00000 n +0000256368 00000 n +0000260170 00000 n +0000260299 00000 n +0000260015 00000 n +0000264002 00000 n +0000263553 00000 n +0000260489 00000 n +0000263679 00000 n +0000263808 00000 n +0000263937 00000 n +0000726024 00000 n +0000267909 00000 n +0000267242 00000 n +0000264157 00000 n +0000267715 00000 n +0000267844 00000 n +0000267398 00000 n +0000267560 00000 n +0000271438 00000 n +0000270798 00000 n +0000268078 00000 n +0000271114 00000 n +0000270945 00000 n +0000271308 00000 n +0000271373 00000 n +0000275474 00000 n +0000274971 00000 n +0000271621 00000 n +0000275280 00000 n +0000275409 00000 n +0000275118 00000 n +0000280264 00000 n +0000279585 00000 n +0000275642 00000 n +0000280070 00000 n +0000279741 00000 n +0000544109 00000 n +0000542110 00000 n +0000543944 00000 n +0000280199 00000 n +0000279902 00000 n +0000363552 00000 n +0000299250 00000 n +0000283673 00000 n +0000283353 00000 n +0000280390 00000 n +0000283479 00000 n +0000283608 00000 n +0000287365 00000 n +0000287046 00000 n +0000283798 00000 n +0000287172 00000 n +0000726149 00000 n +0000290900 00000 n +0000290451 00000 n +0000287507 00000 n +0000290577 00000 n +0000290706 00000 n +0000295399 00000 n +0000294607 00000 n +0000291012 00000 n +0000295077 00000 n +0000294763 00000 n +0000294915 00000 n +0000295206 00000 n +0000295335 00000 n +0000299315 00000 n +0000298562 00000 n +0000295511 00000 n +0000298863 00000 n +0000298992 00000 n +0000299121 00000 n +0000298709 00000 n +0000302758 00000 n +0000302438 00000 n +0000299427 00000 n +0000302564 00000 n +0000302693 00000 n +0000304377 00000 n +0000304057 00000 n +0000302870 00000 n +0000304183 00000 n +0000305902 00000 n +0000305711 00000 n +0000304489 00000 n +0000305837 00000 n +0000726274 00000 n +0000308815 00000 n +0000308236 00000 n +0000306001 00000 n +0000308362 00000 n +0000308491 00000 n +0000308620 00000 n +0000308685 00000 n +0000308750 00000 n +0000313010 00000 n +0000312501 00000 n +0000308927 00000 n +0000312816 00000 n +0000312648 00000 n +0000312945 00000 n +0000523056 00000 n +0000318900 00000 n +0000316165 00000 n +0000313122 00000 n +0000318706 00000 n +0000318835 00000 n +0000316429 00000 n +0000316591 00000 n +0000316753 00000 n +0000316914 00000 n +0000317074 00000 n +0000317236 00000 n +0000317407 00000 n +0000317569 00000 n +0000317731 00000 n +0000317894 00000 n +0000318057 00000 n +0000318220 00000 n +0000318383 00000 n +0000318546 00000 n +0000324121 00000 n +0000322204 00000 n +0000319012 00000 n +0000324056 00000 n +0000322432 00000 n +0000322595 00000 n +0000322762 00000 n +0000322931 00000 n +0000323093 00000 n +0000323254 00000 n +0000323416 00000 n +0000323577 00000 n +0000323740 00000 n +0000323893 00000 n +0000330286 00000 n +0000327279 00000 n +0000324246 00000 n +0000330092 00000 n +0000327561 00000 n +0000327714 00000 n +0000327868 00000 n +0000328019 00000 n +0000328173 00000 n +0000328334 00000 n +0000328496 00000 n +0000328658 00000 n +0000328820 00000 n +0000328982 00000 n +0000329144 00000 n +0000329306 00000 n +0000329458 00000 n +0000329621 00000 n +0000329776 00000 n +0000329938 00000 n +0000333816 00000 n +0000333495 00000 n +0000330398 00000 n +0000333621 00000 n +0000333686 00000 n +0000333751 00000 n +0000726399 00000 n +0000338041 00000 n +0000336845 00000 n +0000333985 00000 n +0000337332 00000 n +0000337461 00000 n +0000337718 00000 n +0000337001 00000 n +0000337171 00000 n +0000337783 00000 n +0000337848 00000 n +0000337913 00000 n +0000337977 00000 n +0000341388 00000 n +0000341197 00000 n +0000338223 00000 n +0000341323 00000 n +0000345128 00000 n +0000344807 00000 n +0000341474 00000 n +0000344933 00000 n +0000344998 00000 n +0000345063 00000 n +0000348960 00000 n +0000348253 00000 n +0000345240 00000 n +0000348379 00000 n +0000348508 00000 n +0000348571 00000 n +0000348636 00000 n +0000348701 00000 n +0000348766 00000 n +0000348895 00000 n +0000352712 00000 n +0000351874 00000 n +0000349072 00000 n +0000352000 00000 n +0000352065 00000 n +0000352130 00000 n +0000352259 00000 n +0000352324 00000 n +0000352389 00000 n +0000352518 00000 n +0000352583 00000 n +0000352647 00000 n +0000355833 00000 n +0000355128 00000 n +0000352837 00000 n +0000355254 00000 n +0000355382 00000 n +0000355511 00000 n +0000355640 00000 n +0000355769 00000 n +0000726524 00000 n +0000359611 00000 n +0000359161 00000 n +0000356030 00000 n +0000359287 00000 n +0000359416 00000 n +0000359481 00000 n +0000359546 00000 n +0000363876 00000 n 0000363118 00000 n -0000363247 00000 n -0000363312 00000 n -0000363377 00000 n -0000363506 00000 n -0000363570 00000 n -0000366293 00000 n -0000365908 00000 n +0000359750 00000 n +0000363423 00000 n +0000363681 00000 n 0000363746 00000 n -0000366034 00000 n -0000366099 00000 n -0000529136 00000 n -0000521853 00000 n -0000528956 00000 n -0000366228 00000 n -0000366760 00000 n -0000366569 00000 n -0000366419 00000 n -0000366695 00000 n -0000368655 00000 n -0000368207 00000 n -0000366802 00000 n -0000368333 00000 n -0000368462 00000 n -0000368591 00000 n -0000713955 00000 n -0000373228 00000 n -0000372285 00000 n -0000368767 00000 n -0000372648 00000 n -0000521532 00000 n -0000512319 00000 n -0000521346 00000 n -0000372432 00000 n -0000372777 00000 n -0000372905 00000 n -0000373034 00000 n -0000374270 00000 n -0000374079 00000 n -0000373465 00000 n -0000374205 00000 n -0000374697 00000 n -0000374506 00000 n -0000374356 00000 n -0000374632 00000 n -0000378010 00000 n -0000376784 00000 n -0000374739 00000 n -0000377301 00000 n -0000377430 00000 n -0000377559 00000 n -0000377688 00000 n -0000377817 00000 n -0000377946 00000 n -0000376940 00000 n -0000377112 00000 n -0000378464 00000 n -0000378273 00000 n -0000378123 00000 n -0000378399 00000 n -0000381708 00000 n -0000381130 00000 n -0000378506 00000 n -0000381256 00000 n -0000381385 00000 n -0000381514 00000 n -0000381643 00000 n -0000714080 00000 n -0000385987 00000 n -0000384768 00000 n -0000381794 00000 n -0000385279 00000 n -0000385408 00000 n -0000385666 00000 n -0000384924 00000 n -0000385103 00000 n -0000385859 00000 n -0000385923 00000 n -0000392873 00000 n -0000389045 00000 n -0000386140 00000 n -0000389171 00000 n -0000389236 00000 n -0000389301 00000 n -0000389366 00000 n -0000389431 00000 n +0000363811 00000 n +0000363265 00000 n +0000367434 00000 n +0000366726 00000 n +0000364001 00000 n +0000366852 00000 n +0000367110 00000 n +0000367239 00000 n +0000367304 00000 n +0000367369 00000 n +0000371121 00000 n +0000370487 00000 n +0000367546 00000 n +0000370799 00000 n +0000370634 00000 n +0000370928 00000 n +0000370992 00000 n +0000371056 00000 n +0000523023 00000 n +0000375100 00000 n +0000374394 00000 n +0000371233 00000 n +0000374520 00000 n +0000374648 00000 n +0000374713 00000 n +0000374778 00000 n +0000374907 00000 n +0000374972 00000 n +0000375036 00000 n +0000377643 00000 n +0000377323 00000 n +0000375226 00000 n +0000377449 00000 n +0000541829 00000 n +0000534545 00000 n +0000541649 00000 n +0000377578 00000 n +0000726649 00000 n +0000378124 00000 n +0000377933 00000 n +0000377783 00000 n +0000378059 00000 n +0000380016 00000 n +0000379568 00000 n +0000378166 00000 n +0000379694 00000 n +0000379823 00000 n +0000379952 00000 n +0000384601 00000 n +0000383658 00000 n +0000380128 00000 n +0000384021 00000 n +0000534224 00000 n +0000525011 00000 n +0000534038 00000 n +0000383805 00000 n +0000384150 00000 n +0000384278 00000 n +0000384407 00000 n +0000385643 00000 n +0000385452 00000 n +0000384838 00000 n +0000385578 00000 n +0000386070 00000 n +0000385879 00000 n +0000385729 00000 n +0000386005 00000 n +0000389383 00000 n +0000388157 00000 n +0000386112 00000 n +0000388674 00000 n +0000388803 00000 n +0000388932 00000 n +0000389061 00000 n +0000389190 00000 n +0000389319 00000 n +0000388313 00000 n +0000388485 00000 n +0000726774 00000 n +0000389837 00000 n +0000389646 00000 n 0000389496 00000 n -0000389561 00000 n -0000389626 00000 n -0000389691 00000 n -0000389756 00000 n -0000389886 00000 n -0000389951 00000 n -0000390016 00000 n -0000390081 00000 n -0000390146 00000 n -0000390211 00000 n -0000390276 00000 n -0000390341 00000 n -0000390406 00000 n -0000390471 00000 n -0000390536 00000 n -0000390601 00000 n -0000390666 00000 n -0000390731 00000 n -0000390796 00000 n -0000390861 00000 n -0000390926 00000 n -0000390991 00000 n -0000391056 00000 n -0000391121 00000 n -0000391186 00000 n -0000391251 00000 n -0000391316 00000 n -0000391381 00000 n -0000391445 00000 n -0000391510 00000 n -0000391575 00000 n -0000391640 00000 n -0000391705 00000 n -0000391770 00000 n -0000391835 00000 n -0000391900 00000 n -0000391965 00000 n -0000392030 00000 n -0000392095 00000 n -0000392160 00000 n -0000392225 00000 n -0000392290 00000 n -0000392355 00000 n -0000392420 00000 n -0000392485 00000 n -0000392550 00000 n -0000392615 00000 n -0000392680 00000 n -0000392745 00000 n -0000392809 00000 n -0000399519 00000 n -0000395955 00000 n -0000392985 00000 n -0000396081 00000 n -0000396146 00000 n -0000396211 00000 n -0000396276 00000 n -0000396341 00000 n -0000396406 00000 n -0000396471 00000 n -0000396536 00000 n -0000396601 00000 n -0000396666 00000 n -0000396731 00000 n -0000396796 00000 n -0000396860 00000 n -0000396925 00000 n -0000396990 00000 n -0000397055 00000 n -0000397120 00000 n -0000397185 00000 n -0000397250 00000 n -0000397315 00000 n -0000397380 00000 n -0000397445 00000 n -0000397510 00000 n -0000397575 00000 n -0000397639 00000 n -0000397704 00000 n -0000397769 00000 n -0000397834 00000 n -0000397899 00000 n -0000397964 00000 n -0000398029 00000 n -0000398094 00000 n -0000398159 00000 n -0000398224 00000 n -0000398289 00000 n -0000398354 00000 n -0000398419 00000 n -0000398484 00000 n -0000398549 00000 n -0000398614 00000 n -0000398678 00000 n -0000398742 00000 n -0000398806 00000 n -0000398871 00000 n -0000398936 00000 n -0000399001 00000 n -0000399066 00000 n -0000399131 00000 n -0000399196 00000 n -0000399261 00000 n -0000399326 00000 n -0000399391 00000 n -0000399455 00000 n -0000405692 00000 n -0000402254 00000 n -0000399631 00000 n -0000402380 00000 n -0000402445 00000 n -0000402510 00000 n -0000402575 00000 n -0000402640 00000 n -0000402705 00000 n -0000402770 00000 n -0000402835 00000 n -0000402900 00000 n -0000402965 00000 n -0000403030 00000 n -0000403095 00000 n -0000403160 00000 n -0000403225 00000 n -0000403290 00000 n -0000403355 00000 n -0000403420 00000 n -0000403485 00000 n -0000403550 00000 n -0000403615 00000 n -0000403680 00000 n -0000403745 00000 n -0000403810 00000 n -0000403875 00000 n -0000403940 00000 n -0000404005 00000 n -0000404070 00000 n -0000404135 00000 n -0000404200 00000 n -0000404265 00000 n -0000404330 00000 n -0000404395 00000 n -0000404460 00000 n -0000404525 00000 n -0000404589 00000 n -0000404654 00000 n -0000404719 00000 n -0000404784 00000 n -0000404849 00000 n -0000404914 00000 n -0000404979 00000 n -0000405044 00000 n -0000405109 00000 n -0000405174 00000 n -0000405239 00000 n -0000405304 00000 n -0000405369 00000 n -0000405434 00000 n -0000405499 00000 n -0000405564 00000 n -0000405628 00000 n -0000410270 00000 n -0000408006 00000 n -0000405804 00000 n -0000408132 00000 n -0000408197 00000 n -0000408262 00000 n -0000408327 00000 n -0000408392 00000 n -0000408457 00000 n -0000408522 00000 n -0000408587 00000 n -0000408652 00000 n -0000408717 00000 n -0000408782 00000 n -0000408847 00000 n -0000408912 00000 n -0000408977 00000 n -0000409039 00000 n -0000409103 00000 n -0000409168 00000 n -0000409232 00000 n -0000409297 00000 n -0000409362 00000 n -0000409427 00000 n -0000409492 00000 n -0000409557 00000 n -0000409622 00000 n -0000409687 00000 n -0000409816 00000 n -0000409945 00000 n -0000410010 00000 n -0000410075 00000 n -0000410140 00000 n -0000410205 00000 n -0000413065 00000 n -0000412421 00000 n -0000410395 00000 n -0000412547 00000 n -0000412676 00000 n -0000412805 00000 n -0000412870 00000 n -0000412935 00000 n -0000413000 00000 n -0000714205 00000 n -0000417403 00000 n -0000417083 00000 n -0000413178 00000 n -0000417209 00000 n -0000417274 00000 n -0000417339 00000 n -0000420874 00000 n -0000420618 00000 n -0000417556 00000 n -0000420744 00000 n -0000420809 00000 n -0000424122 00000 n -0000423931 00000 n -0000421013 00000 n -0000424057 00000 n -0000427851 00000 n -0000427595 00000 n -0000424248 00000 n -0000427721 00000 n -0000427786 00000 n -0000430691 00000 n -0000429983 00000 n -0000427990 00000 n -0000430109 00000 n -0000430174 00000 n -0000430239 00000 n -0000430304 00000 n -0000430369 00000 n -0000430498 00000 n -0000430563 00000 n -0000430627 00000 n -0000435364 00000 n -0000435108 00000 n -0000430830 00000 n -0000435234 00000 n -0000435299 00000 n -0000714330 00000 n -0000438315 00000 n -0000437542 00000 n -0000435490 00000 n -0000437668 00000 n -0000437733 00000 n -0000437798 00000 n -0000437863 00000 n -0000437992 00000 n -0000438057 00000 n -0000438120 00000 n -0000438185 00000 n -0000438250 00000 n -0000440916 00000 n -0000440207 00000 n -0000438468 00000 n -0000440333 00000 n -0000440398 00000 n -0000440463 00000 n -0000440528 00000 n -0000440593 00000 n -0000440658 00000 n -0000440787 00000 n -0000440852 00000 n -0000443940 00000 n -0000443555 00000 n -0000441068 00000 n -0000443681 00000 n -0000443746 00000 n -0000443810 00000 n -0000443875 00000 n -0000447035 00000 n -0000446261 00000 n -0000444080 00000 n -0000446387 00000 n -0000446452 00000 n -0000446517 00000 n -0000446582 00000 n -0000446711 00000 n -0000446776 00000 n -0000446841 00000 n +0000389772 00000 n +0000393081 00000 n +0000392503 00000 n +0000389879 00000 n +0000392629 00000 n +0000392758 00000 n +0000392887 00000 n +0000393016 00000 n +0000397276 00000 n +0000396058 00000 n +0000393167 00000 n +0000396568 00000 n +0000396697 00000 n +0000396955 00000 n +0000396214 00000 n +0000396393 00000 n +0000397148 00000 n +0000397212 00000 n +0000404163 00000 n +0000400335 00000 n +0000397429 00000 n +0000400461 00000 n +0000400526 00000 n +0000400591 00000 n +0000400656 00000 n +0000400721 00000 n +0000400786 00000 n +0000400851 00000 n +0000400916 00000 n +0000400981 00000 n +0000401046 00000 n +0000401176 00000 n +0000401241 00000 n +0000401306 00000 n +0000401371 00000 n +0000401436 00000 n +0000401501 00000 n +0000401566 00000 n +0000401631 00000 n +0000401696 00000 n +0000401761 00000 n +0000401826 00000 n +0000401891 00000 n +0000401956 00000 n +0000402021 00000 n +0000402086 00000 n +0000402151 00000 n +0000402216 00000 n +0000402281 00000 n +0000402346 00000 n +0000402411 00000 n +0000402476 00000 n +0000402541 00000 n +0000402606 00000 n +0000402671 00000 n +0000402735 00000 n +0000402800 00000 n +0000402865 00000 n +0000402930 00000 n +0000402995 00000 n +0000403060 00000 n +0000403125 00000 n +0000403190 00000 n +0000403255 00000 n +0000403320 00000 n +0000403385 00000 n +0000403450 00000 n +0000403515 00000 n +0000403580 00000 n +0000403645 00000 n +0000403710 00000 n +0000403775 00000 n +0000403840 00000 n +0000403905 00000 n +0000403970 00000 n +0000404035 00000 n +0000404099 00000 n +0000410809 00000 n +0000407245 00000 n +0000404275 00000 n +0000407371 00000 n +0000407436 00000 n +0000407501 00000 n +0000407566 00000 n +0000407631 00000 n +0000407696 00000 n +0000407761 00000 n +0000407826 00000 n +0000407891 00000 n +0000407956 00000 n +0000408021 00000 n +0000408086 00000 n +0000408150 00000 n +0000408215 00000 n +0000408280 00000 n +0000408345 00000 n +0000408410 00000 n +0000408475 00000 n +0000408540 00000 n +0000408605 00000 n +0000408670 00000 n +0000408735 00000 n +0000408800 00000 n +0000408865 00000 n +0000408929 00000 n +0000408994 00000 n +0000409059 00000 n +0000409124 00000 n +0000409189 00000 n +0000409254 00000 n +0000409319 00000 n +0000409384 00000 n +0000409449 00000 n +0000409514 00000 n +0000409579 00000 n +0000409644 00000 n +0000409709 00000 n +0000409774 00000 n +0000409839 00000 n +0000409904 00000 n +0000409968 00000 n +0000410032 00000 n +0000410096 00000 n +0000410161 00000 n +0000410226 00000 n +0000410291 00000 n +0000410356 00000 n +0000410421 00000 n +0000410486 00000 n +0000410551 00000 n +0000410616 00000 n +0000410681 00000 n +0000410745 00000 n +0000416982 00000 n +0000413544 00000 n +0000410921 00000 n +0000413670 00000 n +0000413735 00000 n +0000413800 00000 n +0000413865 00000 n +0000413930 00000 n +0000413995 00000 n +0000414060 00000 n +0000414125 00000 n +0000414190 00000 n +0000414255 00000 n +0000414320 00000 n +0000414385 00000 n +0000414450 00000 n +0000414515 00000 n +0000414580 00000 n +0000414645 00000 n +0000414710 00000 n +0000414775 00000 n +0000414840 00000 n +0000414905 00000 n +0000414970 00000 n +0000415035 00000 n +0000415100 00000 n +0000415165 00000 n +0000415230 00000 n +0000415295 00000 n +0000415360 00000 n +0000415425 00000 n +0000415490 00000 n +0000415555 00000 n +0000415620 00000 n +0000415685 00000 n +0000415750 00000 n +0000415815 00000 n +0000415879 00000 n +0000415944 00000 n +0000416009 00000 n +0000416074 00000 n +0000416139 00000 n +0000416204 00000 n +0000416269 00000 n +0000416334 00000 n +0000416399 00000 n +0000416464 00000 n +0000416529 00000 n +0000416594 00000 n +0000416659 00000 n +0000416724 00000 n +0000416789 00000 n +0000416854 00000 n +0000416918 00000 n +0000726899 00000 n +0000421560 00000 n +0000419296 00000 n +0000417094 00000 n +0000419422 00000 n +0000419487 00000 n +0000419552 00000 n +0000419617 00000 n +0000419682 00000 n +0000419747 00000 n +0000419812 00000 n +0000419877 00000 n +0000419942 00000 n +0000420007 00000 n +0000420072 00000 n +0000420137 00000 n +0000420202 00000 n +0000420267 00000 n +0000420329 00000 n +0000420393 00000 n +0000420458 00000 n +0000420522 00000 n +0000420587 00000 n +0000420652 00000 n +0000420717 00000 n +0000420782 00000 n +0000420847 00000 n +0000420912 00000 n +0000420977 00000 n +0000421106 00000 n +0000421235 00000 n +0000421300 00000 n +0000421365 00000 n +0000421430 00000 n +0000421495 00000 n +0000424355 00000 n +0000423711 00000 n +0000421685 00000 n +0000423837 00000 n +0000423966 00000 n +0000424095 00000 n +0000424160 00000 n +0000424225 00000 n +0000424290 00000 n +0000428694 00000 n +0000428374 00000 n +0000424468 00000 n +0000428500 00000 n +0000428565 00000 n +0000428630 00000 n +0000432294 00000 n +0000432039 00000 n +0000428847 00000 n +0000432165 00000 n +0000432230 00000 n +0000435543 00000 n +0000435352 00000 n +0000432433 00000 n +0000435478 00000 n +0000439271 00000 n +0000439015 00000 n +0000435669 00000 n +0000439141 00000 n +0000439206 00000 n +0000727024 00000 n +0000442111 00000 n +0000441403 00000 n +0000439410 00000 n +0000441529 00000 n +0000441594 00000 n +0000441659 00000 n +0000441724 00000 n +0000441789 00000 n +0000441918 00000 n +0000441983 00000 n +0000442047 00000 n +0000446779 00000 n +0000446523 00000 n +0000442250 00000 n +0000446649 00000 n +0000446714 00000 n +0000449730 00000 n +0000448957 00000 n 0000446905 00000 n -0000446970 00000 n -0000450308 00000 n -0000450117 00000 n -0000447201 00000 n -0000450243 00000 n -0000453409 00000 n -0000452699 00000 n -0000450434 00000 n -0000452825 00000 n -0000452890 00000 n -0000452955 00000 n -0000453020 00000 n -0000453085 00000 n -0000453214 00000 n -0000453279 00000 n -0000453344 00000 n -0000714455 00000 n -0000457067 00000 n -0000456748 00000 n -0000453574 00000 n -0000456874 00000 n -0000456939 00000 n -0000457003 00000 n -0000460443 00000 n -0000460252 00000 n -0000457193 00000 n -0000460378 00000 n -0000463120 00000 n -0000462477 00000 n -0000460583 00000 n -0000462603 00000 n -0000462668 00000 n -0000462732 00000 n -0000462797 00000 n -0000462926 00000 n -0000462991 00000 n -0000463056 00000 n -0000465837 00000 n -0000465063 00000 n -0000463272 00000 n -0000465189 00000 n -0000465254 00000 n -0000465318 00000 n -0000465383 00000 n -0000465448 00000 n -0000465513 00000 n -0000465642 00000 n -0000465707 00000 n -0000465772 00000 n -0000469228 00000 n -0000468907 00000 n -0000465990 00000 n -0000469033 00000 n -0000469098 00000 n -0000469163 00000 n -0000472297 00000 n -0000471912 00000 n -0000469341 00000 n -0000472038 00000 n -0000472103 00000 n -0000472168 00000 n -0000472233 00000 n -0000714580 00000 n -0000475693 00000 n -0000475114 00000 n -0000472436 00000 n -0000475240 00000 n -0000475369 00000 n -0000475434 00000 n -0000475499 00000 n -0000475564 00000 n -0000475629 00000 n -0000478674 00000 n -0000478483 00000 n -0000475833 00000 n -0000478609 00000 n -0000481314 00000 n -0000480605 00000 n -0000478885 00000 n -0000480731 00000 n -0000480796 00000 n -0000480861 00000 n -0000480926 00000 n -0000480991 00000 n -0000481056 00000 n -0000481185 00000 n -0000481250 00000 n -0000485767 00000 n -0000485446 00000 n -0000481510 00000 n -0000485572 00000 n -0000485637 00000 n -0000485702 00000 n -0000489361 00000 n -0000489106 00000 n -0000485893 00000 n -0000489232 00000 n -0000489297 00000 n -0000492296 00000 n -0000492040 00000 n -0000489487 00000 n -0000492166 00000 n -0000492231 00000 n -0000714705 00000 n -0000495466 00000 n -0000494691 00000 n -0000492422 00000 n -0000494817 00000 n -0000494882 00000 n -0000494947 00000 n -0000495012 00000 n -0000495141 00000 n -0000495206 00000 n -0000495271 00000 n -0000495336 00000 n -0000495401 00000 n -0000498834 00000 n -0000498190 00000 n -0000495632 00000 n -0000498316 00000 n -0000498381 00000 n -0000498446 00000 n -0000498511 00000 n -0000498640 00000 n -0000498705 00000 n -0000498770 00000 n -0000502306 00000 n -0000501985 00000 n -0000499000 00000 n -0000502111 00000 n -0000502176 00000 n -0000502241 00000 n -0000504879 00000 n -0000504301 00000 n -0000502432 00000 n -0000504427 00000 n -0000504492 00000 n -0000504557 00000 n -0000504622 00000 n -0000504751 00000 n -0000504815 00000 n -0000508675 00000 n -0000508290 00000 n -0000505017 00000 n -0000508416 00000 n -0000508481 00000 n -0000508546 00000 n -0000508611 00000 n -0000510245 00000 n -0000509861 00000 n -0000508815 00000 n -0000509987 00000 n -0000510052 00000 n -0000510115 00000 n -0000510180 00000 n -0000714830 00000 n -0000510430 00000 n -0000521774 00000 n -0000529362 00000 n -0000531661 00000 n -0000531630 00000 n -0000541154 00000 n -0000551267 00000 n -0000561743 00000 n -0000574367 00000 n -0000593432 00000 n -0000614319 00000 n -0000636463 00000 n -0000654358 00000 n -0000657188 00000 n -0000656958 00000 n -0000684495 00000 n -0000711606 00000 n -0000714910 00000 n -0000715033 00000 n -0000715159 00000 n -0000715285 00000 n -0000715402 00000 n -0000715494 00000 n -0000731830 00000 n -0000750703 00000 n -0000750744 00000 n -0000750784 00000 n -0000750918 00000 n +0000449083 00000 n +0000449148 00000 n +0000449213 00000 n +0000449278 00000 n +0000449407 00000 n +0000449472 00000 n +0000449535 00000 n +0000449600 00000 n +0000449665 00000 n +0000452331 00000 n +0000451622 00000 n +0000449883 00000 n +0000451748 00000 n +0000451813 00000 n +0000451878 00000 n +0000451943 00000 n +0000452008 00000 n +0000452073 00000 n +0000452202 00000 n +0000452267 00000 n +0000455355 00000 n +0000454970 00000 n +0000452483 00000 n +0000455096 00000 n +0000455161 00000 n +0000455225 00000 n +0000455290 00000 n +0000458450 00000 n +0000457676 00000 n +0000455495 00000 n +0000457802 00000 n +0000457867 00000 n +0000457932 00000 n +0000457997 00000 n +0000458126 00000 n +0000458191 00000 n +0000458256 00000 n +0000458320 00000 n +0000458385 00000 n +0000727149 00000 n +0000461723 00000 n +0000461532 00000 n +0000458616 00000 n +0000461658 00000 n +0000464823 00000 n +0000464113 00000 n +0000461849 00000 n +0000464239 00000 n +0000464304 00000 n +0000464369 00000 n +0000464434 00000 n +0000464499 00000 n +0000464628 00000 n +0000464693 00000 n +0000464758 00000 n +0000468481 00000 n +0000468162 00000 n +0000464988 00000 n +0000468288 00000 n +0000468353 00000 n +0000468417 00000 n +0000471857 00000 n +0000471666 00000 n +0000468607 00000 n +0000471792 00000 n +0000474868 00000 n +0000474418 00000 n +0000471997 00000 n +0000474544 00000 n +0000474609 00000 n +0000474674 00000 n +0000474739 00000 n +0000474804 00000 n +0000477300 00000 n +0000476526 00000 n +0000475006 00000 n +0000476652 00000 n +0000476781 00000 n +0000476846 00000 n +0000476911 00000 n +0000476976 00000 n +0000477041 00000 n +0000477106 00000 n +0000477171 00000 n +0000477236 00000 n +0000727274 00000 n +0000480529 00000 n +0000479949 00000 n +0000477453 00000 n +0000480075 00000 n +0000480204 00000 n +0000480269 00000 n +0000480334 00000 n +0000480399 00000 n +0000480464 00000 n +0000483987 00000 n +0000483796 00000 n +0000480669 00000 n +0000483922 00000 n +0000486972 00000 n +0000486197 00000 n +0000484113 00000 n +0000486323 00000 n +0000486388 00000 n +0000486453 00000 n +0000486518 00000 n +0000486647 00000 n +0000486712 00000 n +0000486777 00000 n +0000486842 00000 n +0000486907 00000 n +0000490279 00000 n +0000490088 00000 n +0000487125 00000 n +0000490214 00000 n +0000493070 00000 n +0000492684 00000 n +0000490490 00000 n +0000492810 00000 n +0000492875 00000 n +0000492940 00000 n +0000493005 00000 n +0000497081 00000 n +0000496436 00000 n +0000493307 00000 n +0000496562 00000 n +0000496627 00000 n +0000496692 00000 n +0000496821 00000 n +0000496886 00000 n +0000496951 00000 n +0000497016 00000 n +0000727399 00000 n +0000501017 00000 n +0000500761 00000 n +0000497220 00000 n +0000500887 00000 n +0000500952 00000 n +0000504237 00000 n +0000503981 00000 n +0000501143 00000 n +0000504107 00000 n +0000504172 00000 n +0000506951 00000 n +0000506307 00000 n +0000504363 00000 n +0000506433 00000 n +0000506498 00000 n +0000506563 00000 n +0000506628 00000 n +0000506757 00000 n +0000506822 00000 n +0000506887 00000 n +0000510720 00000 n +0000510335 00000 n +0000507103 00000 n +0000510461 00000 n +0000510526 00000 n +0000510590 00000 n +0000510655 00000 n +0000514311 00000 n +0000513666 00000 n +0000510860 00000 n +0000513792 00000 n +0000513857 00000 n +0000513922 00000 n +0000514051 00000 n +0000514116 00000 n +0000514181 00000 n +0000514246 00000 n +0000516582 00000 n +0000516326 00000 n +0000514463 00000 n +0000516452 00000 n +0000516517 00000 n +0000727524 00000 n +0000520063 00000 n +0000519289 00000 n +0000516721 00000 n +0000519415 00000 n +0000519480 00000 n +0000519545 00000 n +0000519610 00000 n +0000519738 00000 n +0000519803 00000 n +0000519868 00000 n +0000519933 00000 n +0000519998 00000 n +0000522871 00000 n +0000522485 00000 n +0000520216 00000 n +0000522611 00000 n +0000522676 00000 n +0000522741 00000 n +0000522806 00000 n +0000523122 00000 n +0000534466 00000 n +0000542055 00000 n +0000544356 00000 n +0000544325 00000 n +0000553849 00000 n +0000563962 00000 n +0000574436 00000 n +0000587060 00000 n +0000606125 00000 n +0000627012 00000 n +0000649155 00000 n +0000667050 00000 n +0000669880 00000 n +0000669650 00000 n +0000697187 00000 n +0000724298 00000 n +0000727622 00000 n +0000727746 00000 n +0000727872 00000 n +0000727998 00000 n +0000728115 00000 n +0000728207 00000 n +0000744729 00000 n +0000763926 00000 n +0000763967 00000 n +0000764007 00000 n +0000764141 00000 n trailer << -/Size 2120 -/Root 2118 0 R -/Info 2119 0 R -/ID [ ] +/Size 2150 +/Root 2148 0 R +/Info 2149 0 R +/ID [ ] >> startxref -751176 +764399 %%EOF diff --git a/doc/arm/man.dnssec-signzone.html b/doc/arm/man.dnssec-signzone.html index 9e4b00f..40c0976 100644 --- a/doc/arm/man.dnssec-signzone.html +++ b/doc/arm/man.dnssec-signzone.html @@ -14,12 +14,12 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + dnssec-signzone - + @@ -50,7 +50,7 @@

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -61,7 +61,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -276,7 +276,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -305,7 +305,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -330,14 +330,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-checkconf.html b/doc/arm/man.named-checkconf.html index c6aeb32..94c22f6 100644 --- a/doc/arm/man.named-checkconf.html +++ b/doc/arm/man.named-checkconf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,14 +50,14 @@

named-checkconf [-h] [-v] [-j] [-t directory] {filename} [-z]

-

DESCRIPTION

+

DESCRIPTION

named-checkconf checks the syntax, but not the semantics, of a named configuration file.

-

OPTIONS

+

OPTIONS

-h

@@ -92,21 +92,21 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkconf returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkzone(8), BIND 9 Administrator Reference Manual.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-checkzone.html b/doc/arm/man.named-checkzone.html index 4cee97f..b187a1a 100644 --- a/doc/arm/man.named-checkzone.html +++ b/doc/arm/man.named-checkzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -51,7 +51,7 @@

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

-

DESCRIPTION

+

DESCRIPTION

named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a @@ -71,7 +71,7 @@

-

OPTIONS

+

OPTIONS

-d

@@ -257,14 +257,14 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkzone returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkconf(8), RFC 1035, @@ -272,7 +272,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named.html b/doc/arm/man.named.html index 3e33887..2a440ce 100644 --- a/doc/arm/man.named.html +++ b/doc/arm/man.named.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

named [-4] [-6] [-c config-file] [-d debug-level] [-f] [-g] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-u user] [-v] [-V] [-x cache-file]

-

DESCRIPTION

+

DESCRIPTION

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -65,7 +65,7 @@

-

OPTIONS

+

OPTIONS

-4

@@ -238,7 +238,7 @@

-

SIGNALS

+

SIGNALS

In routine operation, signals should not be used to control the nameserver; rndc should be used @@ -259,7 +259,7 @@

-

CONFIGURATION

+

CONFIGURATION

The named configuration file is too complex to describe in detail here. A complete description is provided @@ -268,7 +268,7 @@

-

FILES

+

FILES

/etc/named.conf

@@ -281,7 +281,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 1033, RFC 1034, RFC 1035, @@ -294,7 +294,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.nsupdate.html b/doc/arm/man.nsupdate.html index a0ce866..eb3b7be 100644 --- a/doc/arm/man.nsupdate.html +++ b/doc/arm/man.nsupdate.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

nsupdate [-d] [-D] [[-g] | [-o] | [-y [hmac:]keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-R randomdev] [-v] [filename]

-

DESCRIPTION

+

DESCRIPTION

nsupdate is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. @@ -187,7 +187,7 @@

-

INPUT FORMAT

+

INPUT FORMAT

nsupdate reads input from filename @@ -451,7 +451,7 @@

-

EXAMPLES

+

EXAMPLES

The examples below show how nsupdate @@ -505,7 +505,7 @@

-

FILES

+

FILES

/etc/resolv.conf

@@ -524,7 +524,7 @@

-

SEE ALSO

+

SEE ALSO

RFC2136, RFC3007, RFC2104, @@ -537,7 +537,7 @@

-

BUGS

+

BUGS

The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library diff --git a/doc/arm/man.rndc-confgen.html b/doc/arm/man.rndc-confgen.html index 485e6f4..cb59c2e 100644 --- a/doc/arm/man.rndc-confgen.html +++ b/doc/arm/man.rndc-confgen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -48,7 +48,7 @@

rndc-confgen [-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port] [-r randomfile] [-s address] [-t chrootdir] [-u user]

-

DESCRIPTION

+

DESCRIPTION

rndc-confgen generates configuration files for rndc. It can be used as a @@ -64,7 +64,7 @@

-

OPTIONS

+

OPTIONS

-a
@@ -171,7 +171,7 @@
-

EXAMPLES

+

EXAMPLES

To allow rndc to be used with no manual configuration, run @@ -188,7 +188,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc.conf(5), named(8), @@ -196,7 +196,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.conf.html b/doc/arm/man.rndc.conf.html index b4c0801..e8e86ba 100644 --- a/doc/arm/man.rndc.conf.html +++ b/doc/arm/man.rndc.conf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc.conf

-

DESCRIPTION

+

DESCRIPTION

rndc.conf is the configuration file for rndc, the BIND 9 name server control utility. This file has a similar structure and syntax to @@ -135,7 +135,7 @@

-

EXAMPLE

+

EXAMPLE

       options {
         default-server  localhost;
@@ -209,7 +209,7 @@
     

-

NAME SERVER CONFIGURATION

+

NAME SERVER CONFIGURATION

The name server must be configured to accept rndc connections and to recognize the key specified in the rndc.conf @@ -219,7 +219,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc-confgen(8), mmencode(1), @@ -227,7 +227,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.html b/doc/arm/man.rndc.html index ae38ad1..36843bc 100644 --- a/doc/arm/man.rndc.html +++ b/doc/arm/man.rndc.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}

-

DESCRIPTION

+

DESCRIPTION

rndc controls the operation of a name server. It supersedes the ndc utility @@ -79,7 +79,7 @@

-

OPTIONS

+

OPTIONS

-b source-address

@@ -151,7 +151,7 @@

-

LIMITATIONS

+

LIMITATIONS

rndc does not yet support all the commands of the BIND 8 ndc utility. @@ -165,7 +165,7 @@

-

SEE ALSO

+

SEE ALSO

rndc.conf(5), rndc-confgen(8), named(8), @@ -175,7 +175,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index 3b78208..c75c774 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.h,v 1.93.50.3 2009/01/18 23:25:17 marka Exp $ */ +/* $Id: db.h,v 1.93.50.3.12.1 2009/12/31 21:44:37 each Exp $ */ #ifndef DNS_DB_H #define DNS_DB_H 1 @@ -205,14 +205,15 @@ struct dns_db { /*% * Options that can be specified for dns_db_find(). */ -#define DNS_DBFIND_GLUEOK 0x01 -#define DNS_DBFIND_VALIDATEGLUE 0x02 -#define DNS_DBFIND_NOWILD 0x04 -#define DNS_DBFIND_PENDINGOK 0x08 -#define DNS_DBFIND_NOEXACT 0x10 -#define DNS_DBFIND_FORCENSEC 0x20 -#define DNS_DBFIND_COVERINGNSEC 0x40 -#define DNS_DBFIND_FORCENSEC3 0x80 +#define DNS_DBFIND_GLUEOK 0x0001 +#define DNS_DBFIND_VALIDATEGLUE 0x0002 +#define DNS_DBFIND_NOWILD 0x0004 +#define DNS_DBFIND_PENDINGOK 0x0008 +#define DNS_DBFIND_NOEXACT 0x0010 +#define DNS_DBFIND_FORCENSEC 0x0020 +#define DNS_DBFIND_COVERINGNSEC 0x0040 +#define DNS_DBFIND_FORCENSEC3 0x0080 +#define DNS_DBFIND_ADDITIONALOK 0x0100 /*@}*/ /*@{*/ diff --git a/lib/dns/include/dns/ncache.h b/lib/dns/include/dns/ncache.h index a818fe6..d61684d 100644 --- a/lib/dns/include/dns/ncache.h +++ b/lib/dns/include/dns/ncache.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.h,v 1.25 2008/09/25 04:02:39 tbox Exp $ */ +/* $Id: ncache.h,v 1.25.142.1 2009/12/31 20:29:21 each Exp $ */ #ifndef DNS_NCACHE_H #define DNS_NCACHE_H 1 @@ -76,7 +76,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache, * The 'covers' argument is the RR type whose nonexistence we are caching, * or dns_rdatatype_any when caching a NXDOMAIN response. * - * 'optout' indicates a DNS_RATASETATTR_OPTOUT should be set. + * 'optout' indicates a DNS_RDATASETATTR_OPTOUT should be set. * * Note: *\li If 'addedrdataset' is not NULL, then it will be attached to the added diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h index 8c7773c..525dd8d 100644 --- a/lib/dns/include/dns/types.h +++ b/lib/dns/include/dns/types.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: types.h,v 1.130.50.3.12.1 2009/11/18 23:58:04 marka Exp $ */ +/* $Id: types.h,v 1.130.50.3.12.2 2009/12/31 20:29:21 each Exp $ */ #ifndef DNS_TYPES_H #define DNS_TYPES_H 1 @@ -301,6 +301,8 @@ enum { #define DNS_TRUST_PENDING(x) ((x) == dns_trust_pending_answer || \ (x) == dns_trust_pending_additional) +#define DNS_TRUST_ADDITIONAL(x) ((x) == dns_trust_additional || \ + (x) == dns_trust_pending_additional) #define DNS_TRUST_GLUE(x) ((x) == dns_trust_glue) diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index b163441..d5b5b5c 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.6.10.1 2009/11/18 23:58:04 marka Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.6.10.2 2009/12/31 21:44:36 each Exp $ */ /*! \file */ @@ -4546,6 +4546,8 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * If we didn't find what we were looking for... */ if (found == NULL || + (DNS_TRUST_ADDITIONAL(found->trust) && + ((options & DNS_DBFIND_ADDITIONALOK) == 0)) || (found->trust == dns_trust_glue && ((options & DNS_DBFIND_GLUEOK) == 0)) || (DNS_TRUST_PENDING(found->trust) && diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 3b90af4..1b4f407 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.384.14.14.8.1 2009/11/18 23:58:04 marka Exp $ */ +/* $Id: resolver.c,v 1.384.14.14.8.2 2010/01/07 17:17:19 each Exp $ */ /*! \file */ @@ -4289,11 +4289,19 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, rdataset->ttl = res->view->maxcachettl; /* - * If this rrset is in a secure domain, do DNSSEC validation - * for it, unless it is glue. + * If this RRset is in a secure domain, is in bailiwick, + * and is not glue, attempt DNSSEC validation. (We do not + * attempt to validate glue or out-of-bailiwick data--even + * though there might be some performance benefit to doing + * so--because it makes it simpler and safer to ensure that + * records from a secure domain are only cached if validated + * within the context of a query to the domain that owns + * them.) */ - if (secure_domain && rdataset->trust != dns_trust_glue) { + if (secure_domain && rdataset->trust != dns_trust_glue && + !EXTERNAL(rdataset)) { dns_trust_t trust; + /* * RRSIGs are validated as part of validating the * type they cover. @@ -4330,22 +4338,6 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, } /* - * Reject out of bailiwick additional records - * without RRSIGs as they can't possibly validate - * as "secure" and as we will never never want to - * store these as "answers" after validation. - */ - if (rdataset->trust == dns_trust_additional && - sigrdataset == NULL && EXTERNAL(rdataset)) - continue; - - /* - * XXXMPA: If we store as "answer" after validating - * then we need to do bailiwick processing and - * also need to track whether RRsets are in or - * out of bailiwick. This will require a another - * pending trust level. - * * Cache this rdataset/sigrdataset pair as * pending data. Track whether it was additional * or not. @@ -5463,9 +5455,7 @@ answer_response(fetchctx_t *fctx) { /* * This data is outside of * our query domain, and - * may only be cached if it - * comes from a secure zone - * and validates. + * may not be cached. */ rdataset->attributes |= DNS_RDATASETATTR_EXTERNAL; diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 46a7491..ce49daf 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.9.8.1 2009/11/18 23:58:04 marka Exp $ */ +/* $Id: validator.c,v 1.164.12.9.8.2 2009/12/31 20:29:21 each Exp $ */ #include @@ -3242,20 +3242,20 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) if (val->havedlvsep) dns_name_copy(dns_fixedname_name(&val->dlvsep), secroot, NULL); else { + unsigned int labels; dns_name_copy(val->event->name, secroot, NULL); /* * If this is a response to a DS query, we need to look in * the parent zone for the trust anchor. */ - if (val->event->type == dns_rdatatype_ds && - dns_name_countlabels(secroot) > 1U) - dns_name_split(secroot, 1, NULL, secroot); + + labels = dns_name_countlabels(secroot); + if (val->event->type == dns_rdatatype_ds && labels > 1U) + dns_name_getlabelsequence(secroot, 1, labels - 1, + secroot); result = dns_keytable_finddeepestmatch(val->keytable, secroot, secroot); - if (result == ISC_R_NOTFOUND) { - validator_log(val, ISC_LOG_DEBUG(3), - "not beneath secure root"); if (val->mustbesecure) { validator_log(val, ISC_LOG_WARNING, "must be secure failure"); diff --git a/lib/lwres/man/lwres.html b/lib/lwres/man/lwres.html index 70d7856..986918a 100644 --- a/lib/lwres/man/lwres.html +++ b/lib/lwres/man/lwres.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres — introduction to the lightweight resolver library

@@ -32,7 +32,7 @@
#include <lwres/lwres.h>
-

DESCRIPTION

+

DESCRIPTION

The BIND 9 lightweight resolver library is a simple, name service independent stub resolver library. It provides hostname-to-address @@ -47,7 +47,7 @@

-

OVERVIEW

+

OVERVIEW

The lwresd library implements multiple name service APIs. The standard @@ -101,7 +101,7 @@

-

CLIENT-SIDE LOW-LEVEL API CALL FLOW

+

CLIENT-SIDE LOW-LEVEL API CALL FLOW

When a client program wishes to make an lwres request using the native low-level API, it typically performs the following @@ -149,7 +149,7 @@

-

SERVER-SIDE LOW-LEVEL API CALL FLOW

+

SERVER-SIDE LOW-LEVEL API CALL FLOW

When implementing the server side of the lightweight resolver protocol using the lwres library, a sequence of actions like the @@ -191,7 +191,7 @@

-

SEE ALSO

+

SEE ALSO

lwres_gethostent(3), lwres_getipnode(3), diff --git a/lib/lwres/man/lwres_buffer.html b/lib/lwres/man/lwres_buffer.html index deb5262..7ed5407 100644 --- a/lib/lwres/man/lwres_buffer.html +++ b/lib/lwres/man/lwres_buffer.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem — lightweight resolver buffer management

@@ -262,7 +262,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide bounds checked access to a region of memory where data is being read or written. diff --git a/lib/lwres/man/lwres_config.html b/lib/lwres/man/lwres_config.html index e27892b..050fd5d 100644 --- a/lib/lwres/man/lwres_config.html +++ b/lib/lwres/man/lwres_config.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get — lightweight resolver configuration

@@ -90,7 +90,7 @@ lwres_conf_t *
-

DESCRIPTION

+

DESCRIPTION

lwres_conf_init() creates an empty lwres_conf_t @@ -123,7 +123,7 @@ lwres_conf_t *

-

RETURN VALUES

+

RETURN VALUES

lwres_conf_parse() returns LWRES_R_SUCCESS if it successfully read and parsed @@ -142,13 +142,13 @@ lwres_conf_t *

-

SEE ALSO

+

SEE ALSO

stdio(3), resolver(5).

-

FILES

+

FILES

/etc/resolv.conf

diff --git a/lib/lwres/man/lwres_context.html b/lib/lwres/man/lwres_context.html index 18c3d38..d6fada9 100644 --- a/lib/lwres/man/lwres_context.html +++ b/lib/lwres/man/lwres_context.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv — lightweight resolver context management

@@ -172,7 +172,7 @@ void *
-

DESCRIPTION

+

DESCRIPTION

lwres_context_create() creates a lwres_context_t structure for use in lightweight resolver operations. It holds a socket and other @@ -258,7 +258,7 @@ void *

-

RETURN VALUES

+

RETURN VALUES

lwres_context_create() returns LWRES_R_NOMEMORY if memory for the struct lwres_context could not be allocated, @@ -283,7 +283,7 @@ void *

-

SEE ALSO

+

SEE ALSO

lwres_conf_init(3), malloc(3), diff --git a/lib/lwres/man/lwres_gabn.html b/lib/lwres/man/lwres_gabn.html index a51d252..efb152a3 100644 --- a/lib/lwres/man/lwres_gabn.html +++ b/lib/lwres/man/lwres_gabn.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free — lightweight resolver getaddrbyname message handling

@@ -178,7 +178,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver name-to-address lookup request and @@ -278,7 +278,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getaddrbyname opcode functions lwres_gabnrequest_render(), @@ -316,7 +316,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_gai_strerror.html b/lib/lwres/man/lwres_gai_strerror.html index c64beb1..aeb0967 100644 --- a/lib/lwres/man/lwres_gai_strerror.html +++ b/lib/lwres/man/lwres_gai_strerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gai_strerror — print suitable error string

@@ -42,7 +42,7 @@ char *
-

DESCRIPTION

+

DESCRIPTION

lwres_gai_strerror() returns an error message corresponding to an error code returned by getaddrinfo(). @@ -110,7 +110,7 @@ char *

-

SEE ALSO

+

SEE ALSO

strerror(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_getaddrinfo.html b/lib/lwres/man/lwres_getaddrinfo.html index d4dd956..ec00839 100644 --- a/lib/lwres/man/lwres_getaddrinfo.html +++ b/lib/lwres/man/lwres_getaddrinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getaddrinfo, lwres_freeaddrinfo — socket address structure to host and service name

@@ -89,7 +89,7 @@ struct addrinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getaddrinfo() is used to get a list of IP addresses and port numbers for host hostname and service @@ -283,7 +283,7 @@ struct addrinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getaddrinfo() returns zero on success or one of the error codes listed in gai_strerror(3) @@ -294,7 +294,7 @@ struct addrinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_gethostent.html b/lib/lwres/man/lwres_gethostent.html index efeeaa2..9465440 100644 --- a/lib/lwres/man/lwres_gethostent.html +++ b/lib/lwres/man/lwres_gethostent.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r — lightweight resolver get network host entry

@@ -228,7 +228,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide hostname-to-address and address-to-hostname lookups by means of the lightweight resolver. @@ -366,7 +366,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

The functions lwres_gethostbyname(), @@ -430,7 +430,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

gethostent(3), lwres_getipnode(3), @@ -439,7 +439,7 @@ struct hostent {

-

BUGS

+

BUGS

lwres_gethostbyname(), lwres_gethostbyname2(), lwres_gethostbyaddr() diff --git a/lib/lwres/man/lwres_getipnode.html b/lib/lwres/man/lwres_getipnode.html index 23fe50f..c92c51c 100644 --- a/lib/lwres/man/lwres_getipnode.html +++ b/lib/lwres/man/lwres_getipnode.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent — lightweight resolver nodename / address translation API

@@ -98,7 +98,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions perform thread safe, protocol independent nodename-to-address and address-to-nodename @@ -217,7 +217,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

If an error occurs, lwres_getipnodebyname() @@ -261,7 +261,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

RFC2553, lwres(3), diff --git a/lib/lwres/man/lwres_getnameinfo.html b/lib/lwres/man/lwres_getnameinfo.html index 53a70d9..7730131 100644 --- a/lib/lwres/man/lwres_getnameinfo.html +++ b/lib/lwres/man/lwres_getnameinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getnameinfo — lightweight resolver socket address structure to hostname and @@ -82,7 +82,7 @@ int

-

DESCRIPTION

+

DESCRIPTION

This function is equivalent to the getnameinfo(3) function defined in RFC2133. @@ -149,13 +149,13 @@ int

-

RETURN VALUES

+

RETURN VALUES

lwres_getnameinfo() returns 0 on success or a non-zero error code if an error occurs.

-

SEE ALSO

+

SEE ALSO

RFC2133, getservbyport(3), lwres(3), @@ -165,7 +165,7 @@ int

-

BUGS

+

BUGS

RFC2133 fails to define what the nonzero return values of getnameinfo(3) diff --git a/lib/lwres/man/lwres_getrrsetbyname.html b/lib/lwres/man/lwres_getrrsetbyname.html index 8dc36a1..15bfb82 100644 --- a/lib/lwres/man/lwres_getrrsetbyname.html +++ b/lib/lwres/man/lwres_getrrsetbyname.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getrrsetbyname, lwres_freerrset — retrieve DNS records

@@ -102,7 +102,7 @@ struct rrsetinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getrrsetbyname() gets a set of resource records associated with a hostname, class, @@ -150,7 +150,7 @@ struct rrsetinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getrrsetbyname() returns zero on success, and one of the following error codes if an error occurred: @@ -184,7 +184,7 @@ struct rrsetinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3).

diff --git a/lib/lwres/man/lwres_gnba.html b/lib/lwres/man/lwres_gnba.html index 88b18a8..80c909e 100644 --- a/lib/lwres/man/lwres_gnba.html +++ b/lib/lwres/man/lwres_gnba.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free — lightweight resolver getnamebyaddress message handling

@@ -183,7 +183,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver address-to-name lookup request and @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getnamebyaddr opcode functions lwres_gnbarequest_render(), @@ -308,7 +308,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3).

diff --git a/lib/lwres/man/lwres_hstrerror.html b/lib/lwres/man/lwres_hstrerror.html index ef67d48..b166e3d 100644 --- a/lib/lwres/man/lwres_hstrerror.html +++ b/lib/lwres/man/lwres_hstrerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_herror, lwres_hstrerror — lightweight resolver error message generation

@@ -50,7 +50,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_herror() prints the string s on stderr followed by the string generated by @@ -84,7 +84,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

The string Unknown resolver error is returned by lwres_hstrerror() @@ -94,7 +94,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

herror(3), lwres_hstrerror(3). diff --git a/lib/lwres/man/lwres_inetntop.html b/lib/lwres/man/lwres_inetntop.html index 1a91110..3522a1d 100644 --- a/lib/lwres/man/lwres_inetntop.html +++ b/lib/lwres/man/lwres_inetntop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_net_ntop — lightweight resolver IP address presentation

@@ -62,7 +62,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_net_ntop() converts an IP address of protocol family af — IPv4 or IPv6 — at @@ -80,7 +80,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

If successful, the function returns dst: a pointer to a string containing the presentation format of the @@ -93,7 +93,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

RFC1884, inet_ntop(3), errno(3). diff --git a/lib/lwres/man/lwres_noop.html b/lib/lwres/man/lwres_noop.html index aab581a..18a41fa 100644 --- a/lib/lwres/man/lwres_noop.html +++ b/lib/lwres/man/lwres_noop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free — lightweight resolver no-op message handling

@@ -179,7 +179,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver no-op request and response messages. @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The no-op opcode functions lwres_nooprequest_render(), @@ -309,7 +309,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_packet.html b/lib/lwres/man/lwres_packet.html index b4cc1df..11601e8 100644 --- a/lib/lwres/man/lwres_packet.html +++ b/lib/lwres/man/lwres_packet.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_lwpacket_renderheader, lwres_lwpacket_parseheader — lightweight resolver packet handling functions

@@ -66,7 +66,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

These functions rely on a struct lwres_lwpacket @@ -219,7 +219,7 @@ struct lwres_lwpacket {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_lwpacket_renderheader() and diff --git a/lib/lwres/man/lwres_resutil.html b/lib/lwres/man/lwres_resutil.html index 7bc3e6e..e67ac0a 100644 --- a/lib/lwres/man/lwres_resutil.html +++ b/lib/lwres/man/lwres_resutil.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr — lightweight resolver utility functions

@@ -134,7 +134,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

lwres_string_parse() retrieves a DNS-encoded string starting the current pointer of lightweight resolver buffer b: i.e. @@ -210,7 +210,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_string_parse() @@ -248,7 +248,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_buffer(3), lwres_gabn(3). diff --git a/version b/version index ccb7b87..c6fcc3f 100644 --- a/version +++ b/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.5.8.2 2009/11/18 23:58:04 marka Exp $ +# $Id: version,v 1.43.12.5.8.3 2009/12/31 20:29:20 each Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -7,4 +7,4 @@ MAJORVER=9 MINORVER=6 PATCHVER=1 RELEASETYPE=-P -RELEASEVER=2 +RELEASEVER=3 -- cgit v1.1 From 78d3ed4dabea80d9111600a39b8d15b94f74c1ed Mon Sep 17 00:00:00 2001 From: dougb Date: Tue, 2 Mar 2010 19:49:55 +0000 Subject: Vendor import of BIND 9.6.2 --- CHANGES | 418 +- COPYRIGHT | 4 +- FAQ | 18 +- FAQ.xml | 35 +- NSEC3-NOTES | 4 +- README | 23 + bin/check/named-checkconf.8 | 4 +- bin/check/named-checkconf.html | 4 +- bin/check/named-checkzone.8 | 8 +- bin/check/named-checkzone.c | 8 +- bin/check/named-checkzone.docbook | 4 +- bin/check/named-checkzone.html | 18 +- bin/dig/dig.1 | 4 +- bin/dig/dig.html | 4 +- bin/dig/dighost.c | 16 +- bin/dig/host.1 | 4 +- bin/dig/host.c | 5 +- bin/dig/host.html | 4 +- bin/dig/nslookup.1 | 4 +- bin/dig/nslookup.c | 3 +- bin/dig/nslookup.html | 4 +- bin/dnssec/dnssec-dsfromkey.c | 18 +- bin/dnssec/dnssec-keyfromlabel.8 | 20 +- bin/dnssec/dnssec-keyfromlabel.c | 7 +- bin/dnssec/dnssec-keyfromlabel.docbook | 21 +- bin/dnssec/dnssec-keyfromlabel.html | 32 +- bin/dnssec/dnssec-keygen.8 | 20 +- bin/dnssec/dnssec-keygen.c | 22 +- bin/dnssec/dnssec-keygen.docbook | 31 +- bin/dnssec/dnssec-keygen.html | 43 +- bin/dnssec/dnssec-signzone.8 | 25 +- bin/dnssec/dnssec-signzone.c | 915 ++- bin/dnssec/dnssec-signzone.docbook | 33 +- bin/dnssec/dnssec-signzone.html | 45 +- bin/dnssec/dnssectool.c | 4 +- bin/dnssec/dnssectool.h | 6 +- bin/named/control.c | 12 +- bin/named/include/named/server.h | 5 +- bin/named/lwresd.8 | 4 +- bin/named/lwresd.html | 4 +- bin/named/named.8 | 22 +- bin/named/named.conf.5 | 4 +- bin/named/named.conf.html | 4 +- bin/named/named.docbook | 17 +- bin/named/named.html | 28 +- bin/named/query.c | 53 +- bin/named/server.c | 50 +- bin/named/statschannel.c | 400 +- bin/named/update.c | 25 +- bin/nsupdate/nsupdate.1 | 4 +- bin/nsupdate/nsupdate.html | 4 +- bin/rndc/rndc-confgen.8 | 4 +- bin/rndc/rndc-confgen.html | 4 +- bin/rndc/rndc.8 | 4 +- bin/rndc/rndc.conf.5 | 4 +- bin/rndc/rndc.conf.html | 4 +- bin/rndc/rndc.html | 4 +- config.h.in | 28 +- configure.in | 134 +- doc/arm/Bv9ARM-book.xml | 137 +- doc/arm/Bv9ARM.ch01.html | 54 +- doc/arm/Bv9ARM.ch02.html | 26 +- doc/arm/Bv9ARM.ch03.html | 30 +- doc/arm/Bv9ARM.ch04.html | 152 +- doc/arm/Bv9ARM.ch05.html | 10 +- doc/arm/Bv9ARM.ch06.html | 212 +- doc/arm/Bv9ARM.ch07.html | 18 +- doc/arm/Bv9ARM.ch08.html | 22 +- doc/arm/Bv9ARM.ch09.html | 184 +- doc/arm/Bv9ARM.ch10.html | 6 +- doc/arm/Bv9ARM.html | 152 +- doc/arm/Bv9ARM.pdf | 13063 +++++++++++++++--------------- doc/arm/man.dig.html | 24 +- doc/arm/man.dnssec-dsfromkey.html | 20 +- doc/arm/man.dnssec-keyfromlabel.html | 32 +- doc/arm/man.dnssec-keygen.html | 43 +- doc/arm/man.dnssec-signzone.html | 47 +- doc/arm/man.host.html | 14 +- doc/arm/man.named-checkconf.html | 16 +- doc/arm/man.named-checkzone.html | 20 +- doc/arm/man.named.html | 28 +- doc/arm/man.nsupdate.html | 18 +- doc/arm/man.rndc-confgen.html | 16 +- doc/arm/man.rndc.conf.html | 16 +- doc/arm/man.rndc.html | 16 +- doc/misc/Makefile.in | 16 +- lib/dns/api | 4 +- lib/dns/db.c | 6 +- lib/dns/dispatch.c | 28 +- lib/dns/dnssec.c | 69 +- lib/dns/dst_api.c | 53 +- lib/dns/dst_internal.h | 12 +- lib/dns/dst_parse.c | 18 +- lib/dns/include/dns/db.h | 6 +- lib/dns/include/dns/dnssec.h | 8 +- lib/dns/include/dns/journal.h | 11 +- lib/dns/include/dns/keyvalues.h | 6 +- lib/dns/include/dns/name.h | 8 +- lib/dns/include/dns/ncache.h | 4 +- lib/dns/include/dns/nsec3.h | 4 +- lib/dns/include/dns/rbt.h | 6 +- lib/dns/include/dns/types.h | 2 +- lib/dns/include/dns/zone.h | 20 +- lib/dns/include/dst/dst.h | 6 +- lib/dns/journal.c | 99 +- lib/dns/masterdump.c | 2 +- lib/dns/message.c | 4 +- lib/dns/nsec3.c | 25 +- lib/dns/opensslrsa_link.c | 504 +- lib/dns/rbt.c | 35 +- lib/dns/rbtdb.c | 127 +- lib/dns/rcode.c | 6 +- lib/dns/rdata/generic/ipseckey_45.c | 3 +- lib/dns/resolver.c | 46 +- lib/dns/sdb.c | 6 +- lib/dns/sdlz.c | 6 +- lib/dns/spnego.c | 18 +- lib/dns/validator.c | 2 +- lib/dns/view.c | 5 +- lib/dns/zone.c | 211 +- lib/isc/api | 4 +- lib/isc/base32.c | 4 +- lib/isc/base64.c | 8 +- lib/isc/heap.c | 14 +- lib/isc/httpd.c | 45 +- lib/isc/ia64/include/isc/atomic.h | 8 +- lib/isc/include/isc/entropy.h | 14 +- lib/isc/include/isc/netscope.h | 6 +- lib/isc/include/isc/portset.h | 4 +- lib/isc/include/isc/sha2.h | 10 +- lib/isc/include/isc/util.h | 14 +- lib/isc/inet_ntop.c | 11 +- lib/isc/powerpc/include/isc/atomic.h | 53 +- lib/isc/random.c | 27 +- lib/isc/sha2.c | 27 +- lib/isc/unix/ifiter_getifaddrs.c | 6 +- lib/isc/unix/socket.c | 31 +- lib/isccc/api | 2 +- lib/isccfg/aclconf.c | 23 +- lib/isccfg/api | 2 +- lib/isccfg/include/isccfg/namedconf.h | 6 +- lib/lwres/api | 2 +- lib/lwres/context.c | 15 +- lib/lwres/getipnode.c | 100 +- lib/lwres/man/lwres.3 | 4 +- lib/lwres/man/lwres.html | 16 +- lib/lwres/man/lwres_buffer.3 | 4 +- lib/lwres/man/lwres_buffer.html | 8 +- lib/lwres/man/lwres_config.3 | 4 +- lib/lwres/man/lwres_config.html | 14 +- lib/lwres/man/lwres_context.3 | 4 +- lib/lwres/man/lwres_context.html | 12 +- lib/lwres/man/lwres_gabn.3 | 4 +- lib/lwres/man/lwres_gabn.html | 12 +- lib/lwres/man/lwres_gai_strerror.3 | 4 +- lib/lwres/man/lwres_gai_strerror.html | 10 +- lib/lwres/man/lwres_getaddrinfo.3 | 4 +- lib/lwres/man/lwres_getaddrinfo.html | 12 +- lib/lwres/man/lwres_gethostent.3 | 4 +- lib/lwres/man/lwres_gethostent.html | 14 +- lib/lwres/man/lwres_getipnode.3 | 4 +- lib/lwres/man/lwres_getipnode.html | 12 +- lib/lwres/man/lwres_getnameinfo.3 | 4 +- lib/lwres/man/lwres_getnameinfo.html | 14 +- lib/lwres/man/lwres_getrrsetbyname.3 | 4 +- lib/lwres/man/lwres_getrrsetbyname.html | 12 +- lib/lwres/man/lwres_gnba.3 | 4 +- lib/lwres/man/lwres_gnba.html | 12 +- lib/lwres/man/lwres_hstrerror.3 | 4 +- lib/lwres/man/lwres_hstrerror.html | 12 +- lib/lwres/man/lwres_inetntop.3 | 4 +- lib/lwres/man/lwres_inetntop.html | 12 +- lib/lwres/man/lwres_noop.3 | 4 +- lib/lwres/man/lwres_noop.html | 12 +- lib/lwres/man/lwres_packet.3 | 4 +- lib/lwres/man/lwres_packet.html | 10 +- lib/lwres/man/lwres_resutil.3 | 4 +- lib/lwres/man/lwres_resutil.html | 12 +- version | 8 +- 179 files changed, 10801 insertions(+), 8339 deletions(-) diff --git a/CHANGES b/CHANGES index 0e9c9a6..d230421 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,27 @@ - --- 9.6.1-P3 released --- + + --- 9.6.2 released --- + +2850. [bug] If isc_heap_insert() failed due to memory shortage + the heap would have corrupted entries. [RT #20951] + +2849. [bug] Don't treat errors from the xml2 library as fatal. + [RT #20945] + +2846. [bug] EOF on unix domain sockets was not being handled + correctly. [RT #20731] + +2844. [doc] notify-delay default in ARM was wrong. It should have + been five (5) seconds. + + --- 9.6.2rc1 released --- + +2838. [func] Backport support for SHA-2 DNSSEC algorithms, + RSASHA256 and RSASHA512, from BIND 9.7. (This + incorporates changes 2726 and 2738 from that + release branch.) [RT #20871] + +2837. [port] Prevent Linux spurious warnings about fwrite(). + [RT #20812] 2831. [security] Do not attempt to validate or cache out-of-bailiwick data returned with a secure @@ -10,21 +33,286 @@ 2827. [security] Bogus NXDOMAIN could be cached as if valid. [RT #20712] - --- 9.6.1-P2 released --- +2825. [bug] Changing the setting of OPTOUT in a NSEC3 chain that + was in the process of being created was not properly + recorded in the zone. [RT #20786] + +2823. [bug] rbtdb.c:getsigningtime() was missing locks. [RT #20781] + +2819. [cleanup] Removed unnecessary DNS_POINTER_MAXHOPS define + [RT #20771] + +2818. [cleanup] rndc could return an incorrect error code + when a zone was not found. [RT #20767] + +2815. [bug] Exclusively lock the task when freezing a zone. + [RT #19838] + +2814. [func] Provide a definitive error message when a master + zone is not loaded. [RT #20757] + + --- 9.6.2b1 released --- + +2797. [bug] Don't decrement the dispatch manager's maxbuffers. + [RT #20613] + +2790. [bug] Handle DS queries to stub zones. [RT #20440] + +2789. [bug] Fixed an INSIST in dispatch.c [RT #20576] + +2786. [bug] Additional could be promoted to answer. [RT #20663] + +2784. [bug] TC was not always being set when required glue was + dropped. [RT #20655] + +2783. [func] Return minimal responses to EDNS/UDP queries with a UDP + buffer size of 512 or less. [RT #20654] + +2782. [port] win32: use getaddrinfo() for hostname lookups. + [RT #20650] + +2777. [contrib] DLZ MYSQL auto reconnect support discovery was wrong. 2772. [security] When validating, track whether pending data was from the additional section or not and only return it if validates as secure. [RT #20438] - --- 9.6.1-P1 released --- +2765. [bug] Skip masters for which the TSIG key cannot be found. + [RT #20595] + +2760. [cleanup] Corrected named-compilezone usage summary. [RT #20533] + +2759. [doc] Add information about .jbk/.jnw files to + the ARM. [RT #20303] + +2758. [bug] win32: Added a workaround for a windows 2008 bug + that could cause the UDP client handler to shut + down. [RT #19176] + +2757. [bug] dig: assertion failure could occur in connect + timeout. [RT #20599] + +2755. [doc] Clarify documentation of keyset- files in + dnssec-signzone man page. [RT #19810] + +2754. [bug] Secure-to-insecure transitions failed when zone + was signed with NSEC3. [RT #20587] + +2750. [bug] dig: assertion failure could occur when a server + didn't have an address. [RT #20579] + +2749. [bug] ixfr-from-differences generated a non-minimal ixfr + for NSEC3 signed zones. [RT #20452] + +2747. [bug] Journal roll forwards failed to set the re-signing + time of RRSIGs correctly. [RT #20541] + +2743. [bug] RRSIG could be incorrectly set in the NSEC3 record + for a insecure delegation. + +2729. [func] When constructing a CNAME from a DNAME use the DNAME + TTL. [RT #20451] + +2723. [bug] isc_base32_totext(), isc_base32hex_totext(), and + isc_base64_totext(), didn't always mark regions of + memory as fully consumed after conversion. [RT #20445] + +2722. [bug] Ensure that the memory associated with the name of + a node in a rbt tree is not altered during the life + of the node. [RT #20431] + +2721. [port] Have dst__entropy_status() prime the random number + generator. [RT #20369] + +2718. [bug] The space calculations in opensslrsa_todns() were + incorrect. [RT #20394] + +2716. [bug] nslookup debug mode didn't return the ttl. [RT #20414] + +2715. [bug] Require OpenSSL support to be explicitly disabled. + [RT #20288] + +2714. [port] aix/powerpc: 'asm("ics");' needs non standard assembler + flags. + +2713. [bug] powerpc: atomic operations missing asm("ics") / + __isync() calls. + +2706. [bug] Loading a zone with a very large NSEC3 salt could + trigger an assert. [RT #20368] + +2705. [bug] Reconcile the XML stats version number with a later + BIND9 release, by adding a "name" attribute to + "cache" elements and increasing the version number + to 2.2. (This is a minor version change, but may + affect XML parsers if they assume the cache element + doesn't take an attribute.) + +2704. [bug] Serial of dynamic and stub zones could be inconsistent + with their SOA serial. [RT #19387] + +2701. [doc] Correction to ARM: hmac-md5 is no longer the only + supported TSIG key algorithm. [RT #18046] + +2700. [doc] The match-mapped-addresses option is discouraged. + [RT #12252] + +2699. [bug] Missing lock in rbtdb.c. [RT #20037] + +2697. [port] win32: ensure that S_IFMT, S_IFDIR, S_IFCHR and + S_IFREG are defined after including . + [RT #20309] + +2696. [bug] named failed to successfully process some valid + acl constructs. [RT #20308] + +2692. [port] win32: 32/64 bit cleanups. [RT #20335] + +2690. [bug] win32: fix isc_thread_key_getspecific() prototype. + [RT #20315] + +2689. [bug] Correctly handle snprintf result. [RT #20306] + +2688. [bug] Use INTERFACE_F_POINTTOPOINT, not IFF_POINTOPOINT, + to decide to fetch the destination address. [RT #20305] + +2686. [bug] dnssec-signzone should clean the old NSEC chain when + signing with NSEC3 and vice versa. [RT #20301] + +2683. [bug] dnssec-signzone should clean out old NSEC3 chains when + the NSEC3 parameters used to sign the zone change. + [RT #20246] + +2681. [bug] IPSECKEY RR of gateway type 3 was not correctly + decoded. [RT #20269] + +2678. [func] Treat DS queries as if "minimal-response yes;" + was set. [RT #20258] + +2672. [bug] Don't enable searching in 'host' when doing reverse + lookups. [RT #20218] + +2670. [bug] Unexpected connect failures failed to log enough + information to be useful. [RT #20205] + +2663. [func] win32: allow named to run as a service using + "NT AUTHORITY\LocalService" as the account. [RT #19977] + +2662. [bug] lwres_getipnodebyname() and lwres_getipnodebyaddr() + returned a misleading error code when lwresd was + down. [RT #20028] + +2661. [bug] Check whether socket fd exceeds FD_SETSIZE when + creating lwres context. [RT #20029] + +2659. [doc] Clarify dnssec-keygen doc: key name must match zone + name for DNSSEC keys. [RT #19938] + +2656. [func] win32: add a "tools only" check box to the installer + which causes it to only install dig, host, nslookup, + nsupdate and relevant DLLs. [RT #19998] + +2655. [doc] Document that key-directory does not affect + rndc.key. [RT #20155] + +2653. [bug] Treat ENGINE_load_private_key() failures as key + not found rather than out of memory. [RT #18033] + +2649. [bug] Set the domain for forward only zones. [RT #19944] + +2648. [port] win32: isc_time_seconds() was broken. [RT #19900] + +2647. [bug] Remove unnecessary SOA updates when a new KSK is + added. [RT #19913] + +2646. [bug] Incorrect cleanup on error in socket.c. [RT #19987] + +2645. [port] "gcc -m32" didn't work on amd64 and x86_64 platforms + which default to 64 bits. [RT #19927] + +2643. [bug] Stub zones interacted badly with NSEC3 support. + [RT #19777] + +2642. [bug] nsupdate could dump core on solaris when reading + improperly formatted key files. [RT #20015] 2640. [security] A specially crafted update packet will cause named to exit. [RT #20000] +2639. [bug] Silence compiler warnings in gssapi code. [RT #19954] + +2637. [func] Rationalize dnssec-signzone's signwithkey() calling. + [RT #19959] + +2635. [bug] isc_inet_ntop() incorrectly handled 0.0/16 addresses. + [RT #19716] + +2633. [bug] Handle 15 bit rand() functions. [RT #19783] + +2632. [func] util/kit.sh: warn if documentation appears to be out of + date. [RT #19922] + +2625. [bug] Missing UNLOCK in rbtdb.c. [RT #19865] + +2623. [bug] Named started seaches for DS non-optimally. [RT #19915] + +2621. [doc] Made copyright boilterplate consistent. [RT #19833] + +2920. [bug] Delay thawing the zone until the reload of it has + completed successfully. [RT #19750] + +2618. [bug] The sdb and sdlz db_interator_seek() methods could + loop infinitely. [RT #19847] + +2617. [bug] ifconfig.sh failed to emit an error message when + run from the wrong location. [RT #19375] + +2616. [bug] 'host' used the nameservers from resolv.conf even + when a explicit nameserver was specified. [RT #19852] + +2615. [bug] "__attribute__((unused))" was in the wrong place + for ia64 gcc builds. [RT #19854] + +2614. [port] win32: 'named -v' should automatically be executed + in the foreground. [RT #19844] + +2613. [bug] Option argument validation was missing for + dnssec-dsfromkey. [RT #19828] + +2610. [port] sunos: Change #2363 was not complete. [RT #19796] + +2608. [func] Perform post signing verification checks in + dnssec-signzone. These can be disabled with -P. + + The post sign verification test ensures that for each + algorithm in use there is at least one non revoked + self signed KSK key. That all revoked KSK keys are + self signed. That all records in the zone are signed + by the algorithm. [RT #19653] + +2601. [doc] Mention file creation mode mask in the + named manual page. + +2593. [bug] Improve a corner source of SERVFAILs [RT #19632] + +2589. [bug] dns_db_unregister() failed to clear '*dbimp'. + [RT #19626] + +2581. [contrib] dlz/mysql set MYSQL_OPT_RECONNECT option on connection. + Requires MySQL 5.0.19 or later. [RT #19084] + +2580. [bug] UpdateRej statistics counter could be incremented twice + for one rejection. [RT #19476] + +2533. [doc] ARM: document @ (at-sign). [RT #17144] + +2500. [contrib] contrib/sdb/pgsql/zonetodb.c called non-existent + function. [RT #18582] + --- 9.6.1 released --- 2607. [bug] named could incorrectly delete NSEC3 records for - empty nodes when processing a update request. + empty nodes when processing a update request. [RT #19749] 2606. [bug] "delegation-only" was not being accepted in @@ -78,7 +366,7 @@ date to the version string, -DNO_VERSION_DATE. 2582. [bug] Don't emit warning log message when we attempt to - remove non-existant journal. [RT #19516] + remove non-existent journal. [RT #19516] 2579. [bug] DNSSEC lookaside validation failed to handle unknown algorithms. [RT #19479] @@ -136,7 +424,7 @@ 2556. [port] Solaris: mkdir(2) on tmpfs filesystems does not do the error checks in the correct order resulting in the wrong error code sometimes being returned. [RT #19249] - + 2554. [bug] Validation of uppercase queries from NSEC3 zones could fail. [RT #19297] @@ -185,7 +473,7 @@ 2536. [cleanup] Silence some warnings when -Werror=format-security is specified. [RT #19083] -2535. [bug] dig +showsearh and +trace interacted badly. [RT #19091] +2535. [bug] dig +showsearch and +trace interacted badly. [RT #19091] 2532. [bug] dig: check the question section of the response to see if it matches the asked question. [RT #18495] @@ -198,8 +486,8 @@ 2529. [cleanup] Upgrade libtool to silence complaints from recent version of autoconf. [RT #18657] -2528. [cleanup] Silence spurious configure warning about - --datarootdir [RT #19096] +2528. [cleanup] Silence spurious configure warning about + --datarootdir [RT #19096] 2527. [bug] named could reuse cache on reload with enabling/disabling validation. [RT #19119] @@ -222,7 +510,7 @@ preceded in resolv.conf. [RT #19081] 2517. [bug] dig +trace with -4 or -6 failed when it chose a - nameserver address of the excluded address. + nameserver address of the excluded address type. [RT #18843] 2516. [bug] glue sort for responses was performed even when not @@ -235,7 +523,7 @@ 2511. [cleanup] dns_rdata_tofmttext() add const to linebreak. [RT #18885] -2506. [port] solaris: Check at configure time if +2506. [port] solaris: Check at configure time if hack_shutup_pthreadonceinit is needed. [RT #19037] 2505. [port] Treat amd64 similarly to x86_64 when determining @@ -258,7 +546,7 @@ 2515. [port] win32: build dnssec-dsfromkey and dnssec-keyfromlabel. [RT #19063] -2513 [bug] Fix windows cli build. [RT #19062] +2513. [bug] Fix windows cli build. [RT #19062] 2510. [bug] "dig +sigchase" could trigger REQUIRE failures. [RT #19033] @@ -343,7 +631,7 @@ 2478. [bug] 'addresses' could be used uninitialized in configure_forward(). [RT #18800] - + 2477. [bug] dig: the global option to print the command line is +cmd not print_cmd. Update the output to reflect this. [RT #17008] @@ -359,7 +647,7 @@ 2473. [port] linux: raise the limit on open files to the possible maximum value before spawning threads; 'files' - specified in named.conf doesn't seem to work with + specified in named.conf doesn't seem to work with threads as expected. [RT #18784] 2472. [port] linux: check the number of available cpu's before @@ -388,7 +676,7 @@ 2464. [port] linux: check that a capability is present before trying to set it. [RT #18135] -2463. [port] linux: POSIX doesn't include the IPv6 Advanced Socket +2463. [port] linux: POSIX doesn't include the IPv6 Advanced Socket API and glibc hides parts of the IPv6 Advanced Socket API as a result. This is stupid as it breaks how the two halves (Basic and Advanced) of the IPv6 Socket API @@ -418,7 +706,7 @@ 2456. [bug] In ACLs, ::/0 and 0.0.0.0/0 would both match any address, regardless of family. They now correctly distinguish IPv4 from IPv6. [RT #18559] - + 2455. [bug] Stop metadata being transferred via axfr/ixfr. [RT #18639] @@ -458,7 +746,7 @@ 2442. [bug] A lock could be destroyed twice. [RT# 18626] -2441. [bug] isc_radix_insert() could copy radix tree nodes +2441. [bug] isc_radix_insert() could copy radix tree nodes incompletely. [RT #18573] 2440. [bug] named-checkconf used an incorrect test to determine @@ -515,7 +803,7 @@ implementation. Allow the use of kqueue, epoll and /dev/poll to be selected at compile time. [RT #18277] - + 2423. [security] Randomize server selection on queries, so as to make forgery a little more difficult. Instead of always preferring the server with the lowest RTT, @@ -583,9 +871,9 @@ 2406. [placeholder] -2405. [cleanup] The default value for dnssec-validation was changed to - "yes" in 9.5.0-P1 and all subsequent releases; this - was inadvertently omitted from CHANGES at the time. +2405. [cleanup] The default value for dnssec-validation was changed to + "yes" in 9.5.0-P1 and all subsequent releases; this + was inadvertently omitted from CHANGES at the time. 2404. [port] hpux: files unlimited support. @@ -661,7 +949,7 @@ 2380. [bug] dns_view_find() was not returning NXDOMAIN/NXRRSET proofs which, in turn, caused validation failures for insecure zones immediately below a secure zone - the server was authoritative for. [RT #18112] + the server was authoritative for. [RT #18112] 2379. [contrib] queryperf/gen-data-queryperf.py: removed redundant TLDs and supported RRs with TTLs [RT #17972] @@ -709,7 +997,7 @@ 2363. [port] sunos: pre-set "lt_cv_sys_max_cmd_len=4096;". [RT #17513] -2362. [cleanup] Make "rrset-order fixed" a compile-time option. +2362. [cleanup] Make "rrset-order fixed" a compile-time option. settable by "./configure --enable-fixed-rrset". Disabled by default. [RT #17977] @@ -792,12 +1080,12 @@ interfaces if there are not listen-on-v6 clauses in named.conf. [RT #17581] -2335. [port] sunos: libbind and *printf() support for long long. +2335. [port] sunos: libbind and *printf() support for long long. [RT #17513] 2334. [bug] Bad REQUIRES in fromstruct_in_naptr(), off by one bug in fromstruct_txt(). [RT #17609] - + 2333. [bug] Fix off by one error in isc_time_nowplusinterval(). [RT #17608] @@ -842,7 +1130,7 @@ 2320. [func] Make statistics counters thread-safe for platforms that support certain atomic operations. [RT #17466] -2319. [bug] Silence Coverity warnings in +2319. [bug] Silence Coverity warnings in lib/dns/rdata/in_1/apl_42.c. [RT #17469] 2318. [port] sunos fixes for libbind. [RT #17514] @@ -894,7 +1182,7 @@ 2301. [bug] Remove resource leak and fix error messages in bin/tests/system/lwresd/lwtest.c. [RT #17474] -2300. [bug] Fixed failure to close open file in +2300. [bug] Fixed failure to close open file in bin/tests/names/t_names.c. [RT #17473] 2299. [bug] Remove unnecessary NULL check in @@ -1017,7 +1305,7 @@ 2261. [bug] Fix memory leak with "any" and "none" ACLs [RT #17272] 2260. [bug] Reported wrong clients-per-query when increasing the - value. [RT #17236] + value. [RT #17236] 2259. [placeholder] @@ -1039,10 +1327,10 @@ intermediate values as timer->idle was reset by isc_timer_touch(). [RT #17243] -2253. [func] "max-cache-size" defaults to 32M. +2253. [func] "max-cache-size" defaults to 32M. "max-acache-size" defaults to 16M. -2252. [bug] Fixed errors in sortlist code [RT #17216] +2252. [bug] Fixed errors in sortlist code [RT #17216] 2251. [placeholder] @@ -1050,11 +1338,11 @@ memory statistics file should be written or not. Additionally named's -m option will cause the statistics file to be written. [RT #17113] - -2249. [bug] Only set Authentic Data bit if client requested - DNSSEC, per RFC 3655 [RT #17175] -2248. [cleanup] Fix several errors reported by Coverity. [RT #17160] +2249. [bug] Only set Authentic Data bit if client requested + DNSSEC, per RFC 3655 [RT #17175] + +2248. [cleanup] Fix several errors reported by Coverity. [RT #17160] 2247. [doc] Sort doc/misc/options. [RT #17067] @@ -1095,11 +1383,11 @@ 2235. [bug] was not being installed. [RT #17135] -2234. [port] Correct some compiler warnings on SCO OSr5 [RT #17134] - -2233. [func] Add support for O(1) ACL processing, based on - radix tree code originally written by Kevin - Brintnall. [RT #16288] +2234. [port] Correct some compiler warnings on SCO OSr5 [RT #17134] + +2233. [func] Add support for O(1) ACL processing, based on + radix tree code originally written by Kevin + Brintnall. [RT #16288] 2232. [bug] dns_adb_findaddrinfo() could fail and return ISC_R_SUCCESS. [RT #17137] @@ -1120,7 +1408,7 @@ 2226. [placeholder] 2225. [bug] More support for systems with no IPv4 addresses. - [RT #17111] + [RT #17111] 2224. [bug] Defer journal compaction if a xfrin is in progress. [RT #17119] @@ -1128,7 +1416,7 @@ 2223. [bug] Make a new journal when compacting. [RT #17119] 2222. [func] named-checkconf now checks server key references. - [RT #17097] + [RT #17097] 2221. [bug] Set the event result code to reflect the actual record turned to caller when a cache update is @@ -1137,7 +1425,7 @@ 2220. [bug] win32: Address a race condition in final shutdown of the Windows socket code. [RT #17028] - + 2219. [bug] Apply zone consistency checks to additions, not removals, when updating. [RT #17049] @@ -1147,7 +1435,7 @@ 2217. [func] Adjust update log levels. [RT #17092] 2216. [cleanup] Fix a number of errors reported by Coverity. - [RT #17094] + [RT #17094] 2215. [bug] Bad REQUIRE check isc_hmacsha1_verify(). [RT #17094] @@ -1193,7 +1481,7 @@ localhost;) is used. [RT #16987] - + 2205. [bug] libbind: change #2119 broke thread support. [RT #16982] 2204. [bug] "rndc flushanme name unknown-view" caused named @@ -1332,7 +1620,7 @@ allow-query-on, allow-recursion-on and allow-query-cache-on. [RT #16291] -2164. [bug] The code to determine how named-checkzone / +2164. [bug] The code to determine how named-checkzone / named-compilezone was called failed under windows. [RT #16764] @@ -1539,14 +1827,14 @@ 2095. [port] libbind: alway prototype inet_cidr_ntop_ipv6() and net_cidr_ntop_ipv6(). [RT #16388] - + 2094. [contrib] Update named-bootconf. [RT# 16404] 2093. [bug] named-checkzone -s was broken. 2092. [bug] win32: dig, host, nslookup. Use registry config if resolv.conf does not exist or no nameservers - listed. [RT #15877] + listed. [RT #15877] 2091. [port] dighost.c: race condition on cleanup. [RT #16417] @@ -1950,7 +2238,7 @@ 1964. [func] Separate out MX and SRV to CNAME checks. [RT #15723] -1963. [port] Tru64 4.0E doesn't support send() and recv(). +1963. [port] Tru64 4.0E doesn't support send() and recv(). [RT #15586] 1962. [bug] Named failed to clear old update-policy when it @@ -1993,7 +2281,7 @@ 1951. [security] Drop queries from particular well known ports. Don't return FORMERR to queries from particular well known ports. [RT #15636] - + 1950. [port] Solaris 2.5.1 and earlier cannot bind() then connect() a TCP socket. This prevents the source address being set for TCP connections. [RT #15628] @@ -2015,7 +2303,7 @@ 1945. [cleanup] dnssec-keygen: RSA (RSAMD5) is no longer recommended. To generate a RSAMD5 key you must explicitly request RSAMD5. [RT #13780] - + 1944. [cleanup] isc_hash_create() does not need a read/write lock. [RT #15522] @@ -2127,7 +2415,7 @@ [RT #15034] 1905. [bug] Strings returned from cfg_obj_asstring() should be - treated as read-only. The prototype for + treated as read-only. The prototype for cfg_obj_asstring() has been updated to reflect this. [RT #15256] @@ -2259,10 +2547,10 @@ 1863. [bug] rrset-order "fixed" error messages not complete. 1862. [func] Add additional zone data constancy checks. - named-checkzone has extended checking of NS, MX and + named-checkzone has extended checking of NS, MX and SRV record and the hosts they reference. named has extended post zone load checks. - New zone options: check-mx and integrity-check. + New zone options: check-mx and integrity-check. [RT #4940] 1861. [bug] dig could trigger a INSIST on certain malformed @@ -2305,9 +2593,9 @@ 1848. [bug] Improve SMF integration. [RT #13238] 1847. [bug] isc_ondestroy_init() is called too late in - dns_rbtdb_create()/dns_rbtdb64_create(). + dns_rbtdb_create()/dns_rbtdb64_create(). [RT #13661] - + 1846. [contrib] query-loc-0.3.0 from Stephane Bortzmeyer . @@ -2599,7 +2887,7 @@ [RT #12866] 1748. [func] dig now returns the byte count for axfr/ixfr. - + 1747. [bug] BIND 8 compatibility: named/named-checkconf failed to parse "host-statistics-max" in named.conf. @@ -2617,7 +2905,7 @@ requested number of worker threads then destruction of the manager would trigger an INSIST() failure. [RT #12790] - + 1742. [bug] Deleting all records at a node then adding a previously existing record, in a single UPDATE transaction, failed to leave / regenerate the @@ -2628,7 +2916,7 @@ 1740. [bug] Replace rbt's hash algorithm as it performed badly with certain zones. [RT #12729] - + NOTE: a hash context now needs to be established via isc_hash_create() if the application was not already doing this. @@ -2643,7 +2931,7 @@ 1736. [bug] dst_key_fromnamedfile() could fail to read a public key. [RT #12687] - + 1735. [bug] 'dig +sigtrace' could die with a REQUIRE failure. [RE #12688] @@ -2820,7 +3108,7 @@ 1675. [bug] named would sometimes add extra NSEC records to the authority section. - + 1674. [port] linux: increase buffer size used to scan /proc/net/if_inet6. @@ -2894,7 +3182,7 @@ 1648. [func] Update dnssec-lookaside named.conf syntax to support multiple dnssec-lookaside namespaces (not yet - implemented). + implemented). 1647. [bug] It was possible trigger a INSIST when chasing a DS record that required walking back over a empty node. @@ -2924,7 +3212,7 @@ 1638. [bug] "ixfr-from-differences" could generate a REQUIRE failure if the journal open failed. [RT #11347] - + 1637. [bug] Node reference leak on error in addnoqname(). 1636. [bug] The dump done callback could get ISC_R_SUCCESS even if @@ -3018,21 +3306,21 @@ 1607. [bug] dig, host and nslookup were still using random() to generate query ids. [RT# 11013] -1606. [bug] DLV insecurity proof was failing. +1606. [bug] DLV insecurity proof was failing. 1605. [func] New dns_db_find() option DNS_DBFIND_COVERINGNSEC. 1604. [bug] A xfrout_ctx_create() failure would result in xfrout_ctx_destroy() being called with a partially initialized structure. - + 1603. [bug] nsupdate: set interactive based on isatty(). [RT# 10929] 1602. [bug] Logging to a file failed unless a size was specified. [RT# 10925] -1601. [bug] Silence spurious warning 'both "recursion no;" and +1601. [bug] Silence spurious warning 'both "recursion no;" and "allow-recursion" active' warning from view "_bind". [RT# 10920] diff --git a/COPYRIGHT b/COPYRIGHT index 620ee98..d95930b 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,4 +1,4 @@ -Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") +Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 1996-2003 Internet Software Consortium. Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -$Id: COPYRIGHT,v 1.14.176.1 2009/01/05 23:47:22 tbox Exp $ +$Id: COPYRIGHT,v 1.14.176.2 2010/01/07 23:47:36 tbox Exp $ Portions Copyright (C) 1996-2001 Nominum, Inc. diff --git a/FAQ b/FAQ index b256ed8..9e3469c 100644 --- a/FAQ +++ b/FAQ @@ -1,6 +1,6 @@ Frequently Asked Questions about BIND 9 -Copyright © 2004-2009 Internet Systems Consortium, Inc. ("ISC") +Copyright © 2004-2010 Internet Systems Consortium, Inc. ("ISC") Copyright © 2000-2003 Internet Software Consortium. @@ -784,6 +784,22 @@ A: Red Hat Security Enhanced Linux (SELinux) policy security protections : See these man-pages for more information : selinux(8), named_selinux (8), chcon(1), setsebool(8) +Q: I'm running BIND on Ubuntu - + + Why can't named update slave zone database files? + + Why can't named create DDNS journal files or update the master zones + from journals? + + Why can't named create custom log files? + +A: Ubuntu uses AppArmor in + addition to normal file system permissions to protect the system. + + Adjust the paths to use those specified in /etc/apparmor.d/ + usr.sbin.named or adjust /etc/apparmor.d/usr.sbin.named to allow named + to write at the location specified in named.conf. + Q: Listening on individual IPv6 interfaces does not work. A: This is usually due to "/proc/net/if_inet6" not being available in the diff --git a/FAQ.xml b/FAQ.xml index 65e8efc..1d87642 100644 --- a/FAQ.xml +++ b/FAQ.xml @@ -1,7 +1,7 @@ - +

Frequently Asked Questions about BIND 9 @@ -29,6 +29,7 @@ 2007 2008 2009 + 2010 Internet Systems Consortium, Inc. ("ISC") @@ -1385,6 +1386,36 @@ named_cache_t: for files modifiable by named - $ROOTDIR/var/{tmp,named/{slaves,d + I'm running BIND on Ubuntu - + + + Why can't named update slave zone database files? + + + Why can't named create DDNS journal files or update + the master zones from journals? + + + Why can't named create custom log files? + + + + + Ubuntu uses AppArmor + <http://en.wikipedia.org/wiki/AppArmor> in + addition to normal file system permissions to protect the system. + + + Adjust the paths to use those specified in /etc/apparmor.d/usr.sbin.named + or adjust /etc/apparmor.d/usr.sbin.named to allow named to write at the + location specified in named.conf. + + + + + + + Listening on individual IPv6 interfaces does not work. diff --git a/NSEC3-NOTES b/NSEC3-NOTES index d23b20e..3f8d8f9 100644 --- a/NSEC3-NOTES +++ b/NSEC3-NOTES @@ -35,7 +35,7 @@ will not be completely signed until named has had time to walk the zone and generate the NSEC and RRSIG records. Initially the NSEC record at the zone apex will have the OPT bit set. When the NSEC chain is complete the OPT bit will be cleared. Additionally when -the zone is fully signed the private type (default TYPE65535) records +the zone is fully signed the private type (default TYPE65534) records will have a non zero value for the final octet. The private type record has 5 octets. @@ -45,7 +45,7 @@ The private type record has 5 octets. complete flag (octet 5) If you wish to go straight to a secure zone using NSEC3 you should -also add a NSECPARAM record to the update request with the flags +also add a NSEC3PARAM record to the update request with the flags field set to indicate whether the NSEC3 chain will have the OPTOUT bit set or not. diff --git a/README b/README index d151988..902d9ed 100644 --- a/README +++ b/README @@ -42,6 +42,29 @@ BIND 9 Stichting NLnet - NLnet Foundation Nominum, Inc. +BIND 9.6.2 + + BIND 9.6.2 is a maintenance release, fixing bugs in 9.6.1. + It also introduces support for the SHA-2 DNSSEC algorithms, + RSASHA256 and RSASHA512. + + Known issues in this release: + + - A validating resolver that has been incorrectly configured with + an invalid trust anchor will be unable to resolve names covered + by that trust anchor. In all current versions of BIND 9, such a + resolver will also generate significant unnecessary DNS traffic + while trying to validate. The latter problem will be addressed + in future BIND 9 releases. In the meantime, to avoid these + problems, exercise caution when configuring "trusted-keys": + make sure all keys are correct and current when you add them, + and update your configuration in a timely manner when keys + roll over. + +BIND 9.6.1 + + BIND 9.6.1 is a maintenance release, fixing bugs in 9.6.0. + BIND 9.6.0 BIND 9.6.0 includes a number of changes from BIND 9.5 and earlier diff --git a/bin/check/named-checkconf.8 b/bin/check/named-checkconf.8 index 852b133..072d1cf 100644 --- a/bin/check/named-checkconf.8 +++ b/bin/check/named-checkconf.8 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2002 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: named-checkconf.8,v 1.30 2007/06/20 02:27:32 marka Exp $ +.\" $Id: named-checkconf.8,v 1.30.334.1 2009/07/11 01:55:20 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/check/named-checkconf.html b/bin/check/named-checkconf.html index 34bec80..8fd1e6d 100644 --- a/bin/check/named-checkconf.html +++ b/bin/check/named-checkconf.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2002 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/check/named-checkzone.8 b/bin/check/named-checkzone.8 index 5520da3..dfc409e 100644 --- a/bin/check/named-checkzone.8 +++ b/bin/check/named-checkzone.8 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2002 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: named-checkzone.8,v 1.42.334.1 2009/01/23 01:53:33 tbox Exp $ +.\" $Id: named-checkzone.8,v 1.42.334.3 2009/11/11 01:56:22 tbox Exp $ .\" .hy 0 .ad l @@ -33,9 +33,9 @@ named\-checkzone, named\-compilezone \- zone file validity checking or converting tool .SH "SYNOPSIS" .HP 16 -\fBnamed\-checkzone\fR [\fB\-d\fR] [\fB\-h\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-M\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-S\ \fR\fB\fImode\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename} +\fBnamed\-checkzone\fR [\fB\-d\fR] [\fB\-h\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-M\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-S\ \fR\fB\fImode\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename} .HP 18 -\fBnamed\-compilezone\fR [\fB\-d\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-C\ \fR\fB\fImode\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename} +\fBnamed\-compilezone\fR [\fB\-d\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-C\ \fR\fB\fImode\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {\fB\-o\ \fR\fB\fIfilename\fR\fR} {zonename} {filename} .SH "DESCRIPTION" .PP \fBnamed\-checkzone\fR diff --git a/bin/check/named-checkzone.c b/bin/check/named-checkzone.c index 83b3bbe..0b49b51 100644 --- a/bin/check/named-checkzone.c +++ b/bin/check/named-checkzone.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named-checkzone.c,v 1.51.34.3 2009/05/29 02:17:43 marka Exp $ */ +/* $Id: named-checkzone.c,v 1.51.34.4 2009/11/10 20:01:41 each Exp $ */ /*! \file */ @@ -73,14 +73,16 @@ static enum { progmode_check, progmode_compile } progmode; static void usage(void) { fprintf(stderr, - "usage: %s [-djqvD] [-c class] [-o output] " + "usage: %s [-djqvD] [-c class] " "[-f inputformat] [-F outputformat] " "[-t directory] [-w directory] [-k (ignore|warn|fail)] " "[-n (ignore|warn|fail)] [-m (ignore|warn|fail)] " "[-i (full|full-sibling|local|local-sibling|none)] " "[-M (ignore|warn|fail)] [-S (ignore|warn|fail)] " "[-W (ignore|warn)] " - "zonename filename\n", prog_name); + "%s zonename filename\n", + prog_name, + progmode == progmode_check ? "[-o filename]" : "{-o filename}"); exit(1); } diff --git a/bin/check/named-checkzone.docbook b/bin/check/named-checkzone.docbook index d863447..4abb07f 100644 --- a/bin/check/named-checkzone.docbook +++ b/bin/check/named-checkzone.docbook @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + June 13, 2000 @@ -69,7 +69,6 @@ - @@ -99,6 +98,7 @@ + zonename filename diff --git a/bin/check/named-checkzone.html b/bin/check/named-checkzone.html index 71dc445..68a6331 100644 --- a/bin/check/named-checkzone.html +++ b/bin/check/named-checkzone.html @@ -2,7 +2,7 @@ - Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2002 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -29,11 +29,11 @@

Synopsis

-

named-checkzone [-d] [-h] [-j] [-q] [-v] [-c class] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-M mode] [-n mode] [-o filename] [-s style] [-S mode] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

-

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

+

named-checkzone [-d] [-h] [-j] [-q] [-v] [-c class] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-M mode] [-n mode] [-s style] [-S mode] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

+

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {-o filename} {zonename} {filename}

-

DESCRIPTION

+

DESCRIPTION

named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a @@ -53,7 +53,7 @@

-

OPTIONS

+

OPTIONS

-d

@@ -239,14 +239,14 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkzone returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkconf(8), RFC 1035, @@ -254,7 +254,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dig/dig.1 b/bin/dig/dig.1 index f7f4370..c8704a1 100644 --- a/bin/dig/dig.1 +++ b/bin/dig/dig.1 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dig.1,v 1.50.44.2 2009/02/03 01:52:10 tbox Exp $ +.\" $Id: dig.1,v 1.50.44.3 2009/07/11 01:55:20 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/dig/dig.html b/bin/dig/dig.html index 11b55cc..3fd3e75 100644 --- a/bin/dig/dig.html +++ b/bin/dig/dig.html @@ -2,7 +2,7 @@ - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 470261c..d730c0e 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dighost.c,v 1.311.70.8 2009/02/25 02:39:21 marka Exp $ */ +/* $Id: dighost.c,v 1.311.70.11 2009/11/10 17:27:13 each Exp $ */ /*! \file * \note @@ -1048,7 +1048,9 @@ setup_system(void) { debug("ndots is %d.", ndots); } - copy_server_list(lwconf, &server_list); + /* If user doesn't specify server use nameservers from resolv.conf. */ + if (ISC_LIST_EMPTY(server_list)) + copy_server_list(lwconf, &server_list); /* If we don't find a nameserver fall back to localhost */ if (ISC_LIST_EMPTY(server_list)) { @@ -2397,11 +2399,9 @@ connect_timeout(isc_task_t *task, isc_event_t *event) { if (!l->tcp_mode) send_udp(ISC_LIST_NEXT(cq, link)); else { - isc_socket_cancel(query->sock, NULL, - ISC_SOCKCANCEL_ALL); - isc_socket_detach(&query->sock); - sockcount--; - debug("sockcount=%d", sockcount); + if (query->sock != NULL) + isc_socket_cancel(query->sock, NULL, + ISC_SOCKCANCEL_ALL); send_tcp_connect(ISC_LIST_NEXT(cq, link)); } UNLOCK_LOOKUP; @@ -2605,8 +2605,8 @@ connect_done(isc_task_t *task, isc_event_t *event) { if (sevent->result == ISC_R_CANCELED) { debug("in cancel handler"); isc_socket_detach(&query->sock); + INSIST(sockcount > 0); sockcount--; - INSIST(sockcount >= 0); debug("sockcount=%d", sockcount); query->waiting_connect = ISC_FALSE; isc_event_free(&event); diff --git a/bin/dig/host.1 b/bin/dig/host.1 index eebdad8..c538ae3 100644 --- a/bin/dig/host.1 +++ b/bin/dig/host.1 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2002 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: host.1,v 1.29.114.1 2009/01/23 01:53:33 tbox Exp $ +.\" $Id: host.1,v 1.29.114.2 2009/07/11 01:55:20 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/dig/host.c b/bin/dig/host.c index 9f30206..8cd5b3d 100644 --- a/bin/dig/host.c +++ b/bin/dig/host.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: host.c,v 1.116.216.2 2009/05/06 23:47:18 tbox Exp $ */ +/* $Id: host.c,v 1.116.216.3 2009/09/08 23:28:20 marka Exp $ */ /*! \file */ @@ -839,11 +839,10 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) { } else { strncpy(lookup->textname, hostname, sizeof(lookup->textname)); lookup->textname[sizeof(lookup->textname)-1]=0; + usesearch = ISC_TRUE; } lookup->new_search = ISC_TRUE; ISC_LIST_APPEND(lookup_list, lookup, link); - - usesearch = ISC_TRUE; } int diff --git a/bin/dig/host.html b/bin/dig/host.html index f210731..3928c93 100644 --- a/bin/dig/host.html +++ b/bin/dig/host.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2002 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/dig/nslookup.1 b/bin/dig/nslookup.1 index 2d19534..68b419a 100644 --- a/bin/dig/nslookup.1 +++ b/bin/dig/nslookup.1 @@ -1,6 +1,6 @@ .\" Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -12,7 +12,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: nslookup.1,v 1.14 2007/05/16 06:12:01 marka Exp $ +.\" $Id: nslookup.1,v 1.14.354.1 2009/07/11 01:55:20 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/dig/nslookup.c b/bin/dig/nslookup.c index 5679626..000f54e 100644 --- a/bin/dig/nslookup.c +++ b/bin/dig/nslookup.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nslookup.c,v 1.117.334.4 2009/05/06 11:41:57 fdupont Exp $ */ +/* $Id: nslookup.c,v 1.117.334.5 2009/10/20 01:11:22 marka Exp $ */ #include @@ -373,6 +373,7 @@ detailsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers, printrdata(&rdata); } dns_rdata_reset(&rdata); + printf("\tttl = %u\n", rdataset->ttl); loopresult = dns_rdataset_next(rdataset); } } diff --git a/bin/dig/nslookup.html b/bin/dig/nslookup.html index 0f38176..3984a16 100644 --- a/bin/dig/nslookup.html +++ b/bin/dig/nslookup.html @@ -1,7 +1,7 @@ - + diff --git a/bin/dnssec/dnssec-dsfromkey.c b/bin/dnssec/dnssec-dsfromkey.c index 653aa3e..8bd4aa5 100644 --- a/bin/dnssec/dnssec-dsfromkey.c +++ b/bin/dnssec/dnssec-dsfromkey.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-dsfromkey.c,v 1.2.14.3 2009/03/02 02:54:15 marka Exp $ */ +/* $Id: dnssec-dsfromkey.c,v 1.2.14.6 2010/01/11 23:47:22 tbox Exp $ */ /*! \file */ @@ -78,10 +78,18 @@ loadkeys(char *dirname, char *setname) isc_buffer_init(&buf, filename, sizeof(filename)); if (dirname != NULL) { + if (isc_buffer_availablelength(&buf) < strlen(dirname)) + fatal("directory name '%s' too long", dirname); isc_buffer_putstr(&buf, dirname); - if (dirname[strlen(dirname) - 1] != '/') + if (dirname[strlen(dirname) - 1] != '/') { + if (isc_buffer_availablelength(&buf) < 1) + fatal("directory name '%s' too long", dirname); isc_buffer_putstr(&buf, "/"); + } } + + if (isc_buffer_availablelength(&buf) < strlen("keyset-")) + fatal("directory name '%s' too long", dirname); isc_buffer_putstr(&buf, "keyset-"); result = dns_name_tofilenametext(name, ISC_FALSE, &buf); check_result(result, "dns_name_tofilenametext()"); @@ -210,12 +218,12 @@ emitds(unsigned int dtype, dns_rdata_t *rdata) putchar(' '); isc_buffer_usedregion(&classb, &r); - fwrite(r.base, 1, r.length, stdout); + isc_util_fwrite(r.base, 1, r.length, stdout); printf(" DS "); isc_buffer_usedregion(&textb, &r); - fwrite(r.base, 1, r.length, stdout); + isc_util_fwrite(r.base, 1, r.length, stdout); putchar('\n'); } diff --git a/bin/dnssec/dnssec-keyfromlabel.8 b/bin/dnssec/dnssec-keyfromlabel.8 index 6222058..03f13e9 100644 --- a/bin/dnssec/dnssec-keyfromlabel.8 +++ b/bin/dnssec/dnssec-keyfromlabel.8 @@ -1,6 +1,6 @@ -.\" Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC") .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -12,7 +12,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-keyfromlabel.8,v 1.6 2008/11/08 01:11:47 tbox Exp $ +.\" $Id: dnssec-keyfromlabel.8,v 1.6.14.3 2010/01/16 01:55:32 tbox Exp $ .\" .hy 0 .ad l @@ -43,7 +43,13 @@ gets keys with the given label from a crypto hardware and builds key files for D .RS 4 Selects the cryptographic algorithm. The value of \fBalgorithm\fR -must be one of RSAMD5 (RSA) or RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA or DH (Diffie Hellman). These values are case insensitive. +must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or DH (Diffie Hellman). These values are case insensitive. +.sp +If no algorithm is specified, then RSASHA1 will be used by default, unless the +\fB\-3\fR +option is specified, in which case NSEC3RSASHA1 will be used instead. (If +\fB\-3\fR +is used and an algorithm is specified, that algorithm will be checked for compatibility with NSEC3.) .sp Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended. .sp @@ -138,12 +144,10 @@ file contains algorithm specific fields. For obvious security reasons, this file \fBdnssec\-keygen\fR(8), \fBdnssec\-signzone\fR(8), BIND 9 Administrator Reference Manual, -RFC 2539, -RFC 2845, -RFC 4033. +RFC 4034. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" -Copyright \(co 2008 Internet Systems Consortium, Inc. ("ISC") +Copyright \(co 2008, 2010 Internet Systems Consortium, Inc. ("ISC") .br diff --git a/bin/dnssec/dnssec-keyfromlabel.c b/bin/dnssec/dnssec-keyfromlabel.c index e7587c3..78bfda3 100644 --- a/bin/dnssec/dnssec-keyfromlabel.c +++ b/bin/dnssec/dnssec-keyfromlabel.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-keyfromlabel.c,v 1.4 2008/09/24 02:46:21 marka Exp $ */ +/* $Id: dnssec-keyfromlabel.c,v 1.4.50.2 2010/01/15 23:47:31 tbox Exp $ */ /*! \file */ @@ -48,7 +48,8 @@ const char *program = "dnssec-keyfromlabel"; int verbose; static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 |" - " NSEC3DSA | NSEC3RSASHA1"; + " NSEC3DSA | NSEC3RSASHA1 |" + " RSASHA256 | RSASHA512"; static void usage(void) { diff --git a/bin/dnssec/dnssec-keyfromlabel.docbook b/bin/dnssec/dnssec-keyfromlabel.docbook index 2bcf0a4..f2ab152 100644 --- a/bin/dnssec/dnssec-keyfromlabel.docbook +++ b/bin/dnssec/dnssec-keyfromlabel.docbook @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> - + February 8, 2008 @@ -37,6 +37,7 @@ 2008 + 2010 Internet Systems Consortium, Inc. ("ISC") @@ -75,11 +76,19 @@ Selects the cryptographic algorithm. The value of - must be one of RSAMD5 (RSA) - or RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA or DH (Diffie Hellman). + must be one of RSAMD5, + RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, + RSASHA512 or DH (Diffie Hellman). These values are case insensitive. + If no algorithm is specified, then RSASHA1 will be used by + default, unless the option is specified, + in which case NSEC3RSASHA1 will be used instead. (If + is used and an algorithm is specified, + that algorithm will be checked for compatibility with NSEC3.) + + Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended. @@ -246,9 +255,7 @@ dnssec-signzone8 , BIND 9 Administrator Reference Manual, - RFC 2539, - RFC 2845, - RFC 4033. + RFC 4034. diff --git a/bin/dnssec/dnssec-keyfromlabel.html b/bin/dnssec/dnssec-keyfromlabel.html index cbea64b..1aafccd 100644 --- a/bin/dnssec/dnssec-keyfromlabel.html +++ b/bin/dnssec/dnssec-keyfromlabel.html @@ -1,7 +1,7 @@ - + @@ -31,7 +31,7 @@

dnssec-keyfromlabel {-a algorithm} {-l label} [-c class] [-f flag] [-k] [-n nametype] [-p protocol] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keyfromlabel gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 @@ -39,17 +39,25 @@

-

OPTIONS

+

OPTIONS

-a algorithm

Selects the cryptographic algorithm. The value of - algorithm must be one of RSAMD5 (RSA) - or RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA or DH (Diffie Hellman). + algorithm must be one of RSAMD5, + RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, + RSASHA512 or DH (Diffie Hellman). These values are case insensitive.

+ If no algorithm is specified, then RSASHA1 will be used by + default, unless the -3 option is specified, + in which case NSEC3RSASHA1 will be used instead. (If + -3 is used and an algorithm is specified, + that algorithm will be checked for compatibility with NSEC3.) +

+

Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended.

@@ -112,7 +120,7 @@
-

GENERATED KEY FILES

+

GENERATED KEY FILES

When dnssec-keyfromlabel completes successfully, @@ -153,17 +161,15 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, - RFC 2539, - RFC 2845, - RFC 4033. + RFC 4034.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssec-keygen.8 b/bin/dnssec/dnssec-keygen.8 index 13db3d9..485ea6e 100644 --- a/bin/dnssec/dnssec-keygen.8 +++ b/bin/dnssec/dnssec-keygen.8 @@ -1,7 +1,7 @@ -.\" Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2004, 2005, 2007-2010 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-keygen.8,v 1.40 2008/10/15 01:11:35 tbox Exp $ +.\" $Id: dnssec-keygen.8,v 1.40.44.4 2010/01/16 01:55:32 tbox Exp $ .\" .hy 0 .ad l @@ -38,13 +38,17 @@ dnssec\-keygen \- DNSSEC key generation tool .PP \fBdnssec\-keygen\fR generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures), as defined in RFC 2845. +.PP +The +\fBname\fR +of the key is specified on the command line. For DNSSEC keys, this must match the name of the zone for which the key is being generated. .SH "OPTIONS" .PP \-a \fIalgorithm\fR .RS 4 -Selects the cryptographic algorithm. The value of +Selects the cryptographic algorithm. For DNSSEC keys, the value of \fBalgorithm\fR -must be one of RSAMD5 (RSA) or RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, DH (Diffie Hellman), or HMAC\-MD5. These values are case insensitive. +must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC\-MD5, HMAC\-SHA1, HMAC\-SHA224, HMAC\-SHA256, HMAC\-SHA384, or HMAC\-SHA512. These values are case insensitive. .sp Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended. For TSIG, HMAC\-MD5 is mandatory. .sp @@ -53,7 +57,7 @@ Note 2: HMAC\-MD5 and DH automatically set the \-k flag. .PP \-b \fIkeysize\fR .RS 4 -Specifies the number of bits in the key. The choice of key size depends on the algorithm used. RSAMD5 / RSASHA1 keys must be between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 bits and an exact multiple of 64. HMAC\-MD5 keys must be between 1 and 512 bits. +Specifies the number of bits in the key. The choice of key size depends on the algorithm used. RSA keys must be between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits. .RE .PP \-n \fInametype\fR @@ -189,12 +193,12 @@ and BIND 9 Administrator Reference Manual, RFC 2539, RFC 2845, -RFC 4033. +RFC 4034. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" -Copyright \(co 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") +Copyright \(co 2004, 2005, 2007\-2010 Internet Systems Consortium, Inc. ("ISC") .br Copyright \(co 2000\-2003 Internet Software Consortium. .br diff --git a/bin/dnssec/dnssec-keygen.c b/bin/dnssec/dnssec-keygen.c index 614d388..2b9a863 100644 --- a/bin/dnssec/dnssec-keygen.c +++ b/bin/dnssec/dnssec-keygen.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -29,7 +29,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-keygen.c,v 1.81 2008/09/25 04:02:38 tbox Exp $ */ +/* $Id: dnssec-keygen.c,v 1.81.48.2 2010/01/15 23:47:31 tbox Exp $ */ /*! \file */ @@ -62,8 +62,8 @@ const char *program = "dnssec-keygen"; int verbose; -static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 | NSEC3DSA |" - " NSEC3RSASHA1 | HMAC-MD5 |" +static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 | RSASHA256 |" + " RSASHA512 | NSEC3DSA | NSEC3RSASHA1 | HMAC-MD5 |" " HMAC-SHA1 | HMAC-SHA224 | HMAC-SHA256 |" " HMAC-SHA384 | HMAC-SHA512"; @@ -84,6 +84,8 @@ usage(void) { fprintf(stderr, " RSAMD5:\t\t[512..%d]\n", MAX_RSA); fprintf(stderr, " RSASHA1:\t\t[512..%d]\n", MAX_RSA); fprintf(stderr, " NSEC3RSASHA1:\t\t[512..%d]\n", MAX_RSA); + fprintf(stderr, " RSASHA256:\t[512..%d]\n", MAX_RSA); + fprintf(stderr, " RSASHA512:\t[1024..%d]\n", MAX_RSA); fprintf(stderr, " DH:\t\t[128..4096]\n"); fprintf(stderr, " DSA:\t\t[512..1024] and divisible by 64\n"); fprintf(stderr, " NSEC3DSA:\t\t[512..1024] and divisible by 64\n"); @@ -307,9 +309,14 @@ main(int argc, char **argv) { case DNS_KEYALG_RSAMD5: case DNS_KEYALG_RSASHA1: case DNS_KEYALG_NSEC3RSASHA1: + case DNS_KEYALG_RSASHA256: if (size != 0 && (size < 512 || size > MAX_RSA)) fatal("RSA key size %d out of range", size); break; + case DNS_KEYALG_RSASHA512: + if (size != 0 && (size < 1024 || size > MAX_RSA)) + fatal("RSA key size %d out of range", size); + break; case DNS_KEYALG_DH: if (size != 0 && (size < 128 || size > 4096)) fatal("DH key size %d out of range", size); @@ -376,7 +383,8 @@ main(int argc, char **argv) { } if (!(alg == DNS_KEYALG_RSAMD5 || alg == DNS_KEYALG_RSASHA1 || - alg == DNS_KEYALG_NSEC3RSASHA1) && rsa_exp != 0) + alg == DNS_KEYALG_NSEC3RSASHA1 || alg == DNS_KEYALG_RSASHA256 || + alg == DNS_KEYALG_RSASHA512) && rsa_exp != 0) fatal("specified RSA exponent for a non-RSA key"); if (alg != DNS_KEYALG_DH && generator != 0) @@ -440,12 +448,16 @@ main(int argc, char **argv) { switch(alg) { case DNS_KEYALG_RSAMD5: case DNS_KEYALG_RSASHA1: + case DNS_KEYALG_NSEC3RSASHA1: + case DNS_KEYALG_RSASHA256: + case DNS_KEYALG_RSASHA512: param = rsa_exp; break; case DNS_KEYALG_DH: param = generator; break; case DNS_KEYALG_DSA: + case DNS_KEYALG_NSEC3DSA: case DST_ALG_HMACMD5: case DST_ALG_HMACSHA1: case DST_ALG_HMACSHA224: diff --git a/bin/dnssec/dnssec-keygen.docbook b/bin/dnssec/dnssec-keygen.docbook index c267a1b..92ef9b9 100644 --- a/bin/dnssec/dnssec-keygen.docbook +++ b/bin/dnssec/dnssec-keygen.docbook @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> - + June 30, 2000 @@ -41,6 +41,8 @@ 2005 2007 2008 + 2009 + 2010 Internet Systems Consortium, Inc. ("ISC") @@ -80,6 +82,11 @@ and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures), as defined in RFC 2845. + + The of the key is specified on the command + line. For DNSSEC keys, this must match the name of the zone for + which the key is being generated. + @@ -90,10 +97,13 @@ -a algorithm - Selects the cryptographic algorithm. The value of - must be one of RSAMD5 (RSA) or RSASHA1, - DSA, NSEC3RSASHA1, NSEC3DSA, DH (Diffie Hellman), or HMAC-MD5. - These values are case insensitive. + Selects the cryptographic algorithm. For DNSSEC keys, the value + of must be one of RSAMD5, RSASHA1, + DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512. + For TSIG/TKEY, the value must + be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224, + HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are + case insensitive. Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement @@ -111,11 +121,10 @@ Specifies the number of bits in the key. The choice of key - size depends on the algorithm used. RSAMD5 / RSASHA1 keys must be - between - 512 and 2048 bits. Diffie Hellman keys must be between + size depends on the algorithm used. RSA keys must be + between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 - bits and an exact multiple of 64. HMAC-MD5 keys must be + bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits. @@ -343,7 +352,7 @@ BIND 9 Administrator Reference Manual, RFC 2539, RFC 2845, - RFC 4033. + RFC 4034. diff --git a/bin/dnssec/dnssec-keygen.html b/bin/dnssec/dnssec-keygen.html index 696ef88..fccec6f 100644 --- a/bin/dnssec/dnssec-keygen.html +++ b/bin/dnssec/dnssec-keygen.html @@ -1,8 +1,8 @@ - + @@ -32,23 +32,31 @@

dnssec-keygen {-a algorithm} {-b keysize} {-n nametype} [-c class] [-e] [-f flag] [-g generator] [-h] [-k] [-p protocol] [-r randomdev] [-s strength] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keygen generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures), as defined in RFC 2845.

+

+ The name of the key is specified on the command + line. For DNSSEC keys, this must match the name of the zone for + which the key is being generated. +

-

OPTIONS

+

OPTIONS

-a algorithm

- Selects the cryptographic algorithm. The value of - algorithm must be one of RSAMD5 (RSA) or RSASHA1, - DSA, NSEC3RSASHA1, NSEC3DSA, DH (Diffie Hellman), or HMAC-MD5. - These values are case insensitive. + Selects the cryptographic algorithm. For DNSSEC keys, the value + of algorithm must be one of RSAMD5, RSASHA1, + DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512. + For TSIG/TKEY, the value must + be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224, + HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are + case insensitive.

Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement @@ -62,11 +70,10 @@

-b keysize

Specifies the number of bits in the key. The choice of key - size depends on the algorithm used. RSAMD5 / RSASHA1 keys must be - between - 512 and 2048 bits. Diffie Hellman keys must be between + size depends on the algorithm used. RSA keys must be + between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 - bits and an exact multiple of 64. HMAC-MD5 keys must be + bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits.

-n nametype
@@ -148,7 +155,7 @@
-

GENERATED KEYS

+

GENERATED KEYS

When dnssec-keygen completes successfully, @@ -194,7 +201,7 @@

-

EXAMPLE

+

EXAMPLE

To generate a 768-bit DSA key for the domain example.com, the following command would be @@ -215,16 +222,16 @@

-

SEE ALSO

+

SEE ALSO

dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 2539, RFC 2845, - RFC 4033. + RFC 4034.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssec-signzone.8 b/bin/dnssec/dnssec-signzone.8 index 1e77927..7b21fb6 100644 --- a/bin/dnssec/dnssec-signzone.8 +++ b/bin/dnssec/dnssec-signzone.8 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-signzone.8,v 1.47.44.4.8.1 2009/12/31 23:17:46 tbox Exp $ +.\" $Id: dnssec-signzone.8,v 1.47.44.8 2009/11/07 01:56:11 tbox Exp $ .\" .hy 0 .ad l @@ -33,13 +33,15 @@ dnssec\-signzone \- DNSSEC zone signing tool .SH "SYNOPSIS" .HP 16 -\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...] +\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-P\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...] .SH "DESCRIPTION" .PP \fBdnssec\-signzone\fR -signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a -\fIkeyset\fR -file for each child zone. +signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. It also generates a +\fIkeyset\-\fR +file containing the key\-signing keys for the zone, and if signing a zone which contains delegations, it can optionally generate DS records for the child zones from their +\fIkeyset\-\fR +files. .SH "OPTIONS" .PP \-a @@ -73,7 +75,9 @@ as the directory .PP \-g .RS 4 -Generate DS records for child zones from keyset files. Existing DS records will be removed. +If the zone contains any delegations, and there are +\fIkeyset\-\fR +files for any of the child zones, then DS records for the child zones will be generated from the keys in those files. Existing DS records will be removed. .RE .PP \-s \fIstart\-time\fR @@ -186,6 +190,13 @@ The format of the output file containing the signed zone. Possible formats are Use pseudo\-random data when signing the zone. This is faster, but less secure, than using real random data. This option may be useful when signing large zones or when the entropy source is limited. .RE .PP +\-P +.RS 4 +Disable post sign verification tests. +.sp +The post sign verification test ensures that for each algorithm in use there is at least one non revoked self signed KSK key, that all revoked KSK keys are self signed, and that all records in the zone are signed by the algorithm. This option skips these tests. +.RE +.PP \-r \fIrandomdev\fR .RS 4 Specifies the source of randomness. If the operating system does not provide a diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c index 2ef2e10..eec6110 100644 --- a/bin/dnssec/dnssec-signzone.c +++ b/bin/dnssec/dnssec-signzone.c @@ -29,7 +29,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-signzone.c,v 1.209.12.8 2009/06/08 22:23:06 each Exp $ */ +/* $Id: dnssec-signzone.c,v 1.209.12.18 2009/11/03 23:47:45 tbox Exp $ */ /*! \file */ @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -106,6 +107,8 @@ struct signer_key_struct { isc_boolean_t issigningkey; isc_boolean_t isdsk; isc_boolean_t isksk; + isc_boolean_t wasused; + isc_boolean_t commandline; unsigned int position; ISC_LINK(signer_key_t) link; }; @@ -127,6 +130,7 @@ struct signer_event { static ISC_LIST(signer_key_t) keylist; static unsigned int keycount = 0; +isc_rwlock_t keylist_lock; static isc_stdtime_t starttime = 0, endtime = 0, now; static int cycle = -1; static int jitter = 0; @@ -164,6 +168,7 @@ static dns_master_style_t *dsstyle = NULL; static unsigned int serialformat = SOA_SERIAL_KEEP; static unsigned int hash_length = 0; static isc_boolean_t unknownalg = ISC_FALSE; +static isc_boolean_t disable_zone_check = ISC_FALSE; #define INCSTAT(counter) \ if (printstats) { \ @@ -175,8 +180,9 @@ static isc_boolean_t unknownalg = ISC_FALSE; static void sign(isc_task_t *task, isc_event_t *event); -static isc_boolean_t -nsec3only(dns_dbnode_t *node); +#define check_dns_dbiterator_current(result) \ + check_result((result == DNS_R_NEWORIGIN) ? ISC_R_SUCCESS : result, \ + "dns_dbiterator_current()") static void dumpnode(dns_name_t *name, dns_dbnode_t *node) { @@ -206,21 +212,37 @@ newkeystruct(dst_key_t *dstkey, isc_boolean_t signwithkey) { key->isksk = ISC_FALSE; key->isdsk = ISC_TRUE; } + key->wasused = ISC_FALSE; + key->commandline = ISC_FALSE; key->position = keycount++; ISC_LINK_INIT(key, link); return (key); } +/*% + * Sign the given RRset with given key, and add the signature record to the + * given tuple. + */ + static void -signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dns_rdata_t *rdata, - dst_key_t *key, isc_buffer_t *b) +signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key, + dns_ttl_t ttl, dns_diff_t *add, const char *logmsg) { isc_result_t result; isc_stdtime_t jendtime; + char keystr[KEY_FORMATSIZE]; + dns_rdata_t trdata = DNS_RDATA_INIT; + unsigned char array[BUFSIZE]; + isc_buffer_t b; + dns_difftuple_t *tuple; + + key_format(key, keystr, sizeof(keystr)); + vbprintf(1, "\t%s %s\n", logmsg, keystr); jendtime = (jitter != 0) ? isc_random_jitter(endtime, jitter) : endtime; + isc_buffer_init(&b, array, sizeof(array)); result = dns_dnssec_sign(name, rdataset, key, &starttime, &jendtime, - mctx, b, rdata); + mctx, &b, &trdata); isc_entropy_stopcallbacksources(ectx); if (result != ISC_R_SUCCESS) { char keystr[KEY_FORMATSIZE]; @@ -232,7 +254,7 @@ signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dns_rdata_t *rdata, if (tryverify) { result = dns_dnssec_verify(name, rdataset, key, - ISC_TRUE, mctx, rdata); + ISC_TRUE, mctx, &trdata); if (result == ISC_R_SUCCESS) { vbprintf(3, "\tsignature verified\n"); INCSTAT(nverified); @@ -241,6 +263,12 @@ signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dns_rdata_t *rdata, INCSTAT(nverifyfailed); } } + + tuple = NULL; + result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD, name, ttl, &trdata, + &tuple); + check_result(result, "dns_difftuple_create"); + dns_diff_append(add, &tuple); } static inline isc_boolean_t @@ -255,13 +283,11 @@ iszonekey(signer_key_t *key) { } /*% - * Finds the key that generated a RRSIG, if possible. First look at the keys - * that we've loaded already, and then see if there's a key on disk. + * Find the key if it is in our list. If it is, return it, otherwise null. + * No locking is performed here, this must be done by the caller. */ static signer_key_t * -keythatsigned(dns_rdata_rrsig_t *rrsig) { - isc_result_t result; - dst_key_t *pubkey = NULL, *privkey = NULL; +keythatsigned_unlocked(dns_rdata_rrsig_t *rrsig) { signer_key_t *key; key = ISC_LIST_HEAD(keylist); @@ -269,15 +295,50 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) { if (rrsig->keyid == dst_key_id(key->key) && rrsig->algorithm == dst_key_alg(key->key) && dns_name_equal(&rrsig->signer, dst_key_name(key->key))) - return key; + return (key); key = ISC_LIST_NEXT(key, link); } + return (NULL); +} + +/*% + * Finds the key that generated a RRSIG, if possible. First look at the keys + * that we've loaded already, and then see if there's a key on disk. + */ +static signer_key_t * +keythatsigned(dns_rdata_rrsig_t *rrsig) { + isc_result_t result; + dst_key_t *pubkey = NULL, *privkey = NULL; + signer_key_t *key; + + isc_rwlock_lock(&keylist_lock, isc_rwlocktype_read); + key = keythatsigned_unlocked(rrsig); + isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_read); + if (key != NULL) + return (key); + + /* + * We did not find the key in our list. Get a write lock now, since + * we may be modifying the bits. We could do the tryupgrade() dance, + * but instead just get a write lock and check once again to see if + * it is on our list. It's possible someone else may have added it + * after all. + */ + isc_rwlock_lock(&keylist_lock, isc_rwlocktype_write); + + key = keythatsigned_unlocked(rrsig); + if (key != NULL) { + isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write); + return (key); + } result = dst_key_fromfile(&rrsig->signer, rrsig->keyid, rrsig->algorithm, DST_TYPE_PUBLIC, NULL, mctx, &pubkey); - if (result != ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) { + isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write); return (NULL); + } result = dst_key_fromfile(&rrsig->signer, rrsig->keyid, rrsig->algorithm, @@ -289,6 +350,8 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) { } else key = newkeystruct(pubkey, ISC_FALSE); ISC_LIST_APPEND(keylist, key, link); + + isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write); return (key); } @@ -438,6 +501,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, keep = ISC_TRUE; wassignedby[key->position] = ISC_TRUE; nowsignedby[key->position] = ISC_TRUE; + key->wasused = ISC_TRUE; } else { vbprintf(2, "\trrsig by %s dropped - %s\n", sigstr, @@ -453,6 +517,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, keep = ISC_TRUE; wassignedby[key->position] = ISC_TRUE; nowsignedby[key->position] = ISC_TRUE; + key->wasused = ISC_TRUE; } else { vbprintf(2, "\trrsig by %s dropped - %s\n", sigstr, @@ -499,24 +564,12 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, } if (resign) { - isc_buffer_t b; - dns_rdata_t trdata = DNS_RDATA_INIT; - unsigned char array[BUFSIZE]; - char keystr[KEY_FORMATSIZE]; - INSIST(!keep); - key_format(key->key, keystr, sizeof(keystr)); - vbprintf(1, "\tresigning with dnskey %s\n", keystr); - isc_buffer_init(&b, array, sizeof(array)); - signwithkey(name, set, &trdata, key->key, &b); + signwithkey(name, set, key->key, ttl, add, + "resigning with dnskey"); nowsignedby[key->position] = ISC_TRUE; - tuple = NULL; - result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD, - name, ttl, &trdata, - &tuple); - check_result(result, "dns_difftuple_create"); - dns_diff_append(add, &tuple); + key->wasused = ISC_TRUE; } dns_rdata_reset(&sigrdata); @@ -534,11 +587,6 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, key != NULL; key = ISC_LIST_NEXT(key, link)) { - isc_buffer_t b; - dns_rdata_t trdata; - unsigned char array[BUFSIZE]; - char keystr[KEY_FORMATSIZE]; - if (nowsignedby[key->position]) continue; @@ -550,16 +598,9 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, dns_name_equal(name, gorigin)))) continue; - key_format(key->key, keystr, sizeof(keystr)); - vbprintf(1, "\tsigning with dnskey %s\n", keystr); - dns_rdata_init(&trdata); - isc_buffer_init(&b, array, sizeof(array)); - signwithkey(name, set, &trdata, key->key, &b); - tuple = NULL; - result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD, name, - ttl, &trdata, &tuple); - check_result(result, "dns_difftuple_create"); - dns_diff_append(add, &tuple); + signwithkey(name, set, key->key, ttl, add, + "signing with dnskey"); + key->wasused = ISC_TRUE; } isc_mem_put(mctx, wassignedby, arraysize * sizeof(isc_boolean_t)); @@ -787,8 +828,8 @@ loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) { return (DNS_R_BADDB); } dns_rdataset_init(&keyset); - result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0, 0, - &keyset, NULL); + result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0, + 0, &keyset, NULL); if (result != ISC_R_SUCCESS) { dns_db_detachnode(db, &node); dns_db_detach(&db); @@ -1021,6 +1062,20 @@ active_node(dns_dbnode_t *node) { type = rdataset.type; covers = rdataset.covers; dns_rdataset_disassociate(&rdataset); + /* + * Delete the NSEC chain if we are signing with + * NSEC3. + */ + if (nsec_datatype == dns_rdatatype_nsec3 && + (type == dns_rdatatype_nsec || + covers == dns_rdatatype_nsec)) { + result = dns_db_deleterdataset(gdb, node, + gversion, type, + covers); + check_result(result, + "dns_db_deleterdataset(nsec/rrsig)"); + continue; + } if (type != dns_rdatatype_rrsig) continue; found = ISC_FALSE; @@ -1050,32 +1105,6 @@ active_node(dns_dbnode_t *node) { fatal("rdataset iteration failed: %s", isc_result_totext(result)); dns_rdatasetiter_destroy(&rdsiter2); - -#if 0 - /* - * Delete all NSEC records and RRSIG(NSEC) if we are in - * NSEC3 mode and vica versa. - */ - for (result = dns_rdatasetiter_first(rdsiter2); - result == ISC_R_SUCCESS; - result = dns_rdatasetiter_next(rdsiter2)) { - dns_rdatasetiter_current(rdsiter, &rdataset); - type = rdataset.type; - covers = rdataset.covers; - if (type == dns_rdatatype_rrsig) - type = covers; - dns_rdataset_disassociate(&rdataset); - if (type == nsec_datatype || - (type != dns_rdatatype_nsec && - type != dns_rdatatype_nsec3)) - continue; - if (covers != 0) - type = dns_rdatatype_rrsig; - result = dns_db_deleterdataset(gdb, node, gversion, - type, covers); - check_result(result, "dns_db_deleterdataset()"); - } -#endif } dns_rdatasetiter_destroy(&rdsiter); @@ -1198,7 +1227,7 @@ cleannode(dns_db_t *db, dns_dbversion_t *version, dns_dbnode_t *node) { dns_rdataset_t set; isc_result_t result, dresult; - if (outputformat != dns_masterformat_text) + if (outputformat != dns_masterformat_text || !disable_zone_check) return; dns_rdataset_init(&set); @@ -1248,6 +1277,424 @@ postsign(void) { dns_dbiterator_destroy(&gdbiter); } +static isc_boolean_t +goodsig(dns_rdata_t *sigrdata, dns_name_t *name, dns_rdataset_t *keyrdataset, + dns_rdataset_t *rdataset) +{ + dns_rdata_dnskey_t key; + dns_rdata_rrsig_t sig; + dst_key_t *dstkey = NULL; + isc_result_t result; + + dns_rdata_tostruct(sigrdata, &sig, NULL); + + for (result = dns_rdataset_first(keyrdataset); + result == ISC_R_SUCCESS; + result = dns_rdataset_next(keyrdataset)) { + dns_rdata_t rdata = DNS_RDATA_INIT; + dns_rdataset_current(keyrdataset, &rdata); + dns_rdata_tostruct(&rdata, &key, NULL); + result = dns_dnssec_keyfromrdata(gorigin, &rdata, mctx, + &dstkey); + if (result != ISC_R_SUCCESS) + return (ISC_FALSE); + if (sig.algorithm != key.algorithm || + sig.keyid != dst_key_id(dstkey) || + !dns_name_equal(&sig.signer, gorigin)) { + dst_key_free(&dstkey); + continue; + } + result = dns_dnssec_verify(name, rdataset, dstkey, ISC_FALSE, + mctx, sigrdata); + dst_key_free(&dstkey); + if (result == ISC_R_SUCCESS) + return(ISC_TRUE); + } + return (ISC_FALSE); +} + +static void +verifyset(dns_rdataset_t *rdataset, dns_name_t *name, dns_dbnode_t *node, + dns_rdataset_t *keyrdataset, unsigned char *ksk_algorithms, + unsigned char *bad_algorithms) +{ + unsigned char set_algorithms[256]; + char namebuf[DNS_NAME_FORMATSIZE]; + char algbuf[80]; + char typebuf[80]; + dns_rdataset_t sigrdataset; + dns_rdatasetiter_t *rdsiter = NULL; + isc_result_t result; + int i; + + dns_rdataset_init(&sigrdataset); + result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter); + check_result(result, "dns_db_allrdatasets()"); + for (result = dns_rdatasetiter_first(rdsiter); + result == ISC_R_SUCCESS; + result = dns_rdatasetiter_next(rdsiter)) { + dns_rdatasetiter_current(rdsiter, &sigrdataset); + if (sigrdataset.type == dns_rdatatype_rrsig && + sigrdataset.covers == rdataset->type) + break; + dns_rdataset_disassociate(&sigrdataset); + } + if (result != ISC_R_SUCCESS) { + dns_name_format(name, namebuf, sizeof(namebuf)); + type_format(rdataset->type, typebuf, sizeof(typebuf)); + fprintf(stderr, "no signatures for %s/%s\n", namebuf, typebuf); + for (i = 0; i < 256; i++) + if (ksk_algorithms[i] != 0) + bad_algorithms[i] = 1; + return; + } + + memset(set_algorithms, 0, sizeof(set_algorithms)); + for (result = dns_rdataset_first(&sigrdataset); + result == ISC_R_SUCCESS; + result = dns_rdataset_next(&sigrdataset)) { + dns_rdata_t rdata = DNS_RDATA_INIT; + dns_rdata_rrsig_t sig; + + dns_rdataset_current(&sigrdataset, &rdata); + dns_rdata_tostruct(&rdata, &sig, NULL); + if ((set_algorithms[sig.algorithm] != 0) || + (ksk_algorithms[sig.algorithm] == 0)) + continue; + if (goodsig(&rdata, name, keyrdataset, rdataset)) + set_algorithms[sig.algorithm] = 1; + } + dns_rdatasetiter_destroy(&rdsiter); + if (memcmp(set_algorithms, ksk_algorithms, sizeof(set_algorithms))) { + dns_name_format(name, namebuf, sizeof(namebuf)); + type_format(rdataset->type, typebuf, sizeof(typebuf)); + for (i = 0; i < 256; i++) + if ((ksk_algorithms[i] != 0) && + (set_algorithms[i] == 0)) { + alg_format(i, algbuf, sizeof(algbuf)); + fprintf(stderr, "Missing %s signature for " + "%s %s\n", algbuf, namebuf, typebuf); + bad_algorithms[i] = 1; + } + } + dns_rdataset_disassociate(&sigrdataset); +} + +static void +verifynode(dns_name_t *name, dns_dbnode_t *node, isc_boolean_t delegation, + dns_rdataset_t *keyrdataset, unsigned char *ksk_algorithms, + unsigned char *bad_algorithms) +{ + dns_rdataset_t rdataset; + dns_rdatasetiter_t *rdsiter = NULL; + isc_result_t result; + + result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter); + check_result(result, "dns_db_allrdatasets()"); + result = dns_rdatasetiter_first(rdsiter); + dns_rdataset_init(&rdataset); + while (result == ISC_R_SUCCESS) { + dns_rdatasetiter_current(rdsiter, &rdataset); + if (rdataset.type != dns_rdatatype_rrsig && + rdataset.type != dns_rdatatype_dnskey && + (!delegation || rdataset.type == dns_rdatatype_ds || + rdataset.type == dns_rdatatype_nsec)) { + verifyset(&rdataset, name, node, keyrdataset, + ksk_algorithms, bad_algorithms); + } + dns_rdataset_disassociate(&rdataset); + result = dns_rdatasetiter_next(rdsiter); + } + if (result != ISC_R_NOMORE) + fatal("rdataset iteration failed: %s", + isc_result_totext(result)); + dns_rdatasetiter_destroy(&rdsiter); +} + +/*% + * Verify that certain things are sane: + * + * The apex has a DNSKEY record with at least one KSK and at least + * one ZSK. + * + * The DNSKEY record was signed with at least one of the KSKs in this + * set. + * + * The rest of the zone was signed with at least one of the ZSKs + * present in the DNSKEY RRSET. + */ +static void +verifyzone(void) { + char algbuf[80]; + dns_dbiterator_t *dbiter = NULL; + dns_dbnode_t *node = NULL, *nextnode = NULL; + dns_fixedname_t fname, fnextname, fzonecut; + dns_name_t *name, *nextname, *zonecut; + dns_rdata_dnskey_t dnskey; + dns_rdata_t rdata = DNS_RDATA_INIT; + dns_rdataset_t rdataset; + dns_rdataset_t sigrdataset; + int i; + isc_boolean_t done = ISC_FALSE; + isc_boolean_t first = ISC_TRUE; + isc_boolean_t goodksk = ISC_FALSE; + isc_boolean_t goodzsk = ISC_FALSE; + isc_result_t result; + unsigned char revoked[256]; + unsigned char standby[256]; + unsigned char ksk_algorithms[256]; + unsigned char zsk_algorithms[256]; + unsigned char bad_algorithms[256]; +#ifdef ALLOW_KSKLESS_ZONES + isc_boolean_t allzsksigned = ISC_TRUE; + unsigned char self_algorithms[256]; +#endif + + if (disable_zone_check) + return; + + result = dns_db_findnode(gdb, gorigin, ISC_FALSE, &node); + if (result != ISC_R_SUCCESS) + fatal("failed to find the zone's origin: %s", + isc_result_totext(result)); + + dns_rdataset_init(&rdataset); + dns_rdataset_init(&sigrdataset); + result = dns_db_findrdataset(gdb, node, gversion, + dns_rdatatype_dnskey, + 0, 0, &rdataset, &sigrdataset); + dns_db_detachnode(gdb, &node); + if (result != ISC_R_SUCCESS) + fatal("cannot find DNSKEY rrset\n"); + + if (!dns_rdataset_isassociated(&sigrdataset)) + fatal("cannot find DNSKEY RRSIGs\n"); + + memset(revoked, 0, sizeof(revoked)); + memset(standby, 0, sizeof(revoked)); + memset(ksk_algorithms, 0, sizeof(ksk_algorithms)); + memset(zsk_algorithms, 0, sizeof(zsk_algorithms)); + memset(bad_algorithms, 0, sizeof(bad_algorithms)); +#ifdef ALLOW_KSKLESS_ZONES + memset(self_algorithms, 0, sizeof(self_algorithms)); +#endif + + /* + * Check that the DNSKEY RR has at least one self signing KSK and + * one ZSK per algorithm in it. + */ + for (result = dns_rdataset_first(&rdataset); + result == ISC_R_SUCCESS; + result = dns_rdataset_next(&rdataset)) { + dns_rdataset_current(&rdataset, &rdata); + result = dns_rdata_tostruct(&rdata, &dnskey, NULL); + check_result(result, "dns_rdata_tostruct"); + + if ((dnskey.flags & DNS_KEYOWNER_ZONE) == 0) + ; + else if ((dnskey.flags & DNS_KEYFLAG_REVOKE) != 0) { + if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0 && + !dns_dnssec_selfsigns(&rdata, gorigin, &rdataset, + &sigrdataset, ISC_FALSE, + mctx)) { + char namebuf[DNS_NAME_FORMATSIZE]; + char buffer[1024]; + isc_buffer_t buf; + + dns_name_format(gorigin, namebuf, + sizeof(namebuf)); + isc_buffer_init(&buf, buffer, sizeof(buffer)); + result = dns_rdata_totext(&rdata, NULL, &buf); + check_result(result, "dns_rdata_totext"); + fatal("revoked KSK is not self signed:\n" + "%s DNSKEY %.*s", namebuf, + (int)isc_buffer_usedlength(&buf), buffer); + } + if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0 && + revoked[dnskey.algorithm] != 255) + revoked[dnskey.algorithm]++; + } else if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0) { + if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset, + &sigrdataset, ISC_FALSE, mctx)) { + if (ksk_algorithms[dnskey.algorithm] != 255) + ksk_algorithms[dnskey.algorithm]++; + goodksk = ISC_TRUE; + } else { + if (standby[dnskey.algorithm] != 255) + standby[dnskey.algorithm]++; + } + } else if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset, + &sigrdataset, ISC_FALSE, + mctx)) { +#ifdef ALLOW_KSKLESS_ZONES + if (self_algorithms[dnskey.algorithm] != 255) + self_algorithms[dnskey.algorithm]++; +#endif + if (zsk_algorithms[dnskey.algorithm] != 255) + zsk_algorithms[dnskey.algorithm]++; + goodzsk = ISC_TRUE; + } else { + if (zsk_algorithms[dnskey.algorithm] != 255) + zsk_algorithms[dnskey.algorithm]++; +#ifdef ALLOW_KSKLESS_ZONES + allzsksigned = ISC_FALSE; +#endif + } + dns_rdata_freestruct(&dnskey); + dns_rdata_reset(&rdata); + } + dns_rdataset_disassociate(&sigrdataset); + + if (!goodksk) { +#ifdef ALLOW_KSKLESS_ZONES + if (!goodzsk) + fatal("no self signing keys found"); + fprintf(stderr, "No self signing KSK found. Using self signed " + "ZSK's for active algorithm list.\n"); + memcpy(ksk_algorithms, self_algorithms, sizeof(ksk_algorithms)); + if (!allzsksigned) + fprintf(stderr, "warning: not all ZSK's are self " + "signed.\n"); +#else + fatal("no self signed KSK's found"); +#endif + } + + fprintf(stderr, "Verifying the zone using the following algorithms:"); + for (i = 0; i < 256; i++) { + if (ksk_algorithms[i] != 0) { + alg_format(i, algbuf, sizeof(algbuf)); + fprintf(stderr, " %s", algbuf); + } + } + fprintf(stderr, ".\n"); + + for (i = 0; i < 256; i++) { + /* + * The counts should both be zero or both be non-zero. + * Mark the algorithm as bad if this is not met. + */ + if ((ksk_algorithms[i] != 0) == (zsk_algorithms[i] != 0)) + continue; + alg_format(i, algbuf, sizeof(algbuf)); + fprintf(stderr, "Missing %s for algorithm %s\n", + (ksk_algorithms[i] != 0) ? "ZSK" : "self signing KSK", + algbuf); + bad_algorithms[i] = 1; + } + + /* + * Check that all the other records were signed by keys that are + * present in the DNSKEY RRSET. + */ + + dns_fixedname_init(&fname); + name = dns_fixedname_name(&fname); + dns_fixedname_init(&fnextname); + nextname = dns_fixedname_name(&fnextname); + dns_fixedname_init(&fzonecut); + zonecut = NULL; + + result = dns_db_createiterator(gdb, DNS_DB_NONSEC3, &dbiter); + check_result(result, "dns_db_createiterator()"); + + result = dns_dbiterator_first(dbiter); + check_result(result, "dns_dbiterator_first()"); + + while (!done) { + isc_boolean_t isdelegation = ISC_FALSE; + + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); + if (delegation(name, node, NULL)) { + zonecut = dns_fixedname_name(&fzonecut); + dns_name_copy(name, zonecut, NULL); + isdelegation = ISC_TRUE; + } + verifynode(name, node, isdelegation, &rdataset, + ksk_algorithms, bad_algorithms); + result = dns_dbiterator_next(dbiter); + nextnode = NULL; + while (result == ISC_R_SUCCESS) { + result = dns_dbiterator_current(dbiter, &nextnode, + nextname); + check_dns_dbiterator_current(result); + if (!dns_name_issubdomain(nextname, gorigin) || + (zonecut != NULL && + dns_name_issubdomain(nextname, zonecut))) + { + dns_db_detachnode(gdb, &nextnode); + result = dns_dbiterator_next(dbiter); + continue; + } + dns_db_detachnode(gdb, &nextnode); + break; + } + if (result == ISC_R_NOMORE) { + done = ISC_TRUE; + } else if (result != ISC_R_SUCCESS) + fatal("iterating through the database failed: %s", + isc_result_totext(result)); + dns_db_detachnode(gdb, &node); + } + + dns_dbiterator_destroy(&dbiter); + + result = dns_db_createiterator(gdb, DNS_DB_NSEC3ONLY, &dbiter); + check_result(result, "dns_db_createiterator()"); + + for (result = dns_dbiterator_first(dbiter); + result == ISC_R_SUCCESS; + result = dns_dbiterator_next(dbiter) ) { + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); + verifynode(name, node, ISC_FALSE, &rdataset, + ksk_algorithms, bad_algorithms); + dns_db_detachnode(gdb, &node); + } + dns_dbiterator_destroy(&dbiter); + + dns_rdataset_disassociate(&rdataset); + + /* + * If we made it this far, we have what we consider a properly signed + * zone. Set the good flag. + */ + for (i = 0; i < 256; i++) { + if (bad_algorithms[i] != 0) { + if (first) + fprintf(stderr, "The zone is not fully signed " + "for the following algorithms:"); + alg_format(i, algbuf, sizeof(algbuf)); + fprintf(stderr, " %s", algbuf); + first = ISC_FALSE; + } + } + if (!first) { + fprintf(stderr, ".\n"); + fatal("DNSSEC completeness test failed."); + } + + if (goodksk) { + /* + * Print the success summary. + */ + fprintf(stderr, "Zone signing complete:\n"); + for (i = 0; i < 256; i++) { + if ((zsk_algorithms[i] != 0) || + (ksk_algorithms[i] != 0) || + (revoked[i] != 0) || (standby[i] != 0)) { + alg_format(i, algbuf, sizeof(algbuf)); + fprintf(stderr, "Algorithm: %s: ZSKs: %u, " + "KSKs: %u active, %u revoked, %u " + "stand-by\n", algbuf, + zsk_algorithms[i], ksk_algorithms[i], + revoked[i], standby[i]); + } + } + } +} + /*% * Sign the apex of the zone. * Note the origin may not be the first node if there are out of zone @@ -1265,7 +1712,7 @@ signapex(void) { result = dns_dbiterator_seek(gdbiter, gorigin); check_result(result, "dns_dbiterator_seek()"); result = dns_dbiterator_current(gdbiter, &node, name); - check_result(result, "dns_dbiterator_current()"); + check_dns_dbiterator_current(result); signname(node, name); dumpnode(name, node); cleannode(gdb, gversion, node); @@ -1317,9 +1764,7 @@ assignwork(isc_task_t *task, isc_task_t *worker) { found = ISC_FALSE; while (!found) { result = dns_dbiterator_current(gdbiter, &node, name); - if (result != ISC_R_SUCCESS) - fatal("failure iterating database: %s", - isc_result_totext(result)); + check_dns_dbiterator_current(result); /* * The origin was handled by signapex(). */ @@ -1487,7 +1932,7 @@ add_ds(dns_name_t *name, dns_dbnode_t *node, isc_uint32_t nsttl) { } /*% - * Generate NSEC records for the zone. + * Generate NSEC records for the zone and remove NSEC3/NSEC3PARAM records. */ static void nsecify(void) { @@ -1495,10 +1940,14 @@ nsecify(void) { dns_dbnode_t *node = NULL, *nextnode = NULL; dns_fixedname_t fname, fnextname, fzonecut; dns_name_t *name, *nextname, *zonecut; + dns_rdataset_t rdataset; + dns_rdatasetiter_t *rdsiter = NULL; + dns_rdatatype_t type, covers; isc_boolean_t done = ISC_FALSE; isc_result_t result; isc_uint32_t nsttl = 0; + dns_rdataset_init(&rdataset); dns_fixedname_init(&fname); name = dns_fixedname_name(&fname); dns_fixedname_init(&fnextname); @@ -1506,14 +1955,70 @@ nsecify(void) { dns_fixedname_init(&fzonecut); zonecut = NULL; + /* + * Remove any NSEC3 chains. + */ + result = dns_db_createiterator(gdb, DNS_DB_NSEC3ONLY, &dbiter); + check_result(result, "dns_db_createiterator()"); + for (result = dns_dbiterator_first(dbiter); + result == ISC_R_SUCCESS; + result = dns_dbiterator_next(dbiter)) { + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); + result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter); + check_result(result, "dns_db_allrdatasets()"); + for (result = dns_rdatasetiter_first(rdsiter); + result == ISC_R_SUCCESS; + result = dns_rdatasetiter_next(rdsiter)) { + dns_rdatasetiter_current(rdsiter, &rdataset); + type = rdataset.type; + covers = rdataset.covers; + dns_rdataset_disassociate(&rdataset); + result = dns_db_deleterdataset(gdb, node, gversion, + type, covers); + check_result(result, + "dns_db_deleterdataset(nsec3param/rrsig)"); + } + dns_rdatasetiter_destroy(&rdsiter); + dns_db_detachnode(gdb, &node); + } + dns_dbiterator_destroy(&dbiter); + result = dns_db_createiterator(gdb, DNS_DB_NONSEC3, &dbiter); check_result(result, "dns_db_createiterator()"); result = dns_dbiterator_first(dbiter); check_result(result, "dns_dbiterator_first()"); + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); + /* + * Delete any NSEC3PARAM records at the apex. + */ + result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter); + check_result(result, "dns_db_allrdatasets()"); + for (result = dns_rdatasetiter_first(rdsiter); + result == ISC_R_SUCCESS; + result = dns_rdatasetiter_next(rdsiter)) { + dns_rdatasetiter_current(rdsiter, &rdataset); + type = rdataset.type; + covers = rdataset.covers; + dns_rdataset_disassociate(&rdataset); + if (type == dns_rdatatype_nsec3param || + covers == dns_rdatatype_nsec3param) { + result = dns_db_deleterdataset(gdb, node, gversion, + type, covers); + check_result(result, + "dns_db_deleterdataset(nsec3param/rrsig)"); + continue; + } + } + dns_rdatasetiter_destroy(&rdsiter); + dns_db_detachnode(gdb, &node); + while (!done) { - dns_dbiterator_current(dbiter, &node, name); + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); if (delegation(name, node, &nsttl)) { zonecut = dns_fixedname_name(&fzonecut); dns_name_copy(name, zonecut, NULL); @@ -1526,8 +2031,7 @@ nsecify(void) { isc_boolean_t active = ISC_FALSE; result = dns_dbiterator_current(dbiter, &nextnode, nextname); - if (result != ISC_R_SUCCESS) - break; + check_dns_dbiterator_current(result); active = active_node(nextnode); if (!active) { dns_db_detachnode(gdb, &nextnode); @@ -1560,37 +2064,6 @@ nsecify(void) { dns_dbiterator_destroy(&dbiter); } -/*% - * Does this node only contain NSEC3 records or RRSIG records or is empty. - */ -static isc_boolean_t -nsec3only(dns_dbnode_t *node) { - dns_rdatasetiter_t *rdsiter = NULL; - isc_result_t result; - dns_rdataset_t rdataset; - isc_boolean_t answer = ISC_TRUE; - - dns_rdataset_init(&rdataset); - result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter); - check_result(result, "dns_db_allrdatasets()"); - result = dns_rdatasetiter_first(rdsiter); - while (result == ISC_R_SUCCESS) { - dns_rdatasetiter_current(rdsiter, &rdataset); - if (rdataset.type != dns_rdatatype_nsec3 && - rdataset.type != dns_rdatatype_rrsig) { - answer = ISC_FALSE; - result = ISC_R_NOMORE; - } else - result = dns_rdatasetiter_next(rdsiter); - dns_rdataset_disassociate(&rdataset); - } - if (result != ISC_R_NOMORE) - fatal("rdataset iteration failed: %s", - isc_result_totext(result)); - dns_rdatasetiter_destroy(&rdsiter); - return (answer); -} - static void addnsec3param(const unsigned char *salt, size_t salt_length, unsigned int iterations) @@ -1631,6 +2104,16 @@ addnsec3param(const unsigned char *salt, size_t salt_length, result = dns_db_findnode(gdb, gorigin, ISC_TRUE, &node); check_result(result, "dns_db_find(gorigin)"); + + /* + * Delete any current NSEC3PARAM records. + */ + result = dns_db_deleterdataset(gdb, node, gversion, + dns_rdatatype_nsec3param, 0); + if (result == DNS_R_UNCHANGED) + result = ISC_R_SUCCESS; + check_result(result, "dddnsec3param: dns_db_deleterdataset()"); + result = dns_db_addrdataset(gdb, node, gversion, 0, &rdataset, DNS_DBADD_MERGE, NULL); if (result == DNS_R_UNCHANGED) @@ -1719,6 +2202,7 @@ nsec3clean(dns_name_t *name, dns_dbnode_t *node, isc_buffer_t target; isc_result_t result; unsigned char hash[NSEC3_MAX_HASH_LENGTH + 1]; + isc_boolean_t exists; /* * Get the first label. @@ -1740,8 +2224,7 @@ nsec3clean(dns_name_t *name, dns_dbnode_t *node, hash[isc_buffer_usedlength(&target)] = 0; - if (hashlist_exists(hashlist, hash)) - return; + exists = hashlist_exists(hashlist, hash); /* * Verify that the NSEC3 parameters match the current ones @@ -1756,20 +2239,21 @@ nsec3clean(dns_name_t *name, dns_dbnode_t *node, return; /* - * Delete any matching NSEC3 records which have parameters that - * match the NSEC3 chain we are building. + * Delete any NSEC3 records which are not part of the current + * NSEC3 chain. */ for (result = dns_rdataset_first(&rdataset); result == ISC_R_SUCCESS; result = dns_rdataset_next(&rdataset)) { dns_rdata_init(&rdata); dns_rdataset_current(&rdataset, &rdata); - dns_rdata_tostruct(&rdata, &nsec3, NULL); - if (nsec3.hash == hashalg && + result = dns_rdata_tostruct(&rdata, &nsec3, NULL); + check_result(result, "dns_rdata_tostruct"); + if (exists && nsec3.hash == hashalg && nsec3.iterations == iterations && nsec3.salt_length == salt_length && !memcmp(nsec3.salt, salt, salt_length)) - break; + continue; rdatalist.rdclass = rdata.rdclass; rdatalist.type = rdata.type; rdatalist.covers = 0; @@ -1783,7 +2267,7 @@ nsec3clean(dns_name_t *name, dns_dbnode_t *node, result = dns_db_subtractrdataset(gdb, node, gversion, &delrdataset, 0, NULL); dns_rdataset_disassociate(&delrdataset); - if (result != ISC_R_SUCCESS && result != DNS_R_UNCHANGED) + if (result != ISC_R_SUCCESS && result != DNS_R_NXRRSET) check_result(result, "dns_db_subtractrdataset(NSEC3)"); delete_rrsigs = ISC_TRUE; } @@ -1814,13 +2298,17 @@ nsec3ify(unsigned int hashalg, unsigned int iterations, dns_dbnode_t *node = NULL, *nextnode = NULL; dns_fixedname_t fname, fnextname, fzonecut; dns_name_t *name, *nextname, *zonecut; + dns_rdataset_t rdataset; + dns_rdatasetiter_t *rdsiter = NULL; + dns_rdatatype_t type, covers; + int order; + isc_boolean_t active; isc_boolean_t done = ISC_FALSE; isc_result_t result; - isc_boolean_t active; isc_uint32_t nsttl = 0; unsigned int count, nlabels; - int order; + dns_rdataset_init(&rdataset); dns_fixedname_init(&fname); name = dns_fixedname_name(&fname); dns_fixedname_init(&fnextname); @@ -1837,15 +2325,41 @@ nsec3ify(unsigned int hashalg, unsigned int iterations, result = dns_dbiterator_first(dbiter); check_result(result, "dns_dbiterator_first()"); + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); + /* + * Delete any NSEC records at the apex. + */ + result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter); + check_result(result, "dns_db_allrdatasets()"); + for (result = dns_rdatasetiter_first(rdsiter); + result == ISC_R_SUCCESS; + result = dns_rdatasetiter_next(rdsiter)) { + dns_rdatasetiter_current(rdsiter, &rdataset); + type = rdataset.type; + covers = rdataset.covers; + dns_rdataset_disassociate(&rdataset); + if (type == dns_rdatatype_nsec || + covers == dns_rdatatype_nsec) { + result = dns_db_deleterdataset(gdb, node, gversion, + type, covers); + check_result(result, + "dns_db_deleterdataset(nsec3param/rrsig)"); + continue; + } + } + dns_rdatasetiter_destroy(&rdsiter); + dns_db_detachnode(gdb, &node); + while (!done) { - dns_dbiterator_current(dbiter, &node, name); + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); result = dns_dbiterator_next(dbiter); nextnode = NULL; while (result == ISC_R_SUCCESS) { result = dns_dbiterator_current(dbiter, &nextnode, nextname); - if (result != ISC_R_SUCCESS) - break; + check_dns_dbiterator_current(result); active = active_node(nextnode); if (!active) { dns_db_detachnode(gdb, &nextnode); @@ -1927,6 +2441,26 @@ nsec3ify(unsigned int hashalg, unsigned int iterations, addnsec3param(salt, salt_length, iterations); + /* + * Clean out NSEC3 records which don't match this chain. + */ + result = dns_db_createiterator(gdb, DNS_DB_NSEC3ONLY, &dbiter); + check_result(result, "dns_db_createiterator()"); + + for (result = dns_dbiterator_first(dbiter); + result == ISC_R_SUCCESS; + result = dns_dbiterator_next(dbiter)) { + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); + nsec3clean(name, node, hashalg, iterations, salt, salt_length, + hashlist); + dns_db_detachnode(gdb, &node); + } + dns_dbiterator_destroy(&dbiter); + + /* + * Generate / complete the new chain. + */ result = dns_db_createiterator(gdb, DNS_DB_NONSEC3, &dbiter); check_result(result, "dns_db_createiterator()"); @@ -1934,25 +2468,16 @@ nsec3ify(unsigned int hashalg, unsigned int iterations, check_result(result, "dns_dbiterator_first()"); while (!done) { - dns_dbiterator_current(dbiter, &node, name); + result = dns_dbiterator_current(dbiter, &node, name); + check_dns_dbiterator_current(result); result = dns_dbiterator_next(dbiter); nextnode = NULL; while (result == ISC_R_SUCCESS) { result = dns_dbiterator_current(dbiter, &nextnode, nextname); - if (result != ISC_R_SUCCESS) - break; - /* - * Cleanout NSEC3 RRsets which don't exist in the - * hash table. - */ - nsec3clean(nextname, nextnode, hashalg, iterations, - salt, salt_length, hashlist); - /* - * Skip NSEC3 only nodes when looking for the next - * node in the zone. Also skips now empty nodes. - */ - if (nsec3only(nextnode)) { + check_dns_dbiterator_current(result); + active = active_node(nextnode); + if (!active) { dns_db_detachnode(gdb, &nextnode); result = dns_dbiterator_next(dbiter); continue; @@ -2098,7 +2623,8 @@ loadzonepubkeys(dns_db_t *db) { dns_rdataset_init(&rdataset); result = dns_db_findrdataset(db, node, currentversion, - dns_rdatatype_dnskey, 0, 0, &rdataset, NULL); + dns_rdatatype_dnskey, 0, 0, &rdataset, + NULL); if (result != ISC_R_SUCCESS) fatal("failed to find keys at the zone apex: %s", isc_result_totext(result)); @@ -2134,7 +2660,7 @@ warnifallksk(dns_db_t *db) { dns_rdataset_t rdataset; dns_rdata_t rdata = DNS_RDATA_INIT; isc_result_t result; - dns_rdata_key_t key; + dns_rdata_dnskey_t dnskey; isc_boolean_t have_non_ksk = ISC_FALSE; dns_db_currentversion(db, ¤tversion); @@ -2146,7 +2672,8 @@ warnifallksk(dns_db_t *db) { dns_rdataset_init(&rdataset); result = dns_db_findrdataset(db, node, currentversion, - dns_rdatatype_dnskey, 0, 0, &rdataset, NULL); + dns_rdatatype_dnskey, 0, 0, &rdataset, + NULL); if (result != ISC_R_SUCCESS) fatal("failed to find keys at the zone apex: %s", isc_result_totext(result)); @@ -2155,21 +2682,27 @@ warnifallksk(dns_db_t *db) { while (result == ISC_R_SUCCESS) { dns_rdata_reset(&rdata); dns_rdataset_current(&rdataset, &rdata); - result = dns_rdata_tostruct(&rdata, &key, NULL); + result = dns_rdata_tostruct(&rdata, &dnskey, NULL); check_result(result, "dns_rdata_tostruct"); - if ((key.flags & DNS_KEYFLAG_KSK) == 0) { + if ((dnskey.flags & DNS_KEYFLAG_KSK) == 0) { have_non_ksk = ISC_TRUE; result = ISC_R_NOMORE; } else result = dns_rdataset_next(&rdataset); + dns_rdata_freestruct(&dnskey); } dns_rdataset_disassociate(&rdataset); dns_db_detachnode(db, &node); dns_db_closeversion(db, ¤tversion, ISC_FALSE); - if (!have_non_ksk && !ignoreksk) - fprintf(stderr, "%s: warning: No non-KSK dnskey found. " - "Supply non-KSK dnskey or use '-z'.\n", - program); + if (!have_non_ksk && !ignoreksk) { + if (disable_zone_check) + fprintf(stderr, "%s: warning: No non-KSK dnskey found. " + "Supply non-KSK dnskey or use '-z'.\n", + program); + else + fatal("No non-KSK dnskey found. " + "Supply non-KSK dnskey or use '-z'."); + } } static void @@ -2343,7 +2876,8 @@ usage(void) { fprintf(stderr, "\t-g:\t"); fprintf(stderr, "generate DS records from keyset files\n"); fprintf(stderr, "\t-s [YYYYMMDDHHMMSS|+offset]:\n"); - fprintf(stderr, "\t\tRRSIG start time - absolute|offset (now - 1 hour)\n"); + fprintf(stderr, "\t\tRRSIG start time - absolute|offset " + "(now - 1 hour)\n"); fprintf(stderr, "\t-e [YYYYMMDDHHMMSS|+offset|\"now\"+offset]:\n"); fprintf(stderr, "\t\tRRSIG end time - absolute|from start|from now " "(now + 30 days)\n"); @@ -2351,7 +2885,8 @@ usage(void) { fprintf(stderr, "\t\tcycle interval - resign " "if < interval from end ( (end-start)/4 )\n"); fprintf(stderr, "\t-j jitter:\n"); - fprintf(stderr, "\t\trandomize signature end time up to jitter seconds\n"); + fprintf(stderr, "\t\trandomize signature end time up to jitter " + "seconds\n"); fprintf(stderr, "\t-v debuglevel (0)\n"); fprintf(stderr, "\t-o origin:\n"); fprintf(stderr, "\t\tzone origin (name of zonefile)\n"); @@ -2370,6 +2905,8 @@ usage(void) { fprintf(stderr, "verify generated signatures\n"); fprintf(stderr, "\t-p:\t"); fprintf(stderr, "use pseudorandom data (faster but less secure)\n"); + fprintf(stderr, "\t-P:\t"); + fprintf(stderr, "disable post-sign verification\n"); fprintf(stderr, "\t-t:\t"); fprintf(stderr, "print statistics\n"); fprintf(stderr, "\t-n ncpus (number of cpus present)\n"); @@ -2448,7 +2985,7 @@ main(int argc, char *argv[]) { unsigned char saltbuf[255]; hashlist_t hashlist; -#define CMDLINE_FLAGS "3:aAc:d:e:f:ghH:i:I:j:k:l:m:n:N:o:O:pr:s:StUv:z" +#define CMDLINE_FLAGS "3:aAc:d:e:f:FghH:i:I:j:k:l:m:n:N:o:O:pPr:s:StUv:z" /* * Process memory debugging argument first. @@ -2535,19 +3072,19 @@ main(int argc, char *argv[]) { generateds = ISC_TRUE; break; - case '?': - if (isc_commandline_option != '?') - fprintf(stderr, "%s: invalid argument -%c\n", - program, isc_commandline_option); + case 'H': + iterations = strtoul(isc_commandline_argument, + &endp, 0); + if (*endp != '\0') + fatal("iterations must be numeric"); + if (iterations > 0xffffU) + fatal("iterations too big"); + break; + case 'h': usage(); break; - default: - fprintf(stderr, "%s: unhandled option -%c\n", - program, isc_commandline_option); - exit(1); - case 'i': endp = NULL; cycle = strtol(isc_commandline_argument, &endp, 0); @@ -2567,8 +3104,13 @@ main(int argc, char *argv[]) { fatal("jitter must be numeric and positive"); break; + case 'k': + if (ndskeys == MAXDSKEYS) + fatal("too many key-signing keys specified"); + dskeyfile[ndskeys++] = isc_commandline_argument; + break; + case 'l': - dns_fixedname_init(&dlv_fixed); len = strlen(isc_commandline_argument); isc_buffer_init(&b, isc_commandline_argument, len); isc_buffer_add(&b, len); @@ -2580,12 +3122,6 @@ main(int argc, char *argv[]) { check_result(result, "dns_name_fromtext(dlv)"); break; - case 'k': - if (ndskeys == MAXDSKEYS) - fatal("too many key-signing keys specified"); - dskeyfile[ndskeys++] = isc_commandline_argument; - break; - case 'm': break; @@ -2600,15 +3136,6 @@ main(int argc, char *argv[]) { serialformatstr = isc_commandline_argument; break; - case 'H': - iterations = strtoul(isc_commandline_argument, - &endp, 0); - if (*endp != '\0') - fatal("iterations must be numeric"); - if (iterations > 0xffffU) - fatal("iterations too big"); - break; - case 'o': origin = isc_commandline_argument; break; @@ -2621,6 +3148,10 @@ main(int argc, char *argv[]) { pseudorandom = ISC_TRUE; break; + case 'P': + disable_zone_check = ISC_TRUE; + break; + case 'r': setup_entropy(mctx, isc_commandline_argument, &ectx); break; @@ -2653,6 +3184,21 @@ main(int argc, char *argv[]) { case 'z': ignoreksk = ISC_TRUE; break; + + case 'F': + /* Reserved for FIPS mode */ + /* FALLTHROUGH */ + case '?': + if (isc_commandline_option != '?') + fprintf(stderr, "%s: invalid argument -%c\n", + program, isc_commandline_option); + usage(); + break; + + default: + fprintf(stderr, "%s: unhandled option -%c\n", + program, isc_commandline_option); + exit(1); } } @@ -2743,7 +3289,8 @@ main(int argc, char *argv[]) { else if (strcasecmp(serialformatstr, "unixtime") == 0) serialformat = SOA_SERIAL_UNIXTIME; else - fatal("unknown soa serial format: %s\n", serialformatstr); + fatal("unknown soa serial format: %s\n", + serialformatstr); } result = dns_master_stylecreate(&dsstyle, DNS_STYLEFLAG_NO_TTL, @@ -2769,7 +3316,12 @@ main(int argc, char *argv[]) { "NSEC only DNSKEY"); } + /* + * We need to do this early on, as we start messing with the list + * of keys rather early. + */ ISC_LIST_INIT(keylist); + isc_rwlock_init(&keylist_lock, 0, 0); if (argc == 0) { loadzonekeys(gdb); @@ -2806,6 +3358,7 @@ main(int argc, char *argv[]) { } if (key == NULL) { key = newkeystruct(newkey, ISC_TRUE); + key->commandline = ISC_TRUE; ISC_LIST_APPEND(keylist, key, link); } else dst_key_free(&newkey); @@ -2856,8 +3409,11 @@ main(int argc, char *argv[]) { } if (ISC_LIST_EMPTY(keylist)) { - fprintf(stderr, "%s: warning: No keys specified or found\n", - program); + if (disable_zone_check) + fprintf(stderr, "%s: warning: No keys specified " + "or found\n", program); + else + fatal("No signing keys specified or found."); nokeys = ISC_TRUE; } @@ -2972,6 +3528,7 @@ main(int argc, char *argv[]) { isc_taskmgr_destroy(&taskmgr); isc_mem_put(mctx, tasks, ntasks * sizeof(isc_task_t *)); postsign(); + verifyzone(); if (outputformat != dns_masterformat_text) { result = dns_master_dumptostream2(mctx, gdb, gversion, diff --git a/bin/dnssec/dnssec-signzone.docbook b/bin/dnssec/dnssec-signzone.docbook index 7ed320a..f204fcd 100644 --- a/bin/dnssec/dnssec-signzone.docbook +++ b/bin/dnssec/dnssec-signzone.docbook @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + June 08, 2009 @@ -73,6 +73,7 @@ + @@ -91,10 +92,10 @@ dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the - zone. The security status of delegations from the signed zone - (that is, whether the child zones are secure or not) is - determined by the presence or absence of a - keyset file for each child zone. + zone. It also generates a keyset- file containing + the key-signing keys for the zone, and if signing a zone which + contains delegations, it can optionally generate DS records for + the child zones from their keyset- files. @@ -154,8 +155,10 @@ -g - Generate DS records for child zones from keyset files. - Existing DS records will be removed. + If the zone contains any delegations, and there are + keyset- files for any of the child zones, + then DS records for the child zones will be generated from the + keys in those files. Existing DS records will be removed. @@ -360,6 +363,22 @@ + -P + + + Disable post sign verification tests. + + + The post sign verification test ensures that for each algorithm + in use there is at least one non revoked self signed KSK key, + that all revoked KSK keys are self signed, and that all records + in the zone are signed by the algorithm. + This option skips these tests. + + + + + -r randomdev diff --git a/bin/dnssec/dnssec-signzone.html b/bin/dnssec/dnssec-signzone.html index 652d5c4..e7c534f 100644 --- a/bin/dnssec/dnssec-signzone.html +++ b/bin/dnssec/dnssec-signzone.html @@ -2,7 +2,7 @@ - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -29,21 +29,21 @@

Synopsis

-

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

+

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-P] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the - zone. The security status of delegations from the signed zone - (that is, whether the child zones are secure or not) is - determined by the presence or absence of a - keyset file for each child zone. + zone. It also generates a keyset- file containing + the key-signing keys for the zone, and if signing a zone which + contains delegations, it can optionally generate DS records for + the child zones from their keyset- files.

-

OPTIONS

+

OPTIONS

-a

@@ -70,8 +70,10 @@

-g

- Generate DS records for child zones from keyset files. - Existing DS records will be removed. + If the zone contains any delegations, and there are + keyset- files for any of the child zones, + then DS records for the child zones will be generated from the + keys in those files. Existing DS records will be removed.

-s start-time

@@ -202,6 +204,19 @@ may be useful when signing large zones or when the entropy source is limited.

+
-P
+
+

+ Disable post sign verification tests. +

+

+ The post sign verification test ensures that for each algorithm + in use there is at least one non revoked self signed KSK key, + that all revoked KSK keys are self signed, and that all records + in the zone are signed by the algorithm. + This option skips these tests. +

+
-r randomdev

Specifies the source of randomness. If the operating @@ -258,7 +273,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -287,7 +302,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -312,14 +327,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssectool.c b/bin/dnssec/dnssectool.c index b89d769..3a6b7f0 100644 --- a/bin/dnssec/dnssectool.c +++ b/bin/dnssec/dnssectool.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssectool.c,v 1.45.334.4 2009/06/08 23:47:00 tbox Exp $ */ +/* $Id: dnssectool.c,v 1.45.334.5 2009/06/22 05:05:00 marka Exp $ */ /*! \file */ @@ -65,7 +65,7 @@ void fatal(const char *format, ...) { va_list args; - fprintf(stderr, "%s: ", program); + fprintf(stderr, "%s: fatal: ", program); va_start(args, format); vfprintf(stderr, format, args); va_end(args); diff --git a/bin/dnssec/dnssectool.h b/bin/dnssec/dnssectool.h index ee476f4..43b7375 100644 --- a/bin/dnssec/dnssectool.h +++ b/bin/dnssec/dnssectool.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssectool.h,v 1.22 2008/09/25 04:02:38 tbox Exp $ */ +/* $Id: dnssectool.h,v 1.22.48.2 2009/09/04 23:46:58 tbox Exp $ */ #ifndef DNSSECTOOL_H #define DNSSECTOOL_H 1 @@ -45,7 +45,7 @@ type_format(const dns_rdatatype_t type, char *cp, unsigned int size); void alg_format(const dns_secalg_t alg, char *cp, unsigned int size); -#define ALG_FORMATSIZE 10 +#define ALG_FORMATSIZE 20 void sig_format(dns_rdata_rrsig_t *sig, char *cp, unsigned int size); diff --git a/bin/named/control.c b/bin/named/control.c index 8bd8f6c..ac1ec42 100644 --- a/bin/named/control.c +++ b/bin/named/control.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2001-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: control.c,v 1.33 2007/09/13 04:45:18 each Exp $ */ +/* $Id: control.c,v 1.33.266.2 2009/07/11 23:47:17 tbox Exp $ */ /*! \file */ @@ -56,7 +56,7 @@ command_compare(const char *text, const char *command) { /*% * This function is called to process the incoming command - * when a control channel message is received. + * when a control channel message is received. */ isc_result_t ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) { @@ -170,10 +170,12 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) { } else if (command_compare(command, NS_COMMAND_TSIGDELETE)) { result = ns_server_tsigdelete(ns_g_server, command, text); } else if (command_compare(command, NS_COMMAND_FREEZE)) { - result = ns_server_freeze(ns_g_server, ISC_TRUE, command); + result = ns_server_freeze(ns_g_server, ISC_TRUE, command, + text); } else if (command_compare(command, NS_COMMAND_UNFREEZE) || command_compare(command, NS_COMMAND_THAW)) { - result = ns_server_freeze(ns_g_server, ISC_FALSE, command); + result = ns_server_freeze(ns_g_server, ISC_FALSE, command, + text); } else if (command_compare(command, NS_COMMAND_RECURSING)) { result = ns_server_dumprecursing(ns_g_server); } else if (command_compare(command, NS_COMMAND_TIMERPOKE)) { diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 43eccc4..1a3f746 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.h,v 1.93.120.2 2009/01/29 23:47:44 tbox Exp $ */ +/* $Id: server.h,v 1.93.120.3 2009/07/11 04:23:53 marka Exp $ */ #ifndef NAMED_SERVER_H #define NAMED_SERVER_H 1 @@ -276,7 +276,8 @@ ns_server_tsigdelete(ns_server_t *server, char *command, isc_buffer_t *text); * Enable or disable updates for a zone. */ isc_result_t -ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args); +ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args, + isc_buffer_t *text); /*% * Dump the current recursive queries. diff --git a/bin/named/lwresd.8 b/bin/named/lwresd.8 index c0862aa..56d272b 100644 --- a/bin/named/lwresd.8 +++ b/bin/named/lwresd.8 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwresd.8,v 1.29.14.1 2009/01/23 01:53:33 tbox Exp $ +.\" $Id: lwresd.8,v 1.29.14.2 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/named/lwresd.html b/bin/named/lwresd.html index 4c2b059..728acc8 100644 --- a/bin/named/lwresd.html +++ b/bin/named/lwresd.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/named/named.8 b/bin/named/named.8 index 3408403..2874272 100644 --- a/bin/named/named.8 +++ b/bin/named/named.8 @@ -1,7 +1,7 @@ -.\" Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001, 2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,18 +13,18 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: named.8,v 1.38 2008/11/07 01:11:19 tbox Exp $ +.\" $Id: named.8,v 1.38.14.2 2009/12/03 05:06:38 tbox Exp $ .\" .hy 0 .ad l .\" Title: named .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 -.\" Date: June 30, 2000 +.\" Date: May 21, 2009 .\" Manual: BIND9 .\" Source: BIND9 .\" -.TH "NAMED" "8" "June 30, 2000" "BIND9" "BIND9" +.TH "NAMED" "8" "May 21, 2009" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) @@ -224,6 +224,16 @@ The \fBnamed\fR configuration file is too complex to describe in detail here. A complete description is provided in the BIND 9 Administrator Reference Manual. +.PP +\fBnamed\fR +inherits the +\fBumask\fR +(file creation mode mask) from the parent process. If files created by +\fBnamed\fR, such as journal files, need to have custom permissions, the +\fBumask\fR +should be set explicitly in the script used to start the +\fBnamed\fR +process. .SH "FILES" .PP \fI/etc/named.conf\fR @@ -250,7 +260,7 @@ BIND 9 Administrator Reference Manual. .PP Internet Systems Consortium .SH "COPYRIGHT" -Copyright \(co 2004\-2008 Internet Systems Consortium, Inc. ("ISC") +Copyright \(co 2004\-2009 Internet Systems Consortium, Inc. ("ISC") .br Copyright \(co 2000, 2001, 2003 Internet Software Consortium. .br diff --git a/bin/named/named.conf.5 b/bin/named/named.conf.5 index 039c795..3206f5d 100644 --- a/bin/named/named.conf.5 +++ b/bin/named/named.conf.5 @@ -1,6 +1,6 @@ .\" Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -12,7 +12,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: named.conf.5,v 1.36 2008/09/25 04:45:04 tbox Exp $ +.\" $Id: named.conf.5,v 1.36.48.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/named/named.conf.html b/bin/named/named.conf.html index 7bbbd0a..190f0c1 100644 --- a/bin/named/named.conf.html +++ b/bin/named/named.conf.html @@ -1,7 +1,7 @@ - + diff --git a/bin/named/named.docbook b/bin/named/named.docbook index f47eae1..246c4f5 100644 --- a/bin/named/named.docbook +++ b/bin/named/named.docbook @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> - + - June 30, 2000 + May 21, 2009 @@ -42,6 +42,7 @@ 2006 2007 2008 + 2009 Internet Systems Consortium, Inc. ("ISC") @@ -374,6 +375,16 @@ in the BIND 9 Administrator Reference Manual. + + + named inherits the umask + (file creation mode mask) from the parent process. If files + created by named, such as journal files, + need to have custom permissions, the umask + should be set explicitly in the script used to start the + named process. + + diff --git a/bin/named/named.html b/bin/named/named.html index 23c9a7c..3522475 100644 --- a/bin/named/named.html +++ b/bin/named/named.html @@ -1,8 +1,8 @@ - + @@ -32,7 +32,7 @@

named [-4] [-6] [-c config-file] [-d debug-level] [-f] [-g] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-u user] [-v] [-V] [-x cache-file]

-

DESCRIPTION

+

DESCRIPTION

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -47,7 +47,7 @@

-

OPTIONS

+

OPTIONS

-4

@@ -220,7 +220,7 @@

-

SIGNALS

+

SIGNALS

In routine operation, signals should not be used to control the nameserver; rndc should be used @@ -241,16 +241,24 @@

-

CONFIGURATION

+

CONFIGURATION

The named configuration file is too complex to describe in detail here. A complete description is provided in the BIND 9 Administrator Reference Manual.

+

+ named inherits the umask + (file creation mode mask) from the parent process. If files + created by named, such as journal files, + need to have custom permissions, the umask + should be set explicitly in the script used to start the + named process. +

-

FILES

+

FILES

/etc/named.conf

@@ -263,7 +271,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 1033, RFC 1034, RFC 1035, @@ -276,7 +284,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/named/query.c b/bin/named/query.c index a56d2e6..cef6d7f 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.313.20.7.12.4 2009/12/31 22:53:03 each Exp $ */ +/* $Id: query.c,v 1.313.20.16 2009/12/30 08:34:29 jinmei Exp $ */ /*! \file */ @@ -2244,7 +2244,8 @@ query_addns(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version) { static inline isc_result_t query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname, - dns_trust_t trust, dns_name_t **anamep, dns_rdatatype_t type) + dns_rdataset_t *dname, dns_name_t **anamep, + dns_rdatatype_t type) { dns_rdataset_t *rdataset; dns_rdatalist_t *rdatalist; @@ -2280,7 +2281,7 @@ query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname, rdatalist->type = type; rdatalist->covers = 0; rdatalist->rdclass = client->message->rdclass; - rdatalist->ttl = 0; + rdatalist->ttl = dname->ttl; dns_name_toregion(tname, &r); rdata->data = r.base; @@ -2292,7 +2293,7 @@ query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname, ISC_LIST_APPEND(rdatalist->rdata, rdata, link); RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset) == ISC_R_SUCCESS); - rdataset->trust = trust; + rdataset->trust = dname->trust; query_addrrset(client, anamep, &rdataset, NULL, NULL, DNS_SECTION_ANSWER); @@ -2735,7 +2736,7 @@ query_addds(ns_client_t *client, dns_db_t *db, dns_dbnode_t *node, return; addnsec3: - if (dns_db_iscache(db)) + if (!dns_db_iszone(db)) goto cleanup; /* * Add the NSEC3 which proves the DS does not exist. @@ -3317,6 +3318,14 @@ do { \ line = __LINE__; \ } while (0) +#define RECURSE_ERROR(r) \ +do { \ + if ((r) == DNS_R_DUPLICATE || (r) == DNS_R_DROP) \ + QUERY_ERROR(r); \ + else \ + QUERY_ERROR(DNS_R_SERVFAIL); \ +} while (0) + /* * Extract a network address from the RDATA of an A or AAAA * record. @@ -3604,7 +3613,7 @@ query_findclosestnsec3(dns_name_t *qname, dns_db_t *db, dns_name_t *found) { unsigned char salt[256]; - size_t salt_length = sizeof(salt); + size_t salt_length; isc_uint16_t iterations; isc_result_t result; unsigned int dboptions; @@ -3999,14 +4008,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) if (result == ISC_R_SUCCESS) client->query.attributes |= NS_QUERYATTR_RECURSING; - else if (result == DNS_R_DUPLICATE || - result == DNS_R_DROP) { - /* Duplicate query. */ - QUERY_ERROR(result); - } else { - /* Unable to recurse. */ - QUERY_ERROR(DNS_R_SERVFAIL); - } + else + RECURSE_ERROR(result); goto cleanup; } else { /* Unable to give root server referral. */ @@ -4185,11 +4188,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) if (result == ISC_R_SUCCESS) client->query.attributes |= NS_QUERYATTR_RECURSING; - else if (result == DNS_R_DUPLICATE || - result == DNS_R_DROP) - QUERY_ERROR(result); else - QUERY_ERROR(DNS_R_SERVFAIL); + RECURSE_ERROR(result); } else { dns_fixedname_t fixed; @@ -4603,7 +4603,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) */ dns_name_init(tname, NULL); (void)query_addcnamelike(client, client->query.qname, fname, - trdataset->trust, &tname, + trdataset, &tname, dns_rdatatype_cname); if (tname != NULL) dns_message_puttempname(client->message, &tname); @@ -4729,7 +4729,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) client->query.attributes |= NS_QUERYATTR_RECURSING; else - QUERY_ERROR(DNS_R_SERVFAIL); } + RECURSE_ERROR(result); + } goto addauth; } /* @@ -5123,9 +5124,17 @@ ns_query_start(ns_client_t *client) { } /* - * Turn on minimal response for DNSKEY queries. + * Turn on minimal response for DNSKEY and DS queries. + */ + if (qtype == dns_rdatatype_dnskey || qtype == dns_rdatatype_ds) + client->query.attributes |= (NS_QUERYATTR_NOAUTHORITY | + NS_QUERYATTR_NOADDITIONAL); + + /* + * Turn on minimal responses for EDNS/UDP bufsize 512 queries. */ - if (qtype == dns_rdatatype_dnskey) + if (client->opt != NULL && client->udpsize <= 512U && + (client->attributes & NS_CLIENTATTR_TCP) == 0) client->query.attributes |= (NS_QUERYATTR_NOAUTHORITY | NS_QUERYATTR_NOADDITIONAL); diff --git a/bin/named/server.c b/bin/named/server.c index e685e18..b9259c7 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.520.12.7 2009/01/30 03:53:38 marka Exp $ */ +/* $Id: server.c,v 1.520.12.11 2009/12/24 00:17:47 each Exp $ */ /*! \file */ @@ -2826,7 +2826,7 @@ set_limit(const cfg_obj_t **maps, const char *configname, isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, result == ISC_R_SUCCESS ? ISC_LOG_DEBUG(3) : ISC_LOG_WARNING, - "set maximum %s to %" ISC_PRINT_QUADFORMAT "d: %s", + "set maximum %s to %" ISC_PRINT_QUADFORMAT "u: %s", description, value, isc_result_totext(result)); } @@ -4337,6 +4337,8 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) { /* Partial match? */ if (result != ISC_R_SUCCESS && *zonep != NULL) dns_zone_detach(zonep); + if (result == DNS_R_PARTIALMATCH) + result = ISC_R_NOTFOUND; fail1: return (result); } @@ -5401,7 +5403,9 @@ ns_server_tsiglist(ns_server_t *server, isc_buffer_t *text) { * Act on a "freeze" or "thaw" command from the command channel. */ isc_result_t -ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args) { +ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args, + isc_buffer_t *text) +{ isc_result_t result, tresult; dns_zone_t *zone = NULL; dns_zonetype_t type; @@ -5411,6 +5415,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args) { char *journal; const char *vname, *sep; isc_boolean_t frozen; + const char *msg = NULL; result = zone_from_args(server, args, &zone); if (result != ISC_R_SUCCESS) @@ -5441,27 +5446,52 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args) { return (ISC_R_NOTFOUND); } + result = isc_task_beginexclusive(server->task); + RUNTIME_CHECK(result == ISC_R_SUCCESS); frozen = dns_zone_getupdatedisabled(zone); if (freeze) { - if (frozen) + if (frozen) { + msg = "WARNING: The zone was already frozen.\n" + "Someone else may be editing it or " + "it may still be re-loading."; result = DNS_R_FROZEN; - if (result == ISC_R_SUCCESS) + } + if (result == ISC_R_SUCCESS) { result = dns_zone_flush(zone); + if (result != ISC_R_SUCCESS) + msg = "Flushing the zone updates to " + "disk failed."; + } if (result == ISC_R_SUCCESS) { journal = dns_zone_getjournal(zone); if (journal != NULL) (void)isc_file_remove(journal); } + if (result == ISC_R_SUCCESS) + dns_zone_setupdatedisabled(zone, freeze); } else { if (frozen) { - result = dns_zone_load(zone); - if (result == DNS_R_CONTINUE || - result == DNS_R_UPTODATE) + result = dns_zone_loadandthaw(zone); + switch (result) { + case ISC_R_SUCCESS: + case DNS_R_UPTODATE: + msg = "The zone reload and thaw was " + "successful."; result = ISC_R_SUCCESS; + break; + case DNS_R_CONTINUE: + msg = "A zone reload and thaw was started.\n" + "Check the logs to see the result."; + result = ISC_R_SUCCESS; + break; + } } } - if (result == ISC_R_SUCCESS) - dns_zone_setupdatedisabled(zone, freeze); + isc_task_endexclusive(server->task); + + if (msg != NULL && strlen(msg) < isc_buffer_availablelength(text)) + isc_buffer_putmem(text, (const unsigned char *)msg, + strlen(msg) + 1); view = dns_zone_getview(zone); if (strcmp(view->name, "_bind") == 0 || diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c index 81f40bb..4773ec6 100644 --- a/bin/named/statschannel.c +++ b/bin/named/statschannel.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: statschannel.c,v 1.14.64.6 2009/02/17 03:43:07 marka Exp $ */ +/* $Id: statschannel.c,v 1.14.64.11 2010/02/04 23:47:46 tbox Exp $ */ /*! \file */ @@ -70,6 +70,7 @@ stats_dumparg { int ncounters; /* used for general statistics */ int *counterindices; /* used for general statistics */ isc_uint64_t *countervalues; /* used for general statistics */ + isc_result_t result; } stats_dumparg_t; static isc_once_t once = ISC_ONCE_INIT; @@ -95,6 +96,8 @@ static const char *sockstats_xmldesc[isc_sockstatscounter_max]; #define sockstats_xmldesc NULL #endif /* HAVE_LIBXML2 */ +#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0) + /*% * Mapping arrays to represent statistics counters in the order of our * preference, regardless of the order of counter indices. For example, @@ -129,11 +132,11 @@ init_desc(void) { int i; /* Initialize name server statistics */ - memset((void *)nsstats_desc, 0, - dns_nsstatscounter_max * sizeof(nsstats_desc[0])); + for (i = 0; i < dns_nsstatscounter_max; i++) + nsstats_desc[i] = NULL; #ifdef HAVE_LIBXML2 - memset((void *)nsstats_xmldesc, 0, - dns_nsstatscounter_max * sizeof(nsstats_xmldesc[0])); + for (i = 0; i < dns_nsstatscounter_max; i++) + nsstats_xmldesc[i] = NULL; #endif #define SET_NSSTATDESC(counterid, desc, xmldesc) \ @@ -197,11 +200,11 @@ init_desc(void) { INSIST(i == dns_nsstatscounter_max); /* Initialize resolver statistics */ - memset((void *)resstats_desc, 0, - dns_resstatscounter_max * sizeof(resstats_desc[0])); + for (i = 0; i < dns_resstatscounter_max; i++) + resstats_desc[i] = NULL; #ifdef HAVE_LIBXML2 - memset((void *)resstats_xmldesc, 0, - dns_resstatscounter_max * sizeof(resstats_xmldesc[0])); + for (i = 0; i < dns_resstatscounter_max; i++) + resstats_xmldesc[i] = NULL; #endif #define SET_RESSTATDESC(counterid, desc, xmldesc) \ @@ -267,11 +270,11 @@ init_desc(void) { INSIST(i == dns_resstatscounter_max); /* Initialize zone statistics */ - memset((void *)zonestats_desc, 0, - dns_zonestatscounter_max * sizeof(zonestats_desc[0])); + for (i = 0; i < dns_zonestatscounter_max; i++) + zonestats_desc[i] = NULL; #ifdef HAVE_LIBXML2 - memset((void *)zonestats_xmldesc, 0, - dns_zonestatscounter_max * sizeof(zonestats_xmldesc[0])); + for (i = 0; i < dns_zonestatscounter_max; i++) + zonestats_xmldesc[i] = NULL; #endif #define SET_ZONESTATDESC(counterid, desc, xmldesc) \ @@ -299,11 +302,11 @@ init_desc(void) { INSIST(i == dns_zonestatscounter_max); /* Initialize socket statistics */ - memset((void *)sockstats_desc, 0, - isc_sockstatscounter_max * sizeof(sockstats_desc[0])); + for (i = 0; i < isc_sockstatscounter_max; i++) + sockstats_desc[i] = NULL; #ifdef HAVE_LIBXML2 - memset((void *)sockstats_xmldesc, 0, - isc_sockstatscounter_max * sizeof(sockstats_xmldesc[0])); + for (i = 0; i < isc_sockstatscounter_max; i++) + sockstats_xmldesc[i] = NULL; #endif #define SET_SOCKSTATDESC(counterid, desc, xmldesc) \ @@ -437,7 +440,7 @@ generalstat_dump(isc_statscounter_t counter, isc_uint64_t val, void *arg) { dumparg->countervalues[counter] = val; } -static void +static isc_result_t dump_counters(isc_stats_t *stats, statsformat_t type, void *arg, const char *category, const char **desc, int ncounters, int *indices, isc_uint64_t *values, int options) @@ -448,6 +451,7 @@ dump_counters(isc_stats_t *stats, statsformat_t type, void *arg, FILE *fp; #ifdef HAVE_LIBXML2 xmlTextWriterPtr writer; + int xmlrc; #endif #ifndef HAVE_LIBXML2 @@ -480,31 +484,41 @@ dump_counters(isc_stats_t *stats, statsformat_t type, void *arg, writer = arg; if (category != NULL) { - xmlTextWriterStartElement(writer, - ISC_XMLCHAR - category); - xmlTextWriterStartElement(writer, - ISC_XMLCHAR "name"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR - desc[index]); - xmlTextWriterEndElement(writer); /* name */ - - xmlTextWriterStartElement(writer, ISC_XMLCHAR - "counter"); + TRY0(xmlTextWriterStartElement(writer, + ISC_XMLCHAR + category)); + TRY0(xmlTextWriterStartElement(writer, + ISC_XMLCHAR + "name")); + TRY0(xmlTextWriterWriteString(writer, + ISC_XMLCHAR + desc[index])); + TRY0(xmlTextWriterEndElement(writer)); /* name */ + + TRY0(xmlTextWriterStartElement(writer, + ISC_XMLCHAR + "counter")); } else { - xmlTextWriterStartElement(writer, ISC_XMLCHAR - desc[index]); + TRY0(xmlTextWriterStartElement(writer, + ISC_XMLCHAR + desc[index])); } - xmlTextWriterWriteFormatString(writer, - "%" ISC_PRINT_QUADFORMAT - "u", value); - xmlTextWriterEndElement(writer); /* counter */ + TRY0(xmlTextWriterWriteFormatString(writer, + "%" + ISC_PRINT_QUADFORMAT + "u", value)); + TRY0(xmlTextWriterEndElement(writer)); /* counter */ if (category != NULL) - xmlTextWriterEndElement(writer); /* category */ + TRY0(xmlTextWriterEndElement(writer)); /* category */ #endif break; } } + return (ISC_R_SUCCESS); +#ifdef HAVE_LIBXML2 + error: + return (ISC_R_FAILURE); +#endif } static void @@ -515,6 +529,7 @@ rdtypestat_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { FILE *fp; #ifdef HAVE_LIBXML2 xmlTextWriterPtr writer; + int xmlrc; #endif if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) @@ -534,22 +549,28 @@ rdtypestat_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { #ifdef HAVE_LIBXML2 writer = dumparg->arg; - xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdtype"); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdtype")); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR typestr); - xmlTextWriterEndElement(writer); /* name */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR typestr)); + TRY0(xmlTextWriterEndElement(writer)); /* name */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); - xmlTextWriterWriteFormatString(writer, + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter")); + TRY0(xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", - val); - xmlTextWriterEndElement(writer); /* counter */ + val)); + TRY0(xmlTextWriterEndElement(writer)); /* counter */ - xmlTextWriterEndElement(writer); /* rdtype */ + TRY0(xmlTextWriterEndElement(writer)); /* rdtype */ #endif break; } + return; +#ifdef HAVE_LIBXML2 + error: + dumparg->result = ISC_R_FAILURE; + return; +#endif } static void @@ -561,6 +582,7 @@ rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { isc_boolean_t nxrrset = ISC_FALSE; #ifdef HAVE_LIBXML2 xmlTextWriterPtr writer; + int xmlrc; #endif if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) @@ -589,22 +611,28 @@ rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { #ifdef HAVE_LIBXML2 writer = dumparg->arg; - xmlTextWriterStartElement(writer, ISC_XMLCHAR "rrset"); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); - xmlTextWriterWriteFormatString(writer, "%s%s", - nxrrset ? "!" : "", typestr); - xmlTextWriterEndElement(writer); /* name */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rrset")); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name")); + TRY0(xmlTextWriterWriteFormatString(writer, "%s%s", + nxrrset ? "!" : "", typestr)); + TRY0(xmlTextWriterEndElement(writer)); /* name */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); - xmlTextWriterWriteFormatString(writer, + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter")); + TRY0(xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", - val); - xmlTextWriterEndElement(writer); /* counter */ + val)); + TRY0(xmlTextWriterEndElement(writer)); /* counter */ - xmlTextWriterEndElement(writer); /* rrset */ + TRY0(xmlTextWriterEndElement(writer)); /* rrset */ #endif break; } + return; +#ifdef HAVE_LIBXML2 + error: + dumparg->result = ISC_R_FAILURE; +#endif + } static void @@ -615,6 +643,7 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) { stats_dumparg_t *dumparg = arg; #ifdef HAVE_LIBXML2 xmlTextWriterPtr writer; + int xmlrc; #endif isc_buffer_init(&b, codebuf, sizeof(codebuf) - 1); @@ -630,30 +659,35 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) { #ifdef HAVE_LIBXML2 writer = dumparg->arg; - xmlTextWriterStartElement(writer, ISC_XMLCHAR "opcode"); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "opcode")); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR codebuf); - xmlTextWriterEndElement(writer); /* name */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR codebuf)); + TRY0(xmlTextWriterEndElement(writer)); /* name */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); - xmlTextWriterWriteFormatString(writer, + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter")); + TRY0(xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", - val); - xmlTextWriterEndElement(writer); /* counter */ + val)); + TRY0(xmlTextWriterEndElement(writer)); /* counter */ - xmlTextWriterEndElement(writer); /* opcode */ + TRY0(xmlTextWriterEndElement(writer)); /* opcode */ #endif break; } + return; + +#ifdef HAVE_LIBXML2 + error: + dumparg->result = ISC_R_FAILURE; + return; +#endif } #ifdef HAVE_LIBXML2 /* XXXMLG below here sucks. */ -#define TRY(a) do { result = (a); INSIST(result == ISC_R_SUCCESS); } while(0); -#define TRY0(a) do { xmlrc = (a); INSIST(xmlrc >= 0); } while(0); static isc_result_t zone_xmlrender(dns_zone_t *zone, void *arg) { @@ -663,47 +697,55 @@ zone_xmlrender(dns_zone_t *zone, void *arg) { xmlTextWriterPtr writer = arg; isc_stats_t *zonestats; isc_uint64_t nsstat_values[dns_nsstatscounter_max]; + int xmlrc; + isc_result_t result; - xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone"); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone")); dns_zone_name(zone, buf, sizeof(buf)); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR buf); - xmlTextWriterEndElement(writer); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR buf)); + TRY0(xmlTextWriterEndElement(writer)); rdclass = dns_zone_getclass(zone); dns_rdataclass_format(rdclass, buf, sizeof(buf)); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdataclass"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR buf); - xmlTextWriterEndElement(writer); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdataclass")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR buf)); + TRY0(xmlTextWriterEndElement(writer)); - serial = dns_zone_getserial(zone); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "serial"); - xmlTextWriterWriteFormatString(writer, "%u", serial); - xmlTextWriterEndElement(writer); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "serial")); + if (dns_zone_getserial2(zone, &serial) == ISC_R_SUCCESS) + TRY0(xmlTextWriterWriteFormatString(writer, "%u", serial)); + else + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR "-")); + TRY0(xmlTextWriterEndElement(writer)); zonestats = dns_zone_getrequeststats(zone); if (zonestats != NULL) { - xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"); - dump_counters(zonestats, statsformat_xml, writer, NULL, - nsstats_xmldesc, dns_nsstatscounter_max, - nsstats_index, nsstat_values, - ISC_STATSDUMP_VERBOSE); - xmlTextWriterEndElement(writer); /* counters */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters")); + result = dump_counters(zonestats, statsformat_xml, writer, NULL, + nsstats_xmldesc, dns_nsstatscounter_max, + nsstats_index, nsstat_values, + ISC_STATSDUMP_VERBOSE); + if (result != ISC_R_SUCCESS) + goto error; + TRY0(xmlTextWriterEndElement(writer)); /* counters */ } - xmlTextWriterEndElement(writer); /* zone */ + TRY0(xmlTextWriterEndElement(writer)); /* zone */ return (ISC_R_SUCCESS); + error: + return (ISC_R_FAILURE); } -static void +static isc_result_t generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { char boottime[sizeof "yyyy-mm-ddThh:mm:ssZ"]; char nowstr[sizeof "yyyy-mm-ddThh:mm:ssZ"]; isc_time_t now; - xmlTextWriterPtr writer; - xmlDocPtr doc; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; int xmlrc; dns_view_t *view; stats_dumparg_t dumparg; @@ -712,12 +754,15 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { isc_uint64_t resstat_values[dns_resstatscounter_max]; isc_uint64_t zonestat_values[dns_zonestatscounter_max]; isc_uint64_t sockstat_values[isc_sockstatscounter_max]; + isc_result_t result; isc_time_now(&now); isc_time_formatISO8601(&ns_g_boottime, boottime, sizeof boottime); isc_time_formatISO8601(&now, nowstr, sizeof nowstr); writer = xmlNewTextWriterDoc(&doc, 0); + if (writer == NULL) + goto error; TRY0(xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL)); TRY0(xmlTextWriterWritePI(writer, ISC_XMLCHAR "xml-stylesheet", ISC_XMLCHAR "type=\"text/xsl\" href=\"/bind9.xsl\"")); @@ -728,7 +773,7 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "bind")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "statistics")); TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "version", - ISC_XMLCHAR "2.0")); + ISC_XMLCHAR "2.2")); /* Set common fields for statistics dump */ dumparg.type = statsformat_xml; @@ -741,39 +786,55 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { view = ISC_LIST_HEAD(server->viewlist); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views")); while (view != NULL) { - xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "view")); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR view->name); - xmlTextWriterEndElement(writer); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR view->name)); + TRY0(xmlTextWriterEndElement(writer)); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones"); - dns_zt_apply(view->zonetable, ISC_FALSE, zone_xmlrender, - writer); - xmlTextWriterEndElement(writer); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones")); + result = dns_zt_apply(view->zonetable, ISC_TRUE, zone_xmlrender, + writer); + if (result != ISC_R_SUCCESS) + goto error; + TRY0(xmlTextWriterEndElement(writer)); if (view->resquerystats != NULL) { + dumparg.result = ISC_R_SUCCESS; dns_rdatatypestats_dump(view->resquerystats, rdtypestat_dump, &dumparg, 0); + if (dumparg.result != ISC_R_SUCCESS) + goto error; } if (view->resstats != NULL) { - dump_counters(view->resstats, statsformat_xml, writer, - "resstat", resstats_xmldesc, - dns_resstatscounter_max, resstats_index, - resstat_values, ISC_STATSDUMP_VERBOSE); + result = dump_counters(view->resstats, statsformat_xml, + writer, "resstat", + resstats_xmldesc, + dns_resstatscounter_max, + resstats_index, resstat_values, + ISC_STATSDUMP_VERBOSE); + if (result != ISC_R_SUCCESS) + goto error; } cachestats = dns_db_getrrsetstats(view->cachedb); if (cachestats != NULL) { - xmlTextWriterStartElement(writer, - ISC_XMLCHAR "cache"); + TRY0(xmlTextWriterStartElement(writer, + ISC_XMLCHAR "cache")); + TRY0(xmlTextWriterWriteAttribute(writer, + ISC_XMLCHAR "name", + ISC_XMLCHAR + view->name)); + dumparg.result = ISC_R_SUCCESS; dns_rdatasetstats_dump(cachestats, rdatasetstats_dump, &dumparg, 0); - xmlTextWriterEndElement(writer); /* cache */ + if (dumparg.result != ISC_R_SUCCESS) + goto error; + TRY0(xmlTextWriterEndElement(writer)); /* cache */ } - xmlTextWriterEndElement(writer); /* view */ + TRY0(xmlTextWriterEndElement(writer)); /* view */ view = ISC_LIST_NEXT(view, link); } @@ -788,44 +849,63 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { TRY0(xmlTextWriterEndElement(writer)); /* taskmgr */ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server")); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime); - xmlTextWriterEndElement(writer); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"); - xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr); - xmlTextWriterEndElement(writer); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime)); + TRY0(xmlTextWriterEndElement(writer)); + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time")); + TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr)); + TRY0(xmlTextWriterEndElement(writer)); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "requests")); + dumparg.result = ISC_R_SUCCESS; dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg, 0); - xmlTextWriterEndElement(writer); /* requests */ + if (dumparg.result != ISC_R_SUCCESS) + goto error; + TRY0(xmlTextWriterEndElement(writer)); /* requests */ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "queries-in")); + dumparg.result = ISC_R_SUCCESS; dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump, &dumparg, 0); - xmlTextWriterEndElement(writer); /* queries-in */ - - dump_counters(server->nsstats, statsformat_xml, writer, - "nsstat", nsstats_xmldesc, dns_nsstatscounter_max, - nsstats_index, nsstat_values, ISC_STATSDUMP_VERBOSE); + if (dumparg.result != ISC_R_SUCCESS) + goto error; + TRY0(xmlTextWriterEndElement(writer)); /* queries-in */ + + result = dump_counters(server->nsstats, statsformat_xml, writer, + "nsstat", nsstats_xmldesc, + dns_nsstatscounter_max, + nsstats_index, nsstat_values, + ISC_STATSDUMP_VERBOSE); + if (result != ISC_R_SUCCESS) + goto error; - dump_counters(server->zonestats, statsformat_xml, writer, "zonestat", - zonestats_xmldesc, dns_zonestatscounter_max, - zonestats_index, zonestat_values, ISC_STATSDUMP_VERBOSE); + result = dump_counters(server->zonestats, statsformat_xml, writer, + "zonestat", zonestats_xmldesc, + dns_zonestatscounter_max, zonestats_index, + zonestat_values, ISC_STATSDUMP_VERBOSE); + if (result != ISC_R_SUCCESS) + goto error; /* * Most of the common resolver statistics entries are 0, so we don't * use the verbose dump here. */ - dump_counters(server->resolverstats, statsformat_xml, writer, "resstat", - resstats_xmldesc, dns_resstatscounter_max, resstats_index, - resstat_values, 0); + result = dump_counters(server->resolverstats, statsformat_xml, writer, + "resstat", resstats_xmldesc, + dns_resstatscounter_max, resstats_index, + resstat_values, 0); + if (result != ISC_R_SUCCESS) + goto error; - dump_counters(server->sockstats, statsformat_xml, writer, "sockstat", - sockstats_xmldesc, isc_sockstatscounter_max, - sockstats_index, sockstat_values, ISC_STATSDUMP_VERBOSE); + result = dump_counters(server->sockstats, statsformat_xml, writer, + "sockstat", sockstats_xmldesc, + isc_sockstatscounter_max, sockstats_index, + sockstat_values, ISC_STATSDUMP_VERBOSE); + if (result != ISC_R_SUCCESS) + goto error; - xmlTextWriterEndElement(writer); /* server */ + TRY0(xmlTextWriterEndElement(writer)); /* server */ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory")); isc_mem_renderxml(writer); @@ -841,6 +921,14 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { xmlDocDumpFormatMemoryEnc(doc, buf, buflen, "UTF-8", 1); xmlFreeDoc(doc); + return (ISC_R_SUCCESS); + + error: + if (writer != NULL) + xmlFreeTextWriter(writer); + if (doc != NULL) + xmlFreeDoc(doc); + return (ISC_R_FAILURE); } static void @@ -859,21 +947,24 @@ render_index(const char *url, const char *querystring, void *arg, unsigned char *msg; int msglen; ns_server_t *server = arg; + isc_result_t result; UNUSED(url); UNUSED(querystring); - generatexml(server, &msglen, &msg); + result = generatexml(server, &msglen, &msg); - *retcode = 200; - *retmsg = "OK"; - *mimetype = "text/xml"; - isc_buffer_reinit(b, msg, msglen); - isc_buffer_add(b, msglen); - *freecb = wrap_xmlfree; - *freecb_args = NULL; + if (result == ISC_R_SUCCESS) { + *retcode = 200; + *retmsg = "OK"; + *mimetype = "text/xml"; + isc_buffer_reinit(b, msg, msglen); + isc_buffer_add(b, msglen); + *freecb = wrap_xmlfree; + *freecb_args = NULL; + } - return (ISC_R_SUCCESS); + return (result); } #endif /* HAVE_LIBXML2 */ @@ -1274,20 +1365,20 @@ ns_stats_dump(ns_server_t *server, FILE *fp) { } fprintf(fp, "++ Name Server Statistics ++\n"); - dump_counters(server->nsstats, statsformat_file, fp, NULL, - nsstats_desc, dns_nsstatscounter_max, nsstats_index, - nsstat_values, 0); + (void) dump_counters(server->nsstats, statsformat_file, fp, NULL, + nsstats_desc, dns_nsstatscounter_max, + nsstats_index, nsstat_values, 0); fprintf(fp, "++ Zone Maintenance Statistics ++\n"); - dump_counters(server->zonestats, statsformat_file, fp, NULL, - zonestats_desc, dns_zonestatscounter_max, - zonestats_index, zonestat_values, 0); + (void) dump_counters(server->zonestats, statsformat_file, fp, NULL, + zonestats_desc, dns_zonestatscounter_max, + zonestats_index, zonestat_values, 0); fprintf(fp, "++ Resolver Statistics ++\n"); fprintf(fp, "[Common]\n"); - dump_counters(server->resolverstats, statsformat_file, fp, NULL, - resstats_desc, dns_resstatscounter_max, resstats_index, - resstat_values, 0); + (void) dump_counters(server->resolverstats, statsformat_file, fp, NULL, + resstats_desc, dns_resstatscounter_max, + resstats_index, resstat_values, 0); for (view = ISC_LIST_HEAD(server->viewlist); view != NULL; view = ISC_LIST_NEXT(view, link)) { @@ -1297,9 +1388,9 @@ ns_stats_dump(ns_server_t *server, FILE *fp) { fprintf(fp, "[View: default]\n"); else fprintf(fp, "[View: %s]\n", view->name); - dump_counters(view->resstats, statsformat_file, fp, NULL, - resstats_desc, dns_resstatscounter_max, - resstats_index, resstat_values, 0); + (void) dump_counters(view->resstats, statsformat_file, fp, NULL, + resstats_desc, dns_resstatscounter_max, + resstats_index, resstat_values, 0); } fprintf(fp, "++ Cache DB RRsets ++\n"); @@ -1320,9 +1411,9 @@ ns_stats_dump(ns_server_t *server, FILE *fp) { } fprintf(fp, "++ Socket I/O Statistics ++\n"); - dump_counters(server->sockstats, statsformat_file, fp, NULL, - sockstats_desc, isc_sockstatscounter_max, sockstats_index, - sockstat_values, 0); + (void) dump_counters(server->sockstats, statsformat_file, fp, NULL, + sockstats_desc, isc_sockstatscounter_max, + sockstats_index, sockstat_values, 0); fprintf(fp, "++ Per Zone Query Statistics ++\n"); zone = NULL; @@ -1343,9 +1434,10 @@ ns_stats_dump(ns_server_t *server, FILE *fp) { fprintf(fp, " (view: %s)", view->name); fprintf(fp, "]\n"); - dump_counters(zonestats, statsformat_file, fp, NULL, - nsstats_desc, dns_nsstatscounter_max, - nsstats_index, nsstat_values, 0); + (void) dump_counters(zonestats, statsformat_file, fp, + NULL, nsstats_desc, + dns_nsstatscounter_max, + nsstats_index, nsstat_values, 0); } } diff --git a/bin/named/update.c b/bin/named/update.c index b0a556d..74a192a 100644 --- a/bin/named/update.c +++ b/bin/named/update.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: update.c,v 1.151.12.5.12.1 2009/07/28 14:18:08 marka Exp $ */ +/* $Id: update.c,v 1.151.12.9 2009/12/30 04:02:56 marka Exp $ */ #include @@ -3031,7 +3031,7 @@ check_dnssec(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, } else { CHECK(get_iterations(db, ver, &iterations)); CHECK(dns_nsec3_maxiterations(db, ver, client->mctx, &max)); - if (iterations > max) { + if (max != 0 && iterations > max) { flag = ISC_TRUE; update_log(client, zone, ISC_LOG_WARNING, "too many NSEC3 iterations (%u) for " @@ -3157,6 +3157,24 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, &newtuple)); CHECK(do_one_tuple(&newtuple, db, ver, diff)); } + + /* + * Remove any existing CREATE request to add an + * otherwise indentical chain with a reversed + * OPTOUT state. + */ + buf[1] ^= DNS_NSEC3FLAG_OPTOUT; + CHECK(rr_exists(db, ver, name, &rdata, &flag)); + + if (flag) { + CHECK(dns_difftuple_create(diff->mctx, + DNS_DIFFOP_DEL, + name, tuple->ttl, + &rdata, + &newtuple)); + CHECK(do_one_tuple(&newtuple, db, ver, diff)); + } + /* * Remove the temporary add record. */ @@ -4140,9 +4158,6 @@ update_action(isc_task_t *task, isc_event_t *event) { goto common; failure: - if (result == DNS_R_REFUSED) - inc_stats(zone, dns_nsstatscounter_updaterej); - /* * The reason for failure should have been logged at this point. */ diff --git a/bin/nsupdate/nsupdate.1 b/bin/nsupdate/nsupdate.1 index b0688a3..83fd7d7 100644 --- a/bin/nsupdate/nsupdate.1 +++ b/bin/nsupdate/nsupdate.1 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: nsupdate.1,v 1.3.48.2 2009/03/10 01:54:11 tbox Exp $ +.\" $Id: nsupdate.1,v 1.3.48.3 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/nsupdate/nsupdate.html b/bin/nsupdate/nsupdate.html index dab7f90..9f45171 100644 --- a/bin/nsupdate/nsupdate.html +++ b/bin/nsupdate/nsupdate.html @@ -2,7 +2,7 @@ - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/rndc/rndc-confgen.8 b/bin/rndc/rndc-confgen.8 index 440870a..d37c00a 100644 --- a/bin/rndc/rndc-confgen.8 +++ b/bin/rndc/rndc-confgen.8 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2001, 2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: rndc-confgen.8,v 1.20 2007/01/30 00:24:59 marka Exp $ +.\" $Id: rndc-confgen.8,v 1.20.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/rndc/rndc-confgen.html b/bin/rndc/rndc-confgen.html index 4be87af..41debdc 100644 --- a/bin/rndc/rndc-confgen.html +++ b/bin/rndc/rndc-confgen.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2001, 2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/rndc/rndc.8 b/bin/rndc/rndc.8 index 7f0dea1..8ab0df2 100644 --- a/bin/rndc/rndc.8 +++ b/bin/rndc/rndc.8 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: rndc.8,v 1.42 2007/12/14 22:37:22 marka Exp $ +.\" $Id: rndc.8,v 1.42.214.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/rndc/rndc.conf.5 b/bin/rndc/rndc.conf.5 index 9e9bad4..edb3a36 100644 --- a/bin/rndc/rndc.conf.5 +++ b/bin/rndc/rndc.conf.5 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: rndc.conf.5,v 1.38 2007/05/09 13:35:57 marka Exp $ +.\" $Id: rndc.conf.5,v 1.38.366.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/rndc/rndc.conf.html b/bin/rndc/rndc.conf.html index 144cd1c..6fbaaa2 100644 --- a/bin/rndc/rndc.conf.html +++ b/bin/rndc/rndc.conf.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/rndc/rndc.html b/bin/rndc/rndc.html index a8d11c4..52c862a 100644 --- a/bin/rndc/rndc.html +++ b/bin/rndc/rndc.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/config.h.in b/config.h.in index 97b13c4..28ace46 100644 --- a/config.h.in +++ b/config.h.in @@ -16,7 +16,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.h.in,v 1.106.40.6 2009/03/13 05:35:43 marka Exp $ */ +/* $Id: config.h.in,v 1.106.40.11 2010/01/15 19:38:52 each Exp $ */ /*! \file */ @@ -144,6 +144,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define if threads need PTHREAD_SCOPE_SYSTEM */ #undef NEED_PTHREAD_SCOPE_SYSTEM +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + /* Define if recvmsg() does not meet all of the BSD socket API specifications. */ #undef BROKEN_RECVMSG @@ -163,6 +166,12 @@ int sigwait(const unsigned int *set, int *sig); /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H +/* Define to 1 if you have the `EVP_sha256' function. */ +#undef HAVE_EVP_SHA256 + +/* Define to 1 if you have the `EVP_sha512' function. */ +#undef HAVE_EVP_SHA512 + /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H @@ -293,6 +302,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION @@ -314,11 +326,15 @@ int sigwait(const unsigned int *set, int *sig); #undef WITH_IDN /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ -#if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -#elif ! defined __LITTLE_ENDIAN__ -# undef WORDS_BIGENDIAN + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif #endif /* Define to empty if `const' does not conform to ANSI C. */ diff --git a/configure.in b/configure.in index 6ebdfdd..76e1eb3 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl esyscmd([sed "s/^/# /" COPYRIGHT])dnl AC_DIVERT_POP()dnl -AC_REVISION($Revision: 1.457.26.9 $) +AC_REVISION($Revision: 1.457.26.16 $) AC_INIT(lib/dns/name.c) AC_PREREQ(2.59) @@ -28,6 +28,18 @@ AC_CONFIG_HEADER(config.h) AC_CANONICAL_HOST AC_PROG_MAKE_SET + +# +# GNU libtool support +# +case $build_os in +sunos*) + # Just set the maximum command line length for sunos as it otherwise + # takes a exceptionally long time to work it out. Required for libtool. + lt_cv_sys_max_cmd_len=4096; + ;; +esac + AC_PROG_LIBTOOL AC_PROG_INSTALL AC_PROG_LN_S @@ -466,7 +478,7 @@ AC_C_BIGENDIAN OPENSSL_WARNING= AC_MSG_CHECKING(for OpenSSL library) AC_ARG_WITH(openssl, -[ --with-openssl[=PATH] Build with OpenSSL [yes|no|path]. +[ --with-openssl[=PATH] Build with OpenSSL [yes|no|path]. (Required for DNSSEC)], use_openssl="$withval", use_openssl="auto") @@ -491,7 +503,9 @@ case "$use_openssl" in auto) DST_OPENSSL_INC="" USE_OPENSSL="" - AC_MSG_RESULT(not found) + AC_MSG_ERROR( +[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path +If you don't want OpenSSL, use --without-openssl]) ;; *) if test "$use_openssl" = "yes" @@ -630,8 +644,10 @@ esac else AC_MSG_RESULT(no) fi + AC_CHECK_FUNCS(EVP_sha256 EVP_sha512) CFLAGS="$saved_cflags" LIBS="$saved_libs" + ;; esac @@ -652,7 +668,7 @@ DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS" AC_MSG_CHECKING(for PKCS11 support) AC_ARG_WITH(pkcs11, -[ --with-pkcs11 Build with PKCS11 support], +[ --with-pkcs11 Build with PKCS11 support], use_pkcs11="yes", use_pkcs11="no") case "$use_pkcs11" in @@ -670,7 +686,7 @@ AC_SUBST(USE_PKCS11) AC_MSG_CHECKING(for GSSAPI library) AC_ARG_WITH(gssapi, -[ --with-gssapi=PATH Specify path for system-supplied GSSAPI], +[ --with-gssapi=PATH Specify path for system-supplied GSSAPI], use_gssapi="$withval", use_gssapi="no") gssapidirs="/usr/local /usr/pkg /usr/kerberos /usr" @@ -824,7 +840,7 @@ AC_SUBST(DNS_CRYPTO_LIBS) # AC_MSG_CHECKING(for random device) AC_ARG_WITH(randomdev, -[ --with-randomdev=PATH Specify path for random device], +[ --with-randomdev=PATH Specify path for random device], use_randomdev="$withval", use_randomdev="unspec") case "$use_randomdev" in @@ -997,7 +1013,7 @@ AC_SUBST(ISC_THREAD_DIR) # AC_MSG_CHECKING(for libxml2 library) AC_ARG_WITH(libxml2, -[ --with-libxml2[=PATH] Build with libxml2 library [yes|no|path]], +[ --with-libxml2[=PATH] Build with libxml2 library [yes|no|path]], use_libxml2="$withval", use_libxml2="auto") case "$use_libxml2" in @@ -1191,7 +1207,7 @@ esac # AC_MSG_CHECKING(whether to use purify) AC_ARG_WITH(purify, - [ --with-purify[=PATH] use Rational purify], + [ --with-purify[=PATH] use Rational purify], use_purify="$withval", use_purify="no") case "$use_purify" in @@ -1228,19 +1244,9 @@ esac AC_SUBST(PURIFY) -# -# GNU libtool support -# -case $build_os in -sunos*) - # Just set the maximum command line length for sunos as it otherwise - # takes a exceptionally long time to work it out. Required for libtool. - lt_cv_sys_max_cmd_len=4096; - ;; -esac AC_ARG_WITH(libtool, - [ --with-libtool use GNU libtool (following indented options supported)], + [ --with-libtool use GNU libtool], use_libtool="$withval", use_libtool="no") case $use_libtool in @@ -1299,7 +1305,7 @@ AC_SUBST(LIBTOOL_IN_MAIN) # IPv6 # AC_ARG_ENABLE(ipv6, - [ --enable-ipv6 use IPv6 [default=autodetect]]) + [ --enable-ipv6 use IPv6 [default=autodetect]]) case "$enable_ipv6" in yes|''|autodetect) @@ -1330,7 +1336,7 @@ AC_TRY_COMPILE([ # AC_MSG_CHECKING(for Kame IPv6 support) AC_ARG_WITH(kame, - [ --with-kame[=PATH] use Kame IPv6 [default path /usr/local/v6]], + [ --with-kame[=PATH] use Kame IPv6 [default path /usr/local/v6]], use_kame="$withval", use_kame="no") case "$use_kame" in @@ -1780,7 +1786,7 @@ AC_SUBST(ISC_LWRES_GETADDRINFOPROTO) AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO) AC_ARG_ENABLE(getifaddrs, -[ --enable-getifaddrs Enable the use of getifaddrs() [[yes|no]].], +[ --enable-getifaddrs Enable the use of getifaddrs() [[yes|no]].], want_getifaddrs="$enableval", want_getifaddrs="yes") # @@ -1902,7 +1908,7 @@ AC_SUBST(ISC_EXTRA_SRCS) # Use our own SPNEGO implementation? # AC_ARG_ENABLE(isc-spnego, - [ --disable-isc-spnego use SPNEGO from GSSAPI library]) + [ --disable-isc-spnego use SPNEGO from GSSAPI library]) if test -n "$USE_GSSAPI" then @@ -1967,7 +1973,7 @@ AC_SUBST(LWRES_PLATFORM_QUADFORMAT) # Note it is very recommended to *not* disable chroot(), # this is only because chroot() was made obsolete by Posix. AC_ARG_ENABLE(chroot, - [ --disable-chroot disable chroot]) + [ --disable-chroot disable chroot]) case "$enable_chroot" in yes|'') AC_CHECK_FUNCS(chroot) @@ -1976,7 +1982,7 @@ case "$enable_chroot" in ;; esac AC_ARG_ENABLE(linux-caps, - [ --disable-linux-caps disable linux capabilities]) + [ --disable-linux-caps disable linux capabilities]) case "$enable_linux_caps" in yes|'') AC_CHECK_HEADERS(linux/capability.h sys/capability.h) @@ -2215,13 +2221,43 @@ AC_CHECK_FUNCS(nanosleep) # Machine architecture dependent features # AC_ARG_ENABLE(atomic, - [ --enable-atomic enable machine specific atomic operations - [[default=autodetect]]], + [ --enable-atomic enable machine specific atomic operations + [[default=autodetect]]], enable_atomic="$enableval", enable_atomic="autodetect") case "$enable_atomic" in yes|''|autodetect) - use_atomic=yes + case "$host" in + powerpc-ibm-aix*) + if test "X$GCC" = "Xyes"; then + AC_MSG_CHECKING([if asm("isc"); works]) + AC_TRY_COMPILE(,[ + main() { asm("ics"); exit(0); } + ], + [AC_MSG_RESULT(yes) + use_atomic=yes], + [ + saved_cflags="$CFLAGS" + CFLAGS="$CFLAGS -Wa,-many" + AC_TRY_RUN([ + main() { asm("ics"); exit(0); } + ], + [AC_MSG_RESULT([yes, required -Wa,-many]) + use_atomic=yes], + [AC_MSG_RESULT([no, use_atomic disabled]) + CFLAGS="$saved_cflags" + use_atomic=no], + [AC_MSG_RESULT([cross compile, assume yes]) + CFLAGS="$saved_cflags" + use_atomic=yes]) + ] + ) + fi + ;; + *) + use_atomic=yes + ;; + esac ;; no) use_atomic=no @@ -2248,8 +2284,16 @@ main() { [arch=x86_32]) ;; x86_64-*|amd64-*) - have_xaddq=yes - arch=x86_64 +AC_TRY_RUN([ +main() { + exit((sizeof(void *) == 8) ? 0 : 1); +} +], + [arch=x86_64 + have_xaddq=yes], + [arch=x86_32], + [arch=x86_64 + have_xaddq=yes]) ;; alpha*-*) arch=alpha @@ -2354,9 +2398,9 @@ else fi if test "$have_xaddq" = "yes"; then - ISC_PLATFORM_HAVEXADDQ="#define ISC_PLATFORM_HAVEXADDQ 1" + ISC_PLATFORM_HAVEXADDQ="#define ISC_PLATFORM_HAVEXADDQ 1" else - ISC_PLATFORM_HAVEXADDQ="#undef ISC_PLATFORM_HAVEXADDQ" + ISC_PLATFORM_HAVEXADDQ="#undef ISC_PLATFORM_HAVEXADDQ" fi AC_SUBST(ISC_PLATFORM_HAVEXADD) @@ -2376,14 +2420,14 @@ AC_SUBST(ISC_ARCH_DIR) # Activate "rrset-order fixed" or not? # AC_ARG_ENABLE(fixed-rrset, - [ --enable-fixed-rrset enable fixed rrset ordering - [[default=no]]], + [ --enable-fixed-rrset enable fixed rrset ordering + [[default=no]]], enable_fixed="$enableval", enable_fixed="no") case "$enable_fixed" in yes) AC_DEFINE(DNS_RDATASET_FIXED, 1, - [Define to enable "rrset-order fixed" syntax.]) + [Define to enable "rrset-order fixed" syntax.]) ;; no) ;; @@ -2503,7 +2547,7 @@ AC_SUBST($1) # AC_MSG_CHECKING(for Docbook-XSL path) AC_ARG_WITH(docbook-xsl, -[ --with-docbook-xsl=PATH Specify path for Docbook-XSL stylesheets], +[ --with-docbook-xsl=PATH Specify path for Docbook-XSL stylesheets], docbook_path="$withval", docbook_path="auto") case "$docbook_path" in auto) @@ -2571,7 +2615,7 @@ AC_SUBST(XSLT_DB2LATEX_ADMONITIONS) # IDN support # AC_ARG_WITH(idn, - [ --with-idn[=MPREFIX] enable IDN support using idnkit [default PREFIX]], + [ --with-idn[=MPREFIX] enable IDN support using idnkit [default PREFIX]], use_idn="$withval", use_idn="no") case "$use_idn" in yes) @@ -2591,7 +2635,7 @@ esac iconvinc= iconvlib= AC_ARG_WITH(libiconv, - [ --with-libiconv[=IPREFIX] GNU libiconv are in IPREFIX [default PREFIX]], + [ --with-libiconv[=IPREFIX] GNU libiconv are in IPREFIX [default PREFIX]], use_libiconv="$withval", use_libiconv="no") case "$use_libiconv" in yes) @@ -2610,7 +2654,7 @@ no) esac AC_ARG_WITH(iconv, - [ --with-iconv[=LIBSPEC] specify iconv library [default -liconv]], + [ --with-iconv[=LIBSPEC] specify iconv library [default -liconv]], iconvlib="$withval") case "$iconvlib" in no) @@ -2622,7 +2666,7 @@ yes) esac AC_ARG_WITH(idnlib, - [ --with-idnlib=ARG specify libidnkit], + [ --with-idnlib=ARG specify libidnkit], idnlib="$withval", idnlib="no") if test "$idnlib" = yes; then AC_MSG_ERROR([You must specify ARG for --with-idnlib.]) @@ -2678,7 +2722,7 @@ AC_SUBST_FILE(BIND9_MAKE_RULES) BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules . $srcdir/version -BIND9_VERSION="VERSION=${MAJORVER}.${MINORVER}.${PATCHVER}${RELEASETYPE}${RELEASEVER}" +BIND9_VERSION="VERSION=${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}" AC_SUBST(BIND9_VERSION) if test -z "$ac_configure_args"; then @@ -2964,6 +3008,12 @@ AC_CONFIG_FILES([ AC_OUTPUT +if test "X$USE_OPENSSL" = "X"; then +cat << \EOF +BIND is being built without OpenSSL. This means it will not have DNSSEC support. +EOF +fi + if test "X$OPENSSL_WARNING" != "X"; then cat << \EOF WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 0875e57..44e30b1 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> - + BIND 9 Administrator Reference Manual @@ -30,6 +30,7 @@ 2007 2008 2009 + 2010 Internet Systems Consortium, Inc. ("ISC") @@ -1679,6 +1680,11 @@ controls { each dynamic update, because that would be too slow when a large zone is updated frequently. Instead, the dump is delayed by up to 15 minutes, allowing additional updates to take place. + During the dump process, transient files will be created + with the extensions .jnw and + .jbk; under ordinary circumstances, these + will be removed when the dump is complete, and can be safely + ignored. @@ -2053,17 +2059,16 @@ nameserver 172.16.72.4 Automatic Generation - The following command will generate a 128-bit (16 byte) HMAC-MD5 + The following command will generate a 128-bit (16 byte) HMAC-SHA256 key as described above. Longer keys are better, but shorter keys - are easier to read. Note that the maximum key length is 512 bits; - keys longer than that will be digested with MD5 to produce a - 128-bit key. + are easier to read. Note that the maximum key length is the digest + length, here 256 bits. - dnssec-keygen -a hmac-md5 -b 128 -n HOST host1-host2. + dnssec-keygen -a hmac-sha256 -b 128 -n HOST host1-host2. - The key is in the file Khost1-host2.+157+00000.private. + The key is in the file Khost1-host2.+163+00000.private. Nothing directly uses this file, but the base-64 encoded string following "Key:" can be extracted from the file and used as a shared secret: @@ -2105,18 +2110,16 @@ nameserver 172.16.72.4 key host1-host2. { - algorithm hmac-md5; + algorithm hmac-sha256; secret "La/E5CjG9O+os1jq0a2jdA=="; }; - The algorithm, hmac-md5, is the only one supported by BIND. The secret is the one generated above. Since this is a secret, it - is recommended that either named.conf be non-world - readable, or the key directive be added to a non-world readable - file that is included by - named.conf. + is recommended that either named.conf be + non-world readable, or the key directive be added to a non-world + readable file that is included by named.conf. At this point, the key is recognized. This means that if the @@ -2445,14 +2448,17 @@ allow-update { key host1-host2. ;}; To enable named to respond appropriately to DNS requests from DNSSEC aware clients, dnssec-enable must be set to yes. + (This is the default setting.) To enable named to validate answers from - other servers both dnssec-enable and - dnssec-validation must be set and some - trusted-keys must be configured - into named.conf. + other servers, the dnssec-enable and + dnssec-validation options must both be + set to yes (the default setting in BIND 9.5 + and later), and at least one trust anchor must be configured + with a trusted-keys statement in + named.conf. @@ -2531,6 +2537,41 @@ options { the root key is not valid. + + When DNSSEC validation is enabled and properly configured, + the resolver will reject any answers from signed, secure zones + which fail to validate, and will return SERVFAIL to the client. + + + + Responses may fail to validate for any of several reasons, + including missing, expired, or invalid signatures, a key which + does not match the DS RRset in the parent zone, or an insecure + response from a zone which, according to its parent, should have + been secure. + + + + + When the validator receives a response from an unsigned zone + that has a signed parent, it must confirm with the parent + that the zone was intentionally left unsigned. It does + this by verifying, via signed and validated NSEC/NSEC3 records, + that the parent zone contains no DS records for the child. + + + If the validator can prove that the zone + is insecure, then the response is accepted. However, if it + cannot, then it must assume an insecure response to be a + forgery; it rejects the response and logs an error. + + + The logged error reads "insecurity proof failed" and + "got insecure response; parent indicates it should be secure". + (Prior to BIND 9.7, the logged error was "not insecure". + This referred to the zone, not the response.) + + @@ -2539,10 +2580,9 @@ options { BIND 9 fully supports all currently - defined forms of IPv6 - name to address and address to name lookups. It will also use - IPv6 addresses to make queries when running on an IPv6 capable - system. + defined forms of IPv6 name to address and address to name + lookups. It will also use IPv6 addresses to make queries when + running on an IPv6 capable system. @@ -4324,8 +4364,7 @@ category notify { null; }; Lame servers. These are misconfigurations in remote servers, discovered by BIND 9 when trying to - query - those servers during resolution. + query those servers during resolution. @@ -4785,7 +4824,7 @@ category notify { null; }; port ( ip_port | * ) ) ; use-queryport-pool yes_or_no; queryport-pool-ports number; - queryport-pool-interval number; + queryport-pool-updateinterval number; max-transfer-time-in number; max-transfer-time-out number; max-transfer-idle-in number; @@ -4826,7 +4865,7 @@ category notify { null; }; lame-ttl number; max-ncache-ttl number; max-cache-ttl number; - sig-validity-interval number ; + sig-validity-interval number number ; sig-signing-nodes number ; sig-signing-signatures number ; sig-signing-type number ; @@ -4909,11 +4948,12 @@ category notify { null; }; When performing dynamic update of secure zones, the - directory where the public and private key files should be - found, - if different than the current working directory. The - directory specified - must be an absolute path. + directory where the public and private DNSSEC key files + should be found, if different than the current working + directory. The directory specified must be an absolute + path. (Note that this option has no effect on the paths + for files containing non-DNSSEC keys such as the + rndc.key. @@ -5874,13 +5914,15 @@ options { If yes, then an IPv4-mapped IPv6 address will match any address match list entries that match the corresponding IPv4 address. - Enabling this option is sometimes useful on IPv6-enabled - Linux - systems, to work around a kernel quirk that causes IPv4 - TCP connections such as zone transfers to be accepted - on an IPv6 socket using mapped addresses, causing - address match lists designed for IPv4 to fail to match. - The use of this option for any other purpose is discouraged. + + + This option was introduced to work around a kernel quirk + in some operating systems that causes IPv4 TCP + connections, such as zone transfers, to be accepted on an + IPv6 socket using mapped addresses. This caused address + match lists designed for IPv4 to fail to match. However, + named now solves this problem + internally. The use of this option is discouraged. @@ -7919,7 +7961,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; The delay, in seconds, between sending sets of notify - messages for a zone. The default is zero. + messages for a zone. The default is five (5) seconds. @@ -8271,7 +8313,7 @@ XXX: end of RFC1918 addresses #defined out --> query-source-v6 address ( ip_addr | * ) port ( ip_port | * ) ; use-queryport-pool yes_or_no; queryport-pool-ports number; - queryport-pool-interval number; + queryport-pool-updateinterval number; }; @@ -8751,7 +8793,7 @@ view "external" { notify-source (ip4_addr | *) port ip_port ; notify-source-v6 (ip6_addr | *) port ip_port ; zone-statistics yes_or_no ; - sig-validity-interval number ; + sig-validity-interval number number ; sig-signing-nodes number ; sig-signing-signatures number ; sig-signing-type number ; @@ -11206,6 +11248,16 @@ zone zone_name class$TTL. + The <command>@</command> (at-sign) + + When used in the label (or name) field, the asperand or + at-sign (@) symbol represents the current origin. + At the start of the zone file, it is the + <zone_name> (followed by + trailing dot). + + + The <command>$ORIGIN</command> Directive Syntax: $ORIGIN @@ -11216,7 +11268,8 @@ zone zone_name class$ORIGIN - <zone-name>. + <zone_name>. + (followed by trailing dot). The current $ORIGIN is appended to the domain specified in the $ORIGIN argument if it is not absolute. diff --git a/doc/arm/Bv9ARM.ch01.html b/doc/arm/Bv9ARM.ch01.html index 320a867..ea561e6 100644 --- a/doc/arm/Bv9ARM.ch01.html +++ b/doc/arm/Bv9ARM.ch01.html @@ -1,8 +1,8 @@ - + @@ -45,17 +45,17 @@ @@ -71,7 +71,7 @@

-Scope of Document

+Scope of Document

The Berkeley Internet Name Domain (BIND) implements a @@ -87,7 +87,7 @@

-Organization of This Document

+Organization of This Document

In this document, Chapter 1 introduces the basic DNS and BIND concepts. Chapter 2 @@ -116,7 +116,7 @@

-Conventions Used in This Document

+Conventions Used in This Document

In this document, we use the following general typographic conventions: @@ -243,7 +243,7 @@

-The Domain Name System (DNS)

+The Domain Name System (DNS)

The purpose of this document is to explain the installation and upkeep of the BIND (Berkeley Internet @@ -253,7 +253,7 @@

-DNS Fundamentals

+DNS Fundamentals

The Domain Name System (DNS) is a hierarchical, distributed database. It stores information for mapping Internet host names to @@ -275,7 +275,7 @@

-Domains and Domain Names

+Domains and Domain Names

The data stored in the DNS is identified by domain names that are organized as a tree according to organizational or administrative boundaries. Each node of the tree, @@ -321,7 +321,7 @@

-Zones

+Zones

To properly operate a name server, it is important to understand the difference between a zone @@ -374,7 +374,7 @@

-Authoritative Name Servers

+Authoritative Name Servers

Each zone is served by at least one authoritative name server, @@ -391,7 +391,7 @@

-The Primary Master

+The Primary Master

The authoritative server where the master copy of the zone data is maintained is called the @@ -411,7 +411,7 @@

-Slave Servers

+Slave Servers

The other authoritative servers, the slave servers (also known as secondary servers) @@ -427,7 +427,7 @@

-Stealth Servers

+Stealth Servers

Usually all of the zone's authoritative servers are listed in NS records in the parent zone. These NS records constitute @@ -462,7 +462,7 @@

-Caching Name Servers

+Caching Name Servers

The resolver libraries provided by most operating systems are stub resolvers, meaning that they are not @@ -489,7 +489,7 @@

-Forwarding

+Forwarding

Even a caching name server does not necessarily perform the complete recursive lookup itself. Instead, it can @@ -516,7 +516,7 @@

-Name Servers in Multiple Roles

+Name Servers in Multiple Roles

The BIND name server can simultaneously act as diff --git a/doc/arm/Bv9ARM.ch02.html b/doc/arm/Bv9ARM.ch02.html index 831e7a1..b279c67 100644 --- a/doc/arm/Bv9ARM.ch02.html +++ b/doc/arm/Bv9ARM.ch02.html @@ -1,8 +1,8 @@ - + @@ -45,16 +45,16 @@

-Hardware requirements

+Hardware requirements

DNS hardware requirements have traditionally been quite modest. @@ -73,7 +73,7 @@

-CPU Requirements

+CPU Requirements

CPU requirements for BIND 9 range from i486-class machines @@ -84,7 +84,7 @@

-Memory Requirements

+Memory Requirements

The memory of the server has to be large enough to fit the cache and zones loaded off disk. The max-cache-size @@ -107,7 +107,7 @@

-Name Server Intensive Environment Issues

+Name Server Intensive Environment Issues

For name server intensive environments, there are two alternative configurations that may be used. The first is where clients and @@ -124,7 +124,7 @@

-Supported Operating Systems

+Supported Operating Systems

ISC BIND 9 compiles and runs on a large number diff --git a/doc/arm/Bv9ARM.ch03.html b/doc/arm/Bv9ARM.ch03.html index 9964823..59d7e73 100644 --- a/doc/arm/Bv9ARM.ch03.html +++ b/doc/arm/Bv9ARM.ch03.html @@ -1,8 +1,8 @@ - + @@ -47,14 +47,14 @@

Sample Configurations
-
A Caching-only Name Server
-
An Authoritative-only Name Server
+
A Caching-only Name Server
+
An Authoritative-only Name Server
-
Load Balancing
-
Name Server Operations
+
Load Balancing
+
Name Server Operations
-
Tools for Use With the Name Server Daemon
-
Signals
+
Tools for Use With the Name Server Daemon
+
Signals
@@ -68,7 +68,7 @@ Sample Configurations

-A Caching-only Name Server

+A Caching-only Name Server

The following sample configuration is appropriate for a caching-only name server for use by clients internal to a corporation. All @@ -95,7 +95,7 @@ zone "0.0.127.in-addr.arpa" {

-An Authoritative-only Name Server

+An Authoritative-only Name Server

This sample configuration is for an authoritative-only server that is the master server for "example.com" @@ -137,7 +137,7 @@ zone "eng.example.com" {

-Load Balancing

+Load Balancing

A primitive form of load balancing can be achieved in the DNS by using multiple records @@ -280,10 +280,10 @@ zone "eng.example.com" {

-Name Server Operations

+Name Server Operations

-Tools for Use With the Name Server Daemon

+Tools for Use With the Name Server Daemon

This section describes several indispensable diagnostic, administrative and monitoring tools available to the system @@ -749,7 +749,7 @@ controls {

-Signals

+Signals

Certain UNIX signals cause the name server to take specific actions, as described in the following table. These signals can diff --git a/doc/arm/Bv9ARM.ch04.html b/doc/arm/Bv9ARM.ch04.html index 123098e..2be5791 100644 --- a/doc/arm/Bv9ARM.ch04.html +++ b/doc/arm/Bv9ARM.ch04.html @@ -1,8 +1,8 @@ - + @@ -49,29 +49,29 @@

Dynamic Update
The journal file
Incremental Zone Transfers (IXFR)
-
Split DNS
-
Example split DNS setup
+
Split DNS
+
Example split DNS setup
TSIG
-
Generate Shared Keys for Each Pair of Hosts
-
Copying the Shared Secret to Both Machines
-
Informing the Servers of the Key's Existence
-
Instructing the Server to Use the Key
-
TSIG Key Based Access Control
-
Errors
+
Generate Shared Keys for Each Pair of Hosts
+
Copying the Shared Secret to Both Machines
+
Informing the Servers of the Key's Existence
+
Instructing the Server to Use the Key
+
TSIG Key Based Access Control
+
Errors
-
TKEY
-
SIG(0)
+
TKEY
+
SIG(0)
DNSSEC
-
Generating Keys
-
Signing the Zone
-
Configuring Servers
+
Generating Keys
+
Signing the Zone
+
Configuring Servers
-
IPv6 Support in BIND 9
+
IPv6 Support in BIND 9
-
Address Lookups Using AAAA Records
-
Address to Name Lookups Using Nibble Format
+
Address Lookups Using AAAA Records
+
Address to Name Lookups Using Nibble Format
@@ -149,6 +149,11 @@ each dynamic update, because that would be too slow when a large zone is updated frequently. Instead, the dump is delayed by up to 15 minutes, allowing additional updates to take place. + During the dump process, transient files will be created + with the extensions .jnw and + .jbk; under ordinary circumstances, these + will be removed when the dump is complete, and can be safely + ignored.

When a server is restarted after a shutdown or crash, it will replay @@ -210,7 +215,7 @@

-Split DNS

+Split DNS

Setting up different views, or visibility, of the DNS space to internal and external resolvers is usually referred to as a @@ -240,7 +245,7 @@

-Example split DNS setup

+Example split DNS setup

Let's say a company named Example, Inc. (example.com) @@ -486,7 +491,7 @@ nameserver 172.16.72.4

-Generate Shared Keys for Each Pair of Hosts

+Generate Shared Keys for Each Pair of Hosts

A shared secret is generated to be shared between host1 and host2. An arbitrary key name is chosen: "host1-host2.". The key name must @@ -494,19 +499,18 @@ nameserver 172.16.72.4

-Automatic Generation

+Automatic Generation

- The following command will generate a 128-bit (16 byte) HMAC-MD5 + The following command will generate a 128-bit (16 byte) HMAC-SHA256 key as described above. Longer keys are better, but shorter keys - are easier to read. Note that the maximum key length is 512 bits; - keys longer than that will be digested with MD5 to produce a - 128-bit key. + are easier to read. Note that the maximum key length is the digest + length, here 256 bits.

- dnssec-keygen -a hmac-md5 -b 128 -n HOST host1-host2. + dnssec-keygen -a hmac-sha256 -b 128 -n HOST host1-host2.

- The key is in the file Khost1-host2.+157+00000.private. + The key is in the file Khost1-host2.+163+00000.private. Nothing directly uses this file, but the base-64 encoded string following "Key:" can be extracted from the file and used as a shared secret: @@ -519,7 +523,7 @@ nameserver 172.16.72.4

-Manual Generation

+Manual Generation

The shared secret is simply a random sequence of bits, encoded in base-64. Most ASCII strings are valid base-64 strings (assuming @@ -534,7 +538,7 @@ nameserver 172.16.72.4

-Copying the Shared Secret to Both Machines

+Copying the Shared Secret to Both Machines

This is beyond the scope of DNS. A secure transport mechanism should be used. This could be secure FTP, ssh, telephone, etc. @@ -542,7 +546,7 @@ nameserver 172.16.72.4

-Informing the Servers of the Key's Existence

+Informing the Servers of the Key's Existence

Imagine host1 and host 2 are @@ -550,17 +554,15 @@ nameserver 172.16.72.4

 key host1-host2. {
-  algorithm hmac-md5;
+  algorithm hmac-sha256;
   secret "La/E5CjG9O+os1jq0a2jdA==";
 };
 

- The algorithm, hmac-md5, is the only one supported by BIND. The secret is the one generated above. Since this is a secret, it - is recommended that either named.conf be non-world - readable, or the key directive be added to a non-world readable - file that is included by - named.conf. + is recommended that either named.conf be + non-world readable, or the key directive be added to a non-world + readable file that is included by named.conf.

At this point, the key is recognized. This means that if the @@ -571,7 +573,7 @@ key host1-host2. {

-Instructing the Server to Use the Key

+Instructing the Server to Use the Key

Since keys are shared between two hosts only, the server must be told when keys are to be used. The following is added to the named.conf file @@ -603,7 +605,7 @@ server 10.1.2.3 {

-TSIG Key Based Access Control

+TSIG Key Based Access Control

BIND allows IP addresses and ranges to be specified in ACL @@ -631,7 +633,7 @@ allow-update { key host1-host2. ;};

-Errors

+Errors

The processing of TSIG signed messages can result in several errors. If a signed message is sent to a non-TSIG aware @@ -657,7 +659,7 @@ allow-update { key host1-host2. ;};

-TKEY

+TKEY

TKEY is a mechanism for automatically generating a shared secret between two hosts. There are several "modes" of @@ -693,7 +695,7 @@ allow-update { key host1-host2. ;};

-SIG(0)

+SIG(0)

BIND 9 partially supports DNSSEC SIG(0) transaction signatures as specified in RFC 2535 and RFC 2931. @@ -754,7 +756,7 @@ allow-update { key host1-host2. ;};

-Generating Keys

+Generating Keys

The dnssec-keygen program is used to generate keys. @@ -810,7 +812,7 @@ allow-update { key host1-host2. ;};

-Signing the Zone

+Signing the Zone

The dnssec-signzone program is used to sign a zone. @@ -852,18 +854,21 @@ allow-update { key host1-host2. ;};

-Configuring Servers

+Configuring Servers

To enable named to respond appropriately to DNS requests from DNSSEC aware clients, dnssec-enable must be set to yes. + (This is the default setting.)

To enable named to validate answers from - other servers both dnssec-enable and - dnssec-validation must be set and some - trusted-keys must be configured - into named.conf. + other servers, the dnssec-enable and + dnssec-validation options must both be + set to yes (the default setting in BIND 9.5 + and later), and at least one trust anchor must be configured + with a trusted-keys statement in + named.conf.

trusted-keys are copies of DNSKEY RRs @@ -936,17 +941,50 @@ options { None of the keys listed in this example are valid. In particular, the root key is not valid. +

+ When DNSSEC validation is enabled and properly configured, + the resolver will reject any answers from signed, secure zones + which fail to validate, and will return SERVFAIL to the client. +

+

+ Responses may fail to validate for any of several reasons, + including missing, expired, or invalid signatures, a key which + does not match the DS RRset in the parent zone, or an insecure + response from a zone which, according to its parent, should have + been secure. +

+
+

Note

+

+ When the validator receives a response from an unsigned zone + that has a signed parent, it must confirm with the parent + that the zone was intentionally left unsigned. It does + this by verifying, via signed and validated NSEC/NSEC3 records, + that the parent zone contains no DS records for the child. +

+

+ If the validator can prove that the zone + is insecure, then the response is accepted. However, if it + cannot, then it must assume an insecure response to be a + forgery; it rejects the response and logs an error. +

+

+ The logged error reads "insecurity proof failed" and + "got insecure response; parent indicates it should be secure". + (Prior to BIND 9.7, the logged error was "not insecure". + This referred to the zone, not the response.) +

+

-IPv6 Support in BIND 9

+IPv6 Support in BIND 9

BIND 9 fully supports all currently - defined forms of IPv6 - name to address and address to name lookups. It will also use - IPv6 addresses to make queries when running on an IPv6 capable - system. + defined forms of IPv6 name to address and address to name + lookups. It will also use IPv6 addresses to make queries when + running on an IPv6 capable system.

For forward lookups, BIND 9 supports @@ -979,7 +1017,7 @@ options {

-Address Lookups Using AAAA Records

+Address Lookups Using AAAA Records

The IPv6 AAAA record is a parallel to the IPv4 A record, and, unlike the deprecated A6 record, specifies the entire @@ -998,7 +1036,7 @@ host 3600 IN AAAA 2001:db8::1

-Address to Name Lookups Using Nibble Format

+Address to Name Lookups Using Nibble Format

When looking up an address in nibble format, the address components are simply reversed, just as in IPv4, and diff --git a/doc/arm/Bv9ARM.ch05.html b/doc/arm/Bv9ARM.ch05.html index addc97a..e84781f 100644 --- a/doc/arm/Bv9ARM.ch05.html +++ b/doc/arm/Bv9ARM.ch05.html @@ -1,8 +1,8 @@ - + @@ -45,13 +45,13 @@

-The Lightweight Resolver Library

+The Lightweight Resolver Library

Traditionally applications have been linked with a stub resolver library that sends recursive DNS queries to a local caching name diff --git a/doc/arm/Bv9ARM.ch06.html b/doc/arm/Bv9ARM.ch06.html index 46fd0dd..9da3432 100644 --- a/doc/arm/Bv9ARM.ch06.html +++ b/doc/arm/Bv9ARM.ch06.html @@ -1,8 +1,8 @@ - + @@ -48,55 +48,55 @@

Configuration File Elements
Address Match Lists
-
Comment Syntax
+
Comment Syntax
Configuration File Grammar
-
acl Statement Grammar
+
acl Statement Grammar
acl Statement Definition and Usage
-
controls Statement Grammar
+
controls Statement Grammar
controls Statement Definition and Usage
-
include Statement Grammar
-
include Statement Definition and +
include Statement Grammar
+
include Statement Definition and Usage
-
key Statement Grammar
-
key Statement Definition and Usage
-
logging Statement Grammar
-
logging Statement Definition and +
key Statement Grammar
+
key Statement Definition and Usage
+
logging Statement Grammar
+
logging Statement Definition and Usage
-
lwres Statement Grammar
-
lwres Statement Definition and Usage
-
masters Statement Grammar
-
masters Statement Definition and +
lwres Statement Grammar
+
lwres Statement Definition and Usage
+
masters Statement Grammar
+
masters Statement Definition and Usage
-
options Statement Grammar
+
options Statement Grammar
options Statement Definition and Usage
server Statement Grammar
server Statement Definition and Usage
statistics-channels Statement Grammar
-
statistics-channels Statement Definition and +
statistics-channels Statement Definition and Usage
-
trusted-keys Statement Grammar
-
trusted-keys Statement Definition +
trusted-keys Statement Grammar
+
trusted-keys Statement Definition and Usage
view Statement Grammar
-
view Statement Definition and Usage
+
view Statement Definition and Usage
zone Statement Grammar
-
zone Statement Definition and Usage
+
zone Statement Definition and Usage
-
Zone File
+
Zone File
Types of Resource Records and When to Use Them
-
Discussion of MX Records
+
Discussion of MX Records
Setting TTLs
-
Inverse Mapping in IPv4
-
Other Zone File Directives
-
BIND Master File Extension: the $GENERATE Directive
+
Inverse Mapping in IPv4
+
Other Zone File Directives
+
BIND Master File Extension: the $GENERATE Directive
Additional File Formats
BIND9 Statistics
@@ -461,7 +461,7 @@ Address Match Lists

-Syntax

+Syntax
address_match_list = address_match_list_element ;
   [ address_match_list_element; ... ]
 address_match_list_element = [ ! ] (ip_address [/length] |
@@ -470,7 +470,7 @@
 
 

-Definition and Usage

+Definition and Usage

Address match lists are primarily used to determine access control for various server operations. They are also used in @@ -554,7 +554,7 @@

-Comment Syntax

+Comment Syntax

The BIND 9 comment syntax allows for comments to appear @@ -564,7 +564,7 @@

-Syntax

+Syntax

/* This is a BIND comment as in C */
@@ -579,7 +579,7 @@

-Definition and Usage

+Definition and Usage

Comments may appear anywhere that whitespace may appear in a BIND configuration file. @@ -820,7 +820,7 @@

-acl Statement Grammar

+acl Statement Grammar
acl acl-name {
     address_match_list
 };
@@ -902,7 +902,7 @@
 
 

-controls Statement Grammar

+controls Statement Grammar
controls {
    [ inet ( ip_addr | * ) [ port ip_port ] allow {  address_match_list  }
                 keys { key_list }; ]
@@ -1024,12 +1024,12 @@
 
 

-include Statement Grammar

+include Statement Grammar
include filename;

-include Statement Definition and +include Statement Definition and Usage

The include statement inserts the @@ -1044,7 +1044,7 @@

-key Statement Grammar

+key Statement Grammar
key key_id {
     algorithm string;
     secret string;
@@ -1053,7 +1053,7 @@
 
 

-key Statement Definition and Usage

+key Statement Definition and Usage

The key statement defines a shared secret key for use with TSIG (see the section called “TSIG”) @@ -1100,7 +1100,7 @@

-logging Statement Grammar

+logging Statement Grammar
logging {
    [ channel channel_name {
      ( file path_name
@@ -1124,7 +1124,7 @@
 
 

-logging Statement Definition and +logging Statement Definition and Usage

The logging statement configures a @@ -1158,7 +1158,7 @@

-The channel Phrase

+The channel Phrase

All log output goes to one or more channels; you can make as many of them as you want. @@ -1666,8 +1666,7 @@ category notify { null; };

Lame servers. These are misconfigurations in remote servers, discovered by BIND 9 when trying to - query - those servers during resolution. + query those servers during resolution.

@@ -1724,7 +1723,7 @@ category notify { null; };

-The query-errors Category

+The query-errors Category

The query-errors category is specifically intended for debugging purposes: To identify @@ -1944,7 +1943,7 @@ category notify { null; };

-lwres Statement Grammar

+lwres Statement Grammar

This is the grammar of the lwres statement in the named.conf file: @@ -1959,7 +1958,7 @@ category notify { null; };

-lwres Statement Definition and Usage

+lwres Statement Definition and Usage

The lwres statement configures the name @@ -2010,14 +2009,14 @@ category notify { null; };

-masters Statement Grammar

+masters Statement Grammar
 masters name [port ip_port] { ( masters_list | ip_addr [port ip_port] [key key] ) ; [...] };
 

-masters Statement Definition and +masters Statement Definition and Usage

masters lists allow for a common set of masters to be easily used by @@ -2026,7 +2025,7 @@ category notify { null; };

-options Statement Grammar

+options Statement Grammar

This is the grammar of the options statement in the named.conf file: @@ -2115,7 +2114,7 @@ category notify { null; }; [ port ( ip_port | * ) ] ) ; ] [ use-queryport-pool yes_or_no; ] [ queryport-pool-ports number; ] - [ queryport-pool-interval number; ] + [ queryport-pool-updateinterval number; ] [ max-transfer-time-in number; ] [ max-transfer-time-out number; ] [ max-transfer-idle-in number; ] @@ -2156,7 +2155,7 @@ category notify { null; }; [ lame-ttl number; ] [ max-ncache-ttl number; ] [ max-cache-ttl number; ] - [ sig-validity-interval number ; ] + [ sig-validity-interval number [number] ; ] [ sig-signing-nodes number ; ] [ sig-signing-signatures number ; ] [ sig-signing-type number ; ] @@ -2228,11 +2227,12 @@ category notify { null; };

key-directory

When performing dynamic update of secure zones, the - directory where the public and private key files should be - found, - if different than the current working directory. The - directory specified - must be an absolute path. + directory where the public and private DNSSEC key files + should be found, if different than the current working + directory. The directory specified must be an absolute + path. (Note that this option has no effect on the paths + for files containing non-DNSSEC keys such as the + rndc.key.

named-xfer

@@ -2990,18 +2990,22 @@ options {

match-mapped-addresses
-

+

+

If yes, then an IPv4-mapped IPv6 address will match any address match list entries that match the corresponding IPv4 address. - Enabling this option is sometimes useful on IPv6-enabled - Linux - systems, to work around a kernel quirk that causes IPv4 - TCP connections such as zone transfers to be accepted - on an IPv6 socket using mapped addresses, causing - address match lists designed for IPv4 to fail to match. - The use of this option for any other purpose is discouraged. -

+

+

+ This option was introduced to work around a kernel quirk + in some operating systems that causes IPv4 TCP + connections, such as zone transfers, to be accepted on an + IPv6 socket using mapped addresses. This caused address + match lists designed for IPv4 to fail to match. However, + named now solves this problem + internally. The use of this option is discouraged. +

+
ixfr-from-differences

@@ -3181,7 +3185,7 @@ options {

-Forwarding

+Forwarding

The forwarding facility can be used to create a large site-wide cache on a few servers, reducing traffic over links to external @@ -3225,7 +3229,7 @@ options {

-Dual-stack Servers

+Dual-stack Servers

Dual-stack servers are used as servers of last resort to work around @@ -3422,7 +3426,7 @@ options {

-Interfaces

+Interfaces

The interfaces and ports that the server will answer queries from may be specified using the listen-on option. listen-on takes @@ -3874,7 +3878,7 @@ avoid-v6-udp-ports {};

-UDP Port Lists

+UDP Port Lists

use-v4-udp-ports, avoid-v4-udp-ports, @@ -3916,7 +3920,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-Operating System Resource Limits

+Operating System Resource Limits

The server's usage of many system resources can be limited. Scaled values are allowed when specifying resource limits. For @@ -4078,7 +4082,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-Periodic Task Intervals

+Periodic Task Intervals
cleaning-interval

@@ -4602,7 +4606,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

notify-delay

The delay, in seconds, between sending sets of notify - messages for a zone. The default is zero. + messages for a zone. The default is five (5) seconds.

@@ -4872,7 +4876,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; [ query-source-v6 [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; ] [ use-queryport-pool yes_or_no; ] [ queryport-pool-ports number; ] - [ queryport-pool-interval number; ] + [ queryport-pool-updateinterval number; ] };
@@ -5056,7 +5060,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-statistics-channels Statement Definition and +statistics-channels Statement Definition and Usage

The statistics-channels statement @@ -5107,7 +5111,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-trusted-keys Statement Grammar

+trusted-keys Statement Grammar
trusted-keys {
     string number number number string ;
     [ string number number number string ; [...]]
@@ -5116,7 +5120,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
 
 

-trusted-keys Statement Definition +trusted-keys Statement Definition and Usage

The trusted-keys statement defines @@ -5162,7 +5166,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-view Statement Definition and Usage

+view Statement Definition and Usage

The view statement is a powerful feature @@ -5315,7 +5319,7 @@ view "external" { [ notify-source (ip4_addr | *) [port ip_port] ; ] [ notify-source-v6 (ip6_addr | *) [port ip_port] ; ] [ zone-statistics yes_or_no ; ] - [ sig-validity-interval number ; ] + [ sig-validity-interval number [number] ; ] [ sig-signing-nodes number ; ] [ sig-signing-signatures number ; ] [ sig-signing-type number ; ] @@ -5428,10 +5432,10 @@ zone zone_name [

-zone Statement Definition and Usage

+zone Statement Definition and Usage

-Zone Types

+Zone Types
@@ -5642,7 +5646,7 @@ zone zone_name [

-Class

+Class

The zone's name may optionally be followed by a class. If a class is not specified, class IN (for Internet), @@ -5664,7 +5668,7 @@ zone zone_name [

-Zone Options

+Zone Options
allow-notify

@@ -6243,7 +6247,7 @@ zone zone_name [

-Zone File

+Zone File

Types of Resource Records and When to Use Them

@@ -6256,7 +6260,7 @@ zone zone_name [

-Resource Records

+Resource Records

A domain name identifies a node. Each node has a set of resource information, which may be empty. The set of resource @@ -6993,7 +6997,7 @@ zone zone_name [

-Textual expression of RRs

+Textual expression of RRs

RRs are represented in binary form in the packets of the DNS protocol, and are usually represented in highly encoded form @@ -7196,7 +7200,7 @@ zone zone_name [

-Discussion of MX Records

+Discussion of MX Records

As described above, domain servers store information as a series of resource records, each of which contains a particular @@ -7452,7 +7456,7 @@ zone zone_name [

-Inverse Mapping in IPv4

+Inverse Mapping in IPv4

Reverse name resolution (that is, translation from IP address to name) is achieved by means of the in-addr.arpa domain @@ -7513,7 +7517,7 @@ zone zone_name [

-Other Zone File Directives

+Other Zone File Directives

The Master File Format was initially defined in RFC 1035 and has subsequently been extended. While the Master File Format @@ -7528,7 +7532,18 @@ zone zone_name [

-The $ORIGIN Directive

+The @ (at-sign)
+

+ When used in the label (or name) field, the asperand or + at-sign (@) symbol represents the current origin. + At the start of the zone file, it is the + <zone_name> (followed by + trailing dot). +

+ +
+

+The $ORIGIN Directive

Syntax: $ORIGIN domain-name @@ -7538,7 +7553,8 @@ zone zone_name [$ORIGIN - <zone-name>. + <zone_name>. + (followed by trailing dot). The current $ORIGIN is appended to the domain specified in the $ORIGIN argument if it is not absolute. @@ -7556,7 +7572,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-The $INCLUDE Directive

+The $INCLUDE Directive

Syntax: $INCLUDE filename @@ -7592,7 +7608,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-The $TTL Directive

+The $TTL Directive

Syntax: $TTL default-ttl @@ -7611,7 +7627,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-BIND Master File Extension: the $GENERATE Directive

+BIND Master File Extension: the $GENERATE Directive

Syntax: $GENERATE range @@ -8002,7 +8018,7 @@ $GENERATE 1-127 $ CNAME $.0

-Name Server Statistics Counters

+Name Server Statistics Counters
@@ -8559,7 +8575,7 @@ $GENERATE 1-127 $ CNAME $.0

-Zone Maintenance Statistics Counters

+Zone Maintenance Statistics Counters
@@ -8713,7 +8729,7 @@ $GENERATE 1-127 $ CNAME $.0

-Resolver Statistics Counters

+Resolver Statistics Counters
@@ -9089,7 +9105,7 @@ $GENERATE 1-127 $ CNAME $.0

-Socket I/O Statistics Counters

+Socket I/O Statistics Counters

Socket I/O statistics counters are defined per socket types, which are @@ -9244,7 +9260,7 @@ $GENERATE 1-127 $ CNAME $.0

-Compatibility with BIND 8 Counters

+Compatibility with BIND 8 Counters

Most statistics counters that were available in BIND 8 are also supported in diff --git a/doc/arm/Bv9ARM.ch07.html b/doc/arm/Bv9ARM.ch07.html index ca12cb3..dd6991c 100644 --- a/doc/arm/Bv9ARM.ch07.html +++ b/doc/arm/Bv9ARM.ch07.html @@ -1,8 +1,8 @@ - + @@ -46,10 +46,10 @@

Table of Contents

Access Control Lists
-
Chroot and Setuid
+
Chroot and Setuid
-
The chroot Environment
-
Using the setuid Function
+
The chroot Environment
+
Using the setuid Function
Dynamic Update Security
@@ -119,7 +119,7 @@ zone "example.com" {

-Chroot and Setuid +Chroot and Setuid

On UNIX servers, it is possible to run BIND @@ -145,7 +145,7 @@ zone "example.com" {

-The chroot Environment

+The chroot Environment

In order for a chroot environment to @@ -173,7 +173,7 @@ zone "example.com" {

-Using the setuid Function

+Using the setuid Function

Prior to running the named daemon, use diff --git a/doc/arm/Bv9ARM.ch08.html b/doc/arm/Bv9ARM.ch08.html index 5e547eb..8b5ebbe 100644 --- a/doc/arm/Bv9ARM.ch08.html +++ b/doc/arm/Bv9ARM.ch08.html @@ -1,8 +1,8 @@ - + @@ -45,18 +45,18 @@

-Common Problems

+Common Problems

-It's not working; how can I figure out what's wrong?

+It's not working; how can I figure out what's wrong?

The best solution to solving installation and configuration issues is to take preventative measures by setting @@ -68,7 +68,7 @@

-Incrementing and Changing the Serial Number

+Incrementing and Changing the Serial Number

Zone serial numbers are just numbers — they aren't date related. A lot of people set them to a number that @@ -95,7 +95,7 @@

-Where Can I Get Help?

+Where Can I Get Help?

The Internet Systems Consortium (ISC) offers a wide range diff --git a/doc/arm/Bv9ARM.ch09.html b/doc/arm/Bv9ARM.ch09.html index 87134e0..72ab6fe 100644 --- a/doc/arm/Bv9ARM.ch09.html +++ b/doc/arm/Bv9ARM.ch09.html @@ -1,8 +1,8 @@ - + @@ -45,21 +45,21 @@

-Acknowledgments

+Acknowledgments

A Brief History of the DNS and BIND @@ -162,7 +162,7 @@

-General DNS Reference Information

+General DNS Reference Information

IPv6 addresses (AAAA)

@@ -250,17 +250,17 @@

-Bibliography

+Bibliography

Standards

-

[RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

+

[RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

-

[RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

+

[RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

-

[RFC1035] P. V. Mockapetris. Domain Names — Implementation and +

[RFC1035] P. V. Mockapetris. Domain Names — Implementation and Specification. November 1987.

@@ -268,42 +268,42 @@

Proposed Standards

-

[RFC2181] R., R. Bush Elz. Clarifications to the DNS +

[RFC2181] R., R. Bush Elz. Clarifications to the DNS Specification. July 1997.

-

[RFC2308] M. Andrews. Negative Caching of DNS +

[RFC2308] M. Andrews. Negative Caching of DNS Queries. March 1998.

-

[RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

+

[RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

-

[RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

+

[RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

-

[RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

+

[RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

-

[RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

+

[RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

-

[RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

+

[RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

-

[RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

+

[RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

-

[RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

+

[RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

-

[RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

+

[RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

-

[RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

+

[RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

-

[RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret +

[RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret Key Transaction Authentication for DNS (GSS-TSIG). October 2003.

@@ -312,19 +312,19 @@

DNS Security Proposed Standards

-

[RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

+

[RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

-

[RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

+

[RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

-

[RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

+

[RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

-

[RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

+

[RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

-

[RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS +

[RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS Security Extensions. March 2005.

@@ -332,146 +332,146 @@

Other Important RFCs About DNS Implementation

-

[RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely +

[RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely Deployed DNS Software.. October 1993.

-

[RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation +

[RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation Errors and Suggested Fixes. October 1993.

-

[RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

+

[RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

-

[RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS +

[RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS Queries for IPv6 Addresses. May 2005.

Resource Record Types

-

[RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

+

[RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

-

[RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

+

[RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

-

[RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using +

[RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using the Domain Name System. June 1997.

-

[RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the +

[RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the Domain Name System. January 1996.

-

[RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the +

[RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the Location of Services.. October 1996.

-

[RFC2163] A. Allocchio. Using the Internet DNS to +

[RFC2163] A. Allocchio. Using the Internet DNS to Distribute MIXER Conformant Global Address Mapping. January 1998.

-

[RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

+

[RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

-

[RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

+

[RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

-

[RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

+

[RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

-

[RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

+

[RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

-

[RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

+

[RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

-

[RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

+

[RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

-

[RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

+

[RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

-

[RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

+

[RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

-

[RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

+

[RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

-

[RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

+

[RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

-

[RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP +

[RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP version 6. October 2003.

-

[RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

+

[RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

DNS and the Internet

-

[RFC1101] P. V. Mockapetris. DNS Encoding of Network Names +

[RFC1101] P. V. Mockapetris. DNS Encoding of Network Names and Other Types. April 1989.

-

[RFC1123] Braden. Requirements for Internet Hosts - Application and +

[RFC1123] Braden. Requirements for Internet Hosts - Application and Support. October 1989.

-

[RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

+

[RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

-

[RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

+

[RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

-

[RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

+

[RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

-

[RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

+

[RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

DNS Operations

-

[RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

+

[RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

-

[RFC1537] P. Beertema. Common DNS Data File +

[RFC1537] P. Beertema. Common DNS Data File Configuration Errors. October 1993.

-

[RFC1912] D. Barr. Common DNS Operational and +

[RFC1912] D. Barr. Common DNS Operational and Configuration Errors. February 1996.

-

[RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

+

[RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

-

[RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for +

[RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for Network Services.. October 1997.

Internationalized Domain Names

-

[RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, +

[RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, and the Other Internet protocols. May 2000.

-

[RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

+

[RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

-

[RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

+

[RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

-

[RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode +

[RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA). March 2003.

@@ -487,47 +487,47 @@

-

[RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String +

[RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String Attributes. May 1993.

-

[RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

+

[RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

-

[RFC1794] T. Brisco. DNS Support for Load +

[RFC1794] T. Brisco. DNS Support for Load Balancing. April 1995.

-

[RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

+

[RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

-

[RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

+

[RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

-

[RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

+

[RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

-

[RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

+

[RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

-

[RFC3258] T. Hardie. Distributing Authoritative Name Servers via +

[RFC3258] T. Hardie. Distributing Authoritative Name Servers via Shared Unicast Addresses. April 2002.

-

[RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

+

[RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

Obsolete and Unimplemented Experimental RFC

-

[RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical +

[RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical Location. November 1994.

-

[RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

+

[RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

-

[RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation +

[RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation and Renumbering. July 2000.

@@ -541,39 +541,39 @@

-

[RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

+

[RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

-

[RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

+

[RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

-

[RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

+

[RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

-

[RFC3008] B. Wellington. Domain Name System Security (DNSSEC) +

[RFC3008] B. Wellington. Domain Name System Security (DNSSEC) Signing Authority. November 2000.

-

[RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

+

[RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

-

[RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

+

[RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

-

[RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

+

[RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

-

[RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

+

[RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

-

[RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

+

[RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

-

[RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record +

[RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record (RR) Secure Entry Point (SEP) Flag. April 2004.

-

[RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

+

[RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

@@ -594,14 +594,14 @@

-Other Documents About BIND +Other Documents About BIND

-Bibliography

+Bibliography
-

Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

+

Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

diff --git a/doc/arm/Bv9ARM.ch10.html b/doc/arm/Bv9ARM.ch10.html index 5fbeb3d..452717c 100644 --- a/doc/arm/Bv9ARM.ch10.html +++ b/doc/arm/Bv9ARM.ch10.html @@ -1,8 +1,8 @@ - + diff --git a/doc/arm/Bv9ARM.html b/doc/arm/Bv9ARM.html index ffb7b62..b31b67a 100644 --- a/doc/arm/Bv9ARM.html +++ b/doc/arm/Bv9ARM.html @@ -1,8 +1,8 @@ - + @@ -41,7 +41,7 @@

BIND 9 Administrator Reference Manual

-
+

@@ -51,39 +51,39 @@
1. Introduction
-
Scope of Document
-
Organization of This Document
-
Conventions Used in This Document
-
The Domain Name System (DNS)
+
Scope of Document
+
Organization of This Document
+
Conventions Used in This Document
+
The Domain Name System (DNS)
-
DNS Fundamentals
-
Domains and Domain Names
-
Zones
-
Authoritative Name Servers
-
Caching Name Servers
-
Name Servers in Multiple Roles
+
DNS Fundamentals
+
Domains and Domain Names
+
Zones
+
Authoritative Name Servers
+
Caching Name Servers
+
Name Servers in Multiple Roles
2. BIND Resource Requirements
-
Hardware requirements
-
CPU Requirements
-
Memory Requirements
-
Name Server Intensive Environment Issues
-
Supported Operating Systems
+
Hardware requirements
+
CPU Requirements
+
Memory Requirements
+
Name Server Intensive Environment Issues
+
Supported Operating Systems
3. Name Server Configuration
Sample Configurations
-
A Caching-only Name Server
-
An Authoritative-only Name Server
+
A Caching-only Name Server
+
An Authoritative-only Name Server
-
Load Balancing
-
Name Server Operations
+
Load Balancing
+
Name Server Operations
-
Tools for Use With the Name Server Daemon
-
Signals
+
Tools for Use With the Name Server Daemon
+
Signals
4. Advanced DNS Features
@@ -92,34 +92,34 @@
Dynamic Update
The journal file
Incremental Zone Transfers (IXFR)
-
Split DNS
-
Example split DNS setup
+
Split DNS
+
Example split DNS setup
TSIG
-
Generate Shared Keys for Each Pair of Hosts
-
Copying the Shared Secret to Both Machines
-
Informing the Servers of the Key's Existence
-
Instructing the Server to Use the Key
-
TSIG Key Based Access Control
-
Errors
+
Generate Shared Keys for Each Pair of Hosts
+
Copying the Shared Secret to Both Machines
+
Informing the Servers of the Key's Existence
+
Instructing the Server to Use the Key
+
TSIG Key Based Access Control
+
Errors
-
TKEY
-
SIG(0)
+
TKEY
+
SIG(0)
DNSSEC
-
Generating Keys
-
Signing the Zone
-
Configuring Servers
+
Generating Keys
+
Signing the Zone
+
Configuring Servers
-
IPv6 Support in BIND 9
+
IPv6 Support in BIND 9
-
Address Lookups Using AAAA Records
-
Address to Name Lookups Using Nibble Format
+
Address Lookups Using AAAA Records
+
Address to Name Lookups Using Nibble Format
5. The BIND 9 Lightweight Resolver
-
The Lightweight Resolver Library
+
The Lightweight Resolver Library
Running a Resolver Daemon
6. BIND 9 Configuration Reference
@@ -127,55 +127,55 @@
Configuration File Elements
Address Match Lists
-
Comment Syntax
+
Comment Syntax
Configuration File Grammar
-
acl Statement Grammar
+
acl Statement Grammar
acl Statement Definition and Usage
-
controls Statement Grammar
+
controls Statement Grammar
controls Statement Definition and Usage
-
include Statement Grammar
-
include Statement Definition and +
include Statement Grammar
+
include Statement Definition and Usage
-
key Statement Grammar
-
key Statement Definition and Usage
-
logging Statement Grammar
-
logging Statement Definition and +
key Statement Grammar
+
key Statement Definition and Usage
+
logging Statement Grammar
+
logging Statement Definition and Usage
-
lwres Statement Grammar
-
lwres Statement Definition and Usage
-
masters Statement Grammar
-
masters Statement Definition and +
lwres Statement Grammar
+
lwres Statement Definition and Usage
+
masters Statement Grammar
+
masters Statement Definition and Usage
-
options Statement Grammar
+
options Statement Grammar
options Statement Definition and Usage
server Statement Grammar
server Statement Definition and Usage
statistics-channels Statement Grammar
-
statistics-channels Statement Definition and +
statistics-channels Statement Definition and Usage
-
trusted-keys Statement Grammar
-
trusted-keys Statement Definition +
trusted-keys Statement Grammar
+
trusted-keys Statement Definition and Usage
view Statement Grammar
-
view Statement Definition and Usage
+
view Statement Definition and Usage
zone Statement Grammar
-
zone Statement Definition and Usage
+
zone Statement Definition and Usage
-
Zone File
+
Zone File
Types of Resource Records and When to Use Them
-
Discussion of MX Records
+
Discussion of MX Records
Setting TTLs
-
Inverse Mapping in IPv4
-
Other Zone File Directives
-
BIND Master File Extension: the $GENERATE Directive
+
Inverse Mapping in IPv4
+
Other Zone File Directives
+
BIND Master File Extension: the $GENERATE Directive
Additional File Formats
BIND9 Statistics
@@ -184,31 +184,31 @@
7. BIND 9 Security Considerations
Access Control Lists
-
Chroot and Setuid
+
Chroot and Setuid
-
The chroot Environment
-
Using the setuid Function
+
The chroot Environment
+
Using the setuid Function
Dynamic Update Security
8. Troubleshooting
-
Common Problems
-
It's not working; how can I figure out what's wrong?
-
Incrementing and Changing the Serial Number
-
Where Can I Get Help?
+
Common Problems
+
It's not working; how can I figure out what's wrong?
+
Incrementing and Changing the Serial Number
+
Where Can I Get Help?
A. Appendices
-
Acknowledgments
+
Acknowledgments
A Brief History of the DNS and BIND
-
General DNS Reference Information
+
General DNS Reference Information
IPv6 addresses (AAAA)
Bibliography (and Suggested Reading)
Request for Comments (RFCs)
Internet Drafts
-
Other Documents About BIND
+
Other Documents About BIND
I. Manual pages
diff --git a/doc/arm/Bv9ARM.pdf b/doc/arm/Bv9ARM.pdf index fbb664f..ca72481 100644 --- a/doc/arm/Bv9ARM.pdf +++ b/doc/arm/Bv9ARM.pdf @@ -765,323 +765,329 @@ endobj << /S /GoTo /D (subsubsection.6.3.5.1) >> endobj 516 0 obj -(6.3.5.1 The \044ORIGIN Directive) +(6.3.5.1 The @ \(at-sign\)) endobj 517 0 obj << /S /GoTo /D (subsubsection.6.3.5.2) >> endobj 520 0 obj -(6.3.5.2 The \044INCLUDE Directive) +(6.3.5.2 The \044ORIGIN Directive) endobj 521 0 obj << /S /GoTo /D (subsubsection.6.3.5.3) >> endobj 524 0 obj -(6.3.5.3 The \044TTL Directive) +(6.3.5.3 The \044INCLUDE Directive) endobj 525 0 obj -<< /S /GoTo /D (subsection.6.3.6) >> +<< /S /GoTo /D (subsubsection.6.3.5.4) >> endobj 528 0 obj -(6.3.6 BIND Master File Extension: the \044GENERATE Directive) +(6.3.5.4 The \044TTL Directive) endobj 529 0 obj -<< /S /GoTo /D (subsection.6.3.7) >> +<< /S /GoTo /D (subsection.6.3.6) >> endobj 532 0 obj -(6.3.7 Additional File Formats) +(6.3.6 BIND Master File Extension: the \044GENERATE Directive) endobj 533 0 obj -<< /S /GoTo /D (section.6.4) >> +<< /S /GoTo /D (subsection.6.3.7) >> endobj 536 0 obj -(6.4 BIND9 Statistics) +(6.3.7 Additional File Formats) endobj 537 0 obj -<< /S /GoTo /D (subsubsection.6.4.0.1) >> +<< /S /GoTo /D (section.6.4) >> endobj 540 0 obj -(6.4.0.1 The Statistics File) +(6.4 BIND9 Statistics) endobj 541 0 obj -<< /S /GoTo /D (subsection.6.4.1) >> +<< /S /GoTo /D (subsubsection.6.4.0.1) >> endobj 544 0 obj -(6.4.1 Statistics Counters) +(6.4.0.1 The Statistics File) endobj 545 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.1) >> +<< /S /GoTo /D (subsection.6.4.1) >> endobj 548 0 obj -(6.4.1.1 Name Server Statistics Counters) +(6.4.1 Statistics Counters) endobj 549 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.2) >> +<< /S /GoTo /D (subsubsection.6.4.1.1) >> endobj 552 0 obj -(6.4.1.2 Zone Maintenance Statistics Counters) +(6.4.1.1 Name Server Statistics Counters) endobj 553 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.3) >> +<< /S /GoTo /D (subsubsection.6.4.1.2) >> endobj 556 0 obj -(6.4.1.3 Resolver Statistics Counters) +(6.4.1.2 Zone Maintenance Statistics Counters) endobj 557 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.4) >> +<< /S /GoTo /D (subsubsection.6.4.1.3) >> endobj 560 0 obj -(6.4.1.4 Socket I/O Statistics Counters) +(6.4.1.3 Resolver Statistics Counters) endobj 561 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.5) >> +<< /S /GoTo /D (subsubsection.6.4.1.4) >> endobj 564 0 obj -(6.4.1.5 Compatibility with BIND 8 Counters) +(6.4.1.4 Socket I/O Statistics Counters) endobj 565 0 obj -<< /S /GoTo /D (chapter.7) >> +<< /S /GoTo /D (subsubsection.6.4.1.5) >> endobj 568 0 obj -(7 BIND 9 Security Considerations) +(6.4.1.5 Compatibility with BIND 8 Counters) endobj 569 0 obj -<< /S /GoTo /D (section.7.1) >> +<< /S /GoTo /D (chapter.7) >> endobj 572 0 obj -(7.1 Access Control Lists) +(7 BIND 9 Security Considerations) endobj 573 0 obj -<< /S /GoTo /D (section.7.2) >> +<< /S /GoTo /D (section.7.1) >> endobj 576 0 obj -(7.2 Chroot and Setuid) +(7.1 Access Control Lists) endobj 577 0 obj -<< /S /GoTo /D (subsection.7.2.1) >> +<< /S /GoTo /D (section.7.2) >> endobj 580 0 obj -(7.2.1 The chroot Environment) +(7.2 Chroot and Setuid) endobj 581 0 obj -<< /S /GoTo /D (subsection.7.2.2) >> +<< /S /GoTo /D (subsection.7.2.1) >> endobj 584 0 obj -(7.2.2 Using the setuid Function) +(7.2.1 The chroot Environment) endobj 585 0 obj -<< /S /GoTo /D (section.7.3) >> +<< /S /GoTo /D (subsection.7.2.2) >> endobj 588 0 obj -(7.3 Dynamic Update Security) +(7.2.2 Using the setuid Function) endobj 589 0 obj -<< /S /GoTo /D (chapter.8) >> +<< /S /GoTo /D (section.7.3) >> endobj 592 0 obj -(8 Troubleshooting) +(7.3 Dynamic Update Security) endobj 593 0 obj -<< /S /GoTo /D (section.8.1) >> +<< /S /GoTo /D (chapter.8) >> endobj 596 0 obj -(8.1 Common Problems) +(8 Troubleshooting) endobj 597 0 obj -<< /S /GoTo /D (subsection.8.1.1) >> +<< /S /GoTo /D (section.8.1) >> endobj 600 0 obj -(8.1.1 It's not working; how can I figure out what's wrong?) +(8.1 Common Problems) endobj 601 0 obj -<< /S /GoTo /D (section.8.2) >> +<< /S /GoTo /D (subsection.8.1.1) >> endobj 604 0 obj -(8.2 Incrementing and Changing the Serial Number) +(8.1.1 It's not working; how can I figure out what's wrong?) endobj 605 0 obj -<< /S /GoTo /D (section.8.3) >> +<< /S /GoTo /D (section.8.2) >> endobj 608 0 obj -(8.3 Where Can I Get Help?) +(8.2 Incrementing and Changing the Serial Number) endobj 609 0 obj -<< /S /GoTo /D (appendix.A) >> +<< /S /GoTo /D (section.8.3) >> endobj 612 0 obj -(A Appendices) +(8.3 Where Can I Get Help?) endobj 613 0 obj -<< /S /GoTo /D (section.A.1) >> +<< /S /GoTo /D (appendix.A) >> endobj 616 0 obj -(A.1 Acknowledgments) +(A Appendices) endobj 617 0 obj -<< /S /GoTo /D (subsection.A.1.1) >> +<< /S /GoTo /D (section.A.1) >> endobj 620 0 obj -(A.1.1 A Brief History of the DNS and BIND) +(A.1 Acknowledgments) endobj 621 0 obj -<< /S /GoTo /D (section.A.2) >> +<< /S /GoTo /D (subsection.A.1.1) >> endobj 624 0 obj -(A.2 General DNS Reference Information) +(A.1.1 A Brief History of the DNS and BIND) endobj 625 0 obj -<< /S /GoTo /D (subsection.A.2.1) >> +<< /S /GoTo /D (section.A.2) >> endobj 628 0 obj -(A.2.1 IPv6 addresses \(AAAA\)) +(A.2 General DNS Reference Information) endobj 629 0 obj -<< /S /GoTo /D (section.A.3) >> +<< /S /GoTo /D (subsection.A.2.1) >> endobj 632 0 obj -(A.3 Bibliography \(and Suggested Reading\)) +(A.2.1 IPv6 addresses \(AAAA\)) endobj 633 0 obj -<< /S /GoTo /D (subsection.A.3.1) >> +<< /S /GoTo /D (section.A.3) >> endobj 636 0 obj -(A.3.1 Request for Comments \(RFCs\)) +(A.3 Bibliography \(and Suggested Reading\)) endobj 637 0 obj -<< /S /GoTo /D (subsection.A.3.2) >> +<< /S /GoTo /D (subsection.A.3.1) >> endobj 640 0 obj -(A.3.2 Internet Drafts) +(A.3.1 Request for Comments \(RFCs\)) endobj 641 0 obj -<< /S /GoTo /D (subsection.A.3.3) >> +<< /S /GoTo /D (subsection.A.3.2) >> endobj 644 0 obj -(A.3.3 Other Documents About BIND) +(A.3.2 Internet Drafts) endobj 645 0 obj -<< /S /GoTo /D (appendix.B) >> +<< /S /GoTo /D (subsection.A.3.3) >> endobj 648 0 obj -(B Manual pages) +(A.3.3 Other Documents About BIND) endobj 649 0 obj -<< /S /GoTo /D (section.B.1) >> +<< /S /GoTo /D (appendix.B) >> endobj 652 0 obj -(B.1 dig) +(B Manual pages) endobj 653 0 obj -<< /S /GoTo /D (section.B.2) >> +<< /S /GoTo /D (section.B.1) >> endobj 656 0 obj -(B.2 host) +(B.1 dig) endobj 657 0 obj -<< /S /GoTo /D (section.B.3) >> +<< /S /GoTo /D (section.B.2) >> endobj 660 0 obj -(B.3 dnssec-dsfromkey) +(B.2 host) endobj 661 0 obj -<< /S /GoTo /D (section.B.4) >> +<< /S /GoTo /D (section.B.3) >> endobj 664 0 obj -(B.4 dnssec-keyfromlabel) +(B.3 dnssec-dsfromkey) endobj 665 0 obj -<< /S /GoTo /D (section.B.5) >> +<< /S /GoTo /D (section.B.4) >> endobj 668 0 obj -(B.5 dnssec-keygen) +(B.4 dnssec-keyfromlabel) endobj 669 0 obj -<< /S /GoTo /D (section.B.6) >> +<< /S /GoTo /D (section.B.5) >> endobj 672 0 obj -(B.6 dnssec-signzone) +(B.5 dnssec-keygen) endobj 673 0 obj -<< /S /GoTo /D (section.B.7) >> +<< /S /GoTo /D (section.B.6) >> endobj 676 0 obj -(B.7 named-checkconf) +(B.6 dnssec-signzone) endobj 677 0 obj -<< /S /GoTo /D (section.B.8) >> +<< /S /GoTo /D (section.B.7) >> endobj 680 0 obj -(B.8 named-checkzone) +(B.7 named-checkconf) endobj 681 0 obj -<< /S /GoTo /D (section.B.9) >> +<< /S /GoTo /D (section.B.8) >> endobj 684 0 obj -(B.9 named) +(B.8 named-checkzone) endobj 685 0 obj -<< /S /GoTo /D (section.B.10) >> +<< /S /GoTo /D (section.B.9) >> endobj 688 0 obj -(B.10 nsupdate) +(B.9 named) endobj 689 0 obj -<< /S /GoTo /D (section.B.11) >> +<< /S /GoTo /D (section.B.10) >> endobj 692 0 obj -(B.11 rndc) +(B.10 nsupdate) endobj 693 0 obj -<< /S /GoTo /D (section.B.12) >> +<< /S /GoTo /D (section.B.11) >> endobj 696 0 obj -(B.12 rndc.conf) +(B.11 rndc) endobj 697 0 obj -<< /S /GoTo /D (section.B.13) >> +<< /S /GoTo /D (section.B.12) >> endobj 700 0 obj -(B.13 rndc-confgen) +(B.12 rndc.conf) endobj 701 0 obj -<< /S /GoTo /D [702 0 R /FitH ] >> +<< /S /GoTo /D (section.B.13) >> +endobj +704 0 obj +(B.13 rndc-confgen) +endobj +705 0 obj +<< /S /GoTo /D [706 0 R /FitH ] >> endobj -705 0 obj << +709 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚÁJA †ïó9¶‡M'™d2s´T¥‚Beoâai·Rp·t­ïïÔÕ*êArÉÿ‘ü /A}È–ՓºsžŠvíèƒ ¨B)þP+!ÃlQ¡bJÕÂwìNì1úÈP©)&>áóÚÍ®˜€-A½bEM¦pæêÍÃd¾¼[L+V?ÉcºØt»~÷ršã~[÷í¶Ú~ÝNë a¤(±ø˘’å÷9·MÿÚ<ŸwYŸÝQ DËr;yƒ|ê~üÁÁýhÌ–ÁbïVV_§æŒlåP}&ûÿsßC+WDendstream endobj -702 0 obj << +706 0 obj << /Type /Page -/Contents 705 0 R -/Resources 704 0 R +/Contents 709 0 R +/Resources 708 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 711 0 R +/Parent 715 0 R >> endobj -703 0 obj << +707 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./isc-logo.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 712 0 R +/PTEX.InfoDict 716 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 255.00000000 149.00000000] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << -/R15 713 0 R -/R9 714 0 R -/R11 715 0 R -/R13 716 0 R +/R15 717 0 R +/R9 718 0 R +/R11 719 0 R +/R13 720 0 R >>/ExtGState << -/R17 717 0 R -/R8 718 0 R ->>/Font << /R19 719 0 R >> +/R17 721 0 R +/R8 722 0 R +>>/Font << /R19 723 0 R >> >> -/Length 720 0 R +/Length 724 0 R /Filter /FlateDecode >> stream @@ -1097,7 +1103,7 @@ x FÑÞIca­Ç0Ú) ¹A¿+ÇÀº ¸|-Tuùa>‚s:½¯•~K“ÒÞV׋„OÒAŠI… ɪÁr2Q“°Ø¨Á>.zÎCN’¦{Õ«'^5Mã»Åûæ¡æÔÊý¹U1z6õßvãpF)ÂÏåìÊ›C£i#]bÝLkS#ˆQÁŽv–¨Ô­«•ÇcHŸ$¬Áê³DI­ÌÑptÅ73*_åª'ŽÚ¿¢ÚòQŒ×è Œ‚,É*Ñ+ôÚ™%vŽ&u߉ xœÉ-¾kz˜ Ï‡Ú Q´Pë3ÈZ§q¢Æ0¯ˆwMÍ?©=õ*_Ç£RïѪëƬ¡”’¢g!SeRâÅéz·ÝŠFLÚŸv ÏÆ狼eÇNdæÌdï"gK2cëÉ—GoOá8GëÏϦ:B Àht[~Ðåõ—×SÒÜ£uˆQk·%È´ÔÛ†ëiATÆÌp[OU‡Ç(zßQã³* *Ñûø®á¾FÅÍ„Ï'µV‡¾;1aŠÑüËŒÜr$¿Íâ9Ë8ˆü ý‚TóþÏÍ÷_oôô¢ññCÙõ"ú*~uÊqæþéïÛ{Ç"ß~±Úú"ú…bùz+·£]OZ,SÏ¥._^·§_\^þ†56g‡3^®Ç5Z©®©¹Uý¶õòÇí÷O¿½<Ó#rYëé»Ë^~¹ÁÇ<ц®5%¥Ü~ÿñsõ\êídŽ3¼4ü~èé[iþÂÈg óžµ|¥Ïà5³m“XSô7…ÿúáò¬ä>!»Î“O÷hKYð¿þîÇ Ó3/¡úôÃgë¾4EO=öï¦üì“­‡v5”ùÜþû‚ék”ùôñR”Ì¡ÌlöÅ·ß_DÍη„Rf.{úÏåYӎͧÿ^ž©í5¬?ývýüeûMüó?Ò ƒendstream endobj -712 0 obj +716 0 obj << /Producer (AFPL Ghostscript 8.51) /CreationDate (D:20050606145621) @@ -1107,46 +1113,46 @@ endobj /Author (Douglas E. Appelt) >> endobj -713 0 obj -[/Separation/PANTONE#201805#20C/DeviceCMYK 721 0 R] +717 0 obj +[/Separation/PANTONE#201805#20C/DeviceCMYK 725 0 R] endobj -714 0 obj -[/Separation/PANTONE#207506#20C/DeviceCMYK 722 0 R] +718 0 obj +[/Separation/PANTONE#207506#20C/DeviceCMYK 726 0 R] endobj -715 0 obj -[/Separation/PANTONE#20301#20C/DeviceCMYK 723 0 R] +719 0 obj +[/Separation/PANTONE#20301#20C/DeviceCMYK 727 0 R] endobj -716 0 obj -[/Separation/PANTONE#20871#20C/DeviceCMYK 724 0 R] +720 0 obj +[/Separation/PANTONE#20871#20C/DeviceCMYK 728 0 R] endobj -717 0 obj +721 0 obj << /Type /ExtGState /SA true >> endobj -718 0 obj +722 0 obj << /Type /ExtGState /OPM 1 >> endobj -719 0 obj +723 0 obj << /BaseFont /NVXWCK#2BTrajanPro-Bold -/FontDescriptor 725 0 R +/FontDescriptor 729 0 R /Type /Font /FirstChar 67 /LastChar 136 /Widths [ 800 0 0 0 0 0 452 0 0 0 0 0 0 0 0 0 582 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 841 633 576 686 590 540 923 827 407 760] -/Encoding 726 0 R +/Encoding 730 0 R /Subtype /Type1 >> endobj -720 0 obj +724 0 obj 2362 endobj -721 0 obj +725 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1157,7 +1163,7 @@ endobj stream xœ«N)-P0PÈ-ÍQH­HÎPsõ, QE¸zFÆ`^-=1°endstream endobj -722 0 obj +726 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1168,7 +1174,7 @@ endobj stream xœ«N)-P0PÈ-ÍQH­HÎPsõ LÑE ‘D Êk8/«endstream endobj -723 0 obj +727 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1179,7 +1185,7 @@ endobj stream xœ«N)-P0TÈ-ÍQH­HÎPq ôLLÑD\=C 0¯=D³endstream endobj -724 0 obj +728 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1190,7 +1196,7 @@ endobj stream xœ«N)-P0Ð365³TÈ-ÍQH­HÎP€Š™X ‹™›#Ä ô -,ŒÀüZ&‹ˆendstream endobj -725 0 obj +729 0 obj << /Type /FontDescriptor /FontName /NVXWCK#2BTrajanPro-Bold @@ -1203,17 +1209,17 @@ endobj /StemV 138 /MissingWidth 500 /CharSet (/Msmall/C/Ysmall/Nsmall/Osmall/Esmall/Rsmall/S/Ssmall/I/Tsmall/Ismall/Usmall) -/FontFile3 727 0 R +/FontFile3 731 0 R >> endobj -726 0 obj +730 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 127/Nsmall/Tsmall/Esmall/Rsmall/Ysmall/Ssmall/Msmall/Osmall/Ismall/Usmall] >> endobj -727 0 obj +731 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -1236,40 +1242,41 @@ x ȼLçÇ<;— *X³«¥×ÛGâ_Y1ETïƒ4ˆÒ-U…_>´üØ¢æ}õï÷v¼ §ádù#¹rÛŸå¥@ÔÁ\5l…hð<8Ús·’?h¹†!-¶‚*JŠ»,\G/Wé9OW—×µ.Ÿ—­€&¨[”ÄIÁÚ´Ó½7ýáÐäKý¡«¨ðúš.cxQn<¼À°üÖëgöõÁúhíY8³¶+oî^÷ë°‹>9p¯“°¥!ÑÚÙ®ŠðK´¢†#©óRÄlxŽJ”ب¬Ò–àá•{ϳwÿaû’ožÇ£ëHõÅâH9”ç/.~å÷Ë »O·Øèv61Bá5*È<6ÞÍ,‡bh‘˜¶ž\Î]Çé#¹#ØÔÍ1Oúñ°Ï¤5oÂ]цÆß4}h˜î0$å,6ü¼”A,¯?/å;Rôcy6Ò½UJ¿§Y½X^é¶ÙÉŸ‡‹º–2¸K|o½Ø”/Ȩ/ƒ( Â2Ð#žNMKðrˆ rœÛf9ËyZ¸Ú}$«Ö õ–©)  h`iÎGàAç÷´€H+Šˆ…Õ&*áX$žèìVŽhª”—›¾÷‡A1Ý£¤œÏ0‰÷—Hi éƒw~I(Áö2;à]¸L ™x4[¡OÜ,¾®ÆûÂQQ°”FdQ“ƒ¢¬„%\î¢Åâ:Ó;ÈÑ”ÌEb1ž’¡ˆÿ§=$¸¥?Iš¿CÐõ3¾C=VÐ'>·¯ôÌÒ+Ü~8 ç#;úÁ_£×á*qň+ô 8®‚ãÆpêŒ_YR”¾d%a ç¡H\eÄõãDf£Ñ¨­ŽR[kφG¸ù/WT®ò•A5”H¥ÛVoo8hnû)¼ÞÃDn…ñëqÌzfåhý&þcQbµXÇß‚çLŽúõ;{²Ðñðué¿ÊÛÙ†-©[SÄ-Û¼ÔyubÜñhüm´œ4^Ë™ ääšLÿQ‹¡endstream endobj -706 0 obj << -/D [702 0 R /XYZ 85.0394 794.5015 null] +710 0 obj << +/D [706 0 R /XYZ 85.0394 794.5015 null] >> endobj -707 0 obj << -/D [702 0 R /XYZ 85.0394 769.5949 null] +711 0 obj << +/D [706 0 R /XYZ 85.0394 769.5949 null] >> endobj -704 0 obj << -/Font << /F21 710 0 R >> -/XObject << /Im1 703 0 R >> +708 0 obj << +/Font << /F21 714 0 R >> +/XObject << /Im1 707 0 R >> /ProcSet [ /PDF /Text ] >> endobj -730 0 obj << +734 0 obj << /Length 1001 /Filter /FlateDecode >> stream -xÚµVM“¢:Ýû+XjU“É_Y҈ʂ8]S3³°»©jÅ'8]ýïß…$"êëÍÔ+¹IŽ÷žsr Ãh¦…,N¹fs™˜˜Úz7ÀÚ ìMDb°¦cĸÓnþ3øùk}ÈÕw˜`D8§Ún`˜ ™cjåm¾S]쪄×Õtƒ:˜ØšÎ ä»KÔ Ú¡ˆRljºmrd1Êôc6ø2#nQK˶šc#Š‰£QÙæçÐ+Çâåµýξj&F6æ-5Œ`Ýl|™ã"“N‘mq»õDá~_í%`ÈØ‚(ÆÆÃH§&nB³ ­.´»ÐéB.¢`_çÇ}^‹YúQÕù®¯ÜWå±.N»…]£‘În&þE©¤^3À”4T~v6‘0ŠL˲4Û ÐÜüÔñ3Z¿„ßZN˜ gmó.ëyNÿOÏqç#éBÚ…ì®»å¶~_GÄæ×£kÿ,Œ8µ ¹(ž|fŸë—è[÷,qì.g#g‘wEUå^pªK1žª\êYƒ½#BÈPÎwå¦ØöVVû6EU‹çS-Ö¯…ì¦êFü¶<ªˆàp:ÊJn¿õ«ˆ®Y)OÒÌm.qP 9ux0¸‹:!ˆ›&m¥½æ¢Þ³Ìÿr\Ál$éC»Yþ)6ùF±]Õ*’ÙWÏ埼³AtY;Ý—u±Î¯ôwzW¶öà‡C¾’¢ -¹¿z{kuîÀ!57áR Ô.òªmh\Ì3X#ÖFœQ»…d3_¶Y<ÉžFœÝD®©Iü=ûc1kn®›*D3±Õ¢'‚1D¡Ì%Ø CÈ*‰e/7Ÿ‚l&¢ÄŸºÉX\Ixæ2Ò—”5îÇšÍÅ;ä#/\ŽƒhzU<˜/Â@i¹Ç$žˆqî'Þ 6F¶1tƒ0È~tBvâ†c+v¤e7 ²ÈOS¤8ˆ1’|ýï>ä„g#å×£¤îc(ãIœ¨ª²|ºð½À ”ljïµÕÓ6ºY‚mŒLÎyßO/ŽRÿÛˆAR™Ó»Ó³×õ{»O3·)”¥1hKԦ˰]=»?Iâ¹Ô§Ï +Œà¹xuÆËÔWòDúö ú| )ÁìôAñð¡‘“¾í®½,ˆ£þé‚ì,q{6Eþ4 ¦~äùýJq›¹}Xˆ:„ô\4d2b6Ž—éeM™ÙM‚ôìE¼ÌúTâ+Ú@-ò/(wWã|WÁ ÞÑ6—>z&.üšgîvz&ŸÝš›7‰úc&j¾’î~Œ©zý1¦«jºa#æ8ôþ›ˆ:ðƲٙTû^½!}N™Eï0ÿŸûh~endstream +xÚµV]“¢8}÷Wð¨UM:|å‘FT¦ÀéÚš™[±›ªV\Åéê¿’€¨Û/[[>ä$9Þ{îÉ @4 ?¢™²8åšÍ dbbjëÝk¯°7ÉÁšŽãN³ù÷àço¬m€ôm W?`‚áœj»a2dŒ©•÷A:øÞ†ºØU¯³é†‘aqMgr@Ü%é†lqd[6ÕtÛäÈb”Õì§lð8È·¨¥e[Í6m@¾–•m~½òðy,^ߪÑïì›fbdcÞ(ÃXÖõÆã„‘t + ¹ÝX¢x¿À8Aí%%A½±!QŒ‡‘NM\C³ƒVí:ä-$X `_åÇ}^‰YúyªòÝIL¼r*UqÞ=(îtF0È4ñ/J õꦤV=ð³ÖOÂ(2-ËÃ47¿4¿eë—ô[÷ ³áÔmÞEý7ûéÿi?î,%¤dwÝ-·ÕÇê8"Î0¿¶]ûíM)v4›2Ði9_Ú§Èú%ûÖ=ÓASÒŬËYäÇ]q:å^hªJ1žO¹¬g öŽ!C9ß•›bÛ[Yí7åQàMqªŽÅ˹’5Vo…l¨ÓMý[õ§ÕþS€Ãùx(Orû£¨ÞR¼z¥Ä‚g"åד”îS(ñ$NTV™>]ø^à†ÊãÄ÷ê‰Ý,Aˆ¦FVßL/ŽRÿûTADлÓÖ‹ëä½Ýç™[gÉÒ +KÔé¥Ë°Ym­Ÿ$ñ\§Éµ$ŒàÁxuÀËÔWµ‰ðÍôõ@G‚ÓéƒÒáC'}Ï]5zYGý£…²³ÄíyùÓ0˜ú‘ç÷3ÅMäZ+|P‡ô[4c2b6Ô/ÓË”2°›ikE¼ÌúJâ+Õ ,ò/w×¢½§àOïXë‹Ï雸ð蜹ÛÕ3ùêÊܾJä—3QýÁt÷»LåûÏßeºÊ¦6bŽCï¿Š¨ƒ·Y+ªy±Þ‡&§Ì¢w”ÿ¾Èjæendstream endobj -729 0 obj << +733 0 obj << /Type /Page -/Contents 730 0 R -/Resources 728 0 R +/Contents 734 0 R +/Resources 732 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 711 0 R +/Parent 715 0 R >> endobj -731 0 obj << -/D [729 0 R /XYZ 56.6929 794.5015 null] +735 0 obj << +/D [733 0 R /XYZ 56.6929 794.5015 null] >> endobj -728 0 obj << -/Font << /F23 734 0 R /F14 737 0 R >> +732 0 obj << +/Font << /F23 738 0 R /F14 741 0 R >> /ProcSet [ /PDF /Text ] >> endobj -740 0 obj << +744 0 obj << /Length 2891 /Filter /FlateDecode >> @@ -1289,1334 +1296,1337 @@ W M…­æ:h¾nêãô¨ýèá·oðÐkƒh—#öùlk…lMfR,`5("qP,Þ„b‰Ðø˜Ž~]í»=Ãמ,Åzž%húg°º ÁîGÓäm2ƒÅREŽ7XD‚ ˆ \@pÁ,tûµDÀ'/œÕ½ÊýØø@Á_™'Hûd !E–•B*Åéö®ÒŒ‘@aaëêdz¿µÍ:ê°uõÕ¶HA‰©”!;2¬3ÁX$1Ò5–$LCK¢[ÎÂéÌù›ödŽ÷ÇršgľڀŠL% Ù¤a½ Ò"AP‡…r=|Ê?SRxÐRèWywqqvê:ûñÌ7ƒÊ'*SƒVZâï<Ž`¨ðwæ2ciìÈÛÕ÷ Ε[~©‘&Å3çë™SÿÀóøóp%ðö?ž­®Bendstream endobj -739 0 obj << +743 0 obj << /Type /Page -/Contents 740 0 R -/Resources 738 0 R +/Contents 744 0 R +/Resources 742 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 711 0 R -/Annots [ 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R ] +/Parent 715 0 R +/Annots [ 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R ] >> endobj -743 0 obj << +747 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 688.709 539.579 697.2967] /Subtype /Link /A << /S /GoTo /D (chapter.1) >> >> endobj -744 0 obj << +748 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 676.5858 539.579 685.4425] /Subtype /Link /A << /S /GoTo /D (section.1.1) >> >> endobj -745 0 obj << +749 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 664.4876 539.579 673.3442] /Subtype /Link /A << /S /GoTo /D (section.1.2) >> >> endobj -746 0 obj << +750 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 652.3894 539.579 661.246] /Subtype /Link /A << /S /GoTo /D (section.1.3) >> >> endobj -747 0 obj << +751 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 640.1914 539.579 649.1477] /Subtype /Link /A << /S /GoTo /D (section.1.4) >> >> endobj -748 0 obj << +752 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 628.0932 539.579 637.0495] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.1) >> >> endobj -749 0 obj << +753 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 615.995 539.579 624.9512] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.2) >> >> endobj -750 0 obj << +754 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 603.8967 539.579 612.853] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.3) >> >> endobj -751 0 obj << +755 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 591.7985 539.579 600.7547] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.4) >> >> endobj -752 0 obj << +756 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 579.7002 539.579 588.6565] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.1) >> >> endobj -753 0 obj << +757 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 567.6019 539.579 576.5582] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.2) >> >> endobj -754 0 obj << +758 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 555.5037 539.579 564.46] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.3) >> >> endobj -755 0 obj << +759 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 543.4055 539.579 552.5112] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.5) >> >> endobj -756 0 obj << +760 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 531.3072 539.579 540.413] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.5.1) >> >> endobj -757 0 obj << +761 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 519.209 539.579 528.3147] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.6) >> >> endobj -758 0 obj << +762 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 496.7003 539.579 505.4125] /Subtype /Link /A << /S /GoTo /D (chapter.2) >> >> endobj -759 0 obj << +763 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 484.5772 539.579 493.5832] /Subtype /Link /A << /S /GoTo /D (section.2.1) >> >> endobj -760 0 obj << +764 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 472.4789 539.579 481.485] /Subtype /Link /A << /S /GoTo /D (section.2.2) >> >> endobj -761 0 obj << +765 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 460.3806 539.579 469.3867] /Subtype /Link /A << /S /GoTo /D (section.2.3) >> >> endobj -762 0 obj << +766 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 448.2824 539.579 457.2885] /Subtype /Link /A << /S /GoTo /D (section.2.4) >> >> endobj -763 0 obj << +767 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 436.1841 539.579 445.1902] /Subtype /Link /A << /S /GoTo /D (section.2.5) >> >> endobj -764 0 obj << +768 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 413.4314 539.579 422.288] /Subtype /Link /A << /S /GoTo /D (chapter.3) >> >> endobj -765 0 obj << +769 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 401.353 539.579 410.4588] /Subtype /Link /A << /S /GoTo /D (section.3.1) >> >> endobj -766 0 obj << +770 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 389.2548 539.579 398.3605] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.1) >> >> endobj -767 0 obj << +771 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 377.1565 539.579 386.2623] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.2) >> >> endobj -768 0 obj << +772 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 365.1579 539.579 374.164] /Subtype /Link /A << /S /GoTo /D (section.3.2) >> >> endobj -769 0 obj << +773 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 353.0597 539.579 362.0658] /Subtype /Link /A << /S /GoTo /D (section.3.3) >> >> endobj -770 0 obj << +774 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 340.9614 539.579 349.9675] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.1) >> >> endobj -771 0 obj << +775 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 328.7635 539.579 337.8693] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.1) >> >> endobj -772 0 obj << +776 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 316.6653 539.579 325.771] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.2) >> >> endobj -773 0 obj << +777 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 304.567 539.579 313.6728] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.2) >> >> endobj -774 0 obj << +778 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 281.9139 539.579 290.7706] /Subtype /Link /A << /S /GoTo /D (chapter.4) >> >> endobj -775 0 obj << +779 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 269.8356 539.579 278.9413] /Subtype /Link /A << /S /GoTo /D (section.4.1) >> >> endobj -776 0 obj << +780 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 257.7373 539.579 266.8431] /Subtype /Link /A << /S /GoTo /D (section.4.2) >> >> endobj -777 0 obj << +781 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 245.6391 539.579 254.7448] /Subtype /Link /A << /S /GoTo /D (subsection.4.2.1) >> >> endobj -778 0 obj << +782 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 233.5408 539.579 242.4971] /Subtype /Link /A << /S /GoTo /D (section.4.3) >> >> endobj -779 0 obj << +783 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 221.4426 539.579 230.3988] /Subtype /Link /A << /S /GoTo /D (section.4.4) >> >> endobj -780 0 obj << +784 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 209.3443 539.579 218.3006] /Subtype /Link /A << /S /GoTo /D (subsection.4.4.1) >> >> endobj -781 0 obj << +785 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 197.2461 539.579 206.2023] /Subtype /Link /A << /S /GoTo /D (section.4.5) >> >> endobj -782 0 obj << +786 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 185.1478 539.579 194.1041] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.1) >> >> endobj -783 0 obj << +787 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 173.0496 539.579 182.0058] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.1) >> >> endobj -784 0 obj << +788 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 161.051 539.579 170.0571] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.2) >> >> endobj -785 0 obj << +789 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 148.9527 539.579 157.9588] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.2) >> >> endobj -786 0 obj << +790 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 136.8545 539.579 145.8606] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.3) >> >> endobj -787 0 obj << +791 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 124.7562 539.579 133.7623] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.4) >> >> endobj -788 0 obj << +792 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 112.5583 539.579 121.5146] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.5) >> >> endobj -789 0 obj << +793 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 100.4601 539.579 109.4163] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.6) >> >> endobj -790 0 obj << +794 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 88.3618 539.579 97.3181] /Subtype /Link /A << /S /GoTo /D (section.4.6) >> >> endobj -791 0 obj << +795 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 76.2636 539.579 85.2199] /Subtype /Link /A << /S /GoTo /D (section.4.7) >> >> endobj -792 0 obj << +796 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 64.1653 539.579 73.1216] /Subtype /Link /A << /S /GoTo /D (section.4.8) >> >> endobj -741 0 obj << -/D [739 0 R /XYZ 85.0394 794.5015 null] +745 0 obj << +/D [743 0 R /XYZ 85.0394 794.5015 null] >> endobj -742 0 obj << -/D [739 0 R /XYZ 85.0394 711.9273 null] +746 0 obj << +/D [743 0 R /XYZ 85.0394 711.9273 null] >> endobj -738 0 obj << -/Font << /F21 710 0 R /F23 734 0 R >> +742 0 obj << +/Font << /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -795 0 obj << -/Length 3159 +799 0 obj << +/Length 3161 /Filter /FlateDecode >> stream -xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±÷¥Û}`dÆÖ‰$z%9©ûé Š8´À‘ÐÆili÷ìÚ‰9œñüÂ`@d#êÿe#¥‰vÜŒ“DQ¦F“ù ]ùŸ½9aí1ãpÐõüâä/¯…9â4×£‹Ï#©ájs2K¨µltqùûé‹÷ï.^½»8?ûãâ—“Wñ¬Ð3£¢>åŸ'¿ÿAG—>€_N(ΪÑ7ÿJ˜s|4?‘J%…3;9?ù5žütcšüM%\hžøU¸¿JýCÅFF9¢…ÿIý‹Hb ;3Néé›rQ.‹õtqu6択þµ¼[­æ§äl¬üï‹tî»ì¾ÔÔgÝÝåsK›åÕ¨ùæ#T+Ø¡á¶ZÛç¯õâz+Ž ~*ŒÔ{`E¢)Õ‘Þ²r>½ZDPÖ×eóÍ?ª…ÿÎP}$%&d5›`ˆUÈIăzÄE”¶.#Zb^T‹Rʯn—‘›órùµ\Öc ‡ŠÊ #!ÙŒCŒ¨7ÃŒ$âÀA½æ‡íË#÷UMÞBâ<"ÔóðöÃWÝ’q{sS-×ͦ‹æëó·ï^6ßyÇÙãd~@!ÇÙC ¨!·Ã%âÀB½‡A†1?ÏQ¡,¹8…yvy¹Ï«jæ§ÃÙ |ûe $âÞ:ï&kn8kàtX¶¶¼¦*©ÖŠ0Él“­Í8XWÒ˜¯áô´?þ´,–w¾œJù”Kæ !}ÙŸ$`ˆ}’ <‰806Pï‘ %c”·lð–·‹®u+RT¼,Êyå']Ψƒ›U ’’™M -0ÄHba¤$âÀHÙòžs%–ºSÝŽ¹[Cm×Áëiµä|.—åbRg.œ|ïñ`ã- Z°áŒÓa™ÚòšüL1KŒiWuo“©y= s‹W³r^.Ö~¢˜9Ô~eÒìO0Ä>YP2Œ“D/¨÷0i¥š©UÀe¸Qù{±ž\‡¢¼ªQц{Ú{¨„tf£ 1T \‚£’ˆCõθ&R09Räí`Ùà"êõ»Åºø×ÙX8u\ZÝ”˜Ê\P !JO*”T(¸÷ˉ¶‚Px Ê˲®C‹iW…ŠÅeè{‹«zuþg˜éÿˆUö˜¥l€!ÆTAˆaq`  ÞÛº¢ %Zy<®²Ïë™F»ŠÚŽʚ㨢Ò™ -0ÄPra¨$âÀPA½wÃ…²D3g:XŽuå¿%¤2`ˆ¥Â@IÄ‚zï@‘š(Û57”c]Ùf d)›`ˆ1Ur˜D¨÷Ðß*Q - ߯¿}³,æó¢^=2âØÞÞÃ%d4`ˆáÃpIÄá‚zÓΉâ2T–º®x÷÷l#ÖRéÔG“Y{LoR„3nÛcÎןì¦1‘.Ãí±Ž9Ïæ b?{Ltþ?»¬¾[Ãr™Í 0Ä8Zaœ$âÀ8A½Ç«L’r©q€”úz¤m·-oC£©ïªe˜õN®‹Å¢L­úùAN*¥Ûã>\/‹•gA ~X³šÞlx€!”O ߊƒõáÎÃb@;UŸ ?\UËÔLGR¢­¹¤ö *TLo.<Ч'Ÿ¤ƒð¤â@àÁ½wðK˜”°FÕ·§î ÏŸ·åòn\.—Õ2µø§,q҆ſ4/´Ô r2™Í 0Ä8JÉáýu©80NPïíLÆ÷ê„1êÓî«š³oË2Å÷ó˜8¨ Mƒ¹Ò|}<¦;%`ˆ¡åÄPJÄ¡„z()I¨e¼C‰?J»gÄ’¹'T¥BZ³‘†2P69¼ +† ê= #9¡Ò©™ÝW4çÅj]&kRÝGI§wöáú°f9!ÇÙüCŒ¨!ÆO"ŒÔ{àGÔsØ]ɇâgŸ>Ü=æ><æ2›`ˆqµÂ8IÄq‚zœ0CœÕ 4í¾¤YÝÔR¯Ò¦¬w¹ó’&;¬©MÈq6?Àãjˆñ“ˆãõø¡Š8%AÒÅÏ>6壮G!—ÙœCŒ¨•¾°™Šãõ»nîqœ[@JXï{^U³²hE}ßÒ1VÂðUɘ®\ !CO9¼~—Š÷ÞÁ`ýˆà`G¤ÃúÝëjù­hžÄ³y<¤üxûÉ=6Bö²Ù†P5\PRq`l Þ;6´#VÁÖG‡å¹—·Ål¼Z“/÷ž'~¾[Û~È R• 0Ä@€R` $âÀ@@½w (C,7½Š!žM&ñ–ùõFÌz¼¨fuÑ8Þß%. `ˆa…Á°HÄazï°Š§ÄB5X¼]øösáÙ8kÊŽ·¹¦ñ ÌÆbx@ÔðFîT¨÷!ˆÑ½Ž„è_ë+7íƒÿàƒ7„1G*bÞ²©†PŒŠD¨÷Ž -ΈýîÃ4T4O+®¡¸8sôtY,VŸ7“ -eØ‹˜¸l,€!†F oBIÅazï° ŽÊzµÄ6XüöòCCŇøÚö‰Øg'åò™M -0ÄPéé5ü@¥T,¨÷Ž&ˆ”÷:ÝÐòüv:[ÃëpV _™.>o^_wHü»ZÔkáƸG¹s&f![c`ˆiÜËòðšd*LcÔ{§1eD2ݓؤ$~5¿Yßu¯V«/nüDKPÛ‚´9Ê ³Ãô‡ - oˆI©¹Žâ[G„•¢'¾mÄvy¹ÙäTÌÂUîI÷‰~QL®7uÂiýtdÙÈ•Ø!2÷r=¼Äœ‘u^PeˆP|Âw?ΡÎõŒè÷Rsó”' -ƒo¼jý«Î{ß”yÝÕvØÛ®0×Ὂšû@øìó,¼§Ðs¶ùÌwK0CßÜÒi…¼+k+‚-Dâ»~ÇÜyi“/,ñÿ1â”âÿû«…»7 ËúÖ";°=‹[J\ýÖ.á篢½s¹%fsˆü?ìÑTÿendstream +xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±÷¥Û}`dÆÖ‰$z%9©ûé Š8´À‘ÐÆili÷ìÚ‰9œñüÂ`@d#êÿe#¥‰vÜŒ“DQ¦F“ù ]ùŸ½9aí1ãpÐõüâä/¯…9â4×£‹Ï#©ájs2K¨µltqùûé‹÷ï.^½»8?ûãâ—“Wñ¬Ð3£¢>åŸ'¿ÿAG—>€_N(ΪÑ7ÿJ˜s|4?‘J%…3;9?ù5žütcšüM%\hžøU¸¿JýCÅFF9¢…ÿIý‹Hb ;3Néé›rQ.‹õtqu6択þµ¼[­æ§äl¬üï‹tî»ì¾ÔÔgÝÝåsK›åÕ¨ùæ#T+Ø¡á¶ZÛç¯õâz+Ž ~*ŒÔ{`E¢)Õ‘Þ²r>½ZDPÖ×eóÍ?ª…ÿÎP}$%&d5›`ˆUÈIăzÄE”¶.#Zb^T‹Rʯn—‘›órùµ\Öc ‡ŠÊ #!ÙŒCŒ¨7ÃŒ$âÀA½æ‡íË#÷UMÞBâ<"ÔóðöÃWÝ’q{sS-×ͦ‹æëó·ï^6ßyÇÙãd~@!ÇÙC ¨!·Ã%âÀB½‡A†1?ÏQ¡,¹8…yvy¹¤ùºj¾¾+æ%NÁ»é§O³ö˜×Õr^lF÷³ËS‘+34Dd9"ó¶w½·­“6†0_F6ÎU]|.. ³W6ÒN¯®×ßÊúÿáó¼ªf~Z1œ½àÀ‡±_Ö€A"î­óÖ 6œ5p:,[[^S•TkE˜d¶ÉÖf¬+iÌ×pzÚZË;_N¥|Ê%s…¾ìO0Ä>IPŒ‰D¨÷Ȇ„1Ê[6xËÆÇÛE׺)*^å¼ò“.gÔÁͪI ÉÌ&b¤@±0Rq`¤lyOŽ¹‚K]ƒ©nÇÜ­¡¶ëàŠõ´Zr>—Ër1)‡3N¾÷x °ñ-ÄpÆÀé°LmyM~¦˜%Æ´«€:Ž·ÉÔ¼ž†¹Å«Y9/k?QÌj¿2ÈGHiö' bŸ,(ÆI"ŒÔ{˜´RMŒÔ*à2ܨü½XO®CQ^Õ¨hÃ=í=TB:³Q†*P.!‡QIÄ¡‚zg\)˜)aÒv°lpõzÈÝb]üël,œ:.­îJLe.(Ð¥'J*Ü{ŠåD[Á(¼åeYסŴ«BÅâ2ô½ÅU½:ÿ3ÌôÄ*{ÌR6Àcª Ô0‰80Pïm]Q†­< +WÙçõL£]EmG eÍqÔ@Q éÌFb¨@¹0Tq`¨ Þ»áBY¢™3,Ǻòß‚R™ +0Ä@Ra $âÀ@A½w HM”íšʱ®l3²”Í0Ä€*ˆá«·©80Pï¡¿U¢.0:¾_ûfYÌçE½zdı½½‡KÈh6.ÀÃ*†á’ˆÃõ¦!œÅe¨,u]ñîï-ØF¬¥Ò;¨*&³ö˜Þ¤gܶǜ¯‹uÙMc"]†ÛcsžÍ0Äx‚šŠá©80žPï'¸t"âħݥÌ:öô†¡6µÙÔtv4@8Œ™í 0d0×-1ÒY"ul„8;‘™T‹õ²š­ÜG(|Ç0¤¬{’ÃÐ:1ǹì@Cžž†=©8|pïëç¾ÜuL>?{L¡ ¸ rr™Í 0Ä8Z‰áG©80NPï#ë ص“éb2»½,S”hbÛ5Ù±ŒÔ<9d8žÎc臡³Fæ:€£}MÒº›Óè‡"g÷øò£¯ççÍ1•ÙˆCŒ(I"ŒÔ{ÀDQ"è¤ÌNL¾”w©©¯/AΊƒ‹ö¸êsžÍ0Äx‚šŠámt©80žPï'a‰ Ý¨c§Ý#Ž¢O¯“ +©Í¦¦³Ã ÂaÌl!ƒ¹Äpωa2n'2³êêªÞI–(TÆyNíZÏQò vÆg£ 1v „<‰80zPï&ýáNwKô¡øÙc¢óÿÙeõÝîËlN€!Æ Ô +ã$Æ ê=^e’”N¤Ô×#m»myM}W-ìwr],ejÕÏrR)Ý÷ázY¬< ZðÚՄôfà 1x |’ÓˆƒõáÎÃb@;UŸ ?\UËÔLGR¢­¹¤ö *TLo.<Ч'Ÿäƒð¤â@àÁ½wðK˜”°FÕ·§î ÏŸ·åòn\.—Õ2µø§,q҆ſ4/´Ô r2™Í 0Ä8JÉáýu©80NPïíLÆ÷ê„1êÓî«š³oË2Å÷ó˜8¨ Mƒ¹Ò|}<¦;%`ˆ¡åÄPJÄ¡„z()I¨e¼C‰?J»gÄ’¹'T¥BZ³‘†2P69¼ +† ê= #9¡Ò©™ÝW4çÅj]&kRÝGI§wöáú°f9!ÇÙüCŒ¨!ÆO"ŒÔ{àGÔsØ]ɇâgŸ>Ü=æ><æ2›`ˆqµÂ8IÄq‚zœ0CœÕ 4í¾¤YÝÔR¯Ò¦¬w¹ó’&;¬©MÈq6?Àãjˆñ“ˆãõø¡Š8%AÒÅÏ>6壮G!—ÙœCŒ¨•¾°™Šãõ»nîqœ[@JXï{^U³²hE}ßÒ1VÂðUɘ®\ !CO5¼~—Š÷ÞÁ`ýˆà`G¤ÃúÝëjù­hžÄ³y<¤üxûÉ=6Bö²Ù†P5\PRq`l Þ;6´#VÁÖG‡å¹—·Ål¼Z“/÷ž'~¾[Û~È R• 0Ä@€R` $âÀ@@½w (C,7½Š!žM&ñ–ùõFÌz¼¨fuÑ8Þß%. `ˆa…Á°HÄazï°Š§ÄB5X¼]øösáÙ8kÊŽ·¹¦ñ ÌÆbx@ÔðFîT¨÷!ˆÑ½Ž„è_ë+7íƒÿàƒ7„1G*bÞ²©†P5Ü}¤âÀ¨@½wTpFŒèw¦¡¢yZq ÅÅ™£§Ëb±ú¼™T(ÃŽXÄÄec 1, 0jxJ* Ô{‡uÄPÖ«%¶Áâ·—*>Ä'жOäQò8\t™Ëæb\ô”~Z*Œ Ô{ä‚9C´vrá.ÞßôžŽ~·Z—óîñy·›²2‰Ï]œOkd¬TkÍ2& W^hˆÈÛO𰼩8yqï¼Ví«~o-Šú‰@ì)w j˜~âMDÌQ6À# §Áð T¨÷Ž#ˆ¦ý&‚±†€årZ]N'qRÀO‹U»â°é0¾³ú3ý3¬O>,!IÙC žÃäKÅ!€zïÐŒ(#{c<ã Ñ«›jV]ù†Ás|NšÃlB€!FHO#„D!¨÷Ž鈒¼_&DKÈ;W~æ8ósÆÔ•.I(gnûJ—°ê0n'ÉÍFbèôÄÞð•ŠCõÞ¡# Qý¾‚ɆœWeÛP¼o®s”á](Ç»ñbⲩèì0( ,à —‰ 0$0×\iú-S±ÜÐÓÛöqÜú`Ÿ”JÈg6)ÀC¥§×ð•Rq`° Þ;Z˜ RÞëPtCËóÛél=¯ÃY~eºø¼y}EÜ!ñïjQ¯…ãåΙ˜…l!¦q/ËÃk’©80QïÆ”ÉtOb“’øÕüf}×½Z­¾¸ñ-A=l Òæ(€ÎÓ*€È¿¦>æ:ŠoVŠžø¶ÿÙååf“S1 W¹'Ý'úE1¹ÞÔ §õÓ‘9d#Wf`‡ÈÜËõðs"DfÔuxA•!Bqð ßý8‡v8Ot Ô3¢wÞKÍÍSž( ¾ñªMtö ¯:;ì}W@F3¼U*ö¶+Ìuxo€"‚ƒ&Â>>û< ï)ôœm>óßÝÌÐ7·D­F¶#ØB$¾ëwÌ—6ùÂÿ#N)þ¿¿Z¸{²¬o-²Û³¸¥ÄÕoí~þ*Ú;7‘[b6Èÿî¥Uendstream endobj -794 0 obj << +798 0 obj << /Type /Page -/Contents 795 0 R -/Resources 793 0 R +/Contents 799 0 R +/Resources 797 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 711 0 R -/Annots [ 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R ] +/Parent 715 0 R +/Annots [ 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R ] >> endobj -800 0 obj << +804 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 758.4766 511.2325 767.4329] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.1) >> >> endobj -801 0 obj << +805 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 746.445 511.2325 755.4012] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.2) >> >> endobj -802 0 obj << +806 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 734.5129 511.2325 743.3696] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.3) >> >> endobj -803 0 obj << +807 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 722.3816 511.2325 731.3379] /Subtype /Link /A << /S /GoTo /D (section.4.9) >> >> endobj -804 0 obj << +808 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 710.3499 511.2325 719.3062] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.1) >> >> endobj -805 0 obj << +809 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 698.3182 511.2325 707.2745] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.2) >> >> endobj -806 0 obj << +810 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 675.998 511.2325 684.7301] +/Rect [499.2773 675.998 511.2325 684.8547] /Subtype /Link /A << /S /GoTo /D (chapter.5) >> >> endobj -807 0 obj << +811 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 663.9862 511.2325 672.9425] +/Rect [499.2773 663.9862 511.2325 673.0919] /Subtype /Link /A << /S /GoTo /D (section.5.1) >> >> endobj -808 0 obj << +812 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 651.9545 511.2325 660.9108] +/Rect [499.2773 651.9545 511.2325 661.0603] /Subtype /Link /A << /S /GoTo /D (section.5.2) >> >> endobj -809 0 obj << +813 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 629.6343 511.2325 638.4909] +/Rect [499.2773 629.6343 511.2325 638.3664] /Subtype /Link /A << /S /GoTo /D (chapter.6) >> >> endobj -810 0 obj << +814 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 617.6225 511.2325 626.7282] +/Rect [499.2773 617.6225 511.2325 626.5788] /Subtype /Link /A << /S /GoTo /D (section.6.1) >> >> endobj -811 0 obj << +815 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 605.5908 511.2325 614.5471] +/Rect [499.2773 605.5908 511.2325 614.6966] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.1) >> >> endobj -812 0 obj << +816 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 593.5591 511.2325 602.5154] +/Rect [499.2773 593.5591 511.2325 602.6649] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.1) >> >> endobj -813 0 obj << +817 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 581.5275 511.2325 590.4837] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.2) >> >> endobj -814 0 obj << +818 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 569.4958 511.2325 578.4521] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.2) >> >> endobj -815 0 obj << +819 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 557.4641 511.2325 566.4204] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.1) >> >> endobj -816 0 obj << +820 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 545.4324 511.2325 554.5382] +/Rect [499.2773 545.4324 511.2325 554.3887] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.2) >> >> endobj -817 0 obj << +821 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 533.4007 511.2325 542.5065] +/Rect [499.2773 533.4007 511.2325 542.357] /Subtype /Link /A << /S /GoTo /D (section.6.2) >> >> endobj -818 0 obj << +822 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 521.3691 511.2325 530.3254] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.1) >> >> endobj -819 0 obj << +823 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 509.3374 511.2325 518.2937] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.2) >> >> endobj -820 0 obj << +824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 497.3057 511.2325 506.262] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.3) >> >> endobj -821 0 obj << +825 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 485.274 511.2325 494.2303] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.4) >> >> endobj -822 0 obj << +826 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 473.2424 511.2325 482.1986] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.5) >> >> endobj -823 0 obj << +827 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 461.2107 511.2325 470.167] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.6) >> >> endobj -824 0 obj << +828 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 449.179 511.2325 458.1353] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.7) >> >> endobj -825 0 obj << +829 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 437.1473 511.2325 446.1036] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.8) >> >> endobj -826 0 obj << +830 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 425.1157 511.2325 434.0719] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.9) >> >> endobj -827 0 obj << +831 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 413.084 511.2325 422.0403] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.10) >> >> endobj -828 0 obj << +832 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 401.0523 511.2325 410.0086] +/Rect [499.2773 401.0523 511.2325 410.158] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.1) >> >> endobj -829 0 obj << +833 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 389.0206 511.2325 398.1264] +/Rect [499.2773 389.1203 511.2325 398.1264] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.2) >> >> endobj -830 0 obj << +834 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 377.0886 511.2325 386.0947] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.3) >> >> endobj -831 0 obj << +835 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 365.0569 511.2325 374.063] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.11) >> >> endobj -832 0 obj << +836 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 352.9256 511.2325 362.0313] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.12) >> >> endobj -833 0 obj << +837 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 340.8939 511.2325 349.9997] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.13) >> >> endobj -834 0 obj << +838 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 328.8622 511.2325 337.968] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.14) >> >> endobj -835 0 obj << +839 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 316.8305 511.2325 325.9363] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.15) >> >> endobj -836 0 obj << +840 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 304.7989 511.2325 313.9046] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.16) >> >> endobj -837 0 obj << +841 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 292.7672 511.2325 301.873] +/Rect [499.2773 292.7672 511.2325 301.7235] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.1) >> >> endobj -838 0 obj << +842 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 280.7355 511.2325 289.6918] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.2) >> >> endobj -839 0 obj << +843 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 268.7038 511.2325 277.6601] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.3) >> >> endobj -840 0 obj << +844 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 256.6722 511.2325 265.6285] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.4) >> >> endobj -841 0 obj << +845 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 244.6405 511.2325 253.5968] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.5) >> >> endobj -842 0 obj << +846 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 232.6088 511.2325 241.5651] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.6) >> >> endobj -843 0 obj << +847 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 220.5771 511.2325 229.5334] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.7) >> >> endobj -844 0 obj << +848 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 208.5455 511.2325 217.5017] +/Rect [499.2773 208.5455 511.2325 217.6512] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.8) >> >> endobj -845 0 obj << +849 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 196.5138 511.2325 205.4701] +/Rect [499.2773 196.5138 511.2325 205.6195] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.9) >> >> endobj -846 0 obj << +850 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 184.4821 511.2325 193.4384] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.10) >> >> endobj -847 0 obj << +851 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 172.4504 511.2325 181.5562] +/Rect [499.2773 172.4504 511.2325 181.4067] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.11) >> >> endobj -848 0 obj << +852 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 160.4187 511.2325 169.5245] +/Rect [499.2773 160.4187 511.2325 169.375] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.12) >> >> endobj -849 0 obj << +853 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 148.3871 511.2325 157.3433] +/Rect [499.2773 148.3871 511.2325 157.4928] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.13) >> >> endobj -850 0 obj << +854 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 136.3554 511.2325 145.3117] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.14) >> >> endobj -851 0 obj << +855 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 124.3237 511.2325 133.4295] +/Rect [499.2773 124.3237 511.2325 133.28] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.15) >> >> endobj -852 0 obj << +856 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 112.292 511.2325 121.2483] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.16) >> >> endobj -853 0 obj << +857 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 100.2604 511.2325 109.2166] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.17) >> >> endobj -854 0 obj << +858 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 88.2287 511.2325 97.185] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.18) >> >> endobj -855 0 obj << +859 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 76.197 511.2325 85.1533] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.17) >> >> endobj -856 0 obj << +860 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 64.1653 511.2325 73.1216] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.18) >> >> endobj -796 0 obj << -/D [794 0 R /XYZ 56.6929 794.5015 null] +800 0 obj << +/D [798 0 R /XYZ 56.6929 794.5015 null] >> endobj -793 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R >> +797 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -859 0 obj << -/Length 3451 +863 0 obj << +/Length 3456 /Filter /FlateDecode >> stream -xÚíKSGÇï| -ŽX8P®gWÕîa’qXH 8¼±¶£™tˆéÁóËŸ~«§»ªr˜êj½2°# †ÎÎœüÿ:ëÝ°mêþeÛF*¬ÜÖVE™ÚŽ·èö…ûÝ›-Ö]³ç/ÚƒW½:ßúöµÐÛ–Ø‚ÛçÁ½ ¡Æ°íóÑÏ;ïNÎNÎÏv=ÿ~ëè<Ü:fT4wümëç_éöÈùÿ~‹aÚ¾uÿC ³–o·¤DI!üO®¶Î¶þn~»4M}% Q†ëÄ'á|Æ91V»è”%…p¿k>JA¸sÜ|w9— FŒ¡Òùh.›Íój6¯†³½á堮˫Yg#V“%•±Í™³)Çe=ßÝãŠî¼™ÆãÁtwOr½Cv÷¥øEZ{¿+ïH¬¸!§,fqM“éÅvûÍ)TÉÛíAÃu•Öï¿TÉ®ÅáUOÅ1‚zŒHM”¢<0Âé_ÁÈaù ¥¼®æÕ¤n2¨Gí7?Î¥Å> ½,øle³ 1VÔ@XHı€z,'Ya l# óéb6/G{ŸÊÏ)”!–›bC¡0’>|¡È­÷$Æç4›`ˆ5Ó´Ÿ˜D1¨÷H D˜‚Ebø%fsÙàJVJ‰âÑ”’ÿg}¹'L>ÝÙ0C &('S" &Ô{€©°ÖÐ<É/ÂÒæ"SØâëC§ŸÕ\d€B ÔL³^`A ¼ ®#.F&#-j#-Lê2M ÕVoª<Æ<å’³‰¢6ÙÙ3Œ¡(¤æý­E€„øi7ÌWÚF„Š/‚Ðæ‚£{:THk6,ÀÃʦe?0‰80dPïLI¢µûmQpbÝà@C˜â81ÿÓ°±”õ|×n?_—3—+ùÈ;,PK| -³† P" D ¨÷ˆ¢®¼á- Wƒ™CBPþ5!ñÅ9Ù„‹Oh6.Àà -¦U?.‰80\Pïg`[ÁEÜ­'ï®›¶£A‡¿”‘ ›Ï\6Àã*£‹~.q`\ Þ#ŽÍ]—p![.?׃q5ìz×#×Ùh¿?¹ª†UÓêH¥ž¬ì>1Ù²CLv˜xmúeOÄÉŽzwk„Ø.˜¹JíUw…€Ñ•Jðººj&Ï•ýê[GÝ…õ2d3 1Ơ̦ž%Æê=Ž{('ªP²¦ÿÊ8]é¶6¬M>¶_OËÙd1ÝefgXúŸ 'ËŒfw4?]–Ýg>ñCß)¾,Çn¨£Å㛤 ÉÖbzÃŒcz'âÀôF½‡¦DYJ¤EÔ{©¸Ø,­ì9ö,BÂrq€†+‚ 8¤â@pÀ½G´!’2ˆïpp€ï”¿Ïƒ«–†ò÷ë% ål&/BY8]ŽeŠ§Ú„ãÙ8C '¨(†S" 'Ô{ì·HE\úrÕ††ˆÚ+ù¶ý›2Rq jãÞ£ÚÍ+'ŒjËNí³ÉðSÙ%9þöÝ&Ñ‹¿x)ö ©íó‘­60ÄÔ†ùÆÔNÄ©zjëf²¦]·å—X -9¾vÒ~¨®ªùçVÛÛj~ÙNø»ÒÔ®“HýQêå¤Sb>R&™5XÄcëöáS– 0Ä€€’Øþ“Œ©80 Ö¼³ÄKiœðD*Ù.Ô7“GteÑO”ÃÅ4Pq0©gÕ¨œÚ£½yó·vÜ/_À`=âõû.óÕ¿7ÞËÓš×ÔTŠp× Í»³‚ËŽl3•²?–³PëùrêsÒ͹ýàÊäòwòe^%ÿ©ó Ï~ê€!öÔAA1Šq`4¡ÞMÍÉ,K=M©W[¸¡¶e’uåóàr:™ÌEVHB]?½»¬Ù ˜Î·D(-üÑr¾¨F©[×9”¦»ì™oòÿ_ˆõ¢f 1b!4¶¿L*ŒXÔ{˜òLNM@6nÝO.!)æ¸4ž¹a/¾n¬Ø<-íeGõM»x4©Û3Ì¢ϧ örå3ŸÍ0ĸ‚Êb\%âÀ¸B½G®¨C‰"påwÿ8 ›óÒ«”ºpw`¾ôÍzË%š†µó׋zØž†—ú94¶½Pù´gC 1¨ ¬T‰80¨Pï¾yuåÌUé™ògÙzO/Æî­VÅË4u˜Ó\` !ÌŠf0©8`Ö½§FA¼h´ÜT—ƒ ó]ÆØÎt²øpUÎ.]óÕ”£Þìt7¸ïP\Œt`X¶±Ü ËÄ]—É'G)Ò½„É„AÎÁd<ög2Þ·í³ËɸÄKù2¦É”Ú$g?HÁ {Œ¢€1k`à ~C3Î¥ ‚w¯F1ÝRÏrËýüoÝø¸žtS‰·“é'÷0ý£ý¿ËÉmûÍpà÷à·_šW×\´G»:=Yø;\Âmo»ãÅ?]ùfæµ±!'ÙJCLk˜sLíD˜Þ¨÷P)š®»T^pÞÕŠãzØ*ÖtàC.Ò=¸Ô+ý:¿ -XùJ'‹ñ‡fAö tÞCš²†PŒD¨÷À³„ÝûKLègýÔ ˆOíÁçú_Rø®¼ºv­”/ÍƽPòÙÎF b(A51”q`(­yOõÀ˜-HÁº#©û®’s¾³}]Ö£jXöÏ1³ûv¼ ÒóZ Çö/ÀÂÛ!9X÷šzœ˜‘DqÛå iAµvY~ª'·Wåè¢)©ÍÚ*·/®ì§'$7÷é†ÈÓ³"FL"ŒÔ{è~1͉”ÝyËý¶ûe›G¨­´¯¦UÙ¦þ®šÍ'ÓÏ«'¬CC|xrv§Ånׂ -Êž ->YÙ(C (†B" Ô{("%¢PžÞ‘7e]N}+ˆ|Z~ìZê°-ç¸þ¸Ü¾œ"+ì3YsÄ5P:æî¾`tv{Ð0ÆÝû7Ú0Ú¿öŸ -#u‹„týtÓ¦Üo§ð›"qüþ¦èžúÑÈ¿tÿŠç×£Ûwÿ¸¯¬Yµ×Ïx“·—Ñç1`ˆauB1I‚a‚ºDÄU1O‰h È«êÃU5¹˜®/?G0B+q¶¸¸(›—ïûÂ2¹Q^ËŒàü™”Ÿ¹l.€!ÆTå"Æê>–. cÝ™Éýöå]Mù8-[8í[å]ëáwCŒ»þª‡åôõÁ¬%ÂþÄ;^1Ÿ²l"€!F”%"Fê>Á¸½éHï”fWí‡ù‡ÓÁdžkùËå>Ðø¬fC 1h jŒö/µ¤Á AÝhšvFuç%÷Ûwû4Ì€×nN† P;ö?„yßv0¢Ø3)>U¹ ;„(†A" -„‚5ß©Ù­‰¤-€¯šæ@ì¼ÔáÕo׃‹Ô”Ovg»iÂÇç"^žšîY½g›‰þÃÜñ^ØŸ¹ã0ù²UEoWi^-›QawFÕÅ“ª‘_Á1½NýNܧ,š!P#k=„5ÂÂrÜã–$÷§7ÿe,<~îïFÆ¿nÙ¼¬ÆôýÁ.A­‹œ6‰Is¯æƒ*dKîò"ùû\,Œendstream +xÚí[SÜFÇßùó°U tú&u÷îÃ.슱Hek“<ŒgäAeF"sx?ý¶Fêî3Lë ½‰âªƒŽÎ™óÿéô]°µØ@g„ +#ÊH’Q– FÓ:˜ØŸ½ÙaÝ5ûî¢}xÕ«‹o^ 50Ää<\|÷Ò„jÍãŸvß^Ÿ^œïýrñÝÎñ…¿)t̨hîøëÎO¿ÐÁØúÿn‡at6¸µÿ „ÃÓ™ ’I!Üw®vÎwþåo~º2}Lh’i®"Ÿ„ ðIçDe£Ë É…ýYóQr­ãæƒØ˸\0¢5•ÖGsÙ|1\”óE9šï.‡UU\Í;±ž,™iÓÙœ[›bZT‹½}žÑÝ7³át:œííK®vÉÞ~Féþ%¹ß•w$θ&9§,dqC“ÙdÐ~qUrvûÐpS¥Íû7©Tl#§z,ŒÔ{`D*’e”{F8ý39*~¦”W墬«ö;ÃjÜ~ñÃ|8)¬(æ‘èeÁe+™`ˆ±ÕP¼Ÿ…H ¨÷À‚°’å°À¶²°˜-ç‹b¼ÿ©øƒ ÓÄpo)ZÒ‡/©õâžÄ¸œ& 1b f1‘80bPï.ˆÐ9 Äð/JÌö²Á3ñ89éÄ¥0`ˆ%‰Ä‚z€0F•±›²¸€Á¥ý@*ÛRJ2!M)ù#ëË=aréN† b0A91˜"q`0¡Þ=L¹1¶À€æI~–¶™Üä_:}̸¬¦"ìb fJô áupÑŠ0hɶÒòߺ*â´PeԶʣõS.9Û(j“ ‘7à +B*ÙÐFAˆß²ÃüL™€PþEÚ^pTÆžN#åÓš 0Äp²©¼˜H2¨w–I¢”ýižsbìà@C˜âX1ÿÓ°±’õbÏŽn?_s›+ùÈ;,PK\ +“† P" H ¨÷HFmyÂ[@¯†s‹„ ükBâ‹s² —Ðd\€!† L©~\"q`¸ Þ.Ö@3¶†‹¸[OÞ]7mGƒ)#^7—¹d.€!ÆTFé~."q`\ Þ–Åm—p![.Ž>WÃi9êz×cÛÙh¿~__•£²iud–=YÙ]b’e†˜ì0ñšöˉ“õn™+`ˆq•Å¸ŠÄq…z÷\ÙbiI‘+·Ãü‡¹ßð_¥T¹½s¥oÞ[Ö(QÔ¯¿^V£ö R=‡Æ¶*ŸöT¨ !Õš¬T±8¨pï®yåJ5ßëÞ7ãÏGöžˆ Ý[•å/sÕq`\N“†0P3 ˜H0Þc£ že¤{Ÿ•îÆ@{Œ±ÝY½üpUÌ/mëÕT£Þä´ö÷è„Ë‘aˆÉô/ö…[aI¸ã/úÌHAïÞ—¢ýç°žNÝŸ÷mÛl2mðR¾ŒgÒ#—æäÇb”ã&Fê=4æMNf"ßIÙgêïí¿.ëÛö‹ÑÐîhÿj^Š4iŸvÕº^º;\ýmo»~ã䶈3ý˜ZZ—“dÅ!¦8Ì9¦x$LqÔ»¯vlÉòî­(zÕwkªÆI5jkºñ¾ç^«ÉZïέ–n¿Òérú¡Yf¹y]xŸ¦d€!Æ”c ÆêÝ3@¡š9\oëÇæhNxjï<×oÜ·ÅÕµ}h¥|i@î…’Ëv2JÀC ª‰¡‰CiÃ{¬Æ´$7íaç[É9ß=¸¾.ªq9*"3Í‚X:U0ÛÖë®ß‡±.ØÝû6á0Ú¿ ï‡$aÓmìybŠ)»ó˜Mª”MÃèSUß^ãISS›%Vn^ú_÷|œ¤.¹÷}|<2À0öøܽÿVd"`è î}Œå”ˆ<óì4ô˜æ!jkí«YYtõ¿-ç‹zöyýô¾oŠNÏï´ÙíšPNÙbÁ%+™`ˆ±Å@Yˆ‚±€º÷eDÚþ˜îŽc4]³¦Œ¼)ªbæ:Y^å³âc×Xûý9'ÕÇÕFñÕ\YnžÉâ“SÎå.™ `ˆ‘µa´ËG,Œ Ô}¨"'¶­÷h¸*qòþ&ïûñؽÑŽç©9{`ÿkO¿æB=ãíÞNF—ÇdL€!† Ô Å$† êÞ. cÝaʃ¦_ßW凫²žÌ†×—Ÿ¾™8_N&Eó›\aŽí@¯eFpþLʇË\2Àã*ƒr ãuÊ㶻®<®|œ¿.­ö­ò¶õpÛ"¦]ÕÁröúpÞ¡&ÝN—²d"€!F”%"FêÞÑ”Œ¬; yо%jÕž4{½*7Ð?š ?6Ã_Æ(÷`Æ%5`‡%c´½% êÛã¢ÑJ\D‹ x›ËQ=Z‚ªqðÁOú¶ãŒ=“ÂáR• +°C €B`D¢@ Øð›êÉ3"x»¼õªiÄîÛaåß(x=œ ó=í}g{ÂåÈ\ˆ‡QìõÞî^ ð¿½qŸÝ.ÞüŸ1ÿ„ü¾_~¥eó6Ý÷[º56b*Íïòmìvk/‘ÿ§07endstream endobj -858 0 obj << +862 0 obj << /Type /Page -/Contents 859 0 R -/Resources 857 0 R +/Contents 863 0 R +/Resources 861 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 711 0 R -/Annots [ 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R ] +/Parent 715 0 R +/Annots [ 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R ] >> endobj -861 0 obj << +865 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 758.4766 539.579 767.4329] +/Rect [527.6238 758.5763 539.579 767.5824] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.19) >> >> endobj -862 0 obj << +866 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 746.3946 539.579 755.3509] +/Rect [527.6238 746.4943 539.579 755.3509] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.20) >> >> endobj -863 0 obj << +867 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 734.3125 539.579 743.2688] +/Rect [527.6238 734.4122 539.579 743.2688] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.21) >> >> endobj -864 0 obj << +868 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 722.2305 539.579 731.1868] +/Rect [527.6238 722.3302 539.579 731.1868] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.22) >> >> endobj -865 0 obj << +869 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 710.1484 539.579 719.1047] +/Rect [527.6238 710.2481 539.579 719.1047] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.23) >> >> endobj -866 0 obj << +870 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 698.1661 539.579 707.1721] +/Rect [527.6238 698.0664 539.579 707.0227] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.24) >> >> endobj -867 0 obj << +871 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 686.084 539.579 694.9406] +/Rect [527.6238 686.084 539.579 695.0901] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.25) >> >> endobj -868 0 obj << +872 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 674.002 539.579 683.008] +/Rect [527.6238 673.9023 539.579 682.8586] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.26) >> >> endobj -869 0 obj << +873 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 661.9199 539.579 670.926] +/Rect [527.6238 661.8203 539.579 670.7765] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.1) >> >> endobj -870 0 obj << +874 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 649.7382 539.579 658.6945] +/Rect [527.6238 649.8379 539.579 658.6945] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.2) >> >> endobj -871 0 obj << +875 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 637.6562 539.579 646.6124] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.3) >> >> endobj -872 0 obj << +876 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 625.5741 539.579 634.5304] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.26.4) >> >> endobj -873 0 obj << +877 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 613.4921 539.579 622.4483] /Subtype /Link /A << /S /GoTo /D (section.6.3) >> >> endobj -874 0 obj << +878 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 601.41 539.579 610.3663] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.1) >> >> endobj -875 0 obj << +879 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 589.328 539.579 598.2842] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.1) >> >> endobj -876 0 obj << +880 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 577.2459 539.579 586.2022] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.2) >> >> endobj -877 0 obj << +881 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 565.1639 539.579 574.1201] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.2) >> >> endobj -878 0 obj << +882 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 553.0818 539.579 562.1876] +/Rect [527.6238 553.0818 539.579 562.0381] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.3) >> >> endobj -879 0 obj << +883 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 540.9998 539.579 550.1055] +/Rect [527.6238 540.9998 539.579 549.956] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.4) >> >> endobj -880 0 obj << +884 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 528.9177 539.579 537.874] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.5) >> >> endobj -881 0 obj << +885 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 516.8357 539.579 525.792] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.1) >> >> endobj -882 0 obj << +886 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 504.7536 539.579 513.7099] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.2) >> >> endobj -883 0 obj << +887 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 492.6716 539.579 501.6279] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.3) >> >> endobj -884 0 obj << +888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 480.5895 539.579 489.5458] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.6) >> +/A << /S /GoTo /D (subsubsection.6.3.5.4) >> >> endobj -885 0 obj << +889 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 468.5075 539.579 477.4638] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.7) >> +/A << /S /GoTo /D (subsection.6.3.6) >> >> endobj -886 0 obj << +890 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 456.4254 539.579 465.3817] /Subtype /Link -/A << /S /GoTo /D (section.6.4) >> +/A << /S /GoTo /D (subsection.6.3.7) >> >> endobj -887 0 obj << +891 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 444.3434 539.579 453.2997] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.0.1) >> +/A << /S /GoTo /D (section.6.4) >> >> endobj -888 0 obj << +892 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 432.2613 539.579 441.2176] /Subtype /Link -/A << /S /GoTo /D (subsection.6.4.1) >> +/A << /S /GoTo /D (subsubsection.6.4.0.1) >> >> endobj -889 0 obj << +893 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 420.1793 539.579 429.1356] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.1.1) >> +/A << /S /GoTo /D (subsection.6.4.1) >> >> endobj -890 0 obj << +894 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 408.0972 539.579 417.0535] /Subtype /Link +/A << /S /GoTo /D (subsubsection.6.4.1.1) >> +>> endobj +895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 396.0152 539.579 405.1209] +/Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.2) >> >> endobj -891 0 obj << +896 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 396.0152 539.579 404.9715] +/Rect [527.6238 383.9331 539.579 392.8894] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.3) >> >> endobj -892 0 obj << +897 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 383.9331 539.579 392.8894] +/Rect [527.6238 371.8511 539.579 380.8074] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.4) >> >> endobj -896 0 obj << +901 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 371.8511 539.579 380.9568] +/Rect [527.6238 359.769 539.579 368.7253] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.5) >> >> endobj -897 0 obj << +902 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 349.279 539.579 358.0111] +/Rect [527.6238 337.1969 539.579 345.9291] /Subtype /Link /A << /S /GoTo /D (chapter.7) >> >> endobj -898 0 obj << +903 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 337.2168 539.579 346.1731] +/Rect [527.6238 325.1348 539.579 334.091] /Subtype /Link /A << /S /GoTo /D (section.7.1) >> >> endobj -899 0 obj << +904 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 325.1348 539.579 334.2405] +/Rect [527.6238 313.0527 539.579 322.009] /Subtype /Link /A << /S /GoTo /D (section.7.2) >> >> endobj -900 0 obj << +905 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 313.0527 539.579 322.1585] +/Rect [527.6238 300.9707 539.579 309.9269] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.1) >> >> endobj -901 0 obj << +906 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 300.9707 539.579 310.0764] +/Rect [527.6238 288.8886 539.579 297.8449] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.2) >> >> endobj -902 0 obj << +907 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 288.8886 539.579 297.9944] +/Rect [527.6238 276.8066 539.579 285.7628] /Subtype /Link /A << /S /GoTo /D (section.7.3) >> >> endobj -903 0 obj << +908 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 266.3165 539.579 275.0487] +/Rect [527.6238 254.2345 539.579 262.9666] /Subtype /Link /A << /S /GoTo /D (chapter.8) >> >> endobj -904 0 obj << +909 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 254.2544 539.579 263.2106] +/Rect [527.6238 242.1723 539.579 251.1286] /Subtype /Link /A << /S /GoTo /D (section.8.1) >> >> endobj -905 0 obj << +910 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 242.1723 539.579 251.1286] +/Rect [527.6238 230.0903 539.579 239.0465] /Subtype /Link /A << /S /GoTo /D (subsection.8.1.1) >> >> endobj -906 0 obj << +911 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 230.0903 539.579 239.0465] +/Rect [527.6238 218.0082 539.579 226.9645] /Subtype /Link /A << /S /GoTo /D (section.8.2) >> >> endobj -907 0 obj << +912 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 218.0082 539.579 226.9645] +/Rect [527.6238 205.9262 539.579 214.8824] /Subtype /Link /A << /S /GoTo /D (section.8.3) >> >> endobj -908 0 obj << +913 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 195.4361 539.579 204.1683] +/Rect [522.6425 183.3541 539.579 192.2107] /Subtype /Link /A << /S /GoTo /D (appendix.A) >> >> endobj -909 0 obj << +914 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 183.3739 539.579 192.3302] +/Rect [522.6425 171.2919 539.579 180.3976] /Subtype /Link /A << /S /GoTo /D (section.A.1) >> >> endobj -910 0 obj << +915 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 171.2919 539.579 180.2482] +/Rect [522.6425 159.2098 539.579 168.3156] /Subtype /Link /A << /S /GoTo /D (subsection.A.1.1) >> >> endobj -911 0 obj << +916 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 159.2098 539.579 168.3156] +/Rect [522.6425 147.1278 539.579 156.2335] /Subtype /Link /A << /S /GoTo /D (section.A.2) >> >> endobj -912 0 obj << +917 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 147.1278 539.579 156.2335] +/Rect [522.6425 135.0457 539.579 144.1515] /Subtype /Link /A << /S /GoTo /D (subsection.A.2.1) >> >> endobj -913 0 obj << +918 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 135.0457 539.579 144.1515] +/Rect [522.6425 122.9637 539.579 132.0694] /Subtype /Link /A << /S /GoTo /D (section.A.3) >> >> endobj -914 0 obj << +919 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 122.9637 539.579 132.0694] +/Rect [522.6425 110.8816 539.579 119.9874] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.1) >> >> endobj -915 0 obj << +920 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 110.8816 539.579 119.9874] +/Rect [522.6425 98.7996 539.579 107.9053] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.2) >> >> endobj -916 0 obj << +921 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 98.7996 539.579 107.9053] +/Rect [522.6425 86.7175 539.579 95.8233] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.3) >> >> endobj -917 0 obj << +922 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 76.2275 539.579 85.0841] +/Rect [522.6425 64.1455 539.579 73.0021] /Subtype /Link /A << /S /GoTo /D (appendix.B) >> >> endobj -918 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 64.1653 539.579 73.2711] -/Subtype /Link -/A << /S /GoTo /D (section.B.1) >> ->> endobj -860 0 obj << -/D [858 0 R /XYZ 85.0394 794.5015 null] +864 0 obj << +/D [862 0 R /XYZ 85.0394 794.5015 null] >> endobj -857 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R >> +861 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -921 0 obj << -/Length 844 +925 0 obj << +/Length 881 /Filter /FlateDecode >> stream -xÚíÙOOÛ0ð{>EŽí!žŸÿûÊ“80mô†8°&” Ún”iÚ>ýœ66¯ÔyR ì!”@ýìg¿ŸÒ8’‡(µaÆ _Z¯˜æ Ëù²àå"|ö©€®MU¸Õɬøp&mé™7”³ÛRiÍ„ÞvæwÊY}5ùøùbvz1»œ^Ï΋ÓYê \¶]þ,®®yY‡ΠΤwºüþà ¼å²PZ2­¤Œÿy(.‹/©Côé64;àLH#2SMÅ3Ò„ä´'á£v&'LL+/ýän½yšVÚŠ ÎÇÃö ¼?Zg/°(hùP‡Tƒê>.ÊÝÉWTïWáÀÃzö߀¨€r‰PÜÈá7e™±:nrÇ­^m6ͼª7·Sp“õò¾ù3­¤s£¦W3Š =˜ -¤áBˆ~F™D(Fäð‰‘ÔÌ -ð#µÇ(à‰Žn¾5ÓÊq?Ú`'®î`;(²ƒ« ûíd¡ìÃ';B2kŒëìè—vÍ*¬¯Òã÷Ú‘4Åõ¬ Ršp=t¿¦L"”&rø¤ €9Ói2{š6ß«¿ëUÓz’#¤·BŠK= -¤ áRØ~H™D(Häð’ñž9mTÉî ­n–M]Íïšùý|½ºVF‹QÐk¥5*‚öjzå!ÑÃ'AÎ2Ï!nåÜ îR¤ÇkÐëÅ5,R‚p AôßVç¡‘Ã'AV3¯LÜy$(ÜD{=îÿßÿŸj0X -¤„áƒPýÂ2‰PÂÈá“0#™÷ySœqÇãîo÷ìÙÔVæAµC´ZŠl{+¿m¹×«vÃi»–£Ñ£:Œ•ìR±Ä[&Ê!9|r(\À§ãæäóu¯j±mŸiIã5â²F…)T¸¬ ‰{µL"¨ÒëÃJ{ѾšT¹7ˆá˜×Z¼ý}åókUe™tNä§+gÞJ_JÍÚ¾ÚÉšÞ©vPæÿ¾ªË“endstream +xÚíÙOOÛ0ð{>EŽí!ÆÏÿ}e‚I˜6zC  AÛ2MÛ§ŸÓÆæ•:O +NB ÄÏ~ñû)µ(yøRf¼ð¥õŠiºœ. +^Îù¯´mªØ¨Â­Ž'ÅÑ©´¥gÞSNnK¥5zÓ™cÜ9('³ËÑ—oç““óÉÅøjrVœLR¯xdà²éòWqyÅËYHà¬àLz§Ë?áÎÀ{Q. +¥%ÓJÊøŸÇâ¢øž:Dg7¡Ù+΄4"s)B¢K±ÀŒ4!9íÃA8Õ\É1ƒqå¥ÍîçáÀ‹Wšóácó¡¼?Xg¯¬(dùP†T½â>ÍËíÁTîWáÀýrï÷ßÔ¸ÝCýä¡´‘Ã'mÊ2c-´ÚÄVÛÝjýæÅÜ>Ÿ[,Hon(↠ º¹e¡¸‘Ã'nR3+À·Üd{s[®×õ´š­oŸÆàF«ÅCýw\IçMof'º7#H1Â…PÝŒ2‰PŒÈá#!™5ƵŒÔ£€':z¼¾©Ç•ã~°ÓÃNœÝÞvP eW@wÛÉ$BÙ!‡Ov˜0­ýÚμ^†ùUzø^;¦8ß½5¡@J®'±~Ê$Bi"‡šŒ÷Ìi£ZMfGÓú~¾ü·ZÖ'9@z'¤4Õ}!á@ÒN)|'¤\"$zøÉYæ9ÄmŸÝBZ^/êY5½«§ÓÕòv\-Ao縷 H Â5!»e¡‘Ã'AV3¯LÜʹ=Aí­H÷ · ŠsÜ[ +¤á‚è^Vç¡‘Ã'AF2ïyÜy$(,¢½öÿ¿ÿO5è- RÂpA˜na™D(aäðI˜ŒK7nÀä6ÄÖ¿ήŸë晓x}$¯X€Þ¼P Å ±ˆÊ$Bñ"‡O¼gÜñ¸·ØòzZΦáÜðóӽŊôö†)o¸â ‰%W&Ê9|ò&¡ãîoû4õèTj+ó š!šF E¶YÊoZîôj y|aÛ–ƒÑƒ:Œ•êíR±ÄÂ-“å>9ÃÀòôÎP¾Ü÷ªÛæ™–9Üã‹*N{oT(B…Ë +’X«eÙC•^VWÚqf¥¹÷Õá˜×Þÿvüå%¾²L:'ò—+B6ÞJ_JÍB_Û½O÷µÆV(÷ÿŽžA·endstream endobj -920 0 obj << +924 0 obj << /Type /Page -/Contents 921 0 R -/Resources 919 0 R +/Contents 925 0 R +/Resources 923 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 711 0 R -/Annots [ 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 936 0 R 937 0 R ] +/Parent 715 0 R +/Annots [ 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 941 0 R 942 0 R ] >> endobj -923 0 obj << +927 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 758.4766 511.2325 767.5824] /Subtype /Link -/A << /S /GoTo /D (section.B.2) >> +/A << /S /GoTo /D (section.B.1) >> >> endobj -924 0 obj << +928 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 746.6211 511.2325 755.6272] /Subtype /Link +/A << /S /GoTo /D (section.B.2) >> +>> endobj +929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 734.666 511.2325 743.672] +/Subtype /Link /A << /S /GoTo /D (section.B.3) >> >> endobj -925 0 obj << +930 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 734.5663 511.2325 743.672] +/Rect [494.296 722.6111 511.2325 731.7169] /Subtype /Link /A << /S /GoTo /D (section.B.4) >> >> endobj -926 0 obj << +931 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 722.6111 511.2325 731.7169] +/Rect [494.296 710.7556 511.2325 719.7617] /Subtype /Link /A << /S /GoTo /D (section.B.5) >> >> endobj -927 0 obj << +932 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 710.7556 511.2325 719.7617] +/Rect [494.296 698.7008 511.2325 707.8065] /Subtype /Link /A << /S /GoTo /D (section.B.6) >> >> endobj -928 0 obj << +933 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 698.8005 511.2325 707.8065] +/Rect [494.296 686.7456 511.2325 695.8514] /Subtype /Link /A << /S /GoTo /D (section.B.7) >> >> endobj -929 0 obj << +934 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 686.8453 511.2325 695.8514] +/Rect [494.296 674.8901 511.2325 683.8962] /Subtype /Link /A << /S /GoTo /D (section.B.8) >> >> endobj -930 0 obj << +935 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 674.8901 511.2325 683.8962] +/Rect [494.296 662.8353 511.2325 671.941] /Subtype /Link /A << /S /GoTo /D (section.B.9) >> >> endobj -931 0 obj << +936 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 662.935 511.2325 671.941] +/Rect [494.296 650.8801 511.2325 659.9859] /Subtype /Link /A << /S /GoTo /D (section.B.10) >> >> endobj -932 0 obj << +937 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 650.8801 511.2325 659.9859] +/Rect [494.296 638.925 511.2325 648.0307] /Subtype /Link /A << /S /GoTo /D (section.B.11) >> >> endobj -936 0 obj << +941 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 638.925 511.2325 648.0307] +/Rect [494.296 626.9698 511.2325 636.0755] /Subtype /Link /A << /S /GoTo /D (section.B.12) >> >> endobj -937 0 obj << +942 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 626.9698 511.2325 636.0755] +/Rect [494.296 615.0146 511.2325 624.1204] /Subtype /Link /A << /S /GoTo /D (section.B.13) >> >> endobj -922 0 obj << -/D [920 0 R /XYZ 56.6929 794.5015 null] +926 0 obj << +/D [924 0 R /XYZ 56.6929 794.5015 null] >> endobj -919 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R >> +923 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -940 0 obj << +945 0 obj << /Length 2175 /Filter /FlateDecode >> @@ -2632,51 +2642,51 @@ x (ÁÝîx‰kàXÛòä¾)Óò³B£:Ò96&'ȉj\@4@a&I‹#õ‡ƒ«ËÊgÿ™Ãç)W:fïHOæDOØ[ÚðÃö˜ÑR¥Jšgö ÔŠ|\ôz×I ¬!lïþ…Üϸ®ó:ÚÝW÷»ªÙ´Åa{œË€tP‘G0‰ÁúPbç…2gª n‹ÇRÛ‘|ˆ*xáx ãRè'˜tºªºÏcLi >kòiLaÕýeÕ¦¤jŠóGϾMM¥åO]¼ÞUõW–¡ŒŽsÏegè>Q¬ƒ¿Ÿ܈Aâ–l\À‡BÇzï8;Qýo¼V‹oïNßolu …gêF)üǛ߿üÊ–å‚-X°TZ“-Ÿ ÃÀšP)îJB“e&Žì·‹ý³¢£Báª8ÁZÔŒèž.µŠgZqNÌðÓ©)šàC*XFAŽ¶Š®<¡|¢ëJÌ~f“‡s³oñuZŸ–|Am ¥£‚ÊgªöÏ7‚%WáÒõÇÝå!2‘§*ϲW<„Pf1ŸôiîÿNB¦\ü'Îg\…“€¢ÝZyþÀ)gá$5P ²MáÓŽ‚Ëx¿õŸC ®•’p¹gbçN"ùéß?¾AÉmÓõ#IàµPÏ|>Ø‘¢wI>Ü‚éž_»'‚€k÷ÓWT¾^Gôè”_g¸¢Ÿ[Ì3‡è‘徫~÷›ý>Ue¿½ÞWÓ÷/ÞèèWäB¡Êò—ÀËeʤˆëÏiX¥9ï0|?£^Ÿ+¯Ì,~ÆÊôsPh¾mvåu(½šêk(Y2ËíKHbpMÓ°Åùˆ/K" ýç@4Úâµ0ô\ë+4ÖúB×€ójêþUp#àŽÍ4‡Ú #µPãßþ.~‚ýíÔ7ÆÌþPÿƒÛZêNœE„”‚©% y/è ³ÇŸÏ+ÅÝþ üLtendstream endobj -939 0 obj << +944 0 obj << /Type /Page -/Contents 940 0 R -/Resources 938 0 R +/Contents 945 0 R +/Resources 943 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 951 0 R +/Parent 956 0 R >> endobj -941 0 obj << -/D [939 0 R /XYZ 85.0394 794.5015 null] +946 0 obj << +/D [944 0 R /XYZ 85.0394 794.5015 null] >> endobj 6 0 obj << -/D [939 0 R /XYZ 85.0394 769.5949 null] +/D [944 0 R /XYZ 85.0394 769.5949 null] >> endobj -942 0 obj << -/D [939 0 R /XYZ 85.0394 582.8476 null] +947 0 obj << +/D [944 0 R /XYZ 85.0394 582.8476 null] >> endobj 10 0 obj << -/D [939 0 R /XYZ 85.0394 512.9824 null] +/D [944 0 R /XYZ 85.0394 512.9824 null] >> endobj -943 0 obj << -/D [939 0 R /XYZ 85.0394 474.7837 null] +948 0 obj << +/D [944 0 R /XYZ 85.0394 474.7837 null] >> endobj 14 0 obj << -/D [939 0 R /XYZ 85.0394 399.5462 null] +/D [944 0 R /XYZ 85.0394 399.5462 null] >> endobj -944 0 obj << -/D [939 0 R /XYZ 85.0394 363.8828 null] +949 0 obj << +/D [944 0 R /XYZ 85.0394 363.8828 null] >> endobj 18 0 obj << -/D [939 0 R /XYZ 85.0394 223.0066 null] +/D [944 0 R /XYZ 85.0394 223.0066 null] >> endobj -945 0 obj << -/D [939 0 R /XYZ 85.0394 190.9009 null] +950 0 obj << +/D [944 0 R /XYZ 85.0394 190.9009 null] >> endobj -946 0 obj << -/D [939 0 R /XYZ 85.0394 170.4169 null] +951 0 obj << +/D [944 0 R /XYZ 85.0394 170.4169 null] >> endobj -947 0 obj << -/D [939 0 R /XYZ 85.0394 158.4617 null] +952 0 obj << +/D [944 0 R /XYZ 85.0394 158.4617 null] >> endobj -938 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F48 950 0 R >> +943 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -954 0 obj << +959 0 obj << /Length 3187 /Filter /FlateDecode >> @@ -2703,66 +2713,66 @@ W ½þ`J9ÿdÑÆÇVþ¢Ì!ûȨÀÌBÖ?e‘úñcΗ`ùX¹žŸš¦-zXæç-@fØ:\a½ã¶Gî7žÛù¨ß•=Éȧv)½»@2wl(kz+0h´zx6éqŸSS> u»žQ¶àðI¼þ˜CÍ-í‚f¡œoMoqÓâ›äÚµ|Éï…2VDÓWÜãÒ|ññþkÿ=êø_bP*˜4Õ/øÃ[Df@ ž!þêóy©òendstream endobj -953 0 obj << +958 0 obj << /Type /Page -/Contents 954 0 R -/Resources 952 0 R +/Contents 959 0 R +/Resources 957 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 951 0 R -/Annots [ 961 0 R 962 0 R ] +/Parent 956 0 R +/Annots [ 966 0 R 967 0 R ] >> endobj -961 0 obj << +966 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.8897 207.1951 329.1084 219.2548] /Subtype /Link /A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >> >> endobj -962 0 obj << +967 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [190.6691 179.6723 249.6573 189.0819] /Subtype /Link /A << /S /GoTo /D (rfcs) >> >> endobj -955 0 obj << -/D [953 0 R /XYZ 56.6929 794.5015 null] +960 0 obj << +/D [958 0 R /XYZ 56.6929 794.5015 null] >> endobj -956 0 obj << -/D [953 0 R /XYZ 56.6929 756.8229 null] +961 0 obj << +/D [958 0 R /XYZ 56.6929 756.8229 null] >> endobj -957 0 obj << -/D [953 0 R /XYZ 56.6929 744.8677 null] +962 0 obj << +/D [958 0 R /XYZ 56.6929 744.8677 null] >> endobj 22 0 obj << -/D [953 0 R /XYZ 56.6929 651.295 null] +/D [958 0 R /XYZ 56.6929 651.295 null] >> endobj -958 0 obj << -/D [953 0 R /XYZ 56.6929 612.4036 null] +963 0 obj << +/D [958 0 R /XYZ 56.6929 612.4036 null] >> endobj 26 0 obj << -/D [953 0 R /XYZ 56.6929 555.4285 null] +/D [958 0 R /XYZ 56.6929 555.4285 null] >> endobj -959 0 obj << -/D [953 0 R /XYZ 56.6929 530.6703 null] +964 0 obj << +/D [958 0 R /XYZ 56.6929 530.6703 null] >> endobj 30 0 obj << -/D [953 0 R /XYZ 56.6929 416.0112 null] +/D [958 0 R /XYZ 56.6929 416.0112 null] >> endobj -960 0 obj << -/D [953 0 R /XYZ 56.6929 391.253 null] +965 0 obj << +/D [958 0 R /XYZ 56.6929 391.253 null] >> endobj 34 0 obj << -/D [953 0 R /XYZ 56.6929 164.815 null] +/D [958 0 R /XYZ 56.6929 164.815 null] >> endobj -963 0 obj << -/D [953 0 R /XYZ 56.6929 137.4068 null] +968 0 obj << +/D [958 0 R /XYZ 56.6929 137.4068 null] >> endobj -952 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> +957 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -968 0 obj << +973 0 obj << /Length 3415 /Filter /FlateDecode >> @@ -2781,60 +2791,60 @@ J$ ?6`³> endobj -971 0 obj << +976 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 463.1122 539.579 475.1718] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj -972 0 obj << +977 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 451.8246 133.308 463.2167] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj -969 0 obj << -/D [967 0 R /XYZ 85.0394 794.5015 null] +974 0 obj << +/D [972 0 R /XYZ 85.0394 794.5015 null] >> endobj 38 0 obj << -/D [967 0 R /XYZ 85.0394 570.5252 null] +/D [972 0 R /XYZ 85.0394 570.5252 null] >> endobj -970 0 obj << -/D [967 0 R /XYZ 85.0394 541.3751 null] +975 0 obj << +/D [972 0 R /XYZ 85.0394 541.3751 null] >> endobj 42 0 obj << -/D [967 0 R /XYZ 85.0394 434.1868 null] +/D [972 0 R /XYZ 85.0394 434.1868 null] >> endobj -973 0 obj << -/D [967 0 R /XYZ 85.0394 406.5769 null] +978 0 obj << +/D [972 0 R /XYZ 85.0394 406.5769 null] >> endobj 46 0 obj << -/D [967 0 R /XYZ 85.0394 301.1559 null] +/D [972 0 R /XYZ 85.0394 301.1559 null] >> endobj -974 0 obj << -/D [967 0 R /XYZ 85.0394 276.6843 null] +979 0 obj << +/D [972 0 R /XYZ 85.0394 276.6843 null] >> endobj 50 0 obj << -/D [967 0 R /XYZ 85.0394 200.1512 null] +/D [972 0 R /XYZ 85.0394 200.1512 null] >> endobj -975 0 obj << -/D [967 0 R /XYZ 85.0394 175.6796 null] +980 0 obj << +/D [972 0 R /XYZ 85.0394 175.6796 null] >> endobj -966 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> +971 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -979 0 obj << +984 0 obj << /Length 2458 /Filter /FlateDecode >> @@ -2847,39 +2857,39 @@ Y K³ËZ! U¢|õ },ä-T\Èiù)¶†—™M¬)¢Ût‡KBaŒÂ´˜ŸS7`\&Ö^±¡‰&&Ú¡Ù’å^_ˆ¼=¢ µŽ¸Š©/@ð$.˜Á²n 0ãf—«{/Qc‡çöùŽ±Éñ¡ÚÖ=¯tñÍX>Ëî)z /{0„öG1Y C*5÷Hò|ÅjAÀùеa0ÂXë–KƯ,†•p=†”Fä9‰ñléÜî|uÚ$1Sû52Ñ”*?õVù8ijÞC@üû 3ß‚ü¹=á¬zÛ”SsÀÖ'¨‹«ƒNøÒÕæOwíi¸þáñé=|ë5ë~ÒÅÀªƒtk¨€ƒ6¼Ý ]´Né!)½=Á˜*5$ÐyúÿPŠrla±Ö¯æj§›íb5% îÖfÏX.]äü©pšwzc 4vÖ׳Ü]Õ°»“™2_$¡OæÖ#ç’_åpÚÐØ°ö4uîëÜzû.—H38Bn«‚'äô°…ïúýuoõÖV1J¹–cݽŒñ=Ãm}„R/"$•§Ž4÷•>‚tùª[«_Ð@âIŠý[†a{ÓШk/O \¯\iܽŒ‹µyîbm^`8O_Š­j˜=:9M®<uH&)!Íf¹² E ¤òïFÜÙ Ív¤Yžú*Ï]‚ÍŽb7KFY!ëö4¹é>a±¬z Ù\˜"T‘2»Œ·SCNE˜"¿ÄTz[Õ•=L A05h1„u”»œdkM9C€/¥x$ue¿r~EÇðyΟ¯Ž&áèBg Ú½.ßóh¦·\Q&ɧw%±»Üéu©®Œ¡™ÐÙ^ôÃo)Ó$TK …3¸U£©UPk\‘;cpËÜÓ…à8~*”©DGÊR³)=„ò6MÄU$ä¨U“—¿pf¥ÉÖ\:âç¥Z¾þ®Úé=YO½å¼zxã¿H_ø‡ÈÂ?!á˜èþïÿ]¦¿Ÿ¢4PY&—ÿRÁá("Ì”K©á çþš[Öÿ xK:óendstream endobj -978 0 obj << +983 0 obj << /Type /Page -/Contents 979 0 R -/Resources 977 0 R +/Contents 984 0 R +/Resources 982 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 951 0 R +/Parent 956 0 R >> endobj -980 0 obj << -/D [978 0 R /XYZ 56.6929 794.5015 null] +985 0 obj << +/D [983 0 R /XYZ 56.6929 794.5015 null] >> endobj 54 0 obj << -/D [978 0 R /XYZ 56.6929 717.7272 null] +/D [983 0 R /XYZ 56.6929 717.7272 null] >> endobj -981 0 obj << -/D [978 0 R /XYZ 56.6929 690.4227 null] +986 0 obj << +/D [983 0 R /XYZ 56.6929 690.4227 null] >> endobj 58 0 obj << -/D [978 0 R /XYZ 56.6929 550.0786 null] +/D [983 0 R /XYZ 56.6929 550.0786 null] >> endobj -982 0 obj << -/D [978 0 R /XYZ 56.6929 525.2967 null] +987 0 obj << +/D [983 0 R /XYZ 56.6929 525.2967 null] >> endobj 62 0 obj << -/D [978 0 R /XYZ 56.6929 393.0502 null] +/D [983 0 R /XYZ 56.6929 393.0502 null] >> endobj -983 0 obj << -/D [978 0 R /XYZ 56.6929 363.1913 null] +988 0 obj << +/D [983 0 R /XYZ 56.6929 363.1913 null] >> endobj -977 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R >> +982 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -986 0 obj << +991 0 obj << /Length 2095 /Filter /FlateDecode >> @@ -2897,66 +2907,66 @@ D Õmíš™Q‘‚z â~ó ¯ fÙ"‡èâ9Lt¨ž¹£j¡ mK(ÈÏbµÌ¥X2¼É6õpT!h_¥^ÁO8,uU•a¸‡àk"¿°•6ª ÇsÓ÷Oã_IZ:ä[²ÑiÉ*Np’êZÀu ‰¡‰ñìK—!Gµ&¯!cÖ`þû$8‘ôbGÊ=6ü¡ºJ¬« z¸Äã5Âr‘> endobj -992 0 obj << +997 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 268.1131 539.579 280.1727] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj -993 0 obj << +998 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 256.1579 143.5361 268.2175] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj -987 0 obj << -/D [985 0 R /XYZ 85.0394 794.5015 null] +992 0 obj << +/D [990 0 R /XYZ 85.0394 794.5015 null] >> endobj 66 0 obj << -/D [985 0 R /XYZ 85.0394 769.5949 null] +/D [990 0 R /XYZ 85.0394 769.5949 null] >> endobj -988 0 obj << -/D [985 0 R /XYZ 85.0394 574.3444 null] +993 0 obj << +/D [990 0 R /XYZ 85.0394 574.3444 null] >> endobj 70 0 obj << -/D [985 0 R /XYZ 85.0394 574.3444 null] +/D [990 0 R /XYZ 85.0394 574.3444 null] >> endobj -989 0 obj << -/D [985 0 R /XYZ 85.0394 540.5052 null] +994 0 obj << +/D [990 0 R /XYZ 85.0394 540.5052 null] >> endobj 74 0 obj << -/D [985 0 R /XYZ 85.0394 447.7637 null] +/D [990 0 R /XYZ 85.0394 447.7637 null] >> endobj -990 0 obj << -/D [985 0 R /XYZ 85.0394 410.3389 null] +995 0 obj << +/D [990 0 R /XYZ 85.0394 410.3389 null] >> endobj 78 0 obj << -/D [985 0 R /XYZ 85.0394 348.7624 null] +/D [990 0 R /XYZ 85.0394 348.7624 null] >> endobj -991 0 obj << -/D [985 0 R /XYZ 85.0394 311.223 null] +996 0 obj << +/D [990 0 R /XYZ 85.0394 311.223 null] >> endobj 82 0 obj << -/D [985 0 R /XYZ 85.0394 189.9853 null] +/D [990 0 R /XYZ 85.0394 189.9853 null] >> endobj -994 0 obj << -/D [985 0 R /XYZ 85.0394 156.0037 null] +999 0 obj << +/D [990 0 R /XYZ 85.0394 156.0037 null] >> endobj -984 0 obj << -/Font << /F21 710 0 R /F23 734 0 R >> +989 0 obj << +/Font << /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -998 0 obj << +1003 0 obj << /Length 605 /Filter /FlateDecode >> @@ -2965,27 +2975,27 @@ xÚ¥T 4‹$çÉ™‘•2' £JëØé}•ª±Ö¶Ìì¢öìJçÕ¥-ÙZ³ØÖ>ðAY³ìöwªv™÷ö»)ó?A‘ÿR¶Ph÷ÑÆÑ~»¥Ý…ÁeêsƒLÕù“éÛôÖwC’œ[yžTÝäºgGE8ìIƒ‹|7ðÒ¾omè[”—™~nlNÓímhë<ïRBHì640; ó}å*!²á ]ÖÑUA«ƒlÛ*kyÓÚ Ë54<ªàmgvd¦gíTúä,¥ì¢}Tã?9_¸ûÿcZ8^¾Klue…zR…]fù •Úµº~±®Û´î0lÒqÐÝPµS#HÓÖù]ךÃ@ÿ;ÆQ?+G†Ä¼îPÿ{$ÿ©0BLz˜¶éTÐH PGª—œÐÌÇÙýHý/š@endstream endobj -997 0 obj << +1002 0 obj << /Type /Page -/Contents 998 0 R -/Resources 996 0 R +/Contents 1003 0 R +/Resources 1001 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 951 0 R +/Parent 956 0 R >> endobj -999 0 obj << -/D [997 0 R /XYZ 56.6929 794.5015 null] +1004 0 obj << +/D [1002 0 R /XYZ 56.6929 794.5015 null] >> endobj 86 0 obj << -/D [997 0 R /XYZ 56.6929 769.5949 null] +/D [1002 0 R /XYZ 56.6929 769.5949 null] >> endobj -1000 0 obj << -/D [997 0 R /XYZ 56.6929 744.7247 null] +1005 0 obj << +/D [1002 0 R /XYZ 56.6929 744.7247 null] >> endobj -996 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R >> +1001 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1003 0 obj << +1008 0 obj << /Length 1215 /Filter /FlateDecode >> @@ -3000,45 +3010,45 @@ NT2 .Sø«ê¹”ý¿X'¶o|uÃ=-Lî…wà våã;d̛˪š¨!=ZŸÜOŸl_¯|É•o» ω¤¶j'ÇÆÌ9‚4ŒýàF%Œ}ÌÄgcê®)ÓëŸÂKÆ ®Ô,u°7tÌ)Mþ:~ø~=}Ü„O‘û4÷ùDâ‹ ~û\w¼ )x™C6.&Þz›¾¤îÝý ?»˜endstream endobj -1002 0 obj << +1007 0 obj << /Type /Page -/Contents 1003 0 R -/Resources 1001 0 R +/Contents 1008 0 R +/Resources 1006 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1009 0 R +/Parent 1014 0 R >> endobj -1004 0 obj << -/D [1002 0 R /XYZ 85.0394 794.5015 null] +1009 0 obj << +/D [1007 0 R /XYZ 85.0394 794.5015 null] >> endobj 90 0 obj << -/D [1002 0 R /XYZ 85.0394 769.5949 null] +/D [1007 0 R /XYZ 85.0394 769.5949 null] >> endobj -1005 0 obj << -/D [1002 0 R /XYZ 85.0394 575.896 null] +1010 0 obj << +/D [1007 0 R /XYZ 85.0394 575.896 null] >> endobj 94 0 obj << -/D [1002 0 R /XYZ 85.0394 529.2011 null] +/D [1007 0 R /XYZ 85.0394 529.2011 null] >> endobj -1006 0 obj << -/D [1002 0 R /XYZ 85.0394 492.9468 null] +1011 0 obj << +/D [1007 0 R /XYZ 85.0394 492.9468 null] >> endobj 98 0 obj << -/D [1002 0 R /XYZ 85.0394 492.9468 null] +/D [1007 0 R /XYZ 85.0394 492.9468 null] >> endobj -1007 0 obj << -/D [1002 0 R /XYZ 85.0394 466.0581 null] +1012 0 obj << +/D [1007 0 R /XYZ 85.0394 466.0581 null] >> endobj 102 0 obj << -/D [1002 0 R /XYZ 85.0394 237.1121 null] +/D [1007 0 R /XYZ 85.0394 237.1121 null] >> endobj -1008 0 obj << -/D [1002 0 R /XYZ 85.0394 206.4074 null] +1013 0 obj << +/D [1007 0 R /XYZ 85.0394 206.4074 null] >> endobj -1001 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1006 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1012 0 obj << +1017 0 obj << /Length 1860 /Filter /FlateDecode >> @@ -3054,53 +3064,53 @@ g:+ n9ê®ÐB©ªWúQEBŽ| ÌNuë`:ôkn‹}8ÔXÅÇtªëmý÷­¯ý=^¤8æñ Ç̃€×á<ÊÃ>%Åê+'Йú>êçòE@Û߈¶¿4E¢þhh!V²ŠúO@º¬bºMæ1áwÿ$‰%7BܲÌê½>ìsëD7c¸¦1êÿ0§‘ÌÁ¬‡^˜yö·èl™ê.$ ˆßf’È:®Ò¹ïXÀŽ2³—à‰+YÔÑ\÷¦ =n ˆi¬¢> endobj -1017 0 obj << +1022 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 190.8043 126.3509 202.8639] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1013 0 obj << -/D [1011 0 R /XYZ 56.6929 794.5015 null] +1018 0 obj << +/D [1016 0 R /XYZ 56.6929 794.5015 null] >> endobj 106 0 obj << -/D [1011 0 R /XYZ 56.6929 480.2651 null] +/D [1016 0 R /XYZ 56.6929 480.2651 null] >> endobj -1014 0 obj << -/D [1011 0 R /XYZ 56.6929 441.7923 null] +1019 0 obj << +/D [1016 0 R /XYZ 56.6929 441.7923 null] >> endobj -1015 0 obj << -/D [1011 0 R /XYZ 56.6929 373.7178 null] +1020 0 obj << +/D [1016 0 R /XYZ 56.6929 373.7178 null] >> endobj -1016 0 obj << -/D [1011 0 R /XYZ 56.6929 361.7627 null] +1021 0 obj << +/D [1016 0 R /XYZ 56.6929 361.7627 null] >> endobj 110 0 obj << -/D [1011 0 R /XYZ 56.6929 167.4388 null] +/D [1016 0 R /XYZ 56.6929 167.4388 null] >> endobj -1018 0 obj << -/D [1011 0 R /XYZ 56.6929 126.8733 null] +1023 0 obj << +/D [1016 0 R /XYZ 56.6929 126.8733 null] >> endobj 114 0 obj << -/D [1011 0 R /XYZ 56.6929 126.8733 null] +/D [1016 0 R /XYZ 56.6929 126.8733 null] >> endobj -1019 0 obj << -/D [1011 0 R /XYZ 56.6929 98.4089 null] +1024 0 obj << +/D [1016 0 R /XYZ 56.6929 98.4089 null] >> endobj -1010 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> +1015 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1023 0 obj << +1028 0 obj << /Length 2720 /Filter /FlateDecode >> @@ -3123,33 +3133,33 @@ N Z,¼-¿5ëx+±/mÿ6#ö OCõ~šT.8†µ™ÌÕêÖîRMcíHa™,6fñ;xâêr«”&ËÏ+©F4èï7%‰y_…ɦSñD2¢æ€·æ$ã9?½ öG)ûj3Ø—æ¡j‹/Ã=9ÅÎûd¼½vÊ ='\©4^$R¾¾3²—Åš2ñÕå1ê"ÕETÇœs,TzŽNÓ¨.Rí°w¿Ý}=Û}aŠpjóÌÁ,Ú/‡mIOÙ·Þݬʭ™h<€kNU·a0¼Su>ti¦×Ó ¬õµ®ÌiØÂFI¦Ï‰Ž4'²û¶€*Âï ?°ú4`ƒ‚À•°qâI[„4Ú´áb+Þ³œÆsì–Ä»ÀËíé Ü”ΞuU9œ¹¼Ešé0ô›-Rbÿ³hD wsÏþ¦ÇÿëWZóq'T£çYPÊ*ÏÒ¡æñ?NUÿ£^mšendstream endobj -1022 0 obj << +1027 0 obj << /Type /Page -/Contents 1023 0 R -/Resources 1021 0 R +/Contents 1028 0 R +/Resources 1026 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1009 0 R +/Parent 1014 0 R >> endobj -1024 0 obj << -/D [1022 0 R /XYZ 85.0394 794.5015 null] +1029 0 obj << +/D [1027 0 R /XYZ 85.0394 794.5015 null] >> endobj 118 0 obj << -/D [1022 0 R /XYZ 85.0394 769.5949 null] +/D [1027 0 R /XYZ 85.0394 769.5949 null] >> endobj -976 0 obj << -/D [1022 0 R /XYZ 85.0394 749.3395 null] +981 0 obj << +/D [1027 0 R /XYZ 85.0394 749.3395 null] >> endobj 122 0 obj << -/D [1022 0 R /XYZ 85.0394 221.8894 null] +/D [1027 0 R /XYZ 85.0394 221.8894 null] >> endobj -1028 0 obj << -/D [1022 0 R /XYZ 85.0394 197.4323 null] +1033 0 obj << +/D [1027 0 R /XYZ 85.0394 197.4323 null] >> endobj -1021 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> +1026 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1031 0 obj << +1036 0 obj << /Length 3424 /Filter /FlateDecode >> @@ -3172,21 +3182,21 @@ x .ø¡i±"ƒ|çÌ´£²D9»W>kè:•Æâ•öÿ°³§ô9R¬Ø»dða¹}õ3~!Îð1€Ùæî•ÅÈU€øRŠÞ-?²=¡¿G¤°·ÔàÙçLS%ý¡/,gûbo“7ÍÒ¿2€áÿÌXõÏ/þð¿9tÿýïâxéjPaŽ ˜X¡p*LNŸz¢F$Ÿýßð3*endstream endobj -1030 0 obj << +1035 0 obj << /Type /Page -/Contents 1031 0 R -/Resources 1029 0 R +/Contents 1036 0 R +/Resources 1034 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1009 0 R +/Parent 1014 0 R >> endobj -1032 0 obj << -/D [1030 0 R /XYZ 56.6929 794.5015 null] +1037 0 obj << +/D [1035 0 R /XYZ 56.6929 794.5015 null] >> endobj -1029 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F53 1027 0 R /F14 737 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F55 1035 0 R >> +1034 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F53 1032 0 R /F14 741 0 R /F21 714 0 R /F23 738 0 R /F48 955 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1038 0 obj << +1043 0 obj << /Length 3965 /Filter /FlateDecode >> @@ -3212,29 +3222,29 @@ w ›e4?sžÜZjø ‰€Â¦‡ àÊ€'Ât´YØ8(‰5¶ºn´Ÿg¾ª wL™+x^9Pk{:ê¸wcÔb+âgj|‰ö`_ÒM¤ÒU|`°ic¢Ÿ#á«È÷&‘ü.‹ ¹Û ñê’,Ïgò8Ü> endobj -1040 0 obj << +1045 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [120.1376 318.9001 176.3563 328.1154] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1039 0 obj << -/D [1037 0 R /XYZ 85.0394 794.5015 null] +1044 0 obj << +/D [1042 0 R /XYZ 85.0394 794.5015 null] >> endobj -1036 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F41 935 0 R /F55 1035 0 R >> +1041 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F48 955 0 R /F41 940 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1044 0 obj << +1049 0 obj << /Length 1676 /Filter /FlateDecode >> @@ -3249,33 +3259,33 @@ x ¹#„@Ë1!ƒìTÛ•mÕLæªÔpßÔ8ÔBZ»Ï\Ðüp—ç6ºàS[êë¥eˆHh" •êƒi¸ 8”5!lK-ñX*+k°¨’ìö~ÀšVU”?$ì!E4 hÔtmuAë" M5À1óG„à°›äéća¦ïl^FƒhÓ C('骉²6Þd|u>ýÅÜÕv?,h×gá¹'ˆë”ZÔuJýº2;šè£{»LãL06ë(nç»ïœ| gu¼ÊnÌ]¹Ü±¶Õ"µú› ºì­‹òN;s'òYu©µùÿÔ¡¢HH!=%so£t9={qõf7FD…œy}ÏÉN倗ÛI Ñ•±å扆½3NoP;²ý,â`€ ñ dàg3»î¸’DPQî¡-€ù†õˆdŠ!róŸú_E0}L3`ՀЯ ˜{ÂÈã<;½xuÂ=•á=7‡!Ü÷óÁŽóÔ1e×HÓ?²æ0Æí¤ÿoŒAŸPRð¯`ŒRÄE@Ʀç³Ãëi|4ˆíy9 ±¾›ÿÄí¤ÿˆH8$„‘ fE±ýrï[%üSEBaðšÂ,Äà'Mì}µý€ºù® íIy€r€d`>b¦¤ui4¹÷y×}iµR=×ÿ„­gÚendstream endobj -1043 0 obj << +1048 0 obj << /Type /Page -/Contents 1044 0 R -/Resources 1042 0 R +/Contents 1049 0 R +/Resources 1047 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1009 0 R +/Parent 1014 0 R >> endobj -1045 0 obj << -/D [1043 0 R /XYZ 56.6929 794.5015 null] +1050 0 obj << +/D [1048 0 R /XYZ 56.6929 794.5015 null] >> endobj 126 0 obj << -/D [1043 0 R /XYZ 56.6929 424.8255 null] +/D [1048 0 R /XYZ 56.6929 424.8255 null] >> endobj -1046 0 obj << -/D [1043 0 R /XYZ 56.6929 397.5211 null] +1051 0 obj << +/D [1048 0 R /XYZ 56.6929 397.5211 null] >> endobj -1047 0 obj << -/D [1043 0 R /XYZ 56.6929 368.0037 null] +1052 0 obj << +/D [1048 0 R /XYZ 56.6929 368.0037 null] >> endobj -1048 0 obj << -/D [1043 0 R /XYZ 56.6929 356.0485 null] +1053 0 obj << +/D [1048 0 R /XYZ 56.6929 356.0485 null] >> endobj -1042 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F21 710 0 R >> +1047 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F48 955 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1052 0 obj << +1057 0 obj << /Length 2367 /Filter /FlateDecode >> @@ -3299,29 +3309,29 @@ G ±ÌÐ.‰`—\?ô³æûîàhT¼pªËÇà6ÅHeÃ¥>x]³jßûy«ëoÚ£aÆNèª –¥FÿM‡Œ bÎf^>6eiéã.û –QT±Øƒ—ç0pù0äB›üÆ ÿ:¥Æóà/»YÀíÛ×°/hkßûA~P´SŠsûý»ˆäãÇÛ÷?½¢ýp•P¼óKŠÀ˾y÷¸·‡æÌi,§€yËK Å"> vŠóØã`£y>Ñ>m?Ô]}*®0‘Ýåé” @|-AÅÒtž†o†aln öu›Ö³ÔçÙ­½ ÌìÔ|õ“—yP¿/†`—aËMwŠr:;4Ž0iw‘K‚©×Á&oÖñY{c%†ã tj‚0«C/e˜Ê8iìþ|êBÄÔ>S`ó!8•?º1œ™Í ¥Áq^UÓ2ytJ©6ó-‹ÕT˜L™Ë]Šê‡ Ãèç\mRfLÃ(.f›pxö–Ô¿³¶´ð\RKXöÈüÚتrç†'TR+Þè`áÞo7Díüå±î.¶‘øÉ(ø @ÅRÒw”Þ(>9©ˆµ>Cæ™×,buN s“<ÁÖo4>IÁË÷íë(´¼ã±e,û¡Q–8ÖݧEz9O„žÚ¦!§²?ºµ„‡³ã<6…ÎL"Ìô,X¢Õl Ë4§žx s¬|¦Xžœ±l¡Öº¨¯H—4ü…²9·ü¢7êA{§¦‚Œ}Yî­ùÉÂßCÍæËËû¦+NO/”ŠÃcn«8^¦µºjÆ=Ewv|G?_×(Ã4–4kS¬©“˜­L±8$ˆt DäÏÎ4W(þpu˜endstream endobj -1051 0 obj << +1056 0 obj << /Type /Page -/Contents 1052 0 R -/Resources 1050 0 R +/Contents 1057 0 R +/Resources 1055 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1066 0 R -/Annots [ 1056 0 R 1057 0 R ] +/Parent 1071 0 R +/Annots [ 1061 0 R 1062 0 R ] >> endobj -1049 0 obj << +1054 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1067 0 R +/PTEX.InfoDict 1072 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 27.00000000 27.00000000] /Resources << /ProcSet [ /PDF ] /ExtGState << -/R4 1068 0 R +/R4 1073 0 R >>>> -/Length 1069 0 R +/Length 1074 0 R /Filter /FlateDecode >> stream @@ -3334,12 +3344,12 @@ q n*Œ1½÷¨¾x¥Æˆpîâ‹&XîÃœ§³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãêʱ„£~Ï“a³tŒºìZDß!#Z¶ÚÂk! e'jÝ=§ _tsÙ¬ûÍ&­Nå@‚i¬ˆ3t%kÐE„\H–YZxÿ/U¥Ç™åë—Φ@±¯iW H þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ&F°ÑTÆG%V½ Î'ÌØR5¬BÔ‹`qUžv-UÍ=ëÆåQv2ë_ ”¿­qq‚~èr¯Ú5ÌJ¼ð˜°h»P¡õ‹kÜàéÚýªå>Ò¸D °o»Îi¸CrT]¿MJ¥ ÆÖ¹’°;¿ö‹ûóZ¼¬ å[Ç-œÁ¤ŸBx¿ýpü|üÈÂendstream endobj -1067 0 obj +1072 0 obj << /Producer (AFPL Ghostscript 6.50) >> endobj -1068 0 obj +1073 0 obj << /Type /ExtGState /Name /R4 @@ -3349,287 +3359,298 @@ endobj /SA true >> endobj -1069 0 obj +1074 0 obj 1049 endobj -1056 0 obj << +1061 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [470.3398 477.3512 539.579 489.4108] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1057 0 obj << +1062 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [316.7164 465.396 385.3363 477.4557] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1053 0 obj << -/D [1051 0 R /XYZ 85.0394 794.5015 null] +1058 0 obj << +/D [1056 0 R /XYZ 85.0394 794.5015 null] >> endobj 130 0 obj << -/D [1051 0 R /XYZ 85.0394 769.5949 null] +/D [1056 0 R /XYZ 85.0394 769.5949 null] >> endobj -1054 0 obj << -/D [1051 0 R /XYZ 85.0394 580.0302 null] +1059 0 obj << +/D [1056 0 R /XYZ 85.0394 580.0302 null] >> endobj 134 0 obj << -/D [1051 0 R /XYZ 85.0394 580.0302 null] +/D [1056 0 R /XYZ 85.0394 580.0302 null] >> endobj -1055 0 obj << -/D [1051 0 R /XYZ 85.0394 539.9341 null] +1060 0 obj << +/D [1056 0 R /XYZ 85.0394 539.9341 null] >> endobj 138 0 obj << -/D [1051 0 R /XYZ 85.0394 315.9171 null] +/D [1056 0 R /XYZ 85.0394 315.9171 null] >> endobj -1064 0 obj << -/D [1051 0 R /XYZ 85.0394 282.0038 null] +1069 0 obj << +/D [1056 0 R /XYZ 85.0394 282.0038 null] >> endobj 142 0 obj << -/D [1051 0 R /XYZ 85.0394 146.7217 null] +/D [1056 0 R /XYZ 85.0394 146.7217 null] >> endobj -1065 0 obj << -/D [1051 0 R /XYZ 85.0394 117.3479 null] +1070 0 obj << +/D [1056 0 R /XYZ 85.0394 117.3479 null] >> endobj -1050 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F41 935 0 R >> -/XObject << /Im2 1049 0 R >> +1055 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F62 1065 0 R /F63 1068 0 R /F41 940 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1074 0 obj << -/Length 3348 -/Filter /FlateDecode ->> -stream -xÚ¥Z[w£F~÷¯Ð[ð9#4Mþ93öÆ9‰3k{/'—‡6 ‹ …k4¿~«ºªHÌæaè{W×å«‹®ø W2ñ“,ÊV*‹}„r•ï®‚Õ+Ìýý*ä5k·h=]õÝóÕ·wB­2?K¢dõ¼™œ•úAš†«çâW/ö… 'ÞýÃûÇÛŸnž¯UìÝüx½ŽdàýòóÃ-µžožînŸ¨û[ ƒûÿÜ=Â7¼^ GÞûïo>>ß>Ò|̧Þ|ø×u†ÞÍÃûÛ4õáϸ»½Á»žÿùxûtýûóW·Ï㣦/úóê×߃Uïÿá*ðE–ÊÕ:fY´Ú]ÅRø2ÂÔWOWÿœÌÚ­‹Œ ?I´ÀÉH,qRf~"` -9ù¼-áY‰òLÙ½•µU]SKצ¥V›çÚTm£ëúÈ«ºªçÍÈ×ߢ(.†Ý¿Ä_œéÝùy»Û×e?öš¾lzÃgoÎûB÷eA/mc‡S¯gZ*·ÑN €ë0ô3)#ûªß‚ ªKf,$<±ÂåYä¹oÓöÔ(èhœÚíÊ¢‚Kíë²ÐÓ›Þ²æJoyý±Ñ»*§ùô(ˆ¼—2׃áÃú­æ íPtà‹›l[j˜º=ðªmÙPK/½¦ÖÝu˜z¯x@”9~@˾¾'vAgc—À_x ª±O4Þ7¦/uG"ffG©‡B›ŸW”µ>ºó^ŽîúZ!À7”ôÝUÍЗƞ*@aàUUóJsº(ªÞ*Íü]dÅD¶!³²ÇâW*©µ¯u2tSÌ•”ößįH¿à“œ”†èÒ#6˜^wÌšd”©Û(=³ú¢=ðimGëòN›­}PºFsl0KuGšaFJïvèð©¶C*H;ˆe@Z“·Ý¾ít_ºšJì! ,bY7ts¤Æœk¤i–í§ ßx?Ø®ä±ZÞr:U`‘Óï·ºy½¼Œy;ÔÜ'kwÔÃgîH¨GËw –;³«ûN7fSv|©º#ŸÐZÌÚÚJÒÊ+ècª]…Vb;í´~ö h‚wRŒD,)CÊäÔÒy­¡ñ\7„0Ü´ÝŽáPFdß0 -0B -‡cG.º‘'`d›'Ï O0ú:hàN_ÒqõhKµeH–°˜3åíZ+æÌékܧþĈGà @·¢á~Û˜%Ò Ó6„Ê»¸ð¤ýxÒÀqÆ<Ÿí>XãÉØ4` lÌÀ-Ex·9¹ÉZcÌV†Þã²  ˆL%s°ÇéÂbåË4P!†Ä£Ð —ÜdÄœ®[]œLú_œSO¸;n\—ͨšëHÅ~áWTtâkýñÑ!ˆ-n Ú`Ì™‚p›S’ëuçA˜•w3g÷Ë<ÏÖÖæo–“\ò!@xðÓ$'þ+]r«éqi8ºUŸç=8ÂÝ·yË{-äÁNM]BhhlZ>ÄÔŒ?Ç[¼Ð&8»’±Z'ÑÀbà§~· §ÈÉ0ž âq!Š“é5Ò_0 \¨NNTZV ÖFÊù|é! ¨uö|ØOˆá¾Ì+Tzrº ‡Ò{¼{O¦I{râ=•åy -'9™¬â,ò#&ÉMv¯+j²)ôS€§³J€KÍÿg™çg ñJ`Ùyg RSúiŽœ L§e8j R6êÀ.ÕýqÑ|׎™ -%8LVì ” *Œ -& âN‰°Mó|®8Ø‹iK…mØš79K(H~ꊊéØiA-j’~+¬üâ–Œv(9•8ÎV¼Ó´;)Ê -##¸bV¶XÝom|‚—ñ×–¬p5qfz*xŽ°ØžØ_ -AîO†–H6ÉDžÅS0P—ú“¡¦cZDß-“b ËЯ¿Uš:%„$|ÃÒ 0UÄ„Ìň¸â³Æ_*ø'" “ÇÃmI [F¿½¿&p^:ÿ'³€d†UCÜHµ*{œtUhÌ_H3GZßØÚŽQÄ6[æ?ÌïJˆ`PªByß·´V §Êƒ-9ßQCÀJÀ.]ŒVæ<¤gXÇ‘Š öao’õÅ®$ÃN©7ê¢í¸j)l€°˜’BálÑþ°B §ã\YNcʾpAÛ@8ÎF}ûßBÑ#,&Æ,¨’qÔP¡‹V !¨ër) SÔÈ·-…ÅŠÓ\øn@ÓÇ!/4Ù¦Ok÷üª½º=¾Æ€@J4Õž†Ð{1Mú"–õf~àÅÏ,¯¡7„7ŒmW‹¨xÓ°ê` :"£HæÈs„Œ"™ £„Œ.¢NƇ 6V»@Ý⎺.j¶äCßþ:DCÕ‚`V -cÝ«FgÃ/å¶jŠ¯þÞדߠRÅ8hSwD§0 SÆ:vô*²øàä -^0d~œ,Ĉ5ˆF(,Ú|ÀÈ­]¼ÇýÆ|BÎI„@„qHð°ž7o¬*žQ¶A4ûÍä…õa0îWWÍvb6C«—~ÙiÔ àÙüw—ñ×:WŽŸˆSNœ“ѽÆFxBùi˜ -ú!G‡·½\@_x¥ [¾5&~(Š7,ûol -©mø¯(¡Ÿ¡AAÉM@rgJ'Ï¢«PÅ*s5M¦ õ@¬ðù T$±/ãx¬ÖÊ`¡ð+|*س«ñsröçÇI_I!Oç…DòV»·¹à ;“_q‘©¨´ž9k¢Vó2‹T…Kd'çiÏ(L5Ú&uU¿¥ÖÜdpÄ©)AìÇy‰M‘#¾ÿÈ5H% b“ Ü6è;q* -ó§ñº«¾¸Ë8‹W‰=öÃO¿PÚ¾þ-ÿ.ˆî˜ÕšÃ0«QΩ\þzÄwþ맋@Ç‚ÎWlb?@~Hš²ôO"BúøŸ •¶`´—ÿûHNÿf+_¤i´\²‹TêÇ)ÂD!ߢà‚r÷Ÿ&—¤ÿbÈendstream +1079 0 obj << +/Length 3492 +/Filter /FlateDecode +>> +stream +xÚ¥Év¤Fò®¯ÐÍè½.H’„™“Ü’ÆígË=’fy^(n +Ê@©ºúë'¶d©Böa^È%2222ö,ÿÒƒŸ©#7J‚äÒ$¡«=__fÛ ïòæþqá ÌÊ­¦Pß>]¼¿Sæ2q“(ˆ.ŸÖ\±ëűù”ÿâ„®r¯ƒç|¼ÿðpûãíýÓ• ë®VöœŸº¿åÖÓÃõýãÝíÃ#wõ´÷ñ¿wðõ¯VÊ„óá»ëOO·< +Öë›_ù¾ï\߸½á©›{Áqw{{=ýëáöñê·§ï/nŸ†CMî{ +OôÇÅ/¿y—9œÿû ÏUI¬/Ðñ\?I‚ËíE¨•«C¥ìHuñxñÏád––.2Ò÷Ü@EÁ'µÄI¸‘‚)ääÓ¦€cEÆéŠöµh¹}(«Š[iÕ5Üj²,íʦN«ê(PmÙËbäë¯Aæûí¿Ì_œé-þ¬Ùzu_Ô}'¸×'Àû]žöEίMMÃ±Ó -¥]HSpÀˆ•ï»‰ÖêWÏ ª.3TŽX"x8ö[7=7rFSÛm‘—°).ñtÝ;`®H³Àët[fÜa"ßyó\dé¾dý&• ;Êá³lntUs¨MQs+]:M•¶W~ì¼ ‚ ±ü€¾#» ³&àâ=ðƒbì2ë®/Ò(T(Ìb/mŽ//ªôhñ=í&ü¥K€¯¯ù»-ë}_t„UÀÀ©Êú…çÒ2ÒÅÖ ÇF—9=„Ï"÷ÍRá#)‰!DµDJäBž +•sÜAÂp«:Ä fçáz–Àº§î»co£~*ÏsnsvrXxÎ }çaY<¸ˆÄDs téaáBãêØ3q ‘ëƒ^±›´ÁIÕ¤ù Á,ÿù)õlw‡…«¢Ds˜Ðõ<ÏCD'¾Öíõ…Àm ÐCæ»>0ßæ©W+ðAìµ3g÷ó`xžH×æo–¨žóÁCóé°N&þ+^r«ñ`âbp«<>O†qDºo²F֒Ƀ•)wÙBCcÝ’®ûãIÈ% ØÚx'[Š­‡Öx5 üLß-e%g,È-f¬g‹á®ÈJzvº‘„Úy¸ûÀ»kÂ9EqZ# Ù½Ž@Ê•ëéÈ`†Î“íË%7&)ý¿š.8OéÏñ"×~ùÄÙ»¶Á‹]í‘3™ˆõ#$9»ò¼ûí”hß ÝÐSv‘~«Œ3@­¦`礞c›ø:P~ã{ñRL¯ÂÐI³žnœÚ|ù#öË„è¬T;ß~¼¿á©„?Ý~Ñu/Ëø¶±E"Œ k°)16!Á±’Ã@Ò¨ Ì2)›R¡9æ)p} >®¬×b.ŒN $ÉR>¤+¯)©ÏdL5$ºOœ…HUû\:ÖNcÛR Ë·ãaœ‡r‰S[âwô©d ?NíÆ(.Î3¾õ;HÀP”rëR:©å³Ý‡¹Làƒ]nÞqêäA…ôFšÏè‚ØVQ +ÙX-¨×56ð„Ž¾U*tvE‹ÀvCq–Ãë=…**´F¦&¦ÆÑH^‹‘”‰ Å—ˆKDÄè@0,VÖ‚“Œ NíHÎÝ¥ +c×x¡0Ê/œ=­Öm³]å€:@T û‚CHP´ ËNÔ*ŒÜ0ð‚9OºbÈ%‰g±+D:LÇÅÝ|ã&`Cçñ*äòq¨ƒEÆÊ–Õa¬­u2ƺV`nfYÔF†•Ð +¡û¾ØîzîPhˆE8Ò€ÅÆ¡7Ù¡ìy¶”~ñeW•Y‰…1êç–æ ±î‰$Ç·ÍÛyÇL—°és³ï¹ÉøXÌÄڼ㙮(¸Á²€°E—µånÄCN *°õ^œØ›i±Â×õ+’”ó+ÒÚÕ:±W”U’_þå.ÚÀåy6º”*Ê9zå¹¾¯­´v=Ø 9c"p> /Q˜œÆF¡ÄFp'ýXeÿ“p'f·Uô"K`%0]Ãï¨#tq˜×âðkY¨Âr%‡Çºò¹„=‡,G _”]¨Alt;ª()Úà,XÁ‰­²– +ƒŠâKå;ÃŒ±5‘¦âȈ–Êwß±M\0^G‘’Ú¹PÂ]å°ý ¹VüþN%NEèÀ&3–±¼ÌØ0tcÄÃm÷ûõO£û£½ÆŽ88 —´B¡5í°(ÊäÕ<Áô’ÖåW«+0j âxHë~~2¶L0ÀµæP +ý0#ä#›|7ótR °©ùŸ–y~"oÖ%·D™ÒÏsìl`¢³R†£D¡¨»ü„@Gð][*Œ’0Ùˆƒ0Šh0BÈ…|%±B„mž¼êÄÆÀÌPL[zí€õXšq)ÉOUò vËš›,ߟpIJ»ŠŒžÞ8Ζ²²k¶2’ÏF±àFÌ°¡rp¿¡ø7“/•¬š93Å +Þ@"ìmOì.… GE‹´¨d¤Oâ)¨ŠôsÇM2Æ Äß-•I±#@è×_Ë”;„$²ÃÒ PU´ ‰âKŠ¥ly7„VyDN%5luéëëñ­ûç•fŸ³\N¨ + ¹VEè´­@c~Bž92|Mµ?ã*5á?Ìo ˆ`ðV•q¾k¨­6@ŽK2Ù£‚€•Àª4ÏÅZu§Ñ ƒG¬&¶{“¬/´%9¶òȽA©c«¥°R°Åœ*«‹ôÚÆ€Óq©,Ç!g_ÐÔŽ‹’@ŸÞ­dŽ˜³ ZHÆѾ€&bËeü%Ëe0L=r#Û4Isá»·)¬å…¦èô»“ãpíÕ®Á×’ºƒ Á÷ž È{ Mkþ‚E,ªõáÏ Û4ŒM[-?\×":¨–QEsËslU4±ŒJ³e´u4\‰²<It‹[îÚ¨™È‡>=òÐD´ ¶ +ˆƒ‰láVƒ3‚áçbSÖù›À=û݉U*ÅRêŽÖÉOüXl8z}°÷ÔÒ«™ÌO@ŒXñUKðçM¶ÇÈÂ.îcÿx0ZÎI„Àlãà‰Á^8ÞÄ|cUñ$ˆ¢+ÐìÍÄ>®í;ûjb«Ùö4ehÕÒÎL¢žÁžÍß],¦¡?¹NíÙëœÄˆö4á©ÈõTÚØÐõ%:¼eÓ+ô…SRØòFÔ¨! +5\$û¡è¿¡,2¥ðßpÂÿMe7}È‹|!ºòPl[ÓÊP” +Ÿ»@Eº:«µÚ[(ü*WùÆöâjÜŒý):í­ôˆÏg’7©=› ΰ3yYD ®äÒzbµ‰W’ä%dÿ¸ +›è$ŒNÓžá2Í ›Ü‘§r3<±ŠÊàˆS6±Ÿæ%6ÃŽøã'©Amu›l©Á߉S1˜?m1ˆOÛò«ÝL²xÚ›æ´ýé(íâ_kªZÞ ›ÿ÷?xÆÿ9…ÆUq,—Ç»a H„(äxàQnÿêsNúÿuðåÃendstream endobj -1073 0 obj << +1078 0 obj << /Type /Page -/Contents 1074 0 R -/Resources 1072 0 R +/Contents 1079 0 R +/Resources 1077 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1066 0 R -/Annots [ 1077 0 R 1078 0 R ] +/Parent 1071 0 R +/Annots [ 1082 0 R 1083 0 R ] >> endobj -1077 0 obj << +1082 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [464.1993 488.466 511.2325 500.5257] +/Rect [464.1993 469.2511 511.2325 481.3107] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1078 0 obj << +1083 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 477.5271 105.4 488.5705] +/Rect [55.6967 458.3121 105.4 469.3555] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1075 0 obj << -/D [1073 0 R /XYZ 56.6929 794.5015 null] +1080 0 obj << +/D [1078 0 R /XYZ 56.6929 794.5015 null] >> endobj 146 0 obj << -/D [1073 0 R /XYZ 56.6929 556.0057 null] +/D [1078 0 R /XYZ 56.6929 535.4755 null] >> endobj -1076 0 obj << -/D [1073 0 R /XYZ 56.6929 521.4772 null] +1081 0 obj << +/D [1078 0 R /XYZ 56.6929 501.7295 null] >> endobj 150 0 obj << -/D [1073 0 R /XYZ 56.6929 361.9951 null] +/D [1078 0 R /XYZ 56.6929 345.0948 null] >> endobj -1079 0 obj << -/D [1073 0 R /XYZ 56.6929 325.2573 null] +1084 0 obj << +/D [1078 0 R /XYZ 56.6929 309.1395 null] >> endobj 154 0 obj << -/D [1073 0 R /XYZ 56.6929 133.2872 null] +/D [1078 0 R /XYZ 56.6929 120.0167 null] >> endobj -1080 0 obj << -/D [1073 0 R /XYZ 56.6929 104.8892 null] +1085 0 obj << +/D [1078 0 R /XYZ 56.6929 92.4013 null] >> endobj -1072 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> +1077 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R /F55 1040 0 R /F48 955 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1084 0 obj << -/Length 3001 +1089 0 obj << +/Length 3046 /Filter /FlateDecode >> stream -xÚå]sÛÆñ]¿‚o¡2æå>CòäÆJãLâ&±Úfšd¦ ›¨)€! Ñj§ÿ½»·wÀI©™>u<2îc±··ß» ˜qø'fÖ0®2=K3Í f¶º»â³÷°÷Ç+áahCýáö곯T:ËX–Èdvû.Âe·VÌn×?Ï¿üúå÷·7?^/¤ásÍ®&áó—¯þr-„˜¿|óåÍ+Úzõæ- ¾ºyyêù퟼aµ±ð^xóí÷ß¾¾íßøõö›«›ÛŽÒø6‚+$ó·«Ÿå³5\ê›+ÎTfÍìÎD–ÉÙÝ•6Š­TXÙ^½½ú¡CíºW§¸c”eÆÊtŠ=Ù{LÆ%•cÏÍÇün·-^\/”¶ó×ÕŠá>û -¶û7Á’T8_9äUÛ¼Ìæ% 켬Úb_å[Z^mË¢ƒikz. Í—Ûb¸³¿v^4õöÁƒcl›ºi«ü®ðøòj¿ŽÐ«M^½÷Hïòr‹W˜-Õ !XfŒ$âËv€I:ßõÎQ㺢g» ÷mS® z’ÈùmX^Õw»¼z¤I¾mjŽÀ°ì=G`]qïZÿò&ðØóÕªhÜ®ívWžÍËÊ݈¯NXÔÕö‘TòŸu…lÂa»É[åt8Mª:¬>£Hn–·[xøÉ»€Ô/ô·sH‹öPï?°ŽJËd­£ò5²V -GźØÔ{áÁ2Üxº-›_ß” *£4^°Ös^8”H!.7EKK÷;ÿîÁ#…†–p\Aý oíQ Ym³ùŸªb„Ìã‡ÑÒoÕþHϤ<Ÿlǘ¤Ùün8HÎmã`à‰XØëïi§Ùå«Þ4ujŽûÝ«5Œö©ÅM¢—–ª¢eÞ´eíGB¶J ʺ)WF§0ùEJ½s õÇGœ /KÞÔ!+Ø*¯üR¾ýàG5=—5šŽIÍP›Ê€Ê³íEЭ‘²½úîo“ªEfi¶3/aœØ NX^zàU]ý¹|O—_ÓªÓGx¾«÷bËšäáýßî‹}Y8å´N±k;ò ZDL™©$ .´)ÛB°ŽìckKl"=ø‹ Œ mãÝ~¬ˆYþ>Ì)©PJ Š ,q¥àài…Í:œ ’#— ?Ëc>È'a!Gqi™ŽhpÐq5(ÚMz Ç"™‚8ähR "‹=Î:´8!]Âùl9ïU´Eo=,ê8¡…¸ËÉqaZ?Àb™6ù=\?ÆŠÙ€’“¼öÜ€œÀhžüÄy)Ë Üž=.³#Åy†"Rø™VÍ”0ç*î¯*…f‰„]Èu&çhú<™{ç׫–¼Ã“@2˜$铯™°Tu¹Óôý …yòõÆÀu OE1“‡˜™Ä.f!ü%‘s„ÉÝ}㯺,<—Lʬæ ÌãØeJŸás]6à$ëÍ(€Aç;XåèCCs¯á4yG¼¿ó80Øã O¥O]S -î·ÚÞ¯Ëê½ÇïbЇ½ð™Ð1J5màŽË†»Hé’Ö)qâx¶Iw(N•Eñ ÑGÚ.•u绸|¿Ü–+”݉N¤#.¸ZqByÁý -Û9S§¼¦$K2¡/él’rñ,G–Wð¯¸\Ó0Åd}H¶þÜo×tq®²ö0Í=%0bž7ýeÝ2Ÿ–ˆ¿+Ÿvú7½óE]g•;t|ÄfR¤ÎPp‚©Ü”+€P)y°ÄÃápž•d—ø*LÜì»vw§9$*Àcþè,Dûˆw‘õ•’TÂ]껟|Æ©øÇNß\ÃR(LÃUØÝGïgµïkŒjåù;$`™Z‹K|ô*¸Ä/0Û°DwJŒ×dAö -Ž“v¢N‘ Rëu‰ÆŒ¬:3äA7&ãP¢?Á¦ãVʳw”œñä¹&!WÆ&E×h6dHHº¯0quW¬Jrv|þÝO´x$w\tÙ=…¨£²ê($¸ºÔ©¸¹õªËšÑ=£ÚüýÓO‚ré)åÒó] aŠ|8¼C1B_®#_»Þ—C´2Á]`𘪢X»¸„¯«üÞEˆ"lSÐyOÔ8kW»ÈP*KÏ?Q`‚A¨Å`xÈÚ+kÔ|[×èR°ˆµ©Ãáâ# Z}]lˇ€ÃÓm·p_h\kËž"™ÿõÚ˜yI– -õ’Šc"DŒdñbTnbBÂëê8¿¨i@Têuï÷b3TyúBá9¨7… -/ª}µX ϶N‡ø¯=™Ÿ4!µ¤§·¨a)šwŽÙ‘àsȳÏ'ŒŽGûåškŸ:šÀfØ,ÕÊ£ys½H8aƧàô š:Èû§ºq‹€tpÝ7¨`J_—Ó¨x¤v–v~•Ä‹#—±8ƒÙäÛw~Í?AÓ]È¥YYuÃB—6Á¬¯ß•Iz >-‚‰ïàÐgEîÅbRC]>ijù‡ÊÝŠgd?]ãˆÛÞ~pÑß©ÛÎùo—.´MÈÑc[gØÂÔ ë@ qQKG¾DØûíµ˜?º²Ë¼uß­·úB‰gÇ$r8GÓŒÍÏñiØXñ -<‘šGPÎÁž0ÓQ ÏU®QÓ%>d•£öxw½{¤yÒò~è2«<;pcVÅM]Ü },åûXèj›Cähpç‘ž]²7ÄØçî2 í3XîËŸÿ¹Õ(,xbSz(œô…‘Ç -|_æ«]ûôß;N]W—¼hs²½*!DÚŒSº¨0¾‰Wk7ªéé;•0Ú]», …JXÌQ¹;Í–RÅlØ®·ïPS„ ¡wlÂŽ5´ƒ2N<ää+ á`ÊvE±kqOä?³‰ -I!ñNDÅ/e¤ó=mEû$…÷ -Ĩ ìSgyT©¸¦y32ËÛ>xßUP‡2Çm‹U[>xHäÍÈõÄ&œí®ûøUÀ ‚Ãv -“7 `©gŒN¡wbAÎÇü&ePÁ†¬¶ÿL„N|&‚šÒŒ†¸;ô3½ú ¥G=û/mýù©ÏlJ~59ÿÑ0†r_Å (ˆÊZá¢jA¤ãC1×Ξ?µƒ:>v”¹ÃX'Ãc¿…Ì‘.Mi# 'øËQ|¢$Q†™„«Ëe¾J­yBÙ¥ŸY“¼Ñ Ì?%Až2®­½ ÁêŒÔe ž;5’àøØi ÆÇþ/%x¡'(ÒÄ>£‚~J›PfÃ6ãIAJkYzIŽÐi1 ‹R¨ËŒ:wjÄ©ñ±Ó¬Š½éJ£Â1|öë?ãåg†Ç™Æ&÷Q>´ì2ž$£²®ÏOòÿTÆö¤ "•†*Î\ø%J uFF게ÎÉh|ì´Œâcÿÿ‚ -ä•Pn»ÎK0‚:#ÁuY‚çN$8>vZ‚ñ±—­ $ZWÅ“¤h$ƒÜ.}’“gÇ“ÿRŠkáÄŒgÙtÒ ©Ù—jêä¤:êäÀ¤+3°–ñß[qú4´SlýµÎ`xðKÿpÂp´.šÕ¾\Ò3à¨eý€¿‚Rdþ¦n‹€*oÃ(žþÇ81E“¥eG£|$þbT† ¾ÇNo2æP`Žê,Z|¬ï÷ýOƒ¢Š£m¿¦(Æ*­AV+;øyXRð¤Íýû ~Œ”»ƒ_Ä/+÷1^dÄ[¬†Â­GÔ$œ ‰9²¯t‰‚1®è±²ØŒMÆõužFµûñ'š‚Zâï)HèùjK; šþË·S€MüÏ?“ú ¿˜á¢e"^ü÷A§B3p€>Õ!zßRX”»fñ¾^lŠ}q¦¢{‡àŽ¸Ÿ9è_1v:¿7 ½8!2øóÖð»$Ùût E«µrZøŠ'ÌÊ, D!éòHݺ_S“þCHá endstream +xÚå]“Û¶ñý~…Þ¢ËD>LžÜøÒ8»I|m3M2SJ¢-Ö:Ry'_;ýïÝÅ HQÒ]3}êxÎÅb±ß»”˜qø'fF3®òd–å Ó\èÙêîŠÏÞÃÚ¯„ƒYx E õ‡Û«Ï¿VÙ,gy*ÓÙí»—aÜ1»]ÿ<ÿê›ßßÞüx½šÏv½Ð)Ÿ¿xù—k!ÄüÅ›¯n^ÒÒË7oiðõÍ‹ë,™ßþùǘ&Ñöùo¿ÿîÕm¿ã×Ûo¯nn¥ñmWHæoW?ÿÊgk¸Ô·Wœ©ÜèÙ^8y.gwW‰VL'Jù™íÕÛ«ÂhÕnâŽV†i#³ öH5ųTÁ²§ÙÓe~‘2iZ—8¤É¶\uUSÓKóŽž=ê²;4ûŸÑ[·):U­{(ªm±Ü– ñ€nbw¿ÜV+†1æ|¶˳DZ +o>w»m ©ÄÌ_Õ~Ïàn©`i–hØ‹[EÝJæóŠf^Õ]¹¯‹-M¯¶U`6|.K%ªã•ýµ0ó²m¶¤ücÛ4mWw¥ÃWÔëx;B¯6EýÞ!½Æàf OõB–kM÷=TÝÓl¾+›¥Æ(|ZþÙ ¨ešÊù­Ÿ^5w»¢~¤—bÛ64òa=Gà-ºâÞtnó¦xpØ‹Õªlíª ««rßUmoćWñ',šzûHbÿgS—íXg +:Ü)VÓMjPÞnB†Úô«¿]¤­,PiŒ<Ä+d­àh +@ź‹PÜ ¦áÎÀÓmÕnÜü¦jQ¥v€¹žë°áP!…8Ý–MÝïÜÞƒC ++-M!á8ƒúãwíQ ÙÄäó?Õå™Ã£¥[jÜ žI18>™ÀxÉòù/\óª¦b œ" k{õ=­´»bUÂA¯VÍq=lm`´w°H-.µ8µôP5­,‹Öy˜DB¶Jʺ©VwFÐ C>jg'šÖKM\Ö"+تpN¬+¶†iÙ ¹YoLj‡ÚTyTCoWÕ#e{ùúo#Õ"bÈ,õÀÖàÍI_Œ'L/ðª©á\¾¿§Ë¯iÖê#<ß5û±eM +¿ÿ·ûr_•V9M‚N§Üuƒ•€€<(èïAÁ”™JSïBÛª+ d{\£XjRéÀ?›À¸H´`\c`"‰€Yþ>Ì™PJKŠ ,q¥àài…ÉÎE’‘#—†²Å|OÂ>BŽâJdJ:’€³BÇYÔ h5í5‹d +bôP­A“ZyìÙð- ÅÒ%‘ÏÆ‘õ^eWzðÎÁ¢Ž:Pˆ»‚L'¦õ,–%¤¿‡ëÇX1_Qr’׎µè„gCnœ8,ÂíÙãr3Rœg("…Ÿi¥I˜Ræ”.´QL)¸ßj{¿®ê÷¿p@öü†3¡c”jÏ› ‡Hi“V)ñÅ&ðì<’p(¾x*-Š>â@'¢4!•µçÛ¸lÓy*p‰Ä'"´ ®FœP^p¿Âgj•wBÔdi.’K:›f\<Ë‘ƒåÀÜ›«bÆ¡ÜØÂÆHàÏývM7 —þ: kÓÞS#æEÛ_Ö.!óiŠø»ri§Ûéœï O KôœØLŠ _0•›r*%÷–x8.p dzÒü_…ν›}×í.à4 ‡TyxÌ­…$.âmEdG}¥$•°—zý“Ë8ŸàØé› ­Y¥³¿ +»ûèül"Áûj µòüRH +’D\â ¤WþÀ%xÙš¥IPb¼&ó²Wpœ4C`ë *µ^WhÌhÁ*˜¡¯¨§ãŠé'Ø”bÜHyöŽ’3ž>פ äÊؤèí† Iw&ÎîÊUEÎŽÏ_ÿD“GrÇI›ÝSH€:Z+£Æ9BmëR«jàæÖ«5£{Fµùû§ŸxåJ¦”+™ïSäÃaňÄûò$òå°ê|9D+í݆‡©.˵K¸­\÷6Ê@A`É›BÌ{àA…‹¨˜‹H_*KÇ?Q`‚¯Å`x(üœ-kÔ|Û4èR0‰µ©Åaã# :‡}]n«ÃÑ-wp_wh\kËž"ÿõZëyE–òõ’Šc"DŒdñÙ¨ÜòÄø„×ÖqnÍSíÓ€©ÞS/6M•§;ÀžƒŠqSºÑ ð¢êÐU‹õðœaëátˆÿÆ‘ù‰o™9<΢&Ûn#EÖd$øòì‹ ãÅãs–‰,µÇjig˜c«R°,Q 9š7׋”f| +NO¯©ƒ¼ª·ðH×}ƒ +¦”vu9ÊGagiçfI¼8²‹5˜M±}çæÜ4݆\z«ê€ÑO„´ Þúú]é´êÓ"xqº¬Èn,×S&hó!žÏ?ÔöV<'û #nzûÁIw§°œòß.“’£Ç¶Î°!…©Aè@ qQKG®DØ•ûíµ˜?Ú.·Í¼“¾[5nõùÏOuŽ ¦›ŸåÓ°±âx"5 ¬ƒ=a¦£ž­¨-í²ÊQ?\ïiž´¼Bæo”Ã`n̨¸©‹‹¾¥\ ]m{ˆ ®<Ò3${CŒ}î.sß>ƒé¾ qùŸÂ‚#f1%Oá¤/Œ<–çû²X}íÓ|œ0º©/yÑöd{UB(ˆ´_é¢B»rL¤N­í¨¡§ëTÂhwm³€ *a1Gåš-¥ŠÙ °¡·oQS„ö¡·l Ç ´ÏãÄg +H8˜2¡(¶-î‰ü'g&U>)$Þ‰¨ø¥Œ”c¾—˜cÑ>Iá1j»ÔÃZU*¶iގ̲ĶÞwåUã¡*üq[üðóà ‘7[ ×e š0Ý]wY«‹_%ÜÀ;l«0Eë ò–zÆèz'æå|Ì¡3¬ÏjûÏDˆáÄg"¨ ýðɨ»C?Ó«ÏÐÁQzÔ30þ¶õÅ© –e Ù³Ÿ5c(ûÝŠ‚¨L€¡Q.ªD6>síáä9ê‘O”$J3ru¹ÌW™ÑO(»’gÖ$p»tX柠Ì%3J賌¡NK0@]”àÙS{ ;)ÁÁ±ÿK ^è BâižQA?¥Í(óa›ñ´ 3¨Deš\duFê² Ï r|ì´ ãcŸ.È#ýÊò´ìNóJ§Ì £<Ï«ê ¯<Ôe^;5âÕøØi^ÅÇÞôm¥Qùè?þõŸ‡Ñ€²4Íã| #”ý4ï÷@OÓaÚóMŸ%Ÿäÿ©¼íI¡EJÇBHIŠZ2Èð²'I1}vTù/¥9œ˜ó<Ÿîäàjùe õs²$êçÀK(6°¢q_]qžÒúÌ73lvÖ`xpSÿ°ŸÃp´.ÛÕ¾ZÒO4à¨e󀿂‚dþ¦éJªèüÈåŸî'91E“f Q>9*F_‘c§·ñy³/3GÕM>6÷ûþBQÝQúæ_[–c•N„a&Qf&2Å8§ßÛÑâþýŒ?FÊàñ†cå>Æ‹ŒxÿN1qDM +~'sd_èc\Ñgbe8ÓÚ¤ã*;O£ +~Èø­ÁD0cJ‹Õ–Z~>¶ôú/×ÌÀ8SÿóÏeò¥›ÌqÒ0OþûK¯S¾%8@ïƒê½k,,ª]»xß,6å¾<Ž2¡f‡àÇ©RL3ü!å„TàÏ)üïþ½fﶨN9‘¤(É ºMGÞBiTøaç1éÿÆv–endstream endobj -1083 0 obj << +1088 0 obj << /Type /Page -/Contents 1084 0 R -/Resources 1082 0 R +/Contents 1089 0 R +/Resources 1087 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1066 0 R -/Annots [ 1086 0 R ] +/Parent 1071 0 R +/Annots [ 1091 0 R ] >> endobj -1086 0 obj << +1091 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [417.8476 181.7231 466.5943 193.7827] +/Rect [417.8476 169.1947 466.5943 181.2543] /Subtype /Link /A << /S /GoTo /D (sample_configuration) >> >> endobj -1085 0 obj << -/D [1083 0 R /XYZ 85.0394 794.5015 null] +1090 0 obj << +/D [1088 0 R /XYZ 85.0394 794.5015 null] >> endobj -1082 0 obj << -/Font << /F37 799 0 R /F39 895 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R >> +1087 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F14 741 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1089 0 obj << -/Length 853 +1094 0 obj << +/Length 828 /Filter /FlateDecode >> stream -xÚÕWMsÚ0½ûWxr‚ƒ…¾üÕœhBÚf:™4¸½$9¸F$Ì›X& íô¿W²°‘ƒ€PÒÎt˜Y^½]½}+VȆâƒl×^ˆCÛ)p!rídjAûN¼û`¡¥S9ºÕûÈêßAèaÏŽÆV` ;]w(  +`gxùùSÔu° ;§îƒê“ýËhp¥ækÓþé·.B¨Ó¿8œjKäàlÐïú´}½ »·Ñ¹5ˆšHõÝ Hd˜Öõ-´GbSç$ \ûI<@€ÂÛS‹º¸”z&µ†Ö—P{[-5²ƒ ÀÄÃz(Òè ð €òÝx“Š€Ü„@r¡ëâjzœOq1ê:„)ì¹ÊHòéÑJjoÈÔTH¦ÎP…%}Ôn[þËŬµÆ,óI |4í­tlÚ¶¡4…zFGy-ÃbZׄpQÄåäQŽ}*j8ÛAiÊÓyÙdV*r…Y¶ê°‘§cÆ<@¦Eo¬9ƒîª°Œ9z•Fð¾áiüÈö“Hµd—Bxo=#=Jpmy äñM6P‹w¨kãð_f³Ié›—rãaÏ:>€é½ÿ£ÖŒÄ"#±Ô\.¯!R›xŨÿoä䟥¤w&z®U;&\ÑÕQÑÂJ›AÓÉ&SžâËÆGMÜ缬Žïv3ªº'5NòìB|÷N9kõ~/œÅIjda-°‡érƒ¢³“@ú¤Yl |s¤´àN -ùLšó'ÀŽäÏ[Bì½eK¸]—q¶Ð]»PïØ8ž§Ûš?Óe„¸@Þ WØðxðEeuG£> A€›;HKôØ È2(ÉÆk‘×7šõЫendstream +xÚÕW]o›0}çW >%f}ÊÚt[5U]ÃöÒö·D ÅôkÓþûl4&mš©Ò)1æúÜësÏu®‘ åÙžü‡vRàAäÙÉÜ‚öµ|÷ÉBK§6rÚV#Ë="‚ÐǾ]µ°€Œ!;šž( `(à`rúõK4t°‡'“¡ƒõØààóè4ŸéùÚttøcˆŒNƇ­%jp4 :ˆ¾Ÿ'ÃËèØGM¤íÝ HT˜·Öù%´§rSÇ$džý  @aˆí¹E=s'©‘…µD@Óåeg''@íI³ØøæHéÀ;:#­àò…2„ŠÞÐânÑb÷–Ðt{ P-¿¡×‡Íw¾Y¬.U4„1Ü\:rÄ”IePŠ"Œ×"¯¯ ë¡ÿp”‹endstream endobj -1088 0 obj << +1093 0 obj << /Type /Page -/Contents 1089 0 R -/Resources 1087 0 R +/Contents 1094 0 R +/Resources 1092 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1066 0 R +/Parent 1071 0 R >> endobj -1090 0 obj << -/D [1088 0 R /XYZ 56.6929 794.5015 null] +1095 0 obj << +/D [1093 0 R /XYZ 56.6929 794.5015 null] >> endobj -1087 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +1092 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1093 0 obj << -/Length 1946 +1098 0 obj << +/Length 1945 /Filter /FlateDecode >> stream -xÚ¥ÙrÛÈñ_ÁòYeŒ0ƒ{ý¤µd[›¬ãXL^Ö[®!0$Q‹ƒÆ!™IåßÓ=Ý Ú7¥*ÍLOOß(—.üÉe×Küe”ø"pe°LË…»ÜÃÝÛ…dg@rÆX?nWo¼h™ˆ$Tár³ÑŠ…Çr¹É~Y½~wýasûqí¨À]ùbí¡»º¾ùçZJ¹º~ÿúö†®nÞßÓæÍíõ:òW›|¼EˆT ¾ øåæþîíú×ÍO‹ÛÍY¾±ÒõP¸/‹_~u—¨òÓÂ^ËG8¸B&‰Z– ?ðDà{Þ)÷‹¿Ÿ ŽníÓ9›^,‚XE3FñåÈ(I(’Ä–QˆÐSž5Š.ŠúÑùÒ›æä¤:=˜µºîêß´äUgšJí+:›¯Óó`• -6WWhLÛ5yÚÑiDP§©i[´íH)’ P# “öM›×ÕwóWþ³ü/Dgø -!¦`9Ÿ“GÀß(O$èb„þ«®XÍmÞ)ÌW] #Òº|qVHzcKµƒ÷…~à­%…,®öÝéÈx¥nÁ¯æÛåÝåɳ«k+Ë«9É]£«vgšïµÿÈVêOØJÍÚê0€µÙéß^ßÕŸLÙN×UÝLóy w?ŸuÛ}.õik¦šÏÆòŸ3åZòê äì%µ'…ù¡Å¹«¨hØ„<É}5?Gˆ YR`‘j7C8Œ…ò}ɸŸÜÀ­¢m¾ôùƒ.LÕT¬ñµ6ÐnH¡Å?Ìæ@U‚º7èYž­ÑMz »|“¦d’J—¦5ÍÃ`e)!CÿÕœŸG÷¾ºÏ“Ké Ï»"5â˜\E²Ýu/=bÆu®ð•"üÍ!‡èSa¸VMK{¨›·Ájßç™!hWó­éº¼ÚÓ¡?ÒºYC“ÂøÓ){€ E¥»¾YËxe˜zÅcO pœÉ˜ÅS --VÒ¼;±˜ ýñîý í]7gÇÌ´i“o‘§'ƒUzÐÕ~8 vÅÀ±·uõÉuÕ¾o41F B -FÐüòÑÅÈAw3,4iLÚCÓ&#èc7Y¾C8¦-^WLog.†{9Yy•}F~§ÁÑ>ªm×£DÙÑš5Ý]ÞL¬ €ß̉é*£Mß>Þæû©{ö˜wÚ‘“É!eXÉñP¢dÍKÝäʼnŽm`Föf"^æ-¯UÛÛÇ‚’æß`Š0ð&!@ætìê}£e^òÖ>ÉîP¥3‚lO´’ÿpgeðØé†Õë¦ÉkîVœÈŠ3t˜Qû–žðbü  öÔ²‘¾m-~ b•DŒÈRRå™#§öT´‡\Óf~|@6IbÅdßf8Ë@Dž8cZÎŒ!®}ÿLæ4CÆÑ>gâ'ƒ7Ö“s1,òŠ«l}ì83ñÀcJ^]Ð T?Í´ w³††QD(é,!â9MCºQÈ8â2 ò‚ -ÌKÔÂKàÔUÃd $ÏoMeé(ÎýA7†Õû˹üï•nuÊåüƒÎ›©&ï`Æjç§ ’Æ1:C‰õ¾î¹³S©:nJý5/ûò̃6ðEµ·n憥 R±Ày‡ßˆ*Q$ÔLC-ÈKúüE¦»a´NE\–Ã,Ô ç2,’ðq=c³>å—š–‹c9Èq@ãèôãiP§™¬j¡â8ðâ…>®Më¡Ô©SfC·üé¥b0ú»¿ÝoøÁ(÷žû%Î þ|6ó»™{®×ÿ÷¯t—Ÿ%ýút¬Î?ÀMòËsCjÎ,ÚCyO%?ÿœ÷­èÿ¢ „êendstream +xÚ­ksÛ6ò»~…&Ÿ¤™&>›OnâÄnïÒ4ÖÝ—¦“HHâ”…;º›þ÷îbAŠTèæríxÆX,ûÞÅR|éÂ_F>seì-ÃØc¾ËýeR,ÜåÎÞ,¸¥qz"gLõýfqõZ†Ë˜Å–›ÝˆWÄÜ(âËMúËêåíõ»ÍÍûµ#|wå±µãîêúտלóÕõÛ—7¯èèÕÛ{^ß\¯Coµù×ûÄpã=ßÞÜÜß½Yÿºùaq³ôÛÀ]‰Ê}Züò«»LÁ”.“qä/aã2ÇbY,<_2ß“²Çä‹ûÅÏÃÑ©¹:ç_FÌD8ãœ,Ž=ú1 ¤Æ)*Ï«GçS§ëÓÚ \wõ_ZTyzAÐï°rßèêŠ0©Þ©.oi3ºª’D7 ús8g±ï‹K)N¢’ƒžÈÊÊV×¥Ê+Qžîb¤@­›¶Î«Áˆá×4¨uÒÕMV•ß,_xOÊ?3È¥¤cŒÍ©Ó£ÚÉ)´w„d1&bÿS•ÖÌgMÖjÎôgUsÍ’ªx6ÄåØS¡°p®,hX¡ˆ^êD|{:ZºB5àŠs†í²žï³âŠôÙU•ÑåÅÓhkU6;]«ÿG¾ÿ‡¯Ä¬¯þŸ}ÍþæŠdü©ýäÊæ¢Èªö ë[8ƒüùx¨šöc¡N[=µüotå¬'ùÈ“W¯¡3œ›ˆ–.óü824w%µFP›ˆ'F„ÀÍ‹áÒB•Tùx¤ÜÍ0"&<[Ú®ïV5ñÖŸºìAåºlË WäÀºŒ6è7äÐà…ïfs ÷Awím ÌF«:9_ž(ÓRºÑõCïe +ÆÿÅ\N´z¨vìËýKôeèDÌ|SIldŸ‚U¿*ZšCU·ú«}—¥š°meOuÛfåž6Ý‘ÖÍžBÌ?•Ø(´(UÛÕk­´QAõl$AN§VÄ%‡;iÖž¬šûýÝÛWŒÀ»vΩn’:Û¢LÉýUrPå¾ß fÅÄ1§UùÁuž« F$brK ìÍG瘃jgD(²˜6Cv‡¹@šíe‹Ç¥å·ÓgÇ=ŸË¬¬Lò.¥8ŒËàh.UæÕ£BÙÑš7ÕžïL¼ ˆßôÉ^ReJ@×–%–☪Vc$\¹º&ÅýD›!¨cê Nq.¼r¨º<µÊUeK)oÕxzâ3•F¶òÃø̱¤( NY¢!<QêZBß½slÄð‚dN&ZàaÖصl:SàØP’ ê\ÄÞ¤PŸŽmµ¯Õñ@ªÌ›@Ѻ÷åþ]:%ÌöD+Å!£ ¤ÇNÕÖ¼î¨ë¬2énÔ :ý 3z¾¹d2 zžë¤/ŸÏg‘€g”­V`T1H´¥=Uí!SÌØÆq$,[ç·ÉÜg¡½d,Ë™1Äeç lN3l=à£)º¼±Ÿ Í0ÏJÛe«ck+7vLÉÊ3Fú§ž¶ávÖÑ0Š0Á]ßjxÎÒ€nXvžz}Á +îˆ8Z!Cæ +)ûÉ€q;¼Ñ¥®M¦£:÷UkkÞCûßõ&ݨĶów*«§–ÜÂŒÕ<1e@L"îÙPóRzP³êüâ^Û kKú”¤€ß[õ,™©YX±á Ù%›­nµ.I c£Ž”ntœùŒ¶Âc±_fÏ”~ˆш‘˜céFñǠᕤ¦ª·<2Øóp‹ñ5|Sûà¯Ëïh*0¥ºæçIN~Â3æ8F†{l°Ðª6ý`$ @*º¦µÉ©/††f êßömÕ¿ã(£a39‹øë†slȲ뮭 +x„bb“Î~ÿyÂ<) ñ³Æ̸J7Îbí‡|ö¤Ä‡‘\Dxœ68rò€àí©Õ4zâîöŸ×/ûÛkáÛcã6pÂC~8Iâ# +Ãdj%l«=ûmð +F@l±Ä¨!è< ¢x˜‡1CúÒ¾-pbfî¯ÜÖªÉz* iÇ•bÂùÁêmÕZâ–fSYT¡>gEW 2€ïª=¹e`kC mT—/PšÁ4cóˆn>·y¢{Uqg> endobj -1094 0 obj << -/D [1092 0 R /XYZ 85.0394 794.5015 null] +1099 0 obj << +/D [1097 0 R /XYZ 85.0394 794.5015 null] >> endobj 158 0 obj << -/D [1092 0 R /XYZ 85.0394 427.2881 null] +/D [1097 0 R /XYZ 85.0394 418.0047 null] >> endobj -1095 0 obj << -/D [1092 0 R /XYZ 85.0394 390.6298 null] +1100 0 obj << +/D [1097 0 R /XYZ 85.0394 382.2497 null] >> endobj 162 0 obj << -/D [1092 0 R /XYZ 85.0394 229.0656 null] +/D [1097 0 R /XYZ 85.0394 223.9723 null] >> endobj -1096 0 obj << -/D [1092 0 R /XYZ 85.0394 200.0179 null] +1101 0 obj << +/D [1097 0 R /XYZ 85.0394 195.8278 null] >> endobj 166 0 obj << -/D [1092 0 R /XYZ 85.0394 151.3455 null] +/D [1097 0 R /XYZ 85.0394 149.2124 null] >> endobj -1097 0 obj << -/D [1092 0 R /XYZ 85.0394 127.291 null] +1102 0 obj << +/D [1097 0 R /XYZ 85.0394 126.0612 null] >> endobj -1091 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R /F48 950 0 R >> +1096 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F21 714 0 R /F39 900 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1100 0 obj << -/Length 2314 +1105 0 obj << +/Length 2253 /Filter /FlateDecode >> stream -xÚ¥ÛrÛ6öÝ_¡éK¨‰…àB`3}p'uw“ÍÖê¾4} $JbÊ‹"RvÝNÿ}pˆ´¡ØÙgB\Îý± …?6‘ I2žMÒ,&’29YÖgt²½wgÌÂÌÐlõj~öâ­H'ÉžLæë.E¨Rl2_ýÁ2 4š__½›Î8ã^ÿxñq~ù3L%¸xóŸ)c,ºøðúò n½ùpƒ·—Ó4Žæ¿ü|y=ýmþÓÙåÜÓ7äQ¡‰ûröëot²V~:£DdJNnaB Ë2>©Ïb)ˆŒ…p+ÕÙõÙ¿=ÂÁ®9” £„‹„„ÂEH(2#‰€--”ù¶¶@¿w8(;ýeQÙà¼wŸ(åU¡Y~ñ6fÄ™ œÅšñÛ¶ëÙLÿÏÉs&ÓçTÿ#»}y“÷öüˆ0¦$T: ƒX°èCÛoËfƒw¯Êý”©¨Xö•%óÐ#БŒžOg‚Òhqè À¥“O‘ dÀ/$ÓÖ@•AºÌ, -KÍý>_öŽžµ‘A[ã õ"½^Ì8o,,ˆÇŽòÎ~-SÛEé˜,–8ï¿04ciJ˜àqL‘˜‚ùxÆf HùŸù‹Kùúó»ì_ÏÛŽ}þBsþyuñöéÇÜÑ?ó ¹JN¸Nbßp'‹‰Á5õCyyùž–±7Ž%–I’‚ßNf"‡£©>ŒðéŒ/DïóæWˆî]Ñû¼/Û&,3.µ·D&Ò1I"„ûÆ!ôzYïŒÃÀZŽŸ=˜ˆ1!sìË,Þ"m׸º(û|ˆÇCw€uÎ: Ñn&£÷àç¸~qýúêÊ"6*íìÅHNnòª\w¤§ÜP¨ñùOTÒ¼ë5Z l÷NUÑlú-.–Ý€OÕ‡ª/wÕˆ7Yüè&z½Añ(K˜Y\‚tµÛí; =d@ -PĬ„ºvD’ª&ÀåHQ!;¬e¢`¶AÛ(VÄ#xÐEÕµšŒ”¦“4ú½ioz¯‚1Þs |÷SìZ¿Å°rØlæÌ'"É”õ ºF“˜*øhœzm÷ˆÝ†XV¹]Ûá…›}^[Zü:v-±Þ"`â,9x–‚1–í*ïó£GúãDrŸ²^¤]Ñ9âëvwçƒ÷økСóökИӖ¡¾¯ZctR;ò’d¢Ç]×اJÐN•]ÜµÆ a o†ÅnÙî -\3& _(<n^àØÐÁ[¤>_tNž•ÑA³¥ÙE{»˜q^[\På­ýÚCmrR¥;d± y÷ýÈB‘$L¤ +"N¤,âà>þ`a Zþ{þúR_|yŸýãeÓŠ/_y.¿,ÏøaäØ|Hcæäï«ù½jÉdªœÆ¾§ˆ‹ 4žTõ}}yý>¬1f95–i–@ÜNBAÀñÄ'Áä4 Á‡¼>ä‘{_ÔÅ>ïʦ×™Ô­=•©d(’Š{"Ѻ „—Û €åôÙƒ‹2Û¾Àã-ÑfEÐyÙµC2ê‡ÀMB<0 ÃL Î ~~}que “¶–1‰F“›¼*—&ùCa¨ÒáþÏ\ó¼m[òX¢^w–mïœi°=T]¹«gKKŸÂá5©'µ‚à´‹a·o-vÿè( ‘°j›Hiß4#§jÌ·Æ3ŒP0[“oKæ‰õ"è¼j#æÐqüQ7·5 }TÁ˜¸ÀÀpï~š ë6”Vë͈;‹T2g© í–\bÄU!F£ÄÇh³'êV0pIJÊ-lG ×û|kEhèëŽk…õ牔È!²R¨CÝ.ó.?F¤_1A¤ ö¥6Š0] ^4»;Ÿ||Ä_ƒ ]´_ƒÅœµŒœðý±1N§1P¤ =ºÆ?Ó˜ü4Õ`‹»Æ¸!Àˆ3ÛE³+f\¾Ðx0Z<'øÐÁ{$nž +Œêv×ì;‚l páºl·væ9TKÇ•`èÆXhEâEÓÁÂáůÇlÄßÍ>M¡‹ +^ÙÌØnì¨+ªb·iêÂ΋nñ¸i”7²¦¹ªWÍ~;bœbC¡ £¤þ*T¦S Š¤éåŸeÛ™÷”®¶ù,IxPïŽx*¤ÈE€énÆŠzÄxœi‹… æ>%‘1¥Õ£DRÊ1z1ƒNÔU®c +Â\áݯ%]`*üXQOš•ÒuKßÚ8O.Àû¤¦!´¶/Ú‘,µ`œk§†:ß‚-šz5"{ å:Ž.¨?í.")Xš J ¨&5ø¦ÅÞ¢ßHä?Æ ÿ \1¯Ö;ì6[»w›/BÈÅRÇoJÄÖˆûÝC Åw´5on +´¯ÁuIµÀ¶ç +ô¨½ë32‘§ƒò„£í£ÌäKÇ¥Ûä­‚Ü·•‚.?‰ýû‡yXâ ôSÔMÞ6{L5JÄV¢|™Ï©wWÒTÄ4êAã9^Ê»æÈZ÷Fº·ÑtÀP‚k¡‰'ꡨ2„€Ú«ƒ§=¿ÑúÆ£ÚëW’ø@¢Ê:à°À£ÄÞÚP:›²&˺–C[åàÀa9¯ëòß&Í+ÈÑ6Ík,P-Óö®ÄRu Ç–`:·sGªmóµÛQ®kò¨µt":J‰wêWcáˆ^ªxD +€u¹º£1y AÞÙz„Õ :Ÿ«ÕcH2†Ä¥Ãb¯¦ÁrlÐøÅ=O$G2´ŠjÝžR±ÇÄñüžˆ`ù±ºÓ?·A‰|„FîÞþ@¦ó_Ûâ~=|²ôÙ¼¢xŠb¶4Ê +Ì÷ \œÝmQÔ4én`¦¶»M_MÖçSN?©÷*omGôçvµk*ËávãÈ? R×8Qèëhcf›Q<¿*ÚƒÓ˽ ²Xý¯ÐÕæýX!˜JDöT!˜NR‡e[«ò´ºúäføØ,ÝçœBâQ²ßÝÈ'»§:ÁñNËÔhmW‘`±ÖÙ°":ûcÝuÛ©íÂOëè Þü5^«å³kõ‡ã…1É,K™€—æwšÛ¥ÕjA™›jóÔKö: #²lGÛï[»n_ë¬*‹]ZÌ“Ò†x˦°;ê¦#,p¸.7Wq€æµew,ûæêŽ{3Œáó,]3ï†÷β¼™j åñ­iô6z5æ]‹TªžnU$]« z]šCS‘A ø"“øŠ•ØGXÎiJÂ~=­Õ”‰æÁŽ^D-EG3 xÜ–UE£¹]ö¥Í¬šö;q@í®XØ:B^¨ ÿI¹~´ %Á¥8|Þ%Êi +A€Î=ZÓö+X;LpÇJÍÝÉO0œ_ô1íÁocXîÌhp8èìÁ¦™¹¡÷û{Éõ8é Ù…^´£)Õ„ãMU÷Ãe=vµJ4qôddÐþÞ[£ñÖûg€>i›±ææô#Œ0Öß–¹ßž?â“Ç D¬1™Š§Ót$<cK£ïum­"ÓZÇC¿FΘKŒ6g ±ú¦c³‡~.QÐï(5öã÷áÿþ)åøÛQ”0•¦rüWü‘ Â÷+ +NoÒÉÝo.÷Eÿ/Í’ÕYendstream endobj -1099 0 obj << +1104 0 obj << /Type /Page -/Contents 1100 0 R -/Resources 1098 0 R +/Contents 1105 0 R +/Resources 1103 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1066 0 R +/Parent 1071 0 R >> endobj -1101 0 obj << -/D [1099 0 R /XYZ 56.6929 794.5015 null] +1106 0 obj << +/D [1104 0 R /XYZ 56.6929 794.5015 null] >> endobj 170 0 obj << -/D [1099 0 R /XYZ 56.6929 691.7741 null] +/D [1104 0 R /XYZ 56.6929 691.7741 null] >> endobj -1102 0 obj << -/D [1099 0 R /XYZ 56.6929 668.7722 null] +1107 0 obj << +/D [1104 0 R /XYZ 56.6929 668.7722 null] >> endobj 174 0 obj << -/D [1099 0 R /XYZ 56.6929 579.8329 null] +/D [1104 0 R /XYZ 56.6929 579.8329 null] >> endobj -1103 0 obj << -/D [1099 0 R /XYZ 56.6929 549.1878 null] +1108 0 obj << +/D [1104 0 R /XYZ 56.6929 549.1878 null] >> endobj 178 0 obj << -/D [1099 0 R /XYZ 56.6929 502.9124 null] +/D [1104 0 R /XYZ 56.6929 502.9124 null] >> endobj -1104 0 obj << -/D [1099 0 R /XYZ 56.6929 474.9173 null] +1109 0 obj << +/D [1104 0 R /XYZ 56.6929 474.9173 null] >> endobj 182 0 obj << -/D [1099 0 R /XYZ 56.6929 277.7919 null] +/D [1104 0 R /XYZ 56.6929 277.7919 null] >> endobj -1105 0 obj << -/D [1099 0 R /XYZ 56.6929 249.7968 null] +1110 0 obj << +/D [1104 0 R /XYZ 56.6929 249.7968 null] >> endobj -1098 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F39 895 0 R >> +1103 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1108 0 obj << +1113 0 obj << /Length 3203 /Filter /FlateDecode >> @@ -3646,53 +3667,53 @@ gUB Ê-;1ØxÈkÊCN.—²ƒÂ9W‰;hYq  c>ú ÒŸe.èÓ ÐÐf_zÝG}Åq¯¯¯0!3ÃJ÷9ßH´15ü„ý’Ýú8€‹HݼR¦X3¶!̱~Æ äë“忶N¢£ƆˤSÇ-’®1^U'>Ç;õçäEa Q1^"/µ©‘¯o=9$þÓ†Iì™ ØKA!8ûI¤…ËÇDã‘gÁ…¥ - #yp²›ì Iªˆ‰ ThÃ)Æ¢ö§ñ¾”ø£ ‘€ìsÏ”5G?‘&‰1ˆÄ†æÈÝ$¨Ó0‡º¡è o?|üxý†×NŽ"}Ë¥$Œ€IÍ¡eX.¨&_ q¢”M7ïä€Ð+{˜û ÍÍä–af0€{=£Ê _l¹w8ÞîÊÍ—` ،̿¿aš˜IÆÅï×åÿ٧к±ÒíäÙ9”ÄîÁ5h ø~FîgÎ¥üm¾÷_òª"»„n¾BˆþËIûÊûåò¡Ü¹>âèƒÜÃtý'œÆGUÙ•>&û2~ÿAcò‰f¶(Jo¸ VÊ|œè£F˜êF*­&^¨ú‹ávÇK¤Ê ‹$—1R6Èç º;n™z õ£ƒ¤„HÔVB<]ºôÕÄþ4`™{"ò‘¯NøÔ×w­¯ÒÓú¾ëÜþp’óïj–.þ&Y|éßÆÝfž‚kˆ3¯pÂtùîÆFxôés±v )âjR^¿ùQötò‰kßNëýEÀ %ðßÉg×µ§uøRØÕõΟåáàmˆ‹%‡…^vƒúðRˆ˜¿ãI{ |&2I¦ÚÇlU{ö/8eûœ#8÷ƒcüȨ̀,Õƒú¿l2üº&J“¦g¾‰Aö¤a–x¢È$ÚSÊû_¥<'ýôJ„endstream endobj -1107 0 obj << +1112 0 obj << /Type /Page -/Contents 1108 0 R -/Resources 1106 0 R +/Contents 1113 0 R +/Resources 1111 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1115 0 R -/Annots [ 1111 0 R ] +/Parent 1120 0 R +/Annots [ 1116 0 R ] >> endobj -1111 0 obj << +1116 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [418.3461 611.3335 487.0181 623.3932] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1109 0 obj << -/D [1107 0 R /XYZ 85.0394 794.5015 null] +1114 0 obj << +/D [1112 0 R /XYZ 85.0394 794.5015 null] >> endobj 186 0 obj << -/D [1107 0 R /XYZ 85.0394 769.5949 null] +/D [1112 0 R /XYZ 85.0394 769.5949 null] >> endobj -1110 0 obj << -/D [1107 0 R /XYZ 85.0394 749.4437 null] +1115 0 obj << +/D [1112 0 R /XYZ 85.0394 749.4437 null] >> endobj 190 0 obj << -/D [1107 0 R /XYZ 85.0394 597.4103 null] +/D [1112 0 R /XYZ 85.0394 597.4103 null] >> endobj -1112 0 obj << -/D [1107 0 R /XYZ 85.0394 573.0707 null] +1117 0 obj << +/D [1112 0 R /XYZ 85.0394 573.0707 null] >> endobj 194 0 obj << -/D [1107 0 R /XYZ 85.0394 410.9267 null] +/D [1112 0 R /XYZ 85.0394 410.9267 null] >> endobj -1113 0 obj << -/D [1107 0 R /XYZ 85.0394 378.8211 null] +1118 0 obj << +/D [1112 0 R /XYZ 85.0394 378.8211 null] >> endobj 198 0 obj << -/D [1107 0 R /XYZ 85.0394 204.765 null] +/D [1112 0 R /XYZ 85.0394 204.765 null] >> endobj -1114 0 obj << -/D [1107 0 R /XYZ 85.0394 171.4256 null] +1119 0 obj << +/D [1112 0 R /XYZ 85.0394 171.4256 null] >> endobj -1106 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F14 737 0 R /F41 935 0 R >> +1111 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F14 741 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1119 0 obj << +1124 0 obj << /Length 3252 /Filter /FlateDecode >> @@ -3713,133 +3734,185 @@ R UˆÄuV¼¼Ô)e ç/> –|}Ä[¾¸»¿‡CÔMT4ÃðF‹Ó üIT¸ ;?ðËPñVUè‚èô7 øpiKìOD“"VØØŒ66ð8uRÈ(L0”lÙuÇ]‰¥¶â§s$ôuJAï¡þœ .ºj2˜dàJU>¨¡“Ï•ÝPK'ºÈO1ta  øŠ#~Õ Ä9ÖsåÖåqÛ³ºÊp0ºÈe©ó['‚|ËÅežÿ~(!ˆA§Ò`xË0zDúÜMç8kO&.βºóhB×íÄe¡þ”LGOéßã¬ÎV¸@8¨aÔ8~?{%ÚÕFªµ›ðËþ”sÁ4µÈOJÆÃN//çì„èð’q$Ϙ}¯\èžôv&ÉŒ® hΨY*“Ìæêì]ºmÖŸsewvèëÆ “ +â~Ú;Ä(>õw¥üÎÄŸoDÌvþç¿úœþÝ’QÖ¦§ñŒ“< ÂI˜)Üvš_pþtÉú‡B¬ðendstream endobj -1118 0 obj << +1123 0 obj << /Type /Page -/Contents 1119 0 R -/Resources 1117 0 R +/Contents 1124 0 R +/Resources 1122 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1115 0 R +/Parent 1120 0 R >> endobj -1120 0 obj << -/D [1118 0 R /XYZ 56.6929 794.5015 null] +1125 0 obj << +/D [1123 0 R /XYZ 56.6929 794.5015 null] >> endobj 202 0 obj << -/D [1118 0 R /XYZ 56.6929 769.5949 null] +/D [1123 0 R /XYZ 56.6929 769.5949 null] >> endobj -1121 0 obj << -/D [1118 0 R /XYZ 56.6929 748.4014 null] +1126 0 obj << +/D [1123 0 R /XYZ 56.6929 748.4014 null] >> endobj 206 0 obj << -/D [1118 0 R /XYZ 56.6929 549.4516 null] +/D [1123 0 R /XYZ 56.6929 549.4516 null] >> endobj -1122 0 obj << -/D [1118 0 R /XYZ 56.6929 521.7105 null] +1127 0 obj << +/D [1123 0 R /XYZ 56.6929 521.7105 null] >> endobj 210 0 obj << -/D [1118 0 R /XYZ 56.6929 231.5025 null] +/D [1123 0 R /XYZ 56.6929 231.5025 null] >> endobj -1123 0 obj << -/D [1118 0 R /XYZ 56.6929 201.1114 null] +1128 0 obj << +/D [1123 0 R /XYZ 56.6929 201.1114 null] >> endobj -1117 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F48 950 0 R >> +1122 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1126 0 obj << -/Length 2922 +1131 0 obj << +/Length 3056 /Filter /FlateDecode >> stream -xÚµYI“«8¾×¯¨x—qMua$±FǼ=ï;^»ç€6‹ x˜ÿ>Z€²ë1óº£c„”Je~¹ -ƒWÿÀ«"rŒr¾nÄ3ˆÉÂÀt»à@ÀKœ"ˆÙyÓ‚£€Hâ##a1kò4c|4ÈÖ†$Re‰Šú å'ì8l(|d€Ýêô¸€qŒnlx]*%¿l#(s©¬à5?f‹…ü@"‡x™Å3 E„ã’çùR- ˆKاˆ@AÙL­èlEEøb>ë 1Æ„ö¦Â",¢¾ñ¬üð› 'è>s­/œâ JJ•¤L E&`I?¤>wˆ\=±¨Ÿc:FÓ”o<ž¬8‰ÙÌ–íósB’‚èŠ~ù4~5<ÃÿR  -›PÈü0ÿ'Íuú@ŠÊ!I@Ï&÷OqjÀMnî/½Y1µ#Èœªâ¼ô8RÀÿ\âTA¸ÀÉŠ'LϺçšXòÆã¼_,¤xé@²b§‹ØBœº ßà…™ 1úƒÈIXg™Ï‚‹¤·"–œ$æ~•rLåÇI°Ð2âp -Pþ°=Xb%3¡_5 éÌ’3²Ì’º NN…yÂøñP#DêŒéÁ8ØÃÂ%s²(HFæ0‡mÑÁ*'㺕’rj|àŠÆ)=;ÛÏõx”Y4! ÊX•ƒKjP±ÃlÙKÚl<™Äl°%ù™P‘Ì•ÎÑŒIGO.6\î‚ôÜ'Ygçî c•ªíé´qg­üBžj>ƒJ*[0CÚ≠LØNÎîöÆ&I¯ª'iŠI ÀÑy¡n¦liwŠ—XÛFSÛâ9³d Ÿ'ŒÜ§ÛsJ•†1Y5C6EÄÈ*ÙCdÖWÈ“ïÁ2\È_AÎ=ä3S²LO'³¾¶ jV¶ÌPz¨ûRɶXo a$\ˆÜر(ÐÆâ„ñJ·ƒkè{Üþ£x2u|<òÂpÏF¤v`›Óð$ ÌœxÄ‚$“y^xÁ\TmœRÉÑc6Ðكن "ö|ðBœã',<ÖÊ`¯Y~’RªÙùxÀ"'¤9MPð­ÀÍN"re㬠<>»)"À)‰éà‰+“ÆÖ÷ž!DrpÈV7Ö³®,¯äI‹‚Êt—ò„‚GéÕIT1Ôí$R¯±ë)Aª(1E1%¾$éMãRæLx`”põŒºa}Y*P@¢Þ—0í½8•2»FIŸ)©ÀŽ¤abæ!{hÇ%Ö>>=ͧ†¯Pìϸnü¼©CrÞú+–®ïŸèõK`ÑFæŒÐO;iß­Œ0H‰œT˜Ìß³Øå‚$!"H2Sbziq“[¾L“€ƒ_o=×Ãìâs}¹pà7A’~Lܾ¾ü‹ž"Èœy|KÅ}Œ -x—é’Hn„$§r²€ØÂßéB&ÏÃÂ$$9“°íZ¬ü‰ôò ¶§|æË™Â"'B=;ö7îã E™ ÐÓã[u°.Ñ¢‚Ú¶ó^[š|4_ÞV~¸Iä¸ÑØv‘áM6M]»L;ר¹¿váú$µåѽsbG㻺ÌÓúñuCµ¯Â¬îÍJË[v͆p_µG¯vƒ³Qƒ3Õ_;{sv0Á<Ë­Š¹XJÏï{Á}…Šüø~ƒË›°÷ÃJ]ݧgÕÒý2ʨÕÜU{úT¶×ßË»Ív=ëžÝHkEPlöä©6žÝ«q_ Û,ųƒ›6kÅ AKm%:ݵT;~¿ú•ùzy×ÖÜ«”Aψìe¹Ûo4Ír¡Šîéü]8vj7óäZ­Óþ´B-aÙ¯“÷««C¦bОÎ~9¼-&JuQvæ}xŠTœÖ4ÇkmÑÕ]yV}“”C0ÔƼZáÿ‘ùû§Ñþo‘Æ”î̹Y†ÍÍ @*íËø¢eñYMÈ‘OÓk>*õúdTá íg~>Sá”Ûöpv¨Ž:hÚ÷‹qšýÊË ”ñqŒÇã -W¸ÄÂ/içóèÝí9M-4¨.ƽYûÞ:ó5ºÛö -.MÚ¯CÉà‹ žÄ÷Õq“œ Ç·Ç5¥v~y$Wê7Ë–žbÚœ¡ØÕ‡æ”/2ómØ–ªö(¾¼¯ÖæÝ[õõv§¹ú‚y »mçn®oc¸Y£Ým\$„Ыò^MÖ‡AÜ¿­º­ÖÊšœÙÉ£ë®=^úæÑvšÇ÷3n›¼TX°ïàj¯:ŽÕÚÛÀMâéöµ7jÂóR«—'Aoù^GšõŠ”[U«ãTÖu±'ªóón:Š×–U¯Ín‹Ut­­x]oOÎN½^t¾§ÝóƱ,­3󥆳¿ß’ÁNª4žì•]Ùm+î&wûBkþû׌3 öûÞ_Ü -=îæ8î¿ýÝ‚°«#TôçŸÓ_þ+æóß',Røù/ËSûJ>»ãKB& ù«äù6?Šþ¢Ó, endstream +xÚµYI“«8¾×¯¨è˸¦º0’X£cÞž÷¯Ý}À€›Å¼NÌ-@Ùõ˜yýbbÂD*•ÊåËT +ƒWÿÀ«"r† =ëžkâ°7œéA|!0¢SîÇS!6 b1Û¯äMýÌÿ'€ +8¨Bðý.áä…bÆMŠc‘HNP}–˜êKhTrŠ,dÅ%<|°´ð ‚ñ­|©X)nO,܃nÒ2‡i$ð„BRÂÍJW‘¸³jŠ_ò(§kšªdÆ ±ÚÔÛÅHôP G$"˜À>FÈ&0Gº¹g陊¬L…¢7r ¤z`8¸¶e˜¢†‚ÿf#/(4©LFe%žŒô¢hÜm¨bŽ$ÂR-󃂑N…yélŸoeEÑ +ê¹(q²$¡GPsXÏm‘p•“å\®@Ù¨âÆB’¤çìú±Ò2òŠT{ìà’¸gÈ–ÑØÇÆ“IÌ[rœ.RèS=`èèI&=Á)/VºØÏ–¤L$NQœ0>Ï öŒL@õÄgD·CÚ‘~p\ƒÁ>3ç õ†£“µPÔòÌpD„JÚa:õy.qgÁ{>AEù‹ØÀIêC Àš#,üûƒŸ’©/ÙM^?ÏübZ–ŸéF‹~ZW—B^M3‰Zà“ˆúòø ƒÂ—S>¯×¹±xœº€&uËC±ð= Ym5¿œPÈ%?I(,Rδuxê5²‚\„pþg‘ÓQúŠlv<ÅFän2¥)8ðÓŸ™ÝMí§µê™9ÉO?34N$ѹ‚tß']gçî‰`¥E⋈BŽYÍ)¸L² 3¤=4&aÂHø4r·7F$­½ž¤•,e Æç…º™Š¥Í<žb].™Lc‹i4gÉ@?%¸†º¸Z¹ç”+Mc2k†ŒDÔx*³ @õyïp° —$òW'çù,Èìh£ÄìPÐ&T¶,Pzh“¤’m±V +÷¸än0’‹:zÏ€¸`¼ÒíàºÇÞ—¯&¦ÀÇ#/ ÷l‡¾…cNÓ“L°pâ3’Jæyá…t:E®jÓä”JŽ³Î,6d±ç +q;œ°òØ*ƒ½fõIJ¨fûãËœÖ4A)¥íÙ‰è•óîG}ê~ˆ§$¦W¦'©L[Ü{æ!RƒC6»±ŠNß¼(n©Ìv)/(x”Þ4EûƒÂN"}"Ƹž2¤†â3sâË[’Òh—r0©ô쌺a=Ò ã÷ÚKz 3Ý‹S³+§ôY +‚HÚC²†vG¹ŧ'zz¹úzYÇ`?na}ös$„D¤ëû'Ú ,ÕÍýôÖá»±•1)““*“=[ñ7&âF¦pÊL/xnr˧iErøúýåðx¼Kg·¼˜+èrÈí ¿ ¸3ù®lHø®÷Oº ãö˜ÇWzˆ°Ÿx2—é”H®Ï¤¢r²€ØÄßéDº‡‰IH*&ÛµØá'Ò›*XžÊ} —3‹ENÄýÔ3¬á~a’¡(³zzüR¬„K´èƒ ¶í¼×–&Í—·•n9n4¶]dx“MS×.ÓÎ5jî¯E¸>ImytïœØÖ²ÌÉ<==\ÝPí«0«{³Òò–]³!ÜWíÃÄÑ«ÝàlÔàLõ×ÎÞœL0Ãr«bî–Òóû^p_¡" ßopyöÞbX©k£ûô¬Zº¿Sæ@µš»jOŸ'«ó¾ìâºrØ­lgû.m^ä÷ö¦~/ÊùþkA¥6Q€\ÿ&T«º<›”7V½u;ˆîB[.¦®´ôÃNoÓT§ÆÑ=™ïÖÞy9Aý"ËÞl6Ÿlö– Ú£ÎÔ5ý.ZßjžçËiw³³Ê‚8힌–\fâÎÚö“£$ÙÝÐïÞ %º*ÛÙÜ’Oªº¸k=ì£w­;×Õx ùocUž¾÷º3í06ŽPžÈ •ç¢3_§F»ÈêÁñbÜ…Ý긮ÃíØ´¯£®Õ¼_›TM×µn½þà¾l¢_~Ë¿[±ðþ4Èá#L ´)ähq$ƒð” ¢Ïj÷·8çºè‘É^²o‚¯©ä‹æO%”Ç$?{ÁºêþÛéÛ +3DL3¤riT*úuÔ7&ðÊ·6ã¹°°ÖU)lÔ—ï?îKbwãh»hÖzeâœÆzÍÔp"/}¹Ñ¢•êníÆé(Ÿ×å{s=3ÍÁâöÞYßO1ïÍÉÅÞ5/Îl +DQim„Nw¶Ùc¨}åpYz;¾á.QXÿ6÷w­¡ vo_2fÝÙ¶ì×äÖy{YµÊU ÂfP+B†¹A·sC[¸]îCua{ý½¼ÛlÙ³îÙ´VÅfOžjãÙ½ºgñµ°ÉR<;¸i³V Ô¹ÔV¢Ó]Kµã·«_™¯GwmͽºAôŒÈ^–»ýFÓ,šèžÎß„c§v3O®Õ:íO+Ô–ýŠ1y¿º:d&íÙèì—ÃÛb¢TegaÞ‡ç ÈÄiMs¼Ö]Ý•gÕ7I9CmÌ«þÞ?ƒö|DÚrvgàfí7'üTÙ—ñ5 Êâ³™#ßñ!×|Têõɨ Úp>Sá”Ûöpv¨Ž:hÚ÷‹qšýÊË ”ñqŒÇã +S—|K¢_ü6ŸGïnÏijÁ y@­p1îÍÚ÷nÔ™¯ÑݶohqhÒ~J_ð$¾¯Ž›äl8¾=®)µ{7ÜõË ¹R¿Y¶ôԧ͊]}hNù¢0߆m©jâËûjmÞ½U_owš[¡/˜·°Ûvîæú6†›Õ8ÚÝÆEJ½*ïÕd}ÄýÛªÛj­¬É™í<ºîÚã¥oía§y|?ã°ÉK…Öâ\íUÇQ£Z{ø In_{£&> endobj -1127 0 obj << -/D [1125 0 R /XYZ 85.0394 794.5015 null] +1132 0 obj << +/D [1130 0 R /XYZ 85.0394 794.5015 null] >> endobj 214 0 obj << -/D [1125 0 R /XYZ 85.0394 717.5894 null] +/D [1130 0 R /XYZ 85.0394 717.5894 null] >> endobj -1128 0 obj << -/D [1125 0 R /XYZ 85.0394 690.1986 null] +1133 0 obj << +/D [1130 0 R /XYZ 85.0394 690.1986 null] >> endobj -1124 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1129 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1131 0 obj << -/Length 2380 -/Filter /FlateDecode ->> -stream -xÚ¥YKsã6¾ûWð°ªÊBð"H:'gÆ“8•õxmMöÉ¡1w(RCRÖz«ö¿o7¤(šv¶jì*£4~|hÐ"àð+‚È0“Ê4ˆSÍ".¢`½=ãÁ˜ûùLxžeÏ´sý´:û჊ƒ”¥Fš`µÉJO¬ò?BÍR¶ <¼¾ýÝ,–2âáý§ÛÛw ‡+¸¾¡ö§ë›÷D¥‹¥†«ðÝ/—·««;Õ^ÔåûßBˆðòæÝ•_ðþ枈W—‹X‡«OwW÷‹?W¿ž]­†“ŒO+¸Âc|;ûãOäpè_Ï8Sièp&ÒTÛ3)i¥ú‘òìþìƒÀѬ[:k=Á™TFΘO‹‘ù‡Y¡LG)3J*g¿¼j[»^Ú*{(íbi8Ÿmû#ž ă‘XErÌú”•EžuE]MØ—:f‰äñéªÿþøš•àÓ èøÿ˜IH–¦‘ž7(ƒPÍåë²hYžìWœŠ:£K´Jk‚ņƒm#™Š… Lœ2A âaoð¬Ž3e‘£9»³HIÐÜq|£ ŒK#ë©e@&e1!Ò·¾‚q¦Š˜F´;ëÑnà‡ë­ Þ×p¢`t¨^ðr,Ù -âæ"XÀûƒ'…ˆS:S]A`È8 ë ¶IØ=ú¯ ÉC‹ž[š*‹¶³9ÍUÏ^´4bŠ‡ÿζ»ÒÒTÖxIO …XJGáuE㻬Y,5»b½/†<Ÿ(ÑÔuGC#u¼^« -8fz´éÄÚ€S“4 ÆAð}q…¥ë˜Ëßõ§¡ª5ð ¡*¡™ÒFŽ3ŠcÎX÷À È9çSœûÝ®n:ê8÷M@óÝ}È€Ie N<3a±Ùì˽ÁMØ’ô–&²²$b½oš…HB[uć¹ý̹¬\ ¡ŒºÙ¶$Ã… yª²­%ª«½ä<'­_”UùìÌqÉQHY×_÷»–ÍÅ˵·Ì¡pº••mMÔ¾µþ®¬9ÚͶ4ÔyîmöÕ³ÛÛ¦è§Ö½Y$ᾪŠê õk?žUÓ]ÖÙŽ ;í3¤ßö¨|ÌR%§ü‡2IJ…Ö° OæMsb²‚„ì¬}v®1;±(Bí•[·ÛÐâcC‡¬;#zÞsrä9 ðõÚî|žù#`Þ4°ÝÆm=Ú™§|'§ƒþ¥éÓiž' .gŸ[¦_††¶45J£'»r§GƒÓ0 ÚçLYI3Ÿ¥ÔUñi‹1!ÈeÍCä4ê@EÚoÉ=n‰jq¬QÖ`_gçÓµ¯TAç~­µÓŠ[Eƒ‰L<Ê=ži²ùâŸ7w£WïÀ¿/èßicà›ÊE ÜÃuVô5Õ%“L¼xðÖ~Å¿x{\¡ÅKi¨óØ'ÆïJw²8uG„G‡ÏÂ×ë—`Qª`AùßèF¢Î§öxóQiÔÞ{pÏ×î X z¬¨‹zç2DH5^4¹Di̽°ðE >צ®Ëlp/¶#ÙxáIÎJuÅ…‹2Oí«²øjO„èéUCªš7äµ;».0l;—GC¤CÑXŒÃy6ŒOŸG¾AË÷Uø© -ˆ¬‚“ÎÒøœrò‰’²$¡4ýÛÇ»ëŸñÓ~eñ«€=›;ÂcÝB†ÆXðÃVšÓ‡/ìöá€cÀ".ò‡äâB¼¨‚üÂÊG)í[)òß²¨–dœÙÂMN@zòäÁ¡¢¥…„t0Ð[g»µpMäî“› -¯7^5t\ç.<7SQK„S£Ýš£ˆ^GfˆŠ×/†qˆ€[èò::-vÞ¿÷ºÇo aàÍ>Ô)ø¹) ‰I˜ö 2±/.âF'~QÖN°vt¦yxJ2ŲÇ3àƒœÃ‡þÅyCO‡7ãƤþ#'!þ_BÆ?݃UqzD:QØÙï¨ÍüäIòà@á'*¿'ÒC}¤àùáì1»«¸«Î÷³>_±Ó$ÏDŠ÷ÜI5á¿ö.ª¸vv÷ŠÌ=ô!ļ"xß½t½†rZ¸¯p㺛Í,‚HHDÏØë ƒ±Oº ‹pt8³?ð¾ì¼Eµ«# StìÙ 9µØ¦.Ëú0øâPïK¿fý„¯b*r¹f1“"÷ôÕƒ©1Ľæ_a”²C¾¼@Í™JxèØ[çm`2‹#Õ'›‡o2耵_EQÎNöÀrh…ëIvâÉ)Ä -Æßú…ìK` ¡5¯£ïíê=ÀÉHlŠåsÇ!¹õ|ÑÁ8øî/¿ ê˜)¬’f«xÝaõ¢z¥œ³’š÷ÿ‡x©úÿC|upendstream +1136 0 obj << +/Length 2753 +/Filter /FlateDecode +>> +stream +xÚµ]sÛ¸ñÝ¿BÔŒÅàƒÉÉ“/¶{¾i×ö¥—{ EÈbC‘ +IY§Ìô¿w LgÚÉ]2c,‹Å~cñƒÿ|«Pe"›%YƌdzåæŒÍžaîogÜÒ,ѧúéñìݵLfY˜)¡f+W²4å³Çâ· +³pXps÷IÍ"fÁïwwïç2  qsKãO7·—eóçŠÉàÃÏwW÷„,«‹ËOsÎypqûáÊ.¸¼} àúêbžDÁã¯÷Wóß9»z4ñµåL¢_Ï~ûÍ +Pú—3Ê,g{ø`!Ï21ÛœE± ãHJ‡©ÎÎþ90ôfÍÒIëq +©Ä„ù"î™3˜åRÍ’8 •ÒØ/ CÔXAÂ,Ž…Au×éåB×ùS¥ç ÅXpÐÝûï¾äUYä}ÙÔ'ä‹( SÁ·ŠüöŸ÷oO%iÈWÿ“õ¸³,Ž¦­‚&À4bâm^´Ž/ ºǬÆUŒ‡±àÑ`d0ä`ŽÕL‰P& ¼R™’“‘oQWC™…±¯w„± ¹¡øFã®JW§–ž, Œ,L²ÄÄÕì댇,Ê2IDltm`ïn6bvÙ€F3O)Çxás6JA8‘ùT°¿@Ö6:55†H² Yá˜ýÚ"¾Ì 4þ9t4U•]¯ š-kG^v„ÑsÉ‚?òͶÒ4•·–ÓË\Ä$¦Œâà¦&ü6o狈}¹ÜUC^žŸÑ6MO(O+•ªŠ£€¦Ðô6=qD¤²P¤Y:óƒàÇâ +#8ÎÖ˜â?õÇ¡Ê@^¨¾.§qAA îÿZk4±H±à=\} ØÏmü6„‘ÊCAympN;çiÐlu[͹±9 —Mý™1ñ¼3“º@wIaÝ« Ý5Õ‹n ³/«ÊŸû·^ön§ƒº½n;ÚaEÛn¦\Ú•Ï5í ‘ÕÊJAßß ’;÷ër¹&p•—A}C£µ‚¶lH_\D‚D\û][Ûƒ–8>]ã‰qqó÷c~¤;˪Ôu?ÔaÈEÉ ~¯»mSwF¾4 +6ù+]7À8éì|Ó@¶Àd)Ðw,œW„$ó¶@­2 Ù¹¬vEY?Û Ë®ƒ3)ýǶôüän›²6ûÛ-ÀÚùbê¬è­áÍn‘ +râà‹>àì`Ñ¥£È¤©AmòÞÍ’í¸| ñþ¾Ó–ÌŸ«îZ÷Än0òI^»µGÑ+°ña†@£•4 Ï©È3¹ˆY.³ÖÚ׋…²·8Êê¢uÝì*iëüņ̓Öõi4‡o¨Qšaʉʓäÿ)}Ã’· +•„MUuõûgj54ÊTúgž©2!Röœ©>ç·ÏTìð Á~õ•.ve4FyobæZ½Ô¥Á› ‘ƒfbSX¹jMˆJÜ0îjªƒ4ÿmÎã€q³aÞ´Î}®‘­SÙ ±Jq,%,—$霳`×™/åÊ>JŽS†b_ökš5Z"Š89dnY Ó£¨H°Ç/§Êº‡•p2åUu ùJ¯,ƒ]=Y…H#l)¤ +nPíx¨7±r àž\Ó0ÍËÕÁE¸,¼”9Q Æcw8ľÿÜÜ-œ«ïð¤oðgÓju>UB¬kÆæ&ì…°çGøƒ÷9T1×áÐhª$Œn+ó±Â¶Ë•Ïz¹.«b¼$ÐÅ +ʸ¹54XŸ>c tx?Peï¢{ªî$ü}\W‡-|óÜ9ºm£ÿd´<:~°ðYþ«Nîñ³‘;xMzõæÐį¼`…¦GH}$[f<»vß·Ú¨Íû!qS&¡êÃX]”KÈU,/,¥ªhw +#Œ&Ç9Ú÷†RA3û™ÅìU€~¨i‰ý„‹èé!8‹!&¤‹JD9ák"D…>pŸW +M§±EB‹ó¸v—œVÓ[焾9ñøP6uìÕè°¢4åo^ŽüÓü;„¿òv„bŠ˜ç³à3…2R¿ ‡Y)÷Úîe _›^ÜkÓn»mÚÞöqõë—¦±OqEüWiƒbÈÕclаڙÃL0tĽ£‰ÜÜ4w»>‘(“ ÐxÒÒ „<švÓ“C€²2Tç¦Öd‚9…ítí"J®×3ã’‘IÕ4_vÛnò%é¦?½%åUg»Þ]gÛÙÑšÞnîRæzäMþÅ’Ýé¶ïl®nç)ùõÐ\7µ»©î²Ì·ô°e:èC×ëÍÑõËH~mJ•hÊ=µå!¬¾çt µî|Fƒõ\~;B4µq@ð ÒÒ]:Ì[ƃûë4 ­‰$¨Ð[àdÉmh{s–Öˆ¸ËÊî¡&w8ŸòyYeöºèÊB¢Â>è: €á ã oBîs ]tŒêÃ’Mó¢í–Þ=*2ðø +U'îïªxw6U .³»~Ý´eŸ÷å‹žRǹ"%W¤.FVëöžÀG?<.TMn0¾QO&R¥-­í¨(ªà›Ì›& ç$dè:@u;…©‰ÏÈæ­CÚ× +ZìëÆÊNm(}Íc—r—RÀ›³xB-ÿýRFtÁQSE3}iDŸ¡ +c˜)ì-,)4ØîQž]b&8~GõÛ l_ PFUl„¨bL݃™G“!@…Û°¥ŠBT¿§ªæi¹Ì °1ï÷*×J@¨´/¥ÞÛ¯ÕÉ‹îàÿB”eôúìÖ¾Ñ oÖú´ß–1 £43hP%ô®ÐÆÒTûlߨî½_ êÅHþú7Sž¨ûd¥k¥.Bè[_uþ,UP¹FÖ¯~¥h¾»ÿ)'ó å[ÏšP¡#)'·cÃóáÿ;^¢$”i*§%‡zŽ’ËA*]¤¯dw?ÖNÿ_ëÞÍ&endstream endobj -1130 0 obj << +1135 0 obj << /Type /Page -/Contents 1131 0 R -/Resources 1129 0 R +/Contents 1136 0 R +/Resources 1134 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1115 0 R -/Annots [ 1134 0 R ] +/Parent 1120 0 R +/Annots [ 1142 0 R ] >> endobj -1134 0 obj << +1142 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [349.4919 384.4828 408.4801 395.2672] +/Rect [349.4919 62.7905 408.4801 73.5749] /Subtype /Link /A << /S /GoTo /D (ipv6addresses) >> >> endobj -1132 0 obj << -/D [1130 0 R /XYZ 56.6929 794.5015 null] +1137 0 obj << +/D [1135 0 R /XYZ 56.6929 794.5015 null] >> endobj 218 0 obj << -/D [1130 0 R /XYZ 56.6929 594.1106 null] +/D [1135 0 R /XYZ 56.6929 285.3652 null] >> endobj -1133 0 obj << -/D [1130 0 R /XYZ 56.6929 562.6395 null] +1141 0 obj << +/D [1135 0 R /XYZ 56.6929 250.4165 null] +>> endobj +1134 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F62 1065 0 R /F65 1140 0 R /F21 714 0 R /F39 900 0 R >> +/XObject << /Im2 1054 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1146 0 obj << +/Length 1018 +/Filter /FlateDecode +>> +stream +xÚ¥VK“ÓH ¾ûWø°» +÷öÓÜØP[!›ñ°àà;Äà×ÆÉ üûU·ÚÆ™1Ãû ~I-}ú¤jæRø™+BE"Ý(‘DQ¦Ü»Ú¡îgØ{ã0{&ÓS/SçÏ×"r’„ÄÑÒg‚ÉÑg±§i™ãZÙ£ÌPtp>;fUUT¸pj­œØ–z$½Y«/`QP/k†Ñ¹©Ê¯Å…éåEgÕ²Sa=Y†ÏØë»â®üH)/ :òqˆ VEs*Ñ€%"£ @7ðec7Phä+«uéPV0 4LñŽoYÝUÅ Lˆd’8ŽãÖïvë7šÏ!ÕÈ][“¹mòƒˆÃQçá.I±ôtàƒ^ƒ#l‘ßÆ‹û )&>Üô”Òk÷Zbƒ² ½Sg]§³ Ç˜j³Tö¨Ø´'\à©ë¢É‹Ü”´ðÖ{k†£õ™5”5(‘Bzkr$Z(åwñ°fð VO9y1þM2ª³[åé0“.èJPï\‚ymu±Ø÷` ',Œ‰1ƒ¯V¢¡Œ¬Rfé4Rp±êíø̉T´¡c4Ÿk¦An²ºx¾elÊÛÛÂÀÖ:;ýºgü{(4ÐÐœ+°jLéɹC™ÙÍ‹êÑ ¥Ýhìz¼7wêD²ñ˜Uâtm•jçÙP°zÒ—P$ßqŒë÷ű/rc5ô¾œ «¨4¸[Gf¢)fV4“z©ˆb‰°I,»dÇ.#3€)`B̆ƒƒÏP1šûè‹N‘^c¶Ÿ«“ETz ¤*EF¶“ècc'¹DlßVUû0æâ¡=Wö"ìší}™&j ‹$À1DÏ&åa€³¥1r§2ÜÁñ~èh¶`°dÇzyÒ6g +žœµð|c +‰”ŠÌ˜ x(`hÿ¼RrùÇä–ä ™™qr‘ÊÇ´`„>÷CùÅp“R÷ßpÚ~·éN§€"Jäq3Ÿ{@uë'ÅÌ[‚Žýà·_.?u2""ŽùGÉ{ACó$œ2Ùzò®Ÿ8O]ÿ¬ÊƒXendstream +endobj +1145 0 obj << +/Type /Page +/Contents 1146 0 R +/Resources 1144 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1120 0 R +>> endobj +1147 0 obj << +/D [1145 0 R /XYZ 85.0394 794.5015 null] >> endobj 222 0 obj << -/D [1130 0 R /XYZ 56.6929 370.2937 null] +/D [1145 0 R /XYZ 85.0394 769.5949 null] >> endobj -1135 0 obj << -/D [1130 0 R /XYZ 56.6929 341.714 null] +1148 0 obj << +/D [1145 0 R /XYZ 85.0394 749.4437 null] >> endobj 226 0 obj << -/D [1130 0 R /XYZ 56.6929 214.6004 null] +/D [1145 0 R /XYZ 85.0394 622.33 null] >> endobj -1136 0 obj << -/D [1130 0 R /XYZ 56.6929 186.0207 null] +1149 0 obj << +/D [1145 0 R /XYZ 85.0394 593.7503 null] >> endobj -1129 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F62 1060 0 R /F21 710 0 R /F39 895 0 R >> -/XObject << /Im2 1049 0 R >> +1144 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1140 0 obj << +1152 0 obj << +/Length 69 +/Filter /FlateDecode +>> +stream +xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream +endobj +1151 0 obj << +/Type /Page +/Contents 1152 0 R +/Resources 1150 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1120 0 R +>> endobj +1153 0 obj << +/D [1151 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1150 0 obj << +/ProcSet [ /PDF ] +>> endobj +1156 0 obj << /Length 1913 /Filter /FlateDecode >> @@ -3851,61 +3924,61 @@ M&P q¿–D"mX• ‘¹ÈjmËúÿ@CH®2#¶¦È²&RØš8"u£´÷Dí¦ñŽÌ~§¹G@ 8È°€¿¦¯Ðžt–æøúê¾QCJºoæ°Ù²(î Ç<Ž,üˆ5kõ46i]WMPº/Ÿÿ¨Î ‚oœ»p7ª2ö·¸ÅÓº*#¼Åð`' C½žu¼?\: jº·3äŠÅ.…îÙ|˜ëãц›À¥Yé›Îe<¨õÞd[°4ÏËòÇ-Jµ¨{È‘!ètE1‘RDPż´î¡bnó‚%ŸT+)wð0Ò£Tç‚KÏXx¸¿_OIŸN@a&`ËêY‡ :åô³¡&Ä«»Û†ý5é˜âB€û}Ye¡ødÉ °]B楖x¬†Í@”üizT(þ¶Úxe訳vTn3o-òÁa^¨ª1ü8Háã=ô6³¶µ{Ó‘¡š»hW”P·Šj‰v¢æwЮ„Z[Š´»ƒhM 5ƒ© º¡s?‡+ì ïp,'èñ+)jä‘jåQúk ©ï¯‘ÙYºÝÕ¡Eâ¦Á§âÛð´â·I-§Ñ;ÀÍÍ$b®»Ö¬Ý‰ÜQµ㩺›{JýÐà4;,ÿ‰f`¨º ‡W$‚7€Úù«1[Ë/¥nÆÏX «Eš Q S£»»·ž;šWïP{“øÄDN)ój=u”ö¬ÊùßC;»òÕ]Û Ñ_;Œ`ÝÄF -q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb¼¹]mþpùv¹ÿÐÆ}endstream +q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb‚Ý®6¸|»ÜÿÏ“vendstream endobj -1139 0 obj << +1155 0 obj << /Type /Page -/Contents 1140 0 R -/Resources 1138 0 R +/Contents 1156 0 R +/Resources 1154 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1115 0 R +/Parent 1161 0 R >> endobj -1141 0 obj << -/D [1139 0 R /XYZ 85.0394 794.5015 null] +1157 0 obj << +/D [1155 0 R /XYZ 85.0394 794.5015 null] >> endobj 230 0 obj << -/D [1139 0 R /XYZ 85.0394 769.5949 null] +/D [1155 0 R /XYZ 85.0394 769.5949 null] >> endobj -1142 0 obj << -/D [1139 0 R /XYZ 85.0394 576.7004 null] +1158 0 obj << +/D [1155 0 R /XYZ 85.0394 576.7004 null] >> endobj 234 0 obj << -/D [1139 0 R /XYZ 85.0394 576.7004 null] +/D [1155 0 R /XYZ 85.0394 576.7004 null] >> endobj -1143 0 obj << -/D [1139 0 R /XYZ 85.0394 544.8207 null] +1159 0 obj << +/D [1155 0 R /XYZ 85.0394 544.8207 null] >> endobj 238 0 obj << -/D [1139 0 R /XYZ 85.0394 403.9445 null] +/D [1155 0 R /XYZ 85.0394 403.9445 null] >> endobj -1144 0 obj << -/D [1139 0 R /XYZ 85.0394 368.2811 null] +1160 0 obj << +/D [1155 0 R /XYZ 85.0394 368.2811 null] >> endobj -1138 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1154 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1147 0 obj << +1164 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1146 0 obj << +1163 0 obj << /Type /Page -/Contents 1147 0 R -/Resources 1145 0 R +/Contents 1164 0 R +/Resources 1162 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1115 0 R +/Parent 1161 0 R >> endobj -1148 0 obj << -/D [1146 0 R /XYZ 56.6929 794.5015 null] +1165 0 obj << +/D [1163 0 R /XYZ 56.6929 794.5015 null] >> endobj -1145 0 obj << +1162 0 obj << /ProcSet [ /PDF ] >> endobj -1151 0 obj << +1168 0 obj << /Length 3113 /Filter /FlateDecode >> @@ -3924,49 +3997,49 @@ h4: 'öuð8Z¿›· CHU™îá|éAæshQ‰P¼××ãÞÍcoY~®°ç¦åú¡~ÚÕý }À£/­ê-uÊüo<»ÓŽþ­w]D÷På¢à¢î;N-xœZ¼L¤v³¡»ÙÖ%¾4©h<,z¾¥™äut¼× Ÿ6ô’fŽ&û@d !{A¹I1ùO!&Ó¦¤Ø.ªU½®{z¥ƒòæ|ú¡§ou„Œ7Ù<­^h„d;o×àçÄ^x‘!²`H¤òf®“8ÄQL;„KÅ0 ›ÕÐh³[WÛzNÃõØ­ñÂ2Ð@¥}x ‚€tŽ4ËîExoåâ[%hCŠ-ñõ¶ÿ—O,ÓP¶(E×Ç/ƒÒ›"Ÿ*zMä¦kŸ³yûè ”BaÖøH j+>~ …ëŽÚ¦¥¶ëËfAŸ4²!rNC€ &fFar¼°^äˆ C&d)ät¾ÛEñ÷°ëØ ôA¹},õãÅ:‚]Õͧ ëd·bؽøâixGäA4» ¯T ¤†£GévkªµTfÖ·³ 9=?>TýsU5Y–ÙaI’Lè µaó@yÞ‡òˇ ŽÏ–ÞDÆö³U;/WÅ(-8õyrxk\òy•ãàï²ge ò€`T/U2uUØ$V*û¾œ/C"Žíà~‡2žØZ¨U:¬i*ž žÎ×ãã£2RòñwHÂþE ²>Ÿ2˜ÄáÎG9ü)¿²ÁrÔ™½ã7àã~€ª;'è¼UðB4²nÃÑ2–'ÁN;ú3Þ*ü?ÚªŠª•YZêð€rõ\¾ÄE^í…ºbYS¦iM5> endobj -1157 0 obj << +1174 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.2946 363.7923 412.5133 376.6291] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1152 0 obj << -/D [1150 0 R /XYZ 85.0394 794.5015 null] +1169 0 obj << +/D [1167 0 R /XYZ 85.0394 794.5015 null] >> endobj 242 0 obj << -/D [1150 0 R /XYZ 85.0394 769.5949 null] +/D [1167 0 R /XYZ 85.0394 769.5949 null] >> endobj -1153 0 obj << -/D [1150 0 R /XYZ 85.0394 576.7004 null] +1170 0 obj << +/D [1167 0 R /XYZ 85.0394 576.7004 null] >> endobj 246 0 obj << -/D [1150 0 R /XYZ 85.0394 479.565 null] +/D [1167 0 R /XYZ 85.0394 479.565 null] >> endobj -1154 0 obj << -/D [1150 0 R /XYZ 85.0394 441.8891 null] +1171 0 obj << +/D [1167 0 R /XYZ 85.0394 441.8891 null] >> endobj -1155 0 obj << -/D [1150 0 R /XYZ 85.0394 424.9629 null] +1172 0 obj << +/D [1167 0 R /XYZ 85.0394 424.9629 null] >> endobj -1156 0 obj << -/D [1150 0 R /XYZ 85.0394 413.0077 null] +1173 0 obj << +/D [1167 0 R /XYZ 85.0394 413.0077 null] >> endobj -1149 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1166 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1162 0 obj << +1178 0 obj << /Length 4061 /Filter /FlateDecode >> @@ -3989,35 +4062,35 @@ Ke “@ÄŠçB”‡bW°ÖÌJ©”ÔCq]šù#!¦öŽ„`Üôo]¬ Û˳ÄKú%¾]˨ޖ9…Õ“]|Ìßlšnê.ÛµtlÔFUÝÕ‹T S÷£sÈÀÈX÷Œ–2w»(æ0 ½WbÇÿfù †¹ŽÊG<Ê5]CNÎ¥tÖŸÇí¬HñðYÿh~Áp § ´…Ì8×ü2ÅôIh°`£ ®ÚX¦€œ”H>æ*„“ûPPt3ÉÀŽØE—U.a–ðš+,š'D9³nlà𘺾ñBB0™Ôì Ò¡{Gè}r‰/+Ì6YçÜOyÑ@D(“S*ŒTzé“ñPµÿÿVJp …ô¡”]2@ÒŸfyÈÞ€ÜKf€û éÙ8òÕ žèͶKê-‰?˜^À¡E×°NžÄô;,)ÒJ”¯0¬•;ªå ëÉ3½&„–˺/ÐñÐè›»ç“_A½Îì±ê%”ÔTÚêÏk]ß­ëËAt•Û…e›(Cµ|LÌœÜnè?cX/J•–±È[Mì©ÂëJka5ó\Sî€[²Ä%ØùØê ŸÆkú2|¼uÀ(ƒovY m‰S»f?PÛûŠŒºüQ[·¨>Õ¡Ëãiß×onBË—Z1ycr®ÒíÇ™'¿ö„g 5;_{þgOå,- k€±3Á1kΆ_‰î}-ÊÅüuò<ÎÛ.β¶>¸eR°øý$~pË@œ)¥Ó···ëXîN§ßÆbsh~Ó`.g¿¸ŸâˉTmIeb?U…—þì‹Û•˜™ùC¸ìßþ¹^ÔKˆvÂýß{ŸV9’üOQø}@ Ÿb -jLŒ˜æxqºñ¿IýÅã=þ\%öúoõ꾈CþuèÃcUJ‡w7žæU¿ú£äí'ÛÒagÐ;ð-JZœòEð½™3[BóÂÔÿ Æ+h:endstream +jLŒ˜æxqºñ¿IýÅã=þ\%öúoõ꾈CþuèÃcUJ‡w7žæU¿ú£äí'ÛÒagÐ;ð-JZœòEȽ™3[BóÂÔÿ ƃh> endobj -1163 0 obj << -/D [1161 0 R /XYZ 56.6929 794.5015 null] +1179 0 obj << +/D [1177 0 R /XYZ 56.6929 794.5015 null] >> endobj 250 0 obj << -/D [1161 0 R /XYZ 56.6929 165.9801 null] +/D [1177 0 R /XYZ 56.6929 165.9801 null] >> endobj -1159 0 obj << -/D [1161 0 R /XYZ 56.6929 136.242 null] +1175 0 obj << +/D [1177 0 R /XYZ 56.6929 136.242 null] >> endobj 254 0 obj << -/D [1161 0 R /XYZ 56.6929 136.242 null] +/D [1177 0 R /XYZ 56.6929 136.242 null] >> endobj -1164 0 obj << -/D [1161 0 R /XYZ 56.6929 106.2766 null] +1180 0 obj << +/D [1177 0 R /XYZ 56.6929 106.2766 null] >> endobj -1160 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R >> +1176 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F21 714 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1167 0 obj << +1183 0 obj << /Length 3096 /Filter /FlateDecode >> @@ -4030,41 +4103,41 @@ e$E ËY_¯ÉÌ›H×v™ÝçUäº`×vgá…­uw/Æ23z4›ëÆ2¯s7ìW&€º+-/½TK F­( µbAm¨$FýþºÍcÏ‚P—àU¶ð_™xV(àM÷èê`¸Xw?Ëä¾ÍU›+w:ç|]yÖ/Ùj]X7KÊ%ÖN&Ó±iÒaX)”ЧÊ|ƒU™™~EUHýÍX~ë$ LAK—ªKo[P+©@"f…¥òßÁØ«Ÿ¥ÜJÍŠÛªC¬è•3¨T]rB—ÿ`TQUw›5éàž^.±JµŸÐäÀ,ÈÔ¥…n:ýÐŒW!2ˆà\ê.^¿"î­)gJ%[Á#0'IªM/X¿¸ì,cvzÎÂåñ5hD]=®¼„v© ¥ÕüÎÁð;6&O‚p>ñŸíŒH’8Ýñse‘ù›j[ÀÐl_Ó ÞÌøš¶cî]~ˆÎp|W¿éHH¶ó¡ý'è³jµ-ŠÞã ×—ç¿:óMãÿ€“ò-U'^GK¾¦z÷͘¹›þ”Á; ›1¸ÜC¯.‰}~©­mÖtãá>}?î -0{× ª»ŸŽb¯>´æøµ*P·›Ú_ýF‰s‘ïAt$§WÇ)?®ÃMPÐH§5<Ùqnë ÖT7DtùÌ}—CuB_}Û¥»¥€nºÛƒnwãÏÅÖ21guÈ¥€pvÂÏ—/O(/UõX5K[§k[wW©¸œÑú^·ÿQPB²ƒô}Âȧ}âÔiÀßXgRÄF“·}í:¼õ{Wî¸Â¿PøgFÚluîäz=wIÏ3œ€Cƒ»s²2=ú)CR¡B±Ôé)ÉýËz½|9vÅø·ÿt쬸ýáòâ_Ôr[íå•üß·óO|qÒ¡À?ÛŒ|ù º½úËÿéÙ~º‚’B'‰ÿ„¤!±'*½Rh-­w5ïþü³¯úÿÊì~Óendstream +0{× ª»ŸŽb¯>´æøµ*P·›Ú_ýF‰s‘ïAt$§WÇ)?®ÃMPÐH§5<Ùqnë ÖT7DtùÌ}—CuB_}Û¥»¥€nºÛƒnwãÏÅÖ21guÈ¥€pvÂÏ—/O(/UõX5K[§k[wW©¸œÑú^·ÿQPB²ƒô}Âȧ}âÔiÀßXgRÄF“·}í:¼õ{Wî¸Â¿PøgFÚluîäz=wIÏ3œ€Cƒ»s²2=ú)CR¡B±Ôé)ÉýËz½|9vÅø·ÿt쬸ýáòâ_Ôr[íå•üß·óO|qÒ¡À?ÛŒ|ù º½úËÿéÙ~º‚’B'‰ÿ„¤!±'*½Rh-îjÞýùg_õÿËD~Õendstream endobj -1166 0 obj << +1182 0 obj << /Type /Page -/Contents 1167 0 R -/Resources 1165 0 R +/Contents 1183 0 R +/Resources 1181 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1158 0 R +/Parent 1161 0 R >> endobj -1168 0 obj << -/D [1166 0 R /XYZ 85.0394 794.5015 null] +1184 0 obj << +/D [1182 0 R /XYZ 85.0394 794.5015 null] >> endobj 258 0 obj << -/D [1166 0 R /XYZ 85.0394 731.767 null] +/D [1182 0 R /XYZ 85.0394 731.767 null] >> endobj -1169 0 obj << -/D [1166 0 R /XYZ 85.0394 703.7216 null] +1185 0 obj << +/D [1182 0 R /XYZ 85.0394 703.7216 null] >> endobj 262 0 obj << -/D [1166 0 R /XYZ 85.0394 229.6467 null] +/D [1182 0 R /XYZ 85.0394 229.6467 null] >> endobj -1170 0 obj << -/D [1166 0 R /XYZ 85.0394 201.8883 null] +1186 0 obj << +/D [1182 0 R /XYZ 85.0394 201.8883 null] >> endobj 266 0 obj << -/D [1166 0 R /XYZ 85.0394 144.1965 null] +/D [1182 0 R /XYZ 85.0394 144.1965 null] >> endobj -1171 0 obj << -/D [1166 0 R /XYZ 85.0394 118.9605 null] +1187 0 obj << +/D [1182 0 R /XYZ 85.0394 118.9605 null] >> endobj -1165 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R /F14 737 0 R /F39 895 0 R >> +1181 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F21 714 0 R /F23 738 0 R /F14 741 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1175 0 obj << +1191 0 obj << /Length 2474 /Filter /FlateDecode >> @@ -4081,16 +4154,17 @@ xÚ½ko Øð²¢zAËÒ@«–x£D3ži (åuc&ad#ÊÝ8 2DZo3QŠp-øÁ8‘ȶ^1°é¢M#ð»4Î8Êb³í–×?´á©K«¸²Î]‚¾L¡†‘Ù­žþnøSó ú#ÍRÕØ2ù¨ìStÓÄý ãyÒUà SÉSûã°ˆx6õË5Ÿ=Üžú;ùP"*pOi…í–€eIÊT -H¤fˆ 9"ÕÎ’ÿAÝA¤ÿC9 endstream +H¤fˆ 9"ã;%ÿƒºƒ +HÿC‘ Ÿendstream endobj -1174 0 obj << +1190 0 obj << /Type /Page -/Contents 1175 0 R -/Resources 1173 0 R +/Contents 1191 0 R +/Resources 1189 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1158 0 R +/Parent 1161 0 R >> endobj -1172 0 obj << +1188 0 obj << /Type /XObject /Subtype /Form /FormType 1 @@ -4110,33 +4184,33 @@ x 6\>RgÈbÏWÖ¹j[†› WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream endobj -1176 0 obj << -/D [1174 0 R /XYZ 56.6929 794.5015 null] +1192 0 obj << +/D [1190 0 R /XYZ 56.6929 794.5015 null] >> endobj 270 0 obj << -/D [1174 0 R /XYZ 56.6929 769.5949 null] +/D [1190 0 R /XYZ 56.6929 769.5949 null] >> endobj -1177 0 obj << -/D [1174 0 R /XYZ 56.6929 749.9737 null] +1193 0 obj << +/D [1190 0 R /XYZ 56.6929 749.9737 null] >> endobj 274 0 obj << -/D [1174 0 R /XYZ 56.6929 282.0726 null] +/D [1190 0 R /XYZ 56.6929 282.0726 null] >> endobj -1178 0 obj << -/D [1174 0 R /XYZ 56.6929 250.2286 null] +1194 0 obj << +/D [1190 0 R /XYZ 56.6929 250.2286 null] >> endobj -1179 0 obj << -/D [1174 0 R /XYZ 56.6929 191.4593 null] +1195 0 obj << +/D [1190 0 R /XYZ 56.6929 191.4593 null] >> endobj -1180 0 obj << -/D [1174 0 R /XYZ 56.6929 179.5041 null] +1196 0 obj << +/D [1190 0 R /XYZ 56.6929 179.5041 null] >> endobj -1173 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R >> -/XObject << /Im3 1172 0 R >> +1189 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F62 1065 0 R >> +/XObject << /Im3 1188 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1183 0 obj << +1199 0 obj << /Length 2134 /Filter /FlateDecode >> @@ -4148,47 +4222,47 @@ x TiJ¶ŒÁo Ž¡1ÿðb‚¥óeãuÜxIÈÙc¯ŠvÖÇãLÊ,_'ú !hãnr¬’Ð:Ú¨ð‚õdFàÇ$¢™¯fÄìóï±t¶Ãªö÷ÇB°ñÀ-°ÅŠH¬vZ;ñ: ±„·(˜â:eY¯òq/ÞxܤI³0sº.:©GÕͲ(Û¨¨¾{øÀ 3cŒ„, ùH‰ç½FPÕkc^úõ­ vðƒ’/¦HÕÔN!¥àUPÌhésiuß4V}OÂ#ôxí³Òß—YÝôVÕÈ ýwy-…PLkÿ*˜ÅXÂ+µ3H)7ßU?ïz´ª~fc…Ù«á5f«;®öa¦°–žïŒ²OÿÜŒ‚ìŠ7ÚÈáù/w1‰è %‘ö¢MÆ ÝË“(ZAPåíª^|¡NQµùb’Áð êû¤Ô†¼ÓÜCÑ6ÂsH^[ðÏÝH%I Vìôœ4šÅ©Ýí ^a6®«ò¶y¾ë„]b†r1O"dA4D#äT7² _ò)Ž­ý…âI_Í |Jq‚s ÊÈ5}ßqg:W(â.BnüÎè»âUí˜Ì % M×$¬ê–·Dî \Š±_‘ÑÏÊ‘hh´0è×sØf^T½—)¤d앺‡þO’”yJ¦í¬¡¾ b”£¨éƒZ[AïH—žW4Ö,û‘d%FY“Óû%È0 \r]•ìvu´ž»uC6µÃ¼›ðÖ'ØMoû6_Ë›oHö‡#AÄؾô±^‰Å©LU×Ö%æô½†fî¾µÝëðº+¶¹µ/)sO,Á<‘ þˆÁ NŸYæJöµ•Ò;ÅOø–H¡ŠN즦S¾rŸýé“ÿ ;v&žŒl´lê¹@·.ÑGšW¬¥2v/»ýìÂËuþK*„b‰‰12«Ä©ø§"¥$ý´Úïr[/ÚµîM瓯A‘ƒ#!9ï«6ià/bÍ!†¶Žä¾'5ø¿{P”ú] -c˜á©Þ¾‹PaŒm-ã½(.«âOÒ ê jA£VµœßäÎzU…fW<]ÔËÛÇâhŸiâ˃´¯tïûï«JXLáýððÁ^ZùÜÿÌnþm .Viºã«ÑúÚy£Ðr•<ÊR*eI*MéÿUÜU?endstream +c˜á©Þ¾‹PaŒm-ã½(.«âOÒ ê jA£VµœßäÎzU…fW<]ÔËÛÇâhŸiâ˃´¯tïûï«JXLáýððÁ^ZùÜÿÌnþm .Viºã«ÑúÚy£Ðree)•²$•¦ÇôÿV4UAendstream endobj -1182 0 obj << +1198 0 obj << /Type /Page -/Contents 1183 0 R -/Resources 1181 0 R +/Contents 1199 0 R +/Resources 1197 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1158 0 R +/Parent 1206 0 R >> endobj -1184 0 obj << -/D [1182 0 R /XYZ 85.0394 794.5015 null] +1200 0 obj << +/D [1198 0 R /XYZ 85.0394 794.5015 null] >> endobj 278 0 obj << -/D [1182 0 R /XYZ 85.0394 585.0446 null] +/D [1198 0 R /XYZ 85.0394 585.0446 null] >> endobj -1185 0 obj << -/D [1182 0 R /XYZ 85.0394 560.705 null] +1201 0 obj << +/D [1198 0 R /XYZ 85.0394 560.705 null] >> endobj 282 0 obj << -/D [1182 0 R /XYZ 85.0394 491.9365 null] +/D [1198 0 R /XYZ 85.0394 491.9365 null] >> endobj -1186 0 obj << -/D [1182 0 R /XYZ 85.0394 461.8226 null] +1202 0 obj << +/D [1198 0 R /XYZ 85.0394 461.8226 null] >> endobj -1187 0 obj << -/D [1182 0 R /XYZ 85.0394 384.4846 null] +1203 0 obj << +/D [1198 0 R /XYZ 85.0394 384.4846 null] >> endobj -1188 0 obj << -/D [1182 0 R /XYZ 85.0394 372.5294 null] +1204 0 obj << +/D [1198 0 R /XYZ 85.0394 372.5294 null] >> endobj 286 0 obj << -/D [1182 0 R /XYZ 85.0394 206.4979 null] +/D [1198 0 R /XYZ 85.0394 206.4979 null] >> endobj -1189 0 obj << -/D [1182 0 R /XYZ 85.0394 171.8379 null] +1205 0 obj << +/D [1198 0 R /XYZ 85.0394 171.8379 null] >> endobj -1181 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1197 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1192 0 obj << +1209 0 obj << /Length 4496 /Filter /FlateDecode >> @@ -4214,56 +4288,56 @@ mt ¤ kOþÕ%A\uÓìj´>?ä8b‘8)ŸÁÉÿ×ã <ásä £ %Æ$*“瓱^}ð.CFó/ó¸]NªèÐY '£ïº&’»G«±ÎÅâ(œ3¢üFÎÓurpóëXh·üÄÔ^¤–ÏaÇàÑ3v¬YÞTkt ÐÖÏ® ˜é$5±HN‘³É^6 »§tŸÀÄëjä`¦ä£L=tç’JÖɹ[¾?4C¸Â[ô«CÉ[·P«Ïüac~595_È3fù¡ ¶ÖVxá -]`‚ëYÚ‘aˆéÍ)ö¤Ã‚íw‡æ«w9øø‡n0²Nð-·3õÄCh– ý{ØÌ_üW£\! +’RæJ,…oþ§ÁIÊ`FP\¨©[( DS¸rYžqÿ»ðœõÿK]mendstream +]`‚ëYÚ‘aˆéÍ)ö¤Ã‚íw‡æ«w9øø‡n0²Nð-·3õÄCh– ý{ØÌ_üW£\! +’RæJ,…oþ§ÁIÊ`FP\¨©[( DS¸riÏ8ÿ]xÎúÿ£]oendstream endobj -1191 0 obj << +1208 0 obj << /Type /Page -/Contents 1192 0 R -/Resources 1190 0 R +/Contents 1209 0 R +/Resources 1207 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1158 0 R -/Annots [ 1194 0 R 1195 0 R ] +/Parent 1206 0 R +/Annots [ 1211 0 R 1212 0 R ] >> endobj -1194 0 obj << +1211 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 480.2482 256.3816 492.3078] /Subtype /Link /A << /S /GoTo /D (rndc) >> >> endobj -1195 0 obj << +1212 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [268.5158 480.2482 332.4306 492.3078] /Subtype /Link /A << /S /GoTo /D (admin_tools) >> >> endobj -1193 0 obj << -/D [1191 0 R /XYZ 56.6929 794.5015 null] +1210 0 obj << +/D [1208 0 R /XYZ 56.6929 794.5015 null] >> endobj 290 0 obj << -/D [1191 0 R /XYZ 56.6929 769.5949 null] +/D [1208 0 R /XYZ 56.6929 769.5949 null] >> endobj -1041 0 obj << -/D [1191 0 R /XYZ 56.6929 749.0409 null] +1046 0 obj << +/D [1208 0 R /XYZ 56.6929 749.0409 null] >> endobj 294 0 obj << -/D [1191 0 R /XYZ 56.6929 209.5509 null] +/D [1208 0 R /XYZ 56.6929 209.5509 null] >> endobj -1196 0 obj << -/D [1191 0 R /XYZ 56.6929 183.9497 null] +1213 0 obj << +/D [1208 0 R /XYZ 56.6929 183.9497 null] >> endobj 298 0 obj << -/D [1191 0 R /XYZ 56.6929 147.0778 null] +/D [1208 0 R /XYZ 56.6929 147.0778 null] >> endobj -1197 0 obj << -/D [1191 0 R /XYZ 56.6929 116.7981 null] +1214 0 obj << +/D [1208 0 R /XYZ 56.6929 116.7981 null] >> endobj -1190 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F14 737 0 R >> +1207 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F48 955 0 R /F14 741 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1201 0 obj << +1218 0 obj << /Length 2349 /Filter /FlateDecode >> @@ -4277,69 +4351,69 @@ xÚµ]s J[¨åÅ%RÉ )Σ b±ÁÑ·òÅe|–˜üVb"™ä ì=îÒRç''ä€*’'ô$ãgéùHèŠ5F²}Ê/¨É0¬ô-ÆDsNƒÅUJ!n@XÁ<¾Ò„fe K¸jœ!ž8m·¤a´€i÷¸‹BS¹Ùo©Úom€…›QËcˆ.»’Õ’-mü‚õ-·Sq%ט‚–Ôz•ÀþóZ±@“%™Pv ù1üÔBÄNh[1¢„Ï Ao¼Íg¢V ïXܽPد8 Y‚Å$†„9’ÀCwÄòôÂÁqÀ`^2eIw,>¡6úL¦ÃJ&²³ŒZñZS6h)Ø…Ú]ƒ[wI~ïbÜVÚ3°u©ž°wÐò {´Éñ‘cŒ)ÈVM›®/í'ÄèZ½ÁL×zܾ“ÂNRDz*×}›µ+Ü=Ñycýs!³h 48:Òòþjà?ñ³¯Ö妴—àpBŸ§ÔÑoÊë/\g8)—;µ94 Ê>üå)ËË5<ƒSmB¿«-ôn7Åן^¾õú(ÇuŸ6-ˆ6IX{8**‡!ÄÓõ@Ipj=TÛK¶«:Cð§×°Sû)s¶ 3YÊê©l+ôãÞr\¹>êr€z€ë/ó¾ˆ}º—iCó€³:qÚˆ—­ª¯/ß=R*îՔؘR[zw¸DeÚ¢þzÏC¹ýè’'²~›¯‡|=¸¬³ë„ïäÞPÀ­Ãþ­Îè+Bàÿ±%N…òïŽç`ò}â"emq¡zÍ9¬¹Ì,vÇ…)xL;Î@ÏÙ®ÔÆ&ÍÀä#«ÚNn[Œ‹f€Ýrá oƒ‹wh¦\é¨"“HejäfªÙ'S9‰O}¼‹é›"R%'ÿhlW» k[óþ5u^‚Ü ö -ê}»Ý·¸¶Ñíª.š7Xkã›Ì­tÙö‚½2Ñkfdã‰Cy1U–»˜\Áºk ÚÕÎÌ·ùlŠà ,Ù±+pb®®òt­  e¥„JŸ1w.9QŒ@¡˜x•v’.)1 €^ëÜÙíª~AÀ\~½w9D¾mj7ÀÌÔ(±1–ìÓŒcŒž¡ rî?!‰ù·n¢ÍF;ßûî?ÿ˜B5&’äLû]ÐjµTy¦Œ’„:å¼û÷pÌúâØ\5endstream +ê}»Ý·¸¶Ñíª.š7Xkã›Ì­tÙö‚½2Ñkfdã‰Cy1U–»˜\Áºk ÚÕÎÌ·ùlŠà ,Ù±+pb®®òt­  e¥„JŸ1w.9QŒ@¡˜x•v’.)1 €^ëÜÙíª~AÀ\~½w9D¾mj7ÀÌÔ(±1–ìÓŒcŒž¡ rî?!‰ù·n¢ÍF;ßûî?ÿ˜B5&’äLû]ÐjµTy¦Œ’DzÊy÷ïá˜õÿã0\7endstream endobj -1200 0 obj << +1217 0 obj << /Type /Page -/Contents 1201 0 R -/Resources 1199 0 R +/Contents 1218 0 R +/Resources 1216 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1210 0 R -/Annots [ 1205 0 R 1206 0 R 1207 0 R ] +/Parent 1206 0 R +/Annots [ 1222 0 R 1223 0 R 1224 0 R ] >> endobj -1205 0 obj << +1222 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [406.6264 617.3695 456.8481 629.4292] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1206 0 obj << +1223 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.5805 606.0819 196.7992 617.474] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1207 0 obj << +1224 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.6195 562.6731 159.8382 574.7328] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1202 0 obj << -/D [1200 0 R /XYZ 85.0394 794.5015 null] +1219 0 obj << +/D [1217 0 R /XYZ 85.0394 794.5015 null] >> endobj 302 0 obj << -/D [1200 0 R /XYZ 85.0394 769.5949 null] +/D [1217 0 R /XYZ 85.0394 769.5949 null] >> endobj -1203 0 obj << -/D [1200 0 R /XYZ 85.0394 749.0225 null] +1220 0 obj << +/D [1217 0 R /XYZ 85.0394 749.0225 null] >> endobj 306 0 obj << -/D [1200 0 R /XYZ 85.0394 668.2594 null] +/D [1217 0 R /XYZ 85.0394 668.2594 null] >> endobj -1204 0 obj << -/D [1200 0 R /XYZ 85.0394 636.8261 null] +1221 0 obj << +/D [1217 0 R /XYZ 85.0394 636.8261 null] >> endobj 310 0 obj << -/D [1200 0 R /XYZ 85.0394 425.0299 null] +/D [1217 0 R /XYZ 85.0394 425.0299 null] >> endobj -1208 0 obj << -/D [1200 0 R /XYZ 85.0394 396.4061 null] +1225 0 obj << +/D [1217 0 R /XYZ 85.0394 396.4061 null] >> endobj 314 0 obj << -/D [1200 0 R /XYZ 85.0394 136.3155 null] +/D [1217 0 R /XYZ 85.0394 136.3155 null] >> endobj -1209 0 obj << -/D [1200 0 R /XYZ 85.0394 104.8822 null] +1226 0 obj << +/D [1217 0 R /XYZ 85.0394 104.8822 null] >> endobj -1199 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F41 935 0 R /F23 734 0 R /F53 1027 0 R >> +1216 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F41 940 0 R /F23 738 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1213 0 obj << +1229 0 obj << /Length 3704 /Filter /FlateDecode >> @@ -4360,29 +4434,29 @@ B+ \Þ‡ÔsÌ=’K1­ûÝ9>ÇâR$u»,êP-AM,ñ¿ãÑc<ò3Ñ£>žä3K&zL^Íú–ÕÙ|$1*£J/ i.Âþvé?–Hbìõ%êôÓ%ª„»oOo'|½ºÃn×î¹× f\ýËØ Æ+0ªÀp¹ ˜¶¢Ôì[êñŸÞl@¸Òùº}*¾gþ„Ü|‡= b¯j&o|W$ü]_àsã¾ãRq aÖœ’þÖ2MÅÉn2¾ÜÐ3|ñêP¤ZMŽ-Ûfj¿â7bb‚3‡`¼£²õ ÐÀWû ÓâCI ‚>)ñqSÙk˜å›4ò:¾ñ‡)ÛafPÇŸj(̯Cße˜,Êòtêà?%#™zoÈ÷jöS ×$qdAlÇ·c”6|‚q†Å¿côqJ@Þ‰âõe(UÇXç¯ ×PRq‰È{4näÊŸ,NZ=5èÎQ=4\Rr¿kp¦Î/ìûH¡ü7îš7øÕ”þ«O•žÛý#«g]=³@¤ÂWÅ& -¿ë=~ͯÝ[G€ÿ^ ;j£i/_Ûay"Á’¸/lïžüQ'ÌÑWHÚ)õøsL=ôpèrÛ$Qžfê´á³/ª‡ î.sÒx¢¢«QŸ@àŒèk\¶±´ÁèРߨMS×,Yú“+Û¹Q³ïß#so‰27l\áŒP~ÖeÑñÐV¸ÊUÉ}ªaWÒ§0|¨>”|× }]¬t„Ÿ¾Žý×[ÿ÷—ÇÃgÙI©,“áŠ%êcH˜(äœÊžQî>Q~Nú`UðËendstream +¿ë=~ͯÝ[G€ÿ^ ;j£i/_Ûay"Á’¸/lïžüQ'ÌÑWHÚ)õøsL=ôpèrÛ$Qžfê´á³/ª‡ î.sÒx¢¢«QŸ@àŒèk\¶±´ÁèРߨMS×,Yú“+Û¹Q³ïß#so‰27l\áŒP~ÖeÑñÐV¸ÊUÉ}ªaWÒ§0|¨>”|× }]¬t„Ÿ¾Žý×[ÿ÷—ÇÃgÙI©,“áŠ%êcH˜(ä\?£Ü}¢üœôÿ_"ðÄendstream endobj -1212 0 obj << +1228 0 obj << /Type /Page -/Contents 1213 0 R -/Resources 1211 0 R +/Contents 1229 0 R +/Resources 1227 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1210 0 R +/Parent 1206 0 R >> endobj -1214 0 obj << -/D [1212 0 R /XYZ 56.6929 794.5015 null] +1230 0 obj << +/D [1228 0 R /XYZ 56.6929 794.5015 null] >> endobj 318 0 obj << -/D [1212 0 R /XYZ 56.6929 607.7662 null] +/D [1228 0 R /XYZ 56.6929 607.7662 null] >> endobj -1215 0 obj << -/D [1212 0 R /XYZ 56.6929 584.6557 null] +1231 0 obj << +/D [1228 0 R /XYZ 56.6929 584.6557 null] >> endobj -1211 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F39 895 0 R >> +1227 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1218 0 obj << +1234 0 obj << /Length 2891 /Filter /FlateDecode >> @@ -4401,31 +4475,31 @@ n ÁD˜×žtÔ³IÀy9®<þ!€sŸáe`_þ=;»Ø#WÁn_5E4MIã"ýstˆ¨Ðûž «ý >k̼Â0RΔ1H™4nVB%,Uv®šÎÙ´Ý1BM’2‘ÚF}·Ô:aZò³ˆBàñÛ*&W/c^ïÍ  …¨NÍb¼ÍõÜ3`jNÓÞ{h“·:~ôÓduÔv¦žbÕ^#Ä(H7ï VCÍ„ƒLLJKfÅøž@r8{î˜É n1•ß¼K§Æ‹†§Ìà â +‡„œâôÖ@Óᾧ•£°ãc´ýHð¾¥Î’gê]©2¦d¢g<>Sðò1ûkwXãôžˆü8¿uE-LDBK´í£¯”ßzÜL StÏ]ÔÙ*ä¶^¹jæõ!?ö4ê cŽÜÒ/u©” V³”WSâEi²{íÞÑ»ºªÊäÑÜ‚I(;ÏL=ö|;>ý¸ =5.±…ûNÅ*þ4Y›¸ht¤EQÕv©Ä¼ª_&³s͸ôk¤ˆ&–G-ÂÇl=6Ò.ïÊÇ%„YN Ž0ï¸y•ƒMlʦìòd Qû7¹Ðëf9·z>o{˜H)Q‚|.Øw4L¥Ivú†Ñâ”&2d óC”·Elù paÿPf<{­0ä,ËÆò‘Þc0#Xçûz ÐÙÈÖ†>\Š&Ø£ùh»ø¶=Ð0˜è‘våÓ¦˜´ç/힟£QþÜ]õ87ç?‰‹5©¡21#¤)þ€C“Ýæš÷“_|ÆõËé†Ë_|.ÏE*‹ðôÅÝo^‚3yNÄe¦¸°3’.~zW½BÈåiTyE \ )‘ú…‚ÁëñWo_+¦Ëèþ=ؽBÃÿòK_‚”`ØÂÔθMh9§mt> dgµf8güaÄÿ3[*#E >A]PC¿MÌéò?M¶Å¨‘3jò°Ù×™¾æÁРÎøc, H„úy©OꨨÐÅy}朔Æ|œ -=áŸË˹àÇÕÓ×ùtÄ×vÿt>íè­:0tŸyØú©¬éñ˜nõz'_&: ÊW±2sTÛú‚á—®®ÖgÔ‡zfJ€{,+W/Co]³“Þ,×oíè­:0tŸyØú©¬éñ˜nõz'_&: ÊW±2sTÛú‚á—®®ÖgÔ‡zfJ€{,+W/Co]³“Þ,×o> endobj -1220 0 obj << +1236 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [173.6261 333.9221 242.2981 343.3317] /Subtype /Link /A << /S /GoTo /D (the_category_phrase) >> >> endobj -1219 0 obj << -/D [1217 0 R /XYZ 85.0394 794.5015 null] +1235 0 obj << +/D [1233 0 R /XYZ 85.0394 794.5015 null] >> endobj -1216 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> +1232 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1224 0 obj << +1240 0 obj << /Length 2569 /Filter /FlateDecode >> @@ -4442,35 +4516,35 @@ X ¼äñò‹¼èèyïÛåÁZru(OhÙ¡Ûqüþä.µäaÈ| ËPØCF3ûLÉP=S#Ä‹dà|Í”§õI3ðÕ]¢ê·¦iC[Â>M ´tƆ¬®&+£²Æ½!Îú:7ѹl‚žžÚme³M[YãD ¶óSÝ„ÖÅTù>4œ@F,àÐEüujCêQ¹Hìÿ’nÇÓ–åpøŒ%À­â˜Ó32½Dä/³›ø’n—ðV¹|þÁ´ܼTºkÛwÚÀe*HC OêÚh Ý!Є•ñå”iôí˨³¶qg˜€´[k÷¶M³–sB¹©}&Ž•|SårŤ˜§•ë̳½æ*i’»é>r¬Ü]Öö¥t±\² :0M‘)](ƒŽ¸Ý„¥8-€6uUÐc.®Ü¦ÝÆp|Ô¿µ?êf”4þ, }di’v ?°tBÍù}+5»½œ¤Ûñ´š½I<£eîÑg*Vmiùœš/ööÝÿ>ɤ¸ÒEæ€&ßw9õ÷V×M}B¬=¿_'‚c©òo)UD(Ô3)2V jMúBãRɳB}{œsŽ¿R쓪îÚ¥NàV)x,>-ÞãßJ¼ÿ‡Øy,âO#ñª‰Ð£´SéºÌï»'û§ÅûîãO‹¥„‚”¬vµ(æ×øÝ7š×mºÅezF4W`_[þ½¦µ¼,¿´ûšÖ÷”&Ó –·®öt*ÅF7_=$Í3jÇŠI—:µ? r¦[~Jçi~‚( ¨ù°ìJN~†öfÏF±—~ôîÿ# ˆ˜¯Ô WZµHAà -i¡ÈïÑ'y÷uÜb Xÿ/LN+8endstream +i¡Èñ蓼û:n±¬ÿL¦+:endstream endobj -1223 0 obj << +1239 0 obj << /Type /Page -/Contents 1224 0 R -/Resources 1222 0 R +/Contents 1240 0 R +/Resources 1238 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1210 0 R +/Parent 1206 0 R >> endobj -1225 0 obj << -/D [1223 0 R /XYZ 56.6929 794.5015 null] +1241 0 obj << +/D [1239 0 R /XYZ 56.6929 794.5015 null] >> endobj 322 0 obj << -/D [1223 0 R /XYZ 56.6929 556.3324 null] +/D [1239 0 R /XYZ 56.6929 556.3324 null] >> endobj -1221 0 obj << -/D [1223 0 R /XYZ 56.6929 531.5504 null] +1237 0 obj << +/D [1239 0 R /XYZ 56.6929 531.5504 null] >> endobj -1226 0 obj << -/D [1223 0 R /XYZ 56.6929 214.5791 null] +1242 0 obj << +/D [1239 0 R /XYZ 56.6929 214.5791 null] >> endobj -1227 0 obj << -/D [1223 0 R /XYZ 56.6929 202.6239 null] +1243 0 obj << +/D [1239 0 R /XYZ 56.6929 202.6239 null] >> endobj -1222 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R >> +1238 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1230 0 obj << +1246 0 obj << /Length 2985 /Filter /FlateDecode >> @@ -4483,23 +4557,23 @@ e6M2 Þ¹WT´wö_KE!žŸåýiÄAåBÄàÜFUTdâjŠ—ÁgL Âéã†ÍGŸL÷ôé , úu¤@íèŸëÝ`_»¸Še•—Ô×Å=ž(ÖvÐîxŸE]¹°€ýœ]……474` ¾ê¾óóC•cåë6ƒQ©w¬ªïÐ3e™í”öÎR¢ÎóS$(GA¸ÛÒ/s¯xã(Œá#¯žó—iœ¹[¯j⦣ó«ëéЖßÏ®Ýï„D5 "ÇE :‹•~SP9Cщ¾i€jtïn0…ÍPgÿÙ´Þɱ4œ{ #Æ;ˆ´hꨒ¶ 2Lç\‚¢½q©3²«RR:Ç |ÊÃy^#™GÝQ“×f)A‹A”H"ä Û6’î[KÑ){&{©TÁLõ„˜¡Ûðµ5Ø_Tu¨%U‡ê êóá‹Šò1½”£Î¨› ¦mñ ayÃú‹ne²XTçÝz³|Cc³y4ÚŸß-z»Bg&À‹3£`f*|')ŠH×>Ù]ß"Éb=D`›VP¢l'©}§h§Ë¦-»òi'¹í[¯éJª .fWÕP>5U.ÐÏÆwybÌN25 ¹NxFo»`»f‰T‡KÌ;zluî…ʼnd{ï»íÚ=ݺ¬U0Êøò\h~5Ù}(Q—€ ]r Cx´î+2ÙOLàuyhQÙî2=h-ábtHúÄt"ãÉpW ïÊÔH»3ª%û¤eyÿ2hQmÔöÖ9ÚqB*§·­P²®ÄmAÛvÊâ®0–C¯r18;Lêœ -™òm4uOyU@Â7=¬»ná9…2£Ä„ÜP÷à m£Ùý ‘~ìõp4¾õq¯ã}Ìòe8h ­¶?žû5žc˜Ùû5Þÿ7*,„ë _¦‰†nøŒ~Å÷ɯù„à±ÉÂQu¿=Ȇ~óÇ&£ †ÿõ†ÛŸ_*Ë4íÁ;ƒé8™q8V¹çw§ Šïc"Ó8IŶ[oñÿÕ¾$§endstream +™òm4uOyU@Â7=¬»ná9…2£Ä„ÜP÷à m£Ùý ‘~ìõp4¾õq¯ã}Ìòe8h ­¶?žû5žc˜Ùû5Þÿ7*,„ë _¦‰†nøŒ~Å÷ɯù„à±ÉÂQu¿=Ȇ~óÇ&£ †ÿõ†ÛŸ_*Ë4íÁ;ƒé8™q8V¹çw§ Jîc"Ó8IŶ[oñÿÖ$©endstream endobj -1229 0 obj << +1245 0 obj << /Type /Page -/Contents 1230 0 R -/Resources 1228 0 R +/Contents 1246 0 R +/Resources 1244 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1210 0 R +/Parent 1248 0 R >> endobj -1231 0 obj << -/D [1229 0 R /XYZ 85.0394 794.5015 null] +1247 0 obj << +/D [1245 0 R /XYZ 85.0394 794.5015 null] >> endobj -1228 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1244 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1234 0 obj << +1251 0 obj << /Length 3540 /Filter /FlateDecode >> @@ -4521,41 +4595,41 @@ KvF:3+ )_ U!˜I¡ª½ ¥«„ÅBF0~¹dUû+ÞBoÝ8íªmèŠð+÷[pÇ E¾Ìw‚Ÿ=Wx8ο ó‘[7äF_,ÜI\÷"'[­tSm½à€E"dI†þ]ô {ùj@îþ.P‚@°/(fAÄ„ §Â½Ýy®U"L)&}¨4<¦¶F`¯ÂúWKî¢. ûWK‘÷jɾ©„@ü§EÙr©wT£È›V—³ªt èíãêwãÔÒ+ÆUU·]>~¼§¯ïlù´aŒQÂfÿë;÷9bÓ¶ƒO¹Þô©ßqhÕè¬vÏCíìÈçø¢­Ý‰ì+>r̃å-UkuAÞ¾ßfìí¸=øG/#íÂ'½ëcÿ¶Æ{ShN‚q¡s+ì p^*عû#œÝ¡ÿgH[Pendstream +é%¯'ÁùȼÜáÀè]öçjXý5ü×4¬: «q Cö/%½=£Ê6aïפy9ÜØ”yD©ºbRâ ‡(õæoZwúUýð¥rϲÕBj Blì Ç®7ѽÚ8„{·þÀbîâjw:¶Èï°ŽyºÝc¹]Ä{aœßµ˜G^¾c̺÷ÐVÌû3©X’¨þO„°ïî‹Mí¶Ì·mÖêeåýPgx+~Ì«û]÷ÛŽòÞÊ#†¯ô!bUaËиFBÖ˜õb›áˆýEÚÝùbp¸b']ý›WåÝø)€ÜZQ豇³ L$rø4Ë®(>@ü§EÙr©wT£È›V—³ªt èíãêwãÔÒ+ÆUU·]>~¼§¯ïlù´aŒQÂfÿë;÷9bÓ¶ƒO¹Þô©ßqhÕè¬vÏCíìÈçø¢­Ý‰ì+>r̃å-UkuAÞ¾ßfìí¸=øG/#íÂ'½ëcÿ¶Æ{ShN‚q¡s+ì p^JíŒÜýÎîÐÿ g [Rendstream endobj -1233 0 obj << +1250 0 obj << /Type /Page -/Contents 1234 0 R -/Resources 1232 0 R +/Contents 1251 0 R +/Resources 1249 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1210 0 R +/Parent 1248 0 R >> endobj -1235 0 obj << -/D [1233 0 R /XYZ 56.6929 794.5015 null] +1252 0 obj << +/D [1250 0 R /XYZ 56.6929 794.5015 null] >> endobj 326 0 obj << -/D [1233 0 R /XYZ 56.6929 769.5949 null] +/D [1250 0 R /XYZ 56.6929 769.5949 null] >> endobj -1236 0 obj << -/D [1233 0 R /XYZ 56.6929 749.9737 null] +1253 0 obj << +/D [1250 0 R /XYZ 56.6929 749.9737 null] >> endobj -1237 0 obj << -/D [1233 0 R /XYZ 56.6929 433.0023 null] +1254 0 obj << +/D [1250 0 R /XYZ 56.6929 433.0023 null] >> endobj -1238 0 obj << -/D [1233 0 R /XYZ 56.6929 421.0471 null] +1255 0 obj << +/D [1250 0 R /XYZ 56.6929 421.0471 null] >> endobj 330 0 obj << -/D [1233 0 R /XYZ 56.6929 173.1316 null] +/D [1250 0 R /XYZ 56.6929 173.1316 null] >> endobj -1239 0 obj << -/D [1233 0 R /XYZ 56.6929 148.792 null] +1256 0 obj << +/D [1250 0 R /XYZ 56.6929 148.792 null] >> endobj -1232 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1249 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1242 0 obj << +1259 0 obj << /Length 1976 /Filter /FlateDecode >> @@ -4571,62 +4645,62 @@ ab ¤v€À7>sz Ny°Ãò¦ˆ_x«¸(°n:;Þ²3õùâŠÜz?!S§…Øä…ÆÜÉ4ÀMBX@#´…¹&Âùµi›^“¼¯èåÞ‰Áé‡î4 ¶UÊ6…×ê„z»W!UçMcãľ쉗ӣi»:wÚ)`@ºg¿t(Öv’ ß‚”‰]!3aw¬;¬ª«jŠUxöR†n—…Ï¥~ÈaL“ e)¿ »ÂöNFçûm49Žÿ}CÔj_³½væó†dtGƒ´­ÎDïn{4¥vQæô ©öÚLÆ (ülëÆ›nk1ÒXó°°/›nJ?ãlÞÆéXåƒytr¶«‰4nbo|Ûö -%ܧ½)ÛaöP‘°,ÍøLÖ#¾ˆ¢iÁOŽGo> endobj -1245 0 obj << +1262 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 682.6714 539.579 694.731] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1246 0 obj << +1263 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 670.7162 117.8035 682.7759] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1243 0 obj << -/D [1241 0 R /XYZ 85.0394 794.5015 null] +1260 0 obj << +/D [1258 0 R /XYZ 85.0394 794.5015 null] >> endobj 334 0 obj << -/D [1241 0 R /XYZ 85.0394 731.9325 null] +/D [1258 0 R /XYZ 85.0394 731.9325 null] >> endobj -1244 0 obj << -/D [1241 0 R /XYZ 85.0394 701.4683 null] +1261 0 obj << +/D [1258 0 R /XYZ 85.0394 701.4683 null] >> endobj 338 0 obj << -/D [1241 0 R /XYZ 85.0394 475.6865 null] +/D [1258 0 R /XYZ 85.0394 475.6865 null] >> endobj -1247 0 obj << -/D [1241 0 R /XYZ 85.0394 450.9966 null] +1264 0 obj << +/D [1258 0 R /XYZ 85.0394 450.9966 null] >> endobj 342 0 obj << -/D [1241 0 R /XYZ 85.0394 393.3855 null] +/D [1258 0 R /XYZ 85.0394 393.3855 null] >> endobj -1248 0 obj << -/D [1241 0 R /XYZ 85.0394 362.9213 null] +1265 0 obj << +/D [1258 0 R /XYZ 85.0394 362.9213 null] >> endobj 346 0 obj << -/D [1241 0 R /XYZ 85.0394 329.3761 null] +/D [1258 0 R /XYZ 85.0394 329.3761 null] >> endobj -1249 0 obj << -/D [1241 0 R /XYZ 85.0394 301.8169 null] +1266 0 obj << +/D [1258 0 R /XYZ 85.0394 301.8169 null] >> endobj -1240 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> +1257 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1253 0 obj << +1269 0 obj << /Length 1168 /Filter /FlateDecode >> @@ -4634,120 +4708,122 @@ stream xÚ½XÛnã6}÷WèÑ.@V÷ ö)›:iÝlëzŸÒÀ %*&B‰Z’rìnößKYK‰ÝJŽ$J<3çpf8¦¡éêÏкh^`CG7-LFºö Þ]ŒêPÚ_}œ~¾²<-€kºÚŸÎÊWn…ññæö—r$(/G@gÓ«élz{9ÜÏ?¦ó†K›¯¡[‘o£»{]‹íO#ZïhOêA‡F˜Z2² :¶eÕ#tôçè°õv7õ ~†MË5h-}ºº‚òœº–ií¼›W×Ç(—+n"– ’–C[,Œ/Rö¡|¾/È*‹À0`à8f{z„¥,D–¼!ò ‚hžµï,“„¥‡çí¹1zÄ€|Ë1ß7c®ÀÍñ si.Vào–bQ0«\Fì©Ÿ‚+¤hBJp*ÅpOVLH $’DH¾$hS¾Hód‰y II‚(àXd,ø'’œJ’Q Â%§¤L’øe”Ïåo2JÂ:B«Á ‰¹ZBºíA”ã0çB…æpÿxš–î¹Í°1|z.TœG cŒ±"·¥úds°Dâ„€ßM9K@Dâsœ†õ2ý¥;úaÉKu;C‚¢5V3Œ>•!‡§hIñpÚÕô5¢$Bò¤U« (cH¨r¢]-%ÏUú 4\1Þ~Û<)–ˆ"¸X82 CœIU3ÂqtBucü ñh¿¼å]‘%ÅŒ ²ùÊèŒy;ßËKdÙEQ¥ã]ƸlÆ‹‡ûò©2!¬íí.?úè“«2¥j]ø¨äæëÆ£¶¾ïÀL ŶÞa´×¥\­EQ¹þîyW£tàúq/d®U( À ¬’m#MWpG%M¸ÂJ•VõÝó;–Æ‘ºø·üì! †´RˆÐÎyHÇG‚ì%#ã5£dó’Îmêÿ"ß¡QØdΔ+ç«:8‘Ûá©_³-wÐwä,øúým’%%éÃp•Švõ ´›…ª¹‡…X$H5… Jêºö£‡O%h« =/&¨w®Ó`c°!Rbþ/ïßèöpÉQ*âºM]ÝÙÜmpϯDž©ŽŸY‡T[t“^gpºB.s÷Q</RE• 3¥i¬¼Xšøkˆm*WXq6vKªú‰£çË¥¢Û_Û 2Pìý]W‹‘¡ë»fêÇÃ_{螯òÐ=çâk¼O½»=P§¯ê´gXºÆ¬"ó¾–ËÒ+XÎÃW[ñþŽdv«Ï¬úQ/€–é9 -z¶eïPê´ª­Mk ׃–gÚõßSlo1¯{a :žmT¶c¶½í¶nÏ•'¦38ÜÙV¢öRÂò íÛöpoŽZ,Nñßé â› ÷'©¶Zß7›s@Ójšž¯È)Ê©‚‚m¿ò¼>U|íú?ÌÕÌendstream +z¶eïPê´ª­Mk ׃–gÚõßSlo1¯{a :žmT¶c¶½í¶nÏ•'¦38ÜÙV¢öRÂò íÛöpoŽZ,Nñßé â› ÷'©¶Zß7›s@Ójšž¯È)Ê©‚‚í¾ò¼>U|íú?Í-Ìendstream endobj -1252 0 obj << +1268 0 obj << /Type /Page -/Contents 1253 0 R -/Resources 1251 0 R +/Contents 1269 0 R +/Resources 1267 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1250 0 R +/Parent 1248 0 R >> endobj -1254 0 obj << -/D [1252 0 R /XYZ 56.6929 794.5015 null] +1270 0 obj << +/D [1268 0 R /XYZ 56.6929 794.5015 null] >> endobj -1251 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +1267 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1257 0 obj << -/Length 1152 +1273 0 obj << +/Length 1164 /Filter /FlateDecode >> stream -xÚµXÛrÛ6}×WðÑê P\^&OŽ+»Î4N«ªOªFÆ"r¢4ý÷‚I¤EY$DƒÜƒ³g±‹°…̶<õmËõmÈfV¸!ëÞ¼»áê°ûÔ¿z;ý|M]ˇ¾Ck¶ªayy¶fÑüâê×Ëßg“é†.8ÌAooï~)GüòçêÃÝõíÍ_Ó˱k_Ìn?Ü•ÃÓÉõd:¹»šŒö6ö¤B8ap}ûÛ¤|º™^¾9/fïF“ÙÞ—º¿ÑÜ‘Ï£ùY‘qûÝAê{ÌúbþAû>±Ö#›QÈlJw#ñèÏÑ{ÀÚÛ´M?F=È<â¶h㚀˜è9[.ó¡C -œƒÐE*•.ŸþF •O"]†¿ç¾Z>®º6eÄOÕ+è3†­Ú …KëÅ»x³ÏM¶}hSß1O -©Sû¼áj 2¹Q!ÎS–u¾Î2ˆ"Õ ì»8&§“#Â%#JŠÌÛ6FÃIJOÍm·‹õ½bBdħ;&¸Î$w—gY'%¨ mÏfýCw>D?jõ¿z6Å -ÊÉ€Tʸßòl)Õ2‘ ,ÔªrÓäO•äÉfý‘«vò „H4WAÜe|ZI¶â -h±æè<~BnôKhˆ(îFã D' Wt˜‚0<é “3F~™ª~âÌÃÊÄ#ï>}ƒ¸™\q¹, -4ï9Í^ð¾äsÕb‘ižäÞWô]ÐVR­ƒ£¬— æƒ/|_{ªp'ÛjüP¬p¶ÕtY±Ä0éåéÞvÀÚÚÛ¦Æפ·È;•Êmë ’HíãÊìú·­23è»®Ó^ç‡òZÕÚEku,w2Ü…gc{í°Ú'¨ÚèD!¡®ß¾ÕÅô’µ†ö -²äC‚k•µ…ëYi Á»Èy%ºÄ…ØöÈÉ=ò¤¼}6ÊDj±Ú‚ˆÇÁvWªB™DY ¥öÄ©:¥ãBêû”`ìeiãRHmß?Ïò|Ò2ð’û’¢ý?- ×àI<;Ç$ˆ3 J¤ràß=«ƒ«çØÎØ@ à ñu¥@,ïA&¾ñýÑ?&®‰Ù`æùÓ2KyØA(M{qlÙYî(ÐAOû†+ïš‚þ“g:?½„}ó É}·ÁþJäÚ#f« äCŒÚôG"̆ú e*ÍòkfKuT[š¦)|XæXµ¨ož#c’âðí‹ ”ʸRE»Þ¬B+FŽƒ<öíÓÔk‘%eïãSÞnä%ºÇ~Ô Ÿ*ù(¢VŒN‡7sìÉô@k­òÒ*d Kƒ£&©³…x|eøPÇEÀ¬îî m7•”Áüz±å^íïd^|‹y¸âµMËæydAIhí‚’"zÄww¤rGmö”ùþºó˜úÿ;HÏÌendstream +xÚµXMsÛ6½ëWðhu(>’˜œWviœVUOªFÆ"r¢4ýï?$‘e‘t<>˜¹oßb ` ™?ly "ÊmËå6d3+XuoÞÝŒpõ Ø}ê_½~¾¦®Å!wˆcÍV5,"ÏÃÖ,œ_\ýzùûl2ÂÐ…Ç€9èâííÝ/å/ÿ]}¸»¾½ùkz9ví‹Ù퇻rx:¹žL'wW“1ÀÃÆžT' ®o›”O7ÓË÷ï/§ãÅìÝh2ÛûR÷#š;òy4_ +4n¿!H¹Ç¬/悘sb­G6£Ù”îF¢ÑŸ£?ö€µ·…i›~ŒzyÄmÐÆ51%Ðs¶\Æ¡C -œƒÐEš(]>ý*Ÿdº< Ï}µ06|\ 0tmÊ +ˆŸªW3†­Ú …KëÅ»x³ÏM¶9´)wÌSBêÔ>o„Ú‚,Ù¨@€Gç)Ë:_g釡jæ.$Ž Å)ÂäˆpÉÈ„’"ó¶Ñ0±ìSsÛíb}¯˜átÇ×™äîŠ,ë¤u¡íÙ¬è·èG­òãWÏ& XA9&ITŽoE¶LÔ2NX¨Uå¦=ÈŸ*ÉãÍú£PíäˆMúZÈX õèG=±ÖþW •g+¡€–kd|?‘lôKhÈ0êFã D' Wt‚ ’"î“9F~šÚ|̃Êä£è>}ƒ¸™\úQ¹82Ë¡çü5{)ú’ÏU‹d¦EœlD_ÑwA[%jíå~ `>ø"ö¨ +w¼­Æ% wa[M—K “^žîm¬­½mj|{‹¼S©Ü¼*ÉÔ>®Ï.‡”¸mõ™AîºN{mœŠlUq­5²ÜÏpžM¶Ã¦jŸ j£J…„º¼}Ë4è%k íd%ˆC‚k•µ…ëYi Á»Èy%ºÄ…ØöÈÉò¤¼}¶Ë8Ñrµ¡ˆüí®TIf-”Ú§Bè”6Ž ©KìS‚±—¥K!µ9?Ïò|Ò2ð’s Iq8®þ“xvŽ‰e (‘Ê÷¬®žc;`!l´ÿul,äוQr2ùM èþ1qÍ{0ÏŸ–Y*‚ ‚Ä´Ç–å6ý¡ßÓ¾áÁJF»¦ ÿä™öƒO/aDÂe|º·¸ öÂWú£ð5Ø#f+?CŒÚôG2Ȇú “41˯™-Õmiš¦àa™w`Õ¢^¼yŽŒIŠÃ·/‚R*$*ÜõfZ1räù³oŸ¦æ!COËùæ´¡õCOøÁÃPã¶Í6]Þ|J½m] +•PåE÷“yeº/²$NÂf?%ÿïëê…OAém*ñY˨$é}˜Ê›¼`÷ØäS•<Ê°£ÓQ΂2=ÐZ«¼P +øÈRÿ¨eêìD!žX™>‡òa0k½;HÛí%e0¿rl¹kDû{šßl®}mÓÀyÙ_ZZ»´¤ÈáîŽTî¨í>e¾¿=¦þ?ocÖ¦endstream endobj -1256 0 obj << +1272 0 obj << /Type /Page -/Contents 1257 0 R -/Resources 1255 0 R +/Contents 1273 0 R +/Resources 1271 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1250 0 R +/Parent 1248 0 R >> endobj -1258 0 obj << -/D [1256 0 R /XYZ 85.0394 794.5015 null] +1274 0 obj << +/D [1272 0 R /XYZ 85.0394 794.5015 null] >> endobj -1255 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +1271 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1261 0 obj << -/Length 2305 +1277 0 obj << +/Length 2423 /Filter /FlateDecode >> stream -xÚ¥]sÛ¸ñÝ¿Bo¥gB„?1yòåœÔמÓ:¾éC’I)’8¡H…ã(½ûïÝÅ‚)ÓŽâØ\.»‹ýÅüóE±H -¹ˆeÀB‡‹l{æ-Ö°öúŒ[·'rÇT¿Üž=åÇ Éd$¢ÅíjÄ+a^’ðÅmþΉ˜`çÀÁs^¾¹~uõú›‹ó8pn¯Þ\Ÿ»"ôœWWÿ¼$èõÍÅï¿_Üœ»< ¹óòïÿº½¼¡¥ÈòøåêúWÂHz<ÀôæòÕåÍåõËËó·¿]ÞgŸ—{>äóÙ»Þ"‡cÿvæ1_&áâ^<Æ¥‹íYú, |¿Ç”goÏþ=0­š­³öã~$f ð‘E°ŠCÉ"_øÆ€ïÎÝÈóœmQ¹ÒÍÞÕÅV®ê¶KÕü‚ðÀ ÕåœÉ0éןe±«MP±ûˆ/ó{øxOšç….ê*-ÝUSoÝ´ÓZÙ«öcÝ|¬ê“åóÊÒl£žÊ¬I«xäêK‘Y&»To>VioN‡F5Z¸mñÍnCèc»SÙ¸Fgw›îv*wáj[Õìÿ4j¥š˜¬ËÎjóÞ =‚.èñ§}ƒ¿ âúÍõå°…Ÿpv•W­Ûå»ÑÑ)žN Æ'nmêZƒ×JµN1ܺ*÷´Òëõ5+»Ü²ýŸåN-‹ÖFï_½”SÝü¹S;¬×Oµ¼hÓe©Ü´\×M¡7[ë\À´¨&š$/&‡:F[Ýÿ:%k(@U…*üÀ ø “¬TiUTk·¨´j¾¤åüžþ|Âde¡*ݺ;Õ¸Æ7§–³ûÉûTNGÇjÁ«\¼ªHçCîiõUÿÙ¤w˜T'óSÛÞ»-X¸W⇪mÏêJ§™>mÿŒøou¥Ú›ÙÀ?p$ÌF¾Zºv¤œï;­Ò-AÝŽžë²^bú#|8¼èŸ³TvC«r‚–{zâǼÝvÛ‘Àmj‰±)¦•cJ=A™"Ç„!ª-¦ŽÁšêG‘“â#v жë®Iɺ¸†˜RQ(«!õŽ'Ž¢¨¢!&f %,‘’ß²1€^rlÙgÀ[†àe’5.Ë:ûDà]R(ˆUÂ-ÁàZFÃ#¢Ð­Y/bI(å4ŸrµJ»ÒÝ]Q–wÁÝÅîÍ͜ŜG Ÿ,Jbÿ9—ˆÜ1•s'fëgðÊ(U4*Ó5”ß#É2fQ$Kî‰f$ýÀ=±â‰©hÌסsW7Ÿ µÑ (dâê'wP/ƒ­WôÔý[¢áöWˆú‹Ê’V0š¤Ë¶.;miqºÄ’‡.Åè˜×ý($E©õ'‡\÷¢i¨“ý€Î ÓOª"TÚÒ“ÎRß/=QM+Ú$ B‡ãq9çæH’[!E9È´W– ë°­[M1 Ï.ÔÞuv‰Õö/¡§ØšQâLnDG—³¦«fr îapñ6Ǩ٠-p‹)/qN„fÏé'ÂÔ$Hçè&̪Z€CK§Q9d³H<ò&. Ñ4Ë  mcìÙÂÔM ýïŒ!üȇ»¡×q6g&ã8²{F@Ûòã(œ† E\ÀÕòᬠ¦ÞÁݦ0%@»Iô!Oë`‹Z£±p¸aö3#€Mfùmê®Ìiqi÷™škCÍ4tL§ •ðC†Þw -Õ˜êáB5P¡ÔOjï>X¬8YKï‰f¤OŠ•°úSñÿÙ˜Ôæp׃yFM*Xžtò=¤G‘Ñb·ËSSv65 Z•uCoã4‚µÏ¨‘s¹wÏa€ºµD`3îºeÙËÃI…ÎC%GžjŠ/¤Žh@E@$‡ €…¥¥\Õ]…iåÒ)VD—º¬¬J8- ©Þ˜ˆ½zÀa§4£òž*{ º/Ü—ã¸åPª$4ã‰tšó|?9Œ.¾¯‡öQZÍÕ5)™ˆe` Û•¦Tx€M—ˆ2ýžô‘×B˜VOã°ÕÞ"Ÿ¨ïÊSZ=;J‹ dâ0#OMz¤· u—E\ðiÛQ}]7éÛL W&H’áãfâHì%Ç©Ó¼·j—6©žBü€…2”–t¤I1Í ž•R¹Ê_  -ÂÌ’»êªŒ>½z?ÞùÚ4N¢´ÕÙ‡P8½Ï§¹CÇdP¥„™'£ä;)1¢z$%z*Ó±˜¯Û6ÝnÖÀ©+]À•æ8=B0± ÂÇõ¨f™”õH@G† -9ÑÄT.=*ÒÆÂø–Q ê38ºˆš3‚ú°Ÿš³mME¿º"—ÌÔaÄÀÙ[‚HÈçNµÐÁÉiº0LøS§™ë·%VÀž×oߺ·o¯^Ú”®³ºÄÛ”ÎËC .íf{…ä?T³¤2^·´Òc¤+]…¹5\û’%}@4Ý:Éc“Í|O(ìõÇ<è,Gj`}nŠ*+vær Ö̸BR9˜‘ÙPå³Ï]Ñ·J¤ÒâÛ­÷Oî`í ¿¥ÓIÝñ½TøM©,÷Èä£çJgÏ?5Ë'.ç -*\˜ £¤‰Ø¹î%¸~õ—€F¶À×mf -Cˆu3 qþßê½Õ3™|…HX¾›Wíó™Óô_YìMÙX™Ù¤÷OÇ,ö’¾£`sšÄ¹=—©I3hÓ~²ØŽ®O} ?›)®A¢0îk«©êá7¢?ÞaH˶žp_gý.£þ˜4S`¼á ÓOÿfuøA›G’ˆùJ%bðXL¬Rx® º_¤í[÷Uÿ?žz}+?¹./uƒ# 4(~o’•4¢Ä`bI]a­O ‰†Žéôh¡âÂw|ßý‹B5¤z¼PõT(õ«ÜÙ+ÆBǽ§¥wDÒGÅŠsXõÅXüÖ:µÜõ`Þ„Q“ +–[ÙÒ#Oi±Ýf‰.;ëšLÛ¾·1ÁšWT‹È¹Ì=r -Øô¤ÛvQtòpR¡€sÑAѧêüžÔÜz{swwuI0“€}Al°°0»–U[bŠ _Xù’p ×’Š jˆÃ®¨µ pö1;ÚkVSµÏº‘ê0öŽòYŒãš‡ÜÚ´¢%ÝZƒJáû¾- –âØa¤KáME O¡ˆ¤+^¢oüˆ]'YV„Æ©‘Ûšš$´(³ öÄ°Ý;G}ÈKªbðŽ-­s¾ƒû eÓb™Ð3«Á¨nÕ1î´]«Ë,u0ŽË™:Ì/Â7•ç8ƒ‰ òžÎó!ÕãyÞSõ½Æþ¾”õQ’»°…~RvOu,\ÄÃ4gPÙc˜]FÒi,"ÚOzÂL£ˆÃø‘JNµ8vx{Æn׊vP4Œ#Jð¤oª¸BOðÔ½Ü$åQØ1cZ5yóàžïðý•blÒ½!þÁ Œ³ÃÒ¡ÛѪN6˜#0`]ëËQÔ Ž¬[oÀ( དۤNÔä] +b§hä{Žû±!(BRtF³”2“ÙTëÑ[c—m™Ò—Ê\í†bkÑæ4}£”ÑÙgv8½8°\'Ú`Þ|,% ¢˜ÀÓ)1 z"%:*=6`ï[5M²Íí´†S—*‡àazø`âØóŸÖ£§šPdÔ 4”‘&z¾`±K=M[ßR*ÊbG·' Ñ,ƒ Úï§YFÃ¦í Œ©‘KªÛb¨Ö!DB¾µ²‡œ¹Ì^b\Jõm—™†ÉaÏû»;{~wýžÐ& T•V^†ãغÜ÷¨Âl67^@þCÖ jÄUCk>=ºRk`&Öpí>É ú~ƒhú °×)>4ÙD«ËMAÇ©Ø‹Õðñ£s^¦ùV cæ®h\gfÝT’îëFú­Í»É©Ôšø¶«Ãý£+k³ÃohAˆ¤¾õªëSõ&)ŠÝS7 +:Ük©Ò×_ë…]H%‹©‚ +Ëc^߈쀇ÖM'’ »C4°¾vh=‚iB¬›¾ÝwC¨Oœ{FÏhôÑ&r¼ÐFlV6¯§Ú©ù(e>,h+;æ›òñIÂРݨ«Æ(XŸ&²æç1·*Ò Å´ˆ|'^0ê.†_MW/r?ìj«®êào]¼;ž•0(Š¦h¤rû&cüím¢À¸ý¹Ÿþ‰oÿû'6(âÓ•Š‡à±˜¥ð\^t\¤ÍoǪÿ­!–5endstream endobj -1260 0 obj << +1276 0 obj << /Type /Page -/Contents 1261 0 R -/Resources 1259 0 R +/Contents 1277 0 R +/Resources 1275 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1250 0 R +/Parent 1248 0 R >> endobj -1262 0 obj << -/D [1260 0 R /XYZ 56.6929 794.5015 null] +1278 0 obj << +/D [1276 0 R /XYZ 56.6929 794.5015 null] >> endobj 350 0 obj << -/D [1260 0 R /XYZ 56.6929 418.3076 null] +/D [1276 0 R /XYZ 56.6929 418.3076 null] >> endobj -1263 0 obj << -/D [1260 0 R /XYZ 56.6929 386.0953 null] +1279 0 obj << +/D [1276 0 R /XYZ 56.6929 386.0953 null] >> endobj -1259 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F48 950 0 R >> +1275 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1266 0 obj << -/Length 3835 +1282 0 obj << +/Length 3842 /Filter /FlateDecode >> stream -xÚµZÝsÛ¸÷_á·ÊÓˆ!‚Ó'_ìä|½8i¬›¶sw”HYœH¤"RvÜ¿¾»ØR”|Ó›&“\,±Àb?~ H\†ðW\¦:U]&YèPèËÅæ"¼|„¾‚y¦–iêsý0»xû^%—YÅ2¾œ-½±Ò LSq9+~¼ûñúóìöËÕTêpWS‡“îîoˆ’Ñãݧû÷w~ùr}•D“Ùݧ{"¹}ûåöþÝíÕT¤ZÀ÷’G8ñÁû»Ÿo©õáËõÇ×_®~Ÿýtq;skñ×+B… ùvñëïáeËþé" T–êËgx ‘eòrsièH)KY_<\üà èõšOÇôé4Ð2Š/§* -ÒÆÕr„´6MtÄJ*§e)Æ´l¹PËÝ×òeZ4›¼ª‡+‘ -„—þ¨G²-ÓˆlåÉQ%Âg«òjªt:á ˜v¾Ý^‰IYeA„®á§å®óMÙR³Yâ3™äë5ÚU¾»éÄ~ ËcÖDz.wyGÉä¹êV¸â’””°a «33üûí¿™Ë_ŽL!“Œ™ðÏUi—€ŸÀž¥I„QZA¦µ4Ü‹uUÖØeOhªßöeÛµHÑôé`N‰"¦¯L) Â$¶Lå÷Å*¯Ë7`Óa<©XÞ&¡F³#qŽP7ÌÒnËEµ|¡n£r¤e[9½~ØâYÒXñt~%„@½ÈLLî–DÞÒ-¬þ )H„!˜w÷Dûœ%,[f›áéºzÛœ™m¦ŽçÊX´æ%i)òU)bˆ(¬&»qòÂ+_·ù®Q³=G©Nx€¿ŽÈ€V¦,ÃÀ¿£Ál­¢ƒ%«>Á*wÏU[²–T"ÎŒ„§%ewB)Ö’Š]=-i :XKÐ:¡%J뻼†ZVåwjÕcF;¢¡0‚v¦Ïj\#ûß4¤ãlrWÓä7MÛÑÊy[¶oȳqùÇN4 "CõŒŽ—A¬…]I»jökФL3T<9&!¡-wO%8$•¿´D²A ùPúb–×CR^[c·›^릞–ß«¶3†‰Œí~~*›¬«¯%†^oA¿IEr¡ÁÏÀpâ, RG${É KÓt*ò.Ÿç­ý¬a8EÈZUÝv»«t²_P¡á1ülu¢™BK³xSvu±`·„Yóq°"u,½šÄK„Î Ê5Ñ°:lQ.óýºsf7‚ 1¦ˆÌb[Tn1Ü`¥RÀŽ€éu %ŸÉŸÆnÄ©?¤1‡ÞìT$‰šslÖƒQ…{)ávÊKT@ÙðJŒñ¹Îx‰åB‰›rÓvyP¯Z´§Ü%Ž ŠgÙùY8®‘iô&†â;²?ÎW¡ç0ø†ƒÏÎv[‡ñˆÂËq>vUgr ´aq˜6L{ßæüÝaÁ¥Õ¶Š8Az@¢ƒ„’QÀƒtÂgÈ€k$}D¥õÑÉ-eÙøõ´…¨d”õbÝP=è•E³wõ·=( =B GI¿B=®3!ÔrU.ö;¬OÒHcâó3p\#SèÅ `G ¦@éVk?Ýj¶jxvWbb9œÍjëZ2.´¢öú¿íñø|W•®#ï¨å‚è è^ënýB$®÷HAD2È–b#B¦}{ ]“}»ÙŒ7ùyíŠ -è(¶)øsÝFŸ êÄ?ü¿!Ý´ ÎÍ)d»Sß“†­b¸¬™=a“qˆÆ7È’ 69;S³¸Ú!„òDQ¶‹]5÷òÃÀ\¥†áC‘AI…Ž N¥ÎÝã%5¾x–ëø§þǦ{<.ÎÿV\5µ½hŽ(CªZØ? EoFGä¸^™Çñh烤8K_©@}®3aÃrxÖÐW/T`M¤Óø¼TÇ5"V NQS%VO.G‹tòËÍç·³wŸéÅÌZ€ñ÷›9[C@ã%RÄ‚-±šc1$±í–Õ“I^H2ˆ>­ G½¹ O_wÍ¢Y³¬]îN‹ˆÔ+Zãà‹ñÀò½<’°u§­0#)éÎð’I³µ–N, ¯5(ñb‘Óñ}7öðIŸwnŽ—ßtê÷7x‹…Áow©‘Ø^Ò'ö™+&"¨í<ͺÂ~Ücðê'R{^{¸±I~Ñl6ûºZÐa´Íòýð¸næ9 ª?iäRÇ`)â•Ôès6rÇu¸½œåSµ8NŒ°[B¨ø¼xÇ5"¿÷Ò Ì¢¬?Ý‹#Ú“[ð{³¤'D`2Åí P¿øœ3#Õ††b9ܘ~y&p;¬jé¹ÝU›|W­™\—eaGå+|³A·ïð¥€ÌÒÁ­s³Å[0fsÙ*ä¤Ý/Vè<`-=ÍM‰i;Õmn‚kKwŸì‘ðn/6ðe¿-Œa›±%3ÿŠŸÝQgìT†sË+{y?í´t7&X›&_c °A‡&ˆ O€"èÝ]©˜·çUe $Š:xmƒoþFrþÔ|’Eâ+žˆ}æv -(5ªBOžˆoûjG!l gdÉìÃPý/óŠ[™dbï–¼Sl¯p÷°wŽÅƒe-¿¯ò}Û™ªU%|$—ØÐaìÄ–!À{ˆ Þ¦®÷,iê¨( "<æãØŸ·ü«ƒ¨“Qd‘ïY¬ÐAE$‡ªù 3ÚWeVQÖÿQŠ¡PeTs›–»¢G=„™Í Ã’]b®üj‹;ƒe$a µ-b\†i]þÕÔnÐ,M:Z@¡÷bOF`Ø*Ëð,+Ž‡µYÕU6ð.šwéqO–ED¾nÄÈÞõ/âL»ËwÝ~ËѼ²y¤ÌŸ6‡»[ÍG¹8À~ÞâO›jœ˜Pè麞cîpÏ&Ÿëtp\éìÊe¹Û•Åô-ñ( „ˆ Óóò×ÈúY@)Dÿþ è8[]&s—½j²Æ_}ðo÷²å+`´ðkb ŸŽÈÉ5üacª=ͲWËjRnðܪ°Dï´a0]ä•@¤—ÈÃ\ò¢àx -a7ÈÔðh ÍÈZWëh[äö §4×ÎÚ-D¶’‹öÙ©Š¼@,Þ`g]Z¥“8d m™zC‡÷ŸîoQ=§ÍLšK“WNè}®3ff¹ŒÏ7M¿.ŸMÍõìÐØ(›“$=? Ç52ž±¥ -ÂH&úó˜]!jØaÈ—+*…p±½fcX”*ü€nrnŠ›ÐŸ¸!V<Èìç›–ØQÅ]³%òº|*×ü¹ù©NËÙ3åX_P²²÷8 ?B ìÉäø!ˆÌ­Mm}s+¿/Öû‚÷}&°IPÂÖ…‚øñ@å?`Uò‚;×ò;¸âѱÁœ{7yQö{¼XÝ<—‡ØaÏ Ÿ=8Mò9©ZË$jòÀØé0É‘dNReß}p9RxË‘ˆ¶‹ÐŠ°·¥Žœ^Am%gÃÞùxÓeè_Çèâ0Oªà£iR ä'œïÕÅý¿n>}¼¾»?­ïáÍSUØtÂqäÝýõÇÛᡨÚEóTö²Mi®ñÑøOJl¬ƒhü'ð÷åOÿöûðÃx>*Må‰s‚Ê™%vR¨Â(Î\+©LF¦þ_˜ Ìuendstream +xÚµZ_sÛ6÷§ðÛÉsC Î=¥±“º×:½X»›¶´H[œJ¤"RN|Ÿþv± ¤(¹sK&!¸XbÅþù- qÃ_qit«<¹Ìò$ұЗËÍE|ù}.óÌÓ<äúvqñæ½Ê.ó(Oez¹x Æ2QlŒ¸\”¿ÌÞ}÷ö§Åͧ«¹Ôñ,®æ:gßÞÞ]%§Ç»wïo?üüéíU–Ì·ïˆüéæýͧ›»w7Wsa´€ï%pâƒ÷·?ÜPëç·?þøöÓÕo‹ï/n~-ázE¬p!Ÿ/~ù-¾,aÙß_đʾü/q$ò\^n.­"(å(ë‹û‹øƒ^ûé”þm"-“ôrÌJ‰|ZËqkÐÚ³Y±^¡[»+afîcX³>UMµ+zêÈf_ê~…+)II Û§°:;ÿßü›¹ÂåÈ,2Ë™)"ÿ\Un øÉå\™,Êâ$-‰(×ZZî庮šì2Og4ÕÏûªë;¤hút4§LD‰ŽÍ+SÊ£8KSõu¹*š§ê°é8Õ,oS¼P£Ý‘8OhZfé¶Õ²~|¡n«r¤–UW{½Z~Øây¤±Ò3èüJz‘¹˜Ý>yKt°úoHA"ŽÁ¼³Ô)ˆŸö9ÏX¶ì6ÃÓw ¶9·ÛL_jk Ðz¨HKI¨J‘êH$¹`5¹½Hã˜^ãˆøº-vý„šè91:ãþ:!Z¹r #ÿ³É´Jv”A¬ú«Ü}©»Šµ¤2ˆFŒÌˆT¡ÜN(ÅZRé¡k %` -Ak Z'´céœ`W4°R˪úJ²~ªÁh'4'ÐÎõY käÿ›†tšÏnšü¦ízZÙ²èªîòl\þ±ÍUG‰€¡j$ÁV‡Âe”jáVÒ­Úý4)MŽjƒ'Ç$$tÕî¹G€¤ò—ŽH.¨! +@_ÌsëzH*bkÝvÓkÓ6óêkÝõÖ0‘±Û?†Êgëú÷Š ÃMoà=¿J™Er¡ÁÏ€!5¢çÈ^2Ê1Ó¹kîGœ‡CNÄ} L¨ü Ùm9Gˆcã°MF:ë8»?:²L»˜‡+ÇP,br0—¿´{j°Ð˾«›'Nö÷÷óÅýí‡oèµ_Õµž‹]]<¬ù‹Í [L)«_ãX6UÎÆ©Ž£<Ó¯¤ìëtÊö\‡Y¡Çû¬²(N“ó¢Ó„èaÆ–Q e(Ûfl Ñõº~D¢ªùwÕz½±öìB1²ì;Œ;Hz`Jï¾vÞ‚˜Þ‘æò3QÃÐ…½”ÇeΉÛòPôîœ4ÚÔܸ.K€X<ôø37ÂIiPb$=Ž "[Nó 9Ä+˜´ãúu£4²) R03¶7hY@Ϻ-J¦¸!¶û‡u½äš’‰»ú™TTV´­ +!tS¶U:Js˜Û0^€Ö[½1ÖØÌ¿´»ß½³” –}»óÞºFñ[.ƒ‰Q²ÂM§òœãh +¤•Ç8éu:O£4ɲó^rö:Ïe¡B±\UsÒÖ‘ßÁ¦§ƒ/&ÏqMˆx˜m*ãl(áC“{ZàeÕðÑoRÛ¬{sݲÖÚÞE¿3ÚK¡PzE{×í9.Æ÷›íIåå‘I_‘í˜&dU—D&‘#á ‡‡¶E¿rp)=†K<¿xUHÄUt£Ê¢/ŠÎ}Ö2À¢ZZuÓõ»+3Û/©ô˜J~v-‰:Q’Ì!­™{×í& Š ÇAúØÕ½Í-ІÅaÚ°í}W<ñw‡ó8- kè X¸ÓMb*$‘„¦k3â?i}ßÿœ=Ç †<Í9â]™ªuŒívÂ`¿‰Q¯LÈuÚ`<JÜÖå)3à-XüYÙžkBø°êU‘éPøÂ…È0¬ò‘ŒÊôVÍTXͼ• Ö”4(a—eÕ1áöš9¬3iÍ;l$³cv^¥ñAœßy|™Üù$ƪԟ ¼! K$ÖX¹šovûæµú?‚­˜*†l'& ê×êWÒ4~²‹Êž„DÌïH#üŒ-ÄÏØÃ:yÚæéWEO}_ +¬-­%JW5ü}W?5źóÝ yjLJ/Òè™ÍYMC¸Â$3´Û:Àfè—"™ÝÓ‘²N fˆD™†:"[¬ ÊÝÉÊ[ÔF—u‡Ø¸£OxŠ *ˆ(˜ððÌÒ­Vñý (Áê0s"{é@©\;H™FJd£GSí+[éH†ß¶ñBG]¶pç:ªˆ¦¢ž3Ô‡'éMûŒ䎥Ӷ…Š8Az@¢­ƒÄ’QÀƒt§È€k$}`œ‚<:…¢¥<¶a…í ªU³\·TeFÙî}‰ýy +èN‡PÌËÑó!4à:B—ÅQÕr¿ÃÚñT Mt9&=?Ï51…A<€bZ©Ñ(Ýj¦[ÍV ÏþJ̇·Yíü@ëCÆ…6CÔAÿç=¨ïêÊw=µ‚c==ÐkÓ¯_ˆÄõ)ˆHÙRlÄcI3´‡ÚµÙ·u›Íx“Ÿ'Юˆ¡€NR—‚0×oÔô)¡ÎÂSÂÿÒ5hpnNUêÏO6¤©ÈdòùN¶ç²8èU$‰'<1lÜÙ)x®‰9 Ï‹R€ì©N‚2]œ„Þ,FˆÙD‘àó´=Ñcà,¶[Hgw˜Ñ~ÑÒ“«.`W]SÉO[uë¾›N\s<'KâQÀ#{T)Mb +& ¤® ßk®ø !üvˆTlЯ¨ë€TRuÂAÓ"CK<5À÷*Ë|>hHKSãƒì ÂÏhêØ—µpçl¶ p”+!%l +v©öqäp‡@vÈeÕ-wõC%F+5 ‹JJ0¶”®C©s÷tIOízþyøÁ±í‹ó¿‡×mã. “ŠÑ£ÚV@Çb0£#ò\¯Ìãx´ó¡#N#€mœ×™Ðá¸,Hkéîk-°2Ò&=/ÕsMˆU£³T£ ÐÈåhaf?_ÿôfñî'z±³ ýýæ‚«$ qˆaG¬öp Il»UýlS’,n£O›ÒS¯ïîéSFÙ}»l×,kWø3ã%â5@ŒÎøøb:²ü ›dlÝf¦æ%%ýI^6k·ÎÀÌÌÑðºƒÒ/–:=߃cŸ÷§çx)Ngƒ·TX7bð—™ë%}bŸ½z""`‚ÆÍÓ®+_‚°a:u§¶‡k—ê—íf³oê%I»\? Oëö¡à!Aõ'\j ¥çk×(!×i#÷\‡[ÍyY=×ËãÜ»%„JÏ‹÷\ò‡¨ÏDqžäà ,è¾ÑޚܒßÛGzB&Sܾõ‹Ïf¤ +ÑR‡3,Ò$nƃÕ=·»zSìê5“›ª*ݨ|µo7èþæÃ>øÌŒn£Û-ÞÝ€1ÛKX!gÝ~¹BçóèèiïKl Ü©é +\;ºe„€7x½/ûmi-Û„¨”­˜ù?PuèŽ:g§²œ[X¹Kýù”AÛì‹\Â¥CÉ×l`б "ÂÁ z÷+öí˪¶‹…,ÈE¼¼Á·p#9j>Ï"ñ5OÄ= 7‹Uq âPÄç}½£6’3X²}8ƒ-jnd’™»a +Î"°½ÂÝÃÞ,!kõuUì»ÞÖ®*ヹ̅†ìig®ÞClÌð–u½gI“PG%Y”àÙ0ÊÀþ¼á_#L@%‰C^¼{d±BGy’ŒªäƒÎh_e’;m$ùðÇ*–BÕ~’Såm[þêõç.'Œ w‰¹nôkŠ ‘Å‘Ö®”ñ¤õÅﶂƒfeÓÑ#z/÷d–Í£²O´Òt\¡Õ}íï²mp—žödYDäKGŒìýð:ζûb×ï·ÍkwGÚ Àøi{¸ÁÕ| ‹ì:üÉSà +=]ý‹Š)åù$rNžË"]õXívU9BK<Ê1âBs^¾çš˜À0 èÈ%†3 Cm9v™Ü_ùªÙ Â7½ýË–/‚ÑÂßý¤DÎÞÂ6f º3-wÁ¬fÕO¯JG ÎlpÐõD^ Dúщ<Ì¥(KŽ§v£\ÈÐŒœuu!€v@áŽ{*{à  ÛBd«¸t_œªË‡Äá vÖGg£t‡ ¤-[oèøîãÝ ªç´™ ¨Ù“ü53 ¸Î˜™ã²>߶=xüºz²~6·—´ccËL¤³ÌœŸ…皘ÆÀØŒ‚0’‹á<WˆvXò‹2Î!¶7l ËjC…ÐmÎ5¸ É[b̓,~¸îˆUÜ·["¯«çjÍŸÛŸðtœ= Ç +ü‚’•»ÍÉ øjdO6ÇAdáljš[õu¹Þ—¼ßè3‘O‚RI·×÷Tþ£Ö øs0|©¾‚+Þt‡—2:¤8L$*ø¨Cڹà çÛ‡2¹û×õÇßÞÞ„.ôðö¹.]:á8òîîí7'ÂCYwËö¹d!—Ò|¢é–¸YGøcí Ÿ„¼/ú7á‡ÌðQÆœpn,šÌ37)Ta’g®„ +#³‰©ÿîÑbendstream endobj -1265 0 obj << +1281 0 obj << /Type /Page -/Contents 1266 0 R -/Resources 1264 0 R +/Contents 1282 0 R +/Resources 1280 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1250 0 R -/Annots [ 1268 0 R ] +/Parent 1285 0 R +/Annots [ 1284 0 R ] >> endobj -1268 0 obj << +1284 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [250.9056 343.4991 314.5963 352.9087] +/Rect [250.9056 335.8063 314.5963 345.2159] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1267 0 obj << -/D [1265 0 R /XYZ 85.0394 794.5015 null] +1283 0 obj << +/D [1281 0 R /XYZ 85.0394 794.5015 null] >> endobj -1264 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1280 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1272 0 obj << +1289 0 obj << /Length 3458 /Filter /FlateDecode >> @@ -4758,67 +4834,69 @@ xÚ¥]s o ]‘T&0ç_â:ót»`³¹W[lcXÓQ&’Êö^òˆ›w\NóÖt66<ªÅ©î€DLÑ0¼%_Žœ)EÜ™ïþµà‰ÎaÍ/«Ù’šÈ.µ¬ ákMŽ”L‚ÂßÃnÍyàØi 'ß1_l8›S k/²Ž£"×ãÕ¥ØT›+ XŠ 3%HØuç‘ÒV1› ƒ£KS͸x×ç#“$ʵ”ŒÅñvE6l•³™Y£@r—‹w4`«Z¸ê„Ô¼„†÷ÂÜÑMÇ"‰À—9.Û±M³à7mõY‹EÖÖ"cBÈ2*’1Ädû’s›Œ#!ë§SŠ±(%…¡¹é ’»* ¢—ˆÊØ1“M´$­è(T\_AøÐÍïa4 ³mæ»fևǡ´?ú5 S4œ‡rM±0ëåÚnÆYé,Ußÿ¤î'Mà­„áæ,ÈÌKMe^@œAúƒ:)eê‹éN_L¥ú±mkSrvü³·#†/Ö2Šã$;møB¬ã†ÏcY±oûå´ù̇¶oðâ #1yzy5²þ0n•‘` 1y¢Š¯0zw“’XòMBýäØã0†tÛYˆËË1º:J3oDœw¯œŸuUt¦´§Å¨ž˜e®å23hžL3 Øë]ÙŸV£ÀI¤r½—F“M×jàn÷ ÷¸Ò –¢$ÍœBüÎ7Uc€¹(!ÄŽæöÄ.Á¾ç:;ނýà¤m¼¦R¨e†>³eÙ<Z2(AÿAK[F3aÿ¥Ý2 oœ ³íÈ„¡'¬‘| H™”ØóH­«Í]ÙçÌÛEÿÌä^ˆVÁ ³äœ³1û‘É.|éýÀˆÔðUHëäÔõh€Ž5´øÂ=°NÜs‡eíA70>m›©ù\õ‡I*šÛBæÁc01¬ƒØz‰rÁ50,Á®Ù[a&OÎØ@ÅC»CM(¨Ý-5MÃ5WöeWòqx¶fÕR­QBòR~r‹3uƒ-=HZˆj#ü„Œ‡*Åï•'µ|­÷êá~(„JwOn¶m6ÀÖj•µêƒÔ`± —:­!Öq}ðXÖ™fª®¯f‡%10‚™*ŠÓË{¬‘õª'Q–€D ü‚O¾*ù)òƒ'k ºo¶ïŽ›Kž‚A‡=ÿBíE!0øð2F é"s1À@S&7ÄÏ+wum°Wˆò7¥ØÈxgd«Q# !A¥q¬‡áÛ¸±U‘R>îÝ6µéX¾›®ÂÇ—©}·÷"2¬Aì4§íjåõµ®ü[†»šœl féžbª]Rw¸=pQnþbÿãÚ¯  Ù¬aˆuBû•1Ëû½eu ™ÈO/ëF– wXÈl‡.;ëÀ%ÂÖ·¥Jô¨‡$ WŒ»_X {#îh̾©áV½¬#Í~„Ë~²s½ž·Ö²ºÉŒ»taaÓ;aFÞ½s¤ Œ‚F‡37VË(} ¢Cf/t"Ó$MQ ?a¼¤c§¥G0hØ*M -)­¸}\ö4àæãû1~Å¢pÑç@|ôX5pçqCˆ<£á 런Ţ7Ž]Ùr›W–ü‚#›~,¯1Œ3ëí#±ÂDŠ/+1 [–/¿µ"Ä>ŒYt[Î’)>´Î` ×|¤{–ÌÃ(¾ÇHÐèZ‡KÑŠêUHØV½ ±´6¦iŸü`µrl/Ä—öîÇ\fié+ê¶vAl¤_XÕõJ¼4å¦õœ:Jc–7‰tªÜÝ`3O–íÚ,¶÷Bw¾Ý°çw5iË7f°Oëã!ÀdÞÝoä¤Û®×ìÏ;ãbîBCÌ'CýäwÆàñØ›PŸ´>'Aå­@ùÁãÞÑعcv5Î “Ìõׇæ\²‰ó’©$> Þ¦G²‡® ÿÖãŒä~%Ž´*\bì#ŸBs,æ€D\Ðï ð»ç¡5¹¶^#¬¤âÇÄ-òT™çNâ4’B§‚ŒnJ'>:·4BBøLäOV¯ø·Ì«s‡À>»CÜHOßö‰ Wib|?É0RõhÃï'¡=Öíƒ×ÿAý(ä*ÿŠóH2=<èØOç’4Âß»¸6áèÿþYÝî7‡*­ãq' ©m¤4a¦}¥£þýÝ!ëÿf ^‚endstream +)­¸}\ö4àæãû1~Å¢pÑç@|ôX5pçqCˆ<£á 런Ţ7Ž]Ùr›W–ü‚#›~,¯1Œ3ëí#±ÂDŠ/+1 [–/¿µ"Ä>ŒYt[Î’)>´Î` ×|¤{–ÌÃ(¾ÇHÐèZ‡KÑŠêUHØV½ ±´6¦iŸü`µrl/Ä—öîÇ\fié+ê¶vAl¤_XÕõJ¼4å¦õœ:Jc–7‰tªÜÝ`3O–íÚ,¶÷Bw¾Ý°çw5iË7f°Oëã!ÀdÞÝoä¤Û®×ìÏ;ãbîBCÌ'CýäwÆàñØ›PŸ´>'Aå­@ùÁãÞÑعcv5Î “Ìõׇæ\²‰ó’©$> Þ¦G²‡® ÿÖãŒä~%Ž´*\bì#ŸBs,æ€D\Ðï ð»ç¡5¹¶^#¬¤âÇÄ-òT™çNâ4’B§‚ŒnJ'>:·4BBøLäOV¯ø·Ì«s‡À>»CÜHOßö‰ Wib|?É0RõhÃï'¡=Öíƒ×ÿAý(ä*ÿŠóH2=<èØOç’4Âß»¸6áèÿþYÝî7‡*­ãq' ©m¤4a¦ýTFüû»CÖÿdÙ^{endstream endobj -1271 0 obj << +1288 0 obj << /Type /Page -/Contents 1272 0 R -/Resources 1270 0 R +/Contents 1289 0 R +/Resources 1287 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1250 0 R +/Parent 1285 0 R >> endobj -1273 0 obj << -/D [1271 0 R /XYZ 56.6929 794.5015 null] +1290 0 obj << +/D [1288 0 R /XYZ 56.6929 794.5015 null] >> endobj 354 0 obj << -/D [1271 0 R /XYZ 56.6929 333.8409 null] +/D [1288 0 R /XYZ 56.6929 333.8409 null] >> endobj -1070 0 obj << -/D [1271 0 R /XYZ 56.6929 308.7186 null] +1075 0 obj << +/D [1288 0 R /XYZ 56.6929 308.7186 null] >> endobj -1270 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F48 950 0 R >> +1287 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1276 0 obj << +1293 0 obj << /Length 3312 /Filter /FlateDecode >> stream -xÚÍ]sã¶ñÝ¿Bo•fŽ ñE—‹}u¦çkg:i’Z¢,6©ˆ”}î¯ï.° A‰’®éÍôÆãá -\»‹ýØ$?6Ñ*N„‘“ÌÈX%LM曫dòïÞ_1‰¼½ŸýöðýÕõCÇKÈ/K2òÇÕ/¿%“°ýýU £Õä~$13†O6WR‰XI!üÈúêÇ«º ƒ·öÓ1ù)¡c¥y6"@.²`™N2eâTÀ+àír ­¦íªpÀ¿ëŠ ²qÏÜ=6yÓ»éÍ,’Ìà‡ÕÁM±{ö˜/åzíG«…ƒê};˜ùîãÃíÍÏÞ͘ž싆pÚšpý<ý2ëü¹hp @c±QŠ[¦~MT²(–ù~ÝÈ`SS™LV–#e¦ÍªÞ¯‘ØêvW>=Yjñ‡’@ÀL™¯\í7u¾*æ¿»éÊêàkK™‘”­eª~.eõä†Ë–0÷Ûm½kG¹pbAœÎê;þ²‹!@‹Ù±Ú=Aúåò`iz<ÇB/«r]Ì2¯«ª˜·e]¹ß(*»(Œ= AÁP‚~Í¢u@½ô¸åMGÆ€gª°ê|åü†‡ zÐœóœhxìik×ëbAï^q Ðpj¸a±ÈKãŠUÝ¢^h l-M¡å —csÅBeÒ㬛::9Ÿ41W2#ÜØrq«H­A -Yl×½ñ”“à mÈJž9>X·¯0Rïܳi÷ýWoTd€ƒ9½"ì ÐNºæÌ«i>pÃOûuN_ýʹì)Ûo ¿vÏEÞˆA¸ ân‚hL—´æŠ49ͦ`Þ»²hÜ¿êjýê m±[Ö»ûDôBœÚ±‘-ãŒÇ~Ð>¬Š|×>y•x®g°âã­Ó2N¯ ŧmIÔºuJZ/_,J² \½vOôhh´Ý)ú^>TúPÓ×ÖĤݸ)+ë]¸ UžÐ(@£ sUÏhvôÕ=÷ ôÍÔ¡6gYÌSyÙ2 è,|™„&‹»ÍA¹nØ9n€7 UùSѼ]—†Ð®î”s -lD¹Î -, äkV/¨Æ™NÕ%)ì™`€‹*vÎJ¾fA2Ä—ñZ³Ì\ˆê'öYî+ äk¶H•d–^ôÿ‚Ç:¥ª²é?/¶³†ô¥äÖ·²þ 3Y (JÀIZÐS;ê­ üƒë‹¤'¨™>ßZ“¸´Ô¿©Û®ËÒg)}öÖ†‡Y{Ø ¦œx‰HËbÞží‚p(‘  öNyر^ÀÖê,Óa×bÐËñ(Í —ÖÀ›9Ñ»%¤(Ä:Ö\ßí°lc ÿ½ˆJ,9ŽÒ6&tÌR“_¼ÃY}˜ ³Tl¸ú-óQ³XË©ÆÒÃHØ-+ylTn©è‡·E…å½hÊÍ~·n«|O±êǦ^vßaø»»à˜´íë–ÞÞþðÓõý RÙŸgŒ1Ø€=jj¨@1Zâ ^ª -×ßÁ:¦ö5L0Ÿë¨‘uuzo“4fI’^ØÛëÌÞz,»·E;_EOë}q¼µ | -¹ÑÙµ;¬‘Å[+liÈ ®î:½<Õýb3ÇÑaS3N`˜ía@í)µð=Œ€A¨Ž’Y$TøBa÷Þ~3Ï÷Õ XƒZoYЫÓÔXÒÓ¼m‹Í¶ »MÚ­H½¦4‹µ0Cp´p£©`jê½æƒÑymŸØÀAìCãsQ.ª¿¼r}G€¨áм®šv7ÓÓýœ´Þxðí1ëÙp¶¼ÍÔt=eøa›ÅÆLó™[˜ºˆÇ:‡´WøÒµ„›rQ¸)Èæäsú ïó¾™`£“¡QC*Û“#ä&½à C¬ÓÓa¹-ûfaÓµ‰ê*jVûvQ¿T‡”pÍ\rsž”k„–A ³á€8$æîLGj‰ ÈEóMÑëÀ‹âSÙ6îÕb_¸1Ò°¢|vçðîÇÛ÷×÷Þ8bÒ½ªi¦EM+`˜ ±¬ª /Ó|¨yõJa“:°‡»²-šÃC *;éùc—” ÙÕÍgöäÐ=0§F²>Ë)ʉ… W$:–2»à”C¬3:æ±l‡..Ö‹h¾.‹ª=Jú DÆ‚³tX# ˜…"²+6$Î಴óÌ¿ä4XÎØ´EšÔÚž3Žo¶ëbDÛ~7ЗΠÂè-:N°(~Χªîü<Â"¯‡Ÿ<$Ôzú03 šN÷$Tñ Óòî¹¾{ßµ¶<«EAmÖ¢KÔÜop|#ÊÆQ.]š6²9*e¸LöˆŠÙã?'&4 Ÿ6ÛbnÏ$·/µo -oó]ÞÒ°Û—QëØ}e^ó}»ŠªO‹z“—cÁ•A‚}p 2N6ObÉ;»;w çcén9ç Y¦SlLXP!u²:Õ"“Rù^r ñ­È'’CÁJqÁñ‡X§²Ã²û^7mÔ´§5m9?6J f¤Syž€k„‚¡QÂV¤Y6$Áf@ŠÑѦŠùT —þR€ü½(¶äv³iÀƒEZÚSKüôÙ%¿"³Ã’ˆõGÐbh*Ÿlò9‘G’Ç gÙÁ™IÙ®ÈÛßùbià2ì@u”œÞm–Ätçw;À:³Û )E[iá?*?¹†vô˜7Ç92˜ºIåy2<Ò1†A@†¬èð©•ì3d€Ý˜è«˜‘ŒVÇ*KLÃ"ÁÙô¶uß[?Žå¹8%Mí¥e–[ÃÝU•a7¥ ÝSNPˆû‘»G»Ë«TüvG꺦sW¦8R$4ÂR"¨ªÍ£rúÀm5wñµÃ¦¬0øO—<à5‘žŽÁŠK #“–Gˆ+Ä ÷ð[I åîáiu„ÂjL¦)Û„_Û*}°(šýv9veâµÞû4Õk±¿âAÇWt cß>Õ}ßàˆ¿ArÔoþ¤mߌž¥§&‡â»Û^_)œÚŽœËAÞžïžL~Ø¥äË,c’ ~6Ä:my–µ¼²*7ù:ÚQÅqìi3 ‚òy:¬†85æƒ"n—#Â3sêô3ººÊüÅ¥|ÐèØÎ7&T:¨±‡BþV^Ö_ÓÂ/èŒAUç€ãÊðœ"Óå{:Ñ7Â~ÂëT¹]Õ”ãÌê»zL°aá(¸/ó…cãƉAa£…ŸÄ‘å†ýÝŠ²¯…»™RÄOÖÆÐÓ¬‹'Û±ª/˜þ¶Õ®àCY¹{cg‹ÒMþÚ…ºáux«Š.²äÕ¼Þ—êoo¹M ?s±\({‰’_ æ`P/úó„3f`1;eÍX(!Gs[AG: ÃÕy:¬ -̦i,2¡‡$ÐŽ™ Ÿ°‹&õ± -†JzE® íP¬®ånàè”ýZ,Ê_Œêð}'Eubp˜ïîÞ~¸vÆU’äXM…:vlp\8ê8Ÿ>—µëê¹a«QÜßå‚×täx[ ì,§9¬ t)¼¯CT/ù`¡|ý’¿6~Ž]éÊ0|STËšzJÍÁª=KÉ!/zºï2ÇǺ] Ó1­a(¸y‡Ú5m¯ ÙrNÑj‹—ÏšøÔÍ[¡b¼.;¢EÉäâ×çÞÊí¯,C‰(´>q/B$¸É¼½¿úíáû‹ë‡ž—_‘(dä‹_~K.gÀö÷I¬¬Ñ—/ð#‰…µòru‘jëT)?²¼øñâ‡~Âà­ûtL~Z™X™Pª@€"8Í.smãLÁ+àíü*RFOºEIÀ¿›š¡ª¥gAUÑvåf‡ôæ*J…Åë½)Úróì1_ªåÒÖ3‚šm7˜ùîãÃíÍÏo®„™”lË–qº†qý<»e–ÅsÙâ€"!b«µtLýšèdV΋í²PÀ¦fi2yX8Ž´´‹f»Db`«»Mõôä¨ÅnnX +3U±$¸Þ®=êtQN§éªzïkGHÊÚ1Õî¾zƒ fÌé a2@7!è™WÛî}@ÃOÛeÁ_ý*eº£l»fü†ž³¢+ƒqAÅi‚hLç¼æ‚59Ë'`Þ›ªléŠßM½|%h]næÍfE?€H†^˜S76²eRÈ8…¼‹²ØteÑEU žë¬øpëL'‰×„òÓºbjiŠ×+f³ŠmWoè‰ í‘·;Cß+‡JjzàÚÚ¸—T 7Uí¼‹´¡ÊóhJ¡a.ªòÍÁ¾ÒsÛ2Aßܤ&Ôæ%B³L¥=MJ5BË €ÙH@ó:ÓQŠ[b +rÑbUöç:ð¢üTu-½šmKc +«g:ç€w?Þ¾¸¾ÿð†˜IzÕðL³†WÀ0b9U·@_näP1Šú•Ã&w`÷86UW¶û‡\÷5ÒóÇ.©Pi_7ŸØ“}÷ LœÙT첬‘¢œY8pUbâ4ÍÏ8åë„Žy,ס+€‹å,š.«²î’>‘±Å„à$=Öf¡‚ìJ Ià3¸<ë=3Â/VWbRƒ‹bMê\ÏÇWëe¹¢]¿øK2h„0z§ '8?çSÝô~a‘×ýÏ-3y¸² š¤{)TñÓòîQß}×u¶<ëYÉmÖ²OÔè78¾e“(—>MÙœ=ƒ2Ü(‘öˆŠ¹ã?'&4‰œ´ërêÎ$w/o +¯‹MÑñ0í˨u¤Ø}^‹m·ˆêO³fUTcÁU@‚½w 2N¶LâTövwê@ÎÇÒÍ|*A³"L§Ä˜° Bêeu¬E–¦Ú÷’+ˆoe1;j” +î,UgˆuÜ({,·ïMÛEmyZÛUÓC£LÁŒL–ž& Ç¡`h”°YžIpAtt©°>ˆÒ_¿—åšÝ®à#`1 xpHswj‰Ÿ>Sò 2;,‰ÄîC Oås"€ÝaB1å#ò(•q"E¾wfRu ööw¾X¸ 7PäÇw[$qŽÝéÝ°Nì¶ÇBJÑV:øªOÔÐŽ‹ö0GS·Yzš tHd†¡GP!ë=:|j•î2d€iLíª˜‘ŒÖÄ:OlÃ"%Å䶣ïG€ó\œ’§öR‡2‹Ö » +)DeØßUE¡;Å”bC? +zt›¢nAÀo÷¤.>wZ"EjO#%©Uuy4@¤ÜÖSŠ¨.e…ÁRò€×D®ðt Vœyêx„¸Â ª¥‡ßJ^¨ ‡§•…$Ô˜Ls¶ ¿Ö Tú`Q<ûí|ìÊÄk³õiª×bŃ¯øƶ{jv}ƒþÉQǼù“¶m;z–žÙŠï¬7x}¥$µ9—ƒ¼)<ß=šüˆsÉ–YÖ&gülˆuÜòz,gyU]­Še´áŠãÐÓæ@!åÓ$ôX#4 qÌDÜÎG„g!ç4Ùg„u„uû‹Zû:  'бoLèlPcµ„ÂþV^Ö_ÓÂ/øŒAUGÀaåx¤ˆÁtÅ–Oôm +awÂKªÜ-HÊqfHõ©SbX8*é G%|áØÒ83¨\´ð“Y4ìïVT»ŠPÑÍ”2~r6†žfY>¹~ˆS}¥Á¬ð·«v•ÊŠî,JWÅkjø†×þ­*¾ÈRÔÓrx_jw{‹6ýÌÙre 8ìA%:ý5‡€zÑŸ'œ0»ë„Ùy,gvÀB‘8šº +ò0Ò‰XY©OÐcP0`6Ëb•+3$wÌý<€)BØÌÇ*ªø»z€ ¡8]·šnà1HÎ~ç/V÷ø¾“¢{1æ»»·®ÉX JJ%VS¡ŽœTD”“窡® ;’þ. PÓQâm1°³‚çp6Чxð¼OP¿ƒ…ŠåKñÚú96•aø¦¬ç ÷”Ú½Uw,%û¼˜É¶Ï›n1LÇüµR„¡à–=jß´™½‚d«)G«5^>kãc7o•Žñºìˆ%—g¸>÷VîîÊ2”ˆÊ˜#÷"T1@ÚÜ…âÐâà¬Å_ß=$ý?¯ûÿ×endstream endobj -1275 0 obj << +1292 0 obj << /Type /Page -/Contents 1276 0 R -/Resources 1274 0 R +/Contents 1293 0 R +/Resources 1291 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1280 0 R +/Parent 1285 0 R >> endobj -1277 0 obj << -/D [1275 0 R /XYZ 85.0394 794.5015 null] +1294 0 obj << +/D [1292 0 R /XYZ 85.0394 794.5015 null] >> endobj -1278 0 obj << -/D [1275 0 R /XYZ 85.0394 625.316 null] +1295 0 obj << +/D [1292 0 R /XYZ 85.0394 625.316 null] >> endobj -1279 0 obj << -/D [1275 0 R /XYZ 85.0394 613.3608 null] +1296 0 obj << +/D [1292 0 R /XYZ 85.0394 613.3608 null] >> endobj -1274 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F39 895 0 R >> +1291 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F48 955 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1283 0 obj << +1299 0 obj << /Length 3798 /Filter /FlateDecode >> @@ -4843,1011 +4921,1009 @@ tc . ÐìËë:ß–s©î' 1¿%õŸ2ÅdŸª Í"DBÓÛè1û‹ð'¶<ÆûZ Ô‚ Û=«I ŒP'Øc;®kJ2Ã!ÿ9®k¨#º¡¨ìo¦uC= ÐÇ©·Päûº¦™õÖÕ¥ÿ÷èÚpC]olÖ5ëÀ‰ÞFéZ„?±å1Þ×êšÂßð˜çÞB`cŒí¸®qPM—˜ºÖ:¢k )6Û"k9UGY½¨7Y>þ±¡L! JÅq6Z¨ >zJ§43’›>#¡ Å>€ñs&ÃÏ8t¸…™Ð*€‘£‡/àù”}-ÂŒ×_Í÷•+N†Ë©†^ól»-éò_‹þ-¼caú›”šXè^¼†àÇyû3¢ ƒÐ,+Œö0õ#欉Nø¥òõ˜m³|nr ZãûÀ†nŽm²¿Ì®é—0õìo0誄®Íé•Î×}3Všì.ÜÞx’ÍþZÎ…Ÿ<ÀÚ}–—+ükøxUeËp5cé‚&©ºÆÕR´?Ld…?_]þØ}ªíiê¾#\¡iØHÑþÞ ÞŠ5^˜.„žLgáyuKO¿5x~ørCƒ'»C÷n~À£ %óô =ï*ì“ã(p £Cç/,µ_yþë©ßLA–leçüãv–q?oÃÌ!6¬aʶåìkµ°¿“®þMûðj«±l†M†uñ¼*ד?çëuûrüñl±|/–ƒ 4Õo,ÖU¸g‡~ª¯ Íâ¡ ãmOþ/ÿŒÿ´eÊ9y8i§Td -åcø8 -p&±÷4fýÿK€ä?endstream +åcä8 +p&±÷4fýÿKØäAendstream endobj -1282 0 obj << +1298 0 obj << /Type /Page -/Contents 1283 0 R -/Resources 1281 0 R +/Contents 1299 0 R +/Resources 1297 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1280 0 R -/Annots [ 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R ] +/Parent 1285 0 R +/Annots [ 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R ] >> endobj -1285 0 obj << +1301 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [154.2681 743.8714 203.5396 755.9311] /Subtype /Link /A << /S /GoTo /D (notify) >> >> endobj -1286 0 obj << +1302 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.6033 237.2629 144.294 246.4782] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1287 0 obj << +1303 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [265.4578 191.3384 326.6578 203.3981] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1288 0 obj << +1304 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.5441 191.3384 416.2908 203.3981] /Subtype /Link /A << /S /GoTo /D (incremental_zone_transfers) >> >> endobj -1289 0 obj << +1305 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [280.9692 160.0192 342.1692 172.0789] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1290 0 obj << +1306 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [277.6219 128.7 338.8219 140.7596] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1284 0 obj << -/D [1282 0 R /XYZ 56.6929 794.5015 null] +1300 0 obj << +/D [1298 0 R /XYZ 56.6929 794.5015 null] >> endobj -1281 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F62 1060 0 R /F39 895 0 R /F14 737 0 R >> -/XObject << /Im2 1049 0 R >> +1297 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F48 955 0 R /F62 1065 0 R /F39 900 0 R /F14 741 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1294 0 obj << -/Length 3853 -/Filter /FlateDecode ->> -stream -xÚ¥Ërã6òî¯ðm媈!‚£3ñd'µ™ÌÎ8•­Jr %ÈâE*"ióõÛ/€¤L{vkíFh4ú ©ËþÕen£ØÉeV$‘•½Ü.âË{ûáB ÎÚ#­§XßÝ^|ûÖd—ET¤:½¼ÝMÖÊ£8ÏÕåíö·Õ›¿_¸½ùxµÖ6^¥ÑÕÚ¦ñê»wï¿gHÁŸ7?¿ûî‡_>^_eÉêöÝÏïüñæíÍÇ›÷on®Ö*· -ækYá… oßýã†[?|¼þé§ëWÜþxqsÎ2=¯Š äÏ‹ßþˆ/·pì/âȹ½|„N©¢Ð—‡‹ÄšÈ&ÆxH}ñéâŸaÁÉ(M]â_bóÈê$½\r¢s³Ìå8Š-pm%*Š3£—µZâ²ÇB.—ÛmÕWmSÖëÝ©=¬Ë¡ßÃŒ8Ú”›½;g‹Î³(Ö±¾œîýŒÂ€µ@¢™¨ űJç4Þî]ç®Ö@ûª="Ew6mÓŸ®T¾jk˜U¿´;·/ªö$“vü-ùÂÛSÕ—}õ@º!­F+ÖòÆ;=8X$Ññêqïl)X¦{t§ª¹ç?è¸ÎcU›=7'#yd[ö%ð8Iͪ=[=^íÚºnÃêoÞ_ÿtã÷ݱ±'’õä{ÆÀÛì˪颀Âc Æú•60J¯îÚ~Ï-â |{á¯Rþ¼$æ:ît®ì×ÿöm’O.Neq¤MŒŽ»=?i~» -°œßcó…Á¢[·+‡º˜’½á°Ü`ÂËO ©„¼;G\bl¼¢V¦íX02>¬åž élÎÀ©0¬uRÐý0C‘Æ’µ.·Íïq¬ï‡°!ŽW 0†ÆéPbñÁ3}s62•iÎŒ„@žÞñX?1ü±ªe;7 -,Žu]…Rˆß|5tÄ7ɾù…p”{˜+ "+:mdñéü\0Ù °¼‰µ«w úö £]Õ¥O«:¡µ[:ÏÐl]WÊ»ÚGMlVÝ€êfcUÒL#š„: 0ðÒ¯oãN‚Ó>ð9'ÇOººF6@‚ˆ ÏMûØÌ=É(¸Šáí„"ƒú$Ë3 ¦í¹Q…922* IŒØ3|r}¦‰írf(ˆÑ©ƒ –Wf¡p¦#“s˜M»$ I¤HXe[uèu:Þ@l¬>šãlà¦>¸ŽaÁ¾!… ¹p‚N­«feÄ™­€±¢)¹bCžF©^`Û–1^©Ä„qÔqÇûë%Ûããmc&ñ tÆxÐ ½kHR°GdccèÂ8~çÁ6Ø%·æ³ãøIô¢–½(By¢™a–Y=TîqãNÎ~Ý÷îpìñ„Ú²Q×)®Ø»Cz.*N¢Ì˜×…ÂDyìËc…ò.«—àHeãÛT»'×…] ééÉm†SÇ,²¸)ä€Üû\oyS³qK¾u€!›0 ºoÚ ÌÑ£™—…ãöX±VبÛ{ˆ?,O Ç -Ð9€õ+ïÝbâñé5n$y”«ÔgË 'Dºú…ÛPY¤RåÍc¹h²æØXO56ñZ fY¢%¶žŒÌvë©ñ˱^&¢— ȬšœT¤6*²|ÎFÖW“"ëÚÏÃuÈB˜†ò‚P–lqÄŠƒˆÉ9 €1.B çH©×_,[€QLMzJ© U²úÐ &RÐ’#$bLSSxý%¥ZRCŽ]DÒ(L#íi¼ó<”öIÍ ¿%B–ÄèûÝà–¬g¶ägØñ4åA­âÝ&6|âM¼ý$[}ª ‰;Ãô§E¢5ó#ÅcÊ LyÁ:œ NJ© Öò,s ù_j…‚dLa°ÍvÚxkbEJJ\°E܇ï$ôbÀœâdN±€Èn<·©Fé(/ ýªQ5/Õu˜?»½=Å‚6‡Cº!?Ç)(&“3|È:Ë-†…©’¸#U -Ÿ}tÇ–½J.‰WáÓx€„jÏì÷Œðñæí/Ÿn¾Ά&î}^–‹ÚBã’-kžf¹ÜÃAÌLÇ…ÍïÇ´0ðž¬ÒÔÞÉÆñÏa´¶jµ§3‹òÌa¬õI°“ѳڳx!a²Ø~¥ -<Åz¹ -°8³è7ûõ¡<Ýv) PÁ©ò¬ÖÇQš'Åët¬Bæ鈅4âš%ïvKÕE,.¦¯Ö!(ŒÎÆœÓä”ZgÍÙØlõîÃC"çä¤<4Ëä lsf`¡ÑŠçèŒÄ¤¬y^Ì…¯®:´±BcÇ2nb-þÁ~h²E‰'Å(RŽ `Á2°Ì–&«›ìKÀäT1!®ã°…» fsÝWOhÎn¨—, jF{§k‡›€äU3|áf÷àÐQE)eõèc{úÌ-ÖNò©ÏŸÏîÔ¸šÛ¨>‚-¾Z¤Ò] áÖí›2Ü6 ×Rë;Þ¼(Îháë³#ØãÎt'y‘‹¤¤ª6wäRôXY•%J¤çuíæ3%õV‹wÊ¢F“Æ«rÄ!ËçäÙ].ÂËGš‘,uÜÄàî¾!q†çaiæ%Zäcp¨¬j€ÖDŸ -öú–i&94Øg^ˆrd‹5Û‹uG½‹ÏVÇátlý:çÕ\åsêM;œ qؾhñ@Š"È¿bñ¦X/[¼€…›W_ØͳSÜV;ì€8pÏ Ÿ‚g¯“°è™™* (‰õœž_ƒ3ŸY>] /6_{VI -’(z8±™Ø°T!*`Ý–QX*!"¤qÜÇHŽïÖÊÍH‡ÔZ–`ÕÁÁI 𪗅 Aì`å‰Ö ¯Ž#NúS_5swATmžŒÐ‘˜ðt†*%&Û0fß0­—øðXm)ŒÍŠ#ÿŽð°bbyFÍx¶’ÈDЛ¿È -@îÐRÞmðÎÝpðžãù>‰·/\ÚHÒ‚Þ -ƒ«PôƒJª kÐ/éºQÒ;l½Ã—4ׯt¸`-…ʵë¹`ͨ)ôšÛb£éypòÜiõ¸õ\—i[ÊägH\ $™eD²9 jÈÁI! |&|NýËq*Ä&ŠóLñy–ÐP Â]Õpd2NWDüi…àH%°ðì_ă“¼/`†ÝÆZQ±p&-o>_ -ïèîplOå©ò%'T± A.:²„M§ì[ÿH'ú@E(¾W)0=ãµ/gõÑB2=×õ¯ gž¹È#ȳ}¹X*ÄE&Ae·°Ÿµ‘Õ6 >¤Ï6&2EšN\þB¥Bùçv‘ ÁCé8< -‘E.2ÿÌQ±}öÒŸMêÃЩ݃«¥-¿}Á¦„ëωZãc¢†ÞüòÿgÆfQži!Ú_¾ˆs“iò]²ØdžE”©pC/ó[G…Ný†þ©nÎnå©M¾Æn;}cðoþcIàˆY Õ$•Rh ŠWïúyI´eöÈ©Eä4/FÒ*V‘ -_¤§X/GÒ‹˜»Vë‘u³À91Qšçù뻬…íçOry”f±šï/Å 0<¡”jùé„c ù]´žÚqöòã Åg8Ö¾Ggéfrœª¦!s vn|â;ËðjG‚ÚÊ»-¾é$j®綉r_ ¾7{°Õô‹B-WHð‡“6Mþ‹Éø,¿`}"£ÂCV[·Ë¶'³úì9 -Èä*X–ÉSQ–y–gÞždøwªJ?a8Ü_ ÝÎÇŒÛt¿¸0¿!š> +stream +xÚ¥Ërã6òî¯ðm媈!‚£3ñ$ÞÚLfgœÊV%9Pdq‡"‘´â|ýö )ÓN¥Ö>h4€F£ßPtÂt™ Ôy|æq`ÂÈ\—‡«ðúƾ»ŠgíÖS¬o®¾~¯Óë<È•\?ì&keA˜eÑõÃö—Õ»ïo?>Ü}ºY+®’àfm’põÍý‡o’óçÝÞß÷Ó§Û›4^=ÜÿøÁŸîÞß}ºûðîîfe&‚ùJVxeÂûûÝqë»O·?üpûéæ·‡^Ý=ø³LÏ…òûÕ/¿…×[8ö?¯Â@癹>C' ¢Ë2Þ C§i{nT~ŽŒL…Šhö Ÿmߣi¢C»ƒ\xq +bT¢Æ FA€å•Y$œª@gÀfEÓ.IB¨òFÙVzŽ7[«q&ÂÅ8k¸©/#®e˜·oHaC.œ SëªXq`f+`@¬hBn†Ø%!/°m˯TbÂ8Hê¸ãüõÜöÄù,ÞÖzBg 5’ÑÛ†D{D76†Îãwlƒa²k><‰£D7jØ"”'êyäágéÕSeÏ“wrøÛ¾·‡cGT†­ºJ8r%ÀÞüÐK¡ˆÂ8Hµ~[*0 óæ\¡ÀËêxRÙðhËj÷,òº° 45=Ùr8uñÁ"‹›B˜ÂÅÏË‚˜[òµÌKÙ„ÕcÓzd>ˆ"eȼô"ÕLj¹ÂFÝ> +Dbqj8X€ÎÌ_ñh…éó[܈³ ‹—,'œêªWn#Jƒ(‰œ},J'kŽÕTec§†Ð`–ÅJ‚ëÉÈl·^·+f,Š ‚̺ÉYEb‚<½ÐDVX ëÚ/ÃuÈ@œ†ò‚P–lqÈŠƒˆÉI €10B 'I‰S`,[€ULtzJ¹ U²úÐ è'RÔì³#$bLŽSxý%¥ZRC^DÒ(NCíiÀó2–vYÍ ¿eB†ÄèúÝ°,aœÛ’§a×Óñ)žÈHò@ÍZ¨BÕ{²t"@àQ|ß7@ ™%k¢c+œ ëd?çÓ6Rwïþ„¦£ýƒ[tp\±yžP·]b:Zo4‹:#ó­U8 @°ç9vÐ901pŽçÂG!äCïìéTÔ?4"+£,-­me[ŸÌ`‡$fŠ;ÝñŠ”à-J²J ÞŒÂnÅ«4=÷iç8±áRhâ% ìÇéêsiܦS9%"­˜ &S^`Ê †@ØaepRÅrNäHešË!ÀåH9³Ç-ô̰褺âT¤O)È(/ÓW°vNÈCçP0Ž’}(i¹ð¾ªàèx%šwºÂ‘hV!ÀÊÕзCÉ›{­<·§/ŒÎâÎÙ9ŽüùbO­âVŒ-¥FãK}´µÅªDÑË`ìLÅAˆp,Õ]¬Òð‰Ñ"?¼ûèlvÓp …’ˆ<;B¦¿cdN„ÈOœÀkî$áÈÅóQ'3ÊÒ©l†ÐvæB´È ¶º¶ü‚™LÏ]©§jÊûH®– ÏxIT{‹3ã·0ãCo¹=+zÙÃ1+™‚1ÝcÓòÕè!çæŽO!Wüæ1¡5…ŒïÛ³}â¸ò«%o’§Akd£ Þ.z ‡7/EP<„æ«j^à]p71îfÖƒHQœEº: +1!Ëìªncé–…{Œ!(Ûá©ÉöU“ª xOó4Û¤N±^7© ^ýÁq{ÝmµÃˆŸ?ó²F°S¬Âômr<Ö=3[Å¡šÓó³f¦Uåèìõ_½ÜĹöi½Í˜TÂP}ö°n +Y U)ÒØ3÷1T¤;B(Åy#Ò¡s KˆÊšé³«^&1¯IÅJ]TñáÃrHÂe…ÄælEbˆ#0yÐÉ(‘猫ÔãÈtñÍ3à S #x«y +.a\N(αºÉ±xHF@‡XÔ…Å˵v˹žOIµ×ùˆÆZf!ã:rä=!eQ—C]ôÎP~õƒ>³#_bÌA{IÖ̤†uôYs,åì™ eÝ>>ò›š”cW"Œ ±ñÿ ŠÍÕ1è¸;Á¶„’±q^e\!ÆÒæÑÊe!ld}ºœCÕ÷Žr„ðÝBºÒ±Ÿ´ÅAöA‘èxbÑ-G›Î¨]ˆÄ¼@7‰Eþ F(‹þe{/Wõ‚¦&‚ÖI·åïF†Ùáàç;°¼}_•ŒFÏRLiÿ<‡:ål-j†pfo@šÖKŒ8W[ÊPCMO9øeᄆ¼Ñ¡¼Ô‡z<[!~Q¯Þ}üIVhr°‡–2ChC$Ð !kaŸØ®žÄINAb(û^'£ëÜKEì‡+6¼âa‡’âàHùVâ(Ç<ֶ犃ѣªÐ‹ l‹¦çÁÉ“ªQãÖse¦m©V0C⚧'I/+%"ÑY°1¸íf_Wýi9ÜcÅ™ì4frDØT )ÝÄqEAÄ_o¸ ÒE—ÂÞñÕÝ[8É,=¦ßm,Gå gRò.â22ÿVoÇöTœ*WÕB+É +r]“%l:eߺ‡À1öp÷ꢎK^»ŠY,X󇿿Œ.\sžÉ»ÔHŠÐy*Ál·°Ÿ1Q&ñJ¤/Ö:Ðy’L|þB1b•ºœ‹}äBô*ôOd’óÔ=¥§TÏŸýš ” ¡SCtZK[~^ƒÍ1Q¸ j– +zóËÿÛŒMƒ,UB´»|÷ØküËô¾`±» ó ü ½Îoä*qºçÀ9»£ KLüWì6Óg ÷»‚±èpÄŒ‰ªž“û¾ŸGÎ-³GN-* ¿Òy5”†“*é·#é Òë´C"ŽÁ–ÕzäÛ,lŽudYöæÖéåÞó¿,HÒ0šm.É3˜_hJ”ü0#3 ùÕ ´žÛqöòÓŽˆp¬]ÒÍžû"2¯ð{ç-Üø€ÍSHùº” ¶ò*ŒFqtñqa•òãîrVš~9ñbõ•i’¿W~Y°;Žü+Öki$þÖÀ¨‹·. “+li*ïPiêXž:K’âKß©*Ü„á°!¾@»#ŽÉ¶é~qa®ãš¼„¬#°•¡_vØ5Ò¯B^žOÅ` ýÃÞŒ³Ø°Nî:œÚÝeÖ+zç5tá÷w`cCÈŒÞ|»a`”àµß·jHõ¢"…~‰ÿû·¯ãƒã4ÐY¦–UR‡Ý±wD!áF_Rn@Þ ø¡ÒÿªZÁªendstream endobj -1293 0 obj << +1309 0 obj << /Type /Page -/Contents 1294 0 R -/Resources 1292 0 R +/Contents 1310 0 R +/Resources 1308 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1280 0 R +/Parent 1285 0 R >> endobj -1295 0 obj << -/D [1293 0 R /XYZ 85.0394 794.5015 null] +1311 0 obj << +/D [1309 0 R /XYZ 85.0394 794.5015 null] >> endobj -1292 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R >> +1308 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F48 955 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1298 0 obj << +1314 0 obj << /Length 3366 /Filter /FlateDecode >> stream -xÚÅZÝsÛ6÷_áGy&B‰/|t§çN㤶{×™¶ŒDٜȤ*RqÜ¿þv± Š” )¹væâ™\,°‹ÅûJž'ð'Ïm*Ò\åçYn„M¤=Ÿ=%çÐ÷Ùdži`š¹¾¿?ûî­ÎÎs‘§*=¿_ ær"qNžßÏ›¤B‰ ˜!™¼~óöú‡_n//23¹¿~s1U6™¼½þéŠZ?Ü^¾{wy{1•ÎÊÉë]~¸¿º¥®”çøþúæ Qrz˜ôöêíÕíÕÍë«‹?î<»ºï×2\¯L4.äϳßþHÎç°ìÏ¡sgÏŸá%2ÏÕùÓ™±ZX£u ,ÏîÎ~î'ôú¡1ûë„U&=Ÿj#È[YŠLJ`Êl.R­toe%cV\håyݶålZÖÅÇe¹»f©á29ßsEäë|©¬pV«±W$yªœš¼¹¹»»zMív³Z5ëŽ^ªUÛYTF˜l’ø‰êâ©œ3ÛP¬NDž܈ à`’tòK½,Û–%•,¥kh¸qƒá©Ö暇¿”mD„ÌD®Uñ*¢«:ËO)ª…K”a®åcñ¹d ~V ~²Æó&pÔM‡SP”ª©”"·Vù¹¶¶„“‘½Ü?–Ô˜—‹b³d–ªB0·KÓ¯°„ë½{ˆ©™L2‰<ç×8®œ?Ëj^tUSïAZ§"WàˆŽªÐsEt-×€•XïH‰i­³ÒØhåßã¨ÑéW€eÕ6““›¦+#S°T–`íø™ÓLØ~âbÙ6¤l]–ó–š“>òýâŽ}Ü"È œSƤ<‚p%Fé * -B<~d–‹ é&‹rÖUŸKX³–߆`•Cx1ÿ€Ó £€;ŽßÓaø¦ÁÖ³Y¹ê¦å—Uµ¦Í!FªÌ¹£:ôLûJŒV›J¡R€íP‹K/wTN¼htÐɤ­ê¢Û­%¦çDz¦ÞÏåºZ¼TõulÁ/w"`!TûÍÃÞ~óð%ºyBˆ4MÒ±g«›Ø2C6'we×yÅÝcÕR«YÑyôT†ÛïJ@>ˆ°,½+ŽV0s–$ú´g7ήϛe]®9ê Ä’iVËâ…Þ‹®+fŸÚÃÔRhÈN€pÀu… üsS®_–Íîà<©uùqÁ)"x´G‰©IÔXòݪœ€`ý&AXuå^tN:4{ zûØl–sêðni]±îÊy?KÌÍ*N1OäéÓ. .ÃOŒØÕB\/b®Ö “¦zCCîL âµíýŒG#(‹Qœ–†˜r@à[ì¸Ïê÷$QåüUÀsY÷-jƒÙ¡ÁÈ3²»ìÊõSU{;¡}Ù™`ÅGµ¬gLi;,£‰gEW>4 3bH¢œîÝ:ªVE½/˜;à ñ„÷µÒbAê(ò‡\‡‘ßs¡ÄÙc9û4E0´{nWBgÔ á=WDú8†¬6z,þÞ»%mòÞ-iÞ1¤mZï„Ùc …w¨[W³Ž{¼C…®Ùc±.f¤SˆzQϩѾÔ]ñ…zqcý rÝ‹7OÔ†²iS3,!¨+cÆîø©hI¤N'Ð%…ˆÅ~×pDj°ú«¦n‘f%Ä÷9QžÔ<Ñ­uÙ=7ëO¾ºs!Ž¤Ã8’B¾åaF -ÌfŸiÎÑ)ålömt°6mñ€ðÎÀ“6øLMÞÂûØÎ(lSËeD‘ éGH«þjjŸ¸gá0eƒˆÔ*m*ÊØà²EµŒ?+L.‰¡†¹ãª+8myXÛ%¹XJf!#JÝ?¨ùs±®c‚À#ÑÜ )êö¹\· ¾NMnÕ}cð OÚ‚gä·<í›D«K…Ÿ yøšqså¾€N ¦“;⢙éH™[ÿ™R³ŽnE¥]ž Ýã9LšsM°äsP_KÇ®…§ -Œâ&Uª' oN /ˇbI´Ç¦íø€c÷HB€y¹ž‚O÷€''kÃËÀÚÀwûö5‘aŸxd͌ܥ'NIÊ“?5ój:>–ŠÍŠánªhhH ؉˜5ÛdÇ»ïÖ=P7ã->«Õ’œGfÈßfš½šçÚ»9 ׈Ô=/_Q×%ü# -y] ½û• UvI˜R¤NN®;â⪠nÕЬ†ñjø­*,ü¶ÊlP›Ä§ÖNnßÐÕþwI$àáys÷Šwï/¹õîWnÐ&bßí…µ“ÓËþz´³~=~Œ_ÊR\Ï…œÐ’ðÝ羧µŠøé÷xÃgöDñG†© ÓCƒ7›hjUõ¼Âìe˜‹Ž;“g-†¡Öiy‚eÓ|Ú¬XÂbĽ¡¯ÙÑ%‚uæÇ‚·žsºVq~w}3½|óæV\Þ~¸È•‡š'HwIþ¤s×õÍ=ú¥ƒ •Ñ)ä¹'ò©Óát*0mÏÛÓ—½:"‡3 Åæ1©g_긊0àû@‘¡Ø×(×®%„ÕÁÓ!Äç9D€–źåÍqÑOÄä‚×øu>çŒÆã_æánB#€æ \÷·%ãTÙ&"ß^j~u¨iïýR)>B¦Ýnv¶jÚ¶êËÎÏÅrS2º‚ODnH'Lgr(çÈÀÀ„"O!vÙLÿ!.Xk‘*s¢ör†lϵÅìsµœÏŠõþÝ‹J…¢ñ¨øÀ?2¾H#ùT(m¶7Ð4*”f eÆ`‡&ÅvhÔM=¥â·x ðz¶Î91 Nš”%.ŽçrÔä"sP¸ŽÕÏ ìŠ®0Ž=ûÃ6D²åsñ¾¿å×ÀB>8tFàÝ«ºÇݦw芗ÏM ”å>(©pÆ¡1\1QžŠnöHÕªW jÕª{|"è˜1ˆ™hCÎ?Ç„-Á«#X—iðZô—“¸´<ßCÐéÓæ~†’¶^^¤¡Jg"ÍÔñ;K#r£óq -SE½±ò¼Ç -4=V°og¯¡k„•b*‘J»“hÑ}JÛnØ©ô@·¦>||áˆ@Z¨Oßב㸶Ƿª»òv÷eÿüByžØãòSDþøü&B¹TøP®Á¶U :\gÈxšbN4Dµ¶Zz¯zK]þÜÃ3@û„p×ØKÇv” ‰ P}„ƒ'Ÿ Ù'kt„H]êÆ0ßK£ð&vø´V|ñ/‡‘ŽÞKjR•/}òKPÄ‘ÑÙ)+ÖAql=,7%Ø“¢üRµ<” ­±&Á⦣û¼Ýܪ?ˆ`ª-]Jær› Ûܨû &p4õò…º«zÊ{ -äa-…ö> úüVyÿ =h±Eßlºi³è§ÉÓD–°icbp"¥ÞgN½D?ë¾ÓpþË•8 ü$˜¶J"'xM£’ÈÞa'¯ºÃrø±\6ÏDíš3.ˆÀ‹ƒÖÖ(‰z¶FÁ£xØæNäRçcØé6Ùú#‘¿“„’RÖ3.ûãíCv4òû÷ yúËÔøI -ãäW8ù“¦ Z™©üë°gí¹†ÉütæË“½ÏªJ˜–pT~ÏQ`ìZ3a²ÜŒ5ˆ^¸çª$¤‹ï¿33Úf£kw8ü îÑ„Ç+:>§sÊçÕg¯ýɶì?Ò¸§`¯ì쨌p\ûùõÍ廫;¾ÍÁϿκø¡> E ¥E–*ýmuÄ!P%VXrT®#  -\Û kן¢ê¸üÀ‘Á”+pSÚ¸oì¢B*u ©4R€T¦¤€H÷qn )¶@й+ 2®únÂJlˆ¼‡++wóöÿ3®dª„KsWC®Ã¸ê¹¸‚bþ½/9NÈD©ãâ{®ˆüñ—-ñb¤Àh×M:YQBH…‡ÉFYŸá¤ }E}|O­ª›Þ1¬Ç“9ÈÙç@”†â¨ÛæhÐÑ)”rÒ}Kmqx'¡˜Ís}j'\Gv2pù|­\7Óº™¶M1íºå~B¯„5VW çŠh0ÞË ÂIšUཔ!í6PÜ@éçw¨Å¦{ÄZ²À_¥ ?0<ôor÷;’üÅ_%¼¿$Bø&ê©ä<í‘'¼¿ÿ‰(>’áãpÊê­ÈU&eõÃßà*Â…zµûñ8,‰³¦q³û+‰¿è†µùölGAŠ¥¬û'pçr¡´}ÏÂaÊ!©U,Ú8Å“ .kQTËXð³Âärj˜;®º‚Ó–gµ]B‹%fò¢Ôýƒš?ë:&<²Qͽ¢nŸËuËàK¡:ÎíŽOƒ}Ò<#¿ÅàáhŸØ$Zc*(ÿ\ÈÆ׌Ә+÷e|pZ0ÜÍOG°ÔÜúGÈ”šut+r•y6tç0iÎ5ÁÂÏ"Š= ÊNØÄM6þªTOÞš@^–Å’hMÛñùÆï þ„øò$ò< +îGNƆ‡±ïöík"Ã6ñÈš¹KOœ’,”'jæÕt|*[£Ý8RÑ4Р±j22ÉŽoß­} vÆ› .~V«%¹ŽÌ·Í4û 4ϵwr@ Ž© ú½|E]—ð(äsôîW"0PÙ!aB‘:9¹îˆ‹+/¸UC³Æ«á7>¨<2TðÚ*³A9lŸY;¹}C×_øß%‘|x‡ß›»WÔ¸{É­w¿rƒöûn/¬ü›ö×£õëñcüzT–âz.ä„–„Ï>ó=­UÄK¸Ç[>³'šˆÏ˜62JM˜¼qØDÛP«ªçæ.óÀ\tÜ~yÖb(*–'X6ͧ͊%,F¼álÑzš]"Pg~,zë9'kgw×7ÓË7onÅå퇋\y¨yò‡t—ä:w]ßÜ£W:˜Ne ÷s4rN§z®í‘{ú²WHäÂYÈyŽ +LÁãB€û]F’_£d´€”VŸLGÇø!À´,Ö-h†Œ‹~"&ôsýçsÎjü)y¸¥ÐÃ( 9 ×ý½É8]¶‰È·×›_.AÚ{¿TŠ‘P‰i·›¡­š¶­úÒós±Ü”Œ±àØ#ÑR +ÓßžÊ;2A00¡ŸˆÄTˆ_6ÓÿC˜‹ÁVgNäRGí€é0hÓ³ÏÕr>+Öû÷/*ªÆc²Ͼ쑽´„íÒP8J›í½´ +¥}@™1Ì¡I¡uSO©´ó(¼˜­sN Ã’&e‰‹cã¹5¹È”­#Lõs»bl+ŒcOàþ° ‘lù\¼€ïoù1°Ð:ðìU ÝÆ#nÓ;tÅˇßM å>(©pº¡1\1QžŠnöHµªW *Õª{|"è˜1›ˆ™hCÎ_É„ +-Á‹#XiðXô”¸´<ß–BÐé“æ~†’¶þ$¡Jg"ÍÔñ{K#r£óqú SE½±ò¼Ç +4=V°og¯¡k„•`*‘J»“hÑ}BÛnØôƒ L}øàJ˜0w'^i ¹ŽÝÀµ=»UÝ•°»/û‡ŠóÄ—˜"òÇÇ7Ê¥z¬À‡r ¶õ¨JÐÕzù%(âÈèì”ë 8¶–›’FìɈNQ~©ZJÖX’`mÓÑmÞîiî"X‡*K—’¹\ÆæÂ6·ê~‚ M½|¡îªžòžyXJᄽς>¿UÞCZlä7›nÚ,úi²Á4‘ôpÓÆB4DßDJ3¼Íœz‰~Ö}§áüÛ+;pøZ07l•DNð’F%‘½ÃN^?t‡åñc¹lž‰Ú5+f\­­Q90 +ôl‚Fñ°Å×lRçû¹rH_‚?"ùI(Ø e=㊱?.Ð>dG# C±ϧßN¯¤0N~…“?ùr +¢5ÞŸÈä‡\‡=kÏ5Ìä§3_žì½ZUÂä°„£ò{®ˆcך “åf¬Aôº=V%!QŒxÿ™ÑÐ6]ºÃùã¯l¸Ef¯è@øì›Î)ŸWŸ·ö'Û²ÿHãž‚½²³£Âqí ä×7—ï®îø._;ëôå¡^E ¥E–*ýmÄPÉ\ ¥Ü‰D{ÈuT=×vÃÚõ磨:.?0EäG0¥Ç +À”6î[ »(‡JC*ͤ€ •é) ÒuœC +†m#tîã +ˆŒ«¾›p…"ïáÊÊݼýÿ+(&re³¸pÁUàà +Ê\Lø÷Þã8!¥Ž‹ï¹"òÇïq´HÄ‹‘ÿ¡]7édE !&e}†“‚öõñ=´BªnzÿÄ°Oæ dŸQfŠ  nw˜£AG§PÊI÷-µÅá„Âüê‰o"†\Gv2pù|­\7Óº™¶M1íºå~B¯„5VW çŠh0ÞË ÂIšUཔ!í6PÜ@éçw¨Å¦{ÄZ²À/S„¯ú'¹û– IþŒâ7 ï/‰Þˆz*9d{ä ïï"ŠO§dxµœ²z ðË䱬~ø•®"ܧW»¯ŽÃ’8kjñ«›Ýo$þ¢ÖæÛ³)–²îŸÀ]– •¥'Ó€éÈ—‘ÌÝtVÌ÷ƒ“MDf!I9¦CÏ´¯Äø•™> endobj -1299 0 obj << -/D [1297 0 R /XYZ 56.6929 794.5015 null] +1315 0 obj << +/D [1313 0 R /XYZ 56.6929 794.5015 null] >> endobj -1296 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R >> +1312 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1302 0 obj << +1318 0 obj << /Length 3178 /Filter /FlateDecode >> stream -xÚ¥ZÝsÛ8Ï_á·Ufj­ø¥Çn›ö²½íöœtnvv÷A¶e[YÊZrr¹¿þ¤%YNæî¦Ó’AºbÁ1KM©LÏ’L‡&f¶Ú_E³-Œ}¾Ì3wLó>×O÷W?~RÉ, ³XƳûMo­4ŒÒTÌî׿þöþÛýÍâz.MÄáõÜÄQðÓí×Dɨùðë×O·Ÿ¿/Þ_':¸¿ýõ+‘7Ÿn7_?Ü\ÏEjÌ—¼Â… Ÿnÿ~C½Ï‹÷¿üò~qýçýÏW7÷þ,ýóŠHáAþºúýÏh¶†cÿ|…*KÍì>¢Pd™œí¯´Q¡ÑJ9Juuwõ¿`oÔNÒŸ6ih¤Žgs¥Ã4†5&µ…‘­Í“…±’ÊkYŠ)-;.ÔòñqwÅ|µ+Vó‡öa|l›0±˜õ×>“ÀsMˆ z"ˆ$ -“,ÉðÏ]Qƒîe®EÛ¢.yWÖ[ ª(èv /w·Ÿ["nšªjž‰†r¢~ÿö‘.ö¦¿à_Ç¢íx­fÀß«#ñùßM]¼Ã!X• :fó8 -ÁˆÀŒ…3c¤•š¤ÊLðåî vtðG©|KĦ¦Ös}üz÷åæ7b\,x°¡v]tÅa_Ö —7·l©÷P¼ÐP»kŽÕšˆK^ùØku뱋‘V}¡=R4<Ë=í¤Ìé *­ÜÖ )iÍ€•½òà3?}ÄAÝtDõâbÁK.›nG½ç’zq×ë©9vL%(9¤ÞýŽwX›üXñ. +œkdñÎ(#)á¸xÊ—Â1 lR‡™V)ó„g~ÏΕD:Ô—üôä=®W<ÐqY;:¼Ì»ÕãüPlE»;s@ø ._ÀsMH08¬1¡HpEÁ,LR¢ )€AºË 5  ¢î±ƒ~B|ÇÖú ï?|£ÚŽ}ÿÈpÀC Ú·›¼¬à.c!ƒO`W–F¸ŽsR"¬šý#@À²¬ÊîåZ€[ª$¶"X§Ôp’8ÚñÉ$`¥i“P¡qüßZÄh•yªBƒ¶UšÔŒaŒð„œ(ŠðlÏùaÚ9ßüOÆa)ç¨Í(TÃI¨ó5©52 ¯iÁr¬òšÈKžBî{uÈB—f¿s®há-SÛpÿ¹\4ºÊWNˆ†wÈY¦â™g‡§âÐâE­ë㊅«9ä$†ÈÕf(¤70XuTeýÐR×J­² ø€`WD­ó}A=ÞÃw’·QI ÐÉ«¶¡Þ’'€B®E°î­nÙ ZP÷dŒ8é…vç]xÒ.çmÖ<Ý¢vvùS1… ë’ô±B>™ùjU´-õ­ 2eïÂmG-:Ô¤Žƒå±#†çÒ:šŸ’UÓq&@ᶠ_ò:à îŽç]¹ÚQ—‚Œq×å=ж  “aÍCÙg?1?¡¾AUcv«ìáòyÝ>ûåkn;žhmø"‚Cöþg²×¼ÏuÁ=ꉜv}†ÜR„&Ùë{®‰ xa ¤‹ƒ­)p«LÍcWZÇÍDàitÁ@Ùy 6°9V4b:s€„ð­*1kê/Hn„bÿØy[K þ¾'úS^yÅfC¸§ûúS1ž6chÝ”Øáe¦©ç/Ñèø#¨-‡ØÂÐÉ[ É[(€Vó±ãM3¦0‡-öˈo¬ ¤!¦l‰R&Ô#ë)äÑ"93¡=×?tŽÍ¶¿MKáÒÞM;r¥æ$uª ªŠ¨åÌÐ#ˆÀQòËÔœæúma¼¤¨6p]Zèàvêr¤0a"½Þ­õL\N&:ÖÌd]¥|,V%*©Xãdê­mbÔx}x9Én¯YjêD«¡Z†wsÑ×u¦Â4I^wõÓeOwL=GG£û:Ög âkû:žó}~®Àø!•l|çµk gCàe·ßˆ¯×œªµž§!ª„¯J&FéÚ>÷níS6Å0Ø™ ÀÒ(°÷Gd¢š÷ÝPÑ0çë´>=ºÍÞæ0S„îæ!3‚m.2ȲRb3) %Ø¡${ö°8ÔÔ¨¯íñT¸H®Ê¤Íl°y¤òe¾nöyÉC˼-ÛwTæ½Ó°Ö¤s/èl«f‰ žÉG˜Üò¬fÊÍ­¼±²©Ñ¡\¯­W€Yq€žSó”Cøµê†±fCD÷˜aÖüÛ5"î‘è¤`l‹Ž(ù¡+WGÌí7¸%.‚Beó&-m·áâ®îˆoèzh!W<Ðày^D°œsp?[r"5OÂÄDX\PµÓ,~t|I© c¹2oY€0˜!%c‡e½³p^á2”ªzç™bìå*NñÉÜ\¥‚ʾrÐàa;£Î¢çñžÞŸpîóçëZ§‡dÒ†tz“¡4c .¢Î’@ç¯HŽë 1ÎW»Xÿ(çD5Y)®€>ójÞvùêÎpÇ9ö›åP¢R\x`ŒhéÛ?4à×?øþÐö؉×XgAb•Ûd(Œ“Í¡£*@LðÜúë7ÇzM߸·%-«bÏ» ‡bËÅÖj—/]™‹­,ž‹g#¿¯¼V¬7£½­Lƒ»(í#‹íß~{ÒC{Jì4uwhª·£Ÿ¤%iO»,¾¸€>å=0ºäA¶çîP®:{F A~G]AºÔò´˜M¦õ ™¦‹Ñ'NÑÿ]²=å¥íŠ=&d`ÖwçÙƒNu¨U¦fZB%åÙƒçŸ÷'L„í³u‡ÙˆFŠ±<¢¼Ie2ç |=×R¸ 䱯—؆‹./«vhÂ;|뻄­!7/.´±Ÿ îÂÚxÛ].üDš`*¿Ìú\—ƒ™ç²>ŒµÀH”pÆÀGtš¼±»çšØ~øü §£ý‡% þñMJ˜zú èVfª}¸„–`ø&éßF8eÆçDâh+À?&Y/îñG!é©·N ª $ÞXiM1”ãßÎ0à¤.¾@‡O€Þò4WÙî%KÃÌ¿NŒïc¤Ä8 -•P†™÷ù ­Î¯Å)GAh{D°yËv.ƒP2Œ´v? X¹'ÞHL¨g‚€ÀE}É’~¾A쮕X_—I&’a-mì–®L´I|v‰'Å„L(‰3w|_‡âœ7JqœŒEÇT$1ôüžHÎ:ü #ô/Œ ¿1Øý¨±†D]Tš[oC$,ÌìññâLÅrh/£×¥~üÿä3@”GÊÚOAÇ?æÅ@Í·E{*19÷¦IûAœF™h]B&Š¾r†d„ðÆTŸër\'³§WË3›O…~}sÏ5±û…ð÷5ÀýÁöC:Ù0ä…ÐÍ< -ý„B)¥š–Ø>¡qo&9½føƒ1 ¹÷ÑI0™¡Ç¡hJ/£Ã˜4”"–}4 ÈëRÀ–Hˆ‰Ç¸æF ÁB´Ó‘JXKgo@„€òhÖ‡™F~§ÞDDÐîµ xÿ .Ë#R ÜZÑg¼®7бâ Xg -íxô»=µü¯¾Ë¿Øÿú4tOûžÌõîDZàêRäé×øË7þÿžÓwÒ øXz!SRQ¦2KœP¨5£.fgç¢ÿÓÅh|endstream +xÚ¥ZÝsÛ8Ï_á·Ufj­ø¥Çn›ö²½íöœtnvv÷A¶e[YÊZrr¹¿þ¤%YNæî¦Ó’AºbÁ1KM©LÏ’L‡&f¶Ú_E³-Œ}¾Ì3wLó>×O÷W?~RÉ, ³XƳûMo­4ŒÒTÌî׿þöþÛýÍâz.MÄáõÜÄQðÓí×Dɨùðë×O·Ÿ¿/Þ_':¸¿ýõ+‘7Ÿn7_?Ü\ÏEjÌ—¼Â… Ÿnÿ~C½Ï‹÷¿üò~qýçýÏW7÷þ,ýóŠHáAþºúýÏh¶†cÿ|…*KÍì>¢Pd™œí¯´Q¡ÑJ9Juuwõ¿`oÔNÒŸ6ih¤Žgs£Ã8‰ä´–£02 µy¢²0UBy-K1¥eÇ…Z>>®ó®˜¯vÅêaþÐ>Œ-b¦"³þÚgx® TO‘Da’%#þ¹+jн̂õHƒb[ÔÅ!ïÊz TÝ® áÅâîösKÄMSUÍ3ñÀPNÔïß>ÒÅÞôüëX´¯Õ øÛbu$"ÿ»©‹w8¤«TÇlG!˜±afŒ´R“T™ ¾Ü}ÁŽþˆ"•o‰ØÔÔz®_ï¾ÜüFŒ‹6Ô®‹®8ì˺ árãæ–-õŠjwͱZqÉ+ÛbM£n=V`1Áª/´GŠÜYÈ×îi'eNgPqàhå¶nHIkØЬì•Ÿùé#ê¦#ª?8 ^rÙt;ê=—Ô‹ƒ¼^ŸHͱc*Ñ@É!õîw¼ÃºØäÇŠwYá\#‹×pFI ÇÅS¾Ži`“:Ì´J™'<ó{v®8¿uöºö¹.{ ç²vtx™w«Çù¡ØŠvwæ€ðA\¾*€çš`pXcB0<àþ:‹‚X˜¤DRƒt—j@,DÝcý„øŽ­õA$ÞøF´ûþ‘ à€‡´o?6yYÁ]ÆBŸÀ®,pç¤DX5ûG€€eY•Ý˵"·TIlE°N©á$q6ôÉ“IÀJÓ&¡B-âø¿µˆÑ*óT…2mŒ©8¡Í1ÆøBNEx¶çü°Fíœoþ'“0NMÊþ‡ÚŒb@5œ„:_“Z#úZ‘,Ç*¯‰¼ä)äþH±W‡,tið;§áŠÞ2µ-÷ŸËuA£«|å„hx‡œe*žyFqx*-^„pк>®XP¸šC¾A"`ˆ\ a†4ÔÀt`ÕQP•õCK]+µÊ‚â_‚u^µÎ÷õxW ßIÜvD%5@'¯Ú†zKž +¹Áº·ºeƒhAÝ“1â¤ÚwáI»œ·Yót‹fØÙåOÅ‚®KÒÇ +ùdä«UѶԷ2È”½·5µèP“:–ÇŽžKëh~JTMó@½ã#ñX5•Öo€Šjâ]òúå9'WA]iÉØ3&àjVðxFSW/´(ÜøÄu +·ù’×~lpwì<ïÊÕŽºdŒ».ﶥXükÊ<û‰ù õ ªº³[e—ÏëöÙ/_sÛñDkÃܨ$4€-¯#xŸë2‚{.Ô9íú ¹¥M"²×7ö\;@IÆ¡1.¶¦À­24]i7§Ñe_ä5ØÀæXшEèÌ:zÀCn´ªÄ¬©¿ ¹Šýcçm-øûžèOyuä› ážîëOÅxÚŒ¡uS`‡st”¦ž ¼D£Kxà JH´œ„~LÞbHÞr@´Š˜Ïˆoš1…9lÑ°_F|c] 1í`“Hü2¡YoL!É™ í¹þ¡s|l¶ý}lZ +—önÚù+5'©S QUDí(g†AŽ’_¦æ4×o £à%EµëÒB·S—#… éõn­gârâ0ѱf&ëâ(åc±*QIů So€l{ ÀëÃËIv{ÍRËP'Z qvx7}]Ç °Púu_ïs]öuÏÕóu´‹±»+ U‚|}kÇ4±õÀÙmyÎ>ØûÎëØ–Î’À×n¿!_¯9ak=OC,T-_-6—LŒ’´(îÝÚ§œŠ`°3¥\`ïÈD5ﻡÒaΗj={t§½Ía¦Ýý‡Y™Ú\Àœˆ8ÇMJC™v(Àž=+55ªk{æF˜:ÿv°{$:©Û¢#Êc~èÊÕÓ@ûMn‰‹ðPÙä‰FK›Ëm¸Â«;âúŸE[H4x)9Ê9Ÿ-9‘Ÿ'ab"‡..²Úéˆ?:>Ç¥T†PиZoY€0˜&%ˆ¥½³práÒ”ªzç²™bìç*NñÝê©ô`;lgÔYô<Þ³Ï{ü綪uxH'mP§'0J3–"#*,éKsþŒä˜^—ál­‹ålN„P“âèã1¯æm—¯èwœb¿Y õ'*Åu†ˆ–¾ý;~pùƒÏmxu$V¹Íe€ÂÙ:¡úÃÏÍá¡¿~s¬×ôýˆ{[Ò²*ö¼ ú&¶\k­vùÒUi°ØúÈâ¹p6òøÊkÅú1ZÚññÑÊ4È°‹Ò¾±Øþí·'=´d ÄÎ7Fy2¤î¼Öd+ëËi±Š $Neòz¨ìs]•žËfdþçíéꇋ „ø̼.ƒçšbø¸ C¥C)ASiÚÁºËO@´õ´£Š\Ö‚`ˆõÈèÙ +Ç}¥§¹ÇŠ®¡Q×f—¶æƒöÖè]Q†Fèt”ø kCS@X³sµ¹JR[ŽCŒòsu D›™Ýeárzs‰ŽïöÔ@µe2Pr0f¢X©“Ì{FõävÌëöËìs¸Ã–¾¸À€Þ™‹áa0¹ƒ²ƒÛ]Ž‡ÓQb‡Î¥S3ó·Ô¢)aOÖž8ÇŒ|,Ýþ#»û3•º 0m‘ã8bfÚh +— )Ö>ÔÄV|–c]áýÛ EŠ¦Ú¿Qg!ÖA1üÙÓ-x™mYµ š-ÞÔú‚Ÿ¯šýÞ—Ð)z˜áv +¼ešáO ¯–§Ïõ„:´“T æöùÙYD0ü1 9"¼ï)âCSw‡¦z;øIZ’ö´K?àk èSÆ£Kd{î媳gdvÔ¤K-O‹Ù,Z²h°}âýŸ(ÏCQ^Ú®Øc*f}wž7èT‡Zej&£(4±–o$žÞŸ0µÏÖ¦ e(Æò¢dù3ðõ\oHá"€HÓ0Ž2_¬±]^VíІwø ×÷ [Cn^\lcG\†5ò¶»\ø °C(°Þx¦ïs]ŽfžË:1–sÈQÂq'ÑiòÆîžkbûáó3xLœŽöRøÇ7)mH`êé7 [™©ìáBZ>‚eà_˜¤álŸ‰£­™dÝ@ºÇ…¬§Þ:¨x’xc¥µ=‚Ä84RêQXÀˆ“ºþ=z{HÔ\e?º—, 3ÿ:1¾‘ã(TBfÞç/´:¿§¡í=\Á&v,Û¹ BÉ0ÒÚý€`åžx#1¡6ž " Ô;ö%Kúø±»Xb}^&™H†!¤´Á[º +Ñf!ðÙA(žR¡$ÎÜñ} ŠsÞP(YÄq2s‘ÄÐó{"9íð/ŒÐ¼0&üº`÷£ÆuQin½ ‘°&³ÇÇ_ˆ3÷F¯Ký8þÉg€(”¶Ÿ¢Ž7~LŒšo‹öT]ròM“öƒ@2ÿкŒM}å" AŒ•—~,÷(Ôcº BŽédóôdyA`ð©Ð¯îì™Î·þ´˜ßß{ˆ?'ë…tÂã:˜Ç Ÿð'¥,ÓÛ"4î¡$§·¿ *¦!÷2: 2ƒ -öIÝH)£³˜4”"–}Èß `e‘/2pÁt@‚9h§Ñ!•°–ÎÞ Ðäq¬2üN½‰&p Ý;jðû\–G€­%Rë1àŒ×õ:Bœ£ëL¡ Ë!¨ßnFï+ÿ«×òouç¿; Ó¾$s©;‘¸’ XMºüåÿ¿ÿ/Ïé?:é<,½$©ºÌ'j͘‹‰Ù¹èÿW+g,endstream endobj -1301 0 obj << +1317 0 obj << /Type /Page -/Contents 1302 0 R -/Resources 1300 0 R +/Contents 1318 0 R +/Resources 1316 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1280 0 R -/Annots [ 1305 0 R 1308 0 R ] +/Parent 1325 0 R +/Annots [ 1321 0 R 1324 0 R ] >> endobj -1305 0 obj << +1321 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [367.5469 435.097 428.747 446.9972] +/Rect [367.5469 410.6007 428.747 422.5009] /Subtype /Link /A << /S /GoTo /D (zone_statement_grammar) >> >> endobj -1308 0 obj << +1324 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [483.4431 226.9165 539.579 238.9762] +/Rect [483.4431 196.7586 539.579 208.8182] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1303 0 obj << -/D [1301 0 R /XYZ 85.0394 794.5015 null] +1319 0 obj << +/D [1317 0 R /XYZ 85.0394 794.5015 null] >> endobj 358 0 obj << -/D [1301 0 R /XYZ 85.0394 671.5763 null] +/D [1317 0 R /XYZ 85.0394 649.9934 null] >> endobj -1304 0 obj << -/D [1301 0 R /XYZ 85.0394 644.6731 null] +1320 0 obj << +/D [1317 0 R /XYZ 85.0394 622.3077 null] >> endobj 362 0 obj << -/D [1301 0 R /XYZ 85.0394 417.7762 null] +/D [1317 0 R /XYZ 85.0394 392.0307 null] >> endobj -1306 0 obj << -/D [1301 0 R /XYZ 85.0394 393.3438 null] +1322 0 obj << +/D [1317 0 R /XYZ 85.0394 366.8157 null] >> endobj 366 0 obj << -/D [1301 0 R /XYZ 85.0394 274.0842 null] +/D [1317 0 R /XYZ 85.0394 245.2415 null] >> endobj -1307 0 obj << -/D [1301 0 R /XYZ 85.0394 249.8112 null] +1323 0 obj << +/D [1317 0 R /XYZ 85.0394 220.1859 null] >> endobj -1300 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1316 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1312 0 obj << -/Length 3041 -/Filter /FlateDecode ->> -stream -xÚÕZKsã6¾ûWè¹j„à ¢æ4Éx§6NÖã=%9Ðm³F"QÇ»µÿ}»Ñ_¢d§&[µ›©ŠÁf£Ñh|ý%fþ‰™±ÌzégÎkf¸0³åæŒÏîáÝwg"ò,Ó¢ÏõÍÍÙ×”›yæ­´³›»ž¬Œñ,³›Õ/sË$; |þíOW.¿ûÇõ»s§ç7—?]/¤áó—» Ñw×ï~üñÝõùBdFÌ¿ýþÝÏ7×ôÊFß\^½'Š§?G„^_|¸¸¾¸úöâü·›Î.nÚ½ô÷+¸Âü~öËo|¶‚mÿpÆ™ò™™=ÁgÂ{9Ûœi£˜ÑJ%ÊúìãÙß[½·aê”ý´Ì˜UÖÍ@7¦¸¯YVeÁŠÙô²C0«­>.‹æq‡iÆPÔ"Ìxof ë3ÝáJ5‚yc$žnæ˜t1NÜÒé^¡}§gÆjŒ‚3£¤ÙÈñÓùŠù ü_ÎN#³ÌÃI€b‚eJâʳßg‚qí½"žÞ8l´3@ |}¹‘³÷5lgÖßQ”»è [²ª‡W!‹V°|\Ö…óõº>fþ´ø}_lŒ|þ¼XæËs<´_+{b2q¿etÙ¼"!ô°oŠv5ým‹ey÷LùrY4Íak…, CÅÆÖÓÖ3™ùlÖÛ—AÁ[^±èÀüe0]HϲÌAèšY¡³éø"”: ØGi!(&âKË•Ž‹ŽêyQWc ‰Híú’Öo¹&F;X.†|Ä£ü•sYàªlþôP.h¸®—ù‡nž¯VÛs‘Íá¤ã2¯h€xÜѸ\«²Ê·ÏDyõ‘DÀ.›]YW DCÅíüæ¡Œ’6ù§$´Œrëfæó¹Yæ%o&ÏmÊÛuñä@ܼƒ5JÃܪÙåÕ2Ñ‹J{²1 ÑÐ%.…`ïð·¬vçb^l«|½¸Ë—eußÒ‹-ÿí~GƒUÙôdÔ7CÅ;’6À“æ2hžVÀ8_WEó††Oåî¡Æð¡*Уòm¹~&§ª~jg‘oÁ (X… -“vOõöÓW =ŒÅ@×Ç#ê…ÝÉ#HÁ@£…‹qb“£fBô¦¦ÑmA›P+"”¡‚Þ‡j)P ÿl2±8Ä:'yb‚cÞ›¢Ú¡ñ¤ˆ+èº0\æMÔ' -þÖŸ‹í¶\ Áãmœ…X%-T?À$]%žçkì朵cÕ Mogqy´Ž€èÙôÍ«â.߯#_?„aÁ‡-ô xíûch$º˜buLsŸýÚæ %¾PÅæ׿°00‡k£ÿú /ùD`„Ãu²¿²ø/çýþqýŸg~í8sÐZœÎü-×8n±ÆÉ_s&uoÖdîL `¢ “ - 4Paú•)~âð¡nv‘šSdˆ¨6ÂB) -3H¼/vñmÕ<Û8ï.Ì«7ôƒ°YlˆŒÂ@wƒ¡6` -O™*b@wN qkÄqêÈ fÁvØVFRhÅASÄ(XMh!ì• ”ÙËý¶)§Ã½àx?ZŽ\ Gå]»n¨SÀB°òö©l&óx¿2ÎÚbbi}€áê5Kã@Í÷Õ=øpY(c êp­‡UW·o`0`÷ZX ~Õ¦ê ðÒš0(ÃdÛb H!W*á9Ë’+( ¦7å\û‹á–ѸÖ÷ŒÞ -aù6m"õWnø”ñŒ3•¤‡jª¬æ-ÌòŠžÑO¦å¥ôéÜ`A“ÊXLh¡! -J9Ä0*~0S”3é¥z!õ¸N„¢Ä5Š¦Zè›…—Ùi-Z® 5ñÈBÔumz [îÚzš…ÔŠðÃVÞR+ïîËÏ‘ÚP„ä.á+JR@N¡HzK5¼¤š ^j.ªÕ2fœ¶Ã#ûÓ…Å©5Yõ|P“½™@§„vÂ6Fçµd™k})¯VS`÷hXGlOIãÌk›ü(\•…Öî4\û\ÇáÚr‰Áæ»Óæ´-ׄæY1nÌH…aæ´mӌÔ9aØeN|h3§¥z ÿbçK#b {úI]·Š3Ãûû‡D(㫦ØBoƒWˆ€ekÍtZE›kÕã ¤¿*¡ñL»Am(¢›¸˜Lr,bœ¹üX¾†ÊW/Fë¥Z”²R(JçN'P(&„âòµ Jí“KSµcÆù¨‰ -¡+wIçx¯v,éè@!;L$œu2鵬$~4:™^‡þHKñ‚¿ö¸Nøk⚀ØTrÑàd"Ó§uh¹&”»ŽyïÝP‹¡ËÊ6¹(Ù&¤Ž’ ¾ É%¼‹÷\H»«tÉ]±´Õ<äd¤BSŽòI¨AâÄ |JÔ1œ^›OFš|i¯ŸNZ‚ãZ¯Íi8ô¹ŽÃ¡åêà°\å»Ãž»X¥ÿÉÕ[®‰åÕèjÉgÎ ×UÝ…'äü»‘ÚÆîðb72…3b³¿Ý„Ë%¿®òM¹$ºñ*m2Õ xM‰ÔMÞìŠ8Æë®&V 7 `!ÂÈcp€ª–BS„<¯ŠP4¥[Ƚ²Ç%9ì’Q}|Uï -¢îò]˘®ÞI„W·9CK·A‡‡(€ nyq«Ž¾Š³.ބƸÐápò²jÏá] {Mqˆ•Ì0‡©E‚½\¦Ãgz¹½×+×}Ô$þEÂjäÔË]™\É15ÖF*Ét‚úÂÛr½ ƒT:\ôœ¾„ Gvy¹>á»/5„Áw{\'|7q}wê<åÛe|4N`~T§i¹&4Q£;Y—õ·uèÆVµn ÃäÆ0ìÜZ7†òÕ¹1Œ;7ƇàÆ0èùToÚ:ÿýÕCÓ“ÉQøžÇ§@ßnÈá™ ¾“eðò¡Ž¬‘' ªé”p!:„7½¼Úɯ?è¬i!QêTËÿ ŠBÎc †ÿžª}sÐìÆ9oH|²)*T@G•¥HÄ*ª£yx{GŸ€â]tžeBš¡qÒö)ÈhHÆeN:##å±Ø‚¤ ,ïýüæÜËyMÿa&:úšÊ@Cµj¬êrø#›Äõ‚ -ZrÆõCÚÊ`S÷íýRy&ÁO— =¦ãUBbêâèg»hž+nC9jØï~¸t'h™5v{–eÐö5ˆ¿,p&~À¥ñSˆ¿›·‘ˆZ{-èLú‚eæͦ®C@â’_™DÙAamæïà¿ÈWGŠ¥¿xÕ6œ@ýža2ë.×) -ü*¥®Ê[Jl0eßë©ôL²Ýü6ý¶¢åÁ ™ùù÷PÛt1If]øÎÛ¸u³I·)4~*Z,9K×;U<ÆžBQ¼Åº› -Áà±s:€ÐŠ6uBh_V(u LŒšÞ*µºå}ñ½ê~5c@½)Ò*ÛªEüÅýT››n* ß¿M·ßŽ¿øWvÝOµ£Önºêwt $*…–4úÐy9 "Å¡êÿ6=Žendstream +1329 0 obj << +/Length 2905 +/Filter /FlateDecode +>> +stream +xÚÍËnãFòî¯Ð-20êôûœ&OÖÁÆÉ:ÞS’-Ñ#b$Ò©qœÅþûVu5)’¢d“2FÅêêêêêz6)fþÄÌXfƒ 343\˜Ùr{Ág`ìÛ ‘h-Ñ¢OõõÝÅ—ï•›¬´³»‡/ϸ÷bv·úyn™d—ÀÏ¿ùáæýõ·ÿ¾}{éôüîú‡›Ë…4|þþúŸW}{ûöûïßÞ^.„7bþÍ?ÞþxwuKC6ñøúúæaýœ`z{õþêöê曫Ë_ï¾»¸ºëöÒ߯à +7òÛÅÏ¿òÙ +¶ýÝg*x3{‚ÎDr¶½ÐF1£•j1›‹Ÿ.þÕ1ìÆ©SúÓÒ3«¬È3)€Ç+–U>jÑO/Ëá0³ÚêÓ¼h^ lg Y-¼`&3[X§ANºã•j& ÆH<_ï˜tØ(Å8¢àxoPÁ‘00cµ@:Á™QRs¤øáraÅüþ—ó£ãð–8Š™…ÍáqáÙo3Á¸AMŽ;=h "¾¼ÞÊÙ» +ö3ëo)ñ]ôÇYÕ3X!ìW«™ † "£ÀÙfS] +3Zü¶Ïw`|þ¼XfËKÖ9í×ÊÐdÚoQƒ :?/‰ =ìë|EPSÑoý˜/‹‡gzȖ˼®‡ ¬X@àÅÆÚÓ60郟õîólAÁ!ÛŽ±8ØóçYêB潃è!AÈàÜtˆÌ aáÀ4hSw°A1b:ªöÀè°žU9V’h ]ŸóÑúÕ„“Qà–‹¡?áaþ¹Ìñ•Ÿ?­‹åšÀMµÌ6ºy¶Zí.…ŸÃY·„ˬ$Mà±!¸ŠT«¢ÌvÏ„ywó±€]ÖMQ•5DÅíün]$NÛìcË´H|«zêõ¹Yêíܤ®‹ûMþø@è|€5JÃܲn²rÙâÑ•¤cQÑ.… ïø[”Í¥˜ç»2Û,²eQ~èðù-ýý¾!`UÔ=ž`ìÛ!Ãü÷†¸Å ð¡äí +ê«2¯ßøT4ë +À‡2GŸÊvÅæ™Ëê©›EÞ@°Œ''5OÕîã5=Œ¥P×·G”Ë3'¹^ÊÎ8×z˜ëû:üjB +«Á¯ºT¥ZZ€"N¶­*æêc!g¾Õc eÁÔbজ‚k1Ü2*׆žrãY!,ߥMÄþ ŸR¾Ø«–{¬†¡Êª¿‚YAÑ3úÉ”` ¼”¡=7X@Ф"Zhˆ‚Rm? +˜m”QòB :ÐœC‰f2M5!Æ@„”þÜúÍ‘ƒ(d!Ö:ȱ= †íw]  BÛ~ðãöF©ý€±ŧœP]øAô!üà%&@·áGKu Rƒƒ:‹ê3ÏŒÓvèºø¢Øt¦+Ÿê°7)¡…ƒïÇ9a€Z2ï:ÿÉÊÕ” .ûF{žâ%“¶­SŸ6Qå1™Œ´GuÆL[ªqwØ(C2wÚœ £š`Ø(ã%‘‰0Ì–¶k”l³%€‡l‰]¶´T#á/v»iÜÓ§„:t¨8cM6¼ÿ°nEªóô3xs¶l­™N¥¨sm bD™W%1îµÔƒ"¹‰K 1§r&Æ61‘¿Oåh¨q¥ b´^[RæB %MéÜù¤ „P\¾6irmÎ.MEÔ‹žs1ŒI tåC¢9ÝŸJ4ºNȉgM4Q,+‰¦Φé¡}°ê…¤Ò§:í¯Õ„‰M¥ N&¼>/CG5!Ä°Àu,„à†R ]VvÉEÉ.¹ v”\p4&—8–î¶9vWéZwÅrVó˜OŠK9Ê'±îH×3ðY(Kù¨†}m>Iò¹ý}gšUìŒÏ›CêŒ9´TsØ?®²æ¸ÏJM(÷Ï®ÞQM,¯F×IÁ;7\Te.9!ç§ØØ.vLJ6v#Q<@Öûûm¼PøÝs™m‹%Ð-'`i“m ‚W“ˆÝfu“'¯¸êTܵæ "ŒÕißí¨Æ¾»qž²Ý + e|4N`~Tçé¨&$Q£{XçûÛ:vc«:7°ucnŒÃùŽ:¸1À7ƇèÆô|ª7m“}Jþ áñr¾£gãq¥)ÐkÇ[qx&ÅÅw#Q¼p¨é:Ѥ A5.F‡8ÒË m ùå{íûÖ#-$JÝÖòÿ¢óÔ6Gð¿SµbÜ4ç ±ouŠåÐQ%a)R²Lb§hGèµOºŸ‘.0/¤*§Ý> ɸˆÁI{R`ópÚbÁ²P<Ìï.ƒœWD“—Ùý&ÑuKk×W,p~CÄí=å„žtPFkÃIãÆ;ÀH«†%_R-´l­f¿zQµñºKý><Ó&Å矲͞îÞRý˜®ÕÖY9!:^GpˆRîˆÞr¶Û…cšà+¡bêŠýãíMqÅ@•Ý¿vQXjîAŸÏô°¬öøzê‘ÒÑj¿l/ïhFéÑû¼ê¬88YQ.ñlCë`)g> endobj -1314 0 obj << +1331 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [184.7318 238.2538 233.4785 249.0382] +/Rect [184.7318 214.5925 233.4785 225.3769] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1315 0 obj << +1332 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [369.8158 116.018 418.5625 128.0776] +/Rect [369.8158 92.1907 418.5625 104.2503] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1313 0 obj << -/D [1311 0 R /XYZ 56.6929 794.5015 null] +1330 0 obj << +/D [1328 0 R /XYZ 56.6929 794.5015 null] >> endobj -1310 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F63 1063 0 R /F62 1060 0 R /F21 710 0 R /F48 950 0 R >> -/XObject << /Im2 1049 0 R >> +1327 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F63 1068 0 R /F62 1065 0 R /F21 714 0 R /F48 955 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1319 0 obj << -/Length 2727 -/Filter /FlateDecode ->> -stream -xÚ­]sÛ6òÝ¿B÷tòL„@É“›³sî4iâúæÚ>Ði,“Ž(ÛõÝÜ¿]ì")Êq§=\,‹Å~Sj"á§&Î -©½™Þ+•Ìoää ̽?RŒ3‹H³.Ö—G¯Ït1ñÂçY>¹¼îÐrB:§&—‹_§ïþyòéòôâx–Y9ÍÅñÌærúÃùÇÄÓãÝÏÏÎßÿëâä¸0ÓËóŸ?øâôìôâôã»Óã™rVÁúŒ)XpvþÓ)Þ_œ|øprqüûåG§—é,Ýó*©ñ _~ý]Npì¤ÐÞÙÉ#¼H¡¼Ï&·GÆjaÖ²>úåès"Ø™ KÇäg¬63ùdf3ád6.d)¤¡Í -£DîýNÈ™rÄB!—ëuó8Ûnʺ½®6Ã3+ãE–¹I—ðÞöid{ÝÙ^Y#2éuÿ_îªùê7)³ª=ž™ÌN—«ù’†Ë¦Ýh>-7ÇÊM+‚ž«½lz¼Z=0ÖššGñtLë: 6·<¹d¬¶Ú<€@)Ša Þi4Û†FW=Û$œV5=‘é}U¦…2:cÂAû»’/”b¤v[n«ÛªÞ¾ÊF¥øp8/[äÇÈéjKµY-ðÊžá¦p"³.J¬¹Û®šºGíˆ/® UDñ©ˆÏË æ­•œž_“×Í–!¾"H¸r,ªëò~Íx«–gz´S  ‚¢Š=‡Áf™;dXéçm·‹uØvýj]Îo–ͺÚ3Û 5ò;G¤‘{f«p&lÝ3[eÓ’ëU»¥QsÍ‹™fÛFÜí²ÜÆQE6¾0~\¡\qî0™Ï«;½¯6«HjgËaO¦pß²:ܘƒfýPEvƒîep6Ÿ›¾åâOÇJ©)«Ôç¸#ÞõnGV¥–•ipPÑIzÚxÅØŒz×Ô‹`ÜA­x¿ËCúlMÇÀL! 6†ú°ÉcÈ"¤1÷6Ó"¤+ ÐèLh©L@Ũ©ra!ˆJ ¶Uo«Íu9¯Ú‘Md§7¼”áÑ£¤Eð¢¯4q×l¶- I#pv—EÀ1Ë1,n#4)¾t®Ðȧ8ˆ}O -÷íªþ7s_F[BoDBCÅ®êYSœ|–p{zDo4˜à}i£…Ó:bnË› øbMOÚ¤Dƒ16ˆ4Î/"©MÏ7*×yŒf º ¶C7E¡•›ä2…/õ‚œ'Þ97žñÌÅY—dp:=þ´q¢È@­EÊ-Ĥ!“d2×ß‘ÉHñ[L:0·Þc2xÀC&h’ ά/ÈFð’’ûƒ1»?‘bð=×tÃs(lfJÈ<è\ÏØb‹æêiÿ:.‹$á0ÄÍ!µ¤)Y7d>kwÈVbô…à®ÁLЇ(ˆ2:+Âi>€ó[Ý­GÍS -ù—˜$ÎEʶRºËŽ´øØgN\ýQÞ¯F iæ ‡‡ùvv@…äô¿ô€R½¥·ÿ½M'î¤=ƒ•$=AngzÔþ¦À7ka˜¼½Vyöˆ†ˆïˆE¾Èv«º¼Z£ -ÍšÀº¼ePòÃE¶Æ— -p©¹n%Q8ÿD3}Ã%$ÔÂs4¥MGFæ)ë4i±‰®|(ÕÛr¾\Õ|É!ÃE¥­X1AtÑ.ÊCŠÍÂh)‰r—qŽèiÚçÍŸVÓÈÀ3Ékº˜žMEŸã¦>dƒq&e°çŸLOô tØY.»È|ß2/ÇS~.ÉìvöØæ"‡ä²Wp™ÁUú‚l›NAtýÄÀe,KºNOGJ‰©†á£Ã -œc5 Þ®K+Ik ’ªéH ¨êA0hrQ¸¡ž7·”Z€0¿v3ǼNtx Ÿú¾/«±È=Ð=veýMÜò»”ƒxe1ȉ¤›–<‘¢ÞÎE°ñϧ ™„B¢­‘àõ+þR0Žg]Šû±Ø²Ð~·ñÁ„!ÓNXë¿'‘â·˜4JXãtŸÉC ƒ…2=w,nò¯Ý»é'” V/649”â&Šê4Q˜»pãÁ¸UÄëXêà†“…vEÁ&ÚÏGöJˆWÝÎÆÖ¢uª-N“—p¼Ùkŵ+ZÉ„I1:¹+ÈÁb†ï;Õ=g¡ò®£ »‡ëÜ/j^^HøBh£ÈO7ûïüç눴ð¹R"“R½Y\¹7o^ëìíøª‰ÂwÊ -m*'´äbTN (é(@ƒZŒ»Áü!Aó\Ѐm 憶“èiWÛ%#s¬ÈHϯÑlÐstœhb§† q5bÄ#”û,>åMÐh„o8ð†HäYprÅE ¦gÎÜÑb´¯?hªw3Ú—$[st*Þ'¡d¾8 - QõM׎b³£ËcŸM›Ø*¸©ž©HRå4V„[Ùï!?‚MÜoæ¿ ;¡BC3ê` WHûr‘ã×°aY£È‘™½šÎĦ§é4=êT$K%Y¦:F±,M’¥Qƒt ¦îë5çêüQáR÷x6vÒ[Ó­K‘ÑNùž‘@ bM_©SÓ(Þ ß©Ð9,ƾó‘Y[tv¦PøÐÜ×jÆ{Û'Ÿ¡ ÿì¡ Ï¥î7Ð0¼—1ö¡ð+Tá^Ä~l±ÆÅ®«0ö€  q¦¤e19& ìÊ]œHÈ3œPÒeýHÀßÆÚÐ26ûm·ÙŸs³ÿsø B±xWì=ßôG3ÒÑ%èŽKÐV…$½þû–&njü¸Öý}ÍŸØpMI¯PG·\¦è†´V§¶# ³¸¤¡ì¡víh3Þƒºdɼ¥YÛÜoæcŸRf ½_Øô¾‡å\IéÜög(ÐÀ€/p¨Ñ0 -|0hïC¢“ÜC…ÏmA¹"ì>ƒ!vh- vCâ§ÎšLls"Î*rïÒÁ±?> +stream +xÚ­]sÛ6òÝ¿B÷&ÏDA€<¹9;uç’¦®;÷Ðô’hK‰tDÚ®ïæþ{w± ˆ¤(Ç7Íèàb±Ø]ì'(9Ià''6‰rzbœY"³Éb{’Lnaîý‰dœY@šu±~¸>y}¡ÌÄ —§ùäú¦CËŠÄZ9¹^þ>}÷ãÙ§ëó«ÓYš%Ó\œÎ²<™þpùñŸqôx÷óÇ‹Ë÷¿]=½¾üù#¯Î/ίÎ?¾;?I›IXŸ2…# ..ÿuN£÷Wg>œ]þqýÓÉùu”¥+¯L +òõä÷?’ÉÄþé$ÊÙlò/‰Î¥“í‰Î”È´R²9ùõä—H°3ë—Žé/SVd65# +LUG2±Î'&s"W0… +üœ¦ºZÏç›3ùtSÌËMƒPzok|šé|]»§.¨JY7ý±~,Ê*êL[5mÖÕ‚©ÍëvE£³œžEµùõ¹Äè¡Á+o‚7²{v”øŠ þÈÉ­oŠûÍÀÛ:xÿ&8tÇ€4ð†zÔwsŸNªüyßíb÷݈…¢Ï7Åâ˪ޔn›¢E~cç€4²sÏm•V§ƒ­{n«ÒtZÐc³nZÕ7<±\’k6MÀmWEF% ØùüøqzÅ‘?COd±(ïxüõ¾Ü­©½/û=™Â}ãÉ*R`êÍCØõ¶—‚l.×}ÏÅ žN¥”S6©_ÂŽxÖûÙ”6¦ ÷ƒ…Dkœ36£ÞÕÕ2d‰¶æý®Ù§÷4_gÐ&1ì Õq—Çê‚ÆÂdf(f¬É1œ § %{,pd.2¨w’|«jËÝM±(›‘M ·¦à™*'&!F”¸ÞSNè0qWïÚ††d8Û†eÁ"pÌzô‹›Ç†€/c4Š©öê@?’ÂÄ}CÉ×o>¾´„°„ш”††]V3¨%ŸEÜžQÄM&"£Î^@Z+a• +˜mñžƲˆž´I£3¯Ò0¿Œˆd6½Ø È|™³˜.˜í0ŒEa”´“,·Â…}Iyš +g­/Ng‘â¬KÒJ[aR0ëˆF™²…œ4dÒ@õ‘äê;2(~‹I ÎáàÔ{LúxÌutÁYæ ùR 0æð#2 >çŠNs¥ÍTŠ$Ï6×s¶ÄB€™? ò_'dqê5쇸ù ¥ô #ëW¾Gsí9Sàb!„륈õ¹ÃòD{i>@ð[ßmFÝ30r/q¡TX«­X.Åæa¯-ûÓ ‚Ë?‹-pñjÄ‘fÚ-Hà}¾÷ìÌr›ÿ¥Âû–Þþ÷v¬#¬$íáj;Ý£ö ±Y ÍäàíµÌ{´㳂Ҝ +o>(w˪ànN±i°*¶ Š ¾EŸ*@ü©ä¦f”HáòÍô —Ð@Œ ýÝm’aXL ¤¨ŽÐ¤Å:Äò¡Z·Åbµ®ø”×ÜçU%[&è.8Fq̲YÛ£fº/9G 5ósúÿ¶ÓÀÀ3Õk<˜žS… á»Úꘆ™XÂ^~zÐA=!„°P +cR×—ùz¼æw“ô´³‡|Dà,9T—½þ€û n00¤­;ÑÍW¡/éF=l*b$ÔšE‡'t8§rêÃ]—VÔ*6A¤UÝÑ*@ÑÔ½b X²1võ66ö_»¥ca'D¼ˆŠÏG­êßx“qqX Šê)øþ¸ëw×xõ&fP%vZðD¬ˆz;°vÏ× i +¤[Ìà™Mÿ~6g]Š‡É؉Qn¿ñÑŠ!Åë¯Ì}OÅo1©¥È´U}&U œXnYÝ_»gÓ¯(!j%_ìxP›žãap‘9»ÚFp0‹e]²aP8Ð}§ +f–Ü;È®ÜZåNèTf}ïhêÅv•eŸ† ^ÐMƒõ¾@£èÑôÚ÷Š-U¾‘ˆ,ˆEÄ4»á WL®¾+QrAxmž@][¯ +¦SVõý-óuöé’1ïï|,I1œ]Â&ÓÏI–D[@¨}" Ï>[Â[Ô¬Þ6õjèÕ¨ø•vª›.ýô;‚¨L§°“ĪÅØSødaY?€DÑÐRJ–.¤ê.Ëñ– ª‰–})eôz>¿Ÿ£ä‰‰¨MÖ•— ¤Wã#TS-£“na"èÖC{ÚdYVƒ‹c³ßs^®ŠP×Ú/³œAl²±¡z@E3~RÿM(ûЀF#óÖ‡ñ®CJºëØ»^ÜoŠ½“^cx “ ßÂÁ€îý b„ô“¾J¯Yp†¯åh½¿å’oQdç…¹ó'î [¼Ž§&G<´« +vÑ~=rÐC¼ê^mܲmbsQs™ô¸*ãÝÁ]\³î]š“atj16£Ý Þwj$ŽFN##òþJv÷ÇyØÕ¼¼“pF(­ŽuÈO·üï$ü牸ð¹^"Mùf9·oÞ¼VéÛñ^ÒN¨$‹í„J¸@ µŠ6 +Po–ãk €`}Šoy.hÀ¾sC_‚IŒ´ô‘Å#k¬ÀH/®Ñ¬·s œèb§âjD¡Ä#ôû¬>é´·h„o8ð†HYprÍŸE= ¢§WÎðW&ô¯?iªw2Ú ‹K¢/û9’Š÷ñJD(¹/Ž|AT.Çì†vT˘]ŸºtZ‡»‚/å3IìœÆª¡ú=Gð÷›õïQÁ«ÐÙo¾ïá´<ÚÙ${yŒÈñsØ°­‘ÈôAO§Ã­§îÜzjÙé>H—ŠºŒ}Œd]ê¨K-åLÝW®Õ‡u£ÔÂÆëãÙ˜<¤Ët·/EF;yÀ×{:JkúõÂclbú +Å‹b>TapXŽ}èÑ"Í2ÓÙ™RáCýŇÖL+<·Cò¹ʸg…‚BŒ# @|H˜)hY(ŽIûvg ò× +dbÓ¾_óGqì¯*ø‘ODÉ$ÐùÛKØÿgCCš³6ÿؤ’\ØÔ™ÀòŸ™!çñÿ ‡¬ÿ¤Eendstream endobj -1318 0 obj << +1335 0 obj << /Type /Page -/Contents 1319 0 R -/Resources 1317 0 R +/Contents 1336 0 R +/Resources 1334 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1323 0 R +/Parent 1325 0 R >> endobj -1320 0 obj << -/D [1318 0 R /XYZ 85.0394 794.5015 null] +1337 0 obj << +/D [1335 0 R /XYZ 85.0394 794.5015 null] >> endobj 370 0 obj << -/D [1318 0 R /XYZ 85.0394 658.768 null] ->> endobj -1321 0 obj << -/D [1318 0 R /XYZ 85.0394 636.4568 null] ->> endobj -374 0 obj << -/D [1318 0 R /XYZ 85.0394 119.9909 null] +/D [1335 0 R /XYZ 85.0394 625.1831 null] >> endobj -1322 0 obj << -/D [1318 0 R /XYZ 85.0394 92.5589 null] +1338 0 obj << +/D [1335 0 R /XYZ 85.0394 599.8772 null] >> endobj -1317 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R >> +1334 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F48 955 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1326 0 obj << -/Length 3170 +1341 0 obj << +/Length 2990 /Filter /FlateDecode >> stream -xÚ­ZßsÛ¸~÷_¡·Ò‡ß›'_⤾é9©ëÌ´sw”DÙœH¤"RvÒNÿ÷îbŠ”)ÅI:™ ©ÅX,v¿ýZL8üc™Íd6I3Í f2_ŸñÉ´½=Ag•¦}­ŸoÏ~z£ÒIÆ2+íävÙË1Ü.~K,“ìFàÉ«w×o®Þ~¸¹8Our{õîú|* OÞ\ýí’ÞÞÞ\üúëÅÍùT8#’W½x{yCM6ŒñóÕõk’dô82èÍå›Ë›ËëW—çÜþrvyÛ­¥¿^Á.äÓÙoðÉ–ýËg*sfò?8Y&'ë3m3Z©(YýãìïÝ€½VßuÔ‚3©¬q c4³J*ïÀO»bûeÚÔ»í¼˜>X\tS½n©a6MÌ…úõ¦-ë -ü¥ÀWˠߟFkØÔóÅb[4ÍÈ°*eÚ ôÊfd¤Œ¥Ú˜ ñç1Ó×&Zö;7˜° ËJÉ.Œï&¤Og`š´÷yK’fSÌK\Uœ­¬¢J1–ÊÙ˜`äôAOw‹Í'Ç™VZõ²z·ëêýƒŽ¶¥ÞAO'´†ñÔ¨þ|vÜ&9sÙ¡ÛN˜~æR›CS”hŠ%S””Œ•%Åçùj·(«;jDÇø>ÞÁ nÄFtcÔq£‘ êVDÕ‡º\|͇Ôêü8î,p·Y:¶s$Uèý%¾î/H2!å T SŒÂ²Ûò¡XÅ`¤™B¿Öw§…ž‹b™ïVmC¿ê%=Çý8—Ó¼_ÜF̵€+Üt¤LªGÆ;Z,M‡Ád/•—â/ÔI÷'™23(àfˆ—맖ó~5 SÉLA(“Êìoûבu"3æ\šô2,KSÛïô’vG¤Ší£@Žzâ©yZ1œÄ§Y§OY§X§÷Ö¸üÑÉt@θJÓS•Ç'¾ — H{d$Z$“"͆Øóü1=Ø:“ìª:¼Ã8ÛÇÔ*_‹1†¥˜S6Æw¨"0üü¾˜ÄW›”KyˆÂ—zSlóÖC¶7_€P­©‰ŠZÀœÌŒ; ‹‡ráN,…JéØën›¯×„ˆÐVVmu»Ì1²QÒÖô¤$i·%4±ñ>¼xs eý§0I€†Ðà»Ñ/Bjx)6÷ÅÊ5ÔõIünxʯ14¼ÍK¥7¼êÈKöÐä`¯„³€ßª”òr•ÏVÅØ6e¡©5_ߦT:=Ü&˜‡æ ÍɼÞF­+ª/ØÞm¨tÁ_o^âî¥I £l˦@8v<)ƒÎÈ|%…*¬ÒQq ÷¸~¬†¸<iÔïIzy¼ø=ÂWå–Þ¬1ʼ¤÷ÿ¾îˆO¯ïó`+ø6®ëðhƒMÖùGŒ+žB Ðà/B“»}m‡÷Y5»%ªbÏË¢j¡èyùŠjÁ]‘"õ‹ùn[¶{žætrAMV˜[ µ \þ»ˆm›¢Z„¹ëŠžù¶¬wA¸É§c„œ, ª}…Ö"™í0&€¿£1õñ%ð¥ûr†ØŠòçT ½ÁKz6õ:H"£ó@òÑ…Åç|½ ̸AH~@Ø>\_ýS\ŒlèG`ðVÕ-½@>×£œ×ÁÚ»s扔•Ü¦ƒµWDaü|í}½‹3у§ßlËÀ9c€¨˜£(&Ò‚í¡¬ÀëŠ.ëüY:¯è I€¯ Â3>¿`d|Äsà ¨Œ{PI³c%ùUx¸'¬0áÔ®cJ™Ãs½öEŽ. ®¶pü-ñâhgÑRî) -è¢Æ‹¼x¥ Õ~üxÐ-oa7Ãñ±Û:O:€·¾ ‡0”DZËÀ"BS½ÚQ"Äž’Dþ²(Vy¼HBZ.(¶1‡°bîIT¹Æ¥æUÐöø ÏCüí®4xg_’ÑñpÑ¡è<ÌójxWÙäË"‚ÑXÊêRý¾¼éã…o®JŠÖ -¨Q;zùù¸ÍxÖ­ƒW%¿áN£»ôyö¨Ï¿Öp -ïðZcdÄÜÇiþˆ}}õg1x™ußvx–ÀÁŸqä ¸Óc.vsb&Ƕï3„í¾F`Uö9‡YõjüŽ»ïÉmaŽšLiv›pÿ -Âœd~0/ðÁO:›b[w% ÒìGêN(8k”>ÌO’€>wFp“DYU?†Ædzáù54ÏŠyNð -M´Ë»†›GFjM¾:‚áµ S-Å#£†6ª, ™Qz3à±ÈÏï+œõî(݇ƒL0 Þö¤ÃŸq$X4q?|ö8Ø3„CuGHײٳCTñ[‡ªôËÐ/§Ç&ßóÝ!òÃÞB ´8] -oSŒ|öµ¥Öžºˆšj­!\=}k÷¼ûË—ˆZwüÒZÙà©´9ÀL -ÄQì©5Àhp¼Ñ÷"lƒ¯©‚¥BØ œ™ËŽ|û$•é^çø‡Ï s<û“§Á^âÔìΓéÕ:2fSeúóßRFúj2]e!{„§ÌúÚwÂ'=­^‰Z]„t>Ù׃gŒdZ÷{Žú&j˜1ðŽI™†ÔÚñƒþ©eNhsÚ?}­ãþé´Fü³Û,ò¶ðwƒùÓÊàX`œ;mN§5bÏà+(@´¹ô½ŽŠ‹ƒðÏúKçÿ{ì[4€1”{«Uv|,êÇa¬ð{|Öîþ"Är–‚y}‡tx@(™Jq·¡ä #BÉï¡š±@Hèë°–`í‘ÜÂÿ2yò0&Oe:q)ãXÌ<ù4J¡³L‘Nïݯtï/øéj-'¯kXϤ·¤8î´7°_’•}ÆàXŠÇnÁ-heéž:BŠtßWà‡4´?˜Ð³«0vf -  -|Þ+1pJä •ƒs ä8vëdS&U÷4†˜Ÿ.ØA´%ËsÅýYÌàTNo^¿'ÍÀFdº> )·¯ðo.œŽ¶A¢ô-b†Fú3âþƒ…Æ*£CÝ!9Ý15ÔVW¾F9ú¼€o -çÀ³¡UGl ‘W¨˜ã"¿„ °ÆQV¼G÷‡'â [ŠÞM“N² w+x’¤ÚfLºÌM( Ä'¦°Á¿“˜îÿžè‡ÓNÖ>2n¼K×þK¨=(à×b7…þ¢cÚÁ Ê0 ÷Ãاu"üÉTÐê™þ?náÒ1endstream +xÚµZßsã¶~÷_¡·È‹ß${ONâKiœÄufÚIò@IÍ9‰TDÊεÓÿ½»ØEÊ”ÎwiǤ `±Øýöh9ð''Ö%.Wù$ÍMb…´“ÅæBL í› É:³¨4ëk}yñçw:äIܯzce‰È29¹_þ“2É­U¡W³õ‹ò!”o`BçxUÎN ðݥ̦è¿ÐRTKzÙÖ»–tögÙªÞÑK³_ÑAÊ™i½)ÛÖ/ßà¯à.l„ [.ŠàÏ%©Ýü@-ƒ­FÎ2bªÜÆåÜÜ^}ýõÝ1~Àz!•!¼RІ$L_ƒ *ɳ,ÇY7â¬?äKp0™I”2ò03Zyuûϧ*@bÜÁ«•`. @¤À݃,¡|ED™{zb䇤 H"!‰H2¶ÇÎd)OÒgÄ"™¤mgB@Rä.?+:OeŒbŒŠ<£¨Èó^Th +wÖõ†¶—€B˜Ûø£ÚoæžGX…ðˆjÜsK13[ÔÈÞ~/I Æ}ðÃù·åâ=5gÓý–ǪXÀ.ÑÜóVdI®­î!N°‰–—N}ˆƒ"S ‹ƒÔ…²3½d¶¼¬”ìÂøn8}:S€›¢%Éy¶²Š*cp£>tæbb€‘³'3Û/·3œx 2‘mt/«Wq»ÿL´- z9¡³‰H­îÏçfì6%’,wCùu Fš‰û à‚"z.ýªØ¯Û†~Õ+zŽû p.µR¾®ð;À‘uÌmS32ÞÉbi;ìd½T^ü_¨“éO2dN€âÙ¡ÖÏð·^5HS©\Ãî@™„]ê€o·«×‘uÔ.ËÒ|¤—Mò4uýNoiwdª“ã(8öÄKóŒN ²Öÿ¯uÇTNæP3•©ƒÂ™Jw®òX™ÉOÂ%Ò^‰•(™æCìyý˜l3àŽUÞŒaœëc*RâåÃÒI¦]Œo®"0üâÑ/Þã«›–+ˆÂ—zë7èÂöæª 5QQ«Àɉ͎Ãâ©\€Ó60Qmb¯‡]±Ù"B[Y5<\Ù( ‡xR’´»šýSl|ä—`´l¾àI¸/À+v£_„Ôðâ·~ƒdyZ¬Iv# + oÀN&çhxÉK¿L Él¯‚ÓbØ*8¶OE¹.æk?¶M9dhêìÇ·)U™nLáCsÐæ€dQï"ŠÖÕlï6 T:‡`C¨7oq÷R:B=—G8ÎD8o¡ÎÈ|%…*¬ÒQ st.ªŸ«!.AÚõ{‘^/þMæCø*¡ÜÒ›³VÛ·ôþŸ·ÃQãéõc¾<úöaã¶n¯6¸é¦xq%R”îÜ%2M‘j;¼ÏYÖìW¨Šy¼(á8·þ@ò5Õ‚‘"õýb¿+ÛOËÌôŠš ­0%vj¬\þËǶ­¯–NÊO0¯Ôÿn^”„6°Œ†—C±Go/$2òSrœ–@ùTšói Ï°ôð,0ÝíÊÛçÿESW€aܱ¬»ÂU +z§éxú²ñz/x¾ 3bˆ-Š@»Gï Ò;Î#ñðOœ [“à°ñALÂçîÂm$2—H( [¬-=¤$khôúøÂ|鱜#¶¢„¼ è`ðŠžM½aId4p ëDúß‹Í–™ z!‡¤G„í§Û›`Š+ÆȆ~0+€·ªnéò¹~弬½;gžIY%\:X{E&Ì×>Öû8=Èqúí®|œ 1ˆŠ9Šb"-ØÎe^×tYÎÒEEoHB‘ñ…#ã#žAmP‚ÔÊâX+`~î +,ŸÚML){|®7¡ÈÑ¥ÒÕŽ¿~/€vú–špOQo½ÓT¼R0ú0þ<êV´°[æpG‘oבto}C7<”DZKfÜT¯÷”±'CbC’È_–~]ôÈ‹"¤ÅáX±»´ÆŠy Qå—ZT¬ðžÇøÛ'\){g_1ɉèx\-¹è<,ŠjxWÙ+Áè,eu„?©aßoúxš«§’¢µjÔŽÏÿà6ãU·>¼jõ wݥϫG}ýµF¦ðŽ¯5F–AÌ}œæØ×WƒWy÷õOäS8ø'9î4sÌå~AÌäÔVà}†tÝ׬Ê!çÐ"0«^ßÀ‰¬Ã{rÏQ“)Í~Ë÷¯ ,H ‚ð¤³)¶uWÒ ð À~¤î„òˆ³V›ã $ èsg„ oF( ŸíBã2Ý~ Ís¿(^¡‰vyßb‹ÈA­ äP!^Kž‚µ\\”ˆŒÚ¨²€dÎ:£ôgÀcQ˜?T8*ÜIº6 Þ¤#œqX q?|ö8ؓáz ¤kÙØ!ª„­CUú÷+è±-vÀ|÷ȇBgÞ[h¡#‚‘'¢KãmŠU¯¾¶tÒ¹sQ3c „kæÎßÚ½îþò-£"ƒ( uÇ/ • žJ›#̤ÐéAÅ.œZFÙ9øM7|O!Â6øÞ.“TB&ràW®ôÄ÷qRšõµNï´Ngqß`6ØOž·¡Ó1B@$O\ªíЊ{ÊÎPY8;ÑÍQÆIyÚ;pQ÷¼wzZg¼µºhé> endobj -1327 0 obj << -/D [1325 0 R /XYZ 56.6929 794.5015 null] +1342 0 obj << +/D [1340 0 R /XYZ 56.6929 794.5015 null] >> endobj -1324 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R >> -/XObject << /Im2 1049 0 R >> +374 0 obj << +/D [1340 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1343 0 obj << +/D [1340 0 R /XYZ 56.6929 748.5275 null] +>> endobj +1339 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1330 0 obj << -/Length 2839 -/Filter /FlateDecode ->> -stream -xÚÝZÝÛ6ß¿Âo•šå·ÈÇ4Ù䶸îæwm´¶¼bKŽ%goû×ß ‡’%¯ì$H€ŠÑˆÎ ‡¿ù ½bÂ៘8øòz’zÍ f²Ø^ñÉ|{s%"Ϭešõ¹~ž_ýôZ¥ϼ•v2_õd9Æ“ùò·äåß^¼_¿›Î¤á‰eÓ™±<ùùæöxz¼¼»}}óæŸï^LSÌoîniøÝõëëw×·/¯§3ጀù2J83áõÍ߯‰zóîů¿¾x7ýcþËÕõ¼[K½‚+\ÈÇ«ßþà“%,û—+Δwfò/œ ïåd{¥bF+ÕŽl®Þ_ý£Øû¦Žù¯ã™iǤ_¢VHæ½Ñãj9l†e6ÏŸ•Eó8ÈŠd;c(긽Özf¹O»í•j"óÆHÜ_ÏY*`[S¥Ç!ØÞ[tp`ôÌX-Opf”ÃÇÝtfE2‡ÿer}º R£?¬sÌ ‡Š''‚qí½"žVzô@øéf+'¯*XϤ·¤Vî¬'8¬ÈÊ`…LO58†sæœrÁà÷Õ&ÛàLRÔÓ™r<‘Ì0AdV.‰È#ϦÈ÷4²¬òÈ_V õa·«à³æI;’7MQ>ÀKê“fÇÑê°_D:[.÷y%­¦Š'UT0ùý‡{ßí -Ø[W‹©äÉü/oê)ÅNý¬}ʬ²j·Ø};jŸÆ[?™‘ÿ͘–– “~Y©`Ö -õ5+ 3ôÙø0À ¼4Ÿ‰+=sR™ï Œ°Î›ï!}ÉBÄxɬ֔ÔßçV™º$ÛÔ-ЪÞ,-`ÊÆ6û¬¬WSðÜ#Hgw$ò4·¯15LiÛÎÅx{._x¦\Y ÚŠÕÓe¡°ÂaGhÆùðèïð·æû‡G‡øô†b¤ -Ã0§µ+ÆÂ),K!eqΓÿTeNer>B$aƒò}ÝÃj+.¥p¦Ê­¬MÖYMÄ6_¬³²¨·ñ½(é¹Ûd!§ÙTøL“U¶(¦rf“59 ýL Lá•2-2‰ØÛ¢‰_«¨„R(²o«C«UœPeKÒÒ¬³f,wöt¢7¢ÉH¢|HÔOu“o¡ýPäy;ºª6›ê1dô0k×U¥e»Ýæ)J©èùgçøNó30:ÕÒˆ¶ =Ó’E¦YŸë<:®S´3ŠšSÝBi&½þŒòŽkDû L•g25'ê_å¿s.ËP,%¤|¤ÉæºÏ64´)ꆨ°“ðõæmd†â8.ÙÎoYÊl›ÓHï?ŒdÜyšK3ã &®ÀPçed¸½›ß¼þ7Ñ[Ð=ä!"  ßHŒ¼>v×y™ -ÕR\¤ñU4oM£‹j÷DaR´€åð9µð áš/Äbïb…v @LÑROÊq­ð‚~Ë—ÄÑÎèû!jº}? Êêdú¢ -Ï%*’¨ûŒIÖùfÉ`<ó²>tnÅqò6P°ò"ÜaíákdC[â·Çb³!êã¡X|À€¡é%º$?Ä9Áð„%f›f_hùl,¶ïB,f‰9ü*µÁ}’Z'Ж5Dm³'"îszÖ»|Q DÑ•8ðX :¤òl±Ž9²eÚGŸjÕÖ¬a|…záL[ü{€&!S yÕS"Š$«[|&e®jµ>~àvÉiRÈ=’7¬¤Á¨v>_e‡M˺¢A8Á€Ç¹OnVô¦=w„°p¾‘Æ~©#RÉE䥘GÉEM*ŠOy´­(i(Ñ õ*{«2DÕs]RCºì6¨Æò³…¸ÿ‘ÄQ3aG*@Õ¾XæäO% é„ :lÄ)œðxÛ›tõ@iÑsÔÀ1@O¦Œ§Vâ‘×Éä_kt‡Ò|Ô Î3Š¾‚ÎóÞ·àþÌ#4 ‹t4šª/M5¦UCË«ºFlDx ¨–“›U1€Ð×5?Éëät +0 AÒšh%ëÆsÓŒgP§ä—AQ2•ÊQvÌM@щˆû V¶UFºªô1*ñmnÁØ,2ãÆÀvj洞À±.Þð¥¨ë n€ÔÅ ‡fvà†|»kbk¨ßaCËØh´åi\6æ³EF…¤üâl÷¡ R¤—»>×ùî£ãBÓ·Ùgmóƒ[>kŠm>+Êg­H -'wiõeK:®S0t -N©ÚrSÞC×Nôº  ú¨SP]r(K:¶ÃçMU>С_ÇüI]`E)Ÿhæ¶(M‡#šUš0%ßo‹ís -öYá†Û\BT.O[Îc~6Ô;àSHND§²E„$r Ç£šv|(ö£Ø¶ôò)Ûò¡dé¢Úì©'Usu¢ñ2šxÊž/£©ÇuM-×(šŠåfMx³Ç±‹–t\#¦ Ñ$ ¹89´åˆ&Ñ¡I Ñ$I+:=wÁöêáØ -à(åºY¢C–0Áé¤ \¢k£D—8˜ë¥Ö¯/—=‡-qÄÖÿ ZÒÚ‹‹Ðês‡VÇu>QU‡æ¶  -j íÁES:®[†Ø‚º§ƒcîM—„þ=#ñ Ð;ÀÂk?UÉp¤P¶ -ÜÔíªˆSSê¶^b/Ô}«ª(E‰û¿h¶’RÂH÷Hõ¸.@ªå:Ÿ­F!mԃ˦t\#¶ !…W¸é‰1GH)ÞBJq>ÈW\ó”¯à9’¯`bÈW¼ÅÍ ùŠ‹a¾â-¼ -ùŠx—D€Y–B „ü5r–€øIuª/¬Ïu`Wèãó}‘mfùþi¶ÇK¶S`YΤ·æ² ׈ `AŠ’)tU#Þo²Oè5%×Ru)†w`fµ,áp¾‹éã6«›°”èÏ—tÊ…g¸>ZÆN,V4S#é.²¨°ËfÍÆ®mæS/t ýpEŠd¼lÁ±Î - ƒØ$´‰V÷NRŠö§Yàñ=‘õ‰Ì-’Õ=®ñиˆÑCáú'°´7DøRÓV¶' ä¦0¹Â æryæ¨--3Š?ý¼¦p8·F ç¸n!’PAUQ69ÖKØ‹ø%D>wnÈrL¼Eq´æWÏE<)âð®å«óEU.ƒtðô¸bîxÉ@Ím’ŸÏ,Z=g?siÜçºYZ®÷tD¤2Î1­\Òßq0H+:½Ã´Ò·àwHú¡Ò%wH©3ð°¸ s~Æþ¥V3‰?—ô±A -Ãê#ÀÈ0Ú!>Àìïâ°'܇íbb>¢9±Ð üÅé4yJ¹#’”‚t‚?5„û]øn`áÊ'0íሕúçW„!bËÅß…º|ˆ?+>p¸nÛú}dI¯‡ºûuéÜ£c\òuyªµ;qÈ™?•Q†áß®Œ4ï~ýþæ?£9þ¸ 9B¹s‡#Å-sÒ§­Qh¾IO-7 -<âd:búÿæÜ"endstream +1346 0 obj << +/Length 2666 +/Filter /FlateDecode +>> +stream +xÚÝZÝsÛ¸÷_¡·£f">Iâ1—8©ozvêè¦ÓÞÝ-Q'©ˆ”}¾¿¾»X€"eJN›tzÓÉL¸»‹Åo?@YL8ü“Ô0®¬ž$V3Ã…™,6|rïÞ_Ï3 L³>×ó‹ïß©db™e<™¯z²RÆÓTLæË_¢7yýa~y;Iã˜Mg&æÑW×oiÆÒãÍÍõ»«÷?ß¾ž&:š_Ý\Óôíå»ËÛËë7—Ó™H€õÒK8±àÝÕ_/‰zûú§Ÿ^ßN›ÿxq9ïöÒ߯à +7òùâ—ßød Ûþñ‚3eS3y„gÂZ9Ù\h£˜ÑJ…™òâãÅß:½·né˜ÿ:°Œ)nÄ©’Ykô¸Z§¢X¬•=-‹ÖqåÉ°b(êp¼1PÆÈÃñJ5‚Y˜Ãóµœ%Ž51Î<¦ó½F;NËL¬2 +ÎŒ’`¹ã¸™ÎbÍá]ŸÈÔLK@Oª¤óÌäóD0®­UÄÔ£Ý^>pß_määm ;šô6Ïú’ݦbÙì ã‰6í,ž¯óéLKeËå.o¨¨Ùæ‹âWÎe¾¤·EEÏØbÕ—¬4‹ÁíÞ Ÿ÷ùPÌ£§YSïwSÉ£EXÖ7(N˜T:ø®Þ¶EíÕÞŽ} XMê îêvMÔÏo?gV-QÀŽƒ“Ywœ¸Í7À'Sl3Q‘7Sx¼Âé8ºC#÷-ŒÛ¤cÞ:…<òóÙv[â2÷®®Ê'Ï^ÓŒ³'Žu@«X°$—Șá&Ÿ¼Ø»Û;!fð6I£Ýü ›®74ÞW[/ó¡(ó{tNw;`ÇhÔ6a1˜5éGÂ׆±±±Ì â«C_ÆLsûmd%1‹ÀÞ—ï4¬8•FL*!¦„}!Ä|,ô7M#1]¥ü¿Fú’Ϥ‘X(¦´±Îäu™y~auX`‚H NGäžÂhG3Ë:÷üUÝÑì·½Às3yÛÕ= KÑéf!·,<Ýe/t¹uƒ0¢„ÐÔ ùOø_Þú0="ýSþ:àüùCD0(wúßÙ©_q*D4f þb¥5|¬Tü-C0µä™o"}ÉgBÄpňâþcžSRÎʦ©¢ZÀÁ´Áv—UÍ +³|î*èùRš@³¥ã°ÖÃã*m!ªÏÑV¬^ªÏ€®Œ_q:<ú'üu ùöá1Ä¡äúC1ÒÏkHÔR:0lÁEÌìe8þYW95Üó)°Dî€ò]ÓÃjGAib¸3  º¨8ŽÖYCÄ&_¬³ªh6~Œ >·eærØW¨8‰VÙ¢˜ +È™mÖæ4õ‡3Å1uV¸!eZ eQ›¢õok¯„R(²oê}åë•_PgKÒÒ®³v,wöt¢7¼ÉH¢|RDóÔ´ù ò<̮견]Fw«\çç¥a“õä¥Ôôü£s|§ùSθ4¢ bkíøåÎ3Íú\§ÁÐq¹˜‚ QÔëÆöWZý‚òŽkDû°™¶L&æHýÛÛñÊK™b¨dÝ—õ]VÒTY4-Qî$áíÕÏ Åq*Ò +dXXªl“ÓL“ïFÒŸ<­¥•~€‰Ë14yå®oæWïþAô4d÷yã;qÈ7#¯Çu^å®úÃÕ·i|åÍ[Óì¢Þ>E˜°¼>§6^!\óå+,ö©"×t›ÀROÊa¯0@¿åKâëú¾óš®?Ž™¾¨Ýs À„ŠdêÎ>c¢u^n=éì€g^5ûέ8OÞ +vîîH»½Amñ$êó¾X|€¡åº$ßû5Îð„-f%^šÜ€¶ÏÆ®7.³DbŽÃë‘6îÒ¡Ý}¨%j“=q—ÓspcĉÇÕ!•g‹µÏ‘ý(“œ3›hjÖ0¾Ž‚Â@½HM(þ=@“ +—)Њ¼òê)áE’ÕŸƒE™‡«‘,66oØrÁa+uŠVѤW'Ÿ¯²}XW4if>n£«½€eÏ!â”Iiâ/uDW\ÏK1’‹†TÞ¹·­¨h*Ñ õ*{Pé¢ê¹.©!]vÔ`ùÙ@Ü¿"±…×LXÄ™Pµ+–tm…ŒoHÇ°v„C$Puy2ø€P×¢ç¨cžL!­Äg©Œþ¾Fw(ÍGÝZ¦Ñ÷‚ÓyÚû1x„?ó­Â"í¦ê D[iÕÐòª®Ñ*°¼¢ï”@¨Ëëšåurº†˜†AíÒš€ðuã¹iÆ2¨SòË (™Jä‰(Ûç& èFÄS+CÕ€™®j}ˆJ­ÜÅÍ›yf<8NmSj!p®‹7ÍaÎ º˜áÐÌ°—o¶­o-|àõ+håPN‘Æmc>[dTHÂ*à'»C\I¡Îw}®ÓÝGÇ…¦o²ßg¡ùÁ#ŸµÅ&ŸÕ³V$I™•±>oIÇ5bʆÐ2[ž¤C[®ª;èÝ^‡ ªß‰¦ +ê"~”ªèگ˺º§K¿öù“(ú\€¥z¢•›¢Ú·¹ŸöhJ©Ò¸%ùnSÌ蜰/éíDåò¸å<ägC½>…äDt*"$‘k¸5tâCqpÅf¿¡ÁCVîó¡d™zµÙSOªæêHãy4‰®‘*}M=®3h +\£h*–å8šb& \ÇÎZÒq˜2D“€ä’Ê¡-4‰Mbˆ&èøDHXÑé¹u¶×÷‡Vg)×uȲ„qN‡$Mà]%<¸Ä¸À\+rÈ—ƒ+>…-qÀÖÿ Zî+ÌYhõ¹NC«ã:¨ê}û [Pu íÁYS:®[†Ø‚º§ƒcnö­$°pÄ‹@ï Ã~ª’îJ ¡l帩ÛsTá—¦Õ/ |/Ô]PÕ”…¢Äí +¨?y¶J2(,/d«>×H®ÓÙjRÐ6A=8oJÇ5bËRø 792æ)Ťçƒ|ÅÅ!_qAù +ž#ù +º|Ŷh­ËW\ óðBÊå+îàå\â³²Ø` äÿ#gAˆKõRoÕc: ¯Àäšø|Wdå “{šíð Û1ªbΤÍYýÓs˜Š “ 4T} >–ÙúKÉÇ x’ LoÁÆzY,ܵܽsæÒËMÖ´.U)Ñ_/é~ O÷áhI µû&‹Mø¤Hº‹Ì+¬ö›;ÿes23†)uh²Uk²9µ~ǼwøÒ2Ž.ñ²ïæ›} ‚±@îúÉÓºO +ð ƒ÷Sþk¤LéÎùßbA\Ùi¤]Ng‰Ž¾óÒª¼}¬wŸhp—UËÇbÙ®G¿p̧VFè(÷îã(’áG_˜ë¬ÚYíAH¼ø³4Þ‚¥Þ<¶'²9’épEÒ½ºÇ5^^ zˆ~ F–ðm ]ee¸û 7؉¿öP†áŸ_Œ€”w?»|õ_‚ô¾ª'L¥©‡»â1K¥M‚Qè~c-7*epUOFLÿÝã£endstream endobj -1329 0 obj << +1345 0 obj << /Type /Page -/Contents 1330 0 R -/Resources 1328 0 R +/Contents 1346 0 R +/Resources 1344 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1323 0 R +/Parent 1325 0 R >> endobj -1331 0 obj << -/D [1329 0 R /XYZ 85.0394 794.5015 null] +1347 0 obj << +/D [1345 0 R /XYZ 85.0394 794.5015 null] >> endobj 378 0 obj << -/D [1329 0 R /XYZ 85.0394 548.8286 null] +/D [1345 0 R /XYZ 85.0394 460.4475 null] >> endobj -1071 0 obj << -/D [1329 0 R /XYZ 85.0394 526.2567 null] +1076 0 obj << +/D [1345 0 R /XYZ 85.0394 437.5053 null] >> endobj -1328 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R >> -/XObject << /Im2 1049 0 R >> +1344 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F62 1065 0 R /F63 1068 0 R /F21 714 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1334 0 obj << -/Length 3252 -/Filter /FlateDecode ->> -stream -xÚµZÝsÛ6÷_¡·“g"_üÀcš8½t®i.uçf®í-Q6§©Š’÷¯¿ßbŠ”(Û™äÆ3ÆX‹Å~Cj"ñ§&I*R§Ý$sV$R%“ùúBNn1÷Ã… -8³ˆ4ëc}}ñÝ;“Mœp©N'×ËÞZ¹y®&׋ߦ©Ðâ+È雟?¼{ÿïŸ^_fvzýþç—3Èé»÷ÿºbè‡O¯úéõ§Ë™Ê5}óÏׯ¯>ñTÖøþý‡·<â¸9³è§«wWŸ®>¼¹ºüãúÇ‹«ëî,ýó*iè ]üö‡œ,pì/¤0.O&èH¡œÓ“õ…MŒH¬1qduñËÅ¿»{³þÓ1þÙ$‰¶)8™K3Y‰L)àdÆ4w`²VcLŽXÄäݶ¨Ûe¹½Tùt¶l¶ëbw|p¥|:ûËŸÑaPazT(#EšáD2þÛÔ%nÏ%A-wçEÍÀM˜oËzÇо­êÛðÑCÃÀ¢ZÒIÂ:T>XûŠŽvÄm2‘;Kç B@Ç <`ÆíÓž@†UQ‹z1²žÊE.qQŒ³.êÇ°^;²`šˆ<ÈÈ‚0pç:Š®\)á’Dû¹ë»rl3'´í:s—G{fJ$inãy7»ª©IôóiÕR›±å‚GâÌ»{`]´;làÑÚr{Ï0n%¦×UÐîªùczx£Ðâ.­9—Qt)yïNkdN¢žDÞ¨pgîËÀ„ªò28hü±J²éÛ¿ðȺlÛâ6ŒnèT4ÊBÔ6{ÌËþè¼ñí‚?‰¬ç¹ÅØ™4ôôÛJ†V%I@Þó?íEË;Ò÷Ì“j!ÕC9¥]«ìˆö–‹Ðnš¶­nVµªý¥Ò<7GbTµ€Ù~©ÔÃÈ+ãrv_3Qa÷ÒëñïRêy5~…Qm¦7û] .|ÔÔ«G†ÚýfÓlwå‚™¢S JÔ)7@6J6¬Š]u_ÒFºi]>ðd»*îËz‡Ý˜m± 3ûKÀ7ìThÄyœ$Ž`.Ÿr½`à0g… 6õCnžÊæç`+lÞgq¸žqcJ1Æ~Ø]™w¢Õé¥ÔÌU´Åª¥«—¦ÇU?Aü£6ˆ‘·¯Ôÿ©šû¡¦m–aè?—IZ4-/U æ'ªõõ¸‹rYìW"FNëÌRgŸ?½~îô™™Ìú&÷ØOŠ$s_lS­Sª£î‘c‰›’Û‡ÞV‹EY‡~h n6aùƒAŧEËæX2ÓÑGànTD4ìIdT¬°Ü Ž¤i€vWìÊ5®RœDøè°úÌmgU}uHø6ºÎ'wï°F¶DÊ -°'îï4{]|®Öû5wêýúÆ{ÀÍ’Ûª¾iö^Ñù›ý ^°â»w¤Iù°…€›€¹½Ì§ûºö7èšz¾ßÆ(6H)5¥PÕèh ÛZ¤ˆ“’Ý銑Éô¾XíK£ÚX5”ËÜØ(ìJŽC\;êÃÌ"~_³>—…—¹Aà"Mz¤$ñÃ&h”ë…DLq»)É®¸ßPk9Π°çžµâ¶¬çaÐ_} 4@º -ožéƒgÅŽÙ‡Èq·ÎŽ #7hQ§§Õá¸åAÁ<°jŠÅPi{SóbÅ`ûˆ°h}V’ Q¼ÒöiêcW kÈøf·C摬ا·ï°FöʉY–dC¼YåD¨AVKi4ƒ -QUˆ ž -:«Mx"à&`öUˆPϨkN.T–yN2üF«î{¼Ä_û²ÝµQ ¸-?Ïô„û_ßµæ@VNªÕjhòyÍ%…Ò‚ýuüîàíÐ ì7Ó`ƒ$Qº.²z‘ -Ÿ“B˜>™9óŒö°žÂˆ5”ÂèÉêö4‰Ì…µF=ME‡5BÆ0‰4Â"óÒÁVò ŒÔ‰Â¨wù;Tò`ΩòHPO}÷Ž£ ‹4t0Odoðý6MÏÖ\'KŽ•ˆ>ÇAš[„¢5ƒ¼ìºÙ•Ü§È‰¡àÒa¡ÉPkŽìúBåBåΕ¶ÐùTEó­Çl¶pY–ö¼‚‘/ò -à–;ñ -C±8Ž,œ\žb':ª÷A™¥Hòì(Àõ>Ï>CéŸYï30Ùõêà3t|«ã±w öSz‡Þ–*xB"ï0 ¦‰4Á—èIé]â)åPV^ÊD¸Ø¤é¹æè#7ƒ”Æ›Ð<}€úO9õà#£…”†Î iIͱŒlH­‹˜›»-3—h[ònã[ ÛÍEf“!—¾Y¨K5¹,Gzð¤ìc·‘ÖIAYù¼<5‘™Gö Ö3T(íH$^Dű0iY£Æ®¤CVV ÖtÌ!2jZ,¡âÑØ%š`3© &ؾ²@åã½eèúÍG Åu9§¢T¢8_ÁÞø¡FKOËrǵ¦œ5<Ì 3¡þÔ™ÿÄ…ôªWãYc ‡rUŒó!Oßöë-è‡b›ƒ|ò èª«&1 ¹bå -úaílúëÛaƒ‚혎q3$ÓìÒ#£¢‰ðj{`Œ¦~˜/¸ð}ÅEH l!΄šf¢c&ð‘‘¡¬ö vÎ.F…nC)G”:µÇÞ3Êb›ŶÕŸªRÙLd‰Œlö'>ÝN.ÕY¤¶ÙŽÕœZ§I$Îógt¤1Ž½Ãús˜áuÙL‰Þí~[ÄéëÏ«ò$ZÈ4’‰¡­ÜKÞâÒÓf>þ#“!lÈtz~-þNb­Æ/†KÍ"uävpC껫å$Ï„ÎàWa[„sŠâ>ô˜˜¤ÈˆÓ¿Mg ~¾œ¥jzÿzzòHš§È‡ba‘'™œü5Yç£=9€ýY<ðß½_ëÉÛ'šôžõWö‡‚ö£Ä•Æš R(¨áÄð—fEVUù*"H7Õ"ŠA.Ï(Ϊò10FMðÉÕy€ âȇ :a¤ÜíXõÐacM£¬S¼ >{t–—r‚]=r-eEÌ/µœþIÿÈШ´©šÞÈú·üu‚c ©“°ò‡é¯kdr"÷™›†O’ò™Úƒ¦‚g"Ÿy¿î°Î²Ù}zZ›œžÓÒI‡ÓÐ:b2¨> y1.Ò•wZÎÖÿJ4’#§¡ù™a8è<視¯¥©M("ý}RØ -5«¢{RãgzÀ('Ï ˆRÓ³)‘–”ègªÿ}¬'®.bq`²›½$-2ozó}’k„’áÝYa·¤¼&wœeDR¹­ aei¯LH“ƒw`ô)Ž¡–uèì¢1²ªZÿdæ±ê±DYAÓÒ,ÿRoœšøɲ¨Vm zôw²IeÝîí{FüŽofVäÎØñRóQ’ÉÓ¼%¡/wg½¤J¬0ÖfßÄKæT70î Œ]ü✗Ä2)ógœ¤²J(Ï·t’m.í·÷‘½…Ÿp‘Рiv‘ïýÛŠœ>’ÏiöÜYP)Lªàý$%õ”G^j$« Á4è MB†èÝ»õÎÎëVé\"a4ÜÞ„>å±T’“é‚ö®Ù¯.ÃÓkjÎ×Ë¢ ³0Ø z& -õ'JÓ3b4±HöÍ&D 8e—V³¦ÑÏs@#½h ÁÙóD$“`Ï,妬Ãà~ÓÔ±œ¶¤R·1ˆ ÷ï‹Í¾m‰á~즡ïùT:‹õ‡Œ0±¥l’:[$ÿœø£C‰?ñ‘h3ÏÇ=}ø: û„ôx›ÂÝ°tüçprûÕ¿Ð;ü|I HÓã>…BR›DÒ‰ÀZ|£I~êP%½AÐzÄÿ.:Xendstream +1350 0 obj << +/Length 3385 +/Filter /FlateDecode +>> +stream +xÚ­ZÝoã6Ï_á·s€5+~Iâãv7ÛÛÃu»·MqÀµ}Pl9jK©e'Mÿúû ‡”%YN²haÀâÇÎ÷Œ$g ~rfS‘:åf™3Â&ÒΖۋdv‹¹ï.d€YD EêÛë‹o>èlæ„KU:»^÷öÊE’çrv½úyž +%.±C2÷ç¿ûéËÛËÌ̯?þðér¡l2ÿðñßWÜúîËÛï¿ûår!s+çïþùöóõÕžJÃß~üôžG?ÎlúåêÃÕ—«Oï®.½þ×ÅÕuw—þ}e¢é"¿_üük2[áÚÿºH„v¹=¢“霚m/ŒÕ­ãÈæâÇ‹ÿtöfýÒIúÉD(ª *Ý#`.…uÎÎ2ëDª1ElÖ¸R¢æû»’.ƒ%²·D¥XBh[îªb³øýPîž»bôÏÈ2¡R4÷ûª©ßà)çEÍUõ¾¼-wDÐ0Sµ4#= +d[üQm[îÔ‡í À=DD–P¨Ê°¬-ë=ßG¸¶\6õ +LUlã›Í`ˆÈ­… I)œµÊ#¹*×Åa³gÆzTðT‰8a­™”é,“Vè\egXÁ@‹>sBN‰r„‘—î6:^Ê\¤/œ`&ï³H*-R#õðôÄå¢ +¨|ž{´>#©‰–ù©hÜG‡¦F(cÌ@0øÀ¶ÜóyÌ~ŒÙÑŽý˜ðìǘ»<ìv—2Ÿ3ïý6„A·fXžIAX8î÷Ó:?Š‘Ön^l6Íc¹â™}ÃÏ›’ŸÍaßî‹zUÕ·zÏEýÄÛꡬyn_mK2(™ Ô¤yÇUÃçÉfÏà›j[…Ý< üd¸5ÍãÖt—$^‚ ß#%Í‘ÒöôâFu[7L´–Á¦9 ó(gõW°V&höYëU/‡Pµû²X‘ )hþžñðÈ1Ó‹·'Œo{¼«–wÌFeŒc6Ò\^ m=^‚¯È`h8L¯Ê_’DÕÄhêZ& šg¨‘å‚$_g3“å#‚œ1'©Å„Ð>oNúPçÍI婳+êv]zj,ÖÍn ºŽmŠ²Xçò,Ô»¢‘f&¢ñ¿¦/¤³B-w—ä¨qæ™WÔ +Lñ‹n¬ª5Ý$\¨勵o¦|—ÎDîLô^Àc±Á)Ë,ü¦´”4fJ/DžÀA3Ìšö›T + WÓ)…`16p§(òõ´Ø9ØË¡3¼Ëü{šŸØX›·–°,÷0ha&èPŽû@Uw !à6[Bz®JLo«:€³rz耞àåª÷Ò’˜’÷xH“ä$êv¨ágù¥÷Q|ÅÛàZdTýµÈ€©÷Ÿ~ä‘mÙ¶Åmõ3Ø|cYöG—l$W¼$’žçVSwRÐ?ào^)Ni£=¹/–¿Ü‹–O¤õLÄtp²F ‰rŠ»’Ù÷–‹ð¼oÚ¶ºÙPD`M˜çG ‘˜”C%k¿Vê™KípNß6IF¯ôzLFxYA½oÐó›Ã> 5õæ‰[íáþ¾ÙíËUði ²r¨E7ä†eÈ°)öpÇ´Nܼ.y²Ýehz‡ÝXhßy a¦qÏ„$†A4â‰ÿyÆM)ÅùµCbÔ‰V§—t·ü,6-±>Ñ=ªú ¢=ƒu!õ÷ÕÒ5m³Cÿ½´2´j[Þª. @LÏ^ÈíaÁ5#1q{°3KùnŸ‰$K²¾ÉûIa3÷Õ6Õ8);ìž8V¸ ñEƒKïªÕª¬C?< ~܇íK‹6f7O¯ BÝ mw B¦Í"rÈ´K¿îË-Xy6ø@fIq•y>øèC>:¨>qÛEUŸD |±óÙÓ;¨‰ãQ‡4”üÚáù^I³»\‚:]T6åô¬ê›æàõ?Ù Õ V|÷Îühù°…7rw™ÏuÍ™ ’Ø ‰—Ò­Ž©¨VÈÀ³¡ ëtE'vþPl%7£Ú9”Ë\›(ì2™†¨5Q)÷Çšõ¹,¼ÌMè—D§#%‰|‡M–* +ª¯„q{_úD +ÍÃ==CœO ÏkÅmY/àg- Mb…7Ï€ôÎÁ“bÒ:gÁk•L7hQ§§ÕñºåQÁ|cÓ«¡Òö¦–>“¢â aÑö¬™<νT èCW jHx$z§µ#2‡lúÙã;¨‰ó‡râD–Ùlˆ€× #{Ù8u¢•x¦Ñ *D=V!jõTˆÀY…h«5nd_…ôŒ +±æäBf©rž“ ÏÃhÕ}·@²ÖîÛ(ü,ÿX"è ü_ùÏ95«ÍfhòyÏ5…Ò‚ýu\7(% U¥S ÖV#Íî"«W©ð9)4 +§V/Haê)ŒPC)Œž¬>-L©\£åóXtPh “H- 2Ÿ!La™ôJCè+ƒ¡4$“£9§Ë"µz²è»wY¤¡›y"{ƒõ»`4=Ys5NÖ+~ŽƒsZ\—K*Jµ!Š“ð匑öw5ªXzZ—{®5å¬áavX˜ õ§Îü[Ò«^k`dµF4ÊU1ṙ4¬í×[ÐÄ1=½™ªÔsýݦ¡"Wl¼SA?ìÍzÿ™G(#3,ÕùúÚ>!H8õŽ{Eðôx&Ç*DÜoõ‹U-yþp¿‚æPÞ®.µfz71¸ITF.ׄ:Ÿêòû–{žaÊzpìÌm0ÏÎq³ñˆ`,:34£èQ“Å ­C{ÄRlðüw¡1”K¥ÂÛ!2/—қЦ—»u± k~QÊ,7M»˜º‚D¢6hŽÚá8X}L”þý¢-®ï¼9Ì%ÚâžÅý}Yìx´ªÃ9wa¯áÞšöþÇd­D¦ÂÊ4ºaÿÆjÑiþD9.&Qã‚0@2<°NÂ\}“'²Ö1‚ÒD®QÐ AÐw¨|þMa:¯Ö Ð-ò… Àå/+*ùqÌœ˜@4?M7/ŒµÏ½wÔ Y=;UÄyÎ쩤‹´YŸp@ÁvLŸ ’)véÈ(…h"¼µØc`à€©æ îFüPq;ˆ3¡æ€™è˜©ùÄ@ˆP6‡ðÖÃŤPÀm¨¯¥ˆ‰JÍØ{F™@ÌaòQTöXíïªú¹*•ÉDf“HfãÓ“áäR•u_ì¦jέS‘óô™Ü'É\Œcoà°~fx]6ÓC¢w{ØñHâëÏ›ò$ZˆŸH Êò›®—>à@ˆKߣäÓpÀÈd2`}v/^—`¯ÐŒ+†[-"v ‰PÉæÉ ‡êxµžå™Pü*dlV\ûÔ#¢M‘5¥~ëÎ@üp¹Håüÿj~òe Õ2Ä¡›ã²¾7û}92ÎG{É íïz¤øæãVÍÞ7¸Ñ¬©°ñ¢¿³¿”pôÕ‚6¸'—…Y(l6dU¥¯’!nrs%¬Üäò<e€ÙT>ÆHx ¿†Gƒ âȇ :a¤ÜïYõÐacM£¬S| >{tÖ—r‚]¹Ž2Š"–—*™ÿFdè€Ô‰ šÔ EïÈú\þk‚£AÚÔ%°òÇψþšX#“³(sS©€¥záýµ4¤ÓH—Ÿ«;¨3†lñž„Ö:§×ié¬Âih¡&T¼h— éÊ;-gëü1ÁDŽœ +„æ_e†S’ø®ŠûæXšºE¤?O +[S_9À•Ð Œ‰o¥¦gS"*±Û,±/°®õ ë"&ûÅkÒ"5ôÎ÷YD:¨ L†¼3Â8˜ì*oÉg¡Tîjÿ‰ÎÒ^™&ïѧ8†ž¬óg‘MÕúWfªžJ”%4-í>þxµ7Nu\².ªMžüÁ rݧTÈDïøÎ̈Üi3úPæµQ’κÏ~â;*Aqî+Gm}š8Áµ¤sGù Èã硈/`”Îa]…ɱI@ÊšœŠ~øTòõÿ¤a´Pendstream endobj -1333 0 obj << +1349 0 obj << /Type /Page -/Contents 1334 0 R -/Resources 1332 0 R +/Contents 1350 0 R +/Resources 1348 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1323 0 R +/Parent 1325 0 R >> endobj -1335 0 obj << -/D [1333 0 R /XYZ 56.6929 794.5015 null] +1351 0 obj << +/D [1349 0 R /XYZ 56.6929 794.5015 null] >> endobj -1332 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R >> -/XObject << /Im2 1049 0 R >> +1348 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R /F62 1065 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1338 0 obj << -/Length 3258 -/Filter /FlateDecode ->> -stream -xÚ¥Z_sÛ6÷§Ð[噈Å‚—§4urî´NÎQnÚ>ÐesB‘ªHYu:÷Ýo P¤Ùé$™1A`±X,v» ŠOüç«&35I3•hÆõd±¾`“{{Á=Í,͆T?Ì/¾'ÓI–dF˜É|5àef-ŸÌ—¿MßþûÍÇùÕíåLh65ÉåL6ýáúæGêÉèñöÃÍ»ë÷¿Þ¾¹LÕt~ýᆺo¯Þ]Ý^ݼ½ºœq«9̞Ù ﮾¢ÖûÛ7¿üòæöòùOWó~/Ãýr&q#^üö›,aÛ?]°DfVOöðžeb²¾PZ&ZIzª‹OÿéFÝÔ˜þ”¶‰ÊLfZ$™Ui\Ë,a´6KO47¶×²à1-*Ôr^u³n›×íªØ^r;µÍn»(fæXÜòÄdf2\äD”@EDáÖ$&MåX–75œ@ÊP¦b[ç]A¯½xî åCAn”OË•§zðäMíUÙvÅ’ÚeÛ9Rˆ`6ᜠ—?¯†#é­JWaÚ*/«Ö ^/#Ë(–蔥ž|×3$‚ÃeYbE -ÞÁy’i-ž;˜:‘,“žoÙ’ù¶E—œØ®7“e‰ÊXö¼ ©Î[QO6õŒàc3‚£7pôÏ -ÓSE¤Rö¦¬‹ók‹&`­7 -›L -û&ƒ“ji¸ñuºœ)¡§×+y,‹}ëYº9ža»)åïŒ gp0Ú=”žÙ²X廪ó³º&b!3ðš”AÛ[`ÝDúð`K ìo»/ÝnáèËŽžƒá-º" X’ŠL{FO°óÈZi¢¤ -4¿3ÍVN3zˆÃ–‹f½É»ò®¬Êî Hùy#ÔÀÖÀŸ7ÂÕ3F¨H_]¹z:gv -¼Åýüò=Õ ës  ­¤}A€#}™Hm¸×粓\—5djº(ØÔÓªYäõá‡òå’ì®m_A´ti³éʦΫê‰Þýñ#ÍÙ4ÛÎïËÊ3¾+…œ%h™Q¹‹æãžmáÖ1éôæÃüúÝ©w rä÷E nbŒœÎÕãÀ@NO¹k;?´Ùà<® ¸ìx:GuËTùchÛGtQˆÓßµ–&K¸ÊësÜocv,1ˆÊ€×_0@xN<ô‘Û-ª|‡%¥r@€O'¦” ëˆ †2Üxö ÿf?#SˆÈ¢³â^ð)ZËe&<(–k;@ªuQwþµèüª)âÌDYf‚"¾Â 2m_a¹³ h ‚œqi°’—aA[Ÿ  hd/w.ær‰mË岨ýû%ŸúfN_|œöh;AŒÅžtz—·Eaðe½¨v˲¾L#a=ŒÔÊ|½:XƉ Tü÷%yMÒÄ• -I¡4+$XÙÑbB%,Í‚h°óÈiòÄÓ)#ÊLj4}€ñÙÇ€Ú£þC€¹Æ¸t¿ÛæÔ‰=UqÑ2’ §SHŒÒìkr\i]Ênã9.ƒD3=ú,/šÇ€—o†cV³ Ü ê¨%ÀÜA¯zÔŸÝ@ª¬‚ 6u*º(8ÁDË?>„Â_1½:Ñ 0•BÛ‰,±\¹ýLþœ€ã©Ìå`lÔv»=hÁu|½“ØÓd¸­Ày6díöeÄ(äpô;@Š$µL9¡?5B)×SÞl*pjRd€Fáiª²ØRϲ)<=¸5ÚÝfƒ®¨Àx|OÑuÎÓðÅ#4eK ßF”÷ŸMW—’y“ƃzÃüíGò§¶Y\ -6ýŒÕ@¨+TÀ²4r2<èo³ie† u(¶¾Í²g’wœ¡Ggò¹lMš&Œ«겞êµbÕÁ¶†¼Oó™@a”é«@éfÇ2ü\~Ž!ž€dµ/¢+¨VÈó¼"øqQ -€MU÷ô±ÓµC~j›ºÓ^Õ«CÂéH¨¹á‰Ð{²1ù%›nHc9cŒ’&ä÷’&jý ud¬ZhPhfûªçQÍvËÍ S¬Xê‘bzh³~û‘êÐÞ†Ü$lÊåK<Á–ÔŸ_ËÓIiþ‘”3!³3Å,š»UGò>ÏÝBÊ“±ó\¥äŽW—À+uléi³¢8Wåó £“,cÇU2B›6€ÈüÉAÉášÝCÞQ‹_¤s© -ôPŠ‹-—€ÀÓA!’†rÏhtëƒ5Vaz/À )–LN?'ÕˆJÁè8äŠÈa™ƒ8ÜÞûˆq;¼ -ô³á„S?>åë‚D±ð¡„óö~(³d+Ò‘H'€ÒS½ HÀ4‰·e&Ú]ÿ¡Ùå)ùc^Vù]å_ƒ‚q¤/´]m뫦%j—³é»P’åëMUxˆÁÄíh…Uƒ©9¥Ž‘ÄÈ®Ú:¸»OÁv£Ž43Óc›×÷5¥H¥¦Ñ€7¯©ý¿×±Èñ ![˜Ä^Ÿ,¡±Û/1  %ŽŽ¢ß%BTŠ^ÃRpçuØE΄=ÜÅ~Â]ì_¹³hÖ±¼b¯°ý}T¯‹e¬ÃHc•¯Ga tK\Á•ZÂ_ã …£e8œ#ö;µ´ÿ‚ÄEó {$s…+ŒË þ½"0ò©ôPñÑ ’ù8®(šDöç°F“ªèÜÇ¢ 3Þ.jõ€ -Ieƒjâø Lm*Í?Ä_`âr3Á8á ìi {6äpxê§dRèCü?wÌPU±ô{³që,š¦%?„ÕÄBoéü:à@—da©ÁtE–Žl„ƊИZP”tø-WIÂÓKnËÊ—•Ðù„] 1ö¿w1ö9ˆQTÂŽ–;åîµ9`í.é¼t˜î,Ü´¯ý¼Õ@ðlúç®Ø>ÅpbO.¨ Dº’\qØ•ÓctW$'Žô{v/OƒYæhï†Ù>ÕíÞ ÐÞ7»jI“¨j€¾û¢r5‡™ÇŠ$nËÕh—¼·&¼xàýåÔ¢_ºèvH{÷†'iÌÑå÷yYãMWÓ›¦+4^"_mIynQ±éÜyÕ6D~ç‡hŠw -„Â0½©+¿²;Š8Œ/Õ^„µkŸ‰IÁÐ%Lú é»îqGÁÏ]k(‘X!Æ8ssØžâ5Ý@¶Ä·ÛøâÕ¾«—¹³cèr@ÏCŽ†= Û¶xí÷¡xó!× —=º¬¤£iËe± ¡Þ'wùâóž8,#ÕGP}Ó´myWùᶄ¼¢¯HútbÓýå?¹ö™p):2_t|ؘ„„ÌäÓSÛkÿ!³õ6•"ë2zÄG•ÉüÁ'¹ã;TŸ÷æ÷~ÔeÛÍ®óúÉÓ‡¥¡í ~ôqº)€@#$Ò -Eùf»‹¼ -Ùóc^í´C‡/Á‰*›î -ÏÑרˆ˃ë ZSme %ƒ‚IŸ F"(×ýµûò©L*‡!׺ókúÛqh•5è+÷/ ÎØ—‘ÈÕg©L·BÅ.‡ÑéXð&‡pÀ¶¯˜ð%욶êò#\½öÒÝ—÷ùÝSWD‹`ÉTbGÈTûCŒ¥Ò$åýçK:ÝÖ…k(Ùséµu)¸ôeôÇ@cÿU®wkzæûøºnvuY¼í?Cù[ñÌ2³Vp±=Zß+úrßÚ瞬 ÜJ%ÚÈt™QBÆåÙì‚«¹á<ÜXtù¶ëk¬Ç“ $-¶åæp3µ!H´ì¯{ÛòËIE)µ„ÄŠ~.íyúUW\ø›‚³\=ÇÙåéõ•ÔÎ'=,ªüصµHÞˆùOÖõÉ.2ÈÏ KG»x¦.îé#2ŽLã„ï¸.v¿0á'U:Þìs•¤9ýF zA†Sn(Câ\ºt¨ôÆ¥•®ðÚÇYA_‡Bï!ŠÀkåÐ>…NœIÐVØR£ kR.F+xˆ^k!Ðõ†š~jÝA€z“8˜XÈÄšú;„/ËýµsGý­ã…-äðt‘ éÌÙÍÙð§LO?ÔžÁÎ}CÅ­X¤ Ì©Rš -G|¡ÚÓR)„=eÛî²c{°^d;»Ú RŽ.ø Æ;?†‰g>ƒ'P¥¾ô<Ð<÷ ÜѸ8Õl‹6pÁÑijkö4'‹Žâ¢0ø›¥Ñªó€exwIÓ—¢G4ʲBþ5ºÎÙ­7çL$„º<½˜ ,³Ö¼„Õß>'ç~Ó%<þ+¢ÖYúæß{~ UZ+Î@8ÅŠ× …‚ëììmÝ©èÿ½°Ñ½endstream +1354 0 obj << +/Length 3017 +/Filter /FlateDecode +>> +stream +xÚÅZÝ“›Fß¿BoÇV2ßÀùÉqÖ¾M9kßzýp•ä ´¢Œ@håêþ÷ëžžA !¯SÎÕ%U¦™izzzúã×£å3ÿóY¢#&S5‹SiÆõl±¾b³G˜{{ÅOè™Â!×÷Wß½‘ñ,R#Ììa9•D,Iøì!ÿ9xýWnî¯C¡Y`¢ëP|{÷¤ôxýþîÍíÛO÷¯®c<ܾ¿£áû›77÷7w¯o®Cžhß 'áÂonßÝõöþÕO?½º¿þõáÇ«›‡~/Ãýr&q#¿]ýü+›å°í¯X$ÓDÏöðÂ"ž¦b¶¾RZFZIéGª«Wÿìfí§SöS"‰Œ4ñ 4‹$Óük–•‰µb2½,ƒS‘‘Q2½,‹¾c Ë‘þ‹±¨38Cef¡ëh-ŽÇ+äŒó(…1<_Îud„Šg±Öpè†øMlYÓHÅ-'‹´ +Ä#ÇûëÐðàþÁÍé P)t2‹a¥D +k›Ùo31•¦’¸´ÝíÑ +và»Ûµ˜ýÐÀžfÃmyÉáP´Ý—·å¶˜0Ð@2`SVçÛåu( ׂÍŽ^òŸ<¨›Žöe»"ª[DdUWlу:ëÜX·½æ0S·ËkÉœF)m³Û.@P*…ÝÖ.Ïíò 0ÄÕ‘ HÈÈ$\DBëØ`¶Ùl› ¨ÍuP®ªÃ5øt ;Ê‘@y4×<ØÑ„Wik,$òbSÔnp·ij\•uK9µÉ©‹®+ëG°cœÀ2þÙ¢ýönvlž-pŸé ÍhŸxHü˜ض½l‹å¶À×ßvt¨;3:õK•Æ³r6 Šo‹3™€È’NxÌß–B‘F8 +¥±–ÓÙ›E £À'ñ1ºùDòî¹ìÁ÷žÆâ yÍ¢ŸÌY'öffÃEÎ4ñLª ]˜'&2q,Ǻ¼²^àŒb _{õì›õjPtagyP.×ʱ7µ#ª²íŠœè²v9lhÁ’ˆƒwº¸l†í)®ügˬ¬Z§88ÿù2 +ReÌ|¤a¸R\(HʉˆÕ8œ/È”XilÎÄïÊ–ª"äŒ3O'ÿà3ÃãH *—ˆ!×¼Èsç 3ÅÇnGoð迤LÏ5¡ÍÈ‘Rð7•˜±:ŸZtÄg‰$¹Ž] +&.ÕÒtã& ±E˜Í´-8óTûÖ‰´ß8í¦X”˜Š¬ÃÁl·*°¼Xf»ªs_Aþ:÷¢&f@<¡n&¨áÞ—Øß*TAG_vô¬¨ÙôŠŒ¢X¤Ú :ÀÎ'ÖŠ#%•çù…i¶´–ÑCx—ÐcѬ7YWÎ˪ìÀÊ/:¡ŽU$xÆ ‡\—°ç"{uåòpÉí”FNýåå{®gÖç2¹’É3 +œØÓÈHjÃ=ó\r]Öèt’©`¿*jè jYE£Ãt‡SYž“ßµ-¢žP‰FÖfÓ•MUX»ñýÓè›M³í󾬜àyáª3z‚†Rv +*Pª¡‚‹ÏÖVv€¸ÁÝû‡Û7ÿ¢Ñ5è‘=-„‰12x°^=ç‹´ÚlŠlK4äe+“À.SeOž,¶O¢ÿÿÖNø°4iÄEAפûí”Ë$ÒBú|ý—€¡Z+}v‹*ÛaDI©l"À§USJÄ)çz€Êpã‘TU5û\aBFP÷|LÑZ¶ááÞx°\ÛA¦Zuç^‹ÎM ™&‚Y|N7ÄW¸!¤ÌÄ—/¿ÇÌzh ë\¼dçtXdÍKË1š›;4ÖÀ‰mËö"ïe'‹ŠcqêUƒOœ&t2FûôƘ”YÇ+=‡„ñÙÕ€ÚeýUásuéq·Í0=Ð ŽTÅYŠöm¢ÂÖ9Uê/ibc„z õ׃kÿÅ¥&VAaÒ‚'Ï5± +ªIjûÕ¿°‰UÒ@ ù?ha‚¿ÐÀ*•Dq +ì¨ðǦÊ\Ëf“lˆHGœH* @Ž§*m;#yS8~jshw› Æ¡Ïq#¾?מÓcG‹+@Šwé= lßKþ|Ú >¼þ@ÁÔ6®“ƒ0¥R—›²á!›ßüŸ›2™Šˆ«äË@Æ1ñóŒ5Õ‰A RVÿÕ$–ñ\ámBö =Òá]ùy*Û ª}éx6³‚e…ôxç¥[Q.y©öéꦥ=¶ð}MÝyo?€iHÔl ™HÒÜðHh‰Æ'Áò…*áe#‡¨ƒø`Œ`By0õzÈÖ;µ0‘f.ö°ãyRá.ß„¯¦`G ðÙ$i¿ý‰Î2}âqIöÔ”ùs2Á•ôž_+Ójiþ”–¡é…F‹W¢Nôý²ôàNÊ|½³]’=^i,€véHé YÒœ«rXÃè(M™c ›Ù„H¼ˆÔ ‘–ìVYG^ä³0FÞ"eÁÙ1²Žl(àžðÔÏ5HRècý¿tÌÐQ±>é÷nc×Y¬š¦¥8„ÕlŠ…ÑÒÆ; ÀæäaØX‚iéLVäŽïOîÍݬEÛ€f×Y}pü~i Ã~a* @x ]¡R„Çí.²Ê£ç§¬ÚùÏŽ(_°‚WìW…“èz4ÄD +<Õ×´:Bme AüÕ½ƒJ×ý;õ«B™XK&®5wkº›q Ê앹0çÔ¯,"’Çë>Îb+ž5u1ŒAÇ|4Ñ_ ˆcÇ„/Ù`×´U‹põÚi÷X>fóCw~µ×ƒr៲Là{Öß¡}ó_ÌÿœHÅ‘L1Ý(H½7x§”~¹99Sý¿ÓCendstream endobj -1337 0 obj << +1353 0 obj << /Type /Page -/Contents 1338 0 R -/Resources 1336 0 R +/Contents 1354 0 R +/Resources 1352 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1323 0 R -/Annots [ 1341 0 R 1343 0 R ] +/Parent 1359 0 R +/Annots [ 1357 0 R ] >> endobj -1341 0 obj << +1357 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [471.1233 402.3147 539.579 414.3744] +/Rect [471.1233 313.2012 539.579 325.2608] /Subtype /Link /A << /S /GoTo /D (query_address) >> >> endobj -1343 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [389.4645 133.6118 438.2112 145.6714] -/Subtype /Link -/A << /S /GoTo /D (configuration_file_elements) >> ->> endobj -1339 0 obj << -/D [1337 0 R /XYZ 85.0394 794.5015 null] +1355 0 obj << +/D [1353 0 R /XYZ 85.0394 794.5015 null] >> endobj 382 0 obj << -/D [1337 0 R /XYZ 85.0394 458.5915 null] +/D [1353 0 R /XYZ 85.0394 371.6561 null] >> endobj -1340 0 obj << -/D [1337 0 R /XYZ 85.0394 436.0118 null] +1356 0 obj << +/D [1353 0 R /XYZ 85.0394 347.7805 null] >> endobj 386 0 obj << -/D [1337 0 R /XYZ 85.0394 213.7989 null] +/D [1353 0 R /XYZ 85.0394 119.9702 null] >> endobj -1342 0 obj << -/D [1337 0 R /XYZ 85.0394 188.7485 null] +1358 0 obj << +/D [1353 0 R /XYZ 85.0394 93.6238 null] >> endobj -1336 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F41 935 0 R >> -/XObject << /Im2 1049 0 R >> +1352 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F62 1065 0 R /F63 1068 0 R /F21 714 0 R /F41 940 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1346 0 obj << -/Length 3419 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿ÂoGÏT,@$8÷”¤I/6í9îô¡×Š‚l^(R©8]ì‚2%_î&ãp,X`¿!y-àŸ¼6iœæI~å:6Bšërw%®ïaìû+É8«€´šb½¾»úöÊ®ó8O“ôún;¡eca­¼¾Ûü¥qß½ùùû÷ßÿzûê&ÓÑÝûŸ?ܬ#¢wï|KÐ÷·¯~úéÕíÍJZ#£7ÿxõËÝÛ[J™Æë÷¾£žœ>gˆÞ¾}÷ööí‡7ooþ¸ûáêíÝÀË”_)2òçÕïˆë °ýÕˆUnÍõ#4D,ó<¹Þ]i£b£• -=õÕÇ«'£~êÒùicc“èNWM’åS–q&% eiåj8åD.rÀÂSÞ}ÑU¹Svsg)\Ҕ䳅ÒÂÂj²0Üj¦œ/|÷ààÄsíŠ/ÕF±kMOp»Å¯ð[dT·kO÷a~çŸÝ!ÐâÑcçàâµJÆu6n[k¦]uÈð·ïôô€”~òÌsþhx‚Gœ1¤elµ’ŒçR°¿^©<‰3›&×+)ãÜ’kÏ‹‰ŠÃ´Ñ†Zuµ«zÛ†¾#_z¸ÖŠ{Ïœ6Ñû-õñaL'™¨è{·ÛßÀQuŒÕò@]·eÑó”)íŠ×v_J×ñ¬vXƒùŸÄóã·þÍÍJ‰,ì# KTÄL=VuMж¨jm£Ç‡ª| ^¾¸”wFýñÀPíŠÏLu ?²™FǦXס¥ïÞ¶íaGï>|gU%œÝ &þ>Ìó_Ü#Ÿçz¥Ò$j÷Ä¡ï@—èê'jƒØm5Â**§ ÏcÁ8xžøõçV5÷Ôò¬ytÖ€)j¸"^bC ¬ájŸÄÙ3¦HÔø˜ÀÀ7‰Ê£õ…LÁEûo•ECsÒ -ùãìCQu<ð[8₶ÝSÂFC¬¯yÃâǃ|#ч‚!¯/ -å²eü]áÅ÷óDc¬„1JLŠò¾pwOíERÖ¡¸U0¹'†%O¡dÎèE³Y )mœk­çàÊã¡«>»Û«b+šŸPYW®é»…U+c5S#ïÈV Üi±‰ŸyBv7`ùcm…ºì“¦Xç}Ò€…»ø—IíºÓu3!lþâºiaÝ)ÛVÀ Jçë’«PÙÄ%A£9îÖÞÖìža‡¾Ñ‡iƒUò$¼[°óŸyT¦!¨l¸52MÆCJy7ã&Fe•©X£ÿ¥Ë;6^ÚÝfáš z6«uîJD]ùKaÆë•,o‰ú¢ü´gdq ->óòÊiaå)“ Å©f¾4(Èóx«ÐŒÀþVáë7ɸÁÁ÷‹ãá~=1¥HCI1.4ÞjÑr¤!b+ŒýêHã¹9Xi0&M è>ÈršÑ³L!f„ X}œìýÖuíñPònD¡Y2 `e“4†ˆz¢*É£m Îý‘Ù‹,# uÁ"µ=6%ÇÆÞÏÒw’¢ž—%câÔf/øÜ)ÖY -Xç¸<#a^Ø@@ZØÀ© p^ó|tÞ^hdøì56(”DˆäW`ö€oœä›lDçž1£´e’È74x¸¿&àvÂ×€ÿcÏéc|Ù¸#vùt?Z¨89—OwÀzaÏ©QPâq³2VD¿=8Þ Yä3'Hñd"ãT›|n4‹ýÞëf‹Á, -z º½++¤áÃh쀻ÃxÙª¨kwŒåîtZ[o\×sç¡hº¢ Á(ôx%™¢;Ƨ—­y¸8öíŒBéíÿBnD¶e×~v›¯÷ßRdhóÿ!ò⥪î$Ž(ê®%h=8¤Ÿ43S²§LuõWÛ0æºèªî¼Í"6Öæ/ØŒ Ö›°™‡¶ëW4õUÝ­@aŸ™ -â,KíåM X »˜mâÌX9ßÆ{<žÔû™f‘EiË’‰$v„BÒÀ ¦“?儾Ȏ ÒD쇊f”gBçšé~WSNþ¡íI…RƒÇ4s ªvûÚ퀖W’¯ôÊ€øi0´otŠuþF¬y69Éçn|£B·0`-ìaîÒŽJÏ7±°Ëñ’¦; ×}ѸöØi53AHuÛ~:î»Y'gÑ[R-® -žôš¥ÊÎÍÇÚ=5nÃr¡ì*ŸÖæ„b6ìÔœØ3…G©òØæ2dá°/X’DŹzRuIôÚ•!€8yD„&çà£Ôaw4 3:‚ -ÜÕ:ÖU?åj(ºbXå¸F¦ -²ij…Î -œxÊJ’ÁÇîDPûSU·ë§ÞuXiS&ÌË¢ÏE} $¶Ôµ\]‘ƒQ‘>+…œ/wdDjI>+wÐRÞãZ”°c*7ö¬¹½q%kA58dŠ"I!áJÕ‰’£é‚Œõ,ì*¦y&Ŭg´=ɱlþBN>A:¯ëÉ_S¹?«ä@dÂåK+HÏ—žçäc3[û.Ôq'µÿtÔp€©èœžj8ô b ðÝ›_¸³m7„ ùPdkÆÙ¬f<–£)ûˆù3|~š+úWDiNI›Q‹PfqéêK…˜DgÃÁ^._úë­,R›U×–ŸÜ²ÏÍåõgaùSãž+©æëûã„Ði¸m-鶱/„îC0Xª}ß:êà -ß=Mó™¡HÈð¿¡f×oªa“E®/ÁRZ‘rÌå—vnà ª8~׎H®«{6ú&VêÔ´¹¦=Þ£kMž_còIR…]^T$ƽ$CŸ¯Fl‹Òu‹–,‰ó< v©)v‹±$&é‰ ‰i Q‰óäÛ曺D \Ɖʟ¦ 9¸`$³`ºÎkŠVC1®#Î>WGÔnwœ8HІDȹ6ù+óïÇþ¾å烠Èüyt\ù·~‡¨HñdŽ{ñ)Ó„­;tü<ÀµÓtZ;MÏTàD -9èàrLÎ*k6‰ÝÇ-¯ª Uâ48­³µZH¤À}§ZÎ%J&vÉÓ ŸÔä8˜2=5›z\Y›3Á…Ì1~I‚Yú/V¬éñÏ/é‹_´f0¾©õê#g•¸8ç4:Ü*M{"`Í{Ÿä]ÔQ5#wV@pŸd'º·=öGš;¾ßåq¢’|R‚¢âÜXZy(ºàtû¾fCî¶Hf þbž^ývcðtÓ>žÏ¥$h‰™¼l—§Xçíò€µü44³Ê Ä 2ù‹ëX ˜‰u‘Øt¾ªïj;­»Œe8à£1DÏ‘0îc$mé! .Ï„j/ôœV{¡ËsŠq_¦üýcŸA–RбP¡ÈG©ð¥•üÄœ U|~,Å/??â+mC_ÎúZ–@ä¸|‘J~èMÂÃ,†º©§Ñ>åRôà Rì=,9èeR”&‘û²¯B±Û{Ö‚"Èt½X›^S ™þU€Ñôþ -ío%`ÀÑà÷EïîŸh€Ê ÀÂŒ(23>ÈÂ4Rp‹-#áë¿ÛP]$ÑÑ+B vÆðOà+æ|º]àë~b@ó]Ñ Í^¬¹û¾–ÏO ;Ǻ¾†£^î}Ð ]Tñnw„Ír&Ãí"Ø6¾èÐ#K’Ç«DàîîG^j¼_SÑ+8_úÇQfˆ&}rO¼O¶²vþX2Ì‹¡ ô?Ž©£r6q2ýI ö†tˆƒ]*Y­CýØtÕ}CEr飌{w`‚h£Å2w—ÿC;ŽS’…_e¨ðs$Ô„ZFØû<Í¡ŒÉ†z"]±chjm±í_AŸ~YÌõˇ -nºq] UðŒî¸ß·nìÚA8lx›AH%ô]Ó«“¥"Ÿ¬’ÚøûU&Üô¢ÎíÛ®ê+J>”š½"B¼,Œ'?½¦.° °ûš”0ê“7 ©†¶g:í@%¦ž÷L· f°:ØE$öbJTíë°ÅÊ=R-ÎýdPv•Ûš,_aÜh2êðÒÙž> +stream +xÚ¥ZKsã6¾ûWè¹jĈÉÚÓÌÄ3;©d’µµ•C6Š‚lîP¤"Rvœ_Ÿn4@‚%e²år&ºtý øŒÁŸ)é,ÎfI&#ŸšÛ6{„¹7ÜÑ,<Ñ"¤z·¼ùÇ‘̲(Ó±ž-7ÁZiÄҔϖë_æ:Š£[XÍßÿøùçÿ¹{›ÈùòÓŸo±b󟾿£ÖÇû·?üðöþvÁSÅçïÿõö§åÝ=Mi·Æ»OŸ¿¥‘Œg½¿ûpw÷ùýÝí¯Ëïnî–ý^Âýr&p#¿Ýüò+›­aÛßÝ°Hd©š½@‡E<ËâÙöF*))„©nnþÝ/ÌÚW'ϳ(:ž8À˜O Ê"-baðPWå¶ìÌ·/ˆà™D g pAÊý-Oçæ·ƒi»ŽA¨à]ê¶æ ¶Òy³§‘îÉPc›ÿ^n[êäÏyYå«ÊÍåÛæPw‘ã +k¥Z*'ÀÚlòCÕM*d”¥©§9Ú#þVN?–»ÖKîÈÊל-„„ãÓ t ΣL©Ø.·iìÎ CwÿòdjjÑêÐhÍþÙìÝ´]»|Gš%8›?sôÒڴžÜueã–k6SG X¤Dâ·Ö–˜c±žÌ¸/$ü¯h]Œ–NëÜ¢_q.yªP"N#35p¶2îL1qGqI¦2·:òÑ6tq.Åh4¹œQã>Ðúž~BÈ‘nœ¬‹üL1œ¼Žø±4’¥ z©Isby=ÕNWC"§u +L”­Ë"Å9M.Iu¨_U5/eýHÝÆjŒU\ Š×ùQ³Ï»ž¨}m;³¥6™mÛ-†7­A´žÃžçYç[ã98Õ†Ñ]¡)LÛ¢V39h<Ý î‰-ˆÄn"çë¦þ¦Ã&Ÿ·‡Ý®Ùw4ÞÚµ°…âà3¯_‰,ÃXù°AÒƒ Sók·À¡xr-â`$¹œç4ø’ïk{@¶SV­½rK–m{@ ³í€ßh;ÜA¦ÜèGh–ÎúƒÖщwà€§\ÏtGIšÉ3hND‹ê<˜÷T(YÑìÍDd"Š¹ºÂØM0u¼/Ïôã¥GµèQmö™Ó£ HõHxØîL.t$¬÷‡jñDŽ1æè«ÎA‚‘‚;ºó—tàù•K ¨.\Š§²’å]~æRt6{¢ ÆG—’HPÏc:ÌŒ—r·Ô¶×’1+¢#5ÛfÿJíο߃€]ËÍ‚†Ã¥I|†KƒÎä¥ ûÉõÕ—Œ0²æÕ/Ø™¡bè¨Ý‹š?åVËÖÔóF +M‹ûðö%ƒc “?ÚÍI5ÿ´¡1wáKºt€3»[8ªÖQ5n0»È;÷J¸véx›ßG<=·¯#ü´¢¿AÈM¼Ú³ '}‚4lm ¼²Ô)+%‚"Žº‹ÓN=ï{תLþìVí—¶©ð\´† =ïÁol©óíç‡á­²0ÑÔ.@MÈê]@…Á¢ÈíݹómÔöc{ºDS½RÔns@ìÖbž;šœ/¹£±þB;7A˜¯½÷@rg!©¿"ÇbM Vpµ¯Ô<ã Ü1Av`Cßl¾:¸è’âM=/òš¸˜¡&qÀ–=N Þçeë&=ýȧ«À§ko¯Ðr†¸ºq5¹# z›ÆÑos«&(Ï+Í9#´.]£¾OÜÝksb––µ¨O ZVrñ|qÈ*ŒõƒV¹a¬7sû‡ÑÕëÑ«ãå Ò$2¤<‰ÈÄ °”pçyí*¹ã‘û(™˜º/„¬iº¬;³¯ÁŸ¼R°|ÂuLÞ-8¶'ß~Ç•Ðõá›Öõ5)¸‘H¥ìŠI…TçMª§òΤü}cw½¨šÇÅ”yqi¥ò²=Õ„# “Ôv$¾"Cˆ”¹ ÇVmS™Îü"V-màNçEav6Wµ½zí¦k‡¹[ÀUA‘&¥¢Ùîà:VeUv=’&€¼Ka 7åC®n $),]öÿÀZ@“Î:í4JUÂ.ôlG)e öPåN¥6‡:(ï”îTwÏë’’WÙ•,0¤º KžêÜ.Õˆ©+x¢ Ž•ˆëKð`,^H{døèÑ;Hb‹ô&·h9Á©CžÙ·kÍiIR¢Ï‡C å¼TËóôW6vºî¨–‡IDåÓjžˆb©ÔåÓí©®Hqº…T · °Ùù϶DŒÒ"Ÿ9AŠ&ci áÑ8ƒÝ¹b†²¨è‰‚ Ö×°A4ÀÝa´œ +WEÃAërÃךjmÚÎ îóºÍ ŠÂˆ5’¼—;.¹„ÖÊM燮Ù(ÿ'pŸ°eÛ<÷5ð¯ðÞœ%ƒÙ߈»+_ˆë£ˆ¼jj­z‡ä£“z%;ÊS4µ£\åmٞŌ«/i¬.cFHu3z*ÜÌSÓv ™º²…ƒn`°'°!Y”$:½,DO5!Å8¤Š•ò±ŸðxtêñS'óµ-‰Ml‰„´C$¨ƒø^»tž¸7š6H3¯ïKZ0¡,WnÝ/àÊ"ÊÈ?7™F+LÕØ‚Êí®2[XËi¿Æ ÄJEBó+^ ¤ºp£žjœKùâØ €oLa¡‹"ôT2Œ†Y!ÇBL…ë|¸¤0\‡éªËkÓZ¢"«v›pÕï¦ùrص£Ž¿‰zi¹ª4î³ h¢E:†•yÊ+ÃÕÿcÀUwfX™cÂm# á$=Svä"‹ÒŒûÃõ©/T"Ê8“AÍ‘Åów¦È©‹“GÄVp6Jí¥£i÷ Z9MnòrO«² wÕ—\1¬² žöõ€†§cÍ&ŸÂíWV,oâ) N€Ã1£þ—²jV¯Áï  ʼnç¼:ø%644][á)£LŸBÎ;’"µ8;ˆ•bäEé:¡qãÈÊõצ sÍ©‡›rGkH·´Pc%Ai½ŽuOÁ×oõÁážµvÜ&‹3qÙÚCªóÖÞSÙ›*vgíbˆ„AÄ|‘yO5Á}œ–§‘N5f¿ôµÜ þ¯;‡6žõ±ÃH¯ÌÐ^¾ÿÉ 6umú !ë CÝ8Õ‡’4å îƒ'¤¼,=Rꯈ t ‰Qÿ£>iÊ<‰2HZ¯c¸”‘fÉ•úZHuáæ=™Š=‡õ¢mŠ/fæ3u™¿£™` ñ™àbÌß'PýmKN·c>€Ç¶ÿB³oiÀÕ ¬ôôšÍp +õ€Cžÿ†ºm·.l«dnºðÒUyYÖƬ] Ÿ+CK®ÊGýà–?‚~S7‡G4f)ÉÿKLAI«pȪ +4zM†y«É0fk›¼0í$žÅQ–%ð+÷TD‰©zÌ}zZAlb¬ÂÃòMýfb] * {ÇqdõÇÉCIɼfænÝc-EŠ~„6.ýG÷çrmˆ€úÍÖ¥<ÆŸ`ð±5¹/úpå‡î±qŸ¼!Cã·ƒq!–ýÞà¾E”5$ú=±‹~ñs& ³oÝ'W?ÕaýTŸ©Â1 ™hïxÏkDðC‘À«¬}¥X{×u¶^ é8q-ùX£xœNù{†A”>À{(“!lʳTgB ža{Xú +úhYÚñôaû˜`/\n‰Ì]f#uï\éµWj¬œìAöEe=ìÎ 4'9²½Í¡£ŠßðF¿JñyUüréÉÿæ©*»®r@n6¸ÌüÅ8ÉúùVáWÐuó2‘Qõ•“ó6Šðï¤ý¿Z7üîP&p-i< °pDø!Cx¡lé7>õ(î7x§¢ÿ 5_0ûendstream endobj -1345 0 obj << +1361 0 obj << /Type /Page -/Contents 1346 0 R -/Resources 1344 0 R +/Contents 1362 0 R +/Resources 1360 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1323 0 R -/Annots [ 1349 0 R ] +/Parent 1359 0 R +/Annots [ 1364 0 R 1366 0 R ] >> endobj -1349 0 obj << +1364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.118 743.8714 409.8647 755.9311] +/Subtype /Link +/A << /S /GoTo /D (configuration_file_elements) >> +>> endobj +1366 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.1258 451.8816 404.2417 463.9413] +/Rect [347.1258 350.3535 404.2417 362.4131] /Subtype /Link /A << /S /GoTo /D (journal) >> >> endobj -1347 0 obj << -/D [1345 0 R /XYZ 56.6929 794.5015 null] +1363 0 obj << +/D [1361 0 R /XYZ 56.6929 794.5015 null] >> endobj 390 0 obj << -/D [1345 0 R /XYZ 56.6929 585.2486 null] +/D [1361 0 R /XYZ 56.6929 484.9636 null] >> endobj -1348 0 obj << -/D [1345 0 R /XYZ 56.6929 561.0275 null] +1365 0 obj << +/D [1361 0 R /XYZ 56.6929 460.3339 null] >> endobj -1344 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R >> +1360 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1352 0 obj << -/Length 2983 +1369 0 obj << +/Length 3381 /Filter /FlateDecode >> stream -xÚ­]sÛ6òÝ¿B÷tòLÄà‹$8yrS§çNëä\ß½´}€%Èâ„"‘²£ëÜ¿],@¥t¦7”‹Åb±Xì'd>aðŸè4a²P“¼PIÊx:™¯¯Øäæ~¸âžfˆf1ÕwWo?È|R$E&²Éã2⥦5Ÿ<.~¾ÿÇͧÇÛ‡ë™HÙ4K®giƦßÝÝO˜‚>ï?Þ¸ûá_7×¹š>Þ}¼'ôÃí‡Û‡Ûû÷·×3®Së…çpfÁ‡»Ÿn úááæçŸo®üñêö±?K|^Î$äËÕ¯¿³ÉŽýãKd¡ÓÉ+ X‹BLÖW*•Iª¤ ˜êê—«ö £Y·tL*ÕI*T6™±H¹×2KX -Z›åŠã½–Ór B-wóͬ*ÛÎÖ³/;»³ÇÇæi‘𜓘÷‰=Õˆ2g ¼PWöz&U1%A&ifnda7Ý -®/cú@»°K³«:˜zAÀº¬ËõnMëÊ–Ò¯½[Ò¸ <>Ûmm+‚ÛÝfÓl»––" hô®Á2 GäI‘¦Â læs (u>ý1QuvëGB¨…éÌöšë©5‹="hª[9y2UÛ4oêΑ6•Ÿ[5¯¬M½'èñý§žº¶ó®lê6°4^Š×²ªz³iMú[®¬ÝaX8©=œ^p>m7fn |5eWÖÏ4X6[OЬý<![á4”fžl¿ncÚwG¸kèKZƒ»E>ý÷u!@;ÛÒde[Á¡j‚¤È6ô”•­»j?<ÝÍÖ”°s‚SGö?*)XÎ$U’ .=Fž%œC¤`ŒM?ÙmÙ,Ê9ƒÇkŽ’·ŸixWÃM¿ÀýDï‚™”h/Ùe?©ÎûiO…bÎ+kjPï¬ô"œ8j& ÂjyY„žjD†¡£æ‰ÒE6âÑ›°˜öRÐÈcí­a‰6úb«=!›§¶©lwͧî>gÙôÍKÙìZ B ¿¹ž)žzÏ„E-p'ŸÓ×fW-¤…ëæÅ“Ù¯›’p ï®9ÆÔìÈ$EÛì0wQ¥ðØ9Yð¢%ä’¼qM#€¹™Ђ\ûëâyš¥ -ÐóÙû:R²æ S÷+ tí:Ûb¬’¹Ot¸aAŸÚ 0˜gÛÆ‚¹£‹L¹àã¯AYÛ=Ñ–p5ƳêÝW¦\|÷Û•sÓ¹ÀA{Õî`šb,  í®A¦.Ö¥»q@7õ@}zºé}ÊÉìUØî‡Â$c±ê——Ë=ÅŸÑæj6Ö(.ze÷!lz/„åp§¡/'ôÂŒf»ßQJÁ–"Oր䉯œEã”ùJ…‘È3ÚœðÎ%4aAÖŠIq†wæÊ)$lmG$.Ñ‚A4»žLgbSñrª6È[ïŠÞô…:ì|¾û†'2–héeOŒ¨.xb Bq,¡Zºà‰2ɸº,B a˜‡¡(R9”nbfðC‘´ع« BF ¶Ýk³ýL”ýh«n‚Îå6!¤U¨Øœ&7žê“Ü&%Õð.eÉzŸ4+†VÐ{/2gŸøE¯Âï“€Ò)¡ƒys¨-½yÇËѼñKæPdÞ_oÞÈÍgœy#€æìyCxrù´×$Πâ]fñT=º€lƒ‰RÁŒcAtg@¹ÍÅónk|Šƒ%®ÝðÎwá[5f%ïL =½YºfdÀ å¡%c.˜nÞËödŸK¿“ï -ÇÎBÉ[¦ä°@·±-]<“Šò? )µPÛ×ʃ‹²7/6m×ÛSKc¼š b/储Jîyâ%ªªy œž<…oߎӅÖP¢A«MFéØÔ£#ÐLóèJÐZÞPDrÕÑ0Hµ]³!ˆvê‹—PnÄ禨gºP±¼øð÷L±wx5T+ŸyJˆ$Sâ1/¦:óz*êç–Ðþ ÑöËÎTø6’r_!±%ʾ ä|Õ4­õ, }j0qö@IïqˆÃœ½'ÔáÙ£_-|]è]Æñ©ˆ{‹%FÁ§%6D`üß‹Ã "¤€—Óc[/©GöãTYÜß,¨dš)Y@œ=/¶øÐ90f®›É?0xñEëv gÇSëæ\$Šƒ¿*—ÆL7_H¨X’i&þ†ßPA›”| ¡3ÌÓ[äy’Cì ÷àž«dNU–·E÷¼¸.Ìá7sïa0lñ•Éõý08”[³4çÓ[Zq`H³ -ꈊ֒›à„­‚á k¿•iÛò¹¶^¿TÁ6ÁôÖ5˳Š"=´”û¦žÕöÙ?Æ Ø#_ˆÑϤmhXòÉ´a™«Æ…«üË-¡6M[RKN ‚{÷T®¢/K×–ôŶ`„“Ond9,Û±8áœWj¿؃ÈÛŽpcåçt/EÆ"úU³¥ßZb.ÑÑ¥‡‘Xýu¯Öýš$¥ßÅ[E´Œî-.:Þþ zYô'¼//%öJcoÑ}‹~›¨Cl|Wƒ7çxÅP0å¾"ŠÃþ¼T¶áØÉú&þ¥ f±ðoXžÚ¦¼!Ñ£°Œ i¬‰]•¨‡¸]Æ|S‡~hªÉÈŒC3äŸaÉ ;¨`[çÆÌ< _Ú~ïGö«ÁÒå E ŇɘëDjÁ‡Ya–A&ÿÃZȤÀŸxGçì­~7¦“¿q(ä[¡Þ™ÃÄhÞòì $rrÐßù·û±iò´–ˆÅ;²-}N¦—8×qòð ÎèëŸÄtÝ8Ãw€eÚj¤À¶¿+ ¸È4m& °Ù5ýxKDš&ø(°Ó%Ù€R[%§…R)¶[Ñ4‰ €ýŠ¿)ÒëPbAtTÑcNE•T8ƒ˜NÔÐáãîÞöaMéytÿut¦Êš`ðo½ ¶IÎý}L%åèÏìl,ë/ÿñÁá/3éZ‹ñ>‹c-Š¼—Ê•¿üXöTê$Õ"þÔüendstream +xÚ­Ërã6òî¯Ðm媃'G'ñdJ&³Ž³{Èæ@KÅŠÔˆ”=Ê×o7ºÁ‡DiR•-W™F£Ñhô €äLÀŸœ¥6:3³$3‘ÒΖÛ1{¾n$Ó,ÑbHõíÓÍ7ïu2Ë¢,Vñìi=à•F"Måìiõûü»Þ}|º¼](+æqt»°±˜ûðá{Âdôùî—ï~øíñî61ó§‡_>úñþýýãý‡ïîo2µÆ+æpaÀû‡Ÿî úáñîçŸïoÿxúñæþ©[Ëp½Rh\Èç›ßÿ³,ûÇé,µ³7hˆHf™šmoŒÕ‘5ZLyóëÍ¿:†ƒ^?tJƦ‘U&ž-´‰ÒxLjYD‚։͢X+ÝiYÉ)-*Ôò6ÿ²XæË[4ÅŸîtÑdìÕóÙüÕ„z €„ÕˆÄʱOw ËKQ”b{Øb#›çÛúPµÔQ¯™Àmëý‘úÛšp‡†G¯ë=÷~Û¿:@Â>ÿ£!”_é;€=/*Â=[×€qÄÂÎÿ³qUÏ”[FRe¸JeÖ*/sNÅÊK‡ßUÞæ!güzIðÓ¸¿•éÜa»A„¢¢¡®²Øí;„m?4,á·¢,C¿îžá²öß³Bíà×}ÙD@í5¶y{ ¨<úUŠñòžóÆ­Ðì¼ÆµX3Ï+jÿôø™7í>oÝË‘:šš°í&o C‹À¯zý¢UÕLä¾,[¹ì„Vf~Gd¯yyàÁ^ÏðcÍÎ-‹¼D½ÙL$¯Šêe¼(Š'$6ò\eˆÌƒž´=ÝÊ9i艨µoÖ[¢f#“ak¬«òHЛ‘§+öÄàéé'žªßŒI©žß6nO½¼ ôÉßXN\Ó7ïM:p¨“m;T^ÁŽIG¾g“(β†x¯5¡0©ÎäÀýËzG¼÷>@iµxÆÝCøP5ÅKåUE»ïöÌð¿Â +ñe2åPJØ7£ÐX±Ü9ŽÄMû`}´ØMþŠ¦‚W@“or4[¶ÔÎú +ú Qãw ›WÀVW® ¬rÑv»zÏmÝñx­è za^Y8"„*dµË—¸Ó‰°ÓÇ)ÛÜÕMÑ~AR“ò‘¡4óÒ5 µÔÏ õ󷼡ü°ñìè {ïˆ#5×2«šÐÀ%"ÌCE˜œš!ê ê­h7„ÝʶؕAʽ5Kµè¢å‰Avþ;°Û•…yÐhÜ.ÇQ©íÕ!Pˆ.`ZÁn/|Ì$'¾ûð¢ ʈ_¹uR£à©Dt–È9[ÆÆD‰òzJR]N©•4ËÝ¢,šÖU‹Ïw˜HªY$‘]— £ša”Tc¨G, F2pRÍæ$Á$ÍB{]íÚOziOÛ)Ð'àjEÀ¶¨8.°Z©yìÃz”t3XûÊ•³54´Ë¨ÖDJÄú$£.— :LD¨²õö‡-¥ æVÎœ«#"¨‹r'By‰i¡e]µªKîÛÔolóêHÐÓw;ê +¢DQWM`™³”mòn•¦¤¿á ÇO|X½’’ÜžÀ·¼²’oøBÅÔ[îçÒA*˜jÝÅìyvݸ]ÞPÆØ; |Ik°*KæÿF§àÐ:<¹Xiˆ* ?! S”®jËÉè´Ï‹3e•¡ý/”‰2c}šDP]'ž‹mGRBñ- è}tû¢^Kòȧ[‰’7Ÿ¨ùÉc¯¹ä§V«ÈØX_÷Ó!Õe?í¨PÌeIÅ¢`Î5VphIõu:ª ÆŽšD&Íâ±OlÂjÞIA-Æö™ Òƒ¯/Y?7u Á\Î)¯Äód4¯E}h€ +5Œ™UÚûJá·úP®䊰~e²¾8YuÙŽ)ñ‰IPB©©HZú¨’MV€N6 +Bá ¹ŽÖ%)c2.Z&÷ëDÉ©Œ„‰e(sŠêÀŽNøìˆfô©|`Cþâš¡`~éPQFgµ—ÚÖæ̪/,Aêìo[,óÖš«òÛÝc¹ªiö”êá^—~Ç]W#õ¥ó]çS^fVM`{ MŪ_±Î\)¾øørf½Ã€Ø¥dâ1ˆK€ÞäL[qêV\žGu’ÒONcˆzvPÄÀpÓ´‰m¤({¯ºÿê²ûwT¾€tù¾}vy{ÅÿãH§:½.CG5!ÄÈÿéØʱ>ùÑŸV©±°Í ø-¡ÿ¬+&Þæ(s•WKG]-ÄÓ†ú|~A\˜à¸†pÛ|ÿ -Ñy3ás¹ÖÝAa'‘ÃnÂÑ BO£Ä¦Ùبðäã(Ì$iÈÏI6 n€ïcŒ÷ÍÌr ]} 0:Ôø3ŒytySWùsÉC»²àþ4Ãa$NM_IèU>™íðü"ÁcfbÔxT‰¸vð]áÀ¤’¸;¨Þ» TJm˜‡1ÈÚ­.ðŽ}9…„¾RGŸè!ð|›*r7À“)`ÏÐ&¼œª rĆ]‘íA.Ða—ËÃuOÄW™þÊÔê²'vT(£7Ž5TKW)ÅÁÜ`ï»ð-ëœî¢ŒJçwkqB¹ðð+ÄL'ïd{v/Ïħ©µPòÖ–ï1€ÓÆÞŸ˜µ6”ÿI©€Ê½• ®ŠfY¿ºþÀ¸ÎžjãÖÐå_ýZ¬ˆ +¯óèã%6ʲ~ œž™‚o§é"2©e£äÖÕdÆ´#Ó<Ù¾òWÕê4H5m½#ˆfꊗPn ×MQ/oCÅòÊáï…b'Îð–S­|9æÉ,‚*Ð~%æ ¨®Ä¼@…ËnZX.V†ÍÕ 'tü!:ª )NÞɉèÊlPx¸ÛÝQzž™º¬_èfT¤—Ë÷ êœL…€uaÅ|¬íY3©æ"AôEEkÁS(…½0´,ÿ°ÕæñVÁñˆÅvWº­«üqÐ#*úòÃ&@ÙÙæ›,‰bëÙ@½oàŽE3Ò³Eÿøø÷Ìih*ŠSû•`ˆa+3ÆŒ.Œ_ÑQ½«ÁŽAlWÅQš)~ç:8‚^QŒÄg È ¡ù ÑîóÁ¿^iˆØewärS×c9}*.±·§¤Û8ÄaÆ>ª¿ôèF+® +½ kÂx~Õq÷·ëø¾‚Ç¡þõnMO-±æÛ|ƒ¬\ÀäL\Rc±„¬~¤®e‰ kC?Ó·+×x´2]9yšìXÍÂ}L{yƒŒ]Ä}oò<¾b|r,]^MÌÆiâ$x¾ZðK¬Î þMN.ŽW{¼æœ—s‚”:’FÆÅÀxñUó6œez–çö-¥Š Óö3Ó+{»Üœ i8 +DÁÿŸãׄ4pRŠ39Ò›çù^BìK´ +Wjte¥ª´Ø"ý?âÚЇßØ߉A³Ñ„F_r-l"ç÷þY;Àœ%Ô%%gÁWóAÖ> endobj -1353 0 obj << -/D [1351 0 R /XYZ 85.0394 794.5015 null] +1370 0 obj << +/D [1368 0 R /XYZ 85.0394 794.5015 null] >> endobj 394 0 obj << -/D [1351 0 R /XYZ 85.0394 688.9861 null] +/D [1368 0 R /XYZ 85.0394 590.4054 null] >> endobj -1354 0 obj << -/D [1351 0 R /XYZ 85.0394 663.3646 null] +1371 0 obj << +/D [1368 0 R /XYZ 85.0394 563.4931 null] >> endobj 398 0 obj << -/D [1351 0 R /XYZ 85.0394 285.7302 null] +/D [1368 0 R /XYZ 85.0394 179.4044 null] >> endobj -1355 0 obj << -/D [1351 0 R /XYZ 85.0394 261.2794 null] +1372 0 obj << +/D [1368 0 R /XYZ 85.0394 153.6629 null] >> endobj -1350 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F41 935 0 R >> -/XObject << /Im2 1049 0 R >> +1367 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F48 955 0 R /F62 1065 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1359 0 obj << -/Length 3004 +1375 0 obj << +/Length 3134 /Filter /FlateDecode >> stream -xÚµ]oãFî=¿Âo§k­æK¡OÛm¶MÑfÛl÷ÐöA±åD¨-e-¹é¢è?rÈ‘F²¼É]¶ùâp8$‡_²X$ð'&Ó\æ‹,×±I„Y¬vgÉâÖ¾= ³ô@Ëê뛳×ïT¶Èã<•éâfà²qb­Xܬ‰ÒXÆç€!‰Þ¾¿zwùí¿¯ßœg:º¹|u¾”&‰Þ]þpA½o¯ßüøã›ëó¥°FDo¿{óÓÍÅ5-¥ŒãëË«oh&§æÒë‹w×Wo/λùþì⦿Kx_‘(¼Èdz_~Kk¸ö÷gI¬rk0Hb‘çr±;ÓFÅF+åg¶gÎ~î«në,ÿDK•ÊJ5Ç@“Ç©‚%dàÍ}IwZ—›â°íhÐ5Ͷ¹ûD£ªÅ{¾~§E€Mª8‰^,E'"5Û°/M’è/j¶ÍªØÞ7m÷U0®Ë®åñß_bcšƒ|sý<> -ç¹Ñó|L€9"N%ñfíKwýŽ1ªA_S©ã4“6d·qnŒD¥2V™H©Uq’jÇ +⤓‹I¡â3Jáâ=0ED7ð_FGú(“Lf‹TÙ8wlY|\ˆ8Ñ9ŒHÐwà&^_îäâ›®³näÑ.¼î> SƒÀáÙ œ­Mœ[`Ww£4Ô4P‰\¾P¯¢Ô:¶JxÀæ¡«šT.³¨r®­›Ž'vÛrWÖ]¹æ †ä7 ½<ž²K§y,mn¡¤^&|T3“§ ýáE¾L5Çú$3=ð_Š™çkl+“ä½ýi,˜µÞRÿœÛfßm«–ßó‡®è÷õóxáiÈ4P…Aéh.lT¶Mݺ’¤•‚†ß\} ñÇC¹ÿDÝ]ñ‰W°Ž‡ÙfC“;00Èqt@spÕhvÕ¸vÝÒÆ_“\_·Ð‚Ú4û]UßÑjñ¿àà•ûw -WnK¤3×þ˜²ÃƒÀ'h­˜°X;îµåþrOýÇj»åu ©Øn?шŽíûšÆ¡1à÷;»ûj¼ª#w:uýZQÓÆê\DõºìJ¼9ˆ“fù^@ÎÌÅð>·Ä—d@uIοٱz‰Øã­Ð~t,›=#žzp8BH†m{årèîÉ3”^_š›…Q`:ÀÒ ‚ÓâþŽmÓuàÐzøe¸áØ¡ãEr>”+¶#@Œúˆ&‹[€áG®µ‡zŠ’#lÌ~Ô"™§¬E@Ðj[õœò -»%mÂÕfÍpí}sØ®C¸b¿/ê»@†®ƒê„’_J ¶.ë2Ò€ÂÙQKó°¯@Z¯p6,EGëU릲èÐÒ³Â=õ'î¬×Lj[2>²Ó‚逎sêÔ­K”èèrSR[¯x³'ˆ °ìgŽÞ)ˆ»¾kKät_µœb@òÚF…{ŠÐ ÛÒÔÊ=#è¬ñPå/5{ÞNÛ¾Ù³åèÜ“vSõ¯I"ïȾ”k$/É£ÿÜ—Œº ̽ˆ5û1h=[=”í]¶'î~LSV7μmºÍ¢Û’Ú‡rVÑùG›ómʸl69tò¶h=pøz`ºÃ¿ZRA«(ÑÏT­ßêøc½š~l«UÕÍ“êXèç퇀t2…r, “Û¿Íã2Dyü6a%6™É†“Oa3HÁ~9"=ƧˆÌ“ØJ«ÆDž2 lLï -0n'Y5uIÂÂ'ºÇ†:%åªè-ÓÌPô‡€h:ö¨_1Éã}µbÔ.ÂÎ-ï$½ÑåO¤EÂHˆÁõ$Úü4øNÞßm39ns-Û;¤ãÏ È›·?P‡ì¹{A[`ÉxÙbú}¬‘Rb Ã<áÒ¤Á©RµRªÂ x¹»`ŒË圻0þëáàÓ. Ìm®2ûiôŸ¢Q§q.ÓtLä)Ô±ÊLÎü¦Øà lCméŒöœñÃ?×ÅTÒi! 0ŽÃvu_®~'éÑ dVI>±QÅ]QÕ¾¤Ð •† áÆ(mPBšpÙ¸Ã×  {¨»Šƒº‚‹¯;ºvÓêõlŒ÷ÞåJs"‚¥å˜p< -w09|_0Ðméè9zÊ5>–’òñfÉüÕ½sq$Á" !îq|¼‹—q+š™à—Í(9|Wسê˜0( Uµ«ºê’†ƒ! çt8͔ӠÇ3âþA -€‡¶ßÛP > ܼ?æäþz.I#áË|ZV’9¥Ðîš?&3ý¦Ûò®ªkJ $©ùh=DêÒ2]NaB—/Iï±-¨áZYˆü‘©ðÆü”:Ê÷õlöw¬³¡h,sÖF'ô18óÌ„|L/ô -;‘@ŒžéD=•C€“ƒTc¡ÒBàÌ|‚1.C”s9„Šmhz°Ï$,ji¾‘=Æ'ˆD¯ ”Pc"O'FKË ÇxÑIiÎ&`Ÿ¤zVdo ˜Föø-JøøÕi‡31p™2Ð -ƒ,«gMÆœl=!ö,Ú¶º«]¦Ÿ’•…f ·,¨ƒ“õzˆifdÄ[M-Cˆé;†% -ŒF@»ª®v‡ÝÜ™#ÆWïOoN[“ŒŒÀœ[oq‰R³–Ÿt6ÍRw‡QÙ bî¿2¼Â‡¢òB¡¨\Jß9Veå¨vH¨°¶£Q¿Ë¹™ð°I ‘ÁàW2êqÆàúTcÆÞ]ÙÍYœðæ-Õ…‡š×]°’<©ãaù¸/2≠µ}EÚÕ©¶¼ -†­à†%ïŒäþwW‚”ëªü³#¸»‚tPÕŒ†ZÖ˹[‰Ml䋺\ü´‘È1Ñ´±x-5-1EhªEÊz €Å¦£«õ5O€-+®;&v¨§z”’Qry0XQý -F§ý³ÕIš/‚â|{ß<ÖÔ½|w(‰µ Bi…!¿QÑϽbüD1:PLÔ°†)*á:ìNùÈ›3ò诫LæuzÁÅܘ«¹Øª¼!â‡)&£u¡†ñÑLåá:ßj¦¡Åóg†ü[&ŸrËŒžññ0·0²®i† ËûÓ5Ÿî³¥3%–= ­ ‡üŒ™™33gÔjú–Ñ Ö½A¬öüQ¿±±b¼`¬­†›|áOÆßö‡/Šôm‰¢¨1i3Ÿý¥û8ùú5­\¾Ãa$lº{Xê:–¸'î¯ãŸ›¸o¾»¸¢Þ¦Ú{b7wE)—orÊ7ñóMüc|S/ä›z6ßÔsù¦žâ›| ßäËø69@`Ædáu±Þà® 'W2|ç‡=9 ²jE×[¥S¿©R&Æß“ÍTÞ“þÇK/þÙÚð›,[{ê³y ±€„‰r¿h9újÐÿ¾í˜ôÿ]ýЬendstream +xÚ­]sÛFîÝ¿B÷tôLDs¿Èåä)MœÔÖißÜCÛZ¢lN$Ò©8žLÿû ,µ¤(;7ÉdœýÂb±_”˜%ðOÌL§¹ÌgY®c“3[lN’Ù-¬½; 3÷@óê§ë“³·*›åqžÊtv½ +pÙ8±VÌ®—Fi,ãSÀD¯ß_¾½x÷Ÿ«W§™Ž®/Þ_žÎ¥I¢·¿žSïÝÕ«ß~{uu:Öˆèõϯ~¿>¿¢¥”qütqù†frjŽ ½:{~u~ùúüôïë_Nίû»„÷‰Â‹|:ùóïd¶„kÿr’Ä*·föƒ$y.g›mTl´R~f}òáäa°ê¶NòO$±T©œ` S 4yœ*©»æ¾Y7·§ó4I¢¯x¡™Tq.=› çÆH(’3ûÒ-'Ã… :“z´JúJˆæL¤/i “ëýC{æ“'ÒâÙ[ t DŸÅ¹’ÖÁù£¦™<Ø{ˆïÓÎP¥ll5èO¯RSîD[g:Þ‹4`\DÏ©Ñm³íÖ•7º¢sÜ›¶ðRǹ†×±· JGdbÚû¦nÝŒIÒJAÃ7—hüiWn©»)iqÛèx˜uv&7`c*ãà€fç:‹Áì¢qí²¥h4¯®ZgÆÔªÙnªú–V‹ÿß„ÅlK¤3×þ˜²Ãƒ FÑ`ž‰°Xî‘«£>;D\’ÀÐ>ÒˆŽívÛšÆäAr~¿³»«†«:r§Sׯ5m¬NÁû-ˮěƒ8i–ïäL¸7¼ÏÍñ%P]R§óov¨^"¶Æx;´ÝófˈG*c B2lÛ+—Ctž!Þ8Ms3ÓÊ€aNÁiq{˶é*°zøy¸ÁÙÀ àEr>” ¶#@Œú€& [à@xÄA¨×C=GÉ6f?j‘ÌSÖ" h±®zNy…]“6áj³d¸ö®Ù­—!\±Ýõm C×Au¢N‚‰KÀº T»pvTDÅ=ÅÍý¶iaˆ‘¥€¥èh½jÝTíZzV¸§~äÎrɤ¶%ã#;íc9è8¿NݺôH(±­¼ÇÙDX¶Gïä?C`ˆ‚î‹)-'¡-†9Ô ÛÒÔÂ=#è,ñPå/5[ÞNÛ¾ákѹ'í¦ê¿’DÞî8øBò’<úï]ɨ ÂÜ‹X³ƒÖ³ÕCÙžaÐe{âîÇ´1hÅqã„Ñ¢ Ù,º)©½/·h)†Îˆù6õÑv6:tò¦h=pøz`ºÃ¿[RA«(ÑÏT­ßêøc½š~ÚU ˘z®ÂSœI4È.—xA΋äKa,G¨ÞË™íÑàöÐÌA ¦Ú›¹ÞKÚ8©°é¡SàfÑ°:{Šƒ›RvM9¯øˆwÇ•¢ž¢@—‡p€1#o¯SöI*)g*ƒ¨!Ëì·fXk„=Æyˆò0ÎÖÆfz(¤rStŒŒhT`Y!±?ŽÆã34*£ÎT:$òˆ$A)Tª„ç7¦|(œ +bÉ-›¦ŽVu$C°75ÍlopÔÞ—‹ +Õyá<=^ $he‡* ¦ßT*Ž¸[Tg“1ò€z­bp,S¾p/÷Ì Y@<ô» „ŒtÈ Hßs~—áçá†)¿;Æ;ô»@˜÷»òP¯%Hâêðˆ ¿ËPÏQr€-ð» +2æóÂåÐ(†æž:k6âfõ¤Ä„=ÊûlåiÓ!”ö€›]ëñwm¹^‘Öè°%:j Úr•IóAú•_î×Õ¢ê&ÈIu |ÚŠHŒ…lEiHšéï~¡=Æyˆòð… +)nf²ýÉG͈°¤`‘ãsDb‰AZ5$ò˜±$÷jC(«¦.IXGàD÷ÐP§¤Œ}fšŠ È•"ò+&Ắ¹l +;7¼“ôBF¿“ #c,k c¾½·ª pÛLŽÛ\ËVéø2yõúWêPºƒ=w/h l %/ÛŽ*OcÇ!±”ažqlÇ©R<Èà4ãõªªûïŠã߯¨!ißÿ¥ûDyvF+oñ§A ›î–ºŽåGóõð·¦îëŸÏ/©·ª¶žØUÅdQÊOÐOz¾Äo<~Gsà3p‰˜’ÿ5N ¾/‡Sj?õÏaK¥¢,¶`zžÄì©Ìå‡ý…ë=9v_öO1[> endobj -1362 0 obj << +1378 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [213.6732 532.1015 286.8984 544.1612] +/Rect [213.6732 432.1255 286.8984 444.1851] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1363 0 obj << +1379 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [209.702 453.3093 283.4678 465.3689] +/Rect [209.702 354.4169 283.4678 366.4765] /Subtype /Link /A << /S /GoTo /D (topology) >> >> endobj -1360 0 obj << -/D [1358 0 R /XYZ 56.6929 794.5015 null] +1376 0 obj << +/D [1374 0 R /XYZ 56.6929 794.5015 null] >> endobj 402 0 obj << -/D [1358 0 R /XYZ 56.6929 601.5665 null] +/D [1374 0 R /XYZ 56.6929 498.9148 null] >> endobj -1361 0 obj << -/D [1358 0 R /XYZ 56.6929 578.6548 null] +1377 0 obj << +/D [1374 0 R /XYZ 56.6929 477.595 null] >> endobj -1357 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R >> -/XObject << /Im2 1049 0 R >> +1373 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F62 1065 0 R /F63 1068 0 R /F21 714 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1366 0 obj << -/Length 2639 +1382 0 obj << +/Length 2398 /Filter /FlateDecode >> stream -xÚÅ]sÛ¸ñÝ¿B“'¹sBðIÉ“/g§¾¹sZÇN'—Z¢mÎQ¢"Êqt™þ÷îb¤¨Ø©¯ÓñØÁÅbw±ß°˜pø“Ì0®¬ž¤V3Ã…™Ì—G|r ßÞ 3 @³êÇ«£—g*Xf™L®n"\ãY&&W‹Ó7=ùÛÕéåñL>MØñÌ$|úãùÅO4céñæÝÅÙùÛ\ž§zzuþ/OÏN/O/ÞœÏDf¬—Ãgç¿œÒèíåɯ¿ž\¼úùèôªå%æWp…Œ|:úð‘OÀöÏGœ)›™É¼p&¬•“å‘6Š­T˜©ŽÞý½E}uKÇägTÆL&Ój PðŒYmÓIj,K”TN‚ÿ~LLfR1‹$Ï„`Ö}|y°0)³Jfæê®™$Éô¦®ªú¡\ÝÒkñ%_®+ÿí¡¬*Ý–ŸýÜæXdÓ"oêU~஋»üsYoF?؆=ªzž{Dwu³¥Q¾ZtS ë=%m3ßV;š™×«¼ Ç7 “>­ŠíC½ù½=þ¦ç¸ƒI¦%b5é´)—e•ohr[û§#Îôˆ‡·úfð9_,ˆ–¦¡‰¦Þl o¹¢™ ¹ÉT3˾x*.‹f]¯š",+VÛ>Ÿî‹MYxoÜ&õ²Ï§£E)äˆC’#Žè”ʦ7ùgd'óÕŽÈ>[}ÑâL'Z÷ Ó¤IÌ~%6Æšž-øÒ²ÑR1ÂO Ä ¸3Õž}&éìa*§Ç@ ¢<ôâ5 Ö´ì&쟓5LÑNd’oi¦É—E+0¯yÿ á#°<¢}p0Ñ‘ò@ŒVõ–×=Q‡Š#3í™ûÀL°*ñ¨Χ_Ýö‰a©QºOÄW‚p‚B}½O÷~cp _¿ <l8p2ê58ÓT‘—B×,&4¸j//›ÂKâÝf¢¯3ê©$’„äŸw…ó -fº¼¯¶e뜼zÔî¹h$§Ùb{¿Y9Ïå*ø¾jÜÙá7ï—–ùŽ&®=šû¦¸¹¯hÎÙ.áÙRÙÊ ¬ÛÄuÁ2 1¯'r·Ü9xDÚo}<ñ\'$Á§ï ŸWMM£í¸Ü²B¸6AÁ÷…¦4ãReöÃ0ÉPF³$50$&9×íéÛævBƒË(=à³Þeý͇X‘ˆ÷à%éP\zE6¨†i™0¥LÖ£h/Mi¡!dRÂè<•%´‰îû¶“Õ˜ÜÌÅR/ÎVQcÂ…DP -À2IÓ§$l’Ù,ËÆÓµY‹q£$&{ÄI g­»Ý‘¯‹ùˆZHÉ47ÁîJš ù#ÔB?MIXóÊû[¥åi}˜WyÓÐF¦·Q ù~£ª'1-!ùþ4dáJiû|‰Œ³¥“X8áÂî6véFÛ‰ù\–ùH’ù°Ý­‹®Á­‰D= @1Ó‚H‚áñOcºÅøÓR¦,ÑÊ>ƒë¸Ïµ¡úÅ¢^æåjÏÓ€–ZcíŸÇx‹ñÆ•4Ðì1þbŒs˲,µ}λÐ9½d2Ë’Ø7ŒgèêQ=m0!²ÔsÌ… d¸˜¹šÌÛŠ›*ÅÔÑžK´ÒbñÌd>®ã‚Eq“CÔñKšQ÷U]’³?¹ø׸kH¬ºË—yâ ½ÞIë¢ÝË}Ú‹\ãëÑfEÖìû~£„º\PtÊRÄîî æù}S„žÛ.î~uÕ$® 8:9ØåKÚ6žQHˆÉ÷tñZ!W]ZÙ;i%(‹©ÛP„#lZu]»ÀûdÍ‘Ó£¹¿AjBÇ‘ŠÐ9†<9c\ÈAžœWù®é·ˆ;Þo9×ã: mç¨1½/Ƨ;úØÃpä‘’;G·çöSfm¡v×OnI&h{ƒöZà`½.rGKW_ìF˜kðp®”‡p‚éÀy‚Fm6©Ê¢a‡® …ÑLiý¤6”P![£æÜ™¢ÖÁÓ]rX1pÉÝý,&ç=×Öê¨4|¶ˆ0sÐäÛ.¢ƒ0 ñT„1£d8ˆwà.Äô -þÊééP0€S  ÌbOõÃäÓD0®­U§ÜÄËó¥œüT?“ˆ¥€w!v,A(‹›t)¶œ0M3XDÐ-Â9(³؃ǼG›¢*rtNø‚aŸ”~àÈ‚Fim»öpÒïkqÆeb[>†%¤ÇÇ’wý‹e '©hk먽Žû-êÂæ”ÍýzŽ« šq)º•cHŠEpl`pÄࢻÀ‹w¿k§×HÞŽÆPƒ#¬ÃÑu@1sVzÌ0²~NW'ÖߎØ)f[ˆ³ -‹ÈÿÚ(‚—m¹,ö p¹ÌÍÎ×Ëðçs´Ã,â½—×¥]êÁ“,ø©Ë‹[Òå3¼Tà ðìö“$›‚çCìçy‰¶o,èÌw$Iú ¥Y–X9Ö»ç“GË¿§þCCçM4öy2yà6"$TÊ0ÀEǘìÝ<´ÿúÀ"âÿžóN»endstream +xÚÅÛrã¶õÝ_¡Ù'¹Á¸Ø<9[{ãLãmµÎd:›} %Êæ„"‘Z¯Òé¿÷àF‚e«u2† xpn887˜L0ü‘‰3Í'‰æH`"&‹õž<À·÷gÄÃÌÐ,†úîîìâš%´¤rr·Šp)„•"“»å§é»ï/ÿ~w5?ŸQ§Ï„ÄÓïnnÿêf´{¼ûp{}óþ§ùåy§w7nÝôüêúj~uûîê|F” °žz G\ßüíÊÞÏ/üñr~þù«»V–X^‚™ä·³OŸñd bÿp†ÓJLžà#¢5¬Ï¸`HpÆÂLqöñì-Âè«]:¦?ÁŠ&# +ä$R % î„F’Qf5ø¯ó™ÄxJ4ED*D/(ÿ¶?ź©>A“O¢8 i!è3˜á&/.ÜÇ›k£{T¥›Xi]»á»ÁzKŠ2¤ Èp +%©"Jwß_ݺѮÎÜÑoÜ Úú 2xgMh’1šäOÓ{¥ÞØÉzc§ê½¤7ú½Ñ×ém@€}I,n¾ò"ðHÂ˼Ùf«ÌO6iãFeÖXÎpŸ¥Àï¨&ÜÇ‹k8ˆÝ!5¤UæîtN¥œ®ª¢¨žòòÁ½f_Óõ¦ðßžò¢p£‡ü‹ŸÛž5ÍÒº*ÓûwŸ=¦_r#‘ÃèM QT‹Ô#z¬êÆÒrÙMÕnhŒÎ<—¹#³hŠ½›YTe ¯ÙrL ¤§jûk Nä›Þ +BNsƒU$Ó:_çEºu“M埖9ÑcÞªÕàsº\:^êÚMÔÕ¶qxóÒÍ„° §iôÕs1ÏêMUÖYX–•MŸƒßvÙ6Ï<+K¤Z÷ÅsûiyaL=š¡Ó£¹MbLMWé#†™L˽y̳ÅÑW­™éTk_#eŠDÆb˜¯N ‹±rÏV óÒŠÑr1²]0cÔ­X»÷Šº½‡©Ô=&ŸÀóé^¼¥ÔÆ-[ +ÑþY]Ô£Dý)33uºÎzXAxŽû{AägÄèm)<Á¨¬7¸ÏÜÓØP¶Dî˜öbi{L‹ÛyÝdÈKÁÆ=®µ£Ôo£w©îû9<ê:ÏF ¶NfÀ=‡L%a.0y‘ˆ€Ë#Îçuæ5ña»U×õT'Ü"ùù1³^AL×»¢É[çäÍ£²Ïeí@R7C4»mim>çeð=¼¬ŸìÞ™oÞ/­Ó½›¸÷h <­v…›³gž`‹¿`Lv1=ïïÄÔó”y?h}ŠYüx„õ‘-ÙéÂrÍpmÉrî1À”7ikœÆ߀­~¸#„ÎF~ƒv»…˜UFù#š‰„j[7i“­Û’›l»ÎíaF:ùÓ&·ç ¬œðl¹lõà ¬;S$ °„açn±uðˆ¬Þúxâ¹NIO?f>-êÊšq½©òc.‚.Â9‚—t›bkwÙ!N%bL¨G5@ õ#‡Ø 'Èí'ã`„Zò~ +rYŽé]šB'ñêl 5fœPFÁ)F°ì¤jˆ"­”¯…f-ÆYŒÒ ÙcŽjØkÞ¶[¾É#fA)âX„s—û˜°Ì̱qþÈX¡ŸvIXýÖû[P¥Æ¼ >¹DÜ=BAeI<¡ª§1N¡²5ÃIÍäë50Îb”Vc=æˆ ¼#lÓ5mG4æsY'Èg§™OÍ~“H nHì$ÅBS"Ò¸Ó?Lèã BSš É™~…Ôp_jCô›eµNóòÀÓ€•j¡õ'x‹ñÁ4ÐþfLr”Jt_ò.tŽHOUJƾa<ƒ0®Þ˜§î;œ“ ÈpMæ*T(mÍT~N¦~hÎsnNi¶„ÊŒ)×Í‚e¶J!êø%õ¨ûï'“pì/oÿ9î¤æÁv‘Cç˜Sž9H¯÷ÀÒ&kiÙGyÓ1oêo Cœ¶!í9Þäó¼YëŒÂ!\2Ed?‰é³‚­w„ž]ó¼ã/pÂÆÇ +,¥=#a›ƒd¡:‹Æ!ħuvRÿ +câã! 1Ì’±’VÙCê3÷/i±ËZ'½aN)À ØËF 10ÑmråÕ·®š%ˆ ð˜P?¡kuÊáe\l2hõýo«#¸k.åÀ­Ã€ËÊa´BÁÁ„ZBkq$¾r†d &˜¢t*V:MG›«‹j½ÉmaÉà\›Ô`™øÅl^úyK•Bl.ó&·ñ‚áaÅK]®š ¬íÁä:mc¼´Óxgí]PíïG ú{ û’ω­êu–Úw¡ôÿ[DjÄ°ö$ችªö ºeXúFƒÉÙ•¯mÃåÅ’#åÚRוïùùŽùÛ#Í<u +‘Í—¨Ÿª¼¾ v×.7þšÄ9vtéïlfFoLËyNØï›pÉÐÒr®q´ýA¹Ãìû~£Œ»\`°ýZ˜îÞ`‘ÚË×sÛÇݯ®±*“èÊÀÊhF—G»|²mãy%™¡Q’Áä{ºæZ! W]ZÙÛª)˜ + ©ÛP…#b‚s•¼]à]ŠÍ3‘ºG½[n­ÿ1~#!¡s y²B˜PÙ×iZ<¥ûºß">îwŸ r¶ÇuÚÎQcúP§ûùØÁñã‘‘[?·çSf®œŸÜ’”æì ÚkA‚Í&K-/]}±®mÀþBL +Â&ß Õ .)ò¬FÇîä¡(7é#Ý3> endobj -1368 0 obj << +1384 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [353.6787 530.3947 427.332 542.4544] +/Rect [353.6787 434.7534 427.332 446.813] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1367 0 obj << -/D [1365 0 R /XYZ 85.0394 794.5015 null] +1383 0 obj << +/D [1381 0 R /XYZ 85.0394 794.5015 null] >> endobj 406 0 obj << -/D [1365 0 R /XYZ 85.0394 600.9849 null] +/D [1381 0 R /XYZ 85.0394 505.3435 null] >> endobj -1020 0 obj << -/D [1365 0 R /XYZ 85.0394 573.3935 null] +1025 0 obj << +/D [1381 0 R /XYZ 85.0394 477.7522 null] >> endobj -1369 0 obj << -/D [1365 0 R /XYZ 85.0394 447.7048 null] +1385 0 obj << +/D [1381 0 R /XYZ 85.0394 352.0635 null] >> endobj -1370 0 obj << -/D [1365 0 R /XYZ 85.0394 435.7497 null] +1386 0 obj << +/D [1381 0 R /XYZ 85.0394 340.1083 null] >> endobj -1364 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R /F62 1060 0 R /F63 1063 0 R >> -/XObject << /Im2 1049 0 R >> +1380 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F21 714 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1373 0 obj << -/Length 3269 -/Filter /FlateDecode ->> -stream -xÚ½Ërã6òî¯Ðm骃'IϬ³‰g×v¶j+É–`‹5é!){œ¯OÝàC¢äì¦jí›@Ýhô›â ÿ|¡Ó$5Â,2£͸^,·glñsŸÎ8áÄ)c}wöî£Ì&1©Hw£½ò„å9_Ü­~‰ÒD$ç°‹Þ¾þxõé盋óLEwWŸ¯Ïc¡YôñêÇK„>Ý\üôÓÅÍyÌsÍ£÷¿øçÝå N¥´Ç÷W×pÄàãȦ7—/o.¯ß_žÿv÷ÃÙå]–ñy9“î _Ï~ù-VpìÎX"M®/ðÂnŒXlÏ”–‰VR†‘ÍÙíÙ¿ú G³~é¬ü8K„LÅŒŸ 6I*…ìÈÓ„k c,º;çÂD»ª¬Ç“Œót‘ ‘ˆLçG˜A¤xŒu‚—€åxÙ[wÝfŸ° 3&?M8 Í–#Â&åá|JøÖv-ܬQ·¶QµÛÞÛë|¶vYW«º—Å׈¨ÀwŒ° y›”Õª\]YW l’åÃñUÙ÷K»ºÝœèyDX¿2ÍîÖ%±OÍž,e0äàsýùŽÆçŽÓ Bjsž­…ÇmÎyÁ©¶[[­ì*jèrÐ(Ðõ•}(v›_}5¦Ï¥JLÔ~ÊØ }Á%¤"w*ÎpÏmYí:Û"i7PT+ºÀöøVnw[|y.6;{Š,K„‘žÏó“&Šñ;ò䘤9+7Ùi c·€Ë1+¯QsvÀ…å•ú4ýk†±¸?šª|ÊÁݹ…QMÚ±Ú-¸…Š*Û½ÔÍœìšâÁÍÿʘXâ<^Ì•Õ×­Å‘'Û<ÔͶ¨–ö;7bèraª7Ø¡íj\Øâ\eÁdž ³¨ÚÛ´ÉŒ Ä -î3ÕrªÞ‡âÜ“Aš')ïµÒ[™Ñ®µ+„¼‘óµò9($Œ!Ç­œqÓºÒ»€àÔ4´¶-Ñ9ð¥¬úù@+È#LªàyüÉݽ"×tVŒ„d°Yo°‡B‚XÂ?ñg„c´àƒpm I®²`ilÞÔ¤H”2ìàDWox®ë]3XÝç¹H Sâã|YTUÝ!ûmiý圑¼ŠWâÆ鯰„ˆÈœ`'ÚôRn6è#îÉÿ´ån}óJîª9Ï!r‚“·ÁÕøÌÈ•%p\´í¦˜>É|:¯Áé÷G\¿R¼áFX'üQÀ -’>îŽ@JƤò4ùk†þÔ¨³,2@‘Y§!¤ã` ƒ¡Á0/ër¹ž¬ù7Oטö¡@t;«²*šWqªùT·eWB0~¶!<¥ƒŠ¥È½ÙyQ¡eùžÊ Á3Wè^àYWŽh®£k¿à#–!è”Í V\F8‚ž[þ€«·žçG·Å+Ëb×fá -¨_w¶)-‘ïh¹­]Sáû-dà ªt¹îÅÕßáÚ{‹;ºC²©ËqœH™G›ºídP¢-Žâ¬Z¼µ«´gnnZ­v'owîÂnA£×·øôÅM<ú㻡 ø{wpH_ðò(…@šˆàÀ PT©7;ï¤'‡Á«zBi.mÛµ3­2ÈtÒ7âþë¸õXÞÎÊ*nêºklŒ1X Ös’t5C{bc•eSâ9rÇE°,3$À¯Ò=QDèK U‹Sݺèòj®ƒÈ¿îJJ#p–Ì4GO7`Ù¶ÛC ã5ªùÕQîÉ…J¤Ú7Âb¹´Oà““?•Ùæy¥I®³œ‰˜ 5"(NÎm ôi¦%±&y« ”¹¯oóù‚´6ƒM3#Žï…ëìE`X1Ý*ÜÅ -Bt®Ót¬5½!úBBåb¡ OÓ -ËŒ‘0t -Y—WŽ;¤SŸÏÁåCB§":¨”sˆ -P®.h"˸r¤_mwö‡‚ -yn$ÁJB…­œ¸±¾öZ–oŸ6Š" ån Â'µ2·­R“ˆjб<ÿÚI}jXöÐøk - “äyf¼±W’tfŠå ½áÌz,Ÿá•1Ä«rUv¯±÷þðvàØàv”âÙbLàб¬>&ŽM W^Nù¸}²ËÒ•'>òe!ȲÁ·Á ÷mYŸÂ°\ã-€äbqÒ{*|YÛ -Q>\ßÞ^¾ÇQ8xUÄç‹]Wo¡†‰ÑAe,JYOÔµ‹Þ*meJ áµhé‰Ú–"Þá¹z­Šm¹Ä—ÝÓ -6 ….¼î‹^`BË|!M -†m¼RádóHæuói¬0„^ÂᾘÁ-©.v@ãö¹‘2ÿö7Þü@z¬7x8Üê{Ž PòýöD‘ÉwZŒ‹ ýÃ|9}ýäNQÐb,b(æhˆ)˜Û$7òz·qÙ ã!%u`;VJ7°®_ØÔÕ#B÷ö¡¬¸wÏê+Âg¢é}µóý9q3|ât¯_.½Letõ€³¾@ -üÅsù2½‚¬Pê,$V‡:/¥Äaöž°öˆ#š?Lòw -Ìa•o8”à=|6ÃÐí©¢ü=ê,Dô£e)ÜLb{£,cÏäz¬pdÑqU¯ìay*!Õ”™8ÍB5ÃÃÔÝÈ„qHg'Lø4îÁ ‚‡ŒŒ=åsûûäÕø¼§µödK•7õÎÖ_£oÁÈ×]QuaoJõÁI‚Ò¸”'Šçfßç>Nšx¿£¥ôRvëÉTe_€ôñ—ÿ9çÜðq#ÿŇå©á¢o¿Îºp(ô¥È¨½ -1™dJ¥o¨Ðë„ -¬} ->uFtæ:¶â4=Ö #“3C0ô§œ zä>%ÐGŒ5%.ëzCß.z]Øë’k¿ï'ö~©÷L"¤;~Ì6 X¾Ïå?z -%Ô°S1Ò%¨Â¥Üû.×…]¤}¾×"ëÿSÃ2ÿ-‰÷*6§aÄ÷ÆÁftž¿QnŽ±ŽkXµ¯aÝë“=ôQP–(%NsÐcÍ°09­ÔPÁi=åaÐ-£0#Rpûå3ª¼Ü|ÀŸøÞ*y^rþÉhôOðNߟ¢ëˆrgÊ­TôŵQÆ¥ö¢.­RrèQkWñë=·õ¶€[V< Q:ÕZê¹/ªÔWéÔ»à™ÒÓâÊãÔçÚE:(Ñ«`X -OESl-¦Ú<4»@ν­ŸqÊ 9Þ<&õ;L»"ÆgîúñKÚ1Rï7i;ˆÍ˜€w…Çžñ„ç©~CáGX'>`õÍbûnt»Äá»þ#ùì°Çîš×CÜ0xP’ƒj§,U§ÐcÍœaR’§) -¤P“CÜáçPn•Ö-¾@Ý¡ÛÜà€øßpÀ‚þFÙ¾ÈÝ/öû½÷v]<—>E“2ò·,ÃWÚ‡àïÑd$~Ñ…¹R‰ßb )tßL^ KQÆx˜M°„rï±ÿÙ‚#ÔŒ uýbÈË‹rãà®)ªö¾1ýÜî|êËéUp.‡G²ÆŒŠ!CL™Ð*‡:@£BÉx‡â -wˆ÷»ÇÂ÷è½='Ö.0zÿÚ/B` É8\Üí;”„&j7Å3áõÞÜÖ«x®Tu_ZKW7m¨Tº.dÓ}ðÕÊsÈ”™²° FšI‘É€Àk»_QÍè1ëØ_þ±ÖðK6¨­ežùÒ)²> +stream +xÚ½]sÛ¸ñÝ¿BÔLÈàƒˆG_⤾Þ9­ív¦s¹Z‚mN$Ò!©8¾_ßvÁ‰RrÍMí»‹Å~Ó|Áà—/2•(#ÌB›4ÉÏ«í[<ÀÚû3N0qŠÇP?Ýž½~'õÂ$F µ¸½áÊ–ç|q»þ-R‰H–€Eo>\½»|ÿ¯ëó¥N£ÛËWËXd,zwùËŽÞ_Ÿÿúëùõ2æyÆ£7;ÿÇíÅ5.)ÂñÓåÕ[œ1ø8‚ôúâÝÅõÅÕ›‹åï·?Ÿ]ÜögŸ—3éòùì·ßÙb ÇþùŒ%ÒäÙâ^X‹íYšÉ$K¥ 3›³›³öG«~ëœüzà-‘,ãßE–‹Ä˜,'Ëq.•Jsîc€‹†aÇÕp½*Ï’,Ãõ +¹à<10çîW‰Dj®:ËàÎÞï•“°‡4I¦Rî9K2)€sña+ÝÂ_ÜàdZè…:¹^2‹Ï ž°Ô‰@£±?ë ?ñúr+ok8Ñbt¨€8cö‡Rb¤³ ªô%¨Ô3|Y-ã”gQ÷X¶8jìÆ­Å—úŸ¨‹nd^Á35°Á¢4”‘à)K˜P†ÄÑ4KØÒÚ.®›¥`ÑÚ6´iÌW–&š§Šö´]ÑÙ­­:¤·®-1VÕ4Õîžž_œ²ˆf> +‘~dL|]JÙµ{ut1Õ×£p·@¢n#1l,«0"e¢;ÇÞ Ž×öÞá)v›LQ¦%|c;°:‘ +Ò›TFÕn{ç´ÞM:·àž­MZ·ÐÕ8¹*V¸GD®¸c„ Í—€¤¬ÖåªèʺrVÆòˆáüºl‹»%¬›=ê#ËØ­÷VIK>y,K™Ã˜ƒj¢G¹úp;rÜÜ(“N VYg +¶ZÛuÔ8Ðå þP™sb÷Î5àK ŸŽés™&&’è+Æfè –¤B†ÀáNÅâÜ–Õ®³-’vh•0èÛâk¹ÝmñåK±ÙÙSìh#;<ŸçG%)ã#vä!;É1 È”t²ü†Œ¡Ž[@åƒÆ•×¨9;àB‚òÊì4ýj†IðË©4Ÿrp»4 ð +‘‘v¬w+'n‘F•ížëæ.vMqïÖg]á:^œpqb…{}du3O¶¹¯p¸+ûÊͺ\‘ FÚ®Æ-®UöLæ AUûl›6™±8…ûT™œF¾CqîÉ@å‰â½Vz+2Úµ>Š 2rxBŒÁA| + sÈq1¼ôáÇíÃ@£ûº¡©GÛÒ_ʪ_´‚<Âbp=1e2XÝì¡ W僟øá˜LðA8‡¶f•§:X›75)H¡ÙÁ‰¯ÞðpøXïšÁêö8Ï!ü±TüoœC²â“)GÅ~]Y¹0Ö$¯â…¸qúë,!"2'؉6=—› úˆ;ò?-d6U·y!wÕ,sˆœàämp`5>5¹R¢ŽëžØn +Yàã̧óŠœÞQ”ˆà ‚ßI4†:îz¨ éãî¤d $Ä'É÷P3ô§îD­µš2@‘9S!¨q0È‚¡Á4 žËÕãdÏÈǸuºFÕ‡n¢ÛY—UѼàŒSͧº-»‚ñ“¼P,EîÍÎë ”Rç|j”CðÌSt/ð¬+G4Ï¢gk?á”#¦qè”Í2Eãlznû=îþÃzžkœÝ/8X»– Pý¼³Mi‰|G;Èmíš +ßo "Qýû«·Ï/y…{ï,bœ¤æTX'RBö\·”h‹³¸jÀ‡oíºmÆ•ëëÖ_«»“·;wa¶ Ù«|úˆâüñÝÔ9ü¼>ÇqH_ðò(…@šàÀMPT©7;ï¤gó„Ò\Ù¶=ng2sЧoØÙê„(oge7uݵ6Ƙ+ÈåiÒ=Ô í‰AhR¨‰'Ä)r䎋`YfH€3¼J÷D¡/5dT-.u¾âƒ‘Wó,ˆüó®¤4WÉLsôt”m»=2^3¡šïQ­䎌P¤‰Ló=¿]¬Vö |rò]™m>‘—JòLçHÄL¨ÉÐi!ÀâäJ=}2O! (ý=µžÌ}-?ÚÒ€Tñ'*Ñ°c¯l ÜX Dk}¬;”CB­¡T’šÖ¨ô¯èå4”#Rx{Yw( ŽÇ˜»C.KV2• )e¢™AU¹òZ¦A‰·Oß–±Ô!(©±@mJ™ãÍ‚±<ìŠ$È^&ÿL³à´ÅÂ$y®ïX¦)ÿF#@ž +ÛigÖCù ¯|ˆ!^•ë²{‰½÷‡·Ç–jG]/Æ[€šácâØ2áÊË)7®¯äÊùtH´|Lzߦû4f€åçh$;ˆ“ÞSáûó£­äíÕÍÍÅœ…ƒWElq½Øuõj˜”· ¹× [A vÑ;Uу­lC $¼-=ñA˜Ñi¥Ä;<×/U±-Wø²{ZÚèÂë¾è…&2™/„N! ‚Lq±y óº~?V‚Ç/á/fp+ª‹€4ûÜH©ÁärÂÍ"ôPßàáÕ÷ äFöëE&ßi1..ôW ëåTôõ“;EA›±ˆ¡˜ã{æ`n“;õz·qÙ ã!%uÃv¬”nâ±~ÆÁ¦vÝU7º³÷u`Ž{V_pŒqG´¼¯vž¢?'"Ã'.÷úåÒK%£Ë{\õRà/žëÃ"ÓkÈ +e¦Cbu¨óRf8¬ÞÔqóEþ:ÅfŒ°Ë· Hðþ‘ÆÐí©¢üýx´ÛÐ@/f‚*g“¾`ôVd: &Ÿ~)¸0|£ ÓÍ{߇%y X›ç²GØMQM˜EŠøô5±SOÈÃoƒ/Ò–ÀåÌÁF<›|¾v×*xŸÛȹʧ‰<|Þ ó¾‡ò ~ +0˜ÇM7;uè—¦LxgOøkï­ÓÆLÒan¨ñàÅ×>D¹èM^|P½Ø¢i©5".Úû„ຠJ±¡ +ïû ^n&SУ\Xˆ©^ãTY¹<’z<¢ïñê WûƒV–è(¼GZG‚zI‚Ê?¸ÛÅÑØà=hàbµkp¾êö‰t@ÉyÐkšÑê)lÊmÙw&Šm½«(õ­©±ÚÔ«OÔ—ødŸ]#ð¨Œ[4!²Ðt=šìwãeùbÿ- $²Y‡ŒÞÕŸŠá‡$˜pŸé:šk-”^¯`a ÆP>a½¯UB&n>œãÌàññù‚ê>` +ÕŠ¿¨¹5*¦‰D©FaQèrÂ…ßmBSÚ¡-BÐóÝ¢*ýj¯§ý¥hÊzGý w­Í^÷;x}ÔYˆèGËR.X¢2öLn u<“ë¡Â5’EÇU½¶‡å©„TSjqš…j†‡©»‘ ãÎN˜¸Áσ 22>ö|”ÏÁØß? ¿¸©Æçíµ_![ª¼)À¬w¶þ}Ûf> ¸)Õ' JãORž›}Ÿû0iâý–£ç²{œ,Uö>þýâ?KÎý7ó'>¼(O }ûuÖ…ëÄH‘+Pƒv¸o&ZñÓ4:®@h_‚CQ¢L»v­8ÉDtÈÅä¸ Äû ƒ¹ôùâ‘R–ÇzC_-z-øŸ¾ñ¾ŸÒû­Þ'‰èø9Û€Jù—ÿÜ14“P+ÂN¹H‹ þ–ûmü.|æ"½ó]æSÿŸº¥ýW$Þ+לn‘òÓ-Ò u¦”s·Êz?üÏ:Ã7pÈk >âb pOÒSþƒ¥:´ +–©Ä ëÿ%µÃendstream endobj -1372 0 obj << +1388 0 obj << /Type /Page -/Contents 1373 0 R -/Resources 1371 0 R +/Contents 1389 0 R +/Resources 1387 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1356 0 R -/Annots [ 1376 0 R ] +/Parent 1359 0 R +/Annots [ 1392 0 R ] >> endobj -1376 0 obj << +1392 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [289.8576 392.4739 338.5646 404.5335] +/Rect [289.8576 270.8769 338.5646 282.9365] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj -1374 0 obj << -/D [1372 0 R /XYZ 56.6929 794.5015 null] +1390 0 obj << +/D [1388 0 R /XYZ 56.6929 794.5015 null] >> endobj 410 0 obj << -/D [1372 0 R /XYZ 56.6929 769.5949 null] +/D [1388 0 R /XYZ 56.6929 661.3973 null] >> endobj -1375 0 obj << -/D [1372 0 R /XYZ 56.6929 749.8269 null] +1391 0 obj << +/D [1388 0 R /XYZ 56.6929 635.5371 null] >> endobj -1371 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F62 1060 0 R >> -/XObject << /Im2 1049 0 R >> +1387 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F62 1065 0 R /F63 1068 0 R /F21 714 0 R /F41 940 0 R /F48 955 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1379 0 obj << -/Length 3862 -/Filter /FlateDecode ->> -stream -xÚ¥ZYsÛF~ׯÐ#Ue"s`pÔnm•ã؉·6vÖVö%ÉDŒH¬A€!Éʯßîéž!‚RR[ªçhÌôôt}òZÀŸ¼ÎL$t_§y!Íõf%®·0÷ý•dšµ'Z©¾½½úæN¯ó(OTr}{?Z+‹D–ÉëÛò—Õ›^ÿtûöÓÍZ±J¢›µIÄêÛ÷¾£‘œ~Þ|üðîý÷?z}“Æ«Û÷?Ðð§·ïÞ~zûáÍÛ›µÌŒ„ç¯páwïÿõ–Zßzýã¯?ÝüvûÏ«··á,ãóJ¡ñ ¿_ýò›¸.áØÿ¼‘Î3sýÉÒx¿³Á’Ð@ ¾+¶–:#ÝV ˆm„ŒY{›bw}®â:ŽÒLyƒx¬Ð¼ÝªÖ¹eTf`¦¡&_À¯#Ò3’>g*ŠÓÔLõ9(:wwë:1MÄŒKØãö.9r‡K8̸„MæZwLv% -b”"%†ñç‚ c‡M›´a ZÐoZAHØ#ö"aãDRi”¥ b‚­‰Ž -³ç™T \L°5É¢D€VNØø_§×ƒ,4ˆ5j3®wˆ¿»);ß1¢³g~BCÄ©ÒDMÎB“Çí55>Nè_8Õùºä36˜¤GI1îœ-TôyÙª¸8_í¤Xk#c…ÙL¡Ð'C“qjO¢s­Ç2ûµ_Ðeô•˜UÑ+ŽˆUÓBÑã®Ú`XSø…¿tÛ.'!0(y -¶#ØŽ} yàD ì¹@ùâá²xõ®¢ÛÇuúm)Å&éNGÛ89?¨†ðN§Ð~þ¤iâÒ“«DVŸÕÆ¥¬®k¿®I -Ú$Q’©d -c ñ¡iLágj(T‡þÖ6yš†á'&Û-ÅRküt?¬7íþòpÖq~„ÜDrìÚÁ3Ó«moiOÆfØõqç|DêÜÉá€7N­¦De%Ôô>‚Î"“ÇùT%¼a«T_º0°<é W‚Ö€Aâ”ÀŠu[”¶|µ ºØD:3ú¥È W¦*8þ'Z¶ÝW,¡®Ý[»÷‡`©lvvó…ù`Åw2mÌÐøúïøéƒ=¢$¼V`PB.=Qªf‰%Ê´,\AÌ©.›Ó‚E”I™½(A+F÷¹á{^ýP€«Ü 5è>0¹$Ö<Žô 0œÖ(ÜnÉJp^:Óv´OÙÒ©š¶§âp ìÕg±ºpT©$æiÞ$ŽÅãÒQE¤uºtRBé¦pçSÓÝÛÂUž <Å[0Ê› „û€¶»£/1)L”%qþ“±fÂ%-ºÇôÝm~ÇÛQºU¿#Žsôª+öÜr‚¦fmlM„Eçö»Œ+R¤‹NCL<+4T4[F(DL“'/›Y,MЄ¶Ám·Ã± ŠË“pC1°âòxÞî)¼‹]½³{Ž™iÐÏB wè©HFêÂÕDª²Lkˆws²)˜ñ;Ëú¤ Ëf±…àóX•¥ƒY®Üiuæt ~Æ¥S&8Ng\ÕÍÜ•ƒ2r0T5›z(1§áEîǤdOê¯ B]#üu¯6EÝ«øË—°œŽDœÎj)–Š#‘ "\œßªk2ÞäH×ITp|>Aq9Â,%8×?#‚þ]ˆÒc þGèøù(}Lu9JTÎê -DÛ­ý…ÿ>ØãÓ+â ÑÅù9—*ðy6ÕŸÓ(H;àž0ê ô"¡·J_TM@ÆU_¹š )/Žc¬Îï$0V¥y*ŸÃlx/fØßÙàƒ$…Îc5”R¸áØQç - {ˆy‹Æ¶Û˦ɦ¡Q4OÔØ£ 5I¢¡Kª%'F„ozÒPÆùû‚ö¥Qgv~G|õ;ðSsþ>[4°MB€òKk¦£’«È„à®åo–‘Ãb‘bð0ÏJ@›=8@bQ2¾D˜¯Jª„)@Q”e…FâîÖ±F‹Øë´%{Ù˜$äÑT6r;õ€2ÄWÊa°³õ=µú¡a&¹,nBv㞦W29x?¬I…¢®€¬IšY–Â{rý~ëv»ÅZ?WxôTY¯k¸¦0.«J1{)$…Å*Ø_ HÈ€ß2 |C³Ûµƒ‹¡M«iÈhh‡/±±'Í…ªkå8‘ lÏ 9”ƒ_RuhôãšM1'&ÂF¦xç¾øb™]w¿®­ìòË3Š,¤ÛÈ S­ÞßÓƒ¯ôf>*ÖÈÑ‘ æVKqŽ WÍâ_ -HÑ6³,àþsH>+±â`›ÃÞúÝ -¾ìŠR1O¥-j6 ‚/A.ðR£ ›ØVYb‡¶ñP•¬N¾ž4†˜òHããÓáê]”h5ß<»¥ØHÓÕëp_¸»ßñžŠÿ093u˜äÕ_-¾ ÂzBž3§±ÓVîvÎ0„c¶=‚`«Ó&#C×ࢸ㹺}䬲¤ —îÄÔg2¸—}8y(1w; rsn‰}Q5ÛÎŽ34墡‚`ŸH å±í¢S>¤FOÚ³û4šQ²nZ¦unß°XpÂÕ8<Ôè°@ÃÏÕå©0Õžž`š`g1Û™ùDCïè]Ãû?ã_ ÓNµ³À:›r#s `4믈WBÈ ¢Uàÿ¬Œ¥ˆ#Pè‘Œc•‘Œc•:ãÀHÆqª¼ê©l,cìúš–žNP8t×(lrõ‰ž/"­ö‡ÖÕ™ñÓRd,¥‡¤féèƒè¥`ÂÛ,÷qüÅ8UIˆ÷QÏÆ©cªËqj "8ë«û§uiëâéüÞ^®Ÿß=P-l?¹ÐØD9D„ÓýÉ+§‘ŽürÍ%ãT<ŨûÒ%j^úGkÃTÃi,À9$´¨¤“ðÙhŒ_ëu4CÞ† úAðvõ´|Ì ª p†4ž¹¯ƒKÑä’Q.’KÂ<*ðâ§Q„Ëäf a…X};Tu¿öMû\–Cé\Hh\Öº Hh)¾üLG¯Ð²ÓbøŽ‘Ê°íCUZ~3Ju0líl}¸j",«bÛ´ïšœpAoTǯËéÍ=Ž{xÂ!WïÏðMŒ?öˆGf7_4ú^Gƒï:tv(ÛußÖ®æ±.[Dÿ¥ÒŒVQbRäwUS.‚U*½µ9–`— %p :õ¡Å›^ü¼°"*¢y—`q È -¦ÓpfLæCùW{j9YQ»#‘AŠ8}ቷl)u$!»{áIøBpLn°g«N^(™;5Vú6t”ÇBMØY€ ¦z‹óÕFiðàŒ~GùØô¾ È’®¨2ª¾ì ËRl©\–‹u ùXчcížæ8Ü‚.ñxá©K,*‘E1(/ïþþÃ’;ÀHc¯¹ ó‡lœî!Hª„Óa  /òª?LzáþÁGÀÍd/A ÖÝC†Í €+?Ѧ%昪qÇ‹†~í×C]m\0 =ÿœ!Ì‘Kj¹V‰‰Ò,ŸE5Ï ¡”¹ŠOI¸Í.¤Ø>ª–  m¼üM¸öÜüߟŸ0N#eê«b‘€®ç©gÊyp3ç<|7|Îúÿé5£ -endstream +1395 0 obj << +/Length 3800 +/Filter /FlateDecode +>> +stream +xÚ¥ZÝ“Û¶¿¿âÞª›±€ø1Ó錓ة;“ž/}IòÀ!kŠ”EêÎÊ_ß]ì")J—NÇsæXâc?~»XHÞ +ø'o3 •ëÛ4בÒÜ®¶7âv}?ÜHæYz¦åëÛ‡›oÞ«ô6ò$NnÖƒ±²Hd™¼}(]|÷÷·??¼»¿[ÆF,’èni±øöÃÇï©%§Çw?}|ÿá‡_îßÞ¥zñðá§Ô|ÿîý»ûw¿{w·”™‘ð}Ì#\øàý‡¾#ê‡û·?þøöþî÷‡ܼ{{îW +…ùróëïⶄmÿãFD*ÏÌí ¼ˆHæy|»½ÑFEF+å[ê›O7ÿ +zݧsòÓ&‹L¬“Û¥ÑQCÌ +YD€Ж©Ê£Lä'!ÇrNÈž …ÜU›%ü5U³YöÇîZšÖ.’ÛáØg+\3KPƒ%Èd—Æã%|ÚÙUµ>‚ðs½(è±ÛWÏEoéåþ{Òþ÷–šÜR‰jñiü~èlIÔË“mˆÚØÆî‹öHïŸ-ÏÆ;§—ýÌvÕºgÙ¹h­ON&N1ìb)e”»¥—v]êžì¦êñ›÷z(t­"-“Ä„ü‰1Ê×H.1ˆ#KsæŠhÂTEJh3Bo§®ïN&5NO³°_Az½Û2´öOEï)ϱ+öÅÖövOÛâH„˜ôÛÞ¶Ï4ˆYT uôXúñP÷³ÝwUËÏU‹¶¢ÔÂiž¤Ø5=º'òh/èñGÛ Ö•^ü&Œør¸“ »?2îÓOo‰X=ÍÆvÀ-y¢ýp¢>|¬뢪aÝ[ƒùk*a¿t8,B.j ê#Í׳NJñÖhö<_<õÁvDÓÚòŒD…-¼ Š`Ïð‚° ¤\<zjëIÓ1ße yf~<†ˆØ:%¨„ÇÝTÏŒEù¢«‹gæóºsC—ËñÖ¤·êªéôí¾##­«¾¯-Ñ#³À†–Æ3Î@ªý‰Ë6}… êdC‹S‰:YœJÀ»ëº}¡v·/×V–Ã}-=0½#ãö°å¶¦äÖâ«o=3½ k°j÷9U½­:-cÀóÁÔõŒ­uhz®ìË]/\³!£ÔñbS·°Ñã%9Ó˼@pÀ |9é^À(ª’H²3 ¼b‘·)i‚®?}àš™”œ@„‡4-/à“íQH"fáQ”à@}E‰¼¿ûþã'¢~ùþg"köÚYµãê]‹®Èqì­¸¥çØQ‡3ž>o×4à®X}o’‹ŽÞ9y±„qδ¦1²™£³]ªni1°]è02&Â-zµÈjAßÁ{{軪´ÄÆy4ïã©ñ¥Bx®éå‘gèØ›Þ6N^þçÐá~l‰aÁ¹Yê’/Ç|J´4Û✟»©3éÖŠé›P<´ºCQIû,:ÞàœÀ'—$R‚&G‰kŒ¹ºä íÌ*'¦”$QÒ9'ÁÌ*|4m³ÇáÓâ ²)„iÄæ°ÇéTæ S•LÎ#DÂø5D¤XèsDB&>Þ";¡ ’CDÂ/È`§G¤Ñ7ÚÇi5f>  `bÐlv ‘@Ô]u¡>@Ϧ´;ðX3çãëIö5J0Bâæ‚;O0L/Œp¦?c#Jˆ(‡ú³Q ‹3>j‘Í_Ua¢${RÏ@%2`<¡Úk»ûßRt¡j¢¢$VÙµéÏÙüã:T%lq°€O!åu¶ÌGB$hQDóÊzÃ'Oœ1¢³ç,$¥I<Øuí7·DÜ+žûê~¦cR„XõJ¶H"¥Ó•D¡ÂÓkò aÜñ± +ü¶@Éâæ2½x_‘Æq܆ž-7‘${éhçUÆ©4N^Ùi…üóq©Ç]µrT÷j¿RL']LK–¡\˜rí4åÚiê¤Ôm¨d‘†‚Ê4)ÀžŽò„åªÝî@Î#η›H£P[#Hfjñ±uµÞÔx NCù6ua +¸2 Þ!±µ3•U@F”PÓûL9‹L®ó1t{gŽSuI7àXy.ÒWT‚V€9ât +ë¶(±ht.:m"•õZ†.‹Årà4l»­XB]»µÜ¶ö›`©¬žìê3¯ƒ ßÉ´ÅŠYÍêä¯wv’ðVÉ…îDDiœŽíå VT ùHËî4#AeRf¯JP¡ÇŠ^ø øGßW‡ºàšÙ¹Xs©`8,Q¸Ý\¬“¦T>äíhž²¥]5mO ÅnG§TRÔñ…­ÊXây̻ľx™Ûªˆ”JçvêRrݶ¢ò|,ú­-\ÉPåÕÄÞ% !èh§£.- :KtþÚ"µf´Jt‹Çt7ù#O7D x}©ú'bà|F-ºbË”4‘µ}¶51_°ŸeX"[tbôØÉòÔ„BÄ4yòº›ii‚%´ N»9ì Šž8< 7”þ*.öAÔèí–Ò8íª›ÝµåÈ /tL\Hx&«ËÀNE20®R5e\1¤Â4V ^ø#ß]©®l ° ¼¯ÊÒÁ¬J¹ÚŸQU?J™a?îqõR×óXtTöÉ(h@SÕ¬êCÉu|tF?&à”ÿo”Ö¯®¡ +`R´½Š·1¯„%àt$t:©™\X±ŽD,ˆpqªU Þd¼Ë;‘ÌŽ“Ä!ðùƒˆ; LRÿsû3"Øß…lÂr£n¾Ëaê#ø´!’$Ê®dZräD`Ï& åš¿ÎX_¥:ó°óqðͼ~}óeUó9}2h`›„åo—ÆLgE®‚+Ï¥÷W°qWp!DÒaðfs\êY­ìÎ…»nO¥À|QR…`·#LŽ¢,+t§[ÄÍb/¤h'ì½ LÎËTr3õ€2´0®ˆ¼Ú«×Dõ‡†ÉåoN7îkº€Éý½§OIœ™¤™œRxN®“ãU^»Ù`MŸ« Ü:úåA¨Æ1.ŸJ1¹’B\¸à£ û$¬Èî©=¸\h€HÁùšžðê‰-Y.Ph®•å¬(=• ÿ¢ aS¢ ‡7t ›bÊL„Dºxæ¾øly¹Na}][?Û E'+é&rÂŒÖÔÄà+½›Š2r°%ƒg«•¥r>Tï’¤„D«Xcðí†r#EªWA_8»ŸqME~蜸:tòèofo}°žç¼R-ä´•»®ö×íØf;°#H° +m2r¤aûp þ°!ŽGî«Û>U–ÔáŽûÐ z‡`rp—zØçPbâÕ=a’ëG¿·)ª†sÛ‰©‚‰rÖQA°3Ÿ(±Ç¶‹Aù<‘`> endobj -1381 0 obj << +1397 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [353.2799 540.398 410.176 552.4577] +/Rect [353.2799 401.8743 410.176 413.9339] /Subtype /Link /A << /S /GoTo /D (zonefile_format) >> >> endobj -1386 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [84.0431 109.336 144.9365 121.3956] -/Subtype /Link -/A << /S /GoTo /D (view_statement_grammar) >> ->> endobj -1380 0 obj << -/D [1378 0 R /XYZ 85.0394 794.5015 null] ->> endobj -414 0 obj << -/D [1378 0 R /XYZ 85.0394 184.8801 null] ->> endobj -1385 0 obj << -/D [1378 0 R /XYZ 85.0394 156.8765 null] +1396 0 obj << +/D [1394 0 R /XYZ 85.0394 794.5015 null] >> endobj -1377 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F11 1384 0 R >> +1393 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F11 1400 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1391 0 obj << -/Length 2882 +1405 0 obj << +/Length 3058 /Filter /FlateDecode >> stream -xÚ½]sã¶ñÝ¿B“—Ê3B| Ó'ßÙN•i|W[ídšä–è3çdR©sÜ_ß],@‚2Dú&ŽÇ`±Ø/‹Ý¥ø,‚?>‹–d"›éL±8âñlýtÍ>ÁÜgÜâ,ÒÂÇz·:ûîZêYƲD$³ÕƒG+eQšòÙjóËåæ8àà°ßÕMA+ÌÙ`sX?ÄÞB—¶E“àd¹)ª¼AŸK· -è *‘S‚â<‹ Ç'ºý‡ Ohóêe7- È.È.J‰-b¬ÛC¾Ý¾8üæd3þ†/õaO½Îq,D6åààl‰TÄGgœè ‡ûkèÉ‘LÇ©sïg3{'3É"éáîýOü]"4SÑ”¿ó±Nû» ¥³g$\”›WaGÂ2Îõ8w‡à>tyœ¥™r§S™êùò’ÚÖ:_‡}çëÒ#_—â¹+*f]”_ÈÌÊ©¹¡]…ÞGuiÎï¯Q$/ÐÍÝòÒ^"€ç䜣뙞×{GÙ츈˜ÈŽŸ;ënyÆÍ>óÌî3N¸[ôŸ1wtyÉî®nÿ1óëóÇ°‰É0äA§Bj3­¿&ä1äNF7OøÛ\lÒ»X$¹"D½Bhçp†ÌÅ­Bˆó@díD1¡²dèXŒãŽ¹jh{¿„#ë—°kœ5´95ž'Ì:O„ƒÎ¶í=áwž‡ä‰°×{"•Lx¢hx€†wÜŠ>펃CËÝ‘YsìxFA¡vÁ¤ö¤Ô±—Rp8LÝÃÒyРw$"ëŽívKKÖù¡9#H1Z©‡âHÇ2®Ü6'!Ss$NÙi«ü×ÀyCPû¾"ßWÙ2ü¾šEýûªUäbwÕÅî÷F ÈÐ24àk$¶2s—¨ ÝFÈL8‹yï€èFœˆÎ…סÒîV†èÁŸ2ù­þ¹ÌŸCĦÏ1¾…ÜýPnÛEYÑËuõ´k_¨ûoàÛÃñ&Ì¥M¼1›¸±œ?š-ˆÕ¼©Í¦è¾£Ž£‚¨#Ê uŸûpAð¼²ÄnAmÚePWÛÜ<Ø®D˜íj,Ãœðið€þˆ[û˜·VJzˆÑ=˜õþÉF'vÜÔ’o0ä7ÙÖk‡“äuÁS–x!WæùЯêvH¼7G=‘e6ÄDÀ²j‹}U´±tÈ8Ö©¡c‚h n \Gkðu\—˜j -)½¸LªNf€¯kzT¥¹i&œ„.^™f—¯ »€ìÐöÍßü|ù᧋å h¶ÙÕUC $©%•O³÷V2R &!ìò}[®¡}9ls“ðâóŠŽ”Ž;¡µ³tHÔÑ:p˜Ðé@x¾ÙXIZ=‘Ÿht{ýž–Às–Ú5f·û¹x.%d,” -À.¼X´mSÓÒ²Zo›"¤I,Å‘Ä’$†y’àË_™#H@O šÃ‹ÕQÄ€·ãSUlðê  eÒQâómY}£Y4vI{ÎçNb_z·½û|ý™<ÊP@#ú‘³¥½Cõ¹ªŸ«W+YÇ#…hMqß !ík„½¼mÑáÐÀ?h7\¦'“Ôá°ÄÐ]([ -ß]὆%µµešÍ Š?ʳJì›MAZv EùÅ.Ä- ³é܆ gÉc -»úLnk³@Ç:"N—vl -ˆëö9>[6ÆõMjí=ò5ÐY[%Zk윚¢÷ùVcè¹Ü¥Y7EÐø+·yëÞ8TvɶlÚaŠtÄËžƒ²ùþTEX¦œ ®ÔxÜÇ2É -¼z^XÅY"JýkOàS ô8¤ƒ£LÒk¦Ã" -¼åY™Fly³¸¸¼¼e·Ï31¿8©w"¨ü1®·‡5¢·ÃšÔ{Œi¯÷1Ó°Þ>S™Æ›5‡P h‰ Í=¬ÍÖ¤æcL{Í™†5÷™Š¿${»ö"aRB7®½‡5¢½ÃšÔ~Œi¯ý1Ó°ö>SÁðëŒx»öQÊ"™N(ß#èn‘&UáØk~Ä1¬¸ÇQ@bïÿ¿U‘fL«)øX§-ÐaM™`”igƒWLƒF0ØŸû[~L¦-ê*•é ‹yX#sX“cÚ[ì˜iØb>Sþÿ°X,ãdÂbÖˆÅÖ¤ÅƘö;f¶˜Ïô’]£¶oÓÜ|çúšîchî°&5cÚk~Ì4¬¹Ï4eW_£;äüq¢'â(kDw‡5©ûÓ^÷c¦aÝ}¦ÙWéÎ3ós"–ò±NëÞaMé>Ê´ÓýÓ î¦_§»r:›ˆ'|¬ÝÖ¤îcL{Ý™†u÷™¾;©;#Ų?Öú¹‰«gñ¸Ë7¸ê‹DoŠ¶Å:+L¶ÃmÉ_Êâ™z[ÈÌ·–€É²fò5Z¸ÛQWQ®i—6令o@ËFKªón£Hw‡j;$‚Œ!g{,öek(AžîÕ0`²Þa¢ØДI{¥©•t¦po˜«jnzñêă '@¬4›/–·1£tÅ™83JkFSó‰ç+Ü?˳ä}9V!Á<²Ó"˜^z²º ó[ê¿Ô—ÆVÜ£„W\äÃ. î­B(*dÙP…Ý?ò§Ý¶ø>ðy®“–£Jüþ!ýZÿ˜wAl“(šþ Õß!˪’ª™¿08œó¹ýd™%}qqX“Áêb^}rËaåî¸à§ûH÷œüÒæ°V’ÅóÇüKáU.»úVÖ!Çk _è³ó°R‡U\#vXžX$BšJ"Bv{,Ŭ Ù_Î`y·+ò½˜Ï К* vî ¾ûÄ,|P>Ðaï)¯l!»+ñÒZú6c06…Ï!v:óüWð©€{þôoâzw¯4“iz"´D¬Pæ£AòúS6œ<Èñ¢ÿ7Ú‘endstream +xÚ½ZÝsã¶÷_¡·Ê3J?š'ßÙN•Éù®¶ÚÉ4É-ÑçhR);î_ß],@‚4?|“Nç’!°Xì°?, ó…ÿøB,ˆE¼cŸ)«ÅöéÌ[<ÂØgÜð¬,ÓÊåú°9ûëµ 1‹,6Ž¬ˆyQÄ›Ý/Ë€ v¼åÇÏ7×ëþy{qúËÍúóÍùJ(oy½þéŠZ?Ü^|útq{¾â‘âË¿ø²¹º¥¡ÀÈø°¾¹$JLŸ¡·W×W·W7¯ÎÛüxvµi|qýåžDG~?ûå7o±·<ó˜Œ#µxŽÇx‹ÅÓ™¯$S¾”–’ŸÝý£èŒê©ƒñã2|(€*f² à?ˆ‹çANY^¯²‚­Òãsz¤vV<”ǧ¤ÎJ3øŸ²H+Œè‘ŽoÃÌç1iØìÓó•ŒZa2âËÃñœGËò9Û-Ÿ ß>ͧœwYòX”Umi°cê=‰:=îiFBôâôtoµ•D»oœÃÙ¯NÅxÁ4žs+%´ñµ6^†ËC•žvåª.«<}NóÕ®|J@’vßwÃÌ¥` +#…î³b7$2ri˜´I Õ¯+QÄ°¾¡a…ûùn@ ï±8Š,×6Oª +wu(p*ã…uYFËD‡Íz—kjéPá0uˆAï9K_høWOyUšŽîØ’ÒÃ`#ÒØñqAÛÁÌwøiãÊ¡k¹Ðûtk¶"õ.²o 犩XFsÞ¤OÃ5cÅ[ih‚“ 9üêЬ¢Œ™ £`f+âÂ7\/ûl»'±YEß*…ÅJjX8!¼åmþ'Ó»»ô!9å5uhÕaÖ˜‰Â‹˜{×h_ß È/B_–ïÅ´ 9õ÷;T,“â•óò>Éu†­¤ŠX(yh3¼šü9àÒVÔ©N:q¸L†læg‘ˆlº%y^¾¬~?¥Ç×ãA³ôÞ]IŠ²¦Fr8䯤‹B ´š²›:{ ©”—뢽–'j<¤iÞÌ Ešî ÉhÚeUrŸw$ëðÐ_†A|´>ˆ¤ ¢åI§°ïD‚F$é«å} +nŸÇb©Ù!DßÀöæ5)=°þÂÇ•‰æ †3O…v—P@ɯ¤t—þêy¢ÈŠG¢'}Ó?y¶ÍjêÙyŠ0(cÛr%ÅÂ(VÝðL !ÇÃÇ3žÔt^Á©±Ý#üaö 5¶y–5,kÊ8 9ï3!dE5êu§¶Ô& ±½/OùŽÚ”Õ‡ =;K¨a>”pº©AÆ•Y$OéÀ9)BÁ””=lä¼ ±²ñ”ÅŬÞ-¯‡¡#ÓWLÊØ¢ÔæçÍ’ASZ‰ßQ"új!¿—‡£péãA/æ=dhf€°ËEÐh;ˆñø­í(…=É©×,všúÚ:ô<+Á¬#T­ 0”Áòîn³‡WÌÉ£ÉSP<„½¥0z„¼BP‚ +Fª.Š€3Ifª¼mZU ¦·‡òÌö€n,O@»JS9€.×x6\hëÊJ»7;eƒ¥TÌhn¸TwvÆÖ{º) ƒ 5B÷jKnòÛ6×;yc”‡Ð0›‡ÐÔveŽåaÄ™±Y|kÐX"FPüÝ4D%ÃiÅ5äS¤d7¡Þ•0WS|áÉoN=¹¡$‰›{ÑñŒÖ_º¯¸KƒdºC4à +Ž“í>+^:ï\;;pî>Ê”1‹UÅVäwóç¡„«„Ôõi*|‹£@xLkk–ߦòŽ‡S¡katЋÍÞ‚ ‡cö”èí€ÓñPêJÆ7 DS[ù‘ÍB"gæ«Ë„"¢¨=ˆj‹R’3pi½v<š‹ÙºZ'|¡&Ü&UMŠ ªó"R‹Ûúçó«å¯^À6Ð…‚ëH­8 šš8Ø["ª·ÇI"Ü÷CGŽd¡Š,¼7ÈF5l,™ç{a×ñÿ ÞA…í?ƒw×ÞY.§Â WÙîMÙ°˜CM>©Ý2 h—ý’ +°ŽvÚ•Q¸\_Ò·¶„ë°m±.êa]„û.-Ü‘mš=S˜”Ðç†VZwŽÔµÞ¿X”Z +&ÐÍÝúÒ$P99ç=X½—G+Y¯¸ð˜ˆe¯5pËczcà±Yg$ŒÀ-â§âA×—ìîêö_W·C—‹tKÜþc›DÙàØœ)Þ¯·Gªs!:ü¨ÉÊ!y¸‡ò*¼ û¾_=êWjþû}o¿7zWRÉå^/òíC/œÇEè¥$Yì3%Pq%î>_=)Œ°›;úšƒ€vFAY䯸x°\ðšçO`oß<¡ó ßHºÚè±@[IÑ@uSàû3U'Pvܧô%lÐâwDÉË­eSd9RmñNÉ;E>´Í{T+¼˜£=$)ûÆ,×E‹´þ‹‘C@`PC`‚jmC¯Ë­C´‡(8¾èzb›áUSHéÔeÒolú¶¤CUÊæa š˜2Õ!Ù¦fÅ¡> ¿ùùòó§‹õ õh´:”EE$¹%}Wf‹VÒóÁMbÀ‡êl»Z—Sžè /ß‘hD…ª1:´qƒ>BãvÚHOv;c0Y $çÑz·×i +g‘™£W»SK)áÆBWX…WÖW%MÍŠm~Ú¥£¿@)zKÞ±ÆÉb ¯¿<DÒ[ˆŽ4†‰ÕnQ䀳ã±Hw˜:C4’ø2ÏŠ¯S2õ;%N©ÏùÒZìRVC{ï>Ù~5r‘ ƒèVÎF´NÅ×¢|)ÞÌdŽˆ e~#4 $„4§¶’ºFÀ¡ŽÞ~ðÝ¥LOúR‡ÝL?—ûº¶.\aQÈÊÍ3Íî•éY…·JlëEAY¦Eöl&âÐÞ´°!èXr”ª¾líVlC[Äái®»꺣þÌÔ¸nHM EXƒï Æ‰Ú;¡OÚb¾ñXÿhWƾ­B•ö‚ïTýÈp:’‚ÂÌȳªîÞzªÌ6Ȫ¿ýÊEã*Ž¦Uv¹ô]=§ªâ,#‹~Ô°§4ynƒ“J-Ó[¥Ý78ÊãXu•zl}³º¸¼¼e·_ð)ÿbÔo8»c0qÆo‡kÂoË5ë÷”ÒÖï¾Òa¿]¥.ïö\Ä,ðe0ã¹Ã5á¹åšõ|Jiëy_é°ç®R¡ î â÷{I/#5ç½Ã5á½åšõ~Jië}_é°÷®RÁð/Ä»½‡š’Á^™ù—kÜû†kÎûI¥÷o”zßQ*àvïþÿî(À50‚Ú~& +×D,×l¦”¶Qè+Ž‚«ÔcîßúK01lp.g"æpMDÌrÍFlJi±¾ÒሹJùÿ#b2bpš‹˜Ã51Ë5±)¥mÄúJ‡#æ*½d×èíû<£ʪiÏ® Ï-׬çSJ[ÏûJ‡=w•Fìê[|ÇW[òß® ß-׬ïSJ[ßûJ‡}w•Æßä{$™ +ãiÏ[žq¿ Ïœ×êŸ{ê=vÔ]|“¿bR̬tË3î¯á™ówB]ãoOÝ ¿Žºßä¯Ä?…„øßܤþôßj¶¡ƒòVFÑHªŠ÷!Æ(ýî½ý5ÈüQç[Óÿ KQo?endstream endobj -1390 0 obj << +1404 0 obj << /Type /Page -/Contents 1391 0 R -/Resources 1389 0 R +/Contents 1405 0 R +/Resources 1403 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1356 0 R +/Parent 1401 0 R +/Annots [ 1408 0 R ] >> endobj -1392 0 obj << -/D [1390 0 R /XYZ 56.6929 794.5015 null] +1408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.6967 706.497 116.59 718.5566] +/Subtype /Link +/A << /S /GoTo /D (view_statement_grammar) >> +>> endobj +1406 0 obj << +/D [1404 0 R /XYZ 56.6929 794.5015 null] +>> endobj +414 0 obj << +/D [1404 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1407 0 obj << +/D [1404 0 R /XYZ 56.6929 752.2918 null] >> endobj 418 0 obj << -/D [1390 0 R /XYZ 56.6929 551.4149 null] +/D [1404 0 R /XYZ 56.6929 436.1631 null] >> endobj -1393 0 obj << -/D [1390 0 R /XYZ 56.6929 523.4719 null] +1409 0 obj << +/D [1404 0 R /XYZ 56.6929 408.2731 null] >> endobj -1389 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R >> +1403 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F14 741 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1396 0 obj << -/Length 3167 -/Filter /FlateDecode ->> -stream -xÚ¥ZKsÛ8¾ûWè¶TUÄ€$Ž™‰3ã©]g×ñÖfæ@SÍZ‰TDÊŽç×o7ºÁ‡LÙÙM¥*Ä£4úù5d¹ðO.r eõ"³:6BšE¹»‹{˜ûùB2Í*­ÆT?Þ^üðQe Û4I·›Ñ^y,ò\.n׿G?ýòþŸ·—7ËUbD”ÆË•IEôãÕõ±ôùéÓõÇ«Ÿÿ}ó~™éèöêÓ5 ß\~¼¼¹¼þér¹’¹‘°>áÎ,øxõ÷Kjý|óþÿx³üóö׋ËÛþ.ãûJ¡ð"_.~ÿS,Öpí_/D¬lnOб´6Yì.´Q±ÑJ…‘íÅç‹õŽfýÒ9ù•Ç&O²&jN€ÆÆ©‚)`UoEÛ–yt,»ãa)óÈÁ3µîðè-u6Íu±sºªSãà\ÏßØœµÍ Þ¦j1v¥ïóNŒƦv±òÂ÷ÅŽ•Žm.Õ„kGó™ZÄ€³¯Rab•fÙäL¢é©PC^+ -†§’B Ôéb¼ï‹Ó{ª™ãÇyNjgÖØéùŸ÷®¬6`PJÙèɧl1C¾©ç½a«Øï]Áó¨rüz•cƒÂ<ØP¹G>z?ž*ÿåIŸC±Á¦Í¿Ð¬u€]m¼i¯”sˆnS ¯Éc1×´œXðF˜-Ýú]ŸŽê“Ä„ûÿÐý°ÅN­"­[¿LQ¬o“"#IþºQŒ©ÎEO5EÙÔ¢Vaã$yëøžjæü‰U'â”Þ*0‘U`À ùa ³Ø`,˜¶CÀ⨨O̧¼Y SƒYà$A+˜ì#žîÍBKÝ›˜’*ý=fñG’èÿûÿÌ@ÐT™}à FT¯˜A ÌÀßy…Q{ë^ØdbHÄúuzª&&¶Ë8ÏM6åâ’Nörð*AäˆÉ8 AZAQì_ìB¾øñ9ÀÍMqÜvƒôy¼ÃBºçyaëA4^ö˜ê¼°{*¼&_i5ý¥° ä)‘¾ÎCO5ÃÄTØTÚ)zÁ*¬ ÖÕcµ>z0ý _höòšä c#ù*<Æù"°ökU*‰š}5JÕÔÔ-‹šÜpZeÀ.”HS79©o Tû`]µs„ðO4°³"!A‘¦2CQ M™Æ2‡ÂS½_¯«8*ؾ>»²#±x-ʇª¾Aê°9` @ª@3¨J¨m§´†ÇÛád Û¹wêY¶ ‘”`Ûpµ—9T²I®·~ù / ä¬ ‰Èx¹g¨¦Sªºsf‹9¡‰®¡¡j·§úꑯÒ -Rm»oê–§‰m(Ž®Hq RB’Ÿh*ÏÒhn6\û÷±h6~£ s(;0^¹ć+JÖ†ŸAÊ–šìÎ tG'Ð'dnƒï9ˆÅ÷кUyìæp¼G¢Iƹc]C1 “˜ÆöC‡Ò 4p@ÄEÝ>9½¹‰©qÝt.Rt3&Þƒƒ˜·LB‘k™3™w?d˜y]8Ä -S;‡¥yÕî‰ |±éX¯^™fòØ÷¨×ÓŒXûÒdDÛ¢;} -èáÒ‡ëÏü8Ð3Ô—ðüp¬½„‡2j\¨™;2¤•‘çMG–× Ö~8ì¹óópé{Gm²ûÌžÚ=ìêõŠý?„îkéöÝÉÒ››Öu|w Øpù‹‚‘Ä;±+ÕÇsÑÊ ß¹móH?‘EwÇŽ&8¬ž¸4άթKã¹tðXXÜ¢‡Ý×ô&TÔÝöy)¥ô5©0ÑŸE‘Ý`‘ÛUåq[€nÆy ¸ƒ7x“G ŸcôÆvc–KÓ²kì…bµæþ±­º"ìc éÏ\½r­­ÃKŒ=¼7?ŒÁÐÚmÝ}B橧ª{ )O4£¤ûí‘ít=kWÞöô êúx‹Ãw]Q1 Û ²ôµÚwÔ™¨FúÜ‘ Âàð*†½IþÉ Ù(’ÁG“Ñg»nÈoršßæMrµ94»Õ¹¸#…ŽS­B.¢§ÁÓ´–Ä©´!6ÕÍÜ6&6&‡/eMàwpùµ÷°C[‘|l#P–Ç{!Yï [/³‚cP7›¹«!à¥6{3À*¨‡EHÍQ¬ñ…*Ȉ©HÌÔ †CP—iqBÚ1©joÃÀ™wÐIü ¯¯EWÌç'n)˜ácÕ[ê p[?‚³÷azNHR‰ØêD}CJ”HÆY¶dO„VÅ_ÒÕ—cÅa‰FwGŸ+±Õ èSôŸi†üÝoÊ rô'Þ}ÜïTÙV»êÄÉ{»5'z÷>ªÞbä½wÏáe`^ª‰‘PB«4(­øºbɶÕ_srÍ¥&ë%Bw:ɤV‡S#BÙ~@h0ÃT!³*ʾÐßU5ù§åš¢zDb1ÑØ0y”Áçöøe -‘LàŽÁÉoK!¿{XÍ9Isìf 4Î2•[©•÷¥ÖËŸË4ä¿ò¹ÜVåÜ>ylàL6FÂR €ï fÂ!zÆiBc’ðÅöâ$ïôä¶Ûé­Ç‡v®Cü¤QØ`”õÜïÉu>ÞXyR {Ü„¢OTôKóäñ%Az’ÛƆdƆ3ˆ4¿úèo‚aɉ5˜8z+m7ìé¸:4Œ&˜ ¯~ãCÉÕlÑ8·cŽFF¥N@‰UQK•ö…[ŠP«)„Â÷?¾jÀ–·nÜÿX–Îù8,§–¦±{zqYo]Ûò¡› ?ºÇaöM”w8À’UsXÓÏ'6«s¨){P†ïæ`ôð!Ó‰ƒ+™Q#SþÝ GÂm8zÇ«(B±(¥¢‡‰ùàH€w’ÊW\ĚĦÐ2 æ<µ6ìî€TÏ{¶ãp—Éõ1¯n½Éûuhù÷èªn©WЧÝäQYTwwä@|i=“cÈ^•³ð¥ºÃï]´Ž)Ñ”¿å`PèÖ…S¸úoþôPr˜±d<ë1žºVÀ0“Â=`zy+fáämØrÓl¡*í÷ ÏãÚãnW„òb³…×™g‚™ÄáZH•ýoáúì{o–ÅI–¾ñÜ;":ÿÚˆfAÎô–> +stream +xÚ¥]sÛ6òÝ¿BÓ—£f" ’¸{J§uçêÜ9¾éCÛŠ¢lÎQ¤"RvÜ_»Ø J”“¹Lf¢åb,û Ë…€r‘éP(/R‡ZH½(vWbñc?]I¦Y9¢•OõÃýÕ÷ïUº0¡I¢dq¿õÖÊB‘erq¿ù=øñç·ÿº¿¾[®"-‚$\®t"‚nnßÆÐÏnßßüôŸ»·Ë4îo>ÜúîúýõÝõí×Ë•Ì´„ù¯paÂû›^ôÓÝÛ_}{·üóþ—«ëûá,þy¥PxOW¿ÿ)8ö/W"T&Ó‹gø¡4&Zì®b­B+å0õÕÇ« z£vêœü´ÊBEéŒ#5'@mÂDÁ +ðz·ï_àLRµMÙ!ùa)³ $|Wö}¾®ù+dÄSU>T—OeÍ 4µMÍËçû=0·§vL·¥¡¢Î;FÝ܆¼«:ÜCå Çzà.¤²’24ZGöˆÌ‚ÒAÕ<–‡ª·+©$ØÚ9íŽÛ}_µMGCÕ–pÊA€åcMKÈÍÈ`{0àØl·/‹ê!"··#m@£b1ÂÑ•ÐÁýÒDïÓ>•‡Cµ™=#-Š9ž>êªë½¥_Wø² ¾!ø¥=PäÍ„–>† Hfm?®@PÞŸò <o³m”Ÿóݾ.ÿŽ§ùþ},=EMe˜*Pl%ÂT€À23++Þm›|~÷Zb¢ë«é™]ã…`>ªñ¯>ŽKtUó@_t ¤ÙlˆÊª% yóP2\àØÑ !œº¼ÁëKǺÇöX3M^M¾A=1:xÌŸx3€5;F8r{Mø›Ñ[œ§tL< pìJЪ$RÁMC˜ý!/úª(髬x +˜j™ø¼sÖ–žUEÞ1ô\õíòæ… OG`Û1³.í ˆbSú;èó3‘¯ší!ïúÃ2 ŽEî,…û*(,ú Õ Éw%㪆~aéÎÍÙÃEçEÙ¡‰¥*øØž8ö'mA:nzÎP—kÈE•×3L<—>MYn¬jàíÜ…­ÙZ6å¾n_œaZ‰¶ø˜7õ©¾e¡D_Ø´Úœ§äÏ9ã<·æϺ$Fâ„—ÂY"’P鯌g2 +Ññ|<ƒÓgÑR°÷‹kÑ<k1H3N—óEaš&‘öo\€„|AJ’ú­ç2tÌ™¡Vðm)>€¥Hp¿`/Áõ©\`ÅXc:ÎB“%¸ïâÓB†"6FÛƒŽ°ˆïovÑâ] ÇYx'r뮼…íàl£o“Q +”‡NÒÐÈŒŽtoï9Í‚CIŠi‚}~(›ž°pÅè’‚§e1Š´5 ¶K@‘Ù˜ÑF²à¯¥ Ý%“ Þ ¨¬#^FèÕi0¯k\ä"7ŸŽÍ¦<xÁm œfÚŸ›‘O€Í^èkz +$D#NâàýpÌÅTXQÄ:[‹`lÊRv€Hä~élø-dâXÕýÊ:‡lŒóÇ14ãÂîieÀs5ˆ«™Ê¸Þ1Ôº›D3 ‡°iÀR‚Å×Ý”~S–{'èªNÀ¡,þ|eŽM +é`¢¾}›e¢Ð&1‹Õ˜¶~›ßXÅ`R-VQ¦ñx^HˆPè ‰ñHÚσåLˆ´ŽãÈ¢Yl€f±eñ ;‡Å^1>Q ²j1jƒ”Vecá S‹ê1§ þQ¢âoQ‹?"0oüïÿSð J©/©GõŠ8ªQ ì™WèµëòLÒ$4"Ž_ça šab¢ ™ ³L§S.®›±sEÔ¤DË´ÜE¹ +c$Ä‹^\ª¹Íu?JŸñ¹ŸÒ9/ [Id²×…íS]ö@u¡Ð;¶£X$¯ó0PÍ01¶•fÊÅ»A° +ëMõTmŽ6™€ï¡Ä—£|ELòœ'_Û%hx¯y ‡BÜÎU.APðPŸ@ OŸTÄ5%N«ØMµ™æÓö\ߨöCñ^íJÊîOné +IƒSOi5ìƒÉ$”Ùr%ÔØo7› +» +9ë×Dzè‰Aì­åÅ#Ötç58ä@¬¢ T ªŠ5Ö¨Ãr*Ž!Æñr8XÀr¶zN0³ìZ")@·áhçY 9}¦8kÏíô^"ˆYij˜Œ×·å.2ÔÐ.UÓ—f‹9¡[ ªÚí©¶zâ£ôŽ‚‹î}Ût<™Ø–üèŠ..’q(¤.“›ƒª³()i¶=šlh_Æ v˜,ø<$Œ¡ì@=†ÛÈÄ(>œQðmؤìdsæD×Û~\äîÔˆÌyÍQ,v»ÇöЯŠc?Û†ÂL4J9Öàß5„AYÄ0Fi?|P˜ ˆ8oºç’±ww!·m_ºMò~F%À:B0ý%•P ä±Ì˜Ìš2̼y‡NF±ÂЮIJ¼êvœ ¨Â榓¦#7ܼ^4;\jz±qÍ4R¢:ïOÛCºôîö£kÒ9††ò‹ÿcc%<–!Y˜Æ…ßUj<ËóUGÁ-oZÛ±4µ}pü_“Þ§æTïQ`=PP{¯øý‡Ð¢ü\”ûþdêÝ]Wö¼ 'ÜßRl 8ýrŸkÔ+5øësQËJB¯Ëº}¤Hƒõ±§v«'&#Ü=5iÄI;‹Å®.ZØCCý ¼éë—¥”2àÞí ïUqŠÜ¾*Žu~º™"Š;Øq‹'y*]ÊWröÆz8Ã¥iÑwœì¹bµáïc6Zõ¹[GÃC>—sõʵvìº\v$ymnŠjSÖåCîšË™ëõá%š¹¤‡úÈz w=«¶™ÆãýÓ§õ·ˆ^÷yÅ$¬7ÈÒçjwÜÑÇäJáÝçŽtcG ¿&ñ'Õ¤;p‘dÚ¨L,èõcŒorßæUrµ=´»Õ%¿#E&±r±ˆÚ‚§a- +iœojÚ¹et¨uæ»/eôÀïàðëïceÛÚV>Ɖ(‹ãˆ­Œµ„ÚÊ,gŸÔívÎÁÆàð“~ÑÁ*¨‡… ÍìQŒ¶…*ˆˆ‰ˆôI.3˜ÉËE~’„t~R5V FÄ…èĺÎkÞç³Êù¡á§™výTµÇn|íÙ<±çnxNHR‰ÐÄ‘úŠ()ùQH%Îñ!Šé®>+vK„Ým¬D¨³K QðͯPdï*Ÿš¼Ø_–3~•e±’‰ +e:^Žë2ñÁHAOd*îà,ÀÐÔ:“!¬hV·Ö[»O84â¨ã‘PºãnÏJ™PÜ´Döðváðvø¾ +2Æ7—Êfn+ µ‘ÑW\V¢%Si€í¯.]ZsÃÍ{jƒ¯5wF/» ™}›)^½yÂK’„±ˆÕ«^D†q"ô«^kžÄ­’ÞpϘz–†ópÄìÛ®«ÖCDzå3 ] +¯Ã !Ðà³ô‰u÷{—ªÔÕ®:1òAoõɽOžsÏz×/®30/ÕHËPc Í—–^±d»ê¯9¹¦ +ŠR¡³@¤£.§S^BÑ~ÌÐ`„%¨\dU}á{W5dŸ±ÿùAº™d$š2&ÂM&›e4“åø$EÒŽ;NN~[jpùýãjöÅüØÏ*h˜¦*ûºR+J­ó… ?—‰‹ÅKQWÅÜ:Y¨áLæg€ߓœ QÔÆ.Ó`ð…Ÿöâ ¯ô\ÖõCó±ÑÎuˆ´. +β^†5¹ÎÃæ‘'íQ›7¡è#üÜ>ã/þi‰- ’“Øæ+’ö F0Óül½¿vŠ$'Ú ‡ÄÑÞñ8ó@àj[ª5gŽ@ãL»®Ÿ¿ 2¹šË[Ο‡£’Q©ã²ŽÈ¨ £f¥9Ó`»"ÔÐ 3þþ×V YíÆõEQ–¶vÓü°ÓñÆ„{ ŽË¦æ·û˜üÌÈO<¸c7záTéÿg¦Ï$†—Æoþ[ŸñA,•eÑ|ÃJ‰$Ì"H¿˜)Û±1§œtÎúÿ~ªüendstream endobj -1395 0 obj << +1412 0 obj << /Type /Page -/Contents 1396 0 R -/Resources 1394 0 R +/Contents 1413 0 R +/Resources 1411 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1398 0 R +/Parent 1401 0 R >> endobj -1397 0 obj << -/D [1395 0 R /XYZ 85.0394 794.5015 null] +1414 0 obj << +/D [1412 0 R /XYZ 85.0394 794.5015 null] >> endobj 422 0 obj << -/D [1395 0 R /XYZ 85.0394 453.4423 null] +/D [1412 0 R /XYZ 85.0394 349.7668 null] >> endobj -995 0 obj << -/D [1395 0 R /XYZ 85.0394 426.3513 null] +1000 0 obj << +/D [1412 0 R /XYZ 85.0394 323.7864 null] >> endobj -1394 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F21 710 0 R >> -/XObject << /Im2 1049 0 R >> +1411 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F62 1065 0 R /F21 714 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1401 0 obj << -/Length 2863 +1417 0 obj << +/Length 2688 /Filter /FlateDecode >> stream -xÚµ]sã¶ñÝ¿Bo•;‚O˜<]’»«3É¥uœig.ž -Q2'©ˆ”ïœ6ÿ½»X€2}¶{ÓñÅb¿°»Ø…,fþÄÌd,óÒϬ×ÌpafËÝŸm`í홈8‹„´b}}uöåegžùLf³«õ€–cÜ91»Z½ŸgL²s ÀçßüøîÍÅÛŸ/_[=¿ºøñÝùB>sñýk½½|õï.ÏÂ1ÿæo¯þ~õú’–²Hãë‹wßÄÓ碗¯ß¼¾|ýî›×ç×Wß½¾êtê+¸BE~?{Íg+Pû»3Δwfö&œ ïålw¦bF+• Û³ŸÎþѬ†­SöÓÆ1#u6[(Í🶲`V@²Æ³LIÕYYŠ)+',´r¾Ì—·Åb¹-òª¬6‹²j‹Ã]¾=U_d–)cålÈã$Ö„(j Š°’)Jd¹º-ट7 Bq ñ‡r»¥Ñá\¸y±«ïV›oq¨ø<(AТjeÑ| j~“7ÅŠꊾyü~ù3màäÛM}(ÛÛݨÿlá9³Êÿ -Á¼12ˆY€l÷¸~b_™1ǵKd˜Ý•Å‡H'*(†,óý~[’]à>?ämÔARȼÛØ[Uâ!Lhƒf¦àBÎç^΃ì<æ€÷9& qÈ%ZŒr‰`J -s‰È~˜J8–y%]Äa].ë„Yƒ`ãÕc˜pÖt—²°pÑrÎ6äóŸZÐ}WTQ¶·‡|·Ë‚ÎR3o£k&Ð+÷¿æ«Õáý—ûC±.?n‹êšþ¬%óxóŽlöž0nêͱ¡á}ÑüZ~Ňӯès=eð¸y¨ïÊU±(?®/ !†4ÅïÇ¢i_Jc$G±ªšÏÙ»8®ö”¨:în’iŸ¡&Ö—‰ÐòªY‡æ³v/ î0ìø 7œFuU,áC¢øŸ$tuáM·EŒ™~Jéߊû&ùXø4P=À 8$ðþñÆØuôÑ?_®iSË¢×´ÜëIC$!¬‡x¶x 3«Eá_Ã’(‚°À{ÝßïëCÛEN®'äÃz™)Øô9wÙPÔ졨Þ2™…E‘ô©¨Ùl±¨’+&•õ“ÇI¿\ß?Ï X¢Z©3höyµ - -àIsŽd|Ú˜ýÉü?Äô‚I'í¤ Èc[Æ”.êÓÐŒi{(½”® žM¸Bb8é ×#~½.#f=8šJY¦Ö/f6¶‰r’™ÌèIÚ¤;»—›Jj¸Á¦|/ñœ<ÕÏ1‹y1³±Y4çL{7" v]Ó óž®·'÷×3ÒáxÿG£äW× ‰®ÕzŒÊb²”øó«©B8jË„†`é - ÷tômñ ç²*Û2ôÉ« ~nòM1Q•TFW·ÅD“)ËO­bà!-hp2ëSØ dãªÈ [¨\aº¼…Âu &+›¶\F`(_á{SÐ7ošzY™ÍcÍÌ© †OêÎÛ°êð|·F!C«í©¢ö´ß¹§­(ÓGÚ ¸˜Wà@.è §ú“dê}Ô÷ŲĽÅ*ôü¡A“+ -Üc›‚†¡ûQI¦†Ð©er¢,¡iàzþcÊy•Êxìê¦=á¼$27 ©mú:÷m‚JfÚäá»Ú†¼›§;‚6þÔ4­’³AËö°²†ÖÏÛÌÇ3Gû¯Ø²®Öîa ÿµÆd¬˜5Ð,°?0Æ~Ê =>Zé§ÜPáÛ–nhÕ|ZBÐSBæq—ië=A¶ô‡=BJu…ç°9BFñ@„l#BÉ—U…>QÎ'ÔRz£RgÚ°‰àÒÌ÷@+ô_¡—ŒgŽ[=>æÇùX‡Ö3unó² -ݧÃò˜ÀAStmöÄÙiΠŸ{ÎáI-°§ŽßÓ¨ÕupuÙ£¯'hM èÃŽ´$,J…÷©Þ/è„c}‚.'µ^]¥§“<=!`Œ–›ªî£V[N  Â] ÙYã¤7b@ƒ5ak!y:ó ûdÞÉ)û(aI7zèèvÊKh(Ä´ü_yMØã^3¸‰•Á¢ÔŸ\áñ-¡a]âD}0¡6óûúHƒUÙPz 3z˜Q: 6À0ûã<åBczÅ寮 ŽëcÜ“¯"ƒ¼ÍÑr™‡¦îð[‡Y¶ôÍ#•ØéãÞ—p¯»Hv}<€ß¦r* ñÕ†G'…„Ú~ò©Š‰cÊÄëÉrÌ@\Çó!'OQdYÂJï7#Jpo‹.ÿtî9~-ÆgYu’»= à#Í3r·„‚Nwî=zü˜¸)ʼn[ºÖ0Ï­ŠoK|zq  ·E°z˜Ð+¦uóm½ÄZ a})G­ÁÜPwÐIÃb8aÀßåM;@éœmú  ÙÛsH`*‘@ "c@ËÌшãz¡ZF'' òðlþGÈ›8JÍ.Î *REømDïM°‘³ól¬•žÀ·ù] ÉãžðFÔÐjp9mmLWñµ>ðœÊJÊq¸³Ó• ö”k@ù¨U‰œO§” ÖJyòËFo¼,ãó­•T„Â,øË*‡Š»´c_7My³-äE¼§ég+§ƒ¦žÎõó}/ Ÿoc=0xx -ÓzTÈqijûgõ¡’**‰ÈÕ"v Ú5™Ùñ5tbOL?–„/UGÁKŸï­ÿzƒÿN ôIÇ_˜C¶QzØQv?\Áò*.“¥︧—\í GWX~lëô1àÔ|êùšRŒnò Ð€ï+ ÁhxuÛ×u,ˆCC¿oNË!j~=ý$¬Ü¼*‚B°«ŽI¸ÍKêñ¶/ÃïUÊ•wC }§¡E?¬öQI£Ub_·_ÁH§ô KÝñ*7¨Êp÷T)¦T,Þ›ñE9õŸ -¢QMþï€>û¿<úÑ–)çäôOÍpŸaêSI¨ðÔäþ²-™Êä„èÿ¬O*endstream +xڵ˒Û6ò>_¡Ûj¶,’ *'Ç{'Û»“qíÁ™rÑ%±B‘ +IÍXÙÍ¿o7 H æḶtÀƒF¿ÑhHÌ8üÄ,NXb¤™i±˜‹x–oÏøl ßÞœ ³ð@‹1Ô×gß½Vzf˜Id2»^p¥Œ§©˜]/?Î&Ù9`àóWïß½¾|óáê幎æ×—ïß/dÌç¯/¾ Þ›«—oß¾¼:_ˆ4óWÿxùÏë‹+ú”8?\¾û‘f 5 ½ºx}quñîÕÅùÍõOg×/c~WÈÈïgoøl lÿtÆ™2i<»ƒgÂ9ÛžE±bq¤”Ÿ©Î~9û×€pôÕ. ÊOp&U"”"$ÀØ°DIeض]Ñ/švY´È ,Q£%QÊD”¦°¢”¸™_oŠó…ɼX‹t¾*òÇzÞ¬h¾ß”Ít›f_-iö³[µ-ë¦Ey¾€±RóMsWÜã™®¬ó‚d5-ºº2©[Öô©÷ddËeÙ—MU4î€ :¨ÃnŒÍž—…Ìı´,•yVUå@~í{yS÷YYw4ʨé¶JÝz¿ý Óªµ@!u~å1Ïê% ,±Ðn³ÚãκÂA–ýó6.ëuUø]½x1E~·)óe’O¹Ã½Èb­°°¢¶)Í,¤{uÓSg›õ=ògûû|Ãä)SB¥ùµG¹jªª¹ð•[FM·ßn³öàv_¹v‡r€–¢¢Êúbéˆmœ)Ž­W +͸€ˆ@¶˜åYÜ7YiXªõÑdO=T0-D2KRÍ„2â" Åêa‡ Ž„-Š:û\§» ~,#ñøöT`ÿ1«BÆLñ8šp¹ +HÏ0‘ĉÊ~_p"b&R^p/œG¾eµé} Èé=µãK†îÇF²,VÙ¾röu›UûbXÐu"X*"ãh©›¹‚AO=©gPRªùSzA=¢g5Òs^Y BX”5¸ 0vOå‰f*ÖòqJ¨)®µdJÁA0¡…¤, ¨§½µŽ ý»ÃöÈÁ¶Í­‡ê3Œ'R‘ +ÝlQ÷mYt¨xˆÁŸ!t,éƒU7´™k¾ú@‹G0YµnÚ²ßl_P°5œi•ši8Â0ª›¥<Š'žì=,•Â¯„“eߘž4pMÎk¦0™pO×\®è«=lð3„";ÁQ,2BS´ãÐfYæåi%ÞÁÑ4§¼;m`ìËó½=í¶Y.Áà¸~ÂfGPج‡²ʾ,œx»ò@t2LËô ¨娈inNH ä+¤¥Üî·4ȶ;î©O*€Å¶êÓIVyèéðTV3Øî;‡pÕ´î‹ßÂ{ÈúonqÚŽ3ÿ÷¦¨K¬î Ý‚GSÝyêd¹,š/³>£^YSëŽØÈM¶O®‡ãÎC•®W•Û²·a6>®úÞd"²/êné÷[­×4ìºò¶¨Iã÷Êú#m“ü€â†%!„ ßÒçb^|É‹béy4¿¬i:£æH§:û ÍnÁÍÊ-0º-‹;NÆ1(Æ[f»]U’\á.k! $9Ì R•¨„@¶ƒbvç ì|näüÑCÈŸ<‘˜DG¯.¢ˆäm(ìhf”œ¤ÖûbV@X 7€„ƒ—¨„AÀŽ†ëŠÐpáœdÈç¿ôÀû¶¨moÚ ³¦À3œúäÏGøÊÝ'8®ÛßíÚbU~©Šú†>üÇJK*fðN2‘ÙG‚øܬ÷u!9øÔ´Ÿ0Ðáð{jnBæãïÚæ¶\‹ò˪ý +Úâ÷}Ñõß„£XÖ™\»Ø/wí”OòŸ¹;ÆÖoBзYÝ­Š¶{îjZ½€0¸E·ÇI¼ŠP¯©‹ÜyŒÿõD×7ß KÄtÓÇhþ­8tÞÆlÓõt±!øøðÆسÑ?¿ZN‹®Ù·yqä´ÜEÖ<‡ˆBhþ¬ñ0f:Rä…·Ÿbf´Žg£ù#ïwMÛ^…ƒ›}XIÀ\<®¢sq›ŒIMî“j4“‰uP$)>%5™æ¿šTÉ“J› H!è—«Ã󊉪–ÑCM¾M ZAü4O ó¨™ÿ™F0™JÔ;²v*K÷i„ƒúÔ5]ØS/¥€c‚'Sð’ ÚÂÍd¿#/“ÍŽÓNTJ³(¢¯Þl*•J'qTÞX&ƒî¾^,Xà ²=¯‡ V¿E,ñWo6KÄ9‹L*‚bÜuaEƒ›/vMSœ_ÏüÓõ ìMNgDÔû$·Åpíz×"˜Püù}(â¶ü¦"Ó ôé4èÇâWÎe]K¶°†]¶•Nò£ë¡F4ÉòR–¤Ü_ÁRR¢Ï»m\@.ii³ù+ ó ¤¯9ˆ¬ìú2w“6‰…KŸØf]×ä¥+tÁØeÎœÒjhüM½· ϶n©#Ò^᪪èªz\¹£¥HÓZ i¸˜×ë~3”?UlôIù U€}Wä%®-–öþoo$(r%í§Ùº ®½)OSG`UÞ H‹½:ðhþÞ–7ñ%óÐÙ6]²sNhk@TUfowØ?^”Ó:£Zfe£.>½£Ü¯}º @ȯáht2Tž@þK–7õ*`1܃ulÆ×ÜX1ËÔ×JÍcfh°¨=e† +kÿZÌP«yn/†Ð¡²‚ífî1&Ó7;š© +¸%:øÕHaíõ°ÞÃ5Œü &q¦rC_Ö¤û„9 °¥DÌDZCðLãgÈ'1© ɇÞ¾Ü3âít/A:É¿ºW@{[Ù´ÓËobLMÍÉAî* +]ð…ÄŠ0Šç‡fOeÙQx´#*Ϩ(±2†‰qôDZ…Ø·/jЮË[{Â~³wë?gK·AÖg(¹ÄÀÕ®ým€´/MÐf‹»ïc—ªLØsGÈ­õD»Ú·`wm(sÀ”¡ôïFd¤PûçVý›UÐ¥Rƒ_;ýA-Š$ñPÁ÷8·Åžûz€àÔ÷ß¹5kHë¢Á¼'%ÀI‘bjìwóÇƹemËÐÖ/aênSX©ÛÕ2u:¯šÜ¾oj3J@ÕˆòÒ4|´ømÖõ# áõ¬ýs@·ƒmûN‰›ÚLÄ"¨Ipqæ(‚i¾PçÎHÁH,=<™ÿaã&öü•G12R»ùëõscçÉ”+% ˜¯²Û§¤)´•¢Ž¾Z“‹´váÊUîíž¡¨¤Rg¶yÆ;˜9¾ƒáΧŒ?ðî¯b†õ²9ÒáoþOÀñÜÅÓT†ëïR§p$Ž(äFóûoîÏ÷Iÿ‘w–·endstream endobj -1400 0 obj << +1416 0 obj << /Type /Page -/Contents 1401 0 R -/Resources 1399 0 R +/Contents 1417 0 R +/Resources 1415 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1398 0 R +/Parent 1401 0 R >> endobj -1402 0 obj << -/D [1400 0 R /XYZ 56.6929 794.5015 null] +1418 0 obj << +/D [1416 0 R /XYZ 56.6929 794.5015 null] >> endobj 426 0 obj << -/D [1400 0 R /XYZ 56.6929 654.5469 null] +/D [1416 0 R /XYZ 56.6929 550.5868 null] >> endobj -1403 0 obj << -/D [1400 0 R /XYZ 56.6929 627.5235 null] +1419 0 obj << +/D [1416 0 R /XYZ 56.6929 523.0374 null] >> endobj 430 0 obj << -/D [1400 0 R /XYZ 56.6929 355.4402 null] +/D [1416 0 R /XYZ 56.6929 249.7563 null] >> endobj -1291 0 obj << -/D [1400 0 R /XYZ 56.6929 325.2926 null] +1307 0 obj << +/D [1416 0 R /XYZ 56.6929 219.0826 null] >> endobj -1399 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1415 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1406 0 obj << -/Length 3514 -/Filter /FlateDecode ->> -stream -xÚÅ]sã¶ñÝ¿Brç„â“ 'O—œïêLsI}N?&Édh‘–Ù£HE¤ìSÚü÷îbŠ¤¨“¥û†ÚOõö#0CEÑüö!'Øf·ÝÔÿ¨ïé¿…^à¬%zk‰X2 Û…¸Êf[?Y¾(>Ýoýè>eÆ2ma48­²)Œ 0„Ûü—]Þ´'f“Ä]–é®Éý¾ -ÿßÖô¿N?º Åó¢õ»¬›¦¸+ón Ÿ-”0 L‚%ÆH‡:+š”†ÆÊqÂ5vŽG±$àúŸoo¨•?浞¨%çwuû@°uÚ´ù–ÚÈ×hÊôÑãƒk¿Xí{w›M½mé£h_A#óûÚcÉ?¥ëÍ¥˜ OQ]y@ Ñ‹X6Ø`“oómCJ_øÿ»Ýjµ§&Q å6mr?À­ŽÀz»½Œç»Më;²´M©å·-Ïœ~à_Æ:jfmLÊz;­k ‹µˆ½´ó¬j&4Bjfu§¤ Þ"žg9ð|]TH¼)fl©ÓÉ¡e½LK‚O¨ýT”% HÛ6_oZ?­¦¿ˆ_½yÿÁÏpGز^¯wU±LÛ¢Z‘–i°ßب¡ ž -§ÀÒ0hl/S¾®[ÿíIg…6+¸·Yäx~Ÿîʶcðû"˸Ú³fŸO±Oh–h,Š„N¨Œ¹g…$9Ó²3IÒb—mMñk>±”‹üèzÓ52ÍZØ)ê’²‘íx  ïß|çG!Z×jÒ–:‹† i¬j Ð1ú¾ÛO‘ ’P‘ JU¥ë<› S¡VEÊò¢œàœ¶{”jG)9‘9‘¾0•H†Â4øûe"Á9õ?¦åÎ)«û£ÉÔa„$(©_2×<‰r·oI¿“ùÜð>Šz×6à›©³}(83˜xéò |Ê'c`ÉŒ•a(x 1Â*D€Ø ƒrä;‚ á„íKÅ„C‡N¼oêk,]¬,<‚>üw9ïvL}Ö=‡ápÓyŽjï75ˆD1Ó]V‘.?6´tÚÐr8»OÌçIMîGþb^T”#§³ˆ›ø3µP îÏ ÍâüV Ãð{q*¯Aug5ZÎsw¢¡B, °f<6´†ø»¥Á4 òŒÊÙ9@Ð+:êtçqíª èhë:óð=Á}¶ Äã?@böÉÃ(Їᛴ]>õÌ~ ƒ]c¾îÄE[±Ë/ðŸpb "If@ç£DÏÿ…ÎÔôбtg/4šM¾,î÷ôñôP,¨IöBmwŽÛaCñØH=’`—ˆÃEÐnÚäÙÖ -É¥ ²è¬x¿¼kðKÇâ[t³¦AÎÔ×÷«iÃÉ_¶˜•ŒÇRõ”¥ªnérC5ɳW“éÌ/þÀʽ…ˆÔ¢pZ¯gX¶Öƒs~Ê”e*éøß´)äRÀq~’/J8DåÎ÷î.¥#"FáKØö|¦’qß&-!Æ–?µRkW.°!þ‚Fµ[ß¹äƹ¬Úb\-wÛC<Š°¢º«wÎšàƒŽ‡º#Ëut‡Ùp‘ÿqÚ0óƒ¤rJú­ XUÕSþ\—ŒõH+N°G)’èþ‰=TÄA|xÖ{@º .¹;í«Í)Å’O*<Í‹WçI-³šIÝ^0Tº Æ“D<3•F~}Ì÷'ê †Gr\oÐöd  -Ä£† 锥*¦´Â"ãR£„`Eii ¡„˜à9¥FÉ’8Ž§ ‹ßâ€jˆÃ8,Z)Vuf2J É⃀²÷[9§¡½ÓЧj‡p¨ÄÊŒ¶>f/G¯:?«|’—Pº -ÿdÀØ¢S—F•I—>ñÐ⃥‚‚ŠùžT”TBŽŠ1šß~¸~÷j,!"£h¦#Á"¥cd unW3jÜôª¶ÝøEÂqÕö/’ñ!¤ÇNTsDMd˜j@ÌQá8 :GÁ—烠Õ}ÊGó6-)ZG°“þSXk‡e=ð\Vòù?<"ëŽðn†+ôÀ{njÕ~vbXÈözE’A°ÂüašƒM2ZÓ`B¹ªÒv×ÕYLWô3^Áà•Wùt0£Ï]Cl0¡Ž“P áàÀ!QÂ/h¹ÆfYg„ŠYP&‡€t);=Uyl‡J³Åª¨¨ä8ÌšžUa¸o~ÿ²+|”?ôàw]AbU…¾»}X/ Cþ`Åd²äðº„Èo·‚ NsO$6VÛt½†¬Ð}à™z§9@™èŒ×6Œ‹®ž¼6b…,µ~j¨íœ6Ö»²-6¥‚81ÍRÀÎ -kî{„»ô»Q'zC©çõzþb»ðõifc1Š¯{Eé¹èóΗVͤôS± &MË©² dŸJ&ñ¹{>ë4ÞÅc4bi‘ÝøÊF›C: µ¯ú"ôú»GM Ÿš8Pä§ôÓ>’e>ô8)9Š|rdè„ ¦'kÏ£"\‡\ž›~.pŸb œêVzèð £ï‡ÜU€'iƒ¾ü1/ƒþã<K š¹KŠí!C¼ú¯K§²Ã"G/ù¢›5TÂÔU„<á¿çÕ\}IÎ?@¼W¦Û^!T…‹)Íi¾ 2ÈÀãÈh¸-œ{b[Ò@Fi¤y±Æ)–ØÀŒgìç-‘n):EŽ*†t.6C¿›åmZ”Í«à<ó‘{Íòf¹-BÝÍ8ï5å´ VÃ{ä—©5ú¬‘«~‡‘J¡ê¢G༘Œ•a%Ti+ÏÄ@ÝøEÂqrŒwÑÝ¿ÂìI„O‘’’Ž"¡nÔ9BŽ°õ …x&UW(Ô缯€ƒÜi‘FÎ.+ÏûÝ.7`œ¦XÄ|¹Ç5ÁãF'=®y¦Çu-ô äz­e1×#S¢­`¶Û•(új|N­}^®†>Ćâ¬3C›œô· -úȺ­&ÇSýnO" Ž æžò·Ö0™tOÎ -Y1Þ•6ÑQîEin¦K#/%ø„×í_?¥áÎäöÙ›d?÷”×…x -øf^¦o¦»Ó]R&·âŸ\DŒ+!Ÿ™“«ˆÏä®_?kN çÑgÍ Ýå¯}„'wgUw¶vÖ¤BÍÆ•3£¼[ÎsëßP`IÅMéY“Ò·&埯`ÇЋ_bG¹™Š_TävRÐÅ© y€>5<„ñû`@˜Ãœ2 yÂ)tƒ… *{iXÌé€%ÂK»ÎKž—ª‰†:.v—‡zÓ<Ukÿ$ÑÿZó| 3 ×H<×~Ür -` Ç›Ó^-à4ÕÄwn&— Á1 i!1lÚbÙ,–iUå¥OÎ>*²îõ›Ï»Ü2zTk•ì±P˜9BÁJÿqBøÌãP£$Š~ E…ÅAlaÉÅÃ6?;Kpÿ%B1c5V3è¢ø“ï"¤½ªZàl¿ -½ò¸?ùA.ë /„ädŠ`†?¯ñäç²ÀÄÚuüæ§~P9BJid2ª"í‘16šçX3z)òÛS’åøC–D%¡DßP®8TÝË®ïÝ¥à±>ŽD}úU@ÜݨNQ3e‚Û·ÚN\ óÒßÓ{ÙFå -b`µ‡­âz #ýãªBøË 9oö ¬Aí4[¹M^Ü°ØÄj¨¥m^Å…2ǪW̦¨§×yع/¡TtáÒÿ‡ÞQ?î:ñÞT|m9ÚòNSþð[ÔÃC]m™Šã12Þ—Ç2±(§“ɘòîÑê1éÿ—ðl endstream +1422 0 obj << +/Length 3904 +/Filter /FlateDecode +>> +stream +xÚÅÙrã6òÝ_áGykÄ%.‚¬¿¹øó[e/³(Kdry³îáJ£8MÅåÍê‡ÙyýÝÍ›÷WsiâY]ÍMÏ>¿~÷%A2úùâÛwo¯¿úþýë+«g7×ß¾#ðû7oß¼óî‹7Ws‘ë%c8³àíõ_ßPë«÷¯¿ùæõû«Ÿn¾¾xsÎÒ?¯ˆä—‹~Š/Wpì¯/âHe©¹¼‡N‰,“—» mTd´R²½øpñ·€°7ê–NñϨ42©´ ”jŠ&‹CÈÀöWͺ8À±¬šÝ—Û-¶älQd¸鬾+WÅŠçÜUqçWìë¦)Û§l:»^¸)ZÂÓÖÈ# Dô(‘ʱú‘†ÊÏéS+D-ÅS^!¶t–y*Ýp·æßÛ‚¶uT»º-<=‡»ñ!RÕI¸œKEB&ÀKØ?3FºÝËjÉ‹ªÍ·pV-5µ°º¥é̦@wùöÈÍš§ãØ)K„5‘&ãóîŽåóòÓú0Ác£Ä(Óë}[Öa/«n¢ ,ýn¶õ"ß2Ì-m¨³ØÖËŒ†AÇ®8£T$TÓ>gò†ô!§ŸU±ÎÛ6rKb˜j£ÌÆÆM½™>wéTI>É¡øåX4íÙc›(ëdb¹Í<¤SÂÆmqØ•Uáè(¤À 2/Ä ÎG—^ @½Ý•Á –mYmhž;LÊyî6¿+pZšyáI½ˆ9ziÕHJˆmp­:ÎÌk¿Ö•“¼d(Çf¶&mÛñ I³™mÊ»¢"ØP°ÍèL3ÌÛåMKpÔÌ4aÍLXZÝÊöUŸ?0æ¥FëuGÃé­)@-UúìkKs"­€¤ÕqI w•gw¢ ÄŠeZN†á7È0‚ CÇË04K9&)}Ž´&nïë¾E¯¢tÿžq¹bk#Äû†:ímÞÒðŠ‡‰Ó8ï¸ß×í³(,?¶õ.oKÎí ®ÉÔAk‘»õö} ("jÞ #}ëš~ñJ•SꇳõÍ™#9C» ¿é¬*ƒB;d =ÕÑӒζ¥q€ßß–Ë[jöŸöO˜…f³¼ZÑxo]M: +­•ß¾n?ƒ–öæ†ÂõÂ0߯^OH£F˜e^À`ƒS!œ‡Yknëã©L€Üí}þÐPû¾>|DÍIg¸l<€»ãŽSø=cÎSÛ6Ï6çÚ‚§ÉȵICitP¢§5ÎfÙÀNò¹Jþu7àMtJge˧dæ9 UÂD 3#Ǹ*›œ¦¦þö ¬2¹¼ óÐ*È¥FЬEÝÞŒ–k“ì@ÃY_š ')w¼YÍ£Aò S’ÿ³uÍXŠOùn–ŸI+™"2ÀØXwÄO¨J'å=ƒ²8n6lI*6-ËCÞÜÍÐJ-ëÃá*÷-¬ò–mZÌœ‘Áz™ Mµð¶¸XUSâ/uduGï:•H®S Û¹NtwŠPvó±¶É†á„¼m‹Ý¾åe5ýò&vöæËwx…;8–õnw¬Àè9ÇK~â×Ô¨áÜ—N>€1Á! ¼ ô;/ˆ:+bÖÙÎÆO°/±Q,…~ÔzeZy¢Ë¤¨L¹O^’ŒÁa•ÄKšWûySþZLl$eÀ¢‘ÇTÖŘxO>:@ó@ßùÏB´®En ˆ ù +XÕ–Î)bñ0E.Ü„JŒª*ß« :JUÈøj'§Ãƒ §TC€IÐЩ‘é_¦Ùð2 þ~•A\³-W4î¢<Œýc/çŒ%ñËfy%Y<´$ßÙìÇØÄ}õ±mÀ6Ó`{[2³ YÈ'±ÜBŒ‡þѱú÷ × +0‹hhE‹„êãî*™b„’¬[‚1 úP©q_6·4莥ãî‚ç^qf¬ÙóW-ïÀüQ\‡=ƒ¹‡æLI.ïÖ"I62ÓÍ€7B”lí-¢³ÇÛâÕØvñÊÀ²±ü1Ž% ßSX„CíS6¡ô-Íú£D +÷¡·%)Ú í·eÑ¼Ì +Cbí­È.ÿô¨~sž>Òï8óú-ø`\åŽ7¤1+;ŽM“oxroÃaÆ-#¡}ZŸc´žåÞQU­0ëMÓ¡2Æ^I½ ¹TŽSÄp±R’ŠJHžÿ©(BXEØWQ +*Šƒ$¹fE ÇÒˆ†!Š"t¨¢p&ÁJéÐûŒ–•L‚WJg1è øXÕ÷cQ{¹Dÿ~1e%óÉãÄõCªŒ–O]e™J†^NÅI¤´MO•òÊ®²¢º` 8…Œè¾&0¥»ØêªMØÛA Q¯@ÉæÖ»l;Þ4ÊM#†> ŠSs@x_LÆÀ22Vš®€¤…«g4´K ‰Ê‘ãõ:{ Ǘ*VL¹¬¦>ºÆÒÅÊ‚¡KÊÄ\N‡Ó…ucË!árb,GõÀ‡š +D’4Ò!«€Ì°¡­]f Ûáê>1“8ZÜü±œA9‚p2‹¸‰?SG˜‹LùåVO2 >‹yHwuÐ-!­Å +IJmF·¡!#>¶4™AžQ9=jbE@G½æ"ôÕ +èhëzÅð‚sµ ãï iô‰aèÃô}Þ.o}QŒ0 ̨QÌ/ð—pb "ÉÈ€Ì'™žý ©sô0°t¾;X–ëêpêŒMÒj;?n}„ çb±‘3¯—ˆÃEÐnÙt9'á)ßEÐRàýðîÀ.M$ÔaÕàødLÙY\O¦ëXÅ‹_¶™•QœJÕtK®Â‚^Èq ŤX½Â˜LŸ9hša~ñvîmD$ yo}ºŸU ÙZüü”*(©,ð¿ióÖi çÛÈe1DåÎ÷ÔlQŒÒÆ£ÊVWr<¥CƒÍT2íë¤ 4Ë^ ÛrçÊÖÇ_ШŽ»•ØW1®–ÇC"¬¬õÑit|%T +¡ñ ÚÛdÀ\6Ìü`‰¤’|”pVS¯L—LõH*ΰG©8ן{{(ˆƒøÔó¬?»`@¾ô&9x{ÇjsN°$ä“]…'Ð<ß³8OJ™Õ‘ÔAñ¼¢rè&¢8ËÄ3SYa¤ç×ÇâáL½Áĉ×4¤=+âQC|JSU¤;Za“ñS›„`Eii ÃŒl¢“ç<¶É(KÓtú©m0Îû(émKƒV+%º²LTBFiwM«O]9Ó¡ÙtèsDp-©2#Œ™£mJÇfM ?Š¹}˜ñ¤ÆØ"_[£ààˇK?4ú ¯ ¦böÀÏ>ÓÇ™•d0@¿ùpýÕ«ñ­‘@™$— +Rœ4†|XHƒ‡Í%5Þ÷Þ.ÃüyÁéÛå)^$ãCáIO-øUsBMb"!Ô€˜“çS?é) +Ƹ˜‚vçÄ=Mfm¾¥˜Áîüs6Ř=°_VƳ0"ëyXÁïLŠßæhiÕ>º Ü¢ßÈŠÜͦp±‚ýa²“M6ÚÓ`Z¹©òöª-&”þ ünŠª8€ ®¨{lˆ ÆW`Ê1!8Rtéö\¸åû=äž~ +f=@™ua髆B˜»º3~{VÍU™äìD}ÛüÐ+‡*ÿ<%“­·þÎäè}_&£÷}X{æXÒ@^i¤y±Ä)PÏŒgœç-‘n»DâG•BR—Ž¾sXm^n›WÞx#óº*šå¡ôÕ7O?ï +ˆË~MõR%µF?©¤Æªß¡¤R(š>aèG`¼"™* wb#‘Ø1P˜?ï/8@Nñb úN‚‰ì I „O‰’’N"¡0ë)BN°õË…ø(†Ÿ†<¯f.€•á3° Üù+M$ø.+Ÿ¶»!C`œ¾Lá“ØÈ—[\ã-nrÖâšgZ\×B›@¦×Z0µg®-ÑbC¡²ñŸ¶Qf­ÃWpÓ¿95´ÙY{«`Œ´Ûj2L°”O{©7L6;ko­‰d>\xò’U‡'Ú#JæÁ¼(xBª¡•ñ„Õí?BåþåîíÑ÷d^{ÎêB<|3/“7^v—ž”É£ð‡I+!Ÿ™™«$|VéaU§,Ž“GÕ ò×>³§³*øÖ MÊWn\Q3ñÁ»½?·ü%ŽÑ­¸%=mrSúÚ¤ø#Xð„^ü’:ÊÍTü¢w’’žO­Ï£ìð©¡Æ~§@˜ÃœS “°ázGMü•=ƒÔ,æ|À’àÓ]°’OߪI†7[¾*ÁtœŽ‚éÿ£I´¿Ö<_ Ük"ž«?n» ÈÅÀMƒi¯»¤,1ÀùÍìj.bLBZH ›¶\6óåm^UÅ–“³]]Ö}Îy—ÛF*®Àç,K²P˜9A˜ÀNÿq—‚zÝ«TE?ÐŒ²Â!¶°ä°ýÏN\ç¿„B¨ÈXÕ úÌQü‰‡io€ª¸šw¡/¨w×ù‰'¹¬ÏS<2&U5üy‡¯!?Ó‚nà7^ú™GAê)¥‘Ù¨ŠtrÆ(ŠFëkFß‹üöÙ¹ÏîáJñ[ù‰Ø&Bð‡?Éïþ_AÛH¥©œ’ðÙ4•™õD!åVŒ)ßþ?'´À¨endstream endobj -1405 0 obj << +1421 0 obj << /Type /Page -/Contents 1406 0 R -/Resources 1404 0 R +/Contents 1422 0 R +/Resources 1420 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1398 0 R -/Annots [ 1408 0 R 1409 0 R ] +/Parent 1401 0 R +/Annots [ 1424 0 R 1425 0 R ] >> endobj -1408 0 obj << +1424 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.0003 457.8291 166.1092 469.8888] +/Rect [116.0003 361.0037 166.1092 373.0634] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1409 0 obj << +1425 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [399.2874 346.5415 467.9594 358.6011] +/Rect [399.2874 253.3317 467.9594 265.3913] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1407 0 obj << -/D [1405 0 R /XYZ 85.0394 794.5015 null] +1423 0 obj << +/D [1421 0 R /XYZ 85.0394 794.5015 null] >> endobj 434 0 obj << -/D [1405 0 R /XYZ 85.0394 240.6473 null] ->> endobj -1410 0 obj << -/D [1405 0 R /XYZ 85.0394 213.5966 null] +/D [1421 0 R /XYZ 85.0394 155.2922 null] >> endobj -438 0 obj << -/D [1405 0 R /XYZ 85.0394 126.6995 null] ->> endobj -1411 0 obj << -/D [1405 0 R /XYZ 85.0394 93.8745 null] +1426 0 obj << +/D [1421 0 R /XYZ 85.0394 130.8971 null] >> endobj -1404 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> +1420 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1414 0 obj << -/Length 2970 +1429 0 obj << +/Length 3082 /Filter /FlateDecode >> stream -xÚ­ËrÛ8òî¯Ðmè-‹K$LNy8Ïî$YÛsØJR)ˆ¢%V(R!©8Þ­ù÷m )ÑLùÀÐh4ý–Ù,‚?6KÒ0Õ\ϤŽÃ$bÉ,ÛœD³¬½9a„3÷Hó!Ö‹ë“¿¿r¦Còtv}3 ¥ÂH)6»^~Ò‡§@! -^¾{ûúâÍï—ÏOe\_¼{{:çI¼¾øç9Bo.ŸÿöÛóËÓ9S ^þòüýõù%.¥DãÅÅÛW8£ñsÑËó×ç—ço_žŸ~ºþõäüº¿Ëð¾,ö"_O>|ŠfK¸ö¯'Q(´Jf·0ˆB¦5ŸmNâD„I,„Ÿ)O®NþÕ¬º­“òcQÈEÊ'ÈÅ”¦–¬¯×E —biÐv¦Ë7yÕá°¨º¼ZÒZWÛ¯ 9Ž?F‘È¿‹2®Ýv[7Da³+»bëQ²z³ÙUEfº¢®pjÛœ2Ô]ÕeëO%‚ëO¼Ùu;‡–ŸÁçÁb×áJ†ósû ˆ9c¡Nîn…;ª®¼\™uå¡_®¯ß#d²,o[„ úÿùB¨$¸°gÉ”è}Ýv·6B¤8iü8AÁn½-Ê|‰£Û¢[#T‹ï›’?ƒ‘Rî¶p x/6x¯ÞU§"ËÙ;Ù÷)Ú®ÈZ¼ò¼_]=[›ªÊAžHp¨±yÌÙ€žo•¢”„é¢,qÊJhÛ9æa!ÿ–W„zCßWpk -OS”4eoZïˆ4>&Ì­ÓÜ2Æûœ:¡ç„5SÝ!6½߶ž çêÆ% €îC÷G@2+5~óõ¬±FzuáQ¨RÜò¼š>KBÅSEÂ*ª¼›(P1NHY]ux”e•kÿv PJ0ipxýò=ŽÛ:û’w—ðÀyUT+Ä14„‰v›g‡G9f™Ç)˜¿×—b{èD¬Ã(Rb&#ê(QOñO€©”šöNóžâ|H]Ï3‘À iÉö'[«8*ga¤%ÝÂùŠ§‹@Â^ÅĽ"ˆpÌRª¿N=ÅGD'2di*Ç"0Ëes„7Tk)B·ë"[“âÃzÅêÀòƒ;qÎGéÀ/Þ‹qlÀϤ9œOkÁçÅ<¹ÇR¸=—ñ½‚å<{ár–jðJI”þ°`{Šó!ÉcÁ‚v„ŠAÐëѬÙÇ^²õ ¢Ä£«2ˆŽDSʼ«EüÛ)ª$’³ÖÇ(‰ pS´_f(aôŽÚÔC^NNÄßî#€Ãòo¥¬Ç[fÆá/é=÷oõ â (‚H¡¯“Ù8 Ô…‹;Öy -pV5?tíÂ…G\u>ØMÜà×±eöîµù©Eg¥×µêÅÁË¡‡tÇÖûã<„P!˜¨{ÖÑõ´¢ë² Ä1º°Û¼ÙÞPCídP¹`Å%505÷ó( -%õ 6 > ¸šƒðä` "…lᇮ§8’œ¸Rc ÷h–Íé0=eœ’#žÆ“=ÅG˜ðúð1“6MYDBÒ½E@R'ÐÂ#3œPAÐÀ˜óÇ4P…1Sz¤¨Î€8å-”agSé,€|…TfÓ'½Ãc mãaCÎ.ô(æUƉRÅü@8¨¼Œ=¢^‚­Š}ME…¸» fOÆî¼äÆÝžQÄ÷ŒôÊ -*ÌE y‘â6Ùò(íÛ{òhEð\Í’ƒåüK~G×»ßúMc6ÓL$ ö)´mhGvL)Úÿu/f«ævàóå,ZµÛ,òæaxˆÿlJ?ãýÿtÝçC†Ÿ>Q)0ÅûϦ„¹ž«J¡zé…ÌŸ*äW¹Mÿªbÿ°¦"Kû½5«|B¼ôEŸTL˜2º>q1‘Ö5®’©FV,‘Aפƒá«·WWç/nól×ÝŽÐpëξa­'ÖfM±Àr-²íÉÃŒ¬CÅJÌ„„JÆ.áb³š!p9hÖöøóá†ãfí1]{Õ«Þ3q¨Ž¸Á«Oô˜ë… n®„v k¼ÞnµÆ Ц3„ò®Ò ¼È3LìÀ†2Á°û,|Ó›ö"°™áe,TO“#:[ãû߇ûüI;ˆÅ«Ê¶¹'.öÎ…xa-Û~Hèv¼¶í -;³È]Q!ҾߊDµ¤„gpØ5§*pcKzÀB’(jÙ]ØDÍM7&¹Æ³EðÖféùYbÁ7SËÁæŠ(RÛ6ö„WÞ?÷aIJ1´.¿åTÆ’§dàa¦³{ßØûH4ÝÓZ° kÂiw‹e½jÇY¡ œW²w^“ýlw˜9q€\kÊùiduCwÚÖÕ’J8éÔ¤¥¾•Øº¡ÅdOê©eúDŸ­¹oëî % ¾Ìó? 1äßmªî@D]Q{¨ÄŸ`ëP .Ãæ@ñ1&&TèÃ"ÎÝ6ÄiП°AY¨ƒ«bS”¦qé$¬¢_(@½tâôé@îqõdá@É£ûž·çü™«FGïeêXÄô|½ú{ -€âýãüß>WH!YHõX.——mÞ*ÿ^¤?yu'vèNä„ÃŽÊXG#ýp%}%ö©±4H„¦n¸Pƒ*f¿Iˆ¢‰¶×kŠÜõcp$&[÷{[›Š£‰hR9ÿkRpr\´]œ¶©ôÊZJ(ªùÁtö÷S³²ç‰8ýJS¦\ÙH¶Þ¸qLNŒûÀ ¡7q€o4ÈöÉÙ5×ËîDwÎç‚ì/ßÀüÕÖd¹ç§3 VùmY8s±;-#3 T?«‘»ìv÷c{}µÎnUÕ}¨z¿¾ÃG!yæ ´¤}Ø8[,<Ê×nK_.î¶þ8_TFî–á=Ù2–$É>[”-+òÛ?YŠ`2ŒR"õÙê“°°-–$9(²Ò´í§aÅrð® 3ÏÊé+÷¡.Òg‡ñÙõAÜüÏî§É/¨¾¡6ÙŸ 6è ;ZHÌæèÞ,þ]Þ~®›Ï¶ÝápÏ|RÀÈÿÔ?tºý/Œ‰l:êuå‡ÿÙcÿŸ0± …R|:-ç¶+¤€1e9—Ñçþ¿BŽYÿu´Éendstream +xÚµ]sÛ6òÝ¿Bo•o,¾HÍSš:©{×4g»7i&CQ´Ä Eª$×wÓÿ~ ì‚_¢ãtÜ=p.‹Å~S|ÁàÇaDF˜ElT2.Òý[láÝ›3N8+´b}w{ö÷×2^˜ÀD"ZÜÞ hé€iÍ·›÷Ë(Á9P`ËW?¿}}õæ—ë—ç±ZÞ^ýüö|%B¶|}õÏK„Þ\¿ü駗×ç+®C¾|õÃËw·—×ø*"ß]½ýg >!z}ùúòúòí«Ëó·?ž]Þvgž—3iòÛÙûl±cÿxÆit¸¸‡ ¸1b±?S¡ B%¥Ÿ)ÎnÎþÕ¼uKgåÇY d$f(ø‚óÀ„¡I04A$…ì$(H…1¶lڤ͛6O›UºKÊ2+<ñ ¼ÈöYÙâðûìWÆD™·yUâLRnø¥I¶™• ì.×Çð:‘4nÛÛGâ$n‚Xí3‡3ÇÍ)a,VÑ` 1*¹Xn²´Hês®—Yƒ3iµßË·É2IÓ¬™¼ìOŽã¼¼«ê}Ò‹»º£ F”Éž &«?gµUØÀq‚ç:à!Ý÷í.·Dy4•æe›•zç᱂ÃuËì÷|]dÃ÷@ãx8T5QØ‹6?x”‰ íÔÁÝDÕViU4~W"è;ÞÛ#^ØL¸‡c‹oRœ_u§ròE?€+ʶ€+q¸¬Jýp{û¡NÐçô$þ³ x©Ãå•Ý+ŽˆÞoǼÓ‹Ýî’!ò|8AÁN}È «1vtŸ·;„Š|ýû¾/`¤µ;í©ö+0dÉðTýQµº÷#Õú‚i(%ø©i¡t ÓyQà”•Ð¡uÌËìsVê=[|ƒK#¸š¼ ){ÒêH¤ñ2aN]'õÃ9ë±×iBºNx—”ˆM7Dû7'蹺Kò‚@çŸdì|>³õlÎpÍËrÎù€áŠH“´ò ôT¤à¡Œæ‚Òªlq/Ë«0þ2ì@£˜`2Ááí«w8nªô“³~€ ¸á¬ÌË-â$4„‰æ¥¹u¶p+§, Ã÷ +“¦ñH*0Î( +!F()¾&" 8¡ÖóñhÕQ\ Iú`Ós&C¸"ó~gË¡ó§B<`Æ{}ç,¾^1¬Õ\>*B(Žcý׉ £ø„T<Šâ±’ͦ~DÒ[ª5)—÷»<Ý‘æÃû)=1}§ñàOœ÷ÑféÇWï>+œ#ð3BŽçÔpzJ„XC§±zT°BD`/Ž'u„Ÿ-׎àj@ñT¬ æäx¬/IU†)/VšEÎÉ!b<ñ Và[-âßæÒ ˆê,^ °~e!KÀzë¼ù0Gñ¢o4.œÖð2r© û¦÷ÿË_”¶þn“bª²¡Ëì/êjDAÐM´ —“Ú(k3u¬ë”àü\C¡»tÁß:ì&îðéزf8ß4ˆ‡L::=K™ÕžHCZ|nIJÂ÷èÍpî2 Š*H ög‰æƒm.Ð¥CÖùøS]@#âøq7È%¸É2߈«@Æqül]í(®†$O••K„û¿¬­!äBOh«P±Qß~;¡HˆPV +F)ǹàe‘%¥”ÊÙ„“Ïxâh6ÆÅDÙBwÎë@¡ Ÿ¥Ø<‹3—þã}’áèW!ÔÌ©%—Š˜yÒHÃÀÄq42RK9*b}ͱ|ªX†\ÇüñàÇ„¡2J„êù±…®†gB‹ÊÌè~ã/DW¸qÍ+„R"P2âÓâ ÃГ´`ÿ‡®Ø`䟩X |Œ*÷ ,Èi’Œ¹­ó]!ÌÙbÊ>Ñ:êÖ…%ÅÌ5€ÆÚ@åˆGHŠ¢ºŸ³Ÿ8ˆã.}†Â®×êSËWC鶭úí@$DÖ“ºmt<£éxç|Yà˜jK²zŸ·xBµS‚Úo\NSóy¿`,ˆE¦¬w°ið4Þ^NÂGQÀylžp=ÅÕäLÄ5[¸C³lB9ŠÙÉ(á‰HýuLvŸ`RÂíCV ÆLÚ€4gÖ‡¦3 Èé$zC¸$ð†3*¨„xJu ¸6# D p¦Ä)#h  »˜Ëfd,DÀõ›™m kA¨ e‡MåÝF|à˜,šÞÞaÕ²§w®³À0åÀ^G^¦¾DK`l4á¡Û³MrÚŽØämþÙ-˜Yóv/]Cc¦š^µ€o +8ù$$íòíÎ÷#³¶Ó•ïÊ}eèu&Ý’¦Â^BšÛ)#¡u$~;Ú=9PãPçPNXÛÎvZÑuÆæÁôŒús®0P¡Ö3Õü@:OèX|,9B¿$„[­|ME•¸; íf#ÏǼèÆížQÌ÷Œ š‘à}¤F2o îE)Ó·#9µ#ÛúéÁfõ){˜ïC¾©“ý>©gR†I»qL)ÚÿuWf ö6qúµ s­<î×Yýexˆÿb.Ÿ}Š÷çéºÇû >| j`Ž÷?^Ì ›ÙÌ"ÐŒõ]s!¾VÈÿÇf¯Šº\vÄÆLfg€cε²Ørƒº6 ¿{ssù +á&KuÞ>àM·j]åËø3o<±&­ó5–l¶õz’ôyh¥åB†*`Üeþø®Þ.¸´ç;ôÕã׸W7¡jÏyÓ9#àDú„È á•“ïÒ LiùÐ:òÒ Ów"!( f¦…¨—´ä¤q„‰ ï.Êå€ly¿snDúØÀá¸.òaP°ž ÁGY•«äØî*Ø/¡Óÿ©Ê ûý>•Õ½‹#Ò7a²+^ÓR§&Îs‚GŸ±àjm~°ýM<Þq»Ã У „²ŽR#¼ÎRLì w_$°ó,}ÛÖ"Ћ̎ð0ªæÉCâ{ßÓu~§#Äámi[Ü3¡ögÞ¥5jû ¡ÛñÎ6+ìÌ:s%=†G{[Õ†^‚ö>×KgË8¶©ÿ+c’,» +û§YÒŽÉ1×t¶~Á.Ùx~ ÿF–øòsRä›Áâ’(JÛöÌ©ûëžÖ£>«Â~CAg×'NáÀ·L{÷e¼{ôñÒ]­+ñ_r(9®7Õtªg ‰ÿˆÓSØ»­ù^¶ÛMÆKrà¹Î”óÑ0H«šu¨Ê Õo±Ó“†ÚV2ÆÎ ­ÈgûPÄ&Ž¾Ò]k@îZº}•Ô7Y¶÷;a/³ßmžî@DÝRw¨Àï0Eh >#!Ìæc<¿šiçÎ T´lŸ­AMh–7ù>/’Úå’ð x}@ꤣ¢G¤‰;ú«…õŽéúÝžph®\mÝËÔ¯Pôž^ÿ=@óþqùoŸ'D(Df,—ëë&k§Úß‹ô¯ï¤ÁÁ™|pØO™UÒG3veØWHG3ßy…4Ô —zP‚Àìàƒ$Œ(œ{¼:Ï\kQ'IÒ]·¶±i8šˆ!•ó_"‚“ à¢ñâ´M£/PÖ1dY±˜|¡³O“­ÝOªpô”¦’bkCÙnïÆŠ¼˜ðA€ïˆ½‘ÂÞÑ Ó÷ß²ákåW¢?¡óAöÀüÍ!I3ÏO›¬=Xf÷EîÌÅ®´\ÌøÎ4©¡ôÙŽüe{¬½#ëõÕz»mYu±bèþºJ /…\ä…¯Î&H}Üx[¬:Ê× +_+~;_ TFî”Á#™òI9")Sþœg÷Ï+CBD´>ºöVÄvË(œ¨Íû´Hšæð\™d%®³J‹8éÊ÷ ÒG‡ñÑuAÜü/©·$¾ û 5ÉžI¬¶¬Ôl…þÍâ?dÍǪþh»ÍO•JN<ؤÊÇ>sÛÑëæ?vNaºf5+`äîÿ;€nÿt3“M³NYžýßžþOP›I­Å|^.lOHK陲œÇâ„sÿ' SÖÿVíÂendstream endobj -1413 0 obj << +1428 0 obj << /Type /Page -/Contents 1414 0 R -/Resources 1412 0 R +/Contents 1429 0 R +/Resources 1427 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1398 0 R -/Annots [ 1418 0 R ] +/Parent 1401 0 R +/Annots [ 1434 0 R ] >> endobj -1418 0 obj << +1434 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [432.8521 368.6685 481.8988 380.7281] +/Rect [432.8521 350.2114 481.8988 362.271] /Subtype /Link /A << /S /GoTo /D (DNSSEC) >> >> endobj -1415 0 obj << -/D [1413 0 R /XYZ 56.6929 794.5015 null] +1430 0 obj << +/D [1428 0 R /XYZ 56.6929 794.5015 null] +>> endobj +438 0 obj << +/D [1428 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1431 0 obj << +/D [1428 0 R /XYZ 56.6929 749.3407 null] >> endobj 442 0 obj << -/D [1413 0 R /XYZ 56.6929 543.7303 null] +/D [1428 0 R /XYZ 56.6929 505.5458 null] >> endobj -1416 0 obj << -/D [1413 0 R /XYZ 56.6929 512.1243 null] +1432 0 obj << +/D [1428 0 R /XYZ 56.6929 477.9188 null] >> endobj 446 0 obj << -/D [1413 0 R /XYZ 56.6929 424.5706 null] +/D [1428 0 R /XYZ 56.6929 399.4257 null] >> endobj -1417 0 obj << -/D [1413 0 R /XYZ 56.6929 390.1552 null] +1433 0 obj << +/D [1428 0 R /XYZ 56.6929 368.9893 null] >> endobj 450 0 obj << -/D [1413 0 R /XYZ 56.6929 210.2494 null] +/D [1428 0 R /XYZ 56.6929 203.5616 null] >> endobj -1388 0 obj << -/D [1413 0 R /XYZ 56.6929 181.6082 null] +1410 0 obj << +/D [1428 0 R /XYZ 56.6929 178.8995 null] >> endobj -1412 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> +1427 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1421 0 obj << +1437 0 obj << /Length 2930 /Filter /FlateDecode >> @@ -5861,134 +5937,139 @@ P; Î/(7’»â’œ—Hlò[;aA/NU^;©Gœ4üí¼ºËHC¿3Ü|Èçg”^ëW|É„3×ÃA™½ÚÕŒŽÚq…bW¶.x¬á{?äÚx®>Ìk¢vsF=Ë1…|P&pÔ©ÄJÃø0Bªÿ< ©C¸ÅXyÇ)°XÈ[Tæä€N8DO×–üôàUÒŒ§/.§Ë`â°µ+æ{Ùt¼»Or1w'n³zé?¿„Þ\ƒR@1’Ï;Yˆ;c’ÊÛr8 |Ž¸¸ô±›t@.9E³Ý••]-ýðåÍæo%ù"¼ü³Ã­²™æÀ´3­±†3ψŒÆdsõ"ð%Q}@°íGzC’“œ"«©±Vª¿Þï«r®úð#ÊLr¨6qW?yèX]pª÷„Ì4ÅÎí(,d Ü]f$¶Ì¤?º¸ ‰8«ïgK5BðÆr1hÆXÐ[fà-&Q·ojšpÖsD³£™ÊÞÚŠÆ0%ÉÞć=ßeá,Yšèþäyu[®+_R'aõí®:L¥XxâU=Qt±‡(v†OÇÈL† õ‚nj)Y¦E ™(ˆ@Ù³r‡È²¹ßX€7—½@ù”›Š^¾€ôbž¸è}œK… ÇA53°Ÿ¡l*Ên¶7ÐàgYòWr;úÈ3ûÀÞújC¸5c7ȹÐzè'hð–,~dcnš -èu}Â@|ÌÞJ‰ÐDÏù)lNUŸ) á׼ŷvlÒ›…×Æ,èzR×v÷;ôö'Š\æëD²\FZî;Žû蛡¶úÿôüûÌå0h­C‘š#µ)ØÅ€¼o|±ÿ ½ÿ×KGÐ]FÑa/_Ò’kç|Hµ›æP­ˆæž Iü%Åž7½Õ¶»köŸF©cäóÓ»2Å=¤ÝßËô üñÊ3PøC¡Ðé~Üóվ쇋'¯Ýß–¿ >r"¦ÍYi™/†<\woÛçË”óF ‚¢ãÁá@fN¼ O1ï{pÀ;ܱP~7HûÕ~uûѶòŸª U[70Tã:¨Œ$y-àÖ#£…­^Í1_—Õó¥—+\Ý|óŠ=wÊŸ>ýc~RŽ'ûã0Ǩ÷=ìóQÿaÀ·«Ü€Å]¶÷ž`Ù-ðÎÉqîöö¶lípîÒ G<Ë®ìÚýõ\?ð&™¨öô×ÍŸ?²Û—Eç­ô5áÏÕrª}é7TýÛøNê/»€ÊÂ4M²¯ãþ$z˜û7+þïËÌ?½ˆþÿZþò¿Ø ÿd’P§©þ{fR èÑT$,ê•ÈcÉûÿÅy(úÿÛ"›ˆendstream +èu}Â@|ÌÞJ‰ÐDÏù)lNUŸ) á׼ŷvlÒ›…×Æ,èzR×v÷;ôö'Š\æëD²\FZî;Žû蛡¶úÿôüûÌå0h­C‘š#µ)ØÅ€¼o|±ÿ ½ÿ×KGÐ]FÑa/_Ò’kç|Hµ›æP­ˆæž Iü%Åž7½Õ¶»köŸF©cäóÓ»2Å=¤ÝßËô üñÊ3PøC¡Ðé~Üóվ쇋'¯Ýß–¿ >r"¦ÍYi™/†<\woÛçË”óF ‚¢ãÁá@fN¼ O1ï{pÀ;ܱP~7HûÕ~uûѶòŸª U[70Tã:¨Œ$y-àÖ#£…­^Í1_—Õó¥—+\Ý|óŠ=wÊŸ>ýc~RŽ'ûã0Ǩ÷=ìóQÿaÀ·«Ü€Å]¶÷ž`Ù-ðÎÉqîöö¶lípîÒ G<Ë®ìÚýõ\?ð&™¨öô×ÍŸ?²Û—Eç­ô5áÏÕrª}é7TýÛøNê/»€ÊÂ4M²¯ãþ$z˜û7+þïËÌ?½ˆþÿZþò¿Ø ÿd’P§©þ{fR èÑT$,ê•ècÉûÿÅy(úÿÛz›Šendstream endobj -1420 0 obj << +1436 0 obj << /Type /Page -/Contents 1421 0 R -/Resources 1419 0 R +/Contents 1437 0 R +/Resources 1435 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1398 0 R +/Parent 1440 0 R >> endobj -1422 0 obj << -/D [1420 0 R /XYZ 85.0394 794.5015 null] +1438 0 obj << +/D [1436 0 R /XYZ 85.0394 794.5015 null] >> endobj 454 0 obj << -/D [1420 0 R /XYZ 85.0394 769.5949 null] +/D [1436 0 R /XYZ 85.0394 769.5949 null] >> endobj -1423 0 obj << -/D [1420 0 R /XYZ 85.0394 749.1193 null] +1439 0 obj << +/D [1436 0 R /XYZ 85.0394 749.1193 null] >> endobj -1419 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +1435 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1426 0 obj << -/Length 1106 +1443 0 obj << +/Length 1112 /Filter /FlateDecode >> stream -xÚÍXÛnã6}÷WèÑ)@®H‰º OÙÔI³èf[¯û”#Ñ»º-IÇqêþ{)QräKÉNÂ0$ ÉÃ3Ù!‡È²õYă^ˆCË]HlD¬(ØÖ\·] PÝ4@»×ÇÉàÃ¥ã[! =ìY“Y +€v kß=ˆá™F°‡_n.¯¯~ŸŸùîprýåæ `b/¯™·«ñùçÏçã3€‚†?Ÿÿ:M“Wc|¼¾ùÉHBóxt<ºG7£³»É§Áh²Ñ¥­/²R‘ïƒÛ;ÛŠµÚŸ6t€XKýaC†ØJ.q q§‘$ƒ¯ƒß6€­ÖjèAû!bÇà 袖C \Ë'!ôìTüûÇR 8!@†„àVã‡KŒ¬x¦'®¯çñÍ`¢ÍjÛöð9Ϙ±ÑWEKY¦jë š¦T¼-Zˆbà ‚WcM3šÖŸ·QB¥¼3U¬±ÃÒÌ5iãjUÔ#R*FA{[³[Óƒ&I¾ßL¬\#cÁ¤œ¦TEÓ„KeäÚ Õó®&ȳS`Ñ>¬4“3&Þ™í¢ˆõj½¨EžðhÛ°¦ejZ¦b‘4‹ !¼ëc ™ƒ,W|¶ Ï‹iÉ»Æ,r¡6òò£ž¡žàöˆ1šfî³5¢}¥#K#øÃ&ö’Šl=£Ü’'qDEld+&§¹˜fyg:¾µ³ž:2ôìèÓ?@JϨ@’|Þrl‘Þ7;BG”f<Ö.Ÿ/TW$ô*’âi/¤-NíT¾c—µy°§Bo\m MØ‚Ò½{Nb–ÐzdQžÅ²³Ú5‚ÊÌi*÷ßØjßL¯½÷ôûšÔ$b/)€n+\×ò|èøØÕ8Ðw·‚ù¡j"0ô}ÏjÉ_2Ç[±nØä;Ð!ÿfAÃÍ€@GÏ^Ó$¯Ð$GÒ Äö³<‚©O²úøÃ#ylàJ>4á±Þ«}R<6›CÏ+‘ô?Ó¡Ï?q“Ñz†[¥|Rµïõròî©•>Ò£}ªS«`3­ÀC•„ŽNŠÇ€ }&JŸûOäq„N.zË,RySÕT=T•T%ž™(ÖenJ%o»<Ø©ÂÚ¥cUÜÕÍ'wx§¸“ }do×vŠ„Ó«°ÿkÁˆß³`\ÛžÀÀµ\c·°|hú>2&ÑtèB ^(sxõåîúöæ÷ñå…ç '·_î.€…Íáõí/#ýv3¾üüùr|ÑðêçË_'£±îrkŒ·w?iI ¯€ŽG×£ñèîjt1›|Œ&[]Úú"Ó.ù>˜ÎL#Rj˜Ð|l¬TÄ(,#8؆رíF’ ¾~Û¶z«¡Gí‡LhÙ®uÄ€j0° ƾcx8€®mÙ•ÿþ±ÔÁ6†¾‹±‚ÆV«óõ…Œ­8V“ÇSóxöv ,¬Ìjšæð9Ϩ¶ÑWI$Mi&kës’¦„k¼Z +ÎÂÙXÃi·Æšg$­›Ó0!BÌt㯊µeà4sMZ»„\õˆ”I¹VÐÜÕlª¿ I’¯À÷%åëWË£ˆS!æ)‘áþ]ÁÈ´}|ko=Ud¨?ØÓ§€”žQ$ù¢åÙ2½ov„Ž(Í6X¤\>_Ê®HèU$ÉÒ^H;œÚ©|Ï.ý O…Ú2˜Üê°¥{÷œ +D4!õ AÃ<‹Dgµk™‘“þU,ï¿Ñõ¡™^{ïé÷5;¡2HH_R+œV¸n*äzÐö,Gá@ϱ +懪 ÃÀó\£%ÉoźfgCÿ›5Gðè¶iº‡4} m5{M¿BŸH3@Ðò-ï¨1Ë#(ê$«Ž?,§®` ðH©Ý±Ú'ùc³9´Wzª³ÎžX⪦üC†¢&¿õ ¾6Jù$rÉßêåÞ3­¨"99í§*Ñr+ª”trŠ<2‘ª +8“ÇY*Õ¨ ÓPæMSùPÕU”x¦¼> endobj -1427 0 obj << -/D [1425 0 R /XYZ 56.6929 794.5015 null] +1444 0 obj << +/D [1442 0 R /XYZ 56.6929 794.5015 null] >> endobj 458 0 obj << -/D [1425 0 R /XYZ 56.6929 720.2271 null] +/D [1442 0 R /XYZ 56.6929 720.2271 null] >> endobj -1309 0 obj << -/D [1425 0 R /XYZ 56.6929 692.8842 null] +1326 0 obj << +/D [1442 0 R /XYZ 56.6929 692.8842 null] >> endobj -1424 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> +1441 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1430 0 obj << +1447 0 obj << /Length 1141 /Filter /FlateDecode >> stream -xÚÍX[s£6~÷¯à1îŒ$!@³OÙÔÙf§›m]÷ÉÍxˆ„†Û"ygÝÿ^q1/¾@6ӎǃЧs¾óݦ«Òl -u Íb¤:¢ští^µ}¡ê°ù4¿z?_Kc™ØÔf~ˆºm#mæÍÏ.¹øm6™Ž¦ú™ Ç€šúÙû뛟ËV>.?ß\]øsz1¶Œ³Ùõ盲z:¹šL'7—“1@6Eª?®öt¸ºþuR–>L/>}º˜ŽogG“YíKÓ_¤“Ü‘/£ù­®yÊí#fSíI½è1†µhdP©AȦ&ý1ú½l´]»ø£Ä†ÔÆVjˆt2ƒYšE4 &ƒó10uýÌ Ãä ,SÏ‘øIöäd^ߗߪoI]ÀÈ(}´µÏ –êvü©­è©Rq„ñoÛ¸·º5æÃuŸÎy5©Âm Þ–Ñ\¸Çä‘k¼ #Lî"—ÑÏzeŠÌœX¨ð‚ÀSÉħáÃ@ÉR¾IQ“Ða ¡&5”ÍU:àÏi¸A[¥j@>uô -xo’*#¯£4ä%÷à!žQ'ÏÆkyF;< ¹¼;D^y£ñeɳÕ»Åh`‚ÍÁy,úööþã;ƒ®û8Ba~‰Öq{¦þÕد¾«Û^dj•¶m\_ÃaÒ¸†#º m̬Q¹ÏÙµ¼¾ÔûÞôh÷Lendstream +xÚÍX[s£6~÷¯à1îŒ$ Ù§lêl³ÓͶ®ûäf<D¢†Û"ygÝÿ^q1/¾@6ӎǃЧs¾óݦ«ÒuƒššMMHtD4/éÚ½jû0BÕ7`óh~õ~6:¿2lBjaK› ,ꎃ´™??»üåâ·Ùd:˜ègbégï¯o~.khù¸ü|suýáÏéÅØ6ÏfןoÊêéäj2Ü\NÆ9©þ¸BØÓáêú×IYú0½øôéb:¾}Mfµ/M‘näŽ|ÍouÍWnéРÑžÔ‹¥X‹F&1 1 cSŽþý^6Z‹®]üÃÄÁv&jˆtR“ÚšM(´ l ÎÇÀÒõ37 “'°L}W2$Ù“›ù<¾/¿Ußø~Æ„XD®ô!²¬ÿç]ù¼ÍéP6„ %7ñ+dïyàQ<–µ+&I¶ˆ“d¶ÒKAÆeÅÃI¨í¢H@œH¬Znñt‘{V¾ÌÓ$“u}þr[¾UÌôn¬;™¯’¨Ø˜(+þÒ‰®‚¯—‡k~'Su¨5Ò!DŸ»á2m–I*yBhð•%!³Z' ¹B²,ïžKKÉgë’dÏr¹O½\ù;Yf±žj jÛò ªþ@ð—Cª´)óN½ÊŽ­I®ÖÏ„ìåE…Ã2Ñ’ã*¬E2pçŠa!-zYŸËXìm”Ú'© ¥ ¶vâÉc©þ`ÇŸÚŠž*Gÿ¶{«[c>\÷‰àü‘UÓ‘*ÜÖàmÍU€{L¹Æ :Âä¾!òxݱ¬W¦ÈÌ… +/à¾J^Ÿ +„%Kùz$É£>&¡Ã@CMj.(;š«tÀžÓ{¼-ŽR5 Ÿ:z|ºU'Á¼$öÅÉnW2"qûgkº¼«ÕÚ¤i_¹çœRD¨ùÙcÛDã©ÙH¥ul + l…mÓ0  ŸŠ&©m[Z£~›PÇfÒÒ¾|? Õ©“Å;ÁW«iªõ½©Ô†ØRÛÁÒT²ÇT2ÌT¬6í¤Ô %èEkíMl¥#BNµõ(µ#ˆlÝz`lCd:¸SKÁÀ^zûdU•”'‰Þ²¡acs_tÈ«¢ƒl&¥Ç­<.ùmþ¼EvRqqâéˆËK3 ¤+ÕzÌ=1t7 Ž+îàÝQ¤ö#Õ9¥X]¯QC@:,)ÎNƒ! +;úB´]Y†’ƒrÍ–åÇ·|åR†Ça6 EÅ´Û@Sû§jŒMs^›‹f+ŸE~îªé…®õÞ¯˜sº`å*­z<¨ýè»..ömqh…ìÞÍÏhBæ†%ÏÏËçMReäu”†,b±d><Ä3êäÙ|-Ïh‡g!—w‡È+o4¾,Y¶úa· L°98ƒEÿÃÃþÒÞ|gÐug˜_¢uÜž©5ö«ï궙¦Z¥××pØh\úLíQ¹Ï6Ùµ¼¾ÔûÞôiONendstream endobj -1429 0 obj << +1446 0 obj << /Type /Page -/Contents 1430 0 R -/Resources 1428 0 R +/Contents 1447 0 R +/Resources 1445 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1432 0 R +/Parent 1440 0 R >> endobj -1431 0 obj << -/D [1429 0 R /XYZ 85.0394 794.5015 null] +1448 0 obj << +/D [1446 0 R /XYZ 85.0394 794.5015 null] >> endobj -1428 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +1445 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1435 0 obj << +1451 0 obj << /Length 2154 /Filter /FlateDecode >> stream -xÚÕËrÛFò®¯àÚ2Ƙ^å“ìHŽRk%+3—UT*ŠH@€ €¢¹ñþûvOÏ€ Z²T9¤t@OOOwO¿‡â£þø(ŒX”Št§Š…GÓåI0º‡½'ÜÒøŽÈïS½Ÿ¼½ñ(ei$¢ÑxÞã•° Iøh<»ñ"&Ø)p¼?_]\~üõúì4VÞøòç«S_„wqùÏs‚>^Ÿ}útv}êó$äÞ‡Ï~Ÿ_ÓVdy¼¿¼ú0)}Ž0½>¿8¿>¿úp~z;þéä|ÜÝ¥_H¼ÈNnnƒÑ ®ýÓIÀdš„£ ,ÆÓTŒ–'*”,TR:Lqòùä_ÃÞ®9:h?0!#1`@Å{LÀ*SI!oNý(¼yUo²zF‹ß‚0¨Êbûuž×M +Nøwô¹Å[ƒhŸs–†¡à£ë†ÖÒÇîæ«»l6«-nUÕm‡ÇÅížƘ“g>ÿ{†øeÖ´ì£þÜ]sïØ]‘7öÀ×ïQøæ½%€ÛŽù¾Õnà>ß¾ ß¿É¿­³²™ëÚÏg…öó’vÊõr¢ëg{dQ›/_Ìhµžt÷ì=7m—÷ßb¿wáNǦZ×S½sQ¾R='|5,xœ2)â8±XÉÐ0ú‡Ù -YÇѨ‡ß¹â©#ý°@0 ‡Íp §ÿõU«šÆL@Þý5ªŠ@BîÇé ªYÑúßeÖ7ÔIÑU½T×” †ƒîÐõIÓ -Áƒè/2­ˆW‰4íºÑþQónusWÕweõŒ¬úoUj¿i³JO>m<;{fY›M²F?7õöKD^úµž×ºY˜ -ñâ:ó&ü±&m½}­¯c±.Úܧ¦ð´C|!YÊM‚÷.5Þ - mÊôöÎïweæ4¼™YÓtýÉD÷Ûv»Ò{öÝÓÍøoØÔ÷c[ú¤*}¼À÷{D zD¾Ö#âÀ#z¾{R—·‚:ôUƒÑ,»ÑV@äUŽfÏÏP+ôR—--п(sK˜¬œðk“ÝëNÎnD (–*.{r·’þÝIŸ¦`ç•n§Ü„³(ŠùHèÇÏs¡µ„i¸?å¾èÓ¢çÈ£òé\¬,èNì³òÝ|‘H¨X OÐœ£Ý`rð “”œi ZöÈcÅbž& ÉÆ ´+˜´Ñõ„ä”HR/£µ+:O«Õ– jND­cåž ÈMº=*ÈÓD 6yQ4ÑCyžM -ëó¶¢ïª>å‰W=ä3»‘­ÛEUçبªl6¦&à‚ô oÙa¼¨D±$’ѨoÝ×9 #ƒ§Ì0Qô]1`O‹(fI¨Ž†@ÌRÉùH€w£8IŒ›"{ÐCˆä6ÎÐ+±¥5 sUâå a2úëëU‘O3Ú§èö»0±L ¨*!Lˆ=Îwœ»b´zÐ ×f@[³X8mé-d^éiîÛj¦b¦¢Díj,AÚBìÙò*ׄXVtZ]þB»¦e ºiº“s{À]È(W,A»ÈZY!Θ€›BÝ -î6›¶Ž‰îÈ[¯ 챜6#—n"‘“Ò™XÊÀûä^˜H`mPú±&;VYIè¬hª! } ¦ÅvÓˆBͤÖ&»×,âQVJ€‡¼÷[ÂÍô<ƒYå yßÍ¢ö@æÌ.MÀÌôP‹Sž/Aݘ{Ô¼E,¼PÆ4ø’)°y‡¡"&pOW†“K8]d彞тª™)D@¶s,`'Û!#™¸›oÍ$+•ÂØ—*´J"Âuˆèyg¸gÆ ò¢Œ…ƒ!høõCl(# -ZC[m6¤ØJ›s~WÈCåÁðmL`6oÖF²a¿' -|y…"2ݵpeã´w|×bhì.yD¡f \¢Ã¤"b6y» èPuÄ?_~$Þ÷¨V¤Þåܲ%^˜á…å†÷įñIýÙ›Áă{¥»{uM†Òv&ÜšX’ 4™¶;X9F(@"xhºF_UU„òfH/™èqR“”°ºdŠÅì’WV€:6ߌ>];†ð¶«[¬ÏQ™;5w§\êØ‹€S_èxM«%T™™Ñ]pHƼœ:–¾ÕÜÏ€ô¬!tª£FëÑŒX]äË|°€–P+m—Çö£R¯Æ„0!7œšÊ `»Ég태ÞUå(\ wT©î-eõ çÌhpW‘d uÙÊ$/`ëÒfÙÌíÌ-í¢Z7 [CïŸÝ7QÓÕÊx°+vøÛ/–X|Ó´´qXÜVujÒ&°ÀŸ ‘ѺÝT~![Ê¿©n¸ÕLzi©í0%º±_Ú 0ý‚QJ^‘ôô—A·eËU¡ßì¦K(×ÝèÑ @“¸ÄUùÄÊ5Âþðr–ÀÃÁŽú‹‘Á ,¦‰Fä0nêÈï-IYÙT»þ¡Ý-S¡8x&ÙL†º ͽ¥þŠ«¼4… Œ>]F")ôÈàí•`A,ÂNû·ß¾@3¨2‘%ß,´í/9KŒ•Ú1à&`¼-- 4ƒgW¼H¿¯M Au"€7¬;ì¦" 8…Ämí@k“ýc6€ÂÐaøHL}ª³ -Âz‰CX6[Èæe3<µ,27üCðl jŠjSX8ŸÓw[­í;bm³ß–A@0yËVò¥+.ÈTqÏ‘Yn _[8%™Ì=öÀèî¯{ (‘àO‹à)˜\ ýç%èï¯þ?ÏîŸ`0`Ãì'º×Ç~Å S 0‘!C^è•X=ú/”û‡¥ê©þ&4Cendstream +xÚÕ]sÛ6òÝ¿BôMˆ?'ONj§î\Üž£¾œëñPd±¥HAYÑ5÷ßo P”LÅŽ=}èø‹Åbw±ßù(€?>Šbg"%YÈ¢€G£éò$ÝÃÞÇni|Gä÷©ÞOÞ^Èd”±,ñh<ïñJY¦|4žÝx1ì8Þ‡Ÿ¯..?þz}vš„Þøòç«S_DwqùÏs‚>^Ÿ}útv}êó4âÞ‡Ï~Ÿ_ÓVly¼¿¼ú0}Ž0½>¿8¿>¿úp~z;þéä|ÜÝ¥_H¼ÈNnnƒÑ ®ýÓIÀd–F£ ,ƳLŒ–'a$YJé0åÉç“u {»æè ýxÀ„ŒÅ€CÞ3`°8VI”±X +i xsêÇAàÍëf“73ZüDA]•Û¯ó¢Ñ-¬8áßÑço ¢}ÎYEb€j4­ÿ¤Ý-VwùlÖXܪnÚ‹Û=1Œ1'Ï|þ÷ ñË\·ì£þÜ]sïØ]Yh{àë÷(|ó‡ÚÀmÇ|ßj7pŸoß„ïßä‹ß6y¥çªñ‹Y©ü¢¢j½œ¨æÙÙcÔË3Z­'Ý=ûGÁºmŠêþ[ì÷.Üé¨ëu3U;«°ç„¯†O2&E'–„22Œþa¶"–%I<êáw®x*äH?,L¡A3èé?Ä}UãǪf wª"ûI6¨j^¶þw™µÇ u +è¾T׌ EƒîÐõIÓ +ÁO‚ø/2­HS1hÚµVþQón•¾«›»ª~FVý·®”¯Û¼…ÒSLõƒggÏ,oóI®ÕsSo¿D•ß¨y£ôÂTˆ×™—0á5i›íkõx‹uÙ>5…§â É2n¼w!¨ñVmSΠ·w~¿«r§áʹ̵îú“‰î!¶ív¥ö:í»§›ñß°©ïǶ*Õ=$H]ùxï÷ˆôˆ|­GÄGô|÷¤.o/uè9ª£Y v£­€ +È«ÍžŸ¡V¨¥ªZZþ ~ Q(–0y5#àWß«NÎnD „, ¹ìÉaÜJúw'i|šWJN¹)gqœð‘ bÐ=Iž5æBk‰²hÊ}Ñ!§EÏ‘GåÓ¹XYÐØgå»ù"•,“px‚æ퓳€7H”fäL[(ÈвGž„,áY +"l¼@»‚Iµj°° ¼È!§Dšy9­]ÑAxZ¯¶Õs"j ,÷AnÐíÙPAž&µ)Ê’ ‰Êó|RZŸ·5}WÍ)O½ú¡˜Ù|Ý.ê¦ÀFõàP•Þ˜š€ Ò€¢e‡ñ¦!KcúÖ}Ã02xÃ,@ßöıˆ–FáÑHX&9 ðnœ¤©1 .ó50€Hnà ½’XZ:W¥^¡ “ÓÇX_­ÊbšÓ>E@·ß…‰eE5„Øã|ǹ+A«½pÕÚÊ„%ÂiKo!£ðJM ßV³0aaœ†û…K2x¶|€Ê !–5݆V—¿Ð®iˆÖº;9·Ü倌rÅ´‹¼u⌠¸)ÔÝ¡ànóië˜èŽ½õ +È+h3véÖ);)‰¥ ¼Oî…‰ÖF@¥k²c•W„ÎK]éièK0-¶M +5_Ú ˜î^³ˆGY”yï·„›©y³Êò¾›EíÜ™]š€™©¡;§<_‚º ÷¨y‹Dx‘$Œi*ð%S`òCD.Làž® ''–pºÈ«{5£UrSˆ€lçXÀN¶CF2q7ßšIV†!ƾ #«$"ÜX‡Ø‰šwq†{FaÜ !ÊX0‚†_?Á†2¦ 5´ÑæCŠ­”9çw…< +=¾)Ìç­ÃÚ +mØïÉÄ€_žAa…ÈLw-<´qÚ;¾k1‡4v—<¦P3 .ÑaR1›¢]t¨:âÆŸ/?ï{T+ +2ïrnÙ/ÌðÒrÃ{â×øǤþìÍ`âÁ½€Òݽº&#i;nM,ÉšLÛ¬# N< ]£/„ª*B…ÒËF&zœGÔ$e ¬ne ™b1»äÀ•Õ N€M À7§Og׎!¼íšësÃDæNÍÝ©—:ö"àÔ:^Óz Ufft’±¨¦Ž°¥o=7ÆÃ3à5Ó„îBaÔh½""š«ÊbY Ð +j¥íòØ~ÂÌ«€q !LÈ '¦rÁØnŠY»À çwU; +WÃÝÄÄ%Uª{KAY=è9óCÜU$™GUiB™äÌb]Ù,›¹¹¥]Ôk ºizÿ춸‰MT+ãÁ®Øáo¿XbñMÓÒÆa`q[Õ©H›À& DNëvSû%„lIX(ÿ¦ºá–ž.ÔÒRÛaJtc¿´Aaú£”¼ "é©/ƒnË—«R½ÙM—P®»Ñ£€&q©«ò©•k„ýá'â,…‡ƒÔ#ƒAXL1ŒÈQ*ÜÔQÜ/Z’²*ó©rýC¹[Fâà™d3ê24÷–ú+®ŠÊ€rút‰¤Ðc ƒ´ uÚ¿ýöÒ„A•‰-ùf¡lyÌYr`†;ÆÜŒ— ¥¥±„F`ðìJöé÷µ $¨Näð†M‡ÝÔ”§¸­H`mò¯Ì@: ©I£OµcVC¸Cï1qK½…l^êá©e‘»á‚gK.ëMiábNßm½¶ïˆµÍv|[Áä-[=È—®¸ ?PÅ=Gf…-|m â8”> endobj -1436 0 obj << -/D [1434 0 R /XYZ 56.6929 794.5015 null] +1452 0 obj << +/D [1450 0 R /XYZ 56.6929 794.5015 null] >> endobj 462 0 obj << -/D [1434 0 R /XYZ 56.6929 373.8367 null] +/D [1450 0 R /XYZ 56.6929 373.8367 null] >> endobj -1437 0 obj << -/D [1434 0 R /XYZ 56.6929 343.7228 null] +1453 0 obj << +/D [1450 0 R /XYZ 56.6929 343.7228 null] >> endobj 466 0 obj << -/D [1434 0 R /XYZ 56.6929 343.7228 null] +/D [1450 0 R /XYZ 56.6929 343.7228 null] >> endobj -1438 0 obj << -/D [1434 0 R /XYZ 56.6929 319.3114 null] +1454 0 obj << +/D [1450 0 R /XYZ 56.6929 319.3114 null] >> endobj -1439 0 obj << -/D [1434 0 R /XYZ 56.6929 319.3114 null] +1455 0 obj << +/D [1450 0 R /XYZ 56.6929 319.3114 null] >> endobj -1440 0 obj << -/D [1434 0 R /XYZ 56.6929 307.3563 null] +1456 0 obj << +/D [1450 0 R /XYZ 56.6929 307.3563 null] >> endobj -1433 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> +1449 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1443 0 obj << +1459 0 obj << /Length 3493 /Filter /FlateDecode >> @@ -6004,37 +6085,37 @@ F 1Õh÷oÖo‹”è« w–¦ÞmPËçj6"¸Z7œ;íªU7åêí©…Tñ9²ãvcp#¿ê’¬FÑŸÓeÅ0ãM»aTk•½a6tÛ,O&3ËL¥ÂƒUùL•áixø9± Žžè¼· ì£MZ®¡ ÄžÙDeª%d§ƒ*AÏén„Äb'‹±Ç†ÅëŶh»í% ³þuå÷_~ÐÁâSBüL¯‹ÞúxÅ]÷7øryÅe¿OÐÅÜw]‡·º}åê¢é3Öeõp}«Ø¢”×# Ö›]7˜qØV~Áç5*œCÊÂA|é9`l‘Þú(Ìú´Ïø¢BœõágŠáçØ»S^PY^熜´ÎmtÿŸo?}¼¾»Í’EhÞ”2„hç2¢”±ˆCD¨Äâ¨ò ñ^ójc6`Él¼qü:À“øsÜ¥:­®Êbò }«£ÿ¤Nà ÐÞ¯HUVKq{ˆ½ñ[s¹Ë ‘Á… 8ÆËÏ8é8} ;žf¯GËY9³ ÅQ°kE0Tl̆FÊdŒ\|Kã$wô.ÎÛç ƒò~üt8LÆqH|¶.Rµ‹=áñ" Á0ØKsDÑÙK}?j„Ž£ˆûl5~C·Õ+øu†õ`«¿6øß/ÀŸûã_/ü_“@AœA²‹–U†œ<ç¨ÂÉ«$i+«ßløa†v´“Cñ÷þƒË¬Àò‘Û¹< ¤OŸä‡˜Rç|=ÿÖ2ÌÁ BTÀE€LLøûI,šÕªye㤨¤mÁ &dR>§] VaW6WjéÍ72úÜt@ -çF‡Â#ÐÆ™KCbˆnf¼ž¬Ó8W&¼ßQÕ· ÊÖÑTzXPsF6uà•@Ïý±= Y1œ`‡/̘-©Þ«¾ÖlÅ(ugÕ`1$/E+}ëâñ(ÃL™^¶T(Í}/æ‘#¨|`Ͳl«æ­”9·!†Éá/ *iééœÁþwáG †ëàAoh3ùÃÀèÂ×ǻǿɒ?pÇ/lÅq¹s¿$±&ºëŽ 8ÿÅD»,aÇÔgqž²{‘Ì4ÔÑâ Ãò€/Ŷj(®A…Ü·]¹n¹,Ÿäy×âïEvX<¤é2‚|©’\>Çn†o¶ô  +sîsðm [üáÈÔY-É`~-÷¯ƒßnüþ+ÈwŸÇnX ç³AôQ öuSï×'*Ǻ¿õ‹0KC=æàOXüÕ?;ü–®œÍ2ó† V3P…§Lý™±Yì3“Žÿ?EØ endstream +çF‡Â#ÐÆ™KCbˆnf¼ž¬Ó8W&¼ßQÕ· ÊÖÑTzXPsF6uà•@Ïý±= Y1œ`‡/̘-©Þ«¾ÖlÅ(ugÕ`1$/E+}ëâñ(ÃL™^¶T(Í}/æ‘#¨|`Ͳl«æ­”9·!†Éá/ *iééœÁþwáG †ëàAoh3ùÃÀèÂ×ǻǿɒ?pÇ/lÅq¹s¿$±&ºëŽ 8ÿÅD»,aÇÔgqž²{‘Ì4ÔÑâ Ãò€/Ŷj(®A…Ü·]¹n¹,Ÿäy×âïEvX<¤é2‚|©’\>Çn†o¶ô  +sîsðm [üáÈÔY-É`~-÷¯ƒßnüþ+ÈwŸÇnX ç³AôQ öuSï×'*Ǻ¿õ‹0KC=æàOXüÕ?;ü–®œÍ2ó† V3P…§LÓ3ÿb³Øg&#þF2 Ÿendstream endobj -1442 0 obj << +1458 0 obj << /Type /Page -/Contents 1443 0 R -/Resources 1441 0 R +/Contents 1459 0 R +/Resources 1457 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1432 0 R -/Annots [ 1445 0 R ] +/Parent 1440 0 R +/Annots [ 1461 0 R ] >> endobj -1445 0 obj << +1461 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [280.2146 205.1117 375.7455 217.8489] /Subtype /Link /A << /S /GoTo /D (root_delegation_only) >> >> endobj -1444 0 obj << -/D [1442 0 R /XYZ 85.0394 794.5015 null] +1460 0 obj << +/D [1458 0 R /XYZ 85.0394 794.5015 null] >> endobj 470 0 obj << -/D [1442 0 R /XYZ 85.0394 162.5022 null] +/D [1458 0 R /XYZ 85.0394 162.5022 null] >> endobj -1446 0 obj << -/D [1442 0 R /XYZ 85.0394 137.1661 null] +1462 0 obj << +/D [1458 0 R /XYZ 85.0394 137.1661 null] >> endobj -1441 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R >> +1457 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1450 0 obj << +1466 0 obj << /Length 2962 /Filter /FlateDecode >> @@ -6049,128 +6130,128 @@ LA Ó\{½Nã8Ôˆ~šK ­ß„·Is#Ž ÓœD§¯ÇŽe9 PØgö}ˆf9‹Ÿp:”û++l¹Pñè;Ô”!´8å0l}U2ñÍÞ>*B¹¥5ê/N?fup±&H08ÓGw Å~=D—ë¹ô5·÷ôm¡œwÕL–¶¥8ÓeJ•ød¡y^šÞG‹²¥Rn ÓR7eeJN0ÇÝ]<×ÛëÜUõ;§W6¥¾šõ$Œ}qÚDP¿¤Øæ0Ç0Øîân‚|É_žm•´PiJ¿ú/*óÝøÜ\"Q5ÏìÃÌüÑsÓjc€ç§¢ÉëC¶Êë|[ì ûªœwZt}^pj=†ºh[ur¶¬ó}S,ì5›µÛóÓ}½"•6Q@ã4Pm7 ä殢­Dë¾öîI7êãc=šß ¤=+-Î}/>²ºãöø|Ô¿:èÌ(ãæØǹ_ -&6 ¢NMý»ÿý‘çìeð‹•Í”å0cž4»âò™_0ôO6F&ü·ÿÇ¿ 9ýl†ëßœ=uèr†!Ö(™„Éþ„$4ý—Qëendstream +&6 ¢NMý»ÿý‘çìeð‹•Í”å0cž4»âò™_0ôO6F&ü·ÿÇ¿ 9ýl†ëßœ=uèr†!Ö(©ÂŒdBšþ?—©ëƒendstream endobj -1449 0 obj << +1465 0 obj << /Type /Page -/Contents 1450 0 R -/Resources 1448 0 R +/Contents 1466 0 R +/Resources 1464 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1432 0 R -/Annots [ 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R ] +/Parent 1440 0 R +/Annots [ 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R ] >> endobj -1453 0 obj << +1469 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [284.2769 667.7189 352.9489 679.7785] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1454 0 obj << +1470 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [282.0654 636.5559 350.7374 648.6156] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1455 0 obj << +1471 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [311.9531 605.393 380.6251 617.4526] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1456 0 obj << +1472 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [299.7586 574.23 368.4306 586.2897] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1457 0 obj << +1473 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [292.0084 543.0671 360.6804 555.1267] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1458 0 obj << +1474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [330.7921 511.9042 399.4641 523.9638] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1459 0 obj << +1475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [401.5962 480.7412 470.2682 492.8008] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1460 0 obj << +1476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [257.6971 315.5214 326.3691 327.581] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1461 0 obj << +1477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [310.7975 284.3584 379.4695 296.4181] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1462 0 obj << +1478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [308.6055 253.1955 377.2775 265.2551] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1463 0 obj << +1479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [294.1999 222.0326 362.8719 234.0922] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1464 0 obj << +1480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [303.0862 190.8696 371.7582 202.9292] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1465 0 obj << +1481 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [332.9347 159.7067 401.6067 171.7663] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1466 0 obj << +1482 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [301.97 128.5437 370.642 140.6034] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1451 0 obj << -/D [1449 0 R /XYZ 56.6929 794.5015 null] +1467 0 obj << +/D [1465 0 R /XYZ 56.6929 794.5015 null] >> endobj 474 0 obj << -/D [1449 0 R /XYZ 56.6929 726.6924 null] +/D [1465 0 R /XYZ 56.6929 726.6924 null] >> endobj -1452 0 obj << -/D [1449 0 R /XYZ 56.6929 700.1172 null] +1468 0 obj << +/D [1465 0 R /XYZ 56.6929 700.1172 null] >> endobj -1448 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R >> +1464 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1469 0 obj << +1485 0 obj << /Length 3111 /Filter /FlateDecode >> @@ -6182,94 +6263,95 @@ a ãlˆŠ5$Ñ9v«SÒhëOC«ý‹ý0}®K«ìÛ,M¦N$N´2·.Öز~´%¿$,ù­>Ÿ`«Iì3RºV͸ëÌÝ (¶NÙ#l)]¨-‡H™„]C ØÞþçͲI°¶ãßÚeŠGˆh†Í°âž663´¶"ÁÂJ®ÏÛvXÁÚ¯³Œ3]ŠðÚYhqÞ:]`6…ZÀñ˜WŽþðù !Ô­-»,¢„ ΔÔÈ{—ËíuÀoU¹¸ð4b¬ãÔrÆØÙœßYKf‡R›AØ4F§‹šwœ€ê9N{8n\w݇ê&² D@MhÑë6(…Uå@à>6¹PRíê­9TñëÍõ‡—C;©vp²¾ DÜÍAÕ|Oc†8å 3géi2,rÄÀrŸÂ/*8 &$÷ƒSŠaª/ú•[{HïG’tŽídpª/ûiyàx XCiiV$æ×M»»¼Òû¹„¹Í¢ÄýVÍÌ£«ûRM÷9æ°È!0A(Õ÷Á97† .ö«24í¨Ð% Ãövè¨6PèÙÊ°Ævwqz»Íü¹—ߤöwHT Ωoþ5z‘:y²¢.³¾Ž‚m)Ñ×›Ó”úÏ©Ì–!óRÄI"ÌÝô1ùÅ’(ï:jø°Í?Î9ªï%%õ}ÀDU¶e¬Z`#¨b^5ϸ€šõ¹‘NRD9ãqUjB—>ñz gO™¿‰z]“F×Í°îÃ\Í“O)Äg=³côóø…·ûÇ)«²4´ Æ¨­8 A4U $¼€"t ùP1IAŒ¸âq=h¬HŸ€úl_ô5ù›&Ý®=ÃاoÐB‡ Ö59Ê>?jõOp/A‹èxL\‡aKqâPGÊ¥ð×AE¨çQö0³Õ'b£}2ÝX—P‚û—ëB3’÷%®]ôqãÇùüå:ã(LöLŒ]®{ü‚±ãvÿÄå:ô'[êõ€ZPdÜZ”aXÁD;¿(Á: y~yÐexôõeö2uÔ¥R•FEÐXöð K‘„÷„N†]LHf¥z­<ÀÀI:úǘ‡Çíµ:K26^MR åÑn 5†mÅ)Æõ½žXb]T„dÕ¢¶Þ4u6¦ìfX"ãâjB~Ÿh6 ÷ø<붑Ù0að„àÕ¸~:¨z–F¹æð 6Ûýã! öö\ŸD;? –µç[Šaf]8\î€"ls -îx~øO̘P+ @c©ýseŠ¤T²'öV÷´ þXRò+ÊlÎP!'œØCú9s™EÕš“WýÅÜu$d»»0wKOí=9ÕÖ•ú²J§Ý… ÔÒ›¬Pýc~2´Ûì"Òܸº)«lãΗ)P'>ñ9_®®ˆ½·Ó¿ß¾}ÿþæµMë6ŒÎÄêá Ïö­1^lêr5Jô]¶óõìeK}°_»¢ù`£b߇©\YíØ«Ub Ü¿\”É.JO¼Øô~ Åîvû7uÝa‡k–¾B ²øž²š§¯ù#ìMÓ°5m±?,€M9ч1é4ßã1Ó³쩺òo÷ϸu*ÿ¯§gþm›yZkÒ—'gòüè_Æ9ƒ3WTT{ý"Ä‘2,³Í#¶¢¹¼b3‚¤~ª²}²¹Û¬ -ÏØÌïî|8æ;Kw‘L’Áƒî%åÄk¨ä~q™ÎápÉ¡e¡Æ.×ÀjxýXºæò¤Í½ˆOÒÏØ'ÆþÝÿòkùË% ¥RÎÜ]¦ G’(á•Ò¶ŠÑ~,<««þ?çme>endstream +ÏØÌïî|8æ;Kw‘L’Áƒî%åÄk¨ä~q™ÎápÉ¡e¡Æ.×ÀjxýXºæò¤Í½ˆOÒÏØ'ÆþÝÿòkùË% ¥RÎÜ]¦ G’(á•Ò¶ +5Ô<<««þ?çÅe@endstream endobj -1468 0 obj << +1484 0 obj << /Type /Page -/Contents 1469 0 R -/Resources 1467 0 R +/Contents 1485 0 R +/Resources 1483 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1432 0 R -/Annots [ 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R ] +/Parent 1497 0 R +/Annots [ 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R ] >> endobj -1471 0 obj << +1487 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [259.4835 683.3704 328.1555 695.4301] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1472 0 obj << +1488 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [172.152 623.0288 267.6829 634.8294] /Subtype /Link /A << /S /GoTo /D (root_delegation_only) >> >> endobj -1473 0 obj << +1489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [352.4539 369.6354 426.1073 381.695] /Subtype /Link /A << /S /GoTo /D (server_resource_limits) >> >> endobj -1474 0 obj << +1490 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [387.5019 339.3849 456.1739 351.4445] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1475 0 obj << +1491 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.9629 309.1343 450.6349 321.194] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1476 0 obj << +1492 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.5803 278.8838 467.2523 290.9435] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1477 0 obj << +1493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [393.0412 248.6333 461.7132 260.693] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1478 0 obj << +1494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [255.0796 218.3828 323.7516 230.4425] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1479 0 obj << +1495 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [311.5276 188.1323 385.1809 200.192] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1480 0 obj << +1496 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [315.9507 157.8818 384.6227 169.9414] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1470 0 obj << -/D [1468 0 R /XYZ 85.0394 794.5015 null] +1486 0 obj << +/D [1484 0 R /XYZ 85.0394 794.5015 null] >> endobj -1467 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F48 950 0 R /F21 710 0 R /F41 935 0 R >> +1483 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F48 955 0 R /F21 714 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1483 0 obj << +1500 0 obj << /Length 2952 /Filter /FlateDecode >> @@ -6283,142 +6365,142 @@ a Ò´d$Çv¯¯A`«„…Š¥ÇÞ£fˆÄÖÒjƒÌ!ãbæ°eˆJ¨­GEš,@0Ê RLèA¢£oƒà¦÷ZsÔ"ˆJµh¾ÎµüŒÛ±Ýë5—)Ø5K¿G͉¬¥5庘;a€Šs Óݾ¬V‡b{(šçU[ììó?'›;t{8Åؾ1N™’Xò$ŠÓ$‰D¦TàA'X¢`ÍM XÓ‹‹C‡D’lÈ*¡-Oó‹¬Ê2L.â H¼¨I’aîAi‘­¤®˜‚̈Ë,-¬!ê²²<ª›ÒnmŠ³=ÔûզܚH{Šj=õ EXA ”¤ãQ|‚V#!dH¨S ¤ÚV)LòP)æÍäÒF0aôg$snÅ5™,QSVsxž¬)~f b»·½ãšBA> ²t00yk#cBGösàLÌ×8²%!èµ!ÙìU™¯òöyÓB.Ve讇åÕfÂÜT¨>¸Í.J¯º¢Êgòëçº4¼ºÅ3vM×úš—»üÓεçíhKþ_]¹»]ñZìŒ"¹8¿DØüŠ!=¿¨ÄüîQÆß‹ŒõUNS™±P<Ý{šè=ÌŒ)öÇ û·©É"'Æ™1”ƒŠd‰Ìª4ÙÄÐ…dfìð3>Çv/d)S?a\±ôÈ{Ô ØZz/ÁRê9©A ¥9P7C»¶\çi¨3)OvíAqß¡Î0bÊ aço#³± c•AÞÀ1¹¬²L#©¤z™YOûY½øc,2iÖÆä ÷˜4‡±¥¤¼¨9™€í$­¯!ê²À<ê¼üŠ1Ý«m}ØÊU^Q‹U’„GM°Þ1¢Ê†4ÞHkÓÎŒÝ dR‚$Ê/q I–_?ãyl÷K~âCÅ°%càQ3Lbk^|QÚÁ9„›„ÃáRÓJÄ!µÇ/¿=Uù¾\[~~Ùä­ âõ®\—“É!’qEm"ã~ûÉe÷ÛO¸4Ç——úКdCzô¹¶Íù"\åmùZ؆}Ñ>×›Æ>€FºëÓ!¯Úò–,«'Û°Þ•EÕ:”ÕÜʧçÖµÕ¶£—â`„c7Þ/x8v~5C8Ð1ž_†I™ÉQ\…¸®+#ǧ£Mv6¶õÓé,ö©¤ qæñwõç•íýÂædœ«…»\­Oã­©Õ‹‰ÍäÆ/ 5ñGbu7;Ö‹æÅh²¯Ó-!ÄêÆD“™ßÁPdˆj÷uöã´‡)&®ô¯KCú¬wÇM_nžG&½<þtÿÁÍ*÷L¸«*'æ iÿj4ËÜœÂùé_wôùuî¦è'Ÿä´&¨•ÞÄ<}pZ“jP-ÃÃ@p¦AÚ&Õ¥ …0„åù˸ù™­8éwWpƒñóN ˆ›º!1Ø«ÝÉ6ï‹ÜüÚp{ÜÙg«UóÂVÜØ6²a’,ÿû\Tv~•Á–&t¼„N¸9­ÂâzÏ4=ºi¼‡àmI§7Õï ¼0¾ja5@äöñ¼·ç.ƒƒÆâ`W¦ƒ}´ng—"C!öÅÏüFH¤œæn'²2ºê†eÃŒ†à˜s¥.ìˆýŽ{Z´Ò¼íõ Ø²ø37:ol»Ðìg‡om[nÝbðÏájb>QÛ\j]XX¾Ù8¿ (]æHÉê‰2ØØ4 õd?´+^s3þjó×?¹6üsÆþòÿ‹+IJìÂ(L žGÊ8¡²¸`„òŠI:AýÿD’‘Fendstream +ûlÇlãO¶Ñ77ûb h-b[¶ÀÆŽ¾¼ßZ˜•! Ϋ¨ïÂ"¬™?ŽEÓÚ—@¬ÉŸÜÛÒ‘4¿[³œDW3w•òĪ[6n‘*Û~>¬wÇM_nžG&½<þtÿÁÍ*÷L¸«*'æ iÿj4ËÜœÂùé_wôùuî¦è'Ÿä´&¨•ÞÄ<}pZ“jP-ÃÃ@p¦AÚ&Õ¥ …0„åù˸ù™­8éwWpƒñóN ˆ›º!1Ø«ÝÉ6ï‹ÜüÚp{ÜÙg«UóÂVÜØ6²a’,ÿû\Tv~•Á–&t¼„N¸9­ÂâzÏ4=ºi¼‡àmI§7Õï ¼0¾ja5@äöñ¼·ç.ƒƒÆâ`W¦ƒ}´ng—"C!öÅÏüFH¤œæn'²2ºê†eÃŒ†à˜s¥.ìˆýŽ{Z´Ò¼íõ Ø²ø37:ol»Ðìg‡om[nÝbðÏájb>QÛ\j]XX¾Ù8¿ (]æHÉê‰2ØØ4 õd?´+^s3þjó×?¹6üsÆþòÿ‹+IJìÂ(L žGÊ8‘á¸`„òŠI:AýÿC_‘?endstream endobj -1482 0 obj << +1499 0 obj << /Type /Page -/Contents 1483 0 R -/Resources 1481 0 R +/Contents 1500 0 R +/Resources 1498 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1432 0 R -/Annots [ 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R ] +/Parent 1497 0 R +/Annots [ 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R ] >> endobj -1485 0 obj << +1502 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [352.879 737.5325 426.5323 749.5921] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1486 0 obj << +1503 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [334.0699 707.2832 407.7232 719.3428] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1487 0 obj << +1504 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [373.9 677.0339 447.5533 689.0936] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1488 0 obj << +1505 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [319.6839 646.7846 393.3372 658.8443] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1489 0 obj << +1506 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [307.1508 616.5353 375.8228 628.595] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1490 0 obj << +1507 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [334.8268 586.2861 403.4988 598.3457] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1491 0 obj << +1508 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [337.0185 556.0368 405.6905 568.0964] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1492 0 obj << +1509 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [364.6945 525.7875 433.3665 537.8471] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1493 0 obj << +1510 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [374.6372 495.5382 443.3092 507.5979] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1494 0 obj << +1511 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [292.0276 465.2889 360.6996 477.3486] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1495 0 obj << +1512 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [319.7036 435.0397 388.3756 447.0993] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1496 0 obj << +1513 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [460.1655 404.7904 533.2211 416.85] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1497 0 obj << +1514 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [368.9978 374.5411 438.8121 386.6007] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1498 0 obj << +1515 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [293.1435 332.3366 354.3435 344.3963] /Subtype /Link /A << /S /GoTo /D (options) >> >> endobj -1499 0 obj << +1516 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [288.6803 302.0873 357.3523 314.147] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1500 0 obj << +1517 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [328.5503 271.8381 402.2036 283.8977] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1484 0 obj << -/D [1482 0 R /XYZ 56.6929 794.5015 null] +1501 0 obj << +/D [1499 0 R /XYZ 56.6929 794.5015 null] >> endobj 478 0 obj << -/D [1482 0 R /XYZ 56.6929 256.8016 null] +/D [1499 0 R /XYZ 56.6929 256.8016 null] >> endobj -1116 0 obj << -/D [1482 0 R /XYZ 56.6929 231.4888 null] +1121 0 obj << +/D [1499 0 R /XYZ 56.6929 231.4888 null] >> endobj -1481 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R >> +1498 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1503 0 obj << +1520 0 obj << /Length 3016 /Filter /FlateDecode >> @@ -6433,30 +6515,30 @@ k ˜ H&á}Â9Î$Dz¼øšNëIté•Sp¨–):Gñ[Ïc²{ÚÛ?Ú@?(ÒUNGO ššÅwïšÛ,$hÛÉÛõ31tÏLÑ F¹hà=’QÎÂÛ×t?¾$,,­ö ³eº½+º‘K]Úð àˆu÷áy{‹(RÜû.ê‡ÂÅ@¬)dr.x0Ú¼rú ih¢›(Ýà^4Ù&bÅJŒ¬ Ö¢@tQ Æ Ù”ŠÀÑdF[¡¼;‹•õ=BÂ{ƵÔ?B½ùQR†ykÌwlf쇰,ÑN‚wYkuÈÕØEÐà~u›CÙ§lœÙuÙ”¥PËÖïV–ünl ~7Vú~7¶týn•¸6FÔnÝn¼K‘ªìDÝ5ˆZ6QË&´”ü82‚[ðwGÄDŒL‡‚8ðCóh4[ÆC9Tº¢>ÇÎF?<[<6Éñ$›{ñ¨”k.Þ€ÿ˜ßãJ Y3ßn¨HìvC±ç!¢®‰ˆmÜ.lŠŠí†b{B´/»†lkŒ”Ô”Æz1‚®4wDD&Àh%j× MŒ’{N b^uðä •<:yÀoùÏï‹2&y(W¢kæ‘r÷›p:!úž—:¾³UP6>vÒ°†²?v_@hÎŒñæ(ÅhÔü®b¬Ñ[Åô}]ˆ‚yïÁÓD‚G/än u›2«6n¬Æ²¬jjÙT„À}‹wßbQ>D cZcQ‘RÌmÉñj÷-a». 𚌟W–`ÞÀºâRÍóF3" £)ØíŠ;áU‡vwЀ™Š—½²!1URõ66mVÐN -fÔ¸ÝÇ É¸oIOç ÐPÇ€—0Ä(Uû/ ª“»êîwb™ç7’9­È‘þÓà–›„q£Á0 NDzyòK›,GUgë¼úD|ý·ŒÆݦU¶ß2wMÞóÌèÿÔÙTƒ8~ÈÙÁ|‚O&]MÛ{“n“èË|‘®©Ð>°¡†%ÊË pà¶ÉÇìë4[Õ´@SªÉÖ=ŽK—wCá¬ð¨ÿïµtd¦-rb6™ÓÙÆJO@¥³ÿÇq‰~µæöT †O||®"Í3„Å»žÞ”-Vðc+àì£b%aw°h¬`­,ßâ¢Ô„ž!ÔLÄÕ·ãO€µ6ZÌ”îü(¤€[À$7ßC3Ny"Ú2L«> éãNÊEõ‘rŽw,úeÍ›[pÒ|ÜAlž§_2ªÝfäúA\‘±÷KžRåæå;ª„_à |F-ñ«{|¿þ ®Tjû`‹wô@³¤/rêÁËñ—(iÝ»|Ge:›Ñµ^UÔ!{² c¯£éóW¯®Ùùõ»ÓD†Ÿ7  *bŒqùÎv»âiµJ§Í“ýÐ{pêóxÐv½ƒCh•B3gà–àtzcÍ1Ù<)ÃËØ›—s–Y<:Ç£”f<ºN[ö&\J0äºûó£VµpV!¤7BŠ¤ï«@†Ã÷¼±=oÁ'ãø/Ç”D¸Ã#¨Ö‰ þÁèó(xýÁíç½zw«†Ððâr)G¯JjÔ•«¡<é’rëd,s‰Ð#á% ã:0}Yã/ÉÂã#”Á3,×YÈÅ 9Ä®UYUùí©äc´ÎØ‚ŲZ•dÞ—ñ÷ Òy:mX©äöV§Â<Îkå™×Àzwož¹ß€,0M¶¿I{¥ƒâ PÔøC¶äXN —¦“Í1€És‘ ýtŽšsøìêmÅá£ò^ÿü{:Ì-2.Ùݶö'}Í°óÿ*HÞendstream +fÔ¸ÝÇ É¸oIOç ÐPÇ€—0Ä(Uû/ ª“»êîwb™ç7’9­È‘þÓà–›„q£Á0 NDzyòK›,GUgë¼úD|ý·ŒÆݦU¶ß2wMÞóÌèÿÔÙTƒ8~ÈÙÁ|‚O&]MÛ{“n“èË|‘®©Ð>°¡†%ÊË pà¶ÉÇìë4[Õ´@SªÉÖ=ŽK—wCá¬ð¨ÿïµtd¦-rb6™ÓÙÆJO@¥³ÿÇq‰~µæöT †O||®"Í3„Å»žÞ”-Vðc+àì£b%aw°h¬`­,ßâ¢Ô„ž!ÔLÄÕ·ãO€µ6ZÌ”îü(¤€[À$7ßC3Ny"Ú2L«> éãNÊEõ‘rŽw,úeÍ›[pÒ|ÜAlž§_2ªÝfäúA\‘±÷KžRåæå;ª„_à |F-ñ«{|¿þ ®Tjû`‹wô@³¤/rêÁËñ—(iÝ»|Ge:›Ñµ^UÔ!{² c¯£éóW¯®Ùùõ»ÓD†Ÿ7  *bŒqùÎv»âiµJ§Í“ýÐ{pêóxÐv½ƒCh•B3gà–àtzcÍ1Ù<)ÃËØ›—s–Y<:Ç£”f<ºN[ö&\J0äºûó£VµpV!¤7BŠ¤ï«@†Ã÷¼±=oÁ'ãø/Ç”D¸Ã#¨Ö‰ þÁèó(xýÁíç½zw«†Ððâr)G¯JjÔ•«¡<é’rëd,s‰Ð#á% ã:0}Yã/ÉÂã#”Á3,×YÈÅ 9Ä®UYUùí©äc´ÎØ‚ŲZ•dÞ—ñ÷ Òy:mX©äöV§Â<Îkå™×Àzwož¹ß€,0M¶¿I{¥ƒâ PÔøC¶äXN —¦“Í1€És‘ ýtŽšsøìêmÅá£ò^ÿü{:Ì-2^ìn[û“¾fX‡ùÿ)×endstream endobj -1502 0 obj << +1519 0 obj << /Type /Page -/Contents 1503 0 R -/Resources 1501 0 R +/Contents 1520 0 R +/Resources 1518 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1507 0 R +/Parent 1497 0 R >> endobj -1504 0 obj << -/D [1502 0 R /XYZ 85.0394 794.5015 null] +1521 0 obj << +/D [1519 0 R /XYZ 85.0394 794.5015 null] >> endobj -1505 0 obj << -/D [1502 0 R /XYZ 85.0394 512.9872 null] +1522 0 obj << +/D [1519 0 R /XYZ 85.0394 512.9872 null] >> endobj -1506 0 obj << -/D [1502 0 R /XYZ 85.0394 501.0321 null] +1523 0 obj << +/D [1519 0 R /XYZ 85.0394 501.0321 null] >> endobj -1501 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F48 950 0 R /F62 1060 0 R >> -/XObject << /Im2 1049 0 R >> +1518 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F53 1032 0 R /F48 955 0 R /F62 1065 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1510 0 obj << +1526 0 obj << /Length 2779 /Filter /FlateDecode >> @@ -6470,69 +6552,69 @@ lP ølZO誻Æ’'9;&kË'ì¤ç¡5îìæÞñJ»Ž×##ÕÛ5g¶dÐp=¢µA~p‹Í±s¢:]}AÁG†F Þƒ€ô-D:Ì¢Y»"&‹»vãSÇhåj[÷ÕºöË®¤× Öv³ªzòXx¥Œ„­ûjUýîQà8·4aç?6pÚ/úýÑÜâþ^ýç³ù®ÃÇ•}¶ØÜxfR'o†¸ ¸ézFÖ¸¶öiŒå«¸„—$X1Óäæηw³Q…=ðOÇ KìÃ}ñ¼×þÊÃßpAõ­™P2å)K2½'ÒA©˜^“#‡zXk½/‡O9{ÏvËPý•Ïìú¬’ —1y’¿¬†ë5AvCI|óHɤf¿{˜‡¬ä‚SþISŒK!‡œ2*É|ûÇÁµC¸Ð“Ðå¥Y®ÿW]æ(À|EëìW<{K)ÓŒi©ž±H¸¥”Z0Iá }h‚/SÀ„"ÛÙáiëG£Œ’»a¨%fþ"¹êB1½mÊÃû 1Ä û6쮤bæÅ+çƒ-ÊçuŠ×0B‰Wtš&ÓÄP…ê|2Õ‰NãSԞѱm-]*š4zzSõ4q_Ô[KC†a×Lva*𸭑ÇùÄxŠlB«¹"Eíe±§N³ß˼`¨‘Þ¦Õ¡’Œå’ÍÝVXñ¬¡ÄçÜÈ×À/SèϺĜϿ;¥†{Èg Îje§%E<­«{OtºÎ‚®³ Îˆâ¯¨´»hr ôª¤78ð ûÎ9ò5Ï›kÛT.þ)ªMñÙµšÒ%ü$´u@®<ÛzS­ŠMå.UàuÛYÏpã){Å‘\›s¬PXZ\¤¡Éƒ*ÚÒ -B•H¯/¼ßEâ`Ôºáë’näy\·®Ò®6¥M¾ nŽÖ–î³e¨3nÛqÈ©Â-Ö²ÝÖå~-RVÝ¢ðué  £åmü[£€XmrùJôYÆRé¯5´k@¹?f~òQø1»ð“áÇ<é­p®  ª·Û¾]´5Qn‹âíˆEè|ïØõE"Ï“|>Þö‹TñW…¡¿Ãb*gïm^¶Xª˜ŠÂÐìý´ŠÿⵂN|˜Ëc-!PË¢/À3žî8©I¤±kÅráï$ü¹æ ž”Jp„÷#áNä™Ì±²}bw£ë”¡—pÍÛ Æiå¯2ÞÿÍïmÿgéç~'pzå,5Iþòjf-÷«âÛç®"Ã-»GQf´IŽçÊÿ@WÆG~&P3„ö\Á%! Te¨çºç hˆ8‰ÉÍŸ×þî$@KɸNócMBLyóßìþž¹Êsy܃½ø«RÌr~ð§`L©ôŽm$ü>s †endstream +B•H¯/¼ßEâ`Ôºáë’näy\·®Ò®6¥M¾ nŽÖ–î³e¨3nÛqÈ©Â-Ö²ÝÖå~-RVÝ¢ðué  £åmü[£€XmrùJôYÆRé¯5´k@¹?f~òQø1»ð“áÇ<é­p®  ª·Û¾]´5Qn‹âíˆEè|ïØõE"Ï“|>Þö‹TñW…¡¿Ãb*gïm^¶Xª˜ŠÂÐìý´ŠÿⵂN|˜Ëc-!PË¢/À3žî8©I¤±kÅráï$ü¹æ ž”Jp„÷#áNä™Ì±²}bw£ë”¡—pÍÛ Æiå¯2ÞÿÍïmÿgéç~'pzå,5Iþòjf-÷«âÛç®"Ã-»GQf´IŽçÊÿ@WÆG~&P3„ö\Á%! Te¨çºç hˆ8‰ÉÍŸ×þî$@KɸNócMBLyóßìþž¹Êsy܃½ø«RÌryð§`L©ôŽm$ü>Í ˆendstream endobj -1509 0 obj << +1525 0 obj << /Type /Page -/Contents 1510 0 R -/Resources 1508 0 R +/Contents 1526 0 R +/Resources 1524 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1507 0 R -/Annots [ 1514 0 R 1515 0 R ] +/Parent 1497 0 R +/Annots [ 1530 0 R 1531 0 R ] >> endobj -1514 0 obj << +1530 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [312.8189 298.8688 386.4723 310.9284] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1515 0 obj << +1531 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [406.3277 298.8688 479.981 310.9284] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1511 0 obj << -/D [1509 0 R /XYZ 56.6929 794.5015 null] +1527 0 obj << +/D [1525 0 R /XYZ 56.6929 794.5015 null] >> endobj 482 0 obj << -/D [1509 0 R /XYZ 56.6929 509.1791 null] +/D [1525 0 R /XYZ 56.6929 509.1791 null] >> endobj -1512 0 obj << -/D [1509 0 R /XYZ 56.6929 477.0735 null] +1528 0 obj << +/D [1525 0 R /XYZ 56.6929 477.0735 null] >> endobj 486 0 obj << -/D [1509 0 R /XYZ 56.6929 477.0735 null] +/D [1525 0 R /XYZ 56.6929 477.0735 null] >> endobj -964 0 obj << -/D [1509 0 R /XYZ 56.6929 447.2177 null] +969 0 obj << +/D [1525 0 R /XYZ 56.6929 447.2177 null] >> endobj 490 0 obj << -/D [1509 0 R /XYZ 56.6929 390.5598 null] +/D [1525 0 R /XYZ 56.6929 390.5598 null] >> endobj -1513 0 obj << -/D [1509 0 R /XYZ 56.6929 368.2486 null] +1529 0 obj << +/D [1525 0 R /XYZ 56.6929 368.2486 null] >> endobj -1516 0 obj << -/D [1509 0 R /XYZ 56.6929 281.9323 null] +1532 0 obj << +/D [1525 0 R /XYZ 56.6929 281.9323 null] >> endobj -1517 0 obj << -/D [1509 0 R /XYZ 56.6929 269.9771 null] +1533 0 obj << +/D [1525 0 R /XYZ 56.6929 269.9771 null] >> endobj -1518 0 obj << -/D [1509 0 R /XYZ 56.6929 89.8526 null] +1534 0 obj << +/D [1525 0 R /XYZ 56.6929 89.8526 null] >> endobj -1519 0 obj << -/D [1509 0 R /XYZ 56.6929 77.8974 null] +1535 0 obj << +/D [1525 0 R /XYZ 56.6929 77.8974 null] >> endobj -1508 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F62 1060 0 R /F53 1027 0 R /F21 710 0 R /F39 895 0 R >> -/XObject << /Im2 1049 0 R >> +1524 0 obj << +/Font << /F37 803 0 R /F41 940 0 R /F23 738 0 R /F62 1065 0 R /F53 1032 0 R /F21 714 0 R /F39 900 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1522 0 obj << +1538 0 obj << /Length 2893 /Filter /FlateDecode >> @@ -6551,23 +6633,23 @@ a ¦JI$áû œÝ$âgÇ$†l"Ÿ’T{;Ý‘³×‡ÞØ¡)z€2„#©êa„¥Cn”C½Þ‘ûÂÝÌ×KœˆîÓé2ˆܦŃ_tŽûªGY´'·Áýu1ÅV“ðô‘®4YèFÇù¨ õ ‘?n›G@¤‰gîæ’XxÑÉ|Û’ûŠ®o°ž!E­å]ìWÂv5±1E×áÑùÕz†„fÍ©Õ3‰ÀîÀÑ~½w|È y|Kwz¹N˜Ð@kÈ 'Ǿ6äjZ®=dþÚ0gºõŸÀ¶ÇKJ$¾Üï;Lr< ínÓŠ¤‹‹Ð5ì @ÚõÑIñ0CkY§ ù'ƒš”.x›’N6­Dä#Û=î´Ï™a”¢"!û™—ÕæxOd%,&â‘‹%ÆŽBëÝàîÞ ¤‹ ºVs¿SB"»úÆF­]-)¼ÛÒÐtõ“ê?u²@Dì…çd;‹›mßØ×Aì”­³/Yu­.,¤eœ»®Ãf LIÈäµ +°©ú¿¿;Ö²ñað¥ÆT¿¯熋’×T±»£»!¤L M’‡×åÁ(^®a‚÷0Áò©I,€ñd³å]¶Hñ蔾gV¼à½#V^4oÚqq7_RI*z7‰‘®Ï³Y‰ê èýÀ`—Qá]EòúÛUÑ$0”É.²þLšÕgë¤LÃ0£­Õ¯¼«<õ¶M,€dµ#µÙëî›V—Œ']O 3 ?² -燉ŒŽ.Ž¾Á°¶ 6„»l xÍ°þã%o6( ª;‚LŸIl ÁÛýD·°ÞëŒjó7÷°ýIGÓp‹s ¨g†ýS¯0|Y4ç,–Öá·…ÌÚ'?\ç½NêþÜÏäWÿU²rn ³TÀLbܧáXˆº›hàWXÆɦUkêÿÈ:0çendstream +燉ŒŽ.Ž¾Á°¶ 6„»l xÍ°þã%o6( ª;‚LŸIl ÁÛýD·°ÞëŒjó7÷°ýIGÓp‹s ¨g†ýS¯0|Y4ç,–Öá·…ÌÚ'?\ç½NêþÜÏäWÿU²rn ³TÀLbܧáXˆºS›hàWXÆɦUkêÿÈ’0éendstream endobj -1521 0 obj << +1537 0 obj << /Type /Page -/Contents 1522 0 R -/Resources 1520 0 R +/Contents 1538 0 R +/Resources 1536 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1507 0 R +/Parent 1497 0 R >> endobj -1523 0 obj << -/D [1521 0 R /XYZ 85.0394 794.5015 null] +1539 0 obj << +/D [1537 0 R /XYZ 85.0394 794.5015 null] >> endobj -1520 0 obj << -/Font << /F37 799 0 R /F23 734 0 R >> +1536 0 obj << +/Font << /F37 803 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1526 0 obj << +1542 0 obj << /Length 3252 /Filter /FlateDecode >> @@ -6581,86 +6663,92 @@ x …,‚ ‡ …BÁá)‰Ž·Ï0ëq•æ7±PÌÖî³iM€j¼ð=SBYÑFDzÍAhÚÇ>cÌ3.wÃÂã˜ÂºòƒþppÚ}Õ7ìUe" ¶9bàCH…¼•aÈÍ%j±èj± ”×ö™‡ü@øVW™I‡¾©ËbòHðå2kd¡YtC(D¥A ÝŸ1L‹{mFCÐT¸ žµWû9×!É[f\gGì/¨‘E‚¡Ûa? ½aòÉÍøUDŒkcß"å=hcÞú\¡o5àÊ?b£Ñ‹ûbbªÐB×±¬Í~¥ùý—[k‘GsŒXñŒêà çR†±#FOB‡½Û÷—7•@”¹†Æ´©È{H©);"6‹[Ø3_ŽË¢É©;%Üz”•fc×gýø]CX4³ÕücªóEQµÏÕ8°•] ½#ÝaŸ¿¤›±Ÿ‘Bø<„ý0#!›R’“±™úd±Ã¨ŸpOi‰6"­Í3{nÁê°ÇéïÛ^ùu @BB6}˜Š\úJÅ‘3@EL˜7ŒVÈCg´|È‹IŽ`dí"­ýBpe¿p„³_§ûE¼Yâr&³aÙí¯£›>ã‰wJm›¦àˆ®"¸YÎçõ¢u¼}_4-„Lör°Cš7ìz„‰ðH^ŸÄ1Ñò1hco¨;Õeç}” Â"ÉV>¶7`ø¶âH÷e_Š'ëû•c68'â­ ›ÿo–;·)bà„¸~o^ô<¹ð ì„p¯ €¨jÛÝm”€L$à¡5&@ßÕeY?`ÎtþþR$™‘„S* Ûá”I™"‹iÜÆ<ñ¹ŽÐ8ί,iS“O›èöÕ*éÊíAœ 5«ÖxK@ݧe±%$­{Hÿ±-#+h¬¢CÙ×ër4xw'÷“ >¢æ‚™â!©ÚÕuáýЊñWx³š|@Á:Û¼”Ûz…zAYä‘DIÒ…J 1ÎßãýØ®ó<­ Áé:3…pûÃ^ðBðLö°nëI]fbëR­±Yš·ÔñëÕˆF>Aò À¬È@ÍàPE˜v¢C&¨t+Hª08ò•»¢ö|¹˜×ÆWàBM îXo·¿kvFÆË¢l+/ ~X/œÒu+ê€Àä½±¾VûSÿ”¬[‡ô1pì YX«é>Vw˜˜ù±`vì~‘ìðú Wà¸d>³7ðûE„Ãb›¾‡8*b ?ï5)CÒ*i.uÁÌoÑ?^%yÔÈô½.ë9•H]ÊÆF$MΠÍTþƒ•Ö½Bx"[a=/äÊ»Â|/¶1äN"c®!Óäë›isÞMZ¡ß%­ÐwŸ.ŠziWj›•ÙVϬ7À²â8mVö4܃Ó,\ïÔ–°ça²èß*Ó55=A÷‹W‡q/%_o%¤èý•|fHÁ$½X>R°„ùJˆhR°Aö‹ í½3V…Ûy×êÊ¢f󲘭©á*o‘Úkmnâw;¥ÊÜH`Ã!‘ÁÓZ@lÙ;p³¸›nw}.k»²þ’¶Úî9K«Ç],йQÉ ÚüÞV•–”ÅKs8‚ZÒM㌭lžRŠ¹= PÞrâ èÍj;?·S;;ãMý)}•a¯‹¥7É)Q!}ƒ8xkXòŽU™0\2i8²ãåè˜ÑUdæ».¹!eC¨uL&]=`õ¡Ï¼/ÆØ@;ש©'â ¬5á‡+xf)(^´ðhô‹K4Φƒ8½°›Mð¶iÍg-Ø&ºÀ€ÔT@Ì ÝZD i>ÞÁ!h]R¼ÁÝaTH4PíñpÃwôþÙól$‹øvm³`VZ»8Õ…¶«¾Ý1îXaÑ–¹Ç_OAb¿& •ÓÌtJÌÀ’·‘âØ}É aL‰½Ì¨a4*6E'3º˜Ùáe1+ZBc ϼ~°}5íB¾1æ“#hOR;vl—ù¬çv•¢ÚØi’Nrü„$‚j”»cЮ;Ä-«M12¶_N‰ôx>GBœq'ˆ²Åð ÷šºÐD°aÇx¸ÖöÙÅÓ²±K!%2B‚ :źµ»!‚Þ±Û˜¨ëxxgY™[60oŽåñÂ%r—×2«$Ò ³_Ë‘ÃßË*TãoÑÌáì×Sø\­‘f`ê@ Às•XS76"è!×+¼^F8ºÊ^Áµ”˜ƒ®üžåN›ÐñQ ÃS7‘@`¬éiÃIÅle“yxàYñU» ¤Ÿ‰^g´HQáñ•Ž[¯¶!ÀFÙy1¦÷É:Ö62Ë)ÈÛBÛ‘F#áé²™]ï6× ›T«4ËéT768!í'H7vŠPcçõ²´±ÏØvSŒÃŸážMgÉ}që‡ðS…G» -ñ±;,%ñØÀvŸê_WvnJ0øÕt§m#…å‰=Ò»cr‚îM*·Yb%€'“ˆ¦Ù’n]á5±¡^g{˜NgÒ‘lÕÊ”ãÕ¢²åÂ:pbåѺ§[Æ£.ÿp‰WãŠEãtòÙ³]á,72Ûe.÷i¹|RéØ´á´¹¿ï#^U&Áv}sôŽ&÷ÏýÂwý•³Œ}¡Ôž;  ‰Õ©zŠ?9;Do\D|×áÿîÐMendstream +ñ±;,%ñØÀvŸê_WvnJ0øÕt§m#…å‰=Ò»cr‚îM*·Yb%€'“ˆ¦Ù’n]á5±¡^g{˜NgÒ‘lÕÊ”ãÕ¢²åÂ:pbåѺ§[Æ£.ÿp‰WãŠEãtòÙ³]á,72Ûe.÷i¹|RéØ´á´¹¿ï#^U&Áv}sôŽ&÷ÏýÂwý•³Œ}¡Ôž;  ‰Õ©zJ>9;Do\D|×áÿHÐOendstream endobj -1525 0 obj << +1541 0 obj << /Type /Page -/Contents 1526 0 R -/Resources 1524 0 R +/Contents 1542 0 R +/Resources 1540 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1507 0 R +/Parent 1497 0 R >> endobj -1527 0 obj << -/D [1525 0 R /XYZ 56.6929 794.5015 null] +1543 0 obj << +/D [1541 0 R /XYZ 56.6929 794.5015 null] >> endobj -1528 0 obj << -/D [1525 0 R /XYZ 56.6929 337.2163 null] +1544 0 obj << +/D [1541 0 R /XYZ 56.6929 337.2163 null] >> endobj -1529 0 obj << -/D [1525 0 R /XYZ 56.6929 325.2611 null] +1545 0 obj << +/D [1541 0 R /XYZ 56.6929 325.2611 null] >> endobj -1524 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R >> +1540 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1532 0 obj << +1548 0 obj << /Length 2932 /Filter /FlateDecode >> stream -xÚÍ]sã¸í=¿ÂÎL¬Šúê[6›\ss—ÝfsÞÞƒlѱº²ä³äxýï  L;rv{—¶;™‰@AAÐbŸ¥QªL’LQ(¢ÑlyŽ¡ï‡3Á4G4ñ©Þ<œýåF%£,Èbæ¯4ÓTŒŠ_ÇW»|ÿp}>‘Q8ŽƒóI‡ã7·wo “ÑçêÝÝÍí¿Ü_ž'züpûîŽÐ÷×7×÷×wW×ç¡t$bÿ|wwMD7·?]ŸÿöðãÙõC/²¿,*”÷÷³_ G¬îdz0PY¶Ð‘er´<Ó‘ -"­”ÃTgÎþÞ3ôzíÐ!5E* ¢T&z’jHOQÄ -ºPO Ë…y—TÖøãÎuÝ¿%ýà¿KBµfÖ•MMfÎt÷-,[BÌòõº45rFò,³f9-ëÜq=Ä®wé˜iæÔø}cê®ÚnÓZÑ#¾Ÿ¤Ô«¦¬;³n&l×з…­yJRfÄÊD"'ÍÛ»V\0ŽðŒÂ+Áî‹' þ†!h^16_ºM^óeµ6mKÊ‹Ø™€˜«CæR™Ú2';eÒS4^ѧ=ØÕg‚–½až7ë%AÔ뼫|öÙt<ƒ• ¾}/,Ÿèi¢¦kfMuq>Q¡bCß\›V]í^ÒŠ1à‹òqa‡ÆÙØÔ³¦ gÌœüI8Þ.LM¸¶kˆ/Ó”ŒÏ郮CCZ³~²–lÃ_–¨©°ö „ 'ãÛš†ð^)¾äËUe}Z¬„§²8žôþæŠFBчk#ÉQi¤ÞU†ÁrYV ;Û@¯´ßEÞ!$ØŸ‡“àw™·aúOa(­\ØØæ ¶Ù#=æ`*1nÍÖMÊ"Í0QÝ17ôü‚‚~t[ýЀ²2 Ú)ïÀ?¤ŒÆ˦…¥H˜š‘·x½°Lò¿‘÷÷·Ü“ÇQ§æ±¬™å¶ìtVyýÕÆéxk Ï\2‹¼m7Kðu‘qjŽ‚`K{É ­ä¦~(ë‰y·?•Í¦uQ. à JK ³Õqdoæ©],žU›ÂõyÃÁš¨ó"Ÿ–UÙíl¬´ÜMSUÍÖ÷699¤ØôDzx¼e|U¢¿><ütÁ¨ÝÊ0½{ˆ›U Læ9?i׌ÀÕž¨ˆÌ‚M~4pY›eS—³vÈB…Á}_÷gô´y²›#vÑŽX™ƒþ æcöö#¹ÚxÞôz÷³’ !œÊT®C -xî%o?5¥“ -2…Ç šæ ?͆;ÅµÓ DZ†ÒN¹îUb›{FQ¶ÿÂ#Ùª?DÅKo-U²Ÿ„V­Ú› [é¹UÛ|Ç0Ö¡RBÍÁènï|©O® Ü—ÌÀS^m¾¶šeÙuý ÓgéRŠþdÊ[lÖC‡\×îTq}bã$~ÈÓý)¹±ÀŒ±.õÔ|šêç§ö3NÍQÏ©ÜÓw¿nh`èä.Fø¹n¶•)Í V`¹rfó¬^`/ß Óaø¤:Ò.kP7Ž”U~A­-[BÒ±NÔ®tôE~r홋³NHrÛü±±=¾§% ÷¥Q&pg’ò[n**ƒ8–ÑáMår‚xJ<) ƒnÄ!«I¿¨‰Î¢@€²Ý5Hû™¶PIFQ6Òp_L„Š­Mn?Ü×om«4ÿüñ|’¨DBúHÁÿq}w}ôdG -Õ™­Ò‘7õŸ[ ê <𿣟n‰H‡$uH gžNã ‰Rº4<×ÈåÇ^§ÕáÍôªú¯ªîZ"þªÃ$:HCEçC‡À\ÜbU’¡Žddˆ$OkÆ›ó;ö”|!ö* -'<%–AªùîÚ+&D/èÀãþë@' -cõ5ïˆÂ ÍdFÞáoHò|ßIA-29­oÂïxÓ¨(P‘_s [A%é¡k¸ý¡N+ÁcÿJJØ×ÐþGH`A:ËF*‚09,æ=+êýƒTf èŽè4Ñò增J³}Çæ[J*´•Ô”4 b‘?q&ñ¶ë0Õ®>ÕÂÆvQÎD -䶴ÙvØŠ´GìñdZv„ª7Ë©-<·—&[AªéΤúÒva}ååB^^œˆµG¹½õxù\­ë‚rANnߟàA†ÃJVò£”JIZ_Ÿ צ{Æò…ì7âÛÕAæ·ÏòXš¶üÒ/Í¥…tEGñ¶ÍѺà&Ÿ-ŽoÏ$Ó©èà÷\t(!5æy2)ã àˆ’äÛvXö‡vXö¿J&Ý¢&JÀ et*ü+Sþ•À*|FGàÇÁOW‚Ÿo8©„Lw:Ìœ`›ÅÙð$À?­ŸÁ‚'Aî?³×> ÷ -UêäÄ)#‰6 AH‹•Êø}Æ×…ïU…X89ÂÓJñ¦{%¥ü''Ãëû­H2ÈžðdP2H2‘}ãÉ kÅÙË'lÛ Y̱¨l_Ž@}ñšÙÇJz]8܉ „‡¾?ðW‚8“_œŠ`w‹rŽRÌ«¬ö5·ö!¥?/æ –( -RPâDCªâ½§¸×”·e;Û ¼àai£«™5ëâÔ;J$Šwù¥-ÃÉqaÚÙºœÚ3 g\DSÙ>î"žž xLÿØ@}eMç»ÐŸ3]Þ- £¨4¨Š)ØKØWÕZ+‡`õú£é\( òágkSÂZAÙZ[WÎ6öuÁ¶Kc«7Šßí”8\‚:m6h-:.® ` )á^VúF!'–% ក°ÀtAõ±)±†Á TQ»¬•Á’$?MÛÁ ß²„³$À·¥-|aò"ðícGhû¬!ìÛ™e•'¤cˆU'l¢œØÎÝ—îVÖ'³ÊË5!‰…²Õ!4ŽLyï+ÐK*A4 -êcljÒše`©dþÊ<åv§h[]Û,Qk:â¢! Þº ÍIö4ÖA(Ñš¶¦•+ij}dj@ØÄ ¾ S­˜Í®í̲e äKKz€ÀÉè]ASÑmÀïùÝÞÅ*QûÄ‚ŸJT_œPàGÎOȾ&¨Tÿ5¯¢d -¡u¦?Å—NÅî_Æ©ðG‘bÏAR[¹D¨]¡f¥­qó Ö˜ŠKáÏÅc"'%}Vë²±ÅTBÖ…ë*Þ;‡Ñ gÏöð$éçñÒ±¿Î–ú;Gè¿çA“xÆ}ê(»z=õ mK´yæ^u¦@ŸN„sS¼À&pZw_À‚;*pÍõð˜±TƧtóšl0ĶW•O]õ=£÷%ŠšcXº¶‚’‡Ï &PHJÇkÐv³¬\Û›?…(ÃŒ] ·swü¥Oݲ½æ‡‚Q/qÚÇðUSü”Ñ?–§zLJGº„*û^Íü‘ÂwnÅ4óœ ¸eå³Ï<®á¯cY›/Ì£"Amàî^h^¿áø}ïB8„ìÔyÑ ù$…cjtÓ”2'Þ*Ÿ¶Mµé µ–&¯©(4Ÿ¤L ’:ò^Q2;ŽkŸx+&tJÄk«›Ô.©øGÚó½gå ì¤ò½ßšèx{ø‰Šü]ÎÀrÂÑWsìoýùÏþ'PXJÓE€>%d¡Ðé³ÒJÿ;¡ç¢ÿ6³.ùendstream +xÚÍ]sã¸í=¿ÂÎL¬Šú`ß²Ùäš›»ì6›ëìôödKŽÕ•%Ÿ%Çë_€eÚ‘³Û»´ÝÉL‚  ‚£þÄ(‚P=JŒ¢PD£Ùò,=Bßg‚i&ŽhâS½y8ûËJF&0±ŒGsW„i*Fù¯ã«¿]¾¸¾?ŸÈ(ÇÁù$ŠÃñ›Û»·„1ô¹zwwsûÃ/÷—ç‰?ܾ»#ôýõÍõýõÝÕõùD(I` ˜Å?ßÝ]ÑÍíO×ç¿=üxvýЋì/K„ +åýýì×ßÂQ«ûñ, ”I£Ña Œ‘£å™ŽTi¥¦:ûpö÷ž¡×k‡©)Ri¥2ГTCzŠL+èB==, +X,,ϺŒ ²Æ¯w®ëþ-éÿ]ª-f]ÙÔÔhæLwßÒȲ%Ä,[¯Ë"§FÆHžeÖ,§e9.¢ç‚ØõŽ§éÖeýèÖÌ)o–™²Î–E @!EÒ[Yä‘lÉ ÌÖç"3Íœ¿oŠº«v„Û´VôˆE‡ï')õª)ë®X·¶kèÛ€ÂÖ<%)3be"‘“æíÝ+.GxÆá• +„`÷E‡ÿ Ã4/„_ºMV—âËj]´-)/bDdb®™K-´eNv2ÒS4^ѧ=ØÕAK‚Þ0Ï›õ’ êuÞˆU6û\t<ƒ• ¾}/,Ÿèi¢¦kfMuq>Q¡bCß\›V]í^ÒŠ1à‹òqa‡Æf\Ô³&'g4Nþ$oEM¸¶kˆ/Ó”ŒÏ胮CCÚbýd- ؆¿,QSaì*NÆ·5 á½R|É–«Êú ´X Oe~<éýÍ„0¢/×F.’¡Ò$H½« +ËeYîl½Ò~Y‡`FN‚ßeÖvÓ +CiåÂÆ6c a›Ýñ8ÒS^L%Æí¢ÙºIY¤Y&ª;æ†Þ€_p@ÐŽc«P¶CD;eø‡”ÑxÙ´° S“ ãy +|pþš@»/Ù{ ŠT¡ª².,C=ΪnÑlÔ²–õÆ…$†¤-ÞD`¶¶Þ´âi7È;˜¬´~\J£dêG\–ËÖû”segFHŽË'ò¯–Iþ70òþ> à–{2âã8ªñ´x,kf¹-»…GUVFõ€q:ÞÃ3—Ì"kÛÍK—Rô'ÓPÞb³:äºöp§‚Œë'ñCžîOÉfŒu©§æÓT?Ï8µŸqjŽzNÝ8àž¾ûuCC'p1ÀÏu³­Šü±8Á +,WÎlžÕ ìåt: ŸTGÃe ªãÆ‘²Ê/¨µåqKHZ8Ò‰zÀ•Ž¾ÈO®=sqÖ In›=ö!ö¯Ç÷¡D á¾4ŠÂîLR~ËMEÅaÇ2:¼©ü±QNO‰'% q!ðbÐ8d5é5Ñ& +(Û]ƒ´Ÿi •i™‘†ûb"Tlmrûá6¸~û lÃX¥áøçç“D%Ò/À@ +þë»ëûË ';R¨6"H´JGÞÔn5¨7ðÀÿŽ~R¸]$"VÔ&Î<ÆA¥tix®‘˽>N«Ã›éUõ!^U ܵDüU‡It†Š.·¹:¸ ĪĠŽd˜D’§5ãÍù{J¾{…žË Õ|wí•“€¢tàqÿŽu “@…±úšwDaiÈ;üÍIžï )¨E&§ÕâMøo*òk®¡`+¨$=t ·?Ôi%xì_I ûÚÿ㨠,H3‚P„Éa1ïYQì¤Ò$ g8¢ÓDË—‹z*5ûÍ·”T6h+©)i@Ä"{â.Lâm×aª…]}ª…í¢œ-ˆ.Èmi³?ì°7i/ŽØ)âÉ´ìUo–S[xn/M¶‚TÓ7Hõ¥9ìÂúÊË…¼,Ï9kr!{ëñò¸Z×9å‚œ ݾ?Áƒ* ‡•<¬dG)•’´¾>®‹î˲߈oW™ß>ËciÚòK¿4—ÒÅÛ6Gëv‚Ùlq|{&™NÕ@/¸¨€ä + C iQ?ß>pR ;™ît˜9Á6‹!²áI€Z?‚1O‚þÜ6š×> ÷ +UêäÄ)#‰6 AH‹•2ü>ãëBŒ÷ªB,œái¥xÓ½’Rþ““áõýV$²'<” #Ì7ž ¸¦Ql^>`Û¡01Ç¢²}9õAÆ kÅ>VÒëÂáHd 8ðý׸Äi,˜üâT㸛—s”b^¸Êj_sàpkRúóbj‰¢ %N4¤*Þ{Š{My[¶³ÍÀÛ –6º³fŸzGI‚Dñ.¿´e89΋v¶.§öŒÃÂÑ”ÙÇ]Äӳ騯¬é¢cú3¦Ëú±eÁ(* ªb +övÆUµÖÊ!X½þh:×J‚|øÙÚ”°VP¶ÖÖ•³}]°í²°ÕÅïvJ.Á6´– +W°?”p/+} +£Ë’…pO@X`º úØ”XÃà†ª¨] ÖÊ`É’Ÿ¦í`o&á, ðmi _˜¼|ûØÚ>kû6EfDYå ébÕ ›('¶3÷廕õ À¬²rMHb¡lu#SGÞû +ô’J‚:ÄØq¢t€fX*™¿*ž2»S´­®m–¨5qÑo]Ðæ${k € ”hM[ ÓÊ•4µ>25 lâßEQ­˜Í®íŠeË"/-é'£wME·¼çw{«üEí~*Q}qB9?!ûš Rý#@Ö¼Š’=*„VÔ‘ø)¾t*voü`œ +)ö$µ•K„ÚÚhVÚ7Ï`©¸þ\<&rRÒgµ.%d»Þ¡â½spölO’p/ûël©¿s„þ{4‰gܧþ€²«'ÐSÒ¶D›u`îUWäèÓ‰pnêÏ‚×ØdNëî XpG®¹Ó#–2|*A7¯ÉCl{UùÔUß ½/Q¬ÐÃÒý³-”<|1BR:^ƒ¶›eåêØÞü)Dfìb¸»ã/}úèföš +F½ÄiÃWMóSFÿXžê1)é:¨ì{!4³G:SܹÓÌ3‚à–•Í>󸆿Že]|a òhvõBóúµÇï{Â!d§–ÈófÈ')CP£›¦”œxG¨lÚ6Õ¦+¨µ,²šŠò@óIÊ„Ð ©#ï%Íq\“øÄ[1¡S"^[ݤváHÅ?ÊОï=+/H`'•ïíüÖ¬@ÇÛëÄO|Tàïr~Ž¾šcëÏö?Â’Pšž(ô)! …†H£cÉûß =ýß7 .ûendstream endobj -1531 0 obj << +1547 0 obj << /Type /Page -/Contents 1532 0 R -/Resources 1530 0 R +/Contents 1548 0 R +/Resources 1546 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1507 0 R +/Parent 1556 0 R >> endobj -1533 0 obj << -/D [1531 0 R /XYZ 85.0394 794.5015 null] +1549 0 obj << +/D [1547 0 R /XYZ 85.0394 794.5015 null] >> endobj 494 0 obj << -/D [1531 0 R /XYZ 85.0394 729.6823 null] +/D [1547 0 R /XYZ 85.0394 729.6823 null] >> endobj -1534 0 obj << -/D [1531 0 R /XYZ 85.0394 704.98 null] +1550 0 obj << +/D [1547 0 R /XYZ 85.0394 704.98 null] >> endobj -1535 0 obj << -/D [1531 0 R /XYZ 85.0394 519.4358 null] +1551 0 obj << +/D [1547 0 R /XYZ 85.0394 519.4358 null] >> endobj -1536 0 obj << -/D [1531 0 R /XYZ 85.0394 507.4807 null] +1552 0 obj << +/D [1547 0 R /XYZ 85.0394 507.4807 null] >> endobj -1537 0 obj << -/D [1531 0 R /XYZ 85.0394 339.3113 null] +1553 0 obj << +/D [1547 0 R /XYZ 85.0394 339.3113 null] >> endobj -1538 0 obj << -/D [1531 0 R /XYZ 85.0394 327.3562 null] +1554 0 obj << +/D [1547 0 R /XYZ 85.0394 327.3562 null] >> endobj 498 0 obj << -/D [1531 0 R /XYZ 85.0394 227.5589 null] +/D [1547 0 R /XYZ 85.0394 227.5589 null] >> endobj -1539 0 obj << -/D [1531 0 R /XYZ 85.0394 200.4217 null] +1555 0 obj << +/D [1547 0 R /XYZ 85.0394 200.4217 null] >> endobj -1530 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> +1546 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1542 0 obj << +1559 0 obj << /Length 2721 /Filter /FlateDecode >> @@ -6678,425 +6766,431 @@ x *ò…©ï©Ò>™ú»´&ñtáoá3E®#óW·á‘Dª‡ÄUq®"¶qÏTƒL$Q5™±wDõán}Â¬è¬±× OU|ØmÊeéñÒ7«~¤„¼ 6qÖóãH q‚TÕÚȱÌÒNçÒh<’0σä æä`V¡ê²z¾Êw»>ȱÏ^¿?1Ì Çd2¼¶¸¬Gׇ¶¬+jE·Ý®½÷Ž’d öºÏ«f“3´ôñ{Í^õè%ÃðÕ66à¤ìñ3 ÑžÂ6,mETýHÝ0‘èÀÉF¾ÑœEYMýüi‰|¿ËGäb ˜‚ éj÷åRÊTŒK¢×‹9UŽ¯Ó1«HµŒ.Á!•>\9zU@VŠkžp²ß|4O¡a›¯Šã‘6 IÌé¶5=8M¦aÍGÑ°)ï*Šcy…Îé>ÏO ò4Y¾"ŽMqëy ¿8èh_Þ­[|Ëi—@¥2€Sz·«›²-ˆÜOäÃXÌ Zþ‘(¨X´¢à¡û\ÚÍ!ßø,{ïËv:† Û¢ò¯.˜Ù~rÉà ¿ Ò›‹vBýâ§ZȉzjÖ/lPà"…ƤÜÀ 4pÌ˺™@z¬»"{ô2§¯Y뻉FÒ\sâ=Ž8íîï1u‡÷] Ræ.½*¯.¤òŽ”¿ƒi|eYPóÃwÅâ._§%os"²×]p .†rPìóôÈÇ¢û77#Q£Ð•øSWJÕD[pþånÃh3P9±D"ú;¢,¨TüdBÂ|ëœ9·}šîùI+` “ߧc“ð{×0ø…•Õ¨FäðvpKöŽ/£¼ÍÿôX&­0“¶:þ 3ég»î¨J´ˆ³TßN3U˜J;CÍ?\Ïg¿âE´UFFÇÆÐùðQ@6œëë–ß²o +…?! ˆŠ<ÂùÔ¥ -”IþÍÛVnëú釰N0ý”Ï%—ï¨B¦¥ôÄ÷8PÕJ¤Àî)>š,û9‹œ|ò¨?÷Ç3ýˆ`uÆ9=Ž‹;ü PdzvñƒŸö„_Ù0×`éÿ‹³ endstream +”IþÍÛVnëú釰N0ý”Ï%—ï¨B¦¥ôÄ÷8PÕJ¤Àî)>š,û9‹œ|ò¨?÷Ç3ýˆ`uÆ9=Ž‹;ü PdzvɃŸö„_Ù0×`éÿã³¢endstream endobj -1541 0 obj << +1558 0 obj << /Type /Page -/Contents 1542 0 R -/Resources 1540 0 R +/Contents 1559 0 R +/Resources 1557 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1507 0 R +/Parent 1556 0 R >> endobj -1543 0 obj << -/D [1541 0 R /XYZ 56.6929 794.5015 null] +1560 0 obj << +/D [1558 0 R /XYZ 56.6929 794.5015 null] >> endobj -1544 0 obj << -/D [1541 0 R /XYZ 56.6929 703.0246 null] +1561 0 obj << +/D [1558 0 R /XYZ 56.6929 703.0246 null] >> endobj -1545 0 obj << -/D [1541 0 R /XYZ 56.6929 691.0694 null] +1562 0 obj << +/D [1558 0 R /XYZ 56.6929 691.0694 null] >> endobj 502 0 obj << -/D [1541 0 R /XYZ 56.6929 555.5354 null] +/D [1558 0 R /XYZ 56.6929 555.5354 null] >> endobj -1546 0 obj << -/D [1541 0 R /XYZ 56.6929 528.2309 null] +1563 0 obj << +/D [1558 0 R /XYZ 56.6929 528.2309 null] >> endobj -1547 0 obj << -/D [1541 0 R /XYZ 56.6929 486.7584 null] +1564 0 obj << +/D [1558 0 R /XYZ 56.6929 486.7584 null] >> endobj -1548 0 obj << -/D [1541 0 R /XYZ 56.6929 474.8032 null] +1565 0 obj << +/D [1558 0 R /XYZ 56.6929 474.8032 null] >> endobj 506 0 obj << -/D [1541 0 R /XYZ 56.6929 306.0886 null] +/D [1558 0 R /XYZ 56.6929 306.0886 null] >> endobj -1549 0 obj << -/D [1541 0 R /XYZ 56.6929 276.0992 null] +1566 0 obj << +/D [1558 0 R /XYZ 56.6929 276.0992 null] >> endobj -1550 0 obj << -/D [1541 0 R /XYZ 56.6929 186.806 null] +1567 0 obj << +/D [1558 0 R /XYZ 56.6929 186.806 null] >> endobj -1551 0 obj << -/D [1541 0 R /XYZ 56.6929 174.8508 null] +1568 0 obj << +/D [1558 0 R /XYZ 56.6929 174.8508 null] >> endobj -1540 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> +1557 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1554 0 obj << -/Length 2210 +1571 0 obj << +/Length 2430 /Filter /FlateDecode >> stream -xÚ½koÛÈñ»…>ôƒD{û$—EQÀçÈ©~\]S\.hiHG¤ìä~}gvv)Ò¦í´IŠáhwvvÞµqø'FÖ0®2=J3Í f´ÜñÑGØ{s$Î4"M»X?/Ž~:Ué(cY"“Ñâ¦CË2n­-VïÇ'ÿ8þu1»šL¥áã„M¦&áãŸç¯i%£ÏÉåÅéüÍoWÇ“TóË Z¾šÎ®f'³ÉT(m$PÄï—3B:ŸÍ&¿Í-Ë]±WÈ泥÷øhÒýręʬÝÃÎD–ÉÑöHÅŒV*®lŽÞý³%ØÙõG‡ÔÔâ[Lq#¾êZ!Y–=|-å+fû -:ÇVã‰>©ƒ€”´ªµ¢T#!XfŒD3fœ¥Ž§Æ€i2ãjØcfÌ$Z ¢àÌ( œ{ŒËÉ4ãü/Çì4µÖR¸Ç*‰7>ã:Ëát`/êA~á§ùVŽ^W Ш#S¤;íö"%²ã˜B¦Œ§®Wœ%<³žáÅÚ‘P‰êàJ`Ĉ(Ô_.¯æoæAøM­™5< x›¢tõdª2>.Jú6@Þn¢øøs¾½ÝD”|¶np«ÚÑÛ]5f|W¬Šò#--«²¡ãM Z=G¸ë‚Õ8h„,JÖ«ÊÍÀ|ü‡”)AHBòqX_Uô-«&néê:Þ€§"Ïoo®)!HPyÁÍe³Ï7ïëü£Cq \µæ^Ù‡ÛHÛ×nåà‘uéY_;Ä•©õ²ã·(WÅ2oâê:o"–:: 'júîÜ&oŠ»‰4ã4Û³›¢n€WAøEÉ:´ÎR–(ðœn0}[|b&0Y’¦‡ómÙ£òše¿ yÑ ùˆ—èBZP|`®5 Îùø´£tû{Uºx‹M€^;·Í’†4#…û|˜¤êvSiíø<Uï¤l6>­v[oQX½ÏkŠ²hŠ|ƒ¾‚?WîÎeéíäwéèÕé -@Æ7åeÀY©l\ï¯k÷iïÊ&R»v®$È}n\¹r+ôYð‘wkäjÀ'É[@îV„ž6Z.šÚmn\Ów¹Éë‚/»[¼³ ø $»‰†–•ÿ®Zô€õÜõÛ}ˆ]‡•*0Ðò]ç[×á…µBZ¦•P^Èaâ`ibŒ¬¸Znö«LÁ±:‰W«§‰ʦ=Ál*¡¯ ¼W¤À­P‘Ðüâäì·×³J‚(•J¤¯r5@Rj¦”M#ÍÅâŒ1• T¶ŒC)ÍRk:ñÀDˆˆEÔeª/ÇÁÛ/e“þë_Ê0#’ÁdzJK™R¼UµÍ‹rZ¢i_žX&µŽ†x?@M±4êmYm·è“–‚: >ð> °?Y¤Â>ˆüI¿d|Cêh‡Ú5Þ¯DtWDCXŽËàº"f~€î Š<^ú:…‘0+úæåöå'¨Tf‘ãaUR\¸7§“†ì'B4‹1ÙÕ yN¥W}‰tŽ M1 _ŸQq#,#9¸1Û”¯bY4CQ% ä¤6rÑ‹™˜ˆþñ7BÐ]„”¥ÚÚ€€¢uܧG :[èê#©¿0Õ#ņ“i“E¿¡è1—ûi¡’‚Ù¦‡}Úƒº‚’&u×PÝU«vRtp*o6¥€€HL?Í×·nÙñ‘CúmÖCÉ.ɘH³äef{a›{ñ?î·m (b¹húe÷f>›]×Õfß86`Q a:ƒ>…^WY©ËÍ4Ôå¨7bäl¨¼½{÷¼“ÜÉÅñ9Î^àóãùÅôíìê_0Ì &·î}‘g¨´Å]¾ie+<æùÁY¸žÍþ}|þëÙŒ\ž3b:°’ô9é#>¶ ßHµèdpù(ƒÇjòÃRx¯\õ².ÌX‘À hH´ðÅ^í°m œ¢M›¿½ÌCäÀ›¥Iÿ—zJR8ÎÉ´ßQ\QT±-S)Ì<èýŽ´Cá ÆÝÆ x‹W5ZÛ¯R™°möÈà >¼àj^ðûþ†q—z™À^Qú´1À—ßΛ¸Yâ·ÁÚÁ“ñüf¨çŠq+Õ‹fâ @•uSïf$ª7ÇÐ,}¢?m™í¤‘ŽÊc^»/šõ`+ª6S}mFƒÞ{H—±†T°w¡'«°Þµ{Л>_D -ÖÇQþ¿ã) -SfhòTšB—ÂmßG))h-ãarW½@g=&ýNÛ¢Z€çÎí–×ÈŽ%…ÔD¿Ðê:÷Ýî -BÈ7‰`iüϵÇo´Ž~U•K×#‹ShÂ,Ì’}ê:R~¼pewXÉWì©w8)¡£Æÿ=^Ä2Ť„9ùë'îxâ©ñˆÌÞ/¼ˆIŽh‰üž/bÂdL'Ú~ÿ'±.ågÞÄ>GèP!ý­Ó,ŒÐÚòNΩi‹Â™ G8>pµólB õºÚoV„‰ :®í\ÝT;Vó?jâF^<Ê)%YbQõ?6na£ç­çïÉ ÓÔPq˜ µ6ãk|—Ú#ï:ñE1_à·.¨wA¸* ç~íè5IT?b6@tÊžXÔÀù¦®Âý!ð"sýÑ!¨ › e»¹J ¾›«TÇýš¯!§„?~½m8»ðE -—Ć?áâRY7d·½[í< çôYùgµ»"Ÿ>‰¨|5»ÙU[‚è=&¥÷˜Wæ i¹¼Ùïü#á«Ãƒ~QŽ§_ܺÁúmñÿ#_Ü„„‘"¢ûâöøO%¬Y¦»ï êQwºXœý¸Î‰?îý€w«³öeÁÝäûM3mšÍÿùea¨”€ø7–?Àð6góŸ{vÄ>ÂZÙ­ Ý. %¡ý -L!ãÖ<äÜ( ÅO¦¬ÿ…ŸžÊendstream +xÚµYÝoÜ8Ï_1÷à:Z}ZòaqØl:éeÑ&{éìö°mœ'1à±SÛ“4÷×%Jþ˜zšöÒCš‘(Š”È)›QøÇfF*9Ó‰$Š25[oèìæ^1ϳL‹!ׯ«£ŸN…ž%$‰y<[]dBa³Õæ}tòÏãßWËËù‚+Åd¾P1~=;‰# ~N.ÎOÏ^ýqy<×2Z]œãðåòty¹±¿€ÝYNKÀ5…}! Òš§`ìà28j“¹T, +ó¦YA!LcúaÑCŽù„ù\À]gsœç¬ð›–HìÊOPÃåR6¸b/[¯‰_V"® 1Ë|x2»uÓ"¦SFu)ŠNÝFÊg7‡`8á‡ü¦n:Žr(ìòuÞNå8V#¥˜rQìXmbÁŸ"€ÂX +xîÚK}6F‰‹¡È €rM&ã:¶'QBî¡ÄAKÉTJ%ZpqE”G5BÕ£ E0ARÆÄýi +õ‚æOÖ I Ñœéq’ ‰aèäÔ;ù ½ôQiè.[ܽ¯±ºä2ÖÐ@…,â§5CPꌾÙm»B/¿žÎiîæl¸jªb×fdÂ9!Ù‹VÀažct2Òf gø"X“ ùÝ»wp7°OÎßØ‹úÍñÙùâíòòÏåå ìt†z:¿O‹Î68ð/uÞ[ Û“å¿ßüþzIN.ÞTÚ«53~y)  +H%XU¥£¢àÕãÍ5”Ó²‘Ô`]ûd6‚kBhfb¥ºdälž—Æ•þ_’›õBÛµázüp¸D@áõ%t„5de; +8ãKHãë» waà«JJóMGÆL`©ßÁÅlíâ þ~èsŠÅ'‹W//DLèå¦Ó6Læ^ø]K,´Ñ8:»žzZ0A¨é@óð5Q8@(óhO ~ˆI˜<©í6%úÀ3´Sv€#ƒ#Èö··“InQðï…4¨Föá5ê‚rãG?&[ åZÙßÆ„–a¾ÁÁ+T¤l×Ä~A½­_»rÊ®Q ·" CeÓâ½í² ÊN={ŠŸkßçéb²í™Ûã±ñëºÚ"…=W=×H¦žÉÊÊÒvW»^ôMuûµvîª"õy±ÿã›êÔ]£‰>õ# …«}öOŽ=nÙ$g âÖ°„$çPÛ1èSFï­‚·¢2¼g(ÿ_¨94endstream endobj -1553 0 obj << +1570 0 obj << /Type /Page -/Contents 1554 0 R -/Resources 1552 0 R +/Contents 1571 0 R +/Resources 1569 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1560 0 R +/Parent 1556 0 R >> endobj -1555 0 obj << -/D [1553 0 R /XYZ 85.0394 794.5015 null] +1572 0 obj << +/D [1570 0 R /XYZ 85.0394 794.5015 null] >> endobj 510 0 obj << -/D [1553 0 R /XYZ 85.0394 663.594 null] +/D [1570 0 R /XYZ 85.0394 665.3048 null] >> endobj -1556 0 obj << -/D [1553 0 R /XYZ 85.0394 640.0743 null] +1573 0 obj << +/D [1570 0 R /XYZ 85.0394 642.5175 null] >> endobj 514 0 obj << -/D [1553 0 R /XYZ 85.0394 573.5829 null] +/D [1570 0 R /XYZ 85.0394 578.7341 null] >> endobj -1557 0 obj << -/D [1553 0 R /XYZ 85.0394 548.3076 null] +1574 0 obj << +/D [1570 0 R /XYZ 85.0394 552.6769 null] >> endobj 518 0 obj << -/D [1553 0 R /XYZ 85.0394 357.2459 null] +/D [1570 0 R /XYZ 85.0394 507.9859 null] >> endobj -1558 0 obj << -/D [1553 0 R /XYZ 85.0394 330.4365 null] +1575 0 obj << +/D [1570 0 R /XYZ 85.0394 484.7183 null] >> endobj 522 0 obj << -/D [1553 0 R /XYZ 85.0394 105.6253 null] +/D [1570 0 R /XYZ 85.0394 297.8603 null] >> endobj -1559 0 obj << -/D [1553 0 R /XYZ 85.0394 82.6167 null] +1576 0 obj << +/D [1570 0 R /XYZ 85.0394 271.7833 null] >> endobj -1552 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R /F53 1027 0 R /F11 1384 0 R /F41 935 0 R >> -/XObject << /Im2 1049 0 R >> +1569 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F62 1065 0 R /F63 1068 0 R /F21 714 0 R /F11 1400 0 R /F41 940 0 R /F53 1032 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1563 0 obj << -/Length 3050 -/Filter /FlateDecode ->> -stream -xÚÝÉrÛ8öî¯ð!ºÊbAöÍí(O¥Œ­éêšt”HÛ¬¡HµHÅq¾~ÞøÈ➤jªÆ>Âò€·/ ;àŸª8ŒSžžêT†*bêtµ>‰Nïaîí ³kfnÑl¼ê—ÅÉOo„>MÃ4æñéân+ £$a§‹üc‡"<Qð¯÷×ó³WQðæêô˜Š—»ø°˜ßÐDl—þruýšFRj.ß_¿¹zûÏ›‹3-ƒÅÕûk¾™¿™ß̯/çgŸ?™/ú+Ñb‘ÀûþyòñStšv?‰B‘&êô~D!KS~º>‘J„J -áFª“Û“ôG³f«—L, -¹ˆ¹‡N\øè¤Ò00…tº-:À)‚î¡ N^Üe»ÊŽ.Δ -Êuá~¥3ÆÂT)nÝfõ}A,ŒfœI-KM#-\¬Îá<Ø”c#Ê!¦‚'Ì+8ݮӗÇa"ƒ‘YT¶vŒü,k+Bo.©ÃE” gö·½;9x3¡BÆ¢¸—ë„8ŠÆâúkÖvÅÖJyYYç_º¢n˦þùl&˜c1L¼z;¿žƒPIV7^—ÛbÕ!OŸ#ès¦’I™§ºË¾üì¡\T±XY -LO1«Õl,Â(Ò®ñ¦zh=·PþB üe@ å0ô#ÀõKQ°+œ7ˆÆX”‚ÕÃHÅ/ E*Bé½Pñ¿Ûå®™ð"‰•:|Ú,Ûu;¦ f% Ø`a4ŠCÇ ”I ¡­ãDË‘÷®ZÈŽ.ŒfÄ YTì EŶ©MG“gD£ëƒ×eÛnÖvÍÆîÚR;ŒÿÔ&Dc(‚+êÁ‚‘ܶí|2‚§`ì™’òB‹6þmCxÝ*6Óe-à)yOhF¼*.ªŠ(¨Mé’¢E fuî¦èõ®µ0—…OÌ7M[b¨÷L&¥ʳx3bà÷ÉJD¸ Ü Örpù`ö[ çœ0HùŽ -‡xˆ³Ôàî-}b†ÎÊùµ¶ç#75Æ8Vgk7x··êypƒÓÏ6‹È=C»´‹†*÷š¤‹c&ƒ¶¬ï«Â·(B~»X܃t)jâbaLâò¦ª²­ƒ{_SFg~=­—MÕÒLØÐÃcß&Z{g3e…îéé§9‹ͶÝ0! }J‡?¨¿©²D&$áøÊ$› -µ‰ë´SV­‡ÀÎ ƒÝ¨×©ÒX¿7êŒv½¢_&‚CkvÝf‡ÚÇ<5;š® òÀ|gáÀd&Ì·›ýÉä8xðr†Ç‘‹³w-†§xGl–Ùêß-„Q´Ò²ÑVõ8v”¯}Ù(sÀÑœÈ4(ÂûÐ 2PÍút©ö c€É#B69 Ë,Rƒ~ùè®3"yT`,nÁ:{"j4Œ³ª²¿ -A{ÒÜ<šøGŸHxФ¤Rî´ë&/ѸCÜKy|(1wôö2S&Õ–Æ&cÞaŒ7þÜÒ/'Hj-Œ)ªÜSæÝuÑŽ{lõ2kQl5&ùpÉ3 ÷LõHUÒ„¶£k仕Á Zà\æa/Ó©ÄÌ Ë—ä©`ñÈFTÅ]G—[PIk"࠲ѼƒUÙþ3Ks `RžLiÌ1‚Í%? )2 SÇ$ÜühAÖúLWÁÅÆ„ - ½;$ãnÁÀøç†{Ï‘EŸ>y §pvÜWî_ "ÒÁc²€(Å—l½©ŠsÏ•b2ÑÛ΃XÉ—b5ãѹ8Ï}& …8‚Á„OZ–spÑ©dzÊòDsXñ€GØŠqÊqkoaxµÛ’h›ÜfŒGûËx°_áàô;¬·¥Ò%LdvAFÓy±*×YEcƼs_ ºÄÌ-eyîÛ^yñ‡‰ËT䔘+`Íݸ) |ÎÊ*[ºb9ê›”ºCù¶wTTVõšÉ(Œy_ZÈ}Ň0J4”–Û+¬º¬²üÑ`Ú±45áÏ#'e§ÆWš •è ŸÖ$€7¡)ÚÃå7œ9pP’†Rô -óÅk¤ìµÅ£ð0~÷]Ân ºáv› ‰Á -ô‘0é0ÞÊ,è ãøcð„bé3>3êkPTŸËÿ+G~m…Zô²qÐâÈ‘ÅQÜæ9‡‚9Á°þ¥¾ËI•N*ƒ¯n:êd˶©vQß!Ÿ’%÷qÅS‡+óxpÒp:×{§gÀÏ:ïƒFà§Öƒ"Ý6Q›UÆ1š÷ÜÆ* ®°ìºÉºrYVeg"i_0p²È¶UiD†±Š†%2ŸgZ‡Išö¾Íçܘ1°Âڮļá»Dâ¾.¿R˜£ŒÑö¬óÒy_pCQº_À\Æû¢ ²ew­XëójZÉë Dfìpæ8ÎȾ3ËRÇ_¡à³M¹’`nRuäAaš8ÞnÀÈ«€2(m*h:庘uͬ¢W31ÞCFÃWõÍéç^šhƒ£ª0Kª¶?2wG’)ÚwcFn…ËÂñö¡Ø–óm6Ϙª8*'øè5Þ—Õ+÷œq–»ª8øt6»CO)2ŒTꌌ…÷uB¥åñ|\w£ †¦èËâcù.JûB€"N$/†'¿¤DèGÕH~¼ íÇhਠ³$T‰<Ê¡c’®\¦„ÝoÆ(@ÍEÆ="δ+òÁr[Ç‚•ë¬3O90ØA -äà}ŪŸÇX÷wÛ ­´¡—+­ôæ¨Ø²ÿ7± Ä[.ö±Ïžt;Š-ø¦ãä¨Ø²„‡š%jx]ý–Ø^t$c›,˜ìB0—±Ã ½-â})3ž&~K3£ú”>,nÎiؼœÓè뾟çÞ -üY÷[[®^ßaÛˆ ßGãQEÖ^ç/¸j»ã Û” -9gÇÝ*S =‹›Â?Ä“f'‡ÅAZ èÞG6bÉ›uæT"7“}]íé:q»Ymë¨-לmÍ;2=¬¹/Ž°`„Ü÷Ñk`ÁðYÏÿâñmA‚‘×LÊ 2 -îû¢gßq ÙW"L 9hÿÌ(Iðóe+ê…ß2‚X§‡?á‡?Éíó6}³2a·Žáë˜Â}³§oD¡€dÛnšÓ÷P qNN -ow}¥§&[ pé=¦ôÅÅ t’53Nœh0Ü'qÒ[´{é_ç§1·­pîÅa=—ï.no'ŠçR츶?'ó|G~Ó¼ô«µáË=iêCÜ/)½@ÙK!•’øÙÍÝçmϯþ<õª÷endstream +1579 0 obj << +/Length 3049 +/Filter /FlateDecode +>> +stream +xÚÝËrÛ8òî¯Ð!ºÊÂàE‚œ›'Q²ÞÊ8YG;5µ™(‘¶YKQ‘Šã|ýv£’’!³™©­Zûúý€Ä„ÿ˜Ä K2™ML¦YÌEáŠÉ62c€Ðc™’)¡Wv@’ŒG¥tÜéc~ÇQµ*ýW&£5õß"õlï7s@A·ë-uÚÝ¢-ßá%í÷ö\¤Q¹\Û¶hið¡êî©·kŠò7ÎeSî¼ùÛ¤X+ý‚Gçu5šÁžˆrJÃëÛDx)Ëâ˜ôg›7wNøT +mtªmh¤…‹5œ÷”Ó|Ÿf«åqVW-£ŸUã´íõKêHÅÓáLº­DpSo +‚&OzÑNœ`šýsÞvåÖ„ªv8ξteÓVëæÇó©žÅ¨of×3Ð é|ö×iÄÞ)O…9QŒs¥Ýêoêû6p‹X²”Ëç*GXÃ<½bØãB°2&dl¼¢Õyº‘ÌXššl¬f`b¸rêïÜ=n‚Û ‚ø úÿ—¨ÿ£¦ŠgLÁÕ\›c Û·O’™8Qc—q´k­lC¯CÓ “hI*™w%çÔ´å¶*Ý&«¨ÐÒÊv½³eIžÚ „~ŸwnsS?R¯¨nqÉ­•}ø¾µ;Ö+SæË{·Dß-Y¸­yCmŠ“wp8ÃîO=ÖÓ^7ŸC*p•‰ð,Xâa*I¢E‰­q4ä¶eÞVˆöïÊïäÖZ­Åá¶ìZê!õpê p’ßUÔÙ;Ç€IÞlÖÛÎAÜ-¨óƒÔãÍŸËmKtêÙþ(ëò.ïÀ²ôF®]n«Å #'Œ3B/Q™ê²u;¯®§—¯^Ý°Ë›÷HÌKÏàX¢ƒæØ‰í»›«7WÅ$`9ÃC²ÜK¶ï ö8ˆö÷‰©t¨¹þ@í‡ÙÍ/³›löëåÏïßΞJHCÝÔ¼¼¾üÙM¾`_jÈX`ú„í†%)mlEæ)(ðçú¤ÀYü‚UþHÔXo0PÌëÚ}[‚ö¤yý``}te0)™Öíj]ThÜ!ð%‚<ÜW˜<( z{O©)“jkk“1ñ°Æ¿‡Ì·ôËÆÙ’Ú(ëCʺpÇTEwO]´ã[½È[[ƒY>\ò\DÃ=33R•,¡íèÅniñ†¨8—Ø+ „*‰ðÂr$y~`d#êò¶#ˆ‹-¨¤3pPéhQÁªÝ‰@ÿ©/=˜L¦û4æXÁ–ZѱXħ$ÜGiAÞ†L‘W!Õ>Œ=*ìIèí1÷ Ƽ°Üûx,úô)9ƒ³“¾Œp÷ íPÜD¯­É¢”_òÕ¦./WJb&To;b¥Ÿ‹ÕTò uQ„L@Æ”:Á ¡t,—à¢3-Ì>Ë;Lb%—‘äتqÎÎ¥³·0¼ÜmI´mò3Ö€£ý2Ú€¯ðpúÎÛRí&r· §é¢\V«¼¦1kÞ‡¹¯%]bŒ–ò¢ð™m¯¼øa㲘{%–±ˆ°>nÜV>çU/|5ŽõmHJÝ¡~ Û‡;ÆTW šIÎÙ׊PõñÔˆAiÅ…»Â²ËkǦkS{ü9rä^ÝiªÍ±Xert š4C¡)ÚÃ{å7œ9rPš1­z…ù´GZ÷Ú ŠPxÉÒƯ¡À¢K¸£× T7¼Ón³!1X‚>#6¿Sô~€ úÊ8~ ƒP¬BÆg*@}Šrùßa…øk+$Ѫ—£G,N,]žs,˜S `ñÅr:ÎöJƒ¯YwÔÉíºÞuV}‡|Jï)yˆ“À(ÙWÔ}'€“Ó¥98=~6E4?|é¶ÚâQi£ù`Àm­²’1Ö]7yW-ªºêlÄ¡ÝN–ù¶®¬HÀ0–Ñ°F2à–fYïÛBÎM(†¹Ø€žÐvæ…ß'wMõ•ÂœØ=l«¦¨¼÷7ijà +æp°Þm«»ÛhÅYŸû¥¼ž@dÆŽgŽãŒì;³¼!uüó+"ÕŒ›TŸLÁʲØÄúÄ‹Â~âøaFÎZ”AíRAÛ©Vå´[Okz6ƒë=4–ø²oAŸi¢ ¬ªÂ,©tÚþÈÂI¦èP€¬Ü ¥çí}¹­:ïÛ\ž±¯਼Dô¯§n_Þ,ý{ÆyíêòèÛÙX쎽¥;âÌ ê „"±Ñ§_x$8%Ç…÷1Ê`hʾ.>–ï²rO(âDòrxJúX„þ¬É_ è²&qºgŸ†y–äÐ)I}+·ßŽQ€4š‹8ŒD\_äƒå®Ž+Wygßr`°ƒÈÃûŠU¿€¬÷w» ­r¡—¯­ôæ¤ØŠÿ;±âÏ’Z©4ÿ~ÇQ©Â*.ý¤ØªŒ¥Zëáuõ¤ö²#Û¸\Á&Jø„fèm‡ÜK™u¬0ð[š•§Lô~~sAÃöà‚F_õý4º¼ðàÏyßÆ1õúà ®ò}4dÝu¾ÁS»GÙr Áq|šm"f™Òî'NB”{‡Ø%‚ü¨Â,Åz•{M ÀÍ&_WªNÜ^/˶õúÓV+ÈͶö™Öü/N°`„Ü÷Ñk`Áð ¨ÿÅÛF†)^®³$#Qð?Åzò“,i ùJÄ‘©b`}ÓË*ð‹¬$fJ +WO/Ãv"¿ìø¯Eäñ_‹îu›~²²Çm'ÃcJÿ3˜u£ +å#ßvû}ÿ´å¤ïn×WzhrµŸÜcBŸ?Š=-À‚j¥Dè—n|ò‡jøÜßÕ ¿-Ô¶*£Â êùèo…MÓ'w÷¿À \þ?*±Ñ;endstream endobj -1562 0 obj << +1578 0 obj << /Type /Page -/Contents 1563 0 R -/Resources 1561 0 R +/Contents 1579 0 R +/Resources 1577 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1560 0 R +/Parent 1556 0 R >> endobj -1564 0 obj << -/D [1562 0 R /XYZ 56.6929 794.5015 null] +1580 0 obj << +/D [1578 0 R /XYZ 56.6929 794.5015 null] >> endobj 526 0 obj << -/D [1562 0 R /XYZ 56.6929 713.4234 null] +/D [1578 0 R /XYZ 56.6929 769.5949 null] >> endobj -1565 0 obj << -/D [1562 0 R /XYZ 56.6929 686.2623 null] +1581 0 obj << +/D [1578 0 R /XYZ 56.6929 751.488 null] >> endobj -1566 0 obj << -/D [1562 0 R /XYZ 56.6929 478.4096 null] +530 0 obj << +/D [1578 0 R /XYZ 56.6929 670.5492 null] >> endobj -1567 0 obj << -/D [1562 0 R /XYZ 56.6929 466.4545 null] +1582 0 obj << +/D [1578 0 R /XYZ 56.6929 643.3882 null] >> endobj -1561 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R /F41 935 0 R /F14 737 0 R >> +1583 0 obj << +/D [1578 0 R /XYZ 56.6929 435.5355 null] +>> endobj +1584 0 obj << +/D [1578 0 R /XYZ 56.6929 423.5803 null] +>> endobj +1577 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F53 1032 0 R /F41 940 0 R /F14 741 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1570 0 obj << -/Length 3287 +1587 0 obj << +/Length 3094 /Filter /FlateDecode >> stream -xÚÝZÝsÛ6÷_¡·“g*_ÁÇ4qz¾™‹[Ç÷r½>Ðls"‘ªHÙuÿúÛÅ(QrÒø!“Ñhˆo,¿],°Ë' ~|bòŒÉRMŠRe9ãùd¾:c“{¨ûùŒû6³Ðh–¶úéæìÇ÷²˜”Y©…žÜÜ%c™ŒÃ'7‹ß¦oÿùæ—›‹ëó™ÈÙTgç³\³éO—ÞQIIŸ·WÞ_þüŸë7ç…šÞ\^} âë‹÷×Þ^œÏÊÒ诒|ß7ØÉ÷üxsùöãùï7ÿ:»¸‰ HÉ™Dêÿ8ûíw6YÀZÿuÆ2Yš|ò–ñ²“Õ™Êe–+)CÉòìãÙ¯qÀ¤ÖucZ.M–QŒpMð çY™çbÀ¶¼Ì´Ò±Mg2+Îgœ16}³XÔ}Ý6Õ’ü¾^ZŸj7«ªïp½0ªLö‚MfBe¥âÊ wٜϤdÓÊE¹¾õßK‰®¯šEµ9çfºðUöÏ~‹cæÎM÷dò°‡X\úÎÛõºÝ5Ã1«ÛzY÷ÏÃݶò“´ú.¶«õ°Ý_mã‡ùcbiÝRqq‘°¸—#òi sn(I”v™Oo€Ç"Åo3¦´€áp”Mõ4ÂGÁ3^pß„F¥ꎾóí†ÓôËg*ª«zYÝâ&¹¬oYy2«d;w´zR/÷†¯ès[7Õæ9mï1ã@Ÿà… !™#‚Öô進º¹'À$‚÷ŽuÓÛMÄÖ¢ê+JuýæÜL·ó~Kãøúšrs\-ç|ú•;ÖcÅí3PnUm>'|Y½"šÚÇHƒ &–mµØ•Ö+›Å­.²R -ãVö¡"J|ÁÏzS¯cDɧÝ< ¢,6"aŠ@DiD ~ûqp2SŠ§ÁÁ2#K½‡7xG_ûçÚžóé¼· ?[Kß[OŽm즊ÕwÄŸ-ÈÓept1„P1Âp9 ·€˜¸D‘.Q”™Tyî©oª•]Ìæíj ÚÅMr¸^˜Dk¡|h»u‘¯ig„rDÃœ·¨KžCÖíK·þ{·×eñ DÔsÊ ˆ-ýº§"ÇTl¾í[àt=¯–€,/*c¬(‡r0Wj ËY}GévåÁ d¢\C:”uk;¯‘Å¡72Sjy„™pH ŽxYUHíÐl'°{ü4"Ì„>íµÉi§ی̤a¥¹Òé¶ -a«xa|+T¬~]¤—!öx2“Ž16l_ªÃk‰ê®wÛ—ìÄtS5Ý](oý×ÑMÖëåsjÕÐd»=c»=/訂Œ@ÁT˜©ðBÚ ï®QP˜ŽbéÆÚEGI€*ɦۅÛÚy…G”qI(óÓl:ŸYmCÊ ,Ë‘-€»!™…„RKIOÎN`==~ˆç±ÓëžÀ(ô -g‰à@8A‚Þ,z/€!sÛuÄ+ÈAeÝC»].(}ëÊ5i-È{m]¸RŠvŶ¾ž? †!é„õʼ0 ÷8¹õxBÞÆæÌÏšœq›sØŠ¥Ï»fc‚)Á bâ 9Ée>ä¤Gô}U7Û™0&39XÀø¾Yö°òûdÙ-;~cám5ÿ´]ûõÜíèqQÎáÂã¶kë΋‚(2Îs5f†¢ü ˜ö„ÚËúž„G?&þÃÛ‰«ŠŠ6Zœ‰Õë”ZuW`ïháoGŠeBKã/[Ê_µÒk%öïÀÊ8v½2™.Jº­y³ZswŸÕiP=ü;*]¶î… -ä+–t»Ñ]yÝІ‘Ö^X±&šÌ ëGë,pέÚu„ƒù®š‡J2ª´CúÆ—9Nj46{?ø*„Ê#§_eB¨3ô´»LAI¯9Æ”¯›ùr»mÝ4ÒjÞn8?{¢U–A]@êÉÆ‹Çál΀¯ç<40T@|Äï=²¸•­ï»í2\nGþZ¿¿[Rët«@+㺋àFåBø`?`ÂQ“ç&AøŽ;cSÅ À|ºo7õ_at€Á¾¸ÜµËeûÍ/0Èq2ºö^GÊÜL”Ì3Yrýy¯#<+˜>Žü­N(8¨O¾ÎP?Cùdè1jæ4S°ç -M¢øî28åE&%hYº‹ Éý; ¨«È²kûÇÖvô¾’rL«JÎËI:Ã×ч|j©àÎ`ÌjÂOQN›íêÖÁ´ ŽeõnI{÷á#U6ýú\jŽa±™tlzõËÛ«wøTi®_‘É -=™íؾLJ'e!ò0ÉDVp%F0ùëÖnj{’é¯ÉÓDGH¦D;HÊBFHbÚðÝAsø¹Œ;¾0á`7€#aýÚ?%÷Ïk{Š¯Ç…oŠ°Fç_²¢Ðãs–•Ì¼EY˜L±œž‘¯¶ý}ûùPL&ø:’(ž$:@q@´ƒ¢b2€ƒn– GCÁ»ôcwmx>˜WΕ?ðÚìè/&i\Éû#qBjâ {Wm—ýÈÉãöÕd¥R:Øa\©^`f?¬Qà O-Õ¡g‘R©óQzG#6uŽF™8w•!jaàE U‰éUãkê.Œï§]ÖˊʸA‘äò ‘{ºãž§´ñNPïÑÑ£MéA´¶rA%Øk<¨$×YÁcxÎn!³]PÞN]po¹ *i°åýv]¾Æ€!„uî}:è¼÷žG èèëc+ÛÞº ôç;>c„wÈcü(ó7kŒO2WhÄP4 xþP5]R¥â2ü lŒ•‡,ðÃŒ +hÍ¢:éc}Àˆ¡Mwd ö -°‚v =àžIb;¡š‘µÇâÀužIá;Õlî'”¸ zßµ>~ ø6îÐ&?kxp&íÓ‡†PºL98ˆb›“óïät ³†,4*Æ­ÌÈbLúW‡Çïx‡ŠÐqÄæ g­' -‰7Å¡aâãèIÿ?äßGendstream +xÚÝZKsã6¾ûWè¶rÕˆÁ‹ ytfÝh€eZžÉèšR©Øx5¯1øñQGLfj”d*ŠGóõ=@ÙOÜÕ™øJ“°ÖÓ‹ÞËd”E™z4]¼Òˆ¥)M¿ßþûê×éõÝåDÄl¬£ËI¬ÙøÇ›ï('£ÏÛÛïo~úïÝÕe¢ÆÓ›Û”}wýþúîúÃÛëËI–¥Ú«€ƒk{?ÅF®åýôæíýåÓŸ/®§ÝÂAr&QúO¿ÿÁF ëÏ,’Yž Á"žeb´¾P±Œb%¥Ï)/î/~륶éÒb™Fq*’­ 9¤µ8‹´„"ÔÚAA)}µiˆªê–ˆf·ÙÔ[—hW†ˆzÓu•—”šN!"¯NÓ¿\ÝßùÆ„)M„ú©øˆó(‹cb±ÑDÆç,±éHFÉå„3ÆÆW‹Evò¾(]çïëí:oÇ/%°*ÊW–ÝMu9‘Är¬(ÕÖA¢iAî|{ÉÓñ™Ïí;ÆÄÒv÷±Çfg®1é§9â™ÏŠ²h÷ým&wÔ[ú.vëM¿ÞŸuåØ òJc‡Šƒ#Íä ŽˆÇ5ô¹%’$m¼2OA«"Ån#¦´vÈe›? èQðˆ'ÜU!®ÔCÑÐw¾ÛÒ`ª¶ÜSVþ˜e>ÃI²IW3wbæÁtdu¢Þ±Ïé3+ª|»ë[EL8È'x"¼B Å +´¡O’Õ&pÿrø.ªÖl;l-ò6wpo·—éx7owÄÇ•”šãh9çã7=PÁlO”ZçÛ  —W¬I¦ú±¨³£²Î‡Übm¢nª“(“"µ#{P™@½àg³-ÖV1"ããÆlA +ðKQÖU"!E "Qƒßv‰Œ”âÉip°(•™>B‡eÞÐ×|Þ˜K>ž·fáz«é;sR<˜Êló®xIúYÓ€œü †p.O¤\ö ÃÎ ¦¢‡(²Hª8vÒWùÚ,&óz½ïb;y>^èDk¡\ ¨»w‘®if„²BCŸ™×èKö>içÆÒµû.š,ö D1§Š€ØÓ/ZʲJÅ껶Mó¼d9;PcIÖ·ƒ@¹R+PXÌŠ%Ñ-ÌÊÊ$:»Úç53/¬Çv­Q™RË” ‹®9/뼫¢š öx)‘`©oC+ ɩç•©zÒ0ÒXépÚXK˜*ž¤®:V7.òË@ø9†u'…e5 ë)¦¯×á¼D¾líôÅÞ'[3ÝæU³ôùµûZ¹©ÑfSî;£[õUvð3¦92qZùn`†#P0å{cê`¼@[ã=TòîéÎ ®ŒY4DTɆ®vjç9jQÆ%¡Ìu³m\b½ó”5X£Z;fK6 9¥šH'ÎÁ`<ŽÅ¾¿z‘ž_À‰þJãÌÐ<3N° «Òº÷27MCº‚d_”׬ê]¹ úÇkòZvÞ:±#$ŠfÅ®)L}1_õØuÂxeœ¤}ïÔv8™9<¡n½bcæz ÖˆnšcæÕŠ¹ûCµ!Ô1ñ•šä2îkÒ!ú!/*‚íD¤i”Æ‘÷V¨«²…‘?¬Pñü…ÅE‹(Í$-ðß'#à¹kLsàn‰Ê´Oõö#%fûÖe×ÉÙ ’v–x¬‹…ãAÑÞ|U´¦[ê' ³1Õ¬ŸêPP`k—ÅC5¡ñ§Ü ©úh^ÛFB‰qSÓ·]å.§ð_4I%m`„éõ΂(Œ)p”/ßÔMSÌdJ±ñ1@aƒ EK®[o•[o•[oá Ês%EÕ ãe4$Rðpâƒßr«ëQ¸ÙìÁ·¯Á²´ÖXë´§jQü +Ù ŒÝ2`^NY.¤… ïÐ0×Æ°Øp0à[¢¬è5Äh¦ž!˜Úø:YçMO–ƒ¾1s–Ï?î6n<˃<6£³sØ€Ù)ÀÒ¢q¦ غÄj( EûA0µ³õ# ï|üù÷w'¶¨s´]ÄD½Ö©›-ñŽö›-Å"¡eê6[ÊmµÂm.¶o Êxi{•F:ÉzÛGÍíþZ¤ÁM´ðo(·¬í: +¨WÌiÜm~QÑ„‘ÖÎX±¤ ™Æqk hÎŽÚ6„…y™Ï}!UÚ"}ëò¬&5›­c>Çe€2¡ð…U ‚¯,ÔzÚn¦ $ ·9ýŠ”.ªy¹[øºv¨5¯w¬Ÿ-É*3ï.€z2ÝÆãyo6€¯Óœµb¶‹TëÒZFCþ÷?.’ô ýƇ!…yºÌÄø„œm¾_‡,`!UékFÀ’ˆIw3󶈸CðgšÏv ƒötu.Ï|RúÎBé9¶ñ7ߘÊg`DNZê0\©Û£à¦š¼ŒÈ³©à;$,£¤ÀÔób¢áƒ~a2ä¸ÿfdq>…ÿc€¯’(_µyõ-^>靈WN„W™{º¦s>ï~tGw9qôñmBpRìö¡Ø`'`Cž€¥7T˜ÚÈ+QäŒ9x5»©›Aÿ]´Å#V‹éæXÅx¯÷c.]–b‰=¨³EàÀ?ƒÚPKÐØŸ4mÝÐÉ”îñK¦ÄœæI¼™å l9' aP>l²_jHg›Àï7 âàbeš¾²€à{Ld.–¨ç;’½ùáö‹×‘°«s…B§Å÷Õ?\G²0RYÒ­#PÐ]ûa>a¹´Ï@iñ2ÿÏ6ö>ÎIxsÁ¢X'<|4øìñ dÌ*û\‘DJÀìœ|<ÈhKhš¯+¼ÞL΋:æ®y÷›EÈé6‹H‡ÇüÌÝdÂw^—¥¿»dþ +9¯ê§ŠÈçáßEwã„¿}gîfØ6 º]実®4ßµ«z‹¯óüã ïOðª/QþvŘ4§®Ê´Ž´öÏUèþ¯°Úî’®;ÓÐ*âèðÂeo†¸ú+wªƒWSà–a%jŒëàè&å`CXšž´ñN»øt¥hW” **ŽÞ»ø Â:vzŠ«‹{ÀÁ7KžÉ¾áÝ8ÞMíÏ æyã—v—5Gݦ$|y»ñ¶{±ô/i: ³Ìwe;°ðØyÍ"–ÅÝÙ¬ç+u  L¿fÔÐÃSMex¡HTxç(Ýý"Vµ÷‹2¸_<úÇ +½«OŒN•ßV®¤h<×µo²)sÊãî剤›N÷¬jèí1`HIɇž +³‘‡ù7?L><ÕƹÙÍ{÷â¥ÂyH³çÎØ=aþ/qÎ=wendstream endobj -1569 0 obj << +1586 0 obj << /Type /Page -/Contents 1570 0 R -/Resources 1568 0 R +/Contents 1587 0 R +/Resources 1585 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1560 0 R -/Annots [ 1575 0 R ] ->> endobj -1575 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [84.0431 62.1828 145.2431 73.5749] -/Subtype /Link -/A << /S /GoTo /D (statschannels) >> +/Parent 1556 0 R >> endobj -1571 0 obj << -/D [1569 0 R /XYZ 85.0394 794.5015 null] +1588 0 obj << +/D [1586 0 R /XYZ 85.0394 794.5015 null] >> endobj -530 0 obj << -/D [1569 0 R /XYZ 85.0394 769.5949 null] +534 0 obj << +/D [1586 0 R /XYZ 85.0394 741.6375 null] >> endobj -1387 0 obj << -/D [1569 0 R /XYZ 85.0394 752.4085 null] +1402 0 obj << +/D [1586 0 R /XYZ 85.0394 717.2979 null] >> endobj -534 0 obj << -/D [1569 0 R /XYZ 85.0394 542.1781 null] +538 0 obj << +/D [1586 0 R /XYZ 85.0394 507.0674 null] >> endobj -1572 0 obj << -/D [1569 0 R /XYZ 85.0394 510.0725 null] +1589 0 obj << +/D [1586 0 R /XYZ 85.0394 474.9618 null] >> endobj -1573 0 obj << -/D [1569 0 R /XYZ 85.0394 447.7453 null] +1590 0 obj << +/D [1586 0 R /XYZ 85.0394 412.6347 null] >> endobj -1574 0 obj << -/D [1569 0 R /XYZ 85.0394 435.7902 null] +1591 0 obj << +/D [1586 0 R /XYZ 85.0394 400.6795 null] >> endobj -1568 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R >> +1585 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R /F48 955 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1578 0 obj << -/Length 2644 +1594 0 obj << +/Length 2603 /Filter /FlateDecode >> stream -xÚÍZKsÛH¾ûWèHU¢Þ~ðÕ³§Ä±3ÎÁIdewj's $Úâ,EjDJŽ÷×/Ðè¦(Y -åÇT©\e5A4ø€úAÑãð'zAÈB-u/Ò> ¸z“ùïÝÁ»gÂò Ó Íõ~töKõ4Ó¡ {£Û–¬˜ñ8½Ñôw/d>ëƒºþ ûpïfÔ|ïþ]ÝŒ®Îoú­céÿúîËèbH\a«#Ql÷óÏ×—W¿ ­€Ï×D^\^ /®Ï/úŒ>]ŒÚF -®Pû¿Î~ÿƒ÷¦`ë§3ΔŽƒÞ=ÔÍB%UƒŒÜι7š¥·:©³ªÎ&=_fyŠÆ‚HÕÉ{é3í ßkº×éšZ·åržØvµ#tºš/¨5Nï²ÂRï³zF­„~ò¬HߺæÓ_¬b[1­dlôxóæÍ~3>4#6,ßyÀu¤ ”´¯áAì7“ÄG3¼b5§KjgþÆÞ"YöEì¥E=K«´²/íoB?D1%¾)õúVd?Uý[Éu6Ok¾Ã•Þ%Å*Y>³x‹V;ÓA BGœ!Cè]–y^ÞgÅ€âƒÿfÆgJð©…6àoB,Uj9Ê[úÝò.0dø¾ª¹,оôîgÙd¶-o’Ôé]¹Ìþ‡–aÇľ˜¦Õd™ Ç—딑q HÙ²ˆr€ƒýMAEì×ÉÜM’t¹F÷ï‹4àîŒ#cÅ@Š¨¥·=ðg¢*zeà…_T¸B¥òÒ¦#ðÖIVãà¹63PDÛÞ0BWEm”…—ë$_Y¾[ãxƒ1pˆš¹Ñq"¯’œÈ!‹Á¾XBõÑ9!‚²C–‚hlâ0K¢%ë$Ë“qnY¬Z•ízéØÆëë¬~è !<4< ; µQ -ì³d-!‚³0´‰[’L´¢¬‰ZÍÊû‚hYᤧû ÝMbß9—9Ä¥c}”'d¼Õ^ÚćoRšº@£EZMÝ";÷t?KÚ[MbfeSÈ=ÙfxK"×N™­>0?‹-™1MQ{¬G•þÙdvj¤? Oå?ŸBÈw)£®Ä¼á9”™E¯ÑÈŒ &šræŠÙîç.xŽ«cJIœ€ËŒH©1v+jW+Loós—¥´­ÚñjúšxE:-4¦‰°0î-×à<œ AÐ\@šíÈEL÷DƸFbí”%ÕÞîË‹Ä# ×¥·õ¼¬P êå«yAoLøîXäÛfB†K§D¯æã2'æÂäBlm„p6ÅeX9E¾keÙIHeGjbßÐL4*Næ3QSÁ¡jƒ3Rýd’V•ÉmðÌ Fb_ÿ:}!Ê–$x3™%E‘昔TìV5Ú[fw3‹žá2ÁaÄÇ»lZM( ­+cRV3*’¶Û&Í!t&ñEMÝ„—¦nw’W%Q\ò—Ŏ¨-Óà™Ò1á¯j3DØêšYÞi9YÍ!™XeUeãü^ÚŠ -ªqÙvóršá€ë(Jاµ)HئH¦É8Ë!åãdðC¡½wÓi†M:NÈØfúAsž>gÓû)H¶t:îZCðˆ åÓâÛbšÔ)Ek(à ”n|?<É<›Ø…¯‘ñB€[ªŸ.ÀB hÕ±Ã:`¬² ñ¸’ònÞÕ1Ù€:Y«´¨Cg•:ñ® -&bŤôÄ‘Ù•-WÞC—£¾Æˆ‹=×£‚Ot£ì #F,Œe¤‘`2Ô~)îJù“Cð§‡`¶ôH€˜=%ŽqžDVv§v2J¢mÎJ¤F¤äx~ýv£AŠ²eQ±=[ªT…`£Ñh¼n<4h‰‡¢i¦­´=cCqõ&óÞ»¾'Âë j¥A[ëýèäçÊô,³ZêÞèºe+f<ŽEo4ý-Ð,d}°Àƒ÷—l #\ú& Þᣋ«ÑÅéU`m,ƒÓŸß} IK·’Ä?ýåòüâãס7ðË%‰‡gçgóËÓ³þï£O'g£fíE +®Ðû?O~û÷¦°ÖO'œ)G½;xáLX+{ó“0R, +•ª%³“«“/ÁV¯º4Á™TZî@Mª]¨E–i]ˆÚt5_¤SX–ŽƒªÀ§ ªÛ”ß8—3ß.é$CiÛ`|ïG6À“‰Ödf3BGà"NSVI••U6)Þ( Ùòݲژ9jÞ¬–0²Èi®bmˆ–ÒQ0"7mP€ KRÈJz.û"ÒyQ¥³{RJ&“´,³1MÝH¡™Š4à'³Q$ݬë,õXî![~“xr›äy:£Î»Û4'ñ„³œÛÇx3åâˆ#MkL:OóŠæqËC·¶‚9uPèÐÑGðAoOPøÆ#^¦é“¬À),¦õ-ozÔîÜ°-ý=©WkáÚ®Ò‰wÍmA ùÿÐ!‚á–;6@£ÕáÅckè$ÄŽè %7Qo ¢Å2°SûÁ9÷)ˆ<ÓÎx?Ïv¦8‡¼ ™ EèŒ5ëô{E­ëb9O|»|`÷*µÆéM–{é]VÝR+¡Ç,ËÓ·uó¿éO;Ö~ì‚%½)úšgßeu?ó–«lž‚Ö| WRó4)WdØH¼É2…­1­_²|â-|JòU²¼'eñÖ‘ß&a Gîá:8/f³â.Ëo”âwëb¦¬ŸZn¯Â3!•2õÅ5=·¢ +Y±ïƒënÃbC¤˜lr»moŒpS,³¿ÜÞ‡‰ï˜¦åd™çë”Ñâΰ²µ"Êæ²½_-©bŸT¤~™ÌëM’.׎¨wdhïÉ#JS· + nÓò[h¤ºL•Ôåà…':\¢ÇRi3t«$Ë)pðN|)Ìv4œÑU^9g¡sÌV^ïÚÞa Zî iVÏŽy•Ìè…²ìÊ¥æCXÜ9ÖR0MœfI²dd³d<ó*Þ­Ò=¯ÕÆ”ë묺ï !\¸:õY +ê·É:%YB‚z…Ú"îÈ2Éò¢"iy[Üå$sG6õøp¡IŒÎ Ö¨¶âK3\- ^+\¯Ï?2š:ìWd˜áM´Î¦yÉ»c4l¢²}¿>ûpy…µw{ Ò:dOBÚröµëo€4”Lh!; #f€Ók¤Þ'SÄå_î. ä³Ñ]ååj±(–¶7µàà-›oBÞZÌC®8“¼‹s <1V6GÄèêâãóav£È‹¯‹£xMEÌ`Ig­”‚ÅÊD5>€Ä ØF? Z¾qfrͤL¢Ü²8–ªE/JÎ,_'³lºùH²ÉÖú“Lö ôev“'•ÿŒ¼ûÖªŽ{aC¦BíÇ^XÃ,ÜXZ8ýŒ5q0ìGQ€¯qpc–?’ÌmW—D,™Š£ŽbAij†ª¦w«êöËò~˜þ÷’8Œ‚á׊;U,3¼®ÓM玮œfët“¼X¢eéj/î­q"ÎBÅ;* +aBÆ…®+ŠI{ ¸RUkPŸhËÕ#4Šá>ÝE Z‚‚ê…_¯—LAy6üúëù°ÍÿyýÇÎe’—×õg§H¢Û×GÌ¡fhv`9®©„øº˜&UJ¹ª¥xAÒ ï‡û<™g_õ:/Ä·åúç® +Y¤ÃŽŠB(hD¢®(ðC!~p*PÁÕ»¼<„ h‡°Lójt-§Ž:)™æ¶kßK æ´hP¹;Ùr•ãß¡HÌQßbÊÅA=¢•ƒ?‚iËÛ#Þï‚3…]5™ 7â”ÿpîý„ÐfËÍãMP3zû±ä’É8Š7ùyà]á ,7wƒý¶œ;^cÍLW2Z°¯¸nP9ôþú~/°ûqܸøRq=¡ÄŸC2%Ä®Šñ^'ćþ.só÷Ð@ÍËÝ¿8“Š”XÉžŠXè?ðZþŒúœ^«åúÿ¹xOâendstream endobj -1577 0 obj << +1593 0 obj << /Type /Page -/Contents 1578 0 R -/Resources 1576 0 R +/Contents 1594 0 R +/Resources 1592 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1560 0 R ->> endobj -1579 0 obj << -/D [1577 0 R /XYZ 56.6929 794.5015 null] +/Parent 1556 0 R +/Annots [ 1596 0 R ] >> endobj -538 0 obj << -/D [1577 0 R /XYZ 56.6929 769.5949 null] +1596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.6967 732.5838 116.8967 743.9759] +/Subtype /Link +/A << /S /GoTo /D (statschannels) >> >> endobj -1269 0 obj << -/D [1577 0 R /XYZ 56.6929 752.4444 null] +1595 0 obj << +/D [1593 0 R /XYZ 56.6929 794.5015 null] >> endobj 542 0 obj << -/D [1577 0 R /XYZ 56.6929 549.5629 null] +/D [1593 0 R /XYZ 56.6929 718.3947 null] >> endobj -1580 0 obj << -/D [1577 0 R /XYZ 56.6929 524.9842 null] +1286 0 obj << +/D [1593 0 R /XYZ 56.6929 695.4159 null] >> endobj 546 0 obj << -/D [1577 0 R /XYZ 56.6929 417.5407 null] +/D [1593 0 R /XYZ 56.6929 492.5344 null] >> endobj -1581 0 obj << -/D [1577 0 R /XYZ 56.6929 395.2295 null] +1597 0 obj << +/D [1593 0 R /XYZ 56.6929 467.9557 null] >> endobj -1582 0 obj << -/D [1577 0 R /XYZ 56.6929 395.2295 null] +550 0 obj << +/D [1593 0 R /XYZ 56.6929 360.5123 null] >> endobj -1583 0 obj << -/D [1577 0 R /XYZ 56.6929 383.2743 null] +1598 0 obj << +/D [1593 0 R /XYZ 56.6929 338.2011 null] >> endobj -1576 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +1599 0 obj << +/D [1593 0 R /XYZ 56.6929 338.2011 null] +>> endobj +1600 0 obj << +/D [1593 0 R /XYZ 56.6929 326.2459 null] +>> endobj +1592 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1586 0 obj << -/Length 2860 +1603 0 obj << +/Length 2927 /Filter /FlateDecode >> stream -xÚÍ[[SÛH~çWøÑTŽ}¿ì[`ÖS3f+µ3ó l4k[F’C˜_¿§/’Û¶Œ0xS.Ôêë鯿sk ÒÃðGzZ Ì ï)ÑÀDôƳÜû -m?ÐgPwĽ>Üœüã‚©žAFRÙ»¹‹æÒkMz7“ßûÿõþÓÍùèt@îKt:÷? /Ï|ñW—ß~½?U¼3¼ºôÕ£ó‹óÑùåÇóÓ1šÂxÍÆ^ßØAaäõÍðãõéŸ7?Ÿœß4ˆ7I0³Ò?œüþ'îM`¯?Ÿ`ÄŒ½GxÁˆC{³.œ±ºfzr}ò¹™0juCÛ@ã\VTõ#NÈîUý -V Eʱr®/:0`…CàaƒW‡@It0’ô”0H2ÊÜ!|.žFé]ZÉÔbCX4„h’>Øw^¦E––§Æy¿8%ºŸ–Ëi•N|M6[¤®&™—iaÏÁ’aý›û,L3΋0Ó"ŸOJ+¬6 !¨[¶ÊýqV÷i1ÞUˆk)‚ˆÅîÍ0‰¨`2tçËy2¹™ó;ÿ\xQ¾eù²ô5ßÒ¢Ìòy¹Þ/b)Ú¤”` ÎD/>·/ç a S˜@°×}¦¬Gì` ÖˆÒ.ÂÀŠSæò{Q”iµ_(U|±5–/öyyu>]ÖºÊzäcVÝûÒ<÷ÏIR%¨*žWÄlóÊUZ&¹g+“yÄìL^úùÎm s%È&“ìÌ–!ö¹Î$[L²U'ö€5ƒ£â{“øjª­Žñm´X1­FõåSÖ#Ú™&MTý<Õ¤1H Ékª]ƒ«ñï‹S!úËþõE’íc¯,|üƒÇ?ë&`˜±ÞbøËnœãM¼ •M Éá€Ö1ÂUÐZ!ƒIã.®F¿‚Z@¤|ÏA{…o˜ûX#‘«7¥ü`¾UJðÕ˜³X•@†KÒ˜Ê/gW¿¾BÐB®ð¾›%lÓÍ’àf¡¥žù×àR¡´eúì(0}m®µÝJÄ°–œä³VÝN5ùa.5>„cu©’B$Ìt—¡"O¡VAØxé`±§EYtñ8ù¼'Uï³ñ} @²,=_˜;cW(ÓÂ:!_™ûç"-îòbs­d.žÑŽzÌôs×sâ&ãØOÕ`Lç“PçV­+} ˆ7A¥kÖB¿mÖú™_ÉÚ"ÞÇ&mû˜ÿ8ÚF”8”† ^)±Ï”õˆvÚ‚ÓEJv™7À˜(Üx³åbš“Ê5e¢?‚Š}X ¾´f­-:ÎØBÍT[Nª*-¼S±}rÿ\q5Œ¹]V¾0ÉÊAkÆyÁìT¢ˆdîŸé÷¬¬²ùWÿö°´½úOþÍÇž¶ä„³…2™…ÒðS˜h2 Ô-ßµ­¼È‹êǸ›ýɱ¦?[¨wnËvçöÍ`+V;mr²´–@°pýAƒuµ›NÊ|îÒï‹)Äg>ìfuº,èN? i®¤¦ÖÌi;.‹Ÿz µM«A3n ‹eË¥ Aš’Úϒ.1;2ÔÔIx¾¨¼æs0]`ËÔ_£ƒ=†ÚIZŽ‹lQ'ÖT"%¬^­E .²¢0,¹Í—Õ¦¹`ŒCFrpÈD¤d.mðÅמ/Œ¢¼¦ÿ °­¼Ûó>‹x,'ÂH5㶯ë^-‚¬ã­Ù¬ %¢àÈ -¯`+èÛ§í@g`!7õe—‰âA¸ðãò†ØľÍfoº~07ÀC\㎌C¤kL{²,Òn7pGg ©u ¤ìß¹áþ¸m| d@¿íøF¸øw\ÆOòÚ¶Üí”nÐô܈Ñ8cîˆ9þu*Ø–l»ïÇl Pa …î_æUúOØ–²òfe{TØ&¤ï#£zÅü[6©M€§O¾µñš·Éø¿‰Ï…|Ó8Ÿ-’*»Í¦­XV=ùlÜÛh——ûìlóÆЦcõ.mª„)l¦˜%Ói˜!ñY^{0ûær­´5úýZÔ.B©zÓ¥+—.‡RR¶ù °@½šHï—Õ½KXÿj9Vž(ÖuÐ×îˆA’*± -OvÎ"uRr3ýKl¨/Dÿ1_N×<¦eî+ï$_—Í«PWyó&Dll`P žm‰ý»«7°yŒv%†ëYmiÅ"ÜHe‹ó¼ò…ÛÔ?] ϙÜAòA²áÆ:M«BåÜw[ɸõ8«lœî¶w±-9”½;ô…0“ ê/>wÛ;05ˆâïI¾Ü£ôá,Ÿ§/ {ÁÌ•Í]äßvÿ©Hæå'?¼Z¦• év¢Iz¬·¾ŒÃî;R&`CBJ‡Ïo‹ äm€ÒÅã ’ß;¾èuè Á ÖfðY‹â9ÉK×qwÇlø‚ _ñ\¼ÈÕO]{ Éy´XR°(ÂÈ,)x .iàø²ŸwΞ ãËƹel„b¨€ùžÅ3’õh5œ0¤0ïø­–…¨!$Âóeö²Ì=,d$ÛÑò¤¸éˆ¯Áé"Æ„‰ùøZ2–/$_$ر‚Ga³ÊðgM CLc÷!™|*Ò"}x ‚ÞPþ•Žw.GpómHˆžkß”•Yc V)Îî3ˆ÷w¨3X}ÔùIŒ±6pí‹¢W ªÅ DZN)89ؘýU$º=غE€ˆiêzÛoƒôŽ8¢þXŠB¶/¤ÖîÔì‡WàOcÜÿOfý -éF•Î“ù8T\W•·†CýXç gBÀ·q¡`¬¦êEe1®a›Šíaû¨Z|@5j6åï¼]i3k÷ë i°?$iðHÚ«ÒõÓì6‡œÒeÚ?ó×]UøikíÎNHIàD¼ÈÛ·1¬õÿ êG¤i§Û - dÆP°X@JŸÝ=]-«o¼Å¤Ž”àuþ9üÙ Ëlr\[”2Wh7|‘\‡…>E‘DwÁ§®ù|ò%ðÉWÁÉuÌìs—RvÁ')¸F#ø†ó7‘/üâ‘fßZ‚Š‘xÇŒ"‡€SÞ…¢ÀPÐë ¾…‚/ÑK'ŽD& jßõëû -D¦‘G¡Ø~q¶âBxÿCñN }põ ‘„Ç $…4|RýÁª‚w½z¿¯;!¾ð×a#ÑŽAèÁ´èôÉ„#£¨ˆÜG_… íØ ¢1ˆÃä]øaHÀ3û+õ/£Qú°혭û¸ç48’ëˆÑÓÊ~ZÝå“ ‹Ò5ðöaßÞàEb1xJ Aq—+V‘£_A¼á¾ØERq0-ä´¢ËK…ˆÿ 1|ñö/ë÷#E¥»ËAÄþûOË÷¸×ÉÊ—þ#Ôê_à cµ´˜Ð\=@|aç²pi³}O£‘дé‰þ?¥w¤‹endstream +xÚÍ[[SãF~çWøQTŽ}¿ìÛd€,©&†l¥6Ƀ°ÅŒ²¶å‘dö×ïé›Ü¶eOŠâ¡[­¾œþÎýȆ?2Ðafø@Ž&b0žàÁGx÷à s†qÒ0õýíÉ?.˜d$•ƒÛûd/°Ödp;ù={ÿ¯wnÏG§C*p&ÑéPHœ}yuæGŒoÞ__]\þðëèÝ©âÙíåõ•_œÎ¯ÞŸŸÑÖód‡°öæÖ. ++on/ßßœþyûãÉùmwô’3Kýç“ßÿă ÜõÇŒ˜Ñbðcè`vÂC‚3G¦'7'¿t&oÝÒ>Ð8×€U€GŒ’=Çú#0º\!M±Ú8uh0à +ûQ˜¦1í¸@I IJ$eŽ ¿ÔO7Ëñ¸h‹ ¬`É +¢ P +ø`?wYÔeÑœ™1Y}JtV4Ëi[LN‡㬜û7¹o¿íýr†çÍcQ[f§”ÐÙí§²ñ+g¼´çÃACB‚ºÛO…e%Ë>ÃÑO¾ûø©²]hh—5¬vïrß\]ŸF×#ÿ]Tó&löX¶ŸÂü¶ïÔi‘7--TVÍ ß ÔC_f£òƒþ¶7®êÕ9“0ØV¡…[xpSvP Ê@ à6;¹0ìf*½þŒ«å¼µ$YQ¯î}»ðT<”Õ²ñ#EݔռYŸ—èÚT +Á"œ‰A*N¯“Oζìp~þ–qÅ‘l($öЄÈ(ñï–í§wó—H¼Ej]â툕xÛæ°_U—mÞ–EJ¤}'¾+Ú_‡Å·ƒW„T½_i ÒBòˆïU•„‡&d7Wù1ážW¯Ã=½Ô±€§ ™½dk˸bðŠ"&ÌÁ–Z!ƒIgÊGÅ}Q×ùô%¶œó ¨íˆ³åÝ›°©Y3ã°háÕ¦ì3è•gÓ“¨×RëÝ—aÀ@Ád˜øí-aÊ×±w%1L ¸ëK¶Œ+vH €Â¿ûFY›NS¿ÔuS´/QMª6UFœjB»ò¼«iÎó†•ÁõBo^ùv’·9ê/WÄlË•´’äÚ^Iäasï¼&p˜+A6%Éîl%Ķë’dG@’ìÐБ=$¼fÀê5÷üÕ¢¶bãëÄâ: +Á>Ó‡œÕˆPÑ9…ˆõÁjüûâTˆìÝåO€„Æà.òrz4×`íáù_þ´çäÇõ¾äx@Š„†Tj?ÐD"¢pç.®G?ƒZ@¤|ÏA{Ž…oØ{¬ ÉÇõ­üh¾Uh¤b쬘#J‚6[SùÛÙõÏï.!%Wx~‰›%lÓÍ’àfáMÜùÇàR¡·WgúväJ=†P"†µììचåpê6á”rªÉßæRS&¼U— +Ð"ÕC'4€¹^a㥃År‹²ltñ8ùå…¢’\'ù²ñòÂ|>l;MQ?¸tÔV¾]õ}UÏRY‹„ôˆ‹=f²ÊÍœ¸Í8ö›ÁðÓù$Œ¹Sã ñF ¨b>oçmK­ßù+¥¶Nï±)¶Œùß'¶‰HË? ƒ”/Ù2®è[n`gv  +$8Gœ¥öl¹˜–ã¼µ¬¦Ld#x‰ÔBBÕ•f ë+7Љ’jûyÛ³…w*vNåÛ•¬†5wËÖw&e3\—šXû!˜¯=IFß_ʦ-çý“­’ìÉ?ùØÓöq¶Óä³Ð»ü6šL‚è6ßõÉ뢪Ûï€8Æ»š5Ù噃Ô6 ¯Û§EáßæV‘ìÛñ4oš06õÇä“'ÿî®pdÛ®ØjØw¾­Ð8iºú“êÓ8åñum¿ŽÅ—RªÀÈIÇÿ%uTÝÌNÉìÞ <>6aÎø:ŸŽªz‰X¿NMVšDKþ¢l\ѯyÌ(XŠl\s@žu‘ñY]- É•-x[ë` +;ôÀôÛé\‡Š†:»€>èÔšúØ5y¯‹(¾XióÇ1šÍ—³;· #Žqvl¥oö)q:~Ih„÷žFè‰ÜTk¯Ž‚ʨGr=²ƒNl'èÑÚØc¸‘j–wMgÏÛéSßÕ¼’;ØA— ¼2 @(¶>Û‰7·}{sÛ&;ØÕMûN[†Ê³/ÐU];ÆW´,ž‹)Äg>ì^UªéN? i®¤&jæ´„7ÃEÈO½…ê©(wëÖà·XöeÒ”D_<Ë¿ Ÿ{ ÄìÈP“ðjÑzÍç`ºþÀ7…5¾F{ £“¢×å"&ÖT"%¬^­E .²¢°,¿«–í¦¹` üš:8d"†Q—6ø—õÇ¯1Ýüaº`[y·÷Ý‹xJ’]Á°Ñk$mŠ³zY3Æ[»YBJDÁƒ [€¶¼‚t2@ß涅ÜÔ—]&ŠáÂß—7+_o³¿¡À)pWûÝãŽ)íL[YÖÅa7p ¬³†TŠƒ0)³{·Ü³ÛÆBÆøæmÇ°ÂÅðrG1–`¤$¶å~'uÃnæz¤E3æXÌÁ𯋂}³ûÞÏcAìˆÂP ]UmñO¸–²ô–½f6 LHæ#£xbõPN¢³³ ðôÉ¿í¼æ]>þïcîs!ÿj\Íy[Þ•ÓÞ´lŸ|6îm´ËË}v¶Y1´éX¼¥M•0…ËÔ³|: ;ä¾™UуÙ'—k½1àÇ:º¥â¥ÿÔ,]½¼éó¶:#I$ûÌ%¬õ°‚'Šu úú}1HR%VáÉÎÝ @$ NJn¦¹ õ…È«åÔy=ÀcÚT~ð@òcå¼ c­7oB¤ÆEðì›”éß¹BX¼ÀVÈauÇ]mo%E¸£ÊvçUë;w…o] íÌaÎ y(!Ùpk¦µapî§-ê|ÜËζ{ì]bKŽeïŽ]¦`Ÿ”ád¿½£¿3ÈÝ¥»¯GÅç3û}ýa/˜¹¦«EþÏ}”w_‘ê|ÞÜ{á‡G«±Ó¢µ!Ý.4SJßjÕ´if€© â × _Hܦ‹Çgd~vZéuðÁ"F;¸È‘oõÛ5•iÍTï¨4×a¾d³øJ$W»^eBç›ÅR0åµ<€¥PH`Ö<8€ãó>ðœ=AÎWŽ=rËØÅ0ûíÅ3¡õÍâ a³QìÀ×ZÊZSñçÙË(_`!=eoúW)”AKôøšÂ•$æ&•Æ¯Å晢—öfÁ#Úî|ÈYCÚ!½JÀû>Ÿ|¨‹ºøü½™ü«wî<Gp÷Û=G×T6eg +V)Î$÷;V¿æ<øóPXÃ%]ÿuèW-ŠdP"m¨€s»Øˆ<©lU âDšÚÙÄþ6HˆqDüå+ü¸ò¯ì¯h!?ŒqöŸ.Îúò¶˜çóq¸±?¹j p \}“ ¦¦@œÃ¢F>붌k¸§b/ðU$QºK …ˆ–“•*A@”Ø@ âcK*&‡ñÍÓ쮂¤”‹fg¾ÞÕ†o[kE#à’ é!¯#ÜBÄ°Öß ˜Áô.q[aA8¸*Ó—÷O×Ëö÷ØÑ<& —`Røù_[Úì8š”¦˜·h7|Ž.ùÆÑ3„Âæ‡ÀÃ`ˆâàÉç€'¿¼„¬7 :®„<ž!`Ì)M°»œ¿JîÂ׎¢|è :âÞ0„ +MŠù•A$ä¾ç!˜Ðv\É1” BuÁ ("‚˜ÂþrÙ‚sÜýçá(új7Š }¯ŒŠ0FŠJWöAÄþIÏ× <8(¤Ïý—šÕ?q–\ÓþÏ"]à‘†ÝËâfÈv”¨‘д›•þgbk"endstream endobj -1585 0 obj << +1602 0 obj << /Type /Page -/Contents 1586 0 R -/Resources 1584 0 R +/Contents 1603 0 R +/Resources 1601 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1560 0 R -/Annots [ 1588 0 R ] +/Parent 1609 0 R +/Annots [ 1605 0 R ] >> endobj -1588 0 obj << +1605 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [333.4761 480.8577 413.3061 492.9174] +/Rect [333.4761 409.1267 413.3061 421.1864] /Subtype /Link /A << /S /GoTo /D (clients-per-query) >> >> endobj -1587 0 obj << -/D [1585 0 R /XYZ 85.0394 794.5015 null] +1604 0 obj << +/D [1602 0 R /XYZ 85.0394 794.5015 null] >> endobj -550 0 obj << -/D [1585 0 R /XYZ 85.0394 244.5016 null] +554 0 obj << +/D [1602 0 R /XYZ 85.0394 172.7706 null] >> endobj -1589 0 obj << -/D [1585 0 R /XYZ 85.0394 219.381 null] +1606 0 obj << +/D [1602 0 R /XYZ 85.0394 147.65 null] >> endobj -1590 0 obj << -/D [1585 0 R /XYZ 85.0394 219.381 null] +1607 0 obj << +/D [1602 0 R /XYZ 85.0394 147.65 null] >> endobj -1591 0 obj << -/D [1585 0 R /XYZ 85.0394 207.4258 null] +1608 0 obj << +/D [1602 0 R /XYZ 85.0394 135.6948 null] >> endobj -1584 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +1601 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1595 0 obj << -/Length 3080 -/Filter /FlateDecode ->> -stream -xÚÍ[YoãF~÷¯Ð£„:}ØÅY{ÆR‚ì&yàHô˜‰tDÊÎüûT±y´lJ”Ö - À"›ÝŪ¯ëìn²…ÿl 4ÑŽ»q’(ÊÔ`¶<£ƒÏðìû3Võ×Æa¯ï¦gß^ 3pÄi®Óû€–%ÔZ6˜Îj"É(Ðáw×7n4æŠ'Ó‘‘Ãwøgz=™^ŸOFcç,žÿç݇éå弄¾¥~~{suýýOwÛß|wyuywys~9ú}úÃÙå´ ’QÜÿqöëït0Y8£D8«ÏpC sŽ–gR ¢¤uËâlrö±!<-‡v&)#Œ+1 K¤Rvûký+(¼¶ºdŒ8¥^¾ų# þÀD€HT*ÓLgÁD0¦ˆ´f`”#ZpQNÄ/÷«Éz6‹óá"À% ¼»þ/Kci±ŠÒü>^ù»ÕˆÙaüÇ:΋ܷäH1žÇsòs`ŽH扖շ‰/¤% €¨:Q) uTõ * ÑÆ°Ñ«(YÎ{ ·Ë€ÉcaÙªpŸMàCÍ ›øÿFÕŒ0íˆ0Þ˜;èfMhK¯lŠ0%+8LÄY!º§«6xm)±¤¯=#b“NÁYÄy¶xª§bRDE’ɬšˆólñ*9š#„h¸Ã2{¹)ˆÔü0Ô:Õ\Ð#Z@-ÑXK˜ mßîDµÏ `"o“¯ËOÙb„Cyé¥m…fÕ.¸äË8Ÿ­’Ç"ÉÒW~™‚8°¦ðÝoq£Z¨¿!f¸Mç„$%þ•}\Ç«¯Oâ˜Òz8¹zžìpÌ:«NVþâúŽ@ Á7¬’¸öµqZíÌBvL9øQey„à ¨”6€P ¡>€¹ÖBð|Šö)!3‚9]‚®î1KóµJRm†ww‡(¡SžD6Íâä©#Zµx¶œž0œ¦A¨¶=xRE˜rO}žú­x¬ž®‰+”Ûq³PåaÆùÔôæ—‹Û÷ï®!BªáÜ÷ÚÚÁ·ÓUIe ÉFõ há\V‘j&¨…~¾)5|wý#(¦²rx·%?}%Ž†q0«2}¤³' ©VD[Þã5$£\[º¯nïÞ_‚ee©“W—«U?’Í  X;a«†Š×pÓ¸*‚ ¸o‹‡x¨e+ÔFÆ >ßÂr˜0^•f«ƒÜdÈê k¤„«^<¥"BYÆ//n&t?ƒÆ®¿QE)üamôµ­2×UÚcËà £™¢eº'z+Å>z¿OòeTÌ@)‚Ø}±~Ü#|·£ÞÂC~OØØ!{´Bö Ê$݇ð鈅¯Öé,*ây?žÓ‘CÌì°ñF\ŽOX[!‹tT÷vêˆtÂö£e<Šî³¼îEÖ@èæñ"þaá}–—§‹% XOD—Î%Œ«òö]` æÌ~:òcë5=xE[L>Æ«ûlµÜeÈäéš»„LÒ=PZE 8ŠòwŸ²U±† hŽ©Í}¾®×E³:HeEä/gYZøè¿ØoÀù±ð -— ÑþzÄV|¥†â‘ö¸SiÑÜèßI6û²_¼¿ -":ÀGÙ0Iýoö§IúoÚÚs þÇÜÉám¹@ ͳl¹Ìª¡ž^”ûu»pÑ_yis·ðŠoäþY’û'‘¿ :øöìÞ?h¸ :§ñ³¿÷¬úFÔ˜fjý©tg‘,“¢t|þ¾þýR¾hœ£_–„är‡~3÷6eø[]¡PK«ž°"…!FsÖê׋¾dgëâ OXø1»p 8:áÂ9TÐ}Ki’ÃŒRíCÈ÷‹u|Cˆ‹cÂ9œL¾æ­éÞL*]Ï+[©7ní'“ô)û²3´ÌŸ0ÄŒBEí£Õˆ™ R¸ëƒ!ÖÇ…Ø3â% „š»`ʈuZ¿Ôáý¢Ë¾º»s³Aµå÷„1µênÙSV -€ÉI&_ªíÞ¨ê#¢p|¸ ƒîÁÕâ¬ö¡ýç²°ŒïŠ"^>î¨.n&“ËsÚS´HæA"y";ô,žx%)4‡Ú[ö„|¡5¡‚± o¿¼ ÃíG>Z !‡JŠîê[1jCÙSö€Qj”ÛÀð&þ|ŒFº M•“b{Z–èO±oMR,)ƒn€ö¸+ãí‚@¸·áõ·ª1×DAu¾{PÓJoÌÀ~>v—÷zÔ–·£ùjˆr‡­¬ÔC¶AÈ™gÉû<ôâŒúPõqõµÜï™NÓtÚ²9¦”ΰ€*¬ˆ>•eVn©¯ }©¾NçU(­ª+(r‰+Òw#aàŸú—W‹ÓHåÞS©6ëI—Æ_F =·¡„\â9Q1Û-"BBòã»äñ,ÁJÙ\†ÅCŒŠßU»9/ëQ|~¿ªžKdjxúqH†T *ëÚ5šò}~$¾C”ôµ xBŽ1µ!C¨“¨Š’B_ÀˆJÙ>ÇŽ8¨…µÝˆÆ ÅqHòµþî€4¤8M7äu€,áu¬ž†o:„„JÚJ¹]F%¼QÆšbŸŒ?Ì󦈼_DÈf@é–&Hj·K‹ ƒ †OÚšbŸ´NG©ÛwÙ!®…šL›Mq½­HÞt½K¥5€råNhw<Š=H óÈ•Ù é@chí6’ÜÛ8˜€d› PÞ‡ðaº^~ÂíKȺJ¯†mÍ$¼y~ÈòØ?}¡Õ‹cxó).žã8íòyÕiÔíà*b[²\ŸtG·¢8Iv ZJÓôBÑï'ã>F¸4n>V†‚ÏMñ¸F=%t¶Xç/UÁC@RŸÎ»Ð eïv ”–@ܳ7€†uæíXS‡$»ü #š¡7¯»mS@ý¤ÿ|%ý2Y,’<žAÄÂÕ\Aåð -—fñY˜œ#šJ³ z}AMÓÔ+ª.×ÜŸâ4©¢4T ‹(/<®–bvÆ6ÓrŸIX1̲õbŽ×ÒÓƒ6oãUªãªC”wâ+ oÃN¾ ¥Kˆéò¶·ã[Q‡$»ðÓÀZÓ­ %ÿè2dIl“QB,¡à \Ý@H–q”Vþ•Aý n¼Ë¿Â46þ¸Ï¡-8âijÿŠí›þ6þC^-|»ß?À“&Õ/ =t3³{=¥E;(¸9ç RîíQ­¡8I¾ž n Ù±í{·uàbv­M›Îc[%–o,[ÚZhÿÏŽ~ž3íï!˜|ŒnFõ|tÀ”"F™ð£Y}t0©¶²°þ¼þö¶ÿÛƒ³GÑ$Û5ÇI³3V‘Ë< ‡÷³š\yµÛo­[ŸûÛÇxU‘è_ãüÜäµÅ†t:’aÐè:òþtñAvH‚'¼¡” -btüWš1´u¥Ôàõpª%«!«·‘Wå¡0vÓáLÏ»Ù6PvЇŽ»Ù6„«:†Cg}U½ÕŸÒäÏ.ª )Ú†P`?Hàäð"[FIꉗxwå1¶‹WÏ娎ºH@¢ldð¦jwÙ¿ 7w˼^y2ýM[7 Èóµ/ -çÆXÔp™Í׋2ëÁ‡ë²öæJ×A ï³Å"{ö[ÝØ^.Q”¼²pŠþT5yá¿:¤†É¶Æmúß—dðK-k7úïîÔ•ã!ßãUÌÏ=בç6 ®ò&+üóh±ð[c.G·á ú> +stream +xÚÍ›YsâH€ßý+x„Ø¥¶îãÑcC¯'fìi`':vfhÛŠáFÂÞþ÷›©ÒQØÁ@GÑÖQ•Êú*+’` +ÿXGi¢wã$Q”©ÎlyE;_àÞ‡+V´é—úa«Ÿ&Wÿ +ÓqÄi®;“Ç@–%ÔZÖ™Ìÿèj"I$ÐîOw÷·®×çŠvÇ“ž‘Ýküor7žÜÝŒ{}ç,ïÞüûú·É`ä[é £¿Rt¿y¸Þ}øϨðpï/ÃÁhp3èý5ùùj0©’QÚ»úã/Ú™ÃX¾¢D8«:¯pB sŽw–WR ¢¤å•ÅÕøêc%0¸›wm‚&)#Œ+Ñé K¤Rv÷cý#(<¶8dŒ8¥Þ>µÏ¨# þƒ‰€!Q©L5œÁ˜"ÒšŽQŽhÁE>ã‡ë‡Mö"´A{Àb”4ðlx÷4òÓôpí¾m¢u¥þ$’Œ¼E ºÉ>³Öì´Ñ +i‰;‚q Î PJBU-¥!ÚÔ‡Ô' 4»d€‚&”h(1œ¹œËõ§áh};ʱ?Z÷˜íF2Í¢ù|^/yéø8´´”·àã‚­í¾c ðx|^—ŒZÂyÛê1–1í™ü ã»;š^­ÖÃÓN®ÝOO;G¬Òr‹Þ1¶w4½P¯óâcgÅg%L¶Ä^m q”ùØûéq=ÞÌfQš¶òûï*‰<µl=MÒÇhýŽaFPb4ßK4Põ’ Òp"”kYÎÚ(â¤f%Ñá4^œç#ˆÛË2Pò\,ëô±-Å>†š7ùèßëU*´#BL§Ï4³&Ìcßå³Ü@k‡é’œpÅw„þ2ÙÖ8½Bòª +`Dô`Ò)$êQºZ¼”S1ΦYœfñ¬˜ˆ›Õ&É¢uúv&4#FÝQÖå¸9(—‚HÍ£ÖØ©Ô‚žq”#ê+y¦0A]å¢ÚBÕ¨,ƒè"‹lôûòójуÉp<¯lA³¸.¸äÝÛ(­ãç,^%ïj" +ëÄAj>û´á 7ª…ú!„´"Úî²¹ŠX4×Ö§›!çþŽ¡\)­»ãáëücƒ»`hMÔÉwÁ¿=e¯Ê!;'B(Z 7¼!ø;Á„ ê£êãÊ]°J8j%( +ëÓNpuÏ«$Ъ$Õ¦;c„>LyixiÅ/ ѪæYkzÁ8!îX¦m Oî˜ +¹ÍSÇSŸÊ3Põ‚—83ÄjfZ€rF$„òœÍý§Û‡_¯ïî!b©º#8oZw:‚` Û›$…$“jÕBréD‰#܇ü}ØSª{}÷ ¦²²;Ú‘Ÿ¾A‰½¡ôÆQì}Ò@ÙËE +  k ÝÒ¢„ñ¡{ø0úu+»/s›Öëv’U§Ã†ª]÷9t @«ˆ²Üî‡ì)ZµÕ­‘±îè „y70ZçWë£Üd¨ê[¤¡„JÖÂÓ¢¹ña|p{?¦‡-hlú'U”¬΃¾×U榈B{0Ö +^0E…¯yTKô†‚@éì£÷¯qºœf³'0J§ vßnžßu¯“Bx¨ïS•Êfª[¨J¨Ø™ñÅõ¤Ç`…¯7ÉlšEóvž“žCf¶[ö8‘«×øÂ;DÂŒj ìRb4÷ý—é2êõ E÷™·’õ=ݪnïÇãÁ§ö2]Äó ˜z!{A*^î²çŽBõ-Z‚>$wDPʶ@>|=áî>*†¡vçbÈq¸Öé{ˆÝ !%²µ0´œ)ÝÃûèË1t[M‘•âõ$/Ò_"5N°¨ ší~SÞ:ÁàNãõCͲ++[Ü,W–H!õÖ æc÷Ùq›G t;› †(wÜÛ’²Ë.„Lp–¬ÍHM¤q>T}\ÏßøL&Ir@uY}¨”Ì°€:,›~Î )¬Ý_Cúb}“Ì‹P\GP.¤þ÷¤G=aàÁ¸ÿ—ÛÓ(åÑK)^ד&‹L!zmÃr‰_ʈBÙæ)XÁPZû&és4‹±Dµ „w³§”¿ëz ržW¤xÿq šþ*€©î]âû¡T¸/¬9붫ÓÔ÷ÄgHƒ#}?ü`Á†cms&I¡-çœ(íØ!q⬵͟õ+‰ýPä{ûÜh&ë'£†¬²„DZrþÙ0HM˜•r÷• ð4~Æ1–ÛÆøaž·‡ÈÛ‡å ˜!Mƒe` ’ÚÝ£Å×~ ºœo´¥Ä¶Ñ:M¥n{¸Ë†áZüøÖlׯ©Ñ›nö™´Æ/& ß M'´;€Jb ia¹2ÛâšCK·§~s0²-çTøÞM6ËÏøS€›@¯†×ªðäõi•Fþ~è ýÍi¹=†'Ÿ£ì5Š’&ŸW|º®"ÖXXKŒÍ„;ÜBb?Ù¬Œ¦j… +¢ßû%>F8D¢m|, ž›âw–åär’Ùb“B¾TI}2o2@C´¤l÷ +”ÖLÌÁ²æôXJì‡"›ü 6p\5Ûe€ +Ú1Œ>úß»Ñ/ãÅ"N£D,ÜÏTv‡¸9‹÷ªÀäÑTšmèéô+Zš¦ÞPu¾ëþ%q­àÂkñwaÀL¢&O'aBµÑ»ž £Ðêtc,%öC‘ ƈ5±Õªf¨!mtuªn'ã ?ƒ§¿q¥ÝÉSqa1M3Ï•i…ÙÛŽøQ’¿iVtÓ§Õf1ÇcéåÁ5¿ÆŸ‹TGEƒiÚÈW^‡&¾_o«3¹‚w;ßBb?ÙÄÖ¬òúÉy(ùGÓB†\ºÊ(!–@Wð„1în ’e4M +ÿŠ²À7ùW(*ÿ +Ügp-øÈÓ”þ¯oûW¼YùW¼ yÙtá¯û7ø­Iñ? ?o2Ò÷sÁ Âf RNJì¾Ý˜§¢Ø$¾Ÿ n Õ±ÕSwEtPviJÛžcWÖ'Ö,u!tø¯Îÿù> endobj -1596 0 obj << -/D [1594 0 R /XYZ 56.6929 794.5015 null] ->> endobj -554 0 obj << -/D [1594 0 R /XYZ 56.6929 698.798 null] ->> endobj -1597 0 obj << -/D [1594 0 R /XYZ 56.6929 673.6774 null] ->> endobj -1598 0 obj << -/D [1594 0 R /XYZ 56.6929 673.6774 null] +/Parent 1609 0 R >> endobj -1599 0 obj << -/D [1594 0 R /XYZ 56.6929 661.7222 null] +1614 0 obj << +/D [1612 0 R /XYZ 56.6929 794.5015 null] >> endobj 558 0 obj << -/D [1594 0 R /XYZ 56.6929 173.6899 null] +/D [1612 0 R /XYZ 56.6929 627.067 null] >> endobj -1600 0 obj << -/D [1594 0 R /XYZ 56.6929 148.5693 null] +1615 0 obj << +/D [1612 0 R /XYZ 56.6929 601.9463 null] >> endobj -1601 0 obj << -/D [1594 0 R /XYZ 56.6929 92.1409 null] +1616 0 obj << +/D [1612 0 R /XYZ 56.6929 601.9463 null] >> endobj -1602 0 obj << -/D [1594 0 R /XYZ 56.6929 80.1857 null] +1617 0 obj << +/D [1612 0 R /XYZ 56.6929 589.9912 null] >> endobj -1593 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F11 1384 0 R >> +1611 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1605 0 obj << -/Length 2016 +1620 0 obj << +/Length 2375 /Filter /FlateDecode >> stream -xÚÍZ[oÛ¸~÷¯Ð£ ±¼_€ÅÚ4ÙÍÛKâv±gYm„ãH^KnпC‘’)[¶šÆ1Š‘H gÈ™o†3¤I„áDZ Ì ”áH`"¢ôa‚£Ïðíç ñ4qK‡Toæ“WWLEIe4ÿðÒkM¢ùâ¯éÅ/¯?Ì/of1x*Ñ,Oß\¿{ëzŒ{\¼wuýóï7¯gŠOç×ïß¹î›Ë«Ë›Ëw—³ØMa<8ø±·s;ȼ__ÜÎþžÿ:¹œw I0³³ÿgò×ß8ZÀZ`ÄŒÑ#40"ÆÐèaÂC‚3Öö,'·“Ãàk3tHiD¨`QÌ8Òx|ƒXÆ5RX‹£˜d„8ÂËÃÀË¿¶#ú¬bÂâBY£r…¤RdkT•p†4c"R‚ *ÁàÖª·_îÊå,–ÜÐéÛ¬J×ùªÎËbWóT¯¤¤Q(äy·*b¯(¦ ™£æÜcÙŽ8¬  €ùêN„ ê‚;Ñèâ'»èWW4¤THq­€»%˜ÿùáÒÑô¸Q¸äÌý÷í Þ¯²ÂÓ°€¨ 5žè¶LÿŸÕ8†&ÓFd ûŽ§Õ&M³ªú´Y.¿Î!Sð#ŽÙt~ŸWŽ"-7E­ÝÐܳ(ÊÚ½$«Õ2­ü…VdšÜ-3ç‰uéŸ÷ÙÀjEBRâgzõö1©Óû’9“íŠê¯« †U`¯ça`Vü”°’Æ -$ƒV=7¬®’|9 --K´Yψžf†Í´üO‚œåÅg×Y9Zxiíáe‰:xY¢Üshàe¿þ ð -ív*x¹Å‘SFp©2˜°xICÀÇœ^˲ʞ¶À¼©²8b”`µ§ÚJ^`[•J Ã%3Š2H0ªÎi”7y±øŸ·Æ±>oŸwÀ¢ñyÛè|þ É]üÈ&“༛1“I…„RgÝý/Ê¢x¦ÉR`‘¥õ¬¨ãG¶D~Ì„³šHRÐÜ™­6j± o—²ð˪6½¼ºo’71˜¼´Y ŒSÙŒ ¨_„xËvÄa›‰ˆÂtÌfðÞvÖ„è5èzU‡¯ Æ_ŒM“†Iãj¶;/Òò¡k¥Á]ÛqøgvwÞ¸›ù$ð&‹š‘©ËÓ¡Ýö»<0—Hµ9|hr&èΙˆàá߸õüþöÃÀš)·u_«ž¤X 1ÒÀ‡'_1ÅQ(û ´Yر@ åy|QP £1 DX!‰Çq}ðroP°®“×Z©q[¦Â§m™ªl´ul³xÐÕª,UWšî¯„ÃZic‹f)Ãë q"Z­ma\â6ÀT!°A—ÉÛƒÔ¦IÜ™BAh`úS¸/Y)F‚ê±Ä\À0úœ½ÉÒ/OE(Å¡Ó¡¶Ï-Íò/™ûØ*5¼Íšñér³È|+Ûr@ª«”÷*dÀØ}±©ˆ}&îá#æ©m|u ÚÉÂ;„îüÓl1”²Ü}uN -÷¼¾øíƒÏnÛ©ºæl(Éç#g0¡íOD·Çößw ÿ¼c|" b -°S…°êßìÝ#0,‘¦FE17 aA¶^ÐCe{ÉÁô1æœÀ^˜$`kÆC¥ñ°«ßå˼ööyÌk¿ßIºÌÌ¢g/ÊôC¸ŸK¶ISÁåÝJà¦~£îJ@Ûú¸ÉÖy*W V&TSœè1¨Ž(³¥j”yýqO•¢Ÿ­îŽ -í¨¤öT‰Aåöf¤'ö´ª¼ñ'<ߦKj`Ûfîò°.CªÃºì¨]¾_ÕÕ>0JÂ&÷ÇÄvTr{Ú´µ÷h³ÛD‚ø×\4ŽFÔSB‚iw®lWlÚÛƒðÚç­å*8¢Ý³µÍ„ו²Z&é~F»Èþtd@Ã8=ÿÖ_¨l³c F­Ä.¹ô“jtDvgYhšª©ÿ aKendstream +xÚÍZmoÛ8þž_áP³|ÁhÝd× l’&.p‡Ýý ÈJ#œcy-;Ùþû¾É”-ÛIëäb‘Î3Ï ‡‘†?ÒÓafxOŽ&¢—?œàÞWx÷Ó 4ƒH4H©>ŽOÞŸ3Õ3ÈH*{㻄—FXkÒO~ëþp5>»>Pû„Äý£‹O¾ÇøŸáåÅùè§/×NïG—¾ûúìüìúìbxv:0FSÏaìÍØ +#oÆ£áÍéã_NÎÆÍÒEÌììÿ<ùíÜ›ÀZ9Áˆ-zOÐÀˆC{'\0$8c±gzrsò¹a˜¼uC»”&˜FBSÕ¡5Jº´& ’Œ2§5»P‚øé€` +¬òÿK¿ÚÑûË°ìe¶,ëe™×A…Õj¶,µ]<ˆ`‰ÜPŽ 'Ü1ìˆ ììC°³í<²s­lqJt¿ðIñ;ÆtVL|s^,‹„ïòÛ¼¨ßÁÌ0í?Ý—ù}›Ÿcª + ‘JZõÙ9~ùtÅ;VB „D¢ß±À@ø~tõÈᙼëà+€-3bÍV¾„­ÜÅvÀ‰@Œ)Ý‚ŒÔ »§­bJ%üpÿ´¢ÀG®ò%\峸~™•uq¤HªÂÒ ¨æýOÕCVÎ<ó5¬ŸÍ&R AJËÀáüÓS¶óo â )¥x"ɨöªyá æžW˺œ¾±¼wøé ÃHܘÀœºqѨ&«ia' aƒQÙÍì éx8Š»j:­žÊÙ×ПÝN:Iº$¢ÀÓÁ‡ÃdÿÙ±j0×Qoãÿ\u°¡qÉY úW‡RF Ø(Ç{ËÜÿÔÅÌéfùÙ¦KµyQ-ýûl:õ/×ÎìFGgv4Y9«†8AÒB²6¬ïª…2#ND_ÿ‡.þÊ‹ù²¬f!*%²pV-Eᱜ…±÷áݤ¨óEé†úcŠémsÂâp#5CRÒg…sÆ5RXm„óï'‚×:Ú9?¯ðG´Y šE ¤"V&Yo±&…8fLô¤(Êôo·FrCûŸEn¨ŽÃ^£@e½TÈMܪˆÁfÈaÈìÝ\·XÆ»uÁÁ©l0Šºhûd£ É CÄÙëšê{\s§ƒ_Btêp_È ”¡&ݬãIâxÏ*Ï‹º¾[M§ßNaãéƒçrÌúãû²öÁcýÐ2°˜9dž‡l>Ÿ–ç±¸í©¹seïZÕÚÅ:¶Š„¤ä9Qš3Wä£ÌNX%öú1 ¼.¬€Bk)ÁŠÄ©¦o «sÈ¡e‰Va_€¨M¿ºƒ_‚ÎÜ~f;ÃŽjá¥u€—%jàe‰ÊÀÁÁ˾ý»Â+±Û±àõÜR0ÂÁ HA”yKx §U]¼ lys;d²Ç(Éjµ•¼‚Q„ÕÚãÅ£`fq«ÞÒ(ËÙä;|ÞÇú¼ý½!‡ÅkŸße²TÇ59ªÉ´F˜²˜€Ó†ÄêM7ÿa5›ý År`QäËm­¿³›)‰°‡26¡ ’‚ò·6ÚAƒ ƒYšóKQÛ#aYßǃKGê¶Ód‰2Že3&ì€/ÙãˆÝ6ãpæÄøÐ~%¤BÒ¨7M‡>äö4ù®&w®&ëgŽ‰ó4Û]Îòê¡iåÁ}Ûsøsv÷θ™…p—C’¾ÏÒ¡û}–N˜O£bÆ/\ÆýÝ#ùú¦ªûr†JÕÓ}ýB4ðá‡S¯QÁYûþÄæ÷€:AË!ðuA9œ ùÁ@Ä<õö >èQƒSÉT‚ÓÚvè&](rê6]®¨kWÓ®|úoníCŠ[Û¶¸u¿;pkï´Ù[À6–r/n)lä¬ÑÒÑq›âX¸}…³)×üÐÙ”òMƒñM1›œ-ki ˆVöº‘)æ®ú˜âÍ•¡í«—‚ãê"s¸ÐJã!^­©ÊF[϶è<—Öój6©›ƒéöJ8¬•šxõ}Ó½J'"jm}ãó¶¦ +1Iš<Þµ:k 7¦Ð»ššþXÇÛWˆ¬œs$„9PE¶doÐë"|)@)öµuªæNú<Öò¢|,üËN©á1pãóéjR„V±æÞTŸÿ«àö~ÍØ¿ñ÷ßÊßñ7¿Ô6¼zͼ²‘»t×哶Ho¿…«øp±>þz’Û8Uß|€ý$ûºç&1ý±B躀úÿ¸Â'Ò ¦*ªVíJîVE—a‰45Êÿ€\Óý]¦Á;%3IAW„‚î°z˜ƒÍoËi¹ Öy*—a³“iMÀĬ!·BLËO4„ÆÝU¬l®‰%“íºð¯UmÃ3¥­b0£$©Ù·Ëû,Ð=±¼c©Ö¥$÷²œuMÛ˜)Åþ˜ÉÀ””®×cÙe-QÓº +S]ÍçÕÂùÇN¡ Ç9£/j‚Р€ú¾zš5‚bRql£œÝVñ¦ÔêĆ {·ús‘VĶÊc±lv[­Bu­A‹xi°.ãá`W;«aø|^d‹­J[½1¡ÍÏ$0„lMz#¢Áß‚¢AJµÇ "• ÐçO“ëw7öÿVUOÀ¸Ø+¼¡êÞª¢J˜%Uº-~ì5À¸L ­5´¸·àЛ" š·Ež­êΠظËny^@”À xNª"L!HýlRÍÃ\m4¼tTû‘² ½ðèUwÕÂgI¨àÀ(°icó)[¸ëÂŽIJ gq[Îê®ÕBšn$yQÒ`ZNvbŽ*û9…dû1—RíÆ\Cå0÷áßçÛh#÷%æûÅ6Tr[hƒ Ê`Kh ùÀíD2vfîøV6å”­‚øúüg[ŸWÅ¢ŒÑ¡ö'ÁÝÊ´Ù.×8¥Ú£ÌHå”9ú¼¥J8Wq{´Û+´¡êÚþüT®•i‹=®*¯ÃõÎ3uiË4‹ºL¨öè2R9]^Ηõ60JÂföûÄ6Tr[Ú´µ·Ðf³‰$ñÏÕvÇ?È¢@ ê%!ÁÄ«Ø›·öÄd#…¬µJ¿/Ù²µÍƒu2Ÿfùv>ÛìM1ÆH—Šqïàåøs¿\=i‹Zï"Mrgå´Ä6çÞ|UØ1ùÿ¥@ÆWendstream endobj -1604 0 obj << +1619 0 obj << /Type /Page -/Contents 1605 0 R -/Resources 1603 0 R +/Contents 1620 0 R +/Resources 1618 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1611 0 R +/Parent 1609 0 R >> endobj -1606 0 obj << -/D [1604 0 R /XYZ 85.0394 794.5015 null] +1621 0 obj << +/D [1619 0 R /XYZ 85.0394 794.5015 null] >> endobj 562 0 obj << -/D [1604 0 R /XYZ 85.0394 477.8665 null] +/D [1619 0 R /XYZ 85.0394 769.5949 null] >> endobj -1610 0 obj << -/D [1604 0 R /XYZ 85.0394 450.2752 null] +1622 0 obj << +/D [1619 0 R /XYZ 85.0394 752.4444 null] >> endobj -1603 0 obj << -/Font << /F37 799 0 R /F39 895 0 R /F11 1384 0 R /F21 710 0 R /F23 734 0 R /F65 1609 0 R >> +1623 0 obj << +/D [1619 0 R /XYZ 85.0394 696.016 null] +>> endobj +1624 0 obj << +/D [1619 0 R /XYZ 85.0394 684.0608 null] +>> endobj +566 0 obj << +/D [1619 0 R /XYZ 85.0394 401.8966 null] +>> endobj +1628 0 obj << +/D [1619 0 R /XYZ 85.0394 374.3052 null] +>> endobj +1618 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F11 1400 0 R /F39 900 0 R /F67 1627 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1614 0 obj << +1631 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1613 0 obj << +1630 0 obj << /Type /Page -/Contents 1614 0 R -/Resources 1612 0 R +/Contents 1631 0 R +/Resources 1629 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1611 0 R +/Parent 1609 0 R >> endobj -1615 0 obj << -/D [1613 0 R /XYZ 56.6929 794.5015 null] +1632 0 obj << +/D [1630 0 R /XYZ 56.6929 794.5015 null] >> endobj -1612 0 obj << +1629 0 obj << /ProcSet [ /PDF ] >> endobj -1618 0 obj << +1635 0 obj << /Length 1321 /Filter /FlateDecode >> @@ -7106,141 +7200,147 @@ xÚ•WK [#y¿ÒÛ¾­T×Þ#o: ^‹²DjUêüÉß?<ÑŒ¦8ik™O^]Þ+©¡¦j”uæúáÓ·+àæ\c®÷{]ìyZ¿­¨üv­763­6Œ$[„-Sæþ,þ¼8ý× Ç‰iÐa2>DHìo‘>¢(=›GçëpÌÅ^Ä´obS~¢:’ÈÔŠeÑè—Š™âÑ] c‹ñß%# ãó"7Mß»Øä~n".îª.!Ø.G|€°q"o°t®†viӭ߯Tó¸x}>,vøJìïèÐAãÛ¤_uïÑ“ûå‘!“F]°£‹Ò©•Þô«&?an¸jÔñÝqŠ8dùU›@§>?½Hp”ÁoÏÑ#4¦;e‰;×6|É^ªûaáŸendstream +ÝÿîÇåðqé?á•h>@§>?½Hp”ÁoÏÑ#4¦;e‰?×6|É^ªûaZá¡endstream endobj -1617 0 obj << +1634 0 obj << /Type /Page -/Contents 1618 0 R -/Resources 1616 0 R +/Contents 1635 0 R +/Resources 1633 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1611 0 R +/Parent 1609 0 R >> endobj -1619 0 obj << -/D [1617 0 R /XYZ 85.0394 794.5015 null] +1636 0 obj << +/D [1634 0 R /XYZ 85.0394 794.5015 null] >> endobj -566 0 obj << -/D [1617 0 R /XYZ 85.0394 769.5949 null] +570 0 obj << +/D [1634 0 R /XYZ 85.0394 769.5949 null] >> endobj -1620 0 obj << -/D [1617 0 R /XYZ 85.0394 573.0962 null] +1637 0 obj << +/D [1634 0 R /XYZ 85.0394 573.0962 null] >> endobj -570 0 obj << -/D [1617 0 R /XYZ 85.0394 573.0962 null] +574 0 obj << +/D [1634 0 R /XYZ 85.0394 573.0962 null] >> endobj -1621 0 obj << -/D [1617 0 R /XYZ 85.0394 542.127 null] +1638 0 obj << +/D [1634 0 R /XYZ 85.0394 542.127 null] >> endobj -1616 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R >> +1633 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1624 0 obj << -/Length 3449 +1641 0 obj << +/Length 3450 /Filter /FlateDecode >> stream -xÚ¥ZmoÛFþî_¡o'Å}á[q8ÀMœÖm‘ôwEÛIK¼P¤BRvÕ_3;³+R¢ëEÑh9»œÝ×g†3þ³ ôÂD&³(Ñ^à‹`–í®üÙæ¾»¼fa-†«¾]]-ß©h–xI(ÃÙêqÀ+öü8³Uþë<ò¤wýûê‡å»0¬•¾HìqÍ›ï?~ø°¢U#Ž:ö´ˆ%/»}ÿvŠSèI%4¯ùt·z¸;ÁJ8”V¡ÛòöçÕÝÇë… |8ã5ÜÑŸ{;JB?ŸîÞ<|¼_ýBOo>¼ÿtÿöîãíu¤ç«{xÂ}®îVNRCi -_¡˜¾\ýú»?ËA¨?\ùžJâ`ö ¾'’DÎvW:P^ •²”êêÓÕ¿ÃÁ¬yuR; „rB= á õ‰*˜B9¼kZºÜ"žôTÖM»Kû²©‰`·Í3 ú†~¿rûæ§n<µ7›¾Èz"›ïÖíSÑ¢o,ÙôÛ‚µ7T²’‹âÄjïöáÓP^ÌÙjFÕ‘'¾àµiþTvM{$öiÿ ½!Äà… -A&QÍ`&"ˆóê?ÏõjOkÍ"-<éˆôA³ŸgvôãI7ö…Åð £=Üÿ‚/îþØï¿Y.á_/=tYÑö^Ón`¼ÜÖK&-íí–·?-Àˆý9Qâù¾öòº;?¾V`d‘/GçÍ@¥—Äq*¼$(¿tû"+æLJGæL0ˆç¿I©i·‘%FÂÒ‡E?q boaøÖÍžâ!r‡ð8qu±qÅüfî¦í{Iâ2äžÐ—óÕ•¬³´¦ý¶Eµ§Q¹ãXúÄ—ëŽ]_ìh²+²C[öGzZižJ3'²Éϟ’LÁw=8Jde*Ý•;0òuó9D?oËlËòªhT•»²?En3ÈÓ]º±ã¦¶)å‘g”hŠGÖØ{îÊ®È n@WÆäÛºðEm’ÏãO¢Åü±HûƒËaÚ'Ç€ :Øû€„;‹yGÙ ž›GZÁ^s$m/„t]VFȆÚЯóÈá6yZì,ã”Ù¤ü|¨÷mùTVņ,ÃÜn y¸ËfÂ|%D$¢`ó=Ð’`d¾˜LëO†ã¥ jÒÎ Ð×À •ðçÿ¹N¤Ýa³):Ö.]µ&ßG5v62ÞÌ"ƒÖZNaWuŽÁtðQùFÄ£à1åC“‘´¨o {ƒðQ*ÇÆó}a D‰Äè¿ÁoñGºÛW< ¶¸3qª²f2jÞPš”çØ·€mÉ|Ò©{)‰V_q¯$H¬~Ù o&jåùÒ·ü–Oi»|)Þ€reÙ¥àÍJ…sw7{#¶åÉ ı:j(¥pšœa/ò!Ÿ~d+‘¾dl¦ã6ã÷Fš\ºvY5YZ-»uYóÝ!’úèæø1¡§ß ! ê)e«Â7•­[çþ•lÙÜa‚ää8 0QA8âLCKH!Æþr¼²–¡É"†>e2!ÀX)Ä«† \¶½HÛÈeÛ=7íg¢p˜Ýmu¤¹²¶'¡iÛ—Ù¡Jù¤9q(o 4.Áå.À¾s3²˜Iì@ˆQ‚µå…Ap–Ð_²bÀSq%ƒ…–I¬*(§QVÂQ] 1àÈX7&Ì¢§ÁSjʉðB`æ­mÊ£²ÎªC^pj. qû-çÕxWqÇn¼%9”IïzþŽóÝÜÞeä8ÈìU“`iÎÆgržÊâƒó”ˆAu$¾&„Ò‹‚ÈÎ’÷#Ôäc˜'„Hd»7å6üæû²*}ÀÍtÏÁC¡ -pžUŒHæå†~Óü‡®?Ûï)­Eçv#Pb\ ƒ±x}uv|.£Kç‰àš2´ëe˨¤ËÐF\ ‹6ñÔIhû2_ ¦Ü1ðÂ8< ri–5‡šÇ£-¹Á:Ïâ0ˆÑâ,[=Ô|MÏe¿%(Q¤mU2@¦c©h6 ¢%ÝÐÐ8‡,Ç} Ѳ:Z~ ¨‰‚AÃñaÏ_OFk"—OXш€!Œ+«´ÈàU|¬ sAקýðäuÓZ|St ,à!`ÇAx–‹¶)…-õ¦;÷‚q±)DØŒ»Ì‹§åŸEÛLAåE‰k´M…°LYµà+ÐÎCL!Féט©!³ªÙ¼ÐÉ‘~tB.¶úžÆšðó,úŒàA_î¦Ü4Vè¦ÒÕ`€lJy" +xÚ¥ZmoÛFþî_¡o'Å}á[q8ÀMœÖm‘ôwEÛIK¼P¤BRvÕ_3;³+R¢ëEÑh9»œ—g†3þ³ ôÂD&³(Ñ^à‹`–í®üÙæ¾»¼fa-†«¾]]-ß©h–xI(ÃÙêqÀ+öü8³Uþë<ò¤wýûê‡å»H ÖJß ¤ö¸æÍ÷?|XѪG{ZÄ’—ݾ;Å)ô¤š×|º[=Ü¿`%¥U趼ýyu÷ñz!d¼†3úóoïaCIèçÓÝ›‡÷«_èé͇÷ŸîßÞ}¼½Žô|uO¸ÏÕÝÊij¨Má+TÓ—«_÷g9(õ‡+ßSIÌžáÁ÷D’ÈÙîJÊ ´R–R]}ºú·c8˜5¯NÞŽðA¡œ¸ÐðÄõ‰*˜B=¼kZ:Ü"žôTÖM»Kû²©‰`·Í3 ú†~¿rûæ§n<µ7›¾Èz"›ïÖíSÑ¢o,ÙôÛ‚o/È®¤ð¢8±·wûðé \^ÌÙjFÕ‘'¾àµiþTvM{$öiÿ ½!†6´P!è$J¢ÙÌDQ`^ýçùý†ÚÓZD³H OG:¢û ÙÏ3;úñt7ö…Åð s5z¸ÿ_Üý±ß³\¿^zè²¢í½¦ÝÀx¹?¬—LZÚÓ-oZ€ûs0¢Äó}íåuw.¾V`d‘/Gò¿f ÒKâ8ž6Ï…ãøÊÁ„A­Éø€ys)a îð’B½®Â÷Áù·mÓ°§uÎñ¡èe>a‚þl!ñ2¤è=q0xÿ_…ìZ¢çeOÔ²£uû¦ëÊuUÕøPÛëx~¨‰Æ¡ +¨%óN'ÜFŠÈÃÛ!Oȶäà‘S2«Ð ’È..꧒–×»¢îißüÀ?te½aÁ¬¯Ê¡Ö…z±vÁ=3ŠÃ7á1µoìÉÐOxùã¡Î0ì˜ÅfÓõ_ÂJ<íK >*¼$(¿tû"+F&¥## âùoRjÚmd‰‘ð„tÁaÑODì­" úÙSñáºc×;šìŠìЖý‘žÖGZ±¯ÒÌ)…¬ÅpbùSÒ)ø®¢DV§Ò¹#_7àCôó¶Ì¶<,«ŠFU¹+ûSä6ƒ<Ý¥;nj›RÙyF€¦8qd=ç®ìŠÜàt¥aL¾­Ø_Ô&ù<P-æEÚ\Ó>9L\@`ïî,æe7xni{PŒHÚ +麬Œ’ µ¡_ç‘Ãmò´ØYÆ)³IùùPïÛò©¬Š Y†9Ý@óp Ö :Ì„ùJˆH +TÁæ{ %ÁÈ|1™ÖŸ ÇKÔ¤ ¯*áÏÿsH ºÃfSt|»tÔš|¯±³±qÀðd´Ör +»ªs ¦ƒ‡ŒÈ7")žŒ¤E}ƒ»÷8X¥âpl<ßÖ@”HÌã¯ñ7ø-þHwûŠ'Áw&ÎãCUÖLÆ›7”&å9ö-`[2Ÿtê\ +F¢ÕWœ+ {¿ì„7 µò|é[~˧´]¾oàreÙ¥àÍJ…sw6{"¶åÉ ı:j(¥pšœa/ò!Ÿ~d+‘¾dl¦ã6ã÷F7¹àd:ˆç¿ Px8ÏWŒè +ÌË ý¦ùÿ]¶ßSZŠÎíF $ĸcõúê,ìø\ F—ÎÁ1eh5ÖË–;Q-*H—¡¸' mâ©“Òöe¾ EL¹cà…qxäÒ,k5ŽG[rƒ!užÅa£ÅY¶z¨ù˜žË~KP¢HÛª$d€LÇZÑl*@EKº¡¡qYŽû¢eu´üà¢& + â'ÂÊ_OFk"—Oø¢1*BWV/ÜJ ƒWñ±‚JÌ]ŸöCÉ릵ø¦èXÀCÀŽƒð,mS +[(a„y|ݦmi .FÌb"1Î…Çh·ÏD±ž€À(‰çß7ÏÅ eGÅ÷EžõòŮɯ ;UK>cö*è^€ºK´šõt9‚†ÂæUΘ{g>õ¦;÷‚q±)DØŒ»Ì‹§åŸEÛLAåE‰k´M…°LYµà+ÐÎCL!Féט©!³ªÙ¼ÐÉ‘~tB.¶úžÆšðó,úŒàA_î¦Ü4Vè¦ÒÕ`€lJy" c  lSàa g¹°1øÇŒßq1ûW¸þÜ–M;t#9FÜ\`\ºTâ{ -ïq©Ä:U(&B(nàÁ~Óü#¨&¤<´Ô€Éú6ˆzW+ 앲mZo -K7ÔÐ!>]Ç%“i®q×ä%.ÊleÚìl$"Œ”>Ïí_Va](϶Íó”v”ôª‹ûpafãºóI§ýœµ6÷YÚm(¨X.sîr ¬œaÇÔAéMi©M(§¶µ[ß–=UBSÝiRÓ‰ ¾ª=-@ `´Éþ1„˜ ×yÑ{>ðâ¡}㬕è>2HÓ¿…vП%€…°ZÁÉd(Iåï: B ¦åÊ•ˆ‡‰ù -þ•ó»‹¾®ôüHFPƒqHˆƒ°õìËLx¾NE‹csד ay¿“³· Üh6¸”e¼r6—‚Ø3pâÐJûÇ°M,cºSÓ¤-…6QˆÂ¦ŽoL’½ˆ£Í ˜ lù csïè¬U.ö %53ŠP3w¢F}ê0¸uh¬ÏþÑÓ€púÖó÷¼sìRP¨ë“KšßvôÑHÅyNq–{{S*3 --û<í ÛþæÎã« ð[ðJ(n8(®„œç–?RÌÇiÆŸºms¨r¯ùUÐ8(»â¦‰ÚZ€«šš©0ã 'ÀŒS˜ñ—óàT0WWÇ©ݳl‰âºFÏ󆟷TM½›æÖiGU¢øžh[J©ùýÏDHóœ0jÇ/QÑ¥ìJ=ß6T6)¤Å¨˜V—‘änØ¿øUé–jêÕ½°õ⤬…^ÖSç@P™^ <Tü×”Ãÿ ºé¶ñ‹ßÀ£Äâ-€íÍó‚U=Y£Æ±‹cr 9æ¹ -¸aŽä]Ño›œÁ4(Ð8Ý'Mpt(å‹ÓÍꮡ%vb¬ ÜññÔ'W!T.#S`>±3Z?¼EéØBÉ>>ˆÝ±Š´+M!Ð'Økc Bàü¶ê–xÓ»£¦–Åãèðiq|è‚·1ò¥>lL¦ð¢fT¢<)4|E3 ·|¢6‡mL#ÉtLè ƒ±d`¬'觫Ò'^ê¾ `ÇŠv¤ÀÞŠ?KwD€á3•w\„ ¸º‚tó­M‰Ó‘v)Ôcí”ágÔÔ¦0#pZlms -ä´ïQ·9M®™Ú¹j0°n¨ih†gÖe`n}Cc‡ñ”û¼¢‡w¤)úØ2ÁŠoÃï›fA€»©† —ìÈ|¶)ÿÜ ¦OµÎiÓöL÷ƒoUåöö£¸é(†¡3O|ã1” |c>Á@‡¾´ƒØ!Ó~A‹0ë›þÝÆä·;ø…érN¡œ5ÐÚ¹gíqß7›6Ýom¯§Óœ ÆöC_0£5ï±+ÒzZ¶h‚2{¨»4cÇñsÓ¦vŸ):Z„ÅÄêÓýwü—­Èãa²4&ê—bjzZ»Òìõ˜šçæÎaa›WqsLD5éç#ÚçâHƒ|WÌwè”tÌÀv‹°°M Zž©°-[çØúhiìŸ&ÇŸº­Àà@ŒåSçBØ®€³IlàLT}ÐH¨lCÄ´Ø7U™§[Aä>Ñ:iGàÁúTñå/—ZPi)5õG ¾«iþö pÀ<ŠŒ³=öt LøPx³D_œÜþ5ÑåÑÿk$§/endstream +ïq©Ä:U(&B(nàÁ~Óü#¨&¤<´Ô€É.*ôm=ô®V&Ø#eÛ´Þ–n"¨¡C|,ºŽK&Ó\â®ÉK\”Ù6$ên³³}Ð ¨0RúÁ@‡¾´ƒØ!Ó~A‹0ë›þÝÆä·;ø…érN¡œ5ÐÚ¹gíqß7›6Ýom¯§ÓHPcû¡/˜Ñš÷Øi=­[4A™=ÔÇ]š±c„ø¹iS»Ï-Âbbõéþ;þƒËVäñ0Y“ õK15 =­]iözLM„ssç°°Í«¸9¦ ¢šôG|Dû\iPƒ/‚ãŠù’Ä l· Û¢åù—Ú Û²uŽ­™ÆþùHarLÑñ÷©Û + ÔX> ŸÂvœMbg¢êÓ€FBe‚¤¦Å¾©Êì8ÝÂ"÷‰ÖiË8Ö§Š/¹Ô‚JK©©?bð]Mó·ÿHè„óæ©xPdœÕ豧c`ÂBáÉ’ðBrû×D—¢ÿ\æ§#endstream endobj -1623 0 obj << +1640 0 obj << /Type /Page -/Contents 1624 0 R -/Resources 1622 0 R +/Contents 1641 0 R +/Resources 1639 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1611 0 R -/Annots [ 1629 0 R ] +/Parent 1609 0 R +/Annots [ 1646 0 R ] >> endobj -1629 0 obj << +1646 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 738.9144 452.088 749.0762] /Subtype/Link/A<> >> endobj -1625 0 obj << -/D [1623 0 R /XYZ 56.6929 794.5015 null] ->> endobj -574 0 obj << -/D [1623 0 R /XYZ 56.6929 723.0302 null] ->> endobj -1630 0 obj << -/D [1623 0 R /XYZ 56.6929 689.3491 null] +1642 0 obj << +/D [1640 0 R /XYZ 56.6929 794.5015 null] >> endobj 578 0 obj << -/D [1623 0 R /XYZ 56.6929 552.677 null] +/D [1640 0 R /XYZ 56.6929 723.0302 null] >> endobj -1631 0 obj << -/D [1623 0 R /XYZ 56.6929 525.9649 null] +1647 0 obj << +/D [1640 0 R /XYZ 56.6929 689.3491 null] >> endobj 582 0 obj << -/D [1623 0 R /XYZ 56.6929 411.5673 null] +/D [1640 0 R /XYZ 56.6929 552.677 null] >> endobj -1632 0 obj << -/D [1623 0 R /XYZ 56.6929 383.9327 null] +1648 0 obj << +/D [1640 0 R /XYZ 56.6929 525.9649 null] >> endobj 586 0 obj << -/D [1623 0 R /XYZ 56.6929 225.6356 null] +/D [1640 0 R /XYZ 56.6929 411.5673 null] >> endobj -1316 0 obj << -/D [1623 0 R /XYZ 56.6929 193.4614 null] +1649 0 obj << +/D [1640 0 R /XYZ 56.6929 383.9327 null] >> endobj -1622 0 obj << -/Font << /F37 799 0 R /F69 1628 0 R /F23 734 0 R /F39 895 0 R /F11 1384 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R /F48 950 0 R /F62 1060 0 R /F63 1063 0 R >> -/XObject << /Im2 1049 0 R >> +590 0 obj << +/D [1640 0 R /XYZ 56.6929 225.6356 null] +>> endobj +1333 0 obj << +/D [1640 0 R /XYZ 56.6929 193.4614 null] +>> endobj +1639 0 obj << +/Font << /F37 803 0 R /F71 1645 0 R /F23 738 0 R /F39 900 0 R /F11 1400 0 R /F41 940 0 R /F21 714 0 R /F53 1032 0 R /F48 955 0 R /F62 1065 0 R /F63 1068 0 R >> +/XObject << /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1635 0 obj << +1652 0 obj << /Length 533 /Filter /FlateDecode >> stream -xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6Úýõµ3·¶ôTEóÆoÞ|x€"b~ Ž “1JeŒ9¡•[ µ9ûêQÇ Ï¤ð–u—{Ÿ¿°I,“(AùË–ÀDŠòêÉÍóé"#Nü!Oˆ—Í&à‘ðXNÇ‹,4þ1[f“éb¤±Ÿga,ˆ0ñÌ)Lg£ïÙøó P§Ôžó{oš_¹m–f»øí==T™žï=‚™ ˜J¡­s†yÌØÙÓxKïçEðæô:4<Îæ"J¦±¡éq‰fŽìô–z«lO‰ßÕ½êÀ,7ZwÎÝkûäþ/¥và)šŒê­-¶uið[xØUE¯*8˜ØyžE_€U· ã`wXUz[€×H¶.²RZ!—{Sô7üÐŽÛôRŠ%çÑ©'ÂTÊä)…Ú{2è]·ÊÜ,#‰Ÿoê˜Çâ- ”úŸ Œ‰I§Àßë]بWÕ\cÁ*uÛ›|u»vx_÷v溵¹å¬Â¥rÚÂÏæî ªö¾ê:å8úe¨ÁÝaÕÔ%ìÝQ­Àp#¶ý¬Ní_Õ¾Ð*å­î]HÓè#˜îâÀÍ9Ε‹ÿµÛŒc»›hþ®îÿÞûë!6¯¤ÑðJ›ëÄ"’é¹(;/É?V~yAþ.ýÑFÎendstream +xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6Úýõµ3·¶ôTEóÆoÞ|x€"b~ Ž “1JeŒ9¡•[ µ9ûêQÇ Ï¤ð–u—{Ÿ¿°I,“(AùË–ÀDŠòêÉÍóé"#Nü!Oˆ—Í&à‘ðXNÇ‹,4þ1[f“éb¤±Ÿga,ˆ0ñÌ)Lg£ïÙøó P§Ôžó{oš_¹m–f»øí==T™žï=‚™ ˜J¡­s†yÌØÙÓxKïçEðæô:4<Îæ"J¦±¡éq‰fŽìô–z«lO‰ßÕ½êÀ,7ZwÎÝkûäþ/¥và)šŒê­-¶uið[xØUE¯*8˜ØyžE_€U· ã`wXUz[€×H¶.²RZ!—{Sô7üÐŽÛôRŠ%çÑ©'ÂTÊä)…Ú{2è]·ÊÜ,#‰Ÿoê˜Çâ- ”úŸ Œ‰I§Àßë]بWÕ\cÁ*uÛ›|u»vx_÷v溵¹å¬Â¥rÚÂÏæî ªö¾ê:å8úe¨ÁÝaÕÔ%ìÝQ­Àp#¶ý¬Ní_Õ¾Ð*å­î]HÓè#˜îâÀÍ9Ε‹ÿµÛŒc»›hþ®îÿÞûë!6¯¤ÑðJ›ëÄ"’é¹(;/™~¬üò‚ü]úÑžÐendstream endobj -1634 0 obj << +1651 0 obj << /Type /Page -/Contents 1635 0 R -/Resources 1633 0 R +/Contents 1652 0 R +/Resources 1650 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1611 0 R +/Parent 1654 0 R >> endobj -1636 0 obj << -/D [1634 0 R /XYZ 85.0394 794.5015 null] +1653 0 obj << +/D [1651 0 R /XYZ 85.0394 794.5015 null] >> endobj -1633 0 obj << -/Font << /F37 799 0 R /F23 734 0 R >> +1650 0 obj << +/Font << /F37 803 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1639 0 obj << +1657 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1638 0 obj << +1656 0 obj << /Type /Page -/Contents 1639 0 R -/Resources 1637 0 R +/Contents 1657 0 R +/Resources 1655 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1611 0 R +/Parent 1654 0 R >> endobj -1640 0 obj << -/D [1638 0 R /XYZ 56.6929 794.5015 null] +1658 0 obj << +/D [1656 0 R /XYZ 56.6929 794.5015 null] >> endobj -1637 0 obj << +1655 0 obj << /ProcSet [ /PDF ] >> endobj -1643 0 obj << +1661 0 obj << /Length 1964 /Filter /FlateDecode >> @@ -7253,133 +7353,132 @@ i ­è×ØÚ:‰óÎÐÃBYn?z·XdÌqâd¾©Üä¤ÚNí:ørðï»QÕaáƒL·CÕMucVìâªV.Wª4 Û8Hü»Uoy)”@»Zìo+B)ˆ×­©ôD9ƒ©;B.ÊõTyåvÂ)Î6™îZds§¡ÁÓÏMí­µ°r=¶öä&vÓž®é^/yr€¡¶¯ÓP;«y Â1{9B€FãŸà{ËוÂM>p\×-ž‘7>å èWˆÌ¨WKÐÆ 5m"û¿À¥–€ã6WUŸÔž9ZØוå,¶VHbžþ‹'¯´=Í\¦pÀŸ'8TÃ[WyÌ#‰6Éyè5µÒÇî:4 ßál 3,•ßbÏ[œ+ªë/WF".ƒ›ËÊ?@”€/jŒu“1Ô¢+l',{_¼2ãâ•sä®ÏñÛªÊ ¿&–Bú–åç !G˜ ¥Ìrcø-Š¼ûãËü “¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀUßÄx³Q³Ô}\Wù¸·ö߶ -ߣ«ª]qöü´Þíâ³äZÄ^d{‘¡Éep …E\æÞ†Ræ·Þæ÷Í{wÿ¢BŒìendstream +ߣ«ª]qöü´Þíâ³äZÄ^d{‘¡Éep …E\æÞ†R–·Þæ÷Í{wÿ¢šŒîendstream endobj -1642 0 obj << +1660 0 obj << /Type /Page -/Contents 1643 0 R -/Resources 1641 0 R +/Contents 1661 0 R +/Resources 1659 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1652 0 R -/Annots [ 1650 0 R 1651 0 R ] +/Parent 1654 0 R +/Annots [ 1668 0 R 1669 0 R ] >> endobj -1650 0 obj << +1668 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [348.3486 128.9523 463.9152 141.0119] /Subtype/Link/A<> >> endobj -1651 0 obj << +1669 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [147.3629 116.9971 364.5484 129.0567] /Subtype/Link/A<> >> endobj -1644 0 obj << -/D [1642 0 R /XYZ 85.0394 794.5015 null] ->> endobj -590 0 obj << -/D [1642 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1645 0 obj << -/D [1642 0 R /XYZ 85.0394 576.7004 null] +1662 0 obj << +/D [1660 0 R /XYZ 85.0394 794.5015 null] >> endobj 594 0 obj << -/D [1642 0 R /XYZ 85.0394 576.7004 null] +/D [1660 0 R /XYZ 85.0394 769.5949 null] >> endobj -1646 0 obj << -/D [1642 0 R /XYZ 85.0394 548.3785 null] +1663 0 obj << +/D [1660 0 R /XYZ 85.0394 576.7004 null] >> endobj 598 0 obj << -/D [1642 0 R /XYZ 85.0394 548.3785 null] +/D [1660 0 R /XYZ 85.0394 576.7004 null] >> endobj -1647 0 obj << -/D [1642 0 R /XYZ 85.0394 518.5228 null] +1664 0 obj << +/D [1660 0 R /XYZ 85.0394 548.3785 null] >> endobj 602 0 obj << -/D [1642 0 R /XYZ 85.0394 460.6968 null] +/D [1660 0 R /XYZ 85.0394 548.3785 null] >> endobj -1648 0 obj << -/D [1642 0 R /XYZ 85.0394 425.0333 null] +1665 0 obj << +/D [1660 0 R /XYZ 85.0394 518.5228 null] >> endobj 606 0 obj << -/D [1642 0 R /XYZ 85.0394 260.2468 null] +/D [1660 0 R /XYZ 85.0394 460.6968 null] >> endobj -1649 0 obj << -/D [1642 0 R /XYZ 85.0394 224.698 null] +1666 0 obj << +/D [1660 0 R /XYZ 85.0394 425.0333 null] >> endobj -1641 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F11 1384 0 R /F41 935 0 R >> +610 0 obj << +/D [1660 0 R /XYZ 85.0394 260.2468 null] +>> endobj +1667 0 obj << +/D [1660 0 R /XYZ 85.0394 224.698 null] +>> endobj +1659 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F11 1400 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1655 0 obj << +1672 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1654 0 obj << +1671 0 obj << /Type /Page -/Contents 1655 0 R -/Resources 1653 0 R +/Contents 1672 0 R +/Resources 1670 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1652 0 R +/Parent 1654 0 R >> endobj -1656 0 obj << -/D [1654 0 R /XYZ 56.6929 794.5015 null] +1673 0 obj << +/D [1671 0 R /XYZ 56.6929 794.5015 null] >> endobj -1653 0 obj << +1670 0 obj << /ProcSet [ /PDF ] >> endobj -1659 0 obj << -/Length 2543 +1676 0 obj << +/Length 2544 /Filter /FlateDecode >> stream -xÚuYYsÛ8~ϯð[誑ÂûØ7[ÎádìrYÎNÕnö"! k’`ÒŠæ×O7ºyØéTJ@£hôñuƒö.\øç]¤ÑÚ ²ð"ÉÂuäzÑE^½s/°öùÇ•²8T²îf²Þ:‹¢A6Ö^yƒì$Mú]·JîiøE™N·gšh&vGIƒ›û- D]°èíý \dë,öc>Ӈ˹!ë[vGÝŽ d¼ ~ø~gx©óÃuý\‰)´¶»ôyPu­êQ¬6sñ] UÓø^TLÝžM'+Éó¾mñ‰ú©3ð{YÊT÷V¯¦ß•*Òõx4ÜoEv%K>~Ú B'óÝßhÄ– -\Ó±8 ØãràÔòD3h Ä“0D,¤É[µ³:Ýê dÐ9 QÔ€EÒÔ'{)Áúrø®óɪ¢«q—µÑ$”ÄêY_ÝÔ'ÿ=>\f¾sUË"' Á_‘k/ƒ“†® -¦6pkK­é·ç÷'‘s[w²…-@Ø£åÌ­ßp,XBšÎÞ'h7ü•¿Ù*Œpv -÷Ãa…|‘¥nl Ø-H±ÈZyá6µ¨€÷ƒ( -RÜŠ1ÏuL~”6`l ¿‚~ZѨ¢<ÓCƒÚ̓ý¬j¢$¸æI·ÏÌ]¿(òAw·øYìÜÛ€eö¢ç9'ÉQ³m§Vu´:Åìe/¡P5G*@'ëR¢tGÑ­Ò…Â<x)aA· -’ r”OœBç=Á 1j"«¢ºÑpQɧUäzý"GöÄÙ G,ØÝfS6ä ÐBdz˜€z²Ó„Q™DÏ B0q¶Ah3>£Œ7«®sÙØ£FfÁ'‘«RuJãÆÕùö‘]ôçÛ/¨N‡ÝVM)gQø|$¶Ì­} 8Épat*ÌÒ¹Ã^‰©€ck ˜Ö…/ ‘úf8ùtTù‘w)Ë¥áZ½RÜ0†Oå:»^•˜Ã&Ù:v3*LO„Y‰ÅèÖt4™\a¼°[`\ÃÈÈö®ž„Ž—ÌÉAM´Ěû«„Ä„ €É,Ö£ÄvFø[vAé÷Aô´QêÜéüY4²³Álˆ†±ˆC¶ýB=ù¸!‚nÌÊw‰P‰ü¨jiˆ¯ÔàbºHêØ슆 Â÷ZÁµêμûž¶ºž–Ï܈RvµïY×ÛæÕ¨äjµ¤½¬s«I˜ŒéT×wìDDåïÛÍêv{K‹<õ0Ø>Þá0(î9±Þs@ܘe·ž«„D±é Ønu»ÁƒÖÄqE?cÔq,¦…îÀ³ÆúE£ÁĘŽAÄ)ôkÙ>ËRži6”šQÑÇÑ í%"Û2R¡q¼µ2$Q†£5ÄÞÞ3Xßñ±bɾ¾Ûºù~­(z‚Hׇ î †FX³Á¿,0x,ã&þ,<^ NÖÀY_Ö# ÆÃkfÝOUÿÕ‰[¸‘{Y›åj_¼ˆ1î𥑈6Hy ÿ/óŽ#窀Š -ã”U#7Cã@Q²€.ÿ¾ô™Ñ„K ÷yIJ­¥¥tG6µí a)\§ë€Ö&tÅŒ‚þ[år Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ópBµÙ>~æÜpËBtG‰ãÉYxEìÅbè á¥…9`°8#Û–8Ϲ6aù/3!(¬ÝˆUÐâ£:J¼TœpŠq«ëÄLM³ÿ@ÏM •($Ñì]€B‰±c€2i ?P‡nþmD4“Ç v;)*¼Q¾Ý3,$¶×`(‡æJý× éz`ê„Þw§Y1J†|%\‹B¡kùüEÙi¸U³“eÉJ}“/Ë…ü¦¯KÑX%=›4øªQÕ‘¢®óñg¯,•Ä²áŽg k ¥TŸ%#.Q=( ‚ש©ö¦7F ŸgàÑ[¦Ã–è@±¸ˆ$ŸægH@Ä%²ZI(Ž":ž( 6SaUŸiQc¢õFêƆEiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡›MÔºõÁùˆ4òK®øbðج–S€¼V(Ø&ˆ0ð[P£ ÄNg[iÝÑÒF´åêNuЧ—%KÞ©gI«w}o }U¯K­yHÝ2Ž"ÛüÁ×ý ÆŠýô3À‹¬ÉC–Påú‘?{°GÉÏæ#Sð¹c"ˆ£oë¥yó–þ®‚¸åé·žøqsˆ™Ìy™Àfá:ã¤m,ßû¶¿š°f¬…´íº¥®ÙÀoçÁâgþe5ñÐ7þùçìÀשŸ%ÃF¨g–½=mü‹Áßû j•¢Zendstream +xÚuY[sÛ¸~ï¯È[•™µ««e·Äé%í&“‰Ó³3çô<ÐmóDUQŠëýõ  ¤dµÓé˜Äå¨>ü .ÖÉÒ²ø"ÍâeâÉE^½ó/°öù]À4ºÈ–Ù*\ñ™!\ÎYß²;êþp™(ãí`ð# c8#X{?|?Ì•(‘Bk»ËÀ“Uת>Åj3¿Ñ•P5ïEÅÔíÙt²b‘<ïÛ¨o´ö­ù “êÞêÕô»Rå¢SºŽ†;â­È®dÉÇO4Bìe¡ÿØR±—k:grXŽ¼Zžˆbœ¶@< CÄBš¼U;«3ЭÎ@#%B Xd½‰ÄžAJ´¼\D¡ï}²ªèjØ%fm4‰%µú'VÁW7 É—Yè]Õ²ƒÈÉbðWâÛËड«‚© ÜÚ’pkú-Äù½ÁIâÝÖla hy'së7 –¦³7Ç Ú å¯F¶ +#œ‚Ľ;¬/²Ô »)–X+Ïܦð~EAŠC1øžÉÒŒ­‘áWÐO+U”gš€B`hC»  ŸUM”Ä×<éö™¹ëE>¨ñà–0[y÷6`™½ÞIrÔÌDÛ©U]'­N+örR¨š£  “Ωu)Qº£èˆVéBaž9^ +FXЭ‚dƒ\#åS¯ÐyOpBŒšÈª†¨n4\Tòi¹^¿È=õvÂÀ3v·Ù”¹<ƒZˆLPO–`š8I9³€øQ &ŽÀ6 CÆg”ñf±Ñu.{4ÐÈ,0ø$rUªNIƒb¼Ã°:Ý>±‹átûÕé°Ûª)å$ +£ÄÁ¶‘¹µ/!. N…Ùzê°Wâ.pl „ÓÁº°â…!R߸“OG•y—²œ ™®Õ+Å cøˆP¾·ëU é6É–+?£ÂôD˜•ZŒnMG“Ñu Æ »Æ51ŒŒl_àêiìYpɼÔ$LK­¹¿JH\ç d`L'±ž¤žÛáoAØAv¦ßÑcÐ&kïNçÏ¢‘ fC4„ˆ¹@tÙJ\ô õäã†Ovº1‹Ð'B%ò£ª¥!¾Rƒ‹é"kÏfWâ‚ßk×6ª;óî{bØêxZ>s#JÚÕJ¼g]ok˜WƒZ «Åœö²Î­&q2¦S]ß±•¿o7‹Ûí-a,òPÔÃ`ûxKl„àxàYÄzÏq?`–Ýzª6Åƃ`»ÅýíZÇý QÇ0˜º£À뜉1£„Sèײ}–¥<ÓÌ•šQÑÇ‘†Èö‰m ™)€Ð8HÞÚF’‡(ÉњGboï¬ïøX1ç‡a_ßÀmý€ü ¿‡V=A¤B÷C#¬Ù`_ +¼ +–a“p¯Gkଯ ëÃá5³îǪÿêÄ- ÜȽ¬Í|µ/^ÄwxÒH‚ +D¤<ÐÎÿ—yÇ‘sU@E…ÎqÌ*Š‘×8P”Ì Ë¿/@f4áRÊ}^º¦ÖÒRº#›Úv°/×ˈÖFtÅŒ‚þ[åSr Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ñpJµÙ>~æÜpËLtGY­Fgá±[A —(-̃ÅÙ¶Ä ˜Þ°)Ëx™AaíF¼¨‚ÕáPâ¥V)§8·º>@ÌÔ4ûôÜÄP‰BÍÞ(dv P&máªëæßFD3zœ`·“¢ÂEàÛ=ÃBj{ †rh®ÔÐq½ ‘®³«zß&Å(uùJ¸8…B×ò5ø?Š²9Òp#ªf'Ë’•ú&_æ ùM_—¢±J6iðU£ª#E}ïãÏ^5X*‰eÃÏÖJ©>KF\¢P¯SSŒo&Œ>Ï! ·LÝ–è@±¸ˆ¤ægH@Ä9³ZI( Ž:ž()6Sq +UŸiQc¢õFêƆEiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡šMÔºõÁùˆ4òs®øbðج–×y­P°M”`à· FAˆ½Ž¼m¥uGKÑ–‹;ÕAŸ^–,y§ž%­Þõ½1,ôUUD¼.µæ!u[È8ˆló#_÷'k®ÿ1,°Èq‘<Äa U®ßù³{”ül>Â1¥ƒÏéD}ãX/Í›·ô(òÄ-O¿õÄ7‹›.f2ïeO˜ÅËŒ¶±|ïÛþjÄJ˜±Ò¶ë–BºfÓ„È^'Dö6!2‹Šµ>¹Õª?DZ…Ú™ðì DðFÍ\¥Pà1ª~)‰ÅïšVýØ^ .-㤎Í°·ÁqÏGß5p’³:ñLðÊçaAêð0xšnþ5cµN¼‡£*itUV`+c!ž¡z'[´Úzå},ÿdêUi‘دšèœ7³v«êœÈu{d¤ÌcIÀýj~ÅžXfQ‹gR`sdß׳=¥±iˆ%†zߊêÁïªÂ÷UY*»bI뎺,hùAØ7{pä‘Å?õ°–ˆV¸M¯jjK€ü­? % ÊGË _¾(XàëÿšV@%Ÿ£J4ËÝh^ý]žÔ‹f6×níƒ+LÍìS2vDN?š`®…8ä9H3ð`3zø…$ÛVÂïå4ýˆÕÕHƒ®\Büu|-Fc˜¤ë\5¢œs²knTuü×tè«ÊeÁ?Mä' ÁÙX€p†h¨k.æÍâõñkMb q‘ÌB° ƒiû†sk(ß½üdÚÿÃlhßp²ÑoC;àÐn;Õ£ž»¿¨Î…?^Uè&ŠÌ(\¹'HðêÑáC5mWp}cŒ‡XÉ„?)â’éÀ9–ÜI[(‘î¾›¨Â^5ðù©‡m7ïÍlŠR͇蕽M|1x: t´yãizaÁSBïHæ >Ëíé±³Oâ"HÓȃ…×UØNÉø©|hÑçò Å™X]ÖÌ=Î÷¯»"L1œ¬ù‹Oï×WHÎÔšæÝǧá#¾û4á·óhö3¿cYŒ<ôú9¢wEYà6B=?x{Üð'ƒ¿Ÿ÷¢nendstream endobj -1658 0 obj << +1675 0 obj << /Type /Page -/Contents 1659 0 R -/Resources 1657 0 R +/Contents 1676 0 R +/Resources 1674 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1652 0 R ->> endobj -1660 0 obj << -/D [1658 0 R /XYZ 85.0394 794.5015 null] ->> endobj -610 0 obj << -/D [1658 0 R /XYZ 85.0394 769.5949 null] +/Parent 1654 0 R >> endobj -1661 0 obj << -/D [1658 0 R /XYZ 85.0394 573.5449 null] +1677 0 obj << +/D [1675 0 R /XYZ 85.0394 794.5015 null] >> endobj 614 0 obj << -/D [1658 0 R /XYZ 85.0394 573.5449 null] +/D [1675 0 R /XYZ 85.0394 769.5949 null] >> endobj -1662 0 obj << -/D [1658 0 R /XYZ 85.0394 539.0037 null] +1678 0 obj << +/D [1675 0 R /XYZ 85.0394 573.5449 null] >> endobj 618 0 obj << -/D [1658 0 R /XYZ 85.0394 539.0037 null] +/D [1675 0 R /XYZ 85.0394 573.5449 null] >> endobj -1663 0 obj << -/D [1658 0 R /XYZ 85.0394 510.2426 null] +1679 0 obj << +/D [1675 0 R /XYZ 85.0394 539.0037 null] >> endobj -1657 0 obj << -/Font << /F21 710 0 R /F23 734 0 R >> +622 0 obj << +/D [1675 0 R /XYZ 85.0394 539.0037 null] +>> endobj +1680 0 obj << +/D [1675 0 R /XYZ 85.0394 510.2426 null] +>> endobj +1674 0 obj << +/Font << /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1666 0 obj << +1683 0 obj << /Length 2810 /Filter /FlateDecode >> @@ -7391,66 +7490,66 @@ e çÑD”’-Ê:3–êv¢¡Pc^4ßL2…%æâVº³Ühò„ò4c­ô¤ˆRÊ]€Ñ–\ŠV7fžYæ¥ÇˆDJ;`XÌxäøñHÒˆ%,ëñ±ú¸ˆ0×kSìèÒØú7¥ŸMñ¬Â½³ ×j´.Þ T+(’m|ik»sPÛ` JÛ­âb¼Ý¦Õ{—BƒR)=UŽ“Ò‚hl˜gé>]aMƒ×,9DF]„e-+à¨îû–+8©¾rÑDcfÔÒh@Õ¿3zr‚ÞµRÐ4…‰HàÐNv&¦hñçTWâ †î.…}¦ÚYù°ÀÜG¶ƒˆ¤ud½˜.¦‰…ßeª5þ05…ÝÇz—Zj]4ƒ “w1Š\0húÃ|[Júó‡åã”$¤QŒ<9m» ÀDX+вI‰Nɘƒ—q€/ÖSt¯ZÈ‘ûAÃîH³ÿm!o€~½×ßt…¤ º2{Ž«@ØL…‘ú·ã£D£ú{VÕPŸïr¹Ëè{††>PKŒÀiŒZ•ÓZzhk¬I²rÆTCgl‘$Ö·aTìö¥ÚYm›šJ£²Ýb^`”–5ýv¬àdЮ&œ'à·7En¡öØ\­S('iÒi¯é·RpÕuÚ¼ž àk± ž_O…"èŠÌÖ'ãVnTFíŠÍ–KŠ²®¹{-‹/êªkåH½¢”¶öõ\W\å«øʃßä*u]Qã{µV±¸òVÒ›Hh‹ŽÎDÉ–Gaè‹ðµÆ8QF:¡ÕëÖÄÓ³2XÈܽ]†ÔÏ¡2bø;÷ßú‚ÞJtMël†xü–ÃgmÓgEhE••*>zˆÂƒ¶ÐéO¾m»Î´ë]4k~EŠÍÁ;4%¤NŠÂËëy Œ³º4†xÑÿ}uõ'ºÒÐþ˜„„/?º£ET‚2e-L^ˆç­Œ›äN)–LÊ[3ªÅBc´ÇeefΊÃÇžøL*47ÂŒºš²êªÑcßü¾‡É/ïA¶¢Þ4é~ûÚÄŽ­§ÃUaYyTiò^/¾ý""»‘Gqʶ kûèõ¡Þa€<Ž@«£¿ïqäiìØ@:ļΖ"´ZtÀɶ¡?|F0·m ~B}×Eã„Ö]ÉÞ¡M7€éæ‚Fý+¬ïÁí ½5ºÂ5æaŸ6|šq˜ÐëA¤S‘ônhaЫg#ˆV˜ilÚqø…Ë·­(„á´ª[Óà2àdƒûÚ“9òŸóv¼LZ•Ï–\'NrÓQT&1À;Þ3Y¶÷j†+~Sm vRM“—ç V¸_hvK%OÆ1e¼»YÞrîMlk‘ă,ómúOm?‹çŸ¸ÙÓ"Ñú„ôÂ@•ÒâwÖÞÊz…±rp3 ûöû\p©z»|à;Ù^Mdûu»¿º¼|yyA8….•.‹ja¬t‰­¾qý`èúÂOàZ…¶þ -Ä“N"\‹ä´_ùaEŒóŠÈ¶Å>þtâ¾%AlZv&>}ë å/3;ú±ÿîÑíX ·˜ïþðàSÊ#u UßwÈk/ùó‘ÿ8ŽŽø;úÓaò4RÆ)5äé/SyW01bŒ‰®ôÒ=<žÚ ¢¡'ñf ßµ8…¶ˆê½W¶-±O,Ý"x‹õbšé‰oi©í'ç´°OªC—íèýR­Fþ{¤²~¶¡éáÄBßñ}zÒqEðÇ^d7,†;Nè„®©ÚÞ‰T»vêfsÙ¬³ßñÜÈI\yÌÕ‘ïtX§¬ŒqJí-߉œÈ£áÏqz7!Ø$MÓ’3Ðo}ᔃŸ%'äp»Äü?ýì?s2Ž½é›^À 13…@î?aÝ~'=åý¿xÇðBendstream +Ä“N"\‹ä´_ùaEŒóŠÈ¶Å>þtâ¾%AlZv&>}ë å/3;ú±ÿîÑíX ·˜ïþðàSÊ#u UßwÈk/ùó‘ÿ8ŽŽø;úÓaò4RÆ)5äé/SyW01bŒ‰®ôÒ=<žÚ ¢¡'ñf ßµ8…¶ˆê½W¶-±O,Ý"x‹õbšé‰oi©í'ç´°OªC—íèýR­Fþ{¤²~¶¡éáÄBßñ}zÒqEðÇ^d7,†;Nè„®©ÚÞ‰T»vêfsÙ¬³ßñÜÈI\yÌÕ‘ïtX§¬ŒqJí-߉œÈ£áÏqz7!Ø$MÓ’3Ðo}ᔃŸ%'äp»Äü?ýì?s2Ž½é›^À 13…×;aÝ~'=åý¿yðDendstream endobj -1665 0 obj << +1682 0 obj << /Type /Page -/Contents 1666 0 R -/Resources 1664 0 R +/Contents 1683 0 R +/Resources 1681 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1652 0 R -/Annots [ 1670 0 R 1671 0 R ] +/Parent 1654 0 R +/Annots [ 1687 0 R 1688 0 R ] >> endobj -1670 0 obj << +1687 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [253.7995 149.3637 417.685 161.4234] /Subtype/Link/A<> >> endobj -1671 0 obj << +1688 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 110.455 208.8999 120.6168] /Subtype/Link/A<> >> endobj -1667 0 obj << -/D [1665 0 R /XYZ 56.6929 794.5015 null] ->> endobj -622 0 obj << -/D [1665 0 R /XYZ 56.6929 662.0717 null] ->> endobj -1668 0 obj << -/D [1665 0 R /XYZ 56.6929 624.1661 null] +1684 0 obj << +/D [1682 0 R /XYZ 56.6929 794.5015 null] >> endobj 626 0 obj << -/D [1665 0 R /XYZ 56.6929 624.1661 null] +/D [1682 0 R /XYZ 56.6929 662.0717 null] >> endobj -1137 0 obj << -/D [1665 0 R /XYZ 56.6929 593.0972 null] +1685 0 obj << +/D [1682 0 R /XYZ 56.6929 624.1661 null] >> endobj 630 0 obj << -/D [1665 0 R /XYZ 56.6929 294.2701 null] +/D [1682 0 R /XYZ 56.6929 624.1661 null] >> endobj -1669 0 obj << -/D [1665 0 R /XYZ 56.6929 255.4568 null] +1143 0 obj << +/D [1682 0 R /XYZ 56.6929 593.0972 null] >> endobj 634 0 obj << -/D [1665 0 R /XYZ 56.6929 255.4568 null] +/D [1682 0 R /XYZ 56.6929 294.2701 null] >> endobj -965 0 obj << -/D [1665 0 R /XYZ 56.6929 226.1045 null] +1686 0 obj << +/D [1682 0 R /XYZ 56.6929 255.4568 null] >> endobj -1672 0 obj << -/D [1665 0 R /XYZ 56.6929 53.5688 null] +638 0 obj << +/D [1682 0 R /XYZ 56.6929 255.4568 null] >> endobj -1673 0 obj << -/D [1665 0 R /XYZ 56.6929 53.5688 null] +970 0 obj << +/D [1682 0 R /XYZ 56.6929 226.1045 null] >> endobj -1664 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R /F53 1027 0 R /F11 1384 0 R /F41 935 0 R >> +1689 0 obj << +/D [1682 0 R /XYZ 56.6929 53.5688 null] +>> endobj +1690 0 obj << +/D [1682 0 R /XYZ 56.6929 53.5688 null] +>> endobj +1681 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F39 900 0 R /F53 1032 0 R /F11 1400 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1676 0 obj << +1693 0 obj << /Length 2825 /Filter /FlateDecode >> @@ -7465,682 +7564,682 @@ xÚµZ]{ ´ ¸ ¤ƒùÈ ’Tï*ÓªA<—Ǻ·ÃÐû"Âa‡˜%(ŒÏ´’–Û µ9Te>#ôá¶6Ø6Ay2¾b$´ÌHÜ)³|Þ‰zA 4lY3ª#Óò`ï§6c¿ŒI0‚¶Æ¾[g;µú,{Ù•oúùFÿÍ+”Ÿë¯’ù Ø.…‚1¦‘•ß‹WñÈÌvìï&}•/\ u˜sê 8˜$Ðk“3©-å¡ZKY\{h½ÐÙ}lÛ6ø´Üïå®+Ö›­ßÁä\²Z*)#ý&ÇÍ:±¦‚ñwù·á£s£˜cû‰†Íçƒb‘÷Ç}ªO]žkÓçÁj%¬¼SƒS5ø´‰3zÝÏÞs–äWœ¹Ïw;sâû}&ÁDÂ(ò[„%ä6-Ô~P‘xN|¸­9ô‡­ÁF^d‡\•<ÛkÒlIdu¾ª2!³ðôtÖÅ:Úsq\û½I$Ø‚?Sÿ[Bn…k¡6ãû>ûòᶠ-ï+ÜF6Þuþ}^=gÛô5Õ Œ@õµ®­Ñ LKç„ }RÛˆÈBFo_#y5Y«YÈ°ƒŽAóañEXûDó*å!¯¶yJIŒ/…—(™»¼Øg¹vB½fgÉ>ÜprªÅ'¸ª LnÿË_úZ;‡1¢Iâ8L£Ð|Rʱ~)ñ+ppò!²ù&øôÝÿ ‡ÿb¿endstream +ï+ÜF6Þuþ}^=gÛô5Õ Œ@õµ®­Ñ LKç„ }RÛˆÈBFo_#y5Y«YÈ°ƒŽAóañEXûDó*å!¯¶yJIŒ/…—(™»¼Øg¹vB½fgÉ>ÜprªÅ'¸ª LnÿË_úZ;‡1¢Iâ8L£Ð|Rʱ~)ñ+p@û¯n¾ >}÷ÿˆWbÁendstream endobj -1675 0 obj << +1692 0 obj << /Type /Page -/Contents 1676 0 R -/Resources 1674 0 R +/Contents 1693 0 R +/Resources 1691 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1652 0 R ->> endobj -1677 0 obj << -/D [1675 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1678 0 obj << -/D [1675 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1679 0 obj << -/D [1675 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1680 0 obj << -/D [1675 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1681 0 obj << -/D [1675 0 R /XYZ 85.0394 746.3107 null] ->> endobj -1682 0 obj << -/D [1675 0 R /XYZ 85.0394 731.5461 null] ->> endobj -1683 0 obj << -/D [1675 0 R /XYZ 85.0394 728.1497 null] ->> endobj -1684 0 obj << -/D [1675 0 R /XYZ 85.0394 713.3851 null] ->> endobj -1685 0 obj << -/D [1675 0 R /XYZ 85.0394 709.9887 null] ->> endobj -1686 0 obj << -/D [1675 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1081 0 obj << -/D [1675 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1687 0 obj << -/D [1675 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1688 0 obj << -/D [1675 0 R /XYZ 85.0394 648.8377 null] ->> endobj -1689 0 obj << -/D [1675 0 R /XYZ 85.0394 634.0731 null] ->> endobj -1690 0 obj << -/D [1675 0 R /XYZ 85.0394 630.6767 null] ->> endobj -1691 0 obj << -/D [1675 0 R /XYZ 85.0394 615.9121 null] ->> endobj -1692 0 obj << -/D [1675 0 R /XYZ 85.0394 612.5156 null] ->> endobj -1693 0 obj << -/D [1675 0 R /XYZ 85.0394 585.7959 null] +/Parent 1750 0 R >> endobj 1694 0 obj << -/D [1675 0 R /XYZ 85.0394 582.3994 null] +/D [1692 0 R /XYZ 85.0394 794.5015 null] >> endobj 1695 0 obj << -/D [1675 0 R /XYZ 85.0394 567.6349 null] +/D [1692 0 R /XYZ 85.0394 752.3015 null] >> endobj 1696 0 obj << -/D [1675 0 R /XYZ 85.0394 564.2384 null] +/D [1692 0 R /XYZ 85.0394 752.3015 null] >> endobj 1697 0 obj << -/D [1675 0 R /XYZ 85.0394 549.5337 null] +/D [1692 0 R /XYZ 85.0394 752.3015 null] >> endobj 1698 0 obj << -/D [1675 0 R /XYZ 85.0394 546.0774 null] +/D [1692 0 R /XYZ 85.0394 746.3107 null] >> endobj 1699 0 obj << -/D [1675 0 R /XYZ 85.0394 531.3128 null] +/D [1692 0 R /XYZ 85.0394 731.5461 null] >> endobj 1700 0 obj << -/D [1675 0 R /XYZ 85.0394 527.9163 null] +/D [1692 0 R /XYZ 85.0394 728.1497 null] >> endobj 1701 0 obj << -/D [1675 0 R /XYZ 85.0394 513.1518 null] +/D [1692 0 R /XYZ 85.0394 713.3851 null] >> endobj 1702 0 obj << -/D [1675 0 R /XYZ 85.0394 509.7553 null] +/D [1692 0 R /XYZ 85.0394 709.9887 null] >> endobj 1703 0 obj << -/D [1675 0 R /XYZ 85.0394 483.0356 null] +/D [1692 0 R /XYZ 85.0394 651.9592 null] +>> endobj +1086 0 obj << +/D [1692 0 R /XYZ 85.0394 651.9592 null] >> endobj 1704 0 obj << -/D [1675 0 R /XYZ 85.0394 479.6391 null] +/D [1692 0 R /XYZ 85.0394 651.9592 null] >> endobj 1705 0 obj << -/D [1675 0 R /XYZ 85.0394 464.8745 null] +/D [1692 0 R /XYZ 85.0394 648.8377 null] >> endobj 1706 0 obj << -/D [1675 0 R /XYZ 85.0394 461.4781 null] +/D [1692 0 R /XYZ 85.0394 634.0731 null] >> endobj 1707 0 obj << -/D [1675 0 R /XYZ 85.0394 446.7135 null] +/D [1692 0 R /XYZ 85.0394 630.6767 null] >> endobj 1708 0 obj << -/D [1675 0 R /XYZ 85.0394 443.3171 null] +/D [1692 0 R /XYZ 85.0394 615.9121 null] >> endobj 1709 0 obj << -/D [1675 0 R /XYZ 85.0394 428.5525 null] +/D [1692 0 R /XYZ 85.0394 612.5156 null] >> endobj 1710 0 obj << -/D [1675 0 R /XYZ 85.0394 425.156 null] +/D [1692 0 R /XYZ 85.0394 585.7959 null] >> endobj 1711 0 obj << -/D [1675 0 R /XYZ 85.0394 355.0758 null] +/D [1692 0 R /XYZ 85.0394 582.3994 null] >> endobj 1712 0 obj << -/D [1675 0 R /XYZ 85.0394 355.0758 null] +/D [1692 0 R /XYZ 85.0394 567.6349 null] >> endobj 1713 0 obj << -/D [1675 0 R /XYZ 85.0394 355.0758 null] +/D [1692 0 R /XYZ 85.0394 564.2384 null] >> endobj 1714 0 obj << -/D [1675 0 R /XYZ 85.0394 352.0499 null] +/D [1692 0 R /XYZ 85.0394 549.5337 null] >> endobj 1715 0 obj << -/D [1675 0 R /XYZ 85.0394 337.3452 null] +/D [1692 0 R /XYZ 85.0394 546.0774 null] >> endobj 1716 0 obj << -/D [1675 0 R /XYZ 85.0394 333.8889 null] +/D [1692 0 R /XYZ 85.0394 531.3128 null] >> endobj 1717 0 obj << -/D [1675 0 R /XYZ 85.0394 309.8192 null] +/D [1692 0 R /XYZ 85.0394 527.9163 null] >> endobj 1718 0 obj << -/D [1675 0 R /XYZ 85.0394 303.7727 null] +/D [1692 0 R /XYZ 85.0394 513.1518 null] >> endobj 1719 0 obj << -/D [1675 0 R /XYZ 85.0394 278.3282 null] +/D [1692 0 R /XYZ 85.0394 509.7553 null] >> endobj 1720 0 obj << -/D [1675 0 R /XYZ 85.0394 273.6565 null] +/D [1692 0 R /XYZ 85.0394 483.0356 null] >> endobj 1721 0 obj << -/D [1675 0 R /XYZ 85.0394 246.9367 null] +/D [1692 0 R /XYZ 85.0394 479.6391 null] >> endobj 1722 0 obj << -/D [1675 0 R /XYZ 85.0394 243.5403 null] +/D [1692 0 R /XYZ 85.0394 464.8745 null] >> endobj 1723 0 obj << -/D [1675 0 R /XYZ 85.0394 173.5556 null] +/D [1692 0 R /XYZ 85.0394 461.4781 null] >> endobj 1724 0 obj << -/D [1675 0 R /XYZ 85.0394 173.5556 null] +/D [1692 0 R /XYZ 85.0394 446.7135 null] >> endobj 1725 0 obj << -/D [1675 0 R /XYZ 85.0394 173.5556 null] +/D [1692 0 R /XYZ 85.0394 443.3171 null] >> endobj 1726 0 obj << -/D [1675 0 R /XYZ 85.0394 170.4341 null] +/D [1692 0 R /XYZ 85.0394 428.5525 null] >> endobj 1727 0 obj << -/D [1675 0 R /XYZ 85.0394 144.9896 null] +/D [1692 0 R /XYZ 85.0394 425.156 null] >> endobj 1728 0 obj << -/D [1675 0 R /XYZ 85.0394 140.3179 null] +/D [1692 0 R /XYZ 85.0394 355.0758 null] >> endobj 1729 0 obj << -/D [1675 0 R /XYZ 85.0394 113.5982 null] +/D [1692 0 R /XYZ 85.0394 355.0758 null] >> endobj 1730 0 obj << -/D [1675 0 R /XYZ 85.0394 110.2017 null] +/D [1692 0 R /XYZ 85.0394 355.0758 null] >> endobj 1731 0 obj << -/D [1675 0 R /XYZ 85.0394 95.4372 null] +/D [1692 0 R /XYZ 85.0394 352.0499 null] >> endobj 1732 0 obj << -/D [1675 0 R /XYZ 85.0394 92.0407 null] +/D [1692 0 R /XYZ 85.0394 337.3452 null] >> endobj -1674 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> -/ProcSet [ /PDF /Text ] +1733 0 obj << +/D [1692 0 R /XYZ 85.0394 333.8889 null] >> endobj -1735 0 obj << -/Length 2889 -/Filter /FlateDecode ->> -stream -xÚµšMsÛ8†ïþ:JU1†øy¤-ÅVb+^ÉÎÎT&Z‚c–)Ò©$þ÷Û >R$˜Ù­-LM¼tÝ$ž8ð‡'žüˆD“ r‘ç`o²ÝŸ9“oÐwu†¥Í¹2:7­.îÏþxOƒI„"Ÿø“û'c¬9aˆ'÷»/ÓQ4ƒœéÅòâfùéjß]ÿ5;'ž3ýÛñœx56WW‹ÍýB~\/âùru&xvø‘3ïî«ùòOÑóQÝz¹Ø̾Þ8[Üë¯mþ4ìPþ¿Ÿ}ùêLvð ?œ9ˆF¡7ù „£ˆLög®G‘çRªZ²³ÍÙ¿ô€Fo}kïTaê“ž¹"x‚1Š<´&Ë‹O ­'kÍÊâxØ29l[vâú~3ðöÊÊÁ_I1 -<ahX‰/Eû*+þ¾¬ß_bÒ¯]eLL‡Ø¥µÕ©6 mLä‘ ­½b?áçc:¯6âb½– ìoÇ!yZ¥E^ÏIç§`Ç…i¥>| >Ð;¸‹8ÓKô~‘)c,~°Ã ‡ÓçäPÕxz#»âú?™Þ&ûä¥(eïZö>dÙ>És9h’ïDóÝ “H ~[l_’WVR¸¾Ì„úJçbÿø´­ŠGø5eXt"ìG -}w„°i5LX[iÂã¶J7„O´{ ·´Xøé«M|§–=w¦í½˜A;ˆ‚ÈÀ öHü¿HiþM|˜øh²÷²ÈX–%òž.w˜Cú# + e¥9„ƒMÚàÐÕîç`jÇ|-Ó[–€;Á¥?}*¢mñ뵦ÁÊRL&tÞÛ„»ž°Xæ`¼× þ4•Õ3óbŸ¤²s•ìeë歬ؾ+u0òxm°R Þ+K~¤¥lk|:>ÏX’§,CˆX ·HÅoyk 5ìQY_K±>æLƒ†A{Ñ ¢#  + he¥AêX@Û¤ Ð]í~ЦöG&×øâ×ö9ɿɉ˜³Œ}SÛq'‘Û:\žÜzµé;Y…$2´}°RG§¸jí‘ݳ“…%Èuý1 -†•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý -?â7?Òù1Щsàží’º( -ü6¡¹$´HÊ*K^˜l¦µ£ïÞ©s±ðûgM,&†af0 †•…˜²2ˆb6iƒXW»Ÿ˜©½ÞÄÜÎ=ØYEXž(E_q@ü¿Ø&ÁFQã‚Z}ƒ¤Æ¯G¨ù -\'4v¹@`ã£Ø\ÇÄÆ?5ØÄaFÔÊ'­0ÝÐA>Lº¦i5 S[0-»Uºy¢Ý ³¥½©ŠC½KáˆN/ÙAlapød%osk†¼¯fÈCÞ(ò+Å[Œ0$aH;†ü~Îßkºžã)†Â¦^aüâ“4¾:îöG8ÔÊùŴ‰´ÿÄs]8Ç4 #° + leeÀŽ,°mÒì®v?lS›ÃNÄ>ŠsÁÙô©>µœ_³º2#zas,E*[dè ÐéС7[‹8K¡7”¡7jñ÷[¡×Ç'>,ú. çøÐƨVªÊª¡êZÎ1ViƒjW»Ÿª©=gU²}f»ÿfcÙ»QèÁ³K©ëýŸ·J -id„ý4¦Õ0m¥Ñ¡¥`•nÐœh÷¢ii×G›@ÕéBQ€…yŽ §¥QàÒÉž’é3¨òÕ`ZÊ€h• E×fÍ+3Ÿ‡|Î ¼ 1…ZȨ4%!Ï( ÝHÃE™ªX«leÅÆX-’÷ìñ0 §M6Ig¸DK}9$Ä#+À°²¬e¥W@„=Ë -°I+ «Ý¿Lí{Ôu]î‹5e×¥ÓøX=ö[½‰®»"ååÑÇ¡®â»ûµðOÞ_3æ}í¬“wÉä¤?ÈúžÛð†hÁSÃú.•®‘Wä‘ÊïlEÕ {…ø¡Ó;G -ÛðÈ‘·±±06Š ÅØ^-¢¿¶j?½F•t7×ñ90d6BäQ—Â-D‹L^àJj±ªÞ£z‹uõ7®G¶Ëx8›c°ˆ¿¤uæåE\#þò‚tò&™ª1ZP"¦}Ä Ç‘…£4j@KÝΦkì÷£4„ã&]ÉøZ?$üÑ`'¿¿IËJ¦ž"ö:íbo¸ùáé+‡²w7Jcðì··T#ôB^UlŸOj4V`qÅ‘˜a4 Li`^d) Øt`]á^`¦°¨¡†p"üU±¼¬ŸTÂ숚*ü/¯¯Å¡FË;ÑøƒJQ6‡F¿¯2`äø‘±ºÄ›n¸ãþ¹Ø‹|·^ÊÖëc -¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿa:L˜o©3†Ø°²0VVdK5Á*mPîj÷c6µ¯aÒ2ýœQ9ÛCþ’?ó®Ó<Ül|Oº\˵ËÞòFnu<0–Îwu,«ä©l2ÇÓíªg0­÷ .XÁ”ðƒ< -ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹ -…º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ãóa ±~ãcðÆÓÊ‚AYé´ŽbË®e•60tµû1˜Ú—YR–™> -.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñÑ08¼2ڮ嗪+ñ9ùêêßÓïþ–ùO[endstream -endobj 1734 0 obj << -/Type /Page -/Contents 1735 0 R -/Resources 1733 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1652 0 R +/D [1692 0 R /XYZ 85.0394 309.8192 null] +>> endobj +1735 0 obj << +/D [1692 0 R /XYZ 85.0394 303.7727 null] >> endobj 1736 0 obj << -/D [1734 0 R /XYZ 56.6929 794.5015 null] +/D [1692 0 R /XYZ 85.0394 278.3282 null] >> endobj 1737 0 obj << -/D [1734 0 R /XYZ 56.6929 748.5056 null] +/D [1692 0 R /XYZ 85.0394 273.6565 null] >> endobj 1738 0 obj << -/D [1734 0 R /XYZ 56.6929 748.5056 null] +/D [1692 0 R /XYZ 85.0394 246.9367 null] >> endobj 1739 0 obj << -/D [1734 0 R /XYZ 56.6929 748.5056 null] +/D [1692 0 R /XYZ 85.0394 243.5403 null] >> endobj 1740 0 obj << -/D [1734 0 R /XYZ 56.6929 743.7078 null] +/D [1692 0 R /XYZ 85.0394 173.5556 null] >> endobj 1741 0 obj << -/D [1734 0 R /XYZ 56.6929 719.6381 null] +/D [1692 0 R /XYZ 85.0394 173.5556 null] >> endobj 1742 0 obj << -/D [1734 0 R /XYZ 56.6929 711.8197 null] +/D [1692 0 R /XYZ 85.0394 173.5556 null] >> endobj 1743 0 obj << -/D [1734 0 R /XYZ 56.6929 697.0552 null] +/D [1692 0 R /XYZ 85.0394 170.4341 null] >> endobj 1744 0 obj << -/D [1734 0 R /XYZ 56.6929 691.8868 null] +/D [1692 0 R /XYZ 85.0394 144.9896 null] >> endobj 1745 0 obj << -/D [1734 0 R /XYZ 56.6929 665.1671 null] +/D [1692 0 R /XYZ 85.0394 140.3179 null] >> endobj 1746 0 obj << -/D [1734 0 R /XYZ 56.6929 659.9987 null] +/D [1692 0 R /XYZ 85.0394 113.5982 null] >> endobj 1747 0 obj << -/D [1734 0 R /XYZ 56.6929 635.929 null] +/D [1692 0 R /XYZ 85.0394 110.2017 null] >> endobj 1748 0 obj << -/D [1734 0 R /XYZ 56.6929 628.1106 null] +/D [1692 0 R /XYZ 85.0394 95.4372 null] >> endobj 1749 0 obj << -/D [1734 0 R /XYZ 56.6929 601.3909 null] ->> endobj -1750 0 obj << -/D [1734 0 R /XYZ 56.6929 596.2225 null] +/D [1692 0 R /XYZ 85.0394 92.0407 null] >> endobj -1751 0 obj << -/D [1734 0 R /XYZ 56.6929 569.5028 null] ->> endobj -1752 0 obj << -/D [1734 0 R /XYZ 56.6929 564.3344 null] +1691 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1753 0 obj << -/D [1734 0 R /XYZ 56.6929 549.6297 null] +/Length 2889 +/Filter /FlateDecode +>> +stream +xÚµšMsÛ8†ïþ:JU1†øy¤-ÅVb+^ÉÎÎT&Z‚c–)Ò©$þ÷Û >R$˜Ù­-LM¼tÝ$ž8ð‡'žüˆD“ r‘ç`o²ÝŸ9“oÐwu†¥Í¹2:7­.îÏþxOƒI„"Ÿø“û'c¬9aˆ'÷»/ÓQ4ƒœéÅòâfùéjß]ÿ5;'ž3ýÛñœx56WW‹ÍýB~\/âùru&xvø‘3ïî«ùòOÑóQÝz¹Ø̾Þ8[Üë¯mþ4ìPþ¿Ÿ}ùêLvð ?œ9ˆF¡7ù „£ˆLög®G‘çRªZ²³ÍÙ¿ô€Fo}kïTaê“ž¹"x‚1Š<´&Ë‹O ­'kÍÊâxØ29l[vâú~3ðöÊÊÁ_I1 +<ahX‰/Eû*+þ¾¬ß_bÒ¯]eLL‡Ø¥µÕ©6 mLä‘ ­½b?áçc:¯6âb½– ìoÇ!yZ¥E^ÏIç§`Ç…i¥>| >Ð;¸‹8ÓKô~‘)c,~°Ã ‡ÓçäPÕxz#»âú?™Þ&ûä¥(eïZö>dÙ>És9h’ïDóÝ “H ~[l_’WVR¸¾Ì„úJçbÿø´­ŠGø5eXt"ìG +}w„°i5LX[iÂã¶J7„O´{ ·´Xøé«M|§–=w¦í½˜A;ˆ‚ÈÀ öHü¿HiþM|˜øh²÷²ÈX–%òž.w˜Cú# + e¥9„ƒMÚàÐÕîç`jÇ|-Ó[–€;Á¥?}*¢mñ뵦ÁÊRL&tÞÛ„»ž°Xæ`¼× þ4•Õ3óbŸ¤²s•ìeë歬ؾ+u0òxm°R Þ+K~¤¥lk|:>ÏX’§,CˆX ·HÅoyk 5ìQY_K±>æLƒ†A{Ñ ¢#  + he¥AêX@Û¤ Ð]í~ЦöG&×øâ×ö9ɿɉ˜³Œ}SÛq'‘Û:\žÜzµé;Y…$2´}°RG§¸jí‘ݳ“…%Èuý1 +†•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý +?â7?Òù1Щsàží’º( +ü6¡¹$´HÊ*K^˜l¦µ£ïÞ©s±ðûgM,&†af0 †•…˜²2ˆb6iƒXW»Ÿ˜©½ÞÄÜÎ=ØYEXž(E_q@ü¿Ø&ÁFQã‚Z}ƒ¤Æ¯G¨ù +\'4v¹@`ã£Ø\ÇÄÆ?5ØÄaFÔÊ'­0ÝÐA>Lº¦i5 S[0-»Uºy¢Ý ³¥½©ŠC½KáˆN/ÙAlapød%osk†¼¯fÈCÞ(ò+Å[Œ0$aH;†ü~Îßkºžã)†Â¦^aüâ“4¾:îöG8ÔÊùŴ‰´ÿÄs]8Ç4 #° + leeÀŽ,°mÒì®v?lS›ÃNÄ>ŠsÁÙô©>µœ_³º2#zas,E*[dè ÐéС7[‹8K¡7”¡7jñ÷[¡×Ç'>,ú. çøÐƨVªÊª¡êZÎ1ViƒjW»Ÿª©=gU²}f»ÿfcÙ»QèÁ³K©ëýŸ·J +id„ý4¦Õ0m¥Ñ¡¥`•nÐœh÷¢ii×G›@ÕéBQ€…yŽ §¥QàÒÉž’é3¨òÕ`ZÊ€h• E×fÍ+3Ÿ‡|Î ¼ 1…ZȨ4%!Ï( ÝHÃE™ªX«leÅÆX-’÷ìñ0 §M6Ig¸DK}9$Ä#+À°²¬e¥W@„=Ë +°I+ «Ý¿Lí{Ôu]î‹5e×¥ÓøX=ö[½‰®»"ååÑÇ¡®â»ûµðOÞ_3æ}í¬“wÉä¤?ÈúžÛð†hÁSÃú.•®‘Wä‘ÊïlEÕ {…ø¡Ó;G +ÛðÈ‘·±±06Š ÅØ^-¢¿¶j?½F•t7×ñ90d6BäQ—Â-D‹L^àJj±ªÞ£z‹uõ7®G¶Ëx8›c°ˆ¿¤uæåE\#þò‚tò&™ª1ZP"¦}Ä Ç‘…£4j@KÝΦkì÷£4„ã&]ÉøZ?$üÑ`'¿¿IËJ¦ž"ö:íbo¸ùáé+‡²w7Jcðì··T#ôB^UlŸOj4V`qÅ‘˜a4 Li`^d) Øt`]á^`¦°¨¡†p"üU±¼¬ŸTÂ숚*ü/¯¯Å¡FË;ÑøƒJQ6‡F¿¯2`äø‘±ºÄ›n¸ãþ¹Ø‹|·^ÊÖëc +¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿa:L˜o©3†Ø°²0VVdK5Á*mPîj÷c6µ¯aÒ2ýœQ9ÛCþ’?ó®Ó<Ül|Oº\˵ËÞòFnu<0–Îwu,«ä©l2ÇÓíªg0­÷ .XÁ”ðƒ< +ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹ +…º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ãóa ±~ãcðÆÓÊ‚AYé´ŽbË®e•60tµû1˜Ú—YR–™> +.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñÑ08¼2ڮ嗪+ñŽ{òÕÕ ¾§ßý?—QO]endstream +endobj +1752 0 obj << +/Type /Page +/Contents 1753 0 R +/Resources 1751 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1750 0 R >> endobj 1754 0 obj << -/D [1734 0 R /XYZ 56.6929 544.4015 null] +/D [1752 0 R /XYZ 56.6929 794.5015 null] >> endobj 1755 0 obj << -/D [1734 0 R /XYZ 56.6929 529.6968 null] +/D [1752 0 R /XYZ 56.6929 748.5056 null] >> endobj 1756 0 obj << -/D [1734 0 R /XYZ 56.6929 524.4686 null] +/D [1752 0 R /XYZ 56.6929 748.5056 null] >> endobj 1757 0 obj << -/D [1734 0 R /XYZ 56.6929 500.3989 null] +/D [1752 0 R /XYZ 56.6929 748.5056 null] >> endobj 1758 0 obj << -/D [1734 0 R /XYZ 56.6929 492.5805 null] +/D [1752 0 R /XYZ 56.6929 743.7078 null] >> endobj 1759 0 obj << -/D [1734 0 R /XYZ 56.6929 467.136 null] +/D [1752 0 R /XYZ 56.6929 719.6381 null] >> endobj 1760 0 obj << -/D [1734 0 R /XYZ 56.6929 460.6924 null] +/D [1752 0 R /XYZ 56.6929 711.8197 null] >> endobj 1761 0 obj << -/D [1734 0 R /XYZ 56.6929 436.6227 null] +/D [1752 0 R /XYZ 56.6929 697.0552 null] >> endobj 1762 0 obj << -/D [1734 0 R /XYZ 56.6929 428.8043 null] +/D [1752 0 R /XYZ 56.6929 691.8868 null] >> endobj 1763 0 obj << -/D [1734 0 R /XYZ 56.6929 414.0996 null] +/D [1752 0 R /XYZ 56.6929 665.1671 null] >> endobj 1764 0 obj << -/D [1734 0 R /XYZ 56.6929 408.8714 null] +/D [1752 0 R /XYZ 56.6929 659.9987 null] >> endobj 1765 0 obj << -/D [1734 0 R /XYZ 56.6929 382.1516 null] +/D [1752 0 R /XYZ 56.6929 635.929 null] >> endobj 1766 0 obj << -/D [1734 0 R /XYZ 56.6929 376.9833 null] +/D [1752 0 R /XYZ 56.6929 628.1106 null] >> endobj 1767 0 obj << -/D [1734 0 R /XYZ 56.6929 350.2636 null] +/D [1752 0 R /XYZ 56.6929 601.3909 null] >> endobj 1768 0 obj << -/D [1734 0 R /XYZ 56.6929 345.0952 null] +/D [1752 0 R /XYZ 56.6929 596.2225 null] >> endobj 1769 0 obj << -/D [1734 0 R /XYZ 56.6929 321.0255 null] +/D [1752 0 R /XYZ 56.6929 569.5028 null] >> endobj 1770 0 obj << -/D [1734 0 R /XYZ 56.6929 313.2071 null] +/D [1752 0 R /XYZ 56.6929 564.3344 null] >> endobj 1771 0 obj << -/D [1734 0 R /XYZ 56.6929 298.5024 null] +/D [1752 0 R /XYZ 56.6929 549.6297 null] >> endobj 1772 0 obj << -/D [1734 0 R /XYZ 56.6929 293.2742 null] +/D [1752 0 R /XYZ 56.6929 544.4015 null] >> endobj 1773 0 obj << -/D [1734 0 R /XYZ 56.6929 267.8297 null] +/D [1752 0 R /XYZ 56.6929 529.6968 null] >> endobj 1774 0 obj << -/D [1734 0 R /XYZ 56.6929 261.3861 null] +/D [1752 0 R /XYZ 56.6929 524.4686 null] >> endobj 1775 0 obj << -/D [1734 0 R /XYZ 56.6929 199.468 null] +/D [1752 0 R /XYZ 56.6929 500.3989 null] >> endobj 1776 0 obj << -/D [1734 0 R /XYZ 56.6929 199.468 null] +/D [1752 0 R /XYZ 56.6929 492.5805 null] >> endobj 1777 0 obj << -/D [1734 0 R /XYZ 56.6929 199.468 null] +/D [1752 0 R /XYZ 56.6929 467.136 null] >> endobj 1778 0 obj << -/D [1734 0 R /XYZ 56.6929 191.7053 null] +/D [1752 0 R /XYZ 56.6929 460.6924 null] >> endobj 1779 0 obj << -/D [1734 0 R /XYZ 56.6929 176.9408 null] +/D [1752 0 R /XYZ 56.6929 436.6227 null] >> endobj 1780 0 obj << -/D [1734 0 R /XYZ 56.6929 171.7724 null] +/D [1752 0 R /XYZ 56.6929 428.8043 null] >> endobj 1781 0 obj << -/D [1734 0 R /XYZ 56.6929 157.0677 null] +/D [1752 0 R /XYZ 56.6929 414.0996 null] >> endobj 1782 0 obj << -/D [1734 0 R /XYZ 56.6929 151.8395 null] +/D [1752 0 R /XYZ 56.6929 408.8714 null] >> endobj 1783 0 obj << -/D [1734 0 R /XYZ 56.6929 137.1348 null] +/D [1752 0 R /XYZ 56.6929 382.1516 null] >> endobj 1784 0 obj << -/D [1734 0 R /XYZ 56.6929 131.9066 null] +/D [1752 0 R /XYZ 56.6929 376.9833 null] >> endobj 1785 0 obj << -/D [1734 0 R /XYZ 56.6929 117.2018 null] +/D [1752 0 R /XYZ 56.6929 350.2636 null] >> endobj 1786 0 obj << -/D [1734 0 R /XYZ 56.6929 111.9736 null] +/D [1752 0 R /XYZ 56.6929 345.0952 null] >> endobj 1787 0 obj << -/D [1734 0 R /XYZ 56.6929 97.2091 null] +/D [1752 0 R /XYZ 56.6929 321.0255 null] >> endobj 1788 0 obj << -/D [1734 0 R /XYZ 56.6929 92.0407 null] +/D [1752 0 R /XYZ 56.6929 313.2071 null] >> endobj -1733 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> -/ProcSet [ /PDF /Text ] +1789 0 obj << +/D [1752 0 R /XYZ 56.6929 298.5024 null] >> endobj -1791 0 obj << -/Length 2542 -/Filter /FlateDecode ->> -stream -xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾cEÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#€Œ‘%d8ú·õÝ (Šü6ÄÄyqÏïÕ2CT8ìP1¥^jÂ.ËCšâ½ÓÝ!+²º—/«Z¬•.Úóý)Û1?ãà•pH½ cx ~ßBü‹'þ.¸ç, -ÔÆCùÎ/¬g8‰#Ϫl Η6äP·!åP¸’Ò*§$r¨Üm(}ˆmQ» ~S¥T¼¶¼eÚ¤âè.Ë™8º)‹_ò÷'ÁƒX¼­ªŽ§œ¦*@™A>O3ì'SÉÇ5cUéÜ{Ü6¥AFB¬d„ †t!T™Rv2´”&#Á¾ 'tGÆö8=ðQ2tHséÅîÏRâcê…qì÷)Y*6ÒÊô;öRÍâé)­~hFB;#¼9EñF )#JJ1â#ŒŒ¸  F†ØFLð3åßTYêLºÇk)u]–Œ(éAz̆UשׁG£Tƒ ÆaŸ‡kÉ×´(²b?`»ç8ÿ˜Q:Í~ϘÅs<>Â_ ©r°$…4I>N$9p ŽÀŠ 䯵Twù:pœEž¥5«L=°æ{Yý»£(Û²qŽÂØ‹ü Ï$ÓC–7Êé4Ik¹ý ÷£*Û¿5‚"Ù+æ>I¶Pn ü@ÄHB;I ¡]Ktº8ól«ËGXáÝÄjù°P-Ã0MÀL(6ƒ‹º 'wiÞ@‰Úh¢¾ÀG°5Ø|=¤E»KžùóHž5Ì\‡€¶¨–ç¥fºÙ¾i¾íU…ôN‰!¸›RÆ•”A9vPî‚68b[H7Á9£ÂÅØ|šÒ„»>»i*°µÇ×€%Á /ŒxéÊÅÚØÏ÷Fâ(ßWæÃEtšDœ@Æ6}8@aÇ8¿Á¸¸WK8ßù¢W7é~§Åö5‚ð &ÐA]Ê榔p-eî(ƒÐágØã„÷ÀŸNÅm¹c<€Ó¨ó™^C‰U·„óó`Ê -‘gDDvXýZdüR±(’>¬Ž%PØ×q#êâ,«%7æ-y¨^ôB0WD¡õˈ…§JøŸrö³:û ¸ÊY'ˆŒ¨2”¨‚æËÓF @¨µ> ‡ÐÈ¿P˜R3RRº›‚ÐaF.hÃŒ†Ø32Á¿Ö­uˆ]Vçê(•:_ÝübU”¥ÜàÓ\ÄÞ¢zÉšªí‡Än¥ œ¼œKðˆ zløÓô´Eé˜éÛ EðÂñ…v”r¡¤4$pt‘Nhƒˆ!¶…\g„P×üPÔnppSŽiñ£Gkñž½y#$¾Äæt‡$dúÉWþ-gd¦vÕ×îÁw~áì”ù«¼@?½Ü„þ¯~ùÑEy¹Ns˜-b+Ÿ~D½(¼”.L);ŸZªã“:ŠG'tÇçö8Ÿ=ð…ž¾³¢‹Þ)—’UÁÀùTõÇg9µcºrÖ(£úÿ¬·é¶ÝM ¼ƒ ¼tBZ¤.éQäèá\¸)` 'òšA7FØÖ¨™-b¸"2ú]¨JÑŽ¼¡ Ý—àyõ`è×’5J%^ƒúû“¤¨sÆщ7àØN¡^€‚ ¥€)å JIi¦ 7;˜rAT ±-\™àKþåW²­›$œ.Nͨ¼ŒóÎÄ’ˆƒüH¹ùI4}çsñvõM42¼ùàç¼+KëFÞo·›u=êTt„) ºC(ù>Š»ïÚñ7ßµ„ž©«{ˆôíDB—-Ô…/{¦”ƒH%¥‰LËå\БCl ‘&¸®éVOÅxê¨Ò¢îŠ¼³/÷üÓjžlü›òž:Gkêå©Òžª”«­ÞëÊÙ6ìØ¥0Xfâ{1Oý™øãK]æ¬a4°´Ã1gˆýªó½ý^1ã+êyˆ±Ø&GÁXܶ`JÙmAK]”#):¡;[8÷…¸°?œÞvC8k£'ü¿gå¾JoहXùì(0Cß‹)MÌá(žÞxâ»T|dy.wÚ/&>tËÛ·Sþ“«)ÿ”³¬)˜þîH°äö–RšŽ]Ydd¥£ð{ó˜ÿ¡…×РînJ9(VRºî #G£ì„6(b[(6Á¯³B§­Ïé S=sv–iG{ -9±ôIŒ»©Òï¯bF²SÁà´?Õæ!±ò¡‘n !; J¨û$9úhnÇÁxœY8YŒ!à4¼ªÅœ7%ÿo6×°(£2ùP.ì÷ba¯¾ëÇÊ+à.kVœ¸¥7álE‘9ôˆAWܧ«»­Ì›òž[ݨϧÌøƧSþ3ŸŸxYAFméÿÿ ˘OF‰m3Ù…«‡j»#D†®ºuþìÿ’{÷òendstream -endobj 1790 0 obj << -/Type /Page -/Contents 1791 0 R -/Resources 1789 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1843 0 R +/D [1752 0 R /XYZ 56.6929 293.2742 null] +>> endobj +1791 0 obj << +/D [1752 0 R /XYZ 56.6929 267.8297 null] >> endobj 1792 0 obj << -/D [1790 0 R /XYZ 85.0394 794.5015 null] +/D [1752 0 R /XYZ 56.6929 261.3861 null] >> endobj 1793 0 obj << -/D [1790 0 R /XYZ 85.0394 748.4854 null] +/D [1752 0 R /XYZ 56.6929 199.468 null] >> endobj 1794 0 obj << -/D [1790 0 R /XYZ 85.0394 748.4854 null] +/D [1752 0 R /XYZ 56.6929 199.468 null] >> endobj 1795 0 obj << -/D [1790 0 R /XYZ 85.0394 748.4854 null] +/D [1752 0 R /XYZ 56.6929 199.468 null] >> endobj 1796 0 obj << -/D [1790 0 R /XYZ 85.0394 743.3452 null] +/D [1752 0 R /XYZ 56.6929 191.7053 null] >> endobj 1797 0 obj << -/D [1790 0 R /XYZ 85.0394 728.6405 null] +/D [1752 0 R /XYZ 56.6929 176.9408 null] >> endobj 1798 0 obj << -/D [1790 0 R /XYZ 85.0394 723.1655 null] +/D [1752 0 R /XYZ 56.6929 171.7724 null] >> endobj 1799 0 obj << -/D [1790 0 R /XYZ 85.0394 708.4607 null] +/D [1752 0 R /XYZ 56.6929 157.0677 null] >> endobj 1800 0 obj << -/D [1790 0 R /XYZ 85.0394 702.9857 null] +/D [1752 0 R /XYZ 56.6929 151.8395 null] >> endobj 1801 0 obj << -/D [1790 0 R /XYZ 85.0394 688.2211 null] +/D [1752 0 R /XYZ 56.6929 137.1348 null] >> endobj 1802 0 obj << -/D [1790 0 R /XYZ 85.0394 682.8059 null] +/D [1752 0 R /XYZ 56.6929 131.9066 null] >> endobj 1803 0 obj << -/D [1790 0 R /XYZ 85.0394 668.0414 null] +/D [1752 0 R /XYZ 56.6929 117.2018 null] >> endobj 1804 0 obj << -/D [1790 0 R /XYZ 85.0394 662.6262 null] +/D [1752 0 R /XYZ 56.6929 111.9736 null] >> endobj 1805 0 obj << -/D [1790 0 R /XYZ 85.0394 599.7666 null] +/D [1752 0 R /XYZ 56.6929 97.2091 null] >> endobj 1806 0 obj << -/D [1790 0 R /XYZ 85.0394 599.7666 null] +/D [1752 0 R /XYZ 56.6929 92.0407 null] >> endobj -1807 0 obj << -/D [1790 0 R /XYZ 85.0394 599.7666 null] ->> endobj -1808 0 obj << -/D [1790 0 R /XYZ 85.0394 591.7571 null] +1751 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1809 0 obj << -/D [1790 0 R /XYZ 85.0394 565.0374 null] +/Length 2542 +/Filter /FlateDecode +>> +stream +xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾cEÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#€Œ‘%d8ú·õÝ (Šü6ÄÄyqÏïÕ2CT8ìP1¥^jÂ.ËCšâ½ÓÝ!+²º—/«Z¬•.Úóý)Û1?ãà•pH½ cx ~ßBü‹'þ.¸ç, +ÔÆCùÎ/¬g8‰#Ϫl Η6äP·!åP¸’Ò*§$r¨Üm(}ˆmQ» ~S¥T¼¶¼eÚ¤âè.Ë™8º)‹_ò÷'ÁƒX¼­ªŽ§œ¦*@™A>O3ì'SÉÇ5cUéÜ{Ü6¥AFB¬d„ †t!T™Rv2´”&#Á¾ 'tGÆö8=ðQ2tHséÅîÏRâcê…qì÷)Y*6ÒÊô;öRÍâé)­~hFB;#¼9EñF )#JJ1â#ŒŒ¸  F†ØFLð3åßTYêLºÇk)u]–Œ(éAz̆UשׁG£Tƒ ÆaŸ‡kÉ×´(²b?`»ç8ÿ˜Q:Í~ϘÅs<>Â_ ©r°$…4I>N$9p ŽÀŠ 䯵Twù:pœEž¥5«L=°æ{Yý»£(Û²qŽÂØ‹ü Ï$ÓC–7Êé4Ik¹ý ÷£*Û¿5‚"Ù+æ>I¶Pn ü@ÄHB;I ¡]Ktº8ól«ËGXáÝÄjù°P-Ã0MÀL(6ƒ‹º 'wiÞ@‰Úh¢¾ÀG°5Ø|=¤E»KžùóHž5Ì\‡€¶¨–ç¥fºÙ¾i¾íU…ôN‰!¸›RÆ•”A9vPî‚68b[H7Á9£ÂÅØ|šÒ„»>»i*°µÇ×€%Á /ŒxéÊÅÚØÏ÷Fâ(ßWæÃEtšDœ@Æ6}8@aÇ8¿Á¸¸WK8ßù¢W7é~§Åö5‚ð &ÐA]Ê榔p-eî(ƒÐágØã„÷ÀŸNÅm¹c<€Ó¨ó™^C‰U·„óó`Ê +‘gDDvXýZdüR±(’>¬Ž%PØ×q#êâ,«%7æ-y¨^ôB0WD¡õˈ…§JøŸrö³:û ¸ÊY'ˆŒ¨2”¨‚æËÓF @¨µ> ‡ÐÈ¿P˜R3RRº›‚ÐaF.hÃŒ†Ø32Á¿Ö­uˆ]Vçê(•:_ÝübU”¥ÜàÓ\ÄÞ¢zÉšªí‡Än¥ œ¼œKðˆ zløÓô´Eé˜éÛ EðÂñ…v”r¡¤4$pt‘Nhƒˆ!¶…\g„P×üPÔnppSŽiñ£Gkñž½y#$¾Äæt‡$dúÉWþ-gd¦vÕ×îÁw~áì”ù«¼@?½Ü„þ¯~ùÑEy¹Ns˜-b+Ÿ~D½(¼”.L);ŸZªã“:ŠG'tÇçö8Ÿ=ð…ž¾³¢‹Þ)—’UÁÀùTõÇg9µcºrÖ(£úÿ¬·é¶ÝM ¼ƒ ¼tBZ¤.éQäèá\¸)` 'òšA7FØÖ¨™-b¸"2ú]¨JÑŽ¼¡ Ý—àyõ`è×’5J%^ƒúû“¤¨sÆщ7àØN¡^€‚ ¥€)å JIi¦ 7;˜rAT ±-\™àKþåW²­›$œ.Nͨ¼ŒóÎÄ’ˆƒüH¹ùI4}çsñvõM42¼ùàç¼+KëFÞo·›u=êTt„) ºC(ù>Š»ïÚñ7ßµ„ž©«{ˆôíDB—-Ô…/{¦”ƒH%¥‰LËå\БCl ‘&¸®éVOÅxê¨Ò¢îŠ¼³/÷üÓjžlü›òž:Gkêå©Òžª”«­ÞëÊÙ6ìØ¥0Xfâ{1Oý™øãK]æ¬a4°´Ã1gˆýªó½ý^1ã+êyˆ±Ø&GÁXܶ`JÙmAK]”#):¡;[8÷…¸°?œÞvC8k£'ü¿gå¾JoहXùì(0Cß‹)MÌá(žÞxâ»T|dy.wÚ/&>tËÛ·Sþ“«)ÿ”³¬)˜þîH°äö–RšŽ]Ydd¥£ð{ó˜ÿ¡…×РînJ9(VRºî #G£ì„6(b[(6Á¯³B§­Ïé S=sv–iG{ +9±ôIŒ»©Òï¯bF²SÁà´?Õæ!±ò¡‘n !; J¨û$9úhnÇÁxœY8YŒ!à4¼ªÅœ7%ÿo6×°(£2ùP.ì÷ba¯¾ëÇÊ+à.kVœ¸¥7álE‘9ôˆAWܧ«»­Ì›òž[ݨϧÌøƧSþ3ŸŸxYAFméÿÿ ˘OF‰m3Ù…«‡j»#D‡®ºuþìÿ’Ó÷ôendstream +endobj +1808 0 obj << +/Type /Page +/Contents 1809 0 R +/Resources 1807 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1750 0 R >> endobj 1810 0 obj << -/D [1790 0 R /XYZ 85.0394 559.6222 null] +/D [1808 0 R /XYZ 85.0394 794.5015 null] >> endobj 1811 0 obj << -/D [1790 0 R /XYZ 85.0394 534.1777 null] +/D [1808 0 R /XYZ 85.0394 748.4854 null] >> endobj 1812 0 obj << -/D [1790 0 R /XYZ 85.0394 527.4872 null] +/D [1808 0 R /XYZ 85.0394 748.4854 null] >> endobj 1813 0 obj << -/D [1790 0 R /XYZ 85.0394 502.0427 null] +/D [1808 0 R /XYZ 85.0394 748.4854 null] >> endobj 1814 0 obj << -/D [1790 0 R /XYZ 85.0394 495.3523 null] +/D [1808 0 R /XYZ 85.0394 743.3452 null] >> endobj 1815 0 obj << -/D [1790 0 R /XYZ 85.0394 420.5376 null] +/D [1808 0 R /XYZ 85.0394 728.6405 null] >> endobj 1816 0 obj << -/D [1790 0 R /XYZ 85.0394 420.5376 null] +/D [1808 0 R /XYZ 85.0394 723.1655 null] >> endobj 1817 0 obj << -/D [1790 0 R /XYZ 85.0394 420.5376 null] +/D [1808 0 R /XYZ 85.0394 708.4607 null] >> endobj 1818 0 obj << -/D [1790 0 R /XYZ 85.0394 412.5281 null] +/D [1808 0 R /XYZ 85.0394 702.9857 null] >> endobj 1819 0 obj << -/D [1790 0 R /XYZ 85.0394 388.4584 null] +/D [1808 0 R /XYZ 85.0394 688.2211 null] >> endobj 1820 0 obj << -/D [1790 0 R /XYZ 85.0394 380.3932 null] +/D [1808 0 R /XYZ 85.0394 682.8059 null] >> endobj 1821 0 obj << -/D [1790 0 R /XYZ 85.0394 365.6884 null] +/D [1808 0 R /XYZ 85.0394 668.0414 null] >> endobj 1822 0 obj << -/D [1790 0 R /XYZ 85.0394 360.2134 null] +/D [1808 0 R /XYZ 85.0394 662.6262 null] >> endobj 1823 0 obj << -/D [1790 0 R /XYZ 85.0394 345.4488 null] +/D [1808 0 R /XYZ 85.0394 599.7666 null] >> endobj 1824 0 obj << -/D [1790 0 R /XYZ 85.0394 340.0336 null] +/D [1808 0 R /XYZ 85.0394 599.7666 null] >> endobj 1825 0 obj << -/D [1790 0 R /XYZ 85.0394 325.269 null] +/D [1808 0 R /XYZ 85.0394 599.7666 null] >> endobj 1826 0 obj << -/D [1790 0 R /XYZ 85.0394 319.8539 null] +/D [1808 0 R /XYZ 85.0394 591.7571 null] >> endobj 1827 0 obj << -/D [1790 0 R /XYZ 85.0394 295.7842 null] +/D [1808 0 R /XYZ 85.0394 565.0374 null] >> endobj 1828 0 obj << -/D [1790 0 R /XYZ 85.0394 287.7189 null] +/D [1808 0 R /XYZ 85.0394 559.6222 null] >> endobj 1829 0 obj << -/D [1790 0 R /XYZ 85.0394 272.9543 null] +/D [1808 0 R /XYZ 85.0394 534.1777 null] >> endobj 1830 0 obj << -/D [1790 0 R /XYZ 85.0394 267.5392 null] +/D [1808 0 R /XYZ 85.0394 527.4872 null] >> endobj 1831 0 obj << -/D [1790 0 R /XYZ 85.0394 252.7746 null] +/D [1808 0 R /XYZ 85.0394 502.0427 null] >> endobj 1832 0 obj << -/D [1790 0 R /XYZ 85.0394 247.3594 null] +/D [1808 0 R /XYZ 85.0394 495.3523 null] >> endobj 1833 0 obj << -/D [1790 0 R /XYZ 85.0394 223.2897 null] +/D [1808 0 R /XYZ 85.0394 420.5376 null] >> endobj 1834 0 obj << -/D [1790 0 R /XYZ 85.0394 215.2245 null] +/D [1808 0 R /XYZ 85.0394 420.5376 null] >> endobj 1835 0 obj << -/D [1790 0 R /XYZ 85.0394 149.4956 null] +/D [1808 0 R /XYZ 85.0394 420.5376 null] >> endobj 1836 0 obj << -/D [1790 0 R /XYZ 85.0394 149.4956 null] +/D [1808 0 R /XYZ 85.0394 412.5281 null] >> endobj 1837 0 obj << -/D [1790 0 R /XYZ 85.0394 149.4956 null] +/D [1808 0 R /XYZ 85.0394 388.4584 null] >> endobj 1838 0 obj << -/D [1790 0 R /XYZ 85.0394 144.3554 null] +/D [1808 0 R /XYZ 85.0394 380.3932 null] >> endobj 1839 0 obj << -/D [1790 0 R /XYZ 85.0394 120.2857 null] +/D [1808 0 R /XYZ 85.0394 365.6884 null] >> endobj 1840 0 obj << -/D [1790 0 R /XYZ 85.0394 112.2205 null] +/D [1808 0 R /XYZ 85.0394 360.2134 null] >> endobj 1841 0 obj << -/D [1790 0 R /XYZ 85.0394 97.4559 null] +/D [1808 0 R /XYZ 85.0394 345.4488 null] >> endobj 1842 0 obj << -/D [1790 0 R /XYZ 85.0394 92.0407 null] +/D [1808 0 R /XYZ 85.0394 340.0336 null] >> endobj -1789 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> -/ProcSet [ /PDF /Text ] +1843 0 obj << +/D [1808 0 R /XYZ 85.0394 325.269 null] +>> endobj +1844 0 obj << +/D [1808 0 R /XYZ 85.0394 319.8539 null] >> endobj -1846 0 obj << -/Length 2121 -/Filter /FlateDecode ->> -stream -xÚ¥YIs㸾ûWèª*B°pÍM¶ÔŽ»=¶cy*™t÷¦`‰eŠÔˆ”»5¿>x J$5•”Äòà}x 6¢ðc#Ï'~Ä£Q¹Ä£Ì%›+:ZÁÜí34“šhbS]¿\ýí“F‰|î^Þ,Y!¡aÈF/˯Δ2 Ô¹¾»¾¿{¼}ž>ýã·ñ„{ÔùF=:}˜agñëíí|ñ27Ýçùtv÷p $l< üˆ:Ó§§ùÃìîß8?URi3z3_Œ¿¿|¾š¿4˶·Æ¨Pkþýêëw:ZÂ?_Q"¢Ðý€%,Šøhsåz‚x®õHvµ¸úg#Кլ¦b”páó[q6bŒDžÇ[Æò"â .´±_Ë"“•\âg c™ìwiu0¦ùtSönV¸Ð Ñ-*\›è±¦RKû -Z9õ½ï§šç`/VÝPë‘¥›ñ€xÇù>Þ”VØr­hÒÀúà\¤=ê’êxG¢ì QÁtz-äNwg)Ö¨(ëIsž Žª8êÃmpÔ‡<Þ¤ v~Ý.ãJvA1âòÈ‚PóüÖšaƒŸéM·»4Ãæ ~è“0 | -›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ Q?~H"\ÈK6Õ5Uƒ 4ÀaHµ…éînlÝ5" ªUã Û " tž„\°˜ß`:Ôé*Oóv¦ûj]húsœ¸Ï ]EV¸ãܹ&Èø¯qÄ™e ©*tãÂy(>äæUî0ŒÕü­(Æ)¥ý˜‰ˆP7º„™E5€YMuÄ,¢˜ ©¶0;ÕÝ™­»'7.‚Ý›,Þ¥ß(åI\5ƒõ÷?E^»\Wû.§â, 4àaÛ«æÆ«îå´ìv"„õÂaÌ/bQ RS5€¸îP0Rmrª»[÷}ºI+ôÈÒÕZy¤àERl%Žo8dæ\çËü7y–e™)1SÏ2)vKl+w{~Ö®Ö¬! -¸÷‹Š{Jð/qYÊŽéZA/‰E©¢—›ÉÄv±Zæ©ñ^H=Hœ‡ê<›ªÒ†ªÔ÷ T}„ôLw'¤-ÝÏr)•óä):‚_í" :ÖɼJÁÃT¬çâ*Æ–¾QÌL”„þkZuaHC°ÈcL¤ c"ð´c"Ž!–Ðx4D·ûåfŸ/ËREM±Ú±‰¥µ—Š~HU uÙDD€" Ï<7¤×‚óDq7š–â™ÌäÊŠ‚*aÕvÐ m0éMËqý±¦îõGŽë†¬1MÄlÁ„JíyW—†j@›j’šªÁ$ô±!Õ(§º»Q±uß(Éáhö죶ÅM±Ù^¯iÖd··bW[íOÙájªD7j£³0è §¥H -\§Il‡·îLx‹j›šÊÂfà²4¨ÚÂæTw76¶î¦>wëºPµšúÚ:ƒ©†) ¡o¼ÆN¼H/2Æ‹P¬}9ƒþ<¯vl>i^¹ó§#Û§,^uà,à²ËÁ uLlF[1±vÎ/EöŽwgÕûlFÉ:;T­#¡£o_!dÝèO rÄ /Ý$lªþÓP5'&*‚UOÌ™îÎÓÒÝS•ž^ô…Oþ¬` u!Wt-ªçÙtìy΋òÌ)}*v›¸3ú°ò»mçÀqº_íËê«Ó‡±‰€á2ª!áA¹Gýæ‘' .Î]rsi$Ívñ[ÕULSHÊ.Dæj WèÕ\ÐÆ‚ïnV+ÀdÜ :º]ìWëÉRñààb÷®‹OÅ¿,’ýj’çTÉ¢¾ºîTómÍó|•æRî »1v\¾#1˜]X½01˜]K|P¢m/2kÔÅKèèëd8êÏ<ÁÑ_ -aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp -uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉Wà -BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚™8 -ÓÙ„õç‘A­Ç> endobj +1846 0 obj << +/D [1808 0 R /XYZ 85.0394 287.7189 null] >> endobj 1847 0 obj << -/D [1845 0 R /XYZ 56.6929 794.5015 null] +/D [1808 0 R /XYZ 85.0394 272.9543 null] >> endobj 1848 0 obj << -/D [1845 0 R /XYZ 56.6929 749.4437 null] +/D [1808 0 R /XYZ 85.0394 267.5392 null] >> endobj 1849 0 obj << -/D [1845 0 R /XYZ 56.6929 749.4437 null] +/D [1808 0 R /XYZ 85.0394 252.7746 null] >> endobj 1850 0 obj << -/D [1845 0 R /XYZ 56.6929 749.4437 null] +/D [1808 0 R /XYZ 85.0394 247.3594 null] >> endobj 1851 0 obj << -/D [1845 0 R /XYZ 56.6929 746.6461 null] +/D [1808 0 R /XYZ 85.0394 223.2897 null] >> endobj 1852 0 obj << -/D [1845 0 R /XYZ 56.6929 722.5763 null] +/D [1808 0 R /XYZ 85.0394 215.2245 null] >> endobj 1853 0 obj << -/D [1845 0 R /XYZ 56.6929 716.7581 null] +/D [1808 0 R /XYZ 85.0394 149.4956 null] >> endobj 1854 0 obj << -/D [1845 0 R /XYZ 56.6929 701.9936 null] +/D [1808 0 R /XYZ 85.0394 149.4956 null] >> endobj 1855 0 obj << -/D [1845 0 R /XYZ 56.6929 698.8254 null] +/D [1808 0 R /XYZ 85.0394 149.4956 null] >> endobj 1856 0 obj << -/D [1845 0 R /XYZ 56.6929 684.1207 null] +/D [1808 0 R /XYZ 85.0394 144.3554 null] >> endobj 1857 0 obj << -/D [1845 0 R /XYZ 56.6929 680.8926 null] +/D [1808 0 R /XYZ 85.0394 120.2857 null] >> endobj 1858 0 obj << -/D [1845 0 R /XYZ 56.6929 656.8229 null] +/D [1808 0 R /XYZ 85.0394 112.2205 null] >> endobj 1859 0 obj << -/D [1845 0 R /XYZ 56.6929 651.0047 null] +/D [1808 0 R /XYZ 85.0394 97.4559 null] >> endobj 1860 0 obj << -/D [1845 0 R /XYZ 56.6929 636.3 null] ->> endobj -1861 0 obj << -/D [1845 0 R /XYZ 56.6929 633.072 null] +/D [1808 0 R /XYZ 85.0394 92.0407 null] >> endobj -1862 0 obj << -/D [1845 0 R /XYZ 56.6929 609.0023 null] +1807 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1863 0 obj << -/D [1845 0 R /XYZ 56.6929 603.184 null] +/Length 2121 +/Filter /FlateDecode +>> +stream +xÚ¥YIs㸾ûWèª*B°pÍM¶ÔŽ»=¶cy*™t÷¦`‰eŠÔˆ”»5¿>x J$5•”Äòà}x 6¢ðc#Ï'~Ä£Q¹Ä£Ì%›+:ZÁÜí34“šhbS]¿\ýí“F‰|î^Þ,Y!¡aÈF/˯Δ2 Ô¹¾»¾¿{¼}ž>ýã·ñ„{ÔùF=:}˜agñëíí|ñ27Ýçùtv÷p $l< üˆ:Ó§§ùÃìîß8?URi3z3_Œ¿¿|¾š¿4˶·Æ¨Pkþýêëw:ZÂ?_Q"¢Ðý€%,Šøhsåz‚x®õHvµ¸úg#Кլ¦b”páó[q6bŒDžÇ[Æò"â .´±_Ë"“•\âg c™ìwiu0¦ùtSönV¸Ð Ñ-*\›è±¦RKû +Z9õ½ï§šç`/VÝPë‘¥›ñ€xÇù>Þ”VØr­hÒÀúà\¤=ê’êxG¢ì QÁtz-äNwg)Ö¨(ëIsž Žª8êÃmpÔ‡<Þ¤ v~Ý.ãJvA1âòÈ‚PóüÖšaƒŸéM·»4Ãæ ~è“0 | +›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ Q?~H"\ÈK6Õ5Uƒ 4ÀaHµ…éînlÝ5" ªUã Û " tž„\°˜ß`:Ôé*Oóv¦ûj]húsœ¸Ï ]EV¸ãܹ&Èø¯qÄ™e ©*tãÂy(>äæUî0ŒÕü­(Æ)¥ý˜‰ˆP7º„™E5€YMuÄ,¢˜ ©¶0;ÕÝ™­»'7.‚Ý›,Þ¥ß(åI\5ƒõ÷?E^»\Wû.§â, 4àaÛ«æÆ«îå´ìv"„õÂaÌ/bQ RS5€¸îP0Rmrª»[÷}ºI+ôÈÒÕZy¤àERl%Žo8dæ\çËü7y–e™)1SÏ2)vKl+w{~Ö®Ö¬! +¸÷‹Š{Jð/qYÊŽéZA/‰E©¢—›ÉÄv±Zæ©ñ^H=Hœ‡ê<›ªÒ†ªÔ÷ T}„ôLw'¤-ÝÏr)•óä):‚_í" :ÖɼJÁÃT¬çâ*Æ–¾QÌL”„þkZuaHC°ÈcL¤ c"ð´c"Ž!–Ðx4D·ûåfŸ/ËREM±Ú±‰¥µ—Š~HU uÙDD€" Ï<7¤×‚óDq7š–â™ÌäÊŠ‚*aÕvÐ m0éMËqý±¦îõGŽë†¬1MÄlÁ„JíyW—†j@›j’šªÁ$ô±!Õ(§º»Q±uß(Éáhö죶ÅM±Ù^¯iÖd··bW[íOÙájªD7j£³0è §¥H +\§Il‡·îLx‹j›šÊÂfà²4¨ÚÂæTw76¶î¦>wëºPµšúÚ:ƒ©†) ¡o¼ÆN¼H/2Æ‹P¬}9ƒþ<¯vl>i^¹ó§#Û§,^uà,à²ËÁ uLlF[1±vÎ/EöŽwgÕûlFÉ:;T­#¡£o_!dÝèO rÄ /Ý$lªþÓP5'&*‚UOÌ™îÎÓÒÝS•ž^ô…Oþ¬` u!Wt-ªçÙtìy΋òÌ)}*v›¸3ú°ò»mçÀqº_íËê«Ó‡±‰€á2ª!áA¹Gýæ‘' .Î]rsi$Ívñ[ÕULSHÊ.Dæj WèÕ\ÐÆ‚ïnV+ÀdÜ :º]ìWëÉRñààb÷®‹OÅ¿,’ýj’çTÉ¢¾ºîTómÍó|•æRî »1v\¾#1˜]X½01˜]K|P¢m/2kÔÅKèèëd8êÏ<ÁÑ_ +aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp +uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉Wà +BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚™8 +ÓÙ„õç‘A­Ç> endobj 1864 0 obj << -/D [1845 0 R /XYZ 56.6929 579.1143 null] +/D [1862 0 R /XYZ 56.6929 794.5015 null] >> endobj 1865 0 obj << -/D [1845 0 R /XYZ 56.6929 573.2961 null] +/D [1862 0 R /XYZ 56.6929 749.4437 null] >> endobj 1866 0 obj << -/D [1845 0 R /XYZ 56.6929 558.5914 null] +/D [1862 0 R /XYZ 56.6929 749.4437 null] >> endobj 1867 0 obj << -/D [1845 0 R /XYZ 56.6929 555.3634 null] +/D [1862 0 R /XYZ 56.6929 749.4437 null] >> endobj 1868 0 obj << -/D [1845 0 R /XYZ 56.6929 540.5988 null] +/D [1862 0 R /XYZ 56.6929 746.6461 null] >> endobj 1869 0 obj << -/D [1845 0 R /XYZ 56.6929 537.4306 null] +/D [1862 0 R /XYZ 56.6929 722.5763 null] >> endobj 1870 0 obj << -/D [1845 0 R /XYZ 56.6929 510.7109 null] +/D [1862 0 R /XYZ 56.6929 716.7581 null] >> endobj 1871 0 obj << -/D [1845 0 R /XYZ 56.6929 507.5427 null] ->> endobj -638 0 obj << -/D [1845 0 R /XYZ 56.6929 477.5928 null] +/D [1862 0 R /XYZ 56.6929 701.9936 null] >> endobj 1872 0 obj << -/D [1845 0 R /XYZ 56.6929 453.2532 null] ->> endobj -642 0 obj << -/D [1845 0 R /XYZ 56.6929 369.7201 null] +/D [1862 0 R /XYZ 56.6929 698.8254 null] >> endobj 1873 0 obj << -/D [1845 0 R /XYZ 56.6929 345.3805 null] +/D [1862 0 R /XYZ 56.6929 684.1207 null] >> endobj 1874 0 obj << -/D [1845 0 R /XYZ 56.6929 310.6805 null] +/D [1862 0 R /XYZ 56.6929 680.8926 null] >> endobj 1875 0 obj << -/D [1845 0 R /XYZ 56.6929 310.6805 null] +/D [1862 0 R /XYZ 56.6929 656.8229 null] >> endobj 1876 0 obj << -/D [1845 0 R /XYZ 56.6929 310.6805 null] +/D [1862 0 R /XYZ 56.6929 651.0047 null] >> endobj 1877 0 obj << -/D [1845 0 R /XYZ 56.6929 310.6805 null] +/D [1862 0 R /XYZ 56.6929 636.3 null] >> endobj -1844 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F14 737 0 R >> -/ProcSet [ /PDF /Text ] +1878 0 obj << +/D [1862 0 R /XYZ 56.6929 633.072 null] +>> endobj +1879 0 obj << +/D [1862 0 R /XYZ 56.6929 609.0023 null] >> endobj 1880 0 obj << +/D [1862 0 R /XYZ 56.6929 603.184 null] +>> endobj +1881 0 obj << +/D [1862 0 R /XYZ 56.6929 579.1143 null] +>> endobj +1882 0 obj << +/D [1862 0 R /XYZ 56.6929 573.2961 null] +>> endobj +1883 0 obj << +/D [1862 0 R /XYZ 56.6929 558.5914 null] +>> endobj +1884 0 obj << +/D [1862 0 R /XYZ 56.6929 555.3634 null] +>> endobj +1885 0 obj << +/D [1862 0 R /XYZ 56.6929 540.5988 null] +>> endobj +1886 0 obj << +/D [1862 0 R /XYZ 56.6929 537.4306 null] +>> endobj +1887 0 obj << +/D [1862 0 R /XYZ 56.6929 510.7109 null] +>> endobj +1888 0 obj << +/D [1862 0 R /XYZ 56.6929 507.5427 null] +>> endobj +642 0 obj << +/D [1862 0 R /XYZ 56.6929 477.5928 null] +>> endobj +1889 0 obj << +/D [1862 0 R /XYZ 56.6929 453.2532 null] +>> endobj +646 0 obj << +/D [1862 0 R /XYZ 56.6929 369.7201 null] +>> endobj +1890 0 obj << +/D [1862 0 R /XYZ 56.6929 345.3805 null] +>> endobj +1891 0 obj << +/D [1862 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1892 0 obj << +/D [1862 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1893 0 obj << +/D [1862 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1894 0 obj << +/D [1862 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1861 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F39 900 0 R /F14 741 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1897 0 obj << /Length 1945 /Filter /FlateDecode >> @@ -8151,45 +8250,45 @@ O3i_ ! ˆ(ñ7|Ùl‹²†B ù¼¬WÍn[ôeƒ•Ï×»‘Í›Öí€U¦ŽÖ š~ã\¹ŸåcåˆÜ7ME+€a{·#¤5€×kâ¤Zë>¦=‰ÒwÇnÅÓùmOT8åꈷy‡ŽºŒü™ê°*"ÖKH,£][‡@î7ŽÈEÝ=Ãq‘Zôa›—5ðиßïj·¤å©²=#-DZ q;2.ááȈ3t€Ò-Ae³OM×Ç‚ª–·•²ò˶¬Ë1ïú]Ñ7^x ï;7á l>Tœ .ݲ1Û÷ ö¤äîµÛ4 ŠnùQŒ––auÛÑÒ£[(…_nVô-û°½„ kþ ,d`…â|Oáþöè¢gZ¥h«ìÁ| ƒ›ýwß·ûýGðùg¸›ÝËv=´ C‡BDúnŠ'¶`WàG«}½À˜(ªá<¸ÍzÂà ³‰1éï\³\«XûXÌΚeyn@Çœ¥iJÿ¦ê7Í~½™8Jè8•ºvµ2eàÁÀUJÎkŒñª:àÌ›{Iôç²ßmÑl·`ý¤*kGkëýÖÕ}‡Wg$\.qU×צè‰æE¿Ûf ü=ãšR7€ÕB¹»ýB(bŠ%%}r¡h©ëCŽ8†(ÎŽ™JVÎç;C´Gˆ½ »=(½;Ф DïÀxÆØ$õÔ$ä½ ··¨X7$̉ˆnw˜‘ßêùóÆÕ4Âtò²È§9Âêp‘ÉfÚ«Lfc@¤OØð]—O®Fõšÿ³®ÊïŽè®ØU¥˜`úEÑÁiJÙMZ3{{÷ž8ò€ºm!øA÷âxR³šŒ x‰¡¾X—Lj¢7ƒw6ÏdµDãÓ*züÛ}Õ—måN£»GòcX,»nïB”Ÿø…âÀ.7€Á ³áÆN‚lF)A‘ïK¥B1”phµ$Š?(¾°© J׺E‰N¸ y,{*Œ›TCV|i@ÉsïyÍ€^5繬ª XŠ2 —Ô«‚QÕ%jUvä–¨e=á‹Â&¤ˆêk×/^à ª©žb*Ëàá$@º‘¿/šz5!÷¸Ñ‘82ÿ¿(Fd ¿éɵ1&ŒÎH>ÀŽc\|a“ŽIëë ³É®Z_Èll}@ ^ñ}Ûßè!0\E᥮þ#:ötM0!ßmzì)¢¡,<ƒyfÇ–ò}“ÍBà§ðëºÐ Õ;(P;ØZêG¨;ZZºUÖÑ: -7Ñ[¤ʘÐ×ìbyíòTSþ*¤Ñ›þüïŸ?}øÏkx»Åb¦˜Í¬ü:5¿ßDU)ÇŸªŸ µƒ8Èa€\Ô¢7…r$sÍ´gõȇ½á'®ƒ“¶…ü¹ŒYÍu\¼œcN‘‚³N¦{ß`Bɺ½£/uµ0x÷‘¾ô{ƒo™1§tDm ¦«¢¥I¨í0ê¯ÂõMK`•{rÑè•ý!`zfó%5YH§Î-œ1ñ³¼eL–ÅBç£ëMÓÙ+5´‚çžy1W±»M—ª¢T£ªÊ!Å¢´¼:Ë/ ðw¿F“™C]ôª^®×"‡¤aÉ~\”,†Ïpî‰4êHi0Fë)šP´ƒ4ʧۻ˜@`eè¡¡„*œžõÐÈøîcäw H¨©Ômá/„íàÍ]tì¦}²÷/açïðãó˜áϲ“íÀ’yèÙÑo#\Ó/UÜœ7üÀûò¼ÿйž…endstream +7Ñ[¤ʘÐ×ìbyíòTSþ*¤Ñ›þüïŸ?}øÏkx»Åb¦˜Í¬ü:5¿ßDU)ÇŸªŸ µƒ8Èa€\Ô¢7…r$sÍ´gõȇ½á'®ƒ“¶…ü¹ŒYÍu\¼œcN‘‚³N¦{ß`Bɺ½£/uµ0x÷‘¾ô{ƒo™1§tDm ¦«¢¥I¨í0ê¯ÂõMK`•{rÑè•ý!`zfó%5YH§Î-œ1ñ³¼eL–ÅBç£ëMÓÙ+5´‚çžy1W±»M—ª¢T£ªÊ!Å¢´¼:Ë/ ðw¿F“™C]ôª^®×"‡¤aÉ~\”,†Ïpî‰4êHi0Fë)šP´ƒ4ʧۻ˜@`eè¡¡„*œžõÐÈøîcäw H¨©Ômá/„íàÍ]tì¦}²÷/açïðãó˜áϲ“íÀ’yèÙÑo#\Ó/U<=?nø÷åyÿÑž‡endstream endobj -1879 0 obj << +1896 0 obj << /Type /Page -/Contents 1880 0 R -/Resources 1878 0 R +/Contents 1897 0 R +/Resources 1895 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1843 0 R +/Parent 1750 0 R >> endobj -1881 0 obj << -/D [1879 0 R /XYZ 85.0394 794.5015 null] +1898 0 obj << +/D [1896 0 R /XYZ 85.0394 794.5015 null] >> endobj -646 0 obj << -/D [1879 0 R /XYZ 85.0394 769.5949 null] +650 0 obj << +/D [1896 0 R /XYZ 85.0394 769.5949 null] >> endobj -1882 0 obj << -/D [1879 0 R /XYZ 85.0394 573.0107 null] +1899 0 obj << +/D [1896 0 R /XYZ 85.0394 573.0107 null] >> endobj -650 0 obj << -/D [1879 0 R /XYZ 85.0394 573.0107 null] +654 0 obj << +/D [1896 0 R /XYZ 85.0394 573.0107 null] >> endobj -1883 0 obj << -/D [1879 0 R /XYZ 85.0394 538.4209 null] +1900 0 obj << +/D [1896 0 R /XYZ 85.0394 538.4209 null] >> endobj -1884 0 obj << -/D [1879 0 R /XYZ 85.0394 504.6118 null] +1901 0 obj << +/D [1896 0 R /XYZ 85.0394 504.6118 null] >> endobj -1885 0 obj << -/D [1879 0 R /XYZ 85.0394 432.7569 null] +1902 0 obj << +/D [1896 0 R /XYZ 85.0394 432.7569 null] >> endobj -1886 0 obj << -/D [1879 0 R /XYZ 85.0394 303.3232 null] +1903 0 obj << +/D [1896 0 R /XYZ 85.0394 303.3232 null] >> endobj -1878 0 obj << -/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> +1895 0 obj << +/Font << /F21 714 0 R /F23 738 0 R /F41 940 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1889 0 obj << -/Length 3825 +1906 0 obj << +/Length 3824 /Filter /FlateDecode >> stream @@ -8208,29 +8307,29 @@ h £L¨¸Â›2Ž¤Šà˜ÊjŽŠåû]>ê|“(ÑÆô®³av½Ò»^q¬$C“¡Ç|qYðw)Ð÷þæ Wr–ÇëçbÙ–Ÿ‹ÿx…f&@Ã2Ô \ÙZ6Ýmž _•˜¡ áÁKa¸t…'z ù²ªr±ØðPåý¿°Èªendstream endobj -1888 0 obj << +1905 0 obj << /Type /Page -/Contents 1889 0 R -/Resources 1887 0 R +/Contents 1906 0 R +/Resources 1904 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1843 0 R +/Parent 1750 0 R >> endobj -1890 0 obj << -/D [1888 0 R /XYZ 56.6929 794.5015 null] +1907 0 obj << +/D [1905 0 R /XYZ 56.6929 794.5015 null] >> endobj -1891 0 obj << -/D [1888 0 R /XYZ 56.6929 752.1413 null] +1908 0 obj << +/D [1905 0 R /XYZ 56.6929 752.1413 null] >> endobj -1892 0 obj << -/D [1888 0 R /XYZ 56.6929 501.191 null] +1909 0 obj << +/D [1905 0 R /XYZ 56.6929 501.191 null] >> endobj -1887 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F53 1027 0 R /F11 1384 0 R >> +1904 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F48 955 0 R /F53 1032 0 R /F11 1400 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1895 0 obj << +1912 0 obj << /Length 3111 /Filter /FlateDecode >> @@ -8247,99 +8346,95 @@ D “]Erü<@ÊžÔßçÍêý>¯«ÍËÔ©Zê`žÐN4á“"NÜC÷S ¯¿2²³2L‘+ÑDïÐÚ÷•l¯ãÂþåCâÁYÀÚûu¬Ö#f‚Y+žÜŠ¹ñ¼»¯žÀOåäžRqä~øÆžêJMï)'åh²Å(MžUÞÒä‰öqšì©7¡)É„fˆqš±†B3–øÌ¡{+Š ´¢Ø’åë’·‚χ£=¹ä, ~Ñ4N¶Ø< [ˆéPíµ,C–Ïx£+?gHl!Ûæ@üQÖxä³g/÷\:tÒ;r çy÷öüo¢À4ÊTà…A½²ŽÔ”Y©eëêuiqàÅB½a€“:µ`pá¥àƒ°oÂ-Å-r¡­ë,k÷½Tzèlœ»Î4çIˆƒ]Ænn§¦],/òã7<Ü q0 9ÿÂêŽFÅà‹à¬j't¢»ïÚHzq(ãžòëÜ^K¤íI¥¡*¬a—Ö}×˪±™Êª+Þöå™Ïë:çËJ?†S=i}¾”÷ùÔ´ØkxSÎH -gˆ¯nGªïÜëÃ]51ŸVÍ›%”^ÒM‘1aúô,‹’0ÂÁ%ŠX¿ZñÝ)…"´¨"Ñ“çÉï_0[”ÌwÕæ’ñÕ±;«¤{-ÌM€P°~?Jj*Ê OóÚv1·½]q è\Ž÷f=1Ù¤;Y0®3ߤõì[!ZR¿Ö¡ÐypÖ{ òËí_×_¾.©bŸ–Oø†(3[Áƒñlé‹'«ÝsÔíÒ=ë1^Ô’½…®U¯imGì,æÈTìmŠËJœ—&)ïM%û<Åt¥¦)ÆI9ŠY§˜³Ê[Š9Ñ>N1=õ†b`crª–Ø5M$S –ÈÛPøxM¿H1«u¾z¦­5YQã‰0ã?2€Ã2X0a²;Je@>± 6õYÆOü¶—{ÈÇ¡ª3¬2Ì5éãúóÝݧ½åv'Äê±—XÒÅÐ$àdìo¥–¡i X¡›É{ÛsZÛkÛ¡Úñ[Û®ÞkzÄÊ×ù÷~é|üõêîÎÞ‘çeçeÔåíN¶ÏU“n…X¯ü7žUZ™i§²L{ÓÛÀbŸ¸r—D`Îhu2Cµƒ?NÑ°ý¢°«÷¿óérùëÿÉ£öäzø—X#sî#þç?øjÿœ-À¿¾I&^ ð £”–Ö(t“ñÐt÷§a§¶ÿR+¯^endstream +gˆ¯nGªïÜëÃ]51ŸVÍ›%”^ÒM‘1aúô,‹’0ÂÁ%ŠX¿ZñÝ)…"´¨"Ñ“çÉï_0[”ÌwÕæ’ñÕ±;«¤{-ÌM€P°~?Jj*Ê OóÚv1·½]q è\Ž÷f=1Ù¤;Y0®3ߤõì[!ZR¿Ö¡ÐypÖ{ òËí_×_¾.©bŸ–Oø†(3[Áƒñlé‹'«ÝsÔíÒ=ë1^Ô’½…®U¯imGì,æÈTìmŠËJœ—&)ïM%û<Åt¥¦)ÆI9ŠY§˜³Ê[Š9Ñ>N1=õ†b`crª–Ø5M$S –ÈÛPøxM¿H1«u¾z¦­5YQã‰0ã?2€Ã2X0a²;Je@>± 6õYÆOü¶—{ÈÇ¡ª3¬2Ì5éãúóÝݧ½åv'Äê±—XÒÅÐ$àdìo¥–¡i X¡›É{ÛsZÛkÛ¡Úñ[Û®ÞkzÄÊ×ù÷~é|üõêîÎÞ‘çeçeÔåíN¶ÏU“n…X¯ü7žUZ™i§²L{ÓÛÀbŸ¸r—D`Îhu2Cµƒ?NÑ°ý¢°«÷¿óérùëÿÉ£öäzø—X#sî#þç?øjÿœ-À¿¾I&^ ð £”–Ö(t“zhºûÓ°SÛÿ Rƒ¯`endstream endobj -1894 0 obj << +1911 0 obj << /Type /Page -/Contents 1895 0 R -/Resources 1893 0 R +/Contents 1912 0 R +/Resources 1910 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1843 0 R +/Parent 1915 0 R >> endobj -1896 0 obj << -/D [1894 0 R /XYZ 85.0394 794.5015 null] +1913 0 obj << +/D [1911 0 R /XYZ 85.0394 794.5015 null] >> endobj -1897 0 obj << -/D [1894 0 R /XYZ 85.0394 679.319 null] +1914 0 obj << +/D [1911 0 R /XYZ 85.0394 679.319 null] >> endobj -1893 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F48 950 0 R /F53 1027 0 R >> +1910 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R /F48 955 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1900 0 obj << -/Length 2838 +1918 0 obj << +/Length 2837 /Filter /FlateDecode >> stream -xÚ¥Z[oܺ~÷¯ØGITÞDQú éAÚS÷ÄA $~W´-D+mVÚίïð*R·=m±¢Èg8óÍ…äâ‚Þe<å)vyÁÒ ál·?\¡Ý#Œýr…-ÍGô&¤zw{õ§¿Ò|W¤'|wûÌ%R$ÞÝV_’w)N¯a”¼ÿøËõÂ3D’·77~{ÿñßðž! „’¿¿ýíóÛ¿™¾›ëÈ~ùðéúîö׫·^˜P`Œ¨’äûÕ—;´«@î_¯PJ ‘ížá¥¸(ÈîpÅ2šfŒR×Ó\}ºú§Ÿ0ÕŸ.)€e"Íã  -š”“e5á4Ljr†SR0êÕÄÄ’š•RÓ«/mww’ûó©—Ó%c"RFhðÅwO5gOhÀSš2”‘˜ÿ­Òw÷øØÈë7TàdxÒ ’ôr®qR·æ½{ˆpòû{óüŠ2tºÆ"Ñ‹¨»ÖÐW²¯MwØÐÞ׃iÔí„Ý÷³<½\cŒEŽXrûT÷Ólˆf>ºQ*Ó(ËA8-2X¢ZY%Ês3¼RL’ç§zÿ+Šä ˶W‚‚p  @/Ï3Z՟ז&Rbž„–¦íN‡²i^̼½l+%! :ÐÇiFÕkÙÃêTÉï²€^­L•ç¡;”C½7³ª¡ªîËûFVf¥³”#)Zêó“lû(}j©³Pj–Ïyf¥~Õö½,O Žùú£D·¾î´00Ü«éÕp*÷ra&*RšqbÉŒyµˆÝq€u÷æ¥4š2/ç^VéÌï­sq‘§¨@bÛCªuôTÞC•D.H8 ¾MöžjÎâ‚E -¸±ÿÒÖ£8ëiˆCË(É´]Àþõl1*RLòl·‚¦3F9 òpì´Cgž_"m呦€|êNõ˜üa»Úò @§òd§y°øo VE–"ˆN1Vv­27+’}×eÝêã°« Õº—~´éºoàºû|4ÏRÉ«ÁIŽMùbzý<ŸþñÖ [wìô³rTå`Fe©#CÄØ,ÍŒ?•:Z€ò¢…èrCC-m¿”¤Bäô~ª ü:*_ï…x!X0.Ä6oO5gCˆà”AsòGÖALÎ(¸É…ƒ4*ÙÈÇÒBŽåðdF´mºCô7–ëºÁt[è!ô -= ö|FBƒ Gp>‘¡,¶¢ƒ•Bîù¨ -LÕ¢4n!ÞÅŒuïý‹í5™FL¼;‹@Á²Õ3,y2Ey -$ä²'û t(¿Ië€õ OÞM…Ë7vé$ƒ!ÃñÚµçjÝ£ïý-aV0bõ-ë‰jÔ« ºÊ(J>f𹆢¡iÌËC×4ÝsÈäAžNeÓÛáÑæ@à™6"ki•Æ¤þ§îÙ â"wLSyBvv¾;²<Z¡‘à¹ìÇLd»0„XE^¯Ô¡Ô°â÷çiNßöûjÝï=•÷ûý¡šy=‚ZÓ œ=Õœu 7È.¬`Þ£×+…q‹Âir<Õí`‚6t« 3¨ûêA!¤lÌû¾;d;¸ÁÉdÝy8žÝ`tõËŸÛS)xèˆb9.8ÈN‘*õ·K»,ÇŽF¥í:  •OJKoûµ²f„ÔSés/]‘VM­JpTd ]Õ?*#³%!<µBï-3qÖ@G  èB² ©6@ç¨<èÀ OÃj²Ùä=&›óådq¿1Þü°`5iÕ-ÕîÉôçÏYâÕ+#ÅÚuî­µð¤)ÿO -kèH+ã¶&Pr”%šº•}¢ü×&{þ¯aÐ)dÝPðeìPmØÃQ9¶œýjŽÙä=æ˜óåq·é˜ -ŸÜ¡éœ\µ_÷¨­Vhu¢0OµŠºê}ÿgušÃT‚ê§|p2%(4e%_«Í(éúú§ô Ö÷4ƉÍËÄ‹{kî®ÝDǽ„ê¥vÛÜ?’2ƒzh\ú*‚(ÏSÆÈ…ÜR­#ÈSy}?Mù"Í趖fÎuRS¨ža ±½5ò¥²ZÒ1Ù«ën]_nëQO\³'´VzW¯×'sÇÜ7N×(ÍS Uþ¶%F¢ CX¢Ñ*ƒ)ïY‹¬[¼ÇÀ:e¾WCîΪBÑæp•‰ß§(sp2î$¼¨ú­—ûñÅìd¨. ¥Ö54íá+ÌSZZ_8B[[‚»íïp>µ¦ðg…vºõbå¿.Wá5löã‹ÃV…öU0(ó -„.dÚjžÊãa,Ó⻎Äé6sO5ç> íà–¶mû÷a:{¨Í¶wÛ€H«.!—Ó`ko1þxÚò|½aÎRŽò )7¤Ú0Œ£ cÏzç» †Ršx›¿§š ÛÊlÊ‹%mÃœm˜³ ‹lÃüI1JF‘õëhZó0c¶d”[ó°Ð<Ìš‡Yó°ètyÛ<¬(fvÝ!Õ†yÕhžªªÕêÊfn®îZòm<Õ\‚Ø> )¥"– 0wæáÎ<<2OîÌÓ@dý>Ú‡qknì×ìS8ûðÐ>ÜÚ‡[ûäÞ>:˜ò"Í©˜TDFÃI¿ë¢u“9¢ÑbM³z8·Åv<››ò]>š ’6Ƹ²mßÈÒ6•<óxó!Z>®Wi˜«0ráâ-¤ÚP‘£2W‡õAþåv¥JÛd몴×å*-b Òøqy_5@(Ë;}Öïæj¥y¸l¯H»¥+Qp•<ËÝÁýí¡€úÄ߆‚tmÕÇAˆ„ 72Y°EI@Ç ·ØŽxžò]†sÈØ¢™úæN(¥ ŒÄÜqPJ(¤Ý¹ìÿnøþ§endstream +xÚ¥Z[oܺ~÷¯ØGITÞ%èC‚¤9hOÝ-øA^Ѷ­´Yic8¿¾Ã«HÝö´Å>ˆ"GœáÌ7’‹w~xÇE* +R첂¥a¾Û®ÐîÆ~¹Â–æ#zR½»½úÓ_i¶+ÒB±»}æÊS”çxw[}IÞ¥8½†Pòþã/×oˆàˆ$oon>üöþã¿á# „’¿¿ýíóÛ¿™¾›ëÈ~ùðéúîö׫·^˜P`Œ¨’äûÕ—;´«@î_¯PJ‹œïžá¥¸(ÈîpÅ8M9£Ôõ4WŸ®þé' Fõ§K +`6òú Íq2<éIz9 ×8©ÛGóÞ=D8ùý½y~E®qžèEÔ]kè+Ùצ» +lhïëÁ4êvÂîûYž^®1Æ €"C,¹}ªûéG¶D3Ý¿(•iäˆg  œ–¨VVɇòÜ ¯“äù©Þ?ÄŠ"9ȲíÕ‡  (Ð+2Î@«úóúÑÒDJÌÒ‚ˆÂÒ´ÝéP6Í‹™·—m¥$Dúø!ͨZ`-{X€*ù=PЫ•)¢ò€ýëØbT¤˜d|·9MgŒräá8Øi‡Î<¿"DÚÊ "MùÔê0ùÃvµåA:N?äÉNó`ñ߬æýã­¶îØégå¨ÊÁŒÊRG†ˆ±Yš*u´åE Ñ 円ZÚ:~)Ió<£ðPmà×Qyüz/ŒÀ Á‚‰<ßæí©æÌcœ2(bîQþ(Àú ˆÉ…09£pp‚F%ùXZhÁ±žÌȃ¶Mwˆ>Ær]7˜n ½"„^á ÔžÏHh¤ñΗsÄc+:X)䞪 ÁT- +@ãâ]0ƒ±î½±½&Óè‰wç<ÐE0…lõ KžLQ– ¹ìÉ>ÊoÒ:`=È“wÓÜå»t¡Fà8^»ö|B­{ô]£¿%ÌêF¬¡e=Qz•A·QEÉÇÁ >×P44yy蚦{™<ÈÓ©lz;<Ú<ÓÀæ@d-­Ò8ƒÔÿÔ={A\¤ñŽi*OÈîÏÎwG§C+ôï1<—ý˜‰ì`†«£Èë•:”Vüž ‘f$Û~R­û½§ò~¿?T3¯GP«cz³§š³ŽáÙ…lÂ{ôz¥0aCMŽ§ºLІn‚au_=(„”yßw‡ƒl78™¬;dz¬€®~xñs{*Q,ÇÇÙ)R¥þviÇ3ìhTjÑ®ÃZÙ¤´ô¶_+kFH=•0÷ÒiåñØÔªÔGE¶ÐUý£2¸- á©êÐxo™ùˆ³:IŽ.$›jtŽÊƒœð4¬&›MÞc²™1_N6÷ãÍ? V“VÝRížLqþŒ%^½2ÒY¬]çÞZËÇãHÝF r÷c éç°j ¦¶«y†·-R­[ÂSyK8§X-[7ÙeëŒÿrÙ ðéI‡vpÀ/:ÿ‚óUéhuð†®ïLŸ ïÐøxcÆʪ²Aµ7ºšS#G/3Ñùp/On‚ÒÍz6MÌœ½ÌŽ0K³œ.n“(gkÛ$žr&üÎÆÃ|º³m»=’«ÔaZãáis< Pœ||0½f>ÝT1-#´ýÎï†Ô‹iC„éU.À†×b“r:‚9dkÔ®–×-ä,-hÆãôØk»EHﻳæ¶wÈMc\Á cÕr¦Ñ±ïa:ábz=Žî[-ûšvÛ5O½9½HCª OrTc"5±·_÷¤-ö'Mù¯xR(@XCGZ·5’£,ÑÔ­ìãå¿6Ùó ƒN!ëö€Ê@ˆ_°G@µaG5æØrö«9f“÷˜cfÌ—sLÄݦcšûäMçäª=øºG½hµB#¨{ýƒyªUÔýPïû?«Ó¦BT?íä〓)A¡q(+ùZmFñH××?¥g°¾§ñ0N|l^&^Ü[swí&:î%T/µÛæþ‘”ÔCãÒWDE–2F.äÆjAžÊ#èûiÊ·ÈSN/°µ4s®“ª˜Bõ [àˆíͨ‘/•Õ’ŽÉ^]wëúr[zâš=8¡µÒ»¸ú{½>™û8æ¾qºFi–b¨ò·-1mÂvPLyÏZdÝâ=Ö)óå¸rwæPŠ6‡«Lü>E™Cq'áEÕo½Ü/f'Cuh(µ®¡i_ažÒÒúÂÚÚÂm‡ó©5…?+´Ó­+ÿu¹¯a³_¶Ê(´¯‚@™W t!Ó†TëpðTc™ßup$A·™{ª9÷Ih·$°m‹Ø¿ÓéÜCm¶½ÛØDZu ¹œ[{‹ñÇÓn”çë Ö +”]H¹!Õ†aÕh{Ö;ßM0”Ò¬ÀÛü=Õ\€Ø6PfSX,ÁhælÃœmXdæOŠQ2Š¬_GóИ‡ó°%ó Ìš‡…æaÖ<Ìš‡E§ËÛæ`E1»°ë©6Ìã¨FóTU­VW6sûu×’m à©æÄöI)Íc ógáÌ#"ódÎ<" DÖï£}˜°öÆ>bÉ>…³í#¬}„µOæí£ƒ©(Ҍ擊hÃh¸ )b]@´n2G4Z¬iVç¶ØŽgsS¾ËGs!ãOÒÆW¶íYÚ¦’go¾"DËÇõ* uF.\¼…T*rTæê°>È¿Ü®Ti›l]•6ãº\¥ElAC?.ï«ey§ÏáÝ\í@£4—íi·t% +®’ñÌÜß.äPŸøÛPðƒ®­ú8‘äF&+¶ˆ' 7øû·­Ö\ëy9-é° 0(Žd0‰ÝdYpØK¹SQ—°2»{›±=C¯Êì˜õâ3´ \פUìSnçö-Áu ?C]C-.Ô?7.¤ÊjµŽÊ^xײŸÃvôì-ÎkOY¯øvÈÛB×Ýt©†?†±×mzÔéè:ûÔª†Æç÷7¦áî‡"2ncúæÀ!œ¦Æ|éá¹%¨Û~e5‘Ï üEpLÕ#X®ÎË\ 6ë9¿È×Ý‹Õöâ ¶f^ßÁ¥ß|]¼”ßÏe—g?¥9¸šn¸À¬RÃ\Ý@µí6áfªsëÏÀôevÀ ¯b:ËR’‰ Ûå€hã/H–Hú$€Þb;âyÊwÎ!c‹fê8ð¨Qh›3ìѬšyÚÍ”93ÁÓÐ1{L›¾%LCš±b[$+f…t+öæ”'$5Ç>ŸÕ¡OS[:uO@iÎ +Óš8³tüÌÕÿoœ'xL:´Uœnþëvßœ«éᢾŠsPÿ~µòÇ;à«þ-·€´sÎõÿ)oüË!Ë cædO$ã)|,œPJ£¹ã ”PH»sÙÿmÅþ endstream endobj -1899 0 obj << +1917 0 obj << /Type /Page -/Contents 1900 0 R -/Resources 1898 0 R +/Contents 1918 0 R +/Resources 1916 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1843 0 R +/Parent 1915 0 R >> endobj -1901 0 obj << -/D [1899 0 R /XYZ 56.6929 794.5015 null] +1919 0 obj << +/D [1917 0 R /XYZ 56.6929 794.5015 null] >> endobj -1898 0 obj << -/Font << /F37 799 0 R /F48 950 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R >> +1916 0 obj << +/Font << /F37 803 0 R /F48 955 0 R /F23 738 0 R /F21 714 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1904 0 obj << -/Length 3265 -/Filter /FlateDecode ->> -stream -xÚ­]sÛ6òÝ¿B3}¡§‚O~<äÁ©ÝœÛ4Ik§w7m(‰²9¥HU¤œº¿þv±DŠ”Üi/™„¸Ø],ö›3Å,5Œ«LÏ’L3Ã…™-7|öïÞ^3÷@ó>Ô›û‹Wߨd–±,–ñì~ÝÕ2ž¦bv¿ú9ºúøñæýõí.çÒðè »œΣï¯ÞºzGk/3]½½¹ƒil¸ `1®oß^þzÿíÅÍ}`¦Ï°à -9ùýâç_ùl|{Á™ÊR3û ÎD–ÉÙæBÅŒVʯTw?„½·vë”´I™‘:žÍ8Q™˜gÜÀ±ç‰æ,‰¥bÒ锘<ŠéËzÕtíëëãã -%Ys1ëãQPcÒRõH •°T‹#ÚwEw9W*‰ºÇ‚õ~³(v8Ž£fMkÈŸË݆ÇüÉíèzæÛmq)¢|GӲƽúÆô¹NÜ•J\ƒ·àb•7`<&âç$&oZ«’Dµt’"†ÇÈd"VñßU.6òäÎ]Ɖf<ÙyŸÚ‡:íS”õ©‹ýº-ÿ,^¿yU­AäpÅgi¨1ñ¡WÕK²Ø ©[¯*½5ãàÓõG€¶ùƒ[&Qük«ëhèÀ1Žâ(_=»®lI¬“@Ûë÷wÜ¡ŸòŒ2N0{ey3q;ÑTâÏ]Ñ2ty‚¼™e3ÿ£Üì74A‹!ó†éÄdC;Ù”µƒM2{„–†=ðÙ=–nep^˜,&±1ʸuk¢0àô °vKzZ=_ -!"d9K¢Ÿ0…@wë©î;ôäÒ)v9ÈOXZ0¶ãf_¯ŠÕ”ØoÉ0¼í¯šÏΦ!àÑÞí®ÝãKð!_¸taç}Aî0üI§¡™sH0ZæûÖÙcN¼uý¾/vÏ‘Û¸p°äVOÙšÀ›l­uÆÖ<”µµbU·¯¿šŒ¨¡9O8@)¥/èßT:$}*Q®­4RoliUµeS»÷ =ƒSq¬êk_åÊí W—ö´&|ˆLã€ÑwÎHÏòBÉ(8ÿ¡¦ýÿîÿ86˜Œ“ùäà˺Á+›p àõ”!ܲ‚xÔE:’Ŧ°Y¢Ë–† ºƒžTD“ÄÀM¬Î+bê´"({®Ÿëæ× $aeUÖÅHã”%à[ÏÓPc†ú˜@5ÀãlÈÁÇ]‰y–©“Ó²±ÏUK‹Uù[A#+OÜ}¸ÂA2½Ó|æôÑ.šÖí´'Û£Ú9d'›ÜQ§T -GûM^ÏIëbà9æGî›èæ«|Q!". Þ`þ†A!‰ \).Nбj¨ØPq¾uG‡¥"_>ÒâðL´†æˆP9M1°aáY Õ* h×ùn`Ùnw¹ÇŽz Êê Sðéç]²o - –õYÐÄ-ˆ„i¥= „•íþ´s5`Ð)7/ètêŒN{¨ Ó뼬ÆÕ!¤Ž*‰Ï“PcÚGyŒ‚|'Ò¾Æ"IC)Òt4èÐñ(í´×¾*þpïÚb÷dëFíÊx>7{‚wzPØ,ßäô¸»ùñÒ˜è§o.]ݾc´|ïÑŠ*@b+)íj· ¶|ñ –-JYà\‰:Nì‰UsKTV›ùN»:tgÅP©j´4çªÛn¿èƒcVì‘/ -¨’KÐ~8ÝIÕÑPSqÍ“óªÓ‡:­:*¨Î¢€Zd ®¡)d¬ W/0 ÆY‹-ìÍ…« -×-&Ã1y -ƒ)Ûm•?»E+l@!Ñ¡Ó!+iXuérK3Y±èÅd„Ê+t~ÅÊêóXø"èNÊÖyAHÙUj†:áC©U*›æ.a¸˜\·PŸ¶§¯TÅLÆü…T«uæJ=T¸RÝm±]§áP‰Èô<ñ5¦>¼NHk’D‹!ù H>Z¼#U3ü»›¯i< -^‚Êjûlm3À®<û—+áĪÀ1Âß¹¥Ûú 7üúü/hŽ‘Qdña÷‡÷S¼Ðkn-=êÝŒªø|µ*;H]‚mcÁÑÔãˆÒKÄ(å?¡*ƒ@“ry^úP§!@EhˇåcÞNd:’%€ã,u4¦>T¨&™©!ù¯-Ù¹„üÂ_š”X¿>Ôy·¦)±y‚}´KÞ¨?®ãÐÒk ½v`SX‰¸Í¶¬¬¡…4Gó뉆°N%Ó™Òƒ“¾Ô–,KÓtº!<_‹†[X9ËÝíÛ¯ÿuuwsZ@è1ªßy}èAÑeõ¡Ûí±é4ÿ­x~ýüéDtªÎ³ Æ< µ",VYp©*hŒn4Â?XÓî2öÔ/Ã9ðï6£GÆçÂíÜ·ÆjÅD Tif²ÐLû²oGüc+?Kí©¹´76mE ÓßÝü×·<áZÒLM%͇ÄÖ 8Æ°ó®£ì|À·0Óe!‰…-ÎR‹øÖ6MŒ‹CIµA¨«¯&2ÙD0¡âø¥L6NC¿ÇU™@£jšßˆÈz²¥h&uh)Ú®_OÍü›"&%“™O›ÁYNv«%Sæô"Ò ¬R -~pÛ‰‹Èý’<Ž+rTª@$=qauî¾ïÙô]øá2²ïzþÊn|^qÏ_îýŒ&ý•LЙêl¦¸`BÙ?öWã¼rl°œK"Tr ü—ü•å)á›Wê´¿ -P!~uÍÖ6ÓF™L ¹×穨1ù£&XbD2¤ÿoÔ˹´ÝýÜU";3xqÌ„f4Þ;L i’Óv8Ðܵ…m!•«¼³­p0Ù±:Ág¯PAÙÅÍ‘Îþ=Øë›–&eUãë˜Ç8Ð1°j£¥9Pþk:&à({¡tîCÑ1t ?ë,Ï’>”Î#Ú“¥ó€öm½¬ö+ŸVÖÇ-2ûÝÓ¥˜‡Zôöº_HÚTÛ©E:|«ÐãÈ'óP ‚­A·R0ˆÕàÑŸS§êûOï°*½¿ýøî†ÐüðéæÇÛ›» ï ^QÆL‰ôðÅSB‘ýæö=2¬³(£…r³­ì—¿ÜeÍÚ~-­‰¥x±ÿ"2µÚýv ElK”Zêû’$€Šm…m+Ç -¤´&† Ô´HÑ°»EtQ÷ GX_”Ži¬\4ÁB(KÅQø§ó)®¨ÁµçÏrdק¿÷¡÷5܇ÔùÔ§3¡Y–d^6‹¼Ã¬I`p)"<%N›-r~IM„Ë_¸ýn Ý£mâR ®/sÇý¢8p_•ö‹4¬’‡Áu›¸XŒŸki0@4H@"fþ@@À«ÊÚ¯\ÚcYm½5¬Fl0á¥(å¿åÀh IbV1µÇßÀà ÷IÑ™ø -‰ -O½ ©¡ð°w_® ™¡ûÆ܆åÜñS‚%>•«½-• DZ¯<Ë…ã˜tÎ5kq¥}3ùƒÆ«¢]îÊ…ûü4bºÐGÅj¾hž -üm „ wÓ’ÓïlEŽ3{ï¿Ÿ=÷¤«YqÐvÀFî³V„ wƒ¯íÝààp‡‡Hï·,Ɔ¶/ÜsÉÂmÞoÝ>«fÒ_o^MumûŸ3ž·Å‘Ž,«¼=Ö{ºi -ßלãl›}µfl¹Wõþ”Ö#oz¬W¤wU³ ‹OÈ$¤û¹ >ƒ&Äž/«­Yè_á&Ï™û ->œ¹_¨ØE›­;¬`ÁÕ’Ôß· íðh¼1Û¢Û6Ãl­ŽëÓ· °?Ûí¶¦Q¶¿ïz¸«‚^‘RÀôK;ƒÕý¶rëä…¤UT¡é:ÝoÛMOJø¢§{0#•äò$‹pÜù©_Š)¨ÒÕä‡Bä?þÙá7r2üò>™'€÷d -?æ˜B± ž³n06¦2™àýÌMÀxendstream +1922 0 obj << +/Length 3268 +/Filter /FlateDecode +>> +stream +xÚ­ZÝsÛ6÷_¡™¾ÐÓ +Á'?òàÔnÎmš¤µÓ»›¶”DÙœR¤*RNÝ¿þv±DŠ”Üi/™„¸À.¿]ì.%fþŠYjW™ž%™f† 3[n.øìÞ½½Žfî‰æ}ª7÷¯¾QÉ,cY,ãÙýº·VÊxšŠÙýêçèêãÇ›÷×·ÿ¹œKã7ìrn8¾¿zÿéê}¼Ìdtõö溱ሒÅ<º¾}{ùëý·7÷A˜¾À‚+”ä÷‹Ÿå³Èýíg*KÍì3t8Y&g› m3Z)?R]Ü]üì½µS§ MÊŒÔñlĉÊÄ´š8ã¶=O4gI,uP“N§Ôä©PM_Ö«¦k__oW(ÉÒ˜‹YÍç@5f-UµP Kµ8â}Wt—s¥’¨{,¨Qï7‹b‡í8jÖ4†òy²ÜMxÌŸÜŒ®¡g¾Ý—"ÊwÔ-kÜЫoL_ +É3§Z‚ìȾÎ7Q d• “q,¬?^HHƵr×kdL)Ø$¬/T×—9Žn˦nËì[¤Q±rûY´Mµï +†«Ïæ2™”U.XfŒ´+ß[½ÐQ±Î÷UG§¼Ú»ñ²¥§Óœ¥ü…sY[6ÐÝ·%h­~ðdn^í”Ͷ˻bSÔn¾W¬}•¥šIÀ–Ûð«¢[¾Ú°'{[O)È°X ¯Â¯`íTGVOÀC8VGuC:PI ‚­;;Qef¬¨°'-Ž”î͆A½I„iá5عÖ:zp$ŸËî[:ZŸƒ8è×Ö,<·lÝ»-t¨JKá¢á*ïʧ‚ÞÔ.yí¨?—UEC BÐÄàhÛ‚8.íúà®,Œ°G`Ÿö´°±j6yY·Ô©Ê¶óSú”ãSIÊR‘x˜"ÇåãÄY©”Á1x«)&–àŒ_‰ä9¹’7­UIªZ:M‘ÀãÅd"Vñßyrç.ãD3žˆì¼OíSö©ÊúÔÅ~Ý–¯ßŒ¼ªÖ r8â³¼Õ˜ùЫêŒ%Yl†Ü­W•Þš±ñéú#5†mþàFAHTÿÚb $ÆV嫧bו-ÁÈ: ôؼ¹~ÇÝòSžQÆ ^Á,o&Nn4•x‚ÅsW´ ]ž ofÅÌÿ(7û uÐbÈü…a:1ÙÐN6eíh“Ìn¡¥&ÞøìK72Ø/ô Øeܸ5QhpzY»%œVÏ—BˆEÎ’è' !ÐÝz®û=ù€uÊ£]ú–ôŒm»Ù׫b5åö[2 oû«æ³³i¸ðhîvW‚‡îÉ%øP.œXØy_»þ¤§¡žsHÐZæûÖÙcN +_п©tÈú Q®­6RoliÐUµeS»÷ =ƒS{ãXèk^åÊÍ G—öÐ>\Lã£ïœ‘ž•…‚ 8ÿ!Òþç|7˜Œ“ùàà˺Á#›p àõ”%ݲ‚û¨=ºéH›ÂF‰.Z +è6zˆ&‰AšXbŸê4•Ý×Ïuóë‚°²*ëb„Ç8e øÖóüÕX€!Èxœ %ø¸+1îÑ2uzZ6ö¹ji°*+¨eõ‰»WØH¦'`ø€Ïœ ÚEÓº™v§s»UÛ‡èd“;îJaëq¿Éë9¡.™c~侉o¾Ê.ÄÃŒßðRHbC—Ž‡;èX5dlˆAìoÝÖa¨È—48Ü¡9"UN]¼Øˆ±Œp/ˆj•…e×ùN`"ÙÀÚîpõÀê ÓåÓ»dß @Z@.룠‡ [ ÓJ{¸V¶ûÓÎÕ€A§Ü¼€éÕL{ª€éu^VãìBG•ÄçYª1ï£8FA¼“ y_c’¤!i:jtèx”v赯Š?Ü»¶Ø=Ù¼Q»´žÏÍžè +e⛜w7?^ýôÍe¢£«ÛwŒ†ïýò‡¤ +±™”v¹Û„X>yR+…,°¯Dö$ª½sK«|§]º³bª-͹ê¶Û/úäûÅdÉ% vw:r*®yr:}ªÓÐ T:‹r‘5¸†n ˆX®^ P%8²›Ø›¡W$®[ †cò27R¶Û*vƒVÙЀD¢C§C4VÓ0êÂå–zþ°bÑ»“‘*¯Ðù+‹ç±ðEÀvÊÖyAÙUj†˜ðW©• ó‚”Ð Ü\·Ÿ¶§TÅLÆü…P«OuæH=U8R¸ºÛb9:NÃ!‘éyæjÌ}xœÖ$‰Cö?|´xF²f¸ðïn¾¦öèò”VÛgk‹väÙ¸X ;Ç ~øÎÍ(ÝÔ_¸á×àA}¼Eføx?% ¹6àÖÒ£ÚÍ(‹ÏW«²ƒÐ%Ø6&M=¾Qz…ü'€ 2¸hR.Ï¡Ou*¡-–y;éH–Àg¹{¢1÷! ›Ld¦†ì¿¶lçâ hRbþúPçÝ>˜¦Äâ ÖEÐ.áòFü¸ŠCK¯ñêµ ÂJ,Äm¶ee -„1Øš_O„u*™Î”ìô¥’°dYš¦ÓáyXñµh8 •CµÜݾýú_Ww7§ñJ~çñУ:ƒOeñÐíöXtšÿV<¿þþŒ0‘Æ@ªó"ª± CTd‚Å*‹‡BØl k›…u6wÁUµÑÍ"œñƒ5í.ÓhOõ2ìƒün2zd|.ÜÌ}ëi,*&J J3“…bÚ—}ó8’KùYz(OÍ%,{cÃVd˜þî濾ä Ç’fj*h>¶ö’€m ó1ï:ÊÎ|é#]‚XˆÑâ,µ ßÚ¢‰q÷PGmPê꫉H6L¨8~)’ÓPïqY&ð¨šæ7b²ž,)š„IJŠ¶ê׃ƒS̤d2óa38ËÉjµdʈ^\4«„‚Üvâî ”~IÇ%9*U  ž8°:\î¾îÙô]øá0²pßõü•ø0<âž¿2Üû+hMú+™ 3ÕÙLqÁ8\eÿØ_…çý%Ç+Á¹$B%ÎÉ_I¿Hù ß¼úT§ýU  +÷W×lm1mÉÄ{p}ž{ ³?ºÀKŒH†üÿ¸œK[ÝÏ]Ö(²Ãe/Ž/3á/3jo‹†„ÔÉi:lhîʃ–ÊUÞÙR8˜ìN0ÁÙ+dgvqs„Ù¿‡1µ8iiR&ÿc~ÅyÉ ŒU-Íó_ØL@¢ì…Ô¹Oucž*` ?ëLϲ>¤Î#Þ“©ó€÷m½¬ö+VÖÇ%2ûÝÓ…˜‡\ôöºŸHÚPÛ'©E*|«PãÈ'ãP{A­[) +ÜÕàÑŸS¥êûOï0+½¿ýøùáÓÍ·7wÞ¼¢Œ™éዧ„$ûÍí{XgQFåf[Ù/¹‹šµý0¾´Pµ&–âÅú‹Èü­Õî·[Hb[âÔRÝ—4\l)l[9ÁP!¥51 ¦Aº-`«[ôA§UÏ°…ùEé„Æ<ÀÝ&˜e©8ºþiŠ+*Fpíå³Ùñéï}è} ÷Wê|êÓ™Ð,K2¯›EÞaT‚,0¸î»Í¥À„¿¤&ÂÅ/ÈÜ~·’îÑ q(èÇ—¹“~Q¤¯JûEFÉÃภ\슟kGi0@'€÷d +?æ„BµÌŽE7x7¦2™ýËÀqendstream endobj -1903 0 obj << +1921 0 obj << /Type /Page -/Contents 1904 0 R -/Resources 1902 0 R +/Contents 1922 0 R +/Resources 1920 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1907 0 R +/Parent 1915 0 R >> endobj -1905 0 obj << -/D [1903 0 R /XYZ 85.0394 794.5015 null] +1923 0 obj << +/D [1921 0 R /XYZ 85.0394 794.5015 null] >> endobj -1906 0 obj << -/D [1903 0 R /XYZ 85.0394 179.5067 null] +1924 0 obj << +/D [1921 0 R /XYZ 85.0394 179.5067 null] >> endobj -1902 0 obj << -/Font << /F37 799 0 R /F48 950 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R /F21 710 0 R >> +1920 0 obj << +/Font << /F37 803 0 R /F48 955 0 R /F23 738 0 R /F53 1032 0 R /F41 940 0 R /F21 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1910 0 obj << +1927 0 obj << /Length 1912 /Filter /FlateDecode >> @@ -8351,47 +8446,47 @@ xÚ¥X[sÛº~ׯ  aWš½ Ná¸Æ~<ö¹$ø¥?'q•è`á?í4Nû*mUx‡S`ÎH†o;¯ïæ³÷Ÿn†ÈÇ'TÊ–¤TùšcØʵ2üj@xM sŸ Sîû¼½<‹¹ÅÓanö†YÈó§ÌI—(u€B`b*©#¶mwB^Ëë£BÛòøÀ}5ãùK ÙF¬šDÞ¶¬ÏP- HeˆTËã8¶¹½û„ï»Óº½G¯WªI¯*Uëâ•À _¶iÇ0ˆìŠ¿üû·ÏÜü犀U:d=Üx~sƒÞÏ>Í?_ä÷•®ôÌpè;ü£áŠÌ£ž0+ëZ¥Óïjÿ¢ÊÞ¤Ý@Ä}è¨Ád‡Ý—Ûð”õ‡J‚ˆ„~·n\*Á³·kìý×ó‹nAεgßeý£×gH÷új´ÆÎÚ¾‘νÍ:ûÀtØÇ^ÙÝ ä¼› ®m0ÁOx8ûvŽáásϩɸ‹ -nþó{×mEÑÖý¦¿mò"oöçÓ1›ïK½©á|ÑŽ`$Œà1FPQ@å1ðy€‘Ü7—Óð·0šÁ©ìi8å˜îË[ôæ¢yb>N“YQVõb÷úÔŠÒ¡BS˜'l/Ó´HêzðUB,-ÚEÂû…Â'Qà· Xfº9«/Œ~¹¬p»~VƒÏÅ€p.Ù±Ææ¢Æf¿üú!H̨<Ö÷÷‹úvIÞœÕ':}ø ‹‡à­ Â0>N×»´,’—¡]$‘at‚‚ìzëaíbeX <ûnÞ™]™J»£ñS{ûd(M‘ñáÏe<ô ü9h2N2FOLo¿¾Úþ_nê".endstream +nþó{×mEÑÖý¦¿mò"oöçÓ1›ïK½©á|ÑŽ`$Œà1FPQ@å1ðy€‘Ü7—Óð·0šÁ©ìi8å˜îË[ôæ¢yb>N“YQVõb÷úÔŠÒ¡BS˜'l/Ó´HêzðUB,-ÚEÂû…Â'Qà· Xfº9«/Œ~¹¬p»~VƒÏÅ€p.Ù±Ææ¢Æf¿üú!H̨<Ö÷÷‹úvIÞœÕ':}ø ‹‡à­ Â0>N×»´,’—¡]$‘at‚‚ìzëaíbeX <ûnÞ™]™J»£ñS{ûd(M‘ñáÏe<ô ü9h2N2ÆOLo¿¾Úþ_oB"0endstream endobj -1909 0 obj << +1926 0 obj << /Type /Page -/Contents 1910 0 R -/Resources 1908 0 R +/Contents 1927 0 R +/Resources 1925 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1907 0 R +/Parent 1915 0 R >> endobj -1911 0 obj << -/D [1909 0 R /XYZ 56.6929 794.5015 null] +1928 0 obj << +/D [1926 0 R /XYZ 56.6929 794.5015 null] >> endobj -1912 0 obj << -/D [1909 0 R /XYZ 56.6929 581.7741 null] +1929 0 obj << +/D [1926 0 R /XYZ 56.6929 581.7741 null] >> endobj -1913 0 obj << -/D [1909 0 R /XYZ 56.6929 460.6765 null] +1930 0 obj << +/D [1926 0 R /XYZ 56.6929 460.6765 null] >> endobj -1914 0 obj << -/D [1909 0 R /XYZ 56.6929 366.7195 null] +1931 0 obj << +/D [1926 0 R /XYZ 56.6929 366.7195 null] >> endobj -1915 0 obj << -/D [1909 0 R /XYZ 56.6929 293.4426 null] +1932 0 obj << +/D [1926 0 R /XYZ 56.6929 293.4426 null] >> endobj -654 0 obj << -/D [1909 0 R /XYZ 56.6929 247.3727 null] +658 0 obj << +/D [1926 0 R /XYZ 56.6929 247.3727 null] >> endobj -1916 0 obj << -/D [1909 0 R /XYZ 56.6929 211.2315 null] +1933 0 obj << +/D [1926 0 R /XYZ 56.6929 211.2315 null] >> endobj -1917 0 obj << -/D [1909 0 R /XYZ 56.6929 172.539 null] +1934 0 obj << +/D [1926 0 R /XYZ 56.6929 172.539 null] >> endobj -1918 0 obj << -/D [1909 0 R /XYZ 56.6929 96.3402 null] +1935 0 obj << +/D [1926 0 R /XYZ 56.6929 96.3402 null] >> endobj -1908 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R /F39 895 0 R >> +1925 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R /F53 1032 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1921 0 obj << +1938 0 obj << /Length 4192 /Filter /FlateDecode >> @@ -8411,27 +8506,27 @@ VAC OˆøO´çföþþö§ïUA²$‹@d4Š†~¾õÕìáîG†þò‘N€ý£œ¡òÈþОˆ,Ü}²ŠÒvh#)*&[®J¦¯˜Mžè‚h@öaó‹R&MÌñÈlùYü>µ4uÉô•;>hØí+Hª˜…NÒ\ÓÒg o)¤\Š<•±½§‚aÙ¦CG¬ïµÔ2yÀy–b ïè•÷Ó/ÔŽê<ꓯêB_1ç ì`WAŠ3õÕóõ41ÒžþÀ˜¯%Ì7ÏüÌÁ¶óMŒ‚® N“:ç“ÄÄÅU@¶]¹ç¸SøûUÉôõiôõ<‡LŒB²c™ˆ5ú àlèAA]½Œ‡bá;pôå&œòo6Íëø»¾Þ‰ä ³ ÓqŒ'\ò̵î9'Ýȇÿ’J§YnìÙãdªTèÔ—Xj¨}-½%Ð|¡’®œxãÄM5ghêŽ,Ó†Nì4&Ä„9<¯yšéü)S‰ÉÓxÀö÷3ç,¶?g™<^Ä[T…‰Ã¼žft†ìÏîA¦0D¬Y^|m'NX§gOür N2ÿÆ[q#Q¤-›“«p’ž -?B£ ‚Ø{Úè€äN-(_í/ËŠéêS¦!$ë¯U~˨dÊôlÃæÉ×Öj‚ fö&4(' úuùRõ ™;‡i¿¦k~ŒðÉgêù.—Ögë¡Y¢Sm¿&%˜E%™µ£"}x•s(`Îß겉Ìss9ÛSâø®*îV¨6+*gS8`‚jÚ> endobj -1922 0 obj << -/D [1920 0 R /XYZ 85.0394 794.5015 null] +1939 0 obj << +/D [1937 0 R /XYZ 85.0394 794.5015 null] >> endobj -1923 0 obj << -/D [1920 0 R /XYZ 85.0394 751.6872 null] +1940 0 obj << +/D [1937 0 R /XYZ 85.0394 751.6872 null] >> endobj -1919 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R >> +1936 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F53 1032 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1926 0 obj << +1943 0 obj << /Length 1971 /Filter /FlateDecode >> @@ -8444,50 +8539,50 @@ xÚ½XKs ]uI7¢Ý(ñ¬¢û-ìxM’o}À&à £áàý&ËÕ«ñÅ.XšˆoÏÄ•ø:­×ã —•kqÒÝðaÿ÷( ÖsC¶ºÎ“ºþþÊHß4˜Ø{ý£’„9ßE!´à°! Å †0JHvëÍ|ùáqñ°ZÜßyüé<ÐtA‚#(0ÇJËcs8¶œŠrË h4¹Q¹Ú:`‰e¶-ZVc š7KË8A×ÝšŽí`­Œ–‘® ÏJO_>>:†O»®£V¯el0ýxûÁXÄ…ÙkÃ8p»Ðóaȱ´@ßR˜Á½i›=+ ˜!íT}v¼Šœ÷m.ÿÇ°mI˜]!¯÷n_ËüíàëÝN«½B’ó%#(IÄõ%’gÉ~ED0Œ!–ƒ%?»;óò³€˜ar~Á†ƒÕPa=™oË n1{wïäø¤§6É1oήéew×µ—ß²Ù]®Y¤'åQ—*o€Êgáo$ §u%N«M}5×–<%àbIoúKÿ_Rðj€b ºqD®Ç§§ôzxœR‡ë|póƒÓNò®Ûê8óŒÍ¤¨ã5×:¥K߆´ BúŸ™¾oK€²µŽ\ŸLÐb~ -{AÈf†¬ë‰ç$?Úa¹ñ‚>dICß/ÿKÝåð|T‹ý¸kàeXoЕV»E[QIw%†—uâT²®ÇuÖh¢×þ¿…#RÿéêÉîÀô‡ÿÛ=ýƈ Aý5‚žƒ±uJÇ„zÙö_àKßÿ ýF¡Wendstream +{AÈf†¬ë‰ç$?Úa¹ñ‚>dICß/ÿKÝåð|T‹ý¸kàeXoЕV»E[QIw%†—uâT²®ÇuÖh¢×þ¿…#RÿéêÉîÀô‡ÿÛ=ýƈ Aý5‚žƒ±uJÇ„ð²!ì¿À—¾ÿýž¡Yendstream endobj -1925 0 obj << +1942 0 obj << /Type /Page -/Contents 1926 0 R -/Resources 1924 0 R +/Contents 1943 0 R +/Resources 1941 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1907 0 R +/Parent 1915 0 R >> endobj -1927 0 obj << -/D [1925 0 R /XYZ 56.6929 794.5015 null] +1944 0 obj << +/D [1942 0 R /XYZ 56.6929 794.5015 null] >> endobj -1928 0 obj << -/D [1925 0 R /XYZ 56.6929 684.0716 null] +1945 0 obj << +/D [1942 0 R /XYZ 56.6929 684.0716 null] >> endobj -1929 0 obj << -/D [1925 0 R /XYZ 56.6929 572.8605 null] +1946 0 obj << +/D [1942 0 R /XYZ 56.6929 572.8605 null] >> endobj -1930 0 obj << -/D [1925 0 R /XYZ 56.6929 509.4701 null] +1947 0 obj << +/D [1942 0 R /XYZ 56.6929 509.4701 null] >> endobj -658 0 obj << -/D [1925 0 R /XYZ 56.6929 470.2699 null] +662 0 obj << +/D [1942 0 R /XYZ 56.6929 470.2699 null] >> endobj -1931 0 obj << -/D [1925 0 R /XYZ 56.6929 433.5878 null] +1948 0 obj << +/D [1942 0 R /XYZ 56.6929 433.5878 null] >> endobj -1932 0 obj << -/D [1925 0 R /XYZ 56.6929 401.47 null] +1949 0 obj << +/D [1942 0 R /XYZ 56.6929 401.47 null] >> endobj -1933 0 obj << -/D [1925 0 R /XYZ 56.6929 335.1577 null] +1950 0 obj << +/D [1942 0 R /XYZ 56.6929 335.1577 null] >> endobj -1934 0 obj << -/D [1925 0 R /XYZ 56.6929 244.1508 null] +1951 0 obj << +/D [1942 0 R /XYZ 56.6929 244.1508 null] >> endobj -1935 0 obj << -/D [1925 0 R /XYZ 56.6929 168.8052 null] +1952 0 obj << +/D [1942 0 R /XYZ 56.6929 168.8052 null] >> endobj -1924 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> +1941 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F41 940 0 R /F21 714 0 R /F39 900 0 R /F53 1032 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1938 0 obj << +1955 0 obj << /Length 1658 /Filter /FlateDecode >> @@ -8503,675 +8598,570 @@ a ¦×ã)]»Ž‘VÊÀí,1ͨ1)À«»h·uB¶q¸»+°#Ii«€Îâ!©÷ÏqlXz¼”âmŒš¡Ñ+ëþ•c¨ÄÍ>‹ìÑI$.ž”òVLK¿rS¤æ­Sø¨Šl¾çý–Ý_Yµ®Ðq¢˜ŒÇvG|5ùtü”ÝÙ{ÚJmÃÿ”…n¼®õÂèÑH¹fÞ(òE3º¼9·J"']fœ*È;ïNϵŠ™;æuRl’¼«#B+¥»ôèB£€">1î.άF&…êÎ"ÊùÏê¸ÀÑQuÝYÉ'1‰Úiž¾ÿtw> endobj -1939 0 obj << -/D [1937 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1940 0 obj << -/D [1937 0 R /XYZ 85.0394 575.4191 null] ->> endobj -1941 0 obj << -/D [1937 0 R /XYZ 85.0394 427.1073 null] ->> endobj -1942 0 obj << -/D [1937 0 R /XYZ 85.0394 329.3834 null] ->> endobj -1943 0 obj << -/D [1937 0 R /XYZ 85.0394 262.8864 null] ->> endobj -1944 0 obj << -/D [1937 0 R /XYZ 85.0394 196.3893 null] ->> endobj -662 0 obj << -/D [1937 0 R /XYZ 85.0394 155.0304 null] ->> endobj -1945 0 obj << -/D [1937 0 R /XYZ 85.0394 117.4002 null] ->> endobj -1946 0 obj << -/D [1937 0 R /XYZ 85.0394 84.3344 null] ->> endobj -1936 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F55 1035 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1949 0 obj << -/Length 2406 -/Filter /FlateDecode ->> -stream -xÚ¥YÝoÛ8Ï_aà^ fù!RÒ½¥MÚdÛ:¹Úv¯ÛÅ–!²ä³äÙ¿~‡RmÚ^ààRä3CÎ'i6 ðc©ˆJy:ˆÓˆHÊä`¶º ƒ%Ì}¾`3r Qõazñþ“ˆ)IWƒé¢G+!4IØ`:ÿ9ü@"r èðz<™Ü|}¹ùãÓ÷ûo_¯>Ü|½1™$jxõðp3¾¾ûýrÄ%…%°€Òá·«ñ«¯8öp™òáÕç›Éå¯éo7ÓN¸þZ²ÿ]üüEsØÇo”ˆ4‘ƒWø „¥)¬.")ˆŒ„p#åÅäâ?ÁÞ¬Y<F ŠN„³c$•’{G"S¢æH&oU½nŠf+‚‘8Qb J¤d,ÄšÁqs ‘‹ÄŒ)«Gˆ±¢JK5¯š&Ÿžó·Å¦^•Ùc^^Ž¨a”iAß®;LÄ$J¢øêÅY¹¬7Eû´B¨Ï͈Ì-rT†¨Å$<±ä}HHH’()-êçh ÄIµ fVfM ÄS’$qjQ¿pŸ?G‹AŸé¢Ì–!z‰â„ïÓ{îzU€òHD”D‘+ê,VWÙ*oßÖy€M“„ÓxŸÍú¬ØëMÝÖ³ºüç4Û³4Èè+ £÷r–^™¿µnt•øôô!Ôw·Oà#KEà—"Æ#½¾™|ü~÷0½»w«v (,K!`1~ÔpQ_vq*¡Îü—yÛ\Ž„dCXf{¯àØkŸrì,‹—¼Ò]nlü’ KüZl.Y2¬WË°™mÞÖmý§Ì æ¯ØZzY5ÇÎã¶(ç; °ó'¥¼ÌË¡Þè] FNpÏæ04c¤ý“J:Ég[ÇHÁ< ³wø•5ØÎsÍ¢ÊçøYTØ~ÿd)Aœ’vE5ß›‹¨€¼P!õUwo´võm “`¾Q”ħ£aå‚ôa4ìP&L¹ 'ûaŠB€Ne(æõ…cœž€O”®CÄób#W„CªñÄ›äe>Ó6Ç£íKwÐb–›lýTÌp¨rª ÉpŠX9|ÉJ°¿­ýª!Ïc „eÅÂ1ÞÎy‹\m›Ù?ZÉêÊuÈðûäêÛµD“Ôž -ß&µJÛˆÎé,Ø´08¹½ÒÆ(D<¼ž\½Ãñ1˜°èO&8ŸÀõ-¶šÃu±Ðv® 9ÇÑÛ¼,WY¥ùê:FàÌ; §¶ÍMFцŠâbúÌúþ2ËšÜ9E“WMÑ‚ç·ŒƒIššeãºÕÈ8² •‚6³G´Ïšº§ö¾¤Û>Î ¶6 ÷©Ž,À=ÍêÕÈß2j(Îóù©mé  ·ÅðÐM(ضõ*k‹YV–o8Ô˜è©{hÉÐ=»`DE¶$ÇÜ?‚*DÄ2:íþ}Ôq÷ïP^•Òwÿ”0.ãý"¥/W*IL•<-—äòüžRˆÔñž`“u>+Œµî™­Øt×8´˜Œú±¹C»ä¢û‡ÉÅå‡/'ÿbÌ…û—b–£_ÓˆR©8£ê„>Êè£ -…cF »R£_7yј)Ñ$=-\‡ -HçGc×Ê}ñ|­¨Äž3tê×*×^¬[ ‡ƒ •Ÿ!CÚfŒ uœVÒÆi˜2§[ -Ò1aqW^ûÕ££¡ÚL…ðc4Í! Œ Ækàúßûñ Žh3À@™ ØR‘Lù‘"njaÀOm9¢‡4!¸û½4ÚŒ\I¨ÛûÉa†´7ãéÝôœÝÉÙ]¨ðëY‘µ¦ o¬»4$çÚìt'ÂŽw Žÿ˜Ü|×›åý#Wh«Úãª:®Š9ä¶É7{üpÂQ¼ŸÞö9펅à Í:ºk³2î|>lžžÉ3Á(ÝK>!—BšÆg*¨>ê¸Ëv(ã²³pÅ“û×3/†*¥xtZ0 -æÇPØ@*b_²»jé§5' —pM/Ç(Cwx—1@â䬮ڬ¨Šj¹· -:ÍS½--ú){É=6]´põ9ØíncUm…2hÔ¬N±,˜o±HÉÖæx¤¦{7¶±ß~ƒEΚø ‰ ðœ6ƒ>ê¸t(c‹`&U‰P{wjÏÀN•œËbyW5 õsÂ|±&¹)†ìåLw|­ÄÌÖºÏ1öÑ»I¼hå¥]eb{¹‹yHÊ7)­õXØp¯—W¦*‚žÃ-«â¯ HX†Ž˜€<”(ßé¿L¾ì²ø—ÜZ“biÍ>`Ô%¼ài13‘H‘8–g’{uÂDʘÈÓ>Ke¼õ K -°ì«?f„­Ígù°)*Wtf¶ -}ª7­ínW«lóæS]éT¯Û¢®š½›-ÆååV—Ù®4«¯ ª›S,wº9`ÔMŸåçJ¦ÌÝÐo$Ýó{Ä€ÃÚÅ((«9š}ßïØÕú¡¥h°TÔ’TØâ[tì;gÝ÷J¸ÂE”f;›åPynNØ1HAV=ÖW?¦·ïÇŸôXïph|0Èì E¸[¦QØy&1¾wkí*gõªoõÊZ½ò$ »!Ý“6D.ò›wÝ:’ÙcQí›?›ma¾jÍá[ÎY›iá…}™Öc†iÀ¤»lº£-탴yeÞ'ì»=jî*!LÐ3@=Ðqcw cë/á˜-¢8Úÿ»Â+[c’ò„Ÿ”Êa¥òo.œ¤4•žX“Dzyþ¸].»¢ÎHEŽýG*$Ñl¤¢Ýüÿýÿéîßâ(_JŽd#K‹•Jï±èPÏöŸÖCÙÿÉäI4endstream -endobj -1948 0 obj << +1954 0 obj << /Type /Page -/Contents 1949 0 R -/Resources 1947 0 R +/Contents 1955 0 R +/Resources 1953 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1907 0 R ->> endobj -1950 0 obj << -/D [1948 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1951 0 obj << -/D [1948 0 R /XYZ 56.6929 748.122 null] ->> endobj -1952 0 obj << -/D [1948 0 R /XYZ 56.6929 665.5133 null] ->> endobj -1953 0 obj << -/D [1948 0 R /XYZ 56.6929 579.9397 null] ->> endobj -1947 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F41 935 0 R /F53 1027 0 R /F23 734 0 R /F55 1035 0 R >> -/ProcSet [ /PDF /Text ] +/Parent 1964 0 R >> endobj 1956 0 obj << -/Length 2100 -/Filter /FlateDecode ->> -stream -xÚ­Y_“Ú8ŸOÁÃ=˜Ú³V²$[~$ÉÌnBr©Û«ÙüuòŸ“éðÛü—»É¼«+:ÁTÉôß»çox° ~¹Ãˆ·ÁwxÁˆ¤i4ØÞ1Ng”º™ânv÷¯–aç«^ê3§q%[Dd@J9zÆà)ŠiDµ1@‹ÉÓHé;ŸŒö ›¼ü&íXà3¼%šÃ¿7²´D¤C¥`X†5Ѳ¬k¹ÿo«}µ-²Yx§ K¹]³¨¶»B6²iÔ‡ÅBÖõêPoCBHðO˜<Èó}·ÏËFÓ¦Af—40·6ãježÍFšÁªÚo ¬'7ÅH°8²BüZÂú)˲Ÿrõç‘:¤äÆÑ l ›ÊÑ샺ÉÊe¶,ÍLuhv‡‹Ì7ym¦Ý3+íûR–Mþ;ÆÑ"kòªtì¬n0UN6C›ZVHǹ1ÏMf'Ö²”û¬‘KtÑ•1E8Ǽ…*íy„u†‚vx)ûüŽIrº)Á ±äú®-Õù¶½“$Æ,îo«ŽÓs†QŒ&öÌÝœ[³Ì¶ò¢©bÁc↩ºT—MÕRÝ4ÕÕ]¦:ÛÖkªÞ¶àó>KaÄ"ð‚©ÊÃVîó…yÑÎ.wæQƒwüWÇcweV¬«}Þl¶— s$HBo¸CuÅÀŽê¶¯íÚ1ðé¶~w·½(4B4ñMo<ƒÜ»hçØaÁªª‰0I¡C€-P…[NÿR'€Ejs™ÁjÍw~‰ƒÕ\ßáx -¤Ú¼dµƒ‰I`Ü#vÚ&ÖåÒÌÐC>ØærE’\€m½D!5 tÄXª•Ao9ú¢ïÍËÓ³Ø^ -çíŠËK¾—9IC.I ʾ‚=Ò—GÉ qìúžkx(–µª_ÔtZu «^^!êòêPÛurq6of• èº*UìÒ˜ÂÁäõ‘£eYI;[V1\r' =Ãm²WÙ-9Šn‚Èl=´“ûm^×"ŽpÕ©_Á¼4ôkŽ³‰=ˆÑÇÙç›EêÕ`åB›ŠT¥„ùXçëR9Qç³fKÓnd$p~©C…wSU4Ó$HÍc´Üæe0•5‡aêI®¤Ñ³\H3õ)+™VI ¸Ê#wè>‰pû?½¿7#NS?F!1ûûìãÿv&–(C a¤ï Sê³ A >OM×!F_矟nzÂ#d“})m%<{«!Š-ŒÞƒ·Wû&?l›2DU3`Ø°ñÔ’ÐBwˆ1îû–Ê>"®I§ì.È8‹ù¹‡ÚlE‰™®ó$ýÛâ½­¨šª*~ nÞÊjWC,ŸÔ;14 òKSu†ÄWãõV`†]ç¥+ÔZ*ö1˜5´Õ'ï9&(&Â%#ö-׺>.|ñqƒ¾¶96¯ó?}˜Í$"ìèÂò"+aITyÓ¼í|¼ £ORáÄzf…»XY]û2IŠ„p;~3F{e;Zy8Cù™ð¶¨YÙÚÇšu0Ž³‰aHm„“\×7å·~ -xè±Tm{Oˆ\sw ±‡2®Ú.å«_ø·Ö2­o2…ü Ë5”·\­åÙxx†T©o*ºîŃßïúgÒ2~½)l!_eñƒîW‘î°Hy‚YŠÆ“ÙýÓã—ùã穧=¹’À=`§ˆGiÔw9ÓbÙfdoJDQ…®gªüÑYºýî*xËìò¥TÅOiÚ5¨yš¼ ÈIÜ®(—'ß Ý1u×Cyðؘ)UâêàrÒ÷2+êªMÓ&€úäÞçPÛo®ÃÂÁ|öøáØ·)V¾\g‹c˜AÁ“5VíºUîz¨§.¶êb§Öe”jŸõÏÎÚz›/DŠ"JèõœÒ!rW›ç)Åi”véƒ÷ÒJDÊ}Ù£×û³ÅQr]´–è\¶^bÐ(!xO¸™, QVfÌvo0XìßvMµÞg»î)aªs)ý‰Ð=|àÁ+Ô$8Ø·jå P@ì”ÆÄŸ+û½F ²µ¨³=ÔÙþÅJ¦[+=X™ Ÿf£Ocn›j( D”Ò¾÷*¯*åUæžVûªÐKg#íj) Ƴ‘¾ÇeÁâ‘ö?ê)GÁƒñƒy*Öã|¥ÜVw7föAÅ6+Ãr·ãçÑ}â»4-'q]š °éÁ]•fG0€†+s$ª-ë¼É_/ß|ª+{Ïà6Fþç_Ž÷]1¨è\ìõ¯’0°4%N(¥1!üTôö7„sÙÿ(Ä7yendstream -endobj -1955 0 obj << -/Type /Page -/Contents 1956 0 R -/Resources 1954 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1966 0 R +/D [1954 0 R /XYZ 85.0394 794.5015 null] >> endobj 1957 0 obj << -/D [1955 0 R /XYZ 85.0394 794.5015 null] +/D [1954 0 R /XYZ 85.0394 575.4191 null] >> endobj 1958 0 obj << -/D [1955 0 R /XYZ 85.0394 752.0811 null] +/D [1954 0 R /XYZ 85.0394 427.1073 null] >> endobj 1959 0 obj << -/D [1955 0 R /XYZ 85.0394 529.0618 null] +/D [1954 0 R /XYZ 85.0394 329.3834 null] >> endobj 1960 0 obj << -/D [1955 0 R /XYZ 85.0394 453.6936 null] ->> endobj -666 0 obj << -/D [1955 0 R /XYZ 85.0394 414.4777 null] +/D [1954 0 R /XYZ 85.0394 262.8864 null] >> endobj 1961 0 obj << -/D [1955 0 R /XYZ 85.0394 377.7886 null] +/D [1954 0 R /XYZ 85.0394 196.3893 null] +>> endobj +666 0 obj << +/D [1954 0 R /XYZ 85.0394 155.0304 null] >> endobj 1962 0 obj << -/D [1955 0 R /XYZ 85.0394 345.6639 null] +/D [1954 0 R /XYZ 85.0394 117.4002 null] >> endobj 1963 0 obj << -/D [1955 0 R /XYZ 85.0394 279.329 null] +/D [1954 0 R /XYZ 85.0394 84.3344 null] >> endobj -1964 0 obj << -/D [1955 0 R /XYZ 85.0394 194.9705 null] ->> endobj -1965 0 obj << -/D [1955 0 R /XYZ 85.0394 119.6023 null] ->> endobj -1954 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> +1953 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F55 1040 0 R /F23 738 0 R /F41 940 0 R /F48 955 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1969 0 obj << -/Length 2835 +1967 0 obj << +/Length 2624 /Filter /FlateDecode >> stream -xÚ¥Z_sã6ϧð£3³VHJ”ÄÞSº›Ý¤’½Ú¹^ÛÅ–ÍÊ’kÉIÓO J¤-Ë7;;¤È@€Ÿ0øÇ'2b%Ô$QQ —“åöŠM60÷åŠffA3õýâêæs˜LT bOk‡V°4å“Åê÷é÷ ®›~zœÏï>Î~¼ûíËÝãõŒ«TªéíׯwŸþs=’ ŒM¾}üõö'ûz­ÄôöËÝüúÏÅWw‹N,WtÎB-Ó_W¿ÿÉ&+ØÁW,Ãä >XÀ•“íU$Ã@FahGÊ«ùÕ¿;‚άY:¨ -ÎÆb@"tt‘ò@*%'‰TA”ÖÅcÝæ°©DMùw׳0VÓö%kqd]ﱃjú)›þ2¿ßßrœ)l3l¶YµÊÚzÿŽÐ¶&ÔvWæÛ¼"ºY¹©÷Eû²5“),">ó[‡,Ø_ótš/ëíLk¶;ã`÷Jïjö¬YÞ|–ÒA‚BS%ÁÀ ä[þÞÿäÇ¢q0±(äá¸lj@¸Ðc)ƒˆ‹Ä—n¾Ë—¨Fä ªÜèMwªÃö9ßc¿^cû\´+*Ýòi{ͧ¸‚ëmÐáÎ"&a)-_êb™û”4ÖtÌÆMo•ïÀ´ˆ~mé["ùË™…aò[ÓÄÍc˜Qhüí¹Á¦w!eø7ØÛš{ϹmÛ·<¯ðCr´>è¥u¿OÅZ{Ñ$NÞçe F?ÈnÀ­ óH9ÌრÍ)J‰9ŒDLÅDæZ7èÁ0Fl`íÊ Œ»‚N§œ‰¨'ìMê¶ùßÙ’Ène[@€Ú‹>dírq ù1I);ÝKÒ½tuüÈïQjiΓt‹/x²ƒñd‹2ž\]ôä*ÛæíûnÀ•ã b©®C Hç¹2̆Š _<Ï•EœR„NýViOúžÑÂáàÚCñ€+÷Æ=XO½få¡_f”¹ê< x§ª…#Ñ%+ZuÑùÙ\eLÑ€ëŸïpä&Þ‹ð‘Q`II¸»=ÓÃKS»š˜þSWÆ12™!MòŽ€A_\ÿÿ€¨û§ùa†´w‹‡Åo8ÛËÙݬiêe‘µù -¿ß`;Épà¥Æ(Ó‰ÐóöÙ¯ó»_ôf…»sä - r¸Æט[$Äý?œ°Ÿ÷.§^-‚49v 4ÄSüXfRTM^ & Mѯ¹ Wù:ƒèA1À¤+ÐÒiCom“ -û›lîúº:ëø =})Œû½:ïöd¼~9äõ:ùƒ”ÍxYÂIK¥b !¢Q©,æT*Ïݯ ÃvÅz¨V÷´æD¢Ð榗c´§;¢ËçL»ÂÉe]µYQÕæhtš—úPú%{Í=œ˜6]´±µô ³tú°Æ±ª&¡ -c&tÎqß@e¨OÓ}xôÓH¼âÏ“AÊô‚8¨°(c'®6¥x:ÎÒ‚XºçC7\Æcù°öíÞ”¹ ±Åç¦Ojðb5áûC§+ZƒM‰n»¡ÑüïȪ=«Î(1æ–Œ«ÓEWg‡2ê\¸”Gi“G­ËlsâPàsiœŽ‹eAb¹*W2€«„ûbÍMíPÒ©;¾‘'œŠÝ&öÐý$G{.i•¹j]d!)ßCµ%!ݾzyeªèYܦ‚¬yH¤]Œ‡A§±ïb?δ•Ü9LóbSuÆ£tGôÑ·+×MDh“åqP#&bQÆD6ùV%Ùy(í8Ù‚¬( ¡n•®C ˆç'[:H«Ô—O»g("Ï=õw†_葮Ў£†‘@GÕãí‹Žs]Ø\étL†bz[–õ›>v °×±aj¯cý!h¬" ¤Õk´L_°Ð· -.á0d[ó‰Ò(×´ÈR4à[¹%vwûb›cwmä©·¸ø—ÏqXÈPaï­(Kì=Ó×^¬‰^Ý4Ås™ÿK{„:?|+ÂkWHœV˜Zøw†8k¾aœŠEŠ~uÞ|;”1ß—“ #˜J.°´ –®IBÐbIzÄò뾨lNE®ð=é¢9l·Ùž|ÞÖgÝI½Ó‰UsTnÑuqÐoH}²†9½—ýG -LJ$ä—«ªiòå l¬i €M*™ÚÜéüÙè?Ž¦œ ÌÁ|;{0#üús9æ7x,¿/èP¤ç.›õ>)pX™£±½›-;«;¡T^(€{ÌyÍÆ(nw±øÝíë¶^ÖåÙâwD¬¾ô=–k°ðuƒ[Û¼)z+:™øƒÂ˜)*`õ¤©.<8=€¸rŸ±$Yœ§Šáƒ!|v/fÂyÇÐŒ`àXXº*ÈçYâ‡`!¥ÉžéáLîD3ø0Ñ ÚP7Ì–kPìÚr æžÈ€ kÃ'~uÅ›U€ÄÛF÷\OwGhuy­Ùc™©%©°5]w °KZF[<*ÿ -?šÃr™CÕº±ÝŠä’õ:¨ûµ(cÁûKYçį·«üõ4£€š%‰’qá:Ô€t¾Ë€ËؗΈeöå“A¥UÌa˜'T†Ù¤nQÚ*7UWKÌIú•€Üõ¹‰&ôg¸Å©Umù˜MO“}¿+Zž ¼ô„`¥\ ëò7 ¬kÔiDiêŸ< -9p €°0±wú$Ü_‡lÕ˜¡ö _,ss„Ò¾«Þ/ôO=<¥få¨Ç‹¦sïç:³µ°™©v¬‚Ž7BÆÇX:dGÛ%¢tÒ{÷ðO5²gš72ÂóÄÔšåK¶Ï–­ $€C r­&XÒ˜[Èk<)ÜÌ­²–ˆêGÝ>wJ·`¤¨À(²•/ÊxvEÏ8 ›=˜Mf%~`¤=Õ¥þùAòî‰Na5üDrn-¬pÞ9ð^l»b×9G“ïésì2|¼pž–GŸx"Çœs>âÆÄ›æâÃQÓîójÓ¾œÞ˜øh}D¬s"—ÿ«Ü5"Ž\ÁŽBýÍ: ûF&3b/NF?ݸh÷÷žØþÞ3H¥ F6ÝEÉÜ‹>ÁLí.µëóй:Ó -2å{Ùò°'Ž­ýð%#ƒ©èyq•ëW9Åî°‡2·†Ó¥ZpŸž·¨Y,.S>{ýîIJØ×ùžÀæ±[·–dö\”EûîÏf˜¯Z£|â ‘\ r*Ï`Ì0H¶ºª®§í<³çÕrÿ¾£0©Éžÿ \-¼Ðȯh2¶þzña§Ì_ó“"BA©+ ¨“ÊbN¥òŸÓTÍJzbaáÅ«üù°ÙtocFªàÜßž@¦ ÿ`d@*6±‡óÿ]Jÿ÷7Q¾t®‰ `ql…ÒûƒÃ:=gú –SÙÿ殮Sendstream +xÚ¥Z]oÛ¸}ϯ0p_ fù!RÒ¾¥MÚdÓ:¹µ Ün·Š­ØBdÉ×’dý9¤$ʲ³À"¤ÈáÌs8<¤ÃFþØH*¢bÂ8 ’29ZlÎèh}ŸÏ˜•™8¡IWêÃüìý'Žb+®FóÇŽ®ˆÐ(b£ùòçø È9h ãËélvõqr{õãÓ·»¯_.>\}9Ÿ0Ej|q5½¼ùßù„K +C`¥ã¯Óï_°íþ<æã‹ÏW³ó_óßÏ®æsÝ 0*´gÿ?ûù‹Ž–0ßÏ(q$G/ðA ‹c>ÚœRáZò³ÙÙ…^3tpA%\(>°"œ#±”Ü[%¸0K2{-Êm•Uý©FÂH‰Q(˜fjÈ4ƒåæœ;â  œtU·6('¥½ZU•.&Oéëã®ÜäÉCšŸO„a’hGß«­ +&BDAvõà$_•»¬^oPÔ·f\æVr’i I,xdEÐö¡"!I¤¤´R?'‹M\XÃeyRUšxL¢(Œ­Ô/œçÏÉã€Bßècž¬†ô$#Þ×÷ÔÔŠÍPPÔ FÉ&­_·é€™ $§aßÌöM··»².eþÏuÖoê<⣀Fßó›úòôy0ê&V‘¯O¯ŠúÛmÂ#øI9@nF]^Í>~»¹ŸßÜM›Q­ +Ãá,±}€ƒº¾CŠSuð_¥uu>’a˜­½ÀvÀZ½N±²ÊžÓBW¹Áø9çøõ¸;gѸܠX‚Åb÷º­K¬¯#±|ÁÒêKŠ%VöY¾l=ÀÊŸ”ò<­¬…r§g1š8Ç=ÌajÆLû'•t–.öÎnƒ~hfïð+©°\¦ÚD‘.ñ3+°üöÉj‚<%íˆbÙë ¨€sa „Ô݉ÚaÖ·‰NªˆÄñÉlØ•rIú06R&M¹¤'»iŠB‚ŽåPÎë:Ç8#<8ô®‘pÏËœÐé¹7Kót¡1Ç9G|é +"fµK¶ëlM“p¦ +ÊÆs'ûœä{[-‡¶äd Ùi8Á{ÂRƬàf_Õ¨öÁ©/Z;¦ü6»øz)ß!‹Ø +}@‚ÈìúBNDl|9»Ð5)ÇS€©èvrlj%°“KeÇâ·d»a˜òòKöËìQc]ƒÙl,5¾Nó|bü£Î/d3›¤ÐA/&£z1+»CÌrÚ}‘t·Î"q"YQ¥E•ÕH£;" ‘Üèå £qQê2î,¹iÎ*l®¶é";Çí.õ–(PÌ.ʾdyŽÍ&Pî+³]¡ïá[–éc²Ïk«h_@ʨ°GãjàbRæNŒ‰@ HÈ›¤]në¬,g1±Ppz +*}dÍüªLn¡¿°×XÅ…Õµ.(¬˜™·®=Xœ·†:M–Baüoñ…$”ìä,%$Žæ¨Ó3ëZ’6=›Š-ÛˆêOd€°T`‡š‰sdP½Nj‹°4àÓ†juëtñä³ÎýØZn¶I=dyV¿º¡ú”Ò5³ŠD£{œÓ²N1rì7ð^ÅÎhAýPÁcÄ ‰ú@taO°€m´Lêr÷Š¢µE|¶Ùæé&-êÞ0C{Šh;³‹ŽZP€¦7¼iÓb™.ɉiéÃê7ÜÓ:1˜%Þ×åk‘ä¹]«Êœò ;jòäM*’9vLëß>¦ºRÇ©FÊcÓÝc*&ŒË°O¦»~Ŷ°’§ýrB~y»€R`aϱYƒÞþ’Ù›…®šJ$M]ÑH;¤ë‡$Èñ•ûÛ³ÿ0æhÉs¶H1M‰\z":®Ôñx4R&Åm`XƒË]~ﱦH@£ø´sÔ€w>k`pµ£ÜwÏŠŠì:C¥|)R½‹õÆÖÎaã£'ŸàÜzÉë#PIË' Ëñ 6Ì'XØ\ý[ŽO'àV áó P›B*@íqVÿ¸›^a‹†&"øH\b…KªŒù²óñ_HNbK›u“Vt{õã=ˆA¡aä¨/H]ßÍæ(fLAy5ßÌ`oët$=½p-YR›¬ ß6óÆ %ùx]š™¶.´¶’Ú÷ÙÕ7=YÞ9Z…­ªžUÕXUÌIÂqµëÙçñn~ݵÔ. ÁFG‚oI6ÜìQø°$j†õ²4†¥ÃŒ·¬¾cÇ2~cËv¤NlY'e¶ìb˜ésÁdÿÁË¡ +ŽœvÌ 8æçP˜@,Bß³›b ÇOmV4îÀ5µ+ ]á͈ ;eQ'Y‘«Þ(Tªu¹Ï­ô:yN=9Þe V£^s‘ˆ­B[QZ§Œ´¥t\¿¬Ì°ÇepIMõfjs¿ýÖê( ô?T‘8 ƒ®Ôq4Rƒ')t«ÞÛÀI¤¢Ón9¡·¼' ÷¼ˆùnÍRC†ì#‚®øQ ™åºÎñüìJ·öÆÛQ&·w%Ûœ‡ª|H騇¦{=¼0¬jNnUd ºdY.D©Hù˜¸Ý¶§ømj‰Ö,[YØ´ڤ„ÚA<€ŽADÄ„êלÓéH€ˆ“2Y÷M*¸ùÆá&ЀÉnøCFhõLÞï²Â‘ÎIJÐu¹³×€j¿Ù$»WŸL5Ô ¯]Uïóòj¯i¶£fåÀ«‡k\Öl_ÅVi1phÃ$c¹„y<64Ò kûv¤NÄÆI™Ø<Í)“mlLƦkòs +”)q÷Ü7’öö]bCî‚׸ÂCóа£+ÈÂðœƒ]©ã+ØH™ܾI]»ÏȃÔõ¤s-u=ônºzîÍð‰•Åö9•SpǼš¢K¦Ë’PÝi‘'¾²ñZbûSKd%¨™×jnöÜl@ýYì7:–ºé!­_Ró¦ ÔŠÁVCúáN{/[\Js‚R÷ÇÜ ~˜SJ¡ ê(VG¹ ï΂ ªÛ²ª²‡Üjj˜[ÝX¯ÎîÞï¶ØÑù¹6TQ{R`‰o¶P±ï¹œ5SìQ¸Ìe”j¿X¤Àí–pË;Èðž +ß­.™ã.KÃRî 3æ6·=´ÐÃÛ”V-¢ :ø-Æs„+¨ì=ÌÚG"ÎÜÃlkúâûüúãÝô“þ­õ6Mï™m´î‡¦Q´}ÆÃiOïÜXƒ]åP¯º¨WõÊó€´Mº&mŠ|LwVؼ påVL“æe«Ó›ìõãhmßZNêD;/ì/(ºÍ€tsš&ÝW3÷"‘æ}¾;€Ú£pWÜÂipí¡ã`wBëÏÃ9[aÐÿYÍ£­!‰yÄOzåd½òo.œÄ4–ž[³Ã‡²eú°_­Rg¼"Ç~Ë’è༢ÍOEÿúwþö¿‚öRtäy‹‡’À`åœÒóƒ`ÆÙþGÀ¡ï •úendstream endobj -1968 0 obj << +1966 0 obj << /Type /Page -/Contents 1969 0 R -/Resources 1967 0 R +/Contents 1967 0 R +/Resources 1965 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1966 0 R +/Parent 1964 0 R +>> endobj +1968 0 obj << +/D [1966 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1969 0 obj << +/D [1966 0 R /XYZ 56.6929 749.0289 null] >> endobj 1970 0 obj << -/D [1968 0 R /XYZ 56.6929 794.5015 null] +/D [1966 0 R /XYZ 56.6929 675.7286 null] >> endobj -1967 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R >> +1971 0 obj << +/D [1966 0 R /XYZ 56.6929 599.4635 null] +>> endobj +1965 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F41 940 0 R /F53 1032 0 R /F23 738 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1973 0 obj << -/Length 2183 +1974 0 obj << +/Length 2139 /Filter /FlateDecode >> stream -xÚ¥YM{Û¸¾ûWèЃüd‰½ÉŽ’x+i¤<Ý6ña‹»©){½¿¾ ( ½­} gï|Sd„៌C˜ÊhË1LØh¹¾À£Gxöþ‚XšÀ]ª«ÅÅßßÑx$‘ä!-:¼ÂBÑ"ý>ž|ù2½½ùå2_¡Ë€a<¾Ì¾M>™½/—2OÞOç—1‰ˆk2ŽÇogóùô:˜ß¼Ÿýçólzy·øùbºhë*O0ÕZý~ñýR8ÃÏQ)Øèn0"R†£õEÄ(b¥n'¿˜_ü³eØyÚ¼êƒQ˜c!‚$cáL"NCÚÀñ~:›~è/¦oÍù?Nÿ=×'ƒ÷iM<‚§($Òàø¯•*,éP…Â8Pk¢´¨*µ ~S/-u—'—(Ž¨%^–ëM®jU±W»åRUÕÃ.Ï_. !ãŸ`_Äã¬ÖW<Þl³¢¶´‰ÙªjØ{4[åƒÙ«WÊl<”ÛµQ!:P˜bXKb•øXÀz“$É›Lÿy”oŠB&í uiØk9@; -¢P Q> -Z쬪“"M¶—DŒSs¹«7»‹<^¬²Êl»kRØûTuöãp™ÔYiwÛ“Âf樰¼í˵¹®ËÌ ¶I­RÔë»8B”òp ð:T«‘¨‹,íðÒüÀ$>J€@ò(>/µ¥:{`J‚añC±Úž#†EØÝa~ -`‘¬U/T\pˆ‡(:U—ªª–jª³R÷PˆõBu œÞ‡w { *vkµÍ–æ¦ñoµ1— -·ã²M@vßLòÇr›Õ«u?À·5ÎÜ¡:°£øœÔÀÇbýwÅöe" >èû\ lÈÿÀ »ð(˺IŠ°I'7,F¡€„u ‘ˆWåèÃKÒ)·4¶Mš4Mi4®ŸK½`c­V®*ÈÒ”±ñ3Öèª É}R©Ôìj¯h^ׇÔÏÍÝS“Þ/]sŠbödk¤¡:=ð¤HJr”“—%8hVýÙÝçΡ5?W{š¤œzt"!øD_Ap°'€Ë£‰(•ŸUǾ 2µ&ã®k×¢‹•òi µ6Œ°¤ -JŽ]m3&“`ÞÑNß%úë~ÈÜCÏ`Æ=–¥«tz¯^%µe¢«š^Ü+ê­1;ì‚”þ|ügYXñ]U´Ó§™•TCwаÒa ŸZÏÛ3ùÛÍ,°¥™#.Ä‘\úövêª*½VÒ]Ï0´"qL\sÆâÀ²­8†7"]x£Nj ªZšêoèšàÏÓJ7¤"¿kN ûåýSVîìëÏ;xýÅ<²[•Eœœ‚A²jÏΩ–ʾ_”µ,}'‡€­’'Õí&ònîOlw³QÛuVUý½8^•`$P¸¡}ðÑñHºàI°ÇmzÞ"ŒµÙÍæ0@!fcÓ­ipb¾oœÌ³¦çÒ‹êe½VuSõ­*–Û—)zúµÖ–'4µ+ËÝî|¸\[÷Ôy„èÎòîÛ·Ìfõ¤ -—ÊÝãêLÞÒ¨ø³‡yìŽÖ°ý}49¸ý¾htÆ°eM›®µ™þ2¹ýòi:<,ôL¡{cJ x—D$×°Pf?1—˜‹à¾iU)ŒXó‰Ù5ÊR×ßÂŽ9)ì¤åbÅš]˜èHtÍŠú#Ñ#‚ÉÂ7|À©XÛØhŒ]=ÒÂÊû±£$zƒ1}rÂñ°¾7Mµ`._áÈ÷'OwGÐÑSòúÉÆíØÛÕ4•è2ÂiŠÜˆ‰t¹ªçŒ=)ŒpPºª³9 -¶Äm-n˜\A¥9îh„Ÿi=(ä=Ì]%ò~ÐÙ`{>µÕròiþy8XCTÙc¡«¹®ÝB—WkB*»l’9¥®nfö‹„´ÓuVdà‘IízÞ¯êAÛKë”·I±ƒšäsÎyð§ -@'Ú:þõݵáÓ¼ôð‹ 8j üev"bÿ;»è˜8=dç70• ‰ˆÄ~òmñáó×aÃÞ@»¾-”Mó— -Z'Û»^C«Qnël·Þ‹…ÊqWP"h[¥Я‡²€!—¹Šë(œÞmˆg0Lô¨&à\±×ç쨆±Y™¯xf½®©ÛTW—e>\ ç/E¹©²êx”„Ð#’ SǘžIRGwÈ´5½Ã-t”L4ѽgq:eº¸¥òž^׉ïArçVKs2v8‹HÑý˜—'•/é… »œÔrL='Á™ËЯC¯^n_¹¬ú o¼@WˆÑv#–yƒ3ôIí¯³1=qŽ_uþ5«Ai -…asœ r¬Ê$€q5Kò~m t œˆ“)¹ÃœðøW¬öÙ‹0£Ž'6çʽÇ=ĉ§mÚÕÖ#ë0¶ÐÔëT=õÄ7f'€WÀ×ɶî‹p PÜ6 -׺]=õ*íøç0Qå¯ÏrÞÙÞKH(fòhNûPÀ"I°C©JòÚû„&¢Çò> Çe­‡R˜6«×4±+]šäfö!!„îú>Å‚\ý;”§Vá¶>þß?wí¿éBV¡Bì¿ó~.m¾ïCb•ÒÇ#§tÛÆNuÿ/<ýøÀendstream +xÚ¥YÝsÛ6÷_¡‡>ÐÓÅ7ÁGÅVR·‰’³”¹ë¸y )Èâ”"U‘rÆýëoA)CVo.y,‹ýøí.L&þ“‰³”O’”#‰˜äÛ+0"iJ'Û+.œ1?S^-®þÕ3¬v[CªL!¡hÐ%BP*)C¤H2Ê:eÀ-f÷SsßåìÖÞîfïï>‚ +àŽÀ‰ ´Š'°ŒÂyÇâß]9*2 ¢)èöáŽhU5Îã?õËz_oËìQ—ÎiÒ2áöäõvWêV7 N¢¢æçºiÖ‡²|¹&„D?Á¼QÑÚõݾ¨ÚŽ62·¥…¹';®×ö·Ýh;X×û­•äf).©â· +þ¡³,û±0ÿRÇL€Ü˜Nâ^Û°±­­íy0hÚ¬Zeûk¢¢•©íîЂg1‚£å¦hì´ÿÍ*÷½ÒU[ü1ͳ¶¨+ÏÎÝ Æp•“Ã@Ñv`¶•Úsníï&sOºÒû¬Õ+tÖ—1¸ †¨z; Të>4+ ð2úù“äôP‚9lâÉÛ§öT¯Y’`s9>Ö˜3`C*ÇÄÙÜàµ6«l«ÏªJšçT5¤:¯ªžê¢ªÞ<õ¨ªWÇU5:|>¤)Œ8 Ϩª:lõ¾ÈíGçìzgðâÿvñ8Ü™•Oõ¾h7Ûó +– N¨ +P½¡`OuYÁo:Pðé±a=(Œ"–(yÑÀ ÷>ÚöX°®ë¶ÃD˜$(€Ð1À¨Á-…¸Hÿ7 N˜LƒÒ.@`š\ÇíÉãîNSÖ–ÄY[Ys/7:$eŠÚ+Q„!N‘µ4¤2,Ò™¯Ìü$¦r²ß]}aÖkòÚ§D3×n²Ö11éÏ µe õ¾s3 ^QøËèïºrÇE1±*ÜI-+"fÕ:ä€Éwóت‹K$ÄàÈSn>~½õÙ¼Õ[=ˆ.S )¬Yð* à5{ÞàÀ”’>#õWâx¨]>@MóI¢f§s[*ØåÊUcÊW%]ws «Ÿ!èŠúи}:?›»ËÅsSW&t™d`—¢9rô¢¬jíf«ºµzK@îa¤·Mö¬‡G9L™«†vz¿-šÄ¬å+h—I¤l±s1s†˜~\|¾\¤a $0N¡ŒÝ\¨ºÅ¦xªŒ –;¾,†F‚MSïîæ®lN8«mQTYëø^¯µ½j•;5|ʪCV"¢G I¢ˆÇ¥û÷7–#ÇŒøq0Þ‚Š™â(I©+xúuùËçûËš½xÞWÚU–‹—ÂÂáÒ øO½o‹Ãöx.GÌ×–§SËZ,è¶0ÆcSùÀbÐ8µ‘5‡äqF®ÂÏu6c66;RšØ‘mãNÒ©+†û +¥­ëòMO´â,^ªz×@xœZ:ˆM(‹êÚRŒƒ% €…€®5²x][øʧ§ +\_‚bcWΉ‘Ãa‚$QÆpò»D'¬oŒâÇ7h„XŸ¥àð¦ø;ƒ¨¨ª®îZ˜š¢Ë{ýzŸtU”¹í+m*ŠÊ–ø +ê:û뛊¨`Âí¨V'k&é™ç&¢»ÖN™²± //ýÈ”YÙÔã—>4'O)‡Æ­ù®GËÅ݇cŸµ¼N±ñæ&Ë9c5DÖºk7ƒÿ¸Œ®‹Ýuñ1S•þ?.'!Фï*œ¡PÄ›±k»%q= lúƒA×gJz,!;a¡»ÛpK^o·ÖðQ•66àÌV—†Eï –×ÿIîŠH3¹=4­em¾9áßÝývX n›‚_Ø|ÛcKÿ‘õ¾oŠ|s¶ov¶xÔý Úø!ìBíù¹ °Å«g +—®“Ä”Àäí”> òoµwkGÔ%IŸ½Å({#0¿%ïÑ[O‘¤ÉÛ¢õD¯eå夕 ·Ð%´WF­Š9…+åû—][?í³Ý¦k’amðÈ Ð5$†¶w ò.“RÏ‹EÏYyplëu q‚u̸µ‚ÖŽ4+Z'Ã1È?cÈ0í'IMøÁÚþÞ/¦Ÿn…‘Só±øeÚ;fÑíbú“%šÃ¥Øx±›:RØE*¤ã¾NCÜž} 3%1c!SâÞwÿï¿@ŸÕ 2¥hØ)†ºž¥Ä eG^¿©õ«x-û7ZX‰endstream endobj -1972 0 obj << +1973 0 obj << /Type /Page -/Contents 1973 0 R -/Resources 1971 0 R +/Contents 1974 0 R +/Resources 1972 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1966 0 R ->> endobj -1974 0 obj << -/D [1972 0 R /XYZ 85.0394 794.5015 null] +/Parent 1964 0 R >> endobj 1975 0 obj << -/D [1972 0 R /XYZ 85.0394 752.3199 null] +/D [1973 0 R /XYZ 85.0394 794.5015 null] >> endobj 1976 0 obj << -/D [1972 0 R /XYZ 85.0394 504.8188 null] +/D [1973 0 R /XYZ 85.0394 752.1618 null] >> endobj 1977 0 obj << -/D [1972 0 R /XYZ 85.0394 359.3246 null] +/D [1973 0 R /XYZ 85.0394 531.002 null] >> endobj 1978 0 obj << -/D [1972 0 R /XYZ 85.0394 298.3625 null] +/D [1973 0 R /XYZ 85.0394 468.4168 null] >> endobj 670 0 obj << -/D [1972 0 R /XYZ 85.0394 260.8495 null] +/D [1973 0 R /XYZ 85.0394 429.776 null] >> endobj 1979 0 obj << -/D [1972 0 R /XYZ 85.0394 224.9084 null] +/D [1973 0 R /XYZ 85.0394 393.3396 null] >> endobj 1980 0 obj << -/D [1972 0 R /XYZ 85.0394 193.5316 null] +/D [1973 0 R /XYZ 85.0394 361.4675 null] >> endobj 1981 0 obj << -/D [1972 0 R /XYZ 85.0394 129.6476 null] +/D [1973 0 R /XYZ 85.0394 295.9604 null] >> endobj -1971 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R /F48 950 0 R /F39 895 0 R /F53 1027 0 R >> +1982 0 obj << +/D [1973 0 R /XYZ 85.0394 212.4297 null] +>> endobj +1983 0 obj << +/D [1973 0 R /XYZ 85.0394 107.4752 null] +>> endobj +1972 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F14 741 0 R /F39 900 0 R /F53 1032 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1984 0 obj << -/Length 3093 +1986 0 obj << +/Length 2949 /Filter /FlateDecode >> stream -xÚ¥MwãÆíî_¡#ý±óIrÒ““u7N²Þmì¤M“h‰²ùV"‘ZÇùõŠ¤(i_k8Ä`|c(9ð/g6‰§Ü,u&¶BÚÙbs!f0÷öB2Î< ÍûX_ß_üí:¹Ø%*™Ý¯z{e±È29»_þ}'ñ%ì ¢7·ww×ßÌïnÞÞþçýíõå\f©L£«®oßÜüûr®¬t@"zwuûÓÕûpéTtõöúîò÷ûï.®ï;ÆúÌK¡‘«?.~ý]Ì–p†ï.D¬]fg/ð"b霚m.ŒÕ±5ZÈúâîâŸÝ†½Y¿tRRÄJ'jBJΤŒµj ëâD+íÅñæúî›o>Üß¼¿ÅÓø5{ Š8ÎR¡<ò²jšb1oÊÇ꯺*xî-HÓX+“ÂBÄGÄd–˜(LJŽpHT[Ý´z,ªb›·#Þ‚Nh"¯–úñGÐÁ¶—2‹ŠEíŸË°7!êèÙƒëånQ É"#ïö©Ø6e]ÑD½ÂC€è˜ïy'/`¿}*ËeÑ_`Q})#ϼ±ItOS.yì¶e s¯ hóv×Ð:ØÝÖźxÌ[ Ê+btCÓŽMz{èoŠö)o ^6_‚ü¤Œ^ž -X¸%œ6ð³x*×Kævhš“ÜüYE8$ùƒ?Ízã®·ô¬êKz)z.‹¶ØnJbÞ^éIäa@(š¢ZŒöËúÀÉ„Lßæ@G±eúX¼6E;aj:‹µ³'´ß„PkÞ}hùâ‰FA,0$ ¶Þó¹ -|J§±RÖúß{ç8ôu§R&³D›8ÂñMBš÷±‚kª éÎó1IŒs2;M2 MìK/aªåäÏ— «Ø–+Ök¾^Ó 8)Ë Ìœ••Uf"=#›Ö Ù,/›)T´Çôq¢Äb7͘1—Ä™Tæ4ci‚1= ppœÝ=‹±hF®é†mÑs6ðƒ©3Î)qÚTÇi"’Óâìcg‡åÅùqJœ2ÎœÕ{7³•%±…½OrÅ8LõEé$ä-€ ˜º¿t‚ã=Æ>ð˨鄻$råyÃÏ\yC-«Ç6ëmΫ×Ñ<Ðùcƒ©_iˆõ%ï^?·>sàx“3‰‡â9ŸSà|BeÔ²Ù­Ûò9ª¶Üœð«%Ø,<­îÖ u,¯îõ„º],• ‰{Yoò²3†Ÿd¬OrÖaM°6ôà-±fÈÛ[4½ôm£7?`Åõ3Á0xhY1ÒrY¶œÑmÔÖ%—‚×*Î`'üþúNlûÒHÜu»7¾@ÑœãaŽ¥áç}&Xþü\TË j(’D)kY='}ç®òMqÄïGuÍQ›0YáÚÉ6}¬ã6Ñay›Xž Ër[,Úz{¤R±Î{š»k‚½](¨Å’4ò÷C]Üg÷êÁ@ýœþO5‡b2÷Ñ®`™‰Sçm 2UYèçãØKIÁSâëtk3ØÄÉ–}¬º X^·•„…¶Â!&HJ~[-F${nŒ©ïnÒÊGÕÚ¨F ÓûRÞX³~ÌêCo•"ºþ³lZÓÏR|)CYó0p¿Mý©Xw=°Ë4qöŒzzX'Ô°¼zš³Å 4ÛvŽéâÐ÷’8…tuš½k‚¿ï¡ÁgýÃv5/ Eˆ«0X’zEhÔp®Üð$4'Õ_JH±oê`x¨$>`ÃK?åë­ŒålŒ‹¼ -¨…­€6«~.Jî’F{~>4õzçÙW–:ØXCŸö© žÍKÈèª"äþRCzÙãÒÈó§0?-Kè |f€øvIQZƒGµÛ<ÖJÞÿø{÷îÍ|تQn|óí·ïÞÝÝ¡½§ØŸùŽòïÔM+à‡Ò+¢€( @B?B|i¾2ö«0õÓ=pö }Eï|E í&6™Úøm± ’*º"¬¡”„0ÁoIÆ"ɼH:yd,,úâöK80›Òwl½%·ô€6µ®– ëÅz_@#KÜU-ÏýéèfE ªž óê„›t¶qߤba²„Q“½ÚïK²E¦±µi2* BB²Ê¥  ½Þq âîû©ÞmCȳ"”ЛÕ/㺮œ&›ÅËa¿kND8m\lTv&õ±ŽG¸ËG¸b:Â¥P]°$¡˜šŽo П<Í\‡5ÁÝ°¶€°š3d¯‹oÒqÎÆÅ7ùøæç¼’pDñm€ß‹oøÊñMº‰$„ÀâÏg. -|`ÑO¼@Àš²Q­¡\6Éç©uqº¿Aa‹4Za‰¯‡>êC"Ä^\³ª³FɆ#ž %/ãpÕE&„…Èä³Å¸Ðý–£8‹äjÆyb”W+÷Vž1gŒ9MÒóTÄAÅqhÐ-½îƒ -Àúwr!m8°âºt`Œð‡r]Ðw]ò¸ô-(œt<ĪG{½?ì3A}ãiTÿÚH>$NTõË·11Äáìdˆ“FÇ*Ù„»º1el/Âáæƒ7×Ð iA3Ëü•qöD6üiýR’ ‡yyùñ H4—3$'s•ÎÄ&ƒöp e±Ê¡…>ÂT*¡HÏôG}¬ã!¬Ãò!l5Ù3'™YïÚç];_•ëà æ]ϹÓìuXü ‹´4–Rª!ƒ¾[Õ2á.=»L„&àY$`¸0E8xA .݈À{ö -Ò8þ«»·"Ý“cÐB¯U¤XÓ;uÉSÑ,3˜4XYÌ! -ZDh£åPçÌın.´gívYùÃî[”ÌqËQYœ@|á¨äJâ9oš0›3Ì;&F¡¦ë¯‰ƒ‡¢_½%.UÐù'|tï”1rv®³$vd>pôp½:¬¨›q•ÿºX‡¶"ðo9c漘6p¾¢û‚Q×€Ý œ4žlh„wY z¬ª}W¡º®"§}BO ¡l§ -˜}ˆ|gW­ï³PÁ 6“ÝaQyœ½e0¯¦­0Œ{5èyÞcçûR6Å‘%pš¦\´rÉ”kz>0UÏ%]«À[SוßÌùÐ0U±´§ïXž×ù‚[¿4‹mb÷ LBuÔeéTÂ÷Úöo !°Õëè”(@|Á°†³m·iIÖÀ§õ_"þP´/9Y{ð}‹@5*t]eˆÃýEþXw5}h.Wt\ñ}Ä¡ûX»LšÏ(ÐDlŒ •Üäm(rà²ÏmhͼûŒŸÌG-í(˜&ÀDjäçÇyüÀ®C¾|ó‰» ÷÷yË­´jÔJï™Õ)]á0á^`XŸ"ëS´Y#BsÀœp‚{¤K`§E€BOÜÅ;½ÿöÏ´¥§†C&Pò2ÿI —û[I‡ø Ó‰;/N~¦çÂwWti—¾mw᣻¿öÏuÑt·Ï9ÃèxͲ „Ï%ÀK½ ÷®G}u*'ƒJU -å×É”ÜC:ž‘’OÈ7ç -mŸÂæ ù YÈ°ÒÎb) ®<Å\‡tȵL"˲{÷¡–fú06\hÛ}¡Í¥'ÎQZF ¡¾~6чºiÊ*À oÖpѼ·‚ƒê*Áï£Ý÷ èÓÚâÏŸ.§@jÝý -æ1¬t+ä)…Ú|èÚØUhÓ#²Í_ŽÑÀV$Sã2>â~ä¯|oëì>Í;Ø󶄚´\¿2œÑ]óoÔ?'dðN=#ŽÈÙa°|…â¾\ÐËþg4vÿ#×¼ÿ–Ɔ†–ï6Ï´"‰B›úa—¶1þk¨D÷K’ÿûG_ûŸ·šYväû©J!a83S(dÐÅ¡·òÏÃyÿ/0w¥Çendstream +xÚ¥ZKsã6¾ûWè(Wh<>²'gì;Ù±gGšªÍfs $Jf E*"eÇùõÛ(@¢¨Ã–@£ÑoŠüøHEA”Št§a W£ÅæŠÖ0÷ùŠÌÄ‚&.êçÙÕÍ'Ò D4š­œµ’€% Í–¿Tp +°ñÝÓtzÿqòëýoŸïŸ®'~¾™'®9çã4ؾäÔyÍʽénöMK½¹ã»zþ/Sì®X]óºLüC^–›¬‚IŽ«FÑøáËíÇÉ—;å>Nni:¦gä,oÂy*%4­€"”¼{K¨H°nD&ƒgâ°ƒânS21ž½äMN“úh õ³o&™…U“WMѯyЖ T‰&ì©n§cþž!Æe-¬4Ð!YCÊ6þ6½ÅÓLÑP›QÌZfm½{'h[Ôf[曼2ëfåºÞíËF¯á%³ÏôÖY 3-êÍSI`Åe¾D¶pFÒ€ŽÒðºö¶èI/ +íH—!®XüDËûKÅÐAùÑû¶Þdm±ÈÊò†š¼¥Ž–DìL~P &³up¢<ˆ9FQ2fç4†@E +Ã{ŒG‡ÂSMæ¸åÍ'¥$04Ih©†üÈß›âïü˜4zJ.‡iëP=ÄIoK„\Ä>uÓm¾(´ò5ÄrÒ`èTûÍ<ßQ¿^Q;/Z+*lù¸½æczƒã1ÌåN”¡ÊvñR‹Ü_ ±º£®{Ë| ¢eÖ¯íúv‘N|µäL¤ .¹¯ïû†“…¨/¨ÒRó–zd‡„ Çs :7ݼ}ËóŠ îÔ!IƒŽ`aB=<ºYÛ7Y8iLÖ¹ÉòQëlÇEBDàv=š²4BÍäÝæqhµ•Ûmba·A\n[» <Щg4ž9áaaê™IDÑ@þW¶0Ënöe[€1¡'¼B‚!IRk) išz ±¡´pžÛÖRüH¿‰bÅ̹Ïh¬J£ Vœk¬‹:¯±JkluQc«l“·ïÛ•‚%é0qª‡:Oe/΄Ož§²"JŒ©ƒNýV¡Æ +ô'H ®½®Î+¾H°ýÑÅwPŠoQZñ}ŠÁ2„È$É‹.ã˜0Ð΄‹p˜0 ê!ÌÓyH!'ñ({¬–å´ú^t˜­£EpcxˆÑEoº]Ò䢮ڬ¨Šj}ô‰tš—z_ôKöš{81n:›cWD>h˜ŒW4VÕ†(&ù˜LSBî‹ ­dâEb©î>>ùA#9ô3b&Ð@´=,.ê¼t(-'f\]šòdxK êÙÒ½àº1D.Þ–š…Žôë‹Ò.‘Zg ¾9dŠuáÖ‡ŽWæjJRÞµÍÿÚ‚™¬Úóì„Ì1Š’KìtPì´(ÍÎUVAF™ÈÈ(ÕªÌÖ':j—DÉ0YÔC–ËòTàP¸OÖ47Ñ 9t|!¹I(´)ª#ôa’“<—K7>rGDKùj‚¨™EוÎe gqë +bä>’(Öšps*OÅ~þjóð ¹I¦Åºê„ F§8Øà.9ë}¨žR„žzâsFÍQ Fº„EÅê‡VTo_ÐÎ9ëÂá ÂÇú‘ãÛ²¬ßðÚ`²ÞÔ:e|f¬2@eÞ~\‘l„ ú‚I?ì¨ÀKÉœmõ#Q“ºz€$“IAÀ +"LênwÅ&§îJÓSoèåoŸ>Ò°P2¥Þ[Q–Ô››WЮ¼X™õê¦)æeþÔHÿ0J|+ƒGUê‰6–`ø>Cœ_©Â@` ?(¾.ê¼øv(-¾/'# +X_ØÒ‚z¶tE2æ‹“£-¿îŠÊFVÆàƒ ß^4ûÍ&Û¯WG‘z‹áUs”tw±ÇŠÑ!d£ÈÞËÂDJÄF/—UÓä‹ È8HSO"‡LUbçów#D B~énÔÀÝX”¾›gïfhËÃÝœlÙ{7î–ŸI­ ·»ÈÖ7û†Å€£|H_u÷n@|ôÚY +p†qörƒ.ê<;”æàöb:¼ÝÕm½¨Ë³éð q‡tø”ºÞtØ#ü¸®¥¦V$Ð8i‹D$é)[Ž&ëðàÆ j“ãNKÁ2³ó«’Á$ó]ÅL8õ œ`fÊ<‰EOûFY(¥ãiS8‚;ö ´}ƒVbÃlI°Mã`îÙt­A¥§CÍÚ¦]‚ÿƒ=W÷ÝóvyÛSú‰”TÔjS0õʼÖ_É*¬Eiö‹EÙìn@Ž¥ +¸â‚;¨9¶(-Ç»Kqèȯ7Ëüõ4Æ€,&ãaâ:Tu¾ìŠ|êüB,³•O¹W½×—¡K¨ŒâKl‰Ú*×yX)ŠRor{ˆVp¡w¸Ã M-k»ÎÚpÚÈ÷k±4¯g= RÊSaÿ˜uc…: â0I|©&"{ü蓱õ"¤“ pî U-†¨9°|±È1 +‘ÊÖ‚Óƒ^à+{xb*Ì©Ã/šN½çuf³c=Sm÷”.(a,é£ã`mÖ˜îñÿVC{7R×Îhˆî“‚Ih/Ù.[´ÚŽ8`;jqÁÒŒ¹©=â ÃõÜ2kÍ¢X|Ávnv7ŒE¶ôIŽ·Lygfã }Ȭ¤²´§¼ÄÏŠw¥Cs ËþÒ¡äÜJXáT>ÈG¶]úëÜ£Žñ»XˆÊNÉy°˜À£8P ÃVÇE·:J[æbM©iwyµn_N½g¼$®CõPçÿ¯#¢Ð'ïÈìØï?Ъ´ ДéëD™ùŒã¢Ýo?‘ýöÓ»Ja6ʨéœ&s&<0Ó™ t¸þüË¥ãF0ŸQêkÜb¿3;¶ö›àKf„§2%ÈeŽ'®r# Ûý¼en…¨ ÁÀ·ž—!Á‡‡ª%.j@^,JËKÛë¥ÀgX[Ù÷Ý!Á»MÒa²,¨‡,¯Zò„ÿEðÈr Âæàð©ê$L–q˜q%¢Ç@¸,“09:Ñ!Šs¦üOÂè³ÀBÉÑÖ·ßgŸŸ>áŸ->ÐÐÓóÉ 7ƒATDŒ)ßâ==Ûwú²ob³ÈÍ"›EÁa{Êò«|gÀº Ž­]2›eѾû³Ùæ«V3ßì VÝü_’7Ó›ö|`èr¾ÃÚN)>¯»÷­1™¸ìù¯ã jà.|?€¾–õ׋eŸ2ÍOÒŠ4R‘ˆAª,æ”*¿Ú.‚”¥Ê#‹2 +/e^æóýzÝUÎ4UÁ¹?ó@Ô€ÿÀé¡Šìåüßô9ü¡)ŒA—’3±¦ˆU/G–(<çÉé=›¿Òþ?ßý÷Kendstream endobj -1983 0 obj << +1985 0 obj << /Type /Page -/Contents 1984 0 R -/Resources 1982 0 R +/Contents 1986 0 R +/Resources 1984 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1966 0 R ->> endobj -1985 0 obj << -/D [1983 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1986 0 obj << -/D [1983 0 R /XYZ 56.6929 752.112 null] +/Parent 1964 0 R >> endobj 1987 0 obj << -/D [1983 0 R /XYZ 56.6929 665.106 null] +/D [1985 0 R /XYZ 56.6929 794.5015 null] >> endobj -1982 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F55 1035 0 R >> +1984 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F55 1040 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1990 0 obj << -/Length 2978 +/Length 2192 /Filter /FlateDecode >> stream -xÚ¥ZK“Û6¾Ï¯Ðm9UAGÇv¼N6c¯gRÙÚ8J¤FL$R©ýv£Š HªR[:l|Ý~€â ?¾HUȤŽ‰ŽBŸZ¬÷7lñ}ïo¸Å,hÙG}ÿpóê™,t¨c/6½¹Ò¥)_<俯?}zw÷öÃn—B±àûðv© ~~}÷ËëíÓ­Áë÷ïîo—óœIäꯛß~g‹öðã ¥NÕâ^Xȵ‹ýM¤d¨")ewsóïnÂ^¯:& %ÓP¥"‘†=ipí(^$J‡±„.”ÆÆÄ®€}GIPVøŒƒŒ^«ºZ¶Å×–Þ6õqŸÙöº®Ú¬¬Êê‘œyÖíÌ*j¬ì´MùX9!óòxËÓ X·»—[Îyr•L[ >5¶QohD»-íÄõ¡-k;w^»åªºE-€(–œ‡Z)aöµÏþ,H›ûÓzK­¦¨K„ÝP7™¿TÙ¾\á[]Mx¡X2”ð82IÇ­Ò‚–}éY¥C!¿Ë?pÉW?(ÕCê •Àäˆø£lÛâ8dŒKXT²xž³5šg"xã\û¼ýº-PìqlTIZc&@Cá¹l·Dˈ€ÆõÕ¨ÞŽÍÚéŸúwå¦hË}ñ¼&,Èv;¢þ ŒFYs©Í3o¨¿lš“›ÖØ$ÐZcA@À ‰&„–j Y¬´o ç­$:(¾¬aâ -)˜J¹?íÚ¬*êSÓ³T6„ õ`¬Ý?Œ¡¥¬Ö4Ù¾€s²ƒñ†Lç÷šÂÂÂL¨¬ ÷@CžJ³â²;4)™¤oãäÉp=)XpÈš±Rð ³´²:œZj¶5uŽ‘`æ>Þ&QÌH™’à±ç,;§4;õ6{*ü™Wö`ÌþÀqdÙÈVuÇqÓgûbìô¢A<‘VÆ3˜“õÏP‡ZÈôâh ì<£NxdaÎH.‚æP¬K´O³+PoFt;•i?—U^?S»Ýš}ð¹4ÒšÙ6j:°v(X«‘À -Ò‚C'­_¨Ö8SÃÀ*â0Ÿå¬C°æVX‘ X»÷|P¤¬Ÿˆ"klDD[£Ngç Œ³p?˜ê(øþ…zòb“AøBïÃi¨ì¬çh`i—mÚìHî@&3Bj‘¡~±•-$l h -;Q©œÞ|úeZ³ -2Û4ÕW4ÛCÍhÖ¡ŒfïÆ4‹‰·K™š:[‚Ï(³ÝÒ¦¯caƒ!Ì2Ù¡F¸ì+Y0&QûlšÔ6bIpÿñ56â€X"¢Ó4¶]ŠÔ:ÒZ7Ú%؉ ¨<ÜàSÝ4åjWôghè%;‡™8—‚Ãt°ï6¾ýY|ŽÅR¨-4sgæ SÌš4ùw#«Dbtê‚/ΊáÉ„¦‰%TÊ´ÓºýËY!I•ÈÞ¬§ªüŠ¾ejRjº fÊYÐ(\B5^cu¨evi¨®ÆêPc‚õ–)±HÅW–w¨‘å=7%!±ö×[»Z§sÔy¹:jcžT&‘yš!dž*N .J¨<Á¼àú°iÁu¨I›ñxˆÁe|… áÀ“]”'‘χ~Fõ7$fÚ§¦ËÌ>ÿð†\§Â†Í#ÔK{ÈÖÍŒp#j®ô5áö`3Âu¨©£ãËä¡¢ô - 5‚']R‚ðy¸/þ¶L]ÒèwÖ72žÜåÉ`B[êõv2RE\„Qþ{6RõQÓ‘ªC™HUç 2êY},Ë겺!$bžµ5›Ÿ„$PÔKå3÷ài Y£aÆäÃŒ -Þ¾÷8—NùwC]tÉžÓD{9{wå¤lÉŒg*úý0Ñtyl7‡ãkB2å üDÎ믚Ö_‡2úûx-Ó€Šêí‰,ƒ'$ÂØYþh„?O‡Ð çHú Ê„u)„L8%Ž‰«¶¡ALRÛ)ö:ï–Æ]!©ãÒlÛ´#†þsÚq^µ¡¡3iG‚i7¤^¯'·Р7>žuXÛÍ”†x“³ç©5’óTL¥}Áù‰#q%“í£fìË¡Œ}†Kê(Œ¢èÊ’4²dwêw¡Kþ‚7¡ÀHphŠS^/éÆIïgmFÏææiÝu’É:€êÑH‚ šrBÛ²P›¬i»k¦Hò`eŒT˜"µ½L°ªL±ËOÄÛ²…Š]ÎB%ι+‘c_$°¾+I,S"‘çËcì³jPAmN`þ;z¥]# wI(¼ @™‹bê1—Éðt]¥$Ȩ®?Ø5›š6¼¶Ó”ÍØýĮܗPqMš¢HÁåkyÅÕõQӦءŒ)Gï¡ãÂë‰:/ž.SÙ4ÃÅué•Ùdv¾e;Ýks®BÅ• EV ùxY+9wVVy¹¶ßàè~Ï&k¾éŽØ$†¥m}Úå~²…{žv;ôètâ;äÙíôP3nÇ¡ŒÛ¹Hš4ã$Šæ—t ‘%½‡±R‰¿ä§cé*º¦…óß`!æ_h®ëýaW`à˜”Oñ­ó飦%Ò¡ŒDž®Ö »â©ØÝ[ŠŠ½YÎ:ÔkÃ{K¡bŸ5¨ÚšAfž«ÓãcWíΦe¦¤ÎúJÕGÍÈÌ¡ŒÌ¾]X‘ ¥„ÌnvIYÒ³¢NœVþ’«ºÿeå§ûŸº*GfVîÚ#5l¢`>lï¾¥›.g}® Â$dZ–‚Á`WjÖ>jF–ed)Çì…Iª]&Ðd»ËZ‡CÞ-ÁPfëP#œyæ'¢0Lù¬½·o—  \ÇÁÝý»7’(ð¯ H¥OÒH4¦Š¤Çò©¨ˆ¶-¾R£¨ÖuŽ¾¸-pÞÿBÝyÖØY°±rñ -ˆ4†¤&M‚–xóÁ¢s-Ã-¿™åve·Dq)hHqþÝ&B…ªùÁGÓÎr*g9ȇWgKkZÉ7I÷YÐYdwÈ­ˆgDOÿK"çó+’8ƒfþ#aAÆ"ÿy­ -‡”™>ê]~ÍQi¨…³¬u KÞü«,Ð#“±Çܯ“âËÆ…×Éß Ù©hŸU/.Rwû&]n×W.g,œúGähÑxFÎΈþï+ÿ—%¡LÓ‰ ¹8\ÍS(?ðCÖ»ÿ5]òþ?gvH.endstream +xÚ¥YM{›H¾ûWè°ùÉÐÛMÓìMv”Ä“XñFʳ³›ä€¶˜A ÈϯßjúCHj„g×>Ð4EUõ[߈Œ0ü“‘dÓ8‰8B 6Z®/ðèž½¿ †&°DA—êjqñ÷wTŒbó^a)Éh‘~Oî·7¿\!Ãã+t0ŒÇ·“Ù×É'½ww‡ãÉûéü2 RD\‘q<~;›Ï§×Áüæýì?ŸgÓË‹Ÿ/¦ §XWy‚©Òê÷‹o?ð(…3ü|%=à F$ŽÃÑú"b±ˆR»S\Ì/þévž¶¯úÀ`T"&CáA#$#BPÌXx‹§!máx?M¿LÔ‰Ó·úü§ÿž«“Áû´ƒ&ÁS’Xãø¯UV*Ò¡ +cDã@­ˆÒ²®³eð[öò註 +ö@V7I™&ÛK"Ç©†¹Ú5›]ŽE /Vy­·í5)Í}š•Mþãp™4yevÝIa Ó }TXÞæåF_W‰á +fȶI“¥¨×wq„(åá@àu¨ZW#Q!XJÚá¥øŽ‰8J€ æ‘8/ÕQŠ=0%Á°Žø¡XeOCŽ"ln1?°LÖY/T\rˆ‡(:U—ª*G5ÕY©{¨NÄz¡: NïC +ƒ»ƒ†=P•»u¶Í—ú¦õïl£/58nÇeۀ쾙Õ6oVë~€9$îÔ8p‡ê À–jàsR;‹õÜÛ—Qhˆ¨|Ð÷¹ 3!ÿ3lÃÿ¡ªš6)Â&AžÜ0B ê"!‘¯ÊÑÃK±Un©m›´išÒhÜ-¡Ö†Â +ëA +Òḇ­mÚ¤`Ì;Ú©»D]„ê‡ô=ô z¡ÝcYÙJ§öšUÒ&ªª©Å}¦Ãl«Í»àU‡?ÿY•F|Wåôin$5д¬T¨§ÆóöLþv3 LiæˆKyäן¾¾Úª +@¯³N©®gZH‘XÛÇœ±8p…l+áHÞ¨“ƒz“-uõ×tmði­RŽßµ§†ýêþ)¯væuˆç¼þ¢™ˆ­«² NNÁ y½ggUH«Ì¼_VL€¾’“CÀVÉSÖí&ŠnîOLw³É¶ë¼®!û{q¼ªÀH ¡pCû8à£ñ(¶)À’`Ž]zÞ"Œ¹ìfr  ØXwk +Á÷“~Öö\jQ¿¬×YÓ@u›•ËíËF=õš3¤á MíÊp7;n'×Æ=U!ª³<€ûö-3Ù'{ÊJ›ªÝãêLÞR¨ø³‡~lÖ²ý}4¸ý¾htÆ°em›®´™þ2¹½û4žj¦P½1%¼K¢’ŒXdz?ÑÁep߶ªF¬ùDïje©íoaGŸvÒj ±bÌ.ÌNT$Úf%û#Q#‚ÉÂ7|À©˜klƶ)aUQTϺÉ‘Àb­A…gÏÕ®Hõþ½!_ßeé?<:!çH†°w¦ì†Ð Ñׂvã^_ ³a(Ûá³]?¢'{µ&ߟnìi˜™©Œ‹œ'œ©|G>û±£$zƒ1}rÂñ°¾7mµ`6_áÈ÷'Ow#"èè)yýä ã¶ðv5­ÄL ´á4Å@nÄ$¶¹ªçŒ=)ŒpPºª³9 +vŒ]-vt® ±9îh„Ÿi=(ä=Ìm%ò~àˆLÐ=Ÿšj9ù4ÿ<œŒ!êü±TÕ\Õn©Ê«1!»l$’1³J]ÝÌ̉ØL×y™ƒG&íy¿d™¶]¹4Ny›”;¨I>Ða0眻€?Uú8éêø—wך#Ló±‡_ÅQYà/³“ûßÙEÇìÀé£Av~Ó˜!qá'_>6ì ´ëÛ23ébþRCëdz×kh5ªm“ïÖ{±PÙ#n Jmklô+Ä¡,`ÈeG®bû +ç†w[â =ªI8—ðúœ•ÂPè•þŠ§×ûçŠÚ¥º¦ªŠáb8)«M×Ç£$„¡\œZ`&|“¤Šî)kz‡[è(™l£{ÏâtÊ´3°£òž^Õ‰oAòî–údìp‰QD÷c^‘Ô¾¤ÆHJas’ã˜z8N’3›¡_‡^½Ú¾x˜²ñйªcš 2ÍÊ4hòµ¯%Ô\,Žy>xx|‡ÅBæRý}.xÈ ÿÃæÁñt«•[ýæ‘ Ç#Ë®Hæ "œE»bën{DzÉÇ|£Í·O6«¾è/ÐÀbÔ `Ä0oq†^"iüuVÐçøuPç_ó”ö¡ÀQFá1Ç٠ǺJWó¤è×–@ʉ<‰j;Ì ÅjŸ½3 +áxb³®Ü ±€ì!O> endobj 1991 0 obj << /D [1989 0 R /XYZ 85.0394 794.5015 null] >> endobj -1988 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R /F53 1027 0 R >> -/ProcSet [ /PDF /Text ] +1992 0 obj << +/D [1989 0 R /XYZ 85.0394 752.3199 null] >> endobj -1994 0 obj << -/Length 2340 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿B/RÓ%>J¬¦nÛ9ÓÞ5} %ÊâD"U“râûõ·‹(’¢Ïuôp±Ø/ì >‰àÇ'±f:éĤŠÅ'ËÝY4¹ƒµ·gÜá„)ìb½¾9ûùi&)KµÐ“›u‡V¢$á“›ÕŸÁk¦Ù(DÁùåb1..Þ^þçêr> yb¸ f××óËó‹?¦¡ˆ#@ä( ->Ì.?ÍÞìzšŠ`öv¾˜þuóÛÙü¦¬+<$Jõ÷ÙŸE“èðÛYÄdšÄ“¯ð1ž¦b²;S±d±’ÒC¶g‹³µ;«vë˜1Tœ°X(= ¥b ð7g†s@2qÊ´²5™àc&óXh²p6TTf4—“.±–i„¥ì°4‚ÓËß7y9 ¥Hƒ»¼Ìﳦ(ïè;£áŽNÒt¹É -‡\ç MšMN“«ë›)O‚«O7ôý9ŠdæHUnW¶Ýž½Ç]ù²²ãªvˆåŠ&«ŠÆ²jzRæh¨IÂ’ØLBÎYÇÂêã(£÷œPFà>í¤(ë|y ‚¬òm~¨Êš8œ;UÃ5SI¤¾sô¬gŽÞc¡Üÿ­ÊL&¶ùu*˜Ö&}žµGaÝuÔ0­Àq{¬o6ÎŽ¿/«²Ó¶Þ€ßGBA¨¢ñÖ}×Å]™¯ž4Nb&ÈÏš®‹õ´éZ,”ÿKþ8äi$“Qôži„g/lXäž‹}¾,Ö ¸ÖÁ×M±ÜÐd©iVoªÃvEsk!uî Övˆ6sCBC.”q\¬ TVCêYë¸H…ÁÃËW¯bìiY²¦OÖ‰[`:¹0ŒÀÜ â(ÿ–íŠÒŠ+}Ô@øA*7ÿ7Oã #·¡Eâ+[Á¥}þ ‹)FÙ£vxG¾®¥cù àvQŽø°¶Ëšå†|¾ö÷ŃOQ_-´à+Ÿž Ù€h–K…S±©î§œóàU»å¸¹vÛY;Ꮋ›uð¼AN$Ö·[áÖ“P(–FB¦P…Pâù³×ïçnC×1A5¡¡u£X+àµÝV_É:†@ÞíȆ°†ìkš¢Ú–¦J:49ÔAë¨õ‚ý6g@dD0™hëL%š 1o¼Pç‹M0XíÄ'òaÞ>¶&éH£Á"Iš:«²†œ Ø<"OÒ°8Q©?sjD>Gqô®£ û JÓOÜe`‰ƒKž’ý€€ÕãG¬C‰i§eBq -ò¦¡†Þ×98F)E]¡]}¿±°Ï\ª±ü÷DŒ¡öÉ2ªî}Dî„ÍM¤Ÿ¶(ý\˃ì¶z€Ðr_ŽÏ«»§)ãÙ -nEÝ@)…‚k”-ÏQìšY@mÓ¶íé½XÎ|–âˆ9ú¦ eÃDÝ¡…À­p謰ÁÏíýZ±êÁí c] NÈãi…­ÞÀJ cF à`•m”Ôg‡ýóˆ£;M1+¸ØÏî2Ÿ |¢j³tKæ¨g›†¹`fÛ™$8”`éæPÚì%•~«<ÌרèÒ a¡WábcO!øò’+n‹mÑ<Ò¢_²~?ÒÜ;ç/¯² ãZ´U¹Ê}z¦†ËM¾üâxVÚe_r‚Ôí³ ~à¤Í®•PÃ8p·&Ììî]Ê%ÈÒv©|¤Eì-[˜+R4Y¼ÆÛ-¾:‚,Ö怓5P?÷nÙJ#³]&@ŸwuhìœèRh÷û<»§u <æN‡å2§+¼Ž:ÑíÞ` 9œ¯Šgó2A‰@ç }؇=kœÙm‰”Kä±&Ul¿Ç@ -½÷Ï?¸X¨wûm:2?ÒhÆbßf¦“Ç¢a³HùIrÑZOPk#´þ¾ºÚö@ö¢ÁÍѽ¸ï9¶yVÛü—ÛŒâ -ÝL`²Ë³²)v6‘ X_¼énÅ t^®œHô.✱¥!p‚=ùÀ­g½îúe¬‹0ß…@Áîë~盬yòyηžÎ‘ ×÷mïúËüã…o‘°åYWÝ÷Q_çl¾Á ™{•~1ŸÓžÙûÅÕw_1zW|¼Š%x‘r™vo[œ©Hz½¾¸<'6©ãÖ+^ô±ÛIèCV²íX?¯lyµ#?&>Mpßðüå Q™ä=ÅÁ¿cÞ^FŸÒ˜%©Øoöéæ׫ß5ÜE Ío™;wX<ÖÇÜ9¾©Ê -IqØ=õ7ŠŒþ÷1òHµþã¿XŽ&)¸2$‰n&f°Y{¡P9.¢ÓWåˆ ©ÅˆìÿÅhØ^endstream -endobj 1993 0 obj << -/Type /Page -/Contents 1994 0 R -/Resources 1992 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1966 0 R +/D [1989 0 R /XYZ 85.0394 504.8188 null] +>> endobj +1994 0 obj << +/D [1989 0 R /XYZ 85.0394 359.3246 null] >> endobj 1995 0 obj << -/D [1993 0 R /XYZ 56.6929 794.5015 null] +/D [1989 0 R /XYZ 85.0394 298.3625 null] +>> endobj +674 0 obj << +/D [1989 0 R /XYZ 85.0394 260.8495 null] >> endobj 1996 0 obj << -/D [1993 0 R /XYZ 56.6929 614.1369 null] +/D [1989 0 R /XYZ 85.0394 224.9084 null] >> endobj 1997 0 obj << -/D [1993 0 R /XYZ 56.6929 339.2217 null] +/D [1989 0 R /XYZ 85.0394 193.5316 null] >> endobj 1998 0 obj << -/D [1993 0 R /XYZ 56.6929 150.6999 null] +/D [1989 0 R /XYZ 85.0394 129.6476 null] >> endobj -1999 0 obj << -/D [1993 0 R /XYZ 56.6929 84.3474 null] ->> endobj -1992 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R /F39 895 0 R >> +1988 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F14 741 0 R /F48 955 0 R /F39 900 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2002 0 obj << -/Length 1439 +2001 0 obj << +/Length 2984 /Filter /FlateDecode >> stream -xÚ­X[sÚ8~çWð3EÕÝò#Mh›nK²ìîL›Dp×—®mÒ¦¿~,ÉØ`Èdv§3Yþ¬sôï\bøG†J ÌB> BŽ&b¸JxøïÞ ˆÃLuRµŒÓ8‰ŠäÉ÷Ï™Oà:—Oj‹©1 fÏj«:­­Ukëñ(ó D†ò“Ôc²“y -b˜ì˼G]”MÙòUμ=®Ç0@ÖcéòÒzìbûPDéK’› ˆ<1¹ìÐB €GÕøÕÆ=oÒƒzL€‘PtMÞèb“iGŸ•.]L’DM}ËwE%ÝzW²ËªcðÏg:MR#Ì,3*ÑŒëÙr}ÆfÐ÷öŒ;ž…gZ ¹¾»;ûÛ?d63‰IE:»{Œ•',Ïùì®üuþ]’&ç0›_ÞÜÞ^}¿¸}÷öæ¿n®Î<Ïx6¿øøñêæòÝÎB3`fÆæ×7?]¼'ÚÇs#æo¯nÏ¿ûñìê.6ž3‰RýqöëïlVÂ~SZ&ZIé)«³Û³…½öÓIep–™Š m>ã<1Z‹HÚ$©ÒªãòêöûOï>Þ½ûpƒ«±ßì4Èf ‘&J +Ë[6]W-]ýØüÕ6•ã—þ,K¤P|‡üÈØÊR5/ð!çø(Tj>×é±jªMÑWŽñLBESéÓ'0Ñ6ç<ŸWËÖ>K?61Êù³%·åvYÅÓ¢ •íKµé궡Žöšsr/‚º@üþ©.¤VÒÔ@*V]K­¡üØAZQC-r‘3áÔò¹zíª~1¡>¥’,å^}¿1&VN„eÛôEÝÔÍ#½Ù`0kЃ£SëÔ3ãBÞ€ú™×.ÐêzúA¬>x&ÀsãB¡ƒÚ̹…Z/Oõò‰šNÀŽÞÊjU==è¹{ƒ3¯{ÇW ês1oŸ±»X­^©Ãë‘Þ.oé¹op Ò A ÃQŸêU¹“Îó‘?¬iB`®7Öa±ÕZGJ[§KBÔ "máY2‡ˆT¹ý⃲}ÐàIÆy:KK”‚øœrbZ ¹|Œï#^àÂyÅxÊT%Æðüø”žibÊ¡VRhf’ÇSþ|Î9ŸW›úá• ìL oæ’^ÑëŠ~Kf&eNéFçp‰ãºrÖM಺Y’ý´Æ+*À(z¹*ºn,˜I“œ u\0Ï4!˜Œ¦ƒð–H²ÛçjY£“YoU‘³k»oQƒ$³ÍöaÄD˜uH:‡ KO¨sÀuDžËªóó”:y’-wè7+O c•ÊñL5T¥án@‰„º;7ÌI($ŸwA¹%P*Û(:÷Œè"ÀcÌ ÄvÈEó:ê‡)dñØa!äüî©v£øQ{]¸)î«}á,Ãú˜Èc˜ZoW}ý¼rÖîëõ±èá:É :aî×s{.kîÕ„¹MÂ…ö(Y¶kØÆ‚¡Ç§¹âÇ% \¢Åñ²¥ZŲ½Ýí'>ÐóË÷˜ºýL4€y¢Öc*˺w¹ž÷-Q)¤ a­Š=¿1Í ÿyõ ´x”„hÚ¹hôΦ:h÷Šúœ6lÝ­x~®šÒ›Zè„¥ÚŒ‘vÜM±®ÄýhÃ<è +vx#Nê€é°Gx&ëåÉø/ëMµìÛÍ +p!™§ú¨hi_69ʸdšå‘pïÛö3) ˆýD@A +ž™(I›È`G—:q@Ã’£F•àÄŒO-~40èS也¿£>|J¦Ò]°ª ãF0ë€ëˆ]=—5ìã^¡a¯2'¦ôLSFeK´d£)ßY×öñ§¥Ï;4H6µ$ØEò(ëÔ>*iRŸ£»—}s !aó‡Œí+ru™šlß”ËO‡’Q˜úLWàVhÚ„õM³¡Öå­Øøä&ê á¦M}Z ?KºK‹úRÛd ˆ÷Žo˜”¥QÞœ +?÷•Ãp¢¶sC„tx!•š_ýYw=•$ÐGȧ¥¶ÒàRY\lÜG€¶n¿TåA0“y––žpû!×a·\Öí»“éa×›~ð> ¥I Àqñׄ|¤!äÃņ,Ñ&ÙÌG +4JÚ÷B™‡}õÚu¾íøed¶+¸¡¹o2 Þaí>ýR¬j0 ”Úå7ÈAUže%7Ö,a9æoCWµ Ë…©îyßµ«­_èyëzIŒÄö—Š(¸t6Æç 1?Ud—/µ¬|wü²>Çb”Ö ”ûW7?=šíúÞ‹V»ñ¿ëëËEì­—?üp}} ~.y6oÚÞ¢Ðßé¤C0ø|ãJiÆTY$òsõ­Òßú®Ÿî@²ï©msDึ9"$런‚—Ê‹‰%ó ⊵„줄 y½Jr§’ܪ$è#wúÈçßÜ 4 jýÁ'7ôèÀšÒÑØoäaÐXn7$]Ó»o?I@¤¦Ü>a af2ØÆ•(l*O«rM¿!_”Y–h ÅAäŒa£EuÉ5µÖu³uû2§ÇS»ÝP “BŸ¨AµÛ¾ìR W¬µK—~tŸ«—9bÖàFÜvÇŽå‰Ê¡Ì>Žp®#ç¹,ÂUÓ—AÊæ4 éé4¾iÀ~ü¸pkBº8eXÍ•ŠÅ øÆË…°Aø†-‹o¶Ï [„oÿßðÕá7lßXýùì’- ll~á:^°¦|TJ(@Tú5Nª ”(Úû³óH%MrtÜfS>Ä5-‚7rç8<Š\í6g ;¸ +È„4Ly\#n u7ägqºÖñ<9«^” p±‚ f$iÏv¨ ÉŠqÐ ¤zÝ +ždî@ŨÝq¦Å„í@)feè›°yœÛ¢V Zrµ£1ãè÷ãX¤Tb¸H©¸[$v4íË77 µâ°w⸂”3eùD¸‡'°!éÂáàÂ-$Ô–’QOY¼:žQ »Zû)iÐÒ¬¾ìŠÜ7HÔW8JáN‡‚…‚;rײz(¶«þ „Á&’€çŸ8…r†°Àe!ìaò"Í¥ÈvÛ?oûÅC½Ú1zÆ/pMÈ'iYÂ9±€¶þ—´VÅ[z§s‡)4Ka *ó^–8ˆ‚Â;Õf”Á9!UɾìÝ;À¨»XÚ7q±¨™ƒžÃóOÀNl~C®Ãž¸¬ç<íUµiÂLvbJÏ41eTÕò„Á6OùqS7½Ûñ —<µ§Œn»^›×g;tjè?nÜ:Õ²ÛuîÛ‰»<¡  ‡'s§/ó¨ ŠñLZGëĘSgC®#Öñ\Ö:õ©ÓEPeµ +d?3 Yy\¶À5!\Ô«v‡”@ö!³‰C/ ŽŒÇpQn«°ïÚç?ÂÅ€}®ª.ëŽF«À~§ Úñ]ðÒnWå‰`ú’Ô þlhbÛcᇠ+ÿ÷¯“v¿ÃRàAy~à2Fd¸mBÛ …*ƒj?Ÿp¿cÚ—ý¾ÑXendstream endobj -2001 0 obj << +2000 0 obj << /Type /Page -/Contents 2002 0 R -/Resources 2000 0 R +/Contents 2001 0 R +/Resources 1999 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2012 0 R +/Parent 1964 0 R >> endobj -2003 0 obj << -/D [2001 0 R /XYZ 85.0394 794.5015 null] +2002 0 obj << +/D [2000 0 R /XYZ 56.6929 794.5015 null] >> endobj -674 0 obj << -/D [2001 0 R /XYZ 85.0394 769.5949 null] +2003 0 obj << +/D [2000 0 R /XYZ 56.6929 751.9327 null] >> endobj 2004 0 obj << -/D [2001 0 R /XYZ 85.0394 747.1998 null] ->> endobj -2005 0 obj << -/D [2001 0 R /XYZ 85.0394 709.1513 null] +/D [2000 0 R /XYZ 56.6929 651.1304 null] >> endobj -2006 0 obj << -/D [2001 0 R /XYZ 85.0394 635.0632 null] +1999 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F55 1040 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 2007 0 obj << -/D [2001 0 R /XYZ 85.0394 566.8617 null] +/Length 3048 +/Filter /FlateDecode +>> +stream +xÚ¥ZKsã6¾ûWè¶tUÄÁ“ã¼k’]3öÔnm’%R63©ˆ”=ίßn4@IÕÔ–€F£Ñ/˜/üñE¢C&SµˆSjÆõb½»b‹èûxÅ-fé@Ë!êÍýÕ«2^¤a‰hq¿Ì•„,Iøâ>ÿ-x}{ûþæݧÿ\/…fÁ›ðz© þõúæëëíö:Áëïï®—<‰y  a ÞÝÜݽ»¼ûôñæ¿ŸoÞ_ÿqÿóÕûûŽ±!óœIä꯫ßþ`‹öðó ešèÅ3|°§©Xì®”–¡VR:Êöêîê×nÂA¯:& ¥“P -–Z…RK5.22 "XÆ +VRÐr"|Ld…"[~¾ú õ™†Q"5LŽˆ²ÚÛå¦>ì²öT(<ŠBØGº®|Æ_‡aP–å1•ÔÂçðþ±¸^J®Ë´UPoˆÖºNÃ%õý]W–ø;cb[5PÁmÝ4åj[ˆ&k—®y$ Of û0Ž˜°²ø]Õß[üµèá.ÕÜ™fy±ÉŽÛšÜ.Uå#ËD”N·_å=O-‡œ'Ž£ ("‰E(l¦Z;Ñ•°C‘ê Þ·e]QÛÑö‡r—Êí‹%WmQåEN_m¿Q°*èûظ5ò—*Û•kúhʇÊ!ðìMm§{Ä“£–1?îö4"¢#Ã0·aEˆø}VuµÄ£ /§Ø^×U›•UY=Ѐã>ÏZÃvf5VvÚŽq@æ%)º¡pÎAºKÉRRAƒ¨ú‡#Z’0Rœ„¡×n¹ªnÇöµË¾dvÇõ#µš¢j,‘D Üd/f цg¶É€(a‚&eÖJ QÓV¢C+ñ稕àBÇVÿ,Û¶8œÙ ‹JÍsÖ¡FXóìƒÞ8O}ÞþýX Ø£È%z5‰¬fÂsÙ>-#*×wsôvlÖ­!0ýÛrS´å®ø >cdÛ-Ñ¿|A£¬ºÔæ7o¨¿lš£›Öè$ÐHë€ TÈ\]›ŠtêßÜ~+qß÷V1q…T¥ÜQɪ¢>6MM“àÓ†´Œµû’QT ”Õš&ÛpO¶æú™îî5-„…™05²‚Þ= y*ÍŠËîÒ$lòîâzR°`Ÿ5ÆvHÁƒÌÒœµ†&ì"K.1r¸ŽUÌH™à±§—ƒÎ;4;õcöTø3¯ì7Á +˜ìãȲ‘­êŽ#â¦Ïv£;Ã3ñ(0bhÌÍPÃ;N#29»'ú,“0¹³ú΀H.‚f_¬KÔO³+8ÞŒèv*Ó~.«¼~¦6™W>—FZ@3Û†_²ÜUæN¨Þ•n°møwÀ('Xƒ$…m{ÊÙŸ%wI°ùxl¬9³*“å¤ÇšjžÅ\<}rPdTZ?‡~½°;˜4T‰"ÆîNæRiw‰éËÉO(T+㜀ÚÚߦv8ð+À"µWÀEÛÐ÷S¶-Á¡Ô‡ÆÎSåvxq-jõb‰'b’Q4l¬³õ㨂›­±Jwa¢rC”-Å,Fd"¨Ž»­ }Æ9Ñ*KËëê-‘ýã“d£à—lŒÞ‰$´Qïìc l¶Ðtã‡ÓMÙÜÊžò¶h¬ª€Ã~(šþ¤A›m‹vël/4<ᣃ,ŒÒtÛ{åCw~•¶ž¶nZcì´3¨}v«¥s¬ZC@š$é¼c¢¦k‡2Žµq¬ -¸tÒÚ…j½‡;uêX!ÞKÀg9ëP#¬ùŽVd'¬Ýy6H¹X[)«lD4¸étzÞÈeG ÀS¼y¡£uà6TvÖ~XÚe›6;¹VŠ"#¤ž/¶ò¢…€­È­7…èÄ׸··_§O–A€Ÿ*}ád¨™“u(s²7c'‹¹£ ™š:[‚Í(³íDv%ƒäa–É5Â¥—70Æ*Š|6Mh«XÜ}~( –ˆèNÛ.ÄF ž:ÒZ7Ú؉y ±AŸsõ34ô1s-Sp: ÃA/€lè[Qì'²"©B29žzý4²Š࣓aÊ…îɸ¦‰% —Iwzã‰x#©c9˜õX•ßѶLMÊ”ÁdsÞ=g + *†B†ãÙYv˜så Ú*²ÓŒÉÓ[„ÔŽæVuÓU=»¢â‰(,û®v™Mg–órsj–2RRDÊh†2B`8#&°di‡tARØŒ°jRCüZ¨­Œ.°`A#ø•& Ÿ†ñÓHÌ´M‡}ùð–> endobj 2008 0 obj << -/D [2001 0 R /XYZ 85.0394 495.6953 null] +/D [2006 0 R /XYZ 85.0394 794.5015 null] >> endobj -2009 0 obj << -/D [2001 0 R /XYZ 85.0394 227.6801 null] ->> endobj -2010 0 obj << -/D [2001 0 R /XYZ 85.0394 156.5137 null] ->> endobj -2011 0 obj << -/D [2001 0 R /XYZ 85.0394 85.3474 null] ->> endobj -2000 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R /F39 895 0 R >> +2005 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F55 1040 0 R /F23 738 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2015 0 obj << -/Length 2415 +2012 0 obj << +/Length 2545 /Filter /FlateDecode >> stream -xÚíZ[wÛÆ~ׯà#tŽ±ÁÞw[I•V²©O?@(Á™­°¿¾³7ARŽÕ6µÎ1»ÃÙ™ofç²$ž%ð‡g\ ¡‰žIÍO0ŸÍ—'ÉìÖ~<Áž&DqŸêûÛ“ï~ r¦‘DÌn=^ -%JáÙmö>ú)t -’èêìòüMüú/ç¯ÿúÏ·Wç§1–‚àèìúúüêÍŻӘðÈ8I¢Ë³«¿ŸýÍÍ]Ÿjýx~súáö§“óÛN°¾ð8¡FªÏ'ï?$³ tøé$AT+>{‚—a­ÉlyÂ8EœQfÊ“›“Ÿ;†½UûÑI0p‚d ‚g˜!Ê`±׈(I xVé2ÏâùC>ÿô¯ºÊn°AL’B1K|$f8ÓÎ@E’:Ñ–jÄè•ÍÏÖËÇ¢Ìívú7B¤õæ’„”~ü%-‹¬h7îÍ2-ª{÷V¯ül]}ÉWm7ßÖuéÅ0Òœ/'åˆ -&­œ7›ª~lŠflEŠ‘T‚΄!öf£ŽA{ÂÁ.{L‚$Æb÷YX‹0<áŸÕz§±Û¼³aôÐ>v£ÏÝèK7š;xßRD(¤56r›½æeÚ4Žl ÑH)©=UÇq1ÁDW‚sOº¨WË´à8$ë8þðr»Æ KÄÀßgqgvX|SXP¤qÂ<ƒeåSHX":–ûÓQ¹¿ŽßòÛø±1¿Ë–¯zaùêãv‡(QuáfÀ“I¤H"Æ<› ž1• 8!Á!\hÚM™?ßïo^Xûö(¿¬Xåó¶^m&˜r†áxÌôé?ÁôM7úu‚½àHrÊþ&²ë‚‘¤7HÐÃSÛ÷€©ð̆³.ð7„ç>‹ýá¹£ê…ç~è?–A¢„+þœ°¬Æ6zýÂgý¿åcª$”6BŽŒþ•¬‹>šöÀ^½°|/ˆåó1WÈ0ý–8üÿ¸ÙÅMû64Í°Ö)áµ´Ö¼oÎo^ÿrq}{ñöªûÔ°ç‰Èd!?Qù+†‘]9i(SƒÓ¨}°<‹šMÕ¦¿»É´ÊÜdQµùýÊ—õ4ª~Ý­†N€úNZ0 -ÙEë&ó• ;Y\ÌÔV¥Í„ž”*„ àZ='´‹!£ô(Feun˜+==ä••uš¹þC95”SDg˜D·EãÖ–é§|J$,¹IJª/Ò1è%Ñጬ›|±.ݾ ÛÁ ×-ÁÎU˜w¨zîrCUä¡™2ë÷±ËÍr3ƒ²zÁzµm¶ò¥Qk7J·-Ÿ5ù -:´SÉ"4ív:ôDÉ=)vW{ÍÁ"œ;.lS,‹2µÚcè'¶‚óªÓÏG”NHˆ¦•U*º[·n¿¢u[¥åSºñ2dëå£:ׄõ½mUÛ¼jAí?ïÅÌçv¨r4££xYË€«Æ4á]—Lл¹Ô½FZ—V3JeÐPu•–åæclÔ¢X[m,“ÇDz0îaYµ«bÞ‚íì’…Ê-”ù—¼lÜôÝÆ=³|‘®ËÖð#ÆÕ\ë÷©ÂåØn­ßQ™}ãl¼%+ÑòÈ–hbË>Tj~©F[žWé]¸úÊò»õý=Z´Ws …¨yXñ-ѽ=‘Uûa¯ÚöÛj=ÞoRéÞ~×LÚ­ïÙÁºI®—Ëtå/}‘DùïE»½EB(9 LŸj?2•…æó>hnÙa³»å8ƒ-^¹GÇVŠvoAW a©®|Tßö\Ó#èô¨ ¨,:_vÐá¦~:²e šØr€N‚8MF[NùTMm\i¹/ªAGÕM"¾¦ê¢š†ºãÑNõý*]~•{Ð@svÄ=ªTÖw @%RÞ2Ml9h[üépK—m*êJà¾1¦oõ]Á™f#âõzU™tnó‘·\pq€´i›½ b-†°rÔ>Õ~P;* j¸±áÇAP¢í\ØôÓ) =ÆAÁÑ„`t°( ©JvcRøb3Ñ ³ãü5L7…“è¯Uu»S¼ê¾›aWæo‰&T“ól¿))䑼ԧ:`Š@eMQL˜BC+Ç娙4tJJ+Mˆ5è; ë2×(±®]C -¸2èNë¦ÍYp¯¾(eƒž×,¸&ÕÔ‘JG×uÓ6ñJ£Dã¨RßšMd2¨Ö¡‡5V‚°´ÖÚ[†Rý-ቯÕaˆ_M°g %JÓ÷ØH ‡|Ï.J9!q×-í²…–Z <þ‚Æ°+ëyºOzh†8Ãü_ÕîKkÙW›’ ®‰ÝB#ÊeŸsÝ''A‚KÖõ¶Âǯ ù‹a“{ÙÝúÑÍГçµs€péA™i·L`\éò›qn4w~Öô'¶¹ZÓšé3÷Z¯ü+ü›b⨌+ÝAwã(Š*Ï]2´œÖm\/âî[å˜-ñèKhMZ“€ã’>HíAÉfa¢ÆæÞgpeJ¦¶>Ú~™ìCÚå»~bêád&ŸŠùCÝBæ¾i½S¼Mt"ÁÀîŒðçÙß|?ÛÕÇí¯Æwo”¨`~ÝürÊyô÷²ëD|À|´vÏ3÷¨ý´÷&ŽGÏ€bëðâ|ÀpÚñ…¤Ða øŸú@֟ĈêÙŽIIî\ÆH@¸€n²Ìï»6œGÐOÛç„¢|¨ðÚÙÈ`µŸv^±ËÄÍm½Â¼õ€¡LæÖ+¼;HDeÂG·B‹àJÐÏŒ}ƒij¯„ÍZZ6µuçÆþÀè¾\{.i–9aO´{*`ÒÞ§Yöc$ÚŠ±L[ãnÕÞ¦8¶ö(MžíûM5×ñ“ PÒ]|óï…¶¿Œb€§R{M"9„{¡ Ö˜ÝzÎÿ²hWöÉ #ùendstream +xÚ­YÝsÛ6÷_¡—Nåi„â‹ùè6n.uëäFδwMh²8‘Hפì¸ýíbˆ¤h%sw£‚‹%v±Ÿ?@bÆá'fIÊÒ\æ3“k–p‘ÌV»3>»ƒ¹7gÂó,Ó¢ÏõÃÍÙ÷?)3ËYžÊtv³î­•1žebvSþ1ÿ¥ìVàó××Ëåå‹åÛ7×ÿ~w}y¾™f~ñþýåõë·¿Ÿ/d˜9Ÿÿzqýá⢽?ÏåüâÍåòüÏ›ŸÏ.o¢b}åW¨Õ_güÉg%ìáç3ÎTž%³'xáL乜íÎt¢X¢• +”íÙòìŸqÁÞ¬ûtÊ:ÉX"u +fÑL›4Ÿ6™`F`2š3ŽìÁdRL™,p¡É7šj–ç"›õ;˜&DªžÈ†F‰¡È·wuóp.²¹%“_-¯hð‘sUÜѸ©éùÉ>Óàic=©´}ØUuUß…©¢£Q×г­îjväAo&Ã3¦SPþ´-{\'l¸œ-Šüþ§$éq +ÎL–'°:²´Å¶ë• ™Ö+0MèÕ7xž2e´êõÆÖö¡èÀÜ"Oæ>Òù5ä‡"ÊjST5QŸªnCÄnc‰tW=Úšhû™¶^5¥-‰÷™$1qhº,Z¿ÊGžpo”¾š2K!®³ld•Ñf¤b9¦1ÁRÂë[xmoý–ömÐ)U]V+Ü2¬:[(™0)xU–'‰t v1lê6¨‡Uí0 n}¬’¤a<Þ‘yc8:ËáÀ›‡ÎÄ/FdŠé¤Õ"²ÏõrDF.‘ÿ˜ŠH,`Æ[µêœîMÝŽ•Š³Ä$Ùií"ׄz}_ +•°$1b¨ßo/±˜6aôB0upÔ®¨}¡¨ê¸%ˆJ%øü&8¤´ëb?v±àüeÇ(Å4—Ó~90p‹gr^¹8ª¹†™T¨“òϱ¼¾dFËt ¬¬d>°2¾ôðVÆ¡·2[ÛÑÀ4Þ½¿Áºýîà ½‡‚ãÆUl·G‹Rµ_QÕ/[ÏX—4(zÖM7Ð’’7cYb†‰Û Š£•‘¸†W +­]íû½¦´[{‚ã§'YβTvzée§&Tú禮`/¹µGõ_²45ùI¹çXî ú–j}¹1ø½pÊ¥¦îŠ^% µœ®|ØRmù²Ñ©(ð«õ¸N˜-p¡þF2Âé/È L2ù’1™‰‘Ìå½]Uk¬')´ÄMµÚÐtiiÔnšý¶¤±³<}oH© 9.°™§l<ËR’Íß®‰T7ãÕ‹²¸*ƒÎ³å+ ç-·¬.ëÕ­0½^˜@`aFd? œº*ä $ æ«Ëñ8³0g;š$¹*Æ NÝÛϸ1®icT7ZÏwØÐ×;ö¢‹0Þ>Ë_amïVŠUx»¨CqàÃm¡_…ÔE6ÔZ³öõ¿¬ü»æáù\1?9|:7ë$ˆõý z2e ‡åÖ³…„¾ÇSp`a#•æËß/~}ÿËåø­IÃ4÷ŽÒ8Õ l»mžÈ)`¡f·##ÂÊoiˆûv‹ê¬ß…áÌ!yÐ(†ÁýÖ2XdBƒ2"Koˆ0í1" +ï‚R¯—4 ¸ƒPÃKâ¼}Ž6éiƒP Ës/¡¬[(× X>žÐg¡5f::!æUo'ì;èJß #µAÈ1iDNöƒÜ>¾Å”Ðö\ÌŸýËnßvÄrëY]#Ì|–!aW´€-hÊ)2P®îïO)Í+€Üò–¶w¦Xš¥²w£îUK@VKgF-‚(ˆªú±Y¹¦êèd¾mšO- 14Ë À$سÆNáo•CIÔ&*„ÆüRiN¶Ñ>p0È/¥ÓéüÂOÛ&|Zt4z½¤ç1NÐíãÀ¹î…–Û¢ã&‹"•L#¼A}» ]0¸jŠŽKR ¿ÕÅÝ”{À—©xçز p¹49Àa‘³”CÝEîoÎ)ç!À1K)›²èÙг#ôÕ0ní£PzX)^ȃ©Z9\–Q{Ÿbüfº8Ñþü‰~Xlż¸m!µü›—ójÂîy΄Èô°D 6†‰\/¬(` ÚQµ? ­‘ƒÒ„IÌdNöŒ0>½À2‘y8Šºs… ¼<ÂVÀÎoÃÀ;Çš?°,i¿ö¯^…~zW1Ædm[ÝÅvà;Þ§HÆó4ŸºØxØ·ž*ô’^HyÎHq) Sp–ú;l<º_¤ßÏ"t!Œš¸§™ÇªÙ·Ûgšò¶vã°Cz Ðzg5X x€ @í¥#¨VD4àØ<‚BÁÐ/çEÛîwÓÁ=F¹ÿ l˜ª|²¬î§R:„ÝT¶OäøÉbò•EäÿQè†aÍÕõ»ß®ý%ë‡7ˉÄÁ›¯Ê|žë¤O:Zã.’®µ Õ_í¥êˆ²òI©y@åšÂSÇÄYWÁ ö€µ GhKã­¤ ßçíþÖ“Ý䚦(vt¸„¦D +êáU¼8ÓóÚZwŸ5†bh”5M¹_Y"ôXïAAg*„/%ý¹°AÈN\ïI»vðµß,È)J¼Dm;è¥Ðqvý™'Îk¬ÛÕµ¼ùÜŠáé×71—˜GÁCG!‚Ÿ­â[wÂ,Ö<ú/ȘÀ@Y×BI oyðÖ"Æ€=œÆð,h¬qHHCq '"ÝïË‚Oþâ.ÞA…JËt\ÞßZÇÒ0.Ïdó} –îöµ+_JWÚ…]ãF×P_ˆ £ +'éª )xëb?W·Õ¶êži2L¹¸Ÿ@7ÒÅ×·ÙŒ‰TƶÜX¿>]Ñ€ÀÕÆ®>y™ ‘vÅ'K”6^¹à[AÚ}ë¬â°²<䈆¦;)áï¤BR",í¦ðŽ'\à=ö| ƒª$"e“ãëüs»Å¿x@gsà):h ÷~ÚiOò³›&ÂPv³ïFâ’èXè&ïïmñ@ó°ðT8íW+K‡ø”÷²Ûß +$𯔚GD 2C`Ïz¡‹ëÌí è¼Ù]T +{ä¡ fþ¾3|c „>„ œl÷Ô³x³:?¬ÑMíÐU¦£ë¢1Z¤ú¤„ŒÖ“„íá Ø?´W‡ïäNB’o$Èèá%èØÚ¢uõ/7â M`°³EÝU;WÈ$Ì/ìŠ'h[—^%ºñÁ×Ps‚{Š‰)9ÙÐíô렬ϰC ‚ üzØÿØ:¾  ØÓÔú¡í=°ñ´"\_Œ„˜g=ø.ô9WïØKÿª„៖Wn<‚ÿù¿ÑÿÀðg–½py'MÂàã4(…¦RßQr&œ¬uÿoœ±8endstream endobj -2014 0 obj << +2011 0 obj << /Type /Page -/Contents 2015 0 R -/Resources 2013 0 R +/Contents 2012 0 R +/Resources 2010 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2012 0 R +/Parent 2009 0 R >> endobj -2016 0 obj << -/D [2014 0 R /XYZ 56.6929 794.5015 null] +2013 0 obj << +/D [2011 0 R /XYZ 56.6929 794.5015 null] >> endobj -678 0 obj << -/D [2014 0 R /XYZ 56.6929 769.5949 null] +2014 0 obj << +/D [2011 0 R /XYZ 56.6929 485.757 null] >> endobj -2017 0 obj << -/D [2014 0 R /XYZ 56.6929 748.2469 null] +2015 0 obj << +/D [2011 0 R /XYZ 56.6929 207.615 null] +>> endobj +2010 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F55 1040 0 R /F53 1032 0 R /F48 955 0 R /F41 940 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 2018 0 obj << -/D [2014 0 R /XYZ 56.6929 713.4785 null] +/Length 1499 +/Filter /FlateDecode +>> +stream +xÚ½X[sÚ8~çWøfŠª»íÇ”Ð6Ý–dÙÝ™6.ˆÄ-Ø]Û$¥¿~,ÉØ `ÛÙÉLÆ–?sô+"†?Daó Œ9˜ˆ`¾îá྽é‹:аz5ë½|Í F±¤2˜-[²"„£ˆ³ÅÇþÅÍÍxryõ×`Hî¿Bƒ¡À¸ÿábrwñÞ¬Ý bÚ¿x3ž†$”Œ(Ô0‰û“‹ãËáèíxôÛèzòzp?{×ÏÃÚÆÌ´U÷>Þã`gx×Èőžá#Ç4X÷¸`HpÆÜʪ7íýÞl}­·úÈ,B"¢¡‡ JBP,íÐ!b$e5ÓñØœúâýôZŸv±‡8€¯H +Êkø"+K5~UÛ•}ÂGð¼0YÜ&Ÿ ê@€Þ÷êjriôÄVÝbfiYI•féV-U1 Q_ese–>$Ù&YyÌ"2BTJiÅû à(Ž³€Û×##lbyœ ʱhdú†4(Še ™D!COw³·×·ç™»Ê*Udª2fL·e¥Ö¥yåY™UºYïôrĸ¤VXE46L¢âCÌfÉZ-†óG5ÿ:ϳ¥Þ«ÁL &Cžäˆi1D6¦í ªúDihžêÏæ>˜>lÀmižY$¬¬¬ÃÊmV%ß-X L³óVåùÊG+vtJÛ,ÿV¦å~jIÈA.0E"äÞT pB*8<{‹FXD:aZ"ê4áÄS4”—! ü>Þ»§§æéKóT™ãŠ6óLj’ÚÆ:ÒBÍ!¶Ú1Dp$i’Vê2])mŒÓñãÞª’¡ˆcÑåör<Ý^ÝÌ®®'Í.O¼ú|EÕ¢©5°FÚ€®;áð¼|ÞØàÏòj§ÖIV¥óÒBs„ÉÏD ?k•&®k¦õÛ†“éZÀÉ8j£\¹=Œ£¥õ÷UBÉ期Qé@•m‡Ä1â:þ;*oŠ4Û§{S&ŽùÍz@üº3˲úžVè(;PaxÄØvZ¨ì8TÍŽËÑ>"T„¾|iÛFx;@ÎIã”ǺNwŜˮy£Çº;å:zŽ¡¢y²– hÆ2ôçwG‰( +›“•¹ú˜Xñi6_mʼ€ º3ΫôI•0 ýÌí²¸ƒôЋ®@ëçÄÈ1/ßÌæ +šú¢î@œXj®\q‰ÍëÔ¦e1ˆú›{Ÿ·T-ÓuºJŠÕÖõÇ™Kà:—Æ"BžÉ¼6êxl5¨:¶ž2én~F¥yTv2/_†{*}™÷¤Š²)[®Ê鯇õHÈzìFœŸ­ÇÖ·E²þ™ä¦¤DüœZ¨p¨Ú?<`,¢§U:G垉EWå*–y±îÄg¥Jë“Už,öºÍjeÖ Lgv*ý‘gʆÿ2ß8ÓÌ“ûr ÉÚCGœ3xƒx{àôºƒQÄ =SkÛ¨îp¨Ú_ÜA 9?­Ò<*;î0H@më¨üóQe;ê›Á0ÙñÜž$Mr.jèK¾)²dÕ­GiÕDvY•ÇÉ„‘s|ŽÌꙥOfìÎì°ÝéKyˆÌÓº”Gy§/é©Æà®öYÍ ûf0¤,2 +†6X8›àkC7 ™ÕkŸÝ]ht¡†F!úWK³j&7€•ßÔ<ÕûÕBlÜú µL6«ª´øz$ãð«–H7Ú¾TÕüå®-è)‡ÂïݦÛMèH"Q†b‚ùÉ_nÊ3 »#àíxvw;1qóǘ…_Àwãé©Á˜ÿR!6\AØ–®ïê°mšURmÊn1"ÝW…©ç……=+×ÈõÛBU0¸ÛTzlEBÏiùï&äðWîjRZ÷»Vo˜2Ù}⺀p]è ÿî б›=ïù‡GÜpöŸouv÷W02øeïÏv†uUˆ‰3JµtßôæþçÐö|‘>endstream +endobj +2017 0 obj << +/Type /Page +/Contents 2018 0 R +/Resources 2016 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2009 0 R >> endobj 2019 0 obj << -/D [2014 0 R /XYZ 56.6929 650.1391 null] +/D [2017 0 R /XYZ 85.0394 794.5015 null] >> endobj 2020 0 obj << -/D [2014 0 R /XYZ 56.6929 514.9018 null] +/D [2017 0 R /XYZ 85.0394 752.1815 null] >> endobj 2021 0 obj << -/D [2014 0 R /XYZ 56.6929 376.6996 null] +/D [2017 0 R /XYZ 85.0394 689.7995 null] >> endobj -2013 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R >> -/ProcSet [ /PDF /Text ] +678 0 obj << +/D [2017 0 R /XYZ 85.0394 651.2999 null] +>> endobj +2022 0 obj << +/D [2017 0 R /XYZ 85.0394 618.4832 null] >> endobj -2024 0 obj << -/Length 3046 -/Filter /FlateDecode ->> -stream -xÚÝZK—Û¶ÞϯТ Í9Š',ñ8uOÜxÒä4É‚#QO(r"Rž¸¿¾O‚IkoÚ™…@ð¸¸øî ÿd¡ÂLó…Ô LÄb½¿Â‹÷ðî›+âiVh•R}}õ×WL.4ÒÍ÷Ûd,…°Rdq¿ùeùâíÛÛ»—¯¾^Q—_£ë•ÀxùæÅÝ/¾s}o¯5]¾øæöÝõŠÈŒ R†,ÃË»on_®nþv{ó÷}w{ýÛý·W·÷‘±”y‚™áê«_~Ë ¬áÛ+Œ˜Vbñ­ébÅC‚3zª«wWÿˆ&oí§cÂL!¡¨‘e‰4†6ÏRh”1xe¤ñðÑ­¹Û®±Þ•ÕVË¥Ùf‰0ŠUriæ7#üJ)¯šu^™†§N§edBuSWÃDÅú÷ÖµïÞ¹ßÃ5QËbÝØßù´+×»ôý¶8x¦÷[Ö«7µ_À®i»:ßþë&ÐîòεÚfoWµX¢‘” th!-µ,ºIþ8–®±q_½¯Ž~‚âϲíÚ¯N‡-#»E}"SËNqøø¤¥'ÌÑ»¦Y²Lb`N!F¥°ÌMl €s,“-Ù«jÕ–UY¿ŸØ™Œ#ª8÷åõfd`Qül¯/¬ÍD`gS¶ùCedÁØÒhh*tG4@ïñs¹Û×Û€8Oeë?pÂ5‚pEÞŽ,¤‡a“¹›L"šXÕ ¬.‰† É?I ¨§v k‹uW~(@%!K·á+Eç˜?wß)IY¨8SD¸"ÃMiÏÔßì:3läßf™BÒ`fÔ*{¢UJåì±Ê‘Ê°³Ú:Ž…H(ÁN)&<ÃÛæ°];aŒ0 ÆOñyÎ"Õk 2™–CÞÞÁ6•ÛSCéùqFf{ò²7G¿bL«ÂÔ·Mkð?Áï@ÀúÈsŽ8(wWüÙÍ"WbhoŠm~¬:h?Õ(œÁ+H-h2Ë!ššD"B"”¦Ñb<&êZª´*‹–W#hõf\² p¡ˆ -PÃYÖ"ÕoC¸H&H ™‹paŠ;D0Å"\L§‹éó/¡ãØ=;×éãú(MGa\²Ñ#¨´uÄÓb„"ƈ~‚@W˜"“²S"hÅ$ì)&lèOŸ%¡dõäxíE H+–yRãT7+k¯¬¶­€ LƒuŒ;xßM¬_Ýx=^çǶJâ¾Ø±nÁR{êc f3xpÿáæ¸l'mÀº©»¢î¦ÍªÐ8Ì V5!šV“@dµä÷q-QZ-Ù{·2Њ‘âb–©@sÎÔ@?¨@ʼM¹z[ lGö—ÃJ M½™ÝÝ• Ÿ&à#ÁY’`ˆBð]>•ÝδhÐ2’j“ëØæeu 1†é0â0Š†ù@ÑÜ‹Ö 7c¨%GJ*‘Fa0Ãç+ŽÄVôT[z}‹^bÌZƒFC<1Ô…fÿXVÅ„6h¥ªWkòÕXl¨V*YÁS~¨§ŠLgçvâ“ù¾¨Ã"áz·ÞH&Ò (ß×Ía2"‚SvÉ ±ÍèõL¨fô3PYÝ)(GYÆÕ¬‚2”Èäf‹T#œ •|—zÈZïÄ01) ¾Í]¾ùÙužåj¦³Ý5G“ØöCá>°Û[øN“²Y¿-·þÅ®ð³Å¨ß>l6>Vn °Ÿ+ž Tpªéò9…2®õP¡¦õ•¤áïyê -Ðâ‚÷ÎdÄ|w"ìóTçyAù4€ó‹yIÏ<¡šx ²3pùž8G’b1ÏX¤álp†€fÀÚA% ˆ3AøÍÍ8<žöm‹Cëž-œÃ§lycêCÈ “ ÞÂÙœ1©SÙ§ ’Í 2C¡Šg"2CY¬Òœ}†ïé cÉÎóë/a{y¦‘8›‡fJ5 ÍHe¡YVp4ËWŒŽÎù ŒõÙ&cÖò^“¥5¾æÙÊ)”1¯!xð5‘h|mͤñ„…¯ä›g|ÏJ.§Æ—a‘¦°,ßÁ—c%X§²Ó -Ì º%Ò\|àâKEú,»ÐÿÿQ‡‚ÄòBrŸRÍhf ²šÙ\NîaG”δ“sD±äóÌEªîúÉMñSÉ!{?]K¾<”1ìŒø,1Ü'ñ̆9v <]-$AJÆ`º†“‰¹» >æèAÐåëíÈ´Dh~yHA ÍŽCÙŽvœDw±ÓDe, t¶Îmû¤á*ò¦«íŠyôœÐÒñ ¹·¸¡.}ÜF!‹Ë´C±7CtÍáãœædâ -“OVy} ÞÌ`S+³ðN©¦á©¬`Û1xcD ²o»Õˆç5›Ír©FX–®0"“!o½ïQÚ24öìØ>[èLߙ‡u/Ðé ЊEONµóàÄœÓ㵎r.›&¬Öé™ÆtÙ“ÇXè< 63ÚÆ #!uqŠ*7Eù‰‰Œí±åKöœB¨eR­4ñ¸·u¦–†mß -E@h;%PàB[ßÓËΔxZ×x´"jÖà…íÁ‰éË]#•ë¼2çi¦ëÁÿæ~°â1?ä¬]ÊG«€R,¿¯]g´G+ñ´)Y„öЈÜ“‘ëéWE–Aµ÷MÌâ wwe^¹ž|ÖèüÕà³nwl½9dzy ¼,6eçAüª±åÔÛ—ñâ!—gøXÈæÑÚÙ²¡Ô¡l-W6”*– ¥öeCh ˆÐˆÐ.ý‡¡l(ƒFɨEÐêˆ+¦³åëÎOQµMŠ;3òÌv/–5wù‡Óªæ¾Èkw gª˜§ÇÁ•žs”§SSFž6¡8CZ^*ÿ§T3&4PYúî³b÷Y¾bì~Î×hì>`,$•Â×5à7w?ï~¸bùO÷p–YŠ“Ìh¬'í¿™¥d–"†à–v&³ÌLmõ f–T°çg–òÐÉÔÒ0>Z2ÂÅùy—`a÷dŠ Ñ48‘Åf7z xéÃ`L\s½B4—16ËY$:gm€OH)4—”òv³s®Äh/Ãz5‡ßýå}¦Mº—E›æbgw¶Š-ÛBmÉkII»ýER–dÚ)p¸—C€h$ g†Ã3e2ÆðGÆB"©©Çš#‰Ï·#<^Á»_GÄéD^)êj½Þ¼gñX#-©Ï–[ -a¥Èx¶ø<Ú™5ã9ÄcPB±¼˜'ÛtÍ×éüÛßEžº¬3@qš™8þþ‚¨IZÕû¼´Þ’Ü^ÓïYe¥²JªÚ½-–öJì%s·é¾±SìÚKjíÚ»EZ¥ó*]xNÀÎdµN÷/Y™¢vvìD>܈I˜‚›åôæƾú0ý˜c()_°À -þ‘K;´“©y‘/;¯{LwìN#J»¤=¼çÒ€™¸mÊ…OqÈ GZæÞÞÞ][{ÚÍj±Íò¬¬öIUìí£‡téršÏ]Z?&ylî‰TˆJ)ùp^™H¢}bE£{õ8û÷§‡sµø¼Í«tŸ§!Óe•nÝÚ¿+ò²ØWY½=ø…5ä’:;œ"ðûÍ~ŒÝr˜F… ÄcˆÍ¨ÜÁ‹iÄ5g‡%¶|¡4¶R?ÊE±M²ü°øÝéþ2H`îG^ìʬVFP¬ -œ)$)‘¡j@ n*Ìz‡KŠ Œº&šJÁI Z¶ZyKÈàçˆõ’l¥¹šèâ‚Ä þÙ*Zf—èž[i–q§ÛÚ]ì²))„S]¤Oõ*Ú¤ÏéæçÍ.[iÕJÛ€+-äÄ_n’UÀå#E†>ò€½ˆ)€%“°ZÀ˜_滺 YÖH©X-ï^MʶFÈCšà£l”­4 Xî§ð—mò=*‹ù·P¼Ð[âX¨¡ýêõEÌöP»‹ýQ8Gé­_5Z—~Ç —‹Ê£œ>mªìES°`5ÝY¶ð9ú½Õüp ØõHO ÞŸºÍÑÁ¨jØ{\á¸_5¯o¦ïnïg·Ÿî~²C -°rì÷$Ô™jæ$±—kW»ŒÜÄF²u×ʦ]ßMM³\a‹94 ˆÅx²KzÍ+ÓÅÍ:¯l2’¶—…é>ÙS]e…óº´Þy»¾CVzo:”¶…ëùvµÜlz‹•åËb¿M¬Ñ¦÷»kˆ`—¾.»GÐl˶۲ËVä—>aš1ò„˜uŠmüc6~4ð\|³}BM^²j]Ô•}“4Á¯êmšWåe`‰ˆ3ñùUfc¢—l³±ömnçÚÍWC\&õÆÅuø ÆtUïÛ©‰y„+‰1⬭oÒjþ¦‰ -™z"~À/%S]V-š4î—½n´&Ã?Ý˳*K6®&U2\‚ À&ukºôÔå¯:Ýgi‰~¢Ç~jöÐ1w ’ª4¡â|íjy¾}ÜE[-ã7âC—Þj¢Î»ôJ—½: b ¶çò±tø¾½æ~7l\¢¡gæ}†ÝîuQ:>³…b–åîqæöÈ<Ù%O›´ÏÖÁ…D¡‚ P«ØWp›…!™4¹íf¥PÔˆ‰ØÓÙHž4ã÷EÒ=lë -xl;õïóM]fÏö8D[R«WPÐÑ:ƒ¯u<ˆ‚s.(8rDA×eòþÿƒs„)D}]­Ó(hµšÀ=cÝÀÍažˆ0aî†GE2ŽõùøZ­@€½|±I¡i?Bšc¦C1˜Tê§bQ*áYQb¸†Žh~܈Ì[׈9ˡΛö`´6ÑîšÚekD"€ªS+˜pº×Ä^vEYfOA&AFc¦ü½” "qË㋃‡ Ô]- -X€Í˜‡6—¡U -áX’ã¥?ƒc…(ç¾r•@ç6Ž‰<¥ýÏYÉSYlêÊ=Ý%ÕÚÀîtuÁ1J¿R]:Zgª‹×jªË"T]RZ°ð¹¹_]Ì—8¸Ÿ¯Õ -د.P±áI/Àió¹D»…4Â"I·Eþ¯ÒÝ™è¬hCŒ¾lÏ \ ¦É©ÏôôYö2ñäÚ Y5¨o"Ú's³éŒÃö8`êNòZ²×™:ôc_/ŸÒÈb"†ÇúÏEí)§¹ƒýTøž”ƒ&íSeˆ±M•%ÑsG¯KGŠC„|0úJs;蜟Ói ·<¢7 Š-tõ3μʑ³Á6TšSÇÙC=<Úùhs0x¹ti]Ùe­ýÂœj3”š³&1_ðÜ×»ÂÒk ™ýšc/:õÝß|Md,4=ÜžEþëß¿ypsPT4œ*ÙÒ » L®åÇ0p¿Çþ\¹$-endstream +xÚÕY[sÛ¶~÷¯Ð#=¢¸À£ë¸­{N·v§¦y %ÚfB‘ŽHÙU}7Š¤H)N|δã –{ùv±ØÉ Ã™‰%šê™Ô LÄl¾<³;Xûþˆxš8Å]ªo¯¾ùŽÉ™F:¡Éìú¶ÃK!¬™]/ÞEß"…ŽŽ.NÞœ½ŽO8;ýÏïo/ÎŽc"J¢“Ë˳‹×ç¿ÇT` bŒ£7'¿œü×Í]k|vuüþúÇ£³ëV±®ò3£Õ§£wïñl6üx„ÓJÌžà#¢5-¸`HpÆÂLqtuôSË°³j_ƒ`DYBGРdFÒBÐB£„Qfá8ùåú‡·?C€œuÀó˜&ˆ +Gv^6ÙªÌÀÕ¦n²eíN«²®VM¾^z. ”#ÆêÙpl0èÎ-Óe¶ˆç÷Ùüã_U™™w 1 Xjˆ/€dB3xÒX[ª£WN+?[-ò"³ìô”J7êÌaL ?~L‹|‘7÷d™æå{ªV~¶*308Ì7UUlMßâm¬ÀÓ’Z=¯6eõPçõ0hAR%l&À-Šh6ædöWà‰@’68Ù-ÕzÇq¾y/Þ‡Ñ};úÐŽ>µ£Çv4wˆ®§h¢ÀOÄèmdÍ‹´®YO1ð¦RR{ª–ãíG•áIo«Õ2mF8öÉZŽß½G®1'qˆôYܺßÅù i»À1XV‹l KĆz<¨÷óø-¿Žò{óÂú•/¬_}_ÝlŠìóCóê¥ öaDdzˆø0j†Ñ"_eó¦ZmFD Ž*ÈPõ§ƒªÓ×íè×ö‰@R0þ®3)Éd(÷t ©¼ôgÂh…íˆûª Úa±'ƒªNíž4Ãú™4ÂB‰ÏÉœjèÓÞŽÿŸD ‡¥„b'‘ýmð\Öù çŽzî-_X¿ê°³;ÛpÀ“K¤(–Ÿ“¡ÒSÈ0íÏÌÃÍÿ"™ý«2䨿úhíñWÌFœbÕ÷ÂtÚÖ¸1åHc³g»¥î볫ӟÏ/¯Ïß^´/Mu#}À ÞWT”ÁnKi[5÷¶lçQ½)›ôO7™– 7™CÏr·òÅ<‹ª[¿îVCýÏ|ý}ƒîï¼q“ÙÊdžA3µÕƒGi=b&D¥aƒY;G¬‹9¥ö´ì»`Qe†¹âÑÓ}VºQQ¥ ×u(g†rf€êPBD×÷yíÖ–éÇlL%"…9çTW¥CÐKªC ­ëìv]8¹·¶‚A§GÉU˜w¨zn2COTä¡…2ëw±+€hQÅt?ó¯WÛë>[º8µr£tÛè¹Q­ /;–Ê`4¦!¹˜V©èfÝ8yyãD¥ÅSºñ:,ÖË?t¡ ëzÛ 6YÙ‚Ê¿ïÕÈæv(œ4gƒœÏ@¨Æ ‹¶7f8èÝ\ê £­;©M0J, Î«2-ŠÍ1!Ęň¶ÖX&EnÂòjVù¼ßÙ% •[(²Ç¬¨ÝôÍÆý.²Ût]4†5Þ(ç™[°H˜· :á>¡PÕºy0¨2»*/ +7ºÉÜ/D÷ÂÒÚÿ–þwÞ¬SOíP6£âvfxûf3Èâ@2€l¬5 秽z¢Ñ¯6ÖË´\[@íSß0Q«§¼6w Ø- ~A¾åŠöíq6['àlÆËuí¯yÒ&¬¦aêÆïµÔ;Ïõçšûª[²«¢Û¾í†C)Ñ™B‰!®x{«àsÉz•š€ëÞé Ñ#‹aj®ÉtÿÌzk«Ý+=ßÐ8$pPîmºTán·}h©ŒÜx1 έˆ D#"»PIh#¤ˆ<+Ó›páµÈnÖwwhѤå%È!»[š=V;kóý¤ÍÓ¶„Ú»v ÇH³:;X×é]Ñõr™®ü…Ÿ¯p”ý™7Óˆ`s«éL:T{P T—O“¸ì¹EfGä(6]‘?­óp«kËN;Š· „+Ï°T•>ŸO¢C`'dò²Ú£Ó¥šF§¥²è<î #Låt@d ÙC#Áð@äXì@Q·yÆ•Sù Ú+¨kpòœz‹i*Ž[2Uw«tùœð$Ö“ò€:T{¨¬>ì8€!F¥Þ/2ˆìõ@ +þ¬/Ò}öj‹ß®3Æoñ]©™.Īõª4¹=‰¼çBˆ¤uSOƒŠá¬‰>j‡j¨Ê‚®D/pd°ÛŸ®b:AŠP¾_±@4¢ë‰LÝÑÓìÊÞ·›ˆN™ào½aú(‚£s¿VVÍN)ðªýÃÏ/Ìï‰:Ô“³Å¤+¤DTBY¾×¢iG"ë‡|Ä:8!myW'¥¡ARz¯NfW§^³­–¹ŽéêtéšP@”CGZÕMlv{ô…(ïõ¹fÁ5¦¦vT:º¬ê:·‡½¡4ÔŽ*õíØH&(Buè· ë+¬Ÿv3–ù'uˆÔ?°À¾>‡!y5žs„•fî±Ñ¶÷„[½HÒvH»l¡NÙ~Š!-û¢š§SÚC• 8{ør¤éjkÙRW#ÎtP×d푳A#&d—s Ò“¢D´W hê»34|üú·ðW“Þ~}ç1¥&ª *„Œ½RFqâŒëojÿõzW÷¿Æ"°aendstream endobj -2027 0 obj << +2030 0 obj << /Type /Page -/Contents 2028 0 R -/Resources 2026 0 R +/Contents 2031 0 R +/Resources 2029 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2012 0 R ->> endobj -2029 0 obj << -/D [2027 0 R /XYZ 56.6929 794.5015 null] ->> endobj -2030 0 obj << -/D [2027 0 R /XYZ 56.6929 752.1483 null] ->> endobj -2031 0 obj << -/D [2027 0 R /XYZ 56.6929 689.4255 null] +/Parent 2009 0 R >> endobj 2032 0 obj << -/D [2027 0 R /XYZ 56.6929 626.7027 null] ->> endobj -682 0 obj << -/D [2027 0 R /XYZ 56.6929 587.9664 null] +/D [2030 0 R /XYZ 56.6929 794.5015 null] >> endobj 2033 0 obj << -/D [2027 0 R /XYZ 56.6929 555.0457 null] +/D [2030 0 R /XYZ 56.6929 751.9898 null] +>> endobj +682 0 obj << +/D [2030 0 R /XYZ 56.6929 712.1227 null] >> endobj 2034 0 obj << -/D [2027 0 R /XYZ 56.6929 519.5738 null] +/D [2030 0 R /XYZ 56.6929 678.7055 null] >> endobj 2035 0 obj << -/D [2027 0 R /XYZ 56.6929 453.9292 null] +/D [2030 0 R /XYZ 56.6929 642.737 null] >> endobj 2036 0 obj << -/D [2027 0 R /XYZ 56.6929 370.2609 null] +/D [2030 0 R /XYZ 56.6929 575.4649 null] >> endobj 2037 0 obj << -/D [2027 0 R /XYZ 56.6929 265.1402 null] +/D [2030 0 R /XYZ 56.6929 435.4781 null] >> endobj -2026 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R >> +2038 0 obj << +/D [2030 0 R /XYZ 56.6929 292.5265 null] +>> endobj +2029 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F53 1032 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2040 0 obj << -/Length 2882 -/Filter /FlateDecode ->> -stream -xÚÅZmÛ6þ¾¿ÂÀ}8-P+|§„;°I¶ÁÍ^®Ùâ -´ý •µ»jdɵ¤lr¿þf8¤,Ù²Ý"-š+Š‡óòÌ2_0øωŽ™LÕ¦*ÖŒëE¾¾`‹G{sÁ=Í2-ÇT/ï.^|-í"S#ÌâîaÄ+‰Y’ðÅÝêÇèêÝ»ëÛ×7?\.…fÑËør©‹Þ^Ý~õ-õ½»LEtõæú=¼*% ¥HfXt{õöúõåÏwß\\ß âŒEæL¢,¿^üø3[¬@òo.X,ÓD/žá…ÅÔ“­>fuG  -Í=×}Õ•›Ê½z÷}ë«žOP7µ›"/Á}D±òà3±z)3ƒtu¶.æPl)S%÷°æ¹tùP»Ã ૱ÀI»b».ëÂw?ùFݯï]úW´¤Eù©gãñ¥¨;ê Ä|g7§ÙqJô,wàíÍõ”žiéWëëÌå ¤¡šÔ0Ùàxcvm· xâ.¾òe‰/u ûU~F°;±‰Œce(cîÒ»]G–Æ ró™pQÇ@åÂqs67Ͷ;ŒF'JŸ–+ÍÈ5­? m -³'Ø·eÛõ®t_ûb[?äÛÏ‚€µb‹;ªóiðÆ[Ù–3î8°¦Þ±*2PÏíH$ׂ³À1›jkc©RqÚ¦cªã6¨œMÀ3±M@'— D3KNJ[ÃÍtÉÿ^ZmËÎ+%”‰Øöe¢Sc—u`Ö2oOÔî\i@±+Ý›~Îp2"ÇpO|¡øTv -çàW)ÔÁZGØ4ý-é^&îÐy$árÀî1'Ž‹4/ß 3öj‡ ÝRõº4cµø„þ z4¤"¦Rã6~;R6 H¤d±–"¤ø_. ‡r~iDt} `*…N -Š§”k·øâ×…[!•D5j»Ýî´à:^ܬÅâu{ZŒ·8/ǬݾŒ›ŽjiÂ@‚õ@g' -$5›®$ÛZ\&Zge]}öã~¬ì.ÚŽÞ¨NµÑË›Û×4'¥ŽUq)YôñR訨È~ä´À >Ó$h õþº¹äÚÏ[ÍåPΪOYýèŠ5xq'^xfôxè»~[P{[TE¥6p=pW…éW‚£ŒâË|L&ПÌ-ww_KdçSe"8€‡äf'!l röþ|•¸Î>-Û&ÿpX*jµ3‹ñ‡Ù)PÍÈ7É#†Ãy:𪪚ç™ ÔbwÒc%”‰*Qa'áXÕ‡³W¿™âã$¯iK92§ZدõE,ŒnA€ªèڣ𨘕J’?¹Lce…ú¾;L9ÂØ8µFHð&<0rŸ™fNkV„óÒ•ƒÆïÜß[–7C[DoŽB¦„Úsk=d29¥&Çí#)OAæ˜õ È”Jø4ÓdšÐnŸš¾ZQÛá<ûº.ò¢m3<šÚAï"ŸÃ1x¡òó2¬ð¶Î~A -@­²sÓ<#ÓÑÔáÙR1…W ÃÀ,bâáEbIbK)±±7'©±9‚ìšq8ò”¹²0Z?ôõÜyæ¢ÉÜ°wT½Qmªêýøú8Ë-÷i9™\)/âžµ‚£WU®K,jPnÀ]).]¯ -ÒXõÙÝáhûjÛ5\½»‰©÷æ’G5Q%~má ãWl‹Î/…IpF±ÏO¨'ÅŒ+âAu*väMúxìáèý^~@õµÔ&M`Ž–o<5q¢þCÊ·Ô¨éï‰0ãXñÆ™Œ¥ågO·<FZ$rñÆ¥†b>åBñ6f}¢xã†ÅÊ$ɤxxS3*Þ¬/Þ,™ï)=8Ë/}‡i6z.»'j¡CÍ|*é Âe?ƒå\x¸C ¡¾B8çP óüi 9¸´L;ö¨è†z³uÁE/ôP„Ò÷BèÉÂHC7Ù"Z5E[ÿ½£î¢†|–û[ñ¶ÈûQ ê.ÊkQÞ´~Xí?°¤cA ûiþÓ‚/ýf” Êl¸†¢½þÄ4ð‡Ï( ÀE+²Ÿ³¦ÕØ0jkºÀ|[Q ã† Ý èzðÅ[Z¤" ,«â±ð“ݱÑbjͳ íŠÂÊ#ÐÝD`˜D¿deu<#ŽcõËÂÿ¯MˆÖÆ ¨3÷h -'®ðœsì6|´ÞñËð¡fïÂÇR½/º¾tA/Žd@[0Þž„û7ÝxºŸý€%$¸MUt”ùà}³õ~æ—ÄJÝ¥¡ÖVÜù  l –_ÃS TíÄNºk,2;OKõ2ήÂ?.R“ƒU”JÓi¤N$ò×ë‡÷Á ¿øë›#°!ã|ñ|v?b‚<öØ_†·5 ¼P¸°ñ¾èZ&±N„‘ýÿ$Áendstream +2041 0 obj << +/Length 3061 +/Filter /FlateDecode +>> +stream +xÚÝZKwã¶ÞûWhÑ…|ÎÅ“–ŽÇ“N;ÓÚisšÉ‚–¨O$Ñ©q¦¿¾O¾)9ãENí…ð¼¸øî 3 ÿd¦ÂLó™Ô LÄl¹»À³OðìÛ âihѤúæáâ¯ï˜œi¤šÌÖ¹ÂJ‘ÙÃêçùÕ‡7woßÿt¹ Ï¿A— ñüöêîÇ«ïÝ؇KMçWßÞÜ_.ˆL("eÈ<¿»º½y»¸þÛÍõßÿóÃÝÍå/ß]Ü·"3]#2ó×m:q!È­–…8ÐЈ+N& `O9Šu·Ÿª°ýкÿç¥ó¹NT·0`^-Üï•û)ü°Ç@o7G@Qc:f¦RVúçÁ@ÖŸ4IÔÙ@³';P "X*’ù*ÛfŸÒ*/öîÉݽûX¨h¯.ñ«³–Áü~Ø¡¢?‰«Qaz Á$v&@…‡ƒDLbцC à€ô°Á5›¿¯Ü³t[®õÚ^ õi{ô³¤«•c¶ôD}­€Á|f°¯ÑyÍÆ.­ ÜÓ¢ŒÓ~ÎU^f+»ÖáöøÑ£ÍNç`—oW'ð-ä’¼ßdßnÇ_Ú®[Z7òÛ1w•{Ëí“ie¿çeU¾éN›Gv³}G¦–ìð9ðHsO˜6Dïšf9(î×Y:‰9–\”ùã6ßÙ™„#ª8÷/ä÷'†oÅ{{}jf &BvVy™>n,›ûM‡¡ÂpDŒ>+7˜ºp£ ¯Ùá9/ý N¸fB®£HË,ˆÂ°É\·7ù´Ù¡N‰† Éÿ™÷Šþ”-«üs*A@S½-VqŽùÙ¶˜4YØpÆ8ˆpEÚ›RöÔßìê…±äï + ‘%˜ÇáÜ-šT.ê$1x¤2ì,ÖŽcèÖ”•*&<Ãëâ®ËaB]ŧ9‹T¬µb‘H´lóvÛ”¯»†ÒóãŒÌºó°6G1¦ÛÌÔEiðßšÁï@ÀúÀsŽ8n)w•ý^M"Wbh¯²uzÜVÆ7ùO Â"_©E3À?¤Ïc‘"†¥q´p YVBO ¥A5–@eÑòn- ÞŒKv.Qj8ÉZ¤à­ ‰À‰6s.Lq曆p1ƒ.fÌ?´iÈÓ±rƒ0nÜˆÜ dÆ%K°5‚êIKG<Ž cDŸ‡ ЦÈ(‚짴€0 aÜÍžÎP²zò¼ö€"P¤K<©qª«…µW!tïL­€ LƒuŒ;xßU¬ß¾ðz¼Le”Ä+|¶6b]ƒ¥öÔÇýÖ†hÖƒûWÇÝS9j–žÊöÕ„YÅ %š¨ŠÒ šP”@eå×aEQZEÙyÏÒRŠ‘âbš¯@4ÀWKI¨€t*é0ö!;ðì2‡åÚôiv.À‘—IzåEæϹÍý ºFš:åÖi¾=†Hà ‰uü¥nîA馛0×’#%•hÆbð…ΤøïêL­uÑW ÙlÐkˆ*ÚQìžòm6¢$EëÜ4úÍP„¨VÍ ï9=ìÇÊD'}kñb¾Oj²hp=åÉp$Í È?í‹Ãh\q¦ì”3ã ©H6­£MªqTVGwC:ÊQ’p5©£ N„'ÓŒEªÎÚZ +ºÍZíÊ01‰ ÁM‡ºêÊQa°ÜG“ɘöcæ^°Û›ùA[Ë1„™š¯ýƒMæ¿cÛ©ScS²€µ´T&pªé²:…®;ñþ¸¾4ü§®-.xíRÌø(¾NuÎ ÕÈËÎOœ$FËN8¡&ÕÀ•øíÀdexàIŠÅ4c‘j€³6ÀAhškו¦Ìá75?àÐíW–Y]†(]ß•§ý«l~mΛ¦RxgSÄ$€L%/A$›@d‚ Ng"2AI¬ÕôC?Ã÷xèDZdíêÒkÙ^&‚tœOC³I5ÍHe¡¹ÿªøh’¯õùŒZŒÕ9'cÖò^’¹5¾¦oËeŒ ”ËÆ×<úÊH4¾¶rRxÂÌWP òÍ€3¾½ÂK×ø2,š‰, Æ·õæP!Ö©l]£[‡™@·Dš‹W.^+(Ò/°ìBÿÿGE ²EB˜>¡™ ª Í TV3‹Ó)>쨑RO;9GK>Í\¤஥ŸÜ”@•l³÷ïKÉ燼2†‘P„g¸Nå™ sìxsµ:ô ›kè|˜K° ±ìcŽ›¿_LI@K„槧V‡¼š ì8‰îb1¤-ˆÊX¨lµÛ,ö9HÃÕåÍPYÓè9a¤ãò`ópCû¸B—hÝ9hÙ™)ªâðeJs’q…É‹U^Ÿ‚7U ‚Åž¨w6©Æᩬ`Ë!xCèÍH}Y}ÙxPc¹Ù$g‘j€µv Í1ióVû¥}9CcÏŽ³åÎæ3Sþ°î}ÙCéºôÉ©vœ˜sa¾ÒQNeÓÕ’gŸ6ò õjó¥AÛ9ºq²mjJó#2¶CÆR”/Üs +¡–Iµšø}°u¦æ†mß +¥@h;%PàBK?RóÊ—xZ×x²"*–à…íñ‰KU3åËtkNÕÌУÿMýdÙSzH+?Y¹<äOV¥˜ÿ°wƒU`а´ÏýÑ7í ЈpêÈÂIœ“‘©WEæAµwEÌâ`tse^¸‘tÖˆýI|ãµjs,½9djy <ÏVyåAüª±åÔÛ—ábçôó  y¸Â4Z;[<”:¡åŠ‡RÅâ¡Ô¾xvñbñÚ¹1eÐ(µZuñpÁtbÏ•í'ì¹rdÅyf[»‹››ôs·¶¹ËÒ½;Œ3µÌî!FpeÝÓŽ¼[65ÅäqŠ%d('Mhƒj„*kBï¿*vŸä+Æî}¾c÷c!©¾®¿©û©/½@§—YŠNf 4Ö“ÖïÇÌR´2KCpK;‘Y&¦¶úŠ™%ìüÌR’x¤ŸZÆÇSKF¸è'¯À’„#œœ@gƒhœÈb³<μԇⰠ+&®éE¯Í%ŒMr‰ú¬µð )…æà’š¼]oœ+1ÚË°ŽR¹@B%ƒÌvcJÏÆeÙË.fRwÁZù~¹=®2×YùKöØ»ô`â÷á-OFÏDŸŽ/È Æ“1¬›åAÝôþ– Л¶¹O˶¥;\*0È®.Âø»e¾Ë·é¡¾¬dîƒX×1Ž*°‰ÄÉ X5¨&p¨,°ž‡‹ÅŸVÃs‘j€»6´4is·Ü˜ †@ˆ  +ÜxÖ7 *…0å´*;§•iµÃ3âÀá/þp*ìåó`—–Uvh¹ö_Þß]ÿãÛ×ëÓc œ9Õmžçâð«?¦|ˆg‰á×æ}=):Ôú#1ŸYnë#Ç|? 2ŠasiÌ·ì@=ÖCR3×™ÄɤFJ^A7&±Ù ‡f ²È|Ûýdº6tŸú^ é¯}Q²&[ß{ QÓðe‹öåªeº/ö&Dn2£˜nŸÓ/¾ hÿºšJ> endobj -2041 0 obj << -/D [2039 0 R /XYZ 85.0394 794.5015 null] +2042 0 obj << +/D [2040 0 R /XYZ 85.0394 794.5015 null] >> endobj -2038 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F55 1035 0 R /F53 1027 0 R /F62 1060 0 R /F63 1063 0 R >> -/XObject << /Im2 1049 0 R /Im3 1172 0 R >> +2039 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F55 1040 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2044 0 obj << -/Length 2113 -/Filter /FlateDecode ->> -stream -xÚµÛrÛ¸õÝ_Á·R3Œbúä4Ž«GI¥íÌî>Ð"dsV"µ"i;¿ç LJ”ÜmÚñŒœû 4‹(ü±(QDn"m$I(K¢åæ‚F°wsÁδCšö±Þ/..? -bWÑbÕ£•š¦,Zä?Çï‰! @ãùÕ§ë“)—R¨øêË—ëù‡Ù¿á=¡€(”ÆŸ®æß®n=ìËÄðøêæúëä×ÅO׋½8}‘(Ëï?ÿJ£$ÿé‚aÒ$z†J˜1<Ú\ÈDD -ÑAÖ_/þ±'ØÛuGÇL yJ”PV)á hülEê ‘Ž³¥Ñ”1EDš°ÓÄüA -ÄÂrdHlš2’“DSÅ Iæ{q‡ˆIŽNJ5á:å‘‚Pæhb‡hH¢$Cœ@9ó¡l¹a[TÒ8ˆ–•¹_Ô¶éNUS¯0µLÔP㥭AM¬;[WíniñMÇëbS4õBI™‰¿•+´Cǯ-³Æ®¿CÐø€tv)jxc³2Pm³¦[Ù q9AStž¶#fÁ줜”jÛUéiV%ˆà´ã¢ŽQÝiç å3Fiå ÷º“›øùÑ–#Q P2#ߎZ‘ò.¶‹@Ò3h19xW¥‡°ßä„–z ak0åÃû)ßÃG ˆ1ÓíÎ -¯¹a$¥œÝêHP6$Mu\%zÌ ‘áû©¨ÚÚ#ð мÈý²j<²©ÂÈxö¯ÇI@¼pèÞú÷m²¢ta‹V(Öq4СÅmq6c Ë@gÁä°ŠJeOMõ ø6Õ^è‘Ó×ÖöcMkŠÂ¥fAHÑ n*<±}3b#ÃË¥ÕÓ¡e”iTÔ'vIJCaÙOm°¼³P›?v¸Š‰‹'»«]òâKÙnî}´Q_¸pa_ŠæÈê pÒ”‰óöéc¶ÏËÙçŸGöÑD+Ø=˲Ca9°^®†,ÿKûÜ·Å:,}!¬ßý) Š”&Þˆ°>Ö vX΂/>;“¤_¸Aßæ'ŸËlùh§+¨‡Ò1m24>+ÞkD>1hºPd…QCo«,(Ϛ̯V» ƒz½ ¢Ä´ÒRŠ~ÀO;¥:-‹KßÀ«îtðÙê`/·«¬]‡8x*ì3NèGîëÑ„Â]A0ý?”µ†9Íü‰Šœ’!Ä10ôC²„†Å¸/ÿ’žæÝ`xåÆã;÷;wól¿æñÍ©±YÂjŒÔal¦Ä0¸"9¤þúÄØ,ÎŒÍ}ÊgÆf s eÆ! 7‰Dï‡\oÜ]7þÍwWX¸Ž O‰s¼Â¥ rØÚSÁ±Ç¯Va§„†j=-å›/@ßÏæüÊøGî[þ¼]W[¨6n†8h»¾”è4ÞdˆþÝ¿ \øÜÙëþžJÀÄyŸ8‡?tÀ¢ôÏÌ?VmÓîöDÖ6«­Ÿ/O5í~@ýPˆþZö 깑¼_+{QßK˜a¾L½¿ÎnæW·_Gj x/ÅPÂâ -Èa6wuªm`‚òô]†¡„Õ_0˜ëÊ '6ܬ«Ö5  -÷á$†•_¹:ÏeU6žÁÚŸñÅ vp -®íºÒ_ƒ¬ý>  kžv#ó®Ì—#qh~PÒ«hÇa×Íò“ÝKpFÔÉùîÕÇ:ݽöXÁ!ÿöå­Ñ„ÆγíFØšå„j¸ûø~¬œá—¡„¶ä`Ÿ]Ã:jÞ'-㓦‚"ôAéç´™N0Òl¾ÀþF,®ï>us¸ÆšTËs2ìqŽ„-b­ ûR<¶¡[æÕsyÞ0à M'ÁÉš)¸åØö ]ïûogèÚ–yQ>tƒÕ÷° lÂ8öšnȽ—­‹€Ô–¹ý…R^ZÞ‡u_ -"5øEüÛçùÇÙÍ·»+4÷böyþv­Xt÷ë™?š‘1RBB³RÝg -((êCëK ^ÙDŒµ»ÌI߇ÖT•_,«Ívm_ün€¹­—»â¾;SvP¸®ýí‰ øb¯GLO¬±}*ÛWA.OÖA°=ƒhyãFýŠtÚD’³ÐS¶»Üµ¥·R°Õ¶È¥à ƒ+ôY1öHGr )M`W‰ ㆠ-©ßö¦E~ÞN];„£µšîãô‡ÿ)ðúO© Xü„¦šƒu -e\»˜Â=ªÖ±ìÂkè±endstream +2045 0 obj << +/Length 1826 +/Filter /FlateDecode +>> +stream +xÚÝXKoÛF¾ëWÈEÌÍ.÷}tb'u‘(®%§Ò‰’‰ðáòaÇýõå.)RZÉŠ^ +8¤†3³ß¼I¦~dÊ:ÔS©â˜ðé*›àéþ{?!Ž'蘂!×›åäõ;*§iŠér3¥VŠL—ë/³7H£3€gó‹W—gAȳ‹››«ùåõpÏ10 Ƴó»‹öÙÍ™gï¯g_—¿N®–½9C“ ¦Æ–¿&_¾âé,ÿu‚ÕŠOŸà#¢u8Í&ŒSĥݓt²˜üÖ ü۾ꃀq…xÈÄ4  )ÐïŠ I0I®‘ !í +‰¨ŽËünúúçN‘”XtÃ’ëx -•ŒL‡ì꘲w±U¥YQÕ…i@4’œ+ Òœ‡­¹Qú=W&Θj +¡jÒÚÞ{ìe%iÓii_,ìµÉ×qYÕQ¾Þ84Ó>É¢zuŸä['8ÝeRßgööOÌñí»·ö‚–ÁP¬f7EU%ßÒÖ³à®ÑaŒÇ+› +mŒÂ‰I¤f.Hþ Cö•¹¹:æ¡)‡Ø/˜µŽ7àb rŠà°‡J "¤æd $ÙæES£ÅðIJ£ƒv‰"1dåô…lpȦŽËhü»Èã<ÊÒ°GD)vZsÏåQ=N…ˆÐr¬{Ù ¹.²(É-ÝÓRmìÁµîØŒ­–ú۲ͩx}9!)ÒLÉÓÈ ¹Ž#×sÙ˜ÀaêÅNså‘VÝ1yT‘Ã@ 9ÖÝ#÷ShYKQ¬}âl ^3J +¥*Ä8±Ž¹½ZÞÝÎíËŸÏH¨gîlƒÙCÒ0ˆaèæEcÎ:h]Òª?ŒwÅ wÐ.=lªÖM™wÉë¢ þ‘Ô–‚¢R7ÕøŒ.w—­œ¢tlOq_¢LpÅu¼ªãõ.i[;‘¦J?%Õx:sGð,®®ì˟ݾŒèu½0]„,ž«:ÎœïßyU”uÒd;½àC&B'‡Q$0ãÝÌu5 ;wt… +DBÖrÌ]zÚCaDb‚í<ìr- ¥¥ÆFúK\—¬!¼rÏyñP%Õ~©¡PÀ” S +uUPæÉ ûëwŸ,Cmb¾Øs Î-À/ûÚQ¢§VnTÅØÃ9‘.>Lô'Û`“¤è‘Zs§]Ëîå®=r¡a+C¡e]ÇßšmÆqúób7=µí©Ì£ +j·`¤{}“F[Ž!&Ùב{ä«CD¨Ðã¡æÕê¡©|’5RJê}É/‚ò™á“e7õòªžZx$!|•E?‚ªX}÷ÙkF"ÉÕ¾üúe'&%”î¢|ö …8 ù¼Í‹B›ªË¸}w…âÓǯv‚¦ÂÔ+E:ÙíKð¹çüáQ ûìxaé”ûcn1Úé÷Mb*‚Âr\.¯oo¯o–ןæ?Ù }c(+Ã]N&f¡`ÂLýæréj—¡Û‚ØR¶ìZÚ´¯ËùÂÎÆæ+l’Aÿ ¨Ä³‡B¯ýË4qsmCØd(m/kÓ|’oMNëÆ6x§ízñYê]»E‘»©¿]=ÛÓŒ²)Éaç‚å£Ú¶þ|ob‚œwuÙ=‚^[õÍ–ž÷$;ß'L/Fýf¢ ¶7ü~·z4ðX|·}BÁ^TßMmÿ±+˶Éâ¼®Î=^$\"ªd×Szös‰» ‚Õ+µò-6‘SíΫgn£±7P‡Íœ¸mÊ"å&GO¸‰£}Íx׫׭UÈÔsßÜ‹² j8”˜aî9jh­AøÙM{yR'QêÚiTGû.H!lbçÓM7¹üÕÄeWè'zì§6‡Ç -PˆÁ'›è€éøÑ1µ_3ؾ>Ó™&ꤾŽçPߨD))黫\d_ß<².R1tË|&´T™õÝ=N\v¬¢‡È¬æ£1Tä+µÜì>²«Ýo/&&…ûžÑ¯Úã „Ý™ËnŽ ÄQ1]FDý kj`û£ÿX¥M•<ÆÇIŽ(¸óôÙóœX"-ÏÎdŸóO(ë}¿¯Ìçú²¡çÅïyö?ð|7órd¾zzœûrò¯?®î>3SëUèwl(A ´3ÊŽ„â0h1 +),=‡¶ÿµq:endstream endobj -2043 0 obj << +2044 0 obj << /Type /Page -/Contents 2044 0 R -/Resources 2042 0 R +/Contents 2045 0 R +/Resources 2043 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2012 0 R ->> endobj -2045 0 obj << -/D [2043 0 R /XYZ 56.6929 794.5015 null] +/Parent 2009 0 R >> endobj 2046 0 obj << -/D [2043 0 R /XYZ 56.6929 374.0222 null] +/D [2044 0 R /XYZ 56.6929 794.5015 null] >> endobj 2047 0 obj << -/D [2043 0 R /XYZ 56.6929 216.7302 null] +/D [2044 0 R /XYZ 56.6929 627.8052 null] >> endobj 2048 0 obj << -/D [2043 0 R /XYZ 56.6929 132.6902 null] +/D [2044 0 R /XYZ 56.6929 562.9454 null] >> endobj -2042 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F41 935 0 R /F21 710 0 R /F55 1035 0 R /F53 1027 0 R /F39 895 0 R /F48 950 0 R >> -/XObject << /Im2 1049 0 R /Im3 1172 0 R >> -/ProcSet [ /PDF /Text ] +2049 0 obj << +/D [2044 0 R /XYZ 56.6929 498.0856 null] +>> endobj +686 0 obj << +/D [2044 0 R /XYZ 56.6929 457.8644 null] >> endobj -2051 0 obj << -/Length 3048 -/Filter /FlateDecode ->> -stream -xÚ­ZÝsÛ6÷_¡·“§K|ûæÆnê¦q|‘3½»4”H[œH¤*Röùzýßo»à—áÄ7wãsñµX,v»$f!ü‰™‰‚P¥z–¤:ˆBÍÖ»“pvm¯O÷Y¸N‹a¯nN¾ûQ%³4HcÏnn¼L#f7ùÇùÙõõÅÕùåßN2 -ç?§‹( çoÏ®>œýBuק©œŸ½¾XBQjC'b¿8œ_-?\ŸŸ&z~sqúéæç“‹›N¬¡è"T(Óï'?…³VðóI¨ÔD³(„HS9ÛèH‘VÊÕlO–'íZíPŸ*"e‚ÈÈÄ£ )fBiÉ‘2¢4ˆ•TVË‹ ZóÙ/Ëw¸Ð`:Ð`8ƒVXL(m÷÷?¾:]ˆ4œÃòuF}w±Ž ÃÞßz¢ˆJp‡!;ýÿe½€ÝB†r^e»"_¬7Åúóº®n £ÐÀ?ñ´ù_uUL›U¾žÖm§ÂÌ‹&÷2 Ü4µ<]ÔB¨0Huåöþáòêœ6+å=ËweU6í!këU½/n š½ZTõ6«ŽÙÖ£›@Æ0 é#à.#£Yt* -tÂfsöáæ§wï=<'örYµÅ¡*Z’dùØ´Å®¡Â«ºjêC[wý¼:P:–ÌwKF-XÂÖ†à¨UsÜçY[à(ì¦t`D”ØnW ßg„2Q†„ê8X9~“2!êüö§\sájIÄ°ï±-·eûèST8VÐò±ª÷MÙL!"?Wà¬:MIísi’ËHí…¾0#€²Å…uw-<Ð×õ¯<M~\äŸuÞQwDü›>‹z\äµG#;‚)d xGvôq³ËÖßú\ :‹ï›b}°ÃF -%Ày;wt3|öÌ ÓÀ˜$åžÀù¶Ü–ZFwpÐ-©õ°\¨$ -¢Ð’}Œ‚C[îŠúؾœ÷Ñà ÁÄ`¹Ôõ˜ïŸç -Xœ$‘™r=¼„+¨õPͳ\Ó)×÷_åzȪ¼Þ厩âŒ}ÂôÞQ¸'¸ãŸ¼8¢´!¨¹ÉùÅòÕûËë›ËwWݨgÁdèùSd‡€«µfÙJ„îÚ9QmMßæ¸Ú•-ѽ» çî@|pî4éïÇ¢i™cÆßA(+Ǿ¬è H -çÌ胪a!ŠÃ=€4¤SÈ4™ßl(À§y#Ü϶Ûú'Ž‹ÔÔGKXˆïj×µý涫¦ù¡qŲ<·òi£t¡q»úÞ5ÜÚšzÇ#èƒqú?”ííØVïl\Ù>R©È˶¬î¨Ðnx€ªæ¨¯m V¸x—ÙÀðmñt»@ë¬b¢®Ú¬¬žtãc_X8.Hö˦òŽÇ¥vãø“ðÝ€‘Ö»Z§õ [äš:Líšþ,@%-Û–¨Ì͆…c•ƒ-X2w‰\mÆ–*îËÌã"Â@2'ºþ%‰©Cç¾5Ï™Ñçü§W×D±q ›½Í‰®j–~Å‚ã†ܸz¤/hŽõ°—#@÷¼r.bÕ‡ ·‘vÞS0U®y³ÑäˆÊ‡á™–ÉÃaVgàòÜ;k³±¬¸e[7­w³nÐjU”z¶»¯8Vò®Õï*XVr‡Îù°Íª¾ãÇ·v©O·X…äšX¿h‹c™:Øßd÷, j¿+.£Ëð\ÑpÞ„àRÄjìšèÆèºa fçbZö‹–Z€éT-U[•ãwÃMÈà/,HA Z¶0w9{uöö‚HÛÏÚt¨oGbH'Æ|È0—ïÎ^ìÔh'žtIåq‘ûntAábm iA;¡²Ï.ö>VAœ&æE[¯”éY‹ŸÈ»ä9òbu¼ãéê÷3Ò)++÷7÷ p®ƒÅÚb:±¹­»Œe–`ð+ -lÇ ›/\â$€=ƒæM‡·ìëÙ†wY^LÜ›ö±c²ß–x׊’"Ô "Ùp$Gáh…ÿ›Mq—ˆ.Î}›¬­»ŒÎm2­è™M–ã¼È¿´t¬Y p†êÂ\‰“9|µû}G19šìã¢o -ÒÜðËfÌ[;86b~ã¹$qZ4¤ÅS8CRÙdk6œp¢¼«²öÈ(Ku6¦#a1 -¾”»!eÑ ¾Ùv `M–2 Ñ¥r¶€©œeA1 =Q -7´éyOÜ,/_ûrO$Hô#¨®}Üs+¸ÏúP® -n°î—(›Q¥8jÃ`~¼ñJàùI¼¬5²V‘bÖÖ[¸V¦Jø–e§‡¤ìõr¹°K·%LnU,G³@µ%¶ P1à ¤ûˆ!„½EÒºL‚ÛÁÇ=:gÁì‹j}xthål{W âï¨x[sH$ÅbE@5ÿéíÙ«Ew>°¢vóíyd¥0ó‡M¹Æl ö‡›ÑIŠ6[†¯½*C$Ú..¿£+#¨¬a9";1™ß â?aÎk0v ß’Ù`z} -î‹Ko¨ò¡Ün©gU¹ÏBmaRÐZsìf4õüH-M±-l’h8‘A"ÛÃLÈö‡’¢Ö”ņ¾…•øºšŽÓgšuZT<ª BU”/³ -7Ngd*Z&óëƒ/Ñ(«¦Í@Ñ R6DzÍVxì4&E‚œ8Œút*a`[ì@‚†Êì.ÐmÅ \šj?¼K±îŠïŠvý])éñ•TBÒ]45ó&Ÿ…‰ À ªêSÈ$ ^ZOw¼‘j{$²¦©×´KX´Ì ¡ÑŒ÷[‡Àe«,Ë•e‰~—±HG‡ãËkî™ç í U`ª8è 2 U<Ù0…NŸ­’6DÌv”ÝøJ €dÄjhHue Ì4رRÚW[Þ€&ÂÂI}wÈö‚"ftƒ¯uÇ‚§¤ÏÓIã˜RªËä&Vë@8"Ïbwl8ß_1ø5mÝa½E0‡uôysñwê?mž¾|sà@˜;­ŸÁj5Í禇(âÙ(zQ’¥áîùòº`¶`$Hø,÷¸äøòN.î¿îfxŠ•éR*Øšp퉷qÉî›â°¢KþÚŸYëhTÙ¶ñ)`á¦e¹_»/Ð.d[”]®?Y¹J 0àÒÆGÿéGè$î/ <Ù§ ¢8qºwWÁ_ââÎP’ÎùJŠá9¦—ضŒR{×1HE ƒ‘k#náü®¨ÜY -zðu »2T<ÉÒ õ–‘!dDû}éIIÓÁ]$ì]$ݹ)MGç&;DßÛì¸m©òO¤lº9ơȸ¼[H[ ú@…ݱ¥»<¼ÿ\oÆîí @"æ¿žFÑœne’çÌÁÀÂE˜~q#5F"1ÚÈo½ž æª_v:J´£ÓQf/CwL‘ ÈDŒlÛçÆá0º¾ô=~à‹Ž”Ú÷61oô~€ÙQArQ7<#ˆä.ƒ•‘A*ä$u¿E#“Ψ%ZÛÎw[¯‚ؤQÞüìÿ ¾Q|ó]óÿ@x½÷+S` {DŠdls;é¦D¨Ç .*³¶°.4Nöò 57vv-#íÑeQ`”NÆþÓ‹‘ȃ¥ø¬”¸×( -RÊ€ïnmúb(\aÍžsðF<$Bó«Mö°Ío×"ÀÜ×p.‰ÔôyÚ›˜϶ &-´39;‹€rÛÙ'ݲ⫠->ߌlä£ï'P¢ÛNûBçݾ³õQ_á2~áã· ®ôéEÅ kwµàiÈÅÎú{o'ÜT ’)R›ðy> endobj +2051 0 obj << +/D [2044 0 R /XYZ 56.6929 388.1677 null] >> endobj 2052 0 obj << -/D [2050 0 R /XYZ 85.0394 794.5015 null] +/D [2044 0 R /XYZ 56.6929 320.386 null] >> endobj 2053 0 obj << -/D [2050 0 R /XYZ 85.0394 752.3578 null] +/D [2044 0 R /XYZ 56.6929 234.5807 null] >> endobj 2054 0 obj << -/D [2050 0 R /XYZ 85.0394 679.8301 null] ->> endobj -686 0 obj << -/D [2050 0 R /XYZ 85.0394 642.5879 null] +/D [2044 0 R /XYZ 56.6929 126.8791 null] >> endobj -2055 0 obj << -/D [2050 0 R /XYZ 85.0394 606.8804 null] ->> endobj -2056 0 obj << -/D [2050 0 R /XYZ 85.0394 575.5077 null] +2043 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F55 1040 0 R /F23 738 0 R /F39 900 0 R /F41 940 0 R /F53 1032 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 2057 0 obj << -/D [2050 0 R /XYZ 85.0394 512.0134 null] +/Length 2978 +/Filter /FlateDecode +>> +stream +xÚÅZmÛ8þ>¿"À}8¨]½ÛLÛÙbÛÙÞvŠ[`w?xeâ«_ÒØî´÷ëÔ‹c;N2@ \ Œe‰¢(Š|HÊ¡ ÿé"‘á©XÄ©ˆ$¡r±*¯ÈâÆÞ^QGz¢pHõêþêåO<^¤Qª˜ZÜo¼’ˆ$ ]ܯÿ®ß¿¿¹{sûû2d’¯¢e( Þ]ß}¼þÅö½_¦,¸~{ó^…à +ˆR$S$¸»~wófù×ýÏW7÷½8C‘)á(Ëç«?þ"‹5Hþó‰xšÈżˆ¦)[”WBòH +Î}Oqõáê_=ÃÁ¨™:§!“H2¡!'°ßY=‘ˆHØw ©XôÄ蜞<ê)\á>_þ¯JJ"ÆAÝĬêj“?†›¼ÐSPE#Â_ W>’¯§š—U*"DÆc ?6Ú‰8¤eH‘Äó"Nøª4R‰dŽ6k–!OeÐn56Nþ“öØí³6¯+;Š=…¶í¼jZ­-u½™L_ëMÖí »°jœQ ™z)_êvõ²ÊJ½ŽxrÅ¢$ )R "úÍÌì‚ñ(E»³¼ÀR%‚{4âz +.]5Ý~I“@Û÷v›µØí-êlW~ÐQí;ýîq2´yÕéÆMt«=ÕûO– Û´z?áÚèýß¹›íú¸ÝZG]m³êQ£ryämcÈÝÈŠ/ëÜn`ÕÖûo®«Ó¶â Ÿ™}ìê¦É¼5Œ…“(%D9EsÇøXå2Ž(š¡¥¬wÎ&4íZï÷sî&£ä@vò$ä&ŒÄiHuúz*sHåò +@@á1`SdG'I!F+ +ùæYÁzªÉFˆÈ {Me: rt{Œ‘‚&V +”`Ó&ºC_×dÚ6×LD*ˆ¨<{l0O&ï}”7¤n̾d¶f2GE¢ãZ-صfÒ­R3ÀEK5ÃUDEÏÆ€õ)6És¹@*Rï×Íé"ŸÀád +)†\ 0œzÈDì!¡«Ì„¸4â2ö ÊUûõ9‰*‚ØýVû¸[´‡Óìjïm=qáÛ¯§¶É!ÁÐ!/c©žQ±(5꟫¿Âža8àxlÅ,²„ Ö¯‹Ûzwón*ýI•ü8ùz†çåãàÖ@0–ïÍÍ«o‡>¢8ß°qºYíó½îáóçÀ˜P4oPÿÈ›ÕKpÑhûÏgd3§À, r ìTgÀÎS°«.¦™[íºæíÕ@~V²žjF´‘s@"‰h¯]îÓÎALˆ©ˆ§"gn„Ÿßae„SÞⸯõ¨°UdŸ´íÉÖ_²ªµp +¦z…g k¾+Ñë÷wCrëL²cÍN¯r,dôúÅLö‰6J¹”}B¥ Ù·à“zç)7‘ðºEì7ÚÜÇ€‘BUYæ•vÝ[רºòÁ~awƒ´(¿íÙ9dÑUk;lȇÆêpfN}àì•èXxîÀ5²´·Û“;¦¹[­«2}Æf  †Ñ‡»Â[¿ h›]ÀwñÂ%$.ɸW¸þÜ-›È8–ûÆ‚‡Ý®Oº£ˆ^hœœwÇ!Õiwì©Œ;î.ºã®Þ·ÇÞH¢DÈóry¢¹Æ™‡Ä벉`¿äM««C +hŸ;½ÏµƒÆÚzù¦ñ –|ñ@u9Þn&Yüȱ¦…”¹RrðÜ D2-ÉOŸ)ÞœȸΟé€êÌ™z*s¦ÍL%' Š³Kz¢™%'µT¬¨/ùïe,‚}îo1|‚ˆm— 5¶Y Çš¯š3Y;–æJ°CÒ^wsÇHo”¯à½-è¯y{¤pJ`dÀ‚$ÃØýŒ`ÏsA}"ÜrÄxC¡Î\-Ûyx¹¦Ÿ1ɼt!ç PÎFjïñ íô ñ]%VñwÕHŠ´WÂ’3â]†ŠB"*Ü©˜r&HZI”ra\tñyB¤)·Tƒ¶ÙíA ¦ãåmÉojØÓb¸-Ï9²6ûRlxÜP¤¥  ¸¢L-ßo­+ÅýM¶mŸ +Ê,¯Šon|ãÆ*@oÝ´öÍæ¨qðêöî“ÚŽµ^r|Y2‰—¬?Ü2®ÜŒ7|³“,DÇë—õ’J7o== DÅÉáŽ_Lµ ÏÌ>6]Ûíµmïu·,ÈõÈ``ÐÇ™DòýVÆèOñB÷ðãû| tåDT<^~Æ`yÖpÂ,‰Á¯—SÄ2û6õêÓqž($jD-ú%ã’'™Š5¾‚¤ 0šäº.Šúi&¯EćòóÌ¥žH„߀/¢:_iu»1&Žb™ç}I9Þü4¿gSª¿ó*Ý6'!‘ÅPÕ¤œÿH¤ÌØl‡ÝTѹñæq–Yîk8Ù}òÒÈ@PÇZ@¹UäeÞúp0€»”{º^k«±â›ýˆ£Í7ÈgKKpýþ6²½·K´¶‰*qëìµ;·b£[·†½Å>mQO‚('4Ö–‡ÍM±ãðÕk )®—P}m[Ml¡ç0nöG ÷fåŒb×Ö{7Û]DM¥³‡>†ñ¶_<ÃógÉv¾¯«Ò”‚Hiì?U&î>U¶ÛÔÌÐÝt»¥ ›Ð¯1>x ­pEWÂ!6sç @‰b|Â?˜Î¨!Ñ îêÖäEƒTiâ?×BŸ;t\µn Û€Ïyi—µCðÝž5ô×Κ³óÃÇ>Š¼m‹Y'2ǪQÎ'äjêL£óAÑ«‚MUÁ@ÞÀè´íñÎcðRâ_Ì#Êãø8ªp‰ ¥´¿m´Å뻓Ã~¡‚–7!lMÈ}àb$†‚1‰'æcìËäO=\anÕ6>Éjm±›Â®îRb5 +ߪþÏ™…¢†&—¾ôöT&¿jgò«4‚:<žûÐ> +„"†/ —=N°<ÕŒt#“}ó#ñ^Û“ÚßLÍgDxåÉùs~  |éoõÝï­½~ª1(ÚÏHÌ¡'6VuYÚ’^ +{'„¾cæèÍá,¼û{änÌ› +¼B&bí]ûäg î2<&:õ'.#Ág „ôiÒwÿøéðã.8W0ÝSwÛ³Ô”z¡ps”ÅSÑ%Tî2añŒìÿÎ*endstream +endobj +2056 0 obj << +/Type /Page +/Contents 2057 0 R +/Resources 2055 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2059 0 R >> endobj 2058 0 obj << -/D [2050 0 R /XYZ 85.0394 442.4505 null] +/D [2056 0 R /XYZ 85.0394 794.5015 null] >> endobj -2049 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F39 895 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> +2055 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F55 1040 0 R /F23 738 0 R /F53 1032 0 R /F41 940 0 R /F62 1065 0 R /F63 1068 0 R >> +/XObject << /Im2 1054 0 R /Im3 1188 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2062 0 obj << -/Length 3460 +/Length 2423 /Filter /FlateDecode >> stream -xÚ¥ZYsÜ6~ׯÐÛRUMIì›+^§ÖŽ×’+[›äCr,®‡ädȱ-ÿúíF7Àc8²][)‡`£G_”¸Œà?q©“01Ò\¦&u$ôeÑ\D—ïaîÅ…`žkÇt=åúñþâÙÏ*½4¡Idry¿¬•…Q–‰Ëûò÷àÇPDá,¯ïÞ½y~s•ÆÁýíÕµ”±J‚›7on_?ùox×0g¯n^¿»ù'ÑÞ\ܼ¸½»úóþ—‹Û{¬éÑE¤ðL]üþgtY ~¹ˆBe2}ù ^¢P#/›‹X«PÇJ9Êîâîâ_~Áɬýéª(à6R%rER­ÉB›0Q0…²è«âp%² ðž™ÞõÕÕµŠEÐmñÃC…×|ös,&‹e24iÀE®‰c¶Ð¡ŠSÁ,Ý~¨»–V¬{Ú¡¬û¢;ò÷UI›ªÈnÜ×Rû‡œŽXÒÄxäùrýq¿ßÕn­¼ç'M]Óä-ÏíêÖÞéòÌ$B"4ZK{VÚîý±©Ú" ꖞŮ‚IfÁP}F‘©H÷xœoòGšÝ\‰ ¢áǺ¯7»j¾½ºã°?ŵûv Íìû?"P&üO0ëaºF†7ÃWØ|èôòGI·W“×íÿP"ø¾á³±BA1³[ƒàað„¿õdåýCµÛ…žÕ€¢fõ~Õ$€#Ò&s6ñaÍ&âP©4e’–2A¾ë;m*zÂaðÔh~<Óï«¢ÞºÐãîå ”QÄ2ʇêq¶ŒÜù.Þu‘-ýü±Í›º éç¯ïø—û’8`Lvö×±ê‡Þ*; ^¶d9Jt221s>XéÂ|zK‚ñÂ’&×äeõAEfÒÉ|8T¢d™h€¶ÀDíîÊÙ/ šüsÝ¦Ö “sþÅþɲ€P8®tI£Mµí¼•Ã{ͬö¶Jù¦; lW‰½¢f_Ÿò&´ð¡gnÿõtmi£ˆ‚ÿT„I.Ø´srôÓ>á ¹Ö¨M‘P|>²0…4Ùé㸮¾x©H;}Œx¢2i–ö`™qt|É!ÿ¸–F³ä¢©ä©§§rË;IzKÔ/,*ŒÆ"wv;кŒ@ßð'?¬«Fë(Yª&‰œjλ‘ä˜P1€4:"fG´6©¦F%ìö@TÌeµïS­$.&ÛZÞÞ»¢ß͹"L²º`jSy§Éä2$?؈Ì8¾%=`%]{uvMY­E†B$f)j-'Ù_O„œéP á=‹ŠÞÉ,$ïÒB€µÎŸ’ a‚ 8÷€ÕCݾç…û¡jh\vnÎ-%ã{÷±.]„A+KEЊ|ÒPÆÎxžÁµŸÑÑVnŸ@¹-|Âè*Ð` ®ÀeU–ò±.lš¬œÝYª³øÉL(Xm‰i -Eü„yÓQ†Q'ä"Ø3È-.¤dÆþ˜O©óZ¦±s˜ëR¹ÂNùDIetd äô( œÍ‹Áz–r2 )+'5©â½³E)W¹‹Ó8/JENÊÉLæˬÁr~qGáSzY‡k!cnL—ÌAÇ5ßIÁ8Ÿ’³ʵ<Æ„™N]x€|ÙVd=mE¥î³P$ÌÕ-UʈôœÎ#yçäü¢…‹ cô‰9ÑñÏÊ0ëB¢Óšt"  z¿›€{úDÎ3nQ| -®iTjöòõ›w÷ô›Ÿ}ûê{F÷+ `„õDeÚ|C(¥öàc11/ñ¦"óÒ“>Â)~¥:ÔÆÙû¶WD3]U’1±šú/,Ù`|£NÜ®6»‰‚ÛÜf„謮ÙbYø€c{߬RðŸÁ,ö ÃØÔ±AfbÑ ±­))ýîZêà®CC*ïÞÓ›/B”&kD-ð©~@ØüÈ¿Ûû®·ñ ´æô¼åÐÓ“ÕdPÕ8Cc­èX°ð8¡MÃû¹o /Q•<çÚ.¾Õ}m ¯x¨Š=qÙÆ™p-1œPuÓÛÅô$Ü"F‹{¨lC ¦§+ö¶yF+•5“×°µ:²@‡ Ìît¾‚”%(6Ít'1S Ê—­Ù+öoÞ¾…õ¸‡$'V;þ\S¿ï˜VóOóMO‘æ&™X¢\ -£œ ø ©Ó;ã{sìy™ s4ÕÀ{miâLÏ ûI>ý7jÌYŒZä,†Ïm¨ÝÏþX•Å¬X™àý)³pz£ÍlµÿBeg=ÈðÑŒ»,¸Ø‚¡µóÙ亡áÌD+†ºÍëõà-ÿØFIÇ¢I¥éüÖ8 Ë÷¤Cœ¶¦ -Ï/ÕguOèÙør -¼vj^‰š¹Àó¥:]'™­ãšèÙIf8<ØEv;ìÖ¬hÛÆ)¤RÇz€ºÉ^TÍZˆ%1Œw—Ë»sc+õj›õ–ØÇR9o Ž‹M}pâCÈ:‚’ß«"×ÀŸt‡5½6ußSN‘ÍÏYÆ6#†7DÙìòö ]¼É­í½Ùš^–ß fÑNJª8qY¤íC†LËbßFa@g„€¥íW‚~qÚ¼(ŽªI5–ËÅêÙÅI˜²35»òØÎŒ(š¾Øâ¬å©±[Œ/¶[|¾é1/¾}eÈI¡ï⇧³õ •ö>” ¸u“»†Š§Âê5W’M•s¦ˆ ™&×ÙvÖäÿ~òåJ„)Ô+—Ré0ê̇&⹞0Ñg&±ò™É1‘š¹Wèo>Jâ÷}wþ\žG$i5Iúä<Óé‰æEØ\’ÍNtWQ†é`ŽX‹ƒÒi_¼cûÞ„ëf)ÌS;š¡ Ž‘¶ aïzš{IÈßt,|Kz”ÃJõÅFª]«0ÕÁoØ„£b×h̉j‹‡‚ŠÇIÛŽ¸}ÈÂW |ðœÔ€åZÇYÄYGþ»ÁSI©•ŒÜI)pÑ!,@Ãèè"¾ |F š¼üa'§ÏŒŒzŒ~Ü&Ø'Ư3`s »v›I‚W¯o^ÝRi`!Ö–@·ùŠÑ®ê -þÚ~ÿêݯ7Dœƒ.Mº B öË”Ñ.à&þ^HôætÍËMÃY„$ô“5¬L+]9eÝÜöG0Š'' åévø-4ê[Ì3‡±³ŽOÕ5“½Ë1ã Pê“î°ÞÛ„Kk À˜±É˜ÛÚšµ¿ -i>ƒ‚)‰³…ùOZj®Û< «Ë¯qc›aŠçN^ë:­æËSÍyJ…FÍÄÉÓX:å:¦ž /ºë -ßO,Ëõ@Î#i¬B$ñÓçñ\+R `ÐqšÎOÄh*ÓˆÐT¦b¢ýt&S±Ô>Îr*’º.Ðè’+(*ñ þ‹€À -0‰0‹•!TÁò¿Ñw Y«òûX’ÅÊk×N×ËP ¤"& ê«@šÉ0æ›`Tø㌢° £¨P±ó–æQ”ùõn¢¤™4òP߶DÅ¿@1w ×pÈöE´I¾ŽÆÄÍ.²‡³%Ç#Qì§×Èz8Y†gc?®àè4ì”/Ãܘ²Úõéá½½ w<"Æ‚ÄX0ARÛSLa?Çqí’E{‰3¾$û­¾1m3®¾~ßú$ò,Ld&”êkׄéÂÜË3‘hfѬOõìúì§ÊN<óFšÉõm—cÜ91¹^üš=cžMÏ®Î__<ŸÎdž+“¿}{qõüò¿Ð׈€„óìõùÕ‡óW4övêevþòâýô÷ë_Î.®·âôE\¡,žýú;Ÿ,@ò_Î8SÞéÉ#t8ÞËÉê,׊é\©ndyöþì_[†½Ù¸tL¹tÌ(c' S\‹ÿe[å¢"Üø¶|2óŠå.÷ÇyÑ:¼R³[1d5s‚iïõdf¬fVônHª‰Ìk-ñŠœeÒ:9±ȼ´ñŠþƒŽ”ži“ $„5ÚÂ<çÓ™‘Ù»øÿ +þ‹ìrÛ–ÙËýr†y¸‰å–9í£®&‚¼€ËDýv<ýN+qà§Ë•š<¯áŒ“þ1ãYŸs<¦‘=CRÁew«$sÜÑ1¯ïÊLËÛ¬¾o˺¶ɚ»z³\ÐøM ï¦ i¤LTóºúcSÍ»e6{,Û;jµwôŠÛ‰ eΤ‡6)p¶!š¡˜9(A䉄„úq:S\dE’t~·®ë¶¬>âr°=å™äpþí•Â–•Ý¯ëyh꬧3¡³MUáÒ8Rt3À[2[Ô¡©~hi8TwE5ÔiÂ|CÊö‰†ðÜø]ÕMZÑ<5mX5?COñN hÔ$yÿã˜S xSgœ[™@gýk.áŸQx¾Î¹Hôñ6­Îá7Îe¯ ºÅrYã®qÚ zpx«ì¤Ûƒ©ƒèÄå2| iq[ÓdhæÅ=pfQ +«.+Úå’í»Fnàw“¾£~ï+pjã!Îvñëë"˜sÎúì„´~À@ÌÑÀÅé3J1‚ +[ª¾?hÝ÷Áœ×*]/8áz_{^²Ü;3éïx WG4"—êíæ-Ë­ß“ë}h7eô}‰wO2öWå’Yà¾'ãki˜¾ žÅm T‘å¼^Ý/CôçØ¿_'sK[Ö÷a]`hbY³™ßÑE•Í×Sá²P´S‘%>à‹õüS€6µwEKË–%xi•¸WdÀN³<‡“ x +Àï}½n›óípÆp°^ŒßÁˆ˜r§ õÀ¶KŽá`î¥dÆb˜3œî­´&Å}Âë”>{¼ ÕˆÕ²äÂç_¶Zå¤ë% ȲK°ç(»Ñ=¦IÉ$ `8¶,0¦ë¨H0–íø ó~v¿ŠNî踔CCŽ, õ°æ6kJÊË8ÂE4쇲Þ4D¼·_] „á‚*æz˜OvIu£ñ¢›@ýuh‹2¦U‘CD±CkàÃëk"€žLâ¼<\‡òǤ~ÿJTøî’; åF¥»ÓùQG}êa_-âLxÛcu°_Gs¸_ßk,"î÷. ÜðÇX‰‡°nè½j³º!;ã²°>—íÁv§Îáíe…Ô_PMê„n:ª¨œ(Ç2k„:½eG4²å@=r¥nùêçfS.S“B ¦uCƒ\0ññ´wD'ô—ˆ¢ú>¥ÞœYȽ»—X1¿ ³[û¢Ác€I Þ{J¶-Ñ¡pj€´Y•7é^ÕERÍ¢h jÝÆ”·^¤ã`ÌÆæfTî½í ìfLwIJŠO»þ}ÆÕé¶n÷æá¶Ø,“<”á‹SG³c€y&¸ù6Ù±µ›¹¿S#Š+Ž—ˆ$À4Ö~!5VX"â`<ßµD¤‹ñöÛ—ˆúœO$Ë܃^ò^…Hé]…Û«˜7DzôR5‹ð‹Å",_:8qšÚrÁ\‡Z·i¦ Ä‹ª 8úìòê9µ<}„óS@õ°ÄGa3V\¡(b]¶J–؉E,ø®Ã*B>qI”˜dP¢¨>vƒ±Èe]Wøݴ›õ–É2M ¤òR÷ ê«Lô;àtÏê9s û²gõ]¤”X¥”̼¿|yuþêýH0›€G¾¥wã%êOB:ÃÔž÷¶Ïy ûJ@*÷±*0IÃÉmáQ&£ÂÁ›´2U eª@ÉXliƒ%­¡Ø3˜ø6a pôs’´ +‚±•®Ë’×Õb>V±°ƒè˜ˆv¢J„6Ü´¡X…-u*|µœÄ­>ÕqàÚR¥ëø燷5!˸âô¶ÑȶHâ’q ÏýÁ¾/ê¨øy‚„JT‡Ynñê3èN¦6ÏŽ« +@IaEó´ªzT'TÕQ%U]^]#H¥Œ®/Þ½>Àsx¿zgóÓ’l©FD¨OCÌ6à‹CYî6 8õcuZIpS9ÀÆâ`¨æ]`}¥7[(î”Þ„jAÕ°˜]=¥YØ&åd;×ÃÝëq)b»LD›j[Xf[¿êE  +DtŠRļ¹zqùòûsTúõ囫Q#)æº{^îÎm¼©Å X©œqÐr—øÔŠúqCá_l*Ñe|Ëå„H0ÖÖ55¨ù™fÛ4¸Í|]ÞtkªnÞKj£>ñÖ8‚>R¦²fès¹ß B›çøêÄø•Šøfˆh墫?–=K‰Ç¸è½f9&ót|ÂO¤öô9_¬ÊªlZPG®õ]¸M²W#¿.ªM±Q®0sEsìÚ¹œ)”s¾µ”¯þur÷ëknáuëä¸ïÓ0?8%¡Ppx˜FI·‘#²ÿ’Cþendstream endobj 2061 0 obj << /Type /Page @@ -9184,328 +9174,444 @@ endobj /D [2061 0 R /XYZ 56.6929 794.5015 null] >> endobj 2064 0 obj << -/D [2061 0 R /XYZ 56.6929 420.5648 null] +/D [2061 0 R /XYZ 56.6929 243.4864 null] +>> endobj +2065 0 obj << +/D [2061 0 R /XYZ 56.6929 96.2114 null] >> endobj 2060 0 obj << -/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R >> +/Font << /F37 803 0 R /F23 738 0 R /F62 1065 0 R /F41 940 0 R /F21 714 0 R /F55 1040 0 R /F53 1032 0 R /F63 1068 0 R /F39 900 0 R >> +/XObject << /Im3 1188 0 R /Im2 1054 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2067 0 obj << -/Length 2757 +2068 0 obj << +/Length 2295 /Filter /FlateDecode >> stream -xÚ½Z[oÛ¸~ϯðÛq€†Ë«H>fÑlÑE·èi¼ÀÝ<(¶’•%×’“fý^­»“ö`Q ¢¨19œËÇoȆd¡ÂLó…Ô LÄb½=Ë{øöîŒx™‹ tÑ–úuuöËoL.4Ò M«»ÖX -a¥Èbµù²¼üôéêãÛ÷_P—¿¢ó ñòË^~p}ŸÎ5]^¾»º†WÊYB¹/?^ÿùéíå¹äËÕÕùÍê÷³«UT«­:ÁÌèôíìË ^l`¿ŸaÄ´‹'xÁˆhMÛ3.œ±ÐSœ]Ÿý7Øúj:f -.”'‹ ÁãtÂ`a¸f:Ú‹’1{y!c®u‘Öµ³‹m–é6ë/œ„älÑ} BêÀZ:#!DÒQâz—­ó»g§Fó¹Æ&»KEÓRœÄ^¾¿s}ee4ýå7Ñ™€1¤uJ—g¥:j0Š˜“;©Ü[ 6zü1Í6oN*ãšy=ªC‚$¬Òÿþ㈄ -õ"hlÞ£+$NN¸½%5ã÷ eflšÂ/:[Wå¦8ìȹäóD©ºQˆS¥º:ýŽ…754Ž¦6½ùÖw7•{ù£íáË»jïºöçD-aö¹©»ò·þ÷éf“m ‚¨ËU˜ë1-Ùˆ©âHS­½{ʪÌF|Hø/ô”…u]dé~bU0Êâ‚1XÂЇwÉd$‰€ô—óaКŽ‚ dfüšù¤³iÂaŸ5CHøΩd†jt€"ATWë˜xÆyÊä]Ú¸Vj -Ãn“6á{ê\î…+÷¼õï«ë÷ï.êü¾Ì6þ§u^Þ‡GÝ àE•TÞ“`oø¼mÒ_ &ˆR"`—æ{³w çeŽ5ìK°Sx/» j4èx‡hD© -ŒÍÃiÅ´UÛmZnœ×ªÇl¿Ï7™G¥´ô~nA›ÿEÙC¸ÎxE^úîǿƱLc5«S*Õw+“”v´ê{•9¯ -4’J½ÐÎ%ÜŽîdË¿±À©‰OD| ›Xݸ.³ýÙÆX@±^@½qè–DJSÙE¿ê®‡P&Î@ 2í}%ȉÌnKÍø?H 3{¿¯³fèÛñž›£Âƒ°0ŒÎ+¥F´í†¤²\tÕíFe$l’Ð2ùnžC÷{ùnúB˜¶õ‰Ïÿ ½YŒ¤8Ð,@r°Ç º‘6U’z32Χ "¦´iÈMÚåe“íˬ1±K —u}ت:•˜!i¸Â|B´¤f"H ñ§‚`ضg•R#ÚöQ誻z0ã8lhíôà8¤‡ùž¶ÅÚÙqì=f‡ù©ÉóÍf„iœÈ¨e±/Êþ‚Œ ݺà_K …(çÌnµw¿ÅŠ¹ 1{‘/Jä_Hž`Ägó Ò–šN(õ³ âäÒ&Eh 8Õ âLœÐ¿ë¬lÒ&¯üÖÝíF8©êsÒÿøp$D!ØD7?ûyóßå$ê3EœšGý¶Ô4êG)3½;x -ÇÀEÛÐošâfÿ¿7€/~¸¹é/ƒQS8ãëˆR# édì¶X“ÞJÞZíë^¥ÿ’C‚úXô² Ôƃœ×E¸;+ƒ&”Ó®çGÙl±˜JõQÂØ)fD’“[Ÿˆ·I ÔG.ò«Ç|㘠- š ¼½°"³£Òp~ Ÿo;bÛêÑ\3ÌýÁ53ùêØ‘{‹Xe#]@¹Ò…œsòtj‚ÊiÌÕ;eåéP}ØíŠÜ) œq½4Fã¸I7Řù1â´k~£ø}é,yc<·Œ´Ò¹CØóãê),ÙݸÃ΀Öm^äÍó9ŸÆ€Y©“ÇOm©\ R}\I7› P‰÷4¯§”‰æb^ý(5¢ŸR&R¨î.7&t™t”eödb$êÍç~¥eúÜ¢iÙ Ã4NÔZh™bóqC$Ò,2Ö—>üß+­ <éÎɘ£Š…§'Jü¶ÔtÌE)G£«§ÁÝ6\Íì¬QjdÚîy=G,Ñ´;ïÛ¼Þé³ÉN™xnõaï‚¢l\Ç6«ëô>3i­d)P‹¼t` -_Ý]tõCg ‰ZÃþÈb4ŽHðÒ½1y¹ÎŽ£ºMÉ OoK*ÒPñ™®AÍ!¦úD Ú–šñ`räÜE_׃ÆæNmvÖ(52m׃x0ìŒy¯³rS÷¯Œ:îƒネûyÝ…eãšÇ´ˆòöæÎô›Ý̹YØãó¸-Òòëñ:jÚÔX¢ãSÉÒ’š1ury^?eû±\•Èùy£ÔÈÄcSŠ’Du'neKÛÜ^ŸpÁ8f "MÁqê¯DÚRÓ¶ˆRϲÛÃýÐ )àGóÓF©‘y»q§Â€Ú‰WçÀ;û²{kiÕ¹‡ˆAáBÉ„™)4â’¹ýQãmx›p#Ìí:­X«³m¾®Š0ü±Nò£ ujtdZ”ÅÛÝw`¨ãMü-ÏÕ_—|úpu=²C€$p|Š9Ç6 ¡àÞî -wÿMa=ÀjÜ é¶Óc{ÿf™SÃÃfXÖžw §æ©ã=Ѻ:7…»X§ËCùwåN†ÖÙ¾q}Î2ЈEŒUl„ÿ‚èñ`ÉÎ@˜( 5!íÕ„Þhmår˜cƒ;*Y~¬šÜa¹w$2ü%4òrwðÛ­z¡ËbÙ–×½øý§vo©gŸk [R))Â9´êª?yê¤ïÝ;»4<~5æ/âë‘0«#r¦‘èhþd!_»—6µ {bV÷@7âʶ´l?üCýcè¼¹ev4õ÷qL óGm#P€cJüôßÎÿFKà%jªÆÀF˜&A)cgà$}ÕSH(€ž¡îÿbÚÏendstream +xÚ­YKsܸ¾ëWÌ-£ª/‚äÞdKöjË–\•Š×Š¤4ŒfÈY>¤(•ŸºÁ!)JV*©9àÕh4úñuƒ#~bŒ«X/ÂX³€‹`‘îŽøâÖ> ¢Yy¢ÕêýõÑ»*\Ä,6Ò,®o¼"Æ£H,®³ïË“Ë˳‹Óó¿¯dÀ—ïÙñ*à|ùåäâÛÉgœ»<ŽåòäÓÙ†R+D‚[:×ëo—§'Ç¡^^Ÿÿ¸þýèìºk(ºàÊÊôçÑ÷|‘Á ~?âLÅQ°x„g"Žåbw¤Å­”ŸÙ­þÚ3¬º­sªTÄ‚H†3ºbNAÌŒ’Êé¢Lvyf¯Äj@¬à\H8ÁRå&¯‹¶±Ú‘Ëv“ã=dH¦…iG·Kšû9¾.DõøœËmŽœÓúXDË@>©ê¶èv‡c5SÚHb£/¢HãÍ¡Ër(­Ê¦ÛgYê™ +˜Œ$Âʨ÷™b¦8õ 0`¤ ±wúÖ)R\¬±3¤íÚb[´Osjâ“ z*«}S4S°0P˜)ˆn% ‹„Œç°B€à2ÐÐÒ†,Òæ곞j|sŠü¾Ê~øÞiß»Ãο±YUã!Ý=yQ‚ƒpŸ +¿ovIúëûܪ3ÿµÉÓ:ogÊð>ý ÷3'€ñ¢(ô…p¾-¶sx ¤dý•Ú–+‚—ÆPÞR„a5ß»¼êÚ·óîfxƒGF&ðD—í_æ +ÕsÑ”ký® ÖºÈ›¹ÆS®W?åZ'eVí²üaŽ©fæPÄ÷L|ÏÚÄZüÇ,Š(!PS˜àƒáôlýáêüòúüëÅL!6†’aÜOaHZkÿ¾°#¸/ý•~Ð6ÝÍ®h±ˆvá£:ß|´CQôÏ.oZâ˜P›å6Í–ž½+K¡…ì#…2ã3l¬fHˆ¼~„†'³ÕtÉqî1ýd»­íÁF‘H Ôô¶ãð½ŸM+×fŽ”jzX¼!¢$Ëœ¼Ðu©Hpß®zð ƒwÝMzHÿX´ëÆnzç’Š«Ìa”gE[”w8Àò6ø­ª/K­!kyèF^Û·ùsÌXŠÄ¤ì«Å6)Êgd͸އ‹cÇgÈõq¼CÅåþMàù£ðý†‘ÖûY¯uÖß)‚²-B—ý;°i”tl[ì%þ4;èÊ |Áu3ïv`ï†ÆØâÄC‘ÌDˆˆ ¸}-D Kj¢3lNûp‰=rNìÓÓÌöËŠ¤¿!Á­ÁsZ„Ç­kAs¤‡•TšE€ûÈÆTˆ8õY7$>û€*R2¶u9ª|‡Ù¯IÛáTïòD´ÉØ nhe[5í¬±\­‚xÆ܇ÙAÙI²*ôV…ÉŠá¡ ÷Ágלê{~|vÂ]uî#T¸‘Ño2±‘±G}|Ë;!+lohlC…§‰†ª&[Kq&…Qc²alC—‡P]ö!¦åáÒR p²Åi§rí?¤À’eðÚ³K ¬±?‚BËÞA¡[ÂV,‹ Ø>Hi÷)Å­w¹ürqòå »ŽÎùT·#1¤c|Ö_OÞÔ¦÷“™jÆvû4«¹/† ð©¶ÚãW)@ äÞçñ‘íb&£7™^©èÀ:¯~ZÞ‘å7ÝWeÖžŽIáv’“ pšWEê0ÙÜVõŽžåJ‚Ã߸Tà7ä>¼ì' ì4oz¼¥XO†0¼K²|ÞífÄd¿-<ÕòâÁì~Ñì¤,Œ³ðcdaú:tu:gd Oì¾ óFƽ`d o›7Å7–ž5)¡òß²b +{˜ÇWgï;ÌÉÁÄ~„‹sTPåò×ݘL;x3ÚòÎØgI8ÔcxŠCMÙ$)9N 8QÜ•IÛÊâœËé¶ã0 +Z¬ÝlÏ¡´IV(HѳcÛéK97°¥œc9=TÊ´9ðž0¸^ŸÂèx” B=ÁœkŸö´ +á“ÖÅMN .üBåjÃH8ér€Ýµ¡Mp¾ýÀñ“ôK‡Ì²Ö–5ÔÓÄÚE ÍÊX‰9´sÇCQöi½^¹«»‘-n•‘£S`ÚbÜ”œjßâm“$(Æ¢¥«ˆ>Á¦ÙPX;ûtã·Su”Tn8&˜9±|µí}Y=gôܹJà1c?oÍ<›yï¶ÿó¿(‡‹tÈTÉùy6o+p./”U<¼Ã§¢÷ÿ·<—ý?=¯±endstream endobj -2066 0 obj << +2067 0 obj << /Type /Page -/Contents 2067 0 R -/Resources 2065 0 R +/Contents 2068 0 R +/Resources 2066 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2059 0 R >> endobj -2068 0 obj << -/D [2066 0 R /XYZ 85.0394 794.5015 null] ->> endobj 2069 0 obj << -/D [2066 0 R /XYZ 85.0394 108.4894 null] +/D [2067 0 R /XYZ 85.0394 794.5015 null] >> endobj -2065 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R >> -/ProcSet [ /PDF /Text ] +2070 0 obj << +/D [2067 0 R /XYZ 85.0394 691.7632 null] >> endobj -2072 0 obj << -/Length 1863 -/Filter /FlateDecode ->> -stream -xÚíXK“Û6¾ëW¨*©2„ñà¼l•<3v&±g½–²•-Ç I,S¤,Pëߧ)RâHÉæšR•4ýBlLáÇÆAH˜Çã(öI@Y0N7#:^ÁØÛs<^Ãäu¹^/F¯Þˆh“8äáx±ì`IB¥dãEöiòš0F¦A'ïn§÷eìOf>Ü?Þ=üý€pP:y?{üuöi¦1ŸÌÞÞϧŸ?î­8]‘F–¯£OŸé8ÉQ"bŒŸ¡C ‹c>ÞŒü@À¢¡£ùè?-`gÔNT£„‹èÀgC:ð#Fêà‡©ÂîJ½ßfI­Ì†ÕÅÄAÀ-Ë¿Å1Øv¦ -Õ´«"[Wº&ê{²ÙŠ¤Õf}0öX’eNõ<Œ$CŸÒÔ~XÄ #ì‚ÄZ•™~õ†‹Ž€YPÐ*¨Ó0ÏÊÃÂ@›ÏnÊäD¥•ýfÚùd ];:¸[3à<ì ~2p?”°BæxÊÎJüd%jT†xÎëõf> s‚:Xk$tteû¹n­ˆ‚ÑÉb­ËÏ!áTHC[' „[?YrÀÆbáåwPg<ÓÕ€Sf¨wÖ0==1ÌŸwÍíNíÔWÇþ=«6I^º^ž~)“ê©ñ¯ºåÆ©_Þ>ÎÞß;·«6êÌtÿ¿—ú– …°WküÿºÏu^Û‘`bt›×yU"ãJÕ[u3×ìyµÚ} ®ð›®Uú¥™‘ÔÈsÇ6I·Sº‰Îݪ½m¤n‰³82¬ÕÒᘠ³+¶ƒ–µqÀ9¨}ã´ÂŸ<° îÉ3œŒ7Ѓ̎›rc[Ón´§t„e’ÚÂVÂLŒÙè ZY¥Z妪﹮Ýb -„Îðâ®$Ä`í¾¿M,ú”©ªßwÊE‚³ ´ž×ÊØY2·Aٺ଑MÊvÉ4)QvÓ®Êß)yÚ šÜâVR_TåÊÓu¾U®†Bg7ÝÀÍbX¤4ßhòñÍ-œ>QjCN€ú4„Í^׎V9«O¤™4c§o1„ÊšÚÒNó’]È8“Í—Nž.¨>AÅ®UÁ¶ÉW6Òp…ÎÆLÊ0蓲f̹—I‚:;õîq>¿¿Åv^â è†"@¢ > &EQ=#É -¤ûÃëä›BÊÇó‡·7-ú/÷ÿse†ÄÇvÁ“$&ïºLÃÆí.0ÕDDpŠ}óðn ²a$b,û~L„ˆâ*dòº\XˆÈB¤å2«¾RuújY¤ø!^.O`f_\– å:¡—]YfAØ—a¯›SÏêÝœ•™*ë|éεL-“}Q»“Ò%Ú$Ó—4Æ$‰ ®¼¢±×5\FÚ_ЖÌï2’8ŠBÀ¶ÙƱ]$ŸÄ’ Ç`·p‰õÓê -ùÑhóÇ Ÿé ögÅÙãQy‚#"à ¸&P#1ù¢§ÖàTÆ!e]4GËunžûp& ¾ý¾Až­¼ÐG§PeZÙ”i{ö܃ïOïg·Þû»{FNÛH1T]ÂSãq¥†¢ÉÆ•*m5ÕOC¾&¤$jª‹®ÖazÙӦ풣mwù7WšöœMpBEà_´GËtf¾«Aj¦,”=‹´žÆ⮧™^µÄïÑÓLÏzšiô<ÍžÜÀO;=/<&á:ÊEÜ?7æ÷÷è´³wóW´܆±È²›c‰ðç@OP{£Ó“~pì™Ò¢3‡i§ vsÌÐY»•›«uå\|ýëÛùõma¡óÉÎiÓb.Ì¡a˲¸¹øeû2Kʺpƒº®™l¹ßzÊ&϶µÚ&;¬b¡¥‡ú¦šÊ*WW9šÉAìªM¹[Úâè6Á@{¹²Ô½Æ„eV]–åwóª±ÈŸvÉÎe)W¬›²V7 í°­«Õ.Ù®óÔ¥À­Ñáz¢%°bƦ¹7¦ë¤\¹CÕnß`ïëý±ºo‚ЫùDøac5Ÿ?¢}ä§pÓÚ•YÚl -"=änê±ÍNg†IèÇ!& 3oµœG/Ô¸ª¬­˜U„}y}¸èc(ÊüPV[ëÓŒ" yËPŒ# ‰x -É! }1ûw.<9¦ã¾ÍMõ“÷„[ºj -‰bÙ¤Vs L•y@Ø™ˆóK¾$”`)dÿÜ §ÈýllŠÂ|å-óB À†‰áŸÂ~¹ - Áù¦ÉitŠ©¯b ÂDnrø âvÑ!t"ôp[íê`> endobj +2072 0 obj << +/D [2067 0 R /XYZ 85.0394 513.3346 null] +>> endobj +690 0 obj << +/D [2067 0 R /XYZ 85.0394 475.0295 null] >> endobj 2073 0 obj << -/D [2071 0 R /XYZ 56.6929 794.5015 null] +/D [2067 0 R /XYZ 85.0394 438.8551 null] >> endobj 2074 0 obj << -/D [2071 0 R /XYZ 56.6929 479.6712 null] +/D [2067 0 R /XYZ 85.0394 407.0157 null] >> endobj 2075 0 obj << -/D [2071 0 R /XYZ 56.6929 343.3873 null] +/D [2067 0 R /XYZ 85.0394 341.9916 null] >> endobj 2076 0 obj << -/D [2071 0 R /XYZ 56.6929 280.1555 null] +/D [2067 0 R /XYZ 85.0394 270.8991 null] >> endobj -690 0 obj << -/D [2071 0 R /XYZ 56.6929 229.1103 null] ->> endobj -2077 0 obj << -/D [2071 0 R /XYZ 56.6929 196.0344 null] +2066 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F48 955 0 R /F39 900 0 R /F53 1032 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +2079 0 obj << +/Length 3927 +/Filter /FlateDecode +>> +stream +xÚ¥ÙrÜ6ò]_¡·¥*šysb;ëdíx-¹²»Ž8ŽÄõ 9rlË©üûöðe9µå’šFßÝ :àŸ:·I˜ä:?Oó8´‘²çåþ,:¿†µÏ”À¬Ðj õýÕÙ£g&=ÏÃ<ÑÉùÕv„+ £,SçW›·Á÷¡ŠÂ @//ß¼zòø"ƒ«§+­c“_½zúòÉóÁ³ £(xñøå›Çÿà¹W¹ÿøôòâÝÕOgO¯ÞÔå sy9 6ÕoQ¤¦" ê†_?ûZE1.~iÊŠ'[8Α‡žLÁWðù‘Ë2:÷LGq8ìêòB½ãÉõnÇM/ãÑ¢é™úÖ³¸ÖüŽY†|¾å•®ÚUeÏcæ~†»ÁNz¡=k”?Ϙÿ~¬ˆÀëf<¦÷¼ò´jä­¬6}]ÂQšk¡¯ †gŽg¬*±NƒgÀŒÉÁØFë¦ë `4°Ç•Ý©î‹õ®B ļ)H)MdÒ$¼ØW{  ãçíi'`kAPl6Õ†‡ÀARýxl*:[‰ÓLtÿQÕ—PÝ7aÙ6Û[É5Ø–µßµ‚û¦èycâN‘ÑŽš4 šöD î *ƒ²hxPt][²”ð‘©Ü ÒLeˆ«]U²&ôüLÌ",È, RÆÇ0œ!~þJ 7ÆÕu<Ñn'@ã®N 4é0)ð¢®27T"z#üž:R²aãh¬HmC~8 `õ·2ü§Ü»UÇ£ÃiFDcÖ;i¯Åá†]‘ ºB'Þz²%ÿÜÝщ3†à‚Ö:бeÀ`êzöYkq~]ß2[ÅçÕÎ×ñÏÏOÿÍð T2ð2ìç¶;aZßÞã«ÍÄW³ßÄtîù¡è ”nÚJ¼pÓö<`â‹Í‚y­ ÅÇ(™*ÈÃf–u‰qf‰þXEÁ——+‰›Ypôsu\Wl2#†±A¥*vÝVn‹•ÊBc£üA>Ø["$‰.êÈiÈìä&cp½º]@¨l¨âÔ!dï8âth“Ôñ~õþa,P‰0ÔyíÝÿ‡zS ÓJwSxõÄ…±GÁu Fn±EÁuÕTGòAQð¤˜2LÌ5W·âùWJ§¡5éÌÞ #y<¹õ Ç——<ÙИ7úýTu}G±CAôݧ]ÏëýíA )]€œãwpSu²ÂÜêøaäð°?õ§b·»]roÕ§rnìC…j™ªà× kr­:½O28¸û’ cŒDj"Èo-7Œâ8þ*ÃMãØ!tVÚ dÒ`¬N3Ö\ß²öìg¯až³“]íä ä·_˶à·õn‘<f±qäav”ZH.ÚNvO$AêÆ4Óa®ôÔc 2Z;¥Ö¨mû @~d¹ó(?ÿèÿ ¿Q6 ¿ùã!³ÝÿBxý°ÌL…A(<’Õ å4´éM®TxÇÏÂí´ •3ŽúÆœ›{¬ÃL¥ñ‰.“°afâYº;‘hÁ—*¨Àè-)“íî(}É8\áÌAr°F8` +Y̯”ìáÚ²^+«Bpsù¹Ôz_î=TF‚¥ýÁ™n€M±ŠÉ¡ÀJW_7Eï3ÝXy´áw½~‡ … ùÙ„CoôÔ„FyqÞì‹ò»Òuf™£üÝCX€ý(²ïЄ*ä ÎS7¹Ä“­‘sÝT (gbàÎÄ` +ugd)')Zå”ð-X¢JÂTkgaLÕ&Å¡¾ŒuÑUIÌ“P³µpaä9X;Á»§IšOísð'h3 ¿7”‚ÅŠ-7¾×c‚­û°vŸ^™¹ÃdŒ¤*°Ã¦îÊöt,®IY`a]•ÅÉíÏO] .LÂà° ®¢“_^,Ûýž«˜ÛÕ$ÿ9$¼Ü4âúëÓž2j Å%{ð[îªkF •]õ©§BJà’ +¬ï‹[^]C]WñðCÝÕT1±ø`ОúégÈ‘/‡•C‡©¯âÔ—@cežðȾí–Ä{ 1uÓÃ)<¯…¶;9³v)lùèß$Kën Ü =è( »Zv6yYïÂï ¢Æ¤®•ÁÜ2¹¸:Qf¿èr0}åÄgºCUÖ[÷ÿLËœád@#‡`”ÇTŒzÈbŒËbÌ(‹1Ó,†„Ï1'ð-yjç¥UíR\0ËoyȲ¶‘‡œÅ³ ¨ˆFË*Œ¿œ´Ã+NüuÉÑ€€+§¯ŠŽÂ(Wή®ï1ÔÄ—ÞYÍÑèÌ'ºíƒX¼´ U?TpBm4”FF´Þò*Å9xFÙ‘7ÊîÓ´, µÖæaz\äën¤ùà[^ó yÄ58®µüE]JñÒn{ c)än‘ÑSás¢ ¡þ£HSGQ$§b¯[”Û÷¨ X’/å”X šH}UN i¬™AˆûÍ“W8HÙ`rˆ Ïxu‡Ù±ºOáY‡aB¢¡à !ivÔšÐ[žRvœn[žÝ‰{õóü‹æ ìÍM˜Be:å.{=1ýHN¤'&ÊÐ5 #O^ý ¯IKO;—9­3‘¹Ï” !HÕàà>,;8ðfôp›}ñ¾êd›¨0Éù*Ù“Œd;á‡?TìMUr£†•MÂ<ËÒiÜ¿òžŠ½°˜ð+iæÒ8Ž[0']EKñ”€‹ž¸k%ýÁŠßiŒgš4rqûbSMí@=Stæ’ŸUOL‰’yžÂ ¥ÍS_ì‹Oõþ´—Ùz/Ó…¼1øþd¦X0Q:¨DÉ£uµm½’Ãs- tXcƒbMu WŽŠ¡ö°I`ÀYøÈŽçNžÖ6›NZ-ÿ‘~Š‹5ÍT‚ü¬DOø…Tk¦HÈH@þJŒÏ0gõõÄiYà÷â¹<¨9Üwwbc²Âížò˜Ýhî¥ØQ–n…sјsÔñ¯qè‹tqz˳Ÿ…U”‹ÇÃÎnÆ+î@ZÓø #$fCòŒçΦ.i”¯-pUÔ~؆ºȥ9í×äd!îäwZ²”#ñ¹ˆa³”Æäaf} Òe*È:ÞŠ+Üg&HX«.”ÑÓK6Ók¡RÒ7Ž.2 Ñ'–<Ç{øxR…ùþ·Rù¬·Õ‡Ýȹ.,<àÙ‡£W|íùËWo®øg¿¼~ño¹®ò?xM[pË6ýŠPk›.4ŒUæ¹£²IËmæ¿RØ)wúŽß{z_ ¤<ÍØ~ñò·ådâv¥ì& +žòÕ2«ëµˆ8tgð‰„‚ø¶@¾_åâûavèÏ€ 35ëϸž²ÛÝj\¶{iàÊî?ùo?¶®\lö`S]nóƒ¼w8mGñ ^¹†0]”wrŸ2`ÓAUóg8vÑŠÉÄ`„%__,ÜOÊwt]|«»š@†WÞTåûŽ¡¨oæú‹´NAîÕ•4êÆËx‰·)¨q|›‚ËcŒõÎÓ¦–[ÆÁwàU®ÓO;‡×<g îÆq⺓xvõÔ1(¶o^¿|ÒÂ)ÇVª¹€€÷[™«åÕbÝq$µQ&–¸ÛÖÄ8F@Ø÷×J0;>3>˽p"¾gèv÷ÚòÂ=-3l' ×Rftff9K.tçÜíÀßîT–ù¬ØäÁzU@$½Ñz‚í¿PØ‘åBZî‹©µr÷qÎxqYÑpeÄEÝõr ð)ÔþØEI‡¢É¤éôÔ¸è;–!.“ªÂïçêB²ºVŽü»÷å¾¼Dµ`â^.À|®îâI&x\-;Ér „d·ÃfÍ‚d±kœj÷¹ ÔL:ˆήçg—¾Vê3.”6OÔ[Kõ´#8 Û¾pdžtpJ~¯ŠM_™Ö#A­î:ù(hÒwæO–xàÜ8ÃÇ<³ÞÍ{ºx“‰·¦Z3©^– דh§µMœ$þÒ£YÊ0-‹}Eºx@M—݌ڢ,OªY4åâ€Ü<%ašÛÙí‡+]á,Åòõg, Íb| fñý=iñí+CI +}CÐý±Ð áÊÞGRK÷ôûµSü, ¯¥ÜW…$ŠàÓè4Û–4þ»;ßKª0…r…²¸4Q÷|ÞÈ0«Ð>n ñ·TÃÁF¼ÅoßÍéQIBI’~‘ t—¢iÍ*—dŠ.+N ,è(lœ€ñÁÛµoM¸^–|«6þšÌº9|w7õÒ¾ÙXù†ôÀ‡…âjÔŽ>¯‰SËw½\ëæ6Œ ‰žštC_€dÃ'x:>ÁãGò{ð;*7Kýfga©¯ùúȆFGŽRùžŒˆ ÿ £“ løÐ rÛžARÞõžØáœâå ø> endobj -2079 0 obj << -/D [2071 0 R /XYZ 56.6929 94.2535 null] +2080 0 obj << +/D [2078 0 R /XYZ 56.6929 794.5015 null] >> endobj -2070 0 obj << -/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F14 737 0 R /F53 1027 0 R >> +2081 0 obj << +/D [2078 0 R /XYZ 56.6929 258.0612 null] +>> endobj +2077 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F53 1032 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2082 0 obj << -/Length 3151 +2084 0 obj << +/Length 3135 /Filter /FlateDecode >> stream -xÚ­]sÛ6òÝ¿Bo•g"ßÓ$í¹Ó¤¹Ú½¹™^h‰²8¡HW¤ìó¿¿]| EÉéµã\,Åb¿WlAá-Œ"TX¹È¬$Š2µXï¯èâæ~¸bg‘V)ÖwwWß~/²…%Vs½¸Û&kBa‹»ÍoË·Ÿ?øôþæß×+®èò;r½R”.?¾ýôëÛŸ<ìóµåË·?|¸…Wi¬$ÆOÓå/ŸÞ¿»þýîÇ«w=9)ÉŒ -¤å«ß~§‹ Pþã%µx†J˜µ|±¿’J%…ˆêêöêŸý‚ɬûtŽJ¢ ÏfxÀÙèµJñ”%Zpá˜ðþÃí»_n>ßÝüü Oã¾øF+nˆÌwȇz³X"Áâœ(& `#Òº©»Ã53˦joT-»]áÍcqÈ»²©ÃëÖ?sÿ¨ó}Àk‹ÃSq¸ÎԘͭZÞtaâ+´Å¦HV>¥šK ìÒžyš™3<α+«²{‰‹æa»ç<ìóèôTnŠ‡”ñ U|wóé=î³”(EùbÕ3y‡+U‘·E §’Â,o¶3Ä+JŒä‘øsD˜Èð‰´Hzj¾8ú@jŸËnçÁuã!ëf¿ÏëVe]xpóˆ–hþ™;jŽû¢îÚ7×+AaùÎðx(ðü£Ý5‡0Ûa—ÃKXnë9’IÂÕ‘!^ý¼T€–Á¥>Â÷Žrx t¶þÍS ƒ=ÊË*¿¯Âë@ÿ»<XzrFÈA¿À`\â81ÑËø~¬ËuÞ¡$ -TÏo9BE¦ƒ<#(ȳ7ý(÷»wŸ=>(N]¬»òš-›˜.i_Ö›²~ð˜gÜçGØ©î› yÈ‘àEIËMùPvyåUª-ê¼;z±t)Åò¦ö˜žÙ€µ>¾W¸£eËç]¹Þù™c[œÜ?ÚAÜÛ½kÿÞùw4‡ø,ò¸DQ;Té,$¼LÁ ÊHSÃii—w»HQb£Zw :Ö·»Û›Vm÷R¹¥Ì”¶E t74ƒÕÀOöÇ¢íÂq¦ÇB¯³^è3¹ü¦M¿oA~ -¤Nø¶ªFMH÷wÐzñCmwKŽìÁz—O*ÿ²?¶ó>ZóhZî_‚Ið/ÅËÔƒs“Ë4[€s Ô2ö5>œkÐÏyðU¿â*]Ò»ç‘>€×°TÚaggÛå_êæ¹o& ˆÞR.ç¬:'b´R_eåð(–EÍuו{Sì½B?Rÿ‡Rþpì]9Ì!Ä[dËMч½w4Þ5ÏîçÝB]¾îpÐB D/@ †]ƒ€ûñ³wÔ8Ý+©×äpŒ±"G߀×îep_Ç*LQ2#“à $R -Â7n±Ÿ]Ät{RB„— -¬g™™YÒ*ÅŠñÚiÌÚcᾫ{O\gb&1VESÚ6ÇúXå›Í¡hÛ)… vלÚË$öX34Ž£(E4å|Lä¯mˆÊÔH¶(‘R«³TN–µFeÑ?8§Ç¢såî{Ïuá'p!o]¦7e€>a‰í k5„‰"!ÀI#Ç‚ôñXuåcŒ?ʺíòz]´i´æQþ»>²‰š›W•×ÔÝ®sþÝ·m0SóØ©Žß|~’“@:,’ð¡ ¼(|Ä3'£23ÄfT^–Ñ뼌öXNF×s2J!djȶåÃj[Vʼn€jF(—â2}=Ö #ÕšP -b4¢p^@1%Ð ó³$NÖÕàf2‘Nfƒ$1;c#m$ŽQjÀ²ú¼wfÅðù¦Øæ doüÆr\Q¸™ŒE*¿-ºõ·hÌ Ò;§F‚h£y@?/ RñŠ0$X„!b9aøòªÁ{ïÖ»"|”Ÿ¢‚7ïŠ}Èw­¯ó¤Ë‚¬¬üµk`?Sv|ëc³/Ì`ö…ñAÉiˆn¤W²ed¢t9£ -ËGnQ,ðàF}•`.)D¤½Ué2Oxó$Å(Ê$5!„bMË,Ö0¶k\ªgxHÀÓ(ÕPN˜œÈ°d«!Œ‡\­ÊAácà4‰qF•œô’ÐèLÁO@f#Å+,„¤@‹lPùiC“,†FS•d’hªÎ볌Ê+4ź ÏËéóã« 'Ú̱Ž¨.Ó‘fèé2‡ ’ë a·E=[±‹Q®«k¹(87µÜ‘õ¥›k|kšHíôà:‘p…W7²ß‚èEêúzôLÁ·}>¯wöz)C?Æ^¹ÞëÂõF,w½ÿšniÁpR4œ—¶ŒH3[Žx ³ÔØñ–ê¡z -šyßD¬š‡HFÎ2k Á$,w‘ )Öy&ôXŽ /ó2.›7S«aL‚cÎøˆ®¿T«éW<=Ä„4 ¨¢Üœê %F3~™q=Ö çÆUbg@wýÕ]žŽMôqØHÛ”nRuž›œB¼È„úû¸Ù¯8ÃÍ‘ŠCt’Q8ë ;O‚x¢¬ŽñöÖ«õ~€SÓ@oÚɬâD0›g€$Òù÷±¦_ñÖ˜eÂüyÖ„:(ü>ŠE¨ "C­£KGPhh58u ‘3cù¸ŠÜ†òœJ ãîÕ{5*o»÷î*¡k¦$Fq€±ñaòµLlµZî!¾ËÂŽOyUnzw­‚§Á®àz] o^ îÃ"„BXtzÙÂ*Â4çç/+YZ˜lÁˆ¯æ/_v¿â*]òô²ø:Í35ì|ö²!H\ý(ärQ…àé±X—(ñÅæÍ\‹­ÜW´å.ùh×Æe.(¤è1š/>±ôå6êjëøpù%bȇc¼~|úð’²!d¥£ˆ_]ëcÀ¥#ÜûÂ7Å` ŒÊÞ„6£€bÚ¿ñ ƒôù U¡*“˜_c~ÒØõ-Ú~ÂË©í[ÄÂyè:Ûg}6¿òÙ6öÓblCîoUÒ­Z±¦Õ\# u}q½üÔ¸™Ú¾imb·ÝÎØA˜íC\Ðå¥ÛfÒ6ÎzbsC•à!…G"š°” ñ¤I9iíœFg³Ádì -D1À†¥`Ôÿ0`R‡=yÛ&-Æbºî»ü)€Šº8äaãØíÑeÈXžÁÄŲ*X™¶%}«"=jª|ï>’± !]åâ±*ÜË»›@rV€¦-J˜¼™Ët˜ÂzæŸH߼‹ m!nõ€·›}Y—`®ó.ä—bxY¯Ãgóú,óL -v23 -çø ¢QÏœ’5ÊúÚËWekèžšc7ÓЋ‰?¥kí„™]Q=†Ö w%³Ý°Ñ`Á©‰MŸ?Ý|¼¹s?Â}ÃçÿýLržPDJ¥ò¥èF?‡è[ÓvçH?Ò¼x’ ™ÙDYËûß™ŸÆXü”˜ü4†1Û"ké˜M¤ÂµËŠÖÛPx&? p­x9 Ïç<ºH:؈¦ fF¶‰ÛqŒïÞ0s,è̔̕…øRéKž€¼B|lg)ó7„wa½Õ° ó÷#º0„¬ZÄ]/…v¼Ï“U€ã[Zq;ðêÔì0 ñ‡ ¶ØéHïï¶xlaá/-ªrP6J`ojcid]ႆöÙÜãÐ^Ì×"h¯ŽùGsÃ%ö ŸÏ§…”H€.¢ L°“x0þ¼î”öÿ…Á ‰endstream +xÚÅkoÛ8ò{~…¿­Ô\>%ñcí]\{½Æ‹; ›Š­$Bm)µ”¤¹_3|YÔËi Ü"@D ÇäpÞ3[Pøc‹L*´\¤ZE™Zlögtq soϘÃYy¤Uë·õÙ¯¿‹t¡‰Nx²XßtÖÊÍ2¶Xo?//>~|óáõ»ÿœ¯¸¢ËßÈùJQº|ñáÏ‹XØÇsÍ—oß\Â+—"$F/¡Ë—~|}qžÊåúÍùÕú³7ë@V—tFÒôõìó]láœQ"t¦OðB Óš/ögR ¢¤²;»<ûWX°3k~:Æ +%2¢2žŽð‚‹/…±L©Ò$0…¼øo]p0)“åú®€ãêdùþÃÅû78TË¿(åÅnkáõ¶wyk!øë_ ½üç…ÎY¶,6µyníäS¹ÛÙÙr[Tmyóì—r{îó¦-؇G;N–7õalS‚œÿõwÕ=]¬#Z)nNv_Z‹q'DJ ȈS"íÊ“ó#Éeõ°¿6D´®F¶” ·’¥¹Ê÷ÅÈž '‚IåPŸî +Ë¢ÞÞÛgøy¹±Û?ÜoóÖMXì¯EÓ:zo‹Ö`&ˆOp¹|wcAUÝ9 +Ð\ÉRB™Åü9:>Ðes_lJ#óí+ qÔÑ嶸Év­}yýáÒ<¿h´œQx*/ÿÐ[2°J¨ËL©""•é¸¹;¤U˪83w…ÝÕ›|g È·ÛCÑ8j>#ñW}rX +éVTBOÒø šÌdäXpƒ¼bî[û²- UÙ—FcàÕ2ò¸ÜÇ!:­BœÚ>ƒc‡ñunŒ‡uÕ[Êù&·Ž‰§nÚFtÊœ¦w]LYÝ?´“†£28•jÞrºXÓ¦°ŒÛÚå>¤šá”õ¨TŠy*ÖûQ*‰é0dËɼÅЇ +˨˗è¸Â2!ˆÖÞì ‡Ú‚A/ÍT”L¾<‰êð­lFiHH +ÇtË¿û0B7oŠS²WP¨Tœ}kFö wl[ç¾Hø1©éËø(e*ç)X#$ÄɈäYÓp”;õ^GV#´Ü;°1DxîÊG‘®Â ªW·41þµû=„fÌaMI²ö{=滇Q—ŠêÉuÈg&üžrûXu³+òÃÄ©\Ò¥‰äõ ’i=`œ@u¡OèAkF<nú¥pvgŒßkÄ¡h‡Žr#(Ñg)ñH#”Än€Ų)qͨ£™O¶3Ú‰£ q‘kû¼vïëËwoW˜™XW}L¾3êÝq_èàÄx–fNžÀÇø¼Ù2(Ïáœz=¸ÏË6ˆ•µ„âfTÄí)ˆ$Ä0©E3²,§³yÖû½I€Mö…ì"©óMyåDdÜqp>_ëù¹h½]és«Ç2·¤HY ƒÐ*éÕ(¹„ò<.|ÉåC÷êË{KH€Ñ"“y+ébM[IÀ22=‡â«3”oÛzŸ—Žsv¼ œg“€Ó›%+`ÐgyØ8å1aŸ l(]Îq¾bÚ Ž°À§›®Ì`St¡ÇfÂ0]Á§Ñ³Øó½C/¾•¦:ÁñSÙÞ¹-Bž[R’ÆBìñ¨ßcQ,…:)[ð™ 5™—mkF¶«/Ûçï‘­Ð4›'+`ÐÕ—­H9 ëËVXÙÙ­4I³ì…ÜNI\ÜQ¨bùUô.w/áiTI.! 5­™Ìcj%zjõÊ•™Š’Lc£³ï|³)ø)Ô6 ƒMê€Ð)ôD2ÔAšÖ44îá)Ú¡ümãÉd~WGjjìU‚ÏR†¤FJ‘r’H‘»´Æ:•Ÿ’ÂuzÌÚiîÌËÇFÂ7¦`Ð cE§Æ¢Ï»dÏŒbít‹ôj¬ç"¡zd2‰Uc>o÷Ù=ª‘ìr+Ì0_î{d§ ¶õÅȪ’¤éþP]QïK¨B}Må€y¢Á•¤UÑ¢ÖÇWXÿa?Ót¬PJO4]»X3Æెîð§­Qé,±k„Ú¾=PHbr×wÈ1Iiè¢ÍCRo8ŸwѺÖq„­ŠsÆ"ppÂ"$p]«Y„|E°¿É$2Â¥ôÉìþ¡qâ7¾bÎB0 +iõ"Iþ¥E‚‰ò¼t°f Äcý¬X¼¼Í ÎuB¤P'(X#¤GŒ†¢D²¤Gûz¼ð¡­iïÛ¼1Å… ¤¸Gê´¥e²,òÍŽðZ«µ 4Ø_Œ³)ms¿ƒÒFTô{—1ÈŠ%ïUÈÍ]~°ØEŇi•ïG¯ù²ÀÅUW¤6å€GU<á@h=N÷+-„Ù†"ŽìW08Qk1HË21¯7,%Z„Œõoi>Lø“(éœÖ9Hé‰{ß.ÖŒÎy,›F×OƒëŠ¹&d4³»¬‘mã~½$"Ñ<Þ÷uÙÜïògó1Tâ¿€J–›wûŽß!`_4M~[ Yg¬R‹²r_N%þÃ+÷Ucw¡‰ZÃüÈø/à%¾A@YmŠãª6(¡÷é…¤]îËbüpiR‚Z‘?áš`iZ~ÉfæVõbñ ãÚÜ–i¸g,<)0Åî¦þË·è²(œà‚Ç/›Ø!£Pó]À7wvÇ8f¬L£×»¼úr¼ˆšþ®H<›ÿ¬(àÌ|Udq¬m7OÅaÀcp(I–¤s;œÁ–‡9GÎv·ìØF—ÅŽ8öɲP¿3¡††{³ŸþœùøÙ¶LÁL©d'DÍ> endobj -2083 0 obj << -/D [2081 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2084 0 obj << -/D [2081 0 R /XYZ 85.0394 751.281 null] ->> endobj 2085 0 obj << -/D [2081 0 R /XYZ 85.0394 555.2948 null] +/D [2083 0 R /XYZ 85.0394 794.5015 null] >> endobj -2086 0 obj << -/D [2081 0 R /XYZ 85.0394 126.1169 null] ->> endobj -2080 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F55 1035 0 R /F53 1027 0 R /F41 935 0 R >> +2082 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F53 1032 0 R /F21 714 0 R /F41 940 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2089 0 obj << -/Length 2725 +2088 0 obj << +/Length 1929 /Filter /FlateDecode >> stream -xÚ¥Y_sÛF÷§ÐÌ=Tn£Íþç2÷ä8NëNãäbeæfš>Ðms*‘®HÚõ·?`±K‘§sãk‰±X?»3bf,³©LgIª™áÂÌVÛ>»ƒ¹ŸODàYD¦EŸëíòäõ{•ÌR–ZigËÛž,Ǹsb¶\ÿ>Ë„d§,}ýÞ¨³fÁ%,€\Ÿ¯Þ³óWï‰s V& K„JëÙ§OWï.ÿ{º†ƒøÓ…á|þáìêËÙoDûtšÊùÙÏ×(ìäbÙm¤¿YÁî⯓ßÿà³5ìù×ÎTêÌì 8i*gÛm3Z©HÙœ\Ÿü§Ø›õ¯NOp&••Ö“b&K‘ó™”Y%•ßíõÅmêì·ëdÙ7#ŸÁ,,n¬gß•ë[UåíWn¸â½Ž œ¸ËKœs½¹2ÛæëIâ¤(Ôc&¥}9É8ó’¿Þ^^½£Ó°“õ¶(‹ºÙeMµ#Òçü6ß -7ÏËUN¤YÙf›‰ 똴Öñ!¶†¦\hÑ BVY&´v:_–¿|üü²/Ë&ß•yCš\?×M¾­éá¼*ëj×ív¿®fJ[ähÁdêºÐ'.X¿Ç,N'IØ@ç²)‹È»P† Aº×¹b´‰” ¥Ì¤\5Dªt."ê«”É>Jh/~å\޵ॢ*‰ˆ”M>ið(1Ø;¥à}.«‡º¨Ç8T‚%ΪÄ$¥§p#@[i0ˆ¦A)AXôDxL L!Õq1ø~#|1ï.®Ï?_~Z^~¼:bñ)ðMY<°àÑâ`p¨˜7÷9&̳ÁÜžá ÕíaAB¨(n{¡4±¶äL'Žb•ØýÊO\.%Ÿu¾{XFÐjC“mSlŠæù‚0¸°BΗ÷´/ÞÓ\Ìï³@ÌP5°‡ôj3[tfµêb[l2\Lš9ä†S7oWMKI¨Y¹ÓÏe“ýM㦚ð‹ÐPcuØò>•M9&eIb\—MF™ùu“äó²©ÃÒ}= Gmª:÷ÊèyQõf—­òz¤)¤Èu +¨ÞÐëYI|Õf¨zÄõŠ&#Æ!´²b!ŸõËô˜E‹gôógþ<âcS¡[š€?ì^Ùh¨¨ï¡•´f)—"ðõ4R<ñ /+pŸø„&{Ìà AãÄ1¬fÜXd¯óÛ¬Ý4‹`CUœe‰6±¦hµ"hp[m6Õ“O$ðtóL¿”ÆaP†žÊ—0Lk>²}åS+¤ƒõšÜ\×DÀ÷ô²¿Ä$t*æ^ÝDû¼(UÌð0{_Õ žŠÍ†F7áÍ6$G˜»ÏË ·Â_>ª Œ£Ô»â1¾RŸ½ÚwmðPbê—cHöê÷TDÜ›6G)æéF~Äð<”jSÆ¥±c'Jö—öTïD™'!' ^qäGp@úÓ})£/³XƒE - бÜlj?©`"éºçéHèa¹NûÀXPpiè0ƒGÁ~p>ДÏ/QqëÐ߇‹C„3”Ú¯]¬'VWp¦2©é·J6?P÷ñX@T®ýNè;%-ËR‹$,\T‡ŒùŸÔ…Ú “JgMn’—Ìc¹Vc?ƒLRÖŸÛ¸Œï,y·Y³ºÆ1g…³(ï¦ -©eç‘ciDÁÉѸƒŒ[×B•¼~NÄ8¦ -.Ç#’]@²ëì¨4"%kÁÖo+M²=°D@Cºø!¬œžÈôÀI(X:cë1Ämý)›rl’¦xLÖ#hbç1a™DcE<À&·!ÁšA‚µ!Áš˜`íÜËõ£"°¢!‰2_EzE¯ø ä±Åmw[5AT€9Œ‚É|‚õÆpøÐ|Sü¦à±Ô‘ÝK^bÒAE$™±¼tð"lÁLäèJLÀöØâ{lI9ïhG4U E—v¿KÕ½£\¯¶q"è˜ÑŒ×4~°b€àqæú’Œá“Hâ<")á=$aŽ¢I:(ÁÈC ~”’¥„‡à`ò¹G*Äy -©q+Qµ»U¾ÀzŽµ|âžo Rñ¾™0 tiÌb=Àoz‘Å£ZÇH&¬¦Cl!ªC¹‚Îw¾òý#ÐÐ H ƒ Å·Ý@©ý |§ -ƒËOšæ¨A$’ ìW¹×Úäu€SÔmàôÀõÈ…~cÏ°ýåÙm³oʧœ£ñ&#/æeÇt§÷Uå©òJ¬_ÅÞ;vݱEî÷ÖôXÀ±³]ç¡ñι¡Ùa¼{R4¶vÝ£“‹í¥߇Í Â-Ãlá8ÒŒÎè¡ëP׆™Ã“(ãè&0…|…òʺɳðà-›x¿J„0ŒÑ1þô­æ™wÛp5r9œ„æ#°Q¾”`ÊìÏœFD1X¿¡j@ ÷—4@@»ûe„ïï”1-4ÿ2v·/–gX*:“ÆÈ¡Hì…»øþ®zÁs¦;TAá¾s|(»¹ÉO$*ò,G}ÒMøt<Õ»Ðñ!{®ÈS†T]úסºà+ýê‚,£1üÔ‘#•ÃYJËoŸ5ð[Jêï(4Çмó78öW‹Ðæs&H¡ƒáí³/H b-L,9H¥ä#t -è¦P¥p¿›8Gy ÔðÙÍS‰,±zÐñÚäÐØl9Ã2ÛÜU;ØÍvú]ÕÝ£í¾X_THEJI¼¤Ý=Ç>&öBýã‘ëôZ&ןŽ]@Jß3ùnNùvæßØ×éùªÝ…oYÍæ™&«’Frþˇ³óŇw&Ü“¥º/5º¦êm÷÷¨ÝÍ$ÇþÌ‚T<³ 5£Ç:_‘ ‘»”ã®Wè_táDè@XVç «‰ -Ö¬Ö¡ÑH²}Þθ?ÔS÷Á}_Ä˽VxùºŒxÜ/é/þBg㢎÷²ñæÝSƒ¸uÕúǵpÊ¢›úð -1~­ø¢Ä»@ÿ÷Gáýçr0åœÜïöoClT --%”>Ôý€Û-Òendstream +xÚí]“Û6îÝ¿Â3}±§k†_’¨—›q²NºíîÞ^ìÌô¦íƒV¢mMlÉ‘älÜ_ Aʲ­x{Ó{¼Ñƒ@A²!… ƒ„1‡Q,I@Y0L·:\Á؇s<Ï4ér½] Þ¼Ñ0&qÈÃábÙ‘¥UŠ Ùo£·„Q2tô8ÿôt;Gr´˜'œKŽ¦OO³ÇÛ»_(0'¥£‡éã§é=ÒžÆ1M?Ìæã??f‹Ö¬®éŒ +cÓ—ÁoÐa+øy@‰ˆU0|„Ç|¸È@@ +á)›Á|ð¯V`gÔNís…  ¸ Á)’ÄJõû‹‘ˆ1à‰DL&Žþâ¬Ï_žËø+ÓÏûÕùRU@d$;œ}Z=SVÑÑS"ƒŸj]Œc:ÚWº¼tkË*/VÄ4œA¢ü3áà?‹7SïóB×Èÿ¬¹~D_òfP‚¿Zoó´ÜxñI5fj¤IËíV“”YO¾*JÄ3k‘õ'c$n–F!>œH>5–Í~><Ýcâœ98¹",à.m4(1Òß’ínc×£8¬gS¾à@½Fˆ àu2PD2ÉF`QïwYÒèÕRFÊ1¦å~“¡Šg +öµv”¦DJ^Ôºj†ž Óݸ)蔺Ü[ u‹AjŠ.ËÜš–+·NÃZch™Šˆ”<Èû¬sî ©å‚ÑŸe¡a +ŽË&·š€Ü¬“ÆCŽ”»½¥…"I'éÚA(‘´,š–ˆXâäTI¾ÁL Ï›¤øŒ@tóêò\y‚Ü+\â~g—Fý’°•Ëc¾/ëž4«!¹ö e‡"FÄ…ØÂ8ÿË^×nªù¯Ç6©]! BZ]ÕWO]–è¸Ýå¹d§É+8¡‘´ úa< ¡dv3î¸f ã?ÅÛk`Ÿ=.7Ùº¬rm30ís`°$Ëœú¥_’ +%¥^¨ý±ˆFØ‹!Yÿîí8`Z #©0’Íï"íåè[3Ú»X3Ц€AÐ=Pe&2T !s_5Ìp‰ÿt­ÓÏ~F§·• ’.R¸‰=‡̼<<€ÕO#Çl9«é°Ó}ñp¥Lõ:ߤ¬£;[‰ãa†³ñ°°-ŸªSlÕy±U£%µ8± +fâ>Qmµ…u”ÚÓJ7UËëÆ)KÐ Ì…žˆãªìÀÆýküû()ƒP{ª†ÔwÎE‚‹ @/km⬘[ j3ðB¬±M©Vešh»ËâwJEžz©Øp)ï6ÍÖjR7pҙôgMÕ|kŽb+{R³8}|ÿ:j‰D´Ú$ ? a»¯G+õ'ÒL‘±ÓL¶BiCmiçUÉ*2ÉdG󥳧+´>“Š¨uAØT+»ÓPCga¦àõ¤é³¶aÌ¥—)ÂÄ@½}œÏgï¶] ‚ox $ÚÍÄdƒ"¬Aõéð:ùª‘òñãüîÃM+ý—Ù¿ÛÖñ±Ux¶‰©º×º^a—ôþî¾çªä.$ÐB— +Ó®ÞZº\öþ UÏ­¥å2Zßè&}SAÙ|…^,Ï €N›Àž×-h¹.M8©­,ˆˆ`Axjƒë›;½WžA'—/þ6³Lö›æ;Ø÷<Psã¯x¬ÃuÅcžËXû †’É.#‰£(t7ƒ¥;`»’Ì•æ»;†YÂ¥.H̨tL«×¤7ì$QR°¿jN)Œå™À…'^3È[L>ëÃy48…ˇM{5-×e}2™Ïf˜ºÓûù?_71g!á ÎLP1¹ÑÁ” Ž˜é/:cp¢v°X°›cÎڥܼº¯^yzûéÃ_~Šùh‡µ˜ÛìØÞ,öw¿l_dIÑlÜ`Ýø÷)d²=ü›1½”×z—TØÊý‡&¦šöÚW×>šÉ5 +M…cµ6=oa;t ÛªíËR÷5–-£uÝÛ›ßÎèÆMþ\%Õáìñ!÷opiuØ5åªJvkÿâQî4˜w”úæìn믎é:)Vþ½Î=ô-÷;ûÀ‚ðFèÉ÷žua+›·ØžGÛÿí'ßãÓ¶„–B©ï4p!"09ôF72Á/ 9%\„¼ÇöÿnSÎÈendstream endobj -2088 0 obj << +2087 0 obj << /Type /Page -/Contents 2089 0 R -/Resources 2087 0 R +/Contents 2088 0 R +/Resources 2086 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2059 0 R >> endobj +2089 0 obj << +/D [2087 0 R /XYZ 56.6929 794.5015 null] +>> endobj 2090 0 obj << -/D [2088 0 R /XYZ 56.6929 794.5015 null] +/D [2087 0 R /XYZ 56.6929 668.7228 null] >> endobj 2091 0 obj << -/D [2088 0 R /XYZ 56.6929 752.2635 null] +/D [2087 0 R /XYZ 56.6929 314.4341 null] >> endobj 2092 0 obj << -/D [2088 0 R /XYZ 56.6929 690.7232 null] ->> endobj -694 0 obj << -/D [2088 0 R /XYZ 56.6929 652.8084 null] +/D [2087 0 R /XYZ 56.6929 167.7554 null] >> endobj 2093 0 obj << -/D [2088 0 R /XYZ 56.6929 620.2916 null] +/D [2087 0 R /XYZ 56.6929 97.1798 null] >> endobj -2094 0 obj << -/D [2088 0 R /XYZ 56.6929 585.1376 null] +2086 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F48 955 0 R /F14 741 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +2096 0 obj << +/Length 3033 +/Filter /FlateDecode +>> +stream +xÚ­ZKsã6¾ûWè¹j„àMâ8¯Í:µãÌÆNj«&9Ðe±F"‘²ã¿ÝxEɳ5[>šf£_7ÌfþØ,W„ +#g™‘DQ¦fËÝ=ÂÚOWÌÓ,Ñ"¦zwõã?D63Äh®g÷ëˆWNhž³ÙýêËüíçÏo?ÜüçzÁ¿#× EéüÓÛÛßÞþËÍ}¾6|þö§wð(s#ˆ1¤Ótþëí‡÷×Þÿ|õñ¾'™Q²üuõåO:[ä?_Q"L®fÏð@ 3†ÏvWR ¢¤af{uwõïža´j_R9Q9Ï&tÀÙŒI"¤æ‰”!<ϸU~Ñõ‚QøòC½ZâÛ…P„ñL[’ÛbWâ<ð‘NŠ»!}×êìÎ37ªñ=;jËÃSypãeSw‡k–Ï›­›8vÕ¶ê^ü 1#F)î·š°œ;Aî^êfßVíXít'@Z"™4Sjb 8WÆ“fD U`‹˜…U¡dfÔS Ÿ®A_î+T¬'8B0;!uÛËrQ¬V‡²myº‡ :×üÏÀy9Á)×JyRPìºz\¬«m9ÁV+’)!Çl¿¾ÊökùrŽ§ÌHÎi6æÙ¾ÊÓÛÃ)G8mÎ%sÜOpË€‡Œ«ÙÂYŒsê}sè&sA zäˆñïýèeb‹Tg ˆ±áq–&­æŒHeòoñxNLžçÓþ¾è9.b–ÖÑ8¬2nØ°3ŠX­&>q"”Ðé§/›Ý®¨WSN·`2'ƒŽw>çá>Þ½ÿõæóýÍ/·ý[i0Pàœ >q28' +¸"A ¡€ªy·)Ý Ù—‡¢«šÚ?®Ýoá~|`‘7¤LÎ!*sÐ7_8‡¶\•çS©¹4p@A5Ó2ÃhôyG‚•gZøíž ¿ÏÞ}ÐSµ*Wn¦ +ß°õïnn?Ø0 S¢åÁ‚]D¶ÊmY´e _%E>¿YO¯(É%ŸӸ " +¯PH#@¤§æ«•ÒÛsÕmÜtݸ™`vr[Õ¥›nöx žEsp¿…•öñ¸+ë®}s½Øwî…ý¡‚IOç~Ú º§]m°Ëáų[;d’pAuêÒÎ*0÷èÞVrÕÛpëžœÄ0èÉ‹§¢Ú[ÿ8È?¢®|fJ¾…L9XW‚_T9|c¢7òÝîXWË¢CS™ò +Ç‘•TdÚ4N…L‰ã¦îçþýgGžS—Ë®ºfó¦­KšÁ›õªªå ûúvª;+ÄÊ›ž2±¼` +r¾ª«®Àm@¦ê±.º£³Kk’RÌojGé´ TËãÁQÔ[éÛ`0ÊŸðØÿ ð\ËWmXRG­ÈK VŽÊ\M°”ÓÇAk«:ˆ/AÛ7Š­Ì$ÊÃxäW™ë‘úŠícsÖÛð÷ŸŸÞ¾_|ú pGÃæÏ›j¹q+Ƕô4…ûi7Îqoû\.Ýsçž1âoYemI¥ ‘8ál +ÁFšNLK3¿ß‰¢ ÕÀ;ÜýÝÍO‹¶{ÙZVùXvn@è,l˜aœØ˶ó<ÂJOï^g½ÑCÿ¡ßo÷`?%Ê_øv»M6‰Î=²°æ‡îÞ#Î> ,7èÄÃÎݱõ”!¼€‡Øòðâc‚û™ÊýyBF‚%Åw§þÀpqt0>ñH†ö T>ñ;9ëæ¹ö_ÝŒ¾>Ε§„©ÉA´oŠqø%&à4wX…‹Ä.Ö+L#õ”òÇcŸÉa g\@æ^B1_•]yع<Ó›æÙÍ»u˨+–ŸÜx²P]ˆ¨ºà!®#Ó%˜·?»<˽‹:?öŸ‘ºqH xèvPyCìuÜúÅ#Ú奒š¦_,`º;)}½!4Ðrž_.JbªP×%=îÛW"*’ŒäF‰³•H,!ƒÝ5§æ²ˆ=Õ„Œ)ˆRDSÎS!kË ÔÍ) O­.ÔK kð‘«P„6å±Z¹}ÍsYºdäb‹§t (ý+,ŠœžW3"yªRTžËÔ>·]µð£ªÛ®¨—eƒ ¿¶Gûïz`\·Øn/ óvÍî6´­}jl¾Žüæó“!˜ÒžI¤ K2è¢t€gÒF±vRF¼b£Õ TÖF—S6J²35mb šÊ¥¸,_O5!`b `—”‚%N(VlþLÙðÕÐf2²Nf¼%13#q2ÄH£Õ@duxî̈áõU¹.ÀÈÞL¼N&cAÊËnù#s‚òN¹QÒv8k Ö¡&¦æ²1ÄT硧²ÆðõÕ€w"Kø(yY¸žjBºät¡&Ì•¤âµ“I>Ù)I˜B­Fef"3à<`g.|¦™>=r1=.X—ç!ýÁÄ…£g*'97ùÉÑ{3’-ËHFsÝŸ<àb`ÑïãECq&¶RP^šLÇ;¹ˆ؇dG¥íy)@ë&gAæç +Ág™gð ùvåF6:Âo\ÕàŒŽ B–(½á”ÇÀ‰ãj=,N$£L•±oõuÃd]«¦ô‚ÔM”ˆԙHÑvùwÕvçN¢dÎËQ]p¸@e®}5úmºÄÝ# JŽË¢õT§²¥.„h‰eY*\Ü L‹80mÙ{œkh˜PÅ™ +aä&Í÷va=z§7ûâ ‡»¢[nJÿRqJ +Ù¼+w¾Ú5®Í³[Y¸c× ~¦LzêiØùöEî@É)FÏÑÙ+µ2€§L ¾œQ…Ý#Ëû;¸Qßc€9[â½ÛÊÖðäD +(*ZB8‹-!l:°ÐÁ€¹Mc ½œûòÛNb…SÞµ@”&Ge³d‹ä’`[€Ãà4Â8I#'>†é÷ ¨Ê¤xE…Ph‘ .?®bhTÅЪ¢:CÕYF$¬˜P—ý9¦:ïÏ=•õçý« 4ôÆoæØFT—å +Dr%¾Ì¡„äz$Ø]YO6ìʵ]-‹‚ûÖ}!¸!"ë7UzjšHâô:#“°}W;2?x¼é¹˜JÚ¸íÿ:d½³Ç«T½®cª Ǩìñþ>ÞÒ@à¤8/nˆ&¶LtL&ç&Ýòc=4OÁ3šà‘ÛæñŠ‘óJ; F¿RÕÆT”¨¬^¦m\ 1o¢SØ„ÄœñD®ïjÕôO?b$@ªÓp—4©’kÆ/+®§šÐ\šQ%^ ¨t×ßìáépǃ‡¥·•x_LÕ…;/ +x}ûÿ¦Ížã„6t’QøÖ už€x¢Œx{íÜz7RÀih‡IÚÉdâD0“WmnÈØh¿W5=ÇWTƒw¡Läÿ»j|>ü!˜…o!âB­CJÇ)E ÕÔ"g¹Ýbµ¾=§â¶¸}tÙ@%ÍmûÜ|‡Ã_š)‰((V(׫ÁÁ(V«ùð]ñèw|*¶ÕªO×Êg¼\.KÌÍ Á,ÂY€E÷ÕF¦9?ØŠCÅ,rˆ¿LÀ1ý݇Ýs\Ä,O[A®Óãñ㯃—” •&ˆíÅÇ@KÚ‡Ò]‰ Deoü-c€b|{ã +éêA£üm¨Œ0¿J1¿ôåG¸ô-Û~ÁÙ©éoˆa +òpç”^žõÕüÂUÛx›°ñµ¿QÑ]ÕpëeZLÝ…  öZ\Ïo[#SÓßYçá²ÝLÄAXí!®#èŠÊn+ñ%®~ì BkC—æ} B4ž•ƒ†HxrE9º“:Eg“`rü?Gx])uÿ0jáÃŽN¼u7c±\·ƒMñä§˺<~ãpÛáÑ¥¯Xž!Ä…¶*D™v¢Ÿz Šà?WL¤xÚ_$|÷?Ž ÿ'±?žŸÁ}‚Bº†¡PÓLˆ“XþÅìTöÿ–@¸Zendstream +endobj 2095 0 obj << -/D [2088 0 R /XYZ 56.6929 520.6753 null] +/Type /Page +/Contents 2096 0 R +/Resources 2094 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2103 0 R >> endobj -2096 0 obj << -/D [2088 0 R /XYZ 56.6929 462.0998 null] +2097 0 obj << +/D [2095 0 R /XYZ 85.0394 794.5015 null] >> endobj -2087 0 obj << -/Font << /F37 799 0 R /F53 1027 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F48 950 0 R /F41 935 0 R >> -/ProcSet [ /PDF /Text ] +694 0 obj << +/D [2095 0 R /XYZ 85.0394 769.5949 null] >> endobj -2099 0 obj << -/Length 1782 -/Filter /FlateDecode ->> -stream -xÚ¥XKsÔ8¾Ï¯˜ÊeZ,ô´¥¥8’@€„Ù-ŠÇÁ{2^ücCØå¿oK-{<ÁÙ„¢æ`©Õê—Ô­¯‡M)üØT+B…‘ÓØH¢(SÓY9¡Ó X{2až'ì˜Â!×£³ÉýCO 1¦gó,M¨Ölz–¾öNONöÞî†\ÑàÙ ¥ÁñÞÉŸ{/vºkx°÷äà L¹Œ#`bœì~<{vÿP‰|a ‰¥²fYɯOö“Ç/O-ëäଷwè£Âûyòþ#¦àÚ³ %Âh5]Äf Ÿ–©QRˆŽRLÞL^õ«nëXŒ”ÐDi‰‹± )C"KÖ•³E¶Üe:ÈvCAul&qЮk¤Î견+$®“«©m”‹¬Ê–Ië%´ ¿ûpév$»-6³ 8ÐÎ_˜#8ªé{/L*ÈOíôFCµ·ZíTÇúvÕ쎪۬i‡óÛtsé7õšé6W’¦Ë¬i²þÆ<¼¬—~¤„pøýç=q&EÃhÜêER\ÔKH&Ègi|Q&³°LÕ¨3ö¡ÈÐRìD‡Çó¿¥xÙ|“ÅÕ9—/2ž?9øfŠ9+Šg//¾íü‚>ª?ãAtWܱí¼OôiôèùÚ¼[¿]Ÿˆ¿Þ=_½zøðV_«\aŸzB!(²¹rß• a‚ä¼þ’!-ûêŽèÞH½„·'fLÑœ­ŒòLë¼(PîùªòɉD¨ùHEK$íï¼³Ês .¥% €exL(üLra ÊÂD -l/ð]v7Ð?ýŒ3¢bj¶OÂ_Oû"W=‚ÇX mYä'ûuZ8۲轰ä½*::Ü6ÈK¢hj‘ϸR®P4ëžl {!iöÀHå|r^m”ŒÔÅδX¿YoâØ+ábï,>±,ŽÀà߳أ2» –ûŪaðãkMÙ, ºjYZxÓá±m‘žWi>JÓ©qÇŽz|„Ffå*—ZxÜ:xz¼÷8<ÞW¾ÙeAŸ€ŽRyh–·~ëÆXœÏŠÊŽëªMòªÙ 1z=ü€‰ @,r›ßdÐ ß«¶l5+jD@0ËýƒÖ«|^Õ$Ò ƒË+b©1Ÿç#Ùª‰Ü?LVÈ„Ö#Á‡ÊIk¢e20  w¿ªJB3$n¯q_« â]Vñ -j$nªC $¶ó Xñ‰² ö‰ê,ÅC]¾ÍÖ—oÌp¬…í¦|T ¶@¶ ¬1ø(ªŠÂ§Gñˆ³¶ÎÓåÍ––Ù¨ï\#rs³AwNxæ?<²ÒÃúΩ!LCзL¿E.ÝæÞƒL‚om6à”"‘ܪüÄJƒÊ1ÔÔ¾!ÆJ5MB°s¸â+L«»<íÃÉZWHè‚"ã 4Z1xeì‚­‚ö»†$o³Ê‹­‡âcÛ#€|ì_Óîù„Ùogd½j]ŸàPµ­ùP¡²4¬µ_ c”ĦË_£®ßtJ$ïÓÁVŸ9†w<¶æ,뢋+\°Û3ö%t€ÕIb´êRÍëô¦c‹ [Œ¢ŽµïöÝeÇWF—ÐlAH|Ò®¡Ù‹Ùv)º5i6ôg²&"JëøöNM¢Yßçf 3‘öÏ­Èf‹qÚŽoþ-ëòW‚]Kd‰G³µíàä_ü û ™­4#ØÐFþòßC›ÿÇdL„Ö|üŸhÕÖeÁ„¸nzÿGÒ¶ÿ n 8endstream -endobj 2098 0 obj << -/Type /Page -/Contents 2099 0 R -/Resources 2097 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2102 0 R +/D [2095 0 R /XYZ 85.0394 748.1323 null] +>> endobj +2099 0 obj << +/D [2095 0 R /XYZ 85.0394 713.0047 null] >> endobj 2100 0 obj << -/D [2098 0 R /XYZ 85.0394 794.5015 null] +/D [2095 0 R /XYZ 85.0394 648.4882 null] >> endobj 2101 0 obj << -/D [2098 0 R /XYZ 85.0394 668.3939 null] +/D [2095 0 R /XYZ 85.0394 577.9033 null] >> endobj -2097 0 obj << -/Font << /F37 799 0 R /F53 1027 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F48 950 0 R >> +2102 0 obj << +/D [2095 0 R /XYZ 85.0394 396.1161 null] +>> endobj +2094 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R /F41 940 0 R /F53 1032 0 R /F55 1040 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2105 0 obj << -/Length 2487 +2106 0 obj << +/Length 2231 /Filter /FlateDecode >> stream -xÚ¥Y[oÛÆ~÷¯Ð£DÛ½_pžÜØÍqÑØ9¶sp€$2E[D%R)»î¯?³W‘ÒÊrQ×ËÑììÌì7ß,ÉÃ?2ICÍHŽ&bT¬Îðè Þ}:#Af…¦}©ŸïÏ~ú…©‘AFR9ºìéÒkMF÷óoãŸah*ðøöúâãôãÍõ/Ÿ.¯'Sb¸âãó/_.¯/®þ7™RA$1>¿þzþ›Ÿû21t|þéònòãþ׳ËûdVßt‚™µé³o?ðh;øõ #f´½ÀcèhuÆC‚3g–gwgÿI -{oÝO³® Q&iÆ”ŒAF:p†0H2Êœ3®Ï?_ú]Ý]ÞN`ûÿ…‡ûÛºåêÓ×Ûs»Ûû«›k»[ÐÉzþÅ#E˜3í”Ý/ÊÉ”9®g+7ã¶Ü<—?»Ú¶=„·ESǘ>m7¢ÇåÜ¿íÿœE¹î¼ä¦ž~~S—EW5uÄê¹—‰¿óÊŠæ©®þ -u‹°âïå«Ÿi×eQÙÅãªUm7h·ä}æ“ÅþÐ훓޾‰D†IÂVÆÚ†À¬ÇŒ‡Àé†($ízËò,HÍxÛVõ“]›Eó˜Ý\çÌo–­Ÿi»YW®Êºóz+Ìü:,b??jAJ%QHnnÌø®,÷ìh{fã¦Þ½Î¬þRŒGn ÖüÃŧ ¤(UÑÇÔý¢·E›x°E÷tƸ3xu}áGÆ?Î竪®Ún3뚟º-K÷º?û<«·³¥?F¹yÙͪe‹‚uƒ¡g1bͺ» 'ãü·»›ÓÉo³à;XÃäƒÿ¥›ÚH<•õþ»ì¸hæ¥'~Þ­ÁLß·J!¡`ì}ûÏß”mû~t'U‹MÓtój“³èHé’”nO*Ý]ȹ•JíÔeAŠP`Jzxø..ï>Þ^}é‘’ª ¢‡dˆbS* Ai‘L›‰“¾Ø [€M œ!… í‰ÌÒ`P±^ɦj|Õ…•ga5K©ì\8÷£YXz–l|.ëÊ—Y;½´À ö>‡_ZúdŸ/›ª›:\ "¦¹樣-ÔÈ#|€Á!pœõ=äHqªäÈkvœŽH€±´oã«Z»nê¹5!ãNðÆœf"Ì .UL{»ZF›Ašº‘\5¼õ$"Óz›³dM‰3š¾‡¬I -l)ÁÉë׺s‘·õÒp3ŒÏù.²Ë× Ð³±¥챡ç<$ >i`b3Ñãm˜{©º…ŸMáºEhD4WÁªé,ç ŒPDÛu8Üst«»uŒ&¶k?1˸Jid0!ýLʇAظï±l¯Þ'’ÕÿÜTó`Ã"l».Ë0åùá3À„Pj`Gð?> ö G¢I%â˜ìÛTÂÛhwB`p÷»RF÷S1h^vÍS ßØ/ÏóÖˆ3P0Ô³…Ÿ‡­n à3`)àú79J_*v¦‡$%Iíòª¿¤„·†è·—ŒB™%' † -ÊÞ`É €>Û®YÁñ)2á€#©—'›!Fi¯!ê à€c÷‹ªõË×b5‘°eL‘L>rKæ${×¹ -ÇêšïÚ¥ÃüSÙùÌUÀ/ 0û9[´¬h&"·¯­=‰/ ûB}ˆ–XqìÅV0E`Ыۉøâea)¬ùÎÈÍÅ—ÛjÙÙÆÊÿÙ©îŽg\à÷ Ó«{6€‡§8¥¤äDä)â$ß‘º{ÅÚô @î8SdvîkÂ6áXoºíÙJ@Ý}K¦À€~*å!Z1í×zˆVG t^f­0ÛŽÓÚ%+.YÝìãl»ìüE³ZyPêU].ý›4 glBÆ>8f‘3áp=ã—Ëæ%_åÎÈ8 M —+;Á²mm—,ƒO š1ªÄ^æUù€zÌ9?9†8pê^ä·˦ˆ·‹¦ øŠ.Œê&ÜXl7®ÝâlÜ”±—)aËMíz·ÛºÎû ¨>´iÕoU¾’+ ¨LÅdrQi½x¼‹þ.BÉv FîþqÀÄ ë~°@¡c' ?PZ»DX{îïÈÖÓ*Øîòz9+ÿ‚†[Ÿ­j¬#±åk¹8Gy ‰ç7@$FEýp,¨ö,<•m¼AØËŒòϪí<¹Üzél+°J%¿ž¢‘€bp–C -Q{¿döRèêÑ®ë‰Ç«Æ{×O–ËÙCc[ÿça瓵»QçµÄŽiî_<¼æÎ‡× Z‡~Ššã)ªULWUAÔÛüǶ -WË6&’Æ”€}ü9[­— ý½>çÑ^Ôêx÷ #«Ü>ÝM3<Ý=6Ò…ÆÆÁ(k8aü0WÃÇÞCÛÿk™·*endstream +xÚ¥YÝoÛ8Ï_aàNÙ­Y~ô-MÓ½,ڴפÀÛ}Pm%N–r–ÔlþûjHY–ém‡5$‡óù›¡ÌþØBi¢w ã$Q”©Åj{F0÷Ë k–qÑrºêõÝÙË·Â,qšëÅÝý„—%ÔZ¶¸[ÿ–½&Œ“óßï~}ùV‰Éb‹åp€_õéæÍ%¹üpóW°åÆÄ K/>~¼ºysýŸó%WØŸ/¥Ùû‹›ÏïöñÜñìâ—«[ÏììênTdª,£Âkñ¿³ß~§‹5èüë%ÂYµx‚J˜s|±=“J%…ˆ”êìöìß#ÃÉì°5i6»®Xãä×g4/gSó2E(U,˜wW¯WaÕ»(‘F„5/âáÅL¸××7oäp±Þ–uÙv»¼‹š|*î‹Ý9³YQ¯Â¶÷yÝç•?u±äBÁIåÐÂã°²ùV®&6¨3í½>¤‡/VøÞáûýu0ÈQ!y 5¤©¡*Ó‹ç9Ú!½]Zk"˜ìàÆGŒµi°YF†Ë)ÇH$nŽ»?Ø X®S^‘šŽòTîÛ²~†ŒöZ5õJùCÙ\65=¥*¢$¯¦îЉ·Å·b—‡˜+Ðs1¡Cµ1ûjï14«"xiwnd–Ì4z˜b·WW¸÷âÝ퇄։ä" Ûýª¨‚ìE˜Xú‰‡¢ösv2WçÛb$&Y§Éb¬qnM–Ó˜û„sA“ŽiŽ£@ÚãèÜÏÚáاáJ*ê¹Cc^|¾ûׇOeE\w]wÅ®ŽxsûÜvÅ6xõ²©[Ÿ²ßîÏ•DH'9aV©±_éf§Ë$#V3øÁÐ)ŽË¸v µš7l¹ç$òØ«áˆâB$Ï*4·6ö!_87û8‰ñ;Ï b†¤+Dàx¾ÏuóØÔÍñ„µµX@Jƒ¹˜Ku³Ž+FéV)¦½]ö,Ž$v"ãª?™€o®n/?]ôÅí„ÅSé—²¸!ÜÑhqþB1$‘2·Ÿ æx?.XŒC¬ªÿ^Ç#ŒÞŸŒ êsH𩄶ØÜvwN¾¥fÐlP/:‘œe›<ó€¬ÂIuص嶬rW ƒïŽV]K¦§BYÓÏu—ÿc¨Ç~a’BÚhëøf)Ç@ñ3ÊŽx²TBe·]I ÔpôT@©ªi‹A™•5R¿îòUÑÎ$ ´Ë»"¼û­@‰æœZ!‡Îózfa4{ùÒ~z™Üðóω-/[Û¢^¶|UY)nŸëòcvÿøAnÇ€¼ùAC÷'m¶íW?r>þá2´Cr·ÉëÄiÐ’;òø{Q-¨ þ•nLOVˆ+é»#ti˜ØGÕ+ܞ׸®yôÕÎV½ÀɘäRèÙÝ' +Z?l |´xŽß…®#)oz•ùÚ  å=¶’„.”òØîO$Ô ˆ——^OÿæMö­3˜>k,;%‚–zjo4Å}ÞWÝ2XàX«‰‘*Þúð<­ Ü7UÕ< HB‡ ððD‡Aš¨_p –’&×èæ¶E‚ñaþ¹G¡s– âÝ*\E„x˜Ý4m‡£§ÒßÂüèkØÙt„¹MQ¾Òþ¡¼À8r}(¿Å y åñ}r¯EJÄþù}sŠE?R½nRp$7Äng~ —¤W WC>^¤F'ÂM õsS'upb¼—xB4Ž ^±è‹éàéO›ÒCÆ”'\ë®ô:盼í9F˜Ñ³ÛÞÜ<Œp*Ý41–\ZL£üÕm\˜Ÿþ6—]{Áµõþ>>@nƒbvò.'QÊ©i¯¤'·_ˆÊõ )‡VIG ±ØÁzRø€dß¾óq6gíÒrfüeØ|Ï<šJ1÷³vAX ~îã1Cƒ Ñ“ðºÍ»Õ&|D¬föИþºš ±5zäŒG´²GˆªK&ÀJƒ|–Å8Æ .Kc&ÛÉvÌd‹¥ÑSòl ñ¶Ê»°moé˜Ðÿ çì?Ç {ëÀ (XZcm ›õÙˆ±ÆœHMÍüçE9KÍáëбeŒôñ(7©«V€U`u†_ü¨ƒlpE¢.V‘Þà–!(iì±€ên›.° +i£`²ø9l 4‘tCNÑ9WˆÅP'´çxF¹ƒŠˆ> endobj -2106 0 obj << -/D [2104 0 R /XYZ 56.6929 794.5015 null] +/Parent 2103 0 R >> endobj 2107 0 obj << -/D [2104 0 R /XYZ 56.6929 752.3759 null] +/D [2105 0 R /XYZ 56.6929 794.5015 null] >> endobj 2108 0 obj << -/D [2104 0 R /XYZ 56.6929 668.0781 null] +/D [2105 0 R /XYZ 56.6929 703.1515 null] >> endobj 2109 0 obj << -/D [2104 0 R /XYZ 56.6929 607.6906 null] ->> endobj -698 0 obj << -/D [2104 0 R /XYZ 56.6929 570.577 null] +/D [2105 0 R /XYZ 56.6929 603.3192 null] >> endobj 2110 0 obj << -/D [2104 0 R /XYZ 56.6929 534.8112 null] +/D [2105 0 R /XYZ 56.6929 540.5015 null] +>> endobj +698 0 obj << +/D [2105 0 R /XYZ 56.6929 501.6992 null] >> endobj 2111 0 obj << -/D [2104 0 R /XYZ 56.6929 503.6098 null] +/D [2105 0 R /XYZ 56.6929 468.7926 null] >> endobj 2112 0 obj << -/D [2104 0 R /XYZ 56.6929 440.3004 null] +/D [2105 0 R /XYZ 56.6929 433.2488 null] >> endobj 2113 0 obj << -/D [2104 0 R /XYZ 56.6929 370.9227 null] +/D [2105 0 R /XYZ 56.6929 367.5092 null] +>> endobj +2114 0 obj << +/D [2105 0 R /XYZ 56.6929 307.6563 null] +>> endobj +2104 0 obj << +/Font << /F37 803 0 R /F53 1032 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R /F39 900 0 R /F48 955 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2117 0 obj << +/Length 2228 +/Filter /FlateDecode +>> +stream +xÚ­YYsÜ6~ׯ˜òKFµAëʃlËŽœHVbeË•ãšáh¸æ1r4+o忧n€ä„ñQ»¥‡îƇ¾‰‡?1K4ã*f&˜æBÏ–Õ ŸÝÃÜ«A< Ï´r=»=ùú¥2³”¥±Œg·ë¬„ñ$³ÛÕ/óó››‹ë—ïNRóù3vºÐœÏ¯Î¯:ÿi7§©œŸ¿ºx Ÿ2210 ÉN»}ýõK­òUš2ik–•üãõ‹çìù›ë—–õäâ6Ø;Ü“àÊûûÉ/¿ñÙ +¶öú„3•&zv€ÎDšÊYuiÅt¤”§”'oO~³néFZ%L'ÒL€‰)tÊb%•ÛÊ*_gû²[´Í~·ÌÙjµËÛvñ# +rˆ‚Ð’‰€A–e¶oó°3Ñü°)–;TóeV#í.Gp­Ò5HióŽ›—7Îeõ*bbãNE2_³µÒ~ƒ¥  -‚m !Xªµt&×6_vÅC^>ž +!æî€a ‘°ThÄá|Ýå;%Î&·ùz‘`&1ÞÚ|÷üÅÎB©$"¶÷ùã¡qF¬Î¬ð”6 ZHŽ»¬Ë«¼î𳨗å~å…¯ ¶Ý®¨ï‘äÁ¶¼mo´lš¶«³*ÇU i †„u³Càð;©õ7Щ¤œ£po-`oÃHÆóÛŸém·K6Y‹ƒnƒ +süÜ6m[Ü•´ˆ\çŸ8KmXœFià”'–*™ÏÙ„Í hbØ6»nBŠ4°u!‰ÉúÝ„9œqc¼ +tº#i©~¼4“ñ0I·S‡¼J$Dk,ÆÐWûÖºA¬æUÖ¹S†!žnщXR³Æß œ|;ú,(ê‘5ÿ•sYæ`ž‚xë©!7ª÷ÕóK+ §° œ/¥x~ +i ,›º†0#¾†\®C°¹= +‚zi¡yú9HÇp&iâÒ‡°ÕâCÆö`ìž¹š_dîØÆÚðÈ㔉ˆæK Pfïs!EÏ›mw*æESg%,îN°ÐzÞ)0c& ÔJW£ì>)Ô†TH›Ý”HÁbüû³êW,ÑÒ׋† Ž«uá1i< e•Œ!s'îE'#ç†ðë\výHÄ ñQuV$Å´dX],Ë‘éóëÈídñ€,bt$?šÓ¤dœ§>§ Â8âÖ5ïÁq|(:ð¯Hpç&–R¬€ví +„%`±€’ù’c©˜<ìÈ…¦¬I¸§…IÌ (hd†ËîvÐ<ŸH2GGÙM¡RhU”wˬ¼ov°›j*È!9 å}wèS‘R”Š”’ó¼^î· NôBÝçÚ;³9³ÑLØFÅïêÕrêH ¥÷LÖŬDØÛSA-\îwèuW>âdSãHο½:¾¸z¡'™j%lj«wìB";_¹ØNœ1cÝ”espÞÔ»G¤føÙæK´£CrH‰0½‚±)ºËœÙ ê@XÖæ‹8B* Ù¬¨Ñ0²CÞîWí8±ãÉÏÂÆÍÀ­”ðåè½J¾³qA‚Ê&wAâVÍÞµvüû¾éÈÇ&bá°`BïÓ縎ºlªÊ¹ Ùc‹TwÆ@¹Ïë|®OÔ ­v[ª·ÛŽ­—¡ü ­éÏ6%’Z˜yvyý™S$lcs¿Ëª W$Ü=thv¬«.|ìÑÌ8úšz æOõ¦)dî³–hïèl)™Fˆ‚ýíQpgĤЦ±?ß3üÄnÓôô8æàr&¹ñ!]UÎ×ò©Ø—L&Ü7ÑxHOV¶dáûº9Ôd^;¥“',R‘UQª˜PAéA¬ãÚÞ­†a‹ÐÅÔ1˜P‡€‚íP:„æ3bnz˜_ã+œñ›Šm²Ýwlbc2ÖL‡‚ýq,#ãªÁVŠAÓ¡îvSl‘„…ÅŽÐEílJ–ï;ªÇh<•rìs>l³‡¬(³£> TYM¹}„†ªj)¼Íó£B}ñîüêæû b¶åÖËpæ¨Yµõ +l‡Š^µ¯×9‡^¬‡/˜¼¶)Ã^ÕRƒ)Ãë¨Xp“ˆíýÈÝìÒ[—ã@YÌùü¿/{„K¸]S§($ð—Í2+í5íéT +õKðÂñJ†ï§tÕkB—ü#ƒŠœÀ%jxMufµŸ´Ú©6ÉÿO5$ênø=©[ôºeD‹‚æ#úÛÉ›Ú!ÞQìH+­žâðéÈÉĽIñO"8èA"{ä›*[.ª•žÜŒ­9ZÊçOâ—WëGêMû!*ïdôæ2—Å«‹i¹eùúÍ?ÊO¾ü4‚Ñ„ê—ì þû ˆÑܱ=ùQ}{™ÜÄϾ;¤?Þ®Õ¿~þnÿÃ7ß<ù4òG©kÑÇg‰{“e½tùÞç ·¬»æ!GZþwDg Š"úDÃéÔßöéfr]¿ª(8‘ˆ-– +o:¼¿Z«ˆkà”–ü+×\HÃ8ü øÈ…Il( (°¼ÄÂì6=¼ºÿÕö?æyÔendstream +endobj +2116 0 obj << +/Type /Page +/Contents 2117 0 R +/Resources 2115 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2103 0 R +>> endobj +2118 0 obj << +/D [2116 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2119 0 obj << +/D [2116 0 R /XYZ 85.0394 513.4321 null] +>> endobj +2115 0 obj << +/Font << /F37 803 0 R /F53 1032 0 R /F41 940 0 R /F23 738 0 R /F21 714 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2122 0 obj << +/Length 2274 +/Filter /FlateDecode +>> +stream +xÚ¥YKoã8¾çWs²1‡o‘{ó$™Þ ¦“ž$=X »Š­$BË’×’“ÍbüVñ!Ë6§1‘T©X¬ÇWU4Qøc#¥‰¶ÜŽ2+‰¢LæË:z€wNX ™F¢éê×Û“_~ÙÈ«¹ÝÞxBa£ÛÅ—ñ¯„ 2t|}yv:=½ºüíÃùådʬÌäxöéÓùåÙÅ¿&S®(%¥ã³Ëϳ?üÚ§‰åãÙ‡ó›É·ÛßOÎo{±†¢3*P¦Ÿ|ùFG 8Áï'”kÔè&”0kùhy"• J +Wª“›“?{†ƒ·îÓ¤*%\hžÐ)](K´€W¨‹‹{<P²¥!Xw¤X׋9[°ñ´Å'wEÛµÅú©X‡o‡»d†)·eë¿Ü´Å"|ûXÔ‰•$™j¸å!kÎI–e‘蹬*Ï}ÞÔu1ïÂ_ ºqSûgÕÌóê±iéªYwþ…JDIËú¡Õ¯}/^üŽÆؘ €£)ÓŠ)$Œ aš+'Û-:Hã塨‹uÞ~–ûÇ:¯ÍÒÛb¾ž03.:?.»Ç„Š˜ÍjÊ:šÂÉïz…u¥Áa¸ˆvø‡§f@1åÔf@é;¢áKw©g“©È,X`¹ª +8£ßfDzŠhɆÎD{‚µÊˆÊ ”_)åUñód*AÙe=¯6 gÜÎYF˜ Æ /«¿•½ð„ÑXw|qWøçóºì:8¨gÛ Ùàí€æäà`s«w²6›nµé(£ãÓf¹,ja +Ë …0×ÌŠxN1áê”H.¢Ö@Š#K„Ê¢‰A©Ýº©Ú”bÁ@ð@‡ê +”°õîv̵߬$€71Öê|Y,^³›æ„kI½º¢·Wmˆ‚ÕºD„¨|Hdì£æ.o‹©–?6š(c² ÚfÞ,ŠÄ9¤%†qóVÈ0«‰D€Ý‘»˜?‚Ô’ÄOßëæ¹öãU•ã‘ÿÓù)ªÙ rÿ@ñ‹î'?ùŸì ÇF½“¹ÀŠ˜Ìz—»œ}<÷ç¾9¿ž@Öú nŽÙìâÃçëjóöâê2Å\žëïžigg©>qu¹AÄÄÑ]x ž€ñù°ñXø·.~à™ÏçŪó”>{àj@鲩Û@V/ߊ¾@Þ«+ɨåGZV¨ãû³6ÏÆ]Ø9»aU…ÏÐ%Ã([罌OE]úL‹Ëb3Èû¾tM¯ñíÌÔ—Ø€‰D¹—²}skõ+%€ }×x¤>Êd_,{}yή¬ãV…:Àbå·ö‰­]5µëâêMqeíñbDX"u_™õ­ßk cüÍ h@+,ÕY®×4Dœ5üMQÆ{8¹{ñ\AÜÐIL™VÚݲu¶µlÕ·®\‚Ö0W>/)CÂ(oÐêí*eHåïSUJOµõ«á–x›`™y{ËH”Ør'²`˜AÚÛÙòÌ €Ï¦k–>ó„9 $M&õÀDð×ö’8àØí£»×„í DÌ&Ú¶Ž.’ðG¨Ée¦Å»âBg4f×tû¥]Ì¿Ý<í¹ÙöÒ{. ãó#ˆý”LÚP¬Ñ7›íK‹aÑ× »­¡ÐîZÒìÆÑ3f0I`§]Ç…øâ/‚ÝÈ7Gn-¾¼Û”U‡½•Ÿv ª»wʸôx"¼ºg“¼â +jJÍÙÑÛeÉzà{%¯ÀY©±Ã +gNìV}M8&„õºÛ¬fî®\ øs­ÑJXùÖìiùÕÄfu/dVTŽ±i¥¼vÎJ•sV·zŸoªÎOæÍréA æ¯ê¢òoúUˆ± ƒù ÌbÍDà #¬ªæ9åx’öø=¿¢6šË¥ Ù¦Æ-‹ Èf‚gj7ƒ¾r ˆ¿H)YN¹ýõ¢Ù¿Ðp¿øaø!Þ;ºQî.ï7k×nr!¯üdÀ•Wiõûç¤íÏf«CÃÓ J(†q +•Á„>L$ᇧCÙÿ Sñendstream +endobj +2121 0 obj << +/Type /Page +/Contents 2122 0 R +/Resources 2120 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2103 0 R +>> endobj +2123 0 obj << +/D [2121 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2124 0 obj << +/D [2121 0 R /XYZ 56.6929 613.6539 null] +>> endobj +2125 0 obj << +/D [2121 0 R /XYZ 56.6929 528.5855 null] +>> endobj +2126 0 obj << +/D [2121 0 R /XYZ 56.6929 467.4275 null] +>> endobj +702 0 obj << +/D [2121 0 R /XYZ 56.6929 429.7784 null] +>> endobj +2127 0 obj << +/D [2121 0 R /XYZ 56.6929 393.7775 null] +>> endobj +2128 0 obj << +/D [2121 0 R /XYZ 56.6929 362.3409 null] +>> endobj +2129 0 obj << +/D [2121 0 R /XYZ 56.6929 298.261 null] +>> endobj +2130 0 obj << +/D [2121 0 R /XYZ 56.6929 228.1126 null] +>> endobj +2131 0 obj << +/D [2121 0 R /XYZ 56.6929 131.089 null] +>> endobj +2120 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F48 955 0 R /F41 940 0 R /F39 900 0 R /F53 1032 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2134 0 obj << +/Length 2734 +/Filter /FlateDecode +>> +stream +xÚ¥Z]oÛ6¾Ï¯ð¥Ì,¿Eâ½J×´èÐfy› °íB±äD¨,y–Ü,ûõ;‡¤dI¡ìCŠ¦ŽÈÃsžóÉ°…la¡ÂÊEb%Q”©Åz{Aðîà 4«Žh5¤z{ñæ½H–XÍõâ~3XËj [Üg¿-¯no¯oÞ}üõrÅ]¾%—+EéòóÕÍ/WŸüÜí¥åË«×w—+fe"ˆ ¤ÓtùåæÝ«¾yÿáúæòûŸ.®ï{¶†¬3*§?/~ûƒ.28ÁO”kÔâ~P¬å‹í…T‚()D7S^Ü]ü¿_pðÖ}…†(Óˆ,¸È‚QK½H”%ZÀ+”Å—CUÕ#ÈÙ€\2B·°Òí«l½Z×Õæ1¯PFÉr•††{$‚$"Ñᣴ,ëçÆ“¿ýxóGziýDZe‘]&\+5Ø5²  fjQ[ûr¿þ¡É³°EØ;Û_2³¬w«"ðî~ç»2]çÛ¼jÿá¦ÞyM–w_¬8—m+ƈUŠûãEOÀ,*¹ø˜&Ê&I ùÁƒî¹hŸü¨ªýsý”Vyã´a²}Êý ÿ«hZÔ‡qà™zžß¼—#¦à*éåZ¥Û<#¨Îsšƒ +tGú;¥¼ÌIC’ ã0å‘å•"ÝÒQ¡‚”V ëW.®‡F⑇»ð&‚S89%:™Š3WØÎOõ6)_Û¤ü÷èOƒñek@$yåõ)xJˆ-À7aÊŠxÀ +D«!•wÒ,°z*'òÏ(ØïHäÆö +ÿš¿4Åßù”5±!Ií'yë©"Ì´,Áv”ecîîvùº@«FO%$÷ +Ž#7ª7“Wé†U[¬ƒÀ98ƒaâ¡hŒºF/?š6Læݳ}Îó@ɪl0PŒã@¸%þCÓ#0&ˆab±,ߤ‡²õê.‚Ú7óÚæšXÎÍm¨Nh»£rÚ^Ç´ æ-˜:j{S”m'„1yšµŽ(ÂÚXלPÄ׈·_BlF«¸ÇÐNïfãNƒ‚'¶jâ4†±®Ahm^ü4¼LË6ßW!¤ÐeY¯Óã—è°#öoÅ ‚X{Í‘Lˆá´sc³ªWgi9—™vªRÍ«¾§rbzšn o¥”g¶ìˆ"[Og-‘\M¶¼Ý!¢.‚£ÔŸê}0„æ°Ý¦û €z3É@¼Êº«€ŒÔ¹ÊÇCŸY9}ÆÃ7ç<ùÎ…‡àgUþ[hÊϨf@uB5•SÍ×ïñÁZf}ðIÞŽ>ø5sQ<ânäƒ1— :ÒÞ©âÀ±æF^Ÿ±àhê–»0/!>lß?a­óÉ8êRïÔ?¾¥e‘ùaVoÓ¢:r@N¸àûWS_üÚ áìÊÈa™°:eÑú,l˜!ŒCéx6ª°é¨lvga³Ck›bl<ßI¾:¢_#Äp2ÐÆÆQÛ4à`]ƒÍ»@j•+Aª¼ôo§nôü”‡,?b×R8®Å0ÛŠhFHbE_'•PËäU`ÅeÝžØ|œ ²³ñ•Ü6Vw ¨ ©”gJGJd¿) :‘ÆáΡRRˆycãÙÌÔ7 &Ø€“œñACªy0õTLû˜ ˜7¢·P\½æ +‚„5æ4w=U„½¦ÄCÙ˜¿1¦”D ”Z6õÁémûi— ÂÓsëi²´Mý¬×> B èJ\$ñÅeÁKÕûâoç¤@‰š W…â»@¤ 8u{ÝZ¢„ì=Ž/]›@ÝÖ—zYí|§fP~·~jçÑö­Èr?+YX•°]ýñ&Ë¿½ çŠ1ƒ.»Ïxö~U,;Áe‚ßõûÃÅ:wh8´ã¯‡! %Š/K‡§ß¹Ê›ÆŸšÑBM*Õ¦÷ìµ×Á]ÕîÐ’È) ö¡8Á øŒ×cB&<šÙÀô:…è.gŸB¡å*o¤(÷þ雼®Z1¡¢—GácPµài'æ쀆BtY¦¦>zÁïÐ8‚™¢\¤™Ÿö²íÒ§§ âK µtHVÓÒÓ€>yDŽ\¨/‡‰E•aPî zl”LtïœC¿Æ¨¦˜ >4Ð=„‹gŸuhÂbÏD)l‡Tó­§r­9[ê¤Y¶pŽ•:'YëK׬EKo㔊wúçlùñÖO k.6âTTdï¨dɹ¨(3FO£"®î{Q° q¶ÐîÇ0^ºoæã%dE„[ñïâ¥w¥P2©¿3y— e]ïÒõ×P*Œ$è +î„ž›Ç":riΔÝCªXì¨Ûhp…ì©ÓÙúi_×-¶‚¦`„,Ój(0O2×SE¸ÇVN¬ùŽØ •·µ]åmí\å éž0êL»Ž'ZN+o\²öÏcåm}gךA¬Þ‡7'9e’G¼Mï{‘eé—­N7É;×®ý¶’àæ¯Â«4[…’‚ °b3éÑgžÍ{eö±{Lqá8ÚÛĤælôèÍ50Ëú"–Ïû¢½wí:ÒðÛ «„¼ä[ ðAq¶‚~"fxÙôDÞí‹ež°%¬?ÙuSœ{À©—c$(›q$èÍr(àXû7!‰æg}%ÖŠ³µ8ìƲÓ<¤š·àžÊAýp¶Ö‚0·Ÿ«µNòÕ×Z¯ùŠÖZ#Æ‚í:u9ÛÕr¾k–$ŠéšYÎìÔv{(IßiïÀíõsåÒ)n&û“YÁ!_¤öûÐÝùú«L[7‘ƒ&Š(Ú×åï·«à•ïi`ñ´lºSöñ9 @aŠOíâuU¾LbÐ1{¤Ë¢š¼> endobj +2135 0 obj << +/D [2133 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2136 0 obj << +/D [2133 0 R /XYZ 85.0394 229.9393 null] >> endobj -2114 0 obj << -/D [2104 0 R /XYZ 56.6929 274.6697 null] +2137 0 obj << +/D [2133 0 R /XYZ 85.0394 85.432 null] >> endobj -2103 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> +2132 0 obj << +/Font << /F37 803 0 R /F23 738 0 R /F21 714 0 R /F41 940 0 R /F55 1040 0 R /F48 955 0 R /F39 900 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2117 0 obj << -/Length 2188 +2140 0 obj << +/Length 317 /Filter /FlateDecode >> stream -xÚ¥Y[oÛ¸~ϯð£¬YÞE>¦m¶'‹6ÍiR`Ý}P,9*K^Inýõgx“%™¶ÏÁA€ˆ¢Fäpæ›ofd²ÀðGJ Ì4_¤š#‰X¬¶WxñÏ>]/³ B˱Ôû§«w¿²t¡‘–T.žÖ£µÂJ‘ÅSþGróðp{ÿñî÷ë%8y®—ãäËÍý÷›ÏnîáZÓäæÓíãõ’hžr"ÌÈIœ|»ÿøaùáëý¯Ÿnï¯ÿzúíêöiPk¬:ÁÌèô÷ÕáE'øí -#¦•X¼Â FDkºØ^qÁàŒ…™êêñêߣ§öÕ˜)¸PHP.KA‘Â4n/Œ°€ó/SNÔú`/Jbö -RÆ^ËÍüœp<Î9YŒ;Ú2E¶d£-µFœŠÙ–mY÷sFæ.ݦi{?Üo·Yûænšµ»ö›ÂOìú²©ÃËuîí5QÉË~[ ÷9×Ì”kD)Má F‘¶ÎWËUS¯_ŠÚK•—àʨFGxðVO AŠyÁ5#©3® RÖ5?œRBŒ$€Ì+õ£x«³m1W0…Ò4Uçu¤"Êí@8C©ÐdªÝã®X•bL kq|$Rn`U³#çÇ‘Œ1½e{˜¬ûr•ÏV „€Í—ŒªäiSú=¶û®w£g¿Pæ.?³ªÌÝ0o¶YY4°Ž[,Ý™96AZjñp•ël_yÂnÖð|ì"I‘P\Œ¡cÔ<† O‘¢X^‚”æ•a?Àf,u6ƒ”…Íî"lv&Ú昡™óÕ+Eôš † -°œ)6A Ó f°j æM03-’Õ&«ë¢rO¬¦vôº)l”±¸ÆÁ0Ïx=x†q¤Y¤ª²ë‹Ú«²nÚ  -l¾ò$cÔYÛ]›md[€×1ç#LDv“ñaS@tÊ•ÅE%ÇaJø–s4Ú+¸ï4˜¨BÄíy0¤Î€)HY0µ0i$"×l×euÌB’„Vê¼vƒTD½ ¦ä…ÉT¿)¦7|À„Hºfoý¶*Ü´! suÚ:™<ë37ë¼HE DT¿8‡P³,°TÓ–ÿX’'JÊ’;¿¦œÂËη ÆgŒÓ½ê@*)0•åNI’ºéÝÔΡíg™n"‹P! -*íð./~¾óçŠ$1•88˜ӬZü½/2wÝþ°D¹*~17þÐV¿† 2¶¨yh)®nçºè:wj¢¤É"Û•eÀ2Ÿ—®=]—õnߣÈ)•©Ž(™À ôŒœQHÄxìÑLLÇùÈg œ6[õ…±Ž†µ†—lÝÕ,Xù9àˆRŒE‰MfƒñMRÕÀ´³p¶@3F„ª®Øe/¸ßwEîfÊp‘ånÚÙ6”=Ö?Ö&rê³<·GÍ*'þÜ;R®<‡’Áx ƘŠHåË:7I9@´ßd½ÛuæCxf}èÎO¡—©b3Ôoš}勵gŸrÍÙOšºœ%´±ÔiB¤,¡u±ìˆeƒ…²v­»lìJ~*ví[älì‚•)ÑóØ Ä“®èඃ浶å”®gûO‹YF¡^Äú¿C>@ß ìàËv© °•ùñASúòÀ½ÓÏUðbÐK²ª §òsî @˜Ïʽ¦®Þf9èP=šJoöð ã¯Y…ÿ4¶É|¢*ç­`ZáRñ‹/£ìq=ÖPŠA»‹¥4jBM‚Ýg›Ûßo¾<|¾}Œœ»W8q­Õ“ùNÚx•ªªyØ”CÞdš\HèÔ$¡Ê}s\º‘G*Œj/5ÇÞ©°…†±â˾µ=Ø/nÖS¶ƒ•mº”PÖ`jØr £éñ¿¥Ä8xÞRK0,¡A+MÓd†™»tÙvWE) Æ&¸6;ÇûÅ縶;Øo"Øt­¯Zv ”å®Ãœ'?l¿pÞ1MJÛT]Œ5µ) ¹ØlY †DŽš†/h$EÖézˆ@ÿÖèÜ{‹=ûÃ8gšÐ0we’(%¦´“³†¡hû€ 0x1/´×óq‚8i_m(.xâ"r†Ä•j}:‘pÃÓ8{¼½uûÜ|~üz9ØÌêb(¿à ȘbôÀv$mW¤Mû ¢DÀÔû»ûþ#’W*ßBÿÚõK§’oÅÚVõʇæ~ÇKÓRÊIÞ=¢iƒ €ÙÄ.7ߟþõõÛeƒÜÕЎׅ§ÄGûÕÄóßè5š¶/÷ÛS?ÑÀ†æw•HVŃŠÿ÷Ï7‡Ÿ© ÊfJÑx~f˜ A)s8ÂÄ\uÁ òV€µcÝÿ* -zendstream +xÚ¥’AOÂ@…ïû+öØ:Îì춻Ç!ZJbB8  jŒÿÞ-X¨OfO3ófòÞ—%‰þ‘41ÄN9™8 ÉȧR |ñ³ MÔˆ¢¶ªSˆ›>'Ò‹U,‹çÖ- h-Ébµ:@ ¡?Á4ïu£î8ï²<ŒÈéDéd’å½ác)ƒ^안Á}šÏÓ»co:¤ƒl.‹‘ÈŠ“­¶uB®=½‹ÅåÊ' vÖÈO_ sJ–B£™›Î›˜‰‡ÓÁÖô°z!(ŽÕŠ$8cÔ/ÆAÌŠ0Òyq;žÖA¼œ[èPFJƒÓ¤ºá¦Zï6ëêH`öµ¯ÖåþXt·›ývW½~”ñ`uˆ+îñdð߬ÎB'ÀÖª3†v.•ðËqcªGl/¬7T/½óbendstream endobj -2116 0 obj << +2139 0 obj << /Type /Page -/Contents 2117 0 R -/Resources 2115 0 R +/Contents 2140 0 R +/Resources 2138 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2102 0 R +/Parent 2103 0 R >> endobj -2118 0 obj << -/D [2116 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2119 0 obj << -/D [2116 0 R /XYZ 85.0394 400.4859 null] ->> endobj -2120 0 obj << -/D [2116 0 R /XYZ 85.0394 274.6805 null] +2141 0 obj << +/D [2139 0 R /XYZ 56.6929 794.5015 null] >> endobj -2121 0 obj << -/D [2116 0 R /XYZ 85.0394 214.6285 null] +2142 0 obj << +/D [2139 0 R /XYZ 56.6929 752.4085 null] >> endobj -2115 0 obj << -/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F55 1035 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> +2138 0 obj << +/Font << /F37 803 0 R /F21 714 0 R /F23 738 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1592 0 obj -[702 0 R /Fit] +1610 0 obj +[706 0 R /Fit] endobj -1447 0 obj -[702 0 R /Fit] +1463 0 obj +[706 0 R /Fit] endobj -1198 0 obj -[702 0 R /Fit] +1215 0 obj +[706 0 R /Fit] endobj -2122 0 obj << +2143 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj -1627 0 obj << +1644 0 obj << /Length1 1628 /Length2 8040 /Length3 532 @@ -9515,7 +9621,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅå‘æ‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ -Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.SU}9=¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 +Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.#5##m¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 @@ -9538,35 +9644,35 @@ $O t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•Ã¸©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6붡²BSHQøר.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôŽ±§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ -*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿFsõ·endstream +*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿõ½endstream endobj -1628 0 obj << +1645 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 67 /LastChar 85 -/Widths 2123 0 R -/BaseFont /ZJTCSQ+URWPalladioL-Bold-Slant_167 -/FontDescriptor 1626 0 R +/Widths 2144 0 R +/BaseFont /WEKWWP+URWPalladioL-Bold-Slant_167 +/FontDescriptor 1643 0 R >> endobj -1626 0 obj << +1643 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /ZJTCSQ+URWPalladioL-Bold-Slant_167 +/FontName /WEKWWP+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/C/D/E/H/I/O/R/S/T/U) -/FontFile 1627 0 R +/FontFile 1644 0 R >> endobj -2123 0 obj +2144 0 obj [722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ] endobj -1608 0 obj << +1626 0 obj << /Length1 1630 /Length2 6133 /Length3 532 @@ -9578,8 +9684,7 @@ x Òy¦§aáèha …«pJí•Ž HÀÈ(ã ±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 -³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`Y=ͧ -ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`ͧòRò†ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK ïeë[ă»4fÖ)Æ»'c£»¶*2‡Ìu•ÙÖ£™øM×E;k"±{åè!6ÙÏgø¹a1ù‰¢§.Ô¶3àéÉS®Þ?pUì!¸?Ñ='g€$NúüVž;»;l"=+±¹ájy4&ôøë´}‚ÄÊ¡æ °Q™Ä´îÃf¤'²š‹8­‚{@|[÷n½.\ex~ûjÂâSÿ ¾jrþ¶áåkï}6KiÕI†ú€±s=Z9;ªîÕÒ/7ö[;_NÉö[BÔrw–mF¨¹]žÒ[¯éÇhy;Iþô|“Pâ±_®Ô(\{Er¿—¤ÿ}á÷,˜4½‘JÿШw‡5Z!tÒ¦(¤Œ2x<κ¶grú>0.;¼½2qøÀaZ.Ë©EL_GHx5tÕ;’T1•\,ék?‹n·‡âø£ÚÌßÒ¸nòTÀÛö• atÜÌ‹•±Õ]ç°ÊÁ†Ó%¿2þÝ{ÕÄÙ )•åŸ‰>§«#lð6šo;Þ^Ùû¡LÿUjIpÈ(F²Ó®èê~ï}=z8Ö>ß’»0?u>Ægòv[?Îú 3MØĺ??Â6ó–¸GK让Ƭ—–Q„tÈ¡f´µ 8™ûÌ⟠é?;©ª•Ò {=ÕtvWŸuéR^.„«È‹zY½Ît+@½^V×^Ml¬oJfE([œ]£–å›'â#å|'OF˜îˆŠÖ¡3ûÀ~.IZÀH)L›‡jªrÌg¬±Þ=•u«Œ†t®q©,xÚ3À-ØËpõL܉'òA€ªC0[&µ{C iÇŠ¤y)>û›çeLcÑ%/³FTU§€ÙÕô¨5« ð ½’•sJÜkŒ "êC 3ó®cUÉÙ4eHÎH~0+¾÷ìEÑOÁY^€ÝˆF›ÍŽTU§h§D´çéíçǽ8IÉ{éBDWžñ»ïÝR±FêÏVë®fûÆʦîíqßÇ´L…ŒJ®GЧzTÅ‚ë—âƒáJM î;£2þñN÷6…OŒHâÑ ìÞv­øózy¥Ïgg)Õ‚«?Y¾„ѼN-áf_6ÄG¦ ‘”Ï w÷‰·8I•w…p¤Y%K:¡–-@2GrMú 4¨oêÞPÀ-Ýë*õk¥sj€#}–ÕǪq.‰ã!Åp£Y2Õ tÌ( ]¡ÀC»ëƒ;hbЀ16gRtVwšÇ>oõ;#m½YÐá³0zuœÎkê @@ -9601,81 +9706,135 @@ V1-S ÐíC¡Ówï»ëÉ“º¿Zèp½÷äOô>/¨lÝ4nlŽ°U-oMôÙ“ˆ o:œ©Í|y„7MT{õ ¯=i3RÇVHA9jQ¾rÁ3ãaÂ3œ´X_¿ÆdhÚ—E/Oö\ìKɬÝOõš_·— &†÷ê$ÀuæbsAƒytN.`.šâb™Ê¥܆€ð6é瘯l¾}êÈg|ëwRŠžhXŠs×L84ØGê} 1Y³mgzÑìÅÓŒ$»9ñNh‹Í”ŸâÕ÷ºXsm{Ôg"'H±¨ª®RU\O¹<Š>ÊlSñ" ‰ôt.CB±|…—(z?п)|Æö…›‡8csa4«ªy=~U»+jð*Ì8Ó“«&ÐÐåÇw?´,IpöÛ7oå¡#½Ëõqw¾}eüJü¢šïUølœ]Rçm‘LغÂ=Îk¡·ÐóKJ;œuY8:B.²åžðŒC\„0&õê®X¨ÕåsÊ;2•©`‡¬#¿Ê"ÿÿátökä÷g\âiì.¯(å»T·RÞç-ɳ/%º‘|™÷ó§qWru?̦hΑê¼7ôòÀ…U^ÎK:%į v›AŸ7pè1ÌÇÛtOn4 ¹Ø+`‹ï—Rp 36‚FŊݹÎ%:b‰»•¯·0Î&SwjÒ V‹­C%#N^©Û™KuÓÏy,ÅEŸq&¨ãò8¿ªÊ{D LGÌ8½UTmÚ5leUÍ?6¹6ÞÒ6!-+ÁöŽ·¶¯T(wu9eQ–éáö:Jmš»4 û_}ö~N†ŒÁOkôÚ‹Ö»µ§½Mìð}íîɲư™qÀ“ë`Á+–»5ãéö×­d[%˦×÷[M–ŠÁÃ#ߦT\Ú*wqªÝ¯¢Øg”‰˜÷Õžà$²dß]Í|®yó9¾è?)ì#IiwñùŠ€%z :õÔÝ3°ˆKzW†Fc¾òm={‚ú³8uL‚ÂôwÌY«|í»U&›±”n{ÀeóbL=Xûy*áwSYø"FžN†j×'›<ºÚyÍ7Ì4`u¹§h‚Žï›Ô'¥o¡í×ðê•Ã=)2—½«ÓõYæ©9rd…Y¾qÏà`ÞrR‚›FWM†Ð¬Œz¬ì^ãë[‹=Cù¹‘©nßíÈQ”iÇ5ÒoÔôÈ[A}s…mºŠf?´?“½Ë’: Ÿ’òÏ -M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿ'yžendstream +M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿñyœendstream endobj -1609 0 obj << +1627 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 66 /LastChar 78 -/Widths 2124 0 R -/BaseFont /DGWQKG+URWPalladioL-BoldItal -/FontDescriptor 1607 0 R +/Widths 2145 0 R +/BaseFont /QKFAFZ+URWPalladioL-BoldItal +/FontDescriptor 1625 0 R >> endobj -1607 0 obj << +1625 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 -/FontName /DGWQKG+URWPalladioL-BoldItal +/FontName /QKFAFZ+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 /FontBBox [-170 -300 1073 935] /Flags 4 /CharSet (/B/D/I/N) -/FontFile 1608 0 R +/FontFile 1626 0 R >> endobj -2124 0 obj +2145 0 obj [667 0 778 0 0 0 0 389 0 0 0 0 778 ] endobj -1383 0 obj << +1399 0 obj << /Length1 771 /Length2 1151 /Length3 532 -/Length 1713 +/Length 1712 /Filter /FlateDecode >> stream -xÚíRkTSW‘ª¡¬òRIÕzX%2yj   `, ‰¹7ä–ä^z¹¤D|PIU–EltÉST” -«Š@} Ô«0|‘VXŽƒT­Š€¯¹`]]¥?g~ÍšsþœýíïìýïlšG”Œ!‚°p(† “#ÁR©„Ãä™Í¦ÐhÁ8¬  Q°p¡Óî -Àæ y+„<>…‚±tŽ¤ª àLŸ$ñH ãˆR©‚PÃZ²†R¡2L‰À„ D X7y#¬ƒ3`<†˜@ˆ’áT¥°&5IPøoaH—þ.• ã¤(à5%“H‘†j ‚UÖŒì“Zþ²¦Õi4kÚÉòSNý%¯Ð"Ãï L›®#`H1ÆÑéÔXø­8) !:íô¬„Ph¥MÕÀ€ÁYÉd¯|‹#¡ˆ†¢B©*…&žÂaš®„ôoJ+V'yÿþµSÉ(‚цt°ÿ`OÅœ?bÒ$у6“ÍæDr¿;%Mk&F•„ ©€Ëó -W(ä‘9A!X`=©˜ÅD1‚¼Hgr€ -Ã)“ÿêÃ, œ‘1‰¾¸€•:9{¤{“Ø_Ÿ„éŒ\ÀàòÈV앾€Ïcçü‰¨Ôá8ŒSãCô.V!¤§0¬‡•ëMLé·õÓ}§·×䊫:ÙÓ3šlm?¿í”Ù9Üëçroü)þè7çmΟ"ÇJF"¿aA*^õ´(Ûb”±¶õ8[Ýèûe³*‡“g\.kký@{pÇ=ëâÁôFï‡?{>»›yÞ¾nõ}¿’:R8³æÖÍWOrÓ6uôY¾†<‡J(IegVï…åÿ¼[tuâAV…Y«/ÏOÜÿÌõµ•Úz§;í¶£Y`*“ÚÝ0û¿œÃ¦ëUýδÅÖ¸RA„L8{¡Ïuy¹Ø|èïaŽ hnŠ”þ:{ ‹.ð0¿ß-ÉÏ) •ÄŒ.8V᢬Y ñ«¦ÚÂõ­ë[´èÅ‚Áúµù.iõ\ÿbNzã^Úº”ñW´ß–ìœù4éÅ‹ÞçoLÔ–‡J£‡û‰±Þ¾3½¼‡éílªýµ/,ñ -õW÷Q`x¯Ã*S›öïýÙÍcR'¸‘çvóèžV.å¾p\»¯üoÒõÞß6Yö$Šõ6‚øKèÇý•þu©Åt€›œÐ›r6ú–÷åÚ† U!®µ3“,M¡¡UKšfc=Aó=\úÍu%Fõ.ëÅn}Ñõ¹lÞÄø¢ãBŸƒÝ/ý†~*‰±4ŽñY”k?´eAÚ.æƒèåFß_íÎGÖ¦:}kOZ~œ·lÍX»/íxMdÍv­á±`ÎÞc‚úG»òìsOEM?¨Êð"Pç¹éÙrzmÕÚÇ„SQÔ‹Ê&x¶¥ÅÑÁãÆLîÙO6ðüS_wYw¨Ú¸{ÓÃÇ·V.Ú±"tèïPÓÅŸ—ä¾Ù:Ú¦sp7µ'XÑ{ÇÌw~ìC[ÎrÖyúÇ}³4 …Zwác«Ö2¸Îªh#[ï]hÛ?Aƒš+µµn4Èmðr"ÕËên‘º~/yêŽZšÓMÛC ÚáW'«Jä¬ÜÁžU§|<ˆÕc•BT¶TrZ³ÜfÆ™cOJÜŸá›^ ç7”ï‚oWD­­˜ð¿Û5¡Ës½2RØñË™R•ôM‚loÊ|U–Aß9/«©«tS¹>˜áµõÌ'Æ/¹_65n¶™‡¯‘DAßÙªÛ·_w½.wÔr¶Ä -ôÜçGã:òíÞÏ)Œ R?CMKëÆôûëÂKûŽî¼”óa宗ܽT\òÚ6^^7Ôn[–x˜+tiT6Ö›ö\¬,vüX® ÆK£ó•m·“·D KëNìvØÁ9¤Î.îš[ÐëœÌψqóÜï›éâ6ìÚÁ¦[^ýÌà'S~q—ú÷Y­Ò·«ðÈn“€Xþõ<‡G>s6rh÷ãê½JÖ¹}ÝlØ Ò˜ñã.b T=üíb«~?')Ð?¾/ùLäM·Kuç«ìë +f&š«—4ÏÆ{ýæ;ùØ/ôšk#L0EåNã…MÑ}åÙl;îÄø¢c=/¼†~,‰24öX”k9´yAêNæýÈå:Ïß-Î…Ö%k»<ëN¾Ÿ·l/™í±7õXmhí6µöΞ£ü†‡EEöÙ'ÂæïåD¨w Ýøt¹k;cýåºG¤MQøóªd&ç{¦µ #0Óñq]&çÌšõ\¯„”W=>‡×¬ÑíÚøàÑÍ•‹¶¯§ ¬zùô4ѧ%¹¯·ŒöeXÙŠš;âØÝ£¥·¿ïGùƒ›Ï´ÍpöŽýj©O+½þü/c«"Ü9¶ŠH[çVh>0Á€[ªÔu ØÁtÉO–âbt4Hì¿?qÄ -iúm$ãÐËÕ%Ѭ\S望Näê±*&]*>¥Zn6ãö̱Ç%Ž¦§Ä¦Wƒy;aß[•áëF+'¼ïtOdäÙ_)ìüùô +‰Bò:^º'y¾"K«éš—ÕÜ]¶À¦Bãïî²åôÝçœ/Né›6™Í#ÂÄáð7æÊŽm×ì¯G[«¡Í1| çÙ‘ØÎ|‹ws +CèôO0ýÒú1;úà2Sÿ‘³¢Þ/0Üq‰v,•¼2‹®ê0/O8ÄØ5É›ô»/T[­ò'Ê"óåí·’6‡ Kêï²ÚTfwÏ-h™µpǦŸ-Ë”V~¹Îç/?3úl ·ßwη΋‹”$œ”sb¨HTs 宨78û™ïwïÁïXŒ.ys¦´°à¹IÙwÚ³¢X<|¹Kx³m7£®[Õ\SV°[2·Öný;A6‡:. ®Úxïê(îà~Ò>N_F¾xr¹Ã×Úä"( Gÿ0¨uuŒnŬÃúšìÚ}™yyÂ2¿îë;G”I×Êó~Æ¢¤ô‰öê}s ¨<–Oû,b1ßbÖ½®Ä}úMr op켨5ñjïç£;x/Œ‰,×Ä"w¹ª‡;ϸáIVø¡üjzÝû?\´ÿøŸ( W!2‚ÄÕ2"•ö'?$Œ¬endstream endobj -1384 0 obj << +1400 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2125 0 R +/Encoding 2146 0 R /FirstChar 60 /LastChar 62 -/Widths 2126 0 R -/BaseFont /WVJXVA+CMMI10 -/FontDescriptor 1382 0 R +/Widths 2147 0 R +/BaseFont /JUNOQO+CMMI10 +/FontDescriptor 1398 0 R >> endobj -1382 0 obj << +1398 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /WVJXVA+CMMI10 +/FontName /JUNOQO+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) -/FontFile 1383 0 R +/FontFile 1399 0 R >> endobj -2126 0 obj +2147 0 obj [778 0 778 ] endobj -2125 0 obj << +2146 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj -1062 0 obj << +1139 0 obj << +/Length1 1199 +/Length2 2269 +/Length3 544 +/Length 3058 +/Filter /FlateDecode +>> +stream +xÚíWi<”k2e$²ÄC–f±›ÊnÐ £±S3ÏŒaÌ0‹%kDq²•¥D²äØ+E‹%ÑbJ¡¡T”Š6Êz:Õ{zûö~{ïó|xîûú_×ÿº®ÿ}Ýu#|Ù‹ 5¡ +`.å¦bÍ0ýðë5Ú¤P…uIå·Æ¿ð5]‰vŽT£ì¡³ûa)¢dÕ[õ玶uæï™–kÙ÷YDr eÒ ]+Zí+â6›èÞžôú¾Ïøg…LM¯ÖÊɈ3“^« ³»t¥lY· ¢_[è•‹j!µö‡“‹¯¶+ãEŒ­äžEO–¸›ðßíXq ezKˆ:ÐÂj köñ{½+á½Ùñ^›?ŒpÕn©y‡NO9ì<ˆwªhÍz¾wæaHÆË~A»_d¦öÔÄ>ßë¯xì¡î|÷°ÂKÍ]ÊÑ6gϬ—ÕÛòÙÏÓÀó¥ùùÜ2‹§h¹«Ý/pS7 +n®’?‡«¹½A¨¬<áP2gÑä3ÂQo”áüID>ß#¡ØTÍi#.õÉÒôûErwV¶ÙÎy7‰” ÜÜ;ñ”{Ön;[eø)Àû™kv”ëÜÙA9à:ì82 ©¨÷^^:§Y×L&\g]÷bOàêbUù‰Åƒ ›ýÔSÓûC,îñ¥3‡0zã ×†AU­UõXœË‹‹ÇVe ¾ù•à½nÅ:óëUá´"“7ã-‰:VwïÉß5\‘áñ%s{ºú”~¼]&8Á<™Š£û£oyg$%æì‚ׇüŽÄ[í¾{ëU3b3B¼7UixQÅó€?æ©«#ü /Ÿ²©l+~\ç/£œüõq²ÁÔxŒøT³Õ§»–åáƒÝ—ÖåÊ d:äÙ-ª»«ÃýBS-D£~Ûná®Êœ.åØ«uÉ®*>oXŠ(»èÿÄë²ðÌò}ébºyfql—¯x‰¶§/%J>±®ˆ!i¼=×+ ¾ÿàjÀ欔ñlt_àN‰È'µK³| µ©>/Ú˜„+‡ã®WHl•;º…§üÒ®]œµ² F3ëê<{/1Æ—h£»gÌÕÜìZ‡C¯èö‹í#º}᎙hµb³QÏac@\Q˜4ÂS_ëg`j×Æ_Ñ4;‹š©j’nqÜÃæ#ô»‘aíÀ»7T÷ͯ9‡Ÿ¼\(uÊÜèÑîÁ10/WÜÜG`kʃ ³™¶ÔÀ7*>W´×`*=z ÙÆ4á {¬ÞUÎ?ŒnmHW"‡}þcüdÓ‹O ‡œæ°9Ì›y{<瘩oÍATÛsôŠ­W__¶n Zs{ hµù¨ç­è ÁJxFžKç§Î®KëûÞòµÝ;ªœï 5%§{ÌØŸTçÓO™Y$v'€ãÅVykÞ^x[Œ$n*^ÑÊJ4½.þüÑv4½ éJÑ®ÿíÀØ Å¿5·Î¡U2Ó1ƒJTßÐzXp`Ƭg°Ù”‚‹._çÑ3ÅKE~*.–•ÜÚwìºXV îP»`¡®‰·÷¾²UM„d·eצQ5¥´JÛ#4åp›Õ™;4j¶•cUš"Š#¯#šV!òy{3xv÷óãOZOh+5…ȸL)¸~Õ¯Ð=žy4K9²ÙFþ‘¹^fWÙñ¦1i•×éÏN|A9{Íù:‹–‰òÝŽÁ½Ä<âóØðª›Fb¦Šq©æÎñdqÁM…ìNáÍpñö,y2ÙE>õ÷w¯‹¬ÅÚd»ûìš/¾ د›_ÓsïòÆ qÓ8щj—"â;¿ÉnöÌ@jQ‰Œ@‚M–– +º.7;Ú1ßùLR÷ +—Š@ë±MïKât -Ì +Ùï JX)2·Ä‡‹ŽŒ¨à©®gÔ‚Š¥fëÖÇluÕ¼±†º>k"–cž4}`(˜ìR&è“2u¿éø‚ ‡kígÄiõ‡H!¾Á3²S­l±Ì¬wõÆ4í¿ØOžäv&ð¶Nà’…Õ(<~`ÜØçCí×h,5[ ¯â®Ù˜Y!Ü€¿9¨’.Ô_Ü%‹þ/øÿ þ'HtÈâ0ƒ‰¬ x dC?”Kÿfðªö@·endstream +endobj +1140 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 2143 0 R +/FirstChar 97 +/LastChar 110 +/Widths 2148 0 R +/BaseFont /XZFMMH+NimbusSanL-ReguItal +/FontDescriptor 1138 0 R +>> endobj +1138 0 obj << +/Ascent 712 +/CapHeight 712 +/Descent -213 +/FontName /XZFMMH+NimbusSanL-ReguItal +/ItalicAngle -12 +/StemV 88 +/XHeight 523 +/FontBBox [-178 -284 1108 953] +/Flags 4 +/CharSet (/a/c/n) +/FontFile 1139 0 R +>> endobj +2148 0 obj +[556 0 500 0 0 0 0 0 0 0 0 0 0 556 ] +endobj +1067 0 obj << /Length1 1608 /Length2 7939 /Length3 532 @@ -9686,7 +9845,7 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP£¡O†P@jÅÄÄXòGw$ÌÆ àÐ×1ääææù—åwÀÒýžÛ(˜€íöà G8ÚCзÿãºP(m XÃàP€¼¦–1HCÀ¡¬¡P†:@‘`8@ËÙ³¨Á¬ (('ÀÀÿZ¬ØïÒP|·X²(€r„ZÁn·Aݬ Ž¿]<G(Ò†BÝ~`(€ 쀾í€9XÁ!¿ ÜÚ­9"·ö·¾[0- ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿ž†‘’‚÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† +JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿²‚²‰¡÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† uƒZ|™BX‰¼LLIB—Qdt ( Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke ¸éÛR§ö ]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8 @@ -9718,104 +9877,103 @@ QH; ‡á{__bçâ.°ßþºæó}<¯½kb¶Þý9\¥™àpDË\TL[\a·¿«NüÆW¨œµ>¿¥t®tÉQÀRD‚!$Dr£G¢1¸AÌý¾ ¥Y í–.ç#_©ØÉ#¬w¥Å¹ò«|Sþ?Z:è:”—fÆ×’¸ʵhúÏÈ×XaÛfÚœ¯Ú3™B¶“—£Ìü¤‡uቇôä·ÏÔϾʉltãp)’&ÿT+p•°e –íZ­M31I¡ÒÏL«êÈcýªG’«ô"Hx¾çS•ö$Û_Œ*[£n~OYgÚC¢ã® ø LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a*¦Ûåõú/5 JÔ†½ó'lï 0Kf›/Ð^‰ˆÖ½žO¼¡M [If§€ãC `æÔbï1}ÚU*÷i g#™HÓÄ+¸"î2X|F#êLq¶ÀØÙªþr#g <¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ  -†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüðI)æendstream +†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚü©ù)óendstream endobj -1063 0 obj << +1068 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 36 /LastChar 121 -/Widths 2127 0 R -/BaseFont /TNXFDF+NimbusSanL-Bold -/FontDescriptor 1061 0 R +/Widths 2149 0 R +/BaseFont /GDGZWT+NimbusSanL-Bold +/FontDescriptor 1066 0 R >> endobj -1061 0 obj << +1066 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /TNXFDF+NimbusSanL-Bold +/FontName /GDGZWT+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 /FontBBox [-173 -307 1003 949] /Flags 4 /CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y) -/FontFile 1062 0 R +/FontFile 1067 0 R >> endobj -2127 0 obj +2149 0 obj [556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ] endobj -1059 0 obj << +1064 0 obj << /Length1 1166 -/Length2 8309 +/Length2 8686 /Length3 544 -/Length 9124 -/Filter /FlateDecode ->> -stream -xÚízeTÛÖ-– ‡à „à. îîîN4Òî‚÷àÁ-ÁÝÝBp—sîwî}÷Üû~½o¼îµ÷š«æÚkîY£ªÆ(JufQ 3”ÆÌÎÂÆTÛ›¹@ÕM! -Ìj +àsÛ@C£†Ùþ~ÄA¦0°DÂöŒkX»Ml@v6>¶÷|ÜìÏc6οœù€*Î`{O  -r¶Cž! s{¦îâèhY¨ .Îæ (ÐòyeÿY(îàèá ¶²†é4Õ´é™þaçååšyü…%@P°øöyà -²spü£Ò3…4r~^´Å¹*–¦’`Øíé¬a0G>VVGKSÐsŒjÉÁXéŸ* ±w°ÿƒ -øC3 °3Èü¹)Ö¿ëf qpƒxýGØ ±ø³% GVMØÉ$+ñ?ÉÏ!À¿bV ›ƒ—r‚ÜÍ­Yÿ(©ááúdÿ#l -±ðörtpZšÚAAÞ`KÐóà5uaÎ. o¯ÿø÷€h6‡Í@VÏÛð/öç0ÈòsES˜3بÏÆÂÆÆdûãÿÏ‘áó†Z8@ì<þ•®dj²ªi©+*Ê3þ½÷f‰‰98–D2ê›-¯X 2n‚LñK€ú -ÝØ)[7q\ä딬Ÿâ}2Ç”¥Wº4BâÃ8êÁø¾d7z»{NÊ/IÈKsËQ•÷fèy eì|Tù^N ~“`³ IA“k¯¿¥•ÓC«?¸Æ-oÃ1™žéÃàö -–ÀªOÌHt‹ßñ}n縳.i±¼«tÌå–ã4t\dêÍFÔÏZïÖEη2Úú`¿Lè-Š²FsŽ]Ä!JÞlø*@çìwÓ>ׇ&ª©æˆy²¥@¥]kU>=­rEÞ-çŠÇ™°V£¨ÙaQmL1!h²R%^×àj¸Öl;ÓÛì^R‹×5{/¶ ¸»ßËwU°s:NXµ‘÷ -8ÆßÆûOvj(øÏñTÔ¤\¥+Ö#2\…¿n5;ÿH¯i}¤ß®£Ñå~º9$m`Ƶ'4É)ù6b›•½.†eC[•+ÚËG}*”µ>A¼­dÏGæjøf¬%€Ê4ìªÉ$›Š ÛwÃPoÄd‰÷ú´ÊÈÓƒ8~Gžõ‘÷Èe¦_h‘Q¤Ç‹×g\<©‡3Ѿ¯òJ­’ûÁ«‘e‚gìº N¦bŽO+ÞÀ“îS­™c­Hœ4ÞCØKH÷²m:§dÔ’ÆC»t½€!…Âæ©.—IóÉ^!Øæ¾ÔD’ZÐZ¢˜ÝËMïQ•¦ùÜȇ®CÄTÄZÅ‚zŽz­‹Ä#EÄ7ÏLm}.éF?:ÃÓ¬v­Ä3*ŸH“¾˜sLfZžÓ$Vf‹B4®»%DÚ”6òÛì!Ó7ôRI¿S{ŽØ¸Õü ØKÒG;ë¢Od€V@Sp¾¿–_Û«°ÅníË5n̈XÛØ~ô¡ ½ÖRb…LKúÄ6!T²ªNËg¡å‹Åí„\æ |7AÏâO“fgYPg~ø¡õ´Æϳ譑!†Øç]äÆÀ -eÀ_±2äÀéŠê×Ü÷qóºÄÃfhÙzÇð#e6Pw=3vd[¼¶#mýç;±ýO߇P÷LèLI Š `ßy·bgh¶£ûô•À|ª¿2Õ 1äÔ@ßX ˆãàç¹ÒH_Li¹=YK/0¯§E ÒÀ(èù\²ÈÖ«:˜ðCÃkX[ÐBf µÝ÷l¼ -¥ô€áëÖKŒ× m5X€>ÚíÀ½ æؙԄ(QjiVJÒ˜˜¢`ßÛCÄ9UoðzÙ„íÖðWvªD+žoÜhe…Rj;5ö}_”òWЖõoD…åö|ký—¹&ùü5jÖC±8.’óÓYª´'åÉrö'À+Þ@ÖŠt¦ïØÀf p2:7ßu°%¤STÇ9-g9ÜX–ÙG]td1KâƒÑŠQ¶SF$‰·U¥8:ï¾Ó5Ÿ½OÜÇ'vp¦3gGp|wã›À„J÷Wó¯c¶LLËFÊY7pŠäh·nK.q ¥'Œ/®Â9bŽ‡±Ïw 9_2ÇÐfÊê¶VWdÞ·¸áË™w7‰œ"Óù}R4T˾jVø?âó~:Ãí1~uÊæ|*€Ó”ʱŒ«HÂ@pÎúNšú 7¹á8[³?p~¨y4Ñ5r€»ö£õ5C6Œæѵ,âM˜“ÕQÓ8®‚ùÐùU7 ¬Ûþ§>S+zâŸ[VÑUŠ<¥< s²Ê&:Nð )ÎIJÀÃTãÃX×ò„W• ¥jƒddŸv¤øZ’¾p›Kv£ZmÜ"Osë“(šn­¦ô¶yëŒZ¿gó!™PˆÉVŽõä†þ… k¥Hó'´åå0‰’šÉÍq Ž\±Ÿ‘’® Û¾Õeq_*Z¨ÒZ>ÍÆÀ¸ü¾m!Wò §ØiON²¥:LÆÁ·::¤¼Öe8èšDŽ^®´õÎ÷WàÓ;ú…co÷ -ÓsñŸ¬5ŠN!úŠNÌJiJ¥…+kkŸÏÆròæ¢ß ÛŠ)Äxžcé\Œ>Ð~í.í¯râ<èªëf׌Óy¬VÑ‹ÌYÝn§ FÈK Rd"1f…U´†ÇŠŠ”> ¿¬öH‰Bç9Ÿâ‚â%¨„$‘ûò$,gÊóMV0êôÈ­ž·ñQÔ‡‡´æ¦-‚¢óßÐÙÕþúiU:Ö-/P°Ø/%ëºAwð˜Mwk¾¿úñò›ž¨bØ©ÕEú‹÷1¼»ãÅò—{*7¯ú–eß0_.Ä?”?0: |‹Ô¡b9K½JöòÖ+Ÿ{îÞŸ©p.îë°Fˆàú75ÚT­7¬uÈìrAéÝLK4ýGý?!‘ZîäšeŒ¢#hty0£„†I^Øpw»‹õÄ/&Ä%fV-G¥ôñL8å”çѨHBr¯Ÿ­ùØóå]‘L.÷Þ”*V†Í•êüõ¡KlÜK–C†àh8%QoHZ‘×à-–šÒ‘Ô©2‹áâ"ï4ΡÇ%3£Ë!¾Ê¦ÉZý!üÌ#4øcð©“±¦¨vŠ9dB?(‹N=¦{®žu3$‘dàÝÊP^ãû%æ$±†Øx˜ØŒLûkmË‹‡ýˆ8NkšÈÙR,€ñ9#áEÅè§*ÿc¤7¡ ±sù‘$VƒpÐ3šZäñísG -åƒb3èu¯ÃízSHø”Ç!=ÐSV«ènÞèõÐ`åÍ’ª;qg?Ìj†o+ÌÊ€/F;=!`ž· ÀË!¢Ëþiú)*z‘ñÄïø.ëœØ½ 8Òà4AgÉ—õ:fÞv\JÞàrdqÍxøœ]€GÞ‡¿SÓ“9ïiŸ`ã´U´{*=©›ö„%R–ë×M[«'0¨º~×ÔZ]—röUňaÖ·<šúµìH±Jþu"­îIV5‰¹! ˽/Insã°žÆõªª<{Ïñ5gÝl ‡×;{•¬)’#ÐJ¾çzYÅçµ32%2I)OÊ>IhJãÕµÅWobAnK:B¡&ÐítEM•ËÜf-¾¢®Ë&Iº5?RDƒ} 3ez¯jcCçÀÞ½‘SÐìp)WZ¦gâjpå‰Ë6ÓŽ\‡£;vj¼ÍSl·kVÆäø÷õíþ¬ú6-A~H<ÔVï÷3ÎX7ñߟ&7$S/·ý²Ø£ÕY1ê¢Ø‘Åe5Òlß}Hù nû>…!Í:Äè¼Î/à·ŽýßMHÙµ¢ñsÕÝ"=4‰yz-Ú§ÀNèůzYj”7ÎÏ=k|ëæ] Iš>ÒL£ÄSØùIÌÓJm?IrÈ‚U¥›/ΛaÞñ)ƒ²D>´ïËKÃîÆÕ,ao$ÎdiÀ©ˆ¦7õ­œåê¥Æ7Hõ‰‹^ÃõÕÛÓÚ®Œ¶°ÇÚÆÌ_¦/Ä‘ ØM¢Sl'µII37JDÁxñš®3S¤å;Ü_rÝ’}Ò³ôò^Ü%.)ž7è!73iÓXƒÂ]r+œw"ëȦhá¯àûŒ½Ð Ú´Yä㺾ñüe?¾ [÷§“è‹MóûVö›ºÞwqt–Åw¦‘Ϩ°Óì¬è` „ì¿ßJãóf?6f'õ\ÇŒEià[ÿœ«×¨ØU»zšü[I¹hÜŸ#hÇKIçén ­R¹õ–Öi˜ž‰bш˜×5É/ÔÆu,Ì@{–‡Uºya)¨Ì˜:m/¼_iÿÓRÛå8"ž•‰6/Åfþìû—o bæ ‚¯¶ð^'d¦þ( ÷ÉšƒojþMóSêÌE¤]KS9ðHe&Ôz“Û×@U¥)zâ®|ä!aæÇûë<Ýžœ‚À%»Í=¿¦¡jÐ.‘¨µTW4Ô>½Î¯/¥^6|ð:u›Ð5™ ®õ+.›ÿÒ`þxüJYék!øTB¥(P’êi|`þ®0ymc¤ò+©ž ÐÎÏßDMøÈ© ;ßnF$¾¾xïÍÿ^õÆ·OF4ìJ²Ãþa8÷üL_šfÑÜ;’I—¼@öÃè‹VÊ‘¤¸Ý$l¤Ðn€¬¡¬æ04q|ˆ¿œ§à]Û;˜bù«ã›Ý öìô(Ôjo]º¿?Ásîit;ä -L^e°ls›NäºÔ§ßýšR6úù¤Û°éµÁkkùéÓü½I°±U-«a¾rBïñØ;e9Ïx¡‹K€q("Ãßj¯mµW.~ØÛüÔÚuf«ù)ýûU=¼?R‹ï7éÙ5ĺºWéŽò¹ÊaÉ[Ð4Œ@Çrßg|óy¢X–%}ƒ _l3÷ó*CÈz:â0ÂÈ(PóÇŽZÝô†vÌ£1Í5KUFêçöóÉ„¨Bß¹DóV¿ý\öâ•GþÐò$uI“!š›*«±5í1ÀÌD(©u›P¹©üò®¤Ãóãõ€2^DõÚTnÀo—£AÜžÈ77lŽ×¿2+ó33£‚…VØsùÜÁ&ùK - - ×yLˆßº§(Pœ(4Ä3dBmÝkÇ–?v7‹]çì£ PܹïÏ›ËèÓ}@ NdàÛæ]KT/¶@\¤·t‡Ÿ1jà1†œ]ú?p»~ˆÎV”PMy­ŸÍ~ÙçºtóÒ¾_ûᦗGPòÓu-+{Nüß"pÉU‰¹ýÕê-¨Æ·`EF^pÈ}‚%ׂ,”Á—¤O3‡PÍ2E4ÉGÿëaµÎ à§6Õ}›ê×4Q㦷^ÓÙw›«Z+J6lrÎ # s Ð<£ä3ÐfÅç¢ -ð(8ôðY&Ò”}„yäÖ5ð±KêÑ&Ek)Oá†x°ñîs=BˆFÆðïDœxѯÁÛìÍ㓶‹]Õ¼ô½Ó lIÃÏ6<<*°OÖehÞÁ»GÝ„1S¯¿–Z£K§ïË·nN ¾X{\»€#P/ö梢֜«8Ö–¨²²5 8~««Q›s(ƒé¨Ô,Ž­ÁŸn‰vÆ­Æôòç>65˜[P^·Œç"K)u€t3‘5¢²_xËœBÏ1ä_X™ÍÇ¿Êw3Ù%%T2(>b‡r©ê×ÆjÓhÁ8©téññê9¢ùE5’~4¦*%‘'0`W"ÆæÜ" Ní1FûÎÎBâ$¼æÜq[Ü£ef¤°À9t„-„BÆKG«•Ñ2Ä.«j/‰µ/$¤ji½õ4&oØwãI¥»¢w¼6á-UFK»· ñû*­Äfk›öx‘Ô—í"ÃHmKêg@ˆ{(#¼’YD¹ÿBž›ì1ºU5Õ{˜_«H׿ÝbGû ‡*¶†u„üθ­ßáSœáxDž$q*€›¯å ’Ú‚…ÆTHAøiGõ<h7¸Zt³ÁìãX4G’Tßä±£h^ŠÃw­v2¢%%¦2äÁ0æïð¥ŽÀëÚ|Å}sÌ;Á»‡F!GÞßâýë_í\z& ‰hÍ¡ñn€4©D2©b  Ê‚ÎŽ3Ü£fü’1¯æ‚±Ê¶¶f›'C9qoÝ ×ÊÐh´À­J7ŽW1ÒžB*»élMäYyÝ£k­“þ]ÎŽ‚ÁNÌúÔ6¸Å–=h¾Ÿ/š>e -4; ÃkÊZTwïG¶¾htû»Ï4êªÖR¡Þ'­ DIn>˜Qâܤ¹*'_I¦äÆ6 ¦æ>»\<º¿UQ, ‘baà&#ç^ËmÛÝ[oâù$Ç©e$òÔqµ=¿=jY ÄPs˜³ûD<‰™*Jß–¡£fo,_mSBºØɾ z ªS Q_øi¼ÔR@¯KFÀ®+µ™øìiåÁMwš”¶µ<ñiÒ^ìjg–Öëã~f쇬òÑK§kY¤ÓÅx -¾¨¾TKÛzÌ‚Ä?éÁÓ€¡^ É”eÁ.5-]ãPò÷2× EQà{‚°rëáÞ8,~;;ÁWâŒÄ¯Fõ9ŠCá•Øí9c{û¸´pö²ÃŒN¸4ðÚÑù/ààWðö“µËcÌÜM¿À“¡-¿*{ÝÒÙ9ò*N²Žå ¥÷„I3ŽÖ #‰³¤~–”@¸ÂfÅÆ®»¢H2#ÌǸW·£M˜øð‡ÂMOa~Hî÷ñRj¬ nÓ‹ê÷\J”.„sÆ«ño) -j[ÕeÀUoóOõe¹#´M7îL°”XËzÛƒñ…Œ‚´Wvû¼‰¼†Æ«<¶eªhYÃ<ÀæþÆêè²o¦ B‹Ï¯¢:YAW󹄛é_³óöÛЛë7.ï.¹m{(Az>oɧÊé^˜ë@Zc—‰7*wÈê -›»WVö]°dÙ®ã\öý™fÛµ‰t9¶¤V}îñìÝØì¾Vᱸ¨Ô3Z( -ógWÎà iÔ“g±Âî1µúnG¿Õi/ Ö®aª\z6wH5VkÃÂXŒYg týSH}vˆqé-ÂY/Dbø¼ýdyP8s -$RÇÌvé…h'w$K´|†·í…§™;Y¸ñç?óg›+HGÓðF~pQD=YwW´äL;v£ˆ§&Ì3p}OG_½¼¯2y¼¢@Õï·URåo<õ4"¶ÐþÁ€àþ2½öÝCI;¥ €)ª¤ÿéì¼Íµ¾ZnùˆÛ„œß~‹øŒþ—¢@™ðÔ6!†%ÿKu9Èš¸ØA`ŸÊŒa¦ ±¾!¿¯yÙ´FmîLRÂöqu8.ó‹j5Žó®Ö?ÍžÉÎÅ¿ïÅ4‡ôc…g96·¼ oìŽ~¬ðBGÆY6-¹ª…M6õÐêY Z`–ÄR:´t‰¡¼JÆB ÂP™\µÔäœöF-ÂâÉb[&èëÛXåõ‡ R'䄉¥ü"Üñý"É)¥F{WqÜj³‡h!YNéðˆ~~ò"ÙÐ5Œ©»Xçà ‡‹-Ýxä%ñqÉ>ÿó1¹rP*#7 -¶²çìÞê’ñ¬Õ(àmÆÊÞš± ~µnH¤a0³•JT½6‹’¾eËŒL£õ•ÃSóM ›ºá8'#-¹É\ÕÕW«£¡è)͓ᤛ±AççÆl‘ tΗm;"‘¿¾:A½K£ãcôF‘–m PÕ̆3s§$Ç`ÝÈbwÈæ!Þ)‚þTìû k±oqË»g™o˜:™Æ®Xå‡S:´ žø&i{ºˆÞ ó}ÜÕG”twÏ8»ŠÂŽ¥™r&âgؘz^?6×ÐP)ÕâIî–}ú¡hö‘k±+:ÐÏÊ®®ˆ“¤0ÞÇ}#3¼;ßٳƼJ£oèߟ„¡!}|Wš|÷ŽCdI‚¤¥ZÂ?Bë̦3uqà¢?Ò¨D,FTÈÏ,ÔvˆX3íÊQ–Y˜dª¾LÇA8^ÛI6—¬¹R –-uÞmR¼óIs] 2Åúxd«ät9÷9Ñ༡ßB-B ©Ë¦J Ï;gÇÐ ¹Ndfg|§µHOÐeßóšëºšj/{f1Ê=Ä~Æ«½ó±;wjS¯FûuвÕÐùåôX¯C%‚v“µãe»ò-jÒkë-âd¤/1Tĉ>ü² Æç{¶—|ûÅ´¾F¤¯2Ä3Ò—ùôüÚʆzNŸ¦·”‚5áz;κ7MšVà9>›.¦.7UüðD= -Ëȯúô$ šü=Z¤ïs£öjïM ­È"±óBc!¤d³£©Ëb”ű‰„g²@›€³y‹u[ñBQÊüñ‡2+QÉnÎÕ…lÍ É¬Ë½p¤+M)zÙ>û!Ÿ>ÅÏ -¢ï,Ý™Š£°ƒûüµ±ÒI‡c&”ü¼ün®'ñ°~ÅH¿ßýø ‡é+RúŸRû#Ì»’ŒŒ[È1Z‚«„äî<úüEþ„þ'¢DEPˆ¨½|”‘s¼j#U(»1é·–½,ÝÓ4Ešç×Ü WŸuÓ‚S{:D¦àæ }ª¯ÏB%Ö^‰$—Y –Œ8Ǹ %³šc&h˜!ç¹ÙG£ÀŽ–+([;3ˆý¡ŸA`´ž°ç£G°øªlV˜SÞRÿS”W~V'¦—,É*ZÊÿëH™­ >FþrRZ§³¹™ª$@!È¿Æf'%N¯Íqg'á4¤ÄÛeù+¡D‚A¿x0J1»ôÖ©Cøp:©¡Ý69‡Ñr;âš>ã|º‹Úˆ²;h“Ùé gÖÐŒíõÒ½Ó’iH)è¿iŸö&Iû RKÈÜ-‹Åx°VÅ Ec°ÖH·1ÁïX™hF¸íµnQtCç¬``*s¬Räxƃ<¬ˆI·$¿Ã“,Wp¨þ>VDI`×Ï!JØÁÁH¡aÆJC××J\ë(üÕ7“íÿòøÿÿO˜ÛLaö¦Î¶/gæàüÇgR€ÿDlendstream +/Length 9500 +/Filter /FlateDecode +>> +stream +xÚízUX\[ÖmàÜ¡pww—à.…+ pªp‚— Á58„àN°àîî—‚ËåœþO÷íÓ}ŸîÛýîÞ{­1æsαæþê¥h)ÕµX%-ÌArNŽ®¬œlBU°ƒ¹TËÌQ™UdíxyÍPhiµÁ®ö ÿ _iÈÌìä(cæúÂkÛ¸TÌ .'‡‡€/çËšƒû¯@'ˆ@vpò¨ƒ\A{°ã %ãdáærtÕrsv¶ƒ,5AP'7ˆ*°z©ì?³¤œ½ `kWƒŽ¦#33Ë¿NAAA€¹×_ @[;è^î {'ç?2½HȃA—¢-ÿˆU·2“µ»þÑ.€ÁÆÕÕYˆÝÙÊ ô‚±A­ØA®ìŒ/…Ê:ZJ;9ü!EùÃ30dñÒ”ûß}³stòpôùØ +ìhùgK–nÎì:Ž`7Ð[™ÿ ~Pþ…Yƒ\¼\‚\ äiaÃþGJm/gП$ç°™£¥¯³“3ÀÊÌ +ò[^(>P3wÀâòõù߉ß¡pr,Á®sõË1üKýYýc¯bæ +{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@v- ¬ª¬"óß{ÿg”””Ó‹$+'?€•K€÷eR^y¹ÿ®øO/þòáOTÝ ü?urüKò­£•@ðí¼øøWKî ôe6 Ž1#àßõU\Á ÿFLjƒ—ãej^œÿu¤þÿ¯ƒõ÷rnööºÂð;/~@Ê€?±7ƒüG¸™ØÞ뿼ð÷@=Ð?¦ÿÿ óÖÕÌl!éhmÿO›ÀP9°'ÈRìjaóqùËeË?¿CºüÇ— `åäåü§m¶°sA¡/gñ'r´ü[JYG 'K°£5@Ëõe*Í –ÿþ -Ü {þ< —wÿÚ[_ +‰#‡·–b6ulªƒr¨í}™7* Ð1í Šî +Åü~~f†K {5òòµn<Ÿ‘Ð"+µÍ…¬Ìø6_‹æµ*߸R"mærÞ)™Yù§¼f©Ò;$¢)4ƒm‰Òæ숰óÇlÿðߪ†ßõˆßµ:ƒS½$}ôón†DF¨å´E‡…E®û•vX­}Yãïš²¢6~ì<ùцߊ닩²;ÎÊúÅ5ÃV±kÌ*å JÅï†]ç! ½CËN’’çd[Ñb}Ö}Þæ[öÕÎ’‚ëó-ñ`b‡2á­YsawE÷ëlMàÙzøüÆÅbú¶ÍÏ4œ2¤€³‚7¶#]×™±yÀ/u˜Ú44‚üÐ3e`r<#7(uR‹uçÛŠ5š¥Óæ×÷ÅÕ¯¦‚¥v„µ}oPíÇF`<—0ß•værÊ·Û³%©ÌÒ‹FI¤mô¢žô/ËÝqƒŸ†µ}FõD-V;üÏ'«‘ÊŽ™*¶Ð ™Újß ôÑï í_²ÆÍ¥ ÀFKR˳S’Æ~sUñí£û · á Þü:e·}#^Á‰M•øÁš/Ð'FM¹ ÿµ=¾ö6ç¡?R9ôÛf;Qq¹C‘ÐFÿï|ÓBáZM›‘8l#7ÙÅÙ ú³òdÅ"‡3À•`{e&ËP`' ÅœŒÆ‹.tjåø]Rƒš·i‘É°Q|Õa;¿îÕ_¿zøz {îÁ™À—8»´üµÚq=oûõ·k€»fwþȶʣÀ÷çJ¼ùÀß=p½¥n”~Â{ÉPÓ›$ ñŽŒ Ùè`œ“êè_‰:ˆtHlÊÜ·2Ùs79ç ­oÛ§è‚Ô¨ŸOÝz¥ïŠa¯B5 Z®á}ëËn¸àXrouáÖ3>ÄÝ>ßENÎ…¼öùÝhÀ‡•â$â ž`€â¸c)“½â@Íþädz®ÈˆèM6H6Â’é¿9 {5ÑRJ_ö=¨P€–üǸÜS¿‡ ´·¦ºIƒ¬:sš¶_|—qèYoÜü}¶ÆFfHoëǤÑâçîw=õË 5Ämï ¨íZ-~‘½“‚$y†E³dö¬Ó8<|›Û–=:ùeNžÍåbŽÈ;Øÿ”Òj$³ï§0æíÏb‘¾ +ÅWy\:T*‚}ò +…ÉGÿÐJãöÄ{ ¨ÃÈÝÅÔiÜVnnFʹÁtj̧é-ÖÌ÷”–7!ÀýÙ¾¿C¹x—wï\áìŒz ]Ç}Ä?âU GEu=…Ó‹ jaF«AÓNQ(E®¥~°0FHÜdùós D7jé6Ã/Ç“½ÊAdl—ú;WyOAûÓ"Ôž ½Òrã*ÙŒAÖŠ®ðïì”UIhYT¬Ž}¹¬:(k¥ì™š©˜¡%¬½}Ý"ÃòLÕ»÷a”°àmt>u‰fP:&&Õ2€ØŒsRÔ® ZŽ!6{½‡doàgƒÛŸTÕ¯ØFø™G¿ÀÃÙWHn»–ÄÍ8ªÛÈÈ"¼8µM™XÇ„eÇ™¶HŠ`²LؤŠæ]§ÈþKÇÍÓ攟ä²#¥FÔÑ»ßþð³ÓI +³çWD`û9ÒäÝ$ËýšžÅ7—©‘+1ì‘n +eñß3:Æ=ûGÕU¿.Íúø¦ Li¿žÔubb¾¯j&ä©¢ëÝH[.=XÁŽôæU¸²Ã‘e\óJ”EuÒ$,ŸÜ5Ë:»‹¿çzFD@µÁ:^*ÃO1N]þö« 3!Óeg§N,!u*Õ™ÞŽ‘IiÙvÞ’é¬.\¹6áùütc/¹nA¦dCÜkÂüú`zJ$ÕT;ãŠÉÝæ»bðÍ&£·³ô€MÙqP-ž—:ÿ/ù¯y4tbòë¹PAàŒ¯Ú•r ÷χ§5‡»%~ßàkÈcÉÙ~|FÐPç›N\¡3$´ßÉ}W©fžoœx3Rlµà½ÏåmïfäÓå샭G0^CP±¬z¯.ÙÖìS@ÆøÎ-ýýUį…eZ77!›s°ØJ&P­ ˜üspä'ËK¹Ù¶v<ÇÕÀ™ñ§°š¼¥°µÅ·ö/Û0ï´V 5”U¢ƒ‹F¿‚Ù¶Ô•™â‰ýkMšÐ‘û¤?§ïj¢3J¢€ðçºùœŽâÈÄ·•ÙVºš³¾u+0î¯nÒŒm‡Õfe“rà¦&öuó 2̵èä±j =ç E¤ØWÕ·Šü5p ŒÁüuΰ€?—âÃÛºvt}Í“‡Öh&:6UŸVûŸiäˆ28OwÜ;ÖÀáõb¹÷.Œ)ây"¬ üߟŸô©¢íÌÓ”]Î/¶ë‹¿;3Äð¦Úó¤­Óß‘ð¦n_4ŽÄ +W€ì­‰6ÅBÛæ¯"Åç|üž[Ü‚'0{’ˆ”£aL©“¶m\Ãa5ãBÓ€™JJñ,"Œ†K”¡¾»G4ü½59‹Ã§zŒ™g± ¶ÁþU©QPJy½Âú)ÜwUþ€ŒúçiO Æ}7œÌá8šÐp +˜†OÔ¨‰PØøàVß]ñs<å#ýûµf²ÊÌWÄX,K½ˆ‘Р†Gáî[QØ°•€…,a¡ú÷²TG‹•áE¿ÄHo®º BtÁ¦K×*5ôsŸܬ°ƒ÷: +TêCBz…Ejä'Ô cäMí&B¬är¿ùÊÔé¤K0 !Ët_‹û"jÖDEËCžøÅد˜x)ø™©á½òYöý ì])£ ý¸¡ÍþŒ\{.£‡ +s¿6ùýáÜûßa¸lÊqö¦«ÉlÇ„zªu؉¶jò r4irªè/Šð–›ši}¬=Ú±¢ž£±¾†Ž¬VR4ØËã|hwFT+þòijÐú°ých;ôˆ4È*¬B¢ÿ¦€Ð6°$O¶^ÊÇÍ·0~ºSy æ ÍÿÍÂ' ÓµâÙŒLšM½¤gà[A¿ŠÞc‹ÍÌ“[›i±“¿„M¼~®³yE'ÛçI9Ä\ûŠø>ûKÈͧÁæXå°·wžØ#ÝGT¢$5î\u¢;º§”-®18û¤X»†KkÏÅßòû»H(sª“¼xó¼è¼-ÀTÅèÛ‹ªv"1™=¼Ù2'1ýá,BK‚ǘOý=ÄžBÑùë[ÏÓ⟎c@«ne[Ø'Ýà†(ªÕÊuyo߯æá£-º±Ëm=ý„‚W 8î»;<Ú±‹ƒÙzs,l¯ˆ·9Ëu?§\(^Ò‰“ȉ|- +ôsˆÓ Pî—¯böAGЕ=tÂb??y°÷(QZR›Ðs ­dóé¤Í\=*$3ËSfYå±s;9¿â6Œ¾;²e›\«kæã(u}5‰M§ !Ðöe˜äÝQ'-ç{÷óF{ …ýPë&=¼|ˆÙìÌ&Î’ÆåÁVí*]÷!ž£uàµFØwhIÏ)ò¹îÜäHYù +ža“î‘fh³+œ‚Ö*CÜñ¡«i«Yezœ^²¶Æg‡ä‰ÖáȽ±b×.˜V+É>´@h¬ëÍ3Œ+ èyÑÅë]ûÊÖHgU€fþ¸Rf»‡‚w`¶:Cd÷Ýaè$ñz¹'¼ÿ9™?!!MÌVT¡æ?—Î7Ñ[Þõððëàoõ»ó]é¡Æ4Í­rƒQtb,Aï‹ïÎjJ6à}dÝŸâ?ÉpG¤Ø½Ø~wß²æ:™®¥¥[éä˜jR¹Nù•Õê~V¶=0L®DÚ!$¹*µÐÙµ+.¦O¡©”i¡R}Rn<Ä)תNUŒw‚„~W²K‰9-Ê“)øY%ÿÁôCöéQYÞ·AȦùAðÚ—w•Ðlu +FºgF„L|º÷Ì®,2Éî95 mL††ÿLçÈW­ªJú93a6ùí7êÙ·IÖÞb;}õ'vT5»‰É{£s†gÊ)»Vì–ë‹bY\Ÿ5è(&·ƒÌI§ +ã1~*]èÛ—ŽÙ‡Ðƃ”ûGàf{·ûÔ9½“V0˜š¤×`¢«%n'ô'ñ¿~Ã{º,ƒð`æl&‚S†Äó¾¥·-o„"ÄuòŽ §3YG\6¶_=2[žªœ6ÏŸ*<†Nc§FÊ”çm诟pƱ¢T *¸ŸÀLõ¾VÕm&ËP +ÑœmhÎ6||ëÔ¸\Ùöz®N!qQê»ìÛo]*â> +ќȖçiH ÒÎÐx_~ƒ™Å>ç3nöe\\H¢fµî9(Zhs:Ò1?ÿ¢}5³ñÃù§üŠ)vÈyæã$këì¾dñlZw”°¯è´“(é)Þ;ØÝ Êˆƒ/ÊCZ²&h­â‚QDj¾•QocÚâ *eH™ÔbN€lWü[Ò±vq»lCc«ú—ŒÈÁ¤Ïð¸fŸÎ{µÒým%Þ T¸TÃqQßt§‘Ï0‹ÍeƒÅÍ^oê!¾SÁR,Ú‘0Y¾Q/­uÐâÊMš"û¢…ú–þSsb•=0@ƒz'kJ<Î΄O…ÍnP©Ç/4¥%0º;‰ô^aøBBîC÷-EKší7´uørG£”.#žŽãÔKŽ£Ô/ bu?Ñ”±#¡Å—* Ü9(×6ìc}iQ[0[*|°¦]Ù@Nª} ´UÒktn§ÉOc…ô‰Úö=œ.’+ý„Ø G©s QÔ +<àDKrøˆ– vWXØL[+(¨¼ôu i ùXN¸?<íW%fÁ;j`QsŽüÉZ’áÏQæ¥ ÚbG3¨4ÆÎÌògUã#•šF0ÃÔV`w]§öGŒhýÈ6B¿‚Úš$˜ÿ€Þ°ÁNXîIcFN+ùÙ´:¼¨HàõthEAС¬Ñ,ñ¡½^ɨ¤kd¡½?sÖBF—#Iâ*ÙµÎP› w—žÍñ›ƒÅ5›}}†ÁW¤¬Có$øÞK¤b2Î`ÂöŒüqø¨~k Áä6ÚB³=à*ÐؼBg%Ÿô õßy”:í[Ú9Ú¿Z‡±“NÃ{N½¡ëÛ¼pœúµ6…y›–*§<ÆEØL¦|šØ¤€%8«ÁÆNN`oR]ª„Xlñ´3ã¯3ï÷ÞCÑÜa¬#æ¹S;…òù~ù²„­Î_‚Þª²¼­Eî€AAÑ^Í~?gãÜÔ‰æõ»Û÷……C9ü[¶7¬õ-Ë?ÄžUÎDÓ:C\–Å‘ Ä×…Xe +šcK&Ž5Ï¢=trPォ¦â·ñ7?U%q^ÿväŸìöí„8&]2ì¶&ÑûŸ5ó¨ð·J²Ä²…|±i…¶ª¶ÃÛáËùÝ? ¾­øÞyÿ;œ:·Ä6Ú~ÝïVŸ¿Ó¿Át®«6p½!#ð©TH¾öÌ}S€‚„2#ŠÚäQ×|`IûXÉÔ}’2pVÿæˆ>ivÁ“T¼,Ôü¢ß3qZ\eºà<×fgö“(ûÅmdgZ1Ón&uX#7›N+Sql΂œu 8Ê›Î|Ÿu;ñwí×ÈmÝ°‰”dh!\ +Fí¢– ¢ÇWB'u6ŠÑ—NÚƒtä£ÌÛ‡²ÞƒÃ­%=hð#,‡“úbç,ðÁ¶jî÷ÁˆØ¸ûn°å¢·ƒªÔc¢všŠåǯ†L¨ñ.ÁC;"&V‚”›W¤ÑÛj­Š] c%æ£ò'­Ê_+zOïIÏ©Þ[:£ÏÜü2}rÝåœ9ŸŸ=*n¬Ž³iÚ†{;Sîyw$zÈxkàª[шcFÅ1¡ŒR½Ô0Z;'iì+Æ G<¯B¤ñ´Yöª¨‡#†Ù”^°È;}xõJ)ÓêsÕÂB½ž||^$»(sþ ‹"—ôÝCâ1ôYçö¯=: žÜ³°Íƒî%]ÈVùñ;2Peê"å(ªDxš µ _ÆPAíËp”¼²`s|¢½`Èw‚ÓZE+t ÚSÈáçåù(ÝL„¶±+ÌÙ¾ØüΗFEÁ*™Ö0{cÓ@©!¹l¬"URû{‰óõ’²õA“P‰íðçê#SqVá7ÕlÇ 1՜Ԧòê°¥?6dØ>ÄD»~´ì!5âsCX6 k^o_¡Òö+Ù•_0—>ÁÓxÚ¼ÅÃHVƒMJ‹eGž  ?XeáuãÊÒú†ÓΤé“e¸¡¦^2ySn»½YùÅ'ÞæÀ\é!V*¸¼^É5z#2Á¼mÛXošŒìç´Szq/Šh8²èZDaýÖpóeÊ!±õàá’˜É>°¯®­;V5ÈD»~‹_céÍí“®õ؇$'”í"®qLì0—§—óû³ÌR,ubõn +ÅPÍ+‹§+d«òtŽ]Ò½þ³ÍoÑÈj)ƒû;[Sz’ÆO™æ³<˜´Á¡43H˜µ³é6˜8ç)—#¸[áÅôÓ}FJ7j–ŒŒžFA1ÎÊåªÁÖ~| t¸o­ WTd`^Wѧp|Ågºyß$ŠÍßbÌh²#Æ«„+o0Í&ÃhM|y:bIëDðâÜ>fÉ}çuÏÎZ_$Ø3Ä£"FٶɜË;¯2ÐÌ ®>¦j¬ûª”Ö:ª‘ôÙ—ÅøUÔŒA®æø'Þd>Wç4ó•_U«¿ÊXo—³”yüpÖ.íˆÖbÂÅT~Å~=ˆeHïY2J)>ªB$¨Q¶¯Í*êˆF±¼ ;Ì=Ù&{%¼¢ºêšÞZ¶O‹9¶HbÖw¢•Už®p[-ÃÕÇëãò6ª†µÞÈ?µc¼nÜó“íZé¢ÂDÍS—ÿ{>e:Z¥u•ŽEb›Û+– …¶¡!’Ù’dÝ__9ÍY{;Ï®l­L9Lò5hBrÕ*]'†’ªÿ{ÅÛ­{ÿrØ£³æþäspÜó°‰Ö¨Wt!@TQq“;í©y€¥H®%ŽLP8.7Û„û‘±æÍMÔКûš6‘šÁ­¿›ƒí\óÔ|M$FÉ~p4×–šH*Y«Ù 2\qŒ¹YæZ:¿£"öú0¢„Hâõ…„YŽ"öæ—–EcÈSFÁ&Ä=¡0E7`wòHÿÄþ9ߢ®ö;ŸYL#·¯Ì³Ö„…gŠc¬ +Ô…Ö¹™ºãº?Éê‚ú„‰×®áþ¹,L'åò#j2ï4ê•ï7cAIúy´ocpàß¹*y¹¢T„†è==lï5¸§D1Âs¹Ÿ¯2Ê´8çh†Œ4¸²¶u‹BSê71ó°ãÜ „X—êyÉyJtèb‡ñ˜`1<]Î=ûÒ.ó`ô7HuŠeòW²OH:(kÑ….oa…^âÝܦ6ç£ÉWòƒøIˆF-Í–«ˆkÁsìü=ë2KÊ›`)Í.`î(/µ )y©Ôt¦,èœLà‡*·7õA[hDp·/ß.‚EÔ“V!P<é‰ÁÀ¿b» Š=£+m™Pµ?vÔ17’I Þ<®"! 7MV +úcd¸´fôwwX£l¾‡»C"žžá°Ó;Õ €Þ#§9ðñ’_7©Ÿ›K^¥ß÷[ŸŸ'}l«i3…ƒ–Œ—¨™ÎÏÑ¥û‡*eáÁÌ—F/S·ML¼Ó®)2_&àâ\Nujs4_}РEÜ‘*áq Å‰ÚiP¯|-²š§SÊG‹“¸`îK/¡K¶yÓ¡Ú~x°¦î¦Gp;·ï¤>«kñ#t-Š™;Ù¾÷wæ¹SxE”Ù c\‚ßh}U;Q ) 5›wðhى嬭¦“qƒÑÔõηé™õ¥g2qÄ¢G¿žÄihq­˜?Ŭةæó;‰À_ð_Ïáìà,ŸŽG(ÝFµ7Vç«w°»ã‡6"­’—‘¥c,MD%Ñ\Kˆ©Åq:?ÍuKÞ·$I{½ŽˆÊ¬¿=P±T&U‰0îvi|åJ#¸ŽEÂûCìKwã¾J o¤›ur¤'SÇÓN~8nØcqWòñjºøiY›¯#WÓ“!×Óß믬‡f•å}‡†XnÂcÀw²ñö|Öq\ƒnZ“E‘x!?ž‡¤‘PÂEl$Õ­.LÉ[—ά&ødcËL ‰ÉÁ.-îÀÊ-§3§ÝáET‰kõ*ºk·Èh¡¿=¯ìRñП`É‘.~Ë¥î1úA;ë7í©”q¨ï›ˆ±÷[G…¯L»f4‚Ö0›ŒaÆ6 ò9®6ÈÚ˜ëmRsA8«ÁŸ¨x›4Ax–¼¥êDÁ Yï@šð“Bi8«R}WJå,|kò»]—ý%¸0riZü¶»Þn G„­‘¾t Aý ’§,Xéa¯+ЊÅAHú…™¦T+ï&°À·Y=LˆL-0ÓÍ¢Ÿäû1ÒÕ®25c{wc |XîÛ¦J!{Ý$ ¼ 6Ô©q˜ Ô†ýO#ª«¤Aö³‘,§ïlx¿•G.†  'ÔÖÓøò´ *´PÃ(þb ûÕ°_œ~ÐRlÔùYœ?ÆX‰³Xá¡Bö—߀z'öÇøøðo’?²kCÊéÈÚP¢b’F Ì’2î“[Q…Î÷å]òÞqÖ‘(™gТFt +䦶°¬"oucZ^£¯»¥ï}¦ñ¸¸Ãÿ²§ñü³µÿ$4W—ötëœ}¹Åêèb„”ÖÇZË0%/î É`ó#“)±{¿ñÃ3Çî·}Žô„Ûá  +‰(&c¾! Sb4ôékå͵þ˜aåØò;ú€ £€ÿuÁÐh^314ÎjT+Ò2é·O­7<¦iz’2 ðÎ"ÃÌ™. ¤@q'¤esú–¼ÔÅxzäY~&¯÷óG5Á]5Et„Ç2·¬Ý€UŽÿË åÿ ü?!`a2ƒ¸:9˜AìP| ¨«äÿ§¡ü/œ_Îvendstream endobj -1060 0 obj << +1065 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 2 /LastChar 151 -/Widths 2128 0 R -/BaseFont /RVSMMK+NimbusSanL-Regu -/FontDescriptor 1058 0 R +/Widths 2150 0 R +/BaseFont /SZENEJ+NimbusSanL-Regu +/FontDescriptor 1063 0 R >> endobj -1058 0 obj << +1063 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /RVSMMK+NimbusSanL-Regu +/FontName /SZENEJ+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 /FontBBox [-174 -285 1001 953] /Flags 4 -/CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/two/three/five/eight/nine/semicolon/A/B/C/D/F/I/L/N/O/P/R/S/T/U/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash) -/FontFile 1059 0 R +/CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/H/I/L/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash) +/FontFile 1064 0 R >> endobj -2128 0 obj -[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 0 556 556 556 556 0 556 0 0 556 556 0 278 0 0 0 0 0 667 667 722 722 0 611 0 0 278 0 0 556 0 722 778 667 0 722 667 611 722 0 0 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ] +2150 0 obj +[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 0 722 278 0 0 556 0 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ] endobj -1034 0 obj << +1039 0 obj << /Length1 1624 /Length2 8579 /Length3 532 @@ -9823,67 +9981,70 @@ endobj /Filter /FlateDecode >> stream -xÚíwePœë–.îîNCpwOpw‚{ 4ÖÐ4îî \Ü!h€`ÁÝ,÷$À½ï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕŒtZ¯9¥m V ˆ Œ“—‹G  v¶òpW‡¸¨qÊ@œl4­œÀ€g@ƒ‘Q -ÂÀ9 $0Ùä@Ö>>¯¨¨(#@âêÛÙÃ,z:¬ììÿ”üQXùüy¶tÛ¹˜ž-·öìÀò?ë2׿¯Éÿ†ÿ[üoiïÿ®¹ÿÚ£ÿr‰ÿ·÷ù_©<œœ4€ÎÏð÷’Äþ|WØ^[ø -Y`Šù½'‡•”ò7;)uƒÉ5ð{yi¯ôlVÇtùŠ°ap™$=Ú¼| ¿Ã2¥ÔD$mCG75vܾU‘'Ÿ·^¨%Qëê>±Œ­v¤i¢œÆœ\DÅæ$Uyœrï…¹Š]îI“°pS{ÕZXÕkÝJ´ÎÈw\xTû ni¨ õà=7¶Yˆ}Mäo“ÊÊôA6'¨'qž1§?õýµuÞ†mŒ:‡Ë]”9š5ÒŒÚieÕ¶®ÎZúN¿‚ 4¶°ÀZ™hïøT£n q8ßÊM#ù}J¼ÆK/'œ­îküNáNñu”¬;Ïa¨t&+ã;&ÛTüøŽ}¯_ÙÎ/åP”Ì¥µbªhSúOMDC:C£ýquo*¶“Ȼʹ*ÊÕã Û ¯ò“»í6ãµXp— -C݆î°|Dƒn’l³Fs*™3DÛj^®.kmiM' -ýœêe#¥M ó£Yùìì"Fà4¨¬œÎq›Â邱Jë ß¡cùºj çÉ -¥!M"Uk×ӠѽDöþÄ®v¸é5¾›¿˜”ÖžÐvÆ{mÚDÍ[‚‚µYxë04Æõáû™¼ã¡x¨`ï㢘ÿGÅŸl¿Þ‚¿M2[韷(ÿ<Æ%ÏúSÒKÜÖxóŒÐTÕÌK -Ê¢z4²ô+êŠBÆ=ø ÖYäæVwv \,‘Äçí0~¬94¤6ƒ M<5îº+® äÙmf!à­4‡¿•2SÁbVa=áî¡bLïW7ÖrïŒ7‡­4üþVG»!\èpÊŽ¥5ÒäG­o#V×#KR‰gû³p(-¢K餒|D5Á\ UïËb¥Ä¡ïÎÕ*8G‰mT±%vžIßOH°w“3Ö+ؽgß°)»œjÝ„¯~ÍÜŸkºôØœ°&k¨;™¯—Öì$‚Å— £ - -ûäаQoâIÒîGžaWŸ¨•h‰ˆx=}«Ïí“|ûؼ‡Ðé6ÙF£¹VàjÁÓllyÛÃüù5N†¹á±£LtÝ“¡‰>åìÉ÷¾ƒŽ´OT ôNó˜yûõ²ëáô—p£KTóÓ+±Áz’ÈÜ™ ªÌ@¼Îâü/Œœê}í“Xñ$R¨ÅኾÝë;toK’Ö~ÕŠç7~g¨ nX,ÿ\¡Žˆ/νtD¨scÓÐý#íã‹™%¦”ƒ~¥@Úë+“wZï34ÃŽ®ÔÚ^Ûz:d3 -Žš(nÛ¬³&XÈ{‰TXíþ¯FeS¡Ûï#Ʋ¯*ì3w4•O£µ=9;ç—SCoES«1SK{^âÚó½q÷yô»è˸j’˜ƒè"'Ýœì_~ÉW²„凒¿yZÙŒ|^©ìÂ=¯ù•PIÞk^z¯ ~½±NoT2Ž^ªt‡}‹8”›Ô"bÇ -oaguÊ!ÛçÜ…ÒŒ9dëÉ’¿Õš[»Ó7õ§aNLÉH•.‹ð·ä“q#t|%öuþÄRÓ¹+Ænvê–‘¦žh}í½B׫üsóø‚Õ9*«¼ª¡M‹E“½h|íøiG½¡^¨!¥®_œÍeÜŠáâuç±ýïQÎ`Ÿñ‘Eôï þ©¦%³u£:GPb²Ü"â ž$•Ç…t“3=òáüŒ€-ÚYlAòv½YŽ¿ÛAòàò›œjv¿mºF­$ÎàeKOÓÞ|±•”.ÔèÁºAu–>Ëé(gEp‰ÃˆbP3P-,œYàm™Y‡ä£5OhÓoÝüŠú˜ V{Ÿ*»” -ð„pÞõ¨©îñ{ª•[•#ZòPxéÞ¾‘ -NÝ^8Ü «3ëæmVšRrnÓ%B#mÝÅÛ - i"á4O%qD?=ú%äʪ£u #ë⌇)H7tÎœno¤Œ]`æ«Ð/ƒ»Äêv.˜ŠNvÿn1W@XlˆW#³¦4õt N7•Èœkx"ò×:É[¦:/¦LVñè¶Ì;ß“ƒ‘ÉŠüÏ×èávÞ"RÝds¨ˆÕ?ãª<](t¡ÎGWŸ2Kk"Û ç)Ü^o|dH´}Š|f;?8ièxŠäÊ Žž¾ÎÊfÒ¥}ÉónPë±V|ý½˜(Ÿ2¾`¨hg®†IĸÛiˆ þ<ÑÀUðI ã¬Û²ÊU©óRÉçcXC¸%9‹ÿðÀ`IøÊÒFŒëËÑŒSòÈ!Ù>–»Ql†ÎJû-¢iD¦óî»Yø6±r„Lýµ½3…aFIq¹WVµIé¿ÚÉø( œ=>¡kÅä^ W°Y š,ý¤ B·ÞfIJUìY†ë¸¹á^¹œþ€zî’¬‡8z´$NúÒá”Væ“S¿ÆåŠ[PJK R´ÙÜ*rWsôcï"P‡kª ÅôÁË”-¿/˜á㈓ëÙ»ò_èCDýÙWþÝYXø ­Æ!vöÅçWÎdî¢~‹§õO´Fu2¥Ø]˜9úB«þ»:@ƒ„ÁøÓú$Š"¡uå£Ë”àkÓ•7Q~v£·ä” ”Šn -ýeë_|I'ýe²%É*”-:ŽOPÏÕë—|6DêFëÈ:Ý‚bšFãƒoi˜SŸÚÕ¶ù•LÁV¡ðáx{kð§WìãAøÁnË}é…Þ‹bäQ>irîåÏu×㯣 ‚9CMs{–=&SíFSNñ+cnç9ü“7Œ ¡ù_zµ’èh€Y?(8³X>× -°.àVجÛ4ñmJÉŒûwB´Û›Ì:3ÖºÐéÅ’ñ×Ñ-ÌŽ<̲×q!]¦½M#Ýò¢ÇèšEÙ),f)é±³Gk§ËùdIÙ(<Š*ñýLØ)8Ñ|©®iÄ.#w°³‘.Ìnøk›ýXþ‡¿U6ÿR¸Z¦å«~úɨíx>$Ž$w‰íqí°ð“j.¡9bDE߬õg»oÈêK2´ï¦Ë¡”’¤DõÙÏO$;ô¿c’2ßVª¦¼z(ƒA(iÀvnýkÇ—“ƒÑÚùó‰Ü<ÞwëãOÛæÛùõ˜z) - †ª¥ - cÎI­7ã*oTQ¹¾Í†Û‰…¾(϶jääiý¶[ÿ6ýMññ<«$e —8§Äk¡ág©’–ˆÕ¬€ªºa¶”U…¬L‡RÊÍï¨_û7¬G$Øö<¡ñÁãx)M"Mi<ÅDF='Dí¹ThßÉô=¤Ì]”:H闤߮«4~ØM\§®­˜Æ«HÌK½™¯#·áÇ)U%¸_°ƒÄçaB[ctN½çÒˆõ˜#dŸÛ+i(]Ê¢ðé}ÚI“¢ÓFƒOTåXi Ø9U¡Nr°4‚ø0ÑHpVXõ¾ÁMV¸Bv]ª -V¾%FŽ¬´~Tûù’én…ÕÞðd´ùñ}sBu‘ißÔf6…–âo§Ü/ÙÎ3Ô›n¼¦p±s¦J¡‰Az¯Š3sx”t¡Z‡8Vùë ³*ÅlX¨»ÎQ"Îõ4,èÑÂRj[È´,ÛÆwn®ÊÖ×*§ úG ѸWÕ–‹‹¼b‚éd5óyPL~bÞ@LøÀ†ú>Ãå¬PU~Æø­•ÁÙ{’nÌך/>Ìè²»¢#KY"÷yY-:¶ÔW²ÎU‚ h(³ã5^l¦vëÖš¢#©w8º1–ïŒø! öj¯g̽¹÷Ø‹‰øÚÊ€µ VAˆúƆgÐhÏtʱtÜÀÔ5w¬ëÉÊ(iµ.A„Ö%RÕiôŒÍz¿Ðº…}‹ZZv9úüT§¨Dã…,ïß ÅØg£ÙÍ…pBõ:—"aâ»7,ôdUÇÀ(®¸C·0`UÍüuƒÒ Îy”ìj–Å)”Ã8ÿ8õ–”3›FTÜ·Üü]ãúžc‚HTLã[?˜àä:AõUéC5¥´·$kl†2f-õ'»/`3_iªÞ‚Óe]ë¬G¢J“$áˆE㜦5¦q*=I³ý1„lï}¿èè×(ãËñ>¹Vž…¨ÛëwONÌ|$·“¨Ÿjçýr‹Ó¾ÞgÖ"h§'Óî›#«QèRêë_å…‘qh–õ&7è>«5•îùL=Ý°ã…p¸Èspïï>®é™çxÝ1• ìg‰²8çää}¤’/N\`ÑW¨­›¶n9‹+^–sÐq”m²(GTβŽ]±‡~í½¿=H¬`ô]ÛtËŠÖF´/SÈXÀaŠ>ú2ÍN:UÚ†¾tš¦÷ \bD–Ô»œ!„ÜŠ5ÿ.øDÌï_àùsŒñg7‹ŽŠ³Â;þ²jÓÃîŠÂv#z? ©mÌGŽ±Õ‡sOß [Á®Øõ )¦cj”°ü.²¬–4«ë›xvU¶.yŠ6•+\þ!Û¯&l¥×‰+©T ”îì_«ü³!²IJü1PS˹7I={¢­ÂÔGÂÂ'‚‚˜HJmú¦4=­ô‘Ÿ¨ý˜,‘´úe5ß_‘T )FÚÍšÂÔîKÑð'׫£üt††Ðlgëžÿ™í-Mu×±|Ôõ}À}/é‰4¶OÛvGâEš~…sð¨ïª=/¸£bmæSÄ.È’”Ûˆm)Ê‚?^FáÔ|ó«»(úü&­¸¬lVkùîØœišYã­kïX­¹Us»P÷Íž_TÝ› µ3æÉžëMË€¾Ó醈`Žõ*cªüR5fí¤6uci&C±{’g>׺ÞüÓî·yÙܱ]ârA¡À„ ¢9ÉÍ|ŠH…:%9]ò¼ôåS”³xb¶Þ<'áRçÂe\¹$ă¾Já(-â›äc툣ôýˆu˜q‹nõÓ¥áÁrg)Æ<ôÄt0ôoôp›èÑ2å9Ð{ïÇ|óYaÝosó4cBù5Å«‘åÚBèoðï¸Ä·É{X. ¼yz¢2ïnQ‘6Ôð”D3¢èüÆ&4“ƾévÉ28àËá-=î•l)àÛÕ4xažœ ½”Ò{,·S#`áÐ_Ù—s²~a¥d⚺½+:.3R•;k?ú]±$—ÏÈÖ²Ö}™¬ý®Û—¤úëŠÖxùGôÝA zcZm€õM]Å)ü5òÜ÷Ô÷ΓòlÉÄç¶vr_ kbPwÎæZßýÞýæ X\¥U}®pðc#®~?ùö+Ãümå¶$WZTÎÚç¨_᥿ÉLËbàQg*'”qØw³†óq•Nyá¹ËM°¬h‡òzÆ['¿¥×"ôÅ¢±-9f)ûÈÂy1ù»œ‡U†°–b}¼fγũíÓUf9^¨,ສg(+:ÒvÏÐóò½ß؉ñΟicÑ&p!ÉÖ3ÇH«Ä]˜ù" î¿ôR3§†_ã’J­¬iÖ}3ÃJ§<œh„ 3À_4°çeÐ%HD fª‚ª‡&HTcÄgvpL†£ñ®Ä3m3‡TWµ†%ùÓBÊ}âú%I~Ä\áÌ&^ÎÐvTL• "TÕÖ GgpèÄ2Ò]á;þÀ)C‹ {Œ,ìY¹¦7è9–s -ö7n&„B¹š.p{%ø*\¸ %ßÖ˜8e•^4íã9m®RÊgAW?­•â«.oh76 ÐÉPXd™2{²nLÏXý®u8ÊÔ­ÙB¡2‡Ö­bÏuNç7ÖsÏ J~ü™äM•¦ióíF¬‡0Þ—ÉÕ¿ÈöÎ2«—l”nç“oú«6”|‡Ç Jr!˜ÊbÊ|øˆ¶“q2XõüðóäQã콿À¢ ®ÉáÁcl×Ï—Ý~ΔêJ¢1¯ª"…‘Ê Z¸ÆÐÃü¹\ÌKðÀ$5wÅ¡¦á‡ZJ4‘¥*4› -IÅD³H?4“ÂÜœJ“ƒ•›¿$%èY}e‰ŠÕÉ$L(¯ÝyI 2Uü$4ðUðú3ÿpXé%DmßþAלÊ Cšv&¢J%­ ZŸ¬Úõ8…b¤CÁÜ„±÷'Ë*šÓ‚®Õéxô¨w |D$Ø•8Ò->IÝ3?Z‰ŽÉu;–ò(Ð]'üMÇUàJ"ôUøúÕAƒÆy¡¼¿1>ÝèPx,õ)òat{³Ü׆(ÿ¶f­()è­ßš§W²P<ðIˆþ^òÉÓØNiÉÇ«ß$x abzî¸8j_, Ùböa’è¨Ï`KÔ«Âu+«Û·kc·­¹| -IÌÐI íßòÓÇi€39!5ÄäáÃ^,$)¿Û˜p©P]¾ÃRÛéòfû&Ú_Àå„ÿ"r¥–VkDqO½`D’Õ3 ÷üà‡x|ÚR¶¸òÝ/0Å4oÈ@ݤýûÀçp»¶ ĉS켘=ÛY¸ÛÄkánšqt¢úþPoBÉ6rÊ.Ô«‹´òÕÇÂÛ^*6I7õ4·áJøÐD붩»ö¨m~Íb½®G¥!$ @ž¨KÌU*Y±ÂA§lnw1P‚™ÿ$­cV¡¿Û;ûŒ—lׯN„Ho6ÐÄ¥‰QDÕâsÉ¢”µE»È„Ó=ºƒKÞÆb9…~vÞhö%Êüžæ;ý¡(3»í ´ýMïo<ùb±AvC‰ö¤úÅ^ýÎFÎE3y¹Ñ"Ã>ßRâµV£¢u(ï5ÙÐõ%§?*ßuGJ¯ ÌÑ/R˜pÁéÎoÄí…¸ Gf~ö}7Òc‡ª%)o9çqâ_wǾ|¿ò2ëBdØ2ºg¬‰MÜíáÔ(rñ$ÿRÅôja«•ËôCîÉ÷ƒþûTÔ÷µT.EÓØØ´ÊÝ‹—gon)QTsï¯æ©¹¡_9ýuÁæJO§T´6^Ö´<‘¥§³ù6x_Ç`X‹àVpÔYá®xèøãûŠ9Ÿa?…’¡ -0s¯ÿò×}+4šlØõ%7éì‰é.d·AAŠfõ>DÆc,+ÁÒɸYw - I³4sýõ;`°¦Öǧ‰žCͨÃE…ªÊÕˆ@ Òöà¸ÊĺÈþíØûz1Ó$Þâ†uFØä}ŸÙ†uõSÍA›²”ww›ž4s{+2‘'¡ð^®ý2ú;ú3tŽ—R¾¯EstÛS+NyswJ,˜Ó¡j”môÁì‡soá]¥LcÒýL “µ¨æ]°&üÌ0”¾™E"ðJøÐp-¤þâ'´•Üz‡™PM¬eà©Ò"qç}É‹‰-.¸ý/Éì‡$íp™^/‰¯‰4}ƒ!Âo7Ï¢pn|NŽòSÎýë¦4%ò]$w(K&›°Í>®™i+·>V’åb`ȼ®TÜšyšú*§41êCãÒ‰Æsõò7Œ4ýa -Q6‘TòÁØá§dÑß’1÷uÎT(6R_m]Ô1Iä›5·DÌTÚ[W”e$']ûyá¾Ü²AOê®5 -)“âgÊ7Mýæñ(xâ)—8¾°Ù¯&ªSNù¹_ªÈ¾„Ñ8þ‹†óê^u;Œ\¤ƒ€¡w óµUXÌ(fMF#ÂìûÕÃL7¡¾]ñž°…šâQEÿz•óM×ÐQÜýóšÒv¡eôâ Ôº¾ÊEÉ,Ï[J[&i]»y’œÎ3³ªÁÇ}+gµ~mŸSÁ ¯-$é%ó¶ }Å+j¢Ú›ú…ÞZ£Ðã涨Ã`=ÙbÁWŽ›íc?fº¨RßEXAúÊ*O‹Þ"bóʱœf׬J -:¥*j@þVÂ_&u.Š¬çè<1­–øpåŠücÝ$<†³ÏãðÛ¿t!Þ!+·šFX;µ±÷Ñ›‚àbršïM0,M(×ÓT±ªzÙ ¦é‰ã¡`oßYÌÙ@qªÖq†‹þq¥mÜ7šqsU«£|6"”Í„Â -?í(M<¸¤8ôCî@Æàú+—»Ò•#d“P{—¤ù¶‡Ög¯ù©7½lŒyçÂóé½c!sª²DFà–=÷WË\·Ú8ìû´eÏ/nÃBÙî&¡ô˜››uÍûä/L»}Á â…Í ,~ ¤”vbÂAèªÐeE»ÏÐ/ÁEÑÏæX¹Œâ-¢aëͶîƤ´C³0Ù–,^Õþ”C,OkáÑßÑV *º[‰»¹Ò÷sç'¶±P™n¼ZÓ§€qé’:S·Ÿˆ˜QI •]žØ:h~ª¤Zoá@„¯-_¬N7,¬Š$J/’5i²S#*Þl¾.*zr¾È–Öþ)l,Œª;v`áiÏ-Dÿ¶•Ý»@%˜8…ÞB$ˆ«#O¿;Æ1‘ú#­Ç Ùa²:çu†ç‚†sž–ÿG3®áOpŒÓYáÚt1r¨Tü¼ÊÃÛYíÁ „BDùxµ»lûôY¿øÆw‹§™n¬XA{ -u‚jUãá(Õ6óü1ùõd…é†Øœ‚(øìyþÁ»&õgzYsNDu^$¯lÝsÓÚÙ¸¾GJÿ0¨“À{3†þíÇ|^/Õvyaq'°´¸ËPópnF3g=?!a;D+!}Æœ¸J[4=ËÁ‹¥Óa|_j´Ëˆìª«§mÊÎl¸?Êhl0|¬õ¼À†Ú5‹“UŽ÷5c3ê…b à ƒÖnœØ }Hdv*õ–ÀûŒ*±«àVVE,f–á b_Y,\þ#¶w"\¾ShÙ_½Gö¾’øì5D›™Õ3¬F·‚Êáwü¨«î¼mŽ†Þ{ ôq¬pt‡!ø¼„?dؾ@¾ ×/)®óÌ›æ(Æ2S9Ä_jnzÿZylØʌΰë&ôÞ\SËHôÕJgþ‡%>8”OIüi’&á’k{œ°Êêù% ·ã'L)ûúîºt¡zBÀκ),1³ž„føáÖFÅ2~½ ’—ÚpWš$€e]ã+ úYm-£Þ>ûBO˜™¨*³_C;>ò²[öMÈY©í;9ñ‡Ç\!ºÇÆ.îfÅ)>·À{?o&¦ÜV£D£K¹uŽB ó“Η’„ç7.Ö˜9<þ?Àñš&YŠ}PiäöTýŽ—)Ãô­,jäœvy\ª=B -ÁkVHÜW/¹¹Kefv?ù~‚I¬µÖ­êtKcuâŒ7´L-ø9è2Ìÿ&ÊÉ-¡ïþ!D°‡ú(jµ#Vo+¥ú1/±q”y¢Ì¸g yܲ ùN ¾æ‰ñpþÀhf%ǹD!a%Þ*kEty,ô/ÄéÀÛÅ°ú{^N:•ã Õ#£BiØðÇT§¼÷NM‚N“œC jJc38'NZ÷mõ±4ký„bWTÞ?PPÐ}ȈŒG/óTô›!|±,dGXSú&ÓÉr~áíÔäÈÅŠw]|Þ’Ó„cÅR4•ÆÀôå¼ÿo•oh{{t«õª¨©Îm²á1hi·Íq’Ö“•Ùsâ—-!w$¹·)ËëŽÎè«¢ÅÌWøÌ$Q« ~–tTÐëZ>µØèkOÐÜç©Ç®1#m"v©F6`Ûj ÆdXzˆ—Š‡+ûèD‹3½° [»Z{œ¬tùwNV]ÌÓ²ó,òÚ´nºBq#IMMPÄdÇûéTñK- «˜>“ÂÖFŸŸ”ePè’gÑq T6ìÙ @9y3·o»Y£ïrj—Á£è”ò*‰†³_þšš¥Ÿ©ÁÌÊ}¼ ‡yÚDþ8®}©{É+dQhÆõ·ø¶gN\Ïv¨ˆa¼)7Ü‘%8@l¶toúµÖ»¬É3í—ñHÛ]1vÑ£K•*õJÄlŒŸ©›€÷ÌýT´Zwýá¬A„vbCËø#´tñ6Áî–1©RvÂð!T{g†¢X_ô±íÉyþ—ŒÿOðÿµ…AœPGŒÿ_º*-endstream +xÚíwePœë–.îîNCpwM‚»Üh ±†¦qw'H°à’àA îî48A“Cö¾gÎÔ¹ókæüºu»ª»¾w=k=KßõU3Òi¾á”²†X‚ä!Î0N^.1€:ØÉÒÝM â¬Ê) q´Ö°tžA FF(Cœe0@d Yøø¼¢¢¢Œˆ‹7lk°èjë³²³süSòG`éýäÙÒ lë `z~ð9B\œ@ΰgŠÿ±á³lÀŽ €Œ†¦¡’º€EA] rAŽM÷çT¬ª`+³ˆ`ÿ>¬ ÎÖà?©¹q=sI¹€7øÙ äerùq\@P'°›Ûó3ì°…aÏ5€A`g+Gwë?<Ëm ä…´†8;z¬A6ÜêسKËÿ¬Ë\ÿ¾&ÿZüoið¿¥½ÿ»æþkþË%þßÞ祖wwtT:=ÀßKð¼e UÀŸ=ø³h\ÝAÿ— Ð ìèýßXý«¢>èïHÿý+¦>—CÊÙö¹%œ¼|\<‹Ánò`/µ&fe°:>Wë/¹®³5êv=wõ¯‚>ñðü ¦c¶rpþS~Á¿!³õ¿Æþܨ¿"çVP‘£¦ÅþßíÖ¿45Ÿg¦ãíü7újëÿ<üá‘–†x|9…xœ|Â"€ˆ0¯ÿãñ/ÞžÕ€0(Ø `ÌÃÅÃà xþýÇ÷Ÿ'Ó¡‘s¶‚Xÿ™™70 ³õó˜ý§àlå…>w÷¯›ÿœô?Î <ä²ÂXš‡X‰‡ÙgdeÂjIóFe{ºyÂ]JtŠ ƒª!]Q›¢¿k¹ÇÅ[½ç¾»<ì(³ív“82w¥N ¨ü_°~)Ä_cjfß á6+ÁÎ<Òó=›UÝ@2âÑÛÝÕÒ6ûø…z¼ŠvvËô£0ˆˆáÆ'À*½þ-q^#AmÑ÷#¦”ƒÛ澡¯ý]È_v(Ùsߢ3Š{ a3ŹæRJéVøF3¼–ÁÇ4I‘§_ñňö…§]ÐÊ¿ÆŸ*£q¬NKŠÙ$D}g2¬ÁÒ9¨HyÇ°‰4 +šó“‰Œšq?>îìœK2Ý+Ê‘JÆÇ®5”岦ÍаY±:f¿–oʇø«8…| ü}ßHdt°ŸA¨ï}ÝûN†˜B¨×w¡è7ÖU(^˜å·BZų~–§¤ºpz/ÜÚœ 3”ýŠ9Š9zFˆÒüâê¥Ó&BŸÞò•Ãtk„žæìwjH)dݶ])b~¾¯Cl«)x ŒÈ7Á|‹ÞÍJJù›”º–Áøø½¬¤Gj&³}ªlYØ ¨TH‚m^®šß~‰Rr<‚¶¾½‹;v_ß2žÈƒÏË/Ä‚¨eeŸXÚF+Â$AV}V6¼|c‚ª,V©çÒLÙ6ç´QX¸±­r5´òNZGÄ{.<ªýO ·Œ4T z¡ÐnŒ›LćÞFòwIñeóeòz ëSÔÓØt賟z~ZÚïB×GOÂd/JLhFl53kZVf,|¦^Ù›cÍ‹Œ·µ®V3Š‚Ø_l椒ü¾?#^套ÎRó±z/ÿ'œø:RÆç0D*ƒÀ…ñ=“M +~\û¾g»5LÇ×ð2(JÆâjU” ýçF¢AíÁ‘¾ØÚ·åý¡[‰ä]¦šåejqmÇè+üä®»MxmÖÜÀÅ‚×Á;ì#oÑÀÛøD›Ì‘ì +ætÑÖêW«Kš›çêDSIB?'{ØHi“C}i–¿89‹Q#8()¥qÜ&s:c¬ÐzGÀ·k[¼©ìï~²D©O}™¢¹ë¡ßàV,sj[3T‹ôßÕOLÒkOh3íµ:e¬êõ’‚¥Ixó0$ÚÝ¥þû™œÃ¡xˆ`Ï9ã‚ØKþO +?Ù~½ïŒN0œXj Ÿ3/û2Ê%ÇúSÂSÜÆhãœÐTÙÄK +ʤz4´ð-ìŒDÆ9ø Ò™çäTu´“õ_.’Äån3~ª>4 6 … +?5캜(¬öçÚnd"à­æ7…½“4UÆbVf=åî¦bLïS7Ôpo5….×ÿÞ©¥]— + *°?cÇÒnô¥Ö³«m–Ž!©À³yƒY0˜Þ©øRA>,…o¦†ªûu¡âå¡ÏöÕ +8[‘mD¡9fŽIÏWH°gƒ3Æ3È­{ß 1«Œj͘¯nÕÌkªäÄ¿*c 3‘§›ÚdŸ(‚Å—£ ýìå_¿^gìAÒæKžn[— ™`ˆx=u«ÇítûØ´‡Ðá:ÑJ£±šïbÎÓ•ddqÛÍüå Nº™;á$±ƒtT퓱åÌé÷ÞƒöÔÏT ´³è~9»µ~²ëõ¡´Wáp#ú‹TsýSáË1AºÈÜéñ*Ì@¼Ž¢¼¯Œœæj½úmXqê$’¨Ea +>]kéÛtïŠWÕˆç5|g('®_(ûR®†ˆ/νxD¨}c]ߵÑúéÅt³"SòAŸbíõ•ñ{u Íé¡GWª­oì + Ýí2éùG·­VÀc,ä½*,€V8ÿ²gƒ’‰Ðí÷a#™×åv +ÛJ§ +QZœsK )!7 ¢)U˜)%ݯð­y^¸û¼ñzôŒ¥\Չ̌t®Žvo¿æLõ)ZÀòBÈß>-o‰ +F<¯Tváî7üŠ( $4~x-#|»±JkP4ŠZ¬pƒí„ÊNh±c…5³³:f“ís îBiFí³teÈßiήÞ鎙øÑ0%$§§H•†ûYðI;‰:|€‰û8}æ®îØc7=sMOUK°ºöZ ¦ëQú¹ñ |ÉꔕQZQעŢÉZ0ºvø¼-…^_'T…\Û'Îæ5ØW„î犷8tO\§ìµVJßÝpj¤û?‘Ä,¸:Œ dÎiE+ÃÇ£³# åä NŠ{©µžÔ/¼G¡—©j8ò ;,ÉÛú…C¹ŸXݜѲ^•-¨F1QfþO’ÂãLºÁ™ñpqNÀå$6/q»Ö$Çße/qð^émv»ï]ƒf"gÐ’…‡IOžX0rr'jÔ@퀚3K¯ÅT$‹“8ŸÄ~X¡¨ šJÎ,ð®T“¬CâÑŠ'¤ñ·N^y]t`‹w¥mò4x\8w›zÄDgx’=ÅR­Ò-i0,‘toß—H§v/ nÀʼnuã63U))§ñÀ¡¶öò]94pŠßŸ§‚8ðe=úÈ•e{Ë&Fæå9S NȬÝÞp)»Àô7¡_úw Um\0ewœ¬¾Ýpb.ÿИ`Ï^Ff )0ê{©jœ.*‘M8G +Ö°¥oµ·LµžLÛ¬âQ­¶>§Ãýåy_®ÑÃlݽD$»ÈfQ«~ÆVx8Sh'@Ž®>§/”T3D´B.’¹=ßzK“hyzÏ t|tT×ö×Ï‘9û0”™Å¤CûŠçý€æcøÚ[0Qe\þ`áöl5“ˆQ—ã üE‚¾‹à“@úy—Eߤ‹bÇEïO¡õaä,~CýÅaË‹—Ñ.¯‡ÓÏÈ—!‡dûXn†1õÚËm·ˆ&áN»ïgà[Åʬ2ôV×÷Îå‡%Äe_›[Ö$¶§ýj#ã£0¨wrÿŒ®ý´^å¶>}­Çž¦è+¹5Ë@Ÿh†î¨PQ»N×Ì:<Š³³~ÝQÎI6€ŸŒç¶Ø—šï¹,Bñæ“"ç^úRKq=ö&*?ˆ3Ä$§{É}"Åv$ù ¿"úv–‘Ã/iݨš÷µG3‘Ž˜yLÁ¹`”Éò¥F€u·Âßzͺ‘oCRz̯Ò¯ÕÖhÚ‘¾Ú‰N/–„¿†nnzänšµ† é4ïiî’=¹D×(ÌJf1MN‹™9ò_=[ú8ðË;cPÒZÞÿQT‘ïgüvþ©žà+5 CviÙƒíõ4avƒ_[ì'rÇ~–Yü‹aª¯ûè'"·âœù´Û½ÝH^~j‹mƒ½è‡ŸPuñÏ#*ܱқé¼!«+N׺›*]€RJÕ}b¿8•h×ûŽIÊ|CX¡6fÐÿú¡¡¤Û>¸ö­žü˜ˆÒʛ˙ÀÍãu·6ö´e¶•W‡©›,o R"ÿ8ê”ØrC0öð±âF•kg&ÌV,äEY–e'OËÎnÝWØÔ4…Ç‹ÌâäþâìbÏùú÷%Šš"–3*jY’–å2ÒíŠÉ7¿#íß°‘`Ûñ„Äá%7Š4¦òvŸµaäP¡}_ Ós—4sVl'¥_”z·¦Üðq7aº&¦Î +S¬ ðšM%vÒ;6-BÈ8¹°STWü!ƒÂ§ûy;-V’N >A…c^¤±ŸbûL™:ÑÞÂâÍDó’³Ü²ç-n<°Ü²ë\‰„¿¼“81¼ÜòIõç+¦»eV;ƒÓÐƧMñU…&½“Yš +¿s¾f9ùO§So¸òr˜ÀÅ̘ú)…Æè=Ë—MÍàQÒ´…jìcYå^¬L+^è³aõ£î:]FŠ8ÕÑø³ G Kª¶sl"Ó²Œo™ß¹º(Y]S(ŸÅëÕGá^UY,,@r‹¦’TÍæ@Ñ™ø ¹G1ákêøtç°¹i£wbTúçHº0ßh¼ø8­Ãä‚Ž,iÜëi¹àÐ\WÁ:[Öô§¡ÌŠS±‘Ò5¤Sc‚Ž¤ÖîàÊX¶=ì{„€Ú£µ–>ûöÞ}/:ü[ ÖZ !êšF£=×.ÃÒv«Ss„Wß±®%)¡¤BT;ZIU¦Ð“16úë|Cjç÷ÍkhqØeéóŠIXP #Œêæ3Õ¿$ cŸ‰b7 nÐíXŒ€‰ïްГUž#¹b]C•Õs×õŠ›$tÚ_åHP²ªX&QcýbÕšëQέPqßq›ówŽéyŒ +"Q1m>3ÍÃÉv€ê*Ó«KhoIVÙ ¤M›ëNw_À¦ö>RT=ùgK:V™îDƉÂá FÙ«LcTº¦û£ÉØ^û¾QQoPÆ–â¼s,=Æ P·Öïž™ùìIn'PÛ?ÛW;Ìùæ¥~ ½Ï¨AÐJK(¢Ý7CV3¤Ð¡ÔÓ»Ê .$ãÐ(í9 +Hª×6x(Rm,Ùó9'{ºaÇ æp–ãÎçÞß}\Õ4Ëö¼c*FØÏeqÊÎÎý(H%W”0Ï¢'_S;eÕ|[´4$k¯í Ó2i^†¨”iºbùÖúp{x¹ŒÑ{Yd Ð)-\}®×ú‘LV?ÏrUðÖ“nrÔv¯Ôú8øµcÀ$­»ÿÇFDqó9Bð­XÓïüÏÄ<üzù?Gv±h+;É¿ç/­2é6èê//8e7¤÷})¹…ùÈ1ºòpáá3n#سv)ÉtBš×IÖÕœjyÀbuÓ Ï®ÂÖ)GѪ|…Ëß/dó͘­ä:b9… +ăҕõk…&X†#Q‘¿%2ZoT7O‹pÙ·m~ëéqxE‘‘ó°L¢%¸Ëµ`oã§Ãœý„¥R^ {ª%d‹w? Å:L 1e²#RÕ"½Ô9–B i&%`¹‰þ*]DRšpÜ߶PÕhEpÙ?Æ>qNã2þÆð(<¹°/uÚ€ïêìç}Iù°P„ÓÂ/aʃ_ûݯK’qÙµ»4üdLqZEgH¡8„üǽȗXØx` )C‰u句‡¥òµ/“…’fŸŒ‚Ƈ+’*!…Û˜ê} þÄZU¤¯öà šMÃLíó?³½ÅÉ®Z–O:>¸$rÇtŠË†¸ã/‰f%²5ò("ä×ke9tÈsÓ–ÎPŽ;fÌñ0Äl¼xNÃ$Ô/„K¹rHˆ|ÃPšÅ7ÈGÛGè)úk1c\ë¦JÂÒƒdÏ“xè‰é`Æè;ôpèQÒeŸ8Ð{îF|òœX`]ïrrÕ¢Cù5Ä«e[ƒéoðïç¹Ä·È»Y.¡¼¹º¢ÒïoQ‘×UñEÓ#é|GÇ5Gåvt:eìñeñ÷Ê6€ðmªê¼0ÎùuJ©=–ÛÉáK°pÈ/¬Ÿœ²3a¦¤c‘»¼ÊÛ¤§(uÔ|ò½bI*›–©a­ý:Qó]§7Qå×­ÑÒqµÔÝA€ZCj&­¿ÕMmùü5òì÷l{Ô÷NrlIÄ6¶²ßkä£Q·ÏgZÞÿÞŽþæó_\¥V~)·÷e#®ú0ñîÃÜmÅ–Wjd<Îê—È_a%Ÿ¾ç IOÉ`àQg(Å—rØu±†ñr•Nzâ¹ÉŽ³,k…ð¸Æ[%½¥œT ôÆ ±-:d*yËÀz 2ù9_…V³–`}ºfεÁ©éÓQb9™¯,ø㺨¥+)8ÐvMÓóò}XߎöÊ›¸h²3OS˜©ÝËWÝ©È98ÌÞDÉJ§”' ë¦k%"i(© ^HU¸‰E´ÓM"í(Ï<Ì!‹…²VTô@Å·;&×uTã_¯|ã@läbz̃÷Œf'œn}RS×Ôñ¯ú€÷®ÝWM]Xiwª„ä9*Ig^Þ7:é"îŽHåéHâ–/ÞŽˆÅoÓÏ×»¶"Ûì~Áï1m)YÉÌUK!.©\*Q«ü˜uxɘ¨  IßTÀ6à{†æØ ÿt¦IŽF‡Uô¤·ùUõ²º¤~OÓ”[mLØÈärÃû¬…EÏeˆ$SÇ-¥{iêc€€¸ôÊSÕŒ~•K2¥¢ºIçí4+=n¬ÒhP‚!.LAßZœ—A‡ >y¦ª'Q‰ŸÞÆ1ŠÂ»Ï°ÉòWYÑ’àO .óŽí“ 9Ž¾Â™Iø1MÛ^>YŒŠPaXS=D•Î¡ÃH÷£ßá§-œî1¢ {ùš^¿ûDRÌ1ÈϨ‰ +åj¼ÄíyÉWîÌ-ÞYeâ”^P|Ѹ縱B)— ]ù¼Z‚¯²´®ÕP?t@'M­ožiÂäÁº>5mù»Æþ(C§z…Ê Z»R€=ÛN:Nœ×PK Ìu2*ñég¢Uª†õÎX7a:¼“‹_¡ÍEfÙÝögŸ´×­(yöé”ä$B0åMÄX”¹°a-{&£$>°ÊÅÇ!§‰£PÆ™az?k\M’ÃǘΟ¯Â»|(ÕE£_WF1"•B5q ‡y³9˜?ÀýÔÜ凲˜k(ÑD¨ÐÜ­Ë%’M_ k$†º:–$:):4}MŒ×µüÆ£A_V9²!òŠ@y²èI¨ÿ›àõþ¡Ð’ãED-Ÿ¾—ìŠ š6&¢ +EÍÀïíÌõc-„ºGœ‚v1ÒÁ n˜ûÓ%e)A—*÷4"ì +w©fïôöÄ®éã¢2öÅÜŠ~´zA—q_“1e¸âˆ#=e¾>5ЀQnïoŒÏ7Úî‹=ƒ +|]^,÷5CÁJ¿­XË‹ó{êÖçèÍäü†ã£¾ö0²U\ôöì3ZÁBŸš=)ŠBÅóO2Ÿy˜ :êÕßõ,wÙÌìòé\ßmm*BÒµãiû6}õpêáŒOI 0yø°C„—ó‰Jï×ÇËU–î°T·»½ØvDûò¹ñ_D,×Ðj+ìi çK°£z„â<áOΚK–¿û$›$ã ê«·}ïÿfÛºŽ8~†½g3w›p-ÜE3†NT×— ê‰/~ÀFNÞ…zv’V¼ä˜×RÁ†#颞â6Xo™Ä6qӱɫ^¨Óâ¨p'd€¤ÈÃta©‚9ŠÅË–8è”MmÎúŠ0³Ÿ¤µÌÊôw{ç_ð’l»òÔˆI£òÌCû¹4Ò ©š½°(f®cÑ.0átlã’·²XL¢Ÿ¤5˜~4»§y Æ@³k{(̈Àn} m{ÛóO®Hl€ÝàåG;R½"Ï>'C§ÂéÜœ(‘!ïä8Í•È(mÊ{ 6t=‰©OJÄw]RËs£ô Æ\pzs[ú±{ÁÎC_|ÞwÛ¢jJÈY̺ŸúÕÞñ‡-Ý/¿Ê¼Y6ì)E`w¹†;6ˆÜ„¿‡ʽR6¹Ú£FØl@eç2ù؈{úý ïþõC •s!Á”;66­R×Âóò··”(*9÷WsÔÜP÷¯œ~:`3ŧ3ªGZkO+ÚÈRSY|ë¼o¢1¬DpË9j-q—ݵýð}ĜαŸBÈP„¹×~ùé¼I2èüš“xþÄt¼Û·?//I³r,í>šo é`ܨ=ƒ§Z˜ºüúí?P]ãí€ÓHÏ¡ÆfØî¬LUébH i}pXabÝBdßùˆvǾ^È0Ž3¿a6þÐkºnUõOsP˦$éÕíÕªˆ'Å\ÈÞ‚LäAc ¼—c·¤¾ÅŽú¥Äe£”ëmÖÙòÐŒUÚèÇÝŸ â´¯ay0=vêi'¼«nH¼ŸnFb²Õ¸ Ò€ŸƒÁ÷!³¨R\ ÿÔ_ ©½ø m!·ÚfF&TÕC kîª0OØþPüb|S½nØÚS"ë!Q+LºÇóå·šÞ`áw瑸Ž7ñÞ§GyÉç~µ“/óœ_ìÊSO4b›~Z5ÕRj9|¬ ËDÃy]:Ú)¸Õs4uTŽ©î£Ô/ǤŒfëäniúBå#­#¨ä‚°1ÂÎÈ¢v’0÷µÏ•)6êS^m^Ö2½Ì3mjŸ®°³*/M'O¼öõÄ}µižØUcè/R4*ÉÏ”g’²ãþ(xê÷C6alÉ!¢OUT»ŒòKŸd¡]1£QÜW[ O敽ª6¹H;CÏ"æ[1jËÐèÌNšô:„™·v+‡®B½»êcÝ¡óÕE# +~uÊÉfÃ.!#¸ûù4%mBKÖèE¨µ½ ÓX·”6LÒÚ6!³DYíaffýOûêWNª}ZÞg‚éž›HR‹êõl—z ó×ÔD57uó=5†!'M­‘‡AÒº2E‚¯:6ÚF§;©RÞ‡[BzK+Î +ß!`ó ȲœeW-‹ó;$Ë«A~–Â_'´/ ­féí=0-ùpe ýb\_"¹"f]Äâ·5|íD¹CVn6³vhýbï¢7úÃEg7ÝcXS®¥ª`Uö°LÑÇA_‚½|f0gÄq¨XÇ.û‚Ç·pß®kÄÎæW®Œð…[‹P>4š ·Ëÿ´¥4vç’äÐ ¾뮜ïJ–Cü8ìœçZZ¦<ç&ßö°1æ^Ï=¦õŒϪÈ‚?Ytß_-qÝjá°ïÓš—>¿`¸ +dº9„ÚÑ£onÖ42íöÕ‹4ͳøªƒ“Ûˆ  +ÖÚ@{”e­^ßxgD_ë¥R6ŠwˆŽ„-7[:ëRöMÂd›2x•û“öÙ° <ÍùG{|E¨ènîÆrSìÏíŸXØòÄB¥:q–hŸýǤŠ§éLä]"bF&ÆWtz`k£Qøªj¾ƒ¾±x±2U?¿ +(|Yr™¤AÛŸ•^þþ`ãMaá“Óe–”ÖOa#aTÉÐs;nÁ@úwm¬ì^ùÊAÄÉôæ"\í¹z]Ñ ÔŸhÝd‡Ijœ×éóæN¹šæüŸL¹†>Ã1NeÚ‡iÑEÛË¢Rõóó"( me>´â åâTï²ìÒf|ãÞ/œe¸²bîµË× +ªVŽ…¡TYÏñGûçÕ‘¤`s +¢à³çúísÔëbdÎ:Õz’¼¶qËyLmcãvü~(5Xt¬_ûïíX(úÎñ*|<^ÕV$yAQ°¤¨Ó@ãpvZ#{-/!~+X3>mÚŒ¸RK4=ÓÁ“¥Ó~l_r¤Ó콊%«‡MòöL˜ÊH"l l´å"ßšÚ%““U–÷ cê¥B5à+ƒ_'Ön*œ·Ø =HDV"*õ¦À‡ôJ±í« kwV,f–¡tb,\þ#¶÷"ã\>“hYß¼†÷¾‘xïÕG™šÖ1¬Dµ€Êàw|©+ï¼lNü?x} ôr,st…"øÀ<…¾ô§[¾B¾"×-*¬ñÌ™d+Ä0QÚÇ]hlxŽýZ{ubÐŒΰë*øÁLCÓHôÍR{îØ Ê£$þû|w;˜™¨2£O]+.âG¶ÌÛàó›÷²â9Bt ÜM +/’½oÛ÷¾^LL9-†ùʈ†?d×8 +ÌÍN;^I^Ü<8[afóøüìÇig*ôB¥ÛRôÚ_…'Ñ·°¨’sÚær©t É­Z"q_½âæ.YžÞýìóörµ™´vE»K +“аg¬¾yrÞ×^‡aî7QvN1}×±Á꣨å¶Xiœ¤Ê§¼„ÆæñR£îQä1‹Rä;Eøê'Æù×Ã5šål§bùøå8ËÌeѥѷڼ'¤/gƒªï¹ÙiT–Œž%¡`ƒãÉ!9}¯íêxíFYû@A•l”PÆ&:qNœÔ®Ûª)Öºq…ÎÈÜ~:   + ë— ^ú©8ð7'B<9ørIÈ–°ºäm†£Å6üü»É‰áËe¯^º¸ÜEÇqwÆòÅ(*õþ©s~¿•›½ ÁìmQ-V+¢&Ú·I„' e¤ÝV‡ ZVfñ_6„Üä^&,³¬ÛÚ#¯ 2^ã3“D®<ÄûZÐ P}D¯mþÜF`­§5N—Ÿ7¨³ÊŒ´Ø©QmM¨Žná.^"¦ä­%ÎôÂœ4võjõqF°Âù{ìmYUOSðöG²ˆShsàšÉ2Eø54^“ï§cù/ÕD@ŒBÚt2[+a\^b¦~üi®yxûP`éG½ økj–>¦zSK·±Næ)c¹“ضž­]$+¬àUF¡i—×XÜâ“ØÙ±Ý[!"ùhð&ÜpoEáX1YR­¼èךï3'>aL÷·üˆko¿DÚꌶY¬XW®Sì'fc$øBÝ(D¸gÕT¿ë `½ä$´\¦]§‹³r³ˆN‘´þˆ¡Ú;7Åúª‡mGÎó¿ü`ü‚ÿ'¬A@( â„:`üÎ?*endstream endobj -1035 0 obj << +1040 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 35 /LastChar 122 -/Widths 2129 0 R -/BaseFont /JWHHZP+NimbusMonL-BoldObli -/FontDescriptor 1033 0 R +/Widths 2151 0 R +/BaseFont /GKFSMQ+NimbusMonL-BoldObli +/FontDescriptor 1038 0 R >> endobj -1033 0 obj << +1038 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /JWHHZP+NimbusMonL-BoldObli +/FontName /GKFSMQ+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 /FontBBox [-61 -278 840 871] /Flags 4 /CharSet (/numbersign/hyphen/period/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) -/FontFile 1034 0 R +/FontFile 1039 0 R >> endobj -2129 0 obj +2151 0 obj [600 0 0 0 0 0 0 0 0 0 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj -1026 0 obj << +1031 0 obj << /Length1 1630 /Length2 10814 /Length3 532 @@ -9893,8 +10054,7 @@ endobj stream xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü- )@h`g°ñññ!SÄíìÝAæ`†š=##Ó?-¹ŒÝÿy‹t™ÛhÞ^\€Övö6@[ðÅ;P€-€35 ®¬¢#«$  “VÒHmŽFÖç·VL  ­`fç°þÇ`bgk -ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øêš -š’JŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 +ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øJâ¢rêjŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–># sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦¢'¦ãfü¯êäœíe'×ijÞ ^ú«úò!,lÌ@Q“àx¹ ªy—3µ€ÖßDáµîÂôÄ©;bi¾©õZä7ôÛf]q?Žlcß?‹}…U´YFVg½\BšÃfÁOAœ¾Ý=ðÑP†>b*˜ª¦ ‰¯írß[îEÍÀo]æ7hÍO#Á]ö aOp£Ñ’ݬyÝGÜéÁK² ´dÝŽ½6[ Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâ¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ ®ŽW_hi+yñ¸âÅ‹…† -ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦vY`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦v> endobj -1025 0 obj << +1030 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /SVLVEN+NimbusMonL-ReguObli +/FontName /NCAJSR+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 /FontBBox [-61 -237 774 811] /Flags 4 /CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 1026 0 R +/FontFile 1031 0 R >> endobj -2130 0 obj +2152 0 obj [600 600 0 0 0 0 600 600 0 600 0 600 600 0 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -949 0 obj << +954 0 obj << /Length1 1606 /Length2 17112 /Length3 532 @@ -9968,107 +10128,104 @@ xÚ¬ .†ÖF #['*€©#ÀúßÀÈÎÖØâŸÒœèÿb 9 Nö&F™¸™Øÿc¢Ø›8ÚX89ýýX8Ì lÿöÀÙ`akdíbüOõ¦vÿJÈÞÑÍ_Û_0;'g'#G {gÀߨ ¢bÿÎÓÙÜÀùŸØNÍ;Ó¿žÆvF.ÿ”ô/Û_˜¿Vg ['€³‰»ó?± MÆNöÖcÿ³w´øW.N¶fÿ•-ÀÑÄÌÀÑØÚÄÉé/Ì_ìºó_uþ·ê ìí­=þuÚî_^ÿ+ g'kSz&æ¿1œÿÆ6³°…aøgP$mMíLŒÿÖ»ØÿO›«‰ã¿DùÏÌPýMÂÀØÎÖÚ`lb à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;ÿ^0€¿Æ øgÇüÿ| l,¬=þÞÿé¨fòï ÿO ’ÎÛ dkö— -FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ÃQ9õ4ÿ¹Mÿå¥ð—ugeû¿‰ý:díŒÿ—ð†°°;À‹Ž•@ÇÌÁ `çdpr0ùü¢ý †é¿dYgG w€Öß’™þUøÿøþKÒù˜¶FvÆÿL‰’³­ñßÁú_ŠÌF.ŽŽùü×]ÿ[ðÿ”ÿ5â&&î&F0kËvF<Á–é¿2œë0sG&Eµú˜@GBìK•‹ -ükìzýÒÃw¹*õ?kC蛦¹¿Û=–Îí¿¥¨Æú0¬)zSM®óñ|H¨ú ·È;9hŽtKá3.Ô¢½nevÀ4ÙUö&ê–|BàOw²8BݼPù“¸ø£‘>Û#ø¥5Ä¡w!5¡Ôž_'¾}Û kZÿôóüwÎá\àèe"°µî€”PX™/,3"@<ÔSÂ{4ÂÑ3#­¶«i7.øÙ[ÓZ‹ ô­·6åÇ7«¯uÇeHfÕŽvl9‰® Åà.¿ÚCpôמ¹ï -ÕZŒ™ÓØANvŠ]Ïy–ãÅ{iGçý2ê-úA¢ÿ}ÛcÃ~~*æcd@Œ„8ÓÔÁ?W‘2,Åi|Z…È%sÒJ CÓº‰¼¬–‹C!ýñà Ä~0w‚—„L¨„ ‹¡=%¾,jl‘¡Þ‚Fø8;í¤JN DË·¯U7÷ôw¸àô‰¸gVáÆû)§ª!‘Neå~Žm­EGÂýqÊ¥ -â9þÝÌ_*nÿAv ÙSáýÀ°v€<÷ÁÀÉŠÅÜä±ÌWá ŠÞâÿ.±hMe”:X³Ï/=\“õ 8èOª~îTˆJ~^‡Ò¯(E>JA±Y|̼cæ¿çÑ°>Pã}õÒ¾Õ*"SßRØM}ñ7•KŸa:uÖKúÝý HÒô D¹¿£„‹lű"ŒƒÎ¥Õ\ÏR°#_ñ1ò—ã.±¶•õ¦üã7JZ*|“P9 {Èñ\U-ã±°¶ -Ú¡QZ±¢›w¿‘•Üv7óŽ-ʇJѦ®!ÀçÜ…áÚó¬Ë9€FÿýÖì=|»KYg¨^BX³Ø€ÀþJk8»8—MzþòÎ&38S‡uìTÌoŽ $àǘ^zE—w#ÊÀˆd8ë;ãg]¬M,ýt’Ž{ÒÈ%Ñq%%mw„­Ãî@Jeâ_õðßsÞg¯`¦RÈ5EB† nDŸ¬‹Ÿ"8ïnx³E4 V;þ6Qh\„§Þ=½X ’þ“Gþòüåŷ싔셭bŸ§ç\EÏñ Â—°w#¡<ª˜Ûa·÷‹~uÔ›š9>kÕ`•–ÚX´nz«að|ÏǾävœ«Œ+=L6¾Møf"Hó²†ÖÚü‰Œ6ßñž? - ,ÐmÍŒ%²Ž¬î|ø"Õ?YHå¦õÆ]½ô!P!1):X·œø~R¯µËöÛÀï/ìº×Ø,‡°ñ·¢WÅýí`ôÐõ g¥°âtãÏ䱇sæ¼e³Î4MùGî>8¶»’d÷ºëFÛÆö¿®3 û°½i.ío±Ç|Í¥Z’2D3yˆPPjñÕfGüf0¾è<5éõ!S¾/!u¾ûµÀÓš -Ø:|‚¬·.¶–ó_Mv“ôacæ~ϼr²]‹Ë±¬ˆóÄa©Öbß:g× ¯ïëb¥-±÷#ƒP!»‚ŒCîîœbL ÓÞ˘]÷]¯* dÏÕ §„n˜"}x3< `C X‰ì4áJrÛBHõ“ÁÊ„edÔI¿Ì | `Zþ©Å 9;LgÇp™or¬øæ•šÀTʪµiÇõo²G3iØD‰ùÑ®äB·ÌeãÿBÖ’ G«¨¾7”2À#?Mš*í£gm¥côG=èÞ[|T^Êh¸Õ>w~õO¿þÜДr_Ï68È·R©¡XVÏ-‚˜$JÁÏBG×2E"ÏÈš×å=Ú¤2߬ '¢Fö‘bP©¿)‹ÐÞ Ç³Í~Èo´‰¯Ëd˜ž¨D¹²|§ƒ#!vµ’oÑý$WG+³…Íö÷—¶vËx‘’ÁT:UYà‘’ˆ”y€—øÞ¨ôû³b›3¶¦~"î ³Íþ i !ÝT=ŒªÐr/ 2çñÅÂâлHh:cA×ušÍ/[L€ˆ¸?´4~i-pL6‹¯¯g’^†æ -v߶o…'siEI݇‚>TàM‚ ó.¥t§>À)— 7J®ò¶M¶"Wv,ð ò{ Ò~|oÄ$ï!½Ü¦ |ñõï˨²ͦBÇÓX¹2á{dåÖÔ ÈåuîæÙÓÜŒ¢± -åsõ´ÊåÐh?‘«åŒß¥éÂExÜ%8Û5µÃ³ÊóËoÁÒ¨§^RýÏjfrM¿Êí8ÅŽµxà„ˆ;“JÇÒéy.±\Gj×tP6;L` Ÿ6ìRØ#6C+9G÷`Xòñ/+?þ±ÔE²d n`ëæ/F»Ó y³¦s™N520üBoëÂ¥ÕTu¥X³W™ÓeBi¢±¡Ú€™nŒÆÕŠøÉ t¢Ë¨ûCØí ¹Í^„<ß™&ñ2Ý5’­*}¤ô/Šd²FЛØêZÁ?˜M‡þøËá̤( ’ Óü€þUÒ³Ën¾ê|*0¢¤ô;‚·èb€ÜøÕO1ñ÷¯‡¸ÀdñëxÜ\6€¡A©¼!r“›ÎWL¨ ³ •Ú ªí⯣nT“Û¸ ;¤ëÏDc¹B#e >ó—lê±õ2ô¦ÒPùi÷ ß±é1¢é¼½Y½ë—aÉu«Žœ.@’Ñ é¬ ºá)ÒK“b§úb¨‹’E{xaüá;ŸýIÒ®õnjgôO¸·ï•×_ÝÁ¬Ÿ -_Ë£Ý% }\RÖ:èJÞd­ÖX¶d–> /Ä,n’5¸r%£à²ºš–øŸmV$H‘Æql=ˆKZ»(‡ruP÷S™äR“Çчȵc;"+?Ócù†”•!kȼª6´ÊïÓ‡l¥ýá4Ç(A¦†K)-Ý’vÝéÏîÅ‘‚LÿJÊr ÷è½Úƒž ~g°Ç¿2c‘„$St[Ž¼ì“[É]ø³1Vz¶ÞZè±J=£YR]5Þç9ðš|[EyŠEšÂ:4ÿx©â+*©æ>ØyDUÇêhÌÒ>I .­ö=ý1ý¥Òc@ßÇîìq㦒ÇRj¹z8¡v˜»7ÖEUß}-Hè2¸Â…÷ÇvV:¼:_ŠæDÙ¯ñ‚-§¡mé«VÎ#PÔü4QÖw×ï7`§¸o¢JžàFݪ<^ÌÓä9+²Ãóm%™¬vËYàQ¾`ƒáÁ¾uïÏi,gϽϱ«â_–ó®2 ¿^Ò–L€pi`J¶Ä =C‡ç&zM,¸M,<Ôy 1H†æ'vÛÕbù“nx…óÚ·ýKK*›¥,/6y#?H¯[M¥UŽÜÙX AçºF1~¯¡ŽÆŒÀç¾ÇýЗZ]aý\WÂ2ز»p׸ÌGáÜý¶žèuvßÀŽðucŒõʉ¬ËWÑeºwXSH±‡?Ï^–“\ŽÃï¥H×y0&ÓcÒIJVîÛÀ©×Û ê ïžÚï‚ù1E—Ì3ß®jf²ˆD]õz I퇹`ª¢Ö6pÛ 1ÚaTm‡Û™úß— Žd±*{Æ",T–]BÞÐoæ²V4ÚX>}Á+G C¦2ží-L¤JËÄÂ~º0¸3y©*¥#fç^ø¢(¦þ˜QËŒ¥m0ò˜&C–òŠˆ\ ‚ ·sTj‡¬A:&Ô¬XõDGi¬x~7ãJ/oìØ Ò—48é®Ì¨¤ðbÍå8m{|gòG—b2m˜êVüoidmçÑñþËÒ6ài;è<ҤϹ‚%lYãÍ¢xÌî—jzÈÙÉuLƒÚu_­\êæ»´åe¿÷|2Du\Ô`ÐTãE»+‡U>| -RÉ_‚!'zÍ”FøÔ”Vé†u# Žežà º°ÙOLSÀžeúíÖEx!#ãp Ê^0ˆ1üS¸à–lƒîÂC‰«„2í¸Ü}Ýóx(¿à -ξ.¼ÙúáäãD¾[ÙvÄ›)LH”k€Å!C¼…eHêtrƒ÷I/K‚ Ì'…&‡"Å‚u´ƒø.BˆJ½ÖÉ6Ï<ômJ®b2¢´Û}ArL®'îz“$ær,ýíæ%¾Ù£ÔYª„ G…&ûÖÙ9s_CÆKàöÐÊÝQ"K+‚M=2èy_*ê‘®VrÇbæ“–©|.()$Yám¥¥ÎWîw‚45…[ -Ý÷B#?ƒôúT×ϧxß :ÉÜápø»ß­Ó«§ Òµî2Ó­óƒ׌Èð“- „Z°è–¿ - cHì›R¤»°C\qbl -pïswóH -kç„¡ºØ-y*ÄmkYÙ>â2š¸’Ë»§ -À§i°~†Ò°ŸÝI}ƒÚi|ïóPãAùÖ /—™¬\µpe<­8M#¯š"’%+ŸÃ~ÖÕ -zAâ:Û—p¼!™^ŒúvAò£b<±¼«·ÏQždWŒøÍHŠãD*uK*½­:ÉíF~±1`gÇTÙŽÍ€2 úí¶­XšZeï§òA°´´oƒíÖü²™Í’h¯Ò3Î3{VslÆ.kîÛåÝÓU½jh•² gÇ?³ü‚:©’-“ûò–8HMÌ™Bnñ&Bý@|Sn'‘–½%T7ÜÙç–ÑN„ ›¼ãd_ÛC3®wÇú»²ñp–tjºHgîUŽUP°}Ö7þ€ÜI±ìrLEm° m×Ei—¿ú„V½ïÖR¿ŒÊ¶fn<›¼X*Yµçç¡4ò; Öor>Óqí¤sÒµ"…ñù·j§t‹¹ÒØ"⺋Ñq§º(±ËóˆþŠ -& SºY e H;Hÿ—q¤ðËêXæWiú@ã&kêoÄé"´%ËÚúWÅ;yfÅ -v«šÌóvI]ô« ;î÷÷¨¸F÷.Ù¢™ÁTÌï„`/ ¸˜˜­Ji‚>S,®#˜”‘Ž—õñMâ‘lL÷Š‹ïŒ®zöœçŸ¥z¯„Ú^Hì»8§jƒ9Ux,§}s'^­V‘Ÿ«¤ñ¾`<@\-ؘãûÄvžN‚ðüìAåqy|ª“™Ç>$’ïÒÍÇH¬ðù·ÆHÄUÇMXá –&£‰.BÍÓTøÐÙ̃DXÂ5ʼ$×Chë¹âG÷ MøÄ‚)¸ÕPk®GSJBc‰%»ÐXê›XÔò‚bcžëóBq3©‡É%øÂ8Ř½Ý·óÛV•‹,,n¨Àˆç“tQÌ¡úL;Ržˆ?úzGc£Wt›qØı7¦¦„öµij6Cì';*8ûAŒ,XíüZ—ø[]ÔóÍä#S*Mͤ˜8µÃï}I‚(/´Íd:Ç€¾•[ăLMbT¾ˆý±û9<­þá⼨d2ʦ¯·Cj=’£¸@ýŸzv<“QÛ;úbñ¤ŸºË¹çd)m§™_h(ÂêÙ`¿ØÁ4t„0¨ ,ÀúR æ.bÞXôCMj‡î×ZüzÙîæaò3“æPgpÁc!Nn<—,ï”b^ÆM¬3‚Ëpü}ƒp:}|ô»DØâˆ]%'ÁTå¹:#›AÝÍF‚Vã0b0‹4pÏ‘Ï)hµaA+Ûz¿C¡è%mÜgªą ÉIßb{Á6‰wƒ´·T£Ò‡c–wºf -{{~D'ÛûÔ ð.$*>>¿¹1îmÌ›ÿ‰ó(¦Wýbš¥ìl6ÃÅ>-³øªd~R3ù -|hD +i^Dí£.(€ù«483R£ÁIJ“@¢t)­ü„ÔIm1iM?!+øM{äa÷]¢°A4àƒš$–O}÷™'ä§îÞ¬Ò[{/T|F¸óC}¥Œ±°sH|=OKRe©y”‚«Ÿ>¼O¡ì%œG“)Ä6<¦—rÔ¢þS,ÂHǮڇ‚‰¾Ì&%@¡™~j5¢ÐW¼Žã ­ÑçÖû:èµ{"ˆvfT!Æ„ï· yµºqIzÚ*˜mÖvÉ?5{T×0DÓ£ b9h¡ óòyÂ3–½è" -øvéç¡ŽŸQ-\~X^Y<.ê /ŠÀ­1F0îñ­ßÀñ¨<ØøùJ]Rî9˜¹t›V¢6[8ýÍÉô½T5é]ý¢âì;÷¨:ÒB¸ájÛÑO7õ\CÉeáÌq.ªš¡èËŠH–»ªÛ©]ïd”Ò+>,ܼ`LšoXGØçv-seSÞd¯W†éɇ۞ 0§H[x— ô…Ì>„^¤ÁvJ• ð@FƒÞ„–ôÿ憉’étŒBžÑ ”ýÕ&!¶¢ªH*Z"¼ñG¦?€Ââ‘Š¬g -R}¼nÜÎè-xâû1-ÿ;„&Y A½œ¥AçºxýˆK\ëS‡¾¨ b¥nGU/0´J·P›Ò(ïeߢ½œiñž¨Î»È’È g 1ë{"ÀÜ|¨G3+a/Lò·Ù¹–ß2çÓŠ,›»Á¨©âà ½F9¿¿#úSŠoxûCw|g¯óu`¶ªu¤MÔm†² D™×ô—|ë3Ž;Û•êú½W:Ùe¸Ìg-ö(ƒÀkЋ˜®5ü¥ìTlf²¤íiìØMO­3prN]ý -AAé/«®|ô‡ïm?‡ïŸý±jj2q¾4(æ²Øèð‹zQcaœ–çTýr.š­5Ùðþ~йc¢{ ¢HËœ…"$mæUËbJÑO£¸Œ ÿ 5ÙN…MÛ¡ -¾Ôáç†8˜¨±“EH•.¨ü‡ÐFM)ŽC‚†-‹QõYzö?·­l’KÂDŠ¶öŽ·­'÷!QiMùbƒìè÷ÌË¡k †ÜÛö -ò7ðሳÇW°tò>*4HN˜zú½á0 Ð\ìiüp?ØJ³)Ó'žÐêd<×ê`YæV .-Y#ÈåÜò/¥Ë(ì…ÕqÞÎx6¿ATK,rOÈ Ýœn¨åá¶4)š³m0½¼ˆ.Ó3Ãe¹+Îvûçg¨[ù§r©Ñk]x2ÙèÏ,Rè\žmê,†J ZFFx¾8ŸïÚu¶.!¥^R¿o}ø¶¶Ê—ºNy”ì1€XÑ0× yⳘÄû% -ý³[r]Ù'‡Ê’œÕV©_jÇÅqÛ4åÁŒ¢ð›ÚŠC.Xuÿ ûûÖÑ;exhhÞyvM¢*Š%`d#­˜~Ýi­4Y}ÏtRµ£åvíùÐèÂ0°îÁO.,ly9.<ÁøÙ+ÓƒÅÔgí+¨XÞ¿é^Côkë;“[QÎÀˆ2È7ü= „þ8ª§xuü¦HŽ(ßáèµÌ±mÈÇîçV»¼ös„-·ÝÅØ UÑ7êIàÌiΘ”*9óÅ“ „Rä¨+üJ^ôny -QhNÐúf.•“"©xÆbä!‹4ö|/8ôë©c©û¨Ö2_Uÿ9NF“¦‘˜8MæÕÁ -E$Í] 02vL¿1ý©â&ÉwxÝîÆ;|JWF³¡¥Ü_†>)27ê`Ú>µ ½| ëÔ©$@ôƒ -¢Xo× ¸çœ÷åõ¥|_wùät ø²jšç—¶:âlÁÕ*‚h#²°#Ò”‘g¿s$Hç’gñ&¥n!"ÖÝ3à T¦x›iã×/°…æ÷¥hüiXðꪽ1[„n” ÅT²µÖ·@Q Û’….nŒÈ‡0¶ÇfÆÑ8… ‰ŽÝÏsÓª°—yXæ[vlùðNðÏë­ûË$b71¹þy/pß-aÿEˆf¡¤b-~Kð’‘êçȃ¾>0°hü³OzyůƒÛ{´ -Ïg•¤ÔÒdkqQÛÓÑW_½æ·¦5ˆÞ°Ä-IL>Ä‹S¶?üD#èU‚¯ð&š¬\ Ãàb‡âÂÐèrÖX[nþ¯L^•S¿Øš1'¢/n–ÂÌò$µën/&glÑiø‡ÖÅæaCÀ^@×é4¾nï¹nIãÊ<÷I‚ŒÕÙzßËž€¤˜Zh‚q‚rŒ±^ZgÇî=D`ÁË¥ƒ†·ílâ2A³õ5(q:Ú0D~¸ø/ -úÀžºéâ9Bõ$ÚÀ +¢§0mA®ìR–¨öüBQÀ†9FJÐÔ ²õú ï™´Œ ¯¥µßªñ_['ˆ|zì·UÍcNiØ11žö¨É|Ú~iÔ(ÙRãÿJ T-~=ÝZÁBd´¹³õ(˜ßHK?ÄÍ‚™&Ð=¸LszŒ%:‘W^ßµwk-iéšRoº ÀSKd€{™W_Þm¹°Tk•3*TŒ5õ…ìÐh6¹qºÊœX+¿C²ç¸:ü€2–¿ýåX/ŸD»šÃu Y· ñíwEAM·ôå¡9ÿ®ëŧv[ŒÑ º.h¯l~gfíмiŒiºI&›“~l<´<},n_MWêznÏo{êt ¦™‰!ÞEâ37ÔC)jFC ;> ªÖ“UL¾Û5Ã1.Š§r™v¦zß3¶îŒš8 î‰ük§{°pX2>}íRCçXñÒ@Þ4õT4_d„5wé´9¿ 5ŽoB¹ÐPªúÏŽ“=^šT&[¢« ™ -Ü ò6éx3¯¡œ)ÐlXÞ:Ø#kõ«!1ÌÍÝÞîv¢[m4ðg¥¸ð«AA07–JîºywÓ½ßñzHM_PQ =#Ñ4hŸÝžÏ%Éôúz ¹F˜'Ͼd|"óÖÊÃÃ?öÞ*Là¸4vô‘«ÁŸ‘dm±Ï@êcOò÷à&Tp0’“K}rÑ`fUx~kÍ[q€11Îâïc -àà·ÜÊèëTwAU!¾Í†¦vÆIˆ:#·¿âŠŸ?ò—´ù}’A„rÇ܈ÉL{@½j»<ø!Ñ«ŸÑªjH¶Ëpá• ž¦oHä7oáDžGÀ{{«žT«îÅÒ[Éh‰{Ø]åO]Ø•ýÌ1ù"Õ\³¢Î}Ї)õ»XÎ3«Â4oâ#Ä£Œ´9Ûõ4‰taÊüÔšU­q7Æ6y·ŸXDºoœy§]C¨£zLyX_°ÂÃé¨2ÿhfåϼäo¬E7ƒnÇWvV)(¦Gè¬[ƒHlÊõIÖ§;Z‰‰¥Ë©¾7"M8ßTÏ~«·—.~¥òN^Ël­ÕÞӷ* Iée„ìFòäoÄÍ´]P‹^m5YÀ IƒZ)·O„1™Î艕þC9ëü(+3®áИ7—Âgry#ïˆUƈYÀ¶5 DP í´û¸Ñ?‹ZK '¼Œ8±Ç!é‚ÃœiúдÞZí‡Ù€b¾4šÛÆó3ð•Îg£ÆÍNt³d#8g¢¸R&ürzmÔ? ú‰¶ZûX(ŸBßv"Ù­~ìD ãÒú‹;71ÿw°—1dÒÒ~ikcFbY.Õh•/;§pÔÅ[˸ÛAp,-÷ƒ@b!4–mKß$iHR -„ŠèÄŒ®[1õŠSG›X*£ Ç|ÌonçþÌÎ`mKý‰—5µ°D®Y‡`´W¼ÆÊ;×!søߘïÈöZ1¯È O²­†‹òS6ÌbþÒìu¬í´‹à[,5a„y¬‹ÍæÝ÷§Bc/°½\ix½¿ñälñ`^¡œ" Z$6²ˆ¯µ3îMܦLñ¬ªš%KtÇ$]ˆe#/…¯*µÀ}ÙB\g˜°àYëû ‡ E)F^SZ¡ÁXRP€óæ7•q>Þ"û -%þ4MG9uÄbÝ{2ŽÐÞá?Ó˜·ñÂO‰t8ÔyÕx…ÇØmÛ‰¸Î@ -»3ç{i›TÔç¿ë bA!-¾9®œ¸ ¬Ër‡åÐÔu³a Ç|†bÍ8R¨ÖþŒ¡Ô:¹‰¶´Àx‚kÄÈÒF{†Í_^±ò"&‹3y˜fˆgÞÜæ(h^¡V˜%U -4½ÇZj,%·Þ,î§ ˆ¾O²àœ8[°mÍÑ ó„r¹yðUýF]O“/ñúó°6;^dï¾ ê'7zSí2¯N ,Ó$œ’*ÆÐru>‹ÔJ#*»"¦;ˆwá1Ô2nœ@f'=/M`AÕ÷ 9£ fqLwËÛ”Û.„­¶gReЛJZ^§í'~êúºÃÓ(ømawÇÃ2•ƒà.„¦n‡@¢.÷DVäý»±–dgÑõþ.ëßH±²9•P´G‘è&D1ÊnÕb"£B³¦˜ë*c°#•l'xýù¬†R™àD—Ý-掟TôË]]܃|6±ÿÝHŒ`Ÿ™qÞ7ø5â2NËl«„V.”l"Së [5 óI»8®ª"‚éhþ¹v¦$-?ò«<*:ÿzªÏ -ëÈ©ËèH§¦]1;ÿõˆVÜ}8gƒ³·*Õ€’`iíT¾Go!&Ó¯¨Š=Õ„¸eeWh×·I?¼‚!okuš‚6@ç0IhÁ¥¤*oNG‘Ü@‹“»aµ+2bü±À?MbŽJ‹Ÿ`û8”ÙpÁ`‚Ë(‹3]6ã‹]ËEÕ)pèŠ_È•Õ¸…DGª³w1¢ëbï:ÖS<]±×# êP^Ö}?¯ÉDéè&wv™±jŠ2Ô’=C¿ã˜Åš{dŠ;aWPqæöqQôÄ×âÚ#¢.ò~]½¸]‹m·ÿãnP¼~gÀxáT‘úøî÷<ýÀžmúV1Ÿn…õïÌûOOa™’Sži3ÓÞæ.ºØÕ½\H›üS¦é=¯ÁFÔ ÂOÊu< yÞœ= Þ ðëƒóWZRw&.e™¨1àsÜðÊ1ÈX†Ã^99kà­£MÖKÿND4ßœ29V^[ uI[ÏèN«Ì¯·ƒíôñÛÅ¿§ U^~¸Lèk±±‚Ô—ÿÈ*Ž!UãÒR×õÚ‡ì‚îÎÇr^ D¿ÀÏs!ÙÅUŠ™ê€jlp0Âjžü#ª7&q¿ñ}æ6h´Â9èPå „˜ÊZíUß ËþËtÊà ÈvŠ«Îž÷Ž³ô)ã” ¨HÊPJ$šEù?#§«î ;ÌXHÖÝÔ£ìú¹ƒ¦Ûœà9QÀþĨ…Íc=?QUg•áN혈½›~Šô| V3­—E¤¬×C)œ9öMêÆ5Ëo£æ;l -;U–Vº'¿P@´ò~þ¢:Üi<8ô_¤;µ^D+ -SŠzªÛ'_P èc¦¹8*Mgí)ÿ®O "z¨¿™Œc),ó•S±:…ìÙ‚0U®f„,õMP QOAQ5‰r*Dû-+±E-JñÛ^k z¤î¼.xáeú¶¾£29ÆÀ•hÔ¿ãC\¯¥s‘úõÑ?õrãl×Ý^ŸÇ=s[í²«˜©áfoçô£?=Šß;ò4]·ÓóUµkÁ”^ÚÖfÊÜúìKZ=lÔíÓÅÙ¹¼f${¿ÊvR²ƒVõPhÜÊ¡Û'Í$4‹æb?Ý 0dLù#S&¬JokÒQjº‚õÚ#³½g™ÎÜlZtn›j‚zì(nÐG7€#ð,;YREj¹†D€}«ÿ9RÒ&ñJ4•À° €e͆¶µ…‚œò„ K -\=c¹²E®¾98wyÖP—Vg••ÄÌÀ÷ æy©é“ÜŠÎf´ÜÄ0pѼ!€Ÿ„üú†z·®Jn%ËAÈÐ=Ð -âÚ?ÆCÏz| þ±rèou¤¥J¡ð9`º · 5àñ û˜ä9X´É™¶”'÷ºœš¿=ÞrŠ2}òzåÄ0Š„ Ñq9pÉ»ô2|Š¹Ðûö ÆeNαðYÿð6ÒúátŒîîF̶*Dÿ{ÚF°€ÜÛ‹,T’«Mƒi½¢‰UÔ2÷•?Ã\~æ¿9«,¿>Ö~z×ÚÇ›?¼ø1èW?œ,ñQ ¾®Õìñ,¦íÚ_J= 鵬Ôvæi«®Æ ï3 -ßZbÔj­ÿ*»5ÊÁÝtŠc@u¤A®èÂY‰îLœ@º<·Â!SÍX¹gË[&IvU5+{˜¼šßéüš)ôK>Aq¡í†,¿èä¨û;©Fæjt‹nòúá¸ZðpÈ5—b»¬=æ„7Jq/kÔ÷d*ÏÒ“Ö¦k‚k¦$ƒ*@2ϳ’z¥ªëaµP…IV¦SWi«1a[C=Ë.D‚j/²¨•. -¡ñÍæ1V|wØÒ½Ý$çþŠ‡J_ùÞ$Sç8e‹‘1wÜ;ËÌ]>-‰D\6©O²mF±÷[¼ü:_­ýúc´ã²&Ò•üC«Ý W -¼Oíäwx%2Äk¾ýÄS(GQœü|sª\ÏìTäG¡ùƒOJý®Å1‹ñpqw ^¿±›±DdOuüÒ¶?Ü©Àô„í˜;†d×xˆ< ÂÓì‹ño½K­Ê%ÊLœX±[×ÚqA©Aw£-¬î2’5´ª2ŸÌœs°ÒvÔ©BòSº ã†^i:?)Mµuß“U@t®~PÉ#£ÊݤHè…¶eCcacÔ¨›l=bßS,Š˜&©§ÇžgVŸøÅ#m.fXí“NÖ{ )tO^¶|àéÂj8”ñ@‘eX€IÑa.²~SfÈá ay_èŸNWú-¬Þ7ºÒu<õÃà”µ}™î¸I ÁTðg Ãg´œä¥~%>Ðoë÷°"« q96.9 ÓNüÿcSd÷¾d&"µ7‰GâxœÝ´EþïñDµÔÝÒ–Ó~í4íLÅ…oÅßìx2b ÊS:_…´Ý·¿‚] £Âih£uÄب‘³XKbâf¨üÚ½¼‚• X®O”­…ÿ5ÿ0¡Y8÷PÚ-ö¥¶÷ãtR× -DãäÈ¥1™ÈO¬=1ô'¦9ö‚ã²½m.6Ëš '{`ê¡8à^†ÎD(|s÷éz¡¹¯Gœ1nßNqø‰f*O‘[Ö\Lbî,‡–Íáó±up¹÷ž!º«hÆ8j"cÔóΨڢë¸Sô²—59Ø™ -*Ÿgj.[‹šœ²¶'iº`Ǿ‚+¤ª$›ì¨éƒ?Îy¤*ÓÌmx¾'˜|g'%ï\Äu,áºn–¿öÓfñQ‚[P0¶ãW~Ø0N(GC¦û|n•/—~ë:Æô¦c*»†eu¬:Õ@md•‡%óÍŒ“‡¾‹á7¥:å…Ù¹”£µº¹_ºÒˆJ)_"³ -3b\å}šzÓ JÜ\P?­ ±r jx¦ª¿Ñ’=‚N&ýòOj¥ú“÷qxKž9 iPŠ5­Ô¨×#é)y²k˜åñÀ…Ôi¾ ëk'ƒØ™{Ξ`Î숉 {é5züñ-à@¶–bo˜zP«uxÿâ/ëSôê„¢ k¸ÎCSx¤`ŠÇ]ÒdÛÎ’E[”kÏîéÉç[DÁ†8ºÒ’èû¸ŠÇ) á:{W†nî¿°¯ƒ†1eŒ“UÅw°l½ê{\A‡ZcÝZÝø™G!‹–¬Àü¤_›Ö†äW¡Ï*¯ÕŒã›hF &6l‘Gà}8¶ˆÝ×}@Ž<Ç_øÅ%“ï¸:Z›“Œp·¬Ñ¯Ó)rÙÂÕxÊ=BF@èFŠ’|ð!íQT…â›Ë.u9õ±Ê~r]Á*=o´Ø.ؤ‚jP -'|ã2žˆ»Y‘{‚vi6 pQó 9$¦û,ß’ƒäܾpŒnÔóß¼ñúføBó¶:'OÙŸxRF¹²úSÐÊ fH—ñÁjx¤Sân-~uGÚä3®»œàŽ‘?ö6õ–WËqMù.‘RÒ£Ú¢ÔÔI™/2U¶JC~ b>ÑëZ/î°’ž„OAf?aÅ H,Oþj¸nšfîÔ^ –QƒŽL èÀ°ãFp6 -áW©²`{£‹)H ÌÊÀ!{eêHÀð™”™V³ü"­)A˜Wô‡ÄgÕÞ}Ï"yþS¯rîªîzZΨnq¦]¢5z>×˹1Eî¸"öˆ=ªæÝ”>ùÀ†·»“÷ á+Öë1ÎjŠÏñLC~Û>ª‚-)0Ö?~AµœŸ"M)@o¢NœCh›çý>^ 6H•ªW¤mE¾ÊÊ(ËôG•LdbHk‰ï»z¶µŒ‰&2Ay”;!LöHs§é GŸ@ËyåG·~Sïýè‘$›„5•¨ÃG¸¦y'¼k/j–Ð@pÓ·Ø ðÆ*Іì ùú…«Éó=à1þì×nLº?ÜåÒ‚©N‹:üâ -JŽË‹&:ß’nd0‡}2·#^ÚÈíÞAW£Nb_̽Ø¥e»pw'Ö -Þ¨H,Ò”ž<1ˆ2,ÀÚ1BÞãÍÐœ†‡S\œ‰>ý~Ô±BºÐñNºÊÕ[Îõ½àBh’SÒoëÚcŽôT“ÉÕS?^X1µ^Y1ªfg/'¦gL¹L‚¢TïhŒ£‰HöIùT²=Ï ¼²ÏÊR‡Ø.²-é|ç™LÐs¢íˤ^¯Ë¬d»"EÏ¢Â4¹Ñ®2iÁæþ}oMÄáxéh-¢©Á·˜ -- |™Z¢Æënw(QîkÔ¨å ¯øh§HˆnïBºM}D«õÌVK`­ËÝ ±}]Ê}ë¼Â¤té\40PfÓ­³8<²ÀE ŒºßÏÉV>ÔKsê—ã¹x‡¨Æ^ì‚j6‘e;–Ì3–Šû´^_GÒ5÷£íD;õ?eú5²ãmÑKklÒ§Hƒgn]èB—ïü׊‘ã6ôß.hun?Æö_õ´Yå]»æ°0¬|Îr”±X¬g,©õq€ð¿/(ñ²¸ŠÁ÷ ËÏ~TxËò‚¶¢õ'V±¨½—(°§_û6çȼ® ÕV /ùïñ©0R¦8«K#K¥¹©ÑN»b¼ H'ÎÙE³ÖúŽ=¨)Ø´=ð7Ã!eÈr%­mái¤]“ðj&#‘LñCwµ"íˆø?w-¢…8/ ,d?œ3Ü9TpfR„ †\½Ò©GEÊÄàšz”õqMÌ_ö«6‰*›¬‹øŸ7sÇ$ÁG¡_îamï~¬)ÎÞÓÀÚ0¶»?­Z«Lf1v«|̉TÇ®27T 0$È‘–-ç3¦’„y!=lpn2^÷'z½;í§§LTÞÔî,¦ý˜ê4ºöŸŠ\Ç_†+˜æñÖDˆ§ã58ÿàZT²<g—hòâ«”ÄMHAw!—pµÃã¾Æ3ã“ê©´.‹|ÜllRTÁx’”¢,\S:¼ãÇe¨˜¯â^sù¡1mñ'ˆÊIÄg퉯‰çåD’ç~µ¶„R¶N~òIsjýB®cî[¸êyr‹¥g@øðhÝéGÔz.Ó]8ß½¨DN¨÷9ÔPÙ;ÐLtl=«ä‡Ûä…^íH”K)cÞ˜ôª)骙Sg qWY¹›òÁ—n«ëlte¯Ë•K~Ǿֶ«uVÔél“µûÄ„:MW`à [‚_J/9„Ô Q$ùþ,ÍÈò0„²xã^È6>r“¨Eèôèë•·!9Ñ b=’ïÇ)À^H¢Æ®R­úרµ‡ Š¼.²:_C·ÒŸÜ¬!véÊ×M'–Ája–k>ä¶ -³úöèÓÒúáBå«òWw¯€3Z‘a–ΓÅ%#8ae\’M+!¯<Àê *÷A§ŒÐã]ËF„Híþ§Ž²[æ+ìpå#æ"”–Ý4#Yã͆²5~ô‚lÍ%K åo©†¯c=Ð/W9E׋f¤1`Yb¯ŽÑ¬ßìwré¬òîÙqxœuáHàÁm!°q8hE'ÖÔ£çÊÝï‰#·5z¨8©«ëD­ðžÕô{s’?ùú y‘s„aq¸Ùë6¬ˆá²Îïôò¸Õ3ëÛÊ¥=áØÕOx#U®Ù÷…ÅÉÊP|×ð1;Ò…\j1+‰zùkakÛŒ“|£Ã öËa?ªåå]íÉ ?çúåûÐlO3Ž6bØ°SøÐ0GGÄõB €bbƒèMˆáîÚì_âíÍ&u§,y´·n!\»ßßDg2¼ËªAሩ˜Ço1v(ÞÑŒZÍòË83šÕÍxAð3å<=]Í C}ÄõªPèÕ°…é<û,üH›Ïè¹S3‰ç¿ëßûù¶ZP+~®ÄQĩɺ3¿ ’2ÈxmÚ4‘­ùÝ">¥‘xÄÕð¥b¼0ûºþºo¯Ïè¿»ÜüS²\εoñ a瀸®+@G­ñ½8lçøFãqsëgCÝ`ª² §ò–§&˜WÆòôÛp6Û -cô|æ'`ÎÄS%Q 2ÃÜ &aÔð†Ó²YŒ½ ò…ûów‘Ž?£x…–Öê"WÛüy36h?¬‡jø^²iJkӮ߇ÕÆLgøÿ_;sþÏ„\ä^ž#g([Ž–Gæ1¹š£µ­ÜWåŠÍÇžÄcŽI³…ñœ³ÜÏ‘æX„ñœ†ž³ /rMåýï·÷yß?à»sÿâY#é» NØ3íY¶À:U ®[‰‚‘¶BàkÝz™=iïÒA• áÓ>8â„ÒXò¨Dƒv–ŸxÃSê^c6GÑÃeï©z¬.£Yÿ¸O£Ø0^¬7“Seã¬ô ˆˆMî«>Ý…¸4g䯓Z}:ͬÈòjùÚqynýKs*)oŠ .¬Èøœ–ò%Õú°: L/D~ -»»yÇ&Ķ1òþ‡ókÄCÆ)aº„íájÏ1¼AøZ -U¢´’™…ç"óWÇ ¿NãÐhŸgÈ –6¢À¡yX¬{fÜL:’Õ ³kÔ6n›'±u •Ÿ$E—Ò9ls+ª; ’†hNÍ2Ápƒoc&úFåÖÍ„Ì­‘P! -aÏOB&Ã~€Y°R0ˆ3¦ë+*Z–ä:_7‘ßÛ¿ 8ò~Bî¶Þúfë¾Ã2ˆ 1ý´óèhc4|yC¤1à”eP¥(¡†ûuF#õ`?wÜ<Œ•Ag ÏÙÔf -“ü½óMìcFæ/.ˆ›'A!¯™•Û[Q M£ð+hú#¾,¹¡.a£à#_°FÜÝ™rÍ”®Q‡læ tD³ÁoF•}àº}l£Iâ¼Ò›Ëñ UÝU>DM¦ž=:^颗fTAÅ–ú2iÁWÜ\£˜!@³ç°2‚ˆ™1ÈÝF‡ßjB™÷Ám(Dàkªl¶çõ‡OŽï ½Æì±ËTgÏTOmÌÆ~DÞ½ ÇWÿM>Xuw·Ûuò¾–çrï½JbYëçœd¨è8lxK#Z §Mé)>¦`eô_| N+Zõíêñâ^ÆÖŦÐåþW§® ÉD¥ÝžkÇ^'Z\‹…­)ýþ‰Ú% …­I–ëlÆ!ú¡ª#K27¶¹žÑphÚùqq&¥â*xõ³ÛòÏ£|yìÏŽ‚œx ÉPÔ4ç7lUðì,W`üm_p÷-¢1u¦Ó´5µY§J;¾÷QˆDŸ Á”H¦[uúÕŠ¡”I‚R–ÏVVÉ?¾§9Mö§­®sîa@0ö]Lo•£ör$ü? "ÁPŽZ©7t>ªn¬Ú½CPŠM( 4 Xi«—3ayýåäµ¥iu@Áåc -Õ¬²ãÎ]­¨€¢¦ b<Åwù.©D<ãçáĈ:Ïe]¿8%âÜY›>¸ØÚ¹8Èùß—’¿ï#6{†ç"L’îX¤¯ßî¹"V»³ãGZe &¿3óu_9û_fû^nlê -R ‹Ï¡ev,;è+c$?  âÍ{µázÊ*¯ì>èD5É'_›oa9Iyî¨áÆFÜæk$Uj‚×À$ì‰áÉRJDµ=%¤¥Z¥³Í’fLãŽaíORŠ>’|„AÝŸ…®Å©Tï Ⱥ៱ JòÊx €dUº|O¶ÖO±Ñ;~·”´ô¾Þ–]ÂÁQs\Íâ¤^Gš‡Rh÷8ú/‰ýü'¿ŸH|x¨Od°Ø?µo÷¡endstream +FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒœ¬²œš,ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T +Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B +pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m +D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè +ûÙ £)¨Ž&‹"º–Qª86Æ…‡â9xV6jƒxlˆÊù†º’2–^ù +|Ò Ä;c g¯lt_´û•jP°– ¼ãT³mê=-ŽÙ + ËÖ /¨é?&§ Ã­¤oø +%Ñ]µÃ³V‹Éµ‡†#hižrX£2¾K±²Å?²©Ç‹t3V<«×üHl'}µ“œ7ÂnhJ권buKÉ)O^Œ Z5‰OßöÚÖ?ý<ÿs88z™l­; %ÔVæ ËŒõ”ððßEôÌH«íjÚ ~öÖ´Öb}ë­MùñÍê+GÝq’Yµ£[N¢+C1¸Ë¯öýµgî;ƒBµÖcæ4vP“"d×sžåxñ^ÚÁ9O^jŒŸ»e: £$‰µåf~)Z–Tz=a“2¨ÕæSÐÞ»V›áçp"êcýK¹Wåã»/Íx=‹ +RÚ8Ýw>SÓ¯S®A˜Ç©ó-×;%¾À˜úeiH—faP$÷Då€ãCã&¢A†C ѾB&eQ/MN¯µÊQg¿NÊèÑ8o©­?²ËˆR(iæŽO¿Œz‹~€èßöØ°ŸŸÊ€ù#!Î4uðÏU¤ KqŸV!rÉœt„Èä´n"/«åâPH<8±Ìà%!*áÂÇbhO‰†o‹›Cd¨· †Q>ÎN{©’ÑòíÀkÕÍ=ý.8}"Æî™Ux§ñ~Ê©jG¤SY¹Ÿc[kÑ‘pœr)h‹xŽ7ó—Š›Æ]BöTx¿0¬ÝcàÏ}0p²¢A17y,óUø‚‚¢·…ø¿K,ZS¥VÇìóK—Àd=ˆúÓ‡j €Ÿ;¢’Ÿ×¡ôã+J‘RPl3ï˜ùÆïy4¬Ôx_½´oõƒŠHÅÔ·vS_ü AåÒg˜Î_Ý„õ’~w?@’4ýQîï(á"[Eq¬ã si5׳¬ÄÈ—D|ÌŸ|çå¸K¬m@e½)ÿø’– +ß$TAÂrü—ÇDUËx,¬mCFË„vh”V¬èæÝod%·Ýͼc‹ò¡R´©kð97Aa¸ö<ër Ñ¿5{ßîRÖÀª—Öì6 °¿ÒÅŽð.Îe“ž¿|€³ÉŒÎ¤Àa;ó›c ø1憀^Ñå݈2ð#"ÎúÎøYkK?¤ãž4rIt\IIÛaë°†;ÒD™øÃW=ü÷œ÷YÅ+˜©rM‘!ˆÑ'ëâ§λ‡Þl è‡ÕŽ¿MZaÆ©wO/ˆ¤ÿä‘¿<y±Ç-û"å{a«Øçé¹WÑs<¨ðÀ%ìÝH(*ævØÃíý¢_õ¦fŽÏZ5X¥¥6­›Þj<ßó±/¹ç*£ÅJÏ“o“¾™ˆÒ¼¬¡µ6"£Í·@¼çÂKtÛF3c‰¬#«;¾HõOR¹éGA½qW/}gTHLŠ‡Ö-'¾ŸÔkí2„}ÆÅ6ðû {î56Ë!l<À-€èÇUq;=t}ÃY)¬8Ýø3yìáœ9oÙìF€s#MSþ‘»Ží®@§$Ùýû(§îºÑ¶±ý¯ë È>loD‚K{à[ì1_s©–¤ ÑLâ”Z|µÙÿ‡L§/:OMz}ÈÔïKHï~-ð_Åt¦¶Ÿ ë­‹­åÁüW“Ý$ýAƘ¹ß3¯œl×âr,ëâ€y¥&0•²jmÚqý[„ìÑL6Qb~´+¹PÄ-sÙø¿µ$ÈÑ*ªï ¥ ðÈOÓ…¦JûèY[éýSækŒ¹©[üm}ÿ˜Ð6L÷èO³[²ò½¼ƒëÆÐNOp:„ùHïä7CĬ“ü]½yî´¶ïïÃ>Õ“·aý'×M½®qê äîbà_w– ž]4ðÚÀˆ²öÒøÞó¬n +: § Ìô 8û›cÑJR[2£mXÅw‹}y7ˆ×ÅLeD$ç,?Yh{³ÛÆBÅΙki¿ŽøК¿ Ø1ò°ºŸ;eó‚T›n|˜)94µ9uæÐ¥x´ ƒã½R +>ç³]æoM%„£¬ÎG)³‘4°ký‡ïbZ~ø ¼`_[hã»8ë<¾4²}$.îÁ³ÖÄ‚(¥ªæu†&ÿaÜÀ™y£Û2¤³‹Ô»¹T+ªJÀҙçÍÁØØJJ,šëò¾v\TP‚Êü´iÚõ pÃsùâäFáã!ÌnT)^”"²À±R'ºƒÀ q)J‡4`¿s]¼ÉZGâï”œÒ Òœƒ(BÖqˆú(““v&ø­3UÏ‚Bþñè› ™Œb‹Zˆüù Ir2Ÿվ ¾îÄ›7ïX)c¼5&•‚OϺ÷•—2nµÏÄGýÓ¯?74¥Ü׳ Ž²Å­Tj(–Eãs‹ &‰Rð³ÐѵL‘ˆÁ3²pæuy6©Ì7k‰¨‘}¤TêÄoÊ"´wÂñls ò­Eâë2¦'jQ®,ßéàHˆ]í„äÛct? ÁÕÑÊ,Ga³ýý¥­Ý2^¤d0•NUx¤$"e`à%~7*ýþ¬Ø挭©Ÿˆ{cÃl³?hZFCH7U£*´Ü‹Ç‚Ìy|±°8ô.šÎXAÐufóË ".Ä-_Z “MÄâë뙤—¡¹Â‡Ý÷í[áÉ\DZQR÷¡ x“à¼K)Ý)‚pÊåDÃ’«¼m“­HÁ• <¨üˆ´Ÿ_Ä1ÉðkH/·)(_|ýû2ª,B³i‡Ðñ4V®ÌCøY¹5õB2Ey»…yö47£h¬Bù\=m‡r94ÚOäjùãwiºð_w ÎvMíð¬òüò[°4ê©—Tÿ³š™\Ó¯r»N1†c-8!âΤұtzžK,בZÅ5…ÍCÅg€„ »öˆÍÐJÎÑ=–|üËÊ,u‘,Yƒغù‹ÑîÇôBÞ¬ƒé\¦SM„ L¿ÐÛºp`i5U])ÖìUæt™PÚŸhlA¨6`¦ãqµ"~g2è2êþ6d`{#Cn³W!Ïw¦I¼Lwdk J)ýK‡"™¬ô&¶ºV0ÀfÓ¡?þr83)J‚$È4?$ àE•´Åì²›¯:Ÿ +Œ(iýŽà-º 7~õSLcüýkÅ!.0Yü:7— `hPêoˆÜä¦ójÂlƒG¥v‚j»8Ç«Á¨›ÕäÅÆ6nÂN'éú3ÑX®ÐH¨Ïü%›zl½ ýƒ©´T~Ú}ÂwlzŒ(D:ooV¯Ãúe@Xrݪ#ç‡ d4C:«G‚nxŠôÒ¤Xç©þƒê¢dÑ^øÎg’´k½›Ú}Áîí{åÅÄõW·F°;ª¬ë§Â×òh`7d H—”µNº’7G«5–-™¥Ïà 1‹†d ®\É(¸¬®&Á€%þg› R¤q[â’ÖÀ.Ê¡\ÔýÔG&ùƒÔä1Gô!ríØŽHÀÊÏôØD¾!eeÈ2¯ª ­òûôÅ![é@8Í1J©áRJËÁE·¤]wú³{D1Â_¤ Ó¿’²\ýz¯ö §D‚ßìñ¯Ìd$!ÉÝ–#/û$ÅVrþlAŒÕ„ž­·:@¬RÏhV‡ƒTW÷ði¼&ßVQžb‘¦°$Í?^ªøŠJj ¹vQÕ±:³´FRƒK«}ÏGL©ôÐ÷±ûûAÜ8€)dä±”Z®N¨æîuQÕw_ ºLã®páý±•¯ŽÄ—¢9Qök¼`EËih[úª•³Á5?M”õÝãõû ØÃ)’'¸Q·*ó4yΊìðüC[I&«Ýrx”/Ø`x0…oÝûsËÙsïsìêƒø—弫Œ诗´% \˜Ò„-qBÏÐá¹ †^ n u^CE ’¡ù‰ÝĶAµXþ¤@á¼ömÿÒ’JÀf)Ë‹MÞÈRÁëVSi•#w6VBÐù£®QŒßk¨£1#ð9‚ïq?ô¥VAØAÿו° ¶ì.Ü5.óQøw¿­'zÁ7°…#|ÝX#c½r"ëòUt™îÖÔRìáϳ—åd—ã0Â{)ÒuŒÉô˜t’’•û6°Aêõvƒz»§ö»`~LÑ%óÌ·«š™,"QW½^CDDûa.˜ª¨ƒµ ÜöBŒvUÛaÀvæƒ~ç÷%ƒ#™D@¬Êž±H •e—„7tà›¹¬6–O_pãÊÑŸÀ)ÏÐ÷#lžtñôË.jLt•¤ÍÊv)nè>¡á˜T‚nü%´öª•K]^sõ'lÙ²k2]¿÷þ5#Ä®j@o^'Å|³ÂÎp?èÅyIß»7ç ¶ÞJ\pA·F¾#Û÷jYó\a@D‚Y>›‘Sa? +)‡¿ ÕÖÏéÛNÄD]*¾ÔŸæ›õ· ­‡.kÙõ£a ü:ræ\e·ûá&ÈÉDŽ¿Œ™%_$$3}9šü• Š8$½¬€È¢þàÎg×™„¿ZuÎÚ8רË=~³a#›L]gŽyiðÎ+.ÐÇå‹6{™jšSksÀ›ø¥qéD¾ ~Èͯõ{Ó·Æm'¤v;?«A%qÐ7ú"úpM°!(ïx[„Ô]Ä,…u‹0~‘—Ý›°ùot…ÿ‘vm¸oŸÓÔ/˜àyÝSÝñ}Ó"‡ÍÿImñ@üñ¥Çýawú™¿9Zôèý öI„÷,`¯ImJ /¿!UÕ†[ƒÒni$%µÖwjÂíÏ÷•y†’Úª? ü¸Ôî¿¥8«?—ÇÍá4êµq5‡g7¶}E¹l“lRŒg{ ©Ò2±°Ÿ. nÇL^ªJéˆYç¹¾‡(Š©?fÔ2ciÛŒ<¦É¥¼""—@ƒ Èí•Ú!kŽ 5+V=ÑÅQA+žß͸ÒË;vƒô% ÎFº+s*)¼Xs9NÛß™üÑ¥˜L¦ºÿ[YÛyt¼ÿ²ô„ xÚ:tés®` [Öx³(³û¥šrvrÓ vÝW+—ºù.myÙï=Ÿ†Ì†Q54ÕxÑîÊa•Ÿ‚T`ò—`È „^3¥>5¥UºaÝH‚c™'x‚.löÓ°g™~»uFˆÄÈ8ˆò€ b ÿ.¸%Û »ðPâ*¡L;.w_÷<Ê/¸‚óŸ‡o£ ov£~8ù8‘ïV¶qãf +åÚ`qÈoa’:Üà}ÒË’àóI¡ Å¡H±`í ¾‹¢R¯u²Í3}›’«˜Œ(-ž ŒßDÇîwëôêé‚t­»Ìt«Ã¯W¹4#UâRwXPƯY“4ìg·FRß vßû<ÔxP>†uÂËe&+W-\O+NcÓÈ«¦ˆdÉÊç°Ÿuµ‚^¸Îö%oH¦£¾]ü¨G,ïjçís”'Ù#~3’âø‘JÝ’J¯E«N²A»‘_l ØÙ1U¶c3  ˆ¾G»m+–¦VÙû©|¬-íÛ`»õ¿lf³$Ú«ôŒóÌžÕÅ›±Ëšûvy7ÅtU¯Z¥lÂÙñÏ,¿ Nªä@Ëäþ‡¼%NRs¦P†[¼‰P?ß”ÛI¤eo Õ wö¹¥@´!è&/Ä8Ù×öÐŒëÝñ‡þî…l<œ%š.Ò™{A•£@lŸA µÆ? wR,»SQ,H›ÀuQÚå¯>¡UAﻵÔ/£²­™Ï&/Ö…JVíù9@(üˆõ›œÏt\ F;éœt­Ha|þ­ZÇ)Ýb®4¶H„¸îbtÜ©. +Dì2Çüߢ¿¢‚IÔnèEYÒÒÇe)ü²:V ùUš>иɚúq:…mɲ¶þUñNžY±B§Ýêƒ&³Ã¼]Rý*ÃŽûý=*n…ѽKv„hf0ó;!ØÅ .&f«RÚ„ Ï‹ë&e¤ãe}|“x$Ó½ââ;£kgž=çyÅg©Þ+a…¶’û.Î)†Ú`NËiߜʼnW«Uäç*i¼/W 6æø>±§“ t6ó –p2/ÉõÚzî„øÑ=h>±` +n5TÁšëÑ”’ÐX"GEÉ.4–ú&µ¼ ØØ…'Àú|€PÜLêar ¾0N1fo÷í¼Á¶Uå" ‹*0âù$]s¨>ÓΆ”'â¾ÞÑØèÝf6qì©)¡}mZ€šÍûIÄN§ +Îþ@PD # V{¿Ö%þVõ|3ùÈ”JE3)&Níð{_’ Ê m3™Î1 oåñ S“•/bì~O«¸8/*™Œ²éëíZφä(.Pÿ§žÏdÔö¤¾X<é§îrî9YJÛ)E抰z6Ø/v0 ¡ ªD °¾T㹋˜€7ýP“Ú¡ûµ¿^¶û°iDØF…ṳ̈9Ô\ðØDˆ“Ï%Ë;¥Ø—qëŒà2ß œNý.¶8bWÉI0Uy®ƒÎÈfPw³‘ Õ8ŒÌ" Çsäs +ZmØFÐÃʶÞïPhzI÷™ð€*qaBrÒ·Ø^ðƒMâÝàí-Õ¨ô¡À˜å®™ÂÞžÑÉö>u¼ ‰ŠÏãonŒ{óæâ<ŠéU¿˜f);›Íp±OË,¾†ª™ŸÔL~‡(ÂJšWQû¨ +`þ* ÎŒÔÀh0±ì$(]J+?!uR[LGÓOÁ +>DGÓyØ}—(l ø &‰åSß}fÄ †ù©»7«ôÖÞ •ŸÑ;!)îüP_©cEìì_Ï“Á’TYj¥àê§ïS({ çÑd +± éÇ¥µ¨ÿ‹0Ò±«ö¡`¢/³I Ph¦€ZhtDįcÅxBkô¹õ¾z힢Uˆ1áû-C^­î@\’ž¶Ê#f„†µ]òOÍÕ5 Ñôh‚˜CGÚc(hƼ<@žðŒe/ºˆ¾]úyèŸãgT —–B„W‹:ƒÅ‹"p+EŒŒûE|ë7p<*6~¾R—”{N f.]Æ&‡•è…MÀNsr'=d/UMzW¿¨8ûÎ=ªŽ´n¸ÚvDôÓM=×ArY8sœ‹ªf(ú²"’å®êvj×;¥ôŠË7/“æÖö¹]Ë\Ù”7Ùë•azgòá¶gÌ)RàÞ%H}!³¡i°Re<Ñ 7¡%ý¿¹a¢d:£gteµIˆ­¨*’ +‡–oü‘éO' °xd"뙂T¯·3z ^‡ø~LËÿ¡IÖBcP/giй.^ÿâ×úÔ¡/jƒX©ÛQÕ ­€ÒÆ-Ô¦4Ê{Ù·hïgZ¼'ªF§ó.²$2ÈÙB Æúž07êÅÌJFØ “|Àmv®å·Ìù´"Ëæn0jª8xB¯QÎïïˆþ”âÞþÐßÙ«À|˜­jiu›¡lQæ5ý%ßzÅŒãÎv¥ú…>GïÀ•Nv.óY‹=Šð ðô"¦k ¿E)û›™,$i{;vÓSë œ†œSW¿BPPúËj…+ýá{ÛÏáûg¬ššLœ/ +¹,6:üâƒ^ÔX'€å9U¿œ‹fkM6¼¿tî˜è^‚(Ò2g¡I›yÕ²˜RôÓ(.ãcÃÿBM¶SaÓv¨‚/uø¹!&jìdR¥ *ÿ!´BSJ‡ã !DË¢FT=B–žýÏm+›ä’…0Ñ¢­½ãmëIÆ}ÈATZS¾Ø ûú=óÀrèƒ!÷v§} ‚ü |8âìñ,¼ + ’¦ž~o8LÃć4»DÜ϶ÒlÊô‰'´:Y'ϵ:X–¹ȃKKÖr97…ü dé2 +{¡„Fuœ·3žÍÇoÕ‹Ü2C7§jy¸-Í@Šæ,dL//¢„KàôÌ°FYîÊ„³Ýþ9Å™êVþ©\ªGôZמL6ú3‹:—g›:‹¡RB£–†‘ž/Îç»v­KH©—Ôï[¾­mÁò¥®S%{ D4ÌuBÞ…ø,&ñ~‰‚F?Âì–\WöÉ¡r€ägµUê—ÚqqÜ6Mgy0#Ï•`¯Ô&Â~Œ[¢é°ŒnÒ#u"%`£–ŠžÏr­çgäeùÝy£ç#HZ@#‰F•Xý”ÚèíTÃl’Ä’2”XÇQ[ľN1’ÔD͸©ØÎbÜÙ{òdEÿÍžó¦˜ßTŸß¯£Y4v̪ߔcƒ>´ã¦´ŸÆ½;åø³U>.Y'²–¹.NŸöLM-©Í•åÂ߈¾x6·w\uÂTõ *ÁtÛ©X„ø6‡{AFi íDñËèŒ}âýì¬pK?N2%-MK2{%¾,æ)ÝPÍh5WtK¼˜/ä%‹(ü¦„¶â VÝ?Èþ¾uôÎEšwž]“¨Jb $Ùd+¦_wZ+MVÇ3”Fíh¹ÝG{>ôº0 ¬{ðÀ“ [^Ž O0~öãÊô`1õYû +*–÷oz ×PýÚúŽÇä–G”30¢ ò ¡€?Žê)^¿)’£Êw8:B-sìFDò±û¹Õ.¯ýaËmwñ¶ÀBUôz8sš3&¥JÎ|ñ$¡9ê +¿’ƒ½[žBš´¾™Kåd H*ž±yÈ"ýƒß ýzêXê>ªµÌWÕŽ“Ѥi$&N“yu°BIsŒŒÓoLª¸IòD·»ñŸ’ÆãÇ•ÑlèE)÷—¡OŠÌ:˜¶O-h/_cÂ:u* ý ‚(ÖÛõî9ç}y}F)ß×]>9]¾¬šæù%†­Ž8[pµŠ Úˆììˆ4eAäÙoÀÄÜ# Ò¹äY¼I©[ˆˆu÷Ìp•)ÁæDÚøõ l¡ù})¼ºjoÌa %h1•l­õíP”Eöd¡‹#ò!Œí±Y‡q4NaB¢#@÷3ÁÜ´*ìåFÖ‡ù–[>¼üózëþ2‰ØMÌDn…Þ ÜwKØ¢Y(i£X‹ßüƒd¤ú9ò ¯L,ÿì“^^ñëàö­ÂóY%)µ4ÙZ\ÔötôÕW¯ù­i ¢7,qK“ñâ”-Ç?ÑúE@•àë#¼‰&+ƒÄ0¸Ø¡¸04ºœ5Ö–›ÿë“WåÔ/¶fLƉèß‹›¥0³Å¡u±yØ°Ðu:¯Û{®[’ĸ2Ï}’ cu¶Þ÷²' )¦Z`‡`\… c¬—ÖÙ±{OÑØD°Çré ám;€¸LÐl} JÜ„Ž6 ‘nþ‹‚>°§nºxŽPc=‰6pÊè)L[‡+»†%ª}'¿P°aŽ‘45¨lG½>(ÅûE&-#Èkií·jEüÅ×Ö "ŸûmUó˜SvL „„§=ªA2Ÿ¶_5J¶Ôø¿ÒU‹‡_O·V°mîl= +æ7ÒÁÒq3‚`¦ t.Ó„c‰Nä•×wíÝZKGº¦Ô›.(ðÔà^æÕ—w[.,ÕZåŒ +cGM}!;4šÍCnœ®2'ÖÊïìù®? Œå¯@9ÖË'Ñ®æp]CÖ-C¼Dû]QPÓ-}yhÎëzqã©Ýcô‚®ËÚ+›ß™A;tocšn’Éæ¤-O‹ÛÃWÓ•ºžÛóÛž:]‚é#Â_fbÈ°g‘øÌÇ õPŠ€Ú†ÑPÅŽO£ªõdU “ï6dÍpŒ‹bçÆ©\¦©Þ÷Œ­;£&{"ÿÚé,–ŒO_»ÔÇÐ9V¼47M=ÍaÍ]:mÎïGAã›P.4”ªþ3€ãd—&•É–è*HfÅ„÷‚¼M:ÞÌk(g +4–·öÈZýjH sóG··»èV üY).üjcPÌ¥’»nÞÝtïw¼RÓTÔBÇA4MÚgw†çsI2½¾C®æÀɳ/™CŸÈ<€µƒòðð½·J'“8.}äjðg$Y[ì3úØ“ü=¸ ŒdÇäRŸ\4˜Y^ ßZóÖãD`LŒ³8äûX‡¸xã-·òú:Õ]PUˆo3‚¡©q¢ÎÈí¯¸âçü%­F~Ÿd¡Ü17br'ÓP¯Ú.~ÈFôêg´ªš’í2\x%ÃE…§é[#ùÍ[8‘çðÞÞª'Õª{±ôV2ZâvWùS×ve?sL¾d5׬¨sôßaJý.–óÌê0Í›øñ(#­FÎv}MD"]˜2?µfÕ_kÜ͇±MÞí'–‘nÇ[ gÞi×ê¨SÖ—¬€ðp:ªÌð/šEù3/ùkÑÍ Û1Æ•U +ŠéÑ:kÅÖ ›r}’õéŽVbbérªïHÎ7Õã³ßêí¥‹_©¼“×2[ëAõ°çô­JCRz!»‘<ùq3mÔ¢W[M0hÒ VÊíaL¦3zb¥ÿÐCNãú?O“lVŠšßÍÒ4Øë>Rj•·•ÛéD[÷87ž9(ÎÔ ëR„Ç?Jáf±;V¬32Ýy‚¢ÈÚ«òßü2ž°é: ;QU–8Ííx„µt¾n +vÚÑKâåÅíÍÓ¿½Í~¬?קS§ÎªôÉžµè6.¤K±“H?R‡yþnv8Âax9™:¯¼&ýµêo<çßb%ðórÿDí;Ú%§1M–UΗUÈÁXÒ6G«NJ"€Ùíì£â%Àì”w¶ðtý—_7×¾`!—ø§‰×o>v²|îÁÈç™±ÈBu:ºXXv9’nn*Ç÷ÝŽ#*%)½—-“u¸3ôž¶ú¯?N ` +;ÜÆŠF¸*Cb&Znf]C¡ÈN‹×6Á.þÂÑ, èW91£ðà«iK;m+úbTèSpïGsÊuÊkÏ&ALH^Ö™FV{ð$ ÝkúÝMbxáñå6ÿa˜ƒØÅYå›a¹5°þ¦J0Ëšëö“©¾é™ý¡ +Ó†©"S—Ïz_¥¬Sþ@Î lÀ£ì†D/®¨÷þ¹B­c0ˆb( º +ƒËsˆŸ.ÍÏxP£þþ\ næèJµõN*·ƒ7A—^…¯f£èïnò˜Øc#ï|<ÐŒ¹a=íÂèœL¹Çt}N9@œí2ò“º¬ð;ŒÔ’`Ÿš瘓gÛ–» “(kw“Hˆ«fz# ü«TU5aQW.;ì§øtÁTK!bñ6Û¨Ú±A2®Èü„è-£þ|âáŒMÍU5j2~áúˆ^]i‘åe-·¨^žÿWeoÙ~äèžÞÊ„×Cô®ïw= ý² {ì}Åï÷šNå)àÒ„½\Š*‹Jò|±WŽMí¡±Òøòo- kÈ“èZ±Õ6"Ù™þ\W7ϧGÂ}VÁc§Úª4ØXoM7ùwÂá›P«cþÕ’Ûl{lY B‰©Ù/šÌÝÖíü¾ì–­˜T¡ÁÜ?ï°êšš+‰¾Å’Ñs­êŠGô†äv5¶ÈÍÌ?ÈÖ§éBÄ<wsÕÆصŸ×ŒD¦¤9 ߥKòã_Ý»›’«á`Ž]} ‰µñnÃáhDÜÀÂ\É&*NNk…¤û0œ†»™¥ ›ýÔº˜Å9}­Q}lêœDª0ŸœÛj2wü“¯µJ÷‹¡œéÃvµvz¬,Æ}úè"öìijƒŠyñý›·î ’±¼cæOˆq¸Ìpãd:3ö¬Õ¹$c¿_W#ò4ºÑ1¬ç¥†Á z,8ÚÈÕD-æ h•’ö5Cº ͧáƒ_%wÒªu¿ â#¤Ç”g!]7¾ô/BŒ]eh©IKôŠ2¦WTŸuÊÊŒk84æÍ¥0Ç‚AÞÈ;b•1b°mÍH;í>nôÏ¢ÖR /#NìqHºà0gÚ…>tí°§Vûa¶ ˜/æöŸñü |¥sçYà¨q³Ý,ÙŽÆ™(®” ¿œ^õÏ‚~¢­Ö>ʧÐÃwHv«;ø´þâÎMÌÿ$ìe ™´´_ÚژтX–KµÆZåÀËÎ)\uñ–Ã2îvKËý XåEÛÒ7ÉG’”¡":1£ëV G½°â”ÀÑ&–Ê(è1ó›Û9‡?³3˜FÛRâåGcM-,‘kÖ!í¯±òÎuÈþ7æ;r…½VÌ+r“l«á¢ü” ³˜¿4{k{#í"øKMaëb³y÷ý©ÐØ l/W^ïo<9[<˜W(§H‚I§,âkíŒ{·)G<«ªfÉÝqIbÙÈKá«J-p_¶×&,xÖú~Ã!C‘FŠ‘Aã”Vh0–à¼ùMeœ·È¾„B‰?MÓQNqXA÷žŒ#´wøÏ4æm¼ðS"u^5^á1vÛv"®3P£ÂîƒÃ Âù^Ú&5ÄùïzFƒ@PD‹oŽ+'.ë²Üãa9…@4uÝlXÃÇ1ߟ¡X3Žª‡µ?c(µNn¢--0žà1ò†´Ñžácó—W¬¼ˆÉâL¦â™w ·9 +Ú…W¨•fI•M@ï±–KÉ­7‹û)Cc¢ïS`…,8'Îl[stÂ<¡\nc«¡T&8Ñew‹¹ƒã'}'ÅrW÷ ŸMì7#X1nfœ÷ ~¸ŒÓ2Û*¡U§ %›ˆÁÇ:èDMÂ|Ò.Ž«ªˆàc:š®)IËü*ŠÎ¿žê³Â:rê2:Ò©iWLÁÎ=¢wßÎÙàì­J5 d'XZ;UïÑ[ˆÉô+j£"dgO5!nYÙÚõmÒ/‡`ÈÛZ¦  Ã9LcZp)©Ê›ÓQ$7ÐâänX튌X,ðO“˜£Òâ'ؾe6\0˜`À2ÊâL— ÁøÁbÂrQu +ºâreA5n!Ñ…êì]Œ¨ÁºØ»‚õOWìõHƒ:Ô…—‡uÀÏk2Q:ú†Édf¬š¢ µ‡$EÏÐï8f±æ™€âNØÔ@Gœ¹}\=ñõ°¨öˆ¨‹¼_W/nÀÄbÛíÿ¸¯ß0^8U¤>¾û=O?°g›¾U̧[aý;óþÓSX¦ä”gÚLÁ´·¹‹.võ@/Ò&ÿ”i:dÏk0G£u¨ð“rÏBž7gO‚w üúàü•–”À‰KY&j øœ7¼r 2–á°WNÎxëh“õÒ¿Í7§LŽ„×VC@]ÒÖóºÁ*óë-Å ÃA;}üvñïiCU…—.úZl¬ õå?²ŠcHÕ¸´Ôu½ö!» »†ó±œW‚Ñ/ðó\Hvq•bf€úOÕy3¹;¾Ð¤ ² ÜŒ°š'ÿˆêIܯE|Ÿ¹ š­p:ÔC9èc!¦²VûCÕ7òÿ2]„2ø²âª³ç½ã,}Êø%(ê’r‡ɆfQþÏÈéª{ÃÅ3’u7õ(;†>Dî`…°éö'xN°?1jaóXDOÄOTÕYe¸S;&bïæ„Ÿ"=_ƒÕL+Æe)ëõP +gŽ}“ú£qÍòÛ¨ù›ÂN•¥•îÉ/­„¼Ÿ¿¨ÎwýéN­ъ”⃞êöÉ(ú˜i.ŽJÓY{Ê…ë߃ˆêo&ãX +Ë|åT¬N!{¶ L•„«a` K=ETBÔSEÐATMb§œ +Q‡Æ~ËJlQ‹Rü¶×ZB§©{g¯ ^x™‡¾m€ï¨LŽ1p%õïø×ké\¤~}ôO½Ü8Ûu·×çqÏÜV»ì*æGj¸ÙÛ9ýèOâ÷Žû’VuûtñCv.¯ÉÞ¯²”ì U=Ú·rèöI3 Í¢¹ØO7( S~ãÈ”‡ «ÒÛšt”š®`½öÈl/ÅY¦37›„Û¦š ;ŠôÑ à<‹ÆN–T‘Z.!`ßêã…”´I¼M%0,(`Y³¡mm¡ §&ymr¦-åɽ.§æo·œ¢ŒEŸ¼B91Œâƒ!ÈD4B\\ò.½ Ÿ†‡b.ô¾=ƒq™“s,|Ö?¼´~8£»»³­ +Ñÿž¶l ÷ö" •äjÓ`Zo…hbµÌ}åÏ0—ŸùoÎ*˯µŸÞµöñæ/~ úÕ'Kü@Tƒ¯k5{<‹i»ö—ROBz@-+µyÚª«1èûŒÂ·–µZë¿ÊnòEp7âPi«ú€pV¢;g.Oã­pÈTA3V.ÀÙòV…I’]UAÍÊ&¯æwú{¥,¿f +ý’OP\h{†!Ë/:9*ÁþNª‘À„y†Ý¢›¼~¸®<rÍ¥Ø.k¹áR\ÄKÀõ=™Ê³ô¤µéšàš)É  +Ìó¬¤^©êzX-Ta’•éÔUÚjLØ–‡ÁPϲ ‘ Ú €,j%‚‹Bè_|³yŒß]¶to7ɹ¿"Á¡ÒW¾7ÉÔ9NÙbdÌ÷Î2s—O‹D"—MêÓ†l›Ñc,Å=Æ/¿ÎWDk¿þ-ţø¬‰tF%ÿÐjwÕïS;ù^É£ ñšo?ñ +ÆQ'?ßœ†*×3;ùQhþà“R¿«A±FÌb<\gÜÝ@ƒ×oìfg,ÙS¿´íw*0=a{ æŽ!Ù5"OBŃð4ûbü[ïR«r‰2Ó'VìÖĵv\PjÐÝh «»Œd ­ªÌ'3çÜŸ¬ô£uªü”.ø¡×cšÎO +DSmÝ÷dU«TòȨr7)z¡mYÅÀX˜Ä5ê¦[Ø÷ËÅŸ"f ‰@êéqD„ç™Õ'~ñHA[€‹Vû¤“õ^C +ݓ׀-xú€°šNceŸ[å˥ߺŽ1½é˜Ê®aYÝ«ÀF5PYåaÉ|3ãä¡ïbøM@©Nyav.åh­nî×ņ®ô²¡RŠÅ—ȬŒWyŸ¦Þtƒ7×ÔÀOkB¬œC@ƒž©êo´dÏ “I¿ü“Z©þä}\žÅ’gÎBT…bM+5êõHzJžìfy®âq +C¸ÎÞ•¡‡›û/ìë aLãdU±Å,[g¯úWСÖX·V7~æQÈ¢%+ð?éצµ!ùUè³Êk5ãø&Z£Q‚É [äxŽ-b÷uP…#Ïñ¾†E@qIÀ$ä;®ŽVçæ$#ÜíkôëtJ€\¶p5žr„º‘¢€$|H{U¡øæòƒK]N}¬ò†Ÿ€E×D° +FÏ-¶ 6© †Â ߸ŒçânVä^… ]šMg\ÔKÇ·ä 9·/£‡õü7o¼¾¾Ð¼­ÎÉSö'ž”Q®¬þ´òB†‡Òe|°ià”¸[‹_Ý‘†6ùŒë.'¸cä½M½åÕr\S>‚K䃔t§C稶h5uREæ‹LU§­Òƒ˜Oôz VÇ‹;¬¤'áS™ÇOXñË€¿®›¦™;µWEƒeÔ #:0츜BøUª,ØÞèb +Òó…2pÈ^Ù†:0|&e¦Õ,?‚HFkJæU'ý!qÆYµwß³HžÿÔ«œ;…ª»ž–3ª[œé@—hžÏuãrnL‘;®ˆ=bªy7¥E>°áíîä=HøŠõzŒ³šâs|Ó߶ª`KA +Œõ_P-ç'„HS +Л¨'ÁÚæãy¿ˆ Re†êi[‘¯²2Ê2ýQ%™ÒZâû®žm-c¢‰LPe³o“=ÒÜi:èÑ'Ðr^ùÑ­ßÔ{?z$É&aM%*Æð®iÞ ïÚ‹š%4Üôí#6¼± +´!;h¾þGáÁj2Á|O¸D ‡?ûµ“îw¹´`ªÓ¢¿¸‚’cçÅò¢†‰‡Î·¤ÌaŸŒÄÆ툗62A»wÆÕ(†“Øs/A'viÙ.Ü]Á‰µ‚7*‹4¥'O ¢ °vŒ÷øF34§¡Æág¢O¿u¬.t¼“®rõ–s}/¸šä”ôÛºö˜#=ÕdrõÔVL­WVŒªÙÄKã‰éS.“ (Õ;ãh"’€}R>•lÏs¯ì³²Ô!¶‹lAËE:ßy&ôœh»Æ2©×Äë2+Ù®HѳÁŸ¨0An´ë‡Lš@°ƒy‡ß[q8^:ZËÄc hjð-¦B _¦–¨ñº€ÛJT§ûš5j9È«>Ú)¢Û»nSÑj=³ÕXër÷Hl_—rß:¯0)]F: ”Ùtë,,pQ£î÷s²•õÒœúåx.Þ!ª±…» šMdÙŽ%󌥢À>­×בtÍýh;ÑN}ÅO™~ìx[ôÒ[ ô)Ò`Ç™[z€Ð¥Ç;ÿµbä¸ ý· ZÛ±ýW=mVùD×®9, «Ÿ³e,ëKj}Ü üï J¼,®bðýÂò3Þ2¼ ­h=Á‰U,jï% +ìé×¾ Ä92¯kƒG`µÕÂKþ{|*Œ”)ÎêÒˆÁÄRéAîCêD´Ó®ïÒ‰svѬµ>cj +6müÍpHr£\Ik[xi×$¼šÉH$S<ÂÐ]­H;"þÏ] …h!ÎK Ùç wœÙƒaƒ!Wo§têQ‘21¸¦e}œDó—ýªM¢Ê&ëÅ"þçÍÜ1IpÅQè—{ØAÛ»kJ‡³÷4°6ŒíîO«Ö*“YŒÝ*³A"Õ±«Ì Õ r¤eKãùŒ©$a^Hœ›Œ×ý‰ÞFïNûé)•7µ»‹i?¦: ¤®ý§"×ñ—á +¦y¼5âéx Î?8€†,ÄÙ%š¼ø*%q$GÐ]È%\íðÀ¸¯±ÆLÆø¤z*­Ë"7›U0ž$¥¨ ×”€ïøq*櫸×\~ghL[ü ¢rñY{âkây9‘ä¹_­-¡„­“ߣ|ÒœZ¿€ë˜û.†zžÜbé>1aNÓßø–à—ÒK!5hI¾?K3²< áŸ,ÞÅÁ¸²Ü$j:=úzåmÈ_N4ƒ˜Fäûq +°’胱«T«þÃ5jíaƒ"¯‹¬Î×Эô'7kˆ]ú†A§òuSà‰epÀƒZ˜%ÆÅ…¹­Â¬¾=úð¤´~¸Pù*€üÕÝ+àŒVd˜¥ódqɈÎEX—dÓJHÁ+°:ƒÊ}Ð)#ôø@ײ!R»ÿ©€£ì–ù +;\ùˆ¹¥e7ÍHÖx³¡l½ [sÉHù[êƒáëXôËUNÑõ¢i X–Ø«c4ë7û\Aº0«<{ Evg]8xp[lZщ5õè¹r÷ûGâÈm*Nêê:Q+|‡gµ}ÁÞ\d„äO¾>hžDä¡GXnöº +b¸¬óÇ;½tÛÓÆŒ£6lÄ”Å>4ÌÑÑ0a=‡ˆ …˜Øà zb¸»6û€x{³IÝ)KÞí­[×î÷7ÑÙ€ ï²jP8b*æñÛGŒŠw4£V³ü2ÎŒfu3^üL9OOW3èPq½*z5la:ÏÆ> ?Òæ3zîÔL¢Ãùïú÷~¾­ÔŠŸ+qqj²„îÌoƒ¤ 2^›6Mäck~·H‡Ogi$q5|©/̾®¿îÁÛë3úï.7ÿ”,—síÃ[|EØ9 ®+Á +ÐQk|/Û9¾ÑxÜÜúÙP7˜ªl©¼å© 敱<ý6œÍ¶Â=Ÿù …3ñTI‡@TƒÌ07ƒI`5¼áô‡lcoƒ|áþü]¤ãÏ(^¡¥µºÈÕ6ÿCÞŒ Ú롾—lšÒÚ´ë÷aµ1Óþÿ×Îœÿ3¡¹—çÈÊ–#Ɔå‘yLî£æhm+÷U¹bó±'ñ˜#GÒ,Ga<ç,÷s¤„9a§¥|I@µ>¬Ó ‘ŸÂînÞñ ±mŒ¼?Áá¼ÃñqJ˜.áC{¸Ús oÐþƒ–B•(­dfá¹È|ÄÕñÂï„Ó84šÁç2ˆ¥(phëž7ÓŽd5ÈìDÀµ€ÛæIl]Bå'IÑ¥ôFÛ܊ꨤ!šFó…L`0\ÁàÛ˜‰¾Q¹u3!skA$TˆBØó“É°`¬ âŒéúŠƒŠ–%¹Î× Aä÷öoŽûŸ»­w‡¾ÙºïÁ° bCL?í<:Ú _Þi 8eT)ŠD¨á~ÑH½ØÏ7ceÐès6µ™Â$ï|ûŘ‘ùË âæIPÈkfåöVÔBÓ(ü +šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p +øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸ +^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD +­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öAÄ÷¹endstream endobj -950 0 obj << +955 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 34 /LastChar 125 -/Widths 2131 0 R -/BaseFont /EUDNXE+NimbusMonL-Bold -/FontDescriptor 948 0 R +/Widths 2153 0 R +/BaseFont /NMTNWM+NimbusMonL-Bold +/FontDescriptor 953 0 R >> endobj -948 0 obj << +953 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /EUDNXE+NimbusMonL-Bold +/FontName /NMTNWM+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 /FontBBox [-43 -278 681 871] /Flags 4 /CharSet (/quotedbl/numbersign/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 949 0 R +/FontFile 954 0 R >> endobj -2131 0 obj +2153 0 obj [600 600 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -934 0 obj << +939 0 obj << /Length1 1612 /Length2 18760 /Length3 532 @@ -10077,7 +10234,7 @@ endobj >> stream xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd[;wsS3'¥š² íYþ ütÿŸž¿™Žæ¦6ò¿.@+[;k Ó_ˆÿëD àd˜˜[" -ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î §©%£®IóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õ߶F‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î «¨.%+BóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õ߶Fö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPߧ;X`®ž¨üH\ üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ 쿵$ œÉ„®'~»¦ìw 󬵮¦~íCÊ]™Qê,©wmÚ'c¤ w®Diµs$óÐY–1¾—f‡ÙÄ&>.jüäë賬9“5ÎÕu¨ÍÄV¤?m=Á8ib/4l¼˜’lºÖ’Ÿ$):Srïð¹ŒtéÇ#/sƒydŠü¡ _•vÏÐX¢ÖÙ"» ú”4Ú]Ô†Üf†·”-FêÕˆFG‚„ùs!kt> @@ -10158,145 +10315,153 @@ i ^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹ Žµrð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg ‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq -oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿèß2endstream +oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿÏdßendstream endobj -935 0 obj << +940 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 33 /LastChar 125 -/Widths 2132 0 R -/BaseFont /MYZKVY+NimbusMonL-Regu -/FontDescriptor 933 0 R +/Widths 2154 0 R +/BaseFont /LPVILC+NimbusMonL-Regu +/FontDescriptor 938 0 R >> endobj -933 0 obj << +938 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /MYZKVY+NimbusMonL-Regu +/FontName /LPVILC+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 934 0 R +/FontFile 939 0 R >> endobj -2132 0 obj +2154 0 obj [600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -894 0 obj << +899 0 obj << /Length1 1620 /Length2 20127 /Length3 532 -/Length 21035 -/Filter /FlateDecode ->> -stream -xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&q5 UUIºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•î£·5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o -šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ -ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î -vÌó_ŸäsýðKÞ`zŒ—6$Aïܪ“³ÖUª Ô¼qTÉŒ!ÝNë”›Å/˜4ú#pöpò>ÙMBˆÁrêM<õlb®‚‡é‹à\jÑhŽ!··qèš–í:—… u>5±“ª——‡³›G¿:×MÎ{òεÁéKœJC·Ò@µ¾/)qpgŸ”­µí‚ ¨•Šgý´»Û]^ÕÞƒÛ1Ü ½û߬Dþµß™á…°ä]xŠ©9ØhNT:™~«„r…7Ôè¯Ar Òx‹'£º줔(IÖR×Äf*®•5`™xZi”çe™•Vê]è®tßó ¦@ßë¨ÖŸ :º·WH’gå Îãí;g¡ÎÞqQþ6ÿ*<È8Ô²nir{:^2‘@àcÆÃLˆ&º¢a™³SûI˜ ¡NÕÊÁãɤðÛeã‘[‹}­H}öA÷4OöÖgí -„7N•{œP¾©3¹¥Œ/Ä[Ö]ªp­Cƒ’½f±eB8|* ÿá´%Q0d’hyŽÏË9€œH7þ5'i}=½ó{LXwÜëaä6Aº„ï5Ëo7F—Aµbñ#¹‰…O[?ˆny= ¯7…³¾ÏÆ_žMSÑÓ<Ÿj²¹O-ÄËOrlºÈ|!•¡ÀºüV„, y©+¥, ßê¹2š_Sûà£#üåž ·${qÛF2<üm=àmûS}ü{/°¥ÖÌ:i­‚ƒ‹\’³¦ææŒ"×îS©ÄÙM>?gЀñ¤kMí!,£sê-Ð@‘œm.êÎ@ušltÚŽ£{±/¦£¢a?©8AŽ°KjðæêBQù–‹Mør“J­õ¡F7ÇET¤tVÂÌ''¿3ÉØn¦»3=æܽ‰(®!að5÷åñŠ&'×ì ®n612"à8F•–²£ _;Ù¦kžO„ÝÓjwX í¨FVfzÙâ1ÖãðÆé›­iàRQKzó€ü§$·+ ,o@rÂð*šAnú³,½,¶¹}ºeÄ)ywÉG~­(JYœ…Gåy T0}O7&·wŠÖŸ D©ÓÙé@ê±=Iµ~½sŽè#"Jk6ÿ´µªt‰`úb˜B½”ÿ}FžÎå”ê¡scÆ_»K3B|=iLõ÷*öY/È× d@OÏ9FÔ•Îk…&÷;®/Þ¯/]ÁH}ÄËg•ëYnq¿C…å#!èkšž®¸B<.›/æǤ¯çXd\ºiÐØñ-z+ŠÉ¥KHõQ´ h¦ÿFÏÀÁÕØ wˆÇÕµÊÉàŽÌ– $^?Bäu):pã uÖêShÏ©ÏUbŸ¼ƒMÝ(¶&gPð \`{$¾ɦc¢¹Ýà%_ µæ”¼:ËÔiÏ¿J”­¶¸•#HÆÌ)o=A¨|iÃHo5¦x8ûÕ¬¹Ùî?[8V=—¦­Mº.ïS`Ç¿%¼à%¨âÙÞëju¦JÕs¦þð²=ö–ÒkŒVH‹CÁVÑ"¯•›ˆøKŒÉúÖxÞfªxkžv7`­ÄJmœ,™iì‹—³é éM|ó‚X2<».Íhì¾0úd²n¬ØÕ ŽgÈ-KÇkenI`sã\ãQ -ï™°H¯Ñq<)XÍe.vUÀŒ‹Ææ6¼j÷(OóÈŠ¨ð"AÏ@ ä_ÞžX$#–alxUeh[fdþ.Þ_lÔæ8-®(˜ÙÉë¾—©)ZóÕŸÐ-Ž¡ÀULµ îu!lIã$)ùºI@ÂÁA5ØÀ4“î¬Y’ËËŒÞòQ€!I…ó -Ôû´Þܼõz2‹÷¤#‚JÇ_N‚aºäYCÏ>\z…„–gĈÏs³Ìjd¨¦!X¸ˆÓ wÜ2mö8Ùp!os´C?yTÿ@[Qc×Üÿq…ÒŽ¥Á=5(æΡm³× ÔIìÑ/Ôa1VGKj]Ø w´Ú}oä¿8A#çÁ°\SêœM,ZkyÀºHí(¨ ·³ÔŠSñçöš]MC~ÌTŸÜ¤Pg}÷p€‡€ J¥'Þ fØ‘Vý"‡øíbÇdsªÝë~£vz-t±~ŸU²ôn5\±ìÕµIýS«Uÿ >¢KóHšÃmµ[»nKYݼ øËÈ|(ÚÍs@w³™ >sϽ°V…–šü ®ÙÞÇ+×Xª‰‘†€9õUW«K8†?é `(zšŒÜ›×Io_eîÁ‘Í>&p×$ÏoLòŠJß´/õý…›R-“ÃOÃÄ,Á‰ þØFáÒÓýâùu.Í­Ž©X€²£ÝF:ûL@¥å߸‰+¸CVçD§›î$2ܘ±­¤‚Tô¦:‡4Oòü?ŒÙì7ØC *™VBÆò6Vjó­šÛ¾§ ÷fÝÆ1÷ídž ¿ô |ÒÞÞ@OBG À§˜«T ˜Ã1=Úuø1&\ÛTĉº(Ð64Ï›§¼ì¥—¿ž6ÇnÚ4~ÆcÅÛ[zFbÆ’RJ»žƒ.¶¡ÖkŽãÃÞDþÈÉ+GâzƒîÔ¹m_C|øþ0/–­Xµ³-`_1+Rå¬Ë¸ƒðžM*&`*ó|ÜTF-ò\<óãT¢Щ› 7³ Âý7GÓ\[C2Öb”Ÿ‘„fÊPš{í›ÔW‹Ìà±(B(¾\íɵ^*L²€N8)”póiÿ *aG„ò7(…ÛŸòŽUvÝ9ÝÛ” NŽri$!誨’«¼Ž×ãý±"ðníyæñàg±ë?ϳ· ÓøÖ8Zj"kô 䓆üùàÆUb´r¤ |Ù÷̓ÌÛ­ç,¤p†é÷ƒ³ÍÚ…ïßý«½ >õz´ø#㉸Pb¦ÝÝ7K"*t²[ÝqýXÁ2¢?Ù®Î>¿cQµôÄ -³ì$"½ƒd" <Ò-ד º!ú!áŒI™o‚öé­•“0óV;q„¿kù ÚAƱç!²‡Í¹iÉ—?E«\6ï•qV½w8á’Ž_ö3—‘¡DÏ RöpÓd‡á~.ÖàËR“Eû?ø¿±ó­šK1à -v¿»1 ëæƒÙ(ˆ¼JCü -à+N‰Ø5ÚNjÔÐY›€¨áàݵiï+Zf;ˆ?Çåe³ÙvWà·kŸÒÅüµ—¢I¹ë´“F4{½*-5 …)2x¤iÎ#§·5ž.‰©sV ñº^ñ¼ëÓýªÀ›`õVÙÅ¢UR¸¼ûpœ“åæ41$ûFÐ8ªŸ8 lV{v”ƒîÞw©³î~¯ìýý«&À꾃~èôÓEKå½ây­ Dj”¹÷-vá'†H=~€Œøä“þܦð!UMÌÆ‚qzÝKs"œÏòçžNIZÇ&s™/í}‡•‚ðQE´¶åï¼1àE˜»×AÖö¹›€Ú8!ZŒ%©u4¶7×)-¹¢þxÏ ÌŠi#Ò},V{ 3ê™Lk0Ûd±À1èÙýåÇN@ˆñ€ÖXzdöi¢ð»†¢”YµÇÙ¹þÕ‚ÅmË.»ÎÅ)6>NSã"jú¦HËèË­LnE™ƒ¦üÂKh°ï_ŽÆˆ\RÙßC* 5¦ T(´eLjÔ9úÞÓ…eñrWtA…¤ÙlõtŽcKª¿ÔL©ÓšïÃÍCm á‚cÆó7ªÓû:³HAÁÏÑ×$k!å8Õ#[;mñW¨$¥„ÊQã]T”PpÎÊ©j0)¤p)8H‹Ûä—4ÞÌd9ãYVä]mze;ûµª.ò+ÜôÖƼ9+C­…ŒµÍ7ÈÀaÀõñú%B{PçÑó²ŒG>¦ï\8ÞÓ>\ùë -¾07ÙtîRÝçP{myZí2÷<ijœçâzxÒô £'2ºñÉþD–£,9tÞ±¾vR§ðSpCŠ%è²³O»¢‘χæhÇeUfL†öH)”éßѦ"¥2¦TVÞ¤Vx/>’^Ž³Š$pEÚŸ ºþ<˜÷|š‡+œüäî˜jlJ¢ÂKiMù éÝÙ—áø~‰Ò!ÖQ‡ü{Ç´ûô"¹HПc!v©+2é5ÍlqJ®‚MÏWàï3hŸsÞ:®ÕýT‡1›ãð1QâÑ?nÑa»A› ²¨ÍÜf§”RéTø§qÉíæÛ·>Åé™*QÕŠú™Égš¾p¸ãù€ß°L£¥ÍùŒ„Ê«˜½HÔvN„4'F ­Ÿ_?jw­í€ë`Dz?ú¾É¤‡ªŸ}¯? ]{•jåqL®tsµN!CPóÅñ5ˆÃ·Ì|Ïå~º0È žÕ iê“Ojh¤Jb§ =¯ÉŒÕÿ;Ñõ¥efÚU»oÕŠþ-gì©Ù¯–Ï‚ƒ‡ÐhèCÌÖ¼Á‹Xž 0Kvî5möAœáÅ\AW*£PôŒ~é_rqúõ§EÓ<ÕÔCvCX± ¸q`3'¹¤­„{èF°–$õh\..‡ ¤õc½ÑŒ â†Ù]ÖÛi ¹ýhIèu ü–¶ô#”;üÌÎl²k¾HSEb0pßÂéôÈUÖùz¶ˆ~ë> -º.F5|EKÖ_kßU­†Ä&“ó"÷•€äûdÎ…#æ›5åØK"20¬.Fí¢Jà(2\࢚z~"‚*X¸×”•›¹-=‰Œ!‹2 ZK …‹3…~`ÊòJ&qðmvpˆ;¢¬¬Õ¼}ÜtЈD½N¸Q/pÏÐ@Øy)diDÿD¡L"Y ^ßî/;>Ìûjö‚cÊP;É)>¡ˆD‚qL¢‘hF‡\§›:ÄzPªÂK b÷{Ž:bÌ_ÊúDÓýx©4—wB<ÂhESUÈyè,ºf=°jŦc³Ûb¤€™×Nx”ØBÞ.Ô¿œÃóoRKŽNMðͱŒNpt ØA¬¡â ϹùèÓAØûE lÞn_V~M TÈüð -ÛIX¨_QW:ÿµ ]úÐÀï9Lœ`]fd„ú1ØñœÖʨó™¢r -EþØÜlgøÕ_:jûìe ‚¡¡¬¯ 3"=%…m7áûìç‚=~WéFF× 4"K¬³DÜ'ªÑ?¶úï…nÞüú -M q‚8IoÜ•ªÅö›ÍL-Ô…`€ToÞ½*Pvz:N“x ›ÝžÜ™3*IŸeÀ4µô -;S9Á%]9Ao¢ÁN©‡’p6/€ôJš6:7õ"élÈ2îqœÞ܃A«ñ)Û«Â!F—?+Íõ­ÙV³d$7ÁÌ&áýWW(Þg0 ÎÜ#Úž8¤;ßJì­¯ý‰Ù¡L¹ŒÙOÝ5 oYÖᘠ-AÒà}…a™5‚>ÂÃNFØX4²–€žÞri¸™½‹…:'é‹NÎXªËQ±lC#Ë4’w‰ùŸÈ>ßOºÒLZx¯dTH‘™‡Ø*:ÑP=@[›CQƒi«m®þ²´! -ÚÕìΨWtŠã ?oAZdævò6I›¼)’þ‰èRUÛÌ(Á@Ú”µ²âa»¦Ð£ñ Ûå²ÛšÖ/ì¬ý&Å%é¾ACF÷êÏa¶šƒ;öùZjûâÛQBÙ„ãljÎYIN«ä…{Ïy|—hX®t²RML‡WK&q¨aEPjÍ–_ê›Í2ÒÙmYL¡£Ý§ÎŒrêgsÓ¯NãÚ‹+A׃²„7g¨ëÞÊN óké…%¦~aÝ–o¥­~F¼».û#3{9D«Áä1;â´æ ÍôQôÃZÏú8w&_a†¶j¡ã÷q ´r©>Ý}~9ÃQ‡“¹ýñQËöš‚¸¸ÅÒRß -nº_Ø;úáW„ZÏ(œd ÆÅÕ>¤õ„‹ÁêÍ¢*qöŒ‚#röwQ;£œjÚÆ^kNÿyŠÕzÁ tjY×rCD[")Q’£#˜Øn]Ìcõ(ð(»CÈ=g}¶F`³k940Œܧk¤ÿe:ä#_tRáY L©£½N‡íAKZ' KLH§£tvH¶ÐSÑe6óSò<ø]©k>¿2 GÇNê#u0UóQŽÅÕòK»/ó<'\`ÛyæÒ5êLZ íèÄn™çšz‹ˆÆL²˜)ÏvŒX¡[M5þÉž„¤´‚o®HõÌLg‡œQäzä<¸±5î6Ýc²±ï.U¨vÉM{bUWåL¼Ù¾Î,mxÙ*û+‚ikX‚â{uõ<„NZ'8ƒ,T¥~ Xè%{2Ñ/f>[µª¦Dîïö|Ý¡±šöœ©.q´Ÿ›l¢”„AMãSæKæí3r,ÁãZ<Ë›¬ïám)œ+h¯zìÏa~¥^Ø‹Yºxà½M67­ -}¾Q@°ë_Â! ¡nÒ q£^c7Nh?–Dbk]z‘Zøù·Íà[ÛX=mÅ›P :žž‰ÍW½G°tC#<áß×V Â'¦ŠÒyÞÄ1ò\ðÎòˆ¿ƒˆ§9&åŒÂT«âÞ°;¯oQ -Äd²’Ø[EÜ­°¿ÈÇ`n—ÅædþǦiBŠFtù£¿ mŽ<{ töJD|Ï;±Æ&G‚iþco§Àå²-çaA3©±W(æ‚2MYÕô(mò¤ œFã³{gþz&V__éa6ÎÇp›¯ØalĺÃuwðnæc"8¡n‡:Ñ!1w‡Í‘˜Ý¿g•Ã ˆ%ù[ÛÃÞI‘nÓåÙ–~gdº/~û¬ugÉp¡`ÁPþôTiHŸì2\)ÜЙÍàÿ®ºþ0æ‡zx)œE½ Úéq;7,¦ýs¸ƒ,ª‡izÕ­éü*ið¾\~]•mî§Æ Æ K•!ì†ß!ou4›¿›û‹†«ðw<«^UG‰/)cy¯$Ë‹> täCÔž•6rеð‚jåº)×ä; æC'17'IÙŬõ1:Ï–¼pV%¤»Ã -2°ÅѦyWýö¾¥jÖÎŒUËü«üÂ@¹,íðÊ&©¾JèS"§oóZ²,¢tëpbýèÒúc•û"i}„¦Z~K¹ŠX`i~l…`šúI‹%âù>ÑH—ÓVÒE©ÆÅU …ú©KÜÖ·w+ÁJS¼=öËŸ.Ç=|µ >üô=ÛŒ -’ú C¡ãa4Ÿ—7C‘ªÜ݃~Z¨‹ˆÃ©µ»*‡‚s· @qp![~_£Œ¿:[8&‹”ŽËNp€0ËtÃ"¤ü4q%¬i¨•F³høð¡HÁ81äј=Þü2¶ã³âL˜lƒK¯:ÏÂiåsB¢/]ûP6•[x² _#6}°Åf T¬…%*FųÖËÇ}Ù‘8?´Ï›P Ò¬“ê<7í¹õìÒÂgVq_î½ò±fKú–lFîkÉ(w(:Wâyx­¹CIBÞâ‚Û¨[NõbÖcpq¹Ú4j´¥"#žþs7¾hÐag•Þ^c QÔ'?ªæå´AÂÞÊ…øh¹(LMa.‰(<ûù ¹â¹®ÄÃä%ÄkëºT)ƽØGbª8Ø—ö×tà,D¿“¿¾µ•*Òš.S:µ›èY|Ùä'Fz„yÎv~lˆ²Ð…ÿþ5£àfâ¤û–¤A-í-³ñsEZEÄ÷QàÝÜ=‹þ‹ÑMTsî›?8á‡t2eVe&…¾1›B¦\q(ɽAˆð"_²ó8ŽvTD=°e™U³ÓÚÖ®e#"EîÍÌ-ûax‘Se¯;ŠF$­àÈY‘×Ç7¢=HÞ¯½~òp±Õ¿þ) ’ýÐ+PXY-x"yQùºì€ìCˆ«=³&o™ù…ŠÒ¿$¿Bb‰ÔÜ“Q80ƒÁ˜jU¥9Ãüró5½C£öñ²·Ëä—A<Õ¦¡1RÁgó[¼X- ?¼§µebÑ×k^6*Ù J ¬(І¦7Ü1)ºPïNଛ/r§t ªX¥õø&™ ¥ƒÆôÏážµÓfÇH­öõŒ’°.ÛJó9øP>µe't§l†ƒì1M¾#,Çä1¾#Ü­ÕÄš#[ÀN).·E¶/°6~ª§ˆÄ•T1˜ôY¶#ß:a³áI]ï¡‘g=㟗ì26®HZÄ+ØÃîk -z|~ÝX!ö×½’F`à[m”Ý»”}«SqÁM÷]»&ÃÍÝùԛꚥ‘ü…@ÏHÈúû Ónê -c—™XúAÒœü.; ®¯˜›'·Œ©½C›ˆ^zºnõâ塳ýæzI‡•f®.µ[bO\–äïoË2@c„ÓRvÛQ“5¦_nuˆ+ç±Þ0p%í(p“ ,\íqºGÞâ•ÕœJÈzpˆF­zè€ÙB+>„ iÎÞbcýЗޜ:È3\0/¡4ÜcàˆýÚTÑýŒ§m q¢Òß\cÇ úb{OhD~éì#­Hýð&Åû˜éì¿Íäj…¾d›ÐTC ÿcä¢Be({fŸ9¢z±í¯ãîí+¸ƒ»ˆÚ2HŸÃ{Y³ït”CX¿4±5=vßê „$òVëlY„ÒT PNóD© “¿÷Âá4¾4k[ç†ÙÎ|y©RøŒ³„‚KÝOsOsN±< –$õ ßO8,xìÔÝMSc1#ØÐ¥[±V¤Dæó:1lž ÔzÔ,•é$âλ›¼ôá·µ©¤C}cç -RÐ%åØWÔ糖Î;ÇOÏØŒI“ëöL%Ç’,úÛ¼F¬>žÜÁ|á™ôaײÍ4˜m?3’V=·_L=Rx;`‚i<’kav`Ä óè·¶²ú0 -pºs*Å"øVŸûå¦ä!¥`˜nƒ³ß+ó+ŽµÐ˜-”a¦¿FJá`éˆöF%†m„lï×Ñ|GÅ“ˆ9€lö,Îh¶IŽ¢‡…ÿNEI ýõ>ähÜ—ð¥‡Ôâ VG¯ªuIl?¦_a‡EÁX¬¬¡Ó]VbîÒ\ß0—ð&®Bs:¹¨k~`µ8î¶ÈÑgk[÷Þ–C*qÁí%b,ˆÍ¦Y=S„Ü›)kT}3ÐwZúY+Ì¿¸‰Z™ m@}‹å],×jIºJëÇ™Œs³mæ™!É=â1P1@\¨²5ãd £ÊÕ¢+ 3[9DŒ§Ý´º;A‘þsš-lFQRÒÀöÛa¾Övþ[A(Ïô䕨:>Üa$/)œ¦ÿâMU_q£ªÀX9ð(ÂÙ9Nø†Ó3+öš¸wQžugGвeŽd‹@ÂLkZÍöç@QvÛ˜Š!-+¬d±ëO%è \é¥&û)Ë£zÝ»èëvÁ10 䘰²ÿø£T7ÞúûèÌ›ó÷Ï eN£Ow·OªCõ§{gW¸¦u‡3Ž«›°ž¯uÇ*/[ê7,›¸GÜ°”¿¤Z·R ®²¡Ï”ÊÇ‚À“É*ì5tõŠQ,öO^ÇHO‡^!VçnõYç†ã2?K0eXËk¦·zy*’"\ü®æj‰¸gFÓïiêC.Níe†Êë”–"—²a÷4TÔîÛϹÿ)ÂP~CMH” sü•cň$çi~}c5mDÍÚ64òÀG¬þ¢ÏsÒœ¸—Ò¸×õs† ¹žGîì¾íʨ ¶49×ÔüɆÿ»–21“膞„P1Ün`‡\¨_RðbèÖ‡èΑ6ÂdÙ.ÛNã²êü–û:ããœÀË<2¹»ì¼‹¶Q†.j”¤ãôiaŠ(«Ť{+ÚE -çøx£ƒ®Ñãz#ú€½ãJÿy‘ÃEäºF•“Róª»ÿø†D¯11tü@Ct´Y$Á¼šGj™¯%?¼äX+å•?L¤ÔÛ˜‡Í”_´Ò#(?Êô\˜ã@¨nw"àYl™À<”w„ÙY)ª5avQÿÊ%éömŒ—êÆ5=–AâŒ*$$–-Ò{OcŒËüŒÖ3n¡÷j¦&•3ì£Ç€ÄY+÷U&‡Zg\'ãMnÿ@÷W¢4’: zvlAÚ”‘…‡’>é„Üo¦˜Vü_Ù¹šÇ};*ˆux’ÆC,(¨ƒ|ýÜñ¹Ú÷zw¹)ç`‚‚zÂÐg\ÔMñJÿ¤žÜɆ'Ž§¡j9åÛôWÙM¶¬út5àÅWª˜»ž›Eþvó[rǺ4®€Ü’™`h—=¿©ÆôB•š¹ÍjÂìI~ •[ak‰¸‹ -£fÍ6•9í]ØTÉ°bµ÷áú1K/š&‘9€‡e×¢hœj4Šß.Î[)Z -dCŽREm46¬8Ó¥N¸ «Ô6<É,ÆÐÍÉÎæi:ýx(¥Ët8ÐËn ÿ`’®! ©›86·§FåK•5JíB«×½VYg©»,&à1:¥ËãŒ'„D=lï«&è©IãQ ¯€äÌWƺ¥„RÒŠHw²ˆsë&üÙ­kèàûmïyoµ©ltxebmHçfïêïo&Hì*âj¦Î¾kÒrX›0 — ó=è^›,›.Âå˜/Z—[’áXýõ~™?4ÒxÈÙ'€äñq ´¤ª^JÙ[K™†OøHÊW|Ý@yw³IÉ:—ˆ™ô U-MÎL áÖœZàZÌBÊíXÃ6‚|6å˃ÃçÙÚœ—äºëZ£ÇØų%GÁc‡0Cüs‰ö[}‹#µ\ˆae¤Ãú4R{ ä{ÙãaË4#ôbÏ7áÅÂ…z¬«@½‰ FC̳„…žóc’ÒNÜ4.~4\jtÑõœáåxþ;²![EâOB ÆwkäL•1Ó-M‰Ë㤶@fõ$²&©U"Ë*u A½ -¼ë0å ®ÏØ¿îZïܪc~[Q7µê4è©Hšñq‡Ôø°7ò=­³ž‰’ §™òÆú˜“duˆ?ÎÕ+r^9kæÖq槜a^NžbÁ:ÐÞ“ªC=>JÅЕd›dg‡¼]ÕúˆËz@øeaªCšs5z Q/FÐé­Dú÷8È«âX²D›íŽO@Ñ% U÷Méd>kZ|èdü%ÎÐ?,cYÎMw5ÊÃÃP|øTëZBŒåæxM~`Ô•ä×P -Ïoé†-Ë»ç² ¹ Y¶ñ­Î±‹èÞÛ°ëÙC¼aŸèß7嶸מ -뜻%CAÌ‚¬UV´‰Maü€¤Ï¹uñçó„áÜêÀ:œð؃CÛ(|#ºÉ& ÇëéòɼÏÈ8GÙx被 Š³p<BÌýÀ«›[¤Êñ+ÇÕ˳ž8b׈×[ÍT|­¥#NùæQߧCW;Gˆ|SmÿFÞÖil±^õãþ™ef C¹‡¸·á¢y JòëL;˜L]¸îÙÙeÂAÚbˆPAIÛdðIÔPîÅ¡êîµx£x¤ÀvóóZVSshö†ñ<(ïmýyh·-®Í䦊ŽEʼnqØ•!fmÝSÚ‡ðËZŒóÈAöÉlxýJ|Ÿ¶q³åT ÒŽ4˜Ìýý—HUUmnˆ øCWÜ]Òï[÷²;ZØtnh3¦œ¨8 ì.(Ðë[Ù_ô~{hRÒ¡tá%kj†)á¦U12Óx±g¥×_nŸò‘±q»ÉWŘÄÕÜh95Ýô릆‚˪¿´¥eI]"è+©$jW M vžÈæ ZTb"}¤ªTS ‘O{hŠ?"ʲ|kêz*uÖqÎtR‡c7J—‚5ø Z‚†R -×·³÷ŒAÿÞ]ÿ¹:#¥µI丙û@òñœPœ p9EñxŒ9"úˆçFëÒ1“ä2cÈÝVâârÌàOÜ>KÖ>uÒ»jì¡ír¡Ž#ú$ÝQoë <µ ƒº²#×_›Êÿ~†L²¸Q“Îxêœ-ñ9t­@i_Àš9™’»ÂuŸîçrÿ -ÑÅÛ±åprkBÙûCzÆaÑÓ3ëÌ"!²2ö]3¾v{ÌÆY­»G «Œs» Oå×náR¤C2¾&`ñNƒ§Eƒ“\ÙÍ9È&Bê.üŒ¶Ù· nRV'“BV’äýáú%h:¾.l¶CÑy%4KÉÂTÙfÝ4„T·:ùÔÖ4_'áULšj€žXËÜý¤öiû ÃÆûêç”´c§=`²¨øqªe˜ßC´Ü¥îóÚlméòùfôæw Ñå#ÑÇ’tx³%;$àh én÷ý ‰7pP0OÇI¢£§f2TûvÆafÕ4Qö“ ˆ,‘XûÜLܧ–zá_ÐáVM¹‡¦OšdvÉDþeQܪ#éØ©èªmc…PðQh–ȳç%w"?/]]‡iîä-7.ã ’ÿ¦VÆ|K‰bÆ”`ˆëF¡·bÈÑ¢-ñ1Œ¨y4T,}ueé'ÊÇõ»•ã Nø0mT#?[½ø<ÿ=†C³)õðœC“$²h,™#O±Píe8ÒE(,–# s¼zMÎ)0Ý‚³0µÀ²DU4–;ÒðÕ…1¦ãŠ~Ç0W€/MY$g´™•A-5 Òþ 7ãnîS}Ž@N:°óï3ÆúZ½Fõkwy<Òð‹÷ÜhŠKÏ=s+8T¬ªÈáö@°on»ÕÜDük w¢ïž@8'ïop°ò›KéC©ºyϚʡ½ -H¦Ö¼9Gž¸M‡ôº„þP¼¡ïÒ4Š›µ.¾êJøiˆG•Ä$ …hÎX÷lÕ-DÞßÍ›á/c;§Ü?‚Ë¥9‡l®Ñ{Ä­Æ»òni†n½$›B×:õÒ©~’Xvy x’9c…Y - w/¼ÞU·O§”~EÁÏAç8Q•|ðŒGÇ=gý9,?YÁ2Ë2L"ôÄEñK‡æPüÚ÷AÍí"I1„'{†§³ úº¿¯c¼NøŒß_lbéøûö— m„nĜɫí÷Zäo£‚³|t0ó>ú>S‹Â™ÔRú—°zaI¿ î%ÕA˜">© •N~ú‚×-† ®2-QVçh-‰úó ýÞpܹâÛ/–¹"5vÎf—GWnT66þ8éô^úÞu¾4+k‹O5Q]¬NÙ  ¡-ël_M¸k˜ÚûAú=é&;4³áhgVå°CºìÞÃ5ÉÕMå×\Æ»8Ô\¬è”&fO³úÇ;^‘RÒ.æ,S–¼÷ƒ`÷‰†¹¼3y°f?s&†ñÊ; WÙ,¼K#«©Ù¯®øbj[¸_VM2ë*BWMŠ¬3@¿1(Ÿ¸éŽ÷ÏÉXúŒ¶UÑäDär ÷ñÇtƒ7Õ‘l g h/‚Ÿw˼¯rÔú'‡cÀUµÁªqFÜŠ%ÿÖi8ÉÜÕYýXò³+~¢‹Ùäûó¥rkHú¶>O­ÐÑѤ²v†1˜#°^:á?Q7Q¥×8Tnn¨tÑ#œ6nœlÕó Úî×îŽq - Òo)³S™2áØ¢c—¶FäKa·\®ó*‡©‘@èž›XsIÅXðûh‰ðeýÖ8%W6¤¹¤‹»Ü²yÕŠ½¢uoUêJP'mͧésŠêø?¹ÄÆŽÞמ+Ü¿eB*£HH:`rÀL]¿ºH.âØð~}Êη¡>¼üHÇ8š½D ýâ.ºQÞùÎ_]Ì—%×Ïت3©W$@2?d…°Õã¾Â`¾²ß³Þ׆>xÊ:ªÔý°™9•YæÒÊßÞñ˜¥ãë^:?Ü'°‡eIº¼¨-„~ä˦MÕ7W¥_ÓÞàÁ¥MxqÅß)w¾€Ì}®+È Á‘ÄâGu™.­Y6¸D£‰ý}KCîý§WçRPn"8U+Sœ÷ÂøÌûyvÝôL½3ìüî3QÁš\É–ä>¨UHC{ϊѼ•€Q¹!÷Å“÷.¼?;L9§ZšÒE¾é«v¥Ž}03|­˜6þ–ˆ¶9£,whœ-ÇËŸ­×;?zøpÙÍ„y8àŽ9Ë¥H»ÑHîÍÄû-q˜˜\—1άÄ.5HLUcß|{¨8óŒòZßÔç`äô³ÁPß½Q5åŽèz”=ûŒW0zúU÷Þ r còRˆžÿžDCh-&¦)¬u#Å>"1™k–ôÿ »žÍÌÃá±N”vD#¹¢A窠›`_ÝxXÒÈwgÞ„ÏÙå 솋ÛÈK+´CܦA"Ê -âc§x~XÃJo(¦cé;‚÷ÿ¨š#1âŽøé}SUx °f=”4+ÿ䎧õZ›…HK0 -—€_úØî*Ý– ·£ý7<³Y6ªãvl¤ÎݱæŒú‹Ù¸™‡ÈÈc?m·Ò†h¡ˆÕ©Åç•¥RäÍ×”»L|âÊLwõø Ρò°¤¼AçYKr¼Ï¹ÙÖJÑkW½b%òyQ·ŠTæ9æ‹Ló"$N¬½ôž‡9ȯòL¡åùö;û¿ZÆMú›¦Ýj{wAÆILTI¨£%èÔ&ëö…ôâÞ %§½(1ã:«/h•¶µôÕ9óUÖô”‘­Í¡i¬rÝxUæ¸ÂÝPÂ#á61”#,*@Š –üb±·Tx8ÙÄç{ëG79yçÐê°ÀCþ“væ$Põ`Ò匀V–ƒÿþu6®%…Ùqc†¬Ó:†wtÎì•NôwØÒPÄv©*û&<û'ývýЊâ¹!ÔA"OýMBð¼"ðÛQܸ…ÍK) z²>Ç'áØóô-oâŠÌ#°±ÛÓ­ÀD/&Ësg k7/;ô^D÷‡ÞKÉÁ¤ ŸCH-²oS<ÛõCoõšÂÛw˜´øŒª"ØK–_Š­"H‘¬ûVpÆsáõpa¡£_Ì×SÈÚua¯õ°Ü±l|ÚV±{+ wókÎ:¤6= s÷(HfUôRê¸zP¢[E  ïcYÄEùºŽsûr~3§Ÿ°3ŸMÆ?å¦T‚°ÍZ5ÕèR˜±˜rL‰buO[ˆ`×w\ÁU·?‚‹œWà&ó+Дzu(“ Ø!ÌìÅûR% 2ú§8xdßÿó <ÌЃ|Šˆîç }®rw‚RÕ:Mp’òÛBÿÉ]˜RòöÖ„½®íX((gÿ¶Ä?ɸ‹e»¿è­ÚXÄ`]¹#ƒÝ’X—ÕofQg è¿ÏU„»7­‰¥äœ“sõö‘ ý£Ëw5Y¬•ÓaM(Ã]Fƒn\^¥BW¢É–Œ~3 -ܯ*ù V}ÒD¦ÿôð¥ÎÈ -}ˆÒçq=G/¦8õ6ÙüÍ/]Z?ó{P>yêU•œµú}éË2&@žÊå:Þä®þ;TÆ -݂Ư9ÎÖïSftt7,-–‘hV©©< ®ÙÒ]+,àŒA‡Ø  •;…ÔzEå]þ<Ïßý‹Ìɤ C™Ñ6ïðÖR®{ÒºsŽyZÍÒ+±êÈÜôÄk´ѤFÈZ‰!FÝmP€×:%•éd -Ü)„lk2'¨ á"€”Öó±âµ|syùͱÕe€\ûÊJ;YýMªI­‘_£ƒ~Æ1bfÓõÝd=–ÙþÅ|SÅ=UkΫ -S­‚DÍ0 »(ë%ªUÎ17%g:F‡°ÞZ?{¡ßs·1SÊ« „]« -G7ôæøÆnuÒ{«ýef‚‰@ÆÚJt'D©Ñeèb ÕÓþÿkŸ,ÛšŠ( ¢Ä’n¤Gw3pÔèÝH·„4 I‘.é–îÝ%HŒîîÚ{ÿÃûí>÷ü€óá<ÏñÊ@J>N‘÷x°íþ®/Àï^ÈnÙv®Q’U õ×=[#Cã]6öçÑŠŸ‚h& ’Œ# ëyƒòk»6úq -ÅGÕkX:gׂ še£¤xu®ôØ\CùqKå1¦g ¡lø 7[Ù²Ì4Òÿ¹[PÞÿøç¥ÏFÔ´²ÿšûI#pŒ"­ªºóöWwxN¥&ÿÊYGúéÆ„¾åoK?\aùt@½=¥¢D#UŠ&ÐmÂ΃:Kó#˜´ÏÙf`ÃN¯Ú¬5}=ÿúfy$V·‹Id”-é%#©¾¯{z²5…رF’oö¾!²’»÷ØIáMØïä†H}ØÝÖR´x`î/Æ]è›Òª^3±Í7é¶ûñâ¬Â^µñŠ -·(FLH³~å¶ÞÖ@Õ6Jäó¾xÌ0V?K£ÈÕJÑ}gy,‹¨†/ã©$þ¸Ì~“Æp\!#…þö/»-ñæ –Ú3Uv+l•EM ´Dýý_O‰uò!÷¶:) G‚·Ñ é91¬ÄdÐ~í@§q&±ÑŸ<¹¥ËŠ)üÁžjÄÆpîp ãO`6ÿÓaÌ€“Ê ‰bœ›³ƒø*Ln•OA‚+«ä¿dWÍXäøkÚ—­ ÞÎÓÒU±?*›¢jžêß_ -+µ¸¹­Cí­u†Æ…¥v‹øò¬WU˜}öÔ“LÂØÏÚ(kœ¾¨RoiÍ^$Hé~ÒøÈz’T ñ׿·xû0­®Åψ_ShúÜ2\o­EŠã¦=U´ž$¸_N Ó–jz͉Q -Žò2Oa}=AÀmãUv”'·ýÆû9û¨,Yó‹Äg“ˆÐ‰$¥°®ÇªÍ3|Zí-Ä -ïùnS;ÝŠM‚­fˆðÓ%¸<%kDpu47û95%–T +G“¢æ×*T‹J<Èü«˜t‡'On¬ÄÂ.ÚrÁ.0£€w=J/ê_GppÄÒ A߃Ðd=F¹­ÖO-ZÁ 9†àU‹¯ùsÃÄh #a™jÔì‚NÌ– tNcñ§VF¢ïÎ{Ȭ¦ˆUŠñŽ*Cs~ö²sg_ܱu™É¢QªÀU4“å²7+ç!|¸`Të‘…>“¯7º–s™as¬G&S]EHøáWIÁ`³ “èÖöAÊ;ÒteÞÇ¢œauÛ,>:.² -ðž¯ÔÏ´ZÕ׈‚œâ^ž>ñ·!eÖ²ØäÛ¶(¥/J‹@Ëz ¼–F]¢wò¿ÝÓÏõwÁ/…=£ÆhŒcsËtö„t˹¢Æ1|Pú1—ŠR,·²ÖÑï„$8É -,f¬S¼‚Ô·Nï¡Ó¡›¾¼xœñÏ‚È¥éJ#ìKÛ1íü±SŸä{årsê,<+ö‰ÙöÙœ¼U1*µþôD'î¿ð|ÂBÕF5Ç .‰Õ+‹f¬æ-åuÝÓ±oFã”’zeí­ðÓ„A Ç«á±™—KØ+·,V cšðôŽ­/EþrË‹î ×öëMƒ}#j€œ§Z¬R‰¾^¢/dõäx”z[]ï9OµÈŒý/Âæ7¯>’òT-)AB鈢C• §x”ï±IàI稂i¸t¿@€"JUîU}mÐ'sÌ’™ž,Ð~bèºAòFKEOlÔýðp€.Xb¢ùçöÞ†£EcÌ9¦È<üE¶0mª¥±|ÿléæ3‰•Ïý="þØæœÖ¦wÆ:—æˆà#!¦%Ö§’\Fj¦¦Â‡ÊIK°';Iª…¢ö}hë­w™å9²T¥tM¸JÌtü‘á,H‡î"ûDHÔz 97qtÅÝÄŒ‰ÂuØ VqtîÁô™?'¯`¹NøÊù3²–œGÜ*˜é²HÚªÒ ¾|W]ò {êîTõÌqý]A÷,’ùÚäÊÖoU¯¤h¨,Œ¶‰wnmƒk¥ºþ Þžê|f¿â‰™TJ8‡6¨Š5¢äÇ„ãÒ¢1,Ôlvˆ^Ìýµ•Žã¦!ã½ì Z¿ÖæÚYôšÎß×b&¾¼ÿÕ‰šºCåu‹Îø{é±Âf¹ªÛy¡ "|ùª<ärÌÌ„)=¤˜ï0gxÛS°^Ø«šéqGGÙàèá´àL–{ù¾±~û™ÓwéAÆH¨º…°íMÊe:ùf> *®b&¸Fd!$xöœóhú¤ýGr55õž?õ'GžLq ú¬ÀœÖÕéž´AA´F߃ƒCÛw ´VøsÞkw{竱>·0¾8ÏöÖ >¿ô=Hq«•3õ¦x:ˆé©d9QL ­þ°¨]Y¦šÍ"±J[^}ÔÊåâÍò"5=4Ÿ*«cuýiÛë‹%ïQˆu8aA#&S¢"\£¥å^u›ìèès² ×CbGó|cïî•ûl.lض²¡5·•Ÿò6Ëü¥“)>5“ܸþäc%Y ÒZ}ϲJ¼G=™ì f¡»ínÈ!Ò[\ŠÒ^H0©mÄõ˜Àw'¯E¹íTŠÀ—±¶À˜•«qRð}øù[õ{ñ½ÈLðƒD߶ÔÐWd6¬!Í<ã÷é](XâJKR -K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW¶ ¤¾ÌÄi~=úï°VÕõZ5dw0uÃ{+M VÅkzÏjG‰7¸zb4@ˆKPñ±Ë6§ð]É"‡ÇÂЗË×øVà]ßQè³ø%áRˆ¥¯>2àsÙsÍ@ü+§hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤Òøɉ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl -s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ -¹ƒ%ÔÕÝÙêjýákáüendstream +/Length 21036 +/Filter /FlateDecode +>> +stream +xÚ¬ºct¤]·.Ûv*I§cul'ÛFÅNÅFǶm۶͎í¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ú%ìí@ ,ŒÌ<5e E##SK{Y)‘ ௙’RÔ h²´·3y@S€Ðð퀅›› jïàádinPÿå ¡££ÿ/Ë?.cÿ@þF:[šÛ¾þ}pÚØ;Øí@)þ¯U€@È0³´Dµ¤ä%Ô’òjI ÐéoŠ.Æ6–&YK 3`fï°ù÷`bogjùOkÎŒ¹„Fg ‰åß0 » Ðáˆàt²µtvþû °t˜;ÙþÎd°´3±q1ý§€¿v3ûäàdÿ×Ãö/ö—LÑÞälâdéüͪ(&ñï:AF r;[þ…öf=MíM\þié_Ø_š¿(ÈÈÒκƒþÉe ˜Z:;ØyüÍý—ÌÁÉò_e¸8[Ú™ÿWô' ¹‘“© ÐÙù/Í_î¦ó_}þ—îl<þmÿ/¯ÿ¬Áä ´1cD`ùö7§ èonsK;¦¶Š”™=€…ùßvS‡ÿÀ\Nÿõ?{†æoF¦öv6S “¼=èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„‹¼‘-ð_A€ÿ¸c²€.K“ÿÍÝÈÖÒÆãÿðß=5€ÿ®RhîbcäôßáÓ Û™ÿU„›‘ýßVKg Kw ©¢%ÈÄ`fdówVÿ²«Ù™l,í€5ý×8 ,ÌÌÿ Sµ°4±¶ûgøìÿ†€v¦ÿ½ü¿2ý«x&ÙïÚòZÊtÿû½ú/?Å¿úƒT=€€ÿ?‰†œ½é.þa±wx1°p2X™Ùÿ»¿›Åçÿñ_D,ÿµ–39Yºt˜™™Y¿ÿãó_+½ÿF#ngboúÏŽQÙ™þÝdÿiø6qqrú«í¿Îýߦÿcý¯íºMÖWìMxƒ­Ò2ÓAu¸¹#Sb:},#?JU‹ +ükì{ýÒÂv¹+ ?j06Íðün÷X>wø<”¦=ëñ¡êM^çùPÐô o}íä¤; +dÒ/EN¿ÐˆòºY’ÝÒæ`V?Ú›RRÖ/ù€!žédu‚»y¦ñ§p-ðÇúòä€âk’Ú‹Ý…Ö†QWx~ñ5ñôù‰jh|td¸÷ºÿ.'ž’× +ùk¤¿c¡ ¶Z…xUó«óö”ê&BÏØ>Ÿ¿ù‡PvE‘妷‚ïÕàO͘ƒá†Àl¬„ÔÈW"æþx²  ãŽïIx%Q¼Kâf†Îo¿møWcwúŸò‚‘ßÄÎ׊ü;L§Ö‘;æT° £6®ãGvíÌÓ.õ=n¾Õ.7èX¬JÌ[ÃZUýùbªÜÁ+_®›xF»-b¨À( ¥ã©ƒw¸ÜÄ$Ì Ó… (_,Ó ¡Ã4ŒS4r-Ù“©¾ˆ3‚2Ž‰ŒŽ$¿ d­ô“„}¼Dä9%G¹<á¬;Ö6®£ÛA‘œ´Øpÿ (wßöìWŸ.S?62=ú0z‘ßãš@΀ƒëì˜ç3¹>9È%æÒðOÞ`zŒ—6"Aïܪ“³ÖSª Ò¼qRÉŒ!ÝMë–›Å/˜6 pöpò>ÙOBˆÁrêO<õlb­‚‡ˆà\jÑhŽ!··qè™•íº”…u=5±—ª——‡³ŸG¿:×KÎ{òɵÅéKœJC·ÒBµ¾/)qpgŸ”­µí‚ ¨•ŠgœuºœÚ]_ÕÞ´c¸Cûô¿Y‹ü n¿3Ç aÉ»ðSr°Ñœ¨t3ýW å +o(:¨Ñ_‚å¤ñOFõØI)Q’l¤®‰Í;TÜ*kÀ2ñ´Ò(ÏË2+­Õ»ÐÝé¾›äAM¾×Q­?A"tto¯$ÏÊAœÇ;tÎB¾ã¢ü1jþUxq¨eÓÒäþtþcÉTI€3!š@X芆eÎ^í'a‚†:U+“òÀÅ$˜ ‹EÕùƨÉMæ[¡'ûnŒ‘µ¬æ•ÌCÁ^.í'R‰ÃÒ4†„dØh-yÅqC‹_·¹£É‘­5R^ôÑza°Òµ:zàø–AèÝgžÄP5Æ –¹x„¾SÈîÑ*¿i&2O-8(cóCݧ†l³2;.žúõC× ]zîW{r{]ÞŽQYz?4éZ_)gæ:}oãÄÒOaËa‘‰²`ü,³†ñëP¤—}SUÍç<[[Æ©ÅȦn沟„“5·³Ú’£Çô–ýõî„}ÇÐùsI Œ |dšK®s¿aKŒ.|%€:GÉ”ÜO}©P¯z-$£×Wõý]1€´Ø.Y" T`Þ3oÞì¥>ˆ‘?­·ç?]£NA¦úAÃ"eåªÛöñ&uãµ4ØÝêçñ+)Æ/²ñßôê•ñÕ°ŠN$n›xye¾’‘–ãôœs®bŸhÁxE¹²ÀŽÀ½òÃ&ãç£ú«ò¥½Ú4¥ˆ¦ó²ªÇ!‰}IïNÍÖø­J¿È*é'ôƒßC㠪ʛvÝx Jä Óc‰ú6¼ê ßs2¸µ3_„1õ4Å]°Ñ¯Sô_ +a®;?o®åü+L7O7¹uv¤ÓuÞ̸¶çŽNóæî™Éñ¢ÊÏC°¶ŠæЂÚ\„P¼®ˆ™ß¢’ 1âÊ¢Þ zO&É·c튩È—©7•Á¼G}Žúäñʬ!FŠd1‚_mÅ€th¬×Ÿ2°?X¶'9­1îî»(RŒæËÜF1”P (Ê·úí¼eôðÛgã‘Ûˆ}­H}öE÷2OöÑgí +‚7I•{œP¾©3½¥Œ/Ä[Ö[ªp«Cƒ’½f±cB8|* ×vÞ’(2M´:G‹çeƒÀü‘H7þ5'is=½ó{LXwÜëiì>Aº„ï=Ëo?F—Aµb©ÜħcL·¼ž…×›ÂY_‰g Ï¿¦©èe‘O5ÙÀܧâí/96]d±ÊPàH]~+B†<Ô•R–…€õ\ͯ©sðÑþrOŒ…[’½¸m+þ¶ø¶ý©>þ½ØRkn„´VÁÁE.ÉYSssF‘kÿ©Tââ.ŸŸ3hÈŽxÒµ¦ö–Ñ9õd¨HÎ6Šõ‹g :M6:mÇÉ£X€ÓIQ² þJ7»õÏ|³ý—9wŽ>«ža^\ƒlEuѺ…ùŸ“Y§7 +á]ô +ØI:ý}Ÿð…îŒr \Òv-`÷’¶­»j³œ³·í} +]rSÓ|¬U]Iƒsuoé$½9¢c÷U¹“äx°Ð¶¾Ø¤Û‹«bÜIÅQ¶?³…á6.S¼à‡n|ÑG{×BõwK¢ »™(‡§òq° 4Nqéåé»iÁ;í¶¹öU‘PÈœ¯æxÊ&ô•¤1S¶2ó¥w\·+zê›DJ´v¸$ÌLßòÈîk>^µ².L±¿²!ð4^¸“PÔ¿¦.¬äïŸ(¿'Ú¶£Pb¥i‘÷êzÝûDUoÀõQ +0E†IÃZ^ŠÿŽ¦Ö‚0›2%“ýJ§^ˆVÄÉk"y +4ÑÃ¥Ë2š=¥«UkW3G­{—ð̪K¦¾(ÞØ–WŽÓÓüý®9’ã‘<džâö—ŠäÓ^Rƒÿ°PŠÊ·Zl—›Tj­5¾9.¢"¥³f>89ùIÆvp3Ýé9çáCDq €¯¹/W4=¹¶dopso´‘‡À1¶¬´’møÚÉ6]ó|"쮘V»ÃJhO5‚°2Ó˱‡7Nß¼hC;—ŠZÒ›„ä?% ¼]ùc¤½¼qÈ Ã«#h¹ilÀ²ô²XØæþ鞧äÓ%ùµ¢(eqB•çPÁì=Ý„ÜÁ9â‡Áœ%J œîNRCèIªÍëKDQZ³Å u¥‡HÓ£zì¥üï3òt®§,P3Žü:]šÙâëIcª¿W±ÏzA~Þ CzzÎñ0¢®4 p~\+üø0¹ÿq}ñ~}é +®@ê#^>«\×Ȳp‹Ç*, A_ÓðtÅ âqÙb1?&}=Ä2ãÒ]óð€ÆžoÑG¡PL.]Bª¢E3ý7z®Æn¸c<®žepNwd¶\ñú"¯kÑ;ïX¨‹ЀBgN}®²ûàóÃÌòhkrŸÀ¶Gâ{°l:&j‘ñ™û ^òÕPkNÉ«±LÖñü«DÙj‹+Y9‚dÌœòÖ„Ê—6<€ôVcŠ§‹Íš‘Ýþ³¥SÕsiÚÚ¤Ûò>vü[Âë^‚*žÝ½žVgªT=gêï@!»c)ƒ±FÀh…´1l-òZ±9±lH@±Ä˜¬_×m¦ŠæiwÖJ|¡ÔÆÉ’¹Æ¾x9›.šþÄ7oˆe!£cз¥Ý†B߬SÖûÄñ ¹eéx­Ì- lnœk +Ð"$©p@zŸÖÐGƒ›‚·^_fñžtDPiÂñøËɘ.yÖÆÐó†·ÅDã^!¡¥ 1âóÜ,óšªiÖc.â4£÷LÛ}cN6\ÈÛÐC•Å?ÐÖÔØ5÷Ü tbgipO ‹¹shÛtƒt{ J'uYÌ„ÕÑ’Z6è¬wßù/NÐÈy0¬Ö‚;g‹ÖZ0….R; +*Èí­´âT¸žfWÓ3Õ'7)ÔYß=á!`ƒSé‰7ˆv¤U¿È!~{£Ø1Çœj÷àºßŨžG ]¬ßg•,½[ W,{ukRÿÔj•Å‚èÒ<’…æp_íÖ©ÛRV·((þ22ߊvóÇÝl.ˆÏÜs/¬U¡¥&‚ko¾÷ñ@ÆÇÊ5V…jj¬a `N}ÕÆêŽáOúŠž&#÷¦ÀuÓÛW™{päc³ <4Éó“¼£Ò7J}GáæÁ†TË$äðÓ01Kp"¨?¶Qø¤ô4d¿x}Ks¯c* ìh÷§‘Îþ#XiuÁ7nêîØŸÕ©è|ÓD†3¶•ƒ´QŠÞTGøÐæE®Í¯mÂæ°!ÀbXÉ´2–·±R›?hÝÜö=m¸7ë6†ˆ¹o'“ðlø¥gàëè”ÎözÊ8‚lL >Å\¥*ÁŽéѾß1‰àÚ¶"NÄÈU¶¡yÞ"åe/½üõ´9ÆhÓ¶ñ3+ÞÁÊ+3–”RÚí4p±}µ^säwö&òGN^9×t§Îíd÷âË÷‡y|ܨ hͪ“m ÛøŠY‘*gSÆŒ÷lZ1S™çÛà®2j™çꕧp„Nݽ™_î¿9™åÚ‘±£üŒ$4W‚ÒÜkߤ¾Zì`•@BñãjO®õVa’tÂI¡„[Lì$U ;"”¿¹B)Üþ”ÿpª²ïèîÈé~Øî dxpv’K# AWE•\åuºïoŒwoϳˆ?‹]ÿyž½E™À·ÁÑRY£_ Ÿ4¢àÏ7©£•#eà«È¾oŽdÞh=g!…£0’H¿œ…lÖ)|ÿPíCð©ß£ÅOÄ…3íá±YQ¡›}ÜêëÏ +–ÙýÉvuöù‹ª¥'NP˜eÏ ±è,aè™nµždØ ±Ð dLÊ|tHo­œ„™—°Þ‰#ü]ËÕ2‰í8é”=lÎMK¾ü)Z­}Ù¼WÆYXõÞáŒK8~ÙÏ\F†='h¥‡;ùk/E7’r×y'4xözUZj +SèÇ´FÞ¦…ÛÏΚ13±©É'æztƒÞm~ ¹Hº&¶Ñ~ñÍhŸŠpu¢h^ Âc0xÆ(ë7\×[:‹¶q¢Íš-µj“’"z¾r§YJ÷-Ù6ÔïnnÔãõÍÌI·n ïS7ýö4¦¦ì¾•ôÈ@؈F9x&«s î|×`pu¡eF`{i~¶ÙƒË!$jmJt†œ/üaâ\èÎÅNià"û*±z˜Ãt3¬Gs€µ/Yn ~³1&¾âÆ0tYœVáqð(ê™w†—V†Ÿ÷ :·ÉóÇotxøí…*˜®ñ§õ‘á#Ms9½C¨9ðtIL³òXˆ×íŠçÝ€îWÞ«Ê.­’Âå݇Ӝ,7§©Ù7‚ÆQƒÄéèd`³Ú³“t÷¾k œM÷ûx}Pïïo\5Ö÷ôC§Ÿ®Z*ïÏkm Rã̽oÙ° ?1DêñeÄ'Ÿ Æ à6…©jb6LÒë¦Xšá|—?÷tKÒ:6™Ëühï;¬p€Gˆ*z µ-Ox—oÂܽš°¶çÈÝÔÆ Ñb„,I­£±½é¸NiÉõÇ{^èd–PL[‘îc±Ø™Q¯dZÃÙ&ËŽA¯î/Ú;!òùpÁBßÙsÝO‘ ΃3ײ³2¨%ÖuzøÄ[cé‘Ù§‰ÂïŠRfUÔgçúW ·­ºì;§Øø8ÍLŠ¨ék˜"­¢¬tµ2¹ešò K¬ Á¾9c $rMe©€€Ô˜6T¡Ð‘1­QçTè{O–ÅË]Ñ’f³ÕÓ9-©þR[0£Nk¾·ýµ„ ŽÏߨNïçÂ"?Gw~\“¬…XH”ã\lã¼Å_¡’”*GwQQBÁ9+§ªÁ¤Â¥à(-n›_Òx3“mì‚gU‘wµéíâߪv6ºÈ¯pÓ[óæ¢ I´2Ö6ß ‡×ÇëŸíIGûƒ—e<ªð1}xçªÀéž~ôá*@O€ô…¹É¶s—ê>‡Ú{#ØËz߈¹ç!žå<×Ó‹¦g=‘ÑGHö'²Ôe ȱóŽõµ“:…Ÿ‚ëR,q@õû´ùüqhŽN\VeÆdh„ɘB™Ám*QZ!cJeåMj…Ïòá#éå8;¡H‚W¤ÃÉ¡Ûσy¿È§éÑÉq¸ÂÉOÀ¦$*¼”Ö”¿þCŽ¡ß—(]b]uHíØ;¦Ý§ÇÉE‚þK±ÛH]ØX‘IïifËS2phz¾‚ßA‡œóÖ tÝب8ŒÙ„ljÏþqË» *Ø‘Eæ6óø8¥”JçÂ?Kî7ß¾õ)NÏT‰"¨VÔÏL>+ö€Ã¥˜Ìþ†e-mί`$T^ÅìE¢¶p&¤91fXhýüúQó¸kc\#BÐ×îû&“ª~ö¼þ,tí]ª•wÄ1y¸ÒÍÕ:… AuÌÇ× ß2ó=—ûéÂ0ƒzV7P¦©O>©¡‘*‰B4ô¼&3ÖàïD×—–™iWí¿U+L´œ±§f¿Z= BB£¡s 1ÛðþXÄòj€Y²÷¨isæ /æ +¾zT…¢gôOÿ’‹Óo0-šÎ०²Š˜hÈ›9ÉÈ%m-ÜC7‚µ$©OãzAp9%mëƒf 7ìÄîâºÞNÍíOKB¯Wˆà/°´e¡ìÔáo~f›]{ˆðEŠ˜*ƒûN·G®²ÎÏ«Eô[‡ðQðu1ªÑÃ(X²ÁZû¨Âx5¤ 6™œ¹¯$ß's.1߬)Ç^r‘au5nUG‘áŸÕÔ÷TÁzÀ½¦¬ÜÌ léLd i\”aÐZj(ô ¬õ\œñ,ôS–W2ƒo³‡CÜ`e­æí㦃F$êuÆz{†ÂÎK!K#$ +bÉbðúuÙ9ðeÞWsS†ÚINñ­E$ŒcD3>ä:ÝÔ%žÐçIr<Û½;åµV}$1â°ð ô£õmõ“¶)L£BòùP-PîÀ™ÑD|=ÜF—dã;õ…R^j ºßsÒcþRÖ'šîϳH¥¹¼+jìF+ò˜ªB~ÈCgÙ5ûë €UÓ(6û˜Ý#̼vÀ£Äòq¥þ…äž“ZrtjŠoe|‚+ gÈb ÇXxÞÈÍGŸÆÜ/bøc§èüv+ø²òkbˆ BFÛ;l'a¡|E]éü×6téC¿×0q‚M™±I0êÇ`ÇsZ+£.ÌgŠÊ)ùcs³½-ãVé¨Ý³·††²¼&D̘ô”@¶Ý”ï³Oœ öø]¥ÿ]ƒÒ˜,±Î +q œp¨FÿØ°ºyóë+45Ä â$½IWªÛo6sµPW‚Rýyª Ùéé8Mâ-lvrΨ$–³ÔÒ+ìLå×tåý‰c8¥nHÂÙ¼@Ò+iÚèÜHÔ‹¤³!«¸Çqz { ­Æ{¤lï +Çp\=Nü¬4·· +d;uÌ’‘ÜsÛ„÷_]e pxßÁÀ: Ïhâî|k±·¾ö'nTdÇ2å2fu·0¼e}XÇc*IÃoô}xFe6;acÑÈîXúúË¥áær,–êœh¤/º9;`©®GÅ–° ,ÓH>%Oà"û|?éJ3iὓQ!Efb«èDCõñd±Mðhˆ–Xµæϸ­6ô#ñ†l»È…±ûsLóæßgél;µñÌ#% +‘¼GøCAÌÑð}¾€¶6Ç¢³V»þ\ƒ diKB´«ÙQïè.§~Þ‚´ÈÌ=ìäm’yS$ý-Ñ¥ªŽ¹P‚´)keÅÓnM¡Gã¶Ëu·5%¬_ØEçMŠKÒcƒ†Œ8 î5€Ã|5wìóµ Ô"öů£„²3ÇŸ³’œVÉ÷ + žóø.Ѩ\éd¥(š˜>¯–LãPÚ  Ôš3,¿Ô16še¬»Û²˜BG»OåÜÏænPƵW‚®eoÁP×½'”@çßÒ KLýº-/ÞJ[ýŒxw]öG8förˆVƒÉsvÄþh;Ìšé£HÛFÏæ8w&_a†¶j¡ã÷q´r©Ý}~9ÃQ‡³¹ÃñQËöš‚¸¸ÅÒRŸv7Ý/샃ð+B­gN2ãâjÒz ÂE‡`õfQ •8{ÆÁ9û»¨½qN5mc¯ gÀ<Åj½`ž@.vS;눂DÊknDÔš™˜±ºOZÖµÜÑ–HJ”ää&¶[óX= +<ÊîòÈYŸ­ØìZ Ê£÷íé™ùÈTxÇSêhD¯Óe{Ð’ÖMÂÒé*’­D#ôTtهͼÔ<~WêšÏ¯ ,Äѵ—úHLÆücœcyµ¼‡ÅÒîÇ<Ï EÇvž¹tú“H;:±[æ¥@B³CoјI3åÕŽ+´s«©Æ?™À“0”VðÍíÉ ¾¹Ùì ʃ¼ãAœ'7¶ÆÁ&¢GL6öÝ¥ +Õ.¹YO¬êªœ©Û×™¥ o;åE0 +P|¯î ¾§ÐIëg°¥ªÔoKýd/&úÅÌgëVÕ”ÈýÝž¯Û#tƒ#ÖÓ^3Õ%Ns“€M”’0¨éa|Ê|ɼ}FŽ%x\Ëg¹bÓõ=¼í"…sUÏâ9̯ԫ{1K¼·ÉfU¡Ï7 +ˆçŒ¼™¬ï›»E|ÜÌÐðXuãý–üÂ˨µÎ¯ˆr ‰¯ûV™ÆZùHmQE,úïïYü(³»ŽáÚš&„—§Æ…óøtk±ò•Î¢AwÅȘ)ãæ^ú¢X ©EŽO™æê«ï_•Ü”p8ý°³'W#§ñ~žõœÐÙø5;<’ŠÚæ_)W›/’É\x)wüˆ5Ú²w9Öˆ.Ѫ#yÛ2gF¼_úncóAºíç)F,ó“®ûM~e9û°Nsû£f쓵5ª:PK÷ƒµTÐ9oYö €ª}$:tñ²ld$W%‘ȳWCxHáÃEO89!×hvß3Ó(¦#gŸåÞ[Q€Ír‚Ù†4ÇcððÎ÷­ ¸ÕŠ‰„ƒ>zLár—õÜ[ùíVU§“Ž-J ×ü¢õ¾‰ÍžÞ¦Ù×(ÄmÊÚ&®ÂÝ3È£žÉÓ#â »þð%²ê&Ý7ê56qã„öcI$¶Öu ©%ŸÛ¾µÕËVP¼ Õ°ãé™ØbÕgK/4 þ} iÅ0|bª(çÝX#Ïï,ø;ˆxšcRÎ8Lµj!î »óúV¥@L&K!‰]°UÄÃûщ| ævYlNæ¼aš&¤hDA—ÚýmhsäÙc€¤³W"â{Þ‰569L í½×Ë~´œ‡ͤÆ^¡˜ Ê4eU³£´EÈ“&phŒÏîù?è™X}}¥„Ù8Ãm¿b;†±ë ×ÝIÀ»[t<Ž‰à„ºêF‡ÄÜ6GbftwþžT7$–äomw|[$EV¸M—g[úyœ‘é±øí³Öƒ%Õ‚CIøÓK¥]L }²Ëp¥pCg>ƒÿ»ênøÄê=â]¤põ‚j§Çýܨ˜öÏᲨ>¦ÙU·n¤'ð«¤á{ørùuU´…¿ƒ_4,U†°;~†¼õÑlþnî/®ÂßñX¬¶úU%~¤Œå½Þ,/0БwŽQ{Ö:ÈÁ× ª•ëf\“ï0˜ÄÜœ$e³RÔÇè<[ò X•Ž+ÈÀ'Ûæ]õÛû–ªiX{sV-#ð¯ò 5²´Ã+›fø*¡O‰œ~EÌkɲˆÒ¬Ã‰õ£KëUb실]ôšjù-å*bA¥ù±‚iêk$-Vˆçû G"]Î[I¥7Ö5ꧮq[ßÞ­+ÍðöØ/º÷ðÕ‚úðÓ÷ì2*Hê3Œ„Ž‡Ñ|_ÞŒDªrwúi¡."§Öîª ÎÝ/`8qÄ? +ÙòsøeìÕÙÂ1Y¤tYv~ +³L7,òH +É_AWš…*QÙk4‹†ÊSgïë}“æý ÝH>•b5?þ‘ÄœbÇ‘þ[½²%?QÃÔu­2NѼ5¯|F„=ktåÂnïìÈòæ‹ô'†<³Ç‡_Æn|Vœ “mpéU÷YX ­|NHô¥kÊ r O6ágÌf¶ØlhÈb‰Šµ°DŨx`Þzù¸³/;çöyjiIšuRç®3·žÝAZøÌ*îÇý±@>Ö,cIß’íÏÈ}-åEçJ<¯µp,IÈ[\puÏ©^ÌzüQ\®‹6m¥ÈˆgðÜÍ/|gÔY¥¿×XCõɪy9m˜°·r!>Z. +SS˜K" +Ï~~C®x®'ñ0yÉ#ñÚºƒ.UŠq/öÑŸ˜*Îö¥ýµ4 Çï`àIm­Š´¦Ç”Ní.zßF6ù‰‘¡Dž³¢,t°Í(¸™8é±%iXK{Ëlò\‘Vñ}gx7wÏbðb¬½‰jÁ½`û'üNf ÌB Ì´Ð¯1fBÈŒ+%¹7¾CäKvÇÑŽŠ¨'¶,³jvZÛÚ•¢lD¤È½Å‚…U? /rªìuGш¤59+òúøF´'Éûu£÷ÁO^C.¶ºó×?D¡ú +Ë!«O$!*_—‘} qufÖä­2¿ÐAQ”¤ÂâWH,‘Z8gm­ÈÞ¨gA‘¸¶vaõÈ”YÖ¹›‘k ( +á„%F<5Ÿ¼K»ç´Åö Û3Ó΄ÕÁŠÂ~çD7/âšÅ Œˆ¼êÇ™©E½ŽîûFí3vŽ,€Pô½4zù„Pp´_-¯³÷ç Äš0XR€©A÷?Jf¾•’{ˆÏ”4ÚRØlØöI¼¿®öõ~‚É…PĦxIÝâ/B²Bü¢=¿A'öö`£H>Hßí—¶œPxáü¡ZòñLQöLVg*tç1KÆ„ºdQÁåÚ)š¸|"Í·Ä´S‘¢ì8ûgþásóÍlðAÌCÛª¤^¬IêÙ¨·m‚åi—nqúĦj¶A«"¼±ç¼{H„#þS ½ÁêSG±L8úkO{dîf°©»ìOǽÔ/˜æ•wƒðáÇ`œÉµ'j^ëåé8Sx‡± +Ôù´6Š8ä­ÔÔs‡ÎCý—óÓ:2±èë5/•l†%†ÖhCÓ˜]¨w'hX6Í— ¹Sº†U¬Òú|“LAÒÁcçpÏ:i³ˆc¤ÖûúÆIX—m¥ù|(Ÿ:²zS¶ÃÁ˜¦ß–ãòßÆîÖjb-­ +à §—Û"ÛX›?ÕSDâJªÌGú¬Ú‘o°Ùð¤®÷ÐȳžñÏKv×F$-ã`÷5=¾¿n¬ûë_I#0ð­7Êî]˾թ¸â¦û­]“áæîüêOuÍÒÈŽF~‡B g$dýý…i7u…±Ë\¬@ý iN~—×OÌÝ‹[ÆÌÁ±À]D /=]¯zñòÐÅas½¤ÃZ3×—Ú=±'.K ò÷·Œe  Âi)»Ýh€éÓ/÷:Ä•óX¸’v¸IP®Î8Ý#oñÊjN%d½'8D£V=tàl¡5„4go±‰AèKoN!ä.˜·6 ÷8b¿Ut?ãiÛCœ¨ô÷·Ø1ˆ¾ØÞãQÄ„_ºûH+RÚ>¤x3ýà‚ý7°™\ ¡Ð—lšj(áŒ]UÈ£ŒdbÏ2GT/ö±t=À}üw`Q[ésøo/körë—#¶¦Çî[ý€D> +a-‹PšêÊi^(5aò÷Þ8œÆ—†rmëÜ0Û™//UªŸÑbVPp©ûÉ`i.‰ –§Á’¤Þ¡áû ÇϺ»ijì‘"f[ºtköÁŠ”È|^g†Í„ZÏš¥2ÝDÜyÓ—À>ü¶6•thâàoì\Á +z¤ûŠâuÐyçøé›1irÝžã‘é£äX’Eßa›×ˆÕÇ“;˜/¼’>ì[ö±™³FcFÒªgãö‚á‹©G +oL1MFr-ÍŒ™a=áÖVVFÎwÎ¥Xߪâs¿Ü”<¤ Ómpö{g~ű³ƒ2Ê ÐˆB),ý±ÓÞ¨£Ä°íó:šà¤x1ÍžÅMÂ6ÍQô² Ø©(‰¡¿Þ‡û¾ô0‚ZÜêä]µ.0‰íÏô "ì° è+kèt‚õŸ˜»4·7Ì%¼‰«ÐœN.êm¬gÂݶ@9úl›ÞÛrH!.¸]¢¤QŒ±Ù4ëgŠ{seªo†ŽCK?k…ù7qC+¤ ©o±|ŠåZ­HWiý9ó‘qn¡Í½2$¹G-LEøbµ˜öbo…ç m»7oÕ–7æWÀG»JáoÔbÐ5z^oDB°w\<à /r¸Š\רrRjþBõâÿÂèù!&†Žh„Ž6‹$˜WóˆB-3ã½ä—K`­¼ò‡‰”zó°™ò‹N`zd åÇB™£+sÕýN<‹-8‡òŽ0;ë)Eµ&Ì.P¹$ݾM€ñ’@ݸ¦/Ã2HœQ…„IJEzïe‚q™ŸÑzÆ-tàQÍÔ¤rÆ‚}ô˜8kí±ÊäXë‚ël²iÀDâñJ”FR‡AÏŽ-H›2²ãXÒç+Ý"ÃðûÍ Óšÿ+;Wó¸_G±.OÒxè"ƒ%u°¯“¿>Wû^ï.7 åòƒ  ž0ôuS¼2 ©'w²áÁ™ãi¨šFNù6ýUv“-«>] xñÕ—*æ®çÅÔv‘?‡Ýâ–Ü©.M +0·dæ´ëžÿÇTcz¡JÍÜæŒ.5aö$¿¥Ê­°D ÜE…q3„f›ÊœÎ.lªdX±îÚûp}˜•7M“Èœ ÀÓªkQ4N5Åç­-…@²!G©¢6š VœiˆR7\ÐMj„dcäî€doû4~<”Òe6äm?Ð0I×€ŒÔK›ÛS£ò£Ê%Šv¥Õï^+„¬Æ³ÒÛø!&à1:¥Çã‚'„D=ìà«&€©IãY ¯€äÂWƺ¥„RÒŠHw²ˆsë.üÙ­gäè÷mïyoµ©ltxebmH÷fïêïo&Hì*âj]¦Î¾kÒrX›0 — ó=ø^‡,›.Âõ˜/Z—[’áXýõ~™?4ÒdÈÅ7€äñq ´¤ª^JÙ[K™†OøDÊW÷ãºò"îf/’’u.3éªZšœ˜­9µÀµ”…”Û±†m ùlË—‡Ï³'´4/Éu×µF±‹gGŽ‚Ç;`Žøç:í·úGj¹ÃÊH‡Íi¤Î@É÷²ÇÖiFèÅžoºÃ‹… õXWAúŒF˜g =çÇ$¥¶¸i\üh¸Ôè¢ë9ÃËñüw¹UÇüv"¢îjÕiÐS+4ã%⎩ñaoä{Zg=!$Î3åõ1'Éê\ªWä¼sÖ†Ílâ4,N9Ã4¼½þÄ‚;w ½'U‡z~”Š¡+É6ÉÎù¸©õ—õ€ðËÂT‡4çjôA¢ÞŒ Ó[‰ôïqWűd‰¶ÛŸ€¢Kªî1šÒÉ|Ö´øÐÉøKœ-`@XƲœ»Þj”§§¡øð©Öµ„ËÍñšüÀ¨ɯ¡žßÒ #ZVöÏeÁr²lã[cѽ·aײ‡xþѿnÊí"p¯½6Ö8wK +†‚™!Y5ª¬h›Âø IŸsëâÏç ùÕAu8᱇vQøÆt“M$N×Óå“y'^‘qN²ñÐEW æáxº„˜ûA;W7·H ”ãWNª—g=p®Ä"n¯·4š©øZKGœòÍ£~O‡ž¯ Žù¦Ú&þ¼óØb½êÇý3ËÌ@1"†r=qoÃEó”ä×™v0™ºp½³³Ë„ƒ"´Å¡‚’¶ÉG$QC¹„ª»×âuŒâ‘ÛÁ.ÏkYMÍ¡ÙÄó ¼·õç¡ÝF´¸6Óod˜*º–'&a[TF˜µuOiÂ/k1ÎÌ#Ù'³áõ(ñ}:&ÌVS1Ho8Ò`þ0÷÷_"UUu¸!‚ãÝpwI¿glÝËîhaÓ¹£Θq¢â$8²»¢@¯oeÑÿí©IIkŒÒ…—¬©Qþ¥„›VÅØ\ãÅ• +Ü`¹}ÊWÆÖý&_cWs£åÔlÓ¿› +.«þvÐŽ–%u‰ ¯¤’¨]5H4Øe"›ƒhQ‰‰ôM“ªRM-D>í¡)rüˆ(Ëê­©è¥ÔYÇ9ÓQHŽÝ\(] +Öð5,(x J)ÜÀÞÁg0ý{wýçêŒx” +Ô&‘#àfîÉ×kBq‚ÂõÅ{à1æˆè#žw­KH×\’Ëœ!w[‰‹Ë)ƒ?q[ø,YçÔYÿª²‡¶Ë•:Žè“tG½­3èÔ* þmèÊžÜ`m +(¯-üü2ÉòFM:ãM¨sv¶Ä÷Эv"¥}kædJî +×cºŸËã+DoÇ–ãÉ­)ýe¯¶ôŒã¢—WÖ™eBdeìºf|íö˜-Œ‹Zw4Vçvž&Ê=®ýÂ¥H‡,d|Làâ3N‹'¹²,šK°#L„Ô]øm³)n-@Ü´¬N&…¬$ÿÈçÃíKðt|]Øl‡¢ËJ>h– +’9„©²Í¦i=ÿ¨nuþò©­'x¾N»˜4Õ07<±–¹ûIíÓÏÕ=Î)iÇN{à$dQñãTË0¿§h¹kÝçµùÚÒ9äóÌèÍï ¢ËG¢ $éðf+vHÀÑ:ÓÝ&îûAoР`ž®³DGO?Ìd¨Î3ìŒ+Â̪Y¢ì'Y"-¨öíG3qŸZê…[|iøb£HÇß·¿lè t#æh'¯¶ßk‘¿ +ÎòÑÁÌûøjTL, +gRH`\Âê‡%Aþ‚¸ÿ•LTa†ø¤6T:ùQè^·.¸Ê´DYAž£µ$À<ô{ÃiçŠKl¿XæŠÔÄ%ã»<ºr£²‰ÉÇI§ßðÒ÷®ó¥©XX;|¨‰êbuÊ X‡jÂÕX£Ô†ØÒïI7Ù¡™ G;³*‡Òe÷ŽnInî‚(¿æ2ÞÅ¡æbE§4!0{šÕ?ÞñŠ”’nô0g™²ä}»O4,ä]Èhö3g"l˜\¡Ì±Óp•Í»6²Z“šÿêŠ/¦¶ƒûeÝ$³®"tÕ¤È:ôƒòõ ‰›îxÿœŒ¥?Àh[MND.ÇðL7|SɶtÑð„ö&øyDZÌû*Gmpr8\UÛ¬gTÀ­X +h†“Ì]õ5ˆ%?»â'º˜M¾×ž/•[C2°‹ð}j…Ž.ˆ&•µ7ˆˆÁõÖ ÿ‰r¸‰*½Æ¡rsC¥‡Áà¼qãl§ž_€Ôv¿vwŒSX~K™Ê” Ç›¸´5"_¢»åzW‰8LB‡ôÚÄš+H*Ƃ߯@K„/ë·Á)¹²%Í%]Üå–=È«V,è ­{«RW‚:ik>•HŸSTÇÿÉ%6vô¾ö\áñ-R•@BêÔ“fÊø²øÕUrÇ–÷ëSv¾] õáåG:ƉÐì%*ípÑòÎwþêzd¾,¹~ÆVÝIý"’ù!k„­ð‹•ýžõ¾6ôÁSÖQ¥î‡ÍÌi¬Ì2×VþöŽÇ,]?§ðÒùûá>=,+ÒåE!ô#?6…lª¾¹*ƒšöß.‹+þN¹óücîs=A Ž$—8ªËtÉhͲÁ%Mìï[rï?½>5˜‚sÁ©Z™â|ÆgÞϳë6 gê]`çwŸ‰ +ÖäJ¶$÷A­B:{~PŒ­|ˆÊ ©¸/N˜¼wéàý‰ØaÊ9ÕÒ”®òM_u*u~0Ã׊éào‰èX0Êr‡ÖÁÙqh[ýl½®ØÑîáÃe7æMà€;æ,—"íFóTIû ¹ ²ÐŽ÷_â05#¸.cœY‰]j˜ª:Ç¿ùö:Qqæ!å½¾iÀÁÈéo‹¡¾{£6jÆÑõ({öû^Á èéWÝ{ƒHÈ%ŒéK!zþox   µ˜˜¦°ÖûˆÄll¡Y:Ðÿ3ìvz6G0†Ç&QÚ äŠ«‚n‚}uãaI#߃y>g—/¨`.n+/­Ð^ q›‰t*+ˆâõa+uF¼ý} ˜Ž¥ï>à£jŽÄ˜;â¤ÏLUáÀ˜ÍPÒ¬ü“žÖkm",Á(\~éGP»Oªt[‚ÜŽŽ6nxf³lTÆíØH'ºSÍõw<²qs)‘‘Ç~*Ún¥ ÑBëRËÏ++¥È›!®)™øÄ•™þîêñþœCåaIyÃγ<–äxßsG²)¬•¢×®8zÅJäó`ãn©ÌsÌ™æEHœX-zoè=O! å™B?Êóíwö»µŒ›ô7CMûÕöî‚Œ“˜:¨’P'+Ð'¨MÖí éżAJNQbÆu:Vw^Ð(*mké«K櫬Ù)7,"[›cÓXåºÉªÌq…‡‘„gÂmb(GXT ,ùÅbo©ðp²©ï÷ÖnròΡUm° Cþ“væ$Põ`Ò匀V–cÀþu6®…ùqc†¬ó:†OtÎì•nôwØÒPÄv©*û&<û'½v»AhEñÜêŒ ‘—Á&!x^øí(nÜÂæ¥=YŸÓ“pì‚Eú–qEæØØíéÎVP¢7“Õ¹ +†»·=z/¢ÇCï¥ä‡`RðÏ!¤Ù·)žíú!Œ·zÍ áí;LZ|FÕGì%«¯ˆÅÖ¤H6}+8ã¹ðú¸°ÐÀÑ/Žë)díˆz°W‚úXƒX¶¾m«Ø½•„»ù5gR›žF¹{‚$³*ú)u\=(Ñ-‚"Ð…÷±,â¢|]ǹý?9¿YÐOØ[L‹&ãÀŸrS*AØf­ši +t)ÌXN9¥D±z¤‰-D0Œ8­àª;ÁEÎ+p“ùhJ½:–Éîföâ}©PýSücd?àó <ÌÈ“|Šˆîç }®rw‚RÕ:Í$å·=„~mÉ]]˜RòöÖ„½®íX((—€¶Ä?Éž¸‹e»¿èœ¬ÛXÄ`]¹#ƒÝ’X—ÕoæQg è¿ÏU„»7mˆ¥ä\’sõ÷‘Œ¢MÊw5Yl”ÓaM)œÂ]Gƒo\_¥BW¢É–Œ3 +ܯ*˜Œù¢V}ÒD¦ÿôð£ÎÈ +}ˆ2àq=G/¦8õ1ÝüÍ/]Z?ó{P>yêU•œµú}éÇ2&@žÊå6Þä¡þ;TÆ +Ý‚Æo9ÎÖï[f|t7ñC[,#ѼR'Ry\³¥»VXÀƒ±AA+w +©õŠÊ§üyž+¾û™’i†2£]Þá­•\÷¤Mçó:µš•wbÕ‘…Ùˆ×hg¢Iµ#ŒºÛà@ïuJ*³É<¸S!ÙÖdNPÂD )­×cÅkø2æòò›b«ë#¸Î•µN² û›T“Z#¿FýŒSÄ̦ۻéz,³Ã‹Å¦ŠGªÖ\ÀV¦(Z‰šQ vQÖK>T«:œSn +JÎtŒ.a½AöB¿×n 8b¦”w»VŽn$øÍé)4Üú¤÷VçËÌŒµµèN‰R£ëÐŪ—Ãÿ×>Y¶5( QD‰!%ÝHîfà¨Ñ9º‘n i’"]Ò-Ý1ºKÝݵ÷þ‡÷Û}îùçÃyžã•”4|œ"ïñ`Ûý]_€ßÿ¼Ý²í\£$«:ê¯{¶F†Æ»lìÏ3¢?ÑL$G@Öóå×vmôãŠ#Žª×°tή4ËFIñê\é±¹†òã–ÊcLÏBÙðn¶²e™i¤ÿs;<¶ ¼ÿñÏ7JŸ¨ie/þ5÷“FàEZUuç!í¯îðœJMþ•³ŽôÓ }Ëß–~¸ +Âòé€z{JE‰FªM Û„u–æG0i ž³ÍÀ†^µYkúzþ'ôÍòH¬n“È([ÒKFR}ÿ^÷ôdk +±5b$ßì}Cd%#vﱓ*š°ßÉ ‘ú°»­¥8hñÀÜ_Œ»Ð7¥U½2f +b›oÒm÷ãÅY…½jãnQŒ˜fýÊm½­ªm&*þ8”Èç1|ñ˜a¬~– F‘«•¢ûÎòXQ;( _ÆSI0ü+p˜ý&á¸$BF +ý1ì_v#ZâÍ,µgªìVØ +*‹š@i‰úû¿ž8ëäCî3luRŽn£ÒsbX‰É ýÚNã0Lb£?yrK—Søƒ=ÕˆáÜá@Æ žÀlþ ¦Ã<˜'•AÅ87gñU˜ +Üxäø›Š•XGŠyº'üá9vµ,Õ½OÓà¬KÏýØIC`­” ¿¸9Âò§é¸ˆ ßcZ”Âh.RÕŒI8¬_$òfIKmÌXró–€àÇêŸ%Ŭg”ÆÂüˆßY'ºVR, ¨B~ ÐÔAQäϲ¯u£s¢€Ý_˜Œ\@øt-ò©Ÿ’>ö‡Q÷FÉÎUŽ«l$Ô.ËW(¦8*³Ÿ{>B7@ -7쑘ôy™Ù7º!„³¶ QèÌL}*Ÿ$‚WVÉÉ®š±Èñ×´//2ZA$¼§¥ªb;>~T6EÕ<Õ¿¿Vj3ps[‡Ú[ë #.JìñåY¯ª0ûì©'™„±ŸµQÖ8}Q¥ÞÒš½.HÒý¤ñ‘õ$=¨â¯oñöaZ]‹#6ž/¿¦Ðô¹e¸ÞZ‹ÇM{ªh= Hp¿œ¦-Õôš£åežÂúz‚€ÛÆ«ì(Onû÷söQY²æ‰Ï&¡I(Ja]U›-fø´Û[ˆÿÞóݦ6vº%š.[Íá§KpyJÖˆàêh2nösjJ,©VŽ&EͯU¨•x9øW+0éOžÜX‰3„\´å‚]:aFïz”* ^Ô¿Žààˆ¥A +‚¾¡ÉzŒ:s[­+ž:[´‚r 7À«_ó熈ÑFÂ2Õ:¨Ù˜-Aè +œÆâO­Œ,Eß÷;XM«âU†æüìeçÎ&¾¸cë2“.D£T«h8&Ëe7nV"ÎCøpÁ¨Ö# }&_ot-ç2ÃæXL¦ºŠðï"’‚Áf&ѭ탔w¤éʼŽE9Ãê¶Y|t\dà=_©Ÿiµª¯9ÅÝU5½<}âoCʬe±É·mQJ_”–õx-ºDïä»3¦Ÿëï"‚_ +{8þFÑÇæ–éì é–sEcø ôc/ ¥Xne­£ß Ip’XÌ,X§x©oÞC§C7}yñ8㟑KÓ•F<Ø—¶cÚùc§>É÷"ÊåæÔYxVì#³í³9y«bTjýé‰NÜáù„…ªjŽ\«WÍX!Ì[Ê뺧b'ÞŒÆ)<$1ôÊÚ[,ৠƒ@ŽWÃc3/—°WnY"¬Æ4áé[_Šüå–#xÎöf3I¹[V¦;ñ²è2f’a_ÏãX;q)ö&Öö4FØ…È÷Ÿ ˆMóK¶Ñõ‡ºé€‚œ»&nˆ°¤ý‹ëžÜ[}·R½™Ú¾Nò +=X¤9ƒ:Ø•ñÒ¤áiÁáß”×ëù pj2ã¬#C÷€ù=  Ë#; .§Yº°xB±}!ÝA®í×›< ûFÔ9OµX¥|½D;-^Èê-Èñ(õ8¶ºÞsžj‘ÿû_„1Ìo^}$å©ZR‚„ÒE! +†*Nñ(ßc“À“ +ÎQÓp/6è~E”ª:Ý?ªúÚ Oæ˜%3=/4X ýÄÐuƒä–ŠžØ¨ûáá]°ÄDóÏí¼ G‹Æ˜; sL‘yø‹laÚTKcøþÙÒ5Ìg+Ÿû{Dü±Í9­M9îŒu.ÍÁGBLK¬O%¹ŒÔLM…•“–`Ov’T EíûÐÖ[ï21Êsd©Jéšp•˜éø#ÃYÝEö‰¨õrnâ芻‰…ë°¬&âè݃é3N^Árÿœð•ó+fd-9¸U0Ód‘ ´U¥A}ù®º"äöÔÝ© +ê™ã2ú»‚îY$óµÉ•­ßª2^IÑPYm3ïÜÚ×Juý¼=ÕùÌ~9Äÿ 2©”pmPkDÉ Ç¥)DcX¨Ù콘ûk*+ÇMCÆ{Ù´~­Íµ)²è5¿¯ÅL|yÿ1ª5u‡Êëñ÷Òc9„ÍrU ¶óBDøò3TyÈ嘙 SzH1ß+`Îð¶+§`½°W5Ó㎎²ÁÑÃiÁ™,÷ò}cýö3!§ïÒƒŒ‘Pu aÛ›”Ë tòÍ|T\ÅL,pÈBHðì9çÑô)8H-úäjj*ê=êOŽ<™â:õY9­ªÓ=iƒ‚h¾!‡¶ïh­ðç¼×îöÎWc?|8na|qží+¬A}~é{âV+gê7L7,ðt>ÓSÉr¢$˜@ZýaQ»²L=4›Eb ”¶¼ú¨•ËÅ›å/Dj {h>UVÇêúÓ·×!JÞ£ëp‚FL¦DE8"¸FKËyŠRŠàïQ¶ÖÿcFö,nc$õCèÛn^ºËø}ÃÞ‰ÔÕÃìm{ebèÅß5|:¼ê6ÙÑÑçd®‡ÄŽæùƆ ^Ý+÷/Ø:!\Ø°meCkn+? äm –ùK'S| j&¹qýÉÆJ²¤µúže•xz2ÙÌBwÛÝ:‘C¤·¸:¥½`RÛˆë1ïN^‹r+Ú©:/cm1+Wã¤àûðó·ê÷$â{‘™à‰¾m©¡¯ÈlXCšyÆïÓ»,P°&Ä•–¤–6Aí³è¼XË4ì¢Ljn¢ ér:S#7v°£˜¬dd÷—“dZ«¼rQK¨ý>¯õ®lH}™‰Óüzôßa­ªëµjÈî`ê†÷Vš¬ŠÖôžÕŽopõÄh€— âc—mNá»’E…¡/—¯ñ­(À»¾£ÐgñKÂ¥K_}dÀç²çšøWNy´bJºœñýÎ^y{D¹¿ áöø ȯ×Íó WV?S¢6y‚ D\ë †µÆ†ûÿ +Œ†<\a/r¼ˆvÈxµfíÉCvP€ÕóuóföÈy§Åm4ÍÛÆajùlW¤JÕ4pñûZ¢Aÿ6Ñ®–B][¢µš×´B©®¦Ö{?q£Q4¢«]*ê f1 ¬Œ*w5#Ò”HðŠ¼ª¡–©ÖËCšŒñÌ®¾”ëÓj¯¼Ã'gE¸FŽ:í·²ˆ¯%u0Aü¼$°aXÂ/ ÷ߵƪÂú¬(ß™uklê..Úá¨etV‡rÓ*$ß;>wYp®Ûr¡£îdʈ†éñÇVéÃhKñ«¸óWCÞ.ïò$.¢oÂÞQ#»Å¹* q¦ûÀ6¸JÔ àÇæOŒù[ôÏQ7óeø^ðÏa:iÄçºb¢&ÙgAÑV£ç\tj†yçר™<£È„ì3tçV(ôßÌh©×OѬEf›½ éÝK•X?`Ãþ7ØokÓÈh_y,Ü÷í½?á¬{®Mpóßù‚z¯–ž§ûëeò eÌtÞøa‚s{ú(5J<iKfÙý6ZilX'Å¢ã6ÉñÃëÓÛ)'´Y¬¼ó4a ³Ô4ǸÔ;ÁñUÁÑu]h‡ÎlŽÑJqz$KЪ@ÊÛ3§Üo%ù˜CS÷.õ„ŠuáDâ°YkÊ5N-¸àî )¦uóñ×RÒŽ»—,â,Öò‘ù;²eõ'h=ö:©aCDcjÏç¾µg"ÁÌû'…@ä¡e;éL7FK@»,ƒýëdE’¹¿eÊu]þ¦&ãñ*çXê R\×|ç>¤}Ð8ûÅò´†ïZúI–-ÄŽwp­íô |Mª›…ÞTõèË¥{E-5uyЪ(Cˆ­ÞF‡ÒogçüÚ3‚Æ?Sh`Õæ²2­£=‚II¥ñ“ÆñÎhÆz[ùP.ÍgN#w£é_á£ãäbJýè ¦3eçø1Î?­úw–û’ ë zT4{… BfA]qpeóD=>ö$”z‹Ñ”H"s›eª+è–ÆŽµz lSvöñ©…ï–YöWñǘÛFÆÉð& ëB¼´söÓn>³•Æ¨»VjÔŒw¥¿·x¬ I’ERH· |MÄãzÅsz{o ß–ž›ŒD3e'lÁb=âßç95K7ÁœÃ'ç k+'ÂæxAS5#]¡~ Ú§¾wÅäoV¬1¿AÃÍÝ4šïOFG,j‹`Ý8ðE¡4™üøìi–¢L-C^+ÔÜF«Uݱǭ„ŽŠ(û89Aû[¡÷Ó­f)­Æa|é]l©ì™ùÀ`§ª¶p«B8Lúño@}þÐ’F³’Ùa8 +åUÔwUMõ»gÕ"&ÛQ=Q¿Á²p,æŽ ðrÎfœÝ‡Qã³éîtÜt6.§>ôÙêð97›“¡ÞnW‡•‚ø«Ñ¿}‹!®N‡éi…@lã +C•Á&ûA×"4ÂÌ]iÅ Î|,›ž(mÍ…pêÖ.‰ý³oRŽÕ] ¸kŽ¬¢PÖ¡ZÛZŒŽT2Ê©‚pC¯–dô.Rn®f™7£žØærðk®–-!OõŽž1t¿9~‚ó–‰æ·q¼mxYæó”9gK’}ÃÜÕè×å HéÏAf™\pCÊˬM‚._óBâÚjq À¶]qL÷‡ Âa¯¡n—ˆ›´¢('â¥&Cv­pñf–¿‡OFÙ2ö +# ð:øF(‰¥YäsäLèÆùxÂJßÓ%ÌgæÂîˆñe:‡¯#0®ÿëÊ»3¯‡óíLM¤\“wŒgßRkHäŽÅ_KØwÓªÂìni–ŠØ± ¨wŠlNþj sßÑ8v> endobj -893 0 obj << +898 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /EUFTTG+URWPalladioL-Ital +/FontName /LHZNYR+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 /FontBBox [-170 -305 1010 941] /Flags 4 /CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) -/FontFile 894 0 R +/FontFile 899 0 R >> endobj -2133 0 obj +2155 0 obj [528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] endobj -798 0 obj << +802 0 obj << /Length1 1630 /Length2 15892 /Length3 532 @@ -10307,7 +10472,7 @@ stream xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå  ùËAKOÏð_–\¦^ÿütYÚ¨þ>¸mí€ö®)þŸÕ€@€«`²Ä””ud¥4RŠ) =ÐÙÄ ìfj 2ȃ̀ö.@Z€…ƒ3Àöß €™ƒ½9蟭¹0ýåq˜\f ¿a@O3 ã?Àèlrqùû ¹,Mì]ÿöÀÕ²7³u3ÿ§€¿v ‡äèìð×Ãî/ö—LÙÁÅÕÅÌäè ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.W §ë?¹Ls‹£­‰×ßÜÉAÿ*ÃÍdoù_0œ–&Îæ¶@—¿4¹ÿéÎíð¿íÞÄÑÑÖë_ÑÿòúÏ@®.@[ &V¶¿9Í\ÿæ¶Ù#0ÿ3*2öV–ÛÍÝÿs:ÿ«A4ÿÌ íß"LÌìm½æ@ fE׿)4ÿo*3ýωü? ñÿˆÀÿ#òþÿ÷¿kô¿âÿ¿çù¿SKºÙÚ*šØÿø; øç’±ÿ?¼Mì@¶^ÿ7ÿÿî©üw‘ÿWW“¿­±·ü+ãW&–¯ÿ@.’ O ¹2ÈÕÌ -`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYI\F[R”þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï +`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYD\MJV‰þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï ™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖµ?ªª…¹{G.ž'Þ½µ$5õü^oDÌÒ’j8Á¬R/ë‰yÝ࣑<Ì`½^ úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ ¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ @@ -10369,83 +10534,88 @@ MI ¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£ cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …x;³°çlqf—š “d79˜R€2õ¨)iµ†–Gö»€ê&‚—ÜÞ¨CšùŸeVò]ÏÓ~„ð¡T}îY¸dë`XÕìéÎ<òe JË»1ÒXê¤QáÀ#÷gX¹;«ÜÉà{}¤* ½lÈ»€~.ž©kÜõVÅÇ®þÒ€§ú‘7ã$o—#€àkص <Éâ{ -¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,ÊæªlfŒendstream +¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,Ê楧fˆendstream endobj -799 0 obj << +803 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 40 /LastChar 90 -/Widths 2134 0 R -/BaseFont /ODIXFB+URWPalladioL-Roma-Slant_167 -/FontDescriptor 797 0 R +/Widths 2156 0 R +/BaseFont /ADSGJO+URWPalladioL-Roma-Slant_167 +/FontDescriptor 801 0 R >> endobj -797 0 obj << +801 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /ODIXFB+URWPalladioL-Roma-Slant_167 +/FontName /ADSGJO+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z) -/FontFile 798 0 R +/FontFile 802 0 R >> endobj -2134 0 obj +2156 0 obj [333 333 0 0 0 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 0 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ] endobj -736 0 obj << +740 0 obj << /Length1 862 /Length2 1251 /Length3 532 -/Length 1860 +/Length 1861 /Filter /FlateDecode >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2%X$-wTP¤2$H20I0@¹,P ‚A…ÊE ÒJi½ ”‹ÁŠ‚§F„‚Ü4 -& X¹ê -ºè±KîþÚ³3æ}žç{¿gž÷;ç33ñô!8²‘ ØŠ ¤Nn>A2É833'†ÄràqçÖÉÚ¸¼ë;Y·î¹2=ñ"ç4sÇA;hš}„ àD(V^#Ž-wUÊ£úìùõéMþÒ'Æ©¦)fÏZ}Ê¥3i±†Ñ¿ß ÓÄßIË(žùÊC ×d̸6p[žt]IÊŒßÛhìjÔöКûrs›•»ì£`ò õª‹#µí!öÿ\¦¼Vin.‹}^…Ôäïyþ]ýιýøŒâÕ§>-­—kw×뺻îö:e¾(ÔrïÐH£¸I®ÌÊj¹ÇÇHøáq›ŽîÛ{KÆ ÞÓ1øö+¯€\†äüJ#£exðص0Š–©¬‹fdþå—ÌÕåkE%›D%ãÇéýGÁª]à}ÕxÆáœXæ$3M/7øjŒ#ÇÛUY6o”ÕéõÔœ‘ÉûtŒ5û•YQz -Y¥8Ç9­=›™žáàîå÷…FÜá漤€gjußóŠ§eÈ™c[Æ|ÕÉÌã­/'¬¦Dã>Úô‹]¥~)†æ‘ðÅ›™MÇò3ëUL’Ó~ƒáwa_·09›5•zö7ÓqƒL~·±(„ðc´åЄrÓ%{&nÄÍàD÷™Ò£Î¾ºÌØ„Øk7NKê ‰À9 ²¤våš'øÖ‡\îSŒÃ㲎„™xjèz”Ë.Ûk'$Ô\×-”…ÌîЉМV*¦…­FÔ=3À5½[wì™üPûR÷ÈÉ?ª)–’Öokö±ïOWïßô:óÀ³†~îG¡ÿÐõS¿ Ï›?2¬>¦òõÉ/áÞÏo”~/øãoC¥“áëó¯Þ”_• ­­ý7‹l©Š£&•×*¯InØ›ËHÊ[”ý §³Øþ¥y¾~P{D².«,U55öÔͧŠ »Šªéó(ç©óx…ýde©?ýS—_ã¨bÎ Çç¿œ$½Nì~®Q×*5*óeT¥LM—hµ¾Þê™Õ>ä1¨'›³²dPª×H\š @šÝî~Ã{8sç—Úµ¬÷U$FÛéx7:á,?ÔyòÓæݯ¸ùOiD§È‡‹øÄuþ÷T«TêSFaô{ò€Š1b]aÚù_Ýw*S’ç#¶ä]k¬Øu ÙìÓò€vlÃlÓËD Õ7™Už¦«‹ûJ*ƶábuÁÀ$ñö²·p}Â(5ñiQBCG¸çÀ\—$§!7!Ç]~9Šœù¸)ökµÑ)Ç÷D_uo€£ŒÚjnÿ=Õáh׺™;wáÔúBÙ˜«jU´fŸîNç²QÝÖ…Zöî–[£!CŽWµ$Aü6ÍŸd‡š@Â!ß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ˜ú`v«× íøT6Ý1¿é0S x}Î䇯£Ž¨Fü׆þÜ×¢¯ª«;rª³+Ù7ÖÕt®]šrZ9µqg{7áø®lGÌ}Ÿ3\OkôÏɵV'•Ç²;Bêmиƒ’ž˜lo^·`m`onç=òøàþßà¢vuC¨@h(î_EÍþ}endstream +æ2@ ŠM „‹ +ŠT†dBI& (— +A@0¨P¹TZ)­`åb°¢àY#BAn¬\uÝôØ¥?wíÙ™?ó>Ïó½ß3Ïûó™™xúœØHìŠÅÒgwŸC ‰dœ™™3 +Cb"tÄ0 ííAÀI €T€lG£iT;œàŒ„E¢¼`®°pþlQd8 `”Ç‚„€;$æ¬ â>‹‹#‰€Ÿx/®Þ°F#`6‚›ÇAp0Oˆ#-:b9`· ³%aï¨a¦ Ìägf‘ù‘æàH¶Œ9ùo˜ZÙÜUÂç{@‚ÅöK)ý‰‡<~ä["“ˆapGØ0*\)õ…—͹ÃlžD°’eˆ!>å$ æô!’­©ËOäÊ“ÂlOž˜Å8_/á°½Ò +ß’’—«û/«·s]"=!žP¼?2 ÈïÕK5ø¾ÆRByRÀŸL$“ALˆ½ï¾Vl¶GÈBØiiºÙ®÷‚æÀ‡›ð‘O:·NÖÆåÝØÉš¸}ßቹ¦™+8ŽÚAÓÐìc\'B¡°òqj¹§RÓgϯg¦7ùKŸ§š¦˜=oõ)—ΤÅFÿv+L7u,£xæk¦®É˜~}àŽ<醒”¿·ÑØͨí‘5÷Õæ6+Ù'ÁäAëU—Fj ÚCø¥ +Ly£ÒÜ\û¢ +-¨É5vyþ}ýιøŒâ—Õ§=+­—kw×뺻îõ:g¾,ÔòèÐH£¸K®ÎÊj¹'ÆHøáq›Žî;{KÅ >Ð1øîk¯€\r}­‘Ñ2fâ©¡Ë,—]qÐNH¨¹n[( ™Ý¡¡9ÿ¬TL [¨Ÿzf€kz·îp™üXûr÷È©?©)–’Öïjö³LWØô&óàóº~î'¡ÓõS¿ +Ï›?:¬>®bÊúä—qæ7Jüþ—¡ÒÉðõù×nɯɉ®„Ö‰Öþ[E¶Tű‡“Êë•7Æ$ 7Ìe$åmÊ„3YlÿÒ<ß‹?ª™‘¬+*‹ÇUM=uó)ƒ¢…0螢êSÚ<Êyæ:^á0YYêOûÜg߯qT1ç¤Ó‹¿Ÿ"½Iì~¡Q×*5*ó¥W¥LM—hµ¾Ùê™Õ>ÄÔ“ÍYYÒ)Õk$ûš @šýî~Ã.œ¹ ¿Ií[Öû*£íu¼ƒq–ë<ýùnóî×ÜügÇ5¢SäÃEt|â:ÿûªU*õi£0Ú}y@ű®0í¯» +•)Éó[ò‡®7Vì:˜Çhöiyhw|ÃlÓ«D Õ·™Už¦«‹ûJ*ú¶ábuÁÀG$ñö²÷p}Â(5ñyQBCG¸çÀ\—$§!7!ÇC~%Šœù¤)ökµÑ)Ç÷D_uo€£ŒÚjîü5ÕñX׺™»÷àÔúBÙ˜›jU´fŸîÝNײQÝÖ…Zöî–Û£Ž!CN×´$Aü6ÍŸd‡›@Âaß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ„úpv«× íøT6Í)¿éC x}ÞäÇo¢ŽªFü׆þÒ×¢¯ª«;zº³+Ù7ÖÍt®]šrF9µqg{7áÄ®læcÆɾ/èng4úçäZ«“ÊcÙ!õ6hÜ!IOL¶·F¯Œ[°6°7·‚óù?|pÿoð?Ñ»º!TŒ 4÷/ãµþSendstream endobj -737 0 obj << +741 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2135 0 R +/Encoding 2157 0 R /FirstChar 13 /LastChar 110 -/Widths 2136 0 R -/BaseFont /QQRSYH+CMSY10 -/FontDescriptor 735 0 R +/Widths 2158 0 R +/BaseFont /QFMEDQ+CMSY10 +/FontDescriptor 739 0 R >> endobj -735 0 obj << +739 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /QQRSYH+CMSY10 +/FontName /QFMEDQ+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash) -/FontFile 736 0 R +/FontFile 740 0 R >> endobj -2136 0 obj +2158 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ] endobj -2135 0 obj << +2157 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef] >> endobj -733 0 obj << +737 0 obj << /Length1 1616 /Length2 25334 /Length3 532 @@ -10453,7 +10623,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNLITBYŒêŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ +xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœN^AMTA‰êŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ üPˆŸìá|ŒRbQ»š€ê ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””s Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W WâãÆ[.¸N5ÈõëZS† @@ -10547,35 +10717,35 @@ A ­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬ g¤£Ê¾2f~mû„m}…i¶xÄãæužÙÆœ»‚ÙüÂx\Ôt{™C Àåò ›ËøýÈ·'5' ªzqvipd×kµ»¶j©@ƒæ…:Íw¾?bøàôVs,%ãIP¡ÍSÃ…„A³ô‰ìDª`Ïûñ,{r˜¦fY—AÀ˜EÏ¡+LNä^õ,¸¬Y¼B™¡9ÛœÐç†dbTC4è¿JLWl©0Âkž ^¸ùT›Úò«¾¦ét«§^Þí§/‡3SÄ蚇dQœv(CÜ쇵È%#¾j0Æ7›5pEZ‡ì—,í¼éÀOÇéÃõ¤¯(CæýéZb4üÁP”™Γ{5Þ…k`åùÃJÙãpÔféAvs,µp̈Õ.¨±g¸Ño¡µ°±P9:Ý,'c|Ì1eÁh†M~‘fQÞúûdú9’LÈúôÖN0–"/Ó|8׃ҿ]‰/ óûÚûس˜z$©Ôü³[<~q÷é#ƒä2 'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿?qEµÀ¡Glq_åOÎ1ŠL$HülÓ‚|²ëÅ›:vÐ Ø›¨†À<¬è2ëg8„7ë%j ÅL/ARWˆŠmõƒÑ ±)Cðî&œ£Ò(q14ŒED;ÌjdW åqêÒÚ8ß'‡õt˜{r›`üz$¸~ЗV-ðr#QcªžÉ¹=H­EÍëCóIîÁÕŒ–aYÅuz8UG²þºÝ¡HJP+dGR]¤IؘNd'×DóN'é[ºqÆIÒĵF,·;Å—d•”©7•‘W­_ˆF®kô­é¢á£tΘ ~­ yTjænUÀNöÂߥ6”éŸì¶\e>:3‚t{ù^÷p*kõ!1ñÖ3«/¥tŒëÖÈ|æeWç¯ÛQ#`IbýÍÃ$ŒPÍXÉSKUŽž¡’` ËAÅžþ›m­%N©ò’÷Y ¥Ê¡K_º`ÕsYGõ¾ìŸö¨,4ƒ“³›¯HC'Ÿû89cá[ã Û2?ÆN¼ ü±ù#°¥ª0ägã¶,Š¢œ¡. éj”¿ê?ÉxG# Ò+“Å.ă-†cå-Yo¢UÄVõñÈö15Ò»æ¾Ýc@@íéíAŸ LüUÜêÏÉ…ÜÔ¿©ÿÌZÏ‚ñåÎSUn9“mbµf[‘€Š±ÑT8D1¿4г#hqÙך½E9É{Ь¶uîœb…M'­?/ÖGÐÿéε%¨˜Gš±Ñ3 ?hßó¤¸þa¶„çŽØyžÓ€’^`´ý×Þz\‹÷¶v«áP{ÑÑ•Ih~×`5»æ0ïfM…ÂÛ -ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶ûG‚¹7endstream +ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶û;¹Uendstream endobj -734 0 obj << +738 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2122 0 R +/Encoding 2143 0 R /FirstChar 2 /LastChar 216 -/Widths 2137 0 R -/BaseFont /GSFITG+URWPalladioL-Roma -/FontDescriptor 732 0 R +/Widths 2159 0 R +/BaseFont /PQWFQS+URWPalladioL-Roma +/FontDescriptor 736 0 R >> endobj -732 0 obj << +736 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /GSFITG+URWPalladioL-Roma +/FontName /PQWFQS+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblright/endash/emdash/Oslash) -/FontFile 733 0 R +/FontFile 737 0 R >> endobj -2137 0 obj +2159 0 obj [605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ] endobj -709 0 obj << +713 0 obj << /Length1 1614 /Length2 24766 /Length3 532 @@ -10583,7 +10753,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:Me YuªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS +xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:Iy YªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»šê ÿ\%ý}þ54>:2Ü{Ú„M•IÊå KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó#\2®˜Æíß»OÍß 6.â'¢ÿp$iÊíù2ŸÒ;LÛ–Oòá ±Fóyº)‘ùµ©ãà~ ¥ŸC¡ë­„aø ÅÑ«¨ÙûGæhg [&óâ<1—Xû²Âø{iª_“¸bf)¦Œ²§T˜ ÜÓ»GAe!ógF玦àUa!*ÚZ0Ÿðç/è a0¼€ž~£œ†äwÝo âïfŸJ³xÛw® ÞaÇL¿õ0 è^š `8¿Ú Ù4Ùç÷ Ï©4†V×"”]BÝ3pþà·½_) èIÞ\H$séåXŒ{Òb^Z,ÃÛ6ö©ÉÁ ¬–R2µCÇŠ‰t(£ˆOܲÓ7‚9òó`e€² ä@y%0júAÈëRÿ˜à˜~xƒ4wÖ5çíÂàÖ±åmÝÓ×â}=Ð’tRX[>͔ҞÐRÔ "çH³l/é•_r> endobj -708 0 obj << +712 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /ZTEYNX+URWPalladioL-Bold +/FontName /MAJPIN+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/fi/fl/exclam/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash) -/FontFile 709 0 R +/FontFile 713 0 R >> endobj -2138 0 obj +2160 0 obj [611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ] endobj -711 0 obj << +715 0 obj << /Type /Pages /Count 6 -/Parent 2139 0 R -/Kids [702 0 R 729 0 R 739 0 R 794 0 R 858 0 R 920 0 R] +/Parent 2161 0 R +/Kids [706 0 R 733 0 R 743 0 R 798 0 R 862 0 R 924 0 R] >> endobj -951 0 obj << +956 0 obj << /Type /Pages /Count 6 -/Parent 2139 0 R -/Kids [939 0 R 953 0 R 967 0 R 978 0 R 985 0 R 997 0 R] +/Parent 2161 0 R +/Kids [944 0 R 958 0 R 972 0 R 983 0 R 990 0 R 1002 0 R] >> endobj -1009 0 obj << +1014 0 obj << /Type /Pages /Count 6 -/Parent 2139 0 R -/Kids [1002 0 R 1011 0 R 1022 0 R 1030 0 R 1037 0 R 1043 0 R] +/Parent 2161 0 R +/Kids [1007 0 R 1016 0 R 1027 0 R 1035 0 R 1042 0 R 1048 0 R] >> endobj -1066 0 obj << +1071 0 obj << /Type /Pages /Count 6 -/Parent 2139 0 R -/Kids [1051 0 R 1073 0 R 1083 0 R 1088 0 R 1092 0 R 1099 0 R] +/Parent 2161 0 R +/Kids [1056 0 R 1078 0 R 1088 0 R 1093 0 R 1097 0 R 1104 0 R] >> endobj -1115 0 obj << +1120 0 obj << /Type /Pages /Count 6 -/Parent 2139 0 R -/Kids [1107 0 R 1118 0 R 1125 0 R 1130 0 R 1139 0 R 1146 0 R] +/Parent 2161 0 R +/Kids [1112 0 R 1123 0 R 1130 0 R 1135 0 R 1145 0 R 1151 0 R] >> endobj -1158 0 obj << +1161 0 obj << /Type /Pages /Count 6 -/Parent 2139 0 R -/Kids [1150 0 R 1161 0 R 1166 0 R 1174 0 R 1182 0 R 1191 0 R] +/Parent 2161 0 R +/Kids [1155 0 R 1163 0 R 1167 0 R 1177 0 R 1182 0 R 1190 0 R] >> endobj -1210 0 obj << +1206 0 obj << /Type /Pages /Count 6 -/Parent 2140 0 R -/Kids [1200 0 R 1212 0 R 1217 0 R 1223 0 R 1229 0 R 1233 0 R] +/Parent 2162 0 R +/Kids [1198 0 R 1208 0 R 1217 0 R 1228 0 R 1233 0 R 1239 0 R] >> endobj -1250 0 obj << +1248 0 obj << /Type /Pages /Count 6 -/Parent 2140 0 R -/Kids [1241 0 R 1252 0 R 1256 0 R 1260 0 R 1265 0 R 1271 0 R] +/Parent 2162 0 R +/Kids [1245 0 R 1250 0 R 1258 0 R 1268 0 R 1272 0 R 1276 0 R] >> endobj -1280 0 obj << +1285 0 obj << /Type /Pages /Count 6 -/Parent 2140 0 R -/Kids [1275 0 R 1282 0 R 1293 0 R 1297 0 R 1301 0 R 1311 0 R] +/Parent 2162 0 R +/Kids [1281 0 R 1288 0 R 1292 0 R 1298 0 R 1309 0 R 1313 0 R] >> endobj -1323 0 obj << +1325 0 obj << /Type /Pages /Count 6 -/Parent 2140 0 R -/Kids [1318 0 R 1325 0 R 1329 0 R 1333 0 R 1337 0 R 1345 0 R] +/Parent 2162 0 R +/Kids [1317 0 R 1328 0 R 1335 0 R 1340 0 R 1345 0 R 1349 0 R] >> endobj -1356 0 obj << +1359 0 obj << /Type /Pages /Count 6 -/Parent 2140 0 R -/Kids [1351 0 R 1358 0 R 1365 0 R 1372 0 R 1378 0 R 1390 0 R] +/Parent 2162 0 R +/Kids [1353 0 R 1361 0 R 1368 0 R 1374 0 R 1381 0 R 1388 0 R] >> endobj -1398 0 obj << +1401 0 obj << /Type /Pages /Count 6 -/Parent 2140 0 R -/Kids [1395 0 R 1400 0 R 1405 0 R 1413 0 R 1420 0 R 1425 0 R] +/Parent 2162 0 R +/Kids [1394 0 R 1404 0 R 1412 0 R 1416 0 R 1421 0 R 1428 0 R] >> endobj -1432 0 obj << +1440 0 obj << /Type /Pages /Count 6 -/Parent 2141 0 R -/Kids [1429 0 R 1434 0 R 1442 0 R 1449 0 R 1468 0 R 1482 0 R] +/Parent 2163 0 R +/Kids [1436 0 R 1442 0 R 1446 0 R 1450 0 R 1458 0 R 1465 0 R] >> endobj -1507 0 obj << +1497 0 obj << /Type /Pages /Count 6 -/Parent 2141 0 R -/Kids [1502 0 R 1509 0 R 1521 0 R 1525 0 R 1531 0 R 1541 0 R] +/Parent 2163 0 R +/Kids [1484 0 R 1499 0 R 1519 0 R 1525 0 R 1537 0 R 1541 0 R] >> endobj -1560 0 obj << +1556 0 obj << /Type /Pages /Count 6 -/Parent 2141 0 R -/Kids [1553 0 R 1562 0 R 1569 0 R 1577 0 R 1585 0 R 1594 0 R] +/Parent 2163 0 R +/Kids [1547 0 R 1558 0 R 1570 0 R 1578 0 R 1586 0 R 1593 0 R] >> endobj -1611 0 obj << +1609 0 obj << /Type /Pages /Count 6 -/Parent 2141 0 R -/Kids [1604 0 R 1613 0 R 1617 0 R 1623 0 R 1634 0 R 1638 0 R] +/Parent 2163 0 R +/Kids [1602 0 R 1612 0 R 1619 0 R 1630 0 R 1634 0 R 1640 0 R] >> endobj -1652 0 obj << +1654 0 obj << /Type /Pages /Count 6 -/Parent 2141 0 R -/Kids [1642 0 R 1654 0 R 1658 0 R 1665 0 R 1675 0 R 1734 0 R] +/Parent 2163 0 R +/Kids [1651 0 R 1656 0 R 1660 0 R 1671 0 R 1675 0 R 1682 0 R] >> endobj -1843 0 obj << +1750 0 obj << /Type /Pages /Count 6 -/Parent 2141 0 R -/Kids [1790 0 R 1845 0 R 1879 0 R 1888 0 R 1894 0 R 1899 0 R] +/Parent 2163 0 R +/Kids [1692 0 R 1752 0 R 1808 0 R 1862 0 R 1896 0 R 1905 0 R] >> endobj -1907 0 obj << +1915 0 obj << /Type /Pages /Count 6 -/Parent 2142 0 R -/Kids [1903 0 R 1909 0 R 1920 0 R 1925 0 R 1937 0 R 1948 0 R] +/Parent 2164 0 R +/Kids [1911 0 R 1917 0 R 1921 0 R 1926 0 R 1937 0 R 1942 0 R] >> endobj -1966 0 obj << +1964 0 obj << /Type /Pages /Count 6 -/Parent 2142 0 R -/Kids [1955 0 R 1968 0 R 1972 0 R 1983 0 R 1989 0 R 1993 0 R] +/Parent 2164 0 R +/Kids [1954 0 R 1966 0 R 1973 0 R 1985 0 R 1989 0 R 2000 0 R] >> endobj -2012 0 obj << +2009 0 obj << /Type /Pages /Count 6 -/Parent 2142 0 R -/Kids [2001 0 R 2014 0 R 2023 0 R 2027 0 R 2039 0 R 2043 0 R] +/Parent 2164 0 R +/Kids [2006 0 R 2011 0 R 2017 0 R 2030 0 R 2040 0 R 2044 0 R] >> endobj 2059 0 obj << /Type /Pages /Count 6 -/Parent 2142 0 R -/Kids [2050 0 R 2061 0 R 2066 0 R 2071 0 R 2081 0 R 2088 0 R] +/Parent 2164 0 R +/Kids [2056 0 R 2061 0 R 2067 0 R 2078 0 R 2083 0 R 2087 0 R] >> endobj -2102 0 obj << +2103 0 obj << /Type /Pages -/Count 3 -/Parent 2142 0 R -/Kids [2098 0 R 2104 0 R 2116 0 R] +/Count 6 +/Parent 2164 0 R +/Kids [2095 0 R 2105 0 R 2116 0 R 2121 0 R 2133 0 R 2139 0 R] >> endobj -2139 0 obj << +2161 0 obj << /Type /Pages /Count 36 -/Parent 2143 0 R -/Kids [711 0 R 951 0 R 1009 0 R 1066 0 R 1115 0 R 1158 0 R] +/Parent 2165 0 R +/Kids [715 0 R 956 0 R 1014 0 R 1071 0 R 1120 0 R 1161 0 R] >> endobj -2140 0 obj << +2162 0 obj << /Type /Pages /Count 36 -/Parent 2143 0 R -/Kids [1210 0 R 1250 0 R 1280 0 R 1323 0 R 1356 0 R 1398 0 R] +/Parent 2165 0 R +/Kids [1206 0 R 1248 0 R 1285 0 R 1325 0 R 1359 0 R 1401 0 R] >> endobj -2141 0 obj << +2163 0 obj << /Type /Pages /Count 36 -/Parent 2143 0 R -/Kids [1432 0 R 1507 0 R 1560 0 R 1611 0 R 1652 0 R 1843 0 R] +/Parent 2165 0 R +/Kids [1440 0 R 1497 0 R 1556 0 R 1609 0 R 1654 0 R 1750 0 R] >> endobj -2142 0 obj << +2164 0 obj << /Type /Pages -/Count 27 -/Parent 2143 0 R -/Kids [1907 0 R 1966 0 R 2012 0 R 2059 0 R 2102 0 R] +/Count 30 +/Parent 2165 0 R +/Kids [1915 0 R 1964 0 R 2009 0 R 2059 0 R 2103 0 R] >> endobj -2143 0 obj << +2165 0 obj << /Type /Pages -/Count 135 -/Kids [2139 0 R 2140 0 R 2141 0 R 2142 0 R] +/Count 138 +/Kids [2161 0 R 2162 0 R 2163 0 R 2164 0 R] >> endobj -2144 0 obj << +2166 0 obj << /Type /Outlines /First 7 0 R -/Last 647 0 R +/Last 651 0 R /Count 10 >> endobj +703 0 obj << +/Title 704 0 R +/A 701 0 R +/Parent 651 0 R +/Prev 699 0 R +>> endobj 699 0 obj << /Title 700 0 R /A 697 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 695 0 R +/Next 703 0 R >> endobj 695 0 obj << /Title 696 0 R /A 693 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 691 0 R /Next 699 0 R >> endobj 691 0 obj << /Title 692 0 R /A 689 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 687 0 R /Next 695 0 R >> endobj 687 0 obj << /Title 688 0 R /A 685 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 683 0 R /Next 691 0 R >> endobj 683 0 obj << /Title 684 0 R /A 681 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 679 0 R /Next 687 0 R >> endobj 679 0 obj << /Title 680 0 R /A 677 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 675 0 R /Next 683 0 R >> endobj 675 0 obj << /Title 676 0 R /A 673 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 671 0 R /Next 679 0 R >> endobj 671 0 obj << /Title 672 0 R /A 669 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 667 0 R /Next 675 0 R >> endobj 667 0 obj << /Title 668 0 R /A 665 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 663 0 R /Next 671 0 R >> endobj 663 0 obj << /Title 664 0 R /A 661 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 659 0 R /Next 667 0 R >> endobj 659 0 obj << /Title 660 0 R /A 657 0 R -/Parent 647 0 R +/Parent 651 0 R /Prev 655 0 R /Next 663 0 R >> endobj 655 0 obj << /Title 656 0 R /A 653 0 R -/Parent 647 0 R -/Prev 651 0 R +/Parent 651 0 R /Next 659 0 R >> endobj 651 0 obj << /Title 652 0 R /A 649 0 R -/Parent 647 0 R -/Next 655 0 R +/Parent 2166 0 R +/Prev 615 0 R +/First 655 0 R +/Last 703 0 R +/Count -13 >> endobj 647 0 obj << /Title 648 0 R /A 645 0 R -/Parent 2144 0 R -/Prev 611 0 R -/First 651 0 R -/Last 699 0 R -/Count -13 +/Parent 635 0 R +/Prev 643 0 R >> endobj 643 0 obj << /Title 644 0 R /A 641 0 R -/Parent 631 0 R +/Parent 635 0 R /Prev 639 0 R +/Next 647 0 R >> endobj 639 0 obj << /Title 640 0 R /A 637 0 R -/Parent 631 0 R -/Prev 635 0 R +/Parent 635 0 R /Next 643 0 R >> endobj 635 0 obj << /Title 636 0 R /A 633 0 R -/Parent 631 0 R -/Next 639 0 R +/Parent 615 0 R +/Prev 627 0 R +/First 639 0 R +/Last 647 0 R +/Count -3 >> endobj 631 0 obj << /Title 632 0 R /A 629 0 R -/Parent 611 0 R -/Prev 623 0 R -/First 635 0 R -/Last 643 0 R -/Count -3 +/Parent 627 0 R >> endobj 627 0 obj << /Title 628 0 R /A 625 0 R -/Parent 623 0 R +/Parent 615 0 R +/Prev 619 0 R +/Next 635 0 R +/First 631 0 R +/Last 631 0 R +/Count -1 >> endobj 623 0 obj << /Title 624 0 R /A 621 0 R -/Parent 611 0 R -/Prev 615 0 R -/Next 631 0 R -/First 627 0 R -/Last 627 0 R -/Count -1 +/Parent 619 0 R >> endobj 619 0 obj << /Title 620 0 R /A 617 0 R /Parent 615 0 R +/Next 627 0 R +/First 623 0 R +/Last 623 0 R +/Count -1 >> endobj 615 0 obj << /Title 616 0 R /A 613 0 R -/Parent 611 0 R -/Next 623 0 R +/Parent 2166 0 R +/Prev 595 0 R +/Next 651 0 R /First 619 0 R -/Last 619 0 R -/Count -1 +/Last 635 0 R +/Count -3 >> endobj 611 0 obj << /Title 612 0 R /A 609 0 R -/Parent 2144 0 R -/Prev 591 0 R -/Next 647 0 R -/First 615 0 R -/Last 631 0 R -/Count -3 +/Parent 595 0 R +/Prev 607 0 R >> endobj 607 0 obj << /Title 608 0 R /A 605 0 R -/Parent 591 0 R -/Prev 603 0 R +/Parent 595 0 R +/Prev 599 0 R +/Next 611 0 R >> endobj 603 0 obj << /Title 604 0 R /A 601 0 R -/Parent 591 0 R -/Prev 595 0 R -/Next 607 0 R +/Parent 599 0 R >> endobj 599 0 obj << /Title 600 0 R /A 597 0 R /Parent 595 0 R +/Next 607 0 R +/First 603 0 R +/Last 603 0 R +/Count -1 >> endobj 595 0 obj << /Title 596 0 R /A 593 0 R -/Parent 591 0 R -/Next 603 0 R +/Parent 2166 0 R +/Prev 571 0 R +/Next 615 0 R /First 599 0 R -/Last 599 0 R -/Count -1 +/Last 611 0 R +/Count -3 >> endobj 591 0 obj << /Title 592 0 R /A 589 0 R -/Parent 2144 0 R -/Prev 567 0 R -/Next 611 0 R -/First 595 0 R -/Last 607 0 R -/Count -3 +/Parent 571 0 R +/Prev 579 0 R >> endobj 587 0 obj << /Title 588 0 R /A 585 0 R -/Parent 567 0 R -/Prev 575 0 R +/Parent 579 0 R +/Prev 583 0 R >> endobj 583 0 obj << /Title 584 0 R /A 581 0 R -/Parent 575 0 R -/Prev 579 0 R +/Parent 579 0 R +/Next 587 0 R >> endobj 579 0 obj << /Title 580 0 R /A 577 0 R -/Parent 575 0 R -/Next 583 0 R +/Parent 571 0 R +/Prev 575 0 R +/Next 591 0 R +/First 583 0 R +/Last 587 0 R +/Count -2 >> endobj 575 0 obj << /Title 576 0 R /A 573 0 R -/Parent 567 0 R -/Prev 571 0 R -/Next 587 0 R -/First 579 0 R -/Last 583 0 R -/Count -2 +/Parent 571 0 R +/Next 579 0 R >> endobj 571 0 obj << /Title 572 0 R /A 569 0 R -/Parent 567 0 R -/Next 575 0 R +/Parent 2166 0 R +/Prev 243 0 R +/Next 595 0 R +/First 575 0 R +/Last 591 0 R +/Count -3 >> endobj 567 0 obj << /Title 568 0 R /A 565 0 R -/Parent 2144 0 R -/Prev 243 0 R -/Next 591 0 R -/First 571 0 R -/Last 587 0 R -/Count -3 +/Parent 547 0 R +/Prev 563 0 R >> endobj 563 0 obj << /Title 564 0 R /A 561 0 R -/Parent 543 0 R +/Parent 547 0 R /Prev 559 0 R +/Next 567 0 R >> endobj 559 0 obj << /Title 560 0 R /A 557 0 R -/Parent 543 0 R +/Parent 547 0 R /Prev 555 0 R /Next 563 0 R >> endobj 555 0 obj << /Title 556 0 R /A 553 0 R -/Parent 543 0 R +/Parent 547 0 R /Prev 551 0 R /Next 559 0 R >> endobj 551 0 obj << /Title 552 0 R /A 549 0 R -/Parent 543 0 R -/Prev 547 0 R +/Parent 547 0 R /Next 555 0 R >> endobj 547 0 obj << /Title 548 0 R /A 545 0 R -/Parent 543 0 R -/Next 551 0 R +/Parent 539 0 R +/Prev 543 0 R +/First 551 0 R +/Last 567 0 R +/Count -5 >> endobj 543 0 obj << /Title 544 0 R /A 541 0 R -/Parent 535 0 R -/Prev 539 0 R -/First 547 0 R -/Last 563 0 R -/Count -5 +/Parent 539 0 R +/Next 547 0 R >> endobj 539 0 obj << /Title 540 0 R /A 537 0 R -/Parent 535 0 R -/Next 543 0 R +/Parent 243 0 R +/Prev 483 0 R +/First 543 0 R +/Last 547 0 R +/Count -2 >> endobj 535 0 obj << /Title 536 0 R /A 533 0 R -/Parent 243 0 R -/Prev 483 0 R -/First 539 0 R -/Last 543 0 R -/Count -2 +/Parent 483 0 R +/Prev 531 0 R >> endobj 531 0 obj << /Title 532 0 R /A 529 0 R /Parent 483 0 R -/Prev 527 0 R +/Prev 511 0 R +/Next 535 0 R >> endobj 527 0 obj << /Title 528 0 R /A 525 0 R -/Parent 483 0 R -/Prev 511 0 R -/Next 531 0 R +/Parent 511 0 R +/Prev 523 0 R >> endobj 523 0 obj << /Title 524 0 R /A 521 0 R /Parent 511 0 R /Prev 519 0 R +/Next 527 0 R >> endobj 519 0 obj << /Title 520 0 R @@ -11223,10 +11400,10 @@ endobj /A 509 0 R /Parent 483 0 R /Prev 507 0 R -/Next 527 0 R +/Next 531 0 R /First 515 0 R -/Last 523 0 R -/Count -3 +/Last 527 0 R +/Count -4 >> endobj 507 0 obj << /Title 508 0 R @@ -11275,9 +11452,9 @@ endobj /A 481 0 R /Parent 243 0 R /Prev 275 0 R -/Next 535 0 R +/Next 539 0 R /First 487 0 R -/Last 531 0 R +/Last 535 0 R /Count -7 >> endobj 479 0 obj << @@ -11702,11 +11879,11 @@ endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 2144 0 R +/Parent 2166 0 R /Prev 231 0 R -/Next 567 0 R +/Next 571 0 R /First 247 0 R -/Last 535 0 R +/Last 539 0 R /Count -4 >> endobj 239 0 obj << @@ -11724,7 +11901,7 @@ endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 2144 0 R +/Parent 2166 0 R /Prev 131 0 R /Next 243 0 R /First 235 0 R @@ -11906,7 +12083,7 @@ endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 2144 0 R +/Parent 2166 0 R /Prev 91 0 R /Next 231 0 R /First 135 0 R @@ -11980,7 +12157,7 @@ endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 2144 0 R +/Parent 2166 0 R /Prev 67 0 R /Next 131 0 R /First 95 0 R @@ -12023,7 +12200,7 @@ endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 2144 0 R +/Parent 2166 0 R /Prev 7 0 R /Next 91 0 R /First 71 0 R @@ -12132,2194 +12309,2216 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 2144 0 R +/Parent 2166 0 R /Next 67 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj -2145 0 obj << -/Names [(Access_Control_Lists) 1621 0 R (Bv9ARM.ch01) 942 0 R (Bv9ARM.ch02) 988 0 R (Bv9ARM.ch03) 1005 0 R (Bv9ARM.ch04) 1054 0 R (Bv9ARM.ch05) 1142 0 R (Bv9ARM.ch06) 1153 0 R (Bv9ARM.ch07) 1620 0 R (Bv9ARM.ch08) 1645 0 R (Bv9ARM.ch09) 1661 0 R (Bv9ARM.ch10) 1882 0 R (Configuration_File_Grammar) 1178 0 R (DNSSEC) 1121 0 R (Doc-Start) 707 0 R (Setting_TTLs) 1546 0 R (acache) 995 0 R (access_control) 1307 0 R (acl) 1186 0 R (address_match_lists) 1159 0 R (admin_tools) 1028 0 R (appendix.A) 610 0 R (appendix.B) 646 0 R (bibliography) 1669 0 R (boolean_options) 1070 0 R (builtin) 1385 0 R (chapter*.1) 742 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 566 0 R (chapter.8) 590 0 R (cite.RFC1033) 1796 0 R (cite.RFC1034) 1681 0 R (cite.RFC1035) 1683 0 R (cite.RFC1101) 1778 0 R (cite.RFC1123) 1780 0 R (cite.RFC1183) 1740 0 R (cite.RFC1464) 1818 0 R (cite.RFC1535) 1726 0 R (cite.RFC1536) 1728 0 R (cite.RFC1537) 1798 0 R (cite.RFC1591) 1782 0 R (cite.RFC1706) 1742 0 R (cite.RFC1712) 1838 0 R (cite.RFC1713) 1820 0 R (cite.RFC1794) 1822 0 R (cite.RFC1876) 1744 0 R (cite.RFC1912) 1800 0 R (cite.RFC1982) 1730 0 R (cite.RFC1995) 1688 0 R (cite.RFC1996) 1690 0 R (cite.RFC2010) 1802 0 R (cite.RFC2052) 1746 0 R (cite.RFC2065) 1851 0 R (cite.RFC2136) 1692 0 R (cite.RFC2137) 1853 0 R (cite.RFC2163) 1748 0 R (cite.RFC2168) 1750 0 R (cite.RFC2181) 1694 0 R (cite.RFC2219) 1804 0 R (cite.RFC2230) 1752 0 R (cite.RFC2240) 1824 0 R (cite.RFC2308) 1696 0 R (cite.RFC2317) 1784 0 R (cite.RFC2345) 1826 0 R (cite.RFC2352) 1828 0 R (cite.RFC2535) 1855 0 R (cite.RFC2536) 1754 0 R (cite.RFC2537) 1756 0 R (cite.RFC2538) 1758 0 R (cite.RFC2539) 1760 0 R (cite.RFC2540) 1762 0 R (cite.RFC2671) 1698 0 R (cite.RFC2672) 1700 0 R (cite.RFC2673) 1840 0 R (cite.RFC2782) 1764 0 R (cite.RFC2825) 1808 0 R (cite.RFC2826) 1786 0 R (cite.RFC2845) 1702 0 R (cite.RFC2874) 1842 0 R (cite.RFC2915) 1766 0 R (cite.RFC2929) 1788 0 R (cite.RFC2930) 1704 0 R (cite.RFC2931) 1706 0 R (cite.RFC3007) 1708 0 R (cite.RFC3008) 1857 0 R (cite.RFC3071) 1830 0 R (cite.RFC3090) 1859 0 R (cite.RFC3110) 1768 0 R (cite.RFC3123) 1770 0 R (cite.RFC3225) 1714 0 R (cite.RFC3258) 1832 0 R (cite.RFC3445) 1861 0 R (cite.RFC3490) 1810 0 R (cite.RFC3491) 1812 0 R (cite.RFC3492) 1814 0 R (cite.RFC3596) 1772 0 R (cite.RFC3597) 1774 0 R (cite.RFC3645) 1710 0 R (cite.RFC3655) 1863 0 R (cite.RFC3658) 1865 0 R (cite.RFC3755) 1867 0 R (cite.RFC3757) 1869 0 R (cite.RFC3833) 1716 0 R (cite.RFC3845) 1871 0 R (cite.RFC3901) 1834 0 R (cite.RFC4033) 1718 0 R (cite.RFC4034) 1720 0 R (cite.RFC4035) 1722 0 R (cite.RFC4074) 1732 0 R (cite.RFC974) 1685 0 R (cite.id2505777) 1876 0 R (clients-per-query) 1592 0 R (configuration_file_elements) 1154 0 R (controls_statement_definition_and_usage) 1041 0 R (diagnostic_tools) 976 0 R (dynamic_update) 1064 0 R (dynamic_update_policies) 1116 0 R (dynamic_update_security) 1316 0 R (empty) 1393 0 R (historical_dns_information) 1663 0 R (id2466552) 943 0 R (id2466576) 944 0 R (id2467534) 945 0 R (id2467544) 946 0 R (id2467716) 958 0 R (id2467737) 959 0 R (id2467771) 960 0 R (id2467856) 963 0 R (id2467948) 956 0 R (id2470253) 970 0 R (id2470277) 973 0 R (id2470375) 974 0 R (id2470396) 975 0 R (id2470426) 981 0 R (id2470530) 982 0 R (id2470556) 983 0 R (id2470590) 989 0 R (id2470617) 990 0 R (id2470630) 991 0 R (id2470724) 994 0 R (id2470734) 1000 0 R (id2470766) 1007 0 R (id2470782) 1008 0 R (id2470805) 1014 0 R (id2470822) 1015 0 R (id2471227) 1018 0 R (id2471233) 1019 0 R (id2473009) 1046 0 R (id2473020) 1047 0 R (id2473420) 1079 0 R (id2473438) 1080 0 R (id2473942) 1096 0 R (id2473959) 1097 0 R (id2473997) 1102 0 R (id2474016) 1103 0 R (id2474026) 1104 0 R (id2474069) 1105 0 R (id2474263) 1110 0 R (id2474311) 1112 0 R (id2474325) 1113 0 R (id2474374) 1114 0 R (id2474510) 1122 0 R (id2474589) 1123 0 R (id2474670) 1128 0 R (id2474953) 1133 0 R (id2475083) 1135 0 R (id2475105) 1136 0 R (id2475138) 1143 0 R (id2475285) 1155 0 R (id2476147) 1164 0 R (id2476174) 1169 0 R (id2476380) 1170 0 R (id2476395) 1171 0 R (id2476425) 1177 0 R (id2476500) 1179 0 R (id2477079) 1185 0 R (id2477122) 1187 0 R (id2477269) 1189 0 R (id2477629) 1196 0 R (id2477646) 1197 0 R (id2477806) 1203 0 R (id2477830) 1204 0 R (id2477921) 1208 0 R (id2478115) 1209 0 R (id2478167) 1215 0 R (id2478997) 1226 0 R (id2479731) 1236 0 R (id2479859) 1237 0 R (id2480244) 1239 0 R (id2480317) 1244 0 R (id2480381) 1247 0 R (id2480425) 1248 0 R (id2480440) 1249 0 R (id2482851) 1278 0 R (id2484684) 1304 0 R (id2484743) 1306 0 R (id2485249) 1321 0 R (id2486520) 1340 0 R (id2486580) 1342 0 R (id2486934) 1354 0 R (id2487436) 1369 0 R (id2489703) 1411 0 R (id2489789) 1416 0 R (id2489841) 1417 0 R (id2489923) 1423 0 R (id2491460) 1437 0 R (id2491467) 1438 0 R (id2491473) 1439 0 R (id2491963) 1446 0 R (id2491996) 1452 0 R (id2493692) 1505 0 R (id2494007) 1512 0 R (id2494025) 1513 0 R (id2494045) 1516 0 R (id2494282) 1518 0 R (id2495452) 1528 0 R (id2495580) 1534 0 R (id2495602) 1535 0 R (id2495964) 1537 0 R (id2496101) 1539 0 R (id2496119) 1544 0 R (id2496660) 1547 0 R (id2496785) 1549 0 R (id2496800) 1550 0 R (id2496980) 1556 0 R (id2497002) 1557 0 R (id2497063) 1558 0 R (id2497132) 1559 0 R (id2497169) 1565 0 R (id2497299) 1566 0 R (id2497798) 1573 0 R (id2498301) 1581 0 R (id2498307) 1582 0 R (id2499706) 1589 0 R (id2499713) 1590 0 R (id2500089) 1597 0 R (id2500094) 1598 0 R (id2501108) 1600 0 R (id2501140) 1601 0 R (id2501549) 1610 0 R (id2501792) 1630 0 R (id2501941) 1631 0 R (id2502069) 1632 0 R (id2502149) 1646 0 R (id2502154) 1647 0 R (id2502166) 1648 0 R (id2502251) 1649 0 R (id2502313) 1662 0 R (id2502485) 1668 0 R (id2502741) 1673 0 R (id2502743) 1679 0 R (id2502752) 1684 0 R (id2502775) 1680 0 R (id2502798) 1682 0 R (id2502835) 1693 0 R (id2502861) 1695 0 R (id2502887) 1687 0 R (id2502912) 1689 0 R (id2502935) 1691 0 R (id2502990) 1697 0 R (id2503017) 1699 0 R (id2503044) 1701 0 R (id2503106) 1703 0 R (id2503136) 1705 0 R (id2503165) 1707 0 R (id2503192) 1709 0 R (id2503267) 1712 0 R (id2503274) 1713 0 R (id2503301) 1715 0 R (id2503337) 1717 0 R (id2503402) 1719 0 R (id2503467) 1721 0 R (id2503532) 1724 0 R (id2503541) 1725 0 R (id2503635) 1727 0 R (id2503703) 1729 0 R (id2503738) 1731 0 R (id2503779) 1738 0 R (id2503784) 1739 0 R (id2503842) 1741 0 R (id2503879) 1749 0 R (id2503914) 1743 0 R (id2503969) 1745 0 R (id2504007) 1747 0 R (id2504033) 1751 0 R (id2504058) 1753 0 R (id2504085) 1755 0 R (id2504112) 1757 0 R (id2504151) 1759 0 R (id2504181) 1761 0 R (id2504211) 1763 0 R (id2504253) 1765 0 R (id2504286) 1767 0 R (id2504313) 1769 0 R (id2504337) 1771 0 R (id2504394) 1773 0 R (id2504419) 1776 0 R (id2504426) 1777 0 R (id2504452) 1779 0 R (id2504474) 1781 0 R (id2504498) 1783 0 R (id2504612) 1785 0 R (id2504635) 1787 0 R (id2504685) 1794 0 R (id2504693) 1795 0 R (id2504716) 1797 0 R (id2504743) 1799 0 R (id2504770) 1801 0 R (id2504806) 1803 0 R (id2504846) 1806 0 R (id2504852) 1807 0 R (id2504884) 1809 0 R (id2504930) 1811 0 R (id2504965) 1813 0 R (id2504992) 1816 0 R (id2505010) 1817 0 R (id2505032) 1819 0 R (id2505058) 1821 0 R (id2505083) 1823 0 R (id2505107) 1825 0 R (id2505153) 1827 0 R (id2505176) 1829 0 R (id2505203) 1831 0 R (id2505228) 1833 0 R (id2505266) 1836 0 R (id2505272) 1837 0 R (id2505330) 1839 0 R (id2505356) 1841 0 R (id2505393) 1849 0 R (id2505404) 1850 0 R (id2505444) 1852 0 R (id2505470) 1854 0 R (id2505500) 1856 0 R (id2505526) 1858 0 R (id2505553) 1860 0 R (id2505589) 1862 0 R (id2505625) 1864 0 R (id2505652) 1866 0 R (id2505678) 1868 0 R (id2505723) 1870 0 R (id2505765) 1873 0 R (id2505774) 1875 0 R (id2505777) 1877 0 R (incremental_zone_transfers) 1076 0 R (internet_drafts) 1872 0 R (ipv6addresses) 1137 0 R (journal) 1065 0 R (lwresd) 1144 0 R (man.dig) 1883 0 R (man.dnssec-dsfromkey) 1931 0 R (man.dnssec-keyfromlabel) 1945 0 R (man.dnssec-keygen) 1961 0 R (man.dnssec-signzone) 1979 0 R (man.host) 1916 0 R (man.named) 2033 0 R (man.named-checkconf) 2004 0 R (man.named-checkzone) 2017 0 R (man.nsupdate) 2055 0 R (man.rndc) 2077 0 R (man.rndc-confgen) 2110 0 R (man.rndc.conf) 2093 0 R (notify) 1055 0 R (options) 1263 0 R (page.1) 706 0 R (page.10) 980 0 R (page.100) 1667 0 R (page.101) 1677 0 R (page.102) 1736 0 R (page.103) 1792 0 R (page.104) 1847 0 R (page.105) 1881 0 R (page.106) 1890 0 R (page.107) 1896 0 R (page.108) 1901 0 R (page.109) 1905 0 R (page.11) 987 0 R (page.110) 1911 0 R (page.111) 1922 0 R (page.112) 1927 0 R (page.113) 1939 0 R (page.114) 1950 0 R (page.115) 1957 0 R (page.116) 1970 0 R (page.117) 1974 0 R (page.118) 1985 0 R (page.119) 1991 0 R (page.12) 999 0 R (page.120) 1995 0 R (page.121) 2003 0 R (page.122) 2016 0 R (page.123) 2025 0 R (page.124) 2029 0 R (page.125) 2041 0 R (page.126) 2045 0 R (page.127) 2052 0 R (page.128) 2063 0 R (page.129) 2068 0 R (page.13) 1004 0 R (page.130) 2073 0 R (page.131) 2083 0 R (page.132) 2090 0 R (page.133) 2100 0 R (page.134) 2106 0 R (page.135) 2118 0 R (page.14) 1013 0 R (page.15) 1024 0 R (page.16) 1032 0 R (page.17) 1039 0 R (page.18) 1045 0 R (page.19) 1053 0 R (page.2) 731 0 R (page.20) 1075 0 R (page.21) 1085 0 R (page.22) 1090 0 R (page.23) 1094 0 R (page.24) 1101 0 R (page.25) 1109 0 R (page.26) 1120 0 R (page.27) 1127 0 R (page.28) 1132 0 R (page.29) 1141 0 R (page.3) 741 0 R (page.30) 1148 0 R (page.31) 1152 0 R (page.32) 1163 0 R (page.33) 1168 0 R (page.34) 1176 0 R (page.35) 1184 0 R (page.36) 1193 0 R (page.37) 1202 0 R (page.38) 1214 0 R (page.39) 1219 0 R (page.4) 796 0 R (page.40) 1225 0 R (page.41) 1231 0 R (page.42) 1235 0 R (page.43) 1243 0 R (page.44) 1254 0 R (page.45) 1258 0 R (page.46) 1262 0 R (page.47) 1267 0 R (page.48) 1273 0 R (page.49) 1277 0 R (page.5) 860 0 R (page.50) 1284 0 R (page.51) 1295 0 R (page.52) 1299 0 R (page.53) 1303 0 R (page.54) 1313 0 R (page.55) 1320 0 R (page.56) 1327 0 R (page.57) 1331 0 R (page.58) 1335 0 R (page.59) 1339 0 R (page.6) 922 0 R (page.60) 1347 0 R (page.61) 1353 0 R (page.62) 1360 0 R (page.63) 1367 0 R (page.64) 1374 0 R (page.65) 1380 0 R (page.66) 1392 0 R (page.67) 1397 0 R (page.68) 1402 0 R (page.69) 1407 0 R (page.7) 941 0 R (page.70) 1415 0 R (page.71) 1422 0 R (page.72) 1427 0 R (page.73) 1431 0 R (page.74) 1436 0 R (page.75) 1444 0 R (page.76) 1451 0 R (page.77) 1470 0 R (page.78) 1484 0 R (page.79) 1504 0 R (page.8) 955 0 R (page.80) 1511 0 R (page.81) 1523 0 R (page.82) 1527 0 R (page.83) 1533 0 R (page.84) 1543 0 R (page.85) 1555 0 R (page.86) 1564 0 R (page.87) 1571 0 R (page.88) 1579 0 R (page.89) 1587 0 R (page.9) 969 0 R (page.90) 1596 0 R (page.91) 1606 0 R (page.92) 1615 0 R (page.93) 1619 0 R (page.94) 1625 0 R (page.95) 1636 0 R (page.96) 1640 0 R (page.97) 1644 0 R (page.98) 1656 0 R (page.99) 1660 0 R (proposed_standards) 1081 0 R (query_address) 1322 0 R (rfcs) 965 0 R (rndc) 1198 0 R (root_delegation_only) 1447 0 R (rrset_ordering) 1020 0 R (sample_configuration) 1006 0 R (section*.10) 1805 0 R (section*.100) 2091 0 R (section*.101) 2092 0 R (section*.102) 2094 0 R (section*.103) 2095 0 R (section*.104) 2096 0 R (section*.105) 2101 0 R (section*.106) 2107 0 R (section*.107) 2108 0 R (section*.108) 2109 0 R (section*.109) 2111 0 R (section*.11) 1815 0 R (section*.110) 2112 0 R (section*.111) 2113 0 R (section*.112) 2114 0 R (section*.113) 2119 0 R (section*.114) 2120 0 R (section*.115) 2121 0 R (section*.12) 1835 0 R (section*.13) 1848 0 R (section*.14) 1874 0 R (section*.15) 1884 0 R (section*.16) 1885 0 R (section*.17) 1886 0 R (section*.18) 1891 0 R (section*.19) 1892 0 R (section*.2) 1672 0 R (section*.20) 1897 0 R (section*.21) 1906 0 R (section*.22) 1912 0 R (section*.23) 1913 0 R (section*.24) 1914 0 R (section*.25) 1915 0 R (section*.26) 1917 0 R (section*.27) 1918 0 R (section*.28) 1923 0 R (section*.29) 1928 0 R (section*.3) 1678 0 R (section*.30) 1929 0 R (section*.31) 1930 0 R (section*.32) 1932 0 R (section*.33) 1933 0 R (section*.34) 1934 0 R (section*.35) 1935 0 R (section*.36) 1940 0 R (section*.37) 1941 0 R (section*.38) 1942 0 R (section*.39) 1943 0 R (section*.4) 1686 0 R (section*.40) 1944 0 R (section*.41) 1946 0 R (section*.42) 1951 0 R (section*.43) 1952 0 R (section*.44) 1953 0 R (section*.45) 1958 0 R (section*.46) 1959 0 R (section*.47) 1960 0 R (section*.48) 1962 0 R (section*.49) 1963 0 R (section*.5) 1711 0 R (section*.50) 1964 0 R (section*.51) 1965 0 R (section*.52) 1975 0 R (section*.53) 1976 0 R (section*.54) 1977 0 R (section*.55) 1978 0 R (section*.56) 1980 0 R (section*.57) 1981 0 R (section*.58) 1986 0 R (section*.59) 1987 0 R (section*.6) 1723 0 R (section*.60) 1996 0 R (section*.61) 1997 0 R (section*.62) 1998 0 R (section*.63) 1999 0 R (section*.64) 2005 0 R (section*.65) 2006 0 R (section*.66) 2007 0 R (section*.67) 2008 0 R (section*.68) 2009 0 R (section*.69) 2010 0 R (section*.7) 1737 0 R (section*.70) 2011 0 R (section*.71) 2018 0 R (section*.72) 2019 0 R (section*.73) 2020 0 R (section*.74) 2021 0 R (section*.75) 2030 0 R (section*.76) 2031 0 R (section*.77) 2032 0 R (section*.78) 2034 0 R (section*.79) 2035 0 R (section*.8) 1775 0 R (section*.80) 2036 0 R (section*.81) 2037 0 R (section*.82) 2046 0 R (section*.83) 2047 0 R (section*.84) 2048 0 R (section*.85) 2053 0 R (section*.86) 2054 0 R (section*.87) 2056 0 R (section*.88) 2057 0 R (section*.89) 2058 0 R (section*.9) 1793 0 R (section*.90) 2064 0 R (section*.91) 2069 0 R (section*.92) 2074 0 R (section*.93) 2075 0 R (section*.94) 2076 0 R (section*.95) 2078 0 R (section*.96) 2079 0 R (section*.97) 2084 0 R (section*.98) 2085 0 R (section*.99) 2086 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 534 0 R (section.7.1) 570 0 R (section.7.2) 574 0 R (section.7.3) 586 0 R (section.8.1) 594 0 R (section.8.2) 602 0 R (section.8.3) 606 0 R (section.A.1) 614 0 R (section.A.2) 622 0 R (section.A.3) 630 0 R (section.B.1) 650 0 R (section.B.10) 686 0 R (section.B.11) 690 0 R (section.B.12) 694 0 R (section.B.13) 698 0 R (section.B.2) 654 0 R (section.B.3) 658 0 R (section.B.4) 662 0 R (section.B.5) 666 0 R (section.B.6) 670 0 R (section.B.7) 674 0 R (section.B.8) 678 0 R (section.B.9) 682 0 R (server_resource_limits) 1348 0 R (server_statement_definition_and_usage) 1291 0 R (server_statement_grammar) 1403 0 R (statistics) 1572 0 R (statistics_counters) 1580 0 R (statschannels) 1410 0 R (statsfile) 1269 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 526 0 R (subsection.6.3.7) 530 0 R (subsection.6.4.1) 542 0 R (subsection.7.2.1) 578 0 R (subsection.7.2.2) 582 0 R (subsection.8.1.1) 598 0 R (subsection.A.1.1) 618 0 R (subsection.A.2.1) 626 0 R (subsection.A.3.1) 634 0 R (subsection.A.3.2) 638 0 R (subsection.A.3.3) 642 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.4.0.1) 538 0 R (subsubsection.6.4.1.1) 546 0 R (subsubsection.6.4.1.2) 550 0 R (subsubsection.6.4.1.3) 554 0 R (subsubsection.6.4.1.4) 558 0 R (subsubsection.6.4.1.5) 562 0 R (table.1.1) 947 0 R (table.1.2) 957 0 R (table.3.1) 1016 0 R (table.3.2) 1048 0 R (table.6.1) 1156 0 R (table.6.10) 1517 0 R (table.6.11) 1519 0 R (table.6.12) 1529 0 R (table.6.13) 1536 0 R (table.6.14) 1538 0 R (table.6.15) 1545 0 R (table.6.16) 1548 0 R (table.6.17) 1551 0 R (table.6.18) 1567 0 R (table.6.19) 1574 0 R (table.6.2) 1180 0 R (table.6.20) 1583 0 R (table.6.21) 1591 0 R (table.6.22) 1599 0 R (table.6.23) 1602 0 R (table.6.3) 1188 0 R (table.6.4) 1227 0 R (table.6.5) 1238 0 R (table.6.6) 1279 0 R (table.6.7) 1370 0 R (table.6.8) 1440 0 R (table.6.9) 1506 0 R (the_category_phrase) 1221 0 R (the_sortlist_statement) 1361 0 R (topology) 1355 0 R (tsig) 1095 0 R (tuning) 1375 0 R (types_of_resource_records_and_when_to_use_them) 964 0 R (view_statement_grammar) 1388 0 R (zone_statement_grammar) 1309 0 R (zone_transfers) 1071 0 R (zonefile_format) 1387 0 R] +2167 0 obj << +/Names [(Access_Control_Lists) 1638 0 R (Bv9ARM.ch01) 947 0 R (Bv9ARM.ch02) 993 0 R (Bv9ARM.ch03) 1010 0 R (Bv9ARM.ch04) 1059 0 R (Bv9ARM.ch05) 1158 0 R (Bv9ARM.ch06) 1170 0 R (Bv9ARM.ch07) 1637 0 R (Bv9ARM.ch08) 1663 0 R (Bv9ARM.ch09) 1678 0 R (Bv9ARM.ch10) 1899 0 R (Configuration_File_Grammar) 1194 0 R (DNSSEC) 1126 0 R (Doc-Start) 711 0 R (Setting_TTLs) 1563 0 R (acache) 1000 0 R (access_control) 1323 0 R (acl) 1202 0 R (address_match_lists) 1175 0 R (admin_tools) 1033 0 R (appendix.A) 614 0 R (appendix.B) 650 0 R (bibliography) 1686 0 R (boolean_options) 1075 0 R (builtin) 1407 0 R (chapter*.1) 746 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 570 0 R (chapter.8) 594 0 R (cite.RFC1033) 1814 0 R (cite.RFC1034) 1698 0 R (cite.RFC1035) 1700 0 R (cite.RFC1101) 1796 0 R (cite.RFC1123) 1798 0 R (cite.RFC1183) 1758 0 R (cite.RFC1464) 1836 0 R (cite.RFC1535) 1743 0 R (cite.RFC1536) 1745 0 R (cite.RFC1537) 1816 0 R (cite.RFC1591) 1800 0 R (cite.RFC1706) 1760 0 R (cite.RFC1712) 1856 0 R (cite.RFC1713) 1838 0 R (cite.RFC1794) 1840 0 R (cite.RFC1876) 1762 0 R (cite.RFC1912) 1818 0 R (cite.RFC1982) 1747 0 R (cite.RFC1995) 1705 0 R (cite.RFC1996) 1707 0 R (cite.RFC2010) 1820 0 R (cite.RFC2052) 1764 0 R (cite.RFC2065) 1868 0 R (cite.RFC2136) 1709 0 R (cite.RFC2137) 1870 0 R (cite.RFC2163) 1766 0 R (cite.RFC2168) 1768 0 R (cite.RFC2181) 1711 0 R (cite.RFC2219) 1822 0 R (cite.RFC2230) 1770 0 R (cite.RFC2240) 1842 0 R (cite.RFC2308) 1713 0 R (cite.RFC2317) 1802 0 R (cite.RFC2345) 1844 0 R (cite.RFC2352) 1846 0 R (cite.RFC2535) 1872 0 R (cite.RFC2536) 1772 0 R (cite.RFC2537) 1774 0 R (cite.RFC2538) 1776 0 R (cite.RFC2539) 1778 0 R (cite.RFC2540) 1780 0 R (cite.RFC2671) 1715 0 R (cite.RFC2672) 1717 0 R (cite.RFC2673) 1858 0 R (cite.RFC2782) 1782 0 R (cite.RFC2825) 1826 0 R (cite.RFC2826) 1804 0 R (cite.RFC2845) 1719 0 R (cite.RFC2874) 1860 0 R (cite.RFC2915) 1784 0 R (cite.RFC2929) 1806 0 R (cite.RFC2930) 1721 0 R (cite.RFC2931) 1723 0 R (cite.RFC3007) 1725 0 R (cite.RFC3008) 1874 0 R (cite.RFC3071) 1848 0 R (cite.RFC3090) 1876 0 R (cite.RFC3110) 1786 0 R (cite.RFC3123) 1788 0 R (cite.RFC3225) 1731 0 R (cite.RFC3258) 1850 0 R (cite.RFC3445) 1878 0 R (cite.RFC3490) 1828 0 R (cite.RFC3491) 1830 0 R (cite.RFC3492) 1832 0 R (cite.RFC3596) 1790 0 R (cite.RFC3597) 1792 0 R (cite.RFC3645) 1727 0 R (cite.RFC3655) 1880 0 R (cite.RFC3658) 1882 0 R (cite.RFC3755) 1884 0 R (cite.RFC3757) 1886 0 R (cite.RFC3833) 1733 0 R (cite.RFC3845) 1888 0 R (cite.RFC3901) 1852 0 R (cite.RFC4033) 1735 0 R (cite.RFC4034) 1737 0 R (cite.RFC4035) 1739 0 R (cite.RFC4074) 1749 0 R (cite.RFC974) 1702 0 R (cite.id2506179) 1893 0 R (clients-per-query) 1610 0 R (configuration_file_elements) 1171 0 R (controls_statement_definition_and_usage) 1046 0 R (diagnostic_tools) 981 0 R (dynamic_update) 1069 0 R (dynamic_update_policies) 1121 0 R (dynamic_update_security) 1333 0 R (empty) 1409 0 R (historical_dns_information) 1680 0 R (id2466555) 948 0 R (id2466579) 949 0 R (id2467422) 1084 0 R (id2467441) 1085 0 R (id2467538) 950 0 R (id2467547) 951 0 R (id2467719) 963 0 R (id2467740) 964 0 R (id2467774) 965 0 R (id2467859) 968 0 R (id2467952) 961 0 R (id2470257) 975 0 R (id2470280) 978 0 R (id2470378) 979 0 R (id2470400) 980 0 R (id2470429) 986 0 R (id2470533) 987 0 R (id2470560) 988 0 R (id2470594) 994 0 R (id2470620) 995 0 R (id2470633) 996 0 R (id2470727) 999 0 R (id2470738) 1005 0 R (id2470770) 1012 0 R (id2470786) 1013 0 R (id2470808) 1019 0 R (id2470825) 1020 0 R (id2471230) 1023 0 R (id2471236) 1024 0 R (id2473012) 1051 0 R (id2473024) 1052 0 R (id2473610) 1101 0 R (id2473627) 1102 0 R (id2474417) 1107 0 R (id2474435) 1108 0 R (id2474445) 1109 0 R (id2474482) 1110 0 R (id2474676) 1115 0 R (id2474724) 1117 0 R (id2474738) 1118 0 R (id2474787) 1119 0 R (id2474855) 1127 0 R (id2475002) 1128 0 R (id2475083) 1133 0 R (id2475389) 1141 0 R (id2475520) 1148 0 R (id2475541) 1149 0 R (id2475574) 1159 0 R (id2475858) 1172 0 R (id2476720) 1180 0 R (id2476747) 1185 0 R (id2476953) 1186 0 R (id2476968) 1187 0 R (id2477066) 1193 0 R (id2477209) 1195 0 R (id2477652) 1201 0 R (id2477694) 1203 0 R (id2477842) 1205 0 R (id2478270) 1213 0 R (id2478288) 1214 0 R (id2478311) 1220 0 R (id2478334) 1221 0 R (id2478493) 1225 0 R (id2478619) 1226 0 R (id2478672) 1231 0 R (id2479433) 1242 0 R (id2480030) 1253 0 R (id2480158) 1254 0 R (id2480544) 1256 0 R (id2480617) 1261 0 R (id2480681) 1264 0 R (id2480725) 1265 0 R (id2480740) 1266 0 R (id2483226) 1295 0 R (id2484998) 1320 0 R (id2485057) 1322 0 R (id2485630) 1338 0 R (id2486902) 1356 0 R (id2486962) 1358 0 R (id2487316) 1371 0 R (id2487818) 1385 0 R (id2490017) 1431 0 R (id2490171) 1432 0 R (id2490222) 1433 0 R (id2490373) 1439 0 R (id2491778) 1453 0 R (id2491785) 1454 0 R (id2491790) 1455 0 R (id2492349) 1462 0 R (id2492382) 1468 0 R (id2494147) 1522 0 R (id2494461) 1528 0 R (id2494480) 1529 0 R (id2494500) 1532 0 R (id2494668) 1534 0 R (id2495907) 1544 0 R (id2496103) 1550 0 R (id2496124) 1551 0 R (id2496487) 1553 0 R (id2496624) 1555 0 R (id2496642) 1561 0 R (id2497046) 1564 0 R (id2497171) 1566 0 R (id2497186) 1567 0 R (id2497298) 1573 0 R (id2497320) 1574 0 R (id2497336) 1575 0 R (id2497397) 1576 0 R (id2497466) 1581 0 R (id2497571) 1582 0 R (id2497701) 1583 0 R (id2498200) 1590 0 R (id2498635) 1598 0 R (id2498641) 1599 0 R (id2500177) 1606 0 R (id2500183) 1607 0 R (id2500628) 1615 0 R (id2500633) 1616 0 R (id2501578) 1622 0 R (id2501610) 1623 0 R (id2502088) 1628 0 R (id2502262) 1647 0 R (id2502343) 1648 0 R (id2502471) 1649 0 R (id2502551) 1664 0 R (id2502556) 1665 0 R (id2502568) 1666 0 R (id2502585) 1667 0 R (id2502647) 1679 0 R (id2503024) 1685 0 R (id2503143) 1690 0 R (id2503145) 1696 0 R (id2503154) 1701 0 R (id2503177) 1697 0 R (id2503201) 1699 0 R (id2503237) 1710 0 R (id2503264) 1712 0 R (id2503289) 1704 0 R (id2503314) 1706 0 R (id2503337) 1708 0 R (id2503393) 1714 0 R (id2503419) 1716 0 R (id2503446) 1718 0 R (id2503508) 1720 0 R (id2503538) 1722 0 R (id2503568) 1724 0 R (id2503594) 1726 0 R (id2503669) 1729 0 R (id2503676) 1730 0 R (id2503703) 1732 0 R (id2503739) 1734 0 R (id2503804) 1736 0 R (id2503869) 1738 0 R (id2503934) 1741 0 R (id2503943) 1742 0 R (id2503969) 1744 0 R (id2504037) 1746 0 R (id2504072) 1748 0 R (id2504113) 1756 0 R (id2504118) 1757 0 R (id2504176) 1759 0 R (id2504213) 1767 0 R (id2504248) 1761 0 R (id2504302) 1763 0 R (id2504341) 1765 0 R (id2504366) 1769 0 R (id2504392) 1771 0 R (id2504419) 1773 0 R (id2504445) 1775 0 R (id2504485) 1777 0 R (id2504515) 1779 0 R (id2504545) 1781 0 R (id2504587) 1783 0 R (id2504620) 1785 0 R (id2504647) 1787 0 R (id2504670) 1789 0 R (id2504796) 1791 0 R (id2504821) 1794 0 R (id2504828) 1795 0 R (id2504854) 1797 0 R (id2504876) 1799 0 R (id2504900) 1801 0 R (id2504946) 1803 0 R (id2504969) 1805 0 R (id2505019) 1812 0 R (id2505027) 1813 0 R (id2505050) 1815 0 R (id2505077) 1817 0 R (id2505104) 1819 0 R (id2505140) 1821 0 R (id2505180) 1824 0 R (id2505186) 1825 0 R (id2505218) 1827 0 R (id2505264) 1829 0 R (id2505299) 1831 0 R (id2505325) 1834 0 R (id2505344) 1835 0 R (id2505366) 1837 0 R (id2505392) 1839 0 R (id2505417) 1841 0 R (id2505441) 1843 0 R (id2505486) 1845 0 R (id2505510) 1847 0 R (id2505537) 1849 0 R (id2505562) 1851 0 R (id2505600) 1854 0 R (id2505606) 1855 0 R (id2505664) 1857 0 R (id2505690) 1859 0 R (id2505726) 1866 0 R (id2505738) 1867 0 R (id2505778) 1869 0 R (id2505873) 1871 0 R (id2505902) 1873 0 R (id2505928) 1875 0 R (id2505955) 1877 0 R (id2505991) 1879 0 R (id2506027) 1881 0 R (id2506054) 1883 0 R (id2506081) 1885 0 R (id2506125) 1887 0 R (id2506167) 1890 0 R (id2506177) 1892 0 R (id2506179) 1894 0 R (incremental_zone_transfers) 1081 0 R (internet_drafts) 1889 0 R (ipv6addresses) 1143 0 R (journal) 1070 0 R (lwresd) 1160 0 R (man.dig) 1900 0 R (man.dnssec-dsfromkey) 1948 0 R (man.dnssec-keyfromlabel) 1962 0 R (man.dnssec-keygen) 1979 0 R (man.dnssec-signzone) 1996 0 R (man.host) 1933 0 R (man.named) 2050 0 R (man.named-checkconf) 2022 0 R (man.named-checkzone) 2034 0 R (man.nsupdate) 2073 0 R (man.rndc) 2098 0 R (man.rndc-confgen) 2127 0 R (man.rndc.conf) 2111 0 R (notify) 1060 0 R (options) 1279 0 R (page.1) 710 0 R (page.10) 985 0 R (page.100) 1673 0 R (page.101) 1677 0 R (page.102) 1684 0 R (page.103) 1694 0 R (page.104) 1754 0 R (page.105) 1810 0 R (page.106) 1864 0 R (page.107) 1898 0 R (page.108) 1907 0 R (page.109) 1913 0 R (page.11) 992 0 R (page.110) 1919 0 R (page.111) 1923 0 R (page.112) 1928 0 R (page.113) 1939 0 R (page.114) 1944 0 R (page.115) 1956 0 R (page.116) 1968 0 R (page.117) 1975 0 R (page.118) 1987 0 R (page.119) 1991 0 R (page.12) 1004 0 R (page.120) 2002 0 R (page.121) 2008 0 R (page.122) 2013 0 R (page.123) 2019 0 R (page.124) 2032 0 R (page.125) 2042 0 R (page.126) 2046 0 R (page.127) 2058 0 R (page.128) 2063 0 R (page.129) 2069 0 R (page.13) 1009 0 R (page.130) 2080 0 R (page.131) 2085 0 R (page.132) 2089 0 R (page.133) 2097 0 R (page.134) 2107 0 R (page.135) 2118 0 R (page.136) 2123 0 R (page.137) 2135 0 R (page.138) 2141 0 R (page.14) 1018 0 R (page.15) 1029 0 R (page.16) 1037 0 R (page.17) 1044 0 R (page.18) 1050 0 R (page.19) 1058 0 R (page.2) 735 0 R (page.20) 1080 0 R (page.21) 1090 0 R (page.22) 1095 0 R (page.23) 1099 0 R (page.24) 1106 0 R (page.25) 1114 0 R (page.26) 1125 0 R (page.27) 1132 0 R (page.28) 1137 0 R (page.29) 1147 0 R (page.3) 745 0 R (page.30) 1153 0 R (page.31) 1157 0 R (page.32) 1165 0 R (page.33) 1169 0 R (page.34) 1179 0 R (page.35) 1184 0 R (page.36) 1192 0 R (page.37) 1200 0 R (page.38) 1210 0 R (page.39) 1219 0 R (page.4) 800 0 R (page.40) 1230 0 R (page.41) 1235 0 R (page.42) 1241 0 R (page.43) 1247 0 R (page.44) 1252 0 R (page.45) 1260 0 R (page.46) 1270 0 R (page.47) 1274 0 R (page.48) 1278 0 R (page.49) 1283 0 R (page.5) 864 0 R (page.50) 1290 0 R (page.51) 1294 0 R (page.52) 1300 0 R (page.53) 1311 0 R (page.54) 1315 0 R (page.55) 1319 0 R (page.56) 1330 0 R (page.57) 1337 0 R (page.58) 1342 0 R (page.59) 1347 0 R (page.6) 926 0 R (page.60) 1351 0 R (page.61) 1355 0 R (page.62) 1363 0 R (page.63) 1370 0 R (page.64) 1376 0 R (page.65) 1383 0 R (page.66) 1390 0 R (page.67) 1396 0 R (page.68) 1406 0 R (page.69) 1414 0 R (page.7) 946 0 R (page.70) 1418 0 R (page.71) 1423 0 R (page.72) 1430 0 R (page.73) 1438 0 R (page.74) 1444 0 R (page.75) 1448 0 R (page.76) 1452 0 R (page.77) 1460 0 R (page.78) 1467 0 R (page.79) 1486 0 R (page.8) 960 0 R (page.80) 1501 0 R (page.81) 1521 0 R (page.82) 1527 0 R (page.83) 1539 0 R (page.84) 1543 0 R (page.85) 1549 0 R (page.86) 1560 0 R (page.87) 1572 0 R (page.88) 1580 0 R (page.89) 1588 0 R (page.9) 974 0 R (page.90) 1595 0 R (page.91) 1604 0 R (page.92) 1614 0 R (page.93) 1621 0 R (page.94) 1632 0 R (page.95) 1636 0 R (page.96) 1642 0 R (page.97) 1653 0 R (page.98) 1658 0 R (page.99) 1662 0 R (proposed_standards) 1086 0 R (query_address) 1343 0 R (rfcs) 970 0 R (rndc) 1215 0 R (root_delegation_only) 1463 0 R (rrset_ordering) 1025 0 R (sample_configuration) 1011 0 R (section*.10) 1823 0 R (section*.100) 2109 0 R (section*.101) 2110 0 R (section*.102) 2112 0 R (section*.103) 2113 0 R (section*.104) 2114 0 R (section*.105) 2119 0 R (section*.106) 2124 0 R (section*.107) 2125 0 R (section*.108) 2126 0 R (section*.109) 2128 0 R (section*.11) 1833 0 R (section*.110) 2129 0 R (section*.111) 2130 0 R (section*.112) 2131 0 R (section*.113) 2136 0 R (section*.114) 2137 0 R (section*.115) 2142 0 R (section*.12) 1853 0 R (section*.13) 1865 0 R (section*.14) 1891 0 R (section*.15) 1901 0 R (section*.16) 1902 0 R (section*.17) 1903 0 R (section*.18) 1908 0 R (section*.19) 1909 0 R (section*.2) 1689 0 R (section*.20) 1914 0 R (section*.21) 1924 0 R (section*.22) 1929 0 R (section*.23) 1930 0 R (section*.24) 1931 0 R (section*.25) 1932 0 R (section*.26) 1934 0 R (section*.27) 1935 0 R (section*.28) 1940 0 R (section*.29) 1945 0 R (section*.3) 1695 0 R (section*.30) 1946 0 R (section*.31) 1947 0 R (section*.32) 1949 0 R (section*.33) 1950 0 R (section*.34) 1951 0 R (section*.35) 1952 0 R (section*.36) 1957 0 R (section*.37) 1958 0 R (section*.38) 1959 0 R (section*.39) 1960 0 R (section*.4) 1703 0 R (section*.40) 1961 0 R (section*.41) 1963 0 R (section*.42) 1969 0 R (section*.43) 1970 0 R (section*.44) 1971 0 R (section*.45) 1976 0 R (section*.46) 1977 0 R (section*.47) 1978 0 R (section*.48) 1980 0 R (section*.49) 1981 0 R (section*.5) 1728 0 R (section*.50) 1982 0 R (section*.51) 1983 0 R (section*.52) 1992 0 R (section*.53) 1993 0 R (section*.54) 1994 0 R (section*.55) 1995 0 R (section*.56) 1997 0 R (section*.57) 1998 0 R (section*.58) 2003 0 R (section*.59) 2004 0 R (section*.6) 1740 0 R (section*.60) 2014 0 R (section*.61) 2015 0 R (section*.62) 2020 0 R (section*.63) 2021 0 R (section*.64) 2023 0 R (section*.65) 2024 0 R (section*.66) 2025 0 R (section*.67) 2026 0 R (section*.68) 2027 0 R (section*.69) 2028 0 R (section*.7) 1755 0 R (section*.70) 2033 0 R (section*.71) 2035 0 R (section*.72) 2036 0 R (section*.73) 2037 0 R (section*.74) 2038 0 R (section*.75) 2047 0 R (section*.76) 2048 0 R (section*.77) 2049 0 R (section*.78) 2051 0 R (section*.79) 2052 0 R (section*.8) 1793 0 R (section*.80) 2053 0 R (section*.81) 2054 0 R (section*.82) 2064 0 R (section*.83) 2065 0 R (section*.84) 2070 0 R (section*.85) 2071 0 R (section*.86) 2072 0 R (section*.87) 2074 0 R (section*.88) 2075 0 R (section*.89) 2076 0 R (section*.9) 1811 0 R (section*.90) 2081 0 R (section*.91) 2090 0 R (section*.92) 2091 0 R (section*.93) 2092 0 R (section*.94) 2093 0 R (section*.95) 2099 0 R (section*.96) 2100 0 R (section*.97) 2101 0 R (section*.98) 2102 0 R (section*.99) 2108 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 538 0 R (section.7.1) 574 0 R (section.7.2) 578 0 R (section.7.3) 590 0 R (section.8.1) 598 0 R (section.8.2) 606 0 R (section.8.3) 610 0 R (section.A.1) 618 0 R (section.A.2) 626 0 R (section.A.3) 634 0 R (section.B.1) 654 0 R (section.B.10) 690 0 R (section.B.11) 694 0 R (section.B.12) 698 0 R (section.B.13) 702 0 R (section.B.2) 658 0 R (section.B.3) 662 0 R (section.B.4) 666 0 R (section.B.5) 670 0 R (section.B.6) 674 0 R (section.B.7) 678 0 R (section.B.8) 682 0 R (section.B.9) 686 0 R (server_resource_limits) 1365 0 R (server_statement_definition_and_usage) 1307 0 R (server_statement_grammar) 1419 0 R (statistics) 1589 0 R (statistics_counters) 1597 0 R (statschannels) 1426 0 R (statsfile) 1286 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 530 0 R (subsection.6.3.7) 534 0 R (subsection.6.4.1) 546 0 R (subsection.7.2.1) 582 0 R (subsection.7.2.2) 586 0 R (subsection.8.1.1) 602 0 R (subsection.A.1.1) 622 0 R (subsection.A.2.1) 630 0 R (subsection.A.3.1) 638 0 R (subsection.A.3.2) 642 0 R (subsection.A.3.3) 646 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.3.5.4) 526 0 R (subsubsection.6.4.0.1) 542 0 R (subsubsection.6.4.1.1) 550 0 R (subsubsection.6.4.1.2) 554 0 R (subsubsection.6.4.1.3) 558 0 R (subsubsection.6.4.1.4) 562 0 R (subsubsection.6.4.1.5) 566 0 R (table.1.1) 952 0 R (table.1.2) 962 0 R (table.3.1) 1021 0 R (table.3.2) 1053 0 R (table.6.1) 1173 0 R (table.6.10) 1533 0 R (table.6.11) 1535 0 R (table.6.12) 1545 0 R (table.6.13) 1552 0 R (table.6.14) 1554 0 R (table.6.15) 1562 0 R (table.6.16) 1565 0 R (table.6.17) 1568 0 R (table.6.18) 1584 0 R (table.6.19) 1591 0 R (table.6.2) 1196 0 R (table.6.20) 1600 0 R (table.6.21) 1608 0 R (table.6.22) 1617 0 R (table.6.23) 1624 0 R (table.6.3) 1204 0 R (table.6.4) 1243 0 R (table.6.5) 1255 0 R (table.6.6) 1296 0 R (table.6.7) 1386 0 R (table.6.8) 1456 0 R (table.6.9) 1523 0 R (the_category_phrase) 1237 0 R (the_sortlist_statement) 1377 0 R (topology) 1372 0 R (tsig) 1100 0 R (tuning) 1391 0 R (types_of_resource_records_and_when_to_use_them) 969 0 R (view_statement_grammar) 1410 0 R (zone_statement_grammar) 1326 0 R (zone_transfers) 1076 0 R (zonefile_format) 1402 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj -2146 0 obj << -/Kids [2145 0 R] +2168 0 obj << +/Kids [2167 0 R] >> endobj -2147 0 obj << -/Dests 2146 0 R +2169 0 obj << +/Dests 2168 0 R >> endobj -2148 0 obj << +2170 0 obj << /Type /Catalog -/Pages 2143 0 R -/Outlines 2144 0 R -/Names 2147 0 R +/Pages 2165 0 R +/Outlines 2166 0 R +/Names 2169 0 R /PageMode /UseOutlines -/OpenAction 701 0 R +/OpenAction 705 0 R >> endobj -2149 0 obj << +2171 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20091231231729Z) +/CreationDate (D:20100218015504Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref -0 2150 +0 2172 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n -0000071459 00000 n -0000744619 00000 n +0000071778 00000 n +0000753168 00000 n 0000000054 00000 n 0000000086 00000 n -0000071583 00000 n -0000744547 00000 n +0000071902 00000 n +0000753096 00000 n 0000000133 00000 n 0000000173 00000 n -0000071708 00000 n -0000744461 00000 n +0000072027 00000 n +0000753010 00000 n 0000000221 00000 n 0000000273 00000 n -0000071833 00000 n -0000744375 00000 n +0000072152 00000 n +0000752924 00000 n 0000000321 00000 n 0000000377 00000 n -0000076158 00000 n -0000744265 00000 n +0000076477 00000 n +0000752814 00000 n 0000000425 00000 n 0000000478 00000 n -0000076282 00000 n -0000744191 00000 n +0000076601 00000 n +0000752740 00000 n 0000000531 00000 n 0000000572 00000 n -0000076407 00000 n -0000744104 00000 n +0000076726 00000 n +0000752653 00000 n 0000000625 00000 n 0000000674 00000 n -0000076531 00000 n -0000744017 00000 n +0000076850 00000 n +0000752566 00000 n 0000000727 00000 n 0000000757 00000 n -0000080810 00000 n -0000743893 00000 n +0000081129 00000 n +0000752442 00000 n 0000000810 00000 n 0000000861 00000 n -0000080935 00000 n -0000743819 00000 n +0000081254 00000 n +0000752368 00000 n 0000000919 00000 n 0000000964 00000 n -0000081060 00000 n -0000743732 00000 n +0000081379 00000 n +0000752281 00000 n 0000001022 00000 n 0000001062 00000 n -0000081185 00000 n -0000743658 00000 n +0000081504 00000 n +0000752207 00000 n 0000001120 00000 n 0000001162 00000 n -0000084157 00000 n -0000743534 00000 n +0000084476 00000 n +0000752083 00000 n 0000001215 00000 n 0000001260 00000 n -0000084282 00000 n -0000743473 00000 n +0000084601 00000 n +0000752022 00000 n 0000001318 00000 n 0000001355 00000 n -0000084407 00000 n -0000743399 00000 n +0000084726 00000 n +0000751948 00000 n 0000001408 00000 n 0000001463 00000 n -0000087335 00000 n -0000743274 00000 n +0000087654 00000 n +0000751823 00000 n 0000001509 00000 n 0000001556 00000 n -0000087460 00000 n -0000743200 00000 n +0000087779 00000 n +0000751749 00000 n 0000001604 00000 n 0000001648 00000 n -0000087585 00000 n -0000743113 00000 n +0000087904 00000 n +0000751662 00000 n 0000001696 00000 n 0000001735 00000 n -0000087710 00000 n -0000743026 00000 n +0000088029 00000 n +0000751575 00000 n 0000001783 00000 n 0000001825 00000 n -0000087834 00000 n -0000742939 00000 n +0000088153 00000 n +0000751488 00000 n 0000001873 00000 n 0000001936 00000 n -0000088914 00000 n -0000742865 00000 n +0000089239 00000 n +0000751414 00000 n 0000001984 00000 n 0000002034 00000 n -0000090625 00000 n -0000742737 00000 n +0000090953 00000 n +0000751286 00000 n 0000002080 00000 n 0000002126 00000 n -0000090752 00000 n -0000742624 00000 n +0000091080 00000 n +0000751173 00000 n 0000002174 00000 n 0000002218 00000 n -0000090880 00000 n -0000742548 00000 n +0000091208 00000 n +0000751097 00000 n 0000002271 00000 n 0000002323 00000 n -0000091008 00000 n -0000742471 00000 n +0000091336 00000 n +0000751020 00000 n 0000002377 00000 n 0000002436 00000 n -0000093550 00000 n -0000742380 00000 n +0000093878 00000 n +0000750929 00000 n 0000002485 00000 n 0000002523 00000 n -0000093809 00000 n -0000742263 00000 n +0000094137 00000 n +0000750812 00000 n 0000002572 00000 n 0000002618 00000 n -0000093938 00000 n -0000742145 00000 n +0000094266 00000 n +0000750694 00000 n 0000002672 00000 n 0000002739 00000 n -0000097170 00000 n -0000742066 00000 n +0000097498 00000 n +0000750615 00000 n 0000002798 00000 n 0000002842 00000 n -0000097298 00000 n -0000741987 00000 n +0000097626 00000 n +0000750536 00000 n 0000002901 00000 n 0000002949 00000 n -0000107947 00000 n -0000741908 00000 n +0000108275 00000 n +0000750457 00000 n 0000003003 00000 n 0000003036 00000 n -0000112966 00000 n -0000741776 00000 n +0000113294 00000 n +0000750325 00000 n 0000003083 00000 n 0000003126 00000 n -0000113095 00000 n -0000741697 00000 n +0000113423 00000 n +0000750246 00000 n 0000003175 00000 n 0000003205 00000 n -0000113224 00000 n -0000741565 00000 n +0000113552 00000 n +0000750114 00000 n 0000003254 00000 n 0000003292 00000 n -0000113353 00000 n -0000741500 00000 n +0000113681 00000 n +0000750049 00000 n 0000003346 00000 n 0000003388 00000 n -0000117615 00000 n -0000741407 00000 n +0000118088 00000 n +0000749956 00000 n 0000003437 00000 n 0000003496 00000 n -0000117744 00000 n -0000741275 00000 n +0000118217 00000 n +0000749824 00000 n 0000003545 00000 n 0000003578 00000 n -0000117873 00000 n -0000741210 00000 n +0000118346 00000 n +0000749759 00000 n 0000003632 00000 n 0000003681 00000 n -0000125183 00000 n -0000741078 00000 n +0000125674 00000 n +0000749627 00000 n 0000003730 00000 n 0000003758 00000 n -0000125312 00000 n -0000740960 00000 n +0000125803 00000 n +0000749509 00000 n 0000003812 00000 n 0000003881 00000 n -0000125441 00000 n -0000740881 00000 n +0000125932 00000 n +0000749430 00000 n 0000003940 00000 n 0000003988 00000 n -0000128293 00000 n -0000740802 00000 n +0000128724 00000 n +0000749351 00000 n 0000004047 00000 n 0000004092 00000 n -0000128422 00000 n -0000740709 00000 n +0000128853 00000 n +0000749258 00000 n 0000004146 00000 n 0000004214 00000 n -0000128551 00000 n -0000740616 00000 n +0000128982 00000 n +0000749165 00000 n 0000004268 00000 n 0000004338 00000 n -0000128680 00000 n -0000740523 00000 n +0000129111 00000 n +0000749072 00000 n 0000004392 00000 n 0000004455 00000 n -0000132601 00000 n -0000740430 00000 n +0000133032 00000 n +0000748979 00000 n 0000004509 00000 n 0000004564 00000 n -0000132730 00000 n -0000740351 00000 n +0000133161 00000 n +0000748900 00000 n 0000004618 00000 n 0000004650 00000 n -0000132859 00000 n -0000740258 00000 n +0000133290 00000 n +0000748807 00000 n 0000004699 00000 n 0000004727 00000 n -0000132988 00000 n -0000740165 00000 n +0000133419 00000 n +0000748714 00000 n 0000004776 00000 n 0000004808 00000 n -0000136765 00000 n -0000740033 00000 n +0000137196 00000 n +0000748582 00000 n 0000004857 00000 n 0000004887 00000 n -0000136894 00000 n -0000739954 00000 n +0000137325 00000 n +0000748503 00000 n 0000004941 00000 n 0000004982 00000 n -0000137023 00000 n -0000739861 00000 n +0000137454 00000 n +0000748410 00000 n 0000005036 00000 n 0000005078 00000 n -0000140484 00000 n -0000739782 00000 n +0000141049 00000 n +0000748331 00000 n 0000005132 00000 n 0000005177 00000 n -0000143559 00000 n -0000739664 00000 n +0000144495 00000 n +0000748213 00000 n 0000005226 00000 n 0000005272 00000 n -0000143688 00000 n -0000739585 00000 n +0000146096 00000 n +0000748134 00000 n 0000005326 00000 n 0000005386 00000 n -0000143816 00000 n -0000739506 00000 n +0000146225 00000 n +0000748055 00000 n 0000005440 00000 n 0000005509 00000 n -0000146298 00000 n -0000739373 00000 n +0000149032 00000 n +0000747922 00000 n 0000005556 00000 n 0000005609 00000 n -0000146427 00000 n -0000739294 00000 n +0000149161 00000 n +0000747843 00000 n 0000005658 00000 n 0000005714 00000 n -0000146556 00000 n -0000739215 00000 n +0000149290 00000 n +0000747764 00000 n 0000005763 00000 n 0000005812 00000 n -0000150740 00000 n -0000739082 00000 n +0000153474 00000 n +0000747631 00000 n 0000005859 00000 n 0000005911 00000 n -0000150869 00000 n -0000738964 00000 n +0000153603 00000 n +0000747513 00000 n 0000005960 00000 n 0000006011 00000 n -0000155559 00000 n -0000738846 00000 n +0000158293 00000 n +0000747395 00000 n 0000006065 00000 n 0000006110 00000 n -0000155687 00000 n -0000738767 00000 n +0000158421 00000 n +0000747316 00000 n 0000006169 00000 n 0000006203 00000 n -0000159308 00000 n -0000738688 00000 n +0000162042 00000 n +0000747237 00000 n 0000006262 00000 n 0000006310 00000 n -0000159436 00000 n -0000738570 00000 n +0000162170 00000 n +0000747119 00000 n 0000006364 00000 n 0000006404 00000 n -0000159565 00000 n -0000738491 00000 n +0000162299 00000 n +0000747040 00000 n 0000006463 00000 n 0000006497 00000 n -0000163504 00000 n -0000738412 00000 n +0000166238 00000 n +0000746961 00000 n 0000006556 00000 n 0000006604 00000 n -0000163633 00000 n -0000738279 00000 n +0000166367 00000 n +0000746828 00000 n 0000006653 00000 n 0000006703 00000 n -0000166453 00000 n -0000738200 00000 n +0000169187 00000 n +0000746749 00000 n 0000006757 00000 n 0000006804 00000 n -0000166581 00000 n -0000738107 00000 n +0000169315 00000 n +0000746656 00000 n 0000006858 00000 n 0000006918 00000 n -0000166840 00000 n -0000738014 00000 n +0000169574 00000 n +0000746563 00000 n 0000006972 00000 n 0000007024 00000 n -0000172189 00000 n -0000737921 00000 n +0000174923 00000 n +0000746470 00000 n 0000007078 00000 n 0000007143 00000 n -0000172318 00000 n -0000737828 00000 n +0000175052 00000 n +0000746377 00000 n 0000007197 00000 n 0000007248 00000 n -0000172447 00000 n -0000737735 00000 n +0000175181 00000 n +0000746284 00000 n 0000007302 00000 n 0000007366 00000 n -0000175899 00000 n -0000737642 00000 n +0000178633 00000 n +0000746191 00000 n 0000007420 00000 n 0000007467 00000 n -0000176028 00000 n -0000737549 00000 n +0000178762 00000 n +0000746098 00000 n 0000007521 00000 n 0000007581 00000 n -0000176157 00000 n -0000737456 00000 n +0000178891 00000 n +0000746005 00000 n 0000007635 00000 n 0000007686 00000 n -0000176286 00000 n -0000737324 00000 n +0000179020 00000 n +0000745873 00000 n 0000007741 00000 n 0000007806 00000 n -0000180517 00000 n -0000737245 00000 n +0000183251 00000 n +0000745794 00000 n 0000007866 00000 n 0000007913 00000 n -0000187075 00000 n -0000737152 00000 n +0000189809 00000 n +0000745701 00000 n 0000007973 00000 n 0000008021 00000 n -0000194627 00000 n -0000737073 00000 n +0000197361 00000 n +0000745622 00000 n 0000008081 00000 n 0000008135 00000 n -0000194886 00000 n -0000736980 00000 n +0000197620 00000 n +0000745529 00000 n 0000008190 00000 n 0000008240 00000 n -0000197709 00000 n -0000736887 00000 n +0000200443 00000 n +0000745436 00000 n 0000008295 00000 n 0000008358 00000 n -0000197838 00000 n -0000736794 00000 n +0000200572 00000 n +0000745343 00000 n 0000008413 00000 n 0000008465 00000 n -0000197967 00000 n -0000736701 00000 n +0000200701 00000 n +0000745250 00000 n 0000008520 00000 n 0000008585 00000 n -0000198096 00000 n -0000736608 00000 n +0000200830 00000 n +0000745157 00000 n 0000008640 00000 n 0000008692 00000 n -0000203976 00000 n -0000736475 00000 n +0000206840 00000 n +0000745024 00000 n 0000008747 00000 n 0000008812 00000 n -0000212370 00000 n -0000736396 00000 n +0000215241 00000 n +0000744945 00000 n 0000008872 00000 n 0000008916 00000 n -0000233628 00000 n -0000736303 00000 n +0000236497 00000 n +0000744852 00000 n 0000008976 00000 n 0000009015 00000 n -0000233757 00000 n -0000736210 00000 n +0000236626 00000 n +0000744759 00000 n 0000009075 00000 n 0000009122 00000 n -0000233886 00000 n -0000736117 00000 n +0000236755 00000 n +0000744666 00000 n 0000009182 00000 n 0000009225 00000 n -0000240979 00000 n -0000736024 00000 n +0000243668 00000 n +0000744573 00000 n 0000009285 00000 n 0000009324 00000 n -0000241107 00000 n -0000735931 00000 n +0000247184 00000 n +0000744480 00000 n 0000009384 00000 n 0000009426 00000 n -0000248082 00000 n -0000735838 00000 n +0000250363 00000 n +0000744387 00000 n 0000009486 00000 n 0000009529 00000 n -0000255955 00000 n -0000735745 00000 n +0000257930 00000 n +0000744294 00000 n 0000009589 00000 n 0000009632 00000 n -0000256084 00000 n -0000735652 00000 n +0000258059 00000 n +0000744201 00000 n 0000009692 00000 n 0000009753 00000 n -0000260235 00000 n -0000735559 00000 n +0000262252 00000 n +0000744108 00000 n 0000009814 00000 n 0000009866 00000 n -0000263744 00000 n -0000735466 00000 n +0000266146 00000 n +0000744015 00000 n 0000009927 00000 n 0000009980 00000 n -0000263873 00000 n -0000735373 00000 n +0000266275 00000 n +0000743922 00000 n 0000010041 00000 n 0000010079 00000 n -0000267780 00000 n -0000735280 00000 n +0000270312 00000 n +0000743829 00000 n 0000010140 00000 n 0000010192 00000 n -0000271179 00000 n -0000735187 00000 n +0000273468 00000 n +0000743736 00000 n 0000010253 00000 n 0000010297 00000 n -0000275345 00000 n -0000735094 00000 n +0000277402 00000 n +0000743643 00000 n 0000010358 00000 n 0000010394 00000 n -0000280135 00000 n -0000735001 00000 n +0000285611 00000 n +0000743550 00000 n 0000010455 00000 n 0000010518 00000 n -0000283544 00000 n -0000734908 00000 n +0000285740 00000 n +0000743457 00000 n 0000010579 00000 n 0000010629 00000 n -0000287237 00000 n -0000734829 00000 n +0000289496 00000 n +0000743378 00000 n 0000010690 00000 n 0000010746 00000 n -0000290642 00000 n -0000734736 00000 n +0000292740 00000 n +0000743285 00000 n 0000010801 00000 n 0000010852 00000 n -0000290771 00000 n -0000734643 00000 n +0000292869 00000 n +0000743192 00000 n 0000010907 00000 n 0000010971 00000 n -0000295142 00000 n -0000734550 00000 n +0000297630 00000 n +0000743099 00000 n 0000011026 00000 n 0000011090 00000 n -0000295271 00000 n -0000734457 00000 n +0000301399 00000 n +0000743006 00000 n 0000011145 00000 n 0000011222 00000 n -0000298928 00000 n -0000734364 00000 n +0000301528 00000 n +0000742913 00000 n 0000011277 00000 n 0000011334 00000 n -0000299057 00000 n -0000734271 00000 n +0000301657 00000 n +0000742820 00000 n 0000011389 00000 n 0000011459 00000 n -0000299186 00000 n -0000734178 00000 n +0000301786 00000 n +0000742727 00000 n 0000011514 00000 n 0000011563 00000 n -0000302629 00000 n -0000734085 00000 n +0000305229 00000 n +0000742634 00000 n 0000011618 00000 n 0000011680 00000 n -0000304248 00000 n -0000733992 00000 n +0000306854 00000 n +0000742541 00000 n 0000011735 00000 n 0000011784 00000 n -0000308427 00000 n -0000733874 00000 n +0000311033 00000 n +0000742423 00000 n 0000011839 00000 n 0000011901 00000 n -0000308556 00000 n -0000733795 00000 n +0000311162 00000 n +0000742344 00000 n 0000011961 00000 n 0000012000 00000 n -0000312881 00000 n -0000733702 00000 n +0000315487 00000 n +0000742251 00000 n 0000012060 00000 n 0000012094 00000 n -0000318771 00000 n -0000733609 00000 n +0000321377 00000 n +0000742158 00000 n 0000012154 00000 n 0000012195 00000 n -0000330157 00000 n -0000733530 00000 n +0000332763 00000 n +0000742079 00000 n 0000012255 00000 n 0000012307 00000 n -0000337397 00000 n -0000733398 00000 n +0000340003 00000 n +0000741947 00000 n 0000012356 00000 n 0000012389 00000 n -0000337526 00000 n -0000733280 00000 n +0000340132 00000 n +0000741829 00000 n 0000012443 00000 n 0000012515 00000 n -0000337654 00000 n -0000733201 00000 n +0000340260 00000 n +0000741750 00000 n 0000012574 00000 n 0000012618 00000 n -0000348444 00000 n -0000733122 00000 n +0000351050 00000 n +0000741671 00000 n 0000012677 00000 n 0000012730 00000 n -0000348831 00000 n -0000733029 00000 n +0000351437 00000 n +0000741578 00000 n 0000012784 00000 n 0000012834 00000 n -0000352195 00000 n -0000732936 00000 n +0000354801 00000 n +0000741485 00000 n 0000012888 00000 n 0000012926 00000 n -0000352454 00000 n -0000732843 00000 n +0000355060 00000 n +0000741392 00000 n 0000012980 00000 n 0000013029 00000 n -0000355319 00000 n -0000732711 00000 n +0000358145 00000 n +0000741260 00000 n 0000013083 00000 n 0000013135 00000 n -0000355447 00000 n -0000732632 00000 n +0000358274 00000 n +0000741181 00000 n 0000013194 00000 n -0000013246 00000 n -0000355576 00000 n -0000732539 00000 n -0000013305 00000 n -0000013358 00000 n -0000355705 00000 n -0000732460 00000 n -0000013417 00000 n -0000013466 00000 n -0000359352 00000 n -0000732367 00000 n -0000013520 00000 n -0000013600 00000 n -0000363488 00000 n -0000732288 00000 n -0000013654 00000 n -0000013703 00000 n -0000363617 00000 n -0000732170 00000 n -0000013752 00000 n -0000013792 00000 n -0000366917 00000 n -0000732091 00000 n -0000013851 00000 n -0000013898 00000 n -0000367046 00000 n -0000731973 00000 n -0000013952 00000 n -0000013997 00000 n -0000367175 00000 n -0000731894 00000 n +0000013239 00000 n +0000358403 00000 n +0000741088 00000 n +0000013298 00000 n +0000013350 00000 n +0000358532 00000 n +0000740995 00000 n +0000013409 00000 n +0000013462 00000 n +0000362179 00000 n +0000740916 00000 n +0000013521 00000 n +0000013570 00000 n +0000362307 00000 n +0000740823 00000 n +0000013624 00000 n +0000013704 00000 n +0000366071 00000 n +0000740744 00000 n +0000013758 00000 n +0000013807 00000 n +0000366200 00000 n +0000740626 00000 n +0000013856 00000 n +0000013896 00000 n +0000369640 00000 n +0000740547 00000 n +0000013955 00000 n +0000014002 00000 n +0000369769 00000 n +0000740429 00000 n 0000014056 00000 n -0000014115 00000 n -0000370864 00000 n -0000731801 00000 n -0000014174 00000 n -0000014238 00000 n -0000374585 00000 n -0000731708 00000 n -0000014297 00000 n -0000014353 00000 n -0000374843 00000 n -0000731615 00000 n -0000014412 00000 n -0000014470 00000 n -0000377514 00000 n -0000731536 00000 n -0000014529 00000 n -0000014591 00000 n -0000379759 00000 n -0000731403 00000 n -0000014638 00000 n -0000014690 00000 n -0000379888 00000 n -0000731324 00000 n -0000014739 00000 n -0000014783 00000 n -0000384086 00000 n -0000731192 00000 n -0000014832 00000 n -0000014873 00000 n -0000384215 00000 n -0000731113 00000 n -0000014927 00000 n -0000014975 00000 n -0000384343 00000 n -0000731034 00000 n -0000015029 00000 n -0000015080 00000 n -0000384472 00000 n -0000730955 00000 n -0000015129 00000 n -0000015176 00000 n -0000388739 00000 n -0000730822 00000 n -0000015223 00000 n -0000015260 00000 n -0000388868 00000 n -0000730704 00000 n -0000015309 00000 n -0000015348 00000 n -0000388997 00000 n -0000730639 00000 n -0000015402 00000 n -0000015480 00000 n -0000389126 00000 n -0000730546 00000 n -0000015529 00000 n -0000015596 00000 n -0000389255 00000 n -0000730467 00000 n -0000015645 00000 n -0000015690 00000 n -0000392694 00000 n -0000730334 00000 n -0000015738 00000 n -0000015770 00000 n -0000392823 00000 n -0000730216 00000 n -0000015819 00000 n -0000015858 00000 n -0000392952 00000 n -0000730151 00000 n -0000015912 00000 n -0000015973 00000 n -0000396633 00000 n -0000730019 00000 n -0000016022 00000 n -0000016079 00000 n -0000396762 00000 n -0000729954 00000 n -0000016133 00000 n -0000016182 00000 n -0000396891 00000 n -0000729836 00000 n -0000016231 00000 n -0000016293 00000 n -0000397020 00000 n -0000729757 00000 n -0000016347 00000 n -0000016402 00000 n -0000421042 00000 n -0000729664 00000 n -0000016456 00000 n -0000016497 00000 n -0000421171 00000 n -0000729585 00000 n -0000016551 00000 n -0000016603 00000 n -0000423902 00000 n -0000729465 00000 n -0000016651 00000 n -0000016685 00000 n -0000424031 00000 n -0000729386 00000 n -0000016734 00000 n -0000016761 00000 n -0000441854 00000 n -0000729293 00000 n -0000016810 00000 n +0000014101 00000 n +0000369898 00000 n +0000740350 00000 n +0000014160 00000 n +0000014219 00000 n +0000373654 00000 n +0000740257 00000 n +0000014278 00000 n +0000014342 00000 n +0000377121 00000 n +0000740164 00000 n +0000014401 00000 n +0000014457 00000 n +0000380138 00000 n +0000740071 00000 n +0000014516 00000 n +0000014574 00000 n +0000380396 00000 n +0000739992 00000 n +0000014633 00000 n +0000014695 00000 n +0000382641 00000 n +0000739859 00000 n +0000014742 00000 n +0000014794 00000 n +0000382770 00000 n +0000739780 00000 n +0000014843 00000 n +0000014887 00000 n +0000386969 00000 n +0000739648 00000 n +0000014936 00000 n +0000014977 00000 n +0000387098 00000 n +0000739569 00000 n +0000015031 00000 n +0000015079 00000 n +0000387226 00000 n +0000739490 00000 n +0000015133 00000 n +0000015184 00000 n +0000387355 00000 n +0000739411 00000 n +0000015233 00000 n +0000015280 00000 n +0000391622 00000 n +0000739278 00000 n +0000015327 00000 n +0000015364 00000 n +0000391751 00000 n +0000739160 00000 n +0000015413 00000 n +0000015452 00000 n +0000391880 00000 n +0000739095 00000 n +0000015506 00000 n +0000015584 00000 n +0000392009 00000 n +0000739002 00000 n +0000015633 00000 n +0000015700 00000 n +0000392138 00000 n +0000738923 00000 n +0000015749 00000 n +0000015794 00000 n +0000395578 00000 n +0000738790 00000 n +0000015842 00000 n +0000015874 00000 n +0000395707 00000 n +0000738672 00000 n +0000015923 00000 n +0000015962 00000 n +0000395836 00000 n +0000738607 00000 n +0000016016 00000 n +0000016077 00000 n +0000399517 00000 n +0000738475 00000 n +0000016126 00000 n +0000016183 00000 n +0000399646 00000 n +0000738410 00000 n +0000016237 00000 n +0000016286 00000 n +0000399775 00000 n +0000738292 00000 n +0000016335 00000 n +0000016397 00000 n +0000399904 00000 n +0000738213 00000 n +0000016451 00000 n +0000016506 00000 n +0000423926 00000 n +0000738120 00000 n +0000016560 00000 n +0000016601 00000 n +0000424055 00000 n +0000738041 00000 n +0000016655 00000 n +0000016707 00000 n +0000426786 00000 n +0000737921 00000 n +0000016755 00000 n +0000016789 00000 n +0000426915 00000 n +0000737842 00000 n 0000016838 00000 n -0000449343 00000 n -0000729200 00000 n -0000016887 00000 n -0000016927 00000 n -0000452138 00000 n -0000729107 00000 n -0000016976 00000 n -0000017019 00000 n -0000458062 00000 n -0000729014 00000 n -0000017068 00000 n -0000017105 00000 n -0000464564 00000 n -0000728921 00000 n -0000017154 00000 n -0000017193 00000 n -0000476717 00000 n -0000728828 00000 n -0000017242 00000 n -0000017281 00000 n -0000480140 00000 n -0000728735 00000 n -0000017330 00000 n -0000017369 00000 n -0000486583 00000 n -0000728642 00000 n -0000017418 00000 n -0000017447 00000 n -0000496757 00000 n -0000728549 00000 n -0000017497 00000 n -0000017530 00000 n -0000506693 00000 n -0000728456 00000 n -0000017580 00000 n -0000017609 00000 n -0000513987 00000 n -0000728363 00000 n -0000017659 00000 n -0000017693 00000 n -0000519675 00000 n -0000728284 00000 n -0000017743 00000 n -0000017780 00000 n -0000018149 00000 n -0000018271 00000 n -0000026100 00000 n -0000017833 00000 n -0000025974 00000 n -0000026037 00000 n -0000723763 00000 n -0000697820 00000 n -0000723589 00000 n -0000724788 00000 n -0000021134 00000 n -0000021351 00000 n -0000021420 00000 n -0000021489 00000 n -0000021557 00000 n -0000021625 00000 n -0000021674 00000 n -0000021721 00000 n -0000022054 00000 n -0000022076 00000 n -0000022244 00000 n -0000022409 00000 n -0000022578 00000 n -0000022757 00000 n -0000023066 00000 n -0000023226 00000 n -0000027466 00000 n -0000027281 00000 n -0000026200 00000 n -0000027403 00000 n -0000696599 00000 n -0000670078 00000 n -0000696425 00000 n -0000669393 00000 n -0000667249 00000 n -0000669229 00000 n -0000039173 00000 n -0000030522 00000 n -0000027551 00000 n -0000039047 00000 n -0000039110 00000 n -0000031056 00000 n -0000031210 00000 n -0000031367 00000 n -0000031524 00000 n -0000031680 00000 n -0000031837 00000 n -0000031999 00000 n -0000032160 00000 n -0000032321 00000 n -0000032483 00000 n -0000032650 00000 n -0000032817 00000 n -0000032982 00000 n -0000033144 00000 n -0000033310 00000 n -0000033471 00000 n -0000033626 00000 n -0000033783 00000 n -0000033939 00000 n -0000034096 00000 n -0000034253 00000 n -0000034410 00000 n -0000034564 00000 n -0000034720 00000 n -0000034882 00000 n -0000035044 00000 n -0000035200 00000 n -0000035357 00000 n -0000035519 00000 n -0000035686 00000 n -0000035852 00000 n -0000036013 00000 n -0000036168 00000 n -0000036325 00000 n -0000036482 00000 n -0000036644 00000 n -0000036801 00000 n -0000036958 00000 n -0000037120 00000 n -0000037277 00000 n -0000037439 00000 n -0000037606 00000 n -0000037772 00000 n -0000037934 00000 n -0000038096 00000 n -0000038258 00000 n -0000038420 00000 n -0000038582 00000 n -0000038737 00000 n -0000038892 00000 n -0000052547 00000 n -0000042497 00000 n -0000039258 00000 n -0000052484 00000 n -0000666698 00000 n -0000649617 00000 n -0000666514 00000 n -0000043087 00000 n -0000043250 00000 n -0000043412 00000 n -0000043575 00000 n -0000043733 00000 n -0000043896 00000 n -0000044059 00000 n -0000044214 00000 n -0000044372 00000 n -0000044530 00000 n -0000044686 00000 n -0000044844 00000 n -0000045007 00000 n -0000045175 00000 n -0000045343 00000 n -0000045506 00000 n -0000045674 00000 n -0000045842 00000 n -0000046000 00000 n -0000046163 00000 n -0000046326 00000 n -0000046488 00000 n -0000046650 00000 n -0000046813 00000 n -0000046975 00000 n -0000047137 00000 n -0000047300 00000 n -0000047463 00000 n -0000047626 00000 n -0000047795 00000 n -0000047964 00000 n -0000048133 00000 n -0000048296 00000 n -0000048460 00000 n -0000048624 00000 n -0000048787 00000 n -0000048951 00000 n -0000049115 00000 n -0000049283 00000 n -0000049452 00000 n -0000049621 00000 n -0000049790 00000 n -0000049959 00000 n -0000050128 00000 n -0000050297 00000 n -0000050466 00000 n -0000050635 00000 n -0000050805 00000 n -0000050975 00000 n -0000051145 00000 n -0000051315 00000 n -0000051485 00000 n -0000051655 00000 n -0000051824 00000 n -0000051994 00000 n -0000052161 00000 n -0000052322 00000 n -0000065709 00000 n -0000056176 00000 n -0000052645 00000 n -0000065646 00000 n -0000056750 00000 n -0000056913 00000 n -0000057076 00000 n -0000057239 00000 n -0000057402 00000 n -0000057565 00000 n -0000057728 00000 n -0000057890 00000 n -0000058051 00000 n -0000058218 00000 n -0000058386 00000 n -0000058554 00000 n -0000058722 00000 n -0000058879 00000 n -0000059039 00000 n -0000059205 00000 n -0000059372 00000 n -0000059534 00000 n -0000059696 00000 n -0000059858 00000 n -0000060019 00000 n -0000060185 00000 n -0000060352 00000 n -0000060519 00000 n -0000060681 00000 n -0000060843 00000 n -0000061000 00000 n -0000061167 00000 n -0000061329 00000 n -0000061496 00000 n -0000061663 00000 n -0000061830 00000 n -0000648728 00000 n -0000627397 00000 n -0000648554 00000 n -0000061997 00000 n -0000062164 00000 n -0000062318 00000 n -0000062475 00000 n -0000062632 00000 n -0000062794 00000 n -0000062956 00000 n -0000063113 00000 n -0000063268 00000 n -0000063425 00000 n -0000063587 00000 n -0000063744 00000 n -0000063901 00000 n -0000064057 00000 n -0000064214 00000 n -0000064376 00000 n -0000064533 00000 n -0000064695 00000 n -0000064852 00000 n -0000065014 00000 n -0000065176 00000 n -0000065337 00000 n -0000065491 00000 n -0000068921 00000 n -0000066744 00000 n -0000065820 00000 n -0000068858 00000 n -0000066974 00000 n -0000067131 00000 n -0000067288 00000 n -0000067444 00000 n -0000067601 00000 n -0000067758 00000 n -0000067915 00000 n -0000068072 00000 n -0000068229 00000 n -0000068385 00000 n -0000626431 00000 n -0000606464 00000 n -0000626258 00000 n -0000068543 00000 n -0000068700 00000 n -0000072084 00000 n -0000071274 00000 n +0000016865 00000 n +0000444739 00000 n +0000737749 00000 n +0000016914 00000 n +0000016942 00000 n +0000452228 00000 n +0000737656 00000 n +0000016991 00000 n +0000017031 00000 n +0000455023 00000 n +0000737563 00000 n +0000017080 00000 n +0000017123 00000 n +0000461204 00000 n +0000737470 00000 n +0000017172 00000 n +0000017209 00000 n +0000467829 00000 n +0000737377 00000 n +0000017258 00000 n +0000017297 00000 n +0000480210 00000 n +0000737284 00000 n +0000017346 00000 n +0000017385 00000 n +0000483306 00000 n +0000737191 00000 n +0000017434 00000 n +0000017473 00000 n +0000489586 00000 n +0000737098 00000 n +0000017522 00000 n +0000017551 00000 n +0000499397 00000 n +0000737005 00000 n +0000017601 00000 n +0000017634 00000 n +0000513699 00000 n +0000736912 00000 n +0000017684 00000 n +0000017713 00000 n +0000516926 00000 n +0000736819 00000 n +0000017763 00000 n +0000017797 00000 n +0000522834 00000 n +0000736740 00000 n +0000017847 00000 n +0000017884 00000 n +0000018253 00000 n +0000018375 00000 n +0000026204 00000 n +0000017937 00000 n +0000026078 00000 n +0000026141 00000 n +0000732191 00000 n +0000706248 00000 n +0000732017 00000 n +0000733216 00000 n +0000021238 00000 n +0000021455 00000 n +0000021524 00000 n +0000021593 00000 n +0000021661 00000 n +0000021729 00000 n +0000021778 00000 n +0000021825 00000 n +0000022158 00000 n +0000022180 00000 n +0000022348 00000 n +0000022513 00000 n +0000022682 00000 n +0000022861 00000 n +0000023170 00000 n +0000023330 00000 n +0000027570 00000 n +0000027385 00000 n +0000026304 00000 n +0000027507 00000 n +0000705027 00000 n +0000678506 00000 n +0000704853 00000 n +0000677821 00000 n +0000675676 00000 n +0000677657 00000 n +0000039277 00000 n +0000030626 00000 n +0000027655 00000 n +0000039151 00000 n +0000039214 00000 n +0000031160 00000 n +0000031314 00000 n +0000031471 00000 n +0000031628 00000 n +0000031784 00000 n +0000031941 00000 n +0000032103 00000 n +0000032264 00000 n +0000032425 00000 n +0000032587 00000 n +0000032754 00000 n +0000032921 00000 n +0000033086 00000 n +0000033248 00000 n +0000033414 00000 n +0000033575 00000 n +0000033730 00000 n +0000033887 00000 n +0000034043 00000 n +0000034200 00000 n +0000034357 00000 n +0000034514 00000 n +0000034668 00000 n +0000034824 00000 n +0000034986 00000 n +0000035148 00000 n +0000035304 00000 n +0000035461 00000 n +0000035623 00000 n +0000035790 00000 n +0000035956 00000 n +0000036117 00000 n +0000036272 00000 n +0000036429 00000 n +0000036586 00000 n +0000036748 00000 n +0000036905 00000 n +0000037062 00000 n +0000037224 00000 n +0000037381 00000 n +0000037543 00000 n +0000037710 00000 n +0000037876 00000 n +0000038038 00000 n +0000038200 00000 n +0000038362 00000 n +0000038524 00000 n +0000038686 00000 n +0000038841 00000 n +0000038996 00000 n +0000052649 00000 n +0000042603 00000 n +0000039362 00000 n +0000052586 00000 n +0000675125 00000 n +0000658044 00000 n +0000674941 00000 n +0000043193 00000 n +0000043356 00000 n +0000043518 00000 n +0000043681 00000 n +0000043839 00000 n +0000044002 00000 n +0000044165 00000 n +0000044320 00000 n +0000044478 00000 n +0000044636 00000 n +0000044792 00000 n +0000044950 00000 n +0000045113 00000 n +0000045281 00000 n +0000045449 00000 n +0000045612 00000 n +0000045780 00000 n +0000045948 00000 n +0000046105 00000 n +0000046268 00000 n +0000046431 00000 n +0000046593 00000 n +0000046755 00000 n +0000046918 00000 n +0000047080 00000 n +0000047242 00000 n +0000047405 00000 n +0000047568 00000 n +0000047731 00000 n +0000047899 00000 n +0000048068 00000 n +0000048237 00000 n +0000048400 00000 n +0000048564 00000 n +0000048728 00000 n +0000048891 00000 n +0000049055 00000 n +0000049219 00000 n +0000049388 00000 n +0000049557 00000 n +0000049726 00000 n +0000049895 00000 n +0000050064 00000 n +0000050233 00000 n +0000050402 00000 n +0000050571 00000 n +0000050740 00000 n +0000050910 00000 n +0000051080 00000 n +0000051249 00000 n +0000051419 00000 n +0000051589 00000 n +0000051757 00000 n +0000051926 00000 n +0000052096 00000 n +0000052263 00000 n +0000052424 00000 n +0000065826 00000 n +0000056283 00000 n +0000052747 00000 n +0000065763 00000 n +0000056857 00000 n +0000057020 00000 n +0000057183 00000 n +0000057346 00000 n +0000057509 00000 n +0000057672 00000 n +0000057835 00000 n +0000057997 00000 n +0000058160 00000 n +0000058328 00000 n +0000058496 00000 n +0000058664 00000 n +0000058832 00000 n +0000058989 00000 n +0000059149 00000 n +0000059315 00000 n +0000059482 00000 n +0000059644 00000 n +0000059806 00000 n +0000059967 00000 n +0000060128 00000 n +0000060294 00000 n +0000060461 00000 n +0000060628 00000 n +0000060795 00000 n +0000060957 00000 n +0000061119 00000 n +0000061276 00000 n +0000061443 00000 n +0000061605 00000 n +0000061772 00000 n +0000061939 00000 n +0000062106 00000 n +0000657155 00000 n +0000635823 00000 n +0000656981 00000 n +0000062273 00000 n +0000062439 00000 n +0000062594 00000 n +0000062750 00000 n +0000062906 00000 n +0000063068 00000 n +0000063230 00000 n +0000063387 00000 n +0000063542 00000 n +0000063699 00000 n +0000063861 00000 n +0000064018 00000 n +0000064175 00000 n +0000064331 00000 n +0000064488 00000 n +0000064650 00000 n +0000064807 00000 n +0000064969 00000 n +0000065126 00000 n +0000065288 00000 n +0000065449 00000 n +0000065609 00000 n +0000069240 00000 n +0000066898 00000 n +0000065937 00000 n +0000069177 00000 n +0000067136 00000 n +0000067293 00000 n +0000067450 00000 n +0000067605 00000 n +0000067762 00000 n +0000067919 00000 n +0000068076 00000 n +0000068233 00000 n +0000068390 00000 n +0000068546 00000 n +0000068704 00000 n +0000634857 00000 n +0000614890 00000 n +0000634684 00000 n +0000068861 00000 n 0000069019 00000 n -0000071396 00000 n -0000071520 00000 n -0000071645 00000 n -0000071770 00000 n -0000071895 00000 n -0000071958 00000 n -0000072021 00000 n -0000605670 00000 n -0000587353 00000 n -0000605497 00000 n -0000724906 00000 n -0000076655 00000 n -0000075475 00000 n -0000072208 00000 n -0000075969 00000 n -0000076032 00000 n -0000076095 00000 n -0000076219 00000 n -0000076344 00000 n -0000076469 00000 n -0000075625 00000 n -0000075818 00000 n -0000076592 00000 n -0000337590 00000 n -0000397084 00000 n -0000081310 00000 n -0000080274 00000 n -0000076779 00000 n -0000080747 00000 n -0000080872 00000 n -0000080424 00000 n -0000080586 00000 n -0000080997 00000 n -0000081122 00000 n -0000081247 00000 n -0000097234 00000 n -0000084532 00000 n -0000083972 00000 n -0000081434 00000 n -0000084094 00000 n -0000084219 00000 n -0000084344 00000 n -0000084469 00000 n -0000087959 00000 n -0000086818 00000 n -0000084643 00000 n -0000087272 00000 n -0000087397 00000 n -0000087522 00000 n -0000087647 00000 n -0000087772 00000 n -0000086968 00000 n -0000087120 00000 n -0000087896 00000 n -0000287301 00000 n -0000089040 00000 n -0000088729 00000 n -0000088044 00000 n -0000088851 00000 n -0000088976 00000 n -0000091137 00000 n -0000090434 00000 n -0000089138 00000 n -0000090560 00000 n -0000090688 00000 n -0000090815 00000 n -0000090943 00000 n -0000091072 00000 n -0000725024 00000 n -0000094066 00000 n -0000093177 00000 n -0000091236 00000 n -0000093485 00000 n -0000093614 00000 n -0000093679 00000 n -0000093744 00000 n -0000093324 00000 n -0000093873 00000 n -0000094002 00000 n -0000271243 00000 n -0000097427 00000 n -0000096979 00000 n -0000094178 00000 n -0000097105 00000 n -0000586678 00000 n -0000574689 00000 n -0000586499 00000 n -0000097362 00000 n -0000101249 00000 n -0000101058 00000 n -0000097553 00000 n -0000101184 00000 n -0000574148 00000 n -0000564404 00000 n -0000573969 00000 n -0000105860 00000 n -0000105461 00000 n -0000101415 00000 n -0000105795 00000 n -0000105608 00000 n -0000172253 00000 n -0000108206 00000 n -0000107756 00000 n -0000105999 00000 n -0000107882 00000 n -0000108011 00000 n -0000108076 00000 n -0000108141 00000 n -0000110935 00000 n -0000113482 00000 n -0000110779 00000 n -0000108331 00000 n -0000112901 00000 n -0000113030 00000 n -0000113159 00000 n -0000112578 00000 n -0000112740 00000 n -0000563534 00000 n -0000554114 00000 n -0000563360 00000 n -0000553550 00000 n -0000544464 00000 n -0000553375 00000 n -0000113288 00000 n -0000113417 00000 n -0000725149 00000 n -0000112407 00000 n -0000112465 00000 n -0000112555 00000 n -0000212434 00000 n -0000248146 00000 n -0000118002 00000 n -0000117067 00000 n -0000113638 00000 n -0000117550 00000 n -0000117679 00000 n -0000117223 00000 n -0000117388 00000 n -0000117808 00000 n -0000117937 00000 n -0000401111 00000 n -0000121616 00000 n -0000121236 00000 n -0000118154 00000 n -0000121551 00000 n -0000121383 00000 n -0000122866 00000 n -0000122675 00000 n -0000121741 00000 n -0000122801 00000 n -0000125569 00000 n -0000124992 00000 n -0000122965 00000 n -0000125118 00000 n -0000125247 00000 n -0000125376 00000 n -0000125505 00000 n -0000128809 00000 n -0000128102 00000 n -0000125707 00000 n -0000128228 00000 n -0000128357 00000 n -0000128486 00000 n -0000128615 00000 n -0000128744 00000 n -0000133116 00000 n -0000132218 00000 n -0000128934 00000 n -0000132536 00000 n -0000132665 00000 n -0000132365 00000 n -0000132794 00000 n -0000132923 00000 n -0000133051 00000 n -0000725274 00000 n -0000330221 00000 n -0000137152 00000 n -0000136574 00000 n -0000133241 00000 n -0000136700 00000 n -0000136829 00000 n -0000136958 00000 n -0000137087 00000 n -0000140613 00000 n -0000140293 00000 n -0000137290 00000 n -0000140419 00000 n -0000140548 00000 n -0000143945 00000 n -0000143186 00000 n -0000140725 00000 n -0000143494 00000 n -0000143623 00000 n -0000143333 00000 n -0000143752 00000 n -0000143880 00000 n -0000396826 00000 n -0000146685 00000 n -0000146107 00000 n -0000144113 00000 n -0000146233 00000 n -0000146362 00000 n -0000146491 00000 n -0000146620 00000 n -0000147125 00000 n -0000146934 00000 n -0000146784 00000 n -0000147060 00000 n -0000151127 00000 n -0000150361 00000 n -0000147167 00000 n -0000150675 00000 n -0000150804 00000 n -0000150932 00000 n -0000150997 00000 n -0000151062 00000 n -0000150508 00000 n -0000725399 00000 n -0000155623 00000 n -0000155815 00000 n -0000155368 00000 n -0000151226 00000 n -0000155494 00000 n -0000155750 00000 n -0000159694 00000 n -0000159117 00000 n -0000155940 00000 n -0000159243 00000 n -0000159371 00000 n -0000159500 00000 n -0000159629 00000 n -0000162513 00000 n -0000163892 00000 n -0000162387 00000 n -0000159832 00000 n -0000163439 00000 n -0000163568 00000 n -0000163697 00000 n -0000163762 00000 n -0000163827 00000 n -0000166969 00000 n -0000166262 00000 n -0000164047 00000 n -0000166388 00000 n -0000166517 00000 n -0000166645 00000 n -0000166710 00000 n -0000166775 00000 n -0000166904 00000 n -0000172576 00000 n -0000171658 00000 n -0000167081 00000 n -0000172124 00000 n -0000171814 00000 n -0000171965 00000 n -0000172382 00000 n -0000172511 00000 n -0000523089 00000 n -0000176415 00000 n -0000175144 00000 n -0000172714 00000 n -0000175834 00000 n -0000175963 00000 n -0000176092 00000 n -0000175309 00000 n -0000175461 00000 n -0000175647 00000 n -0000176221 00000 n -0000176350 00000 n -0000725524 00000 n -0000180646 00000 n -0000180326 00000 n -0000176541 00000 n -0000180452 00000 n -0000180581 00000 n -0000184122 00000 n -0000183743 00000 n -0000180771 00000 n -0000184057 00000 n -0000183890 00000 n -0000187139 00000 n -0000187334 00000 n -0000186884 00000 n -0000184234 00000 n -0000187010 00000 n -0000187204 00000 n -0000187269 00000 n -0000190703 00000 n -0000190512 00000 n -0000187446 00000 n -0000190638 00000 n -0000195014 00000 n -0000194436 00000 n -0000190815 00000 n -0000194562 00000 n -0000194691 00000 n -0000194756 00000 n -0000194821 00000 n -0000194950 00000 n -0000198225 00000 n -0000197183 00000 n -0000195126 00000 n -0000197644 00000 n -0000197773 00000 n -0000197339 00000 n -0000197491 00000 n -0000197902 00000 n -0000198031 00000 n -0000198160 00000 n -0000725649 00000 n -0000199777 00000 n -0000199586 00000 n -0000198337 00000 n -0000199712 00000 n -0000201300 00000 n -0000201109 00000 n -0000199876 00000 n -0000201235 00000 n -0000204105 00000 n -0000203785 00000 n -0000201399 00000 n -0000203911 00000 n -0000204040 00000 n -0000208528 00000 n -0000208159 00000 n -0000204243 00000 n -0000208463 00000 n -0000208306 00000 n -0000366981 00000 n -0000212499 00000 n -0000212179 00000 n -0000208640 00000 n -0000212305 00000 n -0000216337 00000 n -0000216017 00000 n -0000212624 00000 n -0000216143 00000 n -0000216208 00000 n -0000216272 00000 n -0000725774 00000 n -0000221633 00000 n -0000220341 00000 n -0000216462 00000 n -0000221568 00000 n -0000220533 00000 n -0000220687 00000 n -0000220842 00000 n -0000221027 00000 n -0000221201 00000 n -0000221386 00000 n -0000290835 00000 n -0000225939 00000 n -0000225748 00000 n -0000221814 00000 n -0000225874 00000 n -0000229702 00000 n -0000229511 00000 n -0000226064 00000 n -0000229637 00000 n -0000234015 00000 n -0000233073 00000 n -0000229814 00000 n -0000233563 00000 n -0000233692 00000 n -0000233229 00000 n -0000233821 00000 n -0000233950 00000 n -0000233397 00000 n -0000304312 00000 n -0000237811 00000 n -0000237249 00000 n -0000234127 00000 n -0000237746 00000 n -0000237405 00000 n -0000237576 00000 n -0000384536 00000 n -0000241235 00000 n -0000240788 00000 n -0000237980 00000 n -0000240914 00000 n -0000241042 00000 n -0000241171 00000 n -0000725899 00000 n -0000244802 00000 n -0000244611 00000 n -0000241360 00000 n -0000244737 00000 n -0000248211 00000 n -0000247891 00000 n -0000244971 00000 n -0000248017 00000 n -0000251891 00000 n -0000251700 00000 n -0000248367 00000 n -0000251826 00000 n -0000256213 00000 n -0000255399 00000 n -0000252060 00000 n -0000255890 00000 n -0000256019 00000 n -0000255555 00000 n -0000256148 00000 n -0000255715 00000 n -0000260364 00000 n -0000259868 00000 n -0000256368 00000 n -0000260170 00000 n -0000260299 00000 n -0000260015 00000 n -0000264002 00000 n -0000263553 00000 n -0000260489 00000 n -0000263679 00000 n -0000263808 00000 n -0000263937 00000 n -0000726024 00000 n -0000267909 00000 n -0000267242 00000 n -0000264157 00000 n -0000267715 00000 n -0000267844 00000 n -0000267398 00000 n -0000267560 00000 n -0000271438 00000 n -0000270798 00000 n -0000268078 00000 n -0000271114 00000 n -0000270945 00000 n -0000271308 00000 n -0000271373 00000 n -0000275474 00000 n -0000274971 00000 n -0000271621 00000 n -0000275280 00000 n -0000275409 00000 n -0000275118 00000 n -0000280264 00000 n -0000279585 00000 n -0000275642 00000 n -0000280070 00000 n -0000279741 00000 n -0000544109 00000 n -0000542110 00000 n -0000543944 00000 n -0000280199 00000 n -0000279902 00000 n -0000363552 00000 n -0000299250 00000 n -0000283673 00000 n -0000283353 00000 n -0000280390 00000 n -0000283479 00000 n -0000283608 00000 n -0000287365 00000 n -0000287046 00000 n -0000283798 00000 n -0000287172 00000 n -0000726149 00000 n -0000290900 00000 n -0000290451 00000 n -0000287507 00000 n -0000290577 00000 n -0000290706 00000 n -0000295399 00000 n -0000294607 00000 n -0000291012 00000 n -0000295077 00000 n -0000294763 00000 n -0000294915 00000 n -0000295206 00000 n -0000295335 00000 n -0000299315 00000 n -0000298562 00000 n -0000295511 00000 n -0000298863 00000 n -0000298992 00000 n -0000299121 00000 n -0000298709 00000 n -0000302758 00000 n -0000302438 00000 n -0000299427 00000 n -0000302564 00000 n -0000302693 00000 n -0000304377 00000 n -0000304057 00000 n -0000302870 00000 n -0000304183 00000 n -0000305902 00000 n -0000305711 00000 n -0000304489 00000 n -0000305837 00000 n -0000726274 00000 n -0000308815 00000 n -0000308236 00000 n -0000306001 00000 n -0000308362 00000 n -0000308491 00000 n -0000308620 00000 n -0000308685 00000 n -0000308750 00000 n -0000313010 00000 n -0000312501 00000 n -0000308927 00000 n -0000312816 00000 n -0000312648 00000 n -0000312945 00000 n -0000523056 00000 n -0000318900 00000 n -0000316165 00000 n -0000313122 00000 n -0000318706 00000 n -0000318835 00000 n -0000316429 00000 n -0000316591 00000 n -0000316753 00000 n -0000316914 00000 n -0000317074 00000 n -0000317236 00000 n -0000317407 00000 n -0000317569 00000 n -0000317731 00000 n -0000317894 00000 n -0000318057 00000 n -0000318220 00000 n -0000318383 00000 n -0000318546 00000 n -0000324121 00000 n -0000322204 00000 n -0000319012 00000 n -0000324056 00000 n -0000322432 00000 n -0000322595 00000 n -0000322762 00000 n -0000322931 00000 n -0000323093 00000 n -0000323254 00000 n -0000323416 00000 n -0000323577 00000 n -0000323740 00000 n -0000323893 00000 n -0000330286 00000 n -0000327279 00000 n -0000324246 00000 n -0000330092 00000 n -0000327561 00000 n -0000327714 00000 n -0000327868 00000 n -0000328019 00000 n -0000328173 00000 n -0000328334 00000 n -0000328496 00000 n -0000328658 00000 n -0000328820 00000 n -0000328982 00000 n -0000329144 00000 n -0000329306 00000 n -0000329458 00000 n -0000329621 00000 n -0000329776 00000 n -0000329938 00000 n -0000333816 00000 n -0000333495 00000 n -0000330398 00000 n -0000333621 00000 n -0000333686 00000 n -0000333751 00000 n -0000726399 00000 n -0000338041 00000 n -0000336845 00000 n -0000333985 00000 n -0000337332 00000 n -0000337461 00000 n -0000337718 00000 n -0000337001 00000 n -0000337171 00000 n -0000337783 00000 n -0000337848 00000 n -0000337913 00000 n -0000337977 00000 n -0000341388 00000 n -0000341197 00000 n -0000338223 00000 n -0000341323 00000 n -0000345128 00000 n -0000344807 00000 n -0000341474 00000 n -0000344933 00000 n -0000344998 00000 n -0000345063 00000 n -0000348960 00000 n -0000348253 00000 n -0000345240 00000 n -0000348379 00000 n -0000348508 00000 n -0000348571 00000 n -0000348636 00000 n -0000348701 00000 n -0000348766 00000 n -0000348895 00000 n -0000352712 00000 n -0000351874 00000 n -0000349072 00000 n -0000352000 00000 n -0000352065 00000 n -0000352130 00000 n -0000352259 00000 n -0000352324 00000 n -0000352389 00000 n -0000352518 00000 n -0000352583 00000 n -0000352647 00000 n -0000355833 00000 n -0000355128 00000 n -0000352837 00000 n -0000355254 00000 n -0000355382 00000 n -0000355511 00000 n -0000355640 00000 n -0000355769 00000 n -0000726524 00000 n -0000359611 00000 n -0000359161 00000 n -0000356030 00000 n -0000359287 00000 n -0000359416 00000 n -0000359481 00000 n -0000359546 00000 n -0000363876 00000 n -0000363118 00000 n -0000359750 00000 n -0000363423 00000 n -0000363681 00000 n -0000363746 00000 n -0000363811 00000 n -0000363265 00000 n -0000367434 00000 n -0000366726 00000 n -0000364001 00000 n -0000366852 00000 n -0000367110 00000 n -0000367239 00000 n -0000367304 00000 n -0000367369 00000 n -0000371121 00000 n -0000370487 00000 n -0000367546 00000 n -0000370799 00000 n -0000370634 00000 n -0000370928 00000 n -0000370992 00000 n -0000371056 00000 n -0000523023 00000 n -0000375100 00000 n -0000374394 00000 n -0000371233 00000 n -0000374520 00000 n -0000374648 00000 n -0000374713 00000 n -0000374778 00000 n -0000374907 00000 n -0000374972 00000 n -0000375036 00000 n -0000377643 00000 n -0000377323 00000 n -0000375226 00000 n -0000377449 00000 n -0000541829 00000 n -0000534545 00000 n -0000541649 00000 n -0000377578 00000 n -0000726649 00000 n -0000378124 00000 n -0000377933 00000 n -0000377783 00000 n -0000378059 00000 n -0000380016 00000 n -0000379568 00000 n -0000378166 00000 n -0000379694 00000 n -0000379823 00000 n -0000379952 00000 n -0000384601 00000 n -0000383658 00000 n -0000380128 00000 n -0000384021 00000 n -0000534224 00000 n -0000525011 00000 n -0000534038 00000 n -0000383805 00000 n -0000384150 00000 n -0000384278 00000 n -0000384407 00000 n -0000385643 00000 n -0000385452 00000 n -0000384838 00000 n -0000385578 00000 n -0000386070 00000 n -0000385879 00000 n -0000385729 00000 n -0000386005 00000 n -0000389383 00000 n -0000388157 00000 n -0000386112 00000 n -0000388674 00000 n -0000388803 00000 n -0000388932 00000 n -0000389061 00000 n -0000389190 00000 n -0000389319 00000 n -0000388313 00000 n -0000388485 00000 n -0000726774 00000 n -0000389837 00000 n -0000389646 00000 n -0000389496 00000 n -0000389772 00000 n -0000393081 00000 n -0000392503 00000 n -0000389879 00000 n -0000392629 00000 n -0000392758 00000 n -0000392887 00000 n -0000393016 00000 n -0000397276 00000 n -0000396058 00000 n -0000393167 00000 n -0000396568 00000 n -0000396697 00000 n -0000396955 00000 n -0000396214 00000 n -0000396393 00000 n -0000397148 00000 n -0000397212 00000 n -0000404163 00000 n -0000400335 00000 n -0000397429 00000 n -0000400461 00000 n -0000400526 00000 n -0000400591 00000 n -0000400656 00000 n -0000400721 00000 n -0000400786 00000 n -0000400851 00000 n -0000400916 00000 n -0000400981 00000 n -0000401046 00000 n -0000401176 00000 n -0000401241 00000 n -0000401306 00000 n -0000401371 00000 n -0000401436 00000 n -0000401501 00000 n -0000401566 00000 n -0000401631 00000 n -0000401696 00000 n -0000401761 00000 n -0000401826 00000 n -0000401891 00000 n -0000401956 00000 n -0000402021 00000 n -0000402086 00000 n -0000402151 00000 n -0000402216 00000 n -0000402281 00000 n -0000402346 00000 n -0000402411 00000 n -0000402476 00000 n -0000402541 00000 n -0000402606 00000 n -0000402671 00000 n -0000402735 00000 n -0000402800 00000 n -0000402865 00000 n -0000402930 00000 n -0000402995 00000 n -0000403060 00000 n -0000403125 00000 n -0000403190 00000 n -0000403255 00000 n -0000403320 00000 n -0000403385 00000 n -0000403450 00000 n -0000403515 00000 n -0000403580 00000 n -0000403645 00000 n -0000403710 00000 n -0000403775 00000 n -0000403840 00000 n -0000403905 00000 n -0000403970 00000 n -0000404035 00000 n -0000404099 00000 n -0000410809 00000 n -0000407245 00000 n -0000404275 00000 n -0000407371 00000 n -0000407436 00000 n -0000407501 00000 n -0000407566 00000 n -0000407631 00000 n -0000407696 00000 n -0000407761 00000 n -0000407826 00000 n -0000407891 00000 n -0000407956 00000 n -0000408021 00000 n -0000408086 00000 n -0000408150 00000 n -0000408215 00000 n -0000408280 00000 n -0000408345 00000 n -0000408410 00000 n -0000408475 00000 n -0000408540 00000 n -0000408605 00000 n -0000408670 00000 n -0000408735 00000 n -0000408800 00000 n -0000408865 00000 n -0000408929 00000 n -0000408994 00000 n -0000409059 00000 n -0000409124 00000 n -0000409189 00000 n -0000409254 00000 n -0000409319 00000 n -0000409384 00000 n -0000409449 00000 n -0000409514 00000 n -0000409579 00000 n -0000409644 00000 n -0000409709 00000 n -0000409774 00000 n -0000409839 00000 n -0000409904 00000 n -0000409968 00000 n -0000410032 00000 n -0000410096 00000 n -0000410161 00000 n -0000410226 00000 n -0000410291 00000 n -0000410356 00000 n -0000410421 00000 n -0000410486 00000 n -0000410551 00000 n -0000410616 00000 n -0000410681 00000 n -0000410745 00000 n -0000416982 00000 n -0000413544 00000 n -0000410921 00000 n -0000413670 00000 n -0000413735 00000 n -0000413800 00000 n -0000413865 00000 n -0000413930 00000 n -0000413995 00000 n -0000414060 00000 n -0000414125 00000 n -0000414190 00000 n -0000414255 00000 n -0000414320 00000 n -0000414385 00000 n -0000414450 00000 n -0000414515 00000 n -0000414580 00000 n -0000414645 00000 n -0000414710 00000 n -0000414775 00000 n -0000414840 00000 n -0000414905 00000 n -0000414970 00000 n -0000415035 00000 n -0000415100 00000 n -0000415165 00000 n -0000415230 00000 n -0000415295 00000 n -0000415360 00000 n -0000415425 00000 n -0000415490 00000 n -0000415555 00000 n -0000415620 00000 n -0000415685 00000 n -0000415750 00000 n -0000415815 00000 n -0000415879 00000 n -0000415944 00000 n -0000416009 00000 n -0000416074 00000 n -0000416139 00000 n -0000416204 00000 n -0000416269 00000 n -0000416334 00000 n -0000416399 00000 n -0000416464 00000 n -0000416529 00000 n -0000416594 00000 n -0000416659 00000 n -0000416724 00000 n -0000416789 00000 n -0000416854 00000 n -0000416918 00000 n -0000726899 00000 n -0000421560 00000 n -0000419296 00000 n -0000417094 00000 n -0000419422 00000 n -0000419487 00000 n -0000419552 00000 n -0000419617 00000 n -0000419682 00000 n -0000419747 00000 n -0000419812 00000 n -0000419877 00000 n -0000419942 00000 n -0000420007 00000 n -0000420072 00000 n -0000420137 00000 n -0000420202 00000 n -0000420267 00000 n -0000420329 00000 n -0000420393 00000 n -0000420458 00000 n -0000420522 00000 n -0000420587 00000 n -0000420652 00000 n -0000420717 00000 n -0000420782 00000 n -0000420847 00000 n -0000420912 00000 n -0000420977 00000 n -0000421106 00000 n -0000421235 00000 n -0000421300 00000 n -0000421365 00000 n -0000421430 00000 n -0000421495 00000 n -0000424355 00000 n -0000423711 00000 n -0000421685 00000 n -0000423837 00000 n -0000423966 00000 n -0000424095 00000 n -0000424160 00000 n -0000424225 00000 n -0000424290 00000 n -0000428694 00000 n -0000428374 00000 n -0000424468 00000 n -0000428500 00000 n -0000428565 00000 n -0000428630 00000 n -0000432294 00000 n -0000432039 00000 n -0000428847 00000 n -0000432165 00000 n -0000432230 00000 n -0000435543 00000 n -0000435352 00000 n -0000432433 00000 n -0000435478 00000 n -0000439271 00000 n -0000439015 00000 n -0000435669 00000 n -0000439141 00000 n -0000439206 00000 n -0000727024 00000 n -0000442111 00000 n -0000441403 00000 n -0000439410 00000 n -0000441529 00000 n -0000441594 00000 n -0000441659 00000 n -0000441724 00000 n -0000441789 00000 n -0000441918 00000 n -0000441983 00000 n -0000442047 00000 n -0000446779 00000 n -0000446523 00000 n -0000442250 00000 n -0000446649 00000 n -0000446714 00000 n -0000449730 00000 n -0000448957 00000 n -0000446905 00000 n -0000449083 00000 n -0000449148 00000 n -0000449213 00000 n -0000449278 00000 n -0000449407 00000 n -0000449472 00000 n -0000449535 00000 n -0000449600 00000 n -0000449665 00000 n -0000452331 00000 n -0000451622 00000 n -0000449883 00000 n -0000451748 00000 n -0000451813 00000 n -0000451878 00000 n -0000451943 00000 n -0000452008 00000 n -0000452073 00000 n -0000452202 00000 n -0000452267 00000 n -0000455355 00000 n -0000454970 00000 n -0000452483 00000 n -0000455096 00000 n -0000455161 00000 n -0000455225 00000 n -0000455290 00000 n -0000458450 00000 n -0000457676 00000 n -0000455495 00000 n -0000457802 00000 n -0000457867 00000 n -0000457932 00000 n -0000457997 00000 n -0000458126 00000 n -0000458191 00000 n -0000458256 00000 n -0000458320 00000 n -0000458385 00000 n -0000727149 00000 n -0000461723 00000 n -0000461532 00000 n -0000458616 00000 n -0000461658 00000 n -0000464823 00000 n -0000464113 00000 n -0000461849 00000 n -0000464239 00000 n -0000464304 00000 n -0000464369 00000 n -0000464434 00000 n -0000464499 00000 n -0000464628 00000 n -0000464693 00000 n -0000464758 00000 n -0000468481 00000 n -0000468162 00000 n -0000464988 00000 n -0000468288 00000 n -0000468353 00000 n -0000468417 00000 n -0000471857 00000 n -0000471666 00000 n -0000468607 00000 n -0000471792 00000 n -0000474868 00000 n -0000474418 00000 n -0000471997 00000 n -0000474544 00000 n -0000474609 00000 n -0000474674 00000 n -0000474739 00000 n -0000474804 00000 n -0000477300 00000 n -0000476526 00000 n -0000475006 00000 n -0000476652 00000 n -0000476781 00000 n -0000476846 00000 n -0000476911 00000 n -0000476976 00000 n -0000477041 00000 n -0000477106 00000 n -0000477171 00000 n -0000477236 00000 n -0000727274 00000 n -0000480529 00000 n -0000479949 00000 n -0000477453 00000 n -0000480075 00000 n -0000480204 00000 n -0000480269 00000 n -0000480334 00000 n -0000480399 00000 n -0000480464 00000 n -0000483987 00000 n -0000483796 00000 n -0000480669 00000 n -0000483922 00000 n -0000486972 00000 n -0000486197 00000 n -0000484113 00000 n -0000486323 00000 n -0000486388 00000 n -0000486453 00000 n -0000486518 00000 n -0000486647 00000 n -0000486712 00000 n -0000486777 00000 n -0000486842 00000 n -0000486907 00000 n -0000490279 00000 n -0000490088 00000 n -0000487125 00000 n -0000490214 00000 n -0000493070 00000 n -0000492684 00000 n -0000490490 00000 n -0000492810 00000 n -0000492875 00000 n -0000492940 00000 n -0000493005 00000 n -0000497081 00000 n -0000496436 00000 n -0000493307 00000 n -0000496562 00000 n -0000496627 00000 n -0000496692 00000 n -0000496821 00000 n -0000496886 00000 n -0000496951 00000 n -0000497016 00000 n -0000727399 00000 n -0000501017 00000 n -0000500761 00000 n -0000497220 00000 n -0000500887 00000 n -0000500952 00000 n -0000504237 00000 n -0000503981 00000 n -0000501143 00000 n -0000504107 00000 n -0000504172 00000 n -0000506951 00000 n -0000506307 00000 n -0000504363 00000 n -0000506433 00000 n -0000506498 00000 n -0000506563 00000 n -0000506628 00000 n -0000506757 00000 n -0000506822 00000 n -0000506887 00000 n -0000510720 00000 n -0000510335 00000 n -0000507103 00000 n -0000510461 00000 n -0000510526 00000 n -0000510590 00000 n -0000510655 00000 n -0000514311 00000 n -0000513666 00000 n -0000510860 00000 n -0000513792 00000 n -0000513857 00000 n -0000513922 00000 n -0000514051 00000 n -0000514116 00000 n -0000514181 00000 n -0000514246 00000 n -0000516582 00000 n -0000516326 00000 n -0000514463 00000 n -0000516452 00000 n -0000516517 00000 n -0000727524 00000 n -0000520063 00000 n -0000519289 00000 n -0000516721 00000 n -0000519415 00000 n -0000519480 00000 n -0000519545 00000 n -0000519610 00000 n -0000519738 00000 n -0000519803 00000 n -0000519868 00000 n -0000519933 00000 n -0000519998 00000 n -0000522871 00000 n -0000522485 00000 n -0000520216 00000 n -0000522611 00000 n -0000522676 00000 n -0000522741 00000 n -0000522806 00000 n -0000523122 00000 n -0000534466 00000 n -0000542055 00000 n -0000544356 00000 n -0000544325 00000 n -0000553849 00000 n -0000563962 00000 n -0000574436 00000 n -0000587060 00000 n -0000606125 00000 n -0000627012 00000 n -0000649155 00000 n -0000667050 00000 n -0000669880 00000 n -0000669650 00000 n -0000697187 00000 n -0000724298 00000 n -0000727622 00000 n -0000727746 00000 n -0000727872 00000 n -0000727998 00000 n -0000728115 00000 n -0000728207 00000 n -0000744729 00000 n -0000763926 00000 n -0000763967 00000 n -0000764007 00000 n -0000764141 00000 n +0000072403 00000 n +0000071593 00000 n +0000069338 00000 n +0000071715 00000 n +0000071839 00000 n +0000071964 00000 n +0000072089 00000 n +0000072214 00000 n +0000072277 00000 n +0000072340 00000 n +0000614096 00000 n +0000595779 00000 n +0000613923 00000 n +0000733334 00000 n +0000076974 00000 n +0000075794 00000 n +0000072527 00000 n +0000076288 00000 n +0000076351 00000 n +0000076414 00000 n +0000076538 00000 n +0000076663 00000 n +0000076788 00000 n +0000075944 00000 n +0000076137 00000 n +0000076911 00000 n +0000340196 00000 n +0000399968 00000 n +0000081629 00000 n +0000080593 00000 n +0000077098 00000 n +0000081066 00000 n +0000081191 00000 n +0000080743 00000 n +0000080905 00000 n +0000081316 00000 n +0000081441 00000 n +0000081566 00000 n +0000097562 00000 n +0000084851 00000 n +0000084291 00000 n +0000081753 00000 n +0000084413 00000 n +0000084538 00000 n +0000084663 00000 n +0000084788 00000 n +0000088278 00000 n +0000087137 00000 n +0000084962 00000 n +0000087591 00000 n +0000087716 00000 n +0000087841 00000 n +0000087966 00000 n +0000088091 00000 n +0000087287 00000 n +0000087439 00000 n +0000088215 00000 n +0000289560 00000 n +0000089367 00000 n +0000089049 00000 n +0000088363 00000 n +0000089174 00000 n +0000089302 00000 n +0000091465 00000 n +0000090762 00000 n +0000089466 00000 n +0000090888 00000 n +0000091016 00000 n +0000091143 00000 n +0000091271 00000 n +0000091400 00000 n +0000733453 00000 n +0000094394 00000 n +0000093505 00000 n +0000091564 00000 n +0000093813 00000 n +0000093942 00000 n +0000094007 00000 n +0000094072 00000 n +0000093652 00000 n +0000094201 00000 n +0000094330 00000 n +0000273532 00000 n +0000097755 00000 n +0000097307 00000 n +0000094506 00000 n +0000097433 00000 n +0000595104 00000 n +0000583115 00000 n +0000594925 00000 n +0000097690 00000 n +0000101577 00000 n +0000101386 00000 n +0000097881 00000 n +0000101512 00000 n +0000582574 00000 n +0000572830 00000 n +0000582395 00000 n +0000106188 00000 n +0000105789 00000 n +0000101743 00000 n +0000106123 00000 n +0000105936 00000 n +0000174987 00000 n +0000108534 00000 n +0000108084 00000 n +0000106327 00000 n +0000108210 00000 n +0000108339 00000 n +0000108404 00000 n +0000108469 00000 n +0000111263 00000 n +0000113810 00000 n +0000111107 00000 n +0000108659 00000 n +0000113229 00000 n +0000113358 00000 n +0000113487 00000 n +0000112906 00000 n +0000113068 00000 n +0000571932 00000 n +0000562136 00000 n +0000571758 00000 n +0000561572 00000 n +0000552486 00000 n +0000561397 00000 n +0000113616 00000 n +0000113745 00000 n +0000733578 00000 n +0000112735 00000 n +0000112793 00000 n +0000112883 00000 n +0000215305 00000 n +0000250427 00000 n +0000118474 00000 n +0000117539 00000 n +0000113966 00000 n +0000118023 00000 n +0000118152 00000 n +0000117695 00000 n +0000117861 00000 n +0000118281 00000 n +0000118410 00000 n +0000403995 00000 n +0000122133 00000 n +0000121753 00000 n +0000118626 00000 n +0000122068 00000 n +0000121900 00000 n +0000123358 00000 n +0000123167 00000 n +0000122258 00000 n +0000123293 00000 n +0000126061 00000 n +0000125483 00000 n +0000123457 00000 n +0000125609 00000 n +0000125738 00000 n +0000125867 00000 n +0000125996 00000 n +0000129240 00000 n +0000128533 00000 n +0000126199 00000 n +0000128659 00000 n +0000128788 00000 n +0000128917 00000 n +0000129046 00000 n +0000129175 00000 n +0000133547 00000 n +0000132649 00000 n +0000129365 00000 n +0000132967 00000 n +0000133096 00000 n +0000132796 00000 n +0000133225 00000 n +0000133354 00000 n +0000133482 00000 n +0000733703 00000 n +0000332827 00000 n +0000137583 00000 n +0000137005 00000 n +0000133672 00000 n +0000137131 00000 n +0000137260 00000 n +0000137389 00000 n +0000137518 00000 n +0000141178 00000 n +0000140858 00000 n +0000137721 00000 n +0000140984 00000 n +0000141113 00000 n +0000144624 00000 n +0000144124 00000 n +0000141290 00000 n +0000144430 00000 n +0000552211 00000 n +0000548852 00000 n +0000552032 00000 n +0000144559 00000 n +0000144271 00000 n +0000399710 00000 n +0000146352 00000 n +0000145905 00000 n +0000144806 00000 n +0000146031 00000 n +0000146160 00000 n +0000146287 00000 n +0000146805 00000 n +0000146614 00000 n +0000146464 00000 n +0000146740 00000 n +0000149419 00000 n +0000148841 00000 n +0000146847 00000 n +0000148967 00000 n +0000149096 00000 n +0000149225 00000 n +0000149354 00000 n +0000733828 00000 n +0000149859 00000 n +0000149668 00000 n +0000149518 00000 n +0000149794 00000 n +0000153861 00000 n +0000153095 00000 n +0000149901 00000 n +0000153409 00000 n +0000153538 00000 n +0000153666 00000 n +0000153731 00000 n +0000153796 00000 n +0000153242 00000 n +0000158357 00000 n +0000158549 00000 n +0000158102 00000 n +0000153960 00000 n +0000158228 00000 n +0000158484 00000 n +0000162428 00000 n +0000161851 00000 n +0000158674 00000 n +0000161977 00000 n +0000162105 00000 n +0000162234 00000 n +0000162363 00000 n +0000165247 00000 n +0000166626 00000 n +0000165121 00000 n +0000162566 00000 n +0000166173 00000 n +0000166302 00000 n +0000166431 00000 n +0000166496 00000 n +0000166561 00000 n +0000169703 00000 n +0000168996 00000 n +0000166781 00000 n +0000169122 00000 n +0000169251 00000 n +0000169379 00000 n +0000169444 00000 n +0000169509 00000 n +0000169638 00000 n +0000733953 00000 n +0000175310 00000 n +0000174392 00000 n +0000169815 00000 n +0000174858 00000 n +0000174548 00000 n +0000174699 00000 n +0000175116 00000 n +0000175245 00000 n +0000527478 00000 n +0000179149 00000 n +0000177878 00000 n +0000175448 00000 n +0000178568 00000 n +0000178697 00000 n +0000178826 00000 n +0000178043 00000 n +0000178195 00000 n +0000178381 00000 n +0000178955 00000 n +0000179084 00000 n +0000183380 00000 n +0000183060 00000 n +0000179275 00000 n +0000183186 00000 n +0000183315 00000 n +0000186856 00000 n +0000186477 00000 n +0000183505 00000 n +0000186791 00000 n +0000186624 00000 n +0000189873 00000 n +0000190068 00000 n +0000189618 00000 n +0000186968 00000 n +0000189744 00000 n +0000189938 00000 n +0000190003 00000 n +0000193437 00000 n +0000193246 00000 n +0000190180 00000 n +0000193372 00000 n +0000734078 00000 n +0000197748 00000 n +0000197170 00000 n +0000193549 00000 n +0000197296 00000 n +0000197425 00000 n +0000197490 00000 n +0000197555 00000 n +0000197684 00000 n +0000200959 00000 n +0000199917 00000 n +0000197860 00000 n +0000200378 00000 n +0000200507 00000 n +0000200073 00000 n +0000200225 00000 n +0000200636 00000 n +0000200765 00000 n +0000200894 00000 n +0000202511 00000 n +0000202320 00000 n +0000201071 00000 n +0000202446 00000 n +0000204046 00000 n +0000203855 00000 n +0000202610 00000 n +0000203981 00000 n +0000206969 00000 n +0000206649 00000 n +0000204145 00000 n +0000206775 00000 n +0000206904 00000 n +0000211399 00000 n +0000211030 00000 n +0000207107 00000 n +0000211334 00000 n +0000211177 00000 n +0000734203 00000 n +0000369704 00000 n +0000215370 00000 n +0000215050 00000 n +0000211511 00000 n +0000215176 00000 n +0000219208 00000 n +0000218888 00000 n +0000215495 00000 n +0000219014 00000 n +0000219079 00000 n +0000219143 00000 n +0000224504 00000 n +0000223212 00000 n +0000219333 00000 n +0000224439 00000 n +0000223404 00000 n +0000223558 00000 n +0000223713 00000 n +0000223898 00000 n +0000224072 00000 n +0000224257 00000 n +0000292933 00000 n +0000228807 00000 n +0000228616 00000 n +0000224685 00000 n +0000228742 00000 n +0000232570 00000 n +0000232379 00000 n +0000228932 00000 n +0000232505 00000 n +0000236884 00000 n +0000235941 00000 n +0000232682 00000 n +0000236432 00000 n +0000236561 00000 n +0000236097 00000 n +0000236690 00000 n +0000236819 00000 n +0000236266 00000 n +0000734328 00000 n +0000306918 00000 n +0000240544 00000 n +0000239982 00000 n +0000236996 00000 n +0000240479 00000 n +0000240138 00000 n +0000240309 00000 n +0000387419 00000 n +0000243797 00000 n +0000243477 00000 n +0000240713 00000 n +0000243603 00000 n +0000243732 00000 n +0000247313 00000 n +0000246993 00000 n +0000243922 00000 n +0000247119 00000 n +0000247248 00000 n +0000250492 00000 n +0000250172 00000 n +0000247425 00000 n +0000250298 00000 n +0000254305 00000 n +0000254114 00000 n +0000250648 00000 n +0000254240 00000 n +0000258187 00000 n +0000257558 00000 n +0000254460 00000 n +0000257865 00000 n +0000257994 00000 n +0000257705 00000 n +0000258123 00000 n +0000734453 00000 n +0000262381 00000 n +0000261702 00000 n +0000258356 00000 n +0000262187 00000 n +0000261858 00000 n +0000262316 00000 n +0000262032 00000 n +0000266404 00000 n +0000265955 00000 n +0000262493 00000 n +0000266081 00000 n +0000266210 00000 n +0000266339 00000 n +0000270440 00000 n +0000269774 00000 n +0000266559 00000 n +0000270247 00000 n +0000270376 00000 n +0000269930 00000 n +0000270092 00000 n +0000273727 00000 n +0000273088 00000 n +0000270609 00000 n +0000273403 00000 n +0000273235 00000 n +0000273597 00000 n +0000273662 00000 n +0000277531 00000 n +0000277028 00000 n +0000273853 00000 n +0000277337 00000 n +0000277466 00000 n +0000277175 00000 n +0000281968 00000 n +0000281594 00000 n +0000277713 00000 n +0000281903 00000 n +0000281741 00000 n +0000548497 00000 n +0000546499 00000 n +0000548332 00000 n +0000734578 00000 n +0000366135 00000 n +0000285869 00000 n +0000285233 00000 n +0000282094 00000 n +0000285546 00000 n +0000285675 00000 n +0000285380 00000 n +0000285804 00000 n +0000301850 00000 n +0000289625 00000 n +0000289305 00000 n +0000285994 00000 n +0000289431 00000 n +0000292998 00000 n +0000292549 00000 n +0000289780 00000 n +0000292675 00000 n +0000292804 00000 n +0000297759 00000 n +0000297095 00000 n +0000293110 00000 n +0000297565 00000 n +0000297251 00000 n +0000297403 00000 n +0000297694 00000 n +0000301915 00000 n +0000301034 00000 n +0000297871 00000 n +0000301334 00000 n +0000301463 00000 n +0000301592 00000 n +0000301721 00000 n +0000301181 00000 n +0000305358 00000 n +0000305038 00000 n +0000302027 00000 n +0000305164 00000 n +0000305293 00000 n +0000734703 00000 n +0000306983 00000 n +0000306663 00000 n +0000305470 00000 n +0000306789 00000 n +0000308508 00000 n +0000308317 00000 n +0000307095 00000 n +0000308443 00000 n +0000311421 00000 n +0000310842 00000 n +0000308607 00000 n +0000310968 00000 n +0000311097 00000 n +0000311226 00000 n +0000311291 00000 n +0000311356 00000 n +0000315616 00000 n +0000315107 00000 n +0000311533 00000 n +0000315422 00000 n +0000315254 00000 n +0000315551 00000 n +0000527445 00000 n +0000321506 00000 n +0000318771 00000 n +0000315728 00000 n +0000321312 00000 n +0000321441 00000 n +0000319035 00000 n +0000319197 00000 n +0000319359 00000 n +0000319520 00000 n +0000319680 00000 n +0000319842 00000 n +0000320013 00000 n +0000320175 00000 n +0000320337 00000 n +0000320500 00000 n +0000320663 00000 n +0000320826 00000 n +0000320989 00000 n +0000321152 00000 n +0000326727 00000 n +0000324810 00000 n +0000321618 00000 n +0000326662 00000 n +0000325038 00000 n +0000325201 00000 n +0000325368 00000 n +0000325537 00000 n +0000325699 00000 n +0000325860 00000 n +0000326022 00000 n +0000326183 00000 n +0000326346 00000 n +0000326499 00000 n +0000734828 00000 n +0000332892 00000 n +0000329885 00000 n +0000326852 00000 n +0000332698 00000 n +0000330167 00000 n +0000330320 00000 n +0000330474 00000 n +0000330625 00000 n +0000330779 00000 n +0000330940 00000 n +0000331102 00000 n +0000331264 00000 n +0000331426 00000 n +0000331588 00000 n +0000331750 00000 n +0000331912 00000 n +0000332064 00000 n +0000332227 00000 n +0000332382 00000 n +0000332544 00000 n +0000336422 00000 n +0000336101 00000 n +0000333004 00000 n +0000336227 00000 n +0000336292 00000 n +0000336357 00000 n +0000340647 00000 n +0000339451 00000 n +0000336591 00000 n +0000339938 00000 n +0000340067 00000 n +0000340324 00000 n +0000339607 00000 n +0000339777 00000 n +0000340389 00000 n +0000340454 00000 n +0000340519 00000 n +0000340583 00000 n +0000343994 00000 n +0000343803 00000 n +0000340829 00000 n +0000343929 00000 n +0000347734 00000 n +0000347413 00000 n +0000344080 00000 n +0000347539 00000 n +0000347604 00000 n +0000347669 00000 n +0000351566 00000 n +0000350859 00000 n +0000347846 00000 n +0000350985 00000 n +0000351114 00000 n +0000351177 00000 n +0000351242 00000 n +0000351307 00000 n +0000351372 00000 n +0000351501 00000 n +0000734953 00000 n +0000355318 00000 n +0000354480 00000 n +0000351678 00000 n +0000354606 00000 n +0000354671 00000 n +0000354736 00000 n +0000354865 00000 n +0000354930 00000 n +0000354995 00000 n +0000355124 00000 n +0000355189 00000 n +0000355253 00000 n +0000358661 00000 n +0000357954 00000 n +0000355443 00000 n +0000358080 00000 n +0000358209 00000 n +0000358338 00000 n +0000358467 00000 n +0000358596 00000 n +0000362566 00000 n +0000361988 00000 n +0000358858 00000 n +0000362114 00000 n +0000362243 00000 n +0000362371 00000 n +0000362436 00000 n +0000362501 00000 n +0000366459 00000 n +0000365880 00000 n +0000362705 00000 n +0000366006 00000 n +0000366264 00000 n +0000366329 00000 n +0000366394 00000 n +0000370157 00000 n +0000369268 00000 n +0000366584 00000 n +0000369575 00000 n +0000369415 00000 n +0000369833 00000 n +0000369962 00000 n +0000370027 00000 n +0000370092 00000 n +0000373909 00000 n +0000373277 00000 n +0000370269 00000 n +0000373589 00000 n +0000373424 00000 n +0000373718 00000 n +0000373781 00000 n +0000373844 00000 n +0000735078 00000 n +0000527412 00000 n +0000377379 00000 n +0000376930 00000 n +0000374021 00000 n +0000377056 00000 n +0000377184 00000 n +0000377249 00000 n +0000377314 00000 n +0000380525 00000 n +0000379947 00000 n +0000377491 00000 n +0000380073 00000 n +0000380202 00000 n +0000380267 00000 n +0000380331 00000 n +0000546218 00000 n +0000538934 00000 n +0000546038 00000 n +0000380460 00000 n +0000381006 00000 n +0000380815 00000 n +0000380665 00000 n +0000380941 00000 n +0000382898 00000 n +0000382450 00000 n +0000381048 00000 n +0000382576 00000 n +0000382705 00000 n +0000382834 00000 n +0000387484 00000 n +0000386541 00000 n +0000383010 00000 n +0000386904 00000 n +0000538613 00000 n +0000529400 00000 n +0000538427 00000 n +0000386688 00000 n +0000387033 00000 n +0000387161 00000 n +0000387290 00000 n +0000388526 00000 n +0000388335 00000 n +0000387721 00000 n +0000388461 00000 n +0000735203 00000 n +0000388953 00000 n +0000388762 00000 n +0000388612 00000 n +0000388888 00000 n +0000392266 00000 n +0000391040 00000 n +0000388995 00000 n +0000391557 00000 n +0000391686 00000 n +0000391815 00000 n +0000391944 00000 n +0000392073 00000 n +0000392202 00000 n +0000391196 00000 n +0000391368 00000 n +0000392720 00000 n +0000392529 00000 n +0000392379 00000 n +0000392655 00000 n +0000395965 00000 n +0000395387 00000 n +0000392762 00000 n +0000395513 00000 n +0000395642 00000 n +0000395771 00000 n +0000395900 00000 n +0000400160 00000 n +0000398942 00000 n +0000396051 00000 n +0000399452 00000 n +0000399581 00000 n +0000399839 00000 n +0000399098 00000 n +0000399277 00000 n +0000400032 00000 n +0000400096 00000 n +0000407047 00000 n +0000403219 00000 n +0000400313 00000 n +0000403345 00000 n +0000403410 00000 n +0000403475 00000 n +0000403540 00000 n +0000403605 00000 n +0000403670 00000 n +0000403735 00000 n +0000403800 00000 n +0000403865 00000 n +0000403930 00000 n +0000404060 00000 n +0000404125 00000 n +0000404190 00000 n +0000404255 00000 n +0000404320 00000 n +0000404385 00000 n +0000404450 00000 n +0000404515 00000 n +0000404580 00000 n +0000404645 00000 n +0000404710 00000 n +0000404775 00000 n +0000404840 00000 n +0000404905 00000 n +0000404970 00000 n +0000405035 00000 n +0000405100 00000 n +0000405165 00000 n +0000405230 00000 n +0000405295 00000 n +0000405360 00000 n +0000405425 00000 n +0000405490 00000 n +0000405555 00000 n +0000405619 00000 n +0000405684 00000 n +0000405749 00000 n +0000405814 00000 n +0000405879 00000 n +0000405944 00000 n +0000406009 00000 n +0000406074 00000 n +0000406139 00000 n +0000406204 00000 n +0000406269 00000 n +0000406334 00000 n +0000406399 00000 n +0000406464 00000 n +0000406529 00000 n +0000406594 00000 n +0000406659 00000 n +0000406724 00000 n +0000406789 00000 n +0000406854 00000 n +0000406919 00000 n +0000406983 00000 n +0000735328 00000 n +0000413693 00000 n +0000410129 00000 n +0000407159 00000 n +0000410255 00000 n +0000410320 00000 n +0000410385 00000 n +0000410450 00000 n +0000410515 00000 n +0000410580 00000 n +0000410645 00000 n +0000410710 00000 n +0000410775 00000 n +0000410840 00000 n +0000410905 00000 n +0000410970 00000 n +0000411034 00000 n +0000411099 00000 n +0000411164 00000 n +0000411229 00000 n +0000411294 00000 n +0000411359 00000 n +0000411424 00000 n +0000411489 00000 n +0000411554 00000 n +0000411619 00000 n +0000411684 00000 n +0000411749 00000 n +0000411813 00000 n +0000411878 00000 n +0000411943 00000 n +0000412008 00000 n +0000412073 00000 n +0000412138 00000 n +0000412203 00000 n +0000412268 00000 n +0000412333 00000 n +0000412398 00000 n +0000412463 00000 n +0000412528 00000 n +0000412593 00000 n +0000412658 00000 n +0000412723 00000 n +0000412788 00000 n +0000412852 00000 n +0000412916 00000 n +0000412980 00000 n +0000413045 00000 n +0000413110 00000 n +0000413175 00000 n +0000413240 00000 n +0000413305 00000 n +0000413370 00000 n +0000413435 00000 n +0000413500 00000 n +0000413565 00000 n +0000413629 00000 n +0000419866 00000 n +0000416428 00000 n +0000413805 00000 n +0000416554 00000 n +0000416619 00000 n +0000416684 00000 n +0000416749 00000 n +0000416814 00000 n +0000416879 00000 n +0000416944 00000 n +0000417009 00000 n +0000417074 00000 n +0000417139 00000 n +0000417204 00000 n +0000417269 00000 n +0000417334 00000 n +0000417399 00000 n +0000417464 00000 n +0000417529 00000 n +0000417594 00000 n +0000417659 00000 n +0000417724 00000 n +0000417789 00000 n +0000417854 00000 n +0000417919 00000 n +0000417984 00000 n +0000418049 00000 n +0000418114 00000 n +0000418179 00000 n +0000418244 00000 n +0000418309 00000 n +0000418374 00000 n +0000418439 00000 n +0000418504 00000 n +0000418569 00000 n +0000418634 00000 n +0000418699 00000 n +0000418763 00000 n +0000418828 00000 n +0000418893 00000 n +0000418958 00000 n +0000419023 00000 n +0000419088 00000 n +0000419153 00000 n +0000419218 00000 n +0000419283 00000 n +0000419348 00000 n +0000419413 00000 n +0000419478 00000 n +0000419543 00000 n +0000419608 00000 n +0000419673 00000 n +0000419738 00000 n +0000419802 00000 n +0000424444 00000 n +0000422180 00000 n +0000419978 00000 n +0000422306 00000 n +0000422371 00000 n +0000422436 00000 n +0000422501 00000 n +0000422566 00000 n +0000422631 00000 n +0000422696 00000 n +0000422761 00000 n +0000422826 00000 n +0000422891 00000 n +0000422956 00000 n +0000423021 00000 n +0000423086 00000 n +0000423151 00000 n +0000423213 00000 n +0000423277 00000 n +0000423342 00000 n +0000423406 00000 n +0000423471 00000 n +0000423536 00000 n +0000423601 00000 n +0000423666 00000 n +0000423731 00000 n +0000423796 00000 n +0000423861 00000 n +0000423990 00000 n +0000424119 00000 n +0000424184 00000 n +0000424249 00000 n +0000424314 00000 n +0000424379 00000 n +0000427239 00000 n +0000426595 00000 n +0000424569 00000 n +0000426721 00000 n +0000426850 00000 n +0000426979 00000 n +0000427044 00000 n +0000427109 00000 n +0000427174 00000 n +0000431577 00000 n +0000431257 00000 n +0000427352 00000 n +0000431383 00000 n +0000431448 00000 n +0000431513 00000 n +0000435177 00000 n +0000434922 00000 n +0000431730 00000 n +0000435048 00000 n +0000435113 00000 n +0000735453 00000 n +0000438425 00000 n +0000438234 00000 n +0000435316 00000 n +0000438360 00000 n +0000442156 00000 n +0000441900 00000 n +0000438551 00000 n +0000442026 00000 n +0000442091 00000 n +0000444996 00000 n +0000444288 00000 n +0000442295 00000 n +0000444414 00000 n +0000444479 00000 n +0000444544 00000 n +0000444609 00000 n +0000444674 00000 n +0000444803 00000 n +0000444868 00000 n +0000444932 00000 n +0000449664 00000 n +0000449408 00000 n +0000445135 00000 n +0000449534 00000 n +0000449599 00000 n +0000452615 00000 n +0000451842 00000 n +0000449790 00000 n +0000451968 00000 n +0000452033 00000 n +0000452098 00000 n +0000452163 00000 n +0000452292 00000 n +0000452357 00000 n +0000452420 00000 n +0000452485 00000 n +0000452550 00000 n +0000455216 00000 n +0000454507 00000 n +0000452768 00000 n +0000454633 00000 n +0000454698 00000 n +0000454763 00000 n +0000454828 00000 n +0000454893 00000 n +0000454958 00000 n +0000455087 00000 n +0000455152 00000 n +0000735578 00000 n +0000458459 00000 n +0000458073 00000 n +0000455368 00000 n +0000458199 00000 n +0000458264 00000 n +0000458329 00000 n +0000458394 00000 n +0000461592 00000 n +0000460819 00000 n +0000458599 00000 n +0000460945 00000 n +0000461010 00000 n +0000461075 00000 n +0000461139 00000 n +0000461267 00000 n +0000461332 00000 n +0000461397 00000 n +0000461462 00000 n +0000461527 00000 n +0000464979 00000 n +0000464788 00000 n +0000461758 00000 n +0000464914 00000 n +0000468088 00000 n +0000467378 00000 n +0000465105 00000 n +0000467504 00000 n +0000467569 00000 n +0000467634 00000 n +0000467699 00000 n +0000467764 00000 n +0000467893 00000 n +0000467958 00000 n +0000468023 00000 n +0000471639 00000 n +0000471318 00000 n +0000468253 00000 n +0000471444 00000 n +0000471509 00000 n +0000471574 00000 n +0000475085 00000 n +0000474894 00000 n +0000471765 00000 n +0000475020 00000 n +0000735703 00000 n +0000478156 00000 n +0000477837 00000 n +0000475211 00000 n +0000477963 00000 n +0000478028 00000 n +0000478092 00000 n +0000480727 00000 n +0000479889 00000 n +0000478309 00000 n +0000480015 00000 n +0000480080 00000 n +0000480145 00000 n +0000480274 00000 n +0000480339 00000 n +0000480404 00000 n +0000480469 00000 n +0000480534 00000 n +0000480598 00000 n +0000480663 00000 n +0000483694 00000 n +0000483050 00000 n +0000480880 00000 n +0000483176 00000 n +0000483241 00000 n +0000483370 00000 n +0000483435 00000 n +0000483499 00000 n +0000483564 00000 n +0000483629 00000 n +0000487167 00000 n +0000486976 00000 n +0000483834 00000 n +0000487102 00000 n +0000489974 00000 n +0000489200 00000 n +0000487293 00000 n +0000489326 00000 n +0000489391 00000 n +0000489456 00000 n +0000489521 00000 n +0000489650 00000 n +0000489715 00000 n +0000489780 00000 n +0000489844 00000 n +0000489909 00000 n +0000493377 00000 n +0000493186 00000 n +0000490127 00000 n +0000493312 00000 n +0000735828 00000 n +0000496412 00000 n +0000496092 00000 n +0000493588 00000 n +0000496218 00000 n +0000496283 00000 n +0000496348 00000 n +0000499721 00000 n +0000499012 00000 n +0000496636 00000 n +0000499138 00000 n +0000499203 00000 n +0000499268 00000 n +0000499332 00000 n +0000499461 00000 n +0000499526 00000 n +0000499591 00000 n +0000499656 00000 n +0000504137 00000 n +0000503881 00000 n +0000499873 00000 n +0000504007 00000 n +0000504072 00000 n +0000507670 00000 n +0000507479 00000 n +0000504263 00000 n +0000507605 00000 n +0000510256 00000 n +0000509806 00000 n +0000507796 00000 n +0000509932 00000 n +0000509997 00000 n +0000510062 00000 n +0000510127 00000 n +0000510192 00000 n +0000514088 00000 n +0000513508 00000 n +0000510394 00000 n +0000513634 00000 n +0000513763 00000 n +0000513828 00000 n +0000513893 00000 n +0000513958 00000 n +0000514023 00000 n +0000735953 00000 n +0000517250 00000 n +0000516540 00000 n +0000514228 00000 n +0000516666 00000 n +0000516731 00000 n +0000516796 00000 n +0000516861 00000 n +0000516990 00000 n +0000517055 00000 n +0000517120 00000 n +0000517185 00000 n +0000519967 00000 n +0000519711 00000 n +0000517402 00000 n +0000519837 00000 n +0000519902 00000 n +0000523221 00000 n +0000522448 00000 n +0000520093 00000 n +0000522574 00000 n +0000522639 00000 n +0000522704 00000 n +0000522769 00000 n +0000522898 00000 n +0000522963 00000 n +0000523028 00000 n +0000523092 00000 n +0000523157 00000 n +0000526507 00000 n +0000526188 00000 n +0000523373 00000 n +0000526314 00000 n +0000526379 00000 n +0000526444 00000 n +0000527313 00000 n +0000527057 00000 n +0000526659 00000 n +0000527183 00000 n +0000527248 00000 n +0000527511 00000 n +0000538855 00000 n +0000546444 00000 n +0000548744 00000 n +0000548713 00000 n +0000552431 00000 n +0000561871 00000 n +0000572378 00000 n +0000582862 00000 n +0000595486 00000 n +0000614551 00000 n +0000635438 00000 n +0000657582 00000 n +0000675477 00000 n +0000678308 00000 n +0000678078 00000 n +0000705615 00000 n +0000732726 00000 n +0000736078 00000 n +0000736202 00000 n +0000736328 00000 n +0000736454 00000 n +0000736571 00000 n +0000736663 00000 n +0000753278 00000 n +0000772590 00000 n +0000772631 00000 n +0000772671 00000 n +0000772805 00000 n trailer << -/Size 2150 -/Root 2148 0 R -/Info 2149 0 R -/ID [ ] +/Size 2172 +/Root 2170 0 R +/Info 2171 0 R +/ID [ ] >> startxref -764399 +773063 %%EOF diff --git a/doc/arm/man.dig.html b/doc/arm/man.dig.html index 2758a8f..9339878 100644 --- a/doc/arm/man.dig.html +++ b/doc/arm/man.dig.html @@ -1,8 +1,8 @@ - + @@ -52,7 +52,7 @@

dig [global-queryopt...] [query...]

-

DESCRIPTION

+

DESCRIPTION

dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and @@ -98,7 +98,7 @@

-

SIMPLE USAGE

+

SIMPLE USAGE

A typical invocation of dig looks like:

@@ -144,7 +144,7 @@

-

OPTIONS

+

OPTIONS

The -b option sets the source IP address of the query to address. This must be a valid @@ -248,7 +248,7 @@

-

QUERY OPTIONS

+

QUERY OPTIONS

dig provides a number of query options which affect the way in which lookups are made and the results displayed. Some of @@ -573,7 +573,7 @@

-

MULTIPLE QUERIES

+

MULTIPLE QUERIES

The BIND 9 implementation of dig supports @@ -619,7 +619,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

IDN SUPPORT

+

IDN SUPPORT

If dig has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -633,14 +633,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

FILES

+

FILES

/etc/resolv.conf

${HOME}/.digrc

-

SEE ALSO

+

SEE ALSO

host(1), named(8), dnssec-keygen(8), @@ -648,7 +648,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

BUGS

+

BUGS

There are probably too many query options.

diff --git a/doc/arm/man.dnssec-dsfromkey.html b/doc/arm/man.dnssec-dsfromkey.html index f9a20e3..7c84aff 100644 --- a/doc/arm/man.dnssec-dsfromkey.html +++ b/doc/arm/man.dnssec-dsfromkey.html @@ -1,8 +1,8 @@ - + @@ -51,14 +51,14 @@

dnssec-dsfromkey {-s} [-v level] [-1] [-2] [-a alg] [-c class] [-d dir] {dnsname}

-

DESCRIPTION

+

DESCRIPTION

dnssec-dsfromkey outputs the Delegation Signer (DS) resource record (RR), as defined in RFC 3658 and RFC 4509, for the given key(s).

-

OPTIONS

+

OPTIONS

-1

@@ -99,7 +99,7 @@

-

EXAMPLE

+

EXAMPLE

To build the SHA-256 DS RR from the Kexample.com.+003+26160 @@ -114,7 +114,7 @@

-

FILES

+

FILES

The keyfile can be designed by the key identification Knnnn.+aaa+iiiii or the full file name @@ -128,13 +128,13 @@

-

CAVEAT

+

CAVEAT

A keyfile error can give a "file not found" even if the file exists.

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -143,7 +143,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-keyfromlabel.html b/doc/arm/man.dnssec-keyfromlabel.html index c885dbe..8996855 100644 --- a/doc/arm/man.dnssec-keyfromlabel.html +++ b/doc/arm/man.dnssec-keyfromlabel.html @@ -1,8 +1,8 @@ - + @@ -50,7 +50,7 @@

dnssec-keyfromlabel {-a algorithm} {-l label} [-c class] [-f flag] [-k] [-n nametype] [-p protocol] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keyfromlabel gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 @@ -58,17 +58,25 @@

-

OPTIONS

+

OPTIONS

-a algorithm

Selects the cryptographic algorithm. The value of - algorithm must be one of RSAMD5 (RSA) - or RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA or DH (Diffie Hellman). + algorithm must be one of RSAMD5, + RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, + RSASHA512 or DH (Diffie Hellman). These values are case insensitive.

+ If no algorithm is specified, then RSASHA1 will be used by + default, unless the -3 option is specified, + in which case NSEC3RSASHA1 will be used instead. (If + -3 is used and an algorithm is specified, + that algorithm will be checked for compatibility with NSEC3.) +

+

Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended.

@@ -131,7 +139,7 @@
-

GENERATED KEY FILES

+

GENERATED KEY FILES

When dnssec-keyfromlabel completes successfully, @@ -172,17 +180,15 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, - RFC 2539, - RFC 2845, - RFC 4033. + RFC 4034.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-keygen.html b/doc/arm/man.dnssec-keygen.html index 17d08e2..5f6ca80 100644 --- a/doc/arm/man.dnssec-keygen.html +++ b/doc/arm/man.dnssec-keygen.html @@ -1,8 +1,8 @@ - + @@ -50,23 +50,31 @@

dnssec-keygen {-a algorithm} {-b keysize} {-n nametype} [-c class] [-e] [-f flag] [-g generator] [-h] [-k] [-p protocol] [-r randomdev] [-s strength] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keygen generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures), as defined in RFC 2845.

+

+ The name of the key is specified on the command + line. For DNSSEC keys, this must match the name of the zone for + which the key is being generated. +

-

OPTIONS

+

OPTIONS

-a algorithm

- Selects the cryptographic algorithm. The value of - algorithm must be one of RSAMD5 (RSA) or RSASHA1, - DSA, NSEC3RSASHA1, NSEC3DSA, DH (Diffie Hellman), or HMAC-MD5. - These values are case insensitive. + Selects the cryptographic algorithm. For DNSSEC keys, the value + of algorithm must be one of RSAMD5, RSASHA1, + DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512. + For TSIG/TKEY, the value must + be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224, + HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are + case insensitive.

Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement @@ -80,11 +88,10 @@

-b keysize

Specifies the number of bits in the key. The choice of key - size depends on the algorithm used. RSAMD5 / RSASHA1 keys must be - between - 512 and 2048 bits. Diffie Hellman keys must be between + size depends on the algorithm used. RSA keys must be + between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 - bits and an exact multiple of 64. HMAC-MD5 keys must be + bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits.

-n nametype
@@ -166,7 +173,7 @@
-

GENERATED KEYS

+

GENERATED KEYS

When dnssec-keygen completes successfully, @@ -212,7 +219,7 @@

-

EXAMPLE

+

EXAMPLE

To generate a 768-bit DSA key for the domain example.com, the following command would be @@ -233,16 +240,16 @@

-

SEE ALSO

+

SEE ALSO

dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 2539, RFC 2845, - RFC 4033. + RFC 4034.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-signzone.html b/doc/arm/man.dnssec-signzone.html index 40c0976..735cce1 100644 --- a/doc/arm/man.dnssec-signzone.html +++ b/doc/arm/man.dnssec-signzone.html @@ -1,8 +1,8 @@ - + @@ -47,21 +47,21 @@

Synopsis

-

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

+

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-P] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the - zone. The security status of delegations from the signed zone - (that is, whether the child zones are secure or not) is - determined by the presence or absence of a - keyset file for each child zone. + zone. It also generates a keyset- file containing + the key-signing keys for the zone, and if signing a zone which + contains delegations, it can optionally generate DS records for + the child zones from their keyset- files.

-

OPTIONS

+

OPTIONS

-a

@@ -88,8 +88,10 @@

-g

- Generate DS records for child zones from keyset files. - Existing DS records will be removed. + If the zone contains any delegations, and there are + keyset- files for any of the child zones, + then DS records for the child zones will be generated from the + keys in those files. Existing DS records will be removed.

-s start-time

@@ -220,6 +222,19 @@ may be useful when signing large zones or when the entropy source is limited.

+
-P
+
+

+ Disable post sign verification tests. +

+

+ The post sign verification test ensures that for each algorithm + in use there is at least one non revoked self signed KSK key, + that all revoked KSK keys are self signed, and that all records + in the zone are signed by the algorithm. + This option skips these tests. +

+
-r randomdev

Specifies the source of randomness. If the operating @@ -276,7 +291,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -305,7 +320,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -330,14 +345,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.host.html b/doc/arm/man.host.html index 22f6731..85ed78e 100644 --- a/doc/arm/man.host.html +++ b/doc/arm/man.host.html @@ -1,8 +1,8 @@ - + @@ -50,7 +50,7 @@

host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]

-

DESCRIPTION

+

DESCRIPTION

host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa. @@ -202,7 +202,7 @@

-

IDN SUPPORT

+

IDN SUPPORT

If host has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -216,12 +216,12 @@

-

FILES

+

FILES

/etc/resolv.conf

-

SEE ALSO

+

SEE ALSO

dig(1), named(8).

diff --git a/doc/arm/man.named-checkconf.html b/doc/arm/man.named-checkconf.html index 94c22f6..424c948 100644 --- a/doc/arm/man.named-checkconf.html +++ b/doc/arm/man.named-checkconf.html @@ -1,8 +1,8 @@ - + @@ -50,14 +50,14 @@

named-checkconf [-h] [-v] [-j] [-t directory] {filename} [-z]

-

DESCRIPTION

+

DESCRIPTION

named-checkconf checks the syntax, but not the semantics, of a named configuration file.

-

OPTIONS

+

OPTIONS

-h

@@ -92,21 +92,21 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkconf returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkzone(8), BIND 9 Administrator Reference Manual.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-checkzone.html b/doc/arm/man.named-checkzone.html index b187a1a..cabab44 100644 --- a/doc/arm/man.named-checkzone.html +++ b/doc/arm/man.named-checkzone.html @@ -1,8 +1,8 @@ - + @@ -47,11 +47,11 @@

Synopsis

-

named-checkzone [-d] [-h] [-j] [-q] [-v] [-c class] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-M mode] [-n mode] [-o filename] [-s style] [-S mode] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

-

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

+

named-checkzone [-d] [-h] [-j] [-q] [-v] [-c class] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-M mode] [-n mode] [-s style] [-S mode] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

+

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {-o filename} {zonename} {filename}

-

DESCRIPTION

+

DESCRIPTION

named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a @@ -71,7 +71,7 @@

-

OPTIONS

+

OPTIONS

-d

@@ -257,14 +257,14 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkzone returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkconf(8), RFC 1035, @@ -272,7 +272,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named.html b/doc/arm/man.named.html index 2a440ce..d4783be 100644 --- a/doc/arm/man.named.html +++ b/doc/arm/man.named.html @@ -1,8 +1,8 @@ - + @@ -50,7 +50,7 @@

named [-4] [-6] [-c config-file] [-d debug-level] [-f] [-g] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-u user] [-v] [-V] [-x cache-file]

-

DESCRIPTION

+

DESCRIPTION

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -65,7 +65,7 @@

-

OPTIONS

+

OPTIONS

-4

@@ -238,7 +238,7 @@

-

SIGNALS

+

SIGNALS

In routine operation, signals should not be used to control the nameserver; rndc should be used @@ -259,16 +259,24 @@

-

CONFIGURATION

+

CONFIGURATION

The named configuration file is too complex to describe in detail here. A complete description is provided in the BIND 9 Administrator Reference Manual.

+

+ named inherits the umask + (file creation mode mask) from the parent process. If files + created by named, such as journal files, + need to have custom permissions, the umask + should be set explicitly in the script used to start the + named process. +

-

FILES

+

FILES

/etc/named.conf

@@ -281,7 +289,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 1033, RFC 1034, RFC 1035, @@ -294,7 +302,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.nsupdate.html b/doc/arm/man.nsupdate.html index eb3b7be..d3d7547 100644 --- a/doc/arm/man.nsupdate.html +++ b/doc/arm/man.nsupdate.html @@ -1,8 +1,8 @@ - + @@ -50,7 +50,7 @@

nsupdate [-d] [-D] [[-g] | [-o] | [-y [hmac:]keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-R randomdev] [-v] [filename]

-

DESCRIPTION

+

DESCRIPTION

nsupdate is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. @@ -187,7 +187,7 @@

-

INPUT FORMAT

+

INPUT FORMAT

nsupdate reads input from filename @@ -451,7 +451,7 @@

-

EXAMPLES

+

EXAMPLES

The examples below show how nsupdate @@ -505,7 +505,7 @@

-

FILES

+

FILES

/etc/resolv.conf

@@ -524,7 +524,7 @@

-

SEE ALSO

+

SEE ALSO

RFC2136, RFC3007, RFC2104, @@ -537,7 +537,7 @@

-

BUGS

+

BUGS

The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library diff --git a/doc/arm/man.rndc-confgen.html b/doc/arm/man.rndc-confgen.html index cb59c2e..d6240a7 100644 --- a/doc/arm/man.rndc-confgen.html +++ b/doc/arm/man.rndc-confgen.html @@ -1,8 +1,8 @@ - + @@ -48,7 +48,7 @@

rndc-confgen [-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port] [-r randomfile] [-s address] [-t chrootdir] [-u user]

-

DESCRIPTION

+

DESCRIPTION

rndc-confgen generates configuration files for rndc. It can be used as a @@ -64,7 +64,7 @@

-

OPTIONS

+

OPTIONS

-a
@@ -171,7 +171,7 @@
-

EXAMPLES

+

EXAMPLES

To allow rndc to be used with no manual configuration, run @@ -188,7 +188,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc.conf(5), named(8), @@ -196,7 +196,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.conf.html b/doc/arm/man.rndc.conf.html index e8e86ba..029eff3 100644 --- a/doc/arm/man.rndc.conf.html +++ b/doc/arm/man.rndc.conf.html @@ -1,8 +1,8 @@ - + @@ -50,7 +50,7 @@

rndc.conf

-

DESCRIPTION

+

DESCRIPTION

rndc.conf is the configuration file for rndc, the BIND 9 name server control utility. This file has a similar structure and syntax to @@ -135,7 +135,7 @@

-

EXAMPLE

+

EXAMPLE

       options {
         default-server  localhost;
@@ -209,7 +209,7 @@
     

-

NAME SERVER CONFIGURATION

+

NAME SERVER CONFIGURATION

The name server must be configured to accept rndc connections and to recognize the key specified in the rndc.conf @@ -219,7 +219,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc-confgen(8), mmencode(1), @@ -227,7 +227,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.html b/doc/arm/man.rndc.html index 36843bc..8500fd3 100644 --- a/doc/arm/man.rndc.html +++ b/doc/arm/man.rndc.html @@ -1,8 +1,8 @@ - + @@ -50,7 +50,7 @@

rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}

-

DESCRIPTION

+

DESCRIPTION

rndc controls the operation of a name server. It supersedes the ndc utility @@ -79,7 +79,7 @@

-

OPTIONS

+

OPTIONS

-b source-address

@@ -151,7 +151,7 @@

-

LIMITATIONS

+

LIMITATIONS

rndc does not yet support all the commands of the BIND 8 ndc utility. @@ -165,7 +165,7 @@

-

SEE ALSO

+

SEE ALSO

rndc.conf(5), rndc-confgen(8), named(8), @@ -175,7 +175,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/misc/Makefile.in b/doc/misc/Makefile.in index 501e3be..24ef3bc 100644 --- a/doc/misc/Makefile.in +++ b/doc/misc/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.7 2007/09/24 04:21:59 marka Exp $ +# $Id: Makefile.in,v 1.7.252.2 2009/07/11 23:47:17 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -38,11 +38,13 @@ docclean manclean maintainer-clean:: CFG_TEST = ../../bin/tests/cfg_test options: FORCE - if test -x ${CFG_TEST} && \ - ${CFG_TEST} --named --grammar | \ - ${PERL} ${srcdir}/sort-options.pl | \ - ${PERL} ${srcdir}/format-options.pl >$@.new ; then \ + if test -x ${CFG_TEST} ; \ + then \ + ${CFG_TEST} --named --grammar > $@.raw ; \ + ${PERL} ${srcdir}/sort-options.pl < $@.raw > $@.sorted ; \ + ${PERL} ${srcdir}/format-options.pl < $@.sorted > $@.new ; \ mv -f $@.new $@ ; \ + rm -f $@.raw $@.sorted ; \ else \ - rm -f $@.new ; \ + rm -f $@.new $@.raw $@.sorted ; \ fi diff --git a/lib/dns/api b/lib/dns/api index 4bcf883..1505071 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 53 -LIBREVISION = 0 +LIBINTERFACE = 55 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/dns/db.c b/lib/dns/db.c index a4c2864..02ea6b5 100644 --- a/lib/dns/db.c +++ b/lib/dns/db.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.c,v 1.88 2008/09/24 02:46:22 marka Exp $ */ +/* $Id: db.c,v 1.88.50.2 2009/06/23 00:19:34 tbox Exp $ */ /*! \file */ @@ -854,12 +854,14 @@ dns_db_unregister(dns_dbimplementation_t **dbimp) { RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS); imp = *dbimp; + *dbimp = NULL; RWLOCK(&implock, isc_rwlocktype_write); ISC_LIST_UNLINK(implementations, imp, link); mctx = imp->mctx; isc_mem_put(mctx, imp, sizeof(dns_dbimplementation_t)); isc_mem_detach(&mctx); RWUNLOCK(&implock, isc_rwlocktype_write); + ENSURE(*dbimp == NULL); } isc_result_t diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 9b4e968..1d04961 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dispatch.c,v 1.155.12.7 2009/04/28 21:39:45 jinmei Exp $ */ +/* $Id: dispatch.c,v 1.155.12.11 2009/12/02 23:26:28 marka Exp $ */ /*! \file */ @@ -746,13 +746,19 @@ new_portentry(dns_dispatch_t *disp, in_port_t port) { return (portentry); } +/*% + * The caller must not hold the qid->lock. + */ static void deref_portentry(dns_dispatch_t *disp, dispportentry_t **portentryp) { dispportentry_t *portentry = *portentryp; + dns_qid_t *qid; REQUIRE(disp->port_table != NULL); REQUIRE(portentry != NULL && portentry->refs > 0); + qid = DNS_QID(disp); + LOCK(&qid->lock); portentry->refs--; if (portentry->refs == 0) { ISC_LIST_UNLINK(disp->port_table[portentry->port % @@ -762,6 +768,7 @@ deref_portentry(dns_dispatch_t *disp, dispportentry_t **portentryp) { } *portentryp = NULL; + UNLOCK(&qid->lock); } /*% @@ -779,8 +786,9 @@ socket_search(dns_qid_t *qid, isc_sockaddr_t *dest, in_port_t port, dispsock = ISC_LIST_HEAD(qid->sock_table[bucket]); while (dispsock != NULL) { - if (isc_sockaddr_equal(dest, &dispsock->host) && - dispsock->portentry->port == port) + if (dispsock->portentry != NULL && + dispsock->portentry->port == port && + isc_sockaddr_equal(dest, &dispsock->host)) return (dispsock); dispsock = ISC_LIST_NEXT(dispsock, blink); } @@ -2048,8 +2056,18 @@ dns_dispatchmgr_setudp(dns_dispatchmgr_t *mgr, /* Create or adjust buffer pool */ if (mgr->bpool != NULL) { - isc_mempool_setmaxalloc(mgr->bpool, maxbuffers); - mgr->maxbuffers = maxbuffers; + /* + * We only increase the maxbuffers to avoid accidental buffer + * shortage. Ideally we'd separate the manager-wide maximum + * from per-dispatch limits and respect the latter within the + * global limit. But at this moment that's deemed to be + * overkilling and isn't worth additional implementation + * complexity. + */ + if (maxbuffers > mgr->maxbuffers) { + isc_mempool_setmaxalloc(mgr->bpool, maxbuffers); + mgr->maxbuffers = maxbuffers; + } } else { result = isc_mempool_create(mgr->mctx, buffersize, &mgr->bpool); if (result != ISC_R_SUCCESS) { diff --git a/lib/dns/dnssec.c b/lib/dns/dnssec.c index baf3ec5..8ae29bc 100644 --- a/lib/dns/dnssec.c +++ b/lib/dns/dnssec.c @@ -16,7 +16,7 @@ */ /* - * $Id: dnssec.c,v 1.93.12.4 2009/06/08 23:47:00 tbox Exp $ + * $Id: dnssec.c,v 1.93.12.6 2009/06/22 23:47:18 tbox Exp $ */ /*! \file */ @@ -93,6 +93,7 @@ rdataset_to_sortedarray(dns_rdataset_t *set, isc_mem_t *mctx, isc_result_t ret; int i = 0, n; dns_rdata_t *data; + dns_rdataset_t rdataset; n = dns_rdataset_count(set); @@ -100,8 +101,11 @@ rdataset_to_sortedarray(dns_rdataset_t *set, isc_mem_t *mctx, if (data == NULL) return (ISC_R_NOMEMORY); - ret = dns_rdataset_first(set); + dns_rdataset_init(&rdataset); + dns_rdataset_clone(set, &rdataset); + ret = dns_rdataset_first(&rdataset); if (ret != ISC_R_SUCCESS) { + dns_rdataset_disassociate(&rdataset); isc_mem_put(mctx, data, n * sizeof(dns_rdata_t)); return (ret); } @@ -111,8 +115,8 @@ rdataset_to_sortedarray(dns_rdataset_t *set, isc_mem_t *mctx, */ do { dns_rdata_init(&data[i]); - dns_rdataset_current(set, &data[i++]); - } while (dns_rdataset_next(set) == ISC_R_SUCCESS); + dns_rdataset_current(&rdataset, &data[i++]); + } while (dns_rdataset_next(&rdataset) == ISC_R_SUCCESS); /* * Sort the array. @@ -120,6 +124,7 @@ rdataset_to_sortedarray(dns_rdataset_t *set, isc_mem_t *mctx, qsort(data, n, sizeof(dns_rdata_t), rdata_compare_wrapper); *rdata = data; *nrdata = n; + dns_rdataset_disassociate(&rdataset); return (ISC_R_SUCCESS); } @@ -890,3 +895,59 @@ failure: return (result); } + +/*% + * Does this key ('rdata') self sign the rrset ('rdataset')? + */ +isc_boolean_t +dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset, + isc_boolean_t ignoretime, isc_mem_t *mctx) +{ + dst_key_t *dstkey = NULL; + dns_keytag_t keytag; + dns_rdata_dnskey_t key; + dns_rdata_rrsig_t sig; + dns_rdata_t sigrdata = DNS_RDATA_INIT; + isc_result_t result; + + INSIST(rdataset->type == dns_rdatatype_key || + rdataset->type == dns_rdatatype_dnskey); + if (rdataset->type == dns_rdatatype_key) { + INSIST(sigrdataset->type == dns_rdatatype_sig); + INSIST(sigrdataset->covers == dns_rdatatype_key); + } else { + INSIST(sigrdataset->type == dns_rdatatype_rrsig); + INSIST(sigrdataset->covers == dns_rdatatype_dnskey); + } + + result = dns_dnssec_keyfromrdata(name, rdata, mctx, &dstkey); + if (result != ISC_R_SUCCESS) + return (ISC_FALSE); + result = dns_rdata_tostruct(rdata, &key, NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + + keytag = dst_key_id(dstkey); + for (result = dns_rdataset_first(sigrdataset); + result == ISC_R_SUCCESS; + result = dns_rdataset_next(sigrdataset)) + { + dns_rdata_reset(&sigrdata); + dns_rdataset_current(sigrdataset, &sigrdata); + result = dns_rdata_tostruct(&sigrdata, &sig, NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + + if (sig.algorithm == key.algorithm && + sig.keyid == keytag) { + result = dns_dnssec_verify2(name, rdataset, dstkey, + ignoretime, mctx, + &sigrdata, NULL); + if (result == ISC_R_SUCCESS) { + dst_key_free(&dstkey); + return (ISC_TRUE); + } + } + } + dst_key_free(&dstkey); + return (ISC_FALSE); +} diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c index 144c685..bbb0a09 100644 --- a/lib/dns/dst_api.c +++ b/lib/dns/dst_api.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -31,7 +31,7 @@ /* * Principal Author: Brian Wellington - * $Id: dst_api.c,v 1.16.12.3 2009/03/02 02:00:34 marka Exp $ + * $Id: dst_api.c,v 1.16.12.10 2010/01/15 19:38:53 each Exp $ */ /*! \file */ @@ -183,9 +183,16 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) { RETERR(dst__hmacsha512_init(&dst_t_func[DST_ALG_HMACSHA512])); #ifdef OPENSSL RETERR(dst__openssl_init()); - RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSAMD5])); - RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA1])); - RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_NSEC3RSASHA1])); + RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSAMD5], + DST_ALG_RSAMD5)); + RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA1], + DST_ALG_RSASHA1)); + RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_NSEC3RSASHA1], + DST_ALG_NSEC3RSASHA1)); + RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA256], + DST_ALG_RSASHA256)); + RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA512], + DST_ALG_RSASHA512)); #ifdef HAVE_OPENSSL_DSA RETERR(dst__openssldsa_init(&dst_t_func[DST_ALG_DSA])); RETERR(dst__openssldsa_init(&dst_t_func[DST_ALG_NSEC3DSA])); @@ -848,6 +855,8 @@ dst_key_sigsize(const dst_key_t *key, unsigned int *n) { case DST_ALG_RSAMD5: case DST_ALG_RSASHA1: case DST_ALG_NSEC3RSASHA1: + case DST_ALG_RSASHA256: + case DST_ALG_RSASHA512: *n = (key->key_size + 7) / 8; break; case DST_ALG_DSA: @@ -1017,6 +1026,9 @@ dst_key_read_public(const char *filename, int type, /* Read the next word: either TTL, class, or 'KEY' */ NEXTTOKEN(lex, opt, &token); + if (token.type != isc_tokentype_string) + BADTOKEN(); + /* If it's a TTL, read the next one */ result = dns_ttl_fromtext(&token.value.as_textregion, &ttl); if (result == ISC_R_SUCCESS) @@ -1072,6 +1084,8 @@ issymmetric(const dst_key_t *key) { case DST_ALG_RSAMD5: case DST_ALG_RSASHA1: case DST_ALG_NSEC3RSASHA1: + case DST_ALG_RSASHA256: + case DST_ALG_RSASHA512: case DST_ALG_DSA: case DST_ALG_NSEC3DSA: case DST_ALG_DH: @@ -1152,7 +1166,7 @@ write_public_key(const dst_key_t *key, int type, const char *directory) { fprintf(fp, " "); isc_buffer_usedregion(&classb, &r); - fwrite(r.base, 1, r.length, fp); + isc_util_fwrite(r.base, 1, r.length, fp); if ((type & DST_TYPE_KEY) != 0) fprintf(fp, " KEY "); @@ -1160,7 +1174,7 @@ write_public_key(const dst_key_t *key, int type, const char *directory) { fprintf(fp, " DNSKEY "); isc_buffer_usedregion(&textb, &r); - fwrite(r.base, 1, r.length, fp); + isc_util_fwrite(r.base, 1, r.length, fp); fputc('\n', fp); fflush(fp); @@ -1275,7 +1289,8 @@ algorithm_status(unsigned int alg) { if (alg == DST_ALG_RSAMD5 || alg == DST_ALG_RSASHA1 || alg == DST_ALG_DSA || alg == DST_ALG_DH || alg == DST_ALG_HMACMD5 || alg == DST_ALG_NSEC3DSA || - alg == DST_ALG_NSEC3RSASHA1) + alg == DST_ALG_NSEC3RSASHA1 || + alg == DST_ALG_RSASHA256 || alg == DST_ALG_RSASHA512) return (DST_R_NOCRYPTO); #endif return (DST_R_UNSUPPORTEDALG); @@ -1297,6 +1312,8 @@ addsuffix(char *filename, unsigned int len, const char *ofilename, n = snprintf(filename, len, "%.*s%s", olen, ofilename, suffix); if (n < 0) + return (ISC_R_FAILURE); + if ((unsigned int)n >= len) return (ISC_R_NOSPACE); return (ISC_R_SUCCESS); } @@ -1304,6 +1321,9 @@ addsuffix(char *filename, unsigned int len, const char *ofilename, isc_result_t dst__entropy_getdata(void *buf, unsigned int len, isc_boolean_t pseudo) { unsigned int flags = dst_entropy_flags; + + if (len == 0) + return (ISC_R_SUCCESS); if (pseudo) flags &= ~ISC_ENTROPY_GOODONLY; return (isc_entropy_getdata(dst_entropy_pool, buf, len, NULL, flags)); @@ -1311,5 +1331,22 @@ dst__entropy_getdata(void *buf, unsigned int len, isc_boolean_t pseudo) { unsigned int dst__entropy_status(void) { +#ifdef GSSAPI + unsigned int flags = dst_entropy_flags; + isc_result_t ret; + unsigned char buf[32]; + static isc_boolean_t first = ISC_TRUE; + + if (first) { + /* Someone believes RAND_status() initializes the PRNG */ + flags &= ~ISC_ENTROPY_GOODONLY; + ret = isc_entropy_getdata(dst_entropy_pool, buf, + sizeof(buf), NULL, flags); + INSIST(ret == ISC_R_SUCCESS); + isc_entropy_putdata(dst_entropy_pool, buf, + sizeof(buf), 2 * sizeof(buf)); + first = ISC_FALSE; + } +#endif return (isc_entropy_status(dst_entropy_pool)); } diff --git a/lib/dns/dst_internal.h b/lib/dns/dst_internal.h index 0c1a71c..1669648 100644 --- a/lib/dns/dst_internal.h +++ b/lib/dns/dst_internal.h @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -29,7 +29,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dst_internal.h,v 1.11 2008/04/01 23:47:10 tbox Exp $ */ +/* $Id: dst_internal.h,v 1.11.120.2 2010/01/15 23:47:33 tbox Exp $ */ #ifndef DST_DST_INTERNAL_H #define DST_DST_INTERNAL_H 1 @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -97,7 +98,7 @@ struct dst_key { void *generic; gss_ctx_id_t gssctx; #ifdef OPENSSL -#if USE_EVP_RSA +#if !defined(USE_EVP) || !USE_EVP RSA *rsa; #endif DSA *dsa; @@ -124,6 +125,8 @@ struct dst_context { dst_gssapi_signverifyctx_t *gssctx; isc_md5_t *md5ctx; isc_sha1_t *sha1ctx; + isc_sha256_t *sha256ctx; + isc_sha512_t *sha512ctx; isc_hmacmd5_t *hmacmd5ctx; isc_hmacsha1_t *hmacsha1ctx; isc_hmacsha224_t *hmacsha224ctx; @@ -183,7 +186,8 @@ isc_result_t dst__hmacsha224_init(struct dst_func **funcp); isc_result_t dst__hmacsha256_init(struct dst_func **funcp); isc_result_t dst__hmacsha384_init(struct dst_func **funcp); isc_result_t dst__hmacsha512_init(struct dst_func **funcp); -isc_result_t dst__opensslrsa_init(struct dst_func **funcp); +isc_result_t dst__opensslrsa_init(struct dst_func **funcp, + unsigned char algorithm); isc_result_t dst__openssldsa_init(struct dst_func **funcp); isc_result_t dst__openssldh_init(struct dst_func **funcp); isc_result_t dst__gssapi_init(struct dst_func **funcp); diff --git a/lib/dns/dst_parse.c b/lib/dns/dst_parse.c index 2da72ae..e8ab34f 100644 --- a/lib/dns/dst_parse.c +++ b/lib/dns/dst_parse.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -31,7 +31,7 @@ /*% * Principal Author: Brian Wellington - * $Id: dst_parse.c,v 1.14.120.2 2009/03/02 23:47:11 tbox Exp $ + * $Id: dst_parse.c,v 1.14.120.6 2010/01/15 19:38:53 each Exp $ */ #include @@ -480,6 +480,18 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv, case DST_ALG_RSASHA1: fprintf(fp, "(RSASHA1)\n"); break; + case DST_ALG_NSEC3DSA: + fprintf(fp, "(NSEC3DSA)\n"); + break; + case DST_ALG_NSEC3RSASHA1: + fprintf(fp, "(NSEC3RSASHA1)\n"); + break; + case DST_ALG_RSASHA256: + fprintf(fp, "(RSASHA256)\n"); + break; + case DST_ALG_RSASHA512: + fprintf(fp, "(RSASHA512)\n"); + break; case DST_ALG_HMACMD5: fprintf(fp, "(HMAC_MD5)\n"); break; @@ -521,7 +533,7 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv, isc_buffer_usedregion(&b, &r); fprintf(fp, "%s ", s); - fwrite(r.base, 1, r.length, fp); + isc_util_fwrite(r.base, 1, r.length, fp); fprintf(fp, "\n"); } diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index c75c774..9a1126d 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.h,v 1.93.50.3.12.1 2009/12/31 21:44:37 each Exp $ */ +/* $Id: db.h,v 1.93.50.5 2009/11/25 23:48:42 tbox Exp $ */ #ifndef DNS_DB_H #define DNS_DB_H 1 @@ -695,6 +695,10 @@ dns_db_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * For cache databases, glue is any rdataset with a trust of * dns_trust_glue. * + * \li If 'options' does not have #DNS_DBFIND_ADDITIONALOK set, then no + * additional records will be returned. Only caches can have + * rdataset with trust dns_trust_additional. + * * \li If 'options' does not have #DNS_DBFIND_PENDINGOK set, then no * pending data will be returned. This option is only meaningful for * cache databases. diff --git a/lib/dns/include/dns/dnssec.h b/lib/dns/include/dns/dnssec.h index c5206be..1446266 100644 --- a/lib/dns/include/dns/dnssec.h +++ b/lib/dns/include/dns/dnssec.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec.h,v 1.32.332.4 2009/06/08 23:47:00 tbox Exp $ */ +/* $Id: dnssec.h,v 1.32.332.6 2009/06/22 23:47:18 tbox Exp $ */ #ifndef DNS_DNSSEC_H #define DNS_DNSSEC_H 1 @@ -178,6 +178,12 @@ dns_dnssec_verifymessage(isc_buffer_t *source, dns_message_t *msg, *\li DST_R_* */ +isc_boolean_t +dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset, + isc_boolean_t ignoretime, isc_mem_t *mctx); + + ISC_LANG_ENDDECLS #endif /* DNS_DNSSEC_H */ diff --git a/lib/dns/include/dns/journal.h b/lib/dns/include/dns/journal.h index 3917d8d..a1e16e4 100644 --- a/lib/dns/include/dns/journal.h +++ b/lib/dns/include/dns/journal.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: journal.h,v 1.33.120.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: journal.h,v 1.33.120.4 2009/11/04 23:47:25 tbox Exp $ */ #ifndef DNS_JOURNAL_H #define DNS_JOURNAL_H 1 @@ -232,12 +232,19 @@ dns_journal_current_rr(dns_journal_t *j, dns_name_t **name, isc_uint32_t *ttl, isc_result_t dns_journal_rollforward(isc_mem_t *mctx, dns_db_t *db, unsigned int options, const char *filename); + +isc_result_t +dns_journal_rollforward2(isc_mem_t *mctx, dns_db_t *db, unsigned int options, + isc_uint32_t resign, const char *filename); /*%< * Roll forward (play back) the journal file "filename" into the * database "db". This should be called when the server starts - * after a shutdown or crash. + * after a shutdown or crash. 'resign' is how many seconds before + * a RRSIG is due to expire it should be scheduled to be regenerated. * * Requires: + *\li dns_journal_rollforward() requires that DNS_JOURNALOPT_RESIGN + * is not set. *\li 'mctx' is a valid memory context. *\li 'db' is a valid database which does not have a version * open for writing. diff --git a/lib/dns/include/dns/keyvalues.h b/lib/dns/include/dns/keyvalues.h index 7f509e6..f4a50fa 100644 --- a/lib/dns/include/dns/keyvalues.h +++ b/lib/dns/include/dns/keyvalues.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: keyvalues.h,v 1.23.48.2 2009/06/04 02:56:14 tbox Exp $ */ +/* $Id: keyvalues.h,v 1.23.48.4 2010/01/15 23:47:33 tbox Exp $ */ #ifndef DNS_KEYVALUES_H #define DNS_KEYVALUES_H 1 @@ -69,6 +69,8 @@ #define DNS_KEYALG_ECC 4 #define DNS_KEYALG_RSASHA1 5 #define DNS_KEYALG_NSEC3RSASHA1 7 +#define DNS_KEYALG_RSASHA256 8 +#define DNS_KEYALG_RSASHA512 10 #define DNS_KEYALG_INDIRECT 252 #define DNS_KEYALG_PRIVATEDNS 253 #define DNS_KEYALG_PRIVATEOID 254 /*%< Key begins with OID giving alg */ diff --git a/lib/dns/include/dns/name.h b/lib/dns/include/dns/name.h index 0149301..dc6e525 100644 --- a/lib/dns/include/dns/name.h +++ b/lib/dns/include/dns/name.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: name.h,v 1.126.332.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: name.h,v 1.126.332.3 2009/12/24 00:34:59 each Exp $ */ #ifndef DNS_NAME_H #define DNS_NAME_H 1 @@ -99,12 +99,6 @@ ISC_LANG_BEGINDECLS *****/ /*** - *** Compression pointer chaining limit - ***/ - -#define DNS_POINTER_MAXHOPS 16 - -/*** *** Types ***/ diff --git a/lib/dns/include/dns/ncache.h b/lib/dns/include/dns/ncache.h index d61684d..0677211 100644 --- a/lib/dns/include/dns/ncache.h +++ b/lib/dns/include/dns/ncache.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.h,v 1.25.142.1 2009/12/31 20:29:21 each Exp $ */ +/* $Id: ncache.h,v 1.25.48.2 2009/12/30 23:47:31 tbox Exp $ */ #ifndef DNS_NCACHE_H #define DNS_NCACHE_H 1 diff --git a/lib/dns/include/dns/nsec3.h b/lib/dns/include/dns/nsec3.h index 2d6a8dd..6243fdb 100644 --- a/lib/dns/include/dns/nsec3.h +++ b/lib/dns/include/dns/nsec3.h @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsec3.h,v 1.5.48.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: nsec3.h,v 1.5.48.3 2009/10/06 21:20:18 each Exp $ */ #ifndef DNS_NSEC3_H #define DNS_NSEC3_H 1 @@ -28,6 +28,8 @@ #include #include +#define DNS_NSEC3_SALTSIZE 255 + /* * hash = 1, flags =1, iterations = 2, salt length = 1, salt = 255 (max) * hash length = 1, hash = 255 (max), bitmap = 8192 + 512 (max) diff --git a/lib/dns/include/dns/rbt.h b/lib/dns/include/dns/rbt.h index 6eea787..2615596 100644 --- a/lib/dns/include/dns/rbt.h +++ b/lib/dns/include/dns/rbt.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbt.h,v 1.71.48.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: rbt.h,v 1.71.48.3 2009/10/20 05:06:04 marka Exp $ */ #ifndef DNS_RBT_H #define DNS_RBT_H 1 @@ -105,11 +105,11 @@ struct dns_rbtnode { unsigned int is_root : 1; /*%< range is 0..1 */ unsigned int color : 1; /*%< range is 0..1 */ unsigned int find_callback : 1; /*%< range is 0..1 */ - unsigned int attributes : 3; /*%< range is 0..2 */ + unsigned int attributes : 4; /*%< range is 0..2 */ unsigned int nsec3 : 1; /*%< range is 0..1 */ unsigned int namelen : 8; /*%< range is 1..255 */ unsigned int offsetlen : 8; /*%< range is 1..128 */ - unsigned int padbytes : 9; /*%< range is 0..380 */ + unsigned int oldnamelen : 8; /*%< range is 1..255 */ /*@}*/ #ifdef DNS_RBT_USEHASH diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h index 525dd8d..10ce229 100644 --- a/lib/dns/include/dns/types.h +++ b/lib/dns/include/dns/types.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: types.h,v 1.130.50.3.12.2 2009/12/31 20:29:21 each Exp $ */ +/* $Id: types.h,v 1.130.50.5 2009/12/30 08:34:30 jinmei Exp $ */ #ifndef DNS_TYPES_H #define DNS_TYPES_H 1 diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index e2859ae..746b43c 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.h,v 1.160.50.4 2009/01/29 22:40:35 jinmei Exp $ */ +/* $Id: zone.h,v 1.160.50.6 2009/10/05 21:57:00 each Exp $ */ #ifndef DNS_ZONE_H #define DNS_ZONE_H 1 @@ -149,13 +149,24 @@ dns_zone_getclass(dns_zone_t *zone); *\li 'zone' to be a valid zone. */ +isc_result_t +dns_zone_getserial2(dns_zone_t *zone, isc_uint32_t *serialp); + isc_uint32_t dns_zone_getserial(dns_zone_t *zone); /*%< - * Returns the current serial number of the zone. + * Returns the current serial number of the zone. On success, the SOA + * serial of the zone will be copied into '*serialp'. + * dns_zone_getserial() cannot catch failure cases and is deprecated by + * dns_zone_getserial2(). * * Requires: *\li 'zone' to be a valid zone. + *\li 'serialp' to be non NULL + * + * Returns: + *\li #ISC_R_SUCCESS + *\li #DNS_R_NOTLOADED zone DB is not loaded */ void @@ -256,6 +267,9 @@ dns_zone_load(dns_zone_t *zone); isc_result_t dns_zone_loadnew(dns_zone_t *zone); + +isc_result_t +dns_zone_loadandthaw(dns_zone_t *zone); /*%< * Cause the database to be loaded from its backing store. * Confirm that the minimum requirements for the zone type are @@ -264,6 +278,8 @@ dns_zone_loadnew(dns_zone_t *zone); * dns_zone_loadnew() only loads zones that are not yet loaded. * dns_zone_load() also loads zones that are already loaded and * and whose master file has changed since the last load. + * dns_zone_loadandthaw() is similar to dns_zone_load() but will + * also re-enable DNS UPDATEs when the load completes. * * Require: *\li 'zone' to be a valid zone. diff --git a/lib/dns/include/dst/dst.h b/lib/dns/include/dst/dst.h index 702ad71..de262bd 100644 --- a/lib/dns/include/dst/dst.h +++ b/lib/dns/include/dst/dst.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dst.h,v 1.12 2008/09/24 02:46:23 marka Exp $ */ +/* $Id: dst.h,v 1.12.50.2 2010/01/15 23:47:34 tbox Exp $ */ #ifndef DST_DST_H #define DST_DST_H 1 @@ -53,6 +53,8 @@ typedef struct dst_context dst_context_t; #define DST_ALG_RSASHA1 5 #define DST_ALG_NSEC3DSA 6 #define DST_ALG_NSEC3RSASHA1 7 +#define DST_ALG_RSASHA256 8 +#define DST_ALG_RSASHA512 10 #define DST_ALG_HMACMD5 157 #define DST_ALG_GSSAPI 160 #define DST_ALG_HMACSHA1 161 /* XXXMPA */ diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 8c21f1e..638e647 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: journal.c,v 1.103.48.2 2009/01/18 23:47:37 tbox Exp $ */ +/* $Id: journal.c,v 1.103.48.6 2009/11/04 23:47:25 tbox Exp $ */ #include @@ -1218,7 +1218,9 @@ dns_journal_destroy(dns_journal_t **journalp) { /* XXX Share code with incoming IXFR? */ static isc_result_t -roll_forward(dns_journal_t *j, dns_db_t *db, unsigned int options) { +roll_forward(dns_journal_t *j, dns_db_t *db, unsigned int options, + isc_uint32_t resign) +{ isc_buffer_t source; /* Transaction data from disk */ isc_buffer_t target; /* Ditto after _fromwire check */ isc_uint32_t db_serial; /* Database SOA serial */ @@ -1235,6 +1237,7 @@ roll_forward(dns_journal_t *j, dns_db_t *db, unsigned int options) { REQUIRE(DNS_DB_VALID(db)); dns_diff_init(j->mctx, &diff); + diff.resign = resign; /* * Set up empty initial buffers for unchecked and checked @@ -1353,6 +1356,14 @@ isc_result_t dns_journal_rollforward(isc_mem_t *mctx, dns_db_t *db, unsigned int options, const char *filename) { + REQUIRE((options & DNS_JOURNALOPT_RESIGN) == 0); + return (dns_journal_rollforward2(mctx, db, options, 0, filename)); +} + +isc_result_t +dns_journal_rollforward2(isc_mem_t *mctx, dns_db_t *db, unsigned int options, + isc_uint32_t resign, const char *filename) +{ dns_journal_t *j; isc_result_t result; @@ -1371,7 +1382,7 @@ dns_journal_rollforward(isc_mem_t *mctx, dns_db_t *db, if (JOURNAL_EMPTY(&j->header)) result = DNS_R_UPTODATE; else - result = roll_forward(j, db, options); + result = roll_forward(j, db, options, resign); dns_journal_destroy(&j); @@ -1850,18 +1861,11 @@ dns_diff_subtract(dns_diff_t diff[2], dns_diff_t *r) { return (result); } -/* - * Compare the databases 'dba' and 'dbb' and generate a journal - * entry containing the changes to make 'dba' from 'dbb' (note - * the order). This journal entry will consist of a single, - * possibly very large transaction. - */ - -isc_result_t -dns_db_diff(isc_mem_t *mctx, - dns_db_t *dba, dns_dbversion_t *dbvera, - dns_db_t *dbb, dns_dbversion_t *dbverb, - const char *journal_filename) +static isc_result_t +diff_namespace(isc_mem_t *mctx, + dns_db_t *dba, dns_dbversion_t *dbvera, + dns_db_t *dbb, dns_dbversion_t *dbverb, + unsigned int options, dns_diff_t *resultdiff) { dns_db_t *db[2]; dns_dbversion_t *ver[2]; @@ -1869,30 +1873,24 @@ dns_db_diff(isc_mem_t *mctx, isc_boolean_t have[2] = { ISC_FALSE, ISC_FALSE }; dns_fixedname_t fixname[2]; isc_result_t result, itresult[2]; - dns_diff_t diff[2], resultdiff; + dns_diff_t diff[2]; int i, t; - dns_journal_t *journal = NULL; db[0] = dba, db[1] = dbb; ver[0] = dbvera, ver[1] = dbverb; dns_diff_init(mctx, &diff[0]); dns_diff_init(mctx, &diff[1]); - dns_diff_init(mctx, &resultdiff); dns_fixedname_init(&fixname[0]); dns_fixedname_init(&fixname[1]); - result = dns_journal_open(mctx, journal_filename, ISC_TRUE, &journal); + result = dns_db_createiterator(db[0], options, &dbit[0]); if (result != ISC_R_SUCCESS) return (result); - - result = dns_db_createiterator(db[0], 0, &dbit[0]); - if (result != ISC_R_SUCCESS) - goto cleanup_journal; - result = dns_db_createiterator(db[1], 0, &dbit[1]); + result = dns_db_createiterator(db[1], options, &dbit[1]); if (result != ISC_R_SUCCESS) - goto cleanup_interator0; + goto cleanup_iterator; itresult[0] = dns_dbiterator_first(dbit[0]); itresult[1] = dns_dbiterator_first(dbit[1]); @@ -1919,7 +1917,7 @@ dns_db_diff(isc_mem_t *mctx, for (i = 0; i < 2; i++) { if (! have[!i]) { - ISC_LIST_APPENDLIST(resultdiff.tuples, + ISC_LIST_APPENDLIST(resultdiff->tuples, diff[i].tuples, link); INSIST(ISC_LIST_EMPTY(diff[i].tuples)); have[i] = ISC_FALSE; @@ -1930,21 +1928,21 @@ dns_db_diff(isc_mem_t *mctx, t = dns_name_compare(dns_fixedname_name(&fixname[0]), dns_fixedname_name(&fixname[1])); if (t < 0) { - ISC_LIST_APPENDLIST(resultdiff.tuples, + ISC_LIST_APPENDLIST(resultdiff->tuples, diff[0].tuples, link); INSIST(ISC_LIST_EMPTY(diff[0].tuples)); have[0] = ISC_FALSE; continue; } if (t > 0) { - ISC_LIST_APPENDLIST(resultdiff.tuples, + ISC_LIST_APPENDLIST(resultdiff->tuples, diff[1].tuples, link); INSIST(ISC_LIST_EMPTY(diff[1].tuples)); have[1] = ISC_FALSE; continue; } INSIST(t == 0); - CHECK(dns_diff_subtract(diff, &resultdiff)); + CHECK(dns_diff_subtract(diff, resultdiff)); INSIST(ISC_LIST_EMPTY(diff[0].tuples)); INSIST(ISC_LIST_EMPTY(diff[1].tuples)); have[0] = have[1] = ISC_FALSE; @@ -1955,20 +1953,49 @@ dns_db_diff(isc_mem_t *mctx, if (itresult[1] != ISC_R_NOMORE) FAIL(itresult[1]); + INSIST(ISC_LIST_EMPTY(diff[0].tuples)); + INSIST(ISC_LIST_EMPTY(diff[1].tuples)); + + failure: + dns_dbiterator_destroy(&dbit[1]); + cleanup_iterator: + dns_dbiterator_destroy(&dbit[0]); + return (result); +} + +/* + * Compare the databases 'dba' and 'dbb' and generate a journal + * entry containing the changes to make 'dba' from 'dbb' (note + * the order). This journal entry will consist of a single, + * possibly very large transaction. + */ +isc_result_t +dns_db_diff(isc_mem_t *mctx, + dns_db_t *dba, dns_dbversion_t *dbvera, + dns_db_t *dbb, dns_dbversion_t *dbverb, + const char *journal_filename) +{ + isc_result_t result; + dns_journal_t *journal = NULL; + dns_diff_t resultdiff; + + result = dns_journal_open(mctx, journal_filename, ISC_TRUE, &journal); + if (result != ISC_R_SUCCESS) + return (result); + + dns_diff_init(mctx, &resultdiff); + + CHECK(diff_namespace(mctx, dba, dbvera, dbb, dbverb, + DNS_DB_NONSEC3, &resultdiff)); + CHECK(diff_namespace(mctx, dba, dbvera, dbb, dbverb, + DNS_DB_NSEC3ONLY, &resultdiff)); if (ISC_LIST_EMPTY(resultdiff.tuples)) { isc_log_write(JOURNAL_DEBUG_LOGARGS(3), "no changes"); } else { CHECK(dns_journal_write_transaction(journal, &resultdiff)); } - INSIST(ISC_LIST_EMPTY(diff[0].tuples)); - INSIST(ISC_LIST_EMPTY(diff[1].tuples)); - failure: dns_diff_clear(&resultdiff); - dns_dbiterator_destroy(&dbit[1]); - cleanup_interator0: - dns_dbiterator_destroy(&dbit[0]); - cleanup_journal: dns_journal_destroy(&journal); return (result); } diff --git a/lib/dns/masterdump.c b/lib/dns/masterdump.c index 1dbb1e6..314112c 100644 --- a/lib/dns/masterdump.c +++ b/lib/dns/masterdump.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: masterdump.c,v 1.94.50.2.12.1 2009/11/18 23:58:04 marka Exp $ */ +/* $Id: masterdump.c,v 1.94.50.3 2009/11/18 00:15:37 marka Exp $ */ /*! \file */ diff --git a/lib/dns/message.c b/lib/dns/message.c index b541635..2e34120 100644 --- a/lib/dns/message.c +++ b/lib/dns/message.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: message.c,v 1.245.50.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: message.c,v 1.245.50.3 2009/11/24 03:25:53 marka Exp $ */ /*! \file */ @@ -1888,6 +1888,8 @@ dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid, msg->counts[sectionid] += total; return (result); } + if (result == ISC_R_NOSPACE) + msg->flags |= DNS_MESSAGEFLAG_TC; if (result != ISC_R_SUCCESS) { INSIST(st.used < 65536); dns_compress_rollback(msg->cctx, diff --git a/lib/dns/nsec3.c b/lib/dns/nsec3.c index f9b8cad..ea6546d 100644 --- a/lib/dns/nsec3.c +++ b/lib/dns/nsec3.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsec3.c,v 1.6.12.2 2009/06/04 02:56:14 tbox Exp $ */ +/* $Id: nsec3.c,v 1.6.12.4 2009/11/03 23:47:46 tbox Exp $ */ #include @@ -87,6 +87,8 @@ dns_nsec3_buildrdata(dns_db_t *db, dns_dbversion_t *version, unsigned int i, window; int octet; isc_boolean_t found; + isc_boolean_t found_ns; + isc_boolean_t need_rrsig; unsigned char *nsec_bits, *bm; unsigned int max_type; @@ -140,7 +142,7 @@ dns_nsec3_buildrdata(dns_db_t *db, dns_dbversion_t *version, result = dns_db_allrdatasets(db, node, version, 0, &rdsiter); if (result != ISC_R_SUCCESS) return (result); - found = ISC_FALSE; + found = found_ns = need_rrsig = ISC_FALSE; for (result = dns_rdatasetiter_first(rdsiter); result == ISC_R_SUCCESS; result = dns_rdatasetiter_next(rdsiter)) @@ -152,13 +154,26 @@ dns_nsec3_buildrdata(dns_db_t *db, dns_dbversion_t *version, if (rdataset.type > max_type) max_type = rdataset.type; set_bit(bm, rdataset.type, 1); - /* Don't set RRSIG for insecure delegation. */ - if (rdataset.type != dns_rdatatype_ns) + /* + * Work out if we need to set the RRSIG bit for + * this node. We set the RRSIG bit if either of + * the following conditions are met: + * 1) We have a SOA or DS then we need to set + * the RRSIG bit as both always will be signed. + * 2) We set the RRSIG bit if we don't have + * a NS record but do have other data. + */ + if (rdataset.type == dns_rdatatype_soa || + rdataset.type == dns_rdatatype_ds) + need_rrsig = ISC_TRUE; + else if (rdataset.type == dns_rdatatype_ns) + found_ns = ISC_TRUE; + else found = ISC_TRUE; } dns_rdataset_disassociate(&rdataset); } - if (found) { + if ((found && !found_ns) || need_rrsig) { if (dns_rdatatype_rrsig > max_type) max_type = dns_rdatatype_rrsig; set_bit(bm, dns_rdatatype_rrsig, 1); diff --git a/lib/dns/opensslrsa_link.c b/lib/dns/opensslrsa_link.c index d557c43..95095d11 100644 --- a/lib/dns/opensslrsa_link.c +++ b/lib/dns/opensslrsa_link.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -17,21 +17,23 @@ /* * Principal Author: Brian Wellington - * $Id: opensslrsa_link.c,v 1.20.50.3 2009/01/18 23:25:16 marka Exp $ + * $Id: opensslrsa_link.c,v 1.20.50.8 2010/01/22 02:36:49 marka Exp $ */ #ifdef OPENSSL +#include + #ifndef USE_EVP +#if !defined(HAVE_EVP_SHA256) || !defined(HAVE_EVP_SHA512) +#define USE_EVP 0 +#else #define USE_EVP 1 #endif -#if USE_EVP -#define USE_EVP_RSA 1 #endif -#include - #include #include #include +#include #include #include #include @@ -112,23 +114,42 @@ static isc_result_t opensslrsa_createctx(dst_key_t *key, dst_context_t *dctx) { #if USE_EVP EVP_MD_CTX *evp_md_ctx; - const EVP_MD *type; + const EVP_MD *type = NULL; #endif UNUSED(key); REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 || dctx->key->key_alg == DST_ALG_RSASHA1 || - dctx->key->key_alg == DST_ALG_NSEC3RSASHA1); + dctx->key->key_alg == DST_ALG_NSEC3RSASHA1 || + dctx->key->key_alg == DST_ALG_RSASHA256 || + dctx->key->key_alg == DST_ALG_RSASHA512); #if USE_EVP evp_md_ctx = EVP_MD_CTX_create(); if (evp_md_ctx == NULL) return (ISC_R_NOMEMORY); - if (dctx->key->key_alg == DST_ALG_RSAMD5) + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: type = EVP_md5(); /* MD5 + RSA */ - else + break; + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: type = EVP_sha1(); /* SHA1 + RSA */ + break; +#ifdef HAVE_EVP_SHA256 + case DST_ALG_RSASHA256: + type = EVP_sha256(); /* SHA256 + RSA */ + break; +#endif +#ifdef HAVE_EVP_SHA512 + case DST_ALG_RSASHA512: + type = EVP_sha512(); + break; +#endif + default: + INSIST(0); + } if (!EVP_DigestInit_ex(evp_md_ctx, type, NULL)) { EVP_MD_CTX_destroy(evp_md_ctx); @@ -136,22 +157,56 @@ opensslrsa_createctx(dst_key_t *key, dst_context_t *dctx) { } dctx->ctxdata.evp_md_ctx = evp_md_ctx; #else - if (dctx->key->key_alg == DST_ALG_RSAMD5) { - isc_md5_t *md5ctx; - - md5ctx = isc_mem_get(dctx->mctx, sizeof(isc_md5_t)); - if (md5ctx == NULL) - return (ISC_R_NOMEMORY); - isc_md5_init(md5ctx); - dctx->ctxdata.md5ctx = md5ctx; - } else { - isc_sha1_t *sha1ctx; - - sha1ctx = isc_mem_get(dctx->mctx, sizeof(isc_sha1_t)); - if (sha1ctx == NULL) - return (ISC_R_NOMEMORY); - isc_sha1_init(sha1ctx); - dctx->ctxdata.sha1ctx = sha1ctx; + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + { + isc_md5_t *md5ctx; + + md5ctx = isc_mem_get(dctx->mctx, sizeof(isc_md5_t)); + if (md5ctx == NULL) + return (ISC_R_NOMEMORY); + isc_md5_init(md5ctx); + dctx->ctxdata.md5ctx = md5ctx; + } + break; + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + { + isc_sha1_t *sha1ctx; + + sha1ctx = isc_mem_get(dctx->mctx, sizeof(isc_sha1_t)); + if (sha1ctx == NULL) + return (ISC_R_NOMEMORY); + isc_sha1_init(sha1ctx); + dctx->ctxdata.sha1ctx = sha1ctx; + } + break; + case DST_ALG_RSASHA256: + { + isc_sha256_t *sha256ctx; + + sha256ctx = isc_mem_get(dctx->mctx, + sizeof(isc_sha256_t)); + if (sha256ctx == NULL) + return (ISC_R_NOMEMORY); + isc_sha256_init(sha256ctx); + dctx->ctxdata.sha256ctx = sha256ctx; + } + break; + case DST_ALG_RSASHA512: + { + isc_sha512_t *sha512ctx; + + sha512ctx = isc_mem_get(dctx->mctx, + sizeof(isc_sha512_t)); + if (sha512ctx == NULL) + return (ISC_R_NOMEMORY); + isc_sha512_init(sha512ctx); + dctx->ctxdata.sha512ctx = sha512ctx; + } + break; + default: + INSIST(0); } #endif @@ -166,7 +221,9 @@ opensslrsa_destroyctx(dst_context_t *dctx) { REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 || dctx->key->key_alg == DST_ALG_RSASHA1 || - dctx->key->key_alg == DST_ALG_NSEC3RSASHA1); + dctx->key->key_alg == DST_ALG_NSEC3RSASHA1 || + dctx->key->key_alg == DST_ALG_RSASHA256 || + dctx->key->key_alg == DST_ALG_RSASHA512); #if USE_EVP if (evp_md_ctx != NULL) { @@ -174,22 +231,58 @@ opensslrsa_destroyctx(dst_context_t *dctx) { dctx->ctxdata.evp_md_ctx = NULL; } #else - if (dctx->key->key_alg == DST_ALG_RSAMD5) { - isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; - - if (md5ctx != NULL) { - isc_md5_invalidate(md5ctx); - isc_mem_put(dctx->mctx, md5ctx, sizeof(isc_md5_t)); - dctx->ctxdata.md5ctx = NULL; + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + { + isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; + + if (md5ctx != NULL) { + isc_md5_invalidate(md5ctx); + isc_mem_put(dctx->mctx, md5ctx, + sizeof(isc_md5_t)); + dctx->ctxdata.md5ctx = NULL; + } } - } else { - isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; - - if (sha1ctx != NULL) { - isc_sha1_invalidate(sha1ctx); - isc_mem_put(dctx->mctx, sha1ctx, sizeof(isc_sha1_t)); - dctx->ctxdata.sha1ctx = NULL; + break; + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + { + isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; + + if (sha1ctx != NULL) { + isc_sha1_invalidate(sha1ctx); + isc_mem_put(dctx->mctx, sha1ctx, + sizeof(isc_sha1_t)); + dctx->ctxdata.sha1ctx = NULL; + } + } + break; + case DST_ALG_RSASHA256: + { + isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx; + + if (sha256ctx != NULL) { + isc_sha256_invalidate(sha256ctx); + isc_mem_put(dctx->mctx, sha256ctx, + sizeof(isc_sha256_t)); + dctx->ctxdata.sha256ctx = NULL; + } } + break; + case DST_ALG_RSASHA512: + { + isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx; + + if (sha512ctx != NULL) { + isc_sha512_invalidate(sha512ctx); + isc_mem_put(dctx->mctx, sha512ctx, + sizeof(isc_sha512_t)); + dctx->ctxdata.sha512ctx = NULL; + } + } + break; + default: + INSIST(0); } #endif } @@ -202,24 +295,67 @@ opensslrsa_adddata(dst_context_t *dctx, const isc_region_t *data) { REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 || dctx->key->key_alg == DST_ALG_RSASHA1 || - dctx->key->key_alg == DST_ALG_NSEC3RSASHA1); + dctx->key->key_alg == DST_ALG_NSEC3RSASHA1 || + dctx->key->key_alg == DST_ALG_RSASHA256 || + dctx->key->key_alg == DST_ALG_RSASHA512); #if USE_EVP if (!EVP_DigestUpdate(evp_md_ctx, data->base, data->length)) { return (ISC_R_FAILURE); } #else - if (dctx->key->key_alg == DST_ALG_RSAMD5) { - isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; - isc_md5_update(md5ctx, data->base, data->length); - } else { - isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; - isc_sha1_update(sha1ctx, data->base, data->length); + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + { + isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; + + isc_md5_update(md5ctx, data->base, data->length); + } + break; + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + { + isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; + + isc_sha1_update(sha1ctx, data->base, data->length); + } + break; + case DST_ALG_RSASHA256: + { + isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx; + + isc_sha256_update(sha256ctx, data->base, data->length); + } + break; + case DST_ALG_RSASHA512: + { + isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx; + + isc_sha512_update(sha512ctx, data->base, data->length); + } + break; + default: + INSIST(0); } #endif return (ISC_R_SUCCESS); } +#if ! USE_EVP && OPENSSL_VERSION_NUMBER < 0x00908000L +/* + * Digest prefixes from RFC 5702. + */ +static unsigned char sha256_prefix[] = + { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20}; +static unsigned char sha512_prefix[] = + { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40}; +#define PREFIXLEN sizeof(sha512_prefix) +#else +#define PREFIXLEN 0 +#endif + static isc_result_t opensslrsa_sign(dst_context_t *dctx, isc_buffer_t *sig) { dst_key_t *key = dctx->key; @@ -230,20 +366,26 @@ opensslrsa_sign(dst_context_t *dctx, isc_buffer_t *sig) { EVP_PKEY *pkey = key->keydata.pkey; #else RSA *rsa = key->keydata.rsa; - /* note: ISC_SHA1_DIGESTLENGTH > ISC_MD5_DIGESTLENGTH */ - unsigned char digest[ISC_SHA1_DIGESTLENGTH]; - int status; - int type; - unsigned int digestlen; + /* note: ISC_SHA512_DIGESTLENGTH >= ISC_*_DIGESTLENGTH */ + unsigned char digest[PREFIXLEN + ISC_SHA512_DIGESTLENGTH]; + int status = 0; + int type = 0; + unsigned int digestlen = 0; char *message; unsigned long err; const char* file; int line; +#if OPENSSL_VERSION_NUMBER < 0x00908000L + unsigned int prefixlen = 0; + const unsigned char *prefix = NULL; +#endif #endif REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 || dctx->key->key_alg == DST_ALG_RSASHA1 || - dctx->key->key_alg == DST_ALG_NSEC3RSASHA1); + dctx->key->key_alg == DST_ALG_NSEC3RSASHA1 || + dctx->key->key_alg == DST_ALG_RSASHA256 || + dctx->key->key_alg == DST_ALG_RSASHA512); isc_buffer_availableregion(sig, &r); @@ -258,19 +400,92 @@ opensslrsa_sign(dst_context_t *dctx, isc_buffer_t *sig) { if (r.length < (unsigned int) RSA_size(rsa)) return (ISC_R_NOSPACE); - if (dctx->key->key_alg == DST_ALG_RSAMD5) { - isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; - isc_md5_final(md5ctx, digest); - type = NID_md5; - digestlen = ISC_MD5_DIGESTLENGTH; - } else { - isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; - isc_sha1_final(sha1ctx, digest); - type = NID_sha1; - digestlen = ISC_SHA1_DIGESTLENGTH; + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + { + isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; + + isc_md5_final(md5ctx, digest); + type = NID_md5; + digestlen = ISC_MD5_DIGESTLENGTH; + } + break; + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + { + isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; + + isc_sha1_final(sha1ctx, digest); + type = NID_sha1; + digestlen = ISC_SHA1_DIGESTLENGTH; + } + break; + case DST_ALG_RSASHA256: + { + isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx; + + isc_sha256_final(digest, sha256ctx); + digestlen = ISC_SHA256_DIGESTLENGTH; +#if OPENSSL_VERSION_NUMBER < 0x00908000L + prefix = sha256_prefix; + prefixlen = sizeof(sha256_prefix); +#else + type = NID_sha256; +#endif + } + break; + case DST_ALG_RSASHA512: + { + isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx; + + isc_sha512_final(digest, sha512ctx); + digestlen = ISC_SHA512_DIGESTLENGTH; +#if OPENSSL_VERSION_NUMBER < 0x00908000L + prefix = sha512_prefix; + prefixlen = sizeof(sha512_prefix); +#else + type = NID_sha512; +#endif + } + break; + default: + INSIST(0); } +#if OPENSSL_VERSION_NUMBER < 0x00908000L + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + INSIST(type != 0); + status = RSA_sign(type, digest, digestlen, r.base, + &siglen, rsa); + break; + + case DST_ALG_RSASHA256: + case DST_ALG_RSASHA512: + INSIST(prefix != NULL); + INSIST(prefixlen != 0); + INSIST(prefixlen + digestlen <= sizeof(digest)); + + memmove(digest + prefixlen, digest, digestlen); + memcpy(digest, prefix, prefixlen); + status = RSA_private_encrypt(digestlen + prefixlen, + digest, r.base, rsa, + RSA_PKCS1_PADDING); + if (status < 0) + status = 0; + else + siglen = status; + break; + + default: + INSIST(0); + } +#else + INSIST(type != 0); status = RSA_sign(type, digest, digestlen, r.base, &siglen, rsa); +#endif if (status == 0) { err = ERR_peek_error_line(&file, &line); if (err != 0U) { @@ -293,37 +508,129 @@ opensslrsa_verify(dst_context_t *dctx, const isc_region_t *sig) { EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx; EVP_PKEY *pkey = key->keydata.pkey; #else - /* note: ISC_SHA1_DIGESTLENGTH > ISC_MD5_DIGESTLENGTH */ - unsigned char digest[ISC_SHA1_DIGESTLENGTH]; - int type; - unsigned int digestlen; + /* note: ISC_SHA512_DIGESTLENGTH >= ISC_*_DIGESTLENGTH */ + unsigned char digest[ISC_SHA512_DIGESTLENGTH]; + int type = 0; + unsigned int digestlen = 0; RSA *rsa = key->keydata.rsa; +#if OPENSSL_VERSION_NUMBER < 0x00908000L + unsigned int prefixlen = 0; + const unsigned char *prefix = NULL; +#endif #endif REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 || dctx->key->key_alg == DST_ALG_RSASHA1 || - dctx->key->key_alg == DST_ALG_NSEC3RSASHA1); + dctx->key->key_alg == DST_ALG_NSEC3RSASHA1 || + dctx->key->key_alg == DST_ALG_RSASHA256 || + dctx->key->key_alg == DST_ALG_RSASHA512); #if USE_EVP status = EVP_VerifyFinal(evp_md_ctx, sig->base, sig->length, pkey); #else - if (dctx->key->key_alg == DST_ALG_RSAMD5) { - isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; - isc_md5_final(md5ctx, digest); - type = NID_md5; - digestlen = ISC_MD5_DIGESTLENGTH; - } else { - isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; - isc_sha1_final(sha1ctx, digest); - type = NID_sha1; - digestlen = ISC_SHA1_DIGESTLENGTH; + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + { + isc_md5_t *md5ctx = dctx->ctxdata.md5ctx; + + isc_md5_final(md5ctx, digest); + type = NID_md5; + digestlen = ISC_MD5_DIGESTLENGTH; + } + break; + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + { + isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx; + + isc_sha1_final(sha1ctx, digest); + type = NID_sha1; + digestlen = ISC_SHA1_DIGESTLENGTH; + } + break; + case DST_ALG_RSASHA256: + { + isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx; + + isc_sha256_final(digest, sha256ctx); + digestlen = ISC_SHA256_DIGESTLENGTH; +#if OPENSSL_VERSION_NUMBER < 0x00908000L + prefix = sha256_prefix; + prefixlen = sizeof(sha256_prefix); +#else + type = NID_sha256; +#endif + } + break; + case DST_ALG_RSASHA512: + { + isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx; + + isc_sha512_final(digest, sha512ctx); + digestlen = ISC_SHA512_DIGESTLENGTH; +#if OPENSSL_VERSION_NUMBER < 0x00908000L + prefix = sha512_prefix; + prefixlen = sizeof(sha512_prefix); +#else + type = NID_sha512; +#endif + } + break; + default: + INSIST(0); } - if (sig->length < (unsigned int) RSA_size(rsa)) + if (sig->length != (unsigned int) RSA_size(rsa)) return (DST_R_VERIFYFAILURE); +#if OPENSSL_VERSION_NUMBER < 0x00908000L + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + INSIST(type != 0); + status = RSA_verify(type, digest, digestlen, sig->base, + RSA_size(rsa), rsa); + break; + + case DST_ALG_RSASHA256: + case DST_ALG_RSASHA512: + { + /* + * 1024 is big enough for all valid RSA bit sizes + * for use with DNSSEC. + */ + unsigned char original[PREFIXLEN + 1024]; + + INSIST(prefix != NULL); + INSIST(prefixlen != 0U); + + if (RSA_size(rsa) > (int)sizeof(original)) + return (DST_R_VERIFYFAILURE); + + status = RSA_public_decrypt(sig->length, sig->base, + original, rsa, + RSA_PKCS1_PADDING); + if (status <= 0) + return (DST_R_VERIFYFAILURE); + if (status != (int)(prefixlen + digestlen)) + return (DST_R_VERIFYFAILURE); + if (memcmp(original, prefix, prefixlen)) + return (DST_R_VERIFYFAILURE); + if (memcmp(original + prefixlen, digest, digestlen)) + return (DST_R_VERIFYFAILURE); + status = 1; + } + break; + + default: + INSIST(0); + } +#else + INSIST(type != 0); status = RSA_verify(type, digest, digestlen, sig->base, - RSA_size(rsa), rsa); + RSA_size(rsa), rsa); +#endif #endif if (status != 1) return (dst__openssl_toresult(DST_R_VERIFYFAILURE)); @@ -552,19 +859,20 @@ opensslrsa_todns(const dst_key_t *key, isc_buffer_t *data) { if (r.length < 1) DST_RET(ISC_R_NOSPACE); isc_buffer_putuint8(data, (isc_uint8_t) e_bytes); + isc_region_consume(&r, 1); } else { if (r.length < 3) DST_RET(ISC_R_NOSPACE); isc_buffer_putuint8(data, 0); isc_buffer_putuint16(data, (isc_uint16_t) e_bytes); + isc_region_consume(&r, 3); } if (r.length < e_bytes + mod_bytes) - return (ISC_R_NOSPACE); - isc_buffer_availableregion(data, &r); + DST_RET(ISC_R_NOSPACE); BN_bn2bin(rsa->e, r.base); - r.base += e_bytes; + isc_region_consume(&r, e_bytes); BN_bn2bin(rsa->n, r.base); isc_buffer_add(data, e_bytes + mod_bytes); @@ -805,8 +1113,8 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) { DST_RET(DST_R_NOENGINE); pkey = ENGINE_load_private_key(e, label, NULL, NULL); if (pkey == NULL) { - ERR_print_errors_fp(stderr); - DST_RET(ISC_R_FAILURE); + /* ERR_print_errors_fp(stderr); */ + DST_RET(ISC_R_NOTFOUND); } key->engine = isc_mem_strdup(key->mctx, name); if (key->engine == NULL) @@ -924,7 +1232,7 @@ opensslrsa_fromlabel(dst_key_t *key, const char *engine, const char *label, DST_RET(DST_R_NOENGINE); pkey = ENGINE_load_private_key(e, label, NULL, NULL); if (pkey == NULL) - DST_RET(ISC_R_NOMEMORY); + DST_RET(ISC_R_NOTFOUND); key->engine = isc_mem_strdup(key->mctx, label); if (key->engine == NULL) DST_RET(ISC_R_NOMEMORY); @@ -969,10 +1277,26 @@ static dst_func_t opensslrsa_functions = { }; isc_result_t -dst__opensslrsa_init(dst_func_t **funcp) { +dst__opensslrsa_init(dst_func_t **funcp, unsigned char algorithm) { REQUIRE(funcp != NULL); - if (*funcp == NULL) - *funcp = &opensslrsa_functions; + + if (*funcp == NULL) { + switch (algorithm) { + case DST_ALG_RSASHA256: +#if defined(HAVE_EVP_SHA256) || !USE_EVP + *funcp = &opensslrsa_functions; +#endif + break; + case DST_ALG_RSASHA512: +#if defined(HAVE_EVP_SHA512) || !USE_EVP + *funcp = &opensslrsa_functions; +#endif + break; + default: + *funcp = &opensslrsa_functions; + break; + } + } return (ISC_R_SUCCESS); } diff --git a/lib/dns/rbt.c b/lib/dns/rbt.c index ff8b3a3..62a9e2b 100644 --- a/lib/dns/rbt.c +++ b/lib/dns/rbt.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbt.c,v 1.142.50.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: rbt.c,v 1.142.50.3 2009/10/20 05:06:04 marka Exp $ */ /*! \file */ @@ -85,9 +85,9 @@ struct dns_rbt { #define HASHVAL(node) ((node)->hashval) #define COLOR(node) ((node)->color) #define NAMELEN(node) ((node)->namelen) +#define OLDNAMELEN(node) ((node)->oldnamelen) #define OFFSETLEN(node) ((node)->offsetlen) #define ATTRS(node) ((node)->attributes) -#define PADBYTES(node) ((node)->padbytes) #define IS_ROOT(node) ISC_TF((node)->is_root == 1) #define FINDCALLBACK(node) ISC_TF((node)->find_callback == 1) @@ -100,13 +100,23 @@ struct dns_rbt { #define LOCKNUM(node) ((node)->locknum) /*% - * The variable length stuff stored after the node. + * The variable length stuff stored after the node has the following + * structure. + * + * {1..255}{1}{1..128} + * + * contains the name of the node when it was created. + * contains the length of when the node was created. + * contains the offets into name for each label when the node was + * created. */ + #define NAME(node) ((unsigned char *)((node) + 1)) -#define OFFSETS(node) (NAME(node) + NAMELEN(node)) +#define OFFSETS(node) (NAME(node) + OLDNAMELEN(node) + 1) +#define OLDOFFSETLEN(node) (OFFSETS(node)[-1]) #define NODE_SIZE(node) (sizeof(*node) + \ - NAMELEN(node) + OFFSETLEN(node) + PADBYTES(node)) + OLDNAMELEN(node) + OLDOFFSETLEN(node) + 1) /*% * Color management. @@ -553,11 +563,6 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) { NAMELEN(current) = prefix->length; OFFSETLEN(current) = prefix->labels; - memcpy(OFFSETS(current), prefix->offsets, - prefix->labels); - PADBYTES(current) += - (current_name.length - prefix->length) + - (current_name.labels - prefix->labels); /* * Set up the new root of the next level. @@ -1423,7 +1428,7 @@ create_node(isc_mem_t *mctx, dns_name_t *name, dns_rbtnode_t **nodep) { * Allocate space for the node structure, the name, and the offsets. */ node = (dns_rbtnode_t *)isc_mem_get(mctx, sizeof(*node) + - region.length + labels); + region.length + labels + 1); if (node == NULL) return (ISC_R_NOMEMORY); @@ -1460,10 +1465,12 @@ create_node(isc_mem_t *mctx, dns_name_t *name, dns_rbtnode_t **nodep) { * The offsets table could be made smaller by eliminating the * first offset, which is always 0. This requires changes to * lib/dns/name.c. + * + * Note: OLDOFFSETLEN *must* be assigned *after* OLDNAMELEN is assigned + * as it uses OLDNAMELEN. */ - NAMELEN(node) = region.length; - PADBYTES(node) = 0; - OFFSETLEN(node) = labels; + OLDNAMELEN(node) = NAMELEN(node) = region.length; + OLDOFFSETLEN(node) = OFFSETLEN(node) = labels; ATTRS(node) = name->attributes; memcpy(NAME(node), region.base, region.length); diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index d5b5b5c..f841ebe 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.6.10.2 2009/12/31 21:44:36 each Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.16 2009/12/30 08:34:30 jinmei Exp $ */ /*! \file */ @@ -258,21 +258,8 @@ typedef struct rdatasetheader { dns_rbtnode_t *node; isc_stdtime_t last_used; - ISC_LINK(struct rdatasetheader) lru_link; - /*%< - * Used for LRU-based cache management. We should probably make - * these cache-DB specific. We might also make it a pointer and - * ensure only the top header has a valid link to save memory. - * The linked-list is locked by the rbtdb->lrulock. - */ + ISC_LINK(struct rdatasetheader) link; - /* - * It's possible this should not be here anymore, but instead - * referenced from the bucket's heap directly. - */ -#if 0 - isc_heap_t *heap; -#endif unsigned int heap_index; /*%< * Used for TTL-based cache cleaning. @@ -396,7 +383,7 @@ typedef struct rbtdb_version { isc_uint8_t flags; isc_uint16_t iterations; isc_uint8_t salt_length; - unsigned char salt[NSEC3_MAX_HASH_LENGTH]; + unsigned char salt[DNS_NSEC3_SALTSIZE]; } rbtdb_version_t; typedef ISC_LIST(rbtdb_version_t) rbtdb_versionlist_t; @@ -1227,7 +1214,7 @@ free_noqname(isc_mem_t *mctx, struct noqname **noqname) { static inline void init_rdataset(dns_rbtdb_t *rbtdb, rdatasetheader_t *h) { - ISC_LINK_INIT(h, lru_link); + ISC_LINK_INIT(h, link); h->heap_index = 0; #if TRACE_HEADER @@ -1267,8 +1254,10 @@ free_rdataset(dns_rbtdb_t *rbtdb, isc_mem_t *mctx, rdatasetheader_t *rdataset) } idx = rdataset->node->locknum; - if (ISC_LINK_LINKED(rdataset, lru_link)) - ISC_LIST_UNLINK(rbtdb->rdatasets[idx], rdataset, lru_link); + if (ISC_LINK_LINKED(rdataset, link)) { + INSIST(IS_CACHE(rbtdb)); + ISC_LIST_UNLINK(rbtdb->rdatasets[idx], rdataset, link); + } if (rdataset->heap_index != 0) isc_heap_delete(rbtdb->heaps[idx], rdataset->heap_index); rdataset->heap_index = 0; @@ -2075,8 +2064,6 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version, continue; #endif - INSIST(nsec3param.salt_length <= - sizeof(version->salt)); memcpy(version->salt, nsec3param.salt, nsec3param.salt_length); version->hash = nsec3param.hash; @@ -2284,17 +2271,18 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) { for (header = HEAD(resigned_list); header != NULL; header = HEAD(resigned_list)) { - ISC_LIST_UNLINK(resigned_list, header, lru_link); - if (rollback) { - nodelock_t *lock; - lock = &rbtdb->node_locks[header->node->locknum].lock; - NODE_LOCK(lock, isc_rwlocktype_write); + nodelock_t *lock; + + ISC_LIST_UNLINK(resigned_list, header, link); + + lock = &rbtdb->node_locks[header->node->locknum].lock; + NODE_LOCK(lock, isc_rwlocktype_write); + if (rollback) resign_insert(rbtdb, header->node->locknum, header); - NODE_UNLOCK(lock, isc_rwlocktype_write); - } decrement_reference(rbtdb, header->node, least_serial, isc_rwlocktype_write, isc_rwlocktype_none, ISC_FALSE); + NODE_UNLOCK(lock, isc_rwlocktype_write); } if (!EMPTY(cleanup_list)) { @@ -3524,11 +3512,17 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, /* * The node may be a zone cut itself. If it might be one, * make sure we check for it later. + * + * DS records live above the zone cut in ordinary zone so + * we want to ignore any referral. + * + * Stub zones don't have anything "above" the delgation so + * we always return a referral. */ if (node->find_callback && - (node != search.rbtdb->origin_node || - IS_STUB(search.rbtdb)) && - !dns_rdatatype_atparent(type)) + ((node != search.rbtdb->origin_node && + !dns_rdatatype_atparent(type)) || + IS_STUB(search.rbtdb))) maybe_zonecut = ISC_TRUE; } @@ -3546,8 +3540,8 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * We now go looking for rdata... */ - NODE_LOCK(&(search.rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); + lock = &search.rbtdb->node_locks[node->locknum].lock; + NODE_LOCK(lock, isc_rwlocktype_read); found = NULL; foundsig = NULL; @@ -3625,8 +3619,10 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * we are using behave as if it isn't here. */ if (header->type == dns_rdatatype_nsec3 && - !matchparams(header, &search)) + !matchparams(header, &search)) { + NODE_UNLOCK(lock, isc_rwlocktype_read); goto partial_match; + } /* * If we found a type we were looking for, * remember it. @@ -3705,7 +3701,6 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * we really have a partial match. */ if (!wild) { - lock = &search.rbtdb->node_locks[node->locknum].lock; NODE_UNLOCK(lock, isc_rwlocktype_read); goto partial_match; } @@ -3722,7 +3717,6 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * * Return the delegation. */ - lock = &search.rbtdb->node_locks[node->locknum].lock; NODE_UNLOCK(lock, isc_rwlocktype_read); result = setup_delegation(&search, nodep, foundname, rdataset, sigrdataset); @@ -3744,7 +3738,6 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, goto node_exit; } - lock = &search.rbtdb->node_locks[node->locknum].lock; NODE_UNLOCK(lock, isc_rwlocktype_read); result = find_closest_nsec(&search, nodep, foundname, rdataset, sigrdataset, @@ -3829,7 +3822,6 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, if (result == DNS_R_GLUE && (search.options & DNS_DBFIND_VALIDATEGLUE) != 0 && !valid_glue(&search, foundname, type, node)) { - lock = &search.rbtdb->node_locks[node->locknum].lock; NODE_UNLOCK(lock, isc_rwlocktype_read); result = setup_delegation(&search, nodep, foundname, rdataset, sigrdataset); @@ -3861,8 +3853,7 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, foundname->attributes |= DNS_NAMEATTR_WILDCARD; node_exit: - NODE_UNLOCK(&(search.rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); + NODE_UNLOCK(lock, isc_rwlocktype_read); tree_exit: RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); @@ -5408,8 +5399,10 @@ static isc_result_t resign_insert(dns_rbtdb_t *rbtdb, int idx, rdatasetheader_t *newheader) { isc_result_t result; + INSIST(!IS_CACHE(rbtdb)); INSIST(newheader->heap_index == 0); - INSIST(!ISC_LINK_LINKED(newheader, lru_link)); + INSIST(!ISC_LINK_LINKED(newheader, link)); + result = isc_heap_insert(rbtdb->heaps[idx], newheader); return (result); } @@ -5735,7 +5728,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, idx = newheader->node->locknum; if (IS_CACHE(rbtdb)) { ISC_LIST_PREPEND(rbtdb->rdatasets[idx], - newheader, lru_link); + newheader, link); /* * XXXMLG We don't check the return value * here. If it fails, we will not do TTL @@ -5794,7 +5787,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, idx = newheader->node->locknum; if (IS_CACHE(rbtdb)) { ISC_LIST_PREPEND(rbtdb->rdatasets[idx], - newheader, lru_link); + newheader, link); isc_heap_insert(rbtdb->heaps[idx], newheader); } else if (RESIGN(newheader)) { resign_insert(rbtdb, idx, newheader); @@ -6519,11 +6512,17 @@ static void delete_callback(void *data, void *arg) { dns_rbtdb_t *rbtdb = arg; rdatasetheader_t *current, *next; + unsigned int locknum; - for (current = data; current != NULL; current = next) { + current = data; + locknum = current->node->locknum; + NODE_LOCK(&rbtdb->node_locks[locknum].lock, isc_rwlocktype_write); + while (current != NULL) { next = current->next; free_rdataset(rbtdb, rbtdb->common.mctx, current); + current = next; } + NODE_UNLOCK(&rbtdb->node_locks[locknum].lock, isc_rwlocktype_write); } static isc_boolean_t @@ -6642,8 +6641,8 @@ getnsec3parameters(dns_db_t *db, dns_dbversion_t *version, dns_hash_t *hash, if (rbtversion->havensec3) { if (hash != NULL) *hash = rbtversion->hash; - if (salt != NULL && salt_length != 0) { - REQUIRE(*salt_length > rbtversion->salt_length); + if (salt != NULL && salt_length != NULL) { + REQUIRE(*salt_length >= rbtversion->salt_length); memcpy(salt, rbtversion->salt, rbtversion->salt_length); } if (salt_length != NULL) @@ -6707,27 +6706,35 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, rdatasetheader_t *header = NULL, *this; unsigned int i; isc_result_t result = ISC_R_NOTFOUND; + unsigned int locknum; REQUIRE(VALID_RBTDB(rbtdb)); RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); for (i = 0; i < rbtdb->node_lock_count; i++) { + NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_read); this = isc_heap_element(rbtdb->heaps[i], 1); - if (this == NULL) + if (this == NULL) { + NODE_UNLOCK(&rbtdb->node_locks[i].lock, + isc_rwlocktype_read); continue; + } if (header == NULL) header = this; - else if (isc_serial_lt(this->resign, header->resign)) + else if (isc_serial_lt(this->resign, header->resign)) { + locknum = header->node->locknum; + NODE_UNLOCK(&rbtdb->node_locks[locknum].lock, + isc_rwlocktype_read); header = this; + } else + NODE_UNLOCK(&rbtdb->node_locks[i].lock, + isc_rwlocktype_read); } if (header == NULL) goto unlock; - NODE_LOCK(&rbtdb->node_locks[header->node->locknum].lock, - isc_rwlocktype_read); - bind_rdataset(rbtdb, header->node, header, 0, rdataset); if (foundname != NULL) @@ -6761,7 +6768,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version) header = rdataset->private3; header--; - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); NODE_LOCK(&rbtdb->node_locks[node->locknum].lock, isc_rwlocktype_write); /* @@ -6771,11 +6778,11 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version) new_reference(rbtdb, node); isc_heap_delete(rbtdb->heaps[node->locknum], header->heap_index); header->heap_index = 0; - ISC_LIST_APPEND(rbtversion->resigned_list, header, lru_link); + ISC_LIST_APPEND(rbtversion->resigned_list, header, link); NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock, isc_rwlocktype_write); - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); } static dns_stats_t * @@ -8497,13 +8504,11 @@ update_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, INSIST(IS_CACHE(rbtdb)); /* To be checked: can we really assume this? XXXMLG */ - INSIST(ISC_LINK_LINKED(header, lru_link)); + INSIST(ISC_LINK_LINKED(header, link)); - ISC_LIST_UNLINK(rbtdb->rdatasets[header->node->locknum], - header, lru_link); + ISC_LIST_UNLINK(rbtdb->rdatasets[header->node->locknum], header, link); header->last_used = now; - ISC_LIST_PREPEND(rbtdb->rdatasets[header->node->locknum], - header, lru_link); + ISC_LIST_PREPEND(rbtdb->rdatasets[header->node->locknum], header, link); } /*% @@ -8539,7 +8544,7 @@ overmem_purge(dns_rbtdb_t *rbtdb, unsigned int locknum_start, for (header = ISC_LIST_TAIL(rbtdb->rdatasets[locknum]); header != NULL && purgecount > 0; header = header_prev) { - header_prev = ISC_LIST_PREV(header, lru_link); + header_prev = ISC_LIST_PREV(header, link); /* * Unlink the entry at this point to avoid checking it * again even if it's currently used someone else and @@ -8548,7 +8553,7 @@ overmem_purge(dns_rbtdb_t *rbtdb, unsigned int locknum_start, * TTL was reset to 0. */ ISC_LIST_UNLINK(rbtdb->rdatasets[locknum], header, - lru_link); + link); expire_header(rbtdb, header, tree_locked); purgecount--; } diff --git a/lib/dns/rcode.c b/lib/dns/rcode.c index 58ade85..9feaeb0 100644 --- a/lib/dns/rcode.c +++ b/lib/dns/rcode.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rcode.c,v 1.8 2008/09/25 04:02:38 tbox Exp $ */ +/* $Id: rcode.c,v 1.8.48.2 2010/01/15 23:47:33 tbox Exp $ */ #include #include @@ -100,6 +100,8 @@ { DNS_KEYALG_ECC, "ECC", 0 }, \ { DNS_KEYALG_RSASHA1, "RSASHA1", 0 }, \ { DNS_KEYALG_NSEC3RSASHA1, "NSEC3RSASHA1", 0 }, \ + { DNS_KEYALG_RSASHA256, "RSASHA256", 0 }, \ + { DNS_KEYALG_RSASHA512, "RSASHA512", 0 }, \ { DNS_KEYALG_INDIRECT, "INDIRECT", 0 }, \ { DNS_KEYALG_PRIVATEDNS, "PRIVATEDNS", 0 }, \ { DNS_KEYALG_PRIVATEOID, "PRIVATEOID", 0 }, \ diff --git a/lib/dns/rdata/generic/ipseckey_45.c b/lib/dns/rdata/generic/ipseckey_45.c index bc2b4e8..6a58bc9 100644 --- a/lib/dns/rdata/generic/ipseckey_45.c +++ b/lib/dns/rdata/generic/ipseckey_45.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ipseckey_45.c,v 1.4.332.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: ipseckey_45.c,v 1.4.332.3 2009/09/18 21:55:48 jinmei Exp $ */ #ifndef RDATA_GENERIC_IPSECKEY_45_C #define RDATA_GENERIC_IPSECKEY_45_C @@ -243,6 +243,7 @@ fromwire_ipseckey(ARGS_FROMWIRE) { isc_buffer_forward(source, 3); RETERR(dns_name_fromwire(&name, source, dctx, options, target)); isc_buffer_activeregion(source, ®ion); + isc_buffer_forward(source, region.length); return(mem_tobuffer(target, region.base, region.length)); default: diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 1b4f407..02e96cd 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.384.14.14.8.2 2010/01/07 17:17:19 each Exp $ */ +/* $Id: resolver.c,v 1.384.14.20 2010/01/07 23:47:36 tbox Exp $ */ /*! \file */ @@ -2534,6 +2534,16 @@ findname(fetchctx_t *fctx, dns_name_t *name, in_port_t port, } } +static isc_boolean_t +isstrictsubdomain(dns_name_t *name1, dns_name_t *name2) { + int order; + unsigned int nlabels; + dns_namereln_t namereln; + + namereln = dns_name_fullcompare(name1, name2, &order, &nlabels); + return (ISC_TF(namereln == dns_namereln_subdomain)); +} + static isc_result_t fctx_getaddresses(fetchctx_t *fctx) { dns_rdata_t rdata = DNS_RDATA_INIT; @@ -2579,23 +2589,40 @@ fctx_getaddresses(fetchctx_t *fctx) { dns_name_t *name = &fctx->name; dns_name_t suffix; unsigned int labels; + dns_fixedname_t fixed; + dns_name_t *domain; /* * DS records are found in the parent server. * Strip label to get the correct forwarder (if any). */ - if (fctx->type == dns_rdatatype_ds && + if (dns_rdatatype_atparent(fctx->type) && dns_name_countlabels(name) > 1) { dns_name_init(&suffix, NULL); labels = dns_name_countlabels(name); dns_name_getlabelsequence(name, 1, labels - 1, &suffix); name = &suffix; } - result = dns_fwdtable_find(fctx->res->view->fwdtable, name, - &forwarders); + + dns_fixedname_init(&fixed); + domain = dns_fixedname_name(&fixed); + result = dns_fwdtable_find2(fctx->res->view->fwdtable, name, + domain, &forwarders); if (result == ISC_R_SUCCESS) { sa = ISC_LIST_HEAD(forwarders->addrs); fctx->fwdpolicy = forwarders->fwdpolicy; + if (fctx->fwdpolicy == dns_fwdpolicy_only && + isstrictsubdomain(domain, &fctx->domain)) { + isc_mem_t *mctx; + + mctx = res->buckets[fctx->bucketnum].mctx; + dns_name_free(&fctx->domain, mctx); + dns_name_init(&fctx->domain, NULL); + result = dns_name_dup(domain, mctx, + &fctx->domain); + if (result != ISC_R_SUCCESS) + return (result); + } } } @@ -3477,21 +3504,22 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, if (domain == NULL) { dns_forwarders_t *forwarders = NULL; unsigned int labels; + dns_name_t *fwdname = name; /* * DS records are found in the parent server. * Strip label to get the correct forwarder (if any). */ - if (fctx->type == dns_rdatatype_ds && + if (dns_rdatatype_atparent(fctx->type) && dns_name_countlabels(name) > 1) { dns_name_init(&suffix, NULL); labels = dns_name_countlabels(name); dns_name_getlabelsequence(name, 1, labels - 1, &suffix); - name = &suffix; + fwdname = &suffix; } dns_fixedname_init(&fixed); domain = dns_fixedname_name(&fixed); - result = dns_fwdtable_find2(fctx->res->view->fwdtable, name, + result = dns_fwdtable_find2(fctx->res->view->fwdtable, fwdname, domain, &forwarders); if (result == ISC_R_SUCCESS) fctx->fwdpolicy = forwarders->fwdpolicy; @@ -3502,7 +3530,7 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, * nameservers, and we're not in forward-only mode, * so find the best nameservers to use. */ - if (dns_rdatatype_atparent(type)) + if (dns_rdatatype_atparent(fctx->type)) findoptions |= DNS_DBFIND_NOEXACT; result = dns_view_findzonecut(res->view, name, domain, 0, findoptions, ISC_TRUE, diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c index 03fca9e..ab9ff19 100644 --- a/lib/dns/sdb.c +++ b/lib/dns/sdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.c,v 1.66.48.2 2009/04/21 23:47:18 tbox Exp $ */ +/* $Id: sdb.c,v 1.66.48.3 2009/06/26 06:25:44 marka Exp $ */ /*! \file */ @@ -1458,9 +1458,11 @@ dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) { sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator; sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist); - while (sdbiter->current != NULL) + while (sdbiter->current != NULL) { if (dns_name_equal(sdbiter->current->name, name)) return (ISC_R_SUCCESS); + sdbiter->current = ISC_LIST_NEXT(sdbiter->current, link); + } return (ISC_R_NOTFOUND); } diff --git a/lib/dns/sdlz.c b/lib/dns/sdlz.c index 89cd0ee..5e5f7e3 100644 --- a/lib/dns/sdlz.c +++ b/lib/dns/sdlz.c @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdlz.c,v 1.18.50.2 2009/04/21 23:47:18 tbox Exp $ */ +/* $Id: sdlz.c,v 1.18.50.3 2009/06/26 06:25:44 marka Exp $ */ /*! \file */ @@ -1117,9 +1117,11 @@ dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) { sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator; sdlziter->current = ISC_LIST_HEAD(sdlziter->nodelist); - while (sdlziter->current != NULL) + while (sdlziter->current != NULL) { if (dns_name_equal(sdlziter->current->name, name)) return (ISC_R_SUCCESS); + sdlziter->current = ISC_LIST_NEXT(sdlziter->current, link); + } return (ISC_R_NOTFOUND); } diff --git a/lib/dns/spnego.c b/lib/dns/spnego.c index 0ae6ea2..6c94e51 100644 --- a/lib/dns/spnego.c +++ b/lib/dns/spnego.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: spnego.c,v 1.8.118.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: spnego.c,v 1.8.118.4 2009/07/21 07:27:13 marka Exp $ */ /*! \file * \brief @@ -265,8 +265,7 @@ decode_oid(const unsigned char *p, size_t len, oid * k, size_t * size); static int -decode_enumerated(const unsigned char *p, size_t len, - unsigned *num, size_t *size); +decode_enumerated(const unsigned char *p, size_t len, void *num, size_t *size); static int decode_octet_string(const unsigned char *, size_t, octet_string *, size_t *); @@ -291,8 +290,7 @@ der_put_length_and_tag(unsigned char *, size_t, size_t, Der_class, Der_type, int, size_t *); static int -encode_enumerated(unsigned char *p, size_t len, - const unsigned *data, size_t *); +encode_enumerated(unsigned char *p, size_t len, const void *data, size_t *); static int encode_octet_string(unsigned char *p, size_t len, @@ -622,7 +620,7 @@ gss_accept_sec_context_spnego(OM_uint32 *minor_status, } for (i = 0; !found && i < init_token.mechTypes.len; ++i) { - char mechbuf[17]; + unsigned char mechbuf[17]; size_t mech_len; ret = der_put_oid(mechbuf + sizeof(mechbuf) - 1, @@ -956,8 +954,7 @@ der_match_tag_and_length(const unsigned char *p, size_t len, } static int -decode_enumerated(const unsigned char *p, size_t len, - unsigned *num, size_t *size) +decode_enumerated(const unsigned char *p, size_t len, void *num, size_t *size) { size_t ret = 0; size_t l, reallen; @@ -1269,10 +1266,9 @@ der_put_length_and_tag(unsigned char *p, size_t len, size_t len_val, } static int -encode_enumerated(unsigned char *p, size_t len, const unsigned *data, - size_t *size) +encode_enumerated(unsigned char *p, size_t len, const void *data, size_t *size) { - unsigned num = *data; + unsigned num = *(const unsigned *)data; size_t ret = 0; size_t l; int e; diff --git a/lib/dns/validator.c b/lib/dns/validator.c index ce49daf..1e55a34 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.9.8.2 2009/12/31 20:29:21 each Exp $ */ +/* $Id: validator.c,v 1.164.12.11 2009/12/30 06:44:44 each Exp $ */ #include diff --git a/lib/dns/view.c b/lib/dns/view.c index 5f1447a..961268e 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.150.84.2 2009/01/29 23:47:44 tbox Exp $ */ +/* $Id: view.c,v 1.150.84.3 2009/11/12 23:39:23 marka Exp $ */ /*! \file */ @@ -1250,7 +1250,8 @@ dns_view_getpeertsig(dns_view_t *view, isc_netaddr_t *peeraddr, if (result != ISC_R_SUCCESS) return (result); - return (dns_view_gettsig(view, keyname, keyp)); + result = dns_view_gettsig(view, keyname, keyp); + return ((result == ISC_R_NOTFOUND) ? ISC_R_FAILURE : result); } isc_result_t diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 423b005..c21b1f0 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.c,v 1.483.36.6 2009/03/26 22:57:07 marka Exp $ */ +/* $Id: zone.c,v 1.483.36.17 2009/12/21 04:32:42 marka Exp $ */ /*! \file */ @@ -200,7 +200,6 @@ struct dns_zone { isc_time_t keywarntime; isc_time_t signingtime; isc_time_t nsec3chaintime; - isc_uint32_t serial; isc_uint32_t refresh; isc_uint32_t retry; isc_uint32_t expire; @@ -351,11 +350,15 @@ struct dns_zone { #define DNS_ZONEFLG_USEALTXFRSRC 0x00800000U #define DNS_ZONEFLG_SOABEFOREAXFR 0x01000000U #define DNS_ZONEFLG_NEEDCOMPACT 0x02000000U +#define DNS_ZONEFLG_REFRESHING 0x04000000U /*%< Refreshing keydata */ +#define DNS_ZONEFLG_THAW 0x08000000U #define DNS_ZONE_OPTION(z,o) (((z)->options & (o)) != 0) /* Flags for zone_load() */ #define DNS_ZONELOADFLAG_NOSTAT 0x00000001U /* Do not stat() master files */ +#define DNS_ZONELOADFLAG_THAW 0x00000002U /* Thaw the zone on successful + load. */ #define UNREACH_CHACHE_SIZE 10U #define UNREACH_HOLD_TIME 600 /* 10 minutes */ @@ -718,7 +721,6 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) { isc_time_settoepoch(&zone->keywarntime); isc_time_settoepoch(&zone->signingtime); isc_time_settoepoch(&zone->nsec3chaintime); - zone->serial = 0; zone->refresh = DNS_ZONE_DEFAULTREFRESH; zone->retry = DNS_ZONE_DEFAULTRETRY; zone->expire = 0; @@ -967,16 +969,35 @@ dns_zone_setnotifytype(dns_zone_t *zone, dns_notifytype_t notifytype) { UNLOCK_ZONE(zone); } -isc_uint32_t -dns_zone_getserial(dns_zone_t *zone) { - isc_uint32_t serial; +isc_result_t +dns_zone_getserial2(dns_zone_t *zone, isc_uint32_t *serialp) { + isc_result_t result; REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(serialp != NULL); LOCK_ZONE(zone); - serial = zone->serial; + ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read); + if (zone->db != NULL) { + result = zone_get_from_db(zone, zone->db, NULL, NULL, serialp, + NULL, NULL, NULL, NULL, NULL); + } else + result = DNS_R_NOTLOADED; + ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read); UNLOCK_ZONE(zone); + return (result); +} + +isc_uint32_t +dns_zone_getserial(dns_zone_t *zone) { + isc_result_t result; + isc_uint32_t serial; + + result = dns_zone_getserial2(zone, &serial); + if (result != ISC_R_SUCCESS) + serial = 0; /* XXX: not really correct, but no other choice */ + return (serial); } @@ -1314,7 +1335,9 @@ zone_load(dns_zone_t *zone, unsigned int flags) { INSIST(zone->type != dns_zone_none); if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADING)) { - result = ISC_R_SUCCESS; + if ((flags & DNS_ZONELOADFLAG_THAW) != 0) + DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_THAW); + result = DNS_R_CONTINUE; goto cleanup; } @@ -1448,6 +1471,8 @@ zone_load(dns_zone_t *zone, unsigned int flags) { if (result == DNS_R_CONTINUE) { DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADING); + if ((flags & DNS_ZONELOADFLAG_THAW) != 0) + DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_THAW); goto cleanup; } @@ -1470,6 +1495,30 @@ dns_zone_loadnew(dns_zone_t *zone) { return (zone_load(zone, DNS_ZONELOADFLAG_NOSTAT)); } +isc_result_t +dns_zone_loadandthaw(dns_zone_t *zone) { + isc_result_t result; + + result = zone_load(zone, DNS_ZONELOADFLAG_THAW); + switch (result) { + case DNS_R_CONTINUE: + /* Deferred thaw. */ + break; + case ISC_R_SUCCESS: + case DNS_R_UPTODATE: + case DNS_R_SEENINCLUDE: + zone->update_disabled = ISC_FALSE; + break; + case DNS_R_NOMASTERFILE: + zone->update_disabled = ISC_FALSE; + break; + default: + /* Error, remain in disabled state. */ + break; + } + return (result); +} + static unsigned int get_master_options(dns_zone_t *zone) { unsigned int options; @@ -2148,7 +2197,8 @@ resume_signingwithkey(dns_zone_t *zone) { } result = zone_signwithkey(zone, rdata.data[0], - (rdata.data[1] << 8) | rdata.data[2], ISC_TF(rdata.data[3])); + (rdata.data[1] << 8) | rdata.data[2], + ISC_TF(rdata.data[3])); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "zone_signwithkey failed: %s", @@ -2291,7 +2341,6 @@ static void set_resigntime(dns_zone_t *zone) { dns_rdataset_t rdataset; dns_fixedname_t fixed; - char namebuf[DNS_NAME_FORMATSIZE]; unsigned int resign; isc_result_t result; isc_uint32_t nanosecs; @@ -2305,7 +2354,6 @@ set_resigntime(dns_zone_t *zone) { return; } resign = rdataset.resign; - dns_name_format(dns_fixedname_name(&fixed), namebuf, sizeof(namebuf)); dns_rdataset_disassociate(&rdataset); isc_random_get(&nanosecs); nanosecs %= 1000000000; @@ -2409,7 +2457,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, unsigned int soacount = 0; unsigned int nscount = 0; unsigned int errors = 0; - isc_uint32_t serial, refresh, retry, expire, minimum; + isc_uint32_t serial, oldserial, refresh, retry, expire, minimum; isc_time_t now; isc_boolean_t needdump = ISC_FALSE; isc_boolean_t hasinclude = DNS_ZONE_FLAG(zone, DNS_ZONEFLG_HASINCLUDE); @@ -2463,8 +2511,9 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, options = DNS_JOURNALOPT_RESIGN; else options = 0; - result = dns_journal_rollforward(zone->mctx, db, options, - zone->journal); + result = dns_journal_rollforward2(zone->mctx, db, options, + zone->sigresigninginterval, + zone->journal); if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND && result != DNS_R_UPTODATE && result != DNS_R_NOJOURNAL && result != ISC_R_RANGE) { @@ -2544,14 +2593,18 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, * This is checked in zone_replacedb() for slave zones * as they don't reload from disk. */ + result = zone_get_from_db(zone, zone->db, NULL, NULL, + &oldserial, NULL, NULL, NULL, + NULL, NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IXFRFROMDIFFS) && - !isc_serial_gt(serial, zone->serial)) { + !isc_serial_gt(serial, oldserial)) { isc_uint32_t serialmin, serialmax; INSIST(zone->type == dns_zone_master); - serialmin = (zone->serial + 1) & 0xffffffffU; - serialmax = (zone->serial + 0x7fffffffU) & + serialmin = (oldserial + 1) & 0xffffffffU; + serialmax = (oldserial + 0x7fffffffU) & 0xffffffffU; dns_zone_log(zone, ISC_LOG_ERROR, "ixfr-from-differences: " @@ -2560,10 +2613,10 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, serialmax); result = DNS_R_BADZONE; goto cleanup; - } else if (!isc_serial_ge(serial, zone->serial)) + } else if (!isc_serial_ge(serial, oldserial)) dns_zone_log(zone, ISC_LOG_ERROR, "zone serial has gone backwards"); - else if (serial == zone->serial && !hasinclude) + else if (serial == oldserial && !hasinclude) dns_zone_log(zone, ISC_LOG_ERROR, "zone serial unchanged. " "zone may fail to transfer " @@ -2580,7 +2633,6 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, "3 * refresh."); } - zone->serial = serial; zone->refresh = RANGE(refresh, zone->minrefresh, zone->maxrefresh); zone->retry = RANGE(retry, @@ -2664,8 +2716,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, } if (! dns_db_ispersistent(db)) - dns_zone_log(zone, ISC_LOG_INFO, "loaded serial %u%s", - zone->serial, + dns_zone_log(zone, ISC_LOG_INFO, "loaded serial %u%s", serial, dns_db_issecure(db) ? " (signed)" : ""); return (result); @@ -2683,7 +2734,8 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, if (zone->task != NULL) zone_settimer(zone, &now); result = ISC_R_SUCCESS; - } + } else if (zone->type == dns_zone_master) + dns_zone_log(zone, ISC_LOG_ERROR, "not loaded due to errors."); return (result); } @@ -4374,7 +4426,8 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version, seen_done = ISC_TRUE; else CHECK(update_one_rr(signing->db, version, diff, - DNS_DIFFOP_DEL, name, rdataset.ttl, &rdata)); + DNS_DIFFOP_DEL, name, + rdataset.ttl, &rdata)); dns_rdata_reset(&rdata); } if (result == ISC_R_NOMORE) @@ -5458,6 +5511,7 @@ zone_sign(dns_zone_t *zone) { dst_key_t *zone_keys[MAXZONEKEYS]; isc_int32_t signatures; isc_boolean_t check_ksk, is_ksk; + isc_boolean_t commit = ISC_FALSE; isc_boolean_t delegation; isc_boolean_t finishedakey = ISC_FALSE; isc_boolean_t secureupdated = ISC_FALSE; @@ -5745,6 +5799,7 @@ zone_sign(dns_zone_t *zone) { goto failure; } } + if (finishedakey) { /* * We have changed the RRset above so we need to update @@ -5770,6 +5825,15 @@ zone_sign(dns_zone_t *zone) { goto failure; } } + + /* + * Have we changed anything? + */ + if (ISC_LIST_HEAD(sig_diff.tuples) == NULL) + goto pauseall; + + commit = ISC_TRUE; + result = del_sigs(zone, db, version, &zone->origin, dns_rdatatype_soa, &sig_diff, zone_keys, nkeys, now); if (result != ISC_R_SUCCESS) { @@ -5801,6 +5865,9 @@ zone_sign(dns_zone_t *zone) { goto failure; } + /* + * Write changes to journal file. + */ journalfile = dns_zone_getjournal(zone); if (journalfile != NULL) { dns_journal_t *journal = NULL; @@ -5823,7 +5890,7 @@ zone_sign(dns_zone_t *zone) { } } - + pauseall: /* * Pause all iterators so that dns_db_closeversion() can succeed. */ @@ -5840,7 +5907,7 @@ zone_sign(dns_zone_t *zone) { /* * Everything has succeeded. Commit the changes. */ - dns_db_closeversion(db, &version, ISC_TRUE); + dns_db_closeversion(db, &version, commit); /* * Everything succeeded so we can clean these up now. @@ -5856,9 +5923,11 @@ zone_sign(dns_zone_t *zone) { set_resigntime(zone); - LOCK_ZONE(zone); - zone_needdump(zone, DNS_DUMP_DELAY); - UNLOCK_ZONE(zone); + if (commit) { + LOCK_ZONE(zone); + zone_needdump(zone, DNS_DUMP_DELAY); + UNLOCK_ZONE(zone); + } failure: /* @@ -6498,6 +6567,7 @@ notify_isself(dns_zone_t *zone, isc_sockaddr_t *dst) { isc_sockaddr_t any; isc_boolean_t isself; isc_netaddr_t dstaddr; + isc_result_t result; if (zone->view == NULL || zone->isself == NULL) return (ISC_FALSE); @@ -6523,7 +6593,9 @@ notify_isself(dns_zone_t *zone, isc_sockaddr_t *dst) { src = *dst; isc_netaddr_fromsockaddr(&dstaddr, dst); - (void)dns_view_getpeertsig(zone->view, &dstaddr, &key); + result = dns_view_getpeertsig(zone->view, &dstaddr, &key); + if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND) + return (ISC_FALSE); isself = (zone->isself)(zone->view, key, &src, dst, zone->rdclass, zone->isselfarg); if (key != NULL) @@ -6725,9 +6797,14 @@ notify_send_toaddr(isc_task_t *task, isc_event_t *event) { goto cleanup; isc_netaddr_fromsockaddr(&dstip, ¬ify->dst); - (void)dns_view_getpeertsig(notify->zone->view, &dstip, &key); - isc_sockaddr_format(¬ify->dst, addrbuf, sizeof(addrbuf)); + result = dns_view_getpeertsig(notify->zone->view, &dstip, &key); + if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND) { + notify_log(notify->zone, ISC_LOG_ERROR, "NOTIFY to %s not " + "sent. Peer TSIG key lookup failure.", addrbuf); + goto cleanup_message; + } + notify_log(notify->zone, ISC_LOG_DEBUG(3), "sending notify to %s", addrbuf); if (notify->zone->view->peers != NULL) { @@ -6774,6 +6851,7 @@ notify_send_toaddr(isc_task_t *task, isc_event_t *event) { cleanup_key: if (key != NULL) dns_tsigkey_detach(&key); + cleanup_message: dns_message_destroy(&message); cleanup: UNLOCK_ZONE(notify->zone); @@ -7386,7 +7464,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { dns_rdata_t rdata = DNS_RDATA_INIT; dns_rdata_soa_t soa; isc_result_t result; - isc_uint32_t serial; + isc_uint32_t serial, oldserial; unsigned int j; zone = revent->ev_arg; @@ -7609,12 +7687,17 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { RUNTIME_CHECK(result == ISC_R_SUCCESS); serial = soa.serial; - - zone_debuglog(zone, me, 1, "serial: new %u, old %u", - serial, zone->serial); + if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED)) { + result = dns_zone_getserial2(zone, &oldserial); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + zone_debuglog(zone, me, 1, "serial: new %u, old %u", + serial, oldserial); + } else + zone_debuglog(zone, me, 1, "serial: new %u, old not loaded", + serial); if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) || DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCEXFER) || - isc_serial_gt(serial, zone->serial)) { + isc_serial_gt(serial, oldserial)) { if (dns_zonemgr_unreachable(zone->zmgr, &zone->masteraddr, &zone->sourceaddr, &now)) { dns_zone_log(zone, ISC_LOG_INFO, @@ -7638,7 +7721,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { } if (msg != NULL) dns_message_destroy(&msg); - } else if (isc_serial_eq(soa.serial, zone->serial)) { + } else if (isc_serial_eq(soa.serial, oldserial)) { if (zone->masterfile != NULL) { result = ISC_R_FAILURE; if (zone->journal != NULL) @@ -7671,7 +7754,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_MULTIMASTER)) dns_zone_log(zone, ISC_LOG_INFO, "serial number (%u) " "received from master %s < ours (%u)", - soa.serial, master, zone->serial); + soa.serial, master, oldserial); else zone_debuglog(zone, me, 1, "ahead"); zone->mastersok[zone->curmaster] = ISC_TRUE; @@ -7965,10 +8048,19 @@ soa_query(isc_task_t *task, isc_event_t *event) { dns_name_format(keyname, namebuf, sizeof(namebuf)); dns_zone_log(zone, ISC_LOG_ERROR, "unable to find key: %s", namebuf); + goto skip_master; + } + } + if (key == NULL) { + result = dns_view_getpeertsig(zone->view, &masterip, &key); + if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND) { + char addrbuf[ISC_NETADDR_FORMATSIZE]; + isc_netaddr_format(&masterip, addrbuf, sizeof(addrbuf)); + dns_zone_log(zone, ISC_LOG_ERROR, + "unable to find TSIG key for %s", addrbuf); + goto skip_master; } } - if (key == NULL) - (void)dns_view_getpeertsig(zone->view, &masterip, &key); have_xfrsource = ISC_FALSE; reqnsid = zone->view->requestnsid; @@ -8789,13 +8881,21 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from, if (result == ISC_R_SUCCESS) result = dns_rdataset_first(rdataset); if (result == ISC_R_SUCCESS) { - isc_uint32_t serial = 0; + isc_uint32_t serial = 0, oldserial; dns_rdataset_current(rdataset, &rdata); result = dns_rdata_tostruct(&rdata, &soa, NULL); RUNTIME_CHECK(result == ISC_R_SUCCESS); serial = soa.serial; - if (isc_serial_le(serial, zone->serial)) { + /* + * The following should safely be performed without DB + * lock and succeed in this context. + */ + result = zone_get_from_db(zone, zone->db, NULL, NULL, + &oldserial, NULL, NULL, NULL, + NULL, NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + if (isc_serial_le(serial, oldserial)) { dns_zone_log(zone, ISC_LOG_INFO, "notify from %s: " "zone is up to date", @@ -9473,7 +9573,7 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) { if (zone->db != NULL && zone->journal != NULL && DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IXFRFROMDIFFS) && !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCEXFER)) { - isc_uint32_t serial; + isc_uint32_t serial, oldserial; dns_zone_log(zone, ISC_LOG_DEBUG(3), "generating diffs"); @@ -9488,11 +9588,15 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) { /* * This is checked in zone_postload() for master zones. */ + result = zone_get_from_db(zone, zone->db, NULL, NULL, + &oldserial, NULL, NULL, NULL, NULL, + NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); if (zone->type == dns_zone_slave && - !isc_serial_gt(serial, zone->serial)) { + !isc_serial_gt(serial, oldserial)) { isc_uint32_t serialmin, serialmax; - serialmin = (zone->serial + 1) & 0xffffffffU; - serialmax = (zone->serial + 0x7fffffffU) & 0xffffffffU; + serialmin = (oldserial + 1) & 0xffffffffU; + serialmax = (oldserial + 0x7fffffffU) & 0xffffffffU; dns_zone_log(zone, ISC_LOG_ERROR, "ixfr-from-differences: failed: " "new serial (%u) out of range [%u - %u]", @@ -9685,7 +9789,6 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) { zone_unload(zone); goto next_master; } - zone->serial = serial; zone->refresh = RANGE(refresh, zone->minrefresh, zone->maxrefresh); zone->retry = RANGE(retry, zone->minretry, @@ -9723,7 +9826,7 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) { buf[0] = '\0'; dns_zone_log(zone, ISC_LOG_INFO, "transferred serial %u%s", - zone->serial, buf); + serial, buf); } /* @@ -9873,6 +9976,13 @@ zone_loaddone(void *arg, isc_result_t result) { (void)zone_postload(load->zone, load->db, load->loadtime, result); zonemgr_putio(&load->zone->readio); DNS_ZONE_CLRFLAG(load->zone, DNS_ZONEFLG_LOADING); + /* + * Leave the zone frozen if the reload fails. + */ + if ((result == ISC_R_SUCCESS || result == DNS_R_SEENINCLUDE) && + DNS_ZONE_FLAG(load->zone, DNS_ZONEFLG_THAW)) + zone->update_disabled = ISC_FALSE; + DNS_ZONE_CLRFLAG(load->zone, DNS_ZONEFLG_THAW); UNLOCK_ZONE(load->zone); load->magic = 0; @@ -11508,7 +11618,8 @@ zone_signwithkey(dns_zone_t *zone, dns_secalg_t algorithm, isc_uint16_t keyid, cleanup: if (signing != NULL) { - dns_db_detach(&signing->db); + if (signing->db != NULL) + dns_db_detach(&signing->db); if (signing->dbiterator != NULL) dns_dbiterator_destroy(&signing->dbiterator); isc_mem_put(zone->mctx, signing, sizeof *signing); diff --git a/lib/isc/api b/lib/isc/api index 5ef8dc0..e55996b 100644 --- a/lib/isc/api +++ b/lib/isc/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 51 +LIBINTERFACE = 52 LIBREVISION = 1 -LIBAGE = 1 +LIBAGE = 2 diff --git a/lib/isc/base32.c b/lib/isc/base32.c index 3000a84..d324da9 100644 --- a/lib/isc/base32.c +++ b/lib/isc/base32.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: base32.c,v 1.3.116.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: base32.c,v 1.3.116.3 2009/10/21 01:22:47 each Exp $ */ /*! \file */ @@ -112,6 +112,8 @@ base32_totext(isc_region_t *source, int wordlength, const char *wordbreak, RETERR(str_totext(wordbreak, target)); } } + if (source->length > 0) + isc_region_consume(source, source->length); return (ISC_R_SUCCESS); } diff --git a/lib/isc/base64.c b/lib/isc/base64.c index 13ed6b5..4844a4b 100644 --- a/lib/isc/base64.c +++ b/lib/isc/base64.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: base64.c,v 1.32 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: base64.c,v 1.32.332.2 2009/10/21 23:47:20 tbox Exp $ */ /*! \file */ @@ -85,11 +85,13 @@ isc_base64_totext(isc_region_t *source, int wordlength, buf[2] = base64[((source->base[1]<<2)&0x3c)]; buf[3] = '='; RETERR(str_totext(buf, target)); + isc_region_consume(source, 2); } else if (source->length == 1) { buf[0] = base64[(source->base[0]>>2)&0x3f]; buf[1] = base64[((source->base[0]<<4)&0x30)]; buf[2] = buf[3] = '='; RETERR(str_totext(buf, target)); + isc_region_consume(source, 1); } return (ISC_R_SUCCESS); } @@ -217,7 +219,7 @@ isc_base64_decodestring(const char *cstr, isc_buffer_t *target) { continue; RETERR(base64_decode_char(&ctx, c)); } - RETERR(base64_decode_finish(&ctx)); + RETERR(base64_decode_finish(&ctx)); return (ISC_R_SUCCESS); } diff --git a/lib/isc/heap.c b/lib/isc/heap.c index 91d78c0..dc32100 100644 --- a/lib/isc/heap.c +++ b/lib/isc/heap.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1997-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: heap.c,v 1.37 2007/10/19 17:15:53 explorer Exp $ */ +/* $Id: heap.c,v 1.37.240.3 2010/02/04 23:47:46 tbox Exp $ */ /*! \file * Heap implementation of priority queues adapted from the following: @@ -186,15 +186,17 @@ sink_down(isc_heap_t *heap, unsigned int i, void *elt) { isc_result_t isc_heap_insert(isc_heap_t *heap, void *elt) { - unsigned int i; + unsigned int new_last; REQUIRE(VALID_HEAP(heap)); - i = ++heap->last; - if (heap->last >= heap->size && !resize(heap)) + new_last = heap->last + 1; + RUNTIME_CHECK(new_last > 0); /* overflow check */ + if (new_last >= heap->size && !resize(heap)) return (ISC_R_NOMEMORY); + heap->last = new_last; - float_up(heap, i, elt); + float_up(heap, new_last, elt); return (ISC_R_SUCCESS); } diff --git a/lib/isc/httpd.c b/lib/isc/httpd.c index fa31325..066939d 100644 --- a/lib/isc/httpd.c +++ b/lib/isc/httpd.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2006-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: httpd.c,v 1.16 2008/08/08 05:06:49 marka Exp $ */ +/* $Id: httpd.c,v 1.16.64.2 2010/02/04 23:47:46 tbox Exp $ */ /*! \file */ @@ -151,6 +151,7 @@ struct isc_httpdmgr { ISC_LIST(isc_httpdurl_t) urls; /*%< urls we manage */ isc_httpdaction_t *render_404; + isc_httpdaction_t *render_500; }; /*% @@ -221,6 +222,11 @@ static isc_result_t render_404(const char *, const char *, unsigned int *, const char **, const char **, isc_buffer_t *, isc_httpdfree_t **, void **); +static isc_result_t render_500(const char *, const char *, + void *, + unsigned int *, const char **, + const char **, isc_buffer_t *, + isc_httpdfree_t **, void **); static void destroy_client(isc_httpd_t **httpdp) @@ -300,6 +306,7 @@ isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task, goto cleanup; httpd->render_404 = render_404; + httpd->render_500 = render_500; *httpdp = httpd; return (ISC_R_SUCCESS); @@ -623,6 +630,30 @@ render_404(const char *url, const char *querystring, return (ISC_R_SUCCESS); } +static isc_result_t +render_500(const char *url, const char *querystring, + void *arg, + unsigned int *retcode, const char **retmsg, + const char **mimetype, isc_buffer_t *b, + isc_httpdfree_t **freecb, void **freecb_args) +{ + static char msg[] = "Internal server failure."; + + UNUSED(url); + UNUSED(querystring); + UNUSED(arg); + + *retcode = 500; + *retmsg = "Internal server failure"; + *mimetype = "text/plain"; + isc_buffer_reinit(b, msg, strlen(msg)); + isc_buffer_add(b, strlen(msg)); + *freecb = NULL; + *freecb_args = NULL; + + return (ISC_R_SUCCESS); +} + static void isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) { @@ -691,8 +722,14 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) &httpd->mimetype, &httpd->bodybuffer, &httpd->freecb, &httpd->freecb_arg); if (result != ISC_R_SUCCESS) { - destroy_client(&httpd); - goto out; + result = httpd->mgr->render_500(httpd->url, httpd->querystring, + NULL, + &httpd->retcode, + &httpd->retmsg, + &httpd->mimetype, + &httpd->bodybuffer, + &httpd->freecb, + &httpd->freecb_arg); } isc_httpd_response(httpd); diff --git a/lib/isc/ia64/include/isc/atomic.h b/lib/isc/ia64/include/isc/atomic.h index 4c46797..d825819 100644 --- a/lib/isc/ia64/include/isc/atomic.h +++ b/lib/isc/ia64/include/isc/atomic.h @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: atomic.h,v 1.4.326.2 2009/02/06 23:47:11 tbox Exp $ */ +/* $Id: atomic.h,v 1.4.326.3 2009/06/24 02:21:28 marka Exp $ */ #ifndef ISC_ATOMIC_H #define ISC_ATOMIC_H 1 @@ -31,10 +31,10 @@ * (e.g., 1 and -1)? */ static inline isc_int32_t -isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) #ifdef __GNUC__ __attribute__ ((unused)) #endif +isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) { isc_int32_t prev, swapped; @@ -57,10 +57,10 @@ __attribute__ ((unused)) * This routine atomically stores the value 'val' in 'p'. */ static inline void -isc_atomic_store(isc_int32_t *p, isc_int32_t val) #ifdef __GNUC__ __attribute__ ((unused)) #endif +isc_atomic_store(isc_int32_t *p, isc_int32_t val) { __asm__ volatile( "st4.rel %0=%1" @@ -76,10 +76,10 @@ __attribute__ ((unused)) * case. */ static inline isc_int32_t -isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) #ifdef __GNUC__ __attribute__ ((unused)) #endif +isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) { isc_int32_t ret; diff --git a/lib/isc/include/isc/entropy.h b/lib/isc/include/isc/entropy.h index e9e59c4..125669c 100644 --- a/lib/isc/include/isc/entropy.h +++ b/lib/isc/include/isc/entropy.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: entropy.h,v 1.32.332.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: entropy.h,v 1.32.332.3 2009/10/19 02:46:07 marka Exp $ */ #ifndef ISC_ENTROPY_H #define ISC_ENTROPY_H 1 @@ -182,8 +182,8 @@ isc_result_t isc_entropy_createsamplesource(isc_entropy_t *ent, isc_entropysource_t **sourcep); /*!< - * \brief Create an entropy source that consists of samples. Each sample is added - * to the source via isc_entropy_addsamples(), below. + * \brief Create an entropy source that consists of samples. Each sample is + * added to the source via isc_entropy_addsamples(), below. */ isc_result_t @@ -254,11 +254,11 @@ void isc_entropy_putdata(isc_entropy_t *ent, void *data, unsigned int length, isc_uint32_t entropy); /*!< - * \brief Add "length" bytes in "data" to the entropy pool, incrementing the pool's - * entropy count by "entropy." + * \brief Add "length" bytes in "data" to the entropy pool, incrementing the + * pool's entropy count by "entropy." * - * These bytes will prime the pseudorandom portion even no entropy is actually - * added. + * These bytes will prime the pseudorandom portion even if no entropy is + * actually added. */ void diff --git a/lib/isc/include/isc/netscope.h b/lib/isc/include/isc/netscope.h index ba4e792..0883140 100644 --- a/lib/isc/include/isc/netscope.h +++ b/lib/isc/include/isc/netscope.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: netscope.h,v 1.11 2007/06/19 23:47:18 tbox Exp $ */ +/* $Id: netscope.h,v 1.11.332.2 2009/06/25 23:47:24 tbox Exp $ */ #ifndef ISC_NETSCOPE_H #define ISC_NETSCOPE_H 1 @@ -40,4 +40,4 @@ isc_netscope_pton(int af, char *scopename, void *addr, isc_uint32_t *zoneid); ISC_LANG_ENDDECLS -#endif /* ISC_NETADDR_H */ +#endif /* ISC_NETSCOPE_H */ diff --git a/lib/isc/include/isc/portset.h b/lib/isc/include/isc/portset.h index dc1f856..a7ad3d6 100644 --- a/lib/isc/include/isc/portset.h +++ b/lib/isc/include/isc/portset.h @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: portset.h,v 1.3.90.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: portset.h,v 1.3.90.3 2009/06/25 05:31:51 marka Exp $ */ /*! \file isc/portset.h * \brief Transport Protocol Port Manipulation Module @@ -138,4 +138,4 @@ isc_portset_removerange(isc_portset_t *portset, in_port_t port_lo, ISC_LANG_ENDDECLS -#endif /* ISC_NETADDR_H */ +#endif /* ISC_PORTSET_H */ diff --git a/lib/isc/include/isc/sha2.h b/lib/isc/include/isc/sha2.h index 211e255..edafa61 100644 --- a/lib/isc/include/isc/sha2.h +++ b/lib/isc/include/isc/sha2.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2005-2007, 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sha2.h,v 1.9 2007/06/19 23:47:18 tbox Exp $ */ +/* $Id: sha2.h,v 1.9.332.2 2010/01/15 23:47:34 tbox Exp $ */ /* $FreeBSD$ */ /* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */ @@ -39,7 +39,7 @@ * 3. Neither the name of the copyright holder nor the names of contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -104,24 +104,28 @@ typedef isc_sha512_t isc_sha384_t; /*** SHA-224/256/384/512 Function Prototypes ******************************/ void isc_sha224_init (isc_sha224_t *); +void isc_sha224_invalidate (isc_sha224_t *); void isc_sha224_update (isc_sha224_t *, const isc_uint8_t *, size_t); void isc_sha224_final (isc_uint8_t[ISC_SHA224_DIGESTLENGTH], isc_sha224_t *); char *isc_sha224_end (isc_sha224_t *, char[ISC_SHA224_DIGESTSTRINGLENGTH]); char *isc_sha224_data (const isc_uint8_t *, size_t, char[ISC_SHA224_DIGESTSTRINGLENGTH]); void isc_sha256_init (isc_sha256_t *); +void isc_sha256_invalidate (isc_sha256_t *); void isc_sha256_update (isc_sha256_t *, const isc_uint8_t *, size_t); void isc_sha256_final (isc_uint8_t[ISC_SHA256_DIGESTLENGTH], isc_sha256_t *); char *isc_sha256_end (isc_sha256_t *, char[ISC_SHA256_DIGESTSTRINGLENGTH]); char *isc_sha256_data (const isc_uint8_t *, size_t, char[ISC_SHA256_DIGESTSTRINGLENGTH]); void isc_sha384_init (isc_sha384_t *); +void isc_sha384_invalidate (isc_sha384_t *); void isc_sha384_update (isc_sha384_t *, const isc_uint8_t *, size_t); void isc_sha384_final (isc_uint8_t[ISC_SHA384_DIGESTLENGTH], isc_sha384_t *); char *isc_sha384_end (isc_sha384_t *, char[ISC_SHA384_DIGESTSTRINGLENGTH]); char *isc_sha384_data (const isc_uint8_t *, size_t, char[ISC_SHA384_DIGESTSTRINGLENGTH]); void isc_sha512_init (isc_sha512_t *); +void isc_sha512_invalidate (isc_sha512_t *); void isc_sha512_update (isc_sha512_t *, const isc_uint8_t *, size_t); void isc_sha512_final (isc_uint8_t[ISC_SHA512_DIGESTLENGTH], isc_sha512_t *); char *isc_sha512_end (isc_sha512_t *, char[ISC_SHA512_DIGESTSTRINGLENGTH]); diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index 8a3b95d..85846b6 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: util.h,v 1.30 2007/06/19 23:47:18 tbox Exp $ */ +/* $Id: util.h,v 1.30.332.2 2010/01/11 23:47:22 tbox Exp $ */ #ifndef ISC_UTIL_H #define ISC_UTIL_H 1 @@ -230,4 +230,14 @@ */ #define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS) +/*% + * Prevent Linux spurious warnings + */ +#if defined(__GNUC__) && (__GNUC__ > 3) +#define isc_util_fwrite(a, b, c, d) \ + __builtin_expect(fwrite((a), (b), (c), (d)), (c)) +#else +#define isc_util_fwrite(a, b, c, d) fwrite((a), (b), (c), (d)) +#endif + #endif /* ISC_UTIL_H */ diff --git a/lib/isc/inet_ntop.c b/lib/isc/inet_ntop.c index dc053ed..c37be5c 100644 --- a/lib/isc/inet_ntop.c +++ b/lib/isc/inet_ntop.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1996-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -19,7 +19,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static char rcsid[] = - "$Id: inet_ntop.c,v 1.19 2007/06/19 23:47:17 tbox Exp $"; + "$Id: inet_ntop.c,v 1.19.332.2 2009/07/18 23:47:25 tbox Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -52,7 +52,7 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, * convert a network format address to presentation format. * \return * pointer to presentation format address (`dst'), or NULL (see errno). - * \author + * \author * Paul Vixie, 1996. */ const char * @@ -169,8 +169,9 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) if (i != 0) *tp++ = ':'; /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && - (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { + if (i == 6 && best.base == 0 && (best.len == 6 || + (best.len == 7 && words[7] != 0x0001) || + (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp))) return (NULL); diff --git a/lib/isc/powerpc/include/isc/atomic.h b/lib/isc/powerpc/include/isc/atomic.h index 765cb6d..2114767 100644 --- a/lib/isc/powerpc/include/isc/atomic.h +++ b/lib/isc/powerpc/include/isc/atomic.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: atomic.h,v 1.6 2007/06/18 23:47:47 tbox Exp $ */ +/* $Id: atomic.h,v 1.6.332.2 2009/10/14 23:47:14 tbox Exp $ */ #ifndef ISC_ATOMIC_H #define ISC_ATOMIC_H 1 @@ -46,25 +46,56 @@ #include -#define isc_atomic_xadd(p, v) fetch_and_add(p, v) #define isc_atomic_store(p, v) _clear_lock(p, v) #ifdef __GNUC__ +static inline isc_int32_t +#else +static isc_int32_t +#endif +isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) { + int ret; + +#ifdef __GNUC__ + asm("ics"); +#else + __isync(); +#endif + + ret = fetch_and_add((atomic_p)p, (int)val); + +#ifdef __GNUC__ + asm("ics"); +#else + __isync(); +#endif + + return (ret); +} + +#ifdef __GNUC__ static inline int #else static int #endif isc_atomic_cmpxchg(atomic_p p, int old, int new) { - int orig = old; + int orig = old; #ifdef __GNUC__ - asm("ics"); + asm("ics"); #else - __isync(); + __isync(); #endif - if (compare_and_swap(p, &orig, new)) - return (old); - return (orig); + if (compare_and_swap(p, &orig, new)) + orig = old; + +#ifdef __GNUC__ + asm("ics"); +#else + __isync(); +#endif + + return (orig); } #elif defined(ISC_PLATFORM_USEGCCASM) || defined(ISC_PLATFORM_USEMACASM) @@ -76,14 +107,14 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) { #ifdef ISC_PLATFORM_USEMACASM "1:" "lwarx r6, 0, %1\n" - "mr %0, r6\n" + "mr %0, r6\n" "add r6, r6, %2\n" "stwcx. r6, 0, %1\n" "bne- 1b" #else "1:" "lwarx 6, 0, %1\n" - "mr %0, 6\n" + "mr %0, 6\n" "add 6, 6, %2\n" "stwcx. 6, 0, %1\n" "bne- 1b" diff --git a/lib/isc/random.c b/lib/isc/random.c index 0329abd..84ba6a0 100644 --- a/lib/isc/random.c +++ b/lib/isc/random.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: random.c,v 1.25 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: random.c,v 1.25.332.2 2009/07/16 23:47:17 tbox Exp $ */ /*! \file */ @@ -43,7 +43,7 @@ initialize_rand(void) { #ifndef HAVE_ARC4RANDOM unsigned int pid = getpid(); - + /* * The low bits of pid generally change faster. * Xor them with the high bits of time which change slowly. @@ -84,7 +84,16 @@ isc_random_get(isc_uint32_t *val) * rand()'s lower bits are not random. * rand()'s upper bit is zero. */ +#if RAND_MAX >= 0xfffff + /* We have at least 20 bits. Use lower 16 excluding lower most 4 */ *val = ((rand() >> 4) & 0xffff) | ((rand() << 12) & 0xffff0000); +#elif RAND_MAX >= 0x7fff + /* We have at least 15 bits. Use lower 10/11 excluding lower most 4 */ + *val = ((rand() >> 4) & 0x000007ff) | ((rand() << 7) & 0x003ff800) | + ((rand() << 18) & 0xffc00000); +#else +#error RAND_MAX is too small +#endif #else *val = arc4random(); #endif @@ -92,13 +101,13 @@ isc_random_get(isc_uint32_t *val) isc_uint32_t isc_random_jitter(isc_uint32_t max, isc_uint32_t jitter) { + isc_uint32_t rnd; + REQUIRE(jitter < max); + if (jitter == 0) return (max); - else -#ifndef HAVE_ARC4RANDOM - return (max - rand() % jitter); -#else - return (max - arc4random() % jitter); -#endif + + isc_random_get(&rnd); + return (max - rnd % jitter); } diff --git a/lib/isc/sha2.c b/lib/isc/sha2.c index 70eea4f..ff19274 100644 --- a/lib/isc/sha2.c +++ b/lib/isc/sha2.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2005-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sha2.c,v 1.13.332.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: sha2.c,v 1.13.332.4 2010/01/15 23:47:34 tbox Exp $ */ /* $FreeBSD$ */ /* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */ @@ -415,6 +415,11 @@ isc_sha224_init(isc_sha224_t *context) { } void +isc_sha224_invalidate(isc_sha224_t *context) { + memset(context, 0, sizeof(isc_sha224_t)); +} + +void isc_sha224_update(isc_sha224_t *context, const isc_uint8_t* data, size_t len) { isc_sha256_update((isc_sha256_t *)context, data, len); } @@ -651,6 +656,11 @@ isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) { #endif /* ISC_SHA2_UNROLL_TRANSFORM */ void +isc_sha256_invalidate(isc_sha256_t *context) { + memset(context, 0, sizeof(isc_sha256_t)); +} + +void isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) { unsigned int freespace, usedspace; @@ -990,7 +1000,13 @@ isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) { #endif /* ISC_SHA2_UNROLL_TRANSFORM */ -void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) { +void +isc_sha512_invalidate(isc_sha512_t *context) { + memset(context, 0, sizeof(isc_sha512_t)); +} + +void +isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) { unsigned int freespace, usedspace; if (len == 0U) { @@ -1164,6 +1180,11 @@ isc_sha384_init(isc_sha384_t *context) { } void +isc_sha384_invalidate(isc_sha384_t *context) { + memset(context, 0, sizeof(isc_sha384_t)); +} + +void isc_sha384_update(isc_sha384_t *context, const isc_uint8_t* data, size_t len) { isc_sha512_update((isc_sha512_t *)context, data, len); } diff --git a/lib/isc/unix/ifiter_getifaddrs.c b/lib/isc/unix/ifiter_getifaddrs.c index b576d46..87ef9ba 100644 --- a/lib/isc/unix/ifiter_getifaddrs.c +++ b/lib/isc/unix/ifiter_getifaddrs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ifiter_getifaddrs.c,v 1.11 2008/03/20 23:47:00 tbox Exp $ */ +/* $Id: ifiter_getifaddrs.c,v 1.11.120.2 2009/09/24 23:47:34 tbox Exp $ */ /*! \file * \brief @@ -181,7 +181,7 @@ internal_current(isc_interfaceiter_t *iter) { ifa->ifa_name); if (ifa->ifa_dstaddr != NULL && - (iter->current.flags & IFF_POINTOPOINT) != 0) + (iter->current.flags & INTERFACE_F_POINTTOPOINT) != 0) get_addr(family, &iter->current.dstaddress, ifa->ifa_dstaddr, ifa->ifa_name); diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index d09fe51..004a038 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.308.12.8 2009/04/18 01:29:26 jinmei Exp $ */ +/* $Id: socket.c,v 1.308.12.12 2010/01/31 23:47:31 tbox Exp $ */ /*! \file */ @@ -1520,12 +1520,22 @@ doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) { } /* - * On TCP, zero length reads indicate EOF, while on - * UDP, zero length reads are perfectly valid, although - * strange. + * On TCP and UNIX sockets, zero length reads indicate EOF, + * while on UDP sockets, zero length reads are perfectly valid, + * although strange. */ - if ((sock->type == isc_sockettype_tcp) && (cc == 0)) - return (DOIO_EOF); + switch (sock->type) { + case isc_sockettype_tcp: + case isc_sockettype_unix: + if (cc == 0) + return (DOIO_EOF); + break; + case isc_sockettype_udp: + break; + case isc_sockettype_fdwatch: + default: + INSIST(0); + } if (sock->type == isc_sockettype_udp) { dev->address.length = msghdr.msg_namelen; @@ -3645,7 +3655,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) { manager->maxsocks); if (manager->fdpollinfo == NULL) { isc_mem_put(mctx, manager->events, - sizeof(pollinfo_t) * manager->maxsocks); + sizeof(struct pollfd) * manager->nevents); return (ISC_R_NOMEMORY); } memset(manager->fdpollinfo, 0, sizeof(pollinfo_t) * manager->maxsocks); @@ -4851,6 +4861,7 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, isc_socketmgr_t *manager; int cc; char strbuf[ISC_STRERRORSIZE]; + char addrbuf[ISC_SOCKADDR_FORMATSIZE]; REQUIRE(VALID_SOCKET(sock)); REQUIRE(addr != NULL); @@ -4919,7 +4930,9 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, sock->connected = 0; isc__strerror(errno, strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, "%d/%s", errno, strbuf); + isc_sockaddr_format(addr, addrbuf, sizeof(addrbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, "connect(%s) %d/%s", + addrbuf, errno, strbuf); UNLOCK(&sock->lock); inc_stats(sock->manager->stats, diff --git a/lib/isccc/api b/lib/isccc/api index 8459d42..2240cdd 100644 --- a/lib/isccc/api +++ b/lib/isccc/api @@ -1,3 +1,3 @@ LIBINTERFACE = 50 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/isccfg/aclconf.c b/lib/isccfg/aclconf.c index ad3d58e..92839e4 100644 --- a/lib/isccfg/aclconf.c +++ b/lib/isccfg/aclconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: aclconf.c,v 1.22.34.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: aclconf.c,v 1.22.34.4 2009/10/01 23:47:17 tbox Exp $ */ #include @@ -168,26 +168,36 @@ convert_keyname(const cfg_obj_t *keyobj, isc_log_t *lctx, isc_mem_t *mctx, * parent. */ static int -count_acl_elements(const cfg_obj_t *caml, const cfg_obj_t *cctx) +count_acl_elements(const cfg_obj_t *caml, const cfg_obj_t *cctx, + isc_boolean_t *has_negative) { const cfg_listelt_t *elt; const cfg_obj_t *cacl = NULL; isc_result_t result; int n = 0; + if (has_negative != NULL) + *has_negative = ISC_FALSE; + for (elt = cfg_list_first(caml); elt != NULL; elt = cfg_list_next(elt)) { const cfg_obj_t *ce = cfg_listelt_value(elt); /* negated element; just get the value. */ - if (cfg_obj_istuple(ce)) + if (cfg_obj_istuple(ce)) { ce = cfg_tuple_get(ce, "value"); + if (has_negative != NULL) + *has_negative = ISC_TRUE; + } if (cfg_obj_istype(ce, &cfg_type_keyref)) { n++; } else if (cfg_obj_islist(ce)) { - n += count_acl_elements(ce, cctx); + isc_boolean_t negative; + n += count_acl_elements(ce, cctx, &negative); + if (negative) + n++; } else if (cfg_obj_isstring(ce)) { const char *name = cfg_obj_asstring(ce); if (strcasecmp(name, "localhost") == 0 || @@ -197,7 +207,8 @@ count_acl_elements(const cfg_obj_t *caml, const cfg_obj_t *cctx) strcasecmp(name, "none") != 0) { result = get_acl_def(cctx, name, &cacl); if (result == ISC_R_SUCCESS) - n += count_acl_elements(cacl, cctx) + 1; + n += count_acl_elements(cacl, cctx, + NULL) + 1; } } } @@ -246,7 +257,7 @@ cfg_acl_fromconfig(const cfg_obj_t *caml, int nelem; if (nest_level == 0) - nelem = count_acl_elements(caml, cctx); + nelem = count_acl_elements(caml, cctx, NULL); else nelem = cfg_list_length(caml, ISC_FALSE); diff --git a/lib/isccfg/api b/lib/isccfg/api index 8459d42..2240cdd 100644 --- a/lib/isccfg/api +++ b/lib/isccfg/api @@ -1,3 +1,3 @@ LIBINTERFACE = 50 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/isccfg/include/isccfg/namedconf.h b/lib/isccfg/include/isccfg/namedconf.h index 9689a2a..55c5a81 100644 --- a/lib/isccfg/include/isccfg/namedconf.h +++ b/lib/isccfg/include/isccfg/namedconf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: namedconf.h,v 1.9 2007/06/19 23:47:22 tbox Exp $ */ +/* $Id: namedconf.h,v 1.9.332.2 2009/06/25 23:47:28 tbox Exp $ */ #ifndef ISCCFG_NAMEDCONF_H #define ISCCFG_NAMEDCONF_H 1 @@ -42,4 +42,4 @@ LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_rndckey; LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_keyref; /*%< A key reference, used as an ACL element */ -#endif /* ISCCFG_CFG_H */ +#endif /* ISCCFG_NAMEDCONF_H */ diff --git a/lib/lwres/api b/lib/lwres/api index 39934b4..fbbf923 100644 --- a/lib/lwres/api +++ b/lib/lwres/api @@ -1,3 +1,3 @@ LIBINTERFACE = 50 -LIBREVISION = 2 +LIBREVISION = 3 LIBAGE = 0 diff --git a/lib/lwres/context.c b/lib/lwres/context.c index 464a2cf..d042c87 100644 --- a/lib/lwres/context.c +++ b/lib/lwres/context.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: context.c,v 1.50.332.2 2008/12/30 23:46:49 tbox Exp $ */ +/* $Id: context.c,v 1.50.332.5 2009/09/01 23:47:05 tbox Exp $ */ /*! \file context.c lwres_context_create() creates a #lwres_context_t structure for use in @@ -471,6 +471,17 @@ lwres_context_sendrecv(lwres_context_t *ctx, result = lwres_context_send(ctx, sendbase, sendlen); if (result != LWRES_R_SUCCESS) return (result); + + /* + * If this is not checked, select() can overflow, + * causing corruption elsewhere. + */ + if (ctx->sock >= (int)FD_SETSIZE) { + close(ctx->sock); + ctx->sock = -1; + return (LWRES_R_IOERROR); + } + again: FD_ZERO(&readfds); FD_SET(ctx->sock, &readfds); diff --git a/lib/lwres/getipnode.c b/lib/lwres/getipnode.c index a6c50c2..4331638 100644 --- a/lib/lwres/getipnode.c +++ b/lib/lwres/getipnode.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: getipnode.c,v 1.42 2007/06/18 23:47:51 tbox Exp $ */ +/* $Id: getipnode.c,v 1.42.332.5 2009/09/01 23:47:05 tbox Exp $ */ /*! \file */ @@ -23,7 +23,7 @@ * These functions perform thread safe, protocol independent * nodename-to-address and address-to-nodename translation as defined in * RFC2553. This use a struct hostent which is defined in namedb.h: - * + * * \code * struct hostent { * char *h_name; // official name of host @@ -34,90 +34,90 @@ * }; * #define h_addr h_addr_list[0] // address, for backward compatibility * \endcode - * + * * The members of this structure are: - * + * * \li h_name: * The official (canonical) name of the host. - * + * * \li h_aliases: * A NULL-terminated array of alternate names (nicknames) for the * host. - * + * * \li h_addrtype: * The type of address being returned - usually PF_INET or * PF_INET6. - * + * * \li h_length: * The length of the address in bytes. - * + * * \li h_addr_list: * A NULL terminated array of network addresses for the host. Host * addresses are returned in network byte order. - * + * * lwres_getipnodebyname() looks up addresses of protocol family af for * the hostname name. The flags parameter contains ORed flag bits to * specify the types of addresses that are searched for, and the types of * addresses that are returned. The flag bits are: - * + * * \li #AI_V4MAPPED: * This is used with an af of #AF_INET6, and causes IPv4 addresses * to be returned as IPv4-mapped IPv6 addresses. - * + * * \li #AI_ALL: * This is used with an af of #AF_INET6, and causes all known * addresses (IPv6 and IPv4) to be returned. If #AI_V4MAPPED is * also set, the IPv4 addresses are return as mapped IPv6 * addresses. - * + * * \li #AI_ADDRCONFIG: * Only return an IPv6 or IPv4 address if here is an active * network interface of that type. This is not currently * implemented in the BIND 9 lightweight resolver, and the flag is * ignored. - * + * * \li #AI_DEFAULT: * This default sets the #AI_V4MAPPED and #AI_ADDRCONFIG flag bits. - * + * * lwres_getipnodebyaddr() performs a reverse lookup of address src which * is len bytes long. af denotes the protocol family, typically PF_INET * or PF_INET6. - * + * * lwres_freehostent() releases all the memory associated with the struct * hostent pointer. Any memory allocated for the h_name, h_addr_list * and h_aliases is freed, as is the memory for the hostent structure * itself. - * + * * \section getipnode_return Return Values - * + * * If an error occurs, lwres_getipnodebyname() and * lwres_getipnodebyaddr() set *error_num to an appropriate error code * and the function returns a NULL pointer. The error codes and their * meanings are defined in \link netdb.h \endlink: - * + * * \li #HOST_NOT_FOUND: * No such host is known. - * + * * \li #NO_ADDRESS: * The server recognised the request and the name but no address * is available. Another type of request to the name server for * the domain might return an answer. - * + * * \li #TRY_AGAIN: * A temporary and possibly transient error occurred, such as a * failure of a server to respond. The request may succeed if * retried. - * + * * \li #NO_RECOVERY: * An unexpected failure occurred, and retrying the request is * pointless. - * + * * lwres_hstrerror() translates these error codes to suitable error * messages. - * + * * \section getipnode_see See Also - * - * getaddrinfo.c, gethost.c, getnameinfo.c, herror.c, RFC2553 + * + * getaddrinfo.c, gethost.c, getnameinfo.c, herror.c, RFC2553 */ #include @@ -146,21 +146,21 @@ LIBLWRES_EXTERNAL_DATA const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; #ifndef IN6_IS_ADDR_V4COMPAT static const unsigned char in6addr_compat[12] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; #define IN6_IS_ADDR_V4COMPAT(x) (!memcmp((x)->s6_addr, in6addr_compat, 12) && \ - ((x)->s6_addr[12] != 0 || \ - (x)->s6_addr[13] != 0 || \ - (x)->s6_addr[14] != 0 || \ - ((x)->s6_addr[15] != 0 && \ - (x)->s6_addr[15] != 1))) + ((x)->s6_addr[12] != 0 || \ + (x)->s6_addr[13] != 0 || \ + (x)->s6_addr[14] != 0 || \ + ((x)->s6_addr[15] != 0 && \ + (x)->s6_addr[15] != 1))) #endif #ifndef IN6_IS_ADDR_V4MAPPED #define IN6_IS_ADDR_V4MAPPED(x) (!memcmp((x)->s6_addr, in6addr_mapped, 12)) #endif static const unsigned char in6addr_mapped[12] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }; /*** @@ -202,7 +202,7 @@ lwres_getipnodebyname(const char *name, int af, int flags, int *error_num) { struct in6_addr in6; struct hostent he, *he1 = NULL, *he2 = NULL, *he3 = NULL; int v4 = 0, v6 = 0; - int tmp_err; + int tmp_err = 0; lwres_context_t *lwrctx = NULL; lwres_gabnresponse_t *by = NULL; int n; @@ -275,7 +275,6 @@ lwres_getipnodebyname(const char *name, int af, int flags, int *error_num) { (void) lwres_conf_parse(lwrctx, lwres_resolv_conf); tmp_err = NO_RECOVERY; if (have_v6 && af == AF_INET6) { - n = lwres_getaddrsbyname(lwrctx, name, LWRES_ADDRTYPE_V6, &by); if (n == 0) { he1 = hostfromname(by, AF_INET6); @@ -285,7 +284,12 @@ lwres_getipnodebyname(const char *name, int af, int flags, int *error_num) { goto cleanup; } } else { - tmp_err = HOST_NOT_FOUND; + if (n == LWRES_R_NOTFOUND) + tmp_err = HOST_NOT_FOUND; + else { + *error_num = NO_RECOVERY; + goto cleanup; + } } } @@ -437,9 +441,15 @@ lwres_getipnodebyaddr(const void *src, size_t len, int af, int *error_num) { if (n != 0) { lwres_conf_clear(lwrctx); lwres_context_destroy(&lwrctx); - *error_num = HOST_NOT_FOUND; + + if (n == LWRES_R_NOTFOUND) + *error_num = HOST_NOT_FOUND; + else + *error_num = NO_RECOVERY; + return (NULL); } + he1 = hostfromaddr(by, AF_INET6, src); lwres_gnbaresponse_free(lwrctx, &by); if (he1 == NULL) @@ -492,7 +502,7 @@ lwres_freehostent(struct hostent *he) { */ #if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR) && \ - !defined(IRIX_EMUL_IOCTL_SIOCGIFCONF) + !defined(IRIX_EMUL_IOCTL_SIOCGIFCONF) #ifdef __hpux #define lifc_len iflc_len @@ -504,7 +514,7 @@ lwres_freehostent(struct hostent *he) { #define ISC_HAVE_LIFC_FLAGS 1 #define LIFCONF lifconf #endif - + #ifdef __hpux #define lifr_addr iflr_addr #define lifr_name iflr_name @@ -557,7 +567,7 @@ scan_interfaces6(int *have_v4, int *have_v6) { /* * Some OS's just return what will fit rather * than set EINVAL if the buffer is too small - * to fit all the interfaces in. If + * to fit all the interfaces in. If * lifc.lifc_len is too near to the end of the * buffer we will grow it just in case and * retry. @@ -619,13 +629,13 @@ scan_interfaces6(int *have_v4, int *have_v6) { if ((lifreq.lifr_flags & IFF_UP) == 0) break; *have_v4 = 1; - } + } break; case AF_INET6: if (*have_v6 == 0) { memcpy(&in6, &((struct sockaddr_in6 *) - &lifreq.lifr_addr)->sin6_addr, + &lifreq.lifr_addr)->sin6_addr, sizeof(in6)); if (memcmp(&in6, &in6addr_any, sizeof(in6)) == 0) @@ -675,7 +685,7 @@ scan_interfaces(int *have_v4, int *have_v6) { InitSockets(); #endif #if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR) && \ - !defined(IRIX_EMUL_IOCTL_SIOCGIFCONF) + !defined(IRIX_EMUL_IOCTL_SIOCGIFCONF) /* * Try to scan the interfaces using IPv6 ioctls(). */ @@ -721,7 +731,7 @@ scan_interfaces(int *have_v4, int *have_v6) { /* * Some OS's just return what will fit rather * than set EINVAL if the buffer is too small - * to fit all the interfaces in. If + * to fit all the interfaces in. If * ifc.ifc_len is too near to the end of the * buffer we will grow it just in case and * retry. @@ -786,7 +796,7 @@ scan_interfaces(int *have_v4, int *have_v6) { if ((u.ifreq.ifr_flags & IFF_UP) == 0) break; *have_v4 = 1; - } + } break; case AF_INET6: if (*have_v6 == 0) { diff --git a/lib/lwres/man/lwres.3 b/lib/lwres/man/lwres.3 index e1f8793..14c719a 100644 --- a/lib/lwres/man/lwres.3 +++ b/lib/lwres/man/lwres.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres.3,v 1.28 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres.3,v 1.28.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres.html b/lib/lwres/man/lwres.html index 986918a..c90bcbd 100644 --- a/lib/lwres/man/lwres.html +++ b/lib/lwres/man/lwres.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres — introduction to the lightweight resolver library

@@ -32,7 +32,7 @@
#include <lwres/lwres.h>
-

DESCRIPTION

+

DESCRIPTION

The BIND 9 lightweight resolver library is a simple, name service independent stub resolver library. It provides hostname-to-address @@ -47,7 +47,7 @@

-

OVERVIEW

+

OVERVIEW

The lwresd library implements multiple name service APIs. The standard @@ -101,7 +101,7 @@

-

CLIENT-SIDE LOW-LEVEL API CALL FLOW

+

CLIENT-SIDE LOW-LEVEL API CALL FLOW

When a client program wishes to make an lwres request using the native low-level API, it typically performs the following @@ -149,7 +149,7 @@

-

SERVER-SIDE LOW-LEVEL API CALL FLOW

+

SERVER-SIDE LOW-LEVEL API CALL FLOW

When implementing the server side of the lightweight resolver protocol using the lwres library, a sequence of actions like the @@ -191,7 +191,7 @@

-

SEE ALSO

+

SEE ALSO

lwres_gethostent(3), lwres_getipnode(3), diff --git a/lib/lwres/man/lwres_buffer.3 b/lib/lwres/man/lwres_buffer.3 index cc0959d..e8fe631 100644 --- a/lib/lwres/man/lwres_buffer.3 +++ b/lib/lwres/man/lwres_buffer.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_buffer.3,v 1.26 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_buffer.3,v 1.26.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_buffer.html b/lib/lwres/man/lwres_buffer.html index 7ed5407..b546bcf 100644 --- a/lib/lwres/man/lwres_buffer.html +++ b/lib/lwres/man/lwres_buffer.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem — lightweight resolver buffer management

@@ -262,7 +262,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide bounds checked access to a region of memory where data is being read or written. diff --git a/lib/lwres/man/lwres_config.3 b/lib/lwres/man/lwres_config.3 index 6184cb2..2d3b813 100644 --- a/lib/lwres/man/lwres_config.3 +++ b/lib/lwres/man/lwres_config.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_config.3,v 1.26 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_config.3,v 1.26.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_config.html b/lib/lwres/man/lwres_config.html index 050fd5d..fb29b7f 100644 --- a/lib/lwres/man/lwres_config.html +++ b/lib/lwres/man/lwres_config.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get — lightweight resolver configuration

@@ -90,7 +90,7 @@ lwres_conf_t *
-

DESCRIPTION

+

DESCRIPTION

lwres_conf_init() creates an empty lwres_conf_t @@ -123,7 +123,7 @@ lwres_conf_t *

-

RETURN VALUES

+

RETURN VALUES

lwres_conf_parse() returns LWRES_R_SUCCESS if it successfully read and parsed @@ -142,13 +142,13 @@ lwres_conf_t *

-

SEE ALSO

+

SEE ALSO

stdio(3), resolver(5).

-

FILES

+

FILES

/etc/resolv.conf

diff --git a/lib/lwres/man/lwres_context.3 b/lib/lwres/man/lwres_context.3 index b1022d8..dae7ee5 100644 --- a/lib/lwres/man/lwres_context.3 +++ b/lib/lwres/man/lwres_context.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001, 2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_context.3,v 1.28 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_context.3,v 1.28.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_context.html b/lib/lwres/man/lwres_context.html index d6fada9..22bdcd3 100644 --- a/lib/lwres/man/lwres_context.html +++ b/lib/lwres/man/lwres_context.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001, 2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv — lightweight resolver context management

@@ -172,7 +172,7 @@ void *
-

DESCRIPTION

+

DESCRIPTION

lwres_context_create() creates a lwres_context_t structure for use in lightweight resolver operations. It holds a socket and other @@ -258,7 +258,7 @@ void *

-

RETURN VALUES

+

RETURN VALUES

lwres_context_create() returns LWRES_R_NOMEMORY if memory for the struct lwres_context could not be allocated, @@ -283,7 +283,7 @@ void *

-

SEE ALSO

+

SEE ALSO

lwres_conf_init(3), malloc(3), diff --git a/lib/lwres/man/lwres_gabn.3 b/lib/lwres/man/lwres_gabn.3 index 0c14384..64846d1 100644 --- a/lib/lwres/man/lwres_gabn.3 +++ b/lib/lwres/man/lwres_gabn.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_gabn.3,v 1.27 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_gabn.3,v 1.27.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_gabn.html b/lib/lwres/man/lwres_gabn.html index efb152a3..e5cb4d3 100644 --- a/lib/lwres/man/lwres_gabn.html +++ b/lib/lwres/man/lwres_gabn.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free — lightweight resolver getaddrbyname message handling

@@ -178,7 +178,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver name-to-address lookup request and @@ -278,7 +278,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getaddrbyname opcode functions lwres_gabnrequest_render(), @@ -316,7 +316,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_gai_strerror.3 b/lib/lwres/man/lwres_gai_strerror.3 index e412b8f..46b54c0 100644 --- a/lib/lwres/man/lwres_gai_strerror.3 +++ b/lib/lwres/man/lwres_gai_strerror.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_gai_strerror.3,v 1.27 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_gai_strerror.3,v 1.27.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_gai_strerror.html b/lib/lwres/man/lwres_gai_strerror.html index aeb0967..994782d 100644 --- a/lib/lwres/man/lwres_gai_strerror.html +++ b/lib/lwres/man/lwres_gai_strerror.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gai_strerror — print suitable error string

@@ -42,7 +42,7 @@ char *
-

DESCRIPTION

+

DESCRIPTION

lwres_gai_strerror() returns an error message corresponding to an error code returned by getaddrinfo(). @@ -110,7 +110,7 @@ char *

-

SEE ALSO

+

SEE ALSO

strerror(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_getaddrinfo.3 b/lib/lwres/man/lwres_getaddrinfo.3 index 7a1b5d7..edac051 100644 --- a/lib/lwres/man/lwres_getaddrinfo.3 +++ b/lib/lwres/man/lwres_getaddrinfo.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001, 2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_getaddrinfo.3,v 1.31 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_getaddrinfo.3,v 1.31.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_getaddrinfo.html b/lib/lwres/man/lwres_getaddrinfo.html index ec00839..d3f6e0b 100644 --- a/lib/lwres/man/lwres_getaddrinfo.html +++ b/lib/lwres/man/lwres_getaddrinfo.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001, 2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getaddrinfo, lwres_freeaddrinfo — socket address structure to host and service name

@@ -89,7 +89,7 @@ struct addrinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getaddrinfo() is used to get a list of IP addresses and port numbers for host hostname and service @@ -283,7 +283,7 @@ struct addrinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getaddrinfo() returns zero on success or one of the error codes listed in gai_strerror(3) @@ -294,7 +294,7 @@ struct addrinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_gethostent.3 b/lib/lwres/man/lwres_gethostent.3 index 847d882..688c618 100644 --- a/lib/lwres/man/lwres_gethostent.3 +++ b/lib/lwres/man/lwres_gethostent.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_gethostent.3,v 1.29 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_gethostent.3,v 1.29.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_gethostent.html b/lib/lwres/man/lwres_gethostent.html index 9465440..3bccc48 100644 --- a/lib/lwres/man/lwres_gethostent.html +++ b/lib/lwres/man/lwres_gethostent.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r — lightweight resolver get network host entry

@@ -228,7 +228,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide hostname-to-address and address-to-hostname lookups by means of the lightweight resolver. @@ -366,7 +366,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

The functions lwres_gethostbyname(), @@ -430,7 +430,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

gethostent(3), lwres_getipnode(3), @@ -439,7 +439,7 @@ struct hostent {

-

BUGS

+

BUGS

lwres_gethostbyname(), lwres_gethostbyname2(), lwres_gethostbyaddr() diff --git a/lib/lwres/man/lwres_getipnode.3 b/lib/lwres/man/lwres_getipnode.3 index e5c51a9..b74b342 100644 --- a/lib/lwres/man/lwres_getipnode.3 +++ b/lib/lwres/man/lwres_getipnode.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001, 2003 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_getipnode.3,v 1.28 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_getipnode.3,v 1.28.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_getipnode.html b/lib/lwres/man/lwres_getipnode.html index c92c51c..5d9eb9d 100644 --- a/lib/lwres/man/lwres_getipnode.html +++ b/lib/lwres/man/lwres_getipnode.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001, 2003 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent — lightweight resolver nodename / address translation API

@@ -98,7 +98,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions perform thread safe, protocol independent nodename-to-address and address-to-nodename @@ -217,7 +217,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

If an error occurs, lwres_getipnodebyname() @@ -261,7 +261,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

RFC2553, lwres(3), diff --git a/lib/lwres/man/lwres_getnameinfo.3 b/lib/lwres/man/lwres_getnameinfo.3 index c477f79..d77776b 100644 --- a/lib/lwres/man/lwres_getnameinfo.3 +++ b/lib/lwres/man/lwres_getnameinfo.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_getnameinfo.3,v 1.29 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_getnameinfo.3,v 1.29.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_getnameinfo.html b/lib/lwres/man/lwres_getnameinfo.html index 7730131..200f93f 100644 --- a/lib/lwres/man/lwres_getnameinfo.html +++ b/lib/lwres/man/lwres_getnameinfo.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getnameinfo — lightweight resolver socket address structure to hostname and @@ -82,7 +82,7 @@ int

-

DESCRIPTION

+

DESCRIPTION

This function is equivalent to the getnameinfo(3) function defined in RFC2133. @@ -149,13 +149,13 @@ int

-

RETURN VALUES

+

RETURN VALUES

lwres_getnameinfo() returns 0 on success or a non-zero error code if an error occurs.

-

SEE ALSO

+

SEE ALSO

RFC2133, getservbyport(3), lwres(3), @@ -165,7 +165,7 @@ int

-

BUGS

+

BUGS

RFC2133 fails to define what the nonzero return values of getnameinfo(3) diff --git a/lib/lwres/man/lwres_getrrsetbyname.3 b/lib/lwres/man/lwres_getrrsetbyname.3 index 8419fff..bda5aa2 100644 --- a/lib/lwres/man/lwres_getrrsetbyname.3 +++ b/lib/lwres/man/lwres_getrrsetbyname.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_getrrsetbyname.3,v 1.25 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_getrrsetbyname.3,v 1.25.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_getrrsetbyname.html b/lib/lwres/man/lwres_getrrsetbyname.html index 15bfb82..be8c05a 100644 --- a/lib/lwres/man/lwres_getrrsetbyname.html +++ b/lib/lwres/man/lwres_getrrsetbyname.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getrrsetbyname, lwres_freerrset — retrieve DNS records

@@ -102,7 +102,7 @@ struct rrsetinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getrrsetbyname() gets a set of resource records associated with a hostname, class, @@ -150,7 +150,7 @@ struct rrsetinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getrrsetbyname() returns zero on success, and one of the following error codes if an error occurred: @@ -184,7 +184,7 @@ struct rrsetinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3).

diff --git a/lib/lwres/man/lwres_gnba.3 b/lib/lwres/man/lwres_gnba.3 index 39a1b9d..e04fa8f 100644 --- a/lib/lwres/man/lwres_gnba.3 +++ b/lib/lwres/man/lwres_gnba.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_gnba.3,v 1.27 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_gnba.3,v 1.27.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_gnba.html b/lib/lwres/man/lwres_gnba.html index 80c909e..bd1ce60 100644 --- a/lib/lwres/man/lwres_gnba.html +++ b/lib/lwres/man/lwres_gnba.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free — lightweight resolver getnamebyaddress message handling

@@ -183,7 +183,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver address-to-name lookup request and @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getnamebyaddr opcode functions lwres_gnbarequest_render(), @@ -308,7 +308,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3).

diff --git a/lib/lwres/man/lwres_hstrerror.3 b/lib/lwres/man/lwres_hstrerror.3 index 5998238..badb5fe 100644 --- a/lib/lwres/man/lwres_hstrerror.3 +++ b/lib/lwres/man/lwres_hstrerror.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_hstrerror.3,v 1.27 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_hstrerror.3,v 1.27.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_hstrerror.html b/lib/lwres/man/lwres_hstrerror.html index b166e3d..fce6c31 100644 --- a/lib/lwres/man/lwres_hstrerror.html +++ b/lib/lwres/man/lwres_hstrerror.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_herror, lwres_hstrerror — lightweight resolver error message generation

@@ -50,7 +50,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_herror() prints the string s on stderr followed by the string generated by @@ -84,7 +84,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

The string Unknown resolver error is returned by lwres_hstrerror() @@ -94,7 +94,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

herror(3), lwres_hstrerror(3). diff --git a/lib/lwres/man/lwres_inetntop.3 b/lib/lwres/man/lwres_inetntop.3 index c7d3d12..1f9e097 100644 --- a/lib/lwres/man/lwres_inetntop.3 +++ b/lib/lwres/man/lwres_inetntop.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_inetntop.3,v 1.26 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_inetntop.3,v 1.26.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_inetntop.html b/lib/lwres/man/lwres_inetntop.html index 3522a1d..37bd95f 100644 --- a/lib/lwres/man/lwres_inetntop.html +++ b/lib/lwres/man/lwres_inetntop.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_net_ntop — lightweight resolver IP address presentation

@@ -62,7 +62,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_net_ntop() converts an IP address of protocol family af — IPv4 or IPv6 — at @@ -80,7 +80,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

If successful, the function returns dst: a pointer to a string containing the presentation format of the @@ -93,7 +93,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

RFC1884, inet_ntop(3), errno(3). diff --git a/lib/lwres/man/lwres_noop.3 b/lib/lwres/man/lwres_noop.3 index 0e4ed71..6c39ce6 100644 --- a/lib/lwres/man/lwres_noop.3 +++ b/lib/lwres/man/lwres_noop.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_noop.3,v 1.28 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_noop.3,v 1.28.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_noop.html b/lib/lwres/man/lwres_noop.html index 18a41fa..c8fad5d 100644 --- a/lib/lwres/man/lwres_noop.html +++ b/lib/lwres/man/lwres_noop.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free — lightweight resolver no-op message handling

@@ -179,7 +179,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver no-op request and response messages. @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The no-op opcode functions lwres_nooprequest_render(), @@ -309,7 +309,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_packet.3 b/lib/lwres/man/lwres_packet.3 index 1e1f98f..068d241 100644 --- a/lib/lwres/man/lwres_packet.3 +++ b/lib/lwres/man/lwres_packet.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_packet.3,v 1.29 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_packet.3,v 1.29.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_packet.html b/lib/lwres/man/lwres_packet.html index 11601e8..17aed04 100644 --- a/lib/lwres/man/lwres_packet.html +++ b/lib/lwres/man/lwres_packet.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_lwpacket_renderheader, lwres_lwpacket_parseheader — lightweight resolver packet handling functions

@@ -66,7 +66,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

These functions rely on a struct lwres_lwpacket @@ -219,7 +219,7 @@ struct lwres_lwpacket {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_lwpacket_renderheader() and diff --git a/lib/lwres/man/lwres_resutil.3 b/lib/lwres/man/lwres_resutil.3 index d26f77c..2297cb7 100644 --- a/lib/lwres/man/lwres_resutil.3 +++ b/lib/lwres/man/lwres_resutil.3 @@ -1,7 +1,7 @@ .\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000, 2001 Internet Software Consortium. .\" -.\" Permission to use, copy, modify, and distribute this software for any +.\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" @@ -13,7 +13,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: lwres_resutil.3,v 1.28 2007/01/30 00:24:59 marka Exp $ +.\" $Id: lwres_resutil.3,v 1.28.418.1 2009/07/11 01:55:21 tbox Exp $ .\" .hy 0 .ad l diff --git a/lib/lwres/man/lwres_resutil.html b/lib/lwres/man/lwres_resutil.html index e67ac0a..3cde25b 100644 --- a/lib/lwres/man/lwres_resutil.html +++ b/lib/lwres/man/lwres_resutil.html @@ -2,7 +2,7 @@ - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000, 2001 Internet Software Consortium. - - - Permission to use, copy, modify, and distribute this software for any + - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr — lightweight resolver utility functions

@@ -134,7 +134,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

lwres_string_parse() retrieves a DNS-encoded string starting the current pointer of lightweight resolver buffer b: i.e. @@ -210,7 +210,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_string_parse() @@ -248,7 +248,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_buffer(3), lwres_gabn(3). diff --git a/version b/version index c6fcc3f..5559b5c 100644 --- a/version +++ b/version @@ -1,10 +1,10 @@ -# $Id: version,v 1.43.12.5.8.3 2009/12/31 20:29:20 each Exp $ +# $Id: version,v 1.43.12.8 2010/02/18 03:34:50 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. # MAJORVER=9 MINORVER=6 -PATCHVER=1 -RELEASETYPE=-P -RELEASEVER=3 +PATCHVER=2 +RELEASETYPE= +RELEASEVER= -- cgit v1.1 From dd00bb16c74b474ce18dbc6bcfd33c42313a66ca Mon Sep 17 00:00:00 2001 From: dougb Date: Wed, 17 Mar 2010 05:53:04 +0000 Subject: Vendor import of BIND 9.6.2-P1 --- CHANGES | 3 + bin/named/server.c | 6 +- doc/arm/Bv9ARM-book.xml | 9 +- doc/arm/Bv9ARM.ch06.html | 82 +- doc/arm/Bv9ARM.ch07.html | 14 +- doc/arm/Bv9ARM.ch08.html | 18 +- doc/arm/Bv9ARM.ch09.html | 180 +- doc/arm/Bv9ARM.html | 42 +- doc/arm/Bv9ARM.pdf | 2831 +++++++++++++++---------------- doc/arm/man.dig.html | 20 +- doc/arm/man.dnssec-dsfromkey.html | 16 +- doc/arm/man.dnssec-keyfromlabel.html | 12 +- doc/arm/man.dnssec-keygen.html | 14 +- doc/arm/man.dnssec-signzone.html | 14 +- doc/arm/man.host.html | 10 +- doc/arm/man.named-checkconf.html | 12 +- doc/arm/man.named-checkzone.html | 12 +- doc/arm/man.named.html | 16 +- doc/arm/man.nsupdate.html | 14 +- doc/arm/man.rndc-confgen.html | 12 +- doc/arm/man.rndc.conf.html | 12 +- doc/arm/man.rndc.html | 12 +- lib/dns/api | 6 +- lib/dns/include/dns/rdataset.h | 20 +- lib/dns/include/dns/resolver.h | 46 +- lib/dns/include/dns/result.h | 8 +- lib/dns/include/dns/validator.h | 6 +- lib/dns/ncache.c | 6 +- lib/dns/rbtdb.c | 38 +- lib/dns/rdatalist.c | 6 +- lib/dns/rdataset.c | 25 +- lib/dns/rdataslab.c | 6 +- lib/dns/resolver.c | 417 ++++- lib/dns/result.c | 7 +- lib/dns/sdb.c | 6 +- lib/dns/sdlz.c | 6 +- lib/dns/validator.c | 160 +- lib/dns/view.c | 11 +- lib/lwres/man/lwres.html | 14 +- lib/lwres/man/lwres_buffer.html | 6 +- lib/lwres/man/lwres_config.html | 12 +- lib/lwres/man/lwres_context.html | 10 +- lib/lwres/man/lwres_gabn.html | 10 +- lib/lwres/man/lwres_gai_strerror.html | 8 +- lib/lwres/man/lwres_getaddrinfo.html | 10 +- lib/lwres/man/lwres_gethostent.html | 12 +- lib/lwres/man/lwres_getipnode.html | 10 +- lib/lwres/man/lwres_getnameinfo.html | 12 +- lib/lwres/man/lwres_getrrsetbyname.html | 10 +- lib/lwres/man/lwres_gnba.html | 10 +- lib/lwres/man/lwres_hstrerror.html | 10 +- lib/lwres/man/lwres_inetntop.html | 10 +- lib/lwres/man/lwres_noop.html | 10 +- lib/lwres/man/lwres_packet.html | 8 +- lib/lwres/man/lwres_resutil.html | 10 +- version | 6 +- 56 files changed, 2455 insertions(+), 1858 deletions(-) diff --git a/CHANGES b/CHANGES index d230421..d14fdd6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ + --- 9.6.2-P1 released --- + +2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619] --- 9.6.2 released --- diff --git a/bin/named/server.c b/bin/named/server.c index b9259c7..6608fdf 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.520.12.11 2009/12/24 00:17:47 each Exp $ */ +/* $Id: server.c,v 1.520.12.11.8.2 2010/02/25 10:57:11 tbox Exp $ */ /*! \file */ @@ -4726,6 +4726,8 @@ dumpdone(void *arg, isc_result_t result) { } if (dctx->cache != NULL) { dns_adb_dump(dctx->view->view->adb, dctx->fp); + dns_resolver_printbadcache(dctx->view->view->resolver, + dctx->fp); dns_db_detach(&dctx->cache); } if (dctx->dumpzones) { diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 44e30b1..29331d9 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + BIND 9 Administrator Reference Manual @@ -7705,6 +7705,13 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; 1800 (30 minutes). + + Lame-ttl also controls the amount of time DNSSEC + validation failures are cached. There is a minimum + of 30 seconds applied to bad cache entries if the + lame-ttl is set to less than 30 seconds. + + diff --git a/doc/arm/Bv9ARM.ch06.html b/doc/arm/Bv9ARM.ch06.html index 9da3432..9e0667e 100644 --- a/doc/arm/Bv9ARM.ch06.html +++ b/doc/arm/Bv9ARM.ch06.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -78,25 +78,25 @@

server Statement Definition and Usage
statistics-channels Statement Grammar
-
statistics-channels Statement Definition and +
statistics-channels Statement Definition and Usage
-
trusted-keys Statement Grammar
-
trusted-keys Statement Definition +
trusted-keys Statement Grammar
+
trusted-keys Statement Definition and Usage
view Statement Grammar
-
view Statement Definition and Usage
+
view Statement Definition and Usage
zone Statement Grammar
-
zone Statement Definition and Usage
+
zone Statement Definition and Usage
-
Zone File
+
Zone File
Types of Resource Records and When to Use Them
-
Discussion of MX Records
+
Discussion of MX Records
Setting TTLs
-
Inverse Mapping in IPv4
-
Other Zone File Directives
-
BIND Master File Extension: the $GENERATE Directive
+
Inverse Mapping in IPv4
+
Other Zone File Directives
+
BIND Master File Extension: the $GENERATE Directive
Additional File Formats
BIND9 Statistics
@@ -4397,14 +4397,22 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; Tuning
lame-ttl
-

+

+

Sets the number of seconds to cache a lame server indication. 0 disables caching. (This is NOT recommended.) The default is 600 (10 minutes) and the maximum value is 1800 (30 minutes). -

+

+

+ Lame-ttl also controls the amount of time DNSSEC + validation failures are cached. There is a minimum + of 30 seconds applied to bad cache entries if the + lame-ttl is set to less than 30 seconds. +

+
max-ncache-ttl

To reduce network traffic and increase performance, @@ -5060,7 +5068,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-statistics-channels Statement Definition and +statistics-channels Statement Definition and Usage

The statistics-channels statement @@ -5111,7 +5119,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-trusted-keys Statement Grammar

+trusted-keys Statement Grammar
trusted-keys {
     string number number number string ;
     [ string number number number string ; [...]]
@@ -5120,7 +5128,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
 

-trusted-keys Statement Definition +trusted-keys Statement Definition and Usage

The trusted-keys statement defines @@ -5166,7 +5174,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-view Statement Definition and Usage

+view Statement Definition and Usage

The view statement is a powerful feature @@ -5432,10 +5440,10 @@ zone zone_name [

-zone Statement Definition and Usage

+zone Statement Definition and Usage

-Zone Types

+Zone Types
@@ -5646,7 +5654,7 @@ zone zone_name [

-Class

+Class

The zone's name may optionally be followed by a class. If a class is not specified, class IN (for Internet), @@ -5668,7 +5676,7 @@ zone zone_name [

-Zone Options

+Zone Options
allow-notify

@@ -6247,7 +6255,7 @@ zone zone_name [

-Zone File

+Zone File

Types of Resource Records and When to Use Them

@@ -6260,7 +6268,7 @@ zone zone_name [

-Resource Records

+Resource Records

A domain name identifies a node. Each node has a set of resource information, which may be empty. The set of resource @@ -6997,7 +7005,7 @@ zone zone_name [

-Textual expression of RRs

+Textual expression of RRs

RRs are represented in binary form in the packets of the DNS protocol, and are usually represented in highly encoded form @@ -7200,7 +7208,7 @@ zone zone_name [

-Discussion of MX Records

+Discussion of MX Records

As described above, domain servers store information as a series of resource records, each of which contains a particular @@ -7456,7 +7464,7 @@ zone zone_name [

-Inverse Mapping in IPv4

+Inverse Mapping in IPv4

Reverse name resolution (that is, translation from IP address to name) is achieved by means of the in-addr.arpa domain @@ -7517,7 +7525,7 @@ zone zone_name [

-Other Zone File Directives

+Other Zone File Directives

The Master File Format was initially defined in RFC 1035 and has subsequently been extended. While the Master File Format @@ -7532,7 +7540,7 @@ zone zone_name [

-The @ (at-sign)

+The @ (at-sign)

When used in the label (or name) field, the asperand or at-sign (@) symbol represents the current origin. @@ -7543,7 +7551,7 @@ zone zone_name [

-The $ORIGIN Directive

+The $ORIGIN Directive

Syntax: $ORIGIN domain-name @@ -7572,7 +7580,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-The $INCLUDE Directive

+The $INCLUDE Directive

Syntax: $INCLUDE filename @@ -7608,7 +7616,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-The $TTL Directive

+The $TTL Directive

Syntax: $TTL default-ttl @@ -7627,7 +7635,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-BIND Master File Extension: the $GENERATE Directive

+BIND Master File Extension: the $GENERATE Directive

Syntax: $GENERATE range @@ -8018,7 +8026,7 @@ $GENERATE 1-127 $ CNAME $.0

-Name Server Statistics Counters

+Name Server Statistics Counters
@@ -8575,7 +8583,7 @@ $GENERATE 1-127 $ CNAME $.0

-Zone Maintenance Statistics Counters

+Zone Maintenance Statistics Counters
@@ -8729,7 +8737,7 @@ $GENERATE 1-127 $ CNAME $.0

-Resolver Statistics Counters

+Resolver Statistics Counters
@@ -9105,7 +9113,7 @@ $GENERATE 1-127 $ CNAME $.0

-Socket I/O Statistics Counters

+Socket I/O Statistics Counters

Socket I/O statistics counters are defined per socket types, which are @@ -9260,7 +9268,7 @@ $GENERATE 1-127 $ CNAME $.0

-Compatibility with BIND 8 Counters

+Compatibility with BIND 8 Counters

Most statistics counters that were available in BIND 8 are also supported in diff --git a/doc/arm/Bv9ARM.ch07.html b/doc/arm/Bv9ARM.ch07.html index dd6991c..91994f3 100644 --- a/doc/arm/Bv9ARM.ch07.html +++ b/doc/arm/Bv9ARM.ch07.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -46,10 +46,10 @@

Table of Contents

Access Control Lists
-
Chroot and Setuid
+
Chroot and Setuid
-
The chroot Environment
-
Using the setuid Function
+
The chroot Environment
+
Using the setuid Function
Dynamic Update Security
@@ -119,7 +119,7 @@ zone "example.com" {

-Chroot and Setuid +Chroot and Setuid

On UNIX servers, it is possible to run BIND @@ -145,7 +145,7 @@ zone "example.com" {

-The chroot Environment

+The chroot Environment

In order for a chroot environment to @@ -173,7 +173,7 @@ zone "example.com" {

-Using the setuid Function

+Using the setuid Function

Prior to running the named daemon, use diff --git a/doc/arm/Bv9ARM.ch08.html b/doc/arm/Bv9ARM.ch08.html index 8b5ebbe..3e7c8c3 100644 --- a/doc/arm/Bv9ARM.ch08.html +++ b/doc/arm/Bv9ARM.ch08.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -45,18 +45,18 @@

-Common Problems

+Common Problems

-It's not working; how can I figure out what's wrong?

+It's not working; how can I figure out what's wrong?

The best solution to solving installation and configuration issues is to take preventative measures by setting @@ -68,7 +68,7 @@

-Incrementing and Changing the Serial Number

+Incrementing and Changing the Serial Number

Zone serial numbers are just numbers — they aren't date related. A lot of people set them to a number that @@ -95,7 +95,7 @@

-Where Can I Get Help?

+Where Can I Get Help?

The Internet Systems Consortium (ISC) offers a wide range diff --git a/doc/arm/Bv9ARM.ch09.html b/doc/arm/Bv9ARM.ch09.html index 72ab6fe..6b6af6a 100644 --- a/doc/arm/Bv9ARM.ch09.html +++ b/doc/arm/Bv9ARM.ch09.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -45,21 +45,21 @@

-Acknowledgments

+Acknowledgments

A Brief History of the DNS and BIND @@ -162,7 +162,7 @@

-General DNS Reference Information

+General DNS Reference Information

IPv6 addresses (AAAA)

@@ -250,17 +250,17 @@

-Bibliography

+Bibliography

Standards

-

[RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

+

[RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

-

[RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

+

[RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

-

[RFC1035] P. V. Mockapetris. Domain Names — Implementation and +

[RFC1035] P. V. Mockapetris. Domain Names — Implementation and Specification. November 1987.

@@ -268,42 +268,42 @@

Proposed Standards

-

[RFC2181] R., R. Bush Elz. Clarifications to the DNS +

[RFC2181] R., R. Bush Elz. Clarifications to the DNS Specification. July 1997.

-

[RFC2308] M. Andrews. Negative Caching of DNS +

[RFC2308] M. Andrews. Negative Caching of DNS Queries. March 1998.

-

[RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

+

[RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

-

[RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

+

[RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

-

[RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

+

[RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

-

[RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

+

[RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

-

[RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

+

[RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

-

[RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

+

[RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

-

[RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

+

[RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

-

[RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

+

[RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

-

[RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

+

[RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

-

[RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret +

[RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret Key Transaction Authentication for DNS (GSS-TSIG). October 2003.

@@ -312,19 +312,19 @@

DNS Security Proposed Standards

-

[RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

+

[RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

-

[RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

+

[RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

-

[RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

+

[RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

-

[RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

+

[RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

-

[RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS +

[RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS Security Extensions. March 2005.

@@ -332,146 +332,146 @@

Other Important RFCs About DNS Implementation

-

[RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely +

[RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely Deployed DNS Software.. October 1993.

-

[RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation +

[RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation Errors and Suggested Fixes. October 1993.

-

[RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

+

[RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

-

[RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS +

[RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS Queries for IPv6 Addresses. May 2005.

Resource Record Types

-

[RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

+

[RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

-

[RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

+

[RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

-

[RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using +

[RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using the Domain Name System. June 1997.

-

[RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the +

[RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the Domain Name System. January 1996.

-

[RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the +

[RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the Location of Services.. October 1996.

-

[RFC2163] A. Allocchio. Using the Internet DNS to +

[RFC2163] A. Allocchio. Using the Internet DNS to Distribute MIXER Conformant Global Address Mapping. January 1998.

-

[RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

+

[RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

-

[RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

+

[RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

-

[RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

+

[RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

-

[RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

+

[RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

-

[RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

+

[RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

-

[RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

+

[RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

-

[RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

+

[RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

-

[RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

+

[RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

-

[RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

+

[RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

-

[RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

+

[RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

-

[RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP +

[RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP version 6. October 2003.

-

[RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

+

[RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

DNS and the Internet

-

[RFC1101] P. V. Mockapetris. DNS Encoding of Network Names +

[RFC1101] P. V. Mockapetris. DNS Encoding of Network Names and Other Types. April 1989.

-

[RFC1123] Braden. Requirements for Internet Hosts - Application and +

[RFC1123] Braden. Requirements for Internet Hosts - Application and Support. October 1989.

-

[RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

+

[RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

-

[RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

+

[RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

-

[RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

+

[RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

-

[RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

+

[RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

DNS Operations

-

[RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

+

[RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

-

[RFC1537] P. Beertema. Common DNS Data File +

[RFC1537] P. Beertema. Common DNS Data File Configuration Errors. October 1993.

-

[RFC1912] D. Barr. Common DNS Operational and +

[RFC1912] D. Barr. Common DNS Operational and Configuration Errors. February 1996.

-

[RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

+

[RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

-

[RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for +

[RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for Network Services.. October 1997.

Internationalized Domain Names

-

[RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, +

[RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, and the Other Internet protocols. May 2000.

-

[RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

+

[RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

-

[RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

+

[RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

-

[RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode +

[RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA). March 2003.

@@ -487,47 +487,47 @@

-

[RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String +

[RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String Attributes. May 1993.

-

[RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

+

[RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

-

[RFC1794] T. Brisco. DNS Support for Load +

[RFC1794] T. Brisco. DNS Support for Load Balancing. April 1995.

-

[RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

+

[RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

-

[RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

+

[RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

-

[RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

+

[RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

-

[RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

+

[RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

-

[RFC3258] T. Hardie. Distributing Authoritative Name Servers via +

[RFC3258] T. Hardie. Distributing Authoritative Name Servers via Shared Unicast Addresses. April 2002.

-

[RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

+

[RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

Obsolete and Unimplemented Experimental RFC

-

[RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical +

[RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical Location. November 1994.

-

[RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

+

[RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

-

[RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation +

[RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation and Renumbering. July 2000.

@@ -541,39 +541,39 @@

-

[RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

+

[RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

-

[RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

+

[RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

-

[RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

+

[RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

-

[RFC3008] B. Wellington. Domain Name System Security (DNSSEC) +

[RFC3008] B. Wellington. Domain Name System Security (DNSSEC) Signing Authority. November 2000.

-

[RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

+

[RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

-

[RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

+

[RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

-

[RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

+

[RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

-

[RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

+

[RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

-

[RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

+

[RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

-

[RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record +

[RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record (RR) Secure Entry Point (SEP) Flag. April 2004.

-

[RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

+

[RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

@@ -594,14 +594,14 @@

-Other Documents About BIND +Other Documents About BIND

-Bibliography

+Bibliography
-

Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

+

Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

diff --git a/doc/arm/Bv9ARM.html b/doc/arm/Bv9ARM.html index b31b67a..2f127c6 100644 --- a/doc/arm/Bv9ARM.html +++ b/doc/arm/Bv9ARM.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -157,25 +157,25 @@
server Statement Definition and Usage
statistics-channels Statement Grammar
-
statistics-channels Statement Definition and +
statistics-channels Statement Definition and Usage
-
trusted-keys Statement Grammar
-
trusted-keys Statement Definition +
trusted-keys Statement Grammar
+
trusted-keys Statement Definition and Usage
view Statement Grammar
-
view Statement Definition and Usage
+
view Statement Definition and Usage
zone Statement Grammar
-
zone Statement Definition and Usage
+
zone Statement Definition and Usage
-
Zone File
+
Zone File
Types of Resource Records and When to Use Them
-
Discussion of MX Records
+
Discussion of MX Records
Setting TTLs
-
Inverse Mapping in IPv4
-
Other Zone File Directives
-
BIND Master File Extension: the $GENERATE Directive
+
Inverse Mapping in IPv4
+
Other Zone File Directives
+
BIND Master File Extension: the $GENERATE Directive
Additional File Formats
BIND9 Statistics
@@ -184,31 +184,31 @@
7. BIND 9 Security Considerations
Access Control Lists
-
Chroot and Setuid
+
Chroot and Setuid
-
The chroot Environment
-
Using the setuid Function
+
The chroot Environment
+
Using the setuid Function
Dynamic Update Security
8. Troubleshooting
-
Common Problems
-
It's not working; how can I figure out what's wrong?
-
Incrementing and Changing the Serial Number
-
Where Can I Get Help?
+
Common Problems
+
It's not working; how can I figure out what's wrong?
+
Incrementing and Changing the Serial Number
+
Where Can I Get Help?
A. Appendices
-
Acknowledgments
+
Acknowledgments
A Brief History of the DNS and BIND
-
General DNS Reference Information
+
General DNS Reference Information
IPv6 addresses (AAAA)
Bibliography (and Suggested Reading)
Request for Comments (RFCs)
Internet Drafts
-
Other Documents About BIND
+
Other Documents About BIND
I. Manual pages
diff --git a/doc/arm/Bv9ARM.pdf b/doc/arm/Bv9ARM.pdf index ca72481..87f3462 100644 --- a/doc/arm/Bv9ARM.pdf +++ b/doc/arm/Bv9ARM.pdf @@ -5575,28 +5575,26 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1389 0 obj << -/Length 3094 +/Length 3100 /Filter /FlateDecode >> stream -xÚ½]sÛ¸ñÝ¿BÔLÈàƒˆG_⤾Þ9­ív¦s¹Z‚mN$Ò!©8¾_ßvÁ‰RrÍMí»‹Å~Ó|Áà—/2•(#ÌB›4ÉÏ«í[<ÀÚû3N0qŠÇP?Ýž½~'õÂ$F µ¸½áÊ–ç|q»þ-R‰H–€Eo>\½»|ÿ¯ëó¥N£ÛËWËXd,zwùËŽÞ_Ÿÿúëùõ2æyÆ£7;ÿÇíÅ5.)ÂñÓåÕ[œ1ø8‚ôúâÝÅõÅÕ›‹åï·?Ÿ]ÜögŸ—3éòùì·ßÙb ÇþùŒ%ÒäÙâ^X‹íYšÉ$K¥ 3›³›³öG«~ëœüzà-‘,ãßE–‹Ä˜,'Ëq.•Jsîc€‹†aÇÕp½*Ï’,Ãõ -¹à<10çîW‰Dj®:ËàÎÞï•“°‡4I¦Rî9K2)€sña+ÝÂ_ÜàdZè…:¹^2‹Ï ž°Ô‰@£±?ë ?ñúr+ok8Ñbt¨€8cö‡Rb¤³ ªô%¨Ô3|Y-ã”gQ÷X¶8jìÆ­Å—úŸ¨‹nd^Á35°Á¢4”‘à)K˜P†ÄÑ4KØÒÚ.®›¥`ÑÚ6´iÌW–&š§Šö´]ÑÙ­­:¤·®-1VÕ4Õîžž_œ²ˆf> -‘~dL|]JÙµ{ut1Õ×£p·@¢n#1l,«0"e¢;ÇÞ Ž×öÞá)v›LQ¦%|c;°:‘ -Ò›TFÕn{ç´ÞM:·àž­MZ·ÐÕ8¹*V¸GD®¸c„ Í—€¤¬ÖåªèʺrVÆòˆáüºl‹»%¬›=ê#ËØ­÷VIK>y,K™Ã˜ƒj¢G¹úp;rÜÜ(“N VYg -¶ZÛuÔ8Ðå þP™sb÷Î5àK ŸŽés™&&’è+Æfè –¤B†ÀáNÅâÜ–Õ®³-’vh•0èÛâk¹ÝmñåK±ÙÙSìh#;<ŸçG%)ã#vä!;É1 È”t²ü†Œ¡Ž[@åƒÆ•×¨9;àB‚òÊì4ýj†IðË©4Ÿrp»4 ð -‘‘v¬w+'n‘F•ížëæ.vMqïÖg]á:^œpqb…{}du3O¶¹¯p¸+ûÊͺ\‘ FÚ®Æ-®UöLæ AUûl›6™±8…ûT™œF¾CqîÉ@å‰â½Vz+2Úµ>Š 2rxBŒÁA| - sÈq1¼ôáÇíÃ@£ûº¡©GÛÒ_ʪ_´‚<Âbp=1e2XÝì¡ W僟øá˜LðA8‡¶f•§:X›75)H¡ÙÁ‰¯ÞðpøXïšÁêö8Ï!ü±TüoœC²â“)GÅ~]Y¹0Ö$¯â…¸qúë,!"2'؉6=—› úˆ;ò?-d6U·y!wÕ,sˆœàämp`5>5¹R¢ŽëžØn -Yàã̧óŠœÞQ”ˆà ‚ßI4†:îz¨ éãî¤d $Ä'É÷P3ô§îD­µš2@‘9S!¨q0È‚¡Á4 žËÕãdÏÈǸuºFÕ‡n¢ÛY—UѼàŒSͧº-»‚ñ“¼P,EîÍÎë ”Rç|j”CðÌSt/ð¬+G4Ï¢gk?á”#¦qè”Í2Eãlznû=îþÃzžkœÝ/8X»– Pý¼³Mi‰|G;Èmíš -ßo "Qýû«·Ï/y…{ï,bœ¤æTX'RBö\·”h‹³¸jÀ‡oíºmÆ•ëëÖ_«»“·;wa¶ Ù«|úˆâüñÝÔ9ü¼>ÇqH_ðò(…@šàÀMPT©7;ï¤gó„Ò\Ù¶=ng2sЧoØÙê„(oge7uݵ6Ƙ+ÈåiÒ=Ô í‰AhR¨‰'Ä)r䎋`YfH€3¼J÷D¡/5dT-.u¾âƒ‘Wó,ˆüó®¤4WÉLsôt”m»=2^3¡šïQ­䎌P¤‰Ló=¿]¬Vö |rò]™m>‘—JòLçHÄL¨ÉÐi!ÀâäJ=}2O! (ý=µžÌ}-?ÚÒ€Tñ'*Ñ°c¯l ÜX Dk}¬;”CB­¡T’šÖ¨ô¯èå4”#Rx{Yw( ŽÇ˜»C.KV2• )e¢™AU¹òZ¦A‰·Oß–±Ô!(©±@mJ™ãÍ‚±<ìŠ$È^&ÿL³à´ÅÂ$y®ïX¦)ÿF#@ž -ÛigÖCù ¯|ˆ!^•ë²{‰½÷‡·Ç–jG]/Æ[€šácâØ2áÊË)7®¯äÊùtH´|Lzߦû4f€åçh$;ˆ“ÞSáûó£­äíÕÍÍÅœ…ƒWElq½Øuõj˜”· ¹× [A vÑ;Uу­lC $¼-=ñA˜Ñi¥Ä;<×/U±-Wø²{ZÚèÂë¾è…&2™/„N! ‚Lq±y óº~?V‚Ç/á/fp+ª‹€4ûÜH©ÁärÂÍ"ôPßàáÕ÷ äFöëE&ßi1..ôW ëåTôõ“;EA›±ˆ¡˜ã{æ`n“;õz·qÙ ã!%uÃv¬”nâ±~ÆÁ¦vÝU7º³÷u`Ž{V_pŒqG´¼¯vž¢?'"Ã'.÷úåÒK%£Ë{\õRà/žëÃ"ÓkÈ -e¦Cbu¨óRf8¬ÞÔqóEþ:ÅfŒ°Ë· Hðþ‘ÆÐí©¢üýx´ÛÐ@/f‚*g“¾`ôVd: &Ÿ~)¸0|£ ÓÍ{߇%y X›ç²GØMQM˜EŠøô5±SOÈÃoƒ/Ò–ÀåÌÁF<›|¾v×*xŸÛȹʧ‰<|Þ ó¾‡ò ~ -0˜ÇM7;uè—¦LxgOøkï­ÓÆLÒan¨ñàÅ×>D¹èM^|P½Ø¢i©5".Úû„ຠJ±¡ -ïû ^n&SУ\Xˆ©^ãTY¹<’z<¢ïñê WûƒV–è(¼GZG‚zI‚Ê?¸ÛÅÑØà=hàbµkp¾êö‰t@ÉyÐkšÑê)lÊmÙw&Šm½«(õ­©±ÚÔ«OÔ—ødŸ]#ð¨Œ[4!²Ðt=šìwãeùbÿ- $²Y‡ŒÞÕŸŠá‡$˜pŸé:šk-”^¯`a ÆP>a½¯UB&n>œãÌàññù‚ê>` -ÕŠ¿¨¹5*¦‰D©FaQèrÂ…ßmBSÚ¡-BÐóÝ¢*ýj¯§ý¥hÊzGý w­Í^÷;x}ÔYˆèGËR.X¢2öLn u<“ë¡Â5’EÇU½¶‡å©„TSjqš…j†‡©»‘ ãÎN˜¸Áσ 22>ö|”ÏÁØß? ¿¸©Æçíµ_![ª¼)À¬w¶þ}Ûf> ¸)Õ' JãORž›}Ÿû0iâý–£ç²{œ,Uö>þýâ?KÎý7ó'>¼(O }ûuÖ…ëÄH‘+Pƒv¸o&ZñÓ4:®@h_‚CQ¢L»v­8ÉDtÈÅä¸ Äû ƒ¹ôùâ‘R–ÇzC_-z-øŸ¾ñ¾ŸÒû­Þ'‰èø9Û€Jù—ÿÜ14“P+ÂN¹H‹ þ–ûmü.|æ"½ó]æSÿŸº¥ýW$Þ+לn‘òÓ-Ò u¦”s·Êz?üÏ:Ã7pÈk >âb pOÒSþƒ¥:´ -–©Ä ëÿ%µÃendstream +xÚ­ZÝsÜ6÷_±Ú™Já—HñÑMœ{=çÎöÝÌMÛy—v4Ù•6’6Žû×H€úØ·½Ôž±(@ø€Ì ~ù"×™¶Â.ŒUYÎx¾Xm/Øâ ÆÞ_p¢I#Q:¥úþþâÍ;i6³ZèÅýã„W‘±¢à‹ûõωÎD¶,yûáæÝõûß^.Jî¯?Ü,S‘³äÝõOWØz{ù\Þ.S^ä_üü+[¬aÙ?^°LÚ"_<à ˸µb±½P¹Ìr%eìÙ\Ü]ük`8 SOíß@ºe’åü‰å"³6W§Å²EZÈL+iÏóÂy xQ3Θ³Wy–çb<^!œgúüùj‘IÃõÂä9œ¹Æó½ñ;(m–kÅ=!gY.h(>,SÍ“{ø+’£óžÌ³0 §"ìÌâó‚gLY+‘hÒk÷ t¼¹ÞŠÅ ¬h1YTdœN9‡Ei1±Y0U ù’• + +_×ËTñ<é?V¶Z·qeçð¥yÄ'Ú¢oÙïà©,Lp¸ZNDpÅ2&´¥íhÛ%Lé\Ÿ6íR°díZš4Õ+W™áJÓœ®/{·uuòÖ#ÅꆺºýnüRÅêùEõ câëR²Ä­ý«—³H9˜¾ +hųMëIabU?i›ÜO€;|ÀeÕܹ°ŠÄyWpõÚ­3ÆA.;‹Ê=ˆ=zhÀ—(_Mås©2[Iò5c'ä –)!ãÅáWÅòÜVõ¾wŠöè•Ðè£ÛòkµÝoñåK¹Ù»×Ô1&VFuxqZ)Æ'êÈcu2DU™[(€ð5Sšç§h¬p0*)7]ƒ-0‘>lk³ ‡–G›¢m³÷@ïÛhS*B"´~¸¹»»z‹mXcµÆ‚,Ëj³ÇÃꈾ‘Loƒk²8¹éX' 'X^•Îq}`Øß <ㆌVïÏf·ÛT.žOƒÏ‡’:¢/@n´¶r4«z<8Ð͸yxŒ$©Ÿ3·èâÌpã«•C©\Ââ báy”šRG©*lTù5­ÃJOaFæ¯Ë¨N(0 0ÄÛZs î—@ ¶AääÁëýÊï¬PIíúç¦ý„ƒ}[>úqû­pKø»|…sCôã{v®}lZ¸Wî;ßcé¼D>pèúf´D«ÝXê¢,ëîÙµx,»™*ð9Ë»;Ú΃=ÐE¦ù€ÁV„Lö]°BA@ O´h”¨çЇ÷`•èS~z´›–º>ºŽúhøRÕÃx”÷#ª™Aú›µž­•@Õ  z¼IOðËÿÈæØ\ðqsŽñÐfºP&¢!; ‡RdæF±—7ŽØüØìÛ4/ DaJüšC@^/Å}]9„“Ú¯ò…´ñö‹¨ Q ó÷ØìB{®6*5DŸu¿y!i—D7p‚˜¡ëŽ$ u„J%>žÈ}ú`ñb:‹GJ+þ:MˆÎ£Q$ŠÛ|‹`‹¬…Œå5Ùѱð9y2z&â¦\Gd×Ó«:.ÝèbÐxþX­>ÎæLÐÅÓêñ2Ñ κªËö{¼Qîš®ê+•¾¸<èR)Â]ˆÖ‰š4Ÿ»ãÚtO³©½Ð"Ožû„]^˜Á¦7tˆãer‰½1$)è^‡Ù¿á%Ü`ï¶|ÁƪÜwDY†…éç½£«z{šA€µok|¿»º]ÂVý篆\^ÿôÎ}pÈñDâä5‘r›¦ë}ËâŽvØ‹£Ð ìwëÖØ1ŽÜÞváX}Û¯¼Ûûó´%õÞÜá3Ü%~à),ßw]ÂÏ›KlÇà<”‰Á|Ý'ÍfàùDt²ÃÝ\A@pÖÃ$ÄöŠiýº‹M©ÎûØ@œ¬ªÓ¶iúîÈÁóåùºèê„왋A„n•1sátg!r#ϲcz’°Ñ~7ˆ¢–œªÃ!Ÿzla¬·üó¾¢GÉM ĸ‘Êuý9¯I-¤6Hò@N(T&Õ¡–«•Ûõ½þ~ÞQÌöKgEn +ºBĉK&GÌB‚#Ã)8$âpéÉ\dÖ$—E¨€gkw˜ËÿDg%õQ;ðs7]aÎÔî +Hw $²àH`5&ÿ+jwÜ ’Eas`.ó¿¬v§SÎǵ;k©À±˜€dŽaÜ{¬Ì€ow›P4sT¿©¨ìCEdhÙó¥œé~~ÛIØ{m™ü3¥œ× ö%+ +cC=YÁó:˜Áí™ ^Ø×Ál  +±]õ”†ô²ê_Ò€þðvlÊxéf1p l‘ê„3`ÿ‚ä®Ç¯úùÄ$Ü|&†ÆŒØÛÌB¨Ü`M€àbß×øÃÕH2äÔÐ ¯Ë~’EÃx¹ï›-d/˜§†e…åÓ\ÔþöV:yrµk)t„ײ£'>ˆ3‚–"Ýá¹~©ËmµÂ—ýòzGýõz¸õ`í€jÌTÉLøjì)¶Oä^·ï§CôétÂñ!óÅn« :Q™8ÔFJøQÈ™6G†0PýŽÇܨúÂQ +þ å¾îèf +U ;¯jhªj [ßìü*JšŒé Ý9ዸÛìLƒÝm|ôÂx I}³›¥ïøØÕp$ AþFa#F˜ +ž$¢Gø‚gðêRqÿC{Üi?¡#‚a›‰ª:ôE§Ï13±” T" EÃ7š0Oκ„ |ŒÌàÚ>WÃ~Îj¦,JÄgȆ½yB~±h [¢–'6ÑÙ§³v€VÁ‡ØFžÊٹʬàñã­ø=U_ðCÅ8Î:áÔ›Ã04W"€< Nào¾{¶ÞsIk„¾1ǃ—ûä±( /¡¾ ¬^\ÙvT—V|àñõ­Ù˜µW6¯¹¢BÌí»ªÚÇ‘TÝCuGPÅHø¬¬²B ˆ>U‘¥Ð𧋭©ÃÒ¨ÅjßbÝ +ì@’GXe:a TMØTÛj¨I …âI9vµiVŸ¨"ñÉ=ûàÙ=:.Î…ÈcIülpø­Df/_*aG6ëÑûüS3üÌþ#jO}ƒ Ø lÁª~ßr•XY„Ž»—Ø3">¾£^ÝGN1›À-ÅïþSšŒifP”£°$Ö7áÀ6ñ“g[ÆK/Ô‰zÈôëƒõ—²­š},>ñ¶ß&"ê£ÍÂ~6--`ëåïr¢óq\$ŠgHîœÖÍÚç¦âLiÄ«ò¢cæH#3Æ!’jp‡Ÿma xŒÅøø$’ƒv8y @eqRƒÏšë¾BœT'€Þ³áCÁz>ï˺¼)È¿ Àiž)` íÓ¬p÷ú8´ž«þãl¨vÏØ€ÀñïWÿ]r>Äùž?ñAL@bj¹J®'ÁÛdVŠâ\j:Ô! 'ÏŽ 9à7ÿ£ËøýnÈOÎ|:…´*S0!¥ÂÇ>}lö l²¹cÕÿlfî endstream endobj 1388 0 obj << /Type /Page @@ -5609,7 +5607,7 @@ endobj 1392 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [289.8576 270.8769 338.5646 282.9365] +/Rect [289.8576 239.4581 338.5646 251.5177] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj @@ -5628,25 +5626,28 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1395 0 obj << -/Length 3800 -/Filter /FlateDecode ->> -stream -xÚ¥ZÝ“Û¶¿¿âÞª›±€ø1Ó錓ة;“ž/}IòÀ!kŠ”EêÎÊ_ß]ì")J—NÇsæXâc?~»XHÞ -ø'o3 •ëÛ4בÒÜ®¶7âv}?ÜHæYz¦åëÛ‡›oÞ«ô6ò$NnÖƒ±²Hd™¼}(]|÷÷·??¼»¿[ÆF,’èni±øöÃÇï©%§Çw?}|ÿá‡_îßÞ¥zñðá§Ô|ÿîý»ûw¿{w·”™‘ð}Ì#\øàý‡¾#ê‡û·?þøöþî÷‡ܼ{{îW -…ùróëïⶄmÿãFD*ÏÌí ¼ˆHæy|»½ÑFEF+å[ê›O7ÿ -zݧsòÓ&‹L¬“Û¥ÑQCÌ -YD€Ж©Ê£Lä'!ÇrNÈž …ÜU›%ü5U³YöÇîZšÖ.’ÛáØg+\3KPƒ%Èd—Æã%|ÚÙUµ>‚ðs½(è±ÛWÏEoéåþ{Òþ÷–šÜR‰jñiü~èlIÔË“mˆÚØÆî‹öHïŸ-ÏÆ;§—ýÌvÕºgÙ¹h­ON&N1ìb)e”»¥—v]êžì¦êñ›÷z(t­"-“Ä„ü‰1Ê×H.1ˆ#KsæŠhÂTEJh3Bo§®ïN&5NO³°_Az½Û2´öOEï)ϱ+öÅÖövOÛâH„˜ôÛÞ¶Ï4ˆYT uôXúñP÷³ÝwUËÏU‹¶¢ÔÂiž¤Ø5=º'òh/èñGÛ Ö•^ü&Œør¸“ »?2îÓOo‰X=ÍÆvÀ-y¢ýp¢>|¬뢪aÝ[ƒùk*a¿t8,B.j ê#Í׳NJñÖhö<_<õÁvDÓÚòŒD…-¼ Š`Ïð‚° ¤\<zjëIÓ1ße yf~<†ˆØ:%¨„ÇÝTÏŒEù¢«‹gæóºsC—ËñÖ¤·êªéôí¾##­«¾¯-Ñ#³À†–Æ3Î@ªý‰Ë6}… êdC‹S‰:YœJÀ»ëº}¡v·/×V–Ã}-=0½#ãö°å¶¦äÖâ«o=3½ k°j÷9U½­:-cÀóÁÔõŒ­uhz®ìË]/\³!£ÔñbS·°Ñã%9Ó˼@pÀ |9é^À(ª’H²3 ¼b‘·)i‚®?}àš™”œ@„‡4-/à“íQH"fáQ”à@}E‰¼¿ûþã'¢~ùþg"köÚYµãê]‹®Èqì­¸¥çØQ‡3ž>o×4à®X}o’‹ŽÞ9y±„qδ¦1²™£³]ªni1°]è02&Â-zµÈjAßÁ{{軪´ÄÆy4ïã©ñ¥Bx®éå‘gèØ›Þ6N^þçÐá~l‰aÁ¹Yê’/Ç|J´4Û✟»©3éÖŠé›P<´ºCQIû,:ÞàœÀ'—$R‚&G‰kŒ¹ºä íÌ*'¦”$QÒ9'ÁÌ*|4m³ÇáÓâ ²)„iÄæ°ÇéTæ S•LÎ#DÂø5D¤XèsDB&>Þ";¡ ’CDÂ/È`§G¤Ñ7ÚÇi5f>  `bÐlv ‘@Ô]u¡>@Ϧ´;ðX3çãëIö5J0Bâæ‚;O0L/Œp¦?c#Jˆ(‡ú³Q ‹3>j‘Í_Ua¢${RÏ@%2`<¡Úk»ûßRt¡j¢¢$VÙµéÏÙüã:T%lq°€O!åu¶ÌGB$hQDóÊzÃ'Oœ1¢³ç,$¥I<Øuí7·DÜ+žûê~¦cR„XõJ¶H"¥Ó•D¡ÂÓkò aÜñ± -ü¶@Éâæ2½x_‘Æq܆ž-7‘${éhçUÆ©4N^Ùi…üóq©Ç]µrT÷j¿RL']LK–¡\˜rí4åÚiê¤Ôm¨d‘†‚Ê4)ÀžŽò„åªÝî@Î#η›H£P[#Hfjñ±uµÞÔx NCù6ua -¸2 Þ!±µ3•U@F”PÓûL9‹L®ó1t{gŽSuI7àXy.ÒWT‚V€9ât -ë¶(±ht.:m"•õZ†.‹Årà4l»­XB]»µÜ¶ö›`©¬žìê3¯ƒ ßÉ´ÅŠYÍêä¯wv’ðVÉ…îDDiœŽíå VT ùHËî4#AeRf¯JP¡ÇŠ^ø øGßW‡ºàšÙ¹Xs©`8,Q¸Ý\¬“¦T>äíhž²¥]5mO ÅnG§TRÔñ…­ÊXây̻ľx™Ûªˆ”JçvêRrݶ¢ò|,ú­-\ÉPåÕÄÞ% !èh§£.- :KtþÚ"µf´Jt‹Çt7ù#O7D x}©ú'bà|F-ºbË”4‘µ}¶51_°ŸeX"[tbôØÉòÔ„BÄ4yòº›ii‚%´ N»9ì Šž8< 7”þ*.öAÔèí–Ò8íª›ÝµåÈ /tL\Hx&«ËÀNE20®R5e\1¤Â4V ^ø#ß]©®l ° ¼¯ÊÒÁ¬J¹ÚŸQU?J™a?îqõR×óXtTöÉ(h@SÕ¬êCÉu|tF?&à”ÿo”Ö¯®¡ -`R´½Š·1¯„%àt$t:©™\X±ŽD,ˆpqªU Þd¼Ë;‘ÌŽ“Ä!ðùƒˆ; LRÿsû3"Øß…lÂr£n¾Ëaê#ø´!’$Ê®dZräD`Ï& åš¿ÎX_¥:ó°óqðͼ~}óeUó9}2h`›„åo—ÆLgE®‚+Ï¥÷W°qWp!DÒaðfs\êY­ìÎ…»nO¥À|QR…`·#LŽ¢,+t§[ÄÍb/¤h'ì½ LÎËTr3õ€2´0®ˆ¼Ú«×Dõ‡†ÉåoN7îkº€Éý½§OIœ™¤™œRxN®“ãU^»Ù`MŸ« Ü:úåA¨Æ1.ŸJ1¹’B\¸à£ û$¬Èî©=¸\h€HÁùšžðê‰-Y.Ph®•å¬(=• ÿ¢ aS¢ ‡7t ›bÊL„Dºxæ¾øly¹Na}][?Û E'+é&rÂŒÖÔÄà+½›Š2r°%ƒg«•¥r>Tï’¤„D«Xcðí†r#EªWA_8»ŸqME~蜸:tòèofo}°žç¼R-ä´•»®ö×íØf;°#H° -m2r¤aûp þ°!ŽGî«Û>U–ÔáŽûÐ z‡`rp—zØçPbâÕ=a’ëG¿·)ª†sÛ‰©‚‰rÖQA°3Ÿ(±Ç¶‹Aù<‘`> +stream +xÚ¥Z_ã¶ßO±oõg…IýŠ—d/½´¹¤{›E’Ù¢½êÉ’Ï’wÏùôá iÉ–½ ŠÃž‡äg~%oü“·™‰„ÊõmšëÈin—›q»†¶ïn$óÌ=Ó|ÈõõãÍWïTz›Gy'·«ÁXY$²LÞ>–¿Ì¾ùûÛŸïîæ±³$º››D̾~ÿá[ªÉéç›?¼{ÿÝÏoïR={|ÿãª~¸wÿpÿá›û»¹ÌŒ„þ1p¡Ã»÷ÿ¼'껇·?üðöáî·ÇïoîÃZ†ë•BáB>ßüò›¸-aÙß߈H噹}‚ˆdžÇ·›mTd´R¾¦¾ùxó¯0à ÕuÒŸ6YdbÜΕŽ²ƘԲˆ„­ÍS“G‰ŠUÐr,§´ì¹PË]µžÃ_S5ô[ôûíN/3P`ž¥·ÃÎä\‚¨ 2—Qœåø¸µËju€-ˆÍ¬ Ÿþiw'³™ížÚº¤ªf¿YØÑí +õÌ‹M¼¾kÑõRÕ5×ÙݦNKÅ­ëÐ.m×ÁâGÞÍuº•‘R`ÀRF¹1±“µßoÈT^žlC« +ýüÞ6–ùªþiÔÔØ"¾ýðñ÷ÿ¹“RÎ"ªy|âN¥]ûº§Bå¶ä«wz¸¡qªÀ]T ÚG±¤ ž±®Ynb‰Î¬šM'•i”Jõš} ¸®Ø—ç:µ¯þ°µg–F s‘\— pMˆ0ZmΙÆcŽ¦•k·ð³ÝUÏd Pxø–Àÿ{KUNT¢Zü5³—÷-‰âÝjm»+z2(²<ÛÑ, @ºlÝoÙÁ~k­Ü~;K3:Ša#K{Ý´Š´LÞßÄe&¬ Σ,Kó¡€*U¤„6è·‘à¶Øö'“'ƒ_3³_@{½[2Ô²[9Êsl‹]±±½óJhØ"œÂ¤_ö¦}¦A̬j¨¡ ŸÕÞû.5?Û]WµÌÓ6Kë'´C.š= ÒõES¤YbÀ¼hî‰ûÈŒ¹nîC®Ëæ¸P}0ó]„>ÍûjcßÐÖmŠ/“ÕŽ»ßÎy}åé +T@Ï«K\kÚÈåJÇãE€Iv fp¸Y»ía/:*,Û¦'Ь©¢b¶ÎîžÑÀþÒ‘uÅ eñØ ö©x®Z´¥fn—á—6våÑž<ê úa Uzö«0âóþNÎìîÀ\`@~¸?¾%bùT4kÛ·ä‰vÉúÐYÍVEU;úßM·ó×TÂÌ~îp*BÎj êÍ׳NJñÒhö<Ÿ=õÞC@“lyFªÂ^ PE°g( ¬€(8ûžêzÚ‡Ó1ý2Ð<3/¡›¢C§„-áq×Õ3cQ>ëêâ™ùüÞ¹¡ËùxiÒ[uÕvúvב‘ÖUß×|PÌ+ZÏ8©vG.Ûô]& [œJÔÑâTÞ]×í Õ»u¹ºr ·µôë”áx¨ŒŒ<¬]]SrmñÅמ™Þ k°ª÷yºõ¶rè4Ï·SsÜgôh­CÕsÇ~Ï\µ!£Ôñl]· XèÁGJd^!8`PŽ{0Šª$’ì ¿±ÈÛ”4A×ïT…Bu<=7ƒ·ÔÅf;µ¬Þ‡"dÚ@œiËÅ4n Ðê´å6´ÅæâQ#Ž#vx&ÿ*Dl¹/øEÀ6¸3\ÅëÓe¸öLnßʦ›ïË-D(¿ŸG&:b™é«s¦óÉGq îpHG³´=ªGĬ Š\§¯(Ä€ò=ćDýüíOD,ö+TóÊÙ›€ GÑ]‹;W‘ãÐ[?pK¿cÎxìîÂip[,?ÉYGe[l8GB«YË¿Ñ´Ù"Õ±´X-4ᄃV-ò„jÞC?(·û¾«JKlq@õÑ*_*æš + ž¡Hoz×8yùß}‡ë±%ÎÁR³ùbi¶Â)tSgÒÉŠ›P<Ôí»}QIë,:w°A™Ü@&Rh&G!kŒ×@ɱٙIžXR’Dyäœ3wDáOÓ6óãr ‚–ãH¿ßem™‡ iº8ûøô†ˆÑı<ÄY%ÀDºŽ(¾¢µûõU,¨ü Cc,£“V^ãB/ #{Ý.?¹Úë ìÚ>M‚vÈ=c¾rh?îã„?cvÃOàÙÑ pÖ¼Wýñ¬*ø2G +„󤋘¤ÓÜ ~%ˆr]F¥ÀåŽ[ˆ/£RiÇæÕÙ×Äôc\’‘>™`IeŒÖ +LOLp :4¡L°„,´@ÔwÅÚRa`»£ûªH¢XHÍÖÛÀµ¡œ0q¥!½CÐýÝjݱŒÆ Â4DòÍS!‡„üŒ$Æ‘NSsÁ ðpw»®ÃÑ„f\BjˆKX¸äØ.a5ã’,uB× d;‚1J‘Ãx‚mÁ…±À.Œ$Mcƒ&ì›F€»#’CD²C$$® RœFY +Æ#&­ñtd (öˆH8zA?#D +¿¾Áá¯ïâ ²)„iÄæ°Çí©ÌaOU‘z„Hx~ )ú‘‰/¶ÈNè‚ä‘°glôˆ4ê£ý9­ÆÌÇáÌC šŒ¿.!h3EU2ôÛ”v ^2s$¾:‰»FFÙÜáÎ à #œéO؈"ÊÁ¡þè©…ij‘Í_U¼‘êx¯‚êë2¨.2c¼áæ×v^°¡3b„­‰Š’Xe×…\RŒsQY”ØÊ‘Càëìš/†HhD³|ŽÆ=Ä_º89;_0¢³çyL'¥IYÚÛ/ýT.ME9>ÓŽˆã$’ú${÷òT-1,Ò~á/í¶»“ V® ¦#ØÖ>ÜòE ü¹@ýââ2={WÑî㸠ý¶tE’l§£i„œ/TAx§Ò8ye¥iâÒãQ‰¢¶ÕÒ]Y]Ñ~ád¹2I”dÇ$&!rH ¦œMM9›š†Ì)5Jb¤!Årz0)€ŸŽâ‡ù²ÝlAÎ;Η›HO§¶FðÌÔìC벿ix*HCB7¥w¨à\ TxçÄÚjÌTV1QCMï#è,2¹ÎÇ&á;NÕ¥½Ës‘¾²5 h$Ž·±n‹ÓHçªÓ&R™Q¯E^ธ>÷ÿ†m7k¨k7–ëV~¬•å“]~b9ØðN[Ì¡Õ¼ý î½µ;Ô„· + JèHOD”Æ'KÔ3XYØÍW]v§ Š(“2{Uƒ +=V ö…ï†ïyômGår_œE;W+ :†SÁ•ÛM/•y;š§liUMÛSE±ÝÒíÕß u|a©2–xOó.±+^¦–*"¥Ò©•º‚\7…¥¨­U]±aÊ)šÈÚ>Ûš‹Î ìgf¤È…˜“·?²:±?&àöÿ9…@¨k„ß®áÀ¤h{/czæ€Ó‘Щ»Ö…+Ö‘Hƒ.žîªo2ÞåJ&ÇIâpðù Š»#œ\ Îíψ`¢ôbÛ Æ¿¥¹.GéË9C]á#ÁÜoøç½Ýc“í§RÆ \`Á¯‹¸&äGA1'Ü#A}‚^$ü#ŒOª& ãª¯\NP„+/Öc¬Îoü6%|ZûøC>A rÇδâl(]áö»Ž.q.º˜·hl»ga½Q3?˜å0õˆ5tmˆ$†t,™–9سICç¯Ö—F©Î<ì|F|ódß|^Ö|?4°MB€ò·Kc¦ƒ;$g‘ Á•ùRƒ-X¸KÄ"i8að­s\,—v뎻j)Â|VRæ`»å/;SʲB'q{k‚Z£Iì…툽WΓ„{4¬‚3õ€2$gÊ >öÕ+¢ú}ÃBrZÜ„ÛëMO2¹ õ!©€[“4c òsrþ÷Úõsýœe˜ú%dé§U¥8y’B\xò£'ü$È d÷Ôî]¬4 +@¤àþ@UOøˆÄ†,(4×Êò§K +OeÂß$lê@ôã Ȧ8e&B¢ +MQ,bmåó@j€ñdMšO£åàÖMôîØ7¬l~„— á~uE÷TÖPæ ~¦ÙÏÔàL4ôFïþÿ€N3ÐÇ€9€uvò(6pW1¦Á²þŒz%„œ ªAþêX +At¬cþJDÇ©Ó1V t¬ÓØ›^œ uŒE?@ÓRÿýÖ) +«íõƒ$gŸ¨ÑkµÙ¶.Ïì˜S‘±”?×;y•Ùù`Æ/z*€ð6Ë_ÿ¬1Åd¥|å«Æ#Ó•™‰°¬¯V‡yiëâpþ>‡[—««S¦ó¹G{©M”Çømä`r:SG7=~3‚Ž’ñ%<ÅxBúÒ]Ñ2L¹ô/Ö†¦†/H0ߢdN £:~Ð먅ÎQ¨.èaÛeÒò¡@>@€BÈ+ÀR}’ÄÛ…pÀ Óp8‡†ðѥϯa<üfzB«"|ëúš}ün]Ã…?b›Î…‹$ÊbÌB“Pî ̷̳Áp9‹Ó Ñÿª£eendstream endobj 1394 0 obj << /Type /Page @@ -5659,7 +5660,7 @@ endobj 1397 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [353.2799 401.8743 410.176 413.9339] +/Rect [353.2799 390.6622 410.176 402.7219] /Subtype /Link /A << /S /GoTo /D (zonefile_format) >> >> endobj @@ -9621,7 +9622,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅå‘æ‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ -Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.#5##m¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 +Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.Mu=¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 @@ -9644,7 +9645,7 @@ $O t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•Ã¸©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6붡²BSHQøר.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôŽ±§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ -*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿõ½endstream +*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿò¸õ¼endstream endobj 1645 0 obj << /Type /Font @@ -9653,14 +9654,14 @@ endobj /FirstChar 67 /LastChar 85 /Widths 2144 0 R -/BaseFont /WEKWWP+URWPalladioL-Bold-Slant_167 +/BaseFont /NYULSI+URWPalladioL-Bold-Slant_167 /FontDescriptor 1643 0 R >> endobj 1643 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /WEKWWP+URWPalladioL-Bold-Slant_167 +/FontName /NYULSI+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 @@ -9684,7 +9685,7 @@ x Òy¦§aáèha …«pJí•Ž HÀÈ(ã ±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 -³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`ͧòRò†ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`=9)Ù§ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK ïeë[ă»4fÖ)Æ»'c£»¶*2‡Ìu•ÙÖ£™øM×E;k"±{åè!6ÙÏgø¹a1ù‰¢§.Ô¶3àéÉS®Þ?pUì!¸?Ñ='g€$NúüVž;»;l"=+±¹ájy4&ôøë´}‚ÄÊ¡æ °Q™Ä´îÃf¤'²š‹8­‚{@|[÷n½.\ex~ûjÂâSÿ ¾jrþ¶áåkï}6KiÕI†ú€±s=Z9;ªîÕÒ/7ö[;_NÉö[BÔrw–mF¨¹]žÒ[¯éÇhy;Iþô|“Pâ±_®Ô(\{Er¿—¤ÿ}á÷,˜4½‘JÿШw‡5Z!tÒ¦(¤Œ2x<κ¶grú>0.;¼½2qøÀaZ.Ë©EL_GHx5tÕ;’T1•\,ék?‹n·‡âø£ÚÌßÒ¸nòTÀÛö• atÜÌ‹•±Õ]ç°ÊÁ†Ó%¿2þÝ{ÕÄÙ )•åŸ‰>§«#lð6šo;Þ^Ùû¡LÿUjIpÈ(F²Ó®èê~ï}=z8Ö>ß’»0?u>Ægòv[?Îú 3MØĺ??Â6ó–¸GK让Ƭ—–Q„tÈ¡f´µ 8™ûÌ⟠é?;©ª•Ò {=ÕtvWŸuéR^.„«È‹zY½Ît+@½^V×^Ml¬oJfE([œ]£–å›'â#å|'OF˜îˆŠÖ¡3ûÀ~.IZÀH)L›‡jªrÌg¬±Þ=•u«Œ†t®q©,xÚ3À-ØËpõL܉'òA€ªC0[&µ{C iÇŠ¤y)>û›çeLcÑ%/³FTU§€ÙÕô¨5« ð ½’•sJÜkŒ "êC 3ó®cUÉÙ4eHÎH~0+¾÷ìEÑOÁY^€ÝˆF›ÍŽTU§h§D´çéíçǽ8IÉ{éBDWžñ»ïÝR±FêÏVë®fûÆʦîíqßÇ´L…ŒJ®GЧzTÅ‚ë—âƒáJM î;£2þñN÷6…OŒHâÑ ìÞv­øózy¥Ïgg)Õ‚«?Y¾„ѼN-áf_6ÄG¦ ‘”Ï w÷‰·8I•w…p¤Y%K:¡–-@2GrMú 4¨oêÞPÀ-Ýë*õk¥sj€#}–ÕǪq.‰ã!Åp£Y2Õ tÌ( ]¡ÀC»ëƒ;hbЀ16gRtVwšÇ>oõ;#m½YÐá³0zuœÎkê @@ -9706,7 +9707,7 @@ V1-S ÐíC¡Ówï»ëÉ“º¿Zèp½÷äOô>/¨lÝ4nlŽ°U-oMôÙ“ˆ o:œ©Í|y„7MT{õ ¯=i3RÇVHA9jQ¾rÁ3ãaÂ3œ´X_¿ÆdhÚ—E/Oö\ìKɬÝOõš_·— &†÷ê$ÀuæbsAƒytN.`.šâb™Ê¥܆€ð6é瘯l¾}êÈg|ëwRŠžhXŠs×L84ØGê} 1Y³mgzÑìÅÓŒ$»9ñNh‹Í”ŸâÕ÷ºXsm{Ôg"'H±¨ª®RU\O¹<Š>ÊlSñ" ‰ôt.CB±|…—(z?п)|Æö…›‡8csa4«ªy=~U»+jð*Ì8Ó“«&ÐÐåÇw?´,IpöÛ7oå¡#½Ëõqw¾}eüJü¢šïUølœ]Rçm‘LغÂ=Îk¡·ÐóKJ;œuY8:B.²åžðŒC\„0&õê®X¨ÕåsÊ;2•©`‡¬#¿Ê"ÿÿátökä÷g\âiì.¯(å»T·RÞç-ɳ/%º‘|™÷ó§qWru?̦hΑê¼7ôòÀ…U^ÎK:%į v›AŸ7pè1ÌÇÛtOn4 ¹Ø+`‹ï—Rp 36‚FŊݹÎ%:b‰»•¯·0Î&SwjÒ V‹­C%#N^©Û™KuÓÏy,ÅEŸq&¨ãò8¿ªÊ{D LGÌ8½UTmÚ5leUÍ?6¹6ÞÒ6!-+ÁöŽ·¶¯T(wu9eQ–éáö:Jmš»4 û_}ö~N†ŒÁOkôÚ‹Ö»µ§½Mìð}íîɲư™qÀ“ë`Á+–»5ãéö×­d[%˦×÷[M–ŠÁÃ#ߦT\Ú*wqªÝ¯¢Øg”‰˜÷Õžà$²dß]Í|®yó9¾è?)ì#IiwñùŠ€%z :õÔÝ3°ˆKzW†Fc¾òm={‚ú³8uL‚ÂôwÌY«|í»U&›±”n{ÀeóbL=Xûy*áwSYø"FžN†j×'›<ºÚyÍ7Ì4`u¹§h‚Žï›Ô'¥o¡í×ðê•Ã=)2—½«ÓõYæ©9rd…Y¾qÏà`ÞrR‚›FWM†Ð¬Œz¬ì^ãë[‹=Cù¹‘©nßíÈQ”iÇ5ÒoÔôÈ[A}s…mºŠf?´?“½Ë’: Ÿ’òÏ -M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿñyœendstream +M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿÕyˆendstream endobj 1627 0 obj << /Type /Font @@ -9715,14 +9716,14 @@ endobj /FirstChar 66 /LastChar 78 /Widths 2145 0 R -/BaseFont /QKFAFZ+URWPalladioL-BoldItal +/BaseFont /WCEADK+URWPalladioL-BoldItal /FontDescriptor 1625 0 R >> endobj 1625 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 -/FontName /QKFAFZ+URWPalladioL-BoldItal +/FontName /WCEADK+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 @@ -9742,20 +9743,15 @@ endobj /Filter /FlateDecode >> stream -xÚíRkTבª¡¬òRIÕzX)I&BBÃS32%™¡ÃIˆø ’ª,‹XtÉST” -«Š@} Ô«Ð¾H«%,k‘ªUðÕëê*ýyﯻî9ÎþöwöþÎw6Ã)\ê.„ñ H Ž‘î‰D ±uf³i †?ÈHÇd$"ŸïB2T€³°yî -—GcëœÌψqóÜï›éâ6ìÚÁ¦[^ýÌà'S~q—ú÷Y­Ò·«ðÈn“€Xþõ<‡G>s6rh÷ãê½JÖ¹}ÝlØ Ò˜ñã.b T=üíb«~?')Ð?¾/ùLäM·Kuç«ìë -f&š«—4ÏÆ{ýæ;ùØ/ôšk#L0EåNã…MÑ}åÙl;îÄø¢c=/¼†~,‰24öX”k9´yAêNæýÈå:Ïß-Î…Ö%k»<ëN¾Ÿ·l/™í±7õXmhí6µöΞ£ü†‡EEöÙ'ÂæïåD¨w Ýøt¹k;cýåºG¤MQøóªd&ç{¦µ #0Óñq]&çÌšõ\¯„”W=>‡×¬ÑíÚøàÑÍ•‹¶¯§ ¬zùô4ѧ%¹¯·ŒöeXÙŠš;âØÝ£¥·¿ïGùƒ›Ï´ÍpöŽýj©O+½þü/c«"Ü9¶ŠH[çVh>0Á€[ªÔu ØÁtÉO–âbt4Hì¿?qÄ -iúm$ãÐËÕ%Ѭ\S望Näê±*&]*>¥Zn6ãö̱Ç%Ž¦§Ä¦Wƒy;aß[•áëF+'¼ïtOdäÙ_)ìüùô -‰Bò:^º'y¾"K«éš—ÕÜ]¶À¦Bãïî²åôÝçœ/Né›6™Í#ÂÄáð7æÊŽm×ì¯G[«¡Í1| çÙ‘ØÎ|‹ws -CèôO0ýÒú1;úà2Sÿ‘³¢Þ/0Üq‰v,•¼2‹®ê0/O8ÄØ5É›ô»/T[­ò'Ê"óåí·’6‡ Kêï²ÚTfwÏ-h™µpǦŸ-Ë”V~¹Îç/?3úl ·ßwη΋‹”$œ”sb¨HTs 宨78û™ïwïÁïXŒ.ys¦´°à¹IÙwÚ³¢X<|¹Kx³m7£®[Õ\SV°[2·Öný;A6‡:. ®Úxïê(îà~Ò>N_F¾xr¹Ã×Úä"( Gÿ0¨uuŒnŬÃúšìÚ}™yyÂ2¿îë;G”I×Êó~Æ¢¤ô‰öê}s ¨<–Oû,b1ßbÖ½®Ä}úMr op켨5ñjïç£;x/Œ‰,×Ä"w¹ª‡;ϸáIVø¡üjzÝû?\´ÿøŸ( W!2‚ÄÕ2"•ö'?$Œ¬endstream +xÚíRkTSW‘ª¡¬òRIÕzX%2yj   b,žò˜{CnIH@Ä•TeYÄF—ì?ØS1ç˜4 Gt ‘Íd³9$‘ÜïNÉÓš‰Q!hàò|€Çåz +9DdÄ@PÖXG*f1QŒ ¯Ò™\ ÄpÊä¿ú°K gfN¢o.`¥MÎéÞ$öקa:c0¸<²{¥/àóع"*´8£ÄÔø½‹•é) ë`ÅrSømýtßéíµyâê®cöôÌ…¦#[;Îo;eòc÷ù¹\Ç›~Š†?úÍy›ó§Èq§Ò‘ˆoX’×O=-Ê1d¬m½ÎfG7zå~Ù¬‡Šá¤”—ËÛÛ>ÐÜqϲؚÑäýðgÏgw³ÎÛׯ¹ÏáWQGŠfÖÞºùêI^ú¦Î~‹Ã×çP)%¹üÌš½pì?ï_x†Uc–šËó“ö?s}m¡¶ÝéI¿íhË¥v7Lþ/ç°é:å@'…s }±%¾L°Z&œ½Ðçzl… Ø|èïaŠhiŽþ:{°›.ô0½ß#)È- “ÄŒ.8V風] ö«¡Ú më[5èÅBkCTKzC׿„“Ñ´—¶.uüí·%;g>M~ñ¢ïù#µõ¡Âàaã~bFœ·ïÀ,/ïaz›jí ³G‚\õÕ=BÞç°ÊØ®ù{à@N˘Ä nä»Ý<ú…§…K¹/×ì«ø›t½÷·Íæ=Ib áúñ@Õ£]j5঄'ö¥ž¾å}¹®ñBuˆk]áÌdsshhõ’æÙXï`Ð|×…~sDIÖh Úe¹Ø£+~ :—ã›_t\ès°ç¥ßÐO¥1榑#>‹ò쇶,HßÅ|½Üàû«ÝùˆºT}—oÝIóó–탢sQûÒ×FÔn×è æì=&hxı«È9÷TÔüƒ²/õ^›ž-§·Ó6\©{L8G¾¨Jeâ g[ÛPµž7dqÏ~²ç—”öº'àȺC5†Ý›>¾µrÑŽ ¡Ã@ï €š!þ¼4ïÍÖÑÞ0­ƒ³¸¹#Ñ‚Þ;fºóc?"Ürî³ÖÓ?þ›¥­Ôú ÿ[Åà:+£ lu‚w‘íÀ j©ÒÔ¹Ñ 7ëå yš—ÅÝ,uý^òÔ5·d·‡´Ã¯NV—Ʋò¬½«Nùxkƪ„¨l©ä´z¹ÍŒ;3Çž”º[Ÿá›^ ç7Vì‚oWF®­œð¿Û=¡Íw½2RÔùË™R¥ôM¢loê|e¶^×5/»¹»lS….˜áµõÌ'†/¹_66m¶™‡¯•DBßÙª:¶_w½ë¨ál‰è¸ÏÆwؽŸ[´šJý 5.­Óí¯/³öÝy);æÃBó]¯X÷2qékÛ„Øú¡Ûò¤Ã\¡K“¢©Á¸çbU‰ãDZê`¼,º@Ñ~;eËêai}ã‰Ý;8‡T9%Ýs [f-ܹùg·Ç˲d•_¯8Ï/ÈŠ=Êëœó½çâb¥äž*×L»'î ÏyøÃÐ{ö!£KžÄ5¾°ªúÎøV”H†¯t‰nµí¡Õu«›kÊ +÷HçÖºlx/ÌépÇá5'ÿÝ%¼ÏÚǩˈ—¯O-wûVŸZÌ é1> +k]“ ¡GZ±ǵ}M.íÌü|QYP÷]#ª”ÆÎëåù¿ 1²FêD{õþ9œ˜|V@û,|±ÀnÖý®&|þ]j p삸5ùZï—£Q;ù/-É,zr1CN¬êáͳl|šy¸ šZ7Àþåÿþ' +(Ô°'0O§üQsŒendstream endobj 1400 0 obj << /Type /Font @@ -9764,14 +9760,14 @@ endobj /FirstChar 60 /LastChar 62 /Widths 2147 0 R -/BaseFont /JUNOQO+CMMI10 +/BaseFont /QAQSBE+CMMI10 /FontDescriptor 1398 0 R >> endobj 1398 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /JUNOQO+CMMI10 +/FontName /QAQSBE+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 @@ -9791,22 +9787,19 @@ endobj /Length1 1199 /Length2 2269 /Length3 544 -/Length 3058 +/Length 3057 /Filter /FlateDecode >> stream -xÚíWi<”k2e$²ÄC–f±›ÊnÐ £±S3ÏŒaÌ0‹%kDq²•¥D²äØ+E‹%ÑbJ¡¡T”Š6Êz:Õ{zûö~{ïó|xîûú_×ÿº®ÿ}Ýu#|Ù‹ 5¡ -`.å¦bÍ0ýðë5Ú¤P…uIå·Æ¿ð5]‰vŽT£ì¡³ûa)¢dÕ[õ玶uæï™–kÙ÷YDr eÒ ]+Zí+â6›èÞžôú¾Ïøg…LM¯ÖÊɈ3“^« ³»t¥lY· ¢_[è•‹j!µö‡“‹¯¶+ãEŒ­äžEO–¸›ðßíXq ezKˆ:ÐÂj köñ{½+á½Ùñ^›?ŒpÕn©y‡NO9ì<ˆwªhÍz¾wæaHÆË~A»_d¦öÔÄ>ßë¯xì¡î|÷°ÂKÍ]ÊÑ6gϬ—ÕÛòÙÏÓÀó¥ùùÜ2‹§h¹«Ý/pS7 -n®’?‡«¹½A¨¬<áP2gÑä3ÂQo”áüID>ß#¡ØTÍi#.õÉÒôûErwV¶ÙÎy7‰” ÜÜ;ñ”{Ön;[eø)Àû™kv”ëÜÙA9à:ì82 ©¨÷^^:§Y×L&\g]÷bOàêbUù‰Åƒ ›ýÔSÓûC,îñ¥3‡0zã ×†AU­UõXœË‹‹ÇVe ¾ù•à½nÅ:óëUá´"“7ã-‰:VwïÉß5\‘áñ%s{ºú”~¼]&8Á<™Š£û£oyg$%æì‚ׇüŽÄ[í¾{ëU3b3B¼7UixQÅó€?æ©«#ü /Ÿ²©l+~\ç/£œüõq²ÁÔxŒøT³Õ§»–åáƒÝ—ÖåÊ d:äÙ-ª»«ÃýBS-D£~Ûná®Êœ.åØ«uÉ®*>oXŠ(»èÿÄë²ðÌò}ébºyfql—¯x‰¶§/%J>±®ˆ!i¼=×+ ¾ÿàjÀ欔ñlt_àN‰È'µK³| µ©>/Ú˜„+‡ã®WHl•;º…§üÒ®]œµ² F3ëê<{/1Æ—h£»gÌÕÜìZ‡C¯èö‹í#º}᎙hµb³QÏac@\Q˜4ÂS_ëg`j×Æ_Ñ4;‹š©j’nqÜÃæ#ô»‘aíÀ»7T÷ͯ9‡Ÿ¼\(uÊÜèÑîÁ10/WÜÜG`kʃ ³™¶ÔÀ7*>W´×`*=z ÙÆ4á {¬ÞUÎ?ŒnmHW"‡}þcüdÓ‹O ‡œæ°9Ì›y{<瘩oÍATÛsôŠ­W__¶n Zs{ hµù¨ç­è ÁJxFžKç§Î®KëûÞòµÝ;ªœï 5%§{ÌØŸTçÓO™Y$v'€ãÅVykÞ^x[Œ$n*^ÑÊJ4½.þüÑv4½ éJÑ®ÿíÀØ Å¿5·Î¡U2Ó1ƒJTßÐzXp`Ƭg°Ù”‚‹._çÑ3ÅKE~*.–•ÜÚwìºXV îP»`¡®‰·÷¾²UM„d·eצQ5¥´JÛ#4åp›Õ™;4j¶•cUš"Š#¯#šV!òy{3xv÷óãOZOh+5…ȸL)¸~Õ¯Ð=žy4K9²ÙFþ‘¹^fWÙñ¦1i•×éÏN|A9{Íù:‹–‰òÝŽÁ½Ä<âóØðª›Fb¦Šq©æÎñdqÁM…ìNáÍpñö,y2ÙE>õ÷w¯‹¬ÅÚd»ûìš/¾ د›_ÓsïòÆ qÓ8щj—"â;¿ÉnöÌ@jQ‰Œ@‚M–– +º.7;Ú1ßùLR÷ -—Š@ë±MïKât -Ì -Ùï JX)2·Ä‡‹ŽŒ¨à©®gÔ‚Š¥fëÖÇluÕ¼±†º>k"–cž4}`(˜ìR&è“2u¿éø‚ ‡kígÄiõ‡H!¾Á3²S­l±Ì¬wõÆ4í¿ØOžäv&ð¶Nà’…Õ(<~`ÜØçCí×h,5[ ¯â®Ù˜Y!Ü€¿9¨’.Ô_Ü%‹þ/øÿ þ'HtÈâ0ƒ‰¬ x dC?”Kÿfðªö@·endstream +xÚíWiî'Ì5"1@6>”/È ü”Ô†AfR  rà%±(ß Ë0™ËbÁ:}9)8öÛž +Á%‚`HFö3É›÷Öím\8m!®ýüŽn›ÛÜg®¢2Î7Šæou’ :)§WEöúì'üÚ·kPÝÓØ6Ù¬2yE/­"oØ¿QªšóR5µº-NLfJÆoXð~1êŒS¨*­tï×0–ZL˜r¶§Ç¹à÷xÍÖØÀ„}yB[¯\¸ûA}«·Ð…Wó5Mâ~}ý×,…õãï%Û!9uoýå¼Nâ›o_ÑY ¨l .žæ…”êoÕÝ2¬ÕuÖ•ö&¡ÙRóÈúÓܯd=÷T)·–ÅV–MµT<,¾}^C÷\MáþR˾añÁ¦Iø@>P]á)ãЖ¼`k­¿ÅbÑ2­CÌ;uÂ÷„ÌQ…÷yEˆPó@¥ÂNÛöŒvö%÷8»‹DÊÒ”ì~³kZ=O&=78®U¼âE\?¡ àêsÓq¦¸>äjMr¨Üº¤òŽ±Ïƒê®$;GšAöÐÙ}ˆaŠrGݹ#-íùQ32M{? Iô§Lzak„«|…ÜæÝ[“^ß÷Ù‚ü$—Éç±éÕZƒƒ9ñ¦RÃkµvõWË&еb˜!ÝšB¯\L¹¹/Œ”\|­U‘ dh)óão¯Ëû¸½(Q§[¨~"%Ù—v/º p}'²Üô^F„ñ»\?~·‘·z¡<-E)i—ŠYþ³À®]£—vWO ¢m¢v!œ ÆÈUó‚g~Ê~|Éê:žôÚ –żè1œ5ºÝ 6¹ÞʱuÙiž#Z÷f”yÑœ’]^†«gIgRwU©6ßôaØ–Ÿ«œlL +wò² 6óx†l‘}&ï¿GmÛ‹KW2.øf_.䙃’—»yù¹uï°³ÒLÉ=Ò}wG5’ûÃSâwg’±ïh/Ü“V¤¸ñ{]×Àé7(u?®Õˆé±BÅ…6–VÄöìqóÿà*’°€=É­ûðèn^/+3}ýELº]NªbM7¢º¸€4N[YÊɼ}íc­[f¼ªTòÓK%¬ï+;ÿ^òsžÎ›‹ ù.æIIˆUÛÚY±/¦÷ +ûôòH/âÂ+oéLˆËÇO¤Š›9麗òo*d· nFŠ¶–Èá)“É.²©¿¿}]dÅ/Ò"Ý•Øk×xyœh¿naM÷½+ƒŽ÷ÇÏØ +OT¹‘ÞúMv±gûS‹J¤ø¬³4ŒX1µ¹Ù1ŽùÎg’új½W¸TZnzW¯]hnÆË~«WÂJ‘ê.68<¢R@ ¹žQ *^?W+kâª~'b M,k"ÃÊ1KšÙ?Lq)ã÷I™¾ßpl‘_Àõæê´êC´€Ï ÞsŠSt±ÔœwÕÆ4Í¿ØOžä¶"òL&l“†U+<|`x¡×‡Ö§v¡DØt-²’»fcf…ày­¥t¾âNiìù ÿOð?A@¦ƒ$‡Lb!£Y þ¡\þ7Cþ ‹Ú@Èendstream endobj 1140 0 obj << /Type /Font @@ -9815,14 +9808,14 @@ endobj /FirstChar 97 /LastChar 110 /Widths 2148 0 R -/BaseFont /XZFMMH+NimbusSanL-ReguItal +/BaseFont /MQZMVP+NimbusSanL-ReguItal /FontDescriptor 1138 0 R >> endobj 1138 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /XZFMMH+NimbusSanL-ReguItal +/FontName /MQZMVP+NimbusSanL-ReguItal /ItalicAngle -12 /StemV 88 /XHeight 523 @@ -9845,7 +9838,7 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP£¡O†P@jÅÄÄXòGw$ÌÆ àÐ×1ääææù—åwÀÒýžÛ(˜€íöà G8ÚCзÿãºP(m XÃàP€¼¦–1HCÀ¡¬¡P†:@‘`8@ËÙ³¨Á¬ (('ÀÀÿZ¬ØïÒP|·X²(€r„ZÁn·Aݬ Ž¿]<G(Ò†BÝ~`(€ 쀾í€9XÁ!¿ ÜÚ­9"·ö·¾[0- ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿²‚²‰¡÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† +JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿¡¬ª®¾÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† uƒZ|™BX‰¼LLIB—Qdt ( Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke ¸éÛR§ö ]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8 @@ -9877,7 +9870,7 @@ QH; ‡á{__bçâ.°ßþºæó}<¯½kb¶Þý9\¥™àpDË\TL[\a·¿«NüÆW¨œµ>¿¥t®tÉQÀRD‚!$Dr£G¢1¸AÌý¾ ¥Y í–.ç#_©ØÉ#¬w¥Å¹ò«|Sþ?Z:è:”—fÆ×’¸ʵhúÏÈ×XaÛfÚœ¯Ú3™B¶“—£Ìü¤‡uቇôä·ÏÔϾʉltãp)’&ÿT+p•°e –íZ­M31I¡ÒÏL«êÈcýªG’«ô"Hx¾çS•ö$Û_Œ*[£n~OYgÚC¢ã® ø LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a*¦Ûåõú/5 JÔ†½ó'lï 0Kf›/Ð^‰ˆÖ½žO¼¡M [If§€ãC `æÔbï1}ÚU*÷i g#™HÓÄ+¸"î2X|F#êLq¶ÀØÙªþr#g <¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ  -†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚü©ù)óendstream +†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüV4)éendstream endobj 1068 0 obj << /Type /Font @@ -9886,14 +9879,14 @@ endobj /FirstChar 36 /LastChar 121 /Widths 2149 0 R -/BaseFont /GDGZWT+NimbusSanL-Bold +/BaseFont /WAKSUB+NimbusSanL-Bold /FontDescriptor 1066 0 R >> endobj 1066 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /GDGZWT+NimbusSanL-Bold +/FontName /WAKSUB+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 @@ -9916,7 +9909,7 @@ stream xÚízUX\[ÖmàÜ¡pww—à.…+ pªp‚— Á58„àN°àîî—‚ËåœþO÷íÓ}ŸîÛýîÞ{­1æsαæþê¥h)ÕµX%-ÌArNŽ®¬œlBU°ƒ¹TËÌQ™UdíxyÍPhiµÁ®ö ÿ _iÈÌìä(cæúÂkÛ¸TÌ .'‡‡€/çËšƒû¯@'ˆ@vpò¨ƒ\A{°ã %ãdáærtÕrsv¶ƒ,5AP'7ˆ*°z©ì?³¤œ½ `kWƒŽ¦#33Ë¿NAAA€¹×_ @[;è^î {'ç?2½HȃA—¢-ÿˆU·2“µ»þÑ.€ÁÆÕÕYˆÝÙÊ ô‚±A­ØA®ìŒ/…Ê:ZJ;9ü!EùÃ30dñÒ”ûß}³stòpôùØ ìhùgK–nÎì:Ž`7Ð[™ÿ ~Pþ…Yƒ\¼\‚\ äiaÃþGJm/gП$ç°™£¥¯³“3ÀÊÌ ò[^(>P3wÀâòõù߉ß¡pr,Á®sõË1üKýYýc¯bæ -{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@v- ¬ª¬"óß{ÿg”””Ó‹$+'?€•K€÷eR^y¹ÿ®øO/þòáOTÝ ü?urüKò­£•@ðí¼øøWKî ôe6 Ž1#àßõU\Á ÿFLjƒ—ãej^œÿu¤þÿ¯ƒõ÷rnööºÂð;/~@Ê€?±7ƒüG¸™ØÞ뿼ð÷@=Ð?¦ÿÿ óÖÕÌl!éhmÿO›ÀP9°'ÈRìjaóqùËeË?¿CºüÇ— `åäåü§m¶°sA¡/gñ'r´ü[JYG 'K°£5@Ëõe*Í –ÿþ -Ü {þ< —wÿÚ[_ +{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@vE% šš>óß{ÿg”””Ó‹$+'?€•K€÷eR^y¹ÿ®øO/þòáOTÝ ü?urüKò­£•@ðí¼øøWKî ôe6 Ž1#àßõU\Á ÿFLjƒ—ãej^œÿu¤þÿ¯ƒõ÷rnööºÂð;/~@Ê€?±7ƒüG¸™ØÞ뿼ð÷@=Ð?¦ÿÿ óÖÕÌl!éhmÿO›ÀP9°'ÈRìjaóqùËeË?¿CºüÇ— `åäåü§m¶°sA¡/gñ'r´ü[JYG 'K°£5@Ëõe*Í –ÿþ -Ü {þ< —wÿÚ[_ js4_}РEÜ‘*áq Å‰ÚiP¯|-²š§SÊG‹“¸`îK/¡K¶yÓ¡Ú~x°¦î¦Gp;·ï¤>«kñ#t-Š™;Ù¾÷wæ¹SxE”Ù c\‚ßh}U;Q ) 5›wðhى嬭¦“qƒÑÔõηé™õ¥g2qÄ¢G¿žÄihq­˜?Ŭةæó;‰À_ð_Ïáìà,ŸŽG(ÝFµ7Vç«w°»ã‡6"­’—‘¥c,MD%Ñ\Kˆ©Åq:?ÍuKÞ·$I{½ŽˆÊ¬¿=P±T&U‰0îvi|åJ#¸ŽEÂûCìKwã¾J o¤›ur¤'SÇÓN~8nØcqWòñjºøiY›¯#WÓ“!×Óß믬‡f•å}‡†XnÂcÀw²ñö|Öq\ƒnZ“E‘x!?ž‡¤‘PÂEl$Õ­.LÉ[—ά&ødcËL ‰ÉÁ.-îÀÊ-§3§ÝáET‰kõ*ºk·Èh¡¿=¯ìRñП`É‘.~Ë¥î1úA;ë7í©”q¨ï›ˆ±÷[G…¯L»f4‚Ö0›ŒaÆ6 ò9®6ÈÚ˜ëmRsA8«ÁŸ¨x›4Ax–¼¥êDÁ Yï@šð“Bi8«R}WJå,|kò»]—ý%¸0riZü¶»Þn G„­‘¾t Aý ’§,Xéa¯+ЊÅAHú…™¦T+ï&°À·Y=LˆL-0ÓÍ¢Ÿäû1ÒÕ®25c{wc |XîÛ¦J!{Ý$ ¼ 6Ô©q˜ Ô†ýO#ª«¤Aö³‘,§ïlx¿•G.†  'ÔÖÓøò´ *´PÃ(þb ûÕ°_œ~ÐRlÔùYœ?ÆX‰³Xá¡Bö—߀z'öÇøøðo’?²kCÊéÈÚP¢b’F Ì’2î“[Q…Î÷å]òÞqÖ‘(™gТFt -䦶°¬"oucZ^£¯»¥ï}¦ñ¸¸Ãÿ²§ñü³µÿ$4W—ötëœ}¹Åêèb„”ÖÇZË0%/î É`ó#“)±{¿ñÃ3Çî·}Žô„Ûá  +‰(&c¾! Sb4ôékå͵þ˜aåØò;ú€ £€ÿuÁÐh^314ÎjT+Ò2é·O­7<¦iz’2 ðÎ"ÃÌ™. ¤@q'¤esú–¼ÔÅxzäY~&¯÷óG5Á]5Et„Ç2·¬Ý€UŽÿË åÿ ü?!`a2ƒ¸:9˜AìP| ¨«äÿ§¡ü/œ_Îvendstream +䦶°¬"oucZ^£¯»¥ï}¦ñ¸¸Ãÿ²§ñü³µÿ$4W—ötëœ}¹Åêèb„”ÖÇZË0%/î É`ó#“)±{¿ñÃ3Çî·}Žô„Ûá  +‰(&c¾! Sb4ôékå͵þ˜aåØò;ú€ £€ÿuÁÐh^314ÎjT+Ò2é·O­7<¦iz’2 ðÎ"ÃÌ™. ¤@q'¤esú–¼ÔÅxzäY~&¯÷óG5Á]5Et„Ç2·¬Ý€UŽÿË åÿ ü?!`a2ƒ¸:9˜AìP| ¨«äÿ§¡ü/åØÎŒendstream endobj 1065 0 obj << /Type /Font @@ -9954,14 +9947,14 @@ endobj /FirstChar 2 /LastChar 151 /Widths 2150 0 R -/BaseFont /SZENEJ+NimbusSanL-Regu +/BaseFont /JKZOOX+NimbusSanL-Regu /FontDescriptor 1063 0 R >> endobj 1063 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /SZENEJ+NimbusSanL-Regu +/FontName /JKZOOX+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 @@ -9981,42 +9974,33 @@ endobj /Filter /FlateDecode >> stream -xÚíwePœë–.îîNCpwM‚»Üh ±†¦qw'H°à’àA îî48A“Cö¾gÎÔ¹ókæüºu»ª»¾w=k=KßõU3Òi¾á”²†X‚ä!Î0N^.1€:ØÉÒÝM â¬Ê) q´Ö°tžA FF(Cœe0@d Yøø¼¢¢¢Œˆ‹7lk°èjë³²³süSòG`éýäÙÒ lë `z~ð9B\œ@ΰgŠÿ±á³lÀŽ €Œ†¦¡’º€EA] rAŽM÷çT¬ª`+³ˆ`ÿ>¬ ÎÖà?©¹q=sI¹€7øÙ äerùq\@P'°›Ûó3ì°…aÏ5€A`g+Gwë?<Ëm ä…´†8;z¬A6ÜêسKËÿ¬Ë\ÿ¾&ÿZüoið¿¥½ÿ»æþkþË%þßÞ祖wwtT:=ÀßKð¼e UÀŸ=ø³h\ÝAÿ— Ð ìèýßXý«¢>èïHÿý+¦>—CÊÙö¹%œ¼|\<‹Ánò`/µ&fe°:>Wë/¹®³5êv=wõ¯‚>ñðü ¦c¶rpþS~Á¿!³õ¿Æþܨ¿"çVP‘£¦ÅþßíÖ¿45Ÿg¦ãíü7újëÿ<üá‘–†x|9…xœ|Â"€ˆ0¯ÿãñ/ÞžÕ€0(Ø `ÌÃÅÃà xþýÇ÷Ÿ'Ó¡‘s¶‚Xÿ™™70 ³õó˜ý§àlå…>w÷¯›ÿœô?Î <ä²ÂXš‡X‰‡ÙgdeÂjIóFe{ºyÂ]JtŠ ƒª!]Q›¢¿k¹ÇÅ[½ç¾»<ì(³ív“82w¥N ¨ü_°~)Ä_cjfß á6+ÁÎ<Òó=›UÝ@2âÑÛÝÕÒ6ûø…z¼ŠvvËô£0ˆˆáÆ'À*½þ-q^#AmÑ÷#¦”ƒÛ澡¯ý]È_v(Ùsߢ3Š{ a3ŹæRJéVøF3¼–ÁÇ4I‘§_ñňö…§]ÐÊ¿ÆŸ*£q¬NKŠÙ$D}g2¬ÁÒ9¨HyÇ°‰4 -šó“‰Œšq?>îìœK2Ý+Ê‘JÆÇ®5”岦ÍаY±:f¿–oʇø«8…| ü}ßHdt°ŸA¨ï}ÝûN†˜B¨×w¡è7ÖU(^˜å·BZų~–§¤ºpz/ÜÚœ 3”ýŠ9Š9zFˆÒüâê¥Ó&BŸÞò•Ãtk„žæìwjH)dݶ])b~¾¯Cl«)x ŒÈ7Á|‹ÞÍJJù›”º–Áøø½¬¤Gj&³}ªlYØ ¨TH‚m^®šß~‰Rr<‚¶¾½‹;v_ß2žÈƒÏË/Ä‚¨eeŸXÚF+Â$AV}V6¼|c‚ª,V©çÒLÙ6ç´QX¸±­r5´òNZGÄ{.<ªýO ·Œ4T z¡ÐnŒ›LćÞFòwIñeóeòz ëSÔÓØt賟z~ZÚïB×GOÂd/JLhFl53kZVf,|¦^Ù›cÍ‹Œ·µ®V3Š‚Ø_l椒ü¾?#^套ÎRó±z/ÿ'œø:RÆç0D*ƒÀ…ñ=“M -~\û¾g»5LÇ×ð2(JÆâjU” ýçF¢AíÁ‘¾ØÚ·åý¡[‰ä]¦šåejqmÇè+üä®»MxmÖÜÀÅ‚×Á;ì#oÑÀÛøD›Ì‘ì -ætÑÖêW«Kš›çêDSIB?'{ØHi“C}i–¿89‹Q#8()¥qÜ&s:c¬ÐzGÀ·k[¼©ìï~²D©O}™¢¹ë¡ßàV,sj[3T‹ôßÕOLÒkOh3íµ:e¬êõ’‚¥Ixó0$ÚÝ¥þû™œÃ¡xˆ`Ï9ã‚ØKþO -?Ù~½ïŒN0œXj Ÿ3/û2Ê%ÇúSÂSÜÆhãœÐTÙÄK -ʤz4´ð-ìŒDÆ9ø Ò™çäTu´“õ_.’Äån3~ª>4 6 … -?5캜(¬öçÚnd"à­æ7…½“4UÆbVf=åî¦bLïS7Ôpo5….×ÿÞ©¥]— - *°?cÇÒnô¥Ö³«m–Ž!©À³yƒY0˜Þ©øRA>,…o¦†ªûu¡âå¡ÏöÕ -8[‘mD¡9fŽIÏWH°gƒ3Æ3È­{ß 1«Œj͘¯nÕÌkªäÄ¿*c 3‘§›ÚdŸ(‚Å—£ ýìå_¿^gìAÒæKžn[— ™`ˆx=u«ÇítûØ´‡Ðá:ÑJ£±šïbÎÓ•ddqÛÍüå Nº™;á$±ƒtT퓱åÌé÷ÞƒöÔÏT ´³è~9»µ~²ëõ¡´Wáp#ú‹TsýSáË1AºÈÜéñ*Ì@¼Ž¢¼¯Œœæj½úmXqê$’¨Ea ->]kéÛtïŠWÕˆç5|g('®_(ûR®†ˆ/νxD¨}c]ߵÑúéÅt³"SòAŸbíõ•ñ{u Íé¡GWª­oì - Ýí2éùG·­VÀc,ä½*,€V8ÿ²gƒ’‰Ðí÷a#™×åv -ÛJ§ -QZœsK )!7 ¢)U˜)%ݯð­y^¸û¼ñzôŒ¥\Չ̌t®Žvo¿æLõ)ZÀòBÈß>-o‰ -F<¯Tváî7üŠ( $4~x-#|»±JkP4ŠZ¬pƒí„ÊNh±c…5³³:f“ís îBiFí³teÈßiήÞ鎙øÑ0%$§§H•†ûYðI;‰:|€‰û8}æ®îØc7=sMOUK°ºöZ ¦ëQú¹ñ |ÉꔕQZQעŢÉZ0ºvø¼-…^_'T…\Û'Îæ5ØW„î犷8tO\§ìµVJßÝpj¤û?‘Ä,¸:Œ dÎiE+ÃÇ£³# åä NŠ{©µžÔ/¼G¡—©j8ò ;,ÉÛú…C¹ŸXݜѲ^•-¨F1QfþO’ÂãLºÁ™ñpqNÀå$6/q»Ö$Çße/qð^émv»ï]ƒf"gÐ’…‡IOžX0rr'jÔ@퀚3K¯ÅT$‹“8ŸÄ~X¡¨ šJÎ,ð®T“¬CâÑŠ'¤ñ·N^y]t`‹w¥mò4x\8w›zÄDgx’=ÅR­Ò-i0,‘toß—H§v/ nÀʼnuã63U))§ñÀ¡¶öò]94pŠßŸ§‚8ðe=úÈ•e{Ë&Fæå9S NȬÝÞp)»Àô7¡_úw Um\0ewœ¬¾Ýpb.ÿИ`Ï^Ff )0ê{©jœ.*‘M8G -Ö°¥oµ·LµžLÛ¬âQ­¶>§Ãýåy_®ÑÃlݽD$»ÈfQ«~ÆVx8Sh'@Ž®>§/”T3D´B.’¹=ßzK“hyzÏ t|tT×ö×Ï‘9û0”™Å¤CûŠçý€æcøÚ[0Qe\þ`áöl5“ˆQ—ã üE‚¾‹à“@úy—Eߤ‹bÇEïO¡õaä,~CýÅaË‹—Ñ.¯‡ÓÏÈ—!‡dûXn†1õÚËm·ˆ&áN»ïgà[Åʬ2ôV×÷Îå‡%Äe_›[Ö$¶§ýj#ã£0¨wrÿŒ®ý´^å¶>}­Çž¦è+¹5Ë@Ÿh†î¨PQ»N×Ì:<Š³³~ÝQÎI6€ŸŒç¶Ø—šï¹,Bñæ“"ç^úRKq=ö&*?ˆ3Ä$§{É}"Åv$ù ¿"úv–‘Ã/iݨš÷µG3‘Ž˜yLÁ¹`”Éò¥F€u·Âßzͺ‘oCRz̯Ò¯ÕÖhÚ‘¾Ú‰N/–„¿†nnzänšµ† é4ïiî’=¹D×(ÌJf1MN‹™9ò_=[ú8ðË;cPÒZÞÿQT‘ïgüvþ©žà+5 CviÙƒíõ4avƒ_[ì'rÇ~–Yü‹aª¯ûè'"·âœù´Û½ÝH^~j‹mƒ½è‡ŸPuñÏ#*ܱқé¼!«+N׺›*]€RJÕ}b¿8•h×ûŽIÊ|CX¡6fÐÿú¡¡¤Û>¸ö­žü˜ˆÒʛ˙ÀÍãu·6ö´e¶•W‡©›,o R"ÿ8ê”ØrC0öð±âF•kg&ÌV,äEY–e'OËÎnÝWØÔ4…Ç‹ÌâäþâìbÏùú÷%Šš"–3*jY’–å2ÒíŠÉ7¿#íß°‘`Ûñ„Äá%7Š4¦òvŸµaäP¡}_ Ós—4sVl'¥_”z·¦Üðq7aº&¦Î -S¬ ðšM%vÒ;6-BÈ8¹°STWü!ƒÂ§ûy;-V’N >A…c^¤±ŸbûL™:ÑÞÂâÍDó’³Ü²ç-n<°Ü²ë\‰„¿¼“81¼ÜòIõç+¦»eV;ƒÓÐƧMñU…&½“Yš -¿s¾f9ùO§So¸òr˜ÀÅ̘ú)…Æè=Ë—MÍàQÒ´…jìcYå^¬L+^è³aõ£î:]FŠ8ÕÑø³ G Kª¶sl"Ó²Œo™ß¹º(Y]S(ŸÅëÕGá^UY,,@r‹¦’TÍæ@Ñ™ø ¹G1ákêøtç°¹i£wbTúçHº0ßh¼ø8­Ãä‚Ž,iÜëi¹àÐ\WÁ:[Öô§¡ÌŠS±‘Ò5¤Sc‚Ž¤ÖîàÊX¶=ì{„€Ú£µ–>ûöÞ}/:ü[ ÖZ !êšF£=×.ÃÒv«Ss„Wß±®%)¡¤BT;ZIU¦Ð“16úë|Cjç÷ÍkhqØeéóŠIXP #Œêæ3Õ¿$ cŸ‰b7 nÐíXŒ€‰ïްГUž#¹b]C•Õs×õŠ›$tÚ_åHP²ªX&QcýbÕšëQέPqßq›ówŽéyŒ -"Q1m>3ÍÃÉv€ê*Ó«KhoIVÙ ¤M›ëNw_À¦ö>RT=ùgK:V™îDƉÂá FÙ«LcTº¦û£ÉØ^û¾QQoPÆ–â¼s,=Æ P·Öïž™ùìIn'PÛ?ÛW;Ìùæ¥~ ½Ï¨AÐJK(¢Ý7CV3¤Ð¡ÔÓ»Ê .$ãÐ(í9 -Hª×6x(Rm,Ùó9'{ºaÇ æp–ãÎçÞß}\Õ4Ëö¼c*FØÏeqÊÎÎý(H%W”0Ï¢'_S;eÕ|[´4$k¯í Ó2i^†¨”iºbùÖúp{x¹ŒÑ{Yd Ð)-\}®×ú‘LV?ÏrUðÖ“nrÔv¯Ôú8øµcÀ$­»ÿÇFDqó9Bð­XÓïüÏÄ<üzù?Gv±h+;É¿ç/­2é6èê//8e7¤÷})¹…ùÈ1ºòpáá3n#سv)ÉtBš×IÖÕœjyÀbuÓ Ï®ÂÖ)GѪ|…Ëß/dó͘­ä:b9… -ăҕõk…&X†#Q‘¿%2ZoT7O‹pÙ·m~ëéqxE‘‘ó°L¢%¸Ëµ`oã§Ãœý„¥R^ {ª%d‹w? Å:L 1e²#RÕ"½Ô9–B i&%`¹‰þ*]DRšpÜ߶PÕhEpÙ?Æ>qNã2þÆð(<¹°/uÚ€ïêìç}Iù°P„ÓÂ/aʃ_ûݯK’qÙµ»4üdLqZEgH¡8„üǽȗXØx` )C‰u句‡¥òµ/“…’fŸŒ‚Ƈ+’*!…Û˜ê} þÄZU¤¯öà šMÃLíó?³½ÅÉ®Z–O:>¸$rÇtŠË†¸ã/‰f%²5ò("ä×ke9tÈsÓ–ÎPŽ;fÌñ0Äl¼xNÃ$Ô/„K¹rHˆ|ÃPšÅ7ÈGÛGè)úk1c\ë¦JÂÒƒdÏ“xè‰é`Æè;ôpèQÒeŸ8Ð{îF|òœX`]ïrrÕ¢Cù5Ä«e[ƒéoðïç¹Ä·È»Y.¡¼¹º¢ÒïoQ‘×UñEÓ#é|GÇ5Gåvt:eìñeñ÷Ê6€ðmªê¼0ÎùuJ©=–ÛÉáK°pÈ/¬Ÿœ²3a¦¤c‘»¼ÊÛ¤§(uÔ|ò½bI*›–©a­ý:Qó]§7Qå×­ÑÒqµÔÝA€ZCj&­¿ÕMmùü5òì÷l{Ô÷NrlIÄ6¶²ßkä£Q·ÏgZÞÿÞŽþæó_\¥V~)·÷e#®ú0ñîÃÜmÅ–Wjd<Îê—È_a%Ÿ¾ç IOÉ`àQg(Å—rØu±†ñr•Nzâ¹ÉŽ³,k…ð¸Æ[%½¥œT ôÆ ±-:d*yËÀz 2ù9_…V³–`}ºfεÁ©éÓQb9™¯,ø㺨¥+)8ÐvMÓóò}XߎöÊ›¸h²3OS˜©ÝËWÝ©È98ÌÞDÉJ§”' ë¦k%"i(© ^HU¸‰E´ÓM"í(Ï<Ì!‹…²VTô@Å·;&×uTã_¯|ã@läbz̃÷Œf'œn}RS×Ôñ¯ú€÷®ÝWM]Xiwª„ä9*Ig^Þ7:é"îŽHåéHâ–/ÞŽˆÅoÓÏ×»¶"Ûì~Áï1m)YÉÌUK!.©\*Q«ü˜uxɘ¨  IßTÀ6à{†æØ ÿt¦IŽF‡Uô¤·ùUõ²º¤~OÓ”[mLØÈärÃû¬…EÏeˆ$SÇ-¥{iêc€€¸ôÊSÕŒ~•K2¥¢ºIçí4+=n¬ÒhP‚!.LAßZœ—A‡ >y¦ª'Q‰ŸÞÆ1ŠÂ»Ï°ÉòWYÑ’àO .óŽí“ 9Ž¾Â™Iø1MÛ^>YŒŠPaXS=D•Î¡ÃH÷£ßá§-œî1¢ {ùš^¿ûDRÌ1ÈϨ‰ -åj¼ÄíyÉWîÌ-ÞYeâ”^P|Ѹ縱B)— ]ù¼Z‚¯²´®ÕP?t@'M­ožiÂäÁº>5mù»Æþ(C§z…Ê Z»R€=ÛN:Nœ×PK Ìu2*ñég¢Uª†õÎX7a:¼“‹_¡ÍEfÙÝögŸ´×­(yöé”ä$B0åMÄX”¹°a-{&£$>°ÊÅÇ!§‰£PÆ™az?k\M’ÃǘΟ¯Â»|(ÕE£_WF1"•B5q ‡y³9˜?ÀýÔÜ凲˜k(ÑD¨ÐÜ­Ë%’M_ k$†º:–$:):4}MŒ×µüÆ£A_V9²!òŠ@y²èI¨ÿ›àõþ¡Ð’ãED-Ÿ¾—ìŠ š6&¢ -EÍÀïíÌõc-„ºGœ‚v1ÒÁ n˜ûÓ%e)A—*÷4"ì -w©fïôöÄ®éã¢2öÅÜŠ~´zA—q_“1e¸âˆ#=e¾>5ЀQnïoŒÏ7Úî‹=ƒ -|]^,÷5CÁJ¿­XË‹ó{êÖçèÍäü†ã£¾ö0²U\ôöì3ZÁBŸš=)ŠBÅóO2Ÿy˜ :êÕßõ,wÙÌìòé\ßmm*BÒµãiû6}õpêáŒOI 0yø°C„—ó‰Jï×ÇËU–î°T·»½ØvDûò¹ñ_D,×Ðj+ìi çK°£z„â<áOΚK–¿û$›$ã ê«·}ïÿfÛºŽ8~†½g3w›p-ÜE3†NT×— ê‰/~ÀFNÞ…zv’V¼ä˜×RÁ†#颞â6Xo™Ä6qӱɫ^¨Óâ¨p'd€¤ÈÃta©‚9ŠÅË–8è”MmÎúŠ0³Ÿ¤µÌÊôw{ç_ð’l»òÔˆI£òÌCû¹4Ò ©š½°(f®cÑ.0átlã’·²XL¢Ÿ¤5˜~4»§y Æ@³k{(̈Àn} m{ÛóO®Hl€ÝàåG;R½"Ï>'C§ÂéÜœ(‘!ïä8Í•È(mÊ{ 6t=‰©OJÄw]RËs£ô Æ\pzs[ú±{ÁÎC_|ÞwÛ¢jJÈY̺ŸúÕÞñ‡-Ý/¿Ê¼Y6ì)E`w¹†;6ˆÜ„¿‡ʽR6¹Ú£FØl@eç2ù؈{úý ïþõC •s!Á”;66­R×Âóò··”(*9÷WsÔÜP÷¯œ~:`3ŧ3ªGZkO+ÚÈRSY|ë¼o¢1¬DpË9j-q—ݵýð}ĜαŸBÈP„¹×~ùé¼I2èüš“xþÄt¼Û·?//I³r,í>šo é`ܨ=ƒ§Z˜ºüúí?P]ãí€ÓHÏ¡ÆfØî¬LUébH i}pXabÝBdßùˆvǾ^È0Ž3¿a6þÐkºnUõOsP˦$éÕíÕªˆ'Å\ÈÞ‚LäAc ¼—c·¤¾ÅŽú¥Äe£”ëmÖÙòÐŒUÚèÇÝŸ â´¯ay0=vêi'¼«nH¼ŸnFb²Õ¸ Ò€ŸƒÁ÷!³¨R\ ÿÔ_ ©½ø m!·ÚfF&TÕC kîª0OØþPüb|S½nØÚS"ë!Q+LºÇóå·šÞ`áw瑸Ž7ñÞ§GyÉç~µ“/óœ_ìÊSO4b›~Z5ÕRj9|¬ ËDÃy]:Ú)¸Õs4uTŽ©î£Ô/ǤŒfëäniúBå#­#¨ä‚°1ÂÎÈ¢v’0÷µÏ•)6êS^m^Ö2½Ì3mjŸ®°³*/M'O¼öõÄ}µižØUcè/R4*ÉÏ”g’²ãþ(xê÷C6alÉ!¢OUT»ŒòKŸd¡]1£QÜW[ O敽ª6¹H;CÏ"æ[1jËÐèÌNšô:„™·v+‡®B½»êcÝ¡óÕE# -~uÊÉfÃ.!#¸ûù4%mBKÖèE¨µ½ ÓX·”6LÒÚ6!³DYíaffýOûêWNª}ZÞg‚éž›HR‹êõl—z ó×ÔD57uó=5†!'M­‘‡AÒº2E‚¯:6ÚF§;©RÞ‡[BzK+Î -ß!`ó ȲœeW-‹ó;$Ë«A~–Â_'´/ ­féí=0-ùpe ýb\_"¹"f]Äâ·5|íD¹CVn6³vhýbï¢7úÃEg7ÝcXS®¥ª`Uö°LÑÇA_‚½|f0gÄq¨XÇ.û‚Ç·pß®kÄÎæW®Œð…[‹P>4š ·Ëÿ´¥4vç’äÐ ¾뮜ïJ–Cü8ìœçZZ¦<ç&ßö°1æ^Ï=¦õŒϪÈ‚?Ytß_-qÝjá°ïÓš—>¿`¸ -dº9„ÚÑ£onÖ42íöÕ‹4ͳøªƒ“Ûˆ  +ÖÚ@{”e­^ßxgD_ë¥R6ŠwˆŽ„-7[:ëRöMÂd›2x•û“öÙ° <ÍùG{|E¨ènîÆrSìÏíŸXØòÄB¥:q–hŸýǤŠ§éLä]"bF&ÆWtz`k£Qøªj¾ƒ¾±x±2U?¿ -(|Yr™¤AÛŸ•^þþ`ãMaá“Óe–”ÖOa#aTÉÐs;nÁ@úwm¬ì^ùÊAÄÉôæ"\í¹z]Ñ ÔŸhÝd‡Ijœ×éóæN¹šæüŸL¹†>Ã1NeÚ‡iÑEÛË¢Rõóó"( me>´â åâTï²ìÒf|ãÞ/œe¸²bîµË× -ªVŽ…¡TYÏñGûçÕ‘¤`s -¢à³çúísÔëbdÎ:Õz’¼¶qËyLmcãvü~(5Xt¬_ûïíX(úÎñ*|<^ÕV$yAQ°¤¨Ó@ãpvZ#{-/!~+X3>mÚŒ¸RK4=ÓÁ“¥Ó~l_r¤Ó콊%«‡MòöL˜ÊH"l l´å"ßšÚ%““U–÷ cê¥B5à+ƒ_'Ön*œ·Ø =HDV"*õ¦À‡ôJ±í« kwV,f–¡tb,\þ#¶÷"ã\>“hYß¼†÷¾‘xïÕG™šÖ1¬Dµ€Êàw|©+ï¼lNü?x} ôr,st…"øÀ<…¾ô§[¾B¾"×-*¬ñÌ™d+Ä0QÚÇ]hlxŽýZ{ubÐŒΰë*øÁLCÓHôÍR{îØ Ê£$þû|w;˜™¨2£O]+.âG¶ÌÛàó›÷²â9Bt ÜM -/’½oÛ÷¾^LL9-†ùʈ†?d×8 -ÌÍN;^I^Ü<8[afóøüìÇig*ôB¥ÛRôÚ_…'Ñ·°¨’sÚær©t É­Z"q_½âæ.YžÞýìóörµ™´vE»K -“аg¬¾yrÞ×^‡aî7QvN1}×±Á꣨å¶Xiœ¤Ê§¼„ÆæñR£îQä1‹Rä;Eøê'Æù×Ã5šål§bùøå8ËÌeѥѷڼ'¤/gƒªï¹ÙiT–Œž%¡`ƒãÉ!9}¯íêxíFYû@A•l”PÆ&:qNœÔ®Ûª)Öºq…ÎÈÜ~:   - ë— ^ú©8ð7'B<9ørIÈ–°ºäm†£Å6üü»É‰áËe¯^º¸ÜEÇqwÆòÅ(*õþ©s~¿•›½ ÁìmQ-V+¢&Ú·I„' e¤ÝV‡ ZVfñ_6„Üä^&,³¬ÛÚ#¯ 2^ã3“D®<ÄûZÐ P}D¯mþÜF`­§5N—Ÿ7¨³ÊŒ´Ø©QmM¨Žná.^"¦ä­%ÎôÂœ4võjõqF°Âù{ìmYUOSðöG²ˆShsàšÉ2Eø54^“ï§cù/ÕD@ŒBÚt2[+a\^b¦~üi®yxûP`éG½ økj–>¦zSK·±Næ)c¹“ضž­]$+¬àUF¡i—×XÜâ“ØÙ±Ý[!"ùhð&ÜpoEáX1YR­¼èךï3'>aL÷·üˆko¿DÚꌶY¬XW®Sì'fc$øBÝ(D¸gÕT¿ë `½ä$´\¦]§‹³r³ˆN‘´þˆ¡Ú;7Åúª‡mGÎó¿ü`ü‚ÿ'¬A@( â„:`üÎ?*endstream +xÚíwePœë–.îîNCpwM‚»Üh ±†¦qw'H°à’àA îî48A“Cö¾gÎÔ¹ókæüºu»ª»¾w=k=KßõU3Òi¾á”²†X‚ä!Î0N^.1€:ØÉÒÝM â¬Ê) q´Ö°tžA FF(Cœe0@d Yøø¼¢¢¢Œˆ‹7lk°èjë³²³süSòG`éýäÙÒ lë `z~ð9B\œ@ΰgŠÿ±á³lÀŽ €Œ†¦¡’º€EA] rAŽM÷çT¬ª`+³ˆ`ÿ>¬ ÎÖà?©¹q=sI¹€7øÙ äerùq\@P'°›Ûó3ì°…aÏ5€A`g+Gwë?<Ëm ä…´†8;z¬A6ÜêسKËÿ¬Ë\ÿ¾&ÿZüoið¿¥½ÿ»æþkþË%þßÞ祖wwtT:=ÀßKð¼e UÀŸ=ø³h\ÝAÿ— Ð ìèýßXý«¢>èïHÿý+¦>—CÊÙö¹%œ¼|\<‹Ánò`/µ&fe°:>Wë/¹®³5êv=wõ¯‚>ñðü ¦c¶rpþS~Á¿!³õ¿Æþܨ¿"çÖT“Ö7Ðeÿïvë_ššÏ3Óñvþ}5ˆõþðHKC¼¾œB¼N>a€ˆ@D˜×ÿ¿ñø ï?Ïj@ì0æáâáá<ÿþãûÏ“é¿ÐÈ9[A¬ÿÌÌÐÙúyÌþSð¶r‡BŸ»û×ÍNúç¿òYa,ÍC¬ÄÃì3²2aµ¤y£²Æ=ݼˆá.% :Å…AÕ®ÀŒ¨MÑ +‹ß5á\ãb­Þsß]v”Ùv»I™»Ò@§Tþ/X¿â¯1µ ³ï†p›•`géÇùžÍªn  ñèínji›}üB=ÞÎE;»e záQDÄpã‚`•^ÿ–¸¯Ž ¶èûSÊÁí sßÐ×þ® ä/;”ì¹oÑÅ=°™bƒ\s)%Œt+|£^Ë àcš¤HÓ¯øbD{ˆÂÓ®hå_ãO•Ñ8V§%Ål¢¾Æ3Ö`éT¤¼‚cØÄÍùÉDF͸wvÎ%™îåH%ãc×ÊÎrYÓÀfhجس_ Ë7åCüUœB>þ¾o¤²:ØÏ Ô÷¾î}'CL!Ôk‡»Pôë*/Ìò[! ­â‚Y?ËSR]¸½ní΄Ê~Åœ Ž #DiþqõÒi!Oï +ùÊaº5BOsö;5¤²nÛ®”‡1?ß×!¶Õ¼Fä›`¾EïÎf%¥üÍNJ]Ë`| ü^VÒ#5“Ù>U¶,lT*$A6 /WÍo¿D)9A[ßÞE»¯oOäÁçeˆbAÔ²²O,m£a’ «>+^¾1AU«Ôsi¦l›sÚ(,ÜØV¹ZùF§­#â=Õþ§‚[Fª½Ph7ÆM&âCo#ù»¤ø²ù2y=õ)êilºGôÙO=?-íw¡ë#Ž'a²—¥¦ 4#¶š™5-+3>S¯áŒÌͱæEÆÛÚ?W«EAì/6sRI~ߟ¯òÒË +g©ùX½—ÿˆN|)ãÆs"•AàÂøžÉ&?®}߳ݚÀG¦ãkx%cqµˆ*Ê„þs#Ñ öàH_líÛòþЭDò.SÍò2µ¸‚¶cô~r×Ý&¼¶aËnàbAˆëàö‘·hàm|¢MæHvsºhkõ«Õ‚%ÍÍsu¢©¤¡Ÿ“=l¤´É¡¾4Ë_œœÅ¨””Ò8n“91Vh½#àÛµ-ÞTöw?Y¢Ô§¾LÑÜõÐop+–¹?µ­ªEzƒïê'&éµ' ´™öZ2VõzIÁ¿Ò$¼yíîRÿ}LÎáPŠ3”×/”})WCÄç^<"Ô¾±®ïÚáÆHýôbºY‘)ù O1€öúÊø½:†æ‡tУ+ÕÖ7v†îv™€ôü£FŠÛV+àŒ1ò^@+œÙ³AÉDèöû°‘Ìër;…Œm ¥S…(-ÎŽ¹¥…”›Ñ”*Ì”’îWx€ÖÇÀD‰}œ>sWw슱›ž¹¦§ª%X]{­Óõ(ýÜø¾duʃÊ(­¨ëFÑbÑd-];|Þ–B¯¯ªBH®ígs³d¸|Síqb÷{„3HÄ{lxýû¼Úþõ‡¸€1»ßÌÚœ&^^0*Ò7w:è¨}eëvjg˜MaY‚Ð%U7Ξ¸ˆ1]ñÔÒò<‡ÕÉ‹!¾Ô«L¬5m÷2fmû<ãí?S¦çŽ ƒŒ×‚ëWÕ‘QÛ—6 ‚ø‡ã!­Ã©bVBÑËwEçòn9væUŸì« B÷sÅ[º'®SöÚ@+¥ïn85ÒýŸHb– +\F P2ç´¢•ácƒÑ‹Ù‘…rò‹'ŽÔZOêÞ£ÐËT5ù„–ämýÂÆ¡\ƒO¬nÎhY¯ÊT£˜(3‚'Iáq&ÝàL‹x¸8'`‹r›—¸]kãï²—8x¯ô6»ŠÝw‹®A3‘3hÉÂä'O,˜G9¹5j v@Í¥×b*’ÅIœOb?¬Ð ÔP M%gxWªIVÈ!ñhÅÒø['¯¼¿.:°ÅλÒ6ù€@š<.œ»M=b¢³G<Éžb©ÎV逖4–Hº·ïK¤ŒS»7àâĺq›™ª””Óx`Ð@[{ù®Hš€@8ÅïÏSAø²ýäʲ½e#óòœ‡)P'dÖŒno¸”]`ú›Ð/ý»„ª6.˜²;NVßn81—hL°g/#³†õ½T5N•È&œ#kXÒ·Z‰[¦ZO¦í Vñ¨ÖŒ[ŸÓƒá~‰ò¼/×èa¶î^"’]d³¨ˆU?c«<œ)´ NGWŸÓJª"Z!ÉÜžo½¥I´¼ ½g:>:ªk{ˆëçÈ Žœ}ÊÌbÒ¡}Åó~@ó±F|íƒ-˜(2.°p{¶šIĨËq þ"AßEðI ý¼Ë¢oÒE±ã‡¢÷§Ðú0 r¿¡þâ°åÅKŒh—W‡ÃégäËC²},7Øz íå¶[D“ð §Ý÷3ð­beÖz«ë{çòCŒⲯÍ-kÛÓ~µ‘ñQÔ;¹F׌~Z¯r[Ÿ¾ÖcOSô•Üše  O4CwT(„¨]§kfž—zëd̹:E.g3G5Õ_üIA…nµ>Ĉe! ªÐ½×~sýücê{?ê…s’.âÈÑ¢8é+û3FX©wvÝ*— n~ ,!PÁzc³ÐMÕÁ—=®“@ ®±&Ó/C¦ì>š#ö¥X÷Þ•ß|/"rÈÏÞJð‚WXhÕö13/¾¼v"sõ]8«{¢5¬•n/ÁîÄÌÖZñÛÕêÇDßõÓ'R +­)ýHF º6Y~Ûé»n{0òiSÖ^q _±ð¦ÀO¦îEþ‘”8¢±7_'š-CØ¢bùu]<ÉeA$o4¬ÒÌ)¦hÔ?úõt’†:öª^m™]IçoÅÙY?¿î(g‡$ ÀO Æs[ìKÍ÷\!xóI‘s/}©¥¸{•Äb’Ó½ä>‘b;’|†_};ËÈá—´nTÍûÚ£™HGÌ<¦à\0ÊdùR#À:[áo½fÝÈ·!)=æ×é×jk4íH_íD§KÂ_C77=r7ÍZÃ…tšŒ÷4wɉž\¢kf%³˜&§ÅÌù¯ž-}øå1(i-ïÿ(ªÈ÷3~;ÿTO𕚆!»´ìÁözš0»Á¯-ö¹c?Ë,þÅ0Õ ‹×}ô‘[qÎ|HÚí‰Þn$/?µÅ¶Á^ôÃO¨:‡øg‹îXéÍt ÞÕ§kÝM•.@)%H‰ê>±_œJ´ë}Ç$e¾!¬PH3èýP +ƒPÒ€m\ûVO~L DiåÍå¿Làæñº[{Ú2ÛÊ«ÃÔM–7P)‘uJl¹!{øXq£‚ʵ3f+ò¢,˲“§eg·î+lê šÂãEfqrqv±ç|ý{EMË5ƒ,IËrévÅä›ß‘¿öoXH°íxBâ‚Æð’ESyŠˆ »O‰Ú0r¨Ð¾/é¹Kš9+¶“Ò/J½[Snø¸›°F]Sç?…)Vž›r3WKn'ÂS¢Bp?o ‰ËÅ„¶DkŸxͦ;é›!dœ\Ø)ª+þAáÓý¼+I§…Ÿ Â1/ÒØO±}¦Lhoañf¢yÉYnÙó7XîÙu®DBÈ_ÞI‰^nù¤úóÓÝ2«Áé +hãÓ‡¦øªB“ÞÉ, +M…ߎ9_³œü§Ó©7\y9LàbfLý”Bãôžå˦fð(iÚB5ö±¬r/Ö@¦• +/ôÙ°úQw.#EœêhüYУ„%UÛ96‘iYÆ·ŒÌï\]”¬®)”ÏâõŽê£p¯ª, ¹ESIªfs èLü„Ü#€˜ð5õ|ºó XŠÜ´Ñ;1*ýó$]˜o4^|œÖarAG–´@îõ´\ph®«`­ë úÓPfÅ©¿ØHéÒ©1AGRkwpe,Ûö=B@íÑZKŸ}{ï¾þ­…k ­„õŽM£Ñžk—ai»Õƒ©9«ïX×’”PR!ª‚-‹¤*SèÉýu¾!µóûæ5´8 ì²ôyÅ$,¨Ž‘ Fõó™êß¿ ˆ±ÏD±› á7èv,FÀÄwoXèÉ*O€‘\±‡®¡ÀÊê¹ëzÅM:í¯r$(YU, “(‡±~±jÍõ(çÖ ¨¸ï¸Íù;Çô<F‘¨˜Æ6Ž™æád;@u•iƒÕ%´·$«lÒ¦Íu§»/`S{)ªž|‚³%«ÌGw¢ +ãDáð£ìÆU¦1*] ÓýQ„dl¯}ߨ¨7(cKqÞ9–ã¨[kwOŽÌ|ö$·¨íŸí«æ|sŠR¿ +ÞgÔ h¥%Ñî›!«RèPêé]å’qh”ö$Õk<©6–ìùŒ“=Ý°ãs8Ëqçsïï>®ê še{Þ1#ìgŠ²8egç~¤’+J˜gÑ“¯©²j>-Z’µ×vi™4/CTÊ´Š]±‡|ë‰}¸=¼\Æè½,²è”®> ×kýH&«Ÿg9‡*xëI79j»Wj}üÚ1`’ÖÝÿc#¢¸Îù!øV¬éwþgb~½|Ÿ£Œ?»X´•äßó—V™ttõ—œ²Òû¾”ÜÂ|ä]y¸ðð·ìŒY»”d:¡F Íë$ëÇjNµ<`±ºé†gWa딣hU¾Âåï²ùfÌVr@±œBâAéÊúµÂ?,ѨÈ_­5±˜ÍÆq•Ðµ#Ú,HÉõuÜ¢y¤Ë›RÁ¶?âr6ÔŸ ­Œ7ª›§E¸lÛ6¿õô8¼¢ÈH‚yX&ÑÜÆåZ°·ñÓaÎ~ÂR +)¯…=ղŻ†â &И2Ù‘)„j‘^ êK¡„4“°ÜD•.")M¸ îo[¨j´"¸ìcŸ8§q cø?ž\Ø—:mÀw +uHöó¾¤Ç|X(ÂÎiá—0åÁ¯ýî× ‡%ɸìÚƒ]~2¦ˆ8­¢3¤PBþã^äK,l<0‰”¡ÄºwRÃÃRù‰Ú—É I³OFAãÃI•B„íŒ Lõ¾ b­*ÒW{pͦa¦öùŸÙÞâdW-Ë'ŸÜH£û´Í`7$^¤©W‘8z.êЋü;*Ö&>0A̼ I™µØú‘‚ ø3àU$NõŽoíeá—·©E¥¥Ë°‹c¸3¦)fõwÖ.=£5f–MmB]7{¾ùP5/‚–Žè';n¬·ÍýòøŽ—D¤ë"‚ÙV+Œ)r‹U˜5ZV % En‰y\kºsóL£¸;s2¹c:ÅeCÜñ—D³Ùyò뵊²:ä¹iKg(Ç3æxb6^<§a’ êÂ¥\9$Ä>Ša(Íâä£mˆ#ô}ˆµ˜± ®uS%aéA²çÉF<ôÄt0côz¸ ô(é²Oè=wÈF£>yN¬F0‚®w9¹ê Ñ!ŒüâUȲ­Áô7ø÷ó\â‡[äÝ,—PÞ\]Qé÷·¨ÈŽëªxŠ¢é‘t¾£ã‰£ò;:2 öø²x‹{e@ +ø6Uu^˜ç|:¥ÔËíäð%X8ä—@ÖONÙ™¿° +SÒ±H]^åí?ÒS”:j>ù^±$•MËÔ°Ö~¨ù®Ó›¨òëŠÖhé¸Zêî @­!5“Ößꦶü þyö{¶=êÇ{§ 9¶$â [Ùo„5òѨÛç³ -ïoGóù/. ÈR+¿”Ûû²W }˜x÷aî¶bK‚+52gõK䯰’Oß󅤧d0ð¨3”âK9ìºXÃø¹Ê'=ñÜdÇY–µBø Üc‰­’ÞRNªzcÐØ2•¼eཙüœ/ŒB+‚YK°>]3çÚàÔô‰é(±œÌ×üq]ÔÒ•h»¦éyù>¬oG{åM\4Ù™§© ÌÔîå«îTäfo¢d¥SʆuÓµ‘´F”T/¤*ÜÄ"Úé‚&‘v”gH æÅBY+*z âÛ“kȺªñŒ¯W¾q ¶Nr1=æÁ{F ³N·>©)‡kêøW}À{×.¬´;UBòœ•$‡3/ïtwG¤òt$qËoGćâ·éçë][ +‘mv¿`€÷˜¶”¬d檥—ˆT®•¨U~Ì:¼dLTФo*`›ð=Csì„ :Ó‚$G£C‹*zÒÛüªˆÇzY]R?Ž§iÊ­6&ldr¹á}Ö¢ç2D’©cŽ–RŽ½4õ1@@Ü zå©jF ¿Ê%™RQݤóvš•7Vi4(Á¦¿ o-ÎË C +ÈŒ./–ûš¡`¥ßV¬åÅù=uësôŠæò‚~ÃñQß‹?{Ù*.z{ö­`!ŒOÍžE¡â‹ù'™ÏmQ5%ä,fÝOýjïøÖî—_e^Š¬›GöŒ”"°‰»\ÃDnÂßCå^)›\íQ#l6 ²s™|lÄ=ý~Ðwÿ€Šú¡†Ê¹`Ê›V©káÇyùÛ[J•œû«9jn¨ûWN?°™âÓÕ#­µ§íGd©©,¾uÞ7ÑV"¸åµ–¸ËîÚ~ø>bNçØO!d¨ ÂÜk¿ütÞ $t~ÍI<bº ÞíÛŸ——¤Y¹–vÍŒ·…t0nÔžAƒS-L]~ýö¨®ñvÀi¤çPc3lwV¦ªt1¤ˆ´>8¬0±n!²ï|Ä»c_/dǙ߰N è5]·ªzŠ§9¨eS’ôêöjUÄ“b.doA&ò 1Þ˱[RßbG}ÎRâ²QÊõ6kŒlyhÆ*môãîOŠqÚWŽ°<˜;õ´ÞUH7$ÞO7#1Y‰jÜiÀOáA‰àûYT)®„ꯅÔ^ü„¶[m3#ªê!5÷?U˜'l(~1¾©Þ ·?lí)‘õ¨&Ýãùò[Mï@°ð»óH\Ç›xïÓ£¼äó¿ÚI—yÎ/vå)‹'±M?­šj)µ>Vå¢aȼ.íÜê9šº*ÇT÷QêƒcR F³ur7Œ4}¡ò‘ÖTrAØagdQ;I˜ûÚçÊõ)¯„6/k™^æ™65‡OWØY•—¦Ç“'^ûzâ¾Ú´FOìª1ô)•ägÊ3IÙq<õû!›0¶ä¿ѧ*ª]Fù¥O²Ð®˜Ñ(î«-†'óÊ^UŒ\¤€¡gó­µehôf'MzÂÌ[»•Ã W¡Þ]õ±îÐùꢿ:åd³a —Üý‹|š’6¡%kô¢@ÔÚÞŠ‰i,[J&im›Y¢¬ö03³Šþ§}õ+'Õ>-ï3ÁtÏM$©Eõ‹z¶K=ùkj¢š›ºùžÓ¦ÖÈà i]™"Á×m£ÇÓTH)ïÃ-!½¥g…ï °ùdYÎ2€«–Åù’åÕ ?Ká¯Ú—…V³ôö ˜–‹|¸²…~1®/‘ܳ.bñÛ¾v"Ü!+7‡Y;´~±wÑýᢳ›î1,Œ)×RU°*{Ø ¦è‰ã /Á^>3˜3â8T¬c —}ÁcŠ[¸o×5bgó+WFø­E(šÍ…ÛåÚR»sIrèߌÀuWÎw%ËGÈÆ!~vΉs­-ÓNžs“o{Øs/„çÓzFƒgUdˆ ÁŸ,ºï¯–¸nµpØ÷iÍKŸ_0Ü2]BíèÑ77k÷I_™v{ƒêÅ šæY|ÕA‰ÉmÄ„Ðkm =ʲV¯o¼³ ¢¯õ‰R)Å;DG–›-õ )û&a²M¼ÊýIûlXžæü£=¾ƒ"Tt·wc¹)öçöO,lyb¡R8K´ÆÏþcRÅÓt&ò®?1#ã+:=°µÑ(|UH5ßÁßX¼X™ªŸ_¾,¹LÒ íÏJ /°ñ¦°ðÉé2KJ맰‘0ªÎd蹇·` ý»6Vv¯|å âdzs‘@®ö\½®h‡êO´îÇ@²Ã$5Îëtys §\MsþO¦\CŸá§2íôè¢íeQ©úùy”†¶2Ú‚@ñˆÆrqªwYvi3¾q ïÎ2\Y±÷ÚåkU+ÇÂPª¬çø£ýóêÈ +ÒÆ °9QðÙsý‚v9êÎu12g‰j=I^Û¸å<¦¶±q;~?”, +:Ö¯}‰÷v,}çx>¯‡j+’¼ ¨XRÔi q8;­‘½–„¿¬Ÿ6mF\©%šÆžéƒàÉÒi?6‡/9ÒiHö^Å’ÕÃ&y{&Ìe$66Úr‘oMí’ÉÉ*Ëû†± õR¡ð•Á¯k7Î[ì…$"+•zSàCz¥ØöUP‹µ;«3ËP:1Ž .ÿ Û{‘q.ŸI´¬o^Ã{ßH¼÷ê£LMëV¢Z@eð» ¾Ô•w^6'þƒ¼¾z9–9ºB|`žB_úÓ­_!_‘ëÖxæL²b‹¨Fíã®F46<Ç~­½:1haFgØu• ü`¦¡i$úf©=wl†åQž ‰ÿÁµ5FXéFõüÐÝö¦”ysw]2_5.`kÕšQGB3ôpk­l·–_ÁKm°+Eâϲ¦þý<“¶†QwŸ}¾»L‚LT™Ñ§®ñ£[æmðy‰Í{Yñ‡Ç!ºÇ†Nî&…ÉÞ·Àí{_/&¦œÃ|eDòkæf§¯$/nœ­0³yü~öƒã4Œ3z¡RÈm)zí¯Â“‡è[XTÉ9ms¹Tº…äƒV-‘¸¯^qs—,HOï~öù {¹ÚLZ»¢Ý%…IhØ3Vß<9ïk¯Ã0÷›(;§˜¾ëXˆ`õQÔr[¬4ÎFRåS^Bãóx©Q÷(ò˜E)ò"|õãáÜk€áÍr¶S±|ürœeæ²èÒhÈ[m^ +ˆÒ—³AÕ÷Üì4*‡ËGFO„’P°Áñd‡œ¾×vu¼v£¬}  J6J(c8'Nj×mÕ‰kݸBgdî?PPÐuȈŒG/ýTø›!ž|¹$dKX]ò6ÃÑb~þÝäÄðå²W/]\î¢ã¸;cùb•zÿÔ9¿ßÊÍ^Ð`ö¶¨«QíÛ$ÂÐ2Òn«Ã­+³Çø/Bîr/–YÖmí‘×… ¯ñ™I"Wâ}-è¨>¢×6n#°Öӧ˿ÏT‹YeFÚ@ìT‰¨Ç¶&TGŒN·p/SòÖŽgzaN»zµú8#Xáü=ö6Œ¬ªˆ§)xû#YÄ)´9pÍd™"üF‚š¯€ÉŽ÷Ó±ü—j" F!m:™­•0./1S¿Àþ4×<¼ý@(°tÈ£^ž> endobj 1038 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /GKFSMQ+NimbusMonL-BoldObli +/FontName /PMBWXU+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 @@ -10054,7 +10038,7 @@ endobj stream xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü- )@h`g°ñññ!SÄíìÝAæ`†š=##Ó?-¹ŒÝÿy‹t™ÛhÞ^\€Övö6@[ðÅ;P€-€35 ®¬¢#«$  “VÒHmŽFÖç·VL  ­`fç°þÇ`bgk -ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øJâ¢rêjŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 +ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øZÚrZbŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–># sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦¢'¦ãfü¯êäœíe'×ijÞ ^ú«úò!,lÌ@Q“àx¹ ªy—3µ€ÖßDáµîÂôÄ©;bi¾©õZä7ôÛf]q?Žlcß?‹}…U´YFVg½\BšÃfÁOAœ¾Ý=ðÑP†>b*˜ª¦ ‰¯írß[îEÍÀo]æ7hÍO#Á]ö aOp£Ñ’ݬyÝGÜéÁK² ´dÝŽ½6[ Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâ¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ ®ŽW_hi+yñ¸âÅ‹…† -ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦vY`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦v> endobj 1030 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /NCAJSR+NimbusMonL-ReguObli +/FontName /WXJWBU+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 @@ -10128,7 +10112,7 @@ xÚ¬ .†ÖF #['*€©#ÀúßÀÈÎÖØâŸÒœèÿb 9 Nö&F™¸™Øÿc¢Ø›8ÚX89ýýX8Ì lÿöÀÙ`akdíbüOõ¦vÿJÈÞÑÍ_Û_0;'g'#G {gÀߨ ¢bÿÎÓÙÜÀùŸØNÍ;Ó¿žÆvF.ÿ”ô/Û_˜¿Vg ['€³‰»ó?± MÆNöÖcÿ³w´øW.N¶fÿ•-ÀÑÄÌÀÑØÚÄÉé/Ì_ìºó_uþ·ê ìí­=þuÚî_^ÿ+ g'kSz&æ¿1œÿÆ6³°…aøgP$mMíLŒÿÖ»ØÿO›«‰ã¿DùÏÌPýMÂÀØÎÖÚ`lb à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;ÿ^0€¿Æ øgÇüÿ| l,¬=þÞÿé¨fòï ÿO ’ÎÛ dkö— -FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒœ¬²œš,ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T +FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒ¼ˆ¤¦”(ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè @@ -10197,7 +10181,7 @@ F šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸ ^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD -­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öAÄ÷¹endstream +­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öw÷›endstream endobj 955 0 obj << /Type /Font @@ -10206,14 +10190,14 @@ endobj /FirstChar 34 /LastChar 125 /Widths 2153 0 R -/BaseFont /NMTNWM+NimbusMonL-Bold +/BaseFont /OCIZJD+NimbusMonL-Bold /FontDescriptor 953 0 R >> endobj 953 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /NMTNWM+NimbusMonL-Bold +/FontName /OCIZJD+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 @@ -10234,88 +10218,93 @@ endobj >> stream xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd[;wsS3'¥š² íYþ ütÿŸž¿™Žæ¦6ò¿.@+[;k Ó_ˆÿëD àd˜˜[" -ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î «¨.%+BóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õ߶Fö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPߧ;X`®ž¨üH\ -üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ -쿵$ œÉ„®'~»¦ìw 󬵮¦~íCÊ]™Qê,©wmÚ'c¤ w®Diµs$óÐY–1¾—f‡ÙÄ&>.jüäë賬9“5ÎÕu¨ÍÄV¤?m=Á8ib/4l¼˜’lºÖ’Ÿ$):Srïð¹ŒtéÇ#/sƒydŠü¡ _•vÏÐX¢ÖÙ"» ú”4Ú]Ô†Üf†·”-FêÕˆFG‚„ùs!kt> -j8+¼="HOló‰à|V”LôIŽÅ_y·1A‘T5dSoEy%|Dm3N†Á‡P¥{ú¼ÞÆÙˆ -šÔ0ã#¢DËFwˆ(¤ ÙÓ§~¾f%ž©Y·˜"<Ø™Él¶‹Ç¹ÿúä2Ý©²HˆîKöÿ¢Õê’2|Cu˜Äï4‡ÙbIYY`AýÝ«!ðc* w¡)óÊ~#†!åÌDŠ¹p¼šÖ™(bðÆ%łߪÇ4òsœ.劎^Ëú0ª†'> -dÇ$[ß4˜h3iï*#§†]Y·6_¡$l¥—\5Š´ -ÖƒGÒgÏt7êz \ÄØSÂèÑÝá Kz¬Å~»šF£¦s>y{­)ÕCóaÑýû²Ú7× Ý#ÓF¾o¯Q2v3äòÔן¼xÒ¾#x9s¬(ÃÇÊÒ÷öUX7Žqb‘ŠŒHö;QºÙö³ˆÊëí:²5p,sÍŠ˜VÚÜýXQý3j .jWô…¼¬[Ç2#oîä2’«²6¢£yé0O ÙÓËø8³)Kz¡l„ïzä^骟|‚gOH)àY îó¸¢e¾,Ùê›Ì,ðŒ‚þ²Êsźy&Ê⥄ñϤì*“@bKiyäúk@WÁ»¾/ÿë÷îÆ5 Ï##êáù@¹‡ŽRƒ;ÇË6ÈV|¶å9{<)¼ç QU+ó؉¬@"9ãå·¾9Ì-–†Æ¬»î³ØŽÈ³¼…„e†t Y.ž±áWËÔÀ;žš¹„PfÙWÐBNûŠX÷a|nÓd5ÕR©¡Ûo÷¿]fǧ_$¿å0[^ž‚IpƒVzrEÄsÜó^Á¤ÑÏJó„½Ë®Ïô—qŠž€3«Çþt¿ipôøɼïÆ/ÑøµÑ7d™§©M’°{<1†/ß{€"Ãg'”Dnnë«J0 VkÜ„},j6ä²6”ª ’nå'Ž`gâ[ö -õ Ò””d³3þˆA*ú<ì;»ãçëȈÏÞr‘U¦Ξƒ ¸R64yEIÝ#ب[@“4ÂS»Ð¯«±÷è(pÖg/ä/ÄX»ÐÖ@­Å»b¾äcŠÅIî n¿¿„îçç3Ã"çU=^ó»\XºwV¯”¡ûB:Ï‘ -[—ÒØ$ ´zEø}:µ`s(éHô‚Å+X—³÷¶*5Â^ÁmøÆÊ$¶ïÉéGH ->êò:Û†ç-àñwN‰ -3“7º]Ç }"}xt¿-i7Ÿè¹½‚• -üƉ¾ÏÑüІž@S&_#‰= ]Œ% ešPŠ†¼RŽ”oQÈJt{¸œñàº0ê8&ò½A"zXXª‰„^i$º@õÁh0škm}…“u­@îK/²OÊ\®zOóu#«"ùÈR.¯AÇ„ŠòÙôÐJ©4I°muþ`*?섨0­V2×~„/ŽZ.&òÂ×Ñ_ݼÇa)¼<¯l ‹¤ab˜wK¿ð[p…*¿–ªì˜F°_z¡>ôÿ-p¾þmQÌHtðFЇt½® ·Ð[Cr:Îæ'w|…ôSoñ;ÕdȇkM*a1eˆƒS¢ß%!¹J-¢¤tXäÖ’´–šBÎuÞ/ -p‡÷/ó¢nD(0ÂDã ,q®R5Î@¨)µŠ ö|÷ò¤ºÛ\{=÷5¯ãƒ8zB uyÚ£e4O랊u¼z.©2Êqi¼ûTœ°,³Õ¸¼[¡~o$n{Ìq³¦×·1åŠ|…²Ï!§-4`f‘ך¹ïPÛ¹Ui«í!3ÏpN"LnR‰ôAQ“!ÄùðíSÆŽËî1ÕÔ9PƒoHT7-÷dâz7/ÉÐ÷3¯vU~2‰áW3Ýk"XŸ&¾L;Ï´Ö¾s°˜9¿O'`u?‹¶Ôi„ØCBs®Q‘ô±…ñ"¯Ïæ˜L#ÈÝœÿì UüÒ¹ùeŸáS©Ù_§Ó¢ªîÑ _e(ò~ ¾áÚÈÙ¼ßÕt2ƒÄI]Õ× Éuûͺ›WV>{€º^7¬K·ƒ9@3¤uÜq¿¯ØŒM(ÕAfW$ùÑ>Ž¢róÕõ'Üt*®IkÒæ·&„óÎãÔ£yù„2¦§äº VБÇ/êÀp4¹‡èT›ïwnÚuŠêæÔgW«È$&¥é®&tÏ„ZgqÙÇCȇŒ† ßðéårüc­ŽMÔEÇ×çÔkâÓåLÁG1‹^­?z&É ¢2™"«….^R,• ÀÜ ndAU]l$þôº<¤q Já9 [Rèç+œ„$E˜b…†F΂dù#ÕÒéËYûV·"r†Š}cà’³$#QZ0 ãû‡H„f¡ª÷›v«±*øöç9ꞧÇ)$¥!€4%J)Æ«B¡(kèè^«£ Œ¢K"ôŒÖIQ§.¾É°UDBó€â¼HÛHzõV¢’éç5柑&xã>fé.j/O§Î5$8žÔÎÅ òíÊ°¿_ëqv–'´#zÑÚfs -[Õ%:P+t¦*5Gil@ÐvmY‘ ‚œÁ‰~¦S JÖjn5£ë—ðys¬Ø0ÒÉð¹¼tOC»¯‰æ÷­™ÄiÐDX¯ÐåpÖïÆÎl¶TS†ffe2·©iB>²ˆÜKmV3 ·ï¬I‰Àq>ü€~y ±z‘ô&VQ|!æ 쨯tàZ…)"¡ ?ëzÁ4%vïù2<€ºµ—ÊŠ¶ÍìA 6hä挑ÿ>„ŒÔxZÜ5&R'!Ö§•gÜ…«¢ú½s’+ÔCÐ[ØÄx›)½ºo -Ù¿®;ªôŠD™r]9@èšÌˆ“ÖS|æ[Û, ('|f¤~}Ã!Ónëw¦©®n”Š\8ÖgK½Uz:'=*"Ô›%FWHO´­Ú³ÒèÒõÖDÐ_|ÌÎ\ê\Û -qá‚ú a¾ýGŸºî“•e -™âîÑ~)Ü“U‚™$¹ß“ñA=‡C“ü‘:³œW•Pv Æû§hbÖ¼ð»AàlmoÎUÁùË7…¹í \~3È -ÂÏå±äÑs‰TNŸ +Ã<ˆ•9O¶¥fÈËDˆF§‹ÑÉöY廙l›¸·°6¿33ïáð\1ôb° a÷ Á{ó|³m«é*Ê›}½"é?Yš,µÔ¹‹ e§úPh‹ŽŸXEô¸º\©çÜ[ëgøV3C^à ±çSø¥$š ƒÛáÃ:“É»®’´ ð¾ˆïÅ^ƒÑÁ´‹¶ù´ë¬†)à!jáìKøGR~ŽCkCœùŒBΔí!$ÐdÕˆV`¨­\ ©n¿»Gó§æHðnê Úïvœ&ëÌŠ":—íÞÕ^"Æ;bÊz³N¾0UÅÕ–ûÖ1ÃÁ,Ծ㢫|7ßoV};º:Mý³éØc£ôÂà¤=™MhüCÔgaì‘7¨²Âˆ±b®5_¡·¸/ H:L« >r>Õ²"™y£6o„Aù±RQ ¼“_;N\¾L©µá%7¸àÀ‘¾g$µc [ž Ü80›=~Øü.¥T¿†ñ¥™^šW`/ž$8¢%S>ô”æý XÞ$'ñ.ά¡¥„2Éÿoƒã;At«!Äò‚´žÖ&\Åžã™dn£˜kjÓ¥³< -YRç˜oiæUìÚÆ‘ÌY Kî%?ê5TXrz¶ë[È/¨£=gU0‰Ü„€UShW´1ûºzcw™>ÔXê1§†S\»²3Š‘ÎBaʉ@,ŒëÂ?/ßu3u¤ð;…®MXÛ;Í0¾z“ƒE9–T¨ÕÖ[x,ÐÏsô1Æ÷Ìó–Q£×©VNcÌ…ËrÖs,¨ ³“eeµ‚l€N0j—;î~÷–ê2›ZoºäÆ JR¸¬ Ý.nìÿ¦ÏR(šF½qqIéì{7¸–lƒ%Jåíi6.’±ñNJ„µ­~d¢Jă÷^Oß«Ñ É s!¨kgw%¼¤ó_†©ë -??zÜ…¤Ÿ'PìE¶e6¹-Vƒú£ò>áÂPe†–½Í•Gèf5©{AuÔ¦JÑø^V¡ÌP -:Ù‰4GÌCe*Z­:?ß"íÖŠS$`ë¾*~=QîFf†£¾d5 ?Užaú9v¢÷"“T!KÈ õð;[ùÛCµÛ²Ñä$|É•ÿ#]±·,ÄgåÂc>t- ƒôÏ/c!Ö’&,î—AØ$l‹ˆ4`¿Ì™é„G ‘9h{±I K­àôáî·3ÂF£Ýйô±Peûw - 8ø=ÇC¦ñÙ"ê®ÒL¨ì:0%»¸vÕ´HƒŒ?˜ø¾âù¢õ3™VF _?Òí)Û÷³qoTŒ²>ô£‚ùvî[±~á+Ó ñ¢øøhÂ…ª>çV©Ã{‰iÜÁɾ,ÓPhF°1J4‘÷Ò.’×l"üˆæ ¿D9TäÝ!°hjky~ÒHTòövd@X|A¼ —Õò/²áxxûfÙ z¸|ÁV§Om×¾SD*gi[‹4i p¯—ðƒ½ÐØv )ilPcΙŒ€~9¤Í^-P>½•Sø¢ªÖ_Ñ:v}¼ú‰ ø9#}hçp‘à;‡¾¢~¶&í@»Âªž$ûòYéØsE6ýPÈ¿Dpñˆò϶J úy·#“Ø'PG ‡ãŒY9ÇçzÖïIE ç©_¿+Pììk.Âî+çpnT+ ±µÇ1*#Xd4-.¹.f(܌̠n{Sš©|ãPtw90¿Ì§­ã=tÜr•xÿ’Yñ©Õa…@.i¾™?#E¬4*872lºGÝ›ü”òóÕƒ¹óšAúa§¢+lµh ›¹cÿ[ÅU‚·_Q'ï–íMÇ7&U6æØ‹{tÍ3_ŸÔ_óerˆ$q¿E½â>$zr,¾.ÄBËëDÒ‰ú@û‡ÍDü”Ä­wPL+w1xàKDTjã_žKU÷‡Š¿÷ðN€úè±=©C; ]‹‰ØÑ\z©r¸úÕ~ÈK*¼Æf:²}䥳ý]°¤Bu›B<+2¦ø¥Ø×Iÿ§½²¿S©ôûü¨·zM­<ƒïˆn1•ùu›Ó÷^Vú#:.æ?¿yÙž®ïµá§ðƒ£|`q^ Iš©åâ:kÓãZFMd§Í‡ˆ¨><…÷Å4I)'16TØ͆Nß°`‹ð` [€r óz‡ÅÜl8±§ ’¹Ll[@Æh_ëí; Hk¢ÉjLÁf'‘Ö%З&så@µTýb[Ojöß 0®šm-Z‡µ<"ÂVç­wSp#H¸Í°ÿ,3L\g*±Ý¾–Ýçpg¡’^uІªH%a€ÃuQlàÎZK‡B£vHÕqe·lAW`¬úÑ–îxüFÁŽ¸“Õ7º¼Î IhB($y{³ÓËòMSô~¥ã # Z|Ѻ6Æ×c>ÁB’Y”ï‚*¤ÓµEkèið„ûܲ²ê6ë#¥ÊxNÛµqqŠ®k%:ЂÃÏý0{Â4Û¤8¿ŸJØTá‡ð~UâjçµDg,Vå|ÌÙ)îmÛ ÁÎ n$;ùâßÎWûË)6{ô2÷Å1§ßÿ2_Q.4ÓZxWG)ûqŠ·óGŠõ{RÜh¯ºÎW¦ãrzÞõÈÐKËDä]Üw¹Qöº¯G…\å# n—ë{aæÆŸð»Â¯U"¨k;`aEw}øŽ¦¢´Äætf µŒu &ßéæsÜk¶Qk¥pxNšnL’v’Ô(|)²FðcˆÇY£0c…‚Ø0cX{Ò}hƒ¸eÐúƒKŸ:†ohÁhdYÔ}îw¼Vj¾]½¹cû¦wní†PžQY@V)[7ôU5:Ò³ûÑ 7k"%W¥v3<ú[j¬ån–E¿kƒœm»ŠìŸ×—´[™Ý%I¤@DZrbÑll¯azQ?ÍüŽÂævFúµg. P³e†¼x€ÉôHý‚€#j(hôÄEÕÑ7z,œB-»§óÎ…5E«›}~i›“;e€b9i«À9úHðêùÚ§7~ Êã>OöᙯµÒ+7¿Ë„8Xu@HáÐG§6¤'Q{—ªß/R2§o´D^ÒEœ (¸ü,¯TcÏ©ÆìȽã‚Z]iÚXçKâ Ó«¦ŒÜ„Y¼ý}ÉkwïPï <{.ÏÓ™O .õÔ‚Äñ|Ÿoh£‹êÙÕ†4ü&Æ ÊÌŸ¢RÚ±¡™Hõš‰ wó½é2)B­…‹·†ª"Ú7cHЭŽ8º̧\tøºlg%Ijð«]R˼a\nÝ8†÷¿ú³à!V#RÎ96áw¥1K©DŠŒ?VäÃÍBD\w.UȇH·:Êæ·7Ä­‰ö‘gBrny)A½Á4k1H´?ëÉà$œNŲ!ÉZS†^0yVÖldlƒËä~~;Þ¿g;¡Ð\ÚaæôK¾L‚ùõÛÛ“½O’l»,© ¿™[§ -¢ðBîBZYø ¡QÚ÷¥Ä:_}ÒbeÚ*r³9ò”¯Ô¿åÏ{ݘéËáªÝ]1÷WšeÂ…5âo#”‰Nb… ¨ô>¶ïÓAÎì·¼žíÉzàá]M¸Q»„)ˆ'°&má"²‡8øg+Gž‹-¯ðJÁÙ¶(!‚d%šò÷F¨é’‹Íü0ÓK^žŒð §.Úf9Õºi"‚Bœ‘תÂh‚0æ£Þ·/Dž¿V™¹6j©Û̇‡o— -_0ß9ø™Ü®Á³@3&i ¯)BBD‚Òr8ª¯sÿ’¶þø¶6ù5EåÇÁ‡›3§ŸÒûišI©R«‹ª]S¯Ðeÿzý!KþãÑÑÛ7çÙ96@:áO´ˆE(Q`¡W¡ÐêgÉCIචœ7·@ªÁ×N~ðOÎÏL ÔšîÑ„6t>æ€ñtFt&QòŒõk©ú¡Ì: ZBw˜0.•Ö -X˜DöBà矉uƒRá±êëŒãù³"‹‡»½øS,VëUgÈÓÑ×Hë‡ Ö•Ø®ôh3ßõ½@gYa°«¯ÃK}\)ÚÖ„èoô}7dÔ{Â+ä’רþ‘ǟúiæpC8[bk%u‘I0: ]¯úíŽI*]¬NꌕԲî<'âÌ€Dq¥1öYßþù4ˆù;4Ù´Ô˜¥^ðžöE›:ãZ”¢‡ÖãßhSÁÒ"”‘æeGq ¿¸ú‚Ò®ˆ÷ñ"‰v=}ç¾ÌÅ%ű;>RÕw´ºÊuú)DãPèñåVÂ-{ i¢87£rC ~zIu(a=/åÓ`éÇ -`JVæ€ÝM?Ë-*\šFì\q¬w÷4³Ç"Ây'LÜi æI²úвTxÝCxEåÇ7#Í=䬯šÐ]ÏÂ)9™šj^wpŸiuØ•°I/9c½šÙ;ˆ†YÂV%íÇ’:ðgEFÙÒ·O(–qS”•=ŽM.A¥ó¾5Æ·ôŸ·¸PF×/ *ÝXåï·Dê,oö°`ÐO„&ÄÓú1¢ç)ã”au§4‚x­¦"ô£šVKnþ?af¿½ðÒâº-©Þ(äM×4jý€‘âª[ Âx06Ä–3± ÊbV®gG¬$¨ˆX”£þÙ]0ML]B@! !k“ö'9iH„%7ØdÇýý³ê«VÂiH€ð‹Lêõº «§ÜTÉMÓ´1=1TäöÅ¢ÕæûH&LÏ5« "ŒúÞ¶jªÏa1¾5e‘ׯŠ9³dfƒC|—fS}½Á¢^3²Ry€!©ìcÊ^Ù±•CyÞ>æäŸGY›µöLˆ²Í+ðüw…¯‰‡›]E™†ÏIœº#½Á”“W¿ig/€¶0@hçnlÊäª5Áç®ýF6PI¥pKˆÈKUëqßoÁÎJôƒED=§É*óS½PlBø±a` -^ñ2Ý9á4GÌMdHä:a,h&y að;!Ù$õÖaÖ8|Z2ÃdÞ‹J‰Óc—…6‘Ñ}Äu"åÈÄ7)õ)ÚÞ”L#mõ0n—Ü^žÇl¡~c[øïz¡AèÖЕ–êÍ™qùÐEm)PF½÷¢xŠÔ–ŒisØ€ç³D6 &œ<ÝÍYï’Úl¥ç¬œs·ÚCò£ypKWFsš£jƒ“ÃÉs ÈÚË~ -¸š4?æ·q|CÇÂ[9ËÞnÑŽ¯U…”kCWvܾOøHB ÔfGpÊñ¦Ú™uw"£Û¬‘M+<ÂREÍœËâ`Ôщ) SßêÓk3—ÌŒÊy‰m:ãs‚êf“Bܲþà ĨÙþ†¨4ÃJ´§ ¹=µ¬l%Ž»Wa*ÂÎK6#º=\{œ˜{áÒBz[òaey}1i%œ1ˆpÊeDNi±`à6^¥ -“V-Á …ê©>Zw>î^’:ðëÖ£,AÎó=a¼PP?N}“­8s3zxC4-áÙ'Ð@¢¯Äa0½ÌåŠ&vù& Ê«¹jÐ-OB;ó¹bîAl/­äÝÈ»÷ #o«²#yÁ?.¶Üè© ®Ï² -sf"7íȘ'z½½Aܬù;˜-Ø„º5½ŸPoö’RnÃã—§cÄ­d>­Õ‚ëmOévXš}Ý…["äC»Îµš Ú·ñfº ?jÊ…Šs$!ϧmAb÷yg‘Õ3–ã¾ú©Ÿ™ì‰YÊIÚÓjû[«Òaî ë—e·Ù{/ûÀjÂé‰õÙÊZXÀüì˜à äa.ð–Ïæ\àß›¶üؼ¾~ ê¶Éþ¶ü5öZ š‘X’oJQ˜iOÎãÅ[=Z)é!³»&ç–ÃîIëBå\Ý;»"B7›§ c)Œ—†Þa%ó‡ŸTÚÅLn_´´i·‘c•udg/U†Å=7 -BÎA>ȨÅt»î„ÞñMt7¡Š:»ùœ=2>ï((Ÿ!{GÅo’8DiåGÍlœ ÊãVÍÒUŒÖº‘jÜ”Õíë -ÞÐõ)δ¨ŠP=¥ŠúçÇ ºÚiÓNRŠÓ€„™m:ô¹¾@1??¡– ­”x!MÕT•ÛŸAsË•-&I˜·ö@ãݪƒêE!F_Õç5²î´ÛT² «ô±.è-ó°{m”´YÐßžëÈC&ÐöºoÕ¬ìêW5iø·Š ¹Ž–ðûï~dÏFœöN{uÍUg¿a`BFtCÙ¾VØ-¯Vâe*ï@ì @uòQµ ä8L°4§2Ir©¶Ð“†¤o§¿Ù §¥ëÁIÆtPÕ'ÆiÎâsëŽÉÇTЃF`Þ™0Úu­5hJ»½ Ù‡,KíÜкÔP¡f|éO7§Hf|dÑr^kç Žß¼¥'@>¢íð@‘…„—Ä”ÄÄJÄÞ¿Ý>3„Œµ¬èZˆ›Ù¡R^XÚ9ÈÍjÕy0”Nš¯s„gA‚îWˆ™[Uú £™2õÞzבl‡KØ6`ñ -î†Å×°æËùß'™+¹O?àªH‡q@…ÑQœÙ–l.vk -3Ô+¸Gç Q@CX <¢â*î>Ö‰?7ëÝSY±ƒ°±÷a~ü¨=j ºíd„¾‚þÔ‘"Ød±ÊUU;•ÞÆrÝJéŒ$AøZ©uëÎñ³‰W´Bšgûû±wæp'Øbû5莵Ë#—½ë ¿É¥M!¹q¼V@«ßÂ=¼8жœÃñ!r1†À`^6]ÈÊü«o†c\'7 V;:šb˜€™Sì -…eȤ½øÛ ]Ûq};—¼¿ý%W[J¨÷¡¼–Þè aÁþ[Ò-@^ŸFðGH¿ ìÏÈÜ°<·eÕ@wô¨‰Îy«(‘«xd;{”«‰U¸otÁªDÕL -˜ªˆÍ|Îóp—aÜ^§9Lî÷‹¥¨`=1OþLˆq‡p–*ÃsqÇwŸÚOuØÝã-ôõ•)D©Û¹(ÕDIÅ,$¬ßÌ÷!›xŠt¾+’V‚Zä\õ‰ØÑk‡¥ vÜå# âiÑò2œK³ÈÖ–ª·K ?žfÁ_ ž`á—À§,‡h@cÄÏÙ›‰„œ#¦å[àŒ‘æÈÝŒ‘IágWà^2/Œýäoö9œóê¹ÜüŒða yƒ?wR"”S;¦ÇG^ˆø3ðÙ»¥%3œj˺Ø&B–#vàXÂÃÇpçŽ7†.arï«ö •íWÓ~ j¤gb‹]ª6ɵvô±A` Û·ŽîB s8<«ò齓O`«ç( &»Rð¼ÕSÐó–=Ãê‘1ßì¼Û#ûžB6&L`¦­k7èT™7„,uxæ}ëåÊ{!,¯&šª‚i»FB6˜3=…ÎÀùÞþì…æe£Qµ5'ØŒ™Þ+ò@3îàœ•öÝÔÙÏ£’â»Ûö_:`n?ãô`}ò4 T躉l¶}™=aC,I‚#«&‘Ü÷Ó_rlïyÅ–$S—‡—8•í–æ æý©ŠV7Wo¿ßγœ'“éžÁ©Z [ÆN«éaîÓó'¨5ˆé´ìiU÷ç+3=;– ov –ç 8\ õäñ›V†Ã4¼@jãÖ)ãì±Ü>ÒíªO+^xN¼s—]Ž»(¿ïi¥™¡ì §±,¡ÝèAÒãÍúŸŽVjóºb,ÇnåCæWä¾E ±k‘ -^ú”ãh@RÄfíÁ•6—U -×qóp&+yPå°1¦àÙÂ¥å Xˆ|¿ð$6Uç»’ÄŽ¸%¼ûm'v»!†æ^™íç Åä.°¥6q2Œ\õº«CÛ7E.ÄÔ—¨lwBÂæ8=÷_so09Fµtéf²ÅoÊRaáÜJýèb;†xŸ)ォG œþW¤ÈùQw¤ØØV„K˜7µºy$•o5MåÐà,=²æ_³4¥ñ3ž•÷°Ÿ -áB«¦¨Û$EZk°`ë¥Y 5qÁ[œù¥ëÂF… :ÁƒN„´®jîܨ€›JV[‘ -ü™±8Ébº¢¾9àѲœ&Â&9 h°¼§!`Z„ù“½M$¨'Ì é·Ç ˆ‰b|ö]·[EÍ\çtHL”.=MSeî{F"ä(ËfIÜ -ˆ4ƬÆx»ák&ªˆü• “KѡڪƎ5soõUKæU6Û‹m™³Ó<{WûFgsü2‘“+tëÑɇ¡ˆ§Ç—–Fë¹mù¨ö9¥ûŒí¬ ( Q«¿˜?©Fߧ$‹OÌr?ãZJŠM¿{m9ùœÄ1+É°‡!¨Ú‚§¨næòY:ŸAÈ‹Wv¿ ˜iq“~ˆRŠ:²«ª j½¤©Gc„ËZÐètúœùyF6¾K*Û[HzÒ§ib·I þhŠÕ‘¿tîÈøhbþàáDëÊ0Žñ/—Í• W L|õ)ä™Ê~¸Ã$|hæ¼)½ü'CZHsöfW^È¡µ „u™§™êÄð‰¼—9*ÙËŒÝÏO´Oý bDòÎ7Ž¶³B ­DÖD3]‰xécFb\“4“ï› O`É@®0{”X«V%Üq7j·6Ç„ŒìÏõ¼Âør¶µ¦§@Üt,«"2ðÏǹ.Š­Ý§ã7‹ø£¯šr°>C;–wD72Ð AvIlU&m¡•˜E4Ù(`ý[wZQ3‡Ùµoœ'é†zDŒdØ'ü#mø Ͻç[Ü#ñ™‰.i¡®îñϲzåª}:K-òÐm(¤²“™º>ÍÝ0«l7á¯r†Ûì%óÙSï)?ú±ãR™Â—wv“iQ— øð`gcÜabO©_7d@ Óq¿" ™%qtÍGJ߃Ù56榑û¶5ù|[!Ä”L{ü÷ß_é$£½—zø[HŠëNκü-ÅÉEn4«Ržú˜‹¨ç£”v”bRŒiº& åõ8æz Ü®ºˆA¨.Ó}:pc“%„9¶³C@Ã×vt|jâ0òFóðÛqò¨|jùŠƒÊá~·l–‡kàVÞ5-¯$Ý3ð`z—º¨Ùû…>F½IÜÝJ² ? =q/ ØîAÏb“~Xc„\9+&•óEµ‡w)³SOS>}Sl´;#5(î=:·qøO\ᦦDø3ÖF@rTôÙoÈ'É@'áÛ¨9o;=Ò«M!±ë{2‡JÕöhU5ŒGÊÇÅúÔr–Ùèjšíê–uÀ@Ætáóå•­qW3gPÚž‘õ§/-‰Óî¨~%ŒŽòû‘„¿Fãk Óü§:(™aÿýœßL -íqÃoØ8\"ÉÄø‰m~'8 £Éùª¤\"~Ķº…puX‚8R±·ù;¤‡,qÞ\;1´L AÈ›œ>lϴʘƒš¶ü¸\UÆækèK¬ôó(29÷ðJ3ôûõrï˜O²âåMçÑñBu”蓼!þ*²‰ñØx“–ãfðÔƒªáFb6ä([N£+þe÷#Ìó,+CðÇUÓ3Mcf‘ÐAñn0Ja¸Þ.H”#ÓJ>U³ÂåbFµîV?4™;> -Û Ì_÷cvDMÄȺ„‘)˜3,fÅ·„@sž?X³¡˜ò\ªå$@Š$ÈW;ö=W!za(NGv È(èᇓÃY†CõdQ1”On?S9Ç>Oµ -dõ›#. -óÕu«ðaxÍ'¢T´Æ49¿} -„¹ƒ°yeàêÙÔSYãæœjî×]…)Å’ÀY¡vSWòÀ­¢ÒGÕîUê£ ãþh4× ¯DTÚè¢Ë ¾ŠŒ}dœœ'.ßñ»c)sùÂ4E©”€cr'L’q!2XdêFÒ±!NMi€âñ¢ÂdÖ |H—^ÉuÞõ“ù¦?aÈísNfBèÈ(û;Ÿ>§[Q-„- ï$àKor§ËûI’;G¸],˜úJâAžXÚ€àvÞ9g•0žh}[ü £Å‹—T€%/WHþî×Dªÿ~Å!¬„ŒµWJQ;dZUüÁˆo 7êU ‰iT†dGà!y×"?αLÛuº·Ô~¡šŒ{U#[Ö÷g_SÚ®s·ßñs=„Ñý}Ž´þ^W@ƒ¨IÙ9¼£ýè@‡}Ó$0_>)’¤Èz®Ep,—ðóõ覲üˆì£å"è`06déðµÃ•GѶ`DÅÄÑrß‹èGÃõ¶F´(øLIÓÓ2¨ÄhŒÑ¢syçw-[ý $SŠQévÂÙG0p•|õL ŸûŒM:2ßx¶åÊ®I÷ëžvH…¶ß]„,U5‰eÅæ°LX*º{Œ+—LÊjŸO}«nU²9¸ç\wýÓ/~cÝS4ƒRꩱT.&êò³Í66USQ–‘*·R°l"È÷è;/Z÷«ÁB5OmùǤA– -ÈïQš4Zl’€AÍMNÒ1B.NèL·YÏ¥£ÌÊ©“0d›±)š„¢«ëOØF'Í<I('Ó.DÁ=Œ”³‡pEd­ùØøõmQÜÛÓJ:ëÔs††¥[H3h™7Â6uaÂÈ4UgÊh {V†k|–¶ žd£å4A:kY’(‰®rŒ“JY55b¢L ï¾íV·œ2kÙzÙÛÌ9éúŒðlâÞõa÷xSkðJ–†µä{Út´çŽ[9¦3ñÇk4OÂK8­Ÿçå Û°¨oS3æÈàQÌà~i–¯³•úc"uË-ëe0¶Áÿ6µ¡ÉÞ†ÚÄÜøÊUƒÆï¼à쌪2ئ„T(™˜ž‚è ¡)ÙqìÔn»Fñ±Aò¼Œ -~z#ë6 å˜Mmné©^«ŠÒŽ†y§×ù{?¤¾ó ÃN[„!H-Èâ–‘Ôyúê³Ból«nsªYòU4Mö¤ ©0lÕÜ´~µÇê½æ`¾ü™ñd™ÿÍ%ºŒ(„ïñÃpY0çh^zÑl™dɄ˱½ú¸çðG0Q'[9R3…m4cA¸Ôá÷¹öîY+x‡}Ê)¹ÕV¹„çþìm‚›sÞi -chô„, 3 ‹ ï‘“#•ÃùG ÖÑŠ9$5à »l|ëQλM}ž¥’>‚ÈÔ!¦}™n¿°B=…_½' qŠ=ò¼²D½JQ:|4ù "V&71¢‡»Ê´XGŽÌ˜Û6¸XÉLjðD^«Pìˆ,0ª°>«ÇŒzK „Uê• Á;ð# zJí™ÛG ÃLtåk ­' , 2ýòô™ÏªÍÑk|Õ[~>'}A–ž­h¦M$™O¤{É™™aý|Fo¾á¦›\basmç­‚‹ÝjM߃½€—RÚ·Ž¤`W 5YC¶]Þœ}ËA… IñFÝi„—¤>4Å1 <ÏÜïQ»ÔäJ!¼@ïµ/g”ÆL…˦Xx2¹Z‰—L¤xó¨jZ‹¿•…< ËÍ(癵uèKvÝ%' ¹ä†¡&$XôÕÝevþŒÂ…--kZ"»À¤Kõ.C!5—ÔÖ² NɆ ÅŸ;DrR,çÖ‚ŒQŸ¥Hâ-A(wYœÐ% - ±(ø'E5 Í0Á{'­WÈÐÐlûù 4·Oÿæþk¨ÕÏÙ€œ“æ¬)Tlý¼SM¢ÌºtÙö:ʇOI[|¹,™á -¸} ³i¼<nU·ƒÊ'D†7Òz;%s}S°l<•’y°46Ê–TZ¹eÛ]DÕ\Y¹ñ}˜en|(xèn)<¸ËŒ¢G/Çê‚«þf$'„ƒ":èuë ìðx/’<€Â?‰CòSÁ064qcZŒz¸ÙÝü\! ;‰^ ¼·'PZÖ‰EvdŒ¢bòjGYþ=Ñh/«¹È´®ŸË $8éÈ'kê¼²à -%gsðùB§*÷Ä•TÝþô¶VÔ½~Þgÿ°s-Ãê¾ù¤‡I3ôÀâʨbŠÅ4ZŨǾdzçÏ—à Áç‰÷ø׳ŠX]"ïe‰¥?ÂÛjš…<®ÛsÒfÔAgV+¢ÔŸ8ýdÚ¥_ÜÌl:ɶ™q -L! … a¥,C-CŒ}M¾~šÞƒÔCzâë—ò '|;¦DÜ‹ Ž‹¼”ýû·NsŠŠô c‹Ð9T#qY%%ËGð 0Ù¥*÷f’® -.³ã׋ÏLH]DÒ.½Å¦œÈçûNcxï*ÿÍRŒõjHGmwr$Æ›~üzXÉõ½c7G9±fRpÂÔ›õñ`ç¾/ŽFöøÍ¡Sësöe‘Ä¡ûůjrv±K ±‚º‹—li¬@b Á̧òÓµ¬FÁ§”L¡s¾´_úm\9G›8+¥£XmK‰^γ³æ&„m©œtðÞì]ª_l„Š@O3º] q—ÃX;Ü3œåá› -kƒãåxÄüÁ‡¹C ¥"QPf¦CY_vŠÓÑô|‚ŸŽîdœîÃ: eФÛw‘éûe« VÑê–†P-o‰ ã¶*‚½—€:GçMøŸ¥ÀOr¿/CîlMk[6qÉŠP·eÙ0ÿ¸•Ëzý?TRÈõó·—Ï(ªå8“j$27BjߺÌèÖ–õ¦òãȹÿäâÌ-:N ^TüÚO`bŒvï ×o(<>yýeþðHó‚Tƒƒ2¸¹ÁíåÞ(å2Çæ¬9½³g¦F³Ù å’Ë?q…ÃNßJšPZØcš¹ÔiΑ88›ï…wäD&oô\<朕çÞ‡.'cve‰kÎþšØuôI¡]Èš‡þý+‡¨§Ä ~¸db D:{‹ÛÖq •¢j+˜ZÖ+·?ÜT±æ­ºŸÀÜÀ! -û:%é5¾¯åV¾çu™J°5Jòb´â"2jþä³àí=j¹ òüÅÍ·½OÖ±¼×Ñi¥Réqødoeל}½j(áIaRFT¼‡{°˜Të‰n°‹W÷'½y@,}H5»A¬8ÑLØÑ]ƒ5ævYÛÐD"ßïŽÊDʺ°z¡Ž »z}ð…ˆÇÄ_@ïO>s0<#gr¹ñ´»f!bºÛèÊ5ƒ¢Ã–x¦ÐJÚ./°A>x»! jm–²sÞ7vÁßC}AœíÁ÷}Žn4XìÅVÄés¡%›†¹¢{Pû< ´éÔ Ì7¹d±·ÝÖ.´?²s1‹t¯}¼;¯±Ý½’×Gû»{UÔ.!ó!T-ºž¸9Çݯ~_’*gûkèŽvª»¦$û¦ÝU‰ô¥5Sü¼‘i÷I´Ï(Ô_:$³^‹â»Ù…eÑ\ ¯eÈk#Ü¡ðï…Š íw¿ÆÚæ'È­ÏòãJk-Yc¿ö3A2ûW´ìßßUøäë/5^]ïèø×¢ òÁoÀ&ÇÀÍ/úŸNÜ&ÞÞè\:?Fîö…)«pÈ:RªB¹TŠP¶×ÒªA -¨ïÃÌ'l¿:¦ðè;{3¦Íäeµ—Ä;»¯McÕÒÚ-ÿXON´Â½²ùr0‘õC€ƒºÆ…L9ꉱSWËñÛÖþN2¼‹ÆvÃñ’ýÐ È*ö{ä•k^‡jogÊ"oØÊglÂóIüPÚ}tq(½Ÿ -QCm6õv;1w²ª‡Hk_Êx½xµ™\Q\5“`b?ÛÓE„ÝH¦æX­Ž…äš»^ÁqL]ÙPºÀ³A‚ä£h]hò(0ã»d68ýÀëÓQ/eÃ`Ü›i0ÐñXV£ξ0žzGïZUOdCZ4[J)é?°µDäé*}ï uÒÌ{QýÜÕ‚äÕ_x® -Ê’¸È˜”m€¿™»_–pÛD‹KÅ|iVWeeÀÀ«‰ „lÐÁôÿê4èT0Éëë]Ïd‹;PL¹£¥e!D*%)f­­Ð¾ì {ÄùíÐîòsÃÕ|0ŠLï-ûÈØÀªY‚èZ`ä<Üu´N!ìÆÂçaæ¨ÞôIJE OÕFÚØÙ‚™O¥ì鲟‹„œ*+aB5*êëˆYš0MŽŒ£>ÂãðSΚb¤³(=nìj‘·æÑ4W­ÁÂ-ÕÏ·­_ѱîíô‡Çº™·` î%âg›«ïW‘iІJmøª º¢Ô††ß‘$1½ÑØ“](snr…„L¹Rœ±¹UbµVfn3]ú‘ÛÀáˆÿ3È9ÆTÄk›“¯Bšž«µW¯ôoäˆ9u“lܲ‡vxvèô3Õ ÖÞlQ;, ÿ®w½ß,Öf9z ïï‹?ŽJ¬äl* +pË(ÑMÁ™ž eF×gº‡@‰<·5ð˜MêÍ jmòÏ °ñksŒ]VY:zÅPÆ]•a£¿u_d„‰ê`”]&6ú‚–2#³ëb…S–ä|_'UBÉ9ÇØÔ*+‹©´ËY[–µ²zŽ’w -Áë±(`°1BøÍéÑ÷kL»;B„/ˆ,à  G70“›(Y:¥ö -ùµi¸ŸÔ§îwX\Ÿy=rû„7"¬ˆiÝe6ÕÈý`Cõì¥oØ?g`ÍF朌‹ÀH‹†ò×ÓÕÏ‘`ñ» ‚ƒT~65Î.96,`³xõµôlë Ä\θ;&¦!kÇ×å ÆæÁJôV>ÓÛnQ3­‹c…8¤„½aGãÐ$îÉ(»çf†A*"CÛï}„:¾¹ Ìl{‹7nN^ÐÊ`„påƒå˘ÌV—Ûyþ2>÷{Ή =½"ž;ôl`¦GS=)ÅhhR:ê bÞ°ã}µ;íYÏHey~aN'¡¦o¦NQ»ð%`\ô?G°2™9×Á>ìSŠ¬7…¾»Ù6ò_qÛ§ÍȒΊŽ¤¦vغä.Ù#*Íõ¹²G-–à°Ã~3º½øÕNôdàÐH¬|ò€Ò>I6]ñs˜öüåÛ{ñ7cÌ a8d?‡ÉNV¦æWíûê^ÙŸ\W’é†;ˆwÒ`–v0zA…füA©‰õ§$=›Ò¥˜ÖÒGVöašMŒs*(±Ó8üì¹äô¶^d•àŒ1÷·»s®ÛCºDdq -I¢BŸîÙ¿¿²ÊXãÞLbÁcÔÅã‡Î0¸±hÿŸvæû -‡ðgl2²¹¯u¶¯}gï™™³;dsvÉÙãlBvg”y8;âì…²et)Þ?âýíý¼Ïð„Û!O:hÛDr@Q9Ul:Ø«Táa¯a ..4EÿBÜÖÑôŽŒn†éü -ïÔ2AÆìöâ©eîÛ›Ó¦;»ŠÞ¹‘°!¸„è`Ò]åU-YñÌëŸò¬ùM5ÁF³·&RGßw´+ùûè8šŒÁÈfïyFW OU£wÀº$¾¿@i¼ù9ºùr¹>ÒHÝÂö§õÆe¢Íw{˜¡Ù -,ùÌçÖ6ºþ‘ß‘—§ìä*ƒšA>SxÏå’ò§Oœ•Ãøjäwcâ]o¸‡´×ç?e•é%Iôm ßÞl)·œ?Þ4‹™æI¿´—.¦Äì Ê×AÖŒqh}Ä_J¬Qêõu‘¦ZX´y7³xÄ,i’¸«^飯\µ1) Ík„ÝÅ TÅ>¹Þðô3¥Ÿ¦õ1!}KGf³[ZdɦÚ^Ýs>¶ì¨¹…ç›ý˜“]û·çÁ ~V\Yƒ°ÕæÆÐ¥–tQrÿ=!ën¡¾5ó -b Ýmº¡ýŽþÒéÚŽëÁMyùAãýX W ÜKî(-ëß)¯Tà‰aß½ŸSñÖ*æHGÚàœ° \>|¢<ý(­³Ä¢­pš6>AÈ?!K•úÜû5wv")]mBßþsËäÖ»y¿ˆ~li¨c~Ÿ…Ýu¿û0Î_·÷§n¸>õã³@IIS¡å 0B}?)4ð“ìó ßùöìä]ϧmÍ|—Ýý2žÌÉuf ‹cHéwia3êêùçIRyïX”v*&äaëR¹r}"f>Kèbœ#òF¾¾R>ô•g*("¸AÄv%§U–ݹ°¾ tðî—´"wXÈD Kaë:¦Rô6½fFä’pìï8%/ÁB×lC«ÓùꉛAØ„‹ƒ™ÐȆpñ½ªWfÂDùtËÏÛƒ'qØV>“žÇëîä"9š#÷cõeŠÞ«øüt7–À“rELåÊ1<¯Z  ¡“gÌ^™7…fÖ¶†Î;xzÍ.—½°õ<µ@|˜¾÷º`ÜG¶ÁàÇ¡ÝQ‘ôÁö¥¿XmQ žh?ÝŠd„Zêภw–_ã÷ëÛ“ÌWsƒÚH ãØ´ðÕHPÎ#razoºÚ·¼§,ýÎ{=M¤LÅ;uD«&RVdz»Qò¿£Ài:ü:a‘Ѽr.<Ó!OÍÁãÏcL­ó*ó@ dbzâ2YÌóŒûäð<îº|¯t$âckÖvzÎÌfPW´ DSÄwÞqŸm¦DC\s+v¨ Ò~b¥æg¢=R8+’(%ÖTúL茜m8ÀjñÕ|"Òr˜ü¯C1Ÿt)u+ ºakPâ&2?Ân6ˆ=Aù¹ä?úZ¨içiõêØÛfÄ·âw|šûÚѲiC©ÔŒ€} -ogÓƒ1GC6E®Í]cdv®l}©µžÆÍE*û‚Xí øVr,À8è–>7%×5/ÔQz 6@^î$Æ -Ìkª¸â§hDlU¼v7X}ñÂúZ%fòb+†Î5ƒ;TÅHÿ$IÀÒR.X/+ùeÌö2¸Õ4•õ…6È(z¡ØîõÉìg,Í¢ÛäZ}~û JmÕg(±èe{u›"&Œ›Å?ci¸èàòÝþªxš» P1¡,›%7Ñ9¶£ÍCN„zD²O•EwŒöÐwAöº”\¼ ¥¶¥&†m—}É·åæ5FèHîñÁmÉæåwæµÃØ_ÁÆuIð*Š_7S§êö®B›¹æÑÜíä4žœ¹?B¸ivèÍÊ¢ûÙ‰Ð=ŠTgÜÍÎh QvUKœRŠ¡ÔÛ³=³·*ŸèÌ »ü ÔÚÕ$dno(Î*ˆÍ¥e[­¨þ¶5ÐÛóÁ2¿±¹™eTFXôÑïŽj_â|§Ç9Ú ÆxŽüP$ßB^àâG:ƒÊÊòÎJ£Iÿ—¢baDѦËvwi¬†¹Ã¥Ë•4{ÓÖÓ/mJûW2S‡êrÚS–V¸&•ˆàúZ(^S'2×ä‹’L3:5¨V}JC9ÜÖË”2Jî(>9c·aïj<Ü(ÎQC…6Ç­ X)sSl„öϲژÑ߬n -i¿5xÑ@>,Ïu> w?tiÓ¶0ûôIÏä#%(ù‰ö -©«ˆ|LO†D¨Å÷¦gîÑå¼Þ8vÉC÷I~®O–ÙÍ>mŒáõÞ¢‰‘}‚ -^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹ -Žµrð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg -‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq -oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿÏdßendstream +ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î ,§ª òƒæ?ßÔE)þÕÞIÕÝî/±ÿÑŠœ­ñÿ:üƒ!,lëð¤û{é˜Y8ì r21yÿªý †é¿Îr†Næní¿-32ý«ñÿñû¯“îÀˆÙÙÿ³+*N†6Æ×ëþq9;8üUõ_7þoÃÿóü¯EÝ€Fp«¿mx‚,Ò2Ój±r‡'Eµû{™À‡ƒíJTøUÛöø¦…ípU¼×Ó7Ns¶¹/Ú}ìKSŒöbZQô¤/óñ½I¨ú +P7É;8hôJÓÏ4¢<¯e·!´ØÕv'•”õŠß¡¾Ow°8À\=Qù‘¸ø¡“>Ú!ù¥ÖÇbt¢4‚|«-<=#O<~z¤ê¹ìÛǣɉ…%ãq@$ô³ÏÁÐR«ð §‚JoBÀ»i¿ú$ÔèöÔË##Å%°–}U4Í_³i—}O‚LoàM”slݯüy=?É+”8Í5—ûµîL&æˆÅÛ„?Ø;kI8“ ]O0üvMÙïæYk]MýÚ‡”»02£ÔYRïÚµOÆH7î\‰$ÒjçH桳,,c|/ͳ‰M|\ÔøÉ×Ñ;gYs&kœ«ëP›‰­HÚz‚qÒÄ^hØx#:0%;Øt­%?!IRt¦äÞáséÒG_æóÈùC¾*íž¡±D­³EvAõ)i´»¨ ¹Í o)([ŒÔ‡+!Œ4Ž óçBÖx¨ö×éÀQ†Û–Í·´Š“çALb¸Ù…B ß%5Vy>©•õ_C äåwÍO?Xjb¸ËRˆ¢kŠìßFÆW‘¦³Âxýùb1£ôB:^‘átlØèöÇóžˆ}† -ß´Ç-_†‘À=DMá¢y;3pîÜÇ£àí •"¢œÍ‰pGÄ/çk~ú’DÎv}û Î|è8|ÔpVx{DžØæÁù¬(™è“‹¿ònc‚"©jȦފòJøˆÚfœ ƒ¡J÷ôy¼5Œ³4©aÆGD‰–îQHA²;§Oý|ÍJÑs{+ø}Ÿ£ù-0  <¦L¾F{@ºK4@Ê84;/  y¥)ߢ•èöp9ãÁuaÔqLä z?‚Dô°°Tÿ ½ÒHt<êƒÑ`4×Úú +'ëZ;/€Ü –^dŸ”¹\ ô 0:ŸæëFVEò‘¥0\^ƒŽ å³Ý1wé¡•>Rh’`ÛêüÁT~Ø QaZ­d®ý:<_µ\Lä…5®£¿ºyÃRxy^Ù@I?ÂÄ0ï–~ÿà·à +U~-UÙ1`¿ôB}èÿ[à|ýÛ¢˜‘èþà éz]n¡·†ätœÍOîø +é+¦ÞâwªÉ"=ÖšTÂb.Ê;9§D¿KBr•ZDIé°É¬/$h-5…œë¼_àï_æE݈P`„‰ÆA/Xâ\¥$jœPSj9ìùîåIt·¹özîk^Çqô„êò´GËhžÖ=ëxõ\Se”ãÒx!÷©8aYf«qy·BýÞHÜö˜ãfM¯ocþÊù +eŸCN[hÀÌ"¯5sß¡¶s«ÒVÛBfžáœD(˜Ü¤胢&BˆóáÛ§Œ—=Ü9bª©s ß¨nZîÉÄõn^’¡ïg^í*ªüdïfº×D°>M*|™vži­}ç`1;s~ŸNÀê~m©Ó±‡„æ\£"éc ã9D^ŸÍ1ÿ˜,F»9ÿÙªø¥só=Ê>çR³¿N§EUÝ£¾ÊPäý60|õ‘³9& x¿«é:d=ˆ“ºª¯’!êö9šu96¯¬|öu½nX—n/:s€fHë¸ã~_±›PªƒÍ®Hò£}&Eåæ«ëO¸éT\“Ö¤ÍoMç9œÇ!©Góò eLOÉuA¬¡#_Ôáhr/Щ6ßïÜ:´ëÕÍ©Ï®$V‘ILJÓ]Mèž µÎⲇ  @¾áÓË9äøÇZ›¨6ŠŽ¯7Ï©"Öħ1Ê™‚b½ZôL’ADe2EV ]¼¤X*Aþ8€?¸AÝÈ‚ªºØHüéuyHã”Âs *þ¶¤ÐÏW8=IŠ0Å + œÉò;Fª¥)Ò—³ö­nEä ûÆÀ%g5HF¢´`Æ÷‘1ÌBTï7íVcUðíÏsÔ5#LðÆ}Ì Ó]Ô^žNkHp<¨‹7äÛ!”a¿Ö9âì-OhGô¢µÍæ<¶ªKt VèLUjŽÒ:Ø€ íÚ²"A9ƒýL§@•­ÕÜjF×/áóæX±a¤“á…sy鞆v_Íï[3‰Ó ‰°^¡Ê-à¬ßŒ!œÙl7¨¦ ÍÌÊdnS;Ó>„|d¹—.Ú¬fnßY“ã|ø5ýòbõ"éM¬¢øBÍØ-P_éÀ'´ +S4DB~Öõ‚iJìÞóex1tk/•m›ÙƒlÐÈÍ#ÿ}7©ñ´¸jL¤NB¬O+ϸ WEõ{ç$3W¨† ·°‰ñ6Szuß²]wTé‰2åº +r€Ð5™'­§øÌ·¶YPNøÌHý ú†C¦ÝÖïLS]Ý(…3¹p¬Ï–z«ôtNzTD¨7KŒ:®žh[µg¥Ñ¤ë­‰ ¿ø˜¹Ô¹¶âÂõA?Â}û Ž>uÝ'9*Ë25 ÄÜ£ýR¹'«3Ir¿'ãƒz‡&ù#uf9¯*¡ì@ Œ÷OÑĬyáw‚ÀÙÚÞœ«‚ó—o +s%Ú¸üf„ŸËcÉ£ç ©œ>V† x*sžlKÍ?–‰N£“í³Þ;TÙ6qoam~gfÞÃá¹b:èÅ `Âî ƒ3öæùfÛVÓT”75"úzEÒ²4Yj©sÊNõ Ñ?±Šèqu""¸RϹ·ÖÏð­f†¼ÀA'bϧð!KI4 @·Ã‡u&“w]!&$ià}ߊ½£ƒimói×Y +RÀCÔÂÙ—ð¤ü‡Ö†8ó1…œ)ÛC0H Éª­ÀP[¹@SÝ~w0æOÍ‘àÝÔ´#Þ%ì8MÖ™E +t.Û½«½DŒ/vÄ”õf&|aªŠ«-÷­c†ƒY¨}ÇEWùn¾ß¬úvtÿtšúgÓ±ÇFé…ÁI{>2›Ðø‡¨ÏÂØ#7nPe…cÄ\k¾Boq_„t˜V/|å|ªeE2óFm<Þƒòc):¥¢@y'¿v4œ¸}!™RkÃKnpÁÿ"}ÏHj/Æ*.@¶B™¡áì8³h¨ûÂò0:z$X(q»®%ù9ÞÃX*´ŒEŸ|ÆB¬-$MXÜ/ƒ°I,Ø iÀ~™3Ó &"sÐöb“–ZÁéÃÝog„F#º¡séc¡Êöïpð{Ž‡Lã³EÔ]¥™PÙu`Jvqíªi‘0ñ}ÅóEëg2!­Œ:¾~¤ÛS¶ïgãÞ¨e}èGóíÜ+¶býÂW¦âEñ%,ðÑ„ U |έR †÷Ó¸ ‚“7|Y0¦¡ÐŒ`c”h"ï¥]$¯ÙDøy–¢U”÷³*Ëö;•»°žˆž½X€Vºi<„#ÑÅÒ8ù³‰·5òNéK#Û”îËÏNï‘r®[nXôf$AO"Ý–¸SVµ¼7ê^Y´]VsBe÷ ´g¬KI^¹A5Çr &&# zK½q*Ø" ¥¸ÅS äVOlMš­åV:ìH™/*go¾ |¿Û^B´÷£sä™Í/‚¬¨+“`‡™Dì žº,Âe…9:Cf!3M¯ˆNïxnÀ>9ë·ÞxCaSB$È7{Od¤Ôt †ðˆÍŠcÅø»,Y™B‹áºoÛâUûà¸Í —¢§²Â‡W½`¢ñ"•oû›‹¶»í‹èoœSªÛ>¢UÍAÃo+«îÅ —6/¿es^“Y ?±Py2C™‹ -ÆŒEöÏ´óŸ{.Ô&fÓAÄVUþDØ×™ +´ÂØ÷þÞŒ4à…÷r Å› ‚$Œ¾£Q`ƒ-`¬×ðÇŽMéˆüyÀœJØ ò`’…hQý)*¡ $ˆY +5Ëñò­Àóv3.]”T'‘™×_ìÎ"ÀT'8±ìƒJÕ2,ί„q;§oék9ãñÙ^¼è½þ#±ª‘l VgÈDÝ/tHõÿ¨ÀQ—Œï±<=fYM[=€7 µ¡éPÅ°¯qdt³a³´Ÿ¸®‰ViÉ}Í~‰r¨È ºC`%ÐÔÖòü¤‘ ¨ä=ìíÈ€°ø‚x.«å_dÃñð,öͲ ôpù‚­NŸÛ®}§ˆTÎÒ¶iÒà_/á z¡±íRÒ*Ø Æ 3ýrI›½Z }z+§ðEU-8¬¿¢u6ìú xõ+ðsFúÐÎ3à"Áw}EýlMÚv…U=Iö1ä³Ò±çŠ:lú¡‰àâåŸm•ôònG&±O4 ŽÇ³rŽÏõ¬ß’Š@Î%R¿~W Ø)Ø×\„Ý=VÎáܨVbkcà6æŒ#°ÅóŽùI4MœÑb¸ï=pû{níÒË%ˆfcY¨¬×¿þécaöyqÌÝ1¯Æ ì—n7 +4?äÀYÜéV“yö2RS¨àÆ`{š,#JiHÂâ-ý»€ëbú@ùðsºÄÙÙÇ5NJ;Îið’s7?†™YJÂ’F4TïËý´äb„RêK,k"z’t&¼pwÛkßò1^šDFO²ÌÂ>1Ñk3V¾îÈNŽD{¶æDJ™¼oæà”1•±ææ¯\ÒeÖ/žôG};;’%Ú¨A{½Eì–6¿nn† ê¢Î,%*îp5¤=¾š£Íi +Yت^éιAÈ•Ë5í +Ñaµ+Ë“º±\‹0ïdÅ C´Ð²(Ó©Öצpy§’éÛ …oû x#z–ÓŽú­iÅ6„_´'Æõœ¦?óØ&¢6ºT&V@t½E ­B:3ç|¡7›Ãù)èq‘ y#釪sfWZâH«abzTÆcóY!ë>=ä€Ë„—ö†ÅŒÎF1-Ùòò}\Ò|3GŠXi +TpndØtº7ù)åç«sç/4ƒ8ôÃNE#.VØjÑ6sÇþ·Šª,o¿¢N(Þ-Ú›:ŽoLªḻ9ö8èš?&f¾>©¾*æËäIâ~‹zÅ}HôäX|]ˆ…–5Ö‰¤õö3›‰ø/(‰[ï ˜Vîb6ðÀ—ˆ¨ÔÆ¿<—ªîïáõÑc{R‡vº±£¹ôRåpõ«ý—T6xÍtd=úÈKgû% º`I)„ê6…xVdLñK±¯“þO{e§Ré÷ù+Poõ šZyßÝb*óë6§ï½$¬ôG u\>Ì~ó²=]ÞkÃOáGùÀâ¼’þ4SËÅuÖ¦Ç5´ŒšÈN›Q;|8x +ï‹i’6RNbl¨°› (¾/`Á%àÁ¶åæõ‹¹ÙpbO$s™Ø¶€ŒÑ¾ÖÛw@‘ÖD“Õ˜‚ÍN"­K  &.MæÊj©úŶžÔì¿(`\5ÛZ µ2kyD„ ¬Î[ï*¦à"þFp›aÿ Xf˜¸ÎTb»}-» ÎáÎB%½ 8ê  U‘6J‡(ê¢ØÀµ–…Fíªãʜ؂¯ÀX-ô£-Ýñø>‚q'«o"ty’ЄP.Hòöf;¦—囦 +èýJÇF@´ø¢umŒ¯Æ8|‚…$³(ßUH§k‹ÖÐÓà ÷¹eeÕmÖGJ•#𠜶k%ââ];$ÖJt ‡Ÿû?`ö„i¶Iq~?•°©Âá/üªÄÕÎk‰ÎX¬Êù˜³SÜÛ¶‚ÜHvòÅ¿¯ö—Slöèeî‹*bN¿ÿe¾¢\h¦µð®ŽRöã +oçë÷¤¸Ñ^u¯LÇåô¼ë‘¡—–‰È/º¸ïr£ìu_ +¹ÊGÜ.×÷ÂÌ?áw…_«DP×vÀÊîúðMEi‰Í;èÌjêL¾ÓÍç¸×l£ÖJáðœ4ݘ$í$©QøRdàdzFaÆ +±aÆ°ö¤ûÐq#Ê õ;–>u ßЂÑȲ¨ûÜ î(x­Ô>|»zsÇöMïÜÚ ¡<£²€*¬R¶nè«jt¤g6ö!;¢nÖDJ®Jí¯/i·2»K’HŽc1äÄ¢):ÙØ^Ãô¢šù…Íí>ŒôkÏ\@¡fË yñ6“é‘úGÔPÐ艋ª£5nôXþ8…ZvOç kŠV7ûüÒ6'wÊÅrÒVrô‘àÔóµOoü@ ”Ç}žìÃ3_k¥Wn~— q°ê€Â¡NmHN¢ö.U¿_¤dNß9h‰¼¤‹8 @Qpù7Y^©Æž7RØ‘{ǵºÒ´±Î—ÄA¦WM¹ ³xûû’×*îÞ¡Þxö\(ž§/2Ÿ@\ꩉãù>#ÞÐFÕ³« iøMŒ”™?E¥´bC3%ê5îæ{ÓeR„Z )o UE4´oÆ :[qt ˜O¹èðuÙÎJ’ÔàW-º¤–yÃ*¸Ü,ºq ï7ô/fÁC¬F¤œslÂïJc–R‰¬È3†›…ˆ¸î*\ª‘nu”Íooˆ[í)0"Ï„äÜòR‚zƒi"ÖbhÖ“ ÀI8ŠeC’µ¦ ½`ò6¬¬ÙÈØ—Éýüv¼ÏvB¡¹†5ÃÌé—|5˜,óë··'{Ÿ$ÿ0Ø vYR~=2·NDá…Ü… ´²ðAC£´ïK‰ t¾ú¤ÅÊ´Uäfsä)_©ËŸ÷º1Ó—ÃU»»bî¯41Ê„ kÄßF(Ä +AQé}lߧ‚>œ'Øoy=Û“õÀ!»šp£v SO`MÚ +ÂEdqðÏVŽ<[^/à•‚³mQB(ÉJ4åïPÓ%›ù5`¦—¼<áN]´ÍrªuÓD…8#¯U…ÑxšŒŸžþØë$@Ñrˆ ¥åpT_ç6þ3$$mýñmmòk ŠÊƒ!7gN?¥÷Ó +4“R¥VU»4¦^¡ËþõúB–üLJ#£·nγsl€tŸh‹P¢ÀB¯B¡1ÔÏ’‡’ÀmA8onTƒ¯üàŸœŸ™@©5Ý£ m>è|Ìãé$Œè8L¢äë×RõC™u´„î0a\*;­A° 0‰ì…ÀÏ?'ê=¤†CcÕ×ÇógEw{ñ§X<¬Ö«Î§¢¯‘Ö/¬+±]éÐf¾ë{Î"²Â.`W_‡—ú¸R2´  ¬ ÑßèûnȨ÷„W:È%¯Qý#?‡uÓÌá†8p¶ÄÖKê"“`t@ º^õÛ“TºXÔ+©eÝy,NÄ™‰âJcì³¾ýóiówh²i©1K½à#<í‹6uƵ(E +¬Ç¿Ñ¦‚¤E(#ÍËŽâ~qõ¥]ïãDí +zúÎ}™‹KŠcw|¤ªïhu•ëôSˆÆ¡ÐãË­„[ö:Ò-DqnFå†üô’êP>Âz^ʧÁÒÀ”¬Ì»›~–[T¸4عâXïîif%ŽE„óN˜¸þÒ:Í“dõ¡#d©ðº+†ðŠÊoFš{ÈY_5¡»$ž…Sr25Õ¼îà>Ó ë°+a“^r8Æz5³w ³„­JÚ%uàÏŠŒ²¥oŸP,ã¦8(+{(š\‚J)æ}kŒné?op¡Œ®_@U<º°4Êßo‰ÔYÞ<ìaÁ ŸMˆ§õcDÏSÆ)ÃêNiñZMEèG5­:—ÜüÂ.Ì{á¥Åu[R½Q0È›®iÔú#ÅU·@„ñ`lˆ-gb”Ŭ\ÏŽXIP'°(Gý³»`š˜º„€B@BÖ&íOrÒKn°ÉŽ‡{ûgÕ.V­„Ó á™ÔëuVO¹©’›¦ic{b¨þÈí‹5D«Í÷‘(L˜žkVADõ½mÕTŸÃb|kÊ"¯=^sfÉ̇ ø.Íþ¦úzƒ D?¼fd¥òCRØÇ”½²c+‡ò¼}ÌÉ? Ž²69>jí™e›W"àùï +.^7=º6Š2#0 Ÿ“8uGzƒ)?&¯~Ó&Î^ma€ÐÎÝØ”ÉUk‚Ï]ûl ’4Já–‘—ªÖã¾ß‚•è‹ˆzN“Uæ§z¡Ø„ðcÃÀ4¼âeºsÂiŽ˜›ÈÈu"ÂXÐ MòÂàwB²Iê­Ã>¬qø´d†É¼•§Ç. m"£ûˆëDÊ!‘‰oRêS´½)™FÚêaÜ.¹½<ÙBý 2ƶðÞ+ôBƒÐ­¡+-Õ›3ãò¡5ŠÚR" :zïEñ>©-Óæ° Îg‰lL8y$º›³Þ%µÙJÏX9?ænµ‡äFóà–®Œæ4GÕ'‡“ç@µ-–ýp5i~Ìoãø†Ž…·r–½Ý¢_« +)׆þ®ì¸}Ÿð‘„¨ÍŽà”ÿâMµ3ëîDþþF·X#›Vx„¥Šš9—ÅÁ¨¢S@§¾Õ§+Öf.;™•óÛtÆçÕÍ&…¸eýÁˆQ³ý Qi†•hOr{jY%ÙJw¯ÂT„—lFt{¸ö81÷(Â¥…ô¶äÃÊòûb2ÒJ8cá”ˈÒbÁÀm¼J&­Z‚A +Õ!R3|´î|ܽ$uà×­GY‚œ æ{Âx¡  ~.œú&[qæfôð†hZ³O D_‰Ã`z™7ÊMìòMA•WsÕ [ž„væsÅÜ!ƒØ^ZÉ»‘wïFÞVeGò‚\l¹ÑS\Ÿeæ"þÌDnÚ‘15Nôz{ƒ¸Yów0[° ukz?¡Þì%¥ +Ü0†Ç/OLj[É|Z«×Ûž<Òí°4ûº ·Dɇvk5A´oã ÌtAÔ” +çHBžO+Ú‚ÄîóÎ"«g,Ç}õS?3Ù³”“´§+Ôö·V¥+ÂÜÖ/'Ên³÷^ö/€Õ…Óÿ곕µ°€ùÙ?"0ÁAÉÃ\(à-ŸÍ¹À/¾7mù±y}ýÔm“ýmùkìµ4#±$ß” +¢0ÓžœÇ‹·z´RÒCfwMÎ-‡Ý ’օʹºwvE:…n6OAÆR . ½Ã Kæÿ>©´‹™Ü¾hiÓn#Ç*ëÈÎ^ª ‹{n„œƒ|Q‹évÝ 5¼ã›ènB uv%ò9{d|ÞQP>CöŽŠß$qˆÒÊšÙ8”Ç­š¥«­u#Õ¸)«Û×¼¡ëSœiQ¡zJõÏA*tµÓ¦¤§ 3;Ûtès-|b~0~B-Z)ñBšª©*·?ƒæ–+[L’0o!ìÆ»UÕ‹B"Œ¾ªÏ5jdÝi·©dVéc]Ð[æa÷Ú(i³ ¿=ב;†L íu߆+YÙÔ¯jÒðoAs-á÷!Þ;ýÈž8íöêš«Î~à 0 À„ +Œè†²}­°[^­ÄÊ"+4´Ÿê°»Ç[èë+SˆR·sQª‰’ŠYHX¿™ïC6ñé|W$­µÈ¹ê1±£×Kì¸ËG4ÄÓ:£å9d8—f‘%¬-Uo—@~<Í‚¿<ÀÂ/OY„рƈŸ²7 9ÿFL!Ë·$À#Í‘»%#“ÂÏ®À!¼d^ûÉßì#r8ç7Ôs¹ùáÃ@óî¤D((§vL¼ñgà³wKKf8Õ–u±M„ ,GìÀ±„#†áÎ7n $\*Âä2Þ Ví/@3*Û¯¦"üÔHÏ Ä»Tm’k7ìècƒÀ¶oÝ…æpxVåÓ{'ŸÀVÏQ@Lv¥ày«§ ç-{†Õ#c¾Ùy·Gö=…lL˜ÀL[×nЩ2oY4êðÌûÖË•÷>BX^M4UÓvŒ„l0gz +ó½ýÙ ÍËF£jkN°3½WäfÜÁ)8+í':º/¨%²+žG%$Åw·í=¾tÀÜ~ÆéÁúäi*¨ÐuÙ>lû2{†X’GVM"¹ï§¿äØÞóŠ-I¦./q*#Ú-ÍÌûS­n®Þ~¿5f58O&Ó=ƒSµ@·ŒVÓÃܧçOPkÓÿ hÙ)&ÒªîÏWfzv,Þ6ì,Ïp¸êÉã7­ ‡ixÔÆ­SÆ;Øc¹}¤ÛUŸV¼ðœxç.»wQ~ßÓJ3CÙNcYB»Ñƒ¤3Æ›õ?­ÔæuÅXŽÝʇÌ®þÈ}‹b×"¼ô)ÿÆ;Ñ€¤ˆÍ +Ú‚+m.'ª®ãæáLVò ÊacL-À³…KË+@±ù~àI mªÎw3$‰/pKx÷ÛNìv þB ͽ2ÛÏA‹É]`Kmâd¹êuW‡¶oŠ\ˆ©/QÙî„„!'Ìqzî¿æÞ`rŒjéÒÍd‹ß”¥ +¹•úÑÅ0v ñ>R0Þ{W8ý34®H‘ó£îH±±­ +—0oj+tóH*ßj<šÊ¡ÁYzdÍ¿f1hJãg<+ïa??Â…VMQ·IŠ´Ö`ÁÖK)²jâ‚·8óK×… +t‚i]ÕܹQ7•¬¶">ø'2cq’ÅuE}sÀ£e9L&„MrÐ`yOCÀ´ó'{›HPO˜ÒoÅø8ì»n·Šš¹Î1è˜(]zš¦ÊÜ÷ŒDÈQ–Í’>¸iŒYñvÃ×LT%ù+0&—¢1BµUkæÞê«–Ì«l +¶Û2g§yö$®ö*Îæøe"'WèÖ£“C N1.-ÖsÛòQí5rJ÷ÛYAQ&¢V1R7Œ¾'NI,Ÿ*˜å~Ƶ”›~÷Úrò9!ˆcV†aCPµO;;PÝÌå³(t>ƒ ¯ì~0Óâ&ý¥tdW)T?&ÔzISÆ—µ Ñéô9óóŒl|—T¶·ô¤+NÓÄn“4üÑ«#éÜ‘ñÑÄüÁÉ֕aã_.›+A¯@™øêSÈ3•'üp‡IøÐÌySzùO ‡´æìÍ®¼Ck;ë2O3Ô‰áy/sT²—»ŸŸhŸúĈäomg…Zˆ­‰fº9ðþÒnjĹ.&i&ß7AŸÀ’\aö(±V­J¸ãnÔœm> ØŸ) þêy…ñålkMO¸éX8VEdàŸs][» NÆoñ3F_ 4å`}†v,ïˆnd ‚ì’تLÚB+;1‹h²QÀú·î´¢f)²kß8OÒ# õ:‰É°*NøG0Úðž{Ï·¸Gâ3]ÒB]ÝãŸeõÊUút–Zä¡ÛQ*He'3u}š&ºaVÙ0nÂ_å · Ø5J泧Þ;R~&ôc5Æ¥:3…/ïì&Ó¢.AðáÁÎƸÃÄžR¿nÈ€¦ã~E2Kâèš”¾³klÌM"÷mkòù¶Bˆ)™öøï¿¿ÓIF{/õð·לuù[Š“‹ÜhV¥<õ!1QÏG)9ì(Å¥ ÒtM ËëqÌõþ¸]%tƒP]¦ûtàÆ&Ks:!lg‡€†)®7ì,èøÔ:Åaäæá·ãäQùÔò=•ÃýnÙ,×À­¼kZ^IºgàÁô.uQ³÷ },Œz“¸»•dA@{â^@±ÝƒžÅ&ýþ°Æ¹rVL*ç‹jïRf§ž¦|ú¦ØhwFjPÜ{tnã𠞸Â1LM‰ðg6þ>¬€ä¨è!³ßO’N·3PsÞvz¤' W›Bb×÷d•ª;ì;Ъ"j7Ž”‹98ô©å,³ÑÕ4ÛÕ-뀌éÂçË+[ã®fΠ´=5"ëO_Z§ÝQýJå÷# ;~Æ×:¦ùOuP2Ãþû9¿™Úã†ß°q¸D’!ˆñÛü"Np G“ó TI¹Düˆmu áê°q¤boówH/Xâ¼¹vbh™‚79}Øži• 0!5mù'p¸ªŒÍ-ÖЗXéçQdrîá•fè÷ëåÞ1ŸdÅ˛Σã…ê(?ÞOCüUd;â±ñ.&- ÆÍ á©UÃ&ÄlÈQ¶œFWü ÊîG˜ç;!:XV†à Ž«¦g.šÆÌ" ƒâÝ`”Âp¼](G¦•|ªf?„ËÄŒjݬ~h2w|¶A™¿îÇ숚ˆ‘u #S0g0XÌŠo æ< ~°fC1å¹TËI€I¯v8ì{0®BôÂPœŽì>@;QÐÃ'‡³ †êÉ2$¢b(ŸÜ~¦r Ž}žjÈê 6G\æ«ëVáÃðšOD©h#Œir ~7úsaóÊÀ?Ô³©§²ÆÍ9Õܯ» +%*RŠ 8$ ²Bí¦®ä[D¥ªÝ«ÔGÆ;üÑh<®^‰¨´ÑE—@$|ûÈ89O\2¾ãw3ÆRæò…iŠR)ÇäN(˜$ âBd ±ÈÔ: ¤cCœšÒÅãE…É<¬)2@5ø.½’ë"¼ë'óMÂÛçœÌ„8 +БQöw>}N·>¢Z[@ß HÀ—ÞäN—÷“$wŽp»X0õ•Äƒ<±´Áí¼sÎ*`<Ñú¶øAF‹/©=J^®üݯ‰TÿýŠCX k¯”¢vÈ´ªøƒßnÔ«Ó¨ ÉŽ:ÁCò®E~$œ-b™¶ëþto©ýB5÷ªF¶¬ïϾ¦´]çnÿ¾ãçz£û-&úiý½®€Q“²sxGûÑû¦I`¾|R$I‘õ\‹àX.áçëÑMdù ØGË7DÐÁ`lÈÒák‡)*¢mÁˆŠ‰£ä¾цëmhQ8ð™’¦;¦eP‰Ñ£EçòÎïZ¶úAI +¦£Ò턳`à*ùê™>÷)›td¾ñlË•]“î×=í +9l¿»YªjËŠÍa™°Tt÷W.™”Õ>/žú„ VݪdspÏ#¸îú§+^üƺ§h¥ÔS-b©\LÔåg› llª¦¢,#Un¥`ÙD2ïÑw^´îWƒ…jžÚòHƒ,ߣ4i´Ø$ƒšš4œ¤c„\œÐ9˜n³žK=F™•S'a&È6cS4 EV×#ž°Nšy’ QN¦]ˆ‚{4)gáŠÈZó±ñëÛ¢¸$¶§”tÖ©ç< K·fÐ2o„mê„‘iª:Ï”)Ðö¬ ×ø,m/@=ÉFËi‚tÖ²$Q."]å+&•²jjÄD™Þ}Û­n38e(Ö²õ²·™s,ÒõáÙĽëÃîñ¦Öà#” +, kÉ÷´éhÏ·.rLgâ×hž„—pZ??ÎË;@·aQÞ¦fÍ‘Á£˜ÁüÒ,_g+õÇDê–[ÖË`lƒÿmjC“½ µ‰¹ñ•«ßyÁÙUe°M ©P21=ÑAC6R²ãxÖ¢Ó»ÌiI˜µnþ¡twÙW|$Ø©Ýv;Œ4âcƒäy.,üôFÖm@Ë1›ÚÜÒS½V%¥ òN)®#ò÷~H}ç†/œ¶CDÞË>K†·Õ04 y\·ç¤Í¨ƒÎ¬VD©?qúÉ´K¿¸!˜Ù6t’m3ã˜B. +ÂJY†Z†ûš|ý4-¼©‡ôÄÖ/äNø&vL‰¸y)û÷oæéÆ¡s¨Fâ²JJ–à!`²K-TîÍ$\ \8fÇ®Ÿ™ºˆ¤]z‹9L9‘Ïÿö4ÆðÞ/Tþ&š¥ëÕŽÛîäHŒ7ýø1ô°’ë{ÇnŽrbÍ¤à„©7ëã!ÀÎ|#^ìñ›C§.Öçì1Ê"‰ >B÷‹=^Õäìb—bu/ÙÒXÄ‚™Oå§kY‚O)™:&Bç|i¿ôÚ¸rŽ:7q.8VJG±Ú–= +¼œggÍMÛR9éà½Ù»T¿Ø6žft»@ã.‡±v¸g8ËÃ7ÖÇËñˆùƒs‡@JE¢ ÌL‡²¾ì§£é-ø?ÝÉ8݇uÊ I·ï*"3 Ò÷ËVA¬¢Õ- ¡Z"ÞÆmU{/)tŽÎ›ð?KŸä~_†ÜÙš Ö¶lâ’¡n˲aþq+—ôú¨¤ë1æo/+žQTËq&ÕHdn„Ô¾u ˜Ñ­-ëMåÇ‘sÿÉÅ™[tœ¼¨øµŸÀÄíÞ®ßPx|òúËüá‘æ/¨-epsƒÛ;ʽQÊeŽÍYszgÏLf²Ê%—â +‡3¾•þ4¡´°Ç4s©Ó(œ#qp6ß ïȈLÞè¹xÌ9ÿ*Ͻ-+\NÆ"ìÊלý 4±ëè“B»5ýû/VQO‰Aüp ÈÄ@ˆtö·­ã*EÕV0µ¬7Vn¸¨bÍ[u?¹CöuJ4,Òk|_Ë­|Ïë2•`k”äÅhÅEdÔ<üÉgÁÛ{Ôrä5ø‹›o{Ÿ¬cy¯£ÓJ¥Ò/âðÉÞ28Ê8®9!úzÕP“¤¨x÷6`1©ÖÝ`¯îOzó€Xú8jvƒXq¢™°£»kÌí²¶¡‰2D¾ß•‰”uaôBAwõúà ‰¿ +€ÞŸ|æ`xFÎärãiwÍBÄt·Ñ9”kE‡-ñL¡•´]^`ƒ|ðv?B@ÕÚ,eç¼oì.9‚¿‡ú‚8ÛƒïûÝ +2h°Ø‹­ˆÓçBJ6 rD÷ öy@hÓ©A˜orÉbo»­]hdçb;é^ûxw^c»{$¯öw÷ª(:©]Bæ?0B¨Zt=qsŽ»_ý¾$UÎö×ÐíT! vMIöM»ªéKk¦øy"Óî“hŸQ¨¿tHg½Å#v³ Ë¢¹(^Ë×"F¸Cáß Úï~µÍO[ŸåÇ•ÖZ²Æ~!íg‚dö¯hÙ¿¿«ðÉ×_j¼ºÞÑñ¯EAåƒß€MŽ›_ô?¸M¼½Ñ¹t~ŒÜ+ì SVáu¤T…r©¡l®¥Uƒ0P;Þ‡™OØ~uLáÑwöÞ5gL›É+Êj/1ˆwv_›Æª¥µ[þ±žœh…{eóåa"ë‡u ™rÔc§®–㶭=üdxí†ã%û¡AUì÷È+×¼ Ô4ÞΔEÞ°•ÏØ„ç“ø¡´ûèâPz?¢†Ú mê"ìvbîdU‘Ö¾”ñzñj3¹¢¸j&ÁÄ~¶§‹»‘LͱZ +É5w½‚'☺²¡tg‚ÉGѺÐäQ`Æ9vÉlpúÿÖ§ÿ¢^ʆÁ.¸7%Ò` ã±¬Fœ}a<õŽÞµªž2Ȇ´h¶”RÒ`k‰ÉÓUúÞê¤/˜÷¢ú¹«É«¿ð\”)$q‘1)Ûÿ~3w¿,ᶉ:—ŠùÒ¬®ÊÊ€W6 Ù ƒé‡~ÕiЩ`’××»žÉ v ˜rGK/ÊBˆTJRÌZ[¡}ÙAöˆóÛ¡Ýå熫"ø`™Þ[þö‘±U1²ѵÀÈyþ¸ëhBØ…ÏÃÌQ)¼é‰e‹@Ÿª"´±³ÿ2ŸJÙÒe5> 9UV„ jTÔ׳4ašG}„Ç᧜5ÅHgQz>ÜØÕ"oÍ£i:,®Zƒ…[ªŸo[¿¢!cÝÛ)èu3oÁÜKÄÏ6W Þ¯"Ó  ”ÚðUAtE© ¿#Ibz£±'»PæÜä + !˜s¥8cs;ªÄj­ÌÜfºô#·Ãÿg:‘s2$Œ©ˆ×6'?^1„4=Wk¯^éßÈsê&Ù¸e;ìðìÐégªA¬½Ù¢vXþ]ïz¿Y¬ÍrôÞ= + Þ?”XÉÙTVà†Q¢›‚3=A(ÊŒ®?Ît??xnkà1›Ô›ÔÚ äŸA`ã×0滬²tôŠ¡Œ»*!ÂFë¾ÈÕÁ(»L lô-eFf×Å +§,Éù¾Nª„8’sŽ±©U WSi—³¶,keõ%ï"‚×cQ:Á`c„†3p› Ò£ïט vv„_Y†)„A(@n`'7)$P²tJíòkÓp? ¨OÝï°¸>ózäö o"DXÓº3Êlª‘ûÁ†êÙKß±6ÎÀš9ŒÌ9‘ 寧«Ÿ#Áâw©üljœ]rlXÀfñêjéÙÖ ˆ¹œqwLLCÖŽ¯ËAŒÍƒ•è­0|¦·Ý¢fZ/Ç +qH {ÃŽÆ¡I<Ü“QvÏÍ ‚TD†¶ßûu|s˜ÙöoÜœ¼ •ÁáÊË—1™­.·óüe|î÷œzzEÝ³Ý U1d•1°Æ½™Ä<‚Ǩ‹Ç/œapbÑþ?íÌ÷?à3ÎÙdds_ël_ûÎÞ;33gwÈæì’³ÇÙ„ì2Î(ópvÄÙ+ +eËè2R¼ÄûÛûyŸ?à ·Cžtж‰ä€¢rªØt°W¨ÂÃ^Ã>\\hŠþ…¸­£éÝ ÓùÞ©e‚ & +ŒÙí?ÄSËÜ·7 ¦Mwv½ r#aCp ÑÁ¤»Ê«Z²â™×?åYó›j‚foM¤Ž¾ïhWò÷%Ñq.4ƒ5ÍÞóŒ®:žªFï€uI|Òxóstóår}¤‘(º…íOëËD›ïö0C³Xò™Ï­mtý#¿#/OÙÉU5ƒ|¦ðžË%åOŸ8+‡!ðÕÈïÆÄ»Þpi¯ÏÊ*ÓK(’èÛ¾½ÙR„n9 ½i3Í“~i/]L‰ÙA•+®ƒ¬-ãÐúˆ¿”X£Ôëë"M3µ°hónf;ñˆYþÒ$qW½ÒG_¹jcR2š×»‹7¨Š}r ¼áègJ?%Lë9bBú<–ŽÌ&f·´È’Mµ½>ºç|lÙQs- +Ï7û1'»öoσAü¬¸²a«Í¡K-é¢äþ{." xÊDï ùÐæI~˹G=Ö±?‚§>Èyüñ°“NÐ%îIß×µ¿è4É^)Oïä¥ç¾®ÁÉ’F°³¥1ŽžzÓ€SÚóJîi¸g_ ~`ñ›1E!ûŽ±Ö]Óhcotí¿AàçUpö„ß*&"-š{~gò&ú{ …rO]ÉOœ…È”[‰„î£-•;J×VAЊü$JJX&Ê×"é 5 +¼ØñÆV¼_±  ’™c€AÆ +€~g´¦™L#ZeöܬðrFVU +¨ì¿öžÓpÇ£†äH¶Õ2Señϵt(å¶õOÖt†Ò[ \„¢73}ñƒça-ø{û9…Ô8‚Ãõa8K<ªä-™£UÍZˆjzìɲ¦Omuã–‹ +|BÖÝB|kæZÄ@ºÛt7B5úÿü¥/Òµ׃1šòò‚Æû±®¸—ÜQZÖ¿S^©Àþz?§â7*¬UÌ‘Ž´Á9a¸|ø2DyúQZg‰?D[á4m|‚B–*õ¹÷kîìDRºÚ0„¾ýç–É­wó~ýØÒPÇü>? +»ë~÷aœ¿nïOÝp}ê#Æ)f’’¦„?BË`„ú ~R(hà'Ùç¾óì ØÉ»žOÛšù.»ûe<™“1êÌÇÒïÒÂfÔÕóÏ“¤òÞ!°(íTLÈÃÖ¥råúDÌ|–ÐÅ8Gä|}¥|è+ÏTPDpƒˆíJN5ª,»sa}èàÝ!/ÿhEî:±‰–ÂÖuL¥èmzÍŒÈ%áØß+pJ^‚…®Ù†V§óÕ7ƒ° 3¡‘ áâ9zU¯Ì…‰ò;é–Ÿ·(Nâ°­|&=×ÝÉEr4GîÇ4ê˽/Vñùén :,'劘ʕc(x^µ@$ÛL‰†¸æVìP¤ýÄJÍÏD{¤>pV$QJ¬©ô=˜Ð9 Úp€Õâ«ùD¤å0ù_‡b>éRêVtÃÖ ÄMd~„Ýl{‚òsÉÞ! 5õµPÓÎ!ÓêÕ±·ÍˆoÅï$ø4÷µ£e!Ó†R©û,ÞΦbŽ†lŠ\›»ÆÈì\Ùú$Rk=›‹Tö° +Úð­,6äX€qÐ-}nJ®k^¨£ô@l€¼ÜI>Œ˜×TqÅOшتxín°úâ…õµ4JÌäÅV kw¨Š‘þI’€¥¤\°^0Vò˘íep«%"h* ê mQôB±Ýë“ÙÏXšEÿ¶Éµú0üöA•ÚªÏPbÑËöê6EL7‹:Æ6ÒpÑÁå»ý%Tñ4w bBY6Kn8¢slG›‡œ .ôˆdŸ*‹îí¡ï8‚ìu)+¸"xJmKM Û /û’oË3ÌkŒÐ‘ÜãƒÛ’ÍËïÌk‡;/°¿‚ë’àU¿n¦NÔí]…6sÍ£¹ÛÉi<9s„pÓ4ìЛ•E÷³¡{¨Î¸›Ñ(@£ìª–8¥C©·g{foU>Ñ™vù¨µ«IÈÜÞPœU›K)ʶZQýmk ·çƒe~cs3˨Œ°2è£ßÕ ¾ÄùNs´Añ,ù¡H¾…¼ÀÅt••å;: +œ•F“þ/Eň¢M—íîÒX =r‡K—+hö¦­y¢–éx>39+¥¸®¯k"½…Çl÷ÀJí„MÚÜ8ÁYËÜ&F¶”´Ñnýó'¶±_t¯…´²ÅÕÛ¥ ¼”žŸö8Gojü=ã6ÀçÞ}IP†C?äy¹l÷×MÜ 8ºSJ§Y´%$<-ãw¼S9ðJU&t ŽÞ[™#ÅÀ½5‘µc§O&QNðoMÂM/ …Ìþæ2¼`ÕE”n¼]QàѨPØÅA9TM;x¸á•3O‰­X»ãÞä»ÎúF_s„"oêoì9‘ö-Z%×/ÌÓÀ¨LÒ¬ŽÇçDrU‡¿ ¶Ï­š6ÞxÓÂï¯Å÷†½®w~¿Î~ÁX0nïýe´Ý&¤„’Wm»Š)Ôšë2ÒÄ`ÇŸ­B¢ž}dMÞ xì)㟂ñU‘dIÂçÍ Ê>`O‹5ö7ÕKõ 5ñŽ£ÓÔ‹Á}äIZ-™óDZ´[ŠkA,è3úI—ãq­«E2·:±AÚJÇ‚p9lrEèp¢V —2JÙçï£)m×·ÇѾ&\!H !Wuy§|õ ¸ýkI±3ÓËôì ünŠÐŠµ¼J§UÇ‘º;Ë÷Û\»#QÆ>‰E¼ßå îÜôÕ7;w“«)½VM.òHfÜ7$fÒzVÒþ ®:ëÍ©Û"Ä%yF#u»¶b1:î£Î¦Ð¦ºwI§âtß±.bïö:Áô|š·!/ä‘×…lEŒ];\PâéƒÀJ-†ùfï\gX?ÚÝbÊâ¼q#°È™JZcvr›”)\MUŠÿ½žØ«R#óÞ*{OÙ¥òó£SØÊ3«uS¥Ò+¦Ë?:ô$±ó4£º‹Õ±™o °Î³d q‰ÿ|¡âWV¬I¾ßxo¦Ì=ˆ4Šž%,²——Tí–]x-«GU}¡:¼@šëäãÕô´:+VfÀiIÆx†‡Ë2Ë–„\ü_¢øð?¸ùº»Áý\}(þ=.ß%endstream endobj 940 0 obj << /Type /Font @@ -10324,14 +10313,14 @@ endobj /FirstChar 33 /LastChar 125 /Widths 2154 0 R -/BaseFont /LPVILC+NimbusMonL-Regu +/BaseFont /RMTOSX+NimbusMonL-Regu /FontDescriptor 938 0 R >> endobj 938 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /LPVILC+NimbusMonL-Regu +/FontName /RMTOSX+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 @@ -10347,93 +10336,85 @@ endobj /Length1 1620 /Length2 20127 /Length3 532 -/Length 21036 -/Filter /FlateDecode ->> -stream -xÚ¬ºct¤]·.Ûv*I§cul'ÛFÅNÅFǶm۶͎í¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ú%ìí@ ,ŒÌ<5e E##SK{Y)‘ ௙’RÔ h²´·3y@S€Ðð퀅›› jïàádinPÿå ¡££ÿ/Ë?.cÿ@þF:[šÛ¾þ}pÚØ;Øí@)þ¯U€@È0³´Dµ¤ä%Ô’òjI ÐéoŠ.Æ6–&YK 3`fï°ù÷`bogjùOkÎŒ¹„Fg ‰åß0 » Ðáˆàt²µtvþû °t˜;ÙþÎd°´3±q1ý§€¿v3ûäàdÿ×Ãö/ö—LÑÞälâdéüͪ(&ñï:AF r;[þ…öf=MíM\þié_Ø_š¿(ÈÈÒκƒþÉe ˜Z:;ØyüÍý—ÌÁÉò_e¸8[Ú™ÿWô' ¹‘“© ÐÙù/Í_î¦ó_}þ—îl<þmÿ/¯ÿ¬Áä ´1cD`ùö7§ èonsK;¦¶Š”™=€…ùßvS‡ÿÀ\Nÿõ?{†æoF¦öv6S “¼=èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„‹¼‘-ð_A€ÿ¸c²€.K“ÿÍÝÈÖÒÆãÿðß=5€ÿ®RhîbcäôßáÓ Û™ÿU„›‘ýßVKg Kw ©¢%ÈÄ`fdówVÿ²«Ù™l,í€5ý×8 ,ÌÌÿ Sµ°4±¶ûgøìÿ†€v¦ÿ½ü¿2ý«x&ÙïÚòZÊtÿû½ú/?Å¿úƒT=€€ÿ?‰†œ½é.þa±wx1°p2X™Ùÿ»¿›Åçÿñ_D,ÿµ–39Yºt˜™™Y¿ÿãó_+½ÿF#ngboúÏŽQÙ™þÝdÿiø6qqrú«í¿Îýߦÿcý¯íºMÖWìMxƒ­Ò2ÓAu¸¹#Sb:},#?JU‹ -ükì{ýÒÂv¹+ ?j06Íðün÷X>wø<”¦=ëñ¡êM^çùPÐô o}íä¤; -dÒ/EN¿ÐˆòºY’ÝÒæ`V?Ú›RRÖ/ù€!žédu‚»y¦ñ§p-ðÇúòä€âk’Ú‹Ý…Ö†QWx~ñ5ñôù‰jh|td¸÷ºÿ.'ž’× -ùk¤¿c¡ ¶Z…xUó«óö”ê&BÏØ>Ÿ¿ù‡PvE‘妷‚ïÕàO͘ƒá†Àl¬„ÔÈW"æþx²  ãŽïIx%Q¼Kâf†Îo¿møWcwúŸò‚‘ßÄÎ׊ü;L§Ö‘;æT° £6®ãGvíÌÓ.õ=n¾Õ.7èX¬JÌ[ÃZUýùbªÜÁ+_®›xF»-b¨À( ¥ã©ƒw¸ÜÄ$Ì Ó… (_,Ó ¡Ã4ŒS4r-Ù“©¾ˆ3‚2Ž‰ŒŽ$¿ d­ô“„}¼Dä9%G¹<á¬;Ö6®£ÛA‘œ´Øpÿ (wßöìWŸ.S?62=ú0z‘ßãš@΀ƒëì˜ç3¹>9È%æÒðOÞ`zŒ—6"Aïܪ“³ÖSª Ò¼qRÉŒ!ÝMë–›Å/˜6 pöpò>ÙOBˆÁrêO<õlb­‚‡ˆà\jÑhŽ!··qè™•íº”…u=5±—ª——‡³ŸG¿:×KÎ{òɵÅéKœJC·ÒBµ¾/)qpgŸ”­µí‚ ¨•ŠgœuºœÚ]_ÕÞ´c¸Cûô¿Y‹ü n¿3Ç aÉ»ðSr°Ñœ¨t3ýW å -o(:¨Ñ_‚å¤ñOFõØI)Q’l¤®‰Í;TÜ*kÀ2ñ´Ò(ÏË2+­Õ»ÐÝé¾›äAM¾×Q­?A"tto¯$ÏÊAœÇ;tÎB¾ã¢ü1jþUxq¨eÓÒäþtþcÉTI€3!š@X芆eÎ^í'a‚†:U+“òÀÅ$˜ ‹EÕùƨÉMæ[¡'ûnŒ‘µ¬æ•ÌCÁ^.í'R‰ÃÒ4†„dØh-yÅqC‹_·¹£É‘­5R^ôÑza°Òµ:zàø–AèÝgžÄP5Æ –¹x„¾SÈîÑ*¿i&2O-8(cóCݧ†l³2;.žúõC× ]zîW{r{]ÞŽQYz?4éZ_)gæ:}oãÄÒOaËa‘‰²`ü,³†ñëP¤—}SUÍç<[[Æ©ÅȦn沟„“5·³Ú’£Çô–ýõî„}ÇÐùsI Œ |dšK®s¿aKŒ.|%€:GÉ”ÜO}©P¯z-$£×Wõý]1€´Ø.Y" T`Þ3oÞì¥>ˆ‘?­·ç?]£NA¦úAÃ"eåªÛöñ&uãµ4ØÝêçñ+)Æ/²ñßôê•ñÕ°ŠN$n›xye¾’‘–ãôœs®bŸhÁxE¹²ÀŽÀ½òÃ&ãç£ú«ò¥½Ú4¥ˆ¦ó²ªÇ!‰}IïNÍÖø­J¿È*é'ôƒßC㠪ʛvÝx Jä Óc‰ú6¼ê ßs2¸µ3_„1õ4Å]°Ñ¯Sô_ -a®;?o®åü+L7O7¹uv¤ÓuÞ̸¶çŽNóæî™Éñ¢ÊÏC°¶ŠæЂÚ\„P¼®ˆ™ß¢’ 1âÊ¢Þ zO&É·c튩È—©7•Á¼G}Žúäñʬ!FŠd1‚_mÅ€th¬×Ÿ2°?X¶'9­1îî»(RŒæËÜF1”P (Ê·úí¼eôðÛgã‘Ûˆ}­H}öE÷2OöÑgí -‚7I•{œP¾©3½¥Œ/Ä[Ö[ªp«Cƒ’½f±cB8|* ×vÞ’(2M´:G‹çeƒÀü‘H7þ5'is=½ó{LXwÜëiì>Aº„ï=Ëo?F—Aµb©ÜħcL·¼ž…×›ÂY_‰g Ï¿¦©èe‘O5ÙÀܧâí/96]d±ÊPàH]~+B†<Ô•R–…€õ\ͯ©sðÑþrOŒ…[’½¸m+þ¶ø¶ý©>þ½ØRkn„´VÁÁE.ÉYSssF‘kÿ©Tââ.ŸŸ3hÈŽxÒµ¦ö–Ñ9õd¨HÎ6Šõ‹g :M6:mÇÉ£X€ÓIQ² þJ7»õÏ|³ý—9wŽ>«ža^\ƒlEuѺ…ùŸ“Y§7 -á]ô -ØI:ý}Ÿð…îŒr \Òv-`÷’¶­»j³œ³·í} -]rSÓ|¬U]Iƒsuoé$½9¢c÷U¹“äx°Ð¶¾Ø¤Û‹«bÜIÅQ¶?³…á6.S¼à‡n|ÑG{×BõwK¢ »™(‡§òq° 4Nqéåé»iÁ;í¶¹öU‘PÈœ¯æxÊ&ô•¤1S¶2ó¥w\·+zê›DJ´v¸$ÌLßòÈîk>^µ².L±¿²!ð4^¸“PÔ¿¦.¬äïŸ(¿'Ú¶£Pb¥i‘÷êzÝûDUoÀõQ -0E†IÃZ^ŠÿŽ¦Ö‚0›2%“ýJ§^ˆVÄÉk"y -4ÑÃ¥Ë2š=¥«UkW3G­{—ð̪K¦¾(ÞØ–WŽÓÓüý®9’ã‘<džâö—ŠäÓ^Rƒÿ°PŠÊ·Zl—›Tj­5¾9.¢"¥³f>89ùIÆvp3Ýé9çáCDq €¯¹/W4=¹¶dopso´‘‡À1¶¬´’møÚÉ6]ó|"쮘V»ÃJhO5‚°2Ó˱‡7Nß¼hC;—ŠZÒ›„ä?% ¼]ùc¤½¼qÈ Ã«#h¹ilÀ²ô²XØæþ鞧äÓ%ùµ¢(eqB•çPÁì=Ý„ÜÁ9â‡Áœ%J œîNRCèIªÍëKDQZ³Å u¥‡HÓ£zì¥üï3òt®§,P3Žü:]šÙâëIcª¿W±ÏzA~Þ CzzÎñ0¢®4 p~\+üø0¹ÿq}ñ~}é -®@ê#^>«\×Ȳp‹Ç*, A_ÓðtÅ âqÙb1?&}=Ä2ãÒ]óð€ÆžoÑG¡PL.]Bª¢E3ý7z®Æn¸c<®žepNwd¶\ñú"¯kÑ;ïX¨‹ЀBgN}®²ûàóÃÌòhkrŸÀ¶Gâ{°l:&j‘ñ™û ^òÕPkNÉ«±LÖñü«DÙj‹+Y9‚dÌœòÖ„Ê—6<€ôVcŠ§‹Íš‘Ýþ³¥SÕsiÚÚ¤Ûò>vü[Âë^‚*žÝ½žVgªT=gêï@!»c)ƒ±FÀh…´1l-òZ±9±lH@±Ä˜¬_×m¦ŠæiwÖJ|¡ÔÆÉ’¹Æ¾x9›.šþÄ7oˆe!£cз¥Ý†B߬SÖûÄñ ¹eéx­Ì- lnœk -Ð"$©p@zŸÖÐGƒ›‚·^_fñžtDPiÂñøËɘ.yÖÆÐó†·ÅDã^!¡¥ 1âóÜ,óšªiÖc.â4£÷LÛ}cN6\ÈÛÐC•Å?ÐÖÔØ5÷Ü tbgipO ‹¹shÛtƒt{ J'uYÌ„ÕÑ’Z6è¬wßù/NÐÈy0¬Ö‚;g‹ÖZ0….R; -*Èí­´âT¸žfWÓ3Õ'7)ÔYß=á!`ƒSé‰7ˆv¤U¿È!~{£Ø1Çœj÷àºßŨžG ]¬ßg•,½[ W,{ukRÿÔj•Å‚èÒ<’…æp_íÖ©ÛRV·((þ22ߊvóÇÝl.ˆÏÜs/¬U¡¥&‚ko¾÷ñ@ÆÇÊ5V…jj¬a `N}ÕÆêŽáOúŠž&#÷¦ÀuÓÛW™{päc³ <4Éó“¼£Ò7J}GáæÁ†TË$äðÓ01Kp"¨?¶Qø¤ô4d¿x}Ks¯c* ìh÷§‘Îþ#XiuÁ7nêîØŸÕ©è|ÓD†3¶•ƒ´QŠÞTGøÐæE®Í¯mÂæ°!ÀbXÉ´2–·±R›?hÝÜö=m¸7ë6†ˆ¹o'“ðlø¥gàëè”ÎözÊ8‚lL >Å\¥*ÁŽéѾß1‰àÚ¶"NÄÈU¶¡yÞ"åe/½üõ´9ÆhÓ¶ñ3+ÞÁÊ+3–”RÚí4p±}µ^säwö&òGN^9×t§Îíd÷âË÷‡y|ܨ hͪ“m ÛøŠY‘*gSÆŒ÷lZ1S™çÛà®2j™çꕧp„Nݽ™_î¿9™åÚ‘±£üŒ$4W‚ÒÜkߤ¾Zì`•@BñãjO®õVa’tÂI¡„[Lì$U ;"”¿¹B)Üþ”ÿpª²ïèîÈé~Øî dxpv’K# AWE•\åuºïoŒwoϳˆ?‹]ÿyž½E™À·ÁÑRY£_ Ÿ4¢àÏ7©£•#eà«È¾oŽdÞh=g!…£0’H¿œ…lÖ)|ÿPíCð©ß£ÅOÄ…3íá±YQ¡›}ÜêëÏ -–ÙýÉvuöù‹ª¥'NP˜eÏ ±è,aè™nµždØ ±Ð dLÊ|tHo­œ„™—°Þ‰#ü]ËÕ2‰í8é”=lÎMK¾ü)Z­}Ù¼WÆYXõÞáŒK8~ÙÏ\F†='h¥‡;ùk/E7’r×y'4xözUZj -SèÇ´FÞ¦…ÛÏΚ13±©É'æztƒÞm~ ¹Hº&¶Ñ~ñÍhŸŠpu¢h^ Âc0xÆ(ë7\×[:‹¶q¢Íš-µj“’"z¾r§YJ÷-Ù6ÔïnnÔãõÍÌI·n ïS7ýö4¦¦ì¾•ôÈ@؈F9x&«s î|×`pu¡eF`{i~¶ÙƒË!$jmJt†œ/üaâ\èÎÅNià"û*±z˜Ãt3¬Gs€µ/Yn ~³1&¾âÆ0tYœVáqð(ê™w†—V†Ÿ÷ :·ÉóÇotxøí…*˜®ñ§õ‘á#Ms9½C¨9ðtIL³òXˆ×íŠçÝ€îWÞ«Ê.­’Âå݇Ӝ,7§©Ù7‚ÆQƒÄéèd`³Ú³“t÷¾k œM÷ûx}Pïïo\5Ö÷ôC§Ÿ®Z*ïÏkm Rã̽oÙ° ?1DêñeÄ'Ÿ Æ à6…©jb6LÒë¦Xšá|—?÷tKÒ:6™Ëühï;¬p€Gˆ*z µ-Ox—oÂܽš°¶çÈÝÔÆ Ñb„,I­£±½é¸NiÉõÇ{^èd–PL[‘îc±Ø™Q¯dZÃÙ&ËŽA¯î/Ú;!òùpÁBßÙsÝO‘ ΃3ײ³2¨%ÖuzøÄ[cé‘Ù§‰ÂïŠRfUÔgçúW ·­ºì;§Øø8ÍLŠ¨ék˜"­¢¬tµ2¹ešò K¬ Á¾9c $rMe©€€Ô˜6T¡Ð‘1­QçTè{O–ÅË]Ñ’f³ÕÓ9-©þR[0£Nk¾·ýµ„ ŽÏߨNïçÂ"?Gw~\“¬…XH”ã\lã¼Å_¡’”*GwQQBÁ9+§ªÁ¤Â¥à(-n›_Òx3“mì‚gU‘wµéíâߪv6ºÈ¯pÓ[óæ¢ I´2Ö6ß ‡×ÇëŸíIGûƒ—e<ªð1}xçªÀéž~ôá*@O€ô…¹É¶s—ê>‡Ú{#ØËz߈¹ç!žå<×Ó‹¦g=‘ÑGHö'²Ôe ȱóŽõµ“:…Ÿ‚ëR,q@õû´ùüqhŽN\VeÆdh„ɘB™Ám*QZ!cJeåMj…Ïòá#éå8;¡H‚W¤ÃÉ¡Ûσy¿È§éÑÉq¸ÂÉOÀ¦$*¼”Ö”¿þCŽ¡ß—(]b]uHíØ;¦Ý§ÇÉE‚þK±ÛH]ØX‘IïifËS2phz¾‚ßA‡œóÖ tÝب8ŒÙ„ljÏþqË» *Ø‘Eæ6óø8¥”JçÂ?Kî7ß¾õ)NÏT‰"¨VÔÏL>+ö€Ã¥˜Ìþ†e-mί`$T^ÅìE¢¶p&¤91fXhýüúQó¸kc\#BÐ×îû&“ª~ö¼þ,tí]ª•wÄ1y¸ÒÍÕ:… AuÌÇ× ß2ó=—ûéÂ0ƒzV7P¦©O>©¡‘*‰B4ô¼&3ÖàïD×—–™iWí¿U+L´œ±§f¿Z= BB£¡s 1ÛðþXÄòj€Y²÷¨isæ /æ -¾zT…¢gôOÿ’‹Óo0-šÎ०²Š˜hÈ›9ÉÈ%m-ÜC7‚µ$©OãzAp9%mëƒf 7ìÄîâºÞNÍíOKB¯Wˆà/°´e¡ìÔáo~f›]{ˆðEŠ˜*ƒûN·G®²ÎÏ«Eô[‡ðQðu1ªÑÃ(X²ÁZû¨Âx5¤ 6™œ¹¯$ß's.1߬)Ç^r‘au5nUG‘áŸÕÔ÷TÁzÀ½¦¬ÜÌ léLd i\”aÐZj(ô ¬õ\œñ,ôS–W2ƒo³‡CÜ`e­æí㦃F$êuÆz{†ÂÎK!K#$ -bÉbðúuÙ9ðeÞWsS†ÚINñ­E$ŒcD3>ä:ÝÔ%žÐçIr<Û½;åµV}$1â°ð ô£õmõ“¶)L£BòùP-PîÀ™ÑD|=ÜF—dã;õ…R^j ºßsÒcþRÖ'šîϳH¥¹¼+jìF+ò˜ªB~ÈCgÙ5ûë €UÓ(6û˜Ý#̼vÀ£Äòq¥þ…äž“ZrtjŠoe|‚+ gÈb ÇXxÞÈÍGŸÆÜ/bøc§èüv+ø²òkbˆ BFÛ;l'a¡|E]éü×6téC¿×0q‚M™±I0êÇ`ÇsZ+£.ÌgŠÊ)ùcs³½-ãVé¨Ý³·††²¼&D̘ô”@¶Ý”ï³Oœ öø]¥ÿ]ƒÒ˜,±Î -q œp¨FÿØ°ºyóë+45Ä â$½IWªÛo6sµPW‚Rýyª Ùéé8Mâ-lvrΨ$–³ÔÒ+ìLå×tåý‰c8¥nHÂÙ¼@Ò+iÚèÜHÔ‹¤³!«¸Çqz { ­Æ{¤lï -Çp\=Nü¬4·· -d;uÌ’‘ÜsÛ„÷_]e pxßÁÀ: Ïhâî|k±·¾ö'nTdÇ2å2fu·0¼e}XÇc*IÃoô}xFe6;acÑÈîXúúË¥áær,–êœh¤/º9;`©®GÅ–° ,ÓH>%Oà"û|?éJ3iὓQ!Efb«èDCõñd±Mðhˆ–Xµæϸ­6ô#ñ†l»È…±ûsLóæßgél;µñÌ#% -‘¼GøCAÌÑð}¾€¶6Ç¢³V»þ\ƒ diKB´«ÙQïè.§~Þ‚´ÈÌ=ìäm’yS$ý-Ñ¥ªŽ¹P‚´)keÅÓnM¡Gã¶Ëu·5%¬_ØEçMŠKÒcƒ†Œ8 î5€Ã|5wìóµ Ô"öů£„²3ÇŸ³’œVÉ÷ - žóø.Ѩ\éd¥(š˜>¯–LãPÚ  Ôš3,¿Ô16še¬»Û²˜BG»OåÜÏænPƵW‚®eoÁP×½'”@çßÒ KLýº-/ÞJ[ýŒxw]öG8förˆVƒÉsvÄþh;Ìšé£HÛFÏæ8w&_a†¶j¡ã÷q´r©Ý}~9ÃQ‡³¹ÃñQËöš‚¸¸ÅÒRŸv7Ý/샃ð+B­gN2ãâjÒz ÂE‡`õfQ •8{ÆÁ9û»¨½qN5mc¯ gÀ<Åj½`ž@.vS;눂DÊknDÔš™˜±ºOZÖµÜÑ–HJ”ää&¶[óX= -<ÊîòÈYŸ­ØìZ Ê£÷íé™ùÈTxÇSêhD¯Óe{Ð’ÖMÂÒé*’­D#ôTtهͼÔ<~WêšÏ¯ ,Äѵ—úHLÆücœcyµ¼‡ÅÒîÇ<Ï EÇvž¹tú“H;:±[æ¥@B³CoјI3åÕŽ+´s«©Æ?™À“0”VðÍíÉ ¾¹Ùì ʃ¼ãAœ'7¶ÆÁ&¢GL6öÝ¥ -Õ.¹YO¬êªœ©Û×™¥ o;åE0 +P|¯î ¾§ÐIëg°¥ªÔoKýd/&úÅÌgëVÕ”ÈýÝž¯Û#tƒ#ÖÓ^3Õ%Ns“€M”’0¨éa|Ê|ɼ}FŽ%x\Ëg¹bÓõ=¼í"…sUÏâ9̯ԫ{1K¼·ÉfU¡Ï7 -ˆçŒ¼™¬ï›»E|ÜÌÐðXuãý–üÂ˨µÎ¯ˆr ‰¯ûV™ÆZùHmQE,úïïYü(³»ŽáÚš&„—§Æ…óøtk±ò•Î¢AwÅȘ)ãæ^ú¢X ©EŽO™æê«ï_•Ü”p8ý°³'W#§ñ~žõœÐÙø5;<’ŠÚæ_)W›/’É\x)wüˆ5Ú²w9Öˆ.Ѫ#yÛ2gF¼_úncóAºíç)F,ó“®ûM~e9û°Nsû£f쓵5ª:PK÷ƒµTÐ9oYö €ª}$:tñ²ld$W%‘ȳWCxHáÃEO89!×hvß3Ó(¦#gŸåÞ[Q€Ír‚Ù†4ÇcððÎ÷­ ¸ÕŠ‰„ƒ>zLár—õÜ[ùíVU§“Ž-J ×ü¢õ¾‰ÍžÞ¦Ù×(ÄmÊÚ&®ÂÝ3È£žÉÓ#â »þð%²ê&Ý7ê56qã„öcI$¶Öu ©%ŸÛ¾µÕËVP¼ Õ°ãé™ØbÕgK/4 þ} iÅ0|bª(çÝX#Ïï,ø;ˆxšcRÎ8Lµj!î »óúV¥@L&K!‰]°UÄÃûщ| ævYlNæ¼aš&¤hDA—ÚýmhsäÙc€¤³W"â{Þ‰569L í½×Ë~´œ‡ͤÆ^¡˜ Ê4eU³£´EÈ“&phŒÏîù?è™X}}¥„Ù8Ãm¿b;†±ë ×ÝIÀ»[t<Ž‰à„ºêF‡ÄÜ6GbftwþžT7$–äomw|[$EV¸M—g[úyœ‘é±øí³Öƒ%Õ‚CIøÓK¥]L }²Ëp¥pCg>ƒÿ»ênøÄê=â]¤põ‚j§Çýܨ˜öÏᲨ>¦ÙU·n¤'ð«¤á{ørùuU´…¿ƒ_4,U†°;~†¼õÑlþnî/®ÂßñX¬¶úU%~¤Œå½Þ,/0БwŽQ{Ö:ÈÁ× ª•ëf\“ï0˜ÄÜœ$e³RÔÇè<[ò X•Ž+ÈÀ'Ûæ]õÛû–ªiX{sV-#ð¯ò 5²´Ã+›fø*¡O‰œ~EÌkɲˆÒ¬Ã‰õ£KëUb실]ôšjù-å*bA¥ù±‚iêk$-Vˆçû G"]Î[I¥7Ö5ꧮq[ßÞ­+ÍðöØ/º÷ðÕ‚úðÓ÷ì2*Hê3Œ„Ž‡Ñ|_ÞŒDªrwúi¡."§Öîª ÎÝ/`8qÄ? -ÙòsøeìÕÙÂ1Y¤tYv~ -³L7,òH -É_AWš…*QÙk4‹†ÊSgïë}“æý ÝH>•b5?þ‘ÄœbÇ‘þ[½²%?QÃÔu­2NѼ5¯|F„=ktåÂnïìÈòæ‹ô'†<³Ç‡_Æn|Vœ “mpéU÷YX ­|NHô¥kÊ r O6ágÌf¶ØlhÈb‰Šµ°DŨx`Þzù¸³/;çöyjiIšuRç®3·žÝAZøÌ*îÇý±@>Ö,cIß’íÏÈ}-åEçJ<¯µp,IÈ[\puÏ©^ÌzüQ\®‹6m¥ÈˆgðÜÍ/|gÔY¥¿×XCõɪy9m˜°·r!>Z. -SS˜K" -Ï~~C®x®'ñ0yÉ#ñÚºƒ.UŠq/öÑŸ˜*Îö¥ýµ4 Çï`àIm­Š´¦Ç”Ní.zßF6ù‰‘¡Dž³¢,t°Í(¸™8é±%iXK{Ëlò\‘Vñ}gx7wÏbðb¬½‰jÁ½`û'üNf ÌB Ì´Ð¯1fBÈŒ+%¹7¾CäKvÇÑŽŠ¨'¶,³jvZÛÚ•¢lD¤È½Å‚…U? /rªìuGш¤59+òúøF´'Éûu£÷ÁO^C.¶ºó×?D¡ú -Ë!«O$!*_—‘} qufÖä­2¿ÐAQ”¤ÂâWH,‘Z8gm­ÈÞ¨gA‘¸¶vaõÈ”YÖ¹›‘k ( -á„%F<5Ÿ¼K»ç´Åö Û3Ó΄ÕÁŠÂ~çD7/âšÅ Œˆ¼êÇ™©E½ŽîûFí3vŽ,€Pô½4zù„Pp´_-¯³÷ç Äš0XR€©A÷?Jf¾•’{ˆÏ”4ÚRØlØöI¼¿®öõ~‚É…PĦxIÝâ/B²Bü¢=¿A'öö`£H>Hßí—¶œPxáü¡ZòñLQöLVg*tç1KÆ„ºdQÁåÚ)š¸|"Í·Ä´S‘¢ì8ûgþásóÍlðAÌCÛª¤^¬IêÙ¨·m‚åi—nqúĦj¶A«"¼±ç¼{H„#þS ½ÁêSG±L8úkO{dîf°©»ìOǽÔ/˜æ•wƒðáÇ`œÉµ'j^ëåé8Sx‡± -Ôù´6Š8ä­ÔÔs‡ÎCý—óÓ:2±èë5/•l†%†ÖhCÓ˜]¨w'hX6Í— ¹Sº†U¬Òú|“LAÒÁcçpÏ:i³ˆc¤ÖûúÆIX—m¥ù|(Ÿ:²zS¶ÃÁ˜¦ß–ãòßÆîÖjb-­ -à §—Û"ÛX›?ÕSDâJªÌGú¬Ú‘o°Ùð¤®÷ÐȳžñÏKv×F$-ã`÷5=¾¿n¬ûë_I#0ð­7Êî]˾թ¸â¦û­]“áæîüêOuÍÒÈŽF~‡B g$dýý…i7u…±Ë\¬@ý iN~—×OÌÝ‹[ÆÌÁ±À]D /=]¯zñòÐÅas½¤ÃZ3×—Ú=±'.K ò÷·Œe  Âi)»Ýh€éÓ/÷:Ä•óX¸’v¸IP®Î8Ý#oñÊjN%d½'8D£V=tàl¡5„4go±‰AèKoN!ä.˜·6 ÷8b¿Ut?ãiÛCœ¨ô÷·Ø1ˆ¾ØÞãQÄ„_ºûH+RÚ>¤x3ýà‚ý7°™\ ¡Ð—lšj(áŒ]UÈ£ŒdbÏ2GT/ö±t=À}üw`Q[ésøo/körë—#¶¦Çî[ý€D> -a-‹PšêÊi^(5aò÷Þ8œÆ—†rmëÜ0Û™//UªŸÑbVPp©ûÉ`i.‰ –§Á’¤Þ¡áû ÇϺ»ijì‘"f[ºtköÁŠ”È|^g†Í„ZÏš¥2ÝDÜyÓ—À>ü¶6•thâàoì\Á -z¤ûŠâuÐyçøé›1irÝžã‘é£äX’Eßa›×ˆÕÇ“;˜/¼’>ì[ö±™³FcFÒªgãö‚á‹©G -oL1MFr-ÍŒ™a=áÖVVFÎwÎ¥Xߪâs¿Ü”<¤ Ómpö{g~ű³ƒ2Ê ÐˆB),ý±ÓÞ¨£Ä°íó:šà¤x1ÍžÅMÂ6ÍQô² Ø©(‰¡¿Þ‡û¾ô0‚ZÜêä]µ.0‰íÏô "ì° è+kèt‚õŸ˜»4·7Ì%¼‰«ÐœN.êm¬gÂݶ@9úl›ÞÛrH!.¸]¢¤QŒ±Ù4ëgŠ{seªo†ŽCK?k…ù7qC+¤ ©o±|ŠåZ­HWiý9ó‘qn¡Í½2$¹G-LEøbµ˜öbo…ç m»7oÕ–7æWÀG»JáoÔbÐ5z^oDB°w\<à /r¸Š\רrRjþBõâÿÂèù!&†Žh„Ž6‹$˜WóˆB-3ã½ä—K`­¼ò‡‰”zó°™ò‹N`zd åÇB™£+sÕýN<‹-8‡òŽ0;ë)Eµ&Ì.P¹$ݾM€ñ’@ݸ¦/Ã2HœQ…„IJEzïe‚q™ŸÑzÆ-tàQÍÔ¤rÆ‚}ô˜8kí±ÊäXë‚ël²iÀDâñJ”FR‡AÏŽ-H›2²ãXÒç+Ý"ÃðûÍ Óšÿ+;Wó¸_G±.OÒxè"ƒ%u°¯“¿>Wû^ï.7 åòƒ  ž0ôuS¼2 ©'w²áÁ™ãi¨šFNù6ýUv“-«>] xñÕ—*æ®çÅÔv‘?‡Ýâ–Ü©.M +0·dæ´ëžÿÇTcz¡JÍÜæŒ.5aö$¿¥Ê­°D ÜE…q3„f›ÊœÎ.lªdX±îÚûp}˜•7M“Èœ ÀÓªkQ4N5Åç­-…@²!G©¢6š VœiˆR7\ÐMj„dcäî€doû4~<”Òe6äm?Ð0I×€ŒÔK›ÛS£ò£Ê%Šv¥Õï^+„¬Æ³ÒÛø!&à1:¥Çã‚'„D=ìà«&€©IãY ¯€äÂWƺ¥„RÒŠHw²ˆsë.üÙ­gäè÷mïyoµ©ltxebmH÷fïêïo&Hì*âj]¦Î¾kÒrX›0 — ó=ø^‡,›.Âõ˜/Z—[’áXýõ~™?4ÒdÈÅ7€äñq ´¤ª^JÙ[K™†OøDÊW÷ãºò"îf/’’u.3éªZšœ˜­9µÀµ”…”Û±†m ùlË—‡Ï³'´4/Éu×µF±‹gGŽ‚Ç;`Žøç:í·úGj¹ÃÊH‡Íi¤Î@É÷²ÇÖiFèÅžoºÃ‹… õXWAúŒF˜g =çÇ$¥¶¸i\üh¸Ôè¢ë9ÃËñüw¹UÇüv"¢îjÕiÐS+4ã%⎩ñaoä{Zg=!$Î3åõ1'Éê\ªWä¼sÖ†Ílâ4,N9Ã4¼½þÄ‚;w ½'U‡z~”Š¡+É6ÉÎù¸©õ—õ€ðËÂT‡4çjôA¢ÞŒ Ó[‰ôïqWűd‰¶ÛŸ€¢Kªî1šÒÉ|Ö´øÐÉøKœ-`@XƲœ»Þj”§§¡øð©Öµ„ËÍñšüÀ¨ɯ¡žßÒ #ZVöÏeÁr²lã[cѽ·aײ‡xþѿnÊí"p¯½6Ö8wK -†‚™!Y5ª¬h›Âø IŸsëâÏç ùÕAu8᱇vQøÆt“M$N×Óå“y'^‘qN²ñÐEW æáxº„˜ûA;W7·H ”ãWNª—g=p®Ä"n¯·4š©øZKGœòÍ£~O‡ž¯ Žù¦Ú&þ¼óØb½êÇý3ËÌ@1"†r=qoÃEó”ä×™v0™ºp½³³Ë„ƒ"´Å¡‚’¶ÉG$QC¹„ª»×âuŒâ‘ÛÁ.ÏkYMÍ¡ÙÄó ¼·õç¡ÝF´¸6Óod˜*º–'&a[TF˜µuOiÂ/k1ÎÌ#Ù'³áõ(ñ}:&ÌVS1Ho8Ò`þ0÷÷_"UUu¸!‚ãÝpwI¿glÝËîhaÓ¹£Θq¢â$8²»¢@¯oeÑÿí©IIkŒÒ…—¬©Qþ¥„›VÅØ\ãÅ• -Ü`¹}ÊWÆÖý&_cWs£åÔlÓ¿› -.«þvÐŽ–%u‰ ¯¤’¨]5H4Øe"›ƒhQ‰‰ôM“ªRM-D>í¡)rüˆ(Ëê­©è¥ÔYÇ9ÓQHŽÝ\(] -Öð5,(x J)ÜÀÞÁg0ý{wýçêŒx” -Ô&‘#àfîÉ×kBq‚ÂõÅ{à1æˆè#žw­KH×\’Ëœ!w[‰‹Ë)ƒ?q[ø,YçÔYÿª²‡¶Ë•:Žè“tG½­3èÔ* þmèÊžÜ`m -(¯-üü2ÉòFM:ãM¨sv¶Ä÷Эv"¥}kædJî -×cºŸËã+DoÇ–ãÉ­)ýe¯¶ôŒã¢—WÖ™eBdeìºf|íö˜-Œ‹Zw4Vçvž&Ê=®ýÂ¥H‡,d|Làâ3N‹'¹²,šK°#L„Ô]øm³)n-@Ü´¬N&…¬$ÿÈçÃíKðt|]Øl‡¢ËJ>h– -’9„©²Í¦i=ÿ¨nuþò©­'x¾N»˜4Õ07<±–¹ûIíÓÏÕ=Î)iÇN{à$dQñãTË0¿§h¹kÝçµùÚÒ9äóÌèÍï ¢ËG¢ $éðf+vHÀÑ:ÓÝ&îûAoР`ž®³DGO?Ìd¨Î3ìŒ+Â̪Y¢ì'Y"-¨öíG3qŸZê…[|iøb£HÇß·¿lè t#æh'¯¶ßk‘¿ -ÎòÑÁÌûøjTL, -gRH`\Âê‡%Aþ‚¸ÿ•LTa†ø¤6T:ùQè^·.¸Ê´DYAž£µ$À<ô{ÃiçŠKl¿XæŠÔÄ%ã»<ºr£²‰ÉÇI§ßðÒ÷®ó¥©XX;|¨‰êbuÊ X‡jÂÕX£Ô†ØÒïI7Ù¡™ G;³*‡Òe÷ŽnInî‚(¿æ2ÞÅ¡æbE§4!0{šÕ?ÞñŠ”’nô0g™²ä}»O4,ä]Èhö3g"l˜\¡Ì±Óp•Í»6²Z“šÿêŠ/¦¶ƒûeÝ$³®"tÕ¤È:ôƒòõ ‰›îxÿœŒ¥?Àh[MND.ÇðL7|SɶtÑð„ö&øyDZÌû*Gmpr8\UÛ¬gTÀ­X -h†“Ì]õ5ˆ%?»â'º˜M¾×ž/•[C2°‹ð}j…Ž.ˆ&•µ7ˆˆÁõÖ ÿ‰r¸‰*½Æ¡rsC¥‡Áà¼qãl§ž_€Ôv¿vwŒSX~K™Ê” Ç›¸´5"_¢»åzW‰8LB‡ôÚÄš+H*Ƃ߯@K„/ë·Á)¹²%Í%]Üå–=È«V,è ­{«RW‚:ik>•HŸSTÇÿÉ%6vô¾ö\áñ-R•@BêÔ“fÊø²øÕUrÇ–÷ëSv¾] õáåG:ƉÐì%*ípÑòÎwþêzd¾,¹~ÆVÝIý"’ù!k„­ð‹•ýžõ¾6ôÁSÖQ¥î‡ÍÌi¬Ì2×VþöŽÇ,]?§ðÒùûá>=,+ÒåE!ô#?6…lª¾¹*ƒšöß.‹+þN¹óücîs=A Ž$—8ªËtÉhͲÁ%Mìï[rï?½>5˜‚sÁ©Z™â|ÆgÞϳë6 gê]`çwŸ‰ -ÖäJ¶$÷A­B:{~PŒ­|ˆÊ ©¸/N˜¼wéàý‰ØaÊ9ÕÒ”®òM_u*u~0Ã׊éào‰èX0Êr‡ÖÁÙqh[ýl½®ØÑîáÃe7æMà€;æ,—"íFóTIû ¹ ²ÐŽ÷_â05#¸.cœY‰]j˜ª:Ç¿ùö:Qqæ!å½¾iÀÁÈéo‹¡¾{£6jÆÑõ({öû^Á èéWÝ{ƒHÈ%ŒéK!zþox   µ˜˜¦°ÖûˆÄll¡Y:Ðÿ3ìvz6G0†Ç&QÚ äŠ«‚n‚}uãaI#߃y>g—/¨`.n+/­Ð^ q›‰t*+ˆâõa+uF¼ý} ˜Ž¥ï>à£jŽÄ˜;â¤ÏLUáÀ˜ÍPÒ¬ü“žÖkm",Á(\~éGP»Oªt[‚ÜŽŽ6nxf³lTÆíØH'ºSÍõw<²qs)‘‘Ç~*Ún¥ ÑBëRËÏ++¥È›!®)™øÄ•™þîêñþœCåaIyÃγ<–äxßsG²)¬•¢×®8zÅJäó`ãn©ÌsÌ™æEHœX-zoè=O! å™B?Êóíwö»µŒ›ô7CMûÕöî‚Œ“˜:¨’P'+Ð'¨MÖí éżAJNQbÆu:Vw^Ð(*mké«K櫬Ù)7,"[›cÓXåºÉªÌq…‡‘„gÂmb(GXT ,ùÅbo©ðp²©ï÷ÖnròΡUm° Cþ“væ$Põ`Ò匀V–cÀþu6®…ùqc†¬ó:†OtÎì•nôwØÒPÄv©*û&<û'½v»AhEñÜêŒ ‘—Á&!x^øí(nÜÂæ¥=YŸÓ“pì‚Eú–qEæØØíéÎVP¢7“Õ¹ -†»·=z/¢ÇCï¥ä‡`RðÏ!¤Ù·)žíú!Œ·zÍ áí;LZ|FÕGì%«¯ˆÅÖ¤H6}+8ã¹ðú¸°ÐÀÑ/Žë)díˆz°W‚úXƒX¶¾m«Ø½•„»ù5gR›žF¹{‚$³*ú)u\=(Ñ-‚"Ð…÷±,â¢|]ǹý?9¿YÐOØ[L‹&ãÀŸrS*AØf­ši -t)ÌXN9¥D±z¤‰-D0Œ8­àª;ÁEÎ+p“ùhJ½:–Éîföâ}©PýSücd?àó <ÌÈ“|Šˆîç }®rw‚RÕ:Í$å·=„~mÉ]]˜RòöÖ„½®íX((—€¶Ä?Éž¸‹e»¿èœ¬ÛXÄ`]¹#ƒÝ’X—ÕoæQg è¿ÏU„»7mˆ¥ä\’sõ÷‘Œ¢MÊw5Yl”ÓaM)œÂ]Gƒo\_¥BW¢É–Œ3 -ܯ*˜Œù¢V}ÒD¦ÿôð£ÎÈ -}ˆ2àq=G/¦8õ1ÝüÍ/]Z?ó{P>yêU•œµú}éÇ2&@žÊå6Þä¡þ;TÆ -Ý‚Æo9ÎÖï[f|t7ñC[,#ѼR'Ry\³¥»VXÀƒ±AA+w -©õŠÊ§üyž+¾û™’i†2£]Þá­•\÷¤Mçó:µš•wbÕ‘…Ùˆ×hg¢Iµ#ŒºÛà@ïuJ*³É<¸S!ÙÖdNPÂD )­×cÅkø2æòò›b«ë#¸Î•µN² û›T“Z#¿FýŒSÄ̦ۻéz,³Ã‹Å¦ŠGªÖ\ÀV¦(Z‰šQ vQÖK>T«:œSn -JÎtŒ.a½AöB¿×n 8b¦”w»VŽn$øÍé)4Üú¤÷VçËÌŒµµèN‰R£ëÐŪ—Ãÿ×>Y¶5( QD‰!%ÝHîfà¨Ñ9º‘n i’"]Ò-Ý1ºKÝݵ÷þ‡÷Û}îùçÃyžã•”4|œ"ïñ`Ûý]_€ßÿ¼Ý²í\£$«:ê¯{¶F†Æ»lìÏ3¢?ÑL$G@Öóå×vmôãŠ#Žª×°tή4ËFIñê\é±¹†òã–ÊcLÏBÙðn¶²e™i¤ÿs;<¶ ¼ÿñÏ7JŸ¨ie/þ5÷“FàEZUuç!í¯îðœJMþ•³ŽôÓ }Ëß–~¸ -Âòé€z{JE‰FªM Û„u–æG0i ž³ÍÀ†^µYkúzþ'ôÍòH¬n“È([ÒKFR}ÿ^÷ôdk -±5b$ßì}Cd%#vﱓ*š°ßÉ ‘ú°»­¥8hñÀÜ_Œ»Ð7¥U½2f -b›oÒm÷ãÅY…½jãnQŒ˜fýÊm½­ªm&*þ8”Èç1|ñ˜a¬~– F‘«•¢ûÎòXQ;( _ÆSI0ü+p˜ý&á¸$BF -ý1ì_v#ZâÍ,µgªìVØ -*‹š@i‰úû¿ž8ëäCî3luRŽn£ÒsbX‰É ýÚNã0Lb£?yrK—Søƒ=ÕˆáÜá@Æ žÀlþ ¦Ã<˜'•AÅ87gñU˜ -Üxäø›Š•XGŠyº'üá9vµ,Õ½OÓà¬KÏýØIC`­” ¿¸9Âò§é¸ˆ ßcZ”Âh.RÕŒI8¬_$òfIKmÌXró–€àÇêŸ%Ŭg”ÆÂüˆßY'ºVR, ¨B~ ÐÔAQäϲ¯u£s¢€Ý_˜Œ\@øt-ò©Ÿ’>ö‡Q÷FÉÎUŽ«l$Ô.ËW(¦8*³Ÿ{>B7@ -7쑘ôy™Ù7º!„³¶ QèÌL}*Ÿ$‚WVÉÉ®š±Èñ×´//2ZA$¼§¥ªb;>~T6EÕ<Õ¿¿Vj3ps[‡Ú[ë #.JìñåY¯ª0ûì©'™„±ŸµQÖ8}Q¥ÞÒš½.HÒý¤ñ‘õ$=¨â¯oñöaZ]‹#6ž/¿¦Ðô¹e¸ÞZ‹ÇM{ªh= Hp¿œ¦-Õôš£åežÂúz‚€ÛÆ«ì(Onû÷söQY²æ‰Ï&¡I(Ja]U›-fø´Û[ˆÿÞóݦ6vº%š.[Íá§KpyJÖˆàêh2nösjJ,©VŽ&EͯU¨•x9øW+0éOžÜX‰3„\´å‚]:aFïz”* ^Ô¿Žààˆ¥A -‚¾¡ÉzŒ:s[­+ž:[´‚r 7À«_ó熈ÑFÂ2Õ:¨Ù˜-Aè -œÆâO­Œ,Eß÷;XM«âU†æüìeçÎ&¾¸cë2“.D£T«h8&Ëe7nV"ÎCøpÁ¨Ö# }&_ot-ç2ÃæXL¦ºŠðï"’‚Áf&ѭ탔w¤éʼŽE9Ãê¶Y|t\dà=_©Ÿiµª¯9ÅÝU5½<}âoCʬe±É·mQJ_”–õx-ºDïä»3¦Ÿëï"‚_ -{8þFÑÇæ–éì é–sEcø ôc/ ¥Xne­£ß Ip’XÌ,X§x©oÞC§C7}yñ8㟑KÓ•F<Ø—¶cÚùc§>É÷"ÊåæÔYxVì#³í³9y«bTjýé‰NÜáù„…ªjŽ\«WÍX!Ì[Ê뺧b'ÞŒÆ)<$1ôÊÚ[,ৠƒ@ŽWÃc3/—°WnY"¬Æ4áé[_Šüå–#xÎöf3I¹[V¦;ñ²è2f’a_ÏãX;q)ö&Öö4FØ…È÷Ÿ ˆMóK¶Ñõ‡ºé€‚œ»&nˆ°¤ý‹ëžÜ[}·R½™Ú¾Nò -=X¤9ƒ:Ø•ñÒ¤áiÁáß”×ëù pj2ã¬#C÷€ù=  Ë#; .§Yº°xB±}!ÝA®í×›< ûFÔ9OµX¥|½D;-^Èê-Èñ(õ8¶ºÞsžj‘ÿû_„1Ìo^}$å©ZR‚„ÒE! -†*Nñ(ßc“À“ -ÎQÓp/6è~E”ª:Ý?ªúÚ Oæ˜%3=/4X ýÄÐuƒä–ŠžØ¨ûáá]°ÄDóÏí¼ G‹Æ˜; sL‘yø‹laÚTKcøþÙÒ5Ìg+Ÿû{Dü±Í9­M9îŒu.ÍÁGBLK¬O%¹ŒÔLM…•“–`Ov’T EíûÐÖ[ï21Êsd©Jéšp•˜éø#ÃYÝEö‰¨õrnâ芻‰…ë°¬&âè݃é3N^Árÿœð•ó+fd-9¸U0Ód‘ ´U¥A}ù®º"äöÔÝ© -ê™ã2ú»‚îY$óµÉ•­ßª2^IÑPYm3ïÜÚ×Juý¼=ÕùÌ~9Äÿ 2©”pmPkDÉ Ç¥)DcX¨Ù콘ûk*+ÇMCÆ{Ù´~­Íµ)²è5¿¯ÅL|yÿ1ª5u‡Êëñ÷Òc9„ÍrU ¶óBDøò3TyÈ嘙 SzH1ß+`Îð¶+§`½°W5Ó㎎²ÁÑÃiÁ™,÷ò}cýö3!§ïÒƒŒ‘Pu aÛ›”Ë tòÍ|T\ÅL,pÈBHðì9çÑô)8H-úäjj*ê=êOŽ<™â:õY9­ªÓ=iƒ‚h¾!‡¶ïh­ðç¼×îöÎWc?|8na|qží+¬A}~é{âV+gê7L7,ðt>ÓSÉr¢$˜@ZýaQ»²L=4›Eb ”¶¼ú¨•ËÅ›å/Dj {h>UVÇêúÓ·×!JÞ£ëp‚FL¦DE8"¸FKËyŠRŠàïQ¶ÖÿcFö,nc$õCèÛn^ºËø}ÃÞ‰ÔÕÃìm{ebèÅß5|:¼ê6ÙÑÑçd®‡ÄŽæùƆ ^Ý+÷/Ø:!\Ø°meCkn+? äm –ùK'S| j&¹qýÉÆJ²¤µúže•xz2ÙÌBwÛÝ:‘C¤·¸:¥½`RÛˆë1ïN^‹r+Ú©:/cm1+Wã¤àûðó·ê÷$â{‘™à‰¾m©¡¯ÈlXCšyÆïÓ»,P°&Ä•–¤–6Aí³è¼XË4ì¢Ljn¢ ér:S#7v°£˜¬dd÷—“dZ«¼rQK¨ý>¯õ®lH}™‰Óüzôßa­ªëµjÈî`ê†÷Vš¬ŠÖôžÕŽopõÄh€— âc—mNá»’E…¡/—¯ñ­(À»¾£ÐgñKÂ¥K_}dÀç²çšøWNy´bJºœñýÎ^y{D¹¿ áöø ȯ×Íó WV?S¢6y‚ D\ë †µÆ†ûÿ -Œ†<\a/r¼ˆvÈxµfíÉCvP€ÕóuóföÈy§Åm4ÍÛÆajùlW¤JÕ4pñûZ¢Aÿ6Ñ®–B][¢µš×´B©®¦Ö{?q£Q4¢«]*ê f1 ¬Œ*w5#Ò”HðŠ¼ª¡–©ÖËCšŒñÌ®¾”ëÓj¯¼Ã'gE¸FŽ:í·²ˆ¯%u0Aü¼$°aXÂ/ ÷ߵƪÂú¬(ß™uklê..Úá¨etV‡rÓ*$ß;>wYp®Ûr¡£îdʈ†éñÇVéÃhKñ«¸óWCÞ.ïò$.¢oÂÞQ#»Å¹* q¦ûÀ6¸JÔ àÇæOŒù[ôÏQ7óeø^ðÏa:iÄçºb¢&ÙgAÑV£ç\tj†yçר™<£È„ì3tçV(ôßÌh©×OѬEf›½ éÝK•X?`Ãþ7ØokÓÈh_y,Ü÷í½?á¬{®Mpóßù‚z¯–ž§ûëeò eÌtÞøa‚s{ú(5J<iKfÙý6ZilX'Å¢ã6ÉñÃëÓÛ)'´Y¬¼ó4a ³Ô4ǸÔ;ÁñUÁÑu]h‡ÎlŽÑJqz$KЪ@ÊÛ3§Üo%ù˜CS÷.õ„ŠuáDâ°YkÊ5N-¸àî )¦uóñ×RÒŽ»—,â,Öò‘ù;²eõ'h=ö:©aCDcjÏç¾µg"ÁÌû'…@ä¡e;éL7FK@»,ƒýëdE’¹¿eÊu]þ¦&ãñ*çXê R\×|ç>¤}Ð8ûÅò´†ïZúI–-ÄŽwp­íô |Mª›…ÞTõèË¥{E-5uyЪ(Cˆ­ÞF‡ÒogçüÚ3‚Æ?Sh`Õæ²2­£=‚II¥ñ“ÆñÎhÆz[ùP.ÍgN#w£é_á£ãäbJýè ¦3eçø1Î?­úw–û’ ë zT4{… BfA]qpeóD=>ö$”z‹Ñ”H"s›eª+è–ÆŽµz lSvöñ©…ï–YöWñǘÛFÆÉð& ëB¼´söÓn>³•Æ¨»VjÔŒw¥¿·x¬ I’ERH· |MÄãzÅsz{o ß–ž›ŒD3e'lÁb=âßç95K7ÁœÃ'ç k+'ÂæxAS5#]¡~ Ú§¾wÅäoV¬1¿AÃÍÝ4šïOFG,j‹`Ý8ðE¡4™üøìi–¢L-C^+ÔÜF«Uݱǭ„ŽŠ(û89Aû[¡÷Ó­f)­Æa|é]l©ì™ùÀ`§ª¶p«B8Lúño@}þÐ’F³’Ùa8 -åUÔwUMõ»gÕ"&ÛQ=Q¿Á²p,æŽ ðrÎfœÝ‡Qã³éîtÜt6.§>ôÙêð97›“¡ÞnW‡•‚ø«Ñ¿}‹!®N‡éi…@lã -C•Á&ûA×"4ÂÌ]iÅ Î|,›ž(mÍ…pêÖ.‰ý³oRŽÕ] ¸kŽ¬¢PÖ¡ZÛZŒŽT2Ê©‚pC¯–dô.Rn®f™7£žØærðk®–-!OõŽž1t¿9~‚ó–‰æ·q¼mxYæó”9gK’}ÃÜÕè×å HéÏAf™\pCÊˬM‚._óBâÚjq À¶]qL÷‡ Âa¯¡n—ˆ›´¢('â¥&Cv­pñf–¿‡OFÙ2ö -# ð:øF(‰¥YäsäLèÆùxÂJßÓ%ÌgæÂîˆñe:‡¯#0®ÿëÊ»3¯‡óíLM¤\“wŒgßRkHäŽÅ_KØwÓªÂìni–ŠØ± ¨wŠlNþj sßÑ8v> +stream +xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x& UM%eºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•î£·5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o +šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ +ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î +vÌó_ŸäsýðKÞ`zŒ—6$Aïܪ“³ÖUª Ô¼qTÉŒ!ÝNë”›Å/˜4ú#pöpò>ÙMBˆÁrêM<õlb®‚‡é‹à\jÑhŽ!··qèš–í:—… u>5±“ª——‡³›G¿:×MÎ{òεÁéKœJC·Ò@µ¾/)qpgŸ”­µí‚ ¨•Šgý´»Û]^ÕÞƒÛ1Ü ½û߬Dþµß™á…°ä]xŠ©9ØhNT:™~«„r…7Ôè¯Ar Òx‹'£º줔(IÖR×Äf*®•5`™xZi”çe™•Vê]è®tßó ¦@ßë¨ÖŸ :º·WH’gå Îãí;g¡ÎÞqQþ6ÿ*<È8Ô²nir{:^2‘@àcÆÃLˆ&º¢a™³SûI˜ ¡NÕÊÁãɤðÛeã‘[‹}­H}öA÷4OöÖgí +„7N•{œP¾©3¹¥Œ/Ä[Ö]ªp­Cƒ’½f±eB8|* ÿá´%Q0d’hyŽÏË9€œH7þ5'i}=½ó{LXwÜëaä6Aº„ï5Ëo7F—Aµbñ#¹‰…O[?ˆny= ¯7…³¾ÏÆ_žMSÑÓ<Ÿj²¹O-ÄËOrlºÈ|!•¡ÀºüV„, y©+¥, ßê¹2š_Sûà£#üåž ·${qÛF2<üm=àmûS}ü{/°¥ÖÌ:i­‚ƒ‹\’³¦ææŒ"×îS©ÄÙM>?gЀñ¤kMí!,£sê-Ð@‘œm.êÎ@ušltÚŽ£{±/¦£¢a?©8AŽ°KjðæêBQù–‹Mør“J­õ¡F7ÇET¤tVÂÌ''¿3ÉØn¦»3=æܽ‰(®!að5÷åñŠ&'×ì ®n612"à8F•–²£ _;Ù¦kžO„ÝÓjwX í¨FVfzÙâ1ÖãðÆé›­iàRQKzó€ü§$·+ ,o@rÂð*šAnú³,½,¶¹}ºeÄ)ywÉG~­(JYœ…Gåy T0}O7&·wŠÖŸ D©ÓÙé@ê±=Iµ~½sŽè#"Jk6ÿ´µªt‰`úb˜B½”ÿ}FžÎå”ê¡scÆ_»K3B|=iLõ÷*öY/È× d@OÏ9FÔ•Îk…&÷;®/Þ¯/]ÁH}ÄËg•ëYnq¿C…å#!èkšž®¸B<.›/æǤ¯çXd\ºiÐØñ-z+ŠÉ¥KHõQ´ h¦ÿFÏÀÁÕØ wˆÇÕµÊÉàŽÌ– $^?Bäu):pã uÖêShÏ©ÏUbŸ¼ƒMÝ(¶&gPð \`{$¾ɦc¢¹Ýà%_ µæ”¼:ËÔiÏ¿J”­¶¸•#HÆÌ)o=A¨|iÃHo5¦x8ûÕ¬¹Ùî?[8V=—¦­Mº.ïS`Ç¿%¼à%¨âÙÞëju¦JÕs¦þð²=ö–ÒkŒVH‹CÁVÑ"¯•›ˆøKŒÉúÖxÞfªxkžv7`­ÄJmœ,™iì‹—³é éM|ó‚X2<».Íhì¾0úd²n¬ØÕ ŽgÈ-KÇkenI`sã\ãQ +ï™°H¯Ñq<)XÍe.vUÀŒ‹Ææ6¼j÷(OóÈŠ¨ð"AÏ@ ä_ÞžX$#–alxUeh[fdþ.Þ_lÔæ8-®(˜ÙÉë¾—©)ZóÕŸÐ-Ž¡ÀULµ îu!lIã$)ùºI@ÂÁA5ØÀ4“î¬Y’ËËŒÞòQ€!I…ó +Ôû´Þܼõz2‹÷¤#‚JÇ_N‚aºäYCÏ>\z…„–gĈÏs³Ìjd¨¦!X¸ˆÓ wÜ2mö8Ùp!os´C?yTÿ@[Qc×Üÿq…ÒŽ¥Á=5(æΡm³× ÔIìÑ/Ôa1VGKj]Ø w´Ú}oä¿8A#çÁ°\SêœM,ZkyÀºHí(¨ ·³ÔŠSñçöš]MC~ÌTŸÜ¤Pg}÷p€‡€ J¥'Þ fØ‘Vý"‡øíbÇdsªÝë~£vz-t±~ŸU²ôn5\±ìÕµIýS«Uÿ >¢KóHšÃmµ[»nKYݼ øËÈ|(ÚÍs@w³™ >sϽ°V…–šü ®ÙÞÇ+×Xª‰‘†€9õUW«K8†?é `(zšŒÜ›×Io_eîÁ‘Í>&p×$ÏoLòŠJß´/õý…›R-“ÃOÃÄ,Á‰ þØFáÒÓýâùu.Í­Ž©X€²£ÝF:ûL@¥å߸‰+¸CVçD§›î$2ܘ±­¤‚Tô¦:‡4Oòü?ŒÙì7ØC *™VBÆò6Vjó­šÛ¾§ ÷fÝÆ1÷ídž ¿ô |ÒÞÞ@OBG À§˜«T ˜Ã1=Úuø1&\ÛTĉº(Ð64Ï›§¼ì¥—¿ž6ÇnÚ4~ÆcÅÛ[zFbÆ’RJ»žƒ.¶¡ÖkŽãÃÞDþÈÉ+GâzƒîÔ¹m_C|øþ0/–­Xµ³-`_1+Rå¬Ë¸ƒðžM*&`*ó|ÜTF-ò\<óãT¢Щ› 7³ Âý7GÓ\[C2Öb”Ÿ‘„fÊPš{í›ÔW‹Ìà±(B(¾\íɵ^*L²€N8)”póiÿ *aG„ò7(…ÛŸòŽUvÝ9ÝÛ” NŽri$!誨’«¼Ž×ãý±"ðníyæñàg±ë?ϳ· ÓøÖ8Zj"kô 䓆üùàÆUb´r¤ |Ù÷̓ÌÛ­ç,¤p†é÷ƒ³ÍÚ…ïßý«½ >õz´ø#㉸Pb¦ÝÝ7K"*t²[ÝqýXÁ2¢?Ù®Î>¿cQµôÄ +³ì$"½ƒd" <Ò-ד º!ú!áŒI™o‚öé­•“0óV;q„¿kù ÚAƱç!²‡Í¹iÉ—?E«\6ï•qV½w8á’Ž_ö3—‘¡DÏ RöpÓd‡á~.ÖàËR“Eû?ø¿±ó­šK1à +v¿»1 ëæƒÙ(ˆ¼JCü +à+N‰Ø5ÚNjÔÐY›€¨áàݵiï+Zf;ˆ?Çåe³ÙvWà·kŸÒÅüµ—¢I¹ë´“F4{½*-5 …)2x¤iÎ#§·5ž.‰©sV ñº^ñ¼ëÓýªÀ›`õVÙÅ¢UR¸¼ûpœ“åæ41$ûFÐ8ªŸ8 lV{v”ƒîÞw©³î~¯ìýý«&À꾃~èôÓEKå½ây­ Dj”¹÷-vá'†H=~€Œøä“þܦð!UMÌÆ‚qzÝKs"œÏòçžNIZÇ&s™/í}‡•‚ðQE´¶åï¼1àE˜»×AÖö¹›€Ú8!ZŒ%©u4¶7×)-¹¢þxÏ ÌŠi#Ò},V{ 3ê™Lk0Ûd±À1èÙýåÇN@ˆñ€ÖXzdöi¢ð»†¢”YµÇÙ¹þÕ‚ÅmË.»ÎÅ)6>NSã"jú¦HËèË­LnE™ƒ¦üÂKh°ï_ŽÆˆ\RÙßC* 5¦ T(´eLjÔ9úÞÓ…eñrWtA…¤ÙlõtŽcKª¿ÔL©ÓšïÃÍCm á‚cÆó7ªÓû:³HAÁÏÑ×$k!å8Õ#[;mñW¨$¥„ÊQã]T”PpÎÊ©j0)¤p)8H‹Ûä—4ÞÌd9ãYVä]mze;ûµª.ò+ÜôÖƼ9+C­…ŒµÍ7ÈÀaÀõñú%B{PçÑó²ŒG>¦ï\8ÞÓ>\ùë +¾07ÙtîRÝçP{myZí2÷<ijœçâzxÒô £'2ºñÉþD–£,9tÞ±¾vR§ðSpCŠ%è²³O»¢‘χæhÇeUfL†öH)”éßѦ"¥2¦TVÞ¤Vx/>’^Ž³Š$pEÚŸ ºþ<˜÷|š‡+œüäî˜jlJ¢ÂKiMù éÝÙ—áø~‰Ò!ÖQ‡ü{Ç´ûô"¹HПc!v©+2é5ÍlqJ®‚MÏWàï3hŸsÞ:®ÕýT‡1›ãð1QâÑ?nÑa»A› ²¨ÍÜf§”RéTø§qÉíæÛ·>Åé™*QÕŠú™Égš¾p¸ãù€ß°L£¥ÍùŒ„Ê«˜½HÔvN„4'F ­Ÿ_?jw­í€ë`Dz?ú¾É¤‡ªŸ}¯? ]{•jåqL®tsµN!CPóÅñ5ˆÃ·Ì|Ïå~º0È žÕ iê“Ojh¤Jb§ =¯ÉŒÕÿ;Ñõ¥efÚU»oÕŠþ-gì©Ù¯–Ï‚ƒ‡ÐhèCÌÖ¼Á‹Xž 0Kvî5möAœáÅ\AW*£PôŒ~é_rqúõ§EÓ<ÕÔCvCX± ¸q`3'¹¤­„{èF°–$õh\..‡ ¤õc½ÑŒ â†Ù]ÖÛi ¹ýhIèu ü–¶ô#”;üÌÎl²k¾HSEb0pßÂéôÈUÖùz¶ˆ~ë> +º.F5|EKÖ_kßU­†Ä&“ó"÷•€äûdÎ…#æ›5åØK"20¬.Fí¢Jà(2\࢚z~"‚*X¸×”•›¹-=‰Œ!‹2 ZK …‹3…~`ÊòJ&qðmvpˆ;¢¬¬Õ¼}ÜtЈD½N¸Q/pÏÐ@Øy)diDÿD¡L"Y ^ßî/;>Ìûjö‚cÊP;É)>¡ˆD‚qL¢‘hF‡\§›:ÄzPªÂK b÷{Ž:bÌ_ÊúDÓýx©4—wB<ÂhESUÈyè,ºf=°jŦc³Ûb¤€™×Nx”ØBÞ.Ô¿œÃóoRKŽNMðͱŒNpt ØA¬¡â ϹùèÓAØûE lÞn_V~M TÈüð +ÛIX¨_QW:ÿµ ]úÐÀï9Lœ`]fd„ú1ØñœÖʨó™¢r +EþØÜlgøÕ_:jûìe ‚¡¡¬¯ 3"=%…m7áûìç‚=~WéFF× 4"K¬³DÜ'ªÑ?¶úï…nÞüú +M q‚8IoÜ•ªÅö›ÍL-Ô…`€ToÞ½*Pvz:N“x ›ÝžÜ™3*IŸeÀ4µô +;S9Á%]9Ao¢ÁN©‡’p6/€ôJš6:7õ"élÈ2îqœÞ܃A«ñ)Û«Â!F—?+Íõ­ÙV³d$7ÁÌ&áýWW(Þg0 ÎÜ#Úž8¤;ßJì­¯ý‰Ù¡L¹ŒÙOÝ5 oYÖᘠ+AÒà}…a™5‚>ÂÃNFØX4²–€žÞri¸™½‹…:'é‹NÎXªËQ±lC#Ë4’w‰ùŸÈ>ßOºÒLZx¯dTH‘™‡Ø*:ÑP=@[›CQƒi«m®þ²´! +ÚÕìΨWtŠã ?oAZdævò6I›¼)’þ‰èRUÛÌ(Á@Ú”µ²âa»¦Ð£ñ Ûå²ÛšÖ/ì¬ý&Å%é¾ACF÷êÏa¶šƒ;öùZjûâÛQBÙ„ãljÎYIN«ä…{Ïy|—hX®t²RML‡WK&q¨aEPjÍ–_ê›Í2ÒÙmYL¡£Ý§ÎŒrêgsÓ¯NãÚ‹+A׃²„7g¨ëÞÊN óké…%¦~aÝ–o¥­~F¼».û#3{9D«Áä1;â´æ ÍôQôÃZÏú8w&_a†¶j¡ã÷q ´r©>Ý}~9ÃQ‡“¹ýñQËöš‚¸¸ÅÒRß +nº_Ø;úáW„ZÏ(œd ÆÅÕ>¤õ„‹ÁêÍ¢*qöŒ‚#röwQ;£œjÚÆ^kNÿyŠÕzÁ tjY×rCD[")Q’£#˜Øn]Ìcõ(ð(»CÈ=g}¶F`³k940Œܧk¤ÿe:ä#_tRáY L©£½N‡íAKZ' KLH§£tvH¶ÐSÑe6óSò<ø]©k>¿2 GÇNê#u0UóQŽÅÕòK»/ó<'\`ÛyæÒ5êLZ íèÄn™çšz‹ˆÆL²˜)ÏvŒX¡[M5þÉž„¤´‚o®HõÌLg‡œQäzä<¸±5î6Ýc²±ï.U¨vÉM{bUWåL¼Ù¾Î,mxÙ*û+‚ikX‚â{uõ<„NZ'8ƒ,T¥~ Xè%{2Ñ/f>[µª¦Dîïö|Ý¡±šöœ©.q´Ÿ›l¢”„AMãSæKæí3r,ÁãZ<Ë›¬ïám)œ+h¯zìÏa~¥^Ø‹Yºxà½M67­ +}¾Q@°ë_Â! ¡nÒ q£^c7Nh?–Dbk]z‘Zøù·Íà[ÛX=mÅ›P :žž‰ÍW½G°tC#<áß×V Â'¦ŠÒyÞÄ1ò\ðÎòˆ¿ƒˆ§9&åŒÂT«âÞ°;¯oQ +Äd²’Ø[EÜ­°¿ÈÇ`n—ÅædþǦiBŠFtù£¿ mŽ<{ töJD|Ï;±Æ&G‚iþco§Àå²-çaA3©±W(æ‚2MYÕô(mò¤ œFã³{gþz&V__éa6ÎÇp›¯ØalĺÃuwðnæc"8¡n‡:Ñ!1w‡Í‘˜Ý¿g•Ã ˆ%ù[ÛÃÞI‘nÓåÙ–~gdº/~û¬ugÉp¡`ÁPþôTiHŸì2\)ÜЙÍàÿ®ºþ0æ‡zx)œE½ Úéq;7,¦ýs¸ƒ,ª‡izÕ­éü*ið¾\~]•mî§Æ Æ K•!ì†ß!ou4›¿›û‹†«ðw<«^UG‰/)cy¯$Ë‹> täCÔž•6rеð‚jåº)×ä; æC'17'IÙŬõ1:Ï–¼pV%¤»Ã +2°ÅѦyWýö¾¥jÖÎŒUËü«üÂ@¹,íðÊ&©¾JèS"§oóZ²,¢tëpbýèÒúc•û"i}„¦Z~K¹ŠX`i~l…`šúI‹%âù>ÑH—ÓVÒE©ÆÅU …ú©KÜÖ·w+ÁJS¼=öËŸ.Ç=|µ >üô=ÛŒ +’ú C¡ãa4Ÿ—7C‘ªÜ݃~Z¨‹ˆÃ©µ»*‡‚s· @qp![~_£Œ¿:[8&‹”ŽËNp€0ËtÃ"¤ü4q%¬i¨•F³høð¡HÁ81äј=Þü2¶ã³âL˜lƒK¯:ÏÂiåsB¢/]ûP6•[x² _#6}°Åf T¬…%*FųÖËÇ}Ù‘8?´Ï›P Ò¬“ê<7í¹õìÒÂgVq_î½ò±fKú–lFîkÉ(w(:Wâyx­¹CIBÞâ‚Û¨[NõbÖcpq¹Ú4j´¥"#žþs7¾hÐag•Þ^c QÔ'?ªæå´AÂÞÊ…øh¹(LMa.‰(<ûù ¹â¹®ÄÃä%ÄkëºT)ƽØGbª8Ø—ö×tà,D¿“¿¾µ•*Òš.S:µ›èY|Ùä'Fz„yÎv~lˆ²Ð…ÿþ5£àfâ¤û–¤A-í-³ñsEZEÄ÷QàÝÜ=‹þ‹ÑMTsî›?8á‡t2eVe&…¾1›B¦\q(ɽAˆð"_²ó8ŽvTD=°e™U³ÓÚÖ®e#"EîÍÌ-ûax‘Se¯;ŠF$­àÈY‘×Ç7¢=HÞ¯½~òp±Õ¿þ) ’ýÐ+PXY-x"yQùºì€ìCˆ«=³&o™ù…ŠÒ¿$¿Bb‰ÔÜ“Q80ƒÁ˜jU¥9Ãüró5½C£öñ²·Ëä—A<Õ¦¡1RÁgó[¼X- ?¼§µebÑ×k^6*Ù J ¬(І¦7Ü1)ºPïNଛ/r§t ªX¥õø&™ ¥ƒÆôÏážµÓfÇH­öõŒ’°.ÛJó9øP>µe't§l†ƒì1M¾#,Çä1¾#Ü­ÕÄš#[ÀN).·E¶/°6~ª§ˆÄ•T1˜ôY¶#ß:a³áI]ï¡‘g=㟗ì26®HZÄ+ØÃîk +z|~ÝX!ö×½’F`à[m”Ý»”}«SqÁM÷]»&ÃÍÝùԛꚥ‘ü…@ÏHÈúû Ónê +c—™XúAÒœü.; ®¯˜›'·Œ©½C›ˆ^zºnõâ塳ýæzI‡•f®.µ[bO\–äïoË2@c„ÓRvÛQ“5¦_nuˆ+ç±Þ0p%í(p“ ,\íqºGÞâ•ÕœJÈzpˆF­zè€ÙB+>„ iÎÞbcýЗޜ:È3\0/¡4ÜcàˆýÚTÑýŒ§m q¢Òß\cÇ úb{OhD~éì#­Hýð&Åû˜éì¿Íäj…¾d›ÐTC ÿcä¢Be({fŸ9¢z±í¯ãîí+¸ƒ»ˆÚ2HŸÃ{Y³ït”CX¿4±5=vßê „$òVëlY„ÒT PNóD© “¿÷Âá4¾4k[ç†ÙÎ|y©RøŒ³„‚KÝOsOsN±< –$õ ßO8,xìÔÝMSc1#ØÐ¥[±V¤Dæó:1lž ÔzÔ,•é$âλ›¼ôá·µ©¤C}cç +RÐ%åØWÔ糖Î;ÇOÏØŒI“ëöL%Ç’,úÛ¼F¬>žÜÁ|á™ôaײÍ4˜m?3’V=·_L=Rx;`‚i<’kav`Ä óè·¶²ú0 +pºs*Å"øVŸûå¦ä!¥`˜nƒ³ß+ó+ŽµÐ˜-”a¦¿FJá`éˆöF%†m„lï×Ñ|GÅ“ˆ9€lö,Îh¶IŽ¢‡…ÿNEI ýõ>ähÜ—ð¥‡Ôâ VG¯ªuIl?¦_a‡EÁX¬¬¡Ó]VbîÒ\ß0—ð&®Bs:¹¨k~`µ8î¶ÈÑgk[÷Þ–C*qÁí%b,ˆÍ¦Y=S„Ü›)kT}3ÐwZúY+Ì¿¸‰Z™ m@}‹å],×jIºJëÇ™Œs³mæ™!É=â1P1@\¨²5ãd £ÊÕ¢+ 3[9DŒ§Ý´º;A‘þsš-lFQRÒÀöÛa¾Övþ[A(Ïô䕨:>Üa$/)œ¦ÿâMU_q£ªÀX9ð(ÂÙ9Nø†Ó3+öš¸wQžugGвeŽd‹@ÂLkZÍöç@QvÛ˜Š!-+¬d±ëO%è \é¥&û)Ë£zÝ»èëvÁ10 䘰²ÿø£T7ÞúûèÌ›ó÷Ï eN£Ow·OªCõ§{gW¸¦u‡3Ž«›°ž¯uÇ*/[ê7,›¸GÜ°”¿¤Z·R ®²¡Ï”ÊÇ‚À“É*ì5tõŠQ,öO^ÇHO‡^!VçnõYç†ã2?K0eXËk¦·zy*’"\ü®æj‰¸gFÓïiêC.Níe†Êë”–"—²a÷4TÔîÛϹÿ)ÂP~CMH” sü•cň$çi~}c5mDÍÚ64òÀG¬þ¢ÏsÒœ¸—Ò¸×õs† ¹žGîì¾íʨ ¶49×ÔüɆÿ»–21“膞„P1Ün`‡\¨_RðbèÖ‡èΑ6ÂdÙ.ÛNã²êü–û:ããœÀË<2¹»ì¼‹¶Q†.j”¤ãôiaŠ(«Ť{+ÚE +çøx£ƒ®Ñãz#ú€½ãJÿy‘ÃEäºF•“Róª»ÿø†D¯11tü@Ct´Y$Á¼šGj™¯%?¼äX+å•?L¤ÔÛ˜‡Í”_´Ò#(?Êô\˜ã@¨nw"àYl™À<”w„ÙY)ª5avQÿÊ%éömŒ—êÆ5=–AâŒ*$$–-Ò{OcŒËüŒÖ3n¡÷j¦&•3ì£Ç€ÄY+÷U&‡Zg\'ãMnÿ@÷W¢4’: zvlAÚ”‘…‡’>é„Üo¦˜Vü_Ù¹šÇ};*ˆux’ÆC,(¨ƒ|ýÜñ¹Ú÷zw¹)ç`‚‚zÂÐg\ÔMñJÿ¤žÜɆ'Ž§¡j9åÛôWÙM¶¬út5àÅWª˜»ž›Eþvó[rǺ4®€Ü’™`h—=¿©ÆôB•š¹ÍjÂìI~ •[ak‰¸‹ +£fÍ6•9í]ØTÉ°bµ÷áú1K/š&‘9€‡e×¢hœj4Šß.Î[)Z +dCŽREm46¬8Ó¥N¸ «Ô6<É,ÆÐÍÉÎæi:ýx(¥Ët8ÐËn ÿ`’®! ©›86·§FåK•5JíB«×½VYg©»,&à1:¥ËãŒ'„D=lï«&è©IãQ ¯€äÌWƺ¥„RÒŠHw²ˆsë&üÙ­kèàûmïyoµ©ltxebmHçfïêïo&Hì*âj¦Î¾kÒrX›0 — ó=è^›,›.Âå˜/Z—[’áXýõ~™?4ÒxÈÙ'€äñq ´¤ª^JÙ[K™†OøHÊW|Ý@yw³IÉ:—ˆ™ô U-MÎL áÖœZàZÌBÊíXÃ6‚|6å˃ÃçÙÚœ—äºëZ£ÇØų%GÁc‡0Cüs‰ö[}‹#µ\ˆae¤Ãú4R{ ä{ÙãaË4#ôbÏ7áÅÂ…z¬«@½‰ FC̳„…žóc’ÒNÜ4.~4\jtÑõœáåxþ;²![EâOB ÆwkäL•1Ó-M‰Ë㤶@fõ$²&©U"Ë*u A½ +¼ë0å ®ÏØ¿îZïܪc~[Q7µê4è©Hšñq‡Ôø°7ò=­³ž‰’ §™òÆú˜“duˆ?ÎÕ+r^9kæÖq槜a^NžbÁ:ÐÞ“ªC=>JÅЕd›dg‡¼]ÕúˆËz@øeaªCšs5z Q/FÐé­Dú÷8È«âX²D›íŽO@Ñ% U÷Méd>kZ|èdü%ÎÐ?,cYÎMw5ÊÃÃP|øTëZBŒåæxM~`Ô•ä×P +Ïoé†-Ë»ç² ¹ Y¶ñ­Î±‹èÞÛ°ëÙC¼aŸèß7嶸מ +뜻%CAÌ‚¬UV´‰Maü€¤Ï¹uñçó„áÜêÀ:œð؃CÛ(|#ºÉ& ÇëéòɼÏÈ8GÙx被 Š³p<BÌýÀ«›[¤Êñ+ÇÕ˳ž8b׈×[ÍT|­¥#NùæQߧCW;Gˆ|SmÿFÞÖil±^õãþ™ef C¹‡¸·á¢y JòëL;˜L]¸îÙÙeÂAÚbˆPAIÛdðIÔPîÅ¡êîµx£x¤ÀvóóZVSshö†ñ<(ïmýyh·-®Í䦊ŽEʼnqØ•!fmÝSÚ‡ðËZŒóÈAöÉlxýJ|Ÿ¶q³åT ÒŽ4˜Ìýý—HUUmnˆ øCWÜ]Òï[÷²;ZØtnh3¦œ¨8 ì.(Ðë[Ù_ô~{hRÒ¡tá%kj†)á¦U12Óx±g¥×_nŸò‘±q»ÉWŘÄÕÜh95Ýô릆‚˪¿´¥eI]"è+©$jW M vžÈæ ZTb"}¤ªTS ‘O{hŠ?"ʲ|kêz*uÖqÎtR‡c7J—‚5ø Z‚†R +×·³÷ŒAÿÞ]ÿ¹:#¥µI丙û@òñœPœ p9EñxŒ9"úˆçFëÒ1“ä2cÈÝVâârÌàOÜ>KÖ>uÒ»jì¡ír¡Ž#ú$ÝQoë <µ ƒº²#×_›Êÿ~†L²¸Q“Îxêœ-ñ9t­@i_Àš9™’»ÂuŸîçrÿ +ÑÅÛ±åprkBÙûCzÆaÑÓ3ëÌ"!²2ö]3¾v{ÌÆY­»G «Œs» Oå×náR¤C2¾&`ñNƒ§Eƒ“\ÙÍ9È&Bê.üŒ¶Ù· nRV'“BV’äýáú%h:¾.l¶CÑy%4KÉÂTÙfÝ4„T·:ùÔÖ4_'áULšj€žXËÜý¤öiû ÃÆûêç”´c§=`²¨øqªe˜ßC´Ü¥îóÚlméòùfôæw Ñå#ÑÇ’tx³%;$àh én÷ý ‰7pP0OÇI¢£§f2TûvÆafÕ4Qö“ ˆ,‘XûÜLܧ–zá_ÐáVM¹‡¦OšdvÉDþeQܪ#éØ©èªmc…PðQh–ȳç%w"?/]]‡iîä-7.ã ’ÿ¦VÆ|K‰bÆ”`ˆëF¡·bÈÑ¢-ñ1Œ¨y4T,}ueé'ÊÇõ»•ã Nø0mT#?[½ø<ÿ=†C³)õðœC“$²h,™#O±Píe8ÒE(,–# s¼zMÎ)0Ý‚³0µÀ²DU4–;ÒðÕ…1¦ãŠ~Ç0W€/MY$g´™•A-5 Òþ 7ãnîS}Ž@N:°óï3ÆúZ½Fõkwy<Òð‹÷ÜhŠKÏ=s+8T¬ªÈáö@°on»ÕÜDük w¢ïž@8'ïop°ò›KéC©ºyϚʡ½ +H¦Ö¼9Gž¸M‡ôº„þP¼¡ïÒ4Š›µ.¾êJøiˆG•Ä$ …hÎX÷lÕ-DÞßÍ›á/c;§Ü?‚Ë¥9‡l®Ñ{Ä­Æ»òni†n½$›B×:õÒ©~’Xvy x’9c…Y + w/¼ÞU·O§”~EÁÏAç8Q•|ðŒGÇ=gý9,?YÁ2Ë2L"ôÄEñK‡æPüÚ÷AÍí"I1„'{†§³ úº¿¯c¼NøŒß_lbéøûö— m„nĜɫí÷Zäo£‚³|t0ó>ú>S‹Â™ÔRú—°zaI¿ î%ÕA˜">© •N~ú‚×-† ®2-QVçh-‰úó ýÞpܹâÛ/–¹"5vÎf—GWnT66þ8éô^úÞu¾4+k‹O5Q]¬NÙ  ¡-ël_M¸k˜ÚûAú=é&;4³áhgVå°CºìÞÃ5ÉÕMå×\Æ»8Ô\¬è”&fO³úÇ;^‘RÒ.æ,S–¼÷ƒ`÷‰†¹¼3y°f?s&†ñÊ; WÙ,¼K#«©Ù¯®øbj[¸_VM2ë*BWMŠ¬3@¿1(Ÿ¸éŽ÷ÏÉXúŒ¶UÑäDär ÷ñÇtƒ7Õ‘l g h/‚Ÿw˼¯rÔú'‡cÀUµÁªqFÜŠ%ÿÖi8ÉÜÕYýXò³+~¢‹Ùäûó¥rkHú¶>O­ÐÑѤ²v†1˜#°^:á?Q7Q¥×8Tnn¨tÑ#œ6nœlÕó Úî×îŽq + Òo)³S™2áØ¢c—¶FäKa·\®ó*‡©‘@èž›XsIÅXðûh‰ðeýÖ8%W6¤¹¤‹»Ü²yÕŠ½¢uoUêJP'mͧésŠêø?¹ÄÆŽÞמ+Ü¿eB*£HH:`rÀL]¿ºH.âØð~}Êη¡>¼üHÇ8š½D ýâ.ºQÞùÎ_]Ì—%×Ïت3©W$@2?d…°Õã¾Â`¾²ß³Þ׆>xÊ:ªÔý°™9•YæÒÊßÞñ˜¥ãë^:?Ü'°‡eIº¼¨-„~ä˦MÕ7W¥_ÓÞàÁ¥MxqÅß)w¾€Ì}®+È Á‘ÄâGu™.­Y6¸D£‰ý}KCîý§WçRPn"8U+Sœ÷ÂøÌûyvÝôL½3ìüî3QÁš\É–ä>¨UHC{ϊѼ•€Q¹!÷Å“÷.¼?;L9§ZšÒE¾é«v¥Ž}03|­˜6þ–ˆ¶9£,whœ-ÇËŸ­×;?zøpÙÍ„y8àŽ9Ë¥H»ÑHîÍÄû-q˜˜\—1άÄ.5HLUcß|{¨8óŒòZßÔç`äô³ÁPß½Q5åŽèz”=ûŒW0zúU÷Þ r còRˆžÿžDCh-&¦)¬u#Å>"1™k–ôÿ »žÍÌÃá±N”vD#¹¢A窠›`_ÝxXÒÈwgÞ„ÏÙå 솋ÛÈK+´CܦA"Ê +âc§x~XÃJo(¦cé;‚÷ÿ¨š#1âŽøé}SUx °f=”4+ÿ䎧õZ›…HK0 +—€_úØî*Ý– ·£ý7<³Y6ªãvl¤ÎݱæŒú‹Ù¸™‡ÈÈc?m·Ò†h¡ˆÕ©Åç•¥RäÍ×”»L|âÊLwõø Ρò°¤¼AçYKr¼Ï¹ÙÖJÑkW½b%òyQ·ŠTæ9æ‹Ló"$N¬½ôž‡9ȯòL¡åùö;û¿ZÆMú›¦Ýj{wAÆILTI¨£%èÔ&ëö…ôâÞ %§½(1ã:«/h•¶µôÕ9óUÖô”‘­Í¡i¬rÝxUæ¸ÂÝPÂ#á61”#,*@Š –üb±·Tx8ÙÄç{ëG79yçÐê°ÀCþ“væ$Põ`Ò匀V–ƒÿþu6®%…Ùqc†¬Ó:†wtÎì•NôwØÒPÄv©*û&<û'ývýЊâ¹!ÔA"OýMBð¼"ðÛQܸ…ÍK) z²>Ç'áØóô-oâŠÌ#°±ÛÓ­ÀD/&Ësg k7/;ô^D÷‡ÞKÉÁ¤ ŸCH-²oS<ÛõCoõšÂÛw˜´øŒª"ØK–_Š­"H‘¬ûVpÆsáõpa¡£_Ì×SÈÚua¯õ°Ü±l|ÚV±{+ wókÎ:¤6= s÷(HfUôRê¸zP¢[E  ïcYÄEùºŽsûr~3§Ÿ°3ŸMÆ?å¦T‚°ÍZ5ÕèR˜±˜rL‰buO[ˆ`×w\ÁU·?‚‹œWà&ó+Дzu(“ Ø!ÌìÅûR% 2ú§8xdßÿó <ÌЃ|Šˆîç }®rw‚RÕ:Mp’òÛBÿÉ]˜RòöÖ„½®íX((gÿ¶Ä?ɸ‹e»¿è­ÚXÄ`]¹#ƒÝ’X—ÕofQg è¿ÏU„»7­‰¥äœ“sõö‘ ý£Ëw5Y¬•ÓaM(Ã]Fƒn\^¥BW¢É–Œ~3 +ܯ*ù V}ÒD¦ÿôð¥ÎÈ +}ˆÒçq=G/¦8õ6ÙüÍ/]Z?ó{P>yêU•œµú}éË2&@žÊå:Þä®þ;TÆ +݂Ư9ÎÖïSftt7,-–‘hV©©< ®ÙÒ]+,àŒA‡Ø  •;…ÔzEå]þ<Ïßý‹Ìɤ C™Ñ6ïðÖR®{ÒºsŽyZÍÒ+±êÈÜôÄk´ѤFÈZ‰!FÝmP€×:%•éd +Ü)„lk2'¨ á"€”Öó±âµ|syùͱÕe€\ûÊJ;YýMªI­‘_£ƒ~Æ1bfÓõÝd=–ÙþÅ|SÅ=UkΫ +S­‚DÍ0 »(ë%ªUÎ17%g:F‡°ÞZ?{¡ßs·1SÊ« „]« +G7ôæøÆnuÒ{«ýef‚‰@ÆÚJt'D©Ñeèb ÕÓþÿkŸ,ÛšŠ( ¢Ä’n¤Gw3pÔèÝH·„4 I‘.é–îÝ%HŒîîÚ{ÿÃûí>÷ü€óá<ÏñÊ@J>N‘÷x°íþ®/Àï^ÈnÙv®Q’U õ×=[#Cã]6öçÑŠŸ‚h& ’Œ# ëyƒòk»6úq +ÅGÕkX:gׂ še£¤xu®ôØ\CùqKå1¦g ¡lø 7[Ù²Ì4Òÿ¹[PÞÿøç¥ÏFÔ´²ÿšûI#pŒ"­ªºóöWwxN¥&ÿÊYGúéÆ„¾åoK?\aùt@½=¥¢D#UŠ&ÐmÂ΃:Kó#˜´ÏÙf`ÃN¯Ú¬5}=ÿúfy$V·‹Id”-é%#©¾¯{z²5…رF’oö¾!²’»÷ØIáMØïä†H}ØÝÖR´x`î/Æ]è›Òª^3±Í7é¶ûñâ¬Â^µñŠ +·(FLH³~å¶ÞÖ@Õ6Jäó¾xÌ0V?K£ÈÕJÑ}gy,‹¨†/ã©$þ¸Ì~“Æp\!#…þö/»-ñæ –Ú3Uv+l•EM ´Dýý_O‰uò!÷¶:) G‚·Ñ é91¬ÄdÐ~í@§q&±ÑŸ<¹¥ËŠ)üÁžjÄÆpîp ãO`6ÿÓaÌ€“Ê ‰bœ›³ƒø*Ln•OA‚+«ä¿dWÍXäøkÚ—­ ÞÎÓÒU±?*›¢jžêß_ ++µ¸¹­Cí­u†Æ…¥v‹øò¬WU˜}öÔ“LÂØÏÚ(kœ¾¨RoiÍ^$Hé~ÒøÈz’T ñ׿·xû0­®Åψ_ShúÜ2\o­EŠã¦=U´ž$¸_N Ó–jz͉Q +Žò2Oa}=AÀmãUv”'·ýÆû9û¨,Yó‹Äg“ˆÐ‰$¥°®ÇªÍ3|Zí-Ä +ïùnS;ÝŠM‚­fˆðÓ%¸<%kDpu47û95%–T +G“¢æ×*T‹J<Èü«˜t‡'On¬ÄÂ.ÚrÁ.0£€w=J/ê_GppÄÒ A߃Ðd=F¹­ÖO-ZÁ 9†àU‹¯ùsÃÄh #a™jÔì‚NÌ– tNcñ§VF¢ïÎ{Ȭ¦ˆUŠñŽ*Cs~ö²sg_ܱu™É¢QªÀU4“å²7+ç!|¸`Të‘…>“¯7º–s™as¬G&S]EHøáWIÁ`³ “èÖöAÊ;ÒteÞÇ¢œauÛ,>:.² +ðž¯ÔÏ´ZÕ׈‚œâ^ž>ñ·!eÖ²ØäÛ¶(¥/J‹@Ëz ¼–F]¢wò¿ÝÓÏõwÁ/…=£ÆhŒcsËtö„t˹¢Æ1|Pú1—ŠR,·²ÖÑï„$8É +,f¬S¼‚Ô·Nï¡Ó¡›¾¼xœñÏ‚È¥éJ#ìKÛ1íü±SŸä{årsê,<+ö‰ÙöÙœ¼U1*µþôD'î¿ð|ÂBÕF5Ç .‰Õ+‹f¬æ-åuÝÓ±oFã”’zeí­ðÓ„A Ç«á±™—KØ+·,V cšðôŽ­/EþrË‹î ×öëMƒ}#j€œ§Z¬R‰¾^¢/dõäx”z[]ï9OµÈŒý/Âæ7¯>’òT-)AB鈢C• §x”ï±IàI稂i¸t¿@€"JUîU}mÐ'sÌ’™ž,Ð~bèºAòFKEOlÔýðp€.Xb¢ùçöÞ†£EcÌ9¦È<üE¶0mª¥±|ÿléæ3‰•Ïý="þØæœÖ¦wÆ:—æˆà#!¦%Ö§’\Fj¦¦Â‡ÊIK°';Iª…¢ö}hë­w™å9²T¥tM¸JÌtü‘á,H‡î"ûDHÔz 97qtÅÝÄŒ‰ÂuØ VqtîÁô™?'¯`¹NøÊù3²–œGÜ*˜é²HÚªÒ ¾|W]ò {êîTõÌqý]A÷,’ùÚäÊÖoU¯¤h¨,Œ¶‰wnmƒk¥ºþ Þžê|f¿â‰™TJ8‡6¨Š5¢äÇ„ãÒ¢1,Ôlvˆ^Ìýµ•Žã¦!ã½ì Z¿ÖæÚYôšÎß×b&¾¼ÿÕ‰šºCåu‹Îø{é±Âf¹ªÛy¡ "|ùª<ärÌÌ„)=¤˜ï0gxÛS°^Ø«šéqGGÙàèá´àL–{ù¾±~û™ÓwéAÆH¨º…°íMÊe:ùf> *®b&¸Fd!$xöœóhú¤ýGr55õž?õ'GžLq ú¬ÀœÖÕéž´AA´F߃ƒCÛw ´VøsÞkw{竱>·0¾8ÏöÖ >¿ô=Hq«•3õ¦x:ˆé©d9QL ­þ°¨]Y¦šÍ"±J[^}ÔÊåâÍò"5=4Ÿ*«cuýiÛë‹%ïQˆu8aA#&S¢"\£¥å^u›ìèès² ×CbGó|cïî•ûl.lض²¡5·•Ÿò6Ëü¥“)>5“ܸþäc%Y ÒZ}ϲJ¼G=™ì f¡»ínÈ!Ò[\ŠÒ^H0©mÄõ˜Àw'¯E¹íTŠÀ—±¶À˜•«qRð}øù[õ{ñ½ÈLðƒD߶ÔÐWd6¬!Í<ã÷é](XâJKR +K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW¶ ¤¾ÌÄi~=úï°VÕõZ5dw0uÃ{+M VÅkzÏjG‰7¸zb4@ˆKPñ±Ë6§ð]É"‡ÇÂЗË×øVà]ßQè³ø%áRˆ¥¯>2àsÙsÍ@ü+§hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤Òøɉ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl +s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ +¹ƒ%ÔÕÝÙêjýM>â endstream endobj 900 0 obj << /Type /Font @@ -10442,14 +10423,14 @@ endobj /FirstChar 2 /LastChar 151 /Widths 2155 0 R -/BaseFont /LHZNYR+URWPalladioL-Ital +/BaseFont /FKTXQR+URWPalladioL-Ital /FontDescriptor 898 0 R >> endobj 898 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /LHZNYR+URWPalladioL-Ital +/FontName /FKTXQR+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 @@ -10472,7 +10453,7 @@ stream xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå  ùËAKOÏð_–\¦^ÿütYÚ¨þ>¸mí€ö®)þŸÕ€@€«`²Ä””ud¥4RŠ) =ÐÙÄ ìfj 2ȃ̀ö.@Z€…ƒ3Àöß €™ƒ½9蟭¹0ýåq˜\f ¿a@O3 ã?Àèlrqùû ¹,Mì]ÿöÀÕ²7³u3ÿ§€¿v ‡äèìð×Ãî/ö—LÙÁÅÕÅÌäè ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.W §ë?¹Ls‹£­‰×ßÜÉAÿ*ÃÍdoù_0œ–&Îæ¶@—¿4¹ÿéÎíð¿íÞÄÑÑÖë_ÑÿòúÏ@®.@[ &V¶¿9Í\ÿæ¶Ù#0ÿ3*2öV–ÛÍÝÿs:ÿ«A4ÿÌ íß"LÌìm½æ@ fE׿)4ÿo*3ýωü? ñÿˆÀÿ#òþÿ÷¿kô¿âÿ¿çù¿SKºÙÚ*šØÿø; øç’±ÿ?¼Mì@¶^ÿ7ÿÿî©üw‘ÿWW“¿­±·ü+ãW&–¯ÿ@.’ O ¹2ÈÕÌ -`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYD\MJV‰þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï +`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYSD\ZB–þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï ™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖµ?ªª…¹{G.ž'Þ½µ$5õü^oDÌÒ’j8Á¬R/ë‰yÝ࣑<Ì`½^ úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ ¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ @@ -10534,7 +10515,7 @@ MI ¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£ cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …x;³°çlqf—š “d79˜R€2õ¨)iµ†–Gö»€ê&‚—ÜÞ¨CšùŸeVò]ÏÓ~„ð¡T}îY¸dë`XÕìéÎ<òe JË»1ÒXê¤QáÀ#÷gX¹;«ÜÉà{}¤* ½lÈ»€~.ž©kÜõVÅÇ®þÒ€§ú‘7ã$o—#€àkص <Éâ{ -¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,Ê楧fˆendstream +¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,Êæf‚endstream endobj 803 0 obj << /Type /Font @@ -10543,14 +10524,14 @@ endobj /FirstChar 40 /LastChar 90 /Widths 2156 0 R -/BaseFont /ADSGJO+URWPalladioL-Roma-Slant_167 +/BaseFont /VADHEJ+URWPalladioL-Roma-Slant_167 /FontDescriptor 801 0 R >> endobj 801 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /ADSGJO+URWPalladioL-Roma-Slant_167 +/FontName /VADHEJ+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 @@ -10566,24 +10547,18 @@ endobj /Length1 862 /Length2 1251 /Length3 532 -/Length 1861 +/Length 1860 /Filter /FlateDecode >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2@ ŠM „‹ -ŠT†dBI& (— -A@0¨P¹TZ)­`åb°¢àY#BAn¬\uÝôØ¥?wíÙ™?ó>Ïó½ß3Ïûó™™xúœØHìŠÅÒgwŸC ‰dœ™™3 -Cb"tÄ0 ííAÀI €T€lG£iT;œàŒ„E¢¼`®°pþlQd8 `”Ç‚„€;$æ¬ â>‹‹#‰€Ÿx/®Þ°F#`6‚›ÇAp0Oˆ#-:b9`· ³%aï¨a¦ Ìägf‘ù‘æàH¶Œ9ùo˜ZÙÜUÂç{@‚ÅöK)ý‰‡<~ä["“ˆapGØ0*\)õ…—͹ÃlžD°’eˆ!>å$ æô!’­©ËOäÊ“ÂlOž˜Å8_/á°½Ò -ß’’—«û/«·s]"=!žP¼?2 ÈïÕK5ø¾ÆRByRÀŸL$“ALˆ½ï¾Vl¶GÈBØiiºÙ®÷‚æÀ‡›ð‘O:·NÖÆåÝØÉš¸}ßቹ¦™+8ŽÚAÓÐìc\'B¡°òqj¹§RÓgϯg¦7ùKŸ§š¦˜=oõ)—ΤÅFÿv+L7u,£xæk¦®É˜~}àŽ<醒”¿·ÑØͨí‘5÷Õæ6+Ù'ÁäAëU—Fj ÚCø¥ -Ly£ÒÜ\û¢ --¨É5vyþ}ýιøŒâ—Õ§=+­—kw×뺻îõ:g¾,ÔòèÐH£¸K®ÎÊj¹'ÆHøáq›Žî;{KÅ >Ð1øîk¯€\r}­‘Ñ2fâ©¡Ë,—]qÐNH¨¹n[( ™Ý¡¡9ÿ¬TL [¨Ÿzf€kz·îp™üXûr÷È©?©)–’Öïjö³LWØô&óàóº~î'¡ÓõS¿ -Ï›?:¬>®bÊúä—qæ7Jüþ—¡ÒÉðõù×nɯɉ®„Ö‰Öþ[E¶Tű‡“Êë•7Æ$ 7Ìe$åmÊ„3YlÿÒ<ß‹?ª™‘¬+*‹ÇUM=uó)ƒ¢…0螢êSÚ<Êyæ:^á0YYêOûÜg߯qT1ç¤Ó‹¿Ÿ"½Iì~¡Q×*5*ó¥W¥LM—hµ¾Ùê™Õ>ÄÔ“ÍYYÒ)Õk$ûš @šýî~Ã.œ¹ ¿Ií[Öû*£íu¼ƒq–ë<ýùnóî×ÜügÇ5¢SäÃEt|â:ÿûªU*õi£0Ú}y@ű®0í¯» -•)Éó[ò‡®7Vì:˜Çhöiyhw|ÃlÓ«D Õ·™Už¦«‹ûJ*ú¶ábuÁÀG$ñö²÷p}Â(5ñyQBCG¸çÀ\—$§!7!ÇC~%Šœù¤)ökµÑ)Ç÷D_uo€£ŒÚjîü5ÕñX׺™»÷àÔúBÙ˜›jU´fŸîÝNײQÝÖ…Zöî–Û£Ž!CN×´$Aü6ÍŸd‡›@Âaß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ„úpv«× íøT6Í)¿éC x}ÞäÇo¢ŽªFü׆þÒ×¢¯ª«;zº³+Ù7ÖÍt®]šrF9µqg{7áÄ®læcÆɾ/èng4úçäZ«“ÊcÙ!õ6hÜ!IOL¶·F¯Œ[°6°7·‚óù?|pÿoð?Ñ»º!TŒ 4÷/ãµþSendstream +æ2@ Š&X4•;"(R’ $˜$ \(PÁ Bå"Pi¥´^€–‹ÁŠ‚g¹iL@°rÕtÐc—þÜýµggþÌû<Ï÷~Ï<ïwÎgfâáM ³‘ ØŠ ¤N®Þ‡@2É833'†ÄãM=çi,.-V^=!LJ*ô¿d9œÒE¯d¸¥5]¢{ñjZQ¹_V<µ‰ØãLL“­yme>Ê”‡<]ðÒÖ„>:ûí¶í½ÓÛâÚtαUŒÃç绵7Zz´4Ýl×{AsàÃMøÈ'['kãònìdMܾïÂôÀ‹œÓÌGí ihö1.€¡PXyŽÐ[î©”ÇôÙóëÝÓ›ü¥OSMSÌž·z—KgÒb £»¦‰¿›:–Q<󵻮ɘq}àŽ<醒”¿·ÑØŨí‘5÷Õæ6+7Ù'ÁäAëU—Fj ÚCûüR¦¼Qin.‹}Q…Ôäïyþ}ýÎ9|F qõéCÏJëåÚÝõz î®{½N™/ µÜ:4Ò(®’«³²Zî‰1~xܦ£ûÎÞÒGñ‚t ¾ûÚ3 —á9¿ÖÈh<~=Œ¢e*ë²32ÿêà+æêòµ¢‹M¢’Kñc‰´þc`ÕÍÎ.ðj<ãHN,s’™¦—|-Æ‘ãí«,›7ÊêôzjÎÊä}:Æšýʬ(=…‰¬RÈãœÑžÍLÏðpóôÛ¯w¤9/)À=à¹ZÝ÷¢âYrvÇØ–„1_u2óDëËÁ «)Ѹ·6íRW©_Š¡y$|©ÁÑf¦@“^~v½Š©@rÚo2ü.èâ&gs£¦RÏýÃôeÜàï“ßo, +!üm94¡ÜÚ—=7âjp²Œû\é^çP]flBìµ·Kê ‰À9¢²¤v嚧ø›Ö‡÷= ‡Çe 3ñÐÐu/—]qÐNH¨¹.[( ™Ý¡¡9ÿ¬TL [¨Ÿzd€kz·îØ3ù±ö寑S;~RS,%­ßÕ`>˜®öÙô&óàó†~î'¡ÓõS¿ +Ï›?:¬>®r—õÉ/ã>Ìo”þ øý/C¥“áëó¯Ý’_“ ­­ý·Šl©Šc'•×+oŒIn:˜ËHÊÛŸ„3YlÿÒ<ß‹?ªÝ#YWT«š{êæSE aÐ=EÕ§´y”óÌy¼Âa²²ÔŸö¹÷¾_ã¨bÎIú‹¿Ÿ"½Iì~¡Q×*5*óeT¥LM—hµ¾Ùê‘Õ>ä>¨'›³²dPª×Hö5€4ûÝý†;öpæ.ü&µoY7î«HŒ¶×ñ +ntÂY~¬óôç»Í»_sóŸ׈N‘1ð‰ëüï«V©Ô§Âh÷åcĺ´ ¿ºí*T¦$ÏGlɺÞX±ë`³Ù»å¡Ýñ ³M¯-TßfVy˜®6.î[(©Û†‹Õ‘ÄÛË\Ãõ £4ÖÄçE ás]’œ†Ü„7ù•(ræ“R¤Ø¯ÕF§_Ü}YÔ½Ž2j«i¸ó×TÇc]ëfîÞƒSë ec.ªUÑš}ºw;ËFu[jÙ»[n:† ѯiI‚ømš?/È7€„þyéš36“œô€ñî‚íú†ë²ö’8||XÓ<þ õáìVÏAÛñ©l=¿éS x}ÞäÇo¢ŽªFü׆þÒ×¢¯ª«;zº³+Ù7ÖÅt®]šrF9µqg{7áÄ®l÷ÇÌ“}_2\ÎhôÏɵV'•Ç²;BêmиC’ž˜l/^·`m`onçòøàþßà¢vuC¨@h(î_Û-þRendstream endobj 741 0 obj << /Type /Font @@ -10592,14 +10567,14 @@ endobj /FirstChar 13 /LastChar 110 /Widths 2158 0 R -/BaseFont /QFMEDQ+CMSY10 +/BaseFont /BFRUCK+CMSY10 /FontDescriptor 739 0 R >> endobj 739 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /QFMEDQ+CMSY10 +/FontName /BFRUCK+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 @@ -10623,7 +10598,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœN^AMTA‰êŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ +xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNFAZXC꟩ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ üPˆŸìá|ŒRbQ»š€ê ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””s Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W WâãÆ[.¸N5ÈõëZS† @@ -10717,7 +10692,7 @@ A ­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬ g¤£Ê¾2f~mû„m}…i¶xÄãæužÙÆœ»‚ÙüÂx\Ôt{™C Àåò ›ËøýÈ·'5' ªzqvipd×kµ»¶j©@ƒæ…:Íw¾?bøàôVs,%ãIP¡ÍSÃ…„A³ô‰ìDª`Ïûñ,{r˜¦fY—AÀ˜EÏ¡+LNä^õ,¸¬Y¼B™¡9ÛœÐç†dbTC4è¿JLWl©0Âkž ^¸ùT›Úò«¾¦ét«§^Þí§/‡3SÄ蚇dQœv(CÜ쇵È%#¾j0Æ7›5pEZ‡ì—,í¼éÀOÇéÃõ¤¯(CæýéZb4üÁP”™Γ{5Þ…k`åùÃJÙãpÔféAvs,µp̈Õ.¨±g¸Ño¡µ°±P9:Ý,'c|Ì1eÁh†M~‘fQÞúûdú9’LÈúôÖN0–"/Ó|8׃ҿ]‰/ óûÚûس˜z$©Ôü³[<~q÷é#ƒä2 'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿?qEµÀ¡Glq_åOÎ1ŠL$HülÓ‚|²ëÅ›:vÐ Ø›¨†À<¬è2ëg8„7ë%j ÅL/ARWˆŠmõƒÑ ±)Cðî&œ£Ò(q14ŒED;ÌjdW åqêÒÚ8ß'‡õt˜{r›`üz$¸~ЗV-ðr#QcªžÉ¹=H­EÍëCóIîÁÕŒ–aYÅuz8UG²þºÝ¡HJP+dGR]¤IؘNd'×DóN'é[ºqÆIÒĵF,·;Å—d•”©7•‘W­_ˆF®kô­é¢á£tΘ ~­ yTjænUÀNöÂߥ6”éŸì¶\e>:3‚t{ù^÷p*kõ!1ñÖ3«/¥tŒëÖÈ|æeWç¯ÛQ#`IbýÍÃ$ŒPÍXÉSKUŽž¡’` ËAÅžþ›m­%N©ò’÷Y ¥Ê¡K_º`ÕsYGõ¾ìŸö¨,4ƒ“³›¯HC'Ÿû89cá[ã Û2?ÆN¼ ü±ù#°¥ª0ägã¶,Š¢œ¡. éj”¿ê?ÉxG# Ò+“Å.ă-†cå-Yo¢UÄVõñÈö15Ò»æ¾Ýc@@íéíAŸ LüUÜêÏÉ…ÜÔ¿©ÿÌZÏ‚ñåÎSUn9“mbµf[‘€Š±ÑT8D1¿4г#hqÙך½E9É{Ь¶uîœb…M'­?/ÖGÐÿéε%¨˜Gš±Ñ3 ?hßó¤¸þa¶„çŽØyžÓ€’^`´ý×Þz\‹÷¶v«áP{ÑÑ•Ih~×`5»æ0ïfM…ÂÛ -ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶û;¹Uendstream +ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶ûE‡¹> endobj 736 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /PQWFQS+URWPalladioL-Roma +/FontName /MQLDYB+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 @@ -10753,7 +10728,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:Iy YªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS +xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:QqI%iiªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»šê ÿ\%ý}þ54>:2Ü{Ú„M•IÊå KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó#\2®˜Æíß»OÍß 6.â'¢ÿp$iÊíù2ŸÒ;LÛ–Oòá ±Fóyº)‘ùµ©ãà~ ¥ŸC¡ë­„aø ÅÑ«¨ÙûGæhg [&óâ<1—Xû²Âø{iª_“¸bf)¦Œ²§T˜ ÜÓ»GAe!ógF玦àUa!*ÚZ0Ÿðç/è a0¼€ž~£œ†äwÝo âïfŸJ³xÛw® ÞaÇL¿õ0 è^š `8¿Ú Ù4Ùç÷ Ï©4†V×"”]BÝ3pþà·½_) èIÞ\H$séåXŒ{Òb^Z,ÃÛ6ö©ÉÁ ¬–R2µCÇŠ‰t(£ˆOܲÓ7‚9òó`e€² ä@y%0júAÈëRÿ˜à˜~xƒ4wÖ5çíÂàÖ±åmÝÓ×â}=Ð’tRX[>͔ҞÐRÔ "çH³l/é•_r> endobj 712 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /MAJPIN+URWPalladioL-Bold +/FontName /FHJSLL+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 @@ -12316,7 +12291,7 @@ endobj /Count -4 >> endobj 2167 0 obj << -/Names [(Access_Control_Lists) 1638 0 R (Bv9ARM.ch01) 947 0 R (Bv9ARM.ch02) 993 0 R (Bv9ARM.ch03) 1010 0 R (Bv9ARM.ch04) 1059 0 R (Bv9ARM.ch05) 1158 0 R (Bv9ARM.ch06) 1170 0 R (Bv9ARM.ch07) 1637 0 R (Bv9ARM.ch08) 1663 0 R (Bv9ARM.ch09) 1678 0 R (Bv9ARM.ch10) 1899 0 R (Configuration_File_Grammar) 1194 0 R (DNSSEC) 1126 0 R (Doc-Start) 711 0 R (Setting_TTLs) 1563 0 R (acache) 1000 0 R (access_control) 1323 0 R (acl) 1202 0 R (address_match_lists) 1175 0 R (admin_tools) 1033 0 R (appendix.A) 614 0 R (appendix.B) 650 0 R (bibliography) 1686 0 R (boolean_options) 1075 0 R (builtin) 1407 0 R (chapter*.1) 746 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 570 0 R (chapter.8) 594 0 R (cite.RFC1033) 1814 0 R (cite.RFC1034) 1698 0 R (cite.RFC1035) 1700 0 R (cite.RFC1101) 1796 0 R (cite.RFC1123) 1798 0 R (cite.RFC1183) 1758 0 R (cite.RFC1464) 1836 0 R (cite.RFC1535) 1743 0 R (cite.RFC1536) 1745 0 R (cite.RFC1537) 1816 0 R (cite.RFC1591) 1800 0 R (cite.RFC1706) 1760 0 R (cite.RFC1712) 1856 0 R (cite.RFC1713) 1838 0 R (cite.RFC1794) 1840 0 R (cite.RFC1876) 1762 0 R (cite.RFC1912) 1818 0 R (cite.RFC1982) 1747 0 R (cite.RFC1995) 1705 0 R (cite.RFC1996) 1707 0 R (cite.RFC2010) 1820 0 R (cite.RFC2052) 1764 0 R (cite.RFC2065) 1868 0 R (cite.RFC2136) 1709 0 R (cite.RFC2137) 1870 0 R (cite.RFC2163) 1766 0 R (cite.RFC2168) 1768 0 R (cite.RFC2181) 1711 0 R (cite.RFC2219) 1822 0 R (cite.RFC2230) 1770 0 R (cite.RFC2240) 1842 0 R (cite.RFC2308) 1713 0 R (cite.RFC2317) 1802 0 R (cite.RFC2345) 1844 0 R (cite.RFC2352) 1846 0 R (cite.RFC2535) 1872 0 R (cite.RFC2536) 1772 0 R (cite.RFC2537) 1774 0 R (cite.RFC2538) 1776 0 R (cite.RFC2539) 1778 0 R (cite.RFC2540) 1780 0 R (cite.RFC2671) 1715 0 R (cite.RFC2672) 1717 0 R (cite.RFC2673) 1858 0 R (cite.RFC2782) 1782 0 R (cite.RFC2825) 1826 0 R (cite.RFC2826) 1804 0 R (cite.RFC2845) 1719 0 R (cite.RFC2874) 1860 0 R (cite.RFC2915) 1784 0 R (cite.RFC2929) 1806 0 R (cite.RFC2930) 1721 0 R (cite.RFC2931) 1723 0 R (cite.RFC3007) 1725 0 R (cite.RFC3008) 1874 0 R (cite.RFC3071) 1848 0 R (cite.RFC3090) 1876 0 R (cite.RFC3110) 1786 0 R (cite.RFC3123) 1788 0 R (cite.RFC3225) 1731 0 R (cite.RFC3258) 1850 0 R (cite.RFC3445) 1878 0 R (cite.RFC3490) 1828 0 R (cite.RFC3491) 1830 0 R (cite.RFC3492) 1832 0 R (cite.RFC3596) 1790 0 R (cite.RFC3597) 1792 0 R (cite.RFC3645) 1727 0 R (cite.RFC3655) 1880 0 R (cite.RFC3658) 1882 0 R (cite.RFC3755) 1884 0 R (cite.RFC3757) 1886 0 R (cite.RFC3833) 1733 0 R (cite.RFC3845) 1888 0 R (cite.RFC3901) 1852 0 R (cite.RFC4033) 1735 0 R (cite.RFC4034) 1737 0 R (cite.RFC4035) 1739 0 R (cite.RFC4074) 1749 0 R (cite.RFC974) 1702 0 R (cite.id2506179) 1893 0 R (clients-per-query) 1610 0 R (configuration_file_elements) 1171 0 R (controls_statement_definition_and_usage) 1046 0 R (diagnostic_tools) 981 0 R (dynamic_update) 1069 0 R (dynamic_update_policies) 1121 0 R (dynamic_update_security) 1333 0 R (empty) 1409 0 R (historical_dns_information) 1680 0 R (id2466555) 948 0 R (id2466579) 949 0 R (id2467422) 1084 0 R (id2467441) 1085 0 R (id2467538) 950 0 R (id2467547) 951 0 R (id2467719) 963 0 R (id2467740) 964 0 R (id2467774) 965 0 R (id2467859) 968 0 R (id2467952) 961 0 R (id2470257) 975 0 R (id2470280) 978 0 R (id2470378) 979 0 R (id2470400) 980 0 R (id2470429) 986 0 R (id2470533) 987 0 R (id2470560) 988 0 R (id2470594) 994 0 R (id2470620) 995 0 R (id2470633) 996 0 R (id2470727) 999 0 R (id2470738) 1005 0 R (id2470770) 1012 0 R (id2470786) 1013 0 R (id2470808) 1019 0 R (id2470825) 1020 0 R (id2471230) 1023 0 R (id2471236) 1024 0 R (id2473012) 1051 0 R (id2473024) 1052 0 R (id2473610) 1101 0 R (id2473627) 1102 0 R (id2474417) 1107 0 R (id2474435) 1108 0 R (id2474445) 1109 0 R (id2474482) 1110 0 R (id2474676) 1115 0 R (id2474724) 1117 0 R (id2474738) 1118 0 R (id2474787) 1119 0 R (id2474855) 1127 0 R (id2475002) 1128 0 R (id2475083) 1133 0 R (id2475389) 1141 0 R (id2475520) 1148 0 R (id2475541) 1149 0 R (id2475574) 1159 0 R (id2475858) 1172 0 R (id2476720) 1180 0 R (id2476747) 1185 0 R (id2476953) 1186 0 R (id2476968) 1187 0 R (id2477066) 1193 0 R (id2477209) 1195 0 R (id2477652) 1201 0 R (id2477694) 1203 0 R (id2477842) 1205 0 R (id2478270) 1213 0 R (id2478288) 1214 0 R (id2478311) 1220 0 R (id2478334) 1221 0 R (id2478493) 1225 0 R (id2478619) 1226 0 R (id2478672) 1231 0 R (id2479433) 1242 0 R (id2480030) 1253 0 R (id2480158) 1254 0 R (id2480544) 1256 0 R (id2480617) 1261 0 R (id2480681) 1264 0 R (id2480725) 1265 0 R (id2480740) 1266 0 R (id2483226) 1295 0 R (id2484998) 1320 0 R (id2485057) 1322 0 R (id2485630) 1338 0 R (id2486902) 1356 0 R (id2486962) 1358 0 R (id2487316) 1371 0 R (id2487818) 1385 0 R (id2490017) 1431 0 R (id2490171) 1432 0 R (id2490222) 1433 0 R (id2490373) 1439 0 R (id2491778) 1453 0 R (id2491785) 1454 0 R (id2491790) 1455 0 R (id2492349) 1462 0 R (id2492382) 1468 0 R (id2494147) 1522 0 R (id2494461) 1528 0 R (id2494480) 1529 0 R (id2494500) 1532 0 R (id2494668) 1534 0 R (id2495907) 1544 0 R (id2496103) 1550 0 R (id2496124) 1551 0 R (id2496487) 1553 0 R (id2496624) 1555 0 R (id2496642) 1561 0 R (id2497046) 1564 0 R (id2497171) 1566 0 R (id2497186) 1567 0 R (id2497298) 1573 0 R (id2497320) 1574 0 R (id2497336) 1575 0 R (id2497397) 1576 0 R (id2497466) 1581 0 R (id2497571) 1582 0 R (id2497701) 1583 0 R (id2498200) 1590 0 R (id2498635) 1598 0 R (id2498641) 1599 0 R (id2500177) 1606 0 R (id2500183) 1607 0 R (id2500628) 1615 0 R (id2500633) 1616 0 R (id2501578) 1622 0 R (id2501610) 1623 0 R (id2502088) 1628 0 R (id2502262) 1647 0 R (id2502343) 1648 0 R (id2502471) 1649 0 R (id2502551) 1664 0 R (id2502556) 1665 0 R (id2502568) 1666 0 R (id2502585) 1667 0 R (id2502647) 1679 0 R (id2503024) 1685 0 R (id2503143) 1690 0 R (id2503145) 1696 0 R (id2503154) 1701 0 R (id2503177) 1697 0 R (id2503201) 1699 0 R (id2503237) 1710 0 R (id2503264) 1712 0 R (id2503289) 1704 0 R (id2503314) 1706 0 R (id2503337) 1708 0 R (id2503393) 1714 0 R (id2503419) 1716 0 R (id2503446) 1718 0 R (id2503508) 1720 0 R (id2503538) 1722 0 R (id2503568) 1724 0 R (id2503594) 1726 0 R (id2503669) 1729 0 R (id2503676) 1730 0 R (id2503703) 1732 0 R (id2503739) 1734 0 R (id2503804) 1736 0 R (id2503869) 1738 0 R (id2503934) 1741 0 R (id2503943) 1742 0 R (id2503969) 1744 0 R (id2504037) 1746 0 R (id2504072) 1748 0 R (id2504113) 1756 0 R (id2504118) 1757 0 R (id2504176) 1759 0 R (id2504213) 1767 0 R (id2504248) 1761 0 R (id2504302) 1763 0 R (id2504341) 1765 0 R (id2504366) 1769 0 R (id2504392) 1771 0 R (id2504419) 1773 0 R (id2504445) 1775 0 R (id2504485) 1777 0 R (id2504515) 1779 0 R (id2504545) 1781 0 R (id2504587) 1783 0 R (id2504620) 1785 0 R (id2504647) 1787 0 R (id2504670) 1789 0 R (id2504796) 1791 0 R (id2504821) 1794 0 R (id2504828) 1795 0 R (id2504854) 1797 0 R (id2504876) 1799 0 R (id2504900) 1801 0 R (id2504946) 1803 0 R (id2504969) 1805 0 R (id2505019) 1812 0 R (id2505027) 1813 0 R (id2505050) 1815 0 R (id2505077) 1817 0 R (id2505104) 1819 0 R (id2505140) 1821 0 R (id2505180) 1824 0 R (id2505186) 1825 0 R (id2505218) 1827 0 R (id2505264) 1829 0 R (id2505299) 1831 0 R (id2505325) 1834 0 R (id2505344) 1835 0 R (id2505366) 1837 0 R (id2505392) 1839 0 R (id2505417) 1841 0 R (id2505441) 1843 0 R (id2505486) 1845 0 R (id2505510) 1847 0 R (id2505537) 1849 0 R (id2505562) 1851 0 R (id2505600) 1854 0 R (id2505606) 1855 0 R (id2505664) 1857 0 R (id2505690) 1859 0 R (id2505726) 1866 0 R (id2505738) 1867 0 R (id2505778) 1869 0 R (id2505873) 1871 0 R (id2505902) 1873 0 R (id2505928) 1875 0 R (id2505955) 1877 0 R (id2505991) 1879 0 R (id2506027) 1881 0 R (id2506054) 1883 0 R (id2506081) 1885 0 R (id2506125) 1887 0 R (id2506167) 1890 0 R (id2506177) 1892 0 R (id2506179) 1894 0 R (incremental_zone_transfers) 1081 0 R (internet_drafts) 1889 0 R (ipv6addresses) 1143 0 R (journal) 1070 0 R (lwresd) 1160 0 R (man.dig) 1900 0 R (man.dnssec-dsfromkey) 1948 0 R (man.dnssec-keyfromlabel) 1962 0 R (man.dnssec-keygen) 1979 0 R (man.dnssec-signzone) 1996 0 R (man.host) 1933 0 R (man.named) 2050 0 R (man.named-checkconf) 2022 0 R (man.named-checkzone) 2034 0 R (man.nsupdate) 2073 0 R (man.rndc) 2098 0 R (man.rndc-confgen) 2127 0 R (man.rndc.conf) 2111 0 R (notify) 1060 0 R (options) 1279 0 R (page.1) 710 0 R (page.10) 985 0 R (page.100) 1673 0 R (page.101) 1677 0 R (page.102) 1684 0 R (page.103) 1694 0 R (page.104) 1754 0 R (page.105) 1810 0 R (page.106) 1864 0 R (page.107) 1898 0 R (page.108) 1907 0 R (page.109) 1913 0 R (page.11) 992 0 R (page.110) 1919 0 R (page.111) 1923 0 R (page.112) 1928 0 R (page.113) 1939 0 R (page.114) 1944 0 R (page.115) 1956 0 R (page.116) 1968 0 R (page.117) 1975 0 R (page.118) 1987 0 R (page.119) 1991 0 R (page.12) 1004 0 R (page.120) 2002 0 R (page.121) 2008 0 R (page.122) 2013 0 R (page.123) 2019 0 R (page.124) 2032 0 R (page.125) 2042 0 R (page.126) 2046 0 R (page.127) 2058 0 R (page.128) 2063 0 R (page.129) 2069 0 R (page.13) 1009 0 R (page.130) 2080 0 R (page.131) 2085 0 R (page.132) 2089 0 R (page.133) 2097 0 R (page.134) 2107 0 R (page.135) 2118 0 R (page.136) 2123 0 R (page.137) 2135 0 R (page.138) 2141 0 R (page.14) 1018 0 R (page.15) 1029 0 R (page.16) 1037 0 R (page.17) 1044 0 R (page.18) 1050 0 R (page.19) 1058 0 R (page.2) 735 0 R (page.20) 1080 0 R (page.21) 1090 0 R (page.22) 1095 0 R (page.23) 1099 0 R (page.24) 1106 0 R (page.25) 1114 0 R (page.26) 1125 0 R (page.27) 1132 0 R (page.28) 1137 0 R (page.29) 1147 0 R (page.3) 745 0 R (page.30) 1153 0 R (page.31) 1157 0 R (page.32) 1165 0 R (page.33) 1169 0 R (page.34) 1179 0 R (page.35) 1184 0 R (page.36) 1192 0 R (page.37) 1200 0 R (page.38) 1210 0 R (page.39) 1219 0 R (page.4) 800 0 R (page.40) 1230 0 R (page.41) 1235 0 R (page.42) 1241 0 R (page.43) 1247 0 R (page.44) 1252 0 R (page.45) 1260 0 R (page.46) 1270 0 R (page.47) 1274 0 R (page.48) 1278 0 R (page.49) 1283 0 R (page.5) 864 0 R (page.50) 1290 0 R (page.51) 1294 0 R (page.52) 1300 0 R (page.53) 1311 0 R (page.54) 1315 0 R (page.55) 1319 0 R (page.56) 1330 0 R (page.57) 1337 0 R (page.58) 1342 0 R (page.59) 1347 0 R (page.6) 926 0 R (page.60) 1351 0 R (page.61) 1355 0 R (page.62) 1363 0 R (page.63) 1370 0 R (page.64) 1376 0 R (page.65) 1383 0 R (page.66) 1390 0 R (page.67) 1396 0 R (page.68) 1406 0 R (page.69) 1414 0 R (page.7) 946 0 R (page.70) 1418 0 R (page.71) 1423 0 R (page.72) 1430 0 R (page.73) 1438 0 R (page.74) 1444 0 R (page.75) 1448 0 R (page.76) 1452 0 R (page.77) 1460 0 R (page.78) 1467 0 R (page.79) 1486 0 R (page.8) 960 0 R (page.80) 1501 0 R (page.81) 1521 0 R (page.82) 1527 0 R (page.83) 1539 0 R (page.84) 1543 0 R (page.85) 1549 0 R (page.86) 1560 0 R (page.87) 1572 0 R (page.88) 1580 0 R (page.89) 1588 0 R (page.9) 974 0 R (page.90) 1595 0 R (page.91) 1604 0 R (page.92) 1614 0 R (page.93) 1621 0 R (page.94) 1632 0 R (page.95) 1636 0 R (page.96) 1642 0 R (page.97) 1653 0 R (page.98) 1658 0 R (page.99) 1662 0 R (proposed_standards) 1086 0 R (query_address) 1343 0 R (rfcs) 970 0 R (rndc) 1215 0 R (root_delegation_only) 1463 0 R (rrset_ordering) 1025 0 R (sample_configuration) 1011 0 R (section*.10) 1823 0 R (section*.100) 2109 0 R (section*.101) 2110 0 R (section*.102) 2112 0 R (section*.103) 2113 0 R (section*.104) 2114 0 R (section*.105) 2119 0 R (section*.106) 2124 0 R (section*.107) 2125 0 R (section*.108) 2126 0 R (section*.109) 2128 0 R (section*.11) 1833 0 R (section*.110) 2129 0 R (section*.111) 2130 0 R (section*.112) 2131 0 R (section*.113) 2136 0 R (section*.114) 2137 0 R (section*.115) 2142 0 R (section*.12) 1853 0 R (section*.13) 1865 0 R (section*.14) 1891 0 R (section*.15) 1901 0 R (section*.16) 1902 0 R (section*.17) 1903 0 R (section*.18) 1908 0 R (section*.19) 1909 0 R (section*.2) 1689 0 R (section*.20) 1914 0 R (section*.21) 1924 0 R (section*.22) 1929 0 R (section*.23) 1930 0 R (section*.24) 1931 0 R (section*.25) 1932 0 R (section*.26) 1934 0 R (section*.27) 1935 0 R (section*.28) 1940 0 R (section*.29) 1945 0 R (section*.3) 1695 0 R (section*.30) 1946 0 R (section*.31) 1947 0 R (section*.32) 1949 0 R (section*.33) 1950 0 R (section*.34) 1951 0 R (section*.35) 1952 0 R (section*.36) 1957 0 R (section*.37) 1958 0 R (section*.38) 1959 0 R (section*.39) 1960 0 R (section*.4) 1703 0 R (section*.40) 1961 0 R (section*.41) 1963 0 R (section*.42) 1969 0 R (section*.43) 1970 0 R (section*.44) 1971 0 R (section*.45) 1976 0 R (section*.46) 1977 0 R (section*.47) 1978 0 R (section*.48) 1980 0 R (section*.49) 1981 0 R (section*.5) 1728 0 R (section*.50) 1982 0 R (section*.51) 1983 0 R (section*.52) 1992 0 R (section*.53) 1993 0 R (section*.54) 1994 0 R (section*.55) 1995 0 R (section*.56) 1997 0 R (section*.57) 1998 0 R (section*.58) 2003 0 R (section*.59) 2004 0 R (section*.6) 1740 0 R (section*.60) 2014 0 R (section*.61) 2015 0 R (section*.62) 2020 0 R (section*.63) 2021 0 R (section*.64) 2023 0 R (section*.65) 2024 0 R (section*.66) 2025 0 R (section*.67) 2026 0 R (section*.68) 2027 0 R (section*.69) 2028 0 R (section*.7) 1755 0 R (section*.70) 2033 0 R (section*.71) 2035 0 R (section*.72) 2036 0 R (section*.73) 2037 0 R (section*.74) 2038 0 R (section*.75) 2047 0 R (section*.76) 2048 0 R (section*.77) 2049 0 R (section*.78) 2051 0 R (section*.79) 2052 0 R (section*.8) 1793 0 R (section*.80) 2053 0 R (section*.81) 2054 0 R (section*.82) 2064 0 R (section*.83) 2065 0 R (section*.84) 2070 0 R (section*.85) 2071 0 R (section*.86) 2072 0 R (section*.87) 2074 0 R (section*.88) 2075 0 R (section*.89) 2076 0 R (section*.9) 1811 0 R (section*.90) 2081 0 R (section*.91) 2090 0 R (section*.92) 2091 0 R (section*.93) 2092 0 R (section*.94) 2093 0 R (section*.95) 2099 0 R (section*.96) 2100 0 R (section*.97) 2101 0 R (section*.98) 2102 0 R (section*.99) 2108 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 538 0 R (section.7.1) 574 0 R (section.7.2) 578 0 R (section.7.3) 590 0 R (section.8.1) 598 0 R (section.8.2) 606 0 R (section.8.3) 610 0 R (section.A.1) 618 0 R (section.A.2) 626 0 R (section.A.3) 634 0 R (section.B.1) 654 0 R (section.B.10) 690 0 R (section.B.11) 694 0 R (section.B.12) 698 0 R (section.B.13) 702 0 R (section.B.2) 658 0 R (section.B.3) 662 0 R (section.B.4) 666 0 R (section.B.5) 670 0 R (section.B.6) 674 0 R (section.B.7) 678 0 R (section.B.8) 682 0 R (section.B.9) 686 0 R (server_resource_limits) 1365 0 R (server_statement_definition_and_usage) 1307 0 R (server_statement_grammar) 1419 0 R (statistics) 1589 0 R (statistics_counters) 1597 0 R (statschannels) 1426 0 R (statsfile) 1286 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 530 0 R (subsection.6.3.7) 534 0 R (subsection.6.4.1) 546 0 R (subsection.7.2.1) 582 0 R (subsection.7.2.2) 586 0 R (subsection.8.1.1) 602 0 R (subsection.A.1.1) 622 0 R (subsection.A.2.1) 630 0 R (subsection.A.3.1) 638 0 R (subsection.A.3.2) 642 0 R (subsection.A.3.3) 646 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.3.5.4) 526 0 R (subsubsection.6.4.0.1) 542 0 R (subsubsection.6.4.1.1) 550 0 R (subsubsection.6.4.1.2) 554 0 R (subsubsection.6.4.1.3) 558 0 R (subsubsection.6.4.1.4) 562 0 R (subsubsection.6.4.1.5) 566 0 R (table.1.1) 952 0 R (table.1.2) 962 0 R (table.3.1) 1021 0 R (table.3.2) 1053 0 R (table.6.1) 1173 0 R (table.6.10) 1533 0 R (table.6.11) 1535 0 R (table.6.12) 1545 0 R (table.6.13) 1552 0 R (table.6.14) 1554 0 R (table.6.15) 1562 0 R (table.6.16) 1565 0 R (table.6.17) 1568 0 R (table.6.18) 1584 0 R (table.6.19) 1591 0 R (table.6.2) 1196 0 R (table.6.20) 1600 0 R (table.6.21) 1608 0 R (table.6.22) 1617 0 R (table.6.23) 1624 0 R (table.6.3) 1204 0 R (table.6.4) 1243 0 R (table.6.5) 1255 0 R (table.6.6) 1296 0 R (table.6.7) 1386 0 R (table.6.8) 1456 0 R (table.6.9) 1523 0 R (the_category_phrase) 1237 0 R (the_sortlist_statement) 1377 0 R (topology) 1372 0 R (tsig) 1100 0 R (tuning) 1391 0 R (types_of_resource_records_and_when_to_use_them) 969 0 R (view_statement_grammar) 1410 0 R (zone_statement_grammar) 1326 0 R (zone_transfers) 1076 0 R (zonefile_format) 1402 0 R] +/Names [(Access_Control_Lists) 1638 0 R (Bv9ARM.ch01) 947 0 R (Bv9ARM.ch02) 993 0 R (Bv9ARM.ch03) 1010 0 R (Bv9ARM.ch04) 1059 0 R (Bv9ARM.ch05) 1158 0 R (Bv9ARM.ch06) 1170 0 R (Bv9ARM.ch07) 1637 0 R (Bv9ARM.ch08) 1663 0 R (Bv9ARM.ch09) 1678 0 R (Bv9ARM.ch10) 1899 0 R (Configuration_File_Grammar) 1194 0 R (DNSSEC) 1126 0 R (Doc-Start) 711 0 R (Setting_TTLs) 1563 0 R (acache) 1000 0 R (access_control) 1323 0 R (acl) 1202 0 R (address_match_lists) 1175 0 R (admin_tools) 1033 0 R (appendix.A) 614 0 R (appendix.B) 650 0 R (bibliography) 1686 0 R (boolean_options) 1075 0 R (builtin) 1407 0 R (chapter*.1) 746 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 570 0 R (chapter.8) 594 0 R (cite.RFC1033) 1814 0 R (cite.RFC1034) 1698 0 R (cite.RFC1035) 1700 0 R (cite.RFC1101) 1796 0 R (cite.RFC1123) 1798 0 R (cite.RFC1183) 1758 0 R (cite.RFC1464) 1836 0 R (cite.RFC1535) 1743 0 R (cite.RFC1536) 1745 0 R (cite.RFC1537) 1816 0 R (cite.RFC1591) 1800 0 R (cite.RFC1706) 1760 0 R (cite.RFC1712) 1856 0 R (cite.RFC1713) 1838 0 R (cite.RFC1794) 1840 0 R (cite.RFC1876) 1762 0 R (cite.RFC1912) 1818 0 R (cite.RFC1982) 1747 0 R (cite.RFC1995) 1705 0 R (cite.RFC1996) 1707 0 R (cite.RFC2010) 1820 0 R (cite.RFC2052) 1764 0 R (cite.RFC2065) 1868 0 R (cite.RFC2136) 1709 0 R (cite.RFC2137) 1870 0 R (cite.RFC2163) 1766 0 R (cite.RFC2168) 1768 0 R (cite.RFC2181) 1711 0 R (cite.RFC2219) 1822 0 R (cite.RFC2230) 1770 0 R (cite.RFC2240) 1842 0 R (cite.RFC2308) 1713 0 R (cite.RFC2317) 1802 0 R (cite.RFC2345) 1844 0 R (cite.RFC2352) 1846 0 R (cite.RFC2535) 1872 0 R (cite.RFC2536) 1772 0 R (cite.RFC2537) 1774 0 R (cite.RFC2538) 1776 0 R (cite.RFC2539) 1778 0 R (cite.RFC2540) 1780 0 R (cite.RFC2671) 1715 0 R (cite.RFC2672) 1717 0 R (cite.RFC2673) 1858 0 R (cite.RFC2782) 1782 0 R (cite.RFC2825) 1826 0 R (cite.RFC2826) 1804 0 R (cite.RFC2845) 1719 0 R (cite.RFC2874) 1860 0 R (cite.RFC2915) 1784 0 R (cite.RFC2929) 1806 0 R (cite.RFC2930) 1721 0 R (cite.RFC2931) 1723 0 R (cite.RFC3007) 1725 0 R (cite.RFC3008) 1874 0 R (cite.RFC3071) 1848 0 R (cite.RFC3090) 1876 0 R (cite.RFC3110) 1786 0 R (cite.RFC3123) 1788 0 R (cite.RFC3225) 1731 0 R (cite.RFC3258) 1850 0 R (cite.RFC3445) 1878 0 R (cite.RFC3490) 1828 0 R (cite.RFC3491) 1830 0 R (cite.RFC3492) 1832 0 R (cite.RFC3596) 1790 0 R (cite.RFC3597) 1792 0 R (cite.RFC3645) 1727 0 R (cite.RFC3655) 1880 0 R (cite.RFC3658) 1882 0 R (cite.RFC3755) 1884 0 R (cite.RFC3757) 1886 0 R (cite.RFC3833) 1733 0 R (cite.RFC3845) 1888 0 R (cite.RFC3901) 1852 0 R (cite.RFC4033) 1735 0 R (cite.RFC4034) 1737 0 R (cite.RFC4035) 1739 0 R (cite.RFC4074) 1749 0 R (cite.RFC974) 1702 0 R (cite.id2506250) 1893 0 R (clients-per-query) 1610 0 R (configuration_file_elements) 1171 0 R (controls_statement_definition_and_usage) 1046 0 R (diagnostic_tools) 981 0 R (dynamic_update) 1069 0 R (dynamic_update_policies) 1121 0 R (dynamic_update_security) 1333 0 R (empty) 1409 0 R (historical_dns_information) 1680 0 R (id2466555) 948 0 R (id2466579) 949 0 R (id2467422) 1084 0 R (id2467441) 1085 0 R (id2467538) 950 0 R (id2467547) 951 0 R (id2467719) 963 0 R (id2467740) 964 0 R (id2467774) 965 0 R (id2467859) 968 0 R (id2467952) 961 0 R (id2470257) 975 0 R (id2470280) 978 0 R (id2470378) 979 0 R (id2470400) 980 0 R (id2470429) 986 0 R (id2470533) 987 0 R (id2470560) 988 0 R (id2470594) 994 0 R (id2470620) 995 0 R (id2470633) 996 0 R (id2470727) 999 0 R (id2470738) 1005 0 R (id2470770) 1012 0 R (id2470786) 1013 0 R (id2470808) 1019 0 R (id2470825) 1020 0 R (id2471230) 1023 0 R (id2471236) 1024 0 R (id2473012) 1051 0 R (id2473024) 1052 0 R (id2473610) 1101 0 R (id2473627) 1102 0 R (id2474417) 1107 0 R (id2474435) 1108 0 R (id2474445) 1109 0 R (id2474482) 1110 0 R (id2474676) 1115 0 R (id2474724) 1117 0 R (id2474738) 1118 0 R (id2474787) 1119 0 R (id2474855) 1127 0 R (id2475002) 1128 0 R (id2475083) 1133 0 R (id2475389) 1141 0 R (id2475520) 1148 0 R (id2475541) 1149 0 R (id2475574) 1159 0 R (id2475858) 1172 0 R (id2476720) 1180 0 R (id2476747) 1185 0 R (id2476953) 1186 0 R (id2476968) 1187 0 R (id2477066) 1193 0 R (id2477209) 1195 0 R (id2477652) 1201 0 R (id2477694) 1203 0 R (id2477842) 1205 0 R (id2478270) 1213 0 R (id2478288) 1214 0 R (id2478311) 1220 0 R (id2478334) 1221 0 R (id2478493) 1225 0 R (id2478619) 1226 0 R (id2478672) 1231 0 R (id2479433) 1242 0 R (id2480030) 1253 0 R (id2480158) 1254 0 R (id2480544) 1256 0 R (id2480617) 1261 0 R (id2480681) 1264 0 R (id2480725) 1265 0 R (id2480740) 1266 0 R (id2483226) 1295 0 R (id2484998) 1320 0 R (id2485057) 1322 0 R (id2485630) 1338 0 R (id2486902) 1356 0 R (id2486962) 1358 0 R (id2487316) 1371 0 R (id2487818) 1385 0 R (id2489952) 1431 0 R (id2490106) 1432 0 R (id2490157) 1433 0 R (id2490376) 1439 0 R (id2491781) 1453 0 R (id2491788) 1454 0 R (id2491794) 1455 0 R (id2492284) 1462 0 R (id2492317) 1468 0 R (id2494013) 1522 0 R (id2494328) 1528 0 R (id2494346) 1529 0 R (id2494366) 1532 0 R (id2494672) 1534 0 R (id2495773) 1544 0 R (id2495970) 1550 0 R (id2495991) 1551 0 R (id2496422) 1553 0 R (id2496558) 1555 0 R (id2496577) 1561 0 R (id2496981) 1564 0 R (id2497106) 1566 0 R (id2497121) 1567 0 R (id2497301) 1573 0 R (id2497323) 1574 0 R (id2497339) 1575 0 R (id2497468) 1576 0 R (id2497538) 1581 0 R (id2497574) 1582 0 R (id2497704) 1583 0 R (id2498203) 1590 0 R (id2498638) 1598 0 R (id2498644) 1599 0 R (id2500112) 1606 0 R (id2500118) 1607 0 R (id2500563) 1615 0 R (id2500568) 1616 0 R (id2501513) 1622 0 R (id2501545) 1623 0 R (id2502023) 1628 0 R (id2502197) 1647 0 R (id2502278) 1648 0 R (id2502406) 1649 0 R (id2502486) 1664 0 R (id2502491) 1665 0 R (id2502503) 1666 0 R (id2502520) 1667 0 R (id2502582) 1679 0 R (id2503027) 1685 0 R (id2503214) 1690 0 R (id2503217) 1696 0 R (id2503225) 1701 0 R (id2503249) 1697 0 R (id2503272) 1699 0 R (id2503308) 1710 0 R (id2503335) 1712 0 R (id2503361) 1704 0 R (id2503385) 1706 0 R (id2503409) 1708 0 R (id2503464) 1714 0 R (id2503491) 1716 0 R (id2503517) 1718 0 R (id2503579) 1720 0 R (id2503609) 1722 0 R (id2503639) 1724 0 R (id2503666) 1726 0 R (id2503740) 1729 0 R (id2503748) 1730 0 R (id2503774) 1732 0 R (id2503811) 1734 0 R (id2503876) 1736 0 R (id2503941) 1738 0 R (id2504006) 1741 0 R (id2504014) 1742 0 R (id2504040) 1744 0 R (id2504108) 1746 0 R (id2504144) 1748 0 R (id2504184) 1756 0 R (id2504189) 1757 0 R (id2504247) 1759 0 R (id2504284) 1767 0 R (id2504320) 1761 0 R (id2504374) 1763 0 R (id2504412) 1765 0 R (id2504438) 1769 0 R (id2504464) 1771 0 R (id2504490) 1773 0 R (id2504517) 1775 0 R (id2504556) 1777 0 R (id2504586) 1779 0 R (id2504616) 1781 0 R (id2504659) 1783 0 R (id2504692) 1785 0 R (id2504718) 1787 0 R (id2504742) 1789 0 R (id2504868) 1791 0 R (id2504892) 1794 0 R (id2504900) 1795 0 R (id2504925) 1797 0 R (id2504948) 1799 0 R (id2504971) 1801 0 R (id2505017) 1803 0 R (id2505041) 1805 0 R (id2505091) 1812 0 R (id2505098) 1813 0 R (id2505122) 1815 0 R (id2505148) 1817 0 R (id2505175) 1819 0 R (id2505211) 1821 0 R (id2505252) 1824 0 R (id2505257) 1825 0 R (id2505289) 1827 0 R (id2505335) 1829 0 R (id2505370) 1831 0 R (id2505397) 1834 0 R (id2505415) 1835 0 R (id2505437) 1837 0 R (id2505463) 1839 0 R (id2505489) 1841 0 R (id2505512) 1843 0 R (id2505558) 1845 0 R (id2505581) 1847 0 R (id2505608) 1849 0 R (id2505634) 1851 0 R (id2505671) 1854 0 R (id2505677) 1855 0 R (id2505735) 1857 0 R (id2505762) 1859 0 R (id2505798) 1866 0 R (id2505810) 1867 0 R (id2505849) 1869 0 R (id2505944) 1871 0 R (id2505974) 1873 0 R (id2506000) 1875 0 R (id2506026) 1877 0 R (id2506062) 1879 0 R (id2506099) 1881 0 R (id2506125) 1883 0 R (id2506152) 1885 0 R (id2506197) 1887 0 R (id2506238) 1890 0 R (id2506248) 1892 0 R (id2506250) 1894 0 R (incremental_zone_transfers) 1081 0 R (internet_drafts) 1889 0 R (ipv6addresses) 1143 0 R (journal) 1070 0 R (lwresd) 1160 0 R (man.dig) 1900 0 R (man.dnssec-dsfromkey) 1948 0 R (man.dnssec-keyfromlabel) 1962 0 R (man.dnssec-keygen) 1979 0 R (man.dnssec-signzone) 1996 0 R (man.host) 1933 0 R (man.named) 2050 0 R (man.named-checkconf) 2022 0 R (man.named-checkzone) 2034 0 R (man.nsupdate) 2073 0 R (man.rndc) 2098 0 R (man.rndc-confgen) 2127 0 R (man.rndc.conf) 2111 0 R (notify) 1060 0 R (options) 1279 0 R (page.1) 710 0 R (page.10) 985 0 R (page.100) 1673 0 R (page.101) 1677 0 R (page.102) 1684 0 R (page.103) 1694 0 R (page.104) 1754 0 R (page.105) 1810 0 R (page.106) 1864 0 R (page.107) 1898 0 R (page.108) 1907 0 R (page.109) 1913 0 R (page.11) 992 0 R (page.110) 1919 0 R (page.111) 1923 0 R (page.112) 1928 0 R (page.113) 1939 0 R (page.114) 1944 0 R (page.115) 1956 0 R (page.116) 1968 0 R (page.117) 1975 0 R (page.118) 1987 0 R (page.119) 1991 0 R (page.12) 1004 0 R (page.120) 2002 0 R (page.121) 2008 0 R (page.122) 2013 0 R (page.123) 2019 0 R (page.124) 2032 0 R (page.125) 2042 0 R (page.126) 2046 0 R (page.127) 2058 0 R (page.128) 2063 0 R (page.129) 2069 0 R (page.13) 1009 0 R (page.130) 2080 0 R (page.131) 2085 0 R (page.132) 2089 0 R (page.133) 2097 0 R (page.134) 2107 0 R (page.135) 2118 0 R (page.136) 2123 0 R (page.137) 2135 0 R (page.138) 2141 0 R (page.14) 1018 0 R (page.15) 1029 0 R (page.16) 1037 0 R (page.17) 1044 0 R (page.18) 1050 0 R (page.19) 1058 0 R (page.2) 735 0 R (page.20) 1080 0 R (page.21) 1090 0 R (page.22) 1095 0 R (page.23) 1099 0 R (page.24) 1106 0 R (page.25) 1114 0 R (page.26) 1125 0 R (page.27) 1132 0 R (page.28) 1137 0 R (page.29) 1147 0 R (page.3) 745 0 R (page.30) 1153 0 R (page.31) 1157 0 R (page.32) 1165 0 R (page.33) 1169 0 R (page.34) 1179 0 R (page.35) 1184 0 R (page.36) 1192 0 R (page.37) 1200 0 R (page.38) 1210 0 R (page.39) 1219 0 R (page.4) 800 0 R (page.40) 1230 0 R (page.41) 1235 0 R (page.42) 1241 0 R (page.43) 1247 0 R (page.44) 1252 0 R (page.45) 1260 0 R (page.46) 1270 0 R (page.47) 1274 0 R (page.48) 1278 0 R (page.49) 1283 0 R (page.5) 864 0 R (page.50) 1290 0 R (page.51) 1294 0 R (page.52) 1300 0 R (page.53) 1311 0 R (page.54) 1315 0 R (page.55) 1319 0 R (page.56) 1330 0 R (page.57) 1337 0 R (page.58) 1342 0 R (page.59) 1347 0 R (page.6) 926 0 R (page.60) 1351 0 R (page.61) 1355 0 R (page.62) 1363 0 R (page.63) 1370 0 R (page.64) 1376 0 R (page.65) 1383 0 R (page.66) 1390 0 R (page.67) 1396 0 R (page.68) 1406 0 R (page.69) 1414 0 R (page.7) 946 0 R (page.70) 1418 0 R (page.71) 1423 0 R (page.72) 1430 0 R (page.73) 1438 0 R (page.74) 1444 0 R (page.75) 1448 0 R (page.76) 1452 0 R (page.77) 1460 0 R (page.78) 1467 0 R (page.79) 1486 0 R (page.8) 960 0 R (page.80) 1501 0 R (page.81) 1521 0 R (page.82) 1527 0 R (page.83) 1539 0 R (page.84) 1543 0 R (page.85) 1549 0 R (page.86) 1560 0 R (page.87) 1572 0 R (page.88) 1580 0 R (page.89) 1588 0 R (page.9) 974 0 R (page.90) 1595 0 R (page.91) 1604 0 R (page.92) 1614 0 R (page.93) 1621 0 R (page.94) 1632 0 R (page.95) 1636 0 R (page.96) 1642 0 R (page.97) 1653 0 R (page.98) 1658 0 R (page.99) 1662 0 R (proposed_standards) 1086 0 R (query_address) 1343 0 R (rfcs) 970 0 R (rndc) 1215 0 R (root_delegation_only) 1463 0 R (rrset_ordering) 1025 0 R (sample_configuration) 1011 0 R (section*.10) 1823 0 R (section*.100) 2109 0 R (section*.101) 2110 0 R (section*.102) 2112 0 R (section*.103) 2113 0 R (section*.104) 2114 0 R (section*.105) 2119 0 R (section*.106) 2124 0 R (section*.107) 2125 0 R (section*.108) 2126 0 R (section*.109) 2128 0 R (section*.11) 1833 0 R (section*.110) 2129 0 R (section*.111) 2130 0 R (section*.112) 2131 0 R (section*.113) 2136 0 R (section*.114) 2137 0 R (section*.115) 2142 0 R (section*.12) 1853 0 R (section*.13) 1865 0 R (section*.14) 1891 0 R (section*.15) 1901 0 R (section*.16) 1902 0 R (section*.17) 1903 0 R (section*.18) 1908 0 R (section*.19) 1909 0 R (section*.2) 1689 0 R (section*.20) 1914 0 R (section*.21) 1924 0 R (section*.22) 1929 0 R (section*.23) 1930 0 R (section*.24) 1931 0 R (section*.25) 1932 0 R (section*.26) 1934 0 R (section*.27) 1935 0 R (section*.28) 1940 0 R (section*.29) 1945 0 R (section*.3) 1695 0 R (section*.30) 1946 0 R (section*.31) 1947 0 R (section*.32) 1949 0 R (section*.33) 1950 0 R (section*.34) 1951 0 R (section*.35) 1952 0 R (section*.36) 1957 0 R (section*.37) 1958 0 R (section*.38) 1959 0 R (section*.39) 1960 0 R (section*.4) 1703 0 R (section*.40) 1961 0 R (section*.41) 1963 0 R (section*.42) 1969 0 R (section*.43) 1970 0 R (section*.44) 1971 0 R (section*.45) 1976 0 R (section*.46) 1977 0 R (section*.47) 1978 0 R (section*.48) 1980 0 R (section*.49) 1981 0 R (section*.5) 1728 0 R (section*.50) 1982 0 R (section*.51) 1983 0 R (section*.52) 1992 0 R (section*.53) 1993 0 R (section*.54) 1994 0 R (section*.55) 1995 0 R (section*.56) 1997 0 R (section*.57) 1998 0 R (section*.58) 2003 0 R (section*.59) 2004 0 R (section*.6) 1740 0 R (section*.60) 2014 0 R (section*.61) 2015 0 R (section*.62) 2020 0 R (section*.63) 2021 0 R (section*.64) 2023 0 R (section*.65) 2024 0 R (section*.66) 2025 0 R (section*.67) 2026 0 R (section*.68) 2027 0 R (section*.69) 2028 0 R (section*.7) 1755 0 R (section*.70) 2033 0 R (section*.71) 2035 0 R (section*.72) 2036 0 R (section*.73) 2037 0 R (section*.74) 2038 0 R (section*.75) 2047 0 R (section*.76) 2048 0 R (section*.77) 2049 0 R (section*.78) 2051 0 R (section*.79) 2052 0 R (section*.8) 1793 0 R (section*.80) 2053 0 R (section*.81) 2054 0 R (section*.82) 2064 0 R (section*.83) 2065 0 R (section*.84) 2070 0 R (section*.85) 2071 0 R (section*.86) 2072 0 R (section*.87) 2074 0 R (section*.88) 2075 0 R (section*.89) 2076 0 R (section*.9) 1811 0 R (section*.90) 2081 0 R (section*.91) 2090 0 R (section*.92) 2091 0 R (section*.93) 2092 0 R (section*.94) 2093 0 R (section*.95) 2099 0 R (section*.96) 2100 0 R (section*.97) 2101 0 R (section*.98) 2102 0 R (section*.99) 2108 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 538 0 R (section.7.1) 574 0 R (section.7.2) 578 0 R (section.7.3) 590 0 R (section.8.1) 598 0 R (section.8.2) 606 0 R (section.8.3) 610 0 R (section.A.1) 618 0 R (section.A.2) 626 0 R (section.A.3) 634 0 R (section.B.1) 654 0 R (section.B.10) 690 0 R (section.B.11) 694 0 R (section.B.12) 698 0 R (section.B.13) 702 0 R (section.B.2) 658 0 R (section.B.3) 662 0 R (section.B.4) 666 0 R (section.B.5) 670 0 R (section.B.6) 674 0 R (section.B.7) 678 0 R (section.B.8) 682 0 R (section.B.9) 686 0 R (server_resource_limits) 1365 0 R (server_statement_definition_and_usage) 1307 0 R (server_statement_grammar) 1419 0 R (statistics) 1589 0 R (statistics_counters) 1597 0 R (statschannels) 1426 0 R (statsfile) 1286 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 530 0 R (subsection.6.3.7) 534 0 R (subsection.6.4.1) 546 0 R (subsection.7.2.1) 582 0 R (subsection.7.2.2) 586 0 R (subsection.8.1.1) 602 0 R (subsection.A.1.1) 622 0 R (subsection.A.2.1) 630 0 R (subsection.A.3.1) 638 0 R (subsection.A.3.2) 642 0 R (subsection.A.3.3) 646 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.3.5.4) 526 0 R (subsubsection.6.4.0.1) 542 0 R (subsubsection.6.4.1.1) 550 0 R (subsubsection.6.4.1.2) 554 0 R (subsubsection.6.4.1.3) 558 0 R (subsubsection.6.4.1.4) 562 0 R (subsubsection.6.4.1.5) 566 0 R (table.1.1) 952 0 R (table.1.2) 962 0 R (table.3.1) 1021 0 R (table.3.2) 1053 0 R (table.6.1) 1173 0 R (table.6.10) 1533 0 R (table.6.11) 1535 0 R (table.6.12) 1545 0 R (table.6.13) 1552 0 R (table.6.14) 1554 0 R (table.6.15) 1562 0 R (table.6.16) 1565 0 R (table.6.17) 1568 0 R (table.6.18) 1584 0 R (table.6.19) 1591 0 R (table.6.2) 1196 0 R (table.6.20) 1600 0 R (table.6.21) 1608 0 R (table.6.22) 1617 0 R (table.6.23) 1624 0 R (table.6.3) 1204 0 R (table.6.4) 1243 0 R (table.6.5) 1255 0 R (table.6.6) 1296 0 R (table.6.7) 1386 0 R (table.6.8) 1456 0 R (table.6.9) 1523 0 R (the_category_phrase) 1237 0 R (the_sortlist_statement) 1377 0 R (topology) 1372 0 R (tsig) 1100 0 R (tuning) 1391 0 R (types_of_resource_records_and_when_to_use_them) 969 0 R (view_statement_grammar) 1410 0 R (zone_statement_grammar) 1326 0 R (zone_transfers) 1076 0 R (zonefile_format) 1402 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj 2168 0 obj << @@ -12335,7 +12310,7 @@ endobj >> endobj 2171 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20100218015504Z) +/CreationDate (D:20100225121620Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref @@ -12347,703 +12322,703 @@ xref 0000000000 00000 f 0000000009 00000 n 0000071778 00000 n -0000753168 00000 n +0000753335 00000 n 0000000054 00000 n 0000000086 00000 n 0000071902 00000 n -0000753096 00000 n +0000753263 00000 n 0000000133 00000 n 0000000173 00000 n 0000072027 00000 n -0000753010 00000 n +0000753177 00000 n 0000000221 00000 n 0000000273 00000 n 0000072152 00000 n -0000752924 00000 n +0000753091 00000 n 0000000321 00000 n 0000000377 00000 n 0000076477 00000 n -0000752814 00000 n +0000752981 00000 n 0000000425 00000 n 0000000478 00000 n 0000076601 00000 n -0000752740 00000 n +0000752907 00000 n 0000000531 00000 n 0000000572 00000 n 0000076726 00000 n -0000752653 00000 n +0000752820 00000 n 0000000625 00000 n 0000000674 00000 n 0000076850 00000 n -0000752566 00000 n +0000752733 00000 n 0000000727 00000 n 0000000757 00000 n 0000081129 00000 n -0000752442 00000 n +0000752609 00000 n 0000000810 00000 n 0000000861 00000 n 0000081254 00000 n -0000752368 00000 n +0000752535 00000 n 0000000919 00000 n 0000000964 00000 n 0000081379 00000 n -0000752281 00000 n +0000752448 00000 n 0000001022 00000 n 0000001062 00000 n 0000081504 00000 n -0000752207 00000 n +0000752374 00000 n 0000001120 00000 n 0000001162 00000 n 0000084476 00000 n -0000752083 00000 n +0000752250 00000 n 0000001215 00000 n 0000001260 00000 n 0000084601 00000 n -0000752022 00000 n +0000752189 00000 n 0000001318 00000 n 0000001355 00000 n 0000084726 00000 n -0000751948 00000 n +0000752115 00000 n 0000001408 00000 n 0000001463 00000 n 0000087654 00000 n -0000751823 00000 n +0000751990 00000 n 0000001509 00000 n 0000001556 00000 n 0000087779 00000 n -0000751749 00000 n +0000751916 00000 n 0000001604 00000 n 0000001648 00000 n 0000087904 00000 n -0000751662 00000 n +0000751829 00000 n 0000001696 00000 n 0000001735 00000 n 0000088029 00000 n -0000751575 00000 n +0000751742 00000 n 0000001783 00000 n 0000001825 00000 n 0000088153 00000 n -0000751488 00000 n +0000751655 00000 n 0000001873 00000 n 0000001936 00000 n 0000089239 00000 n -0000751414 00000 n +0000751581 00000 n 0000001984 00000 n 0000002034 00000 n 0000090953 00000 n -0000751286 00000 n +0000751453 00000 n 0000002080 00000 n 0000002126 00000 n 0000091080 00000 n -0000751173 00000 n +0000751340 00000 n 0000002174 00000 n 0000002218 00000 n 0000091208 00000 n -0000751097 00000 n +0000751264 00000 n 0000002271 00000 n 0000002323 00000 n 0000091336 00000 n -0000751020 00000 n +0000751187 00000 n 0000002377 00000 n 0000002436 00000 n 0000093878 00000 n -0000750929 00000 n +0000751096 00000 n 0000002485 00000 n 0000002523 00000 n 0000094137 00000 n -0000750812 00000 n +0000750979 00000 n 0000002572 00000 n 0000002618 00000 n 0000094266 00000 n -0000750694 00000 n +0000750861 00000 n 0000002672 00000 n 0000002739 00000 n 0000097498 00000 n -0000750615 00000 n +0000750782 00000 n 0000002798 00000 n 0000002842 00000 n 0000097626 00000 n -0000750536 00000 n +0000750703 00000 n 0000002901 00000 n 0000002949 00000 n 0000108275 00000 n -0000750457 00000 n +0000750624 00000 n 0000003003 00000 n 0000003036 00000 n 0000113294 00000 n -0000750325 00000 n +0000750492 00000 n 0000003083 00000 n 0000003126 00000 n 0000113423 00000 n -0000750246 00000 n +0000750413 00000 n 0000003175 00000 n 0000003205 00000 n 0000113552 00000 n -0000750114 00000 n +0000750281 00000 n 0000003254 00000 n 0000003292 00000 n 0000113681 00000 n -0000750049 00000 n +0000750216 00000 n 0000003346 00000 n 0000003388 00000 n 0000118088 00000 n -0000749956 00000 n +0000750123 00000 n 0000003437 00000 n 0000003496 00000 n 0000118217 00000 n -0000749824 00000 n +0000749991 00000 n 0000003545 00000 n 0000003578 00000 n 0000118346 00000 n -0000749759 00000 n +0000749926 00000 n 0000003632 00000 n 0000003681 00000 n 0000125674 00000 n -0000749627 00000 n +0000749794 00000 n 0000003730 00000 n 0000003758 00000 n 0000125803 00000 n -0000749509 00000 n +0000749676 00000 n 0000003812 00000 n 0000003881 00000 n 0000125932 00000 n -0000749430 00000 n +0000749597 00000 n 0000003940 00000 n 0000003988 00000 n 0000128724 00000 n -0000749351 00000 n +0000749518 00000 n 0000004047 00000 n 0000004092 00000 n 0000128853 00000 n -0000749258 00000 n +0000749425 00000 n 0000004146 00000 n 0000004214 00000 n 0000128982 00000 n -0000749165 00000 n +0000749332 00000 n 0000004268 00000 n 0000004338 00000 n 0000129111 00000 n -0000749072 00000 n +0000749239 00000 n 0000004392 00000 n 0000004455 00000 n 0000133032 00000 n -0000748979 00000 n +0000749146 00000 n 0000004509 00000 n 0000004564 00000 n 0000133161 00000 n -0000748900 00000 n +0000749067 00000 n 0000004618 00000 n 0000004650 00000 n 0000133290 00000 n -0000748807 00000 n +0000748974 00000 n 0000004699 00000 n 0000004727 00000 n 0000133419 00000 n -0000748714 00000 n +0000748881 00000 n 0000004776 00000 n 0000004808 00000 n 0000137196 00000 n -0000748582 00000 n +0000748749 00000 n 0000004857 00000 n 0000004887 00000 n 0000137325 00000 n -0000748503 00000 n +0000748670 00000 n 0000004941 00000 n 0000004982 00000 n 0000137454 00000 n -0000748410 00000 n +0000748577 00000 n 0000005036 00000 n 0000005078 00000 n 0000141049 00000 n -0000748331 00000 n +0000748498 00000 n 0000005132 00000 n 0000005177 00000 n 0000144495 00000 n -0000748213 00000 n +0000748380 00000 n 0000005226 00000 n 0000005272 00000 n 0000146096 00000 n -0000748134 00000 n +0000748301 00000 n 0000005326 00000 n 0000005386 00000 n 0000146225 00000 n -0000748055 00000 n +0000748222 00000 n 0000005440 00000 n 0000005509 00000 n 0000149032 00000 n -0000747922 00000 n +0000748089 00000 n 0000005556 00000 n 0000005609 00000 n 0000149161 00000 n -0000747843 00000 n +0000748010 00000 n 0000005658 00000 n 0000005714 00000 n 0000149290 00000 n -0000747764 00000 n +0000747931 00000 n 0000005763 00000 n 0000005812 00000 n 0000153474 00000 n -0000747631 00000 n +0000747798 00000 n 0000005859 00000 n 0000005911 00000 n 0000153603 00000 n -0000747513 00000 n +0000747680 00000 n 0000005960 00000 n 0000006011 00000 n 0000158293 00000 n -0000747395 00000 n +0000747562 00000 n 0000006065 00000 n 0000006110 00000 n 0000158421 00000 n -0000747316 00000 n +0000747483 00000 n 0000006169 00000 n 0000006203 00000 n 0000162042 00000 n -0000747237 00000 n +0000747404 00000 n 0000006262 00000 n 0000006310 00000 n 0000162170 00000 n -0000747119 00000 n +0000747286 00000 n 0000006364 00000 n 0000006404 00000 n 0000162299 00000 n -0000747040 00000 n +0000747207 00000 n 0000006463 00000 n 0000006497 00000 n 0000166238 00000 n -0000746961 00000 n +0000747128 00000 n 0000006556 00000 n 0000006604 00000 n 0000166367 00000 n -0000746828 00000 n +0000746995 00000 n 0000006653 00000 n 0000006703 00000 n 0000169187 00000 n -0000746749 00000 n +0000746916 00000 n 0000006757 00000 n 0000006804 00000 n 0000169315 00000 n -0000746656 00000 n +0000746823 00000 n 0000006858 00000 n 0000006918 00000 n 0000169574 00000 n -0000746563 00000 n +0000746730 00000 n 0000006972 00000 n 0000007024 00000 n 0000174923 00000 n -0000746470 00000 n +0000746637 00000 n 0000007078 00000 n 0000007143 00000 n 0000175052 00000 n -0000746377 00000 n +0000746544 00000 n 0000007197 00000 n 0000007248 00000 n 0000175181 00000 n -0000746284 00000 n +0000746451 00000 n 0000007302 00000 n 0000007366 00000 n 0000178633 00000 n -0000746191 00000 n +0000746358 00000 n 0000007420 00000 n 0000007467 00000 n 0000178762 00000 n -0000746098 00000 n +0000746265 00000 n 0000007521 00000 n 0000007581 00000 n 0000178891 00000 n -0000746005 00000 n +0000746172 00000 n 0000007635 00000 n 0000007686 00000 n 0000179020 00000 n -0000745873 00000 n +0000746040 00000 n 0000007741 00000 n 0000007806 00000 n 0000183251 00000 n -0000745794 00000 n +0000745961 00000 n 0000007866 00000 n 0000007913 00000 n 0000189809 00000 n -0000745701 00000 n +0000745868 00000 n 0000007973 00000 n 0000008021 00000 n 0000197361 00000 n -0000745622 00000 n +0000745789 00000 n 0000008081 00000 n 0000008135 00000 n 0000197620 00000 n -0000745529 00000 n +0000745696 00000 n 0000008190 00000 n 0000008240 00000 n 0000200443 00000 n -0000745436 00000 n +0000745603 00000 n 0000008295 00000 n 0000008358 00000 n 0000200572 00000 n -0000745343 00000 n +0000745510 00000 n 0000008413 00000 n 0000008465 00000 n 0000200701 00000 n -0000745250 00000 n +0000745417 00000 n 0000008520 00000 n 0000008585 00000 n 0000200830 00000 n -0000745157 00000 n +0000745324 00000 n 0000008640 00000 n 0000008692 00000 n 0000206840 00000 n -0000745024 00000 n +0000745191 00000 n 0000008747 00000 n 0000008812 00000 n 0000215241 00000 n -0000744945 00000 n +0000745112 00000 n 0000008872 00000 n 0000008916 00000 n 0000236497 00000 n -0000744852 00000 n +0000745019 00000 n 0000008976 00000 n 0000009015 00000 n 0000236626 00000 n -0000744759 00000 n +0000744926 00000 n 0000009075 00000 n 0000009122 00000 n 0000236755 00000 n -0000744666 00000 n +0000744833 00000 n 0000009182 00000 n 0000009225 00000 n 0000243668 00000 n -0000744573 00000 n +0000744740 00000 n 0000009285 00000 n 0000009324 00000 n 0000247184 00000 n -0000744480 00000 n +0000744647 00000 n 0000009384 00000 n 0000009426 00000 n 0000250363 00000 n -0000744387 00000 n +0000744554 00000 n 0000009486 00000 n 0000009529 00000 n 0000257930 00000 n -0000744294 00000 n +0000744461 00000 n 0000009589 00000 n 0000009632 00000 n 0000258059 00000 n -0000744201 00000 n +0000744368 00000 n 0000009692 00000 n 0000009753 00000 n 0000262252 00000 n -0000744108 00000 n +0000744275 00000 n 0000009814 00000 n 0000009866 00000 n 0000266146 00000 n -0000744015 00000 n +0000744182 00000 n 0000009927 00000 n 0000009980 00000 n 0000266275 00000 n -0000743922 00000 n +0000744089 00000 n 0000010041 00000 n 0000010079 00000 n 0000270312 00000 n -0000743829 00000 n +0000743996 00000 n 0000010140 00000 n 0000010192 00000 n 0000273468 00000 n -0000743736 00000 n +0000743903 00000 n 0000010253 00000 n 0000010297 00000 n -0000277402 00000 n -0000743643 00000 n +0000277408 00000 n +0000743810 00000 n 0000010358 00000 n 0000010394 00000 n -0000285611 00000 n -0000743550 00000 n +0000285781 00000 n +0000743717 00000 n 0000010455 00000 n 0000010518 00000 n -0000285740 00000 n -0000743457 00000 n +0000285910 00000 n +0000743624 00000 n 0000010579 00000 n 0000010629 00000 n -0000289496 00000 n -0000743378 00000 n +0000289666 00000 n +0000743545 00000 n 0000010690 00000 n 0000010746 00000 n -0000292740 00000 n -0000743285 00000 n +0000292910 00000 n +0000743452 00000 n 0000010801 00000 n 0000010852 00000 n -0000292869 00000 n -0000743192 00000 n +0000293039 00000 n +0000743359 00000 n 0000010907 00000 n 0000010971 00000 n -0000297630 00000 n -0000743099 00000 n +0000297800 00000 n +0000743266 00000 n 0000011026 00000 n 0000011090 00000 n -0000301399 00000 n -0000743006 00000 n +0000301569 00000 n +0000743173 00000 n 0000011145 00000 n 0000011222 00000 n -0000301528 00000 n -0000742913 00000 n +0000301698 00000 n +0000743080 00000 n 0000011277 00000 n 0000011334 00000 n -0000301657 00000 n -0000742820 00000 n +0000301827 00000 n +0000742987 00000 n 0000011389 00000 n 0000011459 00000 n -0000301786 00000 n -0000742727 00000 n +0000301956 00000 n +0000742894 00000 n 0000011514 00000 n 0000011563 00000 n -0000305229 00000 n -0000742634 00000 n +0000305399 00000 n +0000742801 00000 n 0000011618 00000 n 0000011680 00000 n -0000306854 00000 n -0000742541 00000 n +0000307024 00000 n +0000742708 00000 n 0000011735 00000 n 0000011784 00000 n -0000311033 00000 n -0000742423 00000 n +0000311203 00000 n +0000742590 00000 n 0000011839 00000 n 0000011901 00000 n -0000311162 00000 n -0000742344 00000 n +0000311332 00000 n +0000742511 00000 n 0000011961 00000 n 0000012000 00000 n -0000315487 00000 n -0000742251 00000 n +0000315657 00000 n +0000742418 00000 n 0000012060 00000 n 0000012094 00000 n -0000321377 00000 n -0000742158 00000 n +0000321547 00000 n +0000742325 00000 n 0000012154 00000 n 0000012195 00000 n -0000332763 00000 n -0000742079 00000 n +0000332933 00000 n +0000742246 00000 n 0000012255 00000 n 0000012307 00000 n -0000340003 00000 n -0000741947 00000 n +0000340173 00000 n +0000742114 00000 n 0000012356 00000 n 0000012389 00000 n -0000340132 00000 n -0000741829 00000 n +0000340302 00000 n +0000741996 00000 n 0000012443 00000 n 0000012515 00000 n -0000340260 00000 n -0000741750 00000 n +0000340430 00000 n +0000741917 00000 n 0000012574 00000 n 0000012618 00000 n -0000351050 00000 n -0000741671 00000 n +0000351220 00000 n +0000741838 00000 n 0000012677 00000 n 0000012730 00000 n -0000351437 00000 n -0000741578 00000 n +0000351607 00000 n +0000741745 00000 n 0000012784 00000 n 0000012834 00000 n -0000354801 00000 n -0000741485 00000 n +0000354971 00000 n +0000741652 00000 n 0000012888 00000 n 0000012926 00000 n -0000355060 00000 n -0000741392 00000 n +0000355230 00000 n +0000741559 00000 n 0000012980 00000 n 0000013029 00000 n -0000358145 00000 n -0000741260 00000 n +0000358315 00000 n +0000741427 00000 n 0000013083 00000 n 0000013135 00000 n -0000358274 00000 n -0000741181 00000 n +0000358444 00000 n +0000741348 00000 n 0000013194 00000 n 0000013239 00000 n -0000358403 00000 n -0000741088 00000 n +0000358573 00000 n +0000741255 00000 n 0000013298 00000 n 0000013350 00000 n -0000358532 00000 n -0000740995 00000 n +0000358702 00000 n +0000741162 00000 n 0000013409 00000 n 0000013462 00000 n -0000362179 00000 n -0000740916 00000 n +0000362349 00000 n +0000741083 00000 n 0000013521 00000 n 0000013570 00000 n -0000362307 00000 n -0000740823 00000 n +0000362477 00000 n +0000740990 00000 n 0000013624 00000 n 0000013704 00000 n -0000366071 00000 n -0000740744 00000 n +0000366241 00000 n +0000740911 00000 n 0000013758 00000 n 0000013807 00000 n -0000366200 00000 n -0000740626 00000 n +0000366370 00000 n +0000740793 00000 n 0000013856 00000 n 0000013896 00000 n -0000369640 00000 n -0000740547 00000 n +0000369810 00000 n +0000740714 00000 n 0000013955 00000 n 0000014002 00000 n -0000369769 00000 n -0000740429 00000 n +0000369939 00000 n +0000740596 00000 n 0000014056 00000 n 0000014101 00000 n -0000369898 00000 n -0000740350 00000 n +0000370068 00000 n +0000740517 00000 n 0000014160 00000 n 0000014219 00000 n -0000373654 00000 n -0000740257 00000 n +0000373824 00000 n +0000740424 00000 n 0000014278 00000 n 0000014342 00000 n -0000377121 00000 n -0000740164 00000 n +0000377291 00000 n +0000740331 00000 n 0000014401 00000 n 0000014457 00000 n -0000380138 00000 n -0000740071 00000 n +0000380308 00000 n +0000740238 00000 n 0000014516 00000 n 0000014574 00000 n -0000380396 00000 n -0000739992 00000 n +0000380566 00000 n +0000740159 00000 n 0000014633 00000 n 0000014695 00000 n -0000382641 00000 n -0000739859 00000 n +0000382811 00000 n +0000740026 00000 n 0000014742 00000 n 0000014794 00000 n -0000382770 00000 n -0000739780 00000 n +0000382940 00000 n +0000739947 00000 n 0000014843 00000 n 0000014887 00000 n -0000386969 00000 n -0000739648 00000 n +0000387139 00000 n +0000739815 00000 n 0000014936 00000 n 0000014977 00000 n -0000387098 00000 n -0000739569 00000 n +0000387268 00000 n +0000739736 00000 n 0000015031 00000 n 0000015079 00000 n -0000387226 00000 n -0000739490 00000 n +0000387396 00000 n +0000739657 00000 n 0000015133 00000 n 0000015184 00000 n -0000387355 00000 n -0000739411 00000 n +0000387525 00000 n +0000739578 00000 n 0000015233 00000 n 0000015280 00000 n -0000391622 00000 n -0000739278 00000 n +0000391792 00000 n +0000739445 00000 n 0000015327 00000 n 0000015364 00000 n -0000391751 00000 n -0000739160 00000 n +0000391921 00000 n +0000739327 00000 n 0000015413 00000 n 0000015452 00000 n -0000391880 00000 n -0000739095 00000 n +0000392050 00000 n +0000739262 00000 n 0000015506 00000 n 0000015584 00000 n -0000392009 00000 n -0000739002 00000 n +0000392179 00000 n +0000739169 00000 n 0000015633 00000 n 0000015700 00000 n -0000392138 00000 n -0000738923 00000 n +0000392308 00000 n +0000739090 00000 n 0000015749 00000 n 0000015794 00000 n -0000395578 00000 n -0000738790 00000 n +0000395748 00000 n +0000738957 00000 n 0000015842 00000 n 0000015874 00000 n -0000395707 00000 n -0000738672 00000 n +0000395877 00000 n +0000738839 00000 n 0000015923 00000 n 0000015962 00000 n -0000395836 00000 n -0000738607 00000 n +0000396006 00000 n +0000738774 00000 n 0000016016 00000 n 0000016077 00000 n -0000399517 00000 n -0000738475 00000 n +0000399687 00000 n +0000738642 00000 n 0000016126 00000 n 0000016183 00000 n -0000399646 00000 n -0000738410 00000 n +0000399816 00000 n +0000738577 00000 n 0000016237 00000 n 0000016286 00000 n -0000399775 00000 n -0000738292 00000 n +0000399945 00000 n +0000738459 00000 n 0000016335 00000 n 0000016397 00000 n -0000399904 00000 n -0000738213 00000 n +0000400074 00000 n +0000738380 00000 n 0000016451 00000 n 0000016506 00000 n -0000423926 00000 n -0000738120 00000 n +0000424096 00000 n +0000738287 00000 n 0000016560 00000 n 0000016601 00000 n -0000424055 00000 n -0000738041 00000 n +0000424225 00000 n +0000738208 00000 n 0000016655 00000 n 0000016707 00000 n -0000426786 00000 n -0000737921 00000 n +0000426956 00000 n +0000738088 00000 n 0000016755 00000 n 0000016789 00000 n -0000426915 00000 n -0000737842 00000 n +0000427085 00000 n +0000738009 00000 n 0000016838 00000 n 0000016865 00000 n -0000444739 00000 n -0000737749 00000 n +0000444909 00000 n +0000737916 00000 n 0000016914 00000 n 0000016942 00000 n -0000452228 00000 n -0000737656 00000 n +0000452398 00000 n +0000737823 00000 n 0000016991 00000 n 0000017031 00000 n -0000455023 00000 n -0000737563 00000 n +0000455193 00000 n +0000737730 00000 n 0000017080 00000 n 0000017123 00000 n -0000461204 00000 n -0000737470 00000 n +0000461374 00000 n +0000737637 00000 n 0000017172 00000 n 0000017209 00000 n -0000467829 00000 n -0000737377 00000 n +0000467999 00000 n +0000737544 00000 n 0000017258 00000 n 0000017297 00000 n -0000480210 00000 n -0000737284 00000 n +0000480380 00000 n +0000737451 00000 n 0000017346 00000 n 0000017385 00000 n -0000483306 00000 n -0000737191 00000 n +0000483476 00000 n +0000737358 00000 n 0000017434 00000 n 0000017473 00000 n -0000489586 00000 n -0000737098 00000 n +0000489756 00000 n +0000737265 00000 n 0000017522 00000 n 0000017551 00000 n -0000499397 00000 n -0000737005 00000 n +0000499567 00000 n +0000737172 00000 n 0000017601 00000 n 0000017634 00000 n -0000513699 00000 n -0000736912 00000 n +0000513869 00000 n +0000737079 00000 n 0000017684 00000 n 0000017713 00000 n -0000516926 00000 n -0000736819 00000 n +0000517096 00000 n +0000736986 00000 n 0000017763 00000 n 0000017797 00000 n -0000522834 00000 n -0000736740 00000 n +0000523004 00000 n +0000736907 00000 n 0000017847 00000 n 0000017884 00000 n 0000018253 00000 n @@ -13052,10 +13027,10 @@ xref 0000017937 00000 n 0000026078 00000 n 0000026141 00000 n -0000732191 00000 n -0000706248 00000 n -0000732017 00000 n -0000733216 00000 n +0000732358 00000 n +0000706415 00000 n +0000732184 00000 n +0000733383 00000 n 0000021238 00000 n 0000021455 00000 n 0000021524 00000 n @@ -13076,12 +13051,12 @@ xref 0000027385 00000 n 0000026304 00000 n 0000027507 00000 n -0000705027 00000 n -0000678506 00000 n -0000704853 00000 n -0000677821 00000 n -0000675676 00000 n -0000677657 00000 n +0000705194 00000 n +0000678673 00000 n +0000705020 00000 n +0000677988 00000 n +0000675844 00000 n +0000677824 00000 n 0000039277 00000 n 0000030626 00000 n 0000027655 00000 n @@ -13141,9 +13116,9 @@ xref 0000042603 00000 n 0000039362 00000 n 0000052586 00000 n -0000675125 00000 n -0000658044 00000 n -0000674941 00000 n +0000675293 00000 n +0000658212 00000 n +0000675109 00000 n 0000043193 00000 n 0000043356 00000 n 0000043518 00000 n @@ -13238,9 +13213,9 @@ xref 0000061772 00000 n 0000061939 00000 n 0000062106 00000 n -0000657155 00000 n -0000635823 00000 n -0000656981 00000 n +0000657323 00000 n +0000635992 00000 n +0000657149 00000 n 0000062273 00000 n 0000062439 00000 n 0000062594 00000 n @@ -13278,9 +13253,9 @@ xref 0000068390 00000 n 0000068546 00000 n 0000068704 00000 n -0000634857 00000 n -0000614890 00000 n -0000634684 00000 n +0000635026 00000 n +0000615059 00000 n +0000634853 00000 n 0000068861 00000 n 0000069019 00000 n 0000072403 00000 n @@ -13293,10 +13268,10 @@ xref 0000072214 00000 n 0000072277 00000 n 0000072340 00000 n -0000614096 00000 n -0000595779 00000 n -0000613923 00000 n -0000733334 00000 n +0000614265 00000 n +0000595948 00000 n +0000614092 00000 n +0000733501 00000 n 0000076974 00000 n 0000075794 00000 n 0000072527 00000 n @@ -13309,8 +13284,8 @@ xref 0000075944 00000 n 0000076137 00000 n 0000076911 00000 n -0000340196 00000 n -0000399968 00000 n +0000340366 00000 n +0000400138 00000 n 0000081629 00000 n 0000080593 00000 n 0000077098 00000 n @@ -13340,7 +13315,7 @@ xref 0000087287 00000 n 0000087439 00000 n 0000088215 00000 n -0000289560 00000 n +0000289730 00000 n 0000089367 00000 n 0000089049 00000 n 0000088363 00000 n @@ -13354,7 +13329,7 @@ xref 0000091143 00000 n 0000091271 00000 n 0000091400 00000 n -0000733453 00000 n +0000733620 00000 n 0000094394 00000 n 0000093505 00000 n 0000091564 00000 n @@ -13370,17 +13345,17 @@ xref 0000097307 00000 n 0000094506 00000 n 0000097433 00000 n -0000595104 00000 n -0000583115 00000 n -0000594925 00000 n +0000595273 00000 n +0000583284 00000 n +0000595094 00000 n 0000097690 00000 n 0000101577 00000 n 0000101386 00000 n 0000097881 00000 n 0000101512 00000 n -0000582574 00000 n -0000572830 00000 n -0000582395 00000 n +0000582743 00000 n +0000572999 00000 n +0000582564 00000 n 0000106188 00000 n 0000105789 00000 n 0000101743 00000 n @@ -13403,15 +13378,15 @@ xref 0000113487 00000 n 0000112906 00000 n 0000113068 00000 n -0000571932 00000 n -0000562136 00000 n -0000571758 00000 n -0000561572 00000 n -0000552486 00000 n -0000561397 00000 n +0000572101 00000 n +0000562305 00000 n +0000571927 00000 n +0000561741 00000 n +0000552655 00000 n +0000561566 00000 n 0000113616 00000 n 0000113745 00000 n -0000733578 00000 n +0000733745 00000 n 0000112735 00000 n 0000112793 00000 n 0000112883 00000 n @@ -13426,7 +13401,7 @@ xref 0000117861 00000 n 0000118281 00000 n 0000118410 00000 n -0000403995 00000 n +0000404165 00000 n 0000122133 00000 n 0000121753 00000 n 0000118626 00000 n @@ -13460,8 +13435,8 @@ xref 0000133225 00000 n 0000133354 00000 n 0000133482 00000 n -0000733703 00000 n -0000332827 00000 n +0000733870 00000 n +0000332997 00000 n 0000137583 00000 n 0000137005 00000 n 0000133672 00000 n @@ -13478,12 +13453,12 @@ xref 0000144124 00000 n 0000141290 00000 n 0000144430 00000 n -0000552211 00000 n -0000548852 00000 n -0000552032 00000 n +0000552380 00000 n +0000549022 00000 n +0000552201 00000 n 0000144559 00000 n 0000144271 00000 n -0000399710 00000 n +0000399880 00000 n 0000146352 00000 n 0000145905 00000 n 0000144806 00000 n @@ -13501,7 +13476,7 @@ xref 0000149096 00000 n 0000149225 00000 n 0000149354 00000 n -0000733828 00000 n +0000733995 00000 n 0000149859 00000 n 0000149668 00000 n 0000149518 00000 n @@ -13546,7 +13521,7 @@ xref 0000169444 00000 n 0000169509 00000 n 0000169638 00000 n -0000733953 00000 n +0000734120 00000 n 0000175310 00000 n 0000174392 00000 n 0000169815 00000 n @@ -13555,7 +13530,7 @@ xref 0000174699 00000 n 0000175116 00000 n 0000175245 00000 n -0000527478 00000 n +0000527648 00000 n 0000179149 00000 n 0000177878 00000 n 0000175448 00000 n @@ -13588,7 +13563,7 @@ xref 0000193246 00000 n 0000190180 00000 n 0000193372 00000 n -0000734078 00000 n +0000734245 00000 n 0000197748 00000 n 0000197170 00000 n 0000193549 00000 n @@ -13625,8 +13600,8 @@ xref 0000207107 00000 n 0000211334 00000 n 0000211177 00000 n -0000734203 00000 n -0000369704 00000 n +0000734370 00000 n +0000369874 00000 n 0000215370 00000 n 0000215050 00000 n 0000211511 00000 n @@ -13647,7 +13622,7 @@ xref 0000223898 00000 n 0000224072 00000 n 0000224257 00000 n -0000292933 00000 n +0000293103 00000 n 0000228807 00000 n 0000228616 00000 n 0000224685 00000 n @@ -13665,15 +13640,15 @@ xref 0000236690 00000 n 0000236819 00000 n 0000236266 00000 n -0000734328 00000 n -0000306918 00000 n +0000734495 00000 n +0000307088 00000 n 0000240544 00000 n 0000239982 00000 n 0000236996 00000 n 0000240479 00000 n 0000240138 00000 n 0000240309 00000 n -0000387419 00000 n +0000387589 00000 n 0000243797 00000 n 0000243477 00000 n 0000240713 00000 n @@ -13699,7 +13674,7 @@ xref 0000257994 00000 n 0000257705 00000 n 0000258123 00000 n -0000734453 00000 n +0000734620 00000 n 0000262381 00000 n 0000261702 00000 n 0000258356 00000 n @@ -13727,798 +13702,798 @@ xref 0000273235 00000 n 0000273597 00000 n 0000273662 00000 n -0000277531 00000 n -0000277028 00000 n +0000277537 00000 n +0000277034 00000 n 0000273853 00000 n -0000277337 00000 n -0000277466 00000 n -0000277175 00000 n -0000281968 00000 n -0000281594 00000 n -0000277713 00000 n -0000281903 00000 n -0000281741 00000 n -0000548497 00000 n -0000546499 00000 n -0000548332 00000 n -0000734578 00000 n -0000366135 00000 n -0000285869 00000 n -0000285233 00000 n -0000282094 00000 n -0000285546 00000 n -0000285675 00000 n -0000285380 00000 n -0000285804 00000 n -0000301850 00000 n -0000289625 00000 n -0000289305 00000 n -0000285994 00000 n -0000289431 00000 n -0000292998 00000 n -0000292549 00000 n -0000289780 00000 n -0000292675 00000 n -0000292804 00000 n -0000297759 00000 n -0000297095 00000 n -0000293110 00000 n -0000297565 00000 n -0000297251 00000 n -0000297403 00000 n -0000297694 00000 n -0000301915 00000 n -0000301034 00000 n -0000297871 00000 n -0000301334 00000 n -0000301463 00000 n -0000301592 00000 n -0000301721 00000 n -0000301181 00000 n -0000305358 00000 n -0000305038 00000 n -0000302027 00000 n -0000305164 00000 n -0000305293 00000 n -0000734703 00000 n -0000306983 00000 n -0000306663 00000 n -0000305470 00000 n -0000306789 00000 n -0000308508 00000 n -0000308317 00000 n -0000307095 00000 n -0000308443 00000 n -0000311421 00000 n -0000310842 00000 n -0000308607 00000 n -0000310968 00000 n -0000311097 00000 n -0000311226 00000 n -0000311291 00000 n -0000311356 00000 n -0000315616 00000 n -0000315107 00000 n -0000311533 00000 n -0000315422 00000 n -0000315254 00000 n -0000315551 00000 n -0000527445 00000 n -0000321506 00000 n -0000318771 00000 n -0000315728 00000 n -0000321312 00000 n -0000321441 00000 n -0000319035 00000 n -0000319197 00000 n -0000319359 00000 n -0000319520 00000 n -0000319680 00000 n -0000319842 00000 n -0000320013 00000 n -0000320175 00000 n -0000320337 00000 n -0000320500 00000 n -0000320663 00000 n -0000320826 00000 n -0000320989 00000 n -0000321152 00000 n -0000326727 00000 n -0000324810 00000 n -0000321618 00000 n -0000326662 00000 n -0000325038 00000 n -0000325201 00000 n -0000325368 00000 n -0000325537 00000 n -0000325699 00000 n -0000325860 00000 n -0000326022 00000 n -0000326183 00000 n -0000326346 00000 n -0000326499 00000 n -0000734828 00000 n -0000332892 00000 n -0000329885 00000 n -0000326852 00000 n -0000332698 00000 n -0000330167 00000 n -0000330320 00000 n -0000330474 00000 n -0000330625 00000 n -0000330779 00000 n -0000330940 00000 n -0000331102 00000 n -0000331264 00000 n -0000331426 00000 n -0000331588 00000 n -0000331750 00000 n -0000331912 00000 n -0000332064 00000 n -0000332227 00000 n -0000332382 00000 n -0000332544 00000 n -0000336422 00000 n -0000336101 00000 n -0000333004 00000 n -0000336227 00000 n -0000336292 00000 n -0000336357 00000 n -0000340647 00000 n -0000339451 00000 n -0000336591 00000 n -0000339938 00000 n -0000340067 00000 n -0000340324 00000 n -0000339607 00000 n +0000277343 00000 n +0000277472 00000 n +0000277181 00000 n +0000282138 00000 n +0000281764 00000 n +0000277719 00000 n +0000282073 00000 n +0000281911 00000 n +0000548667 00000 n +0000546669 00000 n +0000548502 00000 n +0000734745 00000 n +0000366305 00000 n +0000286039 00000 n +0000285403 00000 n +0000282264 00000 n +0000285716 00000 n +0000285845 00000 n +0000285550 00000 n +0000285974 00000 n +0000302020 00000 n +0000289795 00000 n +0000289475 00000 n +0000286164 00000 n +0000289601 00000 n +0000293168 00000 n +0000292719 00000 n +0000289950 00000 n +0000292845 00000 n +0000292974 00000 n +0000297929 00000 n +0000297265 00000 n +0000293280 00000 n +0000297735 00000 n +0000297421 00000 n +0000297573 00000 n +0000297864 00000 n +0000302085 00000 n +0000301204 00000 n +0000298041 00000 n +0000301504 00000 n +0000301633 00000 n +0000301762 00000 n +0000301891 00000 n +0000301351 00000 n +0000305528 00000 n +0000305208 00000 n +0000302197 00000 n +0000305334 00000 n +0000305463 00000 n +0000734870 00000 n +0000307153 00000 n +0000306833 00000 n +0000305640 00000 n +0000306959 00000 n +0000308678 00000 n +0000308487 00000 n +0000307265 00000 n +0000308613 00000 n +0000311591 00000 n +0000311012 00000 n +0000308777 00000 n +0000311138 00000 n +0000311267 00000 n +0000311396 00000 n +0000311461 00000 n +0000311526 00000 n +0000315786 00000 n +0000315277 00000 n +0000311703 00000 n +0000315592 00000 n +0000315424 00000 n +0000315721 00000 n +0000527615 00000 n +0000321676 00000 n +0000318941 00000 n +0000315898 00000 n +0000321482 00000 n +0000321611 00000 n +0000319205 00000 n +0000319367 00000 n +0000319529 00000 n +0000319690 00000 n +0000319850 00000 n +0000320012 00000 n +0000320183 00000 n +0000320345 00000 n +0000320507 00000 n +0000320670 00000 n +0000320833 00000 n +0000320996 00000 n +0000321159 00000 n +0000321322 00000 n +0000326897 00000 n +0000324980 00000 n +0000321788 00000 n +0000326832 00000 n +0000325208 00000 n +0000325371 00000 n +0000325538 00000 n +0000325707 00000 n +0000325869 00000 n +0000326030 00000 n +0000326192 00000 n +0000326353 00000 n +0000326516 00000 n +0000326669 00000 n +0000734995 00000 n +0000333062 00000 n +0000330055 00000 n +0000327022 00000 n +0000332868 00000 n +0000330337 00000 n +0000330490 00000 n +0000330644 00000 n +0000330795 00000 n +0000330949 00000 n +0000331110 00000 n +0000331272 00000 n +0000331434 00000 n +0000331596 00000 n +0000331758 00000 n +0000331920 00000 n +0000332082 00000 n +0000332234 00000 n +0000332397 00000 n +0000332552 00000 n +0000332714 00000 n +0000336592 00000 n +0000336271 00000 n +0000333174 00000 n +0000336397 00000 n +0000336462 00000 n +0000336527 00000 n +0000340817 00000 n +0000339621 00000 n +0000336761 00000 n +0000340108 00000 n +0000340237 00000 n +0000340494 00000 n 0000339777 00000 n -0000340389 00000 n -0000340454 00000 n -0000340519 00000 n -0000340583 00000 n -0000343994 00000 n -0000343803 00000 n -0000340829 00000 n -0000343929 00000 n -0000347734 00000 n -0000347413 00000 n -0000344080 00000 n -0000347539 00000 n -0000347604 00000 n -0000347669 00000 n -0000351566 00000 n -0000350859 00000 n -0000347846 00000 n -0000350985 00000 n -0000351114 00000 n -0000351177 00000 n -0000351242 00000 n -0000351307 00000 n -0000351372 00000 n -0000351501 00000 n -0000734953 00000 n -0000355318 00000 n -0000354480 00000 n -0000351678 00000 n -0000354606 00000 n -0000354671 00000 n -0000354736 00000 n -0000354865 00000 n -0000354930 00000 n -0000354995 00000 n -0000355124 00000 n -0000355189 00000 n -0000355253 00000 n -0000358661 00000 n -0000357954 00000 n -0000355443 00000 n -0000358080 00000 n -0000358209 00000 n -0000358338 00000 n -0000358467 00000 n -0000358596 00000 n -0000362566 00000 n -0000361988 00000 n -0000358858 00000 n -0000362114 00000 n -0000362243 00000 n -0000362371 00000 n -0000362436 00000 n -0000362501 00000 n -0000366459 00000 n -0000365880 00000 n -0000362705 00000 n -0000366006 00000 n -0000366264 00000 n -0000366329 00000 n -0000366394 00000 n -0000370157 00000 n -0000369268 00000 n -0000366584 00000 n -0000369575 00000 n -0000369415 00000 n -0000369833 00000 n -0000369962 00000 n -0000370027 00000 n -0000370092 00000 n -0000373909 00000 n -0000373277 00000 n -0000370269 00000 n -0000373589 00000 n -0000373424 00000 n -0000373718 00000 n -0000373781 00000 n -0000373844 00000 n -0000735078 00000 n -0000527412 00000 n -0000377379 00000 n -0000376930 00000 n -0000374021 00000 n -0000377056 00000 n -0000377184 00000 n -0000377249 00000 n -0000377314 00000 n -0000380525 00000 n -0000379947 00000 n -0000377491 00000 n -0000380073 00000 n -0000380202 00000 n -0000380267 00000 n -0000380331 00000 n -0000546218 00000 n -0000538934 00000 n -0000546038 00000 n -0000380460 00000 n -0000381006 00000 n -0000380815 00000 n -0000380665 00000 n -0000380941 00000 n -0000382898 00000 n -0000382450 00000 n -0000381048 00000 n -0000382576 00000 n -0000382705 00000 n -0000382834 00000 n -0000387484 00000 n -0000386541 00000 n -0000383010 00000 n -0000386904 00000 n -0000538613 00000 n -0000529400 00000 n -0000538427 00000 n -0000386688 00000 n -0000387033 00000 n -0000387161 00000 n -0000387290 00000 n -0000388526 00000 n -0000388335 00000 n -0000387721 00000 n -0000388461 00000 n -0000735203 00000 n -0000388953 00000 n -0000388762 00000 n -0000388612 00000 n -0000388888 00000 n -0000392266 00000 n -0000391040 00000 n -0000388995 00000 n -0000391557 00000 n -0000391686 00000 n -0000391815 00000 n -0000391944 00000 n -0000392073 00000 n -0000392202 00000 n -0000391196 00000 n -0000391368 00000 n -0000392720 00000 n -0000392529 00000 n -0000392379 00000 n -0000392655 00000 n -0000395965 00000 n -0000395387 00000 n -0000392762 00000 n -0000395513 00000 n -0000395642 00000 n -0000395771 00000 n -0000395900 00000 n -0000400160 00000 n -0000398942 00000 n -0000396051 00000 n -0000399452 00000 n -0000399581 00000 n -0000399839 00000 n -0000399098 00000 n -0000399277 00000 n -0000400032 00000 n -0000400096 00000 n -0000407047 00000 n -0000403219 00000 n -0000400313 00000 n -0000403345 00000 n -0000403410 00000 n -0000403475 00000 n -0000403540 00000 n -0000403605 00000 n -0000403670 00000 n -0000403735 00000 n -0000403800 00000 n -0000403865 00000 n -0000403930 00000 n -0000404060 00000 n -0000404125 00000 n -0000404190 00000 n -0000404255 00000 n -0000404320 00000 n -0000404385 00000 n -0000404450 00000 n -0000404515 00000 n -0000404580 00000 n -0000404645 00000 n -0000404710 00000 n -0000404775 00000 n -0000404840 00000 n -0000404905 00000 n -0000404970 00000 n -0000405035 00000 n -0000405100 00000 n -0000405165 00000 n -0000405230 00000 n -0000405295 00000 n -0000405360 00000 n -0000405425 00000 n -0000405490 00000 n -0000405555 00000 n -0000405619 00000 n -0000405684 00000 n -0000405749 00000 n -0000405814 00000 n -0000405879 00000 n -0000405944 00000 n -0000406009 00000 n -0000406074 00000 n -0000406139 00000 n -0000406204 00000 n -0000406269 00000 n -0000406334 00000 n -0000406399 00000 n -0000406464 00000 n -0000406529 00000 n -0000406594 00000 n -0000406659 00000 n -0000406724 00000 n -0000406789 00000 n -0000406854 00000 n -0000406919 00000 n -0000406983 00000 n -0000735328 00000 n -0000413693 00000 n -0000410129 00000 n -0000407159 00000 n -0000410255 00000 n -0000410320 00000 n -0000410385 00000 n -0000410450 00000 n -0000410515 00000 n -0000410580 00000 n -0000410645 00000 n -0000410710 00000 n -0000410775 00000 n -0000410840 00000 n -0000410905 00000 n -0000410970 00000 n -0000411034 00000 n -0000411099 00000 n -0000411164 00000 n -0000411229 00000 n -0000411294 00000 n -0000411359 00000 n -0000411424 00000 n -0000411489 00000 n -0000411554 00000 n -0000411619 00000 n -0000411684 00000 n -0000411749 00000 n -0000411813 00000 n -0000411878 00000 n -0000411943 00000 n -0000412008 00000 n -0000412073 00000 n -0000412138 00000 n -0000412203 00000 n -0000412268 00000 n -0000412333 00000 n -0000412398 00000 n -0000412463 00000 n -0000412528 00000 n -0000412593 00000 n -0000412658 00000 n -0000412723 00000 n -0000412788 00000 n -0000412852 00000 n -0000412916 00000 n -0000412980 00000 n -0000413045 00000 n -0000413110 00000 n -0000413175 00000 n -0000413240 00000 n -0000413305 00000 n -0000413370 00000 n -0000413435 00000 n -0000413500 00000 n -0000413565 00000 n -0000413629 00000 n -0000419866 00000 n -0000416428 00000 n -0000413805 00000 n -0000416554 00000 n -0000416619 00000 n -0000416684 00000 n -0000416749 00000 n -0000416814 00000 n -0000416879 00000 n -0000416944 00000 n -0000417009 00000 n -0000417074 00000 n -0000417139 00000 n -0000417204 00000 n -0000417269 00000 n -0000417334 00000 n -0000417399 00000 n -0000417464 00000 n -0000417529 00000 n -0000417594 00000 n -0000417659 00000 n -0000417724 00000 n -0000417789 00000 n -0000417854 00000 n -0000417919 00000 n -0000417984 00000 n -0000418049 00000 n -0000418114 00000 n -0000418179 00000 n -0000418244 00000 n -0000418309 00000 n -0000418374 00000 n -0000418439 00000 n -0000418504 00000 n -0000418569 00000 n -0000418634 00000 n -0000418699 00000 n -0000418763 00000 n -0000418828 00000 n -0000418893 00000 n -0000418958 00000 n -0000419023 00000 n -0000419088 00000 n -0000419153 00000 n -0000419218 00000 n -0000419283 00000 n -0000419348 00000 n -0000419413 00000 n -0000419478 00000 n -0000419543 00000 n -0000419608 00000 n -0000419673 00000 n -0000419738 00000 n -0000419802 00000 n -0000424444 00000 n -0000422180 00000 n -0000419978 00000 n -0000422306 00000 n -0000422371 00000 n -0000422436 00000 n -0000422501 00000 n -0000422566 00000 n -0000422631 00000 n -0000422696 00000 n -0000422761 00000 n -0000422826 00000 n -0000422891 00000 n -0000422956 00000 n -0000423021 00000 n -0000423086 00000 n -0000423151 00000 n -0000423213 00000 n -0000423277 00000 n -0000423342 00000 n -0000423406 00000 n -0000423471 00000 n -0000423536 00000 n -0000423601 00000 n -0000423666 00000 n -0000423731 00000 n -0000423796 00000 n -0000423861 00000 n -0000423990 00000 n -0000424119 00000 n -0000424184 00000 n -0000424249 00000 n -0000424314 00000 n -0000424379 00000 n -0000427239 00000 n -0000426595 00000 n -0000424569 00000 n -0000426721 00000 n -0000426850 00000 n -0000426979 00000 n -0000427044 00000 n -0000427109 00000 n -0000427174 00000 n -0000431577 00000 n -0000431257 00000 n -0000427352 00000 n -0000431383 00000 n -0000431448 00000 n -0000431513 00000 n -0000435177 00000 n -0000434922 00000 n -0000431730 00000 n -0000435048 00000 n -0000435113 00000 n -0000735453 00000 n -0000438425 00000 n -0000438234 00000 n -0000435316 00000 n -0000438360 00000 n -0000442156 00000 n -0000441900 00000 n -0000438551 00000 n -0000442026 00000 n -0000442091 00000 n -0000444996 00000 n -0000444288 00000 n -0000442295 00000 n -0000444414 00000 n -0000444479 00000 n -0000444544 00000 n -0000444609 00000 n -0000444674 00000 n -0000444803 00000 n -0000444868 00000 n -0000444932 00000 n -0000449664 00000 n -0000449408 00000 n -0000445135 00000 n -0000449534 00000 n -0000449599 00000 n -0000452615 00000 n -0000451842 00000 n -0000449790 00000 n -0000451968 00000 n -0000452033 00000 n -0000452098 00000 n -0000452163 00000 n -0000452292 00000 n -0000452357 00000 n -0000452420 00000 n -0000452485 00000 n -0000452550 00000 n -0000455216 00000 n -0000454507 00000 n -0000452768 00000 n -0000454633 00000 n -0000454698 00000 n -0000454763 00000 n -0000454828 00000 n -0000454893 00000 n -0000454958 00000 n -0000455087 00000 n -0000455152 00000 n -0000735578 00000 n -0000458459 00000 n -0000458073 00000 n -0000455368 00000 n -0000458199 00000 n -0000458264 00000 n -0000458329 00000 n -0000458394 00000 n -0000461592 00000 n -0000460819 00000 n -0000458599 00000 n -0000460945 00000 n -0000461010 00000 n -0000461075 00000 n -0000461139 00000 n -0000461267 00000 n -0000461332 00000 n -0000461397 00000 n -0000461462 00000 n -0000461527 00000 n -0000464979 00000 n -0000464788 00000 n -0000461758 00000 n -0000464914 00000 n -0000468088 00000 n -0000467378 00000 n -0000465105 00000 n -0000467504 00000 n -0000467569 00000 n -0000467634 00000 n -0000467699 00000 n -0000467764 00000 n -0000467893 00000 n -0000467958 00000 n -0000468023 00000 n -0000471639 00000 n -0000471318 00000 n -0000468253 00000 n -0000471444 00000 n -0000471509 00000 n -0000471574 00000 n -0000475085 00000 n -0000474894 00000 n -0000471765 00000 n -0000475020 00000 n -0000735703 00000 n -0000478156 00000 n -0000477837 00000 n -0000475211 00000 n -0000477963 00000 n -0000478028 00000 n -0000478092 00000 n -0000480727 00000 n -0000479889 00000 n -0000478309 00000 n -0000480015 00000 n -0000480080 00000 n -0000480145 00000 n -0000480274 00000 n -0000480339 00000 n -0000480404 00000 n -0000480469 00000 n -0000480534 00000 n -0000480598 00000 n -0000480663 00000 n -0000483694 00000 n -0000483050 00000 n -0000480880 00000 n -0000483176 00000 n -0000483241 00000 n -0000483370 00000 n -0000483435 00000 n -0000483499 00000 n -0000483564 00000 n -0000483629 00000 n -0000487167 00000 n -0000486976 00000 n -0000483834 00000 n -0000487102 00000 n -0000489974 00000 n -0000489200 00000 n -0000487293 00000 n -0000489326 00000 n -0000489391 00000 n -0000489456 00000 n -0000489521 00000 n -0000489650 00000 n -0000489715 00000 n -0000489780 00000 n -0000489844 00000 n -0000489909 00000 n -0000493377 00000 n -0000493186 00000 n -0000490127 00000 n -0000493312 00000 n -0000735828 00000 n -0000496412 00000 n -0000496092 00000 n -0000493588 00000 n -0000496218 00000 n -0000496283 00000 n -0000496348 00000 n -0000499721 00000 n -0000499012 00000 n -0000496636 00000 n -0000499138 00000 n -0000499203 00000 n -0000499268 00000 n -0000499332 00000 n -0000499461 00000 n -0000499526 00000 n -0000499591 00000 n -0000499656 00000 n -0000504137 00000 n -0000503881 00000 n -0000499873 00000 n -0000504007 00000 n -0000504072 00000 n -0000507670 00000 n -0000507479 00000 n -0000504263 00000 n -0000507605 00000 n -0000510256 00000 n -0000509806 00000 n -0000507796 00000 n -0000509932 00000 n -0000509997 00000 n -0000510062 00000 n -0000510127 00000 n -0000510192 00000 n -0000514088 00000 n -0000513508 00000 n -0000510394 00000 n -0000513634 00000 n -0000513763 00000 n -0000513828 00000 n -0000513893 00000 n -0000513958 00000 n -0000514023 00000 n -0000735953 00000 n -0000517250 00000 n -0000516540 00000 n -0000514228 00000 n -0000516666 00000 n -0000516731 00000 n -0000516796 00000 n -0000516861 00000 n -0000516990 00000 n -0000517055 00000 n -0000517120 00000 n -0000517185 00000 n -0000519967 00000 n -0000519711 00000 n -0000517402 00000 n -0000519837 00000 n -0000519902 00000 n -0000523221 00000 n -0000522448 00000 n -0000520093 00000 n -0000522574 00000 n -0000522639 00000 n -0000522704 00000 n -0000522769 00000 n -0000522898 00000 n -0000522963 00000 n -0000523028 00000 n -0000523092 00000 n -0000523157 00000 n -0000526507 00000 n -0000526188 00000 n -0000523373 00000 n -0000526314 00000 n -0000526379 00000 n -0000526444 00000 n -0000527313 00000 n -0000527057 00000 n -0000526659 00000 n -0000527183 00000 n -0000527248 00000 n -0000527511 00000 n -0000538855 00000 n -0000546444 00000 n -0000548744 00000 n -0000548713 00000 n -0000552431 00000 n -0000561871 00000 n -0000572378 00000 n -0000582862 00000 n -0000595486 00000 n -0000614551 00000 n -0000635438 00000 n -0000657582 00000 n -0000675477 00000 n -0000678308 00000 n -0000678078 00000 n -0000705615 00000 n -0000732726 00000 n -0000736078 00000 n -0000736202 00000 n -0000736328 00000 n -0000736454 00000 n -0000736571 00000 n -0000736663 00000 n -0000753278 00000 n -0000772590 00000 n -0000772631 00000 n -0000772671 00000 n -0000772805 00000 n +0000339947 00000 n +0000340559 00000 n +0000340624 00000 n +0000340689 00000 n +0000340753 00000 n +0000344164 00000 n +0000343973 00000 n +0000340999 00000 n +0000344099 00000 n +0000347904 00000 n +0000347583 00000 n +0000344250 00000 n +0000347709 00000 n +0000347774 00000 n +0000347839 00000 n +0000351736 00000 n +0000351029 00000 n +0000348016 00000 n +0000351155 00000 n +0000351284 00000 n +0000351347 00000 n +0000351412 00000 n +0000351477 00000 n +0000351542 00000 n +0000351671 00000 n +0000735120 00000 n +0000355488 00000 n +0000354650 00000 n +0000351848 00000 n +0000354776 00000 n +0000354841 00000 n +0000354906 00000 n +0000355035 00000 n +0000355100 00000 n +0000355165 00000 n +0000355294 00000 n +0000355359 00000 n +0000355423 00000 n +0000358831 00000 n +0000358124 00000 n +0000355613 00000 n +0000358250 00000 n +0000358379 00000 n +0000358508 00000 n +0000358637 00000 n +0000358766 00000 n +0000362736 00000 n +0000362158 00000 n +0000359028 00000 n +0000362284 00000 n +0000362413 00000 n +0000362541 00000 n +0000362606 00000 n +0000362671 00000 n +0000366629 00000 n +0000366050 00000 n +0000362875 00000 n +0000366176 00000 n +0000366434 00000 n +0000366499 00000 n +0000366564 00000 n +0000370327 00000 n +0000369438 00000 n +0000366754 00000 n +0000369745 00000 n +0000369585 00000 n +0000370003 00000 n +0000370132 00000 n +0000370197 00000 n +0000370262 00000 n +0000374079 00000 n +0000373447 00000 n +0000370439 00000 n +0000373759 00000 n +0000373594 00000 n +0000373888 00000 n +0000373951 00000 n +0000374014 00000 n +0000735245 00000 n +0000527582 00000 n +0000377549 00000 n +0000377100 00000 n +0000374191 00000 n +0000377226 00000 n +0000377354 00000 n +0000377419 00000 n +0000377484 00000 n +0000380695 00000 n +0000380117 00000 n +0000377661 00000 n +0000380243 00000 n +0000380372 00000 n +0000380437 00000 n +0000380501 00000 n +0000546388 00000 n +0000539104 00000 n +0000546208 00000 n +0000380630 00000 n +0000381176 00000 n +0000380985 00000 n +0000380835 00000 n +0000381111 00000 n +0000383068 00000 n +0000382620 00000 n +0000381218 00000 n +0000382746 00000 n +0000382875 00000 n +0000383004 00000 n +0000387654 00000 n +0000386711 00000 n +0000383180 00000 n +0000387074 00000 n +0000538783 00000 n +0000529570 00000 n +0000538597 00000 n +0000386858 00000 n +0000387203 00000 n +0000387331 00000 n +0000387460 00000 n +0000388696 00000 n +0000388505 00000 n +0000387891 00000 n +0000388631 00000 n +0000735370 00000 n +0000389123 00000 n +0000388932 00000 n +0000388782 00000 n +0000389058 00000 n +0000392436 00000 n +0000391210 00000 n +0000389165 00000 n +0000391727 00000 n +0000391856 00000 n +0000391985 00000 n +0000392114 00000 n +0000392243 00000 n +0000392372 00000 n +0000391366 00000 n +0000391538 00000 n +0000392890 00000 n +0000392699 00000 n +0000392549 00000 n +0000392825 00000 n +0000396135 00000 n +0000395557 00000 n +0000392932 00000 n +0000395683 00000 n +0000395812 00000 n +0000395941 00000 n +0000396070 00000 n +0000400330 00000 n +0000399112 00000 n +0000396221 00000 n +0000399622 00000 n +0000399751 00000 n +0000400009 00000 n +0000399268 00000 n +0000399447 00000 n +0000400202 00000 n +0000400266 00000 n +0000407217 00000 n +0000403389 00000 n +0000400483 00000 n +0000403515 00000 n +0000403580 00000 n +0000403645 00000 n +0000403710 00000 n +0000403775 00000 n +0000403840 00000 n +0000403905 00000 n +0000403970 00000 n +0000404035 00000 n +0000404100 00000 n +0000404230 00000 n +0000404295 00000 n +0000404360 00000 n +0000404425 00000 n +0000404490 00000 n +0000404555 00000 n +0000404620 00000 n +0000404685 00000 n +0000404750 00000 n +0000404815 00000 n +0000404880 00000 n +0000404945 00000 n +0000405010 00000 n +0000405075 00000 n +0000405140 00000 n +0000405205 00000 n +0000405270 00000 n +0000405335 00000 n +0000405400 00000 n +0000405465 00000 n +0000405530 00000 n +0000405595 00000 n +0000405660 00000 n +0000405725 00000 n +0000405789 00000 n +0000405854 00000 n +0000405919 00000 n +0000405984 00000 n +0000406049 00000 n +0000406114 00000 n +0000406179 00000 n +0000406244 00000 n +0000406309 00000 n +0000406374 00000 n +0000406439 00000 n +0000406504 00000 n +0000406569 00000 n +0000406634 00000 n +0000406699 00000 n +0000406764 00000 n +0000406829 00000 n +0000406894 00000 n +0000406959 00000 n +0000407024 00000 n +0000407089 00000 n +0000407153 00000 n +0000735495 00000 n +0000413863 00000 n +0000410299 00000 n +0000407329 00000 n +0000410425 00000 n +0000410490 00000 n +0000410555 00000 n +0000410620 00000 n +0000410685 00000 n +0000410750 00000 n +0000410815 00000 n +0000410880 00000 n +0000410945 00000 n +0000411010 00000 n +0000411075 00000 n +0000411140 00000 n +0000411204 00000 n +0000411269 00000 n +0000411334 00000 n +0000411399 00000 n +0000411464 00000 n +0000411529 00000 n +0000411594 00000 n +0000411659 00000 n +0000411724 00000 n +0000411789 00000 n +0000411854 00000 n +0000411919 00000 n +0000411983 00000 n +0000412048 00000 n +0000412113 00000 n +0000412178 00000 n +0000412243 00000 n +0000412308 00000 n +0000412373 00000 n +0000412438 00000 n +0000412503 00000 n +0000412568 00000 n +0000412633 00000 n +0000412698 00000 n +0000412763 00000 n +0000412828 00000 n +0000412893 00000 n +0000412958 00000 n +0000413022 00000 n +0000413086 00000 n +0000413150 00000 n +0000413215 00000 n +0000413280 00000 n +0000413345 00000 n +0000413410 00000 n +0000413475 00000 n +0000413540 00000 n +0000413605 00000 n +0000413670 00000 n +0000413735 00000 n +0000413799 00000 n +0000420036 00000 n +0000416598 00000 n +0000413975 00000 n +0000416724 00000 n +0000416789 00000 n +0000416854 00000 n +0000416919 00000 n +0000416984 00000 n +0000417049 00000 n +0000417114 00000 n +0000417179 00000 n +0000417244 00000 n +0000417309 00000 n +0000417374 00000 n +0000417439 00000 n +0000417504 00000 n +0000417569 00000 n +0000417634 00000 n +0000417699 00000 n +0000417764 00000 n +0000417829 00000 n +0000417894 00000 n +0000417959 00000 n +0000418024 00000 n +0000418089 00000 n +0000418154 00000 n +0000418219 00000 n +0000418284 00000 n +0000418349 00000 n +0000418414 00000 n +0000418479 00000 n +0000418544 00000 n +0000418609 00000 n +0000418674 00000 n +0000418739 00000 n +0000418804 00000 n +0000418869 00000 n +0000418933 00000 n +0000418998 00000 n +0000419063 00000 n +0000419128 00000 n +0000419193 00000 n +0000419258 00000 n +0000419323 00000 n +0000419388 00000 n +0000419453 00000 n +0000419518 00000 n +0000419583 00000 n +0000419648 00000 n +0000419713 00000 n +0000419778 00000 n +0000419843 00000 n +0000419908 00000 n +0000419972 00000 n +0000424614 00000 n +0000422350 00000 n +0000420148 00000 n +0000422476 00000 n +0000422541 00000 n +0000422606 00000 n +0000422671 00000 n +0000422736 00000 n +0000422801 00000 n +0000422866 00000 n +0000422931 00000 n +0000422996 00000 n +0000423061 00000 n +0000423126 00000 n +0000423191 00000 n +0000423256 00000 n +0000423321 00000 n +0000423383 00000 n +0000423447 00000 n +0000423512 00000 n +0000423576 00000 n +0000423641 00000 n +0000423706 00000 n +0000423771 00000 n +0000423836 00000 n +0000423901 00000 n +0000423966 00000 n +0000424031 00000 n +0000424160 00000 n +0000424289 00000 n +0000424354 00000 n +0000424419 00000 n +0000424484 00000 n +0000424549 00000 n +0000427409 00000 n +0000426765 00000 n +0000424739 00000 n +0000426891 00000 n +0000427020 00000 n +0000427149 00000 n +0000427214 00000 n +0000427279 00000 n +0000427344 00000 n +0000431747 00000 n +0000431427 00000 n +0000427522 00000 n +0000431553 00000 n +0000431618 00000 n +0000431683 00000 n +0000435347 00000 n +0000435092 00000 n +0000431900 00000 n +0000435218 00000 n +0000435283 00000 n +0000735620 00000 n +0000438595 00000 n +0000438404 00000 n +0000435486 00000 n +0000438530 00000 n +0000442326 00000 n +0000442070 00000 n +0000438721 00000 n +0000442196 00000 n +0000442261 00000 n +0000445166 00000 n +0000444458 00000 n +0000442465 00000 n +0000444584 00000 n +0000444649 00000 n +0000444714 00000 n +0000444779 00000 n +0000444844 00000 n +0000444973 00000 n +0000445038 00000 n +0000445102 00000 n +0000449834 00000 n +0000449578 00000 n +0000445305 00000 n +0000449704 00000 n +0000449769 00000 n +0000452785 00000 n +0000452012 00000 n +0000449960 00000 n +0000452138 00000 n +0000452203 00000 n +0000452268 00000 n +0000452333 00000 n +0000452462 00000 n +0000452527 00000 n +0000452590 00000 n +0000452655 00000 n +0000452720 00000 n +0000455386 00000 n +0000454677 00000 n +0000452938 00000 n +0000454803 00000 n +0000454868 00000 n +0000454933 00000 n +0000454998 00000 n +0000455063 00000 n +0000455128 00000 n +0000455257 00000 n +0000455322 00000 n +0000735745 00000 n +0000458629 00000 n +0000458243 00000 n +0000455538 00000 n +0000458369 00000 n +0000458434 00000 n +0000458499 00000 n +0000458564 00000 n +0000461762 00000 n +0000460989 00000 n +0000458769 00000 n +0000461115 00000 n +0000461180 00000 n +0000461245 00000 n +0000461309 00000 n +0000461437 00000 n +0000461502 00000 n +0000461567 00000 n +0000461632 00000 n +0000461697 00000 n +0000465149 00000 n +0000464958 00000 n +0000461928 00000 n +0000465084 00000 n +0000468258 00000 n +0000467548 00000 n +0000465275 00000 n +0000467674 00000 n +0000467739 00000 n +0000467804 00000 n +0000467869 00000 n +0000467934 00000 n +0000468063 00000 n +0000468128 00000 n +0000468193 00000 n +0000471809 00000 n +0000471488 00000 n +0000468423 00000 n +0000471614 00000 n +0000471679 00000 n +0000471744 00000 n +0000475255 00000 n +0000475064 00000 n +0000471935 00000 n +0000475190 00000 n +0000735870 00000 n +0000478326 00000 n +0000478007 00000 n +0000475381 00000 n +0000478133 00000 n +0000478198 00000 n +0000478262 00000 n +0000480897 00000 n +0000480059 00000 n +0000478479 00000 n +0000480185 00000 n +0000480250 00000 n +0000480315 00000 n +0000480444 00000 n +0000480509 00000 n +0000480574 00000 n +0000480639 00000 n +0000480704 00000 n +0000480768 00000 n +0000480833 00000 n +0000483864 00000 n +0000483220 00000 n +0000481050 00000 n +0000483346 00000 n +0000483411 00000 n +0000483540 00000 n +0000483605 00000 n +0000483669 00000 n +0000483734 00000 n +0000483799 00000 n +0000487337 00000 n +0000487146 00000 n +0000484004 00000 n +0000487272 00000 n +0000490144 00000 n +0000489370 00000 n +0000487463 00000 n +0000489496 00000 n +0000489561 00000 n +0000489626 00000 n +0000489691 00000 n +0000489820 00000 n +0000489885 00000 n +0000489950 00000 n +0000490014 00000 n +0000490079 00000 n +0000493547 00000 n +0000493356 00000 n +0000490297 00000 n +0000493482 00000 n +0000735995 00000 n +0000496582 00000 n +0000496262 00000 n +0000493758 00000 n +0000496388 00000 n +0000496453 00000 n +0000496518 00000 n +0000499891 00000 n +0000499182 00000 n +0000496806 00000 n +0000499308 00000 n +0000499373 00000 n +0000499438 00000 n +0000499502 00000 n +0000499631 00000 n +0000499696 00000 n +0000499761 00000 n +0000499826 00000 n +0000504307 00000 n +0000504051 00000 n +0000500043 00000 n +0000504177 00000 n +0000504242 00000 n +0000507840 00000 n +0000507649 00000 n +0000504433 00000 n +0000507775 00000 n +0000510426 00000 n +0000509976 00000 n +0000507966 00000 n +0000510102 00000 n +0000510167 00000 n +0000510232 00000 n +0000510297 00000 n +0000510362 00000 n +0000514258 00000 n +0000513678 00000 n +0000510564 00000 n +0000513804 00000 n +0000513933 00000 n +0000513998 00000 n +0000514063 00000 n +0000514128 00000 n +0000514193 00000 n +0000736120 00000 n +0000517420 00000 n +0000516710 00000 n +0000514398 00000 n +0000516836 00000 n +0000516901 00000 n +0000516966 00000 n +0000517031 00000 n +0000517160 00000 n +0000517225 00000 n +0000517290 00000 n +0000517355 00000 n +0000520137 00000 n +0000519881 00000 n +0000517572 00000 n +0000520007 00000 n +0000520072 00000 n +0000523391 00000 n +0000522618 00000 n +0000520263 00000 n +0000522744 00000 n +0000522809 00000 n +0000522874 00000 n +0000522939 00000 n +0000523068 00000 n +0000523133 00000 n +0000523198 00000 n +0000523262 00000 n +0000523327 00000 n +0000526677 00000 n +0000526358 00000 n +0000523543 00000 n +0000526484 00000 n +0000526549 00000 n +0000526614 00000 n +0000527483 00000 n +0000527227 00000 n +0000526829 00000 n +0000527353 00000 n +0000527418 00000 n +0000527681 00000 n +0000539025 00000 n +0000546614 00000 n +0000548914 00000 n +0000548883 00000 n +0000552600 00000 n +0000562040 00000 n +0000572547 00000 n +0000583031 00000 n +0000595655 00000 n +0000614720 00000 n +0000635607 00000 n +0000657750 00000 n +0000675645 00000 n +0000678475 00000 n +0000678245 00000 n +0000705782 00000 n +0000732893 00000 n +0000736245 00000 n +0000736369 00000 n +0000736495 00000 n +0000736621 00000 n +0000736738 00000 n +0000736830 00000 n +0000753445 00000 n +0000772757 00000 n +0000772798 00000 n +0000772838 00000 n +0000772972 00000 n trailer << /Size 2172 /Root 2170 0 R /Info 2171 0 R -/ID [ ] +/ID [<5A3C18693D743104F54A9671E6A3E513> <5A3C18693D743104F54A9671E6A3E513>] >> startxref -773063 +773230 %%EOF diff --git a/doc/arm/man.dig.html b/doc/arm/man.dig.html index 9339878..bf39f83 100644 --- a/doc/arm/man.dig.html +++ b/doc/arm/man.dig.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -52,7 +52,7 @@

dig [global-queryopt...] [query...]

-

DESCRIPTION

+

DESCRIPTION

dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and @@ -98,7 +98,7 @@

-

SIMPLE USAGE

+

SIMPLE USAGE

A typical invocation of dig looks like:

@@ -144,7 +144,7 @@

-

OPTIONS

+

OPTIONS

The -b option sets the source IP address of the query to address. This must be a valid @@ -248,7 +248,7 @@

-

QUERY OPTIONS

+

QUERY OPTIONS

dig provides a number of query options which affect the way in which lookups are made and the results displayed. Some of @@ -573,7 +573,7 @@

-

MULTIPLE QUERIES

+

MULTIPLE QUERIES

The BIND 9 implementation of dig supports @@ -619,7 +619,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

IDN SUPPORT

+

IDN SUPPORT

If dig has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -633,14 +633,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

FILES

+

FILES

/etc/resolv.conf

${HOME}/.digrc

-

SEE ALSO

+

SEE ALSO

host(1), named(8), dnssec-keygen(8), @@ -648,7 +648,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

BUGS

+

BUGS

There are probably too many query options.

diff --git a/doc/arm/man.dnssec-dsfromkey.html b/doc/arm/man.dnssec-dsfromkey.html index 7c84aff..be8c749 100644 --- a/doc/arm/man.dnssec-dsfromkey.html +++ b/doc/arm/man.dnssec-dsfromkey.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -51,14 +51,14 @@

dnssec-dsfromkey {-s} [-v level] [-1] [-2] [-a alg] [-c class] [-d dir] {dnsname}

-

DESCRIPTION

+

DESCRIPTION

dnssec-dsfromkey outputs the Delegation Signer (DS) resource record (RR), as defined in RFC 3658 and RFC 4509, for the given key(s).

-

OPTIONS

+

OPTIONS

-1

@@ -99,7 +99,7 @@

-

EXAMPLE

+

EXAMPLE

To build the SHA-256 DS RR from the Kexample.com.+003+26160 @@ -114,7 +114,7 @@

-

FILES

+

FILES

The keyfile can be designed by the key identification Knnnn.+aaa+iiiii or the full file name @@ -128,13 +128,13 @@

-

CAVEAT

+

CAVEAT

A keyfile error can give a "file not found" even if the file exists.

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -143,7 +143,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-keyfromlabel.html b/doc/arm/man.dnssec-keyfromlabel.html index 8996855..849528e 100644 --- a/doc/arm/man.dnssec-keyfromlabel.html +++ b/doc/arm/man.dnssec-keyfromlabel.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-keyfromlabel {-a algorithm} {-l label} [-c class] [-f flag] [-k] [-n nametype] [-p protocol] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keyfromlabel gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 @@ -58,7 +58,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm
@@ -139,7 +139,7 @@
-

GENERATED KEY FILES

+

GENERATED KEY FILES

When dnssec-keyfromlabel completes successfully, @@ -180,7 +180,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -188,7 +188,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-keygen.html b/doc/arm/man.dnssec-keygen.html index 5f6ca80..8c00bec 100644 --- a/doc/arm/man.dnssec-keygen.html +++ b/doc/arm/man.dnssec-keygen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-keygen {-a algorithm} {-b keysize} {-n nametype} [-c class] [-e] [-f flag] [-g generator] [-h] [-k] [-p protocol] [-r randomdev] [-s strength] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keygen generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with @@ -63,7 +63,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm
@@ -173,7 +173,7 @@
-

GENERATED KEYS

+

GENERATED KEYS

When dnssec-keygen completes successfully, @@ -219,7 +219,7 @@

-

EXAMPLE

+

EXAMPLE

To generate a 768-bit DSA key for the domain example.com, the following command would be @@ -240,7 +240,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 2539, @@ -249,7 +249,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-signzone.html b/doc/arm/man.dnssec-signzone.html index 735cce1..5ecf0b8 100644 --- a/doc/arm/man.dnssec-signzone.html +++ b/doc/arm/man.dnssec-signzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-P] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -61,7 +61,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -291,7 +291,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -320,7 +320,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -345,14 +345,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.host.html b/doc/arm/man.host.html index 85ed78e..7f9eeb9 100644 --- a/doc/arm/man.host.html +++ b/doc/arm/man.host.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]

-

DESCRIPTION

+

DESCRIPTION

host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa. @@ -202,7 +202,7 @@

-

IDN SUPPORT

+

IDN SUPPORT

If host has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -216,12 +216,12 @@

-

FILES

+

FILES

/etc/resolv.conf

-

SEE ALSO

+

SEE ALSO

dig(1), named(8).

diff --git a/doc/arm/man.named-checkconf.html b/doc/arm/man.named-checkconf.html index 424c948..9d4c0ed 100644 --- a/doc/arm/man.named-checkconf.html +++ b/doc/arm/man.named-checkconf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,14 +50,14 @@

named-checkconf [-h] [-v] [-j] [-t directory] {filename} [-z]

-

DESCRIPTION

+

DESCRIPTION

named-checkconf checks the syntax, but not the semantics, of a named configuration file.

-

OPTIONS

+

OPTIONS

-h

@@ -92,21 +92,21 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkconf returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkzone(8), BIND 9 Administrator Reference Manual.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-checkzone.html b/doc/arm/man.named-checkzone.html index cabab44..a44e59f 100644 --- a/doc/arm/man.named-checkzone.html +++ b/doc/arm/man.named-checkzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -51,7 +51,7 @@

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {-o filename} {zonename} {filename}

-

DESCRIPTION

+

DESCRIPTION

named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a @@ -71,7 +71,7 @@

-

OPTIONS

+

OPTIONS

-d

@@ -257,14 +257,14 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkzone returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkconf(8), RFC 1035, @@ -272,7 +272,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named.html b/doc/arm/man.named.html index d4783be..c3ba7fb 100644 --- a/doc/arm/man.named.html +++ b/doc/arm/man.named.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

named [-4] [-6] [-c config-file] [-d debug-level] [-f] [-g] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-u user] [-v] [-V] [-x cache-file]

-

DESCRIPTION

+

DESCRIPTION

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -65,7 +65,7 @@

-

OPTIONS

+

OPTIONS

-4

@@ -238,7 +238,7 @@

-

SIGNALS

+

SIGNALS

In routine operation, signals should not be used to control the nameserver; rndc should be used @@ -259,7 +259,7 @@

-

CONFIGURATION

+

CONFIGURATION

The named configuration file is too complex to describe in detail here. A complete description is provided @@ -276,7 +276,7 @@

-

FILES

+

FILES

/etc/named.conf

@@ -289,7 +289,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 1033, RFC 1034, RFC 1035, @@ -302,7 +302,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.nsupdate.html b/doc/arm/man.nsupdate.html index d3d7547..9ba954b 100644 --- a/doc/arm/man.nsupdate.html +++ b/doc/arm/man.nsupdate.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

nsupdate [-d] [-D] [[-g] | [-o] | [-y [hmac:]keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-R randomdev] [-v] [filename]

-

DESCRIPTION

+

DESCRIPTION

nsupdate is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. @@ -187,7 +187,7 @@

-

INPUT FORMAT

+

INPUT FORMAT

nsupdate reads input from filename @@ -451,7 +451,7 @@

-

EXAMPLES

+

EXAMPLES

The examples below show how nsupdate @@ -505,7 +505,7 @@

-

FILES

+

FILES

/etc/resolv.conf

@@ -524,7 +524,7 @@

-

SEE ALSO

+

SEE ALSO

RFC2136, RFC3007, RFC2104, @@ -537,7 +537,7 @@

-

BUGS

+

BUGS

The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library diff --git a/doc/arm/man.rndc-confgen.html b/doc/arm/man.rndc-confgen.html index d6240a7..853b250 100644 --- a/doc/arm/man.rndc-confgen.html +++ b/doc/arm/man.rndc-confgen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -48,7 +48,7 @@

rndc-confgen [-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port] [-r randomfile] [-s address] [-t chrootdir] [-u user]

-

DESCRIPTION

+

DESCRIPTION

rndc-confgen generates configuration files for rndc. It can be used as a @@ -64,7 +64,7 @@

-

OPTIONS

+

OPTIONS

-a
@@ -171,7 +171,7 @@
-

EXAMPLES

+

EXAMPLES

To allow rndc to be used with no manual configuration, run @@ -188,7 +188,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc.conf(5), named(8), @@ -196,7 +196,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.conf.html b/doc/arm/man.rndc.conf.html index 029eff3..66dbe934 100644 --- a/doc/arm/man.rndc.conf.html +++ b/doc/arm/man.rndc.conf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc.conf

-

DESCRIPTION

+

DESCRIPTION

rndc.conf is the configuration file for rndc, the BIND 9 name server control utility. This file has a similar structure and syntax to @@ -135,7 +135,7 @@

-

EXAMPLE

+

EXAMPLE

       options {
         default-server  localhost;
@@ -209,7 +209,7 @@
     

-

NAME SERVER CONFIGURATION

+

NAME SERVER CONFIGURATION

The name server must be configured to accept rndc connections and to recognize the key specified in the rndc.conf @@ -219,7 +219,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc-confgen(8), mmencode(1), @@ -227,7 +227,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.html b/doc/arm/man.rndc.html index 8500fd3..0bb3085 100644 --- a/doc/arm/man.rndc.html +++ b/doc/arm/man.rndc.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}

-

DESCRIPTION

+

DESCRIPTION

rndc controls the operation of a name server. It supersedes the ndc utility @@ -79,7 +79,7 @@

-

OPTIONS

+

OPTIONS

-b source-address

@@ -151,7 +151,7 @@

-

LIMITATIONS

+

LIMITATIONS

rndc does not yet support all the commands of the BIND 8 ndc utility. @@ -165,7 +165,7 @@

-

SEE ALSO

+

SEE ALSO

rndc.conf(5), rndc-confgen(8), named(8), @@ -175,7 +175,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/lib/dns/api b/lib/dns/api index 1505071..4fc7eca 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 55 -LIBREVISION = 1 -LIBAGE = 0 +LIBINTERFACE = 56 +LIBREVISION = 0 +LIBAGE = 1 diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h index baff146..d435ed0 100644 --- a/lib/dns/include/dns/rdataset.h +++ b/lib/dns/include/dns/rdataset.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataset.h,v 1.65.50.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: rdataset.h,v 1.65.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ #ifndef DNS_RDATASET_H #define DNS_RDATASET_H 1 @@ -110,6 +110,9 @@ typedef struct dns_rdatasetmethods { dns_rdataset_t *rdataset, dns_rdatasetadditional_t type, dns_rdatatype_t qtype); + void (*settrust)(dns_rdataset_t *rdataset, + dns_trust_t trust); + void (*expire)(dns_rdataset_t *rdataset); } dns_rdatasetmethods_t; #define DNS_RDATASET_MAGIC ISC_MAGIC('D','N','S','R') @@ -634,6 +637,19 @@ dns_rdataset_putadditional(dns_acache_t *acache, * information for 'rdataset.' */ +void +dns_rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust); +/*%< + * Set the trust of the 'rdataset' to trust in any in the backing database. + * The local trust level of 'rdataset' is also set. + */ + +void +dns_rdataset_expire(dns_rdataset_t *rdataset); +/*%< + * Mark the rdataset to be expired in the backing database. + */ + ISC_LANG_ENDDECLS #endif /* DNS_RDATASET_H */ diff --git a/lib/dns/include/dns/resolver.h b/lib/dns/include/dns/resolver.h index fa837c1..8c7ad72 100644 --- a/lib/dns/include/dns/resolver.h +++ b/lib/dns/include/dns/resolver.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.h,v 1.60.56.3 2009/01/29 22:40:35 jinmei Exp $ */ +/* $Id: resolver.h,v 1.60.56.3.22.2 2010/02/25 10:57:12 tbox Exp $ */ #ifndef DNS_RESOLVER_H #define DNS_RESOLVER_H 1 @@ -508,6 +508,48 @@ dns_resolver_setzeronosoattl(dns_resolver_t *resolver, isc_boolean_t state); unsigned int dns_resolver_getoptions(dns_resolver_t *resolver); +void +dns_resolver_addbadcache(dns_resolver_t *resolver, dns_name_t *name, + dns_rdatatype_t type, isc_time_t *expire); +/*%< + * Add a entry to the bad cache for that will expire at 'expire'. + * + * Requires: + * \li resolver to be valid. + * \li name to be valid. + */ + +isc_boolean_t +dns_resolver_getbadcache(dns_resolver_t *resolver, dns_name_t *name, + dns_rdatatype_t type, isc_time_t *now); +/*%< + * Check to see if there is a unexpired entry in the bad cache for + * . + * + * Requires: + * \li resolver to be valid. + * \li name to be valid. + */ + +void +dns_resolver_flushbadcache(dns_resolver_t *resolver, dns_name_t *name); +/*%< + * Flush the bad cache of all entries at 'name' if 'name' is non NULL. + * Flush the entire bad cache if 'name' is NULL. + * + * Requires: + * \li resolver to be valid. + */ + +void +dns_resolver_printbadcache(dns_resolver_t *resolver, FILE *fp); +/*% + * Print out the contents of the bad cache to 'fp'. + * + * Requires: + * \li resolver to be valid. + */ + ISC_LANG_ENDDECLS #endif /* DNS_RESOLVER_H */ diff --git a/lib/dns/include/dns/result.h b/lib/dns/include/dns/result.h index ed29bcd..a1e7f53 100644 --- a/lib/dns/include/dns/result.h +++ b/lib/dns/include/dns/result.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: result.h,v 1.116 2008/09/25 04:02:39 tbox Exp $ */ +/* $Id: result.h,v 1.116.226.2 2010/02/25 10:57:12 tbox Exp $ */ #ifndef DNS_RESULT_H #define DNS_RESULT_H 1 @@ -148,8 +148,10 @@ #define DNS_R_MXISADDRESS (ISC_RESULTCLASS_DNS + 102) #define DNS_R_DUPLICATE (ISC_RESULTCLASS_DNS + 103) #define DNS_R_INVALIDNSEC3 (ISC_RESULTCLASS_DNS + 104) +#define DNS_R_NOTMASTER (ISC_RESULTCLASS_DNS + 105) +#define DNS_R_BROKENCHAIN (ISC_RESULTCLASS_DNS + 106) -#define DNS_R_NRESULTS 105 /*%< Number of results */ +#define DNS_R_NRESULTS 107 /*%< Number of results */ /* * DNS wire format rcodes. diff --git a/lib/dns/include/dns/validator.h b/lib/dns/include/dns/validator.h index 2555214..1da4e0c 100644 --- a/lib/dns/include/dns/validator.h +++ b/lib/dns/include/dns/validator.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.h,v 1.41.48.3 2009/01/18 23:25:17 marka Exp $ */ +/* $Id: validator.h,v 1.41.48.3.22.2 2010/02/25 10:57:12 tbox Exp $ */ #ifndef DNS_VALIDATOR_H #define DNS_VALIDATOR_H 1 @@ -159,6 +159,8 @@ struct dns_validator { isc_boolean_t mustbesecure; unsigned int dlvlabels; unsigned int depth; + unsigned int authcount; + unsigned int authfail; }; /*% diff --git a/lib/dns/ncache.c b/lib/dns/ncache.c index af0450b..733d138 100644 --- a/lib/dns/ncache.c +++ b/lib/dns/ncache.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.c,v 1.43 2008/09/25 04:02:38 tbox Exp $ */ +/* $Id: ncache.c,v 1.43.334.2 2010/02/25 10:57:11 tbox Exp $ */ /*! \file */ @@ -519,6 +519,8 @@ static dns_rdatasetmethods_t rdataset_methods = { NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index f841ebe..df3a5f4 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.16 2009/12/30 08:34:30 jinmei Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.16.8.3 2010/02/26 00:24:39 marka Exp $ */ /*! \file */ @@ -521,6 +521,8 @@ static void overmem_purge(dns_rbtdb_t *rbtdb, unsigned int locknum_start, static isc_result_t resign_insert(dns_rbtdb_t *rbtdb, int idx, rdatasetheader_t *newheader); static void prune_tree(isc_task_t *task, isc_event_t *event); +static void rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust); +static void rdataset_expire(dns_rdataset_t *rdataset); static dns_rdatasetmethods_t rdataset_methods = { rdataset_disassociate, @@ -535,7 +537,9 @@ static dns_rdatasetmethods_t rdataset_methods = { rdataset_getclosest, rdataset_getadditional, rdataset_setadditional, - rdataset_putadditional + rdataset_putadditional, + rdataset_settrust, + rdataset_expire }; static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp); @@ -7407,6 +7411,34 @@ rdataset_getclosest(dns_rdataset_t *rdataset, dns_name_t *name, return (ISC_R_SUCCESS); } +static void +rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) { + dns_rbtdb_t *rbtdb = rdataset->private1; + dns_rbtnode_t *rbtnode = rdataset->private2; + rdatasetheader_t *header = rdataset->private3; + + header--; + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + header->trust = rdataset->trust = trust; + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); +} + +static void +rdataset_expire(dns_rdataset_t *rdataset) { + dns_rbtdb_t *rbtdb = rdataset->private1; + dns_rbtnode_t *rbtnode = rdataset->private2; + rdatasetheader_t *header = rdataset->private3; + + header--; + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + expire_header(rbtdb, header, ISC_FALSE); + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); +} + /* * Rdataset Iterator Methods */ diff --git a/lib/dns/rdatalist.c b/lib/dns/rdatalist.c index d6f11ae..d072619 100644 --- a/lib/dns/rdatalist.c +++ b/lib/dns/rdatalist.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdatalist.c,v 1.36 2008/09/24 02:46:22 marka Exp $ */ +/* $Id: rdatalist.c,v 1.36.336.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -46,6 +46,8 @@ static dns_rdatasetmethods_t methods = { isc__rdatalist_getclosest, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index 6088a06..946ec9a 100644 --- a/lib/dns/rdataset.c +++ b/lib/dns/rdataset.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataset.c,v 1.82.50.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: rdataset.c,v 1.82.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -182,6 +182,8 @@ static dns_rdatasetmethods_t question_methods = { NULL, NULL, NULL, + NULL, + NULL, NULL }; @@ -732,3 +734,22 @@ dns_rdataset_putadditional(dns_acache_t *acache, return (ISC_R_FAILURE); } +void +dns_rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) { + REQUIRE(DNS_RDATASET_VALID(rdataset)); + REQUIRE(rdataset->methods != NULL); + + if (rdataset->methods->settrust != NULL) + (rdataset->methods->settrust)(rdataset, trust); + else + rdataset->trust = trust; +} + +void +dns_rdataset_expire(dns_rdataset_t *rdataset) { + REQUIRE(DNS_RDATASET_VALID(rdataset)); + REQUIRE(rdataset->methods != NULL); + + if (rdataset->methods->expire != NULL) + (rdataset->methods->expire)(rdataset); +} diff --git a/lib/dns/rdataslab.c b/lib/dns/rdataslab.c index b22868d..4eadff9 100644 --- a/lib/dns/rdataslab.c +++ b/lib/dns/rdataslab.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataslab.c,v 1.48.50.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: rdataslab.c,v 1.48.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -436,6 +436,8 @@ static dns_rdatasetmethods_t rdataset_methods = { NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 02e96cd..244718f 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.384.14.20 2010/01/07 23:47:36 tbox Exp $ */ +/* $Id: resolver.c,v 1.384.14.20.8.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -334,6 +334,18 @@ typedef struct alternate { ISC_LINK(struct alternate) link; } alternate_t; +typedef struct dns_badcache dns_badcache_t; +struct dns_badcache { + dns_badcache_t * next; + dns_rdatatype_t type; + isc_time_t expire; + unsigned int hashval; + dns_name_t name; +}; +#define DNS_BADCACHE_SIZE 1021 +#define DNS_BADCACHE_TTL(fctx) \ + (((fctx)->res->lame_ttl > 30 ) ? (fctx)->res->lame_ttl : 30) + struct dns_resolver { /* Unlocked. */ unsigned int magic; @@ -380,6 +392,13 @@ struct dns_resolver { isc_boolean_t priming; unsigned int spillat; /* clients-per-query */ unsigned int nextdisp; + + /* Bad cache. */ + dns_badcache_t ** badcache; + unsigned int badcount; + unsigned int badhash; + unsigned int badsweep; + /* Locked by primelock. */ dns_fetch_t * primefetch; /* Locked by nlock. */ @@ -410,7 +429,8 @@ static void empty_bucket(dns_resolver_t *res); static isc_result_t resquery_send(resquery_t *query); static void resquery_response(isc_task_t *task, isc_event_t *event); static void resquery_connected(isc_task_t *task, isc_event_t *event); -static void fctx_try(fetchctx_t *fctx, isc_boolean_t retrying); +static void fctx_try(fetchctx_t *fctx, isc_boolean_t retrying, + isc_boolean_t badcache); static isc_boolean_t fctx_destroy(fetchctx_t *fctx); static isc_result_t ncache_adderesult(dns_message_t *message, dns_db_t *cache, dns_dbnode_t *node, @@ -1169,7 +1189,7 @@ process_sendevent(resquery_t *query, isc_event_t *event) { if (result != ISC_R_SUCCESS) fctx_done(fctx, result, __LINE__); else - fctx_try(fctx, ISC_TRUE); + fctx_try(fctx, ISC_TRUE, ISC_FALSE); } } @@ -2071,7 +2091,7 @@ resquery_connected(isc_task_t *task, isc_event_t *event) { if (result != ISC_R_SUCCESS) fctx_done(fctx, result, __LINE__); else - fctx_try(fctx, ISC_TRUE); + fctx_try(fctx, ISC_TRUE, ISC_FALSE); } } @@ -2133,7 +2153,7 @@ fctx_finddone(isc_task_t *task, isc_event_t *event) { dns_adb_destroyfind(&find); if (want_try) - fctx_try(fctx, ISC_TRUE); + fctx_try(fctx, ISC_TRUE, ISC_FALSE); else if (want_done) fctx_done(fctx, ISC_R_FAILURE, __LINE__); else if (bucket_empty) @@ -2545,7 +2565,7 @@ isstrictsubdomain(dns_name_t *name1, dns_name_t *name2) { } static isc_result_t -fctx_getaddresses(fetchctx_t *fctx) { +fctx_getaddresses(fetchctx_t *fctx, isc_boolean_t badcache) { dns_rdata_t rdata = DNS_RDATA_INIT; isc_result_t result; dns_resolver_t *res; @@ -2764,12 +2784,24 @@ fctx_getaddresses(fetchctx_t *fctx) { */ result = DNS_R_WAIT; } else { + isc_time_t expire; + isc_interval_t i; /* * We've lost completely. We don't know any * addresses, and the ADB has told us it can't get * them. */ FCTXTRACE("no addresses"); + isc_interval_set(&i, DNS_BADCACHE_TTL(fctx), 0); + result = isc_time_nowplusinterval(&expire, &i); + if (badcache && + (fctx->type == dns_rdatatype_dnskey || + fctx->type == dns_rdatatype_dlv || + fctx->type == dns_rdatatype_ds) && + result == ISC_R_SUCCESS) + dns_resolver_addbadcache(fctx->res, + &fctx->name, + fctx->type, &expire); result = ISC_R_FAILURE; } } else { @@ -2992,7 +3024,7 @@ fctx_nextaddress(fetchctx_t *fctx) { } static void -fctx_try(fetchctx_t *fctx, isc_boolean_t retrying) { +fctx_try(fetchctx_t *fctx, isc_boolean_t retrying, isc_boolean_t badcache) { isc_result_t result; dns_adbaddrinfo_t *addrinfo; @@ -3010,7 +3042,7 @@ fctx_try(fetchctx_t *fctx, isc_boolean_t retrying) { fctx_cleanupaltfinds(fctx); fctx_cleanupforwaddrs(fctx); fctx_cleanupaltaddrs(fctx); - result = fctx_getaddresses(fctx); + result = fctx_getaddresses(fctx, badcache); if (result == DNS_R_WAIT) { /* * Sleep waiting for addresses. @@ -3175,7 +3207,7 @@ fctx_timeout(isc_task_t *task, isc_event_t *event) { /* * Keep trying. */ - fctx_try(fctx, ISC_TRUE); + fctx_try(fctx, ISC_TRUE, ISC_FALSE); } isc_event_free(&event); @@ -3345,7 +3377,7 @@ fctx_start(isc_task_t *task, isc_event_t *event) { if (result != ISC_R_SUCCESS) fctx_done(fctx, result, __LINE__); else - fctx_try(fctx, ISC_FALSE); + fctx_try(fctx, ISC_FALSE, ISC_FALSE); } else if (bucket_empty) empty_bucket(res); } @@ -3923,6 +3955,8 @@ validated(isc_task_t *task, isc_event_t *event) { LOCK(&fctx->res->buckets[fctx->bucketnum].lock); + isc_stdtime_get(&now); + /* * If chaining, we need to make sure that the right result code is * returned, and that the rdatasets are bound. @@ -3969,35 +4003,80 @@ validated(isc_task_t *task, isc_event_t *event) { inc_stats(fctx->res, dns_resstatscounter_valfail); fctx->valfail++; fctx->vresult = vevent->result; - result = ISC_R_NOTFOUND; - if (vevent->rdataset != NULL) - result = dns_db_findnode(fctx->cache, vevent->name, - ISC_TRUE, &node); - if (result == ISC_R_SUCCESS) - (void)dns_db_deleterdataset(fctx->cache, node, NULL, - vevent->type, 0); - if (result == ISC_R_SUCCESS && vevent->sigrdataset != NULL) - (void)dns_db_deleterdataset(fctx->cache, node, NULL, - dns_rdatatype_rrsig, - vevent->type); - if (result == ISC_R_SUCCESS) - dns_db_detachnode(fctx->cache, &node); - result = vevent->result; + if (fctx->vresult != DNS_R_BROKENCHAIN) { + result = ISC_R_NOTFOUND; + if (vevent->rdataset != NULL) + result = dns_db_findnode(fctx->cache, + vevent->name, + ISC_TRUE, &node); + if (result == ISC_R_SUCCESS) + (void)dns_db_deleterdataset(fctx->cache, node, + NULL, + vevent->type, 0); + if (result == ISC_R_SUCCESS && + vevent->sigrdataset != NULL) + (void)dns_db_deleterdataset(fctx->cache, node, + NULL, + dns_rdatatype_rrsig, + vevent->type); + if (result == ISC_R_SUCCESS) + dns_db_detachnode(fctx->cache, &node); + } + if (fctx->vresult == DNS_R_BROKENCHAIN && !negative) { + /* + * Cache the data as pending for later validation. + */ + result = ISC_R_NOTFOUND; + if (vevent->rdataset != NULL) + result = dns_db_findnode(fctx->cache, + vevent->name, + ISC_TRUE, &node); + if (result == ISC_R_SUCCESS) { + (void)dns_db_addrdataset(fctx->cache, node, + NULL, now, + vevent->rdataset, 0, + NULL); + } + if (result == ISC_R_SUCCESS && + vevent->sigrdataset != NULL) + (void)dns_db_addrdataset(fctx->cache, node, + NULL, now, + vevent->sigrdataset, + 0, NULL); + if (result == ISC_R_SUCCESS) + dns_db_detachnode(fctx->cache, &node); + } + result = fctx->vresult; add_bad(fctx, addrinfo, result, badns_validation); isc_event_free(&event); UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock); INSIST(fctx->validator == NULL); fctx->validator = ISC_LIST_HEAD(fctx->validators); - if (fctx->validator != NULL) { + if (fctx->validator != NULL) dns_validator_send(fctx->validator); - } else if (sentresponse) + else if (sentresponse) fctx_done(fctx, result, __LINE__); /* Locks bucket. */ - else - fctx_try(fctx, ISC_TRUE); /* Locks bucket. */ + else if (result == DNS_R_BROKENCHAIN) { + isc_result_t tresult; + isc_time_t expire; + isc_interval_t i; + + isc_interval_set(&i, DNS_BADCACHE_TTL(fctx), 0); + tresult = isc_time_nowplusinterval(&expire, &i); + if (negative && + (fctx->type == dns_rdatatype_dnskey || + fctx->type == dns_rdatatype_dlv || + fctx->type == dns_rdatatype_ds) && + tresult == ISC_R_SUCCESS) + dns_resolver_addbadcache(fctx->res, + &fctx->name, + fctx->type, &expire); + fctx_done(fctx, result, __LINE__); /* Locks bucket. */ + } else + fctx_try(fctx, ISC_TRUE, ISC_TRUE); /* Locks bucket. */ return; } - isc_stdtime_get(&now); if (negative) { dns_rdatatype_t covers; @@ -5790,7 +5869,7 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) { /* * Try again. */ - fctx_try(fctx, ISC_TRUE); + fctx_try(fctx, ISC_TRUE, ISC_FALSE); } else { unsigned int n; dns_rdataset_t *nsrdataset = NULL; @@ -6629,7 +6708,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) { /* * Try again. */ - fctx_try(fctx, !get_nameservers); + fctx_try(fctx, !get_nameservers, ISC_FALSE); } else if (resend) { /* * Resend (probably with changed options). @@ -6691,6 +6770,27 @@ resquery_response(isc_task_t *task, isc_event_t *event) { /*** *** Resolver Methods ***/ +static void +destroy_badcache(dns_resolver_t *res) { + dns_badcache_t *bad, *next; + unsigned int i; + + if (res->badcache != NULL) { + for (i = 0; i < res->badhash; i++) + for (bad = res->badcache[i]; bad != NULL; + bad = next) { + next = bad->next; + isc_mem_put(res->mctx, bad, sizeof(*bad) + + bad->name.length); + res->badcount--; + } + isc_mem_put(res->mctx, res->badcache, + sizeof(*res->badcache) * res->badhash); + res->badcache = NULL; + res->badhash = 0; + INSIST(res->badcount == 0); + } +} static void destroy(dns_resolver_t *res) { @@ -6728,6 +6828,7 @@ destroy(dns_resolver_t *res) { isc_mem_put(res->mctx, a, sizeof(*a)); } dns_resolver_reset_algorithms(res); + destroy_badcache(res); dns_resolver_resetmustbesecure(res); #if USE_ALGLOCK isc_rwlock_destroy(&res->alglock); @@ -6851,6 +6952,10 @@ dns_resolver_create(dns_view_t *view, ISC_LIST_INIT(res->alternates); res->udpsize = RECV_BUFFER_SIZE; res->algorithms = NULL; + res->badcache = NULL; + res->badcount = 0; + res->badhash = 0; + res->badsweep = 0; res->mustbesecure = NULL; res->spillatmin = res->spillat = 10; res->spillatmax = 100; @@ -7692,6 +7797,256 @@ dns_resolver_getudpsize(dns_resolver_t *resolver) { return (resolver->udpsize); } +void +dns_resolver_flushbadcache(dns_resolver_t *resolver, dns_name_t *name) { + unsigned int i; + dns_badcache_t *bad, *prev, *next; + + REQUIRE(VALID_RESOLVER(resolver)); + + LOCK(&resolver->lock); + if (resolver->badcache == NULL) + goto unlock; + + if (name != NULL) { + isc_time_t now; + isc_result_t result; + result = isc_time_now(&now); + if (result != ISC_R_SUCCESS) + isc_time_settoepoch(&now); + i = dns_name_hash(name, ISC_FALSE) % resolver->badhash; + prev = NULL; + for (bad = resolver->badcache[i]; bad != NULL; bad = next) { + int n; + next = bad->next; + n = isc_time_compare(&bad->expire, &now); + if (n < 0 || dns_name_equal(name, &bad->name)) { + if (prev == NULL) + resolver->badcache[i] = bad->next; + else + prev->next = bad->next; + isc_mem_put(resolver->mctx, bad, sizeof(*bad) + + bad->name.length); + resolver->badcount--; + } else + prev = bad; + } + } else + destroy_badcache(resolver); + + unlock: + UNLOCK(&resolver->lock); + +} + +static void +resizehash(dns_resolver_t *resolver, isc_time_t *now, isc_boolean_t grow) { + unsigned int newsize; + dns_badcache_t **new, *bad, *next; + unsigned int i; + + if (grow) + newsize = resolver->badhash * 2 + 1; + else + newsize = (resolver->badhash - 1) / 2; + + new = isc_mem_get(resolver->mctx, + sizeof(*resolver->badcache) * newsize); + if (new == NULL) + return; + memset(new, 0, sizeof(*resolver->badcache) * newsize); + for (i = 0; i < resolver->badhash; i++) { + for (bad = resolver->badcache[i]; bad != NULL; bad = next) { + next = bad->next; + if (isc_time_compare(&bad->expire, now) < 0) { + isc_mem_put(resolver->mctx, bad, sizeof(*bad) + + bad->name.length); + resolver->badcount--; + } else { + bad->next = new[bad->hashval % newsize]; + new[bad->hashval % newsize] = bad; + } + } + } + isc_mem_put(resolver->mctx, resolver->badcache, + sizeof(*resolver->badcache) * resolver->badhash); + resolver->badhash = newsize; + resolver->badcache = new; +} + +void +dns_resolver_addbadcache(dns_resolver_t *resolver, dns_name_t *name, + dns_rdatatype_t type, isc_time_t *expire) +{ + isc_time_t now; + isc_result_t result = ISC_R_SUCCESS; + unsigned int i, hashval; + dns_badcache_t *bad, *prev, *next; + + REQUIRE(VALID_RESOLVER(resolver)); + + LOCK(&resolver->lock); + if (resolver->badcache == NULL) { + resolver->badcache = isc_mem_get(resolver->mctx, + sizeof(*resolver->badcache) * + DNS_BADCACHE_SIZE); + if (resolver->badcache == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + resolver->badhash = DNS_BADCACHE_SIZE; + memset(resolver->badcache, 0, sizeof(*resolver->badcache) * + resolver->badhash); + } + + result = isc_time_now(&now); + if (result != ISC_R_SUCCESS) + isc_time_settoepoch(&now); + hashval = dns_name_hash(name, ISC_FALSE); + i = hashval % resolver->badhash; + prev = NULL; + for (bad = resolver->badcache[i]; bad != NULL; bad = next) { + next = bad->next; + if (bad->type == type && dns_name_equal(name, &bad->name)) + break; + if (isc_time_compare(&bad->expire, &now) < 0) { + if (prev == NULL) + resolver->badcache[i] = bad->next; + else + prev->next = bad->next; + isc_mem_put(resolver->mctx, bad, sizeof(*bad) + + bad->name.length); + resolver->badcount--; + } else + prev = bad; + } + if (bad == NULL) { + isc_buffer_t buffer; + bad = isc_mem_get(resolver->mctx, sizeof(*bad) + name->length); + if (bad == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + bad->type = type; + bad->hashval = hashval; + isc_buffer_init(&buffer, bad + 1, name->length); + dns_name_init(&bad->name, NULL); + dns_name_copy(name, &bad->name, &buffer); + bad->next = resolver->badcache[i]; + resolver->badcache[i] = bad; + resolver->badcount++; + if (resolver->badcount > resolver->badhash * 8) + resizehash(resolver, &now, ISC_TRUE); + if (resolver->badcount < resolver->badhash * 2 && + resolver->badhash > DNS_BADCACHE_SIZE) + resizehash(resolver, &now, ISC_FALSE); + } + bad->expire = *expire; + cleanup: + UNLOCK(&resolver->lock); +} + +isc_boolean_t +dns_resolver_getbadcache(dns_resolver_t *resolver, dns_name_t *name, + dns_rdatatype_t type, isc_time_t *now) +{ + dns_badcache_t *bad, *prev, *next; + isc_boolean_t answer = ISC_FALSE; + unsigned int i; + + REQUIRE(VALID_RESOLVER(resolver)); + + LOCK(&resolver->lock); + if (resolver->badcache == NULL) + goto unlock; + + i = dns_name_hash(name, ISC_FALSE) % resolver->badhash; + prev = NULL; + for (bad = resolver->badcache[i]; bad != NULL; bad = next) { + next = bad->next; + /* + * Search the hash list. Clean out expired records as we go. + */ + if (isc_time_compare(&bad->expire, now) < 0) { + if (prev != NULL) + prev->next = bad->next; + else + resolver->badcache[i] = bad->next; + isc_mem_put(resolver->mctx, bad, sizeof(*bad) + + bad->name.length); + resolver->badcount--; + continue; + } + if (bad->type == type && dns_name_equal(name, &bad->name)) { + answer = ISC_TRUE; + break; + } + prev = bad; + } + + /* + * Slow sweep to clean out stale records. + */ + i = resolver->badsweep++ % resolver->badhash; + bad = resolver->badcache[i]; + if (bad != NULL && isc_time_compare(&bad->expire, now) < 0) { + resolver->badcache[i] = bad->next; + isc_mem_put(resolver->mctx, bad, sizeof(*bad) + + bad->name.length); + resolver->badcount--; + } + + unlock: + UNLOCK(&resolver->lock); + return (answer); +} + +void +dns_resolver_printbadcache(dns_resolver_t *resolver, FILE *fp) { + char namebuf[DNS_NAME_FORMATSIZE]; + char typebuf[DNS_RDATATYPE_FORMATSIZE]; + dns_badcache_t *bad, *next, *prev; + isc_time_t now; + unsigned int i; + isc_uint64_t t; + + LOCK(&resolver->lock); + fprintf(fp, ";\n; Bad cache\n;\n"); + + if (resolver->badcache == NULL) + goto unlock; + + TIME_NOW(&now); + for (i = 0; i < resolver->badhash; i++) { + prev = NULL; + for (bad = resolver->badcache[i]; bad != NULL; bad = next) { + next = bad->next; + if (isc_time_compare(&bad->expire, &now) < 0) { + if (prev != NULL) + prev->next = bad->next; + else + resolver->badcache[i] = bad->next; + isc_mem_put(resolver->mctx, bad, sizeof(*bad) + + bad->name.length); + resolver->badcount--; + continue; + } + prev = bad; + dns_name_format(&bad->name, namebuf, sizeof(namebuf)); + dns_rdatatype_format(bad->type, typebuf, + sizeof(typebuf)); + t = isc_time_microdiff(&bad->expire, &now); + t /= 1000; + fprintf(fp, "; %s/%s [ttl " + "%" ISC_PLATFORM_QUADFORMAT "u]\n", + namebuf, typebuf, t); + } + } + + unlock: + UNLOCK(&resolver->lock); +} + static void free_algorithm(void *node, void *arg) { unsigned char *algorithms = node; diff --git a/lib/dns/result.c b/lib/dns/result.c index 54c70e0..e336197 100644 --- a/lib/dns/result.c +++ b/lib/dns/result.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: result.c,v 1.125 2008/09/25 04:02:38 tbox Exp $ */ +/* $Id: result.c,v 1.125.122.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -157,6 +157,9 @@ static const char *text[DNS_R_NRESULTS] = { "MX is an address", /*%< 102 DNS_R_MXISADDRESS */ "duplicate query", /*%< 103 DNS_R_DUPLICATE */ "invalid NSEC3 owner name (wildcard)", /*%< 104 DNS_R_INVALIDNSEC3 */ + + "not master", /*%< 105 DNS_R_NOTMASTER */ + "broken trust chain", /*%< 106 DNS_R_BROKENCHAIN */ }; static const char *rcode_text[DNS_R_NRCODERESULTS] = { diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c index ab9ff19..e0c8786 100644 --- a/lib/dns/sdb.c +++ b/lib/dns/sdb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.c,v 1.66.48.3 2009/06/26 06:25:44 marka Exp $ */ +/* $Id: sdb.c,v 1.66.48.3.8.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -1387,6 +1387,8 @@ static dns_rdatasetmethods_t methods = { NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/lib/dns/sdlz.c b/lib/dns/sdlz.c index 5e5f7e3..caf71b5 100644 --- a/lib/dns/sdlz.c +++ b/lib/dns/sdlz.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2005-2009 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2005-2010 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdlz.c,v 1.18.50.3 2009/06/26 06:25:44 marka Exp $ */ +/* $Id: sdlz.c,v 1.18.50.3.8.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -1211,6 +1211,8 @@ static dns_rdatasetmethods_t rdataset_methods = { NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 1e55a34..0ccdc41 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.11 2009/12/30 06:44:44 each Exp $ */ +/* $Id: validator.c,v 1.164.12.11.8.2 2010/02/25 10:57:12 tbox Exp $ */ #include @@ -177,9 +177,16 @@ static inline void markanswer(dns_validator_t *val) { validator_log(val, ISC_LOG_DEBUG(3), "marking as answer"); if (val->event->rdataset != NULL) - val->event->rdataset->trust = dns_trust_answer; + dns_rdataset_settrust(val->event->rdataset, dns_trust_answer); if (val->event->sigrdataset != NULL) - val->event->sigrdataset->trust = dns_trust_answer; + dns_rdataset_settrust(val->event->sigrdataset, + dns_trust_answer); +} + +static inline void +marksecure(dns_validatorevent_t *event) { + dns_rdataset_settrust(event->rdataset, dns_trust_secure); + dns_rdataset_settrust(event->sigrdataset, dns_trust_secure); } static void @@ -425,7 +432,7 @@ fetch_callback_validator(isc_task_t *task, isc_event_t *event) { if (eresult == ISC_R_CANCELED) validator_done(val, eresult); else - validator_done(val, DNS_R_NOVALIDKEY); + validator_done(val, DNS_R_BROKENCHAIN); } want_destroy = exit_check(val); UNLOCK(&val->lock); @@ -495,7 +502,7 @@ dsfetched(isc_task_t *task, isc_event_t *event) { if (eresult == ISC_R_CANCELED) validator_done(val, eresult); else - validator_done(val, DNS_R_NOVALIDDS); + validator_done(val, DNS_R_BROKENCHAIN); } want_destroy = exit_check(val); UNLOCK(&val->lock); @@ -635,10 +642,16 @@ keyvalidated(isc_task_t *task, isc_event_t *event) { if (result != DNS_R_WAIT) validator_done(val, result); } else { + if (eresult != DNS_R_BROKENCHAIN) { + if (dns_rdataset_isassociated(&val->frdataset)) + dns_rdataset_expire(&val->frdataset); + if (dns_rdataset_isassociated(&val->fsigrdataset)) + dns_rdataset_expire(&val->fsigrdataset); + } validator_log(val, ISC_LOG_DEBUG(3), "keyvalidated: got %s", isc_result_totext(eresult)); - validator_done(val, eresult); + validator_done(val, DNS_R_BROKENCHAIN); } want_destroy = exit_check(val); UNLOCK(&val->lock); @@ -685,10 +698,16 @@ dsvalidated(isc_task_t *task, isc_event_t *event) { if (result != DNS_R_WAIT) validator_done(val, result); } else { + if (eresult != DNS_R_BROKENCHAIN) { + if (dns_rdataset_isassociated(&val->frdataset)) + dns_rdataset_expire(&val->frdataset); + if (dns_rdataset_isassociated(&val->fsigrdataset)) + dns_rdataset_expire(&val->fsigrdataset); + } validator_log(val, ISC_LOG_DEBUG(3), "dsvalidated: got %s", isc_result_totext(eresult)); - validator_done(val, eresult); + validator_done(val, DNS_R_BROKENCHAIN); } want_destroy = exit_check(val); UNLOCK(&val->lock); @@ -1199,6 +1218,8 @@ authvalidated(isc_task_t *task, isc_event_t *event) { validator_log(val, ISC_LOG_DEBUG(3), "authvalidated: got %s", isc_result_totext(result)); + if (result == DNS_R_BROKENCHAIN) + val->authfail++; if (result == ISC_R_CANCELED) validator_done(val, result); else { @@ -1271,6 +1292,7 @@ authvalidated(isc_task_t *task, isc_event_t *event) { * \li DNS_R_NCACHENXRRSET * \li DNS_R_NXRRSET * \li DNS_R_NXDOMAIN + * \li DNS_R_BROKENCHAIN */ static inline isc_result_t view_find(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type) { @@ -1280,9 +1302,12 @@ view_find(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type) { dns_rdata_t rdata = DNS_RDATA_INIT; isc_result_t result; unsigned int options; + isc_time_t now; char buf1[DNS_NAME_FORMATSIZE]; char buf2[DNS_NAME_FORMATSIZE]; char buf3[DNS_NAME_FORMATSIZE]; + char namebuf[DNS_NAME_FORMATSIZE]; + char typebuf[DNS_RDATATYPE_FORMATSIZE]; if (dns_rdataset_isassociated(&val->frdataset)) dns_rdataset_disassociate(&val->frdataset); @@ -1292,6 +1317,16 @@ view_find(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type) { if (val->view->zonetable == NULL) return (ISC_R_CANCELED); + if (isc_time_now(&now) == ISC_R_SUCCESS && + dns_resolver_getbadcache(val->view->resolver, name, type, &now)) { + + dns_name_format(name, namebuf, sizeof(namebuf)); + dns_rdatatype_format(type, typebuf, sizeof(typebuf)); + validator_log(val, ISC_LOG_INFO, "bad cache hit (%s/%s)", + namebuf, typebuf); + return (DNS_R_BROKENCHAIN); + } + options = DNS_DBFIND_PENDINGOK; if (type == dns_rdatatype_dlv) options |= DNS_DBFIND_COVERINGNSEC; @@ -1300,6 +1335,7 @@ view_find(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type) { result = dns_view_find(val->view, name, type, 0, options, ISC_FALSE, NULL, NULL, foundname, &val->frdataset, &val->fsigrdataset); + if (result == DNS_R_NXDOMAIN) { if (dns_rdataset_isassociated(&val->frdataset)) dns_rdataset_disassociate(&val->frdataset); @@ -1656,7 +1692,8 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { /* * We don't know anything about this key. */ - result = create_fetch(val, &siginfo->signer, dns_rdatatype_dnskey, + result = create_fetch(val, &siginfo->signer, + dns_rdatatype_dnskey, fetch_callback_validator, "get_key"); if (result != ISC_R_SUCCESS) return (result); @@ -1671,7 +1708,8 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { * This key doesn't exist. */ result = DNS_R_CONTINUE; - } + } else if (result == DNS_R_BROKENCHAIN) + return (result); if (dns_rdataset_isassociated(&val->frdataset) && val->keyset != &val->frdataset) @@ -1919,8 +1957,7 @@ validate(dns_validator_t *val, isc_boolean_t resume) { "looking for noqname proof"); return (nsecvalidate(val, ISC_FALSE)); } else if (result == ISC_R_SUCCESS) { - event->rdataset->trust = dns_trust_secure; - event->sigrdataset->trust = dns_trust_secure; + marksecure(event); validator_log(val, ISC_LOG_DEBUG(3), "marking as secure"); return (result); @@ -2096,8 +2133,7 @@ dlv_validatezonekey(dns_validator_t *val) { "no RRSIG matching DLV key"); } if (result == ISC_R_SUCCESS) { - val->event->rdataset->trust = dns_trust_secure; - val->event->sigrdataset->trust = dns_trust_secure; + marksecure(val->event); validator_log(val, ISC_LOG_DEBUG(3), "marking as secure"); return (result); } else if (result == ISC_R_NOMORE && !supported_algorithm) { @@ -2198,8 +2234,7 @@ validatezonekey(dns_validator_t *val) { keynode = nextnode; } if (result == ISC_R_SUCCESS) { - event->rdataset->trust = dns_trust_secure; - event->sigrdataset->trust = dns_trust_secure; + marksecure(event); validator_log(val, ISC_LOG_DEBUG(3), "signed by trusted key; " "marking as secure"); @@ -2226,11 +2261,14 @@ validatezonekey(dns_validator_t *val) { */ dns_name_format(val->event->name, namebuf, sizeof(namebuf)); - validator_log(val, ISC_LOG_DEBUG(2), + validator_log(val, ISC_LOG_NOTICE, "unable to find a DNSKEY which verifies " "the DNSKEY RRset and also matches one " "of specified trusted-keys for '%s'", namebuf); + validator_log(val, ISC_LOG_NOTICE, + "please check the 'trusted-keys' for " + "'%s' in named.conf.", namebuf); return (DNS_R_NOVALIDKEY); } @@ -2291,7 +2329,8 @@ validatezonekey(dns_validator_t *val) { dns_rdataset_disassociate(&val->fsigrdataset); validator_log(val, ISC_LOG_DEBUG(2), "no DS record"); return (DNS_R_NOVALIDSIG); - } + } else if (result == DNS_R_BROKENCHAIN) + return (result); } /* @@ -2440,8 +2479,7 @@ validatezonekey(dns_validator_t *val) { "no RRSIG matching DS key"); } if (result == ISC_R_SUCCESS) { - event->rdataset->trust = dns_trust_secure; - event->sigrdataset->trust = dns_trust_secure; + marksecure(event); validator_log(val, ISC_LOG_DEBUG(3), "marking as secure"); return (result); } else if (result == ISC_R_NOMORE && !supported_algorithm) { @@ -2844,6 +2882,7 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { "nsecvalidate"); if (result != ISC_R_SUCCESS) return (result); + val->authcount++; return (DNS_R_WAIT); } @@ -2868,8 +2907,7 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { "noqname proof found"); validator_log(val, ISC_LOG_DEBUG(3), "marking as secure"); - val->event->rdataset->trust = dns_trust_secure; - val->event->sigrdataset->trust = dns_trust_secure; + marksecure(val->event); return (ISC_R_SUCCESS); } else if ((val->attributes & VALATTR_FOUNDOPTOUT) != 0 && dns_name_countlabels(dns_fixedname_name(&val->wild)) @@ -2923,6 +2961,8 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { } findnsec3proofs(val); + if (val->authcount == val->authfail) + return (DNS_R_BROKENCHAIN); validator_log(val, ISC_LOG_DEBUG(3), "nonexistence proof(s) not found"); val->attributes |= VALATTR_INSECURITY; @@ -2954,6 +2994,58 @@ check_ds(dns_validator_t *val, dns_name_t *name, dns_rdataset_t *rdataset) { return (ISC_FALSE); } +static void +dlvvalidated(isc_task_t *task, isc_event_t *event) { + dns_validatorevent_t *devent; + dns_validator_t *val; + isc_result_t eresult; + isc_boolean_t want_destroy; + + UNUSED(task); + INSIST(event->ev_type == DNS_EVENT_VALIDATORDONE); + + devent = (dns_validatorevent_t *)event; + val = devent->ev_arg; + eresult = devent->result; + + isc_event_free(&event); + dns_validator_destroy(&val->subvalidator); + + INSIST(val->event != NULL); + + validator_log(val, ISC_LOG_DEBUG(3), "in dlvvalidated"); + LOCK(&val->lock); + if (CANCELED(val)) { + validator_done(val, ISC_R_CANCELED); + } else if (eresult == ISC_R_SUCCESS) { + validator_log(val, ISC_LOG_DEBUG(3), + "dlvset with trust %d", val->frdataset.trust); + dns_rdataset_clone(&val->frdataset, &val->dlv); + val->havedlvsep = ISC_TRUE; + if (dlv_algorithm_supported(val)) + dlv_validator_start(val); + else { + markanswer(val); + validator_done(val, ISC_R_SUCCESS); + } + } else { + if (eresult != DNS_R_BROKENCHAIN) { + if (dns_rdataset_isassociated(&val->frdataset)) + dns_rdataset_expire(&val->frdataset); + if (dns_rdataset_isassociated(&val->fsigrdataset)) + dns_rdataset_expire(&val->fsigrdataset); + } + validator_log(val, ISC_LOG_DEBUG(3), + "dlvvalidated: got %s", + isc_result_totext(eresult)); + validator_done(val, DNS_R_BROKENCHAIN); + } + want_destroy = exit_check(val); + UNLOCK(&val->lock); + if (want_destroy) + destroy(val); +} + /*% * Callback from fetching a DLV record. * @@ -3173,6 +3265,24 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) { namebuf); result = view_find(val, dlvname, dns_rdatatype_dlv); if (result == ISC_R_SUCCESS) { + if (DNS_TRUST_PENDING(val->frdataset.trust) && + dns_rdataset_isassociated(&val->fsigrdataset)) + { + dns_fixedname_init(&val->fname); + dns_name_copy(dlvname, + dns_fixedname_name(&val->fname), + NULL); + result = create_validator(val, + dns_fixedname_name(&val->fname), + dns_rdatatype_dlv, + &val->frdataset, + &val->fsigrdataset, + dlvvalidated, + "finddlvsep"); + if (result != ISC_R_SUCCESS) + return (result); + return (DNS_R_WAIT); + } if (val->frdataset.trust < dns_trust_secure) return (DNS_R_NOVALIDSIG); val->havedlvsep = ISC_TRUE; @@ -3223,6 +3333,7 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) { * \li DNS_R_NOVALIDSIG * \li DNS_R_NOVALIDNSEC * \li DNS_R_NOTINSECURE + * \li DNS_R_BROKENCHAIN */ static isc_result_t proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) @@ -3465,7 +3576,8 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) if (result != ISC_R_SUCCESS) goto out; return (DNS_R_WAIT); - } + } else if (result == DNS_R_BROKENCHAIN) + return (result); } /* @@ -3682,6 +3794,8 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type, val->seensig = ISC_FALSE; val->havedlvsep = ISC_FALSE; val->depth = 0; + val->authcount = 0; + val->authfail = 0; val->mustbesecure = dns_resolver_getmustbesecure(view->resolver, name); dns_rdataset_init(&val->frdataset); dns_rdataset_init(&val->fsigrdataset); diff --git a/lib/dns/view.c b/lib/dns/view.c index 961268e..72163b4 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.150.84.3 2009/11/12 23:39:23 marka Exp $ */ +/* $Id: view.c,v 1.150.84.3.8.2 2010/02/25 10:57:12 tbox Exp $ */ /*! \file */ @@ -1271,10 +1271,11 @@ dns_view_dumpdbtostream(dns_view_t *view, FILE *fp) { (void)fprintf(fp, ";\n; Cache dump of view '%s'\n;\n", view->name); result = dns_master_dumptostream(view->mctx, view->cachedb, NULL, - &dns_master_style_cache, fp); + &dns_master_style_cache, fp); if (result != ISC_R_SUCCESS) return (result); dns_adb_dump(view->adb, fp); + dns_resolver_printbadcache(view->resolver, fp); return (ISC_R_SUCCESS); } @@ -1295,6 +1296,8 @@ dns_view_flushcache(dns_view_t *view) { dns_cache_attachdb(view->cache, &view->cachedb); if (view->acache != NULL) dns_acache_setdb(view->acache, view->cachedb); + if (view->resolver != NULL) + dns_resolver_flushbadcache(view->resolver, NULL); dns_adb_flush(view->adb); return (ISC_R_SUCCESS); @@ -1309,6 +1312,8 @@ dns_view_flushname(dns_view_t *view, dns_name_t *name) { dns_adb_flushname(view->adb, name); if (view->cache == NULL) return (ISC_R_SUCCESS); + if (view->resolver != NULL) + dns_resolver_flushbadcache(view->resolver, name); return (dns_cache_flushname(view->cache, name)); } diff --git a/lib/lwres/man/lwres.html b/lib/lwres/man/lwres.html index c90bcbd..465b876 100644 --- a/lib/lwres/man/lwres.html +++ b/lib/lwres/man/lwres.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres — introduction to the lightweight resolver library

@@ -32,7 +32,7 @@
#include <lwres/lwres.h>
-

DESCRIPTION

+

DESCRIPTION

The BIND 9 lightweight resolver library is a simple, name service independent stub resolver library. It provides hostname-to-address @@ -47,7 +47,7 @@

-

OVERVIEW

+

OVERVIEW

The lwresd library implements multiple name service APIs. The standard @@ -101,7 +101,7 @@

-

CLIENT-SIDE LOW-LEVEL API CALL FLOW

+

CLIENT-SIDE LOW-LEVEL API CALL FLOW

When a client program wishes to make an lwres request using the native low-level API, it typically performs the following @@ -149,7 +149,7 @@

-

SERVER-SIDE LOW-LEVEL API CALL FLOW

+

SERVER-SIDE LOW-LEVEL API CALL FLOW

When implementing the server side of the lightweight resolver protocol using the lwres library, a sequence of actions like the @@ -191,7 +191,7 @@

-

SEE ALSO

+

SEE ALSO

lwres_gethostent(3), lwres_getipnode(3), diff --git a/lib/lwres/man/lwres_buffer.html b/lib/lwres/man/lwres_buffer.html index b546bcf..80fd383 100644 --- a/lib/lwres/man/lwres_buffer.html +++ b/lib/lwres/man/lwres_buffer.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem — lightweight resolver buffer management

@@ -262,7 +262,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide bounds checked access to a region of memory where data is being read or written. diff --git a/lib/lwres/man/lwres_config.html b/lib/lwres/man/lwres_config.html index fb29b7f..055ae91 100644 --- a/lib/lwres/man/lwres_config.html +++ b/lib/lwres/man/lwres_config.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get — lightweight resolver configuration

@@ -90,7 +90,7 @@ lwres_conf_t *
-

DESCRIPTION

+

DESCRIPTION

lwres_conf_init() creates an empty lwres_conf_t @@ -123,7 +123,7 @@ lwres_conf_t *

-

RETURN VALUES

+

RETURN VALUES

lwres_conf_parse() returns LWRES_R_SUCCESS if it successfully read and parsed @@ -142,13 +142,13 @@ lwres_conf_t *

-

SEE ALSO

+

SEE ALSO

stdio(3), resolver(5).

-

FILES

+

FILES

/etc/resolv.conf

diff --git a/lib/lwres/man/lwres_context.html b/lib/lwres/man/lwres_context.html index 22bdcd3..d86e508 100644 --- a/lib/lwres/man/lwres_context.html +++ b/lib/lwres/man/lwres_context.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv — lightweight resolver context management

@@ -172,7 +172,7 @@ void *
-

DESCRIPTION

+

DESCRIPTION

lwres_context_create() creates a lwres_context_t structure for use in lightweight resolver operations. It holds a socket and other @@ -258,7 +258,7 @@ void *

-

RETURN VALUES

+

RETURN VALUES

lwres_context_create() returns LWRES_R_NOMEMORY if memory for the struct lwres_context could not be allocated, @@ -283,7 +283,7 @@ void *

-

SEE ALSO

+

SEE ALSO

lwres_conf_init(3), malloc(3), diff --git a/lib/lwres/man/lwres_gabn.html b/lib/lwres/man/lwres_gabn.html index e5cb4d3..91734dd 100644 --- a/lib/lwres/man/lwres_gabn.html +++ b/lib/lwres/man/lwres_gabn.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free — lightweight resolver getaddrbyname message handling

@@ -178,7 +178,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver name-to-address lookup request and @@ -278,7 +278,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getaddrbyname opcode functions lwres_gabnrequest_render(), @@ -316,7 +316,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_gai_strerror.html b/lib/lwres/man/lwres_gai_strerror.html index 994782d..03b67b8 100644 --- a/lib/lwres/man/lwres_gai_strerror.html +++ b/lib/lwres/man/lwres_gai_strerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gai_strerror — print suitable error string

@@ -42,7 +42,7 @@ char *
-

DESCRIPTION

+

DESCRIPTION

lwres_gai_strerror() returns an error message corresponding to an error code returned by getaddrinfo(). @@ -110,7 +110,7 @@ char *

-

SEE ALSO

+

SEE ALSO

strerror(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_getaddrinfo.html b/lib/lwres/man/lwres_getaddrinfo.html index d3f6e0b..5d02f4b 100644 --- a/lib/lwres/man/lwres_getaddrinfo.html +++ b/lib/lwres/man/lwres_getaddrinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getaddrinfo, lwres_freeaddrinfo — socket address structure to host and service name

@@ -89,7 +89,7 @@ struct addrinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getaddrinfo() is used to get a list of IP addresses and port numbers for host hostname and service @@ -283,7 +283,7 @@ struct addrinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getaddrinfo() returns zero on success or one of the error codes listed in gai_strerror(3) @@ -294,7 +294,7 @@ struct addrinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_gethostent.html b/lib/lwres/man/lwres_gethostent.html index 3bccc48..576c8d9 100644 --- a/lib/lwres/man/lwres_gethostent.html +++ b/lib/lwres/man/lwres_gethostent.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r — lightweight resolver get network host entry

@@ -228,7 +228,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide hostname-to-address and address-to-hostname lookups by means of the lightweight resolver. @@ -366,7 +366,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

The functions lwres_gethostbyname(), @@ -430,7 +430,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

gethostent(3), lwres_getipnode(3), @@ -439,7 +439,7 @@ struct hostent {

-

BUGS

+

BUGS

lwres_gethostbyname(), lwres_gethostbyname2(), lwres_gethostbyaddr() diff --git a/lib/lwres/man/lwres_getipnode.html b/lib/lwres/man/lwres_getipnode.html index 5d9eb9d..9acc616 100644 --- a/lib/lwres/man/lwres_getipnode.html +++ b/lib/lwres/man/lwres_getipnode.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent — lightweight resolver nodename / address translation API

@@ -98,7 +98,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions perform thread safe, protocol independent nodename-to-address and address-to-nodename @@ -217,7 +217,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

If an error occurs, lwres_getipnodebyname() @@ -261,7 +261,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

RFC2553, lwres(3), diff --git a/lib/lwres/man/lwres_getnameinfo.html b/lib/lwres/man/lwres_getnameinfo.html index 200f93f..8b84397 100644 --- a/lib/lwres/man/lwres_getnameinfo.html +++ b/lib/lwres/man/lwres_getnameinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getnameinfo — lightweight resolver socket address structure to hostname and @@ -82,7 +82,7 @@ int

-

DESCRIPTION

+

DESCRIPTION

This function is equivalent to the getnameinfo(3) function defined in RFC2133. @@ -149,13 +149,13 @@ int

-

RETURN VALUES

+

RETURN VALUES

lwres_getnameinfo() returns 0 on success or a non-zero error code if an error occurs.

-

SEE ALSO

+

SEE ALSO

RFC2133, getservbyport(3), lwres(3), @@ -165,7 +165,7 @@ int

-

BUGS

+

BUGS

RFC2133 fails to define what the nonzero return values of getnameinfo(3) diff --git a/lib/lwres/man/lwres_getrrsetbyname.html b/lib/lwres/man/lwres_getrrsetbyname.html index be8c05a..14f1e65 100644 --- a/lib/lwres/man/lwres_getrrsetbyname.html +++ b/lib/lwres/man/lwres_getrrsetbyname.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getrrsetbyname, lwres_freerrset — retrieve DNS records

@@ -102,7 +102,7 @@ struct rrsetinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getrrsetbyname() gets a set of resource records associated with a hostname, class, @@ -150,7 +150,7 @@ struct rrsetinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getrrsetbyname() returns zero on success, and one of the following error codes if an error occurred: @@ -184,7 +184,7 @@ struct rrsetinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3).

diff --git a/lib/lwres/man/lwres_gnba.html b/lib/lwres/man/lwres_gnba.html index bd1ce60..368a848 100644 --- a/lib/lwres/man/lwres_gnba.html +++ b/lib/lwres/man/lwres_gnba.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free — lightweight resolver getnamebyaddress message handling

@@ -183,7 +183,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver address-to-name lookup request and @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getnamebyaddr opcode functions lwres_gnbarequest_render(), @@ -308,7 +308,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3).

diff --git a/lib/lwres/man/lwres_hstrerror.html b/lib/lwres/man/lwres_hstrerror.html index fce6c31..1ca798d 100644 --- a/lib/lwres/man/lwres_hstrerror.html +++ b/lib/lwres/man/lwres_hstrerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_herror, lwres_hstrerror — lightweight resolver error message generation

@@ -50,7 +50,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_herror() prints the string s on stderr followed by the string generated by @@ -84,7 +84,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

The string Unknown resolver error is returned by lwres_hstrerror() @@ -94,7 +94,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

herror(3), lwres_hstrerror(3). diff --git a/lib/lwres/man/lwres_inetntop.html b/lib/lwres/man/lwres_inetntop.html index 37bd95f..9535c35 100644 --- a/lib/lwres/man/lwres_inetntop.html +++ b/lib/lwres/man/lwres_inetntop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_net_ntop — lightweight resolver IP address presentation

@@ -62,7 +62,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_net_ntop() converts an IP address of protocol family af — IPv4 or IPv6 — at @@ -80,7 +80,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

If successful, the function returns dst: a pointer to a string containing the presentation format of the @@ -93,7 +93,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

RFC1884, inet_ntop(3), errno(3). diff --git a/lib/lwres/man/lwres_noop.html b/lib/lwres/man/lwres_noop.html index c8fad5d..43539ad 100644 --- a/lib/lwres/man/lwres_noop.html +++ b/lib/lwres/man/lwres_noop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free — lightweight resolver no-op message handling

@@ -179,7 +179,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver no-op request and response messages. @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The no-op opcode functions lwres_nooprequest_render(), @@ -309,7 +309,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_packet.html b/lib/lwres/man/lwres_packet.html index 17aed04..985e5f6 100644 --- a/lib/lwres/man/lwres_packet.html +++ b/lib/lwres/man/lwres_packet.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_lwpacket_renderheader, lwres_lwpacket_parseheader — lightweight resolver packet handling functions

@@ -66,7 +66,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

These functions rely on a struct lwres_lwpacket @@ -219,7 +219,7 @@ struct lwres_lwpacket {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_lwpacket_renderheader() and diff --git a/lib/lwres/man/lwres_resutil.html b/lib/lwres/man/lwres_resutil.html index 3cde25b..e11aa6f 100644 --- a/lib/lwres/man/lwres_resutil.html +++ b/lib/lwres/man/lwres_resutil.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr — lightweight resolver utility functions

@@ -134,7 +134,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

lwres_string_parse() retrieves a DNS-encoded string starting the current pointer of lightweight resolver buffer b: i.e. @@ -210,7 +210,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_string_parse() @@ -248,7 +248,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_buffer(3), lwres_gabn(3). diff --git a/version b/version index 5559b5c..79bbd49 100644 --- a/version +++ b/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.8 2010/02/18 03:34:50 marka Exp $ +# $Id: version,v 1.43.12.8.2.3 2010/03/04 00:08:28 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -6,5 +6,5 @@ MAJORVER=9 MINORVER=6 PATCHVER=2 -RELEASETYPE= -RELEASEVER= +RELEASETYPE=-P +RELEASEVER=1 -- cgit v1.1 From d92ad4708f8e42fced6b82ddee1930a3e4f6e342 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 1 Apr 2010 12:25:40 +0000 Subject: Import OpenSSL 0.9.8n. --- CHANGES | 15 +++++++++++++++ FAQ | 2 +- Makefile | 2 +- NEWS | 5 +++++ README | 2 +- apps/req.c | 6 ++++++ apps/speed.c | 14 ++++++++++---- config | 4 ++++ crypto/asn1/a_object.c | 6 +++--- crypto/bio/bss_file.c | 4 ++-- crypto/bn/asm/ppc.pl | 2 ++ crypto/bn/asm/x86_64-gcc.c | 1 + crypto/bn/bn_div.c | 10 ++++++++-- crypto/engine/eng_all.c | 2 +- crypto/engine/eng_cryptodev.c | 23 ++++++++++++++++++++--- crypto/evp/digest.c | 1 + crypto/evp/evp_locl.h | 6 +++--- crypto/evp/names.c | 2 +- crypto/md32_common.h | 8 ++++---- crypto/ocsp/ocsp_prn.c | 1 + crypto/opensslv.h | 6 +++--- crypto/rand/rand_win.c | 2 +- engines/e_capi.c | 4 ++++ engines/e_chil.c | 11 +++++++++-- fips/Makefile | 2 +- openssl.spec | 2 +- ssl/kssl.c | 3 +++ ssl/s3_pkt.c | 6 +++--- 28 files changed, 115 insertions(+), 37 deletions(-) diff --git a/CHANGES b/CHANGES index 97b3810..b350da7 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,21 @@ OpenSSL CHANGES _______________ + Changes between 0.9.8m and 0.9.8n [24 Mar 2010] + + *) When rejecting SSL/TLS records due to an incorrect version number, never + update s->server with a new major version number. As of + - OpenSSL 0.9.8m if 'short' is a 16-bit type, + - OpenSSL 0.9.8f if 'short' is longer than 16 bits, + the previous behavior could result in a read attempt at NULL when + receiving specific incorrect SSL/TLS records once record payload + protection is active. (CVE-2010-0740) + [Bodo Moeller, Adam Langley ] + + *) Fix for CVE-2010-0433 where some kerberos enabled versions of OpenSSL + could be crashed if the relevant tables were not present (e.g. chrooted). + [Tomas Hoger ] + Changes between 0.9.8l and 0.9.8m [25 Feb 2010] *) Always check bn_wexpend() return values for failure. (CVE-2009-3245) diff --git a/FAQ b/FAQ index 8041479..f7aaede 100644 --- a/FAQ +++ b/FAQ @@ -78,7 +78,7 @@ OpenSSL - Frequently Asked Questions * Which is the current version of OpenSSL? The current version is available from . -OpenSSL 0.9.8m was released on Feb 25th, 2010. +OpenSSL 0.9.8n was released on Mar 24th, 2010. In addition to the current stable release, you can also access daily snapshots of the OpenSSL development version at value,def,value,nid,n_min,n_max, chtype)) diff --git a/apps/speed.c b/apps/speed.c index 07f0ae0..393a7ba 100644 --- a/apps/speed.c +++ b/apps/speed.c @@ -254,12 +254,18 @@ # endif #endif -#if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE) -# define NO_FORK 1 -#elif HAVE_FORK +#ifndef HAVE_FORK +# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE) +# define HAVE_FORK 0 +# else +# define HAVE_FORK 1 +# endif +#endif + +#if HAVE_FORK # undef NO_FORK #else -# define NO_FORK 1 +# define NO_FORK #endif #undef BUFSIZE diff --git a/config b/config index 4d789df..b9d1c7a 100755 --- a/config +++ b/config @@ -741,6 +741,10 @@ case "$GUESSOS" in OBJECT_MODE=${OBJECT_MODE:-32} if [ "$CC" = "gcc" ]; then OUT="aix-gcc" + if [ $OBJECT_MODE -eq 64 ]; then + echo 'Your $OBJECT_MODE was found to be set to 64' + OUT="aix64-gcc" + fi elif [ $OBJECT_MODE -eq 64 ]; then echo 'Your $OBJECT_MODE was found to be set to 64' OUT="aix64-cc" diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c index d169f8c..365e467 100644 --- a/crypto/asn1/a_object.c +++ b/crypto/asn1/a_object.c @@ -291,12 +291,12 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, ASN1_OBJECT *ret=NULL; const unsigned char *p; int i; - /* Sanity check OID encoding: can't have 0x80 in subidentifiers, see: - * X.690 8.19.2 + /* Sanity check OID encoding: can't have leading 0x80 in + * subidentifiers, see: X.690 8.19.2 */ for (i = 0, p = *pp + 1; i < len - 1; i++, p++) { - if (*p == 0x80) + if (*p == 0x80 && (!i || !(p[-1] & 0x80))) { ASN1err(ASN1_F_C2I_ASN1_OBJECT,ASN1_R_INVALID_OBJECT_ENCODING); return NULL; diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 62c1073..47fa266 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -272,9 +272,9 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr) BIO_clear_flags(b,BIO_FLAGS_UPLINK); #endif #endif -#ifdef UP_fsetmode +#ifdef UP_fsetmod if (b->flags&BIO_FLAGS_UPLINK) - UP_fsetmode(b->ptr,num&BIO_FP_TEXT?'t':'b'); + UP_fsetmod(b->ptr,(char)((num&BIO_FP_TEXT)?'t':'b')); else #endif { diff --git a/crypto/bn/asm/ppc.pl b/crypto/bn/asm/ppc.pl index 08e0053..806e53a 100644 --- a/crypto/bn/asm/ppc.pl +++ b/crypto/bn/asm/ppc.pl @@ -2074,5 +2074,7 @@ EOF $data =~ s/^(\s*)cmplw(\s+)([^,]+),(.*)/$1cmpl$2$3,0,$4/gm; # assembler X doesn't accept li, load immediate value #$data =~ s/^(\s*)li(\s+)([^,]+),(.*)/$1addi$2$3,0,$4/gm; + # assembler Y chokes on apostrophes in comments + $data =~ s/'//gm; return($data); } diff --git a/crypto/bn/asm/x86_64-gcc.c b/crypto/bn/asm/x86_64-gcc.c index 2b2bc1e..b1b8a11 100644 --- a/crypto/bn/asm/x86_64-gcc.c +++ b/crypto/bn/asm/x86_64-gcc.c @@ -59,6 +59,7 @@ #undef mul #undef mul_add +#undef sqr /* * "m"(a), "+m"(r) is the way to favor DirectPath µ-code; diff --git a/crypto/bn/bn_div.c b/crypto/bn/bn_div.c index 7c35545..78c6507 100644 --- a/crypto/bn/bn_div.c +++ b/crypto/bn/bn_div.c @@ -337,7 +337,10 @@ X) -> 0x%08X\n", t2 -= d1; } #else /* !BN_LLONG */ - BN_ULONG t2l,t2h,ql,qh; + BN_ULONG t2l,t2h; +#if !defined(BN_UMULT_LOHI) && !defined(BN_UMULT_HIGH) + BN_ULONG ql,qh; +#endif q=bn_div_words(n0,n1,d0); #ifdef BN_DEBUG_LEVITTE @@ -561,7 +564,10 @@ X) -> 0x%08X\n", t2 -= d1; } #else /* !BN_LLONG */ - BN_ULONG t2l,t2h,ql,qh; + BN_ULONG t2l,t2h; +#if !defined(BN_UMULT_LOHI) && !defined(BN_UMULT_HIGH) + BN_ULONG ql,qh; +#endif q=bn_div_words(n0,n1,d0); #ifdef BN_DEBUG_LEVITTE diff --git a/crypto/engine/eng_all.c b/crypto/engine/eng_all.c index d29cd57..f29c167 100644 --- a/crypto/engine/eng_all.c +++ b/crypto/engine/eng_all.c @@ -104,7 +104,7 @@ void ENGINE_load_builtin_engines(void) #endif #endif #ifndef OPENSSL_NO_HW -#if defined(__OpenBSD__) || defined(__FreeBSD__) +#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) ENGINE_load_cryptodev(); #endif #if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG) diff --git a/crypto/engine/eng_cryptodev.c b/crypto/engine/eng_cryptodev.c index 1a1e1c2..eef1e2d 100644 --- a/crypto/engine/eng_cryptodev.c +++ b/crypto/engine/eng_cryptodev.c @@ -755,10 +755,18 @@ cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, goto err; kop.crk_iparams = 3; - if (cryptodev_asym(&kop, BN_num_bytes(m), r, 0, NULL) == -1) { + if (cryptodev_asym(&kop, BN_num_bytes(m), r, 0, NULL)) { const RSA_METHOD *meth = RSA_PKCS1_SSLeay(); + printf("OCF asym process failed, Running in software\n"); + ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont); + + } else if (ECANCELED == kop.crk_status) { + const RSA_METHOD *meth = RSA_PKCS1_SSLeay(); + printf("OCF hardware operation cancelled. Running in Software\n"); ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont); } + /* else cryptodev operation worked ok ==> ret = 1*/ + err: zapparams(&kop); return (ret); @@ -801,10 +809,18 @@ cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) goto err; kop.crk_iparams = 6; - if (cryptodev_asym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL) == -1) { + if (cryptodev_asym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL)) { const RSA_METHOD *meth = RSA_PKCS1_SSLeay(); + printf("OCF asym process failed, running in Software\n"); + ret = (*meth->rsa_mod_exp)(r0, I, rsa, ctx); + + } else if (ECANCELED == kop.crk_status) { + const RSA_METHOD *meth = RSA_PKCS1_SSLeay(); + printf("OCF hardware operation cancelled. Running in Software\n"); ret = (*meth->rsa_mod_exp)(r0, I, rsa, ctx); } + /* else cryptodev operation worked ok ==> ret = 1*/ + err: zapparams(&kop); return (ret); @@ -940,7 +956,8 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen, kop.crk_iparams = 7; if (cryptodev_asym(&kop, 0, NULL, 0, NULL) == 0) { - dsaret = kop.crk_status; +/*OCF success value is 0, if not zero, change dsaret to fail*/ + if(0 != kop.crk_status) dsaret = 0; } else { const DSA_METHOD *meth = DSA_OpenSSL(); diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c index 6a8f39b..10a3607 100644 --- a/crypto/evp/digest.c +++ b/crypto/evp/digest.c @@ -235,6 +235,7 @@ static int do_evp_md_engine(EVP_MD_CTX *ctx, const EVP_MD **ptype, ENGINE *impl) { /* Same comment from evp_enc.c */ EVPerr(EVP_F_DO_EVP_MD_ENGINE,EVP_R_INITIALIZATION_ERROR); + ENGINE_finish(impl); return 0; } /* We'll use the ENGINE's private digest definition */ diff --git a/crypto/evp/evp_locl.h b/crypto/evp/evp_locl.h index 72105b0..ef6c432 100644 --- a/crypto/evp/evp_locl.h +++ b/crypto/evp/evp_locl.h @@ -127,9 +127,9 @@ BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \ #define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, \ iv_len, cbits, flags, init_key, cleanup, \ set_asn1, get_asn1, ctrl) \ -BLOCK_CIPHER_def1(cname, cfb##cbits, cfb##cbits, CFB, kstruct, nid, \ - (cbits + 7)/8, key_len, iv_len, \ - flags, init_key, cleanup, set_asn1, get_asn1, ctrl) +BLOCK_CIPHER_def1(cname, cfb##cbits, cfb##cbits, CFB, kstruct, nid, 1, \ + key_len, iv_len, flags, init_key, cleanup, set_asn1, \ + get_asn1, ctrl) #define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, \ iv_len, cbits, flags, init_key, cleanup, \ diff --git a/crypto/evp/names.c b/crypto/evp/names.c index e2e04c3..945879d 100644 --- a/crypto/evp/names.c +++ b/crypto/evp/names.c @@ -90,7 +90,7 @@ int EVP_add_digest(const EVP_MD *md) r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(const char *)md); if (r == 0) return(0); - if (md->type != md->pkey_type) + if (md->pkey_type && md->type != md->pkey_type) { r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type), OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); diff --git a/crypto/md32_common.h b/crypto/md32_common.h index 61bcd97..606aea6 100644 --- a/crypto/md32_common.h +++ b/crypto/md32_common.h @@ -241,11 +241,11 @@ #ifndef PEDANTIC # if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) # if defined(__s390x__) -# define HOST_c2l(c,l) ({ asm ("lrv %0,0(%1)" \ - :"=r"(l) : "r"(c)); \ +# define HOST_c2l(c,l) ({ asm ("lrv %0,%1" \ + :"=d"(l) :"m"(*(const unsigned int *)(c));\ (c)+=4; (l); }) -# define HOST_l2c(l,c) ({ asm ("strv %0,0(%1)" \ - : : "r"(l),"r"(c) : "memory"); \ +# define HOST_l2c(l,c) ({ asm ("strv %1,%0" \ + :"=m"(*(unsigned int *)(c)) :"d"(l));\ (c)+=4; (l); }) # endif # endif diff --git a/crypto/ocsp/ocsp_prn.c b/crypto/ocsp/ocsp_prn.c index 01f81e7..90dd1aa 100644 --- a/crypto/ocsp/ocsp_prn.c +++ b/crypto/ocsp/ocsp_prn.c @@ -275,6 +275,7 @@ int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) } if (!X509V3_extensions_print(bp, "Response Extensions", rd->responseExtensions, flags, 4)) + goto err; if(X509_signature_print(bp, br->signatureAlgorithm, br->signature) <= 0) goto err; diff --git a/crypto/opensslv.h b/crypto/opensslv.h index 3d794d9..9f3981c 100644 --- a/crypto/opensslv.h +++ b/crypto/opensslv.h @@ -25,11 +25,11 @@ * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for * major minor fix final patch/beta) */ -#define OPENSSL_VERSION_NUMBER 0x009080dfL +#define OPENSSL_VERSION_NUMBER 0x009080efL #ifdef OPENSSL_FIPS -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8m-fips 25 Feb 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8n-fips 24 Mar 2010" #else -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8m 25 Feb 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8n 24 Mar 2010" #endif #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/crypto/rand/rand_win.c b/crypto/rand/rand_win.c index 5198351..5d134e1 100644 --- a/crypto/rand/rand_win.c +++ b/crypto/rand/rand_win.c @@ -750,7 +750,7 @@ static void readscreen(void) int y; /* y-coordinate of screen lines to grab */ int n = 16; /* number of screen lines to grab at a time */ - if (GetVersion() >= 0x80000000 || !OPENSSL_isservice()) + if (GetVersion() < 0x80000000 && OPENSSL_isservice()>0) return; /* Create a screen DC and a memory DC compatible to screen DC */ diff --git a/engines/e_capi.c b/engines/e_capi.c index fd7f13c..59b2ab7 100644 --- a/engines/e_capi.c +++ b/engines/e_capi.c @@ -83,6 +83,10 @@ #define CERT_STORE_CREATE_NEW_FLAG 0x00002000 #endif +#ifndef CERT_SYSTEM_STORE_CURRENT_USER +#define CERT_SYSTEM_STORE_CURRENT_USER 0x00010000 +#endif + #include #include #include diff --git a/engines/e_chil.c b/engines/e_chil.c index e184762..3a07076 100644 --- a/engines/e_chil.c +++ b/engines/e_chil.c @@ -1204,6 +1204,11 @@ static int hwcrhk_get_pass(const char *prompt_info, pem_password_cb *callback = NULL; void *callback_data = NULL; UI_METHOD *ui_method = NULL; + /* Despite what the documentation says prompt_info can be + * an empty string. + */ + if (prompt_info && !*prompt_info) + prompt_info = NULL; if (cactx) { @@ -1305,8 +1310,10 @@ static int hwcrhk_insert_card(const char *prompt_info, { char answer; char buf[BUFSIZ]; - - if (wrong_info) + /* Despite what the documentation says wrong_info can be + * an empty string. + */ + if (wrong_info && *wrong_info) BIO_snprintf(buf, sizeof(buf)-1, "Current card: \"%s\"\n", wrong_info); ok = UI_dup_info_string(ui, buf); diff --git a/fips/Makefile b/fips/Makefile index 720a883..546b54b 100644 --- a/fips/Makefile +++ b/fips/Makefile @@ -123,7 +123,7 @@ fips_premain_dso$(EXE_EXT): fips_premain.c $(FIPSLIBDIR)fipscanister.o ../libcrypto.a $(EX_LIBS) # this is executed only when linking with external fipscanister.o fips_standalone_sha1$(EXE_EXT): sha/fips_standalone_sha1.c - if [ -z $(HOSTCC) ] ; then \ + if [ -z "$(HOSTCC)" ] ; then \ $(CC) $(CFLAGS) -DFIPSCANISTER_O -o $@ sha/fips_standalone_sha1.c $(FIPSLIBDIR)fipscanister.o $(EX_LIBS) ; \ else \ $(HOSTCC) $(HOSTCFLAGS) -o $ $@ -I../include -I../crypto sha/fips_standalone_sha1.c ../crypto/sha/sha1dgst.c ; \ diff --git a/openssl.spec b/openssl.spec index eb4bced..19a002f 100644 --- a/openssl.spec +++ b/openssl.spec @@ -2,7 +2,7 @@ %define libmaj 0 %define libmin 9 %define librel 8 -%define librev m +%define librev n Release: 1 %define openssldir /var/ssl diff --git a/ssl/kssl.c b/ssl/kssl.c index 73401c9..5cba28b 100644 --- a/ssl/kssl.c +++ b/ssl/kssl.c @@ -1802,6 +1802,9 @@ kssl_ctx_show(KSSL_CTX *kssl_ctx) kssl_ctx->service_name ? kssl_ctx->service_name: KRB5SVC, KRB5_NT_SRV_HST, &princ); + if (krb5rc) + goto exit; + krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, princ, 0 /* IGNORE_VNO */, diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c index a2ba574..5e3583c 100644 --- a/ssl/s3_pkt.c +++ b/ssl/s3_pkt.c @@ -291,9 +291,9 @@ again: if (version != s->version) { SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER); - /* Send back error using their - * version number :-) */ - s->version=version; + if ((s->version & 0xFF00) == (version & 0xFF00)) + /* Send back error using their minor version number :-) */ + s->version = (unsigned short)version; al=SSL_AD_PROTOCOL_VERSION; goto f_err; } -- cgit v1.1 From 6d41f7ac6b360a4d3daf511eefc0708d423832cb Mon Sep 17 00:00:00 2001 From: dougb Date: Thu, 20 May 2010 05:38:08 +0000 Subject: Vendor import of BIND 9.6.2-P2 --- CHANGES | 5 +++++ lib/dns/api | 2 +- lib/dns/validator.c | 4 ++-- version | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index d14fdd6..3f2df79 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ + --- 9.6.2-P2 released --- + +2876. [bug] Named could return SERVFAIL for negative responses + from unsigned zones. [RT #21131] + --- 9.6.2-P1 released --- 2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619] diff --git a/lib/dns/api b/lib/dns/api index 4fc7eca..e9df7db 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ LIBINTERFACE = 56 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 1 diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 0ccdc41..7144ae2 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.11.8.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: validator.c,v 1.164.12.11.8.3 2010/04/21 04:29:01 marka Exp $ */ #include @@ -2961,7 +2961,7 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { } findnsec3proofs(val); - if (val->authcount == val->authfail) + if (val->authfail != 0 && val->authcount == val->authfail) return (DNS_R_BROKENCHAIN); validator_log(val, ISC_LOG_DEBUG(3), "nonexistence proof(s) not found"); diff --git a/version b/version index 79bbd49..d9367f8 100644 --- a/version +++ b/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.8.2.3 2010/03/04 00:08:28 marka Exp $ +# $Id: version,v 1.43.12.8.2.4 2010/05/10 02:07:03 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -7,4 +7,4 @@ MAJORVER=9 MINORVER=6 PATCHVER=2 RELEASETYPE=-P -RELEASEVER=1 +RELEASEVER=2 -- cgit v1.1 From eb399bacb260498dc82cc60bff7e32bb7538b8c4 Mon Sep 17 00:00:00 2001 From: dougb Date: Sat, 30 Oct 2010 21:01:18 +0000 Subject: Vendor import of BIND 9.6-ESV-R2 --- CHANGES | 43 +- README | 6 + bin/dnssec/dnssec-dsfromkey.html | 18 +- bin/dnssec/dnssec-keyfromlabel.html | 12 +- bin/dnssec/dnssec-keygen.html | 14 +- bin/dnssec/dnssec-signzone.html | 14 +- bin/named/include/named/globals.h | 5 +- bin/named/main.c | 8 +- bin/named/query.c | 24 +- bin/named/server.c | 2 +- bin/nsupdate/nsupdate.html | 14 +- doc/arm/Bv9ARM-book.xml | 2 +- doc/arm/Bv9ARM.ch06.html | 2 +- doc/arm/Bv9ARM.ch07.html | 2 +- doc/arm/Bv9ARM.ch08.html | 2 +- doc/arm/Bv9ARM.ch09.html | 2 +- doc/arm/Bv9ARM.html | 2 +- doc/arm/Bv9ARM.pdf | 927 +-- doc/arm/isc-logo.eps | 12489 +++++++----------------------- doc/arm/isc-logo.pdf | Bin 21981 -> 287991 bytes doc/arm/man.dig.html | 2 +- doc/arm/man.dnssec-dsfromkey.html | 2 +- doc/arm/man.dnssec-keyfromlabel.html | 2 +- doc/arm/man.dnssec-keygen.html | 2 +- doc/arm/man.dnssec-signzone.html | 2 +- doc/arm/man.host.html | 2 +- doc/arm/man.named-checkconf.html | 2 +- doc/arm/man.named-checkzone.html | 2 +- doc/arm/man.named.html | 2 +- doc/arm/man.nsupdate.html | 2 +- doc/arm/man.rndc-confgen.html | 2 +- doc/arm/man.rndc.conf.html | 2 +- doc/arm/man.rndc.html | 2 +- lib/dns/adb.c | 51 +- lib/dns/api | 6 +- lib/dns/include/dns/diff.h | 6 +- lib/dns/include/dns/ncache.h | 11 +- lib/dns/include/dns/rdataset.h | 2 +- lib/dns/include/dns/resolver.h | 2 +- lib/dns/include/dns/result.h | 2 +- lib/dns/include/dns/types.h | 5 +- lib/dns/include/dns/validator.h | 2 +- lib/dns/ncache.c | 150 +- lib/dns/rbtdb.c | 30 +- lib/dns/rdatalist.c | 2 +- lib/dns/rdataset.c | 2 +- lib/dns/rdataslab.c | 2 +- lib/dns/resolver.c | 73 +- lib/dns/result.c | 2 +- lib/dns/sdb.c | 2 +- lib/dns/sdlz.c | 2 +- lib/dns/validator.c | 724 +- lib/dns/view.c | 2 +- lib/isc/api | 6 +- lib/isc/include/isc/mem.h | 12 +- lib/isc/mem.c | 36 +- lib/lwres/man/lwres.html | 2 +- lib/lwres/man/lwres_buffer.html | 2 +- lib/lwres/man/lwres_config.html | 2 +- lib/lwres/man/lwres_context.html | 2 +- lib/lwres/man/lwres_gabn.html | 2 +- lib/lwres/man/lwres_gai_strerror.html | 2 +- lib/lwres/man/lwres_getaddrinfo.html | 2 +- lib/lwres/man/lwres_gethostent.html | 2 +- lib/lwres/man/lwres_getipnode.html | 2 +- lib/lwres/man/lwres_getnameinfo.html | 2 +- lib/lwres/man/lwres_getrrsetbyname.html | 2 +- lib/lwres/man/lwres_gnba.html | 2 +- lib/lwres/man/lwres_hstrerror.html | 2 +- lib/lwres/man/lwres_inetntop.html | 2 +- lib/lwres/man/lwres_noop.html | 2 +- lib/lwres/man/lwres_packet.html | 2 +- lib/lwres/man/lwres_resutil.html | 2 +- version | 8 +- 74 files changed, 3995 insertions(+), 10793 deletions(-) diff --git a/CHANGES b/CHANGES index 3f2df79..cb2581a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,9 +1,48 @@ - --- 9.6.2-P2 released --- + --- 9.6-ESV-R2 released --- + +2939. [func] Check that named successfully skips NSEC3 records + that fail to match the NSEC3PARAM record currently + in use. [RT# 21868] + +2937. [bug] Worked around an apparent race condition in over + memory conditions. Without this fix a DNS cache DB or + ADB could incorrectly stay in an over memory state, + effectively refusing further caching, which + subsequently made a BIND 9 caching server unworkable. + This fix prevents this problem from happening by + polling the state of the memory context, rather than + making a copy of the state, which appeared to cause + a race. This is a "workaround" in that it doesn't + solve the possible race per se, but several experiments + proved this change solves the symptom. Also, the + polling overhead hasn't been reported to be an issue. + This bug should only affect a caching server that + specifies a finite max-cache-size. It's also quite + likely that the bug happens only when enabling threads, + but it's not confirmed yet. [RT #21818] + +2925. [bug] Named failed to accept uncachable negative responses + from insecure zones. [RT# 21555] + +2921. [bug] The resolver could attempt to destroy a fetch context + too soon. [RT #19878] + +2900. [bug] The placeholder negative caching element was not + properly constructed triggering a INSIST in + dns_ncache_towire(). [RT #21346] + +2890. [bug] Handle the introduction of new trusted-keys and + DS, DLV RRsets better. [RT #21097] + +2869. [bug] Fix arguments to dns_keytable_findnextkeynode() call. + [RT #20877] + + --- 9.6-ESV-R1 released --- 2876. [bug] Named could return SERVFAIL for negative responses from unsigned zones. [RT #21131] - --- 9.6.2-P1 released --- + --- 9.6-ESV released --- 2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619] diff --git a/README b/README index 902d9ed..fc981a6 100644 --- a/README +++ b/README @@ -42,6 +42,12 @@ BIND 9 Stichting NLnet - NLnet Foundation Nominum, Inc. +BIND 9.6-ESV (Extended Support Version) + + BIND 9.6-ESV will be supported until March 31, 2013, at + which time you will need to upgrade to the current release + of BIND. + BIND 9.6.2 BIND 9.6.2 is a maintenance release, fixing bugs in 9.6.1. diff --git a/bin/dnssec/dnssec-dsfromkey.html b/bin/dnssec/dnssec-dsfromkey.html index 72dfd3a..bc0273d 100644 --- a/bin/dnssec/dnssec-dsfromkey.html +++ b/bin/dnssec/dnssec-dsfromkey.html @@ -1,5 +1,5 @@ - + @@ -33,14 +33,14 @@

dnssec-dsfromkey {-s} [-v level] [-1] [-2] [-a alg] [-c class] [-d dir] {dnsname}

-

DESCRIPTION

+

DESCRIPTION

dnssec-dsfromkey outputs the Delegation Signer (DS) resource record (RR), as defined in RFC 3658 and RFC 4509, for the given key(s).

-

OPTIONS

+

OPTIONS

-1

@@ -81,7 +81,7 @@

-

EXAMPLE

+

EXAMPLE

To build the SHA-256 DS RR from the Kexample.com.+003+26160 @@ -96,7 +96,7 @@

-

FILES

+

FILES

The keyfile can be designed by the key identification Knnnn.+aaa+iiiii or the full file name @@ -110,13 +110,13 @@

-

CAVEAT

+

CAVEAT

A keyfile error can give a "file not found" even if the file exists.

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -125,7 +125,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssec-keyfromlabel.html b/bin/dnssec/dnssec-keyfromlabel.html index 1aafccd..2ef83d2 100644 --- a/bin/dnssec/dnssec-keyfromlabel.html +++ b/bin/dnssec/dnssec-keyfromlabel.html @@ -13,7 +13,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -31,7 +31,7 @@

dnssec-keyfromlabel {-a algorithm} {-l label} [-c class] [-f flag] [-k] [-n nametype] [-p protocol] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keyfromlabel gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 @@ -39,7 +39,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm
@@ -120,7 +120,7 @@
-

GENERATED KEY FILES

+

GENERATED KEY FILES

When dnssec-keyfromlabel completes successfully, @@ -161,7 +161,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -169,7 +169,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssec-keygen.html b/bin/dnssec/dnssec-keygen.html index fccec6f..0e9255a 100644 --- a/bin/dnssec/dnssec-keygen.html +++ b/bin/dnssec/dnssec-keygen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -32,7 +32,7 @@

dnssec-keygen {-a algorithm} {-b keysize} {-n nametype} [-c class] [-e] [-f flag] [-g generator] [-h] [-k] [-p protocol] [-r randomdev] [-s strength] [-t type] [-v level] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keygen generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with @@ -45,7 +45,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm
@@ -155,7 +155,7 @@
-

GENERATED KEYS

+

GENERATED KEYS

When dnssec-keygen completes successfully, @@ -201,7 +201,7 @@

-

EXAMPLE

+

EXAMPLE

To generate a 768-bit DSA key for the domain example.com, the following command would be @@ -222,7 +222,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 2539, @@ -231,7 +231,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssec-signzone.html b/bin/dnssec/dnssec-signzone.html index e7c534f..c37b6f5 100644 --- a/bin/dnssec/dnssec-signzone.html +++ b/bin/dnssec/dnssec-signzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -32,7 +32,7 @@

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-P] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -43,7 +43,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -273,7 +273,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -302,7 +302,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -327,14 +327,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h index 6040dc3..c39fe5e 100644 --- a/bin/named/include/named/globals.h +++ b/bin/named/include/named/globals.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: globals.h,v 1.80 2008/11/16 22:49:18 marka Exp $ */ +/* $Id: globals.h,v 1.80.84.2 2010/06/26 23:46:15 tbox Exp $ */ #ifndef NAMED_GLOBALS_H #define NAMED_GLOBALS_H 1 @@ -132,6 +132,7 @@ EXTERN int ns_g_listen INIT(3); EXTERN isc_time_t ns_g_boottime; EXTERN isc_boolean_t ns_g_memstatistics INIT(ISC_FALSE); EXTERN isc_boolean_t ns_g_clienttest INIT(ISC_FALSE); +EXTERN isc_boolean_t ns_g_nosoa INIT(ISC_FALSE); #undef EXTERN #undef INIT diff --git a/bin/named/main.c b/bin/named/main.c index f97ab45..74bace5 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: main.c,v 1.166.34.3 2009/04/03 20:18:59 marka Exp $ */ +/* $Id: main.c,v 1.166.34.3.24.3 2010/09/06 03:58:32 marka Exp $ */ /*! \file */ @@ -446,13 +446,15 @@ parse_command_line(int argc, char *argv[]) { /* XXXJAB should we make a copy? */ ns_g_chrootdir = isc_commandline_argument; break; - case 'T': + case 'T': /* NOT DOCUMENTED */ /* * clienttest: make clients single shot with their * own memory context. */ if (strcmp(isc_commandline_argument, "clienttest") == 0) ns_g_clienttest = ISC_TRUE; + else if (!strcmp(isc_commandline_argument, "nosoa")) + ns_g_nosoa = ISC_TRUE; else fprintf(stderr, "unknown -T flag '%s\n", isc_commandline_argument); diff --git a/bin/named/query.c b/bin/named/query.c index cef6d7f..73ed1a6 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.313.20.16 2009/12/30 08:34:29 jinmei Exp $ */ +/* $Id: query.c,v 1.313.20.16.10.2 2010/06/26 23:46:14 tbox Exp $ */ /*! \file */ @@ -56,6 +56,7 @@ #include #include +#include #include #include #include @@ -2038,7 +2039,7 @@ query_addrrset(ns_client_t *client, dns_name_t **namep, static inline isc_result_t query_addsoa(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version, - isc_boolean_t zero_ttl) + isc_boolean_t zero_ttl, isc_boolean_t isassociated) { dns_name_t *name; dns_dbnode_t *node; @@ -2056,6 +2057,12 @@ query_addsoa(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version, node = NULL; /* + * Don't add the SOA record for test which set "-T nosoa". + */ + if (ns_g_nosoa && (!WANTDNSSEC(client) || !isassociated)) + return (ISC_R_SUCCESS); + + /* * Get resources and make 'name' be the database origin. */ result = dns_message_gettempname(client->message, &name); @@ -4324,7 +4331,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) /* * Add SOA. */ - result = query_addsoa(client, db, version, ISC_FALSE); + result = query_addsoa(client, db, version, ISC_FALSE, + dns_rdataset_isassociated(rdataset)); if (result != ISC_R_SUCCESS) { QUERY_ERROR(result); goto cleanup; @@ -4372,9 +4380,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) zone != NULL && #endif dns_zone_getzeronosoattl(zone)) - result = query_addsoa(client, db, version, ISC_TRUE); + result = query_addsoa(client, db, version, ISC_TRUE, + dns_rdataset_isassociated(rdataset)); else - result = query_addsoa(client, db, version, ISC_FALSE); + result = query_addsoa(client, db, version, ISC_FALSE, + dns_rdataset_isassociated(rdataset)); if (result != ISC_R_SUCCESS) { QUERY_ERROR(result); goto cleanup; @@ -4742,7 +4752,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) * Add SOA. */ result = query_addsoa(client, db, version, - ISC_FALSE); + ISC_FALSE, ISC_FALSE); if (result == ISC_R_SUCCESS) result = ISC_R_NOMORE; } else { diff --git a/bin/named/server.c b/bin/named/server.c index 6608fdf..8f67786 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.520.12.11.8.2 2010/02/25 10:57:11 tbox Exp $ */ +/* $Id: server.c,v 1.520.12.11.10.1 2010/03/03 22:06:36 marka Exp $ */ /*! \file */ diff --git a/bin/nsupdate/nsupdate.html b/bin/nsupdate/nsupdate.html index 9f45171..c655c02 100644 --- a/bin/nsupdate/nsupdate.html +++ b/bin/nsupdate/nsupdate.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -32,7 +32,7 @@

nsupdate [-d] [-D] [[-g] | [-o] | [-y [hmac:]keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-R randomdev] [-v] [filename]

-

DESCRIPTION

+

DESCRIPTION

nsupdate is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. @@ -169,7 +169,7 @@

-

INPUT FORMAT

+

INPUT FORMAT

nsupdate reads input from filename @@ -433,7 +433,7 @@

-

EXAMPLES

+

EXAMPLES

The examples below show how nsupdate @@ -487,7 +487,7 @@

-

FILES

+

FILES

/etc/resolv.conf

@@ -506,7 +506,7 @@

-

SEE ALSO

+

SEE ALSO

RFC2136, RFC3007, RFC2104, @@ -519,7 +519,7 @@

-

BUGS

+

BUGS

The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 29331d9..da80a31 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + BIND 9 Administrator Reference Manual diff --git a/doc/arm/Bv9ARM.ch06.html b/doc/arm/Bv9ARM.ch06.html index 9e0667e..a6ccccd 100644 --- a/doc/arm/Bv9ARM.ch06.html +++ b/doc/arm/Bv9ARM.ch06.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/Bv9ARM.ch07.html b/doc/arm/Bv9ARM.ch07.html index 91994f3..e56035a 100644 --- a/doc/arm/Bv9ARM.ch07.html +++ b/doc/arm/Bv9ARM.ch07.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/Bv9ARM.ch08.html b/doc/arm/Bv9ARM.ch08.html index 3e7c8c3..04b05a3 100644 --- a/doc/arm/Bv9ARM.ch08.html +++ b/doc/arm/Bv9ARM.ch08.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/Bv9ARM.ch09.html b/doc/arm/Bv9ARM.ch09.html index 6b6af6a..8007dd2 100644 --- a/doc/arm/Bv9ARM.ch09.html +++ b/doc/arm/Bv9ARM.ch09.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/Bv9ARM.html b/doc/arm/Bv9ARM.html index 2f127c6..44abd77 100644 --- a/doc/arm/Bv9ARM.html +++ b/doc/arm/Bv9ARM.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/Bv9ARM.pdf b/doc/arm/Bv9ARM.pdf index 87f3462..2e02604 100644 --- a/doc/arm/Bv9ARM.pdf +++ b/doc/arm/Bv9ARM.pdf @@ -9622,7 +9622,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅå‘æ‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ -Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.Mu=¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 +Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.y- cyS¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 @@ -9645,7 +9645,7 @@ $O t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•Ã¸©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6붡²BSHQøר.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôŽ±§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ -*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿò¸õ¼endstream +*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿ õ®endstream endobj 1645 0 obj << /Type /Font @@ -9654,14 +9654,14 @@ endobj /FirstChar 67 /LastChar 85 /Widths 2144 0 R -/BaseFont /NYULSI+URWPalladioL-Bold-Slant_167 +/BaseFont /DOMXDZ+URWPalladioL-Bold-Slant_167 /FontDescriptor 1643 0 R >> endobj 1643 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /NYULSI+URWPalladioL-Bold-Slant_167 +/FontName /DOMXDZ+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 @@ -9685,29 +9685,25 @@ x Òy¦§aáèha …«pJí•Ž HÀÈ(ã ±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 -³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`=9)Ù§ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK -ïeë[ă»4fÖ)Æ»'c£»¶*2‡Ìu•ÙÖ£™øM×E;k"±{åè!6ÙÏgø¹a1ù‰¢§.Ô¶3àéÉS®Þ?pUì!¸?Ñ='g€$NúüVž;»;l"=+±¹ájy4&ôøë´}‚ÄÊ¡æ °Q™Ä´îÃf¤'²š‹8­‚{@|[÷n½.\ex~ûjÂâSÿ ¾jrþ¶áåkï}6KiÕI†ú€±s=Z9;ªîÕÒ/7ö[;_NÉö[BÔrw–mF¨¹]žÒ[¯éÇhy;Iþô|“Pâ±_®Ô(\{Er¿—¤ÿ}á÷,˜4½‘JÿШw‡5Z!tÒ¦(¤Œ2x<κ¶grú>0.;¼½2qøÀaZ.Ë©EL_GHx5tÕ;’T1•\,ék?‹n·‡âø£ÚÌßÒ¸nòTÀÛö• -atÜÌ‹•±Õ]ç°ÊÁ†Ó%¿2þÝ{ÕÄÙ )•åŸ‰>§«#lð6šo;Þ^Ùû¡LÿUjIpÈ(F²Ó®èê~ï}=z8Ö>ß’»0?u>Ægòv[?Îú 3MØĺ??Â6ó–¸GK让Ƭ—–Q„tÈ¡f´µ 8™ûÌ⟠é?;©ª•Ò {=ÕtvWŸuéR^.„«È‹zY½Ît+@½^V×^Ml¬oJfE([œ]£–å›'â#å|'OF˜îˆŠÖ¡3ûÀ~.IZÀH)L›‡jªrÌg¬±Þ=•u«Œ†t®q©,xÚ3À-ØËpõL܉'òA€ªC0[&µ{C iÇŠ¤y)>û›çeLcÑ%/³FTU§€ÙÕô¨5« ð -½’•sJÜkŒ "êC 3ó®cUÉÙ4eHÎH~0+¾÷ìEÑOÁY^€ÝˆF›ÍŽTU§h§D´çéíçǽ8IÉ{éBDWžñ»ïÝR±FêÏVë®fûÆʦîíqßÇ´L…ŒJ®GЧzTÅ‚ë—âƒáJM î;£2þñN÷6…OŒHâÑ ìÞv­øózy¥Ïgg)Õ‚«?Y¾„ѼN-áf_6ÄG¦ ‘”Ï w÷‰·8I•w…p¤Y%K:¡–-@2GrMú 4¨oêÞPÀ-Ýë*õk¥sj€#}–ÕǪq.‰ã!Åp£Y2Õ tÌ( ]¡ÀC»ëƒ;hbЀ16gRtVwšÇ>oõ;#m½YÐá³0zuœÎkê -£Šà> ä>-e™÷CL\¸³Äù¯“7ôwÂI:HÁ®óÚÊüÄRö*gTréïI(J‹ÕÏÀÒˆª1!øRb’>¹`ÕÕâ13W@‰MÔïÒ335,Gƒ÷î Ã'V? 9ZŽfjW]èUªŠÛ¬[ßÑY@ÞCLAíŸjÙÙ*+òæÅõÁÉÏ5~šj}‰Ûy]ç¼cñvË‹ Bxi9]'±|¤“²w/±2X®‹‚8w^+ÐKºDœ~$ìl‚Ý‚I®J5`žV¯ipw/¢6’ -}ˆçã õF´£ögºts£ng]á„Ö|Õ`ˆksÕ8;¾Ï»´²?…&@È™!*¦54[«*/„“¶sÈo?87Æ…ÑS)ê¿{=ܼP‚+»Ñho†lMe$—ü¬NRž3(Þc½4ûô.¨’õ©ë~FZBô¾Y5““_ªßþÎhd%\N+œ2‹ÐèÛ—ˇ)™¼¢{ás9͆·ß¡’ ½¨™”qá 'N_Φíc%}#0~?3¸¦fSwß2œ]aµo1ŸJ(Ïá®óc¨ƒ~ P ʽ]HϨ}æKU«Ù0¼Q[»SÊvåg à¶"hÉþÄêYá­ÿ/¤g¹iŠWœeM¬”…¨AˇêžÒGªrÌ,ÒÔ‡Øn¹äV¥õ†¡¯ø]mÔÅbüÒ&‹’j´¥‚LsNù£97œ{xØ4()Ûó’:ÍÕJ QɉÓ4âQxŸ6êw´êú|©:T™$·Ü½Ê·ƒµ -Õý‘–”øц1öã9ã^Ìæ‰ÍDqfÍEK–º¨ÖÆ¢ñ—Šˆ™b+oŒÝ-.4‡u˱A—†„‡ÖŽñŽ\ß·ì$&ªH=ˆð~„v^f-ÔpžYÆSD“Ÿó=²AŠ5bµXî òàGzŸV·å|ñ¯¬ ôùÜäµqFÿ‚Ox·Fšk†dMÎV{žPzÛ`%õÅl˜m—eYqªÆXÿ»t›y_o‚*…»”ëü`8™dÈWLUeÛ|êæl UltŸÙ|¹»Dl3Ö£=ÍÒshí.‘È/œxK÷,,AãaÓ¬)ŠWtíB²J*=Ý{†!f»Rq„mÃoœ5¤pìhrßµïdé0æÀ&øyž•Š÷Ïï[P-qµÎ“ `ýB!aþa`Wf -pR°‚šL\(hG»µM™ŒüÔuÃf}ÐÔZE¨„V½Ïõ°"„£.™³ÉJ”®<¸{çk‘©‘IþIü€dLÔ2:šH“äùÓ]ïóîô¹…z¡·)ŒìÏ)á|'µoætM¤ˆÜQáŠg^Ï™ -V1-S¸`_3ÄÝËú%6BëbØ r¨Ãt©a*Óغ0ɼ•uï´ñï¨Î)y©@[gbL¦Ç)Ä?ÊDâÐ÷*éԒꟲGê«àI÷_â‚R§—«·>noߢiŒ!L½<©35¢$2MIÝw™ôäs¢¨bâ< ûVÇ–DT£ì¶"Y \FÉ…Cóuø9TcÝI¥zÒ³€‚*lõ™s$a`F éúÀ µ (X×Ñ | |ÁS -5ÌÄ÷ o榯‰‹ûȯg¥Ï.š%~2Œþ  Í“ 60×Ò3îeÐiÁeø¬O3KG·l¯„šÊé:ÐgyÐóud6pD‰+v°Ìb¦N f‹Mh¯Ëaˆ>.`È.kŠI¡iøòØ"ÌSˆå0ÙÒ—ûbûj¹D䧠Éj§×òáøg”ŸV0½ÐMr’å»fJ-¹.%â.ÂÄSL”2 „Ä`4œÚÁ¤7\N>frÖi¼ÝÏPúTì,9êÈ@^'äMuèï\ ékJj§^ æú12Ït¦„LVéøŠ>iÜ猆ž#Z“ƒÎÈVO8Îʾu™ïѶÏÐÔfh=}̹öm{âý”²¶£ÆI±»põ-þ¹+ýZC—±­ËôKoù‰n¾”×üßòË?mztÖ9ÖåçÄe/°¥Õ•äÂúö*}”6è½ÞQžKþ´¤À&¯ö·æøZà]íùu¢`ñÁâ°æÈzúçÃîߥoË~£ÒwRbˆµU”ox±saóÝÒ÷ÁÜ÷Kk ]ö¾Ì3I·/ªÉm,KgƒwõÇ–ˆýIô‰ù¥òŒ¿Ù=f£ïe€üv™ý‘‰>&6±\/í¢AÄé#$?)ùòÍžöÇÖ£~ª~$øÄ:Ö|¨é!åSš‚@ÏQi7KÜAUØÿœ fôì÷1Ašá¯s`„i[ýĹŸÎzÁÒ]ÌKÖ–d8Õ^ôûÄÛw´:£é´* cõ‰ ¦´¬V•ë…ŠÚ4ú™B©î'Œ÷4Ó\fKÇEòVÄg$O·Æš{yÊ %¢€þäÍÙW8únïy›ãaü%?:‰ÄK¾Ó͘ro\§Ø‰Ü>ÊßÇÆÒ_ÿÉ ž {Ôúõ£ Í؃k ‚˜½Êb9™¡ ¦ä1‘-kˆ2n„ý—_ÛÇØßœ7lh¤³6»Ø¾ÞJ aI¥’§5ÍRçƒø?Ñì«òw¡óÐíÚ§X¡‰z–Ÿ†ñúÃ&e“v”3†­ÉÞ&™)ƒÿÈxbý'.¼Ï\ ,P³Ÿ±‡Ý'8þààõªckêUPe¤cne„&žÁVóãpÜ Ê½ö>ÄÐ -½c–$îSÓ5¬´0ÏÚEdÊŒ0ƒh(‘©ðñôä‚Iµ±¾»Ú» :—2´Ä!<|^Þ‚X2›/¾5obÿd¬ë¥KºÃwƒø‰Õ˜ÞMG0C&ÊØjãž;áÔ+=ÃÜãÍEXr#à]Cg "}Yá¾.¶aýìY³ÆIˆ/^Y»}$oί8 lU†ø„=O'aFX²Åï9hRÔ¤[ÞÞ[ù~ˆ[ró—M~“j…<·ÑVG½‹Xî//¨šá‹ÉVà²hÑi·¢·æÉå6I?,·%F\œÖô™–@êõ~ø†Yý E>eUλGwü^‚}« 2ë$¶Íð‚ -ïcñ•ñZ×™b”[DÌÛ³>Â&Õ—ÂaY Kê{@”¹¸’QeUSæX6»ð¯CvòàªÇ£hœ½a¢ª§é›ßôóƒòêªÎ1‡(‡(-Ô±ßV”ÓyCC..& -®Æã -7/ƒ[\ÉcçtFqóÍÍhF4®¾¡õz»Bö¯ ÐØóÜE™Œ® #ôÃëÅš[È -ŽM®Aµì)ÅŽ¡ArjgWLØ;'·p -²RV¨Þ ˆ|Ør…²1ÇP‹øY1™ÊïabÉWw:ÜNñå$‘œ¶jµí{ôé‘éÉ®˜ ,éV;þÈCÓþÇQá½DdÁ'†RG£/º÷ê‚*8VŠí_ŠÀÊëó<"•{•îÛá[w õ(FïVqQß¼óq–Qõ vÕ’Tw͇\÷Yd›fÜÞ>ÄO¯Þû9÷aZjümµ=!À›œÝ>ÜüïQ3Ù¹åÔ«^ ü9â@"ñF/h•>þl`|ò\ÕIh=n‚ÜL'¿õkµf9VÒjt‹ƒS~÷Ò¤&ÀŒTú'§$à3ã!Ê5vÿÃJáËÊïëØ# ¥UÀO+8‹•sø€£ËùXh[‘Ñݾ²—KÒn1gy‡OjWÆJøÓu%,#»vlõꀖÍF¶d À±/þˆ×Aù=¦¢å3&×ó“úc6 éô“Å^›$oφ½ÏWÖ´u²Ý§¤Æ4vLA‹–´TÅI±ÕªBU! õZÓ¤ö¥<1dÆAZ}ý48Ì3r:AmÑ–“xø3ž¤È¢U -ƃ>³ÖÕ;À'uãá`:?Ó+Ôx`ïq–΢vIÀr= -ȘóiÀù ÿK1â Ýc‡É…ã9áU¦ÊM{]\¥fWª OÍ7ëhºµ»œçõkú‡[Ýs*©á(DŽêƒØ·eQyУ¢ÞÏnXÖ>9ñB•§?&X^`Ú­T¤}ðØ—ñ组ûÆi “R§×ç(¦5ác¿3ª¶é­‹’ùj>]¡ƒ‘²Ì ËÊë)&œìÙæ”åžR±Ì¤¡0Ûâýð±[ùW¯>óÑ{EO“–C6Q ãvn·äO0€%rTå«…„Ò„û(.MŠý!UoH!¸yH¢ÔJ{'Eƒ¸RñmS5íûòÚD)ä*‹eü^l½zbÚÔE$±IØ¥œ…ÞE¬ÑÂP7L¶Áw¬•M–x–#ìøÞÈ'žYƒŒ"_¸?‘ïªjy@ Í+ì”]¹N5yßéýÜèŽn rJp›Hñz‰/DW‘k-4¤¹m^‘‡gq·3ÿл¾ˆýØî((ŠyÞ|@n Àœ(–Œ/&|SÂvºJK°gß½v9§ðjŸ:#"ëòn—ŠÜ &¨¿>P´DÁ"]ý6¬àò‹Â‚ôòî«î”Zçï3~h{5?øt@ú¤‘vÃu}ÎRÞúf{åäj›fìZÞ‰²ÙOàŠ'°¾¥-¯ª…|U¹ÐüpRIyyoû1oBÎv’K ¹\ÇÌ|ún6óÅ=¡³µ°gǃ­-¹½Zª/¨lÝ4nlŽ°U-oMôÙ“ˆ o:œ©Í|y„7MT{õ ¯=i3RÇVHA9jQ¾rÁ3ãaÂ3œ´X_¿ÆdhÚ—E/Oö\ìKɬÝOõš_·— &†÷ê$ÀuæbsAƒytN.`.šâb™Ê¥܆€ð6é瘯l¾}êÈg|ëwRŠžhXŠs×L84ØGê} 1Y³mgzÑìÅÓŒ$»9ñNh‹Í”ŸâÕ÷ºXsm{Ôg"'H±¨ª®RU\O¹<Š>ÊlSñ" - ‰ôt.CB±|…—(z?п)|Æö…›‡8csa4«ªy=~U»+jð*Ì8Ó“«&ÐÐåÇw?´,IpöÛ7oå¡#½Ëõqw¾}eüJü¢šïUølœ]Rçm‘LغÂ=Îk¡·ÐóKJ;œuY8:B.²åžðŒC\„0&õê®X¨ÕåsÊ;2•©`‡¬#¿Ê"ÿÿátökä÷g\âiì.¯(å»T·RÞç-ɳ/%º‘|™÷ó§qWru?̦hΑê¼7ôòÀ…U^ÎK:%į v›AŸ7pè1ÌÇÛtOn4 -¹Ø+`‹ï—Rp 36‚FŊݹÎ%:b‰»•¯·0Î&SwjÒ V‹­C%#N^©Û™KuÓÏy,ÅEŸq&¨ãò8¿ªÊ{D LGÌ8½UTmÚ5leUÍ?6¹6ÞÒ6!-+ÁöŽ·¶¯T(wu9eQ–éáö:Jmš»4 û_}ö~N†ŒÁOkôÚ‹Ö»µ§½Mìð}íîɲư™qÀ“ë`Á+–»5ãéö×­d[%˦×÷[M–ŠÁÃ#ߦT\Ú*wqªÝ¯¢Øg”‰˜÷Õžà$²dß]Í|®yó9¾è?)ì#IiwñùŠ€%z :õÔÝ3°ˆKzW†Fc¾òm={‚ú³8uL‚ÂôwÌY«|í»U&›±”n{ÀeóbL=Xûy*áwSYø"FžN†j×'›<ºÚyÍ7Ì4`u¹§h‚Žï›Ô'¥o¡í×ðê•Ã=)2—½«ÓõYæ©9rd…Y¾qÏà`ÞrR‚›FWM†Ð¬Œz¬ì^ãë[‹=Cù¹‘©nßíÈQ”iÇ5ÒoÔôÈ[A}s…mºŠf?´?“½Ë’: Ÿ’òÏ -M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿÕyˆendstream +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå` Ye% ö}»þöÕ¸Ù¤¶—3ô߉ôTáÖÿ8üb’–†{‚¼9y„¸Aœ|7rx¸…ø@"|>ÿ"ëo"ž¿ÎªHW¨'Ȉ›‹››tóûç÷¯“Éßhä`Vpë_{£…´€Y߬Ú? ¿`+7W×› ÿ~ûo +ÿóü{é!Oˆ`zn%lŸš‘†¬"Ïéé—5úÐÁƒÑâ\\£ý:ß¿Þî—¾(Rf~QÂU;(zÕä5¾í|¹ªÌ¶ÖÛAæÈÜž ÙË£ò¡g}ŸO4ÏôNˆ}-lZŒŸöU/Ê{LeÓP[wm©_ó™iÑÅ=àà;>WìýSVz÷|R†g_«”·¯´ÖÞ"®*ØþÊ”°yzÂÜÕ÷±§»ýðîûUJöìW8Œbî˜øL‘þ.Ù”O uJåÊߪݎË;BbubÁï<_^Ë¿Å`i¢KÙÅy¨yc@–‰Ÿ'\;ø$·®Q;S-”âs/, 9D¦Ô#,9ƦïKv²±SÐúê¿»èçö‰%…÷²õ-âÁ]3ëãÝ“±Ñ][™CæºÊlëŠÑLü‹¦ëÀ¢€5‘ؽrô›ìç3üÜ°˜üDÑSjÛðôä)Wï8Ž*öÜŸèž“3@'}~+ÏÝ6‘žˆ•Ø\Žpµ<züuÚ>AbåPóبLbZ÷a3ÒYÍEœVÁ= ¾‹­{·^®2<¿}5aq€©ÿ_5¹Ûðòµ÷>›À¥´ê$C}ÀXŠ¹­œÕ÷ji—û­€G‡/§Œdû-!j¹;Ë6#ÔÜŠ.Oé­×ôÎc´¼$z¾I(ñØÇ/ Wj®½"¹ßKÒÿ¾ð{Lš¿ÞH¥hԻí:iÓFRF<g] Û39}—ÞÞF™8|à0­‰å‚Ô"¦¯£G$¼ ºêÆIª˜Ê΃ .–Šô‹µŸE·ÛCqüQmæoi\7yªàmûŠJ…0:næÅÊØê®óÆ XeŒ`Ãé’_ÿî½jâì…”Êr‰ÇO„DŸÓÕ6xÍ·o¯lŠýP¦ÿÎ*5„$8d”#ÙiWtu¿÷¾žG= kŸoHÉ]˜Ÿ:ã3ùN»­g}„™?&ì +b݇a›yKÜ£%t×TcaÖËF˨?B:äÐ 3ÚZP ‚ÌÆŠ} fñφôˆƒTU‡J鉽žj:»«Ï‹ºôN)/ÂÕ äE½¬^gº‹ ^/«k¯&6Ö7%³"”-ήQËòÍ“ ñÆ‘r¾“'#LwDEëЙ}`?—$-`¤¦ÍC5Õ‡ 9æ3ÖXïžÊºUFC:ׇ¸T<íàìe¸z&îÄŠù @Õ!˜- “Ú½¡…´cEҼŸýÍó2¦±h’—Y#ªªÇSÀìjzaT €Õx…^ÉÊ9%î5Fõ¡ƒ…™y ×±ªälš2$g$?˜ß{v€¢è§à,¯ŽÀnD£ÍfGªªSH4‡S"€ÚóôöóãNƒ^œ¤ä½t!¢+ÏøÝ÷n©X#õg«uW ³}ceS÷ö¸ïcZ¦BF%×# èS=ªbÁõËFñÁp%ˆ&ˆ÷Ñ ÿø‡@§{›Â§ F$ +ñÀèHvo»Vüy½¼Òç³³”ÎjÁÕŸ,_Âh^§–p³/â#Ó„HÊÀç„»ûÄŒ[‡¤Ê»B8Ò¬’%PË ™#¹&}Ô7uo(à–îu•úµÒ95ÀŒ¾?ËêcÕ8—ÄñâθÑ,™ê:f”†.‡Ðà¡ÝõÁ41hÀ›3):«;Ícƒ·ú‘¶Þ,èðY½:Nç5u…QEð ‰rŸ–²ÌûŠ!&.ÜYâü×É ú;á$¤`×yme~b©@{•3*¹‡ô÷¤” ¥Åêg`iDÕ˜|)1IŸ\°êjñ˜Î™+ Ä&j‰wé„™–£Á{÷…á«-G3µ«®ô*UÅmÖ­ïè, ï!¦ öOµìl•yóâúŽàäç?MµŽÇ¾Ä팼®sÞÀ±x»åÅ!¼´œ®“X>ÒIÙ»—X,×EAœ;¯è%Š]"N?v6ÁnÁ$W¥0O«W4¸»Æ—NQI…>Äóq†z#ÚQû3]º¹Ñ +·³®pBk¾j0ĵ¹Žjœßç]ZÙŸB dŠÌÓš­U• +ÂIÛ9ä‚·œãƒÂè©õß½n^(Á•Ýh´7C¶¦2„K~V')Ïï±^š}zTÉúÔu?£F-!z_‚¬šÉÉ/U‚og4²Š’.§N™EhôáÍÎËåÔŒL^ѽð¹œfCÛïPI†^ÔLʸðˆ§/çÓö±’¾¿Ÿ\S ³©»ï™ή0‰Ú·˜O%”çp×ù1ÔA?P(åÞ.¤gÔ> +ó¥ªÕl^Œ¨­Ý)e»ò3Pp[´dbõ¬ðVŠÿÒ³Ü4Å+β&VÊBÔ eŒCuOé‚¿# U9fiêCl·\r«ÒzÃÐWü®6êb1~i“EÉ5ÚÒ A¦¹§üÑœNƒÇ=< l””íyIæj%‡¨äÄiñ(<ÈO› õ;Zõ}¾TªL’[î^åÛA€Z…êþHKJühØûñœq/fóÄf¢8³?€æ¢%K]TkcÑøKEÄL1‡•·FÆîšÃºåØ KCÂCkÇxG®ï[v“U¤Dx?B;/³j8Ï,ã)¢ÉÏù٠űZ,wyð#½Ï«ÛŒr>xŒWÖÆú|nòÚ¸ £Á'¼Û#Í5C²&g«=O(½m°’úb6̶˲G„¬8Uc¬ÿ]ºÍ¼¯7A•Â]Êuþ 0œL2ä+¦ŽÀª²m>us¶„*6ºÏ‰l¾Ü]"¶ëÑ‚æNé9´v—ÈäN¼¥{– ñ°iÖÅ«Hºv!Y %Šžî=ó]©8¶á7ÎR8v4¹ïŽÚw²ts`üŽ<ÏJÅûŽç÷­F¨–¸ZçI°~¡0ÿ00+38)XAM&H.ž:lê}èt«ÈÃŽðÑÔ†2OÔé¢S;ö ·¢¿O±N~VRæ芆Ž@òÐ`"䉡âÚÞ Ç1gWÍçaÕˆ¬±³òÚ*|“ ML–"1fäV½C«Ç3g{©ybí Z) BVÉ?+¢]ìOdaòÏCxy&&üÎóØáå½NRºu8ì§$¥ýuÆEžÇqU-‘ŒOqv´£ÝZŒ¦Ì@F~êºa3>hŠ j-Š"TB«Þçú XB‹ÑN +‰ÌÙd%JWܽóµÈT¿È$ÿ$H~@²&jM¤Iòüé.‡¿÷ywúÜB½ÐÛŠFög„”p¾áÚÀ7sº‰&RDî(ŠpÅ3¯ƒgƒL«Œ˜–)\°¯b„îeý¡u1ì9ÔaºÔ0•i l]˜dÞÊNºwÚøw T甼T ­31&Óãâå"q è{•tjIõOÙ#u‰Uð¤û/qA©SˆËÕ[7Š·oÑ4Ʀ^žÔ™Q™¦¤îŠ»Lzò9QT1q†}«caK"ªQv[‘,P.£d¡ù:üœFª±î¤R=éY@A +‡¶úL9’00#†ô}à…Ú¬ëè¾>€à)…fbˆû†7sÓ¿×ÄÅ}ä׊³ÒgÍ¿?FІæIP›˜ké÷2è´à2|Ö§™¥£[¶WBMåtè³<èù:28¢Ä;Xf1S§³EŠ&´×å0Ä0d—5ŤÐ4|ylæ©@Är˜léË@È}±}µ\"òSÐd5ŒÓkùp ü3ʇÏÎ ++˜^h€&9I‰òÝ3¥–\—qaâ)&J™NBb0šNí`Ò.'39ë4^€îg(}*v–õ +d ¯òˆ¦:ôw.Œô5%µS¯sý˜?™g:S &«t|EŸ4îsFCÏ­ÉAgd«'geߺÌ÷hÛghj34€ž>æ€\û¶=ñþJYÛQã$ŠØ]¸ˆúÿÜ•~­¡ËØÖåú¥·üD7_ÊkþoùåŸ6=:ëëòsâ²ØÒêÊNraý?{•>Jô^ï(Ï%ZR`“Wû€[s|-ð®öü:Q°ø`qXó d=ýóá ÷‡ïÒ·e¿Qé;)1ÄÚ*Ê7¼Ø¹°ùnéû`îû¥µ.{_æΙ$ŽÛÕä6–¥³Á»úcË Äþ$úÄüÒGyÆß쳈‚Ñ÷2@~»ÌþH‚D›X®—vÑ ât‡’ÆŸ”|ùfOûcëQ?U?’N|bk¾ Ôt‰ò)MA ‡ç¨´‹›ÇŠ%î *ìN3zöû˜ Íð×90´­~âÜŠOg½`éÆ.æ%kK2œj/zÈ}âí;ZÑ‚tZ•„Œ±z‹D ÓNZV«ÊõBEí +ýL¡T÷Æ{ši®G3È¥ã"y+â3’§[cͽ<å†Q@òæì+}·÷¼Íñ0þ’Dâ%ßéfL¹7®‡SìD nŸe‹ïãF cé¯ÿäφ=jýúÑ…fìÁµAÌ^He±œÆÌ€PP‹@Sò˜ÈÈ5D7Âþ˃¯íãìoÎ64ÒŽY›]l_o%а¤ÒÉSŽšŒæ©óAüŸhöUù»ÐyèvíS¬ÐD=ËOÃxýa“²I;ÊÃÖ‰do“LÈÁd<±~ŒÞg®¨ÙÏØÃîpðzÕ±5õ*¨2Ò1·2BÏ`«ùñG8nå^{bh…Þƒ1K÷©éVZ˜gí"2eF˜ˆA4”ÈTøxzrA¤ÚØ?ß]íÝÇKÚâ>/oA,™ƒÍßš7±2ÖõÒ%Ýá»ÆAüÄjLï¦#˜!elµqÏpj•žaîñæ"¬¹pÈ®¡³‘¾¬p_Û°~ö¬Yã$Ä/‚¬]‹>’7çWœ¶*CüGž§“0#,Ùâ÷4)jÒ-oï-Ž|?Ä-¹ùË&¿IµBžÛh«£ÞE,÷—TÍŒ‰ðÅd+pY´è´[Ñ[óär›¤–Û#.NkúLK õÀz?|ìþ…"Œ²*çÝ#Š;þ /Á¾Õ™uÛfxA…÷±øÊx­ëL1Ê-¢æíYa“êKá°¬†%õ= Ê\\ɨ²*‰)s,›]øŒÆ×!;ypÕãQ4ÎÞ0QÕÓôÍoúyAyuUç˜C”C”ê؇o+Ê鼡 !‚Wc‡q…›—Á-®ä±s:£¸ùæf4#WßÐz½]!{ׄwETè ìyî¢LF׆‹úa‡õbÍ-dÇ&× Ú +ö”bÇЃ 9µ³+&ì“[8Y)+TïD>ì ¹BÙ˜c¨Eü,„˜Lå÷0±ä+ƒ;n§ør’HN[µ‡ÚöÎ=úôÈôdWÌNP–t«ä¡iÿcƒ¨ðÞ "²`ŒÃ©£ÑÝ{(æ¸ËfÞ.Xçtri¯h¤½8òž¾³pKÇù\ëþǬÐ(oÈùÏœO5†wªÒÝäÊ™ÙÁæ)ÐúÃw¹¿Ýî\d?  å$µ² ?(°¡Âòr>9ð–u é '8°YÒ§hZ³”£ºØƒêÉÔöwl"éWißÈ8¢£_ø7Wlõ°ÙïLE ¼«/£â¼u‘&õ}\GuA+ÅŽö/E`åõy‘ʽJ÷íð­;z£÷ «¸¨oÞù8˨z»jI*Œ»æC®û,²M3noâ§Wïýœû0-5þ6ÚžàMÎînþ÷¨™ìÜrêU¯þq + ‘x£´J60>y®ê$´7An¦“_ƒúµZ³+i5ºÅ‡Á) ¿{iR`FªFý“Sð™ñå»ÿa%€ðeå÷uì†Ò*ড়ÅÊÎ9 |ÀÑå|,´­Hƒèn_ÙË%i·˜³¼Ã'µ+c% ü麖‘Ý@;¶zu@ Ëf#[2aPàØÄë üSÑò“ëùIý1›„túÉb¯Mˆ·gÃÞç+kÚ:ÙîSRc;¦ EKZªâ¤ØjU¡ª†z­iRûRž2ã ­¾~æ9 ¶hKI<üORdÑ*ãAŸYëêà“ºñp0Ÿéj<°÷8KgQ»$`¹dÌù4à|ÐÈ¥ñ„î±ÃäÂñœð*S妽.®R³+Õ„„§æ›u4ÝZ‹]Îó‰ú5ýíî9•Ôp"GõAìÛ²¨<èQQïg7 ,kŸœx¡ÊÓ,/0íV*Ò>xì€Ëøó]Â}ã´„I©Óës” Óšð±ßUÛôÖEÉ|5Ÿ®ÐÁÈ Yf†å?åõNöl sÊrO©XfÒP˜í‹ñ~øX‚­üÀ«WŸù‹è½¢§IË!›¨„q;·[ò'@‹9ªŒòÕÂBiÂ}—&Å‹þª7¤Ü<$Qj¥½€“¢A\©ø¶©šö}ùNm¢r•ˆÅ2~/¶^=1mê"’Ø$ìRÎBï"Öha¨H&Û€à;ÖÊ&K<Ëv|oäϬAF‘/ÜŸÈwÕFµ< †ævJ€®\§š¼ïô~ntG·9%¸M¤x½Ä¢«È5ŽÒܶ?¯ÈÎó¸Û™è]_Ä~l÷?Å 7`NKƾ)a;]¥%سï^»œSx5O‘uy·KEîÔßÇ +(Z¢`‘®~VpùEaAzy÷UwJ­s÷Œ?´½‹š|: }ÒH»a‚º¾g)o}³=‹rrµM3v-ï€Ä@ Ùì'pÅXßÒ–× +ÕB¾ª\h~8©$‰¼¼·ý˜7!g;É¥ƒ\®cf>}7›ùâžÐÙZسãÁÖ–Ü^-Už&( +ÖËÓ»ÜIFÙØS­˜õOV_ºhýÐn-® +X{$¢½‰¼û£@–rlZ™âɞˊ1o(­¶¨mèö¡Ðé»÷ÝõäIŒ]Œ_-ô‹ ¸Þû ò'zŸT¶n76Gت–·& úìIĆ‹7ÎÔ‰‰f¾uä3¾õˆ;)EO4,Źk&l‰#õŽ¾„˜¬Ù¶³ ½höâiF] ‹œx'´ÅfÊb\ñê{Ý?¬¹¶=ê3¤XTÕW©*®§‰\Ee¶©x‘@†Dz:ƒ!¡X¾ÂK ”G½èß>c{BŒÍCŒ±¹0šUÕ¼ƒ¿ªÝ•5xfœéÉU“Nhèòã»Z–$8û훎·òБÞåú¸;ß¾2~%~QÍ÷*|6οÀ.©ó¶H&l]ážçµÐ[èù%¥κƬ!ÙrOxÆ!.B˜“zuW,Ôêr‹9å™ÊT°CHÖ‘_e‘‰ÿð:û5r€û3.ñ4v—W”ò]ª[)ïó–äÙÀ—݈H¾ÌûùSŽ¸+¹ºfS4çHõ¿ÞzyàÂ*/ç%Šâ׻͠Ï8ôæãmº'7…\ì°Å÷K)8ÐÁ@£bÅî\ç±ÄÝÊ‚×[g“©»5é«ÅÖ¡’'¯ÔíÌ¥ºégˆ<‚â¢Ï8TŠqùœ_U å=¢¦#fœÞ*ª6í¶²*æ›\oi›–•`ûlj[ÛW*ˆ»ºœ2Ž(ËtŒp{ˆ¥6Í]š†}„¯>{?'CÆà§5zíEëÝÚÓÞ&vø¾öŠ ÷dYcØL‰8àÇÉu°à•GËÝšÎñtûëV²­ˆ’eÓëû­&KÅàჃ‘oS*.m•»8ÕîŒWQì3ÊDÌûj OpHY²ï®f>×¼ù‰_ôŸö‘Ƥ‰´»ø|EÀ’=PzêîXDƒ%½+C£ˆ1_ù¶‡=AýYœ:&Aaú;æ¬U¾öÝ*“ÍXJ·=à²ùˆ1¦¬ý<ð»©,|# O'Cƒµë“M]í¼æf°ºÜS4‡AÇ÷Mj€“Ò·ÐökxõÊáž™ËG‡ÞÕéú,óÔ92‚¬ ߸gp0o9)ÁM£«&ChVF=Vv¯ñõ­Åž¡üÜÈT·Žïvä(Ê´ãé¿7jzä­ ¾¹Â6]E³ÚŸÉÞeIGOIùç…&˜+ÊZ Sl© +Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀO¼y©endstream endobj 1627 0 obj << /Type /Font @@ -9716,14 +9712,14 @@ endobj /FirstChar 66 /LastChar 78 /Widths 2145 0 R -/BaseFont /WCEADK+URWPalladioL-BoldItal +/BaseFont /PDJIPY+URWPalladioL-BoldItal /FontDescriptor 1625 0 R >> endobj 1625 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 -/FontName /WCEADK+URWPalladioL-BoldItal +/FontName /PDJIPY+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 @@ -9739,19 +9735,18 @@ endobj /Length1 771 /Length2 1151 /Length3 532 -/Length 1712 +/Length 1711 /Filter /FlateDecode >> stream -xÚíRkTSW‘ª¡¬òRIÕzX%2yj   b,žò˜{CnIH@Ä•TeYÄF—ì?ØS1ç˜4 Gt ‘Íd³9$‘ÜïNÉÓš‰Q!hàò|€Çåz -9DdÄ@PÖXG*f1QŒ ¯Ò™\ ÄpÊä¿ú°K gfN¢o.`¥MÎéÞ$öקa:c0¸<²{¥/àóع"*´8£ÄÔø½‹•é) ë`ÅrSømýtßéíµyâê®cöôÌ…¦#[;Îo;eòc÷ù¹\Ç›~Š†?úÍy›ó§Èq§Ò‘ˆoX’×O=-Ê1d¬m½ÎfG7zå~Ù¬‡Šá¤”—ËÛÛ>ÐÜqϲؚÑäýðgÏgw³ÎÛׯ¹ÏáWQGŠfÖÞºùêI^ú¦Î~‹Ã×çP)%¹üÌš½pì?ï_x†Uc–šËó“ö?s}m¡¶ÝéI¿íhË¥v7Lþ/ç°é:å@'…s }±%¾L°Z&œ½Ðçzl… Ø|èïaŠhiŽþ:{°›.ô0½ß#)È- “ÄŒ.8V風] ö«¡Ú më[5èÅBkCTKzC׿„“Ñ´—¶.uüí·%;g>M~ñ¢ïù#µõ¡Âàaã~bFœ·ïÀ,/ïaz›jí ³G‚\õÕ=BÞç°ÊØ®ù{à@N˘Ä nä»Ý<ú…§…K¹/×ì«ø›t½÷·Íæ=Ib áúñ@Õ£]j5঄'ö¥ž¾å}¹®ñBuˆk]áÌdsshhõ’æÙXï`Ð|×…~sDIÖh Úe¹Ø£+~ :—ã›_t\ès°ç¥ßÐO¥1榑#>‹ò쇶,HßÅ|½Üàû«ÝùˆºT}—oÝIóó–탢sQûÒ×FÔn×è æì=&hxı«È9÷TÔüƒ²/õ^›ž-§·Ó6\©{L8G¾¨Jeâ g[ÛPµž7dqÏ~²ç—”öº'àȺC5†Ý›>¾µrÑŽ ¡Ã@ï €š!þ¼4ïÍÖÑÞ0­ƒ³¸¹#Ñ‚Þ;fºóc?"Ürî³ÖÓ?þ›¥­Ôú ÿ[Åà:+£ lu‚w‘íÀ j©ÒÔ¹Ñ 7ëå yš—ÅÝ,uý^òÔ5·d·‡´Ã¯NV—Ʋò¬½«Nùxkƪ„¨l©ä´z¹ÍŒ;3Çž”º[Ÿá›^ ç7Vì‚oWF®­œð¿Û=¡Íw½2RÔùË™R¥ôM¢loê|e¶^×5/»¹»lS….˜áµõÌ'†/¹_66m¶™‡¯•DBßÙª:¶_w½ë¨ál‰è¸ÏÆwؽŸ[´šJý 5.­Óí¯/³öÝy);æÃBó]¯X÷2qékÛ„Øú¡Ûò¤Ã\¡K“¢©Á¸çbU‰ãDZê`¼,º@Ñ~;eËêai}ã‰Ý;8‡T9%Ýs [f-ܹùg·Ç˲d•_¯8Ï/ÈŠ=Êëœó½çâb¥äž*×L»'î ÏyøÃÐ{ö!£KžÄ5¾°ªúÎøV”H†¯t‰nµí¡Õu«›kÊ -÷HçÖºlx/ÌépÇá5'ÿÝ%¼ÏÚǩˈ—¯O-wûVŸZÌ é1> -k]“ ¡GZ±ǵ}M.íÌü|QYP÷]#ª”ÆÎëåù¿ 1²FêD{õþ9œ˜|V@û,|±ÀnÖý®&|þ]j p삸5ùZï—£Q;ù/-É,zr1CN¬êáͳl|šy¸ šZ7Àþåÿþ' -(Ô°'0O§üQsŒendstream +xÚíRiTSבª¡¬2©¤j=,Œ‚¼ŒBBˆ „y’˜{CnIH@ÄJª²,b£KFQQ*¬*u@©%Váp"­"<`ù,Rµ*N½`]]¥?Û_o½sþœýíïìýïlšK¸”.„° p†t6ƒ-‰˜Íä™Å¢Ðh8,# ”°°ù|O°V£œU€ÅpW ¸< + `:ISÀ-À}ŠÄB5Œ#r +$2B «Ér™ +H19:ªT rêF&ˆ„3a< †6@ˆœà4¥0§4‰Qxo`H“ñ6•㙤(à6-Ó"! Ué+(ÌuÙ &µü²fÒ¨Tëdê©òÓNý%/S#*Ýï L¡!`H0ÆÑ™ÔXø8 !õ̬˜©¹MSÁ€Î^Í`­~ƒ#™Aˆ†ÂB® +™*žÆaš©„ôoZÓ?Ò?,"Áã÷¯N†Ë”ˆÒeÀ€õ{:fÿ“&áˆ$²,›$’ûí)yF3*Ç M®'á¸LG!‡ˆŒ¸@Ï +ÁZkIÅLŠä@:“ N™úWO`ªàÌÌ)ô ÀÌ´©Ù#Ý›Âþú4L«§¯â:‡K¶b­ö<.+÷OD¹Ça”˜Ò ·±!=…a-,§˜o`rï-ï=µ­6OTÝuÔÚ=s±ñð–Žs[O½#}Þ×ð¦¢à~µßjÿ1rÌ®t4ô+&¤àöSO sLz)sk¯½ÉÖɽrŸtÎùHRʬKåímï©l¿k^:”ÑäñàGקw²ÎYׇÝc󪨣E³koÞxù8/}cg¿ÙæKÈu¸”’\~:lóß;ÅW&ïcÕ˜¹æÒ¤}O_™©m·{ÒoÙù†r‰Õu£Ï‹y,w­b “ÂÞŸ¾ÔWÆ_+Ì]ìy-¦Â,Þ÷q1Æù¶4‡J~™;ØíÎt1¾Û#.È- ‰G-:Zé ¯]¤ò ®¡Z m ­j_ôBáPCDCzCǧ„Ñ´‡™:ñ’öë²³Ÿ$?Þ÷ìµÚú@®w±p>>+ÖÃk¿_–›Çˆ{‹j}õ3“K¼LùÅ]BèÒg³ÆЮþ·ß@N˸Äñ¯ç;Ý8ò™«™C¹'˜Pï­ø—$ÁãëfÓî$‘Ö‚ýp êáÏ[ û9)A‰}©g¢nz\ªk<_èXW8;ÙÔT½¬y.Ö;è¿ÐÅ×q±÷|;aÒPPî4_èÑßWžÍqàNN,9&ð<ÐóÂ{ø‡ÒhSÓèaÏ%yÖÛ¥ïdÜZ©÷úÅê\h]ª®Ë«î„éû+öBQ9ôˆ½éÇjCk·©uøóöå7¡Ïâœùh=×;)íUïáȃ5ú]<º¹zÉöõÍ@ï Ÿš!ú´4ïõ–±Þ`½¨¹#ÑŒÞ=j¼ý}?ÂÜ|ö ½ÆÕ'î«å¾­Ôúóÿ_AçØ+¢ô,U¼G‘åÀ$ j©R×9Ñ §¡Kþ²47³³Iâø­ø‰3jjÉ0l "h‡^ž¨.aæ õ®9ééB„W Pérñ)ÕJ‹Y·g?.uzŠo:p5„×X±ò»Už0V9és§{R“ïxy´¨ó§Ó«$ +ÉëDéžÔ…Šl¶kAvswÙ"» +mÝmËéôŸs¾8ehÚd±_'‡¾±Tvl»æx%$ÆVÍÞË×rž‰ë,°z7·h-•ú jX^?®ÝWR6ÔdÇÅìè÷ MwÜbœËD¥¯,ãcê‡;,Ë“qMò¦Ãî U%¶ƨð²¨yû­”ÍkG$õÇwÙlgTæ”tÏ/l™³xǦ­È’V~™à{ŽWs6ˆÛï7ï[×¥ÅJJÉ=1\,ª9vWÔ’óÌï»÷ w¬Ç–=Ž=c,*|>¤ì;íUQ"¹Ü%¼Ù¶›V×­j®)+Ü-™_ë°þ`»C—Wí|vu”tp?iŸ ® ^¼J<¹Òék]j1;°Çð0¸5,B·b¶ëúšÚýùùÂ2ÿîë;G•)×ÊóB£¥ÔÉöê}óØÑùLßö9øR¾Õœ{\‰ÿô›ÔÞàøyQkòÕÞÏÇ"vð^˜“™îÉÅt±¦‡»À¼áIvø¡‚jjÝëo.Êÿ üO«`N`jžNù ËÐŒendstream endobj 1400 0 obj << /Type /Font @@ -9760,14 +9755,14 @@ endobj /FirstChar 60 /LastChar 62 /Widths 2147 0 R -/BaseFont /QAQSBE+CMMI10 +/BaseFont /BRBLQZ+CMMI10 /FontDescriptor 1398 0 R >> endobj 1398 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /QAQSBE+CMMI10 +/FontName /BRBLQZ+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 @@ -9787,19 +9782,23 @@ endobj /Length1 1199 /Length2 2269 /Length3 544 -/Length 3057 +/Length 3058 /Filter /FlateDecode >> stream -xÚíWiî'Ì5"1@6>”/È ü”Ô†AfR  rà%±(ß Ë0™ËbÁ:}9)8öÛž -Á%‚`HFö3É›÷Öím\8m!®ýüŽn›ÛÜg®¢2Î7Šæou’ :)§WEöúì'üÚ·kPÝÓØ6Ù¬2yE/­"oØ¿QªšóR5µº-NLfJÆoXð~1êŒS¨*­tï×0–ZL˜r¶§Ç¹à÷xÍÖØÀ„}yB[¯\¸ûA}«·Ð…Wó5Mâ~}ý×,…õãï%Û!9uoýå¼Nâ›o_ÑY ¨l .žæ…”êoÕÝ2¬ÕuÖ•ö&¡ÙRóÈúÓܯd=÷T)·–ÅV–MµT<,¾}^C÷\MáþR˾añÁ¦Iø@>P]á)ãЖ¼`k­¿ÅbÑ2­CÌ;uÂ÷„ÌQ…÷yEˆPó@¥ÂNÛöŒvö%÷8»‹DÊÒ”ì~³kZ=O&=78®U¼âE\?¡ àêsÓq¦¸>äjMr¨Üº¤òŽ±Ïƒê®$;GšAöÐÙ}ˆaŠrGݹ#-íùQ32M{? Iô§Lzak„«|…ÜæÝ[“^ß÷Ù‚ü$—Éç±éÕZƒƒ9ñ¦RÃkµvõWË&еb˜!ÝšB¯\L¹¹/Œ”\|­U‘ dh)óão¯Ëû¸½(Q§[¨~"%Ù—v/º p}'²Üô^F„ñ»\?~·‘·z¡<-E)i—ŠYþ³À®]£—vWO ¢m¢v!œ ÆÈUó‚g~Ê~|Éê:žôÚ –żè1œ5ºÝ 6¹ÞʱuÙiž#Z÷f”yÑœ’]^†«gIgRwU©6ßôaØ–Ÿ«œlL -wò² 6óx†l‘}&ï¿GmÛ‹KW2.øf_.䙃’—»yù¹uï°³ÒLÉ=Ò}wG5’ûÃSâwg’±ïh/Ü“V¤¸ñ{]×Àé7(u?®Õˆé±BÅ…6–VÄöìqóÿà*’°€=É­ûðèn^/+3}ýELº]NªbM7¢º¸€4N[YÊɼ}íc­[f¼ªTòÓK%¬ï+;ÿ^òsžÎ›‹ ù.æIIˆUÛÚY±/¦÷ -ûôòH/âÂ+oéLˆËÇO¤Š›9麗òo*d· nFŠ¶–Èá)“É.²©¿¿}]dÅ/Ò"Ý•Øk×xyœh¿naM÷½+ƒŽ÷ÇÏØ -OT¹‘ÞúMv±gûS‹J¤ø¬³4ŒX1µ¹Ù1ŽùÎg’új½W¸TZnzW¯]hnÆË~«WÂJ‘ê.68<¢R@ ¹žQ *^?W+kâª~'b M,k"ÃÊ1KšÙ?Lq)ã÷I™¾ßpl‘_Àõæê´êC´€Ï ÞsŠSt±ÔœwÕÆ4Í¿ØOžä¶"òL&l“†U+<|`x¡×‡Ö§v¡DØt-²’»fcf…ày­¥t¾âNiìù ÿOð?A@¦ƒ$‡Lb!£Y þ¡\þ7Cþ ‹Ú@Èendstream +xÚíWi<”k2ed‰,ñe„Yì¦ìƒtÂ0v*cæ™1Œf±d(N¶²”H–{¥=K¢Å‘µ¡´(m”%:õ>êTïéõíýöþÞçùðÜ÷õ¿®ÿu]ÿûº?<ê*x‚®™Ú1] œh!\6ÈØ®ë +R¹"€C"\]ÝÆ¡ƒËº@  $rhLŽÈ|ܹ€#‘è¡ ‹6Á ¡5Zÿ»#“…ð,Zs7€9 ‹Nc@ŽIↀ J§dWÍä²H  P  +—Ï Ø0C£X4j @¸»zjikëü´`LMM€¨ï€Ù4*Ѐá º” ¢° *œ¼ä‹§mÉ4ÎRÛ"à ŢP¡"Ùl +’rPZP±¶ ² 3d‰€ _ÒGc$¨±(Ôr3˜Œèe! +AþÚ™Šrgи îïÈÿi£‚À­‡6E›`F’QK©Ý¢BÁ¯ fÉLdc£C™¡…Hgƒ±4 +}àÑlb8pX\06úßîà @¦‘8@H…Žä';d)ßöŽD‹ ø¢‘h4@/½?V; Ã%3ô¨ŸîNÄ@mÛæêèð»örýÿð´¶fB´ºc@WÏÄÀ` >M õeý¡Çw-¾ZñDÚßµ¢R:0(LÀô[K–ßÛ +YlhVÄ×ÑÖþÉïÄäÐH €ø9F~hC44Aгìxý_vÈ~ÍaÇ¥Ó¿*ƒø& i¶KªÐ¡‹³¤ ôQÄ=j™¸_=Áoâoº_áoìV *t1zߌ4¶-$ãiRà·Ùù.7ùëñL6méŠC!†˜_0·@)˜²ÙС|…@ù—¤¶ “LcPQ"‹üð“¸,¤Óד‚b¿ï)4¨DŒIpþ “´yoPÃÞ¦ùSV +ºÏîè·¹Ï~á*ÀÓécHÁ6'¹à*ƒ’“Ü"þv y½ïJÇ•)Y +¶éÆÁ¦ÖÍÈÕ’RÉ’‚[Så_!Ïlq®}·Ñ3…n—Ï> —_üÒ&êÆÖ·*5³Þêæ6]’„¦tü†yŸç/Âœa +J5euÂÎ/µLeß8o¥Ç¹`aý¼:(q_¾È¶+çï~ÔÜæ#rþÕœT]³¤ÿÀà5kQÃøþ{8§á]€‚w•1¶¥ëŠÞB`u#eá/´Ìp›þŽÐî3žˆô·‰-ÖÚGÖŸâ>%—䵧Fµ­<¶ºüMk僒®sZê˜gJ÷[÷µŠJò›[…¤¡5ùòQ}…—œC{ʼu,Îp‹Õ‚u>Rò„ß ¹£Jò‹aaJ–A*Ev™jì‹qöäÅ7òû-®éö>žôÚà¸V}FøŠ7aý„*€¹œ›Š3wÀ ÀoÔj“ÂÄ’+nákºí©F9ÃgöÁREɪ·Îií(Ø=-×¼÷³ˆÔ`ê¤7ºN´ÆOÄ}6É£-ùõ=ß-ðÏ +Yž›^­5:˜›o.3²Vfùjù²~*PD¿®È;ÕLj'¦”\kSÆ‹[Ë=‹™,õ0á¿s‹<Š2½-Dlfµ†7… ûú¿Þ™øÞüX/î#;÷´üC§¦vÀ;Už’ý|Ï̃ÐÌ—çø…mþQYÚS{ýn¼â±‡»÷ó=‹.7u*ÇàÎœ^'«·å³¿—×K‹ yå–OÑr׺_ØMÝ,¼µJfü¬]mסòŠÄƒ)œE“?N ;D¿Q†ó'ü½…âÒ4§:Õ'Ë2îËÝYÙbd;çÓ(R:xkŸÝñ Ü °ŽÐålé¯{äl¡Ù^¡sÇ•²ßmÄqtp}”¢Þ{yéÜ&]s™±îÅž Õ%ªò‹xZW½O«ÌFðªÿz¼ïˆ•a/GáþìY’Šh6ùÍñ¬j>›óÔKÓçCîùe3‡0zã ×ŠAU¯U|â¹8—u¶aÝY©øËçX»Ë É'ÒüÊ%ÿüSÅqØÞÂ6^~1ÔÄ´4¸q~ë{­‰á‘‡›s} ìÏòýñ«‘A4‚òYÜX"®¨:sè͇¤èD±bžÖ©ÂiÅ&oÆ›“t‚¨éÞ]°s¤#ÃãKåýötõIýByû,p‚9t"ÍŽ€¾í“™œ”»ÞFð?œ`½oXøîíWMˆÍ‰Þ4¥‘E¯ý˜§nëox”Måføq¿Œr ÖňP0SMֻªˆ(äìº,–$/ ê7å4«îª‰ðK³þms„¥‡vsºŒ³U­SvUÉÃ2Dù%§„Ǧ¨8—…gVïË3DÈ3‹c;ý$J­±=}©ÑòIõÅ )àíÙ^Y˜ð„û×7g琉ç û‚vHF=®»T–íG¨Kó}ÑvŽI¸zH1þF¥¤™Ü‘-<å—öm¬•…‰0šygÇ™þ¤X?"Nw÷˜›…ùõv‡^Ñí—Ú‚Fuû"³Ðj%棢^ç„ EaÒ(O}­¿©}+Eãì,jx¦¨M¾ÍñŸÔïôZ2ØjqsÍÂlÛD¦¯¸þ=š_{?y¥hýI £‡»†ÆÀü< _³ÔûÁg²þl®…oT|®¸õÝ9Sé'—‘­L ²Çú]Õüƒ˜– e!rø'á?ÆO;½øtî “À6—y+·ç¡\su³\ôµÝG®Úz÷ÅóeëàÆ  ×ø·û‚Ö›xÝ4CUÁ3ó]:>ut^^×÷–¯íÑ^í|­)5ÝcÎþ¤:ŸqÒÜ2©óù/¾ÊG³kámE’p¨m¸dE +ÉtØîuÉç¶O2 +“¯æt•Âf(-yõ-RYŽ™T¢ú†î´C‚ƒ3æ=snSª]L…˜gÏ/ ù©¤DVʬïè ñ@6¬&Ü®vÑR]¿ÕçÞ‰5’ý–›ž¨)¥WÙ¦)GàVg¹jÔn«À.ª4EG_G6®Bä+òödòìïåÆ·× Sj ”q™RpûôD¿R÷XÖ‘l9äèfœüC ½¬ÎòccÒ*¯34&ÿ‚röžós7,!¸…yº^å‹ì·ìÛõPð®›MC™:½ëJGŽi`Èî¹Ì¼½.âö6!$œn!vø‹—æ\LXpâúM*e¹¼Œ t¹~ünoõ|EzªJò.5‹`çAݻƴ.&ÔNð7‘‹ºaNF㤚9áGÓ¿?aŠ>ºhsK|íËc^ôÎýžDÛ<Õ؆œt¯QþiU^4§4ô~··ñê™yX²Ñé´]5ê-7}vg«çÆ„›’#œE¼íCŒÂ=ŸÂÛÅåŸ*ìÑؾÁêâ•Ìó~9WE+‚¸Å– ´Õ¥^A^Ã{ôŒ,SzìÊÃQƒhëñà¤äÝéô{ês÷…䃕©îã‚Þ×µ0†*=*Ç´bzmqaMe•±½{Ü>º‰'Σ«¸ ÞÍïcee¬? ŒÊ°ÏMS§êGÖVýp£‘ô•eœ¬®kŸêݳâÕeRž\|p,qý@ù¹Ò_òõÞ^`(v3«¤…"OÔlï`ž<šÑ'êÛKÌ'>‹¨¾e`4!nª?‘&iáœ@–ÜTÄîÞ —h+UÀ’'S\äÓ~÷ºØFP¼U¶;©Ï¾éÒ ÂV±ù5=ýW6ŒŸ¶¨q)&¾óŸìfÏ ¦—Ê$â²µLX1õy91ŽΧ“ê}V¸TÙŒmz_¯[diÁPÈygPÊJ•¹-1RbtxT­Ou;­\²~¶~]¬™›æÈ5ÔuÙ™–´\‹äéýÃ!d—rAßÔ©{Ç…<Ýê>#N©?@ +ùò ž‘êdKdf}j6¦kÿÅ~ü8¯ýg6a—r4¼V)ð¾ô}ãó}¾Ôó¥¢ækáÕÜ5³*…Ïáo ©d ”tÊ¢ÿËþ‚ÿ $²8Ì"+ÍÙÐåÒ¿ü_¯ @¤endstream endobj 1140 0 obj << /Type /Font @@ -9808,14 +9807,14 @@ endobj /FirstChar 97 /LastChar 110 /Widths 2148 0 R -/BaseFont /MQZMVP+NimbusSanL-ReguItal +/BaseFont /JJRMIK+NimbusSanL-ReguItal /FontDescriptor 1138 0 R >> endobj 1138 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /MQZMVP+NimbusSanL-ReguItal +/FontName /JJRMIK+NimbusSanL-ReguItal /ItalicAngle -12 /StemV 88 /XHeight 523 @@ -9838,7 +9837,7 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP£¡O†P@jÅÄÄXòGw$ÌÆ àÐ×1ääææù—åwÀÒýžÛ(˜€íöà G8ÚCзÿãºP(m XÃàP€¼¦–1HCÀ¡¬¡P†:@‘`8@ËÙ³¨Á¬ (('ÀÀÿZ¬ØïÒP|·X²(€r„ZÁn·Aݬ Ž¿]<G(Ò†BÝ~`(€ 쀾í€9XÁ!¿ ÜÚ­9"·ö·¾[0- ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿¡¬ª®¾÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† +JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿Ž‚º’²2÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† uƒZ|™BX‰¼LLIB—Qdt ( Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke ¸éÛR§ö ]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8 @@ -9870,7 +9869,7 @@ QH; ‡á{__bçâ.°ßþºæó}<¯½kb¶Þý9\¥™àpDË\TL[\a·¿«NüÆW¨œµ>¿¥t®tÉQÀRD‚!$Dr£G¢1¸AÌý¾ ¥Y í–.ç#_©ØÉ#¬w¥Å¹ò«|Sþ?Z:è:”—fÆ×’¸ʵhúÏÈ×XaÛfÚœ¯Ú3™B¶“—£Ìü¤‡uቇôä·ÏÔϾʉltãp)’&ÿT+p•°e –íZ­M31I¡ÒÏL«êÈcýªG’«ô"Hx¾çS•ö$Û_Œ*[£n~OYgÚC¢ã® ø LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a*¦Ûåõú/5 JÔ†½ó'lï 0Kf›/Ð^‰ˆÖ½žO¼¡M [If§€ãC `æÔbï1}ÚU*÷i g#™HÓÄ+¸"î2X|F#êLq¶ÀØÙªþr#g <¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ  -†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüV4)éendstream +†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüiî)Óendstream endobj 1068 0 obj << /Type /Font @@ -9879,14 +9878,14 @@ endobj /FirstChar 36 /LastChar 121 /Widths 2149 0 R -/BaseFont /WAKSUB+NimbusSanL-Bold +/BaseFont /RDMFGG+NimbusSanL-Bold /FontDescriptor 1066 0 R >> endobj 1066 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /WAKSUB+NimbusSanL-Bold +/FontName /RDMFGG+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 @@ -9909,36 +9908,42 @@ stream xÚízUX\[ÖmàÜ¡pww—à.…+ pªp‚— Á58„àN°àîî—‚ËåœþO÷íÓ}ŸîÛýîÞ{­1æsαæþê¥h)ÕµX%-ÌArNŽ®¬œlBU°ƒ¹TËÌQ™UdíxyÍPhiµÁ®ö ÿ _iÈÌìä(cæúÂkÛ¸TÌ .'‡‡€/çËšƒû¯@'ˆ@vpò¨ƒ\A{°ã %ãdáærtÕrsv¶ƒ,5AP'7ˆ*°z©ì?³¤œ½ `kWƒŽ¦#33Ë¿NAAA€¹×_ @[;è^î {'ç?2½HȃA—¢-ÿˆU·2“µ»þÑ.€ÁÆÕÕYˆÝÙÊ ô‚±A­ØA®ìŒ/…Ê:ZJ;9ü!EùÃ30dñÒ”ûß}³stòpôùØ ìhùgK–nÎì:Ž`7Ð[™ÿ ~Pþ…Yƒ\¼\‚\ äiaÃþGJm/gП$ç°™£¥¯³“3ÀÊÌ ò[^(>P3wÀâòõù߉ß¡pr,Á®sõË1üKýYýc¯bæ -{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@vE% šš>óß{ÿg”””Ó‹$+'?€•K€÷eR^y¹ÿ®øO/þòáOTÝ ü?urüKò­£•@ðí¼øøWKî ôe6 Ž1#àßõU\Á ÿFLjƒ—ãej^œÿu¤þÿ¯ƒõ÷rnööºÂð;/~@Ê€?±7ƒüG¸™ØÞ뿼ð÷@=Ð?¦ÿÿ óÖÕÌl!éhmÿO›ÀP9°'ÈRìjaóqùËeË?¿CºüÇ— `åäåü§m¶°sA¡/gñ'r´ü[JYG 'K°£5@Ëõe*Í –ÿþ -Ü {þ< —wÿÚ[_ -‰#‡·–b6ulªƒr¨í}™7* Ð1í Šî -Åü~~f†K {5òòµn<Ÿ‘Ð"+µÍ…¬Ìø6_‹æµ*߸R"mærÞ)™Yù§¼f©Ò;$¢)4ƒm‰Òæ숰óÇlÿðߪ†ßõˆßµ:ƒS½$}ôón†DF¨å´E‡…E®û•vX­}Yãïš²¢6~ì<ùцߊ닩²;ÎÊúÅ5ÃV±kÌ*å JÅï†]ç! ½CËN’’çd[Ñb}Ö}Þæ[öÕÎ’‚ëó-ñ`b‡2á­YsawE÷ëlMàÙzøüÆÅbú¶ÍÏ4œ2¤€³‚7¶#]×™±yÀ/u˜Ú44‚üÐ3e`r<#7(uR‹uçÛŠ5š¥Óæ×÷ÅÕ¯¦‚¥v„µ}oPíÇF`<—0ß•værÊ·Û³%©ÌÒ‹FI¤mô¢žô/ËÝqƒŸ†µ}FõD-V;üÏ'«‘ÊŽ™*¶Ð ™Újß ôÑï í_²ÆÍ¥ ÀFKR˳S’Æ~sUñí£û · á Þü:e·}#^Á‰M•øÁš/Ð'FM¹ ÿµ=¾ö6ç¡?R9ôÛf;Qq¹C‘ÐFÿï|ÓBáZM›‘8l#7ÙÅÙ ú³òdÅ"‡3À•`{e&ËP`' ÅœŒÆ‹.tjåø]Rƒš·i‘É°Q|Õa;¿îÕ_¿zøz {îÁ™À—8»´üµÚq=oûõ·k€»fwþȶʣÀ÷çJ¼ùÀß=p½¥n”~Â{ÉPÓ›$ ñŽŒ Ùè`œ“êè_‰:ˆtHlÊÜ·2Ùs79ç ­oÛ§è‚Ô¨ŸOÝz¥ïŠa¯B5 Z®á}ëËn¸àXrouáÖ3>ÄÝ>ßENÎ…¼öùÝhÀ‡•â$â ž`€â¸c)“½â@Íþädz®ÈˆèM6H6Â’é¿9 {5ÑRJ_ö=¨P€–üǸÜS¿‡ ´·¦ºIƒ¬:sš¶_|—qèYoÜü}¶ÆFfHoëǤÑâçîw=õË 5Ämï ¨íZ-~‘½“‚$y†E³dö¬Ó8<|›Û–=:ùeNžÍåbŽÈ;Øÿ”Òj$³ï§0æíÏb‘¾ -ÅWy\:T*‚}ò -…ÉGÿÐJãöÄ{ ¨ÃÈÝÅÔiÜVnnFʹÁtj̧é-ÖÌ÷”–7!ÀýÙ¾¿C¹x—wï\áìŒz ]Ç}Ä?âU GEu=…Ó‹ jaF«AÓNQ(E®¥~°0FHÜdùós D7jé6Ã/Ç“½ÊAdl—ú;WyOAûÓ"Ôž ½Òrã*ÙŒAÖŠ®ðïì”UIhYT¬Ž}¹¬:(k¥ì™š©˜¡%¬½}Ý"ÃòLÕ»÷a”°àmt>u‰fP:&&Õ2€ØŒsRÔ® ZŽ!6{½‡doàgƒÛŸTÕ¯ØFø™G¿ÀÃÙWHn»–ÄÍ8ªÛÈÈ"¼8µM™XÇ„eÇ™¶HŠ`²LؤŠæ]§ÈþKÇÍÓ攟ä²#¥FÔÑ»ßþð³ÓI -³çWD`û9ÒäÝ$ËýšžÅ7—©‘+1ì‘n -eñß3:Æ=ûGÕU¿.Íúø¦ Li¿žÔubb¾¯j&ä©¢ëÝH[.=XÁŽôæU¸²Ã‘e\óJ”EuÒ$,ŸÜ5Ë:»‹¿çzFD@µÁ:^*ÃO1N]þö« 3!Óeg§N,!u*Õ™ÞŽ‘IiÙvÞ’é¬.\¹6áùütc/¹nA¦dCÜkÂüú`zJ$ÕT;ãŠÉÝæ»bðÍ&£·³ô€MÙqP-ž—:ÿ/ù¯y4tbòë¹PAàŒ¯Ú•r ÷χ§5‡»%~ßàkÈcÉÙ~|FÐPç›N\¡3$´ßÉ}W©fžoœx3Rlµà½ÏåmïfäÓå샭G0^CP±¬z¯.ÙÖìS@ÆøÎ-ýýUį…eZ77!›s°ØJ&P­ ˜üspä'ËK¹Ù¶v<ÇÕÀ™ñ§°š¼¥°µÅ·ö/Û0ï´V 5”U¢ƒ‹F¿‚Ù¶Ô•™â‰ýkMšÐ‘û¤?§ïj¢3J¢€ðçºùœŽâÈÄ·•ÙVºš³¾u+0î¯nÒŒm‡Õfe“rà¦&öuó 2̵èä±j =ç E¤ØWÕ·Šü5p ŒÁüuΰ€?—âÃÛºvt}Í“‡Öh&:6UŸVûŸiäˆ28OwÜ;ÖÀáõb¹÷.Œ)ây"¬ üߟŸô©¢íÌÓ”]Î/¶ë‹¿;3Äð¦Úó¤­Óß‘ð¦n_4ŽÄ -W€ì­‰6ÅBÛæ¯"Åç|üž[Ü‚'0{’ˆ”£aL©“¶m\Ãa5ãBÓ€™JJñ,"Œ†K”¡¾»G4ü½59‹Ã§zŒ™g± ¶ÁþU©QPJy½Âú)ÜwUþ€ŒúçiO Æ}7œÌá8šÐp -˜†OÔ¨‰PØøàVß]ñs<å#ýûµf²ÊÌWÄX,K½ˆ‘Р†Gáî[QØ°•€…,a¡ú÷²TG‹•áE¿ÄHo®º BtÁ¦K×*5ôsŸܬ°ƒ÷: -TêCBz…Ejä'Ô cäMí&B¬är¿ùÊÔé¤K0 !Ët_‹û"jÖDEËCžøÅد˜x)ø™©á½òYöý ì])£ ý¸¡ÍþŒ\{.£‡ -s¿6ùýáÜûßa¸lÊqö¦«ÉlÇ„zªu؉¶jò r4irªè/Šð–›ši}¬=Ú±¢ž£±¾†Ž¬VR4ØËã|hwFT+þòijÐú°ých;ôˆ4È*¬B¢ÿ¦€Ð6°$O¶^ÊÇÍ·0~ºSy æ ÍÿÍÂ' ÓµâÙŒLšM½¤gà[A¿ŠÞc‹ÍÌ“[›i±“¿„M¼~®³yE'ÛçI9Ä\ûŠø>ûKÈͧÁæXå°·wžØ#ÝGT¢$5î\u¢;º§”-®18û¤X»†KkÏÅßòû»H(sª“¼xó¼è¼-ÀTÅèÛ‹ªv"1™=¼Ù2'1ýá,BK‚ǘOý=ÄžBÑùë[ÏÓ⟎c@«ne[Ø'Ýà†(ªÕÊuyo߯æá£-º±Ëm=ý„‚W 8î»;<Ú±‹ƒÙzs,l¯ˆ·9Ëu?§\(^Ò‰“ȉ|- -ôsˆÓ Pî—¯böAGЕ=tÂb??y°÷(QZR›Ðs ­dóé¤Í\=*$3ËSfYå±s;9¿â6Œ¾;²e›\«kæã(u}5‰M§ !Ðöe˜äÝQ'-ç{÷óF{ …ýPë&=¼|ˆÙìÌ&Î’ÆåÁVí*]÷!ž£uàµFØwhIÏ)ò¹îÜäHYù -ža“î‘fh³+œ‚Ö*CÜñ¡«i«Yezœ^²¶Æg‡ä‰ÖáȽ±b×.˜V+É>´@h¬ëÍ3Œ+ èyÑÅë]ûÊÖHgU€fþ¸Rf»‡‚w`¶:Cd÷Ýaè$ñz¹'¼ÿ9™?!!MÌVT¡æ?—Î7Ñ[Þõððëàoõ»ó]é¡Æ4Í­rƒQtb,Aï‹ïÎjJ6à}dÝŸâ?ÉpG¤Ø½Ø~wß²æ:™®¥¥[éä˜jR¹Nù•Õê~V¶=0L®DÚ!$¹*µÐÙµ+.¦O¡©”i¡R}Rn<Ä)תNUŒw‚„~W²K‰9-Ê“)øY%ÿÁôCöéQYÞ·AȦùAðÚ—w•Ðlu +FºgF„L|º÷Ì®,2Éî95 mL††ÿLçÈW­ªJú93a6ùí7êÙ·IÖÞb;}õ'vT5»‰É{£s†gÊ)»Vì–ë‹bY\Ÿ5è(&·ƒÌI§ -ã1~*]èÛ—ŽÙ‡Ðƃ”ûGàf{·ûÔ9½“V0˜š¤×`¢«%n'ô'ñ¿~Ã{º,ƒð`æl&‚S†Äó¾¥·-o„"ÄuòŽ §3YG\6¶_=2[žªœ6ÏŸ*<†Nc§FÊ”çm诟pƱ¢T *¸ŸÀLõ¾VÕm&ËP -ÑœmhÎ6||ëÔ¸\Ùöz®N!qQê»ìÛo]*â> -ќȖçiH ÒÎÐx_~ƒ™Å>ç3nöe\\H¢fµî9(Zhs:Ò1?ÿ¢}5³ñÃù§üŠ)vÈyæã$këì¾dñlZw”°¯è´“(é)Þ;ØÝ Êˆƒ/ÊCZ²&h­â‚QDj¾•QocÚâ *eH™ÔbN€lWü[Ò±vq»lCc«ú—ŒÈÁ¤Ïð¸fŸÎ{µÒým%Þ T¸TÃqQßt§‘Ï0‹ÍeƒÅÍ^oê!¾SÁR,Ú‘0Y¾Q/­uÐâÊMš"û¢…ú–þSsb•=0@ƒz'kJ<Î΄O…ÍnP©Ç/4¥%0º;‰ô^aøBBîC÷-EKší7´uørG£”.#žŽãÔKŽ£Ô/ bu?Ñ”±#¡Å—* Ü9(×6ìc}iQ[0[*|°¦]Ù@Nª} ´UÒktn§ÉOc…ô‰Úö=œ.’+ý„Ø G©s QÔ -<àDKrøˆ– vWXØL[+(¨¼ôu i ùXN¸?<íW%fÁ;j`QsŽüÉZ’áÏQæ¥ ÚbG3¨4ÆÎÌògUã#•šF0ÃÔV`w]§öGŒhýÈ6B¿‚Úš$˜ÿ€Þ°ÁNXîIcFN+ùÙ´:¼¨HàõthEAС¬Ñ,ñ¡½^ɨ¤kd¡½?sÖBF—#Iâ*ÙµÎP› w—žÍñ›ƒÅ5›}}†ÁW¤¬Có$øÞK¤b2Î`ÂöŒüqø¨~k Áä6ÚB³=à*ÐؼBg%Ÿô õßy”:í[Ú9Ú¿Z‡±“NÃ{N½¡ëÛ¼pœúµ6…y›–*§<ÆEØL¦|šØ¤€%8«ÁÆNN`oR]ª„Xlñ´3ã¯3ï÷ÞCÑÜa¬#æ¹S;…òù~ù²„­Î_‚Þª²¼­Eî€AAÑ^Í~?gãÜÔ‰æõ»Û÷……C9ü[¶7¬õ-Ë?ÄžUÎDÓ:C\–Å‘ Ä×…Xe -šcK&Ž5Ï¢=trPォ¦â·ñ7?U%q^ÿväŸìöí„8&]2ì¶&ÑûŸ5ó¨ð·J²Ä²…|±i…¶ª¶ÃÛáËùÝ? ¾­øÞyÿ;œ:·Ä6Ú~ÝïVŸ¿Ó¿Át®«6p½!#ð©TH¾öÌ}S€‚„2#ŠÚäQ×|`IûXÉÔ}’2pVÿæˆ>ivÁ“T¼,Ôü¢ß3qZ\eºà<×fgö“(ûÅmdgZ1Ón&uX#7›N+Sql΂œu 8Ê›Î|Ÿu;ñwí×ÈmÝ°‰”dh!\ -Fí¢– ¢ÇWB'u6ŠÑ—NÚƒtä£ÌÛ‡²ÞƒÃ­%=hð#,‡“úbç,ðÁ¶jî÷ÁˆØ¸ûn°å¢·ƒªÔc¢všŠåǯ†L¨ñ.ÁC;"&V‚”›W¤ÑÛj­Š] c%æ£ò'­Ê_+zOïIÏ©Þ[:£ÏÜü2}rÝåœ9ŸŸ=*n¬Ž³iÚ†{;Sîyw$zÈxkàª[шcFÅ1¡ŒR½Ô0Z;'iì+Æ G<¯B¤ñ´Yöª¨‡#†Ù”^°È;}xõJ)ÓêsÕÂB½ž||^$»(sþ ‹"—ôÝCâ1ôYçö¯=: žÜ³°Íƒî%]ÈVùñ;2Peê"å(ªDxš µ _ÆPAíËp”¼²`s|¢½`Èw‚ÓZE+t ÚSÈáçåù(ÝL„¶±+ÌÙ¾ØüΗFEÁ*™Ö0{cÓ@©!¹l¬"URû{‰óõ’²õA“P‰íðçê#SqVá7ÕlÇ 1՜Ԧòê°¥?6dØ>ÄD»~´ì!5âsCX6 k^o_¡Òö+Ù•_0—>ÁÓxÚ¼ÅÃHVƒMJ‹eGž  ?XeáuãÊÒú†ÓΤé“e¸¡¦^2ySn»½YùÅ'ÞæÀ\é!V*¸¼^É5z#2Á¼mÛXošŒìç´Szq/Šh8²èZDaýÖpóeÊ!±õàá’˜É>°¯®­;V5ÈD»~‹_céÍí“®õ؇$'”í"®qLì0—§—óû³ÌR,ubõn -ÅPÍ+‹§+d«òtŽ]Ò½þ³ÍoÑÈj)ƒû;[Sz’ÆO™æ³<˜´Á¡43H˜µ³é6˜8ç)—#¸[áÅôÓ}FJ7j–ŒŒžFA1ÎÊåªÁÖ~| t¸o­ WTd`^Wѧp|Ågºyß$ŠÍßbÌh²#Æ«„+o0Í&ÃhM|y:bIëDðâÜ>fÉ}çuÏÎZ_$Ø3Ä£"FٶɜË;¯2ÐÌ ®>¦j¬ûª”Ö:ª‘ôÙ—ÅøUÔŒA®æø'Þd>Wç4ó•_U«¿ÊXo—³”yüpÖ.íˆÖbÂÅT~Å~=ˆeHïY2J)>ªB$¨Q¶¯Í*êˆF±¼ ;Ì=Ù&{%¼¢ºêšÞZ¶O‹9¶HbÖw¢•Už®p[-ÃÕÇëãò6ª†µÞÈ?µc¼nÜó“íZé¢ÂDÍS—ÿ{>e:Z¥u•ŽEb›Û+– …¶¡!’Ù’dÝ__9ÍY{;Ï®l­L9Lò5hBrÕ*]'†’ªÿ{ÅÛ­{ÿrØ£³æþäspÜó°‰Ö¨Wt!@TQq“;í©y€¥H®%ŽLP8.7Û„û‘±æÍMÔКûš6‘šÁ­¿›ƒí\óÔ|M$FÉ~p4×–šH*Y«Ù 2\qŒ¹YæZ:¿£"öú0¢„Hâõ…„YŽ"öæ—–EcÈSFÁ&Ä=¡0E7`wòHÿÄþ9ߢ®ö;ŸYL#·¯Ì³Ö„…gŠc¬ -Ô…Ö¹™ºãº?Éê‚ú„‰×®áþ¹,L'åò#j2ï4ê•ï7cAIúy´ocpàß¹*y¹¢T„†è==lï5¸§D1Âs¹Ÿ¯2Ê´8çh†Œ4¸²¶u‹BSê71ó°ãÜ „X—êyÉyJtèb‡ñ˜`1<]Î=ûÒ.ó`ô7HuŠeòW²OH:(kÑ….oa…^âÝܦ6ç£ÉWòƒøIˆF-Í–«ˆkÁsìü=ë2KÊ›`)Í.`î(/µ )y©Ôt¦,èœLà‡*·7õA[hDp·/ß.‚EÔ“V!P<é‰ÁÀ¿b» Š=£+m™Pµ?vÔ17’I Þ<®"! 7MV -úcd¸´fôwwX£l¾‡»C"žžá°Ó;Õ €Þ#§9ðñ’_7©Ÿ›K^¥ß÷[ŸŸ'}l«i3…ƒ–Œ—¨™ÎÏÑ¥û‡*eáÁÌ—F/S·ML¼Ó®)2_&àâ\Nujs4_}РEÜ‘*áq Å‰ÚiP¯|-²š§SÊG‹“¸`îK/¡K¶yÓ¡Ú~x°¦î¦Gp;·ï¤>«kñ#t-Š™;Ù¾÷wæ¹SxE”Ù c\‚ßh}U;Q ) 5›wðhى嬭¦“qƒÑÔõηé™õ¥g2qÄ¢G¿žÄihq­˜?Ŭةæó;‰À_ð_Ïáìà,ŸŽG(ÝFµ7Vç«w°»ã‡6"­’—‘¥c,MD%Ñ\Kˆ©Åq:?ÍuKÞ·$I{½ŽˆÊ¬¿=P±T&U‰0îvi|åJ#¸ŽEÂûCìKwã¾J o¤›ur¤'SÇÓN~8nØcqWòñjºøiY›¯#WÓ“!×Óß믬‡f•å}‡†XnÂcÀw²ñö|Öq\ƒnZ“E‘x!?ž‡¤‘PÂEl$Õ­.LÉ[—ά&ødcËL ‰ÉÁ.-îÀÊ-§3§ÝáET‰kõ*ºk·Èh¡¿=¯ìRñП`É‘.~Ë¥î1úA;ë7í©”q¨ï›ˆ±÷[G…¯L»f4‚Ö0›ŒaÆ6 ò9®6ÈÚ˜ëmRsA8«ÁŸ¨x›4Ax–¼¥êDÁ Yï@šð“Bi8«R}WJå,|kò»]—ý%¸0riZü¶»Þn G„­‘¾t Aý ’§,Xéa¯+ЊÅAHú…™¦T+ï&°À·Y=LˆL-0ÓÍ¢Ÿäû1ÒÕ®25c{wc |XîÛ¦J!{Ý$ ¼ 6Ô©q˜ Ô†ýO#ª«¤Aö³‘,§ïlx¿•G.†  'ÔÖÓøò´ *´PÃ(þb ûÕ°_œ~ÐRlÔùYœ?ÆX‰³Xá¡Bö—߀z'öÇøøðo’?²kCÊéÈÚP¢b’F Ì’2î“[Q…Î÷å]òÞqÖ‘(™gТFt -䦶°¬"oucZ^£¯»¥ï}¦ñ¸¸Ãÿ²§ñü³µÿ$4W—ötëœ}¹Åêèb„”ÖÇZË0%/î É`ó#“)±{¿ñÃ3Çî·}Žô„Ûá  +‰(&c¾! Sb4ôékå͵þ˜aåØò;ú€ £€ÿuÁÐh^314ÎjT+Ò2é·O­7<¦iz’2 ðÎ"ÃÌ™. ¤@q'¤esú–¼ÔÅxzäY~&¯÷óG5Á]5Et„Ç2·¬Ý€UŽÿË åÿ ü?!`a2ƒ¸:9˜AìP| ¨«äÿ§¡ü/åØÎŒendstream +{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@v=%eM9æ¿÷þÏ())§IVN~+—ïˤ¼( +òrÿ]ñŸ^üåߨºøêäø—ä[G+'€à?Úyññ¯–ÜAèËlþcFÀ¿ë«:¹‚-@†Ž/ÇËÔ¼<8ÿëHýÿ_ëï9äÜìíÿt…áv^ü€”8boùp3°½×yáïz LÿÿAç­«™=ØBÒÑÚþŸ6¡r`O¥:ØÕÂæãò—Ë–~‡ u'(ø/ÀÊÉËù7NÛlaç‚B_ÎâO +ähù·”²ŽN–`Gk€–ëËTšA,ÿ üA[¸A /öüy@/ïþµ·¿y‚,Pçœ,„ƒmk‚[oª$I(™eÔ]Gþm!2¢ë!D +[D« “-Á'u™¯nòŽ<'Xð"Yeð&­ øc‘#Ñô,åKXÈm®_l™Y¢o׃GÐoR:©‡;Ѧ¯êJ³Š÷ѧ‰mŠoâºë•Bå‚n‚‘7Cj¹sD¼˜<îcØGÌàwÛlÞ—q+Z/½²Í"^Ø|$Go-ÅlêØTåPÛû2oT cÚÝŠùýüÌ yÚô~8!4}"–öj6ä äkÝ8x>9"¡EVj› Y +˜ñ)l¾ÍkU¾q¥DÚÌå¼S2³òOyÍR¥vHDShÛ!¤ÍÙaæÙþá¿U ¿ë-¿ku§zIúèçÝ ‰ŒPËi‹.7 +‹\÷+í°Zû²Æß5eEmüØyò£ ¿×Sewœ•õ‹k†­bטUÊA-”Šß »,ÎCz7†–#œ$%Ïɶ$¢Å*:ú8¬û¼!Ì·ì«%×ç[âÁÄeÂ[³6æÂîŠî×ÙšÀ³õðù‹Åôm›Ÿi8e>Hg33nlGº®3có€_ê0µihù¡gÊÀäxFnPê¤ëηk,4K§ͯ_MKíkû ß 6ÚÀx.a¾+íÌå”o·gKR™¥ Œ’H!ÚèE=é_–9ºã4? kûŒê‰Z*¬ wøŸOV#•3Ul# 2µÕ¾Aé£ßÚ¿d›K€–¤–g§$ýæªâ'ÚG÷nAüùuÊnûF¼‚›*ñƒ5_ /NŒšrþj{|í lÎC¤r è·Ív¢âr‡"¡þßù¦…µš6#qØFn²‹³9ôgåÉŠEg€+Á öÊL–¡ÀN,@‹%8]è:ÔÊñ»¤>$5o5Ò"“a£ø0ªÃ4v~Ý«¿~õðõ@÷܃3/qviùk'´-âzÞ<öë#n×wÍîü‘m•Gï%Εxó¿{àzK Ü(ý„÷’¡¦7IâA³ÑÁ8&ÕÑ¿u<é‘Ø”¹oe²ænrÎA4ZÞ ¶OÑ©Q?Ÿ&ºõJ=ÞÃ^…j´\!ÃûÖ—ÝpÁ±äÞ:ê íg|ˆ»}¾‹œœ +yíó»Ñ€:+ÅIÄA=ÁÅqÇR&…{Åšý ÈÉô\‘Ñ›ll„%Ós@÷j¢¥”¾ì{P¡-ùq¹§~AioMu“Yuæ4m¿ø.ãг޸ùûlÌÞÖ5ŽI£ÅÏ+Üïzê#–jˆÛÞ)2PÛµZü"{7&Iò ‹fÉìY§qxø6·-!{.t>ò1Êœ<›ËÅ‘w°ÿ;)¥ÕHfßO-`ÌÛžÅ"}Š¯ò¸t¨T1úä8 +“þ¡•Æí‰÷@@P‡‘»‹©ÝeÓ¸­ +ÜÜŒ”9rƒéÔ˜OÓ[¬™ï!)-oB€û³}‡rñ.ïÞ%¸ÂÙõ@ +º" "†9ûˆÄ«@ŽŠê&z +§/ÔÂŒV‚¦¢PŠ\Ký`a0Œ¸É0òç?æˆn8Ô&Òm†_Ž'{•ƒ +ÈxìúYxU‚Äb/Ö[áNŒe­pŠÞŽéPS{Dí÷æØ*÷¤ë½þ[@ìŠô`ŒJ´ÝŒ I¢ömu:¶>ÿC˹@â!±S „Á‚Å5ä!4ˆ •ï¯ÞÄü65ûö£¢M#·Dž^ëgœÒ–óÖp|Ø.õw®òž‚ö§E¨=z¥åÆU²ƒ¬]!áß9Ø)'ª’,4в¨XûrYuPÖJÙ35S1CKX{ûºE†å™ªwïÃ(aÁÛè|êÍ tþ MLªe±礨]´ClözÉÞÀÏ·?©ª_±ð3~‡³?®Üv-‰›qT·‘?Exqj›2± Ž %ÊŽ3m‘Ád™°IÍ»O‘ý—Ž›§Í)?ÉeGJ¨£w¿ýág§“fϯˆÀös¤È»I–û5-<‹o.S#Wb$Ø#ÝÊâ¿gt{öª«$~]šõñM˜Ò~=©ëÄÄ|_ÕLÈSE×»=¶\z°‚éÍÿªpe‡#˸æ•(‹êþ¤I>X,>¹k–!tvÏõŒˆ0€jƒu¼T†ŸbœºüíWfB¦ËÎNXB0êTª3½#“Ò²í¼%ÿÒY]¸r;%lÂóùéÆ^rÝ‚:LɆ¸×„ùõÁô”H4ª©vÆ“»ÍwÅà›MFog雲ã ZÏ„ 1˜ù (“­¶2}!¹ëïòúq56sžd +ÕS”Åzo¢É-Ê–¯‘®xg`ùÕ56b]¿¶Ù0-÷9§ä:Э4•/ú*å^X2Ô`”.ªHa|œ¸BgH,h/¾“û®RÍ<ß81ðf¤ØþkÁ{ŸËÛÞÍȧËÙ/[`¼† bYõ^]²­Ù§,€ŒÝ?]ñ[úûªˆ_ Ë2´nnB6+æ`±•L ZA1ùçàÈO–-–r³m)ìxŽ#ª3ã1Na5yK`k1Šoí_¶aÞi­$j(#ªD Œ~%²m©+3!Äû×:š4¡#÷+.Ň·uíèúš'7þ­ÑL2tlª>­ö?ÓÈepžî¸w¬)ÂëÅrï])RÄ9òDXø¿3)>?éSEÛ™§)»œ_l×wfˆá!MµçIZ§¿#áMݾh‰¯Ù[m2Š…¶Í_EŠÏùøy:ÃÐî+“E±MªhF‘¨Pж\6([‹™Ò«úÓHJº#}M”•è˜ôNÄjø‰®Hæ… ˆîÄ­™%°`WjÏsäìË…ýÜܱb-Ö9¨\t¨$ر&<Ç‘‡†gXp>Ûe5È7îç€WPèn÷ÑTÞ<Õt,Å.ã@©£ :ýDªÓŒ²™[9%þÁJî}< :¶¸O`ö$)ÿF9ØR'm=4Ú¸†ÃkÆ…¦3•”âYD —(C}whø{kx„¤G‹Ú<Ì|r‡Oõ3ÏbAl‚ý«R1¢ ”òz…õS¸ïªüõÏÓžŒûn8™Ãq4 á0 Ÿ¨Q¡°ñÁ­¾»âçxÊGú÷kÍd”™¯ˆ±0X–z#) A ÂÝ·¢°a+ Y::8ÂBõïe©Ž+Ë~‰‘ß\u„è‚M—®Ujèç>'¸…Yaïu:©Ô‡„ô +‹ÔÈN¨ÆÈ›ÚM„XÉåxÔʈ•xšê®c€‘˜ç$KÁT@üäÛk? ÎT˜þ‹[ìöÀØ”†©´ý²Û7Ç´c¿ÆäâÛê̈GŒŠÈ9ob»ÊŒ¡˜‚üDò÷à-:=N&”b¬Ö,áämŠJ-)¸‡0&Ù{Þ‹zîoHª¿^ûûqN:zá¹HÏâxFbq‡Ô›–wˆ­)ÔµîNØUOíãõ¿ÊwáõAKŒðÉõñL +ˆ°S‘bð(b¬Ùj›_äá~5BWg<÷7©TÑ_á-75ÓúX{´cE=Gc)| Y­¤h°—ÇùÐVüå‰g¡õaûÇÐvèiUX…DÿM¡m`Ižl½”›oaü %t§ò@Ìšÿ›3„O¦kų™4-šzIÏÀ·‚~½Ç›™'·&>86Ób)& ›xý\góŠN¶Ï“rˆ ¸öñ}ö—›OƒÍ±Êaoï<±Gº¨6DIjܹêDwtO)[\cpöI±v —Öž‹¿å÷w‘PæT'yñæyÑy[€©ŠÑ·UíDb2{x³eNb$ú'Â+X"„–1Ÿú{ˆ=…¢ó×·ž¦Å?Ç€VÝʶ°OºÁ QT«•ëòÞ¾_ÍÃG[tc—Ûzú ¯ pÜw+vx´c-² &ôæXØ^os>–%ê~þ:O¹<0P¼¤'‘ù&Zèç– §/ Ü/_;Ä샎 +{è„Å~~ò`1ïQ¢´¤6¡ç@$&ZÉçÓI›¹*zTHf–§Ì²Êcçvr~Åm}wdË77¸V×ÌÇQêúj›NB íË0É»£NZÎ÷îç+Œö +ú¡ÖMz*xù³Ù™Mœ%˃­ÚUºîCkÐQLn™“:OÆcüTº8з/ ²)¡>(÷ÀÍön÷©sz'­`04I¯ÁDWKÜNèOâý†÷tY$áÀÌ)Ø*L§ ‰ç};Jo[ÞEˆëä Ng²Ž8¸ll¿zd¶Üì˹¸DÍjÝsP´Ðæt¤c~þEûj$fã‡óOùS&ìóÌÇIÖÖÙ}ÉâÙ´î(a_Ñi'QÒS¼w°º”=_”‡´dMÐZÅ£ˆÔ|+£ÞÆ´ÅTÊ29¨ÅœÙ®"ø·¤#.bíâvÙ†ÆVõ/‘ƒIŸáqÍ>#œ÷j¥ûÛJ¼¨p©†ã¢*¾éN#ža"›ËŠ›½Þ ÕC|§‚¥X´#`²|£^Zë Å•›4E2öE ‡u-ý§æÄ*{`€õNÖ”xœ Ÿ +!›Ý RŽ_hJK`*twé½Âð!……܇î[ ‹–4  ÚohëðåŽF(]F< Æ©—G©_ +Äê~¢)cGB‹/U¸sP8®mØÇúÒ¢¶`¶Tø`M»"²€œéê¿ó(uÚ·´s´1~µc9&$†÷œzC×·yá8õkm +ó6-UNy"Œ‹4°™L;ù4±IKpVƒœÀÞ¤ºT ±ØâigÆ%^gÞg¢¹ÃXGÌs§v +å-òý0òe [¿½Uey Z ŠÜƒ‚¢½šý~Îƹ©Íëw·ï ‡rø;)¶loXë[–ˆ;<ªœ‰¦u†¸,‹#ˆ¯ ±Ê4#Æ–LkžE{èä" Þ{WMÅoão~ªJ(â¼þíÈ?ÙíÛqLºdØmM¢1ö?kæQáo•d‰e ùbÓ +mUm‡·Ã—ó»@}[ñ½óþw8u"n‰m´ýºß­>?¦ƒé\Wm ázCFàS©þ|í™1ú¦ eFµÉ£®ùÀ’ö±’©û$-dà¬þÍ}Óì‚'©xY¨ùE¿gâ´¸ÊtÁy®y^8'À³ë²O¡¥=ÁŒlèAJ1ês|ügäÊi”KÀƒÇ§%RzP_BÏ„%Švà}ÌÎì'Qö!‹ÛÈδb¦/"ÜLê°Fn6V¦âØœ9ëp”7ù>ëvâïÚ¯‘Ûºa)ÉÐB¸"ŒÚE-D¯„Nêl£/0´é6ÈG™)¶e½'‡[KzÐ0àGX'õÅ0ÎYàƒmÕÜïƒ1±q÷#Ü`ËEoT©Ç"Dí,4Ë_ ™Pã]‚‡vDL¬)7¯H£·>ÔZ»ÆJÌGåO&Z•¿VôžÞ“,žS½·tFŸ¹ùeúäºÊ9s>?{TÜXgÓ´ öv¦ÜóîH ôñÖÀU·¢ÇŒŠcB¥z©a´vNÒØW:Žx^…Hãh³ìUQG ³)½`‘wúðê•R¦Õ窅!…z=ùø¼HvQæüE.é º‡Äcè³Îí_{t<¹ga›ÜKº­òãwe ÊÔEÊQU‰ ð4Aj¾Œ¡‚Ú—á(yeÁæøD{Á*淋ŠVè>´§=ÂÏËòQº™mcW™³}±ù/Š‚U2­8`öÆ ¦RCrÙ:-XEª¤ö÷.çë%eë1‚&5 ÛáÏÕG¦â¬ÂoªÙŽbª9©MåÕaKl2È°}þˆ‰výhÙCjÄ熰lÖ¼Þ¾B¥)ìW²+¿`,.}‚;§7ð&´y‹‡‘¬›”ËŽÆ•¥õ §IÓ'ËpCy¦¸ûÉúœzä_i½¯—V àøPŒR ”ünòöµIâ +(ÿC–MsÕXAr^Ó17êLÙÌžlõ­$/xš®X;õi¢¥=bøŸ1_mb|L½dò¦Üw'>z²ò‹O¼#Ìÿ(€5¸ÒC¬Tpy½’kô:Fd‚yÛ¶±Þ4ÙÏi#¦ôâ^ÑpdѵˆÂú#¬áæË”CbëÁÃ%1“}`5^'\[v¬j ‰vý¿ÆÒ›Û'5\ë±IN"(Û D\ã 4˜Øa.O/;ç÷g™¥XêÄêÜŠ¡šWOWÈVå黤{ýg›ß¢‘ÕR÷w¶¦ô$Ÿ2Így0iƒCif0kgÓm0qÎS.Gp·Â‹' è§ûŒ”nÔ,=&‚,bœ”ËUƒ­üøèpß.Z®¨È À¼®¢O6àøŠÏtó¾I›¿Å˜ÑdGŒW ;VÞ`š#L†ÑšøòtÄ’Ö‰àŹ|Ì’ûÎëžµ¾H°gˆGEŒ²/l“9—w^e ™A]9|LÕX/öU)­;tT#é³/‹ñ«¨ƒ0\Í!ñO¼É|®Îiæ*¿ªV#”±Þ.g)óøá¬]Ú­Å„‹©(üŠý8zËÞ³e”R|6T…HP£l_›UÔbyv˜{²M6öJxEuÕ5½µlŸ!rl‘ĬïD+«<]á¶Z†«×ÇåmT 'j½‘3~jÇxݸç'3Úµ&ÒE…ˆ.š§.ÿ÷| Êu´Jë*‹Ä6·W, +mCC$³%ɺ¿¾rš³övž]%ØZ™r˜äkЄäªUºN %U+þ÷Š¶[÷þå°GgÍýÉçà¸çaÿ¬Q9®èB€¨¢â&vÚSóK‘\K™ p\n¶ ;÷#c Ì›š¨¡5÷5m"5ƒ[7Û¹æ©ùšHŒ’ýàh®-5‘T²V³d¸8âs³Ìµt~GEìõaD-‘Äë ³:EìÍ/-‹Æ§Œ‚Mˆ{ CaŠnÀîä‘þ‰ýs¾E]íw>³˜&Fn_™g­ ÎÇX¨ +­s3uÇ…u’Õõ ®]Ãý=rY˜NÊåGÔdÞi<Ô+ßoÆ‚’ôó"hßÇàÀ¿sUòrE© Ñ{zØÞkpO‰(b„ær >_e”iqÎÑ ipemë…¦Ôobæa-Ƹ±.Õ=ò’ó”èÐÅã?0Ábxºœ{ö¥]æÁèo‘êËä¯dŸtPÖ¢ ]Þ +½Ä»¹MmÎG“¯ä7ñ“Z4š-W!ׂçØù{Öe–”7ÁRš5\ÀÜQ^jRòR©éLYÐ9)˜ÀUnoꃶ:6Јàn!_¾]‹¨'­B xÒƒÅv{FWÚ„3¡jì¨cn$“@¼y\ D,B@nš¬ôÇÈpiÍèïï°FÙ|w‡4D<=Ãa§w&ª½GNsàã%¿nR>7=–¼J¿ï·>?OúØVÓf +,;.Q39œŸ£K÷Uʃ™/!Œ^¦n›˜x§]Sd¾2LÀŹœêxÊVLÒ •žÅöÍL² M ‚ÌÇõ}õY‡Á¨ù ¦{×Ôÿ„mÆâ Ul!Q‡"ߺÖÉê‡2ß\™ör­h”ôúÚ>™¯­ZŸÁ†åfÊ}Ôæh¾ú A‹¸ "UÂã@‹µÒ ^øZe5O§”=Ž+&qÁÜ—^B—ló¦Cµ%üð`M=0ÜMàvnßI}V×âGèZ2w²}ïïÌs§ð2Š(³Ƹ¿Ñ úªv¢R +j6ïàѲËY[M'㣩ëÓ3ëK)ÎdâˆE~=‰ÓÐâZ1ŠY±SÍçw¿ +à¿(žÃÙÁY>Pºjo¬ÎWï`wÇmDZ%/#KÇXš$8ˆJ¢¹–'R‹5ât~šë–¼oI’öz•Yz b©MªaÜíÒøÊ•Fp‹„÷‡.Ø—îÆ/,|•ÞH7ëäH;O¦Ž9¦üpÜ°Çâ®0äã-ÔtñÓ²6_G®¦'B®§¿×_YÍ*Ëû ±Ü„?Æ€ îdãí;ù¬ã¸Ý´&‹"ñB~<I#¡„‹6ØHxÂv›Üd-3&ƒÑÕx0rpëÓ»—Corý~éYš–Å]bæ¬Ù«Þîs‘Ú‘ŠfÈ)1‘j¾Ú‹8Í4ˆgùÙúµÇw9”BžëÕ%+š'4TU“¦ËÎøDµ°G¤çˆR°ßqsD± uµîçpék3(F•i% ¶lOà¨Ù˜zp~Öu­ 3|#OO˜gàIÙ:t™V&Ñ‚Õ6àﲺKk΂Âø’P’’¤¡ˆèYƒ¾Výì{-s4]¤5Wghú c! + Ã{Q”(õ¦ú`í|ª[]˜’·.YMðÉÆ–™“ƒ]ZÜ•[NgN»Ã‹¨×ê-Tt×n9ÑB{^Ù¤â¡?Á’#]ü–KÝcôƒvÖoÚS)ãPß7cï·Ž +_™v5Ìh­a6ÃŒmäs\mµ1;×Û,¤æ‚pVƒ?Qñ:7i‚ð,yK%Ô‰‚/²Þ4?à'…ÒpV¥ú®”ÊYøÖåw»:/û 0JpaäÒ´øm'v¼ÝŽ[#}é<‚ú$OY°ÒÃ^;W ‹ƒô < +3M©VÞM` €o³z˜ ™Z`¦›E?É÷c¤«?\ejÆö>îÆø°Ü·M• BöºI@;xl¨Sã0¨ ûŸFTWIƒìg#YNßÙð~+\ @O,¨­ ¦ñåiA7Th¡†QüÅö«a¿8ý ¥Ù¨ó³8Œ±g±ÂC…ì/¿õNìññáß$d×.†”Ó‘µ¡DÅ$!Œ˜%eÜ''¶¢ +ïË»6ä½ã¬#Q2Ï EèÈMmaYEÞêÆ´¼F_wKßûLãqq‡ÿeO-âùgk=þIh®.íéÖ9ûr‹ÕÑÅ)­µ–aJ_Ü’ÁæG&Sb÷~ã‡gŽÝoûé ·ÃAAWQLÆ|C¦Ä,hèÓ×Ê›'jý1ÃʱåwôF5ÿ낡ѼfbhœÕ¨V¤eÒoŸZoxLÓô$eàÿD ‡™3]@IâNHËæô-y©‹ñôÈ="²üL^ïçj‚»j:&ŠèenY?º9«ÿ—ÊÿøBÀÂdqur0ƒØ¡ø@@PW'ÈÿOCù_ÜóÎqendstream endobj 1065 0 obj << /Type /Font @@ -9947,14 +9952,14 @@ endobj /FirstChar 2 /LastChar 151 /Widths 2150 0 R -/BaseFont /JKZOOX+NimbusSanL-Regu +/BaseFont /WKDLRF+NimbusSanL-Regu /FontDescriptor 1063 0 R >> endobj 1063 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /JKZOOX+NimbusSanL-Regu +/FontName /WKDLRF+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 @@ -9970,37 +9975,64 @@ endobj /Length1 1624 /Length2 8579 /Length3 532 -/Length 9443 -/Filter /FlateDecode ->> -stream -xÚíwePœë–.îîNCpwM‚»Üh ±†¦qw'H°à’àA îî48A“Cö¾gÎÔ¹ókæüºu»ª»¾w=k=KßõU3Òi¾á”²†X‚ä!Î0N^.1€:ØÉÒÝM â¬Ê) q´Ö°tžA FF(Cœe0@d Yøø¼¢¢¢Œˆ‹7lk°èjë³²³süSòG`éýäÙÒ lë `z~ð9B\œ@ΰgŠÿ±á³lÀŽ €Œ†¦¡’º€EA] rAŽM÷çT¬ª`+³ˆ`ÿ>¬ ÎÖà?©¹q=sI¹€7øÙ äerùq\@P'°›Ûó3ì°…aÏ5€A`g+Gwë?<Ëm ä…´†8;z¬A6ÜêسKËÿ¬Ë\ÿ¾&ÿZüoið¿¥½ÿ»æþkþË%þßÞ祖wwtT:=ÀßKð¼e UÀŸ=ø³h\ÝAÿ— Ð ìèýßXý«¢>èïHÿý+¦>—CÊÙö¹%œ¼|\<‹Ánò`/µ&fe°:>Wë/¹®³5êv=wõ¯‚>ñðü ¦c¶rpþS~Á¿!³õ¿Æþܨ¿"çÖT“Ö7Ðeÿïvë_ššÏ3Óñvþ}5ˆõþðHKC¼¾œB¼N>a€ˆ@D˜×ÿ¿ñø ï?Ïj@ì0æáâáá<ÿþãûÏ“é¿ÐÈ9[A¬ÿÌÌÐÙúyÌþSð¶r‡BŸ»û×ÍNúç¿òYa,ÍC¬ÄÃì3²2aµ¤y£²Æ=ݼˆá.% :Å…AÕ®ÀŒ¨MÑ -‹ß5á\ãb­Þsß]v”Ùv»I™»Ò@§Tþ/X¿â¯1µ ³ï†p›•`géÇùžÍªn  ñèínji›}üB=ÞÎE;»e záQDÄpã‚`•^ÿ–¸¯Ž ¶èûSÊÁí sßÐ×þ® ä/;”ì¹oÑÅ=°™bƒ\s)%Œt+|£^Ë àcš¤HÓ¯øbD{ˆÂÓ®hå_ãO•Ñ8V§%Ål¢¾Æ3Ö`éT¤¼‚cØÄÍùÉDF͸wvÎ%™îåH%ãc×ÊÎrYÓÀfhجس_ Ë7åCüUœB>þ¾o¤²:ØÏ Ô÷¾î}'CL!Ôk‡»Pôë*/Ìò[! ­â‚Y?ËSR]¸½ní΄Ê~Åœ Ž #DiþqõÒi!Oï -ùÊaº5BOsö;5¤²nÛ®”‡1?ß×!¶Õ¼Fä›`¾EïÎf%¥üÍNJ]Ë`| ü^VÒ#5“Ù>U¶,lT*$A6 /WÍo¿D)9A[ßÞE»¯oOäÁçeˆbAÔ²²O,m£a’ «>+^¾1AU«Ôsi¦l›sÚ(,ÜØV¹ZùF§­#â=Õþ§‚[Fª½Ph7ÆM&âCo#ù»¤ø²ù2y=õ)êilºGôÙO=?-íw¡ë#Ž'a²—¥¦ 4#¶š™5-+3>S¯áŒÌͱæEÆÛÚ?W«EAì/6sRI~ߟ¯òÒË -g©ùX½—ÿˆN|)ãÆs"•AàÂøžÉ&?®}߳ݚÀG¦ãkx%cqµˆ*Ê„þs#Ñ öàH_líÛòþЭDò.SÍò2µ¸‚¶cô~r×Ý&¼¶aËnàbAˆëàö‘·hàm|¢MæHvsºhkõ«Õ‚%ÍÍsu¢©¤¡Ÿ“=l¤´É¡¾4Ë_œœÅ¨””Ò8n“91Vh½#àÛµ-ÞTöw?Y¢Ô§¾LÑÜõÐop+–¹?µ­ªEzƒïê'&éµ' ´™öZ2VõzIÁ¿Ò$¼yíîRÿ}LÎáPŠ3”×/”})WCÄç^<"Ô¾±®ïÚáÆHýôbºY‘)ù O1€öúÊø½:†æ‡tУ+ÕÖ7v†îv™€ôü£FŠÛV+àŒ1ò^@+œÙ³AÉDèöû°‘Ìër;…Œm ¥S…(-ÎŽ¹¥…”›Ñ”*Ì”’îWx€ÖÇÀD‰}œ>sWw슱›ž¹¦§ª%X]{­Óõ(ýÜø¾duʃÊ(­¨ëFÑbÑd-];|Þ–B¯¯ªBH®ígs³d¸|Síqb÷{„3HÄ{lxýû¼Úþõ‡¸€1»ßÌÚœ&^^0*Ò7w:è¨}eëvjg˜MaY‚Ð%U7Ξ¸ˆ1]ñÔÒò<‡ÕÉ‹!¾Ô«L¬5m÷2fmû<ãí?S¦çŽ ƒŒ×‚ëWÕ‘QÛ—6 ‚ø‡ã!­Ã©bVBÑËwEçòn9væUŸì« B÷sÅ[º'®SöÚ@+¥ïn85ÒýŸHb– -\F P2ç´¢•ácƒÑ‹Ù‘…rò‹'ŽÔZOêÞ£ÐËT5ù„–ämýÂÆ¡\ƒO¬nÎhY¯ÊT£˜(3‚'Iáq&ÝàL‹x¸8'`‹r›—¸]kãï²—8x¯ô6»ŠÝw‹®A3‘3hÉÂä'O,˜G9¹5j v@Í¥×b*’ÅIœOb?¬Ð ÔP M%gxWªIVÈ!ñhÅÒø['¯¼¿.:°ÅλÒ6ù€@š<.œ»M=b¢³G<Éžb©ÎV逖4–Hº·ïK¤ŒS»7àâĺq›™ª””Óx`Ð@[{ù®Hš€@8ÅïÏSAø²ýäʲ½e#óòœ‡)P'dÖŒno¸”]`ú›Ð/ý»„ª6.˜²;NVßn81—hL°g/#³†õ½T5N•È&œ#kXÒ·Z‰[¦ZO¦í Vñ¨ÖŒ[ŸÓƒá~‰ò¼/×èa¶î^"’]d³¨ˆU?c«<œ)´ NGWŸÓJª"Z!ÉÜžo½¥I´¼ ½g:>:ªk{ˆëçÈ Žœ}ÊÌbÒ¡}Åó~@ó±F|íƒ-˜(2.°p{¶šIĨËq þ"AßEðI ý¼Ë¢oÒE±ã‡¢÷§Ðú0 r¿¡þâ°åÅKŒh—W‡ÃégäËC²},7Øz íå¶[D“ð §Ý÷3ð­beÖz«ë{çòCŒⲯÍ-kÛÓ~µ‘ñQÔ;¹F׌~Z¯r[Ÿ¾ÖcOSô•Üše  O4CwT(„¨]§kfž—zëd̹:E.g3G5Õ_üIA…nµ>Ĉe! ªÐ½×~sýücê{?ê…s’.âÈÑ¢8é+û3FX©wvÝ*— n~ ,!PÁzc³ÐMÕÁ—=®“@ ®±&Ó/C¦ì>š#ö¥X÷Þ•ß|/"rÈÏÞJð‚WXhÕö13/¾¼v"sõ]8«{¢5¬•n/ÁîÄÌÖZñÛÕêÇDßõÓ'R -­)ýHF º6Y~Ûé»n{0òiSÖ^q _±ð¦ÀO¦îEþ‘”8¢±7_'š-CØ¢bùu]<ÉeA$o4¬ÒÌ)¦hÔ?úõt’†:öª^m™]IçoÅÙY?¿î(g‡$ ÀO Æs[ìKÍ÷\!xóI‘s/}©¥¸{•Äb’Ó½ä>‘b;’|†_};ËÈá—´nTÍûÚ£™HGÌ<¦à\0ÊdùR#À:[áo½fÝÈ·!)=æ×é×jk4íH_íD§KÂ_C77=r7ÍZÃ…tšŒ÷4wɉž\¢kf%³˜&§ÅÌù¯ž-}øå1(i-ïÿ(ªÈ÷3~;ÿTO𕚆!»´ìÁözš0»Á¯-ö¹c?Ë,þÅ0Õ ‹×}ô‘[qÎ|HÚí‰Þn$/?µÅ¶Á^ôÃO¨:‡øg‹îXéÍt ÞÕ§kÝM•.@)%H‰ê>±_œJ´ë}Ç$e¾!¬PH3èýP -ƒPÒ€m\ûVO~L DiåÍå¿Làæñº[{Ú2ÛÊ«ÃÔM–7P)‘uJl¹!{øXq£‚ʵ3f+ò¢,˲“§eg·î+lê šÂãEfqrqv±ç|ý{EMË5ƒ,IËrévÅä›ß‘¿öoXH°íxBâ‚Æð’ESyŠˆ »O‰Ú0r¨Ð¾/é¹Kš9+¶“Ò/J½[Snø¸›°F]Sç?…)Vž›r3WKn'ÂS¢Bp?o ‰ËÅ„¶DkŸxͦ;é›!dœ\Ø)ª+þAáÓý¼+I§…Ÿ Â1/ÒØO±}¦Lhoañf¢yÉYnÙó7XîÙu®DBÈ_ÞI‰^nù¤úóÓÝ2«Áé -hãÓ‡¦øªB“ÞÉ, -M…ߎ9_³œü§Ó©7\y9LàbfLý”Bãôžå˦fð(iÚB5ö±¬r/Ö@¦• -/ôÙ°úQw.#EœêhüYУ„%UÛ96‘iYÆ·ŒÌï\]”¬®)”ÏâõŽê£p¯ª, ¹ESIªfs èLü„Ü#€˜ð5õ|ºó XŠÜ´Ñ;1*ýó$]˜o4^|œÖarAG–´@îõ´\ph®«`­ë úÓPfÅ©¿ØHéÒ©1AGRkwpe,Ûö=B@íÑZKŸ}{ï¾þ­…k ­„õŽM£Ñžk—ai»Õƒ©9«ïX×’”PR!ª‚-‹¤*SèÉýu¾!µóûæ5´8 ì²ôyÅ$,¨Ž‘ Fõó™êß¿ ˆ±ÏD±› á7èv,FÀÄwoXèÉ*O€‘\±‡®¡ÀÊê¹ëzÅM:í¯r$(YU, “(‡±~±jÍõ(çÖ ¨¸ï¸Íù;Çô<F‘¨˜Æ6Ž™æád;@u•iƒÕ%´·$«lÒ¦Íu§»/`S{)ªž|‚³%«ÌGw¢ -ãDáð£ìÆU¦1*] ÓýQ„dl¯}ߨ¨7(cKqÞ9–ã¨[kwOŽÌ|ö$·¨íŸí«æ|sŠR¿ -ÞgÔ h¥%Ñî›!«RèPêé]å’qh”ö$Õk<©6–ìùŒ“=Ý°ãs8Ëqçsïï>®ê še{Þ1#ìgŠ²8egç~¤’+J˜gÑ“¯©²j>-Z’µ×vi™4/CTÊ´Š]±‡|ë‰}¸=¼\Æè½,²è”®> ×kýH&«Ÿg9‡*xëI79j»Wj}üÚ1`’ÖÝÿc#¢¸Îù!øV¬éwþgb~½|Ÿ£Œ?»X´•äßó—V™ttõ—œ²Òû¾”ÜÂ|ä]y¸ðð·ìŒY»”d:¡F Íë$ëÇjNµ<`±ºé†gWa딣hU¾Âåï²ùfÌVr@±œBâAéÊúµÂ?,ѨÈ_­5±˜ÍÆq•Ðµ#Ú,HÉõuÜ¢y¤Ë›RÁ¶?âr6ÔŸ ­Œ7ª›§E¸lÛ6¿õô8¼¢ÈH‚yX&ÑÜÆåZ°·ñÓaÎ~ÂR -)¯…=ղŻ†â &И2Ù‘)„j‘^ êK¡„4“°ÜD•.")M¸ îo[¨j´"¸ìcŸ8§q cø?ž\Ø—:mÀw -uHöó¾¤Ç|X(ÂÎiá—0åÁ¯ýî× ‡%ɸìÚƒ]~2¦ˆ8­¢3¤PBþã^äK,l<0‰”¡ÄºwRÃÃRù‰Ú—É I³OFAãÃI•B„íŒ Lõ¾ b­*ÒW{pͦa¦öùŸÙÞâdW-Ë'ŸÜH£û´Í`7$^¤©W‘8z.êЋü;*Ö&>0A̼ I™µØú‘‚ ø3àU$NõŽoíeá—·©E¥¥Ë°‹c¸3¦)fõwÖ.=£5f–MmB]7{¾ùP5/‚–Žè';n¬·ÍýòøŽ—D¤ë"‚ÙV+Œ)r‹U˜5ZV % En‰y\kºsóL£¸;s2¹c:ÅeCÜñ—D³Ùyò뵊²:ä¹iKg(Ç3æxb6^<§a’ êÂ¥\9$Ä>Ša(Íâä£mˆ#ô}ˆµ˜± ®uS%aéA²çÉF<ôÄt0côz¸ ô(é²Oè=wÈF£>yN¬F0‚®w9¹ê Ñ!ŒüâUȲ­Áô7ø÷ó\â‡[äÝ,—PÞ\]Qé÷·¨ÈŽëªxŠ¢é‘t¾£ã‰£ò;:2 öø²x‹{e@ -ø6Uu^˜ç|:¥ÔËíäð%X8ä—@ÖONÙ™¿° -SÒ±H]^åí?ÒS”:j>ù^±$•MËÔ°Ö~¨ù®Ó›¨òëŠÖhé¸Zêî @­!5“Ößꦶü þyö{¶=êÇ{§ 9¶$â [Ùo„5òѨÛç³ -ïoGóù/. ÈR+¿”Ûû²W }˜x÷aî¶bK‚+52gõK䯰’Oß󅤧d0ð¨3”âK9ìºXÃø¹Ê'=ñÜdÇY–µBø Üc‰­’ÞRNªzcÐØ2•¼eཙüœ/ŒB+‚YK°>]3çÚàÔô‰é(±œÌ×üq]ÔÒ•h»¦éyù>¬oG{åM\4Ù™§© ÌÔîå«îTäfo¢d¥SʆuÓµ‘´F”T/¤*ÜÄ"Úé‚&‘v”gH æÅBY+*z âÛ“kȺªñŒ¯W¾q ¶Nr1=æÁ{F ³N·>©)‡kêøW}À{×.¬´;UBòœ•$‡3/ïtwG¤òt$qËoGćâ·éçë][ -‘mv¿`€÷˜¶”¬d檥—ˆT®•¨U~Ì:¼dLTФo*`›ð=Csì„ :Ó‚$G£C‹*zÒÛüªˆÇzY]R?Ž§iÊ­6&ldr¹á}Ö¢ç2D’©cŽ–RŽ½4õ1@@Ü zå©jF ¿Ê%™RQݤóvš•7Vi4(Á¦¿ o-ÎË C -ÈŒ./–ûš¡`¥ßV¬åÅù=uësôŠæò‚~ÃñQß‹?{Ù*.z{ö­`!ŒOÍžE¡â‹ù'™ÏmQ5%ä,fÝOýjïøÖî—_e^Š¬›GöŒ”"°‰»\ÃDnÂßCå^)›\íQ#l6 ²s™|lÄ=ý~Ðwÿ€Šú¡†Ê¹`Ê›V©káÇyùÛ[J•œû«9jn¨ûWN?°™âÓÕ#­µ§íGd©©,¾uÞ7ÑV"¸åµ–¸ËîÚ~ø>bNçØO!d¨ ÂÜk¿ütÞ $t~ÍI<bº ÞíÛŸ——¤Y¹–vÍŒ·…t0nÔžAƒS-L]~ýö¨®ñvÀi¤çPc3lwV¦ªt1¤ˆ´>8¬0±n!²ï|Ä»c_/dǙ߰N è5]·ªzŠ§9¨eS’ôêöjUÄ“b.doA&ò 1Þ˱[RßbG}ÎRâ²QÊõ6kŒlyhÆ*môãîOŠqÚWŽ°<˜;õ´ÞUH7$ÞO7#1Y‰jÜiÀOáA‰àûYT)®„ꯅÔ^ü„¶[m3#ªê!5÷?U˜'l(~1¾©Þ ·?lí)‘õ¨&Ýãùò[Mï@°ð»óH\Ç›xïÓ£¼äó¿ÚI—yÎ/vå)‹'±M?­šj)µ>Vå¢aȼ.íÜê9šº*ÇT÷QêƒcR F³ur7Œ4}¡ò‘ÖTrAØagdQ;I˜ûÚçÊõ)¯„6/k™^æ™65‡OWØY•—¦Ç“'^ûzâ¾Ú´FOìª1ô)•ägÊ3IÙq<õû!›0¶ä¿ѧ*ª]Fù¥O²Ð®˜Ñ(î«-†'óÊ^UŒ\¤€¡gó­µehôf'MzÂÌ[»•Ã W¡Þ]õ±îÐùꢿ:åd³a —Üý‹|š’6¡%kô¢@ÔÚÞŠ‰i,[J&im›Y¢¬ö03³Šþ§}õ+'Õ>-ï3ÁtÏM$©Eõ‹z¶K=ùkj¢š›ºùžÓ¦ÖÈà i]™"Á×m£ÇÓTH)ïÃ-!½¥g…ï °ùdYÎ2€«–Åù’åÕ ?Ká¯Ú—…V³ôö ˜–‹|¸²…~1®/‘ܳ.bñÛ¾v"Ü!+7‡Y;´~±wÑýᢳ›î1,Œ)×RU°*{Ø ¦è‰ã /Á^>3˜3â8T¬c —}ÁcŠ[¸o×5bgó+WFø­E(šÍ…ÛåÚR»sIrèߌÀuWÎw%ËGÈÆ!~vΉs­-ÓNžs“o{Øs/„çÓzFƒgUdˆ ÁŸ,ºï¯–¸nµpØ÷iÍKŸ_0Ü2]BíèÑ77k÷I_™v{ƒêÅ šæY|ÕA‰ÉmÄ„Ðkm =ʲV¯o¼³ ¢¯õ‰R)Å;DG–›-õ )û&a²M¼ÊýIûlXžæü£=¾ƒ"Tt·wc¹)öçöO,lyb¡R8K´ÆÏþcRÅÓt&ò®?1#ã+:=°µÑ(|UH5ßÁßX¼X™ªŸ_¾,¹LÒ íÏJ /°ñ¦°ðÉé2KJ맰‘0ªÎd蹇·` ý»6Vv¯|å âdzs‘@®ö\½®h‡êO´îÇ@²Ã$5Îëtys §\MsþO¦\CŸá§2íôè¢íeQ©úùy”†¶2Ú‚@ñˆÆrqªwYvi3¾q ïÎ2\Y±÷ÚåkU+ÇÂPª¬çø£ýóêÈ -ÒÆ °9QðÙsý‚v9êÎu12g‰j=I^Û¸å<¦¶±q;~?”, -:Ö¯}‰÷v,}çx>¯‡j+’¼ ¨XRÔi q8;­‘½–„¿¬Ÿ6mF\©%šÆžéƒàÉÒi?6‡/9ÒiHö^Å’ÕÃ&y{&Ìe$66Úr‘oMí’ÉÉ*Ëû†± õR¡ð•Á¯k7Î[ì…$"+•zSàCz¥ØöUP‹µ;«3ËP:1Ž .ÿ Û{‘q.ŸI´¬o^Ã{ßH¼÷ê£LMëV¢Z@eð» ¾Ô•w^6'þƒ¼¾z9–9ºB|`žB_úÓ­_!_‘ëÖxæL²b‹¨Fíã®F46<Ç~­½:1haFgØu• ü`¦¡i$úf©=wl†åQž ‰ÿÁµ5FXéFõüÐÝö¦”ysw]2_5.`kÕšQGB3ôpk­l·–_ÁKm°+Eâϲ¦þý<“¶†QwŸ}¾»L‚LT™Ñ§®ñ£[æmðy‰Í{Yñ‡Ç!ºÇ†Nî&…ÉÞ·Àí{_/&¦œÃ|eDòkæf§¯$/nœ­0³yü~öƒã4Œ3z¡RÈm)zí¯Â“‡è[XTÉ9ms¹Tº…äƒV-‘¸¯^qs—,HOï~öù {¹ÚLZ»¢Ý%…IhØ3Vß<9ïk¯Ã0÷›(;§˜¾ëXˆ`õQÔr[¬4ÎFRåS^Bãóx©Q÷(ò˜E)ò"|õãáÜk€áÍr¶S±|ürœeæ²èÒhÈ[m^ -ˆÒ—³AÕ÷Üì4*‡ËGFO„’P°Áñd‡œ¾×vu¼v£¬}  J6J(c8'Nj×mÕ‰kݸBgdî?PPÐuȈŒG/ýTø›!ž|¹$dKX]ò6ÃÑb~þÝäÄðå²W/]\î¢ã¸;cùb•zÿÔ9¿ßÊÍ^Ð`ö¶¨«QíÛ$ÂÐ2Òn«Ã­+³Çø/Bîr/–YÖmí‘×… ¯ñ™I"Wâ}-è¨>¢×6n#°Öӧ˿ÏT‹YeFÚ@ìT‰¨Ç¶&TGŒN·p/SòÖŽgzaN»zµú8#Xáü=ö6Œ¬ªˆ§)xû#YÄ)´9pÍd™"üF‚š¯€ÉŽ÷Ó±ü—j" F!m:™­•0./1S¿Àþ4×<¼ý@(°tÈ£^ž> +stream +xÚíwePœë–.Npwkîî îNpo ÆšÆÝ!H`Á%Á‚ÜÝ!hp‡$À½ï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}Õ ´šo8¤¬!– yˆ3Œƒ‡“[ v²twSƒ8«rHC­5,Á€g@A +ÂÀgY $ +ÐYdAV^^ˆˆ:@ââ ÛÚÁ̺Úú,llìÿ”üQXzÿy¶tÛ:Ÿ<@Ž'3ì™âløÀì@°# £¡i¨¤®`VP×(€œAP #@Óý9+€*Ø +äìbØ@ Ç¿+ˆ³5øOjnœÏ\Rn ÀÍd~6yY\þ@ìÔ ìæöü »l¡@gØs `ØÙÊÑÝúOÏrÈ_¹@!ÏNÏØ3™&Ä æf»ÀÏ^5eåÿŽf„ýñí~†›gMkˆ•ûŸ”þžižQì쀼`|Y‚Ö`7G ÷³ïg2(ø¯0ÜÝÀζÿŒ€Ù¡ÖŽ 7·gšgî?Õùgž€ÿ’=ÐÅÅÑû/kÈ_Zÿær´áDçá}öi{öm vFçú3,JÎ6÷ßrkw—` è_bþ33,ÏA­!ÎŽÞk :—:öìÀü?ë2翯Éÿ†ÿ[üoiïÿ®¹ÿÚ£ÿr‰ÿ·÷ù_©åÝÕNÏð÷’¥ÿK–¯x«ŒmBl;!\fÅX‡ú±¾§3ªëHF‚Üz;›#ZÚfŸ~£PµñA_œÞ²½ô("¤¿qÁ°J«{GÔŽÛ‡_Søã1yÿö†©wð[_ç9ò×m +¶œwh bHXŒ1A®9Fºå¾Ñô¯å‡ñ0L’¥Æè–}±¢=Dài–ùµò®ñ&K©«Rßn ¾Æ5Ò`îP¤¸‚£ßÀÍúÉDFM»··Ï$ïåH$ãbVëKOsXSÁf/°X°øÛf¾–mȇø«8…|$ø}ß@ d t°ŸF¨ëyÝó^†ˆ\°Çg¾ð76æU(n˜å÷jÅy³v>æ§ÄÚp:/œšKŽøiŠ>ÅìsÅl½s#Di¾1õ’O©ã!Oï +xË`ºÕ‚O³öÛÕ$ä²n[®o~¨El­Î ŒÈ3Áx‡Ö•ÅBBñ›„ª†Þøø£´¸[j:£m²tIÈ ¨DP‚îż\Ÿý"…äXM]['VÌž¾e¡¯—!nˆaóò‘´V„I¼¬úŒlxÙú8eiŒR÷…™²möIƒPCkÅJhÅòí8q)÷>×ãß2PSÎè…B»Ðol2zÈÞ'ƕΕÊë¬OPObÒ<¢Oêùii¿]v<“½Ø/q0­§¶Ǫ̃n^ž¶ð™| `dnŽ9'<ÖÚö¥JÍ( +b¾‘Büûþ”h…‡NV(SÍÇ:èƒü'ìp¢ëH7t|†Œ6Éx±m{žmÖø>2íßÂK¡(é +…”Q&t_´†{cjÞ•õ…n&ušj–•ªÅæ·¡-ó‘¹î4â¶á[îsòC\î°½Eoãl2†³Ê™ÒDZª^­ä/jnœ©N&æ þœèf%¡I +õ¥^úêä,J…àد¤”Ê~›ÄጾLãߦmñ¦¢¯ëÉ¥.EZøtD"ã¼Ýÿ Ò™ggçW¶·‘ö],Çæl1|®:0 2 … +Ž=Õï¸+¬ôåØ®g à®ä5†½—4UÆdRf9áê¢dHëU×Wsm6†.ÕýÞ®¡Y“ + Ê·?eÃÔjð¥Ò³­i‹–~K\Žkó# %¼Cñ ¤œlH +5ÎLûªî·ùrñŸ­«ep–"ë°BÓÛYF=_AîuŽ·žAn]{ ™¥”«Æ¼µ+f~œ“ÅÇîà¸ñ\Ý”FûaLÞLÍD`è/ÿºµZë`âV_²4ÛŠØxÍx DÄëÉ[=.ïÄÛÇÆ]„v×ñj•<sîÎD#‹Û.¦¯oà°ÓÌÜ &ˆ¤£jž Œõ(¦O~ôì·¥|¡¥¶›E÷ÉaÛ­ö‘^¯ ¦¾ +‡Ö_ |œí› _z¤+Ì•–§ÂÄm/ÌýÆÀa®Ö³¯ß:ΫN,‰Z¦àÓ¹š¶Eû¾(aåWµQný'1ú2¢ºùÒ¯ejˆxb\ ‡Ú7ÖuÛ\è)Ÿ_N5)2&í÷*Ð\_PG×ü˜¦zx¥ÚòÆ.@ßÕ&–wØ€O~Ûbœ6ÆDÞ§Äh…ó-yÖ+™Þþ2’y]f§¾¥¡t¢¥åÁÑ>»8Ÿr/’\‰‘\Üõ +Ðò˜ë…³Ç§×AÇPÂY•ÀÄH1îêh÷æà[ödߨ¢,7„ìÝÓÒ¦ˆ@ÄóJeêzçˆROüQãÒk ÙàûUj½¢QÔB¹l;ü@v\“ 3¬‰Å1‹tS`J=bŸ©+Cö^sfåNwÔÄša0>)-Yª$ÜÏ‚WÚI”Àá#L„ÈÇé WpUûŽ(›é©kZŠZ¼Õµ×r0m·ÒÏõ_à §\¨ŒÒ²ºn &uæ¼ÑµÃ—-)´ºZÁJ„¤š^1VçQKú‹7UÇv¿‡9‚„½G‡æÑ~Ìùq¿Ø»þ0jwù=Àœ¿ÕiÂHüœA‘®ÞÀ¸ÃAGíðk—SýL2ó"„6±ªaæØEĘ€áŠ«ÎŸšë9¤NV!÷¥Zad©Þo½—1kÝãkû™<5{Td¼\§¸¢ŽŒÚ¶¸nÄ—0iJµL^º+<+—w˶3¯ü\o_•º—#ÖìÐ5~¼Û +Z.yá‘æÿDüvi?ßÕa%cV+Z>&­ˆ Y0;¯P`BÌK­å¸îhþ +Leý¡OØAqîæ/,lŠUø„ª¦ôæµÊ,5òñRóð'xâdng’uŽÔˆ‡ó3|Ö('Ñ9‰ÛÕFa8¾N{‰ýJï²*Ù|7ië58‚-¢ržÄåùÎ[šXË»À{º¿ý“£º¶‡˜~¶œÀðéÇÁŒLFšWÜú5«ÅV?Ú‚ sY)bó +¶fª…:XáÏãõ]žøÓÎ:-z'\Û/½?‡Ö…Y1û öõ…--\ G»¼:J;%[‚îaº¾­C×^j½E4 OwÚù0 ß"Zj®·²¶{&?È !&ûÚܲ:¡-õW+)/¹A“û4Í觵J·µ©k=¶TE_ÉÍ–º34G…ˆÚušfæÁÁY‰·NÖ§ì«ä2VsTSý…Ÿä”hVkƒ ˜ü" +]‹pm77\K—“?‚üQÏu‡ÄH^ÙŸ2ÀJ¼³jW8]pòŠiañ +Öënª¾l±øjp Õ!Þ¸é2¥÷yS¼ì1â¢]»W~s=ˆÈ!?{*À¿Ûóó_a¾¨²;ýòëk'R7ßùÓÚ'Ãé¶b¬Œ,=Áe¿m ~\4üi]yàªÒáeJеÉÒ»öHß5ÛýáϲöŠýyŠ7ù~2µ/ó¾ +'ÇŽ¾ù6Þ”`ÂÃ+ ëâùK."y£yh•jN>I­þɯ»ƒ$Ô±GõjÓìJ:o#_èh0ÖÎ +üåu{$ɨ~J ŽËbOj®û¢yØ›WŠŒkñk ùõ蛨¼ Ž“ì®E÷ñdÛá¤S¼òèÛv¿Ä5£|hî·nÍZj`Æ9ǼQó×j~–9œrëUëÞuIéQ¿vHŸVkƒi{ÚJh"Þ*š¹é¡»iæ*¤Ãd¬»a¨SNäøMƒ¿ 3‰Ù4)õíô¡ÿÊéâ§þ_Þé’Öòþ"Š¼?ã¶òNô^©i²IËîo­¥ +±üÚd;–;ò³Ìä[SM·xÝK7¹‹ïÌ‹¤Ý–àíF,þ¹5¦ö²~\Õ9Ä?K”°`ÛJoºSà†´¶(Mën²dJ!ABXû™íüD¢Mï Ó A¹ZªAß뇄‚lûàÚ»r|9Þ¥•;›'ÏÅíu·:ú´i¶™[‹¡›$g R,÷8â”Ð|ƒ?úð©üF•s{:ÌV4äei¦e=wóöNí7Øä› +çEI}ÙDYEžsu<Š5…-§ùUÔ 2%-Ëd¤Û“n~GþÚ»a9$Ʋ㉠ÅMjnHá.$4ì:!lEϦ|ñcžTÏ]ÒÌY±„nAêýªrý§øUªê·µþ“¢eñ9É7³5dvÂ|ØÅ*ø÷s¶Ø hs´öI€×L +‘“Þ‘i!Búñ¹¢ºâ¥ +¯î—­ÔIZ­ðñ*ìs }ä[§ÊT ö†oFjqŽ2Ëîw8qÀ2ÈŽsBÞÒvÂpÄÐRógÕŸ¯ï–Xì N–AëŸ?6ÆU˜ôL¬g’k*üvÌþ–éä?•FµîÊÃn÷vÀØG!8ÖOçY¶dj’ª-XmÃ"÷rdZ¡ðRŸ³uÇé"RØ©–ÚŸ-JHRµ}™†ylÓÈüÎÕEÉêš\ù4Nï°. +çªÒb~’Sˆ?™¨j6 ŠÎÀ‹Ï9ˆ +í[Síç9¿„å«ÈM½¥Ô?ûH܉ñFãå§)¶ 4dI äOËy‡¦Úr–™r°¾€?5Ef¬úËõäÎAj4$µ6W†Ò­!ßCÔn­Õ´™w÷î»Ñáß›é1!Ð +aÏÈàÔ š3íRLm·:0{xÕËj¢J +DµC¡yDe- }½¯Ö7¤fnϼš›žM–.·ˆ˜ß12Þ¨Ž.CýÇ‚Q¶é(63AìàzÝö…˜ØÎ 3iÅ10’3æÀ5XQ5{]§¸AL«ýMŽ%³’y~å Æ/F­©å̺ç=—9_ǨžGÀˆ%ãèÆÃãœl;¨¶"u ª˜æ–x…Õ@Ú´©ödç%Ìojï#EÙ‡º¨c•ñÈîNXnœ >o”Õ°Â8J©+aº7‚„åµçõet1Ö;ÛÒc,usõñîÉ‘‰×žøvµí‹}•Ã¬ovaÊ7~’ûôj­ÔøBš=3d5Cr +=½«œàRv’îÀÄ:mƒ‡BÕ†â]Ÿý1Ò§6Ü`vg9®<®½Ç½³,Ï;Æ"„½ f§¬¬œO”r…ñsÌzòÕ5“VMg1…‹ƒ²öÚ2Í楈JV± +¶ïÝ 7°ñ%ôž‹B[€NIÁÊÃPÖeiÝó>8TÁ[OºÑQÛ½BëÓÀ·ö~“Ô®¾Ë~ôˆ¢Zç3„à[ÑÆßy_ˆ¸ùôò<~Ž0üìdÖVv’ÿÀWRiÒeÐÙW–ÂfHç+.¹‰ñÈ>²üpîá3f#ÐñvõB’ñ˜ +%4·ƒ´³)ÅrŸÙê¦ žM…µCŽ¼Eù +‡¯OÐæ»1kñu<ùR2%ˆ¥3ó×2ßt° {‚"_Y´~ÔÄb& ÛUB׎p#?9Ç×q“ú‘6wRËþÓÙP |J `°2^¯jšæ´nÙüÖÓcç÷Š"%æfžxï6&׌µ…—sö’RH~-ä©Ÿ%Öõ0Gà0þ‚1ƒ ù€\°éå€Î‘JH=01ÓMäWÉ’Ò¸›ÀÞ–…ªF ‚ËÞÖ±s*§ñ×0ºÿCÁñ¹}‰Ó:|‡`»d8ÆÃ|!Vv3Ÿ„)7^Í¿8LI†%×n¬’ðãQEÄ)A…¢²Ë{ᯰ°±À@Fúbëž K=ä'*_F '$Í^WÄ•‚ +¶Ó&0Õûâxã«•‘¾Ú/lê§kžÿ™í.LtÖ0ÖñyÀù(á4²GÓvCâAš|‰½ÿ¨ç¢=Ï»£diäUã¿“!.µ];T¼ŠÄ®Úö­¹(øú.¥°¤d VmqwlÆ8ɤþÞÚ¥{¤Ú̲±U°óf×7ªæ…ßÜýdÇ…ù®©OÏñ‚dMX Ëj™!Yn¡£z\ ߪ¾8¾Ð-Á#—sUwvŽqg{Væ×Û1ÙÀw`ÜáŒD–F.y„üZ¢,»YNêâ)ÊQû´9.?º¨÷I˜d½ú¹P g61Q¿bJ“Ø:ÙH+â0y/b F̼kídqXZìY’7-Ìm›n-Jºô3;Z÷²Ñ¿O®‹ ¿ó}vŽz|tŸ†X%²lK0Ý Þý§ØÁ&Yó”'GWDúÃ-*²ãš*®¢HZ$­ïȘFˆ<¶N‡ ½=ž,îÂãnéþ:¾UUæÁ1×­N!µË|;1t +ùÅŸyùÙ)+ãfA +@:©¡Ó«¬í2-Y©½ú³ïsbé”L5KÍ·ñê:= *¿®hŒª¤îöÔêS2hü­njÊNᯑg~dÙ£~ºw—cM$:·±•ýNP-ºu6Cßüá7ðv`ä7¯ÿàŸ4¥âk™½/+QùàÇñ÷ßégoË7%8S"ã°W¾Fþ ++þü#OPzR—*])®„Ý®“%Œ/³”`Â×MvŒyI+„ÏÀý †È*ñ=(ù¸*¡çí Ö‡ %oø¯F?çs£Ðò`–bÌÏ×L96ØÕ½¢:JÌÇsµ€y|×µ4%šÎ):Þk[Ñ^¹ãçvæ©jüÓ5»yªÛåÙûY(™iòa]´-D@$­a%Ucs©r7ш6Ú  ¤måé’‚þYdÑP–òòn¨ØVûÄ*²®ƒjÃëåïìˆ-œŒ€9ð®Ñü̸ӭOJòÁª:ÞU/ð޵몱3õN•€,ûcñÁ´ø}ƒ“.âΰT®Ž$NÙÂí°Ø`ÜÝ\ks²ÍÎWtð.㦒•Ìl•â"¡Êu •Ê匃8C‚¿&]c>ëT€ïé ÇxqЩ$) ZXÞÖêWId<ÚÃâ’òi,USn¥!~=ƒÓ ÷‹&M§!’L-S´”rÌ…©ânÐ+OU3*øNÉäòªFwS,t81J#Añ†80}¼y}k1zü@xÆ©Z¨r`ŒX%Zlj Ûx0 +÷J,Ý&}Ð_eYsP‚/%¸Ô;¦W‚ø(ú +{:±ÿrŠ¦­l¢¡Ü°ºj(*]û-íežÃvÉ‹pÚLjü®¥k:ý®cIQÇ ?£F(”³á§[œ·Ì™Z´½ÂÈ!=¯ø²a×q}™B.ºüe¥OeqM«¾npŸVšJß<Ä1 ȃemrÊòwµýaºNÕ +¥´f9k¦dŒ(·¾_ˆóx +UâóÏ/Ê ëíÑ.^‚4xF¿›;‹ŒnÒaÚ­/>©¯[PríÓ(Ȉaʈ1(³aCZöŒF‰¼`•óOƒN㇡ ÓCt~üóÖ8šÄûo;~¾ +ïôu¢PS‰~]!È€TÕÄ1‚äÎdc\‚ûÆ©¸Êd1 >US¼^x |án]&¡„húéH#!ÔÕ±8Á!HÑ¡ñ[Bœ®åwæÈ·Úéq¥Ãë¯ð•' +Ÿû¾ \å ->Z@ÔòéíwÉ*¿!F7 nef$,WÔ ¬öÞÊX;ÒB¨}ÄÎo%â"x{²¨¬1)àR鞊K‡ „zWÇKHŒUîŽ-ÕäÖ–Ð9uÔLxLª Ó¶ó@Þ÷¢N@ÁeÌ×ÁdT®(âPO™·W Ôo”ÂóýË6¹ûB÷€/z§ó}õ`°Òo+–²¢¼îÚµÀY:Es~y}¿¡¸¨E_<Œl¼={ƒ–1Æ&gŽ #QñDýͧÆ {ô7D<Ë\62:}:ÖvZK‡¡ø4í8šÞ _=ì:8ã n^¬PÁÅ\‚Ò‡µ1ç2•Å;LÕ­Î/Öm‘Þœ½ Ñ ûŠaÖáÓ#§î6‚»réú„û©&$F+» ø©A\(!|/2³*yÀ•Ð% îZPíåOh3™Õ2ªiSßS¹yüÖÇ¢—cêp{CÖž™ ZaÒÝžâßã©{úƒ…Þ¯ŸEâ8ÞÄyŸæ&õûÕLhˆç:‹ìÈS7`™~^1ÕRj>x,'ÍDÃy\ÚÚÉ8U³Ôµû”Ž)î#T/F¥âfjån¨{Cå#­#(å‚°ÐÃNI£¶1ö´Ï”É×ë’_í n\Ô0Šçš66…O•ÛY••¤Å‘%\ûzâ¼Ú°FKè¬6ô.‘äcÌ5IÞv8ñ»”]ôŸèUÑ.¥øÚ+Y`WÄ`ûÍÝ“iy·²F&܆Oß½€ñN”žÊ24z£ƒ:­žaúÝòAº«`ÏŽúhWè\Uá°‚_­r’Ù†KÈ0ÎÞyuq«à¢5Za jMOù¼Ä¦Ç-… ƒ¤¦UÐ,AV{ˆ‰IEÿóžú•“j¯–÷©@šç’Ô‚úyë…Èü5aõMí\wµaÈqcKäA´.¾L¡Àk‡öõÖ‘£©J¤äá–ž’òS‡‚÷X¼ý²Ì§éÀË¢¼vɲ*Ÿ¥Ð·qí‹«:{y Ë^Ù¿·®âHç1x­õß:‡ï€ C,íZ¿Øº€h þpÑY÷ÆèÆ«)*˜Ýlø“tD±Pq°—Ï4Æt€6å>Ë(ýEoð¨â&λ5˜™¼ŠåaÞpkaŠ‡Fs¡6ùŸ¶ÆìzÁw }#pí•ó]ñÒ!²qˆ»sÂlËCó”“çìÄ»nV†œs¡ÙÇÔî‘àBCðg‹®û«EÎ[-l¶=ó’ç —A¾Lg»`ZôÍÍ*‚Æ}â7Æž :±üÆ9f_uPBR+A?tÙZh²¤Õcàç,ƒèk}¬TÂJþÑ‘ ùfSgm\ʾQˆtC·boÂ> –Ž«9÷hç`£Ù)ÇY_jŒù¹õKžH°D'ÖòEÃÿQ©¢)Zyןˆ‘ qåXÚ/È}UH4ßÃÞX¼\ž¬›[ˆ_$jÐôe&‡—}Ø_SPðät‘)¥õSÈHUg"tßÜÃŽK î}+ ›WžrQ¹p g[Ž^g´C<Õg÷# éA¢ÇušÇœ9ºSŽ¦9ßgSÎÁ/p “öaZ´Ñö²¨”}|<Jƒ›­A ¸|Dc¹XÕ»L»ÔißØúó§é®,˜»mò5ª£a(•Ö³|Ñþ¹µ¤ù©cûX(xl9~A;Æìµgºè3Ž„5žÄ¯mܲSZY¹„H é׈ã¾ EÛ>ZÃí¦ÜŒ$Ë/lvhÌLid­æ!ÄmkÆ¥N™Uh‰¤²eø x2waØÎâIw’~P±dñ°IÚšóCN€õ‡4ŸçYS¹dp°Èò¼ahD½P¨|£÷ëÀÜIó}©‰ÈL@¥Úàÿ˜V!ºuÔlí΢€ÉÄ<˜F„í#ƒ‰ÃwˆÏÌúAxŒÓgâEæw¯¡ÝïÄÞ»uQ¦¦µôËQÍ Røz_ªŠ;/›‡cÿ^ß=ìKì¡>0OÁ€¯}iÖ€ooȵ +«Ü³&Y +o +)Gìc¯†5Ö=G­¾:6hfB£ßq• üh¦¡i$ün©={d†åR}§Ž»äÜ%¨p£|~ ènù +Qȼ¹».ž«ã·µjO¯%¦|¸µV¶ˆ]Í+ç¡2Ø‘"ög^UÿNv–ASÍ »Ç6×Õ&F&¬HïU׊¸¬Ç’y|VlóAVìá1[ö±¾ƒ«Qáe’÷-pëžß׋‘1»Ù0O‘ÝðRv•=ßÜì¤ý•Áù̓³F·_ÀÏ>p¬†q†BT +¹5Y¯íUxÒ ]3³*‡m§J— |Њ%×Õ+.®âyé©/>_`â+M$5ËÚR†íØ£uMs¾ö:ô³¿ ³²‹è:ñwQE,·DKbm$U>‡àÆç3 3•u Z” ß)ÂW=1̾®R/e9ÉÇ-ÅZf,‰,Ž„¼Óæ!‡8!í{9TþÈÉJ¥tè·|dðÄG(M´ Êé{mUÅi7ÈÚ +¨d¡„24ÒŠq`§tÞVK±ÔŽ)tDæ<ðÑT<¬È¸tÒOE¿9âÈÀ‹‚¶UÅïÒ-¶àçÞOŒ],yõÐÆæ,8Ž¹3”-DQª÷M^ÎúýVnò‚³µF5[-‹˜hß&òƒ–vZÆi‘Fœ@›WM–ÈÃo$¨¡q +l¸?Ë~©&Þ*¤N%±¶Äæ&dèç;ÀÁŸä˜‡·í – zÔÉ“EŒßÌìÙ¬Wé9ŸÚ¦q«D8¦¿N æè•€¿¦bîe¬3µtíÀfš4–;Ži]èÝÜA²Â ^aœryÉ%6å‘Óµ"l÷Þ„ îð3àm¦T Oڵ懌ñÏèS}­—±mmH›ѶQà åkʵŠ}D¬ ø_©ä÷L½”4šêw½a,춢‹xC4k´±ÖAnÑÉ’¶BŸð ”»g"˜ßô°ìȸÿ—ôÿOðÿ•#…Aœ€Pôÿóý*endstream endobj 1040 0 obj << /Type /Font @@ -10009,14 +10041,14 @@ endobj /FirstChar 35 /LastChar 122 /Widths 2151 0 R -/BaseFont /PMBWXU+NimbusMonL-BoldObli +/BaseFont /LFMJDH+NimbusMonL-BoldObli /FontDescriptor 1038 0 R >> endobj 1038 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /PMBWXU+NimbusMonL-BoldObli +/FontName /LFMJDH+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 @@ -10036,43 +10068,40 @@ endobj /Filter /FlateDecode >> stream -xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü- )@h`g°ñññ!SÄíìÝAæ`†š=##Ó?-¹ŒÝÿy‹t™ÛhÞ^\€Övö6@[ðÅ;P€-€35 ®¬¢#«$  “VÒHmŽFÖç·VL -  ­`fç°þÇ`bgk -ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øZÚrZbŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 -k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–># -sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦¢'¦ãfü¯êäœíe'×ijÞ ^ú«úò!,lÌ@Q“àx¹ ªy—3µ€ÖßDáµîÂôÄ©;bi¾©õZä7ôÛf]q?Žlcß?‹}…U´YFVg½\BšÃfÁOAœ¾Ý=ðÑP†>b*˜ª¦ ‰¯írß[îEÍÀo]æ7hÍO#Á]ö aOp£Ñ’ݬyÝGÜéÁK² ´dÝŽ½6[ -Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâº$ÉvŽÏÊ~{ÞÏ>ÐQµßS°Ââ¡v»Út`{æÙ°¨ï•›( wJÝ$ÒTùœÖ’F™yˆç·é›Öõ¸ÇÐv‰øoµBï:>ï2ýôK-ó»}—®ÒÁ//Ä€fHÓªQÒBÉÈÏâÏñIW]1NúX˜ðCk“L2 Ö¸V2ûØ/‰.®#G`1¼6ü~fÔ R–|Imd¬²ôðh„{üÑš¤‚™Ë»äË´ÿeÓ.ÿ…Kµla°. -‹jm“Ÿ˜=~ͼ”øh0IzÖ¦ú·O%_Ã% óa:¢hšP³ -S¹ÏÉÝÌŸÜü¾ØœQlq¸†=žà~pFÛÝÓ³0Ú=î,ùƒ272ï‘,n&£#:$Š¯JÚ0ˆ/ŠRžåe\ßoeEÄ`µ^×!Üæª-î¶ÿš¼îKÜ¥8ÈT?ß÷£G§Ö‰ƒf}a² nÄN’H”ûkëYwõ¤.<¥‡‰Kµ¢©mëŒy´˜M/a#EEjþ >Q fÀº¢Í.RU¶Í舽ݕ–ôºtó¯Uq¦SÜe«Ù+Ú-åòëhŸÛÞR5ùò` †’Ôg³Ð•ßNf@ÒEAÉD—ÐÖËå^-ùkõqß½¨}cÇ`ª‚h¾_¨óAËŒ‡ŽAPÐúBM<]Ü÷ MD Ñ:F¡u¿\å¼”ÖÑ„Ã`hy!¯ß1'O—©.[°é$¬k½,]sMʇG¡¬3ª&%ìõ¥íw0í1¼¬}ö´($ë‘ÊSBŠ· Žë̳§ª3¾·†DþIG—'Øa¤T¨M§ùƒœ.ã|AÆ6Q5¿3ËÞêŸÕ#¤­ì?@ÝeȾ‰BŽTÜscueûû%Ç‚,3Ôª?’ÌQ\û³ë;eŒŸ†<¸7ç—Ü×)Óyi›ú8Ëk×4$qEÝ:9œeŠîG<æ÷_àˆ/tàz'Nët­ÉxÜ -÷glü2®® O!ÝèCÖ½93ìôÙÆ_*©a …õD¼3»–èâ/ˆ’Ö®¼à–tõÊC¼z]îú¾¢(ñÏ~½ŸM¹ã±ÿ.#à:ônÓJÆê|ošAb%¬Äiªê3 M°úá]@’œïjoj'õÙ{˜D—ÚëF*‹/‡?Éå'Å!\˜ˆeÄ£Ýó5ئ;– ¤ÓÌî[f=O¼ótï«?=ê[("1AŠ“K£IÖOÅ»C¶+·àŠ3 U VkÍqˆWš–tpêþÌ1N«[„©Ë¦”cþpëY7ª|Rù³d<¶øiü7ÑL³¦%Mt1ÓÛ‚˜†ºĶÐÓ!E§ç¸ý$>ó*€€~0i÷ÄXÕÀÃg`ÈsFÃѸZ *%šHò± w),M,Ä~J¹9ç S-ÿc5 É•’w¶Ú#µÑ»ç¢áY¦:‘s‹{hh}ž>76 |Œ¹›U)y×R~L H€Ê좮!DG íM†2¸Ó9ýröþ<2‚Yqñ‚pÉr‡>Ÿ‹YV¡HHààCò˜O}÷x¡æŸm;>¯\>j$Ç9Jv=»7ØŒBW:ÜÚÛ\~ôm]<-h2ŒVòbÒGR&ÓÎjÎ@p°HRþtЉü1Á[ì #®W@S~õÇ’l°ú­á«b'ùÙáÜVS[E ºtz“ÕØ~%Mˆ¼²(51f–L›$°ÿ™Î¤/¨Ü}ù•{°¶&3M€}rÝX6¸ð€/@@t“±µûIñZ -ëŽ,/µs¡*/m¥$±¸§Þ˜¾§Û›§pnBÌHé”S*û0uœd²Â©èyÁ„Sçx"ŽšÓð§ÍïB½þôÁü{Y‹ð"ÂÏ1·¾Ú½IRA®ÙÜà‘=$Aê[ž„ÍŸþ媓D¸“§B1·ø ¼•"Höû÷Åj·Â¡Tˆû\ÑiÀ´G¿åG»xÿtÊí|ú?Ã4fÓmƒŒŠ% 2ôÝLTW¦‹Å&wË…j•¯?CÈÆ6X™-ù» "zQ׶Ó6å[g#Yóñäúd[†’°‘ã‹’È®óÐË" 6Ç”wue# ¬ MË%òG¦ìü) T sbw^˜¯ž«TMZ‰âK_5¤÷ýÈ¿“ÕÌß/ëâ¸|cÐùò{ý†VðÌSÛ¯Ã9rFòâý±6„ëhˆ·u^òö´g?›õ¡çxu) ìEºéµ5B=]× ;¥Â’Ë0¶§s7ÁjèSƒè‰#Jws¬Á¦ôE`"¨€:¾2̯sû6Œ¹cÌy!¤¬èb‘߸¬ÉZæc¼`ãû”mÍ—áM*ÛM&½{Rù³®óL–/ìœËG¬¤Á‰ß/é0™'_D¸ÑîWÛ­¹ð°cQþò¬-a ˜,EY(5JÉ4Nœè¦jEh]?L;x"üùÚ‡5Ï^Å8~AT©n2T³Tœ±¿A¿wÝWINîjK˜z¼Ú{jÈj9c¨(Mll‘_Œ‡Äñ›¿7^2êjNéÊzŠðë? œ™ãâ°bòY- 3cjåaŠ|Œ8í•»è‹p¹•2N¥€¨Z(Ó÷:c½JÈúMÈî¾vN›êè¥û}pÕ¿À kCn-,xŒ‰á¯Y®UÛ” ãç‘O(¥ÙýÎø'ó–CEƒºªëØeŠ ÿ€O¡•ÎýáÜ!ÄÕ³0ŽÿÙ™2"s¬o£w²;ÜëA¦{J(…5 ¡YlYÏšÈÚíi®Óâœûhå5ÄÊótZÉ“MÁ¡}—ágøN¬ cÝ ‘?ÃûÕ/Zy?aáj‹‡kÒ7}€*¨(5ߊßã1¶PhžÀt3íù¥@—I'•ÃB>1•GÚk:[„Pè{Ç$ÇZºô£ n[ý‘|¸aÏž³ ³{ÎÔ(ÂöTo°|кÂ@@%Ö˜·§X „¹=VA3ìB8Mä%dÿÀ·¦Û™~´FK3¨t_èl¿i'pw^ߊ¶÷?­Ö¦ˆ%•áæRaÏ„ápŒ{ÿÀ@´Z=GD'jqÜ7NØ#þjpþ;JxvVÔïÝô°˜ÛHhW ­Ô>oqd"y“¬CrîdÒm‚ÿÓú¶sÔ|I»î5lExYeW[{ßÌU“3¤à0Òp·åÍ…Mœ{áX¿à¤©Ø‰¼ƒaíHݨ*M(„%~çTßõÎ60CÈVî³Yû~©­ƒ?>æaßCX¾ydD`0+ù½ÎÞEŠ‹ÌFD‹ còKó­1zØãÿ Õš+çµP(¹§ 7c«¨ ½õÿž¯ôÓÞ÷²Àya];ço¿©ÿ -ϲiSÛz´­õ…¡I§ `~œm5é—ÀyyB‘Áƒ"[{ÁûqâoÓÐåºïªðRBøœ -;Øw3øGæüõù¤…Þì€E -ªõVÖ>ß"‰Ï“Br{´5ë¼â@u´@a¬Ö“saô| y\qÊýÛþÔ*¾Ï|ffi&Qå -žzÊ6âÄ:gÒ¬?yéM|â(¦‰RÕùr ði­æp2¤ˆp(â 1¤¸£œ¡æ1Rᨅ 59©ðÏ~J{ÖÜñÙôu³Y+ÂJàå)$Müà¹kMˆz,ª.hÚU ñ…1FÑÖÅ*§, /+CÅe+ÅàãïG›},{S&›1ê’™l8ÈÏ›òIø°°€¸¤•·©x€*Ú§wH™^kŽ6ìÔZ$Hq¼Æ!Ü Oý#$*%UˆÜGP õi±}&ÌKá6ºÙÍ(ô@€ØuzZ Ý^ˆà>ªR|­ fö*9 Ÿ}&R°ýgFÝ^å†áÞõ°(|õA~øo,"ÊŠöjes>@vôfK=²ŸßýÄý¥¹£ì“ã§.WòÞNBtÎáÂLå*B±Æ5“¢MÔ®øÙûè¡Cž)øð nßúB¦€×~µ_ƒ8c“Îãš(‚×'ÏÙ¿²6¬iÓкõ°T«¥‰;kÔ4¥ÒªÐÞ™bä® 5˜Ò´íEXŠC†q)6ôfWº‘d0¥àl‚$8ç< -Ì“ ¦Nó”-ü¨(Û–7 .\2Q0¼[ã>ÞÞc¼9&‹+LÄ@¸J°aiÆ—23Äoâ+Åçu%•!·îÐ èä™G—!WùIŽ‰ó¢fÌŒp V[ºÁ);A Ž+Pc¹ÚY¨N7ÓfH¡RÜõªv¸¯Î_ÛüdE…Ð鼦‰ˆzèže.7-„ê½NϨ?iœ¢}U'ÓÁ¦çÿ -Úóž¨e6[x5±IœG·6ünñ>ìlu ¬YØÐâBZ *7VU?Átr T1[¸™w¯ËÖj6Ó”äê#ŒSÔ\D¾y¶¢yÂw” k7ÏC¤Î‹ b‡døé’|7ÝÖè¯:9so³h2ûñ¸î–¾ÈUªû—rl’9å'sÙ°Q@ýBîå6Õ:íkX‹(­ió¼·õUðW¼ÕÂîcŠ˜-¹¤ƒ¾-Nyˆ®:RjQ4KàŒTÇc—ûÜœï¥&)ëdQb¼‘– ˜hïáœ#±»¬žS£`KXÓK5S°]Ħ~ WUðã?É g7ÚX¿~p™ÑðÎu=*•ÝGK;t·Ú›iC¢­Õc‘n6=‡˜ñtÄY9ÉæU¹¿«õ¸² êvæão?32y ÊÂEò^‚iYk»QD}ÔÓp>ÌÔ>¨[ÑeØØÙÎGuncáTçÊÅGP½L`.عjÝVͳ…U16–!]!•PN‘âñ³ª^{[T´^Þ•tBÅ.‘¿˜ç‡n\¾„a ªáàïëðõGn‡ ÜÌÂí?¨‘‘å²cýP'}¿ô51iå0¦Tz4½‹Úç=Á‹º£ë°½„ª&koMæ!ø\ß"g*ãÐu»r £6„ŽÑm­³šÞRAàÐ,H¶ëUõ@=ÒØೞTÄ2–‰ÆŽ÷ã3él~ éÅ»{ º;j•ÜvÓœ:Ý×I“ª]:³Í~ÿòYŒ“o4|l‘E½&$è0¼¾Mi4p˜òÈK]Pào½Ö§Y[5¯…ˆDEì¬h.«POýéµû’%.71&x—Ïèó+xgŒÓ`*”¥n*04üøý±@Ó]ì ײ»«Q½»;(s†'FTkhÃ…û53èÞT?>·:ïðI^Ä&¯ñª¹˜SùÂysð&Ú‚œŸÊ¿–<㈮¹_½<ýrz@go*aÄM½ù Uß¹õÊ&ÑQù™ÉS€AéÝa’S2N—‚ÃÖT¾ÎÁ²Ûä!µVEýn×?ÃDI%q(P{<·ëÑÊÏ1ÉT_§ åíæ8UON„·:°#‰©_R;×|öwˆåoxr¡9ÂÃ8smª¾F¶¦%ÄM‡(è99ÄòîúÄc˜†Å‘¼öJj¬ªÅ2¦<¤®nt [.K©Ã`-›]ì†ý0HýÍþ©.l7ƤSÄBîÆ\+õ;ŽÑ®Bs…ÈþöÕ¦ÙG•..vè»6ˆ_RÙ]¿Åâž¹AÿNh¼ãšc A4Ì×Ùrí¼Ülwƒ ]ÇL`©xNªe–eé;ø»¯çnðœB622ݧ1‡n7ú½+n¶ôHàû:/øå%5†}ÎœÐüÇ*cK[\µ)/0Zõ:Tx ×WÇ`G,96\=k°ß¼0 ô¸z{—Už I[ë‹p†¨`ûq … T¶dp½”z2¶º£H5³SÿæGPýŽÌ.\Œ¸p3àzW‘‡~Qh¥ÞNLè¾\‘YŸnÕ­^o…Œ)Èó”å~vûL·Îò‡*´Ž¦9u#ü=]KÝÅ7:l1ãž(oìÅc'ç1tB¨® ií<‹½n°ÖÚGT¼8 Z-á{#Ý_H7©2!j·´$PˆïBë*ÇÛ¿˜øÀ3¹ø Ûꦶ §Al(,8(ëC=»Òt(Ø‹®=8û~b¶ˆ†Ð¡~á§=\õvÉ' AG+‘¤¯Ûœ’Æ—߆%{R ;Ò毲íS~0²L…r”èã«3qû¹$¸^Ï„Ò4VÔRJ»Ã׶J™~rë/×a«)G²:Vê„ ò ÛªzVm|Ç·ªnZCÆuP½5þjBoËþ•‰{º.u½HÐ8¦ýáÑ»BI¯ïöÁå¼9ö˻ò®ÔŸV9N‡-z(~ÎzÜ”œ¿‡eÌ?‹÷¯¸™Ø?ÎÝS“íHþÀi¹OB*jám<ÕœZ–[’‹và™±lcxf‹hâ&^2$w -ÎÒOVYrX¢ïàwJŒSôm‡¯)&`WfXñï³’Ò‚‰oRâ­‘cƒ'ò­–c^ÎlïŽOF–õ×Ùgäëf>MÅ·+(çÑ£ø½fM•ÝiïJÍ+lÉÎ$›©Øȧi‹ Kº¢»»þYÆa´á+“Ðã)ÕÕ;{¶ -{郎£¼Ã/ô‰ï-˨–ÞëijNg°ÐMë"@þ0ƒ[ ®xžd/mý€p @{ m·bÊ3ö£±™W€¯>š‰øç_ìŒïyž"ÿÜßXvܺ†FŽ• -+›5Æô™6ì{ˆñéŽzÔOBz>1%Α}}mBl*î Èà+’?îÍ6 ±3™þ™^\É;<·ør ø»(YËV¼5,{n½@Ø`2Ÿ<Þ#‡æé6~p/Ø t+—¢44bOT§UŸPʲÁ%Ï™Ý×êmŠ¿¶kš¹ÒÍ»¿^Q6R|Vœ=¡ÒÝ03ÉX­®/Õ¨îmˆÔ-gNGŒT=(k÷m‘mÏòæôB"VžŽ”õhs>ƒ²ß€ ¦|–¼,–¹g,Tà³wÐ Dt:‚vmœ¿[ñ²ìþ‰hï:©AãÓ>ȼK}êPJL¶¦¥;“_ªÞ!Ëѯô¢ßn³1VÕöe¬W¿FèÇHKi(ã%WQŒK>÷K ÜDV¾ˆšƒ(•‡õ-¡•¡¯Ô¼a†¸$E@Q‡¼Â(‹gÏ#'%‹¸\¡íͷ¡P‰Õs÷úëC¶•Rä,wœ©¹äÔº1¶wЕ@®ñút„À—ª|­écho>àW{ÿ»Ì6+(RÝÇ ]\Ä2ÖZ!M; Ly–whÊDDëÊ¿£êDœâŸ€ylÊð–Syûwzcc”S©Ä’QÄÍ&Ó(füaÍ+uà³þ{ýîTÄ3[ÜaÔ -^Á?g½Ç[eœ[T.¸;8Ëñ1S¢ÒŠs¹£ìãíÃ.õy‡¸MnÕ\v¡.Tü©Ä%ñõdaÑÉ•%úh¡æÍ".‰„%{O÷0+íøHæ¢D!‹fäYvç׺X¿R+b-Ý°M&ã\ †Úç¾5 -7³”rÁ©£håIËC3L—ÏÝ| á`õ|,bÂd¨VŸŠFsbðdQãØ*Y„ÒË×Úó2ξäÑø~Ð@HÿtyYÓ%ô@웸xœ×­j)œL‘S b(€hãûÜs ­âMß?j«%ÔpVjÖD²Þ}Ä ož)?·ŽLH{ï"£ñgð>ž¢^¤?¼#™G¶|gF˜5¹ÒoPûæ*Ï›:åC²fn°±\ÜEÞ'µ1[™Ðý-î…ƒ€ª^J€•†h$>rþ]™4Q¶â@/;¸€’ÅJRlºl,HŠœi¢~Æ»ü›ŸïÁeé^v×eatÀ cI~ž¿o=•¦œ÷²U?¦¢)‚QÃ-Ò…{ˆbú'2)Û™”²ÿóe6Å ²›6©U5Ã;ßðþ4(é@ñ㬃´nž­ÂøZáNÐp»‘$!¢ã½e“JŽV-õ¬·xØ«ôz-o¾óá@%³hL 21F+—t"±£ŽÚ1N eá!q…cÉM¬¹J÷AÝ}²m‘”Ðn.~,r%UŸtg€|d4N[¯]rÖUöì!—q4Ì™§M†éýx¼¼°z4ÉÜVzv‚5+=rCMõÂ}@Þrþ‚ó!bàS_ä6ýŸ—µÆw¬‰«+FE€ô¼f‰ðPµNªéö~yÚ½VƒL½Ä«ÅcÈòæqA‘ ‹$‹@BÊñ0oþ<ÓörÖq@‹¼Ìj=ù†Øz­X©Ö»à⣣ÙVæTâYMi£ÒÓK¨×l´—틧¡{¥»¬ëe˜R™ÏJñ­j}Ú§ÝoìU¿ë à{™ä–\©†õ6Ü:ƒ·¬ct5I/« €,¸Eð=÷ Â8i¢+~[‰2ðL~¿%˽ΨEdµÄ3C}®éX…VÇÝ?àëV!CŽä‚à`D2Òé4Û%‘çÖ9¿×õH„)¥ð„ÁúO”P7tt1iU~½&=I¾òèÏF}=шû\XUêÅá[&¹î3=ûŠ†ž2¦8Š¼á"GĘ›À[pClC½ÆXÊÉÍÿQi¶Qk bºmj‹df$Àw =õ´åƒ‡”]·¨¼þÑØŸKƒ©ÄøÄ[¨žúÝðq*ø!y›%Å…øØLÏ?×-+Ù‚õ´RGÒX I†ÿI±`dìÚhZN¹Í"VÛ‡ûô2_®ËâÈ«Rßó!«r -2¯å²vƒêõj:¨¿Q<¯%C/õ±c“I+úI~ŠøwØc`µÝµýƒ§¡þŽ¤ûJâ˜ô ]8 SÆ/¸÷E.ƒa©4Íî¢gb‹òéž7î;‹f"pçìÏðB]u±¿‘ßó‡èãb·4îžiÀ[.þB&Òva­¬7*l?TГ„ræÝÜnàœ`á'r¬Ó¦Ló1&9¿å8ƒÓG§~p…QxcÃÒ=´Z‘ðŽ±Ä5ä‡Ø×n™ù VbY§©àùÏ"§Ñœ}úþZ–§75’¿@-[Ë›œ1=u˜Oÿa"&¦u¶|Êê;ÏõåÅÆŸ'?Hl4ëE\³Üà#ï<Æ— -¹`†\ÿ¥¨ª1¡Õ–£ªø«¤\Å'GË'²RSƒbzûÀ…´ãé‘!©¼?ôdFÕ±EÜ%üÝtk'õð‹äpNA‹Ûº†‘ã«óµýñÙyõ)¶'Þ¸$—( ºI‰fÞê¢*) -£ÖöQðŠ,$ªõ@˜Ôáö%Õóø*(lŒl>9h¼à˜áxJ¹öÅþãn ˆï§šxíWE¦º²Úa2”b÷^+BBF¶-c¬>À‡ ïç ›Ô„üR¸²ý³áìKE±®èÕ'¥Åq5/ÃÊÛËÑ»ï-ï'{+Z‚"Ìô”{9…Öñ›‰ò¥YnY’8ùUú³­^dËÈæõqàÝÝÚJÌ7C)[yðîñïÆ^3>@–cÉã1ùéóRŒ€Í}hH˸À ÒlÛu…ûÎ÷e]“$;eÑFøUo¡â_õ÷[±S}•ùÉ%=4qEãå.\ïÚ4ãòoðá#;íC•ßw®îÊñáq–Ó ’òS„Uóë$׈ÉÌ‚Ëç«0Ã&q¾å¤üPàÄ´ø´€D g+m„• OÑ v÷ù#¹r”üœ¿yÁ(›‚9MÌ ¶1;–/ņ޺úàËÓ=’8s(ÀÐgŽúá„©¨­¦ -NaãLïñ˾œ[{Uy<-Þ€-§Žà@÷ÎG{|Ñâ'ú*&MËDß×°‚ÚKÆí¹W!¡ÏN¤µ‘ÖÅe<Ò}øÖÐÇÞfnÑ»…³µêmºŽ5Y ’8&€ù³js¬†]ea^å(Þ¦14üŒ`pË{B/{ã“ÜŘÊgþ6<ÔÆGE§Iwuy³¯<¡= 7…ýÉ̸¶ä3…}€ÉüR4{Ò^ø<zN‚‚!y™ÃÛíÃáxVRο0,¹V‡}’Op7A7!ÐTÑQP˜ùT™ÜÞl,P½ÙTE™>>™åÝ°^ûþR›„»¸8'n¤-ìJk®²QC - ¦Ô"ZñwOòï™»ÏöP÷ê¨.ÐJî~&Ö>zm^B¦[s°'òYøš×Y­D˜¾ -¨ÿKuß!å"|ÐÙEÆVÌð}†ô¡¿ O'®ÖÎþ€å&-¸ùhì8ö²0ËüÀëèæy€ôõ«`o­$‡Rš´y?…|¨ç>K/µ^¸°«l/J¿í§öÙÄ¿Ñ׶ݶëÒ“<‰âïŒçî*O©ÍTK?5;º(›o³ÇUJN¤P3 -øÍæ6?ÅÖ%X<²˜6˜ü” èýÇÓ·55ιbÏ(L853ïáˆÕë¡›íÐêº/ÂÐ7q‹^¿_5 -r•ŽQ¾¹42"ÒQyܽ…8[E~*ï\ºÊYòÃå«&R½n<NÁŽ¨ÎŒóöÀ8mÈpf0 <«±Ìœ/Fµ{ —·î9ýöÝ„PœÒÄ@cÅÿ4¦; ™«×”¯ü¨K­ À$çdLÎð©»$?ÊCîYÇF¢á‰á&Ø,ØÏ<Ú#@Ë%® ]g‰hƦÌäÒ†F`{&(]ž·/iÇÕÜ\p±"Ëbö>¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ -®ŽW_hi+yñ¸âÅ‹…† -ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦vâÿé÷ü¯ÔR.66Jƶo ðKðvËØÝ36ÆN€¿îGàÿfl ²ñø/ÿÕQøbÿï_aY°ñÛPDí,Þ„afcgaý‡ä,rš©€À¦–sc›·™ým×´3:Ù€ì€oÚþ=Ö· VÖÁ4,A¦Öv‰Àõhgö¯å¿Éõwñ%•$•4dÿ«öoO•·Mkx8ÿ–F[ÑÞì?ñˆ‰Ù»¼˜¹ÙÌì<N/›Ï‘ño¶žÁN wÀgVVV6ÀÛÿ¿?ÿ<ü ¤©½Ù_›£6¶3{[¶ÿ0ü›º89½iü÷÷ÿÖô¿Ÿÿ^{ ÐhŠ¼4oo*l•–™®ÅÏ“øÜÓÅ3âPÒ QTà_mßé—¾ÁWaôTÂÒ8ÁÿÒê1wäð¼#Ç°;Ô…gCÛùxšOìCIß]ð~¦‡q7ðã—´ôcíh¯³Y…uX=nV­ÝÍ1Uµ/'x’‰6'ij[zJתt_ÓÔú8ÜvÌF(¬Ú£cš¤ƒÛÚ¾áÁþÎ ¸î"Æœ8$jWX4š(Ç"a=Í +¯Æíwu»d±Ý‰¹ÜÆXæ§R÷)Áxãi³åyª¶š—ܾí9ÞYò<0”jûˆ/²­pÛ2 D¯"k<û¶¨ó¼ˆ­pΛlxEv'Ê%Ëž…¹`|R_•·–ñÿd{÷ç9óÙ¢Ü߶e@°-Q–äÿˆO$¯ê2Á³|ÀnåäÉ4¸Ø¢¶œ£íG>ÐK´®‹²üE{ÝsÔGµ÷Î~ï—¶Gí'Ä”›’V¬Éà‡$¾}¿6?dÊ—|ñÔ'Hr;ùMŒ]IJd÷d“ÂUu?¥¾q¬Àe¢zœUú… ~Æ¡dë/O *‘¶²læ ³,D/L§­„Ÿ5)¹;+În3†Ô¼Á¼ô× ÃXؘA¢(¦! rµšT ®çjm¿‚ˆ"ê:=8„é‰ÓvÅÒýÒ´ÉoèwÌ»ã¿ÛŽû«h»‚¬Î.zµŒ4Í$‚Ÿ!‹8s»wè«© }ÌT8-TCšP×í±¿Ò‡š…ß¾*hÔ>_˜A‚»êEžä>A£%»Y÷¾¼Ó‡— +bEh;m&¶2q@¤}Ï7 ëX£ÇuénÉ=µLiØ®Z#‹ ÒÃxLçÜȾÓ>•ƒàÑYô…Í ¤qk#è3‡ãMà¸ò“üLvq|ìD\0D¿Åv „|uw•­ K³KòÉôﺸ씪ÊÌ=½Ðz ¢˜A‘'¨÷GêîéÃä}-.ÍÒ!˜ 1†Akµ§„öŒÜ̆(;¿+ñ‘7ÕÖÊ(C²I|ÒAÿG÷CŒuŒrQÑV…=3åŠè’>·uŠ?œ5Trh¯©ŽòÒ^¢HNåç4 ’/Sîˆë‘~_Ë.ÿôa÷rû»õPã ôdìo0gùš²þ›D"îbHèœé–š”¢‘:æ]jx6Ϥ0õ!5½‹%CDAçK*Ë3W'Á¤='€.I5p4¬›#CF¢NóÕ`Âv'F.ÛB|Ê]ÞOŠá€íú #&ãøÆ6“¦P~…‡mŒo7±™›1Ϩ)b´S«ü²h*^‹ÅÇâçü¸ð1~çŠæÆß_ÒEàj¦cþسի9ôžÆP±&*Y £ xkâÇ¡r_u¦Ó«8¦Ca1è³M/FìÝHHºq˜ÜÂb¿Ïá[l×êkû¬úËƦ¡¶¯F$¹äÆÇ´vyW +†üdË‘È)ÜÑ˹ʱ„ƒ¡¼(«BuV•ÚèHbNÒnAÂé¨X^‰$2a€ÕóEч(¤hÉãcTsë5V»´"ËŒV÷o¿=ÍÊ~€íçÙ7¡èûÉ;ÊÝ/ÁP®}€ ƒ·õMDK°+Ãä²4'ø«<£¥sâáÙ9,ìú)t aúBD.ÈÊ?ÃîƒÑ $ÜjIàsT¦9õ¸zNÓõ% (ªÎ»é}ìsZ^N Û÷FÎ9PJ‡¦4k[«ç f4e«’ùN·C Ì«üj}B¨ª–^xÄ€(4ì—ß«qe Ë:m“®Æ ö¤¼êͶW=§µjØÊo„’Œ 3²8yj‰ê`nûÁâ'YÚTKM”‹ùÂÔì %Ù³¹Â]¢þãEš ®ßHœÑ"P/V,N~οPóÙ3ãþ™Ç ­ù¡cÈeü¤S¯ƒ´ +ýÏTa%ª£3»Ùª]`ÁQ êó}³x:HX¿U;úŒ hHØõKጬ‰•Y)f.¤«â£Þ„ÇG8îàôº¯a»p7åsÚBc£µÎ¥7apx X&_­ð¬)wMÔY„«9y™ÁŸe!Ë×÷*$“ §E¿jéŒ)f?ÂwJ×ÓŽRIßU±($ {û‹xÜ©ÎMYÈÅäJõÅc?—Þ^Ì:yðý¡_nA7üÕ©Ô–?Ài¤kðÉPHRòÎzçiÞY­Ýû+Öäˆ2…tzW3¦Ž­à:]q¨¢–½¾:µ;›ôšÿL±î\ì{¯1üÛüë]¥ôî•ÀJªÏªœûÄøø¾z$A)ŽöNÏÊþû>ϾЇÑu—ßR±Â ö’ºÛua{Ø°¨ï•›)wËÜ%ÒUùœ×“ǘy‰–wè–š7ô¹ÇÑöˆøoµÃî:5Nö˜~ø§•ûß¾ËPéä—b@3¢€iÓ,m ¥däg àø¤'®/}"Lø¡-”ÉP&kB;…}ü§D7×±0œ^þ +ú)[¾ž¤.ª×VYzd,Ò#áx]RÁÜõ]òe&`”2Ÿé3WÀâ•ZŽ°X…Eµ®ÙßWÌ¿vAJ|,„$={Kýë§Ò/Ð0Ñ4ͨÙEiÜ.äîOîþŸmÏ)¶9ÜÂOq?¸ ííë[ï]ÄtŽþF™]ðL7 +—ÑÅW%HkÂE©(ˆö6i°¶&b°Þ¨ïnwÓ÷߀MÙð#îVbjXèÿÞ«[k‹ÄA³±8Õ 7j/I$Êý¥í¼ž;‘zJFžÀÊÓÔµFÑÌ®mÆ"F̶ƒ°‰¢2­`Ÿ¨3pCQŽf©:ÇvlÔÁþZ[zCºåçš8ÓîŠu¤ì5í¶rÅŸßÛ¾25ùŠ †ÒVÔgó°Õ_Γæ@ÒïÅ™…Á)DWÐ6+Þ­ë ‡ñß¼©MüâÆaªƒi>_ªóCËLD CP]ÐúÂL½\=ö›ŠLE Ñ:Ç¡õ>_ç¾”ÕÓDÀ`h{#oÜ1§ÌT«®X²é¦ nh¿,ÿá2ž’ ‰ˆFÙ`TMN>ÜïO?èdÚg>|Y×ð²,"ë•ÊWBJ° ‰ëÊw ª7¹·DþAG—/Øi¬\¤C§õœ.óbƒAÆ.Iµ +ËÁúŸõ#¤½ü?PÝuØ¡™BŽTÜksmuçÛÇ¢,3ÔZ’ÌQ|7û³Û;eOŒF<¸7ƒWÜRgò Ó· pVÖÿÐÄ÷èæjnr–+zóX܆;$¾Ô%€ë›<«×³!ãq/:˜µõϼ¾†<…ö  ÝðáÌ´w4`›x©¢†1ÖñÉê^ah¤K¸$J^¿ö†[ÖÓ¯õîs ¼ëÿz†¢Ä?÷å~.õŽÇá[„P¬€Ûð»-kë‹ý‰ÕL°§™ªï 4ÁÚ‡þ Ir¾ëýéÝ´g3ì=jï©l¾\þd×Gpá"V‘tÏÀ¶5Øq\ Ýv¿r›âÝß {?ƒ™1¿"‰IRœ<-²*Þ]²=¹E7œA©B±:Ž#¼²ôäÃSPÇ­^1¦?˜"PPŽuáùíWý˜òiÕÒ‰¸’§‰_D³-ZV4áÐ%TLo bæñÛR_—žãö“øì«úá”ýcuW Ÿ¡Ï9 GÓZ¨Œh2Ù×’Þµ¨,©û)õ悃Lµâ·õ $Wjþ%ÚZ¯Ôfß¾«¦W¹êdî-î ±íynæÂÄ(è1ö2|N¥ô]kÃÅ%200*«›ºR„1¬/ÊðN÷ìóùû‹¨HfÅ¥KÂe«]ú,fY…b!Ã)ã¾ íÜà…F˜´ïú¾rùª‘œ4å*Ù÷îÝ`ÿ6[ítïhwýÞ¿}ù´¨Å0VÅ‹IE™B;§5 ÁÁ"MLýÝI'òÛlo©?œ¸Q Mù%K²Ñú—¦ŸŠ½¤†Â…¬–ŽŠ6tÙÌ ª‰ÃjºyUqjRì™IP?þ3i^p…úÊ*÷a]mVºúÔ†‰lHÑ!_ €è&c[Ï“â)¬;²ü´®ÅêüôÕÒ¤’ÞúÞž¢ùI1c¥3N¨œ£´ ’©JçâçESNÝ“Qˆ8jn'Z, €"¬ õϧwßÊ[…—~Œ»÷‡zÖíO‘ +rÍå…Œ†ê# Rßò,"lêþ¨¨T"‚è:‰¹'\â­CrÞ×z,Õ¸ §A:æ‹Ïg<¬>Ú'dPîÐÿ¡1ŸibT,­L”¡ïéd¢º6[*1½[)R«¢x úJ6Ž°ÉÊlÅß ùЇº¾“¾%ß6%€ÌZ€ÿ@ ×/Û:œŒœPœLö'½<Òpk\yOO6ÒÐÆÈÔ©B"ÑitÚ>€Bµ8o)vçùêµFÕ¬$¾üESúÀŸüY=ÁÂýŠŽëWÝÏ¿6nhϽ±ý;]¢f%(ÞŸèA¸Ž‡yÛ$o/Aûv sÙzOÖÆ’±È^d¡›_Û"Õ3ôܱS+­¸Œâz»ö­‡?5Šž:¡ô´Ä)lI_%Š¨ ªÂý»6}ê™;Ç]CË‹/—øMÊ›md>&ö3¾OÝÑzÙ¢²ÛbÒ¿'•?OäºÈ"`ùÌθrÌJâ˜ô튓yðYtè»;íAýºû);†1åO¯º2¶€ér´¥Ró˜”LÓ Á©^šv¤öŸ‡G/„ß_ú±Ø«'.‰ªÔM“k—K26é÷ÿôWSºÛ§¯÷ŸšN×V¦KÃã|³DZ£…C3¿åB”‰…³[ÏY *J“›Ûä—añüïM–͇»‡[R»³Ÿ"ýŽ‚fç¹8¬™^} µö:›QòbSpìØcø±gÊX?KÀð~íó‡6ÞOX¸:âZôÍ  ++Ë,¶öyL,Z&1ÝÍz*ÐßeÑIå²ONçÓ‡õ™Í#ùÝ1Éq…•-eÀh‡ÛQ$ßn:pEä®Àì]05‰°=5˜®‡¶­2P‰5eÃí+–an„UÐŒºÎ’x Ù?ò­ëue¢¯ÓÒ )Ý7º:n:<\6¶c¬ÅÎjt(âHe¸¹Tس`8œâß?0­•ÇÌщZžôOöŠ¿^üŠõ·="æ>ÖÝJ+u@ãW•DÞ,똒7•|›ðÝ쨾ýµ€€@Ò¾g[^VÙMÅÎÁ/kÍô)$œ4Â}ekñ{3ç~ÖOøA)D*v"ŸX{Rwª*S +aÉÁ_¹5wCs̲ÕûÖþŸjÆàùØ÷–¯ž™‘ÌJþ¯swQ⢃³F‘1b˜üÒ|ë FžøßIµç+x-Jï)#ÌÙªëÃn¾(ýpð»*tYÜÇÎ}Å›Ço¸Æ³jÞÒ±ko{!dhÖ- \˜`[Kþ)pLžXlø ÈÖQø~‚¸×Çl7¬S¹þ›¥*¼”>§Â.öÝìþñÃdi‘;`‰‚j#–•µß¯XB`ZdHnh“¿èI¤Ž$Ì‚Õvz!Œ^ !+NypÛÈŸVͧÁ`f–fU®äi l'Nªw!]ÅúŸÑ|È'Žb&‘$US —ŸÞF`'CŠ‡r(¾Kª‰;Æf+eZ´X‹+öÿ说oÙËøX9—í¸*¬^™FRЙÿ£ÑFï…ÅAUÂ͸)¡Q#>£0Æ*Ú¹:R…€à”%áee¨±¸ì¤|üi3bNdoÊåo3Ç\³RŒ†ø9`S? — ®ó·´ƒQEûõï©3ë-1F]ÚKé"Np÷#Ò~ ‰JIa†ôTA}Zê˜ ÷V¸ ƒnq7; v›™QC'C÷"¸®_o†™»NIÆgŸìø‘Y¿_µi´ÿgD>Øæ° âe©!EG² 'f«µÙ_—ï~r›þÊÂIöÉéS·y_!ºn×®æHQ–r5¡XÓh€šé©)Ñjw(üÜ}ÌðÏ4|Dp_CSàë€ÚÏ!œñ)— -Á?§†Ï9?³7mhÓÑzô±Tk¤Mˆ»’jÕ´¤Ò«ÑÞ™aä­"5šÑ´ïGZ‰CFp)6õçV{d0¥álƒ%8ç= -R §Ïò‘”-ý©¿+ÛU4¢.^1Q0¼[ç>ÙÙg¼9!‹/JÂ@¸N´eiÁ—23Âoæ+Ãçu#•!O°éÔ ìâY@—!WùAŽ…ó¢fÂŒpV[¾Á)?E ‰/Tc¹Þ]¬É0×aH¥RÜóªq¼¯)XßúdᎪC…Ð鑼gˆˆzéže¯¶-…¼ÏΩ?iž¡}Q'ÓÁfü Þ÷ž¬c6_|5µMZ@·1úf ñ9êês ª]ÜÔæBZ +®0QU?Åt v¤T1_¼Yp¯ÏÑn1×’äê'ŒWÔZB¾y¶¦}Âw’ ë°È‹G¤Î +f‡dúë‘|3ÝÖ¬9»pï°h1ûó¸í•½ÈW©”qn‘9¤pÙ²Q@ýDîã6Ó>ëo\,«m÷º·óSP¼ÕÆé‹cŠ˜/»f€¾-Ïxˆ®;SëP´JáŒU'â#VúÝ](ëeQb}–¡˜hïá\¢°»­ŸÓ¢aKY3Ê´R°ÝĦŽTWòã?É ç4ÙÚ¼~pÕôÉs;.“=@K?ò°ÞŸmG¢«Óg‘n1»€˜ótÆ[;ËæW{¼«ó¼¶¤êqáãï876} ÎÆEòY‚i›XëzPD}ÕÓq>ÌÖ=¨[ÓeÚÚÛ-DuoãáTç+ÄGQ½Ma.Ù¹êÜ×,r„U16W Ý¡UPÎQâ sªÞûÛT—ž´Þ>UtB%®Q?™†o\?‡c ©ãàò DíDÞÌÁ<¨‘‘å±cW'}¿ü%)yõ(¶Lz,£›Ú÷=Á‹º“Ûˆƒ„ªk_mÖø'\ÿg:óÈm§j³.”ŽÑ}½³‘šÞJAàȶ¨â>ÓÇBt^¿æt8Lyäån¨ðª~ÛÓœ„×RD"Ÿ"nN4U¨·áìDz./)6dÏXã¼;Îi8D• ÊV7yüöX¨å! v”kÝÛÓ¬ÙÛ’Æ9G +#ª5¶ãƒýŠŒ[ônjŸÛ\vù$/ãRÖyÕ\-¨üKŽà|B8x“AíÁ.O_JŸqD×=®_ž~:? ³7—2⊦Ý|jèÚ~e“hŒ¬Ò`2Æ`PzwL˜,Á”‚Ó­à¸=] {¸â>uD-‡UÙð›Ãí÷Qri|& +Ô>ÏíFŒòóGL2Õ×i#yûyNÕÓSáÄ.ì(¢ ê—´®u߃]bùž¹Tè²ÕV YŸ(uAyFìT½ª7?‰ã[×4¯#ã:ªÞš|1¥·cÿÂÄ=SŸ¶Q,hÛñðh]©¤ßûàzÑ÷ùÝQywÚë\ç£V}—À&}nJÎ_#2ž½+¢û%Ì°Ë=NIW™H9ถÃM”†òó?¹>HÛÀh[ÃdýÀ#þñøV¸°ÏjT̆Š½Úß'9Q£•ðD +ƒ¥=Ûe!sdê)‚.l4lóþE¿‹'@ÑN“Œ +žKXø4¼]íywbZâü™rœ¤ÂQ-<µÏ¬À¯´)"‡£]·ˆçÚ\¹çyy/Àbý‚ .G¢×.èßY÷®! É>a'c6CU¢y{nÞ#‹MÝ¢UüišB|!# V­}'­5®Ð±äNÆ ]túPÑ:/­ò¦X˜f9Žó¦žWv·Ô•©:N"õ³g²N î‡íæV¾–HYÈ.J°M¼FWÁqAéoÑxJ!&Wðˆâ­Tþ“$(®m Xïe{Ì××Ð8]/^¾g«Äo‰M·9}SO‹ý‹³n£zbÏ<3³ºÍö½9dÏDy6ÔDPM:Žð˜S“ wh…µ„cK´Äã‹{:Qö¦Ò-‘þh[N½œ;M7 !ìX¶lç +ûÆnÅOøÙ/šåvýÑ;Á¿Š(æÀêzÑÊ–>ì9¬Ç”°n÷ùv®Û·Y^+ùå+ÔÅKl—‰æÀ+gbïç6Å”E”vÕ8÷¸Ü¯¸.ÔF,ÜcjÇqx"3¦Ò™L•*×5FžÅVÝMçï©Év%¿ã´Þ'£N·ò6iM¯È-ËÅ8ò̉Xµ3<³ƒE´p“®Rºçègk,¹,1MwðM»¥&©v#(&aWgXñïs’ÓCˆoRlãB& ¬Wb_ÎíîŽNGW 6Øgåëg5ˆ¦:”'réÑü_³Ž§ËoÈtö¤¶egSÌUlåÓuD%ÝÐ=Ü~¯à0Úò•K èñ”ê ƒ\¼Úˆ½ À'&Ñ>—Ä÷VåTËïuXg2YèfôŽ ¿™€!m†×<^¢¼™=¹†\„¤žºŸ3>hÙà …ìwÈc>Ûºa/AØÛŒk1M,ø}GΨ|ÐÕ¿ÕSÞ=t@†šÆZ‰œà¾‡_ö}ô€–d0£¹¯”xP× òóvSF¢Mv˜Hv¶y@¼ ½„uØ1åÐØ,*Á×ÍE +® v'ö½Îln;mÿFN• +/Ÿ3Áô1êˆõí‰~4HFz>5#Ε{}mBl+ï Èà+S>îϵ ³3™ýžYZÍ?º°ü|(ø«8EÛN¼-Zr^’3©ÒÓ8 3ÅX£n Õ¤îc„Ô#gAGŒT3$kÿu‰mßêÃ0¦ô%BV¾®”ÍXKƒ²ÿ )¦|¶¼,–…WTгOð Dt&’vm‚¿[ñ²âñ‰hÿOr£æ§E·úÔ‘”˜l LkO$&¿Tƒc¶“Ùå€ýfSœªÝËX¿aП‘$ŽÒ(HÆ[®²—|þ§¸™¬b 5Q*ëkbC™%x=ÒqYŠ€¢y•#HÏGNJq¥RÚ‡o•C¡ +«÷îõç‡k¥¨9îx]R Éé !lŸàk<“™HÏÕ2Ú3'Ð_}Á±nwYíÖP¤z™$z¸ˆå¬uBZö˜ò,ïД‰ˆ6”E׋8'<óٔ᭦ó'îôÇÇ)§Óˆ%£‰[LgPÌùÃ[VëÁçµü÷=iˆçv¸#¨<¼‚¿ÏûN¶Ë9·©\qwqVb§E9¤»çóÆØ';†0€z!1q*L»_E³%)dª8„qb" Béãkë}™`_ölz?d(d𠺢¼ùŠú·nöM|Îëv N–È1@´é}Þ…gðvÉ–ßoµµRj¸Mk5"YŸ~bÐW¯ÔÛǦ¤}wQ1øA³x/ÆP/3Þ‘,¼#[¹3'Ì™^4ªýJw“çM›vŠ%Y37ÚZ-í!ÚZ„¯Nêý÷ÆA@U/#ÀJG4½øˆ®Lš„(Ûq¤—ZDÉŒf%)1[1$EβU?ç]ùÅÏ÷àº|/»çº86е"¿(8°™NWÎÿJÙf[ÙÉ(áåÊ=L 1û•œãBJ9 q•Cqƒì.¤Cj]ÃðÎ/b J:Hüäë0=—›g»W†0¡N¸ 4Òa,‰FˆÐtoÕ¬’«]G=ç#þ*½QÇÅ[àr4XÅ,[‹LŒÑÆÀ%D줫v‚SËBYtD\éLrg¡ÒsX?ìbW,%´ŸOZM3 Ý$Ë ÓÑïÜ„u“={Êãe†pæëaú<ž¬,®O1·—ŸbÍIÞÐÅPE¿p’·^¼à|ˆüÔµC?Ìçm£ù kòúšQ ½ U*<\£›Œj¶sP‘>N¯Ý(Ó ñjùz£¼uRX,Ã"É"˜z2Â[°À´3Žœ}ØÏ"/³Ö@~Ž!¶Q'–Mªý.¤äøx®9Í“xNKÚ¸ìì +ÏÆ^é(t{äg^Ì)¾^Äyoߊ“8E˜‰YjÚ é]ÁØ¥ÙDf’ø iÌÌR¥®Û·‘•¿#ëÊቛ¯½ð“_“9>~"iú +M)Ã9Âp:Ä'°ÂyFJv5„yfù¾ZF|šÿ˜Œû;àcêØBüß›©î¬ÃŽNÌtèÔd/O7ðŠëË–“Õ7ÑyD¿‹31ÓóÏ÷ÈJ¶b@=­Ö“4Õ +G‘áR웸5™UP®ÇÇ°H„×5Åã>½,TGè±8ñª4ô~È®š††,h»®ß z¿š l–,hËÐ%ˆÁC}ìÜbÒŽy’Ÿ&þÕöZïtï|çil¸#é¹–8!}BÌ’ñé{‘ˤFX.K·¿ìܦ|ºgÀM¤ûÆ¢•Ü=ÿ=²X_S`ìÿ<ì)ú¸Ô#»oøý–‹¿ˆ‰´ƒAF;ûû +Ûwôd¡Üw÷xgXøÉ\›ôi3“ŒIDί¹N%àŒ±éï\á>Ø°tmÖ$¼ãÅ,ñá…uÛæþCU˜Å6é*xsÈé4矾½–çëOf%,RKÁÖñ¦¤EÎL_2¾›Š‰iŸ¯œ±zÇÍÃÁs}~± à)Ë~ת0üÈ»€ñ¹R.Ä•!/`9ºz\h­õx–jÖ‘þ:9OñÉÉjð‰¬”ÔÌ°–˜Þè.h1ýdftX*ÿ7=™q FB1w)ÝúiC$ü9œsðàÒŽžQÔÄÚÂdÝ@BN~CªÝ©.ÉÊ¢^r’¹º¨JªÂ˜ †C4|¡" ‰j&m¤cYõ"¡ +#‡O/$v$R®cià¤Çâ÷Û¹6AçU‘©®¼n„ ¥Ä£Ïš‘mÛ«ðáäwãëuÃ&µ!¿®êÐ0š{©Ld"Ö½þ¤´4¡æmTu{5v÷­õýT_ekp¤¹¾r§Ð~ Q4ËÍRK2'¿ÊÀRŽõ‹l9Ù‚<£G{{©ÅVØeÞ=þ½ãøkæÈr by&?Ý!`@Ê‘Ъu iBškÿSéɾûmE@Ï4Y×^Y´ ~MÅǨp¸ägÃýö¥fÜtUAJgi/MüañD…+×»v­ø‚|ø¨.‡£0å÷]°k{r|xœ4Cäcüá5üº)µb2sàŠyÄjÌð%Ç)œ¯¹©ß81-?­ ‘#™ÄJ›áå#“DtC=ýHn¥?n^p ǧaÎ’òÆClÍOäË°¡·¯?xæÇñô, $Í 0ôfD ~xa*îD«­†S˜Å8×ü¼Ž/ÐÞQ]‘E „7d+À©'8Ôô«÷Õ™X²ü¾†IÓ:Ùÿ=Õ-¼°îŠ1tgþFHHÙ´.ʦ¤œGºßFúÄÇÜ=f¯h®N½]Ï©6»‘Cò°xVÍgŽÓ´¯*ʯÃÛ2†Ÿln»`Oêçl~’»×&PÑàoÇAóa|TtžòP—7ÿÂÖ›xS4ð‘Ìâ»[kSø˜¬O¡Ås§EÏSa$(’§œ¹¼m1¾>¨AAç¥ü‹#’ëµñاw“t“Í•…EYOU)-&5[ÍÕ” ÐYÙ>uï¯tH¸KJrãGÛà´ç«š4¥`Ê,c%ò¤üš½›õêó­‰îÖ­æda WÓæ'öj¹·„x!o“E¬{Ÿ×I„¨€>×ô¯R.ÁŸ_fnÇŽÜgJúvájï JPnÑ‚ûÇO⮊²]À¼^Aî^‡H_¾ö•ÑJr(•³¡ I[ Pȇy°ôQëG»ÉöQ  Ø}ê˜;AÊýì:ìº#=É“(þÊ|>ä®ö’ÚJ³òW³§‹„²ý:wR­äL +5«€ßbÑdûClC‚eÑ3›i“É_É>`"cGKó‚+îœÂ”SË%ëŽX½úð±Å­¾ç2]p ×9¢øõÛu“°WÙ8å{‘+cc"]•Á½[ˆ‹uÔ§Š®åëÜe\¾"Õ?M!©Ø‘5Yñ>>ƒg™. faSçõ"VY %¨öôÒPâÀ}ç_~[Š3šXh¬Xâ&4ã‡4ó ZòU‚õ(c˜äœMÈ>õ”D{Ê=ëÚ +B4½0üÂåZ8CÆzh¹Äõ ë­ÍÙ”™\ÛÑíÎ¥+ò—áE¢ì¹:BZ +ï!ÖdÙÌ>‡·‰—´ß•D¿l,¸Y‡þl½P ºñé:®DÁUÃñî+k#/™P¼|±ÔTa=Õ*¥­T^훳ø®Q¶t°HKZ®Åœ~`LgÊ`ømq%['=§!Y§ù“%–±y»¾nrI Kvß3g&r–÷é¹ÄÈ<j<~o™4iu¶ßL‚Ó´äÛðrœ..½¥×hÀ³È*ÂKÐh©Oañø.[ždZÏáƒçÆ"òŒ\#`"*äªFí¾a„tßÓÅ*YõaJFÏ*‹÷öýä(ŸÇ%hmdfRñ›„Æn[C ñŒSÄoÖÿáùÿü?A`j4vÛÛ;Y#ÿ4·»|endstream endobj 1032 0 obj << /Type /Font @@ -10081,14 +10110,14 @@ endobj /FirstChar 34 /LastChar 122 /Widths 2152 0 R -/BaseFont /WXJWBU+NimbusMonL-ReguObli +/BaseFont /ENENTH+NimbusMonL-ReguObli /FontDescriptor 1030 0 R >> endobj 1030 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /WXJWBU+NimbusMonL-ReguObli +/FontName /ENENTH+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 @@ -10112,7 +10141,7 @@ xÚ¬ .†ÖF #['*€©#ÀúßÀÈÎÖØâŸÒœèÿb 9 Nö&F™¸™Øÿc¢Ø›8ÚX89ýýX8Ì lÿöÀÙ`akdíbüOõ¦vÿJÈÞÑÍ_Û_0;'g'#G {gÀߨ ¢bÿÎÓÙÜÀùŸØNÍ;Ó¿žÆvF.ÿ”ô/Û_˜¿Vg ['€³‰»ó?± MÆNöÖcÿ³w´øW.N¶fÿ•-ÀÑÄÌÀÑØÚÄÉé/Ì_ìºó_uþ·ê ìí­=þuÚî_^ÿ+ g'kSz&æ¿1œÿÆ6³°…aøgP$mMíLŒÿÖ»ØÿO›«‰ã¿DùÏÌPýMÂÀØÎÖÚ`lb à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;ÿ^0€¿Æ øgÇüÿ| l,¬=þÞÿé¨fòï ÿO ’ÎÛ dkö— -FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒ¼ˆ¤¦”(ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T +FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒœº‚‚„ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè @@ -10181,7 +10210,7 @@ F šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸ ^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD -­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öw÷›endstream +­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öäÔ÷¿endstream endobj 955 0 obj << /Type /Font @@ -10190,14 +10219,14 @@ endobj /FirstChar 34 /LastChar 125 /Widths 2153 0 R -/BaseFont /OCIZJD+NimbusMonL-Bold +/BaseFont /NXPPHY+NimbusMonL-Bold /FontDescriptor 953 0 R >> endobj 953 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /OCIZJD+NimbusMonL-Bold +/FontName /NXPPHY+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 @@ -10218,7 +10247,7 @@ endobj >> stream xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd[;wsS3'¥š² íYþ ütÿŸž¿™Žæ¦6ò¿.@+[;k Ó_ˆÿëD àd˜˜[" -ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î ,§ª òƒæ?ßÔE)þÕÞIÕÝî/±ÿÑŠœ­ñÿ:üƒ!,lëð¤û{é˜Y8ì r21yÿªý †é¿Îr†Næní¿-32ý«ñÿñû¯“îÀˆÙÙÿ³+*N†6Æ×ëþq9;8üUõ_7þoÃÿóü¯EÝ€Fp«¿mx‚,Ò2Ój±r‡'Eµû{™À‡ƒíJTøUÛöø¦…ípU¼×Ó7Ns¶¹/Ú}ìKSŒöbZQô¤/óñ½I¨ú +ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢ÎðC\ENDŠæ?ßÔE)þÕÞIÕÝî/±ÿÑŠœ­ñÿ:üƒ!,lëð¤û{é˜Y8ì r21yÿªý †é¿Îr†Næní¿-32ý«ñÿñû¯“îÀˆÙÙÿ³+*N†6Æ×ëþq9;8üUõ_7þoÃÿóü¯EÝ€Fp«¿mx‚,Ò2Ój±r‡'Eµû{™À‡ƒíJTøUÛöø¦…ípU¼×Ó7Ns¶¹/Ú}ìKSŒöbZQô¤/óñ½I¨ú P7É;8hôJÓÏ4¢<¯e·!´ØÕv'•”õŠß¡¾Ow°8À\=Qù‘¸ø¡“>Ú!ù¥ÖÇbt¢4‚|«-<=#O<~z¤ê¹ìÛǣɉ…%ãq@$ô³ÏÁÐR«ð §‚JoBÀ»i¿ú$ÔèöÔË##Å%°–}U4Í_³i—}O‚LoàM”slݯüy=?É+”8Í5—ûµîL&æˆÅÛ„?Ø;kI8“ ]O0üvMÙïæYk]MýÚ‡”»02£ÔYRïÚµOÆH7î\‰$ÒjçH桳,,c|/ͳ‰M|\ÔøÉ×Ñ;gYs&kœ«ëP›‰­HÚz‚qÒÄ^hØx#:0%;Øt­%?!IRt¦äÞáséÒG_æóÈùC¾*íž¡±D­³EvAõ)i´»¨ ¹Í o)([ŒÔ‡+!Œ4Ž óçBÖx¨ö×éÀQ†Û–Í·´Š“çALb¸Ù…B ß%5Vy>©•õ_C äåwÍO?Xjb¸ËRˆ¢kŠìßFÆW‘¦³Âxýùb1£ôB:^‘átlØèöÇóžˆ}† -ß´Ç-_†‘À=DMá¢y;3pîÜÇ£àí •"¢œÍ‰pGÄ/çk~ú’DÎv}û Î|è8|ÔpVx{DžØæÁù¬(™è“‹¿ònc‚"©jȦފòJøˆÚfœ ƒ¡J÷ôy¼5Œ³4©aÆGD‰–îQHA²;§Oý|ÍJÛL‰†¸æVìP¤ýÄJÍÏD{¤>pV$QJ¬©ô=˜Ð9 Úp€Õâ«ùD¤å0ù_‡b>éRêVtÃÖ ÄMd~„Ýl{‚òsÉÞ! 5õµPÓÎ!ÓêÕ±·ÍˆoÅï$ø4÷µ£e!Ó†R©û,ÞΦbŽ†lŠ\›»ÆÈì\Ùú$Rk=›‹Tö° Úð­,6äX€qÐ-}nJ®k^¨£ô@l€¼ÜI>Œ˜×TqÅOшتxín°úâ…õµ4JÌäÅV kw¨Š‘þI’€¥¤\°^0Vò˘íep«%"h* ê mQôB±Ýë“ÙÏXšEÿ¶Éµú0üöA•ÚªÏPbÑËöê6EL7‹:Æ6ÒpÑÁå»ý%Tñ4w bBY6Kn8¢slG›‡œ .ôˆdŸ*‹îí¡ï8‚ìu)+¸"xJmKM Û /û’oË3ÌkŒÐ‘ÜãƒÛ’ÍËïÌk‡;/°¿‚ë’àU¿n¦NÔí]…6sÍ£¹ÛÉi<9s„pÓ4ìЛ•E÷³¡{¨Î¸›Ñ(@£ìª–8¥C©·g{foU>Ñ™vù¨µ«IÈÜÞPœU›K)ʶZQýmk ·çƒe~cs3˨Œ°2è£ßÕ ¾ÄùNs´Añ,ù¡H¾…¼ÀÅt••å;: œ•F“þ/Eň¢M—íîÒX =r‡K—+hö¦­y¢–éx>39+¥¸®¯k"½…Çl÷ÀJí„MÚÜ8ÁYËÜ&F¶”´Ñnýó'¶±_t¯…´²ÅÕÛ¥ ¼”žŸö8Gojü=ã6ÀçÞ}IP†C?äy¹l÷×MÜ 8ºSJ§Y´%$<-ãw¼S9ðJU&t ŽÞ[™#ÅÀ½5‘µc§O&QNðoMÂM/ …Ìþæ2¼`ÕE”n¼]QàѨPØÅA9TM;x¸á•3O‰­X»ãÞä»ÎúF_s„"oêoì9‘ö-Z%×/ÌÓÀ¨LÒ¬ŽÇçDrU‡¿ ¶Ï­š6ÞxÓÂï¯Å÷†½®w~¿Î~ÁX0nïýe´Ý&¤„’Wm»Š)Ôšë2ÒÄ`ÇŸ­B¢ž}dMÞ xì)㟂ñU‘dIÂçÍ Ê>`O‹5ö7ÕKõ 5ñŽ£ÓÔ‹Á}äIZ-™óDZ´[ŠkA,è3úI—ãq­«E2·:±AÚJÇ‚p9lrEèp¢V —2JÙçï£)m×·ÇѾ&\!H !Wuy§|õ ¸ýkI±3ÓËôì ünŠÐŠµ¼J§UÇ‘º;Ë÷Û\»#QÆ>‰E¼ßå îÜôÕ7;w“«)½VM.òHfÜ7$fÒzVÒþ ®:ëÍ©Û"Ä%yF#u»¶b1:î£Î¦Ð¦ºwI§âtß±.bïö:Áô|š·!/ä‘×…lEŒ];\PâéƒÀJ-†ùfï\gX?ÚÝbÊâ¼q#°È™JZcvr›”)\MUŠÿ½žØ«R#óÞ*{OÙ¥òó£SØÊ3«uS¥Ò+¦Ë?:ô$±ó4£º‹Õ±™o °Î³d q‰ÿ|¡âWV¬I¾ßxo¦Ì=ˆ4Šž%,²——Tí–]x-«GU}¡:¼@šëäãÕô´:+VfÀiIÆx†‡Ë2Ë–„\ü_¢øð?¸ùº»Áý\}(þ=.ß%endstream +mŽ[A±Ræ¦ØíŸeµ1£¿YÝÒ~kð¢|Xžë,|@î~èÒ<¦maöè“žÉGJPòíRWù˜ž ‰P ŠïMÏÜ£Ëÿx½qì’‡î“ü\Ÿ,³›}ÛÃë½E#û¼ÐÄ!áosA8G'Ñ´2›_ð‹¿Ào8V  qqML2ÔËÜIVœmá\©ü:’P -wÇrµ? ²T§‹ÏlKðKáJì}Z%=|Ó˜~¹´ê¡¿QL-jÅ¿Vq†/¥ökåàM×±Û÷a”÷1•£Ôq/dWµ8à UnˆÇrÉ•Ü “6ŸùÙ¥»R̓AczCËSå㧠š2°BKšð5TÓý¡DuTz³Ÿ¨r ¹‰PU€õ¼‡U´=' Xÿa—¿ÐÎ9WÕ5r>ÕE”n¼]QàѨPØÅA9TM;x¸á•3O‰­X»ãÞä»ÎúF_s„"oêoì9‘ö-Z%×/ÌÓÀ¨LÒ¬ŽÇçDrU‡¿ ¶Ï­š6ÞxÓÂï¯Å÷†½®w~¿Î~ÁX0nïýe´Ý&¤„’Wm»Š)Ôšë2ÒÄ`ÇŸ­B¢ž}dMÞ xì)㟂ñU‘dIÂçÍ Ê>`O‹5ö7ÕKõ 5ñŽ£ÓÔ‹Á}äIZ-™óDZ´[ŠkA,è3úI—ãq­«E2·:±AÚJÇ‚p9lrEèp¢V —2JÙçï£)m×·ÇѾ&\!H !Wuy§|õ ¸ýkI±3ÓËôì ünŠÐŠµ¼J§UÇ‘º;Ë÷Û\»#QÆ>‰E¼ßå îÜôÕ7;w“«)½VM.òHfÜ7$fÒzVÒþ ®:ëÍ©Û"Ä%yF#u»¶b1:î£Î¦Ð¦ºwI§âtß±.bïö:Áô|š·!/ä‘×…lEŒ];\PâéƒÀJ-†ùfï\gX?ÚÝbÊâ¼q#°È™JZcvr›”)\MUŠÿ½žØ«R#óÞ*{OÙ¥òó£SØÊ3«uS¥Ò+¦Ë?:ô$±ó4£º‹Õ±™o °Î³d q‰ÿ|¡âWV¬I¾ßxo¦Ì=ˆ4Šž%,²——Tí–]x-«GU}¡:¼@šëäãÕô´:+VfÀiIÆx†‡Ë2Ë–„\ü_¢øð?¸ùº»Áý\}(þÏnßendstream endobj 940 0 obj << /Type /Font @@ -10313,14 +10342,14 @@ endobj /FirstChar 33 /LastChar 125 /Widths 2154 0 R -/BaseFont /RMTOSX+NimbusMonL-Regu +/BaseFont /XFSMCI+NimbusMonL-Regu /FontDescriptor 938 0 R >> endobj 938 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /RMTOSX+NimbusMonL-Regu +/FontName /XFSMCI+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 @@ -10340,7 +10369,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x& UM%eºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•î£·5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o +xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&E1-EI ºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•î£·5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î @@ -10414,7 +10443,7 @@ K p÷†ÓºùáXk)iÇÝKqkùÈüÙ²ú´{Ô°!¢1µçsßÚ3‘à æý“B òÐ2t¦£ƒ% ]–Aþu²"ÉÜß2åº.Ó “ñx•s,õ)®k¾óÒ>hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤Òøɉ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ -¹ƒ%ÔÕÝÙêjýM>â endstream +¹ƒ%ÔÕÝÙêjýIbá÷endstream endobj 900 0 obj << /Type /Font @@ -10423,14 +10452,14 @@ endobj /FirstChar 2 /LastChar 151 /Widths 2155 0 R -/BaseFont /FKTXQR+URWPalladioL-Ital +/BaseFont /PDYPGF+URWPalladioL-Ital /FontDescriptor 898 0 R >> endobj 898 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /FKTXQR+URWPalladioL-Ital +/FontName /PDYPGF+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 @@ -10453,7 +10482,7 @@ stream xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå  ùËAKOÏð_–\¦^ÿütYÚ¨þ>¸mí€ö®)þŸÕ€@€«`²Ä””ud¥4RŠ) =ÐÙÄ ìfj 2ȃ̀ö.@Z€…ƒ3Àöß €™ƒ½9蟭¹0ýåq˜\f ¿a@O3 ã?Àèlrqùû ¹,Mì]ÿöÀÕ²7³u3ÿ§€¿v ‡äèìð×Ãî/ö—LÙÁÅÕÅÌäè ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.W §ë?¹Ls‹£­‰×ßÜÉAÿ*ÃÍdoù_0œ–&Îæ¶@—¿4¹ÿéÎíð¿íÞÄÑÑÖë_ÑÿòúÏ@®.@[ &V¶¿9Í\ÿæ¶Ù#0ÿ3*2öV–ÛÍÝÿs:ÿ«A4ÿÌ íß"LÌìm½æ@ fE׿)4ÿo*3ýωü? ñÿˆÀÿ#òþÿ÷¿kô¿âÿ¿çù¿SKºÙÚ*šØÿø; øç’±ÿ?¼Mì@¶^ÿ7ÿÿî©üw‘ÿWW“¿­±·ü+ãW&–¯ÿ@.’ O ¹2ÈÕÌ -`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYSD\ZB–þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï +`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYYN^[S›þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï ™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖµ?ªª…¹{G.ž'Þ½µ$5õü^oDÌÒ’j8Á¬R/ë‰yÝ࣑<Ì`½^ úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ ¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ @@ -10515,7 +10544,7 @@ MI ¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£ cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …x;³°çlqf—š “d79˜R€2õ¨)iµ†–Gö»€ê&‚—ÜÞ¨CšùŸeVò]ÏÓ~„ð¡T}îY¸dë`XÕìéÎ<òe JË»1ÒXê¤QáÀ#÷gX¹;«ÜÉà{}¤* ½lÈ»€~.ž©kÜõVÅÇ®þÒ€§ú‘7ã$o—#€àkص <Éâ{ -¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,Êæf‚endstream +¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,Êæ!Åf½endstream endobj 803 0 obj << /Type /Font @@ -10524,14 +10553,14 @@ endobj /FirstChar 40 /LastChar 90 /Widths 2156 0 R -/BaseFont /VADHEJ+URWPalladioL-Roma-Slant_167 +/BaseFont /PKLXVX+URWPalladioL-Roma-Slant_167 /FontDescriptor 801 0 R >> endobj 801 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /VADHEJ+URWPalladioL-Roma-Slant_167 +/FontName /PKLXVX+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 @@ -10547,18 +10576,20 @@ endobj /Length1 862 /Length2 1251 /Length3 532 -/Length 1860 +/Length 1861 /Filter /FlateDecode >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2@ Š&X4•;"(R’ $˜$ \(PÁ Bå"Pi¥´^€–‹ÁŠ‚g¹iL@°rÕtÐc—þÜýµggþÌû<Ï÷~Ï<ïwÎgfâáM ³‘ ØŠ ¤N®Þ‡@2É833'†ÄãM=çi,.-V^=!LJ*ô¿d9œÒE¯d¸¥5]¢{ñjZQ¹_V<µ‰ØãLL“­yme>Ê”‡<]ðÒÖ„>:ûí¶í½ÓÛâÚtαUŒÃç绵7Zz´4Ýl×{AsàÃMøÈ'['kãònìdMܾïÂôÀ‹œÓÌGí ihö1.€¡PXyŽÐ[î©”ÇôÙóëÝÓ›ü¥OSMSÌž·z—KgÒb £»¦‰¿›:–Q<󵻮ɘq}àŽ<醒”¿·ÑØŨí‘5÷Õæ6+7Ù'ÁäAëU—Fj ÚCûüR¦¼Qin.‹}Q…Ôäïyþ}ýÎ9|F qõéCÏJëåÚÝõz î®{½N™/ µÜ:4Ò(®’«³²Zî‰1~xܦ£ûÎÞÒGñ‚t ¾ûÚ3 —á9¿ÖÈh<~=Œ¢e*ë²32ÿêà+æêòµ¢‹M¢’Kñc‰´þc`ÕÍÎ.ðj<ãHN,s’™¦—|-Æ‘ãí«,›7ÊêôzjÎÊä}:Æšýʬ(=…‰¬RÈãœÑžÍLÏðpóôÛ¯w¤9/)À=à¹ZÝ÷¢âYrvÇØ–„1_u2óDëËÁ «)Ѹ·6íRW©_Š¡y$|©ÁÑf¦@“^~v½Š©@rÚo2ü.èâ&gs£¦RÏýÃôeÜàï“ßo, -!üm94¡ÜÚ—=7âjp²Œû\é^çP]flBìµ·Kê ‰À9¢²¤v嚧ø›Ö‡÷= ‡Çe 3ñÐÐu/—]qÐNH¨¹.[( ™Ý¡¡9ÿ¬TL [¨Ÿzd€kz·îØ3ù±ö寑S;~RS,%­ßÕ`>˜®öÙô&óàó†~î'¡ÓõS¿ -Ï›?:¬>®r—õÉ/ã>Ìo”þ øý/C¥“áëó¯Ý’_“ ­­ý·Šl©Šc'•×+oŒIn:˜ËHÊÛŸ„3YlÿÒ<ß‹?ªÝ#YWT«š{êæSE aÐ=EÕ§´y”óÌy¼Âa²²ÔŸö¹÷¾_ã¨bÎIú‹¿Ÿ"½Iì~¡Q×*5*óeT¥LM—hµ¾Ùê‘Õ>ä>¨'›³²dPª×Hö5€4ûÝý†;öpæ.ü&µoY7î«HŒ¶×ñ -ntÂY~¬óôç»Í»_sóŸ׈N‘1ð‰ëüï«V©Ô§Âh÷åcĺ´ ¿ºí*T¦$ÏGlɺÞX±ë`³Ù»å¡Ýñ ³M¯-TßfVy˜®6.î[(©Û†‹Õ‘ÄÛË\Ãõ £4ÖÄçE ás]’œ†Ü„7ù•(ræ“R¤Ø¯ÕF§_Ü}YÔ½Ž2j«i¸ó×TÇc]ëfîÞƒSë ec.ªUÑš}ºw;ËFu[jÙ»[n:† ѯiI‚ømš?/È7€„þyéš36“œô€ñî‚íú†ë²ö’8||XÓ<þ õáìVÏAÛñ©l=¿éS x}ÞäÇo¢ŽªFü׆þÒ×¢¯ª«;zº³+Ù7ÖÅt®]šrF9µqg{7áÄ®l÷ÇÌ“}_2\ÎhôÏɵV'•Ç²;BêmиC’ž˜l/^·`m`onçòøàþßà¢vuC¨@h(î_Û-þRendstream +æ2@ Š,šÊ%€ +ŠT†dr$“T`E *T.•VJëX`¹¬(xÖˆP›FÁ+W]Aw=véÏÝ_{væϼÏó|ï÷Ìó~ç|fL_‚  †Ý‘„Aàêá{$ ‘Œ³°pEaHÂGD» L@GGp‘r +h2ꀳ\‘°H”ÏåI+×ÏD€‹Fù,Hx@,Äz° à‹°ø°$’¸€Ï +1à‹a4fq °ù,  sù"iÁCÄA‡%˜- {GEÀ¨3Xa&?0‹lD$ˆØ0GòD°½`ÌÉÃÔòænRÀ.´_LéO<$ä "ß*a˜T£€†QÑr©¼dÎfó¥Âå,C ø,WÐŽH¶¥.|±_³™| ‹p ^Äa{¹,¾E#¤½þLú>7›·s]$™_$Ùä÷êÅ|_c)¡|@&’É &ÄÞw_Ë6ûBÄBØ| PíE¡Hv‚°Š +Dƒ_Će,Óˆ"D‚-°hŽÅ-Œ´H,>ÊÀ¬…©IØ%‚ +‚±Ìá?@d +†¡ Àœ?¶oᥡ¿Çí1BßXÀ + 1oþspt:"‹&P‚£=ö# h88Pý›%EQX$Y<›Xüïj Ë`®§ a9%†äV%•Ç|qþΑt^¶Vhz´›ükbòøìc¾ÔsÞf\IÉH‘êê >Tiø%Ëé”>zÅ(Ý3í«©bý‹WS Ëü3ã¨Än_|dBª|Õkˆ"üÀéüoTÆ´FôÑÙo·lí™ÚÛªwŽ­¦:ß0;Ð¥»ÞÚ礵ùF‡ž ÚýnÀGö?éØP¥ÎŽaL0R r¸×âa9αҺi½¼Ö »ú¬\Ñ«gªÝ§ÊŒ2PšÉ+$A|ÎÝ™Œ´tf §·ÿ^­ØÃM¹‰^Ï5šÞåÏJ‘³ÛF7Åúi’'Z^ŒÛLŠÇ|ui—:Kü“-#áKõÎvÓùÚ.egתJ$»í&Ýÿâ¾N^AR/j2åÜ?Ì_Æü>ñýúÂÂOÑÖƒãZÈ­=YÓ±ÃF'KyÏU^µNU¥¦fÄÇ1‡Äîœ3*OlS­zŠ¿iÔqhÏŠixlæ‘ðQ3¦–¾W™üŠ“n|¼PÃsßD™Ïè +Íþg…rJÔbBý”™®êÙ¼m×ÄǺ—ó}†OmûIC±–¶|W½ô`ªjÿ†7ž·Ó s> ý›þŒ¿æUxîÜ‘!Íqµ—¼Wq÷a^ƒìáï,™_›wí–âš‚èFhoé»UhOU}8¡º^qcTZÓÉRNRݦì?“É(Éõ»ø£Æ+’uEmõ¸²±¡»v.9h@<ÝSV~J›C9ÏÜÆÊ&*JhŸûîù5–*áœtyñ÷S¤7 ]/´j[d&¥~ôÊäÉ©b–7›™™mƒ^òYk:¥j•tOHuÜÙg¼mgöÂo2Çæ5c~Ê„hG=nƒ+Îúc½§?ßmÚùš—÷ì¸Vt²b¨ŽOXp_½B­9mF»¯,%Ö¤^øÕsG*9i.bSÞàõ†òrM¾ÍŽ¯›i|•`¥þ6£’i¾Ò´¨w¾¸ o*Òä÷D’l-í÷7$ŒÐXãŸÆ×·‡3ûg;¥Ùõ9ñÙžŠ+QäŒ'%H‘‹^¾¨;ú²¸keÒZ]xç¯)ÎG;×Lß½§ÔÈGÝÕ+¢µ{ôïv¸•Žè·Ì×°w6ßqt¹¦# ´jÿòKo³¡º¶öÈéŽÎ$¿wóÙ6YòÕäúím]„;²¼3Nö~Iw?£Õ7«ÐY™XÃn©³CcJ»eùhõÈyù«ƒzrÊ9è‘ÿÃ÷ÿÿ °«B%ˆBCqÿsþdendstream endobj 741 0 obj << /Type /Font @@ -10567,14 +10598,14 @@ endobj /FirstChar 13 /LastChar 110 /Widths 2158 0 R -/BaseFont /BFRUCK+CMSY10 +/BaseFont /KXPBTF+CMSY10 /FontDescriptor 739 0 R >> endobj 739 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /BFRUCK+CMSY10 +/FontName /KXPBTF+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 @@ -10598,7 +10629,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNFAZXC꟩ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ +xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNMHPFX€êŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ üPˆŸìá|ŒRbQ»š€ê ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””s Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W WâãÆ[.¸N5ÈõëZS† @@ -10692,7 +10723,7 @@ A ­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬ g¤£Ê¾2f~mû„m}…i¶xÄãæužÙÆœ»‚ÙüÂx\Ôt{™C Àåò ›ËøýÈ·'5' ªzqvipd×kµ»¶j©@ƒæ…:Íw¾?bøàôVs,%ãIP¡ÍSÃ…„A³ô‰ìDª`Ïûñ,{r˜¦fY—AÀ˜EÏ¡+LNä^õ,¸¬Y¼B™¡9ÛœÐç†dbTC4è¿JLWl©0Âkž ^¸ùT›Úò«¾¦ét«§^Þí§/‡3SÄ蚇dQœv(CÜ쇵È%#¾j0Æ7›5pEZ‡ì—,í¼éÀOÇéÃõ¤¯(CæýéZb4üÁP”™Γ{5Þ…k`åùÃJÙãpÔféAvs,µp̈Õ.¨±g¸Ño¡µ°±P9:Ý,'c|Ì1eÁh†M~‘fQÞúûdú9’LÈúôÖN0–"/Ó|8׃ҿ]‰/ óûÚûس˜z$©Ôü³[<~q÷é#ƒä2 'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿?qEµÀ¡Glq_åOÎ1ŠL$HülÓ‚|²ëÅ›:vÐ Ø›¨†À<¬è2ëg8„7ë%j ÅL/ARWˆŠmõƒÑ ±)Cðî&œ£Ò(q14ŒED;ÌjdW åqêÒÚ8ß'‡õt˜{r›`üz$¸~ЗV-ðr#QcªžÉ¹=H­EÍëCóIîÁÕŒ–aYÅuz8UG²þºÝ¡HJP+dGR]¤IؘNd'×DóN'é[ºqÆIÒĵF,·;Å—d•”©7•‘W­_ˆF®kô­é¢á£tΘ ~­ yTjænUÀNöÂߥ6”éŸì¶\e>:3‚t{ù^÷p*kõ!1ñÖ3«/¥tŒëÖÈ|æeWç¯ÛQ#`IbýÍÃ$ŒPÍXÉSKUŽž¡’` ËAÅžþ›m­%N©ò’÷Y ¥Ê¡K_º`ÕsYGõ¾ìŸö¨,4ƒ“³›¯HC'Ÿû89cá[ã Û2?ÆN¼ ü±ù#°¥ª0ägã¶,Š¢œ¡. éj”¿ê?ÉxG# Ò+“Å.ă-†cå-Yo¢UÄVõñÈö15Ò»æ¾Ýc@@íéíAŸ LüUÜêÏÉ…ÜÔ¿©ÿÌZÏ‚ñåÎSUn9“mbµf[‘€Š±ÑT8D1¿4г#hqÙך½E9É{Ь¶uîœb…M'­?/ÖGÐÿéε%¨˜Gš±Ñ3 ?hßó¤¸þa¶„çŽØyžÓ€’^`´ý×Þz\‹÷¶v«áP{ÑÑ•Ih~×`5»æ0ïfM…ÂÛ -ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶ûE‡¹> endobj 736 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /MQLDYB+URWPalladioL-Roma +/FontName /WCBMDA+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 @@ -10728,7 +10759,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:QqI%iiªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS +xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq: euq!ªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»šê ÿ\%ý}þ54>:2Ü{Ú„M•IÊå KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó#\2®˜Æíß»OÍß 6.â'¢ÿp$iÊíù2ŸÒ;LÛ–Oòá ±Fóyº)‘ùµ©ãà~ ¥ŸC¡ë­„aø ÅÑ«¨ÙûGæhg [&óâ<1—Xû²Âø{iª_“¸bf)¦Œ²§T˜ ÜÓ»GAe!ógF玦àUa!*ÚZ0Ÿðç/è a0¼€ž~£œ†äwÝo âïfŸJ³xÛw® ÞaÇL¿õ0 è^š `8¿Ú Ù4Ùç÷ Ï©4†V×"”]BÝ3pþà·½_) èIÞ\H$séåXŒ{Òb^Z,ÃÛ6ö©ÉÁ ¬–R2µCÇŠ‰t(£ˆOܲÓ7‚9òó`e€² ä@y%0júAÈëRÿ˜à˜~xƒ4wÖ5çíÂàÖ±åmÝÓ×â}=Ð’tRX[>͔ҞÐRÔ "çH³l/é•_r> endobj 712 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /FHJSLL+URWPalladioL-Bold +/FontName /YTXUHC+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 @@ -12310,7 +12341,7 @@ endobj >> endobj 2171 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20100225121620Z) +/CreationDate (D:20100303234632Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref @@ -12322,703 +12353,703 @@ xref 0000000000 00000 f 0000000009 00000 n 0000071778 00000 n -0000753335 00000 n +0000753337 00000 n 0000000054 00000 n 0000000086 00000 n 0000071902 00000 n -0000753263 00000 n +0000753265 00000 n 0000000133 00000 n 0000000173 00000 n 0000072027 00000 n -0000753177 00000 n +0000753179 00000 n 0000000221 00000 n 0000000273 00000 n 0000072152 00000 n -0000753091 00000 n +0000753093 00000 n 0000000321 00000 n 0000000377 00000 n 0000076477 00000 n -0000752981 00000 n +0000752983 00000 n 0000000425 00000 n 0000000478 00000 n 0000076601 00000 n -0000752907 00000 n +0000752909 00000 n 0000000531 00000 n 0000000572 00000 n 0000076726 00000 n -0000752820 00000 n +0000752822 00000 n 0000000625 00000 n 0000000674 00000 n 0000076850 00000 n -0000752733 00000 n +0000752735 00000 n 0000000727 00000 n 0000000757 00000 n 0000081129 00000 n -0000752609 00000 n +0000752611 00000 n 0000000810 00000 n 0000000861 00000 n 0000081254 00000 n -0000752535 00000 n +0000752537 00000 n 0000000919 00000 n 0000000964 00000 n 0000081379 00000 n -0000752448 00000 n +0000752450 00000 n 0000001022 00000 n 0000001062 00000 n 0000081504 00000 n -0000752374 00000 n +0000752376 00000 n 0000001120 00000 n 0000001162 00000 n 0000084476 00000 n -0000752250 00000 n +0000752252 00000 n 0000001215 00000 n 0000001260 00000 n 0000084601 00000 n -0000752189 00000 n +0000752191 00000 n 0000001318 00000 n 0000001355 00000 n 0000084726 00000 n -0000752115 00000 n +0000752117 00000 n 0000001408 00000 n 0000001463 00000 n 0000087654 00000 n -0000751990 00000 n +0000751992 00000 n 0000001509 00000 n 0000001556 00000 n 0000087779 00000 n -0000751916 00000 n +0000751918 00000 n 0000001604 00000 n 0000001648 00000 n 0000087904 00000 n -0000751829 00000 n +0000751831 00000 n 0000001696 00000 n 0000001735 00000 n 0000088029 00000 n -0000751742 00000 n +0000751744 00000 n 0000001783 00000 n 0000001825 00000 n 0000088153 00000 n -0000751655 00000 n +0000751657 00000 n 0000001873 00000 n 0000001936 00000 n 0000089239 00000 n -0000751581 00000 n +0000751583 00000 n 0000001984 00000 n 0000002034 00000 n 0000090953 00000 n -0000751453 00000 n +0000751455 00000 n 0000002080 00000 n 0000002126 00000 n 0000091080 00000 n -0000751340 00000 n +0000751342 00000 n 0000002174 00000 n 0000002218 00000 n 0000091208 00000 n -0000751264 00000 n +0000751266 00000 n 0000002271 00000 n 0000002323 00000 n 0000091336 00000 n -0000751187 00000 n +0000751189 00000 n 0000002377 00000 n 0000002436 00000 n 0000093878 00000 n -0000751096 00000 n +0000751098 00000 n 0000002485 00000 n 0000002523 00000 n 0000094137 00000 n -0000750979 00000 n +0000750981 00000 n 0000002572 00000 n 0000002618 00000 n 0000094266 00000 n -0000750861 00000 n +0000750863 00000 n 0000002672 00000 n 0000002739 00000 n 0000097498 00000 n -0000750782 00000 n +0000750784 00000 n 0000002798 00000 n 0000002842 00000 n 0000097626 00000 n -0000750703 00000 n +0000750705 00000 n 0000002901 00000 n 0000002949 00000 n 0000108275 00000 n -0000750624 00000 n +0000750626 00000 n 0000003003 00000 n 0000003036 00000 n 0000113294 00000 n -0000750492 00000 n +0000750494 00000 n 0000003083 00000 n 0000003126 00000 n 0000113423 00000 n -0000750413 00000 n +0000750415 00000 n 0000003175 00000 n 0000003205 00000 n 0000113552 00000 n -0000750281 00000 n +0000750283 00000 n 0000003254 00000 n 0000003292 00000 n 0000113681 00000 n -0000750216 00000 n +0000750218 00000 n 0000003346 00000 n 0000003388 00000 n 0000118088 00000 n -0000750123 00000 n +0000750125 00000 n 0000003437 00000 n 0000003496 00000 n 0000118217 00000 n -0000749991 00000 n +0000749993 00000 n 0000003545 00000 n 0000003578 00000 n 0000118346 00000 n -0000749926 00000 n +0000749928 00000 n 0000003632 00000 n 0000003681 00000 n 0000125674 00000 n -0000749794 00000 n +0000749796 00000 n 0000003730 00000 n 0000003758 00000 n 0000125803 00000 n -0000749676 00000 n +0000749678 00000 n 0000003812 00000 n 0000003881 00000 n 0000125932 00000 n -0000749597 00000 n +0000749599 00000 n 0000003940 00000 n 0000003988 00000 n 0000128724 00000 n -0000749518 00000 n +0000749520 00000 n 0000004047 00000 n 0000004092 00000 n 0000128853 00000 n -0000749425 00000 n +0000749427 00000 n 0000004146 00000 n 0000004214 00000 n 0000128982 00000 n -0000749332 00000 n +0000749334 00000 n 0000004268 00000 n 0000004338 00000 n 0000129111 00000 n -0000749239 00000 n +0000749241 00000 n 0000004392 00000 n 0000004455 00000 n 0000133032 00000 n -0000749146 00000 n +0000749148 00000 n 0000004509 00000 n 0000004564 00000 n 0000133161 00000 n -0000749067 00000 n +0000749069 00000 n 0000004618 00000 n 0000004650 00000 n 0000133290 00000 n -0000748974 00000 n +0000748976 00000 n 0000004699 00000 n 0000004727 00000 n 0000133419 00000 n -0000748881 00000 n +0000748883 00000 n 0000004776 00000 n 0000004808 00000 n 0000137196 00000 n -0000748749 00000 n +0000748751 00000 n 0000004857 00000 n 0000004887 00000 n 0000137325 00000 n -0000748670 00000 n +0000748672 00000 n 0000004941 00000 n 0000004982 00000 n 0000137454 00000 n -0000748577 00000 n +0000748579 00000 n 0000005036 00000 n 0000005078 00000 n 0000141049 00000 n -0000748498 00000 n +0000748500 00000 n 0000005132 00000 n 0000005177 00000 n 0000144495 00000 n -0000748380 00000 n +0000748382 00000 n 0000005226 00000 n 0000005272 00000 n 0000146096 00000 n -0000748301 00000 n +0000748303 00000 n 0000005326 00000 n 0000005386 00000 n 0000146225 00000 n -0000748222 00000 n +0000748224 00000 n 0000005440 00000 n 0000005509 00000 n 0000149032 00000 n -0000748089 00000 n +0000748091 00000 n 0000005556 00000 n 0000005609 00000 n 0000149161 00000 n -0000748010 00000 n +0000748012 00000 n 0000005658 00000 n 0000005714 00000 n 0000149290 00000 n -0000747931 00000 n +0000747933 00000 n 0000005763 00000 n 0000005812 00000 n 0000153474 00000 n -0000747798 00000 n +0000747800 00000 n 0000005859 00000 n 0000005911 00000 n 0000153603 00000 n -0000747680 00000 n +0000747682 00000 n 0000005960 00000 n 0000006011 00000 n 0000158293 00000 n -0000747562 00000 n +0000747564 00000 n 0000006065 00000 n 0000006110 00000 n 0000158421 00000 n -0000747483 00000 n +0000747485 00000 n 0000006169 00000 n 0000006203 00000 n 0000162042 00000 n -0000747404 00000 n +0000747406 00000 n 0000006262 00000 n 0000006310 00000 n 0000162170 00000 n -0000747286 00000 n +0000747288 00000 n 0000006364 00000 n 0000006404 00000 n 0000162299 00000 n -0000747207 00000 n +0000747209 00000 n 0000006463 00000 n 0000006497 00000 n 0000166238 00000 n -0000747128 00000 n +0000747130 00000 n 0000006556 00000 n 0000006604 00000 n 0000166367 00000 n -0000746995 00000 n +0000746997 00000 n 0000006653 00000 n 0000006703 00000 n 0000169187 00000 n -0000746916 00000 n +0000746918 00000 n 0000006757 00000 n 0000006804 00000 n 0000169315 00000 n -0000746823 00000 n +0000746825 00000 n 0000006858 00000 n 0000006918 00000 n 0000169574 00000 n -0000746730 00000 n +0000746732 00000 n 0000006972 00000 n 0000007024 00000 n 0000174923 00000 n -0000746637 00000 n +0000746639 00000 n 0000007078 00000 n 0000007143 00000 n 0000175052 00000 n -0000746544 00000 n +0000746546 00000 n 0000007197 00000 n 0000007248 00000 n 0000175181 00000 n -0000746451 00000 n +0000746453 00000 n 0000007302 00000 n 0000007366 00000 n 0000178633 00000 n -0000746358 00000 n +0000746360 00000 n 0000007420 00000 n 0000007467 00000 n 0000178762 00000 n -0000746265 00000 n +0000746267 00000 n 0000007521 00000 n 0000007581 00000 n 0000178891 00000 n -0000746172 00000 n +0000746174 00000 n 0000007635 00000 n 0000007686 00000 n 0000179020 00000 n -0000746040 00000 n +0000746042 00000 n 0000007741 00000 n 0000007806 00000 n 0000183251 00000 n -0000745961 00000 n +0000745963 00000 n 0000007866 00000 n 0000007913 00000 n 0000189809 00000 n -0000745868 00000 n +0000745870 00000 n 0000007973 00000 n 0000008021 00000 n 0000197361 00000 n -0000745789 00000 n +0000745791 00000 n 0000008081 00000 n 0000008135 00000 n 0000197620 00000 n -0000745696 00000 n +0000745698 00000 n 0000008190 00000 n 0000008240 00000 n 0000200443 00000 n -0000745603 00000 n +0000745605 00000 n 0000008295 00000 n 0000008358 00000 n 0000200572 00000 n -0000745510 00000 n +0000745512 00000 n 0000008413 00000 n 0000008465 00000 n 0000200701 00000 n -0000745417 00000 n +0000745419 00000 n 0000008520 00000 n 0000008585 00000 n 0000200830 00000 n -0000745324 00000 n +0000745326 00000 n 0000008640 00000 n 0000008692 00000 n 0000206840 00000 n -0000745191 00000 n +0000745193 00000 n 0000008747 00000 n 0000008812 00000 n 0000215241 00000 n -0000745112 00000 n +0000745114 00000 n 0000008872 00000 n 0000008916 00000 n 0000236497 00000 n -0000745019 00000 n +0000745021 00000 n 0000008976 00000 n 0000009015 00000 n 0000236626 00000 n -0000744926 00000 n +0000744928 00000 n 0000009075 00000 n 0000009122 00000 n 0000236755 00000 n -0000744833 00000 n +0000744835 00000 n 0000009182 00000 n 0000009225 00000 n 0000243668 00000 n -0000744740 00000 n +0000744742 00000 n 0000009285 00000 n 0000009324 00000 n 0000247184 00000 n -0000744647 00000 n +0000744649 00000 n 0000009384 00000 n 0000009426 00000 n 0000250363 00000 n -0000744554 00000 n +0000744556 00000 n 0000009486 00000 n 0000009529 00000 n 0000257930 00000 n -0000744461 00000 n +0000744463 00000 n 0000009589 00000 n 0000009632 00000 n 0000258059 00000 n -0000744368 00000 n +0000744370 00000 n 0000009692 00000 n 0000009753 00000 n 0000262252 00000 n -0000744275 00000 n +0000744277 00000 n 0000009814 00000 n 0000009866 00000 n 0000266146 00000 n -0000744182 00000 n +0000744184 00000 n 0000009927 00000 n 0000009980 00000 n 0000266275 00000 n -0000744089 00000 n +0000744091 00000 n 0000010041 00000 n 0000010079 00000 n 0000270312 00000 n -0000743996 00000 n +0000743998 00000 n 0000010140 00000 n 0000010192 00000 n 0000273468 00000 n -0000743903 00000 n +0000743905 00000 n 0000010253 00000 n 0000010297 00000 n 0000277408 00000 n -0000743810 00000 n +0000743812 00000 n 0000010358 00000 n 0000010394 00000 n 0000285781 00000 n -0000743717 00000 n +0000743719 00000 n 0000010455 00000 n 0000010518 00000 n 0000285910 00000 n -0000743624 00000 n +0000743626 00000 n 0000010579 00000 n 0000010629 00000 n 0000289666 00000 n -0000743545 00000 n +0000743547 00000 n 0000010690 00000 n 0000010746 00000 n 0000292910 00000 n -0000743452 00000 n +0000743454 00000 n 0000010801 00000 n 0000010852 00000 n 0000293039 00000 n -0000743359 00000 n +0000743361 00000 n 0000010907 00000 n 0000010971 00000 n 0000297800 00000 n -0000743266 00000 n +0000743268 00000 n 0000011026 00000 n 0000011090 00000 n 0000301569 00000 n -0000743173 00000 n +0000743175 00000 n 0000011145 00000 n 0000011222 00000 n 0000301698 00000 n -0000743080 00000 n +0000743082 00000 n 0000011277 00000 n 0000011334 00000 n 0000301827 00000 n -0000742987 00000 n +0000742989 00000 n 0000011389 00000 n 0000011459 00000 n 0000301956 00000 n -0000742894 00000 n +0000742896 00000 n 0000011514 00000 n 0000011563 00000 n 0000305399 00000 n -0000742801 00000 n +0000742803 00000 n 0000011618 00000 n 0000011680 00000 n 0000307024 00000 n -0000742708 00000 n +0000742710 00000 n 0000011735 00000 n 0000011784 00000 n 0000311203 00000 n -0000742590 00000 n +0000742592 00000 n 0000011839 00000 n 0000011901 00000 n 0000311332 00000 n -0000742511 00000 n +0000742513 00000 n 0000011961 00000 n 0000012000 00000 n 0000315657 00000 n -0000742418 00000 n +0000742420 00000 n 0000012060 00000 n 0000012094 00000 n 0000321547 00000 n -0000742325 00000 n +0000742327 00000 n 0000012154 00000 n 0000012195 00000 n 0000332933 00000 n -0000742246 00000 n +0000742248 00000 n 0000012255 00000 n 0000012307 00000 n 0000340173 00000 n -0000742114 00000 n +0000742116 00000 n 0000012356 00000 n 0000012389 00000 n 0000340302 00000 n -0000741996 00000 n +0000741998 00000 n 0000012443 00000 n 0000012515 00000 n 0000340430 00000 n -0000741917 00000 n +0000741919 00000 n 0000012574 00000 n 0000012618 00000 n 0000351220 00000 n -0000741838 00000 n +0000741840 00000 n 0000012677 00000 n 0000012730 00000 n 0000351607 00000 n -0000741745 00000 n +0000741747 00000 n 0000012784 00000 n 0000012834 00000 n 0000354971 00000 n -0000741652 00000 n +0000741654 00000 n 0000012888 00000 n 0000012926 00000 n 0000355230 00000 n -0000741559 00000 n +0000741561 00000 n 0000012980 00000 n 0000013029 00000 n 0000358315 00000 n -0000741427 00000 n +0000741429 00000 n 0000013083 00000 n 0000013135 00000 n 0000358444 00000 n -0000741348 00000 n +0000741350 00000 n 0000013194 00000 n 0000013239 00000 n 0000358573 00000 n -0000741255 00000 n +0000741257 00000 n 0000013298 00000 n 0000013350 00000 n 0000358702 00000 n -0000741162 00000 n +0000741164 00000 n 0000013409 00000 n 0000013462 00000 n 0000362349 00000 n -0000741083 00000 n +0000741085 00000 n 0000013521 00000 n 0000013570 00000 n 0000362477 00000 n -0000740990 00000 n +0000740992 00000 n 0000013624 00000 n 0000013704 00000 n 0000366241 00000 n -0000740911 00000 n +0000740913 00000 n 0000013758 00000 n 0000013807 00000 n 0000366370 00000 n -0000740793 00000 n +0000740795 00000 n 0000013856 00000 n 0000013896 00000 n 0000369810 00000 n -0000740714 00000 n +0000740716 00000 n 0000013955 00000 n 0000014002 00000 n 0000369939 00000 n -0000740596 00000 n +0000740598 00000 n 0000014056 00000 n 0000014101 00000 n 0000370068 00000 n -0000740517 00000 n +0000740519 00000 n 0000014160 00000 n 0000014219 00000 n 0000373824 00000 n -0000740424 00000 n +0000740426 00000 n 0000014278 00000 n 0000014342 00000 n 0000377291 00000 n -0000740331 00000 n +0000740333 00000 n 0000014401 00000 n 0000014457 00000 n 0000380308 00000 n -0000740238 00000 n +0000740240 00000 n 0000014516 00000 n 0000014574 00000 n 0000380566 00000 n -0000740159 00000 n +0000740161 00000 n 0000014633 00000 n 0000014695 00000 n 0000382811 00000 n -0000740026 00000 n +0000740028 00000 n 0000014742 00000 n 0000014794 00000 n 0000382940 00000 n -0000739947 00000 n +0000739949 00000 n 0000014843 00000 n 0000014887 00000 n 0000387139 00000 n -0000739815 00000 n +0000739817 00000 n 0000014936 00000 n 0000014977 00000 n 0000387268 00000 n -0000739736 00000 n +0000739738 00000 n 0000015031 00000 n 0000015079 00000 n 0000387396 00000 n -0000739657 00000 n +0000739659 00000 n 0000015133 00000 n 0000015184 00000 n 0000387525 00000 n -0000739578 00000 n +0000739580 00000 n 0000015233 00000 n 0000015280 00000 n 0000391792 00000 n -0000739445 00000 n +0000739447 00000 n 0000015327 00000 n 0000015364 00000 n 0000391921 00000 n -0000739327 00000 n +0000739329 00000 n 0000015413 00000 n 0000015452 00000 n 0000392050 00000 n -0000739262 00000 n +0000739264 00000 n 0000015506 00000 n 0000015584 00000 n 0000392179 00000 n -0000739169 00000 n +0000739171 00000 n 0000015633 00000 n 0000015700 00000 n 0000392308 00000 n -0000739090 00000 n +0000739092 00000 n 0000015749 00000 n 0000015794 00000 n 0000395748 00000 n -0000738957 00000 n +0000738959 00000 n 0000015842 00000 n 0000015874 00000 n 0000395877 00000 n -0000738839 00000 n +0000738841 00000 n 0000015923 00000 n 0000015962 00000 n 0000396006 00000 n -0000738774 00000 n +0000738776 00000 n 0000016016 00000 n 0000016077 00000 n 0000399687 00000 n -0000738642 00000 n +0000738644 00000 n 0000016126 00000 n 0000016183 00000 n 0000399816 00000 n -0000738577 00000 n +0000738579 00000 n 0000016237 00000 n 0000016286 00000 n 0000399945 00000 n -0000738459 00000 n +0000738461 00000 n 0000016335 00000 n 0000016397 00000 n 0000400074 00000 n -0000738380 00000 n +0000738382 00000 n 0000016451 00000 n 0000016506 00000 n 0000424096 00000 n -0000738287 00000 n +0000738289 00000 n 0000016560 00000 n 0000016601 00000 n 0000424225 00000 n -0000738208 00000 n +0000738210 00000 n 0000016655 00000 n 0000016707 00000 n 0000426956 00000 n -0000738088 00000 n +0000738090 00000 n 0000016755 00000 n 0000016789 00000 n 0000427085 00000 n -0000738009 00000 n +0000738011 00000 n 0000016838 00000 n 0000016865 00000 n 0000444909 00000 n -0000737916 00000 n +0000737918 00000 n 0000016914 00000 n 0000016942 00000 n 0000452398 00000 n -0000737823 00000 n +0000737825 00000 n 0000016991 00000 n 0000017031 00000 n 0000455193 00000 n -0000737730 00000 n +0000737732 00000 n 0000017080 00000 n 0000017123 00000 n 0000461374 00000 n -0000737637 00000 n +0000737639 00000 n 0000017172 00000 n 0000017209 00000 n 0000467999 00000 n -0000737544 00000 n +0000737546 00000 n 0000017258 00000 n 0000017297 00000 n 0000480380 00000 n -0000737451 00000 n +0000737453 00000 n 0000017346 00000 n 0000017385 00000 n 0000483476 00000 n -0000737358 00000 n +0000737360 00000 n 0000017434 00000 n 0000017473 00000 n 0000489756 00000 n -0000737265 00000 n +0000737267 00000 n 0000017522 00000 n 0000017551 00000 n 0000499567 00000 n -0000737172 00000 n +0000737174 00000 n 0000017601 00000 n 0000017634 00000 n 0000513869 00000 n -0000737079 00000 n +0000737081 00000 n 0000017684 00000 n 0000017713 00000 n 0000517096 00000 n -0000736986 00000 n +0000736988 00000 n 0000017763 00000 n 0000017797 00000 n 0000523004 00000 n -0000736907 00000 n +0000736909 00000 n 0000017847 00000 n 0000017884 00000 n 0000018253 00000 n @@ -13027,10 +13058,10 @@ xref 0000017937 00000 n 0000026078 00000 n 0000026141 00000 n -0000732358 00000 n -0000706415 00000 n -0000732184 00000 n -0000733383 00000 n +0000732360 00000 n +0000706417 00000 n +0000732186 00000 n +0000733385 00000 n 0000021238 00000 n 0000021455 00000 n 0000021524 00000 n @@ -13051,12 +13082,12 @@ xref 0000027385 00000 n 0000026304 00000 n 0000027507 00000 n -0000705194 00000 n -0000678673 00000 n -0000705020 00000 n -0000677988 00000 n -0000675844 00000 n -0000677824 00000 n +0000705196 00000 n +0000678675 00000 n +0000705022 00000 n +0000677990 00000 n +0000675845 00000 n +0000677826 00000 n 0000039277 00000 n 0000030626 00000 n 0000027655 00000 n @@ -13116,9 +13147,9 @@ xref 0000042603 00000 n 0000039362 00000 n 0000052586 00000 n -0000675293 00000 n -0000658212 00000 n -0000675109 00000 n +0000675294 00000 n +0000658213 00000 n +0000675110 00000 n 0000043193 00000 n 0000043356 00000 n 0000043518 00000 n @@ -13213,9 +13244,9 @@ xref 0000061772 00000 n 0000061939 00000 n 0000062106 00000 n -0000657323 00000 n -0000635992 00000 n -0000657149 00000 n +0000657324 00000 n +0000635993 00000 n +0000657150 00000 n 0000062273 00000 n 0000062439 00000 n 0000062594 00000 n @@ -13253,9 +13284,9 @@ xref 0000068390 00000 n 0000068546 00000 n 0000068704 00000 n -0000635026 00000 n -0000615059 00000 n -0000634853 00000 n +0000635027 00000 n +0000615060 00000 n +0000634854 00000 n 0000068861 00000 n 0000069019 00000 n 0000072403 00000 n @@ -13268,10 +13299,10 @@ xref 0000072214 00000 n 0000072277 00000 n 0000072340 00000 n -0000614265 00000 n -0000595948 00000 n -0000614092 00000 n -0000733501 00000 n +0000614266 00000 n +0000595949 00000 n +0000614093 00000 n +0000733503 00000 n 0000076974 00000 n 0000075794 00000 n 0000072527 00000 n @@ -13329,7 +13360,7 @@ xref 0000091143 00000 n 0000091271 00000 n 0000091400 00000 n -0000733620 00000 n +0000733622 00000 n 0000094394 00000 n 0000093505 00000 n 0000091564 00000 n @@ -13345,17 +13376,17 @@ xref 0000097307 00000 n 0000094506 00000 n 0000097433 00000 n -0000595273 00000 n -0000583284 00000 n -0000595094 00000 n +0000595274 00000 n +0000583285 00000 n +0000595095 00000 n 0000097690 00000 n 0000101577 00000 n 0000101386 00000 n 0000097881 00000 n 0000101512 00000 n -0000582743 00000 n +0000582744 00000 n 0000572999 00000 n -0000582564 00000 n +0000582565 00000 n 0000106188 00000 n 0000105789 00000 n 0000101743 00000 n @@ -13386,7 +13417,7 @@ xref 0000561566 00000 n 0000113616 00000 n 0000113745 00000 n -0000733745 00000 n +0000733747 00000 n 0000112735 00000 n 0000112793 00000 n 0000112883 00000 n @@ -13435,7 +13466,7 @@ xref 0000133225 00000 n 0000133354 00000 n 0000133482 00000 n -0000733870 00000 n +0000733872 00000 n 0000332997 00000 n 0000137583 00000 n 0000137005 00000 n @@ -13454,7 +13485,7 @@ xref 0000141290 00000 n 0000144430 00000 n 0000552380 00000 n -0000549022 00000 n +0000549021 00000 n 0000552201 00000 n 0000144559 00000 n 0000144271 00000 n @@ -13476,7 +13507,7 @@ xref 0000149096 00000 n 0000149225 00000 n 0000149354 00000 n -0000733995 00000 n +0000733997 00000 n 0000149859 00000 n 0000149668 00000 n 0000149518 00000 n @@ -13521,7 +13552,7 @@ xref 0000169444 00000 n 0000169509 00000 n 0000169638 00000 n -0000734120 00000 n +0000734122 00000 n 0000175310 00000 n 0000174392 00000 n 0000169815 00000 n @@ -13563,7 +13594,7 @@ xref 0000193246 00000 n 0000190180 00000 n 0000193372 00000 n -0000734245 00000 n +0000734247 00000 n 0000197748 00000 n 0000197170 00000 n 0000193549 00000 n @@ -13600,7 +13631,7 @@ xref 0000207107 00000 n 0000211334 00000 n 0000211177 00000 n -0000734370 00000 n +0000734372 00000 n 0000369874 00000 n 0000215370 00000 n 0000215050 00000 n @@ -13640,7 +13671,7 @@ xref 0000236690 00000 n 0000236819 00000 n 0000236266 00000 n -0000734495 00000 n +0000734497 00000 n 0000307088 00000 n 0000240544 00000 n 0000239982 00000 n @@ -13674,7 +13705,7 @@ xref 0000257994 00000 n 0000257705 00000 n 0000258123 00000 n -0000734620 00000 n +0000734622 00000 n 0000262381 00000 n 0000261702 00000 n 0000258356 00000 n @@ -13713,10 +13744,10 @@ xref 0000277719 00000 n 0000282073 00000 n 0000281911 00000 n -0000548667 00000 n +0000548666 00000 n 0000546669 00000 n -0000548502 00000 n -0000734745 00000 n +0000548501 00000 n +0000734747 00000 n 0000366305 00000 n 0000286039 00000 n 0000285403 00000 n @@ -13755,7 +13786,7 @@ xref 0000302197 00000 n 0000305334 00000 n 0000305463 00000 n -0000734870 00000 n +0000734872 00000 n 0000307153 00000 n 0000306833 00000 n 0000305640 00000 n @@ -13812,7 +13843,7 @@ xref 0000326353 00000 n 0000326516 00000 n 0000326669 00000 n -0000734995 00000 n +0000734997 00000 n 0000333062 00000 n 0000330055 00000 n 0000327022 00000 n @@ -13871,7 +13902,7 @@ xref 0000351477 00000 n 0000351542 00000 n 0000351671 00000 n -0000735120 00000 n +0000735122 00000 n 0000355488 00000 n 0000354650 00000 n 0000351848 00000 n @@ -13924,7 +13955,7 @@ xref 0000373888 00000 n 0000373951 00000 n 0000374014 00000 n -0000735245 00000 n +0000735247 00000 n 0000527582 00000 n 0000377549 00000 n 0000377100 00000 n @@ -13969,7 +14000,7 @@ xref 0000388505 00000 n 0000387891 00000 n 0000388631 00000 n -0000735370 00000 n +0000735372 00000 n 0000389123 00000 n 0000388932 00000 n 0000388782 00000 n @@ -14065,7 +14096,7 @@ xref 0000407024 00000 n 0000407089 00000 n 0000407153 00000 n -0000735495 00000 n +0000735497 00000 n 0000413863 00000 n 0000410299 00000 n 0000407329 00000 n @@ -14230,7 +14261,7 @@ xref 0000431900 00000 n 0000435218 00000 n 0000435283 00000 n -0000735620 00000 n +0000735622 00000 n 0000438595 00000 n 0000438404 00000 n 0000435486 00000 n @@ -14279,7 +14310,7 @@ xref 0000455128 00000 n 0000455257 00000 n 0000455322 00000 n -0000735745 00000 n +0000735747 00000 n 0000458629 00000 n 0000458243 00000 n 0000455538 00000 n @@ -14324,7 +14355,7 @@ xref 0000475064 00000 n 0000471935 00000 n 0000475190 00000 n -0000735870 00000 n +0000735872 00000 n 0000478326 00000 n 0000478007 00000 n 0000475381 00000 n @@ -14374,7 +14405,7 @@ xref 0000493356 00000 n 0000490297 00000 n 0000493482 00000 n -0000735995 00000 n +0000735997 00000 n 0000496582 00000 n 0000496262 00000 n 0000493758 00000 n @@ -14418,7 +14449,7 @@ xref 0000514063 00000 n 0000514128 00000 n 0000514193 00000 n -0000736120 00000 n +0000736122 00000 n 0000517420 00000 n 0000516710 00000 n 0000514398 00000 n @@ -14461,39 +14492,39 @@ xref 0000527681 00000 n 0000539025 00000 n 0000546614 00000 n -0000548914 00000 n -0000548883 00000 n +0000548913 00000 n +0000548882 00000 n 0000552600 00000 n 0000562040 00000 n 0000572547 00000 n -0000583031 00000 n -0000595655 00000 n -0000614720 00000 n -0000635607 00000 n -0000657750 00000 n -0000675645 00000 n -0000678475 00000 n -0000678245 00000 n -0000705782 00000 n -0000732893 00000 n -0000736245 00000 n -0000736369 00000 n -0000736495 00000 n -0000736621 00000 n -0000736738 00000 n -0000736830 00000 n -0000753445 00000 n -0000772757 00000 n -0000772798 00000 n -0000772838 00000 n -0000772972 00000 n +0000583032 00000 n +0000595656 00000 n +0000614721 00000 n +0000635608 00000 n +0000657751 00000 n +0000675646 00000 n +0000678477 00000 n +0000678247 00000 n +0000705784 00000 n +0000732895 00000 n +0000736247 00000 n +0000736371 00000 n +0000736497 00000 n +0000736623 00000 n +0000736740 00000 n +0000736832 00000 n +0000753447 00000 n +0000772759 00000 n +0000772800 00000 n +0000772840 00000 n +0000772974 00000 n trailer << /Size 2172 /Root 2170 0 R /Info 2171 0 R -/ID [<5A3C18693D743104F54A9671E6A3E513> <5A3C18693D743104F54A9671E6A3E513>] +/ID [<70FCA946EA5C6EE5EBAD39CEAFF4F732> <70FCA946EA5C6EE5EBAD39CEAFF4F732>] >> startxref -773230 +773232 %%EOF diff --git a/doc/arm/isc-logo.eps b/doc/arm/isc-logo.eps index c6a1d7a..f101cc8 100644 --- a/doc/arm/isc-logo.eps +++ b/doc/arm/isc-logo.eps @@ -1,255 +1,63 @@ %!PS-Adobe-3.1 EPSF-3.0 -%%Title: Alternate-ISC-logo-v2.ai -%%Creator: Adobe Illustrator(R) 11 -%%AI8_CreatorVersion: 11.0.0 -%AI9_PrintingDataBegin -%%For: Douglas E. Appelt -%%CreationDate: 10/22/04 -%%BoundingBox: 0 0 255 149 -%%HiResBoundingBox: 0 0 254.8672 148.7520 -%%CropBox: 0 0 254.8672 148.7520 +%ADO_DSC_Encoding: MacOS Roman +%%Title: ISC_logo_only_RGB.eps +%%Creator: Adobe Illustrator(R) 13.0 +%%For: Brian Reid +%%CreationDate: 3/25/10 +%%BoundingBox: 0 0 118 46 +%%HiResBoundingBox: 0 0 117.9991 45.0176 +%%CropBox: 0 0 117.9991 45.0176 %%LanguageLevel: 2 %%DocumentData: Clean7Bit +%ADOBeginClientInjection: DocumentHeader "AI11EPS" +%%AI8_CreatorVersion: 13.0.2 %AI9_PrintingDataBegin %ADO_BuildNumber: Adobe Illustrator(R) 13.0.2 x434 R agm 4.4379 ct 5.1039 %ADO_ContainsXMP: MainFirst +%ADOEndClientInjection: DocumentHeader "AI11EPS" %%Pages: 1 -%%DocumentNeededResources: -%%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0) -%%+ procset Adobe_CoolType_Utility_T42 (1.0 0) -%%+ procset Adobe_CoolType_Utility_MAKEOCF (1.19 0) -%%+ procset Adobe_CoolType_Core (2.23 0) -%%+ procset Adobe_AGM_Core (2.0 0) -%%+ procset Adobe_AGM_Utils (1.0 0) -%%DocumentFonts: -%%DocumentNeededFonts: -%%DocumentNeededFeatures: -%%DocumentSuppliedFeatures: -%%DocumentProcessColors: Cyan Magenta Yellow Black -%%DocumentCustomColors: (PANTONE 1805 C) -%%+ (PANTONE 871 C) -%%+ (PANTONE 301 C) -%%+ (PANTONE 7506 C) -%%CMYKCustomColor: 0 0.9100 1 0.2300 (PANTONE 1805 C) -%%+ 0.3569 0.3608 0.6353 0.1882 (PANTONE 871 C) -%%+ 1 0.4500 0 0.1800 (PANTONE 301 C) -%%+ 0 0.0500 0.1500 0 (PANTONE 7506 C) -%%RGBCustomColor: -%ADO_ContainsXMP: MainFirst -%AI7_Thumbnail: 128 76 8 -%%BeginData: 10692 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FD1CF852FD63FFF820272726272727264B27272627272726272727 -%26272727264B20F827FD63FFF827FFFFFFCFFF84365AFFFFFFCFFFFFFFCF -%FFFFFFCFFD04FFCAF852FD63FFF827CFCFCACFCA2F0607A8CFCACFCACFCA -%CFCACFCACFCACFCACF7CF827FD63FFF800FFCFFFA8A8070D06A8CFFFCFFF -%CFFFCFFFCFFFCFFFCFFFCFA7F852FD63FFF800077E2F0D060D060706537D -%CF7D2FA8CFCACFCACFCACFCAFF7CF827FD63FFF8000D062F070D062F070D -%062F2F0D062FCACFCFFFCFCFCFFFCFA1F852FD63FFF8050707062E517651 -%522807060706072ECFCACFCACFCACFCAFF7CF827FD63FFF8002F067C757B -%757C757B512F072F2FFFCFCFCFFFCFFFCFFFCFA1F852FD63FFF805075251 -%75517551755175512F062FCACFCACFCACFCACFCAFF7CF827FD63FFF8F859 -%75765176757C517C757B2E2F07A8CFFFCFCFCFFFCFCFCFA1F852FD63FFF8 -%00517551757CCFCAA751755175060753CFCACFCACFCACFCACF7CF827FD63 -%FFF8F87C75757CFFCFFFCFA7517C752F072F59A8CFCFCFFFCFFFCFA7F852 -%FD04FFA87D527DA8FD5AFFF827757551A1CFCFCAFFA0755175280D060706 -%A8CFCFCACFCAFF7CF827FD05FF27F827FD5BFFF8F87C51767CFFCFFFCFA0 -%517C752F062F060D84FFCFFFCFFFCFA1F852FD05FF7DF87DFD5BFFF80552 -%7551757CC9A7A05175517606072F7E7DCFCACFC9CFCAFF6FF827FD05FF52 -%F852FD27FFA8FD33FFF80059757C7575517C517C517C2E2F06CFCFFFCFCF -%9293CAFFCF6FF852FD05FF7DF87DFD04FFA8FD05FF7D7DA8FF527D7D7D52 -%7D52A8FFA8527D527DA8FF7D7D527D52FD05FFA8FD05FFA87D7DFFFFA852 -%7D527DA8FF527D7D7D527D52A8FD19FFF805075275755175517551752D0D -%0653CFFFCFFFA78C6899939344F827FD05FF52F852FFFFFFA8F87DFD04FF -%7D27FFA87D7DA8F827A87D7DFFA8F827A8527DFFA8F852A827F8A8FFFFFF -%7DF8FD05FF2752FFFFA8F827A8527DA87D7DA8F827A87D7DFD19FFF8F82F -%0752517C757B757C2E0D062FA8C999CFCFC28C928C8C8C6EF852FD05FF7D -%F87DFD04FFF8F87DFFFFFF7D52FD05FFF852FD05FFF87DFD05FFF852FFFF -%F852FFFFFF7DF8F8FD04FF7D52FFFFFFF87DFD07FFF852FD1CFFF8000607 -%062F2852282E060D0607067D928C9293688C6892688C44F827FD05FF52F8 -%52FFFFFFA85252F852FFFF7D27FD05FFF87DFD04FFA8F852FD05FFF852FF -%FFF8A8FFFFFF7D5227F8A8FFFF527DFFFFA8F852FD07FFF87DFD1CFFF800 -%852F2F062F070D062F072F062F0D9A8C928C928C928C928C6EF852FD05FF -%7DF87DFD04FF27FF52F852FF7D52FD05FFF852FD05FFF82752527DFFFFF8 -%52FF527DFD04FF527DFF27F8A8FF7D7DFFFFFFF82752527DFD04FFF852FD -%1CFFF827CFCF7D2F060D062F2F7EA82F062F938C68928C8C68926E994AF8 -%27FD05FF52F852FFFFFFA827FFFF52F852A852FD05FFF87DFD04FFA8F852 -%FF7DA8FFFFF82752F8A8FD04FF7D52FFA827F8A87D7DFFFFA8F852FF7DA8 -%FD04FFF87DFD1CFFF827FFCFFFA80D062FA8CFCFCA927693928C928C9292 -%75517C7B51F852FD05FF7DF87DFFFFFFA827FFFFFF52F8F87DFD05FFF852 -%FD05FFF87DFD05FFF852FF52F8A8FFFFFF5252FFFFFF27F8277DFFFFFFF8 -%7DFD07FFF852FD1CFFF827CFCFCACF06062ECFCAFF928C688C6892688C6E -%765175517C26F827FD05FF52F852FFFFFFA827FD04FF52F852FD05FFF852 -%FD04FFA8F852FFFFA8A8FFF87DFFFFF8F8A8FFFF5227FD04FF27F8A8FFFF -%A8F852FFFFA8A8FFFFFFF852FD1CFFF827FFCFFFCF7E53A8CFFFCFC99292 -%8C928C92757C757C517C7551F852FD04FFA852F852A8FFFFA8F8A8FD04FF -%527DFD04FF7DF827FD04FFA8F827525252FF7DF827FFFFFF2727A8FF5227 -%A8FD04FF52A8FFFFA8F827525252FFFFFF7DF827FD1CFFF827CFCFCACFCF -%CFCAFD04CF93688C688C6F7651755175517C4BF827FD05FFA8FFA8FFFFFF -%A8FFA8FD0BFFA8FFA8FFFFFFA8FFA8A8A8FFFFFFA8FFA8FFFFFFA8FFA8FF -%A8FD09FFA8FFA8A8A8FD05FFA8FFA8FD1BFFF827FFCFCFCFFFCFCFCFFFCF -%C38C928C8C6E7C7576517C75767551F852FD63FFF827CFCFCACFCACFCACF -%92928C8C688C6875517551755175517526F827FD63FFF827FFCFFFCFFFCF -%FFCA938C928C928C99517C757C517C757C7551F852FD63FFF827CFCFCACF -%CACFCACFA093688C6892757551755175517551754BF827FD63FFF827FFCF -%FFCFCFCFFFCFFF998C8C926E7C7576517C7576517CA7A1F852FD06FFA87D -%527DA8FD58FFF827CFCFCACFCACFCAFFCF996892686F5175517551755175 -%7CFF7CF827FD05FF7D2752A82727A8FD57FFF827FFCFFFCFFFCFFFC2BB8C -%928C8C6E7C757C517C757C51CFFFA1F852FD05FF2752FFFFFF52FD58FFF8 -%27CFCFCACFCACFCF99688C68928C6F5175517551755175CAFF7CF827FD04 -%FFA8F852FD5CFFF827FFCFCFCFFFCFFFA0998C928C926E7C517C7576517C -%51CACFA1F852FD04FFA827F87DFFFFFFA8527DFD04FF527DFFFFA87D52A8 -%FF7D527D527D527D7DFF7D7D527D527DFFFFFFA8FD06FFA8FD04FFA87D7D -%7DFD26FFF827CFCFCACFCACFCACFCF99688C6893517551755175517575FF -%7CF827FD05FF52F8F852FFFFFF52F8A8FFFF7D27A8FF5252A8A852A852A8 -%7DF827A87D7DFFA8F852A87D52FFFFFFF8A8FD04FF5227FFFFFF7D27A8A8 -%52A8FD25FFF827FFCFFFCFFFCFFFCFFFA08C8C92927C517C757C517C7575 -%7C7CF852FD06FF52F8F852FFFFFF27F8FFFF52A8FFFFF87DFD07FFF87DFD -%05FFF852FD06FFF827FD04FF2727FFFFFF2752FD29FFF827CFCFCACFCACF -%CACFA799688C68927575517551755175517526F84BFD07FF52F8F87DFFFF -%A8F87D7D52FFFFFFF8F87DFD05FFA8F852FD05FFF87DFD05FFA8F8F8A8FF -%FF7DF8F8A8FFFF52F852A8FD27FFF827FFCFFFCFCFCFFFCF9368928C928C -%995176517C7576517C7551F852FD08FF7DF8F8FFFFFF52F827FD05FFF8F8 -%27FD05FFF87DFD05FFF8277D527DFFFF7D52F852FFFF277DF8A8FFFFFF52 -%F8F87DFD26FFF827CFCFCACFCACFCAFF938C688C688C6875517551755175 -%517C26F827FD09FF27F8A8FFFFFFF852FD06FF52F827FFFFFFA8F852FD05 -%FFF852A8A87DFFFF527D7DF8FF7D52A8F87DFD04FF7DF8F8A8FD25FFF827 -%FFCFFFCFFFCFFFCFCFCFC98C928C92927C517C757C517C7551F852FD04FF -%7DFD04FF7DF8FD04FFF852FD07FF7DF8A8FFFFFFF87DFD05FFF852FD05FF -%52A8FF272752A8FFF87DFD06FFF8A8FD25FFF827CFCFCACFCACFCAFD04CF -%99688C688C6E7651755175517C4BF827FD04FF5227FFFFA8F852FD04FFF8 -%7DFFFFFF7D7DFFFF7D27FD04FFF852FD05FFF852FFFFA8FFFF27A8FF7DF8 -%52FFFFF852FFA852FFFF7D27A8FD25FFF827FFCFCFCFFFCFCFCFFFCFCF92 -%928C928C926E7C517C75767551F852FD04FF7D272752277DFD04FF7DF827 -%FFFFFF7D27525227FD04FFA8F852A8FFFFFF7D2727525252FFA8F8A8FFFF -%52FFFFFF2727A8FF275252527DFD26FFF827CFCFCACFCACFCACFCAFF998C -%688C688C688C68755176517526F827FD07FFA8FD07FFA8FFA8FFFFFFA8A8 -%A8FD05FFA8FFA8FD05FFA8FFA8A8A8FFA8FFA8FD07FFA8FFFFFFA8A8FD28 -%FFF827FFCFFFCFFFCFFFCFFFCFCF92C29A928C928C928C99757C7551F852 -%FD63FFF827CFCFCACFCACFCACFCAFD04CFFF998C68928C8C6892689344F8 -%27FD63FFF827FFCFFFCFCFCFFFCFCFCFFFCFCFCFC98C928C928C928C928C -%68F852FD63FFF827CFCFCACFCACFCAA8537ECACFCAFF938C6899688C688C -%689244F827FD63FFF827FFCFFFCFFFCFA8072F07FFCFFFCFCF992F0D5992 -%928C928C68F852FD08FF7D7D527D52A8A8FD54FFF827CFCFCACFCACFA70D -%060753A87DA8CA5A0607069368929AC244F827FD06FF7DF8527D7D7D52F8 -%27FD54FFF827FFCFCFCFFFCFCF2F2F070D062F072F062F07539993C2FFFF -%76F852FD05FF7DF87DFD06FF27FD54FFF827CFCFCACFCACF7D0D060D0607 -%060D0607060753FFCACFCAFF76F827FD04FFA8F827FD07FFA8A8FD15FFA8 -%FD3DFFF827FFCFFFCFFF592F062F072F2852282F072F072F7DFFCFFFCFA7 -%F852FD04FF52F87DFD0CFFA87D7D7DFD05FFA8FD05FF7D7DA8FFFFA87D7D -%7DFFFFFFA87D527D7DFD04FFA8527D527DA8FFFF7D527D527D527D7DFF7D -%7D7DFFFFA8527DA8FFFFA8527DFFFFFFA8FD06FFA8FFFFF827CF5959CA53 -%07060D066F688C6892684B060D06077DCFCFCF7CF827FD04FF27F8A8FD0A -%FFA82752A87D52F852FFFFA8F87DFD04FF7D27FFFF7D27A87D52FFFF5227 -%7DA87D27F8A8FFFFA8F827A827F8A8A852A87DF827A87D7DFFA8F852FFFF -%A8F827FD04FF2727FFFFFFF8A8FD04FF5227FFFFF827A9062F070D062F28 -%928C928C928C928C92282F072F847E5953F852FD04FFF8F8A8FD0AFF2752 -%FD04FF7DF87DFFFFF8F852FFFFFF7D52FFFFF8A8FFFFA8FF7DF8A8FD04FF -%27F8FFFFFFF87DFFFFF87DFD04FFF87DFD05FFF852FFFFFFF87DFD04FF27 -%52FFFFFFF827FD04FF2727FFFFF8272F07060D060D278C688C68928C8C68 -%8C688C060D0607060D06F827FFFFFFA827F87DFD09FF7DF8FD06FF27F8FF -%A85252F852FFFF7D27FFFF27F87DFFFFFF2727FD05FF7DF852FFA8F852FF -%A8F87DFFFFFFA8F852FD05FFF852FFFFA8F852FD04FF5252FFFFA8F8F8A8 -%FFFF7DF827A8FFF827FF2F2F070D06938C928CBCC9CFC9BB8C928C6F070D -%062F0706F852FD04FF27F852FD09FF52F8FD06FF52F8FFFF27FF52F852FF -%7D52FFFFA827F827A8FFF852FD06FFF852FFFFF852FF7D7DFD05FFF87DFD -%05FFF852FFFFFFF87DFD04FF2752FFFF7D52F852FFFF277DF8A8FFF827CF -%CF2F0D064C689268C2CFFFCFFFCFC2688C682E0607062F52F827FD04FF7D -%F8F8A8FD08FF52F8A8FD05FF52F8FFA827FFFF52F852A852FD04FF7DF827 -%FF2727FD05FFA8F852FFA8F82752F8A8FD04FFA8F852FD05FFF852FFFFA8 -%F852FD04FF5252FFFF7D7D7DF8FF7D52A8F87DFFF827FFCF59062F6F8C8C -%99CFFFCFFFCFFFCF938C8C4B2F0759CFA7F852FD05FF52F827FD06FF7DFF -%A8F852FD05FFF852FFA827FFFFFF52F8F87DFD05FF7DF8FF52F8A8FD04FF -%A8F8A8FFFFF87DFF52F8FD05FFF87DFD05FFF852FFFFFFF852FD04FF277D -%FFFF27A8FF272752FFFFF87DFFF827CFCF2F070693688C99FFCACFCACFCA -%FF998C686F060759CF7CF827FD05FFA852F8F87DFFFFFF5227FFFF52F87D -%FFFFFF5227A8FFA827FD04FF52F852FF527DFFFF5227FFFFF827A8FFFFFF -%2752FFFFFFF852FFFF27F8FFFFFFA8F852FD05FFF87DFFFFFF52F8A8FFFF -%7D27A8FFFF27A8FF7DF852FFFFF827FFF827FFCF53062F6E928CC2FFFFCF -%FFCFFFCFC28C926F2F077ECFA7F852FD07FFA8FD06277DFFFFFF7D27277D -%527DFFFFFF7DF8A8FD04FF527DFFA827525252A8FFFFFF5227527D52A8FF -%FFFFA8F852A8FFA82727A8FFA8F852A8FFFFFF7DF827FD04FF52277D5252 -%A8FFFFA8F8A8FFFF52FFFFFF2727A8F827CFCF2F07066F8C8C92FFCFCFCA -%CFCFCF8C8C8C4B060D59CF7CF827FD0BFFA8FD09FFA8FD05FFA8FFA8FD09 -%FFA8A8FD07FFA8A8FD05FFA8FFA8FD05FFA8FFA8FFA8FD05FFA8FFA8FD05 -%FFA8FD05FFA8FFA8FD07FFA8FFF827AF2F2F070D4B928C8CA0FFCFFFCFFF -%998C8C92280D067ECFA1F852FD63FFF8270707060D0607688C688C99C9CA -%C9938C688C680D0607065A76F827FD63FFF8275A062F070D07528C928C92 -%8C928C928C928C2F070D062F072EF852FD63FFF84B842F597E0607064C8C -%8C68928C8C688C6828060D0607060D52F827FD63FFF827FFCFCFCF7E060D -%062F6F928C928C934B2F070D0684A85A59A1F852FD63FFF827CFCFCACFCA -%590607060D06282728060D0607067ECACFCFCF7CF827FD63FFF827FFCFFF -%CFFFCF59062F070D072F070D062F2FA8CFFFCFFFCFA7F852FD63FFF827CF -%CFCACFCACF2F07060D0607060D06070653CFCFCACFCAFF7CF827FD63FFF8 -%27FFCFFFCFCFA82F070D59CFA8A8A859060D07FD04CFFFCFA1F852FD63FF -%F827CFCFCACFCFA82F0D2FCFCACFCFCFA80D060DA8CFCACFCAFF7CF827FD -%63FFF827FFCFFFCFFFCFFFA8FFCFFFCFFFCFFF7E7EA8FFCFFFCFFFFFA7F8 -%52FD63FFFD09F820FD07F820FD07F820F8F827FD63FF27F827F820F827F8 -%20F827F820F827F820F827F820F827F820F827F87CFDE2FFFF -%%EndData +%%DocumentNeededResources: +%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 +%%+ procset Adobe_CoolType_Utility_T42 1.0 0 +%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 +%%+ procset Adobe_CoolType_Core 2.31 0 +%%+ procset Adobe_AGM_Core 2.0 0 +%%+ procset Adobe_AGM_Utils 1.0 0 +%%DocumentFonts: +%%DocumentNeededFonts: +%%DocumentNeededFeatures: +%%DocumentSuppliedFeatures: +%%DocumentCustomColors: +%%CMYKCustomColor: +%%RGBCustomColor: %%EndComments + + + + + + + %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 -%%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. -systemdict /setpacking known -{ - currentpacking - true setpacking -} if -userdict /Adobe_AGM_Utils 68 dict dup begin put +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{currentpacking true setpacking}if +userdict/Adobe_AGM_Utils 73 dict dup begin put /bdf -{ - bind def -} bind def -/nd{ - null def -}bdf +{bind def}bind def +/nd{null def}bdf /xdf -{ - exch def -}bdf -/ldf -{ - load def -}bdf +{exch def}bdf +/ldf +{load def}bdf /ddf -{ - put -}bdf +{put}bdf /xddf -{ - 3 -1 roll put -}bdf +{3 -1 roll put}bdf /xpt -{ - exch put -}bdf +{exch put}bdf /ndf { exch dup where{ @@ -266,54 +74,48 @@ userdict /Adobe_AGM_Utils 68 dict dup begin put exch def }ifelse }def -/bdict -{ - mark -}bdf -/edict -{ - counttomark 2 idiv dup dict begin {def} repeat pop currentdict end -}def +/gx +{get exec}bdf /ps_level /languagelevel where{ - pop systemdict /languagelevel get exec + pop systemdict/languagelevel gx }{ 1 }ifelse def -/level2 +/level2 ps_level 2 ge def -/level3 +/level3 ps_level 3 ge def /ps_version - {version cvr} stopped { - -1 - }if + {version cvr}stopped{-1}if def +/set_gvm +{currentglobal exch setglobal}bdf +/reset_gvm +{setglobal}bdf /makereadonlyarray { - /packedarray where{ - pop packedarray + /packedarray where{pop packedarray }{ - array astore readonly - }ifelse + array astore readonly}ifelse }bdf /map_reserved_ink_name { - dup type /stringtype eq{ - dup /Red eq{ - pop (_Red_) + dup type/stringtype eq{ + dup/Red eq{ + pop(_Red_) }{ - dup /Green eq{ - pop (_Green_) + dup/Green eq{ + pop(_Green_) }{ - dup /Blue eq{ - pop (_Blue_) + dup/Blue eq{ + pop(_Blue_) }{ - dup () cvn eq{ - pop (Process) + dup()cvn eq{ + pop(Process) }if }ifelse }ifelse @@ -329,20 +131,20 @@ def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put - /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def - currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf + currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def - currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf - cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf + currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf + cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end @@ -351,8 +153,8 @@ def { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace - AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get - /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor + AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap @@ -366,15 +168,15 @@ def AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer - AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or + AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or { - currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne + currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne { - mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark - } if + mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark + }if }{ AGMUTIL_GSTATE_ht sethalftone - } ifelse + }ifelse AGMUTIL_GSTATE_flt setflat end }def @@ -397,31 +199,38 @@ def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd -/agm_sethalftone +/AGMUTIL_cpd nd +/capture_cpd{ + //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf +}def +/thold_halftone { - dup - begin - /_Data load - /Thresholds xdf - end level3 - { sethalftone }{ - dup /HalftoneType get 3 eq { - sethalftone - } {pop} ifelse - }ifelse -} def + {sethalftone currenthalftone} + { + dup/HalftoneType get 3 eq + { + sethalftone currenthalftone + }{ + begin + Width Height mul{ + Thresholds read{pop}if + }repeat + end + currenthalftone + }ifelse + }ifelse +}def /rdcmntline { currentfile AGMUTIL_str256 readline pop - (%) anchorsearch {pop} if -} bdf + (%)anchorsearch{pop}if +}bdf /filter_cmyk { - dup type /filetype ne{ - exch () /SubFileDecode filter - } - { + dup type/filetype ne{ + exch()/SubFileDecode filter + }{ exch pop } ifelse @@ -429,7 +238,7 @@ def exch { AGMUTIL_src256 readstring pop - dup length /AGMUTIL_srcLen exch def + dup length/AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get @@ -441,41 +250,41 @@ def } bind /exec cvx - ] cvx -} bdf + ]cvx +}bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get -} bdf +}bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf - dup type /filetype ne{ - 0 () /SubFileDecode filter + dup type/filetype ne{ + 0()/SubFileDecode filter }if [ exch [ - /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx - currentdict /srcStr get /readstring cvx /pop cvx - /dup cvx /length cvx 0 /gt cvx [ - Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx - names_index Names length currentdict /srcStr get length 1 sub { - 1 /index cvx /exch cvx /get cvx - currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx - Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx - } for - currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx - ] cvx /if cvx + /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx + currentdict/srcStr get/readstring cvx/pop cvx + /dup cvx/length cvx 0/gt cvx[ + Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx + names_index Names length currentdict/srcStr get length 1 sub{ + 1/index cvx/exch cvx/get cvx + currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx + Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx + }for + currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx + ]cvx/if cvx /end cvx - ] cvx + ]cvx bind /exec cvx - ] cvx + ]cvx end -} bdf +}bdf /AGMUTIL_imagefile nd /read_image_file { @@ -484,177 +293,195 @@ def /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def - /origDataSource imageDict /DataSource get def - /origMultipleDataSources imageDict /MultipleDataSources get def - /origDecode imageDict /Decode get def - /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def - /srcDataStrs [ imageDict begin - currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse - { - Width Decode length 2 div mul cvi string - } repeat - end ] def - imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse + /origDataSource imageDict/DataSource get def + /origMultipleDataSources imageDict/MultipleDataSources get def + /origDecode imageDict/Decode get def + /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def + imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse { - /imbufCnt imageDict /DataSource get length def + /imbufCnt imageDict/DataSource get length def /imbufs imbufCnt array def - 0 1 imbufCnt 1 sub { + 0 1 imbufCnt 1 sub{ /imbufIdx xdf imbufs imbufIdx imbufLen string put - imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put - } for - DeviceN_PS2 { + imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put + }for + DeviceN_PS2{ imageDict begin - /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def + /DataSource[DataSource/devn_sep_datasource cvx]cvx def /MultipleDataSources false def - /Decode [0 1] def + /Decode[0 1]def end - } if + }if }{ /imbuf imbufLen string def - Indexed_DeviceN level3 not and DeviceN_NoneName or { + Indexed_DeviceN level3 not and DeviceN_NoneName or{ + /srcDataStrs[imageDict begin + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi string + }repeat + end]def imageDict begin - /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def - /Decode [0 1] def + /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def + /Decode[0 1]def end }{ - imageDict /DataSource {AGMUTIL_imagefile imbuf readstring pop} put - } ifelse - } ifelse + imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put + imageDict/Decode[0 1]put + }ifelse + }ifelse imageDict exch load exec - imageDict /DataSource origDataSource put - imageDict /MultipleDataSources origMultipleDataSources put - imageDict /Decode origDecode put + imageDict/DataSource origDataSource put + imageDict/MultipleDataSources origMultipleDataSources put + imageDict/Decode origDecode put end -} bdf +}bdf /write_image_file { begin - { (AGMUTIL_imagefile) (w+) file } stopped{ + {(AGMUTIL_imagefile)(w+)file}stopped{ false }{ - Adobe_AGM_Utils/AGMUTIL_imagefile xddf + Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def - MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { + MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{ /imbuf imbufLen string def }if - 1 1 Height { + 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop - MultipleDataSources { - 0 1 DataSource length 1 sub { + MultipleDataSources{ + 0 1 DataSource length 1 sub{ DataSource type dup - /arraytype eq { - pop DataSource exch get exec + /arraytype eq{ + pop DataSource exch gx }{ - /filetype eq { + /filetype eq{ DataSource exch get imbuf readstring pop }{ DataSource exch get - } ifelse - } ifelse + }ifelse + }ifelse AGMUTIL_imagefile exch writestring - } for + }for }{ DataSource type dup - /arraytype eq { + /arraytype eq{ pop DataSource exec }{ - /filetype eq { + /filetype eq{ DataSource imbuf readstring pop }{ DataSource - } ifelse - } ifelse + }ifelse + }ifelse AGMUTIL_imagefile exch writestring - } ifelse + }ifelse }for end true }ifelse end -} bdf +}bdf /close_image_file { - AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile + AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile }def -statusdict /product known userdict /AGMP_current_show known not and{ - /pstr statusdict /product get def - pstr (HP LaserJet 2200) eq - pstr (HP LaserJet 4000 Series) eq or - pstr (HP LaserJet 4050 Series ) eq or - pstr (HP LaserJet 8000 Series) eq or - pstr (HP LaserJet 8100 Series) eq or - pstr (HP LaserJet 8150 Series) eq or - pstr (HP LaserJet 5000 Series) eq or - pstr (HP LaserJet 5100 Series) eq or - pstr (HP Color LaserJet 4500) eq or - pstr (HP Color LaserJet 4600) eq or - pstr (HP LaserJet 5Si) eq or - pstr (HP LaserJet 1200 Series) eq or - pstr (HP LaserJet 1300 Series) eq or - pstr (HP LaserJet 4100 Series) eq or +statusdict/product known userdict/AGMP_current_show known not and{ + /pstr statusdict/product get def + pstr(HP LaserJet 2200)eq + pstr(HP LaserJet 4000 Series)eq or + pstr(HP LaserJet 4050 Series )eq or + pstr(HP LaserJet 8000 Series)eq or + pstr(HP LaserJet 8100 Series)eq or + pstr(HP LaserJet 8150 Series)eq or + pstr(HP LaserJet 5000 Series)eq or + pstr(HP LaserJet 5100 Series)eq or + pstr(HP Color LaserJet 4500)eq or + pstr(HP Color LaserJet 4600)eq or + pstr(HP LaserJet 5Si)eq or + pstr(HP LaserJet 1200 Series)eq or + pstr(HP LaserJet 1300 Series)eq or + pstr(HP LaserJet 4100 Series)eq or { - userdict /AGMP_current_show /show load put - userdict /show { - currentcolorspace 0 get - /Pattern eq - {false charpath f} - {AGMP_current_show} ifelse - } put + userdict/AGMP_current_show/show load put + userdict/show{ + currentcolorspace 0 get + /Pattern eq + {false charpath f} + {AGMP_current_show}ifelse + }put }if - currentdict /pstr undef -} if + currentdict/pstr undef +}if /consumeimagedata { begin - currentdict /MultipleDataSources known not - {/MultipleDataSources false def} if + AGMIMG_init_common + currentdict/MultipleDataSources known not + {/MultipleDataSources false def}if MultipleDataSources { - 1 dict begin - /flushbuffer Width cvi string def - 1 1 Height cvi + DataSource 0 get type + dup/filetype eq { - pop - 0 1 DataSource length 1 sub + 1 dict begin + /flushbuffer Width cvi string def + 1 1 Height cvi { - DataSource exch get - dup type dup - /filetype eq - { - exch flushbuffer readstring pop pop - }if - /arraytype eq + pop + 0 1 DataSource length 1 sub { - exec pop - }if + DataSource exch get + flushbuffer readstring pop pop + }for }for - }for - end + end + }if + dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and + { + Width Height mul cvi + { + 0 1 DataSource length 1 sub + {dup DataSource exch gx length exch 0 ne{pop}if}for + dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if } { - /DataSource load type dup - /filetype eq + /DataSource load type + dup/filetype eq { 1 dict begin - /flushbuffer Width Decode length 2 div mul cvi string def - 1 1 Height { pop DataSource flushbuffer readstring pop pop} for + /flushbuffer Width Decode length 2 idiv mul cvi string def + 1 1 Height{pop DataSource flushbuffer readstring pop pop}for end }if - /arraytype eq + dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and { - 1 1 Height { pop DataSource pop } for + Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul + { + DataSource length dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop }if }ifelse end }bdf /addprocs { - 2{/exec load}repeat - 3 1 roll - [ 5 1 roll ] bind cvx + 2{/exec load}repeat + 3 1 roll + [5 1 roll]bind cvx }def /modify_halftone_xfer { @@ -666,16 +493,16 @@ statusdict /product known userdict /AGMP_current_show known not and{ }{ currenttransfer }ifelse - addprocs /TransferFunction xdf + addprocs/TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ - /TransferFunction load + /TransferFunction load }{ currenttransfer }ifelse - addprocs /TransferFunction xdf + addprocs/TransferFunction xdf currentdict end sethalftone pop }ifelse @@ -684,122 +511,141 @@ statusdict /product known userdict /AGMP_current_show known not and{ { dup xcheck exch dup length array exch - Adobe_AGM_Core/AGMCORE_tmp -1 ddf + Adobe_AGM_Core/AGMCORE_tmp -1 ddf { - Adobe_AGM_Core/AGMCORE_tmp AGMCORE_tmp 1 add ddf - dup type /dicttype eq + Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf + dup type/dicttype eq { - AGMCORE_tmp + Adobe_AGM_Core/AGMCORE_tmp get exch clonedict - Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf - } if - dup type /arraytype eq + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + dup type/arraytype eq { - AGMCORE_tmp exch + Adobe_AGM_Core/AGMCORE_tmp get exch clonearray - Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf - } if + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if exch dup - AGMCORE_tmp 4 -1 roll put + Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall - exch {cvx} if + exch{cvx}if }bdf /clonedict { dup length dict begin - { - dup type /dicttype eq - { - clonedict - } if - dup type /arraytype eq - { - clonearray - } if + { + dup type/dicttype eq + {clonedict}if + dup type/arraytype eq + {clonearray}if def - }forall + }forall currentdict end }bdf /DeviceN_PS2 { - /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and -} bdf + /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and +}bdf /Indexed_DeviceN { - /indexed_colorspace_dict AGMCORE_gget dup null ne { - /CSD known + /indexed_colorspace_dict AGMCORE_gget dup null ne{ + dup/CSDBase known{ + /CSDBase get/CSD get_res/Names known + }{ + pop false + }ifelse }{ pop false - } ifelse -} bdf + }ifelse +}bdf /DeviceN_NoneName { - /Names where { + /Names where{ pop false Names { - (None) eq or - } forall + (None)eq or + }forall }{ false }ifelse -} bdf +}bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { - pop dup type dup /arraytype eq exch /packedarraytype eq or + pop dup type dup/arraytype eq exch/packedarraytype eq or { - dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and + dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false - } - { + }{ true }ifelse - } - { + }{ true - } ifelse - } - { + }ifelse + }{ true - } ifelse -} bdf + }ifelse +}bdf /base_colorspace_type { - dup type /arraytype eq {0 get} if -} bdf -/doc_setup{ + dup type/arraytype eq{0 get}if +}bdf +/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse +{ + /pdfmark_5{cleartomark}bind def +}{ + /pdfmark_5{pdfmark}bind def +}ifelse +/ReadBypdfmark_5 +{ + currentfile exch 0 exch/SubFileDecode filter + /currentdistillerparams where + {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse + {flushfile cleartomark} + {/PUT pdfmark}ifelse +}bdf +/xpdfm +{ + { + dup 0 get/Label eq + { + aload length[exch 1 add 1 roll/PAGELABEL + }{ + aload pop + [{ThisPage}<<5 -2 roll>>/PUT + }ifelse + pdfmark_5 + }forall +}bdf +/ds{ Adobe_AGM_Utils begin }bdf -/doc_trailer{ +/dt{ currentdict Adobe_AGM_Utils eq{ end }if }bdf -systemdict /setpacking known -{ - setpacking -} if +systemdict/setpacking known +{setpacking}if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 -%%Copyright: Copyright (C) 1997-2003 Adobe Systems, Inc. All Rights Reserved. -systemdict /setpacking known +%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known { currentpacking true setpacking -} if -userdict /Adobe_AGM_Core 216 dict dup begin put -/nd{ - null def -}bind def -/Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def +}if +userdict/Adobe_AGM_Core 209 dict dup begin put +/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd @@ -808,7 +654,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def -/AGMCORE_screen [currentscreen] cvx def +/AGMCORE_screen[currentscreen]cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd @@ -829,9 +675,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd -/AGMCORE_CSA_cache 0 dict def /AGMCORE_CSD_cache 0 dict def -/AGMCORE_pattern_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd @@ -839,7 +683,6 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd -/AGMCORE_ovp nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd @@ -848,16 +691,17 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd +/AGMCORE_Default_flatness nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd -/AGMCORE_gradientcache 32 dict def -/AGMCORE_in_pattern false def +/AGMCORE_pattern_paint_type 0 def /knockout_unitsq nd -/AGMCORE_CRD_cache where{ - pop -}{ - /AGMCORE_CRD_cache 0 dict def -}ifelse +currentglobal true setglobal +[/CSA/Gradient/Procedure] +{ + /Generic/Category findresource dup length dict copy/Category defineresource pop +}forall +setglobal /AGMCORE_key_known { where{ @@ -874,7 +718,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /readbuffer 256 string def mark { - currentfile readbuffer {readline} stopped + currentfile readbuffer{readline}stopped {cleartomark mark} { not @@ -892,11 +736,11 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /getspotfunction { AGMCORE_screen exch pop exch pop - dup type /dicttype eq{ - dup /HalftoneType get 1 eq{ + dup type/dicttype eq{ + dup/HalftoneType get 1 eq{ /SpotFunction get }{ - dup /HalftoneType get 2 eq{ + dup/HalftoneType get 2 eq{ /GraySpotFunction get }{ pop @@ -910,72 +754,61 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }ifelse }ifelse }if -} def +}def +/np +{newpath}bdf /clp_npth -{ - clip newpath -} def +{clip np}def /eoclp_npth -{ - eoclip newpath -} def +{eoclip np}def /npth_clp -{ - newpath clip -} def -/add_grad -{ - AGMCORE_gradientcache 3 1 roll put -}bdf -/exec_grad -{ - AGMCORE_gradientcache exch get exec -}bdf +{np clip}def /graphic_setup { - /AGMCORE_graphicsave save def + /AGMCORE_graphicsave save store concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth - [] 0 setdash + []0 setdash 10 setmiterlimit - newpath + np false setoverprint false setstrokeadjust - Adobe_AGM_Core/spot_alias get exec - /Adobe_AGM_Image where { + //Adobe_AGM_Core/spot_alias gx + /Adobe_AGM_Image where{ pop Adobe_AGM_Image/spot_alias 2 copy known{ - get exec + gx }{ pop pop }ifelse - } if + }if + /sep_colorspace_dict null AGMCORE_gput 100 dict begin /dictstackcount countdictstack def - /showpage {} def + /showpage{}def mark -} def +}def /graphic_cleanup { cleartomark - dictstackcount 1 countdictstack 1 sub {end}for + dictstackcount 1 countdictstack 1 sub{end}for end AGMCORE_graphicsave restore -} def +}def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def - clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto + clippath pathbbox np pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray - gsave 1 AGMCORE_&setgray fill grestore + gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def @@ -990,44 +823,66 @@ userdict /Adobe_AGM_Core 216 dict dup begin put { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto - } if - AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show + }if + AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def - } - { + }{ AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def - } ifelse - } forall -} bdf -/doc_setup{ + }ifelse + }forall +}bdf +/AGMCORE_CMYKDeviceNColorspaces[ + [/Separation/None/DeviceCMYK{0 0 0}] + [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind] + [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind] + [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind] + [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind] + [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind] + [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind] + [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind] + [/Separation(Cyan)/DeviceCMYK{0 0 0}] + [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind] + [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind] + [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind] + [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}] + [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind] + [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}] + [/DeviceCMYK] +]def +/ds{ Adobe_AGM_Core begin + /currentdistillerparams where + { + pop currentdistillerparams/CoreDistVersion get 5000 lt + {<>setdistillerparams}if + }if /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf - errordict /AGM_handleerror known not{ - errordict /AGM_handleerror errordict /handleerror get put - errordict /handleerror { + errordict/AGM_handleerror known not{ + errordict/AGM_handleerror errordict/handleerror get put + errordict/handleerror{ Adobe_AGM_Core begin - $error /newerror get AGMCORE_cur_err null ne and{ - $error /newerror false put + $error/newerror get AGMCORE_cur_err null ne and{ + $error/newerror false put AGMCORE_cur_err compose_error_msg }if - $error /newerror true put + $error/newerror true put end - errordict /AGM_handleerror get exec - } bind put + errordict/AGM_handleerror get exec + }bind put }if - /AGMCORE_environ_ok + /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge - ps_version AGMCORE_ps_version ge and + ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not - {/AGMCORE_cur_err /AGMCORE_bad_environ def} if + {/AGMCORE_cur_err/AGMCORE_bad_environ def}if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def @@ -1035,132 +890,124 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def + /AGMCORE_Default_flatness currentflat def /AGMCORE_distilling /product where{ - pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and + pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and }{ false }ifelse def - level2 not{ - /xput{ - dup load dup length exch maxlength eq{ - dup dup load dup - length dup 0 eq {pop 1} if 2 mul dict copy def - }if - load begin - def - end - }def - }{ - /xput{ - load 3 1 roll put - }def - }ifelse /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def - /AGMCORE_gstackframekeys 10 def - /AGMCORE_&gsave /gsave ldf - /AGMCORE_&grestore /grestore ldf - /AGMCORE_&grestoreall /grestoreall ldf - /AGMCORE_&save /save ldf - /AGMCORE_gdictcopy { + /AGMCORE_gstackframekeys 14 def + /AGMCORE_&gsave/gsave ldf + /AGMCORE_&grestore/grestore ldf + /AGMCORE_&grestoreall/grestoreall ldf + /AGMCORE_&save/save ldf + /AGMCORE_&setoverprint/setoverprint ldf + /AGMCORE_gdictcopy{ begin - { def } forall + {def}forall end }def - /AGMCORE_gput { + /AGMCORE_gput{ AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def - /AGMCORE_gget { + /AGMCORE_gget{ AGMCORE_gstack AGMCORE_gstackptr get exch get }def - /gsave { + /gsave{ AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add - dup 32 ge {limitcheck} if - Adobe_AGM_Core exch - /AGMCORE_gstackptr xpt + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def - /grestore { + /grestore{ AGMCORE_&grestore AGMCORE_gstackptr 1 sub - dup AGMCORE_gstacksaveptr lt {1 add} if - Adobe_AGM_Core exch - /AGMCORE_gstackptr xpt + dup AGMCORE_gstacksaveptr lt{1 add}if + dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known + {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse + /AGMCORE_gstackptr exch store }def - /grestoreall { + /grestoreall{ AGMCORE_&grestoreall - Adobe_AGM_Core - /AGMCORE_gstackptr AGMCORE_gstacksaveptr put + /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def - /save { + /save{ AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add - dup 32 ge {limitcheck} if - Adobe_AGM_Core begin - /AGMCORE_gstackptr exch def - /AGMCORE_gstacksaveptr AGMCORE_gstackptr def - end + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def - 0 1 AGMCORE_gstack length 1 sub { + /setoverprint{ + dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint + }def + 0 1 AGMCORE_gstack length 1 sub{ AGMCORE_gstack exch AGMCORE_gstackframekeys dict put - } for + }for }if - level3 /AGMCORE_&sysshfill AGMCORE_key_known not and + level3/AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def - /AGMCORE_&usrshfill /shfill load def /AGMCORE_&sysmakepattern systemdict/makepattern get def - /AGMCORE_&usrmakepattern /makepattern load def + /AGMCORE_&usrmakepattern/makepattern load def }if - /currentcmykcolor [0 0 0 0] AGMCORE_gput + /currentcmykcolor[0 0 0 0]AGMCORE_gput /currentstrokeadjust false AGMCORE_gput - /currentcolorspace [/DeviceGray] AGMCORE_gput + /currentcolorspace[/DeviceGray]AGMCORE_gput /sep_tint 0 AGMCORE_gput - /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput + /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput - /currentcolor_intent () AGMCORE_gput + /currentcolor_intent()AGMCORE_gput /customcolor_tint 1 AGMCORE_gput + /absolute_colorimetric_crd null AGMCORE_gput + /relative_colorimetric_crd null AGMCORE_gput + /saturation_crd null AGMCORE_gput + /perceptual_crd null AGMCORE_gput + currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf + cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf << - /MaxPatternItem currentsystemparams /MaxPatternCache get + /MaxPatternItem currentsystemparams/MaxPatternCache get >> setuserparams end }def -/page_setup +/ps { /setcmykcolor where{ pop - Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put + Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { - 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput + 4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll - 3 { - 3 index add neg dup 0 lt { + 3{ + 3 index add neg dup 0 lt{ pop 0 - } if + }if 3 1 roll - } repeat + }repeat setrgbcolor pop }ndf /currentcmykcolor @@ -1168,19 +1015,14 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint - { - pop - }ndf + {pop}ndf /currentoverprint - { - false - }ndf - /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def + {false}ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def - /AGMCORE_plate_ndx + /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ @@ -1204,9 +1046,9 @@ userdict /Adobe_AGM_Core 216 dict dup begin put { AGMCORE_have_reported_unsupported_color_space false eq { - (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == - Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf - } if + (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)== + Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf + }if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def @@ -1214,7 +1056,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ - AGMCORE_distilling + AGMCORE_distilling { false }{ @@ -1236,7 +1078,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def - /AGM_preserve_spots + /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ @@ -1252,7 +1094,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get - /LeaveColorUnchanged eq + /sRGB ne }{ true }ifelse @@ -1263,13 +1105,14 @@ userdict /Adobe_AGM_Core 216 dict dup begin put false }ifelse }def - /convert_spot_to_process where {pop}{ + /convert_spot_to_process where{pop}{ /convert_spot_to_process { - dup map_alias { + //Adobe_AGM_Core begin + dup map_alias{ /Name get exch pop - } if - dup dup (None) eq exch (All) eq or + }if + dup dup(None)eq exch(All)eq or { pop false }{ @@ -1285,8 +1128,10 @@ userdict /Adobe_AGM_Core 216 dict dup begin put pop false }{ false setoverprint - 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor - currentgray 0 eq + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne }ifelse grestore }{ @@ -1294,30 +1139,30 @@ userdict /Adobe_AGM_Core 216 dict dup begin put { pop AGM_is_distiller_preserving_spotimages not }{ - Adobe_AGM_Core/AGMCORE_name xddf + //Adobe_AGM_Core/AGMCORE_name xddf false - Adobe_AGM_Core/AGMCORE_in_pattern known {Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse - not currentpagedevice/OverrideSeparations known and + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq + AGMUTIL_cpd/OverrideSeparations known and + { + AGMUTIL_cpd/OverrideSeparations get { - currentpagedevice/OverrideSeparations get + /HqnSpots/ProcSet resourcestatus { - /HqnSpots /ProcSet resourcestatus - { pop pop pop true - }if }if - }if - { - AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not - }{ + }if + }if + { + AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not + }{ gsave - [/Separation AGMCORE_name /DeviceGray {}]setcolorspace + [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace false - currentpagedevice/SeparationColorNames 2 copy known + AGMUTIL_cpd/SeparationColorNames 2 copy known { get - { AGMCORE_name eq or}forall - not + {AGMCORE_name eq or}forall + not }{ pop pop pop true }ifelse @@ -1326,9 +1171,10 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }ifelse }ifelse }ifelse + end }def }ifelse - /convert_to_process where {pop}{ + /convert_to_process where{pop}{ /convert_to_process { dup length 0 eq @@ -1339,10 +1185,10 @@ userdict /Adobe_AGM_Core 216 dict dup begin put { dup true exch { - dup (Cyan) eq exch - dup (Magenta) eq 3 -1 roll or exch - dup (Yellow) eq 3 -1 roll or exch - dup (Black) eq 3 -1 roll or + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } @@ -1350,31 +1196,38 @@ userdict /Adobe_AGM_Core 216 dict dup begin put { true exch { - dup (Cyan) eq exch - dup (Magenta) eq 3 -1 roll or exch - dup (Yellow) eq 3 -1 roll or exch - (Black) eq or and + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + (Black)eq or and }forall not }{pop false}ifelse }{ false exch { - dup (Cyan) eq exch - dup (Magenta) eq 3 -1 roll or exch - dup (Yellow) eq 3 -1 roll or exch - dup (Black) eq 3 -1 roll or - {pop} - {convert_spot_to_process or}ifelse + /PhotoshopDuotoneList where{pop false}{true}ifelse + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process or}ifelse + } + { + convert_spot_to_process or + } + ifelse } forall }ifelse }ifelse }def }ifelse - /AGMCORE_avoid_L2_sep_space - version cvr 2012 lt - level2 and + /AGMCORE_avoid_L2_sep_space + version cvr 2012 lt + level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep @@ -1383,8 +1236,8 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ - AGM_preserve_spots - userdict/Adobe_AGM_OnHost_Seps known + AGM_preserve_spots + userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse @@ -1400,38 +1253,42 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }if ]cvx def }if + /AGMCORE_IsSeparationAProcessColor + { + dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or + }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ - AGMCORE_magenta_plate{ - 4 3 roll pop pop pop - }{ - AGMCORE_yellow_plate{ - 4 2 roll pop pop pop - }{ - 4 1 roll pop pop pop - }ifelse - }ifelse + AGMCORE_magenta_plate{ + 4 3 roll pop pop pop + }{ + AGMCORE_yellow_plate{ + 4 2 roll pop pop pop + }{ + 4 1 roll pop pop pop + }ifelse + }ifelse }ifelse - settransfer + settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ - AGMCORE_magenta_plate{ - {4 3 roll pop pop pop} - }{ - AGMCORE_yellow_plate{ - {4 2 roll pop pop pop} - }{ - {4 1 roll pop pop pop} - }ifelse - }ifelse + AGMCORE_magenta_plate{ + {4 3 roll pop pop pop} + }{ + AGMCORE_yellow_plate{ + {4 2 roll pop pop pop} + }{ + {4 1 roll pop pop pop} + }ifelse + }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames @@ -1439,38 +1296,50 @@ userdict /Adobe_AGM_Core 216 dict dup begin put 1 dict begin /filtername { - dup /Cyan eq 1 index (Cyan) eq or - {pop (_cyan_)}if - dup /Magenta eq 1 index (Magenta) eq or - {pop (_magenta_)}if - dup /Yellow eq 1 index (Yellow) eq or - {pop (_yellow_)}if - dup /Black eq 1 index (Black) eq or - {pop (_black_)}if + dup/Cyan eq 1 index(Cyan)eq or + {pop(_cyan_)}if + dup/Magenta eq 1 index(Magenta)eq or + {pop(_magenta_)}if + dup/Yellow eq 1 index(Yellow)eq or + {pop(_yellow_)}if + dup/Black eq 1 index(Black)eq or + {pop(_black_)}if }def - dup type /arraytype eq - {[exch {filtername}forall]} + dup type/arraytype eq + {[exch{filtername}forall]} {filtername}ifelse end }def - /AGMCORE_IsSeparationAProcessColor - { - dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or - }def - level3 { + level3{ /AGMCORE_IsCurrentColor { - gsave - false setoverprint - 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor - currentgray 0 eq - grestore + dup AGMCORE_IsSeparationAProcessColor + { + AGMCORE_plate_ndx 0 eq + {dup(Cyan)eq exch/Cyan eq or}if + AGMCORE_plate_ndx 1 eq + {dup(Magenta)eq exch/Magenta eq or}if + AGMCORE_plate_ndx 2 eq + {dup(Yellow)eq exch/Yellow eq or}if + AGMCORE_plate_ndx 3 eq + {dup(Black)eq exch/Black eq or}if + AGMCORE_plate_ndx 4 eq + {pop false}if + }{ + gsave + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + grestore + }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf - data_in type /stringtype eq + data_in type/stringtype eq { /ncomp xdf /comp xdf @@ -1481,14 +1350,14 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }for string_out }{ - string /string_in xdf + string/string_in xdf /string_out 1 string def /component xdf [ - data_in string_in /readstring cvx - [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx - [/pop cvx ()]cvx /ifelse cvx - ]cvx /ReusableStreamDecode filter + data_in string_in/readstring cvx + [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx + [/pop cvx()]cvx/ifelse cvx + ]cvx/ReusableStreamDecode filter }ifelse end }def @@ -1497,56 +1366,60 @@ userdict /Adobe_AGM_Core 216 dict dup begin put 2 dict begin /paint? xdf /channel xdf + dup type/dicttype eq + { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def - currentdict /Decode known + currentdict/Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not - {/Decode [1 1]def}if + {/Decode[1 1]def}if }if FunctionType 2 eq { paint? { - /C0 [C0 channel get 1 exch sub] def - /C1 [C1 channel get 1 exch sub] def + /C0[C0 channel get 1 exch sub]def + /C1[C1 channel get 1 exch sub]def }{ - /C0 [1] def - /C1 [1] def + /C0[1]def + /C1[1]def }ifelse }if FunctionType 3 eq { - /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def + /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def }if - currentdict /Range known - {/Range [0 1] def}if + currentdict/Range known + {/Range[0 1]def}if currentdict - end + end}{ + channel get 0 paint? AGMCORE_separateShadingFunction + }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin - currentdict /Function known + currentdict/Function known { - currentdict /Background known + currentdict/Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if - Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf - /ColorSpace [/DeviceGray] def + Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf + /ColorSpace[/DeviceGray]def }{ - ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq + ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq { - /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse - ColorSpace 0 get /Separation eq + ColorSpace 0 get/Separation eq { { - [1 /exch cvx /sub cvx]cvx + [1/exch cvx/sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse @@ -1554,24 +1427,24 @@ userdict /Adobe_AGM_Core 216 dict dup begin put pop }{ { - [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx + [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx }{ - pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx + pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse - ColorSpace 2 /DeviceGray put + ColorSpace 2/DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { - dup /ColorSpace get - dup type /arraytype ne + dup/ColorSpace get + dup type/arraytype ne {[exch]}if - dup 0 get /DeviceCMYK eq + dup 0 get/DeviceCMYK eq { - exch begin + exch begin currentdict AGMCORE_cyan_plate {0 true}if @@ -1589,14 +1462,14 @@ userdict /Adobe_AGM_Core 216 dict dup begin put currentdict end exch }if - dup 0 get /Separation eq + dup 0 get/Separation eq { exch begin - ColorSpace 1 get dup /None ne exch /All ne and + ColorSpace 1 get dup/None ne exch/All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { - ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq { /ColorSpace [ @@ -1604,11 +1477,11 @@ userdict /Adobe_AGM_Core 216 dict dup begin put ColorSpace 1 get /DeviceGray [ - ColorSpace 3 get /exec cvx - 4 AGMCORE_plate_ndx sub -1 /roll cvx - 4 1 /roll cvx - 3 [/pop cvx]cvx /repeat cvx - 1 /exch cvx /sub cvx + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx ]cvx ]def }{ @@ -1620,7 +1493,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor - 0 exch + 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading @@ -1629,12 +1502,12 @@ userdict /Adobe_AGM_Core 216 dict dup begin put currentdict end exch }if - dup 0 get /DeviceN eq + dup 0 get/DeviceN eq { exch begin ColorSpace 1 get convert_to_process { - ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq { /ColorSpace [ @@ -1642,11 +1515,11 @@ userdict /Adobe_AGM_Core 216 dict dup begin put ColorSpace 1 get /DeviceGray [ - ColorSpace 3 get /exec cvx - 4 AGMCORE_plate_ndx sub -1 /roll cvx - 4 1 /roll cvx - 3 [/pop cvx]cvx /repeat cvx - 1 /exch cvx /sub cvx + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx ]cvx ]def }{ @@ -1654,7 +1527,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading - /ColorSpace [/DeviceGray] def + /ColorSpace[/DeviceGray]def }if }ifelse }{ @@ -1668,7 +1541,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }if 1 add }forall - exch + exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading @@ -1676,27 +1549,27 @@ userdict /Adobe_AGM_Core 216 dict dup begin put currentdict end exch }if - dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not + dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not { exch begin - ColorSpace dup type /arraytype eq + ColorSpace dup type/arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { - ColorSpace 0 get /CIEBasedA eq + ColorSpace 0 get/CIEBasedA eq { - /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def + /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def }if - ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or + ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or { - /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def + /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def }if - ColorSpace 0 get /CIEBasedDEFG eq + ColorSpace 0 get/CIEBasedDEFG eq { - /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def }if currentdict 0 false AGMCORE_separateShading }if @@ -1705,30 +1578,31 @@ userdict /Adobe_AGM_Core 216 dict dup begin put end exch }if pop - dup /AGMCORE_ignoreshade known + dup/AGMCORE_ignoreshade known { begin - /ColorSpace [/Separation (None) /DeviceGray {}] def + /ColorSpace[/Separation(None)/DeviceGray{}]def currentdict end }if }def /shfill { - clonedict - AGMCORE_separateShadingDict - dup /AGMCORE_ignoreshade known + AGMCORE_separateShadingDict + dup/AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch - dup /PatternType get 2 eq + dup/PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def - currentdict end + Shading/AGMCORE_ignoreshade known + currentdict end exch + {pop<>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern @@ -1741,15 +1615,15 @@ userdict /Adobe_AGM_Core 216 dict dup begin put { exch aload pop dup 7 1 roll inRip_spot_has_ink not { - 4 {4 index mul 4 1 roll} + 4{4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ - Adobe_AGM_Core begin - /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf + //Adobe_AGM_Core begin + /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf end - [/Separation 4 -1 roll /DeviceCMYK + [/Separation 4 -1 roll/DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace @@ -1758,7 +1632,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }ndf /setseparationgray { - [/Separation (All) /DeviceGray {}] setcolorspace_opt + [/Separation(All)/DeviceGray{}]setcolorspace_opt 1 exch sub setcolor }ndf }{ @@ -1774,7 +1648,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /setcustomcolor { exch aload pop pop - 4 {4 index mul 4 1 roll} repeat + 4{4 index mul 4 1 roll}repeat setcmykcolor pop }ndf /has_color @@ -1790,16 +1664,16 @@ userdict /Adobe_AGM_Core 216 dict dup begin put def /map_index { - 1 index mul exch getinterval {255 div} forall - } bdf + 1 index mul exch getinterval{255 div}forall + }bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index - } bdf + }bdf /n_color_components { base_colorspace_type - dup /DeviceGray eq{ + dup/DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ @@ -1810,83 +1684,73 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }ifelse }bdf level2{ - /mo /moveto ldf - /li /lineto ldf - /cv /curveto ldf + /mo/moveto ldf + /li/lineto ldf + /cv/curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def - /level2ScreenFreq{ - begin - 60 - HalftoneType 1 eq{ - pop Frequency - }if - HalftoneType 2 eq{ - pop GrayFrequency - }if - HalftoneType 5 eq{ - pop Default level2ScreenFreq - }if - end - }def - /currentScreenFreq{ - currenthalftone level2ScreenFreq - }def - level2 /setcolorspace AGMCORE_key_known not and{ - /AGMCORE_&&&setcolorspace /setcolorspace ldf + level2/setcolorspace AGMCORE_key_known not and{ + /AGMCORE_&&&setcolorspace/setcolorspace ldf /AGMCORE_ReplaceMappedColor { - dup type dup /arraytype eq exch /packedarraytype eq or + dup type dup/arraytype eq exch/packedarraytype eq or { - dup 0 get dup /Separation eq - { - pop - dup length array copy - dup dup 1 get - current_spot_alias + /AGMCORE_SpotAliasAry2 where{ + begin + dup 0 get dup/Separation eq { - dup map_alias + pop + dup length array copy + dup dup 1 get + current_spot_alias { - begin - /sep_colorspace_dict currentdict AGMCORE_gput - pop pop pop - [ - /Separation Name - CSA map_csa - dup /MappedCSA xdf - /sep_colorspace_proc load - ] - dup Name - end + dup map_alias + { + false set_spot_alias + dup 1 exch setsepcolorspace + true set_spot_alias + begin + /sep_colorspace_dict currentdict AGMCORE_gput + pop pop pop + [ + /Separation Name + CSA map_csa + MappedCSA + /sep_colorspace_proc load + ] + dup Name + end + }if }if - }if - map_reserved_ink_name 1 xpt - }{ - /DeviceN eq - { - dup length array copy - dup dup 1 get [ - exch { - current_spot_alias{ - dup map_alias{ - /Name get exch pop + map_reserved_ink_name 1 xpt + }{ + /DeviceN eq + { + dup length array copy + dup dup 1 get[ + exch{ + current_spot_alias{ + dup map_alias{ + /Name get exch pop + }if }if - }if - map_reserved_ink_name - } forall - ] 1 xpt - }if - }ifelse + map_reserved_ink_name + }forall + ]1 xpt + }if + }ifelse + end + }if }if }def /setcolorspace { - dup type dup /arraytype eq exch /packedarraytype eq or + dup type dup/arraytype eq exch/packedarraytype eq or { - dup 0 get /Indexed eq + dup 0 get/Indexed eq { AGMCORE_distilling { @@ -1908,7 +1772,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put AGMCORE_ReplaceMappedColor }ifelse }if - DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if + DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if }def }if }{ @@ -1935,7 +1799,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /knockout_unitsq { 1 setgray - 8 8 1 [8 0 0 8 0 0] {} image + 8 8 1[8 0 0 8 0 0]{}image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget @@ -1943,21 +1807,18 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def - /currentScreenFreq{ - currentscreen pop pop - }def /setcolorspace { /currentcolorspace exch AGMCORE_gput - } def + }def /currentcolorspace { /currentcolorspace AGMCORE_gget - } def + }def /setcolor_devicecolor { base_colorspace_type - dup /DeviceGray eq{ + dup/DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ @@ -1970,17 +1831,17 @@ userdict /Adobe_AGM_Core 216 dict dup begin put /setcolor { currentcolorspace 0 get - dup /DeviceGray ne{ - dup /DeviceCMYK ne{ - dup /DeviceRGB ne{ - dup /Separation eq{ + dup/DeviceGray ne{ + dup/DeviceCMYK ne{ + dup/DeviceRGB ne{ + dup/Separation eq{ pop - currentcolorspace 3 get exec + currentcolorspace 3 gx currentcolorspace 2 get }{ - dup /Indexed eq{ + dup/Indexed eq{ pop - currentcolorspace 3 get dup type /stringtype eq{ + currentcolorspace 3 get dup type/stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ @@ -1988,7 +1849,7 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }ifelse currentcolorspace 1 get }{ - /AGMCORE_cur_err /AGMCORE_invalid_color_space def + /AGMCORE_cur_err/AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse @@ -1996,457 +1857,493 @@ userdict /Adobe_AGM_Core 216 dict dup begin put }if }if setcolor_devicecolor - } def + }def + }ifelse + /sop/setoverprint ldf + /lw/setlinewidth ldf + /lc/setlinecap ldf + /lj/setlinejoin ldf + /ml/setmiterlimit ldf + /dsh/setdash ldf + /sadj/setstrokeadjust ldf + /gry/setgray ldf + /rgb/setrgbcolor ldf + /cmyk[ + /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx + /setcmykcolor load dup type/operatortype ne{/exec cvx}if + ]cvx bdf + level3 AGMCORE_host_sep not and{ + /nzopmsc{ + 6 dict begin + /kk exch def + /yy exch def + /mm exch def + /cc exch def + /sum 0 def + cc 0 ne{/sum sum 2#1000 or def cc}if + mm 0 ne{/sum sum 2#0100 or def mm}if + yy 0 ne{/sum sum 2#0010 or def yy}if + kk 0 ne{/sum sum 2#0001 or def kk}if + AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace + sum 0 eq{0}if + end + setcolor + }bdf + }{ + /nzopmsc/cmyk ldf }ifelse - /sop /setoverprint ldf - /lw /setlinewidth ldf - /lc /setlinecap ldf - /lj /setlinejoin ldf - /ml /setmiterlimit ldf - /dsh /setdash ldf - /sadj /setstrokeadjust ldf - /gry /setgray ldf - /rgb /setrgbcolor ldf - /cmyk /setcmykcolor ldf - /sep /setsepcolor ldf - /devn /setdevicencolor ldf - /idx /setindexedcolor ldf - /colr /setcolor ldf - /csacrd /set_csa_crd ldf - /sepcs /setsepcolorspace ldf - /devncs /setdevicencolorspace ldf - /idxcs /setindexedcolorspace ldf - /cp /closepath ldf - /clp /clp_npth ldf - /eclp /eoclp_npth ldf - /f /fill ldf - /ef /eofill ldf - /@ /stroke ldf - /nclp /npth_clp ldf - /gset /graphic_setup ldf - /gcln /graphic_cleanup ldf + /sep/setsepcolor ldf + /devn/setdevicencolor ldf + /idx/setindexedcolor ldf + /colr/setcolor ldf + /csacrd/set_csa_crd ldf + /sepcs/setsepcolorspace ldf + /devncs/setdevicencolorspace ldf + /idxcs/setindexedcolorspace ldf + /cp/closepath ldf + /clp/clp_npth ldf + /eclp/eoclp_npth ldf + /f/fill ldf + /ef/eofill ldf + /@/stroke ldf + /nclp/npth_clp ldf + /gset/graphic_setup ldf + /gcln/graphic_cleanup ldf + /ct/concat ldf + /cf/currentfile ldf + /fl/filter ldf + /rs/readstring ldf + /AGMCORE_def_ht currenthalftone def + /clonedict Adobe_AGM_Utils begin/clonedict load end def + /clonearray Adobe_AGM_Utils begin/clonearray load end def currentdict{ - dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ bind }if def }forall - /currentpagedevice currentpagedevice def -/getrampcolor { -/indx exch def -0 1 NumComp 1 sub { -dup -Samples exch get -dup type /stringtype eq { indx get } if -exch -Scaling exch get aload pop -3 1 roll -mul add -} for -ColorSpaceFamily /Separation eq + /getrampcolor { - sep - } + /indx exch def + 0 1 NumComp 1 sub + { + dup + Samples exch get + dup type/stringtype eq{indx get}if + exch + Scaling exch get aload pop + 3 1 roll + mul add + }for + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /sssetbackground{ + aload pop + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /RadialShade { - ColorSpaceFamily /DeviceN eq + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /r2 xdf + /c2y xdf + /c2x xdf + /r1 xdf + /c1y xdf + /c1x xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt { - devn - } + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + c1x c2x eq { - setcolor + c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if + c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if }ifelse - }ifelse -} bind def -/sssetbackground { aload pop setcolor } bind def -/RadialShade { -40 dict begin -/ColorSpaceFamily exch def -/background exch def -/ext1 exch def -/ext0 exch def -/BBox exch def -/r2 exch def -/c2y exch def -/c2x exch def -/r1 exch def -/c1y exch def -/c1x exch def -/rampdict exch def -/setinkoverprint where {pop /setinkoverprint{pop}def}if -gsave -BBox length 0 gt { -newpath -BBox 0 get BBox 1 get moveto -BBox 2 get BBox 0 get sub 0 rlineto -0 BBox 3 get BBox 1 get sub rlineto -BBox 2 get BBox 0 get sub neg 0 rlineto -closepath -clip -newpath -} if -c1x c2x eq -{ -c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse -} -{ -/slope c2y c1y sub c2x c1x sub div def -/theta slope 1 atan def -c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if -c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if -} -ifelse -gsave -clippath -c1x c1y translate -theta rotate --90 rotate -{ pathbbox } stopped -{ 0 0 0 0 } if -/yMax exch def -/xMax exch def -/yMin exch def -/xMin exch def -grestore -xMax xMin eq yMax yMin eq or -{ -grestore -end -} -{ -/max { 2 copy gt { pop } {exch pop} ifelse } bind def -/min { 2 copy lt { pop } {exch pop} ifelse } bind def -rampdict begin -40 dict begin -background length 0 gt { background sssetbackground gsave clippath fill grestore } if -gsave -c1x c1y translate -theta rotate --90 rotate -/c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def -/c1y 0 def -/c1x 0 def -/c2x 0 def -ext0 { -0 getrampcolor -c2y r2 add r1 sub 0.0001 lt -{ -c1x c1y r1 360 0 arcn -pathbbox -/aymax exch def -/axmax exch def -/aymin exch def -/axmin exch def -/bxMin xMin axmin min def -/byMin yMin aymin min def -/bxMax xMax axmax max def -/byMax yMax aymax max def -bxMin byMin moveto -bxMax byMin lineto -bxMax byMax lineto -bxMin byMax lineto -bxMin byMin lineto -eofill -} -{ -c2y r1 add r2 le -{ -c1x c1y r1 0 360 arc -fill -} -{ -c2x c2y r2 0 360 arc fill -r1 r2 eq -{ -/p1x r1 neg def -/p1y c1y def -/p2x r1 def -/p2y c1y def -p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto -fill -} -{ -/AA r2 r1 sub c2y div def -/theta AA 1 AA dup mul sub sqrt div 1 atan def -/SS1 90 theta add dup sin exch cos div def -/p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def -/p1y p1x SS1 div neg def -/SS2 90 theta sub dup sin exch cos div def -/p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def -/p2y p2x SS2 div neg def -r1 r2 gt -{ -/L1maxX p1x yMin p1y sub SS1 div add def -/L2maxX p2x yMin p2y sub SS2 div add def -} -{ -/L1maxX 0 def -/L2maxX 0 def -}ifelse -p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto -L1maxX L1maxX p1x sub SS1 mul p1y add lineto -fill -} -ifelse -} -ifelse -} ifelse -} if -c1x c2x sub dup mul -c1y c2y sub dup mul -add 0.5 exp -0 dtransform -dup mul exch dup mul add 0.5 exp 72 div -0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt -72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt -1 index 1 index lt { exch } if pop -/hires exch def -hires mul -/numpix exch def -/numsteps NumSamples def -/rampIndxInc 1 def -/subsampling false def -numpix 0 ne -{ -NumSamples numpix div 0.5 gt -{ -/numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def -/rampIndxInc NumSamples 1 sub numsteps div def -/subsampling true def -} if -} if -/xInc c2x c1x sub numsteps div def -/yInc c2y c1y sub numsteps div def -/rInc r2 r1 sub numsteps div def -/cx c1x def -/cy c1y def -/radius r1 def -newpath -xInc 0 eq yInc 0 eq rInc 0 eq and and -{ -0 getrampcolor -cx cy radius 0 360 arc -stroke -NumSamples 1 sub getrampcolor -cx cy radius 72 hires div add 0 360 arc -0 setlinewidth -stroke -} -{ -0 -numsteps -{ -dup -subsampling { round cvi } if -getrampcolor -cx cy radius 0 360 arc -/cx cx xInc add def -/cy cy yInc add def -/radius radius rInc add def -cx cy radius 360 0 arcn -eofill -rampIndxInc add -} -repeat -pop -} ifelse -ext1 { -c2y r2 add r1 lt -{ -c2x c2y r2 0 360 arc -fill -} -{ -c2y r1 add r2 sub 0.0001 le -{ -c2x c2y r2 360 0 arcn -pathbbox -/aymax exch def -/axmax exch def -/aymin exch def -/axmin exch def -/bxMin xMin axmin min def -/byMin yMin aymin min def -/bxMax xMax axmax max def -/byMax yMax aymax max def -bxMin byMin moveto -bxMax byMin lineto -bxMax byMax lineto -bxMin byMax lineto -bxMin byMin lineto -eofill -} -{ -c2x c2y r2 0 360 arc fill -r1 r2 eq -{ -/p1x r2 neg def -/p1y c2y def -/p2x r2 def -/p2y c2y def -p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto -fill -} -{ -/AA r2 r1 sub c2y div def -/theta AA 1 AA dup mul sub sqrt div 1 atan def -/SS1 90 theta add dup sin exch cos div def -/p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def -/p1y c2y p1x SS1 div sub def -/SS2 90 theta sub dup sin exch cos div def -/p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def -/p2y c2y p2x SS2 div sub def -r1 r2 lt -{ -/L1maxX p1x yMax p1y sub SS1 div add def -/L2maxX p2x yMax p2y sub SS2 div add def -} -{ -/L1maxX 0 def -/L2maxX 0 def -}ifelse -p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto -L1maxX L1maxX p1x sub SS1 mul p1y add lineto -fill -} -ifelse -} -ifelse -} ifelse -} if -grestore -grestore -end -end -end -} ifelse -} bind def -/GenStrips { -40 dict begin -/ColorSpaceFamily exch def -/background exch def -/ext1 exch def -/ext0 exch def -/BBox exch def -/y2 exch def -/x2 exch def -/y1 exch def -/x1 exch def -/rampdict exch def -/setinkoverprint where {pop /setinkoverprint{pop}def}if -gsave -BBox length 0 gt { -newpath -BBox 0 get BBox 1 get moveto -BBox 2 get BBox 0 get sub 0 rlineto -0 BBox 3 get BBox 1 get sub rlineto -BBox 2 get BBox 0 get sub neg 0 rlineto -closepath -clip -newpath -} if -x1 x2 eq -{ -y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse -} -{ -/slope y2 y1 sub x2 x1 sub div def -/theta slope 1 atan def -x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if -x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if -} -ifelse -gsave -clippath -x1 y1 translate -theta rotate -{ pathbbox } stopped -{ 0 0 0 0 } if -/yMax exch def -/xMax exch def -/yMin exch def -/xMin exch def -grestore -xMax xMin eq yMax yMin eq or -{ -grestore -end -} -{ -rampdict begin -20 dict begin -background length 0 gt { background sssetbackground gsave clippath fill grestore } if -gsave -x1 y1 translate -theta rotate -/xStart 0 def -/xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def -/ySpan yMax yMin sub def -/numsteps NumSamples def -/rampIndxInc 1 def -/subsampling false def -xStart 0 transform -xEnd 0 transform -3 -1 roll -sub dup mul -3 1 roll -sub dup mul -add 0.5 exp 72 div -0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt -72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt -1 index 1 index lt { exch } if pop -mul -/numpix exch def -numpix 0 ne -{ -NumSamples numpix div 0.5 gt -{ -/numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def -/rampIndxInc NumSamples 1 sub numsteps div def -/subsampling true def -} if -} if -ext0 { -0 getrampcolor -xMin xStart lt -{ xMin yMin xMin neg ySpan rectfill } if -} if -/xInc xEnd xStart sub numsteps div def -/x xStart def -0 -numsteps -{ -dup -subsampling { round cvi } if -getrampcolor -x yMin xInc ySpan rectfill -/x x xInc add def -rampIndxInc add -} -repeat -pop -ext1 { -xMax xEnd gt -{ xEnd yMin xMax xEnd sub ySpan rectfill } if -} if -grestore -grestore -end -end -end -} ifelse -} bind def + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax xdf + /xMax xdf + /yMin xdf + /xMin xdf + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + /max{2 copy gt{pop}{exch pop}ifelse}bdf + /min{2 copy lt{pop}{exch pop}ifelse}bdf + rampdict begin + 40 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 + { + 0 getrampcolor + c2y r2 add r1 sub 0.0001 lt + { + c1x c1y r1 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + /hires xdf + hires mul + /numpix xdf + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + np + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + }{ + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + }repeat + pop + }ifelse + ext1 + { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + }{ + c2y r1 add r2 sub 0.0001 le + { + c2x c2y r2 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + grestore + grestore + end + end + end + }ifelse + }bdf + /GenStrips + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /y2 xdf + /x2 xdf + /y1 xdf + /x1 xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + x1 x2 eq + { + y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if + x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + rampdict begin + 20 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + mul + /numpix xdf + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + ext0 + { + 0 getrampcolor + xMin xStart lt + { + xMin yMin xMin neg ySpan rectfill + }if + }if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + }repeat + pop + ext1{ + xMax xEnd gt + { + xEnd yMin xMax xEnd sub ySpan rectfill + }if + }if + grestore + grestore + end + end + end + }ifelse + }bdf }def -/page_trailer +/pt { end }def -/doc_trailer{ +/dt{ +}def +/pgsv{ + //Adobe_AGM_Core/AGMCORE_save save put +}def +/pgrs{ + //Adobe_AGM_Core/AGMCORE_save get restore }def -systemdict /findcolorrendering known{ - /findcolorrendering systemdict /findcolorrendering get def +systemdict/findcolorrendering known{ + /findcolorrendering systemdict/findcolorrendering get def }if -systemdict /setcolorrendering known{ - /setcolorrendering systemdict /setcolorrendering get def +systemdict/setcolorrendering known{ + /setcolorrendering systemdict/setcolorrendering get def }if /test_cmyk_color_plate { @@ -2456,7 +2353,7 @@ systemdict /setcolorrendering known{ }def /inRip_spot_has_ink { - dup Adobe_AGM_Core/AGMCORE_name xddf + dup//Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range @@ -2468,18 +2365,23 @@ systemdict /setcolorrendering known{ { /sep_colorspace_dict null AGMCORE_gput begin - CSA map_csa setcolorspace_opt + CSA get_csa_by_name setcolorspace_opt set_crd end } def +/map_csa +{ + currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse + {pop}{get_csa_by_name/MappedCSA xdf}ifelse +}def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin - dup /sep_tint exch AGMCORE_gput + dup/sep_tint exch AGMCORE_gput TintProc end -} def +}def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin @@ -2487,19 +2389,19 @@ def Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt - } for + }for TintProc end -} def +}def /sep_colorspace_proc { - Adobe_AGM_Core/AGMCORE_tmp xddf + /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ - Components aload pop + Components aload pop TintMethod/Lab eq{ - 2 {AGMCORE_tmp mul NComponents 1 roll} repeat - LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll + 2{AGMCORE_tmp mul NComponents 1 roll}repeat + LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ @@ -2507,8 +2409,8 @@ def }repeat }{ NComponents{ - 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll - } repeat + 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll + }repeat }ifelse }ifelse }{ @@ -2516,24 +2418,24 @@ def aload pop }ifelse end -} def +}def /sep_colorspace_gray_proc { - Adobe_AGM_Core/AGMCORE_tmp xddf + /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end -} def +}def /sep_proc_name { - dup 0 get - dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ - pop [/DeviceGray] + dup 0 get + dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{ + pop[/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse -} def +}def /setsepcolorspace { current_spot_alias{ @@ -2543,66 +2445,66 @@ def }if end }if - dup /sep_colorspace_dict exch AGMCORE_gput + dup/sep_colorspace_dict exch AGMCORE_gput begin - /MappedCSA CSA map_csa def - Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf + CSA map_csa + /AGMCORE_sep_special Name dup()eq exch(All)eq or store AGMCORE_avoid_L2_sep_space{ - [/Indexed MappedCSA sep_proc_name 255 exch - { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx - ] setcolorspace_opt - /TintProc { + [/Indexed MappedCSA sep_proc_name 255 exch + {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx + ]setcolorspace_opt + /TintProc{ 255 mul round cvi setcolor }bdf }{ - MappedCSA 0 get /DeviceCMYK eq - currentdict/Components known and + MappedCSA 0 get/DeviceCMYK eq + currentdict/Components known and AGMCORE_sep_special not and{ - /TintProc [ - Components aload pop Name findcmykcustomcolor - /exch cvx /setcustomcolor cvx - ] cvx bdf + /TintProc[ + Components aload pop Name findcmykcustomcolor + /exch cvx/setcustomcolor cvx + ]cvx bdf }{ - AGMCORE_host_sep Name (All) eq and{ - /TintProc { - 1 exch sub setseparationgray + AGMCORE_host_sep Name(All)eq and{ + /TintProc{ + 1 exch sub setseparationgray }bdf }{ - AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and + AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and AGMCORE_host_sep or - Name () eq and{ - /TintProc [ - MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ - cvx /setcmykcolor cvx + Name()eq and{ + /TintProc[ + MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{ + cvx/setcmykcolor cvx }{ - cvx /setgray cvx + cvx/setgray cvx }ifelse - ] cvx bdf + ]cvx bdf }{ - AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ - /TintProc [ + AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{ + /TintProc[ /dup cvx MappedCSA sep_proc_name cvx exch - 0 get /DeviceGray eq{ - 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx + 0 get/DeviceGray eq{ + 1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx }if - /Name cvx /findcmykcustomcolor cvx /exch cvx + /Name cvx/findcmykcustomcolor cvx/exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep - /Name cvx - /AGMCORE_IsSeparationAProcessColor load /exec cvx - /not cvx /and cvx + /Name cvx + /AGMCORE_IsSeparationAProcessColor load/exec cvx + /not cvx/and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 - ] cvx /if cvx + ]cvx/if cvx /setcustomcolor cvx - ] cvx bdf + ]cvx bdf }{ - /TintProc /setcolor ldf - [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt + /TintProc{setcolor}bdf + [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt }ifelse }ifelse }ifelse @@ -2611,25 +2513,25 @@ def set_crd setsepcolor end -} def +}def /additive_blend { - 3 dict begin - /numarrays xdf - /numcolors xdf - 0 1 numcolors 1 sub - { - /c1 xdf - 1 - 0 1 numarrays 1 sub - { - 1 exch add /index cvx - c1 /get cvx /mul cvx - }for - numarrays 1 add 1 /roll cvx - }for - numarrays [/pop cvx] cvx /repeat cvx - end + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 + 0 1 numarrays 1 sub + { + 1 exch add/index cvx + c1/get cvx/mul cvx + }for + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end }def /subtractive_blend { @@ -2642,22 +2544,22 @@ def 1 1 0 1 numarrays 1 sub { - 1 3 3 -1 roll add /index cvx - c1 /get cvx /sub cvx /mul cvx + 1 3 3 -1 roll add/index cvx + c1/get cvx/sub cvx/mul cvx }for /sub cvx - numarrays 1 add 1 /roll cvx + numarrays 1 add 1/roll cvx }for - numarrays [/pop cvx] cvx /repeat cvx + numarrays[/pop cvx]cvx/repeat cvx end }def /exec_tint_transform { - /TintProc [ - /TintTransform cvx /setcolor cvx - ] cvx bdf + /TintProc[ + /TintTransform cvx/setcolor cvx + ]cvx bdf MappedCSA setcolorspace_opt -} bdf +}bdf /devn_makecustomcolor { 2 dict begin @@ -2665,94 +2567,105 @@ def /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor - Names length {pop} repeat + Names length{pop}repeat end -} bdf +}bdf /setdevicencolorspace { - dup /AliasedColorants known {false}{true}ifelse - current_spot_alias and { - 6 dict begin + dup/AliasedColorants known{false}{true}ifelse + current_spot_alias and{ + 7 dict begin /names_index 0 def - dup /names_len exch /Names get length def + dup/names_len exch/Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def - dup /Names get + dup/Names get { - dup map_alias { + dup map_alias{ exch pop - dup /ColorLookup known { + dup/ColorLookup known{ dup begin new_LookupTables names_index ColorLookup put end }{ - dup /Components known { + dup/Components known{ dup begin new_LookupTables names_index Components put end }{ dup begin - new_LookupTables names_index [null null null null] put + new_LookupTables names_index[null null null null]put end - } ifelse - } ifelse - new_names names_index 3 -1 roll /Name get put - /alias_cnt alias_cnt 1 add def + }ifelse + }ifelse + new_names names_index 3 -1 roll/Name get put + /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put - dup /LookupTables known { + dup/LookupTables known{ dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin - new_LookupTables names_index [null null null null] put + new_LookupTables names_index[null null null null]put end - } ifelse - } ifelse - /names_index names_index 1 add def - } forall - alias_cnt 0 gt { + }ifelse + }ifelse + /names_index names_index 1 add def + }forall + alias_cnt 0 gt{ /AliasedColorants true def - 0 1 names_len 1 sub { + /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def + 0 1 names_len 1 sub{ /names_index xdf - new_LookupTables names_index get 0 get null eq { - dup /Names get names_index get /name xdf - name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq - or or or not { - /AliasedColorants false def - exit - } if - } if - } for - AliasedColorants { + new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{ + /AliasedColorants false def + exit + }{ + new_LookupTables names_index get 0 get null eq{ + dup/Names get names_index get/name xdf + name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq + or or or not{ + /AliasedColorants false def + exit + }if + }if + }ifelse + }for + lut_entry_len 1 eq{ + /AliasedColorants false def + }if + AliasedColorants{ dup begin /Names new_names def - /AliasedColorants true def /LookupTables new_LookupTables def - currentdict /TTTablesIdx known not { + /AliasedColorants true def + /NComponents lut_entry_len def + /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def + /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def + currentdict/TTTablesIdx known not{ /TTTablesIdx -1 def - } if - currentdict /NComponents known not { - /NComponents TintMethod /Subtractive eq {4}{3}ifelse def - } if + }if end - } if + }if }if end - } if - dup /devicen_colorspace_dict exch AGMCORE_gput + }if + dup/devicen_colorspace_dict exch AGMCORE_gput begin - /MappedCSA CSA map_csa def - currentdict /AliasedColorants known { + currentdict/AliasedColorants known{ AliasedColorants }{ false - } ifelse - /TintTransform load type /nulltype eq or { - /TintTransform [ + }ifelse + dup not{ + CSA map_csa + }if + /TintTransform load type/nulltype eq or{ + /TintTransform[ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def @@ -2760,7 +2673,7 @@ def { 1 index Names exch get - dup (Cyan) eq + dup(Cyan)eq { pop exch LookupTables length exch sub @@ -2768,207 +2681,219 @@ def 0 0 0 } { - dup (Magenta) eq + dup(Magenta)eq { pop exch LookupTables length exch sub /index cvx - 0 /exch cvx 0 0 - } - { - (Yellow) eq + 0/exch cvx 0 0 + }{ + (Yellow)eq { exch LookupTables length exch sub /index cvx - 0 0 3 -1 /roll cvx 0 - } - { + 0 0 3 -1/roll cvx 0 + }{ exch LookupTables length exch sub /index cvx - 0 0 0 4 -1 /roll cvx - } ifelse - } ifelse - } ifelse - 5 -1 /roll cvx /astore cvx - } - { + 0 0 0 4 -1/roll cvx + }ifelse + }ifelse + }ifelse + 5 -1/roll cvx/astore cvx + }{ dup length 1 sub LookupTables length 4 -1 roll sub 1 add - /index cvx /mul cvx /round cvx /cvi cvx /get cvx - } ifelse - Names length TTTablesIdx add 1 add 1 /roll cvx - } for - Names length [/pop cvx] cvx /repeat cvx + /index cvx/mul cvx/round cvx/cvi cvx/get cvx + }ifelse + Names length TTTablesIdx add 1 add 1/roll cvx + }for + Names length[/pop cvx]cvx/repeat cvx NComponents Names length - TintMethod /Subtractive eq - { - subtractive_blend - } - { - additive_blend - } ifelse - ] cvx bdf - } if - AGMCORE_host_sep { - Names convert_to_process { + TintMethod/Subtractive eq + { + subtractive_blend + }{ + additive_blend + }ifelse + ]cvx bdf + }if + AGMCORE_host_sep{ + Names convert_to_process{ exec_tint_transform } { - currentdict /AliasedColorants known { + currentdict/AliasedColorants known{ AliasedColorants not }{ false - } ifelse + }ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def - Names { - AvoidAliasedColorants { - /currentspotalias current_spot_alias def - false set_spot_alias - } if - AGMCORE_is_cmyk_sep { - dup (Cyan) eq AGMCORE_cyan_plate and exch - dup (Magenta) eq AGMCORE_magenta_plate and exch - dup (Yellow) eq AGMCORE_yellow_plate and exch - (Black) eq AGMCORE_black_plate and or or or { - /devicen_colorspace_dict AGMCORE_gget /TintProc [ - Names names_index /devn_makecustomcolor cvx - ] cvx ddf + AvoidAliasedColorants{ + /currentspotalias current_spot_alias def + false set_spot_alias + }if + Names{ + AGMCORE_is_cmyk_sep{ + dup(Cyan)eq AGMCORE_cyan_plate and exch + dup(Magenta)eq AGMCORE_magenta_plate and exch + dup(Yellow)eq AGMCORE_yellow_plate and exch + (Black)eq AGMCORE_black_plate and or or or{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf /painted? true def - } if - painted? {exit} if + }if + painted?{exit}if }{ - 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { - /devicen_colorspace_dict AGMCORE_gget /TintProc [ - Names names_index /devn_makecustomcolor cvx - ] cvx ddf + 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf /painted? true def exit - } if - } ifelse - AvoidAliasedColorants { - currentspotalias set_spot_alias - } if + }if + }ifelse /names_index names_index 1 add def - } forall - painted? { - /devicen_colorspace_dict AGMCORE_gget /names_index names_index put + }forall + AvoidAliasedColorants{ + currentspotalias set_spot_alias + }if + painted?{ + /devicen_colorspace_dict AGMCORE_gget/names_index names_index put }{ - /devicen_colorspace_dict AGMCORE_gget /TintProc [ - names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx - 0 0 0 0 () /findcmykcustomcolor cvx 0 /setcustomcolor cvx - ] cvx ddf - } ifelse + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx + 0 0 0 0/setcmykcolor cvx + ]cvx ddf + }ifelse end - } ifelse + }ifelse } { - AGMCORE_in_rip_sep { + AGMCORE_in_rip_sep{ Names convert_to_process not }{ level3 - } ifelse + }ifelse { - [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt - /TintProc level3 not AGMCORE_in_rip_sep and { + [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt + /TintProc level3 not AGMCORE_in_rip_sep and{ [ - Names /length cvx [/pop cvx] cvx /repeat cvx - ] cvx bdf + Names/length cvx[/pop cvx]cvx/repeat cvx + ]cvx bdf }{ - /setcolor ldf - } ifelse + {setcolor}bdf + }ifelse }{ exec_tint_transform - } ifelse - } ifelse + }ifelse + }ifelse set_crd /AliasedColorants false def end -} def +}def /setindexedcolorspace { - dup /indexed_colorspace_dict exch AGMCORE_gput + dup/indexed_colorspace_dict exch AGMCORE_gput begin - currentdict /CSD known { - CSD get_csd /Names known { - CSD get_csd begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ currentdict devncs - AGMCORE_host_sep{ - 4 dict begin - /devnCompCnt Names length def - /NewLookup HiVal 1 add string def - 0 1 HiVal { - /tableIndex xdf - Lookup dup type /stringtype eq { - devnCompCnt tableIndex map_index - }{ - exec - } ifelse - setdevicencolor - currentgray - tableIndex exch - HiVal mul cvi - NewLookup 3 1 roll put - } for - [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt - end - }{ - level3 - { - [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt + }{ + 1 currentdict sepcs + }ifelse + AGMCORE_host_sep{ + 4 dict begin + /compCnt/Names where{pop Names length}{1}ifelse def + /NewLookup HiVal 1 add string def + 0 1 HiVal{ + /tableIndex xdf + Lookup dup type/stringtype eq{ + compCnt tableIndex map_index }{ - [/Indexed MappedCSA HiVal - [ - Lookup dup type /stringtype eq - {/exch cvx CSD get_csd /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} - {/exec cvx}ifelse - /TintTransform load /exec cvx - ]cvx - ]setcolorspace_opt + exec + }ifelse + /Names where{ + pop setdevicencolor + }{ + setsepcolor }ifelse - } ifelse + currentgray + tableIndex exch + 255 mul cvi + NewLookup 3 1 roll put + }for + [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt end }{ - } ifelse - set_crd - } - { - /MappedCSA CSA map_csa def - AGMCORE_host_sep level2 not and{ - 0 0 0 0 setcmykcolor - }{ - [/Indexed MappedCSA - level2 not has_color not and{ - dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ - pop [/DeviceGray] - }if - HiVal GrayLookup - }{ - HiVal + level3 + { + currentdict/Names known{ + [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt + }{ + [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt + }ifelse + }{ + [/Indexed MappedCSA HiVal + [ + currentdict/Names known{ + Lookup dup type/stringtype eq + {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx} + {/exec cvx}ifelse + /TintTransform load/exec cvx + }{ + Lookup dup type/stringtype eq + {/exch cvx/get cvx 255/div cvx} + {/exec cvx}ifelse + CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx + }ifelse + ]cvx + ]setcolorspace_opt + }ifelse + }ifelse + end + set_crd + } + { + CSA map_csa + AGMCORE_host_sep level2 not and{ + 0 0 0 0 setcmykcolor + }{ + [/Indexed MappedCSA + level2 not has_color not and{ + dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{ + pop[/DeviceGray] + }if + HiVal GrayLookup + }{ + HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin - Lookup exch + Lookup exch dup HiVal gt{ pop HiVal }if - NComponents mul NComponents getinterval {} forall + NComponents mul NComponents getinterval{}forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end - } bind + }bind }{ Lookup }ifelse }ifelse - ] setcolorspace_opt + ]setcolorspace_opt set_crd }ifelse }ifelse @@ -2976,191 +2901,170 @@ def }def /setindexedcolor { - AGMCORE_host_sep { - /indexed_colorspace_dict AGMCORE_gget dup /CSD known { - begin - CSD get_csd begin - map_indexed_devn - devn - end + AGMCORE_host_sep{ + /indexed_colorspace_dict AGMCORE_gget + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + map_indexed_devn + devn + } + { + Lookup 1 3 -1 roll map_index + sep + }ifelse end }{ - AGMCORE_gget/Lookup get 4 3 -1 roll map_index - pop setcmykcolor - } ifelse + Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll + map_index + MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse + }ifelse + end }{ - level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSD known and { - /indexed_colorspace_dict AGMCORE_gget /CSD get get_csd begin + level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{ + /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin map_indexed_devn devn end } { setcolor - } ifelse + }ifelse }ifelse -} def +}def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray - /Decode [0 1] def - /DataSource def + /Decode[0 1]def + /DataSourcedef /MultipleDataSources false def /BitsPerComponent 8 def currentdict end - systemdict /image get exec + systemdict/image gx grestore }if consumeimagedata }def -/add_csa -{ - Adobe_AGM_Core begin - /AGMCORE_CSA_cache xput - end -}def -/get_csa_by_name +/add_res { - dup type dup /nametype eq exch /stringtype eq or{ - Adobe_AGM_Core begin - 1 dict begin - /name xdf - AGMCORE_CSA_cache - { - 0 get name eq { - exit - }{ - pop - } ifelse - }forall - end + dup/CSD eq{ + pop + //Adobe_AGM_Core begin + /AGMCORE_CSD_cache load 3 1 roll put end }{ - pop - } ifelse + defineresource pop + }ifelse }def -/map_csa +/del_res { - dup type /nametype eq{ - Adobe_AGM_Core/AGMCORE_CSA_cache get exch get - }if + { + aload pop exch + dup/CSD eq{ + pop + {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall + }{ + exch + {1 index undefineresource}forall + pop + }ifelse + }forall }def -/add_csd +/get_res { - Adobe_AGM_Core begin - /AGMCORE_CSD_cache xput - end + dup/CSD eq{ + pop + dup type dup/nametype eq exch/stringtype eq or{ + AGMCORE_CSD_cache exch get + }if + }{ + findresource + }ifelse }def -/get_csd +/get_csa_by_name { - dup type /nametype eq{ - Adobe_AGM_Core/AGMCORE_CSD_cache get exch get + dup type dup/nametype eq exch/stringtype eq or{ + /CSA get_res }if }def -/pattern_buf_init +/paintproc_buf_init { /count get 0 0 put -} def -/pattern_buf_next +}def +/paintproc_buf_next { - dup /count get dup 0 get + dup/count get dup 0 get dup 3 1 roll 1 add 0 xpt get -} def -/cachepattern_compress +}def +/cachepaintproc_compress { 5 dict begin - currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def - /patarray 20 dict def + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def /string_size 16000 def /readbuffer string_size string def - currentglobal true setglobal - patarray 1 array dup 0 1 put /count xpt + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt setglobal - /LZWFilter + /LZWFilter { exch - dup length 0 eq { + dup length 0 eq{ pop }{ - patarray dup length 1 sub 3 -1 roll put - } ifelse + ppdict dup length 1 sub 3 -1 roll put + }ifelse {string_size}{0}ifelse string - } /LZWEncode filter def - { + }/LZWEncode filter def + { ReadFilter readbuffer readstring exch LZWFilter exch writestring - not {exit} if - } loop + not{exit}if + }loop LZWFilter closefile - patarray + ppdict end }def -/cachepattern +/cachepaintproc { 2 dict begin - currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def - /patarray 20 dict def - currentglobal true setglobal - patarray 1 array dup 0 1 put /count xpt + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt setglobal { ReadFilter 16000 string readstring exch - patarray dup length 1 sub 3 -1 roll put - not {exit} if - } loop - patarray dup dup length 1 sub () put + ppdict dup length 1 sub 3 -1 roll put + not{exit}if + }loop + ppdict dup dup length 1 sub()put end }def -/add_pattern -{ - Adobe_AGM_Core begin - /AGMCORE_pattern_cache xput - end -}def -/get_pattern -{ - dup type /nametype eq{ - Adobe_AGM_Core/AGMCORE_pattern_cache get exch get - dup wrap_paintproc - }if -}def -/wrap_paintproc -{ - statusdict /currentfilenameextend known{ - begin - /OldPaintProc /PaintProc load def - /PaintProc - { - mark exch - dup /OldPaintProc get stopped - {closefile restore end} if - cleartomark - } def - end - } {pop} ifelse -} def /make_pattern { + exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform - exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub - exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub + exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub + exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix - 1 index begin - BBox 0 get XStep div cvi XStep mul /xshift exch neg def - BBox 1 get YStep div cvi YStep mul /yshift exch neg def + 1 index begin + BBox 0 get XStep div cvi XStep mul/xshift exch neg def + BBox 1 get YStep div cvi YStep mul/yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def - [ xshift yshift /translate load null /exec load ] dup - 3 /PaintProc load put cvx /PaintProc exch def + [xshift yshift/translate load null/exec load]dup + 3/PaintProc load put cvx/PaintProc exch def end gsave 0 setgray makepattern @@ -3168,89 +3072,162 @@ def }def /set_pattern { - dup /PatternType get 1 eq{ - dup /PaintType get 1 eq{ - currentoverprint sop [/DeviceGray] setcolorspace 0 setgray + dup/PatternType get 1 eq{ + dup/PaintType get 1 eq{ + currentoverprint sop[/DeviceGray]setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { - dup currentcolorspace eq{ - pop - }{ - setcolorspace - }ifelse + dup currentcolorspace eq{pop}{setcolorspace}ifelse }def /updatecolorrendering { - currentcolorrendering/Intent known{ - currentcolorrendering/Intent get - }{ - null + currentcolorrendering/RenderingIntent known{ + currentcolorrendering/RenderingIntent get + } + { + Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/Saturation eq + { + /saturation_crd AGMCORE_gget dup null eq + } + { + /perceptual_crd AGMCORE_gget dup null eq + }ifelse + }ifelse + }ifelse + { + pop null + } + { + /RenderingIntent known{null}{Intent}ifelse + }ifelse }ifelse Intent ne{ - false - Intent - AGMCORE_CRD_cache { - exch pop - begin - dup Intent eq{ - currentdict setcolorrendering_opt - end - exch pop true exch - exit - }if + Intent/ColorRendering{findresource}stopped + { + pop pop systemdict/findcolorrendering known + { + Intent findcolorrendering + { + /ColorRendering findresource true exch + } + { + /ColorRendering findresource + product(Xerox Phaser 5400)ne + exch + }ifelse + dup Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd exch AGMCORE_gput + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd exch AGMCORE_gput + } + { + Intent/Saturation eq + { + /saturation_crd exch AGMCORE_gput + } + { + Intent/Perceptual eq + { + /perceptual_crd exch AGMCORE_gput + } + { + pop + }ifelse + }ifelse + }ifelse + }ifelse + 1 index{exch}{pop}ifelse + } + {false}ifelse + } + {true}ifelse + { + dup begin + currentdict/TransformPQR known{ + currentdict/TransformPQR get aload pop + 3{{}eq 3 1 roll}repeat or or + } + {true}ifelse + currentdict/MatrixPQR known{ + currentdict/MatrixPQR get aload pop + 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq + and and and and and and and and + } + {true}ifelse end - } forall - pop - not{ - systemdict /findcolorrendering known{ - Intent findcolorrendering pop - /ColorRendering findresource - dup length dict copy - setcolorrendering_opt + or + { + clonedict begin + /TransformPQR[ + {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div + 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind + {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div + 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind + {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div + 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind + ]def + /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def + /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def + currentdict end }if - }if + setcolorrendering_opt + }if }if -} def -/add_crd -{ - AGMCORE_CRD_cache 3 1 roll put }def /set_crd { AGMCORE_host_sep not level2 and{ - currentdict/CRD known{ - AGMCORE_CRD_cache CRD get dup null ne{ - setcolorrendering_opt - }{ - pop - }ifelse + currentdict/ColorRendering known{ + ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse - currentcolorspace dup type /arraytype eq + currentcolorspace dup type/arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval - currentdict/BG known + currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def +/set_ucrbg +{ + dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration + dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval +}def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ + clonedict begin /Intent Intent def currentdict @@ -3260,47 +3237,70 @@ def }def /cpaint_gcomp { - convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf - Adobe_AGM_Core/AGMCORE_ConvertToProcess get not + convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { - (%end_cpaint_gcomp) flushinput + (%end_cpaint_gcomp)flushinput }if }def /cpaint_gsep { - Adobe_AGM_Core/AGMCORE_ConvertToProcess get + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { - (%end_cpaint_gsep) flushinput + (%end_cpaint_gsep)flushinput }if }def /cpaint_gend +{np}def +/T1_path +{ + currentfile token pop currentfile token pop mo + { + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 exch rlineto + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 rlineto + }loop +}def +/T1_gsave + level3 + {/clipsave} + {/gsave}ifelse + load def +/T1_grestore + level3 + {/cliprestore} + {/grestore}ifelse + load def +/set_spot_alias_ary { - newpath + dup inherit_aliases + //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def -/path_rez +/set_spot_normalization_ary { - dup 0 ne{ - AGMCORE_deviceDPI exch div - dup 1 lt{ - pop 1 - }if - setflat - }{ + dup inherit_aliases + dup length + /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if + array + //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf + /AGMCORE_SpotAliasAry where{ pop - }ifelse + AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval + AGMCORE_SpotAliasAry length + }{0}ifelse + AGMCORE_SpotAliasAry2 3 1 roll exch putinterval + true set_spot_alias }def -/set_spot_alias_ary +/inherit_aliases { - /AGMCORE_SpotAliasAry where{ - pop pop - }{ - Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf - true set_spot_alias - }ifelse + {dup/Name get map_alias{/CSD put}{pop}ifelse}forall }def /set_spot_alias { - /AGMCORE_SpotAliasAry where{ + /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop @@ -3308,7 +3308,7 @@ def }def /current_spot_alias { - /AGMCORE_SpotAliasAry where{ + /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false @@ -3316,16 +3316,13 @@ def }def /map_alias { - /AGMCORE_SpotAliasAry where{ + /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false - AGMCORE_SpotAliasAry{ + AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ - save exch - /Adobe_AGM_Core currentdict def - /CSD get get_csd - exch restore + /CSD get/CSD get_res exch pop true exit }{ @@ -3340,29 +3337,36 @@ def /spot_alias { true set_spot_alias - /AGMCORE_&setcustomcolor AGMCORE_key_known not { - Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put - } if + /AGMCORE_&setcustomcolor AGMCORE_key_known not{ + //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put + }if /customcolor_tint 1 AGMCORE_gput - Adobe_AGM_Core begin + //Adobe_AGM_Core begin /setcustomcolor { - dup /customcolor_tint exch AGMCORE_gput - current_spot_alias{ - 1 index 4 get map_alias{ - mark 3 1 roll - setsepcolorspace - counttomark 0 ne{ - setsepcolor - }if - pop - pop - }{ - AGMCORE_&setcustomcolor - }ifelse + //Adobe_AGM_Core begin + dup/customcolor_tint exch AGMCORE_gput + 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not + current_spot_alias and{1 index 4 get map_alias}{false}ifelse + { + false set_spot_alias + /sep_colorspace_dict AGMCORE_gget null ne + 3 1 roll 2 index{ + exch pop/sep_tint AGMCORE_gget exch + }if + mark 3 1 roll + setsepcolorspace + counttomark 0 ne{ + setsepcolor + }if + pop + not{/sep_tint 1.0 AGMCORE_gput}if + pop + true set_spot_alias }{ AGMCORE_&setcustomcolor }ifelse + end }bdf end }def @@ -3370,2547 +3374,139 @@ def { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put - {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if -}def -/end_feature -{ - 2 dict begin - /spd /setpagedevice load def - /setpagedevice { get_gstate spd set_gstate } def - stopped{$error/newerror false put}if - end - count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse - countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse - {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if -}def -/set_negative -{ - Adobe_AGM_Core begin - /AGMCORE_inverting exch def - level2{ - currentpagedevice/NegativePrint known{ - currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{ - true begin_feature true{ - bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice - }end_feature - }if - /AGMCORE_inverting false def - }if - }if - AGMCORE_inverting{ - [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer - gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse - /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore - }if - end -}def -/lw_save_restore_override { - /md where { - pop - md begin - initializepage - /initializepage{}def - /pmSVsetup{} def - /endp{}def - /pse{}def - /psb{}def - /orig_showpage where - {pop} - {/orig_showpage /showpage load def} - ifelse - /showpage {orig_showpage gR} def - end - }if -}def -/pscript_showpage_override { - /NTPSOct95 where - { - begin - showpage - save - /showpage /restore load def - /restore {exch pop}def - end - }if -}def -/driver_media_override -{ - /md where { - pop - md /initializepage known { - md /initializepage {} put - } if - md /rC known { - md /rC {4{pop}repeat} put - } if - }if - /mysetup where { - /mysetup [1 0 0 1 0 0] put - }if - Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put - level2 - {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if -}def -/driver_check_media_override -{ - /PrepsDict where - {pop} - { - Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne - Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq - { - Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and - Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and - }if - { - Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix - }if - }ifelse -}def -AGMCORE_err_strings begin - /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def - /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def - /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def -end -end -systemdict /setpacking known -{ - setpacking -} if -%%EndResource -%%BeginResource: procset Adobe_CoolType_Core 2.23 0 -%%Copyright: Copyright 1997-2003 Adobe Systems Incorporated. All Rights Reserved. -%%Version: 2.23 0 -10 dict begin -/Adobe_CoolType_Passthru currentdict def -/Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def -Adobe_CoolType_Core_Defined - { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } -if -userdict /Adobe_CoolType_Core 60 dict dup begin put -/Adobe_CoolType_Version 2.23 def -/Level2? - systemdict /languagelevel known dup - { pop systemdict /languagelevel get 2 ge } - if def -Level2? not - { - /currentglobal false def - /setglobal /pop load def - /gcheck { pop false } bind def - /currentpacking false def - /setpacking /pop load def - /SharedFontDirectory 0 dict def - } -if -currentpacking -true setpacking -/@_SaveStackLevels - { - Adobe_CoolType_Data - begin - @opStackCountByLevel @opStackLevel - 2 copy known not - { 2 copy 3 dict dup /args 7 index 5 add array put put get } - { - get dup /args get dup length 3 index lt - { - dup length 5 add array exch - 1 index exch 0 exch putinterval - 1 index exch /args exch put - } - { pop } - ifelse - } - ifelse - begin - count 2 sub 1 index lt - { pop count 1 sub } - if - dup /argCount exch def - dup 0 gt - { - exch 1 index 2 add 1 roll - args exch 0 exch getinterval - astore pop - } - { pop } - ifelse - count 1 sub /restCount exch def - end - /@opStackLevel @opStackLevel 1 add def - countdictstack 1 sub - @dictStackCountByLevel exch @dictStackLevel exch put - /@dictStackLevel @dictStackLevel 1 add def - end - } bind def -/@_RestoreStackLevels - { - Adobe_CoolType_Data - begin - /@opStackLevel @opStackLevel 1 sub def - @opStackCountByLevel @opStackLevel get - begin - count restCount sub dup 0 gt - { { pop } repeat } - { pop } - ifelse - args 0 argCount getinterval {} forall - end - /@dictStackLevel @dictStackLevel 1 sub def - @dictStackCountByLevel @dictStackLevel get - end - countdictstack exch sub dup 0 gt - { { end } repeat } - { pop } - ifelse - } bind def -/@_PopStackLevels - { - Adobe_CoolType_Data - begin - /@opStackLevel @opStackLevel 1 sub def - /@dictStackLevel @dictStackLevel 1 sub def - end - } bind def -/@Raise - { - exch cvx exch errordict exch get exec - stop - } bind def -/@ReRaise - { - cvx $error /errorname get errordict exch get exec - stop - } bind def -/@Stopped - { - 0 @#Stopped - } bind def -/@#Stopped - { - @_SaveStackLevels - stopped - { @_RestoreStackLevels true } - { @_PopStackLevels false } - ifelse - } bind def -/@Arg - { - Adobe_CoolType_Data - begin - @opStackCountByLevel @opStackLevel 1 sub get /args get exch get - end - } bind def -currentglobal true setglobal -/CTHasResourceForAllBug - Level2? - { - 1 dict dup begin - mark - { - (*) { pop stop } 128 string /Category - resourceforall - } - stopped - cleartomark - currentdict eq dup - { end } - if - not - } - { false } - ifelse - def -/CTHasResourceStatusBug - Level2? - { - mark - { /steveamerige /Category resourcestatus } - stopped - { cleartomark true } - { cleartomark currentglobal not } - ifelse - } - { false } - ifelse - def -setglobal -/CTResourceStatus - { - mark 3 1 roll - /Category findresource - begin - ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec - { cleartomark false } - { { 3 2 roll pop true } { cleartomark false } ifelse } - ifelse - end - } bind def -/CTWorkAroundBugs - { - Level2? - { - /cid_PreLoad /ProcSet resourcestatus - { - pop pop - currentglobal - mark - { - (*) - { - dup /CMap CTHasResourceStatusBug - { CTResourceStatus } - { resourcestatus } - ifelse - { - pop dup 0 eq exch 1 eq or - { - dup /CMap findresource gcheck setglobal - /CMap undefineresource - } - { - pop CTHasResourceForAllBug - { exit } - { stop } - ifelse - } - ifelse - } - { pop } - ifelse - } - 128 string /CMap resourceforall - } - stopped - { cleartomark } - stopped pop - setglobal - } - if - } - if - } bind def -/doc_setup - { - Adobe_CoolType_Core - begin - CTWorkAroundBugs - /mov /moveto load def - /nfnt /newencodedfont load def - /mfnt /makefont load def - /sfnt /setfont load def - /ufnt /undefinefont load def - /chp /charpath load def - /awsh /awidthshow load def - /wsh /widthshow load def - /ash /ashow load def - /sh /show load def - end - userdict /Adobe_CoolType_Data 10 dict dup - begin - /AddWidths? false def - /CC 0 def - /charcode 2 string def - /@opStackCountByLevel 32 dict def - /@opStackLevel 0 def - /@dictStackCountByLevel 32 dict def - /@dictStackLevel 0 def - /InVMFontsByCMap 10 dict def - /InVMDeepCopiedFonts 10 dict def - end put - } bind def -/doc_trailer - { - currentdict Adobe_CoolType_Core eq - { end } - if - } bind def -/page_setup - { - Adobe_CoolType_Core begin - } bind def -/page_trailer - { - end - } bind def -/unload - { - systemdict /languagelevel known - { - systemdict/languagelevel get 2 ge - { - userdict/Adobe_CoolType_Core 2 copy known - { undef } - { pop pop } - ifelse - } - if - } - if - } bind def -/ndf - { - 1 index where - { pop pop pop } - { dup xcheck { bind } if def } - ifelse - } def -/findfont systemdict - begin - userdict - begin - /globaldict where { /globaldict get begin } if - dup where pop exch get - /globaldict where { pop end } if - end - end -Adobe_CoolType_Core_Defined - { /systemfindfont exch def } - { - /findfont 1 index def - /systemfindfont exch def - } -ifelse -/undefinefont - { pop } ndf -/copyfont - { - currentglobal 3 1 roll - 1 index gcheck setglobal - dup null eq { 0 } { dup length } ifelse - 2 index length add 1 add dict - begin - exch - { - 1 index /FID eq - { pop pop } - { def } - ifelse - } - forall - dup null eq - { pop } - { { def } forall } - ifelse - currentdict - end - exch setglobal - } bind def -/copyarray - { - currentglobal exch - dup gcheck setglobal - dup length array copy - exch setglobal - } bind def -/newencodedfont - { - currentglobal - { - SharedFontDirectory 3 index known - { SharedFontDirectory 3 index get /FontReferenced known } - { false } - ifelse - } - { - FontDirectory 3 index known - { FontDirectory 3 index get /FontReferenced known } - { - SharedFontDirectory 3 index known - { SharedFontDirectory 3 index get /FontReferenced known } - { false } - ifelse - } - ifelse - } - ifelse - dup - { - 3 index findfont /FontReferenced get - 2 index dup type /nametype eq - {findfont} - if ne - { pop false } - if - } - if - { - pop - 1 index findfont - /Encoding get exch - 0 1 255 - { 2 copy get 3 index 3 1 roll put } - for - pop pop pop - } - { - dup type /nametype eq - { findfont } - if - dup dup maxlength 2 add dict - begin - exch - { - 1 index /FID ne - {def} - {pop pop} - ifelse - } - forall - /FontReferenced exch def - /Encoding exch dup length array copy def - /FontName 1 index dup type /stringtype eq { cvn } if def dup - currentdict - end - definefont def - } - ifelse - } bind def -/SetSubstituteStrategy - { - $SubstituteFont - begin - dup type /dicttype ne - { 0 dict } - if - currentdict /$Strategies known - { - exch $Strategies exch - 2 copy known - { - get - 2 copy maxlength exch maxlength add dict - begin - { def } forall - { def } forall - currentdict - dup /$Init known - { dup /$Init get exec } - if - end - /$Strategy exch def - } - { pop pop pop } - ifelse - } - { pop pop } - ifelse - end - } bind def -/scff - { - $SubstituteFont - begin - dup type /stringtype eq - { dup length exch } - { null } - ifelse - /$sname exch def - /$slen exch def - /$inVMIndex - $sname null eq - { - 1 index $str cvs - dup length $slen sub $slen getinterval cvn - } - { $sname } - ifelse def - end - { findfont } - @Stopped - { - dup length 8 add string exch - 1 index 0 (BadFont:) putinterval - 1 index exch 8 exch dup length string cvs putinterval cvn - { findfont } - @Stopped - { pop /Courier findfont } - if - } - if - $SubstituteFont - begin - /$sname null def - /$slen 0 def - /$inVMIndex null def - end - } bind def -/isWidthsOnlyFont - { - dup /WidthsOnly known - { pop pop true } - { - dup /FDepVector known - { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } - { - dup /FDArray known - { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } - { pop } - ifelse - } - ifelse - } - ifelse - } bind def -/?str1 256 string def -/?set - { - $SubstituteFont - begin - /$substituteFound false def - /$fontname 4 index def - /$doSmartSub false def - end - 3 index - currentglobal false setglobal exch - /CompatibleFonts /ProcSet resourcestatus - { - pop pop - /CompatibleFonts /ProcSet findresource - begin - dup /CompatibleFont currentexception - 1 index /CompatibleFont true setexception - 1 index /Font resourcestatus - { - pop pop - 3 2 roll setglobal - end - exch - dup findfont - /CompatibleFonts /ProcSet findresource - begin - 3 1 roll exch /CompatibleFont exch setexception - end - } - { - 3 2 roll setglobal - 1 index exch /CompatibleFont exch setexception - end - findfont - $SubstituteFont /$substituteFound true put - } - ifelse - } - { exch setglobal findfont } - ifelse - $SubstituteFont - begin - $substituteFound - { - false - (%%[Using embedded font ) print - 5 index ?str1 cvs print - ( to avoid the font substitution problem noted earlier.]%%\n) print - } - { - dup /FontName known - { - dup /FontName get $fontname eq - 1 index /DistillerFauxFont known not and - /currentdistillerparams where - { pop false 2 index isWidthsOnlyFont not and } - if - } - { false } - ifelse - } - ifelse - exch pop - /$doSmartSub true def - end - { - exch pop exch pop exch - 2 dict dup /Found 3 index put - exch findfont exch - } - { - exch exec - exch dup findfont - dup /FontType get 3 eq - { - exch ?str1 cvs - dup length 1 sub - -1 0 - { - exch dup 2 index get 42 eq - { - exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop - exit - } - {exch pop} ifelse - }for - } - { - exch pop - } ifelse - 2 dict dup /Downloaded 6 5 roll put - } - ifelse - dup /FontName 4 index put copyfont definefont pop - } bind def -/?str2 256 string def -/?add - { - 1 index type /integertype eq - { exch true 4 2 } - { false 3 1 } - ifelse - roll - 1 index findfont - dup /Widths known - { - Adobe_CoolType_Data /AddWidths? true put - gsave dup 1000 scalefont setfont - } - if - /Downloaded known - { - exec - exch - { - exch ?str2 cvs exch - findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length - ?str1 1 index 1 add 3 index putinterval - exch length 1 add 1 index add - ?str1 2 index (*) putinterval - ?str1 0 2 index getinterval cvn findfont - ?str1 3 index (+) putinterval - 2 dict dup /FontName ?str1 0 6 index getinterval cvn put - dup /Downloaded Downloaded put end copyfont - dup /FontName get exch definefont pop pop pop - } - { - pop - } - ifelse - } - { - pop - exch - { - findfont - dup /Found get - dup length exch ?str1 cvs pop - ?str1 1 index (+) putinterval - ?str1 1 index 1 add 4 index ?str2 cvs putinterval - ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn - 1 dict exch 1 index exch /FontName exch put copyfont - dup /FontName get exch definefont pop - } - { - pop - } - ifelse - } - ifelse - Adobe_CoolType_Data /AddWidths? get - { grestore Adobe_CoolType_Data /AddWidths? false put } - if - } bind def -/?sh - { - currentfont /Downloaded known { exch } if pop - } bind def -/?chp - { - currentfont /Downloaded known { pop } { false chp } ifelse - } bind def -/?mv - { - currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse - } bind def -setpacking -userdict /$SubstituteFont 25 dict put -1 dict - begin - /SubstituteFont - dup $error exch 2 copy known - { get } - { pop pop { pop /Courier } bind } - ifelse def - /currentdistillerparams where dup - { - pop pop - currentdistillerparams /CannotEmbedFontPolicy 2 copy known - { get /Error eq } - { pop pop false } - ifelse - } - if not - { - countdictstack array dictstack 0 get - begin - userdict - begin - $SubstituteFont - begin - /$str 128 string def - /$fontpat 128 string def - /$slen 0 def - /$sname null def - /$match false def - /$fontname null def - /$substituteFound false def - /$inVMIndex null def - /$doSmartSub true def - /$depth 0 def - /$fontname null def - /$italicangle 26.5 def - /$dstack null def - /$Strategies 10 dict dup - begin - /$Type3Underprint - { - currentglobal exch false setglobal - 11 dict - begin - /UseFont exch - $WMode 0 ne - { - dup length dict copy - dup /WMode $WMode put - /UseFont exch definefont - } - if def - /FontName $fontname dup type /stringtype eq { cvn } if def - /FontType 3 def - /FontMatrix [ .001 0 0 .001 0 0 ] def - /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def - /FontBBox [ 0 0 0 0 ] def - /CCInfo 7 dict dup - begin - /cc null def - /x 0 def - /y 0 def - end def - /BuildChar - { - exch - begin - CCInfo - begin - 1 string dup 0 3 index put exch pop - /cc exch def - UseFont 1000 scalefont setfont - cc stringwidth /y exch def /x exch def - x y setcharwidth - $SubstituteFont /$Strategy get /$Underprint get exec - 0 0 moveto cc show - x y moveto - end - end - } bind def - currentdict - end - exch setglobal - } bind def - /$GetaTint - 2 dict dup - begin - /$BuildFont - { - dup /WMode known - { dup /WMode get } - { 0 } - ifelse - /$WMode exch def - $fontname exch - dup /FontName known - { - dup /FontName get - dup type /stringtype eq { cvn } if - } - { /unnamedfont } - ifelse - exch - Adobe_CoolType_Data /InVMDeepCopiedFonts get - 1 index /FontName get known - { - pop - Adobe_CoolType_Data /InVMDeepCopiedFonts get - 1 index get - null copyfont - } - { $deepcopyfont } - ifelse - exch 1 index exch /FontBasedOn exch put - dup /FontName $fontname dup type /stringtype eq { cvn } if put - definefont - Adobe_CoolType_Data /InVMDeepCopiedFonts get - begin - dup /FontBasedOn get 1 index def - end - } bind def - /$Underprint - { - gsave - x abs y abs gt - { /y 1000 def } - { /x -1000 def 500 120 translate } - ifelse - Level2? - { - [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] - setcolorspace - } - { 0 setgray } - ifelse - 10 setlinewidth - x .8 mul - [ 7 3 ] - { - y mul 8 div 120 sub x 10 div exch moveto - 0 y 4 div neg rlineto - dup 0 rlineto - 0 y 4 div rlineto - closepath - gsave - Level2? - { .2 setcolor } - { .8 setgray } - ifelse - fill grestore - stroke - } - forall - pop - grestore - } bind def - end def - /$Oblique - 1 dict dup - begin - /$BuildFont - { - currentglobal exch dup gcheck setglobal - null copyfont - begin - /FontBasedOn - currentdict /FontName known - { - FontName - dup type /stringtype eq { cvn } if - } - { /unnamedfont } - ifelse - def - /FontName $fontname dup type /stringtype eq { cvn } if def - /currentdistillerparams where - { pop } - { - /FontInfo currentdict /FontInfo known - { FontInfo null copyfont } - { 2 dict } - ifelse - dup - begin - /ItalicAngle $italicangle def - /FontMatrix FontMatrix - [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] - matrix concatmatrix readonly - end - 4 2 roll def - def - } - ifelse - FontName currentdict - end - definefont - exch setglobal - } bind def - end def - /$None - 1 dict dup - begin - /$BuildFont {} bind def - end def - end def - /$Oblique SetSubstituteStrategy - /$findfontByEnum - { - dup type /stringtype eq { cvn } if - dup /$fontname exch def - $sname null eq - { $str cvs dup length $slen sub $slen getinterval } - { pop $sname } - ifelse - $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval - /$match false def - $SubstituteFont /$dstack countdictstack array dictstack put - mark - { - $fontpat 0 $slen 7 add getinterval - { /$match exch def exit } - $str filenameforall - } - stopped - { - cleardictstack - currentdict - true - $SubstituteFont /$dstack get - { - exch - { - 1 index eq - { pop false } - { true } - ifelse - } - { begin false } - ifelse - } - forall - pop - } - if - cleartomark - /$slen 0 def - $match false ne - { $match (fonts/) anchorsearch pop pop cvn } - { /Courier } - ifelse - } bind def - /$ROS 1 dict dup - begin - /Adobe 4 dict dup - begin - /Japan1 [ /Ryumin-Light /HeiseiMin-W3 - /GothicBBB-Medium /HeiseiKakuGo-W5 - /HeiseiMaruGo-W4 /Jun101-Light ] def - /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def - /GB1 [ /STSong-Light /STHeiti-Regular ] def - /CNS1 [ /MKai-Medium /MHei-Medium ] def - end def - end def - /$cmapname null def - /$deepcopyfont - { - dup /FontType get 0 eq - { - 1 dict dup /FontName /copied put copyfont - begin - /FDepVector FDepVector copyarray - 0 1 2 index length 1 sub - { - 2 copy get $deepcopyfont - dup /FontName /copied put - /copied exch definefont - 3 copy put pop pop - } - for - def - currentdict - end - } - { $Strategies /$Type3Underprint get exec } - ifelse - } bind def - /$buildfontname - { - dup /CIDFont findresource /CIDSystemInfo get - begin - Registry length Ordering length Supplement 8 string cvs - 3 copy length 2 add add add string - dup 5 1 roll dup 0 Registry putinterval - dup 4 index (-) putinterval - dup 4 index 1 add Ordering putinterval - 4 2 roll add 1 add 2 copy (-) putinterval - end - 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch - anchorsearch - { pop pop 3 2 roll putinterval cvn /$cmapname exch def } - { pop pop pop pop pop } - ifelse - length - $str 1 index (-) putinterval 1 add - $str 1 index $cmapname $fontpat cvs putinterval - $cmapname length add - $str exch 0 exch getinterval cvn - } bind def - /$findfontByROS - { - /$fontname exch def - $ROS Registry 2 copy known - { - get Ordering 2 copy known - { get } - { pop pop [] } - ifelse - } - { pop pop [] } - ifelse - false exch - { - dup /CIDFont resourcestatus - { - pop pop - save - 1 index /CIDFont findresource - dup /WidthsOnly known - { dup /WidthsOnly get } - { false } - ifelse - exch pop - exch restore - { pop } - { exch pop true exit } - ifelse - } - { pop } - ifelse - } - forall - { $str cvs $buildfontname } - { - false (*) - { - save exch - dup /CIDFont findresource - dup /WidthsOnly known - { dup /WidthsOnly get not } - { true } - ifelse - exch /CIDSystemInfo get - dup /Registry get Registry eq - exch /Ordering get Ordering eq and and - { exch restore exch pop true exit } - { pop restore } - ifelse - } - $str /CIDFont resourceforall - { $buildfontname } - { $fontname $findfontByEnum } - ifelse - } - ifelse - } bind def - end - end - currentdict /$error known currentdict /languagelevel known and dup - { pop $error /SubstituteFont known } - if - dup - { $error } - { Adobe_CoolType_Core } - ifelse - begin - { - /SubstituteFont - /CMap /Category resourcestatus - { - pop pop - { - $SubstituteFont - begin - /$substituteFound true def - dup length $slen gt - $sname null ne or - $slen 0 gt and - { - $sname null eq - { dup $str cvs dup length $slen sub $slen getinterval cvn } - { $sname } - ifelse - Adobe_CoolType_Data /InVMFontsByCMap get - 1 index 2 copy known - { - get - false exch - { - pop - currentglobal - { - GlobalFontDirectory 1 index known - { exch pop true exit } - { pop } - ifelse - } - { - FontDirectory 1 index known - { exch pop true exit } - { - GlobalFontDirectory 1 index known - { exch pop true exit } - { pop } - ifelse - } - ifelse - } - ifelse - } - forall - } - { pop pop false } - ifelse - { - exch pop exch pop - } - { - dup /CMap resourcestatus - { - pop pop - dup /$cmapname exch def - /CMap findresource /CIDSystemInfo get { def } forall - $findfontByROS - } - { - 128 string cvs - dup (-) search - { - 3 1 roll search - { - 3 1 roll pop - { dup cvi } - stopped - { pop pop pop pop pop $findfontByEnum } - { - 4 2 roll pop pop - exch length - exch - 2 index length - 2 index - sub - exch 1 sub -1 0 - { - $str cvs dup length - 4 index - 0 - 4 index - 4 3 roll add - getinterval - exch 1 index exch 3 index exch - putinterval - dup /CMap resourcestatus - { - pop pop - 4 1 roll pop pop pop - dup /$cmapname exch def - /CMap findresource /CIDSystemInfo get { def } forall - $findfontByROS - true exit - } - { pop } - ifelse - } - for - dup type /booleantype eq - { pop } - { pop pop pop $findfontByEnum } - ifelse - } - ifelse - } - { pop pop pop $findfontByEnum } - ifelse - } - { pop pop $findfontByEnum } - ifelse - } - ifelse - } - ifelse - } - { //SubstituteFont exec } - ifelse - /$slen 0 def - end - } - } - { - { - $SubstituteFont - begin - /$substituteFound true def - dup length $slen gt - $sname null ne or - $slen 0 gt and - { $findfontByEnum } - { //SubstituteFont exec } - ifelse - end - } - } - ifelse - bind readonly def - Adobe_CoolType_Core /scfindfont /systemfindfont load put - } - { - /scfindfont - { - $SubstituteFont - begin - dup systemfindfont - dup /FontName known - { dup /FontName get dup 3 index ne } - { /noname true } - ifelse - dup - { - /$origfontnamefound 2 index def - /$origfontname 4 index def /$substituteFound true def - } - if - exch pop - { - $slen 0 gt - $sname null ne - 3 index length $slen gt or and - { - pop dup $findfontByEnum findfont - dup maxlength 1 add dict - begin - { 1 index /FID eq { pop pop } { def } ifelse } - forall - currentdict - end - definefont - dup /FontName known { dup /FontName get } { null } ifelse - $origfontnamefound ne - { - $origfontname $str cvs print - ( substitution revised, using ) print - dup /FontName known - { dup /FontName get } { (unspecified font) } - ifelse - $str cvs print (.\n) print - } - if - } - { exch pop } - ifelse - } - { exch pop } - ifelse - end - } bind def - } - ifelse - end - end - Adobe_CoolType_Core_Defined not - { - Adobe_CoolType_Core /findfont - { - $SubstituteFont - begin - $depth 0 eq - { - /$fontname 1 index dup type /stringtype ne { $str cvs } if def - /$substituteFound false def - } - if - /$depth $depth 1 add def - end - scfindfont - $SubstituteFont - begin - /$depth $depth 1 sub def - $substituteFound $depth 0 eq and - { - $inVMIndex null ne - { dup $inVMIndex $AddInVMFont } - if - $doSmartSub - { - currentdict /$Strategy known - { $Strategy /$BuildFont get exec } - if - } - if - } - if - end - } bind put - } - if - } - if - end -/$AddInVMFont - { - exch /FontName 2 copy known - { - get - 1 dict dup begin exch 1 index gcheck def end exch - Adobe_CoolType_Data /InVMFontsByCMap get exch - $DictAdd - } - { pop pop pop } - ifelse - } bind def -/$DictAdd - { - 2 copy known not - { 2 copy 4 index length dict put } - if - Level2? not - { - 2 copy get dup maxlength exch length 4 index length add lt - 2 copy get dup length 4 index length add exch maxlength 1 index lt - { - 2 mul dict - begin - 2 copy get { forall } def - 2 copy currentdict put - end - } - { pop } - ifelse - } - if - get - begin - { def } - forall - end - } bind def -end -end -%%EndResource -%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 -%%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. -%%Version: 1.19 0 -systemdict /languagelevel known dup - { currentglobal false setglobal } - { false } -ifelse -exch -userdict /Adobe_CoolType_Utility 2 copy known - { 2 copy get dup maxlength 25 add dict copy } - { 25 dict } -ifelse put -Adobe_CoolType_Utility - begin - /ct_Level2? exch def - /ct_Clone? 1183615869 internaldict dup - /CCRun known not - exch /eCCRun known not - ct_Level2? and or def -ct_Level2? - { globaldict begin currentglobal true setglobal } -if - /ct_AddStdCIDMap - ct_Level2? - { { - ((Hex) 57 StartData - 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 - 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 - d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 - cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec - } } - { { - eexec - } } - ifelse bind def -userdict /cid_extensions known -dup { cid_extensions /cid_UpdateDB known and } if - { - cid_extensions - begin - /cid_GetCIDSystemInfo - { - 1 index type /stringtype eq - { exch cvn exch } - if - cid_extensions - begin - dup load 2 index known - { - 2 copy - cid_GetStatusInfo - dup null ne - { - 1 index load - 3 index get - dup null eq - { pop pop cid_UpdateDB } - { - exch - 1 index /Created get eq - { exch pop exch pop } - { pop cid_UpdateDB } - ifelse - } - ifelse - } - { pop cid_UpdateDB } - ifelse - } - { cid_UpdateDB } - ifelse - end - } bind def - end - } -if -ct_Level2? - { end setglobal } -if - /ct_UseNativeCapability? systemdict /composefont known def - /ct_MakeOCF 35 dict def - /ct_Vars 25 dict def - /ct_GlyphDirProcs 6 dict def - /ct_BuildCharDict 15 dict dup - begin - /charcode 2 string def - /dst_string 1500 string def - /nullstring () def - /usewidths? true def - end def - ct_Level2? { setglobal } { pop } ifelse - ct_GlyphDirProcs - begin - /GetGlyphDirectory - { - systemdict /languagelevel known - { pop /CIDFont findresource /GlyphDirectory get } - { - 1 index /CIDFont findresource /GlyphDirectory - get dup type /dicttype eq - { - dup dup maxlength exch length sub 2 index lt - { - dup length 2 index add dict copy 2 index - /CIDFont findresource/GlyphDirectory 2 index put - } - if - } - if - exch pop exch pop - } - ifelse - + - } def - /+ - { - systemdict /languagelevel known - { - currentglobal false setglobal - 3 dict begin - /vm exch def - } - { 1 dict begin } - ifelse - /$ exch def - systemdict /languagelevel known - { - vm setglobal - /gvm currentglobal def - $ gcheck setglobal - } - if - ? { $ begin } if - } def - /? { $ type /dicttype eq } def - /| { - userdict /Adobe_CoolType_Data known - { - Adobe_CoolType_Data /AddWidths? known - { - currentdict Adobe_CoolType_Data - begin - begin - AddWidths? - { - Adobe_CoolType_Data /CC 3 index put - ? { def } { $ 3 1 roll put } ifelse - CC charcode exch 1 index 0 2 index 256 idiv put - 1 index exch 1 exch 256 mod put - stringwidth 2 array astore - currentfont /Widths get exch CC exch put - } - { ? { def } { $ 3 1 roll put } ifelse } - ifelse - end - end - } - { ? { def } { $ 3 1 roll put } ifelse } ifelse - } - { ? { def } { $ 3 1 roll put } ifelse } - ifelse - } def - /! - { - ? { end } if - systemdict /languagelevel known - { gvm setglobal } - if - end - } def - /: { string currentfile exch readstring pop } executeonly def - end - ct_MakeOCF - begin - /ct_cHexEncoding - [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 - /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 - /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 - /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B - /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E - /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 - /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 - /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 - /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA - /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD - /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 - /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 - /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 - /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def - /ct_CID_STR_SIZE 8000 def - /ct_mkocfStr100 100 string def - /ct_defaultFontMtx [.001 0 0 .001 0 0] def - /ct_1000Mtx [1000 0 0 1000 0 0] def - /ct_raise {exch cvx exch errordict exch get exec stop} bind def - /ct_reraise - { cvx $error /errorname get (Error: ) print dup ( ) cvs print - errordict exch get exec stop - } bind def - /ct_cvnsi - { - 1 index add 1 sub 1 exch 0 4 1 roll - { - 2 index exch get - exch 8 bitshift - add - } - for - exch pop - } bind def - /ct_GetInterval - { - Adobe_CoolType_Utility /ct_BuildCharDict get - begin - /dst_index 0 def - dup dst_string length gt - { dup string /dst_string exch def } - if - 1 index ct_CID_STR_SIZE idiv - /arrayIndex exch def - 2 index arrayIndex get - 2 index - arrayIndex ct_CID_STR_SIZE mul - sub - { - dup 3 index add 2 index length le - { - 2 index getinterval - dst_string dst_index 2 index putinterval - length dst_index add /dst_index exch def - exit - } - { - 1 index length 1 index sub - dup 4 1 roll - getinterval - dst_string dst_index 2 index putinterval - pop dup dst_index add /dst_index exch def - sub - /arrayIndex arrayIndex 1 add def - 2 index dup length arrayIndex gt - { arrayIndex get } - { - pop - exit - } - ifelse - 0 - } - ifelse - } - loop - pop pop pop - dst_string 0 dst_index getinterval - end - } bind def - ct_Level2? - { - /ct_resourcestatus - currentglobal mark true setglobal - { /unknowninstancename /Category resourcestatus } - stopped - { cleartomark setglobal true } - { cleartomark currentglobal not exch setglobal } - ifelse - { - { - mark 3 1 roll /Category findresource - begin - ct_Vars /vm currentglobal put - ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec - { cleartomark false } - { { 3 2 roll pop true } { cleartomark false } ifelse } - ifelse - ct_Vars /vm get setglobal - end - } - } - { { resourcestatus } } - ifelse bind def - /CIDFont /Category ct_resourcestatus - { pop pop } - { - currentglobal true setglobal - /Generic /Category findresource - dup length dict copy - dup /InstanceType /dicttype put - /CIDFont exch /Category defineresource pop - setglobal - } - ifelse - ct_UseNativeCapability? - { - /CIDInit /ProcSet findresource begin - 12 dict begin - begincmap - /CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def - end def - /CMapName /Identity-H def - /CMapVersion 1.000 def - /CMapType 1 def - 1 begincodespacerange - <0000> - endcodespacerange - 1 begincidrange - <0000> 0 - endcidrange - endcmap - CMapName currentdict /CMap defineresource pop - end - end - } - if - } - { - /ct_Category 2 dict begin - /CIDFont 10 dict def - /ProcSet 2 dict def - currentdict - end - def - /defineresource - { - ct_Category 1 index 2 copy known - { - get - dup dup maxlength exch length eq - { - dup length 10 add dict copy - ct_Category 2 index 2 index put - } - if - 3 index 3 index put - pop exch pop - } - { pop pop /defineresource /undefined ct_raise } - ifelse - } bind def - /findresource - { - ct_Category 1 index 2 copy known - { - get - 2 index 2 copy known - { get 3 1 roll pop pop} - { pop pop /findresource /undefinedresource ct_raise } - ifelse - } - { pop pop /findresource /undefined ct_raise } - ifelse - } bind def - /resourcestatus - { - ct_Category 1 index 2 copy known - { - get - 2 index known - exch pop exch pop - { - 0 -1 true - } - { - false - } - ifelse - } - { pop pop /findresource /undefined ct_raise } - ifelse - } bind def - /ct_resourcestatus /resourcestatus load def - } - ifelse - /ct_CIDInit 2 dict - begin - /ct_cidfont_stream_init - { - { - dup (Binary) eq - { - pop - null - currentfile - ct_Level2? - { - { cid_BYTE_COUNT () /SubFileDecode filter } - stopped - { pop pop pop } - if - } - if - /readstring load - exit - } - if - dup (Hex) eq - { - pop - currentfile - ct_Level2? - { - { null exch /ASCIIHexDecode filter /readstring } - stopped - { pop exch pop (>) exch /readhexstring } - if - } - { (>) exch /readhexstring } - ifelse - load - exit - } - if - /StartData /typecheck ct_raise - } - loop - cid_BYTE_COUNT ct_CID_STR_SIZE le - { - 2 copy cid_BYTE_COUNT string exch exec - pop - 1 array dup - 3 -1 roll - 0 exch put - } - { - cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi - dup array exch 2 sub 0 exch 1 exch - { - 2 copy - 5 index - ct_CID_STR_SIZE - string - 6 index exec - pop - put - pop - } - for - 2 index - cid_BYTE_COUNT ct_CID_STR_SIZE mod string - 3 index exec - pop - 1 index exch - 1 index length 1 sub - exch put - } - ifelse - cid_CIDFONT exch /GlyphData exch put - 2 index null eq - { - pop pop pop - } - { - pop /readstring load - 1 string exch - { - 3 copy exec - pop - dup length 0 eq - { - pop pop pop pop pop - true exit - } - if - 4 index - eq - { - pop pop pop pop - false exit - } - if - } - loop - pop - } - ifelse - } bind def - /StartData - { - mark - { - currentdict - dup /FDArray get 0 get /FontMatrix get - 0 get 0.001 eq - { - dup /CDevProc known not - { - /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known - { get } - { - pop pop - { pop pop pop pop pop 0 -1000 7 index 2 div 880 } - } - ifelse - def - } - if - } - { - /CDevProc - { - pop pop pop pop pop - 0 - 1 cid_temp /cid_CIDFONT get - /FDArray get 0 get - /FontMatrix get 0 get div - 7 index 2 div - 1 index 0.88 mul - } def - } - ifelse - /cid_temp 15 dict def - cid_temp - begin - /cid_CIDFONT exch def - 3 copy pop - dup /cid_BYTE_COUNT exch def 0 gt - { - ct_cidfont_stream_init - FDArray - { - /Private get - dup /SubrMapOffset known - { - begin - /Subrs SubrCount array def - Subrs - SubrMapOffset - SubrCount - SDBytes - ct_Level2? - { - currentdict dup /SubrMapOffset undef - dup /SubrCount undef - /SDBytes undef - } - if - end - /cid_SD_BYTES exch def - /cid_SUBR_COUNT exch def - /cid_SUBR_MAP_OFFSET exch def - /cid_SUBRS exch def - cid_SUBR_COUNT 0 gt - { - GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval - 0 cid_SD_BYTES ct_cvnsi - 0 1 cid_SUBR_COUNT 1 sub - { - exch 1 index - 1 add - cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add - GlyphData exch cid_SD_BYTES ct_GetInterval - 0 cid_SD_BYTES ct_cvnsi - cid_SUBRS 4 2 roll - GlyphData exch - 4 index - 1 index - sub - ct_GetInterval - dup length string copy put - } - for - pop - } - if - } - { pop } - ifelse - } - forall - } - if - cleartomark pop pop - end - CIDFontName currentdict /CIDFont defineresource pop - end end - } - stopped - { cleartomark /StartData ct_reraise } - if - } bind def - currentdict - end def - /ct_saveCIDInit - { - /CIDInit /ProcSet ct_resourcestatus - { true } - { /CIDInitC /ProcSet ct_resourcestatus } - ifelse - { - pop pop - /CIDInit /ProcSet findresource - ct_UseNativeCapability? - { pop null } - { /CIDInit ct_CIDInit /ProcSet defineresource pop } - ifelse - } - { /CIDInit ct_CIDInit /ProcSet defineresource pop null } - ifelse - ct_Vars exch /ct_oldCIDInit exch put - } bind def - /ct_restoreCIDInit - { - ct_Vars /ct_oldCIDInit get dup null ne - { /CIDInit exch /ProcSet defineresource pop } - { pop } - ifelse - } bind def - /ct_BuildCharSetUp - { - 1 index - begin - CIDFont - begin - Adobe_CoolType_Utility /ct_BuildCharDict get - begin - /ct_dfCharCode exch def - /ct_dfDict exch def - CIDFirstByte ct_dfCharCode add - dup CIDCount ge - { pop 0 } - if - /cid exch def - { - GlyphDirectory cid 2 copy known - { get } - { pop pop nullstring } - ifelse - dup length FDBytes sub 0 gt - { - dup - FDBytes 0 ne - { 0 FDBytes ct_cvnsi } - { pop 0 } - ifelse - /fdIndex exch def - dup length FDBytes sub FDBytes exch getinterval - /charstring exch def - exit - } - { - pop - cid 0 eq - { /charstring nullstring def exit } - if - /cid 0 def - } - ifelse - } - loop - } def - /ct_SetCacheDevice - { - 0 0 moveto - dup stringwidth - 3 -1 roll - true charpath - pathbbox - 0 -1000 - 7 index 2 div 880 - setcachedevice2 - 0 0 moveto - } def - /ct_CloneSetCacheProc - { - 1 eq - { - stringwidth - pop -2 div -880 - 0 -1000 setcharwidth - moveto - } - { - usewidths? - { - currentfont /Widths get cid - 2 copy known - { get exch pop aload pop } - { pop pop stringwidth } - ifelse - } - { stringwidth } - ifelse - setcharwidth - 0 0 moveto - } - ifelse - } def - /ct_Type3ShowCharString - { - ct_FDDict fdIndex 2 copy known - { get } - { - currentglobal 3 1 roll - 1 index gcheck setglobal - ct_Type1FontTemplate dup maxlength dict copy - begin - FDArray fdIndex get - dup /FontMatrix 2 copy known - { get } - { pop pop ct_defaultFontMtx } - ifelse - /FontMatrix exch dup length array copy def - /Private get - /Private exch def - /Widths rootfont /Widths get def - /CharStrings 1 dict dup /.notdef - dup length string copy put def - currentdict - end - /ct_Type1Font exch definefont - dup 5 1 roll put - setglobal - } - ifelse - dup /CharStrings get 1 index /Encoding get - ct_dfCharCode get charstring put - rootfont /WMode 2 copy known - { get } - { pop pop 0 } - ifelse - exch - 1000 scalefont setfont - ct_str1 0 ct_dfCharCode put - ct_str1 exch ct_dfSetCacheProc - ct_SyntheticBold - { - currentpoint - ct_str1 show - newpath - moveto - ct_str1 true charpath - ct_StrokeWidth setlinewidth - stroke - } - { ct_str1 show } - ifelse - } def - /ct_Type4ShowCharString - { - ct_dfDict ct_dfCharCode charstring - FDArray fdIndex get - dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not - { ct_1000Mtx matrix concatmatrix concat } - { pop } - ifelse - /Private get - Adobe_CoolType_Utility /ct_Level2? get not - { - ct_dfDict /Private - 3 -1 roll - { put } - 1183615869 internaldict /superexec get exec - } - if - 1183615869 internaldict - Adobe_CoolType_Utility /ct_Level2? get - { 1 index } - { 3 index /Private get mark 6 1 roll } - ifelse - dup /RunInt known - { /RunInt get } - { pop /CCRun } - ifelse - get exec - Adobe_CoolType_Utility /ct_Level2? get not - { cleartomark } - if - } bind def - /ct_BuildCharIncremental - { - { - Adobe_CoolType_Utility /ct_MakeOCF get begin - ct_BuildCharSetUp - ct_ShowCharString - } - stopped - { stop } - if - end - end - end - end - } bind def - /BaseFontNameStr (BF00) def - /ct_Type1FontTemplate 14 dict - begin - /FontType 1 def - /FontMatrix [0.001 0 0 0.001 0 0] def - /FontBBox [-250 -250 1250 1250] def - /Encoding ct_cHexEncoding def - /PaintType 0 def - currentdict - end def - /BaseFontTemplate 11 dict - begin - /FontMatrix [0.001 0 0 0.001 0 0] def - /FontBBox [-250 -250 1250 1250] def - /Encoding ct_cHexEncoding def - /BuildChar /ct_BuildCharIncremental load def - ct_Clone? - { - /FontType 3 def - /ct_ShowCharString /ct_Type3ShowCharString load def - /ct_dfSetCacheProc /ct_CloneSetCacheProc load def - /ct_SyntheticBold false def - /ct_StrokeWidth 1 def - } - { - /FontType 4 def - /Private 1 dict dup /lenIV 4 put def - /CharStrings 1 dict dup /.notdef put def - /PaintType 0 def - /ct_ShowCharString /ct_Type4ShowCharString load def - } - ifelse - /ct_str1 1 string def - currentdict - end def - /BaseFontDictSize BaseFontTemplate length 5 add def - /ct_matrixeq - { - true 0 1 5 - { - dup 4 index exch get exch 3 index exch get eq and - dup not - { exit } - if - } - for - exch pop exch pop - } bind def - /ct_makeocf - { - 15 dict - begin - exch /WMode exch def - exch /FontName exch def - /FontType 0 def - /FMapType 2 def - dup /FontMatrix known - { dup /FontMatrix get /FontMatrix exch def } - { /FontMatrix matrix def } - ifelse - /bfCount 1 index /CIDCount get 256 idiv 1 add - dup 256 gt { pop 256} if def - /Encoding - 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for - bfCount 1 255 { 2 copy bfCount put pop } for - def - /FDepVector bfCount dup 256 lt { 1 add } if array def - BaseFontTemplate BaseFontDictSize dict copy - begin - /CIDFont exch def - CIDFont /FontBBox known - { CIDFont /FontBBox get /FontBBox exch def } - if - CIDFont /CDevProc known - { CIDFont /CDevProc get /CDevProc exch def } - if - currentdict - end - BaseFontNameStr 3 (0) putinterval - 0 1 bfCount dup 256 eq { 1 sub } if - { - FDepVector exch - 2 index BaseFontDictSize dict copy - begin - dup /CIDFirstByte exch 256 mul def - FontType 3 eq - { /ct_FDDict 2 dict def } - if - currentdict - end - 1 index 16 - BaseFontNameStr 2 2 getinterval cvrs pop - BaseFontNameStr exch definefont - put - } - for - ct_Clone? - { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } - if - FontName - currentdict - end - definefont - ct_Clone? - { - gsave - dup 1000 scalefont setfont - ct_BuildCharDict - begin - /usewidths? false def - currentfont /Widths get - begin - exch /CIDFont get /GlyphDirectory get - { - pop - dup charcode exch 1 index 0 2 index 256 idiv put - 1 index exch 1 exch 256 mod put - stringwidth 2 array astore def - } - forall - end - /usewidths? true def - end - grestore - } - { exch pop } - ifelse - } bind def - /ct_ComposeFont - { - ct_UseNativeCapability? - { - 2 index /CMap ct_resourcestatus - { pop pop exch pop } - { - /CIDInit /ProcSet findresource - begin - 12 dict - begin - begincmap - /CMapName 3 index def - /CMapVersion 1.000 def - /CMapType 1 def - exch /WMode exch def - /CIDSystemInfo 3 dict dup - begin - /Registry (Adobe) def - /Ordering - CMapName ct_mkocfStr100 cvs - (Adobe-) search - { - pop pop - (-) search - { - dup length string copy - exch pop exch pop - } - { pop (Identity)} - ifelse - } - { pop (Identity) } - ifelse - def - /Supplement 0 def - end def - 1 begincodespacerange - <0000> - endcodespacerange - 1 begincidrange - <0000> 0 - endcidrange - endcmap - CMapName currentdict /CMap defineresource pop - end - end - } - ifelse - composefont - } - { - 3 2 roll pop - 0 get /CIDFont findresource - ct_makeocf - } - ifelse - } bind def - /ct_MakeIdentity - { - ct_UseNativeCapability? - { - 1 index /CMap ct_resourcestatus - { pop pop } - { - /CIDInit /ProcSet findresource begin - 12 dict begin - begincmap - /CMapName 2 index def - /CMapVersion 1.000 def - /CMapType 1 def - /CIDSystemInfo 3 dict dup - begin - /Registry (Adobe) def - /Ordering - CMapName ct_mkocfStr100 cvs - (Adobe-) search - { - pop pop - (-) search - { dup length string copy exch pop exch pop } - { pop (Identity) } - ifelse - } - { pop (Identity) } - ifelse - def - /Supplement 0 def - end def - 1 begincodespacerange - <0000> - endcodespacerange - 1 begincidrange - <0000> 0 - endcidrange - endcmap - CMapName currentdict /CMap defineresource pop - end - end - } - ifelse - composefont - } - { - exch pop - 0 get /CIDFont findresource - ct_makeocf - } - ifelse - } bind def - currentdict readonly pop - end - end -%%EndResource -%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 -%%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. -%%Version: 1.0 0 -userdict /ct_T42Dict 15 dict put -ct_T42Dict begin -/Is2015? -{ - version - cvi - 2015 - ge -} bind def -/AllocGlyphStorage -{ - Is2015? - { - pop - } - { - {string} forall - } ifelse -} bind def -/Type42DictBegin -{ - 25 dict begin - /FontName exch def - /CharStrings 256 dict - begin - /.notdef 0 def - currentdict - end def - /Encoding exch def - /PaintType 0 def - /FontType 42 def - /FontMatrix [1 0 0 1 0 0] def - 4 array astore cvx /FontBBox exch def - /sfnts -} bind def -/Type42DictEnd -{ - currentdict dup /FontName get exch definefont end - ct_T42Dict exch - dup /FontName get exch put -} bind def -/RD {string currentfile exch readstring pop} executeonly def -/PrepFor2015 + {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if +}def +/end_feature { - Is2015? - { - /GlyphDirectory - 16 - dict def - sfnts 0 get - dup - 2 index - (glyx) - putinterval - 2 index - (locx) - putinterval - pop - pop - } - { - pop - pop - } ifelse -} bind def -/AddT42Char + 2 dict begin + /spd/setpagedevice load def + /setpagedevice{get_gstate spd set_gstate}def + stopped{$error/newerror false put}if + end + count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse + countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse + {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if +}def +/set_negative { - Is2015? + //Adobe_AGM_Core begin + /AGMCORE_inverting exch def + level2{ + currentpagedevice/NegativePrint known AGMCORE_distilling not and{ + currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{ + true begin_feature true{ + <>setpagedevice + }end_feature + }if + /AGMCORE_inverting false def + }if + }if + AGMCORE_inverting{ + [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer + AGMCORE_distilling{ + erasepage + }{ + gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse + /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore + }ifelse + }if + end +}def +/lw_save_restore_override{ + /md where{ + pop + md begin + initializepage + /initializepage{}def + /pmSVsetup{}def + /endp{}def + /pse{}def + /psb{}def + /orig_showpage where + {pop} + {/orig_showpage/showpage load def} + ifelse + /showpage{orig_showpage gR}def + end + }if +}def +/pscript_showpage_override{ + /NTPSOct95 where { - /GlyphDirectory get begin - def + showpage + save + /showpage/restore load def + /restore{exch pop}def end + }if +}def +/driver_media_override +{ + /md where{ pop - pop - } - { - /sfnts get - 4 index - get - 3 index - 2 index - putinterval - pop - pop - pop - pop - } ifelse -} bind def + md/initializepage known{ + md/initializepage{}put + }if + md/rC known{ + md/rC{4{pop}repeat}put + }if + }if + /mysetup where{ + /mysetup[1 0 0 1 0 0]put + }if + Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put + level2 + {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if +}def +/driver_check_media_override +{ + /PrepsDict where + {pop} + { + Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne + Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and + Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and + }if + { + Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix + }if + }ifelse +}def +AGMCORE_err_strings begin + /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def + /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def + /AGMCORE_invalid_color_space(This job contains an invalid color space. )def +end +/set_def_ht +{AGMCORE_def_ht sethalftone}def +/set_def_flat +{AGMCORE_Default_flatness setflat}def end +systemdict/setpacking known +{setpacking}if %%EndResource -Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end -%%BeginResource: procset Adobe_AGM_Image 1.0 0 +%%BeginResource: procset Adobe_CoolType_Core 2.31 0 %%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.31 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def} if userdict/Adobe_CoolType_Core 70 dict dup begin put /Adobe_CoolType_Version 2.31 def /Level2? systemdict/languagelevel known dup {pop systemdict/languagelevel get 2 ge} if def Level2? not { /currentglobal false def /setglobal/pop load def /gcheck{pop false}bind def /currentpacking false def /setpacking/pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict/Adobe_CoolType_Data 2 copy known not {2 copy 10 dict put} if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal currentglobal true setglobal userdict/Adobe_CoolType_GVMFonts known not {userdict/Adobe_CoolType_GVMFonts 10 dict put} if setglobal currentglobal false setglobal userdict/Adobe_CoolType_LVMFonts known not {userdict/Adobe_CoolType_LVMFonts 10 dict put} if setglobal /ct_VMDictPut { dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse 3 1 roll put }bind def /ct_VMDictUndef { dup Adobe_CoolType_GVMFonts exch known {Adobe_CoolType_GVMFonts exch undef} { dup Adobe_CoolType_LVMFonts exch known {Adobe_CoolType_LVMFonts exch undef} {pop} ifelse }ifelse }bind def /ct_str1 1 string def /ct_xshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { _ct_x _ct_y moveto 0 rmoveto } ifelse /_ct_i _ct_i 1 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /ct_yshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { _ct_x _ct_y moveto 0 exch rmoveto } ifelse /_ct_i _ct_i 1 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /ct_xyshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { {_ct_na _ct_i 1 add get}stopped {pop pop pop} { _ct_x _ct_y moveto rmoveto } ifelse } ifelse /_ct_i _ct_i 2 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def /ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def /xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def currentglobal true setglobal /ct_T3Defs { /BuildChar { 1 index/Encoding get exch get 1 index/BuildGlyph get exec }bind def /BuildGlyph { exch begin GlyphProcs exch get exec end }bind def }bind def setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup/args 7 index 5 add array put put get } { get dup/args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch/args exch put } {pop} ifelse } ifelse begin count 1 sub 1 index lt {pop count} if dup/argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } {pop} ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end }bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt {{pop}repeat} {pop} ifelse args 0 argCount getinterval{}forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt {{end}repeat} {pop} ifelse }bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end }bind def /@Raise { exch cvx exch errordict exch get exec stop }bind def /@ReRaise { cvx $error/errorname get errordict exch get exec stop }bind def /@Stopped { 0 @#Stopped }bind def /@#Stopped { @_SaveStackLevels stopped {@_RestoreStackLevels true} {@_PopStackLevels false} ifelse }bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end }bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put begin count @_SaveStackLevels {(*){pop stop}128 string/Category resourceforall} stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq {pop exit} if } loop } if } { pop end } ifelse } {false} ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark {/steveamerige/Category resourcestatus} stopped {cleartomark true} {cleartomark currentglobal not} ifelse } {false} ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec {cleartomark false} {{3 2 roll pop true}{cleartomark false}ifelse} ifelse end }bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad/ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup/CMap CTHasResourceStatusBug {CTResourceStatus} {resourcestatus} ifelse { pop dup 0 eq exch 1 eq or { dup/CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug {exit} {stop} ifelse } ifelse } {pop} ifelse } 128 string/CMap resourceforall } stopped {cleartomark} stopped pop setglobal } if } if }bind def /ds { Adobe_CoolType_Core begin CTWorkAroundBugs /mo/moveto load def /nf/newencodedfont load def /msf{makefont setfont}bind def /uf{dup undefinefont ct_VMDictUndef}bind def /ur/undefineresource load def /chp/charpath load def /awsh/awidthshow load def /wsh/widthshow load def /ash/ashow load def /@xshow/xshow load def /@yshow/yshow load def /@xyshow/xyshow load def /@cshow/cshow load def /sh/show load def /rp/repeat load def /.n/.notdef def end currentglobal false setglobal userdict/Adobe_CoolType_Data 2 copy known not {2 copy 10 dict put} if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal }bind def /dt { currentdict Adobe_CoolType_Core eq {end} if }bind def /ps { Adobe_CoolType_Core begin Adobe_CoolType_GVMFonts begin Adobe_CoolType_LVMFonts begin SharedFontDirectory begin }bind def /pt { end end end end }bind def /unload { systemdict/languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known {undef} {pop pop} ifelse } if } if }bind def /ndf { 1 index where {pop pop pop} {dup xcheck{bind}if def} ifelse }def /findfont systemdict begin userdict begin /globaldict where{/globaldict get begin}if dup where pop exch get /globaldict where{pop end}if end end Adobe_CoolType_Core_Defined {/systemfindfont exch def} { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont {pop}ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq{0}{dup length}ifelse 2 index length add 1 add dict begin exch { 1 index/FID eq {pop pop} {def} ifelse } forall dup null eq {pop} {{def}forall} ifelse currentdict end exch setglobal }bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal }bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known {SharedFontDirectory 3 index get/FontReferenced known} {false} ifelse } { FontDirectory 3 index known {FontDirectory 3 index get/FontReferenced known} { SharedFontDirectory 3 index known {SharedFontDirectory 3 index get/FontReferenced known} {false} ifelse } ifelse } ifelse dup { 3 index findfont/FontReferenced get 2 index dup type/nametype eq {findfont} if ne {pop false} if } if dup { 1 index dup type/nametype eq {findfont} if dup/CharStrings known { /CharStrings get length 4 index findfont/CharStrings get length ne { pop false } if } {pop} ifelse } if { pop 1 index findfont /Encoding get exch 0 1 255 {2 copy get 3 index 3 1 roll put} for pop pop pop } { currentglobal 4 1 roll dup type/nametype eq {findfont} if dup gcheck setglobal dup dup maxlength 2 add dict begin exch { 1 index/FID ne 2 index/Encoding ne and {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type/stringtype eq{cvn}if def dup currentdict end definefont ct_VMDictPut setglobal } ifelse }bind def /SetSubstituteStrategy { $SubstituteFont begin dup type/dicttype ne {0 dict} if currentdict/$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin {def}forall {def}forall currentdict dup/$Init known {dup/$Init get exec} if end /$Strategy exch def } {pop pop pop} ifelse } {pop pop} ifelse end }bind def /scff { $SubstituteFont begin dup type/stringtype eq {dup length exch} {null} ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } {$sname} ifelse def end {findfont} @Stopped { dup length 8 add string exch 1 index 0(BadFont:)putinterval 1 index exch 8 exch dup length string cvs putinterval cvn {findfont} @Stopped {pop/Courier findfont} if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end }bind def /isWidthsOnlyFont { dup/WidthsOnly known {pop pop true} { dup/FDepVector known {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall} { dup/FDArray known {/FDArray get{isWidthsOnlyFont dup{exit}if}forall} {pop} ifelse } ifelse } ifelse }bind def /ct_StyleDicts 4 dict dup begin /Adobe-Japan1 4 dict dup begin Level2? { /Serif /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiMin-W3} { /CIDFont/Category resourcestatus { pop pop /HeiseiMin-W3/CIDFont resourcestatus {pop pop/HeiseiMin-W3} {/Ryumin-Light} ifelse } {/Ryumin-Light} ifelse } ifelse def /SansSerif /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiKakuGo-W5} { /CIDFont/Category resourcestatus { pop pop /HeiseiKakuGo-W5/CIDFont resourcestatus {pop pop/HeiseiKakuGo-W5} {/GothicBBB-Medium} ifelse } {/GothicBBB-Medium} ifelse } ifelse def /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiMaruGo-W4} { /CIDFont/Category resourcestatus { pop pop /HeiseiMaruGo-W4/CIDFont resourcestatus {pop pop/HeiseiMaruGo-W4} { /Jun101-Light-RKSJ-H/Font resourcestatus {pop pop/Jun101-Light} {SansSerif} ifelse } ifelse } { /Jun101-Light-RKSJ-H/Font resourcestatus {pop pop/Jun101-Light} {SansSerif} ifelse } ifelse } ifelse /RoundSansSerif exch def /Default Serif def } { /Serif/Ryumin-Light def /SansSerif/GothicBBB-Medium def { (fonts/Jun101-Light-83pv-RKSJ-H)status }stopped {pop}{ {pop pop pop pop/Jun101-Light} {SansSerif} ifelse /RoundSansSerif exch def }ifelse /Default Serif def } ifelse end def /Adobe-Korea1 4 dict dup begin /Serif/HYSMyeongJo-Medium def /SansSerif/HYGoThic-Medium def /RoundSansSerif SansSerif def /Default Serif def end def /Adobe-GB1 4 dict dup begin /Serif/STSong-Light def /SansSerif/STHeiti-Regular def /RoundSansSerif SansSerif def /Default Serif def end def /Adobe-CNS1 4 dict dup begin /Serif/MKai-Medium def /SansSerif/MHei-Medium def /RoundSansSerif SansSerif def /Default Serif def end def end def Level2?{currentglobal true setglobal}if /ct_BoldRomanWidthProc { stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth 0 0 }bind def /ct_Type0WidthProc { dup stringwidth 0 0 moveto 2 index true charpath pathbbox 0 -1 7 index 2 div .88 setcachedevice2 pop 0 0 }bind def /ct_Type0WMode1WidthProc { dup stringwidth pop 2 div neg -0.88 2 copy moveto 0 -1 5 -1 roll true charpath pathbbox setcachedevice }bind def /cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def /ct_BoldBaseFont 11 dict begin /FontType 3 def /FontMatrix[1 0 0 1 0 0]def /FontBBox[0 0 1 1]def /Encoding cHexEncoding def /_setwidthProc/ct_BoldRomanWidthProc load def /_bcstr1 1 string def /BuildChar { exch begin _basefont setfont _bcstr1 dup 0 4 -1 roll put dup _setwidthProc 3 copy moveto show _basefonto setfont moveto show end }bind def currentdict end def systemdict/composefont known { /ct_DefineIdentity-H { /Identity-H/CMap resourcestatus { pop pop } { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering(Identity)def /Supplement 0 def end def /CMapName/Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse } def /ct_BoldBaseCIDFont 11 dict begin /CIDFontType 1 def /CIDFontName/ct_BoldBaseCIDFont def /FontMatrix[1 0 0 1 0 0]def /FontBBox[0 0 1 1]def /_setwidthProc/ct_Type0WidthProc load def /_bcstr2 2 string def /BuildGlyph { exch begin _basefont setfont _bcstr2 1 2 index 256 mod put _bcstr2 0 3 -1 roll 256 idiv put _bcstr2 dup _setwidthProc 3 copy moveto show _basefonto setfont moveto show end }bind def currentdict end def }if Level2?{setglobal}if /ct_CopyFont{ { 1 index/FID ne 2 index/UniqueID ne and {def}{pop pop}ifelse }forall }bind def /ct_Type0CopyFont { exch dup length dict begin ct_CopyFont [ exch FDepVector { dup/FontType get 0 eq { 1 index ct_Type0CopyFont /_ctType0 exch definefont } { /_ctBaseFont exch 2 index exec } ifelse exch } forall pop ] /FDepVector exch def currentdict end }bind def /ct_MakeBoldFont { dup/ct_SyntheticBold known { dup length 3 add dict begin ct_CopyFont /ct_StrokeWidth .03 0 FontMatrix idtransform pop def /ct_SyntheticBold true def currentdict end definefont } { dup dup length 3 add dict begin ct_CopyFont /PaintType 2 def /StrokeWidth .03 0 FontMatrix idtransform pop def /dummybold currentdict end definefont dup/FontType get dup 9 ge exch 11 le and { ct_BoldBaseCIDFont dup length 3 add dict copy begin dup/CIDSystemInfo get/CIDSystemInfo exch def ct_DefineIdentity-H /_Type0Identity/Identity-H 3 -1 roll[exch]composefont /_basefont exch def /_Type0Identity/Identity-H 3 -1 roll[exch]composefont /_basefonto exch def currentdict end /CIDFont defineresource } { ct_BoldBaseFont dup length 3 add dict copy begin /_basefont exch def /_basefonto exch def currentdict end definefont } ifelse } ifelse }bind def /ct_MakeBold{ 1 index 1 index findfont currentglobal 5 1 roll dup gcheck setglobal dup /FontType get 0 eq { dup/WMode known{dup/WMode get 1 eq}{false}ifelse version length 4 ge and {version 0 4 getinterval cvi 2015 ge} {true} ifelse {/ct_Type0WidthProc} {/ct_Type0WMode1WidthProc} ifelse ct_BoldBaseFont/_setwidthProc 3 -1 roll load put {ct_MakeBoldFont}ct_Type0CopyFont definefont } { dup/_fauxfont known not 1 index/SubstMaster known not and { ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put ct_MakeBoldFont } { 2 index 2 index eq {exch pop } { dup length dict begin ct_CopyFont currentdict end definefont } ifelse } ifelse } ifelse pop pop pop setglobal }bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 1 index def /$doSmartSub false def end dup findfont $SubstituteFont begin $substituteFound {false} { dup/FontName known { dup/FontName get $fontname eq 1 index/DistillerFauxFont known not and /currentdistillerparams where {pop false 2 index isWidthsOnlyFont not and} if } {false} ifelse } ifelse exch pop /$doSmartSub true def end { 5 1 roll pop pop pop pop findfont } { 1 index findfont dup/FontType get 3 eq { 6 1 roll pop pop pop pop pop false } {pop true} ifelse { $SubstituteFont begin pop pop /$styleArray 1 index def /$regOrdering 2 index def pop pop 0 1 $styleArray length 1 sub { $styleArray exch get ct_StyleDicts $regOrdering 2 copy known { get exch 2 copy known not {pop/Default} if get dup type/nametype eq { ?str1 cvs length dup 1 add exch ?str1 exch(-)putinterval exch dup length exch ?str1 exch 3 index exch putinterval add ?str1 exch 0 exch getinterval cvn } { pop pop/Unknown } ifelse } { pop pop pop pop/Unknown } ifelse } for end findfont }if } ifelse currentglobal false setglobal 3 1 roll null copyfont definefont pop setglobal }bind def setpacking userdict/$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known {get} {pop pop{pop/Courier}bind} ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams/CannotEmbedFontPolicy 2 copy known {get/Error eq} {pop pop false} ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup/WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type/stringtype eq{cvn}if def /FontType 3 def /FontMatrix[.001 0 0 .001 0 0]def /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def /FontBBox[0 0 0 0]def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth/y exch def/x exch def x y setcharwidth $SubstituteFont/$Strategy get/$Underprint get exec 0 0 moveto cc show x y moveto end end }bind def currentdict end exch setglobal }bind def /$GetaTint 2 dict dup begin /$BuildFont { dup/WMode known {dup/WMode get} {0} ifelse /$WMode exch def $fontname exch dup/FontName known { dup/FontName get dup type/stringtype eq{cvn}if } {/unnamedfont} ifelse exch Adobe_CoolType_Data/InVMDeepCopiedFonts get 1 index/FontName get known { pop Adobe_CoolType_Data/InVMDeepCopiedFonts get 1 index get null copyfont } {$deepcopyfont} ifelse exch 1 index exch/FontBasedOn exch put dup/FontName $fontname dup type/stringtype eq{cvn}if put definefont Adobe_CoolType_Data/InVMDeepCopiedFonts get begin dup/FontBasedOn get 1 index def end }bind def /$Underprint { gsave x abs y abs gt {/y 1000 def} {/x -1000 def 500 120 translate} ifelse Level2? { [/Separation(All)/DeviceCMYK{0 0 0 1 pop}] setcolorspace } {0 setgray} ifelse 10 setlinewidth x .8 mul [7 3] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? {.2 setcolor} {.8 setgray} ifelse fill grestore stroke } forall pop grestore }bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict/FontName known { FontName dup type/stringtype eq{cvn}if } {/unnamedfont} ifelse def /FontName $fontname dup type/stringtype eq{cvn}if def /currentdistillerparams where {pop} { /FontInfo currentdict/FontInfo known {FontInfo null copyfont} {2 dict} ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [1 0 ItalicAngle dup sin exch cos div 1 0 0] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal }bind def end def /$None 1 dict dup begin /$BuildFont{}bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type/stringtype eq{cvn}if dup/$fontname exch def $sname null eq {$str cvs dup length $slen sub $slen getinterval} {pop $sname} ifelse $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval /$match false def $SubstituteFont/$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval {/$match exch def exit} $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont/$dstack get { exch { 1 index eq {pop false} {true} ifelse } {begin false} ifelse } forall pop } if cleartomark /$slen 0 def $match false ne {$match(fonts/)anchorsearch pop pop cvn} {/Courier} ifelse }bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [/Ryumin-Light/HeiseiMin-W3 /GothicBBB-Medium/HeiseiKakuGo-W5 /HeiseiMaruGo-W4/Jun101-Light]def /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def /GB1 [/STSong-Light/STHeiti-Regular]def /CNS1 [/MKai-Medium/MHei-Medium]def end def end def /$cmapname null def /$deepcopyfont { dup/FontType get 0 eq { 1 dict dup/FontName/copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup/FontName/copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } {$Strategies/$Type3Underprint get exec} ifelse }bind def /$buildfontname { dup/CIDFont findresource/CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index(-)putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy(-)putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch {pop pop 3 2 roll putinterval cvn/$cmapname exch def} {pop pop pop pop pop} ifelse length $str 1 index(-)putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn }bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known {get} {pop pop[]} ifelse } {pop pop[]} ifelse false exch { dup/CIDFont resourcestatus { pop pop save 1 index/CIDFont findresource dup/WidthsOnly known {dup/WidthsOnly get} {false} ifelse exch pop exch restore {pop} {exch pop true exit} ifelse } {pop} ifelse } forall {$str cvs $buildfontname} { false(*) { save exch dup/CIDFont findresource dup/WidthsOnly known {dup/WidthsOnly get not} {true} ifelse exch/CIDSystemInfo get dup/Registry get Registry eq exch/Ordering get Ordering eq and and {exch restore exch pop true exit} {pop restore} ifelse } $str/CIDFont resourceforall {$buildfontname} {$fontname $findfontByEnum} ifelse } ifelse }bind def end end currentdict/$error known currentdict/languagelevel known and dup {pop $error/SubstituteFont known} if dup {$error} {Adobe_CoolType_Core} ifelse begin { /SubstituteFont /CMap/Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq {dup $str cvs dup length $slen sub $slen getinterval cvn} {$sname} ifelse Adobe_CoolType_Data/InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known {exch pop true exit} {pop} ifelse } { FontDirectory 1 index known {exch pop true exit} { GlobalFontDirectory 1 index known {exch pop true exit} {pop} ifelse } ifelse } ifelse } forall } {pop pop false} ifelse { exch pop exch pop } { dup/CMap resourcestatus { pop pop dup/$cmapname exch def /CMap findresource/CIDSystemInfo get{def}forall $findfontByROS } { 128 string cvs dup(-)search { 3 1 roll search { 3 1 roll pop {dup cvi} stopped {pop pop pop pop pop $findfontByEnum} { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup/CMap resourcestatus { pop pop 4 1 roll pop pop pop dup/$cmapname exch def /CMap findresource/CIDSystemInfo get{def}forall $findfontByROS true exit } {pop} ifelse } for dup type/booleantype eq {pop} {pop pop pop $findfontByEnum} ifelse } ifelse } {pop pop pop $findfontByEnum} ifelse } {pop pop $findfontByEnum} ifelse } ifelse } ifelse } {//SubstituteFont exec} ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and {$findfontByEnum} {//SubstituteFont exec} ifelse end } } ifelse bind readonly def Adobe_CoolType_Core/scfindfont/systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup/FontName known {dup/FontName get dup 3 index ne} {/noname true} ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def/$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin {1 index/FID eq{pop pop}{def}ifelse} forall currentdict end definefont dup/FontName known{dup/FontName get}{null}ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using )print dup/FontName known {dup/FontName get}{(unspecified font)} ifelse $str cvs print(.\n)print } if } {exch pop} ifelse } {exch pop} ifelse end }bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core/findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type/stringtype ne{$str cvs}if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne {dup $inVMIndex $AddInVMFont} if $doSmartSub { currentdict/$Strategy known {$Strategy/$BuildFont get exec} if } if } if end }bind put } if } if end /$AddInVMFont { exch/FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data/InVMFontsByCMap get exch $DictAdd } {pop pop pop} ifelse }bind def /$DictAdd { 2 copy known not {2 copy 4 index length dict put} if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get{forall}def 2 copy currentdict put end } {pop} ifelse } if get begin {def} forall end }bind def end end %%EndResource currentglobal true setglobal %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 %%Copyright: Copyright 1987-2006 Adobe Systems Incorporated. %%Version: 1.23 0 systemdict/languagelevel known dup {currentglobal false setglobal} {false} ifelse exch userdict/Adobe_CoolType_Utility 2 copy known {2 copy get dup maxlength 27 add dict copy} {27 dict} ifelse put Adobe_CoolType_Utility begin /@eexecStartData def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch/eCCRun known not ct_Level2? and or def ct_Level2? {globaldict begin currentglobal true setglobal} if /ct_AddStdCIDMap ct_Level2? {{ mark Adobe_CoolType_Utility/@recognizeCIDFont currentdict put { ((Hex)57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility/@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq {1 index length exch sub 1 sub{end}repeat exit} {pop} ifelse } for pop pop Adobe_CoolType_Utility/@eexecStartData get eexec } {cleartomark} ifelse }} {{ Adobe_CoolType_Utility/@eexecStartData get eexec }} ifelse bind def userdict/cid_extensions known dup{cid_extensions/cid_UpdateDB known and}if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type/stringtype eq {exch cvn exch} if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq {pop pop cid_UpdateDB} { exch 1 index/Created get eq {exch pop exch pop} {pop cid_UpdateDB} ifelse } ifelse } {pop cid_UpdateDB} ifelse } {cid_UpdateDB} ifelse end }bind def end } if ct_Level2? {end setglobal} if /ct_UseNativeCapability? systemdict/composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring()def /usewidths? true def end def ct_Level2?{setglobal}{pop}ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict/languagelevel known {pop/CIDFont findresource/GlyphDirectory get} { 1 index/CIDFont findresource/GlyphDirectory get dup type/dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + }def /+ { systemdict/languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } {1 dict begin} ifelse /$ exch def systemdict/languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ?{$ begin}if }def /?{$ type/dicttype eq}def /|{ userdict/Adobe_CoolType_Data known { Adobe_CoolType_Data/AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data/CC 3 index put ?{def}{$ 3 1 roll put}ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont/Widths get exch CC exch put } {?{def}{$ 3 1 roll put}ifelse} ifelse end end } {?{def}{$ 3 1 roll put}ifelse} ifelse } {?{def}{$ 3 1 roll put}ifelse} ifelse }def /! { ?{end}if systemdict/languagelevel known {gvm setglobal} if end }def /:{string currentfile exch readstring pop}executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx[.001 0 0 .001 0 0]def /ct_1000Mtx[1000 0 0 1000 0 0]def /ct_raise{exch cvx exch errordict exch get exec stop}bind def /ct_reraise {cvx $error/errorname get(Error: )print dup( )cvs print errordict exch get exec stop }bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop }bind def /ct_GetInterval { Adobe_CoolType_Utility/ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt {dup string/dst_string exch def} if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add/dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add/dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt {arrayIndex get} { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end }bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal {/unknowninstancename/Category resourcestatus} stopped {cleartomark setglobal true} {cleartomark currentglobal not exch setglobal} ifelse { { mark 3 1 roll/Category findresource begin ct_Vars/vm currentglobal put ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec {cleartomark false} {{3 2 roll pop true}{cleartomark false}ifelse} ifelse ct_Vars/vm get setglobal end } } {{resourcestatus}} ifelse bind def /CIDFont/Category ct_resourcestatus {pop pop} { currentglobal true setglobal /Generic/Category findresource dup length dict copy dup/InstanceType/dicttype put /CIDFont exch/Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering(Identity)def /Supplement 0 def end def /CMapName/Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } {pop pop/defineresource/undefined ct_raise} ifelse }bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known {get 3 1 roll pop pop} {pop pop/findresource/undefinedresource ct_raise} ifelse } {pop pop/findresource/undefined ct_raise} ifelse }bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } {pop pop/findresource/undefined ct_raise} ifelse }bind def /ct_resourcestatus/resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup(Binary)eq { pop null currentfile ct_Level2? { {cid_BYTE_COUNT()/SubFileDecode filter} stopped {pop pop pop} if } if /readstring load exit } if dup(Hex)eq { pop currentfile ct_Level2? { {null exch/ASCIIHexDecode filter/readstring} stopped {pop exch pop(>)exch/readhexstring} if } {(>)exch/readhexstring} ifelse load exit } if /StartData/typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch/GlyphData exch put 2 index null eq { pop pop pop } { pop/readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse }bind def /StartData { mark { currentdict dup/FDArray get 0 get/FontMatrix get 0 get 0.001 eq { dup/CDevProc known not { /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known {get} { pop pop {pop pop pop pop pop 0 -1000 7 index 2 div 880} } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp/cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul }def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup/cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup/SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup/SubrMapOffset undef dup/SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } {pop} ifelse } forall } if cleartomark pop pop end CIDFontName currentdict/CIDFont defineresource pop end end } stopped {cleartomark/StartData ct_reraise} if }bind def currentdict end def /ct_saveCIDInit { /CIDInit/ProcSet ct_resourcestatus {true} {/CIDInitC/ProcSet ct_resourcestatus} ifelse { pop pop /CIDInit/ProcSet findresource ct_UseNativeCapability? {pop null} {/CIDInit ct_CIDInit/ProcSet defineresource pop} ifelse } {/CIDInit ct_CIDInit/ProcSet defineresource pop null} ifelse ct_Vars exch/ct_oldCIDInit exch put }bind def /ct_restoreCIDInit { ct_Vars/ct_oldCIDInit get dup null ne {/CIDInit exch/ProcSet defineresource pop} {pop} ifelse }bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility/ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge {pop 0} if /cid exch def { GlyphDirectory cid 2 copy known {get} {pop pop nullstring} ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne {0 FDBytes ct_cvnsi} {pop 0} ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq {/charstring nullstring def exit} if /cid 0 def } ifelse } loop }def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto }def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont/Widths get cid 2 copy known {get exch pop aload pop} {pop pop stringwidth} ifelse } {stringwidth} ifelse setcharwidth 0 0 moveto } ifelse }def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known {get} { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup/FontMatrix 2 copy known {get} {pop pop ct_defaultFontMtx} ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont/Widths get def /CharStrings 1 dict dup/.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup/CharStrings get 1 index/Encoding get ct_dfCharCode get charstring put rootfont/WMode 2 copy known {get} {pop pop 0} ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } {ct_str1 show} ifelse }def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not {ct_1000Mtx matrix concatmatrix concat} {pop} ifelse /Private get Adobe_CoolType_Utility/ct_Level2? get not { ct_dfDict/Private 3 -1 roll {put} 1183615869 internaldict/superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility/ct_Level2? get {1 index} {3 index/Private get mark 6 1 roll} ifelse dup/RunInt known {/RunInt get} {pop/CCRun} ifelse get exec Adobe_CoolType_Utility/ct_Level2? get not {cleartomark} if }bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility/ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped {stop} if end end end end }bind def /BaseFontNameStr(BF00)def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0]def /FontBBox [-250 -250 1250 1250]def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0]def /FontBBox [-250 -250 1250 1250]def /Encoding ct_cHexEncoding def /BuildChar/ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString/ct_Type3ShowCharString load def /ct_dfSetCacheProc/ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup/lenIV 4 put def /CharStrings 1 dict dup/.notdefput def /PaintType 0 def /ct_ShowCharString/ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not {exit} if } for exch pop exch pop }bind def /ct_makeocf { 15 dict begin exch/WMode exch def exch/FontName exch def /FontType 0 def /FMapType 2 def dup/FontMatrix known {dup/FontMatrix get/FontMatrix exch def} {/FontMatrix matrix def} ifelse /bfCount 1 index/CIDCount get 256 idiv 1 add dup 256 gt{pop 256}if def /Encoding 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for bfCount 1 255{2 copy bfCount put pop}for def /FDepVector bfCount dup 256 lt{1 add}if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont/FontBBox known {CIDFont/FontBBox get/FontBBox exch def} if CIDFont/CDevProc known {CIDFont/CDevProc get/CDevProc exch def} if currentdict end BaseFontNameStr 3(0)putinterval 0 1 bfCount dup 256 eq{1 sub}if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup/CIDFirstByte exch 256 mul def FontType 3 eq {/ct_FDDict 2 dict def} if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def} if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont/Widths get begin exch/CIDFont get/GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } {exch pop} ifelse }bind def currentglobal true setglobal /ct_ComposeFont { ct_UseNativeCapability? { 2 index/CMap ct_resourcestatus {pop pop exch pop} { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch/WMode exch def /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-)search { pop pop (-)search { dup length string copy exch pop exch pop } {pop(Identity)} ifelse } {pop (Identity)} ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get/CIDFont findresource ct_makeocf } ifelse }bind def setglobal /ct_MakeIdentity { ct_UseNativeCapability? { 1 index/CMap ct_resourcestatus {pop pop} { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-)search { pop pop (-)search {dup length string copy exch pop exch pop} {pop(Identity)} ifelse } {pop(Identity)} ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse composefont } { exch pop 0 get/CIDFont findresource ct_makeocf } ifelse }bind def currentdict readonly pop end end %%EndResource setglobal %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict/ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge }bind def /AllocGlyphStorage { Is2015? { pop } { {string}forall }ifelse }bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix[1 0 0 1 0 0]def 4 array astore cvx/FontBBox exch def /sfnts }bind def /Type42DictEnd { currentdict dup/FontName get exch definefont end ct_T42Dict exch dup/FontName get exch put }bind def /RD{string currentfile exch readstring pop}executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop }ifelse }bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop }ifelse }bind def /T0AddT42Mtx2 { /CIDFont findresource/Metrics2 get begin def end }bind def end %%EndResource currentglobal true setglobal %%BeginFile: MMFauxFont.prc %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. %%All Rights Reserved. userdict /ct_EuroDict 10 dict put ct_EuroDict begin /ct_CopyFont { { 1 index /FID ne {def} {pop pop} ifelse} forall } def /ct_GetGlyphOutline { gsave initmatrix newpath exch findfont dup length 1 add dict begin ct_CopyFont /Encoding Encoding dup length array copy dup 4 -1 roll 0 exch put def currentdict end /ct_EuroFont exch definefont 1000 scalefont setfont 0 0 moveto [ <00> stringwidth <00> false charpath pathbbox [ {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall grestore counttomark 8 add } def /ct_MakeGlyphProc { ] cvx /ct_PSBuildGlyph cvx ] cvx } def /ct_PSBuildGlyph { gsave 8 -1 roll pop 7 1 roll 6 -2 roll ct_FontMatrix transform 6 2 roll 4 -2 roll ct_FontMatrix transform 4 2 roll ct_FontMatrix transform currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse dup 9 1 roll { currentdict /StrokeWidth 2 copy known { get 2 div 0 ct_FontMatrix dtransform pop 5 1 roll 4 -1 roll 4 index sub 4 1 roll 3 -1 roll 4 index sub 3 1 roll exch 4 index add exch 4 index add 5 -1 roll pop } { pop pop } ifelse } if setcachedevice ct_FontMatrix concat ct_PSPathOps begin exec end { currentdict /StrokeWidth 2 copy known { get } { pop pop 0 } ifelse setlinewidth stroke } { fill } ifelse grestore } def /ct_PSPathOps 4 dict dup begin /m {moveto} def /l {lineto} def /c {curveto} def /cp {closepath} def end def /ct_matrix1000 [1000 0 0 1000 0 0] def /ct_AddGlyphProc { 2 index findfont dup length 4 add dict begin ct_CopyFont /CharStrings CharStrings dup length 1 add dict copy begin 3 1 roll def currentdict end def /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def /ct_PSBuildGlyph /ct_PSBuildGlyph load def /ct_PSPathOps /ct_PSPathOps load def currentdict end definefont pop } def systemdict /languagelevel known { /ct_AddGlyphToPrinterFont { 2 copy ct_GetGlyphOutline 3 add -1 roll restore ct_MakeGlyphProc ct_AddGlyphProc } def } { /ct_AddGlyphToPrinterFont { pop pop restore Adobe_CTFauxDict /$$$FONTNAME get /Euro Adobe_CTFauxDict /$$$SUBSTITUTEBASE get ct_EuroDict exch get ct_AddGlyphProc } def } ifelse /AdobeSansMM { 556 0 24 -19 541 703 { 541 628 m 510 669 442 703 354 703 c 201 703 117 607 101 444 c 50 444 l 25 372 l 97 372 l 97 301 l 49 301 l 24 229 l 103 229 l 124 67 209 -19 350 -19 c 435 -19 501 25 509 32 c 509 131 l 492 105 417 60 343 60 c 267 60 204 127 197 229 c 406 229 l 430 301 l 191 301 l 191 372 l 455 372 l 479 444 l 194 444 l 201 531 245 624 348 624 c 433 624 484 583 509 534 c cp 556 0 m } ct_PSBuildGlyph } def /AdobeSerifMM { 500 0 10 -12 484 692 { 347 298 m 171 298 l 170 310 170 322 170 335 c 170 362 l 362 362 l 374 403 l 172 403 l 184 580 244 642 308 642 c 380 642 434 574 457 457 c 481 462 l 474 691 l 449 691 l 433 670 429 657 410 657 c 394 657 360 692 299 692 c 204 692 94 604 73 403 c 22 403 l 10 362 l 70 362 l 69 352 69 341 69 330 c 69 319 69 308 70 298 c 22 298 l 10 257 l 73 257 l 97 57 216 -12 295 -12 c 364 -12 427 25 484 123 c 458 142 l 425 101 384 37 316 37 c 256 37 189 84 173 257 c 335 257 l cp 500 0 m } ct_PSBuildGlyph } def end %%EndFile setglobal Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 -%%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. -systemdict /setpacking known +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known { currentpacking true setpacking -} if -userdict /Adobe_AGM_Image 75 dict dup begin put -/Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def +}if +userdict/Adobe_AGM_Image 71 dict dup begin put +/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd -/AGMIMG_mbuf () def -/AGMIMG_ybuf () def -/AGMIMG_kbuf () def +/AGMIMG_mbuf()def +/AGMIMG_ybuf()def +/AGMIMG_kbuf()def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def @@ -5928,13 +3524,14 @@ userdict /Adobe_AGM_Image 75 dict dup begin put /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd +/AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd -/doc_setup +/ds { Adobe_AGM_Core begin Adobe_AGM_Image begin @@ -5942,15 +3539,15 @@ userdict /Adobe_AGM_Image 75 dict dup begin put /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop - /AGMIMG_&colorimage /colorimage ldf + /AGMIMG_&colorimage/colorimage ldf }if end end }def -/page_setup +/ps { Adobe_AGM_Image begin - /AGMIMG_ccimage_exists {/customcolorimage where + /AGMIMG_ccimage_exists{/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where @@ -5962,87 +3559,150 @@ userdict /Adobe_AGM_Image 75 dict dup begin put pop false }{ true - }ifelse - }ifelse + }ifelse + }ifelse }{ false - }ifelse + }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf - /Decode [ Decode 1 get Decode 0 get] def + /Decode[Decode 1 get Decode 0 get]def }def /knockout_image_samples { Operator/imagemask ne{ - /Decode [1 1] def + /Decode[1 1]def }if }def }{ /invert_image_samples { - {1 exch sub} currenttransfer addprocs settransfer + {1 exch sub}currenttransfer addprocs settransfer }def /knockout_image_samples { - { pop 1 } currenttransfer addprocs settransfer + {pop 1}currenttransfer addprocs settransfer }def }ifelse - /img /imageormask ldf - /sepimg /sep_imageormask ldf - /devnimg /devn_imageormask ldf - /idximg /indexed_imageormask ldf + /img/imageormask ldf + /sepimg/sep_imageormask ldf + /devnimg/devn_imageormask ldf + /idximg/indexed_imageormask ldf /_ctype 7 def currentdict{ - dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ bind }if def }forall }def -/page_trailer +/pt { end }def -/doc_trailer +/dt +{ +}def +/AGMIMG_flushfilters { + dup type/arraytype ne + {1 array astore}if + dup 0 get currentfile ne + {dup 0 get flushfile}if + { + dup type/filetype eq + { + dup status 1 index currentfile ne and + {closefile} + {pop} + ifelse + }{pop}ifelse + }forall }def +/AGMIMG_init_common +{ + currentdict/T known{/ImageType/T ldf currentdict/T undef}if + currentdict/W known{/Width/W ldf currentdict/W undef}if + currentdict/H known{/Height/H ldf currentdict/H undef}if + currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if + currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if + currentdict/D known{/Decode/D ldf currentdict/D undef}if + currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if + currentdict/O known{ + /Operator/O load 1 eq{ + /imagemask + }{ + /O load 2 eq{ + /image + }{ + /colorimage + }ifelse + }ifelse + def + currentdict/O undef + }if + currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if + currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if + currentdict/I known{/Interpolate/I ldf currentdict/I undef}if + currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if + /DataSource load xcheck not{ + DataSource type/arraytype eq{ + DataSource 0 get type/filetype eq{ + /_Filters DataSource def + currentdict/MultipleDataSources known not{ + /DataSource DataSource dup length 1 sub get def + }if + }if + }if + currentdict/MultipleDataSources known not{ + /MultipleDataSources DataSource type/arraytype eq{ + DataSource length 1 gt + } + {false}ifelse def + }if + }if + /NComponents Decode length 2 div def + currentdict/SkipImageProc known not{/SkipImageProc{false}def}if +}bdf /imageormask_sys { begin + AGMIMG_init_common save mark level2{ currentdict - Operator /imagemask eq{ + Operator/imagemask eq{ AGMIMG_&imagemask }{ - use_mask { - level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse + use_mask{ + process_mask AGMIMG_&image }{ AGMIMG_&image }ifelse }ifelse }{ Width Height - Operator /imagemask eq{ + Operator/imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and - ImageMatrix /DataSource load + ImageMatrix/DataSource load AGMIMG_&imagemask }{ - BitsPerComponent ImageMatrix /DataSource load + BitsPerComponent ImageMatrix/DataSource load AGMIMG_&image }ifelse }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if cleartomark restore end }def /overprint_plate { - currentoverprint { - 0 get dup type /nametype eq { - dup /DeviceGray eq{ + currentoverprint{ + 0 get dup type/nametype eq{ + dup/DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ @@ -6053,206 +3713,105 @@ userdict /Adobe_AGM_Image 75 dict dup begin put false exch { AGMOHS_sepink eq or - } forall + }forall not - } ifelse + }ifelse }{ pop false }ifelse }def -/process_mask_L3 +/process_mask { - dup begin - /ImageType 1 def - end - 4 dict begin - /DataDict exch def - /ImageType 3 def - /InterleaveType 3 def - /MaskDict 9 dict begin - /ImageType 1 def - /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def - /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def - /ImageMatrix [Width 0 0 Height neg 0 Height] def - /NComponents 1 def - /BitsPerComponent 1 def - /Decode [0 1] def - /DataSource AGMIMG_maskSource def - currentdict end def - currentdict end + level3{ + dup begin + /ImageType 1 def + end + 4 dict begin + /DataDict exch def + /ImageType 3 def + /InterleaveType 3 def + /MaskDict 9 dict begin + /ImageType 1 def + /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def + /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def + /ImageMatrix[Width 0 0 Height neg 0 Height]def + /NComponents 1 def + /BitsPerComponent 1 def + /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def + /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def + currentdict end def + currentdict end + }if }def /use_mask { - dup type /dicttype eq - { - dup /Mask known { - dup /Mask get { - level3 - {true} - { - dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch - dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse - 3 -1 roll and - } ifelse - } - {false} ifelse - } - {false} ifelse - } - {false} ifelse -}def -/make_line_source -{ - begin - MultipleDataSources { - [ - Decode length 2 div cvi {Width string} repeat - ] - }{ - Width Decode length 2 div mul cvi string - }ifelse - end -}def -/datasource_to_str -{ - exch dup type - dup /filetype eq { - pop exch readstring - }{ - /arraytype eq { - exec exch copy - }{ - pop - }ifelse - }ifelse - pop -}def -/masked_image_simulation -{ - 3 dict begin - dup make_line_source /line_source xdf - /mask_source AGMIMG_maskSource /LZWDecode filter def - dup /Width get 8 div ceiling cvi string /mask_str xdf - begin - gsave - 0 1 translate 1 -1 Height div scale - 1 1 Height { - pop - gsave - MultipleDataSources { - 0 1 DataSource length 1 sub { - dup DataSource exch get - exch line_source exch get - datasource_to_str - } for - }{ - DataSource line_source datasource_to_str - } ifelse - << - /PatternType 1 - /PaintProc [ - /pop cvx - << - /ImageType 1 - /Width Width - /Height 1 - /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix - /MultipleDataSources MultipleDataSources - /DataSource line_source - /BitsPerComponent BitsPerComponent - /Decode Decode - >> - /image cvx - ] cvx - /BBox [0 0 Width 1] - /XStep Width - /YStep 1 - /PaintType 1 - /TilingType 2 - >> - matrix makepattern set_pattern - << - /ImageType 1 - /Width Width - /Height 1 - /ImageMatrix Width 1 matrix scale - /MultipleDataSources false - /DataSource mask_source mask_str readstring pop - /BitsPerComponent 1 - /Decode [0 1] - >> - imagemask - grestore - 0 1 translate - } for - grestore - end - end + dup/Mask known {dup/Mask get}{false}ifelse }def /imageormask { begin - SkipImageProc { + AGMIMG_init_common + SkipImageProc{ currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict - Operator /imagemask eq DeviceN_PS2 not and { + Operator/imagemask eq DeviceN_PS2 not and{ imagemask }{ - AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ - [/Separation /Black /DeviceGray {}] setcolorspace - /Decode [ Decode 1 get Decode 0 get ] def + AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{ + [/Separation/Black/DeviceGray{}]setcolorspace + /Decode[Decode 1 get Decode 0 get]def }if - use_mask { - level3 {process_mask_L3 image}{masked_image_simulation}ifelse + use_mask{ + process_mask image }{ - DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and + DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { - Names convert_to_process not { + Names convert_to_process not{ 2 dict begin /imageDict xdf /names_index 0 def gsave - imageDict write_image_file { - Names { - dup (None) ne { - [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace + imageDict write_image_file{ + Names{ + dup(None)ne{ + [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace Operator imageDict read_image_file - names_index 0 eq {true setoverprint} if + names_index 0 eq{true setoverprint}if /names_index names_index 1 add def }{ pop - } ifelse - } forall + }ifelse + }forall close_image_file - } if + }if grestore end }{ - Operator /imagemask eq { + Operator/imagemask eq{ imagemask }{ image - } ifelse - } ifelse + }ifelse + }ifelse }{ - Operator /imagemask eq { + Operator/imagemask eq{ imagemask }{ image - } ifelse - } ifelse + }ifelse + }ifelse }ifelse }ifelse }{ Width Height - Operator /imagemask eq{ + Operator/imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and - ImageMatrix /DataSource load - /Adobe_AGM_OnHost_Seps where { + ImageMatrix/DataSource load + /Adobe_AGM_OnHost_Seps where{ pop imagemask }{ currentgray 1 ne{ @@ -6267,7 +3826,7 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse }ifelse }{ - BitsPerComponent ImageMatrix + BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get @@ -6275,38 +3834,43 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }{ /DataSource load }ifelse - Operator /colorimage eq{ + Operator/colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ - /DataSource [ - DataSource 0 get /exec cvx - DataSource 1 get /exec cvx - DataSource 2 get /exec cvx - DataSource 3 get /exec cvx + /DataSource DataSource 0 get xcheck + { + [ + DataSource 0 get/exec cvx + DataSource 1 get/exec cvx + DataSource 2 get/exec cvx + DataSource 3 get/exec cvx /AGMCORE_get_ink_data cvx - ] cvx def + ]cvx + }{ + DataSource aload pop AGMCORE_get_ink_data + }ifelse def }{ - /DataSource - Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load - filter_cmyk 0 () /SubFileDecode filter def + filter_cmyk 0()/SubFileDecode filter def }ifelse - /Decode [ Decode 0 get Decode 1 get ] def + /Decode[Decode 0 get Decode 1 get]def /MultipleDataSources false def /NComponents 1 def - /Operator /image def + /Operator/image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ - 1 AGMCORE_&setgray - currentdict imageormask_sys - }{ - currentdict ignoreimagedata - }ifelse + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage @@ -6315,23 +3879,22 @@ userdict /Adobe_AGM_Image 75 dict dup begin put true NComponents colorimage }ifelse }{ - Operator /image eq{ + Operator/image eq{ AGMCORE_host_sep{ /DoImage true def - HostSepColorImage{ - invert_image_samples - }{ + currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse + { AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if - }ifelse + }if 1 AGMCORE_&setgray DoImage - {currentdict imageormask_sys} if + {currentdict imageormask_sys}if }{ - use_mask { - level3 {process_mask_L3 image}{masked_image_simulation}ifelse + use_mask{ + process_mask image }{ image }ifelse @@ -6349,41 +3912,42 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse cleartomark restore }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin - /MappedCSA CSA map_csa def + CSA map_csa begin - SkipImageProc { + AGMIMG_init_common + SkipImageProc{ currentdict consumeimagedata - } - { - save mark + }{ + save mark AGMCORE_avoid_L2_sep_space{ - /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def }if - AGMIMG_ccimage_exists - MappedCSA 0 get /DeviceCMYK eq and - currentdict/Components known and - Name () ne and - Name (All) ne and - Operator /image eq and + AGMIMG_ccimage_exists + MappedCSA 0 get/DeviceCMYK eq and + currentdict/Components known and + Name()ne and + Name(All)ne and + Operator/image eq and AGMCORE_producing_seps not and level2 not and { - Width Height BitsPerComponent ImageMatrix + Width Height BitsPerComponent ImageMatrix [ - /DataSource load /exec cvx + /DataSource load/exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for - } /exec cvx - ] cvx bind - MappedCSA 0 get /DeviceCMYK eq{ + }/exec cvx + ]cvx bind + MappedCSA 0 get/DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub @@ -6393,14 +3957,14 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }{ AGMCORE_producing_seps not{ level2{ - AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ - [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{ + [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict - Operator /imagemask eq{ + Operator/imagemask eq{ imageormask }{ sep_imageormask_lev1 @@ -6413,19 +3977,32 @@ userdict /Adobe_AGM_Image 75 dict dup begin put knockout_unitsq }{ currentgray 1 ne{ - AGMCORE_is_cmyk_sep Name (All) ne and{ + AGMCORE_is_cmyk_sep Name(All)ne and{ level2{ - [ /Separation Name [/DeviceGray] - { - sep_colorspace_proc AGMCORE_get_ink_data - 1 exch sub - } bind - ] AGMCORE_&setcolorspace - /sep_tint AGMCORE_gget AGMCORE_&setcolor + Name AGMCORE_IsSeparationAProcessColor + { + Operator/imagemask eq{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor + }if + }{ + invert_image_samples + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + [/Separation Name[/DeviceGray] + { + sep_colorspace_proc AGMCORE_get_ink_data + 1 exch sub + }bind + ]AGMCORE_&setcolorspace + /sep_tint AGMCORE_gget AGMCORE_&setcolor + }if + }ifelse currentdict imageormask_sys }{ currentdict - Operator /imagemask eq{ + Operator/imagemask eq{ imageormask_sys }{ sep_image_lev1_sep @@ -6438,28 +4015,31 @@ userdict /Adobe_AGM_Image 75 dict dup begin put currentdict imageormask_sys }ifelse }{ - currentoverprint not Name (All) eq or Operator/imagemask eq and{ - currentdict imageormask_sys + currentoverprint not Name(All)eq or Operator/imagemask eq and{ + currentdict imageormask_sys }{ currentoverprint not { - gsave + gsave knockout_unitsq grestore }if - currentdict consumeimagedata + currentdict consumeimagedata }ifelse }ifelse }ifelse }{ - currentcolorspace 0 get /Separation ne{ - [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt - /sep_tint AGMCORE_gget setcolor + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + currentcolorspace 0 get/Separation ne{ + [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if }if - currentoverprint - MappedCSA 0 get /DeviceCMYK eq and - Name inRip_spot_has_ink not and - Name (All) ne and { + currentoverprint + MappedCSA 0 get/DeviceCMYK eq and + Name AGMCORE_IsSeparationAProcessColor not and + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse + Name(All)ne and{ imageormask_l2_overprint }{ currentdict imageormask @@ -6469,214 +4049,155 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse cleartomark restore }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end end }def -/decode_image_sample -{ - 4 1 roll exch dup 5 1 roll - sub 2 4 -1 roll exp 1 sub div mul add -} bdf /colorSpaceElemCnt { - currentcolorspace 0 get dup /DeviceCMYK eq { - pop 4 - } - { - /DeviceRGB eq { - pop 3 - }{ - 1 - } ifelse - } ifelse -} bdf + mark currentcolor counttomark dup 2 add 1 roll cleartomark +}bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ - 0 1 dataSource length 1 sub { - dup currentdict /dataSource get /exch cvx /get cvx /exec cvx - /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx - } for - ] cvx bind + 0 1 dataSource length 1 sub{ + dup currentdict/dataSource get/exch cvx/get cvx/exec cvx + /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx + }for + ]cvx bind end -} bdf +}bdf /devn_alt_datasource { 11 dict begin - /srcDataStrs xdf - /dstDataStr xdf /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf - /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def - /samplesNeedDecoding - 0 0 1 origDecode length 1 sub { - origDecode exch get add - } for - origDecode length 2 div div - dup 1 eq { - /decodeDivisor 2 origBitsPerComponent exp 1 sub def - } if - 2 origBitsPerComponent exp 1 sub ne - def + /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def + /DataSource origMultipleDataSources + { + [ + BitsPerComponent 8 idiv origDecode length 2 idiv mul string + 0 1 origDecode length 2 idiv 1 sub + { + dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch + origDataSource exch get 0()/SubFileDecode filter + BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx + }for + ]bind cvx + }{origDataSource}ifelse 0()/SubFileDecode filter def [ - 0 1 dsCnt 1 sub [ - currentdict /origMultipleDataSources get { - dup currentdict /origDataSource get exch get dup type - }{ - currentdict /origDataSource get dup type - } ifelse - dup /filetype eq { - pop currentdict /srcDataStrs get 3 -1 /roll cvx /get cvx /readstring cvx /pop cvx - }{ - /stringtype ne { - /exec cvx - } if - currentdict /srcDataStrs get /exch cvx 3 -1 /roll cvx /xpt cvx - } ifelse - ] cvx /for cvx - currentdict /srcDataStrs get 0 /get cvx /length cvx 0 /ne cvx [ - 0 1 Width 1 sub [ - Adobe_AGM_Utils /AGMUTIL_ndx /xddf cvx - currentdict /origMultipleDataSources get { - 0 1 dsCnt 1 sub [ - Adobe_AGM_Utils /AGMUTIL_ndx1 /xddf cvx - currentdict /srcDataStrs get /AGMUTIL_ndx1 /load cvx /get cvx /AGMUTIL_ndx /load cvx /get cvx - samplesNeedDecoding { - currentdict /decodeDivisor known { - currentdict /decodeDivisor get /div cvx - }{ - currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvxs - BitsPerComponent /decode_image_sample load /exec cvx - } ifelse - } if - ] cvx /for cvx - }{ - Adobe_AGM_Utils /AGMUTIL_ndx1 0 /ddf cvx - currentdict /srcDataStrs get 0 /get cvx /AGMUTIL_ndx /load cvx - currentdict /origDecode get length 2 idiv dup 3 1 /roll cvx /mul cvx /exch cvx /getinterval cvx - [ - samplesNeedDecoding { - currentdict /decodeDivisor known { - currentdict /decodeDivisor get /div cvx - }{ - currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvx - BitsPerComponent /decode_image_sample load /exec cvx - Adobe_AGM_Utils /AGMUTIL_ndx1 /AGMUTIL_ndx1 /load cvx 1 /add cvx /ddf cvx - } ifelse - } if - ] cvx /forall cvx - } ifelse - currentdict /convProc get /exec cvx - currentdict /origcolorSpaceElemCnt get 1 sub -1 0 [ - currentdict /dstDataStr get 3 1 /roll cvx /AGMUTIL_ndx /load cvx currentdict /origcolorSpaceElemCnt get /mul cvx /add cvx /exch cvx - currentdict /convProc get /filter_indexed_devn load ne { - 255 /mul cvx /cvi cvx - } if - /put cvx - ] cvx /for cvx - ] cvx /for cvx - currentdict /dstDataStr get - ] cvx /if cvx - ] cvx bind + origcolorSpaceElemCnt string + 0 2 origDecode length 2 sub + { + dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div + 1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx + }for + /convProc load/exec cvx + origcolorSpaceElemCnt 1 sub -1 0 + { + /dup cvx 2/add cvx/index cvx + 3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx + }for + ]bind cvx 0()/SubFileDecode filter end -} bdf +}bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin - /MappedCSA CSA map_csa def + CSA map_csa 2 dict begin - dup dup - /dstDataStr exch /Width get colorSpaceElemCnt mul string def - /srcDataStrs [ 3 -1 roll begin - currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse + dup + /srcDataStrs[3 -1 roll begin + AGMIMG_init_common + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse { - Width Decode length 2 div mul cvi string - } repeat - end ] def + Width Decode length 2 div mul cvi + { + dup 65535 gt{1 add 2 div cvi}{exit}ifelse + }loop + string + }repeat + end]def + /dstDataStr srcDataStrs 0 get length string def begin - SkipImageProc { + AGMIMG_init_common + SkipImageProc{ currentdict consumeimagedata - } - { - save mark - AGMCORE_producing_seps not { - level3 not { - Operator /imagemask ne { - /DataSource [ - DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse - colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get - dstDataStr srcDataStrs devn_alt_datasource /exec cvx - ] cvx 0 () /SubFileDecode filter def - /MultipleDataSources false def - /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def - } if + }{ + save mark + AGMCORE_producing_seps not{ + level3 not{ + Operator/imagemask ne{ + /DataSource[[ + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def + /MultipleDataSources true def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + }if }if currentdict imageormask }{ AGMCORE_host_sep{ - Names convert_to_process { - CSA map_csa 0 get /DeviceCMYK eq { + Names convert_to_process{ + CSA get_csa_by_name 0 get/DeviceCMYK eq{ /DataSource - Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul - [ - DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse - 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get - dstDataStr srcDataStrs devn_alt_datasource /exec cvx - ] cvx - filter_cmyk 0 () /SubFileDecode filter def + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + 4/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + filter_cmyk 0()/SubFileDecode filter def /MultipleDataSources false def - /Decode [1 0] def + /Decode[1 0]def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space - AGMCORE_black_plate { - /DataSource [ - DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse - CSA map_csa 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get - dstDataStr srcDataStrs devn_alt_datasource /exec cvx - ] cvx 0 () /SubFileDecode filter def + AGMCORE_black_plate{ + /DataSource + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource /MultipleDataSources false def - /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def currentdict imageormask_sys - } - { - gsave + }{ + gsave knockout_unitsq grestore - currentdict consumeimagedata - } ifelse - } ifelse + currentdict consumeimagedata + }ifelse + }ifelse } { - /devicen_colorspace_dict AGMCORE_gget /names_index known { + /devicen_colorspace_dict AGMCORE_gget/names_index known{ Operator/imagemask ne{ - MultipleDataSources { - /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def + MultipleDataSources{ + /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def /MultipleDataSources false def }{ - /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def - } ifelse + /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def + }ifelse invert_image_samples - } if + }if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ - currentdict imageormask_sys + currentdict imageormask_sys }{ currentoverprint not { - gsave + gsave knockout_unitsq grestore }if - currentdict consumeimagedata + currentdict consumeimagedata }ifelse }ifelse }ifelse @@ -6686,6 +4207,7 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse cleartomark restore }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end end end @@ -6696,44 +4218,44 @@ userdict /Adobe_AGM_Image 75 dict dup begin put currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ - level3{ - currentcmykcolor - /AGMIMG_k xdf - /AGMIMG_y xdf - /AGMIMG_m xdf + level3{ + currentcmykcolor + /AGMIMG_k xdf + /AGMIMG_y xdf + /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ - [/DeviceN [ - AGMIMG_c 0 ne {/Cyan} if - AGMIMG_m 0 ne {/Magenta} if - AGMIMG_y 0 ne {/Yellow} if - AGMIMG_k 0 ne {/Black} if - ] /DeviceCMYK {}] setcolorspace - AGMIMG_c 0 ne {AGMIMG_c} if - AGMIMG_m 0 ne {AGMIMG_m} if - AGMIMG_y 0 ne {AGMIMG_y} if - AGMIMG_k 0 ne {AGMIMG_k} if + [/DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ]/DeviceCMYK{}]setcolorspace + AGMIMG_c 0 ne{AGMIMG_c}if + AGMIMG_m 0 ne{AGMIMG_m}if + AGMIMG_y 0 ne{AGMIMG_y}if + AGMIMG_k 0 ne{AGMIMG_k}if setcolor }{ - /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def [/Indexed [ - /DeviceN [ - AGMIMG_c 0 ne {/Cyan} if - AGMIMG_m 0 ne {/Magenta} if - AGMIMG_y 0 ne {/Yellow} if - AGMIMG_k 0 ne {/Black} if + /DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if ] - /DeviceCMYK { - AGMIMG_k 0 eq {0} if - AGMIMG_y 0 eq {0 exch} if - AGMIMG_m 0 eq {0 3 1 roll} if - AGMIMG_c 0 eq {0 4 1 roll} if + /DeviceCMYK{ + AGMIMG_k 0 eq{0}if + AGMIMG_y 0 eq{0 exch}if + AGMIMG_m 0 eq{0 3 1 roll}if + AGMIMG_c 0 eq{0 4 1 roll}if } ] 255 { - 255 div + 255 div mark exch dup dup dup AGMIMG_k 0 ne{ @@ -6762,83 +4284,84 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse counttomark 1 add -1 roll pop } - ] setcolorspace + ]setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ - [/Separation /Black /DeviceGray {}] setcolorspace + [/Separation/Black/DeviceGray{}]setcolorspace gsave /Black - [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ - [/Separation /Yellow /DeviceGray {}] setcolorspace + [/Separation/Yellow/DeviceGray{}]setcolorspace gsave /Yellow - [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ - [/Separation /Magenta /DeviceGray {}] setcolorspace + [/Separation/Magenta/DeviceGray{}]setcolorspace gsave /Magenta - [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ - [/Separation /Cyan /DeviceGray {}] setcolorspace + [/Separation/Cyan/DeviceGray{}]setcolorspace gsave - /Cyan - [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] + /Cyan + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore - } if + }if close_image_file }{ imageormask }ifelse }ifelse }ifelse -} def +}def /indexed_imageormask { begin - save mark + AGMIMG_init_common + save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ - /indexed_colorspace_dict AGMCORE_gget dup /CSA known { - /CSA get map_csa + /indexed_colorspace_dict AGMCORE_gget dup/CSA known{ + /CSA get get_csa_by_name }{ - /CSD get get_csd /Names get - } ifelse + /Names get + }ifelse overprint_plate not{ knockout_unitsq }if }{ - Indexed_DeviceN { - /devicen_colorspace_dict AGMCORE_gget /names_index known { + Indexed_DeviceN{ + /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{ indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata - } ifelse + }ifelse }{ AGMCORE_is_cmyk_sep{ - Operator /imagemask eq{ + Operator/imagemask eq{ imageormask_sys }{ level2{ @@ -6857,24 +4380,28 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse }{ level2{ - Indexed_DeviceN { + Indexed_DeviceN{ /indexed_colorspace_dict AGMCORE_gget begin - CSD get_csd begin }{ - /indexed_colorspace_dict AGMCORE_gget begin - CSA map_csa 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { - [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] - setcolorspace - } if - end - } ifelse + /indexed_colorspace_dict AGMCORE_gget dup null ne + { + begin + currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse + get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and + AGMCORE_in_rip_sep and{ + [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup] + setcolorspace + }if + end + } + {pop}ifelse + }ifelse imageormask - Indexed_DeviceN { + Indexed_DeviceN{ end - end - } if + }if }{ - Operator /imagemask eq{ + Operator/imagemask eq{ imageormask }{ indexed_imageormask_lev1 @@ -6882,107 +4409,97 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }ifelse }ifelse cleartomark restore + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin - Indexed_DeviceN not { - currentcolorspace - dup 1 /DeviceGray put + Indexed_DeviceN not{ + currentcolorspace + dup 1/DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put - }for + }for put setcolorspace - } if - currentdict - Operator /imagemask eq{ + }if + currentdict + Operator/imagemask eq{ AGMIMG_&imagemask }{ - use_mask { - level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse + use_mask{ + process_mask AGMIMG_&image }{ AGMIMG_&image }ifelse }ifelse end end }def - /OPIimage - { - dup type /dicttype ne{ - 10 dict begin - /DataSource xdf - /ImageMatrix xdf - /BitsPerComponent xdf - /Height xdf - /Width xdf - /ImageType 1 def - /Decode [0 1 def] - currentdict - end - }if - dup begin - /NComponents 1 cdndf - /MultipleDataSources false cdndf - /SkipImageProc {false} cdndf - /HostSepColorImage false cdndf - /Decode [ - 0 - currentcolorspace 0 get /Indexed eq{ - 2 BitsPerComponent exp 1 sub - }{ - 1 - }ifelse - ] cdndf - /Operator /image cdndf - end - /sep_colorspace_dict AGMCORE_gget null eq{ - imageormask - }{ - gsave - dup begin invert_image_samples end - sep_imageormask - grestore - }ifelse - }def + /OPIimage + { + dup type/dicttype ne{ + 10 dict begin + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /ImageType 1 def + /Decode[0 1 def] + currentdict + end + }if + dup begin + /NComponents 1 cdndf + /MultipleDataSources false cdndf + /SkipImageProc{false}cdndf + /Decode[ + 0 + currentcolorspace 0 get/Indexed eq{ + 2 BitsPerComponent exp 1 sub + }{ + 1 + }ifelse + ]cdndf + /Operator/image cdndf + end + /sep_colorspace_dict AGMCORE_gget null eq{ + imageormask + }{ + gsave + dup begin invert_image_samples end + sep_imageormask + grestore + }ifelse + }def /cachemask_level2 { 3 dict begin - /LZWEncode filter /WriteFilter xdf + /LZWEncode filter/WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile - 0 (%EndMask) /SubFileDecode filter + 0(%EndMask)/SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring - not {exit} if + not{exit}if }loop WriteFilter closefile end }def -/cachemask_level3 -{ - currentfile - << - /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] - /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] - /Intent 1 - >> - /ReusableStreamDecode filter -}def /spot_alias { - /mapto_sep_imageormask + /mapto_sep_imageormask { - dup type /dicttype ne{ + dup type/dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf @@ -6994,11 +4511,10 @@ userdict /Adobe_AGM_Image 75 dict dup begin put }{ begin }ifelse - /Decode [/customcolor_tint AGMCORE_gget 0] def - /Operator /image def - /HostSepColorImage false def - /SkipImageProc {false} def - currentdict + /Decode[/customcolor_tint AGMCORE_gget 0]def + /Operator/image def + /SkipImageProc{false}def + currentdict end sep_imageormask }bdf @@ -7006,28 +4522,31 @@ userdict /Adobe_AGM_Image 75 dict dup begin put { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget - bdict + << /Name AGMIMG_colorAry 4 get - /CSA [ /DeviceCMYK ] - /TintMethod /Subtractive + /CSA[/DeviceCMYK] + /TintMethod/Subtractive /TintProc null /MappedCSA null - /NComponents 4 - /Components [ AGMIMG_colorAry aload pop pop ] - edict + /NComponents 4 + /Components[AGMIMG_colorAry aload pop pop] + >> setsepcolorspace mapto_sep_imageormask }ndf - Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put + Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put - dup 4 get map_alias{ + current_spot_alias{dup 4 get map_alias}{false}ifelse + { + false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask + true set_spot_alias }{ - AGMIMG_&customcolorimage + //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec }ifelse }bdf }def @@ -7038,35 +4557,35 @@ userdict /Adobe_AGM_Image 75 dict dup begin put dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { - 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def + 1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def 0 0 transform - AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch - AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch - itransform /AGMIMG_llY exch def /AGMIMG_llX exch def + AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + itransform/AGMIMG_llY exch def/AGMIMG_llX exch def 1 1 transform - AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch - AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch - itransform /AGMIMG_urY exch def /AGMIMG_urX exch def - [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat + AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + itransform/AGMIMG_urY exch def/AGMIMG_urX exch def + [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat }{ }ifelse end -} def +}def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ - dup 2 index exch get - 255 exch sub - 2 index - 3 1 roll + dup 2 index exch get + 255 exch sub + 2 index + 3 1 roll put }for }def /tint_image_to_color { begin - Width Height BitsPerComponent ImageMatrix + Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin @@ -7080,64 +4599,64 @@ level2 not{ /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def - } if + }if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs - {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage + {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage end - } def + }def /sep_imageormask_lev1 { begin - MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get - } currenttransfer addprocs settransfer + }currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ - MappedCSA 0 get /DeviceCMYK eq{ + MappedCSA 0 get/DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse - Adobe_AGM_Image/AGMIMG_k xddf - Adobe_AGM_Image/AGMIMG_y xddf - Adobe_AGM_Image/AGMIMG_m xddf - Adobe_AGM_Image/AGMIMG_c xddf + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ - {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer + {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer - {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll - {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll - {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll - {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll + {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ - MappedCSA 0 get /DeviceGray eq { - {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer + MappedCSA 0 get/DeviceGray eq{ + {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer currentdict imageormask }{ - MappedCSA 0 get /DeviceCMYK eq { + MappedCSA 0 get/DeviceCMYK eq{ currentcolortransfer - {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll - setcolortransfer + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll + setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer - {pop 1} exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll - setcolortransfer + {pop 1}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll + setcolortransfer currentdict tint_image_to_color }ifelse }ifelse @@ -7150,10 +4669,10 @@ level2 not{ begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop - Adobe_AGM_Image/AGMIMG_k xddf - Adobe_AGM_Image/AGMIMG_y xddf - Adobe_AGM_Image/AGMIMG_m xddf - Adobe_AGM_Image/AGMIMG_c xddf + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} @@ -7173,29 +4692,29 @@ level2 not{ /indexed_colorspace_dict AGMCORE_gget begin begin currentdict - MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ - {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer imageormask }{ - MappedCSA 0 get /DeviceGray eq { - {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer + MappedCSA 0 get/DeviceGray eq{ + {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer imageormask }{ - MappedCSA 0 get /DeviceCMYK eq { + MappedCSA 0 get/DeviceCMYK eq{ currentcolortransfer - {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll - {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll - {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll - {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll - setcolortransfer + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + setcolortransfer tint_image_to_color }{ currentcolortransfer - {pop 1} exch addprocs 4 1 roll - {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll - {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll - {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll - setcolortransfer + {pop 1}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi Lookup exch get HiVal div}exch addprocs 4 1 roll + setcolortransfer tint_image_to_color }ifelse }ifelse @@ -7216,5038 +4735,288 @@ level2 not{ }def }if end -systemdict /setpacking known -{ - setpacking -} if +systemdict/setpacking known +{setpacking}if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin -2 2010 Adobe_AGM_Core/doc_setup get exec -Adobe_CoolType_Core/doc_setup get exec -Adobe_AGM_Image/doc_setup get exec +2 2010 Adobe_AGM_Core/ds gx +Adobe_CoolType_Core/ds get exec Adobe_AGM_Image/ds gx currentdict Adobe_AGM_Utils eq {end} if %%EndSetup -%%Page: Alternate-ISC-logo-v2.ai 1 +%%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup -/currentdistillerparams where -{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse -{ userdict /AI11_PDFMark5 /cleartomark load put -userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} -{ userdict /AI11_PDFMark5 /pdfmark load put -userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse -[/NamespacePush AI11_PDFMark5 -[/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 -[{ai_metadata_stream_123} -currentfile 0 (% &&end XMP packet marker&&) -/SubFileDecode filter AI11_ReadMetadata_PDFMark5 - - - - - Adobe PDF library 6.66 - - - - - - - 2004-10-06T16:15:40-07:00 - 2004-10-22T21:51:43Z - Illustrator - 2004-10-06T16:15:40-07:00 - - - - JPEG - 256 - 152 - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAmAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AiX5AfkB5O/MTydea1rV5 qNvdW+oyWSJZSQJGY0ghlBIlhmblymPfMfLlMTQbIQBDOPM//OKX5U6B5e1DWZ9R1uSOxhaX0hcW il2H2U5G0NOTUFcOCcskxAVuWOaoQMj0Y1+Wf5EflJ56N+kUuvWEtgImZHu7OTmJS4+Glmv2eG+3 fMvXYJ6etwb8v2uPpNRHNdCqZz/0Jp+WH/V01v8A5H2n/ZLmv/MSczww7/oTT8sP+rprf/I+0/7J cfzEl8MO/wChNPyw/wCrprf/ACPtP+yXH8xJfDDAfzv/AOcc/JHkPyHN5g0i+1Oe9juIYVju5bd4 uMrUYkRwRNXw+LJ48xkaRKAAfT/5V/8AksPKH/bE07/qEjzJaiynFXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+BfyU/MTzH5Nhnn0yUPbSzt9ZsZqtBJ8CAMVBFGHZ hv8ARtmz0uihnwkS58XPryDrdVqp4sorlXL5st1/z/8AmP5whlgu7p20+b7VnCqwW9AwYL250YD7 TE5eI6TSncgS+Zccy1OoGwPD8ggfLXmTzl5HvJLzTD9X9YKtwroksUiqSVVjvTc9iDlkp6bVjhsS +wsIxz6Y3Vfc9B1b/nJjWZ9Hhh03TYrPVmH+lXTt6sQp/vqM/wA3+UTT365iY+w4CVyNx7v1uTPt eRjsKk9s8j+YrjzH5W0/Wbm0aymu4wzwtsCRsXTcng1KrXemaHV4RiyGAN07jT5TkgJEVae5jNzx v/nLL/yT91/zG2v/ABM5dg+pjPk9M/Kv/wAlh5Q/7Ymnf9QkeZzjllOKuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV+eX5W6Yl7aztLvBDMSy/zEqtB8tsyJ644NP6fr lI18hZcX8oMuf1fTGP6S9h0Ly3rGtzm20q1M7RgF6UVEXtyZiFHTbOa3ke8u52Adr3lvWNEnFtqt qYWkUlCSGRx3oykqeu+DeJ7iuxDANasU07UIriJFaF29RYmAK8kILKVPVc7bsjWnUYiJfVHY/oLy /aOlGHIDH6S+zNB1K31TRNP1K2UJb3lvFPEg6KsiBgu38taZzGaBhMxPMF6DHMSiCOoR2VM3jf8A zll/5J+6/wCY21/4mcuwfUxnyemflX/5LDyh/wBsTTv+oSPM5xyynFXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+A/yedP0NepT4xccie5BRR+FMxNfE8ET0uX+9bNP IcZHWh+l9K/kxr2kW1neaZcSxwXskwmjaQhfUUqF4qT1Kla098wMUg5Mgq/nNrujzada6XDKk9+s 4mbgQ3pIEZaMR0Lcht9PhjlIWIeCebnQQ26U+MszA+AAAP31zoPZyJ4pnps6ftqQqI67s3/KGD81 YPMejRFNVh8ts6tKJ0mFp6HAsOPqDgFYUoVzYdonTGEvp4/hduJoRnE4/VwfY+lCyggEgE9B45yr 0Lxb/nLe8tYvyoe2kkCz3N7bmCM9W9NqtT5A5bhI4wFlAmBI5B6l+Vf/AJLDyh/2xNO/6hI8z3EL y3/nLq+1nQPJem69oWsalpWoyapHZytZX11BG8UltM5BijkVK8oFoaePjir0v8ooJB+W/lq8nu7u 9vNR0uyvLy5vbme6keaeBZXPKZ34jk52XbFWYYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FX5z/l3fy2Nq88Y5D1mDodgylE2zaafSR1GnMJfztvI0HWanUSw5xIfzf0l6Zb a3plwnITrGe6SkIR9+x+jOdz9k6jGa4TId43dti7QwzF8Ve/Zq61zTLdORmWU9kiIcn7th9Jw6fs nUZD9PCO+W37Vzdo4YDnfu3S3y5bW3mjzpptlqVwtnZ3U6xO5JoEFTwBAPxP9kH+Y+GdXDCNJpyI CyBfvPf+Ojz5ynU5xxbAvozTPzt/L2W4vbT60bO109R6E8qFY5kX4SIVUF9uylakduucN+aiSbfQ Z9gamMYkC+LoOnveJeYvzDnP5kTeatBmlMUUoayS7qRxMYSRCgbZHPLYHp4HMKWT18Qet03Zo/Kj DkA5b179vixD84/zA8y+btFi/TEsbJaSVt44o1jVTIRy6bn7I6nMzRZJSyi+4un7Y7OxabSS8Mcz G32N+Vf/AJLDyh/2xNO/6hI83jwxeUf85q/+Ss0r/tuW/wD1CXeKvVfyn/8AJWeTf+2Hpv8A1CR4 q8j8x/nX5n8ifnH5nGr28+o/l4tzp9rNKnxtp082nwSckAqQklWYp0Y1K/FUFV7F5gutN1/yJe6h pmoSNaT2M1xY6jp1zJC1fRfi6SwMh2PY9+o2xVjP5faLe+ZPyb8tx3WtanDPqNraXmo6jHeXBvpD QSMqXLSGSIOwAbifs1HeuKvOfzm0m/8ALHnz8tdI0fzJ5hhsfMmqG01aNta1GQyRC4tI6KzTEp8M 77rir2bQfIEWia5+kbXWtYurZ7SW2msNQ1G7voS7yROkyC4kk4OgjZajs2KvH9Is9R1n/nJrzd5Q utf12Py9p+mRXtnZQavqEQjmaOxJIZZg1K3D7Vpvir2Xy/5JTSdO1PTZdW1PUbS9ujcW8l3fXUlz bxmGKMwpcmT1uIkjZx8X7WKvB/8AnH/RPMX5gflhrGqaj5x8wQa/BqE9rYagNWvfTjEdtBLH6kLS NG685TyqtaYq9K/5xr86+aPOH5Yw6n5kJlvYbqa1hvWADXMMQUrK3EAVDM0ZPfjirHPzm/M7zt5G /M6wvNIt5NV8u22jC78waSrbCD620RuUG5R0LKC4FKfa23Cr1fyr5t8s+ePLcWraHeG5066HFzG7 RTROAC0UnAq8ci13FfwOKsS/JBbuS183fXNQv9Qaz8y6rp1s97eXFyUtbaVUijX1XYLxA6jfFWA6 RZ6jrP8Azk15u8oXWv67H5e0/TIr2zsoNX1CIRzNHYkkMswalbh9q03xV6vB+XE8Oi3+ijzJrJs7 2/S8W5e+uJL6GBI4gbWK8eQzIjSxFiQfssy964q8i/ObSb/yx58/LXSNH8yeYYbHzJqhtNWjbWtR kMkQuLSOis0xKfDO+64q9n0DyDFoWvDU7XWtXurdrWW2m0/UdRur+Eu8kTpMq3MknF0EbLUdmxVl WKuxV2KuxV2KuxV8tf8AOKPkvyrr35Z6zJq+mQ3k02qy2zTSL+8WJLa3dVRxRk+JyaqQcqnqsmMj hkR1T4EJg8QtKPzn/LXS/JV9pzaXNNJaakJisc5VijQlKqGULUfvO4zoezNdLODxAXGnR6/SRwkc PIsk/Ln8gtN17QNP17V9RnSO9VpPqMCKhCh2VaysXryVQ32B1+nMXW9ryxzMIgbdf2ORpezIziJS PPownzdp3kO384XUWjyXMOkWbMrRg82kkiFCsEjVKhn25PWg+LfZc1uP2mIgRKPFLoeh9/7Ofk9P H2GyT4JxkIxl9Q6x93f+hj2oXjXt9cXjIsbXEjStGleILmpArU985ORs2+nYcfhwEbJ4RW/PZG2X l+4mAec+ih6LSrn6O2TjiJdNre38WI8MPXL7Pn+Pek/5j6Pa2nliWWMuW9WMfEQep9gM2GhxgZHm O0u2cuoxGEhER8v7X2j+Vf8A5LDyh/2xNO/6hI83LzpeUf8AOapH/KrdKWu51yAgd6C0uv64q9V/ KYg/lZ5Np/1Y9N/6hI8VYb5Q0/SvMf5j/nBpWq2yXNhdzaVbXVq+4ZBp/p12oQTwqCNwehqMVea6 5Yeb/wAgZ9Tgtlm1r8qtdWWJVrym0+edCq1rQA1NK/ZkHg2Kvevyiiji/KrycqDip0TT2I93tY2Y /STiryz/AJyO/wDJp/kv/wBtw/8AUXp+KvoDFXzXp/lvSfMH/OXnney1P6x6CaPbzJ9VurmyfmsG nKKyWskLkUY/CWp3psMVe6+U/LmkeW0vdK064llV5hfGK5nluZo1nURqGlneSRlLQNxLH27Yq+XP yK8n+e9f/IrzOPKfmS5025fULiJdIRLcQ3LLa2zOPXaP6xE8qNwqkqjYV74q93/Ij8xPLvmnyhBp tjaR6Pq2hItnqnl9FMZtnj+CqI3xemxB3O4NQ2+KqFxLDN/zkwllKitGfJMpYPQhxLqiqUKkb7R4 q8984/l15r/JzzNP+YP5axNd+WZjy8w+WBXikIqzMgFf3a7lSByj90qMVehf8476tZ635O1fXrON ooNZ8watqCJJTmFuLkugehI5BKA0xV57p/lvSfMH/OXnney1P6x6CaPbzJ9VurmyfmsGnKKyWskL kUY/CWp3psMVe6+U/LmkeW0vdK064llV5hfGK5nluZo1nURqGlneSRlLQNxLH27Yq8e/5yO/8mn+ S/8A23D/ANRen4q+gMVdirsVdirsVdirsVfOv/OGn/ksNU/7bc//AFCWuYeo+pux8ntWreX9C1hE TVtOttQWLl6X1mFJeHOnLhzB41oOmQx5pw+kke5M8UZ/UAUFq3mDyp5P0+zhv7iLTLI0t7KMIxUB F+yqxq1AB36ZTlzC7kdy5ek0OTN6cUb4Q+XvzM13S9c866lqGmRJHZO4SOSMcfWKDi0xG28h36dO u+arLIGRIfRey9PPDp4xmfV93l8EHoGmqVF5KtTX9yD2p+1/TJ4odXS9vdpkHwYH+t+r9f8AanuZ DyTEPzS/5RKX/jNF/wASzJ0f1teb6X2H+Vf/AJLDyh/2xNO/6hI82zhlb51/K3yR52EK+aLGXUYr ducMBvLyGJXpx5CKGaNOVO9MVTHy15Q0Ly1p0em6MlxBYQp6UFvJd3VwkaDosYnll4AduOKoTRfy 68p6Lr1/r2m29xDq2qFG1G4a9vZfXMYIT1ElmeNuAYhart2xVPNS03T9TsJ9P1G3ju7G6QxXFtMo eN0bYqynYjFWtK0yx0rTLPS9Pi9CwsII7W0hBZgkMKBI1qxZjxVQNzXFWO+avys8j+a9VstV16xm u7/TW9TT5heXkIgcFTyiSGaNENY1NQOoxVlFvAkEKQoXKIKAyO8jfS7lmP0nFWDXn5Gflnd69P5g n066Ot3NPW1FNT1KOZqKEHxpcqacVAxVO9F8g+WdFsr6z02K5ij1Fle8le+vZZ3ZAFWlxLM8y0Ap RXGKqPkr8s/JfkmGWDyxZSafbzuZZbf63dzRNIVCl/TmlkTlxUCtMVWXX5XeRbjzT/ir9Gm28wkF ZNRs7i5s5JAQAfVFtJEslaCvMHFVWb8ufKU3mtfNklvcnzAkRt0vhfXqlYCxcxCMTCMR8mJ4caYq yUgEUO4PUYql2g+W9D8v2cllotlHYWck0lw1vCCsYklNXKrWignstBirFLz8jPyzu9en8wT6ddHW 7mnraimp6lHM1FCD40uVNOKgYqyLyx5N8v8AllLpNHhmjN66y3Ulxc3N5I7KvFayXUkz0A7A0xVL vNX5WeR/Neq2Wq69YzXd/prepp8wvLyEQOCp5RJDNGiGsamoHUYqyi3gSCFIULlEFAZHeRvpdyzH 6TiqpirsVdirsVdirsVfOv8Azhp/5LDVP+23P/1CWuYeo+pux8nvOY7Y8/8Azo8q6Nq/lK61O/eW O40aCaayeJqLzYCiupqCGZVB75j6mAMbPR3XYeryYs4hGqmQC+XIYmlmjiX7UjBR82NM1z3+XIIR MjyAtmqIqIqIKKoCqPADYZmgU+X5MhnIyPMm12Fghvzc8i6jZ/lNJ5hvHEKS3FsLe1pV2SRtnY1+ HboMy9JH1W1ZTs+nfyr/APJYeUP+2Jp3/UJHm0cQph5t84eXfKWjSaxr94tnZIwRWILvJI32Y441 DO7t2Cj8MVYZqX57aRpCQXOs+V/Mel6ZcOkUep3ViiwBpCAgfjM0sfIttzQYq9MxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvnX/nDT/wAlhqn/AG25/wDqEtcw9R9Tdj5P ecx2x4p+e3lfzteTXGr2dy7eXLa1Q3NoJ2ChkY839H7J6jf2zC1MJXfR6z2f1eniBCQ/emWxr9Lw yw/3utv+Mqf8SGYkeYen1wvBP+pL7mZZmvmTsVZ7/wA5N6hZ6h+Rn12zINtNc2bRhabDkfh27r0O bDTm5Boyci9X/Kv/AMlh5Q/7Ymnf9QkeZ7jF43/zl1Lrmk3vkTzVBAbvSNC1Fp7m3IPpfWFeGWES 0rtIsLqK9PpxV6v5X84+R/zX8mXB06cXFleRGDULJqLc27Ov2ZENeLKd0bcGlQTiqF1P85dE0r8w NN8j6ppGp2OpauwXTr6ZLX6lKDWhWVbhm+0OPHhyrTbcYqnfn7z3pvkrRYtWv7S7vo5rmGyhtbBY pLiSa4PGNUjlkh5knspJ9sVa1vz9pOg6TZX2t29zY3WozJbWGjlY576a4k+zFHHbPOrN40eg7nFV C2/MOI6rHp2p6DqujGaGa5hur2O2Nu0cCeo/7y3nuOLcd+D0b2xVj+t/njDofl6TzFq/kvzJZaPC sby3M0OnrxEzrGnKP676gq7qKccVRNp+cf1rSrPWU8meYho97HDPFf8Ao2DRiC4CskzLHePIE4sG Y8dh1xVW8+/nFpHknXNH0bUtG1S7u9flNvpDWS2jpPMGjTgPUuYmU8p0HxAdcVR+kfmFNfa7a6Pe eV9a0aW9SV7e6v47P6uTCvJkL29zcEMR0FMVTTW/OGiaLrWiaPqEpiu/MEssGnGg4GSGP1CrGu3I bLtudsVTvFUj8u+cdD8w3utWelymWTQb06ffNQcfXWNXbgQTUKX4GtPiU/MqobzF5/0XRdZtNBEV zqfmC+jae30iwjEs/oKeLTSF2jiij5bcpHUE9MVVPLXnBNb1HUdNl0nUNH1DTEgkuLfUY4V5JcmV Y3ikt5biKRawOCVfFWQ4q7FXYq7FXYq7FXYq7FXYq+df+cNP/JYap/225/8AqEtcw9R9Tdj5Pecx 2x51+eHmy/0HysLa2sUuYdZE1jPPIW4xCSOlAi05MyluPxbU6HMfUzMRXe7zsHRxzZrMqMKlXfu+ YCHR6EFXU7g7EEZrn0AgEeTMrO5W5to5l/bHxAdj3H35mRlYfNNbpjgyygenL3dFbJOIxj80NQvk 8i3Fis7izluIXe35HgWVtm49K++ZWj+trzfS+u/yr/8AJYeUP+2Jp3/UJHm1cMpxrekaHr2nXeh6 vbxX1lcxgXdlLQ1jcnixA+JfiQ8WHcbbjFXx/wCefJXmT/nHvz/p3mzy1cyXHli9mMSo7fEU+1JZ XIFA1UFUf2rsVxV9Efnb+XUf5geRuWnEx6/ptNR8vXa1WRZlAb0ww+IeqAB7NxPbFWLfk35j1D83 LrTPOOsxenY+VIhaW9r+xNrTxA3N5xB+ykLqIlP2S7HFU7/Pv8vvN/mO20LzF5MuBH5o8p3El3YW zlQswlCc1Bf4OX7paB/hIqD1xVA/lD+ek/mzXn8necdGOh+drBWlELIyxSlFIdo1kq8T8GJpUgrU hqbYqmH/ADlH/wCSJ8zf9GP/AHULfFWVflQA35VeTlYVB0LTQQehH1OPFXkn/OTk89v+Y35Pz29u 95PFrEjw2kbIjyut1YFY1aRkQFzsCzAeJxV61onm/wAwahr0Ol6n5SvdFR4JrlLy6uLKaP8AcsiF V+qzXB5H1h1ptirxr/nJzRvMHmLzXZRaFM8eoeTNDm8ywrGKuXN7DH8BrXmEt3kX4TulO+Ks6i/O car+TVj5q0dFk8x6z6el6fp43/3MzH0fTof2Uesu/wDusVxVhn/OMdldeWPP/wCYvkq8uWu5rOe3 uVuXJ5SGsgkkIPd/UQ4qmv5xeUPzP0Pz/b/mj+XcS6ldrZDT9X0dl9RpIUfn8EYKtIrUWqoeYK1F a7Ksv/Jv839H/MewvZVsW0rzDphSDWNOloXQ1fgVchWZOQfZgCpqCO5VejYq7FXYq7FXYq7FXYq7 FXYq+df+cNP/ACWGqf8Abbn/AOoS1zD1H1N2Pk95zHbGiqkgkAlTUHwNKfxxS+UPzkutEufzA1KT SkdOLCO+5rwU3UfwylFNDTYVr1apzV5iOI0+jdiQyR00RP4f1ejGNK1RrOQq9Wgf7Sjsf5hkYTpe 1ezBqY2Nsg5H9BZRDNFNGJImDoejDMoEF4TNgnilwzFFif5pf8olL/xmi/4lmVo/rcXN9L7D/Kv/ AMlh5Q/7Ymnf9QkebZwykHm1PzQ0f8w18xeWdIh8w6BeaZBYajpf1uO0uVnt7i4lSaJp6RfZuaHf f2oDirH/ADj5I89/mxe6Rp3mfSI/K/k3TLpb+8tXuoru/u5kVkRF+r8ook4uwJ5k71xV7DdzSW1o 8kFs908Y/d2sJjV27UUytGg+lhirx7/nGDyX5z8keT7/AEHzPo0thcz6lLexTie0miMb28MYH7ma R+XKE/s4qzXzNqX5haV5piutG0L/ABB5euLRIrq2huoLa5guY5Xb1Y1uWjidWRwGHMHb23VY/pvk zzH5j/NnTvzB1/SU0CDQbGSz0ywaaK4vJpZxIjyTvbs8KIkcrBUDtua1xVGf85AeXvMnmb8r9V8u eXtNk1HUtSNuIwstvCiCC6hnYu08kXVYzTjXFU9/LC11iw8haBpGr6bLpt/pWnWllcRyyW8oaS3h WJijQSSgiqV3p1xV5z+fXlHz/r/nbyHq/lny9JqsHlO+a/umN1Z26y1mtZljT1plf/j3YElcVZ/p 3mfz3qGr6fay+TrrRtPeR21HULy70+ZUjWJyqpHbXE0jM8vBelAN8VSnyzpHmVvzd8z+YNU0S4tN Jv7KxsNKuZJbSRSluJHnMkcVxI68pHAX4DXvTFWOflr+Q0vlP8ytZ1R5eflS3ma78q6dyDJFc3iB LiUx/stCiekh7qcVdZ+TPO2hf85H635ztNElvfK+uWEdrNPBPaKVlWKD4/Rlmhf7dvStD9onFWXX ut/mbpHmnWI4/K7+YfLtzJFNpNzZ3tpDNCBbRRywyxXckAoZkd1Kt3xVB/lr5C1ew84eavPWu28O nap5nkhWLSbdxKttb26BAZJFCq8spHJ+OwPc1xV6RirsVdirsVdirsVdirsVdir51/5w0/8AJYap /wBtuf8A6hLXMPUfU3Y+T3nMdsQGoa9omnT29vf30FrcXTrHbQyyKryO7cVCKTU1O2WwwzkCYgkB hLJGJomrQd15K8p3eoXWo3WlW897ex+jczyIGZkC8e+wPHao3zGOKJNkOdDXZoxEYzIjE2Hyf5k0 uzj81alp2hRTzWkFxLHbRspaXhETy2ArQUPUVp1zWGO5p9G0+c+DGWUgSIHuspTBc3Fu/OFzG3en eniO+AGm7Pp8eWNTAkEr896vd3Plp4JuLD1IzzpRtj7Gn4ZsNBMnJReT7d7Jw4cByQsGx12/Hxfb v5V/+Sw8of8AbE07/qEjzePFFlOKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV86/wDOGn/ksNU/7bc//UJa5h6j6m7Hye85jtj5B/OE2S/mVrEun3KTwvKkglicOFkM amReQJ3WSvyztuzb8CIkKeW19eMSCzGx/wCcmfMNvaWsM+k29zJDGqTztI6tKyinPYUUnqeuYM+w 4EkiRDlR7XkALDBvzG8+t5y1tNSXT49NVIkQxxkO7utfjkkCoXO9FqNhmZoezoaeyN5Hr+hp1naW TOBAkiEeUb2vvZjpf5M+bNeg8vanNJHLYX8UL3tz6oNwkUjGQu4YDkwjYKtGY9K0zi+1cHFqZcIA jfT7ftfRewO2oYNCIzMjkAJF7+4Wln/ORn5QaL5T8irq+k3F1KGvIYJobgo6qrh25hkRKfEoXfxy OlwCGQENGt7ZyanBKExEcjt7w+kPyr/8lh5Q/wC2Jp3/AFCR5tnnCxj88Pzoi/LzTrSz061Gpeat YPDSrA1KD4gvqyhSGK8moqjdjtUbnFXaF+WHnPUrGO988+dNYfV5xzmsNGuf0bZ25bf0k+rKkknD pyL7+GKpJ5+/Lfz15b0afzB5N89a4X04fWbvTNUufr8UluhDS+m8ysyssYLDlyrSm2Kva8VdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfHH5K/mFceTPyPvZrD021W98wzR2qyg soSO0tGlYgUqKUXr+1lul0Yz5al9IH9jRqtUcWOx9RKa+aP+cgPNGu+XW0lLaLTZ5zS7vLV3BeKm 8aK1SnLueZ22za4Ox8eOfFfF3AutzdpznDhqnmkUApyfv0X+uYHavb/gyOPFRkOZ6D9r1Hs97HnU wGbOTHGeURzkO/yH2nyVQqAEBVofYE/ed85qXbOqJvjP2Pcx9l+z4x4fCj9pPzu1jwIw+H4W/A5t tB7RzEhHNvH+d1H4/FvOdsew+MxM9L6ZD+AmwfcTuD7yR7no/wCT/wCbcnlK4k0vWZJJNAkDsigF 3gmAJ+AdeLnYr47+Ob3tHs8ZwJwri+8PBaLWHCTCd19xX/n5+cXlzzh+Xt/pGm29zC8c1vOs1yEQ OElClVVWc/t1zUz7MyYQJSI+Ds8WvhlJiL5Poj8q/wDyWHlD/tiad/1CR5BtL5u8+3Bv/wDnMzSL bURW1srrTYrMP9mgt0uEpX/l4kP04q+usVaIBFDuD1GKvMPzU/MTW7LzT5d/L3yq6QeZvMzGR9Rk QSrZWUfIyTLEdncrE/Hl8PwmuKprc/lSs9sKebPMkeohaDUE1OZfiofiNsKWp3PT0sVYX+Vv5k+d NP8AzL1L8qfPk6alqVtGZ9F1xEETXMKp6gEqr8JJiPIECoKsGJ64qk/mP86/M/kT84/M41e3n1H8 vFudPtZpU+NtOnm0+CTkgFSEkqzFOjGpX4qgqvYvMF1puv8AkS91DTNQka0nsZrix1HTrmSFq+i/ F0lgZDsex79Rtirz6383eYPLf/OMsHm2ykn1PXhpNvdtPezS3bmacokkzGZnNIw5k49NsVVfI9jo /nfybZavoHnbVbvzAkcMt7cDUp1CXNFd4LmwRhBGjMrLQRV4/ZJGKorzz588wal+Zenflf5Uuf0b dzW5v9f1wIkstraAEiO3SQMnqybfEynjyFB4Kpxqn5TyT2kh07zd5isNVKn0b46lPOgfqC9rITbs teoVF9qYqxj8kvzR806t5j1/8u/PHpyeafLvJhfwKI1urdHWMyFV4gNWRGBUCqsNgQaqsa0qz1HW v+cmfN/k+58wa7F5fsNLjvLOzt9Xv4hHM8diSVZZq0rcOaHbfFU5/KrV/PVl+avnj8ur3WLjWtI0 i2juNN1i9P1ie3kuFjeGKSQ8WkJSY1qesZpSuKqX52eTpvJv5R6vrmkeZ/Mn6Y09bQRXk2tag9TL dwwuzR+sI/iSRv2cVT3yT+Xh1n8v/LesnzL5ii1m+0ywv5Lg6zfyRtcSQRzNzheVozGzn4lp02FM VY//AM5AX+sad+Zf5X22m6tqVha6/qv1XVra0vrqCKaFbmzjCmOORUX4ZnBKgVrirJv+cj5b3Sfy d1fVdK1C+0/UdNFoLS6tby5hkAkvIYW5tHIvqVRyKvXFWUflR6z/AJa+WLu4uLi7u77S7K7urm6n luJXmnto3kYvMztuxrQGmKsJsDej/nJi80U6lqLaPF5bXU49Oe/vGtxdC8ii9T0mlKH4CRxI4+2K oX8/fzcvPIHm/wAivDK/6PknuZddtkJo9n+6hqyjqV9RnT/KXFXsFzrGmW2kSaxNcoumQ25u3u61 jECp6hkqP2eG+KvJf+cd/wAz9U8+XnnafUGkQQanHNY2cvW2tJ4jHDEFJ+Ha3JbsWJPc4qwz/nFD QdH138oNY0/VrWO7tJNbn5RyDofqlrRlI3Vh2INcx55pY5iUTRZ+HGcakLDyTU7a1j1y9t7RWW0i uJlgSQ1YRI7cQxHU8RnU6zUyxaaWT+IR+0/tdN2Xo46jWwxfwyn/ALEbn7GWflb5Oh82+bodPuiR Ywo11ehTRmijKjgDsRyZ1Wo7Z5tihxy3fae1dZ+VwcUef0x/Hk+p7Py/oVlYiwtdPt4bMLxMCxIE I/yhT4vpzZDHECqfPZ6nJKXFKRMu+3g357/l3pegyWuu6PCLazvZDBdWqCkaTcS6NGP2Q6q1V6Cm 2YOoxCO45PY+z/aU8wOOZuURYPk8buFHIMB1G/zGdr7O6g5NPwn+A18HgfbbRRw63ijyyR4vjyP3 X8WX/mR+VFlon5Kx+a57trnUL9rKW3iQcIoormj0Nfid+JG+w9u+U63tE5JnEBUQfudfo9EIR8Qm yR976m/Kv/yWHlD/ALYmnf8AUJHmI5heIf8AOUv5ZeY013TfzQ8qxPNeaV6LalHEC0kbWr+pBdKg 3YL0enQAHpUhV6z+U/5y+VPzE0aGayuY7fW1QfX9HdwJo5AKsUU0Mkfg4+mhxVkHnfzlpXlPQZtT vpYxMR6en2jtxe5uX+GKGMAMxLuQDQGg3O2KvEvzwFx5K/PPyX+Z1xE7+XkjGm6jOoLiAsJomYge MNyWXxKnFX0LZXtnfWkV5ZTx3NpOokguIWDxujbhlZSQQfbFXhOlab/i7/nKm58z6YPV0XyhYfUr m/XeKS9khkiMKMNmZBcNy8OPyqqyDyhp+leY/wAx/wA4NK1W2S5sLubSra6tX3DINP8ATrtQgnhU Ebg9DUYq811yw83/AJAz6nBbLNrX5Va6ssSrXlNp886FVrWgBqaV+zIPBsVe0/l3e6Lp/wCVHkSz 1Dgtvq+l6dZRxygGOSW4sRIY2DbH1OLCncmmKvHPze/Ke0/K7U9L8/8A5cXMumajLqMFmdAVyYrl rhifSiqeXF+NGiNVp0pTFUx84T/8q9/5yis/OOsAxeWvNdqti+pN/dQyiFIOLtSi0aCNmr+yxPY4 q+jY54ZIVnjkV4HUOkqkFSpFQwYbUp3xV4P+VWlN5k/5yB88fmNZrXy6iLpOn3Y/u7meKOCGV4mG zov1U7jb4hiqS2Wk6vqn/OXXniDStauNBuk0eCT65bRW87Mog05fTZLqOZOJLBthXbriqffkj5qf yz5r1v8ALfzoEg85zXcl7DrT1H6YSUkpJzcmrhBRFFBxHEAFWxVkX/OUf/kifM3/AEY/91C3xVlX 5T/+Ss8m/wDbD03/AKhI8VeVf85Hf+TT/Jf/ALbh/wCovT8VZv8A85HaVeap+Snmi1s4zLOsENxw UEnha3MVxIaDwSJjiqY/kjrFhqv5S+U57KVZUt9LtbObiQSs1rCsEqNToQ6HFWN+Xok1T/nJTzLr Fk/rWej6Bb6PeSrui3c1wtx6XIbFkSP4h2OxxVCeavK+n+f/AM1vNXl6+/3ktPKtvp4f7XpXF7dt dJMFr9pTbxMNv2cVYD+WeqeavNGi235IazBLDcaBfNH5mujXidFs3V47cPt8U0pWJaf7qFcVZL+W PDRP+coPzD0FVEUOo2kOoQqo4oSBDJRen/LU3TwOKsC/5x7/ADR0byR+VF8LqGW71C61m5a0tYxx Vgtpagl5SOKip7VPtksWglnnsaiObVm1kcMd9yWBTXZn1Ca6ICGeR3I6hfUJr91c6DXabxNPLGOf Dt7xydZ2TrRg1mPMeQnv7jz+xmf5V+cYPKfm+HULsH6jPG1relRVljkKtyA/yXRSfbPNcU+CVvtf a2jOpwGMfq5j8e59U2etaPe2Iv7S9gmsqBvrKSKYwD4tWg+nNkJgi7fO54JxlwyiRLup4D+fP5ga ZrtxaaJpE4ubSwdpbq4jNYnmI4qEYbMEUt8Q23zB1GUSNDkHs/Z/s6eEHJMVKXIda/a8duGqwUGo A3HgTna+zmnMNPxH+M38HgvbbWxzazgibGOPCf63M/oHves/m/5m0DV/+cb7S10y8WebTjpltdQH 4ZY3iURnkh3oSux6HNbqcE4ZyZD6iSGjTZYSxARPIB75+Vf/AJLDyh/2xNO/6hI8LIspxVg+v/kl +VOvXbXupeWrRrx25vc2/O0lZ615F7ZomLe9a4qoaR+Q35S6TqUGp2nl6Nr+2dZbe4uZ7m7ZHQhk ZfrMsoBUio8MVZvf6fYajZzWOoW0V3ZXC8J7adFkjdT2ZGBUj54qwy1/JD8s7MsLPS5bWByS9pBf X8Vq1a15WyTrCRv0KYqy7StG0nSNOi03SrSKwsIV4xW1sgiRR7BKUPviqT6L+XXlPRdev9e023uI dW1Qo2o3DXt7L65jBCeokszxtwDELVdu2Kp5qWm6fqdhPp+o28d3Y3SGK4tplDxujbFWU7EYqk+p +QPJ+qeV7XytqGmR3Og2McMVnZOzkRLbJ6cPF+XqAouwblX3xVB6P+VPkTSdSt9TttPkmv7Ov1O4 vru7v2gqKfufrcs/pmn8tMVT/WtD0bXNOl03WLKHULCYUltrhFkQ+BowO47HqMVYnbfkj+WltEbe HS5VsmrXTzfX7WdD1H1VpzBT24YqzOysrKxtYrOyt47W0gUJDbwoscaKOiqigKo+WKsXsvyo8jWX mqfzZbWdxH5iul4XOo/X79pJEAUcHDTlWWka7EU2GKovzf8Alz5L84NaP5h0xLyexYPZ3SvLBcRM CG/dzwPFKvxAGgbrirfmL8v/ACt5k0BdA1yC4vtJWnK3kvbwF+Lh19WRZhJLxZQRzY0xVHeXPLOj +XNMh0vSI5YbC3RYreCW4uLgRxpsqoZ5JSoAPQYqlPmn8rfJHmnVrHV9dsprvUNMcSafMLy8hEDg q3KJIZo0U1jU1A6jFWTRW0UVuLccniA40lZpWIP8zSFmb6TirCh+SP5ZJczXNrpD6e9weU8en3l7 YxOf8qG1mhiP/A4qyjy/5c0Ly7pqaZodjDp9ihLCCBQoLN9p2PVmPdjviqA0nyH5Z0nX77X7GG4T VtT9P9IXEl7eTCb0UKRc45ZnjPpqxC/Dt2xVMLPy/otlq+oaxa2ccOp6qIRqN2oo8wt1KRcz/kKa DFUmvPyw8k3fm7/GEljKnmQoIjqMF3d27lAnphSsMsaEcRTdcVfOX/OO/wCXGled/wApJ7e+mktm svMFzJHPCFL8XsrUOnxVA5UU/Rjj1stPMkC7DDLpY5ogHoU9/M/8hodE0RNU8r/WLtLQMdRgmZZJ TH19VOCp9n9oAdN+xzZ6Dtc5J8OShfL9TrtZ2aIR4oWa5vHIphTi/wBDf1zF7V7A8WRyYtpHmO/3 eb0vs97Yfl4DDqAZYx9MhzA7j3j7R5qoZCvLktPmK/d1znD2Nqga4D9n38nuI+1HZ5jxeLH7b+VW sedR9j4j49vxzcdn+zkuISz7D+b+s/qeX7Z9uIcJhpbMj/Gdq9w5376rzZn+Xv5ReYPOkFzeRyCw sYgRDdzozLNNX7C0INB+029OmdDq+0MenqNWe4dA8Dp9HPPcifiepQv5oflBrHlD8vdZ1PWJYZJP XtLayNuxdGV5eUjnkEYEcFA27nNZrO0o5hGML7zbsdJoZYiZS+D6p/Kv/wAlh5Q/7Ymnf9QkeYbm FlOKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV86/wDOGn/ksNU/ 7bc//UJa5h6j6m7Hye63Mxht5ZgjSmNGcRoKs3EV4qO5PbKYizTMmg+NNH8sa75q85nSVga31C7u He8EiFfQBYtK7qeJASvT6O+dzlzww4uK7iBt5vJwwyy5OHkSfk9Lk/5xf1YT0j16BoN/jaB1f2+A Mw/4bNUO3o19Jv3uw/kc/wA77Hk+q6PdeW/M8um6nCJJdOuAs0RFVkRWDAivVZEoR7HNxjyDLj4o /wAQdZPGcc6l0L7Wso7SO0hSzRI7RUUW8cahECU+EKoAAFM4ORNm+b18QK25PIf+csv/ACT91/zG 2v8AxM5Zg+pE+T0z8q//ACWHlD/tiad/1CR5nOOWU4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXyD5H/Lj/nLDyRpMuk+XLW1tbGedrqSN5dPlJldEjLcpGY/ZiXbK 5YxI7s4ypkX1b/nNfws/v0vI+BHuZcZUv0Z/zmb9Z+tehYfWuHp+vx0r1OFa8OXXjXemHwhVb0ji 3vZV+rf85r+Fn9+l4PAj3J4yl0nlT/nLmXVv0vLp2lyaoEWMXjx6S0oVCStGIqKV6jLBYjw2eHut rIjxcVC0x+rf85r+Fn9+l5X4Ee5s4ykfnHyH/wA5becdEfRdftrW5055ElaJZNOiPOM1U8oyrYY4 gDYQZW+m/IelXuj+R/Luk3yhL3TtMs7S6RSGCywW6RuAw2NGU7jLWsp7irsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9k= - - - - - - - uuid:c63b31d6-45fe-11d8-8e7c-000393cd9a96 - - - - application/postscript - - - - - -% &&end XMP packet marker&& -[{ai_metadata_stream_123} -<> -/PUT AI11_PDFMark5 -[/Document -1 dict begin /Metadata {ai_metadata_stream_123} def -currentdict end /BDC AI11_PDFMark5 +%ADOBeginClientInjection: PageSetup Start "AI11EPS" +%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 +%ADOEndClientInjection: PageSetup Start "AI11EPS" Adobe_AGM_Utils begin -Adobe_AGM_Core/page_setup get exec -Adobe_CoolType_Core/page_setup get exec -Adobe_AGM_Image/page_setup get exec +Adobe_AGM_Core/ps gx +Adobe_AGM_Utils/capture_cpd gx +Adobe_CoolType_Core/ps get exec Adobe_AGM_Image/ps gx +%ADOBeginClientInjection: PageSetup End "AI11EPS" +/currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 + + + + application/postscript + + + ISC_logo_only_RGB + + + + + Adobe Illustrator CS3 + 2010-03-25T14:28-07:00 + 2010-03-25T14:28-07:00 + 2010-03-25T14:28-07:00 + + + + 256 + 100 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAZAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A53hQ7FXYq7FXYq7FXAEk ACpPQYq9K8sfkxeTWA1vzfeL5c0NaMTOQtxIp3oqtshPblv/AJJxVM5PzH/LXymDb+S/Lyahdpt+ mNRBJJH7ShgZKHwHp/LFKQ6p+en5k37HjqS2UZ/3VawxqB8mYPJ/w2KEri/Nb8xYpDIuv3ZYmpDs HX6FYFR92Ksk0/8APzzG8P1PzLYWXmDT3/vYp4ljc9tioMfT/ivFKLk8kfl/56he48i3f6J1sKXk 0C9JCvQVPpMS34Fh4hcVeYatpGp6Rfy6fqVs9reQGkkMgoR4HwIPYjY4oQmKuxV2KuxV2KuxV2Kp nYeWPMmo2Ut9YaXdXVnDX1biGGR4xTc/EoI274qlmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KovSdI1LV9Qh07Tbd7q8uG4xQxipPiT2AA3JOwxV6/Fp/k38pbVLnU/T13zzIoaC0U1htaioY1Hw /wCsRyb9kAVOKXmHmrzl5h8035vNYummYV9GAfDDED+zGnQfPqe5xQkmKuxV2KuxVfBPPbzJPBI0 M8TB45YyVdWBqCrDcEYq9c0TzHo35mabH5a82PHa+Z4l46Lr3EKZW7Qy0pufDo3ajdVLzHzD5f1X y/q9xpWqQ+jd25ow6qyndXQ91Ybg4oS7FXYq7FXYq7FWZflr5Jt/MWoXF7q0htvLekRm51a6rT4Q CREpG9Xoenb3pirIL/8APvzHBq8S+XoodO8uWZWO20oRR0eFD0kbiWUsP5CKe/UqUp/OHRrC21+1 1zS04aV5ktU1K3UCgWSQfvU29yGPhyxQwPFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqm/ljzVrf ljUW1HRpxBdPE8DOyK44PQnZgR1UH6MVS27u7q8uZbq6lee5mYvLNISzsx6kk7nFVLFXYq7FXYq7 FXYq2jujq6MVdSCrA0II3BBGKvY7SSL82PJr2U5X/HWgRcraYkBry3HZie56Hwah/aOKXjskckcj RyKUkQlXRgQQQaEEHoRihbirsVdiq+GGWaVIYkMksjBI0UVLMxoAB4k4q9T/ADJmi8n+T9K/L6xc C8mVb/zFIhrzlfdIyR2BH3Kvjil5Tih6f5nj/SH5G+VNRPxTabeXFkx7hJWkYfhEgxV5hirsVZF5 Z/L7zh5lIOk6bLLATQ3bj04B4/vH4qaeAqcVZ7D+ROlaUiy+cPNFrp5pU2tvRpCP8lpCrH6IzluP DOf0glozanFi+uQiriw/5x70v4TFqOuEU+MtIlfuNoMzYdlZjzofH9VutydvaaPImXuH66cfMv5L oCkXk12RvtF5PiHyPqMfxy4djT/nBxj7SYukZfYsaX8g9QJSXRb/AEt229eKR2UCnWnqy/8AEMhL sjKORBbYe0OA8xIfj3oa5/JTRdZhe48i+YodRKgt+j7ukc4X/WAU17fFGo98wMunyY/qFO10+rxZ vokD9/yeZaxouq6NfyWGqWslneR/ahlFDQ9GHZlPYjY5S5CCxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2Kpn5Z8w6h5d1y01iwalxaOG4n7Lqdnjb/JdSQcVZ5+cnl/T7ldP8+aEv+4jzAoa5AH93dUP LlTYF+Jr/lK3jil5hih2KuxV6R+RugWt15kuPMOo0XS/LcJvZnYVAloTH/wIVn+ajFLCvM+vXOv+ YL/WbnaW9maXj14p0RPkiAL9GKEsxVOT5t1s+Vh5Y9Vf0QLj60I+C8+dOnPrSu+Kojyh5D8y+bLv 0NItS8SECe8kqkEVf53od/8AJFT7Yq9Ph8tflZ+Xy11hh5n8xJ1tAFMETU6MhLIP9nyPfiMzdNoM mXflHvLrNb2thwbXxS7h+nuSnzD+cPm7VVMFpKNJsQOKW9n8LBQKAGX7f/A8R7ZvMHZmKHMcR8/1 PMartvPl2B4I+X62ESSSSO0kjF5GNWdiSST3JObACnUEkmytwodirsVVLe5uLadJ7eV4Z4zyjljY qykdww3GCUQRR5MoyMTYNF6bovmLRvzBsE8recgo1ShXR9bUBZBKdlRj/Mfuf/Woc5/X9ncA44cu oet7J7ZOQjHl+roe/wAj5vDc0z0bsVdiq+GGaeVYoY2llc0SNAWYnwAG5xVluk/lF+YuqANBok8U Z353XG2FPGkxRj9AxVksH/OOnm4RiXUNR06wjPXnLIzDueiBen+VjaVT/lRmlJ8Nx520uKUdUqhp 4dZVP4Yq1/yozTJKLbeddLmk/kqg28fhlfFVKf8A5x385GMy2F9p1/H29KZwT3/aQL/w2KsZ1b8p /wAxNKBa50O4eNdy9sFuRQdz6JkIHzxQxSWKSKRo5UaORTRkYEEH3BxVbirsVdirsVet/k7fW3mH Q9Z/LvU5P3V/E1xpLNv6c6fE3H5ELIB7N44peV31lc2N7cWV0hiubWR4Z4z1V42KsPoIxQoYq7FX r+qj/B/5G2VgP3eqebZfrE/Zvq9Ffr4emIwR/lHFLyDFDsVen+RfykhnsB5l86T/AKK8uxgSRwse E1wDutP2lVu1Pib9nxyePHKZ4Yiy15s0MceKZoBNPNH5qyyWY0TynbjRNChHBPRAjmkX5r9gHvTc 9znQ6TsuMN5+qX2PH9oduTy+nH6Yfaf1PPSSTU7k9Tm2dC7FXYq7FXYq7FXYq2rMrBlJVlNVYbEE YqCx3OFfUk78r+S/Mvme6+r6NZPccSBLN9mGOv8API1FHy6+GKvQv+Vcflx5PQSeetc+vaiBU6Np xJNf5WIpJv2J9PFKnN+eGn6PG1t5I8tWmkwmq/Wp1DzOOxYJx3/1nbFWI6v+an5g6qzG51y5RW/3 XbN9WSnhSEJX6cUMYnuLi4kMk8ryyHq7sWb7ziqnirsVVILi4t5BJBK8Ug6OjFW+8YqybSfzS/MH SiPquuXTKOkdw31haeAWYSAfRirKovzuttWjW286eW7LWYQOP1mNfSnX/KBbnv8A6pXFKoPI35We bt/KGtto+pv9jSNTrxLHoiOSW6/ytJ8sVYR5r8g+a/K03DWLF44SaR3afvIH+Ui7V9jQ+2KGPYq7 FUx8u61c6Hrtjq9sf31lMkoHTkFPxIfZlqpxVnv576LbJr9j5n0/4tN8x2yXKOBt6qqvL/gkZG+d cVeY4qm/lLQn17zNpmjrWl5cJHIR1EdayN/sUBOKsz/P3XEvvO502Cgs9FgjtY0X7Icj1JKfLkE/ 2OKXmuKHr/kfyHovljSY/OPnmP4m+LR9FcfHI4+JXkQ9/BTsOreGX6fTyyy4YuLq9ZDTw4pn3DvS Hzj521rzVqBub5+FuhP1WzQ/u4l9v5mPdjv9G2dVptLDDGo8+94TW6/JqJXLl0HQMfzJcJ2KuxV2 KuxV2KuxV2KuxVmui/lbofl3TYvMH5kXX1OB/itdDiNbiYjfi/H4h7qvT9pl6Zwr6mgPNP5z6veW v6I8sQL5d0GMcI4bUBJmX/Kdaca+CfSTih5yzMzFmJLE1JO5JOKtYq7FXYq7FXYq7FXYq7FXYqzr yl+cHmfQ4jYXxXW9EkHCbTr4+oPT6FUduRUexBX2xVkFz5E8l+e7aTUfINwLDV0UyXPly6YLU9SY WJNBX3K/6mKXl2o6bqGmXstjqFvJa3cB4ywSqVZT8j49jihDYq9csCfNf5EXlo3x6h5TuPXi/m+r mrGp8BG8n/ADFLyPFD1f/nHzToE1zVfMt2KWmhWTuX/leUGp+iJH+/FLzLVdRn1LU7vUbjee8mkn l7/FIxY/rxQ9N/LPydpej6V/j7zYlLGA10WwYDlczb8X4nqKj4P+C+yN7sGCWWXDFx9VqoYIGcv7 fJIvNfmrVPM2ryajfv1+GCAGqRR12Rf4nuc63T6eOKPDF8/1mrnnmZy+A7kmy9xXYq7FURFp9/LG ZIraWSMCpdUZlA+YGRM4jmWYxyIsAqDKysVYFWGxB2IyTAhrFXYqrwWN7cAm3t5JgOpjRm/UMiZg cyzjjlLkCVF0dGKupVh1UihwgsSKawoS7Xdf1jXtRk1HVrp7q7k6u52A7KqjZVHYDOFfUkvxV2Ku xV2KuxV2KuxV2KuxV2KuxV2Kq1neXdldRXdnM9vdQsHhmiYo6sOhVhuMVetaT5q8tfmTYw6B5zKW PmNB6el+YECqHPZJR8I3P7J+Fu3Fuql5z5t8oa35V1d9M1aHhIPihmXeOWOtA8bdx+I74oZr/wA4 /wCqRJ5sutCufis9ds5beSM9GeNS4r/zz9QfTirzzWdMm0vV73TJv72ynkt3PiYnK1+mmKvVNL/5 1z/nHy/vPsXXmW6METHY+mW9Mr/yLhkI+eKWK/lZ5Gi8y6xLdakfR8vaSv1jVJ2NFKrUiKv+VxNf 8kHvTDGJJocywlIRBJ5BM/P/AJzl8zaqDCvoaPZD0dMtAOKpGKDkVGwZqD5Cg7Z1ui0gwwr+I83g O09edTkv+Ach+O9DeQVVvOuiKwDKbyEEHcH4xk9Z/cy9xa+zh/hEP6wfUN7ZWf1Of9xH/dv+wv8A KfbORjI2N30GcI8J2HJ8gKrMwVQWZjRVG5JOdu+YgPpPyF+V2ieX9PgnvbaO71p1DTzygOI2I+xE DUDj05dT+GcprNfPJIgGoPedndk48MQZC8n3e5MtR/MvyPp2ovp15qscd3G3CRAkrqrdKM6IyAjv U7d8qhoc0o8Qjs35e1NPCfBKfq+P9iM8xeVPL3maxMWoW0cwdf3N2gHqpUVDRyDf38DkMOoniNxP wbdTo8WeNSF+fX4F8u+YNGuNF1u90q4PKWzlaMuNgwG6sB/lLQ512HKMkBIdXz7U4DiyGB/hL2P8 pvyv0tNKt9e1q3W6u7tRLaW0q8o4ojujlTszOPiFegp3zR9o6+XEYQNAc3qOx+yYCAy5BZlyB6Bn OueevJ/l2dLLU79LWbiCtuiSSFV7VWJX4+1c12LSZcouIv8AHm7fUdoYMB4Zyo92/wChW1TRPLXm zSUN1DFe2lzGGtrpQOaqwqrxyUqp3/rgx5cmGW2xDLLgxamG4EokbH9T5l83eXZ/LvmG80iVuf1d h6UvTnG4DI30qd/fOs02cZYCQ6vA6zTHBlMD0+5g2cY+kOxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KvXvJfmjTPPWjL5F84SgXwFNA1l95EkA+GN2JFTtQVPxjb7VDilhVvaar5E/MCzXUk9G40u8i kkYV4vCHBLIe6ulf9vFCdfnzpA0/8xryVF4xajFFdpTp8S+m5+l42OKsj/OCyuoNL8keRbGMyXkd ujPAvV5nCwofpcSYpd55ntPKnluy/L/SpA0kYW51+5Tb1bhwG4H26H5BR45veydL/lD8P1vK9v6/ /Ix/zv0D9PyedZvXlmQfl/8A8pvof/MbD/xMZjaz+5l7i5vZ3+MQ/rB9TXv+8Vx/xjf/AIic4+HM PoeT6T7nyT5eeGPX9NkmIEKXUDSlugUSKWr7UztMwJhKu4vmumIGWJPLiH3vrzOJfTXyX5t0TU9G 8wXllqKMswld1katJUZiVkUnqG/z3ztNNljkgDF821mCeLKYy538/N6T5b/PPT9L0Gw02506eeaz gSBpVdQG9McQd9+gzVZ+yZTmZAjcu90vb8ceOMDEkxFMA8363F5q84T6jbQtbrfvBGkbkMwKxpFv Sg/ZzZabEcOIRJur/W6bW5xqM5mBXFX3APqeCGOCCOCJeMUShEUdlUUA+7OPJs2X0SMQBQ6PlHzt qEmoeb9Yu5G5c7uVUPX4I2KIPoRQM7LSw4cUR5PnGvyGeecj/OL1b8tPzM8oaR5NsdO1fUvRvLcy gxmGeSitKzL8SIy9G8c02u0GWeUyiNj5h6PsvtXBiwRhOVSF9D3+5gv5veYdC17zPDf6NcfWbf6p HHNJwkj/AHqySVFJFQ/ZK9s2PZuGePGYzFG3T9s6nHmzCWM2OHz52e95PnKveOxV2KuxV2KuxV2K uxV2Kppo3lfzHrb8dJ025vexaGNmQf6z04r9JxVm+mf84+fmDdqHu0tdNTq31mYMQPGkIl/E4qjz +Snley21nz3p1rIPtQp6ZavtzmVttv2cUrX/AC9/JuIN6nnnlx2bgitv024hq7+GKFv/ACrn8o51 UW/nxI3bcNNGoFKdwxjp9JxVa35EPfAny15p0vWSASI1kCOQPaNpx95xSw/zD5A86eWG9bU9Nmt4 o2BW8j/eRA1+E+rGWVT4VIOKHoc5T81Py+a5oG86+Wk/eU+3dW/XoOpYA0/yx2DYpRfmjTv8Tt+V up0EhvhFaXzHv6RjaT9UuKsi1Q2sHnnzL581FRJbeW4YtN0eNukl20QZ/wDgXm4/ST2y7T4TkmIj q42r1Iw4zM9Pv6PE769ub68nvbpzLc3LtLNIerO5qTnZQiIgAcg+cZMhnIylzKhkmDIPy/8A+U30 P/mNh/4mMxtZ/cy9xc3s7/GIf1g+pr3/AHiuP+Mb/wDETnHw5h9DyfSfc+Oc7l8ve/flf+a1hqdn b6NrUwg1aJRFDcSGiXAGy/EeknYg9e3hnN6/s+UCZwFx+79j2fZPa8ckRjyGpjr3/tZ35g8s6H5g s/qurWiXMYr6bHZ0J7o4+JT8s12HPPGbiadxqdLjzR4Zi3h/nz8mtS0KKXUdIdr/AEuMFpYyP38K juwGzqB1YfdTfOg0facch4ZbS+wvJdodiTwgzh6ofaP1sD0X/js2H/MRF/xMZscv0H3Omwf3kfeH 1/nEPpz5A1r/AI7N/wD8xEv/ABM52+L6B7nzHP8A3kveUFljU7FWPZwr6k7FXYq7FXYq7FV0cckk ixxqXkchURQSSSaAADqTir0LQvyV16e0/SfmS5h8s6QKFp75lEpB8IiVofZyp9sVTQa9+SvlP4dJ 0uXzXqKbfXL2i29f8lXXjsen7r/ZYpS3WPz68+3qejYyQaPagcUis4lqF7DnJzI/2NMUMI1PzBru qsW1PUbm9J3/ANImeQfQGJpiqAxV2KuxVtWZWDKSGBqCNiCMVZr5Z/ODzvoRERvTqVh9mSxvqzoU 6FQzHmu3gae2KvTvIbeVNd1uHzR5Kj/RGu21BrflwsFintpCBIYvsqKbMpFF5Acgta4pelQeULC3 OnLCeMGmX9xf2sVBRfrMcwaMf5Ie5LL4UAwK8p/PDVYbWW18s2Tfu0kl1G//AMqe5kZ1B+XNj8iM 3/Y+CgZn3B5P2i1VyjiHTc/oeUZvHmHYqyD8v/8AlN9D/wCY2H/iYzG1n9zL3Fzezv8AGIf1g+pr 3/eK4/4xv/xE5x8OYfQ8n0n3PkCxsbu/u4rOziae6nbjFEv2mbwGdvOYiLPJ8yx45TkIxFkp7L+X HnmKJ5ZNGuFjjUs7ECgUCpPXMca7CduIOYezNQBZgU78kfm/r2gPFaagzajpIopic1miXpWJz4fy tt8sx9X2bDJvH0ycrQdtZMNRl6ofaPc+hbC+tNQsYL60cS2tzGssLjurio2/hnMTgYkg8w9vjyRn ESjuC+cfPWi2egfmU0Fsojs2uILmKNeiLIVZlA8A1aDwzqdJlOTT2edEPC9oYI4dXQ+mwX0tnKPe vkLX42i17Uo2+0l1MrfMSMM7bCbgPcHzLUiskh/SP3p/5W/K/wAy+ZtMOpac1utuJGipNIytyUAn YK23xZjajX48UuGV25uk7Jy54ccKq63QHm7yVrHlW5t7fU2haS5QyR+ixcUU0NaquW6bVRzAmPRo 1mhyacgTrfuef5xz6M7FXYq7FXYqy7yR+Wev+aud1HxsNFgqbrVrn4YUVd241pzIpvQ0HcjFWUTe d/I/kZGtPI1kuqayoKzeY71eQB6H0E22+VB/rYpeea95l17zBeG81i9lvZ9+JkPwqD2RBRUHsoxQ lmKuxV2KuxV2KuxV2KuxVHaHrepaJqttqmmymG8tXDxuOh8VYd1YbEdxir7K8s+YbPX/AC5Y65AQ kF3CJWBP2GG0iE7fYdSpPtgpNvl7zXrTa35j1HVSSVupmaKvURj4Yx9CADO10+Lw8Yj3B811mfxc sp95+zp9iU5c4zsVZB+X/wDym+h/8xsP/ExmNrP7mXuLm9nf4xD+sH1Ne/7xXH/GN/8AiJzj4cw+ h5PpPufKPlDU4tM806VfzNxht7qJpm8I+QDn/gSc7LU4+PHKI6h850WUY80JHkJB9YTRRXNs8THl FMhUkd1cU2+g5xgJBt9HkBIV0L5wvfyZ8+Qai9rBYi5g50iu1liWNlrsxDMGX5EZ1Me1MJjZNHue Fydh6kSoRsd9h7/5V0d9F8uadpcjiSS0gWORx0L0q1Om1TtnN6jL4mQy7y9ppMHhYowP8IfPH5t6 vb6l57v5LZg0Vvwtlcd2iUB/ueozp+zsZhhF9d3iO2cwyamRHIbfJ9CeUteg17y7Y6pEwZp4l9cD 9mVRSRT8mrnM6nCceQxL2uj1AzYozHUfb1eQfmL+UvmebzPd6jotqL2z1CQzkK6K8ckm8gYOV2LV IIzd6LtHGMYjM0YvM9p9j5jmM8Y4oyN/F6j+XXlq48ueU7TTbog3YLy3IU1AeRi3EH/JFBmo1ucZ cpkOT0PZmlODCIS+rq8Z/PDWIb/zqbeFgyadAls5FCPUq0j7+3MKfcZveycRjhs/xG3le3swnqKH 8Ir9LI/+sZv+XX/p9zmHuXf9Yzf8uv8A0+4q7/rGb/l1/wCn3FXf9Yzf8uv/AE+4q2P+hZ6j/eX/ AKfcVZ35o/5V9/hS2/TPpf4Y/d/V/q/q/VaU/d/7y/Dw/lrtX3wKwP8A6xm/5df+n3Crv+sZv+XX /p9xV3/WM3/Lr/0+4q7/AKxm/wCXX/p9xV3/AFjN/wAuv/T7irv+sZv+XX/p9xV3/WM3/Lr/ANPu Ku/6xm/5df8Ap9xV3/WM3/Lr/wBPuKu/6xm/5df+n3FXf9Yzf8uv/T7ir0Lyt/gj/CMn+H+P+G6T 8+Hrcab+tTn+88en0YYXxCubDJw8J4uVbsM/6x8/5d/+nvNx/h3n9jz3+tnl/snf9Y+f8u//AE94 /wCHef2L/rZ5f7J3/WPn/Lv/ANPeP+Hef2L/AK2eX+yR2h/8qQ/TFn+ifQ/SfrJ9T4/Wq+rX4acv h6+OV5fzfCeK+HrybdP/ACf4g4K472+rm9Jm9P0n9X+74nn/AKtN81Q5u+lVbvKP+sfP+Xf/AKe8 3P8Ah3n9jzn+tnl/snpmifo79EWn6M5fo/01+q8vUr6f7NPV+OlOle2anLxcR4vq6u+wcHAOD6a2 5/pRuVtyleej9Un9fl6Ppt6vDnz48Ty4+n8dadOO/hko3YpjOuE3yeVn/oXyu/1evf8A3rzcf4b5 /Y87/rZ5f7JmXkX/AAR9Vuv8JU+qcx9Y4ev6fqU7er8PLjSvH2r2zA1fjWPF5/D9DtOz/wAvR8Dl 15/pZPmI7Bx6Yq8quf8AlQn1mX6z6P1jm3rep9c586/FyrvWvXNzH87W11/mvOS/k2zdX/nP/9k= + + + + + + uuid:7127DB5039AC11DFBC4CC917F60414F5 + uuid:7127DB5139AC11DFBC4CC917F60414F5 + + uuid:7127DB4D39AC11DFBC4CC917F60414F5 + uuid:9EF2320A284E11DFACBCF5F943788E24 + + + + + 51.000000 + 66.000000 + Picas + + 1 + False + False + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 39 + 37 + 37 + + + Yellow + RGB + PROCESS + 255 + 242 + 45 + + + Lime + RGB + PROCESS + 189 + 213 + 118 + + + Night Blue + RGB + PROCESS + 31 + 113 + 184 + + + ISC logo blue + PROCESS + 100.000000 + RGB + 0 + 153 + 203 + + + PANTONE 425 U + PROCESS + 100.000000 + RGB + 94 + 96 + 98 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 +%ADOEndClientInjection: PageSetup End "AI11EPS" %%EndPageSetup -Adobe_AGM_Core/AGMCORE_save save ddf -1 -1 scale 0 -148.752 translate -[1 0 0 1 0 0 ] concat -% page clip +1 -1 scale 0 -45.0176 translate +pgsv +[1 0 0 1 0 0 ]ct +gsave +np gsave -newpath -gsave % PSGState 0 0 mo -0 148.752 li -254.868 148.752 li -254.868 0 li +0 45.0176 li +117.999 45.0176 li +117.999 0 li +cp clp -[1 0 0 1 0 0 ] concat -54.9161 147.252 mo -1.5 147.252 li -1.5 1.5 li -54.9161 1.5 li -54.9161 147.252 li +[1 0 0 1 0 0 ]ct +20.5381 45.0176 mo +63.8301 45.0176 li +60.3721 31.124 32.5381 35.542 20.5381 45.0176 cv +cp false sop -/0 -<< -/Name (PANTONE 7506 C) -/0 -[/DeviceCMYK] add_csa -/CSA /0 -/TintMethod /Subtractive -/TintProc null -/MappedCSA null -/NComponents 4 -/Components [ 0 0.05 0.15 0 ] ->> -add_csd -1 /0 get_csd -sepcs -1 sep +/0 +[/DeviceRGB] /CSA add_res +0.372549 0.376471 0.384314 rgb f -7.82032 17.3956 mo -12.9034 12.8946 20.6797 13.3624 25.1856 18.4405 cv -29.4395 23.2481 29.1768 31.1573 24.5225 35.4014 cv -19.4395 39.9131 11.2784 39.8477 6.76954 34.7637 cv -2.26661 29.6758 2.73926 21.9004 7.82032 17.3956 cv +62.46 39.5361 mo +54.5381 21.667 23.9551 8.62402 0 27.083 cv +0 45.0176 li +18.1216 45.0176 li +33.1802 33.3477 54.6216 31.624 62.46 39.5361 cv cp -11.7549 43.3096 mo -12.2579 48.5938 li -16.7979 48.8663 li -17.9268 43.7178 li -20.3682 43.4747 22.7608 42.7344 24.8936 41.4756 cv -28.8946 44.7803 li -32.2999 41.7657 li -29.4512 37.3243 li -30.8975 35.3721 31.9356 33.1631 32.5196 30.8428 cv -37.9678 30.3233 li -38.2413 25.7842 li -33.0137 24.6417 li -32.794 22.21 32.0909 19.837 30.8458 17.6924 cv -34.1573 13.6866 li -31.1416 10.2813 li -26.8135 13.0518 li -24.8252 11.46 22.5674 10.3506 20.1846 9.75684 cv -19.6973 4.61329 li -15.1592 4.34083 li -14.0616 9.35645 li -11.6202 9.62598 9.22754 10.4092 7.04786 11.7168 cv -3.06153 8.42383 li -2 9.36426 li -2 15.0967 li -2.42969 15.7667 li -2.27442 15.96 2.14551 16.167 2 16.3663 cv -2 42.168 li -5.16114 40.1416 li -7.12208 41.6631 9.37012 42.7315 11.7549 43.3096 cv -/1 -<< -/Name (PANTONE 301 C) -/CSA /0 -/TintMethod /Subtractive -/TintProc null -/MappedCSA null -/NComponents 4 -/Components [ 1 0.45 0 0.18 ] ->> -add_csd -1 /1 get_csd -sepcs -1 sep f -19.8682 23.167 mo -21.6221 25.1495 21.9336 28.1055 19.6426 30.2452 cv -17.7315 32.5264 13.9385 32.1124 12.1084 30.046 cv -10.2051 27.9034 10.4053 24.626 12.5489 22.7256 cv -14.6924 20.8213 17.9698 21.0293 19.8682 23.167 cv +63.7471 38.749 mo +60.9551 20.874 52.6006 1.02051 38.0801 0.666992 cv +38.0801 0.666992 li +32.1006 0.864258 27.0381 3.77051 21.9551 8.37402 cv +21.2773 8.9873 20.1318 7.98926 21.0381 7.14551 cv +24.5068 3.95801 29.2256 0.833008 33.0381 0 cv +0 0.0263672 li +0 25.249 li +25.0801 6.70801 56.0381 21.333 63.7471 38.749 cv cp -24.5225 35.4014 mo -29.1768 31.1573 29.4395 23.2481 25.1856 18.4405 cv -20.6797 13.3624 12.9034 12.8946 7.82032 17.3956 cv -2.73926 21.9004 2.26661 29.6758 6.76954 34.7637 cv -11.2784 39.8477 19.4395 39.9131 24.5225 35.4014 cv -/2 -<< -/Name (PANTONE 871 C) -/CSA /0 -/TintMethod /Subtractive -/TintProc null -/MappedCSA null -/NComponents 4 -/Components [ 0.3569 0.3608 0.6353 0.1882 ] ->> -add_csd -1 /2 get_csd -sepcs -1 sep f -42.0054 124.904 mo -38.6949 132.106 29.9537 135.87 22.7505 132.561 cv -15.5523 129.245 12.4058 120.72 15.7144 113.527 cv -19.0259 106.334 27.5503 103.179 34.7427 106.488 cv -41.5435 109.62 44.98 118.187 42.0054 124.904 cv +65.2041 38.874 mo +68.8721 15.208 81.1221 -10.792 83.7041 11.542 cv +83.7471 12.583 82.2471 12.583 82.2471 11.667 cv +80.9541 -8.08301 70.3721 17.833 66.8291 38.292 cv +78.4131 10.792 107.704 1.29199 117.999 12.917 cv +117.999 0.0263672 li +42.9546 0.0263672 li +55.5381 4.42676 62.7471 21.749 65.2041 38.874 cv cp -52.1324 108.189 mo -46.0132 109.425 li -44.6382 106.935 42.775 104.731 40.4371 103.029 cv -42.0914 97.1954 li -37.271 94.9756 li -33.9527 99.9629 li -31.0816 99.1973 28.1519 99.0762 25.3277 99.5635 cv -22.3921 94.2989 li -17.4175 96.1416 li -18.6011 102.011 li -16.1207 103.443 13.9351 105.404 12.2232 107.825 cv -6.41944 106.179 li -4.2046 111.001 li -9.19288 114.318 li -8.42237 117.192 8.30616 120.126 8.78467 122.94 cv -3.52295 125.882 li -5.36475 130.86 li -11.2349 129.672 li -12.6656 132.151 14.6226 134.34 17.0562 136.049 cv -15.4068 141.854 li -20.23 144.069 li -23.5582 139.057 li -26.3648 139.764 29.271 139.844 32.0865 139.344 cv -35.1089 144.747 li -40.0816 142.907 li -38.8687 136.883 li -41.3609 135.473 43.5679 133.563 45.2554 131.213 cv -51.0806 132.864 li -53.2984 128.045 li -48.1685 124.64 li -48.7964 121.878 48.8687 119.031 48.4048 116.281 cv -53.9722 113.169 li -52.1324 108.189 li -1 /1 get_csd -sepcs -1 sep f -25.3804 126.851 mo -21.3306 124.99 19.5601 120.199 21.4234 116.152 cv -23.2847 112.103 28.0757 110.342 32.1226 112.198 cv -35.8609 113.921 38.1509 117.934 36.23 122.414 cv -34.9371 126.865 29.2769 128.645 25.3804 126.851 cv +66.0381 45.0176 mo +80.543 45.0176 li +80.543 25.8945 li +84.7637 25.8945 li +84.7637 45.0176 li +89.2861 45.0176 li +87.9697 43.7939 87.6777 41.8916 87.8086 39.8379 cv +92.0273 39.8379 li +92.0273 41.7656 92.1133 43.3867 94.4316 43.3867 cv +95.8555 43.3867 96.5547 42.4648 96.5547 41.0957 cv +96.5547 37.4629 88.0605 37.2402 88.0605 31.2324 cv +88.0605 28.0742 89.5684 25.5586 94.7109 25.5586 cv +98.8184 25.5586 100.858 27.4043 100.579 31.623 cv +96.4707 31.623 li +96.4707 30.1133 96.2207 28.5781 94.5156 28.5781 cv +93.1465 28.5781 92.3359 29.3301 92.3359 30.7285 cv +92.3359 34.5566 100.829 34.2207 100.829 40.5645 cv +100.829 42.7754 100.14 44.1553 99.1064 45.0176 cv +105.153 45.0176 li +102.93 43.1367 102.927 39.5938 102.927 35.9824 cv +102.927 30.6445 102.927 25.5586 109.884 25.5586 cv +114.187 25.5586 115.919 27.9355 115.753 32.2656 cv +111.616 32.2656 li +111.616 29.584 111.142 28.5781 109.884 28.5781 cv +107.509 28.5781 107.202 30.8125 107.202 35.9824 cv +107.202 41.1504 107.509 43.3867 109.884 43.3867 cv +111.841 43.3867 111.757 40.8711 111.812 39.2793 cv +115.976 39.2793 li +115.976 42.1104 115.377 43.9248 114.243 45.0176 cv +117.999 45.0176 li +117.999 15.374 li +108.704 0.791992 74.0381 14.624 66.0381 45.0176 cv cp -34.7427 106.488 mo -27.5503 103.179 19.0259 106.334 15.7144 113.527 cv -12.4058 120.72 15.5523 129.245 22.7505 132.561 cv -29.9537 135.87 38.6949 132.106 42.0054 124.904 cv -44.98 118.187 41.5435 109.62 34.7427 106.488 cv -/3 -<< -/Name (PANTONE 1805 C) -/CSA /0 -/TintMethod /Subtractive -/TintProc null -/MappedCSA null -/NComponents 4 -/Components [ 0 0.91 1 0.23 ] ->> -add_csd -1 /3 get_csd -sepcs -1 sep -f -51.919 34.2159 mo -50.1553 34.3702 48.4336 34.6612 46.7647 35.085 cv -45.0293 31.7598 li -41.462 32.9639 li -42.0958 36.6563 li -40.4815 37.3428 38.9317 38.1573 37.4639 39.085 cv -34.7881 36.46 li -31.7666 38.7081 li -33.5157 42.0323 li -32.1993 43.1778 30.9776 44.4268 29.8624 45.7686 cv -26.5 44.0938 li -24.3194 47.1651 li -27.0049 49.7813 li -26.1094 51.2696 25.3331 52.837 24.6817 54.4659 cv -20.9756 53.917 li -19.8526 57.5108 li -23.2159 59.169 li -22.8292 60.8477 22.5831 62.5772 22.4659 64.3418 cv -18.7579 64.9659 li -18.7999 68.7315 li -22.5225 69.2696 li -22.6778 71.0323 22.9639 72.7549 23.3868 74.4249 cv -20.0635 76.1573 li -21.2667 79.7266 li -24.959 79.0928 li -25.6456 80.709 26.46 82.2569 27.3887 83.7256 cv -24.7627 86.4004 li -27.0127 89.4219 li -30.336 87.6729 li -31.4795 88.9883 32.7305 90.21 34.0713 91.3243 cv -32.3975 94.6895 li -35.4698 96.8663 li -38.085 94.1827 li -39.5743 95.0782 41.1387 95.8555 42.7725 96.5069 cv -42.2208 100.211 li -45.8155 101.335 li -47.4737 97.9708 li -49.1524 98.3584 50.8799 98.6104 52.6456 98.7227 cv -53.2696 102.43 li -54.8282 102.401 li -54.8282 90.2071 li -50.5508 90.4063 47.168 89.4581 43.1543 87.2188 cv -31.6788 80.8194 27.5655 66.3292 33.9717 54.8516 cv -38.3282 47.044 45.9112 42.2872 54.8282 42.667 cv -54.8282 30.4581 li -52.4581 30.4971 li -51.919 34.2159 li -1 /3 get_csd -sepcs -1 sep -f -33.9717 54.8516 mo -27.5655 66.3292 31.6788 80.8194 43.1543 87.2188 cv -47.168 89.4581 50.5508 90.4063 54.8282 90.2071 cv -54.8282 73.5127 li -54.4903 73.5616 55.1485 73.5948 54.7969 73.5948 cv -50.8213 73.5948 47.5987 70.3731 47.5987 66.3975 cv -47.5987 62.419 50.8213 59.1944 54.7969 59.1944 cv -55.1485 59.1944 54.4903 59.2286 54.8282 59.2764 cv -54.8282 42.667 li -45.9112 42.2872 38.3282 47.044 33.9717 54.8516 cv -1 /2 get_csd -sepcs -1 sep +0 0.6 0.796078 rgb f -3 lw -0 lc -0 lj -4 ml -[] 0 dsh -true sadj -54.9161 147.252 mo -1.5 147.252 li -1.5 1.5 li -54.9161 1.5 li -54.9161 147.252 li -cp -0.99 0.99 0.99 1 cmyk -@ -0 0 0 1 cmyk -%ADOBeginSubsetFont: TrajanPro-Bold Initial -%ADOt1write: (1.0.21) -13 dict dup begin -/FontType 1 def -/FontName /TrajanPro-Bold def -/FontInfo 7 dict dup begin -/Notice (Copyright 2000 Adobe Systems Incorporated. All Rights Reserved.Trajan is either a registered trademark or a trademark of Adobe Systems Incorporated in the United States and/or other countries.) def -/Weight (Bold) def -/ItalicAngle 0 def -/FSType 8 def -end def -/PaintType 0 def -/FontMatrix [0.001 0 0 0.001 0 0] def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 67 /C put -dup 73 /I put -dup 83 /S put -dup 127 /Nsmall put -dup 128 /Tsmall put -dup 129 /Esmall put -dup 130 /Rsmall put -dup 131 /Ysmall put -dup 132 /Ssmall put -dup 133 /Msmall put -dup 134 /Osmall put -dup 135 /Ismall put -dup 136 /Usmall put -def -/UniqueID 45714 def -/FontBBox {-248 -284 1528 985} def -end -systemdict begin -dup /Private -15 dict dup begin -/|- {def} def -/| {put} def -/BlueValues [-17 0 750 775 638 660] def -/OtherBlues [301 305 405 408 -261 -256 -222 -209] def -/FamilyBlues [-17 0 750 767 638 656] def -/FamilyOtherBlues [301 305 405 408 -273 -255 -214 -209 -252 -239] def -/StdHW [47] def -/StdVW [118] def -/StemSnapH [47 55] def -/StemSnapV [118 126] def -/ForceBold true def -/password 5839 def -/MinFeature {16 16} def -/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 -systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup -/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def -/Subrs 5 array -dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | -dup 1 <1C60D8A8C9C3D06D9E> | -dup 2 <1C60D8A8C9C202D79A> | -dup 3 <1C60D8A849> | -dup 4 <1C60D8A8CC3674F41144B13B77> | -def -put -dup /CharStrings -14 dict dup begin -/C <1C60D8A8C9B6D5A0DEDEC57B918D61DDFA401F5A49FEA3B89C6864173301 -6BDC674395116B42D2387AF24DF2F1DC60C61A5B6585CC0DA86F050A110B506B -B65171C092F0636620BAA275DBDEA04B3E655EC58BDFB8B9B535650BF4DE0E82 -1C2ADFD8C9F649E0C395722C228833505318AA21D61F3D55D035246FCF9BC983 -692D83F8C9AF492468B91F4CB872C7D1953185BF38A8E7A5B72C7F51E36572D3 -718D9C26EEF5DDFAB02F3E79248875F4CA6CC06F7C289C017B388B2CFE4B85A5 -1B0090> |- -/I <1C60D8A8C9B77771C05B04C6A1CDBDED73825D1016AD1A9F739BE3AE28A3 -2F89A16FA0ADB365C478020BF11BB9ADC332932373DC2832A2FD54E961E2B084 -4B0EB81447C317CA2A36F9297140F653C6CF38B651D9BF313FA9254650245A3A -6E604D8E9EFFEAAF12423E3B4CFD19A9AFAFF5FC58BD3FF4189B6F8AF938C510 -BD91FB49103F7E5C2AE8440096A8B2CFB59E1B448BD934D6C96663C7ECAD3789 -1B4FEEBF9172B6A7CCC0965D9AA12297E39BBF30EB7B8F6243DD70D9185FBD81 -8CFC74B60F41E69C4533165A53D5C2FC5A9B44BA5F12F31CB79A71FA4F70F551 -E84E63E5837361F7B7736F91> |- -/S <1C60D8A8C9B7F51B95A0DFD92CF0B9552EA2D8DB80CD668D35E3A70F4576 -D4238E8EEA2F046EF8BC16C7785D1607E04A62100A5AFF084F37B544AFC2004C -0BC4AE1356D2B0EC8700AB99117F620401AEDDDFA69D53F0F4E5314303A9C779 -D85053ADE7DEA169C445735EBAC333F65F31A077498B479248885315A58C9DAE -7AD6ABA3F9562E1A36EA3EA3274E191D557F04A6CB9FA3B240660C95B31FD1EC -ACE3874E2F240022DE09CA2256274ED580EE94FBAA5793BD5F9D37682BE7C541 -ACC5EE4D95FB35149493D2CCA9BEA729ABD0DCEC9C95E902EA9DD124CA919CBA -F3364C7699DDBE268B46D54393CC359D98EA67700B83CEF348489F1F90A16D> |- -/Nsmall <1C60D8A8C9B6BC88BD85FE8659C453EEEB8E1BD03325A00213B3F3D -4D450DC128DD37CC24C857B6D60D557A08CD43D812DF35B5BD6760576A63576C -506A238602F1E6EA5D2CF18DAD28B193AFC0FA899C7F243B47EAB7B8460C0CB0 -4242476B1602C4D8E3342E27EB421C00D297126C6E43889F0137C7A1C441FC72 -2BE08EFEBABED7A59A7395971A284A820995BDAAE7D9478AB8745D9C9402C363 -B7514AFE9E3D0AF6A39663E1D555B5F7BDA2CE94F32DDC1E19216692DC849907 -7A3E6206E838004DD8DB4A986C8F31EDCAB6E6B82F722A0EF26221ADD2189144 -83D5E5F90B6CEB939F64EF523B4531C4C0B4ED4F521923EBA94C1FE7AE3B2648 -AB7B1D48BCD570F1DED35E03DBB412CF55B5989A09E378971DDF42BBC4FD1669 -7B92AE130992922E13408AB712F27D256F7305A6C6B07A0AD7C13FE23EFB63CE -65111A1A787D3875B8B8D9507C694904CE3BA8114CCE10FF99A55> |- -/Tsmall <1C60D8A8C9B66C0E1D18F4614EAB544F0CEC538C8C01A016933AA12 -429EBE5390D596C5F67CFF90C2108DEC0E3557EFE47A84AD0A504C83D7E8F287 -5DCBB9233950E37680119C5422B9BA74EB5E3A2AE4E2F090670CEE3CC015972E -6CE8DF50DCD73A5ECEE824E6627364F3B83B1B73833AA7E396445D318F119C4C -5EA2429D5B49B0EDBDDF4808A5790BF8CDC63B184CD3A9CE7C22C4D23ACC081C -FF7BCA42342880880724EDF5A0F6F9059ADD736C441B65FC95D81D78B14BCAE7 -32E0959A4FEDBBA605D7DB559BC1CFFED39160EF11111F189C967E86115A679A -21BB269B7452490D7C600719A2B02BE0A92DC8D7E101DFFE6011D579AD666FD2 -6352E7C3F88546D427880A3ED55A53668B9B911F227F478005846196CB2A821D -9436A361DD997E24624546B193AD16A013BF60C83D456FEFAB524A4C3C4DAF51 -640204EE51B9A6B98D186E77DE45F4BD3696405A93E6DE14A3A251AC1EF6440B -3F074B20C4913F3447DE56969C6BBDB2354148031166D8E9781263F94442062C -991765ADD918972AAE466DE6B9C6E0991428CD75BCCEE> |- -/Esmall <1C60D8A8C9B7FBE1B006E95A68A3EFE857D335EDE0BE9AEA4BE7F95 -2FA0109C6CB803A7F2B985E7BDE818880C9FD186C7136A63CCA57CEDB6AF2828 -DE38E8685BB8771E2988A810F73E0345E8908310C31FD0F7C222F54500389519 -240356E338A96366351A20F484B5651422D1A0FDAE927D548045766A19F6150D -CC390EA0D98D6C0EC5E1C97E0B4512533CA015299550D65A6EA9A741DBD81A7F -575EC26534A2210CD8BC3335B163A776277B6F29843653C092C384FA226EA0E5 -F40EBE1799B10828B444468B3DA053A6ABB46879088C5CDBC46D899C794B325A -A3C97D044BB760BC39839995FB64819C682832A40321F78B99C09513B805CEC3 -996F9F6C14C0DA278CFDCC8EE83409A0C9BCAE8289E42BA209582E05976E48A0 -66222F364CA72855AA1A8DD971B9E012D88EC883F11B6B8DD1F7A3A1A193533F -B42207516FD3B0F5443A7865F511A1795EBD587D37DBDF03F04386AD8496835A -76A8A2EA2B1821C0A26A3284A32DDD223178AF712B0015CA9C866D881702FB56 -88AFCD83EBB5B8B70C983ADB28C933F563180B2F5D693852DE904FE07D55275B -BF14C6F4184BD1B4A9AECA29C644CB5A0BE9622ABA21F24CFE079641418F3570 -3415A4A73F296C050FA68AD25A13C7E948BFB4A1F5816B4ED0207AE7F70F6A21 -CEF402873ACC39E699949E03BE7A042549D2AB51127EAC04572696553A61D3AD -7A50684611A83B8CC45B07DFB59CE66FF4633DDD79F> |- -/Rsmall <1C60D8A8C9B6232B67C2503515E3E19A361BD6B49811E165A598B41 -3BB79166E3FDF489EB666983D5C7D39CD639562A5B5DFFD54539B03730F39196 -01122BFF4EFD30EC733326ACD5E99E075E6AD0B22300446FDA3039558CE7D82F -A6C33C70F1D07536B16D4B1DC2398D650AD9DE1FE1EEF9FC8801CF7C62691F3D -44ABC62967E1B752BCC2F000EEC07286667F57839EF2E6B9C04C2DA9F22FCE01 -4B7A5598EA7A603107AC2DBC5AB39CAF9666BA8BD1E17DD88F1B0183C4C1C3F1 -1214AD45BA4F39EED6AE5D1943AADDA9D1EC079FB2B1E8FDACACF0141DE87287 -5FA936F561AD9761380B6FCDEE2C83C4F292D6BC0EFBBEBA1571BC78DB7E53A3 -C2355971E9941081B36BC438EEEB16D9D4B14BD1644AC5E58981D2AC452FD6A5 -580957C704505040E5A864423A1DEC798AD589C92753FF4E99FE4D12AC55E99D -5F0AB1E5E4B10AE2F480F509E7AF89EE8CEFA0BA716FB8CEAE96307008D32070 -D365B7F6583B829884DD2FE6EB7D95965527303A93BC3BED5A9AD904DA3DA> |- -/Ysmall <1C60D8A8C9B7CDD8BD7DBD65E184B9680768C945EF501FFBAF34DB2 -EB89B7C35DCB2E8CDE46F9D37FB471E35DF335DEED86CBC9BD25ACBBBE505717 -85D55C56B45ACC3A263ED736CAA051A570F787892A1CB6821A2FFAD018F8067C -A681AE9EC8078E3C7AFE94C42C7FD5A558E11749ACDE333C8BDC9884D4FA3DAC -AE8A34DD32D0843E9B8D09766739B4ABA55282A00532DD1F8B6DE1183006D340 -67C1700BABA7CDD73E0CDB5BE2DDAE32FBEED1C6D7EEEA3B5CEB4C4205571F0D -CF1A506D8FC5DC8499A45715F34A9B98FE00C59CEE5F28BBF36D76480FA97A6C -7DA2BD1F5844A8385287554D6A25D036C1B44B3D155C43934FF8AA5F5EFA8691 -C8A756E6E6312D494BA1468BA6D0686CD0C8B3FDB8C0351FA65E6040F976F25D -799285A835570C29A2FB34B27E1A794353E610FC2C4A30406992C247A28AA7F6 -E944BDFAB0BBA11598F8F567A868E003F8F3944F74A873C0B590A5CBD543024C -D6E3B83887E8B4201> |- -/Ssmall <1C60D8A8C9B79FB048C852057885B7FB39D71FC3016435158EC7538 -3A43C835122312509B1BFED76A61F209ED65A42B34BB62984E18488BC60B5218 -01752FF5C2563FA0352A4574582BF27E08DA350B6E25230194888F1FA389A5D9 -3FBF39576DDF170A31E4F9A79349B244BDF70FC82577F5D740926CBB4F2ACA8D -2425F341518CF5F38A11D5613BD07DDED6A6C9CC2A89D2BA18004761AD9B9FC3 -4EDA3D0BA2574B07F9B17535C3DFBDB872ECFEEFC15F4D3F7BCA04E0B730A15B -DD0D5BCB061E10476825BE14CC3CD57D1B8CD428D2118BB782F85F1A67B39448 -980A962927A8E8DBBBF65E6278D0AFECB529564B170722C87DEFBDB> |- -/Msmall <1C60D8A8C9B5BDB4869BB7396C2BCC7E2D035A8DDF69463A769AD1A -A49DB431BF0660A482C35C477875AA9502C9E16D281765C1FE89158C85EF4F3E -57125A0E615EF95AE1B7077390D7D5D6DDBA63FCBAB687625D16C58A812887A3 -BF8B333347AF25B78756DD80DFD049480BBC5CC2E60C8AAAAAEC52485278ACB4 -CB64431DB98372ED33A1281E6970D65A9DEE7B405CB6932D27F2DFA40B98C2E6 -9A163099093F74C6495CCB4C78B91CF36A00F110217924E037A2F56731347A29 -95E8AFF22D6698D628918F5A55716FEBDE556231C95D2821D1B0DE3CCFA65E60 -C9DDB56BAFC7C7328AEA86A4824D8004029A0A0834D297E9E2EE5DAE0DFFB8A2 -CC6F17A3EDC65> |- -/Osmall <1C60D8A8C9B6AE36D8AFC06EF7691CEA7388408CB5711A90AA9C8BB -7DF107C83E9F4C9D93C2707EED4FFD917928C910BF7966EA41381731C2EDBAD2 -707004603AE29A600E85B2D80CC1F8253013508BECCA2FDAB8779E3B7D43916A -0E2CE1B80BB3DF3> |- -/Ismall <1C60D8A8C9B704CCC403F91AADD9CB2F76DB90BC6EC90EF3D45C6A9 -10C33779B027A5893F399469312EDD288FF0EA2B3848F5A530D7C0162C275993 -6728784ECB91933A5B31FC0120544923268E389858466EE39EB2181D57CD3BF7 -07FB3669BB94B89A418CD729CFF5FBF8DC7045D58C25F7CB07F19116123D927E -59434BBF93B4FE5DBF40C126B117E6B60590BBF45DA98B6DE8B19144213326F9 -87495E510476E3585AE1A21D73828E47A902A177877DAAAB4C0EE1255BEF7F14 -75F7B919B37EA781F4D15EE851B6A63CFE7192BA2E00BB3BF61621837B8C6E3E -7AB8CE9EC58E9FFE71C29175C76E5> |- -/Usmall <1C60D8A8C9B6ED055F5BB1EE84E1A93ADDC8E7C125E88D8FF53587C -17D959293900B8FD46371B21619962E4E05301A5E3EA5963AEEE83B21393A2AB -3695359695D60CA9917C3B4C055638C566E55787F9201E25FB6F1ED940BE5C4D -321EC5E70BC368233DBA0CBD12DA827A229D0CC8A349901F7F6297A8D2B5EE1C -32919F009B7DEC73D0710E8891AA9A0D36238E9E944FAFD91D10D63C6B88D5BD -C3A7985808BE85B22B832353DB0C8315F69AE576B8073207A5E9FE25F5A1E4F5 -9C748E9F7D4D5B9763098CB580B40B6CD00897D0384713B624EAD8EE1E24E326 -A2BE8083CCA899DE1FAB4FB90AF9AEB63CFCC24D405FB6596CE1D598C7EFABAD -D016781F1785ACBA6641462356572572D87FF66C89B7A4AFB38B24B24E1E7B07 -44FD561E659DB89FDAA3D90E0980DCB66> |- -/.notdef <1C60D8A8C9B7A73DC56ED86593A26411A239A9F576A4BB06AD4079 -CBD73625AFEDCD129CE8B573E3C4C05A38ADB9D43C2E751D7FE69FF5F6F4BCAD -D50244964753D5C819FE275F32A27920BE3EA3D1AFD957ADA922B28CD2CD8E15 -58DDDC89C143A1> |- -end put -end -dup /FontName get exch definefont pop -end -%ADOEndSubsetFont -/FDJFDP+TrajanPro-Bold /TrajanPro-Bold findfont def -/FDJFDP+TrajanPro-Bold*1 -[ -67{/.notdef}repeat /C 5{/.notdef}repeat /I 9{/.notdef}repeat /S 43{/.notdef}repeat /Nsmall -/Tsmall /Esmall /Rsmall /Ysmall /Ssmall /Msmall /Osmall /Ismall -/Usmall 119{/.notdef}repeat -] FDJFDP+TrajanPro-Bold nfnt -FDJFDP+TrajanPro-Bold*1 [32 0 -0 -32 0 0 ]mfnt sfnt -63.709 49.9312 mov -(I) sh -FDJFDP+TrajanPro-Bold*1 [26 0 -0 -26 0 0 ]mfnt sfnt -78.333 49.9312 mov -0.080658 0 128 0.288605 0 (\177\200\201) awsh -131.874 49.9312 mov --1.83563 0 127 1.73947 0 (\202\177\201) awsh -188.218 49.9312 mov -(\200) sh -FDJFDP+TrajanPro-Bold*1 [32 0 -0 -32 0 0 ]mfnt sfnt -63.709 85.9316 mov -(S) sh -FDJFDP+TrajanPro-Bold*1 [26 0 -0 -26 0 0 ]mfnt sfnt -81.7983 85.9316 mov -0.213654 0 132 -0.177307 0 (\203\204\200) awsh -127.864 85.9316 mov --0.0141907 0 133 0.276245 0 (\201\205\204) awsh -FDJFDP+TrajanPro-Bold*1 [32 0 -0 -32 0 0 ]mfnt sfnt -63.709 121.932 mov -(C) sh -FDJFDP+TrajanPro-Bold*1 [26 0 -0 -26 0 0 ]mfnt sfnt -88.9883 121.932 mov -(\206) sh -109.841 121.932 mov -(\177) sh -130.882 121.932 mov -(\204) sh -144.271 121.932 mov -(\206) sh -165.124 121.932 mov -(\202) sh -182.77 121.932 mov -(\200) sh -199.487 121.932 mov -(\207) sh -210.59 121.932 mov -(\210) sh -230.869 121.932 mov -(\205) sh %ADOBeginClientInjection: EndPageContent "AI11EPS" -userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse - +userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" -% page clip grestore -grestore % PSGState -/FDJFDP+TrajanPro-Bold*1 ufnt -Adobe_AGM_Core/AGMCORE_save get restore +grestore +pgrs %%PageTrailer -[/EMC AI11_PDFMark5 -[/NamespacePop AI11_PDFMark5 -Adobe_AGM_Image/page_trailer get exec -Adobe_CoolType_Core/page_trailer get exec -Adobe_AGM_Core/page_trailer get exec +%ADOBeginClientInjection: PageTrailer Start "AI11EPS" +[/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 +%ADOEndClientInjection: PageTrailer Start "AI11EPS" +[ +[/CSA [/0 ]] +] del_res +Adobe_AGM_Image/pt gx +Adobe_CoolType_Core/pt get exec Adobe_AGM_Core/pt gx currentdict Adobe_AGM_Utils eq {end} if %%Trailer -Adobe_AGM_Image/doc_trailer get exec -Adobe_CoolType_Core/doc_trailer get exec -Adobe_AGM_Core/doc_trailer get exec +Adobe_AGM_Image/dt get exec +Adobe_CoolType_Core/dt get exec Adobe_AGM_Core/dt get exec %%EOF -%AI9_PrintingDataEnd - -userdict /AI9_read_buffer 256 string put -userdict begin -/ai9_skip_data -{ - mark - { - currentfile AI9_read_buffer { readline } stopped - { - } - { - not - { - exit - } if - (%AI9_PrivateDataEnd) eq - { - exit - } if - } ifelse - } loop - cleartomark -} def -end -userdict /ai9_skip_data get exec -%AI9_PrivateDataBegin -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: Adobe Illustrator(R) 11.0 -%%AI8_CreatorVersion: 11.0.0 -%%For: (Douglas E. Appelt) (Mad Doug Software) -%%Title: (Alternate-ISC-logo-v2.eps) -%%CreationDate: 10/22/04 2:51 PM -%AI9_DataStream -%Gb"-6CMtIYE[^blnitWj!HrIdV0lorEFGN3p=d2AK:U\*q_!hY[_$iT*gP5UX1]SSqSRQ?_'$)V>TY%qP`SMZ@PZ&5]GQS5IeD7R -%m`Y!QleGQ7K.p&6?3aPlR\_,pU'rp&CDDZ00VZam^DTYCI"bGS,pf>eC0p"$ku^->l[*"R8fVlPU'FAYD. -%pH<]YO.ZB_I5g)6.fSi&qjT5\No0V,*'aApjM1[&?VKA;s5+k>*rNhPC\4:.?Tp^0SRbF/qI]^'n%Sf"Iau[8YhK*1=8[PW@95Bj -%feh2gC0m5p>Dk5X:Z"Oie -%_>('6rT`ihmf%TV6aJF?pEP/0^\r2;05#YbIeS'\a5_%#Z`D -%M#tCQSj(t84WKTq]6a,!Z/=Ac38STd5'sfM!j\oF_"j]3hd,(Bg28!D:rMsrhk/^7$3khgXInb)kR&(e;*iD*,)s5!YHLWE;hFu@_jloh"cpiZ.#*V2om4is<'4&SdBk2#Kl=D(W,jr6[thj\_UF8BI"+-&1Xoq"0D1+W8Dh:JnpT+i -%?bp*J"_3/!:^b8g,Gjj:7.;#X^kgo%N*@Djcbc(-0AOC"i%MH*E2&Y,7.;#4%A-H(@tJn;2!Os8$cW@"U!DTsAMQKsF+Q,4Oe;i, -%kt)dRoq)"TIA=8=cXi-4#5pe=(a&[0Q=pJ:eFXd+(jnY%(n]#+6%tnan\JSBK@/*E_dD[hPe^Y)"lk6M1lI#5"BTn6]MWVJH7nt; -%F%6*QW'`.gS%s_I:;)FS;nqP0e?[:7eW:lO"/?ORK[IWb1huk&`Wq!e(?%32O'k<#_I'5DUT;*AbSJnUaO(q4]*3rnOg5*b&bcUD"n*]8_:'!OK[Sm3$^B[6 -%5`Z&2n8s>%6#pdm^#=2R9LnWSF!M=0COrQI(Rca192k+D=8^58KSZe<]Rr1otMX5/e. -%i[=]kpN.KAl),"U`6Vl[i%N>*h9-geqXLul[N?!kAp]o#p95J:So\,F?=@Y?r9HTE9mTU-eQ5>%g-7NM(++>09[hd@j04RP-UK1TF%c8k1lR(l6i1KQ.D>/ZiP77uF=:=.,l*oJ5h?SSg[%2rnj-9S%rs]G0#5Y%NI9>jRd)*Dm_=p:p6Ha4( -%%s]7ECC]5b_C2&frY,1V!dlA`)%DM2%tN!shJ!Ad=ANrJE#?0-pjfm:H\(YXcc>jYILn%7LGPCXK7=doF?NF3Tq-Amq6356p8p]/ -%6aLY9>CE'2qW-gq0ue!MF2[/GR -%ID^&7gH`q9k)StGE/[64elI6>-HA)u?IH9bK3#J6Y3dN$<6>cP#CnF3fQ7'/b18A51>EE4/c=%\dK7XPDtQBgl"Sm!\%$3Y`+g>^ -%phb4CTn#q_5Gi]fcCeRTY4"5qE(gL_B,hStRio_GnkVgFj:;#QGL.SM!pD(QA:T_K#IUb-.^[@YnKl!DO]%%E@$]M0nJRC?TJaO/ -%[/OG4$eMo?o)eM8UH$VVn0^Oaf&iE!L-:Ue^bO'_&jB#SoZSTJ1gB+)*ZLLtcG87`T*)j!Fq4E8\oG`8B]7Fc")p\s#s\DC1H6&Z -%^V)m8VOV"`D@n-.9Ri:D?2".%s#oN+DNk$.ZdGU'mT6QL,4qBY+@H[MF!OkpI7,gZ#I6AsAq1^9,N+OLJ_ -%0Uc_EnIin#3eBHQ$c%8\>ec#;QRRJ25F&?&^'+35b_\N[GM$P^0gZ\=Xp$HD=ZE^Y$$\,Fqge4XF^7(gSot56ST)P"8AU6<-)7,Q -%UpuHR/l2P/J=dI!&;Q>Z5h'uT%#cI\]flh6U9K+%qklsH<82S$i^Hu'LXNQmOTH#g)t?H/7.Z$'dRL#8OCRF`K,oY:V.i/9 -%6)H_q\\OhK#AX7.#W%%uFnAA(PN@jK0cnHeo(4+86'6O_)EI+eS)ToS`:0W?-MjmcVDF>)bc3-+I\o]2!?0a6sf"DnFd0hfJ5) -%\rN<5l"eD!!=b>g:hX64>lD -%i`;cm+I."DJKlOj`I80gcMO&DUHLk:Uti3!YmPSWJ0`AeoMEF;oMh?aKV!aA7%S/TP\ARfcOZbDd4]kh[C4_BbZ!$4@E+trFtD[Y -%JjO)n0TcLpVOTL6d`BmG(5\YKJ(H7+f#5moL'QgDl\XCe\.c9Y7emMN[R1WS&E\YX*rEF$ILt,.D8b;n1#3d.J)-X@/Vp+ZtJ<>D"11Z@q@ATG6L%WhJZTRLR+L/Zi,iT\cg0.(BXI7/.T$`VXDO5J0!,;0gilp_l^?ft$cOeN8]rFHV4KH5c.$C>L'c39Qq9D?s5N.7UUD!7#`V>hS`R7pP.&nB&VgH0O'61pfquQW9(N(dBXOB*5Nth7HqL%'4duc(9>$L^\o$7a=ck_HMh$i# -%U_*o&d28')d7gtLiXT!2b3)f(:Ab9oS^Y\CrcHUQjV/<9iG$odb.+72JK5HUV@"4Oeu45M\0cX&'5ItAGNeXIXkBQX2E9VG?LM53 -%CKeCbhf\7%kSMSsi+KF>#h5[;'N2HH[]=0C-EtO,g$UPR"maTmgp,MlBbrA4f^kY9;[:sA&NeecGlt/b"Q*&E7Z7Idl#mijK9L`g -%M[&hpCi6ju>86t'XOXQ4>L@2Mge2HoM:Qa0HfjEu*>RsKA^(RRNqTd2E`(FL#Rgqs3'Y"qfU3"_iutR%qi/B(m>?\$dOp0Rg=9ue -%1l7Q7BphR9il8ne78KT,**L+Plk=.OQ)n-gb-a"AQ8"Y^VGkjii-D6&3l"rNc+5U@F732Dc=;s!*\q3aT!J>rQ3O1h"^NO:8gGY) -%:snJ:C;h5G3n>@M^BLRTdVSQ[2EAj;efM-EmQ_a%g;"`1_J$=kpM+*KnI7)=&]%"8ViA:^+gp6j'fs3%H4VrOXW9fech-gF2?f+09bSrjX;81`e2)5b>9sNr -%Sj\lFfNjA\DD.;``k4=5K&ZX*Cun;HO#WaeO(*0e(gW`VPUjmI$^thg\cYj0T;!oOpSlAl)4nO=LN:;O4['aCP"O-AV>@Q0$`*dc -%n^,a"[3bTF[$M"kk\9_r;ao:Flh`A6P(k/\BA*_pqk9aLN4<(!,Lu*`ZE6PV&hZ[p7s%0J?-E.\)e)pS-epH/\=ti)io;3GAS*e9 -%?n%PAXKAnm/>LfI\tR#eh?/1hlk`mP+ma!'#U?N!`H`4nF,Y9EdX&m`,@t$_OOOi42m2)37!>F5C/LT52P*U_:0/>&4@k+Cc:K]M -%&/;@6ABkLn]ja:]&ab)FMtV-]ng8FliDD\;5slM]i2Apple@,k#IY>CV4reK?3L8]Db,J]lU[.'TemP=,K72KG!OdQ-o/QsJFs.$Jb'Q0XfDq'AX5Ds'oGR3d,LaU%1F78@74ZEh)W3pqF -%F]%_t66M/\_\F#Yef+'r0JfDs>b>N>8L>oW4@]\cZV -%U,PR.JR9'*ej4tgqL7/9ITO0H+;@XbU/:n2c#&GbY!;)/;VoThfae;,?)JuAT>%eH4_ps&m;G4>HRJd$]fUe7m:UG:r9""Hk3`KN -%0)UdfI!^89nu;Iae[`kQs)RjQr-Wqi_p*2_`lfIlYQ!Pf/u4j"&(ejKs39`MotCD%Er5k2iVM^!l>hCIrl`4Lo(N[H2]n'H?V@fl -%nrMad/#mWDX^,8H^V53tjn/**pn*mSYmrpHKoNj6`fKn*Fa9cQO6Y,&Gk@Gn^SX'DWm5acF,S:EQZlF'Np>K#\p'k9*HgHO;KS??`or;"?"koTf*I;9oWhqrkYq&]IT -%0-BVc4rd@"pHMq]+2[=rDXSW1*'[c4pQo6:^:F+<@hjkbh0f$G]"\+U/'6u#a4ned(L(-Up#P`4rkldODsI2m#lgO"5/7,<"#j-: -%b*V_Ss8C.21CWilh-Y%QO8o%Tk3@X"HL/4lIs'cn#Z#l]\au#SGN4H3I]AI,]8)m9a+nn0O>u+P>^q?fJ,XQ_rckuNa]L@)n]1Y" -%%WLM&KC@7MnUr!?a<&:PW8(4=GSeQ&nAFpK>Q]Q\TEU__9DIu9r>!T@rlb6\p(Sr%oGd8'\a&bG[3%)tLO\pW-i]dM%tGc^f9+AX -%I.d:P3f#`/lGJ[,?TrfNW@ld07JH*I2.=KgFDamIq(7m3T.U?Ln5a"Ond>hslih->ARn8ro!Hi3.!rKVl8qJMANo#!\>s4uikVrM\r^\;)5bQ+rJrU'JD#Vu8$lMEE6a%#k% -%l-`P@2"esZs1A<')Ya/+RU3*\h#7'Dh9V^ReXr;8@Cfc&;g7KbF8Ybc=#U]IFEr<3dF6.Rc\guf-GjRg]6kiid\JP -%](p=Dn`-Gfg^3!k/jJ1LIJEBiZ\E8QiWCkphu)gn^HNZf\6;ml)_O9$!('jHDS!LWj<+.mmY.,`GK62.X&[pHN4khJrp+h+_f=6# -%2,q<[q#(*"5G.q&GOtbZI<#l%%=KA/Idc7nNLqI%4/dW.$,2hBs5rI%s6B(@n%O2GmHqs+l;n7ZeMe%PE.@cXXoIS)e`QkSk9!d_ -%h;-obHBhOhYG`32o):r,55PgsGId\)d#6W7??q9W>kn/DWVOF*iB9i[SpfSVk3Dp_gVDS5H1o?uh]jOB]hH0JN>J0GrrtlJld)K] -%YUYM05DBc!U2E*fr>_9"gXrcTfDd"Jk8W.r5Mk4geC7slrq8R:2g:l.(dj/COfNuC])T.e/G.5Ol3@ibDnfOA*90HESN]?dip,8? -%YYT3EVF+7k/g?`BesV(S_%*WF$2I2.FQK>4NuhJc1C;7 -%@_M5E:fiaFd$G?3;:m*.i39sY[JL>4LGZfa`a;q`'C'&YEPa)nh&^48_7>3og>_b7IdX+_oMaW@?/Kt0Y.I'1 -%pO1qB)\2r#c/$l8aDUH$ZE660ep`arpB\D(W4N8;/e$_V4F22md36I"i/rNP!OhNkFe1KE$X:dl<78\cmSt3 -%GK_;HJ%Dd?aqonV6mA2J&8?bbg*)Rg8>Hn3WN1!TJOm7@UjFB8)Mtgi,$cPE*KoY1,uYpa:So1&UPG(HS/jS5Y0@HrRACLkFpt4%g"=(kbV<4C%$H@]JY8qQ -%&o34'0rftq'FoQ.@BXstHQI'_6QLE=:Qg5JQ+gtY-Hikt81cTH9eAgS#(EnD?g\A:Y.=_JYT"#aLfY/.0X -%pN625*ng%=Qa"[P(nVJI-+l^I-.E^A,m7;6 -%)qeF)g>,ndS+,/[ESKau]3X@'ou5kdU,nR`WLd*QYBFONh!3Sco36nT(06C<=O"+>j^atM9_2LjJMh3`MC1M?B[NVdcLn:)H1s+% -%l)BH[s+QL8+.X!,U,_jmcGoGikPA57m`7S!( -%$i"C3Hqt@m&i>%aZ"3i -%VVKeZm"/5'N!!X<_=+NkI(9#up$GO>s16W;^9p`&"L8U298N5/bVbm5/=UV;iNGlQfl*$hCTa5=m*@u#MEVMmE])uoc./5_O&s\VUF."[_05&L?rO.$PJh+8J<%pVG4J5=">)Q,J>*FrRfMp7/_qZ[HPG^sqk6T;sjV(RaQg3ZG;kB?@ -%jV(RaQg3ZG;`:IPes8dOckpjhdJr@%"hL?7ME\NV>+oVa]:^8*<<_Bc_\M`WKW>J^cW@>kBX+/8l4fqnt -%]#Uu=nLE[9cX544'ae#`m]+Q^]m)..<*@&pVCJ%(CWNb>A$3A8+DC^iYm)Ws%TK>aI\YGnd[0`.4cb\NY&6fLJf<0)L1I_:P7@>\Z.,hpPQ0*RETcDbQGpA&J(mE^heM0Amsm8am3Yrh^iD-UcUH<+E=MG_ -%9dC[]jT?Xb3_'ifktCp'7Fr5%I&Xu(M!UW.j+j[j]DL.XkG'E3jOUfm$aBk)PVTHW+]B_hH$h)2]OE#[J^tF7VN>O#>%=d_K1D[d -%-kE9YOXLfNDGj,aF?o,h8e_Z8>%mTG.N)F;8CS)H34-i%eW-/BS7o<5[W$mq]<5bM2S*AK;XmZJVMKDfgK+OiYLFg_u6)A6fC20 -%bPCSU]P:^Xql8b'.=eS`tR# -%>2Ql:Hgi'3^"bYRQ-I3"[glJNoC0r*_c>APr,V+B[CFQS6L/T%c,4iL4kW)gPMMF>@;Gbf]s:7IDl9(9D:gBYQnQ]m[ql_$bNp9o -%>:&%Z7.g:E2j1plFYaEhO9:Z>ib^iT1^@1G+4%7,SAZX(qW2)MEHk229Jm\W_oo?WZYJ6 -%\46!,"Dl_@NAiN>&ZE)62^4l7S9J3g?cZ&<:(_VpN9E:j9. -%Y7sX%;jJIeF+pC@JTW%.Cq>4RYVp63@qdO.)h51P@b -%HC\tSDVD'rk?F4@L9&r%ll?0g@\Oj;W?8u2(o9V!]mM4>PfYj9NSc9A)pA^(nH&W)(RIa(RLtdjr0/2Qj?FI[k,2u0qp$>2o -%8M#?kO&^Gm71EE2h'ZRJR(Ki@r^So'bJ),8iP56cT@P,&P[:VB.]o;B[u'("X/G6"@QE9>:#^`&BiQf^4L!n.qj=1/<)7dE5C-!l;k@'UEQ$#UYtEVkq5TPY[Vj9dE1BV#n;7CVL(:D&L8Q1['m%Q.[YM2'=Mh4?9YhW63T[[X4JBl]>G+&V$37bF8Tpn&@krCh(h]?]#6W1Q]*'aA49($)^.tjGV?.^0m -%F`^NKPE"2(kuom/bB@Z?SZ17[-Mkr.N:t)++`+sQ)@h=Cp]Xj="?eBjZ*Y\HWRV:SA:M^(31$5>7Q=5Pm"?<./]OYe&(e8Y^-)VlYZT" -%A-;Z;%H/#.pP+Fl@BSJ<&3e^r>8k@-qe,7shDDAT:r.tlUr*#/auT[7<:XRJr=`N3T[i9jek+/%6W0OBim6? -%)=)f)kB'dmYJH?R-SO(7j?!"P<-bekY=],2-j'Q!JoGQ/.rEMUO9M=B?Bpi;/`t_)LW6LMMc.TiNZ6/?b4Mp:NgIUp-lh+=?]"_k(P>$sjr -%ahC)/CkpEj%@^iJT[,QYMS-P])nQK-Y,QFt)n^,-=JGTMe^MX_6cq%EkJ>)]X`\\73jKVQ\_3"Z+UUP^6gZ>(QLfZ7iN!X]S)J<759pRkX/%'4K/]FSAQa3oi<3+B"6gdr1_)t6 -%eBGUl/AR)O\6=^$=bs]KYa\PK%>We>@N=Oo)i:EHF%-F1&AaJgRuiunKkj`@7#P!S`cG4O8D"083!(AYp!ADge;RAb)R.`WW"\b+ -%et+k"`*H'#(]1Jj[%):i?peKF0)u;[UUpMS?gUaU^87nl/N#GF(K94i<'L!`MTk$\pVV]W5#p?d6)3Q#GJf+R[(_ilA)/1FQnCK] -%\lEN9>l9nP3c;"c]Pc4n8qf'.@-u?-]$FD-DDm)pV&$$e^a=C.k;;ns!% -%nXOASG?&:i*+*_d`T$.D=+u.*Hf'GRjI+UU4j9N9@J,?]+*2(`=(Z2p/2uTe#"J=)H\3%#dBlldV.'j:>4jd&guJ7=HHB#$k8#Z" -%o5^,;U.(QCB=57=_@fY1H$%056D=q.FJt?>c-KY6)&Zt/0Q)KbcSf#I^=M8+,D0UB4J\tt*=Y4''i%`^amhi+\0Ope9_ZVoA@6]n -%YBYt+\e0EMI'(:4k8MV(&l'(M;;cb_8IC4fIN4b8Z[4m56ZJeb=f))nIGqJW/U+2$W)RpLHeAOj0m[&2BbnCm$DH;L)@P.n\-ftE -%V9jdV_e83]j"b2$e<1>XamV*Rad]6D2"B.["jZNr]]c0.?VXc"mlP+BnPcK!a&nsMF>*qb -%`j=cgcDkNJ=nMp\K<"9dY]sVWaZh.E_,hr.3BP@!a*p%nOIoSh'C\G_SEQ*a<,-'.W&Z+^92Bm/;`oa;r+HIBBZ4ocoG653RcnjZ -%DRf2OlbJnI3E<7%3*5JZ:Y&sa(n4[s<]s?EX@_(+?KG\cq[;#"3krjIQ,5O9f'695p,,kl&(H3)#>4qV>*U''\K^1;OK$)_MRf+" -%9)cM'fO/aS[DLk3I#9+<$_8\hU>RbOpaS*-D'f40Z5YDh.To`-+@8p>KM`]6$,dJYX,q+'P0*./Tn%/%?p"a7@N":Eq1%Ai5M7Qj -%_O5n+g+f5qUq_0"hgQTlpqu_%eDYlQ?p@_lF8b*dIUYO9ZVJWP,F01OL!:k>Hp3@cn5C'Z?Dpop%^QA4D,lZCAnKd-G=TZ22U?g/Z-Tcu>IYAYGbKe75qou6jBB#-L-n7L7l\83n,?8Kpai%F=JE:,k#HkdJXS`\D@fV:D'q("AuZL]QPl_Ohn5/"cX -%8kRjk[A@0`g@J-**UK[5mbV?ecLF(dGN$,VbZ]Fr4uo0#0k?!Y/JEoU3#=G7R:e^/6JY_B&8cD[U,?-fY>7a^f1r"2P\SP6WdB0>W.bGJS(fFe -%kQ"bCr"D\_5j'-\n=#@KGU2\Nf;#^Xln!d@,1/?WrU2=A"TDRI"$V.10_At?QHb2kKu[@@U]1dEtlc[\;I!t'+0>C?!IPDN^HUb -%Po&HN;&48l_["I%(j5ZJU@%WA:J\'qA,\W4E@Nh2W11qma6UH7TF=8?1-k&+&1G]ahYQ*$]*_=!FB,lprpj(3o4BXqniq?cSoBCU -%C:j,EH,?u7YK@Qh-X?8RX%M@bcQXkoE^%ir]q9u8c>ms5`.0[a>:*Dhkf9a"gHP3d+KUIQh.e_>hj -%&,YYZ&qSEHZ?j^\%j9)r\'4gOiiIJ%b#4_hrd*_bs#CND_,Sa@:OM7"T@@8CbWb8Bm=]#r&oA@YMI.^b`sDFeoNI:hmht\Ub2sSj -%d%_kfLq"p4nRG2U'?ocsQ:WrWI(]'pRp3PEa2X[A%t(6;L6hQOE3B:pM.i6&c_:%2W`YLl&VddO*:H8=S:b>2NB2s2+*[mK`*UWT -%3H1#\ZBs+OMcg@n;5S/hS=*CTf@&9rlB*VP#%pX3/pAM@JgRgo&BfO^e%T#*7hl7m:$`hiK^0_*=orp?6pb7&f.AI -%j'%HlN59KH+K%Tf-qKBEl'4e"F]pH#cRP`Wkn^^L%4sC -%duChn1@!It2SgS[B\eR;p#@7H\Vo;hZcYK'[/(K/6OVh41@s%FASjBV\uA_7HV^_=$h9pG2oCg40A-/t'7(+:[b@dJhc"7^4lsC> -%A5nl[ba/j(`*9an#&^_pgSml]ajr&=]qG(jo3jD#$NB]OU[1LHB1CQ4!I@t.5EtknML.ltbcMO-V6ZUm8m'WC)jPT?SV/lBuS8=g1j5:c`eSce/Ea98E4'oba;F[-`E#kH;ZI -%Pc)Klm!Pt6:5Lb -%5SG[WB9,&64,@'Vj^1l:?$%mllTtM.bO`JJ5p'u(UG3tR6HRP2bUVh#4*55LB\5Nmp^g5H0@!PYi21fD\1&kVcI29UI_:+hrkEnJ -%H1h.a^Ud*VIB11#g%3e.T9?=KRPcS$'.U4>5")c(NE*K!'X$<\\,\8k=)W:f!#^Kkf3!`"7cEVic2I>&_tEC-J+GT+\+LQfmm"WI*I[P(e\f;prmi=m -%qYk`IqSSXA4Jmm`=&!a5:L1"bPCJ>LkIZ*c4 -%r<_BZ2'ib8JVqkerU/Ci:SINboKMY70E"PenrE@]53JcIn7-tip$i+X+rp:gCrFSSh.n#o3k>\p%Pr:+SM+0M4,1%a]'u0P%/6@Y -%go;AJ`hDd#':_oV\CD@dJ[2kbZ50Kch%4M&\Y8nOmsP`:Om/TWC'W#7DOTK@j4o]rEV9`-^M;`&*oIk9#9,*rl<3;_^,&M#FZ5@X -%B7_]T\;+\6B__S?J#7!7I+9[1FT^7[ICXiE\8TkQ>W,7ldocK.gr;%DmudMAe2Q_eW5F&VpR\hRGi4#j"Tg[CTa*ic"<^'UiMh89 -%5T+2Jd`M5Kk1AL7cJq2-%GrB53]cCqauV`pc?H[?(Of(4YC0_nCeH..`OT_lT\oWOj#FngM.`JoPoR^.8#T[2s^$Z]`$,Ho3n^T#m\?^o]V=N^^)#__7^75*BGXqu283Y2pS( -%05]]cPFrd&ecVk=h'/YKC&Ki8+#PY=p^P7!ESc=m+@h_N(Vt>SB'6tru"7_h>kJSCI -%<>StFc`W?'C19LIlqKPE.^h&kjre4tZacC^C&sr*N47kETGWD;$;=PZp*_d'KQ%$+Y07mp'^S[B-(XKaLa>jjd-j"P3=fu%n)N'd -%0_X'^]94LgYIr`TOW#64^uqAYMR18ojt:B3O`G`"gT+1&#Q)KX."9L$q%Bfl.6Y>dmYhQZ")F>VhCa; -%.Rp(7H!?HR4P15MmsMGM%0&pqR+'4'b;RWj4$BsW@]Wj1-eUa:+Nc7ZE&l)FEt%aEQj=d>/41qK(@[=grq@<_:lHcY#"Z\-qZJ1n\A2<6$h9V]h5?-'K*jHBg:)M\JX?YfKdHfjd)UJL!@DA6 -%kW"+iT_!DG2hMSsN'Z?jB;P'JmcIi!0*+d+Pb8&merBm,P+'.c-R[e4YdVAcfFs`S]b+b/6#aU9DG5mRjGoj4ZDk\#+='S$M=iZmh,bc -%HVHiTDmkDE"+p]J"!,aLFTdD9kQ&6,ejC.;I$ -%+>O]TdO!*t!Mfa;@4'9u&b`%K@N]C*Cra_O9::`M6AA?S$h&N\\dCqo?=5[\Bo3*P44QG*4g(X>^&8@akrbMhL=IO/.]BIM[EV\. -%P'U@U0ggL0Oa805cm+R;.;ig<0)IpO;i)0abf]K3MmsP51ZU2#a>q43=B*lcM`NT25kjb@r<>6SkU)jeTqg5ijhC2(rM9a1']]@q -%5^i+?Y$Vu#:XrJkiV$A321aN";4h:\Gj]2p8epnB32iPBcsWI+Du6e^JJ*8GaQO7J^ip+p6mCj2psaO<;YQS7coJC_LbdEuDI@&V>'N?,&#P-8+IHZ`?<'0jnR7DnsXZmjtK?r%k-[hT3R;_OWN*ESur$q>Tp,7=e8 -%0!$NF7B?jgT%3mC9-e.PUu@sm-HkDFT.V#^UkfiecCk8N@#"E3/nG6\f.am9"%3=WN=+Z,3`#DMqG0* -%(8ASR%4(i9MS+Rl>Z30k881c[fHe(%ZU`*@=jUC^n>qjsn-O61h")Stf*gtB2PUH[\#=\8ZWC2dXr1(+##*$B19[O^Ng9Z!`XWj< -%J;^ga*9Zn46TNK*6Wp^09sjLO_fm?mFj5A<55T>C['A/. -%S-P-6@hXg-ZU^)p2\XTK3(9LpM2>sK*q'0-74TOo6t*:&>Y>uKo'h*0Y_d^_P:"1+hB:Qf9NR\tM$B!CDV!?\SHe41)1Z3ilgdT^lZr8c^m*n-tK+t4Em;*Z1nZ9(RJjUVR -%`)*A3Y[87C!BHQ@^FgFh%g>]ePXSRhmPMZ!]k2%X7Vp>e'5=BN.go,\n+*!EIYGf1YiM;K;6_B@'rh\?8,*eESrfu?Z7$gCAPkXe -%b6;CCZ!\@Vgl"X@0pGm0q@Xqt`+Fk25d/DbI2UZl!]\!V3CZc9@r"Yi9Mt#LfKm;.MhNHNc&HDf`g5<:=<[7=l1uPQ7,TL$#+J%s -%UU$hUSC&q4[L0Ad:Y=^5HXJ/35D*M1]jRnk^6i7LG[==#aA\b'CrP)p#I?Kh_J+r&O3inVWn?ob -%@#MX1AL@r=?"E7-#C7d!'[%K[WV$tV'+U8"^.G[g//t(_`JXCBm'&P!U@aJ,K<7Jm"_*72#@!%E'8LePMQCjXFrfh_&r-P6WQjcr -%N(FkEMF3dtDt[F5b2t.'%p]b-?F,Vf`c3ETL;]J#HZU6boL7)$' -%Xk<9`=HqWkju%mXJIrfj-H5C;pR+$a@b29M\XJ6Q,)jX4$K40H-F$k)L;\Q2CUD594cuS4oJBsU_*_^@J7Cs%":5e4bMloiUDY+W>gI*B%(ue41,N(,b6%(.[(Sa(I`N/> -%+Wuma%KW%/0He/'%$H-(bcR<4Lb@e^/N`bU<@7KLYc$uF68-bNQ:B7q*r$?p&LNOU,f4tn]L@np_^)#e$'SIVZ4ma"P3.R:E8=>W -%JQU3PCt0Z94=ASbVW2n6EO'\j\1plDNDlNo0W7;LMNg[<&jIu\81!WI`*4_i$3H@q.P;;7Lu8mhcq78p -%R^Je"T2rE%=X\eP'PNJ2'p>RJm>.o]V^1SnCVS`6M -%%'^(;5dE0u6FKf?2>GO<40UMn%fim8/9;-@8M$cBk!kJC=cSdKq5i;mWfHFq1Of"iE/4C15Zr1ZOUZ7Y8:jW(TfmMkc,aJ.,f,bL5FX,iU25#haJ#ETor_2;nTFANE-1\!HeL?.mKnSr'RlA5XbN'8_G+.:b6>]\GgUt)`sZ'$F7 -%@Wk)t">9Hhf5o[+P:i(jTULOKN!1[6"(d+Xrn=(.^c2QS%G2*]q>?2I["KQ^Re]:+ii!`uP=UIt7=L&X$8@TM.17E?'c,Sd9;,W, -%MA_WdD^kG"p9lY%a&F2?)\#XA1og>1@K8nAk3WbYA@pPUWE#m'&1,Mr_L`,cqBQs]mlac5)?Xln9i-1@kXWDr7_Jru%n_baO'9CI -%_,*RtOgC;co)Ua!hCE:@Mf/[/o(ereg*&k<:kha,6BjCs"FX)cM(#i+W6r[bi>0;;6G,a,apWHV@88_V_S@a:b#*D;TIJ9h6A/DW4bn8b&3X0C -%9;9Lb;&mIQ65YLI^C\F_#'E*OfmMm(ZbnQ9/k#k+U:Y!T'pYJO";;+od]dt5oIf\i$-rmi9Y2n[F\/)ddXhY^s/;`H%X/L6+lP$t -%-7%BCAD5.K8+OogdKYU;DD:o5"3VnEZ"GS).<&(/XW"aKA[>sZ6tJ\/TgY72Xo@4Eo`'$*O4D1Qd3jf^f]a'SQu)GP=:?oJ+r3Q, -%=TO`3BPh@G-b\Mt/1P.=$hT3(:l+*D'r\Sk:g[+OP)-d[YSlNnff:"dDr)I5pS<<7#`@ZLgaM2ajiGq#V?H*s@][&"$5X4EOMe,\]m<_Bs7FZ/c%6&#\>hUE#[sMm[AUSh0&&r/)Bk\2%??c1^%BulHG^1D"AFc\2Bg1:fBu+Q6Jt$4'["ukp9.oJ0KOg(2sk" -%$gtqKP>6uc"DkEs=Mi_7?>%N.\]Jcaa!JODJL`f;2dK7GTb(F]sT3Oe!a4M8@j$p"J_ -%$#mmRO;SXfO?;W.CpE=@q+6el8@@rh`B-)2/+10@!#!S%_^s0-5[2:\k3*(M9=->(7T3H^t-0IZIU5s -%buqF4i$B_2*LB=g=2DLo^PI&ZM!$!K-c(\F4G^'dn$q;YDg]"Od:pU*rRbL+!BAekpHTl]V#`dJq,hW9uG^;$,06c]isf!!!b`-MgiC -%_to`'`YGV1/-.'Z7jOnKr5`,X+*j_qM9HN?(V&51H)bU.OU*>R5bs?Gah\;3.IF]!*LBSG)46'a'l>5I;:R_5(>K"o$Xr1,=S+pR -%0uRNt$-S.h8jJ.c>m68lAlc=hVbWA(,fZQ/)aimUDAVXGg;7I68X@X8r,rVi!).YoG0A=1*^FL"Z<^n;>VW/9[l64-X/Jk5,)9HR'k-H@dPF0>Dhg)l"P,skB'?i -%[jSTMNWR/AQXq&QEluP0&jIu;>f2^t>T9NH6oG2ad\I59[]kU?-"WfY8Jk?^F$2t(e.As'B(%;D9?R*1l]oho,2lW9@KfHF:bC-R -%4F(Z1(AK8bYSEaF=`T)hPSdB:]eV&Ze(?]YjdlUr-<9.AP%9C@"9gTL?d#)n""V]_SPM?)q,$Es/N=([3u;15h-NlKTlQ1#k+o0*(8lJ0u9CYrB,+ -%A]K\Pr??=0=S.>S5ec5IL#(%s2S@2s)iJ-Y2Csdl)WJW":&R`V;!N)PD"c`61b@[8TV!EnfmT?+@qTdTAXAU3FjjA/C-rjX9F"U" -%>ILIWaZJ0F2t0:Zb>*@T@`+W%d4n#!h$grag9SoT5^TI^];,nC=k>.2G,RfQEm!hpcVKbSX7/Z'Xc!h@8fq15^.*$H3l/ -%9KoNk<63@/`2V/V`IS/_1ZOg8;mQI&)SM_Ogi?5?u)'>[`6WQ")2asjsi%!+Ir-WPo!0/\/uhNC?r&JH(!qYW8PD4#GM]u>SZ2,MZS\l.@+L8<-Uj2)lB,#:tUu)A\ZNQ*=8NIkuoj3/Z/W63h54gZr+]I!]F4u?,GfUop.'7 -%P]P+tB4,`1.-KiGFTbBD0Mn^XPOo*+r3bf+k_8[HlX58@&DQ+[nODb*kb'tYS9J$S=Qr3U2]$bGjkgr*0+fS.8T*51GbdIDD.a(% -%,tNZ+/lFU3Q]![t+rMV/XlM'*B6KQ%nV37^(`[^6U8Ce.)7&9^0s^#:)F0NqPqkGE$qk8mBqefmHje@[E16!61_:]CK\=C9b//^8 -%gd[DW/Jk]tWi44='5&Z#2#1e^Q#*X+P,1<#,:ea;K91dp)9OBqYmdPKPRQTXN3*6EF1Q269BKiD37`.I[?U?sl-QY*m+K&+W%cDd -%j&-hnhOXgJ)igIhq6*2Yn&Z3rE`c&^hMWrhh1uuuW]g*J%J($UP4WRXDqL6t$q=kO7Pf+eK6Cof855>T5#_F,W03EM>\k&<+l<_s -%\G%W8:uB8sKc\ZVNQeD=*nhd+MHH\ofP]+c4&k[cWAguO>&sY5poFR!6CMI[`X_;[9LUb/S2'+.`c:*ZN!5g54U,rC#n6QsWON"L -%)_c"4(M;Tara=W.dUgiWgZpW\YjB?7T6t0Z5-f6Yc?>LLA5=CC@$BZe`j(88Q6hMJdqZ#9>LJH[1@CY?n3kM`3JA:1+>gQ%h5t@c\9Uq)$eDY5VUAKa$8b:Df%k(mF5;=Z&5!SRg.=1V"+2oc>C#Y>F -%Kcs0kq[gZJSXKj=[2J+QH"M(2[ep[m5"!t$:<27pBcZX -%/G5O/bYXZM^_2XL,G5iIXIgc9.h!k*S+n6SFT@+X!_f^af.\%OeNQQe0mm3CGgUd(R_ZM>NBV=LM*%k#pV_[tjX[n)dqInWPs.dC -%)EA%sQ=IG>#R2p4BOi6[nYl?+q[.*oj$K*nA>?NE]`0M$nV5)6ORbCCjF)&hXapCF(@iIF:W+^9!FL!<-0sZJ>"f>dS -%;T?.)*Otd!kghi7Z;02'nQ^r#ghVgU.$KkB\n'j,@,L8%n[+S![3j$Uhoan]1So/1eNkoEMZ=dR,?)EKpR%A*l9a15\"E5Z$t[p6 -%3b3s=p$ANM\tk@R^g7Q<]I9OY0G<#DH+Rjam=X-+;S/:,0_[#F=SsW,R.u8UACqZBFpVhS&a3%Z(NZ-P!,4\;:9 -%4G%heIAUQ4Z`I>]E`rt2&Ai2ZPk\Ds"4FOMSp:2UrT>aTa^I8i4Xh;X\>d>%s](OdbWL0V>o9(gmA_:WLe7*A'aX,t. -%a$]Lc-&3Aj]7ih]'5&]$2#3QEcJ%j[PrANa[N)g-ZeoTBJR,)erAfpFq[UPSZf8G0J^QVr5I,_R`cB@qf@&q5idI%.>"/5Bt!--SXuBaV:@hm.VpL)QK*sNG-^JgOQ7YH1B-H.G=q2J1WIOVR$FdW!YJ_eo4f$JAp^Ai]"R3(Sr1#"]/HFN0ZV1qaZ>(92#O:3G>%/0DN9I[3![B5:)0PU1jA,hag1X;HfX -%lr#U(H]>,#N$CAFNU.MHQhG,7;RSfNWE:S%Yi[rG>in%H>f(n-BhF6j/!%"bOfVfBnLFcBXH'!7*2:GFCsdr2cA,k?B9Mk[L(J?` -%a/LIjS`CJ,@\=AVikn$j'D%SLBmoMH\h*^DBs"mQJ=)d)X2&-4E=C;Q0d`ogSGJHp:ORg$iDr[1PR1uljQIKDCh7"Nn?h[;c&$F' -%['#63pVi2N-A3\9GSr])Th+<@fG+'^'<:\,1_AoVBHTaUR'gj:qffkGDXHYUS\7E_QJ*lI('rL;%2^^O\'KG\;LjSHH2F;CbeK-fEu/;7ZAr04`/Q[Ygb*`3HjtN69F9\QM2qiUDT.mEjcuK -%\cpDkR\Ls3_r3uA?H$%^lJR4eToG5sf/htrLY\+lYAsKJNkn@0W^Yfrgl'*sR:NaN4*L6kiOBpX)`Xpsi@(hi/bjA1;6d=5:%M-7 -%YAIuKbe+^>,HUouorhI;9+ejR[q&\dgWhM-?$8<2ZjAGW0E`XG*ufA5,j2sLgm5:9&U(LTK[pq3+!D_R`qJ5KD/i@Rm):.EZ.#l- -%YmaPDn<1Y.6@tT\3J>PuDQDekUpA_^@H_.sa2M#)iX5-6;l7(A43j'>mbLY"@[&j;E6\bO83"n%X6q2Gi3JcWf1MRUCr23Ejd@62 -%.T.TJ.+3k*lh@>5m#/f]KQBo0]iu#&SaL(-icHgb&XK/AVXl,=:I0PVP%K8X75b0Wil&Vco;_5b9`RlY!R>GCkmZq&?u2!"B.EM, -%"D6&4AE-8`[jDat1_%RN?iZRY;0\J8+PO8QMlcQH-\A2C;iAb;EDlLdO_Bs^o;)jopC8?5`>Lu%Pb?D/Sb4_A8"'_XBoIe2!EuFs -%X<>]jGd]]!+]KJP1B?-"r.*gTW[.ekER<_/+s$to2mcDUQ].dmc(1P$9tL^KQft'Z4(QDFhB=#(^]P$(M,Ig(W[S0d=U^*'F$?Zu -%VYX92aM*0J(4ut_.!3@K1)gH':cQ`2.fg@4C?V(7$O9L!R06>W)auU,0[\nE+tPh>&BAlt6Ph]"lS`lU#mIt/7=GB5Q8fN,S/Y0:T9*8k@9+*aT+H_LiiL[=VkOC0%%f^m(E*U6DB,KHo#pqIkg`;Tk"9qPDbLTs3YmBI/+dNo"_*1ECK/*f9KgeT%l<:e1p\ -%A.Y<,0W7gA@U*(c0J/766DFgm&nDIk_2_i=M@Y^1kGRVk!\4FYT13%,V+XZ%PX,^3$/?#/gqoV>$4#@sV?! -%&Ogq0$af,nq4VUt-+0,r$("beX=\DmeJYs2B -%:Ip=YcL[uEa9X)7RtKl=Z?`J#%Hap@0(Q&U3%P<0:X+0!''gFtmhpF_0&nK\Z(MrZ#QWC,+`AuR,_rgWJ^mt=[LCnfKG5b:6&WL:NN%UZG\$7.;iRX>=:%2Mbm*/'IKaIeXY)/ -%rU:R$L;3qcmLYd/e1G"`#pa&62t1)ZBaK/gN)0i<%D2A/(P_=(d2_2nFOj^M^m@C@_&"t/G4;oXOH;+mY'cFPVsUQ(R2,aIdD[(KB>lJYp-8T,$'B)(JH%qR:dcb5sjTe^6*E$1B.Z[ -%LZ^\9R0689:)=3a:*6O+oPJ):k$$)-iNga$0N-%k1T"BN:Pk/GeRDEl$regUdR%=k/HfN+l\o94:UJ9Ko;/9oM#S&9)$5=V8erf; -%9GEp5-SrGp=_6s$5_g!2,q@;QZMiN]We$j2ZP=]VE:`iNiX7AFI, -%q+M6m"o_>-+bmlKQk4RLM%V+@=$b#5j8^'ia>cc:D_f8?UerD1F+2*&LX55s$??*413)]*SD63]/$#[ -%cT"&m:eA\RJ1:u/2#&%U(4[9a5H7!V&R\_"3db30DE -%3E=?s#"8h)&m6V+5p@huJR6YL`GI;'X/VcPI(GgsSC95>83p%J.`4.jEe.RHNpXDR&k=5GQ8g'+=2@FXn>7[Vh)n -%72,W?+IcNFLQ"1C`b94N`_:*/e08l=d5ckI=K-sm#V.K&90..Ie.rXh?q&;`N4CBh6d8%!P>F'_s%5bAVhDB&8nMrUZ"B2_BuTea -%p9ZZHF%W;Q>TLYV"@s_D$6mQKWD&6cph>TJ-4DmZR5U>X'([B.#1?Ik5*Rp=b`aGX"ho+;VTn$So6J7*/_eU+T!:W*.Z5K4mC40= -%C%,'$T1Nja!3ekZ+0-7?W(39G1rJoWI*o7FN3O.3S-D!N;2_0jPm1s-+N'?D-CkN[/'Y;PRt^/g`9Ym&_D&@6kUdIT9QFRQQ6MBI -%0#nTnK-r<'LK*']uNZeN9!%*H90f8-U@iGU3q9\e_MKOhaXfRt1VD -%V#p`p$Io:Z>LM(HqYOpAiRG6,,6&;D(])gjUt1nD(_6IN&0F*V?=A9hn_Y2PUF>&d[4Lf?D34p&e>dRR_ila?"D(Gl0XK]*"Yu_m -%U+ckqU?YR%;.@&=P6YZM:m;7LFOt8i+F\U9O2KHCpfsdp((1G<%^r9qZ=<7U;nsa=fbB^nmV-q-];7 -%"9]'d-3sl.:G@qR5QC0'M[2a#+q-T-LjY#Cnle@/J>c1Ak0D&(5U@s,'Tj)DjAdI'R_Vhf;No$O[7XCdngIDVCPeh9_*j\/XLo+e -%&0VSk6R7D`$P=8=/6HLPW[JM!,#+:_*9;jO#SA%C&0a(872-'fNTgI+b9f.n7uTg6Hpc3S\9s`79'4OsNjWVMlBe0g(fEcuV2Yj_ -%n<8m)P6H.d:LO4k+kPVpOf5(Nm(5n%kkU%9IKW$*l(:#R.%_0)SJ9K5VSl!l-*p:7>rDBE8['.e-/.1?++ -%j[E96M%Pa*Cc7:b\ioqUJu%RK1SFl)a8qG7UUl4T5"KP,cgYg/]$t-D\R!Te4#.p;8gj%hH_X>Ir]3J%35SP2E?i[CuEYJ%b^PiVr]&naiq7F-"rTHu]o:bk@RVV7g46KE(]'I,SF5rT\U-5Q,B2qLI]- -%r!1)%KK;#F@Del:YJu',rk-5Mi@2t^JfXX,Js`03J"]btam\0CPgtcnmopD=K'NAl:uSuqW&oaF:Bo=0f=/fHa45Cc2[$)?*n*Dt -%SU>\-?T[gUK22^.Q[Bd65V?pH'MIKjmmp@@QR-3JrE[uTK_Zj$B7@)BC6iQTR>'H1`]%UXh7T_n7=Jj(fE@&9rXF8-8-NHa\':5JRBg9 -%I[B]S%7@)g:=\Bk]usUf0B&%M@0YW+E.V,dP>Y35L."R_.TM\pj>@umTj\MQ,Jq@mNc;q'[18,W(/DR3BiE]cgI"&2DFnr6nCfJ. -%A4qtCaGL=9NXi0/q\kM^C4YJ5r^gLs^(&[OUc3`q$3Vo+D=kUs(5TE>p*JAB8A.#T>NT`[Nr\JnfS64Z@qh+0fhA#R53%?Dn@+S;&i]bqtN/-DRN"g9!S#ji>`%bl]q2p=PFhuJ.* -%J:MLc8M18OHp8qJ`_V'`%#O<^#bDL@&AUG.TE(a?h*-BV!.IGmA,^f`KK0VeRuZ6BNY7)aGQ&Vc#%tZAoniN3jrV)lof,Wk:!;sd -%T[NM3U4YNMN7P6\n1C>Uf20X-?Ak36+U6,>H*h/=)4GFlgUh"G8(:qrCRZ*1;.m*LqYRG`-QE0@04AlKJc^2Eb522U#"lfp%kLf_ -%?Y136635F>P5,G!!9IgEF9=-R\GYlTE%nR((nf/F_k(7o(Jl'sKHW%&f2&c,&280\>M2idlpF@(PQ0T?/`74f1="cKLMPQ]4.u -%O=)W6E`G%\DsHJ:8%>N,n>+3GLs5M]:#N`$(dG$c&2Q3<=r'4a3/F\\E:+uqP*6Z3[$7gd6W-q,K+Ym4l\'7XSkeP\:Rc*r@1J_YR$BZYe9>?@':P^hj&[q;ND6d-aqMO%95GQr -%np<(tH%I3:WlLkJ*V_a>"!qJf(6/o%%?H*(AG)/L]gTjBL%lCETKRt9EAp!1)Z(SfJ_frM@Fhn1;8C''2I].ld=s[jNR.ks9YX(3 -%+jdPYC>]REZZR8%UQ"XM*&+VV\HN+#P16E48VP!]kk,L[kOHWCn0H8W%lY_O(bkS#:'cF/)t@4t:a-:S\ -%EOegb&_KWE"b(G>Ta$QX=s-@hGLUWAPh-MTKCd?"nebtmAjg^kHndlO5.!GFU!le$9jQN"6#t,k#?2Gc.N_i-3$;8Y!k.]7(6e7o -%WZpX>0IZuI#^H&;@2?m+Lcs5UfO>>p#!_9Ia.k2aXO7;H&R3s1re]Kd\u7BX@Z3$Y"+!DQH]D3#,oS\!RGt2C>$^O"JF7rJ5b;J_qYk8a*n:B -%\9#'FII3/Sqt*1k"E)iYN+gr\KR%ocb>SBE['X!N9Ar:)2,kW5uX+'S],c -%&ZT`rNNWAh.Zc's$D8j5YM=no!Z59"U"p<@bk3L'St+t0&,M,?'?E?*Gn0BtjL$dj7C4r2F@Wn'rL3Wc30D6hHA:nGPC/a>*Jg05 -%FWc)Nh9Yj;HtFWRCbW[g3JmmX1r*UPCA^4ufKd+a<:\qW(7')@pl9S"](\.f0Pk^ALu-)";GBcL*i@Y%l-KaM#Q$TM2DE`S_q?2` -%N6ncI[tCP;?8Z,";ZI=hn\_n7,OFjYaqje&7Yo,K_h[eME`p^k9Z)9S6+nle%r1t!hbRL -%CC22'Q%l[tk2VuZ'Jg9U5YV:GZ_?Z4.)b(n`+1PX!N^GGUPWJ4!7m\K/$#7FCWIkBMub%ZAc;^"&8[Ke6c499>in'B#j^;ch\/LM -%I-H&h$m]j4D/7ks*glsa/V=n7LE#0U$']b-ZNNl&_&8o!S'QUC3,?71V?8rdK2k`_#4ct.EYBksIL;9fWC20W2?oh$d -%+FjrqdL>CQ)"L/Y66IUZJhoGqTt1:`/^Wcd%Q`l#2'F#nL,_R7bP)DfFS(p*T%A,D^8#M\!218MY8KZ;b4cI949Gb0!1c/9VKn7( -%`*1Y"%=mRZJ=f)?Uo58`ciBL6i..C">VTX&%f(sfYso"EEJd#]EKr6l6Ik#O`'>Nu#bZ.(:^.QH#(SQ&,9CZej0R%3mQWUI%)>(N3fCnF4)&6@06Bp'H*np,Xqt -%iSfF(9>`,toe`rT%q)\1<<*q,Ekq,EHR=MS"?"7XL(PsUi44:P'6h@,\E+sFd$i_]9FlB8inV"a\7Z?^*I&92 -%95-)0cRlE!%Q&\Jjg!SrHuPJuAUR:MZ>e^J;&^oeRP%.H)1r`Un\EVh]5\i!gph2LeRgo8#!Ogp-<'\!g'n,Y[!e#$s1)Q\Z3@+g -%NDtJ-V*N54_,rjp3RhUX7(E$4QJ<0tWG4a*!;MA'ei+U8"lgOk1*O_%6>7cBJ5?Ir@M>@7XMTB9?j)(-I7#M5[.)[\>X^RUkRO## -%HJr3L87!V,)N.#M=j`nPH-^7!k;1Z%7/cDZm/"Z>VNl-&W,1$h(suo34pB` -%EMOVu4`3&MKUaXhSMH,DLg_^%C>/9JqRYd2"/`lL<$_j0\f_h(N'P=CQ9"LO=:Lr^bb"<_Gro'g[mPIa$[PWD=rXUi-NOhuj.Y^, -%[SpS+#aH<)155h/%Hec;fHVU5?4dJ;%&A%bqcLndH(+">cNcm`a>/Lc3f-Hdk+G?H?=cDj?AmWL!"4YN0gcG6=; -%5kNYc%L^_$.O]S@XZ-fj-3m#EBMBcI4[9SMDus3$a`jD?G(cfsViAb82n4C,M'nEm!8f#c@#kZ#>"]mg`G3#0n&SC\PQ[C[K[]ZP -%\WiZn<0Ncjd=D?%XF?ZK:BHQ5L+WQR4F+0Ie]'^Ao+dcH$A"St=;?o%bQcjcmPkeoMEi(oO1lXoZ/ZK&W,ij7#[jRAB;t/^fI2b: -%,-m2qo+4oQL@0$n;H&m9FKi&ieRNG6C_O5*MAAD'/d-'I@RHf=e<=F(_u.]f/^`TB/"X?c\t"dY.G&36q.%[MD[:8kVZmEJX?!A> -%%MPT@HsL6I@A"@AMed^]9FY!,LGclr$Z>,KFWrr=bL7#ub2il*QA]J\h9:`g3.anm0;>'^bDD,f8.8n^cmpAZ%m5C$hMgKObBWY4 -%CFHb)?ch=u#jer3<,d,jq/I_Y7Q13+KI;u_Tb#De5UL$dkHsk -%[K5D.1,'EB.e->>3286/WH^XW`l\D%AuKE@NL#:nV87]nQ.uL@E+#Yl7WJ!,b&2Y(@6RMQ8k#%4,EDf -%[QS86lh>>4N9G+H5*.=Jdfcnf_4goP&fR!hciWRcA`Eu*]d=>rUrHe`GopIP]qg$C#ClLMqj;t(#IM)%RNZ7g>%%b_.LW/k_?OH/ -%gB?%p,ugc=W4Lalg0&KF#pU?,<$G6Tdm2.eN^&6ss4c[G;]QFI1Tm6UjPX"Z533]2t&_''G4PZJ(O"D2Xc7[bb7L4=a7q#6HU0-<5:j]SZaVNcDH5/s]X>"ET -%oK_14KY4d_0PX2-'*RG&Q69NR1/ef,Pb+<]7K2n%3:Rl&32A:G#O7dFIg[QJsH0`g4#?=PrQF!KuUl%pN)2k;Gs=@*=$ -%&AB9[**kN)1hMiWjd.^8NL97o7K@t)+!A8reqL,-30;krb#<7![\+_"it4q-:I1Lf$dRi$_M*uDIb&)kci@';k(Y&5$-sSXWK5FU -%^l5j5-5?b'IfuJidBN(W&Fs0[/iW6A6#boggSW]sr^uJM!UA?sD^O1Fue90Eq/" -%88`CJ%Z?4H.9[+KJsRV2$@^<66SP5-3BS_?69a^rS$@n&^26.PQ!On\Tgh!/183b64T9CmDhHuoKD[q-_mITIHmlcGp#A>J*Rlfc -%Q]bku7g"8k0ZNft!!,KhU2:)g=Q=ISXfY+BbT1$sDS:5]6a+8G=k7S)F,7'pdd?#tn5+X"RI;5*d>fQ?&Wr.Uc3G0:ssQo/7j8VEjq] -%SjAYU:d0X7IHY'0r4$$"Q6<:GG=3>#N_-676AH.TB:FMC)m;)klUD8UL*7Pt011%)T8qnNpLi,HOde+^n8rCjPfhH@if=YfmBhSM -%cZt3X,H6q$Ysldk+d7@@TltGUeI;g/q*@`UZ8uF9`mdE5N(d^\*.&`$.NYn9<"\QNE4-QaD_11'6`q8'a\*_*5)9Kp*Y#R]M$*_ANq/9%_F]k)^X]e:c\lrmu?,8T92.OL.PRiT+k*p@Z%D\Ecmj$Z'[XF\0C=jtAUL>.0s[l2:uci9(e5sNOb3.Shbq(o>drH]gU3ia]7VDhk, -%_ijj/*a,32+l:atC=7&dp`h(F+O\Dnb"'Bs3Pk6P?X?lq`ReRFjn9_M[sbXAX@=m,-%@uVTY?Y;74Q'G."s4LY&/53hslsaP'^OmQ\I,30D=dTE%b>91& -%P06Z,JD]d)e.JZ[V@5``1i_el*TD+.r%0s\L_>f;$>5%e]c9`FHN;`@mRZDg`Su2BtF5C%//e%^#IE -%8m>q#(u1tH9obEVb.&HQ,+asYCM0f)`\h%m0-O;&7DTRN/(IjH%4,?AlV(S*gJT;$hA?,#r!#=br^sErZ`8Q*7oM$Z@.<]$#ZD;a -%T)#==&Zq5]#fUcU`jb_<9hD+*%%F]U0UaLH(s;!72M4Y4+`"raI-*4*FZ3&#Bu#0Tl>8S29GC?DAq]&fE;19p0NSGZ-_E,/1VfIa -%0TX[[9qm76!Oq[S_8L;4`=)&3fkHCE4X"P^K?Js+bSr*i,I2!7)!>dhnG(@rn%TFm/kV$X&6rh3N>D_7@q<`L9`eUB!`]R=lq_#P"]X;D=ur79dR//,7OL[Y2DO\B2h@b -%j)8Ra(?b$o:RM`d.G5nEo+Bo=Y75XtS2A,9uK-WGUD -%B:`6:jFf.2W(`R)/SH=S52qTg92>Z?k?d"REY_8Y\u8,r0=YdDl(2Zoald+asFCJMg7#;FZCJdW)A(K#W]T.Ep77&ST7mPD>C/Aft;1 -%gnd]UT6WhfGG@PChSS*O[gDm!q)e0*nAa2)/B)F-,kr$(+fu81jCY8:jrHQ)!atMAA=YEJkPTVqM>8U'S'W,J;J3:ur$qadm%RD\ -%N[_@G&2ulg!Ej4XM>+!jdPpI%>_YiPj\LDRhJ_)X4k"uR"F?!MIUb4UIE&a<*k*XUa):NUOh0kq#C&_HD#65EO;:?.e$mW#AJug\bco@'Td6#%[N(E?EqJqTfL*W7Xi^aFParo5 -%*!'Q$"-N%51jI4TI$8feF\DQe%6m-G4^=&&$\9$7hr8@/!uIP"+779B?G.k5i=o7f'A+EuVSTN3'Gl"bqjL!=M)VY=rmoo,\*1E:67T8_f.5\Tf="1\$Wj(Qo/Z6*$I+mKo"L\j%!Gi=h(OK_1,7uhIbihF=R:(Ae_5/F -%;tH)T+R/8r`JSU('Vhpq2-FQ]1/ad(!jf&S>c(7Ea"mj<_Zac+1btm0fg4+nJ$J@H!H#iK/oE7CIib]&*t/-Se.25uG4G22gau/Ode1fhYk"ff=#Vc&QN?9 -%aFnql(47`\Lng6/EgBVOFDi"%3V.f@,P4gBkGGJS]*Joamg$nDbj.<&UE8d*A&"IRhV[3(^G?#/f -%JE%u#AO0/$hV0%.GJi9LjN#J&m>6g\#LgBg&DE@/9M`$6L+59)8s##!>&'5\l)OT$%n0)\$`;'-2Xfg&;R(G>UkE"X:'g"('>k1Z -%G.M;c0--!n0Q>PVV+I%D`r:Sq&aor\k'c(L4OLJRb4-)q9?*=.BBVFA];K22.nVZuH'u(_Q1aGBbaI&o45AgMq6s;i!l#TG2BtHK -%f4@&r1O:]e7MHIN+6iYeK";Ye,+]@k(7eN1FL\LY3sdSP`iE7._+1(lM-Lee?@%UL3Oq\P_8)dZb -%e+/[`N%>_5PY^/+&Q,Q;8"`9TX(pq!dk?Dh91I!eVJWKJg9d'V'D'SAmG8O\@rW0FUPoO7P=I]9::q[OT2_s2.0dYC"#7so%UYAY -%-BoTI?si#;i>59ORG"$@Vgb60QFqe..5DZ[TbQn60<BikeWRFp\l:)[KN^6. -%X@.a-nQ=nA%7Kp-ZFAoF^Jm@$'>XVfh[0L^qI/"0c;Du."Tpn]rkX;nAFnI#9=]8>.IW3e+I%8pH,3TUE,b,UCh&sfA.`V]liNfG -%UiqgJTP5D.j2GqZStCoL;j)t7"YJ`9N2e8Y>L@5@SP-Po+XINh!hpti-.`;F)2C-qOq95eRuYm+;arcLc.f07qg=IYFQ=?_]EC

'V(m;R69]Ku\j_VAEaUc\k -%E50eMroNNcaIf(\^GqH97tt\q#@W^87p,)h%s>.[PW[]8#qR,(r%<=Jk_9;1UnTb)gW.3*%ZCTb9RJ1TXgrC7p,Ao^$8p`4dIB]+B]bV_ftG]A*SX -%q/l\HU&UXP.qSqD0nsQD[s(#o`9bbtSn+k3ETl3NBOoVLhI+`WL+XYPq"MFBcn;G^/%]XSL7VDZGn-B*ruf'aIQ8K9'XeTLq%\QR -%rAoJ`d!s8k_'`t[^8cE2s7ZHdY:KWm:T*KG(jDP96D\b,GW+"%35Yd_i__q,Q93JhoVZ9*CZ+N?[%)[XAb]cnXEp_e?cDo?_T7&\,@<=mBJh8\PP-&D8ek`,Ld -%qqJ?):@)BC0G+?KFIL7.:!LVC"5#BbcEH77j%f$:AVj_._K(CeP-L400A3MP])Vk?lhra0WfZh!i*C&h(q=lWZI:/e>\'Y#X-HM1 -%)8L+Q5A*f3F2WMSmF'nNI4_.##2p#%dTi72[BcZm?t8;BpGbO4V'pu3";P/+VA!6h39/c?kA$(9":jJ%2S&1GK@gs*ANN&RZA+k/ -%^Yf&Lnt/hq,c]*men"@JgIm*o/`M2G=_4(5etarGj04D^W9*(XZ]9^OEaWNYZ\V%Sk^\JO2aK157pa^]rJ,lia,ZuYh.>?k%7X[t -%?f1lAo)G!j^a;[m:p"JVQ*DQjeO4LE.p#)Zg]p"%Jf[P.`e\DS\KN8CF;df&,HeE.OLmJFT0jra,).Z,#-`L0Ce(Q2o&)6H`7O=i -%7iW$!oD02J#:=Af%@6_.B4+R3\`oN2[F3L0LFWUa<6B7?;Yid\'ST)eI1?1D?m^o+/b<0D@2FMe(3Be$OZZt?23Ml-+["T*I"Zt< -%9*#DqLjZG-W9LN\-.uLNPLq\uOmQFGK*aH8NU!MZf`DoM@BG)4@SK@QP_tOEmTLGeGbA*qEQB_eca%FrX5f-.eCX<_=/1a!K>E$XBj#V36SdJR:%6Pa)iit-d]AA&RO;bSSm#,?g7h"GW]VYLB!M;0ZY$C[K -%F9&hF\Lp>fJ3MhVO*>sV+@72Fk\Luo1D2Z@;P=8l:TsN2Fu&jo(^$:&o_%Qs`^OPK(*GF.?kNU4T[/OBK**((`kM_d<"+_:mA4]@ -%0ipJEnhh2<$_XgPKI:o$NYs\G:_Fq)r"lY\`3sRnO0E^_W3jVPB6U3F+aY$s"/)]+[k!4!-EHt]h@pag&%e4A:?PY4kEiZ*NGU,e -%(esb@737>!o'#eqZ[l\$aCKoR1-h8jk#ItqVFTlL0FH)kVc\sa^h[o]cFsKq?pkE`r\HUKPmI27a4D^OjR'1adF-R>b(lp/We$>C -%:[T6&P6^[V?%3=o+o4WRph37?]H0CN,eHB-9sUd(%.5GKHlH;las-E=/-O69]HiQ)HjdK@9]5(oeeo[B6EC2LhtM51%uhLXE$"Fl -%+##.p-"[Jr-E##.I-(NcK:Xk]o[c2\jO:cu0g*=\d?NK3O)TTnf.[Eop7VdEl+i)X$J551mlrVc=BkqWZ7K%blrH@uoM4'AGP+3L -%St*lU#T/,9,_ -%?WE/.Uji\,i1SQum?cFP?"-=*?_m1V,LMF?`Lc)J8g.L\k82kYVeSnIk(dY+@sFejaMKs;)W:lI?q4q_U^-U5^\:,L&ppQ2d9Mn_a,hEL#.#_KW -%;nH$]h1rZjg;1)ZA5$[#Ma+5Mae5geFa9Pa*nfmtXra4iBtDG=IV+O*%dI9ghK46(].SR"M&h@$;h_od`Y=2Ku'>I@rX0`P>#KT\qe-R)'!m;Y[mAfN/9e2P#VRq\A;W'I!)91Gq9+]V;Sa56*-=_h#W0*;UEJ6Qf -%FM]/c`T!hb+Kf2jXlT)nc(VuGh>*rseddI88(ELb!n3]N= -%&RrmU")]NZc32NQ!fJFp@.aqEX88Lu[7@T@#@8@na@X7cbb']\;DkL4_n[A#:)Cl_Ic1=5o64K)_2KstV!dhFPe;7_#Y@H<$Z8M@ -%%qbD+_ub'lZBHFi6PqC#)CI,^gPs-:!nq`W*mK9:\*EgY=8UMS73\\E%Or;f0jTZrL> -%A0[&AggY`PekSgOTVu6#YB*Pg2Q$V*5]F)$1q)-@*i=6f=@Z#!-c6QM6!9T1&6P)dI!i*JSG8"2q4X*Y^jZb==.>bR/L!-+ndPVc -%9[!ou3.7O?VE0ZeNO^V-QSM'hk`%M"ghKHs!`hj22aQX]0m("=Gd7Gd$4AY2b:jh^Y]UVF/j%aQ`GXG^U]`S0_.Lm[+CBCmU&)Z+ -%YA3i$,R-Z6jVd2LS-K.Z.RkV)QpuU)OFA,GS$Y6Ua:d)^0k(:-IEp9:UAY_S`U'G"#_A(:DNo4d8TJU6""nY^H0lU&,npL5L!DO- -%.p]k';nakYVYeU&<.c$)Gp/Z?C#>o4SErnc%tH0Ii$BY<*)/@-/@BphN:dr=:inMtUf')\`YTunL,^[`H,Q;Dk/LP="IG*0 -%YJm>JDk!gGX])4I`8h\Ckp]'a6kNo4gEm5VDTuK+.H'-_(iF%",a;>3]8$opdS:K@FCih7C+kXl -%$\H&M_n_d;egQFU87R^9$Y>HUuFCr51R@'=d))R"lmqPprheK/;:-!l+-p(Aq"*&hK9#bYXXJ^d)?e;&;f3,dK6`fcnZk085!EOc&7mE`0t)O#%_jft;C53,;AG/cF$L'PCEBA0OiTgWEE*$+-8nXb@+GBJSFlQI`d.rt#j=t+S8:mQE5I'3XtIF[Z&4*"cUT1`1!/cPOCpLT,`>sOPnMO2!&1>o6u?A1hn`D< -%(n+aH?M0t>LiS#XQ5C\`rlYWkfbIs1\4?5JB,A^p9eKNh,LY5=NsD:%E?FPoP"LTf\+T$l[1?/t!_'Y-o9:_P>3miBUUoMTUff+D -%M:.X'$X!"LES1rNJ=\+^3Rk"q:U?Go.E+'4&jU1u1F53*m^$faJZZX$p=[>H"2U%t.HkOFW@Kisb7G$NT3ksmH;K(A9_8IO*_T/L -%(?#UoQ"ojLCuEI%V'Cn_IQQ@Q2RM37X7U4dAlt#r>g_F5HOD*uJh?MC.Od!bQDZZ;5pARJA(ZmbY].T)!Td^0aQ;GC5l]lO":!Ea -%m_'>e+QIF@mq=*$;M^R,8e;*IA?rLSaKpsd7n_@f/PW$>8ntF]ZHK_-<)(@DKK*KtR+''?.K-L@;!M=EArK=B&$@qAU(ha+4tZFC -%YC`!=p#^-T/jAlk(6`h=a6ctsrC2)V=hIK6G#)ohfo505(c4#TC`tCYpm?3gF0%'NOegk9lL?/.'>=;kpBPQ]_\sob#[[Z:^7YAh -%rZ<'GAn!NR@VleN+Q,#K>Bk)>Qj6h4H/=P)>Rl=.R%U1=WP0#oY*-`>I$]2"dEZPr&H,oHR]-%;j;#2)VH@7tD3J74T@Y6\N2DY\B&,X?C^*u#kUu`L\en'cf3@DZ@n<-$8b:GMY4@b9B1[*;.++]Z -%(g*^?JJ82YWoa4CODJ_K\pPZa>o\k+#=ZV1LQ2=/JKU)l#[ -%o-Bu(oI4p<4%To4"ClrHe5@>@b6B1X**e*Bf9:h=Wig,8EmdN4SfUmYGt*@J..M;/Zt!"B%KfF_3f]P/,#e."3MJpm09>RA'Vc,# -%A[[I4Xbe/B(4M/pWp\r+hOosY=@">;eYF8D&U,$b<^JJlg#n@U[@;`Ka_"!r/ul$Anktno)JJ4*PL*1soCHEUX%ml.R4KW;5YhjV -%"/iHV\jY@@kfpJM[>U$0rY72kcb[=h010)Y\F1KJ>M+c"/a5>(`D!oAhPTV\YjKKn'GZQGF17[WWY2:uak&'=7=*PQ5S(j7jjPo5&D_XLqCbR@7JDH^JWi^nn4*M+g!a)Zl%hJb:nZ`56NM2W\.h*%0`4*^r:X\(n@kb&m(_LNe -%MGffIcr#B*"e%>L#,=ck%Ftt2!X2Pg$k_M07(?9]q&]:2<,P,d[hBLC:/)7bdgetePjsp+'hFZb>?R"n[#dfl-,Fo:<>\Tj,;3aj -%:2IA]ZkPk9lu<`KTcfDj+dcfK1Wum,gP@g"4!30)fEPm7`5;?lo%TB[[+2T6;-D0Q -%>;`a[+qfNuLY-X*+Ghukd6MMW)DDl7co0QFZ$Q5SOH+1s6Xid[&/Y)W!aUY[@VUK0U+Np7_cAnQZDCa1\`C.C&K?As+utY3=tmHI -%GugCi]fS&sT*'P->/aFa/gnc_Kp<@tbA[,>=SL6`gn$bHH> -%@QSQW6)t,r]7tb_dRIHPN/'Q05U/XNb>P\#"ZD!R'5,h)ki\Vrk"$q9fH+"8YZ@QU8GH+qE+pQE(:Iu'5*LD]p_OMjFatjm`&kn9 -%Q^tK8k"5a1D3qE2,T<+r>p4&GZH3&4h#]W,aQ]e+e#OeVP\*uTTXeZ/(/Oh1&=[,1((Mtr#?kM6Pa*dOr\EcJa\GB;1(D"K0,2up -%Zk%;,MY#>d$aZ^q+b+a+JA%>MQ@rncZ"p(.1$(H3LFuL.jLDRA3_eGnb=,M]MU;`D])6@rG`fpg;nndag`4J36TV3&S!iTt[US4i -%;!QOWXt_[c<(a';%Jb/+&ruT6C8Bb=_HPLp.#9_&&pT$3>0TeE[Us$WKfPJ4,cde*/l!8"$9'6Xu0^-5(gSSdg -%J5`d.29S/j,eK0."=b$]=L5%;8u1GMN5[,IZQa''4AaJF:Z\:AK79;?XO:*:_.2SB=`'(g0\qX#(H2e\,esuD<`D39hOqi)4s]dA -%4LO-Q#?Rm!77)%Y*`3Jj$I>rfC'kY-gm3>,'a1t>&(W:rDU.mba8cHfZdC'81G5M+l'*$h%d-dW.m3Bo,CZ1KX=t/O -%eBC.8!(ZJ63Z:^:$&MIKG"bPjG9skE;qh_,>)"$Ejj[A:J/OAUA59C/-YX>Hd^%6"/!ben+TUecM>N\Y[L/nu6!'?9;_51BlL3b> -%i&I3D4Ci(IS>`g9%7*;@kC?ne!3>/k\MD<1;GfEH3t*!&nmO,$1i4[9bTO5tl%5NaARocF-i'Cq(:BjW70pV)<1Y3;M'=)_Gas65 -%53bO.:`c^ZpOa,#KSY$'f`mC.3A*=fATFg -%Pj@"g^kL2Td9l&^^p-9A'&M`V-ZIu%`[;:GVtqXI4?WH$E]>?0i,?K$E.OZCSAZ:>8#f=NmDQKX7j;'m@ZnNDLC#,tU6a<\J7#56 -%5h=T_HS,?W@\D9"79WF5:6m=2:8eqDhuM\138cM+^`#q(2A2&T0"Q\HADmGo%d'_>NuZ`DHI8 -%Olpa$2FP<\W*+&MN?\.KQ^0(-/Y`"PWa"hCF5gI1ni_;Gf@5t]Xj=_l@ -%Ig(C*Q,c/!-`_EG1dNhB_+=4QSP#i52oJVP8L<%:p=es)_JDkU;2fUAFA"3?lC3h8^Wf_D/e"e&$BRN'PQdJQnl":hX/R(<:]Asl -%a_bsi5ThjLPu2$3LDo?U;cM,U.[L8aIoQ5FirOAX2(+V2S)ZuMB#l8TackBj7d<(.V:Y$PKUa*4J8W/!8:P"n71uVcgUBAnE$:>9m(n@o83-S#:`%ur2_pO$%0Fmc)':NZ'^%Rgg+A+]3 -%5c!M"0PosRJes.@%[6El5)?d?h1/%(Nac21k@oIUWN0I\A&u(^E<'S`%c;*&(3c[oVs(Hp\1-[2;gj6a4gN<,o,s'JN&q(db&r*e -%#"Sf*`7,GV":4`:15`:Ub*_]m2u@(M&lJ!gll")nEl4Uh#oH9:%Tcl<\hMdUdqET!)f.MM@7F*K(p/VXpRK?b%1a,bc!jQI"lSi# -%D$-8fDUbbV(75Rc(mkqmNc%P6/=-iA:U1FVD)149REM;l:Z2f%_A^-Wm1aOP1u/u2M52U,;oP5l44rAd*K)g(l6IQ]t:od%7dLCS5HM?0D$KM$+$#:J?b0M_k(0Xe/;IL7sJMmq\R?goW/IVAB;0' -%*:u8;1J.M"XXePMQ`>Bj)K@U+j[<7Hm]q=D\Jh#u<0t4rHk&XZUZe-bp>^q/]h]$Kc#$=V:X@Dh[,m[a`d%a^'UFA=O.D-CY?Qa' -%3dGGg!B`3@:4hL4[iHd+&nRsYbe\>)JY9SJjeAW>i&m3fXns)N/-%pZX#LRDVS$tb%LuVOpEnTAdFlEdhrP$M+>sZ\a:_,e"Va>Ft9j3l[[V-%6hK@u?H$j'gA3&).VKkkUF;,\15-p6.#+&mpoea)%H5.utlcH67_uRs]jaA1ik.48Q#_uR$D*#6i3;L?4dPIpad**ab -%U[te-[2bhJMW(9']j>>"C=e(X1VZ)ns#))+eQP*0Ys2_6g8t^ba*h$"2u`4r;H1jrFqa!dKG8^T/ilKb:f-u*G9DHrF.l_r3r2^K -%,_;a0XuT#]T4bIh.NE-mZYE6#bpc)WVJjnRl9^i2aXdK%H&8N#:.W7=")n1m5ZII2bMg4)$^BGrX^-C5$Is,-pJ[[`R/.O's7Omb-If'OJ&Rj3Cu;3Ha\` -%5B1J,&oBCo."73TD5N8V$^K$QM[&i(?O*_W3\M&_/;_`9ZlMU\?l(C+q&#)ghlt$'((0=E_bhQe/"CZ7>Mr]>d('J#p"L][*%O_h -%I#>rb]?S@0DQ6+ACik;rh;G.<$s-(U6"1SW"g:N0FJgj5mUA%;LAs/KL=;gGf]pLn<9'j:ZP<:ZY:V_th'EDq.%Bt/>OMn2!_hA$ -%i%rTjh57B)CDhlq:J\!i@,`PkeB6J\/M.LEH,Xh1rNL"`,16p=TrtAb&`T#dF!`+>qN,KL:/JuJFB!5Aq?Hp;s4\e;Ho3IjZ.(OB -%].kB0]9(=8W2U3K/("f7g(l$8?J%7*:t-T\KpkoM!s%\b*LES=8iWL2`k:sumoMX2MI5-/E?V\.>/Tj5OT7aJ#u:tJJpkFHokAR^ -%oM"F@6ilT[#7S1>YrB8%*en*):BS7(WcdnF_U7XW\0?1lQRh\q*a;tg?-L7`9,IUf2`\Tl.r+" -%O"DT%4lKugX=Z7T^tW%ZfiUZLg!H>P5;8hNl"9c\&ouY!#H&$;/NiI[V=:rhV/W&Zs7c.(VM7l?[:\,tK95Gr1g;WUWADC2%'a8V -%GV%NS9K5DD(7+41_]r.aE$^eZIqNC?c%d"H_e;Y+Nr[R`:PpC?`B"go0EnYfi[J(BQPR&@2anXJ*oZYLX@&Ij@mXcqF<.VEgo*g2,4*E*Eus=)-%CuYn1^rSu>85i>Wp+SlN#*Y4UHDLAo'^6-ucNfc"=ADCSnGWb0d?[M9,6otWHh -%["!2).VmStA51>":C<0J%',p8h58emrgVf2H'siM]"L?qd7l2\#_7.YPaehe0;\o:;-@^WdghKgo3#O*?tR[k!6gB2aTEZZa1YuH -%``J[(>=m[+^iIO"E0LDKC5`EG(_uP1.GEs%L=Z,nWt&#$a3T9YN&oc)"\m!!m<4-obI!Q6CmK.:NWkc2ZM/Pf^!59)Q@W$E^B>Ya -%)]-&XBsFXK=TR;0B[$os(Sm0)])AeNaI_[*k6S_&=ntS]O41\2=f=#lI&!X4A=3Q9M3?tN%g($57$19S%t%hi@d:+:$ld*#f*,?_CsCEP,:u@SPA_"S+q%*bcSYo/di:T^M@PH8SYcMFnYhp -%S]$7Ng38?X,Rj$X'O@F`$OSpJ0&/>7K%8)`]\T\d[o/mO]^.oRB:G6'1O^Z?mm.5Tl!K4'h/Mlpa#0OSJEb)N6I;G]4Jl$Ndn6f! -%J9V@p*+%G:?\_Z)-)A#Hr/?*Ch,>TDb97BpiVfp%8O*<./(CdeG%AL5+6qOQD(eL:+5$E^@E6>:j;^M/V;$cV&gX$iWfEDtOtMtj -%XO0M'V"dX4G4@E.cNlTc0!7Y+,Nj%$1i.^s75%*B/HfFh7P+CfLR$_.$+K"X!XEN,ZI',r)ibbg&Q-5,J3pJI'$+oH;:,:0<=+U6 -%4;[o7/;^092[(D-]*,kUlc*#-n\*.T%Q>lM=4D5@I7!@ElY,2We6ML@fH8E()ZTm25/]kg&Nc:T1o[AtTdd"WV:gp`f7/9AMt3>F:*=8F.KH8fRgn`rM;$L*T0XPD8sD\J/crLjpUG9[J0n.=Lf!V;.".83#] -%Ba/r-:*.?`\3>AnZD?[lZ8*Q?!9>$YA)62jYV)%!kTL5t``J$G)##Y3rAam;Ai2=\1^\,9cBF)W&VJLa^M@DDh[u9'paf(k*JAbV!R7*& -%ra>?;2l["a/MDZg@6&A4#^3^QKLEt8OChkMS&]0rQ<.l"9G1[A(R#I="KlA(O]$RP!qAQk;84[cgNiL\dGnr9\!]n)c*:/344Vb> -%)5s\GU.GLA!3Hs+ZOK;BbL/[)Z_"uOdS!H8;0OHmB/VAn-Urepe9FteH1X"a_+%dSp*6ZWA+**]^ -%>5&nfC#^_or>&[&))2k\:BCHeQ'iG,65EQNMi3;+D7ig-ZY`>^ZM9j!FY[s]UmV7F<8#aL,QRHJp3aM*[,-mI_Q6,Mj2XA6:abMBh>!UUQZ>m>Ak2l2pcc5qtroL+BV2H35LMU^5,9;!Gq.N/0%L5(hgE+[p3Bn5^2a -%@!=OeNSAU2>dJ#@"JDt3@[FgFnnRYq3fP6=Ii.9O[L_m(&)hcijH`N19lLY_m9&PAgP)Qo -%OpT_8BZ&77NGhM40"!#-<.Nn/Q?,sRSf>f4i`3IaHt39`2%6r% -%cq.;q`.hij'S_UN\CGa?EJouZFELen%6cFtI4%bC0_nP-11bj1SLei2^,+i6_M^c9)KoYs-s[,rG"68o8kqCQW/9P0L:nJght+*t -%@&ZOd&;*\LhumkPr%"+mO@Uo]iDaIl4:iG1]0fLB6K!!][K=(Y+%8HHe*dOk5%:49h70c+Y[56P# -%fJF>8D,]l,o,[FUUL.t:_3U#mXSZAYW*-P'&j!]SINg?F@._o;Dc=*"Lqbhp.YDQ).-k'4A&>DKcZd`c@pUNH6h8'dbOM]u/]e6@ -%$\#NN?e7N'PQ.Gu!tlt^;F[i6p*7kpRoIPW]`.mp(Xj^79X);CV_hG"1IEk<8DkEf:@*%>4fudhe#[+"pG9: -%[2/0Ba[.C]F7@ct`SAfC.okEp`@GT1+M:(f46Znm*AsDGgM5&(qnF1Il.Z=heb7YN<92I4'f9E*[-*9MXt')G'9SW3'Wm([VE%c28ErVEW2Y<4"<)Ar5,T`!.(b]Pf>Y-`i>.et=]C`n-;.U@ -%lR"EcJUX##$&]__d<&^*BQB43Ih(s//H#)Zl)QA41`.%$@OFLpLNS7a13Urb;oQ)#.>4T')KBEZc"2g8Y99(pMS4`Z,%-rbeus't -%5\qq-f!U*P5jBTBZQnP*m.Zidi(K,h3LohcSV$Hpi"',B[@8$%3R"sX8;]Xi*6WBCK5$g[Bh_VEK=iOK?.d2t8^4;kiiY%41E"r1 -%)(6B>[$eJ].,cFt^CpI31_@WN\AWe^;i<$oLmO7TF,u=\*177X[)0GW_\B/0%Nrn,eP,]2EP>$iOpI9d(0NYoYRX+Zb2Khp$j2R% -%-CB4oGRi179h:l#AZ^ob%DNTo8KWb!]Md6B`fV^pN!&+%))DpUIu4.QK)[TdBdghZ"Js^F4=k+^4]j\+]9NoA7f#"Z8D;Rh:(RJ[ -%%[VH`@qUU+;Wj^;@$U!>r*`So2X6/n+K6J.M7a>/`@P:Z@UF*uNd7rC$!iJGS2QNOlfZ$,3AdZ'^5UQ@`]jO5fZ<9]*D*WY"=g[# -%`]UqAK706:PCR4VT,Q1q@3t<8d(0<@+5;[1TPX0KA0ps0raij$i7++-;HDe'K&[1om4#k"))>Rs[TGR9Dr)8W_[3m<*D"$/;G+$*Z8uTl9NRMB -%9*HoI.9);gR&Mg&nms,B]8o30rbf,[2L2Q)-pS$;U_Fo'I@4]B[P)BKka@#i(Hh=PFO=o)buRFaYnSuY3hM/)6[>(M#;m'5+]i[W -%(28J+2iQfPic&i-^6Wa7Qk#TD.OKH`GIbtq*9(&8>(:5H7o6$b0NfhDpe@fZI?,t9WVR;Pt)ET!03eU1khZ\-'Ca+uL_*lKUq9)=dVS+D(JSGO\ -%3J521_UuQ.5B_rg.[jd=E+s6ElI8Hk,&Z-<[n/T$.H:mj&eDbC_?3;BA6>i"8#bD)Z]'KYE!M,2qMpi2G5/A+IFk7FMl6erRnM`` -%$rO7@7^ErRIC*ok=AmdR,X^M%L7)/<7N4'l%eA:(T&%VXl#`8[NZ^)Q7N<#idS?*=iRb]1UM2&I4-$qUZ278%!R"@IKMOHY]+'&R -%$m4nL.U0Hr,8l%_%6mP;;9%FEB'CTlI1>me5)P[SS=lR9\BoX<3Kau^8"-C[E?',DAL-iAr8h3VeZrX8&[s?W3)O57\bs/P)*I'=p!Y&$"-.]pgLR>$u's`ps#C?rV,([DZ^[hfn@*50b:Z^.)`#/Vq\!1&((b_$>a99"6-7!M -%)3Me=kCu'[\ua+c&VQ0eU=M_W?ogkdMcCW>!-mI1EtZsVSb'%b<$g;l$A=2;5Js@!IFcKmsq,N`R[djLu9*M&O)ON -%&kX7kXMmqhnS:RESI;u,A;C'pk(2bpL^F3=Y+M)t&oW=R\YhIfn,L$&"&AAc"bXI#JOC*7TE%Dc2*1usXi/pr/BDsK2+Y>oUVdm< -%I2^s=0uVaD6/a8G*/HM("e1DRCYikKED6cBA?1R3@Ddl -%'%O/%Y[@ss5]u5QF1tfkj(GmcflbsO+G(,(,g&S\mAmW2!+r6rU#\VGW>P,$UfSWJ\g.4+PL9X+_&qN5+o&A1D,,Na*Y&c(i8.4+ -%1E:!KAZlP,;1Gle(f\Ag&_n+Y]BkhTdCHAOK4ATb]Mg.+;hD=1R,:^F^lBo+Y\10o_R"R-*!WMXC6Jdhb$AI0b!4T)D!siF&5-HA -%D%W*>Mam6i>]JUG$Kd=CLsAr]('0+2/nsR'k9Eo\OY]8k.Y@14SB#;)cH$@VHMVSig]%`Inbc1`PiWLLVccR]&;^\K1Q$=Hloe@\ok\ZJ)bTJ%'a:+_S!H@_VN"at)rm?J;^95S.MIGt^ -%X#oj!:'/+T6V3L+<`>2eB_.1qH"0+?t%R6^,Z0 -%MUF(r7d"Fij\_RCTu7="a!)cMS3hOVnF+8c!oU"ee^G-O2V$<[feDA5PfDA?([>Fkc@Nadt\o86SIF8%U/Q-RFG?9HQ- -%dPsTGNL2NW,p`@fA#BB[,\DI#,$19@X4[=RaFM\Kd+6-mq-Qp-Q2400^!1%FDR9*?::$oL#=lYZ;Y\Yhmnls<:gW3iZD_qKP/qff -%?'cqu)`_4]!psOs+<3(pV/QJYM\uX+#bo@9$m]%(Q%/ouil7?Q`kmqhm-I(5P[^WiU\S;nLhVi3KW(E0IeECp;1.#O,(G7pbdto` -%rN!(QS%o7Q38:AU[Od#65o0ru&dTUK=b`G$FI`=pArqNDk+B.dmZVX[^n9#I71mF8F1^U3fcpT%J6SMe!EauOM"Dp&d9Nb"'F)4] -%Ui\?l#<]pq9p#s)n7q$$juF]iSOm@TT+Y4U<5:-L,\9^\%V$)pLIcllpeO#-/4#A(Q4lM(:e4"FR.P$+p_phfIQ"!9'_$%2@9JSA -%%'uq5mQrpe1b&I)7cGlW+R>:e+fH -%lj.h\-6l3D%"&;2SOFn6U,&n8/qZ2K@)J^mfa)N@FG..O!3?1-"-1dMVk8RIPY@:/ak2@_,5u7L2S\7PF;jEPG0]4pfB4Hs\S\0: -%dcPfc`Ffs3m%p8F%"e8lA+KF\LQN=)L&+O(A&U00sd;FjUlE6]>&&0!") -%R/YHnfRf$!!VV+J/l)%h?aKGa+hqPloRS3$AM$eWFbH+*-;=&W2=*N[U=Fe:=R^m:E@f9EL"I&LHn$Ll;bV"bX+fc`da -%2D\s7hs&i;eR,R4kWddu`$Z@F/Ib>Z1#K%bk@Ybi\Xg'-5O6J*bUA(Oe"WYc^nSPnAraG^2)*C38D,N`.lTW<'_1\i;lsq;%05;n -%AG<5:'6Jn91\bI]I.$Lp"TPCRVob3<]*1.o:+CX+"gld>%9k==0Y=&:)TJLcR -%D)%'EnY.M-@ILMbQ=Umea5V$rGiU_sd?K,;;*9"5Z]LJ%q*nFL-pGKsW9NY@rN)LE$)d![J!eIudmFC`\i0VL)`lL0[c+C.3B^&b -%f#;(LeM$:"AL-#`^;N;H^o]NoWb`pPVc`35ZPfOW?C#B8i^utK]j"&K#;3h\<@C/+"fJ@6A4$\_(Pc$LNb:ed -%Go?H;X?eKhHp5tYR_sm6\u+b3[$p/$1PZ`[:l -%;FD>+ebM$2*&d?^7&:*<_Z'bXn8o/7X73HYg/*MJ3'a<[pZn"jQegTiKdfKoV82=U:N$V"fORusVZEXs9UOp&AM_s?=a<@ldjRi\ -%ZjUAZkD=&;W2;IrPc.?gK]2ugmc<0O6CqG6QE[-7+C2-U?rHJqs-2Om#5]k^Q.Z]@0fShkROFH3S,/5^H8SY)@,=+3j1Z?Wi]'0g -%U;A4+h.2A)N#)!jKHEFJ3.c/+HB<4^9Q(Mo[/J)N@2i6p@0ipI'ja,%l#"+J7?&\\$ufi%EAeN[ -%l2:TO&bS"iHeDsq,`6Xr\2&l0RL2YATd\&r@o%r\DHZ'4GCQk>K9K%ukd&KCZ$ohL0Q(DH&Wn'$`afeD$pDF[Xe7Sf&@4pq[C?qt -%5%C^KPAkt_nn-/g:M0.fR7J?,+nUm[_33eKkFs7W^Hf-S)+F$tRsJg1-U-osUl\hk]2R[??\a"E=FI\7rb%j>B&%[Wdb?fcS-ZW6 -%ST_k<@G(Y#8BuHmTJf&b(bg8GuDQ:d#'u/_mnXRi7HG$leQJY-d"?A3[eJaW$FFpG#>@ -%?Jo$nTeqj&&I%2S(rYJ0qD8lt@=q\(R-B@[d:0`Ta>*;'9CFuQQ\.=sXb9h0p_ASpq-*P,6Ypj?WFr4#V:/gh&XlJ^3:pVXA5M@65 -%e\jD8a@$W1,rJ\Pc.&jXq-t!@:!72qfV859:08;IB6HlKSGGdVB+sC#_(f4;nX$8D_rGCF:f/=3MN+-`!JP/P:VfYpQ%K7]O1V`s -%qeQO."Ao4!=#;RXU.Va@$PEcd$E;&k&/RsKJ86IYZQkq*cM@6*J*9B2M39!,@$s;/R]T5LQ*GH&2Z>*aR`PCMY6tJ'BSeGCiPU%% -%X8c:6+d(HL9Ms=]tVT-W`K8l;&RO"E$E;EFV#CdP:'(!>oiT]AC-]8YBEkr$I:G`Z#A=^LA -%<4:'XTgY9H\skf2@rsYT;GGI`4LB[U*O>*Q(R\![*!.^0"^3kYTLB8AKgVbnl#%::mo>K^"h1TB&^;=/]t3X$:q0c6!((S*j7mG3 -%X,I\KWKI?r7X%FQTEs%.K#+mOklDYI!XF/>%oKW1#>1`#+oI@"]1%_&:^Y(=2?4=ci4I[R8PA)UC37jrIl`tuAW,+f.r0p[;8U0Q -%?2@4KJ]Y[+RWUDIB.<$5YhL`0s071'9L?CF;7=%"XDZLf3K!tf-gDW67jer"T>TMcB84-!6^UuID*e1\Q&11snd.%I'l)f?=.A63 -%KJ*?fkhruG&;`N@e:],9AI:/a81K>;.JDiYk"GAt]?usI%$GB%%69#+h.5jaFOBYtX.]-P2?YJAVXj.g];*lB>%\r.],CR^(ECf% -%#B''#`&8(m`bB)AS,'>JBdX9o<&VYXZOPb>AK'H?'%"^#_#i\V19J\lpiIXP*Qp3-7$6P(JL$/_=Pob4B$H?MO$ngk@/I1b+MeJ$aDs!4T%GY_<^!?31;p-,DrK&^tXTlg^o"[4+[#HEdF[D[6B\*@!PaHp30%m4C=1jp=Xm8M$8fg^]]mQ6[Ms0>AD[.7Rr$'C072C1eUkf9j^o_"uiMGPX -%AE.2V7J%5YkJM=YPOm]N@`:uHQ47/borgPF,^5W0$NcG(ou-bg/<6+UI&C,(<=gHa6R_0fT7H9*67_T/_$j/ILa&cCK>Z]fh-\,Z -%`s7o1O$="#[0-.l]T`^Rfr3uhmG3G8^Y?A!"Psiuc)@3X>$^b[_G@;.jnh^JTjoUJm82%$>Wu(0^r(221ZYZoL'^DhE)8=97/rur -%AJDSZ/@L(k!@p@ghGrjGr_AYlfuLl2BdB_mb5>SK]L1;u#pP/q&Bc_%Hn==#99nDl.OJctBnpM/(1rO(%6U\Z:?F',DKMDC&e?.m -%,Dcj5_HKL=gukRbaaKeRVNQRg.,[X(`tqa#E-`b+XRbQSZEm%Tb*`k(HDd4[*gV8Cj9?q,AC?7J`:K`PdMu-8SV%^h+(Hb=mZ0(c -%`.@b(TN4F)JT>#?iFT8MghWD7>t`kg@e/J$b1L1M9,6HF^E:3Lk;Xo*pn$afa%T<3>HIUI!-4ZQ-!1PN-t=EtO*ju6Qc+;q>W'1? -%:-Gr$j/E6M,J0eC1*flD)LlJ5JVE>rj:D?iPpV`:Pl&VF-ZHp9E'u@?L&N(7.Fn^/3 -%Y]@.3TGi/F/IG(+-SQs,/(i<,$%pbXW)ed(OpA"A6"jbRFqb.]@Cqt++mD\%j6Iibh$4,c]DLrZfT?U8^ebQiR)6j[9O6]HNjb'^ -%Fhf/l.SPR2V4"*))#8$;)&!%#IF-;qdm?&HDA%WcU],mBeM9O-*+],C6X5*up6 -%n;fUF4V)AV)N+/@%_5QOQD&>Pb`>!.7-*t.>t![FZAk-FY>tbs/8W!HV1Z+KMlr>d:7Y"]ZD173Fa8i=P.)]<+Vt5u$:9MJ=7[]Y -%9@gdY%>SoVWc!ZL,XLr"niB19#"`K"5I0\#8d/ -%-UH0Br^I^_s0T(LeX\qT9',0Z,R`&Ng+^rmd!7s_:0aTX/b;qTP%8DL9t2[R3ab3IJF.Z8R+1O(>CZqM*4'/'k_,cWhV,5aaU\5a -%<`+N-iJK..hNFTN[nh;TnOsnoH6FO:_2FL=\D-Z5PH9#$bgPg!D]hfJ_TA&]g!o_b+tij3qu@r;nSELGa#CU#3)f1_[Da)eW90h& -%&,UC'7iU6r3)mHl/@!jdbd@g5M0VcWS]O#pRhC$I<%&*XD'M`74\9$O(NSk5-hpT'>;MtjqK+*iE;\_s\Hh-7-K -%Hd\;,kY`;:_?Ku1Yl=t*d7>EWe_mY#)F$hXqC<`s -%!L+Q5(g)f-D:<:N;hjU-*r+j/Mtp)n5DJn/s1E*:kgh.P'KE0XgoZUhgj*_"&?*_MrmHk*9NWGFZ1/!.!-!VF,])0dmNi!Y-[?f) -%IKOk-`3%$1-*c<*CJm:dA5d.g=U(if4GBdkdT3(=+!^!DM#iO\A-2OAHoJD0QoAZT\<=qr81d0^#e:*YeF8]=(Blnl,)%-u=IYcF -%r`aaRi?]sVs6/'I<'ZRB60/),;7Zm%<'$-*Qtipt_0Z7WR\WcI%?l>$U>udX"rf)&R(uf@G=o>Z5n!k88Q()s$1o5"bre4+PM&6U -%L0D?X%I5IfZG;SaK:G2L?HQ[Z^lmS0I=Gb#4h-c#h1YLh'.no3\-F,;!HaJ%&6m%PN]eF9TiqK -%ncu+S.Y\U]@gELa--n'f.=HB_=2lA/oQgtc,L8Y^QMD>V0uP9k^$L[T>6?(M5($,0V`W'RT57&8`*"PnY#;-TYFs>E,pV0!Z!=5q -%G)JJfmBKUdL42E_(V]qaT%F]eA/Z@[ZJ7HN6#[f`a,@FD[\71KK7IfX;PC+FbPX*7Rq[>u&1\)+)'RNCL10oiINoJs2@L0"&.&M* -%e-?NeIrnYG;O1Zu.^4pe$mV0LV(Q_[n^su?3QXmO3nf0_!(n5q[9k+@JbU#kR;-cLiOBGj;Q)7$qf8#Z$Lf(Q2*f<;C\9F)Rq[XO[F=men?0JXUfShQWXsF.9FboY]CQ(4,r$^i1,s?q@."XCIL;?(0oA$(;:;)VO -%mX9"3Xn\W*f(i'AXhs4/Hr6Gb#AmjLjdL`AN_Y,S]9hI1WEd -%:b[9Uo4FVeQ+Eu6UFgS"#Ue#L?TJp<*sIco$(Sd>E#6$*oR*S#DQnPfB*muVl2WYH2)pG7]hlf\Z#).,W"_"?=+t0'@KWF:lSK4> -%P&OO2Zl>VT8jgQO.##2W#`sJmh1p83cd.2J;^iZ=_V5q^GciUd+C3L+1p%/Ae.?R;XBbSYJ+kR,RVrOgp4j/4kSmJC0K/1XfW,Xp -%k;u,r@%1-=YRh`^c,cmo>)FT[P\mEmaP*HC>4-')_?NC`&Jdi>lT*+sR42rUf(F!h3A&Z(+0pPLJouoA(o?BL -%csm$61=4)J@>gcH<-@9bj_&fo`&L$-$L\Xn7&kf%`d%rq -%ISA^"B2VPI0TltXKFM0]$A&gHra.;Ei\#!5;5?2B<>1dJP69["Z!h>WPh22_EAc)VWk6E8]jf(=e>_lXTMNf4Wq&b[icM4Gi*k9mFSqN(Wm5CRjqFF5dc2l='k&#c,_3-FFt\aS&$O`+82ddI[Oe-L.ATb'CWZ/h -%d885-G_f[a<>si;,f-VI$77>)DNZQqaQ]-M>+$*VDa9Gh%re,jkZD^pM_V@ij)4eVlIJI'"f*d&@E*[kiOoLWJ=.AI[>`@-o"(lp -%i8T]uXX0F*l?3M>nq]i.B"^pZO*NJJKq+Fn.5RiRi&=>";K7Nu/Fp5_gH[ZG9)LP:K,PMp"_*n6"B]W3EM'&Lh,dKOf"m)MRLCf2 -%>P9XH:L=#U�qm^(B9L6P4oJZf/cQ^iIj$g9?*Run?2+=dfR -%&^_0,*6o.?beplu3Vi.>\8$#JE-=5b9mJWB8pQ?*Tna8aoE`HqE%ah;(/8:k0OR8h,%,GWp55$A7G%`="uWQ'<_oSrL]Qm7\O=fp -%iD$#h'A+.D01ljC:rS0s7OT?!0Uf<4m&Fs]N5*SWMjPJ"c!-H8pJd5KJ/g"Cfp1uC3>FcT$AOR1='k+7i24;PMgscqgd:WqNHt]7 -%r0[MbL2/P>br[6s@Tf";n`j)3=VB?eW+nj)JNLX\6F:Gc)B\K-Xqp;_0!7abiQMqZ"(e!gDQT_LpiP@40>MPE. -%L"0dpoGW/A#!O,9_=tR%Nu/:aQrJp[I=3<.blS^qm`HdGnO0'"nB@XpnD@Bn7gJ.>l9uN`2t^>T,+L^I#FtF$9@Zlm0[6/ -%#o^AhQLc/qps(STr4ZUKoqqnA:u'l' -%XnLf.?sb$KMH*l5<@U7tJ0cGuEj%,SbO@9#gXZD(!@#VUnVaWSKo-\ET0.6D^`HT8-k)\#nE0rq]0UC/s#cE-"lCpi]eTuj4W7??7* -%?M6kGJ/'5PT/c-cCp_0,j9[9O#m2iH$`+m,NQh:($_e^;%o\K`86_\mfP]K4^2].>s&7gS^mlY->68nIqaFI#jA)^I`Un/$ck2rB -%F;f=FPRAb^ib@-$Pl-b+`a+:X#fL&S5*>nKc$VK1S!rtUjT&oQSYr.JSe!,bQXn?\#W#Z=3o>fP6(/bWZ41K@SA6kQ%\]qpU8 -%bZ!![P;`sRmD#4Mi3FmpJ>fYJ(^Q=A%bF,9`j*a/FU0Y1e;7/[C=*I*K+V2h?A`bd*R+6Zj1rqqkBJ`K9,@V5Z6AKja)P:^$:+5r -%m]sSq=r@aS7n93)TAoZC11=t3U;fjl:K==le9=lV1FkAiR)2da*"`"dl,.MDbHC@o$TKqsRG8nFKmDDG2CC`O`pjPKPu(JA*[r:P -%1Ui1qaC>#VL;SZZ"%8$V<_]"`*15,B2(-#.<)9p;-]&b^74e4mN6WR45hFros`c.+mb@GS6>i=M\aHOf:cQ!q>kPRk$F,2*;DukSM*'86`g*T -%NIATOo)%28X>>leqnS+O]#B:u*d).@o&NF##+-H0^``'"]"M$r0Qe-0RabS!bRUNbk`'1K`(]F&Y,([40RO*26l -%YZUQg9Al@d#cYd:6,1eodH\Al4(XsQr[[ig8SR#oTW9Y+H6/;;)$Vq\lVrIkbtQo/lED6UruafXMoPn"=0J>jiPV\)7+K&nc$e+_ -%8@BS)#uqaG<#DWGA6/bcPio\_VnYN7ZuK1[L(oUA^_A[>%kM9l+j7Wb:u:EY -%3?-YrnNmU?m6Bf!Jq_pAKtnpq>CWYB#a9oA&-l+$,RnQ\!hg%KC0RA],`i`H:[OHg -%_nP$P^iD"ia7D3g%qZ[@\%6T/[KDG_JFd?pQ6BH9c!9g;W-U_0ZkJ.L#/$lJ*_Qgm"RqeG=[EfjPKYG\""Bic=&,0,FegR(\'baV -%%?5O=Ub+Y^C"BELmdrXSG[_Nf)UI/S3nfUNj;VRCV]?0i)()k!MWqog&,EhR9F2+@"AhY^=h9m?EbJW"fU=uq[d"TKSjM'D2)H_r -%fT/R!!#-aK)\`439V&VE6U9_`@,eL"m,>W"m&Ch.'?_gnl1g`n4KL`Bf?WV[snLM6aX!Pr,]2?US2W([ULCiRaBCWS`Zo."1L.t@VP)G2;*%?)i+cZFpF -%2J0LU5)6\)?1?hNO*\l9`.1fT[H=WNfid[+$(,,rR"/!H':)>pN=u5A.+2T,2!_sZ76FDb%ZjAE.9.S=-PjRI1iK^r"ssQ`9Ytsf -%3/'1D9KRrtV/j*`<`k%qm:,%q7XgCJfF95mi7Cb3fOf[;0p_nP6_W8AW+-EP#DfpPXeQJqDR'io)p&FS_W:o)=CSX!/+OP&g[$0e -%En$lXTn<@*<)F/+Y;!c0QK6b`34e=06KB@@(%<:6Do3i`'H..C;&7LLdNO381GJN#5Q^[W-fYBnFh1>>%X"2!YU$=r,7r,OXYT>J -%$t,&#PJ2hD2CiH$9*"ujp^5ULV>N9!Qg%J0Ak>IMVjJj(7W@c#[.Mj5aDQ1E]"-V91b4VW4OJ:uc7X'EOf068#/6Hq/=5*O&N61Z -%fcUZq\#sf]lBmB(7,K%sGa&jDkam#%*@3BG_T0]9hPS&bn?NVLDYB@(Jd[,)(E'.'I5JNm(8U\Z.R6r$^gHZ8Uh\?]F5I=5VB)!pa)RDY -%;sHan_NU]bV`$=j_T6VHJ"VF@/AM;.!Xqs,CSf=gaNLgYJ`2(ej__;;.ZZEDW1!Y93Ou[/R*Kp!gi2SV\P#+.9/??)>?HM@7F9%O -%UETD+EVL^JP#$](>$i\XfDB@BUjidHDC@M>-&kRV;2G1M_3gqB\JK,\(IP<$GRDQ5&!.Y&6_gr!0D9Do_)gP!pMqAT[YZ9PU9 -%G7W.eFB-g\f."-3L81-W#^*/nQ!(Z#Wi9F:\QnG<66YA7$!l]564mms&P4;U4-C)ZE7lL^m'^&Z/cW&%<&mRfmnSW\?+?\<"!:`@ -%Ve@jt"X4o?I2\J*m4nCFBq(f((X<\e+FcI\5Zb6qFM!o<#*?B3jCY3"+dp(biQ@$GFY@T&a93(@D/s*4[BeHJU**0Fdb><^1[WsF -%'m@VlUtKe[_t`DJs'o+.s2q;.4crTe-:KMD/OSpsPMAC8?4'+;jp#V5tJ($Pm5P_T"t -%d=asG0#ZMAo&Djai)?["[KjF5*q$TOrc1!;lbJ>ojOC#c;PM8K)nsO+HP4A272Le/5;9reDHiqYQEhel4aj([eQ\7,InZQgoM$s" -%cN(P0:#oPkj/.%;V8iuS4pD=RMsG?Ai5[,=>qd9F=M?B_2W)qY<#30_bE?P`b4>PKcpo<;O^8 -%;1t1EEg^`%a2+osQLGo`LjnGIOQF&HWOXH2Z,ANu4c5SoQEH=7N9S$&0=0I@E>(?9Md=@HU9SOp!\P#m0Mi%-\'Onu,$>KGVJ7F7 -%WT/ciF@Pj^c\_jT,&%qqLrc]l00SR#o6=&'3SJhSc2jtnT030hqp3uKR)NPdDj)_XJ4Iu2D3K?AKi-NhLVF*C#I8$6d^r,T;D?qG -%/1_Oe_qdsU1#lLKaCH.#\1VGs\&^_8@ISY`:3i:JTA;Z*;*EJWP/U8Hh>d)SN><3L#J&UE@IoDmhlsDf%Q?Z#EAt-ET1%3\SCb0lo3le;tu$>:c/o8&lAR` -%X/&@O%u7L)\Tr4o5R5h?PO+LPJXHO,QsHqd:h7`%/acd0e5C0:pm.FmXo/m@C-Ehr@>&+d$$[s*:El/Cr/T91.oWTn!t"";G,`3DbQF;.7G3I-SFAM0h-Z,gN$P6&V(]7S=hJHPT=&D!8F[RibTV)4m5[PFh\0G!m^U],0s;.fVnit%rS -%oKHe6nr(U%crWC0Wr#oYQ_$bp6JZI\fj+%("*pA(WCfG7Q>]'&Vq@F823TcTgSc8^V?g'GNaY'Y!TN]MB_40H\+u$C@c^K\MCcQ/22DkfJ*Mi^H6>c5WN8W>\*15#ls#(Y -%:l:0]/g-f8$3R'$AA[ -%k#?JK+Ya.M-H"q4!X8@]0uPc1i@cj\,5WQAF:nBR).UJ$NVG62Ui'EuJ&qVF,1>J3s.kRJ)krhNV<.fS5JTa8.=k90K1(8mEj)2O -%]d./[3e..*+\FYkU.nJh80PEE0OXL+PcSbTfTC0??p1CVC$^@oQ6Ks/_nY%PFS7L&A -%jPSp6i,(Zm(]TGoa`aD6Vl\sZG#fB*3iNG1@U(2-o_iPs`T&Vr/nn-);8]^;Q3,PcMA.1DLM[*L\%os^9=J$l!0;YDAp78"SdQmr -%)/=oA2m7C]Sg2.2L,EXh=IP9Uo4k.3*!04nUG-DL6L)am?krKY92ohZC5s^"!Z>H4,5]gd/[o2A@g,UWKLCE4Ijg'W?2uCbgP,W&g;OK^-VI'dmc`5OY:t_A9NegmU$[kCm6//VqUZu -%YTcf0MT7j"oH.!JZ[4G;_bi_EoHC4WZMSM;J5p9IdTM5*fXU%-=<7o37h)$&a2#+]'I!P`GG:suhlZUlro0er_m45spa&&H;<"c/'`,EQ"[qP%]=:bs]FQS2)E+-ZUX+(q=&MV$$&*.R9V+W:n> -%q,5S"!.A((N]^@P6DncOJ*GSS5fC&uFhqO"B!9ZU:#O9&(J?Qm)-'DePeGd^2^;W,uZ37K2ZncL:P22a-^bS -%OBgl!$M]OuD<^g=SQ21]U9O)q;.`J<]1&Q`?3[8?\Zg'&FAPY\<^J`K'i&)=&G" -%4WGiX?Z+\4]*MXPH;r[,CE<1%alXOrloJU`TJ0_A72)2iBF^]hY5&meP-]F2P@K;PYJ\YC:Q;?Db$*B[0TLD`Vgp(E7Lca\su -%mT;?Kn9q25N,uJ?^7H$D"=Gf;?t,P@3MkI#&0c^Mb>O05!&jbgDKJ%WcaX2+-A^Oc'PN_]6bJ1VO%-9>T%_X-pKa:IcqKM%5e@I9 -%Itih>5Wfmo$pPj*9f_W7PRJ?_^mU!dJWR]n91cuqpRA-/BKY:"p_]h2TEIBL,l)?g*ask6\[0.^1N+%H8aCs:Z"o!7$Mfgh'`M(h*JboP];cDbUF:4N`<7PJ0NMd!,Vlm!o0)MG*+Rf$E&?Ql -%M3P8c#sJQ!'=N7[?#*$)\cr1h[,8(5AV8&\q-DJr0!@"CJAh&E8q)UbN,d)Of[B!09UE#@;+Y1Qu!YC+R7+#_Z.'*?rC;^Qb!,dlK&, -%]Xktep^SL:_+3-^mI;up4%rSqRsGY99tp\+**I"1jn1EE7d12+_Gioq7B$g)MpO1N(8"$rCTn-gqBf7&`E5_;2'pteT!u?k.;Z,% -%5=D2-tdQmQ^< -%St@BBe\5hiMFhOpc_*&J>jQ%/T#H+.SQ.-S[rcSp96HZ&p72B(Eq_?J0#Gb;;ELSh&ncR4FR"M<]Wm8t*J#s.:sH3b)N;26#6eIt -%Do*f,Q.W-545]c\92?&js7S,+RRB8u\86(\qa6qli3Ma54*7]:a)0V_SW^$1nLgi`/N7WYW:5&@EVFp:aZ^t/==5a7i7p[9+&X#6 -%7E-n'><\9?f8=pE#pLo:$7'9MEpP-%`13,MMYPg>8IhqR2FaJl'>^@6(-\XSCk7'CpG,Zd'FD`X>m8GLTLdlBa0_'a_4HOI5/3.2 -%H9$8,KMn!9Q3jK\Ejk'"+a*&Y_k)_lZB7`r+%;s(i@S&6mUUS>Vi>:WnM=8B_9cQnA0$/kP"n!,d.Ts;oPlc!G;D@.jJ%qdc?FD: -%X%=Q?;_agd=N*qQG6\h=;>+3e.\`W99_DjBh/KHhA;sOr"iFa?D-/AiP1%csSMq3+UWGXJjPn)\Z&]TK$.,3_i]W3gV#g@@6OW[- -%s%pjnWE:2DJ!*BEKJeihAUpD#nF*J5Pm0W@jW:-``,dJ6iaD1<)XnRU3=)Zf]g1-Ki9iHi-aTi1IP%spBS]%6\Rg4mX::nsG*[7! -%07u9[A>plS=1]C>SB4M],WHsHnU?K+mZ'u'6@OKTNM3A%L7?t0ARKg4eqhdu-mE4BbAM/6s7ti]pG.Zs:g%/Fh^T'O'n$p*9BM5u -%r:p5]YUK-K_P$A-s -%1aA6P!in6B$=1"',4fHB9GU806J4sj$G))QT;W/3`)\KY056'H6>/9Ri]mf;s7q",f4j@>f*!+:F/'@/dj`/X-j!LeDYK^4Ku -%Zbn)tW&'pAg=e6kZ'njRUBm-SLo6"+a)/k<]H$Ze85I@T)"0/B&b.Zi<.'`h3/Sh8I^VID9J@m#dD\)bCZgaA1]JKN%9U[[8c+pa-HQA/K -%;;Q,20q?`(lnER#Pf"WjSg\5o.Y5?I#$?i%UFJ^\P+LrfAEDL'`)JtpI`gs2JoAh#<08@r[muS$kp\fE0Yu^/7&O3@Aq.2"([M$Y -%E=oXjXu;J"B''%ipMRU+,[#q:1g%<64X./;&OO>4P\2i -%R;L]*mBr0tR?E-=MLr/O>kQ1Q=L3'?+ioL;m$@ul(f:a',SlT>dQ9::+r&h#M+Jkfq%N^WISb(S]n:gi@"fnc:j7qs'3>)p,1j1A -%gA1TT'ch@)G+Pt\Hd9]LdeSm?L@nU1>Nmkjo'qNt#9<:aSbaqY#$?.%otU;P@\-[F6p:CKm!T+^(5A6Zg'enP*Ru97fTBE(\0arG -%M6$ht%]F?9*"ofM&Q-AR9q'^HY't2i<,71F-RKDk'MKP=n%1?tpS)F@'h@U1&M=J&*e8>LjGTV`aI^!6g6fJ^<&)J7=+H'eEuuPp -%E4CI+RoAuQ3VrqAXf`WAd.T'B`*bQch^8!2F&@P9'.pX?67p1m\fX*`NGBi*6."j]J^1j'/a-3^kKSmHAb*`N`K44^kFQ.>G^4J= -%QHRW=]8`)[BI&NAgbYT35XSClk,FEEUKdFPTZMssV:X/7L`HRT[=)'ukiU9&gXtLp9J%(:i&>Cc_gKXRolDC$j5PM6+%$9#jOs.X2QFp*gb\qFdo>I5i7Mca:.Q'a\B4QdMBAg=O>XKoY-(?4;,@Z92ri'n[jU9Z">1X5fF:=#mM4G#X&`h/2L^QTe[g(`[#F>,gLRX&=frR]j=-!_aJ;W -%*G]2e8I_/l1k/J"=B.1uQ.81R@Q?kR40FL[J0$lKeX>PY"(r/:maS[k0"jKG.rWMj)T;%^k;T(KDfTKHGi]rBB3=)%1]#?3sHjt/jFVnf>3Xi7W'U+W-_\%#2 -%n;`5R_)4[2+@re:CTI@W:,j[EeT8:O95=(UV)L;adu<8P\o./!qf!AY0S&i?`FR;C&j:@o+T9O8c'UF5aQ@5HWt@&KfG(9M@UjUK -%P:DGag5$LKQm^.T(L=e3I86F0U2;!HgETC[Q(SYBFXXNF9=qK69t0dO=P^M,,f="`Z"E$Y$JeG4+It)>\piqXHfu]5o9jM61;3UJ -%G`1^"%/rP1gYWU2K*7+E%d]V1=hKj"7h>-n6-jV*#I/e6*j)dHYD*WmOHs%64\)3n9hKn&THA%.YD]d.Rq$hIl -%m&sqX6KX5576@0I\3ZV`r?khGbr4-XORKa"'4rYeJm[Lm(j@N*/>%\6\U&A+D]T5%Eh9^FoorV/?g9525dO3$5QGF^POg@_e8FU[ -%4Sp`?c0iD-L0;ia=ef_f5>PYUm;ALnLq(<#i^E&*!IF!tHb>?bD8pn1AMLEOZT'/LaUj#&HI:Ls'hR.LLnc7Jul0YOc:)&LcKJ)lWTY$([Kj9A4N'WCm)M -%`gCaqf(]4Z3`EuIP2cD\ro&*VB>Gh]D4#,OSs=3GTf$4?c_5F&:\+QCZQ>#.F0Eo8NG?uE$`TY,.8P*jO?,I]`0,[]_"G1C`R0t* -%iUD3gmWFBLZE#.Rn7Z@O$_E=H@K;3\,Q$U(N^G64%irRKrK7P2-F4H?)d'6G82=b[9t8DTkm>*?d3lf.kZk@9'gnD\.3L#sZ0PWC -%fJ)B.&A-(#Icf[Wqi@GK,OdY17tXZ*==$#1VlH+UO)=FX)CT- -%Z1A,AbG&4neT`C5G9>/FPNsJg8;?J;/VdP#T[5,KO_gIXfU-XWrXo:mr?00dHr"7KRi4NQgR+uP#3)Su<9=%LU7`nA`,<@4=[[tV -%-n\=,D:TOm.3U_>/8NI4kF$7^ujoc'o;@`';&PL0;dUn,Q*juTkWgDX!(ehBWfh&8C1@raA>[nY305++@-^SJYgeD`.jS`3OiU[oC7KPVOPNq3F1-uokmX>ONTf^'TiYkVhuS5 -%O*H/2(`"*UW!@LNNu!M.RkRsJ7':)brAfJh9G)Mn.$F0)9S9_.EPpNC32tP\E%k8oM9%Z0W1G*sS/=CLhZ*K(G-g/>IKFjZ-]p7Xj_Y%!2`=^.V*NA#+a%pn*:?LG")T0N@p?iKuTs+-gAePH5$^\j_i -%s8K5$r]g?7J,I?:r0r32H[Yl8s5s@ZgV7sUs7#Ver7aI8h;A4n:\rCIktc\c6/Hs)MiTsuPP.TI1&_%%rsq?nlc26iY=IW&rOMn) -%Dh%cDraYg#5I(0js#pCGfXEAJnHn\-83pZlF#ng:6Lj+ai"bcVc2(8`$fl(@M*EAD.jFn$? -%iR'G;i6STVAkZ(d#&4eR5#EQ:3>L*Mq6@,3kR-DP<'H`e3B>8_Ml&CO)@45m`CPfs_)rqrHg9u]d?k3U8Jij=cPRf%KNg*-h@cFe-45W^sp6+ -%jSlRJOT98Q<,='6NlU11IY4i7Z5.Z3/e]Gl5T2N1mVP3#,7:ahun[OuYH`X8/6'jG-euZ3g!S$,U`hH$Kri_&K,@Zh[Y#E0 -%'Q2VFV%%ZMXG5ST:#BAu/Z&MW^*!GL`^MjO3:p+!D[c1VWpH^Q]s*uqacs$TTFoA%3Ptn"%ftf,p?pmbNX:mFq2T,F#GE5)gCA3T -%0MM'6rm" -%5Ybt'@35JDK)'YLkT^Jj5d1g[5M][LjuqoXlj!O-1P$+efCt>Tnb/!b#+Xg7\c)ru/Bn/[.llp^9'q`c-H4QCi1_V^XL#m/ReWdjTN%JoqBNktut;&mp47E"`\m@t^ejBP*&7P';IRbl`&QYu_o`+NaF!F]Hhik_j7AXC=ee*6j0ZDtq014VBQ -%R`dledQX27n#,c%T:R+kEgeJND=ElMqSuPPJ't!r<6ZJi%/:MMnTr8.kRRK&EH>NA,2FJnmT2!\S0(<[`^je4UojJB?la@_bk'?*iKk/M*Q!(Yj!ns-6]b4Ieh@EN6Q%q4 -%k[ZXDeJH!F#YNS6UlfCOV;R*h'16.D4XcRSfYfQ[Ea3.JO`+>u/%GD',]>lgX^W!bd+Qame7r7]=U2REpdKq^k]<$<1K\)tCJ"s0 -%cr]EtXZF0o/0pk[4m4H[Ae#h!>OboFdkRE6,g-W4m\0( -%+/-_+BTg-ee:[b4CBXT1G)8OR![,8o`#j`^G9?fpA`3-d^]'`NH4C-:g4LD&838@&$Agk7@n -%+]TWq,@FS`E6h=.4^6@^]uk[XQ[S&oo'*7M5fmC#J=J5=+OTIC0m_Cr@HB0gNV%]lS760"=ssdW'D@<8oc=dR(nbN=9VF.leT2`p -%,WL[#jK_X?7HH#.B43Vc^P/MJ9lM=R(j*A^`"^f*_+gVII_03\Vs/MMYcK6BTnHC7oCjL177\#:43?fHu$pF63H -%K/?sj2V=LeqpER'-=[d].q6sA(&e(\b7dmH%DKO&'ore]>UMOV$D@u -%Fch=F\(AF4c(OEGd?\7`m@ne?r+7duRmOp\rpaP=.4gRa(NhNtm*DjR0oi8I24Jon/D!nk%HkIO6gF0([##0\8I_W%EV0TF05\^8 -%pt99ai3]!OYg5KIOSM1h_In/m'[d]S"C#+cQ\>QTdh6Ps?-6_7)k4>?UpjqeW:nCZuRRaWkAA4Ye4[DZi\$EX0*Z+p*UA)N+t)uT%3lJ(@92^$B,N6)5j#I^.`dZi&^I,s\5Eb.XubGeEH.N^YQW,O]F,drehK0k/O/Z*(s*@c<0?2qh_P -%^43"([6K/PXmq)2H%'uc\3E:G(JgBC>C!g*S'Sd'@ZPiH:-0=M'>Jo/ImI19\IOV-pH9RNC?UU/LJ#nt5JC"sk,YHca"!B7amX%\jmi:@s2Oi.$CLq\?bNnKq4_Cb?ncHkP<*5%p,fs^&;kHcB8 -%BS1:mhuJfo,V*7"\AYX46d.4cN83>q7OMZkH?VfiYBi+RpJsq]K""dk.<[3G<19Z)?C,(JN?X+6f -%_77Oho#;M(%!0)Z3p@qrK!$>U5o^+9qi3?:BcZ?^02',514)e95Ne<:#5eiS^@T\Ndn`2eK#ZM#L^X-(CU'\/I9>WY!DDM]f25;+ -%c2!&,SDWGVRU`a<"@u0n,:`1Q%C@]*XZR#!m7r-\[>, -%$OtK,A9`ou8+![@UJ[(Hg"aV-IaqKCZ?kRTOsJ"GRm(BU>d9hdnAD-PJR>h0W.R=X-*s[IA6T:q)\=a^s@:`$`pmb -%.mEq^&"5N-BERQ3MS5dZ!TZt7BT5C$O(+TlimF>L+c*E:%4J8h+3P0engq]">S8gLM'QR9EPc,VG(P)LJh#OsR3.Qd7g?gqK42]U -%R&obU*8kF+-pi(ZQL4W[&q3^h_c;8JA&s0%(o"FR'VC!Uu'"VV!HhIW(t.]C.tCFM]%Ob -%FnQqZ3HpHt^3"?(fFjYZ.(W@YX!+-9SHm*XFCAmi<(7T)"*P0maX`?a>BE-s8]FdZGYehNXu]!;QQh>3*\:OjIL_2[bFd:GQC&;R -%W$99-H..:t!V6esGB!gL$OWQ8%"LHPI1DUc3jIr\RgDb\3Lcrk,Ph]@7_^lIHC]uFlOdm7=J[g0&Lm^+5 -%;sFA,Fr0g+ef`0dXA+rD:0d&i`*,EiX7W&:T[Ia]9r\Tf@aT<;61[`\H'8DK)MEroa4B7KKkn63SYYu>XW46`Afe#>.cuJc*q%Gj^e.+biG)EcGC8_AB60a7T6J81Z6ie`5 -%cu$>S/.ira(aSe^$TGkJk]kMdAC_&ZbknD^S4U*G3ksZ&OD<\uLjQp]5_]?AK;EpLl0Z"[Eki3pF[=Fs?^WBfVta@OiQ(9-L/%T( -%^Nt#iIrm.L\3X&EmEHBj-5?-0="oAF_U(Ou-/il0j,KI"g/-RC4S&Q8TksRAK+b\Cg8Icq,"6LB2 -%nkY&Q,jLE:q'.03Jse%VgJiT0eV]!W`=!d5Nu6Y3@aIPrW:!b'`aQ\@EJ6S!FWUcQrNm$:_6/H6('N')n%`+_e-(]SUf.Yj_T%>E -%U)=n,ODRTX/QIB(3$#cVnq=!5o#bgPK\'$:M*p'bb6U?2a_We`-U%uqhfKbT+1M"s5Hk?[&"&$]KDcI3G%7+e;sfV'f%ZLrZY -%Q+0JUpiM'/cUMQMlWI]uLfMA@&:$I$AI5UgC0OU.JmLmO.CqD_#qtJNUbR^%cF6l":b^?FaD)@!(*>:.P87\l@iC;jQ"u#[/?1t9 -%jK,CM!;VbJ"hG$JAeE(Vi2TT]KfT:n."VEknl"XaZ'6meFafE@+lH8n1h8s>F?&UN=>HJWJ^@E.23*8Cg&eYkKJRVT,p]^^B\Pt. -%38o*L/_JVf"lu)pU#W]7V)r5>2,:mbNYFgWp]Nj<;-nPkHKO;W$.0*WF1Ps,K3k9S1o\Xt -%2g$/XHj[lg*n#YM^oe3O6q@C`^AX8@[pG@HMe@`W;@d7]5RD7"dFW<$82EXu"G%3:Uci=i":OFRm#0X&CD%hS>Br%><,V+RU-sK[ -%cZA/N,&%8VZFLGdD+1+*iiNe]Se`p9.;kX/ZH5.WeJUgF"h7H)Z$hMDQjjKNr@E'(b"iSP,0nYOf-V*2CtTI5D^3Fs'Y(2%6+>EV -%r$96u5s0sYQkrf1Cu&::=>5S_81dDoM2;&Vlp`$lP&$`V4$]snCk -%b-GGWJHaOGZ!.8M1Uj__`l$gKC1I.PY`'8Ao%>'p1PIWQRJ!YQa2A;`g>Q^Z2F@KoXcm6MPFBus0,*@RiG1F1Uf"L:0A(m?cnuB\ -%J^^+b8$83R:#2I:/?(]rK*JE$2Q$V7guRZMb>.'`".$$*JaY-Xpm.,'oJT9N/g[^KaGmMPo`BRd"<=jVj7.pfhJU<=N>F2=SV$a/ -%3&o7[f@PE@U-Dfkp$_nO5Q:&RJ,HpNs6tOm.Thi"9&/n5eFq]ZWF*$ciadRh]G+'*>NX%@5tn4$NA9TDtrs)C`*OiR#?qg*#Dh#rYK,^#!O^Dgm/uDJ8o#HlA4rA)i\6WueD6BqS$C3q!GqU*^q& -%Hl$`8_MrrH/\_)WmG2Xj0_Ck$#g)'hll-HhVn00l6LW[2M)=Pc^af\)Gd#A!rVZA,f)m;@S]<^oL@*l3U/1POL_H=HZeMA'Q3Mnf -%[k5>kq47E=*e8Qu8Ni^O8K%XQBDMsl+DkC+LU@>`_Q4*dS8XG\tJo#856S;3gDn$L&X5JM9SlPY/Uk.:Hs*^c=SBcB"C9,cf6gWF(JYP3rf -%-ou_.O8jC2KG[$X1?s#=C\'JL^U_rdHFiD`?+9cU[FB?T"BGs'`-ZA"HD'GJIDj^pK7G@9C&W$P$\B<7YV9O,DnXW^Dgm.VYMYma -%e>4MDk[R_HLYH[IHT/A7k52j#q!RIp6XbPf^Y -%hF+27ZMkV#1h,'cGc[8+5nr7H(4Y`CgH0hZA)V(Y0$(fkVqk24FV?_U$qn@af&M%Ime"+\"n*Z,`1?%VB+Re&^lEP"%cf%qC\(Ul -%^V/Al-5?@cP.H;-1S&n/gAktn;;P0bh\P,Jr6G7)[%qNO$0bPZ/'r-E?LIs!"0_H*>C?2:488Wni_A:QbZNgY^M'AHj7,H,"obAF -%^A%GoHc>H'oW[qBs89A+nAi:jS8nH;k!6sbd:Fu.fcAR05klQ'o+!gbGPu]#M]6GsGl>29f(f7-GOB_sLjZT+`MXk2B0ZF^T:"tk -%m.V,8RDI-*\nIHur"dGQT\#U]_j3XEmSiCeg[Un#r'\3=9LSX,6!TpOR*m$g?Y4b&+a.FJGlceO8CJ(`eEA;CP]D[/&H3HmfsSK3PFeTr\XiBmK3"D&2JFL>[aY&^KM`3*P2spZ -%EG`RR/gQ#E<\8/G5+O(q+UC[t_MlUYcK$_oM\Hk3%/$gb9\UZ%SJGehq*"S%KSAo%N"^irYU(JeU^fU_\NJeL6q2;AtrJ"mdr)g7\B5Upgt96*0h@17-fJM%!I60eGlC76l#%-U.sB(^tJ5o,qpN/2%/9F8>?KF8W*Jqs\/*_;`h -%D]Y]7\3&aY9/ibXD^).\J?Q!f]UER"FCPp?*7^d,$,OSdK_n8gPhM,";LlJk0uH#A\If6]9ak1KFfm0\MKC_S'>^?=E)5_Jnj(-G3/i"]"ZY6)0:dB4D -%`,46_JSAWiEQ3)PnB.oB`Gs$>ph[JRIA%"R#$R4#EjmU'lnMXGBngdZu'XJm/:45aL:0Q`\Q= -%1@_]LH:ch%C>#a9?_3+8,bp*9r"A:#?4<$NI -%>qGk-RF7\gXSZ*;$>*A@r#(jQ]^JLCgl<\(pN8T^]3=J_7o[=gD6Dr_hjD_?H1q/qV49$[><+mMjdFUbbYs2]t;;r=):HoKAIZKq'WViX[9G/0FX< -%Y!X>g"6-D]7Lq9b=`Q4T<(Y1qcKQjLd)QVTUs3+8RDQA5GHF,%]P%q!i-NO1Q=Yb#\mHUSiR-Ld[@aOJHa@\qYPSd>VTf7Z(uBT[Sl%52njEIr0gV^D\e"k7^A'-A[Vr -%%TURS,gK>N*)B9E!?trJC2t17-G6u[Cclq'kpe"FEAZ[7])7R^au.:s\)q-J/;?Q;!km@(*Y%Q!OdH.rVuTf!F?pHXfpDR;hH'cW -%/V"M(.g`CEgBYT!/pYo`%3AJI`ePW*SsnX]3Pu0BlL,G:Ap*.3fME45or02t3PGS@FgDD4!q -%ZiubPCi(IR(-PQbK,i7rmeaf4gRfgMFf:9dX-%`.$NCV:K7b! -%I2_tc'R$e'mS4NJa%@Y_883'bKu2?3eabPT7/r6Q;FPPZbhHX]JO'dMkYON>pO)?cI18pC$NCYQRM^t+npLP?-L_<)a^>3>[_.uL -%Rr6Z[[IMJ")%W,+/m9r40RNnodj.r/F5lhkK,j4r'nJGX.$@fIS&o/YnEG]tK)/WO=(*=);L(#/BZ&mp -%O+#BMhto0i-$IBXlfc3@LN+HSJl?13#-p@ooEi\ha!7BcPbqh_Qj$=*H/'/m=?BB6QpSL4=S'_5YT=>M)kPVq;oV@#1m+*AV!$PE -%TeLWL?qm?a@Zg#A;FZW]TSeH9P[-Vm@6l5uoop6:88.-lrF2CTN8L+jlQF#'rp/Q@:3omQEniY6s(k.;Ko.EE2:lSu;A@E+:k\O8Y$% -%+hu_W@mjdmJs,O,a"+-'R@rXdc`q7EGSPGT,ujok]:s^#9J0$8P75E%$I:i^P1L@<$8;i -%Ml[P-iYac\&+9V8!d=9X$O%Yn3NOTG)aIXJ=TrqdZ+fh[]?$-/p>!2QbOauQ+h0j\/N2@Pl;Q"1+H+<9oIR:Y,S!!YCM`-3^S\&% -%;=Zp6l-QHZot"'+ZTDrgiBtRm -%d_t7_oO5VeAc@X:W<_B!KY6i^9JnklRb2#cBSqd7T,T.dm._R`.a;iRjec"98[Qe)5*=E,nZ`4K9rNqPb-Y[E;DUIB82SHEA9V`:,$L&F,cBrKtS2=:oY-Qe)sFh+;Pu&t+`K-o;GP=aQTTJl"Q.fR.QSA\IhYh)UoVF5GH::0E.U-ErbO1C$/&'+@ndBEK,d(G -%rYs18*R&X"LBAiJVTpcIf>"kY'nMa.d[FPi(<[6R?=%j]!\-VuMsGh:I$Mc:N7ef"2!*YXmfWZ\+ikPfB@s?uesrVA^G^bHiF?G5 -%%0\>]`YL'c-&]^KmBWf@e#lZfE?F#&>6/4V^6J#qK4LiN-VG=5_\_NFJL>7^86FqTI%P8$IZ0Ll1If -%r@6*$_K&S4Nne):g"_RP"MANKKdqrnZKoEaa#XRfVnh3M=gb-2C2h9V7CF((4M%gk>;9c?d`Ic'UpgDZVNA6P$ilX_o,4L1/h`!e -%B#J -%a7MR7!U.3J!HE'C"LXZ=>HQ`M7iX.gO5Y!RG3"pD47\ab(8S-k6';k2Io+G?sp1FuCVe1OiE@r1t6Gr<:*jC6i$ih2Ge#611Q$bd#.Z6LJ8bsPIqRr%&QHkN_Je&%6?&bX$-SNki7h1?j:.WG@8+7H>@ftM -%8N3/2:\K`m2A^XT?$X$6?8CjEE]O")%Zq1K^2>Ve:(g`Pm0Z`)*+r>\3$$1OC^Yc$'Ll>7p'$0mL-3`;f/QPrR1:j>/3mcC_QgJq -%KNo/u%VB1bD-Ag?UOKeL`3JlU6U6]OX?/A:?:J(9n&LepC/X^e('!jpI97[&K+odeOi\3/O$&U-Iainqkl>;BPqIbf3f\Hk -%QB42$%!G#i_&ZC-i%hVL!@]6]B.1#:&Qp/D9pQKd1>69(^I21,L0ogg\8c(6FbZ%G5S7:V+/@n@^rmQc9bL:*Th%_Tq"3#=0Ok*1 -%9D_D<,C&k&.b?XmSm4=+bnr75dd&q:1FCOO4XdY74F5r0(g8@T,8+\0?cV+hOCl!UH/D@%)et+LH>Wc:1Y+*u6`oICc*Aa#gOYh_ -%em;2g$Sk3"rnu%gZS+<=B29EB5b-4O<^2BroHlj0!BJV2hRrS=V,S,aSnA`K8jF&\#mEt6J&cqghFZG_Gree+C\DO%!Rid6AHehJ -%2UIeYeB]7O*_i1Uc8:sKf7(d[n -%8,,ih('4Y@8dj$MP%2^?X;1hjd]ZJ!i#qi-F9hNKoj=K;M>@M82/CWZ2u9&4R<+U$B"Bg;dc2mdiPTO60b_)$2kr%Or+_<<*3=sQ`rb`@ucj!fASl#r,S+R;]5S-YGq=!aDN -%$"aT/T@[Jm7j7'qlTb?c5Q9Krr8g`E&$Sf&iT"qO`PDOZ.A5biFoV*[WiLQZUMD!SNcW:S?[g(4(B!/R9t)e4X);'J5tqfek5OWF -%oABO3U-IT6JYAi2rdtenjDuD%rKAdqqZsUSqdJ"npU6(k2E+&u*^>8YI:XN?`f`%bI)-5G-1qsb\cN%5jQGep$:FKpN:p#*6S&h:&"[^ -%.3?fT4`;H3j/#j7_h9R3Upb;"rTsE`S*@ulGTDTMB>(139g>5Ege>JrR1@-deQ\N0/'n:R9V:?k -%Iu``:Y^bG%5J*!FA,F7sq`HcU9q-RNXPQW89XESLHG;3+qeMDTt -%k&@_NRn/"nZu'loGAaiL>\uc6IlFptlgBCjr6487_V*7?DpKEl]5GsC:>>_1[LM6q*nB(qh9YOEm_A)V,(t(8NTFT]:HNTj5*%lf -%G+P0a,^ZLUZcTlUFJl>2N9i9TRpIuQHO0WO$(26+Y@c8h`Y-dQXDZ]i6p3l-FqJ\4p3^nYqWr;NP`t\19L<`0$62AV5EToBKH<.] -%_2&:UA`NBc>5B`dn=gAgL7l7qk)fPA/X$l=^$5pA]0dM$7qkX55`c'EXD!aVs&ZuF8>[P-+;N9:]@ou"32@Djp[Wmh/b[`XMg*\O/LaBoT6'r+d"[Mpg?1TjKlV#tp -%We^D@a&\9WF.)A>`4AbSbM;6Q1r3G>eFGE9W[LF[D/G*qZ<;Po@tK&9*+7-cZt7kGGV-JjH;P[a]R:R9=q7NiVZ2j(Dhe:mW]f)L -%7i2^h]BNtr6iSTiIV@r-'LZgW8k8pkPN2UQ#d9qO=>]`t@7ARD['u&OJ_6f<9Q*:*Mq^d%SlMYHk5ed'cHBTTA(nF^Dj,F)9almf -%YQLgdJu%YA9Hdt%:nM8(A68*oE!?prf8XhK>sfa62FUG&:;Z4Vr#F`3FI4VG9hat&YT$[(#Z2E3A-`*M4)"UgZQ8PJMVeH%'0lT1 -%WO8iQ6QhYa+o"5rG'putAVM=[[H*?p:iQpgBda4X3WpXHKh`W))0;boW(E@,li<_[3)d%H6q8DG"1*NP_;9P?+4ADmq+82Xi7:>t*uR%adq!i.>[;[3^ap!pkgF*g)U<-^],^(L-r`:@'m))/9C`q;dN$QEP0rs:pAj^`-;ca_PB"@fOs4hC7d"eR3L`TqH^q[i"0--KosbIKUhAIJnA:+:CJsjT;%khY3l%@O\hd%)%SZi7__1"A -%,t[]Ver##.">isu!UmiN>uUtAh1cGDk?3kfT#`h.WQk0pK?I_U,bsG%>Mm7TYlR(8ZuMc_l:$gE66(o+kdq!r5M:D\N8#=)=u@AK(u;iJR(]hW5>M!G5o -%,nN-Xbe0iK/&4='.6goDEj3N0oK]5H9i(:n#%1XS-s!\Mt@h>g6Xd[TWpL0"6D+g^:"&$ -%-@pb;@/"hFP=Q^YK]9Kd(^qLYE;HN!lRi;$GK^DQGT'#\L)@nW,q'JdJH?TNV$Z`bLCHlL_CcBN!(<^k%TRa9GT+kgmLV`=f%6+D -%8D86o_:&IT!hakq*\pW]aR(2HEXl5cb?#WIlT>%B.`6r\EuG"LaE"$qsL7;*ic#J3k^[W -%JMeLf]ZC"eQg\�GiX=aB#RMdi5,Fc:S9["(s$_]j+XaL!:E8=n.Ni]I'tc6,!"@*MUuQ< -%$3Ukk(e!f;@gibcF&101OC_t98FD;nB2s;q#PPXda5-2X!gBM]I.M6ANC>iT!+<].%./kr@]"K0g5B%=S -%W^5mSV4o?+5p`AYdr=/eNuuC-YuRG5&GX(fAlL&gMp_6$Ha/5(DJ]MAke!s'0mB'2,1Q93%ZdGMQRf;^hlmT("@]ErQpQ';EQIY+M^buD7i19YDEC-Fcn>iVpDfDoh%d4Si?Ue*PflJ*?'iiZkBDb0e90A]pr)dRk!"%dNHO+<*q\%\f'>JVq]7,pdoP;N\=)`/A%$T&]Zdh!A%)8og"u)\,KoIr]iDaklbM6hBb-gj"!,]g%/ofG=CCW(Z6RA3l!/G?ASlPVAf#G- -%_@:M"Ba5!fL2e5%,[/,pj*.E\"j!U3[c[&8C_XDb?[(k2qjHp1m1JZt/`.QrQ8DT.i;<34B:d^1MB!1WGMfQES>PE&FkM1h>F)ON -%Z`hg-cf]cKG+J4f3,[U,i]U%D+alT(oCgW"ADH>P!c#>3ccP-#HKr9/e(ai@37j^FA'O:3T)tGKrk!!FabR5G[H4DG^Cs_(7a3]kZEYSo!tbni^_GN<8VD+t$+*)p4^<92?:'1*V?>*_B3K`+C8KX!6hf9f#/>O-kEXo>kkE9=gLCi\o$< -%NtYB!2,pdb@,5,M"N;fo[g3d^3nL(nQ*_PD-IBEDJjU2UQ;c?KX,G"a8%])^""J)C&.qT)86[8d$*9f]OR?EIiIpk<)-A](c8TUU -%Hm4Hff2M.\@h$Qk6t6DFWZ4G0cnifgStr0\235ZuW0f;[)u*YX"/QC)<(8;9.ob -%r6WuJ9U'Cn59h(:Y%Z",igM;F"_IgT(r2Y#&HmE-W94]'Eckmu!@V&49tDb8JYRX8']SAd;5a+.Ks?mNV`nt&O;76k#]5bho*fqh -%gjL?0aFI5qb)RtB\AN*'C`WD-`k5DRR-@uopZo.>MHIUA8P;pi$7XLK8n\Fp(i8IMZac(Q%qCPkML9NSDBhk.\tV#Q*":1;;mjuL -%"(b`XrQE&r[O#Bb(eqnL`mQ,Gr!MJ7JPomH3T`ELUd/ZkeZE#.3,s8-CX:nZ9m"umV/D7Ke8(0iR"D.A/q@LF7D=f>=JNDoAVG5& -%>7YOPbti$ZWAJ8HF.2Fk1&Ld,;]NMra%2(b"\2JE%B>#9-t2Z/T((Qek?^tZ70T&G'#+JUU@C&'+':ji)D4Zh@6n(;8h,'$0R?s0 -%k\2k:*R$3t6-BiM[N'e^p -%,K5HeJ7l;gi(H\.YqQbieN?1=3%,:VQW2Fqco=G#n=FVj>WafE#q.PfSumt\H"eU#pAsbO!%YS><&L*MnR\6dj<8slZ5LS+\hG3JF>I\T"D&_V,\@]Y(8.t1Zn.Q"+9jU)?9BunX+kC5I#+e8F'LV>DjiHi`ok+ -%9P&rq`8fa[6fSfr)7IU6Wp?+IL/:=LcfD)^PbQOmH:LkMX(7ET86!c?hpC#HGG9g;%i^?"D^G+eqeE*W)U#HFg`>`mA:@Es`8f*O -%p_G$.U6K`,e1/$?&TNsNU]U[li*3Qsa.UYlT^Y11qa<-np5"`FPV+oMFdo -%H.3K_)"7g"\F%B48_/2@Tu`,@)r*(Zr+O!K,2#L7,oaiXPkDg'T/<3d1AQ8gbBq\^dgSs8gcSJlZ%oQF+0Np$BItR7>_?JTKRF3# -%GmI392[t+%24k7?:NbgKG^^XCPk@E@Ad->qD#&1ocp2dj&!o0$AhV$cQC.96gVe]GXEC4/<0loChB5"7l6b;BWeI'q2QQp]0.9>q -%[p1R>r5I,Ecj)6+l45,XVJ9]NN"\X2g"tJ4T)%J!r&W":+#1G&eaer2Z:##05!i&g9'>[QnN^1mJs.'"fqr+*W;UOeDK=@W1-WA_ -%OK1;UM]k>O!fEK.8qIs=ShpXW0D&EAW<&'sY2@BP,N1b]6VOuQAMAVS)9eI`eMV>$n2u_KYom*mn8#rFO?8AhF&RFlX`Urc?8Gf[ -%FVJRDTQGG%.4%$]JR/^H'mC3A-TnFrlk6.o_,'*(f:O;NR27bYYS'jjb).;XZh]"$0"N' -%"(N2b%b-$,&Bq5749N'ob&]<)[%E%f!;>J;.NY0J"ObeLWU.1**(To4<>fn*L57u8]$Sk3-;kYlD$`Rtmg#pk/r""+^/km_3@f&VNi3Yl$uffPUrR,=7@-.6?Y+Nj#hb2nX:(a7<*_0Y#L*La%&4"*hoNfgt[QAEE^"sjONEXoY+F"XC!UI&D`=X'qT+n5B[QZ/\"m;rBo+S"?uD:d)X2%\G)D)D(^u=Dppe? -%MGg-IT52ui5h!WW#W#l;%N4l@;sZ*>^&R?-pPGsQ=Zt*3#l>&`."p7eG$h!8F]Ra]a%s\"@;_HWhs#ObOm%0(b+KL`.qtd4!246' -%DL?YjS79A]88t0'-KQU?VPppJ*G&e`diY:AS0G%]fr)VC/7PQ0ep#=,e9*suB%IdXTO&?,72::]pTsSt:2iY>X4N"ZmJJSjN/+kC -%oIF%rOT,Ig(h_8FlbRW&H+L8Mib&6O@d3Vs%#.?A@9D363KS?o"BrGc3113o+7$1=Q:Z$%blk[3]#n.Dt3 -%6mO?(`l0^-E4WeT)+WSOhDnk12QYAdrm0uUO,VK*HB+p6,cmI"rjY4'eB(2hrpYBm4W\*oAY%dKt`RoMrCN;.CPn7i\_UBbpfq!cm?;+o1U(!XDPHmIK)%q.QFa0UJ"@*n-BL/VV -%ccA@qa#ifORBd`m,K)A<[mM$,GFFn)F10CEXS3K]/!Jc%?5#ZgTo;m*F0Rfh!7gs.[:!'fkQFM)]d%sFS$D3"Y -%@b=j30@]R&Il?DYtYNa;H%mH -%kI)qaPfRa__3%uQ3!G[hJQ`SE`HI+#PpC@ZmS$\:jPKN*da6`H:gjgOU4qqN8Q$OH&Sl_=)$A!HD]AY&As#1+/(UYrgU8nK_Su!` -%%LiYX,l("o'&ehFdMA/l%"esT8EmC\2+oM4;L;%K_0Tr['G!QUYDP=,Bn3A&r1UV"ST0X6&edIm9F/BgP1Xr:X7jZ:'-U1i=:%fE -%JIlQ]8T8hrLLjE?>LN)`=M#(Igt,-]ek*WZ9!YNTA9Vi(SV_pj=EanJW!K,-1Aq?'`]ZH:=C$iK<%*74E=/=Dr;D3Gh1[j.06+#[M==BrI8 -%!4Xm5o\'!)r](T-,i[6;Z\m!;gssuZrM']56NP'l5Socka!5lW+..%u5uS??npmB,_0H[r9p&a]k.,euVoD=2+d@SV7\n\C$n)=P -%J=*-33U)nm.1WgVT1kV@8HY#;/!aU1aCrCU>?Z#cl@KOt:;@>435S?o5%(?]7jc7-MpE(/$^7jTp%U#S+>(ki9O\5A;)XAo>`c:J -%/Ns"=_.U<@0>eX%5KkR:I)E0H4DX8g(fS&(X/=?8fNC>Jg3/Zn>Bm*o[`_[iUT8ftq)sZSF!3nngKk:F[S>*_/.Tb'(Y/H@L58"S -%@GD,"7iOX%SVk`JN3Mf7cQoAhN6`P7Ana"rfH*NHMe@tCcoa+f1=eJW&u(W -%5?#O*!^#LZ@Z\/CDHYO%UVNF)6^G=.E!X-fAThSA..&=(AXnr5B:["%KO>0q=L^fH`aXLR1KfTm]5a9DZ;^%a%22L\.n;`Ba!,9^L7O* -%!Bc*mSRDdSK0dDZe$PpY_T37%Am:0*e>?JMTt6L^`^chMEEkgYT\/pn!T`%CcS/&VJjD"m:d6^eaZ_m37lVT6T)l54`.f.;aqX90 -%'<<&'UGG*O'ug)"*^[jR9"iG`eo%1SK)#A8-q$ -%oscAI\[B:qGSg`m-r*9A`j!s=-q$),$@dtN4>tN[ -%ficS*Y75Y(90ZY`=Dg"pUNsa_@Np7AO8#M\*J`G:j:MEe_$CR8I3CG48;P@.an/%=8S>\j!?(j4GZSKN.r&VWWcs`^K5lNc[bPIQk*'.;XgDOL?#+RpE, -%i`#*t>"It62Pt:7gc-%#-(\Z=?qY`r@4S/M5q6G:Z&bRMRC3"p^5,b8]jiBP[-)mPE$eEA,rR2!aEXB7+s)Wj>8[Z\3LlfKdMW%u -%GTCThYHR\qV5.5D']C!!``t;pnrVi.*\-9mOh"_=1$%/NFkr\#e'.#,=n#PRd3R_1XW0?[U%f^NI-eS/8:u[ZW^pM%=5HnF$6oma -%9-a[=#dXgXR"ZkrE-VXFEEhW7s7g:bh!8tT_#AhloVMMV9M/6N>7i,`FFLNe`jW(Y!dHe;"4>['nn4$f.1%Brom$iOk^F2J^g'rk[@eU= -%?k0C@\7uQ^T&jSJ?%m^jV4o4W$X@(g;j2jA3VU85P.eI"2-q1\rTU=*6LT!ELoD/GS&@-PVer'Al7'/LJct7;c:-[NHTus9)dAl_ -%*JT7Qd0,OW5d^oIW>tmQD'Z`#TXXfe0q"*[$D^RdBZOc*co(DQ"4o<^>UYhh.#N)Y+G5Ll^fhAO9K/b.FH?!0fkJ"JKb8f -%HhS>Q2"'1ljWDbl*GRq.$bMl>4"N0or0[V-pYuh#hH*[7S2S8aUp'alY,T0TL.(,'cdYnCVO16MWu5bLF?YV>,$KM%JfPl"fGf)= -%eO?/kp#lo^B]f/X1.Rsd\r)+`mMpg+bu>B@Ye$'"WSVq/Q"T2MZG8B2CmetA?CBl?:(!5as/\(7!pm*r&Gm@<>9t_E0;_\Q`SQ"t -%Ad(D#`(e(L%YI/m1JhA70JZeh$Qk!UF3N)bn>:(Pa>Le'cCG8mn(!lt2#1FQTSUl/I6p+Nk'VfIo3t2li":XT7Vs99s$`MgdPf#V[+=l]R -%P@V\.?Kj(0[h4-5*Gq)p'mNK^oN\$.pVU>+EceuZQ!SK@i_aSIMT3r]j"QM]l4hkNEZ?f?.!T-A0O8*=fL<7N@&$`OFp][d)'PLn -%Q,=;nNa,=?n2u60V>sG43BKD@kE["\JIn9i"L0.=1o]I^3<$OU!mS9FV,1>l2'?86%'inl-[DrKW_O%4X..mqQ1ad@+2oj-Y.M=#_^>ON;"9-3Eo5Z[m4Y7QZf6.bg -%ZEt67Pj/m)""kJ:mAE!7"_gEY3Ng>I;na"\TtL`r1/I_BoFXfd_`I3S;rF*\o-!f]2h;LQo94eh_lkR_F&l+Q#-M'?Ie9!Bb3tYr=3Uo,(2T9a8WGe39 -%c4HpbU:n`>7Q+6J$Fm?iEto8K%@+%j(a"V2D`Ci-\[AqZk7&j\6H<.'7N#/BA1:bSU -%ikW!5Mlmjt&Rg)]EF)p3K]X\c%@T*'OH$mk$nb4@?pM]IG(>i2jtl9rBh7oM:'Xb/bH\hqQ0`#b(!$Z-o;4QdnV&ljgI -%m$M5DWQZJ9@HS<+B=JO?U.%M@1?@\=[\X;I>IAV#kd(A)#ip$%Z\_+&>0fTA<.6^TX;"b8^s`E\!F-,p`p\P-N8rRl(Vaj515&C8 -%NN0r^C0Zl7*%H>K1`e''1!`]j;A;]F(I:7rLT.kJ)E%:DKg77,UR8.-4Kf-`kX;])4$T2A^>/5nib$u_%\'@`bg%B`hc%gRoi8f1%n@7_kL[93b?)SC3lqE#s^P9"foJQ5BuI9=W217d&dYVj=Hfog`Z-qNs/[no"`?SOQ$_)6q,"A.d]S$NV!AUo9VRDb7+E`"_!HF-u"8L]dOs4/E8MVPnP?^Zk?7!E4Yjdo.`PskE(<@Yk:nlrTmO(2.b=#tIBf(3*FFNY\cn1.<@FH@H5Z%q9)mj4( -%fTLl1+oG6h"9WjQLoU5$]ol+&3r*'+I.VHsRL\3NZ%_]\L4&M>F;hhTi:6D&4$-r,\I3)%E%n-EVd]'eAoX;FViF_,ernfKK:MFU -%]k&sDVfb"ljG)>OTiB:C7?Yapmt(0(Fc?>?#GMS#Eud*7_kL9]2_(%+U@2%pRrrDao;4C>MCJKD[/:Y"C[;a8F#!HJ8OrNK.8uB'Ku7h/Qj5/iZ`EZ3')Ft`QId:/c[?)1_0k:+`bkuiDSc\ijX)0#9t=so -%Br]0@B%KP#j9/n2`Jc,i[$/[Q0)#hM%K,u1]h3f?j.VNJV][eW`\=ffR-KbjMtt@qrVA,gXdic6#TSVnpsD%XMpp9+1jXZ_Y?-KN -%b0W6T#J=u[4Y4.+7RWBL1$Ni);TBn&?M,n;H.k*A5I^.V=,a;h,IUn06@]74HBo*rW)4O=lP=CQ_Ze(-'`,W+a_0/i.@qdVd[0H`I68@Q^Kt*n*RZU%Q -%2,BA0E!Urm`"u6)(_:("/"N)^7n*agX!WK=PCu#Oodo"RW8PeS/)V;e'\B,Z`5m*F6QYc%,@k-\fmSOi2Kk(.W%NqT1R.umd!_&G\utVo`S!qL!>BAMK%.4:K'%&&A"W -%$G-.PkX/41;_VH+;a2=H.8T)gjPI3'l!dCsEQI^94cl&]#_*Ds;H7RuMZCiU)bBfnL'1m8H,-P6T"-B8jl,!I!hu#I3FhkiG=Udf -%`d<;aTrD9.mPqJ6=bk&B]CL_tXIH;l5tO0Gd\]@]?[fRWFf5"4W58o>M=;N_VFoYIWSq9Y."s)L]:4DMhe(dX=cjTFTXOp*[[\oH -%:EAF<,Lgk?C5#8TO7uaGXXE4XDnIDrPg$Y38J-nr%iCo&jT`%ICWMslP2nPjXJ98*Q%j%_!@pcb_#-bOYZN*0!t:\r_i8f-ZA.T/ -%@/OuolmJmS#P,ZM^i3>/WrP>$*2o/kL-0L;+1PEH=VEt&LA<$cJAI'k^D&OpaHFadUM\VtLF\H\NrjKoams?m#5\kE5%HgoE_m7g -%RhZ[G,`/.J,=F5%6u[ks[3W[g+B\^M-lAqi8#,ndDSCNtbYJaKXDr'F>D"jpKit\YkW9RF%Qd!2pf"qu'o'ah(!2E]#L:mN%CeBM -%A7-u1XL`WpPBSBZfD:Nr@*CcOMPCuM"@Mquql'H,PT\/.*Vg0*eP:*l"]%3.;kg;b -%h?Hea)EHOBMrH]HiL^]0nGaFN1_lV8kBA!.H@^:_X1H]Ak-k)_mkZ%>llZ#p\"Z8(/rON07>J5QCV.'<:d2'Ma1dI[E+,e2Vd0n-qlnd$a2 -%Zd7ICE^.?nC9[d8,(;4Nmap(d1TV1GeI[MOZJf+4lt';-eD7nbg+Y?>h?Bm*,2QLPC'.i]!>9I=N@M#4MTb-8[SJ0U:s_3U$iZk, -%a3ZY@5SBj*`7;DhO_VOgt -%%)"d@7n:nTR&n"XG-7eOrGe_>[T,J'C2,4E"A#-J!`07T4R#qtfpT$pRoa*4EZ""8E@M>!:>Rm%+;r)=T8O -%ML.B'%iFn`MoLjg]/eY'%B=4-Jh8qIAlY_]H?qrE5Mha#Q\Ts,m:bK]nm)3lqk-?(31%ZSfZ;f"%KsH_GD\[E=hPX/k<]1UK_aT_H".`$PW:j"t._M*2q6 -%&,cA=HLALFr6h4G4qX?3A\#%N;9o(0"s7%mbaM_sE.7Cn^_T5KouVaQYFOUrg8.mcW5mX)o,_,4T#OkU<`/1&D:15+aMJPLqBJ1oskZIHpEb?'"c(b"jCG-*HIP,,E6l$;-g8`;l9X(:5d7P_OKL\ki,I+5#/\"L2tE -%:VV%Dl8Fam4\\4.a(*e_=d#"1m'kd,H"#OpWf*.pP2nE_,N)NGPsrZ_e`X)2Lr\eR8E/0hB-$VYi,\9?2KtJ];oK,l00jkr&^+?0JnQRS33S8M=ZG& -%)1qKZ_RJ')aaBP-RU2',oFcU8[9q2@ODBTgU` -%s8&5R!SY<_>_MuJ'r1<0KEr`VHp$&T)ps:$S>1A#*@^6j/8_)U-JZ_McgdPR;eJHLWHei_pIQLn.3MsoVQFiA7i>q)dMD[je3J)n -%$>nk<7kl^pQ/..A.8LcS+8om#`N4s#!$mE:O%jDa;Cbs3BDQ.6OI`.D(c"FdVRP6Y,!MgM*t+pVG$a_olIm^IZo`g7$38AU;"j!: -%U,r6s(*s)&(-UAu&3t+*nu@K2W=b6%al'/c-F(S2I+,n/Qk0(t^\HcqWp"P^HZ^Q\YTf/7WJPZu:Pk&,0LC#O.j$4RFpO3ac$:9] -%?2e;V@aV4qTXoH7/7BXCb#PD+ZCHO'0;0%A$1b%B2XNYucgIk(g/n(_Mkoo$cBLmAD>"j2e)g8qhd,Z- -%l`r$,D5W.e=%ZSiN`?+UP(6?D]B6Z;0XC4?0<_TS(bBR<4`@btdEN@5M6r4u.5.%7;UM!=;qSo=9ZO#-aD%<]RO<*WU%GFf+/m&s\EV\KcbG,M\&3<(&*n;b;=bspY -%p43;=jl#ZNRL;s>UuHI<[6eK%WS%.5=-%D?.L:sRQgiYSOFMo3gm3L\_$Q&5QJOjCiEUL0-USX9d@H=.Otg:+)X1R@F]Q$]W#6OK^O -%/UZ19@t*S\_V'YPmp,hFRBs3l5d%tDVjEOA!N^LulMCCi4<5`ics'0PP#VaE?ch)dSpp>/;m.tdS/n-t`\jD`$$i+V<7QY37Pspo -%8,:W:>p;iDB#Q-^r?fRQP>rcEEIl%0f^P7AEL.h0SFoih,j5h"]KbT"K9Dr<*eK>"-qRKp&5Eq].VVat39-b*,:(/=\g\D50mo4. -%P7$6@589#e/"b9bH/O4KUN<\.`2=!Q37? -%+!0=a-<\Fpj`_cfSSoYEe_hCB,0COc[fG:k[M]JRdaBchqkL],NBe0/UE\\/4QbT7n0T#='NHVNb)Ra4&ZV8+bFmRB*#K3mdeN1( -%,:rGdXq&_1`N*G"Yr -%daB\<_9@I!FD9sV'oOSb[n6R&>]5'WTo_U1#eDRNPI)!YU019=c4m.IPI/0RUUr?&5u8cG-0//:%3BH -%Eg=ER^u).kWNt>2.XDdUKoTEh1-s#B]V::5CGeBJq*!_;X&sBRgp-3<'bE1$KX2Jg`bK-R.SIAb5Y:i)V@]-nYBimVIhEQm0nkH] -%,7LqLOt`OPU/hsg2I^*o+dOE:N/phaQfWUhM(DqAR)@iZNq2F75'g6Yl:=BLVUoi'[umi0mTa0G`fmPsY0Oa$/@_&L5.J%=d?c,6 -%(J&^;SJ(CMp\PU%_/uPe$!?cf-s5c9]#glf6Dgd8b>Wd'mLKRDiX.Fl8d>=s,8O0>^"LFG8V]T_rU^M#HT(u%aD -%?"ekWL]>b*mlAom=K*%4jXs_:/=V]g=S7fFP(Ig10&URO0tJN)0;cBbF0-t^`>#br#@54f?nae!N2E.crm$i:\&P3\q&9u -%:R?>_L!I3McS#h+*agd.(!KZAZ=49l'&@Y1,%m:Y_8*S>"0XXUpk6Q-R7VsN,*Ljb1<;1KCaBZOd/.e.M^GK[a%*fRS`"Ba'btQB -%N1n:+q2;]GWK;m;jL+)H0+IUI;UE5>L>6!1bS3rg,bImr$u.k&J0hKXTEtj@6MI7T!BD)"9-gOH7E4B(/ZN6]6N-Mo>gGgrPk;\Z -%9hnsD]c;kAL]>;VB/P*mq6c\gk=LRH&)2URgcg$"R6"nNYOeSPImg77s-lQC+d($Wb'Hl"rC@C$>*3S4E`PmK@hCs8#+b^)5\sHs -%YoBQ;QjE'`S*@&PUj";&VEZ^)O$b#7d>a"IC_n2d''86hkLT4mcX(@SY6t$$<0ahr8-n7"lAJ^3l8Bu+eD'; -%W%D+r`8J'8SN_0*[a7*[oXAHJXq`Gij\tSH>SrX7ZdZi1LJI-OEH^8^#ppshcgVmAG,!,d80mdi8U?>V@96T#gLt&u^I%-4fZj*$ -%*L#%Ni&C#M(T\(?N#X38Z2QILqnM>V>@kDt?rEO2/=bK,mhrc1D[lWiW^pj?]_1bN2Q<\Pod7oS6LMO'c-P\nhbSuIqIl"%j]9hJ -%XahDZ:\'"?l@A=-i<*Ssf[LU4:oK'k6HX34E-l^B&H&rH8Q^Zj=_]f'HkFE5lRI`aO*d))\5WX79n?B.b]?5ej^q%BN.[o)!hhDD -%o\[$>?q5aIh^";cqNit?pj1`ua2W.KS-]U'1[c&Q,+N$:U7+JohlipFXt/*?LL(*U7aY#d:$_'l#@&F!'2:-tE8U/N#\6M8?BIoJ -%.(FNkW!chrX_R@80S#'03ud!Da8u^I?DC*/E\9=q2_[X""eAR*BeXOW^TQ!$a1Y&O2!.FUV:@#%&)g#(QhWQ816aZVTV]JgL>(4\ -%S)+SubJU_1^'>kr,At\35kTHKnN>L9o'PoP>5P=,:&T/SM=i\0]LPOp5A`:>X`=SNV;=lihYI(m(h3!kUbRVNm\gf8ELOpD(CR@' -%i"4RVE`9!JM+pp?Bn$17&6@=]RM,^0VJ)62\2Ss\+[As+C9t'^h!Xn,BHMB,JBVU?E$g\4S!t7fa\%VDem#GuA'%@aL3tTs)8?%0 -%JqLa=K3a3""i*Q0oO42\GtH0iCN9i7+B^tFW^,.h$rWbmj4=]@G^#tc`f;Od@7!cXSGa).$]`Q,JlAI/)CqtG;!(4FI-:j1Bdpe: -%+3Ah-T0CTZq*]J!\p.6O8`5G5Ge<8TO06$#\O2PNM?%KoF"H5FreGMQgLQ[GBZY1-'9ucHKF8M&0l4gj:UK*5Lsk:e$<0)dn\O=7 -%\IeRT(H:A5gb]no0i]e7_/8#XV*7b=S'^ -%fNGsH_3;-hWVdtg^7C^#!gY[Zj=SJS`-E28F4SsW:*4)k`+39cLC&Zi'fm -%35Tg?j@/fg+Y[6o_T7m[Z%8gd12f6Y?A!6'>Q)[iV@&\*/KZ>JnA1l2kTB!J*i>GbN@_"bKVhkOqB[]:->[;t=m-Dkh)%/3jL5gY -%2fQ0Mr+h]Dm!I#G%KDgkA9%iJEm@c&*g<=DX0?)QJd]5u[qOMOLfN8KjkN'G*gc9r9rA\ZVm2_gELH$FS%jL(uH#AU\4K2)=d-Bo+j'_aIPK8k0g6$-W"N -%OMlGMX4Uuh.piPRqiHBG*bCV81+uWOI7pmH[J>3(U8H79`XLEo^$RbM*UO[\gW4D)`6XSAO6G9*1Vr#$7#kjord&qKV=-R'Qf3L_ -%=/i.\e8jh@Neo$j=YE`h&r>l5V-g@k!-eUe:1dg3no)@U&[0Fo*]P?MYe4_IpsT)DQtCTa0T*@BkG^,W,G*mJ`gL_?Oqc:/\0J*M6;Z,*);)/FJVNtbrPFY.sEo=DMk-LTF^UtZc1M-"ci[)U?A=S9ZY@"1@J=*q$ -%(/Okm@_/ZkV+gk+:Gu#j`5Zs""Q=RZr.@9/o>.J -%+M%cH3bBj`$aX].nQ<.3KmZb)f-7[^FkuBa*kGL^AXAM"aXDh.\be7.jRHEFOo7-5+4[etWA.(m3Z0?ap_O$tg3a`O;)K"-7N8>M -%J@7s1d7SY7dGhL3YKVE]Vr"Xp2Mopbmm7\7$aY7_7gY<8EVif_JOI^ru+iZ8p4?>elATP[MO`!)M2!AC- -%BCiKP^[[M'q'dksZ""W?mP'F9P'mlHob,rjZ"%\CkUlesD07#ie)5KY^ABBh-SR@)LMCs(QX2K"X8iB`'"IkYe&[Bii[gFp:]hE& -%oB*]B^UO\87a\_P\^*hBer:X`=&TY>T\oaQQ&IM8,7(KpE'YG@X7V)Df$pt%M(G"B#g%k8_U!*E=0kcIaHkE5DfM530p""T;dVmS -%%(nr*?!:W36hbT-i2$\`=oNu4O"*'0p^Vk@Ac_46V_qjk7Jmn5VJiNl*3T:-ng0MpF+TG\>m(d=,A%?":\FDq>K1e@IQQr/E/..Xk']89mZ[Qdhte2I17O2L`W3Z=P-H\$,JB]E -%it&.:126FP1(L0mbGo/6Wd+s#WD(\Ln38Zu"fDB]/jG<1;UIf$,%H'YEnu6FI<,F_;UC:[f.e(ke8a?UVUV -%?Pi:BEYD:r9m';=qA"E?:H=a'ER/4&i#A]I/L?BcYn]pfF`Xc:NUuD>Ac<(mA01H,Y;KY#E];0/qt!U -%X10gfO)saHkl1J"esX9qD(3/a%f+^oI#HgZc;5[7,)O=f1l.%"kd:gBj/s/)iNIOp$K2"RN&/Cr[slkNs/*]hl]:8$qpfk@b`(I@ -%D#%0Sr=%\1/mJH:o]oFE+*6-c5-2dp=Jcrr8m7S&3(qHff\nP2Nuqr`I[]H9>o)Z9&Au)K&Bp<=]s9:odVm_`P7@dIBXHs.Go.Mo -%Mn\\k,+Sid1UQgFHcFe68u9E0,F?SY0gc*R::>G0Skb2"(c[V5"1^fL1d'>osM/%o2,/J=k&=ck#IbFq-9e:1d0T. -%:Xs7EB5(G,Rq]U$IP%M]AbV_rK%@V6rE?;a[=4-rja@SjqRN4fB"gH/Ud(I5icSeSWT',Ee]LrSNK[DDa]+O,.s&J+*E6lXiI\gF -%TrkJGa\r'1aD*h][qE!ll2m4dIE>Zp>Ub3G?E83a"`LMD>LD!8;ld=@N$Cme?ab#MmhTlmp:EcDQb]^gps_JPlPf>O.+IXQB3_K; -%U39kM.@/).Yei>/oc[IU3r\b`_.T%@8Lef0N+blrUtGhYO..c/N3Z+]]SZ4?f&Bc?2a_*\dKAa3!rS#!cS=it-ml:MBSp&HpI -%TZo\@pn.>\BCb\9cF?W)bX60_5E_214fO0"XqPR)MM9:7@ES`&-tM/.g(c@'j$&I#$6kf%R+:$r'$=Q2;4gY)S]SlsChQ#QAb.g, -%lhq.?Z3knB"6/&+QD#Qp[BK=@R\E.ZR8jO0%7C.??`f6.R8q5V\mFSJ>ZV)A=!D&FD#0DQJ(9a.?$oa)++"W+[Qr4W[f1C7Yfs4k -%R@h'1p3Z_D-5^H6gI:hdm0oAh%i/[^O`dI)A#Q^;fERu>VK\=C6Il`qH0&2aB2&i[gHA+q?e(`L:k%(K=\L%k0=Wqk-CaHHd*TZg>n$JlSkPJ#L;>5q?@gdG8I,FXb_q:%@rSt8,2J\D^Dd*i2.I8/H1"K=a4g5=4eC6Rdn;nd"2I9] -%P63W`\3A&!Z.t%Qmab];U!@F*D=]kQek4b)btf^-^$jn0b^k=Ib_1:RaABKH04)TKDDG@n>msIbq4]"IK3u%ebY'm\A -%haP;sds%chqU9Yfr8GhC&Ztp-=j5fL('0QsnkipqH2/jXLL*10WH6seTWQ%W/u.f+,%'f4j0+JY1FSbqkOBt2o<-60pY,V%*54)& -%.&FS8qtJeIY(41ULDI1\DlD8JT@:^LX%6LeI+%8FcSViaRj';Q7QBkSHl#W00`-4CF'J$k -%V^f+B:Png0='O2][e/-nSUNa&B2NNrdWf)Gp=j@JiN(=D:E>I^7K5H=e3-?-]O0LEH(E.o$fN//$?D*O[VQiW7II[/`q1sTc? -%-W(L>dC^7j\nBhXN;rjs]>*Ns=92_qU*V*ohQrF=]CiOND._Dm9eU#Kh3qRUbK!IiCHd[ToSlksh3NoD_/40Caj.nIft-:)1QdBVf/sjS3#mG).T7orRBG1&@FShq-d8Vfg!3?]gt[0g=oI`7Wnlq;-B8GHFm=d2gU5pE+Mr -%leCcoZT_hl@!PA4g7!ERqc0cYS"=ErQP$l$#(3D)`@tc:,-4MQSB5e&"4ee/Y(YPa'qLAnD@"`N4Hl^@#*'h>]\#-&QZI_DZc5fS -%$`IAI/gr2=N81dX`DE\9cenQ[ISXqVYHN-!)F=+/_u$]"lMKBng63OpmG0PN[.eLpL.CrC[&9/shP+SXd>!*oihe=(G2f#JAG(TS -%>21c$+8GRPF\:St):-D$jaI!E1d;<37sR-Q>Sc36cdh@Lr\CprlYoKEmJ=80phDQnpk]hVcRk^?*dMh^eoqaCtbAI(_)V@J%s?+Xofq -%O\G<^qd_!4&q3rO:EOr]ZTV_36*6ds3>#Za)17+B6k7+I>H4cX(k[u$P?s(aKklEVR8T -%bHWE]m20(6#FOP!^b./)4!sl)EB)ViX+r4W!JQYNI[J,%%]Um].`!\6/TZBr,gFh-E@9STjBh#^/>i'`CQBgCTH*( -%*"uR,S3uW?oB1Oc?:>F*DC9ah"K:tZql7/`RoSIs82,rT)uFDJXoo:e.aSY;.m$s676(tlCFeF_CoG?b -%NY0GSPZ>BMSqe'O->Jj:.tV\k -%rF7De#a+CWT1.[^N!elO,g1RQWb@c&!s^'dA52s[:jI=2c/MdW/E8Z_J_V>jN<_/;]M\/Mp/dZC<=n0kojsa0j2"?IQ*.)u3#HY( -%C-7lYOtF![-k,Uo-UV/(bX9^5QQ%?rXpt/7cJ7.T:g$'p+T^Ad*H3a5fH"o>7-PJUW>WrQXD*1D2bqpN81_$!cn#$W9A`r3d6>>\_A/[2c3$ -%,lM6YZ0@>l'ifSU\po>>@7b"am&i[r3b7?;i8k0W(h?TOL[HqZX[+AY8,u&aW\G[p/t%!?5H-24)U&+@];8`Nknk(sW[?JV9m&Hr -%cF9d+CGH0oIa3(tX2/lf#K*W^7[OUimFM+q7tX*qf;mmm#>Y,>]m(?pK^U)""eq4!raAt;3GfUpCdF!t_-Xml.c -%Z2;93br%_e/nXY`4[tZk^n=ojMI[*`P_@.r8WGGqG+n^/eCJpB[llIU(=JIX(ZfJ@\W^AoRJ(-%;W"(;rncBhIW..SU,k/<8B'4V -%^9^'$]j4\t"#'ki#Be=0ibhTtG1T[CSpKE-*Cb.-8:oFeM5b\l[f\hX[,jN28i]UA4h]62(Q)c.![=9X4._VD["QZ:,:tss7m%Hh@33I'&<$,ZN -%Y-``sQi"HLj6,GdF^Pr\KRLOFj7r8%@V#*O*?!=n8q)q+>3-JXK<&l/.HbD`fm&)*d'9]?^u$*'b.Lc5EKQ@U7/Q1:&"(0[:5o1uI]"?>$u9bGPSRaD3c;d.Mi+:A`O]5'8n(lSZ(K -%>G7"R@HY,96%9@@dhmK,0dj+k"F@a8&rm)HM4MUJg(N=INR`;LeQqb= -%hHmTh/sO./+(niUQJ#QY/B'M1j1ISNmE>EVYIZuFkK(YFl>1c<'h(Ma8/"BTr&^@"r;>':lG7*.CbCjUDTB0@?f($QI7IaGaE(IC -%=7iP]&LJY3a^Z.pZI1NXVcgWW>J/33CS\)K\Y%m&67%t-SE=^gYdqXCihtCVDfnD]F?pp`Uo0$^%:l0'QO.9FpMJ3[FR$@Hn\dlB -%(p6DLgknP(.7p/_`o-N]j7`DnD^?#+;%pb;DSp1]GgX[r0(LL2aiJ\V]2ndY+"PY"Ip'`]Mtb=g,*e!b=abSU8$rgkmaU16H%DM% -%+.19_@Ip5OT%H#iD4^[P*Th_oBqW&dNFAFMpfm^mrT_;/NDJg[$Q1aL5ULrI^7AS9L=HifAfO-"-EQ'mgo=aB5<'b&Z4s5;>N4aM -%hSjs`\Xm_9,rpB2Ohl8QYTaJCd*F&[Oo7Xf6JXShZDd339EACZ.IF]P,3A[Nl\>i(VPd`s^SOaY+?ke"$sdq;IU55*ZEF_*C(5[c -%OldHEd>_9V6Z8)$.R!12LHk2$c_hq8&&[2G2fK(>]cpr=InJl]T7+4m`(*'s5\M)b=MF/ -%(9>4$NAoZ1D"Apo1Wp`NEShrs>=F=(Xs"YSG+M]+`S8#uiW-P=04Z34]0)\_B^JF7(c"e=FeSME-(NBEaR!,LIQ?(^:Y4s,)-;^` -%&-/X$"%4$@RP.&3(maXRFO7B0>pjn+Y_dA\>D9$B7Cp%VL*UrOHB4k^-!j=XI;H0P7\9SeI?i?.hluQZ@Z,]2_Q* -%W76Y2]mK#?>lV0O9ng6dX^"f`_l)Sk+ZQai&H'p6M[cS%[:BI`r;00?:o(3UD-29pGW)'qY[3um+m`+-f+\_.o6I)o/]2'KI;jdM -%ZWgTthP?hhFR>3T1ZlSWoYc&?G%+0p4naYFS!h34fkTAHLj*p*4Sm?bkghum[BpHc"SU0Ob'/%5E;(JlGb\c'ZCasiYhdZ:#/Ut8JT=)/9f`S&Krgi!5$p9P=0 -%iuo@BP=&3ne_,8&T>hn\Fde3nab*=c0siJS8)$^o%o&?A4o/'VhE80<"ZQ"A'!fig",IbNVXJ9;M8lg.WYL;@*i9L@_Vfc7W&-=6uC -%S$eK"N*0"KY@e&+'$N4<\tgfGr>DYZ^j05j@_fU>b!o+K8gj'9H0?/3j?tP\F,"pNjP,e_g;W4=U0bqp3GU7rXX5]0-m5V4Zl8*IR^,,)S9e+m;195LUmqMPg86@DW_;=QDl=/O3NTO15d!Zs.# -%fil]MM[9;dTUT(\/fB*Fisu((&'(5i:pa+k%(K1.VDSTsZ>:`)*OL?k2'iuA1;OS))\X&9?/Ru*YMR+Wu=QPE6lrnT)=u%p0H1\b=ZN%%h!O!0jOW<)c2hiHr:tWbhh@KO@M6fLOcr%Pm-MV -%h?ma=\kLIXFXq7NglF!!&hiYC103;^(fh]=0D"IEh<5m\]nWCLlRJ`)Rpm6g]b^^TJRTXCrh=pkOu*oL[j#X([YC1;paO-fW@^q9^=7EY'U?oRVM>O-C%l?SH,*gr:Oi;`kk_./Hk(SLD]Qq:CUWs2/\[-sL7kZ@<%a:*`[HW_X4N-LQW -%EW%A9Df?)Zr$!op;$m=aQ`N]h%,.d+p'OQrG_70Z(;^Vqqtl!hk1UTt#-FVU*+FK@/!U.OLRLia3$DYKmsF:-=jrTXn\199%kfdW -%E.KL2UhD*s$]&(0)AX)/aEX2a,A^2THEdNfAJ2W2<3g9X=ZeeiUH+GgRE]a4_#LG582c+g,[SBnX\`j7hNTY*L>2j[6IsR5B!#A/'JnX)%rP6W/0V -%P<--P2Q'u_WeOUgfXI[TZ\@SQf$K@pE?fMII#;_u*6ot6IiS6B)JqRS^R,V[_>OoA%ZIoRBK(i'1CF#;*EW`@!m2J4UgLk'HSp`ZFl!F6bRWC++u6W/^/+f"E:9ST>)phM@DMdmYa>?ZGK\ObSV9a(nU7`nJmTYpg^6],(26rcV&Ek-cXpZt_c+sf1G$nolJ%_V6Idc4BXeM,F=fJg -%^qL5OUs@GGjYsZ:[A;j0&'0*W2P<]!-^.PF3:<'N[tiU(+SNoFUkraBi['8h!e3-JId.LBm459:Wb)iR]7dpOH&jE62_5(WX38@i> -%+KS/bHq?$9;,e8B9*.(Pr4T22m+WtsfLNA#PEeVQ&tp(55C'AOX:i0t94M,i4\3_Rl>U0aj%]eaL7=!`!*RI&lGUG4eT[@E"^0Sl -%3u`NA;f'BLamr8!ErcA+=o+5W34"cp;JfC_RP2`MTg#eCAgJb1Jmo9<77=>*Xof7kD^.N'"@UA4Zt -%5&GpL>)''"c,V]Sg=J9lF_7T^5CfAuBm@s/cS0%hRqa -%FC'"X_Lo"$R[)Q?&?35YHA)bR*kR9pYSMS?-/3mR\Y3KJ.&5VM\b[([2g-0ubM]k^:RYA9NV1=GK[gE,50_$$B)XR/]VneiAh1-"WL(6%.m,/> -%+7q=63i(sZ^t^&J8&SAWN_Ts%@c))&Lo)OP2Nq/qKs42$G -%PeeA/F)ie3ZWM+/Hd,r+P<%@*/ebN_2qKPH3Ep[#i-AEtG61p$^YSU#1SuhC;d?sjgWS)opZ:&MZ'9C*8T=%&TZR%%29n717n('m -%^XrsXV?DacM5?D\n&:pW^T]/_l`l89A_SYl.E&n%bImG)fR')S?@mFq-f2rsD-0msS9j"7b'#-6.)?:h!u^3'-+--"KF+Ft=j2oR -%"Bp>X=FHGs72!PE3>b+)[OC"lDS0g_c_AkJq1S,nWY+c%A91[gX42&g\(,.X]nNk&*>k:hLHme,ZjNW]2dicE"\@YJaM=)>Sf_ -%diKN=_8*.8;,,d%S;b55+VMOlVO"6%B#Oc05om.',+Ho3TF!Urhn?FKoA185#4,qcc<3<*fS&Z_C;g9Qp^I.4!F[4jnZWdF^9$n:YXH#c;R^*:HI_Jon/77F%U%A" -%F=7fubQ>`)mY+fboFLh/#E+Ij4q*_%8_pHa(N9/q*&44)^lP]]AQf1l.W,)/hgug6J`6fMn%EP1Tr^=s1CY@bI86TWuL17WihIGhBFRV=8hg:@nj#9:\ -%f0FL[k`uXU@:3I3CpJULYdj\`5VgR1Qh`YW69'tHOOa1]Cl^5:(#n?3=D9h_<('rAARn1bf`K*dL(Ej#,fqh54Hf2k%oKq>5Jqf& -%b>9!CUrt+k_r*9%/0j*A6BR@A"(2MG)Dbn$XX^RLDZF<9=G!UX -%V?*c-?*OY99<=f'+afr^p]Q])&)%'S7V:8G=<-+s8K2]PV[7&1PC!A"`K9U?0W]EiQ=Q*+]L6&,4QNBp1rc+Vl9f@")'igO@U%t& -%QNU]^9JJN[nAUYUMip14?K<%K:lT[/KQc+n"RC)%N-N/7j_klC9fj4dPe];lg#$AdhC!Kd_^MT@XFB<[Yaq6UZb#G;X=-r>Y0t -%`aV6%at[+"&^S<36t#q%Z5EN`I*]7J#BH?m!q5,.)[c,MN66(+cXosDfsqjBjX\:ulX5R4Pl]>Qjb[do[gjB$3m+]E\j/M?DF-7h -%7FKY'c._BJbfM2qohPj/9@hg`SYT-o5er[*[M'YkGC,A>`R)SJCiR#Jo34_V,E4#+].^"E?Y&i8RY5,SGt,kUOD!?s[cdL$cgqWS -%pXSk>UV?+385g'r/;J>efuZ5E2+Q`LI+DuTNk%TqfYWAf2nS+/^i.pW9>A6C=Vt>uH@=K]]_CY`HE;-oX!o8A$lp%;Y)b)pr6 -%_ok";%f6!85/5sd]j86f`/ZghB`s:b/IRa,oVt'Gqeb@rT6>5%pRV"Q!ShdVkIWVHc?B^l`Notj1S\>e+uRG!E&IF4I8rkK_sG<3 -%c%=Z^%T[']Kq4^G"S$h&AZuET-2F'7:J;]YERpD07fYI@1ck9lrdD6`!j/hSO-=O"de+*W('U:@_VUFLt7BF6QCMe<$=&n77(!K!8(m#=`fEaO\\DUr?AJ+gr"5(gZ3!C!]7Pi['LT2T5%)k1( -%,hYL1d(TSGDSo$8I)0Ab[nUit\[`s2QA(7<+ -%MYJR)FkI_ip@A-']DaE%h61P'qdG7P2:QLfcrAaEaI"qRTF -%,QLRi)<`0>m[m2[T["aO(A@T9S/*!l%/7uG1GD2[c,:S[Gu#l$-O$6kKe,;Guui;d0a -%EE%Ju+/=S0QW<2\/jJN1cf2k*5V>\YK7=_0dsre+'J++n=p/f@/LsGL,>T]qN"Q/_\4uOt/[AY_Ks"\-blXS\dCYJ-pP(CYW_LOk -%YaE(9*$Ci)CK@h[r&l5GY.J*i'hj#aUqlL(d=3"#AH_T/h-=(FE:2uKB-;K`H"dsZ"-ELf7CIa9-(m[\G4P3r&kh<>997c>=GMWA -%6t6YQ@)d8l08*mLZBfB*fSs")]Wk!.<'u)u0k*qFJX--5@G-6\1.OouPaE1W9>gA>J;0sP7.sInUq>M$hdIB^aCY(M>=9GsRmYlC -%\ZLDh#61*a[gu\p]jfQ:Ms#nq!N-p)c8\DpXLcnA'@URqZ1[\3GZ7'QFe8ZV(P-FS..>mqCZ8Pf20N)sq&D,EDBKguJ>VNG -%+U=Je^aU:3oYC9V-'!##P&4a^YkYDO)IU@K/n$Z#h)U?-dHj>b"ZiDo,'BZQZ8nS)?@0SS3DeJ:prAkldZ!&GmG/"q2^E]OA7I=Z -%_8h+")cKfp`OWUmS!>Z!c-),-)Pk*&?oTBbh2Qlr!'$==82NLJQ59J>\YES@`#^ZfAn+gX6NHRL)MJBK%4A'l&g0AHaImm,s#n-' -%!gq.r_M>p0J0p,[#Nsr/.h\2AX>2_;*3MY/QeWe<1()M$T3BOH]_(K17[h4+^qhr1&!fgIRRB9K35Yg^/=p(sPpgle5(kOAe^(ONg"UDd:N%TGlL!h= -%IfBRjBtb!HMdOK5Y8F^srM6T^e,<]!;I#j7(hR[V7]@If1Z`ASBI*25b[-bJKER7Y[(lFZ5Mi0&D3f7nqsHVsU[9jY5/ZW2hb1QJ -%e#\Iu68JS;%&+I,9G=XMAFkr(=j_%qYY.qgK(MdMh\MSSgtT;,_ll_ -%['d[g#kFRaDjWu0A=ade0rEpuI=)!^hlW<9=Un!/hX\HlGdJRE[=<")S1=KtiJCi*)R:@[R]GNd2[*P)\%I*j>^GDiiUQ(ta5@f6 -%Q<>-F-?G6=GFj0Wc4BU%11M=90;mOB8d!/>RqLSpJmr,17XJZ,gaOT`+__D=6bnB6TSA:)n>6ca9L'DibaBS-p'-03[8%[nncKs% -%D)1[:"WUB=raL"+B`;#P(2;;i[CGRp:9m7mhs6%,.,\^+e25O;4eu^mMB!l]\?gH^@;:u?,DWJbP`BK5o_+^'MA9i*PPthWh.H/>51OTPA,6sdRN*]TBRQjp-GUkWD1"WH$%J'[W!/2$c1_q_)K!2LjN"](pE-C(AK#-'e\uu -%pe+_Y?r,H59]`2HJ%1OO:[,N([YIWP"?^q[i$&Oj;G:^^.10#dT^:.AaL0;IKO>go!G5u(+(!s2=R[\/8s\U\]85[/,.`SZ.WcG; -%p0MY]\enN60^PApj546\dpI`AJ`HR,m9d^ohV1lCq.I#S-D8jVdfP6b=D+IR&N=S%gp@-;bOg7e9iVpq2q\#Rp&o5L/$=Nr -%XhiV%k\6F]X;j)B_e%Ki2iE_0$chO#]SBmY-iSY:^_[r&k'k*JV2qta%GRW8./CurrL@2G@Hla']G*ejL1pWOX+niHd-8hQo@=7(poTVs=U7L'u,^WL*+@!%89mhQr%DS0 -%ct"F[)m93RBrT,5(h2n&Eb)1n2Ui3!h^smcZcS*,>q$9,>jW_Oc:7`Y$pNg8Gnt0NYE&Jm]?P1I(Qc@n"5b]KDmV,cY.OLnVr?[g -%""1r@mkb^dUA*Di+J*_/Bd@4OQQKS3j#ae9MAL=$VpKH]aZHkGf5fqZJCt[gN97A)39Mu!lGEF$6j?5^QAXSaTHf:(Nbm-@<6P'R -%XA8S:Tl;q;OW[tB2t0V?H"n*6m"m$M3`*h]2$B'*K2laJ4<+reS"m6Nf_Mo`jkagC_Ztfs(@>*e>*6QQlp'uuNP?Q)e7*;T!sNEd -%$QSNS3:8nb6u>Ri7WV.EZt6s.*$dehCs/9u>gi3O,g*K)eU(1Xo'Udt*4Am$Z2LV<8Wo'InX>6MeGg_&R(m*A3N(?Nm@(Pb'YVPr -%>+T&qk-TY=c1"Y$#U!Znt!GF7t(n+ZG9K/;8$n6!EW<'qtt -%MP=WnEIBaGM5TMn9JoquOC(+%bsSm*l',CaaWpiWEIoC4B31][B%YK*)(0@MVrM"W@msMQI'Es(;=c>7+\e]UF"*bLDX1[?]'Uo; -%bZW_ZIV:T&_CG`^$ZY/UUd0EHihdZ$#7]E-rnh9*P]u'(g%;XRhX-\5BR4+.eLpMWXH_j$KV`97,A&mqd98GU9(pEM>9(XMTc)q: -%+,1bDC,7&)8dm><2^I[67;&$*2(a^q1KsS`]]&g*:XH'NHC[IiRM[@o1#u7d8t)DA2.EE$[_^)1"QjX#DOFWW3#;> -%R:,n@n!2cqSnr`i-chPl[8KlWlt*KP%e8*(S:(*QfiQ#Hd:DcPn4I6?%$)9W+G)Sl/EZJ[bg^Q8_:t@67;M])#(UQ(*uVPJYYP<bH]4OfK(uiaa>3j_!fq:GZ=0E:\1+9(NV -%J,Jr\`..Rns7fC)hZ)Pis7lWQ^F]78J,(btqZ$R[hThblc*+n]h:I/OqhOn?o,lDAJ+<9j1'_\>)&m\ -%]m%rBWh7fA'9O`@"3d>_7#7u9,5GYk5O1D">lJu:L_KXqq1_V&ZdkXQ86Fs=R,r-Nrs7?Vl<+eR-DWb*9UKdpf_6SArF#r\Z`3H@ -%j$+78TdG4na4L^[Jsroq8!H=]!@Hn+M*g`tR+NhHq(.P:$->)^QdNS=@1Q,b?<['*22(3BDP_^3*bVjkefO"6$O;SRVdLU33,`ra -%7ie_7>h$P1h>kHB-H(o)F*)5sJ]CKo`3[_#Pod!a2[5&p`X$JD/k4HI^5^f)\DU.&D7C3E861UacTVbT'>hctau9T)AO_6-]1r9g -%Fr2dRa_,7kD]:7;/n*UnUO^Q$AC0iEU?QoY_8m$t&"fsaZ%4NR5WQ:Xm-SX:9b!YL4hm"<_`A!(NfFff -%euAq!&=Kc=S][;Hpjj"=cr.?Q/LQCQMa\j#0qp4(HoOk9&]lZ#&f/peiRhtT(0I?T7+hhL+f([O -%ALAN!Cf^%^Z:tV2m5%_J!:Pj5Fnep"2XFEa:ea-q?[0*MC*PB-1V7iBs`VX4>PE8+[!^9[.Cj!RE9MF=QTJ";gDu?DWCJo;/\8?Ye!= -%SuVHkBJTb.e$=Ji(oMpCLG(>SK908BG)iL&VJ5/A]8g#tn^?@%qeG!<'ej)t^<;n7B[8HAar6A="8#!bR`9aG=\$9_IaTSm'S;@6 -%-7;B9T>Q0;`%UZX[AVanPOV7.*LiDVaq/_h(pklH:n%c<$KY-5QU)U'<1Fc7`YOOBY7;,(C[[.Pf#0.a%0BOr9LiH-TeSATKg";.fSg#d2S/eS&f'<3mLHPo5Xjkg;6!>FF:]d6o=^)mmWG@+*ld^nXQQKFbD7lM'$#'=h[QS[rW/jF>hQ -%&HL.1`72'BmA;!K0fK$lT[=$=ACo'%4=tUk'agR]/-]l)Fl^"_<5sit!P!'*T$8uA0X\O=XDdL:9O%,A\Rj%*QRn'B\^`&H-ea'$;>tK!'32!&n7DLq0_QT:s6i -%a*KT#.LkWEp*QS)\nOSWYgea`."d2fk:Sc*_Kn;>=7?HBui<',Fl! -%PGdu>fJaI8O__=n9]+l:KjYXK?qbDU>VcC%6;YnZSJ<8G]5ggIGZ6W61?7%-Qad?Kfiu_4_C^$e-luls>sZ2!S6Aq)_Zu@V4P^jB -%UhR\.QC]?JR^Gfb?JSd&X#6TZ%BcT7Vj`]N_!^teZ\`P:,0@DTgP*aU2LQWU1QiS!ju<1Wf5fsX$TV_V,)[4aPsoG)MhK\oU1Sln -%V5C;:%s%_fpXct+o$fgP;gZ,N4l(CkF*LQTkY5W,eqr#%L0`(?l[HfNn9`gAVMhP/5"93Y3g"M-2s&n%$0.<^Um.kEAbQqL*t80Y -%igc0Y0Q;G]eR%laZ.g:0X?A>F<3?*?hB+f#YS?"O1*P2>c"+9KlmhFDb11o\G!,HW*funls#tXN!?lPo^E7W0T`\J*r-^$+pp85* -%_AnIdS+j]nd`2q^[6V,E.@)V=.tu*j;X$&NN[5KBF"(MINce+r1jB&:(?p1gVX^&XX&F(4M*NopPKMOg+1gQhFDAqjb2^MT_[QDl_pt"l8ojTX+FBn@!YAS#r]4@aJ)T$!;V8R$.+bQJRXat>rPFpBCV5Ag2E@Y1,1he(+(-d'$ -%!R9uV@A>2^TRE(+2f5IjA=5V.ln\9RVV"Aoahl79nnR,!i*o,'oO0*HrIPL)8)8cEpO;c#Dgq1PgAPrKL]-nLJ,^2lqqWCJGR9Q3 -%>Jk!SEgrUF*$/@7];Zs1hk%asF_!LsDblAjLA5KdnZmZEYbjl(ZH71jd-5V`T$f/nEmj"X_pJ0Fs^K;d":L -%mNi+RPIS_3$_a`Bb8;Ht8E+^ua'9o/=K/e6\'0bk$:5B9,EIOYg`f\UX\\R]5JBVUIiPBKBuY147rcp&"N`*MN?*A8%d5c?`3@J= -%cj7,ghjRgV;=g]rY_EC]!A.4Jfk$aaet$Y!ag2RI`O"nOi5'9F0B!7CiMuDmA-d-[!/@>sc--j;u5"Th$/21]6f/PsV#R4t;K2?,$bE5X4PDDV_mD6UE.Cm^S-,2=llt:nDI"L!1=IG"[ei -%Ir5Ma]sAfsFa0t3%459DVNBaib\f8K_strYZNK`]3Q1"fDAHUXU3MYt_rOO4DYJRk0,M^m("!4GS/UX#5O8&"]+\aT3Ssi_0(+4N -%Jk*n^2-lY@"Dl/ek',e?m#o[c,uekKh:0TQ1i1HY?5Qr -%F_&?Dm2k"iK/@kO;n/*[)tQL9A9U@kZ,03hq1P.%l,K0IJ(k^LJ6u+l!8pru4]29?VIpXGJoLM_Y6ZX3J3;Tn/GK&pi8=2H1CZ_. -%+(n!,(g-Cak#rgn,')>=[^fC`f3tGs%5D)k9IhT*@YGd8/*[j4X'6*826d/45c@=q-V@XLmpJUKoWg*)oiu?'"'OoPVUu\j+.'Xm -%^e3gq(<:=`nsT&[fNF9lN8i.nSgCc.*bN1a1?\k60Y;?/5Vc7faSI91P7%Y;*^]Y# -%CpXbak1t$m224cZ(Cr+g63_F9*f;i<*FsgSg(D$^&qoaZrG]XFi^3/i&TX<)YSm\0'g?X -%A!pb5Z[)V*7-l$Rt)T[;3-BBDl.s&?&`1di:(9,=_cGA8H3t>2q)0AE(lWlJ?/ZOTEfBK4bZGtY^=.PMl.hY.99XjUi*;a;PS=uR^T=@`cDFM4/E:q$b^0Z$7O[sH23=[ugEQj@:ji=,A1#")mGMaSn,E#Fr5HGKiNN7Fb9-`JT7?gO -%J,/Otrm),&T7(25['oOts7d]8cTh?N5Q1G>5Q9>CroIL7q=:^rs78JTiU?:&TE"[N4eDRY*rgRlX8Y_Xor;,1Z@&+E$@?@;Cl%X1 -%'%QB6Ys$pLqj;WaZ7R)oaA`^2?ZgNpDjEXnV,AUs+U&fNqZ=1TA1*QoN9\FiH,UY0Z#W^nZdN0qn.V]3rZ+qgaXEOJ^:#?R[rh\PnJ]:^m9Zg<.UEC=hN\i'#%=0a+ZeN^Hu]9gHe$&\ -%s.[W+3NEDVEfAK;$_cI7+lpauAO&=*0F/n;90I0%:!X_=#X[N-5?p^..TN9e1TJ1LEFBPf]ci;Gl)VFVbuTS5NS]#Qc:#BUd;Tft -%^Af$lM.I::7\f83Wg+M.1j,R/dIA3^qeECHk.<1IAmQ0T?IW&61(B<,dR&g>',]hCG;1'E-FCi%KI"huTge:G`8'<:Bm1N>DqpE2 -%2`%duroSfqpE3_k[79q\ -%poH-+;U'4WRf;CRb4_hl/E0BmIqpDjN`Ti4hJqY@)M^./dI]oOIF?n\%J4\!j -%Fpu3BPOKriiC/W`D0M#*,Do.+"^8%DY]e-4gN&pc=@*880S)oGW,Bs(Fk>0:Mq<0>4Vr;2g1N.K?Hc$_@01@$6M1S -%Hm^J+rsPHi3sFp*5b"X%lE(t*mC2SCY/G&!&.A6b'G3)n0T_p-]?(oa)2OdM:[5gjj,U=_q@K -%5@!0Rb.9]D._qDhO>*q7JLhWTbu;UR.9oc27(Km9KjK.*bt9VE_*81T"P5#o=.$[TqTl;ln!OYG/*# -%UDWmY-fHU^]b;,.bCR9a67;t81eCdqg8>9$:8IX8Y),^^$?]jko!\*XQ>jkHjr&24GSpe6IP8_rf:It;[1k7b)BsDg27K/iYa9;m -%>d6:s0;R!jOI)Un_W0![?t*@RjPUurSQe*7.OjU?E*U`-5agMm>Bq*b#WcUcff`n211jV.n@U\&"M]10D_2LQDK>uQ"?C5iVa)@E -%0Q#!Qb=l3&c#0Ib',nfE_IZO`5T,=4:f^g\g!q?@@`h^u>0B6DK*/dAo5!;1t1n6B1]fq -%'/J?Y6(_R<753^LnCh@1;!am3C6;p2PP^/f=Jd.FS$Y^r1#2+"u-kGf"ETG\)ZTpZu5Df!E],/eDt* -%fBQ:'11eph -%Frg5KRE3*S`9VH)M/;^ibV#&T4lGaF^(P_uS`")]_u],j_bOpDr\^BghW2`IR!0'W.66PG+\tbq:#]KG7fqd."%19(mBfK/+`!4. -%Ycb=Pe*7EqD[nd=f9RQYoZGi@qEi7mN2X-4S4L(D)]E`S\IChn%U[O"+GnN:X8B!pQU1Q7iY.=?B(C$/7FJDL:qs[c5CW<@oa"p& -%d/\/4QE:e\^.Ra*R2)>QiJ$WEG#i0si0M+l^ZLKB*LUJ2;d9A9QNNG-A-6CYkGo,pD/[9@UtmeMQac:[Nq6e),FQgraLuo?4IH\j -%_=+XR[^8U)CK_ho2q\j_\*Z,4Vq2"@,:!nne/8Gi?@Z1:Gp=S@;HC;f.g*[kem.M9E8/8%-@G`\6`bB.Gs=N`39's$qo[Qt^IgOZ -%&Y+X3kU(EGPH&C5*$*7Y_/?J>&g10u?t -%A_WfiJ"h2@MRpC'8NRKL.\RbMp.iPC:?#loH9lHmY2^/,Yj;mRq%cH3_Mj=5cr[iS#C8VOV[q5]YN!TL^-6eHBSZL9Y0A(gG!i]( -%1L[H@e';`Q<'`7JN5VT*+g_eh5&SJd*H8<8@H5B9#qo`LrL0%$@$_[SkrbXm$X9hZCbqsM\D!LN#e2bP7^h[Gs&fg+-$oBLMc)sl -%hrQX+WKV-Tjca:j8WE)Pl6k!+N)7I_R_(:d>aMo7fDK0iL&q[X.k3Sl,Wd>G*On1#A?8+@k^i;odq)#[jln[UK(MSlh$GY0K3_EHAYC_sl6q;1+NEc":N#fhK36f8h#^qt[m$:oqg4k3ot/'>CNt@PD5kAU=g>r<1Hk*h>+h -%':V8Vo[UoB]5j4lqB;@a6$AWN+"6Ud0&u(*rt%\f_"?qgP(GT.G>\^O@_`Gf[gX7`)EmNpCDU)JTNRJPpT?EJ"rg4< -%gn0XsC>l1'U>-dJ]L[XV=1(%O-r9P#ELL^),1#6D0LYAS"1fr!Z]iPZb.kSo7]JWm3_iFg^ei -%fW6r4_jjiZ@HupZ=0bo@Z@$manTK>l8JZ5#+L;kNRAUURVaen(qQUoR,[L$Vks[XJ^&KfO5-JEq0N--^/&56kaF*5$oal>Fd$aE; -%R@`XXX1d_U+<#Q3M9*94iX:tOLJ4i3^[R<($*@4MB -%eeq+Y,$2G#iO'Lc6,rsdRD+/@DN9UZ!&k.4pX=YqH.cF)TBOZTodOZlNn=onC0l--r&8HFU/rZ$k;$I'cnK0fMauSdb*N+t4RJ_6 -%6VgsS/C15!e?OaTjBLl2@PN'`YQEhAjLJjSId-3>_dNV#-'o4B6t\(!haLJtA?J^k'8b[AS+i?CHrbRARHjb' -%Cla\\=Z/Yj"Wg%Y7neX,\VBhK:l?`i)!1+>O^WDLHYa,-iX9OJRkO5S.q;*+DmC?]O(J1@O=VI76;Ntk+9(kq\Xpab3JNj/#7rTS -%abd"\1AL79G^`\b7^hT1rUIenqff#)RlLdOW6(D)U,gL -%KPC%[0[hN?Df7NuTTea]45T&[b+aU@;.pFdk^i#86f^7d0,"V.Y+Xe,$93K-%s^4R]=d -%)@g3H1TFURA=`XmW7kjqk];r?DPj&=4#l$(@;'-^($,KZ/'f%cV`O8T3=[0=s0j(WZprF0>!SnQqYs"G-[l-7D -%[oJ6gI`W=YADJ@Mb$e=Hg+Fn0YW.VGNL^5mTL-:99J#Za=hi_)mt'i`hE@&L13qc[^G+oN5U_4p -%Y"h`%p(B_)YZdTf-IGn)&W6#/r0('I7%!qe?+gf'DNZ5OaCbD$`Oap)f]S`^ARh%Y^T<]!ok`%(KhrZ?`NIa`5CT00nta''A4*+] -%5([U[E)AQiOSLRl4Z.m)&EL_'XP^MH#_Te7`QAC>2laODpDl4lios4mEWNqd3,]W-)#G4cPB<`qR$KrsJm'9g&QlXL&qt9>DkN'g -%>Eeeia#'*1RO?$_DciT<>o_*GWBO.$k?OY>F:\pX_*&d#BHVWf\QBF6qSrfYl2&+!5+'642k(s`P*R'*EffCHA-1WQiI!m#,b@<= -%T5D]"rjZ6H6>DYI%Te_sjhP=Kka\M$G^"96df%[K:(+6t-6K\n3fF*41bGm^EQ#sWb=ij3;6\p=2JFdeD>E"k6t4t@^%(X$c/"he=.(D7@FMVD\Cin;Ho19'2J=M.D' -%93D4Ln+Wgm,:J$m^\Fj&PLhm8k^L3"J;@Q-+emXZFG&sTK31])nN7f:q^h8[F>ko^krVS.M*0RhtlB=jNpU9pO)7rO2!5T@JI)+s2N\#)7elFmQIG00T(M>MpVR4'Xe["]Bl(3@^YM)lL5hfTdua"kA=V$_4c^+dKcYbJD6$#ZV]$ -%Pk5/"oi=E.&O8CRRrqNP,Wh8P,3>HshOQ-P![l$LW^[+n"6<(qa4HP-FR9Ms8-.>Ij^1j&^b=gQoq4=HB>g4*QZF.0Cd\QW>>aNf -%]E`<[-7cag%;_0#Ai$T+Ak$c&,gULF\3A\3N>+$Fm;$Tu3_qD@4F4f)U:k:K:0=YC'BjuelqeNnn]r2.MR9ZYFDO$qEOQ#foq"XW -%.HGM+ABp2B?f?=UGNkK^neEl-6u^be(%3;9%U?Q'*u"),I=58kB0/*A.H62Z`-,6KlW&R.3Cd&$:MV_:Xn)l'mXrg>OUsoKc8.a> -%YIdJ^W%LCD-oVl+&S>MC;S/oImd6V>2qiDbF+>4Br4^4ccZ;05Bo4TcHqj2MP-Yf/(bKd2m+,cnCNr\7a -%l=*@6MCe+"0@8_J?ll%kAbr'&\)!Q&/6O`Y)fJcH^fZ)VDUHS:P7>JY&M-p&"t@?XG]l'/V?cqDkR+hnEsB>D^pSK[G"aG.A`nXi -%:4='VS.%h2Tt$'?#Kn\Sj^j#6fc%IQE2p;diQIOp$hnam&L_3&^\B:`0e?/&N;%MD.Rn5A#R*j@Q=fsG)lR(d_niWp^t-i9jEV&Q -%G%$V'H/C?#&ZB#4ZN<9_2lh^9%!0_^!JrR$#*N?!$Z"6ZMLZ3E7EI#"k*>mU<'^QRo6G8I<:<"+dt:tdA]%e)HP!<:+)SsP^5\e. -%m<450&%l2u*4J4Q(eKe@5au'p$hWkb.b4;CWptoXF#r(aY:n(KID1r^:*4AGDYITsLBOrY4aufUV>Ofu"PS_?"Po6Mhn7M+LXg]Q -%kokL7[h=be@`A<"aW!PuRZIiq1JTP8VH2o5EVqgQm'%r;r-eZpNg9:C2I^5$-m=S;>.9Ik]sd;=@8th"*ZKVdH,r,VilfVnE'B34 -%l(c434Y'BF&XaQB9?Y;ll@^AnB$[GqQq]+!LaTfM3a=F=dl)jBU(o%cB*6UeIHeSi(`5TogGaK!J>81'Bl4S6f#B7rjhWu:^enJa -%*=)P$fY\RqNo,+K.QIK6o;&JK.oG=l"Q":q'Wq#/TPc0/Y:e\G=WJE<16QCI#;d-K/EL>g#QoJWEV4WgDL&JMj`KGkZE_tdfRqt^ -%Op">q4$4$t\(j^KrY*Sgp8^H6?QbYW$1i*A+U7%m^!N5>B`,?HUD> -%HY\X,s0s1I(!Lp1\@D@@nm7si_.7hE`IVOR`u\Qcjjqga[:9kB2BtSu=#P_HNDh4M(^l0V>/F[_9JD+%NYBK=&QMLf?0U^P2pT -%]n*nl(>3t6Te!kDC,H:ip\?Kr[YLkm_]KnsNa[u250m"Bi_,EP#?S -%)?fN@F&on_M6V7ha6&**4Z.*Zf@,BGE5[3t-i&1Z?0e.cGF%8c=M?PFU*ZT[5=3\S!U/&_lW2MeF-]P5lQk.XpN+Ot',S3=1]1P= -%?k-h&N994MRB4K.%PY&!6;O3qZ6h3:eZcC%Im.H]Pht$Rn?PGtDaji#Kh4H)aukEH%tb\b=_Kn5T8k4$3&b:0,,J15b!LXfOcI#ScH$KYS[^;b+ZYB^SF -%H9$7K7'K]$hVo:&P#Xqd@`ZXTn?.BaD:]TJ_[#SZbXthIK[ImrK&'US1-N'/&F@B -%p1ZNr-JVHL[VRV"F"G@e(AEr>LBM`FBo2DHSkK,m<(*jG0gI_S4sO]n[6"J*35`G>L1kr$Qri"cajQfIN:97FS5S)/O+gC;R5)S; -%_Pk4qkc<qOko(s1G)r?,:AWQ*98YYE>];;a7NhT[s@;!T)MTY%Uluo($J(^"hkO -%OjK*MV'JBbcaAb$lqLq8Xnm,WNPa)?QgcrT)+OATMd\`,LEX:l-/Qb9*&3.?*p,\X!;#OhCs*+;*X?:*;h]NZ0KMblY&SR$_Qg-fcpq9oAQ)p(3jR$9->\f<@pZX@CZ`gKgB6#)kj[2u140XKcC@0TG -%#$U:XUnIk"c.jbJ\/D]:#o8GQTiKmlNNQhI]IXMW^<)\)B(_NU)HirngL98I&Mn3#moIM.lmM1uQpXQG!ntmmFaMV(0_Oc?B2]uS -%4PkN@/`rlC>FlXb0d*+%4XrNH!>%r+aEQ+<:DQ.gTXJ7Zj'a#Lnk'j$!>O];MshaZYQMj%^!K@&6E:.4YYlhuaO\SG*+)(5Ea%q`5A2Hlpg@jRFS`\j4m%.\3/5j7D@9;pR:^cV6a";40j`XV1@R@6(Idc)jH,Lja?> -%3V7HtX!50-V/AIWT5F@Me2)H#]*"]"CMoQkWCAN*+VO`aciu]E\PHucDTS/82l_sl[4JnopRe+IfmpZX?fZaO7cU+'AaWR -%mQa.$LPL1A[9K3,ls]Kf'/tQ:(IYl/eTtf%Om"\ob`i/09%rOH/p&#A>NHmJT"un??e[J/"VTUD!d!Dt*h]`T?DN`?@gsQuYXn-& -%A35L2.foN4X-V[2Wku8Q,r6(uA]:i^WB#"A;k2DK:,"qV*5K957@La[W*8FDE&HO1DNclT)'c$jcZUsYmsKSoN[EqEnU1eZp?d+n -%^*`/e!o(&]MoV#FEX@i'8Y%^YYZ/ -%PBc=-rL0Tj`MIa#W*3*-s4lpo$`OnOD"kKrE;4D-tGS_1YFqoiT&'?V&"N9(,Cj)"n/3EQ"iS-dA,-10?PKV!Y*bmalXih,?e'img.+LLhN# -%kXJB4l#S)n9.[(($!f^20KJDCbUtRd;4o]?aPpX&S0OZmd)i"C?=_Br^75qpb-g*mf0QE(*;K#T!fe*n#4MK.&03e-g5%m#\b%\GjmjT51J.SB]3b0T,5D3]YACm'dl3N*Y;kHp907^6aW+NaBD5>rcogDj9I$=*!Sd16'i;09cee=Css(96XM$\0A6@7l%?@ -%F@^^5GD2J"^bH^LL&]qk*/O8M;/J8OOp*:O04sItA;R&nd&gV50^.n]k@6mC\_ADsQWaR,nWghKNqM<5nXr4+gtX7Q3Eq4cBAXp8 -%aU>/$N$qb7"O99[A&BS`2n@L3g+pc,d$qt&,Kkh[E#n6\rY,r&-pH%iVC3cK:GIB:a?/#0$fn*eUD2X'gh]%sA,=T2k -%p.B!s[5r"d94ml1AS%F*YSY7i@Qjk?Wkc/.;@m>GLuJ,204VHXZK/p5QE-%AZLT!iVFEqJ[d[GU]Hr[kcY&e#Wp=,r!gjSfVg80F -%S%H>_'FRHhWC`\q=-[WQmqPQm?I@nYK;fC7p#"=5KXrN'UgRW3k2W,l'VA)M3.u"PbPP5rQg7De] -%PN*5k#_dA-&aDe_\E\2f]+')h?M8K[oa=paZnJAWANZ`>oChj"_:4T)iaUG4*)"pM91N9ZC#3VS?>q-slhA+SS7EX?OFj(4WY4/j -%f,)ecZj%L)b4/Nd$Q=iIlHuQjpU0)KpIghsG!HhoQjSf,nImab;q\;=o%lYP>-F[6jFZXng6ZO<]?e?M1$S+.HCm/l^;OpjK#3#nZ_'7e\oQ17Da,[cGMW2BU-1P[<+S[6>?b,)Gf&hE# -%VXLH^!h!SQh<\(8JR^iQ+mMsgK8L)T/O)K1.Pf6"o).Jb<.XLpJ">PBCnKP9@3`G\a1ae>+_;`>s4h%=j4)o?G(k4*ph]-\e`73K -%?m=F?aW)^mY52]@2n'D_USb*kNLf-&6if3qgH8dILnhECM!B<"H,d2^4$dPuU(@O[Rh_ii%^@JR"U[EaJP[?n[qA4'GlKb1#O1_M -%\)9\N;=FS&mK\3%ieaE8^b5rM6jqA[nHFlKZ?bT0o?6!(W\&(uLsGNP<+=IFLTl/NG/sPb.$]@N:#%:PM0@As\WR\UUJRJcGkP+W -%hSE-0M@`%#Y&&NrOso91`X4Xd)7^j,YMIKB1O,hjCY2Js3QUoY5%;AIB$4:*lBs)b/7!(Tj$5HLTbTl7gaOTFg.re<:e@0Lf\6=O -%Y=X!*muaddh1tN3pbg2FS1)*PG8N-Qn$#lB:HtYMq^<*\3c>C!Of;[$T -%G2ZQJ(J"5Jci#TdboIX*jO+QI;gH/mr6V(;!+p;!OSQoIJC+/5bd2u?DD"JL)K@ZfVC-Z.K..LKYAl:!(DsY`L!2O9b5l'XJN[64 -%MW48Sl'*b`o3T=uQnCdKB11W1Pf(;o]dZmO3^kn5HS\^,QT`pS[7Q,e`SC@<'/L[r_aW;@gV*Aq?l)mPf?b5(*j;m%j[66\6=Jp:3ej?epjK8a[ah=\8g5qVYi"Ta0sP`=fm0K@R<#`T)4'\:?B&jFDC4C#@$P5].k8W>k2d((;2*[1Du4F<;#WadD7nD/ -%dH0El1b2>[=DfA9TTWa-r:`rSRKT;P1Q:l=1&[1.CF%a[(*cPG5uNu#b6u1C!gW&[Y^S?(caBF<*5R$Pc=rqRC7I4ZMUO&"W4r_E -%eh"=r]i_:ICQs_k^Q40f*HDRii\1V.e)WZ[;66k`2BlG2^1/.6IhVdoV\jLF\ViJ!FRP>J;(SrK28>Y@";Tg(hti&%6nWG.$<*8C -%[N>;s([VXL@=pXq)h^O]>r2#2B$GIr@n]MAOnTcY1C"ct2*F'Pal&4=E3KXjKh0Yt09GAp69#t\P3P)RkTr;O_TT"R@]?EQU=(L5 -%eone1S=:A6,6ES%]sHK_2Ie@$71`&#B"uYh1FHC9Ln7W;%EjVF#p&'Dn7]K7*8!p#DKJKYQG\94YK@pDlEC_F"B8q4rQ>("(ZhZI -%9?bMNE&)UOPC&^chC_,-GFnLD!7Pc%)96=YCJ5AU:64BJ[n^b"%hKIM6,s)T`JprLP7f[858!Vu"eh=>r+#_i7+bMTX_%;DL.FEc(!ldS5H@,+g,%>,ShH>%* -%CEs;mF75PY\Z<$A1=o#aXIJ6k/bT.EP5nPs5%JO-KI'FF03,tiPsP:)ZCpX]4M.qooStFGh.I>6=48^dWh3`j.[V.u>?A1FZ,pQd -%7%cW2Q_qFOmLEqTQfRdFW$U^d#V0qhY:8%>$9,dMW*JAF`c3Y.Y6@5p)P.)UXr=D=1*u%S[tN](@u&GE,@g8 -%-bh)`/>]Bp>tS18LggQ;M+45bMR%I'(c*sc7GRX.egh_eC')u+6F,>YiX/bi;#*g"!B7'MpB#mY`j,0pW[\h5(C21K5cut"k"I7P -%VtkI3e^'jYh;(i/TPW<;p5iRZdaIlF8I>_X9>I-A"cuAtm;J4JQUA&F"0$a6aG@`oA[;s%G\QBt*/#>W[MApRG/& -%[hk>t'[aiSC2::a%E9"6Sg&`?U.+.*1r(Xs1K0/Hnn'M%2DCHdb6.ZMnf^Bt[j7.'=c7Hp'Wh8!_dl&_C:i@X`d$f7D;fmUUn$^;1'Y2J#@"aJNgU]!f%W$#$->*liDgC9KKkeW*#AEkCI?EerD%QqV -%6-6p?FN'!5Z_iFLHD,a"^Oo0ETZti4I5CGU/l76ZXr>)^+];Z_La-3H(W+8%BD-/TmW#H/,4WpBBZP,r.+GCMncSgUd[ul&1kd^k -%?kiD(g';D)V?Ml6m/_b;N80Z+#aJGYpk-+R`m$^eM]HA(9kAY04adTIAHacjKei1j]pr8D4.X8@0lE$&Q+OD)'?)e)`C"CBpSRiJ(Jj>;V.pe:@F_.E@A9Stbi/)Om1FB*gkFsrl#)G99LPR_9@-pRKLpC)g!^n*t5ac@lFk^JD -%_B[Gu0WHc--)YpiQ*Nhafk)6onO!p%Kp\rI@IDOKh97[>?4E8"SRqm'1OR>!LQo/IOCa_>;:)rW01$9o3L[B@M-73',[\[tal/X2M:.+SVN3$Jbc9*p&P!]Ni'^EMcH%E=$cd#,N2$[/N7'm=G^s472'fjVt(4M -%^7RLhc^^+Ef&Os2a:]kl/FY[CVl)ZXgMe'.a`cV21i%$NaJO];M(7SOddLE@Pr`+q6N#V++l3je]X8N4-n/+Cr7ZP?`se[1(>R@h -%S@NG=aXZ0l&dL(2jgM!@=)QEhEqbePA((2?C2EbFm7Rdt@FkuX^"tu?6h[jS]'2003mNn\/D62JRS?jZO<>U`"65'HB8\\mZ4(s_f?<)FHW+'/]\_r/8# -%RKD`=n%`c*roJHaH0(sYS*W2L192Yn@f`(Q3O!mln/'&!Et)jZ$Yf[/`MA;t7LI8]5pR*U/*B_:9i -%cuO@Aq1c#t3Rhq&oFq"0d>pR(?umkPDPo4km7,\dmLY0B1^c=6UI06#2[XPPGM\iUgLN^beoW-]`JPnbfYk*qhsGfF\kp-2BCZck -%jXeOAS8Q"bP[(Q0n)AL\52?-bW;[.3&3#IZ>=33cXjD8A:gWbpbfm^iM0,61rF,mt!MEopuk?Yf>K6gl? -%(q2W0R.TjL$f\F9>W5W)oiUcfm0Sm7booK]j=[<3D=.=J-_f1b4?^(2-"#L1)f#OLh,UqJ9V864K0._s0J;Ki=sUIkT:ZaV:>p3[ -%n=ZI/oj&M"j/J&1`3pthCQE-f[ntEg2o)GcpK@?=OnZ(cI7ZT&;KC'CgD66#'W9,+Wr&A,Y;'o$7A_iiGmFXfp7)cm)Z*[Pt7=gZ#paiA_5j=D4p]TQ`gY8nGkqZKiFedmL3!F*&3Sef9`^!c!i`< -%KLk.#fq22Npcg@`]/XKJlP6=dl#09R(R&VhD@.;k4`3M\ooCge`$nGkC:jS4(F^q(#NXYI9^2?VGs<3#ogO'13S27":R0"(jXhL`UAL.dI-RE.e4e.2o"4>e'Doi0%S6FSk:h@" -%O."K#CdT"WI8!`3;s`l0P$QH],A6[p2EA.;@,u_$aY"Fc_i8 -%,7Q?'>D^8A!.Q=[Z?0g4Cth&HCL4Qd4#NP5S/h5.muPb:\0ORScPg>P*#qi)EE&*:MAYMG,oVX-YeL^k\6TGS,GfpI>#r26Km)ee -%92u,DGK^Z5/HL*[ZHQ;%n972h@>XKFma^$3W@)-^$=^9oG@"H;4*Q^FDYDg.[o-+G@G`SHGDNINU+gK,C6*(Q'qE[7Dl]nBnVQr3 -%5_:M',\`,)?Tjj"#LG6q4(r@06GU#m/DZPRWb'R(U4dqSJT\-Ibr9YBn2nkt25K'! -%\N9PVis$XYTcC_M[T*%#$/d@^]Kln+\'P'jr]E#r\"UH9g2q<>)9W%WB8IP#O%jDT-WmiCJH:CiOQFWtXb]sd<6^"?eJ6n9ge5;KMQ8k@?)j^P%^HZ`+k8E+)jl7GThh:_T48R8SS[cMdQ4K8(ZP6o)#9Xh0EK/%_2(9=UN^?Hl8lJ6du264kL -%3`d-<<['a`58004Bc`qQ`e-]0?nl)*`ia:(M=N@#WUBskj;S?VrARrP)F-I:-\]1gW0h_agaqK5`]5:E?JDb"3u;9]bb`q$U6'*] -%e9L($IZ$oYmD."M*%qmfmtsn!@I.^?[qd'b^6d!SXfcdBIn\5gHTkCu:';&5'V%7Rac:%;VuF8-"?^-_D:mZoU97[c`$T5MSO>Ep+7GDp3.X=5R9M\3BC/)b?.\M#SK>jk7A -%e#=pAs8"QZrDH)?Nj\W<0=!pZ.F8tNGld%-WS/JX7n_:a;8?%P"hbuqr]U`Nf!="EAV$9j$H*W8u8m:ss -%;5Pj7oKFf*NEH!1&?>O\].lO%p>C6`f#O!Ib*,K4Uf2&+';h6afD`_X:e6PUi4fT;sOijLm_W8*>&G'Q1+Ql=7p_T!-2*r?mf-F$bUnPY`7[KP!@\)'LA -%cE;<,%T[6M\K_;f.J/F9V:$&Y!7Ck/6SKT_X^ZVjbK]'cIN]IKAc@oA=ti4&:jYikp3XAD*U\5TCKp1()PG.-+Vm]e3='i@U^f9X -%dR!*Ih_Sd*gD&X:)mnht>s=@Zb.G6&eY4,3*'`eG6s"%eZPF*TE;,,ch#QXt-[jAClc&<&7-CDoV9VqLI"sqgr$b_gX5;j2gsO(\Xp&F=EFO! -%@8q0UIb1c-MS$PD[4luO&$U16b.OJ?64X(o\,qFI5j?[hFa#LnlA@pdN=`9O]tnB/o]_'pBW`Rk^_MS&^-@PkJSYF47lMOs-`:U3 -%.UK4['o9J8np,$t4@<6%-A<%#gQL:Bm@JuI)(>o.Cf%4b+tp^eKZ$QoQn4:6n0"4@>l= -%oj/XG*U@::SbL^1Gjj37ZgaBpK:3/\7ha)d5PJ)8>OTIf2Esjj%t/[%OL[e=@.j#XpL^Rg%YQRYf\)B`f5ck2\2)X`D91$fDteCJ -%"`M.bnX*bqgE61GU:NfuJY&W$R[r?pjQnKP)oM&\WVSKa7ON[9WKENF)`GL.L/U6]PaG)Z?$./'.tOc:h8j&@hAiMt`q0/cX4c6t -%lb7[GQ['m5qB]4jk("kaIK`3GhHHP=`)SJ'@d*lgbsY^UOrFV!L9*3._"WHNs8ZrluHNd1q3h/\+@,eD_$1k)EU#l -%l9f1;jP7uC*SJrp_f]7Sp;u\JS$H8MVgT&^*oDp^IZ#aOaMm/1LE6S'AnAVF -%m_Km"UA!D@PNX7$!$-4*34#e(YDBC9g(:7lFX8^5rPis"2>32iO[!LprPcp[>rmKlTL+fT/CAgH6d%b7`/GRsG++7s`q)gF_"IPE -%*1Ghu);K5q/'*T6'LqoMU;%N,dB\;iUjmD]P9B; -%1Su>)lkt<\Rh4T)-`HPh10%aA2=eJ.D,ZI]r(^aZ%_)RdQ:>-ioQ%qe>\`b1#!`[U^;qjqh\A$3)X"\b&'EHq[T9I*o1]b\J\/6T -%pAPKaY`s;mek9uGb@\5j+CH%31!?\a$t1SO+o1:Ado(cO18&!S'"qDR"3EkHo1BV'/O:CHoPr`l=Q;GKqcb\a[a-6n-hS)%/$KUgS]f9tW@nJQUrJ0`ZkV+fe1k];/Z2iq?k`=!N'SqWuAJt`f1L0/S!!AphEZ1m'`Y#]dJgsJB3cL->cpa8<3=MJWpieF?N0b[lL\BQ+#c5C+8,Qilio%kZ^37g?`g7p+09crP8N;91r5Y -%b\S&P]#I@jU26BYG*>n445bnGgaS"Q_?DM:?HTsFlkZ9NF.Kn>lUjX?*sNPc4@sUq!=9 -%(1uH*eOe];%Xj73>K$W*`C6AG".P\JI_sI,COu8fE5t/)&"83sCn[T\[f1p`\Q,q>L#k8-E4GL$jQa45JI,l;fIWj'2K).t"X\B@ -%4?G$(Wq=mkDG&?^cB'+9JRp_:5k#M_^Sq,0V7`!JnO)H_>8?r=.;4M0`7<-Q$>7o?%AtS8aL5I$HS/hAT#Jb:%4c6 -%YHZ:k<^7e;\o-E>W:_KY[Zl&YBD!5,>>Ff;4P5%:;2%G+o3D>ZX>YoufjltO[IiI8LU>`"(CiG!/;Z]8nuR3i5`#nD'HQl_u0,>**?/6c94S?#NL,l0n&fEqH`2U,$TM0Wi;GF3DJV8k_'jB0g+k()/a&(^TGj5G3b/(DS3>+XW)S+hSUWphPJ3lgZcJOG[qr?9?Wu5t-N -%a^kXJYf#FrZ,nDGGB*6oIk$4#c4ZngmYe$YZ9g,!+>Eo>Q)D66RtanEno;$`Q`X`FiBG&e'-N=[df<;$kYVjD46^\%a\aK"=,0l9,6Vo18beia`BPb=E@,*nqls37cGoKu+orkSE]hM%:*@c#/O%jqZFVTm`3F=+A%RLg/9NXQ+;J:A#AJ.Gcs_ -%`hLgdh=XJ7FC2Qn4*QIpSQ>bD0]ni-jSuCamWY=IbuTfsd[Ro5/J]j]CV -%IRbqo\a1Xi_'N,84dUI>eJnOkef.?=)B&)X<4f4S6,K#"doCX]EX%2lX#Gf+$`6/jQB!;GM5[F2dr[+XDaBdaG8S -%e3.HC2\pK@Jl*.uFZYX7oOBAZ56V:d$Im-Mei1;5tdh@W!:ncldCKRQcom#j!?U`inLk4QDO@(e.tW7HYrE9;2)c/C3<@L'L:mG7L?->,Eo/;+@;&I(]N%4-hZ9,_NOI5;^:I/PY[C0\[D0?H;!&sp\?eu42VKq8K"^'SL[1G24%hs2'1Gl$h5#EUY<0()lgWJJ*<<3l3ugni"B(Z2mg01.JOs)_a4]-GIRe]`f%!.re+ -%U0$LL4uk?'<<:FJduL4nFt;8#U7F4KDmP7&^NF=n0qu:8I:P^GNd0NRb&SnTeICkfd%c71RKL8o"H6,d[Q&p.\du4m<>ElFi,9PL -%4!Om4c'uihj5*e6I]>=:YrHo0c8?2QA\'&p*b):l<#BZ=K"+`tkTP)I[GFrXa5Q3`#,kZ1$88H<6D:9+*QhVB[m2ZZp?7OF><".1 -%g7/"^YhdI2^#/[;3:Z#rk"l'hXL]:E=%i0+h,:NTFR`"JgW_ukhE%CdN1nbd`c(&;12+`.n5h)hRNBB[jMq5dK4ZQLe[ll$SasAA -%A^U]5R"q]N:s@-@649)n9T\6Po(tDKmrq#e,->&lA1j,7X9BfjAW1aFL#1Rc]ZSd1P'[iGZL)4mjM"+pp=2$+DY, -%Ri$]U2][u^V1"8Sm#B8PTAMVY3+k&<=_U@aeP[VpP$'7"lW[*(AsuO-Xe)J$Y\U!l.AWbsLbarthTT4&4H0=@%\PEC@p:=ZN%k5f -%#Q#7di.3n`:[^i[5Wh:g`DT3082&&so<[j8Hp<\:2j/AKQ[5]!8dMMG`>2nGLJ-q3[00BZKH6EWmoq>BDi];K@(^2PB>H6M\cDgG -%YK6%&V&Ji[]DE/)BYV/>#LMc<.bp!Ief)L0VUMc>I4P74[Gu;kcNh_HO?*&.7JTg1[Rr5Q-YH(QE48mt%(Q91`8N;A$/s1#Q`e4&TkJDoMLg(KD->6*?/"!.8<%7Y?M%4#&u6k -%9\\)@"d"udHlmun>?^7!&>uC8(QR.b,C%U=h0e!pqL0JR\%Vp\FQ"bJ[F(Vk57OnGL4-n/K_4!51bn!3;oi$<"=n"LEmP`^#MBJR -%T@h*CBqal-\pK&1(g5:U>%@o(h2'B8!SMo?QCh("[gjCL`VlHTA1c"DWdrV3'3QjOAhG5-l`$HDkHX]A1\s]paD?>SMj_Of'M!:h8>HVKsa`5Ytp+Z&oM1N'N=[[6S'Hg*tJFCd'Ld&f#YIP9*4+mc-^TolY%,C"B'Bmj#7fK&`D0BP'e(S\PF6e@(Z,NCUGN722WpFV(C?6X! -%"HB51p[mrkq?RB0ErtSSH[BGc,PoCn-%aM"nOE0.c\$V+GIlGEB&5^kUX:H3i"gpJAI;/A0e6V1hRq_ENK7p[E;K/s)AMV4hB\Ol -%`V89i&T;37`2Y0eogU-Z(\/@]8ed-sRkE'*J2Y#_"MTcMQG6sEYr_"Dq"$T/H?4L/ek%;l7FJZja]0n9CXWX8(l_"/qnI;m5pc%B -%CXu\=G$+]khX<_=AkYp5\o*=&M@HD-"T4fkFg>k_RX[O3nNG_5;s:Zk/1n!55qLq0UhV@2iR_rNHUVOq+e8KHG>T*fA2YUE"Kb>/ -%mt0p37=kS$g:P9.$A)a;DcPare8=:F!VW>f1pCR$:%4fM(Rn;0,`G@i/ncGXFp`P;9BofPU1JCb!Rhd`_5@P87qRO0:)UiMIOOI1 -%Q$W&AgGB+n6IYFk65IaY6sdZf6$'.(0&CJ2G?/TWllh&U%-:LR2LXc=Hg<*pFn/;8Egt3herFqD&CUs!QB25Ed/p8G<>cJm;M_&@ -%l%&GW_7ngpVD#bOo"Ai&3Vr/K3cE8PltT%HRFtRrAM.b<1Cnm:jCclT0^(bdrReThMg^!L,p0o$F"L[;FcaGh@!r7IoR0uX^(thi -%!A)D!c%6-0i)F-L^Gqt0Rq3fh"E7e8W#>j)gURReZ-S]*iuMec1-++G6ci_MU@pma"MGn`aKCpikN8_+^CR(5D99rsG1J[O-1MH4 -%^r&\h6RS(!H\02^(7u8%SF>XGoqTp$3`/CSO!O,9'H!:1KIq4)JO(59l@k,:2bcl"Q-P28m+7!Q#uuf=bfI.['C?!%HpOG6pO9`% -%Nj2-.6m&JHm:\%c(OHZTVUibuoima+^fX8rqeM&V<+]J%(e=qO=A^-sn^GZ`U6F1ErZ.2e&F\;`oU1kDc7on^pt?Ser*1<@`AgkiruNf"qZ5mX&Frp<%0"'@74*+;kWiH@hLNU:WCs5A$A_iYG'-o)NWVsa#5J%WX6uc$QF_5 -%FDN28B_:'pf!NlYAdqfZdPGD&bJ3qlAn2_1M=e.R4GB-&S<=b2Q=&<&kf),Wo-OPuKJ/$^*m,$0eG%]0Z[uEn5%/h!G5oj+$7@[- -%-$=(W/3JnX%ZqVDY1OXrH8$/*d/_P#_=h3B\oG15[@*EPZ#6%_]?+7Id%/T1I+JVCi+P/].BFbSQQAe#DW/6X?^gAOcG3nqW&Ood -%`d'd9Uq]#FK)5E.j7&Rqol2flQEI'PB2`n@GBYAp$uk]e&2dt!/I/Ukge=Z:RjX^g1U81o%$L'Y6VZ?e":aO)2.(n>mV>X```FoG -%luU)L^K[V^ESG\81r,L]65dB?WYmm>:sl0X7dpA1Y;U?+F%"3R/(@P\\7J"g&_LsVg+S@e@ceQ-7nO0B!7;ra9dJkWg9,Xif)Rs% -%!@WU(@uU]>K/M<7(`N/r.@"#AG'0_ugL@T&$J85rZNV?-\hQii$c4t'0YEm$CQ"_)1S*+>8Z`$4bFS=W%rU_3b`/i!:g2;WBrYrJ -%LOV;,Xa>#b6MW/Fn$:[WG`\?bVtS$c[6ffFHK!bY[1?6j;6;ll$8Vba^G1i,3efOMrPGZlr4/ha6-U0jTZ3/\TYaPpB/p'-#hCf78d;R'i@"4rVUGTD1J;.FNhIiWfZo_7d#!+1"4g7KHs*]gMM@sgXXTWd!&.WX(J>qoaO\@[*E\_ -%2STd.4l@o%l1>g<^f%5#+NMr.']=Zh=2S?TO$CtFs.u$PpXu5*&h'+HT+lb7?=je]-$gT;_m2]lFAJ=l7;J(E4L[:a8sbf/WEc8m?hbsA`X5Ac;g:piCZ5EKB; -%);m*>NO12YRcT`XD<%U\<*W(he/b)5K."\ -%qKuOLYZ+^'eDjY_bI0s>)Rhe?oK1(scba&8&.R'jFtlst#*`&&b%!"o_fN?m2(*3!kZug-%F7$l5[/goM*g7[KWl(.Lqcilc`TMV -%Y2(&Z$Jaq2UZ1)VQ!78CRk':L(W]%cO)H7!;?YKt5SaXfVL[CJ!8h?/!b3C:J2-m/U\j"a>]'Y8:QVK_M`:>>=Ji_tRbWZ1^s>KCq5')b?";'9seJ1eR["$Qa'"iSA(;J="$d] -%4X2a]W].Q#W@Dm>P5nT`X/_q+EbUIJ"70c1K\KLX\a/1No]r]8nj7'ZZ8O@NLr,p2hIUe- -%#l2aeU%LH'UaQAY">D?MdgG35)Xn9*0f94 -%l@.W/2kW6:;;\hOZ#6bZ-$dE`[/1Mh%>WT1fFOApRjrs:bG^s'MDVSLfU6)Lkk"\2"$d1X -%e+#/12(&Ptmromu[&_$/GprpTad7;.>g12u,0X+rOI]J:`dJI\]^[g0IkU3gOOh^U':GB!!9F1uM+45!#:X@@P%$:+a`#c@gmO3A -%;FmBV3o.W5I;>HFeuc4-RAD$HN4`U#+V]2>\!dp5Tl=e5?]d&X^]2L7s7?9f+9%>9qnjNTiV1*>nLsq$huD0o5+2H;YC?5X^\de]^]1/1q3UE6^Nf_ODuS4PIt%@ZqBc)\q1&D+ -%5JR3ZIs_.3s78#EVdJ^Bs8+JLpA_jUq0TaIhgG5\k0&VNo?L63hHfY/WA""b[&%,"?Wb'm[Z6<&q"s4t*m?@Yn,2&AobUOP?GF!S -%;#PlMTt&W%o.RlOhsh%gZN8b!ie(i-/RW`jnM)&goNEkboSaB@[8('(\fhS\h<[[X%++"[4+@U*=T>(+8JF+l%*uc70$rtI?L6/B>1d9\^58%kMlDuESW13DpNh@88"A+n6@fs%iCR/K2E=7hR-*oD0l8#qt=Nc@>&X>!9fsH1)]!bgL)FatS\T,%" -%B,.60AZdGCn650^aZHa\rRfY7bcU*;104b*/^/:T[:AJ8^:&%#/sI^nPF)+,#&+Q^efDE_5Mg6[q[Q(H>cIqcDS('80]VY-?.TR2 -%=#L5pV`A'BWh7$ujdQ;!"[e)(@]i/2*UVLFJqdX<"agH&p[7,4-[$QjHq?d$X-04VI2Q]?Shr`&0-]R;QNk_2S<^mEKS"79%R#7#2K -%3':.!I@5L*tluV6S.-pXknR]Z/2PNWFCc3uQdH'B4\XWRYNq3nQPk -%^n9A-f$'/4ZXqsb$G?NXQ%dVV1]#j3".1QsVH`e`GBRD(-lD9sp6rS\+F>8q5;oQ(%;'^Z*e)=JoRG,$QW;E._QgX^913(>hBkRD -%m+AoGp1"D1m%Xo_cFA$O::8i^S;\DRg_M^/FjVdg]uA-ng$onH2kM^N0"tkGI!N6o39Ki$+7Ags<0&i.RC+C/\27EnMKZTG`pNE. -%1bntnj0Wj51GCiQL_S0#Wo3[W%^53n@c%s;Y:c37(>%GmH!6$E-2XpZD;7&F/Le,R4[Mk9hK-=&,Ru+23dP/Hb_@+UERrNbl")]j -%o$hBD*G8@E^6:Cfi"8q8UCjG$o')GRNOu=7U&C8_:oP!Cf@*75nTC -%)Q029NQ.;(iPt,8^]l$1l^56Ba1Z]]=&3hunGTm%]dg)3Tln>4e&d=c>%QJDIbOr2"E?t^f^KP??k,Z_b=lb.6t$BSfuS/N/8V=E -%,@9Nj0:@9u5J)&u9^X1b#u/79qgt9f%2LB:=33i-B5G"Gs2+SLptH_TNAnXZ2!TYYc/Hb6dc9Dt#IC27H1b*uE96kUYI -%oC0asPe3]%M=mZL2]\EWpeuHs'$&a\ -%>j=-H@_)[(7!?<1OY5J+7.C"-^0V+Q@.rH\"m0B''b@g;#?F:>Q%S4!RDj-SCELoeGmoG'B(S8.\Cldm)BWP[8r)*A8Z=EETPsh: -%Z[/-V.?fLQO=\c/>4oiS*`Cc1qA-]jV4@$\PjkpR-q`P3=,GViot'= -%70RQfo.6Blc,/\%)DK>*\W?lFOZNBCB[)'ISHD,]gl:)lI9r:`=k["1^U3'660k(R\N/MS'bbp_$tmR$Hc)4&#,k0nF",.@T[9R[ -%>HQ&F9gj_J[+"-WQcEk`7X_e!j4tcKlSo,;+QJ_;TAP4ii`90G4S1^WUS!G$R/9fiZ@ILm&cVZb&(J"Toa$hbQi4rWjs66m*ujZV -%0o."oiN$T52$XeV?jtuXDVc4V+hLUc4`RDSWhQ^?'s@Z!DD0(`@:HB1ogK(.,*b_!Xd9lt2?d>:B%\DR;]VB@QL442& -%NrA('?(17`P`6OA27%eWCWe$%7W-(_*5ol",*i^iQkFlj_t00fpYm6:sIXNR8)SkMGb2b -%MEneZgc2'PB%[:_5bHI^H)llMo'm@@@YldD2d;tr(12W:8LiQ%R&HN&SOn+gPC26iT,C-3]o4HKMun9.kN*<;32%.Ph1+hUQ]7i)(Z%9M?O;KBo*),QOXYD3T;"aO#*Cfci1k=Vcr4rAk`W2?P2r8-!I4"unm,?"Nc1Wmc!-Ct^L1WFe_>4$._KgV+F"R,U?cLgsN&g+! -%!9.V;r7tJ4]*:FW&;SY7M(d/Z1l%sC5.'B&C>s.T;DFHs'MhOYlo?G6"Cb\b_VM%bNN8s#4N8%S*T'M=eS4cP_QpZZEcq_>l4B(VLD;&+7iW3[gpq1Zo$)C -%O^8D?E!*Q,@kT+D$eE-ic3V=AT7J5iYamHF^(!,V2m[rm[H^-O*h52#p^S+s&<%)kFQ56!M$&So[Upr/3..(rC[>I3,Q6YGX,6W9 -%LQKM>"E"C>6B;1@bPMG1@/ -%(nL0&p_B#$Y6`.Kkl+M.**!T94VT,K;`Nel>@J25KXkq\E[kDPLWg$%h#5=HhhnW_AmA>si5nP!;"9_B\!iZsToZR> -%oF>5jSD6Hl2b/]ic](AO^m!5d92iF(,.^%Cm;ah]\6"@;@>rs0_WnXuGtmO;6^Z!QC+-1#RgiM5Oc6&u??+lN+j -%\o>e+!Zq:dTX=?sq+K9g9K4HfdY3b=qP>OP7:ohA)>"4G2PV)]%m$T3&Y$-MO4697.e,8@pA&j+Y9$qO[VJ'gLTo\,hP>&=<`0Y* -%NSJE8?()bfgu>dMGr#^CGkdZ,!FOq?[eL7lroXPV?LHil^RRL$O"ZQ$l/?E,q!O2i`,R_]fQeN]WPa2YYkK14alAD-hL1GHom'=t -%DuWT\`T^&V+$YOEl?K0hS:AScnp%/uSA<1oqVb[Dq>_meiPD^Bn3N*6b/(E0n:Hg\BkD7'R'*K1BmN)bn(!PtDFD@tf1";Y9_+UV -%`F$*S]o_.WZZS^SB!.?\9[DMjfouQiQDSot\FCV!l/QsdYk:4#'8H\OiUD+PW")>O_sqq5.Z]AM_ZB[S=MGsD%kbZF>rXk\#9W$> -%F2![?hgRT"[Z<)&YP>UE*Z!%8NL^jFC"8fAp\?mq#TO=?`^;`V&@rjuS7=hV(d&f@X^anF%,[)=hD$E@L6'A?o,*WSL9JWopD=Sd -%"6a7!I14##In0r0U_&RNL1=]P0o9mDGT9X,a#(pQlI/W`NCg#OEg7T#)Jth`m@Cmps*IEfHMpXUpjX1*%eC5SL%;m -%2PIj3%CaWs&qe.Ikr+k4R*'H\`[E`p47qM+gF>OLC08(<;NA$k@GH22!liKO,7K=/P2bR.o04#),C@9Xe(@W.)VnR\/il'M"!__? -%:Le!Sl?LRAiD_jtH3J`^S?i"s8&1(:6eUMi473na_M![1iC=n[6pgjcZ;":X\mK-*WlDn2[hi*_`07i-c8(>itVR[R'A/D`\0L[C:\P?FKZ&;dfJ@i437+"gY=I#6UQ#;Sf2!$5! -%]jd9"T(u$>@8[]-OA!2bm%,=t[80VRf5)o^DI\;/p:/?"3'\X)ef?,g%LT/Gp&p;CJO<%U;bTm_b[n9g7I$'rEs'RlXuU#';MWf\ -%r4c2>2>iJiOc5l9$=hZiFR^)?E2-Za!!/Mj7-@>l!egH,qapJT?9uKg'[45jWp3&dGS-soh=(KKd3g%O;2EIQRk"FWSVsqVik<7b -%n>$*=YW@2[0n'P2qQJcmM:0QE70@c]"i&rS]ZJo;p7&SES@VN#>XH3O"KL0u6?++G_)GM*]t -%Z+6YGW8F9h4rItL+!>2>62[X2cS^7Ai84nMP:]Qg37E.m0/rL\&L2%)^3^Q9Wb,ijE,K1^lOM[Ii3-40o>^Cs5h9,j24A-`S89JoP>2^N1-8St[i*)&G9.ubP3&fuEKlHD7fYU9Q@h18kB;<`/L'qfWAeNNQ+2s0J/1(.B(Qn0P -%JSFt8[Gd>cT0TiVSXIJ=\)j+V2\)K'->N\Wf9V"Kj2]PCt:,r\3bI%UO'Y_l&3##9V!I; -%a5Z9FFSh@U6k7`/Q,FlRLgk0JVN(>KlM;fXH)l-qMsh*:5UF"YK,C^5lcDGr\D^21!%UEU'<;.;[1$,84eI\Kl&ZV`>l,YO'EZ$o -%*aW1o&A:mNYYc'ok?DIQJ1gKqClXsb-+qH^?8,kd2Q'aa#tM094Im05$U!L0(`L#+AhA')qQW>n"4D^Bl&u/2G;nSN$ -%,BGDbYLm'*^HKAe:j2/aj[m8%BaT:,VnMaM[1]-i"b\0iS:6Cq&^C*+H^T+V6F?2AA`C7&1fNLp=`7dENDpc_V,tg'WG#4Z0V*[O:WHI`o\>=@K6#/gQ$*? -%A.Y^J;:\-J`tWJ?E"mA'...VH!OUhpW9,V]iPn;XQ3CO.WHQTmocZ**5/i]JVM,b#XFl=?F[?r/]e(:\l6#6A.YkOl.`82YgO^&! -%N+<<`Vk$5'Eu]C9ok1rr"5PQeN8=XW%ZPPUOZt'Z;,cDDT.p=oQ[)$iBIVX"":V)M/[@rOL\ATXo$B:4fKl73kVQ18SZg]0kiNW' -%@)0NE?7o;2RFciW%SFDd/rf.1lWAtaJ6?oHT\GfQ_q)2TN$;1Jb:Ls5_Z1/?Lp@kTD.]m2,&D.YP;n0O@0!oI10HqoZ0Vl0aAN6K -%&,e)!H'\O&bo=?*jBKJVnOOO`1f!\ZgKL.Tp]QT66L7Tl#79W(qQNu3!Jt%C6f[blgJVW=X&s#s.k*%R'#0QZ(iT'],j)g+hEeqX -%]@\i5m$7lF4UTpIOU/DUP:srMG%PL_?5e)dM66Pr*I1LQ3V[4A(/oW_YZkF@s-c,)dH'`73OR_(p[mZW% -%=WHpa:9-FN:dMKB51G)K>1D@KV9%\iJEqj`@qb+%?dnpcZ'3Dr(ime7R.M*GX+X.INnH_%IM4LUH]$7PkD?p[\\NorNP$fWr)n(3Tn/Xt40,M,p0U=o4rq?ZI\e'lC=lX(=5s,Iu8qanPMbj8I;"F\)Wc/mj]*l=6q6`Nk -%+'6`;URb4GkS%[N)SaZ&(*2s`__,QS@_b40OsO57]B!4(ehD]cJd;+r>97$p5P$4!FF6SPoYfe_[F8^ -%[KVl!j4*!l[LnP5+VmllnE$86#_on3S?=nljI!3q)d&&DbrCuOp%'+)Ui>4ofL`3G13U_#bW$G<*02m2rY?CYWMFu3DQI+s!PJOs -%Zs#T`pGQ3@dVn.N8H!>uZTp>:gjo?(J"'eDkF8U1^6b"K=2-?MFTL?2%M]6/g.QAs"?aV;"Eb8$lAV0]'X]mtdJg)1sP,/D94c'F'K5H=*& -%YGg`i%6q'2'1n3r-IpY^D@cm@j>BZKJ_ZZ-\Qc(@am6#BgDDtEk64p@2poS2UlWkZ=!di.T+#)TdWQr7Bm`;$@M1if7;[*BI?@+j -%4ZA;Nn+?^oe/9^TldE(rEfK[/Vma7g.2js--fD(hq=t@&]7Lr^FHe!bZ>]ut4q7=:DHpZ);Rsf+28i;qZM&NHmPnf0$8F[K1'@Ls:qP6l(>Go_&?VqIC:@BHeEuO:#6U7u^LM1hfI@q[<\YU+6u"i`n[Cr`*]I"Ac,qM;(g4p3&s">H -%9n-NQV+L&R-nLOEYa]!i^8tS4:!'>EsJ(p%lGU'b^QkuE12_IB:u$$L9eF&.gk16ODNC8Fn2]&^NX2=48`'en";X%E3H81:\_qY!c',?';*ES)ufgMQI47. -%JPol\Aeela(UGQoUTYSc+$-$R.;M0rR_2D1[M(-*TYBh"EI%$h6VU8'gt -%q#hpa2JlRE:CFd5]9-jKL.WbLaX'k@;5k&1eJ*6MN!Y^sT>4p[I,-3lQL3W565oG%"e3mt!>/%V:[2-AWe6;cRSno?iiK>+0GbhIL@/(g\ -%NB'6FVAsRb%NmU)6&c-X:5E)%!1.b/S1_Xf`X]d>'$J-LM:CP\PTO7_Q]a_'!t8il@T402&PtbJ\.p/Ap/?kN49j*ZSrj#>KTVPl -%)umk)^/_Aa;h.BWLO`2mJ[)K^e28<9+/o5;%p0O96h$GFIbJ1 -%%$V%:5asocJ^/TpX6-V4anQBmdmGMk#:=<=(O?m5[Yo*Sg1F9&U'q]+kECdCN'"p6]5]pbDX3$u0Yf!SA;Tl[g>W)P/6 -%Zl94J88Q-Oa3c=_KJZ\o^`;[bChiWL3r&RbY"K3q?-< -%GZ>_%_Dru02d3`ufm7\JC,i54pAndZ0V8uim0AO5qPIEk%?$uOnEqZ -%#9G9FB/YH30j4`qe>o[b1Od\%4<\2ZIX?TX=WJFB)D_^P0Q-'/q'3]MH-L[+4/WLF%14GO3Sm/.E4VL5o0%BQ2hlZp!H]K0bc"-6 -%#>YFd4X$PZl92HL[Ms?C$*52>Lap,jX4:#\`n';aatR1ff;^CP%-&TXM[aQg#AQ[[B_HVto=d6iRpo)=SH.nm_dJfdG["$J1%W-6 -%/-p;+]T@AgH]pl1!h%g@gAo&l((p!hFH"Ni[m=3T<+`A!IG'X-hSA?GUa8rC@%tD3Z3.W(QfZB<[(25#q=<4$lJZ\Li -%R8O$Z+SC]qB,'^_2lsF$"ZWN4J9DnfTk,U>5_E[O_F3m\0SquhYPSe&N'6_`B(U$P:Q*)k)[XKS -%a?[JFCp$d6tM/M]L*khV*sGf94n!.NBq=#^mHqRALfg\p[)E.rMO -%!e=WN-n%AK>;TC"d7_c=uWZV]sd?%aKUUCHtqur6oD<0e+e^HJLCr:)(6:'jeLI;7c8C$@k2)K.0>$AUc&!<989b2o1<_2 -%Pe]7\^ED`]N<3)=&#M^jUg-<(1a?u][Ond;E(.I_@;aJgWJJZ*itCQs'fd.T#HS;<("0@)F9`?Z1k<\f#LjX+bW!(GoPt(Tc`HTG -%Jo99kBsNC]g)8_D7/=&NBN;]uQg;sJDlSA>C$5s)`&U*82)_Pmg5`DV_fa-o-h%>EnS&?18qDE6mr)Z'BBZ'MeE9[2f&;%&-CohR -%-BiOQiaca@Ye]J,@VR/pb.SW)%h3Nk`sY`rA`&',#F2b4Z)fDRG2HaGAo+2JGm-*W6M)2\H,lrt:jCKC4@<$aLEN%AhuSYgd5lc7CcLcg-A7em$:`-+ZQ;Q\mXL_un';P!Ot5[sJrEEY@9p^I>mWo_/u -%!ml>"WB,I%Aid)[N!(YFN1@I;%.HkaR7;DD@9JQ\6,KhKB=]c,( -%NE8fac[VoDKmGO\JET]e#+,Zt$GXO)@(8*Rc@i0'CBdM/:^NA;GDIS#U+:_3`^!1b/gK#rhWUDaOAMQ,kEN2Xe(-c9h.EJ/%91I5 -%']:b(pk"H/dR*#ccj?r#BD+%1*RX;KY_04a+CaKTGePKm_c -%'H=>SN8Y`qm,('8noTjI5k!5C/qAX,_8,aS$8CtHK2,ui?sdb_5`g17",JPqDoU?'C#qKC'#2EK&>-U0#NmT@G]mV;ip9r@ql*H\ -%;aXfO`P3PWH,KtIE>ZElo%OSgQ#.3pcs4\D1mG#iO%"&Q=LSVZ4YNk2$SuCJOYuo-D@o^)l]+Z7l6b+p+;+U`SNu+1Etf0,eL[e:f9;k!U=hX<%uq`"e'@aVAWtmO2rg<6i$UGaIO(7R5J`g(2@G&WXB+0lc..G -%jlF_>Y<2ihD9U3HA+_=gKf_U;D&FgHITP%mM-R=CJ$(&D;Ig@KF8F_n[RBsBbVW,V#QIb6FmHe!FQ[c$S4%HW:jF4c!sGFLdD5?4ULP7q&WSK\1q4fRl$6;8hfenE_Q` -%G*GjNOBaliZQ4bT*_"rr!c]S:\[1SV=eP12AbRU"GEg01M!7&.mlcL!*T[,>V#QH1JO`#B#P#Wo:>o'sn3R!A.$St><.'d7I$/5, -%ME2d^+E8ih%q;b5iRj@2 -%lrf;@-sV+b\:'IV4\FlY7_qSHY2)1k*?j5+un%0C$%%-@TEBI*d7OH5npg -%&,_Q6U<.tIo"\OVi45?q0dlD5O_&UpiuGTk8"S%h&bNj[3YRJ_N2-^PdZNd9j?u0#ViG#_,:i)2_0$rK*Ece]%'gQ"m)VeG@'Deu -%h2].X'8Q"s[lZD;*a!e;_V^InprFXA0Fj_bM'jA)RIYU`7NQi>OdU@;-,E.V.eL5$/rV/)k`Ib!1UZk+JU1k-*dOlK*7uKCp;!bX -%@,[[_]16K%!t4mT1&T$CIc)A6E0a;\js(91aHo(GWukHr%ufm#\,/Pq5;L5SeFEh[qN8%3jL.;Bi/aE(1V*M'_gg\4+5-T?-%N=: -%^enIs6&XYe\)`NPP&'?RR'q(iRb`ag,6,Vi`G4VYkF&^OIkj:KJo,M:g%XL@#g->l`TqgVoK0%CWalo[KoUq7U71VP` -%nt9TR4Gi@Q#%h@*pl8@Zq>e'[)td4`W!IH@Y`fc6D"1rI,d.70\SOPb6ePb/]+1>04DI8IkXce[ViE6,#f4\;?)h-AEhW.P'nm03)61=A9)tU/*Gu39YWcK5(4Ls+jig)d -%@;+iue#/k?(B5baSf,u<*O327at"dDe''cceOOZ-bkY.?6-/N/'fEQ6?ac\*3;+u%>;]S_h:.82=(G4$7]%KU./B:B\_Y!JWRtF- -%.U\l@;@_Y#l>NoRUsXgrr;e8-24,5M:;^F4::=,5]ErU`MPk7jaN&WS[:fqE[\-7L^l3r"TIDTMS$k-B@&e2N)T$*eG>od#8t;st -%W"s5:XAud[#f0fjb0F4H<&`sUHgRTQ\-!bG%95P0RFqqp!]NlO]68@43Wua.)3kojTG156A25iC8Sdoq:h91Jj\+jZ0piL5?H1hl -%WrSkHLE$]Tig7uoR+:)s3878SSViFS;F]UL9NCSgX-'[g+',?I#Bhs8HV>_QIoRZ^$Bh']2`WM@Ir7]#O:V3.^KiZ1aI)Tq`MnO899:K`Cu -%QKRqTHHth6Q[Dqef.]!=Qn(qmS0RiVD2t"8q"SP_)IIus]V"=9VheuoS!l]j_CLFo;!7.''"DC:`.;IhoRe-HQSI)X6+Io8ABPGm -%.<#$fq?kSNP9-4E7,"nUEWHpQI8t>k]DF,CdattHM-:XLoZNWQigedp`C7/t('mD4E\W91TYpC:M;oaJ]No,'Hkuc&B')Zo"D45d -%8H9G\2DuA^.IDDLRkE*bcTPRCpW%I(Si]FDTe^tp4FO8)juSa)pB.$lgJWA`EnT`[n$/:-^:9"RH8/_bpM9ol?mNh%Z2]_3%E)>u -%(!tL3`CU[_n%C'bpNl58`FbFIBaP4APm&4H8b`s#-R`-ZmOA4F%1a5EOaq-6'8l=nI&-L>\UtWE,>::*II*%L*]7S,P -%#ROA5ajI(I,cPisQ)tqsnJ(g$q3p9m-%W3g9Xof*e0Gn5#MB*XU"n:qOBmAcM2EAg$Y@pj)mEBB#c*0cVFV])9t:9\.l?,hX_$=Z -%[19&3V6Yn>NuULY_usD8_J/HNnYj;=b9!+ -%/]DC8.Lt1?'MH!tRb'fF)&TOBlWUD`X_%k?CR7Y#F/mSp5!g==I3jm+JbNYUr>G7^"#Ob)p&Jf3b'P%CT]>qC]j,fW)*@oVba,VY -%LsPYJE(\@I9fM^'N?;W(^-3l/776\pmcUi9YT76h)NaEighm&G[#\*"b -%(Vf"C]0t>""&bAcE*.hHTL,q_XeX`'TXgJo

bT6=p=9(^$%Lnd\@Z9i<\6P'MaP!q)?k1c':T<:Y5(lW2'K4mH9(&2q(uV7Qm< -%5l-pHTHW/A#&&R!ksU7&:\?'U!&gnP)>nd*^J[%sO;d3tY7I'JG683K8>dPl!2JYDXh]e6$EN/g()Ll9EHcdmihFiZO'pO,VP&*LVD;c'Eq]%';R$Z[^;G#ZpI7B,%'I`T@YQ/ZTq -%d%rQ!;o@ER@P!'3(ccc0b_9UpMOA!&Vp'SL,%MJATnYqdMR6ILnf8M9O8"q-1;Ja:EPps,.l.R'D0SqI-k-PTk@'J7%O:!@'3>OF -%QR>H^8[R2IbXgs]6EU;Xj^]/E%N7STi[?ArDQs7,@GoXnEgopEZ:%k?:;P-`huP&7`heO\IS)8,[&Crfp8n/2M%Ln@.P!`r\Ps(! -%P5K2,D8\sP].,I5&hKM63JSB2k[maPrk/QGBapP#V9^$b.\T"n<=q%:K"fg,aGif:m@Z/QX=iO"mf\X&uooMl3Ohg-);%<<^YTh';Ugf.qF(_ -%,'QIB!f&cu:%XP6FXIGd'.nZ-e;=\m9I,O+V)rN8ZX_eqJ@.fLflT)!=3_/0_>QN!H7hjAdgm3YH7Y=_)pKU9!3`mXrg7?Z^H+V@ -%XiX$"L^4EN&I%)r?`;o@)V^FXWZZbV* -%BD%qmST8D6,E:ilh@=ar1G-Ze/CNN&jIc]5H#SEFcfH6[$j1f7KgP_nkTQg1,b]#YpIt]R^-*[P&8\b_]3g- -%4fnbiRqYq]R0A)aIiWTAa/mu^#4@ST46H2WF+D;YiBq5IR"`32]Hb$;Tj0mN2Z`feK[[:jXBK'p3.<>S6n"G?kh2upU:Q+E.HFaf -%-f4"p^f#uDR8LB$9Bs&OX[psLCTCD1M^:G/!WL6n`L>j&BBe\p>_3Andk]f?gC(Ds(n#.qUBHAp16BOmjYH]]DL?5Q>o#J->7VCQDi*eooGgbN#)6ZJ5#YW(`fPL'1c_nY -%eG4f\b(DTD6p"QYO!do?$02to*)<#t1dPP),I(9u/]uq\Mqi.;0%='Gc+-G_Prjk)F9B(&`PIg,$8#U7]N]Q4 -%O-#[uYeGF<6lhR9&_0mcJ&,nHk14F#KRS:">`o9G`ueP(<&Cr`F@fp[&3=/ecgqON43)e@h<56b]_X>tIpM7J>SNZU?\)"piRcla -%QA[Odl_/KgpXG@;l+7.>cR/atIPY$(p'rdMlRau1F3A$-m0^,2oEjnAb;A4[ocbj2FRqdE@$$TI?']il$^;*.bW%RId)g&n$^u!; -%[7f,70Pa/;"T3.g)KX;3cWo,$"sf(P1q\3_KT[ie/Nq1t6nhXnYr24:\QeTnT"EeZ<@IDPCSpgP=Yh984>nZI(RPNB1c)2)GtAk$ -%N5Qa*lm\0G.n-%/P@p&X%QrcQLpWn&C!rDT2>uiU]J.&W/L,3;YrRE[tm3D\W6-"P1!KpE*C^ub-1o(YnW+lp!T28AuJ5q`P?oY?nRTn32 -%Q`rJDelaQ11&TOcEjn-73<_H`30k-5@/ts?9,NQRCC+7F@<95jpE.Sqk0Tak -%T*jRP1o9\W6Yr32ZPb%r&HPD*77d*.AKZ?^aUW27gef9Q*2/"L+r,R4f*LF"'E+!ALC]=*j3-Ha4"eLE(@=%5 -%g'MaQqfAa^Z#^3+,D+cXT=rU2pFNHO+S`&ScinMi>+^gbH-Q`oD=Ua7^G^oAV?>FuH2?Q[&h -%-d]^T^-V\X(>5f0:!Kb#`ak00IYW1ITmi4n8DIV56k.he''_KOWUBWlS0/G_!!PV5@U32`"#7RBo"41iRO1B2AJk9`d`!&]gs[2oNkM+W_.)QK8?N?))WtCiQq+]6)*/,pJ6F1M'3L.9=5jOQ)TV-@"QpW -%mW'<#8M7i5jJ7tV13;GMYkjVYs03niX<.;e2#5n*oC:qiWB.UtLX#JC2W!I0rHUL)_#X]=93]0;.A^a]o=/ta&>8J))TR6S,8>o@ -%eKbub)(?9X<7sKZE#oPCo5X^(i-q0WGGk@kjoqDDD5#?kWA2J7e4g9j[]L%2/X'lP!(-^o416:iG"+1>Z/'uAKSg*B#3Z-]GkNCB -%!t?`BG2J:@I4MV*n7g)E%^%.^!LR_BLk0?NU\ba,4N&A_B]UhOH(Sg2:2'>`a,P`K](riMCbfM\YuO/SpiL?Ng(ANk$r7,kc5:(X -%_e\mD1$=LQqi:$mTFQ>JV?\Vlo*PA;,L]^?JC3ganAgd2hTrDPI*DaR#ADfP,n;'#NJgLhE>X/0MV.==SYaH(h&D1^ojBgi3 -%V$_4Q>_Eq[tQG2#k7$"M^?+Q -%"YV[,Y&&cKXM;M&O^AHLZYBcB3auAED)J!5F\,tgG_3A[PX_@Yg0u]\b=$92GQltU\Vt=j!LIn&Hu3k5\U`D`3[@>FbY=^gaH@DWdh/:1?JMqK+Q"2#grR4EKY)$oi:%)ardqM;^H -%i3ON1gkVQf+oHWoeW*2[Xu6^&&IV3)^9f'CW-i:\+$ch3@J0qI?6*l3d!1>1&Zq&T.WP-C%%t\4OSdIDjFVQ'!g#C*sY?`RA3J:L] -%".4Lb#,@_tCHnNI3\%*;\b4Fi83*IX?[)rUj0AE7DJ%An&\G(]"3+M9Sp>nZWGn":oh\'._oKJ=%jp9M3o]g'Bu3EIX!2/m_&BU4!H"6&=p'p<6<6Q-3Q?;&R@\Ph30PO?`6 -%%ln?YB]a7i1"9^BZ+$96J9c4s7ITe/.!4LWA%t7FiAlZCOsf:U@5WYUu-mYsmVAoV!rI-PtD_/J@Vj -%bp\)7s'tM'Qg6]8F3uA^45c1#S/d1LHhWKar35EFQ!O$Y,0/H;?+X&I#['\(5QOI"b1#f#QZ(*)[<`IP-&IiHWcO?*$r6H[H]Q?/ -%^7i3'dK!ECi"LYTLh\sh+02!mRVY&b6"J0r-Y']WKN.8:R)c$Q>]'f]P7T3t;AZX9;9Lc"R^&>K6o.1VE-YEH/V1KIXor+4&\'EA -%WhC%gD/uHU-8_V'Xbb4-7DMKrYtIEslQoeKA[*0'\a"a.[@/Q'-e"'U]a[r1<";+J<3!tPp/GG.bjl'JG+C/d\r+ILb,"Z5k*NCn -%<9RnGMU9k'2Wm[Oq[3@j;Ml5h9qbU]m4HHpOVjn8C4#P[7:F885``rg@BCkp]f4RNm=$@&Y71LCc@XC`fW8IKSh"d/$>Q\Z8rca) -%oP,,qF0ZUOlDgkmSg8ga\aH,E-)BcIICE3*HVZa[b3>N6ll^,`@gdo4V:\A;K-ariD!&C'Cp#J4Wp"3.:olD\1SiIG -%.SC>+?K,MNe)%8,\HE*OE6H$T_UU4aGZ?`<:sDrF<`0$e[e82*CI?dUSZSl\X#uSj:/k;u2L0Qoa,X_2 -%A^2hAO0WjaZ[`oe!;KQYqc+"Rj.n[aN(GKS&1Fi`)oT6gRK7l=\dE@`;2gi%rDJh&WEH&?.Gh*+Ca$#uW(_gK^ls[0@'>.bd:bQ$ -%$3VkJ:e#3VeM+J6cn`'\FfoBoW.Ueh]WkML=t36+-&l?&k$3ZA*_F6/'YBctQ"_kbYeQ;jYiT03l'4lID7(fBbBH682bpMV*:"[. -%Q$YO2`t"6=X/Oc&;+IK!'THX<<^+I#72`QS_>h:ejn$"f!TLZLN)3&cf"20'(Vkf?#u7\`QP-QATH6r$OI_jYcte'ukZksmcBW4! -%/":^jCZ#O)0>'+4G&Is^mbg7;pQ^Wd2b#FjU5nu*]8@R?9)LplZ;O@ZAX$U_AI9K^=HI?p*b9q^(QF)?5=-D.hr(mp@,!'l/LeCIkk@6H_5/n6.4:g*[(D;2D@$NK'pZ"r(Z"A7mF2BL<-7'tUdR2;=52D3aU-9Fa"WO^"NL)q*1EM?.n#4]9#VD>ieXLP8EdQUr\u6^*)]B=fI'0WPs\0e(&#fo;N(2%Bk/,!WFG4<=kt:7DF+%ZHV(1VI/dbHQg70`:\HsOrNeB:+MDc]Dl^\9BJ6T_I@]oZAXK5[Z(sLct.*/38R=(ih[4Et2 -%/@QgO_iSNQX#&<&mcI#cV;D@d;mfGLi;3BMVMu>(foH^mQfYJ.?*E\=tcpL*YB;[L*Ygo4jSP85"tPg<+F^ -%pU7a?9hE=bP&8NMCr,`kn[+(SkN:B6KG;bP%C6drZ9@q#gP1\ -%mT#O4V?p+VE67l$L#4Q_*otOOP,kqjAWujlE/.tO:.:(7893Wt:9[InJ"s8L1XJb##rI6%HVUNX]O'"2FtCO]@'O7s!"Hc[L3`u5 -%pSuh:Mb8g;>X:0J0kJ-]6ke675QbsZ7(^M'k>h1?NIs-%'WU%2)\Ahn,#[*>[lX!#-'ihlngFl,DBo0%e>:g5I7BJ'%"i9&gotG<(kRcTu)GRnp1$q3q;=KR?j%&oJ^6p>5clC1^`0?*\sJMc(VkROuJDV7`ldON\^`%"hlM.CJ$T[M(#Y1b)(t -%H!UTIDiBklFA2A+FU(U"#_Bte>]`Nn679\u9u>EV&icP?81;Ni(u1_Y/Q$5i9Qi3OO@51L:A+g_.FC^4"KHNE`)qC0``1$H%ishXrIq8RgfR9 -%^rmmdhLc)^cIK9OZ)q-a$ar[^C_:@2.-BX?iB+[(B&6SN06c]>YfJirj/\)>"2Q/i.KYZ@D@84&j+h$II]4K:&qPhdRqfb#%r`sV -%gu$IMjA=e'/*Q_LT8H;s@.`bck*L?=^slFB_2>?Gcj-:A&Z^tV/g)rP_'2hJ_XXR9UOAOEZhiE1biL?-JF`24"9VCNCZi(\P-GiG_jSWCl!h/WmhL-:An -%,k#'Hpd;Bp[MD/R_4*bkJS8#lFY;Xiki&7nRhD8E1l29/VcC-?77A.DF"<.*MNTqq-O6[7Gg^qg(_F3<]T>,I#c08qF0%-<%9^>u -%Hs\DZ@+EW^#b01LNg$1oQmh*=*7$iTO8TSd!\9'.p"qI`*FN&S2hs(!d3($`PX44439,8knP]q*?6(5s,h0%M`t5'-ELohnTb_>EHb*UL/aHR3AG>%tF1G\(q$e#07G&MRThHglLf7::_MR*(Q@*ADr^.TE*%!XZG#A%3lleC'6?_706QD>ccD,gRMF: -%VJoVW')oNLTi$]O5LCMtL%jYrpq[mY',Tj80C__,bLROP0<9P,b[9;Ia!\`=FNL'7#+13&->cbI"]Ae:SO+k%nUp?f(SGA\-,bAa -%d7Q5hZg(Pt(,#onN?CD6Wh69?bkm:']6Q.Ng^-hLjZ679[umMn=&q,G?T]AR1dYFn5:+QAAsM60"JSjn1*T[Aclpf+d(g^(.%<]/ -%5/^+2K^#i6@cTPQ'$&2(M+K"W<-J7hM3lW0%tIT@f]/C/,SPsSQG(]l6T/5VY,`Kr#n0/t,@73'1TO(n:JECL?i_pZ+?8Rh%9IS( -%dB)5?1*ge:%&%7[1Td8R(/QNGFu1&O`pQLD?1Qr,Krn$s[UZY0-GljSq@6'?%/PrjaF'G2rW/he]gT7FSO1SP5Hi)=bc+5;MCF!,X3ah#.R]^n*YXE2u4>9-@-:;LGJjJ>qLK<*/X[::hSg6Bn0G;dW:bmJ6<#=qa -%BL^$Ga\N+^OWB`Q"@]qF'W48QALEiJ^oYD1%a-70`t`Hd2+ -%Yua=?7WI+7;mAtO@9OT)g\atXTF3/Y-Kt.+..J.i''V7Xap^Qn"8L+J<+cBcZO[%>!=Q$fMFRB9'rY#2ZC8mk&=Zo%^/cn"!0eh[ -%22RirJSru;K0]l-1]C-bH8N.A\Q.loC('`Ll<&^t,QWNW+W$#hb%f./)Q,g=ag3mZ!k;c8`>L4'@XZ2R"2*fM0JJS1=@B96aBV=H -%MjU:U0L8348@l2U/`]kHPdBG4DW#YO@'$KG=]5E#Z^27t$:Cf!9:W8"+jF`VjL,fU_1M35Un!aFGE-^u:3a41EWh:3"BSTtB=LTu_!.8.IKF/$dp'#EV*fF*?L_$CR.;4JfnkeH -%7(<>Ua<[hV9Fjp"3f5C^mW3g&'VN,:f'<-qE7WojFS-B.I]WAVb_2Z]0fD3"L<;[jC5'^"c5A4m'uUCf6E=f)BP1,H+N;pSM[W7@ -%N/Eq&'K?u]65e"5?7`8jek;edG*ShV'(?3?LLKLdh9aIT2+1:Sa$&55UsK[PB,'e"/JLt!6QM<9-,r/Rbl -%I,eC*dQg9QnRS%e`&t%F@L^OlX&->MXDS2l[fY,"!;hK^^f@o&XC8D`Ak67]0 -%pW99V:/H\6=?7YmLEkeh8`\!UD\q"2APYqL-W'qa?8QBV$sf5+J)u!b6GbI[WN6s -%mOU)0K'&n\0$H1tX/Q%ScR[r^nIU>dZN18nN3JkRGY&5Mhb2n*,Gn6C^!2ToZZk\EdmQP:iT0L:>EUpF+q(W8'F[IMaeU[H*>lac -%H,#_[o?:(R1QC6i"%bMDJe9lmiT`B),7:FZ,/r"$=&mV*1+D^#e-0!1 -%Y:*hDk!J"?)!\I.!9+CERqVo!o%APlUdjSM19(<*)OR'(M%OJPMdZMc$A^2@2K4@P0ZdN^8Zko8I#bnH33^ML'DEqtAI1hJ]0g&aI1kFY]gdCMMFRkP.:$'tX;P#H&?].2 -%dNifKBqV-C+c2E>Gst[B'hT1k'k?]+F7qQKY9ec+7*?Rsm@9=G,n*GrfE.hXK;^,?mHR[knmj`U#o)Ys+3H6A!Ac`#H[*aK=\Ckr -%EbgjMN,_:t,-=2H0$BE!#0K`l$mgMd4".H)qpS??X\Sk#j1MPaCScpak/UiuQcrBrJUQ.?W&-jcRBg#(fjnfW<%H3Qs6?\!X\m:- -%%7*:9$6K""ds;qkr=1je\c09/nu5h+<+SKo.EAA(X[G`-$Jsk*TbjhO1)#+3b\I@L"(eXs!7>k[o[#CA'PcmlNY>Y\$2ME'L!fOT -%2H'`Z@E*YsMXepWML\6uJD2D:E/I=l]oqLsipVN%GBKcL$QtNOWtMDc=3UDs6kM@&.#Sh5GbsDR'2%NN6P9i#hFGNsKs^?+3(%M8 -%]MJfO>)@[O6Z(eDZNtV,?]1Cc.S@rB@ETsth'Xb9h#D%aoR'fJcbnX?9r0Zb[.'&:f$a/MP" -%-"[d0Vq*D0h]*>skSHFt6MJ6BMts)e#m)5qUPNYoF[uT;P(Xo.W1(hU^B" -%GkU9hm`AP$((E4_IENp`>Jsob^VPjSsYS"t` -%4Agd=1>G-`[F,@i0I!Pt9HLgI*/[MSfsELW47Rq@p'^X]k2o+^5Vk.*m'Wo=7k-ef8aJAG[a?Ap>@TR4=LVH8P%h&"]'^!A@JZH# -%Z19iN[-0deB-mr^AHil/!'NfA?lA*464^A-HB[lHYEf).<='b5'Ak<'/q7dNHTn0EDUS_l!`D^uV)TnX1Y%mmK[ZWbZ!=?@a4>Eb -%-SDH5-I.Vm&70$kEgJ9BSuJ1;?0]aY;.4G=I30CT+>fS258!Q!7h[i([21+Fe;bm["e=)jq^_G9]LY-#]4/2eFKOBKC2G[9Yq -%E5=D1j/Jca'I9Hi(0^m9CLQs:2NDN.%Pgr1)ur\i#:T)_e^pYA(hqTqJZj4=E)Be1o0&OZBjcXXHU-H$6M*Dd"Wu0JY>C4^d#nnG -%bfZpob8.%uUMub6[I"*-eWt&QAaA)-)C425l4t -%=%#@cpU,!hE.*@jV7!T:ZhLDMUP5gl4.^M2[=jOd"=5>1H#QfKMK,&9 -%$qNj%e/082/pjF.=LO[;+a1!t..E>%;DCEcS[-,8"thm]K:Y)g8;[INpcl(&tBK7YZ;OH=sUaD:'HQ,7\6;^"nhA&asKir[l -%_E=W0?D2Nh9Q8?jiNp[]GG\[q0V3oTfZag:`uCr[#-"9*&\jYBZdfQm)Yc$.d:V3LnhfX((\=iq\uo`J?-d2'DeVmrVo9Tg-$r>E -%c8NBA?h051huUoDKLT8O0(1dSQQ)W$l3P<-E/.2S]gZBd/2aHJ]ACFG"u,c9Yo=\1iF*eOR#(Q,P:9R%GD"5j"c;E-2P1/&/9cS,e3_iW[HJ>pOCl)AjF(q?7go'(tX)&E3'_a[X1T -%Um2Xk@CjoA0kr"kC*hhRR$om+iu4eBXX/a^'?Pu#B>aAKPuKXF0ek\g-n3)--U44pIR:#JlgPD'$f -%Y@^cSWpthi3&45XQ9sbN?Pd7N_;.4FOXmN-Q<7[m="^_?Br)J<'j%\9f^MG>[]0kfe:?nV!Rq)15>b/C',nRdfnrh'&I^b+i:jebibGVSP\niZ+)9Ms>mn6X8sq/gl4,6c*aQ -%/Hg-j2]'A!"#B%*Etb[ac2RK.PI-YmHDTV0%d>\%FI8IWb[Ol"GMUT(*Tk_/ZY`c!F,)cg_d)*,]\lWsnM&^B,r9g2KmB'M]TO"h -%gkbdVAD/RG*9!3\r$F;4VhH9b;^KJ5Acn?Hq["\jlJs(;0Fkk."lk$)Af_pa"fY?tMBXA]T%&/I?AW`ek[X^[:H7:/c5^#Q[sHK.oGOWI&UGGaT?.,6seW@W_CQC85F$+ -%TU:o*H,0uhC2E6`>,bU\36`Kg-"''qBVhnX#;gk;4Z0%Scub$CLZjWa5aII.kTdV6#h^7&,qbgA50sZ$,dk3Y8)Sc/?j,O46N5Tb -%"'/;+#"]%M#n"R\L1/fR+@Tb3Xtp/]_6uh\8e_EEGHdgKQ66Jk1;V)=jdef!/#81-qSs>Na<@\HOFV?dK0R]Yp9]Z<2@6:<<9I%8$Et^.nh_["d)Fj#65(2 -%E)pKsnEeUI-0XSSHg$Q(F9Q>@!+h5ddO<`$`CVcCUbHQYf0tc'dFF4O`C3[* -%0rru=@gD\HIn1t[c(CHcY>,t>3SW/EE0^^^,3^j3K8H)rk71`CY1]#I`8e?6*,cfY&DrS=(:]X,ITSNHOE;,B2E0Q\.td]l%fA0M -%LD:YYT=ka"WK=mhi`8of;uAo;UNYFoJMPAQkl[4?qck)-PVpr`=&'W+$aP"qr1\X8:A3\6QQAQ)(:,qd4E").\j3[N"?%<)!^h,+ -%"OnuNW[J'iCc_2mc5R[(Ji^9r&B==\[YBRK`$"FS@LUTa"XeXm^,.AJiOk06!U1*t109g3iP@Z.6dd'F@/rEXaQghNW%8(IC/P!C -%r<=p8P<:Moo48\YWucNZC8ZJHM^Y^3TWmSJI5^hILd3[16'eadTt%mS]S!5"o(n-Q(qiu;,$Y5MXa2\&&;7nr#[4Hl/Jnh5N[Gk> -%.:Y&P7&u&p1"\BeSS8/(:+LlKk)(9(*[68q@^0HW5P'J)/`d?4O5b=1,#nGZfA!!0T8B+ -%itrXo6rB!7Q7LV3+c^W"p`+oR=)as&`9@UiFb"!C@U<.*YsU)0&9YUBclJj+#IrY+N:71GG_eI'Tp1=gjtZRT"XcIO<"IC..nK%N -%Wd=pL]n-t@ilVK3oG+b0&D97c^^guVVlSaV!D7,2dDbWT,j?ba2Ec-qE1#SA?HLS5VK33p^/bocp63UQBkJq6C;XSj@G9I.MVKnV -%DO>[XP,($1kSpDuXeZ9+U_N6n*j-b;NY37cWK1h/P/EO,EUMp\Rc]&gk:lRM,u&KK;EDr`>tIs8A[DqG?WYZdLFKXKjP,qfh-j4M -%+T6L1A]8B;gpNMKpMS!K0JsNfgFB^sNRNAskId<)mJ'0hF_&Eu7T&JbH -%)\6;a)hq(tW]LV89^(:^-K-49hT(8c&3p=E&ff'sVsk8rD*,a/X(*fq'!PSW%b3"unr#+1X6XRs1T(tD:ep/)S>itVuk>'5jVL.K-''$66'>kbsA6DS"ZLqWB3dQGA?7FH`Kq;6I]dEZ6c?:`TH!VNjItb9NN -%SAp&I:u:IsP>m+m\/dOAW(HhEJ"o;8Hl++G-JP\t>BL#_aPLY>' -%ikl[0_*-Hs"9'U2U#"mH)R;E+'0oPCOs/ILN@G*0"k7tIJ[I+S$^J?::YKrfib#`M;0hSuOU3hn#K17G\mh70`6k6u=7H_j*).4u -%U`$@PnaLh+^<-Of4BXf;r,`ik*@PC_.)+c\pUr#YWT;?&KmPb&l.lMg2i,".lt6C^:Ej[VEXg6;dKPo;+BD!Y1.3VdKe[TRXD -%c?0A*^'9EOZpNM6:J/WR]?6O!jOY;*E=H$^p9"5*FRgrAILK-#LIpbq7RHuY2tr^NY#P>UR1G%E%N?F3@+a/kYQj/!UVb8;4<5j* -%4QQ,OY^``"3EK,]._JjTpI`G#=+jbZ"/:m$RO3Y,@AG;I;Cn,?)Iu9,^h9W6>,XGc[9;(Ci2U=g\\UhbZp+27";hPNSnkI@e$p%? -%TOcPEH)[',<5YG1.g<)1\Yc-te7&>k[:I#Z$LPj`8F-Z2r2Rt\(qisC>U0lU<-8coAeBW`]P-7+P$qOOUisr='B$Yl+CjCkk&5[U)K).eAl.JlV:i/-n@WE6[#l_OE-=p%XS:55T4WiNB.Ktq,]BJA`_!+Tl -%T2d4r3IY*J:jBUGr!h9SNo5\k(@4_XCnp=Y&b)!JP`VS]&.TGB<-j/-+T[cnLYnNi#_Ft -%6ffPfaU&hs"UR%k6Tkuo-Qfhug'C_8cp//T'uNsl&r?^qB`haKT[Oo91!FflRfHG5Oo\[je^I97A7gPU@Z:k-8=VCYfbb?BXAF," -%=?_Im+=kqb6^j,P8s04#aXZ>fLn%npiipJuE"=nNhR3H1_JkDB2WMs"?.n;Vj"NSV`@dc.DPk%Ze_o=H2stXK&!"Qck_rUjG&I++ -%*N,bL-S&Rjf82tia?cN8]eu73&Z*@+HsrSE@8QQ9=<2IZP30"6k-.&4?7jLdlEP/eChM=la[RoTB6gHtnJ_TE.N6'1UN%XgCGpc@i41/@&`\>bD=jF\8ihK$fGgieUDgN\Xb_3/;h4KGZ3:Am -%a-iAek/_kb(!BB_'t^G_:hIVW$M$oEW!uUcj$JY*7iW?;Zh4D7V]^,>UHAnAbXS6b3qr)lQhJ%=p"AX"L(ggQBh=+H80,JQ^l0Oeu3*VBcqc:n,[Lg4 -%driO%20,H($dtCrBt-A34)'shA4T3G,VE4C3Do+%Zf;sa#Z>'CAW(MX'Xbn>2[p3Q"6h2D`@F$jEL3]:<@=ORV:;f=V.HYt['5G< -%<#60n1aqkeH")"3NB(QNfOoq422"W.RVBpn',E%_?=E_*Yra.'E%+]9[,rFVodIQs%>*;-A#:O,3@l'\9;+u;p(2:I7L.kQfTc%n -%A@$=dnCa=""@\7cC''KO+4lAbX;:GA>'Z4*-ja$-Cr3$j&G9^/7S0LkC8Rj0)dW'P/$NDF6Y*W-nHl'f6O-_=^ce>.n+?28UJIZt -%$0jq`9@_0(\al=%?J`AbCmT9o=+/de2cmS/#=Lm'b+TPrU,=Eq+mIA]6.5`U)'5^+P;bIsUXQl%n;!@Kn2f77HJ\VY&Dg,h;re9/ -%K[l?F;%L"-Qn*OK4`j`?\OQ#adkt5,-ml1@Oh/T13b2N%AS<*i\INml7i\d$51q[^lj?Cf?\AO7=X6=PZcu)%,37LcEW)?7kWt6u -%=$!7$R^8&OK:=T-daD4rQpGij;A;-J\F;e%?Y".p&a\Lk,e'++\m4'A2gn_fBM`TauU=/8LPWbdIfnFPb9o*s%SiFr2'-J -%BLti%:Cdm`ArmbP8]AmWEQUBoHC7S3`h,M-Ci-&?='hB/TJGVs4roimS?DFl%#J;FUbLgi]#0-33tt:B"!b7N+YD.aKp2H58gWJ* -%c/N/[@qQ@p8H:]TGg&k&Z_B/N!K.[O5cELn,WHJk-gE[H9Ok73_6kK7UO(A+_UC#(W^l``LP;r+MIc>9k6ZT+53$s:PVIlHWk4o$ -%Q]i^qVh.-O`p`/f15?iAo`NRiXL(gJ[Z'sL*A9Cf_-:N"[0E.4bH$?@2h8/00FgMi-j&0=77KqSB(kHP[q``5k?NQ=U)Y:"SdBs* -%;T/<01NI,^>VQmu"IUkk8('XZ[GEld.n=?3.UC\\`0RIuV%Y2VkB`,&Fri)<+Lq$AYJ@M8>,7bH3W,-'+]`3O!lpEiHq:43Q.uIK -%:PK\]4WNX;qX7JsMfR"oT+*&e?ncS$,Bn"O/)Lh@]r(r1/e@&-Y#Gsr5p.ot)BbqtNKLI.NLm -%h]ui6ZBZhN1W.`PR#Ob9V"@mBE+=pT>"R7E,_!6@WEh)Hk-CcgM%2Uu*e_]1=b$`&#[OBAO97TKWN6(+P"Ljg2))"D>JM4,q1Tke -%BVG#9PSupl#F6:PTEnssgP!LJjV+I3BWi%(M&8pUciLHI&`oOI);*2m=;g4o.74k)SLcIckIQOeYVcG^"dH]#7`>Q-cP_FW;W:Pf -%J1+ad+&eiu"TJ[/f<2:9<;44MHQYl\c`L.Y*Rl%a9m^NbIP!p9QqP1l8S(_@AYhT68hHB`=#Ko=jIEL%j`\NTe^>[]ZBY>d/Z?JW=L9@S&#_D*%HTK#pE)f)IaG51+3o(?ce1J,u`t,rXEKgc6@ttc`mofm&]9g -%,h*69G#0HGc2d-2,`S<5LslD\$8`C_:AYh#nu.AsKAj,RU1,Y7a+!e]Ac%:L($OhbPg$Ambcj'dEJBTc=l&ks>7]/'qTdA)S6#Ee2hl$5k?"g%NF45W%L10n"4T4Zh4+T0Al@$rpoWdZM`X`i+Kh$fCn;j -%?bcO3mG$7Mr:0-uRu?$:&cVXdYF!jb`'=:rlg(mXMjGeB4]1`6oL=>\s5u&mobi,"Zf[T;pg;,-RgR$jEY.5L$cis&VS7k8e5[sLOIHQFgQ^m=89hiX%s.];KMa7_(qWshp\u."s'K\(EeD?TIYsZ/- -%#mS+?Z'/E/qF+t$?]1a,7QB1fATBjflJKReH"@:*LQ>@RV<<@Y$e1\qKZ/Fp7g7\.@h^*.tZ.2JVUhDms=o2rEAgHd[ -%0\Q].C]^S6$cZ5nRBZTs;o2pG2BWns8)'82QicqeKo4.5\WpP8L"iW-gk.&r>0oVSFE3`o&o5lZRWO"l:(JpQ7$!URQ+h?8a&^$. -%_W$ff+-S$ld<;Rl:::EDa$C6->LuL?'4r(aT.T*3VsgO5[-8d1*L?=Ok@&n',4Bu\:hL-eeC'Q.?I(tcK@oW4-4J=_^%YIo?*\/0?pEJAY#`]#-iglR4f\OZnjOUZ?qW`fEn)Ok4j]1BZmA#O,[XfZ22%43nO:?uHhDB5*N0hj8,F++m -%jj&&bX03CWF>sAIW@9E$e2n9NIhoLsE@YcTS+C/tGn6b%oW+-j\Ai -%E&0(h=i)V@^R(b+Y_cYts5=?5>UiJr7K$R%gX,8>q!]4T-!-dBG&^3#+uhIMKo/7@!O"cjFh?e)d]Sh1;AT,-\%uVD)2Vj[McWB$ -%9S"Qq78%A,*P7)q([%%TJEeS*'K,I9Kqp>9Di:3\BMW:0CBI-1&bt,%`!OJV7LT[P\1*#`KRO4YXl1"["_X-61+%*=6cK`+9!-EIF:KB0MiDg$YAf$ -%kC0st;pSiHF=_^-=$A#c5.fRV=op#de/];m>7PgX#OBCTcUg?g))*rh$0U#I60t=?:c5i`K#8V9:iRuJgd"'Z9m0M82#$_3n"@u[r8/IRpup@C"=+!PelLQ`g1_E -%2T0iF^lrDYUUe.T:sMBb)GFTJO&1GY.Fa'^=LUPJ8arUQRdOE,P=dqoBZ1`#EsNN0?B@K?P7k1DLS<\XUu6pT:[t5/f80>b$Ag00 -%N.*/fXb+beg/i&e1XYEiQ%EcqDCB.pGu`PqgiFkNJ$7r8=LXRaS$ -%DI>Y83-<)XL8RG_>EBE*=qk?L/e@'[>F;Nk(-AWM/L1,?]%'NNC^p"KkV9p[12(WO"K:`$9IFeP8Kb;#2f^LoWkVL`<_F*c=K))- -%(ZHD34i`(TSFDgWV0^X^P+ie[`,(o^L+E&[KZ)I0&Xk9(=;+:EclUX)NH5KRL9Zk%H#;Zkb-p'4LkrFm`'s,WLdkO(TBi2L%B+T5 -%Ket$U_n"%n?< -%m+WYQ$$s3S"IQ&E+>QFG!3L=jHM#KTJ$;@TXj.Fu@kuD]`a@q6:%k8]eJ/gjc&F>&X'&/a"9s*e,nXklM;KAd+(;K/oImdbnXdr. -%74m(L&Sf@673WcIIWN1C%RgPpm"XL>j6]nrf=qX'&?3lTn]@5F0RM:X<#/g9Z`L -%W)6RACfSB@ff;?,eRC=&iTr9,`dli46'Q@``ENF%_G3RP%Ohc7hpm\kg'6&g]rkX,lnGm/D.on^_dJ?JTas3@`<0:[/JiPjWamK7 -%&1@p,No,+Xh8N^;p/`_E:a/]K^(JKB)]gp'4)R!kG[Ya%U^b8-NL<# -%DWWfD3jJFfR0uX%F`9@*q3aedf2K-@W8snlQ5$1To_-_I3]qFE5.*>Z=6u\c\ -%akR/Y0B\7l[Nsd'nK"I!njtfn=Z?R5hGf]]_'OoK*+$HWErTm?RSVkBjg`@*HBkcmPP^nM(`nG[cS59klM2Z6Xq7gAnZmG8P[k`U -%C/B.c.<3-r46B8b,p0DQ%8[/Kiamf17K`VRJuPKc!m_,e(mBhRn]i$YdOH/c`>9eZk#;^U=D1A?7XjUDS$S&9iGO:>/^e??W-%_7 -%1\-?fI57ppllY`4S*;XN)hNaLG>Rfuo[c2$L63dgIYY:[DUNV]fP-Op$%h9KOKb2(D1t,b)LT%V7+_PTE`X7C`0n?%N!7NNV2[\K -%keO9<=9UT1OIBd18Mn6N/*R&i\sUu^:+p+DF(2II'1s-2MdjsXIOf9;$>aCNa)`#gdN?qT;5&hd]`d\f=edma!H2He)f"ngFe$X9 -%JPM=[.)]SS8qj:o3=LjEiR+[21XY:3D'`Ygg4tFj#*5gae.L/YL*(:_bT$b8:O+67#VCJ:!?T52"eFb(Nfg6'YP:bNoJ_@iKA-n(UC+.\T`s#$#U3<;^7T?EodR#F`gc%L*&Keu!C[)rG-M>k`$PWpffnh -%(0qd>^W.6^]/o^cN"r/sW6e1k%l\g0:A*aa,2a,rc\"OZKsno0Du;a7(_lY+gn64O:6REcB![8(n!8V=<'eg\,dMZkdQ,0D.B`;0`QgU%\X9D,gW&#lo%07Wl\:%#))NV8>E<,XR<.39gTB_@"hXkf)^:VJmY0:pqMo-d4o4)Gpi6+_`q<[Y\E("^3CfEh!kclMjk'hPWr! -%0`e]64;;*741)%NEsil5.a"@9T0UUOESs==eH+/'JJ(-8,,4@9+MN0.Q1^g\I7'?8(Db$ML_Hi_1]>"->%_ASXt=0eN:qP&CWN>/$(4@]4O>\j,7V(SO"6,"HOSJ]braK9u"/2QaY?>`,Amh:AW9bP% -%-/pGM1,KXZc^0UsZ+5"Uq"p?W&HY=KTR?*?k=(udp00QhU,,c6"n5W-0Lk+);/'d'7Bj6h)R+TVIQb)iV.0W7-<,3?1is2lMg/[! -%CH8.\?5WHrYeQs"Eja>GBndlC#ce9O:8EF5c":Dn'&euUXrAu+_?5!D4'AB4YQ.XBn6=V+$NjL,I\_UOirK[2b_pu].sB?W[R7Vk -%A.r$iYS[II`DiSdILDT=Ul8mK5j%_^$?[LUk%4ubeN2(L#,og@-,'fr_@H>'g&]2N[A?k=Zfnd%%'"hSAS'VQEu$-cYZD4Z.eb"_ -%=>[?&_^\PP7TR@J(K(dlA.O;p.'Y?$,;!]IAg6\2,W$W-+0-9Z;522d<"(>"Cqk!#%a[t>FA9V3+d0IiTQPf(Ke"IXjeG^B"/;E> -%UXU]"@pQl^E#VUoC6&IKqSR`l&W.sn,o.g6BO-@HgYrUd,Z:>S>?[\u^n7:$HJ.,E.RAWYT.fiW2AJN3(j4 -%%bOTSN1i\hV8MjT!,iPAZ@VgTcbr&/dob/>6WL1^+`8#J'Cs#g_*ZN+=.j-eH),?dZqA]hKOe+0F;)/;,GG_F[gpD*Dke,KSQ,1r -%S+T6m(P[c3P&(a6TW0qbeun.F$cYE9FIcgho'X1hna%l?!6#=n -%D#hVN6j=p,XnCn?D7e9"%YlL9TtiGk$tW2&K2TiWO;AIt!fUe%=0%2Lq[DJaSTaZ2M7D=AA):$AMoiate@K?H-.+J#0X$n=L%Nb" -%]Uf^K?(k5/[Wl^iN-'17pb?)AJ/#mSK-URDf[=fBR_QY -%hb8_K:@o*kBn0lfnEL#\I!Q#0J\5`*8W4s0?k,XPH-J`:#<"hR>+>c0UI9ma!,VOK>_,l%eFk/(F^dR2kS>!7i0/65jQEL8"2GS+\)m^<7uAg<%A+/ROcd,GgXl#,Ege_$Nge:7af -%gNqPgYZ7t>m+!dY>3aUHDDa+C$/HB?!d^,Hl:1+m6ZnRE.Bk`[/JXW%#aX+qME;DTZg^-$hp[:7;p+p#,-7*K#%p0j!"$+mSY`V_ -%T:U846@,qEjCs1TJJaFp>D!2cKW&f_NJs7,YZS*%AS[,a-X-MG0juidTSHJ%.:^,"A="K.8*ik`^=6hL0ML,9(R3AC_0ac/7i!m.gq[P'APjCe9E1[LbP=;BU$\paceJip5Fc!oYd.DV-V"P/*YX!-PEo;fVB("0V1goi_g.&Fdc9>pU??N)"\c1p>?VoH.DH5d -%T*$:>N2W(S%H_o*YPr'[J/i%Jg?6;fVs#4h$P9T)'L\N/)'s/cEZ -%VInt1l1g-K7WIage\=:/)]HD*T3Lm+mMs_P3HS?m;=`bq,KO1PhsPDS?sH@)p*m@sQ>Ci_gBDJSQKU:`Vm=ol-+I#@&]WY*HJ -%Ak1H\rB\95Br6@caFL!`VECk1/?2uq4Y>T:=g&KI[T##Y66P5Dg$qj_'hE-f/6C2\bA0!IC^d+/f,7si`:`@XfFum&k[,#P+Zttd1P_1)l6PUs?^^'e#p[EX;DN@8^hiCR3W.JZOeaph(5EqO(\M_*!M_"#.imY;j12^]H;&Ajo)tfPY -%3d@8+gd$2@A6C;fXWsrlFuef,+i7T=8C$FBk!leqHHc_,MP4E\^ck%'T0YZ`*l7,hK7:rl,VTI -%E&2iK2UI;D+Z!1t@fl:P9c4=JG(f*>G2u#QOD@'Y-CTS1\s8% -%X(VIqk'l[(N.09,f84>\h5:b>_5=kg/"8JM'>4PopZ/W9G@#^bJ3@E6I5r/6f5QgGk'3rr3-#m$4PZ.k3L5Kt,Lj(EJ#U$;KU7/i -%;_iig0HaqR5q -%(g/D&C>h]8Q;Ek_)"fX/Tp&`i,1O1p/Kl.B.&Eb^/"%Ke(q2kqXN=Bna9Oe)Vd"gNh6gRo1m"Qp!<&(,'?Zj.Rg^T4AIVnaA0\jr -%:a2dc^P>6Ukc^Lo!C2iAZp$&^LigWNGoq`p72f9?V$L1Y^b',kWYT3Z^mOlRPT*0n(_T2iD%A3,>TP4[XKZWX@ee -%G#>maY:JDL*d%"Z"O7uZeWukYf+#f9qPAdEB9sAcCboQu%lb%M19.0(_sM_"p=8.4X-K -%Mopm_V%L\!TP&-PbpjoiIOYHTbRPFG&<34'e=J-pVI8@ -%8@t2&#,Apl)eV*s5,g(i/JURI[`Bg(MsG=ol;EB3e\@a*e7L>\/oKf@6Zrp(%k0c/!#e8\mfir_1TKZ5[t=dR]M`0H`"#\QQXYE< -%N@L(/Z_o5uX_$T1W>PjMQks@fAcZ[]^`-A(>cYOB9>d,=RMls&YS#NM(hcs$K>17IquiD1)S9]dn$E[_mncJW/XR[%S[dd99Mm_PM"JI<7@OmLbWQbp]eE0V.%q$(cD+1[N1S=oke^.Zjf@XeXSOgP_#)OD=/9AD9tp0K--;XO(i8e92uK7 -%L*Xf($_C.Kf")IUoijLlc"JMg5[-[EZ9>)ba -%U"B!(3(0j9q[I!s"cC0O\7IcW!#/;H2<@0Kk/jS9WX#sY5C&gDQZ?_+G9tbuJr%9%-]@*?t@%oSen"soH -%q^pMOA-o*Uha`Sjc7JMP;8E-h*,jJ'G83S8=_.R?8`JpYl\]a+8;)4r.!QcpJsH7`aDVC`+b(Fn%]$hp99*T]WE5PBJpC;'_.6.6 -%qmXarmIZ`O:E8Oei7^J!31C,s)("@KL)e)^+\33^KZFNP`dYs7m-nhPrbIKb4-T0Whqq]=nb2PMc/nV*:JXF' -%"P_+Lq!@b4d_C#Ss7F:&s5g_VYBi!srR1]:jI\X5j^3K2iqGAb0D^1tr+d)I_oXRHGgkFBlcIKQIeE!;s4]"$0B29rLQc(m2ZD=C -%S\9?ms6NO1q6/Cgmf)79n%[t6qrP#!DpQ/TrR$Nf]tOC0mAl02o8B7!Va$gRrVW/.="eJFY5-t)F*[cIo&ff8G.2tL_E7Yfo/HE' -%_"nmsYWa['lFZ*MnuK6r?&,[`Ah`g?GCp]jrku&`Yd([];,/dm.J>9D_M+eD4g1`mi)[tY&7`'45IV4VX(]mIlMq!p,DjE -%h#e#=(sTA(GDGbcc/kGdDuOkSlMe%nhgE6^Ddu=^3rY%]IJSkmg["[[e[IK@0AgU:o")KJD]-:!H$amenLq@ahgTWl^5]P1]\_IF -%Qe-"7ItJORGP5qSDn`op4aV6khp]0N>X.`ik5O4Y'HXq2n%Z2Y[Z)`g];>Q,U%J9O]062^o&Z@KCY!h#h,aBUh7Yn)D_<[BqTZ_- -%bB=)@rpJQO0CKjrYQ"47>H)GEB* -%_=[Ef=]Z_QrVksMp!I=(QH?LrMrt>NR*ml^F0qVr25C]s%DW/LIcj2Y,?>/Z&t\9`K/,p@[apZg1u5HM^Y= -%pnKMb?6+,>D)A1S*DZT)Rp0cA1d\rVufb#5c:Z -%Y1NXMro*7uB?+*>#LMMFIs#ZLig&AlVrp"BDJoL=]5Q96P!?KPa5,Vje(`W\cd"2X3'Y$)BH'6$heb`/p4.."CKPYe59@<5-ZgeUC(O0u9Pi'KnEC'(5.X,[lLN1AcRr:;i=G!KIk4I;NSR?*51aGVQZ'UK\p1QH`E8`# -%j`pc?c+u,)iO1H@lKD!pfCYf^FkuM/4anM7+*D\'lh;IZX`Q]gnh'ap`U.#^MK`n+X7UmZnHHW+h:\6LrUR3*NXpO:\#$c#@.k-0 -%N?86HEuMK=Ed32:G;FYs,"s>#V>l=dA2Z6""(3n!^A-I%X"V1IH[55=[aGOI4?UaSDJm5fk2t4=?gkUQ2Ja1J`4,:L6V/>69>8&d -%FgdRF_jVTkrsc<"A_=oXh4D!T[$,>2M?Mn>!`\tCmL^`'gDDs?D -%qZlkEr8[$B:k[^jo"6#"M78^@r7+iNrZ<>FGU$_oJb"UUJu8D>o8"LahJMB%GfkZJOV;c=%rV-hps%pdDdT'+?X-lA^\Q^=[p+5? -%*dHSF7;4]#hgWqas*c*3B"%_'#35etG9]1^?Wm@,q);sK;G`nf1Oh'A!/@YfVg'd?XBirhV[W& -%q=WjM=8.&L/h[-9,JFuYn(kCZO+,D<^'C6WJ+in<4J\P9n*Jf`S#[&&XsmYig\j&i+,Jg.3kF>c^A")kH!\*cIql1VgHE6VX)dC< -%]=A^kq=@[Sf,&'=6%7+-hDsKVkARQ\^*@a1E-tr0jITQKH"Sre?XCIWr7enp\\2AmbXR=sS_hgihjiNZO$nEm-HtpRcaGilH?:"MU_WCu-PAp4k`uRgEAL@e7;_eq1g0$9p*$i;neM>N(9^8e$W:FT%'/@X]h+s/GUI -%4hnOQp$3'/P^#TDk5oo;FkoYG^FR['f46,o]J';,1%Fsm6<54AO-s520"5FcP"E&6eMaXfic^]/.n3jqFBoDg'T^D14:".4%6InO$+gDIqm -%$0U`qG%AHM1?"24?q`P(fAbPCZT#Y0s5(?"IX1JVjn3rmo:LD!XQ,oqV#RL?e=cbr9@c7V@q[[AE#?<=,IYr"q#9G8=5VlI?GE$p -%J2;V6+oLkaRN[m,b!,2#OVi>jjE@n`_+]NFYpM3>HIRGLQX@HrJ2.PL'!VmH'gUXtJRIjf2LBEW4Qn87FKA -%[P7dIkYBa]:@72Tme=<,L?-ujDC9RKVsF'uj/mDd4Ru3.-DNaN)0L;0kVa+I*Y\tYj5o/O?N'EEg%SikAM-4H7&BjuX[b6\id>s5 -%2tFO2qL"6(rd]4MV\?>rbtKk8i'-&F`]cj@pGAqQ">,Z,3f[([+*fid.-8Q*9)56aa>$;tNHI3M.C[\$:HV8FS'/"MIf'!$"jr8# -%@2quaS!m-m"T&,WeZ52.56's9`PqN5rFB5^hVYEX^YXA;\'(7B(N2LP]m0AKc0a3WWe9fYZ]/;UG!A,;innS]lX0hZ=O?PN+<:oe -%UOdMDOPYnHoUF%bu?N=o?Vpd[OYbs -%n@3:G9RH^ZO6aWRUlF.Qqu&^srR*:GD%,_QhoeNO[JSA,c'oZn-_I\k9Z_eAL\oW`Rm3KMY.cV4aN<9a;8j3op9k$Ga&N!(jKh&o -%'n7Iu\>Q.^De7LlOG^fC"Ie'c.U:0muBN(5MhcNN4Pc)FL6[\G0kC>?6AR-c"T#,VB+0pdIjEi6!NUMd1/4k5t="MdnB0Om%A]DhG^%r -%[Z(UK]6j"[HFMAt^[Lmp]??NO8/=j9,Q66^hAsKm(D"TEr4.km)$Kg5M^NiQ2A2T@H3-"g$2E!(gTTJJ]!u'@Va&V3%/8f5kuJio -%61WRZl\jZW?MsQP^(8edeh&Va9Sfqmq'#%Hp@Ns-?JcdOp"QN3o\K,Jqn\t1@9$G'GW14rq<%UE5@)"7Ik]J5?gu+j(t+t8 -%5;mP%^6SKjIU^g?Y(NhrGOZM4_Z.74m(`kmRB=^1Omlcu6[1R>.XU@ -%eF\aY.6`24rR9.0[r^JgqVk#K0A_1gs(iWQn9DUbFk?WWX&irss7Q2ELi0pi42617rBG/=0rr4fGW^GIjt"-A -%,P)U.k#U*o,P,M2mN-i%C]Vj@['^q_s8S).-$u>N0Rn*r`CEgLHRi5)a1C"hDT""#T'L94Wo2g5Bj,Fi#mP_P,Dq4oj@m7fB"6.[ -%K1fuu@mk[W*[,PFTI6$:&Zd#**=($dOgCE$L:W*p](//Wk@.u!dRC0;XHP(Gjgc[Yugk5+'<>09>& -%N;\3da7Y!t?i/YCC+LH\p\LYqRl<9f,6i@E?L(DQE,Ve9qT"R']Dl\cbKG%0#/?^ll;+>_^Ce0K.Fm@c1@&q`lh;IZX`XNHe_lL, -%fgai(D2mOHce&F:mGh-RR@EFI:YAd[re.1c/$JFUT!GJ?rNT/OYmAqp16]2*M0mD1J%4gK`TR9jLsRBtmmp9\-%_;,=(;nIoqQ1m -%4uRHk-+j;L'BCu(EJ>75+n\@LQ.c":H]iT)p/'c\N^,pF6L2*Yf'ra*QJXt0V#T]Qm/$D,mt#*>[r8Irs)!\Wo-'^&2eQK7jjb80R^d]oIZSn$S8?-=I&G;OUK-S@ -%l!KH4l$`#rBD'36Ch+drmA4/3pX4EG9E%;kQ@;5%n1X`srpAh77TT8Y1AF$rmt!Hc5Q'oU]n:;iP1R\d>!>sT_%BK<"]oStH<\j_83B%N0qOKN5AR55ObK/8$fa&3 -%@O>N1k,4SASnkZ]b)sX<=e4i"6GiN!(29Fc\$pMN+8fu(eg3o%FYO+!Z'oHlI^S7*r`JcG^T>b%%?Z-Vl@7qDBqY)IW;LAu5Y,#r -%/L>[Z1mT+P(nR#Rb/q2;2W`N)c-u;9pQ9H.q\QrT,jZO"26bFlb>VeWI9(B\IVGH.JnloTI8t%5#$`[Br0WB8-N!_IYGm*(s3/*J -%Zfk'?e6`?99[^G@&$B@1`T/iM[J)6\JDMh#7.eOP>RI*3R;fD]^ -%r,&'9""o*YP)TJ -%b7Lq@I$!`>V;`&%>_lD4gqGHHhI$mY7fs4Li3KZn+to?WI?iq!En'NSOQQgO%:3)@c]?:E?\jlOr`CXV(8Bp))7/alP%E\IBh/OT -%F0T+jHq[7pdmVB+XprlEKsG^qTuE(h'Tu.-haHR:3F=?(l_4j\D%l"n/\ZAR9&IiSXnH$d*T-*ImG#$00>3okO`0LR:4@,uG?.D( -%ZA*#69gNr:ErDg);V'LTo2R-#Y:C7:B>12d/!312@C(kDaBce9;6sP[I2BH<)lgB9VPl`1>[LiEM4.tJH;Znu^KPUU]$T']Zj0NP -%p!/S^l#EPs]:7D8o?0/_\IB#UC=a!`5A9N?^A'b#f>K#]Rhj#T1jAX&=oW95$(/u`UX1A[+s+7CF(:qV/YC.M$ -%Y<$I<<"1lmI;eEcom_J-df)k%.`'r3b/@r=(HF3*EDEZuhQL+hDNU*OSitt<.>N&(dIB5lVbKr^QggWZ-9IULjBMUgV^jV"rSFS; -%n\"K?8CPL%kVn7qIF4bN7ZVZF<0rQ;HIs,iXW?P.ot3sc2!07Ec;0YU#-ncL^&!b)oErs\@a8,; -%NZ?L&O+o02=4:C,W7?@$.qtljX/EhtK^Pp5[MJP@o&E+IcnUfp`I#0,EpnpU)IC;[_T'Y]efWEX<;?e\g*3jL8lb.<7OG`S,l1W) -%U>f9K[rugm?d^Bep-DWmYFiI;H@\"ieM#d-^3`PT_Sf&[(Y2/10:L0U\%2mlnQZeNmsa$[O2AA5-H/tkOG0dnXo2h\MfL8lWF$`p -%\k4'@j0b_e$eko.J!T:uA'RN?488WG\175VN0A.^9M\G_bopc8EdpJfGLB?/T'&2ag5;'A2e8O>Cp'Mt]i4%("RJiDnP*r@hGMk% -%pfaLum5^a[-Q6AWaeA5=jKuE_?(Wg]s1tQ>Efc71m+[&mk-ahG?stbD+NP!D(*5V;Q"P+tKo7:Ri\W^boe8gTW8pP%QERiu^WWJ2^%,BUVhhSWI:R2Gf!,1/r&on7U>f/)-7<4\ -%PBg8PHlrfNFjD[5?;F)VG=\\/V5b(??(G+FJ1a7CnTgiF^5B5TkTKHbpUdp'HW<#9$Gh.eG:%Sg05X7cj1@q<-\XL6(PPX'TGJd8 -%Zej"GT?k@q-!Kco>:X>R^8b2V]U7'RQ%O-9piZ=>'6a>,H^$FI<'aP-:@[GQg<2aV[ZO1dXjZt1#e\0t^g\B/\] -%(i!$hg#[fIWj.VKKV=l8=Ak-5$6D!T<$[K`5M,^Xf6Ws47a^6,/(H[ -%[(aQZ4l44kH;*B)jqC?FTfdl'qaksDQFW+SgaDH6[J<5Gm3c0m(9;Jl^.A,!+E%n);f^7@a`#UKGZdGRKm6s,9dk<@$ZiTX9''9C -%[V)%:p@cf'546%uk46&@I?$6q251F)0@UiEW(sj.$;s>S_"P#\tBB\bR@SF9d+Mt:!\SF@KLbI -%)HFKLk[_BK73Tfms(?N'SZ=]DGeUfd\BW)jnD3_BjC%&d"]';62\2s(_\:lKni!GAM)9.kCI>G-j!)/sB&/2`I\3ZuRhIF.i1"KW -%Ung(RA7/8OfR>,-2sH;+FYj8);7Yfjg1@P4&GNYagPt$jlGl?3I=A\_f^'@AB;(qI?CV.r+87^OqkUuMH6L[hP+BC.";98T*3Hr]!sq6>dp-"2^=o -%Du7\'fs05CqRqIB/"Rh<4eJdA/'-2`:PBW>Np[kC7HEKKigY""aGW+9(YO!Q?2R"bU5S=cLd0)1b!\,^]GH!Fhbcn(4==IJ.E_k" -%p;og#!_n)YW\p0fG=n!l+Ps-t^eWnS?J(VpKVph(EOu$aNO%HK_uu07-Rl^HM3n$"3qm# -%374m2$YRABFY`fq.B"Ok]EE;tii$Z#G$u&,@Nnl_(@PKDkF+4];,g3-`D&q=m;8hV#`C`)4I`IoFYGA4P+o53MT+g]hj"P,Y!^efA(EAR:k8"-%Iqg5l8'N$M<_=d:G+u^QITls:lN"?W\k^:Y2o2j^+GQ_k`HmR>eW4I(`bpC-M5aoCEBWWt84/Z0!'Sl(PtJ>o]j0p"2E3NYlCW;3a?*^2V'D[%LZoQD -%KcaT8+@PH[Q,Sslm!5A.OndJp4mKdDl-=$$X6m'L2@34%%+%;a9fBi;`(Egn[[Sn%?F&W=n23mAD*'@%nhWfh'ceclbu(!'I5@e" -%B@(p$Y9qhri8\cs#g$@*:6rWGqn%sN9.sp0;ET[K%Z2NqWd1bZ.bCV3`R-P2_Yu<'eo"ZAmtl^G!9WC2U,G9r**'((6kU7D1dmC? -%Yi!1K5Y<)!Aq(??Ug$sOs$!($;QG*r]U5sG43RVa@M[,T#:RLNm+9u=OYV\h)bUmAkbB.MMV>Uk(mpC=9sdZ"ik&!GF?l``)DBZD%hI*4b2Z$-B.uE]*ka -%/bT_7Okb0As2X-b\X?i4\+sgYYjD>HF7%H2jkDj`ZH5jBD;&6` -%fKl:h"50)Zn8t$<2_bBfM4sf3W1CZ%YEo$Z@3?U%o"#D -%duu*g!pX2u*!"NqD7:&-KD;Er4W30DO?I=;&C@#UE!U:+B'5#d^%l%H^jGV_LVWY[KnBAQ@fIJPi=da>+:t/%E<(qnB&We5+-+g6 -%TmUh%4;l@u]ljCG:RX6KcmMO-!9o[O%Kc=V>Our=+(jL4@%X"G&\&@HHoenNYK5/nIcaRS3lDQ#SHD-+n>[N0o95RhSDSGZo7&aq -%bQ%#1ooCW-5Gs`j6m$Vn:41K.Y@!m6roWS%Mj#YrVuo@s4@8eJ*[,Zp?'W=mI_RX^3OjHIIZ']gFp:S4o>6J=QegW3,UF>F(]u64I.t.YjAqmgL0fg=4-kfJC>DlJ -%T_ieG@QXZfnFCK`7cAOP23Qg!"O9_BSBE`>p;Frk`XV"ZjMZ46!K0)N\]F9\'1m+VNk0Lg%\-=CDsC]88UKKp@9-?-#j*;g-l8l7a/hPAu'a+E:jT#CS,V6t8l@Dr<8/0^,Yn -%AIu.D%*1MdUP"nZ;A5]0Z<;n7KJP2VOX8BZ-Manj-s%HBRkl84Wf0X2bsm;n?n,;QG0;BNZhoj'PKkAo,_ka*nbIXR,QVW&R -%?!%ST7ufdiqc8?^hIQa=pror6Rp#^dXur.GZ$O^XZ?A[+I/Ylm>E_gIOslT:ig5 -%hNXC)GD4#F71UYU_V:hh?aDZUW\p4JUr?Qhder:E2MkOoE,%r`c`N*NtP_YjbU\CE]l6VBhg\Jc^o6-HD[bmqQ,agM&VfnE[%]B9+2df"h%,Z%(`%!jcrK[9,;Gu=0[r0 -%7!bS\1Dq#iAI.u)FW0k<*#J2C#8O9O'A2r:MUtfD7NgT&oF)AKXCRI3K@RW6\C2h`V+\9pK3=BOc7I&h]9dOD)o(9a3,];4e!X_:rYbOs4md&IktT+O2lf -%m*KkIN@Um^"lRMt/]^OOGIW3%)"p!\_j(6@*I:o\7*8f_0LjBU,.=)^QXN@m[tsn,#qQ -%a\;0-4:.Oj_Y4Q;n)WW+`!Ns]EgCoM35>sG]]Wp]SMt\eN*a5e$1WjF0p.G5]IF5bRq[RM;0'c58:rM3&UJN -%1S+=MoRSFSjSe$!:BdZ3"ss'GC@U4\mOrO!l?$Q,YiqC!%VZ_-esLP`KbOcK8j[#&1Q`oE)ZQ[5m0\He/chZ8.1.72f`FpE7eW4] -%lbMJ\U#Iq=59^%rN*hTK)r2^1l);F7f#1,srZ>WgXt*/N.uA^@rkjjOYRY+`jE8kurA8(E%5 -%5^,m,LiE:j[HT6<@Bn;p:M\b1,92`lrMI2=h]ai@bJPO$F2BtWocT2.7r1'nT:qVhk\>`'NX\?`s*jc,@Ri7\#hYiV>$D41$[B2e -%+>"MS^7YE+lWM`@jm -%GH]nD'sfo@OnX16A#Vst6:?.1j*mDa;A%)[?hB:M,+[gQ91&fM)!er?kr1 -%::&aRJef?:1.lXScL,iYRodOXLT/h>-.Xf9:g2(^d4a>*6$LSBEgo5EYn9C2F&E&+&Q'Ft*^k%:3s6@N2'N5+h!PG`hBI`?!nR68 -%(,-p_?b01Sa8)jT"&cnh4Et":"O`^9+sZ["Bntr+?Z.8qRV?L,J3St@5p">\ouRB=B7qP?EGS(4dL3_NYW!SE!1Ns8HY29os0D9: -%$UHI0aUBDhe&]HIlGf=!mEcb9u0bgZ4_MYHj4<<@e]0+Wbe!YSbU?;Mc0c.=n%Dd2.??16]FXoKE6aQ3UeFt/!U -%7DOA':V?%N!L1$a!.DhbJt1-YUa:%\B4::R"`g"iJ]G2?Qkj)>&JCl>`96m'"\K:4FIN]Bfuk:P-9\RRH9VY6Q8H1G>JC..b41qS -%\%n\i^:lOJ8f`8/ajJ/%NU6!4$Xo#Yo+KuND+s?drlq=uc0*E??Uo>GE&XB+DL:_X9oQuQi9.ts%o=inUeYYGqY#/. -%h>l,Z6VY$gh<4/\&-4tDlb12RJ&fFhrA;BZ%*m30"l6rl+'cjkl)@nq.QPKiR"').A7[n/!O^i$\&L*">NI.q5oKkSp\8s#?c&Ae -%K^KVpG)MRCqpF0XC]+:dO4!Y5bpO@rPO_Xc9-hR*jDB*qf9N2M5X2CG@N5OG5Pf$FnhM`ti$da7Ekk^*_$7nZbWt'O -%rdJr$9-j-%*l*9!"rK/;^GLg*Hcn?Pb#)ukTKA,,]Lfe%2f2&OqK9L[Ql3Q8h+I!_R8qICGi)nB07-L3ICuH$K91YP_AgJaigWX[ -%-W+aJn;Jb\kn_*DiUjQ\A0&T=&EG?hD#7)p`ua:l36B;5p'/RB^\rPeX;MdWSU<]7l5j%,IV/'pVeCk;oq6/B\_eNe"ShrBQ7&5) -%ZEhZs,P0M\W'sjU;jDdn!noYqt(!cf440"Zn3uP -%[_O-)g7Q9i4sDPeG:`]5AHbftHg!'Bre"0&(/pOnIG>d=,=@?;!\%.51f`sZO1pW_IoHG+6.(kEUYs`G)7P5K_bMkZ9&6N4N4(TU -%Nm(r^E/pSq"YK(R>K;A:g;4l_=5t4m)dSA;'m5VuPI*a*niZAVpk[Jk$D6%YT;]&^=@P@G2XX:OPNFdi>B]r"N;26]*ZG,df0NJ! -%:T2ILW&WefUtE"5b+LYTj)CR+(5H:J$m9u3[RM=JJCU514hs?*@"`fo8oWVqrk6YN&8a"Js-iIq%T'Q(g6Q%q+>bcqJBn;p#N43n -%fqV9=$sp$Db=#j,Jb-UNV-B!0\)7pf[gfuO$s/"$Q*$/L>@s$]F`=oFK!->f74JJfi?f)),":N>E9KU(dK;\7JV.koAk,T7gB!W= -%l;OtID+(X=\BLW7;=4^9&,pljbFtm;["Ig#>Dor!/5^D%GlMBjcTaX5MMZfs)=1`G%NT'gsn$KkG(-,S2d4)-s`bZl#!4."V -%PF(#pmD]oaoWGEXL=PTtDLcYYc'2gf((n^$>G*>ZT>?H7"uL,XC\nG`XX.$(AC!LZ"gG4B.LMrC3E*dP#,C(3\KN]!^.*?71F.:X -%6U:/<7L"p/adPNQred>oTOTeQ..3.3EG)FW+)0XbRk);%'YDbB@c2FMgM[Zl&E(-;],5dbNtHR4j[Zq$J3j!o/RMUe/C0S4R?TPdkq&+J0s*2$r;r!^.p&-D#JptnU)n>f'%cV7"IoC+ab^9r;2u?PU<$9L0).j8cd[VEbL`fTsPRReX):El[_tkd+kc)(WHD -%8\&MaL)8tEccDJ4$U!FNRg&e!6Er]3pfBEIX8/>ON]$iaN%!LFc2*JQULAH))narVG+o)$:d4b(R/\&[,iE)0LR4P##Vq^hVF0"X -%kpUd?7ehYW90i"h.(EeJhqti4,6fa8@m:['!'3$(bgEj:*I\mr8dMprW\"BR>9pk^?XsI%f\c0V>iBhT[KV94BE\9qTt:A$%#^4S -%oD[A"7G/mLYrP,6pZnJ47cuef(g"Yt=b?6m+2aV5'DI]=MY'+Y2W)`+?'ZcS -%SK`?&2`eVY&b51X?6b0[P;.ZJ@bgD0A13OGU]'\)Du9T^7MO=:P`YtR+q!9h\=MuhK#HSf;41oJ'#D$rmM4'04ZG:HK0=Jg)gF&f -%=@%j8aWBBbKIa)-nN;GKV@E9F#0Z5:IiMBcK&X`?O2H\<&EJ=0aE*hm7Lk1>e!cnp*+Q6t -%cc6=/INsd0][LlM5YpQf@c:;?mu2CQ$bBd=r_;@W*B"GF*Ln@M\S[5Ddr7)OTlqp/Wc8Ei(6g'/K1.=AIBWm%2!YEb -%a9*!Q)ZRI@EDd!Z&m_F>g3Kr.",N1g$AaL\K,9G\p5O)S&02k">X8tkC?p>-mdOd\k06hjt=:NmC&;lrg!Y"d>)MS<`iTsc):hMZbST$<"6+0=pe^dGc+nl%2L:DOn -%\AETB@I8@"Kd-lGma',?It?c@WHTu1f/HspqX),5'MpJ731!Q=:#/M$q+;5YTV9V9!,O6ZHQ[rSj>lu3OJa>M^^(u%5Ro!REGX+i -%CP0.aiLrrSn])c)0+UT]<_OeO=m3`6>]3u9Y@,0nBD%p*\?HC#Utc"3HO]S4T.s')neK:LAROS`PlJ_/_m\SX>Nd`5a95/:WMG)* -%cQAQY/l9>j&dm9!?_J^3CK\LGb=Eg[?hY;lSi]>W"op(p;MR,2kI$d%NN?@l#.h4P)um;tp8q]57A]BYpTh6n&VN0966e<>Cd`lQUMM@j%t%g -%5@Y&K(-LG\H7]c;Z#1YMq>QFQ0l^!^k4thl]s1=_f)%U&O(JT$a1IY][W@V@2UFgM.:CO&^P9qLIIHdS/V(LDIr&=4M''Ql^Ae[) -%HfGB89I$YJT;!D8j/&Vj>.>siUTO9g]_)s9CUcak?M;q;RrX.f`.FX0CNmk2Yf[tADt:OnI^T&*/sa.?'E6XmY-ne@CN/DJl]q9U -%<9\`4.]55..XGgT3U]p^)8aO^Rr6?YCn.&BBK7kYaZ;jOa#j(1#?-9m6gCc`gL]tWL,J/lPq5BRL6FD1'&3/dACq>ga9:3X[<-Fa,@hl\MI0EQ9;0;KhrCAb%Aql75=S]bOk:i8 -%A(:4mq!QJ%i1GYA5=V">&;a`Um12*n&V)ncAMSbP&rn6uf3b?02d,_UZb>,l%=AP\J&7]E+n4?/(J[BiD\kblmD-bL.s -%]AW[lm_E7g]R_3*p/Lb,p7Y:D$27#E+n)kI*hX!&15!T,R@nuS"EO\6Rlc0I+'m>Y4=j,9./9*i5UY.'jFr#*g1'a)PS4E,1O?lP -%]Yq/,_"+UmJ-OKroJ+bQh)Rt+*tgPF6qHXQ4_LWnd:X9tQquVpN`K3A?M['q+p.(i9FE4OTJ,r)Id9OI/K=%us. -%-eQp`h0]Z,ht65:@beXEJFH(.J"s+fRgsAk -%::]II^Hn5q8,U)26eq6Img=UnEJVZ7Jb2YoE6]DRkoRYW/oE)H8ajRjD/)gb,8-dP:Le2;^U1s_&`C5g3n[.%Y:i\ao!m=q!h$'s -%Of$f'7)/^MSVmR7$u@'4_"[VX#^^g`,.hAK(l.+(LkkglGe60@_qhCI%@&SO;/6Xf_0fdK/\)F@Sro[R]"j8np2)(fg_!%nhrr=R -%i5Ta\j;FA*Al]d7BJ(H9L8Dmg4=AYT:]XOD9LFkghWEd3Y`n7)J-]m-5X#P5pX"P^@GI1(\&;""XL9-;+sLCQ9E?EO.I`"Bh#n8t -%!L_"-'!Tn+\X?erO1tu1gU2#1n#5C8Df@DVQ?puE)n(sHJhoFm<\nd0P2&Wl@R$7-fkgi%D,N[L)mgYOPA8gW,u[.2DICsg9CVg5 -%_FZ#AYmeVW$E'ma?_Z*UZB*Z>p1pquNrSC8b+.PL;],U72,F.A*3*)3A&b7dENPi+kOU%0jCW+u$Ui47`0F]11Xkd76!8/-AJ9E< -%XR -%QN/2B!8?Xll>;CG:ld^Z0RC*=GoIX8SOKhRGias^T^ufTTO03jrhB::dVbH^Ag49bEis>VN$-495Jg1Wgs0-#:>a[MKB+.!pk/VY -%_Ka/U6ig,4?XWS8#IRLE63u6&P%bHU[WI[:&W(e\qtBboKJ/G%1oUPB\a>l*gm6[t\q!GD@LYe-P%Vbse@pOsC7bE3S)Lp_=*>^stW/pRO$:"iHMU#_STED3=&pojpU=#5 -%B!`(H0A#rC(G&'a[*h_U7=EXAu(_\_@K:+8`(TUUJG+![:E6knFl*e2MC3OTWKX#rMnMKDL" -%C=j0BZt,E^-fa>=b3r)*bc"*0AA]mj/5ZDEmUokqjM5W\GInEjVL`^o$d#Tm."_38HY#7MI;&E<)`[#^1?NVqNu$]BdA9?18-t0d -%[nuCFaaTHAWb/YY_]r,fTh%)g[pUl^/j<1)AI\o?].Z)1mcF*b*,G2sX$7In"FdIU_Jnht:)QYbtm+5]&Z\lH>(dMl%B+`gt -%[M!*'K$c00/QPQ(7^qAI[R+R33F9n8ihS5`^eKHF(D2FF/+#c3aum+%[\No3Ke;_Z_b8_N(4'eUCt9!+G&S\t+2RD9^hXjor,KIO -%HhA`n*6Wd'h&3]94DPk%Y;nDJDZD"c<$CT-EU2/N:<-@I@[iA5_7U@M8^V6+ANdb%KV'l_:]&.+lIgWhEE(_ -%f.QHX[ZulI?[4MVNDQI4p -%)L(=qRt(Q]CVRulVe:X2Z$Z_G#KC>6S=mFMGL/P`-YPXogJ3pN+Pl$FOtk=?P[gA'lZgo&3-h35UI?E;Hik5%s*F>% -%WD`P+dig%)eD,HsR.HK*#JieeW1sqIIpXn;;ZY'cAd'rp,m/PS*;5i:A(u4jRt.Nq2E6&ai"djeqC$mD"?`u!Cg/$An1Rdnko"7+ -%03pu2YuEeaoEf39juBgX_Zs7'd6'B'P!D8(RM20lpX9heVR2q\.iLTTOf;cPcA4L*pn4jCUr&t8A>ApC@>Pl,0,0^FQfb*7hI -%@taGgYjtgclZLgEG:0PB6J"D20uLi`e`Y927P@(qiA,_-7_f!.U'hYZm*DU"Q]fI2* -%%Kj,rF2&gqAq^eO&`f3XY$4F5T`>3R*G'cr$"UM1:]:6**Ku6r"`a#Pp/b@+-1V79!=36]*!0dpqZ6=DGiC(8ThjK`IARn'be!+' -%J1r_,$rl_=dLHGX3Ah&68V4GZMfOFddND^5%-t&j=mZejgLa/\G[HO+T*kp25_9\hD2a7\Nf+%ri)/hBpo%e!efM&i>SE3,fteeR -%1^1=r"N?t7i-HA301e6m$t1"u/&+W$0Lb1N%;?!p%O?d!n`o2VRd^6INgp6V"\MaUZ"ZtVYRk,K"JBB%%g?@\0R#&0-;6#/Ur^;Sq];m.7NOfh$ZR\.A.;#;.Y),$eAfQo6L1T%R6'hWh7B8\bUD?f)W36*/D>I+/Fkl*"(TK4EPLr2dfeA18`,]IXpo)!IkeNq9) -%R9%(SpC5`Nl4psuJ+l=ZX(o>FiZH'N!$'o0_,hZ<9EN:!JBO3>9C%5#A9)Jg*!S])o?nV=-l+V='-8CoY09]_q4saL+V6+1[@)WU -%R0AtW9'n2(nZH3sK.<066]$U1:nn(2]Ygcs>&"6+23mr!Vc$fU:qZjsS.&okf-dDb3d&7I_tcIZZ[qk.W85o:ppVclQX=qd(L6AC -%H8Uko+2GH+!?A:4X_lm1(lHgHqVCPlH_;/g(3O:kij'-NP24aJ]EP-c5R1.P)8s1El6'[LoNm`J:>T"'"2n(%'h6q5BW4Rg]9Tgi -%LTt^^(*<^A?\.k1o!&$!H<[D+V"(Dnc:aCR$igo:,@o!#Y*Z(M6Ytk%P.#\V#`i&n;E\QI+t@5AkmG\FS.U9=0*GR(V4-!g-2O)N -%2K1d>H[Wk_bN=.>XffEoUX")37V!,gC%QBDpaY'j]XJd#l+&s -%Ih\%%fMje60"C+o1'jk_WmnTfrR`h:5S1j+f40JpWli5>G#b*q\6"5h@YK(C9$hFhZWlUkbHKcMaKWrO!;.2jKiFL/'n8,:p+:q9\b-jA+t%rcGc\Ej=BW-10VRm^:Z]8boAjGQfT<'8p;aEDs5h\2',C7;L(?3.R-m -%HY(QWZrN4^Esq29kW"f^.@c0gK"PDKW=H5CeZirf"'G"I)[Q -%D%"Q]:BfRSo_fUgQ>JET;Chr>:=r/4cEM[R':-!?jf?0dH)C^Ke,.Zq+4U^^$W2&kf1*5)[5P']?:BUI.D)QlBl^DcFHbVV@r+e. -%X(Zf'+LOP9b>^"N0rH2$KB3CO`>3nh$7Im%kt3b7'HL&QeSeB$pc0W6L*Qhe>I7:_focCDVN[s01ibFWI'?%&W,7`45Rbt-C+p"1 -%[=rel029J&#H!#*WJ?"uFXp+sYSI'9-K0V3(mO\_KU2F@ILcqn"mk^n(6P4["o&nfOr9t+*C>!P5*Q7Pidu+t+N`RQ^h;dc0__8l -%Zo'_F#QdFI9Mk[6)TZ!q-(#\t2ab93YUG`W"*)n@q!g#e-@- -%"k:?S0q?Q[+7LJEOc_68)Yob>95n`;k -%mUM'Yg$NjC5]$4Q0:5pu]E,g_gMf`HmqS?!QlV\AB9;-o*D?0#aE;q7rDpqp(7\p).TO:LJV2jt.tEl)Nr.#e;*Sc,[FuL -%XtQKS1XMO`^6Ec$A\pdL*_M%%#85(8ifEcU^6IW-F5V!P!TMZAl200FacPE3*3#0\N3`*Q4$VX@G)!2O@:u9c!inTgEA!`gD6](F,qkK8m81o`/FYAo\De- -%2QaLL3Y.^([1$NhDu;diTFK.2"PJmuU``NE42@#mOXD9j/IhMR4K^dI:$Rb7``>4)>R@r?j'h\2%Vsn#eU+H1DAM,K/l'k%hQ/:g;L67(uB$3RZDli+r&C_].MT63.8]+DCl[jS.5P -%8;!bJ^B$!B!1@*t]>7HNj%D]2[HNCh`lgI1I]j^QIW@A%ZUVI=m64^M?sm"jE"]4k!H=X.1*:a5:rp>M7#a:Rn!t.YAO#-bQ;aI7 -%V5R$qs6(8+=A%5/cQDSmUK!9ukYb::@BdPGJ@_U"ajV_`s$MAYV$C!\UmOOLJ6)^d3%GJtt>@!pWn[Z1WIA+6")\s0?afOg%+4_>T0/g:#fc>qj/C@-_E^*aE[r@,ZHAX+P[4ZF7rq[Wg/1h^OhjrB;H2 -%^/mn1jc#2Q/A2_+^B3R[SO#PJ)EkU5']93aFY(>$\;43WhcDMT]%#i_hn)$#RcY/N9XnS'E_D=84Qr$mn&m.6:Z-;B"8)gc^k(8$ -%R1*ZH^,o]s?F`Yd:?18<[t#qHj4-Q^@A:$Jenn=6o;ooj3Y-E+i/Rf$Xr6#3>dJ7+lQD]eLGS)h_q$BPG,uYJhQVNbW$VL)NF()' -%]qp0:kq&K-jc6/Q@o.<*D@j&Kr$Dq8p`8$!n\"Xp^*ug9FB=Y-GajK9d`Rro7jk/ld]V+ -%$]E`8hYfIFhY@KJ,i3KIp[t)pZI)!#0.T)fTnJ`fV(l?Gpkp/[ERD@L4tFEV+*7OV9!Cg2']r6[jJ'?3Amm_(,)Ed0E6/^=.b1iD -%d1V9l/bX7bIJ!A8#HC(b=Np7kda9B(XT]G86OE*]V4qjNr^"/B:ruS6VUj5f$o< -%r@R5<]P2(_iY;H'DM7$L'BgbL$J7KEdN=3bh<"nK$uP7'X#2]&c^I@e^$\Y+(S&qI0\EOf7rl1qJ_B)O?5#'5G#-E5m0:&4J_)_n -%(+`*bMqRPuo9#/J[Qr%.4J+1D()]Ep;QH`!=1Q0!H=[\Pn=e'=l"h`3fk+]1.*\a+#Kt+:+'71IV_-qSmO#8C$.$(p=9dd]>%1mR -%6,PFE\@$0WW!ejG]Ujenmd'r!hl?FR+O&dh.+\D?g@AgEeEVVN6Fe+CXJnW%Q&N-WGhneMm?74`k_S>[;o1gmN3[]bKCbcqWH6k=$Mlp`IRXQ*Bh-u:OoY3mKlk*["kTF68,BZ[MtHWAkH'K*\m -%/$f)l9%U1&XYcH%II-Q%i*$Erj8tTje\u>o1=Uk:,7G`MlON=1^j2gEm_f[,0i+cS_O!8a`A6nuNfnJ8fe\>lmI9p6Q-ZHV]r#*Y -%DoLM&^6B)P[/V2XQ/G@ci.1S"$n>VC8mG[a(nl,*J/tUVeut#G`B82V -%L/bPuN8@k*(rd',A`]u2'^bMWs[07j#`W51\;-4mT?pUH#(Va&H@/]rZJu)^a[[Cm9RAuq6WH]C*Q&^[d9pa/$ -%#Ql_,LN5"@UDXd'c3%$L_El6$iCgW`fnR%c1%7 -%RK+])[>4\\;VN&l'MQ3Y>d2lAVqBZ)j:sj.$Ic*q3ID_f<+*Z]AQBnXDu>!OGF/An21%o%nX&l>; -%D4/'`i$q_Kg`pmW;oT_sV@0+^kZ1/*bAoeRcP-B@h;tB.i@N=NC'Mp_."3)YlIlG;2r*%gkAa61p_$9kBbA&CZE@h+'/ohu=BF@7 -%n,"uN&A69WXSVAak8VWS=#O(s/B>ODHiN>$OIM<=S[/h"S5,6GdUJl:0;SpN=^r]GEP+46\%qk[4Rm1!;e1R'T7l17\5Ss*b*/FN -%k?&K1gup^H+8nu0K>uc?PfA!u!4n:3oDQ4$^[b#_pS9V@cSq5EXYr[W0&0U!fEZUEeilJA%Sgo3GpKO-K]h6G2cq[:IbK;X20B2m0]LrNA[`gjJ+,?r9IM);a1iRlF)P!Pd3RJu#O'&[r/T;2/=)`\Vpl^4r-4:L5q2u#LU#?`er -%`&XM\cok.W[CA(sgU!dWb"rXM7'cJa-'"%minpYn[I!YcC8dI_XXnKV5 -%"tm<\B"!*#iDDQ4aNQF7cFnAVfet_2o!@1=U,BNI!KXqm#_Lipn&CDH8%Ff<)<+OR/aCPh@;IG75.@*qbDsPaaA?3NVhj_\E5!*2 -%m'pr?F;lS2Cj1UkV->sTlssLYmaldh`CU7gk%sbX\< -%!bKO/Z,N3WH.qWjDC%gKh\P"`E%B&4J%bA+:\BLmKtXoqaGdhi]1J:$$2*UgA%Xq=\0E=BSC&70@k1a<1EB#21TF]O&^FK\g, -%]r($.k(^AeDRZ.10ZEGlEK0W)hgOA1ZhDrNmegXP4@0EccOb]k2s8uRgk"]FmPT2)cR3h]Y>R5i4)W_phojuHd'If<-k;\oeYV2r -%4mk7!"h76O75O8I6C/QA>=Xo\X&+@_P;cFJ@fV9=W7B&$)s4P5XS3%-`6@Ok"7*Ur2>2u2J^c!9H,Qh697D&un!P_MdPJ<"eW?Eb -%.\EXCR!J2Hd#&e1)Uf`X!eIll8$%=+'WrJJ;*edR!5&id'\*Be*8nET2)$&6WJGbRUr(_Te`%k]QXYe&=>7%(oZ2"_#JaRNXVkt0 -%c`/$Tb3%IM\_"4&igeE*RaU[30__#hVqUOrBfBumnpW[.o1k-Trh.G[1^*?+B:@nX>#oRP5Tn9%jRDq6U -%4CGO\gL6dRs1<`0c=^kgXTRdTj?p`er[6VHF>Wd,:MpjCbp\=r0M>QY-#^j_7\j#>Br^mR#(#F8b')oeC7_)8PFsWcV/UK0(F-Y1?(O_mri?bY>k -%fs-JJ$t;8IY>Te(0sJLiYQ(0"-\;]7R+L+E&9Milr^bZsJ&4)gV(j2NGF1rQq=2&Iat7cH+,BSRmF,M'pB6'C-?041%1LIL[:XWt -%,A$Si@bPGgO4qe^*pJ.EQZ@&g.c]ZSW?d1T%q^^9)0U;U-o2=AhsN;`2H2O,*hf\9OV8:=A7\jeBrK^!Kb)K^#g5++!duCk&qslbjK+b>m@T!jJD!Y+#FeP(R>L-IG>l)>n -%J-pIg`Ss3T@bI?3S0Rs)P!WP6AODgWi:Tpgc\8rch.Y9uB^euFEn')TiY2]\2;N,%$HQ!JrgY+Klij+TcQ9C]+_=HV1:LSs\@&_b -%U),Fu<&([pH4PDL,(U(##]=?cCB>2^ke0+&DQ,%GbS';+K.;edHfY(3Z0f(UgZg$IhG+DC6$LFq2WFV4SnRe<&?f:qhAKZ@!YhNl -%TLuslcLm%]B8E"ZMXXn:[Co[n1<[3Ar!*7*c<\Pbb+@&mJQ]8M_o^IG["JG1dm,[`A+$`$t."H9--1\8EnkfCZO+1j? -%;/1YpEaq$/gGW^3lR5acVjZ'QpLoG5**,Z"/tdM`VgV.u+j1olY4,>Re./3J35P((#W$A%8j+-*1*X0-r,kpEjC-J;H^d1F6(B_: -%8LC!eJR'P!o*n+D>(2q/@4Gd&Im*Y@8*aMLCJ:U4=LT^LH8"MC\'6SK!nnjWhR/IW]rg%KPF-s2]Q%F,&(X87!Yb3YM<6;CXhO;mE(ASclIC=i7.$DW8qG0N""H$?a/ -%p(>J*bn5X*KE+';jp:D`E/nnb(J*-H/9dTjFPdXK_Cn`2F]n(@ko:',@5r!a]HiDQ<]Q,Yd5H[`!Ld0$G]1U+C\N26l.7:'39Sj%=GhN2s1#+m.uoC&N2Zm+]*g[_LG5BsL":K+-C%nE#Qm[A6"f,T[!d8)/Ni<&LYr^?GGUkFb3"4S@Df3&SY -%X/1ihr.XeUXj[!Yi3G^OcMMV,;bPDSZ<-e1L\U;Zj4cYbkV0YU@Z:]_-`BO/di_SV+M'J`=SeQ(^_:H6S-K<5RFY -%<@Rm>BF_%["L^0^FT]Uhmkiu"4Z?tT=AnXSe_6A&05MN.IEn7PGH`!^bY9XZkHOZ?1oK"`N*mFm"XEKm^k4gFpSd736pAn3f7^;> -%]gCI"h1W!!M[i^&?dH4[:Mr\XXlUIsTPU9*]!LS,aIJ&jMtOVV4>ReLDVi6qB&%u`\KT/GM'.YB#0>..:1Ec6g6q3!(%rA$.#[7< -%M3A?1[5)kd\M--C.DI(*".%_:cLO:T]ZeRd)@;;V9`.rS0[5Hoo]\Jcb#;al!d[+boKE_sm4Z9!X#e+>nKfa:^5!mO;F'>68lkD6 -%qj,sO+:ujtj;S/F]Uij3F+2*L1qablOhBnriq\?HC.Vud'UR8`q90uq7elra'e1Mb)[X(0O]cUV,P1de_L?1lQYdiiYSs@TKrf?" -%N;"%[&?@c.N]!M%ODZpZM)4B!p?Jc*I2Ct)-H1+]O>RL+YV\$*p4a?3m)f!AA.7-,0gsF9G*!QY/HR>K$l@P8NAM`6S!f4Rd=hg< -%9AX9?('AWVN9s,ik$&JP`lA;pIj?epq=Dai>V#%/_LfUKBB4,#.JMZ5'MTO@5o0QC^@YWV(*$k#H'LM'tr>f-N -%p/%b%aY72?I&%*&g(>J4':+kJ!t,J.TVjKp]lhnEK"#\`;^H^bLtJbn`Y9?)r9f54.nP^(>C.$VeG -%3041E7EZN-3CgN]#$J)H>AtB#bpig?AW_Se+hj@4AR*^)JfmjmD&GPCR0t5j3UK'p,:%)Bg'Cd]WU@I[$m;V'S2@VY]OrbXi>P=W -%K-#usLGK-aarl.[q9XQQ3C=]g4Dq\8C+0Ue\"=as1dR2-Aac$Z0c(R!1@LV)nP0)g*_G17Yl9mqJ48H$P!Vo1MHT6i_%8lCIJ<-Q -%kJ4aZ5pQe9^c-Q>Or]97O&@pf\M,tkKim[3KJf.(2't1IMVPt$btt6/"SECm)nfbR=h>5,:VB^N2r1On0INg14 -%_VJE1q4&mLCUb;lS0BR%;(Q,(+^KOdZ%T#F@E.8=-%Q)-5)L\uHJ65q"G,VS3-0;rr_;s.dLa-9c7'dg-PsFl(Yh^JTkD%E#:4-h -%@/U!Hp#TEu%K!u7=\hPY8M>I':skD"UpEYk2YuTQ)R8gP)MQ0XXP9_[gFX'XTDDF>G72/SP5U*Nk&V@=r3W=%2RI4oVR#:$8ZCIiVS/?ess.(c%BX201/IZ'F^#7WK]@ -%FD&Dh=+of\11HI*pNpMP.[h%KSR&AD^ZjWE`r6rFup=+@G'+0H4TJGg.PuTcD7G`u6HR8js!IbXu3)'s#VD1YCb9+I@[$ -%ad*B^1+5a%]M/d?LG$S6XMQ>^>"'4Id#=Wi5j"H6?IRh[R"?3@\Rc=WH\G0R/OTR`$sO5l-qf0*:ff)RL37AOZ8Yk5N'9jc]f+RU -%9K>3jb8$Aifj\DKApBVVlSPC\?r,p?W<-o-RUlj'GnL6%[9Wk]=c-(\`s".KHJtFIg>3^T?Qiq6]iE9ZKpVU-#nRu;]S_).S4A1K -%9'C-JO(Of!"^DYq^W2VUug#0SR"ONc9O#[lTdQ(\Jk>+M[+)cFHJaQM+sXMC)_Xu&hkqUfJKb46ZlQ[&+6PENR/[0c4NG?;,= -%hKpU"Y7h=Eb7KD#MbkH_#Eu3cNS@Hdj*7.,A"V=/q/3HFEpcCLZ6b[`0'q8B@>=0G(!,pgV,Nna.u7L`*pXqEl]oL==,q;o.Oq]5 -%^B'&AnHU+-Y+4]j]KOq*Q.Ssu*bd3lm(c3WT=Aht5"8"Q;Tc;++@#H?T\u?U$L[B94THoR6=JY43UmYKq*["S_]Ineo*P/'q1q0M -%il(<-#[>8LDpV[H+Aulp?%e,[l4_6kH+(q"6>[;1I@omGB&HHc`UST"jkcCr7h3MX+%RGEofX\OT6n.i%JaK+TURP).1q4%!mBZ1 -%e#;Gip.BEmh=2:@_rrB7Fi7k\3P<.C]h]L\k7Ooc;KHH%!#ZN,_A:HfLKh@G%3J@RoOFts(NA`Jke*V+8qNFN;3`u3t>^`jLg?sXPXed52bJ/U98bSgo,r:9rMd%[J.Zsi89[u9]Zf&Al*Z*n.CFp5,/d9lBr?d%OHS&V^ -%Mqej`VtV0g*Mp&0MD&c$[sI-Olg;f=Sf:]Dq_V^?SC8LBa1DSYbY&t>.0!sh50GiZ"/EK_44^IiX:,*X!8Te"42n+Ud9[[`A)TAG -%,"2B&,>>9uK0U?Yl,,;$;M#@!"d*-l@655tI,/k90D9_sbSGF34=V.?/^aF,T<-1P23g-+/js81M0e`()Z><#k7-8[ODT_=[rIf9 -%hS6(l-X#*Nk7KQtNJF(eM%_]o>$%^R`0.Br5n/s)V<+RLMg/]qp-'K2!)I)baW6*I\tY*Ub$7sVVrr5$Of,Ufelu/D#Dlt).cS\/]&T?n8&'60b$tSrgG'&1:AbM -%/Ha)Mm(djA76.Xukhj1_,\/&P$Q*+B;KpaVJH_"[^gL+j&cOsoQbbX%*kl`NgU50Ub5D -%b@e_U],o8akWZ.%?f3+g1X_^C6;`8T!%UL7)9oD0B9,-"JH28^=QutT:`lM;]"g]V`_"e:7AA3N/cM#_Aq@lu3!q1pHaIRF0 -%&qkJ*CO?8k]Gj-X7te(g[b-sa@BWN)1K]pg.nmM/M^)6Ri,-cO%1?NLkt)N7&m)!YneH#JS0h!po*hO4gJ&!'kE-_dDEBd19^>EH -%b;S.cndX%0&Sf_ZpIS)F-aLc)>s+6HU$`&IC?k`%nX`1RlIssFRZXT&"&gc8> -%P[t.$pjA$>QIF'hY$-'+lO:'i-[QEu&VK7.'e@eE\%iPYE,-@Cjc>XE)^s"r..q=>-hC\^3@I%Z+42aOpA<@_C2,>_8(k^=4qY90 -%TRu]#VfN_p6a]&>\iA5q!Vh&$n55[km&X1C"#=oH\=s3J_LcJbg_'JE:!%rlHg)Lk[/>=lp!tcCc.D-IMsEYpY91sZ#\D@Y;.C,7 -%,%t]H.dd]6q&&($>0NCS^s^Z>W*\8gi2^)e8$$)'ZWfEoX@C>e#VT+,;S'aHC'*s$Sf)+['sZBgMG%dM`u0oG[Q57X14oKR*\--J -%CHXZ8p$dR5>[@Z=DYC#LWECVihb<00KEPGKeTBKf`?7C7*DTP0roph'm93@IO)osMV9n:+&&l_l=IfNaSB4=]M[YJ.e -%QPH-)/XF$Uhod$P'S(;?(VJYi%q<*<1P:8^ZtQGoOql8/$l>18CCBjm.aN!@:DU_A:!YNMXATP0FSHKHplt5Y.UuG'[FKM7Z'kh; -%-/VMDFDg[M=ct;_@MIDKjsi]*6P,O7%%]51#KdeUShCD*kZabb2S%Ym"CuK(`i*#&a]]Q6Ks4\F5un@P^"I0Mq5-i/Y=p:NRauR2 -%1.EZ"?.UU.BZmXTN&&fGf?(:`V3&G6%6j3#X_sf3nZRI:Vi9*gH_S=a^Oh[+`)kTb+&*J!_Jk=i'kTiVq+c_?GB9+jBm#qW&%cnH -%^lCq:-o^'/*PjCj("86'!bF&PK(P$`GF4_%:Z>;6>TLJok&IVAKn2n.2G$s%C;)LDJPH%5;=ZlBmm.`CZkeYBbi%i[I_TI<[QNHM -%pr>76@#[;Jn)4EMpNNa6oiX5R=1qC2]"\7jr0[?K,8dG-qWA^ln8Z6aNa&j4+YGb`3t:r1DVJTPP?QLU!:EX -%CtQII0q8/5j,SgN_PV[Ad:>3388XQa!_@Z*cqkSGVO-N69..@Sj=S1lFlMt*!qNL2iD*fmZs\[\jp59*QtukPc'0-?5.aP:jK>n_ -%FVsQ^qj,KhV2C%^EQKP1(5o9!,s6e?jDEh`dlVCi6npNA%%q(V$hW]C5V`=`Hs(ZR3seY;O/5pIcf"/C8!)kj#-OBhCB"tA -%,h"EmZY/+(!9BA%YS:%Ej1a*>/$jE7j/+`2$,6TSU]?d>V/9fcfbq'6^^;uRDh;J$nBTOahh%F_`Z`-B'5lk/'3Npt-K)to'3`4D -%*^)aP;/annd]h\7DF?Md9H2+Ndn<\)co-d-jQd"0n&tPc"q#Dm2)#7n_*_?49hEGW$0RhlK)=PE-Mp4_"u2iJqD;k>/"J]1bS5"o -%^q+EqbYAM$Y\1^5J@=3r$tekI9Xh9pm_K%*GB4ha.o8a^KS6if>2\t>U&2&>*5rmDT]HjXX?9=)-]Z08e>7NApblqWNCN%4jS?pT -%,AY`%7N$c'd%]Y`.<^3*9oC6)iXIN@?Q-QsR;$Z6[*Kf`SWLY;4BF[:'#GRN1"Oi"WQ37$PA0o!."W4Oa7)k/>T:1!!WE,gQuAu] -%8nMnIn$LQNF`>+5ai3W`-R7S'"@Xe+9=C^SVe-q'rkao=?.$m4UnYj9N7U3K5bG_QK<=bP!INU"#id3tQ#nX+PZD?& -%bAIO[$@Xf8gF'JNdr%9N,F6Nfc&&6q4@5)X/k"JiT\L@m#NV;EAHR4Vb[-m`kNg,Ak`b'n5364)4XV.%%rh5O9:r_WVol33H%@fS -%P$*nT]nZiEO=fiYP2MBLn/+CH_"Erdhlk*]>P%J*-o,JGMk>VA^Ygb>7.W4s(p_WW2E=c\)n'VL0Fpt!5fYa-AY5&2IX7f!VPI_B -%1X_LNe(::r13MtW;oebC'V(K4Es'`pa,p%TmXO9K3(XNi7f4SLHEPGe=m=c"(_knGZ7nl&-V:#5L0*'h2Gfh!\0TA0A:*JueO,?B%VhDe@mJ!JP2/-oa.;a,hPM9V^r=B?oW,H0YG+!NJ([PAtBK<8[MA+$_bQF6lQf%S)q7ju(i[ -%MI=4`9i>fN1te+SLB;o)f7P'12CGs.d"'0!B#\RoCN,GWr.;Q5h_r5J:1nlQ8LHobh[\MPerm)E^*d'=`\0Q%H&Jn%*E9M6SXT2V -%k00T8k[0QY-MC[\%uk]EC\\/BTkMYbgbL`#c_!"^k![-"/7*8[^!YW\G:M%>N-d1G+qN6SCCAmtga-M+Na%6,L^@gn9frZ*m;e"e -%rfL]rP&Y62S\\KmKd+j%5'JBOmG$F@dg;@,?[+MZJ&+4$8R=]T,*br -%`S@%,*Op/@W-ZY+s!&Ze`@PQt>8d$K1_Xl"-B*`)oI/1F<4#qZ(=^7)aCP-FDBnO71/_5mL#kfn&*Bh^lnCCV-H8;CCdsO8[3-), -%W1"pQC'sFLQSUNCeBfC/&4nD=:3/*oLObX(7eWlE[W8'hRa^[WTXn<[$#7R1MW2mlQ6c.(&MR'8I5Sb?hFn+6pCa\o2o4rH$`l"K -%"=L2:%%HFlcU)-lb)Fsd=\Ao'#X-\oQ@!^7_$nOjGYpW:Q=RokU9lV.?<6qNdlrF-$gr)QD%`7e)A\k6f,@-eLCie8Z@pgc -%BAmhbS-p(SMf.WC4D?DnB0%sg3G^U]0`l-HO*UXl:IL&Kf9BustWT./e(HBE)co!eC+bsi+;@f1! -%!nKjAaHa-N($jS:qV6:K1"8u_!^QI0n.F14fLlcF=i#j,iEWuS^?okJ_hl;bqMDa-<&44=,QK[`fK5L!0'!]C_bgi`^.Ope(2JcJ -%nN'LM6^^heD-1]6lT"bF(lUD,q_r=62\LYuNtFRkDr/9h#0R*Z$jlKh3Y3ulrk!9KFjFI=OoN?e;t&/Bi+BLA=(H@X$gu;5UTUMhXHE;pgG$nCD7!%S3o_#>$a&TW@a3Z:IS":D,&1(W!/kllZLNf;UkE&GGY%r!`jabsZ&W)ILmu0&$9l.aiKSFMCZ\ugAo9`$ -%Zs=BEW<7$"RLatsgBb6upJ;++J3@ApW:.'%bE;3Gl0YX?30Jq8E9&gAh"@'\K3)]%h%YbVXM?rD7u -%UL96^oR%DJ5Mm`YAXLG&SoW#KfeO$tGQF=30PPqE``+^qNPEM?B\6&g=*m-'5DR3_b1##76'PE/L1Y0`8F#=[%C>P8hc65u3Y5B' -%]2B3@gfqr^1)M=^VAOXOFuk`X`'E+b!G?RRpH!!9;L@%dn:r&=WT)QaH#':&5+,V%p^CgW#A&JVkb1h+3?9I/BI1KKp:qR?BV7#h -%9_&hmRNbNA7NAdG%mUgRWFNeP;s@u7aJ'E$KViDP]CR\KQ">^i[Jg):/Ko#P_G15qILd+poR_'E8OAe>2O>LE\P(##7_^s`2c"Ka -%YF)Zn->.J8.O1`@8cfE"WtsH[F4IA2G;QY5M,t*I)5,!$CoH"**e<+`MA@Bgo;G8PCMF#CelOQ>cD!8-K@&g[)EeHd=]s6+3Vek$ -%jTTrG)[2mDl@^Y,nM%1M-r!g07^Z-844=Nm[)_*`Ub/R_+d^+bS`q]K!]_phabMGqgTh0rFK:PN9h6',!jqcJlTsYU,Y:I*%34?Y -%IeGCE?j8P9p^I6c./-J\i'c$OPCW6-<7"prHioCfYb(goEjSWApF#H1__ihARQ0f"';b>N(o;_1b#^c@0NE2f!l_"QV: -%1;qf&0\9eh2mi%o#h-0@Nni9M[u?q-mO,i6D8m;GBI>H7q0i(O27Y+S;:VO(/@6:8hL.Pp>!Y -%:^gb;<=f:Gf&I5b.NuS8C`b&eF^*t&TGo6Q%0=M_XoH``(UMuH62'5Z?lX*%fr]mRMREZ_r>8rgfDQI)?GYqZoN-8hfl\4j9>Qg. -%Yl2h.!cR#(%<&XIi@WY&q"%(nYtH0(`7^1>^JRGK7lBe+(P(qs#Q]:JGWUjN=LZmP3u2NlJd2V/4"Lmm&F$_';=Y&Ur8I$cpSeHj,fh$+>OU2dO(ced4%:6q`_3C)N3rl/Aq8?YO@mOZ]@!lP.c_bWiLZGPm4;eQ9c+-fF2m&K!i@)mEZu/*m?@k<4L6%:$7%PmB?hQ#sm+8B\_agIr)KPYf#`UN6MLL&60_^ld/F03/`FOH^>AJ=^TMI#K`d[<8GT+kLqNKBAW -%TYN]_9F&W_@n<+N^+>;DE+@3@Hl& -%LoYX''c>?#W5>,p#g??.$D)6Mh_U'ki7D$2'.Z0_32((#EWITH8t(,_N\upoO_.#gC+lnijAj1#1Ec"OP$#&AoOKe_p#'=a^/pM% -%4n*5%"d&NXc6?7p')@:XLc5KI4^%MJ>)%PXg&(7!>`uP:I#jTV`/5UKL;k(L8qbn1mVVD<=>a^dUc3LZ!g&6,O'S*G/XX.sb:Af) -%f@/Qs2]^??O$W1O*:2&gnRBM1+6pI<7Z&ljqcAM8#^VSiW+"`q+NI,o\88NAR.1h01.To#2WJEQES[Kg`>.ar)=h:gfnHm0HY85W -%]g_A)++mhYl&0mcCWhZ7Oh4)Uei2[<8A:oBr$QHD9F+6"!EO2PVr\fD%+9;nc`DXiR,IaO"Z)$6Ub388'&X@n-F:`gb[J4Ahi7+2 -%MUV^(#6h;6)F5Fq^j9,gfn2';9A=c[]E5q[``FQjg/;Yf#H8Ck%*]&1./27W09J<0_AoiE]itQ@$m"[9empV+1G#C0p^"I\k@915 -%>%K=HM#Y3P9Ei2_oYJa;=j%jc>?25rhL5U*#c2f17ed*\OZ]^r;;sAtp7Pf(?'N[D';24\V5^IF.'#&oiB&)2M -%acik76Fn!0>-9BMM7S3fbbPr'#ZAMa-isaWN'!L@iPX'OF#(l8!;`I"$l%RVGAg@_X<&p\1t^`ID<8Hc0mLDAU9lLKU__U/J2f$, -%h4,AZD0*G]gC?m(lBCU?M:d%UX'L%/pi5`cgutXE/%[=kj3Z'-DmkC%1I1K, -%cFAqZ=hA7'o"NVO&X-Z-f>>Dl8iD!bnJ$-m5`4\5>86O:e4bn8PAF*VfJO>P<"'20qd>aXE=9Ao#9A0T/'El%FHF-s=I3l89UHU% -%kKf:hCm-"^#Hsu>7p2(piPYLqqQJ"%-V2G<@a(ps,&i(*?Ee[/nE?@,o;1^qaM=?Qh_9LslOFb*!!^`tGn6Q?FY]c]7u&`5gA1h$ -%WNqOGN&BKYljd<9m\\QY3L@?p`sUZ/i&0k-%QP$=T5.)Y8ff<7J6_P=r;8\.V60N>=^q!%'d)B"cU5JZ@#5&bSoK5gE#tq^hU?ba -%4cCLe;Js=,TJ-q1&uB=+UI$HGW!KA[T^#&r@S6*ic -%!dEJW#7(9XZmB$;oD2X">c8+^rRT.SNhTT^]9ZqDKtQ,DDqCIHXD&V-pg!ND% -%A&&cUIM4scd:+Yt'L3n,N7Jn:p2LYeU6V@JJL+=@>WL_V4rZd+g'!(#meI^YI9MBa>04-NPH.paA@Te1-_L`An0%Ir%]si]4tXSM -%r);?9m`-A2s/EJT=9CSHe2#b3d^7`^EXW[m_5NC2#2DT^`YTB%E;Kdi\dY4-N7.9f5;LF,%tq6 -%!m3L[H>s&m8/LdeCQ)2poq4S76%Q-C+56!FVUScUBZUbsa1+/dAD,+P'mKkPaR_.'+Qh:PfYH.R'E!:m5`\b,\E]lP4oL>NDI&Z0 -%T9O.^-YpN^UX%eLi>?N$C'*D)r_]\2q4iK2b/q_2jA=?%UWu2o*`pj;k_!!o7ZiQHP?i*"\9I6P3)@An47'[fBPtEX(UI9R>gV.+ -%H:EZ2Lr8j4YTC4:Q;AUFLZK?L$'ZLla0@B;a)V\R.&V'5"h)WVQk$uA&+\Cr?LU!O_8tZco/p-jbq>U#RA'VWeQ[sQ-!*-(6"Pn1 -%YQ:oI"LkjqT2WOKSU_:m)*Kqb_J`c0P@2.n$uJ!YXP0_MXa^!K^M*^iVI&RY"?>Tg]e*m@$oV"#3%(PTChMl'YPiR?ai(FL@\&]- -%Y62=.\!G[@J&"TFTkHnMWCV<,>ch&lAq/]r$',04+9r&-F'(c2/\sB[1TWTi=Q*kS-K3BpTB-T+7AT+d[ar+WAu1)C1,=8WAL-: -%PhSr$G-%7+Hk^EX`uP!28]DV'?*7S'mX*+lN.urd0OH@dWUg+,7rVl\7>LJC^B$VK5Fu0&1Z-7=,C#M7l8NS-gHKBRNg&lVSR2?) -%!cf?h=/bp@Y?O)\FK<28L^NB'0UY01> -%b2iYcLG'I"ZrJfVVKU[+J\iU]TZdICF:RI'^W430D$`,""h#J:J1\k.Du6-hH?90@O9NkTdKN1r-K(?&lop$/+3g,HIkH.:'<)4p -%\7lJXF&B`cAM$0U[8bk&PD9>*f7a9S&Eet*TmGGpZWdUm;;[Ee\$jfDK>(2IhZRoqD%@<,;m(lhjB_150EM_/qu!@q^b=9Q6@nMS -%grHi4^%FsRG[9$Zjtd9W!]2""Kk158s*`,kqX91mT(u_ljCL##4,a^lSo#!$anb0]66;_87hJ97%u/&J\F;t:M84tpG(<2epo\)hnY-@$3=arq%C'Q_=lN.Jmi/-N*"1TO>e_upL\-L4X(1N^h]/4:A30@8sBalWsFp@oW`Oa+WNFi'?%MdQ7 -%e*=d9GXd9e]Rn#D(5e`7Y=S^Q7fuPa#9"Rn(57k#6[M+0R5DM[7N(tDIQd;s6o301@Z-co2-B_7<0`3=CkiH(]+r*KFc6U_AaLc103)2"HKSbX/ndG`CXSclUe/c2+'6t_UgC!)-3?ePm^qt#/B#^LalR&ek$CZ5S -%n.pAek-\]jkWi\5fa..DD+uZ]hh#U`ICM(9qW^\A+h18g(n"_)PkCK8^cWiT6!9?/]*mm@4(DM"]'br91FX_7q@pTUF&;&kjl+$u -%pgX0e&hHW"$k*BLJp08#/1`[lOq5(e!$3DM"@]JGl[nT7VJ0ds-,\]:6=$?qYZ"`n45K9;fIOF-'.@5m5O=]iK-f=oUtXTO9Yi/9 -%Pg7&.El$RIBf-h5OFV[&_i)R7JkLQn4DBM%5oSD""eX7a$NBcBj(#+%_^cP9(T.9NnUUq^2ZV.VOumqZfi-7u(^F[".Km6n4K!Kf -%#LF;Pfi-C'Z<\:NE@es`Gj)\FF8S9:AAm]A4^7b]`2o&,.mc/`,YN%<->)co,^!=SK[kZLXs=BZ1(o<-8]hCl@FT+2TV$k(Up_]g)ppK/l=Q('M"s"hVK5-Z9l)a\/(\3al^b+SB-<(?>I8.@Sf=&%TB9L?/_A(W5YYi8$\`&J -%R$&&G=1B(iEc0!"C./@nOT,mqYLE7]WZmIR9gJBElHr`':s;_qD7Y=?_Yh+[pgOY-i9$6,E5Xu]7+t5O@)S=S#/k!&G,gWQ@l]/O -%`lPQb=lNRo41)RgbK5jb.iFSm,&:R@5\77^co)'3,(_h[&VdeA(#9VtaXH(4R?oF(,Y(T6bk0^B&jd":oY8K:tpZRS9,_T->Tg$#J_"rG)=kAU6%^[,K`.uYEVP(po:Am@/#W(0#PIaAmm"[M)o*pg;M;blKd%A -%!G9`&6Rf8a8eRgias>:<>MU^cUXUKb\lm;/@FP[qR$?6cqN`@qsMfsq:#(;1,Q'f^Gj?e,H[\ji@fINq8%0ZX; -%7;[DAEsJZZG\gjQ<*++4fYi`S8hP5Jg&d$B/7bPQ(Q>=67Sa>`.[5pfr_9(.,?ZLMY2A_!T5%'(uI^-VJ3HX#*Y7Y#nRY6QNY&Fs3UHAq"CYk#91<% -%*d9ZI2mM`k5l@5&!#=UK`QCLfUE\Jd^jXMG@Ga.c,R;e\[;.@WC;$h0%;I5b-"f!fK!hVL5-3(e_g\J5@Y(P#?"g%0D/q-u=&6SS -%ILdZBi\K5m,tGAIH)VY]Y&U*s]VhMtXHsIaa^8\#dq_")r6cB0TVcel2?L=5"-[6WcLO*kphSt(30kT2>)s*Wk60;$0,2W.I19Lk -%U[0XAEN4:$ln#bqc&rB;+.L<-k'\maH7R\#)$iaps-Z:4EUqI>V]A3kiu=K3*tQU@5,P!i[S>K&5)[7P7Z`t(U:L$oq]_`b@StnXI"o,K.'ng -%+tMM)E>u8ElPWdB24:[lQ;9=K#8[]E6GUUeBE==$'3XgHC`0*IT4.YcP"!lDP\F8N,W_s+fk3X5eWe&69Li[RjT.i@,b1Tk!1#dr -%;[!GlSL);Y`1le+q5(C)9)o63oO/3I![l&D5a>WeWs%U3gr\SbHe]odpI"j;4q2G@'N".3(0J>W%_.%Z0q_\09]Q=.rZ.Ea1:q:P -%BFS`[9JZ!rL`i_+=LV]SYoKD/g1r\jfDa>:]=HG](/PBiq_dh3Q4_9*hIhT?0+eEi0Ir8I1I@Z;;/";XPqUo]:.]``f"A\:3rheP -%"m6_/=WkECBZe+#++\9e!`-OhI)QIu6_2i3I;onca`_'HY;CFHA=C-nZ56MY!lM4dg'0='WAD$>9>llH0D\Iq($G(U7gKXE/;a=&/d+U.tk`(91$h?,->)jg,d-M"UZpNj$s$Y1]Y60ID4:cbQ!ZU-b9N"j_Deh@lp1rF_R -%fB`dCT'hET+$oHM!;qT!Qn10(F-Wk/.$f!W0NWit&GCe)37DIb1]b^"lUj61dfkk-e"Q^btW9NLXd<&p5cik[($h)bd,X9B*QF$m/S0I?f#D>2],J7qs1ae/\$H\a^=L@-ON7l`nb`Rj%8SM8( -%@^6nL5V9VF3pHi284'iF<8YZ'PgV:eA%Yrc\C488p^E6ri<;cC\W@7;^,FJ1HnjA:b;CtYl@>_&=9n:lk8iHd?'TJa! -%=pp'RFPSimEXP0J493-OA(?rBJt#A3Ys%\JCZdT;G8cFCI+Cb&._C0T%t.3!YI_MJ_+ZF&0TO9U@GOg8Q0`su^39F>\OIbC2a97B -%XLr<.l=_'@k?c^DSpu8\0Qgn0O6I@"7EUl:i1?T)a@ge[Z5$-RU0^.$H5+0`a#LLOJ-.#WEXcJ>f6(hnN[PYiZ<2HNc9.?N8nLP- -%B9E0Dgl0t<3#&97n0hr9JR[UK,:m:bEk%,<4-c#TPj7;O;fMu),[b;+o7==mj)f5Ln-Z?4cXe0VB1BHO#k$+sN-.s+-MCin4\3!N4V7]hfG%#cZl1C;k8@0g!-n2H*+sVb]cA)B6[^_"SeDb!#F$`&##Y>K,-!mY*@VL#VaX%+d -%Jk9aV!k\ca7u%V@N9Xf2_2<7Q_\d2LDM,hbJmgd=IE-NH^t4p'E'D#/TOrL@nB%l<`8Q(%!b?HY7[[A]#VK=^><$Yo/-k.ToHW]7nu1.AcMgX:'g>Y-KQ_HgO"d&C)+%:e^PrL3A^0kGtSEZtOd -%Xc>*f)gLpYbT5gLhSo)QRu&`>,pT_"a3@P;$eB`m+EsT4ms>rVR%nUHa@DZ!;RSB)CbAo/gs4Pq"Lh$_#2&2'L!FsHbP![+Pu3Ij -%OuujE`4c:?8aS8La-o_Sq#V'S\H=UgcI+HFL<3RT"\Y@[?;?kFkr#ro6*#9)O=TQ$$:!Qg4[MH@pro/bU%\Rc>uLf:7$jb[eq-)h -%SbX,tiYKGD#Ee23q-*neBF&SBN-T[!&bhd9*E`EWrdCD)SEd.*"<_NZhuKMR`W/J*^O0)in7lWb#S`f\FTf10Wh=lui^u07edXef -%GYS)2-GZYEh"WcU_.I)>$hOk!p#M-l/W(\6&SK-&*3AO$YRP!pLSJTB%tE$u(2TmgP/gnX6Cq;LC:S>),!YT%]b!j -%TK]tr%[)mW8:We(gG2G)%+Z*`k]KfA56:nclXA0r6E>idFG@?F@1j^,Y1eJsR/*D\&hlD>_buRfqZD(\pF[S8 -%E6T?Vh?[A7Jbt,bI3-KjNH;tHO."g@k](!]*)W3Y6eE4G0Q3a6^7l6/KVc")]YiKXaEIQO\W$hWAHok*UKbNPr;(O@"h[@M5`^%P -%FpK4OM+,"J!?,<)o?]&!i9#gJp<6nKafB8?BCao4cQIEPmsfsGDm[=6?lF:HLSU^+W^k$1"/k`Q37qd=E##5CN9Ge'M!jH1Q'ffL -%Bub-[Ya`mUe`iMiO>)((.ci'sN^:YnF]r`O7-K;EUs)U[%l8$9Md^N/uH(3r%i";cnd(mQA -%`OuZ#LV74MkL&sf`N)./UM@*%&oeCrN+KY-o/6kV;4Z#HI2T6",K;+ofe0tpZ2hn4@K';J?p8P-5VZjk=kr]F_(ZJ>-<49E -%g^@tc>-:M%IeON6Z[a,_[u'2QYU9MV=?,XY^V`@l5^j3Np;rfGp"h%_2OM6oVf)4J`R@1fa,J`-#0pGYVLVgeniIYV/[@X#cK-fr -%eIf[,@h8K&bnFKYObG]V3c]]OPBg=i"N(0=Z3Q!^O3r'=<3b.ok6h)j;H?d&Us+n_^nRi+R?VGb(B^7?/DoN]01/`VlWlc,q$%1l -%SZ*)!YtA9b)=!,H(^hs6*6R7/8Lp,0L^KN&E^Nl\#L4.:tL&R5>[FOS-E#! -%7d]cJgSUl73V;FSObeUDIVeimXFL:2hs,:)JQX'q2FDUpa^urr?(59AbN-mi&=0IpCHt."rrX+!C1Ri9bg;a./bVFd'7_Oi@/RpT -%n-8a#O)+B>N_9msQs#[#]SN5%Z#@.u#]j+W9T2Fm>.P[MU$Qb+.#sJrD,Ab9",;?"kG&Q(77$20(SOc"FSA6E0i`TV!1,Qo(-U)#q'%qWCo-.]<-\DGoC?U!.9`:I`W8 -%A3I!P`a+W,fWh_:jVB;MHhqTuSZf6/'K&C?=%3_O6KeIZ?5^RMAddAgOscMG`jm%sLkOLB,dLA'B!>k6E@n,`bXnogFnL^Od#G)[ -%55X^J;+D9kFQ5iC=:q@+e>97#`qU@B%RuB'<-amC$=qrVNo<-t7=WL^[n(Me*T]eiTQC@6LpHdK35FF#8%n/ke(p09d&+HDn:r#l -%7f<9EQZ4.R9g&J@TC9ra5gt?a2*@9l^u,4qkBn%:=6]r=JmVPqFgY7u-9oQkPS2W/U1V#;bKVOd_FcC1iQ.Rc$@CZ#=t+CEN7WS] -%q"!gtYcn;+qujui,U&FJcqnZ,R(FYO:P0CKY/h=1--aBJL,_3IsmQnTRNIM.D9;)YET?";M`KnmD\6n(THRLK*Q#6N-ri>L#X[T"/H1d[ur#6nlrL1Sdm!sVLpg$O%no1*fl9/P\cs!h.Qj,n!fBt(iX/a#7S>2bbP_\,+"'V@M/!r -%s+%>ef-'L"Lc\1<"=FtRWB;qmXk)R=$t(8mO&pS("$3IQXH:"IME<&sRE>/M[-7!pM],^2XVj,pVP$nGT7cJ2nj8^Q(U&@"Hp6mi -%UFDV)(F(mEnQ3M:`1L2Uj=2CPJOm[]j7YnBb_TNQ\2DOI-Sl*;DV#9Of&B8Gh5MMU_m\%F6q'R[,;Sq9L(P`XBY -%"rY3[.?P8.W[""$0tdhGKIP -%LiICY.QgSphSH75#%o4P/QloB<8biKF7:H"@_WqHVe78kg>.'F;s"?YqKGqiR:@qCpjLZ'oX6jSFogcXWZ!9M!/UCuCb#2Y>r)nUDV[otPJf:X]C<_m:3[`&Z/Nc7Nbs -%bX&N(6t=c4ie#U+CP+Xc3.$*;@O$]%&NRKt/OM6*r6Jl+V75en"05XKVTHa0f;6t=5'`V=.lP%$f\GFfGE4pt1A,[gCW4@HiiV]B0"GG,:Zi%7iQECfRp' -%rDPHF>!5=\B;lJm!d:o)_`K9XCKV`pd6JJW`**'K>=o$t-3%5#:,O"2=4bu4E1CTZ?h,7qqrJ41%aYR0rl5YoMeY!.J:pIf95gOABupcs]b`uo3L#-W5S'.C9:8PAe>mKe+YX>qrdbD^nL2<14T2Ol+4Vk:Tp -%$9'.+;BGT.qUZ!*?rSekaU;?,EO`m,6?m<>VR"e$_8/$F9O%*N(hCnq)NS@IPI8Wp&/_%h\dtZ@,L9gVSMX-Kj^=Z,qph$:rJNY8 -%K=1hOg[;UBK0LFUEI^RKg92)&lDP2VZ;)Il5^!RofWd5)%/5g0Wo]jS$W'>&'AQ]ak.s^LFACRQ?ZY0jTn5;hJ80@X,#l1^Pu"PEfh4PH+ki'2fr -%Y>[(odB?oC\\1<^a56M7#cm#7!%1le>@;VI6$\0sr9N\J!5]p6$=IdFBp8k51WWK_3Z!A,(GUsQCl5^Dhq%&e7E!X[DL>6f%>2>.6Js0UZkkg"S%*PhN"`6!BXZ0aEE=QpY#)RY?QMG_ARq*5nTZ>1@2LC(LQW*n6Y[*^T8GJ,3U0gO9;$`BY+3r?d'] -%JIP9tQ\$:T`\3&k7GI)D>OV2!cmFRp32d4$ql;4JC*tODUeHh3K)9<(K2nh?Jg(38.N^N-4EThaq7M?ig!ZVg`.]"nnoG.i1qI_S -%RW*drjX?L=3=+&6s.QPe?'aUMkDg:I]97afhol=FE$k7d\B=OHY]e+^@BH%*Y*+?W)DWkiqY-"^T[4?OUQuQ2b_D2"+UC'@qG*"`>DV;-Uh""Jli!cXb6),d^=/-1Jbo#e7:DOl)=9Wu"$3sqX[d_lJ$S]Ga`#)=(_&YrA'9*urMt0#?q[a>,K\cgd+eKqb=k][]KcYW2.,;%k"@Rn7:WIsboJ8/3sV<"CMO&V6Ol3FCFKjBg.NNgUTWcVh%,iTbm!ftR.CiC/QWehl4^;.0d -%C1>8IX,56"%PsRU\3[LP`6eiE(-q]IcVWS/r/_7U=;:m=C`KgQB&C9&5Z;VT^Z -%&X)[\jbi><_0J[Q0Q2dTat5=_B%>2U4fu_o.P'1)%9c+TY:Xmp7J49rG%n12qs/XAF\$IMJP4O;XkW<="_,U6ec\s]/8G8P!`^1= -%Mt//%R2"b`qZVmk#)GUG%&9OU^Y4-](?2t&P;!."[:daqjT7&;ePG&PLk;gSCP0T(-RTY`U($'`]6FA;=(H5<5kT;/NAR1FCIE5b -%,$l)'g%$@uoKrjD&_e.9>9AK)O0Ng;%12/$ONRhNQPcl>&e?@_'S=QJaNmBXa<4q@a:[M*W;VCuA(]ujpo]0Q+TfYO*.K&MHMp]u -%@H.C^r>8aVj*oW&NidMM3%h1A^o4AB7-5rG*j.(tmP9"ML/j#/AF98Ep>=K=P*Q*gDqE\YaOqd[J!C)jXf]qC[[@g,ld5sAAp`@] -%[0IS%b*g8sWj]VsqO?"ZPYXGt0n/KV*4[MQh9?iM*In(tSQ]b[Y5UHBthV4Klnn."@Oci?u4f"*(g"!KI3l@d:(LJPr'NNN#I9CFL?3-U@2K+BLt9YY9bJH:%f#b#Lfc/OZM$JKRbN>3TQkUiG+PY6WiXG>>S1m*24VjMq:(QQXJ4K?G`)d3 -%!@G:#C1l'q]j\97/ma)F/Vi:8I`:3N]9-f)-)(AYrp(_f\Qnl?\;B%\VC -%bsa`HXlMo#qk*$gf`ErLQ58ihnkoJPBSG?%N9p[Ca,rR6&jW*!1TFLjNrqo3Y&Cbb7J#O&QM$d,N^6Zg/q=l,[M -%fk(MP@65eI9&o6\IB4Oa^26c`br_9bc5<$-<8W]PX#dnBaT>79!IjjDYrB3DR'"CS+K7JPGi[PtRC;>DTq!ZD"*Eo[^u]`,DHPZP -%N6JkW9WK!r^s2nLXR/FVc0@+fBT;ajJ<'HCm:9!RI:rX'J@^S9/l`DGR5Cla+_Gepfk=?V6)`JdY@9%_o$G@Skl5AiP#?ttR.,N) -%fgEg)FUI7/rV$!aQSDQTUC.8Rm=h)tm=1%?/OQ3FKmgQddA'PDt5;' -%)O!-ZZ>/LaA6'%8%:iKtg]O%QSZIBq?Bk*XX;SS2STUS/6jM9/RSKuk,%ENR7J5Hke;uc4k#Zdan&ND^?U-FS,=hj.=,DaX.KK:e -%WM=T279Eu/'!,K0!C9uUp#YGVI^n4%B-$&iH0fF6l[c84cI,fOoj4Kc-/9g_nC+X<5u!*D^KchiA]8oq\N3VJ/Sk1H@_S.L1sB/, -%,>`O[_BR)`)0IAu,n*$UCA183jDutaT7Y/bN&W`8^:i=b^sqa^!_*=;2;o'aMlAYLDkop0`hMuq(o>FI_[aT:?SW.4PV?r8r&3D< -%Q>IuW+I#'lYi_7t0]$pJMXp('N_O75bVaB!gsT*B?s7=HC-\-f\8.qejlp6&pokf(QR;hs;Op=T^jMI6@Ia88HX&^P)(D_[GDATe -%a*RZ1h+,mLn;`A$(;(/fQKgUP3J1B=5^u;@G6*.#H))c,fF49;-Lu^cj3(!?87XTgat35'b[\=*jslW=VSsDUS8J@%1=oa_5q94R -%Km^L.">!?7!g[+F"=tom*(en5'r9!:]OK[\["@ePjTPlb'GiONLu^52T_gDuq".Bi'EERg*lUks*BmFQ6f&8BC)#]:=l7@=>r1eRe)-#^ccF"YH1K(8T5W6>EVY`m]8pTnr%dNEKG-PaPb^\C -%_H;4b)28AXXhsG/b$]OH^9Y$d.o-QPVECsp8'&iTf70lpX3C)Bn6kZW.-]Nlgu9pJVsTV.(&#*RHFUS"dRfk_1\m#WUcH20[mfjK -%9%5G<_7Ja8NeIiaK/ng]XH@%-LL47(*Y]%%Y)7/+XL8TA5g>*<<;lTL`h;!(OUf@2aWD03B_?b+"?+_ -%0hLG\AH%NV?!HGl79F\\"s2aL!^&moha0_]!A`g=Z0c[MJ-VN#/`8)VVXBT.1g?$DY99S*"<#s+aEnfJ -%i:o'[!;@`"dni:lK+p$N!@^-l>BkS,O4>-Gn8]W<1sqltQ=_(m55^^_@\*[%Kn$YXRt1"5/HXoN>m,8q/OK`mJg($4^A?HJqnU=, -%,ikdj(-idM]80bG$!*490/B0JjqP@-"CE=f>/^:*Fs@L@8IqD@[=Y?2\\K9bN4a%_)&@-$Y`<$Xj:i'$Td+50**IAtCt+/Ep?#Ka -%Z31RR'!Dk^lCg16db&Ln/mpZH(YEfUU/5P)5ncMF1Z6oMK,.?0>`e@]]%-]$qIibV@Q[%XE%Q!PjYMfW]MqoH@oHrB##kJuf.Z7^ -%cUbSC!-I%3KtRWTc[\jfmK+#H>"gH3pVe^l,Te4/$.E_^6hH8laO*](=^FWr)],\9V-#q.ik5_^hC&-FY0;/Y\B"oCGssC]"r%F. -%KnA[h16JZ!8h.UfN-s2R6BTXQJJk5NB4.P3%fqaF:dX+U&-CIh=+a'aRfmt=7(s@)EX%nHn951`JG?q5AHXPH+(DL2*R,DHT[,fSc4MAl!=rF]I++,Jp$lUt3N)G0K5.P(;e'^%3B2T]=B;k5 -%@2X7fjT(jqkdh+H3*A+N!\t2@+p%#nE(QbiC^"r,"^!F\<4=3Ip#/Vf5QY+2hPK^YL#"%$I+SO]62/nE1MXr^5&cUq4?Q6p;bN]( -%nYas^F86/-)>K>8R)kh2cbUo3.)YI4E;s;+R:Hm%eT<^dVoFqZm:GgfAWMRm2RD*)5./qgikD^7U'I(0mVk[l,kDcEZ/OtO5e8Q` -%)a>;Tb?0'I>THs5O%lbYFR7c,H/T@UParL3bNt?^WP@,1i%a6X-?)sUPHq+oE5$=SbsZ59`@[@(3p5mC:J&Pe@F^<#5T'kfI^s!0_pA(2rf7DE#f_ -%*&:*#G^gL@4-+NrgN.^BOT(_cogYrLPm/`$/Rp1**[1VpnU?-mk1XWHCBTpN3YmgV,,_!Mn*o3gg#NQjl1!4K0UsnrV,k@FXDSp' -%H'&[#2>&JUnp=-tojo/U3.$b#^!6V3L7H)T$crRjmA;6M2[b^2XJ]Rm`55_d@4!",a]B-/-[@qn2n,mBGi`XfI/q9U;*Q**`;4NK -%?FUD.!1+RVHdP'?%+TF@8o!mE+]uu(%`cVeY0(Bb3I>s4$A3FD($K! -%aj1t[Fg&0o7pRUN>.se)eAo\tApOqP//^5U_+=DokQXZ_K??W_!m#r.'H;st,D5`i*sk^4i3Xre=$bIqt:;i,>+igIPUVPQW'^g\%W:,F+Wn(Upfa%qZ4>eb5,Yrl6AO3e-RH>ii<&C -%=`<2[V5?^$.h%C^$]+e"ku(/-\9R,l[4O&-O?2LI;V,(>^6(WADbQ=\G7rik;Jp]A%/b4Z@GXKjQ?Au^W(EU`1gETo@i!uak;i_F -%T(<(d4%kTG9 -%WM4@(_f(+4[J$?\b@MX -%C88kYP:9BOpVf"dFV,<":MQBYQ.mM7%=U=ZGODTg`d5DePV>Xi^,DcYZXpUsaGc&>hAJ`)E!ck1jWk"cQJqXD!dMJ670'79=]N(+ -%*FTSjq*=]b-3:>7V!WKo%r##cNI;-d1Ou_D/_6+g["<7!MVIXQWgd"-6aHI`>q2;U-f8V*'#.ah6u!gVQn&FMDU,3H9ds3(UFbT1 -%k[4QSf4bEg'YoXOn9sJXH.HK>PR;YhD/*Zr'/(M-/8;s"go0E>Y,*p]be0DQ89`s6&7/t>(UMS5,-^bHbt_%VRiNk?nkhXkNR_lH=s`*g -%_"A%,<-AX&TQpqLY'XppA's(V*BDCWe:Re"Z'GT;"3oBXi9H)>\LZ=cE&8PJ!Zp4Xan*RVAm5lA_$Sb?,A>rFVG6:NE$l^I!r`MQ -%gnPA9B<[=(E(=E%"]Y)X!^^d7j[5V*hP6Z9@b94:.b-]m"DWQkWiT=;8h4*06L!^lHc\)hEdC]FlV>Cn=A*M;AXAV1Qrc!9[grSZFJ4C\3SUli,%mY]TZZE4=TZd/M'3)bncA5ZX -%)=I!?Yg6QJ@%)WgQ.0\?/-[L(RkZLe6b9D=Rd*2(@g2!NV6*^K:OLAL;X0CJ"&/fdLiUD)Fr&@jje+a5-b0VIB%\R1W&h -%(*-eg>r%V"q)2V?qODVJBX!t%b7fFZfMfFFj(AOXF$u)kSrS4KoeqHsQPI5NV,kX7Ihenh3bL.cUUg.TdW5_m`<*&lj8KH5\9IS# -%M`h):Mp1!q+^?S_/URPul\Nh`A4,I`iPq)b5%KM('6BR-j=Zu3)6TW*c!^=R(:eNY,u6(>>3jX0%D^T#ac6,7\!d3!iR^`g43\n> -%CcDWca.6h(a1?IPT'TAVE;JDpKPN=pjlH&n7?"U!E9:jXr,D\+NAGpPCaZ0N.8Jhn -%X6V?JfOl.;]4kFl(#\E$IB7oiSi42UMjMR]lNR!A,;-ETUG8L*[\J**C%$rtV#;hsKoqnAG%uL6DY:&\F=>)P!ou.^3]95fQEgJo -%mgh-8jF84E-Yltgjm6d>mK[.ph%p+Wc!K:Z46+d^2C7A^/`r1#S!'(W?cIij%3kqcW`dEhI#\)$=kp%8.AC\fXi=-Gb+4,TZ1OkJGR*&0kq_)5s0es -%.nF11E*o1f?Qg-Nqt`n\G:^K7(o;@9,4T`.)6ukM21bR$kn]kNrBMhuh!BFnl%*K/JZs6qjXiS#pu-BU/TUZ#V@g5m6&dL:@Xobl -%^!6FeS?/B.1]VHTL&ugKJ/O7P&WB.1h\\lSV,MMoBNSF\bJ[k<2-,I6YWpqpi$kVnluCkXfY$_Pg%p`EB5k1Eo'JVh0`DuW.,P*( -%QP6RXT>AG"]q61c$4?n64iYP_W*I%lL$oE,^YSgEUi/30kqep)@'0qQ>[e;jQ*9-!iN"qo1=#G -%=3B-mh@MJkN_p<3a$457qpN[!2*]>=l8$d7A(p1C3e(:mLEdu-d*`[G;DF=9W^Oen!hN!n:flc=%/c$-0Rk_< -%0=Nh>C+=`?\.moh7%Cc^5i;^OC?#eq424IK-rU-)Ld#1=7Ie6?PTYs5gE.64Q<8N1""X]B]E2fBJEh,PYg,i]=fP(AS78Dd=UJ94 -%n"A`I$n.LpS]h-/?)J?Z6,fh4@b1ZAZ2QNr$l`Z9DOQ)=Ka6LEJ@_ -%^<"j0Dh*&41/:To"f,qB,AJ:YBrsVTiL6=MShE -%br^/eH0&!"b"Y-fDY=>eC[f6WUXcY2gKf>[IBTl$K_.gIApD6Z^h^!A"d*6L+:TmE1Z6Ye'2U8>,6rci5:qrV%X)DE&5\;F9gFFN -%>tH0U`IGbWZg9ION!2>jGB4@8>T\60Br##c`erfin7's,dmM;c?LDbN>A>5j?qfm*f!"1E#[(e:b4)LBmK0eT4i5P[&28]8!k.K@ -%"F7TZ*sEbuT#'abgo[O@!jt-TK%hWFTWbAN[ganB#p=qqY.->%cpDN^qbl)&&)0,jV&Q&*'PpCYKVH_]@7%;#D&H)L'OOsH_sji_G8Lqd'gukE^p++1mq^k8;NZCAJ^a;/3#,0SUI]%#P@\W=@bd<=:JE9sm$BpIJBf96B6]sE5D+se)e9bJE1qo_#9R72%EV^5\<_NF3,W_u>J_R`V)@(Yn" -%l!+Sbl,e03L3^#",9@I6$3`%L$Q8=X;,A:+WU:/bU -%+2^bSW@:_7U.#H*QE(VN%29AXX)S8`HA(U"%_b9F:o!]\#F]].Td&aW7+SWeYAgHNI^tG4)K+,0fnr/<''=Wi"dp/7Qmn^:aCGc^ -%AK?/P!%IZTC&O`!0<.6:oYhRQ312N>FAjO@%aIQhn?@@cMqR_"In)hEqD1h.LDM$<9k?VX[_2NH!]`2iY7DFh6SC\M=mK)CaNBq& -%a\H'[&r^r!`MSU'nGShBm9>0tQY.gWkAe9e_Nu.\@F,K2W6!oJ[4p,--,W14fmJTR* -%[4Ak9Oq/rnPuE[*JE0kUT_atg4H+F'<60b0m.94@>.j+fSB?lMlS4HTE/Qf%h-[Sn_QL@lDIrK9L;,@[1YjoYnE-1_@mfG]o(k9G -%E6YLp#tD@'`erA@_IJqLL!L;oNqG&^VX1FpbC&9Y`E#H%4RU6WbeBqk+o\!;IB*AJhVArTCP5_-c05ToMo&AMIam1S4$,CXeKE -%lUT)u4I&T9k'*)I`;CItm?k-/q^0)hDD"G!u;u+ih-g9RVWHmbr(V!KQ`OBal6U2^7Qp!h^YZ"SRKcEGNNc6 -%:QFB#*NW`QoI$-EnA]DVA2ZV2r3N60$3VqZM(5)\'#;t#UjNmUXT\fgY2eFG87AodLH -%Ih-.?>"[H@'5?1niep8#U>^Bb]1[)6Y]s)NZEVktTUGI'?!&!a]O:0scFdQQ6#`E7]%l&[[U^Y,EQ:D?FU`hUF3)^>1=.!.DB+C4-*1 -%e*FYQSYmRnOJ1DJA:0U)ST4Rg_thT9C3YnT'=&h]Ig56=k*%HnkK@DrC"\Wu#+#G1nuP\$1DF6skb` -%_V:PmlOLnPFHr2$,/.Al0LCJc0u&DG9FH^C30n!#"\p&&^;JHh/q$tM^FE&Do&p-<<+r%gi%Ro_8sH$d@"H26+j]Ti?k%S!VX+r>)8o?JFG@HflTaBJr& -%2sq+N(*A;?Ne>s>K*B^SsH7j;6KM$hsE3+eqlBa02-1n:[Y)Pd0B%b+l)$["*`^dQa=C*C3`j==NO -%CHWQ-b(>fF1ec10KN^t:VJR[ZZNYIL,D3#hh->en'J4mmGrhon9@MqjjfN$d7AnG[$`N;0'G)s&=/Us.+K#D4p#Q[iMpS($]fGsN -%K9RSOFBZ?1gF^4;R!N*e2)GSaPLY6PEAo8!pQ*K73I\lb_>\:qWsRSk5;-&9BYd8*DYBDJOm$bL^nb1icCP?%PCB-_T!2@\dN=4^ -%k"_4Qa<[f<7_6j19b%?k@tGpV>:cADQOTNJ0t^E)?i+Bi5Ag+BCsi?Yb5[[?;*+MO&t1Y%;m+jk2+dW)c\>Ra/Dpi7.fnsEJW!G6 -%@Q"M=C`0qR$asfQb65?s]=jrFTV[:%2=OF,P)SbQ#C,ZK@9r@LFI8[/ZPFQ=)YKLca6PR4HAo*S,JMdgRM4UU8eI!m"Rgh!F**"]T,b\LpkkdGj!6g\_)U -%F/kQ%Fru!I7kC!M>"6VJI:d@;_b'!s-,F^$ELMaX`/XS/p_1P,31?(7[UE72RoV -%Up/Ci$L^dm/l4XPC#VQOL?\j*"=ZU2[gJH=CW4pb!QKksM(6fAQ,[9BbNGG44E+!SGG]GJS?8Q'%9@Ks;;1#G=1)I2VmKB3mD^sh[_!SoOU(>+\)!7U1t -%_8Gk'Q8uI*GRI)."2CLiI&F9CDUIS$QH,^R`$8%Zih^"o&DDZ40*gG4 -%bIZ#I0X`3iB,TBnkToOfb?/Y=dgSPF7@h+"W1r2:F]FKMpUo!(o[XG=7C%R>qd5,qF^\:NZ8g::TdH`JiPtb -%h(9"6dEQ^N/o5In2P3)a?b8VUN5(\&eu^S!I:5hV'faM!lKW0hssI$kcVL7@;Df1Sj&jgK1^YUdJ!ej$"-TTYbICU[>+ -%K^N=V``FTq73u2De].jUa1?epln0+72t8j^"%t3V+%h.6m=p.*PXu'oX[oPLqeTb6f4LFC++o>m&q7JL)[eP]c;q_ulpC5MFN5%2 -%k'i?Fm9\P?p65:`]Ss,S!j:'T+"e=:&eHiiY<:,hNSSPiUdZ(EQY17d(e9!Vhtq+pbYFlpq:M`KWOX0A<@cu;CA%h4YcD8<,"Mai -%=HY9!gKg-1Vr;A6``SUqDlWr&/PeTn1\b@hMT,J]?N.!Ts&X^Kq`k#G5JR6WT7?a-J,&u755hr,oW/#kqSutBnbS%=p\O49ZGuDh -%GGD25(-e$(kNS[6H\S(JRUGP6aM\$k\t?Kc??,m%9*%'6%VU$JYj+L4Trruqf*4R+?sXB>iR.o&i>s[(Cseqa/qMKQ$&Y+IRE#gB -%:+I)__/@r8qm88X+_$`H?i#GZm?AU:ZZ@r3oBj,!0%/E0nQ\M]`Qk5JP=49u%l=1R3*L'*HuSDe#8d)V54$FdYCjOrNhhIuni,de!BmV'i+>8*#\./bTE]AmHuWHW)N"d&+4/D(a>1=4Sd:u+%[_$)B\.b441Z"isQKSWgY%7ca$Sqf`2[Xj,sele,m*@'^]Y*,OX8fF`>,>2ff"D2scIBZd'/#$7=F`rn@uL\0rOV24miY1FTb(0YGS@V;%7 -%[kf:'l0(g+$3b"(")sb1pL]k0gQN)Xe_NYN=$UsQ_R'R"XtS&"a"G_kd/d9`.nC8k@ak/UWUSV-[923na@VJURN\`'K/5\UO_o5) -%dL-hYCQa"k$V'U&1?4k9@E#(Jod$6\$3pbK6sDAN^Ok'r#=*7cmLlcs,-K=i^m!@.QI,=aG0F57P"t*#g&^]s]j%'sf0_elQq8jR -%Eq\H.6up+$b>Kd``kmnd=@:'`qlO#8^4I:uU,;=")(HBX=8k`3hjp8J+SBBg9Ca-+D8@ -%8&P'FZe.3#SmJaZ@Sm>pNNq+*2EA%a,/d^1AI,5]k7^2;n,feS:.8F"oK3Fd=q9>LRWj>#8J5:dV%/3S95!((q@%J2je:hf.I=qe<95S-aobWO7=7Aenq7),7M\>l:MFC3da-^I -%C-o^7@[e_Z3"L*k'QH0p[.nMtncS,bY9mN -%)%EueiH%%lIg!Ud6kOL0j@Y$I6bpTW4-FOcX:<[%l4Q]5WfIo/$=BBd8F;Ci=^5-s)0,50DZ(]ceoBF9-@&]B,"T=.6)?T*eFY=o -%5jQH=TGTX3inVWYk[cj#b/"KskP5Lm("tsN&r=-;LYGjX)/;Q,teoT,Ia26TB`!n -%PVIQ)kMT"&-W(sh1d7)kKnpalYM6oSId@P*T$M/<0Uka!U^9iT5oTdN5[Rq&EuegcS@B<\MWgY4dMQPTkR>2"W61W,hu;"PGdc=-`Q7 -%$H@DBY=u#<*4b7!d4=JVR/[iM51C&@PA4N%0C.R`.`[J*%orQk9ek8Gp43;T^KL+!jT:hsgg@ -%'`mKB"R"p?[QC4>I1DcYWVPVcD`l(UJ1#p'7LiTN^V_>X"2]p>$hrH/]idNZR'_pV%Og7f`X#@E.,AI1=ccq9bL'@):3E]J\qI!1P6kS$D^%M<8^rmuKBpuT4 -%Y*M:g*oJp^\tq&Em)K7R(EA==M!KN&B?q8]0 -%)W*jcCFq^*`We4!I,T>@>6df#2>;>"@62=X-lYAf=NAu*pr,bP,V%Y<]0cSQ=;#YpOhmkgLW% -%@!O+\nb$a"aU7O1Omf`j]A -%WXr#SH)QbpnBKE?3>mgrbG&;<`ABQiKcsT9"gZ\)&+EtJT$:r@"MAhhod!f"s(nsLCm&\`m0EZo2mJeWmY)dl$h9+3+,X7poVOU- -%"kEalgfDI8-b)*u591@7'?,?bM$k@odj&8XbY-et);PP)0*O_BQ8Dh@O;l@s'g+I4]rD+8?mD]gg+Sm#aVHS5U/:2%5A2:t&m1gh -%mNa6u/CjZ`?Flb3,>&)M/UbT)0bt#U?n)VYj]F%:P')(*$'P+*Jf6(SS9#b8d`9lfBg!4K'Q?]d=FV1TalrO'%.C=sE'=qDc8PcN -%JA]2Z?AA[Dg%YutPQIH:!2ulM#*P'AEZ*0p/GHu8BRH-6&Sb0A)53=YFIQ$A.raU?.teO;^*;b=.3tXh9T*L885@&"q-CE3%on3j"[>Jn8De)SWJ6[r$b635bs42NVVq=s@>+=nXYU -%G8C7nKOnt-`e(U-8L[?j=,[mGC^8].$CZ*qYeu@R=L"P>iu%"c"7aWa"?(8^^UoC_;Dpe!Js4%/?2 -%gQN_&C,`cP=)1BVTk,Cj<22[ZktfX9D'0$JX37LA)>+CGLcMMahZ-9OAm-mrlFnBD:=s#'[5?!0Z4uH6j?Q%n,iApteT!9F2hGFQ -%C,Lb29I/8JgXuC.RC8r"MI*@Oj8k`jTV8H^%IVp`oYaeO\?@c.V.4;$Ea&]1-b[sXl\)9W0 -%5TlO\i.;`mrZ%=[M'\&1;aJ>n%JW$b6,Pe$AFh3#P+MZA/N05aj_)Q)g#K`rp$^H+snH72ukDmb>VdqDK8bUsl(A#uV1&5Vg'(7b"*$I'@KHkPT(QZX*iO -%7^fZ"^%i2Mr2H4-[>=9bK7\P0,+f>"f2*'.NP -%Z[sn4@B9cthdHmX4Pljkme5ecf%)E/gK_Gb]^0B`#N&GY@bH:C#D((\#[tU\UilAJY`HlhTE"\+k*N;MTnXcC;D2"VTH7gA\=-oPK3pHKl$"BThD1LS;%/WMV(4SiBQ*`ZKNn`8.-M.OL?j+LSV]na]Y':]L1B#W!Gi5KC!/H -%&1)n,=IP\?$uVX#Fbr7WBXrrP&jK-I*`]5dI2Me*2GB_Y1be347RSpab1gCZHjS(NFVm@"j99O -%^AAGk.li^`.j-@/]Hj=F?,Xgjct`1I!>hh!LqDt\6-YpqrRNhu#m80-\s(Z:nkU]J2Ge0f5-q6nS"Z.%,C9J-.huWVJ/)Md<\L\;/5oXSL-F3SaPG#Ea-j& -%S/QkZ$]fC=;p#/!iVCSPUaW2K?W*_4Z[Dp?J5!HrH,[S54#dNfgV/L5+4)$-_;Z769s_K3Br[u/tB85SCc#hGFH:M#)c+b9ja-bF/Ji].MVa\8ZC.X_6OP=*3c'sI1%jXqBm2*V>9[+B6FjnQ!^]Ik/f[MFM4)'N'[XP"o5,3Z[SHB2ZRU8K?d3*W1J1k3^,B&cHq)eqg0gi3W5RGi,U%g7r -%3_Q2JO<"mU9.-Bgk)L3;8r^2VPWR>pKH%'S9a=rJ65U7=LaXpBet+NCaW[LX3Ib)8OC?9(X2A>D'=-6__:8iUYPb,+$Rh2R6h=MR5C=c1MY%jsN&Vl?O#*Y+dt62+MO -%BN9O1%C0UQm^k4CWGa1F=8uO#5I?4>041WVMR"sEUD=F/W+^Q&/9PG-LrLkXTfV>A>9m$%^'`)?_!&b1J.iY+hTEZ"e931jJh.g] -%V;0:EE@<\JqDA4&a^X%!s(m@Dk,H%^s6C3?WT#I']df#"ICo&]FTtJ1bGGPZBP#o)r%L+_S,6#d]g+/F#V[M4b:d\'g7dFaDao\G -%lk#jjVb+hPn.8eg"%]Fk6Eq8!>eeBi9"9&m/iN)Ul*bYbMX5:k>SM(2!rkb%Zg#t53P`4dN^^uVWC$R2[> -%(2_Z(1#5.?I25YS,SYfGH?G>9Q80^n5:?NJ=dH.,=^qV_%fA7_[;utMirROo$O#'kp(i@jg/u6=i!jJ9qW]#3\.[; -%&7WJ^g_r!TALcJCe"UlMKi3>e^V^0-8p$!h#IYF>j3Z1)"LM[V%m2GVu<9'KofuT@q?Dhd('hqQ`DB.[&?mS -%+!sHuk8)Fu#5)Y@-t(ekgQD//q-d$/CeU`S52!MtUdF7K*ZOiiPkX1GpIsa#?p9eqq -%Z4A,S%;S8cR"C0\YtEHLg4(=edrDGt0A"==nF:D$($6U&NaOlMU^*V_=n9XsK0VJ1<)o90aMj'E9CU(qfS+U(WPh?bPA+`o"h=AC -%dD?M"OaNY,6HM2$$fg'p/9[r@_br]^"2j^HgBq/#EnPYk*/0-A:%Cs_GV+%n;YRT^Bo#U^NKK^(/g-XW-4k4Ts0X'':3HZ'I.L3g -%2m5BVj[Kc!YDZD12RER+^5R4,Zo,:N]TjA,@LH6_^U$G(JEA^&XqT["KUT#.@5e]jLsQX(3I.0KH5r/&kRns]=BH1& -%itE8G5mrL?nokZjQpg%XhG@IX)/fY[RJ4o8Usjr"&dr6Z$rL+W$Y-Z_()H'&f"tO)<^[O*h3_C6$BKmkI7I_IYK[E#!3Jc6.ljW9 -%5]:/jV(8/Bc>DaoNnp^/=2(X)6pSb[X)'V;#e0)h/SX:g>'?JChe4$sGa$u*IVA7>:MiWH;/hHN$XuC5YA"H^`bFC3YT]B`!=lQa -%8q2_i.#G'#Lf1A,bDl!Cpf@4.$4[GFIo['2!BR;jX[srcs6t,PleS<^muXomHDVbmCmCNL87O[2*V^QMhqB\/EE'6rS*MXS4EN,j8&j>He?$FY`cF90__Wt -%HVsu1?i`47aJuhR4QFYRV@*..O+)=aDu8/aJEnb^B'M&J(-e#c>T1n]-8r834!)ZY-_TRpBVn.MKg`k! -%ieIu/Uib7t/.ge>34r,\[(rZ&I>F$t,*:;(UT6>:5E'"Q;gs$7l!XpK_b%!:M7J'C>hqAsUB-m8c2]SN!$VWe6+Q"9&/em";Xd(P -%`I/(J4Y=\;qa&,n@sV=>0i-`9V+f\KbV5L0nqn=p_.9+M\pu3cfV0-WKle)K(gjgZX`G7/6+Tj/S[KkClXdI(53<;C:Fmd@`(E5# -%QFJGY/c6?*M^rkZ^/OS/dsik!_LS9nTOe<<1a:TJ"qVinM\fYVYkWt%)0[kHfYcTpFQ6UTR*;lc?b.(fo]+cgiJ'F -%:VY?r;8(=e(;!)9K:8lt6h7fdUUFD0K8dM3#0N,iIpHA!Q3>rV`_3r3*M+L[(Fs0%C'$/#[^4#]J>mEm(iCc5`*eNi8_;eo5!HWZ7/YI-+ -%gVGrJ'57_#O(oUu58CG!-4s>ir<%LNahX -%jRr3jG!r0LV8nMH2hmF-^N*tU[\O%ffCf-7;]`nTOi4Jr8,KYu:F+G,I!Ri11rDhueMmNeZl"o&J>FH_V1o@kooCQe61@$*R.G\G -%blUMW/>)gb\B@!Z,JM,-HUGofS&uW8olMiW+i.o*?]Bkr-XcWCked5P-c.u -%91C/&7)Wi7Rl3F_?1)PBBnhc5.GT*@2gt9>OI7NpFX)//G&iqD/^FNqibJgu4,=oF&[Yfg]C%l,+\bdKY6IZfjad4$j9P)NA`0D[ -%_!GSojC=p3U%k]/]oc;:]g9RT*eRodDE9JLMf*>l0[Nq.Ge;8AqoE^7JYVh+s'Udo`aamrcc3Wr)7`d4a`oir-q+#rbMH)D_35;' -%:RFJZ@6IH9Iu>DK'A:8D,dj8Vl.aL?(;8lON0KE>:W!^7M0I;uTjT20r=ad1RGqS&cuWt!oN-P:Rm2;s`F&Z$^3t>-mC2!Op5cua -%a%ua*5Q&FfIf8NcDu]@ZJ+;d<\OQOAf71"(qpg1ErBnWns6DoIi=E^&rGV]&+91iJ5QBlts5S$Is7a;*rBL5Ef=t,ArVRJbs8INC -%bs24+T>(9]^\n35qepr^:]L>3+MW1"LMss)Vr,[os5IVeo[h]EJ+]F?rqNdKqWm$Es8KLZJ,ep/?hr%Il!IcXTD$$Kor%,*r(kqZ -%r4a'?T0Ag(3pF+.kGMcMqAJb^]52\_cW_J,G@oct1u09A)>?B@Au]n$.N,:+VZK -%J58PArcI=5OehXW;C&j&arnM;6(Pi381%AE`uafC)u%kLL.Qt* -%3jE;(TR$&"baH@$GtFqeN8gMUTZ-Qr5:TL+O*P%9m3D@_8j]n/U\pua[r(.OIU^c[7"dqlFs -%j12Af^r3$ghP/T%4kXBVT`6n,$Z>UM]\\_,"b5c!pED10"3h1M8PG%:G;R`GKHl@?[T#J4)/udog:#IiE -%1q++569fOsY^=u^OdaOJc`"'=7u;jZ50D9NLKtb*q.JMoeB9CEp#hHA3V@do^qNNcj^8<:4giR_V%<$s,)qdcM:ao.roQ.V6#80@Mrm;Sra'VPG]XALO@3 -%VfC`?^9iK+-cp?%W23Png04]@h.Nie^/R!9[".o>ZdgMnA7u+jKRe$aceV5`UlS>bo,oUtE[.EOBL1,+((bLQ94j=7;^B(LSS'0# -%hr1Sc.*o6/gK:-TWCT'JC2a9uBGd^[N-:jQ_H!5[a3f*GJZ,!/SnUQMbmJU(SYB04BA;O9]"Af<1HL$`hN -%Aq8(t'7M/VtfGZhR -%8B_(dS^8pRGV@q#jKN0SY?9e]ZccKo^_s3X?3,2:9`")HX,.Y/*YRA7C>CoWD5h7>r+Re92pC[Ce^1_.Tk$H0KL$(u+V.n_#bbBg -%jqU2spM52b.7ddPemb]=Eh)bDa]DR6SI'XHBosRPV]*'+A,_+;J.-[VR@;(`mAZ)5$SN&Qtj+#:r.L&+3Gun'?-&B0.,%[ -%%-8k'nBajSOFu/+cnpn/V/1p$CSn-s@Z[T73h\d)!O*>L8sUh2^m"s8!.)Is?rM&htk-AcB_(hS0r -%YPMWpdBKR'(jr@Dl][Gp+e/-[W6tBLpO9(io)=OiYe$2X@)qO+`' -%;U0Q0CJb#=_fHsnjdRmUVV/\QD$3WfLO#hLgSg!co).m/1%u\kkf'=jh0@MXt3q_BJ>i$L7NLnujek&a(,q+W(p/Ra.Yp"Tie:/J!o+2Pb$LM-@FS/'B -%63sPf"Y#)Bo+G)F99^1J"%i%]qYYAPpN_j6i&6X,?cG48YNS+:o<;hRI@Z..Rp3SPK9sJ<[L#0VE]T)4ch6",,JU(no6%`=MjB!m -%dfpnIj:Sg-2MoOm9dH'&;>1/eo#^!t??LB4kR48--(RP:HX'q@TYW6L?u2")Q1nWm\-t=WWM+O%RQ@=/:P@955//)07n:k#W_&@1 -%_WOe??D,'e^er/Qm[tiqS5!.cDTj+El/ZMR,-4Sp"t.N1[,P\> -%?2G+6iFuffH#^VVd#.h#cbM^cmGR*kY1B:r_kGSqq&rmRC]\\eo06Iu6H>PF2G&nXNV]%sY(:JQ;FX0ArS_LsPH:Ge&TTn0n,-fQfS8DY)cmF.5Z\N?0a.t3jhop@nS2G/jLZG)h`a/;+-5M:cO]QT%o;-(bC01B+iqFrUF.-G"G?KecO:'Kc[T7d -%aJ+OK&JAOeofIalRLT,b_a=([h[p\\!T+V1iZ,ZW3+P%Sh\@4'4Q2nS+C`4ZcOUVUK^T6\R>C;='<-fV#o&eXmg0_sK^T6`h'VZ5 -%_F=/L^FN]6>?3s9AAgq,*C1n`nQfQJqb"URE5W:cB8;N6@=D#AaJSGii?OQU>lgbUF8.a=,c97B7hCMkMr,+9@RA@a"Hn!Sh[rI9 -%&`4D$8BI&pIr8*)1IZeB=NU,N^FQPL22=CT[,h$f5-V6+>N3]59FIr-=$+'$06o>VffUroPUa%$)&JV_d#5N[T'B(C!/ -%n/?.`Jo'N,L/dPAd]AoNg4m?eTED_V"GlsO@*?+:kh.^NdL61XWe$-m@_hjem/nIR/i@6'FP/)DbC0mQ3,+1b[kOj[m$\t:T\k@& -%)a%>IXPeA@]\N^J"gF#77m%'dON1BW7^R[8>\p(1?)/QS66hd/>-51K12l[[U&c)Fr^/VRJ7JhsQ;)&1UW]V:6Pa -%`M[*A[02l++C(pk]4\hp`_'#-d_$X8@_06+-9uF^^3I8lF10=0LZnA8ZST:KSsM4a61:$f%:/`?IBH1dHcB:Ja&Mt[j#%/K.)G%D -%cRcjr&YW+]/+3uA&Ff0HC9l5?a!]W`rricLN01]e[L/)jDDYt:hK?U0Ci4BjD\kV\GO"2S<8ur@aRkWkb.>=/)VS!4BK$PYD9juJ -%pM!EHqhi=7_.:0`X!o4XI7)-Hc@0?#2-XUnhU*Vkn` -%kS8eOk!!FTZ4LWT6L(W>(@\/P2Ua\9JAW/%e\M`9HVcV]AZRipKqQ;Y*oL2R5R]8$ckaOS@u\d\#f'P`W`-9ndh?9U-S'D+9Jn#RU;KLkR*R*BCD1Q0NaKiJeFhE4hX.$Hls>J2p3 -%g1U^-nb^$F'gW/=oV"F&buX!h3YD2RKQ.iQ=)2Yb3GlJK7B)2G9>Xhn\PF]k&Pnb(M:k%KXt"&!00gp/XE!pb1oAZ/CmH -%O!")kO%B#1nC9K;gDloXYF<07I65h\E>-n\det\-kW?(:cCNbTD8Z?qH5Edu]!@jGecMLJVS_X,T;_0X6EY-")^/*J/'&?sn"?.o -%W[KsI_$qrBjYWPnmBAANa27?q>U3:3M^LVo-V(R>8/6!)n3LqR^qGEPAt1iTHuhf@:XA66Pehc%[h[^dlEI4B4TTC#A=V^IS)Hk& -%CZnAUEncHDBe9Lg1$6U;a)f))df_dY!C,Z\u9UR -%eX<`n7U]eWl!K50mRB7<>!m@tYGi_?MphE,fa4c]gTA/`_H:u8oKMp;f`ol886.1.qekpuDs1bOT>kDHh.,58UYFC5J3_q`JdB4\ -%S%X)7/U\NN?D@dFGO5jYhD%JjV+YQu== -%jn!ST>_ffGZ6e^ak.RaO@ha%7^!*$*S4M4?&*.<`=r,0QaeQUs;00'c"[+42ouK=+A@>"rDhZ+t3@(TUb7`ZUE:J3L06&*NGZAE/ -%U^Z=U)H"+%d/;=5_(D(FFd*qbp2,@,kh=i`Nf6gumq2t>_lV\_W%*)4'ks20d, -%Ie[9B0B>'!iQ@=cr\4l>0I^iKH^!uG-i:G5D-]?]!MjA2k_gpY?HU"0T?%S'ls7T9@>g8%B3du0O9Wr84,]bP(2fhp3[Pac/VBn= -%R[IBe9H9e6*;M!qkX^j@3ftZ.?"pMhXtiAVH9A!/m6Fcg!s/;G/128if@0=lQDZc323kUo\,WjOV`lbSS;XLG-gln"\S0u;P065b -%@Q?T>-eNC[.Ou,$dt2/[G2pp6J7qDA-1M,s@]&-pc#$uY5SB2o:)[bHJo!H]o.j.EH-fQm+_fABGH0lTWmS2,iM"*.FnGO69_3U1 -%%7k.*9TaS"E]cE(/W-Oj%8saD5Dj;`4'Xbm:.2n6%o8/oMPt?W,X:W7ZVn7nG$g[Aqk:NsjWqrj5,f/!knhT*#kDkg/[Y_GWYQ/e?sTR/b_UV4OFU-Ib<:G -%nq;Us2psp4E:B,.is+8R;i_"i7'oSp2I0g9:*7m28q+"'d;=,8XU[C8PC""$GgHG\+`aVC/7BCkPn?cXZF:'XI3Qs0X;kftrR8Q%G^g&]+e`iAbcOJ&NE(VY;@@U,.K+8R_Va#H#!NjN1^IUZY/;=ho'^Q!?DA-#j8.-Y\_0MhKg0B]I['f51"T%^V%k7a]Sn[2dL!qcpkT:0\7`$$#u0:@@7*hi3]b`G2^X_b;p`193N[_+koZ^OP'\c&W@IVW -%T.2bF<1mmhOtGRhb10EJm"rks,+^3-cW.g%(W(Ci?[@rD0DkV#++O7dJ,[\W/Wp#s#2u135SX6r3-*b$a`Y3*^Ak;0s&:mWNP.m& -%V";nIfOGOkd;AOCKaY]e"*\[GY2&j_/E>Ghk/S;8QI5"sZK3_bYI -%dp(>HYHU5aB=ctOhDY&.#KCKtO<63cfflRUTPhd>7lNZS%YB_?APW0'Nt09p%R?$F -%g@Z)WfMb`[Km?$S_,VsuSO8HIo)mfo<.2$]Qtj]E9Ug/Ep^q"o -%2F2/FjTM,mST_CJ3%AYP"15j(bI]=]dEdRa_A30-!H8PbV=`6U@S48Ei`0.m/R5AY^1-Z6+:(4sJm/!iC*%ZAZ-..V5K\ -%>+o;oG[/8nIX;O`JURUPFt[0@$)Q=V$@L?LCfS4PqCVEnlEhJ1d",Pcb^4mZ33XS9 -%3Qk-7Z[9&U33)D,lQL*K,oXA]9WiIAp,Q7+n'Td%6M"/OXO%XK!/4:;16kI[U5Wt'9hE6t -%kS",%:IGDI9DS;GZ8r(?4F)fT8!]@6A&"@gm;6RTLo4nr7u_b2_]S=70Ii`QplA+H3\4RX5*<[Impi]H&`)f,Fl'\m$s:PgJ>!0> -%gt'(08VVHV7cD,:8b+)a!-,Iam[q/g8cLK.\bML)]!obG): -%DZa!pR[3FIYtVV?5*M-R*^-/YK#B6*JVN&L>,_+c9t!j>$a=MTUonH"oSqpR]VUENZCeUEX0ded:$5h -%8[q]GZSGPpHa:VLjM$S4M=B6Ec:ZA-D91dq%mff\1g&1n#*5(jdPTS+i;s0Pdg)R/9In*/'W8KA[X02YZ@G*d&YO4Y2S2gbcrFcL -%TS"5Ck'[h;Aas#/mkN46lc&hU9#BqI+@sHWWKhb1Hq=Pm)t_O*7D,g,.sJ7//BVju+4e>1SB*&e%G@eaS*se]0'"<[%:;Qj&P\jJ -%27LD^1S[e'd4b6uB%^]4gVs_jXtXi2A!nF93R_$Gg/W(75nt2e*XTX)*b+lJft/8<[,/d*0a`\5n(+KeQ?N`q-'0`F.T/?6FhY,5 -%g5C3MCEmKdc&`ZHPc%"M0E1)e55j$hs$9?E:VZ[OZ0hSRLL:)D+"nT45Q'?pR`58as7sPUs8/F;Qe_Y2-s6?oGbZqB?eQB5_lmg# -%Rn$%1$u!"Z0KZ6k.pN%T7E7O8:/BnS_,^q7CNiQ"(O4sh\X2S;dO;t41[L?Mn8#& -%*e*k?:dqb^JKqj1\Y=WYbs7M+S4RpYC&9g\Vs]FDl;H( -%.28!$l@O/Ne(.gRdT/jBU[D6l1+ET#k?f=^FD;qKnVZ?AMS)sk6I-5YFOI`bnI!ZR'X`V1XKiuEa>:cJffql0iUc,_tcoU4\_#5^JH"1)r9@IR(7$LG-_ -%W+e1,@I[S59g;Xu-t(MT#O5O[4.r$bmHpVDTXhXc'lTeQ`;Mp&4gS/O;/7V[5//qEj4`bOq:g(m=be;<-t@lE"HUf'bC*L%3qL+s -%DS8"'9hYLb;LBLU/Z*5)mI8%3G`qr,96@[):@%2Di(7ekLd^3&PN_(tNYq^fVn'hTq -%/9.nZNg:d?&TNQNFdZFX?u:<^SVmjMAnfTr,%@2pAnYZ)pJ3WN0sE8ei<*h4K48nMDcU2D/okW6`=M4t?1tYFd*rt9o3WY^[tQEF -%AD943+0!-:A0$e%jQMS^Mc@,3d&b3QV0'k?"".)aVSk%AhF>S_97SH(6L -%eH:H\M..4dbl+*fq"isW"le+'%;Mfl"+6p]aNRDU?iYK"oJ$9@_6=ll-ibZ:/S=2G#eaV%dmRRheSUIeDu=L:2(B -%4O@ZIgBAU.8)'^qp?G>KYbEsoW6nOX$.'1]#_*tDB-*0d>V'EBQU>E@B%E'CW/+;g4MIWoj[lH*mW,&#MK)drLf=iA`\)fKXPFI8n??T'e)rHb7nt"bNK'Q45HrFpB)P,&/6I"rLtS6OD!u)SF$)nH@S?9U3*9s+RU`PB?Zn!OhrcEmokABlYMKQlZBJHaYnVEYW$Z_2K0_oG6gBV4X?C$=&"h/(sHA,7.YRN -%aNP\#-o[TK?F_<&l.4BINM?9>>Wp-gK_Ra,!"'X%JUA5MERp*"$*W](U)5d/8Fg9p"e>dX0&)m!nV?F09#82A,$EO)pFRap[3!U\[W=nknT4E\8;'G&RX"e -%bMf9,p:.LeD$8C;n!b-2Fp9G)C)Ic(dZ=d,S`%=iCj9<]@6k@(%F^Is2Dc7#g#i>c6oel%*CJiN7SQ`eA++C(C@$N0bTNND#;*l+ -%7:_cOkm/__n*FdDH@Y>uT^YO=`dp'lR%INpe*!tlgg::lf%8JS4Ig&^TiN2-+0F>dBitGdF!DA]*'CjZ?q2tQoj)dgc_kk$;)Mjd -%@0M_3f8*L;_&ffNf8!nGKt-jemQ`T -%@<&".,[k,t%9-+jQ])&HXrZr)'U8s/\W'2=#+cBeeLuJaW>5 -%\4shQVm_H12(@^iVWp`i:mI5CAdi9=Vg?3:LXW5&S>dqcCeUZr_: -%8.2KkrDOR$DT,_0N9GZIJ^[G.@u3(E4/$@KQu8lA"[d7L?Ep1JGcW'ug5shHqD'+IJJ'cCB.uKKII]eX@%B;+2;4''S8"Cc\tLTL -%$VP`;lH#EieQ4m3.(/.PE#o=5Kf-40K6=f1;"e?)Ts=F1mP/L%%^T-k+TRhS6qdj*Qj#E;^tAf@%LsDP-W2E72Brb..+;u,%."J8 -%3F/c68S:9nM"JePab<@q8Q^^!F]lN9*Erag>=K*#S:>]H(nS,4&-_qrCc(h&C@:Y^f)=:7BLo,Z4k;rWQ)XoT%BsH0>;2.\P+@`NC -%0)!f-5\@V'-:/XkR`4Kf%(t_\RWnGho;4%(oPURj^!*fa"T;0@,t_5Y#+)45C58C[i,LS\L8S%p$-^)_Gl?=`/@#=\,*m`] -%APWY;5YL_=bcr_\f=c_Z5i]0N$U(WKqF"b5>%k4pM4kRp)KCuMmbsIIW\-1'l:Nf;*1_k3WPnUGq:DW&(P5]QU7gj6FD6KI]@KQG -%.,Fiel&,mP=AhC6V#m]HArFR:C+f`VkFul18Z%sB%GUk=V=kqM(ufpXnt/%a#!DmSPEP@.?gGETSU!X5j=th1fc6j)PV8.3jJb3C -%Bg)qP,83GA#.LTXp_P\K-niSA-pR2/MH>CdoMVgO2B=.Yf70(Z]Z+UHO.dQSqkhTT6H#IWo6AW4',/-W_kH2!oDc1aWJ"@D1]>L!Bc3Obb;N[_e*DjRg%Eo[:ic39s# -%;;fIdEe#271R\k8O_!e2**R`$>F7D:/>S[+6_e4.(1K$+U!gZVBR -%-UhM6%o\O.KO#sfB&L?<^EV=O$D%*fWd6L^FC(0$G4u2YB[UR -%bhg6-%;1f?CabfQ?+i%\-$g'<>H9HWL86@1;7,?.3?c4mgT-_AQ56i=\6<9L3l`6r$B(ari>!R!>&54aNmXppFaNOIVeoHLARVD9 -%7uWO(7F>L,U^m2:ZcIBS]B7re-UnY_@#acU&TPEf^!&C^lgI6TX+j<]r&Ur\4S5cI!,0II-Ngn:`K%eWIrbmrloU7 -%nMG'Z@S62k1G>%@CiWF+#JS%\C5&]V*IoJ8UG)lqMQON&X?dY.o3c!OnhXqoYmRGb"M1#5#0pbk@uDA+mBZ[^%jU[m3`S@bNgf49 -%FN$&E.pL[PdA,f$VEhlOl,JCi\HdJD#3?Rh"B9Of6pm2u`_/S=!4>8e=g1#_idPgk6,`s1WP\?dTWSh`*E3a1@66@Y?6Rj#)mE,M -%R'Ula:Si?="g#-/4(O625p]eS.Euc_4<-FrST'Jo7`.Xi">SZrY$]G?kQ$$F'l%ajdf6$1S;hL*MJ;Lg?!L$BfP=>I.0&+\KV?X:.[8ge(6j`WS#=jnMJ*:UW-aP%BR'Z@f31?r2>D0F+q<1".g -%ob\.=\XrF:+p'<'&@!C(hd@9])et(CK7uZal3f.DUfku+/0C>Gm'.]mAHq6Y83s*J"\?]u/G_^U-F`!`o?t"`_@GQhH4Ug]8./?t -%U&-N@Q/D$3,`iV)< -%kSi$5bpFRdXaICuF:U56$]Bm"4V=?t5SP3^VE*H?gte+$%hBJ.\*pZ"9RCW27cDU>NtZ!6`D^`3g9H4Wj!"Mj",j\"04&&QDU$i7 -%V)+&VM9*'^J@N$R;`mLI]AcJ[nggk8QtPNfbRdu]Q=6d6A1ZD-hH$c/"i)c7Ad_mFh%-j@HhTW`,N6HQg&ai;4iM\,RV$-R^@Eq= -%Y@j!?05S'CSeo-&_QuSlJg0aEpKa>7[9*S&Q.#r6Cr'.j.?t&?if!sG\.=fUB["b#a\[&OKi7WuOOPJ.I:`^uU!'+(1(;]HL8N]. -%MIJIX]'55?#O#b&Gm;F&HH!`%$b@`n-e%4>#d)$VQ'E:2Bc:s(o5%bj@P*(td" -%o>6W).4>0T-8FjWnfMU*6Zr8KLIKc`pk%#5C*5'G"_W5^cj_h!?apTCQ$`lm[WN20#!a,K.[: -%5jnQ5n5`'@0(s61SRM44Mj7hl_Bi9jIi12\$GTRI:LQ'.fY">*is=,pn3"IsEslkTC]_p6ib7bXd.FN*ASY=:Ane68LWJ`Za!57@ -%2F^p3bmmdK'W]h&3%`p8H-h*'H*_e=<$`]uJicViS+ecTRZm-77hAhId\I:XnC.#QS:Zr=RYQC8dV[+u,IR,_?raBDg>c^)R?KV= -%U^65F(O@pcm-)#kC/XS<@jM'Gd[13T$,RiO8F#` -%roOpE"'.!:QXIrIf->\'_K%IC1lKch5LtpZ7sdW5Bk1Z:d$.F"eo$M>*b?RPq&$30Q6pQg1A-%XlT"n$ -%f^:n&G)L",;Y!;4>bQ9i:[RXVe;_&&\`.=R`.-`ip^MgnQ,5S5[qbu5nRJaT#EdoF3*/?3Y%BSY,)8',0_1KOD2G2;W$ZOB*; -%fX;o6,OFd)YTm>X1R3&?#59F)Z&e-=,KhB]?dm/t^!J-PT_m9$N[#"+]5Qj$'>E,%!AAPCE,$0W3`W8sQB)%$5m!7qGP@Pc$afI1 -%o8%L57m-uI>PLQ2XK$afFd=6SlU"iNa+>H/JCi`PiT"5(.B<9k,&)l*iuC6IMlA\+Wa\/@r>SDfk4_;S&!ZZ -%/!"=aP;)O40ZdB[0rD"L<&ubcm0O'c(K+lV$_a#%Z?5f`5k^*k_JPgZ_>63H+e[2"d_sG%M]5e^"1;>$&:h>0eV?o>/Jr);N+hN4 -%Jr\B1a]][@aEZjG/j7sP`kdm7h^`nm**$qlIRi39@?6B,_dCUn0;RZM%JVijm@8V-;5T#hBqqjaXES*/7Vu#i`f;AM,55,'M.lB!1ARel9!12j$]K:3&Gj@Ka"jXn$F4M%B$e^B\6GEDLNBR*3"L6E<4/S& -%M[<`\OEHJ2^Vc&bLYi+^K9baQY"tr`[BJ&4ne"pgV[^uSnd:Dp-P5)BQkt]7g5K!Ag'VLCrBt*BT4!58:.AL5oVK0agj86NS8^], -%SMfS+C6`3W0L(NA,ZT!goO7uH8fdF:C0aI*hD2A/@d'PHSjhZ,Ws#5n\Y8YFG,0qoVJnWbWGW\fEl6/:,@=g8WXA6*>4 -%S5KEV>f6.$`jmmP`/u?2Yi-%cBsrTu#mZ7UX9$?<__.bO33_q*dQiC%i!DjYR))s<&Tob>;Pr)=(@(#jCP-ISeBR%.&/KF8[p=k, -%bEG3L?[S$uK^V8acDYaAe.EP*B>R=$4YdLfCC=8Omo@[HS&%Yu;E\FEbFo@XDB'+3>k^,*Ct[9kLar,r%%F("g.-t99E@j^R:f-F -%'\Fp2d2YGn*rU`IRo@p=XS5YG(7[XI`lt!'cX>Z>a(?^6q#D!l=?l/d\/B@!p5E<>)@UCqG7V-?@\u<%Qkc7KOo11Es2c(:.Q7Ao -%>/&a89IFH=gmCRG.$JgoJ$mCWk/%oE[L(LBkOgaQ3 -%[[kW[.\M%gMoNR5Z8u"D7_TCH04G[5EgWaX/HnWh3;F2jn)N>,XR)aT2$jP$XDFd4AB-rI_[=R.P?C&/!BWWhiJa-h^)(SfL#F&c -%:U*&F"Ua"WPa(CQ_F,L-13HFJ`XWO6d?A_r^%ShGArJm@bK,!@l"sc)rCQ!*"n6p4Xq0e(1IYN4X^e7Vm,j0^#Nd0kSo/r8\Q#<4 -%?#jQV`G^gR$h)\bkDOr[!8O-^Iku*a4uQ@C$&mWq]qa/ursd.:l#q'aaK?MK:M=*oct&f:aghG[S#"_c>2d\iUi"#Xo_)<=nb$mBb(:67e^SLG`qpee.cPs)(+co9/*cYe+4/qUp:;_>NjJQ6Jqn@&2u=$7h8U'SZ)Vc%,FLR -%%SJuR=S?cJ9HDpE4DQc-FTJ.7$!i")$fD/NU`/*,AkFukr<5@g8VeCq@.Fb$&W3[I2\*-q3"QB+JG"@.n'fL'HJ"`W:qRX#3n&T!2#&6^!I&fKPK9Ke@6"I5nBK1AIqq>Zh/HQC@s,Y@>/qAi&!6D,5ErZ_OQ];_)a?lLYR -%+HdZ+JdSE+H$cFCO2o@hHN=J5"dPZ@Su:R0^C_OLk%??gS%n -%G41K.dmpX1eiWGp\)X,b7KUi9VYW3V&.Z(8h*;6tUsIq'iN)fUXscV0npOcBF@8GX`#S'*97eTj(2,5K52hRDUJ\.`rX?Z'pE*T: -%X(KFj3!7!2T'-pOM+\M-Ve*R:,YthR-t_ts-'-4>NIou>/i:rp]JQWmnjA<.o3n!i"'?LU(Upl2JFq"C6=_C@#jt=R_IX,&@V'Q= -%Jld-PG[+ZZke#)oS?I%U9s[T*7qu$emp^[1fFcsu[-pT'S#M_HoH[-I5+\Ch`cj.U;D8ljdT&%N=W@/.l?q.BcCgEN^pdTu(0.M: -%3*%%O6!I3!q]QG]:?W8so<:,i:2&B\.'/XjdIMmUIo.BEN6ogP*RS^T:4Q,ZB]h-K\m--^0Mm#5EohGcYp,%%gjfR<]Z!nXL#O:1 -%]M"FY>TiCLCS%b;[n&tIm;#pi,q`4l_K.a5cc\HpY"OWlc\6`ffdu]AP_o -%aeE9[)(loLPe/5qP]i7#KSr\q3[+uC[KW6Gck -%PjWL(_=,)A-OD(p$GE4SYlk`5,-7cH=?84Cc-Mor];Q_oUk!=6RY+Y_4X:k!fUmKlhJPc#?N3rd,s^0gNj4+I]kA-,U:nfN?A;6` -%e_I';DHZ,)#9:>hn6O.JD3nnJD>JGMWNXtr6+=%i/=qH(43]b7^@.NFPFM>\!'HZFh1I"rZ'HDZd0@kl5:R6@P+GXsYA?GmQ_Xi! -%Mjg7cgNT<.p6`.!J"_$;\?H['V4.N+a9b&3MGN1aIN!#`)Y"C^g.HP.#k$3J'#oi%4k -%4WEcCII*JY(U)h5G&NEUD6*SHS7rGKcLN)hd'UjYF$5*uE9r]>7rN6b#d6!*+eO+KJNP6aIn!c_HfU,3L`dZ\(1f.@ps[!In6;#@QKN:#$@KcPJcB -%XC7kjF=8lBh8ZEp8-cXOmcDVd)o0I0qN)t3"'@o+=bSjYK5Y;JPLtf(A=FN^NQR"]^S#0QqJgX$TA9!M'kp\d7W(i(!F:1-1Qe"mR]7HXh,@7&VV?-4 -%h!*67=B(O[7dfN\j`5Wre(Y,mS9H!S-8#M/.\FZJq83+^l5me@.*jKh.'IkVEob0aY.W`+,(0!IdTXS--6mX'jsK`./Rtnh'AaG4 -%kN:ql?UQg)>C$:<,uSA*It+u;C>N0b&E]amM6JqW's3omjB;1VXX"+++rXf -%c*(?4nMmRNFXfiu]5u:u^J`OsFnQOeSLN6)!h?Un(3Bp>fs^_^YV4n:DG3%ZY\'+2io;ZEPSE@=E)kU"B[!XDQ@t_eJX?3<*J+L? -%XH2OJl7tVFc/a;rB4 -%hZ/WL3Wnn(f97Uab>,ZVQQ>.Te9g_q57P&AEu++WAM/P6P#]*J)n\id",@bq#u_i`f:_k0i,D>O%S2LqJ^-DQ'>Ql@oH4pBTA":` -%1GM^.dj-spl#-""Ng9:opLF.&(M60lEQ*de`NIi*/4ho-#4$8%r`hLU]ROb.Ijt&Gp1qhoaub2m.XHD9QK<9Not7bff$L&grSi03 -%7?+5Fq)7NXW2s!+,jhfF8j1iZ!U)%p"lCN#m$D_C/mF,EYAU9S=F6VRp4h)%0\&\bo=2q7>%4gF"-C7XWZ\@W''1]soaUfW'UI[$TR\>B'.6$o)MJMt@GCCC11XnKY6QC=d4*7DGRm8cm`5[OOP;$<*(T -%kWrc_R'Wa!G@MXMN1$8(N?X2fDV)#XS&DObI]FXl=>Kepem&FaYqs9&g>GBY,us"#O<.3cl<6Vq*hC-XpL(WPlb1/!4f_:525hQV -%GlB/bM_AK\Q]o,WCt[Z#F!#sRMN_:MXRC`\:1fL8$,QYK&T,>Y]gX=?q.[XM?Cj -%]0TV:?P3qtn/,Sj8&5P-kd8p)IB/hQ#\Yr5iAIe)=UHO0d&fM0Vk>@cfm;^q+MEMP8P@l/2QohPSEk/b^O*l=g7B;[s'OgV7aMQT-1n/A$h^0apmEN?od=2eMqsT#nf. -%GG:`*\6o1?&b_g^,ZaE1]Jgm@cermaiWYJhX;#=%s-uYRQBs*$8Fal>*IV=83KP\E^]Nn`J -%Y05n(g=cR\A1)kim"PDeFrRk+gXgeb?BT;Qg-1(YNXr:Em[$-!P,)%[e],++oY9RTbkA[J0-YL3&8L;0*n^^YJ5MeTio=/oIt*:4 -%^TYr(Ag7S2s'5Qb77lmLp7a$QM\@3mIK&1(I5n9o](]fHZHh_0]u[*l;F`>NcuT$)/IQW59uUM4\AD$80`4mKP5Xpi?5_(b*P -%Z#`5,PF\M)6J"C'ZPUnU[''YOEK^NWig?9<=lCklr9mol!$5pTQ)#U0]'T7i27%TakrhF;IUIeU0u"MV'Ld9OX(f43"0-q7ZJESS -%*c[.=2Y,VY%UGHCnVl3M0ig.U,KXP"+XKgW;Vllg@$[lDi6F7HV4DGm4lSs6;L7sNY?]HV5%:d*n*CJlr)&h^m/7q#%S7;Tm"&Yq -%:#YVlC(ku_rV_8'Rl28#]$sjg!>1Z%UcWa!4,klsX(V5D!7/kKdX0$j.Wdc]nMefWEO6KL\4)[e7XotQYT[nHn.JR"da]er=uR87:7M*h#%F*V#"-q&H.!cjk<%Z$TSd8;13Ekb=,m6qIS"+r`o -%[)@U";(ZiBOh2`1DgT4d>YB\f6D?3!`TZT2PaG\HD2Yj9kbZ@IY&kUTa&]@4-b8$']:q9nU`JPB6Tk=)V4>0H`u]3*Ks4p!@&*ol -%D9)\sp!&@/_Bg-B?h?_Sgj1gkDsJd(K'T`33?)?m%/hJW^84XifgYb:Qf/W_rCWn!G8L,a*kSQc$/9=2*U>h?VSFd+qNsChkM4(t -%Xp$Ni790#IY8HSHZi)X\Xf`*`;FE\m:g@AB>DF0Cuad`g%Rs0$IuH-nR#S -%^p'7rXhFGMPC.^Vg?*MZJS/aq#6BVIU0'iDQ1Bh![Gl!'6J@Hgr$!!&pM,0gFC+GLm'quan]2(LAVG&XI3Kub6R/u71C5!p:"1\HWEHHlVAS*.A2,(uOe^\?AhR6?pia0H6nk+(kGHTF_K*#C+PS)M>gG\l+Ioue&V03m(ebCQ+-df`Np=`8 -%U5k*U"fgK\"S[\H)TeA$CB%QAE:4Lu,cF=[D8nL+F0Z,h`r[oW__c_gAlWL.`9)e]fqe$n>cYt"q>,$OVb`d@o*rn_J37.UN""7+UARC8,R`!)'>7I7XWi6CEFr -%S_X^WBnoUAY:e$,@B7uP8g#.L,+$,+F?/7J`s@l!cu3bHNkDN,BsNT,_pX+#'ZU+>>VZ)mru]>BVuCDZKb!M_+ui#s`ab.a;&cNn -%9t5,B-h$@Z/%rjh84'F];a*Z>'?;aH9D?$nkX/?HP@oE[njGr,Q/Y5`lp61dMV5eCLBC3:>X4%^)/u5/E=j]YfoeKFbcV`0mWN46r^@(#;/Kb@F3BqXDR\+>O45@kg"\QH!^:aU@^bt,LFCjSbd:n%N[oNCr -%`%fU2SMgq2qmi=+.h1:>ITmXFeG.p/nEVCDUuP(6O##<70BA3Zt@fsh1TO&pZ-N$gK7 -%3bQJDbt(<13f3Mo2(U-fS'>PMggXGu_g\s5`\us$R_u>i^QgKc8O]mN8Dgc@IYOP$?10?/VEL??Gp-(3$7\Ho,#Y`kGl3lQC45Cj -%B5=B64Z/'CXj]8p80+hPX=Jmh0-*/DIB.F$S[#KH,(_="lEDOU*k[XWhJEQ:X1gaHMhU7:3Nc9[.9G1d_Ue-,jr*T+4l4b4)HP!H -%QBET,a?4ot>;WI3ZRW)#6D7O1[t7A4N&&/.>o(\kE3Gi$>h.%:iCgW7BgJQ2%]/-b-XUuJ*XReNEnS0`AfF*nAq@-4U) -%=(@$WY>!Bn"^SZE9HJN//(8*KQ`^fh.Y^@+ZO8m*^I2ZdKfjKb*e&;qp:S=Zmb=4?egVRPkfE;fDC%FP9qZf,rj&*n+(UEPHgI-k -%\]a+<]X4"D]NK_4>dR!oh9-hQ[p$kYkF=j#Gb$NA-CI)PMq<3^AAhqnO0kd!&q\Z^E=q>SN\u.2D`$U!WZbd/QE3]^C/r6aSUQ)D -%fb\PG8oD9;E;Kr@EgZ5=\0TK&Wn3"=06Lhq=HcuOE\i>IXNmJ-MsRce-=]Mm>Lq1^-U%.^L24E91BBu7kbl52rp[g&YO?Z144ZKV -%4RcjFnnpfN'[Q'tR:qRpdjs+b0Ib`pe4Mt"V_^-s_rNid,q,._ -%"suVZ3\5NdfnCCfJoe#Kjo>_u2eK"4?/aldN2j=@&atPi(-S%@a_e&^gQhTOj3GqX,!X,qFomPS_]#cDH]Qt% -%Id,])NPtFLq?K6T0rYC'`A.u=`7Ft&S?*P:m*'K7ZsQh8/"3Q\3K:-a=ui!qC+DO29CW8Hffjo_,!ORRNOrZBc(]Rsdm,Q1PJn,H -%>V51B-ji&rEWRjj2[1S&L'3]USH/[W7WC*G6BA,m(DeIqd9SGP`k%+u(=:]&u`*D5P'ZjCV:M -%T5!J![*`%/o1TbAqGbHm1dbj/S's&WR_ccP*]YVBjim-J+deHGM7C+]dLW!>+*74=CVqt"/irbVUum!@a?KiYAi=q0m/"m2cn^;* -%m'rF;NL(D-/BG3fT=l7%TFdt=gmU4H!SfoM#aFl2Y-c'hN3Xcb=[n=(a(,;^:e_5QZA$l4WOEU"Pum%UTYQ^S2XXi(dbN^Ao)7"1 -%/hAi%KL76T=GI?qP/[3p!)MGo&"T[k0[j"sb'rWQIJiKY@6"<#Wh.A^<&]QFaiod^P#`?bh_u325]5mSS40]k!&![JMu<=2FtXXE -%NnSF'+A;N*P7!JL"[.@i,/Y,)lYH.,/p7i,7*#^96*4LJ/b:%c;cTKHYkjM-=!tg3#$B=Y,8/e9o)GU/QY9.!XV4kOO'>f@`<*OX -%g@jLZT`e!cjQ393L2IfD$F]=:B)_\[mX@2%QZQ!EYA6d^;l,T=]"qp*,[cXn^H"D3SB`XZI)iOq_?,)jW[\Ygl9FY0g=6/jG1N6g -%;kp3KmIG!6"c1[tf,J#0G:M4[-C<.PkRa&^E;(D0[*#PFXscPtrK':(al8_SM<\ml%e"P:.?jJ/*s.2Y3Yb_lEko9_>EdmI%[Q(H -%]m.D18'AOl(1'p>6?'U2a#kk&f&u`,D-NtO]5j;apio46[i5r)\Fsmgl'%B2OKhG0"4P\@Lp]&7@fa-;n.=u-EK"_Cnq\dZ\PY(sR%[keccs;?]HFopi*r?]77*N*h-sF^8'iR#<\:A#^1e"!.8g4[\&map5JO<]V%aGK[ZZK9[ -%`piJ5?ke$bbtP3GMm]_((7S)_"a2,abbGpL808n>eJr(2c^=Jd%/12%Rua5hp-rGP?QA<2#hfnNG5U()>-prU"MgTok/XSeWA<[L -%]an`s?sPS4GCG6pN3>M#_Z:nmBLQmm(4!I2%UhYfOV4WGpXffg_8^ik>Urp2]8@!QdSBsu-ph["Rtd@UR-c:VS%7BXEq_b!mdj4, -%,m\D%ne_*iR$F#%F*XRN:Xp=R#7fjo4`n/2#sH/thF/l(-j'W!NJ4,[bgEIDK%;)XG\!2*frSqKB'"["X/T=)TUj=ON*I*+2Lsdl -%Mp#q>5baj948Rt8E9q/7mZ%0e*_VqKC*Y%M5bBgQMSjW\n@Yo,ej\Ve--W:CD#%L\bRO+a6sXjSLUj!HV=&F?Dk'VI=F"3;95A8V -%nCCIuga2p(d][ta:s%Y%*4.M"KW@b*Eg;Jhdj6Ot\dXaF(XEIHYYP].cXE)#3HrJTb`fD%Rj6F+ER:_c#gWp[HtXiaIS+YnK!#eo -%'I#R!qRU:,_e:XM%fCT><`l/ts1pe"(dEmpOlZ)9j+#>jOCMIH8o@i%6oo!d5WGICTE71OG:c'b]qmOsAR&D@!%MIBQ -%>2)&`0]J87Ofm4DEr/#8UD:<%He>bTY]sY'R/9s<&nJ5>JG$*+4-@`n7.Q+!Ht3S6-p/9YfGf0jFfA.Q\;4D+_5UD13eKb@46l[* -%V&q''.6*O`_Yu)s5QLe2V-S"ZER/8[6+CRdo2[)H+?fY4;/`YA!jFMM_R#.,8Db26$,R/e!YCUBMe$0Z<6):1qmme=c1d -%,onUb'Xd)AqZ'RoGh#f6!mPqsZ?R"e@M.K':V/mf#!Q`XZcR8u:l]o8CsIOa0gYh>]^/G2W(Ab$Qp@pq<1^l)kTcf0(O+7YM7O7q -%9`T+/':W]sW:^X)\U!H--$P([K*:7_"Od>\q(NH;P0>6L_>[Q%bkfisMR1iO2[%"<"#sTRd@am8$JtkA^GE<7M&9Z<:7I_^n7&:r -%lY6/seR&MK.02j0WBfaVq$j]j=%bFC^9*$4Pb7d]j>Var6s0<.?u\g]K&-=cR]7VFB'frT4/QA[g48sSd%fO)-:f*$>p=ZtB0jFK -%J9eQPF2+7lH,G1F1,tJQZ[V+!RUAhu^]25%:(aE\u3Ps>!A?Ip?dI!O6!YNp`KIV6GHYhR7B(-f\1/5`)[8ZDCioXNk]5eOh -%BW7_M9(Ln09+ektp:e&d;XCUthO,1^5D=T%/T'4KQco7\7jh%IHW=.,8\;d;C"kO=1(ro23B22F)B\\iW1?0JLC$u[WOW0-9cIO_ -%,J3`Q,HXH`-X>b-dO%(M]RD;$ZuEkX]+^^+%2Y5c3/?lSl$R307SjAn]5^O#EY#uqQT6j*>BgWe*Xpb-I*c6:l16]9N6EhiB5K_n -%S`OWHkoW'F+VL_A^Eo"?/VU6;DoH*UrO6qX/iXBIU@liJ=agYJJtd$cY6(#Xek4I]ABe6d*JqkrhYbmkbZ'M:/kuW&FP@pWHU="j -%BN/^PP52i4`&Qk`WqfQnYkLJ3BX[.]GC=)8J>u/W,/djMqA48X`9Zk":S^%*I7XG.YAqpAK -%Ou9Qg,6bsq4^@kNQA\(2RS%N_A"*mY;H5A'a3\DVD=).+2Gn%kOtYTOBc^EeRILL7.o5+WnqtX*/89>0;9Dl1RVDVgFoB*4jguJ9 -%pTfEmP7ZQrR?hi!Pn]#p?;+n2R-;&;s20Ntn#pO.I;;kh?DI%n>i9F6H,^n9qWM%[4$8YfqrWO$g6 -%0QMaPlZU"BB;>akg3HSK8:cmef<-_C')_&pqR?B+W(nDG"JSW^;bp6G3+ot1"GtBWGeHd]@r;iV8F>WtSSO6K.II4OX/lD9ZAKhS -%CL4sbFQZR-tEo'AQ&*HdJKp0iH`*= -%f6BtBL/>Ve5m5sIGtbo>1U-r) -%S.6lZ&]D9l%7#LuZ&C&-]d0f)a=r37OIR5#N>9n>#PVHHjl$0>6nk^XO6#qp5!NBOV$LS"B%X%)';G95-"MO6hqLGb-6QPuV=F7+ -%&6.?.Shsl:rde?S:o]hsMEQm^$+e6iXEcqsW?)^8Jt1aqjY9m%l1jgk^,?e_pB#[RTWZ-F4fFoYG9miE!Lrn/* -%nEG?[JCUAW(HEgU1-,IY\#e-u9Up%%G)313V/Ye^Sp-crJm$Gm!s3:joO(.WV2q$eZ>NB<`+WORN\#ZE.Zo1_Y$R147NWD<7r[nm -%HEE-J)XEs)@2OQD*M]MC;qdm5BDViXR^m@O9>jRdHXGcfi2R85?2Kl9++f?Z7p$G[aSKHio&%H$M+3:ZM+=0G)Q.ib?26.8C$j:D -%OA?AC.re,W:pu+V(!k,,(_s.hWN%tFG5g-TIg/.b:`6=l"Y)kBaY+ssl9Bs-ppns\+6(mJ(O2=6.N'!+]:B>ELRX.i?D'pAGIl", -%Ol]u/Pru>2>-D^H?Or':'f>5j#8HPU`GY?mK,UudE*_/`_$B_e;QR?=r9QI@%9sFSAA)0e/]\L4I3eXYbEq+f)8iI.ui*LqZI2(QAU4I[:boJ:)UpA#r3%9M^nec/sU/V3r$j([kU??^/tA)Vc._n9j$@qNiW -%AfJ_Qg&L[!eS$5]n@We60p7@'H&>'Abr\O/k#g_ka@S?>=krXK_J&RVJT?,9V`9O^*PgTR[*D/T)GLe -%S]`KNRj(Z,BeWJAh./D6#BgTZ(ja/XrRT7]OSVtV_>lpBT'M1FJ=1E.Q*(Vu6B#]BC8a/$7!Zm^nbgmCe]KYN^$8AEqt]O/[WSfF -%MToAse+-O?htD"'*kl1V1"TEGPh;9@Hdk19+ZOAo`kagoX^&?EHpMer?S0IKoShBo)3rH<;O8oL]dLib/pGr6bU%eiXNhJY4i%]S -%C+I+sS6g-.B.C/VcYP,Vd0#K+'+[XEasG1<[94dlpe'.aSq#91S9SWss!HPh&`8p.rN:53S[GdK,8J]7K:'0*.Sq<1\$dL2I[HI+ -%D;F"m&aTpckMjK>6EKVsGhG[@]D@;ED]ah&_O/e.h07e2C#q8UkVBDIf6=&:@^s8qPWdX\D>FK1OiJT%9g\`8,52qa%OXN,m/uUV -%[dl4J^J]t>Jf"3Om[?MQ)&dM70[`3G1b!)PEn#C-W<"8lMH"9!>2aMmY^S63Tk,1]A[EQ`WhPJ1$S+,f)"+!Qg_VZO>hrXBRoSVt -%$.!uI/&BRY*XktMf=0@Z[3)q"HArV]&,ts>X?,aOp[RWPRun_2"$/'3@m4K!V&7`7;%P#Ho4'Q`!7'k.Fmm"kSJWop/.9E?r:no8 -%J?W]i^_)pAl/"Dp^u.,j10B&m&,;'dSM<8OoO=lZ0KbF(1`kb`+LnFM0(hd5iWlT7HHeN\?TK=q.9kXJ)<&LJDD+ -%T)^0B&N8#qV#t0s.e$m";%CF1OQF^"f1^trjanRN[--tlB(G?#l;.aZ.-2pmjC^cgaW^'7('/1M53mo@?n1$l;\deO+Ge1'<*4f3 -%5Q(^gYD1V_l&B;s9IlGR3".#I9+<)8Ot?;k6?%h3jZ^kh9Hn/KB%^f,;:g`P$Q,(3,_A@,#N#.bjVXj9h'jbJDO)B1^W^CD1^Lso -%J(!+*Cs_EUD!ZmbRH-G-p_:!DDt1baG3@ZOj&I*(qOmuje-q*T.RD@d\DA>jPK.>NZY(@u"GOBY2OJ,2Zu6*"j]Sh0_?cAY"0j`@ -%TlH&rW:k5ToP2k5k!&dM?K=SAYRi>i0I!%cV)%B?O&98#ZYg_6HJ9Co*dn*nileM(pT=Magl4`VVqdgKb.-Rm8elf&K0du*+u444 -%=B+_P%9Re%E:jAd*`9TYl.HD5&uhPgS_,_,+"O)0'_@oK5/T-(@fFB3f8SZV=Ob32GDR[t75_.3&JP=A;S9^I:X\(C[c)0F3h&D*(RAM.=/_Q(/RkN@\p92uco),l%t4s`pm_bV7nWO?*-,fOo?DW3(E\[0_H -%$4FrMpsj%1kZQAkM]FG0"lDnX@Gj^:Ef&WObPDk -%I(pK'gdudVio(sd[j3NAXB.?\]&&m+hp)r->e+L%].t9>ocUl_^&LsO^@0hc*!fPmqU\A`8*aXkbmSY@mEEP)X&SFfQI/WaCOY^. -%=2m=q*.Q]'LbDA%0X[Ve(9;7`G>(6hcO0_KbC6p4%WfR0?PF1FVYph\fI-KLN?/lAl4PHh[Nfmpq@_k;&RhM"I:Y'SPRs;@@%ho,eXtDo>%$0D3P/(iA%"1[TmVk;l2 -%0;X6tZ2mY`C<)O\S1TR.j2k?/"piIeTl_S*WWpt'&D&gd,X%s%P%[eFfHK>ME9=DsA8G.0!sj2R6aIFF`<[,2Phoi\n*HMSo:e1t -%BKUGi\&$`,@5VE0OI8t,@*u'[c8WSIj_d:`A$+OQ2EOZO9?4*[2t"ubeN\#Y+b+%c -%4bC"%GWX."PLia#,#Cu'L-%Q1\\+?-e6`ES@jO1idX3q;DoHC`$2&;;O*`gPSO*mZWcb&W5C-'5S5A#DQl9gih4mciN5C>RXQ&?H8pmc`&"!=X,K@Zuho-IHhM_aq32bPb';R>GG>M[hQo`LZtGH)bQ -%+j9p$rY04ph9r7&W(W:GcIH7]qV"=e\6>_@H]8[p7n:j%W_BX.^L07"]_iFd2+7>Ge]QP7q0Sr#fp, -%%)T/Z$eY\]GibVLrh/qIKM.CYSWW#Z/0Q-XU-2p -%9=-Kf0ijt1Wqh]'?oui/>EmZF%H0kI9Q+s+3H@"`DY)"n6+Le7f)XKZcoA7&WK(pO5>[qiIG-YZ5!uHHbNDY*u;1BI/`+Z"dFKfLTXa4Z4+5i(:#OB%Ot1(H$iB.;r+G -%oNE==S&!t\#29[_Up9YD6L]et:=!]bKh!g]_$DPI3iT*_DMip!jbsG8KMkdjI1+]f!E+RV!E$iJ_=5"md$#_JMmIr04L\P#TB$Bfqdj(lU1Ul1h1I35Ya/"2o-c0k@ncNQ.E:SDY`a8_XEnmXkrp-1Q9AOrQ?Zs5h2T(2Q?u&% -%iicHf,TLk.iQcKu4Z*7L/iGqK]@h1i1j`o6Ziur_Uj'k!Btf!h3/KmI5HpaAS7YP:@(68P-YJJ.d#q -%E7WbR:?>Dr_J1M&YCpifF1ELX,tD6]4W>cl/C3^r4umHqY.tB&^Y'`nq5YFl[@[>!=X>KL -%q[pY]V*[!HH%"u+C[cg-`,ZZ(gfqmkMY4n@U5$ITO(aD9t0/3mO^/]_-Fk[fQ"X32bBbk^[ZGJ<*/PWQbC(3#-Dq8F^#S8X))l^ -%cpt>7P5#"UCNl`e>8%"JOW)Re&nVB@qU_MF8(_D4+E%VmD_UY1r))9UrhP?DKU9AA;C6_B.6I#lG6,=0KV52,eGobE#6QOR(t?/V -%aq4'0VPtThgUT;MViN]-"erS.^p=P4D9$T"qhfS[eN6KT.i&K.9mp9Q1.7s2^ZSd'L^/BAXEE^(hNKjVmV;2=OWq0hufsE"l:`5H!q4o?NZ_\ViNbT\"53(Na;Y9d&6VLr*C6(6h%55Fto1%%g^X4g4uj=UUh.P]kjReFDjIPo+.,1Y8X -%XX0C67Y,>A0s`5V]F\_ioMTH/@cdEbI77)hBum&?K6/Acl=$FZ>K?G;QGYkF:A"'?"kQ^(nef)JMTi(:&I4@O"8iF?WC"1Y`oO&P-GA,>#uR-_ZN0L`B/2-7,H?77Qn9` -%poNoELY[JV^pT5pIC%=UW8$%nM2aekp0sh2>7>I%qf+0UH^DNsdDIDgVI@M!@g()$UPMrF^Fkqljh&'D"W526N"MT@AiB6n7_W%N -%'hfjNU67>Hr>L!J)S*@E$ol^$kspGHL7H6>)..as`F*EJ0PC*^I/S=AhZEu+j/'L(iU)6n$SjU#/lq"n(E`cqoP0uB>XBcY/Hr&9 -%G4SYk+0gKoU0Gi#ESp?%'&;`#*ar,kfO6Oee%,_qDU.Zo6G"l1:A,hZfF5tfQ^DA#+8-k\G7:MU^EJ4k4"[n#j>=*r5?70BZW3u/ -%XB4[df`D^hVX!/SKU),0jCH2iV#XGs^Z2.7O)@+Q_9=G$Sn$VToWf\iJuLVMG!"aqdjh'tg;4T*JOCIN]*.ElE+d@$LtZr0d/fA)W,DFJg<-uV$^*cS -%ZKYmG7[7(iHek".+)sr:`P*"5bD6&a1AD3Gj<'6SD4RODp\PQZ/UC[d^1U9jih0Q2ZBAf*0&!tlRH$p2%-m.r\!94N>G_%q(>mR4 -%>PBef:EFk&\tX5dc1oPTUiAA=XJ6[? -%p9@$?j+Off,*K5T,nn'',9[$a`BWr7/oQU,EdUV[r]]$TIQ3N-.(Y4Fl(!nlQB1-QM9`Ni3Cd2jZV<-9_',q\SJ>#gAfcGk2^Nb1 -%&XN"rKB`aNdb=)0DtsZhqtUY8>&#BjI@V=#p-1rap`?:F>"#t3c!3)Mp$qG!fRC)6pJnd2;_*F7O5)G/cITr*VL6OX3eAZG5#_,& -%KV*+g@LHuXEqPX#L0"*J&i1Rf=4L(D#B5fh*P,VXhEcc\Ds>ElP6eY$eQ/"j/0;u5$ijEiE&6N0!$hZ?5Sho;(N?-!YdWlr-P3*D -%b2.qTG%$YRe0cZON)a13[]c=Q,;i:@YCll)B.[bL:gP6L0ZM8mc$.(N6rSQ?WfVP:,uCoF8?tjnSCQ4NDh7/8TI9$>h/cMf!l\)r -%+cqi]5th>lO;Vo(muG_&WrV3o.lCHC_f64.?Z4Nq^H@H*Om(6mC1DXc`'M+M<5FX?Wh7dY>1,Qn?#]R*/&PWFT,@"S&!c,d*8IZN -%Za2R\95PiX([#$(WLZ>4'TOcTXXdu__Co*k>"^ak**7LArCHhcTKr_H9uQ&i_Or%p_[/,`G"CqmRlsIp$:M:8QlWg?MV])#M!'os -%+3o"4_(EN%*1l%fKN9"KP69D[6LOARD$Ft2iN=UA3]^L@,4Cpf&Y]>7NO'AF14tmd'p$D3Elh2L=0A4F1HMC -%+cXf+n*fCYZ5+f(X'0@H^D39>T!lM8T6Qs/VSl2,#OWaaA5Bc_\4i@'58BcNl+cK?.lF1uQ=_5l.JpJ_FP:_QV`/473AF#+>S;RR -%lmfob5s1M-(/#X87D=)uVI:dTcYOO+9+ecj8\SbY#u[O$p1`,rfG0L'WsauRR8QQo(=O]uP'A6Ul&tFsLGTs?99'rJjQ_3Zb>^6V -%0WG--(,Sg9X!8GYRD:Qt,SU)<.;!iE(XRlHjfUDC-f_RQ_QJ+@VD>2(>M0K^N;fpN/7r6j%Ad3Z,%+.p:7r -%(8=dHQ."dIL)jAg_`;;HYLGSjM -%jWcHGU-%Qg9_^Ng0I%BoC9:C@fO/l]*:nd$fW6].P5SAR/:!O`VB-VLW`[M9$(2S5f=fnY3QArGjt@SnlLT9M-m]>1ch:S^&M_$BfO*:+C;V$'c> -%p3bP]7B-HG+%2GrdsbKnPLsXEja)L]C@Pj\BTLgW5F0NB#]&D,$#n.LW[t8BBU2_^6T*dE[-TK/qsLG2.NeI97Hb6/bh< -%XtYMJ4(WSt/b+7nacC:SnG/#h=*t=f1$h76U-u*;gdUW1Lq+iRjtajtLjiWSX"FkAd12J=fc0A#/Y@K6GqX#Sq8$Loq+*M<*YpqZ)%15jX`>a.LQJnoE1,rc&Po[&W"DW9^DDGmAeas0M -%`_Z2mpT^76Jr*0&Y(*afrU63os*1c,Nq:tQs4@;I?Tp^Sj,a65s8INIO#U2;o7+1HEN?H2jp#*A0.Wd%R`a$?DT\QY+NFT5J38H]67$VRI! -%)63(;'f0)i_Bktp?:UHUcldQgaL[h=qqW+@1hm!lSs8CNDeFK3j82\JkS'EDAk^O&SKX)b#J-@2XN>k_N"5&D9g63VB"OJ -%Gm6?5mbp,j(cbnS-!:N9qj)8Qhnk]<#epAr_g'9mMS"MV_'=jU]!*/nDCn[4S/%*/(L-53"SondMG-)t!\6Ura)6Gp`\>2%=$KC_ -%H4)jNf2npPSsuFQfGZQ9kT,eDFfpLP.gE1bQspQ,H)>F/$`K__/V?b.`=(^[W@fA:X$>YC%SAo`[)r;VcAWC'a6 -%V5ndJYKs7%LV?)=>NnjBD::NdhmL1p!-_O!7buH/ek,hU.HioEs-i^4D\7'!AN0:-PmRW3,G-iNVU)EUC=8+NBbZt-=>a/,LrMP$ -%4e'J@U012<>IS))BRKB$bPu7M<]e`\OKe=RJVFDe1#*F$k3pOI-2>,<99&;<2Pd%._c4X\iO;0qVQeH"Ph&&iNeg[1Z#g_k)g`5o,$&"FF8Lu2"T1:iR -%C]dKa/\pj[>R6\mCjt\P9(kYT'1eq0g,'u9'4UtnfOWqUWN0c7X1GtZ.5=mOoR@2VM6J=>jG-F$6]m-Hk=SM+GnRQE@!=h&W/,FF -%Mfh@tBd`k;HAF^%(dWAZZF9J_BWbR^N'S8Zl4?:p.e63*'HQTGaQO?(@ggHB=G?10C -%RQ]ENA'[6U5#_^5%WJ8V>I5nCpfmkTp5D&<.DN)Do;V!3*^_*8Vt3[pYt,/M,_4goTTfC(U,$d!1gS?Zn3jUVO]tLHEJ%ij4g,#X -%oOa:0*H6J@#2S'_`%nO94!>(NH+@`,iJe8h@HMD>N'SVdQ40)Y$9H4k!5S>=Q)UC=m%AcRSI=U^Asp]\Efb6G"$.k^=g!n, -%H#\'^6S-+>?nR:fKo4kJ\_+T,&F8Z1;$E3^WC5Dpj\OS^KJ$Z4o%Gd@/TUB"nDeEsQhdOhdqfA67eK1\QRLk@[&f(*k;)QMm1qNp -%2\_m9eU)pIk`R?G4G1JRmJF05I+bHCHO>o<15 -%^67C_G3[9m6"nn?kI"a9?p:h8ikY?:jO1UN4M*4+aGdg"\Am*EF5n<'W6d01(9-'`@`q_lSa/N_Q5hXE^1X_BS%lFkQRB -%5_Cb>he'UD1lk7]WA@dqB"$P7G0W^p*=J#j.qO>ANZZpJ+3o7,3Hh]W[j`WZXLMtsXjHC>+f0OJLS[6%jm>32s@6pZ)C(_RM#FQ>GT!s#Z:gX.c0@BTD/O1cHZ8=_>bpD&+e,](0_g4SB$2E,i&]kYho&;3@%6[m)$ts*[Acs(C9^!hPl6aU*3d*GK9c"mFtWKuLO=Y5)W\I^GB+l28387jtko:VBo$.)MGK -%TYB*d>9&Bt;Q;o_c,3R6Wi<5gI!O)m1_IhPfPc3HK`/1%%$'ksO-N/A'iY6WLl*k.k -%"P%c\"1A=:!-+6?.;;WA'RY`>8[Wt];;mjtF9"TdB`D1N(20_lT%c#a'Ro7R-+:ngCt*t4.5,=N;q;Nb*4;^fr:g\RklcRG:JW;` -%_,8GISp2M4(0&nWi]89"6/aY#Vj_A_%u[uT33qn%n?L]^.uY#9@C=[L%5;=hi8mJGiLmT]PQE&J1f-U5Md4Z&#em3dF=&`TLK>B# -%1:Z"9$O(a.&WFldkMO!*6BlCu4<.jX8KX!h=P5*S$+@g#k'Zq= -%<\*:W/nmjZ(^Fp%-0)dX':=;?R;bPg@h1qmEhPd+;_qs`h,>H)37)jS]Y& -%He?u:grcZCDRR6Vi_u5-rn/(E:@?$?hu7?BR&3*Cih,!R;"qOu4A!8ZZsZ>+L\i^_8W]!' -%o0bFm&I\pbEE`YXmC^URWQ=&GB/b!^9rfmjX7&.t9ANs2)Yh5^1j#bbg&'DffLp:1]sL>F%FTqX+OR,EMjBVc'NF)n%$u_mc;ZFt -%D.=M\p!(n8pQr*cJJZD%%\Hr*U<#$61s\+4ifOA=mD??ggj/OPl2H/!n;_3Tal,5QJ\s8Z;2JtQdgR'\r\@AE]Bq$gk"h\H8qZ:M -%&W&g*KHHerd8r?QY/gBGJU&-fH&*4TIFZ@YI(O:C9A5&]JOOJD@4Q\h4b3tl(AYDKWuODhp[s,3rZ#65[m?!-R+4j]!%K//_.Dg: -%0,Ic#(W[sDO&ELq#!JhI<-#L7[e1_g+4[R+Y5d1;NQA[l5j3eMqWErpnNS\^B#[VHU&-a*"/C+$%-e-UQ8NpiWlnHomG-$OMQ`.I -%;\P_K4OLR^XNIc>lu+,]ooZlf2Apcb8DYq'5umBl)ns"Tl$"%rMXn^#aZ[;KVH<+rf0JcMAN*9D)KqAISk0<\jhOKEeZ_mD9.nn47mTn2",,;.E'`FNc>dK32UH7[ldrkf]:6P^2mWl+10F4.O04m*h8!gohAB<@nfM9/e$EBPmT[2QEl1]GUSf^TP+8L&aOI(h$YePaTOE+)aM!Tc=Y%7Y+H`RBQB)]h*2&(.+O<<=T^-kT_'p<$Gk6u(ZB-+7p4#.^EcB/VZGqK]X]/bd^R+P.*=8082_g,L= -%#=VFM^h28M_*TamGi#7'pYRQH+2"p:U8`d*(egC.NY-a&m>A28K\VaZIu62JoG%7),0Gh!4u!t/QGH:nM'>C"pA!nko5Y4.c'u?pP^u-noL5ue/-5`a9B2Ik)pgGWZY&W]\#X-CBV!/_O0N7/)@+e#Xc_Y,]YOmAlCW)$(/^c:-+f4I -%&Yjq"8?p.JHJ8>DkN0XP[WXX61ng03rbT'EnK^*JM!nqMS2E5RI40qH\V5;dYgAg(5Xg9 -%1]8MUTI=:"c<_"cnYHd[Ms8PQW2a?hE#C!PIO4^i6G[eD:etl3O!>>6l(/iI4htbAhX(>FIn3OMqTu),)dsQM5UgP^KW6^.RV:<+ -%FgK0F9c$(4>-^>fXtZmqZa"GKDEn6EbPSQBqk_?p)@4mY(UIRD3*=1s5]a!]9nJ%mHS@i.MB?&7`>5q#nAiQ=fkS.u,[#;0R`[8P -%`tb@1LUZTj.>]0:WSk6DembifWRDgPR`h$Y7bf^^P%JV7OOIPjkXin3:i\P`I^4DoZm(^W&J1`kc!El0_SmU#3?sM?0h0Vg`_^b`4oIc\VKZfrle`m;\*s,XF4gATSMW'kqd[COkQ/0')slO<\qTQu))=Tp!G4\^Rg06&6N4WfA)R -%g4(#)e9c8l2&AQ$raJ/K!B$N:p?>(U[tsK6F10U7dDoZFZifp']7Fb'K]3<>UKeeXr -%.jKB^TOD?;me/bn4uo[]_e`QM"0F(`GERuj6r#"I1N(mNOO'lu%giH&[,tZSa:3Y5'6l8nhcVLooOT`nA.J`0[JZsm]`=JWsUq3Q3;h[l]lfYWH->nYAsP[a*t.#_IS\n(%t7AoV$PqJP[Y#OBL4RTiH(MjBcI$ -%a+9/"8ced/J9U8gmRm]8_b"#S*U3.s!pL9'lF/?C'M8GG!,?2.+?,u2[G8LU$Q8,]g/AiEmns[g#;!%N:(%:&99Sa?MM0 -%ghHL>F!B6njtm(9*@C![!^)gO4(H]`'%GA[`L)-^R_=M8,ET<5Q-/6si=]-=*A_bF%bu_qFDu))$.hO)Kpc'7`!M71T/=E/jg$:2N[A`EH!U0:2V>&U_7l-4RE]#i]!!.lO!&Js'Yip"obihdcTKfP1B$Fg\qb -%MGur0WgnG>#$.oqrYeoEY#06bMHnJE=luOcaqc\F3\lZHkL"\/6_Y\ -%aoXuXBtf_M+"QS#W%gV$c4IL+89!\8e6)Y6#3n?Qq.b_Fh]MrEc#D&<58=^*E2rT6Z)E,5Z;@9Xsr?2is^V^If\'-4KV#\n8A(8+M,n'ZAr$U\0m]m=P#^'9*!eh?C7>1 -%YYi<*F/X)[Fr_W*,+la%4Pu#5&7O`1e!mHUI1^$E\%,fpnB/IjVu^O_@KKWCSIpX'9ap_sl.:loQEf]rZ -%E=]u(N>.6f%^_Rg;a::]Iu2eGFI;RP_;O!PG;f'UYM_,TM2J[(:ZKb%k<&QhfO-L*E\e9.HBHUWi9XOiK`MuM95N1uSNZf?Ok^;' -%Hke>cOr>nB`4*?o;ZZ/g=Wp#J9c#ePmukXW3#S5ubjKS3q_m`K!Mfo)^1fL^qtjXO=pVS$G+3L:K'dG$!(?GC-FbQ-il-"8B5S:( -%3+fEj95WYrSSie85.X7\,r=)(Ag&A"KUDe5A(:bgg:R%to0o+ejS-hG.6Dhu#/@h.X%B#*/7tDOI;JMt=%1kO4u602Iqp\iR5j]] -%PCOpi)7[&NTghhHBW*^k*(&t1qS[n^rq7,@\l8WOCf?PoA?d^dQVrpa*iEF?0g)UCZU0>MGZ9c:9l(H/n:I""@HH;s?b*:fX:\W( -%pmIUWmK%(tg/]tmcCN_ADJ--Hab$G3Gt_'/m"#N)V8)%c(Tp\U^A48'ZU^qF%+NC`c_lti(h,GdJMc(jN- -%n*_SCBPE%67OD*K1oU*R;>5rl_4ul6(O=FRjjJ!Yq^@3`4\,!=U4j<.R+G"l7T"O6RaLI^#1tk:Ht:JQ5pTB/7&KutNAgagk -%5&N#0Df+]Ea[HRL(W(#A$01nQf/1-;#C"nW?3tENL.8s#@-mBDDsieUH#:4=I);%q$?hosI`RJtBrjFKl&-99rc$L9,m[@ijl=.U -%($oP#@'d^+R)r7-FubG(:%Wt)`a$?0V&TgBg3$1VWPE7<=Rj3QTqlJ7M!E&AHT\"bKj[S-YdZ&^hcSpTo7LG*7M)\<5qt;:Daa(P=ZsN^<7NTg_9-F[KBULW7Z/^BHVeDQQrsS\)X'Y.d2# -%n'ik5BUh*-@$6kG:+L>A-au0W@S&.ps%iF!=8)bC=_VN0I=IHG:?)9uV)7-GInZ2L1:0tJCf7(u;tj\)dH1UOGmnhY+k2l.*HOj@6Xgo#1Ra7WPm:E3Zp6&";ha:A*QqW9$`rUkC)0@c5g%OD7\Cl`s!L%B#61jQCN>+A?(pDjf5/h17l.B]Q>6mA;O=elY3.\kWNVRnU\FVfP -%q37.ilctVjm\"PBb@J>I9cZ%u+t0BIZZ(D%'LfZ\^oo1(T]@&l&s!25pW0re38:?m3&M"L[8AE1Rt\D35s/aN>HZJclYK>2h)uUZ -%T4#ee8s&DJPWQWB#YupCmL)IKA2N]N']Q]%mPdnaBV,)%fDHA[uQc.rgEVLuliB:IA3AX+<1OitgFA`&6_K6!p(*epMl6p/*"-a)>it+9Un48Di1S -%Wo(Ms=Z*]f1+RP$=".-U9WOZq^l.%%\KU,%+@>)hA-E@53WFHqK,NF)kB3VOi*Uag#*#aahob6BZ!s3IfX0G\D&QN-pDC9VDBK6kXBo=DkFK1q[i][8eU>8b'_6snE?";=9L,J1ZHBeAJ"cDT]<^&3fbG;I=9 -%!/?RPdGq6)`QlmJ!*I4.R!'\3Wk!WW^)-4s#L%Dnqjj.JDsL*A!q_poD.'ttIiE@3"*Q#+_V]aaEuG.QG?o&7a"L&m:LJ%+(QRIZ -%bBCXmAd#["j3udB(REpHobVkS15:X.ci8Gg9sR$LSW#)^EEGLZm!fK`&H^m3#:P1GOs\P4_sdfYLDN5_n*cU#%\VArOO5/oc4XF, -%Nrm=R+ZeE2?ggbRTuL"6j'M`7W+NYk)g+;MBJ@%8qii[6S?;>*ObKR'H4%n:\L=SlCE2cLK%Bg?;:;2qolY?:l!j"DI-khmHY)OQ -%9#Rukpd)(;j.;Fsi6NVk'F/KREsmMDm**RB7"ZI\SH.qkiW)X#iCY:maDTgl80R+$hj^s#?<0g.04BCE;\jheWqXuXKO1p+3S0`[ -%/;''rr\h!N/KLg,]C#=ogqT;ZHe`9@kCE!/:j$DFH.a#7G)i<;p/@oLCKN*0CB=Q4=;PY;3P8^3Q6T1X3VPm8JV6KU8d>=?&aSiD -%%K#MpF\6]4NY=HrIXf$T\:(R-.;-^nN4K;``2q6>gY%Jq:-G6$1dMKrbg*&F7,J'$l5irRfFa?Rc(t*oLEJ,%+meh4LQStlP_9K= -%:>Yjo1jDo!1/^NnAB/W97;>G8O?k6`>)@Y3rk_DgLRh\`Q@S@@US:4@DnE7$W@*Vok>FC6Pl8E9*"?j+UJ>f)%LBKn=c(>/?)Wl8 -%38H1j;(S>jRLc&Job_h`H3WNgJNg#/>(oIC3i(@Wr&h/W7ChKqU2ELZIsbu2FiqQO-d+=Bimq,7M=5;OmbkZ^kMGkrWOit_a2U6m -%'8ZdQe8u(@OUTrH>kI:q!i'!]K:rdkQsce02M)/#/G].((WE&0C2JYAP[CAA*oJMMpbdqc:\"l^lG9"cN1?X+QR=K#Za8^ffOcEZ -%haVVCJbh27Ca01H>M&O9!.Rn.gpIKG\R1#ui2^Inb+rqs_O2E=_A1j1HF]TlGn:t)fP&0Y@^-4ZbOk:((YJ1.n$P5I&^re[[\jA< -%dh3Se\;jt6cRE:RnDfDHlWBDKF^:'_7tsj/qKe>k"W[s%QLLg:7kqf`&V=J]j87]7=PK%Xtpl`4r1FuTs^fW?`7 -%m_\D6a0(r0SMdrAP?o_oTN&'asN&"no0)7"7_ga3g3T?]EcgYh$8o^BpIXkn4R4\\h&$I7F/bCSXND7>0^%r[89(Z?3? -%lhV'WMJ-f<*c&+G)guQd"-',@4+mT.:IF#)f<-$?;>d#Dpc5gss0)1_?gr%6#C9>K[srk0s4dSEofrKJIsh2j=BEQCIXb9?o!5Iu -%TDnSg>>YJ-^uTj<@/>ZXE7.1!Va>NAk"CI$?1:dBn`X"AeX6q1Y&SF2l\F,D[k82OQMGb/it"d.]GC]oY9MWQ-.T7:NjpieCj_/`=gC9BOlinN0;^4Hq:p+i@%X_ouWuH2$$K;rii2`h3ajDD"l8ll#q3? -%0`;Y=`,I1IIi-W2)Xp44%,(\5Jt$-I+dpA>_PtWq*@'(QQt-iu#^,nQb=;XZ -%@8JpaBQVb(WT'FG?UK2e*]aUcS&]u>YLOaVU]WL!%oPk\mg-NFs5E%dkBI9[5G71&pZonI&lcO'@m7U?C_GkuZYtqH<dp@*JuhP2`BR[P=*'BXE:+kk\jjrY]H`*e4P@%+o99+=$BHc -%nJW*u_#9pX&1WSO^0iar)CTGj&2af#88L05IoI(B^bfAd3I^;9XY_+0",B -%1.aB$^5b??K"HBnfN1H&,N9#V((gT-6i^_4BN/C81>UP#n/S(Oi[XB$LDPgB_fXjq-u$UB7cL,N(pWT9p\P3P%5j#&]1J2D*dr\C -%j)V`C10C<>n/C0XXN0YO=iK8p5g`h"_Fa)nfC6jei6-4Sro+W4K&sLS5C?JNjp.mi%TkL!a]CjmB)W)qA]c&7;[`4QN@ek1?Mu64@;fJXd;' -%3I@@:;#=c#Ti3oR56r.!$0gZo6)pMc#g0XO/D.EEIm=O5L=fcN3MU7oaHD+&[#_So_?8*q%O!-mco`8l%JF6Jd<,C[DBe$a];'_UNX+P-9qgG/n4#EhD7DH6>q -%nOlB-"@)YNb>#GX'Fp(G+rB>0UI7ZhYEq;N+RMAoR7<5IjeoaJo9A!X6/b_PFKi0M_F+"C=tV)6LPK:2"b`R^`dpA$co,(5A/SaK -%;[>h13&<_r8?G@QmVCB&mJWH;6H@Vg:W#FoW&fR(k)kE=o?SC#5A_B"Zlb0T%C3,(E3\(M7]?.A7Jt[#Onkq#3LKfM0g:4sgF0lq -%aC[VV#^3-KCZ4(J2.Z&ZW\tp04]S%=%+\j;l"`Tbb%HI;.5GNuFhN;\ls"TaJ[Z**.YW4q#/.lEW(h2'HW4LlH#j=qLMn'f2j-;_ -%5d?T7G,V#n!\+]TK??*M8PMS$%8W^pdnWH_72=NDUlJUU+LbB+KH,'\!Oo_M`mKCfUH)4aaUt>'Bf',8NrA]8\cPil/i"&di_2bW -%%,j<\2.(E2@)r\(I@bn>^a^E8%=of00sMmXQc_VD#",5J`Ub'Yo?(R>j74!FXq?k6Cm^$*+"$NVY!g.Ch?Q9r;$g4Q[(3;)%&L\L -%)B4*cWkFcq8Q4.IJMMjPE-!4YT,]+ -%Kl_AZF-RF96Vbfp%P_u0B`jl[<"^"@0#Q/(PuNc'pHFB"b!Xqh/oZA>Z8RXG\4!>mIo70`\FJqXiqnbU[Ut%DrZH&XOPooQ\&$<@ -%FRVS#qNWGFM$mM\gbp?IQ?"Z!Jqrpo*fWI3>&1LHIW%e.hiC:X5D]>X58#\UU>-[5s1T=W8bV9g`%Cbq)t?DnBJNZKob;0rppkP1 -%;HMoU0<(1c1j@J+XBkMG9Y2W5IS1U=,=d8uSqAH*C0ANJDl\Y[m!G;N.n$X0(#h^^K;PoSPlGNd`a^FlmYSTjAH;^cd;% -%cVSH9K!;A$%Y9&BcXHQBQ<96QlcD)h"E9aVrTl+l2+@2R\3:ZB,:M`j?#<-J+XBj656uVR=p8.C6(>(('Lf'@S07e2r.BLOoB>BB -%n,VnW8TYRB8g7i0$=NicGG6YWjLE.>];LqEf'ur1]ABK]j-'ajDK^g?F+.sPXVO2/Bg>j=h3/+T^p^=ib2$TO.'>T(p!\6M -%2Ap#M*);NeB$1H4g7k5YWOsYO!,O4`m5g[>*e6q'#qW)u0Wm>KZOZV,T4mPd+;gF8>S40Q`bQl8HJ:+^NY"57@/9L1*=WFd4UY@QpUH?Cd;,$0_s314Dg$uXV5)V/$fmoR15P"3IVps>Z -%PG[s6j2inDf6nC'HXFbdO5&W2a@2EZn,'oNcb.JtLc9-\UG4T:IV98O?IqVaOPGJiAW]j'\3\_Peg%#%6&[MGmA\op.1.oNG#,D3 -%N*VW!+Q`hk!d[!j&n\CmS$oBpBRpuTh6]S3U-Fr3&*W_Y$l4VAnKSHmn*XXd[>:k%T!6g.mY%_@DP\FtL9$;u,BSh__)uc"ap!aD -%`Y3sY68\CO)#(-^H]3hpZR6U"YWf[2AW>5V0GHfo`Z"18$o[7:BTp.$:@&RiV%Jfjr4ILjHRYAafY946K*TIIq2VU7SEa]^A!mtU -%XAKu;G91U!EEm)2\ZN.MYaQa)'b8D\]PhT=0:dkai^W:BWh-;_=!M<@XKlYT.occH(I^,Dn\!#PJgPK9t:'VJ*")J/RWW/qg%Yq2Qcu3gZs_"O!i]Js,hBZC2U1&^8WD?W73uTn&R(1gZ3'E#<$j$*tGBVAC.#3mrS^beLqKq -%/qpW**A-*$Qk,:kD]1QH?6.\eET8*fI=C=K+>,bB*2ZMY:q7Dm?S+4Fi=@>bIro\oKa2Tb,7JquFf#pO1($I;Mcj6&XcpWm6We#e -%g)>rG&SjnBn@6SaKL6[rLm@4GM3K8KGFQ8?WY]UZrA=iR98ZZ]'-VH"-A+("Jtu2Of%9kfU#.(*e!<$R?S>Kk*ZE)Y3UT-GU":OU -%Zuq\2.u4'q/EL=1P)NK%*L8JH(;8%:2N?.b3\bq=+3?(M#WFk:I5e7Z!kDI5W?E2r56VDndgsf2*eClUh)'KF5jXZb*d!T`M#gO)%>\eQo$U]?p+2_]5C-X/Jo:*qS%ReSj5[.=jrFm#YN-f9t;is*7+rcnW+b4'\Z,]u^Z)+I)p3U"dVg:$`$VS&\DD>A!C^>mC"ff\bhn(L9W -%gpo-rs*j[3,.#NR2&=g2BP;2H5Y0ei1\a"Pcb.jPk3FUbH=V=^rtG9G&(*J\a7VJ>`g2;o9_EO?;C2DT -%Uq^gM1l^u0CS!q5=05-poOA1#-/b8@hKQgTYJlt[%Uli@2N(/+'6-1?M?2i7/sJ/>MVkNE8GCE2r(,?<3tdOe_"BBd<8c`@g(J7)ZOq?On&HKW$%B8Xnabol1hG1Rbj`L -%F:^Pk;)al#MIZ\AY%E$]5rU4iBBc?\b+2VX+[-Ch]b*Ra%^9 -%F*!;U?ASC?b4IjnqKDd^MHpN]/UNUW=,nMim&=kT7)4aTEuNbir+Z@K_@j!8&XRo-;\&-naE.7$la2D0P7Y3O'MXP;B8MBhZ'%lH -%LsLH>%t,GX%qO),9@4iX@&P)$\@HgT.c-QW3:1?44(Xj)3%1Q%'V)5h(q+SoF2"29681n]im9,]aeOE!F-ScmO-@Ir*JksXN3Alj -%]#cT%hg+kLDT=@R--(5:/\l+h]3q&(N9>Mhmr='Hq:OBq2#!WZGb96sp*_AhCH\,e'2+9@?f?,?*E9An&>KTt!"s7S -%0IXa:7W_(0ebNaNf$%\ehHq&:@Q(@O'(M^$N,;,GqEW'%B^]rMTET?,TprnAg3:)T&t*$);RmK0\3IZh.`fB&.k=d+J*4c&'R6('l+"^+,;Y,7(kh:jdpX?h*.\H,'h_pd$0NDJuefAJ+ -%46LC88[8)X:XZf`\:\Y1?K8ZS!)14QLd<4Rr8H_rn#![a[*l^VCYTNW,X+$KNSq(%A$5cEd'o7"H\e+=k$k(o+3;qJ^JY%O_,F^W -%O8J^NT^r%pfl]ZCX]i77CO+C=aS%ggIBe%VI^'SS'S6.'q"Up`!C#28Hq4J@+YN,Il]8Op#Z!Dnkk--Li$+K1o:R((YBg%52f?EX -%/[MZ:RAt?Ffo)Z%"!UCepd_HK.IH@A=e1dO')7&H0:r%Pc(:I=KEPW;Mu\?R[;PYH>N'65SnF5sWM$O,R^CT[lmHUF42S(:VVSi;0AE+;+'B!;7Aop^u4*fdnCG9uhQI^0HX\>Dd -%jjfOf>=sid`eta3];Ta4l4tgmS^ugto?;)!H0pJmGSO$p/U=WkD!Sqb0.n!a1C^rblVN!1=M3=+Cod8($u'+,Z7uA36Q-5d.3XGk -%Mh1NE(3HrRnARrYAi#5JVH$BK9EILc*PUI_7T>pF?!4LtE.5P`I^3;Dpc1M56l9IJ -%OG`_!/PTr=`O%:o&W`[6L6f9pg1G=T>1O6cW%+a*>GO([6[.-S8I]CX/'t<^1Lb/Cr5A]A5h&K1aB([tLQtd'2Su_Y(9B%;E/DhK -%:H3Xt[MDaPad9TrLZTM\FWcSeX*YbcVDK3);Ap&n'8os[g71SYMo(EgcB?\_mojIG3C5HtE[Hp+d5^Ee;*qIR6lF3f -%$p\7'd;Yq.D\@&%%;$lhWtr]:eGIm[A38_dkhB^8`/;J/WZVg8L-bT"fSI`jm8Y -%AT!dYc>+Y?&Vk3M*7hR(=Wco(L;q;G>[gkVDk(GdL=R3Q;!_B92n2/P0E" -%qBjdj*54JJ$@8+cS5#YtT&]ac@pt7EEta:ck3*b5"`?no%VmOp?Ol6'f4/1$G6jJWj`SG9FACdh4GoiXR -%AJIcD'eDVPC?=;T>945E?H@/E]l1RNWYeUB^F.mena8F<$kn^>=sIL$'08p26J!qQS;LL\0jE_hD:N#_#JgqJTp>/elt]0_NkAAP -%9k+6gQQ;aD%cfVZMX)#IHn?/j8L@gP)F\oANo#S!cp5L^A]Pd4'\&:SDUN/Lo]4,0N3"9pq9`W&n=rt?'ZBS_Jt@BF1qGP6qj<^` -%nVoPI2`+W"WCEXFJgZ%K'h;+X]j<&UZGXVXd1JV<:fdLp>:\BE$Y;pUoieeE3(`WLi+/+rkIqnS1=[uJ]f,%I1ZXMm1?j:lQH]>ZLmr#G`b$JE:YsJlKL:GMY6`o&&43B"O_pVO -%`A;/>)%-uD;'Kua%;eki+JgJBi9JI)nM74deXNOm3S_J@V/MR32THbJ"s<^Q%^Y=&-oc'ia-ubqV+kDP[E\re_Y@TN[_cfWUH;a& -%6^@b3R-Vf$J"nKcLE/s#`1HlGi\!?akX;*&.!_3@Y[*k/4(sL"0XRJS7!H6Rf@\(?d3X&eJV'2m@4jV%MqMrG(M,:0 -%c/C@$fE#>NSqI3k8-e!OOD=?qlJ.+R/2LTQ>^MR4h8r8IDSD21AIU]?'#d"/U*jkL]L!?m>hT4XJa?J@YmME"=LId=R0AA66Cf@r -%+7aK*HF+e4<`>\*mC+C_`E_V+E,*MJRfY>Ifr5N.E1&Ja"MGW]$_pk/fhMHR15eoqXlBRk5)ASL8[&J*,h^&L:YoM>.IDZNOu0&U -%7Y^CGQkd#KK0r5[.WXl0R/K#_VZ>unl -%0#Jd-L>[g62!qcF\PFe8YKbOB[@l07?aN"cJLc)LVn5d3:-'/CN#;c@o+[aIk2Q8C+0VED>8Zuqn`adWn#Rr-@l]LPTT"UB()"(, -%3$oU=io0$BIpPn-=UcN,Yf0-*[k-Vk%XU4dIoh^0Ycq+H,@#"abJOl\pT:UrWqDL73m`H@]N7CO$l"\`NN.92h+1s:#':^iNAk'I -%Ji"6odRN8%SahYJ(Ie["2[YK3V.chOS>.'B*&fZ?,Mk#-:t*+`_b*dZ0PN6'm9oTqBl(+P9AG:&^0=hu,G:CC*#Lu]Q_TOZ:P5@D -%++4DU^0qaple.BQ3&iPMs4XtTNl(:aiX$JU.=<`KW+:(F$po&)Vm[Wo4l"8@9OAHLn;R.W%Em]"=?n$V;iI0jOSnCsd0RuGSObX_?AEX`C__G^ -%BIn!oOX\Qn3,Y6,H.,nY6`iRd=c3l.ojNYgQ*#UR`mRtR&kc0,gX?jg)O#[j@9%SD>^R`t$[gNbGIlP)b524L6VZ*Z+&uL'PoZ'n -%/lZ(J@j+ohnlSOjjF\r0e2T]:>:aK>=5H7nS,C.*p0'P.js\6n?reUR&,IKiPK#VVSYskf2$DoMWh)`JW+\i,(Lf:fKsp'm[Vc/h -%,j/qd^/s*jeg`)jltL?L`=*RR,a7k$l-t50!Qh"/,W^&t2`"%@.'T,p]k^FONc^AHd]_qh4Gb'1oJ -%&#TQ#8P^J@7Hdk=N.Ipll>n1L=17;M@O.7b5Tr"]D.,@/]UmNeikU91;>loq\6&Ag=/HGf6Cu?'[p,(h8Dodd%N,dRulQ&*/M -%^4HMsk*#IE[lXV=qj>f/SI>fWn0ZOAb=l=!0?MXY-m24C,mD'm7C(1IG:HD[hS'+e1EXng%U5^h3>a&tT`+k+`QQ7")N5'HU**ih -%hHnk-bC0BVLVJpVQYYe4m]r#-,Zt'9aZGM)VSSD*aUF@k;q[>m12r&pUj&$o.S+okd$r[b.?TlVc@P^/+U5%&8Y]u]2].`XYR[IG -%eJEJ_3kBMp%6!^O'(lnGJM=AqS>*68Lf&&QhQ&B<*^0l:c^:"VP$d(cHQi+BSa)=>()2;;EbeTr!d#Lk>@nLKDAd^%20Lm(pA4t-M%4o272=-ougE -%TW:EGki40,kiB!?kad]_2,ch)q$sh_c$qq9,Y+]KKVTt2TS_XKp,,Cp+H9SfPGYK`l`dqb(laH!]9-'tW&2Q@9!;^X8VdYuXW -%KC)hYRqfGe)e>LC;,Gu1PW=i*6Yf[6+JcT',bu!6N)m"@RUqYrZ"C1G>\sma9ics]A#;5`Z9K]84TH5.c_P[5fR*b>'j;p@gDTNS -%OF`Y96Fq;h#?NSKnb0SCq;.if":2/og4Z]`;rAFKbBc9g!("RXAZK/:-jDr -%`5_mrA$1')"mq7Gqt$Yb/[G/o-7@32O;';tRdk4U$#fr82Q5S'K]AmM^JBrR.Z*,t6%Xk\_Q+,[;T?]J=Y(8tR"@n=*1ZY-)@,X3 -%a??&_S'O>Lq2@7)Nc:fERd9]>bX?Kb2Lt,ckc*3Bl8IjPBlds?JTOEb/&tb%]UXPiCsZo92u$7BD9_:S;M4"2PFK-alK-=8\>sYW -%-Nl_nlY?d?$aHkoDmtnV>E&c]Z)'_*$6(gk3nN8uMFW:cI`#_,Z8+>YU?+],:%#t!^)E<[@S)J/4o(lZ>FS=UbOI1qOH1>gJ;LZ- -%".g883@=#a+)l?,"LQnRi605eB6=CEhq!T2M_Fi#`S57nn+O=t!hRrrNX/RPK,I%>s0rO;,p@=qH\C%jokorqm&C4= -%Z)a=<[PX_c9lP!!?]'9klJa-ff,:sHI!#J%l][;1>VtId<(aeoY>FppMA/>Z6hl35X&JbRm.E!\eA2m!4PI@@CWJkOCqd0\sf]ZXJ*U6^:Pl1P5'f,i9Y43CqnYXJWlL/0F@U>5M=62>hBdPs?^J@:E?9.tpA<[Yknd&4C;uWKq9p<"4C@O[MKD-5uf<2rTI"k[i -%f9Bl,qa4La.87Qr%rf,8:1q,62B#oIRb%Q):VT:gD3<7Fk[#6)W#@PF@MS*Wd?\Ed<[d>M+<)LE&!_+%l)SU;cu`fWF7DsE_DKi& -%@]DWj[;KrGWtkMVHQdH/C'Nn.1H*/dhDLX+8augU+,p(IG#/ePmqi^1Mg,f;*1=WD[MTfYCM$DQ_U>`2(*l(Vi.e_HeZ0rX@YUj+'&Uo99:"+Z\6mH`_\%tS]q-g6c: -%59c39*!7@6D`!Ye[(A7`gHm7qC.*VOoF?1r&.U4EdR[m&Y3k[Ll)Hg/@B$QL<"0rg2:K6npe1]_G6@@gq-l1QW:-cemTn8r>3--Q -%h4)#sBW3gTKhJ;E6+.R+Jk@u^l*?RV"uR@pj`U/gW=$tTX;QR$)?XOjO>YQc)hf#+V4;bWYlhJ38_XfCd`1DSgr4L/Gl)QFn*IKe -%?;bLYR!pL36[Nm3s3fLJ+jqaF67tnVIfNcBh,;JZ>=,u+OJl@YX<C\#HG(TruqBFIk4!Wl88)(>EY/)rWsX=kgE]QJ_ZK$GraUjc@c2"tNp@C[M.CPu#I -%[d59`f`$WO^Y/'?EZ*1]Bftq6N:g@KEUVJ)J%YRlfKgkFMRr<[-Q1--RjqVu6.CaT5qi>TL5Mq7SXc^,@FD#^hI47Fi5E*6'5pip -%T'V2tXW/.u#)El@@@ld6im!AAI//_#PmL8i(SuZ-]/GBPYXr5&RP[Wb+uanL3GTE%-$Jh4ZogW2Ek@ZTO9T.B9-79X8sQqTSt47s -%ROJNu)*IA%Q[B%KLmW4jj>?pX!Vp$P'hI`f"Lsb\KOYS^d6T2BOj"lZ9EcMO0eF'0!4@GZJR\*YN4I[a(RqbiWuo\^HpY7nhuRa$ -%*+L#)^R*Qs8K!l]5TP^B\A[mX.BCd,d'0!JTbF:@niAYEVq;=qRB1YU&8fCT]rqUn8ZTiYAcm,k(O*SF^".G]aC&uu[aO;oBNX*5 -%_.g:llfflNWT!=@-?"?.O12kZfT?fZRcLTtiqOlZ"63[X+\\.2aP%9oS'hae3fAb8,@5no:m&P9^,L7R\GW14b5m6!MI/PH`mJ9Ge0D'+5B -%eH<9X\+LoS$;gUXDPX/Ph9%X]h=18$4bNML('@96Rb4K_V@5V8%dV8T42#EX@it'/g[@8%ZLA9j9d8`lK7^@Rtt=#S71B`)DpgV2B\B>@Dlg@4fMlY4Wi\`:W=f2!g-7 -%&b6(6.sg,t.UN9U,W\m-;iCo%)9gRX>-en['99`[&cFhVS!hbKnDd'.6,p6Q"glZLO+j_^:;VISXP@-4V]i3_rm-GF]QRn/Hr;,Mq -%+2;Kt`WWmV-cUqfDDn,J&KFueQD[4FGGYO_/T-PTngm?X>MlShNSBMZ'!V<;�G#9J(I,`XI1-DHo]u$79)O]JgeE6:>naHl0)D -%T$WE,:$@Pe((^76H,JBCU#(er/G9&W"V?3tIEC:hP0M)8ahVbT6Wdjh)6>JnV_^oB<$IJTWgdB,F,@5a[5$`d'?d[YY19Cd9H9>B -%W,]jTSW'5SfH+T#!quQC[W>?)Sr<\npa.>e4H!>q\H4);YirORX$!+(A:TDg+4[ht@Ip_G55BXfC,6bWCSW\ae1WEE;[(XSMF))( -%>b2,m`nE>5%5h""!"j*C,gF3\(%A?@s!<\h:)$RIT#tO$Lm[rV*3cX0:FT -%>1*Gq3u['r[;FS&*%0)YDfe4pO/:quGLl0f_ch-JEci1>jV%bB<5QU8R_af\%^%J"VQfc!`J2*b@AiNo#uejq"g3ubB:BXUBrP(;4`O(n]6g&91R -%Lr"qMIMd9oC>8#o\?cl+UcUmu2M9s.CZ@][Ql?YG=fNa/.+en>/ -%dArb>p+7@-Qu*"%-=.]'@^S(FqXCiZd6H./]m#.(a)0'%mS#6DB=BGN?;@k,:q8TGf!6iAkent(>u[JEKD_eG0*T -%=gH_I]afR-_R,!G9CsS1.CS.43khH>BG[l?nb*oMH0(8d)oS9;m'3>EI^8OKe+Cg;e]$2Ca(X*@S8dS%08RR`hS=Pgo'4c9D=H#T -%j)F<"'qe,Jbk%dhARn-H<@.cVb>N7b#Y,!RDMk-gl&8?7#N22j$8J=KjFj*(Ho2\SrDPNB"K+QGEm64C^nkt'B"Y@6h^/"Xk`5(j -%8iP-^jHh/l\oD+6ULthHB"7*`ag^FJ*T!(u/UX7hSJT_t)AqU.$Ga52rr$5$@MZ^9r>o,'8?5f1c#XZ$QNib=YucfBP>m!5gsaCg -%\6K5DKpfAGPcP[2Nm_c!OT^;iVMTW:$6mKAh-RTfo7F!DY,*!9!9)A5k>.edmWPe^lJ%q(n.Ed>;^3p4*Rh7gX](bH%InKnoS\lruHH(#[BQ-_Gl_ -%:)6j=^p_T.6X7u6l0>[5dK\5*+`$aX;Q_g1T/bNl:://@QulV!"Aa%bL4sPkgKPrb@?n/NYGAVM4LW*,i"F$X>Ia7r:>CEG`[5LO -%92":NpjA4pnE6]K#oO'lN`FdV)EmX -%.`*I9I*uGZDba0Md!>bo2T[ibS`^!T]iH.FfPInV;Y=.TrOk*6]&VV99+e*t8+p..,7.=1Q0G$/B=J/>G$?1H8<-[eIiDH7)WOCFt1*8/4@=7sLB.l-oB^NhaR^9gW0M -%HGp804D((2T#sULVfM.,4Cf]]_F1K`Pk]#SYP]qJmg(SZoOb;6#'s&`1CLY)r-C=1OGbgQS_&O@K'k&n`-8T@,k9,%a=OR=`9=3- -%l=&@m]!D32G.JgXaik(*Q^5EMikrZ',>k_adQe@G85P;qK@=@nbqJ``JU%#\.^&2SUdS]CUrd.5_UXGAG]Ps.D;l@3kl9c]a+&N2 -%V58Yes8DZNc(B7ZF99Ea2GhbaGJl1;(>/qN[\:11%,d\1R>djde&>_B[W5L1C6i[M\Ri^7V8;Bm;o**%XRb@(AX.Bn+=8.QV"<>6 -%O8`;q(P.I+3KtJPsLkof]Ysq7ZiGH6h5Ce$8'E&NNnUtf4Z2+ED:aW(IdMmpiC;M -%:_GVuOt($(Y#K6fc5Is4g-P.DfspUg4jno.7MJ7-3d&n*W[N]RM/J_9!,;+)!eN'l+%mO&Lg+p+R;@;/[!hG?d=X$1iV^8#<-X.M -%Na@Ku@s-e4?Z.6nh/)_r4oWsAV=cZ*`P_9nUBJr[f8H9?g,>GIK,5UW\9N8-D*aEJ]4]_=)a4@mg(WB.'DoK.1NDS(hMcsk-G6dL\j<@b%Npr9XBQ-m[#WCTpn -%gJTnr2RI'3YKq4@U'-##_IE#tM/Q#p#FG's?_t?gl#H,&j8->3M!,VfN#ilEG*U@k)NT@OfBOtC+;C7^(Mc>))Oap1_&O;81ob"U -%V3&J/<_#)k/:hS(2,Y?.^qht'G!sS>D*0P>1b&A)NR)FdK1$fbRr\D>iSl>&Lm6n%3<6,U:GK(Z79Wj,o@i8@Oi8>7o,ULln4c9U!V`2BhV"9:*g,d'h3\Gf!i\DNLe1OD,p_Ej!C)C6cEWa@>`Wktg?&hLXcKH0VCNPr0Jn -%Qs.=O(Je#.q2C<3-clRT=cr[.m3cqRQ\rfO&^`"GSXd6b#*#^4!)RMV3+;>/[dop6b)$(RU1NTNbGoLVf -%)d>gBoqN.KYTT(_TS1i6%ocO5j>iVWF/_f[&0M1=gdJAgC%Q9e?rTU$[IAG^f$OaAL8Pk)V036Ro@6cCkATaO+g!f7"2!.(G]bH1 -%n0NZlPN#N""BS;0_Sb`CO?4?t_GoBOL.WY+7QNp>iP@T(QW9@0Q6]i?67$O#G\0bs,)^hRKVLj93siIEWmIR=>9K!KPqbcib!:#J -%+j:gn^6\[]D&mG1`P6o3Dq\)K9e!>eA##BhFI?><^BB^LOP3.tO?U,q>=/hGTV1=kY7TH&]hqd`W?`:JBkrK3]!TAjPF]btj^eN? -%kJu*TfuR?4-6&qS"e.k,*J8WYc#Ppk#A?[D/A07H;*m'E%p_4=PEBdf;\KXuZQ^q[(^&6JkL#W7XsELKXaQ,1R9*Xo8uYp;'WOa1 -%5+.R*HX%>-IVBg$.s&*-Dk$V(K:Fb`4"3gK+CII&9Kr/%+d`UmR((_nO2eTV0MJi2p9Ppd-Z*9$kdI8-dE''[]p'j9"H2g=fH7HB -%R+h -%LMF7kHnr)5-[0ZH1BKTDU0*N^7lYZgO4IrE:6:d?]/Hc(.I`nr]`))<`G\N%MV#lSF`Z7aCYHfF#89@*+1@3op1e:<'0%Nu107(G -%@5B`gW/ZYWf_b'5-A`]b`[[$W'0_S>*bg"cY7Hn2]87\1!sMPVE#`uSMZsAncEhetLhkWb\rgn(IL3XbZ$01FL'i."YrWI05SMjR -%Z0Xg5glc93%X"<,3pYk#'\40)#HjS0(<RE -%PtpRWN9Mk3[5I)46[0:;R$EG9gVl_o#8r,U<*[qjJ,s,Sf9j#&:n7XQ&5nBsJZ(=ESX5-7CXh'HG%-6JH?H^!b<+U7dqN`pE;;6)mKW!c;mSj.kqLDM^=*65S9`>msR,a.ZLGrE.b=oa)NGWW_1GOEQ1aJ -%PmGB9E,m+aJ'A3K=&2SP"T9MeD(@@oYaiX"`=X;S,j[pege0[4)@jANuFjTMja"W(\ -%61LNs4tQI0Y^;74=s?s<02C=*VbQ`BMb:$d7*DW@H`t[S%_!0l[9a[f?d?W0_D&B=2W_nW8FmO#8+COu&;eWl:k`,c/>#?4I!Ak7 -%LK/-4`\hG!d7:a#enGVD`CE%hm]FDRlPkrJ%fRc0:BX<)>9i&Ug6f[kUl71W[iq7S"mUOpKO'Ok^*oQ=fd#AOmglr=L"*OI0FHJ-EV'CpNe0bD0H?R93TL[-r6`rDbk:@?uedA$*(rQSD>6B,O+Kfs9"1\io -%1_?-O/+d%3Rq!gX`sU3pT2L8lhXPGtUXh<*Ffb/gG'1["+S>>%_D`[*l:aA2a%g%^c#6bj=(QP66g!1Ph9?nL]fgkMDp`#\"P+SM -%amhTtN_8SF&TrBgp,H<^Bcu0ep,#)`N1K7cJoOG4.S9uRO=ZWVYO\AfVC`-1n<3>nYXX1eZluFqZ%lmZ)m;.K6;s:A/`NM"Ca[t; -%=csC\,"#9W1!T%fKp\8PNML/;"KKQTg6"p*kN*T1A)sAC@$lf0A7&6dZ9frHR2Yig>(cru#,k$D/$Qi>cp,CIdNfK]#]MrVPfq') -%V3OQ-Rfc)'3epP>ZfML,8&s5G&L1A-;oW]7'4=r`/rabIU7D)8LG4+,FnB7/MM5*H8>u7KlJMu_aL.iVMLYbZm/58Kj,2CniaXGc"bj)_LU!/5AO]UghE:"PK12]O73,l8DP1HQW?Zsn8BhV(:NNEZs -%Y`XjYdZP*<_U.!T;T/DUQEO+Pj5ZJ5fjmK_`$nfsE/K4[q'J&VLC+r=?.XUj94RL53k.`MEG'tUB>s-?,i5V4o33^8;VH"fX$6F; -%3phshSP'3n_Saff>K=slCD=,Hi:!Y(KX4ETY'hXoqPOf/NXSq4c=#3,R@ntB)U&Bd@tdI=Wgn1B%m@2KfpH4/a#$uA*CIf,YRsQ$ -%,78\'iq1R%D`G0F1]4J"ODpCF`FK8*)C(Y)$2&r_p[dcB8V)k) -%c5SS8pt6:eCXD9^l4XE[=O]+fHCi\:W'/H`>A/L2[%]5N*_hb!Y(^&]Y%dOl#&V+*O%6fA.a2q0>2 -%\*f_Y"Y-_/bC9H!4+C@n7H2VTqoWnCqpHi$DRU%cF'<:D8<4/89PrQ[2F!P8,6W`[M3nthmtj"`/2X3.m#36OV;\MWlPUL+:#;8m -%m-=cSMDNF`CfF9PD%`-/QH&e-DPRdF,2R\][rGtlb9n5':4H@<`"nrKKL'gL'Vdtr?h+'DR^'lCGVSMhYldi1k8(#\`W`h-3Xjas -%iVH;BMjf]h-c),XirXkB*Vd=1rAY7!h$g`pjQLMM#o\AV2D,5/@$W*KBP1t9:ts@S>L55o6Xjg?ig"a*9mr!t!1"d0?"cB?bHXe]0Io+nB3(Y;( -%jJUNDOaT1i-^YUL7rl1E-FU2=O[%QN>?<>--=KCU;SNa.Be$GBN/=tD+V_01YtsU'1W)%QA5>/-8cFc5.^#jo@7%nkD6\*sO^&oD -%%U*,f.7cE.6I<[hO'4?LBT.p%U2+L,"al"8kMZu,Lm/COW-h^rS#"Qi`[8R)=H3L0!c78W_B%r&cWo/^]H\FeEAkV`a6TQ9 -%C0K(NS?R$hl+5cFjjhBDHSN&.[$\:;c'W13#D9IF@Bhk,SLbX9di$Z&;J;:O4-!=$mhkeWIIAZ8-lYZN0IPTjI)"lY:@;=Zq1Xf$ -%0O?i@HO>&n:;pL+-/NoY?t0]0+\pM@O2Yk@ja)9rKDW#unC-!mHp'Kjc&md'*$4F.*&*2_>O*8e#bS;_OO -%jJmbMabZn4JBPa9*P,/6d@jY[_=neGm*;II.'`:DTkQp`[#pU>1t,1qfF -%Od0"J`Nf&o4"5ThetH9rQt/720V:1&"&O2tSZMp%D]mOUMb%Z?"W>L$7GD6*U2@(*WHMB!<'!E/j^E;-N1oG$rq<&hlnZ`HK2niu -%$V%@X;bC9s0.>ptno4BVLP_=#`H<%tN_aNM`M)M7MZ*_A*OXOQ6V%utJhQdV*q>]B%&aY:W^uWt1mYDH3#"jo&6n@'ZCT8T0]k\j -%2[XD/i1qWe3ul3a*@TH:>\YnGiWd%cKu*?2IN68Cg9IF;-^#fY+I$=9+&k))k@jX^oa-4i5s'%M9QGLQBS+Y0joqVN@VOD=9#ZbJ -%o`R\NZ?m-=V2u2CSk1)JW?G'*'*b4Z1.(THgKIUbt!%PB/F/0KmEX?$!IOTDaFlFm*H4ADet%Wpt9fp+Ku -%dQWSZ'4.f)GBG;[.&Ub;,S5s"06PRGNGtuh`dO69BRgObgMDhJ?#80&cHX7'_8B1'--mVAerr`H\XhtI)*L%-8I3kJ_GHh3gd6_D -%3O=opD05I5jJ+;[CMQEeUH#87XYGmkH?Mp6<;dT4S[Fq)3sORXJ@M$gtR?O+[>VeB9Q85.c3g#I%Qc-A2n/X -%lmZjWA=,5on#X$/n4<3cD-+pb1r="*D?juQTNnGu]6^bFQ9NF.Qfl1jo-?8um$hdK"LMN"7gV+,Mntna-`:;lh7r5=e(/sfh>C_K -%h#@?s9Bk(Z't_pr-OT2lF1ce=M?umFkkGq/+&Be8-ZZNK)W%CNkqr("l(M>(7dj!#<6N[e-'V(_Bch41* -%9*?oT\0Af0)&pp^+n-WAMBcM`%V;]PDMSa!P4Rh5jrd"JEX2F@l41rB-D2S&&0Vc$9VV3b30(h&@O14X-3Na.fcj%.6KC`hL%p&# -%r%+QjeKo?,r+5;mOP6/r7)H/Cn_'@ug>F.Ym:AC=LFa]2/Jkqf_Qa+jU.c'&@`i%3-J\1R<_=t(@]G:$3fmR9148a8"0i8l]\H2c(I`-Aab9Z@:7']c3V_jE/kA8/+Un?8o&-7*7Fa$'j9#RBSc]3f5%QJu% -%YcTNDZr"Ef$FY4]kZ3_LACdj%W#*AUor1(k%!'%6XAKGoW:O!IVu!(';^UDpn:Z3-:X)gH@&c2_r/88as9poEsT -%>_uuJI;i!6E>"/?+OWQk8*!S`iooA=8g>_q_YP;"/u=YiO^Ss.3)sb_;gtN0.4rj"mVn2Th[Z:`(J8;D\r?-t4cKG%&q8T'5r&3fZQfDB7:fa(^of$eCT'-rVT'=X5#I -%nfsT&?/`IW(kT?_d,I4C0C+3M.:.^EKdne!7\8*DN`=F/aslOU[UrHCjZq_W_c94[:$6SQ-4b)pM/eQoOElC`\I'X:FlHW-/M&/^ -%Z;.7HJos:(,5gtW)3_fm)@)7Sg+K9a*'N5*8@N1"o-:W&526kG6i$pndk]d=N`l'RH5%j/Ak1TKku4BBLH(Zhg8!M;l[0@LuqdfdZJ:<_<7BfedZu*NN&P*TV\W"%UWA610drAT&1c"[4RbUXlF$c"*n&j#Ttd"Q5lZPO4C3W&`[R@ -%o2mLTE!G]K6ED*8E[o6,qB1Pf7fmQ;Oc=rXYAUu61(5NXhNZ[mRop&oW+t:jm4TC0RrU-S0f;'1`1h04OSrl^91eD=PN)(JKBho! -%I&1thSeArcgUr//)[&3/.3Qo1VX=uMsh'(U&Ep?]$Ze!hPNDRiV:caT+[HL-)-_pT[Q5\r7Z&"r5<,F!P&(&SoK59_cf]$UnWaQRBH>$De^ -%2&0Y-AQbePXm\^L`<50IAQlB?/KlVhJRV.9Um;U"d-YNV5n/J1SYa-/+l9-gk)CF(\7CSf$TWOp6`P_=p,a%mNUmLg.1D[ -%b\':JZU<)cX2FM%C5gU,bbX#5MZlondDV;u_a[:M^(HQAF6t^KTU)7JEFCk2TpSs">Nqe'\-?h@@90o66H+l:UFX<+?e@+$0]OeSVAZN#cNl6t#\gYH=Bq&M05@,-2C16MZ'+kOWQ3&3U=5HHNMI%aph7(T,'n"Mh_r$' -%Wh-A(cPd4j2C$FPC.^cd4.HFOA=[+nF?b2,\\dc5gbp"b,>a9-6)5]+CQ6KMGm&\-J]b&fVcS+/ -%GRE^^pZ`q-KWVP,@'Yh'H=/,#a^iasR%"#,>(Wq";G#/Cg4Q5QV?%?rp!@0bMFsb6mUh/MOfI*=SP$q.p4Vn-R,SiB5ZE')"(=.) -%8p2+50bpe[S>k(QEpl&W\_/@A+_\2\Dht,)'t0LI>fY>`%rD0HT<:)U(J/ -%I#h"t/<"J5p3;2;NKiJbm85:S5hl$ZDR&09nfEdC@Qf+>;UUR7:o0u=VIh(oe_`us%%"!gIdC-gfj!'0fH[36Qo2:h7JBE`N*gZn -%A;R-dMK;lZE=9KmhQ*J$X_f6s8Lm`W[oC'+Bq[EG*#nll##9e[jjUfO\N68=,7+D([hUJUB'+din$+,WUK(FN-e_;WV9M0nW5QhM -%%<7LY#a*f;(3F<.]UbMWJ"ClKX&St86C\OMert;Wj!rO\XZCBFWGqQu1`;b)6ai]TdI'\\;jei.]3/acOh?Nj.KgiW-u8:7=`2OXYukq)CE1YULNlKXkIEG0@OH]j:Tj1P/t%" -%hBeSQf.5++^l(r6-PcB@M==c?V#Fh;rXoNC"nVS.Z^144Cb/&o\;ZePWRCpW!t#3L<5QELKaLE@3fM4=$BW`gUX>oTiG`&*0gPD`TiORAK?aFAei9Cg;rY` -%*cf(.41il/;FOIQ1VZ8]8--1dp(!@HUKb$:X>G]6a -%,k?ba]I_-;'@p/QmR`\b@uZ2dKNTIZ9dnd[7Of2?R&XorsJm08$"SCZ:YcEY=ceQ3M;Q)\+ZdSLIT+^/85g+b;r7*T.M3<4WHL"%-DgkN!j-p,"!c -%W2l9=Q4u&0.9g,"3;s#=PtQa$jK`7[bH!25F!g4LE9%p') -%8JSBRBghAYe^>cX%]WXa)`iKmO@Be1NP^*0)C`?rlsq633:LSqe$1OTQUkAiN(?THTHb3&b6)`=9eer:Y;3&.]""_U!.f';G_TH\ -%s,>?/Zbb>AC/W@/Z$%&TDM>7.ge/%`[3p4.$26GFX##Q:_SgU5.61WB)bq[q/2Kkui@J9t+&NS.$-k^j4;3M7&'KVf!5d?/+;n@#r\n3(g -%J]i^`*LSrq?ilG!Rt;$5c&pA?c%)/O\%LZ52&rg-YAkqoQr_@0m4X^uBQZ->b"DJJJA>c<#/+D7)6+)06t9QXK*oai,P_^?o27%t -%#H!;,G?MWuVq7Ec047;*:-:'2!'K'%aFhCkZ[h;\lY6h,/%bi:7rd3dkW)b?iBbJD83KX]1iCEW'gadJW30V`^/EKK6R1euNcFBX -%7V^So:b=4HN3G=f#99&LL)H#W"jg%[TrM?>RT@\K^2D=5I1K#.\+S'l!+HoGMfbI[%kHg='tUY%9pa -%7<'iU\b!<]-fS.nYZ,;@)C./Vi!*7D)_L1r!a(?r>Q@k13>SBkB"jju"0AKW)?oM`YrSc>GM#nhW(9pIq=)3^9_:k;UlK>8*,]BK -%:kbo5qPi//!ZnKjiA=,k8qB2F4UEKmo(AK7psB,Rb,o//jegL>,?#hU!;t3I*kkQ&U1k&=,c3%S8(OX-NF@.nnA[;nWEZL%m?Cg\ -%6"I6q/G1pp_K@&dRUQ6@+]5N]rEb$T'R3S&rGu5/EU"d98FLB\Ls"8 -%1.d?AobtH%3d(YKN6n5HWA_u]; -%Ks93MA*cEW98+7ln\2%S2(+?k&L*i]9XO_Bd"^i"gb?:1A[E;cd$`J(`GmgO'7$*iga8FBoW8s@;Tg]KLGc@=BiG_q2$BtH#?_JB -%#e%@-NW=SdL;r\3cEoT@b>X@Bcr3'P)d)Lq&`hb"SZA\l4!m\og&,Sq^&,FZ9CS%)PXSd!?Co=WFZ6$1qMl4.Cbp6VIDdEFdP3Z^ -%U^f"L_h@.Vl])=l`V^;"^K*=g-[2(b9Yo@-on*aDRmk1hlUW#887"u(5-0j'kftJtTH$epkfg:4):6AY0p?TkF]Udu6Zf@j:Mucd -%;M]=`>fFF&Z:[.p>cSR*0Z,qlVm^os(eC/ZO?D5d(l[NG&(1IBXH1+LG@5%^PT,)*OkkXmN:Q[uW`s;]rK9PNB.VZSoUj?:bI`0D -%"2eIG#&AX`.:3K+SSrE($YuM5\p%=#@OOICGFf)p3L)-j:EP,%nDS4OmIV%um)Sso_uWttFf9cZ@Zii@$E2,UaL -%iXR&+\"Be`?JM8u;@lMR@fm2lIRrlp%<<F5!W<5st(%7(e"$%H#@c;qrjpMd:dfA71ol1K\LLd6P=9$t?QJ=l^uGXVc($0kW@i8)jRQ -%hpfsR6gX@Z6H;!+J![3Gp[km/2+SrTS#]]i&pOjS@jG1RR_F$Xl530!AiSjr1%#>bY;)0f(*SlnfMZ,VAn*TX1;+MZ9Le9*9R8PV -%\"Fr&3p8pG#.H*?J2)Z*d&QIYb;^r&L-c634YA9,)M`+aeE-"Gj)'Z1Dm09Ep -%lMt=ekLX\df+SiNYVm]28AD\cIg+H.LV[j]fkp!`2hX,W8,Gf:hKUU\6EeJ2/rq\fqrIl( -%IH^@(]>?3X+l"Rr`)&8iBlt*p,-E?,Fs)GT:Q-4?@CRiP5hY)+&LB\'7)KS)*a.qq,5i<0,062IeJ>[C``dQ*2OfXR>3fHTs -%gTF_aI][JeCY#=uf33lqrY1%7)?h.4%!h7CN'YLB5cHY#j:^iV.)q6E'6Trb%bT[TYVj;7aeDfP)+$S-Y>f`h#aWnlp-8&b=..VX@1>QJ[?P)@mC4*Mf=NQHh,1p -%7cWCVdc@Z!+X`'YCNfjEA,_eUf8rPB?;mcfB*YJo=jI0BO\.HK<_W\:k+;(*f*']M,!E3E<+s\rKD7Y*JjCuq'Q3Y5@F`7SRb"Er -%.lS:3ohO(@jeR4!Mr[>gMTI,U@jG?8eZlIP06YV0ik!CffELX?.moi/DXagM9$%O9]s3e7j`.HY'<:gHR=b*&Lur73,-7SS3(og3 -%(52gJTVkqsU1dPp.U_Ed?FMlLpK:BNhkh&E@*ocrk%rX< -%=rTT`-YbNi[R,8ilkE)jG2nan/tP(j$]mhL0'kq.C>!34H\qu/1$<;5ZKjr$HUhARWDKu+Z3!^tE7=MCfRCjff#]1j.,Ogb2U<13 -%#;duWa_fb?M?TCqkoMQ2YY`u3YA[2FrmLE^^h -%1$<-1-n86%r_NpK8dKiMnr85S="?WW4@&ktL]^=?Ipj@=PF2uK\Y(0u5ZW%q,M-bN[G?Tf#Yf*i));>>Ai5H,]8hf#7;Bdljt\B( -%>..;[!2'cYBkP^7G;^)&.^QNL%GC],8_a4.RA1c0F5[!WZ"dLM_IBKK.(gjmhiknXdnFJ;R,fVNH/-s<-)S'hD1LJNn+P"*.J38l -%kcOV[3`*Os'R0<0mDu>"0EB'!U6f,0g,0S`?E_`;%]WprLkmMH2'(C:l4M2&BOaYNXK-=Md6*e+*I[7`*b''CYC,,[\9[blEDJN6 -%RJt]/HGFa%$[0/6*k`dF%bMF5266?-2Q)Q_+#i!jl*.gcb-9K'^TuN6+tatO6F#c+qB9>([?9#)E18X!j$r&Qri,!kFAGP9PA*4S -%kRs(&6(mOKN#K!.hAB.La2+du*]>lTVhsMm"'P(HqZAHhH_\QP]Z#IU)VZCr>?op>?CaY##=uEao'r&kGOoDE&n\\A"E!D`/qSu> -%*48,T$it]H-&dH"5JLcPkU-isq04gG;UdDGb@HYY-SVhmnZ@\2O$>X:nc_4d!Y7+!)OufW[pIGeK$D`,-YZFo*,Y%(,N!me*6B^ckrd(6(j$,,+ru794R,[W5C>4g`+:%*6M'UU+@D`R)WD5cYWi&QXC< -%P=:D'EuN#67gTN*cr8XVl8oSd5dW_NY -%`![ns7dQ/?iG,M5j\SPDg32(D6[G1f@iiZ/Oo,fh=^7*.%b-%d9U6$j7_Yrl#deSd-Jli'%p,W"_cfT$hC*'Kd3_sclXp9o#$Y;G -%g)$e2.ekp@A$I6d("bY4eU90.41nW2,B@s: -%2^4TGOI+/m#rr0AfT.201I65rm1-R]c;f#<23(,qUWMj[&"<4NB0dd4\!D)6P"C!Z'ASJZ7$WFo -%L/[AlVbK1gCVP>B>?4`O1@_WKec)pu%.?a4B+l/<;SGj^@^jNnH4E4i+iblmpc30g?@:=NpC\p)V)T'=t2Z"h#1#m61(c)k?B&]&2pdSU:Kr_V$u/b?$XhZk!l[_P@FRgptfDB\/9M1\>F)O`_)!_^4"N'(Dbqr0Mj!M\fC4g3Oh]kK+&Cf)YJk!:BC8p7KL5+u$og*7j0gr+sm3GIf$DFLG[ -%WmK;hfj9'e\#nNEP^e,MrRYt:kHi2fT=t+!PLj0trO2.HmsXNn2g=`'s/d.+*a_)/o[ObMIsUjq++Nk1(O&ZY5(2tG]AGZPqHM!i -%NrT.,h`Um2YDn&0adY4B?@VrE?bC[[g#k#;n($amrq,k2?bL]t?11!1A,kJ25QCAf?TnAWeP#i;#;:Pug#m$ok79fSd?!2?IJ:u6 -%YJ9lagqA48kG+Y6qr7CC5)0h*FcroMb'j3Or-'j)c)8ae.'5 -%29,\8!N1hp#ocVaYDYE%bFs^Q"41e?Z@(hAb2[9/j-t8]IJ;"PcT_BVh)c^+nG_J.(Jiq6p#ZpuG$A_Omerb!YPpW0Nq75H -%rVl=Oi@s!RIP/AbN4^b0ci<7bgrE0"Xi8+GB*3"MFZ4,ae9fNM@I;[89M^_I;7B$?5R,l0F^%DhqsP&EoLr4t%MN4Loq)2X1W=8B[@Y -%L\20Z@$SabiQ+r5:V\$>hYgItWu[`WR]9k7N@]FE/lX6Y7\qUqV7P*f7gJ*",_>>Ne%$9Z<3lL0"`#S+'f3Hk?ns&iD2Y&im,g,o -%;4[/$%sVT2:-_*G@F@k#*'un=ei8)2d67Ffk5HWVFdpL4Z:LPpHA0q+_Au@#M-/L;&)W2K>9P7S&3;;9$3n!0/F)^uT%;AfRr)V*aWcE/MG#!a-E;)p)Rc0/>T@&ksrV`_C2)Q`$-d$G=u<^]>To#M_^ -%nOSS^OX"C;I#(f5.A]uE#h:b\F4k3W$m;s4W5dgR_22T[h)LhP*?15==$C!_K$sM4$<\o-KGppH,*L?5-cm:7?HZTgZ8)MKgh]t3 -%F((2aG9;+BmK\=TNuCb`Zl+BI5t73h(nfJN`<-aFJg -%X'jIs,mV(C.@\Ci)kib`P>k8r:8s+24,2rO$j)6=d!fe9V%VlH93q6d?JCXEpD/>_u5)>U2K1VP@&g>jICjg/fTBiP#gs0p"2N)j%('_@[R'Z=Ng"j3-Lq*ic/ERuaBOfsD*=`Y6C9.M`1ml\]%i3ms4UWT3P6KX+@D^$QfiV9bmqb*$?E%J7)*H<)UFK.^PFI?u"t0iXCdfd*ClFRs2*nHg1&EVL7S99Wc9jB=C140ptUuc,UCiAsR^c848"MB^t2q87KgNoI_+(\YbC,G)Kn<5gP;tPiQo$20*lLVUkAJ3bO:CK87,sl,?L4 -%]c^Kb:OJ"Fs1pc>1Xoh[\:_lBjGaOW,gR5b\?J/k_2]e^nj[7>jmIik3qk`;4^E@#VN8@b`6*X5ijB"C/&tq=qV/tX"N;b"Lc!`8XAJN$Y@;nUWXm9IOCW9LB8=Ga,P[cMFr&<>!X/*S1m`'_Me(F5^0P2\eC(V-%m^9]i9At'j/OKpgElQ+n_pnlkI?U\Il;-oP.PO0M-B=FCDt`JEknoJ@/m[;9f2c;$ZLFabWjB -%ZP5>[$mqhG]?@79EV%_jd,DO,"U-k\F1uXfgo4bjOumZG&,=NF^]#FE_]"3f9of&9,6L74^K\*;m.W&1u(nPOq4842LLH:nWGU5O'Io8>SS69-$WF$n.?W -%o?S@%ePteS)LKRC_&!)7@oZp!qW6NtVcnJ&,cl=I]G_3Ak+==cuD+MY`PAf+pVlOLBasW<0grQ(pA&66`>1"g9=[ -%cMW3uaA\+(iR4(?/+"Ic4el(>$S^3VI&0PYqstb.^1BtGT@jX=R$n97Zifa0LZRmJRR[u`pZE+^kE(',/c`lKTJg,2'"(Rd]_>5H -%7IM\3V`%rI=6"lAn&?p&h9i82U$cud_T'O6mLpQ,.L*ND@B?5cOB#\0L1@&p_KT1:4;_r[u+SK?s@P^mip(Jf\Bl`4[= -%@/&nWB@l')ND&k>*U\Oo28&`45h]eYR+f?_:">>cd&J1:,`CD]*\i_tGr6ise"uHVTd8J#.b`XF*/-2]YKQ.^NLg -%;ZHn[EN^2nJYW9lhY7a9fuAH$gQ3c:![V]^@Ek%ojn@gC_L45q'U%%U\HsFM2d&pTDEID]B5UrJb'dT4oIEeM*=FBo\fDnD!IJhA -%XE+,eqHTGCts_KfW=$8Ek&?E(F3IrZkmsrZcO$5ibZC`>fLCC0*K=9$PqOX -%_M;7OONhoO.$E\%/]c%f6actES,9Xe/=WEDJ1h^ViI]0f:?2K+D!pG;hcr.=$`p\FZ4#6i3P>e'FQ"DsaO''G06#>$H7p\pKqlA4 -%9:K/#&5LFK?Z;s%@)9]TXiS?\=`"1q"j+=]="F@'(>N"gY:U0gJ706[P6E2c67`L_k+S/r9tL\cCe1uLjOl5*.ibo>jNbT:%8XH" -%9cNY@"f338G7J"tLqXVjg9?&W/@H]*:ZU:MXO%&eBE[A,(SL4uk-/[$>=`;.kcir5>Ynpj:KKc.JS0qSqBkcQ/$m_E*?L0pMUIac -%LQ)1qY81ZjRK\`)+"J4kP[80UYf'?";#5LB,e,@jh7UJ&R+3#Z24a@+TDU#1j;8U -%CPi&h>=($2(O,I'pkBT#=!1"u\?TI>jiFkg#X=kJd`H)mPc*-n5j8iZQCLbJXk2a$fR/L/..u8S^2bgc]\t2h<=*.BXt'Prd*3Ng -%]m?6>::)f),V84Vcdpe/$m'CMT#`VB$ZW5?Bp<:/4.U<02^?F!Q\gHLHhr(EqHQJUCRiJ-[ -%Ib\P]cAU+%d6igDUZeoT&Pj`XF=;"?0\LWrD=V_WFr%;`7J4Z''Pb9>A'UTedG8*aaF9K/kb+'hG1ICJX1S_m9qL??[QAf3/*AQ( -%Q)eXUNm1dr+ASbQ>is!:C)eIZ^E\7b#npk_PZH*?dp>@Y=1>HlU'+g:ErX:kqrAd9Xii.1k_=Tg;*bWXkkt5IuTG")m&9IZNcc")&nkUnrS_6H3P^V=UZ;i7\D1KG<$kM>sPVZP#OTVu\HiQQuAc]WkjI'@E7J^=30'i!Pa<$]JoX0sYC6Sre@$^6g)@L-q8& -%GHp&a)?%/-K-e#r>j[&\q&lTA5o3CZ,Z)Y9M-b![!nYdR3^cOj+u_P@_b[Qr]bFd4[oeh#&G'?dBI!hN7H\O"\rHY();r6A`K#B* -%1f+:RL&Ih=O(co&H@jteX4,mp5bG]+dYM0l,cNaTrSir_(a5f4IsE"1/Y:pna!,g"NePmS,pc"@KR!CR)cfXZ]i55'0W0UVYgR^j -%!Q[al..I`N43cYF0?OS2lI5=;\rZ5*2/+lE>@0cRQM0Ru)9U)AQ&@dn=kQ:'NjGF#nlB>L]M@s2)nWltXpj#%F4aRVC%r`+SCIIa -%(],dVZ$O=EXt%1^hEe:Z*Y=4YRZj69k\,X:e/YC8?W*IYHI9p[4p6*(8XS3LVmoK]o,J%1bN,dt)mT"bD=%#\8Q).m:HlbXKCdN_ -%aOri,cG^B>L"+Pp8StZjD,mDd?Jo5SSFDBqr)B4"alHuW0\Y3)eg!khoL85NVXHqTpC`3m$'T+_'LFaSso^_i.t_o6g7@o1J%h:6B/[s5ngDN"07g/p7/+n9V>B*knma+JT -%6!%QGj57mK)ng6AMn:t+iW,DX:n3kNd6Co?cc8'IFL,&h-P_ec9[JqN5)EN9$L3)q7];Fo1g[kQ3&AAP+uI]h]t6X/#'6*q%m,ZVe_W<>$T_YMa*s4b@-8kM -%/PrY[f:&k@@_jOpm^(dsoR1;.2=,k%i8-Jh)nJlo`%1aO9db[TQeI;W4c9]S,Pu;\=$p6JaS@GAYbUM:Q*jkP$=RtROu^6Li!JO` -%Ks8];[Pn2'e_G[4[R;!87)n;t9Z$s/Bh-u:bB=32)L(sJ?"Y0$h;,`'o0$![#Z8B[O-Hl:cEF"q`f-9n?dRW#Zg3]h@--Xan#%=@ -%(b?o8$f+u8%d&>\RiN$?_r*Hi+P@=BAA5lo0CEf851$,3?Z-Nk^e4^0A[lqF%H\EC^6i@k@rj`=9,Md%`W6f)Mb`#FGp0qUZCc'A -%3rs6&iNj?i>fZ4!5i0s!hS+?[$Tq](s#)"f/]d@G(U/7\*iRX_CbKZ7aM/?FYs#*U=FA!QSq,RC$.WkXoBWEB!4d6!kB5+[<_\0_ -%Xa@&tPZ><"B&r&,MM6]j\+O!eFp -%P(]>%i^RHa]L>?5Dbsu,)a3RPf>(tYg3"%BIJ!U][Vb'=\;g)CjuSV5<7^P]O!tjg4:L(U-j.oJfLT&2nJ<`Fin$aUcq\tni%gNLUE!V!YeKpQ80(-o)oNmWW7n'JnZc^PD-=C'duE]+Bi7?(hPFZ93eqa7gC6!pgS&\gKSfS?jJb\i_le2i8Kp)#Vqk,g'*3tunk_]g -%*he>uI.t'roQW7FaU5XI!F44jKA.uTHsV1U5n!_Y;I(ZGNmKNtG%&`[G[p#04Z09)[?\0Jo,AQqAR1%9@gK0olhe1e;gX[^=L",Z -%$*?1m%-[o2TJ_8K.e=.8o&'CtQ)@f'gkNTsUQE0HXXB4(;rM?cf(7[pGL>s=*U8)[U=OXLP@H\gmG\VZo@KRn]@_T06MPH6[^SN[ -%h?oVX7KU8?[@65n^9)%T'm!;+2K2g,Q"W*opH$1(3#Jgej.+po?BnX&Q1tKrA?3G,cS\KT[Mfo&cd.u\W^hd\e$4+ZM;2Mj^P]9` -%'2nl/**)?udPL)-Ca'm-q>cqoh2C#Ih]jo;(Y43#e(9`;R$$Q<5!2rDBmQC\hEYt8<7?9`8c92&XUmmV29DG(E0O?eV:`KdgOd'N -%L>&L>OrT@(E?f*M!l,;Q\JEtp(8CNN,joU(@:W>64CQ/rPaV>e)hC=gKR#-``u-&1PdOuTmkItt:6C0s$tQo%Ho8d[D;53?!5:c5 -%H@]aQE$<8+G.cr[3)(#OC-g#&2FeTUcA*Xk+4&'S[KHZN8J#bm7Sf[oN-QGKn52];.tjYRi_eqtTBfk.NBi`q8f]-&*]1d[Q^A3J@m -%9iA1KI:IB+jrhj$]S)O,o!tsmA%Thlr3o0lG,1eO,'HYR7kN$%c4`/h`!dPc7RMK@Nm\Y$d@XV8eOu=k)R$^#90*dZK^Rollop'AlJ=#n`s7P0AcX%`>:a#;=fs@2u\tn]HU:31>I8i*clD\ -%bG.V]n?>^n)_G3Kr-UUa,JR(je7#Tl;(r3r[/b'@Z;NI -%Rbc#lc%:I)#LMW[a`jl"Ca'f__Sg8-@r=#?Dpj>="+YD][;Jo..@n-,3Z0aT5"h]>:oYq[R*M]@I0lG15ZIklK8g69R)f?'"Nnkg -%p!!c_=LZ$e0IBf*8**LInM!EN)Q-60,98G60#EWfITgb!Tn60/"Wi[t?DATT-%b"Ec;%GrQZ+[P%9b?*pT)^/EW%"#Z7n-7DUH.>@dIL -%A7A/f(R#(>6pWj@CNrClnH*L\KXg5RadmPKc -%X]/$eBItEI)PBP!0u&?ERtkfk4d_[81WCI4qdql@-AMiX6?U-(q(P[ZAsD%Y<]34PG_p<+fH%F-L_Nege[Q-omn`8tFma(4WdrUh -%gqUeMkVLQ67T_#QQ?59aQ6dC:TWW,8J(\as%%iB6YOYm0p+n#P3g[j+,k4c,^`M46cuCSdj,6p%g[pCSh6R(jg.OqG0ZVbqbJ^Nh1o+$6fB0HQ9R`GgjpPf#:U(I/I+=Z+7>IAbV'+8k?U^$*(4Hf',=aieUPo&fUXInpO'kO3odpMk9Soq/mCrFB1f9b7-odoSb]nUpSN21KR= -%i4EpAHMQP*lXr-YXJCf[W4c=8PY(:]**MGAR"\NrKJBdr4G,J*3"STD\Cg -%4I0`3p,R+f>#%bqs2#efD`IelaQkgGJCZMh?dDOH -%NV>[8hB.gYnE]kK^\2#^r7OkpnGE7-fC<)6IJE*rJ+`Anht\1>l>QU:bCB:OrXWrHS)=&\I]NJ(J+-86r."Nh++4U5ocO4mRt(!q -%J,)lirce@J?i=o.a+*^ts5K[LPLk^]+iEia;[LJ,]2WNhnK1oRH^Ms6p!\O8nkJYPo.5 -%`j`_XZ[_u#s6Ronr(hh(5P8g\I.Z=pq>^C0s60?pq5aOpj)t=ps82ilB4(Z+fC2_Rp>1;r&,s'MB!Ad3M;'kP;>Fr,mPAAZ,th;-0Isa,_J?R&1"8X+AjCf8T_DVR?.7)B."EkMA8s -%%rKn,pY'Ddpoa9Rn+6/g2/Z76?amrQju<(Mf4nk+);23morGgmTDf/spMAO6I0TF^@fECrqAn3df3)VVsg]Dgoqci$Z;j"J@jA@?>SigDptr65nE`6Z*m$6*]5.Pu%j\D58QhYH'$e0=ma"nahM;kE\t1hp.'E1XQ>ubbh]WJp6&IEW*h7jHWZe)"QXuR3OI[k3$$rQ#"bnX,32+ -%n!1q3]o[m8=uWlrJY\q:[U\JQS3<&l\V%c'Ll*=NS?*J_5O=GPS??5Ph -%PP:^W^L,AQH%T(p_4]ISQd$Dq,0r0'>-(.S:]FnAaq*5EH/)V>au:,hY&XL>NgVJ_`^PHYh'OfOFRdje2%&F7pj`08j<*i6T=8h' -%2_2m+:48!s\C9G)2hKAeH#2#mnk$U1SN2#qVk;6ReLJmOa?(!F9(ZH&j2d?'9*Q[)"BVF^?U5Fh>hV'5:!u0(7cV<,/RPb.poHT= -%a*nu8ZqC%!^@1^ij4i^>9%@_7CccS(Q/K":Sldp&WA'$@p\f(,WmBikA8qLr;c,n4D8>=i0&=0dm-?+&;S9+/n22S2#Of7th1E(l -%F%4"?HHfR+B(`GY?*!%#ec!Z5UNT\[rgt:Hp>Gr#,ASVOcTlDZcJ/RGG"TnL5i7s%t2N%_,J\XHfSPQH7_2q -%N7Ifl%t$++6/oaX@G%%/n6,K]YNqr2r:Y$Kae*GLB(LnZ*T%/:'DH%PJ,ZX68p!,?hfB[TlM3S9qNjqSX?!mF_Rt6aVp@.45<35t -%nu[95Cg&rsDKm<%h\*D/IsgLWaG7IaABL4EY\)ZS]mXdRpa.LUD"Ve81NMrT>1G_6]3_R!@,[E(8+pkgebS#T2/2s^oW&.j#$mY5 -%X+%hmD]\pn@[$"(HbIZo4"nB^jZYZ5Gte.Kla3.qiS_fkqcAc8%*[TSm?.BQkfr<0*-CL0d/LR9'`)qpec>C?4jq>9fegHVk/)`9N[IXfecj&^/h%7YSQK)b#0/^i*d\jgd, -%]\R)^!F.L&D]N%DWh,[&MtR)An9'%W0Q6e#!H_qq)`fHn!I-'P1./km?!ocj.51A`5HtufsE?/mp`V.gp#*A^*E-]B53ia,lJ`.q[mF4Z@UGAf]DTGZqQM'nNN'psYI0sSj-[$>a#6\,X6--SK2s!##2YX$e'l3^ -%rl8CGp/L%`ra)l.siXR$;Ll,jE=qc!"/f+6)@*9R.1k6q8P3_dE_6AbH*1oftt -%*T-)QnX`AaW5Veq;,MW"q@e(jGND#uIXKnj!uk.q.6D"VWI*!'^5-s#k;<'qK`0O?gJLUi3/b\T;kBD=+!mUGR^X$CP -%r3DfiFtO`!JM/N4nuL6U],k500roRZ)a<_fPqWi0m34DlGOF+Z>e&u3DY)89F0O*U?9c*82bjKFgK?V`5KJhrDP,Uk@U)ikhZX1o -%ou!5,Q,7'%LcrraR8K__hTO9`Y9-l:%>4AnqIA+u^QnSsgcK.m0'l^ffI3jbEJK=k=-Hk2]_kfVgTK5SbJu3*YLi&%FR5s?/P:_>>B.SBI/;EVc[-I` -%KT\J7mCelhM8AZ$2braBXiUj:.W]!_D9=ZhCXq/4manj?srL^!U9)ri=EFa&WYbl*Oj<`:_/g,eY^q>F#\3 -%<3=d3n#g]Jjb#'R2(ZiE[dH4n:f\iGBT;jOa%W'Y\4ueGa]`u6f?fNGr4%%afpp$ncN!&!mA-(Ss8IpbMhs+!I:DU5ZEZ@B"Qk9ZQ8al-)-%b1J`j%DO.JCPE:^S6`XA%n%A,ao<*&+b&k`bm&<+r. -%]`se^PTiiBY<$VWU#Y#jZ"@[;=KK[/FYnjXfDQ)h(Nd\-'e@jYjL"/]ZDti'^s0lI5F=LG:]7L1$[5`nr(c[^UFZ2,Otr^!MkkR4,-Z5q".Y,4(.5"GRa`^6MtDC^c6F]4*8D_nF_30gH7S0uTk3&s1p-S,eV>ct9oHK@IbHTVU;&XWYj&NZ -%ir6K,5&,it\k&TI;eJlHoR=G!A7tQ7@+(uKn$,a)*")NnO>_eVC=r?ZtJf_G%JUb$&gV%>cV4(Ni)$nV%lE-dJ/= -%Ufk>rp0uS=;3T&pBrELYn+Gd#*djlt6$qbMQ'p`arA&;EjlqiD4f!.i3%aEpBHO)%#'.Qg,$Mrm=-AHe#Hh*khYX9hqqJNA_kr3tp3)V&^4o -%'A@j0O*B,u/aGtdWRlIK`:86pC%6Je.eK4DGi!Bo:23S]"uF)\SPp/F$#[ce#HgS3Mf38H^?b(`KiqA@DTflV7s0;7ET^G4cmNVC -%SC[kte>tH@%5,n,G>G92E*qu!&XtGP(;%.jH7_fJqlW*,T*m.]/a"jljhT82gK-oKR+*%`lJ(-a4s&.RDOi,&Vm!!>E+Aq7pCc?u -%CV/l=Rdk;9?I4WPTDIqd:4$qtbCgdUCU#c"8+^_kGW>5*qmkIBSN=JtrSfgZ/R6!\`-!X-mA#RqP2Gro)>1.ZV`"r6%NjGDjY<0k -%n"*cCS7^[AX)o78]Q]RXPHaVq^-$H3f$2C9NugE&jQ'mDE:0@tC/D0g44D2fQS6.'n6,5.Yg;0U=Xs-r&"iTj:FT2Va7/%Nl6g\5 -%?uraI4:M/b[r:-9*R7%(%P5b_mXO+FdpUh.A!+1\rhT]I-hR>po6hG)6e;jmDaWZOhdXCbiEanGG+'/#Y!//a`l"Zla1Ntg^TSG( -%>GY*GnCbWcNo"dUlLE\7Fre17QLDu!Bf*PrYEh=lr:!IHik#DBlh2_=Qkps0:N.u!5>fBr/72Ct:[IJW;!?``.rkK'VQG>d<7?5L)#5i]IEa"]BI%W,W%Ib(Y0.6e3?n_34PqtKI1GPKgi -%o2fiV)/dPtn6J#f?`?8/qV2s@S&@Au.L\o)>(#/@FoCUUlSn:fbK9XQa;)&u:-U&1-8/UdZ[_fZd9"$cInP7DALTWj&Mu6q+ -%c[7g`hk\SArp\C!c*KLMFi-hH2OmGrr1<,`F7.sF]8iJtG4jq)&"?(OIBU#FqK`iTnlQUM.^4o4]@ -%F6-['G&!$#]8H@[r9,fd$feCj]4]WN^8obV097K!$@\E/`clLi8)Iuq1h$ar5)rH>re8GIbZj04"?:pJ)])F*4`P.>W]<%AFAiioYB!a -%lbacKgblQ.\Gn%G0kJhU?gYaK*a:e)IV@*+oj4rmi\.fl`Ei5`IP\H;7pD8=iEH_*1W<8WU:?YTR81a"O[="mO?g^!ur>5::#C!>B5.G2"Zp*rF9H>9b2'9MBlhBR[4R(U@ -%mbPBtik*I-:@6NC<1Y/M[i4o;E93*%0&1i;\(qQQ_FJcd=>H^kdkVHO3PSap`PC0-^--N1lKt58\t&YAD?N&hh&ASN1TGdkg7o50 -%L!$e@3r=hP#C\dZou?C2p[18eh_<,sE;0'cWu'*RpjVt7cf^>Sf=FSZ]T?gSl](J;qG1>$B'\ISG*\:3!!3KqGk)pk^0HDOMXkGRU.hrg7Q]dhH5mZCDAR:5,S5O2Gi21+Q33=[j;j#s*%CHNH"2K)ChC7t/5R8!NHPOJ43LtCaK;34:qTpKE@%>)ZFb/iD"?KJ-%r.$RlZa?](TU7D?ti)F!4B&Af7Ep-[+Ei)K1SM:+9)tsC3LZZ:+-N8B(:k"#Af3VY/;^DZ+5,sH2.2X$]H*\Q -%#d\ZAEB[P+AD6[DJ\s"43S63b#p]VM#*DBJmii2ek_IqPJO%L+)B>=?=Ga9#!F]Dp>"_t"JUr?-*eHd-e4F:Im%?StUt-So=AUpI -%6scC:IXoS]1RTpc(R?Bj;UZ*6QO1CRZe\/&'"s3?)GGp^H(jXd&NBjDNMB&L\fr]QM49T?:e]He16p:j.TZ$i.JF*^MaK$e\fJF7 -%T`gDD&m$M"bGU&&-a&*%LE]?DdH';![=t$]i9H2WA5kF'Zj0nHd -%"+:SSC_H?$Ja>r^%TqoD#7<9)M+hLQ4S3?]UI5%!_T8[og?6jOQg'IY5Sc[7?*b1k(f2#X771Dg7]Sr9.Z$hp$Z&-jI33c.T-P)YJf4?uF,'W#[M(B@VC<]\T(@l=C&k)$neHKXK&pd1t4\OK([f&*FRmJJ,K534 -%W%f0U@p$Ziet@Pq(%CmX4m*E$_iOEmrV)G%3E@i[qub=-r9J8CpPEEOl_CW'%]+OOYt6Cg[)^u`Q`+-N0qYDsZ1VT2Lt/`!6^HJdUpgobXgO_$sRLX;u?rMBuH$sEB9SLWgmJ6f4eqT.+&Q7a+KYTgc#f2ek\de(Or_k=/-/,-.6 -%_1*8D-dXsP6c"kXT[b>sf2tokXn@+kBg8,XGc0'L5MLhgnQX%\X4k`-uXnIhW.>$S8k,k'-M#SNB1cP1(i:+3& -%+,iiI&_3MeDJ:Kt]CX>F\S&p;^NH&*$c.#V,Ik\5eZ1'!TYIN[^RBN@F+nA10Q$d:2Xnaoj'r?u0AcV@48sTfM;4V>3m'*YlOU/9 -%J,HuFg_8eII(ae\,Gr*>$`\CRs%mjcnVc:HJ\PM#r@KuPFBu6=1O_pl\i[H(53;Y*\a/t&4l,&"f>?S65=%8Ve"tr=T>k;$o<.95 -%gX-'%XL@b1DXJQn8"jn?r;l&BZ6()H\uI(U]Cs6k6*^:5/+u0J]se_dV;@1+0lSQ_]_;j/fHK/8k2r6R"+O?XH6G6AaqAgIRir4, -%00!56m^mXa,lH'Z9CU86?OiX>droul&4h8`I+VNaFo;e5\Ft3UTQ91d6jM#g[R&oW+*)GkCrXUL;m3\n:oG(gn3P*8F*;.#n(L.= -%[Cn_r0nZ'IDBZBae[1<&EL!Vb+NOkeF)t,NMm_?]&F%)"A$Pa^n)rj"_QU#sXb4i'`qq@HiUec(<:T"H]*2,]Eb;RYmt80](RG2. -%`m5Qj.8s=@/fas$hZ"/D(IF[AReBKmb_b8iLV[9hLQ.D0m<0HPJEco;-9ABGlPHV7luMO-mEhcgmPTDd4as-Fi"8\8HCoO.iIT`j -%[u7ZjqKD;gAMD`d*^\@3^HIEgAM]tLU^E*';1$YHg/ -%=4A-IIseA#k,(3HhgOeM?ihdln>Gkb6UR_Hpgg[X7fA0bqS+':\ef;^@DuRPr``U3&VfZKrY+Ko%4BID-o#f9a%m%'Cp*q[gURi) -%R=".S+(sW4mJcdf38b`ORbU4J]^D^Q5s=tY`],#u];=`J^:ocIfXcIDD],3\RSFc">FnA-3kV%Hn\^GjqH)=K%M#.=HYbp[#A1-! -%1P[FsI\hK\lGg%e"MJP=N0TpAlc@Xg5,alE?p$0 -%m-cB!$pL8t-P#d7-RL*=C`ZCEi4YA`O"0]l7qi"jqH2%:?#7f1)i5#?JS!K*$g&,9J]ZQXJHhHeO=7;_d -%1D;!:r\L_WEaHdHYA5Ek^8,jfo+A`OZQohs"D>#u5keO7MY(0D-Kr1`g5:nM6pQ?'B1Wf%:_OXtKd%=Pm-_-b%>7SMceAIt@9[j@ -%g"GO:PqMU@pu5Xmmjs9"kTl(`(X\V?*ul(j/[(A5.ZH5l7:,I\Y\XDtI+$3nLd8$nK_LKKqA:?C`TP%KaZ_t/1Qn%*d-QZQ0aM)& -%lu>Hsp,'mA`CCnGF<^aGk+`-?A!+Nf:=st6CYJki-I#S/.9jJZH'JdM8;Mr^_&j"_%=k;8!T_>1dL]PUE0Pi?R2!AOt*+7 -%Q,_.>#0Maq\uXWO=bn#Ig1:^Tc^$9c%B7>I."7;?'\9i?>!82?Z"mB.3`+?s]\"Xo+;q\l_qI_aZ&8bsT:X,!JBXEu0mj2q!VAL% -%NAsQOmJm7+0t79Jp?[A4L8T^h`AJ^4Z:b]h\4-8*SjBrL<%0^aJ0@O35'XO&0E[mP_9:*WGk`nU)Y@/EJq*tTY6EY(\k"oV$6p$t -%cuTie(<\QIc_?,F/2!\X!$?dWOD-9&iYj-o:5Nm2SYh]I)(8?R:F8c*kRCV,T*=;(ODcunG$tr*#:+#Z!Am]M_[Xd2Tr(!0kV9omaKQL8o$f!#m406&M%V5id2bjOC#8WOIGS%!<_\jBRbR -%a;CHJ3l6O__@A'%37P!%P)gf"6XjC^ebVmCemTSB!!P?@.r^b9)^&$P6\0eZ7Mc8aXpH/m,*+^^Ee0$d)J?k716g6$/R0%tL"Sb6 -%#_O'JdD,7:^'\Q+=KJggnq)cLaYYI"8k:!K:K9su^`^uWd?jSokZ1M\JoLof@dtZ-U9(^SmHcq4!MJ.]EV%;0NRFI<2kLS#1kf'J -%e7Do@a0qcH+?S\+X&pS(Uate40Pj2K3U!o_Jl%!E]sN?h#C4IAmV-FH5hE(oN8ZdupoFQ/7kub-PfJGqe9pKaP,k]a]O7#O/7&F2 -%cfQ_(A\eSgc1e'J%,I3AL0#^a0LhNZnc^]Pi",ql-WIbh=paXTe]\5,_))IN@#lYs+S6M>Y8iOJ-US/Q`IUG)YR8+[Tj/2T(j9DR -%S-,h6Z?/`^H(V>fW#\Es3eV\[+XMhd"9bELd"]?#'(?\_R\Bms0np;:$hXRO/O=GN*K#^9dJ?Il]'aUA4LIJ!E=%(!;Y+W=#2N>V -%/h;VJ"j4C4)2p@6:h/aB1>s%M0a1C^P_U -%.S2)kAk*N=,9(+#'sT$9.UlPX+PCmB6B$4GD:u(*8jW`\i/6_>PkJ'1;Gn0M5jOKL;B;Ad^Tgs]dGkkd4oqJ&'J'e'VK6lA\q5kr -%PR.,oc>m"#!2n37(?IY,/HKZqYJRsYAA$"%"nX7)/c_e1#4GMXTGdABlGkS[n6?#eB!0,8Ub%7VW3f[g)i'q_,0Gbk>[ilgDU;0] -%1+Y*[1ha)0.#l28.]a8oan'dS+XRX$cm.,P'u5d)/V0h\,@OQX^p?aXON*Gf2O?[Z7mUHjd".2DdNf829#tSJns)?Q,g50JK#.XD -%Kg]Z0=M9rX(Y0pIaXZ[H4#GD+AU;uUM2C7B-/_T2$Ia)T*RRR"&$Tp(l?M7t%!o9.$Hb,ng.F:6n6E^(!YAb;-7%B4#D-6Q&iO=k -%6lR7RW8$LF&SS02W_K%\@"jWD3Yno)gk'(56N)Lq+e!$P-O[6.GSgPc`RZodaiU-id9)D>7N=&[P(?%J#\jVS:$NOLK0&-QCmSig -%K1$*4HS+*Y$i$6CG*YY6@ER+C'ibWpn]7GUnOjOc(#@@ChrEp6("aYr9:aF1;J^O/MkOY-Xscj5FP.D]N`]KS$#ICDL%D[F`3+`Q -%iG0jV*Mg6=Q'oWdkib"?D+uV>[NgF]%[AAL#,M4/`C!r=^nQc'bd!IU=<$./"i!+0oE#Q"/lA=f#g:PPY@T3\,H(T+aKQ(a-U?=7 -%js#%G-hBd\OO#I/9t"V!-fXsT$tToWYooOa$js#(&P5Kup.UekVD.$0[1Le73f@C*iR/_l7KNiX7T2[[jXZm6RMnjiD6$p%00h6T -%!u)Va0d24XD-Ab@Ymnf^!*_.cWZ?p&O@7b?55_Vd9UbMZdm9.Vo0mUG)TDjS"iWAl -%Fp5%K#nYdsE!O3]^VKk*XX6R!H[VOU9ZI$C`le"N4&!/6l%LtG$GT0.;1h@#,(SQ.>pYOpg0Gf&R/!O;5]j=nAn4p$nRh=@%Pqq/3jgnS=)+B^'TH^Hr5#OSM-\t\X$ -%%3sM3O5S\j!0+r"_,TFM3FI2V$b&77]kh81au,fD_.j%ZXm2!S#-3I?HMk1%[EaPlJlpT4DkZ[mO[_2'<`_T'+m+=ogeeEK:]M(s -%%2r(WF>?B[P6D5Lo;#->M67iTZDe)$AWs(+CX@WK)J?kK4t-DFgBFm.:'cOrbh<^p;JN)'I\+SY6li8er@^qs^uu#QRIM@9D/6U]E$)Cc=T2el-dHf=SD*2@90)?&/u>4dV8s -%BekVRp$F2N?CW!Kb6`r4ZouAlba\F$,((/GKm`!<5a1T7O"0($3kumbSXuTQ3mF)?,?dY#i1sb`k>P-#R97$M,QoJX=,\f?)C!%) -%[lEA<>$H'5"F]bpMea*?/llF8aun-MPGtCBoWf9&:Y;uFK2jH[CQ&-"a%^"U5qBNo!:Qt.CeFa8KEtC!6CJP27<)T.!,c!H[NW&) -%Hp+$J=u9RHH*i@fkZ5BgNo%Q"f(iMn$;0=l*LRl)]M=Y%+AL-@+@(XH#WONhfIHuo)3^,,H#JJp,&A"`/V'Ocp/HE[0H)r`%"_OD -%6mm4ce!/.i9/@o.E6E!NDBt[-iJ^H2ZX>oE"s4Q":#G)$3W0<=P!:$L3Q8NoP_k4J4/Q\uo8s.:B_)O)V"o.992R4oianTlAf+T[ -%$U>o>mh-cmi@(G?m=f>d&_T=gnnQP#dZPT]4q]lbZK6fkW@c,KJ5LEWB_Y%+qS8ela-B`Ggus^%kYbf.ijVRN4"UPD*iTL0*=]n0GN -%brdt+9S3di%AF9';!e!T`VMe>XHJX5rPsgsnKe):@]h-Y,Zp-OhBl708rC7>7s]ddqoEFc44l4c"%93fS1BH9ro[NN:Zs;-qY+>` -%6MB+1CE2G]4^I!f'nQDYg63?6,q#OVe)TOeZLj>RL[(/I4Ln:d;rsRjmq[ajpsn8Yr=6[2NtI]n%6jSnOCPQL-)el`qd\iI7=.!" -%$'`T2(5i2=rOG%58Wp5@6tMFN$T_GPY.Ya$P?OO^V(Ap4FP`';(*ga=!Lkb-e7nFX04uW]EfpW2>V:2r%:#5 -%%_VUn3#emB=,S!E'#.T_JDi'qD-kp[(452?R%6q1o_YRLh:!L-:o$_Z\,sF7%^>:pCVF#B'oTb+Z.aP]nL2_u*#0p=Ln?Wl[]C7X -%jfKkH!DP[epY"@i@^/6oZ9'=F%DCiWEBLb7]G._ap40(o7]^FPTp`/fo@4X!S6sl1(2G_+GK'>NSFTGIT78X(`a[JQ9H>0#Q)luh -%g#B7M2ZT<;i`G/qc(-Z#6(8Zj/7^unG84C[k6tbpYo<&L@sRPGi#fZO/k3Rna*Et@Xfst -%1'n+6:YZ\9.::pn]:lh9:S8M-Wd2;A7.W>>H9fBi$R[d_@YK3r%^-_S%Vm7bd^*`c(?aFZ0(KoSQaJlm0l"G(6S6&;H$[eEXD&uR -%Nu+s%^J'8_7hlU0qR4cQn$Hkp!Ih:_h1mkEB(@GD,,aVRd=Ad79#ID%ca$3eRra]u4I^nn%_&0.4 -%Hq(lDEtp6+X?_kWf!o/QYuiXhUrY^qTl%D%62>V"(1'"eE4\<%B3U!(pS^^kgoZ!^jo2kCqR$2lD>B[AKWi!NO)t_D&9p93bm"Ebf -%/O&""*J0#8&:",ioN9>U3PXh$$bcd#%%2UbtVt%Uo*K)dZG9)eXD\)YEgUTZsNE:r9jH[ -%^2+I`RK*`1\ZnNg:Vg\0S8^H@UgO.FPS-Y>RZ>6:,6`RGB2?iUVf1UX_EZ>K*.-Lg1%tV0(W23HS#0f7Ji2hY!KGn6$L`Ib@Vg(4 -%+O-JE?%XT8WYK!/+Y6V;Uhi62I,C[jk.gbIrhaID4*2>>T*5nE4M>p7cf -%;#5AHc]69tjk:i3qYg*/.O"(<2^oTX6O2-I1H@0C$3lRA(c\[Ff3T]:3hLU;\[OK(MKS`.@_Gn;:?o^J=2c[U241ZFX"A[Y5Ar('5'E1L@`3*'H2IJ(;qEHtNT[-lDjj47Oa6k7%U -%G&E^MD"oa_HZ/Xl*q/b$@fj+Z,P0!iI;o%]&,4Ot3&it1/iQo>7C\sCL>r*n:S+CFDK"eOrL>WacK+0aK^7W,=AqQsK#.8ApkcUXN"2G, -%eU$5=>urrXMaW5BhO'pl+Rsbs@WA_FIk*Htn'>[?F'fH=B]92Rhi.J$p;C=9erH^DMn@DM++?m5nP^sL--9,`cT^o%oX#Fc -%F\Bq&\E\N`4TA+S&'f#4QVtH%c&s1>q*fK[+'LZc[>M!Ap>c+<*`\R42pNH"\,D6,WFFfMWqjIIhk%K,-Z:l!];PCP[:![/Nf>,M -%!E-4;hmmO3n(PBlhnK&:I7(5Bq/IcF#I?((SEeoT87t.bhU'G1UVPFmn1^c`iI3DuO@h\)2"-[q'_)Yu(8<[qY`bg"BLK -%1E/N:U#@*RqQKCeK^bq)T3A2CIh[..7d#dt=UGkCd@s50AgQ1gCYQ4"PKkc&Q_Lr)WgMs$27p87Q;k4]"^lnRLSI./X,(\_%RsiW -%s3kE3MFW[^ET3bjdPAoDPKcjMQY6p^8)UYdmL!h70Lu>K6ru8)Q>E09YMt4JG"+t*7">B)*DcaAKS+OC!BWXHAf-OAqTq6Oa:o=7 -%]So!MSu,b+_5g7ji-.)uj%'J%=^r6hABO[)QOt_#b\-'A]"ssZEJupkjT$ninj%f9<+d&!6%DaN\%.sH!FLjsak'-qQW_6L3&BW1 -%\-CtT&=9;Bp&k[gj>$c"_-KN1$^"_R-M@J-U,0C1o-3gJ*1Z/9MWtZO+M,q?9.V/R]7=\B2oRpp\\=W]#eH[+3,29;].Up;!H$%8#S>-K_&a.T71=X-0*#f;["3HL`F\6;h2L?i -%_@H`f-3M?+2NXY*#*Ks_g'`a<*Q2,mF3ksQ-dZXD9$eW3N5<7YN_E[8kOMbRZ]ZmNOLT0./A@'MLDW[Yo)oabE'>Ur/R\(E)-(fJ -%6NMfP1'autHD;Y:+N,;98dUL#4jKci*J,6o>FIN,=[Lm!/%#La`+V7C8#oO*ZJ4rK/EpX-]gQfQE>;0<4He"MB;DAYB -%J?'6?0*FHoFOj;_X5LAG!(!.Udr_M*_4TL<'"=eQiNE[f\3u+)$FAd]NM?aL>j5.QFM>KTUVQ5QR]j -%#g+!+HQ+]2!"NV6"NE%)>i.%#d8b.65SlKp,%XF.PdEedMB-diD?U(%H3un^I7&T3RBed*3+9dZI4kF#=VOi"SOR%VRc5t(-iadI -%0_WhEfL,AR]?r#iNOl$c/+.1E=7 -%Fgl":#TTd[P9:i[rPF(Im[T;pq#JuW-M4_PX$P(t$HQ6.3IaRD;BN(Lt,(r+Y-'W_C5?I[j5(%.M'+p0[8LnT_"GYJO'+F(lZbU>(LO\q70L`Z'G-VhV5&<>(8_%dO08)["A -%6'9h5W977a_]dAJ`9B"W4.u!e_T!DYY00,1M9d\?/JN`1&6t5JcVD"%Ko(q1%B>s24,>^/7WF1c[OjoZ%6ukmjd7Y,S:P?8l5HtP -%#hI`#I#a;T_1B-84HLkP,V1JH2cUDA/>eB*%<4A1$3UBc,L]CX_OT89P3=8?mfngJ0`Hu5Qc1j4N)<1Oc!&P%PQ@F*Khjtr(Pq5t -%e/OX+:jY_6:Y8U>!t`,V)htupp^6JL>7lJB*/[^I0HOFb[5_V8!luWn:Eu'\fW5f.[c7[1$"@Qba<*P,5u7X1Wj<-8e-$[e*da"T -%'A&CT1YW[[qljdbn<`s=!?&m#=hIX*F`VMq$o%N[%OAKaBV6$ZLB=bbd5M%h8G;nZ!E`e^Eqk5nbm*'5]AIsenf@T&sQG,8Au!TS]D7(T;6(@3?nSTX$=q;?=Xra"ZE^*XcI43Q0Xf\.B^S.eq-D!9\S7)$4e;mb:a+rIF@5qM$+oWC,TPE&j.!_35L@ -%_*Qq.ab4&1.Y1B;#!aXJL'^F&kUIc@=@WY+&"t't#F'"UV+6dW?g`U38-3Ng9f?"q]o=a41_q7/+5!CR:*QCP0RL5,g0dW"N#SL@ -%R8F!YmQSYtgR@I6_?_Jj$+MA"R_aiCLn$.$rW3C4d4%lrAlesV(WI:KhGXGP5L0O/aF=cW&3snW73/rD!P,0>3DLhT)q`^-AU^>ZA*du3V -%Y!5(5cPuHW(B4;oYN6G.pq&X\qj6JUYJhY5o>WKH6(@h3rd)d>&_0\$)_IOLX8hi5034r>8G!o!pUi$=hss;k?GB8$V@d4cF)_rd -%mnmKKds9kYbI$`kX$m/up9OLAjOXH1_=Bf*N)uL8X'DR:g$_AVB$^9V,X45JIf"7PV*8D"eno0Bd:'XuV1B!LA^^uVIk"?i']nWP>]Cms'9ZW1k#+eQUDHEB5YQ)N30&\#F-IJ2HF.B(;E -%*P1@fm2J8134*J_Uoo]7#6X0ML7B$[>889*'g&k-`l"h%\<"Zh9[4h_j5]S]rig"SBBqc$G\FHl-M_F)q7O\ -%q=FJ"99Da%YP50c*c!KM3`BE&-ib-LD:GKsG(CQ7D#n,BB>AjQS$?N#q^Ji7qY?Qd'k9Zo%e!$Iq=gQ7:.A:]pTP!`k1NI\5@/RB -%19NWTfofd?PB&'3lEc2[7K.1[*_ip2(OS6?[2:Zn!tE;n=WPWg3>D.ZLAWYGXdIl/h8Ck5cM:orU7&$(mgad7"oHhPq0k,e7JQ81 -%I9Qk4<&fjSSkBN"^2diFVj&7;HHk[5n<]=r]TX.ifl'(sX#BO4q,fFrLG:$H%18H\=XIY0l4kNW]]&6Bhn=cXm-U[/DA;\W"Sl%9 -%Z0[ATi%(rjB#3QJ_>dlB=H/&WnKFO,?ed"9kDZ7`5BLoZ0rS+i[q+G&=hVBM?fPbE>Q=MdlEOI7"mZu_(R8`3Kr0oce(:aj(&aA; -%PP/@u[2Xs//!!fHk-MV)k"Gn'7-QFAG&3QSQ^"(1%(Q#>0'?p-r*0A>pkO@\QUhK1>.pXnP/XD6pZeneYVU!KNG9?0Dr[TL': -%kfspL[[k%9B/mVu'_?FY7VjR(aXF'nQXhl1,AE0fnkeQ.70VN'CH"`+$l7-@_=NZJ.G=O8N\efWPNihLq< -%*G7:T);6Vc=tj^c_9\Nr]%Il9U<%ma859'^B;][<>TT+mF2?"5oj`XKhp&i[?r:!C`pt^eqMa0SiTrT0e+DE9LFKn0.F_klq587O -%D\&;Ip%1gAgXK>Qo$4*!UO_R8B`7Z'kHEW[i2>>?=#L\fi\[u9u>S[ab"A:,&j[@h!_BWIcA1tDs('^C9oW,n9+G_Idb6>";'h21P[mt_\)_4i$IuVc*t+=WNREB -%Ce3I;(bUu^0aWGQjl#u2NmOgZI*%c-7MD]Y?_+VK^*Vt7Q>(JO'kkBA=a;kZMqhQkVEMDMOmL'`:E'L*ZcauBqn\E6h9*cE@@$c< -%+.l9Q6(b51rhMt[F:1$4"$@$"J -%ZI&aZ:#,o2RDUGHZQ$pq(d)[7Up`C)bKi9GYUjh`>s<8hLXYd4VjfmkhQp_B"GMHPqDg77S?%E/l_SF3T*H"@]PVb$)5oat]6kbH -%UXu%=e)JTJoN?qj'5$srVhK,0i4r6ZH18*0G]78;LKMFdhX&93a6aP@LEo6eC<\l&chb_nI=C(om8JSAhOAX1+74+7gl["h=,]d\ -%28W@7gg%oD?:+34)22pIh=-+_]VMX7i*uG3AjWS5cfKpTFM*rR%RJZke)PI(AL2Dg1WdCNjabh1,4T[6&SN?i+ipR[IIP -%;RVFob%.mJSDC"l?er;9mkoLO\uj_rXIRtA4&rj/g.6Bh@!Z>Dj&0i+4Z";mQNiPD>:Q=>`uPn^M-KRp;O -%:bPIt9n6i62(F_Fa5`@r:NI5*MJ)HnYic;e8_8jP#5VP?jjf,SA9T@J$kj0PZO#S0Cgq,m[LS;la3_fGntVeL6f;KZB:Wi!i#qS= -%)fT;Yn7"()"?;&c;kR=McpC\5F_"aS_&Y+-('FSRkI$5*&)=W0`lbo"kZt-nF?"\$Z$QO+/-P_hK_=>.TR^\SZTNR"YXp!eq -%6$+ZI#Wq+;RfQd0^;O=Y+;[OD*`HKG'(b^FJ'^$+<6J0U7)7"43IIXJ/07\lF0;#]WT2MJuu31G^r#OH=TZ3&cB!RUgdj -%o^KX'6_8I?XG/\QQ9Rm5DrH3KiFj:)0&\e"<9,cT)"jZN85.=n.1T3hD>FC[&"m/s@Uf4(QqCj8occoNsA1ZEO%% -%:#b:NE!A,%!-OH$[Y+&#@4qG=RFu4\")t[U,V8N!8)-Ib9@1eQlS+l%2?QO(dg@)Z[a'+&iM8lE?i?!4''d*!BI+l;[-;O6!PX?b>EL25ZV!QSWH-:CE4a!_KLG?g?/,c -%NEron1uX4U78=iS%"UYDT]5BM$8k)&")]Mk:^'7G#5k1E?%BJKqiF0mP3b,>Q#86A;@-]$>mk&g!aos^hl[]qG(cmr&$nQX)4n7S -%8M(4dE6LXi==/*cJh'lLeBA(%2uk:9%r#IG1)VhSrbbGB3:'!(/lOmY+^?(YkCR4J$:7+i@U8+T#5"ST=LT*Nm*.VNRXm#7b -%p]Ai#=YPD\PakFB-;-*O!CI\K'*2Q%#g)*r:d<%ek;$"%#bQXu=_WKB+fKs+Li)KG;LXDsTf$CoJ;$Jl7a!$BbA?jRNZT\N2`Dm! -%/Vi!KktZj2lrHZ'LN!pV)?>C+5mc=VBmqj*W#dL,9M"D9&S]'R8dZ\++"GHbX4T??Po*98VAVZ*L[,q)oYCO$eQXC-HU%_$T$drh -%:n8K_NW^$:,I8TH<8T6Th;gh1e5]'sK-SJF+$U%Ci((,cL_B -%+s8#cQ2$CC#]R`$n+mA&i"QIn;G'2>MRsH3J5=OA*si3,%J0U'5eui[QsD0pGBU^(a!(7MIJl%2/,R`Gs,aF6+o`NJEE?99!\Z_' -%^:^YRm!g\`Yl""$IN'm9/+1TAS\adp'\3&/iS@t(r>gB72ARe[3q_;9hEu0U@"lJoJ+f/*@kjac!ZbCNWY^[A?ID`.,\-o*GkMRp -%ZsU#&`,37mX`5'Z9b>qO;pUYOqJX^#AIs4N%mf"f!J0le>'=X'8;27,f+Zkh5:S3S_0:c'.17E:*aT-+n23TUBW_/S(=2jsl1Nrr -%0.rpOje_5[[>P.kFQ-.NYIkkPRn9Q5VSi81o@()@JfK4M?X1ZMrM3VXmPTW@^@Q6,#O2K%;!dWl(B3]m'3Sj.\4T!rfZ+?4UK"hj -%N1SV0==e&b.Mi+`kf)G8rRJ`AY;^@M#c4Y,^0WP^@kX&r/Z!>?Hf_o+Z.R62C0+G6bHI36NhA>i/SP;NRPRbMESkW\m%*(PZ*`t# -%'jsS%ch;7G=?W62m?>t7KLV=M\r$\o9@K%*\)obKm)*>9V/+sjGrpUd(n9t>0H$YG7J.:"Ap?Dh" -%4co3M3-N0HA`)\L+.)Zb25#0*)WG_]=@IlaV^KJnR3,0KZq9;'?[k]Ij+cU6Z7E0N%X)47qgRM^p=2K5%q2uYHXOk3^_Sj$, -%[suq`?8-MB#2RpS[s0Kbc-$B=p:pS_kC?amR.^:((JfNL8aMn<':gN`#GV6)#I3_jZe*<./Vk<#MOH>'l:l41M?'NkX?I0S5kF6bT+*m]3B -%h6V)lD/jW,ZWN(HNFgBe4"%$nHgb22ZhN2fER`k@G#2#1M^(&!(Y=_=0WJ&kq2Bd[76O#)%@fgYoh=KeBr,NUgNR;'*9r'DFY]+#N0?eo>\?GHk?#+3P[O -%j7o&TnJT8SeN_j`0HYSqFmGqW+13a@9>#"fYl7%>^?!-'P?[0kWL3T&.ABfsAEJZMW"jCT3^R -%mb^"9Do;L%D3E'a/P"9Mh$8A@If&QHMUV]@/Uf[+n\WC84#bCLf-Y)!PD[ei@m$YXn"Ffg0:P*Y]B'^9%SJZmn1[%dIt6k"*060> -%Gg'[tMAt'sZ`o6cn\<>$s3fk@W7@k_)DG%0&$-*>9^j$)$0V(1kuBJh3M2am!Mc@PlGplWLUs]j+GoR`(m"3rpiH6R]KZ0[i-#b[G'a$BY\\3Kf#/ -%\u\(=]e;SulQ?_%6;[QF+?j@$N'V2-9 -%gEt&CT=h_R.o'X=K;Kk@cE*5nfqFiU_@q1Xl/6Lg-T6-r5g6])j:;e[Ch_*fJt^fWd:22?n:!Y.P:Si\a"Al"O]0K0I$U!. -%NE=K.n:b?P*57R$D/ke"CjI>eDi/>HY#^g_O8.;!\OVQ7=GLifF74QS<,*>2id/KdE.o1<]BP!o`Fk@BS9 -%<,0jK6#,fO4B/>E'Wi[>Pkru\Q*M&l[3Z(,&t;-UY(ucfRBB4H,U" -%I-RsHe%^,e"F]PK84=1m*4hoEZWL+7EqMc&1-J+p=H#\"lJ^B0.>/611chF@Z:-kc$u&RG"IfF<6BGm-*6(#6Jm*\CQ2kfa%7cE_ -%a"Z%!#SQgoWcSXs/dp#?nc6lFN*GD""oskqGROh=GgJ6lWphm;!eOSb7P]+*he!o@a#'#q..e*(Kh\X];J(\AU&rNB8-l"X:Ml3U -%Lt8&NK>POOifVhQ,I%fKY/[Ute/53OU\Tcf/ieI7+q8Wg/Q_EZ7!8]8/`G]pBgQ>#*7L)5#M(>n\As,.NohJA'hM6[cOl0jQeMVo -%'J!G"6%MP4H#?Jq8d@P9smm -%LQ!)S;CcQT#!kKDW0Tk&:t'Y7@%q$PF]$la=@Q'.!/r7<6%U9?3V5Lg(pL`fOrLbr.iB[J2.M?OGRb(f)1nD)3.QXMOID>n_XMpi -%HEB9_>U_B--Hm6%k$Y-o\/6t6'!db24<_0IJ2MVC#.PL`4A!NF1o69rS&O0/[Sf9^ -%M'jtfI5f7lKc42gh7+.;F-M@\MI8b<"TU*gk. -%bQ7Yf!JT3hWclA#dod3_f8u>=/ZD$>6\K -%BumETPF3TtR>0/WF&WXrgC^:L!G%8f:bp"$*Ha;nYAbRuMCtc!*0[V23j-GYJSDps-4O]g?3lW;S]r%g,D-E(/)*d/F^e0,OefcT -%9uoTB_I9La`jLrY#!qpH&6JoVL2e\Sp0c4k.g_jH6kWq/n$>3UXb>AZ61:8.H6HBo7-eNCa?4jDmJ)Y3Zo+O9FU`r@ZJK\*c*.AL -%*tZN9F_"Y!:T>;@<*YU/W)R"/:"#9kV9)'%nekhO'gRkL9XJ38q*"mrZ'Wk/^+JDq/=eDYWEC:+Z1t3YEn+C.c:DIm(I93Mf%$KAe=;HLkNc)M(Z%eU2OK'U8dR9 -%)_D&6Rb5"jJAERWC64-@]&nO2jn#TRC@+n+S(9-PG,GY,i2$X9_"6n%+2S/&2Ts*4( -%dL,!t'i%Po'fRkpO>Bd-Nc\+b3DpZZn0-M5*`b6878k4L2]dS!%t$>:=]cHSct+OcaGhDt/D=j^$__(r$tYd-*IJZ_4TP"5.PV5G -%RrHRm7FA!NgEo7._o(T#38Oe^D]NsZJuJ2EHjM)'4br"n&k.C3'^%-mU@707]uY8Xn`H[qfuBP6N=kjIf^^3Y[b= -%mU@$W95F$Z.e82UZEQa*pT2$OiTd@\lDX`:anR4dqE$CGb(/E*q0(ts=W#Rgt%2dH[&6i(Da23BYI6N+aAVK4@J@7i[bi?'VOpe?osi -%,(j[3E!gU;b])1o\]iGNe1ST<@B]gdR'TW93_a0N-_;S@lq/-83]qRo:(@B`BJTi3)oms!^nF:q2Fit"1d$O(a3fg0W\'t4 -%ABJS/%5OBJTtk^"3?6!nGVb6_>S^Ir\u!Mg&M)1[G7n@FdT#'5Xo8kK@VHH0LTdE9atn_OgNCF[7(UGn$f]O3V+`"I.YW+890Y)dXK+jCC4S04A\M3*hX")++iPGV8 -%C>sOHG(mY`N&[s]RS^^2O3eW:.7B!UfN`Sj[13R.D;)h/MKl.0)+W!W#*.,b$+-&+;74:AJ0Nd1qKOa&om;0bO'8+bS_SB6_6],[Z$%&f[J\Ml35 -%gWYR>=2*"VT`oZ(MG_sQ1_0:Kl%#!U&KSGt?1pG82J&m1kb&njCMf8o_SC\A*ChJ1!1kPQk,98XI:RN>CC,c(L26;7RO?B3;o>%. -%fa7'TY0p;=]f>ckTIX9K_\+!VNt,1_[G(8R-cju$52U9_%1t0/eeRqbO[1*/^/g!'#Bdm]0]b?OH-p` -%@G=HsY6iH9*7.2Np>H5`@>&]GTdf^>=ob90bak?T+CV2AdJ$!!WCO,NbfC=S/([5[6j"*e%rlhk`'d+,&V3RLU$('g;P74-ai@aJ -%T95O.Vn6?G>$f-rnO1e*=P\D11N5J8Tom[(E\p>*gQ'XG0F(fD -%$Ls?+Tp7\(KcDoWkRR=(K>loPo0b<(@&9!CF!JC/?VZ6IQKd$D&j;cq^]BoI/a?1!2)r(8aB>K3U'_?`$+oo"kXuCEJL5<93)+DG+-PS-&TdclP]io8U-kX`a6snn"phEX*i[I!5$^f!ZCA\gUG@@gU'3nODZP0frf%q -%3!>m^rlXPQ[3hG+2s],)C0'LU/_`06e#m2?p)TWECXt4\^T%gc)aK3:\n/V5XptCM,HNl$:pmBbmFsHJ:npV&VEo,"nW[(I"@2gp -%+?;tA,RBN?[ap;6^-(A)6%bR:4mfPKinDU)@`"N_c%0gT5UY<`7Noh$Ab+k-/nG6$11p@]E+qPPp"cLq:#qf6oYb%^^Ql'&tI+d;DV=Hi,fjN$4>l\]Ih$` -%*!-[N@`!RXfQ#UCa$Z)j(bFbu1Vd#Qn[8`!8FU,_@VeuMRk/Sn)87Rf0EATiTads3K/"FuQ>%d<,+Q*gE&M,Hkd!FkU2tVoOFJm4 -%!Ue1rGu+2Q!%5Sm:(rS$QcCk:i$\8c1l2#;IYJ,"S,49bMeeeEQXK<+-5/\<$3p@u==")GrbZ\qJhu,40e&\'4D"X6)I-+(;Wh`":[d#iqC,soM")HA,j-nq"h)Nfj[5\@s!SuGr114UE'oHWYNi#qK=(a*eT=Wq.6Y/N%7PftM\Off!C10==Q -%.I)(;UHM.&5naSH=!cV^:Z]QRa,qT]Ba@Fh:S^g(9l1rhHN=FEk?bCX(mZ$"[]RY;RYV'^JL&,U?$95aOdiO\-+tY9C!rBU,##G! -%I)V?qD(jD5!%BAB(!^/S?-0QU%q!]e\WeI-Nb/K&BABV*IQC%QFrZ![XoRQIF`A&a2pcLql3-^pRJ](@QE9H0:T#>nDA!Y>d,bt*MI8fR9nd$LMHBJ.;cM3&mY -%5YkIGG+98PaTX+!d@m+qYiP>J\L6[,A@aM#$b9X.#Q_Yn,qIB29S@_;R9kV]P5pot0uQu@/5`^KfGK9DBYnRSB>p,#d(r,kIY>Cn -%%\!Ju/Z8`+N$qB\o4lQO="7=Z97fQTU:Z;G#\q=+o,V@_/?/^*c-iEI0V"9L#+)d[!-%+R'h_77J5h@DeWO`=B;KPnd6bH;XcT\) -%c87:*J6+:lm7a"\&Oj)]'\ef@LX@K^QDRi0TA60j$^>;BF -%-MrP_`*og_S"^%K80q*/NSGJ%=!ZDY3ljSG(faYKWiOJf`CA+2Rj_8l:L8dr&1DNWl4==K5n.KhcsZSS01Mipj;!C.9+Q'[h5V@G -%Ii74C=oqZ]hTK;Vg8cq4a)L5BR.,E^n#FVRRMm0Ljm_m*Uqnn:jXq*TlM.q9aqk2-8Fb>$[apnq/$fpAVkF_!S'F(9fh!&8E)i'H -%B56aK,pQY^L-f73mg*kR7h!/V"VZIF9S.e'>Ctcti4u]/40Rn'Z=&AbT(3l+nd*)<0i?o"b>Hk>*,d@+(9C]8iX^9Kc=]GI[J9kLnYs=_#D-Ai3T'63V$6H^m=paoK_<_tX!?:iR!@'$N@5:PB06lO[L+%D/oR6h2m18Y.dL8N.o?n)M#"2u)'h5_.?&-5L]&V<7u9dH9lD&reT_,;Rq#RE2\%Qagh -%MJ(NBFG]<^^iW*Q$p>QiU*(p_pj=6LL"HB5hP$VNAgR[iW5OXmipYFYr"G#Cad#J`c,\p0:6'>U!e@Q#1!LP#6`3q?8ONpp$$V)= -%RQh4TZ['&GHVdPG%RKQt@(nb@2!@\^WQ7SN-#0,D8[SSj[keY!AH:I9#/S^132-U+0oV4^`F3#07,S-.N9gNE,Psr4!aQTr\Dga( -%]+KSKoRoW%,?ck^]3M^eRY!#Ac%)_XnQcVu:B2ak-?knb$ofjTp4e6_OH&+6a2an8Jh1m12iKA>P_T?7Cj*^ipj*_rJskEH)R1gV -%iR!+_+,()q\)EVj4,0RDWXep'acljm+d'q*$"a#F:jcI]$Z;nqD!]n?]h:B;TiF2\eAb19'LcNb!$"D8l;mtinsRfji,B78JhTa: -%e:RrN$?(Ql3hl'Eibf1J`#sFoJjVd7MBPe)^<\tf$U"Br*WK9>bO#'ZL]kDX>d50r.+BSenoRqM!HAf4*8&3G"Rf9!^]oRo9lh$! -%JOB86peK_U7.J.Tcs-k/LI0uU.`SNA6"c(BKb-[Jd&\4k:U:iAKa3l].km_MZ',Zj:T;fH&Bfr@'_/j\joXL,/e1D(TEuVOUY@M% -%'[I=SFcT'#/;'=i.+,7Q?dk]A2#dh -%5<@_T7$]/4>mR&l^1dl3(E?Z.^bp6ph8.g_&1L_0/>\j=HlZnM6Mp:b'U_?o*28!9m>BrC[cPaPVm+M^nh>YEk-\Vs,c+p'VfLu:X@eRfA[#U5d]1hC3XalKuC_^=B$(4NPaR%8&"LL'2+Q76JB0ZkBt;#qIdgD:&GMV'6E -%FBm`]\>@/Qb$tZIk%q]\EbWp`;9J$_AZIg+KM9`,M&$([?gpTZ)GQ.p?ULCl=MK6W*A`-/9T\nW(/UC'FK2M6mN3O2Grj -%N;5i%Qd3;X-:OZh+e+(3I9e8]I#P5Zfe"=C8iW[:kpX]I3*+.O4!@oVA,!&B/Bd$?4-BrPJ)c;Xt -%Lq@;?:qA#_M;\>!Ya26pm73'5RafOP>'-H1*K&-pC4_j'PPnCqIc$eJ`>Bq:'Bt$$Z`q4V[%F4R%uF*:Z"%JdG8B:FFG]I@4Cb&m -%c?3^IM-CYYCL#$os2G;O&H6Q]I"m1;)tc(PQVtKJVdT`lR!;%FOie$OI@;%'DbpL=p7ipam0IEXa]F>>O_'0<^0G,AM:;MF]pds# -%9;pN6/=l9Y3e\J>N$1GJ1\po-%*K/!/&2uFq*f7L!ME/8+.ipFb[Y+8XDg:)n5(D+8"[]_`$NV4L,b>U"&"mIi#%oZ,%5lQ!]<7" -%/b*Hd3u0)gVC):XNo("iTZMXlfJGSSV8P>AJM>IAKZSW4#.Om*2\)h7E?YQ:b'1s<_!uNnF2]FEXBC;&duhH`8&GlI.tAXtKG8eO -%8%c^t3a#=%_XI"!SDgdY*"0ibggL5^B[,8j1r?"f8"b,/IKaeaV_.+)Of;8,SMVC5Ob:)s+oggA,DJ0*`i=I2U.@gONe -%%#;)nXS7D9:L`%3#or)9ksu^IeG)MsS$?:l@9G9[;rbXe]?/)^_Q4:?6b;m(fiVsP73`&F=JaBf3l$?JV4'nKa:Fm$?09' -%Xj)6FK@;_nt(b)!@l7$J1Kp!,-hsB$"R^QRlND#1JjST0l4i(mZ&2 -%mKLU^6)T((&*JY%=F>d!(t#E3muLc.LXLc`EU,V%bK@)+3^`caTUar5$!3X%%SB@9koN+1Bo?h`FrS@kOeiD"S^=!Cj6j55$2;]Y -%-'WZ(Mo"nH\97;Qd&,E:8G8AC;SaA+S`G&OA3Ah,U8&U`PINrF@1?C.c".IKbM50V3aGA_U&tGJT%\CNgBtANNZ?ARn1_![+E,8h -%Bo4;sBWX^'gm!dkIDV_r&RQ^-Ci[`'`O?,lOi]+:Yr75YF7Pg+blu9m*KUdi$1E@T`TST=V@4&jeFI3=]>Ndf!kf1]\;Cn\a&u\W -%i(*mu)8T=0,],$nVNUfbS4-s,;,LXim-qs'e/1rf'W1ej!1(H-Q;c\`/3X,MOQ8;"#\\fDq1tPC9'H]B0PL/t#T=s>*rO,XYWkB_ -%W*:_u^GC^4/D/e`%hqUK8VTL=(]';XFCXYnp+h818]it0UAPb=!9&0)mYdm,!T,A%5tE73;:Ik"7$9B>Z=.&+P\+kN'@$W=o`S%B -%5g;N0J&$W$R7*:R'7cJR,_@2;0.b4&?nDZl+,S280F:;G)4$9s^7<1g/\NM>-\^363*@q,8d#BQHK3qWnZ\gh5ebBo'X0uQcX9\7 -%"ElcLZfDiDSk-(;UBsdEII^i+g_`VNE.E.qKbPZaZ^c\%659S'dR5Blr!gs26a!=4bZKP2r'6R%J=%2>8tAZf*'eBX^qGqj74IIo -%W=eXFd9AXcVm-sIH]7!>,d0Cg1k;3t@1>UoKLJS"?jqBC,#jP`_EJV>R0c=d)OHL,*QLt%_^WJ[,TS[emf>GUkX,tBI55sb7KGk( -%8Bsc^]VlC^&qGDFJUP/_)?eh9*"epqM3>]-+]VC]@80>h7i(-g)%#.s5"t,9XOa5[9'n71+'m8_PZI;F,c\,"up%E4cr@ -%80S"I<"A:)73mRXP[8?`h3X:L`X%rl&/r5>L2^-q:1<99A]9t&%aG_`fQ<>h3oNJ+8->:#,1;t9d`UJU$CW)'P[iTDC^H<>24AdD.T7A=F0OeLg:r1`i)B6,KONFJOpBjXKgIcB:KP2c30-JO1EqnNFZGUjJYCLmmur -%;D'#Q'O:2K4Vj(K/Jb.^Le+S'iHU"V'>G.9%$6m,:cG3fOd7sR8pj:)Hm9oMnW"3L<+uV23Y,4fBTc>Vl4LlWP#ClC"FVGa\[2kE -%:*:XR1h[Zfk3,b0Sba1C8p0-'Kie?O]F0/;6eW;rNRKmKtt6:_RlAdeu%g4U'+,3<0h;S5Ft$Hg8q]AY$[#aV9Z?FWG#H!` -%I0'JuA4D_[VLN@S7^7)Jk'<,UN@K-krC^'D!S8W;raJi%URK!m705>T&k_FjS9H(i->*HO*n$;a'88P?W0@.8rO,h)_Tt\"q>@%q -%,Ke1d=jb,YH*5@ -%4rTH^VMl68E`WgL=(^A\Q*/`7jREGN;9B7rV_LieWX_ep*f;4ou'Hu%2a$YUh+2p#9*%@l)PH`RmuP2 -%UuDO6hUXIMFd[HhAB`7:A&cd! -%nHt`7B3eT.ghZ6D^`*X$'4NdERWJoM_G=9*60f4q&V;r1@a^/@#uQG75d'ro9M,U)Qe`m\5]q+t\f4=J.J4R$])sCC>i=R7CC*R\ -%N[n7P,gZt5cVbCT`oP@;nOQbSk"9].a67XHdi0q,51=^nn?Y@#*AY:u-N8@_YJ24o:e5p&N]o<7,oQ=DoV0a#PVG[SfeZu#([6iGdY_LG"p9FG -%^KHofj=I3I7HBNd6tHD?!B -%#Gh_63<0Jl.)-FOr[D-;O[kY'*`s^5YWfujalONL-`,9fYGE?\,0<"b&Z"/Q0N]"L3S(F5I`42dOn2>#RmLR@Yo(b&$DG$$6S)-d -%rIbCK(<86uF59^c!^)G\Qh)iYbcZ[\8Fu_l;Ma=Fc/1..KCZN6R!&_*5_/ckEFnDGY)8WYUeh@0@.=oW:qVCl5Q3NT\jZK'X! -%A*(?]W-);(Q-4.\%Dqtr$Mg'iom5H>\2O3I2JC4tE7ioJ$*T;b/(_!:3u19`.fktIQ]FH.@]q[qYptfmU.&\$NLM]&&;:IXJ(/eQ -%D2Zb!D@-oo[X:'1D]4bYjT+]7#;1e$Op^A9C;$g98n6YYf6])m"fZ;ZdFRjG92u6V`@-QYU@SD&NuLHm@7Xt1B`)3fA_^7#d-00t -%^T/OSC^b[.nOd@R*e#i`N13_s.F+Ba*WJ`n:`LZV%D=?]DGBg.dAMjmi*S`+q#AG8P>"C>^K*^mY@j9W8B4U&^K=&&5Nl;GJW;JP -%@^Y6r.1P?Q+qQ^W*I+^5rTKUNiFRYmALHQ7lRf.Q?4=l -%JjYiYZV`_HKLt_<%Cn7meS@la4/[_iT*,!%U^d1k_c\!8\P$RQA`j+((27kP)5K+gd?4k)jJ\eTm.Sd_Tdh7@mU1__+M[dC"EnI@ -%D-!LU["c$7Z;S+hkr.$K?nEt2M"pGPb:tT,)H#h5BMQJ0FfR5bb$YlHP%&NJ/%k]BEJZ#W]%(+YYIIV\Wb+L$:9WS^=447:ST8R0 -%A]uGZ*&MW/(A91b.QF^,kZg;@pfO,'K( -%bpS!D.F]7XLp"is63UPW_L8H,44Wc+B1k5TBW"a&b%N+UkWiTgkIOY\TDQMj>,A_!'`Y91oiCoh1;X7%IVq.1[d]=iqVqkOSKU&6 -%RMA.p2M_8!s%2NG)BB?dM!_k:>Ffc72.:pEXu3gK1.";'1hkHcBS=?.@lhR%)lQ!TDe6l1>.Pm8:M7cDA$gDpdFp1Y[;i8'6Yu.] -%p#CZL.Zh.VOEo/;#qFeDU]K"9/eWt4'<@(,%E)lKFMmZk1P6/\Cb_lQ`,+G9gRN_+p8?:(ZnDAlNI/&Fr]M)rWfU)o8l+Y062.L( -%>8qd%0MYM25;;J;7\?+NN2?O@\PX%BX2/Ls`akJ*Ib=NiMSCCQ^?9G5s$Wq%VQ;Q?2rh6g2V -%:TH4&+lEm@Y//s3%n@j$U<5uA>]3>GPYJ`./.J("f[r'-gOBD'7712I -%jh$^RYP*nP'9D>_RB"l;S^`OjQK=S'W"!#h$6NP+bgis,b(4!WrBH];W;'/j-S[gLAu#/^RnW\dK;U=i*p172faKI.sK7;bl2hJCl?*Xbl=age"s+c)dq**g';[oq6eL/8kCtb&*Ltl$Jd.kuc -%0V%*jE`9@V,0/`$<2og^/tP%GAEhOYO\EjId8BX05+p11%P#uX];>!\:"/T1F]TTCJNr7XG!<8O+a.Kfn,N0n-&S$qW)".bj61Et5Dl%1JjYgA2U"b92"qsaNCqs3+Du*75o1cGEhLp0U2teGJ21SAO -%>''J:@>Ql!(osb:cF)#n?<\$7b)2u\epE%HVEc.04J\1^PAf$l?XtbKnmW*VEbR@u&`RbY.iX]#Hu8ib0PU1!lCg-`j2Tt$%f\.9 -%Enk@,2Kn0PP^7.1[0DA,+ofhI'?W7?c&?tfoPQe)Xq%E3_D7`u:5M!,Ep]PLb@Td):pZ27_*?9&VRUklM`X%V]o?t-3N[*qp4(#h -%rXF;BZC'5V&L$nP<8,^Oq%"[h9ur82!F8VAKp-&0jiW=(3[P8r\>h(U^o:c2%MAo"KS\mh:0&Jb@pYiKd2" -%ftf7Yoaa$lQ,`hns)p*d[kYSr.IZGFmFQ%HH\>WVj.QAT%TD?q[CG+)m$jQR`@ZBbmR`<'e[(mkG'hZ+6KBk*q!+pOE?jWi-\""+ -%N#4OMBXe*XbW'.SN^H8E/5i#$$?5h85/4edr2Yif0H#R4BCKY6f_f-sr]QWuot_?[#1Y$)]S!2j0'b-Hhr.t_Ie$bCXeu#'F.d54 -%D(ojIR/`GWruU=;j=nW(<6G39))^U-ro.P=J#TPld6_2iQTMprLG=Q,QQt]s63R8i:Hf^W[".jI8G`-J4E.$`loe[ -%rhCiuQ@^s@a?P!FA4Ikd7kH)L7jReH2pn!L;2FKmS*82NI_Xi0j8\>"'!<1OB,&\DCncc9 -%oL-f]6Gc1G*DQO.-]04J[=:YH(d^GBe))D>oX@];AJ5mYo;FT3$/V*\_<'Ml.GDG/t%gMX2EHP8V,)GOZ34r;1 -%@-'rig(Kh!^"3qX9d$LqhQ=NKE[:;D"4n'HNf6) -%L8d\eE,/([/7[fS=gg%?O!Jl**+^0gPf*Nq<(R&;TE[IAJ-9$)^d3SB77]-1hb&HL8&cN,"VtbNpOBqYc>+)g1"3/r>H2\,3%KGF]tB7UHBKC@=pf!)qLkjdONQ]?g)F.!Y"q"KtMFY?OTggN)5I"-#0$oV,%Dm;heuk$]9C>FETYs\NB&raokL&tdBLuI?*p+Mr^8:gLVO%V1p@[c^\dmK(5C=t\_ai,&8*sib=\bbCJT]f[d2.6KM/0g(_KDRaKLADT.)61*8`('akTT2-H1=Or!.$STO5-oEbG.&5G=>1F"a3>XfLag;; -%IHQ>\*3Sn+EkB6YT'O/i,>nmJI9tk[oP8DILo9aRAKL51Wq-]8B>a*^mP6 -%?Z$KWHr&AXlNA4CR-tFL`Vm_dppJmRc,Fo$d@I^F5=-V2>$3-3l&UEqo"6r]A"(J-\J`hea%^j7[*=A,%jN<9NsBRJV]I+es@D$4!.CG&uVSU-_JPfEGHlpMcNbE+8U)QXb8b]eo_fn -%=*c`<7kpSY-mn"E>N>.Dh8*/gqApq=TjN/Q55eae-&R]seuja\7MCe@h$d.%9X\"%[8KJ28imp2GmRjrPf:mj-f=K.Tl)Oc:uOrs -%^iNmNCMbn6F@sk_NK9B?#D3V%.ggb38OA0FWHr_bOm7>Q"TCN"I+6Y6*lNt7mWMb@'b\A+_k/,-2#6?qn2K@/_e3G*Kq8>r2k@+M -%gd5T+CA#sIot"\e/DJMfQE[CW/=s1I*&epa`#^4+a7qDg<0)ij4@6Ts8/U,j(2et/dta$ -%[F)JlBs5)mcn7?I5!V%ml64UL3#g8rJ4<:KSQTgR&Mf?8tRC!X/fYYQ)+OM2!\nUjE3f@&!b2H$>M"A$X%%< -%B#ZIQEgMYbknBAfL'mQSK4pOaX6$CbWeKZ%MdZ@]Y9s]h7I81SYh7K-:h4QJN(0)&1)-l?,\%/b&Rh\T5p]sW,Qe2>*['hXhgu5m -%"L+rN7J65GY`aeM.lh;'5;)nQFOWlUKg@Gp<"]g76.4AJI\[nq_35%&6nT&])>g/C8Qm=[(.9u5\P+!BVYYW22d.jKV3P&GU7msZ -%(B"hF.q`Ef>uJ`Y'j[rR].QQ@bK!s84oYrTjD*Ge,W`p&i);!*cpc//M4mp&)jrgYX%nVN_^qN#_\muDA4V^V]fh"aJgY#CZS3._ -%#a%oJ?iBi*#L30r+Id-=(=j8;$pi'V4rfVIL454FrDooL2Ef*!2pQ-)3d%o2*0OG*ss7p)5#+Ls_9kuB-gQ(oEA7i]n<;&*F -%qu6N[!rVf^&)UQSQ;p*S\kO!+ESBquLIY7$pIj(];R6Kl`B`F.]i>r7`LT -%Ut9J]=,9('OihW$DR?^B\,M\7dLQ)>m1@10J1T!EN&LK+8Gs?'i7ZCFLrY+hGV],bc/q6lg&+E>'\LW#N(/DU=T!BtT0K1M$MmnR -%[#"1iDPJD4@/RL/3be*'C"7u;U`H&7g=+5b[f^p0lm=.:ec$mo1JZjeOgR_:rPM(ko&S&Y#-[S^^b8SR7HR\`>Q"oVLe!38+40@&F^$_,*kZANj&%R>R8o6]0hPlbE%Q5&&`faY@>I$U9_d$d=11`kmLmTkL.OkP) -%/ZBY=D:uKdL)Z%b8Jf,$n/(ZXtY0k:\=0>ae-)=d9Lhc4F -%[jE1T2+!c1QY:*0Mb;Ns/N!&72N]NuIgqK/5=C,+:EZJah\4eOchaXO?W8DF7@qI>KFpL"78/Hb'p\Ti3t`1:TTuD_+.$$B3U-fk -%UTO4#'AZH4S4a&>ZQ-2+W\kNl,]gV]R8&J-lHt1$'g`X%.rBRM@pCSS7gfBIFTe8Jf%\C'W& -%&4M3:k!/&hFO7&@e/1c4*^$bRE0&ES&J[%Lc%4-ORalp7XIQ]tB_?&f$E\bgNm"gbg,ZM]PKKte2R5;19jRr#S[Nu]fp&@UTjM^q -%bN!$CgM9rY]_gnN54g/_q.Y_Po0iol7D5`^)7qF6Ujctj_5EDYPub(fRj'=G)`DFoT[jGKcB;+Hfjf8/rA^u5WW$-+ruq"aIG.O% -%BB]VrO57,?XIR$G7?["rS)[)%Gf96?N1j?j0Gl:h8p8ud80Y1X7(\/mK!Rb\V?kTmd"4*bR#8KGImu^mpL(Ch$4KGLR8&6h>mlXc -%<\W_E^hL/.0H+B"[hTXXA&nnGTZOtap;uU!4dZF$Lj`H#%#QlgUN(W/ZY\338?kA,+/uun>jbAe/(h%b^F$jA4%Kbcmc%`q -%P2[lQ*KIYQp5f_.07ZW&`#i/WrMV`6X%(?2=roOk=jp"b5JUmN\FA[c54)*l#&foLJ63M:BX\lA6jb`Y.&2nHXAY$t1H7glJY_>3:(WYX1`?Is_aqq/H4UTDU1P&`CL=r\G/WN\EAPp&c,;%B6e]fYW57X>)LFM@QcQ>:s!Tc=a20c.8]F);$P8BJ^3.PLPIjT[:^j^WL7llqb?)C,_VNA%!ok'iO`V*_iS>HdJ,Fp(8\%8:tS2@U3(^$_f*j -%#J72k$3ZhA-upH%'[;N8(FUVt(/q=H;s-D7RNu^kJg7!Vp58i[g7tK6US`jNQigZ,q!'U&Rq#X00Ak3\c@]r29tZ$=?f9$JnfId>72/q -%PUe8N3`gjO)+D^KnnBC+Sru$2^gUp@NhWqAUhguHM`@ZZC_4,eEPh(t'(8HDbe$2s:;%rRVI)brVIJ[b+iSK[9?C%8B\geBSXW2EGj.O'04]W-*G&Z;[cEgMQnGr`caoaAUt@U;a`F*U;:<"t*j#&-!W2=K9jl3W1279i^/Z,tZPI6(4NgEXFah^S9:&]i/*tF$b%u@8t/LT:YA5u^GW"I2^JJQHG -%28[m&F(qb;,,pYA>:<$?iTdr-56i9`I8M7*3(m^icWZe81,hToEboI4.sr#r4tqYiHpqd^[-OW6f$S>CN3K:a.,N&35iq5!A@7UoV.K*V@'q?1 -%+Snkn#`^%h!XV[I%E.*LUn)@FN<@83am,V.hR(ZL7i[d(4";gC.P7$+NOj(Qdcg`-Op&(-e'd8;LqhZ(UHNLCc]iK$"QOY_R]XCo -%H2._88K7'-==S$q$N/'=)^RAJeR\i*0IG_KRk'A/sQ<-mi>".Q(g2rRKb+i,i[m"S)-QG0V7__hR -%$JYDl!Z&])CELq:Yg#p3oE:]FXMDlU,>JM(ieW+0:'`i=OFSQN#WSP'@$ZjA?^dI7,MWDAEC.I'T[pS`[2:Xc-JFStb`(=k1)/L. -%C2+:4:dIdqXs#A)#M"jS/WSiqli,2nn&&rnstiKt8kNp0(oc;C%"KO`d_*-4H`0df(CDFTjIMi_duXU^J$L:*u'lc9]O2<(V[ -%'.2"[`)T6jX$A!XXt!Zb3UV]lj%cO5mZZ_DY5[,7/gEfZ,$4p`.,Oj5d8pLX9TBYCXY[)W@Rr&kq>>HEuDd*IUopq2sRmo3ceRJ2* -%20qj6*b5.=QY/8H?6%tE:k._$VD>dRAHqhQK\"iVmUo;`$>\\lJU:G-bFY?e]H<3fr5%N0ZuD@9^#(8M2UhKB@c]Wq,jm.l]rh7H -%OXDmjY?u,eHq_F1&+=c<8$fs3cYSXp:(C'`PPmm`pFb\#'Sha3gVWa]0ndR<:bD*Hp):%&/2A-NWU00)#"QA]c[,<`r$mo`*XFF` -%"5u/#?Ydpoq-<1[Kf+tjOahS.g+EPLiqhMY4ubX:ai'h/*aG;h_al0l]iXqkg/TBXc*p2l+]COlcLelBhYX4LSWd2?GknU+*_5eW -%O;M1B*St[5ek'9n<3?u7;fAeBrGo0,NGXTSLrMtIn&*'53'F78V;"0D$%^EeC7VZ^\^i$'SDK.,__5rpWjTAPFm&[hOkm';F_gG, -%p+_"&9m20JZ_Y+=J)p;m-K=)+NTN,2gmKFJd-`9qe">h/^H^6?530,B5*''rT3KYsrKc:(;(/cuo#2\mSYBH[!`.FV&*R7?!^>EA+'_5-a8ua'kHCVWe&U:k -%=ZdflVn7[Y9a6`GAA'cst[.850?Is=WHBGd%$Jh;6G1iFXKfqB6_qdJ!Vk]GUdnXi=N`N&1O4dbk6[&d5H$6+Kqh;N2X-XW7V_=BD -%a1>#c0=9K[LM4#-dckfsoJ5Y7fUZ>rNr#*a7$uZlgMpVO:8QWKa.CG>gSE;RRo#g55@J`(\-T1I%poAAe7gmu4%3%@iC^Gcp`&V- -%*qnn0NW8OM[Y['\2thYGm7bhmn!g9bFLn[A'K,a_mIEeA5IR>"Kp/3SO*3QIf[A$orEO^?P>8Fp_QfC=DN?/(qekWi:o!\\Y&kYF -%k.3&[=CGo$7QN[D:'3PF\ikpU&4mOA:ZY?ZSZW(XYLNm)D,rmQEMbUXkVjI3FZPA.VPp:N86lCAbI]fO]iU%aD:RKP3pe+p](*KE -%;p'=?f7tlMIr"cN,?0!`bZJ4$k=;U4mkq)(p;";*UO#Z#ZPD)?N?s6:C#"oUK`:;qA+e^?1&W.H+/b])^F$nDlZ_s(+19]0jf<:< -%@VZk/qq*U)IC;!m&C%u@0AC3l=1i"I[EI)i]jt#&;=^#rD^OO\HfI2eC\q_E.k.B5@5Xn]>!JtpU_RBe^Wg\FND71EH0RJ/o<6L9 -%e=Q6]Y[['mfD)pkmE]Kl<&4FKFXq(-=C:X0N+SYP@iBnu6 -%'s8h/\8tlq4ro*kf&OmGDI?Cb96TDiUA-WpXrXB0_J9'\CFq#1c.gPQo<3s@f932o`a3pThqBW+n;8Ma@*h#-lc:]8bCR'dj=%L0 -%auqm9jcCe6/r@fVqYKlOD2Us*p?]AGf&c+@iL:4\`T#MK(S5Z"E;GQ(/k@;'m%2fg=p0uEi0qj/EBVs:9!7iF\b8U(kPV+j8,q@L -%bJYKL@1]Pi,TPRNKM"QEZ'VG%#0"q\1pT]/#5fO`>)nJtfT!!s7$'T5G\hc:GIi-DJ*\n5<[-OH,OQSq+uko,Ic'p'>N5At4SA%F -%(\,7JIEZkZX2S7=2a#[L6H.F012Ch]O+'#3(\r:0iB=hn%IRmmVUh!ULNdjJp1V']M3LUF>Y*R(*WdtEpdFWcXRLd;t,;?N2AZ!?NG)_\8+8=S9cCnT0V2IV8) -%4Ql[*Y;r;Z)QeXS>'rZWe'$OJm=ART>0U#mmW#Ln\DEq(?8TC*p<2;9'kKSfLb@)$1JcM41p62j7k=$OIipe^6VWhUeEk#9/8kid -%7NS'.7I;r&g1be2ImD>Zp[<,p-!3$Wqo2'd]g(ED%"kU99;[>_H*kKDZle.XBC.C$@]C\p5qSZRbZ^NVmfrXKRS9&mDD]gbH,tZ$ -%H$-R&h:Pi[%1[&fOkhuHpOS,^E0/WVf86&+2>/r5T00\6,Kn2eU_s)l\8`'@L7oU1NEo,gY8fpKTCQA4h9J#dQ\Vgb6X_eJ=UYVY -%kiZCLn.Bb%YE'TlePHqHWlH@_&_Wrb&j$LY8*GN__mYqFUg#okCQmMT3/S$+[`8B=_LrFM5cWWlnp`F(2`\% -%QcEfu8N2uR\Q@Zf9//6&4Tb*OM5=bG0e[YGo!,XYI7^RpHXDpoqNg`$8W8KO[8UeT#fV^Zc8Kq+/fI5,]XE+(WOLTc-utY"D>2HF -%E&ks8g?dQ*T.T29.>?LP7Z"O;E;++QQo7UZVnnOm,ker0^PAYeg[HfNTk#-l`l/dP)Y2:c$?2cVb@*\i$A -%TiXCh,@NLGlI6O<-l9 -%81r6*lX\.>PTdRs#PH*3c"QM1'2tI:;du]UejKZU?V,#dT!"nZGC>nSX#l,Nlt')@k!%e$;?$4[4"FUgi(cLt6d:To_4_I$@tg:j -%s(*s)`W3*AcHg"V?K"gCcg[aH9l6+-l;Q].HnSEZhJ>-AY0P+SFahSgNFqkce"(An(q^36lioj#gp$"+6kGb`k]r>:((YfgW?_+% -%k$km9*sTW;_hFuLnL@8tf[Pa9mfLW=Ls+i:Lg)F'[0o^f@hocrcopg@FcQX`6uUAD?KO2`:O$/Y/fRk^GWk.m?eC'%Dr7?+K6l4p -%C6?hrej!$W2NhPC:,FcCF2I60ZX9uuGKA&A@-^-HV\1=hm6p"-=2C!8X/ -%5E5r<>cKCg%oVL<^-on@Lb9uQ"F#2"P[<;?:"`fj+UVI1>(#qO?Uq$&*\OIRn_/8e`Ksa$PfHi7IjckqAG6UP;Ehh.np<)-0O$:3 -%Z;uo-LY7,L]@1qBj'eN;hB>`HM%$DtnU8/3"$f6%T/C]c@^f*%Hf(@QPoD657]k?0[o(qL;AS$Ic+L:_!a86dB^#1*k6Dg\,F_uO -%*L6LgiFR&JH^S@jLN<1X258]`(:gjT_VT:*?!(ESj"[:rpSJoTFP33l=LR_8D=r:=AKs;T#3GS2j6d9'L;B43/.:Y=$0LF7#a=ks -%4N+I`I\W;o2i[V8bEKYbnb'A5HlB*Bh8eijL!/li,)80HSHD0%?Y*M%WGm7I(JZ;&:`8c.9UE1V':)3n[(7bE)'NimP/n'@#3_P* -%7GH2n9HekHdN8iq"j:I!rG[7mn4c.?OMJC!/<3;LgoaAi!#1.-f!klTO7:TOk?DDSDBJ5B_q'IX3a"7fl-iq5-JQ:3*)f'U=$)[)MA:TN_+br6$Nt)*L\YSB*B\E+&rU#cC#gaD/7IQV9 -%SAOmh)HWFAa0Jhe1&Om-Qo9nP7'?@M,?/`BK^e1a;>)"_J]9Ze/mSnOh,GpmMf[]3BP<>NQ4XMZ1)J-AeMA7nJN'V#rb`=QXQ;.Q -%Wj#a5r;;Pn1;q'iogH%K>ZcuQN_jdIC.k(@F,FNdIU=-q?qFh<[X'!"Ne[bY_H&5"4FDqQq0N^YXJ`>=d`!t0F4j%ncRY==`emlA -%H$&R]^m0/T-').tK6snbK5F>$Fr95g/6_TCSe9XoY`cXGiCKgcoPM6_\UVA1\c4SMQMY:n.WqfoCj0]PQ8lelkq.6d9AFoYNK+QK -%b&MEY8OWNcBAYhseR_;>U\4J?g&$P`RFgnYfB]?(MlG=35-aeW=bMsDIH-tg/16Z]iu^VroE28D/;eRETTYM:M3B>[tNa\eG+`?TSkY?W3L -%R>Vq`G!&?5:#oem%ciW)J"4XV$.M4HI/Bf!B30L$5[LfD!Y5Q_CH((acDMtm/A\= -%o[N(A5l/D'UWVP5GBsd:h\&/6`21T,"#"0[@ -%.bG^uWc=quZTlM"jM;_bQn^Re*i`[(49JuL)[erWZG&c&a^pM?2S21(Dn,Ts]Y)]Nl@eMK9A\JAo"e69e'l6>>(DpJ(+)4F]OdZN -%RA*[dXWYg8Ksj^g-2.IE#EPqG`]6oRL:]\l,aT82RgY9dZ%*HW,PrZFJf_?*AfRqgBrNl>R"60#fX>;6S@DnE6">O.7IlJm>bole"u)DXc].paYK4TJ/EgTHJR)t/kJH=jB&'A:[XEu1KJ&>5;qO4l6h'T_,[&tF?&N`5>d3uJ(;>l% -%@h)\Lb1<>pkOS,OaJE*U:B@:p##G4jRR7qfbmW@A)!0(qqnbTQ0"aJXl8-QE,Du_=rDQ?i0CjW9MWsW)S'Ku -%M`EaR[W!SY[<;WMk(6huaE*'$OtSPOSRJ\\r/r1mmXL]4_U=s/\X<\O]$HYE92Y*0FO2IFP=$-T?t$HGi)OV3*76CIM0ADA^:mh" -%;e]"eflY1C*#d.8.u*)kQa1)/X@J:MOn:@a@[QXVC%dWf2KHpMNGLX$h1_LN\s?is\6tIVYCcG?C]bq"p9eV;)n9K8"O1n1AF)Xr -%7r94]Jb1ZtR[]X87uo[72oP.2r`$1a-0q_GIe+e7.D`XZ5XlD -%*[$f)8YIIie&V'jcq5eVW"HCQYeTSe,25Nn]`@?P4p-G$"k4W5PK]6g$cqErF'2?K$_8`:9[%U>'2o_$>b58teao6R?7FV8Hh[Cb -%98'BCV!so<9G>XZYd"W/'3[,'J1QTnj,^gV6UETgqW@=,/KuP3M%>-Es6+%bs0&$[@aoOQP%\"o;bcoL1)f8 -%hZ+;3jmD'=ml=t9^!n:Qd*AfNOdOi -%5n,Mc_\K`\&SC-Z_H:`/R6 -%?=^'+W-)jR@h`JWqj=5IVuWh%*u=1pWsq"TMb3OCLe1o\^C:MdHf49h3BM5G"5g;[ -%&*I1K"jmNAlS6RO?oPhP7gVd=j9nB./-jLXC!>PTYs$tIbdW=F12hI#9Vl&bqTAe$$Xc;Es)sO?*>YN:j\MH]B7.gb["[Cd!<^si -%W8]([+?*s*%MPAWn0lSmCj@(5K-TXcdtTHGb&VrOKIR0F0-`Ci6$b=BK$Lu1]ZKVUKW6%*P81sPOa^2GO3e^oZ-:]i/3eVG'$GGq -%SRotIfZg%a!$bZEiHm\nKnRLaeaaNbKCL@Lc2VLH#=-!"u#S*AJYU&HV'VQnR=(S/-G$='$KF"_t/as -%-([aAbGsC5?`mL[)_8O4.UVrm&WqY%k3b"X8ofI[PQ8OBk,UoYaSh?af7h3lpX'hmGgafVi]ch9#BP`fptOHN%:X43S"08<0BaDM -%BkP+Ga:M.CX*'p_plh*P$gJCHY9-#4*I7U"hG!taCX^RWAKOOEo8NkEgR,3QN_iV2=k"flcT_*-m-Jfd$*RR\`KRM+[QD2o\cUpF -%cecDsb]dL,G-ZF2jgfC[[LhhIq"aa)QGOO5@oqX5p$f2OmDVlu]3D!,/)sGKc>W\1[I8E)%[cJf@&D9*JOJFUq,$`r2&"G%<3:ME -%)LUR0n5-O\R;*?D[If6SFlcl"+*jegpIr!f>ipL6g2nr?IAg?D9Js*MQMs^g%`jQSq2'm,Fb>>Us%p+@E5i\'\3\JHckg.4o";k% -%a$\Cgn9lmoIVBkk"-?9C";6e0s"-ofHa?l`Bb -%#0nPXGp.Dj#<7(Uf,<*-C^tNN,Au9HT'\4LHs%7J7WA(V/*87q`?IN200G_68:Z%m`ncY4387;R;`6b-_fZ@BE^=rY[F<8,Q0&dP -%c#J'S?^0]-B6,7=(PHF:V#_7"D2c)G%+"&9B<,D&q?oTMrRff2*JZa-_2iS!df&9r%O>i.&cF0N'5'Su@D'7_= -%bR`$S5A\-gRMB%=DDM_]Ha+;A5,1"(ME*Q-c#fk?XLGd6ZNb&Xhg)\]B5;/6Ee_68 -%Hd?.=DeH+!f`oUAoldbmlr81iCj8+4CThR3cF/(NI5u4Yj4GDCTj56KBBu>AX^9=[%W!-2`T$Q,k;[5-gY);R)j^#;[P:j]"ch:[ -%f230! -%*b$+8OYGf[LDY5\oN.;BJJdR/*aB72mP$HLS;;16h-VX@HoW]hLD]3&-$(fZ\D#g>3Q1\ZaEhaB3"O;DEQ#A$m-%=Zj*%]&b<_(s -%<#W`7ru>M'EqboT(jBtiho-2f$8)X%pQ$K;kJef.6B#,]U0&1?SC6%Fo1069>2s9(t[3'nMXV?".9ZSY1I'2"u-UZ/+oZj5D'g9bLs9O -%@bd[U1+-NNEi5D2od(g%+ZGYb%V>HlEG'1sc\iWQ7,7_@@XL0mAjhTa@n4cT7>r#F5`G$8C&JHLggtSUrW$D4040/41!]Z.rF1S& -%LUkps7#WpC6S0<5^'"rQ#@^s0@a:#X`YgVAFKtcAc$TP&l%j?1$R!V_N3b970-;odpYP4V&EAf4r`k8!$b=#?`&Pk`E'NMi_5>th -%F+`saieo&$j`jG$GJ`MP^=E(DIgRpUrIWupLiHANpeh^aMLV_QaMknF`43M"[g^3bmR=Q+6B%CH2dIb>*.-Z>T=F&GqZatuoB\+< -%1!W,:=3V?;o:a&:Cq.[[F6IS>*:1jETu.UqZ-2`[k]#ju/.3K$_'Ass3daST&?+CM-h!Cm+jeBX-Cq'oqGp.:>dAQUMk\tm]fJ:h4g7-$Q -%6AO=.@(7J(\?Zp>=G8&r_bGOq91=UdfPnkCh%%fjHkG1mU;PLnh*6Z)B37_iJ.B'-=\*>;&3=(4L@b3:k!b'ONT$GWoJEtd5TK_j/^:o)'Ig>bOTgVR0TM\:P06H%$5DY+.NZ1\)4CE.oKXYEggV -%*Nk2.h)ciS7>EC(8:7X+K+:u:e)sS5-9>DJL>,*a/;+Kll7bGR%X5K;o:a((p18O5E!71u\9hL*3aC>X#0LOlk]#Vpb4toW5_gj_ -%a[C,$#p$2"@=A\,^=7NHU%VXMflAOlYK9F9=5P5Y![RUodn:c;HiM69!7^.b>VhS=;fW$%21NlHjOgnR.T:#0?cIm-VG["=^4pjC -%ja4i+<+bU6of&E-(#t4Wk`d&Q3NZ>@O/(C3fNWh`5_F+R`inWg6sJuBGF^_\F;Ngl2h9NCYgZYZ[o5IImHkh>:lQ'f9?2!LAW7,dh"L^.t>l\"Ss3-sH+9Xp]G -%rRJZHjh>DYGf7UBOBhaJV8R_Q:aFZPIS7IO0BnJG'--JSN48Ird'f$XCk.B44SX`#kR`cuBH*'CN-ELnq;d$XXrS.n(l)-E\nph\X%rlVK/]FIulTCZi7M_&Kp`_?[h;na)-Z:o"kOV[cAlEFK'@T,3A -%d63i:7,,OcgLYqDBWUlIc3>22O\'qTZd57a@.M:[Qolu2Pm><2k';67,HJiOE(S^3btNGI40O7\j5#a&*ganO\%WPm.``FAXY7S" -%_2Dk1O>,OLEPs!`Qd*<)=[5!6EhgOEVZX'\VJ395:jC:MNC%+rGlC>QJ0u;=Z'i5dikQ7L+V>a-R"Gh*,t98u#fGG;(Nu`pH`S+J -%qoB`6gPZn'Wm&JnV1g=+e@OB2@/Zh,*A67Aq8G@-CtgA(=YoBE0NXj:Oo%e?)Z6EYI^R$43CTI2UY9oaV -%n3]^"C^_bY9#ogru#p`eiK#)_Y4ZVgM>HnWmG$l[a?HN&`HZHO'9UZ6aD"anC`+*os?p -%liVjq)=;BirSH>^i\OTsF)g8hH/NlsR]p#Pfrn2],r-Qa -%I7NjgEjo^+[[eZ1YomkLU%mjn2MuZ#pfgRZ";78]NqV)!,7L)N6U/R/Pj:G"hdCh3].'9=t2%^CaN:XBMRk2#0 -%Ha@da%)?.[H`^BU:?C*hF)fZU.5@/Y`g^n-r'KQMSMk9-5NSZh7l&i5=# -%fiOeV%*61(1lBXhq(Q*fRK5I\PR+e4Zbg#AcE0678;G;G;RL,1nQmW)a5SB)hX$3)Fon8"2gffjbsZ&GPE4apiN0IbC*f%4#>aZH -%X7##Ihjl3&n#S^c`_u,f]=#<7CJ[%GBRPg@Z-(bo>PtOIeiEYS^\Bd*2^TKu(\M22/=FX[eiF`e5`Y"$>R89o]Ut&U61-SaMdL=0n2?_L[>MuNC2Q>S"d_`GEe2%J/J9]2 -%]=k"eWu&XC\B7PKLk4bB)R((3/CkMmk.AECmJc.*aIUpHLAuBM0(E:.9DO)2Vot)HUtV>HI$)7 -%?\D^TK/_i#V6?XA*T';#e!4C!RI\+-rtUiWgW'!InY1@^^K$0ijn#N: -%(8^bGc?LmHc5#jj&pr*`gdg`%!U\Fu21tV^:=I?!^3$4?=BVK3GU^qngE3'^OQrRuhEJ]dGP_HLnhf@B$nQ`!XjV;o)Qpg#l/"E\)ps"3&Q/UnoBHfmc&>2)3q/[\sVXmpWtdiY/Ud&cZLiOR:Y3R.gA]o.uViU:;,NK%*'C,9jfH5R3FB:u3+`u[t\Vh_7pgh5S/d$YsC*^i-dm+H4Xjq9>]^KljTebl1uLjaV'h[Ve7;NIW( -%B+"Zd5MV7/a)EI)no+J4s5@,"jiR3#)ZaX=#50g@rVB97Z<*Ie=>hqjH7JcGmm=`/Ge-;lG`NuAC/1InLOB!\/tVGNp;50#^(#,G -%5+W\!eG3/?$0^:]%il6`humqBcYjIcp\&a7pu[&eND2pHA[GMDgLr!QhpM(5<(F:+O(>7V#;sjq=Y1tKANjR2uc_Y8,O\EVo-MQN`C.tu":DEp#"$P@NM*FQpM1.!gaYOh'#6j_1La@23.gb%F/hBe'T -%kbEr)l/A^G&H/)ujUg&#^(/'6SPSfPTbANBZ0'V:'0:P()CkbT1gr@!krt-&W6mPq1n5n>.43)8=ZP5ag.gcT0C@TmYV75UN5o' -%p*#'QWG2Q_He,Kj8mqT[GJ6#W;1?nPRq/_*/oS%T_<_p*94H7n%N"D3pRmqF#%InCqkIET3\mNWE;Ir)2=J!Bo'NL")mJ7i@R1j7 -%kI56a\(DIC%-2VI]A?M"Y]5:b(A6cnPCj-H4*Ms,eY#`@4I[,D[Vo*;`a5X>&Qlb+na$aJAi]ti#j%mYL32b**^c8gWSHKh7BIcbHF&'f*qg\]QdZj6 -%qrq/(1E[IcnRU9)^7WY.PW/^*2nEGphgM#n"t>T&NKeW87Z_*WI=&I[h99d`UQJjS\)!7cS]U'qI5jI5cYDQ77*3R7hE`m,Ibi5] -%S?/![MA`YTIG.g-Z369q2q:O*atg?6^o-4,3@[KcN-B\j/66I2?kZX2Jee*`"`_"1jYLXj's0[eEoh0%9uYa-:/$ -%G,gtRd-)GTNVjQ]ottpZkMK:0.0etr6qp9$f(\C8`&VP@;Vo[0;H`2EJ!HLUT4W-^J\8penC -%4"N'@Qf%d3p2[V#"(kTV[pN4O8o*$K8F&WJrqR$:"+:u6-_ET00Z+H=Cj(MdH5Xiem2Z4Eq*&OE.3\uK=[QGAirnc<[hgJK&&-81 -%DmWY\I!mB)rf[XR='[AMcr&GEKH*DU_c9AX35Nt5s)+lq(C!YP>Cl9/;@oI2iTN-)J=",fZ&n_#Fli8b.A>JgTco,O2NCb3eW4Mh -%Q!Ynt;Z6cdKe55uid*J'Fj^'06oqZ/Q38=;5[p*FfmHsn%CASSXfmjU;B$B9)0pS?G'S8?+7mgtr,umL-2\:VGOLDQmn:,dYFNlF -%>A$7kj^p[Oe*MFkptT-Ci8'1G"N1;g;ksJ%\s'g:j#Pr,nTV=!n's/S(@/"D/,eRIC26%_>KXX/AN04_pXs'HD>MXA9GK]Jq84[k -%.51ROLHNR;cU]->;mX<[BTQ]+`3Xeu\4smW -%g1+cs5hLmQZX;tQ!&55"3H'Or$q5Y>HolKnM>m9^eE%!`2\2"UfhNOn7q\m]:cgVXM>@.eZ1p*I`PqSr^gT3$fIc;:E`Z3%;Go&4 -%j_3X:86t;"SrjMl]-HX[]6MWCcZ,VDmAK5ub/LcT0`,Vhs%^&[3C0R9'o%Z.d9L#1md.UeRh_"XY)m)n)8D!V$6@`,nSP_g6ot?P -%Wpn[5FDt=7hK(HKdcJt>)YQ^Tf0BD7Yn1os[R1q5Q)hn%f#EF)FYN0m/6GR@Q@#tJ$;0@J[X)1G]5cAQh(Qnm&@(,p#B;LbH8C^T -%Lc7c@T2mIumhD7!H0ga\)FY[\ls.4>[Q\">J^)&_Cko=0r[:%AWabk< -%He1FR:"8l0ZZ?;A/#c%o?g.914".Yq9\'>B@ob74gWjoNWP0$)SLa,RF`m`BaE".:eh[Ks6CM\gY^9O"buI!WenT;^B;X_U%ShY3 -%>%sT9Y[U-Cl.=Kjns7cXM?BZk"bX'MYf1)9*UkP/ -%bUrQ>SRSaASHI3gK8O-fK6fPe(fGf\0ccG#K=X2S>7F11.YDaq,\2,?6UEW,*E8u)NEqt_C9h%0KG9`8]Y*W:(13\h6_&l\FV3oP -%`Fd`\]A,pC(idH:3D))Z6B9HOfYcq;204%DH8K`Dc=M9P/F5=6d3jJgKUs=Zo3tfj7dn@"8YquebB -%c*_BK:<_*SSI?u;3l"B`(A49Hkqh=blt,QicahN'e!-M0<3Z+*=TLBrZE.Scn"u#S[@?U5+WX;;X_]g9\5drO2_NErhGG->8[?>] -%0@in9ZaJp_H5\"A5W^5J(Yq]N&#shp1!bqZjf-G`BM`a[$1Tb,6/bYgq:H9CqtplE#s3H7BHLp3+nak?[gr_L@F?SfO@UX5^Z')1 -%%uIY*RRF]d"*n:"cC]7B>edn+GFLJ$qb"??G=\h59QpGN1]>PO?P_tDJMK9L;U8q5_e2U)GkXphW]liCc)AU<#pmnd<%V%'W^njc -%U3\PX;t%AH)YSkV2U#cKF0^9P(TYqA9UeIKZajSR":n:#UY%r.C::g+Y^/#eY%00/")EBk%fquB@<,TpqF[M8%ndiAG5TTu2?Us* -%_5pd\0&Y/']#JpkNG"WX4M%FnnbrA!b@^)cf\O,1O&K];)s9baDT!iV?R_(n^KdrTb86$I7GHE&"f6"F%A[:FF^3V5RMft[m9G9k -%g:i!K6ba)FiHh]m%O;)d;#J;G/J`9Of9[\?q`q!1T0@^dY2F4YD4]i=aNBM-NI4`r[eAu1mh2t%GM!A,'epUZn]p*q$Q -%'N_UWhT?;A[\?e8Gi;-F=M,X]YGZE=dP^6tTSa!eYC'9e$?&,D&+pDkTNdRZ?%A19)h&2t11$<=[IW!lY7H!T"iWfZHW_I^p"V]bW0iJn_`r9-g`SV%p"CdYP -%ScA="RH)"=aToMn;9XNuh[>EFAk&9%kl2)-k!&47*&AkUZ37EMZHp\>"tDr=D2gO -%0D0I,\JpX6:qrh7>sI$ZkrPiKHC2;KbnfE$QDPOHE(rsFm"0&h%c7(KhGHVW>r!5%8 -%4)m,:QkMj\ -%5re!Q#,LiP&JPX_W/18be!;jG@*[(C-r,kg/e.#E=7'ilEEK!.B0'_pKDn"pl%=.Nb^"QEY.piVqB0TPkikm:[We9^M6ROg+ -%_h9Df7BK28^bLu$B:jFmd4H4S@Ud9o8X3?2(rJD?o6rj8-e;6jOjf[>nl-5r)2 -%3/np/meN^DSgQb;8$D+n<_e1_>XGgi/r-#aU=/jB57.hOR8Cu=24P,idW4^>NdcZ37T/=i#^ULSO+tj"u1%o>-cN& -%R,K*a)sC_lQ:&(1*FY]8W*dndKJM(dr/p>=$"'Vc0+@UL7NQ$kLlI?4U=B%-8EfY5+usuj45cSP*C^Aq]$]hR#<-:.VA7@V1"80C -%#2Z@(j:I+tX,L/JB:(dX^'[F9fjgaQhg$3*&6JDEmmd#oaTFr)Pm`S=+)uc&bt2t.Nn3W>)kN,EVVRSV^"K>KVR]p/+["H1rjTM* -%8a^t#p%c>_UgLB^1Z9=U=S+RY5Q&g@H0'D!,SKak!Fi%_,'1-.l1?bR]Xi#+0sS=pil7&4Yp:J$_aO'L%^c6](,fYKd=3/rJ_Sti -%:d7%eL>'AbD(,NtA$u+"HP[P[O(>bos#]!,m+rKrd?;-*T6Xq6^LBuW^6SR$?;:%EMr9mH4?Qu+l,pAl"T@Lq^9_t4b-gu%j6YBA -%&gFX<,-f0j1IAEV+:5?c4[Vot=$7,d)o?h%8,-Z1c3%!>^'bemLm3PW.]V;?%7(IrU]VZ>i:&>UEZ_G"ID[RdKTEniANY)o -%`!Z$F)Is"QaFR<]'%#PpPmmqlYS'B6:pV;@9hUCBY;HrYVf+hM5o``2]Fmj;hYJ9POk^*6Ej:YNF%.JY0`RG -%Xl7[;1oNP1iEI&*8,\(BrJ-`ad)j[9FR((:%>MRbm5n5rJIpt.67%.U@IXmIqpUaRa@dMp`P=%^Y!/b?*H[FuH-Q&WSuJ#40k@$b -%!MVk28ODL7n"'':e1T&*ZdV&u4q)eq-3ot[MQK8$e1Q3'J`cpKA,*PrabBJhq_\<^;5FSR@k>U(q!W7DGAD,I:$<&84!2B82K9%3 -%_/pC%I7-cD'-qLL8RoD%@X5WpW0\0/ZsiFcmPu3EFTGr>&tub\4:IeC54`I@NeFVq]U4+pm;X2#7kDgrIT0^R1P9csJC@CS4bL\$IUGRA;nP&ghr[PB)^M_^f*3YZ(Nh1[p+FK0\4MjrCZ:ho) -%+Kl[29RAXuMN[ScoEk]^%noqjB0)Wsh]behTWd@n87tI!>@2`5XDXMA9VdK*8Rr_LSYi!!BSS4HUu[Z"6RC&chlnS6g_>JDlc)Vf -%K"7fug[uS4f#$a@Gk-0JD[2jser9u+\RGo.MYk=OY/fqIe9uWP>Ib;`Gug-ZDsbP;kpeNe4qM^;nB$KLRuk/R29D24K/F8H+lp*1 -%LoZPgLUZ[9$lc_7lam[i"P$n(>n@+tl6s>8&>BL5GX&VpbF_Jr2Tbcjd6aH];"lX$4G8^h6H\Lt*`J=h;@"0m$8KqTUiu/>n]'6R -%p8WLb7D)biiZO/>lde++$?mFUj1%npY:%)f5eEtUg3@kIp%?L<=I:Tg[aYZ%?)Dpsd)SIPQ4%\J>n7/&_`E[u<^MC[E\&2QU/>7% -%??(W9!4K9CgFj@)fg'T0NV*]_j?HM'KQ%j&1%5`@W!]sHJrc=hok#f38ld%fb5@Z -%MC_RI&b]Pt*XdtcAdOaX(;lQbojTm:mN"Q;oQmst.W"79(Z%)bp3JM&(fU>D!5F>NL"a$%3UqOhi!`qBMhKffT8,tC2fA/S+=[9[ -%Pl#\TFNB;o>f+(n>0mE__O88T&r)6bL@S&FbWd-rKPdEN$+8)<0-K^3!5gCRK8!;-Q\Rpg=BIFGF$Wc)J5G6]S[(pgK>Bb"UPcUd -%pUgSPpc')8jR6H`3[e1:fi(ko+2j9_;;)C$q9h5^%ZCqtA8[ -%]=HK8BcMmg$]SY5mf64jr7tUR7L&@4rW1?m'*!gTr!?0:G7$?c]nKQ#d;2BCc9TL-TS;e%5[Gjag]cQ@_.q3$.CAuZZ">Y=qGQls -%^P)J-B')"2*T^W%;;F^,0eR\DZdp(%-PFE0j-L39@[QZhS?N@#k-s5-) -%2YIF95]ZSUS">tmA*(A=9UkjAcYT-:'LW[M$Q*]1%fdiDW#h4Y_+V1rADP?;o$?b\,0shV$o0GjfSbkeIO)KJ@e:bu>c0je\X*-p -%Hi9LQo^"Q-h$M#^4DWa3puLF(^?FCf`j/;o!8!62$GlA9GX`rcB%)aJl(WT6D%u%+M/Rh:^'Z`j[l1(cY`C.FV#COf#fEX:7tp!p -%987dm4A:fh`C8G -%YIDhMl\@.a(uA4/:OknGYI4'hWf8!CS30C\,tjNC=lV'd)OAg->>dJ@\-.sO7Edq^m5K59S@L^E".>WD7GK@A]j$!!SK=Y(&uW#@ -%dRi[+d<_aU/t;tuV>cA'\8e,F$^A_H\p5="hqB$",^Tui1WR;mP3<0YkCc;e%(a4TnHOf'FMC*i=_5t4RkpB@bScTA@jFM!0HDf= -%N[5-VPXs5\NR\&Pr*"(@Zp7FafFQH@YWWc9(d'Ph5qB]Q68Wk@ZqT@r-g][&3\tH;j`Ue+#fGcr%fRi9,&#$ULCjA8#_*NGDk`J> -%OA28=UmWA"?;ed$^%K*`+OinJRUs1uC)cL8p43knF`gt2anFWG;fj[PDK>E#1u/k,9)tN`e.DR11=Wi;0IBZ#4_mVEXQ[qYdGGJ0 -%Zf/M\JeJne9]7=6UE=#!_T1;Q1!uUciTN@"5\DtA0gOWf%YD3=Y*KorJV&re82dXC.Ki\b25'?`Paekq*%f:jk -%`PE#'n3F)2fkM8*Y=ge:oO6>\!D1f4)uEFo+bWVbM#77WeU?cl;;!VIVls_FS)&5:O=P60r=&QqU.mSl]X[9>m9rjs/i9NcW(ImS -%kK1D3Ih%&4HPm!>1I2Qlb/Qrei(O[bLO.oK^u.lt"GcMUP$r;V#_I\dD\NW*"@7"rPYj+o'*Q/1Hn6->B7_6cGfhEOS-af*E$&mO -%%*euAE3Lsi?uRFuJj[-W,@GI;#_GG=@j>B#-4#2*WuM:qo5SeI1kWQ40E?_]_'c.XPFar4jRGNT9J)P9K/5e)*(HPnL;B9##S-[8 -%&MQ2>5]H;Qp-rDF^"i%-gJipeXM.Jg%UjMqhr",BT4WRaG-1iu$:fmk-f#!j;bbQ*5hlnY(9"gJ@iqa#u*\*@O=G -%H#o^'\gS,J=K>I[lB4m-J]?g)NJ5BAcSOC$AJZa%=-gFkZcT."N#^3^\3'!JW&[YF20/,M\-W]:m[_$#iF:MJ$1_WQ/q8-'IU\BU -%c8[3tr'3gJ24&61S2i;kD6Mdaj5R[>g<68)Mm,9$JrV9bh/&??G"OQEgG>8CfrIpJ&BkT;gKFn6E_#T69OEm+^[h1nnbOA0-aETF -%l*a06o;je2[g'_,GnTB8'IhD4_(19[R)40!k1<2uiVKFj3s8hKpR.tD%+\'!"<#`:29e`ITE;U[D!-3/Q?JnSIGopLL6peAl@QsH -%,EU)e`HpeD4[^E>WE?M)UN.`gMk)f9q8RTddlkJGmS/I&@OP>#dH[?S[[oe514N5o^"2'I1ZgI-2gt_"Y>a1]#VM&.T3KLIHb$i0 -%B=\H0h9(dfk,EFG06a0Elnm86V3qN*?_r#GIRBE6[r]6)i^7moZiFI%^K`#NhdLI8BP=hSBJb`%ZNjho2g"JAWuL,K+K[2*9`3[0 -%SpLmH,ic&qrc^6]C[G@"s*cNUeXi6&et]Wd/`cU5S!t>qV07&_\'jWMk20`3 -%F2r3VgKV)O*Y)s=++>L[eY)Y!opRR#/h+Zug0#Y8R9Uj^!6`V,7[4Ft>3sZL@&D01b!UXKmkG53,O+ZI_cKHM)QVr&ON9 -%NGk@McMHarJ&a15F(.lk=SPqc]qpRV(F_TImQW?;SR:V-ZT[%%[^31l:rQ8S^qhdhic6c%mZoM,F4JZoSrH),[T?B\YQ%ol.:(eI -%bi_0^hX+\hl_a!)=uDc)![\1M_1J3_.dq*iDIIc@>qN3;j!Dh[njWF4Z[R?]]3)$#Im/f-66YJ!+hm=+IoUs+N=,+@;gfsc%4mupNTC2HjV#P`gkga*@q955X -%Yl36SjVS$Crl#$Z$,=^O%sOHLAe3jEm4`bR[?JnE)n!54]j/1Z=[%6II9b(E(Ar=TKPD%HlhBk^c\K_gbN_kdCF -%Y?sD`WGi`eB2m&1F*i3,leZ-9lM$i4jig>e,MQ%!9Jb(0oDX\Gm)l7cM -%[mpa)bZ8`BGgGOt?Yl!)-#tV2^H&KV9Tr?WF,6T9@/p"5"no=(=2P>)_=[e4elIONpG%p?Clb14M5mA>E -%)CqkH8\Mu3R;Y:M51cqfgb>7eVU"j5,S420.&VEUPG?h4/,VKmr5%D>8(e;k\7+lVl5q+gH]5:ZfdUlClqVfum0^W*&,q(TM,B9rtn09)H>.l8Nm@:2Qn)#t]SuSJfHa;!W>*fUqMDbqE?k"/[8M#S`.pMHc#O=L:>]oRc?gYN -%/]34MhbA]0+:P>.^03UQIM\I/C1o!,m!Uk=[5L32FR+\<(L,_U?$DEAX3KYd[t=nm?mjX(K.e8EQB%[:3OBkQndchTci(")LX`>Sab>YV&=N]3h!4M5P&\dY-A>dK3E["jiX`8?:A%(CD/ -%YMYSN2q^!no3d/irphrOru&\"#+[X(@SoTIoB%M!ODQZFA+^"bWRC[pbTtRt^]; -%Q0Xugo@']io#E,CdUhR@hQ+@=BQjXf1tkLEkGM/DX_-grPSa\4\J'l8MEdg -%r8("Ob5-R`f2n!8$X%d_HsN3tqUE?NAq;6*oAVL=^9aBPO>`I)l.;U"@q($sjaLe,4igM@-$!g\8FeGJ"_C?FLkJdB)V"*GOBs0j%/WmGa2Wpoi!fW#-$!g\a@$lL@?ej< -%0d9s+Bf6D0m!4s_jn9u;OVGd+7>W!',Efj^SjeJU)^CM$ -%fOn&*a2Wr%c/i;/,%$3>)1OF`2P8CeTGQOfNVON0Yl+m;T-Z@e@4i425>,`T92/3nr@FrDN12@Fg4#@;Hq$.Tg%MbJjth=I38+#3 -%UujJ^r\2IfZ_Z`iYeBHhrXCc'Gb8[H=]4i/!=hi4r@FrDN4e7_gWu%OcV2OR,hpY.Ra6:&4oaV^YSg9<8[b8)V"*ieq$jdZ?N0!B -%@&"r[PANNWC-KPH9Xt$PWVHr8RrJ7-;Y-<%@l;C%Z_Z_>I[`%=p9URW1\*5`D*L[.4u<)%PAEHVC-JD:(6`T"956ZNQF)LWT-Z@e -%@J)#'Ib&9u>JfSeJeU/imFZ[An:bZU33CAMB_f7#8/ -%C6+@dradNAlp'%V==*)m@Fo`(+;RVk.TB![a:O%9T*rl4m5Bb&d1G]M(GkQ2rpYaM];)SOtpY8.5R3HKFa,c!^+S[0U2n:IAqL?"PD'bdfSX!201NrG\]RmXfu!=6/XKBo>%)q]aTf(:P?5d -%O'6+25sb]UY&Bo1m;O=ilq&(pF(!K8UC3B'O64"k-a6aiHn:=!ON\hskX.lSXpg[EH/bKY;A$`r>cbZ5,_h(\(A`c@juA_K:C-Pm -%O?1krs59`L)'FG$pc8qc6?ABKB$I@@qGuB6$8=6)9FEfV6(iL_Fb!>JiFjf"0:iT*a33JQ4=f2?'O7"77QfZH,#ZdCRaGm*$^L9k -%aT8B*#ERm_"a'sTQZRaWMmQ`)QYrS[27I!ddT=YoE.,t6g^1+0:aSV4^oR['[Us'-otePMZAp/4VEXEZNL%ZEXn^[dR.Z5%nh&p' -%n2QdsS;QrTNP@U?8p2pmoUH>8WR/c*QuAjbAf-k$9N6"W-HJ<#qh-uLjcCUd\3u++T!0oBK&B8GSl#5P=.p`;'TFs[%`OS*Oskl+ -%M%*-Z4!$W&'>cG8/&?t!)*)lU50`h<\dc[?&7Laq;i\*XomTfMYAR$8U%%)i&%L)P0?1a]uCur+:reJ`f*O(2VE? -%E?BIP7:K>L&P.:mK.?G>jFJh3ET0XUM2WHg1*@auecUR2-l*eY+9s)=#WY)r,kMSd0,uO?$_rC8K:.$,-pCZ8WWED5rij]/E7lgQ -%Hlqm@KN2I$03n8fl+7htR$clpf7U`4NtiC%KT=aZL]l&&"0u*60.7-(">'d+-[_c$bnnggFUFcT=@3ujcru/i;?l(9='`QSJ8Ga& -%,SA:TmmZcsYot.PO^M1r`/:]Ac&u[unQ:huVC;;'a+[=kkTaBpfUBk/%]qh4K!,sD1]@pYk/552\D4k-N0AJEEjJ9!$O1]ERVd%o^hL"#rWb2;Z`\T!^SIs,Ut5l;4M\ncWDh'fo[<:%Bq8??U>Tekm6On-)cmUR;h2mBd6o8`^.8^Ldn=RQd*^CF, -%5PRS?Zmj6LnG%S#5XF?n@?+st@FM<2:5rj$BP!dZ/u?Z&n9c.>es'DVaZ%!BnGM5s9b&Rs>/'LY+_*fD8WQl9Hq7:UWM)tH#ojP2 -%1L,O-&mW6(Ze$uf%uHHYB+WFa#b07r5dT^]!DoZT6bIdU#D*lcm8EKu3M.Hl34PTF#=65#F=]V`TqH%\4]8SHFmF<0(k^RcBsB$a -%TH!#H5)7(E-H]gpA21('"J;nV$.DQ``h9sWKGpin3C;ea(_?m:\Yt@+dNM'!6UX2m+sr:Cc?L+,a]2M%4c.0+H=QjZM*8!%`b?_thT'?(3'9[Pc/3MQ;+-POlAAn=&o`cpl^R]G\uE-.r[ -%<)Z:LF=F!s+fE#SH8EK@Seb@ScF$WP`s&HSVF7J!>Sq/pO^)7I*l\jGLJsQ!6,br"`=gY0C_?1&#eHHR@)D)>63eq&@T?7nYgX:_ -%80/h@NC&aJ0L\TEAJCZNNn4<_l!a=D657FhR)#E)"?>[O]]#Zh2,I\ijn-<9_5mR6T'$=?E(WV/*(P0Y'Zn,c/. -%U>Zj_!MZhd0Jo-Y7*6C5a4c9V/#rP^p;A@KPH<-DjJG&j<8:tDr?r'FTgCAR)L;D>EC*6qRN'+PIlHG6j'A4R_+oT&+O>4SFSC.Y3WtVo-t4,YpKn4>ARZCi`_2nHBe:[R0QU -%-E=nd\ekZ0Uf;?I)ck8$#UN5Hp-GH-ZshF?S(FkV((uTa_5?7iD]HciK1L#+K5RP?_Asr5XWd.F89#G*kU,?8[#j?iP?`1aKc;*k -%jQGQs?oVO.7Kf$Q!&P[oN04W=Z_;=S$]0SuaI*TI@tC"\Z"P-gkX/4^OIR:9,n[CmK4se>,bDFQjYhh2$n.Dip!ZH>g4UR%MPS4S -%5&GDh,R*Q\po[a/nn_923g/b5X;T/A:*["ZT$(nBRlJ,?Q'.jN/m;"OF1?br$T9L0/=//,QaSb62Hg,?_hG*#Cu-K*-(a0=4PKKX -%,^S/IIiNO/>Z8@[-S`V]=CDZ_.mEVO!@f9-*=r]?XB(AqY4J9%!k'N/V:).!lH-W$nH0YUtA2lYI$_&UEP'2j(i5^i;X9IR,j1JU$O%ck0Q"dnqHtbK_,+dQ+VAM>A@I6]@-NNeF`Crl:q5M -%?#BMB[o55VlMoA9C9)LO=FI:.iu@<]?11#mFfTS1pD6\G96C"%FQl^aomb.>&V'~> -%AI9_PrivateDataEnd +%AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Brian Reid) () %%Title: (ISC_logo_only_RGB.eps) %%CreationDate: 3/25/10 2:28 PM %AI9_DataStream %Gb"-6l`OMbE[LJ_q]3tS#.hk;RCln\`W52%O[2PJ[A8p.$lUE-e`+)02HWtBjem;l`:l^'^%YrXh)pjOjoWZBi7b__jiWO/I.<,% %gjf7q_jBgUr;Q]Us8D8Q<;K=,o"3_BQqtKl`IE=1f5JF<]]V232W_s5g1jbTe4$?XI3dY"+Wl(/pu^?*Da/X@Rnk-`]`%]mLQ>ej %r:KZcD]\oFM[qarn\stKs*ShXJ%kmHX,m:,F8sc,DuQrh0CJhPrpKU<=)X]qIX;%52`L=d#VDq2h1,=iX"XMDg\:aCp=$3`8hNHU %^XEepp?OTc)HD5Ent1DVo@:,M;G8rrP\-omT_?iK3U0E:1;r1rE#WJrVkW.?XmRDGCT>Nh3\$+pN/4X%t0&aEVM]mgEsJ& %pR?*XI__c2G's(C4\c9lJ+;:dNDCY1I/*JCQ@J;1?ehiOrF,)p[<:j9r+Gu#p$lu#@'eI7s6_O)Y.N;t>%=0';ZCD-mPeL$]Dh-B %5(3A&%tFT;T0AiqH2$F@IscV7RkMMOkB11hIe`L"?ep6Es1GU4/F)PFs74`S[pQfF_lpdq]YF7f]B&]FJ+\m&j6`=SeqZQD5Q1<1 %GMg(3irf8RN@`PVS,6"=If7SOJ+N3j=$FCjs70lUXAlb15K7pF7R-D$YbI[TBhm!+O5P""K?[VOs]AJ,7 %iXc(em`eC3nA>5&2qe60J1k,>r6sF!H2T,jrZ9hbhqnCna04?JrI44T"6DIKI/*oGhd[UTou2\>52@XCLD9Hgp@%!Rk:F_g %5%soN@Z3h.pZg:QnAKcss5EJ)J+i,b0Ae@!qs0_Yrp>IO?bCmcjj!6[qUOi![!6u3\c;6m&#]I+']Q]Q`a>X9F0P\*#5l:JI/5L3 %V='uD+7C<>n*f`5kC(*`p[u8UkPKKGm[ihfn*]Z4mcM+W?+VV2q(CKWq)k;3_n;W4CWn]'OttJp1Q:MeF;b\MIOt=4UQ))sNjPt9 %TDRZ[*r:;WlPdJ2\usI[O$0r7p9_!CG2LmF[*e`]=tAp]Vj:P%TnW>JT@W\>Xu4=I=4cXk7]iDVXt-\+Xt/!uT%EYBY(q-_QM!f1 %:9RO7Baq\g\EIQ4IjJ?^=+9"mXjf/0-b]6"lgKVu&G8i0i^6mN`8Bf&YDYX"^ZD&3E^DncDu99kG5OA(-fX$(l$D".-iI]LX.EU` %<;sMi)HW/P>"&6@?N+;eY;s5G8qjZRO*+_;QbN:9JSX8V_f`07""sS!o'9G]e)U$u^_Li8^Tq2M=7rU7Y3sn$4Uo0giOV*UpLi*q %`V"J)S^nmTqt9mXV7UJZo=d-\>hf7,Xl&0-kAq1":o']70!4FbaKMiYc.tEC%r3VdqXXt;lG6Y)aZ9WCoHD!3\3$hApRj&81nNbTal/cU9X"'%Nq&l.p[_Zm='Wd-YH-H\e$T\FqSp-e\f9u5bHLfTLNU^3PN@)(&*o,=9'aXcP%,h/F$7V(,lN2: %jBfT4nWpe6qt4q.E3_EOG)UZfK(&ZE';6pVYiF>\hUg68H9PZP"V+Tr]96DHqeKL5i[Pbrjf`iM.5O'=?[dtNYPHl;md`DEOm`8% %[8s<_r8MqpT0rr;Ni]u3qpjSPEDcV^Y/Md]2m80)m7Q]M5Eer>p`]H_b8#$=Y9,0Erhi<;2)j>TlZm%fmaeOh>\rI]`jkC2fTu<# %nSW3Ra8!<=-`+Ja6q_qKS%H)7*uBQTc7u5%f%0&1X93L8+.#Z'CDBKKqa8ao)Dk-OK`Umn6`[k4fM@I^&S[GGmpZEeY3S9I!\ %l`B-B(HLTTFi`s+b5msi?1_O.6`h_>::$I$42l5lp%5D.S+OqIGo_3)f)_/3H."KOoe]E,JIcefF>_?GR2eUTe%uNQ5E]L`#C`*dg$GO$mS3CjY\j@??Pmhf8@Tn!b:.?7#/.,Xp6V&,'`9Z'K\6R3't\H!E#iiH\^)CQo)&rLeZ3](\k-e63d3.uLtc*OE$d %0H)\f#d!3cTKG/<'c2-%eUW<'l4rZ+Ia2:Q%een&J`WW%U%IS^92;b2jn9EP@APFOYe7IoL%pSL_Srs!*gV2DYjPbCXM=._TbFFe %!VoK;M2s^WSW;(iG'QUKIY,>&HX2&(H-o9jkV";hn"Za?%_?7MD=^p'bm.pP6T*-rSMNUuHrRfNDU-^o@3)@\?Df!9o!of7[*Lha %5.g*P75`Gj)X%hkcoYp69f:9K3p:9t`Fi1:+&iQ;We<8D4BDSM&,dTbqTILTJhXpZ28AHl;gT6L,js-1:e:@#*_f>+#!FhO5aC&-6=2\^B3.=W`D40?\T/ZsTO^[Md3)=5;qfhjKnW7M.NHk;S* %m*C%+MsSb'r\4r8P-:b%%FsK,(Q^SJ(8m4&[4!,Z@jO6."SbrcV(Lq.@'bXjU/m0npd_Yk:AQU)`HSdhQ2o><(D6TkXASsT9:4Ol-Fa1_?XG7jNek9Vrkt;E)j7\H(EeWSb:O*\[C"IGkn;+dE%OJuYQM5-Y,DsBiq@)78m]r- %GHW4!/-.9\ol5i>[&2[2@lu=04fh.)H6VcWQAQYfHIPN?kd(Um&YE!UkOY-J?737de%B4gWl01RGYs)8Q<#ZMY=Zp2g@""LEoUUV %9=$cI:d1hVN%-3aP^HGQe4cs@k0MjmCCc?>4g/]8f8:?ODRs"-,0:m$@]65";Uiu/C-FaF\>VAbjV]7WM_5YU,1rK(/#oh;mmnr- %1)/PjYc.E?c)IHeFYoo&$)R4Ob];DqPM8\W2j@\k\QsNM %b*V4cnicNl7/1I;eOsu/n$6uFE)P<3it,b$NZC9R5Z8q&TuUG3`.C,^G'W]*@W;=B?SZ$M@mbXZ[!ZoS1;gckl:s#Ho?iQA">fYUNht4@Zh1P1l0)-9 %E%#RIOu\`MQ)'G9'DtDImR&Jn+.;F#Jl\:a"T(*`F;t`gF/')'VC,<0ZRK#!hhQ5u?Ho[K"(WpefroM-U0T/*V>Cl3KBq_&FN`q: %_64c4J3':2JG=n`K_&.,Th5a.,=Ou:q3&3aKdO>N7FF*Z3X#7*h:-DMNg'tAgX@g)pYuLgs8!FIQ\%:tP1rS< %F6F,j,YKpq,%/P@j`d/'h7>e@lYToTo;;69`FOnQj(B4OB#In@P+OSK68Ma)VtC1lb7EnHJr[71HjkA#>&RUbLC*q/O`Wc!q(kI* %0jF@mmG]L/9Zb%P,,T"LaQ)$q9=^T>+(k'W`m?`e@f#Zd#@5FaUTS]r[E\[(m3U(_Of*OE5AccFPP[k2KefP$rPG(?_n?WG'^ACt %hnid!rJKm-2-lnA:RGmI4i$),>!dhs>h,\mW[$<"Jc93BI#9<8#j)=3E.gER/(?D/ZqS]Dg;+C:9;/nKIddd%+K6C5i7jVHeIA/h %*+W/k))`"C;NkOd$;cISMF!8n<"lPS$"Y!N)g)D-WK;!EhsM==GsI='M)lAp_$+/"K7u%EIYab$,Xl/k%k7fAU2gld %-l2q8nR2$#BDL)[T8%;XGL8/$(/fMCF:^ME*f+5Y#"Fap9"a0B9'=e4;&_uBp2qERfOD:]?/sq5-NneAYIi+cf=r@ZY7ll)bNnE5 %?Dk,Z56(9@o[ATjUBAr>_F#@VJ"]_YH.;5c5P]k[n]7?\Fuqe[C)iHS%fQR)+EmC@HC2j+!A#"*EZX_[1^i7E`WHS-,NcnVK-Iq\ %^fG%dQiU1?'5W=L\.F@P:2)uI]['-%j %&`k=:Bts'G9]b-!$5e\TCCe'ho9T`BOk2@8ce6R*l-t>LH=T8=TY2BaO^=qASojttZR>^eZEC@ZkPjLna*mFBoYWoamm#_@4lUY# %T+;Pt+-&9jq?_.`4lCY!H,/_RP5TX@m;UPR2u10_pIUG?P6Aa%bhE0%I_b.*J3P.:r3fX?YJLN`;JY5>oTL5tEkqD][iPT$TP6F@S2SO8@Os5S60"/jIa %KpSu9?L_0iEIIfL?`3@4cZ_1?MsL#QDZ`HYPf:G].C9BGSp=d9H&]t]q.(Y@;1+UOf:]Il7=!!N("bn %qK.UmM\stB72"ML=VN>jAb',4VmH$0QP08BYO^?Sq%T_o7c4flg@]T7JL!b`q>'i#4mKpgo"2l:LLufNbor4^OeC %GG`=c5.6f@/[!PSY2`(9JW_Y51<)r3_auq_F:9VcjGP$Y@U'5%V3=M1$SF0H_uLH<9FN[2bbTe:%lILoM.mh53*F>EJkd5-o"^HC %Sh*fblIkL'/6M+!la_r[6tn(7K_YGX8)Pt;\7m]?1PaFJmdR!+E#t*&4>fqmPY!^R+Pot@AdqCJ[t0 %a5D66gXU2nkq&$-psfmV4']gBc>n)>MOJpY\p/L+b,Y(!q[(/)*Uu?7nNS&a5998Y*Uu?7nNS&aruW?Q@j(SDE1Urf\BS/d_)kKk %R2\!$Lfj%]P6baL+#G#g&^iWX9BWLqcTh2W5:qgR?OS/S#pX$m,>OWf_dDOg][3"f830H@G+eU<5@+3=j[V!(jE81HCtImCVeZqE %^7I\VS+lH`VJk/"'E38ihO1I*M@N/BK3G59N%jG[5bZ8_(Q&q%;<^M,&$#G$q['E(opVUWKL+!Ic09L7P`(oI'U_(=(hc:ALjBi\ %hjLTQ"Q^hg8:=4$r7VpQ4td^$aOIb!a.amE,c8D$Fi6FF%Wc@Oi,p(0]^ke[VK)7FRNL)nMZR@n%(RM*W9@dXKf=11?60]W[IB)S %^=_IJJK'$D9B_nq.=6ldTJVBefdGi/KsP/[;\:rfgta1e=Bqn"'[h8q=9Ppf5L)nd5%"$RS`r,3(\;X\,9uBX#rtPu3W8H;SF`bL %Z]puVKq+Nq@qs=_MTnpF"$'ZDU<.Z*jnHi.JpHmP!k8Zq20-S0u*eoa:OLN?uXaqZ8XGS.u<\0YC %dlg;#8W0O1Q;K4sn"bisK,5_9.U>9>6Om:T>a9:7bHOD(#ka(4V.G.s'/`E.IQo6%%]HV3)Of@dhk'8LF1kFbouL=;P6RR[CitLG %RjX1A71BM;NR)]"=1UnYdZ]tD74h#5lq>rkWB'_o&[>,e)#Z0TLT,a_&?0-:+p8mpYSc- %:bQ$Qmomk7!oYUaQ"6i8U@CKC<^dmtaK6mi=$Cgu`Y1It`#h&79%#A,%na8*i1"gb,*r#\T3h"_I^b)q5"]8uSbX\Q9=_*Qc[D%M %pJ>2m-d=_uY*C`N58jmk;@BSO+maT+9mj-KAN=EB5ORR/I8MSbpr)R(_?Na&LH`2eocNf6Y*GQM36k=KG4LRF:4CFi;LOjLE;,[#l#"\uW-jW=I72iQ]]i>gM>reX5.(OP/ %f$TsUIhk1Nn7fF7lNq&aSGBUZ@U[n>lJPQ/ffWO3ERDs@*gN@n6+l-/3.4$iiH$&r+'R#,IZCEfauu&kAND=+G$^-.-r=%k(-!s^ %P$5hHSBObMl[2Hm';)9UfJkFCX=T'!G5DZQpns,Cdq!HH;&36L"*IbJL6;l:&OhnE'8ie^K6G^NG$0!/=)%eGH,;>#2l/Vp %3VNMm)7bPuciGgF=8'Edi7ab;d%Dh&b`g'$Wb2#E8qE\U9W^=6#cgZs8=!N(lLVMQU2JPleiX7N%(mQ[4WFt^+nAP$mh@Fpcsh_: %M'jFb(efl*j<>KlI*6B*]9C$;$>rZ0sAdl-V) %W);aQN0fojB/kiOY_rKa4<:[A%rdEh@#:s`HpGBtUFR3XX;ur!&P`cQ&Z@NXf]L-<,+<#rEDSGPkqY3,q&N`'XSY&EK:j@J:d+YA %6-*clK:j4FWYFer#BjBZ\k>@d#]_sV"$819pe7CG2>6K76t?t-i:J$2LED>mB$/!T8,+#5JLll<>PS9A*Du*8AW?j-!upAW]B(hG %-f?&se'[a6D1$H0.\_c;XrXo7U/[9C;MQaXWL"O'5s!<'q_RV]HVn/>Tq5S2U5F1O*S>Ko9)\VZG52P6D)GRf,(Wg4h9TAY3TFWU$:iOY1&THA+Vf&&+dh[6$^>"mf+W\66cP:kRJH^)V(Ms&4=*sa(II9>FDYc#QhcsL#nr$Rq %nVS^Ts'8siGaVb*1En3)coo'=")sL:.XA4JhtP^348a1*#[@;(\_K:F[2b?t$n^;3kIP">T$9Q6al-A!I=Gfha.H<=gF)gf7MsNqEFTM+,K2\Go8>EZbZ_UN>XRgh> %5_gT?JGO7V#kDN;.UV`jrhOPJMj+1&/k"D$8cM;M9;+r/B(RhXl4e.(f'gBRf@.4pg)]b`rnl9krf?`is&c(H]dYmiEUs_@4ktE6 %p\sjM<=.)6nYYq\6thjTpSV)eq;0Dnm2X3NccBs`>HsrVbRn0U*BsHgBD#?lh)&rRgZCiN;==d5(M+PA1lkmOr:'GfSBiif5rbo/ %m2AVPE_H(;dIMU-bK;MBC^mbJJjlAugYUu8_o\i5<1.lB9:]3!HN!DY]fuCYhOe];q<@SpFY:'g-^"#fHA6+N%)(J70$Dg$W]2=k %NjlDCO@:2&Z$U9P3^R0\`*,>LEd%D)#bKfR#$=*B]G<*ZhR/H46B6[#>YOkmcV^!_eu%7TFrd0L/e':SOQDJT]jp;'p2rC!(Lfcr %KZlAbAr@SM1hnLuEu8m;EI?@nFiqse'>Vig3mu2>PlF;F]m.e[glbAUhZc47,3I:Q&]JJdZ,AY^R$[TQW@`.\'a$!S[GftEqQqn[ %Ru[YVb[=66@Ur5N)0XEKAa(EVAF3YrD4)c6`3o&n\5og0e7tM@)HU36*ALuQff25g'*FJbp9U%:0L/bf\)1CLXfuubB,4"0Xl\:t %ZCZN5>/RZuo&@5JaKcV?5$L[hh*t`FVY)Yi`l4ug2e'k-gXI"Lg<2_@.W(`'%+(2$gU]37#blQoDX>*Krb^Q-N!o!Y3cBdE"2-WH %2*gT3911(3noaETn4$Xfa,YibjUBiCCXXp%&W`#@`;ic$7#Bob!&9721"R^8I/pZ)C^.1:N4?B*ZS0M(l?fIH4jCdLZ>CtN439(@ %@1+<'8^P]uf6T9C6^`jNg;MQ_QD#\1['^#&/M(eNP\V4^OW,?.6=$GI?;ZNB5>m=Q]0ngJ3 %SE9G6AK9a3f1G,32Y1aUbc0iB/Fcc)A!@KUou8>d2Hm)i;g3f;TWArmRrO1nfWa4:f1%R91rRIn+P&`m1Y4_J!(.rWi30P."`p'U %5//.>[qq&5UP0!5qD[8)>5P8X?=hk\%-p#bZ6a]+A$r;Y&l]jk\e[,d'mDYPp1gA@8M`?u3mo,Y^1u`_N6sB;ROKJIWC3J&s0Xr? %EcAa.UQc(^mE`5dF18-NV %ng>!Z@-b+Cs"q0q%XsZ@VfsW2Ifk/(=DTp:_QFX10aI/QCCK33lfBhc"8G_3"'\&OZOpCI_h_/b)"(Y_0kBiGg%cVsJhW-;E,T(\ %gh+oPR+Inpf^`HTgB3\J=0TMUL*e*\FdO.O>6=ZGil[rqLtRqQM#K+5Y[ee$NlgVX91mdQstNR7HBg'=+Z9/ha6#g0nQ5Y]J:IiU#k/ZiS`lM%trA'$H*s %[,I+TAobM?7Ra_`eF&sTc*kYR%FI.@P>;W=2s#MScI*J(N;dS'lTf4eW>5mbY%BAKDMjGc;oEBD6KA-GE3bo#G(%>=NFW8*fkZS" %WD?poD/K=,0"Ap4D,btM,';Y/,7eY6"c'Ogh:j1)]$WS,/NH'8YD&Sjpa4Z;rr1K5L9]FE2eMZ0[A:^->`t$d["PiFi$LO(@XoeG %pGL!.__jlqQGjV5Tki%gRSAJA8Tuj1$>NC6`Pj[5FU"`abp5?-l"=-5lA@krI[_gqjCddX*co3#TiYuseJM/Mf'64JL&^c)ZV\JB %$:Mn995X+l4H=bql;[&9e3TEPCGN>Hf"KIiM_8Woi4C=96%PuCoj==?#qOBS"q*Sd^Qq;&-b%pD2M7"#2Y]%VmEQQj0,AgN:q/I\ %CCsRYo$-`=0;L2^%MF/8iGo=@P1cd-LB'7ZV[D-SNOV^;jhcLb]OinACD?8 %mA+,#0a,cbj.30R2e!XOI%mV$3pp,M&-cgO17OdOU'+8.UbJS7a&,OD=(2sZf*3Ys'frK=`Rc5.BO,C,UhiCL"uRWK\8kLk$7!ZV %&)=uGL+k$IOY0hCNOr9t7#GXa!MX>1(Y!/'OE7ONf0$;32)\id#,jZKTSLa1GX4XN$:9]kn8+GZoU0J``oOe&+Y<34MQe6o25rL? %.EAk;X0KRQG!*.,@MXn30P(c7is]([&k(=Yp*/(cg,.f8kIEo+XbYC,QL6DTNhHf7o)(-*Fq:He41V+=pGL#baCF#FKiBi=(?=EA'?&N-mT_lF01[(Q'io+-M>-#^ %Lj<0-"];g\g%Zf]go\gT/*pk(R-`!Whh*"?EFT0%^QAaCgJo?*KTqIi/96>3]C$FZaN2Ug!VRjnNu3.ZPF-?9EWPor0]0gi*HqE] %mS07`ds3gGHVoID)p=i4E:3M,B#`M5?VB>SuAEFc3/dkQ-M`oCK68"gesJI(l#iOpPNGl/u!6M>%c!L!_hb2",uedNsK,2CM=r %P2T&tEFC>U5e\R_'c:1#fUK?UgW#QWTrA&88#4E?SVD'+D>RY<.J;)nfKkH2)^(9pa?/VZ^-hu3F9)PiAQ44T+KDS6>@Em//P@TA %k;@(C`C9IfV4te^C9_0O)r-ZPG;5Y%eU;475!+"g,qQ?5hP?pPXCXqE.B4bQ%Z!+.4e1MR^/V*L=S_E(^`V@Hhl92Q0a$!87?@g%l:AV.q!R?QS:9]6`)PLScsiEV7GBBd#Zff3tZ" %8(5RR$!umaKVmq8,uIa;)b1S>Y@%2cb[Ri;Y+jD*/FTQO9X_7fmguC6B\61hOOINb*TW+n_,K+![KBij% %bq<>lnk8#&,c>:*FlK7R8gY#@@7sk+%j]N;b %Ns=4i7<%XLL=aLeMb+Oe*\i/FYp#39T90pO>'hPSO/CSQT-59\OZ;*FqXtVA*YE:"!%kN(0f-9#1"P&U*a+og;lugW7GC3ZRfV)g %?YY3V66'kE/ZB41/rB?E+BHM:](%coa0OID4a\LkG^"iI>C(.m@J_C0Mn[*"eG;^"^^,d3h_*%N&n7dW&LR]u/XKV3nE#UY6%jZ)TebQ1jqIjSm'Urf*)Jed'B5 %]$I*^*1V/YKt"e4kNS\-@W,6$.li\J#Y^po';/9G&T\s0TSqiicIQ\FA6krs##+cre7Ad-5W<1\r)0=sGA"XS_[6pU@Kf"kU;(qD %k`G@42`k"`C*+"V@Mg=8jYM/+]LQK3TrUqZ]?X-!BKk %k`ZKt3e/$O%M)FP9=9RdPO%g'ddtmB4SDbp7W_g!.S-)1'Nj)6UHB/(.lKYmoZo4W,"1eKCm-(ui0e,R^#A,dTIn0DN7b]Z^I8j'!ge(L?W7ijjpc^aoNWtgV;;DHdS^X&VhW6ZEB1s!`0lD`:rKIs %E,Se)V=u1P-,dgt5A3JL=ZVY.?JB!uH,a@$dn.]n+Egi;/`B$OCnJS`@+kXOnfsp5#kgdHhU*!eELr\,*i\1,.c0UNpdEoNZ`n?81!P %j^,lFQG!d77Ri*02;7r5)>%(*eP*HqQG#:+PsMuH`%aVTYsp"t:e2&L*Q++6VIKf_0)?H#U44di\-\#t"_7nOYi9+n!2%^/EMk5k %17OSSDc9f5MVtcTkQ"K+JJ'2qlOp6A.^dtLH_i@YojC.Cin1QeP&RlKS5&oq@em]G4Ar:@+ihFoXa0ht(8cqD-)-1k&V[a^7?R(S %m3m7\#VgJGb%5r:2d*Rl7<.1u_#R>B0Q!tbZ:,6>ES9$uLuo\`))N:4FdNXF\!Bj3Kp3R:)-$:89[e]d5Bh&P+fZm6Gbg$tKWJf` %Gu<+?W;:Wo)8ASuZJP*YOumb;m/m#o6pX6&%0O0r(u/THgk7sLSW#X3n_E0U!HhelQR_++pA(.kc_Whp72g!O"V=`@/W!,mn-r0"a]2;;e";XW)VJ.TmX2*i+o %.b[hFr!4Gr:,Z*/oc+C(nkfJ)>f7ue:tD:cr*+g1=G*.")-e`gb#UEU!>Ztm'R1#O&`Mt5Rb`_c"2167'8=$3Ju$I#5V16j@*'6cb7dbI_F+&F>mh-3$[VX])\%Y:'jD=*-Bq2=//kIXOI4MH16c+B#Y^A.>=2nr[p?bV\DpK0o_e]iUCm5LZoIJEcc %0CSAuhRr[XrEk'PjpS`o=#^0F](:DU^R%+W#R`jAJ1DLm%=*T>9@dUkknsb6h6_+d<#c!f<4.L+h"4"!r[mLLO"!N+b;^-$->YN(N#Q:0?O5N9_co:0W@R7\"KH@@qZ"Y/>ph.1#1\42r0a990'M %o0S\*/[":ANuH/5?A;];?!>V$:AFG=@2$f:0SpaoiRS(Ue+ZNHk?OIXd!:gLJ/1qSAZ(hI7YV-5N=J %-J8U'#C5;q$TM&-&hCKD;Mp.+adk*QUS!GZ@GeGNkD3$&?nUcA#/u.kXq7'K2*@A>r#qUg>uikCXoe"h[HJ`#,8M:o=hjB.\8dfq %f36.j;`SC^C9i&chdsV`o:i2GV>L[oWQ#LRC.KD7C(f^0,`>%+L_d-*@LJG:X+g>5M:(:Te4La>(AIZQ0f;&Ohn#MsD*j=sLGU6f2Db4lDlCE@QQFa<3%e5i3tFre*6d\VC!NoNlEmPYH;GZ2r2G$#XQc %DkEYaJ_#QCWe#,/+MHt+."uZ]DAl4g%,.]LDD73OoR`H502r"!Aj/^Q_E3RF+W[dNP4W9sHdlR7-sABDA`,8M_$$[D#FHYDSg7H7 %V'3L:4Qj0_qF"i_fPO8&_[`i"Y;KF#>D&Fa!h`&c;$@d,FSDON;%)kPd#^mInQZY,&,87:$"O,,hFIjNWQRstGk!*XN,Nrs&'('1 %7'f&E1sLbQEeDDQZ,&;<2r]M:\Z&(WRI)Qp%QjTe=lj[Bi;#kmQP*F5d6thd%Nr27?$7-KhIIi`Xgo9G$Dak]!l4od %k+JVGM8Bg_d0(^SWIB`7j4_O.kDC&h4FTn64KGm\#+BLr)pC*+9mBe&TR@lAA)2L?Y1`*Sb\JU=kDjc0ie0=R*2GYSHEKqWk%Z;V %"MI)6O1GdZ/4K[\HnEaV'a%C&!j$t?HIg"`o3:KW*gVX.4K"V$h4[&JTPqM)(>28_i>]f:`aG<\RO`>Yj!e%oM]R`XVG&seA^JYO %mM(t&7*>s9iir>$aa[u9TaWk>FfGJ27#.qH.:*c>CV%<6SmMkT.F/U@&$qXrg!AYLM%`WPcd5gA,'KL8)4?to;-u(+NtEtsJb*%S %bPjq"qK$Z@@q[k>]'Kn6YJ7e6[@\rTrNd2_-3iWZ8&R/35^e&MQ1l^eC?O]LfsX5$[MC'3Gd(3>S]^6A^j5UCI!LiR.(lfhi)GNR_ND?IjIh@?bCYP% %c\p\8&^"'6n'q[X_M`@T2m8s;SNouK%+(EV":6K`^_]k+"n\uW(m8$r#faaZre*t>\8:"YOL[JCja+$RdE`HFSNJ*;oP:83\CASY %%)YG;a>ril1*n<*YL<.NT=@6#d,8[u"$Cc%BTtK)PBD,,lq!Lq'dY!b+^$T&i\1bego?X]f5^TNaQ[Dk'1`4#i0YaG85YRnljRXK %:=WZ/J+=C1G,k=dO`bc,o>TuJZM;m`.2.N)JY$1cKUSDW:qI:EViTGA_EHk;>'&[&Q2Cn7J< %Ue'Jn!RCMGlpi-VN67C^_Xpm"g-@ZL3qI/&\IZVV`rgOa/OC0L.BYXbSM0Y:2r1U0r)a&D4.+a5(KL_j;`INGZZ$N@P8U$Z3ZQZ5 %L77%0)'m`?>Na9b5#f-LVa835oH%!,9#`%!r;-@7q,u8U=jBpI>k$a+>aVA=,]iXdPBYu]WN8-KUrM$P\9W)LL])qJi5urGr?L4? %ic=Q7fSc%CaD#[J8b^*tYa[!t:Sh?o3p[k1cUd1,DtbH!W$'Qs_j?b:GB*@f3_$K,J@-&dPZ&:?3;&nXp]9(^r9B!Z0?o[pWkX+r*=aE?Nm^ %eQ3#-'T;aeiU1g6KjtE<6l\4t*%snLE>48PPf)u.)U0Em_E=JY54XEiU_j)DQZKXB<+PQcpH:lcB %q21`hM[JO"o+?I=a+VM,5B_+\^ZO@NQg,W:(1MHZ7S,Nl%_HRfefdK*`,jru\SeuqgL:m#;8K$eKu,2$&a^]-%I$@'JKFcp%KG[E %:_hr[[ZFTD*Gi_^gj33j^7Zc>Quc,>Zd#nPoiZ9`pL0hE%X)S\]"uK7ko@M?%D2G&KF_Sp)_%SW58dAN(6PO;'4K&Pi^58KR&H*D %@eQ=:'YMoRihg;DqB@-',tVCIqg&iSJMr+]CaDhCm)RmhLCPiU %^)L6*6AQ05qM7ZCAtS?]I7k(n1el0%ZJC4t4FI@mn5@V4.u6%r;*g0hE^Q/lMNSA1ls:MT-88^_*ObOMpHbZC\MJ3S9?8pOq]Ka> %k2PI8G'5ueIYXIW3Wrm0m-GgKl)2RkIbF0*5L"r!#IF&DLj:o=,,&OBd*_#LqO$r\kPH5Q$6\BGM19Id;<\\VT"(370At9k_QPkEiCS-G!J6(q0 %55$12e\YUO#eo5N>%1qY\e(&-l))@&+L&9Aq?D:2g/6e%gWh*UKLsst;d%\7m'@XbB?m%W7HKXlV;2`f7%X+l4Pank1Yi4pZPKXF %a2l/+"+W5hD_snH]eKkd](s'OA^\QY]^r$M2?1gfajC14X#Ild96Ygf$^e7ScP)6=rGEg8$?cp;W`e^eTC8" %'be?F*%"VH"44J70=`-j?Pjn7,RgB>YlqltAP'cNU9YC7-`EZWU(`gVr4<@n!1^Ts0m_qqURf/ggfJZ&C>$`\c'SVM+.n'1# %PLXAtLa)7t2YFu2?Usa\i9;!(&m2i#!K*AYVi+NFEL@,c/OU*RlGe(ak=]9-6(I(DeH$Qn7B,\I"SO?SL"*L#_=o4q8TOL3cX(=b %c;Y@mi18-?#QjdONGEg966(gaUfK_Snm7h'f!9I?K36o'[c`"#I@()]-]m7@k49F\&0%Zn2\r4ui%o!@Q4VU?dfFt>HT_H`Ai"h\ %@TauXgJ,b.Nl>:j,5BfM\3nJ'mLJq4D9G/V4>%54MAO`EG@nYcV()s,*li]9:npo7?`(hj\7HT&5!do(S %_M)JdD9qr!_](%Z/fm#A7ld-3A""*]T=0%nE2XNPdf-)T6,'EoHK654Y%Ou:FtkbM`jR1&DKh,R:$@>eU(fb;D-EA;Vaaq!l*V`s %WZ1Kt`OthZp,^627fM[05_f"Y41]]g%pt+mJJJ1gYSVK7$)r#Z^7C?_]Y#,Z%a[IGqj9nd(Gg=*,I!@\X8$[Z"G5eAl`.VoI#@'> %YY0b'R5c2J8S%7"2C4E$g:;4@_plf4.ldSchNDq@boQ30c*3A+JuXDC.C:3^:QLB$J-/_?d>L>A#2i%.gX-]eCs/Ca=(OlS,jA@?k$F%^]`k92!)m:N-+:gV[[8%VZ:fN>qE/dMdlHX)'p?.]Q'QpL(isT3`6:5Tp^VY %!8_j,(^71jkeN1XAMp+4,Zo(EJXh<@)+J\NP"[#S+agfW2',uOpa[F-J!0$_phn*`6'sg3*6O^::*-R,:3PtQW6X6lm%G[89j\qq %5]m7@+H.djbD_*^eq>P##RYiT`mPl.UEb7_Mh_0NmS07?=M),f %^,78;r5El"'%o^s0S/orA[46$6KYdK9+u51"Jh>'>]t[,?Ed$ug.O(-9>un+@_mp%W4?%5"@EJ>4,g6 %'I*)[S!@PKE.H0h*mBet!Gqcm/%,[;7MnX$BHb^fj*NG2 %gKqEGS`)33[h>$_b+O\#4LO=+I;+]^>>9Wf"rt*Ueq5OUo1,h$"Vq]P[ff'I\%ZUdhXV0_R[n_1o(?_de,)]obfSu/l_Y&b0Gdh= %>5dK72:X(/6_Fj+F&9!kq_^m'PZ;4mkYAj<[ii.R1*V0Yf*b0f)lFj/VsPBJH*t^TB\Ss(>m]iTcds-"_0=JLhXI)tkm4!YX/08N %3S/HPL$7oN,3&_k%1K[8jS%kL)4$<`JpM-Pg<>^=FHdCI5GdUpgIcu/+\!5G0YsV33oLe_2Jh`JNn;i&(o&?#^?YciUL)/PQO5RF %g"Shi[;YXS!L;:1W)3=Yjs&`P`>&+R+rZ;VMa]pqVG]GI^Y)$'K;3I8,ZZ^b;25jrkP%YcWXLj*aolUTm>8\kXe:rgP% %-W>CLL]f#!!icc#Mg0HL/lAr0Q[:qsaT\Zn6UWJtO"A?,+I %+oIF*T9(G4Qr+jrFBG=>4@6#%KBoR@>b2&Ii=4-,]nfnWQQ8Pb]Tjh#\Y?)Nm]+1'q=W3Nt@X6j`@md[$#n<.m1qhPPl:sk(MRr?Y#%[gABA.q2a\gs#8lX41):i3E5!%blar!k&]Z'S:2 %(tkI?XU9[C:UNI8]E8>k7P%F;:0.?b?C&K7QK0LVKJ$U&7[gaGdA92t`8(qM,W;Yo8?<\k\K\?7b^A;G8s7Ds/+2s9q6F=o3-[E' %.--^o.C_+%208@UNT:N\iEMF2NCH@?YYe+YG^+gqY=<]*j5G80,6J.hE[!RY]6;b=3BTUbpsEoGQFpLk&/,Ell>T\2Oql*PQDPc> %ZN,-pZ4;2[-soI6nt^8]pdna^,I2K31k`+IgUe2U)0'smg,.L!B5IL<>44qK?T0pGL=]T&5*+%1Q$EJ"f?Ti+;k0+I-WYAGZ\5W,@O#Qd+BFX(OZY#i?VVXPGmMX.jLRi %o4]T58j*kK9[C$Z1h@L33WON+15/'R9%cj[%^J.7RA)%N+tGsT8t7F@a6?SgW^K`=$_.ki;R<`mf-Cl^eHOZ)G,88>K1[?JBC-9" %'C;Xa5A34\]*EHP>0lP=A9XPiqm+^)=H\&7VA/ERm0M!6TY72t)B=;&g]3 %C4sl7l7;6maQA-21Nt1n(sTED?]2F%&S#TWHh@B3rS6WdYZ_)qh`heljGpBa_c[f#-R2DZGD.5B)BBb;87G2eS^ie'!g5A$DQkj3 %O[fS=XmiX*q;%&W-1BH&IRYV=,VI5*,RrSh[';VU9lmc]7[4R0O'XE'1?,ag;i&6$;Ks=a9NKZ>pG0(J)[N,L8"]iOI0A7<2HL^I %QN92cMO4En"](58cME9G@FKEN?f3n]GP0I98>UU)H;M`,Cn$#p';d&BT2Tfnjo2It[tK7[qmBRUHlB7L.2oOuZ^\;Z!31At>rpnn)M5=8;-`#A9oP:`1O7hS(&iB9;)=WjgYG%p),!'M5.>8ZtJ) %3W"SIB+Ba^f@DE.d"c=hcq<@*XKJ/K\@H$u&um0iTZ_4-G7*&MH37d('_@<8?!PU5Nc!1r`^ZB1d0@FmWkUbuZAcD^%EgIgA6-M& %X]m2]:WffS6[>A]Af"Crm8di7jF&Y:U85ogrp;e@`Op:Xf4,I3bMojHp\)u:f`su9fXjE8.r$.hW5Xno<7j:p4R,A_0SOa]rqqbP %3l8Bf)l$AK[-X1uef"]thhjG']`AD_NXVQm@p+HJ:+"qbMp=j="+&2`?6f_j*4`C1C)6"U$m@MXD@M9W0mG#a2R3/LThVJYdBJss %Q1dLWFFjMS_>^8>],"322Q;<[eEk9^dRIY#gBaK/ObMJ0Jh!JL"VAR+d+"7fT-r)50UfCX.=lEM\=,;27*=YlGRa3H+3M[k[J$GI %774>h&_T+@Qo`''qt098<)37pa[6m>XC8RtWd@dRWJ`(`@0r#WJKr>Ai7U.>3EL_H)\Jic+!JIJDUfY5o1#f8T^u#2m4>6qqdNXX %r>HBj%7I"dCAj6RW_#u/VEHC\\*P[ljq/8dH*;9/g:ee69(e$t)P_K]fmj-lX>#D[0U_q!fqL5%jB:38+Pdu@mU?oF+-W)N]Go?+ %88$ko`(,K`=)btM%&-Ke/-;][[Duf(n2@5B*FK1_A#NJ%Gr)/:QHiu-*0C?V5jb5Ek!L/X!ol=f)9O$(_R>Y1Od[V!YOE#jeuh@$ %a0CW\Ys^,d:Uji8LHo/^G/D`f@fo8=@02j.A2?339:k_uUKVYu657"Z'hgcp02".@6=JR^X..+N0JLW#@J9Qiib2&$pXY_]J[>/Q %?qkg"AFsV'\JIHDNT2DKBHSu;c`Q-;:F:FL6YBdR\I6s4A:j]t?)BUmBT/oOfYV_m_e@n%)doGXe*E3NS=,:h#ekI) %+P[tn'Vqir,VaQfHZp;\'L0sH0dAJbh.bDX#F?>dXkbk-`"Zh\1uTr0X:Y'*j?mh8,arKs%Z33Y5-_>@7.\;W*A\*ZLsJ5:QBE>- %D[S+%QlWHYYs"Pb2H)7gBZ,<4'FFg3FLE+g7lSquC"sF7C53+,/&p_lfod=H)QuH0%UuAgrmEHbXDccB_[pf1`fLQo5aiKsG_MdJ %^dRm6b,H%kK46TR]G?X#hW$M[NC6VA'pp.U'rJ^u(f:jJ-hOG!+d=>!K5>JAMl*>S9XF@d/ebA$FC.cu8/WO+d5M]8DmC?ZM9S\Y %"#neQ[OmNocGXl`87&9ZQUa,`&5O:_g"Z-[RXu72B#:VY+L0#$ZX0/Q?.Q**i4M*Mr4UVk=69LpKVH`U9nbABd:jP0%M08:9j*n6 %O6DZ8`mMJ/#LfDKT>8"Ll(!o,@24e\KeO]NTXYBmROa`1V$9T'WWut,G>m]?WF2.p$AD9l4,alK=-@D3=m;d'9$>EHeol#sYheZ` %%],pnc+ILfM47$e3kq#$kJO;HD[7dd!V7o_,^*pELV*c44k[<>mJ/Vi++rii,Yuu#jacYUlGXagL-Q-P %cf=j>'YSAZ]!2EaPT'unYAsMIBdqooD\1"ldYslnj'197`gXeB]\8"18*^ZL>/eA1,.K>[Omfr_1_PEe %"F;"57Z/CRFSXR6Rh]5*VLuj1l1bjAAZ'/".kB1ac^t6BML&GH5o5'kl`+9p@XV %0#=g8?!SBFH+&Lli"tM-?*n>7H+l!$"5;nrh([P,6tEh=&+`CN3-oo[Z\1==>GMb<]qh0'eI,s<:n=H;oAoU+Uo6qs#g);8fEUmN %XU]KX`4Y5sfUTk6AHT0c-3.Frl'UP!Zl*0@g,M3GlAmh'ZUK#I;=>\2pg[;GPe$\DEVB2/P=R&$"flbK`D-1gG&0ZOlSs.WK^:'N %6=l94lcs7uEI5LqW2sXYM'7$8E7ocj^BSs/G!PbU1rCR0!UX-.%2&/^@uoZ1:/kKh.@EP2&j*4<+hE7?$\R/j2;g>e,PhBm!J82o %0ROoOJ_)g91(E(g=EfVZlM(T@60"XE>T:<&B;9T2QkU0,,!p2@W'8!tSn0.`,`*!r-HciG5]cu]H!c2X`SL%bYL.e*le]s8@'J(*D59N;\7^Od5fI%Gn'=.cBFg^2G.@RN-hF'SI)i'8Rs\Q7B[[Ej=!?W]MOX!I1AU;5,c^fn^YKSB;.EndEk:8 %k]u%=SZ4r0FeC?8O];p\V?>gg=nIaI[uGSC2OJT+0_F:/%YRq5n#JBNCt4aHU'"+(:RKe+J6($+cWkQKoiaX'C+DUrY\ulj?J?OB %j-+hf>M$qmBbIUh]@,YN>P9s*&Wo!u![q+;h4:pN!u1+I"%(i[>A[m`a^)fi_bEjk\rT=US%(@N/Qu=dRn6#'fL+nZ&[Q7)D$9=-*ue]Yp1+G]$X2F#OeKj4Lnn^,R.,J>p;;5W8rUUE9jQU1&"cAJpm+@-/1U\8b-6Pak"%nLGuQVbfe %[$:Xs+GN=(%B1B8&mk^>U87mp!M\;n(^h8_4hIU?Gan?l&^Xnd+l?Q1V)fYi&'qKc82e5Ih;-^:00/@g'dn$q(X_d=qI""We#d]l %.^_)Ep"XM#F_,g?3jnOuqMnSd?acA`+\sNr*\]UcM>KhNrV=k6:1:d6OpX\HjKoet5H6U5YfU]ZN2@;/'=Kine<^otZcgsi&W!gF*hYZ2kKS$(PWm/n85c.h'M1naQuhCX7,!Wp"=rrUFs=LAIdOCGFhldTSA %U9/[2:bVIn+B0Y^Q9Z\5]1fWjD4e6k>D[<6mr=NC7cEL.C_L++\ek2r-4m!iZ(R@i2c/^>eh".(+4NVe)ZZ<&>KsK`_eKZPHSke< %(4;^h2?t6?Uc#bi0FirT2'ZA'.mB=?cUe[N^Mu7A`!g%pb5";BnKXfEF]Z?n9R&4"&$p^@?R-,)$@Bq9YDWrHq %:Q^e]2OmOKP%8p@e9obCgXX/5@3"rgjs/#4aqRsn+-ItlKfhiB_Z'A$?++>5`i9;NHGViVNalV;N&,a7pX8#9d;>7#gVFfRPZ]>M %%q&[T%4'(nWVXFMR(Qq82E#f6 %[?BQ:\]Olqffgu4]V&Q1r)Yr=l4"W`]+^jr& %#K1Xi+Z:[\KKODaHAYCT?mjNoXD5.F6ooRJgI`,e)e)-O*[N*'Npmh;$R9N_4]J(3qgA$"3RMS.E%gKoZibRTOm,"I)ti[Wnp2G, %/X&LBb6C.rVhtn#'>:-'].nO8c$h4EN!ol&6&rtDs^YaH%.i>A %/+,'cmYILF#Wr$`=I2K.m['S,>^(3rYd_qI@&!BbR4.[rc7?>O@@mbS)4XEcER9'LAC&"GOF,-S#H;hR=HpnlXc.HZ/h#V3!iVkU %:M,pWh,,Gnj!pM_joib/b=N>/At!aPt&i_L+FJQV+aCmKb9"Q71o*(.mS&@%p2rI>U2U?5urHq&3?r.^&ZU %2^:>]G58Mqg8]cPp$ai'fbc5,4K%NsFtn7T#7+PYUYls8Kh64UJ4?Mg%3EYW258Sr-Q:[MAW2^Z[[PnD)V!\k4g4oZ72T0AdEDq$ %X^LXXeH&9SkO3,mP=Fo&#F@/*8%gSaK)Xe.ggL\b_J>7"TIT+pV!JR=_5jtS[`oCc$3Bel+elT=![hRdpU]UO<$AU@YR.Y2D.PiH %:,er`.j3.]m)Nst=)F![RIqr[)3rtiU:<&@`#`2ZV&s#GE\KntaXFP<\=+#A@sYH[e%mTjNPkiep6?KuZ_02im+<.0]3=X%%tYeL %ahN[m,gVq$H(l,Af>OUup1,=L/!iO*9kr`l4a2Kd,MCgo-;#f2'fd:`]P%P9iA'NVnC"TlJLPNjgWg/:o-e?j5A$Ca-*j[JgpG6goI%)/r0c`iGPsK`YHKl&`atgH9 %A>$i4CH3[_31]28g:58Z1. %:l0/=l,"Q./`5W*69>3gJEU,q$oaJo$k'q^.)^6^&`A%/FQH(W%j;EKMfH_+Fm;El!X8=Nq%AK*bi=sf:l63*_')'sk\4Y@UJBM0 %Jtca^^H@,O9P)DrF5`R(3_"i@9jS+4h?Nmc,opHNl2g)2K0rB(I7J4p&M5<[Lob'G#Mc';3OA8,/Z.N5(,ZK>U'n7a/!K-%2d:l$ %D$csWHY7U3hLPrZ$1+1Z_6<&FfUi#Nj$n=,^%aR:%O %fn(Nj?ilppV:H6nNYV*#!AQlefTug]6cQ# %oI3H!N."nRH+4Y:R$6?^g\8eE`]Q@:"@YU75X,Bh(n](O(s5=0l151,40OZ^3^M,6Ip>@j7$bW07^XA1O0J.b$1T:IFTh2i8f/^@ %U?ndO4'`'[2.0pM4P3Xc7!D&@/'jeQmcm%YlrJ8e1:#j+kM8F[+*tGF+4($75NPZF%C:q@K$]3I>IF['DN;Icm290\@Et4%=&U %cI]V26!2e/rp*<+.u-K20r'dY'OIFo$.:*,BN.pkm/F5aIjl`Q.i9/O]"ClsU['KlGQh8)+:&o/\AB3kELqe!3(D6*9[aBbik_O\ %G1iQs2u((c0t2cr;Arl$)%Op6dr#n[PS"=#R#Ig/e*^a8BKS9Ldl?Qk"^MU:5N"U>8Ct3ln\QFY0K%0/M&(Lui^T:FE4%#am\`*G %?&;nKURSMu!rIp2[m0OQGPM>oI6T\*!HtXX*)86m=RPdh'0P5fGj12,*(`D\r6*8iJ$4mb4jN`.E5U/:-A)f6W.FOa$_=sFKW:P? %)hSVk85<"(lkGmf9Z%PG40FE%=?c3HL;_,q#KU/K_`O]$d!:(I`^$OUKeWUKjdEPKM]S6AUcp>CkH%rEGV!P(h]GC%Z5e %>hnR$Y_gRhhHL3H %KbBo_\lKRjd)l6V&F@?$(T4=*)\s; %&:gllUdZumKd:34,%DKk8e)ONSP?lGp;tC2Ji=OeMb&p>62QF&9&AT`C%rW3nNHaNFgr6&!r?$`a90'7#A"#/WR.VVaEOW"'sCW %KFGUcG'BFmr-QCIZC,(bnm^Ya[5iTR<:o$Z63QTd@O(A1p%"T^263g4WpE;B9t30gX%X9:P=7FSXE&/qm&'(#)?#Z"Wo?2S=jPnF_UKrQ %ZO4M17+t[3WrjnYWZKqsf6Hh*ZXY`O%c=976A5\H9Ht54!\Tf,V9u8&k<$PbmFU"!7(?"uEl^,75@CliJ;k06Mo])[$p0@;aYPd3T6dQ;3CXPRg=N!:U]Vj;6oppuEY(.D.[HNuY#J %F?J)K1[h4%o)Y"=5c83[I&Ob`Jn-No)!8Bl8_@_=$CqTn1q6SfI7hm=UjbSp:XLuncaN0P(=^qn\53k"XhgT*/(_2p-C_>i-BcTA.HKXhD]?)JSouV %i5Q_NY4s^Y0%.>][c87`XcSiDM3=1D-"E^=b&]SC.99J5?J52nD2#.In[Lu(4N0B9Q@bST>/XAp!Cdk+.Ko_1jUP\jc;+Q9"#7"r %\gEMK?OVB`G*c4_TTR]m5,lQB^?P:6Uu_$Zo>mQN2:cAiMJplOrN#XZOhJMQio6Y[l1F6TOZh@&e,*XN`9tnPK]WFT.33`>0Mbd4 %C:\CQOsO`Z6&_D$U%_;=lXa!?d=]-EGt,u8jPX7rf!fHaR`U!,SX72M$JWi8F>k"FB>_4D.>'C+^DcPc\6Wu^O.'?c`le,X&-lMY %SeU4$@L8,^SK&nZT"kGYC,K,RDUG]*2@?_"'P/q:>W1Hq('^G\Y_35h"aa:a/O\HBnQhLu:7(1ImPZMS7Ceo;b63>]1:Jc0*2h?r %4riC-)b!5$p:7b6hi7!B6.T6d^.pWQ2:h+@q@C_63X%e[eYqiFIjE:CLl'k(L?]o7gq_] %IV<<+H&jrLC_c!ulR%Ym"kPQWp?-"pSFrc<:A!d"HYK_%Y\o(af,JH)@lslRKP[W[;'curD-Un&"b2:hpT\5+)=bccMpS?bfS5S\ %2"I_SBp$%n;udp&iYnnU;^1%VaR##7Hb$ZAC:ZlnSg5dLjheabc3u%0#Qj@[gj#;^hi77_"(ajW$1rnm@eY,+e`OYBLsbN!ZUDOV %jS%8uF6hj5hsErb3I:"6h^H)mKKKeGEH>Sb9UV-sMro-6<#H-@Unb@<'?GStR,QA7ISuPfoCRK2jl!CQRSPPh_"+c5o8b3QC`.@*R`I`9Lm_UI<;LZGYu3J`UkKDt%\g=I&]K %SKreR#YC'IL/6LG4="0lr12'3U^34!=-g^6Nd[oL2F*sG5ns[OiM>ZG7%KE-9DJ%SQ"/S3.mog]m,h94.D'R%OHi:kVMJ1r)kbTq %LhF8:SNa6e/&aB^R*qT9-&UG?ZDrUn@+j08Oq^$HjsR+Zgd3YSqgQ[8[pEY6oOP6a#9DnLR$Kq7c`"eqR4?/IX)<1'=*cEq&C`TVJ9R1#MJc$+koB\#l43`N&gBZn#*IbV!=I&OPC%3i\-rqi-lLEqZ5Q-GVE5!Xm\0/1D1#Nd[0a4J.Otk4`?&GgH9"MCUJ_LuI\%S/V`A^5 %A]hhVV&e7Z%$@*b"1n#-pRC5jfU`4!p5Fc=E?,71p!0QE\@tU+X@hs6HDjG(QDQ[32qI?@O`=]\`-g]bdql11bFXrRYlSrQ\;XWdYLrjj`,>r>JJ5foO^;fD'9W:_Y=.]B&cs'H0F\8b(@]ef*lU_j#X_]r*ej69] %0sk-mRfT,Fo0W05kLq,1V/t$%X-XBD7nAmfR2(6S!`f6_?C@pg<5uGK#H6bJ,1Ti=-(WF'aq_B&D0q161d#8b@'N>3@]#hbe$bte %Se4C"^VT)kJc3],JZp9iP%NUl6d;b"8e/'E7F]G:.0G<;2:s1KKXO>S?^uMSg5=CU;k7b$FgbU.0H)Mr]ar\udtlZQH4+Q!'G%a> %$8Y!A#CE.)2R_6Wcjj6P_csjr5s;khM+['4R[JI[FnpG=pc.4djih#9hYT[t"Z1EF:Q.SRc.Q*S/IC-tDc;q3IBiX0t_J,R9KUodJ67eM>U"FNZ!T %2WRUL,,6:_4&O'm4Io7+AL:E>9SA<2kPgc>$81B8^U'm$lBk0iTUHS'6&EDkR+@g*X2O[.VrMM,M2B](7$OG*mY,%^TgjuF8NUBt %>]^X'3/j)m*=Y3N@<3-<\*<>DdN6'810F$ZCr+L\p'HEdYt=.5d)Q!5H$e:O9:"p(lj<)AoH++0i>u!JB1fq[[XZqC6\Z#l,RcsU %1eEN.c3P6t+mA=,A$(QPFa@\+$J)%.(nbM9S_R4J=deS#,1bE#6VFS.&"u'iCK)<]TIFuC(knfJ+ndFOU-S*9"1SgB4BV93m7mL: %$blFf+?7OA.8-uA!'T?./KNR6R4bnTlWsI*[7=q]*a=Ep.p]M)^Y:&;W6(Co<*oMdPBF<*H-h@5MuMRD"*pr[X6We7l2fW/aIr*- %,+!.68p[QWnaWJf6C3Sc!g_<]6C012Lh']Q3Xl8g9WGoE-+oeglobJVkIuWk.<=H^Bj)^G5)"(Aj5qhL`mFT7jXVTTn#DqSl\;P+ %j&Q[ea%uV8C_;RWjS?hAalgJ20.k_W<(Ik!p %fo&XE`c,D`E.M;9"Ll)LIP%PO-R%`gDLSXpZd2?jMqE;6=l(3FT!=bcF@TlQ;>oSP?+4]#k-c>\!q5(hgt(!qo87Dn4co-m$39L5 %/rp4=]49Mp<>>(CKOcr^#,B_rVtX2cToKff=-WLWr[q5>Z->j%\cGA]))!eqn7j8>5bpiik-9@($p@`e$H%_/Ks\&<4UKOl;O#\` %PZY+X/q1D=LdA53oSs]s+O"7o9-C3k_8r3?c0<"#3.QO>/KE0#648ik056r&YD.UgoeP(7Hg=M@GA*:F^s(Ulc#ec:nR[`Qql,4M %p"oAm5"cn,D0,`=\O?a2p$J4B#-J.JfD>AJ<9=3p._YO#*#j="II#lj0kJ.q7Nh$KmZHJu9s[*^i" %Xp4M(:Wj4leZf25NYB]uhhWJN>s)e!+,jC37Y]cr=RGA)Ds"JBT\>[='08o@0/6PqSK`5\DM3THet2O)cu;lB%l>#bifkreBPo'>atH/m3G'HXm8l.Fu8G`#DKNe %IKis%SfA6tN.QM:'MZZeqE59._*?a]3pR!J1leNW`Oh&.>$9qBBX)o!gPqAu6.;6P81]Ol\QQG_'qh/4BaQAZ %Tm+i$WT&=0Ga;MCG_.2_T^##8;gUU99+@3$gN;Q6P4Zp#'],g2`aR`ul>$BE/QI(&FP5WP69"%l,&CJ83K31X]E,8[3F;Se0"SL;,r@!'&b&^m-k*<)BRh+J#n:V#WeQUR8.?c9k)E:@pk*3e*$q%uD&S#0 %`n(:]K?>=;8V+LL>GgER@olb'HEm9bj^,ptL/hC;P0KYZQ#pdI0A"aWe/Y8t?\<@YK2nfd(^!nm:((qi3ndfp8-=\0fPcqM-&'o@ %&,Jdf+[4M1]m6(LA?N9c(R%Dsf@A3[P(L0n6_Y$N41&XgK'NpWE*ZYAC0cQs.-_Ks/W6n<0%s#l&U2#$YF/>W2CTEKcupl4m]fuE %%d#_aEcA[%O]R<,`&"M!465\9Muf0JC2B3!!LpQoLB<[Nq46?bA1I3&W,,)LZ-JFNmt"pOGT`@\d8La/Ijshs'`?<: %ZOTFt5ml1o5.K=76X"8YcS9erBjAWUF'%8a<"Aeo+oa9,:RPGPBf#YLbq#me"r%XJXfgEf02=\&c'C,'k,a$lI*7B')_;D`X:V-F6Ui.lQY!$_mEN%5dkYKmlo_&!!WOS?s7JUu?k%bbtcKA/_:X[cfB\*ia>V",V. %7!Q78kQM!R@#PHTm^P;!HC6)\Id&^^@I4*h9DM>P6(tYH>#bPM> %q"!FRX:X_fJL6M5ctkR_J7"muq=2Y+8\DLK4''DK9ng7(%(a>uP`'EeQc4,DPFH==`X^K1qn_oN4cNSPgl>Hq.oFY:,V^E76Fh@JfHq@S`2'6,*f=/fki"nI^+@-kh,rc$N$t5aLb$o`+gk?g:rM#9J:l5g>ER46Rn5;c*DfDm %nP#oqf8V)FhMb!TY7?B(VJu.K!Wa4e.a+d>EHpm#5EQXC)nO(TI]_l\4^.%!*&,$S(\a*$Q5uCYUh1N?;jf,HTE$?o^E)g\9uu_2 %'mdi2h7[_G0'6%4P %\Jqd[N,"W5UWpDenWN=cK,]%2_dIa.5XHDQMW&-Er'?-TK#:4ZUtq4$2s>)LZBTI&B%1DQ1uMfSGeRYTf%lq23BL,W7aaZKf=eWUrP-19Dp".@T*Dg_JQan*(7-:& %H-oV;^"/00p9gCRM9WlJqtAHOPXnQ-DO@r".^D"JMkTInC*G\FM0K9^35A)p/I^;Gp(99>>Peq-72iap1I1[sA_\S0?Tg]J#?cV;,+\n$k\BVY^"acp/k-)VN*0mX99Gp>$LB %\(.mh']S@].U,"1EXW%0rp#PQ=r>sRRWbJGS@(DI8Z:V_1'_j@=q4SI%F)oecrDf;NO04ahB+TCGb6ghti\$bfEpXA+M4S@rZnV`)@VIqT(3Rde!oSF.h-"<2oX-u;[t=V*umOd %oXhDa7T0n>$)WBIh`>I3o*hJEOboi&>;)C&F3i#1F31=10p"D%g?$2'S`-g@-lA^ %E_'JMdEa:A3:+$&!&Y-I@3p&9-e.@`],[0]/J(UDD7QFlQCeji4\^Adeo%>=hJZ+RN:HE]F%CcgU^gW$B8KZa>97r0/U$CHZl.N> %>8NNn1"9@Nq!EH55]uu8J#1:86m.fB2YLc*1eV,ThDL\cPfooCP#/Dk%]\CF0UQXo's,bIL#O"kqDbPEG;OXh2\$t5fi0RSbp^+H/WurnQ*S-;eT>E# %l(Xm%Ec__30kcb#8u`q,V@eKNH)mI5&^\;O3",bkXUS6!(k8!+rJ#(6^Pp73=!T4;SfX>/.3^?>/]bS'ZfWZ`5EF&*P'8CB'!&l? %#c2pf"p*Ms,shQ7![C"&NiDsNXUhFua&W4Y]ZF#`!AAo5!C7C&aQ[p_2+K"]L-lZIrGLa;&?j:9i%V$42\ZXc:;_,G;=lO,^h'12 %&"9[FF7,C;nY<$]PlRaPad/+Jm\j##CtnE8\Q_B*_US!+ELKf7Y^>HEhq7\5A&nJWXE7*Ta5ZeuTql=9du-;[I5YuUk`)6_WXeP9 %2r=_R_&SCk\S7QUF$-Kml.+*#"*D[6U.uZUNBUjY83\*EHMNeA0hE:a5GlH$/HBVe9(&?&\E2h)`k$NO82K,c\(H4=+HVi %rsF6moOmbkKC"G'-ZC:PV&C!l-9&>Z,s\\$)C,QWnU6M4;"TT=T0+]iSN\u60VBU_qGN6qTX%ej@2"aiVd]BMeU2/D@2[i2RRbrG %X<@^K%4dRKZ>Se;Wiq`>q0jAh%lpDM`,]GV%qRH$fP2UoK;VN?eF&ArQ;W%nhL+rX^^T5KDVb,;#F^^*cU=2jUg&I3K%fF.F-f5" %nd(5+(,r-_K`e:UF\.6od%R\Pf1Z&fI_()[o$1,9MmkcHX,F^(>J2?YUF("MNk%VJ_JhHaJN8/WqQ7I/OgPeSNMg4@U:]517+(pD %Kn:<=/F*QdO-o-4ABH*L)^5%`GlYQ?$sT"4'*W#9/knl%Z?@S\&.,uqi,_##%C%bJLftW;EgoFiTjf_QYmA_B2E$+MCZlr%B`kIY %m7#7rML[M:6iAjL)a0l)1t-4b+&$N/p,\QA/VXm'0_16q"DA-cuOb[UZH&^Rkc,*q+3UD9]_A %iaC([p"U=+Y@ZulQn^*mWG]B"nVrS=rAX\#A./fh:hpG5PiDT/s+iTh6WMYLJU/Q'^C/SM%3c-&MG4du2^fWJ*J(;d[q.3qnuKe& %55tIT\)(@sBK7NtW]9k+/%LOdH#5_gN6tjOGPl7NY#CMM6%@I[7`0!*o6pqU2,H-+j1<'$.5mE&!Ut;:e[r88`VfUQM!sjlQp/Qr %6:tF"K.+O;6Ieu<_QVeoonojKnn@`$gdP64P1b'O&u[GM76e%hD0msF5DFKm9k!5YUM %D`T6)AZ)1i\"n2T.@N'u$SYj0'RY52^LqFT^m*d`b7CG>](0aiC7E4n:hUago>fiLNCXGm(^.mZn)E^=FD'_/`"k[QcVRN)DUWf9 %]sjS".48n+/%;MEp?^WYhDKCAVBoc';fqtPl;$J.%k4k^VUWA,!+=]&G8$=u6*e1>kW/KW<]Y0t@;rV__dGC!9UX(-gru5n7@p%B %QA%U-qWZ&7`Ehijdk:Ikoq-$aMQ;@6VO$L'&?#!WlLhQXnIN[FI*aE@i,F@L)s&`5kj*t.A:sr[`tB,^^j@$dJ3Wb#?Y>kNe8+GF8Lse!"`>VB[d. %o-Sc,*qE$(&d"mciZJ*PO=$ZYn=()Z[Se;e+N5-2C2iXNbNB_#'M*.JnXsV&k1U:Q-$R %nJsg,N$WdoD6;\MaT\q%X\3SH9_.*na1s0m%5E-I2H!i#P.mX_KbW$H9Qi5b]Sr%k`k6HO;Ic(KK@>'*aB&HL3jD[6`XIkA0o0`> %MOmUp)Ff`YY_YF[S"5MS)O8!i/t:I:bSDY9JZPds4B!G?$qemOEV-!Q;HLT.Q-=t?4Cuj8O22A,mLI.U^9?"Lchd5I:9IJe0]jpq %Z>7gFc!]^/qeZUAl=N%)6RYdcDF_p.Vh4gSp(%E&DoAOB6"=(rf7(u=dhj>@_5M#NCM;tK9P6fs\D\Mmmi0ZQfge"TDa/-SMRN/m]Da#AdS'F$EiU[c:!/urHed)_AI(3 %@&uP0-;)S-dsX=qfn+GQ]6C9/VVcr(%-M.I?ZCkYf:Wn=X^kJakD9(b2bTe'[dU#*Gr(3`AF-Is0Qs=dU,0%nXlGUp[/ofd,FWFS %TqX<_/J0If!4R)d\1C5YbVM#8<#!1Ld1]5k,NafnY4\16!'Sg3W.3mJ)D.Qdl`[WL19aJNb-8*noqW>I@^])=fFf11"Vfq,;+bF. %VE3NeIlI&O#WWR/1"!X*blC2RSb:P7DX75E%B`;UYbZ9f<1g,Wmbo_+I_hSLjKhC_$b%(r+IMbuL;VoV6AtP`6/O"-"tJr;k+"42 %$i@Lm$Ge[LU5a*l?tKa&/S#;2K/6GVfFaf(I6.75;'?mukZ/QSiej1M$;h&`eqfoGH1)#r$7LA,IATK7?EO+0fO60hH6<(cqJPcb %i.nbaVR3Lh>WB_?`*<=6)^@tpGMP[!%fK %4/R]+)i["VIEQZDnB9J]N(f0'L=+\2_`(+XXMR*-q6TEN3gn`oJ'28Zma%#EHbWdqI%:npG,Wn*:Ea@u#)I);Y!A&9*4bW^Z9LRm %W]J\?f[PZ&IZ#>h\(g`p\#YL(H(utIYI^K,au:;s:cQWAe,2DNp4'PpV=A$Us%9+s3[pYLU9H9"[MjCO4oRQ^pQl51eldWs9*g`V %L.jAgqsX"BDM5g7D4trZSpH/[=7!dXGNfJFeUQJsi);;X.hAG/Wb*abJJCETpFTGZ_8c=s3nALlIc9C9\o/QR8Z=5'Ft6/*bm%8g %i28Zh+8*$@lIjT*F"t#Z-_1V[bs@I44)9b7:UN-j5EK*3);Qmb)/2n94Lqpq04CDEIXu'ZA2ZGfh]Z.WSs(bhbh,r5QP/1+5019P %"]FRf9sr6RTSb%S\VQc\V[1T;639Icn8>>50'[Z8r\I%NZdkH!9Hrl8_G+@rLVQr5]?Htb>Y$sH3E*Y&sV4kq,:(!M(E/!:,QcF[-2^olN@TB4[\R+>\sP@^)FYMJglbg %+Pk=SZI>>Jh2lhd[l6G4e,X=l^*N-*I1lZSC]s`0_)f10J%0YXQn&`KViQ^ZRoF0'@;i;V`*CS;3duGqQB,AhiFuP7"-uZCT=-7/GR(g\n:M>*PCSB(RH;fF/C=1hc"UOUKL+?*^]F!lo:h!O %qipm`JUemhF58ngDk%K43Zp$>1kbr_D:[.?[%gqJeosG%""\R(2fG*K7\-/%fVb&&e<`.L!k\13dh@@-Y&qZ5&iEjP\Y>e*TZoh< %p?RHJH66[YrmNP>?2@b%Fh9['(X,IfQ30-8EKo"*7s^58:,hRLd@!u*qce01?=mh=glbpCZW!dBO8N*A.ILfLnsJ9hh2a/)b&qcN %MR7po;qh.Whh9O.b;Bp'icXl>fIl74rM*7dt8WHleaKZ,#9P2VjJ!LEk<^Bp&JNE %;Mo2_WnAlALk:ROpqIo+ek[(SgbYX,\R2]"i$+.4Q"K5?h:a;#IZ8ZAV5k?uWbIG!1(T,Dk(ID4>E^U,P,N*bJn/dEPbNO,ZqK`dJC:[.,h" %IkC&2OQ^'$#tdrsF`KGJM+.Q+#H;BS,dhB%MVkQWIUb9NkTqodSG?S7#&G0!0V1W@tA %^75uF9"tkMY^ZUg*SKK3n"5A[0ZP#[Y^?7+^HdMj/Y:3=J/`9,p@d4rXi37b"2+Tig[A<'[G_ACaPqha4$256Wo@M,G3QD^b\65c %2qC$8jm*+&>W&j=k'_aqJ):!"Ss?]*>"GW[Z"q#)<7l^*+o %1B!V0bHE_pcbKD$s5Qn)r.dN7a"Mr9Q[efI5CWOja1qT!J,2;\rUV]Bj6OR3rVE]\KQY?$I(&%%.5S_&W(AdgC:>cXS;Gsem5?ga %U"t[Zi8tAdGr+m/8AHh(#hR4kc(cumqq$aU]emTBZBW6"aR)<`+HASWZ,6Wg!0D[]pe)Y %68b%JUesA6^i0)+/XbV!%oIl6qmc9Y4U?-S:nE+TBtmAkc1l\%T)@8TX4Q7uW:.1D>;n5a5H)dV-i!CQ1W8>F`8]LOlQtVpRt(7/ %Hm44ASt>r]O-qk,eBF\&@]d2Fg#cW&3%iF`$kB:U:X_!*lLXqr#+sM:W;SM:)N*+`p3"IMjnKrL1M'Sp7VU)TOQPZdAN-%sAB*&' %h$,VWSh;kkbNa-N%]A\0poRm$MlI7kU!WrL1Rj]AIgH%@E"ccQ/J.[<+Unf1*Ylm2f0>bk'qnj?bZNeo'Q7!oln<`f)n&B;N.(L7.f)^\i'l>h<`! %4I;7Yr@C9hc"o<&E>JDT^b3#S0J:'ka@'!%^umTIRk7Dq(j"pS'b3/bkV$X-]JF#<&<*Sks^-bi!obZ!9!F[Og@\_(C.JBZt`]Tf4OGp-q'rKa/sfC@GoYe4R5$kBGLt[;e:.ngC(@Ii#J%fjq,VM0 %GGk&31k<VUaf:OX1'Y=u,>7Dn"3m6R[E<+s]^9:5?7t3E^2#$1`4kkR=/Rd^U>*gq+`;1+Sh$ra;kNQe %N@T1G4T-sZR9sink+H>B_(-Sfh3PJ;@)TpY=HMEWf.Q,03Ie37CPR7brG"-LE&rK8Dar#rqUjtD/JLbil9P1 %#Ok'Q)9467egg=3iauLq"2'XUIpMI8N>XstNV9thYOVg[2&##2V-,ZYqgI@\%sQB0Z:r_IcaCbgbOBch>d4^he;r!U\hCsI>K:Q4 %kkCqH_?\o5f9&]BE]j.U/r`T.]Z&/Qju%%JE=BW-hg!g.:"LfS9s#aPe%oXIK)[j^ZY"AcS1V*u.eF3E>1S\qSC-6^)?B%VRVpqshV!VI %6b0H3D6Kr)%^M?Wq.$b"df?/*pADs-Z2]$\G+kMQ([dbc7UkZ2p,5'EaG.%%Da0QcMLAJ"W&(RsN)O_#aO-Apa_cShYD[;WlRc.4 %c&Tg]]%M2iF0R%gj-PNoO(1BRro%1E:\?[LRTX`HpId:\,^!&_RqJk*""4PF!g%*X,SDDMiC:u!/I'!II)Ch$2b\Y3`(m-<@D7_fLpLU^$ %h>U[(pKnj>.RtPNN(PG4bKU8DbI7S0`q`gUQhMeuaAA<^SddB2[o5-Tj^-uSPG-D!E[/dfN>pO*a9F^[=9!8U?i&;NSiM1JY!K,9 %l?$]Fn_uC^TnQP#n(<-E!XTCs4T0iiV[%c5aE]Ep29J#g9C@t&*9Y?49bfHn71]A1<4qVOd607QPN5LF-*(nkC8)lQVhe"tcf75$ %gD^"uUV?Q]eo5Q/"nnZf%tln)7ue<.-bm&mS6bkE2uc4LG(ua(M5$Xj&Mi'q2ia?fiT6aa/Z^!F^K/(oa(]k;^4R+g]&Ta!ak^^`KUiT$oW'lV>.g>M"n.Ge.=h.)]t7Sn4*"=uVn[L)]7M>b2"<@qj)s!%-;XJ4kij %OZTVg$aVHY4"Kkp95^%G^=+Vla-s++`*O%n_:W79(ph0]F_PSCjgY:&D9BNAWbgD]a:Lh2/jFf1]_5d`LH@KPmI@`IF$M^j^N/H- %]-G&"'c&)+m1.BSVrBYtrY1_Na2?*arqhQ`e0LLU#aOeDmDgjA,SmDBNH_TD7$3r-eZt7)KBWAE+2H=\]J8l1Ce"6o7&@Il'ntb, %nJX[\p2Zi\T9q-,I?B)OSk>gYek6EJRfY2XZg\7O=i\iEUjMpA.Ij==epC)b+bBH"QR9?[AKsZic0W4*[H3QM,<'&/HO\psIVlfC %k%lKe2GJf`VJCF,HgPVh5bMWR!Q%oZ!ROb7j_oUSCe^o^<6a'RR8)GgMGb2bMEneZgc2'PL?nqhTMOg@W[$[JkQ(sf@8Mkp?P2tcHB=/U=f:qL9$fZQrMajEB+?`AO[>N %2``/NAL``*Go8'rmDeQu$FG5L<%]M?KrOM0$&7Q&9c;9#,h&caDId%iN.T!Y\M"HN?AI4hF77_p-U84orpK$:eOCX4C%DkH4f>^_Rf+*"?Le2'Dmu(k=ZqW?_d#2]< %a<##G;U*8"W-2(S`_7ZGC.qB2"e!hXTK4[MYC2-"f]bIqMH8?GQ0-#uN$dL(IrD\J]@8/37LEXnZ18o7'>*=jC%,5Vfjo$f"t[u? %,M+eVH#a?oCDb[ZBJ,2IGca`dQ6WDXJBM1@lcX)SQMjdk=QT3fq\XY[H87XqcFH/k#m&Zdk@&#L[ENcA)/J[sk+G(%`6>@p@)c*g %O6F\]HoKb/Z,J_hjq+!K6VAID(4XNF)Fu*NG_18;NaiNQH9?b`K?a=OnMK,sk!;GhX1N!9j:G:TO^6B8aPC2b&'@.2`qL,#Bs\IX=U#0matH"^0LX&m\()(k3asKK*EY-.*>"H7[_dc(d3B=17HC_!N_l,k.3NVW2aN]dX3Q8f8Zd\,7t*c %$1"&5fm@=Ag"QX,f&Gl+VJSBhWA7Zd@%WKugW!^o!QO1?\/5Tt%gO7iBH?lT_f1qC- %YX9>Ff3Xg>k.WZRI#5YA=0CuMaZTU.`9fCq"#Ml2]J?m$p(R3MLN,K)Dq!7&p1$Ue^h>Oe7[<#]KP+$Io#npI1JV:]MnE:R3lh:/ %55%<`_q[IN/35,96[Fn.1mq!"%htN(&#a$ %oOR/6&J^b>BG">ngYL;BDQARGctg7`9.TEFc?;.dD+t%X9EZkHd86:4jT'C)Y@7#:OEIX+G[&:6\EpJtk("$VK_dem@.SO:.8u%_ %[$T]nW0bb8Z;tE)K+aM's6.j=2#0uVgGZ$]3#$*A'0H[,RJalk2C%h04SI(?o-O%nLMe+c%dYun6=Jge;W*RMIOMdgMO5h %P@L(dr)P!&`WHDd5&`C7=*]]U4sQA#d0g^+&gYJq_D9%oi5"/oTY3a"NLGo\n8KfHcIrb&Q`mfVT^u[);&# %YYcH#e`6@MhPuXkqY:+NT+t/Bb38meT2gYVm,Y!=4^H_1bD_q %n's+nB(T':Xc'>:R6H;/`F$*SNK^RRfXaC^R-Wh,e2,DWp:]s292k>*gng&nqJktR3%#cmPf)bWE)JihC5;ELiN,/5X2bnKiO"%n %g#%4.#Ck^r>9(>[9O2Of[1nHGRZm'HJB-\8MHNbc=O3rC3?U'SuWK[`-Yfsd=Gn]TsE3%gbWATh7>Vkn`Dj6)K^r7*pJ,_u0V %+jtXlM@L6J1"LZ0bDn=41"n]YL;t_5(iLH?dpif5N-69fj'rdON44kQq([mo7f;H1^dB1%OE#Nd:)l&-a.11[IcQkh3G)QW)4E#H %.C(snq5i\R0/F6Sg+JZh45%LEpJQ-WF7YsRUkO6*+TCesZZbRZRPDe=cXlPakq(k-#;SmjULU@NF+BN\Gj %^:/U!nFQ#UfspN@>O`aU9G9$aCBtKdf;nZK+CjUF5he0Fd/nsP=mC^G$%:ZG3.^is!71=chHUt,.Y2??Vg_U\7IZB?X2o'f".@M/ %l-D,<[I;5"3+fl5kqK>6MNpKcXXsL4n:Xl?Z)Q//3]^(i\jeJ;bq:f7c&2N5g6 %e*\8QiV_jbB>0;)q_BK=*E]tM._(">nLH33mK;t#I65aRh+o"sKDR[p5X=S,,]#@H[f#UI$Bou.9*U&r5NQicb9tm9qK@,XbDS;C %!(bUnf=K8%)6Goo)p+A4_\")7n<8J/a!AX@c%A68jfNgM/-O52]W[=cKpb+@!YSE_H5RkiV#_pXYIWZV\9=#@g-er-^5a#m![Pej %qql&W-h(Smj+N#C@V^dP22,1sTC"t>i6iT?&d2#h9"`U3+Wg\QJYr$_OtP0F2DJ_$k5i+.L7cpp4a[6qX6eP`"j)PY-e+6U04Y_1 %dN-Og2tMeU#P.qmLi"fsWTu-Z;&kMSJ$G"^A84N9&p']Y1:U7]^&h.gW:9Q*?SX0tMXc@Ki_m%?K$`%35q63IW;sMh%=Zsi1*'mj %M7?]0S/hH'S2-$N=PO;ng^?ANWrpRY:F.3>q2"o> %p%MLWo>N/gIii!)UP=Ph#H^OnqsgL:Wr7btj+ %:6'nX>NM,E8Jo@GZV['g/SE-`ePt!e=%p:/]U'f:9%q:%tIT&cDtP
M>)%c*Au&A0ta<)-32d2(92K#sPn1=-=9i(jG';qO4'QEGl'Ia06nN=Iu)DHM`W<&b@5FueUc#AoJ%=gHRVV:Mp)__?5U23Rp;[W]I %!%(Jk'`nnk,=$rAc7C^e:4iaM4O=_T/o"g;mC%c^+QbsOd-j(X!:QGS61aG/_M %#KO@E[F]R?M5N5RR'4bS6aI\bep#pk8f#:?]!7Yn#nDRDG2&.=OW>Wg+mPS2of`Q7#n0Pa(lI(cC&k@q!9S+:)XP!_ag.FD!%%0' %X$/p`j/:Q+gpDIJK)H7cXA0%On(ZiAW0W0]X`B6@?"GrEe$`MPh2Pqs^sc%&i#/+KZW=G>Rt:"Y@?oE-h&REo^jH'><(Tf8[A*?q %ke#%h8kht#<[33@1)Q-JdQ5;SF1$k5n]M,;%W?GB9_"Pn\p7j&[(ei^&]@%*#.QUq>;tS1oINkrj,^) %E&ra/EWmdQ7J83VVSJ8G6*G_N6lOgMd];Pf^9kG\$V_T9@@"tOqsSSO%E,Mc1K(I/mhh9sn$jPumttkaR/%2dKr"SU,>+NM3E^5N %I;o/R&#aW%-S;XtQY#:M,bQ]NrmnkKnWuRB`0jqcgR))ThX$h@WseOrQ*\Vh'C#gN,4/LmGFH=A6f)XnM]ltKi[:9Hho9[E)&!)ljGQp&Or=-l%q]rl*ofa?X)K-l=F9NPag-u2iC)fAT^;KK7(;KOdSC&tR,d.o", %$jOf,DCM7[A+#IKWCecC!Sfa!n7n;=N:]Pd,9puSf5tb=#I>61!dC]M@$9t<27T8qKOYO?K3&7n\L0NAi&mFV^gR?DNqJ($Jl@k:,V2HE(mn#oa,H//=@*i^EeI<`X175,q1^D\kY^FDgOeL]<qh(DFE>DV0Cd]G@"o+;k+ %.k0r<'j;b"P7*R'@S<%<9&3/5:`-@,%sh)mh'pC98[(?:94,L""9)22U_p:.b::Xl`WMgdnlDZ5a`OB]B9`nT=#ehI %e6&NA*2u2].k(F3aS.LN''#;c3\]+rAJq)IpS[,5"(P3$,2!&8SYT`O:>V4Dj)Y!^6&mpH9phlO_:XMsMK:cr"gaG,AlTdW&Hs>> %Pj[Q&kUd]WXV*s/fd%YilmNnePdr2kZ?]-\=.>)WU+g%,rkVPqWTu7i/hNok_oVGr[)'.ah3:p@X"L$gg(o1GqLOL_m`0H[)g^Hh %S3jT[XZE7ESS/+jL5Re^Q$X!=pbWd-$obN"Z[tCG]hWT]VjKfqHHk^C8\=QRYV+IAa<,8')[6J8Ga.Sb@NaS:-]d]!&e"CJ*^t$sj_u9PGBe+;,&4-5VLStc_UL^/niooI::91s(E,qLW$NcT9iJ7e6B_QFMVV/1 %i!jJ8kd\JUCB4^Lp5GR:'O/\`:/[9f+^Q964Yr'=fu#-Ig9n!fI@q[W0e&2AnjH-rGRTd4_CQj)p0X3(g4p3'!W`j9n-NQV+L&R8h?.4^s+N-?WJcj;_mXhIq([lbTS*A1>Hc; %dY&i9!Ob8*U1VViAIn.9GP0o(#XYklIXqaVmm$\YnAQ_+^D-21-3BkuoEeE-D(6F0jb0*d*ss7ab]^<&pOp%=B:sTSc-,Or3]e*=(p@U)5o&35(q&k82G!+L),U7j[rWJ1Tsg<#=L %,0h.SL?S1R@2ljoC,<42?0KPW=po6!CFs]]:UZ7p0PM&QGbhJ;!;qnd`Z-*3-s0`,!shU-W"D>6aeMlU^gn`,Vb8_HYlh5sM.PY7 %`0[`Vb)]mL0-uB-#8e"$@]qED&\N\s\.p/Apo-\*+Fpf*B-`7*\ri9M)moi`hl>:AWPEElJGOICZfo4-87YGR:*NV>)J%63i'0!0 %?MV#9pJ5B$=f(;mLic*9Q.'3Ch&`3o=G[i:Bi6)r2&ug[PipChf;UP7TL;j6`9d"%1eMniH7'4$0c3b$=XRkr"tR6/S,.etII>rt %G%f9)6UD81GN47+n;PVY;0<@t\a>T5f2CW=TM#>SN1(H)@,r]\FJH.EI:lP:VO7R"/!#+Xc[bN%%V %R%=>#o*WXI,R1Q]!tFM=CdIb?N"=8^+V;6NLlA84o]AmRX'LJ7g8mmDHAi@&#LEHQn'!=k:Bj]qP %*,Pm)59eU_WGk\Yn$XMJCXSO7`A6)eA;?.7.<+ZU$"MEmVAnc8H%$2l_lNX-+e3TdFJG+jTWTT-Wm&s3Xs&#oisjVdc)KKo+6jSG %V\4l8N!U#*eqd;8$^l>8ufb>-BLY)8D`#ga+_-6F_da'2T,GFTt4Zj9`Icau7GDL=Il4?lEakAZL6*n@^%&EZl3gL.BCTm-@ %-tpH,*B%kC*"Zcem`A1Sg+aGo8TO=K$-hD`2M:R)VR:?XpXUVRK)a'O\D.r5*CVMo&Hj:$t_qt\]e("\D_m7pGVq#FE/dQY.;!>2On %c0UhipQP2[mBQ6Db7]pTkon5ajpDrM*q^IUIPY>4GTWe^\N!aH=0hgKKm1=IJR(q(-pNit%(HGM]&E=_)ut@Sj9\V"#\GWX`*&?? %f(SG4FAKdL!1Lhe0)Y%%TQ"Y5p<2&=SFo"uqMa62RWPA_>a-'t>cq!$QLX'A`F0itm767W_.X&NpS^of*2mCBg7a!2Ua,D!; %D)@TR"C(TKpkNmF?:?QS6XkT(pWB#s\W^*4\hs-k9\`_;)$NT8Qg50G5(OD378?.uIPc %M2TYW7C3ki92s8djiZEftulI%#Ye\maJZ"#c(31X=AflLUs*!O66'P>4HO^e)*f&\,1V=H,-G15-`%-#*G7o.E5XR"c0>ZL7eU %5m8rr2f"9hhR=mm&d!)I9pT&KAVo2EWG=@nRHtF(V#WAm:P/Ef"!ae %f8U1Uc$4*Z#?-%lKDpe.kKm=bp*_srk'\U,`>eEYN&Jdn:o!Mb'@P3.(9k^LdAp'Rc$u^mRp&$a8)-Iq`W6c#DgmPc_/O7/:^Zg2 %k\!Ul;$fdF27Y&lU+=n-@mI)f&*[&.ld\`)84_m[3@.-3Z5m7ra,KZ$;(^JU)jiOoImG3OZr!VIcGHGM9%QGY1!X?M^$l_tkY7nA %TdKpeWQCF@&EjRgkG2<&C04G*oVa0SJo/k)ShD=h %aCijiC*P*-[F"u#g>q0\s"Pk\7LH5C[8\,5MkVbV_'dnpmYZG2#4S3WTaD1fnhAAKQ--RHm?K* %qe'^]?!,E%Xk?r%+5)#gCb %HNg_XAMH!dVDf_%Lu"$j`msm!jZPjA)91gc5C#p-k:6_aG%;3Kn?/O!egU9l+c$EoY;>r)@WXPK!";s)D$E$/)hfAI-Mp'R8lb-] %;&j`;;%BDbKqc0ZAmgt,_;CFUN:o"O,#3aVX?Z&L`#1hp@@0k[ZFl8Fl*21M=S!4qg]lN[?PA]@R6]X/&G?j2>??lQbMDXdeeRsCnBQq9>*=ahcK?\m#qV4UncG3f#0o2&^X5[cH\N[cE#`dVJ*G\pqE4*.H(YqsT9\nK8>OCrc++eZmkg\p;- %AgkV>]us4/)o1$IIta<[7"4W$`GA&nW1c;Nj(>)#G9iePCLYA9K5t\sM-r+h*9SQG9b?`5^V(=dh\(Sa(eHkA6(iJbh&SJ$-SjR( %n*e=04L,8hbekYun]YWni'&3-P"/"'"8hZ1e3%b4+8DH5Wp#RDqSYT]E`J1%ejfr2JLu60eNS"mO*oacZhK"SI,kYWGf:15j]J-#GgO>fC1eMd2BESnhS_L9.N_HD+@l*d#G$t^9p1-Xa\h<`/;eJt:H@X?4=IKTeQYd(0+Wpo %n(KKdNL;.WR\P&N;fT[NS-k]bDQHdE']C'l$4#9T0;:SNS6otq$2`1s?l8Up7rX78d5nYcG5Rf&,Dmoa<`jP:*(6%mo5STj5kh4 %o>%.^F)Fb>S0O*XaS7d$K8rX",Nn9AT6-qc*B6h*r2:j,lH$P_?t^S6>Y!Z&"%V]G-TgnE*]Rm^3noekp:uf;i6r^7G:/^5OjSC8 %r]T`R:R&^@p[Fp@8=7q109/U/)kVeji4'Oh:S-o7#VN+5,[%UA9q8INks[nD'(pp`k.bJSBUEje(f7-`6p-._nnGi1r5Leg3:*(d+`;4=DEo %1__#'(67)W7hpda`J:3L`)0%a6$)$OTAlMSnXt3uUl]TGdQ$Q1*&Td;C*#n,O/#=g8PeD5HfV8,E`=l@:d6rHV&U4M*n48O8hDD^ %QO!2MK20Wf:Zarik+kps<4$r!^,`.Q*;+Cp[Qr#6ZdjfVM@jG,Tg]dh? %2<6j7"[rU#(H5I61LMA(sRsLCNY"6+O=UlL&m`e:$t&Y/+fc,oq5E0e@%F'?l]rf*gF'm.U3LA>t8b8UCPq/B%Tsdls5D5 %W*"5o2ET*T4Xd0J[FL9uCepL:7s2;)'&6>Am\hf5TLJUJ>Ba&VHVhUA.d%g0p)`l$%bc>$Q+mPm^ls$$;.]5_OmkZMn>LDQdR64_ %-_?S=c_?@YSGK46R+H@eW0:GS(3f0qjQnHLY'='hY5]kmGLSeWiD9NW"f*$.XG&:4\:o&Wg^X0 %TH9@r+&u<:!j(i_X[c+;Zhj!?:@(hVp8C4QTN(faCAY/aHdp2dd+*Qki'"%34t-:lVuRq4Jq'($5,o,8Fc+M6`^g!fUJUNVVXdT5 %q5DbidW@\<59H/b+'#.E*fa!(^-nF'-u$>0M:9#DF1k8FD:m/i"t9CW]#E.N>YU_[eJaqdrj,/?_hM0DoGckAJC&#L7X+CI36+/BMre!D+XoqBA("q">=6ibJ5__3Pc`jrXbOM+*EZO9Q*CdhF?mq/`D&m3d3WA %8XT_B^I9V$b($peE*X,Li^k%6CQp&iT^GHtGZf/*;qGV6lIu*gW3(3aAMql=XE13+V,mY_>@:K9P_RHHNPi%%1uK`<+IZ %?Mo>Wk_^PGbPA,?)8=31llLi3jTSDjQnns9JhqdR/m/%9WnVK*Xi>'eA%N7HbR"H0R\X2RYn_U1\E %K^\TfNKIY8IVK5HpQ^FlDFpK9P;F[jjmFVJ2C^[R-VWK5$=SdR\M?S8^/EJWOt-fP!:k2*8hT04FM?hWQsIOWBuH.4fOU(E5:!5( %LBWZod!Le'?I).,WD>Da&%fL:L]V!L+%j*""tQ:TGM9/4:W9g`/YKp><6 %Gn'Nb&9M2bf4nS(2bUAX>Ufp'WBp]7KKQ%]9CB-[ouF631[)j]1obTi!,5]\HNH+PrVO%:>Tfj\j8n#ZQ3;I=lE]5b8hTg3RIk-B %bKDC=;rG!lb3qa[j8cHd8=g^%3XHMie*k%9 %?@KFC$]pn1Wl2%Cm\n7liUOo<1qW7u".1-7om2I&!;Q/ZqEoWupF3T7bIb_.?DU#Z12;tP?kCIB)tc9baTB2oI'lRb?][/SYRqLI %%a$lqXZ&D]]W:SQ72u/BM2?ki48'uh#bl4EY2#e*ecNLJS,1MW#'&]YN5?h0TH66l7hpcafgK/P_p==#>`A)Jkmn^5Vc+A+LuP7rCbWnWFme'ZN!0=3 %<+Ha^7ckX`XR=O*cR;>D^la.ghPHGQ_OHZ.#Hgne%/bMcV(*g-8Da_VN^D^P&TGhRns+NQ,q!9L+X\!pE'Mct7&\ %oX`4<)Adlp!75!X(fO8BY.CH.=_9F(T5W9lAG%E5OGBFa_j05C(8l(b!+qc`S8DU7`F8/J5@lGu#WlX]YDg?mNJil)AqN8W>q6Or %V)N[%`'<*[\nN!/EnJ2EE:(q%YW2-QcKbTkOabCpmG3uGlgclc)jThscFD4$!]c#F%429)JLms[mDBXB2ZG;e7R`eb9nA1HP&X>c0e>SP9sI\T.!&/`CuAP@CJ=8Q4ED,)q`dY %`G+O`:9L*%P)&p]5is^m&_%:+4*lu7XGuA)HiP\Z,lX/WqnF%W40?UnDIi4m%m6?996i%Wql_ad]4aDf!C\.8b_nN&,W"FHW6P!ldJ%2ffnWV*Yi^VC:Zpsh4mI.K:_Oap?tj) %pd%dP9mcZ6;>d)"I+1>DW['eW.R0jb+*F#JRa+G%kHe(YK<"Qr!qfEkH:qH-Dc0pNS;9"M`eoT+"N_lQsZ3Ht8,(^^f"H,&k?U!n"#rj_%c,ELA6^k1"KkXlUU<:/@m5bdj7d^N$"nXq;CC?#YLQSb@lB;uYq4Fi0^FkAUY_Eb;.n5+.a0V@]3rbaqdXC.R"d[LllM=:LIC&TAb_X!4Jj;EP*X,k %kN1"$-VbuC.s1D1KO:&gTLeUQT=`I3pSHNS'H+]M/4@6_/d^$8F=R`Z"bKJ+IA/YtJ#pMSZ2iigBA'4Eu]dfsl;K:CB*$Zsub<3`?=7H3gGh!r,CGaD[#L1^0Tod'R#4!!c7g]-WF=Ft2 %.J'6JK(b3EJ4^s^h35bWP^A*@CtB[q:D@&,RN]nN(o0eeX'3!:lJ!PRSo_hG2ufU9=>j&X[pcM^!5Ne8lGZ %)Xf<.@riBdTOtqT()WU5oXZsD.e-U.-rql/;#D%54YqWH*LYf1J"UDL_cjGh62``OV@#\2("e %Lt[#D+u'Xo?cDrL$aVk6G"CGV&VSWe0bo1DkRLi3^O9I?n#>A3O=LRJo8C^uG\T>HUA=J">P\2XSmSP?P0'j\Cg09o-;UWfc742N %%\ZUc1CRZm;B6h(jK>sk1>W3#]!X%6ZRW%l^EGDtB=$-(kl\_6PlO0HU7*6,[hgm5h7u!05g\J*pO53][*"`<-/fY065Jp**Pc9] %_3X?$W5(5YC##Hb4@7/TX.15DA`D?D3FP,Ek38WN:JW'V5S]8@7Gt..FQ-^#KFgWGc,e-tJ\oVtCgIa_KTQg:aL8\NE2?*jhuQMD %e`"jLeO=)`O:(6u/pP3T2-q,,)&O)@8n]EB=3(S+$J:;)!j=VF[)WSsKW?T<.PW00Q$a/P;9=gnE;A30*ch#Up*!t78K2?k)1uof %Y9r8WN17:QRpNRWiPBMQG%tT%kshQ8CV(b(93;,>jB%9/+\X&qR:_!l8B8Ogf):T(tTfVRaf'qs8(U*fEA %4[Sg8Z#L338qW`tb3)[J$"eBf@,,*@F61D3i#Hi'i-^&#Pp";e&tk"R7MCJ-U(\*G$3=?GKn'G$AT8(skn6[GaZ[R+Rnc4C/9B8B %-<+75cAs]@#CQR_M5n]rAooeX0kAE%R2-E($[!)VCC/!bZ(a9T)rp\fLV/+$`sb64C;k0_aC8Jmkgm&ISu;A%0J5@d3V;1oV.BU*@NZ9J"'S[_-[Uh,IQl//e*?O5M1,:ND"Z1'H6sU)LLh7im&@f %qPH_h(aN4D=9B,B=,ZYiFAlAf#/GQ[7c%DMpCI)[QcG0d\37KA-/Z(pn4:`RO"cNF)@4CLiW,I%A*-662,9CodAp:-nIZ8W %g">0#I9$L!+#L<:6JX>4muL%I2KKZji*"1u0#\Q>=UE.f"\KHdDYc-]\KZ[b+NS;"?2f8fTq1p8H)XOJ[Q\`,*6@CtT+=b9*kGET %EDr+aJAs\(W0dU`p=4P;;$MHm=ure)[7(\1,`U]Zn2Ka9#W9@?c@k.o*:;/8"r[#I$.g:jmYDA3-a:M?#@,1R5Of#e&.?*=U+JmM %2\bPEQSN%AOIAH@6flZs#<8=--p0$]XWs8J^X'\%Xmq.2E3r)^"K8\PqS?PC>pWlQ'*&GD'e;ol#?[Z+R%\o)2/b)EZ-F'Z'3aAr %=`M5b4Q&*Bd#N;Ua8mm`hjj9kC*N^Y)jSdMEbs;gUT.KfH-Ze]IGP<.<'mtCEj"'sE.jR#nRF+p2:4(Mjk]+&%$H6Sl=?J626',X %HJW=G^J]/5Q7%]HN.3Tms)peYr:9'T*Bh$PcMMChoPm+q]_DHa!!50X/T'4+?%l?DY2)dj0o!esl?q&*'LRN',X_iqPX@,kn3;'< %*`(kgg&:`2J",PDJ,b/`jd:hW6G=.:3Yrm;S,-Zc@\$D$5np^4!Z\\I\'[>u:`)`3G@6l6H83DEke\-=+t&`ibloqDhi5PWeGE:V %bN40X=-JR$aE6__in&&iqC,s##]G`Scs+lh51]AG.HEo,Ko-p[dGZ-sD$&5!\`p:AIg=UE]i;N,jTYbBr+'*&;u>Wfio %.kd2>990j;$i7p[q-$< %MI'ksgmMasjL]FPcVX*UCA`T8J&J'',-cojm4H%6,,)X&>1c:q-o@pa5kInf'\XppZk5Xkl`Z/[*ee'aP-RURg$JN'8)@*?ddeiF %LiIUM^m0T\ff)uL(h$Pf5?LCaa/'nMh70d*IAtsRR2Y@8M>*[_nL]Ik8./,Oq]qbF]#>keAD@F7#)[KC2pnimR_VVa7@(7kN83o1 %IZp`%#[toB=U*RH6@mH+`8)@tmcuZrmL6`)$(]\]'$N=@5>@*'5r/BHD]o`V2AO]b^,rAE%?1D+X^pt8:YdJHB*uI2.Ib2;cl\.? %J3,+L?n4OP)haTL[*31q\OYAP$qkc%,l(k1V,Burh\ie%MP$c3pl0LE4]?lQ<$DH$&EJ(=h"BMGiUiWj6jfE)N]q-BHWLG%0=i;H=L;fakaSqR95hp/*I41Q\)5tk%TeR3siW( %DSo1Q]Ml=,oXLr"[0g1pR&+YDq^LaX-a*D>[:Gq-]ncld-T+nZRC-"ep:1Kjm4=9JC(GbIriW]JrX.P-`7]ZIYQ!KjVkP7Dm&\*X %9`S2/o!*cd5!7j$C*N[oRr%F")NugN2hi8*2iTqQC$`m=[bB8c#,B>q]=!'==aJI(f^3,'@;+MZd%5;,>-07A5%$4c+,B!L4mG#=1m!t %GKkkfF82.17r$[:Jn>t/>nO%][J@_a$ML\,:`O5BbQt659=qja-sU:+@XM$KRC0)I(#F(uOEb]Z3HP=@J=/enqHkiDqe<[W0!!(fgYN$tDrq7PA`Lgi61ea'tJZHj!#W![#p%B;/eaDJ&FQOAE+HT-:N_['j(O %X&&f0X$<3GcABGe_sH)_T(0Ka,k*$nG^*NC<#=@8=Ynd:K^,SrY)B)1Cnpp:mi]fd48?=sV?m;L_2\];=Ee`_n@Y!Te!)qpLnFbr9[Ag:I=&UJ=`29og4$aGG=Yptpb^p6s %RS%_s]Q:mDQ@QFeDA2PTJ::-51;;k#Ik>#TbUfBld*ot5]a@#ajuO3M(qc`EMtaJ_n5NUO`q:J0FVOXtO97R:LRhDa*otD&dU`qEB*U`0BCW?QTs^(0gOjn.=mGAs %$25P`pE2;:Pb`YfY<,;2*C]K>"n^)LHUh5Q#78/?gttsGn15c.'HB5+'0aJS5"H_9`=X2F'T\uH7sW+LPiGX7nL+tE+=?n,4F*0i %4K2JTF>&[VR?(gGBAq+17-?k\o-F6ZPR)\6'0Q\`*X,.XUeHiTV[%e&#;OaA6?dKpGHTn4bc#q#]H>,f>E'K%jNDGH1"9Re_Bn(G %S5]dSW!^3_Ej_e9=eb3/FLjt*@"uh+FdJEBH%Dc\&$Qd]?=rn#7bd_%A1*$l!pWTWcD#Ku/G82&0[G&R-ZtEA%Ycp+QdBqOdZ9l! %aHA4FkO$:JjEHgFG";eRN2q#3,PnbohpIQRjL,pO9Y>Cg1oG)Un(Vh'9T$4Q-9YZ$Cg*$)X]VL5_FU[eN*"l`>`iW$\Q(Uls. %C'!7I\k?#pf)V!-CXN!*ZM%lP4gfmhI_@90[7#ZH?5^F#%6.l$k^Sq$7#6`4DmrGR"jA#RD7(k!*s7/Omr,kS#dkd2*.N!R%j'O;!0g+C6^p"\_NXRfM\/0NZ;6N)1gNO[,\H %$c_kRMfeWC`qo;FL@$sJIe<]LSS?JGN&V2WWJG.@VI<.tJBn8(_L>QTjmD#jNZPc\feK6Y-KRZE*B,PP.:'dg!KIpY@Zn=?_+;_T %Bm][W5?cQjPP=kF!G^[lErbGp%Au,[S+AulQ]U?g`q(FUA7p]*"?6^Ln/p@2C**aQr`dC+5qn^'$kE&bejaI]=h/&-^!Kol9m-h;2U&6]QBU+`URr@("q8 %\Hlt^<`n5BkfPA\hM-'>7\$3&iao!pDc`HH!J:oEr$1mHQa$B7W(*iEfqXUaKsGbi"RO!:3er+\.lOi;O_M=ZHML7*<5lhW;,f/&+r@-o5H.8T?gnk&bSd,,AU)02:ZNG(-GHLtB!nI-igG-]%;b*!a>)F'Ye\G-,"[S%2MK-0.u %L/U1Xea51C!s)2?M0l[S8-^;Y!KO'N)l)*5SL]u"UKD-UrCmG:07(/'`0j+0E5JpWm;W5<;309F@JN5.jp>ET(NMGaEI %.(Fo9og*ZD.9t`2F)bH"[^%O;]Uh+hlcVXE5:fH,3bAs"As"p+XX*`R-1lr4m\=:Mk"]iUC9oknUJ(RNd8t\alOFuoK=CX6=WVt; %K>79SRqe=;A94cq55nFLY.e#=9.07/l"KL#S1j5R`HP^GQf1^_Ou(nS;>BK+P'3'gH]VPQJT+[j#MV^N"Hf&]cdsu.i9N0Uij7c*Z3=-gGA24]kdlIkQapUD_QIK8.M]DEa+YM\6M.. %=Bi#HAJC:._n;Y1DJ,FX6iWO*ZuCtO2e7)1,Zif%)SQErWZKD4CtYI`9P]Q#IDqb[?u([@q5>g!b]23_sjQ@r1@:eer+.PRhj(/*-q(+WR?n+:c#P7S+3HF6;E %?W("T=ZpYu%R".>i9XNnBL9^RJ.5RS,a5Wq/r'rnF9a=LK.;mN*rtP<$/o+Ug:qC5)jfju\8f^P?WiIt_!YekfjGO3]*/p&<_/l. %`cDGH`!`9dZVR:+6I,mD?'6[_85NXX<,!;$&nEq]"tXr#5jS@\F_Ie#4e[ms#iu:>o?XAuIg4fkIAR1f4M6s>qg3S>a*$pVJt?#t %Bk8@:nABQ*YuON+BebFAn$R;U'HboK_n%n3^phkjNl?D#dQW,*f_eL6jMQ^uhKk5eoPlrg[tR>PR;%r3p*hS,dXY&AD`;-t_q#uI %f1+->K.ThU_Q$rg@#sX?u>]JUG3/&K;TK_F)QR:'WK0I'bF4?^'VeqAc?pTD[ %&=A^NE##dB2@S"@\-fn^PW1:TC70Ad8X*T-D03!QM9m0G):=-a:6ld/\c]K-Kts"-'f;r/<^je6Cm9o]No['WkQWr$!qhX;GdE@r %@:\ubh'q;oHUS,?@0?iLQ&jL^?4C=b>lc06.XL5J,C7:BkBG\50['+``"8RO^eX7''?UA!h^t5F2[NI8MM[!'1^A:Pc(eOEM_4<%>i?>us#4T@P#3@$MBC%Ii %JL''22KRK28X=GmiS_`BD-H8X1-PoaAW!HY>TSu5c:];:7qf?#'NC-a8@YQoN<2eANAg&K_'9]^:l:_V's,F$iLWE!ih^.c;XE(r %;B?c`&_(,jSQB4D".$lt-[369i=R8ADXkX9Z@3eKAYVYb!g^^(9JuZsj5=WNrYV6:s2";c8F?;^d/t<,mI^G>i'2kqkBPqs>9)[b %F2W*TDVbP6LT1p\cL;0*A?HhI?Himh^LbG+1AB:Mk1Hj!eC`oW$-oe_cDe"m@ga>YSh%V`DRAE758F-QQ.-i*Ror9p1P`3n'Kujn %&bMugk@cfMNFKI]LCXCGM%[aYj$W'p-h_Z.orACAeukCdqL//>9hjhe:s'n(96I]magajbi"9>kJ4+cM/KPI`7kE^GDK<@V@ZLPc %=`cW0<6g7'CqPGj3?TQ9M@Q/n@akR]SX-?BC0,Gcp?*Y>NP=H^9b3t@+o>;G:B/*L5,dbd#;LaTg7H7,(11h^+C %6(Rno7/o%0JQ'PZX,DRF@sY3JCIknO_R+Oflc.4=5S>ds;l-EKV;l_nV7:LE>Heo/9-(s6@@`"Ye55#2:2eG>Z$f3\JWO^@EoK9Q %9nnpgc#aK@NU,$G*c-%BX36B\#]N-547?L8%u-ITP\q-Tkrc>l,9d-j<$%8!NY=`Tm,? %SBSHcM[0&QdgstP.\RHQQ*Ed3E($R!MUER+-?YK+H;W5K/3``WhfaQS;AUUdhSm[ %r_,aO!>qA,L39>8h7`c;"s>5[-8V'Ig=4WFJ)LkAO3Qeg><]ht1/pWsd8hNu-=i<_Tq#"aM-%,9Q\`\*Z3GA'-o$p*.[;HmFp=EUrUV_HpfUZdeUR.:?EUM28:XF.' %UlRobDCYtp93V,?FgVmc94Hb<4WS-&$U^T5GAS0Cjk'H3HrTpnrSEhofEl[gTEK/L-"g8t!rNaBFX2N*]R2-2lBHInsq`DTch0k3,[u%1S6/['ENuC%m\F]uh'5r+7?P!#DDB %*+UH;pQZi66"8rAhY&oV(r0ei[_E[MB]dl`*%jSQNK3Opgf5)#%RGoOUJfo;9sdOPV>`[!q]8hKcjk*'Coiu4hAu4^DI3t"PkHq" %QQJ'AP#1KYOK3_)IQeA`Q0U"LEWldr\!o1HY8,c.8T'Gd`80'ljBA^o2*smF0c3;8/m_O3#a<("l6;u5D7>^NBE3r-jg]G'ioKKg %:9V!RFd^]tnRh8E9`7q1M=tTGUb^"!L+3m;g"4YmF)kMX]&iiNp4'hXo7c@JJ3lgNYVeT/n,WOe<$!U>bqpU+/C9R`K;4Kq1/f*a %7qcsBQ-Dt0Kha$qWAigBmkI':53is^QV2C$S0bogg1Qb`(L)aQ#ADObL$tc3C:Aj,AS#8>JQn"a$i8#4]LO<*9hs1-^K)B>P3^XV %FRLY`QIp#>#V4=s-@$"Y0H@Z$08EfD&T>YnW7rh.WguFEQoIH+=^>c9hKEQIi-_K("eJGU8/"]ueUWl`CQ7b#dE7qVq1K1'V:]JW %r\dK:?I:?OH($-`FCtORJ@DKDgGjeWJJ?RD %\R#V$NFcR#iOlD2kf6]Z@r"0D':2ZT0q&=P=>I6D3D25pJ2t!q?#%u6[%ZD!,aPk,BKk.>!#r.@+)*Q`jZ+UUp:sL2VU/EhAUQ5,pNpZiufL(DZJXOjoCZ-C"IX0(J!2eYFrlU'3pc&p3qYo>T-`& %9(0!a0/0VSg"O'NmL($($[hJMB)+UsI@%.ObA?'I_='/A06$7OB_]2urEX=@IMmZ2_16E7J`S?aSVdU,g'3IX&3;Z^]%%N2.PZ%G %2K\7HCt+%r;r%^/J9&#s_DG5jKpjM\63m7mOe-ONM2Y5Goe7`];#sf/>NrRZVgL3`R@[FR;a^o)cs024g0LUc#["i?T`:]M&OpIs'Z'&W+:_aC*1d\.`81[^e:kFUNX%Bs;QeHtA.J`lVX-N6J$]K'* %Ush/!'-e5`;?"e^&X!]_L=m\,`E@m,;qA!KjAM^qj2?m)$-Ba(UAc\t?[#)I]6)a7eCt+dp=_&;?-.WSe18cTi.rYe!+Y,1E@UoS %bU@>IQgB7UC-)e4I#OQ(>.:NeVu$"$:0IOu9<(?X:+CX#)MmGY=&66B)b)47ZlUgn %NPoGGCAa1&MM'pu;"hlAg=b*6';./+,3HL9^6>SH':bCd-NuYX!k3X4KD49'\<@9H9c@,/0^.RAFHRF9q$d_2&=o&BDK8/n%AT8m %Z&m\EPQoQ1(g0B^EH.F21$>M!YbVlY=*D/I8'lD=NjA0cnD$O5?qBkoJnbZJ&E5Adbhg?phbstjGRN"18L_CikOd%t2E&uF2AXD( %!n+2C#OnXid9VJEpm,jh;bit%$?:[Cjt;h,!j%?7>hk9g7Ca!ho<7Z\:9%>RWG*Y;r %CH7VO0K?lS?oJB,P='P25YcduVZ2\/*\)F>4:Fh.^iJOuNVU0r#j;Q(8`7M/.cPifGe[7= %ea;MlG&r0MZ@t7/MRsbIrESH<]]O)9F>m-E.BC%HJ_eT$?HDHh9E=PDM(dqS,B[M-24:EPS5M>C.FCf5qf-4gdT">sT*Ug9p`0W9k`@0Dr4t-#=F/p=e0X>K$)Ru?R5he\!!=Lq4Yb.1mNdO:N9m5^JMkR* %W`kCI`*,U"18;Wn%)A1O3ard7Xul_AjM'H5\*//L"fB6PXJK_CSn3n2Q\tO((qA;"]&WOOl.3K9LXM\VUiO4CS@>%uVI,FK(8Mc/'R#^a%;dZK+tg5!WFE@*!mDMmh8fE %2[FG"QcX@H[(CaD?3N>&85Q=9ENd=T9!l@Knjf2W\P-7@L%bgf=d3lcSA5-dO4MY@]F#I"UcY*q?$>MpXN4]PAN/5HS!Rht-P@pJ %QS(f>L1O1'DleO3Hg_14r`7"7TFSE]N9&,Ip8hF\"J&%#X?d,f\bU&6atu]aEOM7*OrQN62Q/fV/;[OB>LYj]La()P7"')e %%!iG)IPP"_il9(8!V$t'0])t[mt9\JB_ie>4pZsM*X0f`:[@4?P3+k*-K'=!W`dET)_An?'>3&YJN'4;nu %TOb/A65]h,9JDZF+McG9E3Zk$=-=;kb]$cnd`5[$JEejj$X]SBBad.EI:QF6mn\&RsM?,VU9JtSJdrU %b_>/p!2ri+nI^-;j:1h9>89Y:hal$hr(RH_DC;O:,%QpR[JCsH_h_@-_Wf0F-ZV,ie0CZLLG2LQnma2PT;lZ.)kmY(/W2H?PRPRZ %K1@R\WOnhh-mJ9bsMN)[:7b %:a_;60G+n23"EM;eCu-%QJ;W6F96nhVjHDp^%q5Tr>UH;RlCb.SJ4PQ:(IAQ9QYBO;dktJQHdo#OqFu\URWTkVl"ZtnuG^/P>4S- %"0eVQ3m.hhb5X4j:A4c_013,tD%7@#7aUF?^d/r4_`3;!<-@%-UZ#HJ!L%R,DZ42]D;Skr$,k+n6!:_>@61E%LW5S%hg;'XTX\QHJb"uH,qE(HoF]7_8'5,&O+M](eS8f*$$[U8&Wf9IZ+OMPjd$]dlp!TTBZ>`9@7.2%aJX%Mo7-b9_ %6^MY(32fK/+YOu8!!AE,AF7L&#*g>K\rg&:4+f6VlDHGJ\q=QbqEm,rJg1q3^#-WT]k0s&*+Nl=O(KNI/[[<$=;0>V4rk?TGYLV//G(EQ&%TG6;n8KTr*Gf3n`5A"P8dBde&SgSq"lV$7p,_-G/du\21>%-oG(GI-TZ%DVYmZ7jKM?V4QrGJW5G5k6PkHi]hQ!+kW9hE(`5"Yb?@Gi+5= %G5u!JMqG6DLhm*2`^*_f&1X).?$%29AQ^Oe#@04 %WIhGgX6)6%;"hB\,ZHp;$UA?'?`,_F&h7:/R&Ju-PSoX0.`MIW-6',HYC.*0q`3eZuiIL@pj?X]hq6Eq9X\YZ/Ndp<)0fW %^n3-kUZ=P[*"gQ3==p$'VG&G_]2aW!e((J=Tf`^L#fAX4[OY&',kN4XOX%^oi,IsIatSY'L=!g=4/B^>6\EC.Wc8"'34ZDm#Xc`A %Em\Xp$s/HK'\T8&h.2l(Lp\W7fII2$UFgi#gIJeVj]FFI,*&l[kpr`+MG1Sna>Zhsfc39gaVsOLW\\l?77]:X4dt+P-PRCj((M[b %EbH%L&BG$c##H>I!@ss6J-VP2s"@C5]OuWDTL7.KJ"C3m\bB,TO0UBS[LeOh#gj?%pfnRT>SnLmu=o[jnPHmhh;TY8Rd)j,$&#L;YkpLdeNX`^17BKEUU_ %-,]jHHnjL1ND4SkQjXMP1f(C#IIY!=[!AEnfIl!^e_Po7mFp7Fh#h&Aj`$%gZ,`EF_6_d(R9SED!orJWD_+_,FQkp!e/pi:O9It555@a9VIY>-":ZJjbu?Y8Jj24< %dt#$+J8O;BZ-ib317r]qX1c[BGn.jrW(IkdQ),.mG?/RNCV:Y#X3<;siS,NDl-ds1:tKf'DRtK\$fjFe0m?nYWnT6Q %XbI`*S%D1^ZYAoH0Laf4n?p.`e`EE,i2Z)5>'1^eqIE_l>-0FWecJoSQe/:Y!4KZY7OEW)Mujga#Lds78!;D\pe$hRF(ac1n/5FK %&U6sH,FPi5\S@KuWn!g^.h,kl=;&T/afp"&n093sG"@e!"E-(G#Ude(+;_CGk*tcGOf$qGR8QLW)95i@jj-9H:5XlI/Js(J/f>UI %P*E+B>lgCC6=LE#d'D#hP&NuGP)XU@agr0u*P/RO^V`M^riO1O3][)nm/E'^"L-:u:!/8r'gFck7/,)HUYQE%451cVLGbi.qKn4[ %"JrlFA1/JPP_DNo@VS/Z?]BN)4U^5V#f-P6[4DL'0J-E_gZA/4SJ\$RBdA88 %V'C(A/+@1R3`^F*i:UK2pY#IK,g>HPmT1m_S^E(#BpkBn>e".RH?D%.j\Rs6WnCT_FqW",IU<7a1Fm'5mi'#pM#3@; %1l,&b=!ijIPZd3I[Cr:o&Qb;0i7'.j[Z-G.Uu,/QRaJF!\U&LSE3r&=jAo`pJiQsnTXW'[cRJW,6:L;,HIGlaXILK$AqP9HVhtb2 %i(+NSQFDgM=X9@X,h0UCoftdB]\tuO2HVOs"(%(!%(+DR,dPOl%=kF0G'Ca?0LH+@!gMl(#/s/7N'0ojV?L:f,mobefgq0kUe>1& %5^1Xd7d6)7/C:M@WEC!M>WRNkMhDa,DMg''`E>1^ %m:s/]EG?tH[.5D_#&+'t]HE)9>b[PJd84ok/!e:/3`T4moiN#F[s%)MFt:FI<0'1@GC?h:$>O$NXt'K8QT(!3RmEiB5&5Sp5VSeC %A;Du*Q5"cmj$bWrpY7A?(K'qH>.EB(DSkh4\T#<$hSn;THg-:R.g'(ZTrVUD[?7WKda<&`>"*Q).jM(C>nPo#dp6VBMT4snNu+f@ %G:P+dCG,A)1M\iQq0f[Ac2`YpH^?/pcqDACo.D91L^MW@FsPV9[R)!#Gq"VkhoHT\%0euB,[J!-'YB]sF@_(bekjo]&KV!d*'h&< %2@16LJm[TWOc^8E*sLLeY3BWW&'1T+9J[09.Gcp"*G4c1p^!5Dju@9d/^?q3p(h:%$=aI# %;)Z'(kUE9+bgJn%kB(/+2nme-HpM%5PWjH:!n0c.Q).".ZH2Y>o"f)2H2>5M;3;/Pq7RZD.g'n?!Lt/JRH-1+/`B8fKdSKhWMT"6 %h5J"]h)tb(Nf*h8d]F&;XX*p'=\TLhJY4-C!tS$*_qb_=%OY %/at6@#f\B%5?1/DdB=!o@g7GJ]5_mFgo=K*^M+iZn77)JG;NDkM6f]DB@q5N$/hLZ %%n`iCO:Y=78OT1AduO^n-S;,J0ZAnC\#E66F>"Iu>e<5hdm0Z'5MRI$@Q6H?(<58Yr] %RMntYd8N:i+Gs,];WFM&IFA3*JQ&qfcf3NQ&:fLd9'*Z#%#!=R=A^9 %@>C4l[X'7DJVO`>Z@R'^=U=5g<$d*O4L7^k(gY?VS]%B)$;E_mr"`gUh,-*?XeH.nbk0E8[_8Yfq %g"F%`@.CVfSh/\RB]Hc%Bl>j13XT2RS3R4Z]2^TNZka>nk!4`T+q5N!004-b'M7PC>S_$u2[FcB`4h-T^g4h80"#YZL:BlZga>$e %+@:7XBIg^:7-JHqR4U[WHt6<]X&N^p8-//7@8QOF8bJ.CUflBM'X\0H=Ihro-'[>tVb'i7j!Zl9RI'2gJ0*hkiMC#XJLJYq4!T&O^c@':_G>jBlb;=B]-*B!YN$Vq\u):Sg8t[o-DG&-9G[CVE]l8 %))QVANkX!rYl^jf/CtU'/bo@bhn.G06(/X#%^c-rd0< %BD"i)i@Z!^Q(-ld"+s"m]WfR&(4"'P8>SQZCDm1fP\+sXB_Hu=@Ls8TK`9cq9BVJiqQ'c=@l1!C5]&BTTJLZ1.C8U/#t,4> %gBQ2=[[A2,Z65t]>;"7oBqN9*FHPsg9+07G&F('cmT,BT,M\G"k](Zd8\?qe^Z>+sA[T,R\@]_k#K+-5!eQSra5iRL/"2^MiB6-) %#if3Q1)Z=uMMMHAjJ=qlH7i2[mhJ@]<`*5&\DAa]hQ>eO;=U3,T16>!H&q:b;19N(WigekpPtPk+#A@PNC%fM1,H3beY>G)^QOC- %Tf82;Fs18r\'BMZTi_DLE@[uicR46_Q7t3f)T[N_(2ZY/#q,F@l*G,/0gfB(Br$\B,+^cl2&aNu+PbKga"`kN*i!B4lOLC+^lJG+_3E-l0ZF=\c[4?&j/pAZZa10EWPc_QHG.fsof>=&-=3q8_FMB6HZfkMRQ9[h+J#c3_K* %4GG!#)6?I&dS)5TgMM)8#9SXAFV@b+GhJ^^I/4>_k"SA#3Wo5\9"SWu?!?onS:^\aTZf>PQ]L(9Ti.9oXokFh'C$1GiOXu\Cu@oWj,)V2(tC!q6%^W.Z49,&iMPq*ogAmDQM!r0]3uE7 %Lb*Kka/'hjY9MES(k3RR!HOGJAj%V&p+Xn+-'Vl:FDi;0Os%0XoII5p=p9iI;.<_n6"b_q_+;M>ZKOm_`)ee/9X2ti*(/eQ(s4&0 %GnY,,JZBNuj[-rC:2Sm2%L705/C?V&M'3Y7(3M)H/_!*jW12;=Z.,nqZr":^g70WO-Kg%#5R*f(ibJnj'Xb>0nR/^s)mNu9jWV@: %$o8ms:Cl6n#s$fiF*=VD:._g!n[+!:C]0uDh=>CjV;AdpiOT3R(5g@Z$e'5kfI`?"l^#QV(=??.G]]H#>rPBr<5l2JidnuoO$Ei: %7p.cBW*JmJbpY)O0T9("[L.e8_U1'Sk\>2##FK&K9aU%CW,HpVJY1s!]PcTdb$2`Jr$$R!#$g?V';Rq^"IM+AZ %g4SJf,lQ]+]_=P#ecQ?7(r9X%4eh;N$pZ@eQn(rNba,A!Y %X+rbKrpo?Xf68b)TDusfh8Sd3RhM*ZW;)ugUS#$qroO#8_t9S[`6EYu^Y0e0eO8;e`09)Lr1F!NS@kPns.(2/oX-,V[8&9sBbHu_ %78@17AcpIA'oa0W;VSEB3Wd03g(BoW@4"Zu3YBJ(QbGs&g %E6m0jgE?F8_2%;%>'mF36.3"$NEQ[_$'h]uWf\Fk1=I_@A`B%?e(4c>PYg6?GKLql6o&LW,-riM-cs+Z,IhVpVtO3\5Ai?anP9V4 %?p4!Nqe?Oi,Yg]r]-(RC?m;Z.8j%')2_,)sb8TOQLh=ul:o32!jFpO+Jo,aM-/(lZd%[OgB?K`rkX+u(3R"R^Dp]UEFaflV%t1+$ %*\1#@4ZNp3[K>_:(<<6L(cB?qQ>'d8[0BI"G'\+>?-C3HQsh6cf7[@^Sf]K2]G3e.RGHd$:D.&qkQ1cHZ %VQ<-9[SB6RO]9K!fHM"KP_D,,q)7V24(8+Eg*7?.k=nmnmq[k0h%!h=$8NLhoW="9erdrg/[\s@KlqEd^SbR>p5!?j6lQ(JKG$DQ %&TmA3I`QSlm.Xi]m:k[\B9OC%Z7T(Ik;"f(NMDb;NQRb"P,Mh=Oi0"0jE]_J?6QGSk]pUDYp@ULkdKD_o==S<8J$EjR[m,7"rW?8 %j(0/CHhPrm?j7Ya$dGd^Y%l.GMO]Cq@hPNV8n#]P82`O2[)'1qmpa@]Fu#W'orP.F\tI\IHOd=9VS'HF0_&lsfE,)_PZA=JMF]^f %,=`RGo/S'h1]+hTq*W!MfAoQXS/u5/Pd)iU,`.4sNa"(p'btQ#.GQ/^SY_[9\EY7!R;;G"V9684lUUp0[0k,EL9.Q3c%0:]8R6=^ %eM=)a(?-OmaA&HBUnu.YGCXtF0Lc>Sjen0\%3dMD.S-=k.a4Z*\;_PCf8..hO='n$CJpIGc@^QSN`)IL=95;+kk1;eTrYU>,BEVq %a%p%UkS6kc+/?^o1S=bk<)jD(Lf!]+/(`T+2WSI8;o;_X*0*JYdp]=P4ek()W]F %&3VU?T4u=1Lq7AT8()o,[9PFoV(*]u&JhD3,uY5UX*X:rB^OT*?8&J[o9aBWN;BQRmRbsWUXB/;!=Wee`SO;0FA&VG>*/rCJf\0" %:24DQjas'o?MKr#MeTWB,'G-"d3Q\^9pG;;LZ`nA([Om`9Up=]d,Te:85pR$6\/_"`$+,ti2kUQ(&OF^DM*ak#FYikX&AMZ=m1I/ %#,C!e,RuiYDAa$ADknp!X[>H5$lmd00X2pKPT6F"VucB7,]ut2Rro5F]/j/'/,2K1l@k3kS:13@Rra5B].u"F(^*B#(]$W$k-]->OaY$IM1+XPQT=Z-=>_CLeT!>9ob3kY,;THG9,XGW4W0 %)1tE]=Yroe(< %n2"oHMuL!k(!o4pZH(W*'VVC;br721(%jjc_A@Q"+MuTbik?2l@g4n)MVf>F=?+Y.%h\)l@S)r][6W?NJ2\.Q%]0h-B?uSM2THMj %dTf(aQ/t:?)T1!g=qOCG4K^dkktUOLL2uF7EQ8^2IXi'4cDN!_ft%@T=Fu8reT@^8Zr@j<67]LsgOP)?XTb]<2(FNh4Qn:j9aZI\ %qC&K\V88:dU\^"6)!QYsdA21La;XV>k%ELdPNRMV5`f0+o%n9_:B_7Hb5o,EZeK!/!6BG/Cckc9;3L2.EuC<)kMD2sN/ %iHD.JJ&He1=megFjT_U\KhY(EJ@J4Y-4C3#WWg5Ji:'S6aI1^B-F)%bgbPTOX]s%<9%H6HJSl]k+G$5C7t?anhK4>M$m$\FXB;Vd %>P(Xdi+m&<)%0GOGJ_IThfGlU`=[;CeKG40;IU3tP3AP`p2C$=UG+pe3C8oU$Yr0/%pD==-5qW,B>Z-F#J"^5cq:b#[IT?b>9st; %33`"[&jI*C;B&I**"/;A=KP1'8hsTS;)-\pfV7_?oV5->8pC1cil(F/7ca4'DAkHr@I>pfY1'Sk&heNIdk^5Mul*A %Ur/*(,X-k7J_GWp84S$X$U'9:/eVlqWV)(_Ok<%e*)jdI'[=^?;leB$a!_TXTQ)$!A"9Eo.?.N1^q?)A7W$mB3*LLL-:j %bRKa(6s%]:3970k^T3QH*7E**rEF1Q@]6mD.PX@k/0f:C]p1bANm7I'Q'E.i3iPr6X7^u5f_Ug;El=Qk7Tp^@C6=UY;G2ZlPGHiQC3rhlT%r,JlA7BkBXfS %r>mR!\5JPGYB0as+eQGG(5(s,@Y'`Y0#`%!*R."rg1K=-Tm0KZ[fJ*I'XMcdZBFf\dg04^aYUt#AgQ?!g76seUr)U\*-m:t(KJd' %EQ39beV]j@);?Up:fb*F+cVE_?J7,HMD"^\-0KjuL__WgLcZMgJFu&nBk$6oXd_8_9%;j=KK>jb\A\'E"1bgUNF*SXj53[Sa/Ck)OW2/I(JJ#?l>#cb#RTqnU7*PS-o) %Bkkup,IV-6.;9;!*OJ4R`cG9.gm%_Vc?'?7m)"*h6k;W'H%bN].Ub?S3b='SH4W6:;&tq=U5ImhTR2^//oA%o9IV/e*>"Lf<*<\R %*1Y'`)8WAQ(bM0XgS#nD$/hW7EtsE1nSC9a'9QF^fi"&UIe$WTN(0D0SBL8&8%Y:#>N[IjQ+%[VSYL'5C)=]ZD)-`cMY]/%NOpL1 %o2(RIWYQl21EmZu'QKM/gW2Qd[MV;t'@pbO$%gR4;G[kdSsJ!j?4CSt!c$Kk>W2'^IE9$N=/)*&qg<^Y7:aMG%1Aen0 %gNjhEI,p+q"i`IS`="3eGi3Y-(QJL>ZQUZ!&Nr5.[=g#@'fE-p>_#4iCF9H+DRDk`I7T()]*]rGihQ:VVEJs-;KqLf6]iMMfb%XO %eBjGRL=3CD&S;4^&Oq\_Tcu0LJ;oXUA52&4L5fr%D?TS!C]^O@:5!UK_,fA?G+MC/(7XfG3=rk9P>VMZA<<$:_=q[S]e!#l0(=LT %5g-ad3g'W9SgMjD?4mMa_;)YY_\*;/EC/T"Co;S'g5NA:C0::FD.dpL,`8QJPe,CRsuPU%S3RD %,g0CBP`$*eVMI2eQbV(,72,O^p\9KZNXgLP@n"'AWfC':_[XmnI@[p;#l"OUF_=NgVCf'j)o(R9S>'>Q)t[A_[]%If/PEm=@*p2B %=I"mGM].BRcJFF./gOIo!D.q&'qfa_K=$8rQ)`5C1T=Y;0F=1j'eV=d`hVA+G"BHK>%SS"#.8ZCGqQ*?eQjmOrP[;RK[o5\8&@,@ %@.5gZ*H':R)"]98+sb_a/is5J'01;l(;U\XBV8IH7Urp_.nNcP-#^^6V`C_mZe<='ED"(R.\QF7&m;kIknIPU'N[=snR.sVPYG._ %De!ND3\5chFO2u]\,]PlIUNGVC:(/a4Ml>Jg!maUV!b;+9gT*W@"D@gd/gp;]UPT\pb-0#<0p6][iG9/q,B?9P0WgSU2DGUa %:S5diSA?\J[D+Kjq`(T07%j7RK>L:@!UV?uiCl^OS?c`b-P/(,FNX].[0Q)OVh>]WK`"fb'Hq^[\36%%LZcd^lDFlR=9'^ %,6ckbE.Xo\je(a>Dd%Lhi)j(3"MW?m3*\0[dOYSt@N:KYNq^NJ*g;MSSkKe'eB[Z#.P#e"7GmY><1f,&&K/.BJ9YK*,^s+F?OVn- %-aXT[2(QaS%1K%M1hg?f,JFf5WA>pqFP)B\Md(sohq&-i&;iDk8kU8XDWK2]^UXFi%#1df!$2LW`e^-0Won9)#kjQT"-sA;\#2,< %GDmZ,Ko.aWL9O(1VlqR-ND[]:dg[9&,.2A6odUpD8j,DDpNP/Y5^]JEk?%RqAMi%*u9_N,,G7X"5ODC#q.L!^c"i %D'_s1U/W5-=FaGo'^92Fb\@P:978&\$K)[&UAgZM$SSpZn"0Mt+$1+X,=%gL)``r?l,Z&uc%H!E[tHofe%Ks$>eL,H6qn%h-( %VB1PgBNt8tU"7=h)Tn]qqB^1Djj7lIB3'_('h3/U]V;8B;oh&! %FlQH/Ua@'h:,>d(l(\E,4_#DT!F3G,!l>2`@J4[ua\7MliU4O)SqCHtFIAiY=B!.=KBkF2"AeJBn\\3G*%ijWTp`V3p8T/Y,"CcO %$FuHtN`77%;^d^ZO";P`9naf=I35+rJ=`D&l5g7ZH3R7"!S+u[(e`;m'T@oiRu)(kCk,eL%i4dI&fj:@YjIYE1/\ut>Ec;AM).Aj %>?mMP)k_ep_+m\'R)cTRe;#.5iZtfT_a7,bYc4!.X*&,OR7\PCEr*@8XJECY;=5iH+OBSFfud/7%MK!N01)dR?fs])AB_aRUX\QJ %>">F7h$mWJ*=J)<+jbb&Q-UE5[S$7Eh&<.]96"UgXTlcoESP#+5d+'/l@@DrW(ms9$LEbpcGe=<]I!9E\5NAF0RV4;HTLZ#90&VB %KZ0,,i9Vh',9]^X]p*/Dg=&Yp85F944=q+4&Fn4_h]T]M+^Q3g,6MQ$cb>at>0fV''.j13=@\dUdD;eGBUoAeb:Z5>N_$)UI&Xr< %B:+8+%P"@kCn)d)<=:A!PK9-^1P,ntJ[[WJ)8cpG4bg+-K=))UlZ$,2$Hik!/>\\-Gh\s[8kKH:(71DNC')6j/BZ'Co#'8'-,Q&0 %I)/DWeWP2%$DgecF[?0Y/OY74A!h%NBE3"V+N9E&asgdSl+*suQl2/XfH@J'DT_1Y!riT$>q)7"'8WKZ\gWD0$Jnfd92pibYT;ho+1q[@q$F1k8VL?M6"IO1j=\' %%rH@LnJPtTJ9,e-JbH5PLSe\GOno62O5\YYWA>V>P0`![lP7#Z"uUC6ZlXc@d&T[r0ahS;K(4Yg27%[0DBbZ)48FIe,+enM*Qr51 %[[;[)%U9t#Jaj?I4EVN9GiaGa!4< %I^3jP7Y@8r[Md2$KKoP7T1#%TbqXo-8=Za^[Cque$Qit-S7T<89U.5-%u`Kj@%iUX.Mo\8-`jVGd>u\'D.',!MmeaQ+@``4)R+&h %N?Su4?+bl^*(jEH41im)!0^+Qb(,rj=CA!./VqIKgWa:?/::\r4%kkQ=pD3G4%i.aNP_B[d&-HND-@&.P>"2)qaDBM)[Zn)oFereNF\X[cR&FZki,U[[q;afAJSS!O1Q'&O,?l,Mr:EU`jO'm+E69jQG&srd? %:Us\$:I?VF@R*RFUR/8\MkcUgs-Z#()RB %1gKL3@!M=`hZrpui\-SC`]r\.%KIKWj:p7tL(_Vq%SL+PA>m6SHgf.4P4V9`.@#<"X6$ES3 %Log(H"p)SOo]0+5>k:oBc^B:!/H0?eP,;egC"O#T7Blh@M$'nVSr@a`,]MsJ%QVM@AI"Mfp15NE1=k5Nl;o0qF]V7\hl+F7co4&1"B.N;+ZJO&)?0?u"JJAL305eb.$dPRU3V/!\#5ZAOsD'6:Z %A:@!Hd%Y506oLr/e0HH`;_F[IQp;@UR=&X>i3#+L,N;,%=pdOS47AE7ifsX>&Ad1-$tgJk+=@e_Ql=C1cW089F-BR7H?rH1$$F0] %jAJiqps:MW9DUf;8='0UR=_)C7^M2MboE_9'$B2BURihYFHj[DKNbmc7\lekV9YU).?&#FGg^1]9^I&#*Mql %TJri/+]!Btd84:Oh-ijACugpp9#M_ApTR1DrG'\*!,-B_eu-%\OnP.dmt8uk8-AIb'EROHP6k&;F-;DU'\0IP'MeH4=MJ2=@*B]u8O/Ic4$BSrEf_F@p'@\?j-%XtS/kmGY0?@cWr %9Z\/-fP!9jEL+[5i`Jp!%2t-VH>Q=l[Kr#/)9l;Rn-OEA9#IGt0P^S,:FAEP %X`>cU1Q9Tdi_;\\H0lq.eu8)C,g\^)7MN\)i9-sIfT]2,oeO9P2-.o+TX#aEK:R#HJEqT>9\MO[[Ke2olJ(=:BcD`:X#Y#X.W[+E %g>"J6.A;N)!^A#5HIL5[P2[f4oMN&H&j2cpXYqEJl*IhIWmOX2J[UFi-G)s8btUVM9\"O9==p&_6t"1b3`.5;,`$+fVU7R9nVP0d'rMgi!ba.Spg;`&6M2!MG7+gF3qJ1/CX_;;SS'H-j`J^6Fldh3:`o$R,p^#Pm"&,HcYe %0k:g4.OAe`Y(b))/fSL@&"P;%en6Ao%'#4a28[`t3'EeAPb>#BAqX)7&h1F[?VTK'e3Jg,fI/p`.XMedR0#A(-u6+r=!O91qO)MD %Kb'FopY@ge>]_rc8.jPFtbO:)&+=B'np*ejH7ZKEDVH&<^;-"Qb6B_,TF8Ej9&0sTt0GM1n;ajR_5NH*:J&or^ %LCL5,pRI]j5BTRsRk\j(2Ae#;J+IcMNh(@Bl]1#\#TPo3$RaDr38I/4I0HnjQMm:s?o/2!bhHrna %gkg\krr2obNt9idO4ST*4ZsN7'6DM"iRRD3V13K;r6lI3rjUcihm@!%rPJOrq:A]_pri-OIt.L\MZ3P(p#Y6,rS>H1&+BCNcVArg %pY21Lp.qTg>7]=m]mIDo'.$`5 %i<`s8V[(pkJ)Gd'g7EfngFke+q=^;90AVg:\:4&A&EoNX5)(Y$s6ia-rU8(ZF#Rp_p[>2LkFa&*<6YMoY/(bGE+&)UVc!mcmSDD5!rLn!Wou4M@odQBpH6Z(Zq:q1AJ&rnYKRe\=7PI/D1]jV@sOAfT,NN5^fOID>gUlJ^amro*)R9M[k,?9#R3rV$6X %p#@r7iF?t[Q&-mGrJP#gI=:\>d9ufA##dW&9RCMj*"Ad?_6i)La5.b/?U%dP/c+W(pXa?pT7rr.l2pCFnI%VXn:rV#OI&+>g1HpG=;L9q9( %ZsDPGgct`&pYRNk47au^LRTlcBDU9N,l1BOIi9j-p>*X<(RJ31>[D7>'ipoTL;:XSj(Y"Ih9EpVYQ+UhrS?#[(>EEl(S?.]>7^&d %rpK16`K(nfoSZ)bnk\)gro[,&rR8,JkP*IuDAN40^&O_&HiH=VW!3+hrqc'QHn.#Jj#Ghs^3seO0=u %^%qQ2WGep]s*/OsW&bpFY24Uhm-Tg^+]5hKeV([hGnajrVe>_.lUu!g]^'Ggc%Wod/\3"sZg1i^ftT\jQG%OQIf/@%l>_a\qN#ie %*KF_,,M_A7+1okkl$djLnCK1Z]9fIN]VsN`GTAd'8NtYMYtZKl:E<-$s7XXBqtlji5$VClcdON?r<8C\Vn^$=HHD[=@S)S>r-_Uf %[d\P/lacM,fD",lnKIrsme,&>aU]2+Y2=*$O7:pP+2jZ7Ru8lXcj+-grU0[DgMcLumf3-jI^22,rt_j8I6EZu5XNri(ci^*a('r! %nc>NS\*3_G+%4jo=7,6[2Wj?ai!JpN=BfUb(r3QdUFrEBan-4_A[UZa`6hcrpd,+2XlEFPlim %db*R-hHtBM+^]Lj0:oXW@f;o*jT#&)6+O=?0(//1DSEWl\[pS=A+Zl+ZWd8[ZN3Z*,P* %(+Ft[RB'b'G1"bpnb'fum2!JKIVKD,-BIn*SA4gEdIj@%D<=%>JoX4"qXagP*@D:T>WN@L"$o %?:Q.K#KO*o+gCV`I&=)jL]h&=T[8_jrmT3j:RT"J!7Ur;3q,fr5CCJXc[YiRYF*;ebFd4^GW7Y-$R+on_Q.u.ds-Vbn]-`**"T"B %+&McX5TT7np%69d*`0lZl9GlY?U$B`;1UdhoB?E,:fk"2O2o`>Gj6AH8+l+sO/Eee4ro]^j71V^T&sIA07QU,_Vq"_a/\IG*O>&B %.K>JkjQTM`GK<#<%f,/XhlgqsG]WDmQNs#^pM$[7HtoC+i?UPq'U(`[q_hQ]fqX=EOLZ&!R3,1/CB&W?C&e.5rS@JQce:UR*'TJ0 %D*^R/,_S,i6>VqHYn(?W5ig>s/+$S%UP'o[DtD5&in2/AK0YDi*H4a\a)S/Y:oDp]orjfGD6_X0&D& %m]1*9FRo4cg,YIC*X*PB=8qD>/1206Z\Ij#fOt3V@%?fIqbYl,R(XHb6J2e8`+0qtk(lhVXVC %>-kB\1],htV;3oq\pK175Jal;4K'B9h:VN.ce"aFaC&c4sNfMefcfX?aeMS:!kB&[J(I6t]@S!'U"`ZfNqX(anQgJ%)GS,c$_tI0AQfbO)@Q_6uIf9"ZgPrn+b@:&Z %c[[CqHE2`R/mLoN`Gb(OL)]h7Ucd5(InSdIkp*a3jQ(IJ?,ZIS@^FhIYHuAM8R;k/Z_1H[DH' %X^)q8Z=iFu^>++DV[V'g;i<4hC^BTa`10\nZR9ok:-tU-fk2OYapW!UXMdorNP<#.Ck*R!u2bNAaCe_sgi(nT*I/W`mX%2II %_pt7D!c-t2Uq3cZtqU1'Sn+tq6E?"q/pVT4Mmem05s$\Bqqskak<[?c,5/GVVg,hC[e>8d#\Ho[SJY(m'RV]J9 %jojN*")Mt5$b!'#$:nE/+3YX_m\d1`a&qkG48-X_k8+$BZ%F"&.n %!W2C-Nh1c^d".r>?jCKDnR"p[7_cm/qgH%=,tkfhXet]DF6&Y9,Ea>_R5X!Bp.Sl^MaG[.<]0S_;c!eup1`Dn!6bpo.oYDGQJ5 %5Mg22>0kDs.+qa'@bUdA5`-I529ZHXtHA4"+_N_Cik-BuKPDU!k*;*61THM?pZ]:66e&'o*9n2q$3)!1X0'`K?+,94CP?#BUS %#E0jqNkmB8Eq^'Z;msXmfN0'?n,dPsgPk*I,TGH7ah`"RSM[)Rn`q[rr1/L+"k!(f6_9hD=n)+eS7]0^hVS8 %$qIA_5cppNP$%JOCj8PIp'4ski+_N@QuW-4&%qXJ(a$QE4u*<^hYuA9`df:Xi28ei[]?S@I'gD9So%IAUgaBN8?4$2eWne1EU%q7*C>F4]B#P#O.*WO2EfmPl[[]V$gYG]mY"5*LGl**m< %VkH1jh`Z@8EI%5rji(7=a3)l'hDP/:=X!,!m/E"Q05k9/XT)Z=#:5:Xb>5M9n0]=%pYTeN#CWADW));p^3Sr`=,d*_XZuQ'A&,Z9;n8(>l=qrpB[?eM_0bjtHF):I-A;f=j.mER\*^rFiihc])sE=H3a3+Y,*Nk^dg)=S;cI %EU^-f+'1"A:\Cod_tWscpX\HkpO6anmCM03?2[+Z@8ABbIp37Kcalltm%LQO\"uUW?$H0+lUrKko<*lIm.qKEp2A9^AM5+-+2>A" %g4nJ`GaBH>ZB(a:mHo>1o`mK`A^AftID*e3\:s\M.bg]`a/eP,YHl(9U)p@SmDjGG#aaELbl5ZK^]Al[-[?".8/6Ob2.Bo&fua\5 %W&th7H88ZPA6\lV&+XZ+Vf1Gph`.9mpda*hH[?=9PFA`d[.OCj,,e@'i*b:!+P?B'aPNLY8"eF^D=JE=])5'h=F7Y7g_RknO"0Op %>ucCMqWd#uf+0OMiU\dANl-]`5$iWE`Q7f-=mo.XG&?h)s1G0iCZXO3MGBD9tJ3dM=.Iu?+7lLUL7O0H/*a.i?kkM-Z9pJ^&A5/tcq<5julIK!G0 %I/3*?2cb3W7#<0rrr2obO0&^89fNmX0]%YHHa]GO*\XiT0V(hnOR=lm/E7$C_s>="kd8a!P:*&RS`>f-0"&#?eb3eta4I;MN'#dcBY>^#lTd(oL$j(%4U]I!S6XPJg6W^- %MsK[G9%!ouRR_XkMDcgYo$u@A5]&`,K@a7Jg%/:8u3%'n@T>A2^on1f9'>nYs2+\m;.J.=i*FD<$ %E6#i]_55i2l_#=YL+'6_m>LS[[TA18gA`rngSUB"hSd=t;T=4fQf:EsSKG7j+a>Y'E5RK'FDWkKOP$t%j8!8'@WDl[B%DsqgX8.C %j'<7:>J0AlKYbbk#d:r6C3-iR)$1S:o9S=9qa,n[V>9;(k%XjD2Tg7bian)d%=QdqdX?iCZab!:*I3o5?4A,eE[/"p\g`\NdD'e.Tfj:YN1n*o&Y7pT9ZXg;N=IXO_nAd^9Iq([2j67h<@+emuZ9B*+P'`S82?3[jj$,g%.2o&g`Yn8VG(%$=W"`,p@Db^Ht\t]2!:"G0Xmrc=.@Vd %=&*S$7"=*k,6bcPC0Oa:Y')rg\T4]T"8iliI76.^`cdYIDDu2i0\b!s;ijL`Bn!S8,&#f@CV]6`B_&NV?aL(&<+!=Ag<+0AJ6T^@ %g7(Q\q>@sA;prsF]RI?O[TnQgQRcui'"4Pni?!ksRV[F$g.D>BY%_(SU5%Bc""c'QBq_;l5@g65?[S$e<(E>sk@NE>]#>;%WL\5n %8-aF,Ee@!C2aGD<%j3c!a%,P_D7sCYXdtucl&1C[%rq#&C;"V7QJ+p3\-cd-G79> %Q!IL?[[eM.:VT;TX5"gR=Z]jBc):m/>b#7b5'V;52TgTc/NoZX5+qL'#H&J]athePSI]uoEit*MlJbEXoi0H]]_3k`912f.D5G)= %Hmed!U85."g#`a%/$!t\W,eFlegBeZWi'=l.-jfZXO=(kL?iI`%C#51?[2uVS=Q=t!)pkFM4:38\oGr^^Hm32'S\Ti.W1#V]?U"r %itLTRVlF$e;-rAKTTO(f=SJS.e`n[Y#-/n(It?*4=iKc59f\(jitA7o3al9>K@1ZOhe4@$]+[TFB!#`#i%=kGX!+7pu+ %Bpaji[e*PVp0!FI2Ta7a'oEY,/%3bBe(Pe#FE-Tr(u'0(bJn]l%s\R=YIXU^L#-VJ0.4,/G]ZXpD:c617!gUj?(S4-s&kXAP"Z2NN0.KsA_Y+E>"-nAXsco\"C[kV@7S23AHRC4gLpNfDGoc0VI4A$J2OI8Z5$=RfB"g89XMn()XefsuCP %6,!FS<&)LMOUi]59JE^)g!73^pEtC/ZWHI%hTb5!ijJif$Yh^,5O]8YHE\Gg\`anupXkm;=K2IbSPnQEC!4\dW.u?C*n"^sUE8[4 %Wl;uQI4'eg';pd!kcuLCONl.*I,9^!^rC672RdI,`)SDCVR0uBhsI.YkWlap,>V_]#!,+_Am;Tuc^f7?2_?QGieW;lau1e.NnO_S %.\`Hhm9K.\D);D!G7'a;_.A&'>rk)$X]LX-qU(Ed&A:b\V;%Sgi7mhEU;\t.13%5&:KhS^4jNr1#m7;/m)Hk%h+WA>.V[CNbK&Dj %mcE6L??oUV.3`TC&$.A02f.rEhii45c#;VoSpM@/!FEbZHLA7K=WX:K/d@"MHkWk@IT16ENM^TMHD+&i&4+#_n %=*::;&DU?uB;0Hfe+tIC^8\JV;KuV0;>?pf\e2S]lYW9arlj_+U@6p,8jRWKU8>aHYmCZ6S5"!<]d4&@e--ouDBLrB-;E-QjS&!T %)/QWCSHoVjAGH@FA-4n9RTOtdoXS.\WX/9f*dq_U*A:pN9W.tp73e+74pK1XiRI;%NqjfXGk>_u64YB#]r*:*Hl<ju:%2"RrM2E^!u %+`DuoRRm#kptO/3lF9B'%S0um2JbGf#DtJ0,X@&GGcTTSn1/$*dY3.L;^QS?KOUI\WGV@; %>,EpZe]YWu`=<2XF^ih,jqD[g68trhYTK$5CIo4m1NboJP9OZ9B\$@XNYje;BMI`Bkf&+-j]Mh6)/4D+ZaW0jfF3k!\Le)'#NTtQRVKTE:&k*ZaV,(AOZ"efFKH\GQNu=O%Ed@l% %/SPeB[d;Xb'#aNOt@+pG3A %JYTRlW[[l!gm3%&B9D+@t,3MfjdE:7,Z_7MFGKAo/SuN[KFDDE7/#^&sAuoQ%G(GNkS^4B)N36Rg_m/^d.ub0/^[8X/jLXa!%J# %,!WUD8R#6-0gROsKFSQ/1lu"bqh'E?5#p<.?92QKU262Y)Q4ZOc8JlD2e$B[dUOcGnM`]@8@S\g.'JWqT[kJdk;6(E2!LRWmLe-Z&P!Y:!^dT10%0DV67C#:7T1"j&.=dVQf(gM"#"pS/4D/AIDiUD:h)=='22+o%E"%g %=iWrLWl,&(WckICOu;Rd?mi?j5Qdh]M>)P5j+UJo&k[85D@r62d\R.qO<,,3R*pLjDmV>FhqG2&mCf9tXBLe@mb2?>!0tb.D8]Cb %&WB_koU'=&l"A@1QJ;VGp^plf[S%'W%?a@QLIu0"&>rE1bVA<&*1Ws/,AU3HE=B,Za^$PpQF>B!]b'9s-[RFA4GFR\MBnCcH)[ho %Q(WJ8TOWe2m:K+ph,FpB'+*Cnbf_dHD1KPRW*"J(,g7+(%h?Wf4+4Mf(`eX\Fs"_$Qa!LiD*D=I>'++20k9HiQLu?V`[C %oZS6UI,o-e7LdV):KC41Jf(ut]TO'5>3nC"(]$tQCZ+S\U_5C#bAI\EVCD3uUoLZd>0&S*k %@0`pe\VlI*ht=*4b3%$-B.uE]a4ean?8)Okb'>s6&b5W>TVMfBI"gY\^uA9`+I"IeWPtD"8)u@G//I %h9]ud`$V'Mj?"O=Ukp*GD4%mF8$tnr45no'M;=81gr)t?2Juq^FIVX(Sa^JUnTR7.aVhf#`m&VY%nF0u9(Ck"2nSuO)!Qc:Hir[] %s0*0j9pWsTGW.1`%n=4bRJ_=+TlG6$QXf4QH:*h7:5JFLL*[1`sebsC%cj2jOP"NNl'@g>8j1pIE6%sR8n %KCTQqkQ:AF%m*&J`9,\YS0q%t!md&GFopl!'0AMP6s8CRUk^:?JE]W=3s##Y/9ZR/fs9@clTtHBJ3=e.:67VQ@MdC_['0pScXu>B %JU>kcmXY&m+*N5(8IIT\pr*0f$,S&jpeDqqBjq;aT?P4`5X'"^%u0Yk.J(A`5-2.4i-`tk:4PNB@L#Gr1p@XlcgI54L\5(&Fo_6h %hX,mk0Zjo]pYcn`E.FSV<'D;]#LC[*+?t*NGC]M29G>]i4See;Sc%T!\%hof!VSH#)'6',SQlfHjL`#_-Z?c1q"F"6Q9"sDV*4KS %qeu@]J,0,us5I\I+"nZWY9*-2nF#i/qX3W-pCCVYqf))Ce\ga!Hb$E>$%H69dI*>[n#fE7GQ71"2tnhmG01uGe94m$O8eb2R-NDq %`!0etD&:R0-E/LmrBDjYD'PRlZRLurRE;EZ(C1m%@T&CDN(C/s0o'1/bjegJ3f_gS0T.8F6LPa\6!KB9#;hMDLX=e-jF'A3+Qj8" %gWkhR6B:Y4:J(_G<7W7&mrShPKafc\?FDKI82C:d6Z8P6iCJS-6D7'QWP`?TNJ&^E)W,sajF$K55\ %I^oIgG_sAF\>4djjX;DuK=1>C!>@K)]>63fm0ZUcM0"bM,VO?2qQ-`,2Y(_.F5Rqi2#B! %**?L(5_B49j`Omf*.T4A(/59jI\Bg,_>u;,#8J(TjtpgQ#W5d#^GkbE9L@?QCeONn["TBH`6g*C,LtE`XT?j=,h>>6[>H-3hC<8b %'sFPC$cb#kO:`e:m(;?f@^aTPUAuNDilLNtH<-8fap%qi`(e>#cuibji+8TYO;f;P".[o:=oq\(c72L7SCiCuHkL:(Pa>q^]CKpo %WY&Z;SR`G42Y+3Y>015/?Z&ie?:5Qi3f>8I;#2:]gUba9nhgTb>]_d,$ELXK($fK\T2DdkkuWRm:Z*=u0<5_#Qd-5^jj/0p9OVO6 %Mbp*sFYjdVUNtMn6jmE+-&I5OFEp9eX(f@h[Uqq[/=ElMOQL$/6*%lRPZUkb_X-Qh#80)Vj\`+_8K/\-2&ZY!`CndfrMRJ4$!`C- %XAKp:fH<%O-*gXkFa0dOO2Fe9-R<\m';WjfWsB#5;-?R>^Re)V'?,h??$b]CM?+]Bq\lQk))DeK=p8"L,fk#KJcER.nPDZ\3T\%@ %44O)k)3\[tZW]8Ggq\`e'0/:3aS9c'A*XEtTW+t`DRkSqA8sXi'b@U%86qIY-K?>k"JK/:K80@OeV2fY?H$[&Gd`-T_D]r.iQ6`@ %'^X-HB_d(`7"g*&:P=jni&thYPfAd8AV\'.H\fB4((Fho?WaIA[XC-%" %@&T9QI?)_V;Y.gc:"NKF@SaBke1&EY-l_,!:OE;1=n7qr`1pO?'ai:IJ<`$^U7D>OK5j6s`U9:_&i/8ir3"$,MLhG8/6TX=2 %eF4JJeLmi139%T**'&QS*NsqKHVag;4R4DZh/K,:bN"R\idH>kZ4BKq3j6RW_/g8]lSo %HuFI#/CakC9H8qYLTCc>;"A^!BH1u4Z%p5PhuIXk)/&lGk?r6I!bJ8EdK/Gp2R/35"-nQ$n-TdQ*"Sd`,:1K_p8UYe;Dtm,S`jRL %QsPlT;1tGk_87XnPn\K5O_)sNj/C;428h+t6#`s3ZH]2Ali.j00R %X#go$8/r^G3)om5M*0?M!lEHl0p5G=H\SbE'!+b-0p7[3*'QeAIE:]t/=($ZDg]8]_cmlLD3"P;$A:LiI %QF[T@'e&.1FB_0LHO3G6@hge^"-OQ,Vd2Gr`0?#_TPgK3L]h>HnS]5NRP3Z&'@Tj2LSa\E534JLD+:Bn3BmK`X\N8HoJ*nqtu(Yjt9Hj[LTP!+i>F7[VMW*%&mQ7W3"[C2t=$ %/"bURP[NO^a>im^=L1fE&"I0A&<=V1cGdm%.$9CQ_$6;1$dW;!_=4d`!(`S58uA6e?'[FKj7hoj\lcXDPJ=4!`l.5t^k9nR1BD^'l]GEZKHKB-]:s7sB=NFL,s`$/aMW&fn[nHB4D)#tHFR^sHEOEq3A %>Wf/7oWjOOKYh5rLAn!YS',d %Z^QZ+PDB7h/4M0SN6&OTf@%IE5D&373fd54M&Q^hO9t7n$_"3IKVK31;aqao)F2TGjmW/&ZH*?/5^H>MYu%h?W]EHm7E@(.3]'Z1 %&N@/7:q[Gj8jX7`nlVl$J%8D+::%oIeD7.WnM*UEgpNUUi"*$R$3Q.8W@mH;)DGS2Do*cQ.b_W+k-L8uf=EDQ+;CL5PD!k>Y'8$; %*X1(Y#qpG*7AkA'/8%OUR<)rD,;%&2,-.3\r3L_6?(?c'T4RY`#US&068Y>XrmbX/iN*9JO?GKU_L7N.c$DYbaupViNt9oA]hVV[f-<)-`<@^ %cqEMrf3uN[#T6R#f[OI!PGoZQ+L[+sn`l0U/AQQHbS,gBs"P=1&H'jhXQu!.DjQP5H+aFs7.bK-ZS'iJQo:II?bKhFp& %-7hDN-D;8k,iiJ"LKCNNGff_bm=@_ck3a+-f/J+&=DooL5=LbB0q-V"%m-fug$pXsla:Oei.,d:GKXFtPLG4JMW:WlmZTTN`2iJe %=L,k]@KqZh@D4G$_8$c6ZZNS^<,gD?#hLu[lEe(DV9m"!G9)Ln%h[Wop(5DX'6/&Xt8jZ>htB*]K>_u(oGFdZg/:[7Ijt<@pStfe!!cUDO7C_ %lKg'qZuqmU31J!!NFS?:D#$*%ppjV=2FLY_7\Cb\<2CG4??*f+p]t[br$Si:0FZs?;lG5?9\Zf7\--[ld!MSoHI7XIYb7d)PS"2[ %Z%P6gf&ZRB`NumYXqo9RSb1X(:c0qK!:NhUNJa2gbug4H&<>5GIXir-KJ"R!P'tMeG7k]dcWq-C6)SK2\uE-_Cr3ge,Li`4(b:8V %$Jhd`1k9Q#lt(h1E@_FJH8(1g4i#6AKPQ]7=WOqakQLCSXtI["NAFN"!2`oJpX&?>OF-KQ`j;&$klP-*D@UjD[&Ztt64A$+3#h56 %.dOE:M@?.71F02X:0.k,a^WmZkF"E!Y`hsp1r36IEtPqUJjcm]g0^7R"OT)TJ6`<=1)2DqG-@&h-^FJ,\5gLVQB>IgVrW^ONYjJR %%%ISQW]QE_Sr!\Q*22b9'E9\]ArYa+cpS;-M&UOhp"=I*MblrSlq))Fd%(TtRerT]4^&]d3U=M=O9)U'!npZKngWUY'UV", %6t]o#P)i,9od?dFIXItp"8fp.s@,u&;];fI3/54?6C"Iq4#2_`AptM$+ %IbsG_:h$0/6HKC;"Ns4a4iBVoP@'@&oTF.p'p %^e[,Z"MQ5"SFTp@"qVI!b9VJAt8",Ztom9[@Irr&ge7-%biC"tHVU/Eb>S6D[+S(\/l)8;G2L#[BsD_"h.6-;*"Q9)Jf8 %_c7l!<1U?$8/6q$V+A3Re]SLT)P:+M=`R%oV#5$81##<:W"`A;5/A1T"d8K4IZ3/&I5ZjLLAF/CjnDfo0c` %R`&*W\n5Nb9+dcDbLMY@C5S+KE!EWO5)D*i_;hjLWuU2eY?!hJ`9Ta*?kO6k`*(kidfc\DV,nEQd>M`'R6))&.LBkbu676I1Ps^\$*_%7hVNZnC15&24G1cMBFRc)Qo1B+[=JU#3(KQLFDQ+0Vkcn7' %EGj$u5]KTc_Fa9d^)*[PQ*e,<-j*H5H6U0c$Rg-ga-<,K(L-BN/l[WA$)=AHW=TM0\cIZ<-K^Dk6sg86-DVsZn?'Q8&\agS%"qn& %7SP%n[5s("KK#pg+NWOIW4\25u` %#G/_Mgs$(l6iMGQm,O=P8nLKTsnj_,JTT5&Oci=nW`(X'#20iAD7Adn!k#N)(Q#+,N3MTkd'.e$JCJP'3ns %Cs:m(SLF>LJ(59UW<3q6'H,M1"DGXbLO&)YK^B]_Z-=.6N!:W6\p#WfcQ`;>%FbV)F&b?K<(YW2e$S?$Jb<]@gpCf==:5J-g:a$a=jPtNS:HM9-")WoSOH;a_?6/>jaroJro:qqg6+e^`_C>k(X&k2JS;4c)_!Fh^@\oqp %0cNI/mPNlWMs_Dd[`mk8?8ce,"u!a]V+m'qh#Oes-#0"CO5Q];dOBaZRQ(=-XG0BMPial(HqI=r0\ObcM.FAX\8Z=?G8N %^bi$E"r>!k>p.oJN(Vqh;oFi(8scQM+aYXF'DUhI/=NPtPP%cZ(m$*[;sa^$Su6XhSp2cM(jm"T#<.:(j/Z?=SomO&\ft[,1)a9D %s%h7*LN-"*X]m9.iSK!+68Ne='u5?"1%RW4$OI:L01-703QY[Y9U:t_8o(ar\"Cn0L[_o5)cH(/dhR4NB#.>>Je4HSfT;<53jU!S %P)$Sm\mk-.@0o"6ipO.:BtGRZb[=(0St!r05jB\@(!BfUQ+>:[CS&Z#%/l&2j8;HVD8Z;&CJQu:4&Mn@#WW6%pmN^Bjp[YIQ0FMj %X%`7-1LQrIjih^BKO]#`HVki$;ulM8bVSQr7@[!,I+J3`[_X+lpChZi9o5Se)`"%uX]S,N;l-XD]%Wu_fDQ!E[:+9"S:98t2[PHe %Dt:97'+hcs69rj:H^h8'9aLFG!OM(3liONF5hsdQ(\$77LA+R+ICshAR(`Q0TA80ATD,DfXY_fDbV.K[Y5-9.0+dkV>HY!\T)JX6 %gq_lUC,DW:fr)34U58lTC3BUIoSsh&iToE"UD1rg9IHkA*+[Zb:oUTX$XOI"&6$-hn;/9T'-42X=U25Yhp=5*`:9._:;V"h8O.Po %FVr_:B#P/?_Mqe)"L5O`&'6QrnN9]*"gN/YetZX%I*Ej>/&EaD2Dq]_L@;+2UTk],6N`n7&#\p]q6qpcR9>=`8cqW'?O8el@?T$A %/gMo6&4TCB@#bH06LtcNimX1&kq#*"jIjt"7P$I'WB&iD7JYT5I<2t8oX21=jjX`GV49#V\s+VLOAqF[-]J\D#W9A8(@VJkDE\'G9^N1sEj:b>+8haR-8[<6[lN %E9bR(m*S,"M9HohC.&uQU^F:n^fJBIcRTG1,%aQ*=/k\*XTp()i061a`DQeVm]'*)*&3+U%=h)a&f+K_CC,WQ\tkZWHI%UFJ.&"#5gN %d$92=;U%QBS'_9/b>\A\PLWE2](9Z4B/;fQB[P^iV7##?7m+JPf;Y[Kmt[b&m4bB_V,Yb`h4=Lj*pb.V>1aD/<',e?s8PW:G9'>> %>tOYrnfP;fJ3&La7tdCb/!W.7(cd-tFc1GGrV(Mu1aA!o1:n&N>*bF,L51OKk^44WF^J,f8-\_mZEUNHr5r5Yo4m#mE(A$p"??Y\ %!bWPdSu<`T8#F2&:u(uC"$8Y9^+!'A'jagAn]8%lj#2,eLI=9)TY>"@D"hqB/MlF.#nYMmU5aW#k*A@FouT!!UISr4d#m9K=b^^H %GOAQ?3]4qdqR&-B0=lW[UR0YI(@j@1X8>1@$A*[*&U#^P&6>`aiZ1EUNh81*V%&4aD#'mZ'!YrJurS-5KCRd#$8Bfa=e?>_R_!cE"H2&Ic:SoC<# %q[OfQTnp"\rMC7J@*hj0eUpefZVa',_/:pc=!VS_=m%p(:W?3G#U:+_&]qB-N)e))pWsR,U4l:D+_s?I_;1&N%jAJ-$Jh %@u,XUDQ"\ZX;[lOWBGY=[ZfSB,qogl\BeJs,t8@PJ@p\.1mj^K,+4QH7i]G.S@^(nDNL%qnd_@_UX7),Lg!Dr-Q"2 %0ojM37TO[CB]Y3[O_CB^\Q@,B(R?:k02T(F=1^prdBa#*'.A1kR_/:*Z>.M!s*#X&B(6Be0cIi4!B/r.3+4AuD1n6+7qaI`uc^0N%<>H2Y(t@+eHTXmkjQ'@\7LZ!iG>]9G%E?OXNH&A]ae1o!H)N=RPXZ:4_[ %]%hSEQ%?!7DhT?B:[@'Sk*=gGZNsl,T:K]g2@JHqDr@'_cA9p]Hs/pR`mu1g.4(_Z3C;nuge6m%Ip(82CgR@`mV?gcEa&5/4>,/)U4L5hdWf %mR\$TJe[,DkIp6_L$8`g7+h^Y[s1P2]5c\5#l`0.HY3s0@5YtsLnVA2A#tWm!PU1[gEb_E;=criUUgSV)-D3P5g@r8>>OW,& %!eS]9J=do>S?K/[bZ^jG)'1Dmr]4teJ-*%^$YrW36!Q14*!6+aK2Eao87d_%@Pg]S=Y>PgcO5K0mn_EioF!mXG^(&BE.X2*rLcu.g2$"62R+iBI$iWea?uCb2$VD44ALu@AeblL:`;Pum;VD]Lnpc$Dh21V0 %d]hUo^UJU(a\>K06+?RfKno'S'i\0lPrs$fGWF*J?Qkm/-oQH'I?_B[="sK-9$2O@YE'RHX23(3,>Hou=$E0/q[:"/'oNsdnZG'* %Nu`=.1_fr_-IL:2\u$PYq/@h[jhlSTL*\&HjSj^N`?E%V3_pU#[jZjm7CpBh/6?&RJNdMUp.Oo<8&&1M5%4_Ahj*LCE_Rq^;,O*i %'0h'7(20s;5?c+g@7GYb4H'.Qp/m0ahGXF6i!>)lYts9[28n(:7iY&hG7FUs=/#es;sG]+s,A-sB7^a^b\#;H_+5dXrk* %/nnlIQpr:)8rCe>8(J[[cSBMR^ecF&7E4>tCst^qJJ#SaYsT4U)8jCrR%(>CN%.d*DE8)BA6N6\)[XuO3?Ql%C`+"=qV!@kf,rRi %4>b)@N9+TGf:N^-#4GffP"$auW*+XhncVQaR'_RHZjfZ$GS4*]e;=p_p+>uYR@NrSK2`_o)>s](JD0fYjZ6M[C9=<[ZcrQcD-O2? %)^iI9P8._")7id^JZT/mqJobDfVu4_H2ho5[=u%fI+6pm(DV]9HuREnJ0G4n&%Y?7q`9 %Lalk`9h1rnadXqF&e$GJ59,em+#?#UW2?^ol5qThW]=2IC*p+1d]k9sTKkJ]WSg`S+dF^BA][A.dYr(kOLY!lr^)a8@KpA^I/70D/#Ud[D4/aHtQ/R^>k]5^HVKB[#Pmb'C7r%D40k?H7L+n&`BaCM[-qM %VP^kN?0L3RdhTJ#$=o$h/Tmsp3n3QsBp%@l_=^3M8eh7PXHuY3AWfLY=HBu=X%_A&'[50W]Cc$YL36)i"G.`q"RO+_6H'kbXA0NF %+WDlQQ'Q9\0GU2aEW[+%Qc=W_b8HE+)Z)IkKk*X1>k-,aF>f;MOi\5#JWd0UaOuk!2jkO,?>];EUaf73dB0OO*PVV2@A4Hs#1C49 %=VPTY2C!TC:'hrMo"%\]6:0"PqFI.np5&C/4?u6_<&@1MNh\.0A+DC_1L_*C>'-hY<3'$HbFW6sL'lgSft-aVC\k6ld%p %d=XNtJVUb_C-gqO&?d.T%4llX$cO_FkH8#E[_\Hna3g(K[3B=U$j[0I3@qlR=VpP2iFp2ql38D;WB %QU*0'\[EQ;b>"Ei%0a %&/qU()T=s`Z`MDAl/V,,\QM9K"k9DMhJV$GFM"tJ\&[QBmGKeh[J,07N`NXY$?mBrbBW;l;lkAV;U;70CWf+.J<;@0B@qpF=RRQ6G-M=]*[#i//1u)+nk'oc:cJdQ'MN)T.PMhL;?2+6g9u=S5^Bh&8T\q*8/'YRZJ4-eGcVLP!f9/NAP)!;&e]M!+9+!)7DPdWd#h$NZiYM-Z[S?TSBfZp'?/E$gfq(@=cTr^="[+kcSH[%Lui.SSEGQ^Gb_#L&ZM&FGT,(+b!@qf?470nSLE[^neHtBkl;_&bW>>t]_T2=Uc %7+GY=JU@W+P1_Qf6e"a7M*ngtKeFXuX1kIg^Rbe0)X4=sc_;N.:jF4l`+&T!5OYP6fKtj+.=LY$BY0H-dd,qQ6Bcomj_srepWW[=$'a41VN/,I(U$Y!ZHl9K]$r=p9k-fD5Mk!5Zl&,iO1PCJ/Xe2L@a`+ %%s[X#aN,-*NdO7X$g5uG%GJD.Wj,:d,;Ef]RY\HdIr6R(GrEVCA=P$dc1Jj>&iRJhbtaS>!O6&Zk'OF03Eq\Z'cGPbY+ %0:T]8$`;JuDZK:12I'.O]\4\_B*[$Z8`Y+d`tJ@tgcdrSIOeoH$Vmj#Pq$27^qn@]'u0kH98JP&\k@%d<1T"7eD9VdDZZ_O#nX(PGtC>t0Z9^#IfkjC(*uR$T\sbCU8D<'Z\iCNf8X]6G1XZc(UXT8.b1K+/<&i2%Eo`fSVVGSB.O6_ %SSpr'fm#f@kVDJ4.4:t=H5<8%

6bD*'!fAD?+ND=3Mi9"?MgJ;EgS++6'Z\kah=\ZaKE %>qL]\o+SkL%Ve?e:dI!M3@W#_fab53O5pUM8``NiE/$+F;C4PJr2qhQ^T+uD %)F0k\QuIs63*=-u1]oLXrpGZ.?6)XV`8.3Q0ta@,lMOLJ9'STKoerGa>KM6RkNg"\?iT$(qQKo&B0t)rZ>Wthh&!`8lbQtiSd$%M %`(SLI=DZ2@3(X=XlK4/sl_q8rWK5$ihAb1CW`]'63$[\Ki%.J!=Yn?a?m+<.jJgo:#(#VmmI20)jHG(K,*aj#1l_Vmp %T0Q"c!\C2$/(WD9r+n3TT(t&UEmIt$YM-%E.)VqH96&3lIdA0de,5Cb[[ %KZpTOh-d4anYMoT>4f_oi8ku&^Xiqd]XXGu=X.2/Fs!hY1b^Et\;4-p!*n-PbQj_='QWZBOQ2Amk9L.,fhZj\jV0+f/*9g`5Pi>8 %Q4gXeo;DKT/CgL$\l9B2Qn0p@TW[N(Bk$2l59q(DH;K;Gb1pL;L!*]0?7K5m;O%jY\`:cqhs6;L6[o8EkiX";I=)5j4sqZ\4DM/& %ai!1^97Rj?cn]qZ<(b`H/WEq)kUunH>=SfHa;AmW]9gT8![[.!Vqa9`G+(%Zk0#4\/2u4:sX@+B:1B"hb,mGTG98 %#0jskP!,oRW+45qf'f/YLu7"dbL.P(_?Q81pEOQha75gC_?uc_Xd^V_E5t7pL$u"G%d$d4g28k(50;7OUf=AfkDF6T?DPE'1H'!S %oIequ$='3F"pK3co\dG^J0,?QYlKD%,@2OA?U8Mo;R_e'GC*4Ebor%5EQ=.fQPT+9cm@"&[nC,#^t8Pil3iDuJ_T7N"DC:(]AEuc4PtpRPU9VejD)1/CXMp/[%sIU'M#`aB)*Db@ZYGNd+Ikp=$%)VZHWGS7qgl%7XPY2$#s_7\fCWZnWS]9g$YWOc %@]@<`<10Ner3&.O(>OK&E,ON--Q;;!mD7Qb?p!<,(T\*$.9,&j"NQKYSh*+N)t'uuGFO:>/4ugdpXc40 %k9n33Gf+scf1un"5n!(kmHD?:$=7nB`dE3o06UaB7I(G,XoO+0cinr9_&h]8QrCDXS+\V,L$9;-+Qlcj-:^\RE7[Z'C[S#g3J]\]Mo)2RToM1PI'OiM"lf!]:d %/l6`_H4l+\ZNE1:WtrC#0SduI=Td8j`YmTU_ca)1>3r1F_=m=>Mb8Rg:39@g]6Bs0S,>kQ6$3Y_hc#"*i'2.n.8X< %:2"6^bcI+"GeL)cl^cN6G+T$LU.V-FJfO[[_n`QUFPc%,.b(9)_\'=JrV34!]G@A %3A[)]r$h&(du;-LYZV1m6HppQ!IJOjF%;a/Nbs:_H;J\C1sYZscX5(oYeAJq\r/,.BAF\\0)Y=6--*ae?#_r!PT[<9aQa^+?+8Cl %dUXQqZ-PdgCF(g!$WPt_(UG"$:knCq0SC:G-aZMKf9NeV$U\mP4Jd3-?fkMqe%>o5.c/u_cP5BI_rpVj^8dFjSpGt#'m"Tq;DpL9 %/JH0A[+!q*0^ORg4MD@^%fH[Y&aRm`; %^CQK?Dp,bCSWa<4k.!0mbeWPDri]-DYM=FU_90)=?!!`uGN;eV2l2$*n+d\l_&/HI]QPtqm3Vi];MV>\)(1;ejsge-E&/?E]@8Eq %5H[b7!QL,E">KcH#1&6Z?;lDb8BpE*;FQNFc5@kC*5GrJTP>:X=*OlDh#@@*jYF0e<0PR+"k?AeirH'#7,2^lF='EnGV_'b"aOa\ %iq0&M-)[d<=WYX:))T6AY"#V`Cc^4OD^;4>C(W4X_finOG;H1Lr %1)E&a/9,=6+NflhA`U-Jkb3F%!%@:g(F9etH-WU*d+j'@?H58>G@k`X[jaHnf?XjJ[`sU.m %n*Y\>_5t%UA!OlN%%OTs?UfY&I&u_(A[p?6P!fm!"3#X:4ZKV`)hH%SD[Po`pG_laX78rI&LMu?L?mhjFj^V(H>9'^=hF0rj.q(p %5;`n9I",$4k>>^P6#Op0pV$Eo?NRedS]QAq_5)Id3_=\5WG#"/.$6<^SGDf%Ca%/Ebn%gAl.*U;J@KC`k`1Lu;20&rT1).YeULqk9:>*%b %2-J\7VZ4q<&/JNVohuTka&VZubAfnbR9pEbg6\?fP[r.=k8.Bu(c+,IP`Cc_`aL07?Ic)?ZZI4s@Wnd6.GXsW?ch%0/5BQ3B3?I)85ZZ#?`\4:j\Pg9LpjuXIa$@R>mo;!/HqE`bW!JV6DoWW3[cV:J %%bsZGq;4*c_/LpHXabii0Mh@se;_/<:0epqp!=Ng;M]\S2').mQgPGcq<]#Has"FXIVD7YNm3<*n*@%V&*[6%`b/#p--Qg<4ZjcG %7:D':,N9X--bfJ(VJ#:u"5N^q&33&bA'Y^)Ag_KLG2LL%=jXKjcR99lIFY1PT0;U$UB4\d]V:he %@AD#)QE:a!gaZ:]530sfm?k\'$u31jmY6!=([H.Y/@"dBh7u'iBoTeMh4uMEkRP_h_;(S\hdE*>MO3&&A(X/5a(LcO$`^>m&P!R>Q6581K!o<%VF>E%.*oJdir?7unYaDucu)d$i>dl`05IUhmb.T6j;u %/']#\X!J4I!->>8GcBL/Sot3sOl&7k@+M`M-.ipm\!CpDiS&ROUAFcVlS]DHpCf8"FeTBL-=j?sJc_&=AfBhFnUT"bDMNp_^oBXOh;jl(m._hUoE'8)sE^)/)-K4WHj)U6\;'-Yk,qlM2S&2-`j]DD]f9,m&\r7 %Ip;6s]?`/EDH4W%6&f:T=o5D*DQ?brPf1[jV;6qb.;]o041*M1]Qc_PEc"9^ %37@cd0BM,S7F'.(;b7<2+3YFQ/*ui,;.^_a^YNPJD5_.7XX),&Fu&YD(ruj2"\F?30[M+>FT!`JL7;f^DAR*<I^oOOHP_sk? %I`9abp@]#:3Vd`M=gtf\ED(lU!*.\"9ps\b)e2!#=iUMoC[;`3MND %3Cij1-&'-,eqPgC_<[eX?Q4+u]@!LtdGUkhjerp%KMoGYf0r#O3/;"qQ %i;X'Z#qZ6>aJ-$#.=X"Al+j0RGm(S#pHXsi\*u;CjBW5=o0^?ggh:XJ5ZoqRK1fgs<#0MkRYBN^5;$FJgen$iO&d)DS?m"M+j@Rq9/h)>Q>9VJ#k\Q, %keL@H]J%&X_F7fS=iI_9E[K.]6GNc>5ipO-/`ijN.-QHFXRYeC/@o!G0H*I9&fq0hB&V`t(rN@6T*f2UVh1N3q)&Jg1,p](<&IE7 %a]-4b41D&!E]fc-nL^\r'j#DoQl-`BWbZ$JKlmbX8+0(9V__jJYAS9uJplKVA&oLm;.%BmZ;CbYinpot>hLe'I4%On;1SK9OF#EK %J.Y$9Jm%DF??OB>c6AkAiqU[*U0E=1N,'^OZkp'aX)L4ue[EALi!'LDN@TXF %hDIk7@4@2HGH9HoN@Ht<_\)arFP-aAd(U[PtF*,0AuBc,e]jt0&7^4CoC:\VE_ %1do@/CL;cRBY?ae/KK\O%?<&ACiEa"4/CZ(\=^r58O;$=O*#WMBsY>]fbWoF>^38d8FCkY:!M;qoD1fqWXE5L0b'5^0qHj*6F9\A %K.lRA*`+5f>uE0jRVJ\g:9nGU.T:dbO:,m8Rp>'QhK[kCq_qCi\XE6+cX@_3N=47(qNT+?5_T&c.d;@"Gh_,+R<^[,\FE4:XF6F( %^8-;%TTm+H$26$ZJO)#^kKG:Vn,U2N1?].*Oc0&i`$1VuM8f(AQuYcA5DnjmNf<._#r@!ZJI89;j,]G\m80po_P-i%0uJIAp6TV= %A$d0=_Mu3M>E$l@()*``)6PnA;NPcRie]/l#L;V:q1UbfMaJf54/* %P_dLT3L&/i\iJc2l1"[9-S_#efR\310ZM.&$=Gs7-\TuC`q4rNB8!<`ZWX_o':Q=mEgq)!6Xc&WL)1Z3HNF`hZ)NOaH#j)6-YmZ/25KUN_[Rb[J6I*!ob`JAe$%#rqbjJ89W7oqP50]"HCqq9?-C!TTHQE3S7jRnF&u)/$i>^Wl%]Q9\qNIAh\9P %C1=OkB\Q4hW4#4Q)mY,c:IZ,0ASX!$l0hM0EY]uq_IfiXE?46Dn&ec:UF.;$Vic)*nn>+,'1-/9dE)9Kc;& %=Sre"!IH,=5:jCa<'_3%%?N"pV\l/0:<$$'>aVh7A1ekHI2V8WS9L,]Se4s=+Muepa6I3l<$cTkUhOPARsAI`P6:A*1@^PoZ^,$2 %MH^?G:efKHn&W^oj;)OsAEh$VbU0)h]?i*VYbAA"2s"7D+A*$T9%keMF9Mq".g>69D(eGC0M8g_X=)Fj:Sn9mMEi6$:)jlfs/\oV9$.SP3qUD1+Wu\pm(6IOQ$[>T^KShpkS!XpbZEIRU2p\D.E=1oZGm6N<7-7So9QlHc)S+r %$o[nfaL7a3ZK7!N%%ECmE6H9!U72`.].d!E1Cd4*7.T#SZ"@JSB25FZ#Y[1Ia^c!@]4Te*.e-,u!VLnP"*9[p3?ph5Y,'#I!RB_OWEMiJ$p`tQ*[jmR2p7ZCNoUh/.)Tkd %/CAW.*]l`L88$F3L0ib$'%niFmQ=Y=ju<[q@%"tMP5G(`!Z7ATB=c^AMAqZ9.82?g,/,*W>[@/ADoE4_!X*R?!?FOZm/h]in1cJ?QB[T&IEKfso>bcneU!a1&aFGb3`#8O=/C^i/1hKb'# %jXC#%U(Uc*&"ml+rkMLTPnRG_[jV3Q;ElWS,d#%K5I`+-'GmoAd)`.:8o"&OaNlsT-o`TYK'.L[%mUJX?l=/r/j'86@*sqPYXeN2 %I),he?=_BJ\F=ic``@B9#K.E7La3pF(Z>L'q?6A.T-L\2:d'K'iNMqa1GgNGk4ldPEh?%5,KjP+(aRS+HDcr7cok[FL4$7P=O*$H %Q\\OaJRrj^C".3*I&4]QEqp)J@<@\,)K?YmRU4p[hNs1jo9`X(WB#/gJ;fsbl&2a+%_%,(#Y:T8HY=V=2 %!(Cd"Z'DrR,P`@s?Ys3%Y<1].od?#V1ft^;>^`jLg?sX`Y,u0*bJ/UI9(nnZ.Po6109RR_>h2&]Zf&6S+ua&0CUFi_56][S %r?d%_HnD-NbMWr%VtV*e*Mp&tMD&c$[sDm-lg;ZIT*JC1q_[6r>gj^Wa1I,7XBQ^.-kL*D5he"h"!b`G44``XljOKT&Df3)]>UV* %dG>]WA-"`j,".,YUK"ESK2Y>9pK+#6;;CVRT8W(gbm6c %')iUH!Y6Ar_*;;SQRiJ5cg1kgX>*L3&5g']Cfg,)N=9bboB'&5T4RaF.Z5f]BfHHC"2ca9G0QR)H9ASF!#8U3,"+u`87"G25H"^2WCiSQ$XWC?ZNFKYNedRRY$XjRg\62uU?T)_c %MIjn'?o3@fQd:C4GZnNX4O-O)Ziq_d9&1BCIN\GF3E](Ip6a_8i!g)j\LVduu&MV7&"_jX]%s_+gFHf+h'4[[Rp-bTf+P %gidRAR.c;%[q!!hjVt#?,LiI>mutC8:LoM2\p5KpL><$9e^XD)j1U>%e[;dg<@(SMX"p=rG1l>3#-Z?`+3CgQIDUpcTZh]B#'9+4 %=!5CU&k1T`fOY?hq"6AZ=`?/I^M7K.X@1,bT'Sbq7gr^r<30u]NP-mQ2%@"b8'8:M'^'QPK=.>8)mHaj'IV.dkSIM$IHkB$[C4/` %m,/eSLg+#D`HWi][1'R=>$buMSEdulr;)f>;4GDe]N*ejEd#sBU'D[TJn[A1&cCZ`ac]qVko(VMr-]RXehR=[.nO(rrr2j0uM,PQnr6fdaGS&?N.Fl]3GObgnn(0gXF_U6q8#@gSB %cl^4o,s6=P#6S9C0=f6e20a8M8!Q`l6L"8W163V)a==HlUTVT:i;=3Do4K<@/eV7ralUWr8$7Cm2e_U3*F9.ng %5m#d^G,(d4I%%`noG2g-GF25-&cuG0q4p62"i7AN$51^[V/f403(l-a<-kYupjK2n]7iCNr9>Xm_g&L[9!I=7>Fa\G^6bgX;$YZQ %j-/S@2L(I65Io4Qbl_KL2FWO$fQ3O_#_<(D<*iRLaWMWQ=58.O8N9,q&hU?0m@GXIK>S0g`B'46c=eY[`EEeXT"+%0?>[eCAb(=^ %\uA]CVH]0;6X/p_MQHF*m],e%rIfi180fe)\0N@f=cPs=J'l-h5ZSIgHH-lKA^EaL:2mZ %e#$fagY0t7N;&3XbN?lHji,*HA;;9T0$>&@fjKA@`Mp6fG7[9PulcsaZ6TNW3,]oT>?g&[8(g6*f\&jVN[?n.JNR@@`"`"<)%fFkn)Na]aOPI(6#o_^HS!QLUJ)t0E7atGOO %,>V*K"W*U#r1lhO:-2"aL2XU7kl`\W,k"M^rG;rWjudBd%W$_aGmmD=aX[\\S@sOOib^%>74\WtU/1VBBJ=4q %3Ol1*E)FEb+/d=X$Abp!^H@&!gQN%Hm)Vl0Z'k$r"K?Td*oSVG8'cjA\1UtCns,pGYU#1eQ4hP"%XD(beE2TtnKGI-)-+H]gJPqP %q#G\ho(U5+[&?hkTFP/T>URMYO2>XO,V6UEAUR7)[um'o"3#c8M!p!"Y3*,A7ZoOX5``1I-:p@pm%,:W0g %]OS[TdO:Nge\9KbbL+/t#q$Ou?_!(.J#VFDB*+*S_Cgb/:/)LZV-RRrlf+P^Dl`&d"^ap9`UBeI'"rpC!ao9"X\Vo,)),t\\#6fE %W#ob1R)^:9hXdE"m3M_D?F118r23DS!E#1_DI=B#I1_J!YQn`0Mfkkc/lo&\7emTVkN.I")o$0EBOo4c@ %`CsIUNb>^KB-t,U?"N@NHlYRd34f-H?fNCdPWA>j>j/^NPDH&Zs'SZR]?.o8@@ng!ZIcHI<4)jb?%%'N;J'OS-dkf\Wo`J03XsW2[EiZqG3Br%3M!!?Vg_5]' %q943Vi=uNII@;G?Q>(@f@h/b@!:GIjR5QFQps=QSO_2UJ@=,5EEr:OFf\\U%;bgtO5t&aFt:Ba`5f %?Fq3:Q9TC`G&gJ4ZnkfWnl4\kR6km>M;I80JLfQ2GIe^: %Ii$<[mWsj#]lb<4H?bLc+94mHlV:>rH?UB'8r]/a)$D5Iq)gF;HSE%Lq?$9R"o@=Bh6bRm?V>gV%8K*A,N?OXofEom9(P-u^)!D! %2@CRt?JOkh(Fa\_5lMfJ/,#76_6;\W.OA<#F[PoW-TtS:`_es"NN).P/F,gi!`MV"pa7aKt*:#*;;A!]t %Vo<4J0t6=9#G0]XWZlL="A&kaE=WpS=2m?AbsYg7$0,GE4j%jj'sUi4"nf)]171;mlTXn<[.r*6UMIP/J\"ru'&MR'8I5Sb?hFn+6pCa\o2o3g( %$`l"K";f2L$sV>]cU-[Jb)Fs\=\Ao'#X-\oQ@!^7_$nOjGZ-c<\)baj.^^sahGtXFdlrFO$gr)QD%`7e)A\k6pDug4LCie8 %[Y36_BAp?.WYs7R8hB*%-/sJIX56ReDV=b"u(ih42)_C&+kSbG]OMc2d %WJ=/!!UCs1j@\.cMKL"4NpaNr*9nmn!?c_SGQdh&p(E$UK5p.;-G)u7GOE0La9Y7g$2 %`EFI+]FNG<-rWa?%Ef3.*G<+fKCO\8s+V!D7KW)N@tk4*cl75V?o^KlO<@>uJUlG>^IqY^cO@7Pq+j+0odO/SDMGcN75fq*i1@S, %ap^&rn`t$u?+Q&k/s(Wj1UZ[sqYQ^u6 %k/PnBgI6[^3oIHAFU3r_7^1-YL-!ZbS.Wq6I@iB&7_6@1\#3Ql8.mi?%[L/$n=gQpjeb*e1^_5Io'b@*RAfJ*a_I#U=L:<0OtMuM %8`cY9K1SP[o2XTGr/dM9@2=Jhk*AGWA/oXZ!]]@N')rl/WFT0OIuh:iY`fp,p3]&R%Z@k3Yd*AD.'5H>c."dFlK02uZg_Njg#,_(e)c:(jbgt)9@,5+E#n`1HVR_*AhK04mZDBLE8.K@[t %d$IuaGmSmnd45PK%U-.C+Gu<21#]=8FL5Lfd2G>bh;rVeN.%f#u0nmN'%*$:dACPlC+:h.U*eF[2\5jr)l%2"peW`IQ>>/A8e%*%L6oEJ)&)Vn#\B>GoVbJ#9< %J!-_B5gNo7!7XtR;!0eZ"uZjc$-V>-%*0Z(n?_q,ulqcOuT3mSRpb&kCpPCYjGn(ed7[\2%mJ(korED[Z7gi5c0Wl45"-qiZhe!oGk?C\"Zc""uZ33a^^3$Wjk2'[/PU!d+d=F(bg5.[^EU %ml_j^Hk2Na4Vi*+qtugiRWdJK)dDlqnIrl)7Bh,JF-k7;>K=8lVZYOU2d+46P-H]20f5sKGaP2/[?VQ\T<+10E`:Et-KfaoR^rV,.2[bcf85>!`5gRIH %qNt^@HL"HBX<(VT-&Wh7j;YII0$4MO-p9O71r#ha^kP2`VuL6P[:&?C0^9@mmnC2>HbOqm49*ITEnpdI"E%DDMFD1gSXhs6,,1&IE\p"FosktFs%nu_?dFPKXXKo %mK,XV&0TYs\'dPaQ:`Pb^^.Sp2ATEJXY.MZFUZK]i>SAOCHj>:>N#9X!=OfR)7Z@/'9WMIi(b>A;N`o!$']%6$19H&@H:_6bVrr$ %=d"':JTQ#kYk?r/[X>8*[uLM %+9`ldh]KIK;d3(FpQg"O:ThdN'lY&=p5_f5'dW1o('.u9YTN_T'j$8P8c)l770krq<93HZan5tN[%\Z,./sTY,?9=n6\#oR3GFpO\:_0Edrd2!(,e4f=htNQ'WG;i %^B?O5'kIUHKh9Qc-H$Lf6'5?DoUt,*CF@3@)H\ZY+F?rYI;)mrP?1"S_Ya`E93Y#*i$=QhVP0Eo%2Hc!kZ([H='-\L]m!,bS[!lS %^n-c\CW=UU!T/J]p$6+BR,PC=nrg.8+q52$sa2>RL %nVT*YpBB!i>Fb3mgbL2EfuU=<=-V.>d2@#_&T6)%ggN^L!/-^PSj7V9YV6?@E6bdK`2h'Lq.9_S7P:I4aO'o@g0+hU;*M"/JP&]Yc*AGnHF;EKeiDkcd4KJ26E\N6K8-H555?T*6 %YscU+G*0l2F\1^FHAtb>SG<)fn?bCbbFl.s^^Ghqh"J%=!>hUc,afIO[15[OZ0g`0*D@Ou_j:UeI6e;LMh,feYTLIjm`>A):?;g_ %%:@iUN?4IAa>_kkm2;QV>?BTMeh$607"o%6dg0-^RVcI7G9n3Ac%$26&g2u$JLub'128-\mj(D&1j7+H4r421.2A`!SG@6%8)%P[cbaHHn50rj0mm)19E-kPf*#g`gPi^dgB7utg^Ftf&2&I=EkYL96m9'Alk@Cb@m:!H._riB %\Xj+,WQph%q9e/j[CUee9<,)R%V*b-&A(;rR_,Q,h6--ZgTc>@,('iH[NW]-r,Z_3;9?^D#*A0L$U;DG^9n^UCg1^>[Gh:9rAauh %!LA"Mko'69"Qt>Ni3Q\?gVX;k-05o$&.8TV3)Q-!5"[Yk%R[A_+;>rH1JsJ1@B!@C[fHCbolb!?fYqWMSeYlF!PSg%dWE3$!hlb=;JU@Tlf5C`T7W9.h4HV,$Km\[MniW-pVF\\52$XQRsBE60eUt1lAk7KSO_)NZeaB'7Nnu/f%^-H;et(k%)0/kSK>4lVaYDC$FV"?gm*oJ %)I'V\2"5*n^VX3Z3pBP2^_lPD5MlUj7^O%m-O%l<,bqc&OaS:hZ=r?tBjaM41KP'2Ra5T-L,K'@P5G*CiH*\LiS$lB<0O@eqII+Y %dO1[n:iML9:PVt3>Fu\h^]1J(,kp%7I/R>hq61'DcDbB^[A@TF[H/5T`emY7KakPK/;u53G2`-$mX:Qg9,XSfk:g7m9q=f/5Gh2L %ocMZZCoo:'nD(Wi]SW;t]a6+II-\`WP)qjF\,dXqU*&&)bY".<&&-(lPK6lb7Pb`HBdmoA9O^6,U[)$Y/s0#\%7p7:.) %RfIbf;TDcbNU5n2'RoAjV#$lt41\N>:*4T^=U`?$)c@=\a7YKk?-AiDPZLULp*RnUIN!>Eb4N3=(doIanhuA)'VXl>>Je'Xhgt)+ %oXiT?l]p\"]72Ocf"_H[4eQG0l@CogIfeq5LMdFKZ$]Z&Z(F;G6%0fSUG92il9RFilRT2N^;;W2LHW^kf6,!s]EDf,:X2I)I; %6+4+?qq$;.dUZh>IBsL-aQl+Zd]Fh(kT;ML<@F;E:+B/u-WdA!_E$NJ@`%_e#fm#IpbaXses>58FZsEaj""^BLrSYBI4')/#,jdh]KZfoDCm>akW1*/b1;!lB-j%9TTNF&Cq7j:m&Cn752hr'_'2(OUgD,rDKlJ;eKZZ&<#/*B478C$Oo(QeN0 %RWMUK9kqt0J/Xe*C+`5Y-fqcMOWA58-Qbc]c<+S+]1=BG]?;3Oe9u8GKCWtZ!7mW>.!6T(m0mmV[-2HmllSJHcHg-)'%-IDqA-`d %*;'hZdG$j#!R?ns,2Z`,[K:IjZra4%-*LN7T6.-L2M__'JCh/H+FA&DF/93tC[QFogSYNL:4pS)s#r[0aT9Q$4uJA+AFMEj00fW[ %2!(a>8?J1AiBH-%*4+=/P02keOG>J*LpU/9V5AFiB7[oDJ=t*f?$$S=nUJQqDf#e=W^#"V[3)Nj$ug'36PHGOWm1UI4`FeY[`1]2-tckQ[5mmLu#K\ %?"=B:$mUhh[W;ciP(PJF*_UmBh%bX2%:&W4jDnC%a.m>nO4)IA[Z,j:TZf;dN]RY4CKBn$L>*#pbe*q.;Ks@mf`^`aDKU1MSaM#f %^uA.RUmEu8!uJ6u-7P\.a0$PG[n->)g9E&6OK$*=DCRkq+g4EiMcW`"4$kG3n23Sk")6]4j?eKo8>FPBHJC/e0U&H=R$LPs"LO8\/)iSY,YO-[->((A %UkIKc_UTi.m\CcU1/*DW9?J^8@8qVlTV$V<]gF %q(>^X1D$Ci/X/+*f*tEN:ij@jQ>=uX+?$QgKgKcI^r[#-/)6()\W5`3[??6:fDcTh/(FJ3Wh,6$9gJBEWnCKb;9VgGICb'9_OSIT %'k@/<@.oef0]KiW,+U!"0\X\tULg]G442-4JY#.SA(4c,.`&9m*ElI=m:&39,:Vf0KLf$9taR5)RAeZpq %,j%jbA?-:KAh;,#*5L>p(t^'O!.L-4.cER$.j?cqN/[,5=R-PFO0WpYcho)ue@R2t5;#ddI %+^(XN+X7$"?qfr9d:8tIpO9c+?Gc/hDr>fhK]e+N2\N!2Pd7Q?KIa+Ceril2#E'19O?Ijep[ZBl9NYVfh5]asdOh6.fWVb*!<,iG %Ysef[Raue$0H"/c!!*[o8au?3Dq]XB^--6!_#[Vp#Gj'M6gT%E&ARBb5Wq0e^p5r@W$h*.L4,6HPp*u]mO3pr,n;p]pCJE9A^kR>-=FN#e9:3 %9SSu`Mu2/en"!*ZCaYg^O,Wks"Orbk'YICn%GkO/ln;a4XEbYQ/D>GP2(6oYYSC4W>>(rP$>(''IGL/(["^0K"G$$\^/T'`)MQeK %N#YmMM-A0ZR]KOr(OY06q(8d'se!Qj@?ET@9]YS1[k]0*b$t89I("OH^7Ee=*RhJN,X*Ag*j(XF(Ce=!7CoK1E:>Ye1aVKV(0MY^L2#.=(k7k4+LN5$ %g%L;iNnS=CR1OqWA19Rg;43\0^o*B<?U2#U/)eK[T!8?nJQLhW4\$jr6V$a__>"7;NGn3f7;"XCj1)F>V %+:3R$a4tABnhc.XKbhXTj">@D5/a_hm?QE,5RJo!a7.CFl;`O:#'ThKCg.$gnn$l4hI%huXEa,jPEo"Q"#G>$Z"#(Uh6WE\W"Km` %Rr-_7:mkTXMK";Mg4NaVa^"?.k:!>J`B#+VS#e6F(u]lnfY_@JLrRN$kaAsdCe,AD29BAu!Ke]`$"02k'"@NT35sXbPb0dp\+P1# %HduFF9DJoM5Snsf6Y2i(dP@`$=;Gk9Z!=1EmYgf$7)\ch7'QY!P*?"*-]H(+aOus%CqW07Xf!AV&kmVV0,TZnB/sChU)EsrPn__a %h$D;PDaEPri5?WM0C'@+4ENIJ/NPXKeIWI'<1)AnQWdI'_l\=JT9"r>BY%cW2"O<-#K0BW`!^u2HeT']#<6/K*36nmX88]s5" %jQg<1cNB*f6E*VOB[[iWQCN^b]@r2]aTn/cG]bJ_-P?U4Z?u":-g2\,iIOqt81IBn5h'j83=m;4*pZ!1C--23nu2KaR+n?AW972M %JTr6P[&9*n;?W5!EKNpn9\jRf`#_pi$+QpIr:JNC0J&sqEH%,r#ZB[`pc0@q7Z.o'S>nCQa># %"eH'5CAEC"9?\,"=*fCDK(^eD+>HS5C*?_Q#$C8[8rG]=t5=_QcQHD\95]s,+aqm"(e^PPJ %V"'d,"%s:kFGR9Q\6;C():/ajU066g2Q$A%4B>]KQ@ZqZRObpGJ_!k`];0<`mA*\-GP'CE5e9NJ3d:BOf6gWf8ThNJ3@8sfJl0F_ %K6bfmk_BrXG_CZ]6u6s5Z)j&kieqj>E>Ech3`8%tggFQ6e@*B4\@dHhS?W0ma;m`P`%lAC7`M7H8S:Zg\FW\T_*\MGRbTsN(0$k8 %mK)2'FlKsU,Q,\;n!=hh:q@ArU));]]s^DoZ^kG[;XV7$-L&^K".!Ch&hAb7LtP?ci[O; %g0j^fHsmH^,#N<0="ZrCUS=r)q`N&a+/**3[.]9#g\F_'OojoW.A1"JJIs%^$"2,;:'537HUL=Z-$_!EggEgUXWsTig-fJ):sSkJ %J?g$$d%jimb^(j3ecD>@J[NF32-VWV8[>nfLK#rf%on/Si9R/UK*A/6Qt*@qR)_#f#EIPH^l;_=%sU=D*AAu:,p8_=D`oKcPkFmW %f?SF(pXH<,WZcElaKfr$!fW,T[=cDYaZ;2_f[8?(K&I+-i$j'E4"PCH?FU!'SUjWbQ:QVNQ;o8l6mt])(n$kH4[L4_>/9t"0P"Cj %c@RR'V-UUsb8NDp$`@EL]rte,4>s'QYXU7@YI2mm#($G*Sr:.s]YLF9!-9s$7Cctt(A>7\a`,)-mh4]!<:KK1ZN,%\mKE>6F&gA+ %`f@1?H'm>(gWn_sMpVMdrOUB:05K6)#)G*Nd96_[X.7gD@%=3%k2KLL8[.%okp3N!L=KG0L>O[FMjC#tZcUAsZR>M0OU5b[NsThQ %NSsOe@b22!R`/pBN#dIQ:'KM)R>JW-Pom.'H^8X^1\(>i!0,%B,+;r6Kn %7bBePc,@Xg:RQbec0,c/'>K"P5lmTTER4gH`sDbl3O(:5.mRS`B9J]p*^'?Sa-l2:@">Y%k=SXBn/:;ij8En8-C#?K)b^@;B1T0t %Y'STe2/p+/_8.H5LoVr3B1)tUIIt1LXi,%)a[uISK&(6l]2$rtJqP#;]07Y41k@TAO9&7p0m41@D]n>R!2UXXi*>\oW@NmXHP;?1kl$97c>&b`0&#cT&/09d-%e8<+fkN?dWi4PI\$,s\YG]1%HYOek$^:YnF]r`O7 %-K;]^3HR^^lF+S&d^N.JLg/G/i#/?!d(j)/k2$:&_d9XWCNOu9o30Q9XIptN4^W2#j3eq<6> %2)/6XCRW:TATRq%6%pH$ouBe;RdV1<-,OA__(2G[5u0?*&Q+N2X7iJkKG%F2VA"IH2[ %,R`L/n(c=8)0S=?*eR[;'W#sf+")4!aNNTen(a!4rN>7+fU9L&D:\IZjDBCL)-a7B0V1Zcoj^g-47_ICMCf7MY1"-LN:G#8[S*fb %/>$onR(q/r=9n7..-7NTMn:#p(aajeUhWPeH_Kh)gO2`,!YNng8BUns@dJahQIm(js_@l3!g;3nH5BCc^4ClIB;u&!Cf7Z@/!uh&cN:h/(i=-\$>OIcf0,`"0hcA/d_F:(J@.,@n,5X[WT8"S>MTBs %,7,OT,N>Hf2,0jOrCbmcLeCD6l-%,,:k=Y/@)^^#%1i'n`sgE9h*="c)X)'O$G^@)h@l;GjeCVi)S`o]V84@K5R)BgYQ?n&Zm*'2 %.+l>A@>b'$+j>!bDcJA;Ts",.J"Ro)3";t!N8!ArohA57Ep1]/,7t(grO1t"?j-\Sq,X+\%a=dRZ5KYE9/]-TmFht!?7';cL9PcJ %=p"h(qk(ZK<%EjY@>;e/DQsG@R/fn]KCKK<`Z+.-5-E9@3\ERk@:`"to-/eP`P1j(LU+rLTQ3dK[)$7e9c*qd %^-;D/<^]>jmLA5PQ=+(@)QB+E8VT\-mrI+LFlWi!%4ZZj^<*c[%r6(OiMFL %U=n>1-jO^ed6G+'.CVj)h:$9mmX0H=X`upB]J=f;(.&gFnBM;/dU(SGQR&T,36p?a %73pA(-]stR2M3SsO)%#rAPQuWWN0Y7LMg?Ko\"-nLcS_\YT#M>`/5ZpV(Q=21rd<*1)MT0;rqk^.55nB4,3Ko(B#hkhBKq\Kp3[Q %K$kBu'$T4e0gP1+7()n%Q9g&J@TC9ra5gt?a28#;A^u,4qf6e>O=m?/?JmVPqFgY7u-9oQkPQKR! %U>if8gBPA7sMFCkMP3l2A %)bg=mIIg;U!tL=_JAIS8RFK&HjROur/>?)7*tYmT)T;4VE@5IZi5-s#Pt*1+eXBa/!DEX`nHtn15Y&qf*E"gcEG*3K1YKK+>'0Of %7"MGrer6+8;c"s_cU%7)Gp,kdMcW/!4s0JkUFDV)(F-Eo.p0T_b?nE9j=V[TJOm]3j7YnBb_Y''\@&D(2DY_KDV#7Yp>SYgh5MMU %_m0_ %SIUEV7U`#]Jh5sI0AWF!jIogo_2$WX[ %^Q1^KhNg%Q?Ca6'#]P,W:N(ncIKM30;S)Ydb,"[HVE&#t"t/OM6*r:e5?95iLg#$/4u9Tt7> %Y=kiZI.B0YG&2DGWle;(*[iG?RiH%oQ3!C7?:EDp:Xr@JjTN:dA'2-Hn]'%g?HTJXa;d"d/==Q/oK11m.UB92,+u_^C\T!YFfGE( %j4ccA]hP`f$VPtuh';CG[OXMrBgCDBbuSE1f`+r#pf_"D(h^AmIfaf*LVkJF^2)Pc]gsCVgu>R9/MqI`ihNeCe83$l_e2DQ$dbI*e %Q#BjKiHQOrE\dC%?nYFS9?eL/P/cOhM*!rXI9&H;iKn_5Y4o\CE!%2/)-1)%IZ$]3>glsQ4?[0>GL1]f?%KCD,?''1Err< %SVOudVtP2;h&j,)B/KDDUH]7X%,U/1K>K4j@<1)D_]$UV!Lu5p7=jItEA)GDnEp>?n0X/Zj/1h`$CD^dR12,+Ok;h/DC^@5W %>0+G2_$I5\e5@$l.a1`+2QGJg*oE\r-''P7q>Bu&8='[lVlu.!G*W)g8I&rg?tqTFBBcV(BC(]CG;9N%+=7P_lCo&i`X5nD\H;2/ %gH^d9'9G^aZ@8'#Zqm$W)G<+t'>9tk8,Uct)rYu`PM03PG;?jHn9G %c-+#6+GQ2_VOHA?d.GfU0jb3l"42;"/Ha"B"LHg[hFOAJ^HYn3R5!N.SD*qDWitt"C0:(-ot)cu=Yg/$o=?HM-?YuUfotfc]Ct;' %i#Y+8j%eHNW%\?'!3/n7q^om,!M$e1f8/a=5Hn#ajH,`SoTV)XN8;B1fH7CJH'mn/2FrRg000T1V&q\cDN$L %-i4`#'notHLmIXE+Ko#8^4BOr3aOSV/=GlfVe''N7.%9c5V9V![QosYTQ=GbdsdAco1+nCFqRWU4KQ?b<\)D %_0Xi;ZWddZ/#7;Q?hXd:-A,G$HWs+;CpRt"n:S2a?dhB>EZT`OjQ=noeE0[jZ5cN6ABP9m_.$r7Q5p"KHf&JOXkOX_W;bR5E)V'? %>n65BGqChhhIU`.?LH@2en8AqSor)PQJoPVqNWO/diY,bK8.kslL"o>NdYj60$ %A,q)BJ&.(HB`l-YAU@>\3@Xb%V/:'qFaKBJYLN`RBo,LMmuP":.26<)2iqf?DoJPCp-)jr%1Deh)+]?#Qlfo#MTm1RDEZA$^:'8a %]ukK-IE%mE0eJUiRjI7F?WTr0A]SQensIe4$>'e_o_84[T*T,dilJuI_Eh^Nn&T!RRna3&@;==6'[CG(AbBaQ+qET*r?(YJG*Kou4I1(Dn[raPN'Y>[<8'&?OAbr.8>d+`/cmA0BPu %ROt%7/X,U$Yc&cR;JNK^oP.&7Hm[!73T6narDG"JM[Lu;Pc/L8<$s`+J5?Sc!NBd67%kFQM-ePtZfNVO"NrHd`ue>Mm_`664:m;L5G&]Sck?\-phbQIL[L/9t4F %$'lrPSTNa/Wq,LpNo)lZooq'[m:jNk?fn/A:KMZ_j(YG=`U>VZL2+m"2`4%r*/)s;KL1A=F[\l1)KS;3"&!tRrb`I4m+FU:>2T#r %$R,5!I3UTOY1bJ4_7U=;:m=C`Ki8M6MlR`&;VT^Z&[M)+jbi><_0J[Q0Q2dTat5=_B%>2U4fu_oW]Sld%9d9uY:Xmp7>IWKabKH(4XU1qD=]toZ"KH^Fffsa`@hQN5 %XUQ%^SYT8%M`Qj4g;OFB^ES"T!ii^KMl>mqfH]1@'CidScB]OqUE;PVq3#e(cEFCT-&-tA)7an_m/l0&'$!($lHDFMo\",g;CQmd#Q,(XZ\$_)"cVhLYXbP5#V'#1I:+MiZ:;^(M+9ROGrVDo?lak`7'7NZEf*;)e;Dj'GA.Rh9j1;h8$=\b:CZO'GLQOQ@l'Vc/KE:#eF#c13JBo-j*d>#eXC6$4=p)6bKMIsY:[>rdUq%NR\gt9dM03)_3-96>tV\m?^:^oYl$R\._:l:H3Ge_J+_[L"I1nrs,PT>dchp/%a(rW %D:9@T'ta5J+X$B%lZFKo\A">0Uf51De1@S'OVSjAWkrS'@MY;V=-k0X>]Pu$ %O-%WrrsA]1muH[.LW&QO0$0>LWQ?/+>5'BJXIJ+:d.#OU(-G%S;aOqB./mbG8(T\j6+J<2@o]?2CW%>cDfZ'D+-h:mC:uPbN^H6E01Lshga7$P1r:9 %4c05:H1LIOhU\+Go^l$V>2'*W].1%uDTT$8Fr;N)pTACN_&tGbTB3N;"RoSH4b2*C^B/N$5GjWMFSaDeIK4d0Vd-5A<`J=WH3Bkb %9?fpPEs87L;no?@<67cLUS@ci[usWWka8T&T!jF2PN`e(qq(K;lbBL(cperY,OGk#N;J+qHF9Ws"PIl$01H/T!BA@Z<>*j=kFhD= %k?0(>O.%c+mISsWX#qa1eZaYs_q),Y.nOR^CQMB;Ru@WObu!gW[25hlWPLo__%!MtHrO;UeZm]6^q:@1kc827"'LNS$4UNQG:bVO %D0+mfhF\mX(ITb\*?3f7#=o$9hT?*MO9[7W>V0U't`!T %hr/om_(P`$JZ'b^O9354;BD;[!:e30nleBm3fHU]%S@6;i_c9O3+*JLtroABu?:*=e\2JecZu&;:&<`ki\%/pUlV#DNda*sk)lYX;3AFmrA?%%+F0.]O#ZC_I/Qj^`:=cn.otF\F&WiT!D(1Kj %Q()Z2?/4[Gf.BAflFK&6!Gn8)n%Ok((h?3,I>'6%W)Bt#,CAnd!@Rq>GSZCETIi=b+F9+p1DLEGPqadS6eH33b=i7TC>1;+fqf %N45*!>38=Xc>"PgpK\)8/3b2!EDOXN@(2TCmC9UT45%)Ye[:+;pXEnIPS++:G5_E%RR:d"gG,artW`s["9NnJu.+jAt.WQ?2:kRq6+CI3K6f, %HLf[l\"$Nc67TUgBhl$N2?9*P/H[0^Z9OLa[nJK'=I0A!!A+l=Yg@55,.&mAkQ(R$#\cKKTO46U"QB9*_$?oZbGBHD %j=`.K,6`J3-]-J0'p/F?a//>7V'GGDW5kJ/SO[R$Remcf5a(5N]E2K0MQ^f#]/-6"&-q$M<:\MN26Ve7f'1j-^%7NNEMc2;/1<)-_h$WeM\n-s$<0 %a5$/m5SE)).LJG0`@_d!:4a38moAG4Ceb^l7IUrlU5!LPDA0@L#!HMh<bT@OIA14/Dk'KpKmle\q`- %4,np^2:q4BAMosILaE(?`kC+tc>QV[RQg6h:aiJ"'J/OQX&TjIOi.^H8/&MOE0Z;rrA'- %dm4p=H>2;`Sm4[%9ZIMSV&(@^#3b`:GI_Fa*!@$2YGSjJ$)At+JSKu%tDi-AZ`AKb?]KAMamU<&\^],;FhIO0Kb^aS^, %'';6FVCWtG^0si3)rDEtiHt,Glm,"Q92sU(`+!8#fMhT#5@In$nZo`mdcgBffV4<=:4kpf%4aV260)V+8-rK?:R'`Ybo3LGOL0i/ %F['__h*@/^2SIf\.+e,I@n:QbLU1ica;RU58$`Yh+euHA,p_$.%]3%.$h1U>-_j1X.OD*o>b,WOOHM-p't8908*b0abkLD0";# %rqB&ki*?>pg'"4&8BheOM?!ghX<0$t.m5:JN^tb&;7j#IgUs_&9Mbt.pX.`9KijjGRH9e[IFMk+JK)jK;V%AiAog@o.1$5n+@Ah_ %3/PCXpL00+;8h!rit8MS3Cea5IsuK\Np4[l,g0Hj%O,b^h>7'5D4?Xn;;]%l85Nh-hG$cpTO(\h[U'^lD-u2/V==q#JI.l([#'d? %5)r`>b,3d&D1-Gm?U'&uBAEJV!B%X?/6Jdh+2HH[1/$aB;39q&B!%;?;lcTDI4eES[]8Et@fdGfpSkUq1A3Na]ejh11*AW:$j[#< %QFH0f#+'I"[%Ai(&>&WC"XVqpO!V&lQRP*SFS)MqoW7HiTS:-Uk.KQOj.\urPikF+PL9o/kC^p2A.PU@;1*-?X/+3O$D#PO9>>/V %l,cs[S`Zd+2$^`n^_q)lVDE[6Tb;K#(FXs(.R2DQ0>#DsML/7^#gL_@BC,D]!@A^nrVN?,4+UiBH(tjHcH_9">N2d$E9mq,hsDQ.N3T=d/-;]tZa7a4b=fr`$PT#(!D):9(E`OIXra %Vrn7LVla:k3^5?l=X5"u8er-d=W-^D5`B/=\@-,u:FotBPdX(rGp02K^'X.&2!q`o_$BZX>G]2hh6"W2D %em.GaM]*d#Lf.\O0&g.:7lK[bW)TbSd:$]..\I-haeN%%\bbAi%SeBL8U]sLEmpGBp!@9:'i/ptMh#&*>";"6q!u"=]s$uZ]k(6Y %OX4%n>\#RhJDYPnquf'Ki)fAu^Z0`;&'I#Q1,\E0p1'o4!]?h^*QqMpgDTX@ %5nm/"4KP?-"/oJO(VD&2].5XU.1[3<2O[D2l46sWe%m^)u5^3K%!,`lZc[B&:iE/=Pr>'34^h'EY\')1XK.pDrfl1E<^MOQo"o/"?!50U73-!c>MfJaLKV-ID?Vm+'U`Zg*,`PO.bc_] %pVZT[#(I^lhUtrsXkE8N!/l#u&^S7'c(]bt=H<bQ%//\UC@o`YC,j>$ %mfLKlQk^Dd=U*aFnEurpAXB\(L;hNtEuj;C/ZL/lQM5A8ARWF'2T!K]0MGaYFus6WmGPrUVI`"KE6ls/)1Q6PbE8S0cG4E/Jmkc# %?JY%\dtl&QJH#f^o4W_s%pI]hok_$+pZlEFHd#^Bk_gfWqrNj=*BFW9Z4AA'YAH3VA8XB*pp_4d*/ %"lJY;hY'7[VtR'EpV>W?BcAdO5CthtZ9J[=LjIT-\?At6BFYudNRtiiMe_`ofYEZ4P.&VL*n%WgE*o7n]5'?=.tMRIKAHLX[iVk? %V.5:m*8HG,I(<*X4psKN%*'B+p0Q[bmGO(uC/$%7'+V+(u7^/Ji$\`\&D<].Xp04q]NlZQV(29'a%f1S]lf(u5=/;BI, %^0h2?qi7k]t8tC:tp!MaM?"oi'^]$`rYB9Kr0oKYMA]VBG %d@u20i0_R3S9t/+p98JN,e'dK=?Uf$t\lD[!r?3t!IcUeG>SqUVH4b8A0[Q.X&DS["0]aS2!'QG0Q-XQ&@kMY(^SZRE: %Q$GLd>Q%eQ7!id7Vi!'ek`Q_$*\8d#i(8I]Gkngg6f:^%-GDQ/&q_)YqQ!%CpmbL2"uYuelAcCu61*sL$N %/)qq)M@<\UYFok.[_d3a>9t$BkJu@9=&Odtp29CtC:%ktDB/>R#2XtR%G?bV^h)u8*lre2O$ZM5?obm&"h4=\5RrKo=b%KEDqc%p %a-$dKE#us'OT.*b-Ykk]B_4/hpBRqhmS/49ZhmfpA%^%H:a5&0W%J%!lJ?[HP3'1dH\-^%raS3Vh,N5a2Z,r=A.N4[0ns6[X'lhI %\OC:ES0eOPGm8YC=%',)OgXr_8GVlX*Y4%U3O.nnb,WTWjGF[&3&ZJVnMlKP`\5CFn!Npq(+k:.]_AHWn+XAr=QdAg8psq^/)G"# %b':KsVj7#U;mtn8m-sQ#kIk6UcCWK'5l]g$*6.IX&/G$;YRLiaIi*)5E5+i;i9Q.g1D4Iuj/picWY>9n#f(iVm5mdsbHM$D#Ig2M %lZd-^4*^Z+a0i1_hqfnK+WTminT4K_1&N5'FH"Z``6Z&`+ff+S*ldePa!870p755u`5=e4i-=4YOb'as%FNYV2YmIK^S]J!?5YXbd:q&>4o[P&hj7\.X_@"qTrpc:Ak`*SWS0!tIG,;X&+*KYU/bI?#.d4@ %*ZK@WC)D(m552j*]Go2]dXI=uJl/KIf"gAQVhR2$7"W3ce?"X"A':C1)Gt)K1e73610PAF^n\fCO`1-W@bDAQltJa+6,>(-4c3)K %-T1VRkp&hZl38Zf9F"LT`Te0Fmpa,L]UiXe^ittbm*.#QhVE>aOG<:T)FKo[Nh]/PfN\">/I!WA4%iR:0ZBO/MgpVpD.R;9YGEtJ %fu!9c9NN,S)n9/m7Y\Ek`e^PMg=9t'_ji;?q#F917RFEp;=b&hC]7`H"O'Cn0CuX3U(boh-KiP3i>-'Y)T@.^.aZBD1bbe=ND>qI %=rks714@pbn22.UQ6aXmYo'CX2]n%2P#jgON(*CG4PFQ[ %FQ6u'6/XVinMhSL;\]q`W(H[5^hID&jY.l`r!-K]9&<(R=H"!f3c>JWCQd"`>\Q-TCB\r9]U>&>o[*.>+!/\I[AD4BA;kD+^%&CrB8$EC`pq-;MfChqJ>6Q_YDmd!o^'Ig-)bgF^7I2l]9u42,I,1e\g-R/6Y?t#X_r8?&.RMNmP)FnC*?[SJX5` %j,>2>NQX,(VZ^/s5!uPiCh0549JUh`S&U+&KuYJ3mj8"[L2APdJ21W^4S_!8"/)RF %,H1@nlEtir&]5?)1$XB>?5,J3MM-N&H9Chm)p@4L6d)mNl`3/j2iQA6!r,YmiN"ON6KuK(Q%VjT9W3(N(aefYh1jm#7e(%/pFuO" %LIX-EmWTmbo3tu!JGnLF\<^*ucYl:].Z"g=ho\Ln&@2ZO*2J/_[@e>k>BMEIR+!9siO/4L#Yp,!dI+]!@ie%Ik)ksW4G)$:hDL=% %M_A7F!t#W)hTSA'hDO/9&8%QWV\+lNqlSBCp=-ltD&?3SO2ced,>3]hOPI!%NS\D..//!E1:`I$#'fNP3R]Oi40Rg`i)i&KPU6ll %_7<*G62gZ=IP$pUT4-SG^'MTj7;t.?#p(`eSDu)r%W/a(FEI0tG^^=d+('\;c]3G.I^XDJC'p@:\8'I!`G]+8!DUP-s/c%p::OqDbD/Y,*l:fXEYJ0WueGbiGMd%I@[(PG#MBN-YP;&&S6lX?CE? %UU9%SYHE9'iks$uSke"L<:]IGWi4lMJ,aR7j?.Va*D!u*=VM$764Rq[CP.cpESkZ_<[pog'UC:H'h0ANUUKi;D&Bt:bC>n:'tr4O %+Sn4Xm*c%bUAG2#&qrNeHoE+KT#Ne]HtiWubl)-4j2eYq_"dW^n_.Mg?ROWM?pJ_4PA51rE$.fO;6cr>T!!3D.bY%5p?@;`h9^6K %VbSB0HHg4Jgu@7pj(5\bf_+o@.X,tin@Bj9l-LE0&('*WD)?Ppo)9./!1LN,94P3.:0[798K`1H\F>c;YN,VKZl\S9GfoWtnVEsA %k]f4NLRsRJGDiXB)rVYuNCEenH=+D=dG&>F,b+rIj7*P>q_U=jM9N,,%c$*c4m6GH %;/XD%TDgs-_nd:J:Nb#%i_%Q8^>;?)_/YReV65S<5E/93Hi*<9\FuSN`Im$GAFZg_CZAtJXi@$F2/o"P*dKOkq;YnS3B87&Z\)s) %=4Y_63SQ]q.dn4ZhpD/&XIdY+(`EWf-skmb0:C_`aJ"VCGd*Q1UGAD^Veb@U+86;gqmBl)2gZGFNSt^6ebEf=<;V%T\Vh0u %\>"$%D$3[lmJ`c'eSk1.n+Zr=NN'kiLPPC4H5[#394HLmr/^R67*WdDnWmSfkLeN3Sr_H2=*Uu*F0Jb4^&:dgjm"B#)>?T %GL>rrLCRar5a$#r@Y&-FY#mr"LX'l^GAb(2T8/Y-i3.q&OheG*.mC>]`Om0*.`#dTF#+;)ot*"%VV/]9R]=2rcce9Mab^V;>o+3U]GIPr([L %Rtq!rc05/IBiM;)!D5IBd12pQX?PF6>I!8)o'Y,HM`rUkhi(1j?ishLam7u!2^>pZ1TM&bBqlJe^\?ZZaLpjT+84Y*!%AsH %ZO\uO"F6&,#HH'4J.u=6m^,jO2]rU]I="(6Tdo'"gSlX7i1kk08DnJ#M98qUnaNZuB0QQZ&-)VgoYd0ZE;JT;OW7ml%Pl)(/["_% %gNhjV,;CMF@HWKdH$\Y)k><)Q,j.*dj@'ZqM<)->u=6s4u*gr4GRHKCTrU/9`fVUg,.[Za1(b4TYjLJkDQ2Xj7T(1Vt,Q5FtV %W()teR=kd/8u(k910^d1F[!@MM1*->:aa,`2.KXJ8ZnR9(>,o5^FjR?XiuiMjm/]sl1"Eli>&X?[gomPoRZ,1[EB;S7BNH0Y'*UUH+O#m%*o7]lHj#mnD/8kM]$%ur\*@SQ %bhfgarkj-P;`@n8j-;4H(bVR$h5"3D)B3T`Q]Q"VrkcsXm;d'm!!fAS;F#-^-Im=afG(*+0WMGj`]&j#h3EuQK&Aqaa?::G9iJr1e:))HUsbOIikem>[HQ7[HCr4Kb3bWm@@!?GLhXeK8Y$oI1XR[Z%"!Mb %?"VWI&`^95.Bcq3XIbq7A%so:XKg(l!CnlC.b9[s`XWlf=2]JYXRX@h_A(,Zobh?t]M?#tVN*E))J?Fj/LJg!.Tn]j.`q@MJ?9R-uuG)>OcFalC[b %nIC9YhiF0NVr.2]`(IrP_X'p`'X'5X*1";8X`,R*@)n:=04(@m[/71,`=)GR0gj9p0ODuNC(*K%i*e+,Nt@of2gao-m1K-1O2jC& %Qqj!XR=1P1j09CM/p^0Ln"6+r^j]=JNMOE=EYLBEZr:$r;in>KZJ?+^J@hW7kT)8(me;^#I@+Vh5S)+Ckd6J,$S&5f@ %r+I3:qR$[([eMRu@/Tl[^XnhB(8qC`CEfM^r`7i,UMdIi@4Tfo4$Pd?D]/ %2209c@W]#p4JCMY1NjbL@p,Og%<,`9c>pYSSZVa+GX!@k[5_WE^,mJ#ajYIpe+e$,Q/hAkJ+t\rh-^03Dh%L?s75i,s75J_rSqhr %nF=9-9`OV>?N9U5^VBb4-0co"=fVq8"bT5( %LW^L`QWnI6YX+%\]#2&F1r1NIH04XL)7O1?gl9d]\TqEHdqE3WKUKOT`&/]g[`PRi0Mg:6F-,g`XE8;G:[HkOPX4m9r*^[34C9[s %14Jb\YV-LQCOaDTYuVP?WAGO\^IVS.+!&IW]?(6\9%qf^WS6bsW:Qu%CdAABY`J%!5W?s,,&$N)))j!FWUnJ/P$8U=5Yde@?k1:5 %fsJpTj$;t28N\qO+q4\ofRstOe]EK%'A)J/q7QBQ=!^n`/(m<*EX/iiB_TXMgeQ42`*lr45m,,sHuNBZ)DV]'+&MAo>qe5GIsdD_ %'/-9U4-T\QTm6/U*Yt'fn\]*D#WJKMQZ:OOpl[8i>.i9=$*=L?XA""l"jZdPKKlHU5+defDD]aR_D'?J'l_ulqVYg6P:kDY`\D4N %b=!#WTN$p]0>%f%"f@!)#^+'%gB="-3%5k=8nX!#-FfMTfZ]ZK-P^Gt.R(p#VA43Z9lO3b>;ioi@@RVGFNo;''4\4d1nf:d],F"V %@]UNgKdD %+/kA^.c"Qb`B[Oe/!WM/>9Ik %Cn&%q@&1l]N=+^RHB5BK;`=_o_N)Q48LH1++d`L902#pk4U.3WNA4BPq]E_sr+\pHNK@OGBo>HQ@hMSC-!]f[4O;21>%Y3Mc"ph^ %N+TD]KObbFj?iP)b,`Rgd>%-5gYI,61h432[]WPd\^;KfMo&-G+D$(Ze9F_dA7+kD5p/nU?DA+eG<6@%dkdaR5p45RS2Vk&J %NQ@eHWo0Eg51+WAut*A%,6`)E8S@Lf-J<%:jUIaYjcIqDm59d>cShYaU*"p %42F$oBn@%gV[W63ifE6.,O+V$^\UBrr6(W,Vu1nun7B'-bImfj)?A@,4,O%l[0<.D#h[''eUj.a"u!=pXGM.c'4,E)4QnN4GnVj] %)uce]K@`c#-JfQ"GZL2.YhoELV..DZD2SW>N+h3:2rjLf+'ts`]W^/]ogKNIe3!Z>IL)Ef?f/l+!sSG>qpUkefM2afp>_RPQV)Bc_A4U4JZ22_XfCT!WUl7!"K)_/9q*K64G$,Q0)H(+j)H_EGq:SUtOa=Fr#OkX5OiM`1H7ccUJ1-Z&,#0Kp2R_Lp>ZD#=D"?I6cCZ+ebZfmT7RD$8YHlVXgCK(5LI` %N+dU8BiaM:eRmXl'PV+lU$1V)Q/OJsgQu/">-UOOaoNlYBULW,T$oJH=3QUS97Ih]:9/bZ.j3hGXFV@t=ca@EZKh@lZb"rFU$["s %]tjcO@M]gLkMq>@rnpkaQ0f*,>m]OP%UJYd$Jq^t>5,K9aU$9'.^3>Ae/=;`,XKPdUGKabqfjSgo2fhtX:s(JSEc`MT+IH-L5KZ"$4^lrE+g5"?RAor=ib7rP4fTA"]) %f4,IeHn=LQOXVd.D7O&qY2[<_L9B0j*U@A_D[pa'E?ZE;2l6H$jN>*MJ]E3$'(sT_HfAfS'=`m\^@MHQ!e3hK/;h%cs %rJt81MZ&`o,hK,r:<0@7Bi/eLjT*uN[c9GuJA3;J]q13F\P[,cZ&-+0p9LGKA]or-)!(34O?4je/%KrhKM3MI-q\UM`6updj`%#D %Y(OLohPlt5ZG+1C/I"-'Z?!iE2'*h(5suA>W^j_'1\"G.Jkc0"$5R9RMgJ;02Xn#(`lhO):N\\M`&gs]?Io!uWXZfl?<.\a=``Z' %5)D/eZC8lsF\eTDUf\9`/#p6\Hf_5%$_)BDe`CB@Q\Sa!d004o;HX3,2,Y;dh(^]4YJdQ$N>_m6Oi,onB]3-:$8+4Q6&^FBR$W5- %29rJHd=f2FX,k_S^XD\Kd>R-L(%#EC01u/T-jK=de.-(a[C/)4t]YG4-p.pkJR( %B%r^caI'pEC_%0=(l[&3qY92IXKiEa"Q`O?4Ya8Ad\qt#oR]:Q@sHjKGVeo&0Ld^ucS1Eg+-#+b;98%g\<9S)&'#,TiuAuC\Jn$g %rFf[(8P!P*`a9J@[B&8$E,CXdYAZA:;3W0rXQ0*7o@"5.+lQ]1^aCk3/1Wc+>WFBsm&>?K'\p@rnj^H7L/u:`ipP2:q4Uj,V&Q2E %1:kJ?#fLOP`8=!mDoS3I[YCN5,(p#o2+_W&P30_cC'!29.W@gSB1V18Fe;A:/p"o#:!.huUS?O5'-8hNd%#!VZqM)dqh:tbF]693 %P,XHn$fGMU=]kNhYXj(L'A#a&-jY&8Y9P2*eI8Ilr^`^BK!fD7O3oM9D_bt303l2*`o>*LMaaT+#@&/VJ<6HhoZCr$8ta0A`jBFO %PJ6sVl\5T\!6&4H3o8LY#*q2N:506gfa@J0%pBE]tu[B$XIM.5NP1QGsI?$j@6 %NX@DbQIRU#1m&_`ju%KeH/@oLLGT>-_DP/"UBc>A/iArKGG4UjRV6C:&-grYH_I91(&)!I=2IlF`dI,lnfVf.6',Fu7U9X8$oXLT %0hMq?)7>!C1i_o]r1Qfs:#hkEb*Xnj2j'P$ZbEWME5O)2AH:j9INH[3< %Ku5rY.(.u8sA+jHF/Qj`ugHVKCM6N!O)^[a]rjSH`4NQs;!f[os.d0,!+^dDWMd?u)\a%sG5>djc*Th$/^ %R7qM:9@h.O2N<"+#U5?0);H6ro`R>S_\JeJ9`Ok]1BlJS)6We1/D(EmB@qFbnA=?>(]R4?\'!D&F %8$":6kSDWrn9LSce3me!1h+!,<)dfbHI^b#jpYj/M\4!H"casiGu,BY7eBIro3F7l=A?\'N&)>D527%#$f73g_l4E?/MQ8%*)/:k %Fs;,n5c\m$ndDiCXU/DDR#k0)G/=b^e7+"teBY4i,-k.b5O%;,fkEiSU9*4TS5;o=5m<_"JC-@-._9/%@&sN?r\Wgc`>PT@M@t@X %X[;?Y^n;Ond>.T0CV70'^G#k%MX=#?*3QA)=lP9!jCO6V;)mKTA&3-I&VN1qJ:kB'uVUK(eWecsI`YOk:0_>V6BrEb/LfQC6 %o;BU6EMX_(@hbi*co(kY0jY7/2C%K5?aa!U$ena$!+H;ECVs`s=a/WZ'HZirXqbVn64+(QcFQErAjt[[=A\:_lhJ;TQuh^6LOf2- %]nuLbq:TC6OPYE#&qWrb18[++klabkY)Hp8BjCTiXJ$t(4,59.+,d1"jQ$hb_VU=lLE!RG]OIDO_(0MH'pW0*CJZ8Hft4BK\=%WT %Za4>JpEJ9"]1#cRKJ&6n9`?.a-(m^:HlW`L-U_;>k8-?nH8jNaXYjJ#n73][<22ZOpcmX,85Ka\*R(Y\N$?/K7%a."5@>2.jtU7i %f6'A]:0:sa]en\")27l+E_n/D>/1Z#ea[*>EeO;?enbcfRAdh7O-/V>bAsSeR"/6b"'-MRkmX-9iWA;!.hqLl^?qesH:/qf[-%7as-P-[d1LFEi!B<`g+S21b7WDg]_+< %Eu!.X\qq8F;?pu2g\G>6h;-T(B'`X&qk;:9kZhTd=$9b7apH4C) %$e[@P`qe,NHNbQ/#f.L]3cnnAB,[YK&c+=n]\GZKhC/?a[d?s7k@m-r??"$A]kc.(X"\tFj?Bb_TGe?hV)SkZDXH_DrUH,I;q3WZ %?9Se#bUngL$0-\RpBnQ*V49@uf$rrPlsXfg>OWf)5TlO\i.`#qIEslI9RojU%uMCF5FU)oKo=L4$h=,fHG2FY2F3s*N7?$4_Y!E:oo1,?V^aJV]qf',^6.*'052Z\1%fiijaZJ(4aR+Ps0Wl1/e+.nsNnWd(.IZ&#Lj9)i&$DHLR?/I2#>IK7?\ %2[cIM&S21DFXXUs2@X1,M/D?Y$^R.=5CCmeh)8O?O.M?A'j$kZc.f#bm3SQ#ldnJB.)E0JV:_8=$24G)$U$u?fL!_9 %\D"$CJ6QR_Qt-iPY>q.VqeSIus+f[tA^oM(pPkWPo\;ju70^rnd#/T/\EZ8p.t\]?>!lsm8l:7>Yf%D(5NijsJdc[SjmJW?O29I. %6jRu_Bp=d;5nJkp895,ia6WL+N4a`Z$It6[;KNA>^/,e2.U)OG$#$ti5.,&BSPj=E4p;$]k7BPO8,QmV&ui!kIkT/NqiQXr`E,!!j4oH"?i;0u@ap4HfqFbL?/]I6I$ %BE1Nh>FoN\KJQ"B+c&Nfk71k=Nl6sIEL%S%"-CCGr+O\T+,^qma+6dRsNgA<#*1Eo7f>9mp>`moLrG4ajNU>Ha'%lEQ*3?#Qls7mPN<_C33:mbnSu+188NH[6Be)Q,ZTX-BQVfa^CdPG7#I!!_^FXp> %%:=r(\^+_AA7(('WkiCEE\9c7/r6,no%&b:1J=E!2jteQ2ds),lNcJZ$1>2NmT3'&IWlj+8fS"6I!oQsCbt0p.K@,&RTU('d1rGhO25LIkZ;0!r:$2+:$eLugVG$V>0_;5R %7pV\Q?98:$JG8jdEoG]X-Efe&m5-7]<.3-[1*3+SRB/D7'\'"H?_(I)hJ8EOe%@E]@%8gEjqjpDON+b1R'@sW"eVI[o-ojA/k0Y- %F8/7#`g;(0isapD4K7q;.6a#mRFh>@Bj*\#R8Op-/bkEHjW.-V>X*1<85ed_NWV;VIGMA^&Mj/0)YHu$TK5j;*& %(;D"LS@o^:X'X;'r:"MbRdbL<:]DY@[o_t2pF[eN!$J:Z`X:d9-*Oq)J00Q=/qUI$K%S!0f*q-6U#IiFdhep^mGg2`$cRPp.91+F %)!aHB@Ak6'Yre,2GC-XKPY`32DH1bOfd,$42n`dDah%lL %&;+CU1HLJNoiR02^tBjVBL)i^5q*>bIfYc<:\m3QGDaB71&[:B*Z@rRE;[KN0O-*QB^/l7>\riNbaJs)kfdWP %;XMW>C&)3-@^#\sDtPl#H9rIDKk:2!iRA>pY4cgjd46T5d&b]kM9PH#lU#`&hj_gboeim)2Am %O2H33\aK0+<#ZRP>QmThk1L#/C@$`PQMc7XDg,Iu;8onU]@N+4DH-&1(c=q&-GZK[J0Z(F8;slLKFFh&,l4(?!o3s-._pu[V2#RX$bF1&ru"<:e6FG)j-;g4W+3STP]9=Kn'Gl4"r*$5dS`<"?T)`Fq,_B%/gTj%/*OSGoPdYW!C#`Ga!)HL"U5A[()ZJ&aZ_Z;`"P4ti-:Z@%FiTX.$G&2LHmbEb\-L,@[:%[G>WfTeeQ`[FlO9F %@WBD.9%;[_%'(!Ag=]?iNfi`LfB%1,\V\`G+I'),2/5f#e_d8E`VT(uhYm]euc[RHql.B%&VsBjBdGms+'V7Of*5QL(OogIU %AN?qFB+RW2N3):W0=c>uCC+9,$+l9hGbc2@G;:gG=FeL`M^Fag&`h\V.29dqS1q\RR)S?4'Y)YlB?!49@Td-q9b.'BOJBlnN(ol- %0O@,;MU_6(&2fnQq2KMt9"c*F.J5Bhh66k4-E?$Q+cK:c$K[ %iDWCJfb,")+Y_;sQN+=6?u>sb2/A^\f1DdY+o-^&o$IRR/#'KM@19Q:Rh5he+.HB+,V$EI6?91`hIs8ghtmP+11 %k&C]ro_Ia,&T>$j5n]$+>PqeY('O/tenE\m/NaD!)WkBlKC+lFT;![TU"1PWWE/?H61?Ju4hkt!NkAV]`SHrXj4]cB>)EHGqNJgR7=`0lL8Tu&$+ %Dp%nWA#\2_D+f;qnOOpfOht7=:0-1E7h`!qkTYhfYY#646SJ %I5,:I?LtKg[5@E'`sm0K.(cSJi[[MHO\1+B:OI+hFSn(c,57*%&7pq&$`[DG/.'DitBb6iRW"+IiVrbd7$3[oYdjbZTl6 %`mX.E+Br)8=O+#=26o.q#-P,-1@W>?-Y[B.7.fsP,DZRb_RiSSo(MPr18<2Xdc3^U`"93j?_4'-$RL>7Y)hK9i).u6&jpPZI(\92 %>3K[KI+a@OLX3K\2ufRS$qPi_:_BI"_o6'"tJ'&U"aY6Qn,Tc$t8`[Uto5&;oSG:)DWEkCe %4AV,tDp^hr&9]H2a(8b@%jf:nT(2H %cZ+Df-]QDirduYSR>r^UT7afT*F,X0Wd)*9,XhTrbM(?&NK":@09ef6?p.*1Iu>D[$eYUlP2+B"rjHU:7:CL$"sr>6e*quGnL@rR %20N`k^C\JQ0)igO25emC^\lhnrU/^(bMOAmqu/6cs1A=!=9%o:J,&_erq]._qd9BoTE""SYl*2/5CWLS5Q=c%rT>9Na1o4b %q[`_s_s]hNO+6hll_"4>qX;2t+Bc9K4D9uc)aimZ?Oj=@*$X5tANc2[1IYPe1T %-OV?QEA%onKU@/ZMoN4:\#5m%gPmRERYY$dh!?_h@rJR.mUms]DI;/tPP%.@s'&e,>qA/,)r;gbdh4g+G-sZ7lt;`\%kl1hbP;_r %jfs'CB0I9^'4r^ik-JtjC8pgn*N#Hn=q2#QDe>'dTS'(]/$eDA+"fdS;j0P)4[6YujMsJ^Hg]uCk>M167$p71C-]HRH;DGC5fM3V %rquCUb^iiZj`t=K4[)Zc\,b>+VsV\'rA7WoOaJ#$T:^QlVS]B*oDH&-?N4ZM<<&HFb5L1Gr;D,T)SN9(Ij#3nrtfHn'pp=8PYVci %hdC?5Z"p"A4(luPh6pmI*%%YZ,E/1s+&6f`2U0`UF07U.2ra&i%fd]jueH/1ouM<7oS&WV9pL(htLZD`OJU\:?]+cahE[8js4i*)WlCr5@$ %iRlU_;![n&kG6l@NQQK4.]EbGDHcn#pA_XG\/8F,.eu@A6O]`obX^?I*>!NAPag[+KR:&G_[E-b5!]q+6+^JC"64(f0V1E5o?gdE %6eV&/\Va3QbC4gDV3,mSQ7Edd=jf2@gnkf53>CtIG1J@0jCXBcMdRQCXjieicm)C=dV(.^Uff/+E*R`acXKdK=0%Rn4cJ,, %F"SamMcrkc*dZB=QV,!/1b-]u;OsS>;4L!`BS5JVRICo]o'G]([5p(.VjYN,32&\-83*$G]qLZYn39pnfZ,YHTU0;;KC4I._t09A %26kX9@lEVr_t2%X)f(1cHk0%Dac!hJo'VodaD!M-B9#s[f.LX+[p,ngna+)+m[ep)[5L^EBMmM`Z@MaV[M;Eq_#hKG_Q3gU.2n;m %V#1c6],Qfrj>9XCZ>,Q.I7;6FIF=AFbLH^p"u:n)/?Ls3:_KcF@RLW5B?tOZZ:C+dN\mZUcUO\'@a5+6+^0cC]obukn8os.F\kQ3 %\gnmupR^F(>#@-@i(0i1\J`R/\5KXcD*oC=(72$d-r%;::8lHAMCL&/6?n*S&S;o;/Jm?4eVOmbjnVlb$%G/H8th1/D#P>d').t4c\TJk.JG%C7V%=2*P %bAEoZjN+3H)!qcSJ1]rl.Yknc=N$U;j03hJech%?1>KPKt+)u0rHOn3hb^irWnk>#j.U]M^uV;XagQUOL,Jgi3W-*cH8 %I"9uc86g-"<9'9l_%8Pt?1t9*lrjpS"\NRYkqB7/-K'Tk,^s1p]!W2T!S$<Yod03]e,h6[.5`k9WZecDPBfM958/%*7h#a8Qd+9XqN2F&D(?k*/D"-YsW+KlmSdWA/3rW:sK %`JC9t5o)KMWK46$7`q/F/%s<):.P$KY/j37K)O&V,pVOgjN.I6g*/Iu8!1lF.;d8F;i813Ej#r5&:eX*UQS %q'[khEc]b[S,2["QQ4c*^<%.BQa]=HoRK$eMMUm%m/nd=)5R)f,_Kg:E15LPH%KgghOJ1BRI`"g]_QV)_Xq"j".j.e.k^jkhIt4, %4;[[Dp!D"uA8UUiBc:f^,j;B;fa);7r4-34)GuSqAQLA*-9XOiMWs6_A"465MLq%jJ6AnTmX$5o@^N?Jk2B@m?oMnBd6VHl;n018qfKp;:VIc?he*gJ%RN+1rWjOZ%.oQ(Sg%TAt(d5rh]6+6[s7MDCGeVZ[Dp %BTJoUr*j_MPEsDW85k*fq;QQ7Y<'6Fb*Zl[9`#F_P\YFp*nVcONAV_V.,`8R%`8EQ*D1bE;9)r4%2QaGf=0f;R%S](Rj8si^5lad %"leQS>_RdkDA:AnKBk:O!Gh(SGT`$]qKQOfFWGP%7KW[mScTmQe^^ %B5HBW.ZO]_5k+=bf]:G3A+&c"gAEmG8co\P6BYj'U:Lb_\3,G$0rn+rpV_=6N$GI(DjAb %jEF"H(khjJfT:,UIsuL\rqnk;6e9%s7>TTOmt_PnPP;\`7*]]Lq/IV,["!P#aBJAA=HPK2?-sj5id9ZRf"h#JN3%a%MA\R!io`^h %ls5'Agur0KrLCq@#K:o*Ni\*+MB:G%rN>o--i2/L+PFs9Sf!W5iHq:if"uXMOWNAsc\Wp0V=P_4,a'ao,FV"acZdB52Yc]9[r9DH-Y9:dU.F!F@R#Q+VVQU.k8-^+7K>9mfa4aaN?E)f+HFr;"_eH\h-J %2e`pY,#1f?pl:_?A?%dZ^Ycp-ZbbNilMJ-U\+S^,n8Gc)ZOq/+7B]N[qr,/+9"+[=8>S36?!&D^p?t6sDb2;MGZA^#It#=n]B.A" %=g8K%5A\@ljuWWgs*mRHpc#tdjY),VnZRE5Rid-*A&Ki3p(7Q/J&,q9%DQDM:`hnHe[&cB\]5"?Fr>9 %>d0;X&TP1X`E%_YJjR`RY6aTih%:)%MHs@<0:TE*Bj=.=_Q5d)M$7c>=sgWfcp6B$m8Skd['YF99gh %5RZ/CjtH<<6jOQ8\",Iq[8IQe)R\*cbd?h-3`P\?`Q'!_]cB9r`3ncqh8`Tak>:;#R$4XE2&a1sn#L3r[eL3"9Z8)45,/CNdQ"ni %FuJ8W7!)i3aep(j2"3=@Q$W(\-#:$'.4LT5s&^qPX)"TM20/F&MrZf2$iY!PM?`%ie:F0'PA/JpThF)e"5lnF?4]IVk/Gl[":agm %L<6O'Wcg/AEau#RM54k]REahjCX1[&'9Ik5]TVs7+]BR.V)ks>RZp7]>!*p-W.!3mR_us0F*+]tk7E$=(*$oFS!751=ZHAMYnBB.lr$$LkEN'R$''QC( %KoOOGeKSfFZ9^W-&Ig/EQY'3NP8DQ>?'%"rH0U*j-DeL*oSgL>p2;h#6or\jWt[(jSP+]!*TEu:B]Bt_<>LoHFTeP5f;k3rSNMZu %lq"?\^6t2n\P/1';m(\C4DV&j&Pe/A*Ed0C=mG!tZ\XB%BT*Ig-/^[0_`+GIX0CC;HIo8RFZ,oY+mF8!oIS?&,R6^\;Dlq77XpUlmZ_F=72NIg$3H(!lNk]<5"dOK]eLnMPt" %TWX!'_=I03+5?A:Vtk<*pK$?B,@bT>-Vc6<%QC2h'.7Rb-6BTh/Hoq)Kt@oGf:A\jW$tdFcI9BJjlOI\jTCo_V@83jD>pSlB>JS" %3?MJfK+o+Uca0:%;T07s0:OuYcX5Vt5?Wa*Ut!TmqImL'puN6*>`2&;.n_CKCKi@H->E>,etEgHAVmq!2HW`^Fd)L*5#<@:74aYD %gTdo5C9r?mOelWHe;o9:[!B3i&q7N=%T[A=)nFtq"2BLAR\F8.30PcAU?6'EBRT+@]-`k)*"ZPE7=1MsU6[QjA\W4.STQ#@E^#[9G8M2K*#+9RF\7YUJgoGXB_!(l,s,cp'.nTP)6r35)J_sA"``%nP#4D^sIKeC)[BE"/ %cd6bcAQT1q#MFHd&"BUK0.55"B'N3K@a?9_P#+H4I,OW$\Sdpm+i0sWPX)2aX@'nOF;I-7Chuc %50O$Ilt!_6`/HN3fU+$Z@R9>:"bdF$Oqrk2Ra'<,*6Gi`F1eCW"'`8ElF5b3S![=8-P9l(ZGK[DM;i %Gk9IMg([EN>^hkOhis*K=3fm?4hC&1/g>j[;ItI@"WtLJ]TjO"#A_(2X&Gob&q,P%aMl(O5d>Mj@PuEH/Es6L[8AR8/(P_Sr[8d@ %nO-=-5aZ7o>F!RNeceBLrirSANXbqB*hG/2*AQ!%It!4W1chJQV%TM]'?UeM&UlYD&LRVo7dqO2c=^)MagD'2f,4Y">d;nt,o"/V %=;J!Pd:MO5N]i>0U"cVt*a)!,27T63`5&46c'8MB)8\C$o[&Mo$0GND!:e]^FJ)dDQ4@0SX$:^!U?%!?!mmOg0*O>:tuC@54B`EhC)B5Tdn.(+%m %`tK#h'5h0PaRCV,=!!'@Q`8`TKe69di/.(>q50Og\U"$@R%miR:fcp>`/4NUog&NC,@'?O(!G'^'7"\Hfp@ZD/$pA81UT^MG-FU5 %>k'VXAKn-1&c6*<8_1%R"Q!Ufm&)M3E`7ld'\eQ(WYR4\gIbD5mP!V4`N$p^J5hu&1E`H;E4ff:OmT)!?$bR$B %92N3,9$G-ql$@\_1UJTUX6e_(*Ji)5W;=4V-84PD^@>Hujl4*,2BX[#e,4<#hN/bTI'3\CS&P-1Xi?tI#oTW:,pE[4u&*3XNU$bYbR"88,uU9UOF"&"N_/RhtTG^;nh %':i.&jG06rUeQ8KT&@5eCTVi7(t1Sn!&&8X9gGXOLN5`5#1b9'b()WN@L)-KU1kSf,MarSC]bsKiI\`r()r/S^U#[YY@4Wc46si. %ea_`^qI7]lE^\=<\5qh##/()=*2Q:gk*5?<7K]djEN_:AjZmt)qbUr>aS&de\J6\FCeXk'&'1#&UAPR`m!N9$Fn %(GM?*]si0#@1uEXJ4jmZNm/1A6Q#m#9opkG`2GT`FB%<9AQsieHd::[)ZHn'[_7Re3GU_D-C8m?/;pc4f'F@#ouK"M`/OS(Rp6W_;:\#VVd^94 %;O%f9@\b>^cT"(qQ=J_jd+?me1!7p?-\V/1_W7=qT?D&aH$,!kH/S09$;)VtgZjH\s$>$_H.MPXX(!a[V.9,>"a]8_g$jFS>eP6s?FXh&`!Zh=[4D%M628_(F!iIAH)`cmOLU(A4ShK;9;]P?(GZ?;O5<2n0r8O?Df!SL!=+`q.#'EALJodE7J98@#r.+shW/oVIen_OC!SM\!p@H`X%.UbTmMNG6;+i!M7$H]sOMr]baW7!:V=\+"YafW!D1SoY68Q=i5*7;_WrIT**R:J)@icT'AYIIX!ZM]AkLTUt9@<)kY2AY-%2M,3bDDGN/pcRe(C?YrW?@hRd2mAiB.TEqANAqiWdpE@4+Rc_--L,[lC0/4o>r>M\#i>Z/< %gcN6$TPPQ:"kG)f?q"(tFA_'"3L]cN`UHm9X$XI6esNnZgm0J-.BTBdm4&H*PS(WsTIH)Rc:Gk+=Q3L"0Rkp=i$UXkJUW$ %X;?$(MSGYcE)qTtP;+GcHtUs6`Bi+XFsm>3@,C4JOJFW!04`bWh#Fp7AlEK%mUE2q$F!h4opN`9Js:)Vr.6&s-G(l`ch/NO:g`)KPRIk]XVkB6eTITtTfCCT]iI:NS-dT;\seDEXVCLeV_maT0RoTeon+sESeGs1MV7-D/[J65 %gHU7#A8b>-$q!b.&QWadmDFm)qMK;blK24(9g*2!VIUtqI_rK]X&9EP/kJ)ZC>fFoVIF,D3YBj?>!IkWY$moqKfpY^97[HKi&H*T %VN"#*e4?0cAEEI7JLn\$OZ]]1S=/=Z8c,Bn_H]`b0DO8B_:8kUE>Q.CY0> %^e\J',g!=>=0/N=B`i,n>g5j^Iq\mc0=tFZi!Z\f]Z,t8-j_(eXJ3t>f`/m*Zge5<:)EK8XAYPmc.b#6JgS%nXh'Ic=01$XKleVP %8u8g.0'j3kZX+ASft)$CIfeUK3L2^#1b/_*$[Bg\;$.5mIj06M[6*^m/KBh)_Krnk<02O&_p6u$;U+&',;e#gdN;)_Bc*NQY^r7* %F0em$INq36M5R/o2IQekK\aX+h1H'7]_VcB,()ZmCk@I=TPkOah@MuOQ]pjnA`=#h5'`&o>0G2GZ/3[Ko!m5h`*5'+;BqrNq9.$# %7WMQBSB6/YCA]EJ,0R8He_AQK(gZL(%"OW#=?&a!L)Fm%`-8>2U6+"([$h?TG*8K%!#RPeSLF3SUo%DF1QT0Q4r^aFZW[A`26I?0 %%d[@Vl9n^KeasDoF)tb-+F/WNRGj@?/='CQm/(\loaRtM*"*(<8pg>lB#t6dZp9u.;%U:e$2Xg*EB[J^[)IuPD>:c$^N$YMaX7,Q %n@/i)Clf(uKZ;7Bm]!(D&>)3*Es7dT<\Qi-.Po%@nm"(E^oh`\L94a_)j8(;g>D>5!M[aPTH*$;eU6=p9KA!g?hS9\/PfMtnJd`"X?8-63)L=e:- %qmJ!kAqAL;$8813XU/@Y>Zn-@+_@.M8M*(`q8Fhs(I>/"TUP\o5us4W?@i3-p=FfnnLsq1GB*idph,(((r0MYprd%Cdrj7ApOE'! %G-_.Ss7+oD5U(Ahp$^GGs&>eVlJJ^@+WW4FLcuAcsd;;0_-1)'imq>_)4#aljS2b4K/4hPW3d)q4X_Ak(L^H>[gMlJu;RWt_uR %%!f`+$tio\+lNfcS%=FV1jhV(L.*R<3W@Q18C?+qWeg4Oq$"@#Y$mjUOgM.])odDWA=1!0`3]Zq4*0Ub3elu*Fa3j"?qY:_gLN/[ %e;-_!C2?j+#ShD8f=#A$NM@7C%(c^4m3#N94dpF:L\e3E#'L>WKn2YBC9S^Q,-]PS`o=WCV9(4.$FBQM$[Fln&*SmVl[QE7$;SLk %nJ02+.OT&5WGTb6oPDYn:J_8hH7_q\.X%5_=>eN^$Hu;OhK< %PdWi/X;[5Khec!"iIIu!2Z8LSAW[MSl(ko7%+Zf&hi`^@8Ot_$Q(B@O7TR$(XFI$[=14*qnB7upfJ'Y_/#6NA-Tr?VgPgqPW#HZ3 %RMBTPDf%(b$RLkL'cq=CY5)\_V$a]L;_,SED_I*K.@0,mi5GX!D.Xa>ibsiNAfkeI%U2EdWZfq9*o&Bl]3K3gnH]Ff3W0k^+OT=S %#[Lh`P$msam\spr1:71j'P#Gq#lqR*I)34#GN>H4B_7Ji1=mt#R,Mnk73U7EYuRo'\rf\+(bb,#>slEQ/*Y.8Qkn4!a/9l@5Vj!h)kS='P*sMAfk,6hX?c^WXO@h-`W%Lr@0)[9 %?7>be7TN8'[5PG?[Dl_.%XS@]9'u^jD^1t[F5,,)/Ea(V<1&P.4R,Fq*>Ejo'XT9a[e9#UT[jZ %70d[d+hX7[D6ekf3-R]WD_phH7A#+RlR"nu>rQD'j"u\%.h*(h,?[8e.2.c&SrP'aY)*m^d8;WE$q3,A[gt=!F#CFX7C3*c#8q9) %14UMu*,1Y\Wj+0QK0C/9'YA(g2uno.BD9[&01Kh*)sSWa-L2&%Rb7op6o^!;joDC8h9\]4I2YUOhi."Zmmf %"p.Op/TiXK*MCl[EH`@,io=l9Bl %_n77S+"`4Gnm2mH.!6Uo1ltfQ4[o=.Eru?kp]QTR2"DY\W+%$qN'e,u7+f<`Sp-+e_oShaC2O`b>khdYY\6J0>KrrRoL2mZ>5F,3 %r+n=AlmNP[QH*j^.-Ss_:h+WXS)/c+@TW;(G7b3^[?&Da1&+k1Fmq3HP?:)k71Sr9fjc0`R[?+2[^IoUOqB6Q[TOip[Xn2I@6m/0 %EOCJ.)L2N@A]4g1\Maft;T9e=fnf',W0%g"e6JQTaMM]0DIKfFe>Uu$n,V8nmD$hr'dJ&:kbsrjVR]EIRn0fJ*7\r0T&bZL]IQ/1=q:a$0;,Oc3m=nKAhmqK7jQu92;e`% %\sXED5*F[l.[]*%Ni94nE@aoP"Cs"E!dOD'm@),i7]b$)D_lm%K=dabN,0_&+(Xjt*'0HjNmjPte5T=)eY?N>Y3(`J'`hnUe+E`n %SGUKS*G1PGK"Zg(Omg:1>m#BW@VS:Pkrd^&Vn/P$9F]I%i9JCNjJf=BQ0G6D0#h0-iu:`LBiZQ*j+NSRO\93S`OX#a_gC'.jXV7b %a_)jdK>X&[5c'#i_cY^(GSk:jB=cb+H/Pc?cQb:,FJBqU]-U0c%g[\VET9M;@%NHJAD(YC@a#90%;+_,>?I#VS!1\*%;^eh)i@Wk3;.5Q-"m)u:Dt7(4c=#pRIPSQV#+qLJ?Ph[i+Lf^m$"p3 %&O&VZOfMqCC:t.k=lPLZQS(r.5hs`B)E7+m#Q+fF8uX2"ent. %/3%jPfk:_%:*0#8rQ9(XgVh6he;Y3]hLth?$+*3)oX^@(.nM:,lU3/%mrr6lM5OsaRoJ`/C;f@:;*WYjcqY8M#]<#Wj7% %;aAc>i`FaYl>$CpoNl*RUM?lQpb6NMT-n6RBZ2daZ:jSBd3r:0>Y)5"Z\?D`fk9f\,`9nKFTd]r_H;W7HC5U-)ml%=5@Qadj %/?\WbDH5W>Z!X2i!"Q,kAI1b=N,SBj$]UHWUIJC/#^ch-hYSX?b+M!I&Q4T(i"RDA=#$`lB7n))I4mNGqk@F5ZrUb)!s*)tqL6Cq %LPVW*"-&f+6h;]LROl`.2nK;N$crespe-^,S-62a(h-ScS.=d%^fO)V-ks3g8WYTEOanJ[G!V#:-JLs>2]lET2LQ_e %L8Jc-N,,JHne8/X#d/ep#hR68'P/a@((q4H[kVPl=^+fIFFejU[55Um!/g+%!X"`I-BCfs(`!8%@02!J)#\Up(1sQ9]iA+fd_F;q %WRTVe+qJ#oKiLq14Mq)d)/[tD8^a3?i-*9M+O_)!,`U$RCR)B@ake$:NCRsV[tF]2d&p)Z83UVUidfbchCINiCF?F#$B;>% %+qQ"[a9FdorhirFRT>gT8.]fNAHW>j2FJUlSbCq0EN(I["3CbCA.'>S2:\IoAAprb7UWfBV@\q:iZZlR*5WAc@";b+:gTa"N@Sf' %MsWi]i$K3ae):ra10\Q70ltdgNXCeY&9EWg@9N)6!Nm#'cAm_1%`!'$-u7s4>btjNqIksaRG=rCLc&/$_J7AM,_DOJf(p4I3,][P %kW/kIiAAIV5c#^+=BFtV?0A):Co"8u3Y\.GT592o43QUQ(h).UbIqk %T81U.OiAMhh`_5Y0[ZYJ2T9SoC4b"Q8AeWlIbW+Pb#H>B%GMY.n'f#pae"bm]#o17\h2&H)2_I>6o@GR8XY1oD0LM4=VVT>+'OAi %S/@*GW-Rhto>$/"%dtltNF@Jcj^Buq:Y`AASY351"qL=F_W`#M"[^;NR0 %7q7^jCT3_A$52ilj/(QOHa3o;$)*n\=f,N[oiaBs;/CeuFR^P$*!2.'B6b2]BJu/O1D9=&ksWGF"e@uOOl;b)aQHA:?9n.[%9>fT"hEXA"F/1D %*.%^Yal*2VB+"=m@GJLSGam/aUM;-WWOUB^/FQQ*3mrjQi"G>$Rg7K:TdT#&b!J]3-i*"R+68[Q+CXpu-5jZ.0KNtp1]"U3q2:^+CFXl*iaZsa,6bsBmFu#&X%j?N-t"q*ZD)gj*U,(gJ9p8 %S#C0C89QTuQDk_>_\%5M@s&_CKIGr'N(P;M!W[3lKB@DNUCPqC:?P[Y9cVJO1]E2i/Ell:q<`2MfAJM9`@-Dc7[t.%X*15ACmi'p*"%B=MKTiIlc!4+GO=*n_9=i%)cV(jp&ef;(?DSRUa3sm %O/75A(0iqjErZ6XMlcbofM@@[B!e9l0H5"5bXh:9BHO,kJLZ3ADGC*f %UWYSG9FBu\p*lZ)h(qP5kCsQK>E;+rp(BHj,q(l<:Sf#""i`qo7'6d9W-'6u)Zh$L`^Tqt$H&;Ea)a-+=Z^$GuM.HV2?69P=X@pU+d@/e\WJlO1A+C@Y*8KXTZ[EZ3/l3!@J@=58tjUX@Iq"QW"*8juPY! %D[#V^6?3QJ.$L_e9?tu:N8Zh.dkh:YCT(5Y#&`MF/ge:H9+P1X;B4c!4QUT^9$Y09e9"c%Ak)F^6F!9!Or@ar&>H#V)kcb6c98VY %9u^i=W@W1mb_]4O!4uG/[%n\r=!PCuV8HNcf.X.@ir0PI,g3/HEEP.o4`O#kUVo*$YYZ6_;rgg/'-fTOf`qNf:!:A\Q;UF>L[aF[ %2/1IsR"M7*Y/;Hn^m\t3GdCPEo@siL-WfhE3;O9EKRej9P5rruHtcTFh9psCVQ<[QHpu1mB>#5J_qN97c=LN,iH#l67G4>llooIb %`B?,G9oZ1o/iRe%9qNG$SZuO5?2=X&*df&l.$EYBcbqsIm7iekZSTV*)#ludi$TLB^eLGMT[33^*p`.KaJkGj/7j>LZ&"P:"U3;5\=F"]4Bs!4%Q!hsHIgVRlq1a%g1"Q\6$>]dA9nSX?4:pO%gg.n/8]V5a %6#5!dU++XPC.p7sj#T/lR8KUfCeKkI,YjZ+a9_$@Z;UE>:I$=jF)=-E1-Zp(2#N"Z:pQ(!Kfj*l4SG?REh^B1f/G,;N>GQi!)J\+Z8U: %)F+XiqEp7Y%E>+I_qmG5i+$'4iDA]X&ulF)>EW#544Mm)N7tCK>_Vc_qCA(%:9OS)<^;p:%9ift;ek&/+>TOMW,6;)KrN7`S5h2m %gX$H9)Ku7FeE[p)uZogu_ %Q^8NKY(.A=[3\@5mT9qcE%sZApK1;>aQ1t'a94FZK8_op %**[7h=>Q.,,FBq-:6&cYB9W,D1P3ja77d3*-pOlS8fbi]no$5BqdC4;0cg;qTqEM?&',P3:<\MHWCG?X\5^8P;]L.onCqDT&&j-J %)8a2WPh\>eb46mp%M7R(1]Sdn?DGPp>t<+0@hT^oY9?dmq(:;KHrf&rX9X^i8;50uf#:b@pS\1Ch"3!:N6kJK2NN]:`i;b%:"mgre2hfEUei9Ul\\3K>;_&ZfT6^u:PJE[kpn7LM@h*lO>-J76AM%`\"$`=#/*1=9+GKCU5U?K>(APJ_9%[+)SiNLM$[RNIefZ&5E-;Pk$!=BS=1A*l\tCIS/^]N>\fi#Eo/Ff'd6o**<& %@15]!;pHH0PJT('fdV5Y+WErui;W"1///CH7pDLcRYc\\5`n;l=fJ,sq0uRd %"r1gWPd:p?ZO=i'5:NX3rh1%*Ep#Qd>?K:/cc$B-Oj/u1sl$+&5*8>`o7Q\uP'1#qA+03sn=ml3P1<\RhfLmlMcM)MP* %]*$_b/o7K:47.-g.FmM#C8F_/$oj42pt:>`#V#)4l7bOZ(1tqFVA$;4-42Ggl%';[S*$13-[1M#EWE"WD7[ %aWcs_H>\V/,%ogV5mihpl-BgENQjH&AgG\lNadVd8uj5:`YPQ*ZW,:d=DUC4E_PA$H$M?f+oMjbOTCM1JT'">UrOBE"A%2rTi*^f %+9ULP#Er22)R4-(f08u?,1H"9=Ogj<#)A_XFlYJ,QOE#[$_YL3L2clOYFA#BW!MNga;V3NB\4dcc&>*Q>-e1(*JY>7%Ma``Ck$_. %Lms3p$0g*q2\*-qW#D!1l`qo-:aPTk3";\[nIKRN$8[6__c/$&1=a?lk;t] %h)iFiD1I4,.l3e5>c,Ef'BL$eatX@>!PQa4.Dsa>Xh7c9&).99V2;pX!H^=rbgN?"gKd&pST0(=euK\a9&5a8ZGiQ+F&2dX[a4O_ %55WKu?io[m7!3*#6>K*W,,;nDW])0`gm#B3q(2qGETsl%Tb.J;;X(ZaAYbZ1?o?'Cgn^:f21X4DmSe1CFRW(i2^c.XfrD4+7Do\? %OO/!f,b@%75SV9NW5`?ZGGr^Jp="FUXhj7;5(]7mZjA+u#-)#82s]99>)*bfW)Lg,26o%`B;;0a7H[Ng*>NE[olDhk@$A=),4]9! %HAuk($JLfmP4PV6,@O>N0mY_+"W[K/"SgT.Zq\Yn@JbiQ!9iP.NJsdV=Qe@8%Ul-\-/+J&8WnM2/\oqpk4#@I^qtoOFLYKW6cNZ' %G"`tF8>q/u)$pEc@>M)qZ62MK3C@X^G>60+X;S %2Qi2\>D`p[\0]7Im3*/g:i6DQW%(sPdk]`o*_,+TknKN(:U=/-->DrNg+J/7V\MmOYJQ,ArOo4MZh3E;I@Utg_l\#TjD)'ui3d&+KFA`#:D`K&&m&npd*q7[Vbru7N+>a#mZL&)*/HUcB/PJ_ %#YOVD@1B1hHl4?$Ws=JDit?HUof"%d>`>mrc6AW)1-]A`*YPH$,%BuU-8M:E3(`'S!0b`>EE$ckj#e`[E'^72T#u4#_DEF+VTs4U %EFk/]d+\#ace9`:B[c4M;q!DQ-ml)'>tTr(ANsKt\2ZM#,AdrP,V.(!^nu*"G+up.SKu4"C))3c#"=`kAmM4=ED'7DMJ4?6+I4;) %eV7H!fWM4;m_mTgA[_HX3N\+%)@+ruA_Rr)"-)oN8ZokKW0g+Pbu%RFot@[,J7_1hIm\gW %'J!.KPMLCA6Ar,]4.dY@!t#?bPBF59`%7(/^56V@b&hgLFB1t2Q]&0bPW++k+Ho5d['B]Hi69Y8)=qD>VJ1YE`3flqRB]SN.$s>r %$s@;f%ejYe5-PejWl24WitVK8-`re/-?5No5cU/9j=ECreZ\<:]UuRpl2&s2V(>gHcaG+S!Ud;%,_-OiF %'1>uhXhjm5J=tSpj"k[ZHnI'?YC91O1W[W]_T@)Y,85Dcj0fm[K,$'sZd$2nrH"%0ark@-X)1c"FW:i7VmUIjkZn+Df4Id^ZBp>u %!FR`i$QM/Y'L^3k%E/W>!s!$sE,&rS'J3b$DkYBl[&Wm%Rl-V3'5JEac4a]Ub+_l>b6d1Tkp';;I6Wk02sQ++-kE,fW/8m*h9Q47 %m/SLrD0S!k]Ga"WeJ$m5!XpoTYrIuU=`Hr1XT0JFf*"sadfj-jH*mn=Z;M312k\JVPopZ:OBN8LR[)Y9j%m0#[0?$NEWTnFTEt4B %?*Q0.IZ#pBJQZtr[[[5=?E3,"fjq[YM^#:`=98!*)O\L-RP0se'!%J9gMF:$^[hAlmskH\WBIsb]GQ=9b!GcfH:KT.]:_b:RU'*9 %$#Y01f4sf89QufugAl>>Ej]me2@2"[@$jR&!^a$<\`G:kCITVrg[&X>%2>ErR9k:k^9TWJcVT0K?o %Y]an:B'bg$V>FrLI__igAjdBA6Y=FnU7&L^.*nZLELTL+LNa6.<0>tP,oSB7Ls[TK7;nOF,*K7,>uF5YnBZn5.H%s'@pd:RHN&aM))up)B*XiPH,5; %GCTb.i[4ul9$gl[XQ_Qf5bl]=A-:UW,Wst01SUY.4BSYV;.7u-_j?aC2h5D*,/Lo-!14ZDJQt@P3,39fUmRiUV):@j\i#\LaY'XM %TZKe7cH;?I$+%MXNKV?n7P%H98)gQMj<8-^T,K6L*/>a&lXk$8WP2q$pO3nRfQo@*MXmmZ;%IPQ94SQ0PsW\GL_[bm`@Q$e\h99u %hQ[)N7i.)&g/hC_uTKRW5kjfH-WX:_s8lPA0I5q %G6NdpXAGk^^+XBM1)/-,cHJS@mnge15+iPJ52);5`C@hY=;D@Bc4o\U[0n_dMclRo_g*.^(Ad!^qoERb1XB=\nV#tlj8'@W)[@#p %")JT+>b&b7n)gtk6m$N@%f0+[hHZ=8^G7FurVHhp=W>6afb2DjBUKb>A$fX>cj&AibFg&_=NnMcnrmCl`Qu %%u!(Cg?cWG1),\3Y!Y$e6GZ9Q8;LLUOYB4+D4MXI:o\)X5Z4OiQ43hNEcW7A9O-]WrZ.s>.qDA?V3KX2G;)#Z8S)&7K?g^"KqQH% %r[WorNF"ana-YmRUJIB>_S=6:ffDDjF/5p:Kk=O`/Mjh$OZoZ(MK,Q2F,;:]0qpBM@,_:-EEcURiY;4oGb*Mq:S=8] %5+nk&X?\jQe3Jk+(^:+(+E$rZ/-R%3bJfS"+6bD"*[Q5!#UYnL.nj5:Xb,"`>ED?UhhZic9o2eKq_$>`$%uCsb2DdL0'7a5@U6pP %AlQq'i;k$I(nJX)N1G/>W4[@X?f*G"oiM/"b>8("MEPSfHbTL*5CFBI8c$T/e7Ot7Zf6]YDE\6i(?ji.8kRf!L\%ZXcBR-(gH"E@c<,+(p8XY#R-S(e)727$U@gS7ghtR3Lik7[FFRXFtO!_8f)<[:me %>`k.l,\/fLYB$V^EPM!g2$8=6Am%IC?6e)i;B_4(%#SC8/rH$9mT#*m'1\C[.S$NaX0J'hW@9-2U]sAdHa%&1kLS>hGsjAVH*XQ; %-&/3NjQ]`YPg_KF;N=m4&.8(CgDa#V6qc-DA2[Pr%AYU2]?FVO"Yo8D6CP!uD2]h+)2*O9/qdhifH[WiZt?J!Q_@H<.5%SDBr^VG %E*>4qUf*5ER"fFY-n[;+2AbV0,#d'1"kcPnVPULDQ5G&1l4[=4#t=H?E/AH#QFUKq<&Jubp/n1iVe-Y:'r.U@r]eW?mB.bYFX6Y` %pDrZD!TPo'Y0-52i?-L!%EiG&L'B!S(`3>;L`X`IP6*>D^pj&u=:m(LFC,K9!Bh8+U7,lLWEm+c.s#:'=:mNrkF_i@B[$5`/-$du %DFf_I'!.T_X4Ms>at8Yg7)P]h[S`RF\B$Anq`C>kG%,\D8WMf7l,u??cC,f7-2Jm^mHBfS73/Ra>GZSf7S%mT]K6r^YCB1gIb;P! %0'gZ(%/jfn.ud3[(gjpVok=3q/Ymn_OL+eJIPss:+pZHK/H^i>`sN#G5J@Id#g_CMD"sA-b#n.("-!/!]Q\AH+t!8u6k>3f]jL+Tsf9#1![.oRHp6^,&VHs)!f#^XuE%?97FXfF?^`L&\?oT4@5>HA\/MZ6Eko3HiLog=)m %3"R((Fn;lZc`)(ff`k0leLUF+bt8cI4jnh\QHdHQff&Cia+cn;\FcLFW6#\aZE0`;:,.-Y/fR@5>;:I=242UP((3["BE[dfCcnq" %#=#P'_JEt(?*8(H3[JMP?L&au5\"HMk+>5J>2#;eIR??/VqJsONp)DpdWX5]h_[G"dgq1nQ/gHVcjq8JhO\<\bs1YEcG\fFJfmr4C@OC2X)jb97#F7CKUOug3A)3C4P3\qL#r:eaf+Jo=hni#g$tA %=6XDZQb^2mof+Pq4"d&p>[-G\EQ@M:Zbf<:QWtd)3a^S>HGqB)9eX8LIWoNmoPC9GbudVdhep?h)VYVU(9(6WJO/O%WnW3._VVWF %e0K#4">QK\g)K]8[>S54Nc1AKN8q:,OpUuh>qYF.+b"K'l`!Bq`HrEAmY@ad)83#fSUrc8>.1na1W`C. %44Q%\@6=?na(CJd]hU1Z/?Fi%J(5:h %alAqsYCBVcT_U;\[.M/a8BhA5SO#jFp/mgA1^\U8\f'B&=eT'-eO6Ir[$nn:M\hjb;aF->L,am4n" %+IK9.E'\Gc)^KGWs6_i)2DOl>OZp6l5+bgr'[.$mo<&qtYKMl?/PiT\pTU2GmLET4&h%gFc!DV`]n)bJ$1 %L/SYZYLjPr;ZbUF^4[a"LMQalf+G;$X5"JkKeib8DnPg>4\H&bD2iI/X43T$8fnHKLMOYnc=dV([Rc,0[&I&N%D?+7F2e-@*N"si %C;8ZH6`u79i4a[;6XEfL`Eb4AB86+WjGI8X7atqr,H'j#L0SmKq=.5g(lko,]>gAdr7'>9n-i_ukP0 %k[fJj]66Ufn"PI'JoctLN>uD`H=lV+/%o9u'2>gQ+CYqn>(6g'dY^cP_-Y;NUCOL;M>`@ME<#H)BV@S.'Te9)>26'U*UbiN30_:B#Qk`JfD_l8[=j.Np@4FZ+`m8>C;X(RnE`H"51?q`K=[W9+ %o(J9b4i?M9,F1?UF]BOIZqs`98EBf.2RF2+kKOLs6Ye1:K#;K8G)Ds0:4.Bt\+>lj41#A*h'Y*5b?h`),7:-P@k91^&[J%eCicnl %L,H,;F>1Ub?>7Of)r*BGa7@ct02g&&*q?HH9tChkh*JX^_+mPE]I&s>9goB)p=bRQAQ=B6U7lVjTka"YK %6_:`VZKX28TY%$\oMAG;0I9ZiF*gkPe>V?aaC%&F2l1:%mN)Reg3Xb&@/ZNk&F7`oo<+u&%8a,0BnbCV\*));N^[P%0i,Fr@;or%+*a%/.*q7MbE6[K79:TD44^K6fA0%:GD*kdR.ZWF%$W4>rS#/>VpN!klb;7sg%#mV3%#R;!6*9p*KKe4jh0DKiGh%9Yk#@HQknMZo$+<-]'K?DVJgZ;LGOP6FO8l?#T));jdUm1ePDR;kXI7nIX#0MPeHAc %oNkQm2!.PL`]QgcE>kO^D?ha"bOETWC5aKXo;a\a1$EZ;O[SS2]l8UPb1eVb9E$6H7h)gr]#Q%ON%9)D_pB02UTPX5lZ'#"0/J0T %BkiZ9k-_<"4fsVPZ-@tHMP`g^SIQ]o"8X8`6H[(laR-)7,Pi==F@!*#4+U1HBa&B7%dObnQ6Sk6^HWp,_*>PjB9q0L^Hjd3 %C8o0:XYi)_8\5';%Fh`?l9W3.Af^3<_L7/gI>p-th3P)JLh'iNi)!TUS8C!l*-K*?)OH))*\luf45.`B/J09#?"k5I[p)c#[-8mV %WBbm#5_WYk?ie#).a!pBJqI2O.rAG0"q7.93FG[d2q#0`;dmnIp@A]OC)Nh\;J`h-<2DS82>`8JXDURQP%/n0ZdHd[/7\9GW]$NU=C&[l\er#HoC8]`mX3 %3dEMr?'?9U1WFT@=Ns1g$Anu;:9t/BgF$rTgX&/nV%);_p$YCeg)q#:D.K\oFuZ^)P]kZ+XD350qNPB_g1[F!>sQRQK/>KC]\s`l5[p9IUl=DfXne3HC+1dZ/(^Gi,C=L %[I1hVlElsr=]al>K!gnr]N4:0f!2HG$2oW[bA4a[1IZ)?B697(-%QbpRT76?;h)J]DE.(otKfP:El8E\F7;, %[I.(4nF&^i1?f#[bC-M9d)"c#V.kiHm\Dh.#8OMIA4^*FIur@a#`T.+Ib4J6>c;fXUR?sddufsGP:s.\/BKF18CG4#TsUu>r0 %QMhpNhXNRBH[#ZaAedV*]l"T@(X+H@1Rd5HqmE,3%t#XS[T`-.,iM`"lE5#:7^o[*Nl5W-2sbY8*e?6SW6'505ZP3+cB>:O4_jWH %['O]T]*A^JIpVR-LG03g3r:XCLm$8X.3-G<43OZfd6$3Sce?L/]@!Cq1kKeYX-"6K^ma@^hH.T,NjY(aeEFX1=I\GT;LR4VR'H8i %kCu$in?"&=>YuXD4IF^mkW9`L;.E]sme;+,5H:N&kCB$`XYfM!pinU^Q040GN*g,\iLS78eC@5iZB5pT8JD1(.2QGYjO7-A[h^UUk1q4@#?-"EAsYBL8sKL# %bOSdJ*tU)$ECDM7=6SS3\hoj`Bfg1ZnM>Q?;c&Q2Q;J^rW!#kg;%Q/J\D<8$G9UV3Y)toNd@l10kA=g"8eM0LZ %&\PJ^D6`R#4n-u["2RpjkJ1[m\>BnKEO@1*4:Rr,/927tZ,CY4YKUu35\3&?KVrXP)(s=F8!6g1YXQ)Sa7NT/jfc9YgM"%$!]@9[B9Y7G7%DmdM@skLW=A(e85aY*U9O1ee.93!f!;5oXa^+YE:eE?mJ[@bm7@NahlD?(r@dU %0pi!SCfeG\&Cf+nGT"u!Ep?JGp]Q$K:sk4\\]NYQhuRK&duD`X1ZX7BP%kQ`fp\r-iHgH6@mc6[n=X2S+u8ME^DS&ZQb*A3`!$+C %oOS4C*ausL/!7E*(-`)i;TH]7B?62[_M6!p2*?S&&CNC*b?=GR>'cAibN;-f_Rk*X'ikAq+>677QSI[M)3LQ=F5.p>2#^^@5'mp^=/StNR9?-Q89MBE) %cH'?=Nac?eAoD[/$>/fY4VYC4dY$du*T'B"h%7:Bo[>hP"Oj\hoSc'O- %R>u^m=X$o;j4b97KYM8W.W$,&.qC?]H%\&korN;E/iRfWQ7.OT]=@LEYcg-kTIKmeMQIn&lS8V&\.U6uF_,?9>'OpKJJ$CPOK+Ib %Bo=YAoLf2FpRnD[-?kP/YGYUI1q<>ndtF6Ta"LeMY6&5s"A19m\Bs&b1Zhu*TM,KXh&JY6X%E(mbO-o#2&YO3+l[Ajl"@Iua=a$s %SnkQFR:&E&V70G35=p#`;r#jg;KNg=sdTn_1c9I-,MIT;cce,gS+55t, %&s'=+/p/&F?`A`bA)tQBM4n7/GgZsj@s01I-AF$?XO+O?KJ@M)oEI<.T+L([C\"pGf*>K+<4P48?mUcW7Y*#((SYtSZO0!5`CuOS0H]P>9E:r9G %mRN_qHh'7">bZdDe!X*h)@=6NA6'%%(t^qQ7XHau,i]Y4Z1kaAf5,Ss:-3Z30DE$4CkT?_6+E\B,D)fXaoBfiVl_:H6N#'8RMG2P %lj7W7%s91;5&)i"A_c7I<3&e[6cIUO,3O(XF9A$<+Z:VMXA9.oc"-/c2nm^rC0?0QF)H`?`BcFY[1<6t\R1TZ`sPN9.AX>CNI)#f %)c>\o`(`_7NRIC7^1icTo_mujnH8p@Y2fN`CsA(.9TKS>(&ce))O8>1.=X+p6(bQe[78GO>J%9>LnK+6D5SrQA+_I'f=[Bf[iI*E %h*9RLcZq>r,oc!D,5!5V'QN!@%%2IRS%3Di\Y(3/:b4:uoo/'-6'rCNUjfJNq3J,bppo40Bs&5qC7QM%!/4NSlc+JM35"+@?RoPW %cYPBHj+1Kjmh!%DasHH\^bbFai1XX>N._ni_$PO!q)=Y4qZ$Qj;Bjj#$CWIa4]3ps&/4Y$=YNHejHO*6;*[KmCWj=="i1tJIN=6t %k)e]XIkUC%qg!Z(8F@]_-k&mW_sIk=QtF&g6obqCFX^E:-Up#L^"IFC?=oHjeT)UIZ#ON*0^gW(gi,at)ZW0XadtQ.OZ;Gcbmd\AR1(uU;U=Vd_ %lVdKtO00h=@aCVYp7V(2a,8@6EZX+aF>);n(b"umQKNC7%uO]KBgl`I5JQE%+Vn7/WUBYMMcBmu_4,WS;u#lOIfdMsHP(:ggIfNf-6;*LU<\CJS"`UUU9g7YV:fU;,A24n=M#i0EVK,pCjL-(kq9f %9q"m7XMN%e2r]'d1m-a]KH(8-8NQ!fp3UFrRfVQd`==t %X:F9`C\uA&E$h@6`SbS5"6"'#Ps$S\Oa:N<($HLaBWq':oE@AB1opE?>qB6k)acLDQCb_\s9[]_AQcn0!>^md9PDrojlELXb3;=+i&o;P,?Ll-dK8%gTGuQF*9Z`@_Yp7O.o1F4##]Q[mkF) %bOQ0mCj3Q'e0rRr^ls$('EO!qZ#]1hF"1qF[As`s%<7Aj83jM8,mT"`LGi%4WuR1&KY>ObM8m#jV2LMuWun%Vn'K=dK&4oc`'8/C %IqDpH]uLZQk"=4,F<81H>a#Ca)e7^Ri\GD'K.GEuI714_gm%c9<_.Lt^^7H:!,^i;@8g"gh;]OTK*YdX)qgi2QV\iB-_,SKf=Ceh%%6A@<71`k!;M8Y!T?&DS)-#bq%D+CRfILZp24QfHe5$pdpG9C,9=&0)o4;-/1ET18^c`+o %%t^Y%]SUgE+,=jGEq_J4pPCVdSPO'hohU\0#Js)sg<=_X<$nV8]+DdWBT['dc,!/K%(C#al+!4k]CW%UkkZ&#:t[3l"/3@%"Rc/$ %l#aGi6gPq.!J4GM[J`]\d[GQ@IUtHC-/<*C;=^*1WWs;Yj'5'BUt^R^M`,N3RZooE7in/ta==SU!i?3-2!M9"BOZROdUfLmbW]`! %&([O.fWi=S4kB$m.le"]LSHcHRf+!e+a4jqh8RiachF3W%>T^FM2qG,L7Kp@/:?(G@,>]oA,n-hfGB,CJZ@G%Oc %d'NP?_9j5b:$ua(CoNBp`)Cd=(2i9>'Uo!M*nI?>-B_Q]Q54&FgW6*LrV3@YgIJ1?;&C@R>QV3r2;uj5W`%Ul`sSqG1],cr';d+u %QB9-HS,<'/"2[hI"/obL3Dh]/,Q2#>=0d<9[46D(%#PIdaW%oeD"F-LQ?HC4l3*Cu1*1okM^c!GnBC5F45IMV>=keCh\1iOk'9.o %0WqMZMm?0m\<$'WQ5WoXZ^gJ.4i>EB7XM';:lF"Dod3pNnT[5JDndSVZu\2/9._ZHf$YGr+jqq52R_.;X$.)DZS[iWmFD%*M&R?l %bO=)%Qrki>$D#bm'!Ch,ULr^k(B\`)-Q)3l/Cam?kV?CUm\9p'^Za;sc(u^B.E%s*)`h?W'uO?R3qOpJ=Q?dNDf30B'C9G!EM&ik %Vkf7qC@9_k]EGuM77-pRC(XXp5i,OFl/VWj;(!Js*@#e'`epH`/pm$NXHK8FiDY7tVmPEBk"/b!USjW/8csN:2&EV):,CtE+ib+-`3OC.jGX*"90,?mTl=Q@qaSg\suL\b,#k/"LCUKn+E/Io?1\<>Pl`lbWtJ;oQAnn@.HnpA,n+tp;2D7CFppg %P(9lDTD'_+60>*)J_cB=5%jJ2='3t61m=MS=^;K-4-I1BQRu2Kgki(sCrVjia;mRQ %T3!_91p"/P:u_-h_0-1BBmDm\Tm_Ko%aSo7Rj4<(+Mu9[G02kiPN)%)3Urc+VoibcDaCajO?au[!(nTqjHK3+A[dW2.O#f;=.o>#2kIrq@H4rm)a91!Y`I4=:Ae#0Z))0J&Fhj;P8)5r^pXauSC%_m::0hhl4"G@6jl!Mk%60L!'J"AJiiH4_ZMU'!>Ja1UMhX3lk^uq^PFkh3a'9I)S]!6_O5'1g-+k]'`(hJ4EMY/C %j+J&CWmfnN!A*Jb3a,7?2`_-lTs %pR)bM4'P;g>S]tC&!B_-H.E];fXpk!e7DT0CMt@(*Ploih>>nDG#*Tbl4\DN_H;t.pK13.X-o':EcAM])S@V:ZsB!FpQ5Y6fX;m: %9;4E%'kE=*2c<&S*)`I-bg@>"*=hglhRD#BJ+`j%bE?+Z7N8Gn7)AhQ07B4>NP %jO^:@GBu"VI.4em5"!^L+3#)]1$r3ahdk/X(60!W>;h]>ctf?U_qZ'e@@kig+t&:Y.OYM %JT&-qfUXMnHMUVGBGf5S_PWYc^N6.Y&bf_VgQq)r$U&;#=JK!Za'6eNgTT(bNEKLX>"P1J&eQ-]f$K[XXgL:r,Rmfju"ak7bVj/AiMbH=rQ*R7:7X'u\'Ed`INPG9kao#lH %;6hF2U9^qa&?.S`VbcDL)1WXc`!E>jNG>m>,:K4q#"[\$L14)3lIBRJ]3e@7$C^+tH6P4AlOGE5[00Ltn?p.KUra/^8MKhbhqk$<7k`V"S>.?'.[+e$3cHe)?UI/UD]G!$R)XO@>U`$q.c4i_T&+#bH&P+BN^C..jB4g:1_tF%8-h*p4;\^Ngb4maBm1[!r)d.r=dLfel)5ktV %5Zh%f=R/Q^>PAH&,3']VV(>F,OD!C[!r/e@jN$).0>OuXQL29IIai4OFpdD(HhMTXXrL3@XZ!Jel[+r5G0n2OVl=Rs1Lg^9G>Vm$ %VK1R^_r]O@\H;E=jbtALjEXdIEI&+sSg(3@Wot^27h7u5;EYgtl4mqM.#BJ@_XE#j)BoXOE<_$=tBF&_a:70g=V^lJ[?WPZUF*O %E+SnhZuh`Unq^BqPW/QYlHHhT'J,)MAHU+L$nJU4qRA,D?fIM"N--KBRLf;KZ1&+4@/u/[l.?KbnE2#Y>BKekFfsXt(P_h>YMJHp %i1eMlM]0>eYFn#GG+ApB]'X7'C@WfZ5G\Yu^@Kp/j4u2OXR'.QIQgua$r6Tk1d5$rFrtp"f8[EJ,qG:-g:dUphXG9N>^D[#262>J %(N>1^j4)9'P5nuHX-q5(6mB6qgJY4GYd]nV/gm_P&Wp$C\MF7k1c4dT++,ocnGQi[Tm5b;1 %0]s'>I*&UfYAA:8:\q"`]+M]>#rGVb@ea+r/!dsT&@J]p2716(LYd&9\Z0i4T88Elm.Pl+]n6NCT'DcX,uJP#bHN>\>!A8<2?7:$ %_A*rT!?`7'!EiCb+Q,^hB^JFi$P9-'bQ^jM'ZC%/l!E%\T9Z-;Z<3(ptS.a?u_O#QC>+uAE6j,qc?CqKB8 %Du;PefcD,W=FgEblF]tb$!&KimG#qCC\C`CeSB94tB;d[%qeec`qiZ%EYB+,*BH6jll;1G?7b#Fis@+ %(?GZZH^l5&cYa8#cjQYnK'(1t2$/)OOEn5C[SlP(NaK2p\bHc"A;/(>$JUjZh/FA6gJ6)e.k09YDCf.tYSNWnXOpBo93SMP+0'Vi %)Kj"J^pGi%>P[iu',XSiBMYVpmA,8lfKn8sA7i%7')#+a=AaEZ9pJ2ho\Hs$pO4)'!7?&jd7R1um(rHHQIXT2J_AT%A3%UNpQ[TR %ga)Oqmm*T5co2->8MKqG_W*Dn38KN>-+/=4g3WJ\?8[#'p)dQ('NuTme7crsRdlVf-VQ#.VQ!@fa.Bj*UO-kqS0H"u-AqFjZ0dd_ %B4d@u2VWGZHH_^]8%E)gMIY`d"[0l[UeO`A/h(\L0KeHq*A,leSekr#iXYFpLGE!E[=i+pSL`UJSnZ)5Gaa)M$)-cdi]O=WljI+) %&K8]`E`gImQ#kg@+pk-)BtkX(br]!?9J%]I-/B#d7^dUq=&T*&MXOXt0gq`WL))]r2L4@s.h:R(#"(3()NR\=*4#iWW*lnGDaPsp %*(in*a_$IED0f[s&HM3f1(0jF='R;&(V7/gbiJ6_H5T0_L@\7.^^aS@;>W@Up5?/HQWnlV`bui!O.Pq*TZDm@SjB73h)j##o"h2gMn#R3T^u(:6G='^4JLo(V_AX;_VNs(!jY8seg`Z9$/:>Nknsc5&?N5#AaK/O&&SOhe%=a:sKi?(AHX\M/%CV41a,DVQpO84,d0D,_JF_\QW %)Ll%/i5Lb5dLUrrmGO+#0&EuHcl5C.:C0,VFj(QihHcmk,BAJU'#Sr-5&5M>+spYp:<(qX#lbhAe:J95,7clA8aY=F=:G;8Ta$E. %3k"?U9S5L3Cr04^W#42N&_eAt=a>mbk%J().?Tp0X^W4HRYG&ZR52M:V%o5Lq4"Y,L`Y&OE]-;!Kn]%iSsSm\H8&fF7Sj_"Ug&'1 %a@^H]hQ1VoGib'jDPF[L-l(Y6Phe#LT3FB?@!u=m*-U[te$4,H&8!`['O*H.6F4\4q8N6`R*NKk%f8?O_C@9KP&Rbn$N7^VY,e1+O*?RLP=,umP=ZP# %[lk!B*e]5oO2H-LJrQW(.M#u]oH]DAd1G1_D4ctfg\AJs``]R8=WY*H^&/Wue$UK"MQ0'?WEN`:6b7H+YCJ>Zm=Q!If5k_iS(ZIp$R/9.!;jCT[geM@FkH1HHWUc\QbV5A;0K %^Z*OHN#"O`e^!nFZ%s.]'RTNHK&^?s0(kDF1cYm$?jFR2_AeHmO[W#FE,'NUFr\%:Lus&0(#aG&W`2 %n8b:]r,H`)RLLED4rH1AP20&X41q]\;PI06*.nh-,:gH:GOaf9HPC1KCmI;*G97T*]Wo2P'pEhE;os!]]RlEEHh]&nC5np`ClH1M %DlI:B+`%;o\0AjS`$"@p@8FU.*-n#-9Oe5RiBi%P27^C0=X%?0(^"Z1PdW@sOt[Tam%5[3N@,S-F/Z''UVJ7%]p1XpF](6MFtpmk %9nK1C`PU;['\BFq26JsRd30(3gk^-uQoS.36;Zo[oa[QGZ2<&FElh']Ke@8#h8JHd7\V!Hh2#="-b*V9[BCAAH)tA>;^gSBJJKAfCJLR@CSl3ZVc^/icrl`8RNj,hUPSeP>*7'U);^L^ %J'kMfDSTT+q&5OeEVI@^]l;)`gAhE9#*,k9]Q3inJ?Y>$G,LlR[$egK\L;HbicO&gj.g5XUlUqRqhebqqKAGJum.eb8T/ %a+i:Z_O<`O%r6C.jA=5&LL?BE)0/uIaC]G$/T^)WS_/rPe-'2Sc:fK.c\@f`TV4.jJGVrd'>`i)$4*)%/dP&EEfRV'Z608#Th %_dg3]dp$;hERJ/:VX^)>g7-7WOa-U3#^XsE<6$3"iB`3X8J*.I"-pd$6q1;b$66m\'8M0NQSru"oUZ(1X#"7:G>c+N9-2!U-V&EB %Y+[C]$#2(9&!+Q+hJUD4@XNkh/O*KGIj3Z0Fp=&De*k&h]f7m>RU5Z,]2;C!WY?o(*6 %EnrbQ7)q6=`=F)*[i^[]DNCWa=9Ho8E`ZPtiAa[]Wi59[Xp?`T,#]SCPo,qm*Q#@W*`_BWF,A %_[bK7(LItDbFVRXC'<=NAIsAs %jtaR!NB2\d'!T:AkH:bI/5h!#teJM8E>>4dE;DJN3p]N&nEgkFZLeg'B/.+-H94;Onl'bTEP/'h2`"C4=bW]lVB:&9AR#_@sD`^k:B %9fTUg7c].Q*I["BMBSs)01r=NDeCbX4KD[c/0PtQ:0$"A(.:]\R=]?A3?7.ea0E_oUu>/C:0?kSWMVk?!qn/9qe^8q9QR7hQkINM %/_fDdIa;0]LL\G?O-3ZWWlHLTqfg83;`T#aN0h(&bp9r1)_oEhfO8BZ:$eN%f$7D?a0l*lO![#B]g%+GGD=rt0$FYWh+#-V$*G4i %'..")2_V8qXg,kL>2',U^b&HR2M**pL=5i\-83)`/*?!h0%C817IR+c]bXfm=e3Tqi$DV)a\qcJW'kAk3 %?M#]KDcGdm[bZ-5jM+HNqYuMY-8LI:74ips&,6/BSS#>'5Y[YQ@5An=.(c:0[V:Cc^+(ZP+EuEJ;td=FpH?_h2F7J-g8*%rCFUL/ %)3P&rY"@SN@]4<#B?*VNXB_6Mahblkn4bNcb#`; %)Y%F[YshdC73E:b0<8ZJYG^;Gdn%@J6]4aQYtQ)RV"aY^)*JC.V;?V]H*Xc,nm.)<7TVSX8q,m"Zb%B)$j2\sHl0SF"i>`(lYXP' %cCH(-Q@D*(\4.%%2')qDrK[#P]F/e`&gMX]n; %Oea5\*`O^>Z$SkMV7QDn4tLDa(Ypu5E(TD`2^:;KT>F-5.MTG&T@cb#5$-jKd%Q>ip`+selg][nM^9F)0u.>-itYVGb$]gAR.m+0 %5Jl^T>hQba"V0Rh20)G3\En8=(c;p>e36nlZmhaj[Tca!S(\Sfff^2+oT0Zi>eqOs+fMYs@&uM$5*/A&Ns*`LXal[[8)l"D/u]I= %GkS`$^78*(P^/Rc\F:sV.2FN$M^OqPmAF;")]NpZ\Rd[Y]N3Mkfs(BXVmtol'"m<;ESfVe+\>3['tJk>BV/8kG8eo8"i]l%ZsCbn %UNlo(JH6YhDd8U3A!c^BPUas>gAh"!O(m/;F1&nqZIJiLeq,Q65sqa-`]]CM!KUq)08F3)d3.]N!%r!ljKat]Fp6D,62Tna-o=@o %a9,Sb?%$e$7K+Ki^s^aV(e3'+2Y5nR$\OZP781Sp]qD7[KcS_uEp.7k];Y'>?6@QjrFk&c87R9tp:LACTUZ1Gk2/i$dRj[NtG]*n=<.-^dO1Bqq)Wbdo#0/j/ac/=s7'p5I=#PVq*ZqbrL(T8lCn*O_2#338?#IO&MGi$"@lHeFjIQ*f_V+-p' %F?SUI@LRF>@70n#fdGA-L%Rqfr#7O6qHs^M6,f^&l'B*N94RpMn %E>W#n>J>XP<==:0%:rA9e@(#p=6%pq%3qh4`4AT2GuAsQ^H(Lj3:adGNYRX6`rR%+\I!*#/B^r&\S:5S9Bqh,Xmo-O;Gj(WD@X67 %]sb27H)Et8n@`5UU&<8UK7:sV*.65ZDI,l[A(^p4q8T?N*O+X_LU\C>3%4%&2+Ob_?1brSU7kF0E!V=CWh;Z3OP^.h@4!?U[2=WP %I6V@UE[(Y"]?bY<^/9*>29&8=luf/K*J2+(F3rIT[[%I=EtPW=c73(28IZY^`b=1[J'dRg2QZ4S+K^gGm?MP?!#6$a3MWOWjNh@u %eC`9+@jqKrd#oA1ej6=t#a0np=PMC=qF@P",em?C@Bc1>V&$gq#MI?k=F2&Lkc&Met@NS*er# %*Emh!+7#dSnNBSN&Te]*kp@cuJ+o#EcCL]=4fK[5^KuMq:NH\UI]@D`.R.?f5:o0`7\=BmeYe&e5dsWFE]D>_&qUD#`>Ju/Ph_Rd %`ciT068\aR?e\%[RcK!Sh3`D28%%CUS\Q,*=$a[]u?X?a(%!^''/G0>\_E0!H:-g=<`Ip;'bN2l<.?e$Mtk6us2a!f-p4\nqi:-W;*e08.k`:_.T*'K=ao>38;= %3f\ok*UalqYr+LEaosNA)9RP)J\kS-*jlIr^3@WRj4HG/lGrT$H"tRo\:DI3\mc/./!0)]]H0^bC0b3'r%j^VV(6ot4rfJ#4Sj&q %[##d8as1S57mn.um7s^R0N6pnZp"b!E%YE3_0L+I`3>gj!D9_J9IKH"2.KGY<7]@GTt#^@8On4[cJ38#$t:-Ej7Wn6h*cTH`@F"i %gSK3oq#h#*-ne!X%aGuLj/.bY4Jt+&Wnr?G^:d1cm[5..b5WQ6;\fW?2\hBqb,+r9*Va@G!B4j:`C&>G=,!V()-]8?12,s/b0W+3 %i^`3GaF*bWQsJ@Aoh_^@TsBYgHUpJP0a+a=c;smPhb.]Ekm;7R7(e)o_54j*G]X>>/,iRC?u]Bb>ieQjh92dtWVN0RfZpN,bnV^-%/Zk5kZ,uD %'#NYA*^UZ%kO,M+AQk+-a*S9Z.%r\0!TLZIVuBZ/(E2K`&J*1m"+k_+o_5=_BcV<+)X"e %`PN@*NWKF@LN0[R=]N1j#I=,bib>O]0o7%1PQ9Aj9,]H`Z&JfAh-AC[*^Fs!WKR\SC!Gi`aaATJf8!e,?rmTZ/g?G]$>a:>dA1', %Y\Sc"W)aR*M+0\Tp8L2`=(rZsCgg1^S^5t/5D;3T'kkT:ZQYMZ$XB6,nQA$hTh]hM)E*@>o\sQ%`Z>#Khm?Wn0 %ZG(apg=9QP^$ROKAbZ#^_GV9-]6^?G!ApOFn4idu&RrQgp&;Sa.]6#VGH1CJmG$K.[g-*J;t(>J'AHeoT<;NNGW@=]` %d?/%d83Q@1frS-eX:L>X!5?iZ[sZp5Pgr(/)t,$U@jGH*r+m3?>ga44P![tWQP.D#1a,mX*a#FoQ%s9&K#ar:n(4GhZCB?Si('_' %BRr^Z[T*t`iEV7$Kh.=*Cm7fWB"M7X6$4/g5r,&ILgoQMTMBlm5!*eneP=Qb=dd5jePu$]rL0%/5-M233'5pM5=7(=QTB+2>P8h> %E?gIlnV@I/UO$L$,8\_c'51`EP,q:FKUfGO\l4Fj/EBp.EET#.+W.%VACe`r5*UJb\rGBA2b`Go:C'm$*4^J$4lH]^,rbc*TaN,D %Mi:for^mrJYiEOu_#.T=:kFu=8*WcMEATUY'nO_6^SWg`;%-J@\+%ZoCQP-9)d0"HJ;.aenI[UWM;dUAQ@uOlJ2,8nT_j!;c,Q!T %k.?AHRM`=*Q"V=_FgS46fg7t.*eSd:Kn=-b;&o!Nn#F'7*YH,Wm"Qt']3f]d5Qf'WoZkKZ[8WIp#\`M9q]hJhEO^MtENCu8M(V'4U/T,r1^"P0Aj?K3fVTH2Cn %P3P,mc@Xu[kR3#4Crqm+R'n.\I96Z,5B$Wk]8isIF%%dQ`l/Jur,jU_Q$YM@;mQ%NCf>n6XKlt[UTFL,O"Z"ATd='0M] %03&'CH&(M4?.GUi'm;L>*B6lpoW&M!Gbo073dcM/SYQ8t8J`?:;7dBAO#Ed^+]j=1W0&.;fW4SEpZZbj3e?_8mIh+r",:da %m3dBda^_rf%6S\MaK?X0u@bWLp-PG>hgNZ7-c=r^l`5YB:+Uca4<43=3cqp-G$P@]\3JTuME$2?R+a7YSUVYG)Qh<5@1 %>[s7)LpU#[ahkr5Wu)Aldc';"4NZ-/QO=SM;2EaQ9uL"a`#is>54Yqk8#be8B<\+jM8f,0Run\F"/p7f$P"M+3N(J]ESab^h.a-Nh1&uC`'V>>pFMeNpkbshfb]$"g*Yq`R@:Qoakk/(/OUd:*/f=C#D0c$#n$uWBI$XE`tRR01;jEc!);nn<"D!c;^KX %9L-)LAL.]'1$kMtCOlaA42GYFH^>m%H/4*-"m#>m_.i]RCFD'\>\h!Q*hUWD#cY$eccb;c+RIlmGZ4"0`l %2E"Gc;N,%9CLMLJ'lmVmOqqPS$qpt %EB2J]mrXPnVag$B9Q2#le.GCK0Aufb@@*RaJ'jLi'@0^`RC'h*9jGM*dUTPK'?6Kn"srZW5c5&+(';&<>_#_'=cLAjKh6_cdrL!h %atTBPGOO(Q#q@9`i[m\V%/ %!1VsOQV]Td+:.*PA^F#`pn%sr_n*k`i96sCi(BN@LYINl*N#TUQR[7^"^fg47\< %9"_Y-8+8+&ijHK^G$&pSq@X*Zb7jpm!"@K3Yg84h^CnR_24LN!>qjbK1_+%6cc<:>^LeJj"gqt!Ys0q",+:](g=.QJnkCisbIWb8 %kM6?fp+@Uc4i^&%23cB\lC>j:/sEFiVeUU&<2\Vk7Ki'*3&:jU6&M/SSKCUb3s@4fJYMRC5-=Djn@MSY(meejcg?GXQl9jDNj(<; %VYDASq.Bh%BobsrRFh'p"!tYT\BoVI(Q%uo6159qgkHcnDMK`a$3BQ_\29H7=a19O %&g\PqABNn5G:V_g&!DjBpSS5*Aulm(:A7]$]+Y&^B:aMWp0!LJM$^ECmO?"H1Z/LQPt2EnD!4[$L(#HbSsf8dD!$tj0IPbF2or:1 %fe+HiD@[`--]fo44nnmK,UGrs?(V"[.$Dj:4W=R?L;#0RNSAJo2Q"rt'^\='e]V4lLq*.WX+QE%D>'G^2_kOYi>3+(-`L!2J7 %Xe0TAkl?Qht=VX/6DfVfo#$no7^fR\g-1B_qknEY2b"6ou+[o4fHd8HE2CFY[Qc_--CRN`BC? %\2sKTkKm1%m+Ei"1*_PhN91*:TQ)3n6K\K\J=e)-Zp8Ed!n@.'T^2d36fNlOC_mfM(M76p&+cRSF7;o9eHF%J03o_dKcogFB:[T. %q%%,/Q^8rB/k/BC;22,/lIiMV"QH@6c^me]4F>9>p+@iG?O'6;eM'3`-9YVf*R`O;VIPZ(^S)#TS%'S0a*lfmk;E&-8>*pfgB*pd %@NIUO1(nFIc`=b][8Y$NVP_8!Zm]U>SKEtDd0QA6Z[?'0J"I6/K!eM3IR`_nZf)9$Z$@2A/'uuU+rC2ipc84B;Kd9;[>*4_@d"RX7o^&iSglA!ko:N#p_d@6:W6bnS>%:n6Gs0ekJ9?WWP+*eo'fMjgXS28h6ppp21\"6Kmdjo]`tE[/U.m4pj80*IX1(#/)/cAo9&X4J'`rSaiZA<537C^fXPdf)Eud4;VZGQh;!38I^6G)$Um\hc@,dj/Mm]AH!9$`%9t=hLu;ik+cD_\N$PC[42dKpm908WLaWnXS@XQ %_\:8mU;qi`R[l)Vh#A5:lt?O#&N`fB\&13:KDh#[D0p8,iI]*>HMFE[XQRUu=MM2lBb=o'3jFLdeEq4E2hD?6Veu^VQg5iV@n@$S %n%.;5dY6eIa%.P^Zn#BrJts_Li<8!%5DIGtoG'oRT&JpDQ*p_!:ickng#:].UKLs$4q9*q/8/LI_eR<]/hp'^CN:.;*D)VUjj/(+ %'>YXn,D?FqR(_)^a4>;,$Ht/:W@h=_3V*t&4tH&.?o"&[:Guf*Q'(VkD+8dBmuOU==e$cm$c9c;&S8.+.()D7;P#pkAR-CI)7j%, %*rL\[4V9-%>M\8ZJXg-<%Qu\`?gY(B/Za#k<#q#W:6uhsH'E(]o]AXMmDi^,nS:'/d#EJ!m@!Dc4@$1C(%$Ers"nU\7(IdtH*7oE %M"Ru-c>cWVC;IGr)hf'fR*%Va+P*G1RAHJFJA+q-UUV>c99$.5:&sg(X>9?lH3oFCcMJ4G'dt/9\9JC-g0eqn/]fTXSl7,]G$AXZ %)m+?c+$9).N9mI68+aZU7ot"Ph'p!cR0\:Hdlp+TITrZJESP=f:n*DT;q>e=;YJCHs4q\j\Y,4+g]r'f>ooDuZKNYq;#J %@4?d4R]csOE?-4kbPfB/Y]]r0jcV,3fF%HV]Zsl^o62QSMm^0nls6$iTP'Vjc?dNR:oNWl2NF'8.`EO#<3c4e0UQtRFumOb/dG9W3735H<3_[hta[q>"H %&?e-'1EP@K9:7p:*TFL5hD/U[Q[F^?X`MtCI)ZClXf=ah2hG8uF[`q4jAf1.^>]hoII-aE.cJos(kPffY3`Jl0Xt?M%X#`r\$%AA %BFK3V_ViDre:ME2SrYpC/-i!sUNTRk$4d6`^.>rPS:Rs)$\rRAirNJ6W\_"p^?#k6TgO38->o*G$dVOk1uA*h,nmQXHlfP,k'(NL %<3bo,H-0uu7$Dc8CG-&eON65`FG@$1l`I,/#sg2%IejgH)6h(WqV/g'jQM>Lc:ni!3#X+UI/"SqRfSCXjX:S@=e>K7s-o"[Pq+kAS(dCNS]2,gKEP*urO#,^I[t]gPQQXmRg,Uf[NCknIV3D?XAYVO?cS0/Jc2i,J)ZtgZ %c+)9;W<#AY^c9o\+ADj6h@Ah9`fVQCES/N4WMm_<_3W`^28o=IiL.IB.Dec4+'e*W.020ndUX6A1R&b3WBHh/PjT'ZO!a-)5p9ab %&1L%H`SPfaSDog-kT[+UNZD^?WucML%b*>mK<"KkcEQa(%sB#-[ne1$$"_6!H5q2_,)!Sf0lPs+BO[!YAt<>R<=#nVjZJU<+!9\r %b3bs.WmV,OJDfblG[3McM3cASDA\a[;' %b@AHeTJ,#Bq\^icYMc\J_O$C"LL?$GY>8#29WP[7bE>3n@c=uf4Tp&"-oJaje>hOC/,!FloT`&AX>*-4:>rP2Ms)D/=ntShk:jEB %AbRVfN``>%Zp>X&&RhpI5up/@6a1j5J*R_)uMlWl$o"6Yn$.h@f8tpBZq? %&pp>W%'J_kA#E'>'#YGS]gY3)Kb,*QWEI]0_/tDh!P`k_1KJLf]6f[U#K*CF^g.PI=Gfnf`5KV"eft0H::1L8h$?fe3-ks6k0Ic0 %#)TA+TEk'L=5=rCBAS)m!,fjB!TUOm>SRZ*6k#qUnf*@g(bWiTqt4mh5n`S_P33>S*o9\uHK-@WGE(q/bV_2!$jO\DKi`js*c'n# %R+;fMa4r'OlLO4@dk\B#O1\f%GB``Y%l"?m1q=gg7UMJtX)1dS5cS-ZM`!Y8i>S4@qp#uXl5.o^2Ur5dT">^hCF`8nog!k %<3au`J7t_!5)#i7PT'e^j"85!Sqd1>:ZUsLI*I?VE3*sJ5)Dj\b/?9iGV*TUk@hd=,?!uBR7VRgm'uI!,_7q!kW^_3]u0q=B>n)@ %@R!cq=5;55/WDa/X]@T6:f;0l>V$aTg>IMa1PjVjF,DA#o)ie(FHpU.e(\SU"@nS?;RJPX.3?`n8 %BR(=uD3t$jKs1luO>91U$J:\t+l:@?KY38I,5Pm?!IN^GMUf("Pt2\*XB'6I(MT(QMWlHXlp['&I*Qg%@&IE@IFFH;s'cVEgF1$X %.j;Th&8eqFZ"MERhIA^_f,_$a[@I?hVV`X6Nfhig![G(I9:YVTjr_NR^QEG %4aVS(d;T_SIJe2n07lNV3@8c4LA`HW]Gt8Ckb:G\+:*n^TTI4bdN"TYcN'djkL@?!_Lc@c%OXCfPBWWCZ7dC1/Mdlc&H9@V"cH8@ %K!3F3d?Wt\,IQf^\W9nVY0Y_\^;F?eg;4F-8uU`'W-RG2DYndP,%#1.fX2g"B8@!XEgYC*3_Rj'N.?025;j1\O."aF5^=QPQ+I0@7#84ZLNV-^0*n[`3;/iuO*N45I> %i'?h)[W\VqCK8EA]Gl)N>ZFpC"U^&jc1qpp'N*5\3MghZBflaMb-Q %deB]mH@"K5Tj+ReB=8Wj^.7ZY-Ga3L\IRO=Ka8eq$22M3aBJDR50V38OMTKQo%XE.-D/R6XZEJp"W=o6Et#G?@p=2C+;bf+k]GW8 %2QBb*K %_>A_[i;_B`nb+R=R*RdaHBn_SXcQGD/ %Pp0['=I*g%:I'kO\=3`l%(,H.F6)-W%b#tO\eVHHW5=AJ(F;ZVAX']^I21`UP"":6_VVe'&Q`Mi?LoC1gWC0W^^%eBie'+sNiiKq %3!Ou#LYs\>PUA#5q6Sk5"MKsUK6;AI/&0?r[Ff]:L=5\-@[ZZ),:]_]&I[fLEJ.1(a2D;V/*`#3aa'N,T0t2ae %k0.8s):[`(i!afGQ7\@<6&36>\fZAk[BKdrM-'gt&eHeH8)XZRp_CT#8MValFM>KiW?JUI]3BO#iC-B<6L**!CS=UrB`$B<" %p2(dr-WU3,!S,dQmp`\4ljpLmZeg=PN>:h7W'A+`V=S9/mDi!-D/JB %cjW.,?@Fn%Z+B+!*<`kmm_YL1>Q&^d\GE/%\JZ5m4WBojAb/K?&GOi&YW0`faIF#3e\D=hGZlaXU_7X$Su,N\,YTW5giff_ZQjWf %G-Vqip]0rtFX4Y?cSfVTp[8_J34im]0;1$XW$Be,hANsH>.5Rs!5>dtS])eZC8'WnDn?+\['Q%3e<-p-eMoq&W"M6IB]AEEFY5^]Nk`cD)#8K+^)k+-"(VJfKk+.LH),]Z'KNhWpjgd=^D/]iNOE[=Kl\IGgsou1rjA'D'aZXVB^>\@c?Zb-?/tWQ]sB(Z?/+lj\`m[nNpZ)H?Bo4P_A+sgH0k:[9gMti#Xg[G %iOFZ'QJM`+""*Ier$O;(#55[b$:oN))uKBk]B+5'fOn=N %:+^,43:/6$PfLd2dU%bhS8m[?HLG@jMUJMN4'K'KaiqR,2m$&-2lmZ[3F&Pn0cLlmKan4&&(#_L^g(a)RU(8NJ4\d^H;1GH]Rs);G+[Pj7fget]-aN79\h4%KmR;$9CufHb6V5"3%jU5ep1.%SEmMc,P$CItr>SgGAfcuNFJ4`4cAGHNS(Xf8_V %g78[qLK^p&/g'c>K-TdQ^1%cS-#]9K:qCa-5Ne;jc;^ht)g>1X:!M:_rjkY.@Y9Ma4:^:ui;Im(iK.ng=uEeVeMmR([\;6@49i`0Ur^p#<%N]6JjBmXNJX#:]=7EeAcb.<6ju&$m>+(]+^Yf1];m[<^k&LkPZ"46"W:IGR.ADn/ %d[mq!>"\_.=t9l]U34S]5#)]\%X_omkFJicm-W%sSAK/9FkgU#^=I$>al8Shi\YZ3dI-@/EU_,b"SM?$H"eT\*`p1,T"Y:a#WdOh %m5Q$WD3GL-%BoX+^fWnBY%8![PLll%%j:YgfDTjkd@1kN?h8l$`GUgjCN@L<8TC/FJQ.hS!9V@BVtF(9NdVlJlcT?p%'Ehtd*Q_o02()D^]\2\T]BKJu1N]tggjQbV[i_%`K$hu'IiV90r`_o8@+inq5;JSF^JHaMVj7ns %G\A;cj6LcNnPT/<:eU0OTN*_`O9'Jeps`$K]hoi["a&dk?TB@)(bBN>kVP6/%j1GpifBaLL1)IE$^YIk,;i7>0(=us)=PtYn>k[D^bSX[d.pf$nI*l9ZEfasQ\SP:"ho>gMQn2uhX`5`TlR'&G-A&D9JOun$]cHG%i$[eU)-*96itXe %"9nS`5Z^?S*ET[uNEinHI\S$?fsL*5`'^S/1cG#:B8Kd=(@#dP"**o>[tc#=`bh57&f]WhT7Ft\IR"XArT^."J#q(_2=@\JHG._9VkkfLnmZOJZmq)>hQG554lIL9l/ %AOgms-p.cd'$2%fUKH(5Vs;T72cF\r]j)kKc*(lsHEp=@#Y^jZI\>i/RS$d/K`pV"Yp>E$a2bYoG$?Fq]&=3$6G;'?8WsthJU@4q %O7>3K#a,">O4-3C]fd9b]uE!j!)CAn'Kq6dpgE:Eml%kA[*g&?5L(/%G!7\G7;uHq1=uL^&=cA5I>X19k);ctGT]@lr(Q'h#'Y=q %hp16i9pUi1bB9=9E5dP4YN8LAA[_?!j2IaPlbQJPbX1[Fkqb.,"aF\Go+!PF-ZNR]>`$DT?nc,)f[]a>hpQIMr^SgO27+MI[t7A- %jQsK2X5j$EMepqI8BCF8n%eD\oJ`Y/<`>hirl0ECgU>^o)8m.eMh7B3cZ'P.Wp'*uJ+,s%Q`]iUV?*Snb#gKqE#"_hM79!/b%Rf^ %=Dj@dAlI4k/qs];gkt%$p>Zk=*%Fh=Q^Z42[O8AB/J^KpSenrYGj5_*HWV7&-]._D2,"]Z9YPT6CAWA1!V6/#UI>`nD9hb,]K %]8*a;n;P9>$4Gpk,*uM:#L,Va'dfEJ&f/4J5*Koi^,Sli!I/7VIDdo0KlTTekj'bmG%N-4Y(*pX-!p_n$fOH6!Ocf@RONq"j %EJ>D#kcX&#+Sa*g8Bm74EL^($2%YM^jnO%Al[(oG7=<`oNK+%pWJ;#=YFmgiB^OTg[4SgO*j+PDd:0J`*n6@r7`Y)@.2'D,SD1mP %/:L:7hA'XI>uVfP4@N)q3`PINV/glOf^4\0k\HiM[g%o\oY)K2(8n*c[a7UA`IQTk(o@fZe$B8B)F5h!+Sa"qYQJC%':DFT]^%'Q %gmNtE9".a$HaLg^Lr"ZRS>e-Y80h(JO&*;,dPc6nk>_q?+^iN*m%>%0Uf(L3%%HXt^t82qbLQ %YYnOg+.aYg]Rntq]<+1,X9WG#pq1`e1&S9W#pb@^D695;"&$[1XIA2UnN1r,,-m@$(IRc,7`Zs6E4&FBeD'S(R+?LJ;^8kos]PZn'-c[LY %i.EP##dD7CWnfc2aqD.caT,:Et=b?rD]d'J\6Pea0Mk.#j33'CAfP2M\Md+"/6r#4\<;7,C\QX)%r?V9`\-$\lWG\>ocN?5nt?KPatr!V-Spd**ZP=um7$bkc:l<9)5n.TsWY9lt[ %LVWHC4B46\i!CfV7KrZ:d_kIJ=1g)g;jAB!=K]iO4Z5lc^j2"n^fIPS?Aj%Mrh;-(Z,'Sl'`Yi!\@q-:d4.Ak=K$(+#96 %'qtbj9(f-3Xs6s!JiSI%[\3+#6g"2r@%.r(`Xur7?h8p'DJc=Ok2"9M#]pBQg:1#!Mp;#&>p')9+E9[V*@]Kgp*5aQJjW4lc*>@m7pL6cbV6oDh$.4u1a;I&qX9GM7(F(at7:n[:U<;;1_X7\VTif6i?9$h"cj!B"+6 %&)4+okB6;":.7\^D<_,[D"m7:mM>]IA'#%M?rTjf7pu/)X*\)4[)Oa,j,qr7QIj`[`tEF8!YA%4dA#()00(?R'V[:/4PG7b-/WB. %r1r9,GQ:j-r193'*;8PTl?M0F:e#6q,3Ck+d,jgH.XEsX1F-C3;JQn5buebcd'pVMY2PZ8p]KoKE$pffAqBJD,HU;$lMGRY=(^Ti %YOjraX*BJeNF.&Sc\Jp@0a)Bt*>^-FCPgWGrV1G(?"(VSQDR"#k4))M]9sMHrp)j(@A\VKl(,JsXB)=^uj@C)aSYJYGRAW]C %JXTIB!%pppOV03d@M(@'EHU#C=\.6T'B3X&#JPB2U?eN?h#Pu;AdY806_*]u7&IcM4;g]"QLFXrTE#"^.MOa9seGR9:;\.mo"jsOf %^e>u$H]S\kkH@fkW_VM`E1D.3*pV.ZJet%Vd>sm=DG0]/?a6ar:/UtbB2>?5Fk^8d:P`CcV*Fh?c7(;*EbA<6K$D,D`1%%]No3#/ %*;i(L55f=mH6IKIe)7IB(-hWb]S(eXWRIXoM$,ji0;VKu74fDTTUaHu3ZO3oGZ %B'ICiqhJOpZjn/t"dqmeW:P,/"O2/ZkBV?p`ZEb&hG^U14*l*PMkAa4TRsJ(0J!rT,Ik17cfX2KI=KpF5MZd"/TBXCr2qID@`.%d %oRHVRIb`Sui2s+=?2AZ#&.n#*rq-'FK>-u/mdmam>4SBph@@tLl1%-0nJKAZO;]4O3^B-!TGS(Pf6r-ZYsT,?kXKXb4dq[ki#HLE %q7P5`%3W9icemJ(6\@sf#n?)hAca-4hZGirLTqV`qMO=gKY\tK?NEmrm0M:3P&7cMBA5U %.,fLYaIRB=1.^U90C@Oimr5'#UN;O0$I0:eFN2o"jJ5$hV.g*k:Qu;9`>qZK!J#%4rR0I75rgZ^c7'2'A7n?mXKkW?qW11D %,fLqZ`bq/W93B_Y.Sm\4FEEN5ClsiLpQFO$3:S-pNU#M$2\Mo&DtO=;Zg5C3[783oD)N/^j`ZK%?U!qlVs:.kAVHR[(fcK:`TYc" %7Wc(Feji36;%ee`f>l^#5YYA,Xm:(S!#ONBl\_>-$d\I5P>_-BFGF1KmX=6JF_t>GZ1B4$Fn5')RJsVL-qA2-chu+)#s8.2[>g&4N0.;^jNr9\=;lua.a0NJXl%=$Ap%/4]qT&X7 %$N8/omH=N2kCX/6O^A)Ut@BY**DCl7)O>L\l3YG8k5*o=W',@&mV4#h<&GH"#,GS#;*TOn:>+@fdp*??Uo;Fdd-,n$Wk"MPE6g.e3C,A;Rd-[AjH)'SoO9F\0sW4l8g+E8rlp^%!nXtBH]1,M98DVda_f=ihD9obC3kp %Hrl@!?Yt,[f3eRJO2(XCfmD2HbHA-U2##W]V,tu>RKHGG5QiR)I=kiLg.lR."`ei<^8\!&6J0G9]1gFRWTN_FA%?)b;;; %9.B%]TOUf8957..I(+=(nIg&T^Y@cRY#20+Xo@cm.3_Br_#R_OA-en5\]U$*:-r1-NC+>MHj";e*or@^k %L12s0P_tqS2bThhIA@:W1>do!!+%_@.t]UZj!KY'U8lhHc2)8@$/c#@muScaRLpZ7JD-8!Q$F&S#qEJW0L![AU>h\2F@N!uK<,nP %b0G8+WNj9o:hbeuF0Rg"@R?ckU17LcHc8AZ.;VB9Af8D&L\Tp]C-!.G/)t5C)IiNBGK_mV"X/62.\iZKAR&m15a4.Dj&-bVr>P=\ %3CZ-9c)_2OP %5S"Ee>O_u)1[dF%['Z-pCPhA;r]2M929YR+bDH)@o#M^8f;MJG^YC&LDn!f.5,mpmjo2*K=mI6ZK#`FDX7X/8H1!0'?mYBNJ9YQF5r.gX^*"-n]g32Tr?@P__)k6;^j=7 %.$C^<%Fe@^?*2hdURc.0T?O*pY1r.77VVV%rE#D3faP1M/CU[k,BenP%S,3Q!UIp\=#n"JS?T+S>?tIf9F8"VI$:&)!=+E=:>['B %#6O#Ma1De8n]MOqeQl/h_5U;4lNh6#?Nn/Q/'KqOUoE"GIC,5^"]"G+:d:K=6lA1I&8 %Cc1NS^$ubWTKr\mLu/LB`%96Y9jK5LFO2Rdl+qDejL@_-mnhPQBnTkb&0D'rJ%U4K$Y1NXRnu.e&p;S&#\^%oj#S&2Mrl^X.oelo %gg2kqR.)fRNR3YaJ]@Mpo@(-F2dX>gp,<*67E[H>Cmr##4ij,_7S]E^_ECnq2HdW/frbJWmj>,kY['Mqg-h6J8&%Wp5iLj+U)>Wd %QfgX?m;ZC#71bKJX%G-J<,aTe]4r&lTYUijqBgU+R)O0fUn*HYJ:rP=5imZ3*s#`;W9NjF'jGCem.O\Y<\a4:E0(<8$DjK&.V7D6 %`$:,%hX2e[I#e1=cVTK$$SrenHRM7`"Xnoc!HqE>WMoUQ7Y0nto,*"+mc,4[)nbqP_J^G's/qa)/>3l53B`8+!Z7muc3,>c1;Z+^fI4jgK-QKF[N8QUnF8SbVY[r`-NRGjlZ=B=4L@WADa*[H"S6KZ@K %*a`TieJY[(A5$5RCU"AVFqL`.=c'+D2?I5l(!dRlp\;mgE%#FqK9Cm7DL'_5D$QA5a"47Y^h!f= %(6)U>A$H,RmCV'-r]/AM[Ts"iYhl2e[n+V&_D51P_Vi;iqO<64'GG@b95nEG^dmdb#Xl`FFU5MJ&Z:qa_A#abD9[ZY'I4,j#DL5E %f+mP]Fn"[:2KN;_TU-qF]mSU<\39@k`X?G1-Z*r:^et^jQW$.rMH@e0]NAB-QH?3$ %\-X:Jcj0q2(LcaZdaI6O+^S<)>W3uW@FX\Jg&2_tr[sLV0-/%GIN!@BAeG!r[bc5;IKabR&\fQ/r!Ltr@]FQOcKWIdW[@nb&epp0 %9$MBsZLin8[?>g5$a)SOhBeY9@cOeB]*e2YEM46P14lNpkBr.h1P88[*roMW:pdCi@]4N72nGr4(PfjeC8l'shfL/#>N\hc2Gt9)L<=X-JA$\?a'SR9aHXjsNWCtD&5PZ-"-pWF`V2\6Yr+dAWcD9G,dTP4PgL!uM4=q1!!JEe %"J]B0667b?$dDNkhE0F"Ld[IZ?q9+7d[X=V*Zj3T%SZ^E#AOY)k66g#:0E$(%>J/4"!H"1OQTgmLlAF>(.$0b,h5dG>3f:`(!LQ? %@PU2+`H7mQink)#*(Vmr.:HsG:psQ`9EQd+*TQB>1TE\?nKt_o::o8q1:8>UGh#*N_=dVNBNCLG2Nfg2>6&Z%QZ%a?b\ffmG)TN4 %#btB>f(n*+Z/O\78X=u=.Za]-:_?3mj]"O/12M?-H)Z&8%7W %#bs79o@L`u@,ol2IaP6q"Y+PV2fXYK%h&U&ok9qK7n"lU[3/d&C!su'_NZ9CGi=4s@cp61H2[4hS$37CWi7>79b.7M\U=mJocY[: %Q=s5<+G3&O:_as6k]1p_gsL,*lDJ:JLNiCB9rF,Oog(PHAJZuO84@:+UhOA-n@0I16$Nll"=FYPDin=8OrulBn]NCD]a:(l5$0E: %?)p]1MH[/>l>*;)()*:rBU5QhJVpI@QOD %i"q(_HFHZ)L\99W`cB:rH`moL9[1"6h7T*Z-]g-rU,m\"oJL<>KST+jr %F2jNX2K07AO&)YCH&5N\4%+gBAdUcq*W+aa;HTeB]E24l7K4J?94hm6GSE.73+e`b]M,>`u@b*n$Jb_PV\kO"mMs(`pTtp2& %[V_677ARGT^0ch&KZQh)@8&HR9_%mWQ0al\WAtSdcU.BG>UH!P2Gn#cdZ+dpmF&JeHGr4[gs&f2?NS0lj7?bBXXV#gf%,l+SS7Ka %_6Vl@a,:TUE*!\pWM#9s!-?!%j2'-Ye6fL1/4.,mn"sg/G\=Q$l0h)`^"_MHc%t`OjCf)^7d6FC$aJ"^9@YhuM[9HCVmrT_QgL<_ %\^Ts5P!PtRA,L4aKX#!"DV4ps(Gk %^a7YL_J/MAke7smXEe)BOYu.-%3>OO?JG.bh,YQJ[rU&sY^:4dJ#c8dL>Y$$-@(1>0eO5rk?LkJ6mQ]iYgD'.b`P[DOAKt5l_lo( %c5()^AR:0Q5e`C>r)j@u-4m?=[T\8I:/T(ED,%HPbLfi/Nm:Z0X[&&\7sQdH"n8M907aUT[5=mp?T)!5me4U'5;8I)OCaNemEO(X %AS+Y^;_L,7[94DVK]p^9hl\h0,H=n2>a(4`!cQ3Y\hd;of<)anI2:#lno?]<.;2]lEBsjFRL'jhk_,,EFlfDT2d[g%6+!8[!XXHL %h#u>#MPs)-:6S"M)'H_#U6cA'-Z=o'>G/e_h)..&(@26%m?E]ki0[S$=fA@IFhZPk<(75+M"KF36GeJ`CMY.cDdS5^Y/@p!PZQM-/PHL(@*u; %/UC`7+VL&09L;0CY/?U0X+lWsqf5imOB5^/&#Tf/9G9lFI:^dtaj^\caB*Y7:dl#jJVt3G%Z\7L!Nd6YiLBbFg(Yo9>l+ %#aj$-%8.ff!o3?_9$GPG_r#-m9/VP+2g+#\40ZA"[X\_`2C1M%CbbJ9s%<1"!3H[GLCmJbCA^:Hl6":a8m`AZHr`$Aaq0.'VMp^*^h5ci"(K/G0320["(!=.crE$QW5Sim %:LSpD[<:G]/cU2T-Cb"/)0gbPTROC_CG0)O\'el:@3qKLqKHLU3[AOU!WF7V/7S5D9fFkQ2M?!L2dNEZj`u-(\&H0WT-11I[J[B9 %RWstuYg*E%h[l%9aem)8,H<)!ohqQ0c=HUb^g]M&$ls'Og,Fk88f7bt97s:l_\A!&ociHs]Ia?WE.CkE5k::.`4B?S(Ja>4b*J@6 %dW>fr_:"S2&$S?hp7l;l18Ga!!&iqN:1lA\6&aCgK"ItEME/lNB#&J/<74VX[\EQ!ntUB0P4A^Tl>S@ %c<77OZ_a>n6.&KuOND1`!\t$'"U28)?7cR:]IJHY^88k,"5FL``:M.o::IA_cnbJt-@aC+g)PW+J(fk>l^c^h?f=uS9gl1>]&YfcO %\Yq2(0%tBh$=:P;=CDqAq2MZmPL&HpEm`m#/EJB^9cS3e9J65?X*>!CqNh)LbblZ\/AWR;V.B,*&!4G?\fisPoo7C:eQ %=Uk31HbC,e#>JD;,tKW[BERMCpW1V9@a#h+`35`SX4>&Z)QeD@:n4hX[HX4/,%,QG;#q`Fg`r>d'^3g&QMP!SCVV%6[4Ff,+LXnO %X0k(7A5HrS9nT%_aE"#f7gr3EaO3qHl)[9&g%jCXBrH1C[Qd_S>,5;#loD&3XPh*-[aFN,8^['-V3sXT2jCQ %L)5kSZW1KcHB/shMRooX],;3Cks4PrcU$k'Whggp^;Io:!H1G[bQPNdLouW4T.YI`=&rPJ``U/YSM@)3`?fK8qVg[.6W(+=dQlp@ %TV*4U&%a5GMdL4e!qPu;f::Ys&!b5!^sn3mKT-LlGO'E;gVao.pqPRkX8d5mQ_-Hl#lq]R]5dKT %-U9#E<>W')K@I;!%6H8%JZJW;H\sFX4(*gV$0Ocb^_A>!'%/aW\jO2cmq'lDb&5($Dr=?$Ap=2"95*:ePm`O45S6b\>AQ>j3#UMM %78oD??5FT^Q;+1Uf1h'Y\3_Ynb0R,I(H&Ll2t"LNO:!`]GK6"=Fg]c&qLETJ3n %R6hM(Ru8@Whf:ZY3\*DfFlIdlc%]+f4YHVec39Bne/32.Z&(3L%'Q.%PjMHi7F[nJmGhZ!$lrf'Zq`mC3[%/j-p,j&,f,IJ&kdAG %,&p,j"lZ[I3r\c>0XDFA)0F"]`T9hX"M*0#]O-reTFO#DG3jifm8bXF;Al=1qRR-#WDiB7!\NHKS*Xq;?^h=9(N+Q(Jga6uobHKb %dQVHCp6YQ,pR0TJf>;40<;*1!Y9/TQHi!A"aGAmA$[n)Q=t1Nub),V?n2sl#GA$^PDCj96g:4a8S^+Y6K?VGQ4]?XDh&@@Y8OZE\ %d;#I--g>-@&Ptic4GA_>8Y6-)F+c@qI@M4^aO0;5Mr8]Q1"U"_,PD+X2Y+[8eG4mP[7SW<"OImI%&kYOaCWf?lP)>LkX\Na'XC`I %,eQ.(2.Z[I,TFpAFeBIY%sqsS5g;-TmHF%/8m(/TPt&i3:k6[QC=RALo2nUhN*Fir?]#JY:lTT!5mqWm/.r84R^a3.3>B+]V84<, %$24cDDoi.G,jiFU(+mcD>!726YYihYMCNe18hlS^V!qlM>,iVK9eBFNTflaN(lG+V-'64tLg@bI %/hS+NX`]m":8c.1Ca&.+5X%=/CS@Pn8c91[:%3BQjjo8lmB8%QXs84/eU(+:b0AMMN'7\lIOK)RInFYH'&b %U^=SO_15F^4A>!iH8.T0pjlEJjpqcA/u-^JR2?1$;NILKiT.u9;p#iOYO#(Z6q\]W-fPql+VLI?9qd4oMcta\^k6Nu#CP'\NAr]E %O;/s,2Q3Wqk(jcfmljnmF:rnlSW++jQl@%WE(C(=65@N0Wk)!)0S]MQP&6KrZf]^"qW:RT7g0s5)SI%F?k,AL!Y?hgcrA@c`#D#: %frjL!U&R7)27OK>gr%:"72a`+hJ>r#<6NWAAH!e/.id*7mFmcNBJt!4LTe8n3<)hMMdk@4>9,9;"S$UTjAC3,qG9ZmTP]SHXcToR %f9)"kN>'W7?i`L&.BLu':o;KKon8UW\YtZ4!Ds5LRq#2oHHR"T6:__*KS1>WZjpB5*N(O5AkAcEPd(rCB8oE)I(?Zl>h/J.Jlai? %#T(r&MF+hT;79b7!Upi0BHnPWLgCH35sQG'`F"fr\IOR^6QF``\Nj=l"R0c`HUSClR-9tf9%)HBA)EY7$7[%X($_9&oio[3P%'qfH6/>S,@Zab[f)=0+b6$dmtXBghVJWsSU1 %U.f'u63fk(!*V`1,h9,/*DlE$6Pk]EZqeLfB%C)XOJ=.T,G"J/>Yt\=E2mJYF18UYY*0<)%]l'.jsn9=UMfp%$a;R4TXc?Frlr/+ %6\mUQJB!F&T-Dmd:EB3C5S+"n(Z%MoT.W$VBM+Pa*LhBZfhUReZ?T(J!D*f#]BZt+],Gq$'8c-?D4oejfm"VQVehA99r51(Ep0Hs %+h,abO<*X`p/D51O0aQDgI-LDQ];^(co5&M?)PQLUjq#.-f^8#f9U@!i#,$JIdncPQV:;8kur$?Z:Qf8R2!K_S-HfZ.TLC=p!M?l %Xj7)+nCB!3MTOWo5R#ATEfk2F:;fcG][cCseMq^jKScSG\ho*1Ua<+9o(#ri.3.H>JdPf,#a96"a<./i)R[Pih6NiHPi[XM6\"cL %^u>nQmbag6HG"$Gm=Wn^").*m7>M5Q0aCZ33btDr/ij(EJIcNlFBgg[dV&._iXS_DmU8i+:j3O[SF!EbY,YeP0[,VDm+B^b9o/-a %La%Nm(h'h)>!tTL\cUAMeKf7)C]X!HQ65&U.suChW]WI7'k)lG12_I3`Mj0ZbRd]C2ga)?q$F,R1,**6iaFT!D5`;n91/tp;B99Y %WYnHj@+&\^Np:&#KD/0Bdq08GkQm>@);OMMRpNJ]"F=FDa,J/Aqh$iUakfg2[Qio7XOgj.EG`ohQDD;'DTo]Y>b9`6,*<@YSFSZ* %kb09O,:cfbH-mmtR7A,gOE,@:Wq(,oaR)DV[Rpi@(?*]IBiFu/CTj!&;.p6KuOLd>FZr'1aPWB02rli;4NNp;2 %T!V"6`h?LH%@*32XL`g_pjKQt_n3u5RJ)Ge#KTB\5"rR33s3ns`"g/k@0&N6;IZ7ZTL#Q=q'fpK.^'2DS>$DqXp=keg+_l(NGm\0>3'TG:b"fP %#Hb53A3SQfNJ\DoiW@@W9T@2[FMroi.PIcJ^u0[,<&p/oJ-23K3)+*Tf^Ct&Kscf5.UMql7t>)l-7PK#QTFCLgGr8#0^,3C=a72K %@h*)4_InEf@Dj'@Cdk^sI'DNI#@s2UKW%^\%i@\+=Ht*W%>$Pm-bU&1d9jj:OgZ]?6K+`g[0(/*PeUf8?%-WM-Y7R29^%9C'?39T %5Y9KXJBjr;U\@W`NH158DC\G7c(ecpYJk_tV\QG@?4[trc:'Ne0t)-MJ]Np<"m&GGETO36,Vjsals\,q-n %MCDL#>27#Fn.@U8O>FGhp]d\-.S#[g/=[uLV,8Bfg_c9PM-4\U9LBY6MM_tf&GGG$AR**5*8,d^lX0/$V5LqDOCsGci_i[e2,-48 %r5D)T0G<#j`Tle..:Om-f'mGk3eABsn8^2fi[i>!O?9YCH:?UI">Di%aGl.oUuX)3c>jRN@9;B;i+,TKVR0l=\u3QGF(eO+"rZkI %Z0F;Q]0oM2^P;63icMQTI+=M(%I+dV99ZP_`+)Ur]FjT^h()&/^Wk/W&/*A7AV35`OOt6MS&cPJ9!6,@%JLmIUG:ki:7ZZ'E/WD# %-ZN_0C$7bW.@qU1JnD#@A`k="Oqr-a$'ZRZMlGE5T3X\lO="hb()<'6Oh%iLm>+ZV^l=lHR%fSVl/!K3"6:is!ZL`I:7CM-+^CXe %%<4aHkVreMEl,)tZA#&@68q#S0iQq?%b1#+i?CkQMaqGZW/lfYq!@Qh^lt.p#(1HEi>HA3V'J09AKl%$]MPa]eUZGhJZK)nMNXTT %.0^bXS(18mNY/#1G"Y+1oW$dq2feO*"/AS##sY0<[U %i"69aK#qeS"Xld_'P[c!@fi$WL>\'l1-7#FkS>BjKa#:d1a<-ug6WC<@9?OY:S`4MMN/&/@EV7\A%`>Z$OJ._ERC&ljeYhrKl(Y^ %ac#+(kYC%N/);j[?HP3"UfhQCcUu*8iIGMiWq+,F>!PIi;u/$XZT;P_0Y=$#`0'n4=M)G6XA`On&,e@)P1%E>?o$t%Zmr"(7ofiu %fYH+2@7e("nRsOD;oJSXL9H\E_;hGo9QDE7lRA3uE/FY4nKoX^LoaS7]WMui:6!B@BkLVhX-k98S.Vf;W^J3TPM_N\0?*0sU9=0?ot,#62hL`REbmN%R@:pkY1gD0pc[A'8i14&ZAT3O)M)KOCY(K09le:t5q<10kSN %fimjTj\@Eh0QadlCI(0UXrQ:;*TIf3(^GKU]!%4M)R8s,JJ3NW_9ZN-eLg"Ade%Ej$h6O'S[UdOhbf6k]E'_+;L[teg'r6oKYdaT %/m?RLhn!YW=]'H5?M9N[B"g&B$cS[UpSHoaf--pSb\h-6kI;E^J3m>J27[]fg$Du'%d+D["CdP$`k07,eO!cGbDKDB)cG//bT?Gt %.XEaaDt8$#!"*ocQ.;#)-`Pn@<)hF0PF"6-pHtg@r"OPqr#cDIDcUdcl?74V],lr %:+.o/_c56s93P;BN7\0F6l8u[Ggh4N$Q,$o1M0B0l\^`%!gK@>$utXl_i&ogO*RUm)QLZA"0US;oBhH.h;(0!`^U/eJcCh:C-X;ZcQmfTDVbl4Z_7%&Q:$s9O@:[oA;_ph=iO#P5lNf_o!r\F5!#pD+5 %pl)iSi:AA1_;`U,;p%BDRGE6,KJ&;]W&]L2NP9pWFPL%/:;9+1nA,ZfLnkN`]%e14f0R#1N=CPFOrT6@$Y=F@'(-U_\]9X=j!LaO %'Lr1?>r5k[K(Lu!_ld$X'D_GUe@jWsY32@TA.Q_+O@pV*ea7b97Y12]mr\W6KU6ba#e!Fl:a3YC&GmWSaD)ZoU=h,L,B.;&LU+9]%t$`&-,Zj=P>` %RHjkl\"&fS#CR()S"qY3aLQP**U%_M(<]nXGK/K&%n*YBI@p;"]#HrBZ=#-e6,ckT)U6[N/tk-o@FPiM2.<\/JRV;^,aX %S]j]*)25SgBO3PHcZG+_a=^Q@r`$%#Q)<-KL8Y0'eu_GQ%,bnudTnPdpnG#9@H,Pc[^$aXXcN*'G=XKR3_3UhB68g*6hapS %m*EC0r"!:"j_[j%gqBAVsk6#5t4-Lf/T9pP_mE=W+_:O-1"PYNeR. %)W*ZnZp6g7>#;5d&\K09aA&+!78Y5:"1P0qn!t2?!gp!m]"$b9CSN-dQp08oFY9M=8XC7Wn0rf28^sbf;::hr<%agrfn)ZpaQBGq %n?_b$;E_C>;l>^_H@mZjG7e?3=).qGjT@C=)_p0j2\.;YC*H9k5AD8Y4RDQXB_I96oi`7`&EHLQo0DPnG? %7eHt-,18?J6DQ!mVbge\?L8kA)dL)5nRrTog>!:V3j+a?dMUa4?OQ@Y4,T#'Ci%I>;4Uh/080tRL6-GjWbGH*pTuZ,Eb5$4p`__e %3Ia\-2cN6Tm+ASY^XMr/^pg*6cY=4;D#k%djUFT#^p,h3g7L6n4\cUE,%oC8.`5*ad9nDK3`s0[l];A?*'T9'o]R/,7k+hs<65[n %HF:*$BKDOp,n3UG]`j\dUj]S(3,Oe\kCC6%l\q*EW\16`Hq[-ib]`8n^rE%S/@k#J*[Hfc:NGR?j5A4fK>3cHc*9\e[%BNP$9&HQ %6(@s#YTFn9^?XFie@muTn\mIPs+,bQWFN)1X@@1M+Mp(]nRTMB9SUD/Bo>O(8U"(8XhC %J"`@uAqtH#pD>6q,aM\pnrSRaFE-D>@7"WD3,f4dK<3^dKZe+JCG9 %F:H-bZlKB12\m^(SH+mX!*`GCD?4;(*!YSR%+82VhJU0-ekk*XOud&>1f4N%N^d^97:;qGsmc&BFF %bus@/iU&+;?&,Ek44qZ<3lkjOET9NIJOjC+F/,a/ma/@C:2lfq<6Wg*pJhmZi3s`,MVJJ@('O^/8"=5%9Ro$S#F!-lPh)VYGb+M$ %im4Z$L]BWXWk"a=,\"-4:QC5[%bMJB+Br,J@70TpZSKsudPpcb"gMZ"7QhkH>+\uh^`^ZZL`Ft'NnbEcI]O\b4D%W77QEEdQ(`0a %JAm&ENB_spIHX622)dm3PWkW<`XBus=5@j$YSn!da*_J+jGPZ2e]?Yn'bJtsLJ-q%P_%ZQp2',"?:mLpEI+&fRK*A0SVjZ %=@X)53bAp-caMiP=^=Cg"-.E^+O;-p2rmR6U%2.VF;uY\YmWl=!.9#R%E!UWjT-[^@M>9-)3120\C`6f/AgF1RF %I!GNGK&JZ2MAR.0@N4U2'DUHPR\_Go"!)K:#qJOb[2T66Vl0S+cXX170aA!pP?CL/0'snoY;rX5(frW7VYa3EX`.WN!@-1M6'/$SK"u? %$d/IV%\cXb3i'$i`A!&m=I6$WR6hh5,3gS<.,gue#k.G@&Cakg([oIpR0UrmnL@p'A._]rihV==,a097Ee2!2EAu"(&GWBpCilK+ %FC'-0nk^\K&Ea<)R4$NAB/(\k:40%K<=9,EXduH#e@P)_&\_qkN/h!b_g82h'VUE6-aSOVDS)?K?HIhUVUM#T!!&R]b,2G;P[R*= %Ih>eL)3(XXY8@Qk0*"S(FjkOJd7(;rONqhKF3cm6L-9$=W^?h[d5]k4T`;1cY4@m9^S.T1jVR6g]YhHd^L4DOc:090edVqAQYS_nma_fBo$65L8@8f64M7&g=-:Qac2uHLOc5CAe&-MJU3h*j"B46 %?F;>OeQUSHn-?6X3])@L:g%n!2EY$8VplPZOdO0kM$dnR%O96@%P&oB)..7=Yc4(A)ad#e+Q-UnflCeYP9Y"'m/P2/<&LX+iMl&p %$J$/;/ne`CqHu,q^#agh:WlC'P!>DnRq3O@USmEZRcirb''*cLTk`1Mjs>6s8fc&Y1`0(<$qr%i+._@=p`l!IgKBc'cH+EjKZ['g %0UA8k,1+_sP4aieoQ$Jifl$A[4'8PnK[tt:@Y*=+D'p@sfQBc?`Bg#k %Z-fLp!+&`(6b08$!Zse<8#0sRB(RR>Uc1_HY,udACT,IG&i3%G9:_"%P6K$+Lp1Ed>(TdE:l6:!P=j@"!cLkE#j<7QZa'[Bi2j4j %:oWn5,T/T?30;IeD-]54S0#!O?B^2_`*GbO64HL,PPHbcCNL+kDfeN6P`8ObSIr5VD(l.a,3o$J3ane_5[VUUUU^"YCkLReVfC7- %PX7+1L8WHc6?"fQ%`>Aind2<5\U%2I*&)20WIPS'P5aj?%H0_Ia@I8S@'Y=u8 %F4O/,L$aR4kG""eq+KuA7WCIHJmO]#UKJKKBs&K0n)i3$H7BRpF"e`[*U2BY9rZRm2C"))kpNl2Wgu>l>Tr^7PsS"U]m.gLplc/I %beFY!!"e_G=\FQQ2^JTbDeARb]Sae'$A*r5K]@d!9hkBD!h(33_JWk>@^6Mt<7]4=.]'0##V1M+^8cWS*$<'d\k-*985E(gJ-]2L %SATnZW75CC1*c3W/Eebo]+V*iYIR-aOE^m %1%DY"*`5G9[o+C"`S(F!r,G[Vm27^VXq,3K:T/Y2/MPWq&ZUm,r$GK!R>"ZaFi!Wk,q.pR1TbR6\mD9+baWN_[a[#,Pkl#YjHad3)KiZr$l4L.]#nZp98;U$ONL,Be'eGQUB?!=,"e<%hB67-.jZ %%+6E9jAKV2K)#8_$`+kJ_4@stGN_F]=uR7B[rcZ0Z#F^aF]04lp=,J'Kf(g/Cqgr@%b)('$oYN%W6lQ$u %0Y29*HdJ,(W-`g=,M0f+J6c@tO8o\9do:=uF"(&hI(\O9G?1VP.s2,dKH?8U1D;NI`-7W3]0f/q$(d%E?#AX5.,.Sjl/T,nKUQ<4 %Rad3dRrSZemVAg`?uZX(nf5<.7ZQ$?'(Dim>ch=<6tKi`(^2=ibfN=,gXI3A13j)`)/9W[E,5Nj/jH[:$l9d[9c%B45"'.@efduS %m7\Of!`pQ4C`*O9#Q0*.k"nOBU4N`eiE[CrC>oN,8^o"J8o7IkCA)>Kn]2Q__+SG[`9Sa66W\oC'K$)rS]LjY<5%!UK9q-dmQ"ZJ %)**NZ'8lrPR"iFNBP6lRODh6SVN=%FmS;^Q9rW4>bXN%eg7O"WYd1/=8^b1rWbi&Kmu5DTa$$O'UDPMFIWeh%QP\5Xh,jD<'K %,N*ec=RAuPE*6bT604AS"LkM,m6:2j!0G'nqO1qp;-D6%kQh`fS=ig1mR;1H@3ndGk&+9uXWuf?Wg:&+LLLOf;$k!@_S/9pOCq+) %1&t/;E&bpE-V!!1?>ME.#c`I%??$@UN4)KCSrT;/]%+X\Tg&0H\?V/l97;[ %o5l7EcuhGA&1.ecWY6efa"Rsr]WAKdMmNUGW_2(I.gK"8D%^VI1.JJXf+f8GTH2<&.'.jebA-k)jf^h?K0a:2=?Fs1Gid#.2;uEf %&WfUb(#S7X)g;qBg-7YTV?bk=4(a8?.&ma=Ef>+3#VN(p60P(I&sT6`?`,*<`>J6;*+`;ZOLmEjYs#>TS/7>Q2fpdRK!X\nC6^k4?]NV,AG?P"d@jhf('=P[[WTNC@H(2G %oV1kk$2u`mJ"K4cBjB20O@I'=Zl,";19%[$8uApsWo-9j*F&%K.jGB>J_.4%;[7DDh'A@;@6nW23'!JBD-aFu&7_"W>N=N,;Ym5I %G6$Gs'FV4hI8Ff;Sl`QZl3IkE#cdr03g+bs.Fr/:c"ccC6U8huMQjp!3:%(;\`k50kY"/h\9WGJ-8-J(WeZ>M/dk%I.P6q9AMrs$ %<,!eEj42<536/2hP0-6cJR@6SS]S4e``H0]fE(S0(4+'Nk.Z.iC2E\-Cfen^D&s19@B4:GaV.15N9*ulKtAd-D&`Y>jt#F@9H=.W %O*[aPReWbG#a!p"dZeRaNcH:(X[EAE27`jL(eB=d"XO\S=4&*d.?*f\@d# %FD"e_e2jIi20 %-nuMNaVqPE"MbYk0c=O_iq9hFe=)8k5kMbsRfdGX]33)UW`;WX%sP*B7$"j1lKC^Xb0;IS.RDU?5;g!M_S`o0*%!+5.H$rWP&QX6 %+4p/#O#Ei8S2r]/DLD=p6u%AgJ/?kAS*cH!BH"c:&sLk=4_iL07b=cI=^u-oX\5dnm$(FSJOcsi/bRQS_K?ubMI?J'+^qYmra$h;&NH#7l3%!l`P)hbsP!7Wm#6BX!Qb_1ZOYFC$C;J!r+5l]4mR&-<]J!1-KD5g(q35-aAOMuL1oT4:@i7DdM(8Rbu$IE<`t$0`7X^%6c-2W %Ng>I4&X,6&3CAWdRNKj)R;lXp/6*$oVE%*3g(W\$%:8^P/!m)lG0\$F4'RJ6gBbR7%UjU3Y=@#]XTZ`UgcZO'969%o*)lDJP:+;V>7>^<^;XiRQ1X\,\5`Mr)qsQ[ANnEh8I;\Ng %=6GQHmH,#!fe)TdW0o_.9_;ZXf:)B8V_p!@dtAtud[]Ij>f>ZS[)'P?(tK`i %[FB8D#NFgAaeNR'L.K%f+H7S9q=3(q%ePQMRGl1,d6*f4-ngW0S&H/e0*s=Og2Lmss%+cM38J800cBsfqb0[7cpE/c$F3N3KnP^XuS&R'HbuB]/,4Uq;HT=?uDf(6@Ms3_\\L4kb///4SM7N^L %'L)_AU)H!"k/K9FCXJhPW&sXl)i,KE4'?C#YZ)pcFm-fP4i^S]R %$T5;sZhNmgf8Q %7U9R+%t[tsK*X;9MlGbd8CD/D@IBD`^H\@b8H8I1jM.WHFn"8nht#1EahdYoN$rG.JPrR(-9AbDaAJ]NV@Yn %[BGnQQD+RuKP.W2(UjCJ_.\e#eioubp,4tc&=7)83?F-+"NDr_Um+0d`#uMHOM@3N%&ckGHQ=GJkmZBi/"5?nV>4#S5*TJp';Hgq %GhKX`U6(^&1iVQR/0hPQh(Ec7>+,9eMl`W&d$S(0V"-fbp,:b$S58@pW=5),_S"b`%.n+^s\(q5>P]]J82!ZQsVTp5:69'CTI3d`baF032d0e%qt %7d/XS8J^BBPj'7[E!/(]hZgVqC!9KO9d+,6F"A#VW2fC/AJ\joWD;N;Jjl/%'qm6toGG')$>bfo%dnqS/PT`WC2^@,?BrI/2p)

DUjG/I%`SU.133j=@H_"<%,+YBS_12j>[`B'>i9]Xe7Qa/lHg&eela^r4?4&ga4F[ %=/*Wr.jYr?mBrXP8<7iQT!XBiJ16kH">\-dL8ED1BMgIf86&V[ %/3Q'([+%[W4<[PTQD/+oo[B$H>iqn`M#T(f=cGJ&2o!gUt#'lD@7E@b&n>IXRESC-gZq<:5K739B"ob>;\8\;_KG51"59?87q;Un4Y*C,50=%oK4XN.RckOuT>+o.Y5& %Q-*3Y<=.VV#_$%NN@J9f=,%L`!;U+,%PS1eKllrYAqF:MU`D`-A8*t:Em9b@gV'kD:m]1i+bP;X;PVbQ7;k@b!5IKum5Z:j<9n^INt[U7"nY@M5;,a)RHHQ'g\`ZiN;*>326q<9S&8d8TQc %F_LSs@bfe"[;0*.JcT&V5^LNYVd7]EfZb-lgd)]LCgLTYF%lm`J9h>R3ntPR)Y7V^6PKpj84T432M[Y=k?mXP6Yu_oeo;K>=\jP< %:TDn4N#1h;fBTKU#7O^e2KDj]K'Al,5']BWY#'o7X]U<@ch`nqp(29?oID2V:8/gUet!1NX]B=\eAXDp\<)1i\Ja8QK%4Ch:Ir(8 %?q;F(3YirqXG8a3.E9oSb/tcGCKd8uQE)(J4MthC3:6H0P1f)q!rSr'gRCDcrI.UY9,TT'k>Bai53C2.g;*CDZJDK:\.j'?EsP'74!;Y%bYAuKuT,Mk;%Yen<'kU=6; %!Am3!N1r.dM9g7G'qk0ba/;Bc=&B3+o6`cobb^.%lHh<>pN/X?.]aKLnDE20[GW/JKOK7T==35&Mo %a`eFN\r,65@QRIa8:mG_2Gr@/8>]UH`l>M>12%nIT"0HGkfRO1R3Uam9!B=K7Pa6?DTs6AllI1i#2D^#SgWY9F_jdA`Ml`li4<#'*a,S_M_GZb%YB]7GLR)n1rB;S8:>#7_Z-toX--:gY+9*1l_ %[PlUA%otiqi0tFAac9%k@'cM-[DbE!n6B8#i??Vsd_]r!N!*b>gSi'EfJGPB6?^rAG,ch?L(^L%+SW]EfqO=o(S_u2_D>?SqY;/: %XZ8f5)hCY9a@ghW#rr3BaMfuie!9?Cg)X];mA&sJEZ>lFFNGC^K!;Cc*uX7BX'N1Zrq4S/*(=JC=O=E53suCO^U]jRP"aXmRG_!8 %7B.W[2!e1#guXj8HL72_H-3/XNHG-OfP9<53gt0oj0S936S[Jq2X5/rQh28N;Taf!'iX?+6>ja*d"(ubkSjB?eE?4AllO.P904Tj %RJ3UV\t.@l%=kkUAg^!.I;g&^LDV>t811tX#6ngaFXJ)8U9m=mKmhn,_*Li\nCW#u*/E>#NL:n5fWhk*F3m68D"CE=YJuR1bssu> %LRZt^e3)cO0\=#hnS;33eZf0KEI-A\k_1oSgLYZFS]Nq_";lhKFU4apE`X%tm,fUM6Bl44;@"bLK&0d7b#dM!njmaNW'< %^%XLSZkZP?r8Y;sB#0VK2&K7^`.8h>`i]Z]&G,"/UG3AOG\X=4gVc/g7;)(7gl8Tup#2/F.YZPo'YH(lIlo<*PCNlUQ7N\E:9gMNd^Z< %H`V\h4feUarr7[r?i;)GXZu:] %-P)euo'"W]ID?jcA+cH%+*HMqeUK_iocO!ZT)[]%7h:9*DIlF3j+Z*gqTiLHO,'q8*d'.W4QkYA%rhh-UB,i%J6;/5'fiU^;=#;_ %V#1\>0`K(CO)\sZZ+6,Q9LMi7ngt@/.1q0Tfo@--,-(e[chgP"do1r\@jb_.kSpL2$)8!N4mesq$-]c\oV\SA* %T(0nPX8d_QX(/CV4EL1&DIpF#Hk]kOLj;X\TE!cR\[IpNRVRS1eOCj^`ba#3bB&`MDp?$3[@ZY"UJ?fY!ubQ^k1q2R?p[=oNE]DH %*fC)ZHj=i(o5D[^VGT:E_K=MV9f0f#lhbcWn/A.O2H;L %*k#7`LCYKZB+MTCs.Bhd>2G6>06$Sko_L3'J"IK=\a>I+R)$^s3jNHN8&?9&eMVPq7:)`UHJ,6]^"aIOfEX8@FnCXX3@K8:_+%#) %hdnJoTs,tA8^cl4h;:n^Po>!LIiac"K_^FCnu"NOm\m)6A3"F>7.j23]g?HJ7U8V;;E9qARM28Eq\ofJ[&SZ(edkR=r"?:1Zk&^>mt.?TGm %&LAe[auk@J99FK&XqqV)%H[#XDCHY%7m=R5[0.$,%@\cb8/YQ&OAg6\s!\E3[#ot[(r@[:allRf##SBDBQYQ@5L].89\"Z:Gkk;TV]U]nZ(=1A:72!T?Ua7\/"'#kq;h`]+F>Jg-#hGREWrE7DrDlB@5nH5\Wq7 %d`N(%Brr'aPLMFn4+mYCdM/TnY],`RhjX$NSIXIkUMk*@nNOUIe]n)p>u#MQae5\+DldGdq``5PIQ`a-'Z0HIN"eA0F$U%oiB016 %@UDja\YXl^2icM+'`Ca=NC$mIH,BpG[\P=IWp=t.$-!MVLpG)\Eflr8S!#ZrQemX0,r`-sJKY:Ai:K_e=AFg^BPUf48L[Z#CUH4P %08d[h[Bo5&R/^[GNk&"N_kXJ3in@6e#IpO56<"@<2CXbe9hHGDNF=A3rcO-7^K+fT*>dE96;K$h&Jd;kW%Is&=RLk%KL^1CSQbFG %B_,YokABaUclqI2neZ;sZ_++n_\Wum*k+FEi$E6NkG%diH%KVAB0;#%Bq`f7<^]K)q.iu>?bVSq-f`5$UFk1@>V^jpQ[N(B'm(S0 %/P?A,>`88EQ7m,bA8tl.ZA+i\@M^Q/.8jmMD,BM.l^-*Y`4l$73jA^gJ"^sLD19\See@r7Qf"(XA)8FYlW%0Ageh0K][Z'B6Z+K6 %--\LdiQ[;8ZENZilZq9im4QEHao\lbp>QQ^frCM7e#qMl:MkN@V[J7-QKJ:Bmhc?pT,_)rd6#XA@GZq4ST--)#SKLgH^nFGe.6iJ %Bh&t][4KWn_qr_;kl-X,I\#&>]c;7-MmDI*?b>KW?Z2@g`j7r01e=]r(a`q?&WLK]er%I9r=piLMS\>T7Oi2nULWn'q>^`;0,H;"MsM]gWa1mKNPl-gEc %RQR!uHk+A>nmk@P97reJ(o_@V1[eHN)OV[,".`)*r6fGTUeF0oAb%Rs^$2LL*>0!Z=4$_]>q!H7Fa@h`%fI``[WIF@1^D>6%MYa^ %P]C=!DKRT!BlM?!#R=H);MQ%nAb;cao=U_jjS:n':pm!sAqE%!BFNHOTLSQiFb0_d6W39>$Q7f7Y@-3mo3M6`/qBimY?b[Z-_Hd* %&V>(F#J %#^sdC&O'WP`U9(4QHnb3D)3Y/gP548:,*aJMGsh%7!k:d12VjWd<;@)S6'+#eM-7SM2rks,ed@uJdfn8!kIY5NA`T=1U*f#KC0R4ri8dnml`o0nS5 %F-lVao*`g,bbJEd4H:sjD=aOGP"M5cSNc0u%`e*+P*k(Kf9aEk)FNFo-f^nkQ:3Q"gfQu*KCgk$A>ClQPYOt(PO^^dp#S4]YA#2h %+02!K$,J5!ro@JFdIB(+Kk^8P6Ip(9\7.`5Wh8M5di;^N,L5>^MY5G2R949Wi-b,P8ZZec"Oj>f-Gs(kJ4`)0d`\rJH&uhHgFdV] %j9i1L%fm_cB3Euoj0C%MgSO>ajL=opPX$SlR9b%`JP,`OZM*PiKk4C].9Tebc`5DNp"<+T2*\FF>\OqdpYWDXWj/W*$B;`$MUL"5!es5/.'[2[]?o!#+Ou$j!4aP'f+Ljr6MXNlglnj+/9mum0/\g(R9F7?5*=PY"$at&1](Zu+ %PF3/D,c5>&_9^FNfNjjS'S:tm\/n9'7On&%6](C1K;n7C%@HG#\4VXfjY"L-iEmrThKqm%N<,$hDQK+_)!lp2OcBQN4">Sn7rG9J.(`VW,DI^(X>akp2jM#/i+?'rX>onde-g0+u`2EUk\ %T2FcuR(fF?oHDCrce(#9YET$Y)38G0VEJ$ekq3Oa,euYRfIIlI+JFE/-Q5EF[UJ(22T3]q#A"iF=X3%;^:d[$E8D!NTqnr1:3oIS %:"IaWduHQ=RFB_MEh@+drCE/Ja21BH:'\j2^oe\:,@*AO:*Zr(*Fg<%]QWMD+DK#B6K3U%2E`7X/'fPDO#VF`XBc-0]4m'PKanK[ %L""^<_`Sh.?q^SnF-,&#cr6<%fQSC&qd*T)ZfI=01ihks2U][^:H$YBePA*OaR$+`8-9)Nfgl3"0\Ju!?a+.M%Q)%5issk]A.9'2 %_j]sT+;'g64hq_p9g53c9*9Y$1+$dd+?5*[0]4!f5/[GV9Wli0OUN=I5YflMZ2mdigp[;qR2im@Hs(Lu#>A`M+pXcQE]47$B$E=V %@%GE)*O)-WkoCn>2&CO'L*h\%J;Yc+HU*_E*;'>;Rb[ajE#S`UJ4$FB$O1ch6l$!JC'm378CgtS@K-7g0D\eIpnO %^U5i1jGOI%&>aREXc?XZ>AgqO?rb"0SB6[;&8:At0NTckiu>,A#n`U%hLT[T(m0TGN[GBtf*'m/Z8GN:W@Z=RTq.nbai)d2`?']iON1js"s0i7:KD?g[.X7$*#;5*XmA%"g*)8H8f&(k_lYEeqO7]Q6W4h+U!c$jj*`\V=Le&Wj>P;oaV\f34b' %"Kgf\kU([8?#C7fjf2GslX$($4A!sT.s`RZO,QXgQZPE'ZU^c\.?`nG`>5lT0A#>&-CZqBD-SmMB$bD!Wjo@aZ"IMDNSA5BWPHDNCiY;S.IeRTYX\'gO+'uk7YCI>=GXEj^]!?AqF82gR'ok6&HU$&j=NHpBqHjuPA %BA20)lMtgn:-f+D7#;Hm`8D*Y.oZn@>Np"uA6-F+![Oj>10^Gs1C+Z++n@nM!6,fd"W`86O;MYW&IX2S51I6k;J#i %:iVK\H@KWe=qZ]`eDR=LEU80sDFV+G3:j+f_8eXO)*<(=N]6)bE<@&Ys8C=u.[iU?WZDX8pT^8-.30A]VRl %DbO9a!44'U0R3X#\>iZU)FcX2(g/R)(W\e<^6g&?RR*5UZ^>C87)'3H@1$lQ=5-]h]Red>TSm!76r6K_JR0l`!a!`'4@BOT,o9T? %_,$dn4XL$1:U)7o+i]R/U_+#Gk)I)l@iFqQ&`?uf@b#m80i1_b$b<(\ODrQYo*27C=,Y`_5bFE%fYfZh&f%"8](S[q)Bk#o^HRX& %MG*a-C6@jca1uBCP+l-#5eLt(26!S2>cLLc0T1WZYgTiV!RO;I..ITJgVr&T0$:=re;NG#0op%3S@!#(XUdT58c)KR$u'74db5bZ %jD6DVa-k:7EN6;m<[YD^NNM.F7gL?*)2?\3t %%[br_V`7G2jZNT3(I;Ec-[t6+@*1L1V*-:43VhrjC_VFA:8\G?p3_*X7oJ'^ %ER`GK%?3%K2CC9+Z9SU]D5\Ujh()Hc?uV7Mk[B1]1o!,h;MrGo[(OdK6rEUUC`kLQ+K_&?LD44u)@b0RAW/oY>'Cq7R&@I4:JQgj %/)$/h"H+6X2W%mEMK?)EAV^]jh=)PUb@_%UTP_eekrqHV;$WYG":fqM4)FP@!S1kfS75DRT/niVf"ppAl2i7sC]FXaODMA(CpoT'5!K^X&L8+nQeBu/nE6_oAY4;ufu1=*6l`!HA,OF1B:'8:>TD"se/NfL:/,`GM#AJ0X,GGc%Y`s;j` %*^uS2?ie]FW1`(>TdU@19D4,M`EI;a(rCBcfB+e`EXD*&FKGiV(=fgI/':tuN2lbgZW*?"]#F#J5asRu*755PW.W)?lp5dSL\9sG %MP*3*"1(AlCs/L!%6[>?/NC6"b(O.V:!SBt9NEnl$t6aE2V6_!NIrFq($YR,&Y$]9qOMfh5XZDe&S@J@O>V]2N$$joeg`Y*YM^ %>\g>@$e3,eW!721!k5cADW<$RZ)s@r.n]qSg[pft*cEWg'&-O_&6DDtFCVE5e_)Xl`\g*DP9\B5%Vp]g<3Sfi?W.U+I(;!kE5el# %SFdk!qpA.5-B#"9iIp/K.N9Jg-EDk[O;>">4JmSSuBRYM)s9D;)MOVQlY$ %b[$E`9HHC[(jsanG7@JmWMt=H6AU"#Gti"UQ"tJ%DCLn0%,L<(Q?OD0$Qu4<,;A#.P,r]01YHhU:1J!9JF1bm'PEdIX0Z/5-n5We %Z4`lYMF3pgce1"u4\_,NSP)O)/!'-;QJ--^W&&<6Y=ia6G>W@m=(,rV,/e6kn)ZsGRYOG*&+d$7@L-d%KPP&2B_"8"S#$+AqslmL %A4:bLZS8HLU/MC`RVfN;+UWTLF5\FuUIcW]/UD>&GeKc$ml)T!eWg/9@bCJh7prDdCN)[>!WY8pSs8ViVkE0Dl:?ZN#t)M3;Yk22 %CkVd0,*eW"(hCK@o2iE:Hu.)#'b6JWjEKpX5X6P?,%G9#.kD"R3]>!`U7F7Y0L>k=.-Cp(K^q;Nh"MWe7?01(23);`Kka2q %:(c\p:p5o_b5*CGq4X!+Gm9U?9=XB#i0\I5$q:cXe]e]+S%s7Fc-bP$==5?[Y!V'ZV@_N85/cRBUDoHe5;1Q,6LkC. %@UUVec(-_HWi;m?or#+Dk%&oAYqN4Pf=)0^.sQ+VRqZV1dJtdUOsmIY6^DFIJM:b+_.ad4LC=pe]#MmV,r[GDkUsc7]rYG!"&UG` %c/u.kLu$oka,Y;Hqmh_jX58&ZD>:QI)/eT?/K;1-rRQPhSUbSS5iD>>bW4X6T!hfto+g$2UUDIg;q.#5]2f/4N6=2ek2Wq?h %mV6&C=LaLg<.)eeI7'WBm+PRI)gFJ,A#?7I)PVAlhK^AeRumS(`_N![oj=%_`Mum`!khO%L^3-%5X]L6D&USXC5.,\>2Xf)30FY) %o%;-T"fjUWDmpQ2OBV_FFR=-Ihg#GW6mKX?A](,r"U[7&)K[#)@%3S/0=/c^Z2N8V;3=gp(mPE;n)hcMs40p(K^?E0aWn@:L@0hlZis38rT)(B7(L`'-) %;2Za)Erf$W4t;OBU*8&)8*Pi!n>/U&oaiP)`,!ZjOp2(qTK=ll)$`2u%o`N.2FHqY='r@Zm,So%Y.\G`cjPk?IgZR.8Zbt8E9$6N %&:fLK=BFetMI+D^)S0:X`%9=s8ST8-UK,7&D4hM*HcQkUc&7Y8RN&";D[eP5>lD'ZCDHY"EoAITn''\9.e#?Bfj#b0*-:n]c3i>M5C%GM&C0+_@Q: %3FQ0Z>L68/HF^R2BVP8Q;J=KV71.%6<,M+t^s+d>9$l04UFL_Oe,cr[9$162bn.otQ+q6P9X8[LX.DlBaquS]fM-'ce+$E&6L5!$ %Va[MF<_u\m^qu5M8lR#NXGF/%@c+Rl;:1R*af//=K-O@UM>Udn>\elJcbn2C@eG^J*0a8X0McNFH#ZJ'A21[Vn$P,f[86sZERXI_ % %AY02*I4>e&KIipt!*YlWq6e)?-U1d+h"d>)*O@R=P)Y=M,%Vooe^]P^oQEROf+^de6/V@NUiq5W1n3t&$ %Ha>8q.3D&80>3;q,&@#>V7_@Xm>P_[\=PPeL6lK'?Tp#%qEn3-$hXR4Phf?0-EP]HV.q8K.hR?O!6*^3C^)m9$e`sS&5f2HN'$V) %7H@W?'i/*CQ3[$)_h;Tj[G4OG8d;4,0B%m]GK8qP8.iune[Q&Bmn_uAj4p&OauWG$kC/u)N7qcKCkT>dBSk?9f!79o*TXWQi%MVV %WUYhRpaEm'I6S>9c$`,'HOqjlT\)UL''jg:.Z62;$m2%icd=GQP9Lm"#45fo*9Y"i4qDKmmU:/J_3p4M5mr7ooA+q!`Hjo^qt:&"\7<<@<:Sf^;a@?adQ- %Ha*7Tok$u!JR_32T6'YceQ4r'NRT1cS9:](n3K9Ze^]#pV<7$bL:urRLE4"fN3i@,WuF%ujRpQS>r"#o)6m_"??k/W6O[>?6Njq_ %cbHE8]T7&]qDh'LGm+.#J+3*J=']tHi2Je>Sp82YbN&kqfj9L%M9^Q]=6E6EGNJ@)pVahNNVrrLY?>#nX/=FD#8rS$#`m]19.CYe^649,%Zku-Dd>)RU7Q*,8mH_5HL45W)c]&OYE>^TlTQN&J(4T"meT)Rf75Br5niEH'*a$'=qc[,5;\&,PemG*magiV#O+8+R(Id+&$G+\E$T6]Z1 %=.ap<0DVI4Y]K@q5P'c%SpIJeaY.eZBb,L+MdGrEku7(5OtY#KXX2/g?63:A^A'Xh!b$$?g@PI;ag4ST=Qo+8ucL=;iSJ*b2<4lsg>m=PAD0B<)Dl[uBhg'p8d=o+:flRT]$s6Fi@52u*. %II,AV-,%l2X"BMVqP_G!qNp1Y %:HM:O90N'E#N%bKm1\pI7mHs,Vd/iOr>*KA:;>udSG')bPtR[5DS+L!DnQi-a15SJ[a9>^"kgnE7"i%kO&$;J/eNl5Pp4sI-A94ppnF/E/W=lg\X24YtobkZ2<=nM1&%N\`gnO %b-kHTr]0jYDghZ#IJT-Lq=D)OoZ4bCs8.g@q8T="4J++!.'^N[Hkr2^jor\pI\q;tKQj1A[iPR$#aZiA+s2n\X*O2'bA %)*taDpI2]\md.R'SpfW\5P3WuDnc$WmsFZtNc)RsDgUu7^YiaBHJ69_puYe$Xj\>5jkcj.g#i[5Em",@kCp42`*`Pa$[+I) %::L,-QbDs&T!`e;Q<`_cpV5]bf,ef+p7LsShta1roLjFQ9"kM!+cclX'CoF8+ubr7&4Tm:YVprl#hJ\EP-,qN.WQm'"(qkFQh8^@,I<=RUP+ %V/LbYYJ9G(Yg750I+.P4A@46Xqr)btb`s.)`PDdas.WkLrMs<'j6%N>kKj1_QVIL#YK+CEQErT?Cnj0Kf4IP@;jN441bVY/UQ^$Y?=Xm]Rt^Z\aKlh>ko%55HlHUm,-:\Kcl]`%I6bK4+9pHR-9qVcY5 %k)!`R:[@3Ci$5VtIcbQtD/XjF]?bcYn%@i>s7=c:qk4T5rbq*Tff+EX[nd\7cD*>sp-6oln];=?YFkjBjXWFY)/oKSm27j4k3q1! %\E1BkoUmSFlF6f[I=M1gQ_1qBB\dY-^?*XaR16b)4nVO!`<1Se"7LKNdJ5<)g[SACr]ef;DZ8EUrml.Vqeit0V/QC?^]!(4^Zg$m %L\YL#516p3HB7k1?7kJee,-oUoDeC9:IEsDbZCLKL?MC$%IH3caH0sXQN5ihlbQ$A[*oX9Z0`Cloc[G]JIYscI %5JHIH:(3W`/m#^PpHJLX\^i/.qTVg'NK*CSfF-U4JUdXmIoq-Xdg#i;)_TRJgnTW"KD;#[qisD-;rd"9]`5)m?>OuapH@s;J,V15 %e8!lccd2XT[(ibEe/s/7;kO'Y]3]O*1t'ulGXr)-rk8&dPDSsk+8Rh/QB/]UQ`de'e,u<>cG07`?L-`LrS;Djo^T2,me-A, %^\?VLs7q_gl_Xn]e,#s;ETmS8f@ag!ahG:R'41F2rur-RlaK%?4Dhdt,CYZfA,YTNmsjLp-YtHIcVr]mrmceu07WcF$cY/5Hi*h_ %@/X9dEQ7ejm'L2QhrW9&]^p(:NIC5in,A"SGI'g7(]SB>](tstp/g^1q/p?9U:];=hYK133IgBk?[:lQpT*b-Qg^cM55N %QTVL3KcdJn`HQh(F7R?-%&;gP)h-h"T,uUqq/[YT_!h9^P928ikKISPrU2p;9BM6*P.?4gG@0s&^?(q&??(AeS7r#kXDD*Ih4OT6 %]3]XaS*f,'0`B#3bWc#M^]3",GPP_B^Yp1T>$^H8s7EI\?TrYN44YWhKJd9:Zj/bRjOHch57X5Oa'\A>J#&;-k)]K:lQ4(c5reE* %GCB7-2_Y1+jPU!b)kM8Adqd?jI,_?dnr.Y0"8gqrci=!UoT/Efm_c5Xm)c$s*p_k1-a.]?)Xc((qi9jDm84r#ZQ%N-q,8C7j#90b %@B8GHX;g%_cZ&Q/s6,fQ0/g"\4o!H\5-Q\Fe(Yp(p6[6-`5rCBNH*R*^$muVKDtd=J,eVsdjO:\I-GSLrFa]aFn;Lqr5ZSKX<51J %.;.Q-)f5'"r2II2h3[THQN-FP_CJD%Hf/UrM5>tkk%W.fi`/o>4C.iap\ZhLn;mP4X08:Zp.djMgp_aj'C48]q,@=_qlb>4rDns, %>(#h2a*#,e%=t\i&BNmmi0k^m4GMeg*Pq\poFGU?a\jbs6S?UI-=jX %gdaKc),Ied)OB7"%mTbJ0D_ZG*^=Ec=jMB=DpgE?e6fud.:RATqpE1JHQW+F`l1.8(N4]@\Yi^-_V`0GnX4n'UL3g'4_;h)j)9>= %PP4E/YJiSNs,TA875',8O'OkAN75!/Q,!)R?0a(3HmuR%PoNJ/_G3P!)plgc??gNsuI-WT74QZ"O=69O,bE)\b>Aj@I[KQ#;mWHj)nI(q7q818K[WATs %k)4,gn_/'(6bMkDhnJqN=7>IspX,;U/pmSerq%FN$ia-II*:"-GKMAt55T3<^XPlp(I-00P%+e1':!ieEf4oJtNp]1@Im9:t^; %07No\Is=)o6]ZQ2#+k!=&6:`h9uNT#BcFA:_X%f+;cPc %)F1=DPV<@m-B]np'bN.('N>KK>Uh.h`MEWfR#kkZ'LGo7h\=0,,+prUnr'VeWn'!HNB!/`4q2]]0CM*23@69n %s1l(PB:W=M>;5QTAa@+UhR2aQgU]u0(2qP1hY"]pQZFZ!2u*5P[p;p6ZCUmKH.U9NB856U\kNPsfS-D=Q<.k/g2;8^tP@TmueUoB(+HfB#,muTQoC;2btB>:?g'oN,'M? %o'H:tW(m4Se!AA/]RAo.ZV0^:*'a+]/[iX,YFt;XORtf$$:T %oNd0ecYTmCriQbQW9;36]sUS_p2>EQf'[qOM%/'1]rHSHiP])Xc*442Q_=Em7/,(ab7!=dgOd!=E8'!c-,bfW#n-NGmE]Bf5/onrU/\n`q-+84o_f: %;_C/HUhc@Be_=G>i:#G!mC0^6H"b7PLRRf2hnO9G@.H,>F)/t5YLbsdlaU/j=M;[;ZubV_%;\e9"0T@Hb33.X43]Q./RDeu`adKl %k58*3J,aoUBkR)V2.`p.bkX?oD?"/.X"2b>bKBS(MV1,+O7(S@rQS81F=uu"poFfqHo%(`[iUu?G>@lRk7517o$)A2>diqhSHk&? %33[&9f/n0=d_:0?L5bS)1\"1W4JDPV9P[W^?0L#@e_4RFc(-Y'mR'c%I;RM))o(')q7c4L])3r9:qE;h_9k1t#_D6`-ZN/bW(kWE$q*Vas2]NR,(msfW5Wb(p` %.KW,10Q,;83tIlNl`]clG\c/hgE(kAj3Kr9AaZdsDV06gZ41B"h[s.@2S]"+MKN:nfY6>;48\3'I=E)Qf3;H`f>Cd?mG#$sa6n?\ %^>HSN^qnAMm[Ynn0]gK37Z1]OWOf09('q53)j\TYYJn,3*q3_WfVkoo6"+*d0ZpZT]r_/P1q %I_'ajh=1?MH,i7r2,CFUWTrugQ8`F:c>mlmo\iTr2k"s)pX%":_/VGT_4%!pcbn%22Q_&oY2Augo?AjOnlW?PJSjl25<.7V\kH?) %fh^-YRWj8XgnZ`IF73ZJf5CVf5&C8M(%[/kqlaMqDLZrL:\J5SY$ZS:q3aNUF87&]\,M0k=OFPNb;\RC3RaRt*-:*2-0p#[Y./u) %4,YFkOI]"S6gfDG_a06N,ItPG]Q2EL\g0B8D1DA6Dh%;@]PRV.orlT3E3>\DlOW/QH$&.DnZmR)5'q@uNIu!:Ap2qC;]gF7j/sK7 %k9&?iFkuAEgt5^1#HFqtqXF&OGPnDQnb[5_XBmr;@_WRLSVh:1]COep5MZ+qNO/(tCg?l._HS\\e$`(r*Re`@XCkUQh"d^mgAX7i %2netNUU./6psdFu&jcO:*dR.jc+B#.D$Te&gA9L7Y<4`/MZ3!IoI./[i6"-RIe2SOh]Bnop6gp07k9lgEr2.#3Z\^mHq_Q]f?A[* %XcL3O^AE\um_HP"]?H:^jblpi4)Je>c(P^!D,,#:2#"!$f7(;Vql\c4n(kIfFi3.QrpP("g:m7'cTYV0ne:Vl:De3)M(Kmuo%1X# %]&]mEO">SDSI[p`Cr<,'^\[er?/L(FGQ7XE(#O>q_#D#o^,9j)I/O<=]^bQU8+4.Unj2),DKVaARu[He:;1T%_P\/6s2)s_]k)AO %GitAE>Ka3%>;guAn^A"M^[^md:G8/$l_]O!0'R]1iJ!O:F8T`8/fB*![?IKEE:`Jg(-V9eM_Dj9l>*T:?@'mZfj',H)jmPi;Bn+k$B:RMQESRs#VVQLGoU@@9dr2g;g>m%h%.)[C[$p$(KFj2&a45:ueEMoJ.pZeXdHU95VoF4?5a&n8 %$h:#5#5:JA.Df[mfD&I3AtritI-/UXI&gECB^KLmeR6MNT+W*'t`9bk9&q!(&2O %SdL/W,77BR$@E&'`WkD2!4/-,bGKjI8u/"Cg(QQBi^fTRr4LoF#neBqMZYaRE>2ueG:g0]Oq'kO6 %S;]1RjJS@J5h4*\B'CNY"Qb7Zl9D#]!TcZ-Bb8$lq-_(J5&T:f`Ek*CAAV-)'`^W58Xru4#aMlT1E!5q8[6^&0`a*fOR5adLVrYI %7"E8D,0.%^&EV4s.@Z)+MTQo1RM=:Q9&t/`=KjGhhiY3#AD+sh8=qO8&TO[7d#k\X,3g*#"IalqLM.q%GHo(!qP!OUnB:XOP2iiQ %/+]/sclEV+[?RI%j93[/@1o>/7U7:G9n*XUbe:Nj&3``dI@PG1_"YjTsbVpkWS81Q*IgLO!fTMaMP=9,57o8/4 %Nb73Q4qj9^$^i<[(Psa$$LuhZR:f[T7laj!-;eeNo>7dIP4cINY0*TqsSsAl-@GcsV6[Pa",gfd'1k %>&Q#jjuCX/9?q,TE'(V#k[Z.oB%inY":J21O,$?r%X&^DE&'/18*!8Z#9nehK&Oq3E`3i?O$9[^F[WE89nZ.`NLiq)L$cqkAEA_i %SZlXVJbY<4*i;t6g*RH_9d0^K7+mf>O0p7SA[s9RQO*S&9oHq<9LT[BAAW7]B)*uaDOT4#FZKWN4&_."((-.0bLGceFPO;-q>)<* %!M6idrDNF;R!9_FM6'!p@L:M@P'3+$&46:<8r>hVoOX%LVEW>'&7Yp0'gM.iZ5Bh2':0M+f!N3E'a98,9(4.'WfoIhr<&bEESTOT %A5dD!KDZ^S]@X2Lq0*EjEZja\HDdCF7IssQ5d;LJ.Oj><7j<#`@<=KeGZOAo@6t;7+lNHUN)2,1Wm]m,NqXkd&D2]mZ@d!N=0nTcV$DL#agZq*>e)P3nmU1*sJK>BH!?cf)\aXO/:+V#0'6, %M[:^i-I;XM/pDtTru9CZoe,g %.4b=b_qeFeEc/q8I,`B/K+9\b]Z2n]of;YMqT\^g7nhMh>Mk],h@E`\=d&'R$5d'r,>j2Tt>U[MVS;7PQ(S,45_'.8g0 %G3NGdmmYifY7SiuYcHsK:$i=Bs8+LAkVf0l0Dt`E6&p6/q,mg3((.f<">@\Xk:jto0C3%E-ldSi*rP?ZWViag(H@,c?WmdXP3_aqK_ki]`Dn]N7+amRR4)CNiV&+e0^CQ37$eZ1 %#^`.[5I/2fKo794kfE-QqNAu5CMr%G=if3NVcPI`9`@5Y@<[`EC3=FGWGuL=`F<3WO@_'dP1du&/N\fSmIc%ctmG$sH %oIl3+_,Yj*/JlR%rLWh^\bZ1SlqbY\%&kq)<=QKKNXiTCYO#t@rp\(sa'QZpQTn=aE;0:(o&h;PmVZqABL;DsO"j!ON5kkg+.jma %eh3#2h;#[2WpI4O'oB/.$"Rmom]/[Wa>kA"'"(Gl_))kgs2s?DmKDLub\-R[ZO2>o<@2!2r,L<%&/\ %^9@@J$Mq??`sgG-bI`!A*q&\P+;^Y6[Sd^h)t#blE;=k*c!(tc9TtLJVGX7oZS*=/W;'B]dsW)FlLW[V'Q3imI.q1,FoLI$g:-,$ %f)e]qrj/Hhm<9ol\h)Rd]QZC4o^Uu)gj#DQdJ^YU[AMgDI9,pSm[&YB/pV/ToTeQ2b;O?L3&"HW:p=c,# %:T!*RJTosp[6R8YQn\9co*T+oYdrhG]l0@rfDiDK]2t%LGFa!G"*Y9==7i#3hp":lNA'`LqK$V2X#n>SRed#jQB:M3H %hQ)YiN.-P"qtS9WjSQ]=N>c6bM@UdsT=T"(IFi.#h>'"eAif;R[CC)FSV>'`r5>LSC"//kkq*hCI;bT85TBXVBfDK,^4I9`'/T%l %P4O%`di@FlktA&n!F+%A[MsSZ'>5_e3DZ:BG[dAu$e204]:+5_D#'r.R(7t/29CIB4&;5gDLm+dkuCXij/@3LQ^u=7:0>,@qst8N %^'gODf(S`\jOIk"*kN=LDRlf%Rqhc2#NaPV2`Qk).I^2@s1GRi:_LfR0%:Vkp=RZG(6h]pWn7<8*Uc$B.o\)YAi+% %dO.Yj:N_gOS2u#98$=N@oM?&TmoX6>d#%4>^UFs7q0fI!JC1D^4S8$N#;:TV67T=D;1@U"*:$@+n+]CkV0 %[A&odNHb&PWNH)Wk10%ah4J@,E9G$kQc^_'Vj4I\mKHdg$`D6fAPG%3E?FqG[tTL^X1gTe(uZ]f&u+n\h\#$I'<$mV5f1t8oC.m!aG$H&WI3^$ftuZ1*q3j@8p\gMSmAYm:+Z4+\>kb1kC1D0B0LAlBO\O %b#Q8e#QdgC,\T;I[*oX"gGJYnNg=^[\7T]Xe.skGTL)U*)%_3\(G'!m'bZ-eS^'=pIKpqUg`rI,Tp%eC0(Q-P#01!)UaWH %aG$l+("IW+69dc)LuVMN5"H;WIGCV#Tc(dg,f35!cq=O=O.U/f5U.ih"C+=X!Ic(sUTW*;3WO[kSlB)AIUC0/,Z`H%*TnbL*.I,0 %!K6Or*fEX2V1d7sT$$]%n9]jl"u6e-#;3l>oIeQ@9LVR*@0WIN"^u%FFeM@CObPd4TN(\4Lj_V%3164./6EFU-V.FH7[.7hcPO,A %p&("H2$c2EX%8ZBKLlij(Ye\BqKrY;=&2(!*[?$)B;5poYac_65[_!_-ok6eGsUSG!ob@N]aS:6RWrjK"9,;=!NV=M.V5(PY!RbM %c4l,8h?1_:7UH./'kZGk;HD,p2(B^orCQ2i9+T*,n#.#6<\3u'kg=>c_B]pF,%N%Q"c*^GL57mhcJkeSR.VY'$\t"aBW=e/12S9\ %mXP^6Ji\^i[N"]c^1X-+XMKh2iAukI$J8\q8M;J7f16*$/Yehm$L*Gb-tW]!0f1fn.\;o-E>Ai<"84U=@CE.0[LFtZRV5@#uplF[E'sVCfN.BFBd>u/Bg8c %%9.X%Z/5/lZ-*;rD7*fb,SIY$(GHlS_"UB('Ar#Lg']ahcq8gsQ#He-"3kIO'tCh__f/7ID(j4pFhNp&8bJ.dk/i#Pjo?;d0Q8eh %Csu!uYA\&3-k5bn%(.0IbsCt=T!'>nH`$iPGf;tC$=K8TLcAH;4(d<9o]fgA"b@WF/tWLAKS0RjdtlD5:gpYC8Djk=!^7H"8tfZa %oMn:3&;2;)$hj^QRaBhnLMEP0]Y8E\lc,*g9PruG0n](j;f?;WLq`G("W?OM/>'0oqCK\.:rZ&UUBopi#=:ZX+`]/<$f+VZJs]CU %eX&uJ%2-NsFkkCR_V",U;Emf"d1%<^52#3,,@1[u/:40=#XF976I8bE4[pQ?*/-_:+Vk8B9>XYjBKDRB3/SSLRcq*n`[XN9$qUA_ %YWnokC-e^J72S<=OHikAPQet(>%l4I>iEgM?YBk`$Gn^d3L`*hQ$8>t899<9C8W7C] %LCUj)C.,6UPS,AqalK9&*Gk)0-YYCcj-jE<>C4LO3hMcEa#:R3XV-,`td'cbZ+Fh %0\!4"P3p'3UD&o"f%DmeU2rSHV=k:ihTej:W3-8,?\qcO($3CG!&"u`MrG`G1lUh!0!M"daL*$]eh1Z&[Sfu;YVB*29u(?f.n>>F %)(;3E#`;CO"Hap4IMd(3phL'7Qb_)^)4K>6]SJu&6Yr*7/jj)5ZG1s,fG0i-0YAN:=>B"(YlnhB8d %&:Z1X#]#BbDNgFq01Z4]NT;4i,0rA/plXB5`=dSa8ph]@*-EuEr,q3.4+4(KaOKLP#4B94O;g[ko:FbMf[QsWB`?!_?Kps.[G*6E4\!BnGU[@DY&+9S7t6THkFkVK25lPQAWO;c[Y%G?Ar %^b]oQJligV,c7Qd/Ttne8,.PY+DJ,.5BDk>;>g?=_8;2ZSX_)XcX%QgkV,(_ltVoAPJh:?K?0b %k--O=4OP&B,SRHPqgc3PB-F7[%\c_S8rKPUjV+SGp)0Z08ald3Nu'Wg$mZ\!2."0Bi2@d %"pb:=h,:S]kO+5Za1Q3]3@mG,&0Lfs1#q&)F;Qe\4L*>K1cb&k'8L#/4f(=nRs@pEW@5P+?TfTPFF0I>KK,A032GWaF&H0(3AZ.Q %Me!-"13:.!EoLYFl.UY"Re1&H^?fT*pj4r]GU.-C-armEk%0+n/9P6u6o2su5I-Jei3I6AP/UIT](Elies[&uI`?AkRRCi.=:X7f %4,uZ;:I+s]2^6\Og+Fi?l3Bl7+r#g/mcjClnepqAdHAUmd\C%DH9QY-;=)H7,"B_;'-3V_E*h^@J<6O=*!fp1,m"=kNd)l.RITC+ %=8$gu/YZ9sDZPT9bu)I%Ai*+J)+%O%7)qFY3*%:gjr"g6hR]/<)i83:S<<&NB#ZWFn0(m$VkGC$l'H*Wq0[:)Ne0P*$C;gSSgs4^ %7h2&!-mpj^k'(r"-)']kQ>N%X0s9.E5bb@K)F(4;.OsPNA8A`BgHFcklK_S"HnTX`EY.dXbL!\;/_3CNZ*d=QcTif]1Ms'U3lU$q %<)Me'`t??qC>B")X3G^[@fohHBi&;/KWoG#ag3r>I;XP)/;o6;l+ZatV?c3k0aH1[DF)O+-0KqqUeX/XiQ4guM*-V;":+8!qYOgR %KqF-e@`jss6;2)NCb:W(Cb6DY>>((1W[102FMU?Yoq8P5j&suk\/*Ed'1,cjfQ;D/<`/XCl0?8$J.5meAf'%1`f6',Etk%&n)7;I %M2%)12sk7h27Wut`$>PC"Z+[]]6SXAHqu;/#=4/9-kh$-ErDU?A8+K_r\o^F8Mi=/Z!&-:@[:abqC4t?<4El3ne:rYXb^Koc!KsZ %+HkiA>\+'55NMZL&m<3*5Q2MZZbL1e3`:mfc`<(29DDS<4S"+%/ug<%Fa/2%g>U+A8);H2O'L[#3pVI:mq\a1Uh?;rpj3(V+%FIT %4tu*e9o^Up5)"@M59>P'=h]YYJtRNt[mC+7oj>2,BMs$P;dM0Bf;=aS)*RtNp0alsD7c)k",j@4q+XU\mT8f"bBlsqCDmKkrR*24 %s/C,=qNtd`+5Rc:Bc#V$jF*B+#V,Vm+_#E#2NKlDbEr!k;ZRdYnB`ZnLDC6sqR]'r:B0qsH""=W6Wg&L=e1EWHr;U_[RVlopUO.T %_B7+jG"ubQb0duMbF;g\H;a'Eq=Oa,2Z!qUEph=g?nd3f]YfnKYGWk-DVOb5?+HY;c#pAU[MBs`Y<;H-$YM*%[D,XRP>ZW"K3&nu,R6.(EljRo %bO*&_qaX>H4bjblEW4f`/RLV]c8[W2S5[eTX*^AonUeC)=ci'sf5FLLB@smBR)r)C41R8AaYE!JdC<=']]le(nY0NI&-S* %/uKk#jm3p.]YbGlgS9^0h>-DkKn#hZH/d?:f=ZE8TuZpU5PjN#`Im`LF>63tGj(Q2$LJ)J;>"4:ca#t>^>H;KCNZN=T/<+/[p\$p %Y?0PhGg4eAc+@>$b1B5:?H3kbI:M*V1[gbeJg.N*4LTPr!fEj1Y^FWa6G]Q[^YdLER[a%hs-AmihTa"Z'abrd?Ztgp?glgYn_GQQ %kbms]9jbVV9s;Db7L"@WC.dO*`4K7NFKX:Uh3Xlb %e8(@eV=`)P2Tp<<;#gGgT^FTbM(bJ=c\(hD%9Y$i?Ha+H&8-7=]q9A$Gk6ZPI=oD)$VN2$?U!29Dk=3g9AHd/CS%uuU1<'B0(J=a %ceW3Eo;iRloX``Rq7WEG_8*g1<5W&Ma)jGo[,0JojPB\k52/ot=ooTAp;LHoT:+"fp!sX/\GFL[VHKmpj*HjKbOp`ehm7'&@DlBh %.,n%cFt*>Lq/,*M-amV)^H:2qKZA7#Y9VP>YHkD5)eKdr('iOZ=[(P5\Qsj)OI%OoqqJN&AT>(KT:RltB)r0_f0/Y$1#;Q37GS;f %cgQ'u@FUcM_XH?n.nB/VnjOPnET?5m2]((\o>Y!.%iO&B7c@66n:1JSh#(u/H3<-,04%hb04M-0\!c2:l.YQ.-D/Q/"2tZ(YF.Rt %o_@`ZpocA;#`du*]E%![$9\h=ObI(O%G[SNOZ=6M:Z %^%TV.9L_2@p50@jM3^*P=&8NAS?[UZHM(il]U]NQ))_h %X4BJb[nrH5Yf;f!&EIp"3r43JebMo(T@gC>o8!/XjrQ9%Vg5'%/;9L!d,,r$RU>mr/2g:BI-n33LWlN=pNptYh789\_g=?'fB(_a %;1sA"i\oZfeV5_;O52H"bC<:-HbX7=o-N#>LU!^gqukWZ1)d+TqWnFXj>"Imr`(N4d49YGcfD"$[DO&Vg8Lu2E7mNHDbJ\`ZO:E+ %)O4HMBABudcjuCJqq']2E7+'@d8RPqoaghhrS,'anF=?*T!IF4On`g@jm"Ci]&VSoaN)k;hn1ol(G.iA`R[]cV:Y^m*j3i^\'o!& %o)fnEo1N#&C3jL^];%5\5K26okAKWk.(X`LrSTA$a>Z:CVG,pRfA)DsMqE3ro4(D!0\PU^7[_;_5 %%@-Tfe%td^q>*pAftV=o]%+urRTV('T!'3E4S@9[m<`$fU%j)c4"i]Ml*B8r%n7(MC;2:^4h#gX40)Gd?6e(6mshWSf:IEfp[?kC %j,4W[Y&Al[M7!8j]F*IVPAGJ#[88IH5?G %QDuk!#Lj6c5II26E5-:u,6r=*cYmZAArF.j(c/P5XD!@rc@QQt,";F&D(>$33bid>NK6;URPNMk\G10!RjZ+tW7>nP1BjFg%37q$BF[6B9UD&nnQqmQG)1fX=o/ %.o!m6('gui?6FBZ7N):.pDSB+iCS.q@c/sX<*aLK'1afZ'F"?@)YN4$obctQ>eSc'lj$tmX?W?96A0)cE'7H?>d]Ca&u9LSd#'?p %dj3$If1Fn(PZX)2J4!QfQj[1G^6>;2ES_T$=q@ZDWk^[?"IG+8XdCOcdu5j+kEmjoU^9UDh#(=AT"+0PK*E<,RiIOWNWJR %+ATh;7W9*A+q]OopPg&R$RE$r-QpWo"$mK*`S>sR0*(DSD4mInFXP2+RrKuZp0dr=$FhX&""gNbTZOa#^5SdD+rjXI"S<##Jip'I %#4r3%)890pEeXoqf?_m6eSJfI'QjNIrsH1TnWuoP$A::h,"oWcpj?pJ>@%%Y5uU*YmgV$J23L*lirO2C86tJ"!@PGaI,J([!ZhN@ %+NT?uji]tD_p*HF@hBnU:;[JD-Od4kAGs/L%bi">:h6O"/mr-/iPr60Kb6!TMZ6+AUqg^ibL$ZHV?@F@%&W/K,7+dDQI2'hQ`5RZ %i"m\/&ocK&HuCY,JQgiO9*V`#BP0+i3-j6,J>;,p&-^$0`_t\P-o/5-INX[r%A*tbW_2$> %Rc=aM5[$Ii\qpUBB]%/:8g4)V2bmC.=eEl$5o0\DJ`gtXVdl,j!>CQ'PJm\0LeAG#I@QAVF1?QDY%>i^dPJ<3,miKrYT^nd!#]to %qn+VA+t&?cN,/n8ieLh$5k[/?&'sGJOjtT>h/tU1ds#)S[gE9@%877qIOAHVc9Z=E%.CFd(Bs+rkDX4>#l'jB$9V]9#=%Z\LfZKO %A7a"d?ka`>A*L04TLPW765Z7*QQq73-%&I5sh+;"sc %7%Q?&g`'a4PZpki$^uiIaN?pm8MG?rWMKWIMdhP;d\%LHic3SsAO^[l6'=k4]FGFoeWYQc;'oFS!U@#m\l_W0Djt0W@N-QopnJC$ %k0WI23bKI*HCF``I>%d>D=PM`?S#+[2TSEChuI %K$-!:cXE#pH*Al_G*FDN$1TkSni)UU#ZtJ$G-N2U>Mq2EM$"2T$UZ5Zc^G&;_8>OIeaIr5u81U %$IlJ[FoZ^:L6!bK2s',*m_c69'<,@;ZN;=*l]j39Unih[J]X&CA^+:EtKJcYCD(8iV?f+Gu\ %a8iW!;4[nT(L+rddZKpdfTQ18qoeYl!*H?jE&>KGk"EK^%DRu)E8WSc8B`ANRHacoj=j80SADV\qIUaV9L$B\@L4r:'PC5<'WKrG %kt$GD&k=l\_V.`S69H"qm117Q^6@gI.0SP2^EK[mJp8Lq=P+Ap#+nKrETlV8+H(-S8g$8/CPF+sU33aMj9mfK`T83\bcUpp=&XL8 %m&<8?0=*s/E?jO'":,t.Lr@qUO>kdb`/s%lK@&?)72&j*>4[JJXF.*g(4P^c#%mh,0`#7:.mcc=LJh"=EYWdY&a9S;mL\\#a:]P] %\Kk&CG/WoiKNrCK_?^Z8=[?WtaXXo9XitMqTj5! %PC&hm/r?A6>`M`6)G;"?;U+JUCpG4s-pJf1'gR"8M<[JsU*J&?)P.Wk&V0?5ip"6S^_$u=X;nLb+]+ju5H^p"9F^()5G)dKHj%2d %S@%W4I4qA!00@Em(%Tjm,s7@,SV_!:S`*;&"_.b<)h@e$N#U68:`\\FE%3*0XBFdMg?d0gX^J"+gagT* %Xtir&6"-Y$]*W(A:[ikCL+qEmj8Yu1dus%c%t2VEY+PZ..rT51FSHCHr5Vj4)ZRO*df/^1$\']o=14'+Ck6L$?emp_r)<0dN%H8g %>A3\:SraXIG0^Gg$iek"`VdJ&Un<$`T0`ErTW)97c`+)tl@3B8A=Y>Zg8 %?X-"RrTCP^lJq,])L<4IBZI#b"1:]rX/XDEeFnjp^rR5h-3$D`547d/29"Lm'@&\+&HY8%o/h^rEf%R"g`7N:haJDpZL-n)H6-G9 %0Rgm3b6FYd]o,D3\qT&@,6-E>kF[0=iE%Ct@9]u'Kh\>bq>8kU\GjKfSI1&l=&86g./^sX9G %Dg:cflams&cC5'7_/ZC7^@RE!/i3_om^uk0s(>'=lfJPmeAkq(kk18`Sb)2PYKlQ5n9aneE^TY]F%p5Q3ToDqo'\@^cC<:t4GuPn %I4I7(n]?Lp+2'dPE8r7X"+c)nld%`k!(YGIi?E"3GjO42'.QhET/>f_c+A1J^@qL?:Z"),U6Eh%qR++9:HZ*:i-ArF+50GDBN4k`Nt-b&TIag>`RV@=HY/bPG*!5PFgTB>DHb_g".a %))^c&PJ_AHC+-dfSgW]\5H-JtIeQ$K(Eo?\N?*qkpRCZ>6Dk-6#lF,]_lp_ke518s1IJXDo'"PHQ$u>\Rhm`giFMj$NLDUH.29YZ %O"POdrk\K1B#7t8:.6+$GEc7-mdA%i?=2\@+8Wpu-/sItEr-:^'p@u3^Woao4`r:Qa?=Eg?tNd;^V;k:)\;1s-U,9:i@FIqcU+i4 %hV[fX1U!B)rK.8mN#Fq#HqiBQJ*@V*Sm<`QHsl1@oL8.#3/a\q$g0X]jR2rDS:94]S_pOpK%M\S+'nI4]Y!X'!L-!-)je4Jm'^sB %f=\E_=o+j&obT=CkIA\W>5#nQ>j#dHGt2rIqO*%(f9,eYH0*FXYIJGs_OFE%!u@tCp\'ep^V9N5W]?W:)k:D%-MADuQh&hf,J)==s[dDrMfn6ub5VKkCgeD'J %'ArE&f%dVV&*3MM#gu4+^]'F`-C\&HD!BYR:YrG3h!rA,pJ.a7M&f8oq;)e%=^D'WQ9;0T %,>hWOr:m-p)]gkJDg^L-g#j0S>P!:7[qd'(/^;p^^o/c\^V/aPk65NTDIjF:E5uIe`t%i\Cu2k\2"RA#\!a\hrpYY*?SA#UK%/i+ %+*uIccbI$aoA.[K]Z@2G*Th4[kKpm1D$&-[q4tRsiu*QRdr$7W1>_WFBCF(IHoSh+^),Z)JgH;h'_H;!1F;OZYFbhhH.&TuUV6PU %LMim?V=oJlT-[=gH1TnkL9VKj\%Hi*GHQZ:9>P"C4uM;h_OU[omeu-tAWpgrSoid5o8*WqOCG>9Y'YQUQ+\W2V")DZGg88:/Ud+5 %Ias`s"V5t-N7mjTLt;t1Ea[@sZd14n_#qFFl0Y`R5C[GWt:upFc5eE`]'iTk.W]&k5K>Ic#]X-gVCTa59$B9 %Gk9J;c+`YT_(oskc/3KE/=Q]=-)$QJ$o$D %cgUjJbmOn+>rM'/;_$s>(k?hHmlI0r_ECiUk?E:6Xq[X]2V!h`L1&\M`s$<+P+HgUbX+]BS(ZLBCiVjBDl+f&J\5lut!7>3@$4JI^657df %M=MsTm3H^%SN)bn?:b2Y.8D&j7_):Kcm)mkBKc>c,Z\T%cj4Ul(eFl%&2M.mZ@"XU>=S$F&N*8s3J(1J=4FR5]7W\Q6=@qKjjOc) %#rmhE?X[3VHOO4$\8;q6Pqo1,i+:CM)'<$q'es!@0HXkR#)'*ff.O]=)>crUHF)`IV$]K$@7=k3^R3Y8\@Um1TC9a=\g'Ttf#'k> %(;>sN=ISYG=_#8UVX+]+s,^.lN]p+5"oLcW+F"pZ[NU!f:hjF?Wkf*tUF4@s8MP]qm %GSO08KO>p'>56%ae6sI+J-kWFn]lfR;\3]j_TD!%(iA6$A+!JrAd\8PLie(9Qq1YdKi+>p9>oDY>TKKMAoZ`KXZY6HfF&4fCPK)+ %;0A$4=7/&h;9S`n)<2m:@W,EqLsRJ7NgQ+Kn;l,\#0\A"M@42\?:]N^mB6:5a@*SCi+*@(_*TQ:r=d %BU6Rd!\ZUM6)JB<>?^_Ca9dP&jM>0p+CqZl28LWXh]<&dY?L_qPjC*Ej0lh=Q!#C/_ %bdo>*(-Fe^;k[UVgrmJl)lr'E$.6U0i?LXi&fLD'#hGN\n@(_^f'JU,ppln5E43nk %\VYk+*K9QGF,1su",mCQTL;YMK=4D4@0UrfqVmV5OHr*D?>7I6)6hK?its&cNnIsX2+hp9OQL0)@h:Aq52YTZ\37pSnd(+>)?hg> %$*YO8QKL1kKCNAa'-bUJO&e%e.4^1(G#Xf\fWo[H2DL\YI6WK.cIP"#qdG$El>;t7j]l(UYo4hq\FXd3P;%P#2Cl'A#Ve!OneFQ! %_<>eH>TdW3GMnQ6G[^lG$PO8="/'EPSSA`h:efcs4Q9e.K;U3;W(j97KbHG'q@"Q'iCm+*h=CT4BRs2cj*qHD5c"DZ343FNW604g %MJ.PJG8"/1T&BWd"^8_9r;X3=J\OEY>,mm9h6"C$LE3>aoukL,mR(@]O+.%G>#-bMFCf$eqVB!UC\c,qrbogum(O7<^WVuB&+T*! %4+i%X=^FAk2^b/@f\c5"?PEjfAfh!IN8u*?QdA<$rVtjf5;*_`%Mk0:7i1#;\tAT8+C2a?S@ %G$Y.5kb8Ims8#Ngmb:'NrIf_H/l3D&8U\o`^4LjC5`]DN3"Ddd.`"ON`jF\H$(Bc\RP7Xqo)IS4r8ZmsX),EGmd.OAD+t&+@S"]b %IUDl8c]Ep2PHV?KX#9(-*<#tGga99(Ut]HjH^K#KE)N8ml8N^P_S7BrpuBE>&ERqRSUqi[O0q!a8q6TG@J5s6((,NRdrQoFpZ-fW %r%b"(5B$DS;lsGCVt3ZJ55(K>*OO>(F.]$gYYb+Ca51+'Ie,:lK3[UnGY?<3pY:+TT(&=.T`,)ciDeNp\ghHjiUM+uT@(L);V/WG %2%(T:/%"X+'KV2fF2@7]L$R]V1"QkT9]a;pjrYW?-qp?!PqP'KL6'tIs,p^TSTS[#!HZJik6r=eFmaiAQh*^h(jc'(F"b?7S79'A %d]_QMP/DG2n(mlgST+4F*B&F2?eqqCWo*-'XSEK?[^eCVsi?U"q=FdGtCa=.[ZS3Dc> %pNt]baHL\c16G:tR;ZuroBk7'e9p;S9Y:;H$bdDBIdJ.3SpBF[9.9>cH-9R)JmU3I %Af]bgHDS20f$CNU4o9a-?]kKtKN$H/D;)Sc"bql`bZaPn_c6K[$Qg"%Vp!Yi-fbA["+G-CeVH/)NgDo0KK&#(2-\Zs3NcS[mj"l7 %biQ:CncPB!2f%a>?Gk[\MGJ+Es#d!-:(R;hjF*lZ((rbr\&V@Z#JSps\)\A"UO2^Z %3&/-qZ+b0Ls1UPWSp#$YeopLdjFj/0.d+e,o@C=H7N]qGHYcu6e#h(gS?/>;iSD0$kj-3blME_C7.[d$`LP\LDT^kErOle:N3Ii: %L1Nf<*F"iSSGcn'j377)D(]h^D1*q4mb2AmZ"3?J?Yr!6J*r5-0$h@$L-C*#I[ZF8gT+9E"EYYrX?J`ol%,t?9eTtt/+f?Q=MEKp %T.HC6S3`ifp785pk!1T2^AIiYH\S+m.(sr`ZLkKSI*)AY)d^5PdPK(<7pV(Bs8(n?^-AReo7:2:f">tJW"rZsB/\TEm&MYohlrk2 %--!Z)?`m^Yhh6aTo&n3DDtqt#mpEYRjZAb;"+1q-J%9^FLA0S32Le%\`T!4!V1*YD)91d%mX93)ghW>_*e@\'r<3uWN6($ti;+P! %jC*9Z>M.ZXhY#4-H0o@UY^H#1$%TUI!t#G76)6t80/"K:399g:"B28Ej[bYHD,]"nXiYSh.EE^X,3R/,f?;tJT`O3ghk$j.RY\"(?3e;84Hd#(/>)Arq=hL&I+q^f-=[a3c*FR"Ukq+(5srkdg3&AJ:R.71_!k0l$pON<;[A9djVCh-D5F!7r&KQtDIo5E823M*5H:OGZee$HGI= %,?8acG_7jYBJ6C6K8O*RM<_"eGW+1a9KA4D7hXsHg-jdMH0?C"l\\:a>R.u6mul[R2$Z4Lj"_(f(M18kGK21_//h;(>Kr>N0ags$ %.7D*!9h!W!gOm1:&Irb[eLZi%qT+MqQDGteMTBpC"]7K/&pBDY%J+V^$mm^hQ7!$-K5s2D!?5^-%9Zjp[.12Q;eEKBJd%pNp#0-c %!*gXhAmaVE,7_sSM&u!.E$EIJ7g)Q.Eem#K,4AHVO&uS"U$kZ]gg9^B&0[576Xnm9@DiN!&/aufEF1%)X]\U7PV*cDXs?k=),qBY %DF+-19I&jgb)91:*Me'@MBW_+)+cNn"-M$6Rt^?sRS;9E$,[YMF;E'_V\TstnR %,M,h!0Jcc5)%d(jE#+IY`mJ3`HjQWWSqY7F/TD8T2FZo"Y@6@HIRqC`DX,3D["g+uMA1J,8eEgaR[,rHi@/7S[`qWLjMj&kOUB/U1aj"%/.&qa %lUhQD\9@59b,Jfb3M3M/iL0i_*-n2=G.GJ&0M<%/>Y/#TY_s`p7T*bAU1(4la(G%&+pJoG9'DF/OF0cg"]HYn(Q-:tULleY<#\i&A\0c$dn^UZ %AJH>0*#T'IW'EpUjnf\G"s90lIAM7B*D %l1QP:nV#Gm]i[m--:>l3d=Q%?"aRum;M^hHUrOM/\eE_N94f)1/E'-qfN^\MG[p%.%_B[RXO&,<-`M*D"DUEKkd$VNbaP+<",q%+ %kj8N3:4VNf5#fgefuMr$a=Q&#qC8ok1H?`segM"Rd?k-DDfS[DqEj,&>VTk*X:/sp=LXbf#:51GAllf2c*0LZ+qgq&UpZ=2$mDIi %n15]@0i#.#$23/[P/u

=$3DA/FhCO$Y"ZE+ %/$=KNBgkVCEqNE1$lE2KKOE8c(04Y.$L3q');gj:ar2[SlrofPO9gb;l8u7MI?;#A;\iCH;WeeRDA'+seHERSP^H'oYp0+E:GuK( %Jafo=RCK6V19ASq:pDQ_,`*RO&TjBD\qp6Wg1;#_;6oFmli<]R"?Qma,GDFp*u&>"5r&('m)I2eJcVP,-*dg;m[-^UbHg9n.-7+n %mRgsT-!:FacbSm)^<\p"eHF-V*GQ5Ej\Ai^R:_148N>c""?NElD\?ZK!iLX`_p4A,H6cs8T\D#Y)hMg\[V)nfAm?O5Um4R[N+0&4 %j^e$LYW+SkoL*E!4SarWg0']nG3na"))k>[(8"3X5CCOa:O<).Q]isgRfq7*5r[r((:<>(.b(&%)_E0sIHk!lD?q,LB!Uo//007E %3T$h^!O&=*H-LqI4ATpT4nV3G?=n,'LbRG7U.)+c&DDjaK`Vdq8Q\Ht>A\d33jpOuGMV!3]6NZCi>^Ig1=0jZ0masN>7lfuMVHAcQRdZ89)ueV %m+m?!VB>"JS7m5/@/Dh"KKu]6cEep/f%=.#:D?s!/>"R\.@^"Yl%D,.,QPtQa`9DOJWu2EBr/FdSe0V%Ehl<\@]h=7\ZJ$+.V$K7 %<@D'@[$c^o.ss:sM9cNSTQW91on)I-G*hFbE^Ci"n]-*-%]`ehmeeD3-_Sp]jtVnO(OCm)=/r@:l1=e`Utc:1f@)KPQ%@ %2Ej#eSg4q1@Wc89EO?$]b5j%8DkKiA->gdA)7YfQEcdQ1Gkj\9SckL\3'$'"A"0T9-+cgMU/#I(\q8pXA%(\p@NkE?[8.D;8$$\n %Nl0F(ocsc'V:7)tq&sp7n2sP7A!7b.TXHMo$J3`#fMAV`h5k48Cq+@ulTrD(&N3Y/I=CSnr$'J1G$.cj^sX %/eU0kGUF*e;.K3XGkFSV8Dn/@*PI3*X2J*%lo7n,OE`+Y/5je1i_/8=A33?;W"^A>8t++8,;#B?9tG.e1&n1A11p@#dn.[/*/$O0 %OtCF.bsFh7a^3L;bj+Fc>*.IVaM'1M:@u@&T)(4M&ZrcpZ`dVmQF+B-3GPk.MI?jHEp2S/B#$6,,:SH^3E%*4F\WXRI%3Z?*1EHq %dOl)(CM%3Ni#F_:dnhK-BeGbN&dJr,SiAOJO&GL8EaK-^1$cLt6J'Jr1:1JGY^aRp'&#gETVtb[0Ys*t)q?X#?H$[HYbC.K_,u]!AiFlZ&=Q-2V=+:]W]5h=#uK1q\bRJGO:Ngab$c9L[[tPgk&=c9k!`bC %8J%R:e!>bge_)LtE_O@TNd6V3d9o&fEe#Ah@:!l]aCM0[@gV*(a@"33@[gg0a#;hYuPNC$1fb8MYl %e1(3"GWnjSV[BFSAI:#;ljG,6(?c7u_o#qUmitug.(Gi %NBII?Pe9dX@t/@sn)dTWlSNi3@!AbPJm41q3-m8$548%ZmYPYNH91*5J:i*_0mo0!_p<&Lp2oY?AV$X*V"-Vb#9ID %"o*W&GF5:\I=i"OZ[68H]ud+35]G=b^`W %?q,WlhSZ%-B-_i'*<*cW7,u*Bec;>-d#?6SRr8[g6Y:]\$C)_\=&;I#is7[RiP1oO`8UrbOXbG^Jb>CUn9r.eH63.&=MB;Dkkoh&*"IKlLnE.OD&pf]Q8&:.r_eBi;"HIQWuS&Ei.(8= %:hIg6CEr^LJ%LXl^<$]WFS9T8ohlOO6Sp*Trim!.u&TYUsG=^bAQh9:7D9p[Ys_lpSsH#[8M8=qq8n="$#nJj/:HW"eV>-$'[b9 %"NY5r*!h'K_Y9q@JG01Z6Pepd0teDNVhfL0j5&OW>q$_$iIW#O'i, %l=H26A>KG:_c#W\e<@>cO57a`o8Lj%?7-@Q?J4rag@Y^64H`!ljSAnBTLNNu9hs@Ki/'G!NLja1dC(Y;]/3m8-K`O.`2kkc*+cGh %9Rg-P2lc3*a*K.hK2#-3L``U\%ZFqLqnRXEHb-Oo1E?Bb-d#L,I@),2aY'%u_7CsNPP]s]cDs]X@`EF(VLlo&P6]&\H'X,n3\XT38BU_!WNe@=!0I@gSA_PLudaSn!GZZ\0l %!7XtW;,Yci/YSa]AR'C*KePd)2j94fTp9'd%\HVV>=;/K][]^=f90"oWG2dUU62?3\.bg\-3rE>L;Qkp/O#-Ue;-ma %1@?IRAUKpUe@*40+u[.`;%CMj>M&.]nMUf4ih_\f+VJN9jc'9DI0-POg+Mum&d_m-c%_V[rBS`Qa\?0@#s_qik.2mpq,o.N8Y"#- %Z7BH*B/>NB$?3UgZ^i1Y2r_%Z_0Q>Ir[>EJf$[1VmZC_JDUg1'b;Xi)/8Z9+"dVrM_d%9d=Kb:mA6kqUQ'e(("ClV^(>WbCepOX2 %`$gsto+HUfWB8TuXHEcnOQjT&7ETj54uHfQ/O!B# %@$GN'rS5E>bGlse+C4tQ#tEiIUgSkgL_$F%:Dfq5h1_#g,4T3+4AS]t9(QQW3[W<(FZ!%2^hdo=UR9g-4'%.hYahGZ_ru2+Md^6L %B-=un9pRAPk_bKs87#%:TGX*mjAFhJGh/V`,WH(;,p5CE2>,HCqZ9@Mk9C@SbhX3mELMCnH):!A%2"G'2&Ug"1/R&1*K;Jr],0dt %QT/-]`!W$a6s].-Ej5=F-rhQ+OX3:+q8AB(5Fb$*S64!?Q>>b6rE$-)R]%Sm&Sm?gmm[/4.r]!PY[Jp$8'2P--&[f$(.lA8WdHd^ %a12kFgG8)K&igY:6DeE`O.-oS$b=gU5-SN(9)F\M%r5^MOBj$BZ+fT-#m8;ta@]R0=a4n_+eP1T\]u?'So/GU;C#(rCuIq58DK?U %M!e$M5f-%R!;$XUcpQk0Sb1BfI&nYc>eUll7%cGVXO\[E%BTXi9?a7WZ+=`;$q7n91f@^GN>QqDC,>AGr_Lks8nVqOPeig0lrti1 %FR0@(D+Lrg22'PjNckL"Y1W<(k3"KSV\;Hu@oms#TR8g"0ilqZ76jp:6YWnl*5O'2BAq$o"[As'%kpB;!@^lO?8r;? %BJFO4L$nW9-,YO-b#KWNb0NU9$UBAi0B07IeN*N#/49r(*X=ZZ:J8@fSX9$&ei8"+ORHcJ?mG*Ae@ZM66a"0PV!-0+:$IcVF#s)D&uR[a+8d]Jta%2_K&qeu2Npt#C8T(?4=:,T&8!!AfrDT6M?F\MMJQ.@\8_W1D+qB:t%m3-#j %Q,!S:3Yq%J6U_QuPCZUdFpXU(=[X/4Of5K8peE-(Wkq53Vn42+b%hbWHo#]Sh`lKM:K^ZNd.7c<[&(6)S&a(JF%D378i45\H?$D= %Oic-^S:j1s>Brkh1K(k1o?OS,qJXqNr>u-2lA&G`*7?OF[XY9+\gq$%jP1&)/2JdXBaKM@0eQR&V]r:\8E+&ql.H`9[E8(:3rm3B1jO3REs$a!M/E^R+Z)%SXA@1pgk'P7'%G9``Nl\1e31SJV@T4 %!I3nZb=^^(MJ'Dgnl[mQ:iI)YI61"^"f,)R(IbIH#B %6QCdT3;#UqB5Vo+*f%PWB1#NT!+*TS!\p4/NRBBuVNPo)5m0Q,,TP/aC&^n5-u^"i8A3Xlre/)9Y\\Pq"mcAto7-r#4aX,&UEJZB %=b$M+00rPuAZ?.mNX.&[E!pLn"I^kVnd`Y<+[h)>T?&iT;_siP-Qt&:GCdW$@Sho$J77o&INho#-6,RqIh_sc&;J/rji=)OJDmA% %`U\n_A';:mc^(q6_dB)Y;b@[3l2c/\SMmMT)os2P`r%`18]jb]]bFPJ'3WnALijE16n(kqRtM'OCL-ipSEg%>1]* %e*+YS^p>0&a.&q4/ZpnZ0[^4l>jhLj_Kopt'@^/RD\*d$e$-hu:mn![kYIV0aGBE4-d:0RGYHi1M-`ICq@RoPSh*3?N::B[i53LN %)c-A>+q4SUKFjqIp)n>,/.i)JYGKL,Yo?WlQV]ri[!-RNE/Q]8@dt_m@B^Bj#GQ."g=S=])%b$C$Z)bEQ=u4Ea0Ek]V(LQn'2/E4 %Yp3;5#fmL?Z;KoEA!VupZ#gW*-m4*jC+J55RUcd!kY<3='4"j'DDgtg_9FQ#TE:<*@Sa#2On&q?HchM+ZZMc=HrlB!W1GH@%-q2, %[>7(g6C'N5>'@tT^Co!l2[4`4g(@Hd"-Sd*k*jT\5XR%&LuhnM[B'-F/&^)JJd?BN=p2h\8s@Y1+e1YrT+H;OTi)%o97/$;budbe %F,`',-`..X$XTgTg4Z"_dYq(K>bUO.&s(??F=p7Pt@b>q<`_t-UPC#_.d<;!KWsg-_oS%C&&G$g;K2q9B+LI=d'Oo,faqoTX %FQg5/)bmH"e00h_/;L3&[eVBHV:`epPuipGJH@+H9gVC##3s&]#sh/r%MA!<_FfWG!"P:d4>shk`PKbF.SMJRI3PLGAu,!/Eb>E^ %:aJq'n0:G4NfApK!1L-!i;A_J4X(cAMKBK=3!r8.IN/SaZ#6NEPb(LTWH0_)758VRQ,ir]Vb"[^"=ZnP4',ZM_E#T5>9V$bVlhfG %V%gT1MH<.gW]4N\q'=5F0O`4V=42Hs]L:DO#`40Pok"5,UsMW?DBL<_O+Ogia=NZ4mf8:VF1Uq/a^(5//,JoF[='1DIpM[0bY)&$S_00`j'EPBnOC<;VD5(LiO[K*eM1i_\--/ %\QAX54O^tm%m]c0-@!p+/h>4)*P_AU;Z\j'ng2)KMNurgX44O,i_HGUR-AC,21RJp?i?692;>_((n^&5kVls7JV7m)c]kZD1h.)J %S\nX!E:X,1B0T>?_#rY]nM6CoR9a@iZ;tTf@?'ORQNL,(HBLRe15.]2(L9fFkYNE?`.Ord>@oBQEoK1GYEsKKpcj2sM_cJ\MO"%, %JKmf/--Jk)n/p),,*i_'6k19gn']lViZ$9reHKg@5qeJub7dFFkGdAV:n"EYKeJVqA2k7T5\#jE,,Ya!2YM+0TdL82W-.3;2H2%A %*@445A5oWap(T:.Th"5,>*gNl;\6(LHuI)'aZQRK'W\m]Y`42T'1nR^c[KnolNk-oTPu+#7IFJo5/rPBM-E')_i-m\Qar5'M[j\^ %4GZ-3Kl^EnC/Bo,/cb>%eFjeT%+JCSAUlYU;PCS))8r,NY:5&5!$N\ZTp[$`V6lrc'B3R`s0a"(JZEETO)g7,0@L`VkDC)n1.\p- %:jiLF=p=#Pf.G=oSsbXRMIdekq(ptYfKn"b#ZssFPB-m`,u/R9!&5-6?V1uk";OpBdq3d36X[@,-05Gp"!+BR6KAfll!m4)p0*TM7T-`T/LjStP&!o.K?eg0EDM9q.WQ6QU?#d=2og/L,bk@dOfnq=o`\>r"YQNVkcTO?%N %8J&H?bdF=CMTUIl'a;RNJlt!%GRQ`lFL=A;33ATf.CFK1i8ZMr3:\6PA]^"BU0'Ki,XPmAM*LPQu5.tdfC*,'a'\j6&5OTA+5&K#S/+)L13,.h+3?u-E.S1U0.L4["^/WUVFtrA;k<9s@^.=k,mAfZ/NT".Z0PQ!>s^Kd.*KgEGe\-<;Pc/nQ5=.mF+Z(U6ARS] %GWCh1F(o[G6UMi@nRmNHX[bG7V82/JR'qC1DE2/HRsrP/CfcPqG*eeK+9jga2']?L@bId^F:n@mTJCf3^_s`g@j#kbNn>PV6:sO5 %FD-3R2!/-+,&m/5?-:Sj_=)L:N^GQJ*-Gf'`_hI4qt==>/VFdKih5@dN%ICJ:-gA*fk'j18n/lSjZM)/kE$6pL[7rRqh#d%c75OO %7F8+;66I>&^93chM\:m;M6/Qa!VNLs,E"eee?`.s(^#LO\jRI]jAZsLEkhrpQH!gFm])Gj\0f_#Wk(P])G:QR>[86#a=P=0gh!3WP!#[D*g-pfcEF9EL+eBug!eWTA6dssSF=?'Qo$K,TdWmOQN]9S?0)E3B]V>hYXM/+:Fg.S %*7&<[H-.q'a[O4CX0o,T@Y>LrE=g`^8Lhj30<$!f@d?Qh$ %o0F5$$'s3j3Ht,tXm*pUq9>3#`Sm0cSr5_90mkjU`1diA>o3SC:F3!'m?;o_A>?epX7do$8Ai:`$J_%O?Q/#G6B5-(XIkQ?!RVJ; %+H_T0#%Xng7Z*:U&D8eUcN%gG,?%*k-j&!46At#>?OtsH76-K"m0]]s7Mm@KY\2t[fl?Y#MJr/s:Cn44,XV_'b)9$l$#Mo_Q\W0: %Tp:Gub:+bjNMWk>7,2Cp.qmI8_2B3@J<%m"Ot*r20:,ZiRdZ@/<7R8,17@i73O#@n!iHZ5LY5*G6@126J1:PRPh@RO8=<<5PiOCi %;rO0<-(5cJBjh-ffGCP--_Oe&L%[cI46_]MIk,,=4ODj*bAEM@"*5FaQ0HDW[nA2u\Wh$e-mX'+G=V'6?6]Yq*M %'C^j,[HM*SkT]!\Lb&qnq'$&Z-jsK0Rlk`<-Hq6Bd;O'ql,&?kHZ:Y0=beDH0F4>iI5*$;m %N(V@lCuVAJ4#rEuTZIB_6'@0U;OM>Vbp,"$6F#1-d2uQt*fuC%7qJCpI!Ua8!LJ$"jl[EtT6pBJ8**[3ZL\aTT]0ZY`H.FSB/lE8 %US2qjF)uKIT=S'A8.Nh689OgfD[?;$pW6r2!88?@+M4?#qLdejq %;ldTp/%")K.XED+SZER^Z":)m3ZA<$mcZ6H$;9n=]9"O'Rk$Lr9><1P@TRYq=)a.7N='>^c$%LeDu-0=0,u^=!K4E17Cb)jV*PT5 %i)SEmalI108R`=)b1+Hf+Yp8tPkp>l#c7s13$dF!Dj_;h'fpib06J+Q5$be7p2Xi^c0Nj9$-M1f>s!fH.PIY1VgGH8""d/#f,M#8#/& %Y"7RA9@S?L1HHcjG7r5,7aW/X:>.\sPpTVcfctKP<'68oeus=G?ZsrVa1ed0A"WuA6A`=Jc?:=#[1l'J.V(/$qReM@PU]6^@sp8( %op`XBi0N_A-l+\^bE).].Jq">AY6cnq7pHc6Dmb %P`).lbbEJbCKf$@1RC_nkgh4XMY7V>_A'8Y+ELj8b(5N..<)rPY,CK%)8d_^GgVoa<(o],YP]LgP>)a/Hr%,PZpnab6UBY(N"T\Q %/TI.l2AP%`PoOe/S9DPl;Aqes#>9Rl_%W4p%QXhtU2Ua,5d6U;2IONoM.QT5$FC4p04h;BfIm@$B/`lt"fN7p:a*W)Z`"_$:ap@W %;NQNKX"&ilPQsu`$FJ_h<"-sK(r/ulfYd83Q\C/n$mMYbE5H5gQ,6HL#-sK4]LWNt"(]Q+C&4(MSV>p"%+;*hcsnMhbE"(km12M, %@G:gT!-'49AXo\cRXsBq-o(;`;N-QcTQAN!duuq)f>Loi60]qQg/nA1=#JrbZM>kBZrUmWEM=7qidb'upk0d.ihN0;6^EGEG9D4d %ZO2rZTB^u;H*3#p[Md\=.23t9M%BM`8&+i25d8A;K7U(@:Ma,H(Ad^;]KU?U=@R?O;s6U_7DqS%i3JXC;*B]1-t"d,4sD8-&h3t1 %h:OK/$YOG32sC#7D3<;%pub(Y%2mrY8TI-l9A)Wm4-ofVlFKq7K38lpNLGP*EcD,rhCErU7R[ %qSV0+],\RF`;`8$p4)F_qXIp_oj)mKq5;8?C2=*+2Ru&op\H0N>nu(.:<``_m%X;IhWts,[/$Uqh]+^Ulg@R@ak;VA0/i-MoWN"W %DKRJEq8XH\Q%ln">Of(Q5%<[,Sq@:"2V.W'o%R1/J'^..9.=ojJM=m>59\X %9n$@r.14r[p<$aO<+X6K8^W^\XqNMCp[CdtfRkm>?VHToNuZVF5N8VbB+>u'l!X@C0aZUA+#<+j#R0FZX(ljE.BG8ig7;\(a/40r %Z!E>kM]E$\R*W^GVDAW#>fAX@lC[8Bg;tprWUs$]OgV(N%f4PO[3Gn,je"eD*qU&*rbgp\>jaJ;j:,Jf9g_DL7t'2)@hJFPO*mFE %>#f?\&*T%&-L:O.X?+)\W2_bdCg[Mj?U\n83rZ(XG26ngO0%h&2+%TB)`;SF$_NQ2n-;s;akKW>#Ck[)[=lT,3[.I^.fOof+:g^U %CE-VLc,"@o_[r'JI74ldhi);-"[:HFYc9TE8(;`rWZU$(?b]Xm2NQE1_eTLH`pp%BofX"uGfBY*@T%YW@?\ %D\r`hAK='dD6Y2DVT2_["4t#SGKSkCglFfskruKJs(h)8pCg&_KteG^*=0YqOG&EJQlHOCZ,$Gg9X9Y7-L@O*4&YciGh65]\nI[/"8O4P5Y\@/hp/:L*18&N90ZN=fnhkHI;li7qYI>IZL=aR+V#3ZN31hi6P!N_a]%>i>2fM+:d&J;Kh!_6f>%&(IY[`1\C)n`Mg %$_u6]df%#[A@oe>-BB_Id=6F2^cg!R^,E%b<8cMIlcfj+m?;gFr9%`N'Yh7cX@@hN!K]i=9+=.^q%?&1i__HYJLZ:;l_q$2,5X(* %jW!#EbiWG*_WZJM+n\q/#L:r.5%KrC+7[9$8g44PAuSJHJKeK=rAj5)[riba<*eBi^+h%s\BPsI35OY/kC!)4r.LCp+A:9,nL*-q %s&8Jr^0+*^AG;9b'Ol[8lMeU>Nq).OH`QsQZQ=/XcbQ\'=sfZ$.(LD'#rh%ZqH/@+Kh4d*9G(#GEZadN/pDQB\C&M1\dS;\=lB8I %P^AU`/NbJ+2ld[,L">$iZW+m[8Lr87o.e:]Sf;\:ZH[d))NPT*m/V:h[))e/-e5EHnUIn8riJ?3b4XQRU$_m.YZCLk]C',kMURL2 %K-mW")h>nY`A$9t#8b>Y6g@(94'Gg/?)41oFumSAVT\UEX7S67kuacp0-BKo9G+<`4/obARmND>jV8&-bs%X_oS(WP1l;!QA%ou@U^eh)OVXSGB=)]5I\FehD)35!A4-&(p#0sIR>Q_2cpF[-F89!5nAlD:iH.%&%]q="3q_ocT+6a %U(f20+*s.XLV%Yo:IL4`Pa(+4PS$p^5pEB/A1:hbJ$nYC)S,^FjAEYn(s$6C;C_ %K/I0,nIK$As-7m?jmL>5PlBRqr5X?o5MbO97esZ`qI*2%@a%99U4^iAldC]4p4%ZS+B>c8_`u,Gs8@rmGU5UqX<;fbn$0`)=4E"$dIX$=R %GPAu_IJf+Cpg@@F)9!L=`ElZ-mYQ`fd;`!73@Xs8^8$1ll$UnWZ'bP4Z*/p*lbC74H\:?;)!<9`;`4p2.S+](0c(VsCA*\)c5t3d %@Ir!Y0Pia2]6\s6%G/[?BD>9#W[1N1nDIMZ,j:3d%9[jZ(X8K^Vqd6r7*U#]\;apE+2"PmLNnE5kqhJ?g %QU?#p]:mC7GQN8e"r\acsd'YNh,[J.2c7@a#.4)CXga2(3]dNlMJB:G?'.Vp\EP?84@u6j42f-f4bSK*6f.6L#!b)]ZJF %CET9k.2G">Ce\^\;#D<6pMU@qf\[V^/D&tSYf(Djc7_u"_Nhf8q&dT&53nI('X[0e"i:*b2&h$<= %OolF0)6[BZ^Go$PJ&8_S4U:J_4P;Gr0Y79Ja7)o4'YqZCgO>%dXGQfqHm/_]> %J8e!Y[fc3E!qt;u%p??Za83j9=#kOD&(Y1N`ii>gJ%rq3J%c6i,,;dI2IV.+"cO&"q %>P!Ap`PJ78^i+M6rYp(drqU.uCU@8^J9Q2R0^&@]1?j8cO%'rclT7#i+(=3&#iSAt-=IAj0fGUYMQ\j(JZ-=7G?aeSebir\fb/Q) %/gY;04*b2ZB>Yk@<)N-V>8icU#-UeHO&BD6CT8cIW1T+FhtB&+r?_B5U#/1`q_@q1&\c#EhRXW_n^c6-i%8$b.UIT"A$nf!fD_f[ %3MG-P\pu]mSj-9[.$1aHB8PO,mTJiE>lXQ\*p.]to&\%q.e9Y/?iHC7r6%-M1$bM4f2tP)i0'N'3sF;VD+VN(G:>8cRa_9d*rg8A %?cPMfb^><4QiZYZ>maQ'IOaeuGbTAJ2[:WM!krm;i#$cgb&reR8IHMtrN!;hJ[:h/%6@!Q/aR]#GFc2bK!%EGSn;8,Ij5hTB:H.e=$:kcFo>Q?5naKnD %r4/ZOhhIHorc>Ff1@OoHP_6(CXbQ5ekV\7e=aN+oR4?F)AkuLeqtb!K/Rc\e*U)R)o^TI]27/%>TG9%b1;Uh_;n0@H7sDA/[nc'- %F));7c>:;K,(%PNR*3P3X5ud[r$7.mi!sh9a2?\ldU?`?mRHoUF`giodT"/2.h!\ON!=%XG_G,H9#*8<$@RUZ68(`q$%#mo&7+UE %o%iQi"/d'SO"r83B['=2X#5W')$JC3RU%K6Cs0=+_!mC.Y584j#LrXWqZ?k2\l]GD/"kMAC?jc>&rZu&g?!]C>^m5B/+d>X>TbEp %9L/NkK,_$mQIaK31;Z,j/--M=t?=1<\dOB0)Jk&A":=A'=' %-_T8%#-8KH)_lL]-FS9aFFa@\am!hh_?=dn01J7i))!5HPL3"rBXO52AWN]JHkpqGCFP/oUNJRY-YUrZlt/DihK70%YtBbL"+ZVY %JSALLRVjI">dUiTfB@`#+QkGe>5QCI_liIeU4.q=$VI(FOoI5.bi!UD!!J+k=V'3IKX/d4QYH-!]/W(UU/q6=d:BI$ZJa]IbIP+G %T/F@X$GCR(cW6T$]$&W\#_Bogs6*q;MVFlg/!Y96*hV)QXqXaeh(EG#FEFa*Kp'7(`'j*^^08H&"q`KG]f?6!]p*0l!p*[XroA:l$7!D(E_3rX64J@YSI;u%e;l0A5nhcLfs %@PV%[7fC(`0+LK^_+7N2N)s6L%jS^`j&\$DMN.jsGVl,'Rf=5AeR-!.P)KPX$/NSua^g=p0Bc1aXn5[IMN.fGjMfMLeE7BG]gc&A %[J\!j`>OGG$gQ!gT^UBcn*@%9LcNW/?/#!2^Obmp>d$0F/Gm=)EanrekmoQ7=&36c>^)TLJGnVmfQ/*o!UFJTJmG+j1A:uE>.Jk. %nI3X[q.=J4Sui1RP]_%`H["c2fuKue0sik$$a+n7&d_'->pECu]&`5)#Xq[3op1gWSa4KV-TkSW-f+IBg-\@ACjs'R5&k*!GZt)$ %['k_h=^-f:dCS'O9h+Fj#3Xb$6*<:XTd_E)SOP1aL9",,`IrY1+s38:lrG>:%k>\#dpQh$LCG`GNR'>"IC;UGB#^_Wj\/qTc\kQ[%585DJAMcJ%SZ]!MCE?Vg77S?9?+ %"ru;c,,LSUHj7@6DVUkC('&5_5Q(gFjo_9Qo>Q=!DuG9C]U%3#j5^]dHk]VOBSfAB\9/'Fn1j!nS$;Pj;IQVa>+HOoQNLf %=aL%%];9Uqc-=nfA)WbNcHpgGZ@PY`k0Ou-6A+2]1`d^m/Z^Y_)bV[Kf9[9u3I%uG %B_3DO(GhQc]HhleD2sYV;9?:Q8?j?"Ra$;X4mUE,/#Yuh2JhjQSMUG`5:=H=1)_@8p(Fs<\)Q;DEEhnft(nB=898]b=t,b$3i'&?[\BG(42L*&h%pqENKWJ8*K)XgB2WD:YHgY=C%9grFLV %>]IS$)Jq`;F,GcgS,RHB:nR=UC`OKh,[7"qB!plCWsUA:ZjKP2iM]9kX'cGC"`$eU'q>^t\gT=5ZVc39@m[aag.Y&5&TlW/]L(1e %p"9K\-"=uRXcVh`h$,07DW4^s=Tj(,+e[3^@_t*3+X57MQm:t!"CX@.5[oZ>4ORD %&''68$C:K#BsB^L64Mh'%<7_8Mdo"_/7E7'3J`S'f2RoG"Y^-T#_sL>5a5meK[Z'"rJ4a %Obi.aU^>bM`I'Pk)&m]YS06loL9)gc=L;=O),n]F5cciN%K%umUQd.Rl8eXCoT@(W\pc9)rel4m7FnO/mnj!d[eGUEqm=6Y#]`' %K/(%m#/f,OG9H4r*#SN=FXe[jOd,i2)g?)PSrhab[<*'L:nBGR:h[M5.(k/UG$u8VU1YdK>-D)qSmX(QSa?/U^V[ZnWB'2 %YEFJdBl4K18MfR'RR(:I%=Rh4\hdXI-&gk:@1%2b;n,Jf_Hk"emLlC9QS='(`&@$Q'btu`-RNf!OQ!?#1(nW_ea;-7mLj,NQOr1p %<5!!q^+kN(OY$uS;kKdm$=uWiIP*tW+JFDf&K-l>8V8*%6hH0Cd=]SS/DD8.7Sk4:$J-M7E':M',O;`rJ`m[`U2/Zrhcb]sg'Vu@ %0VV(5Loptu'24iq6X_mP:\Sob$HI7I'A=.qVG6#&D2M3>Arr?;KtOc1jJ>Qp05Uo=Bc6Ik3R$Qd%3mNC(jTgOa@hGRQh-eJB4EI7 %)&0VUFIX8l^.HgWUJU76.uju.5A*[`^fIfUV$&64O/p@2TC'o'd,5Iu:\01iZSn6]e:F@f'cU/Jjb2_Z/MF_#G$V$<>PU%^-B,Z< %SZg%W(\?=ms,$;=KlI8-.6H:l^6Pmgeq=e'6%-F=`3;D5inc.'%G\Eop_]n3+(pr+5Ng40?/*u1qHZkBV5jCRNSjpspL0!O[&TX_ %hTeUSngYpl_Y#>\M_UnZg;fH5='X6c[_J@,]'F\:a)JT;r/AK#^k%+djDVI2>ND?gFJLX`N&^Oset'7J-Zo"h5&$qs;dQe324hm&[S0k5j.)$qqFqbB<":ba*.GeBinFY<'s:e[o^CkL[P;tj45Js,Dc>r4:`6+k4_)a07K,J%P6'I+%b %k.;!J;Kt%J34\'-rcU0;-P.k,!0%bg1tUR:!1.t1F0#\b#t9c2`'MS8U&jXqGLMXHr(D\ %aUHN62YgHe4UJ#CL_`Yl_\Hu-`[*@uC!B6s8<#5+I:djYg]1J/1R`+7>)oHrkb(S`l-8_8?qUq+SE:D?:CnY6X8JB]AkOI9"\k[: %.&naeU[mO&9>gVU5KKN3c+<\7?)R(LR>tL?8,\UJ@e$Y0gWY=@>hCa0WDk`64XBR\Zh4dE>Q*FSOC?E4d>i(qA-L2$/Puk,.>]RL %5uH/":,:_V\*Vp@5;"f\`OOL'4ELr?4$r6HA:PC1CL)E"X_`fX(%qffJX,oScf**ZlMc@Sm`qnCR=oYbCNkIRZR']#,sFI>APPB?C"VlQW[joOF^AFV/h\2!lEAj.CEn'($al^m>GVS('dI_1GQ*foS=F2^iF?6_df8IQjB]6kr,C[jhjlhm:\t%X)#Z>_(#S>LbfD%AlGf-bUUT=JomDjj36ti\V=/\nXZ)LhLHc]f2IFlu8\i:#8VU)5=//DF&LU50QQ1U'",i<+HE5&mcYf0kbfR9,(,Y.Z,(\X3.8@\j%@;Z]n9UQX&lcr2SKN\e)QV9pUEVd7+$oog^A"/E=tE] %Q,\=Nd\Tn9YLEAXNG5!Y(Z1V*W&@WZe9rHel#bZ$'=T)%;I_qn["$'=6O$g %"0%m>dDtHP5MIZ8q$QSag39gVFWKS<^"_l%8thHo[QaTSCu_IDO_ms(f_oXQVn4KmY/RjVP(TTh'6%!N1Vbf6B[/C"o9C?$o]-=i,rO!N\V %1,3878On.!bXlSecaM-NRr)!EG#AHeDW;h)2Y='SI-`pSb0&\M\Od3&mc0!Kru&Lq/G=luDdg.\qMAW*Fi$q-!='-oH9'_?-S`'# %#2Vt.;JX*8odeU)BV3u)Gk68cb?hmE/kYs6o/K%eH@o+E0Pt=^WNZWhga&?"(]'/pl`%p0V<(7ik$W2G/;@5[o%5sUTrq0'LC"X_ %anto-Cut'\n<\W1?J'U]K^XT.PX4B+\sgCs8#oK$EQc-rKCV"%'k()i_rU>%./Cl8d-JQ83e'9T#5rcN4r/m^cFUKtmL5uGk1b/) %1eP;O9F($h8i5;6R"&Z7>1IMi(r(O(3)=rjnX0X&U?J4V;PiDencAH3P:6.FhoFLPQpWmn_gli/K`gee%BgcETSV26kJb9P=JKnV6hXi)Zf,EK;3CDh^#mFW %^7IW?V#eQW'J\r#cUbf4J&X]G>Fa,[R$RLbqO']E0onQ;5GQIaFcG7TnCRR6fh.> %9;*G>'JuDgM[ViG2#kN$DLuKL^f/*kJ@.X,=_9-sREU91U_%WOkh-:19GdqW+U8UJZI5E@-OVZY@oE_.r65OoMjJE1J)TV1C!Eb;]FhGdYW-25_0glc-1m1`J`.jX7gcFlpkcWB7kP0jYW/J+R8uX7bq3A$N;qm=`=+6oA8k3S0as]Y %C0]q'-(p,8B:60+!\;6k'N5JHNg-b[eG)WBW%puQ3-c(4ABX%BP*C-0-Cmk;p_LW0%Ee*s5^+E2OmHgd^foM15pE?p.OY-&)a*_" %OH`m@$,[@!CD>9m3G@C[#!)$6Jg9/s>)<:>V=C?q%Lqr_0G$>-#JbDnM8i-5(&j*l5JPWKoIfnK%/_X"b.U2dQG%SDW.A,T>K?q: %[WPZ@PqjUF[Q)IUEX,tbECWI/al_<&>3`1nhTQ;RYka0#%i%j("cc"9KLdVT>=mgtJB>kd@+5u(_*3uq7OGoYWTBj,;#NLPWn(/9 %jKW%6L;ugIfFEuqaG13-M_dO]-Xt&Fs.(dlcG"#_.(RVWHS]HoAt/,O[-4QGgsWZq;C:@-E(7g+7khZE!NJqtn*F%N`N/\f*2(eZU%=J_5D]o!Un^gNLrP*0>?[faase=R>`m==_$k %YF;.^isF5tich!A\&4I/8_Y([22*SVYq[M3-s@O!@6\;+8qjJG:4DgM%@t.-SKFN^H:`WYqCNJp)9gLh!ePm>Wj0gjMpN2H1>CJH %ag-_KH%/)jn.G/[0`t[9dr1nX?+KNu^32[s8uIj=?:j*$YslZ_p;)o"#Ql.^mm3_#_%20Q*QWM&B5jG2:=2JZN/HXPKBE::1b'0C %/-PoYWr7i&RMZQNH!&G/=*j2.'8:Hgp($50OWp_ZI3J(Qg?*[H)(>uS'tIc1Xpa^-^,#3B;M"BIM@9Yt9,5R!"N.`U:QNP2F;6=> %^3CZpib\3U3>9k$]DJN*UX2q%eut_/XrA6\97)!,)Yff11OFQ']IO^Z"7Cknm.4^22W"'E7(q/U#WB!DkJPYHD=3s(6!?ofHm&@k3UIMBF8@.>\)IHZe2:$GPL\r5LSn*I4Sbmi$WAPQuW4.))$2JM&M %fk,O!"oFHd;OL`n!q-0HJWtLK%2$aritoMOc9>;K]ZH"G@&bp'CDXQqXbrYQfuoo@\q2+R)&8Rl:Yn$iYAEO5gP,`l';G,h$,^R/ %!M2Br*>fQ)@T&Z0X'lFY[qp'6/+1V(onLF,7;_lIW+bn7d%c@j?0W/!"B"Um?ujB*DRLkM#!77hL])Q^.1@"oFf\>+*Hg(eSl(2FlbY7_ %+1n#l>9N.TNf"idp/6-R(#COfU47Wsa[S&=VddCqn]93+ehd-\*!8Q&fOLu/j^#;pcQFu:"L]\-lHUp_M+tEu'7*61?K:LYj7cm4 %(Qj$]LndoT0W+7A"m,Qge2d=5aTnZjhc&1g%pS2nX?RD*TY9&ij1WE%OK@75fk7P.TT?L@^&o\U4Q2F9,(&u4-$6uH=#B$^5]/>' %h>q!'O3r(?Wgu.Q,foALZ0foP5g*:-HL=dMKUX4lKAQ?GPK,q>83FIUq-eB8D&'WmDA%03$-N92as=0n-[DPJ*B"HM`-'1MITB6DSkEj"$"c+N#`)N>T%&e+ %mtD:m$QVkmJpC1J7UDc=XS&:4hM60*FAJg+,A.6ipM$lKH<`uuDelQip54-O+!,En1:c$]q!\kE@*>diMULm %F_m6ab?:,![a'2u=L>"_9UP_QXF_Q07k('Y!>R=fI/lH3n@'USc]FQ3@[o$YZE_?m7tQ359js/E6F@+4"C5OfGlfdOMc\6?$>\Ig %NAIKs`BD;bac&2[k[Knu]@Q.*\o#3aUn2:eTp;ouStm0Hn/73@Y$Q_U;4NR//t/1QBm>YcSZpm?fE!>9@m]B'8]GV6,u;.XcIU_1 %5W!/SFu^rZV?t$4bQ;D="tkB_rXeiX_h@2kT+M[3nu!94_t@<\^C'Fdo1>Y=*B=f+\)h_U?B#FQ&8iYB2n-6 %D\iiW/K>F^mD\"sjK=a]i_@G&HN!1q0.,@aDt2+TMcA4*Odk(b?Qr2n;d"Kh<%5m)4N`*IZl;*;^1q2JRp0W3TL>*"l?'B7Z'Cfq %$n'HNgP%GWXoVcR:N$5B(PB:dH+Q)-,+b0WqSh=('$t@E3kg(mG2K=ngsgO!'$qVYM6r>Mb6Q\aOm(S,esV?^[T87gb'O@OZ/Y]d %Q+M@a8S$%/^Qu$Xdd^p(bgDn"=?9i(MemFhAEo0W#7VFr\Z`2+VGJ:d\PrT5Qt6hc=(L8fB7] %`\&86KQmF^[C65NZ9KYSm.bt7-E9l';].a&CB4U8hb%4hp,8bV=)*V3/Bf355Di;e29^p05GE3'%SgL2"N'-6?$JS?325`m3`YH= %Jg&5aUK@I#m)I0e9>:7kkWHp6hj:Q[(']JCmUg1"CRu[;CS>RW]NV)7!Dr![h1s4so3a6$cXkkkVQ %.+AJPWKt`IrDhA-nOOume0*(S%SIR+5jV`?HW@+gd7J:]@"bJ]'f2h)Ha2HL5+Qfa5rT)b^L31\q5F)bn9N2J54JuI`c'8ZX/@TT %mooD4Z`J)=0sZqn-hCe3lA=RS4J#DdjIt6f*%Z#;#-b/AaXa?@[/e$ROoM/!R>53QZWKUY/S1;11 %g("^h$&"4)&?u0`.@i6O623M@R2H,7eOfa(43tXQ-.,PjFNVS/NCX"R[!mkX4,Q?@>fH]^5!flB;XCfK&`Kft1@eop'U?f@gW4q+ %j$JHtM9Pq+mo[D7T*2^pjj25tClQl4qh7ATn6@r^]b@-^Z$gh&:T@K]RqVBO[KgRcQEWmLjfOJO+$5LEgeV"EZeONZ;<#%ZFHlR1?c(#:1bt>&RID)]j8YtOlm`?J(2LV#&TTC;JZU3cm)3?>ab?tY<^L3!>6lcj %6L)p?8TUbsr8ppt&)q%h>KL)9_+JDF3"uP=,^d.2Pkh_anKJ;>fG=g0DN[:s6q\bYNRq28NmIC3>. %Kb4oC(rq:V(8nCRj`C0QL)%Wc^3&%O9WtDF"ZNE*RG,%*HLS7'+U6!SK"0R!e\gss;n*r:FOMgJF(^kq07Am8MOd@ciBqX?ApYgB %o]7u7:`VB5*?Hla#(9^iI'7IB6#lOo0PnH>^$,_L`BdSqHW"_-$Cu-Ja3'%+g5di2Q0W+t:g31*o+jH/pPs-_Pm6oP;K]C47NIN$ %a308m.+5[qqpp3A9"F/N,(T'WYP?KrI*th0PUO6>/#n5*SAu?"/h4&iD@_PDH.c6Te^F1DQ#H>cn/4CHg/HT[aU[$D\R8d?],G#4 %Kg,%"Uc7$Y8pBrBq,4_'$Ee=V9QCSGL<[Z14kcUmEB\C/2<#sIGr5`+l%16lRT%ZNS %eY7&:L@oEbpq#NLMe-]1^p/T@d!@7pAd;J.qY5@bS9bnTI9?fY<=of%cc;dAWg`j:'8Y4@I&(;BoJ %PsOFFg\iEqB*RbWf4@&m)MO;2[^5)XreX*sqR24Bb&QEdh+TmaBPJtYn`r&,@8[;YBWkDF1:?/$f*IJ0e.hBL8&Ff!4JWo6d# %%sq.DgRPgL!d^o_ep=Z9XE6k)[p)C5YC%ss1KQDlWD`!ZC`0j2WC0_BY1IYKr>8I^>L7"b"U$X1^HTZ+GPGfC@$Sdc3N&P%[VY@ZcNa?u!1S#![fpN;Lrb$h&9;T %$sG!@&q*G7/Cl7L#=U\mXVuH_We2KZX0jqL#jXIokFTX>3n?`.b&QQYL8'nuI=1%usU@Y9%a2$\>:O.+!h4#BX1c\>bgk1o_28Sdmd-%Xk7/o7A!PICm3*M!g %4;CD*m]4:ia^L&#$.rQF?$(u'!R<*,bh&r.9PE3@roTZRb7u?tS4B)E'YanQ60KFG(>,$\nLH$_d_0Tg"@*R[bI7rUH&Tt&NE9gd %Jff`8e4P'cTogSaa8[j_A:-!b:ETc1qF1HFf(g&3NrQX%gXQYs4!SN`^%K3+a@b_]'XW'^.5;p3Z@=364iQU^69G7_H;2u. %Gi>I1nQI2r0<6kc79CFXjk;GiPUXDNpjBK8;WZJW0Q6]\J"FSrdk02eOVM,"@G<82ktsaRf4+O=UfQAcC"PZDm*H"10ge)gGSLIKC %O.%;A9M0M7HX1XAAjq0X`&@uY4F)9,rC&sB&%boe+iQ?CoYPbRgW@TdQ4%.lZiVOtm2)R5B;*Y^0=)ml8&7>C0gn+"#mOB`eaF0;L\+KO$rG$M-!F %d_U1#%^d`s"I^)!%pMUT4/eq&FZ(kIqe'p6WH:VoEu\QXU.X:-`OS?K"';sFC0j$3h!Ric;"e'2:eB'6rmF+=?2` %-5Xf#[(DBd(p4P<+>9:VE-*Z$Lc&ZKZi9gl-glG,fKlt)Jk0C7Y?(o`>64`k@Y2E>h0.1%chE'K0i\Sia^ %d[@_O2E-/D;ko3Ygp3piUVo>q#R&@*72`9c-2(;;@oA(i!5N"Ujfds#(]^Z+fW;ci]"YN3on<^4c,IRK9WGpmd;A)d-0o:hO8tLs*Ga;ZZoBVsj86j,$i]1U6,g(p4erI+s %7\ffAkfH=dj=&A2M@I(+cfP!b^GJX]il,Uac+Tm!6f]7Nh\+*opjK%&`,ITJQS""VZS8YWo8S#;h3J`_+!nYc*<@Ac94t6al]\RT %T/q'Nr&%qa+Rh+jY/eDrA]N@S`$H1KZ9'n0Sj %DJ@=+)a:lVL:;[?'>:?C,0KNQ7o*8,8G;M%"K"5B_ON(@tZ4Fi[WeBj!%9F@O:J5C.RbRS+a_Y4@DEV-P\s$(5)R-Q=bOEEk*R=IGC7_K[<\2 %1:MM=3>;$ZSm0'14f2Z;Knd1%MArOehj!.)buWlO8*,\*9o4+.)$HdE./D %I?Z]05'^3fV,1gShAct5KVj0Ig:oM\d>ZHOmG8flgFp(/]la\;b5ompEBbJoUU(@`>i19<*0TLe,0hjtZ4fRTh&n^=h"%t3_a<%5 %\F@Ueg+*Qrg+i(_@J+isN7QLu%33L-FrFbo(8ilF$_;!Hp"E)?b*/O*]qZZGS;uB8'VE&W-KjB0_.SWSW8JNbUSGmJS4uiBmFelh %,FY:E5X4OuUT]i=:D7\[j;sj`*EaGu9GTC2m/CDhrU[L]/2V)2+WF'EJ18T,bBC0GgR05V;*UKNF[aK$YWF"3f02=N?]*\.mEuVj %It.Fr?<%c0P@F7joR!E@`7_P'5J'HRPmt?u2#PJXV'-0PpWI*@&Ga1argfnEK9fH(%@prP\j_/eWp>G.]l)?.6iou3+B;4pOKkIR %;&\#-Te"h6k;P``8U!SKX'gHtEtFfY:j3ZA5rg8V(o25Tdo.@mRHn&=\^D"dP>=c@84=A(0e/QB$:\4RW*$@hL=(WFWF;S?Lg6.t %qe^U0]c&;Y&6J:.Cd1b'/aD\,8$n*5MtZBEl>4-a&oU.]Ld,%<@Rs5uUcU"5^/ad@ZCRtn)#7Q1,PY;u&Ku_CBMD*B%(]B=W`W&/ %K#/8B'BdQLDiS;j16s90N2t\7nN[?BctR.>=e(8hU!q;[ZT&JZ6`6J@-bI'#k8ZPM$p$tgi#Xn#g)5"\Cr+qKkd3/0jOo-sk0RgT %crlloae@2/TT`ppm[QYBSO(+-^NPtV\e:@0G@*^\ofX;?C[0U36ALCUnL3mg>EO"sf,$7t,p\T^ %9M0Vu@sUbAbXW[4Qj0(&;s(;K=iY`&$t7oiV5i2rNZ?VCTMeQ]edDYD=a[ElIGDi*V$07AT,LRA3_M7B$DJ;MhtA^fJjIU--F3X1 %]f`tsUW59_Q)%)'-pLF3k;RYD!+6C9V%H'__[M+A<:dHcR>#NkdL[t6=j'".&lI)ca\D9cY5LZ:Vkdhpb%#cj7[$Mg;bXeLJc0RN %H$A#WUj89N\4IAY'"b1$;EnM`V$it!+>!?Tju#U&WS`WF%.ubjc&WSp;r-% %c(gliVFUM=?moW`;5V-;+@f0MY)`gCQKD)m^[f=:jVsQOOjqRS(R43I

J9R22c^aY0]_)7P<+HCRIEOHf(0B1*V.:H#)2_5*$# %I&S0)9(]BT[JT_AE,s'tZkYl;'MdBM*>o2tGcl"'S/G+TqNPC^Fm_$=`_3]gL!<1DXUI9i*ZWPK+(fO2#7En*YX@5>_/`kYII14)TC>BkA1jr'phCsj"dRBR6Hf^;D(11q! %GeL5l3gCBlBr8+`J-\oQ;no,#KmL_LV(>RV7Wu:P-`QUZXWZ;+L_C3IS>is>*Krjk5]%KHJ,a'c/*T\oOB"*>b]lOEZ!;o %oSOO"gSQg?d`C$1g3p9:,4nQ!J/L/A;$PGl1/aaZ&"&IdSK0=-p%eIb)6'E;Soh;;7V^P(iA\aE<&.@FT*+RWkXBSKZ<'7[bU;5* %<9)RqCUg`2T+W=ZND!3p"rSTXi"q32+!p1&fa*4@W0do>n1h9&3bD:K3"8p55BrPp3"a(;q/^^PKeqo$gbfgAa0%O$.NG0!F\-qY %<&hmu?m*p?Y>dL<5@uJ5%a!$;DM2)VaM!iq5[oM]3an/,.X-rJQ$&rB'.CJ>d!u39Ff'2ATm7ZU[ut&Q]^+MX:14glW2&+8MJth# %#O4V[@t_g85WjknlAT/)>W?]Z;+<[P5+l\gC7HJ/98\GDhOiY7>]&t8]srGaF],?YR*=_[kP#/#n@Vm`o/0_fB57G.Mo+B5#./L6 %9+T@F!Tcr.$]I'^mTu#?q//:_/:MjkcGbs3Mf[[])j1J,BaRs'R=AtP-+c==-G(igDb3hbW&V\T-kY;DPsM1*UY(Rh74m1e1W+)B %f#k3I4!&L&&u_bSo]mQ^k7;K'7kF[qWAsarfOI %i`)/'SC`Y/f+#9UKun\J&W^lt`5qn/aT*^]e=Mn6@%$r:_H>2=W@"]2-0:LEQrIB>T%%/6hb$,qC8X[E$<(tKN&l6,/'/\%_Vo:V %%K`Q=<6X[KopI6QVsB&k]ni2@ol5-3N5k/J9hDhFJ75)ibnUeeV!(f4:d<8#P`Yc3Za-B)\EclnkdEUeHY:eFp;?6^9rF4K-\C!% %ZK[U>AiY)oSJo0]2OeUAbfAP#Ym#u3W,+L@\^()l&!fq&m"UUMZft.Sj?9g5Uta#PdM_OXS'7a.o!=-iTK5n-SPh)2H>Lp1flTiD %TgESAT%S4[^g0-j:?,Z7*OG!pEp9f6H-g@gV(%8^bCQt`P]H#aRaN@bl'.E2hU?hUCc\Ek@s")*B%&3.K=d`EWb9d0Fet^;Bf;GU %)e+TFVGkX6gBV26MP1Nup<'723^uu+J_rJW:=K=5(uufO\dMeu,L3.'')A3RFNQ?-LX)bql@@j8LWlVo8ftqcEY"U5VdqnoZsD*A %ACDt-K/.l`N@HmrLc=uG%X60p;c63+p%\.dVWf%MBCY1RCo[Ra!D5<]<_otSL'!(:C)pJ$le0X\bch/rPa&5lm=S2t.kuOFAE>X[,%<\i.:h#iE4iD:VKsTt,\Psh& %`#flebafh")TlHU48)DaD3]M;13\oHE^n?0G:I[CbagpE)iI&4 %/p!qVqe#3a."$4(Eu7.HmU/8BoK0t-UNP4a3GlSMRZ8#Ma4G#FIXXu)G8B/]Hb5us]g6hMQ3 %j)t5eafi^!UoGii25Bt8U:\o3.r7)?g\F6sWDPsZF"W3qeUmZ79KQcA<:c4!:egQ0:-%oc8)f`p(OCae&;FM7m7079HEhM7!@P79IJDKo>KaI[0ftL_m>T9PW!t@+R1L2:L>iQiCUVT%+Z7.aY$RiILX!ETN%rcWYIl1g6tO'a8jP. %MDWF,ERbok>GF'U[51bLk(h>0R'$p#_=2>[1m((fp/g8plI;6Q4.OF5?j61U0Ij3Z*Q&o1>t %.Y1>M>>2dRom>XSP*l$g'R@7%Sb(UF&#)2fG5%hDpol[po(d!Q"s6c<@o<>=B;qH-_T0P28n32"d;2n>Q\U3!D2u1/Z[I&4V%dCm %[^ujX&g_klR)C9@O.eDJ4*APZ:,,.8P/f&>]Tlj,)!6I%/]BCc'MV]segAe*CKu-&tr2NTJR^VAi@jdQY3+X8^V=E`S-$d;S,qR/1ra3 %9!i_YETV>YIQjA3ePI)qF2<\SkH-rFa@Y#P[c3eSJ-G5%h9@W*0;Q3.H@T^k-[8`,CI<0Wh`EFJps&"iM.Q/"U9>;\9T\ToFMPONst-WBQ[@.H-:NTth3qai=0 %DlT1BaCV35k,jrt>4J9+p#5(!D:"tW'&N;6KNlUJn1L?U.YG_kP2_2d6*Ick'VC5g'7diC9M[.G<+pJbW#bhAQf_AL\+DMEG-%(4 %7hq7`Nc7X\a]@dV9g;9u\6BY+(?ApGli`O1P?C=Vi"2-`0cBEkmT %gLVP"=WS2'0/dgYIuV)4fGVLD:Gq[R?V%.'@eO':D6R]SUR)pYpkO)[,b4C1lQ:aB2fN<0GH^[*4Ng1E5INda%-NQ5=tQ[/ %l!8950DXS;V(?;U8'U-uZX%o`Hd,#?9TRmI`^Z7SK@OlB2K7qedYsS-R=3M.9,4W;\qEcUZ7?#04.[qtZ822e#Y>"^=o[%V*IU>[ %OU#G,iFjj+/A@G7,76;,%&X0@C>X)?.`Y.7/mdOsGB`!FiENB3XW;lImDN""9EfB!VJ;889X[;!T/8eLjNse<=%=-F3]3joD]W %In,!od2YC\h9nP(T[=`E6WM?0?t-dCSjol]JLj']3IjT)Ct,ckNTXECK#?A$0Ub"PVJKeNdl6Y65X&[kCQi>`e%S9HZn&F&W[OK" %0AN^!q(.EWJD-fB/]stfOmOM1j\t;OLG$_^dGoue.E[FR5#_ROV\\AmYEj=PU3s!6/,(I7-_"#)I[6R_MBbH*%Aa8MFo?tR-rorp %l#%o'\pc`Z_X11O:Bb3DF*Dm2p1\Uop>-SC0^gqIs%(1OM-G:0g)ZG=1b!f2"q-e@Z`8canSZ+c@b\7GjeSW32cddO`\]eFbmk"VCXDIbG0=V:aXIrO@MBX]s'EYNr),EMf7i\7>At3:ql"5!mj`1Mb[YY+JU0 %Rm;+CAYnXW+u+BGQ-m0lg86L#.IC?kO+Xl]397JbO.`EZ\5"kUUX8sP11l_e%=mk@mY-1*QO6t^moeb.BTkh=/oh6F,TG#c:?lLC8j'!,)oDspmmpo8cJWQ1p;`#He[ %fWOOQ0^h:^g30[2IL:?2U+8Z$U[2"4:E6^R?.El6X>H.2)&SPJ:tJM7]K$M0Iuq6jg1I^[H@3?VlB]r[3rg-J=7t=M*hQS>>3Ya8 %mCIbD9(C$8P2E4E7pS@HWdYkSO/D4=mENZ[eb.BlEs*K;YHFL6?8AR-QWorDlMBo+leA,9T3sE2F:rLEJWp?Rb(iGlimTA(:"dEh'5IH[eZZZ5R:M_T-_pnA.NX&V/Y2,eST.7cuVL\YKP-GXGg'9Ucm+U:]qIp%MR-O6(L4i(P2Imk5m<8CY-FXG5l,Y,a=:-bO(f7uqgtFmZGF9/e#@q_ag)C>M#ZcLIu=G7?bQJS;Ch %h2.*rooI>lmIJ`cX::YU`8u(%qlWLCC@BEnld=e%*4jeXFikbLVj$k#^=n^QX(fIqo"OTVB%BUfe*UlMnf>.BR:ZqPrcIB!#''A='< %:4"4CGHoG6ol9CB6>G!7aC %i[9q[ZdC=r]AB",'V.4tM#-o-:tVZ.@N\]9rW9IrPudTV2.0XK?:$&ko*.V+eP]k70iT?1=)ZB@`4(WR$.e"&':'t9+#+b\@]ne^ %S>(r9\aR.(B^IAOLIok+:p*>h1@Xqq4S+$V]$+3LDjS1+,^!-[*8M%o0B\?&?7D.Tqhbejj%J4Vja/pI@<)/OIcmThY#MH4nMPT\ %+*Bprg724W(pp^-UQYX!0ZkB-mBjc^'9.VRZG@!\+Uq.Y2OW;_hF'n+r$_6pa8k%MI1e-hY@t@kXFF.qT6F\o\c!tjgr.K5P'^MQX>An %quYWoQN?WW7?Tp^6EE_6>S8GnBhDF#FUJ)CR(dpN:;614+4I$p+9Uh?J7gi3J1Bso*p#H(2!RU&W1Ri,?Q2f7.p)KngMQu\M8X!5 %&SdY[To8%m$u]@!r0HnAP65^Lk->hK5%RCo@*B\)%,bITQr8?;PIkaLM>Mp=97UA;Slb-(aB-$$ %W$"o#Z]WHDdZ)Fci]2o$Im$(qHn$gCd7@+;LK4brcpj^WuddR#@+mS`VaZ?[r %T&(AQU_Y?T[-g;>&f5D^gkg2VONmQgh4?e\ZYDgAmM.6NJ@-L9 %98oJS2^X:Q84_=J_a>ZlFF`dZ8<)CK*=a/>@DRV@W;(`Q#To[$Oap425@UsX#)f+)!dtkqT"V3d@>q"Y,'=KQ^H--2mM88=Yr<@n %+4iii@AL*ZKps6IjKkTtD/#C?*"baAI;::A%l77\M.V0It#s>]3sh#.c-!'mA8N+ %KFD[MC`DHEcZqrb3)=C0>Seh]kec.;\p7?08WP&l!L#BR+mm.]iuE;Jm*-3rG8W\H:gtD#Z4''rM\IIOk?!G+$k`GeK0AdhB.Bfd %En>tl&CP`t`Mq^hTgef,@42?+ft1=#H.i"Ba=E_//:>m-h-GVT!Ka:K'dH#Wg#oFcPoTEN7Z@=GQ(6s%5?T:FI!pX>XHErPs3FZd %;*578jZcloLOE#uTb")b$QS;AWoTh4,Gk;cX5pK<81E^B3&,m*NYt!4;1__`2kpKlT[B!P+/>7SD`P(UZ;m(#SIO_Xj`&ijrb#N(pG^R[Ci)mM6eQ(c>)c#Z_u>$;K]WQiDo+DY=dL5rLC:.CkY=q` %QX&K4;'&dY2lU]RSS4q_mQ44SP!\TK)iN2-992kcc66>sq*2W_k\#`Lg)0]]jqD?kpGYo1UL$H!\BJfI^5Mi9TiSQY"k=Zp^6)!j %pg&+q7DOT&<[(+JiQV&lP^C$hsili1ZL'KX:`C%W,rH9_(VT1\iFcHSrq//@ %ZLiag'@@3eR<0Z]<#BZc*S]+Y[L9;Pf:5]@,m::r.c#6!6XhJN#V2"a_,3D8]uUFHXQ]o;KKp-d$_Y\(/GJ.]jBoR*VHZ(B'qU7P %0'E0WGJpP,luFt>'EKjh2:#AOHU%^`D;`ABM1:+R\&$B[7d.I:irn:C$&`OOYcqOG@iI20j4LJ;O(7&m1qF#;9AL*\Hlp2N>MQ?I %fpkn!.EkF/!5IRDJc,U'5S+&a],hMC2E(u_pd]j:+k/Y<:4CDl\#%OtrP]GBRl,`>&(ffN+/LA&Wh+`TcLO<2Z;*hS%d(@aHm#q' %c[#FL&MKJ+Y$nA-*MdL&?*tbF!L$`P8G%-R*=!t%\hjqNXr,Q4=."d>=Z5$H%C$&_HQ^C9^$:0`5ia`,V"[KTUq%rYqpt(fnR'^S %(aZXG`rLA\e7Sai+"JHp5=L'mUOUQ+0&Zb9>U_H/T#7c@+EYhrj,?OAR'FiE)L=+ail`X:f]hG:=2A`FlW?h(G?:>/(:6R@odF*9[?I@SLe:\-ko9`2]6diQX;lYb)&KQ=pEa)aF;JD.Nl[9QUb3"ZdfTst?`I6KE6apOZ-6@W>b9O7"_S:0 %DtRe3ZNa^gGenOlk*1"=N4<3S>O5@9UsA(>.9if8jkWhD>Abn$h%4e7mFMD5%Tf9U/t15##pYC4bn+6]j.\Zb>RY&>)iT:X!o^MA %IFeAjZHpO6+54I8n'E%FP"ce[hqci!fQ>jXRTJWjd"&17D9Tr;GE$H"Q2m-1XsJHW'!i_IVbk,!Pe"(if'^r) %%\e;:\T:%I\lUcJ&0N1?G"%F)KmD]Efo7,,l96S#^/&/^AD:L3W]L0aIsW:++\X]ZAbSW?(@#1]*.GJ?^t7+SFWoVqSX+h/Amd:d %SP/)GPfuFPqZ=k#&:9_PjC,+FUTf'=P`&kiDOhMX(Ktl:7(<<@&X>\h`t(%k?bYe;r6kA#@(t_1cf"@b71QR8,h8b$.-H32K2p6I %MK6uFd>?BET;%k9,&:Z\r21t+]\1K-klA!t'*G>nc4NJo#JJiV^KJa/;s6qE6F(HMH;(@(qN;JcneO[sH/#hVk4t0LA:gX&p3B_&q#_5r&l_BT+?]7)CIs8e^/k!d.1( %LN2r\4;*T<2o5Z*2H2LGUkj7`ngk9dM?72&0K"A.D+-h2E%?0eqVIeSSgCHr*iAHpoNsGq31a&.JNA7`GJ*@W[]bYA*2bNrG]G$$PhqX=%HD_oguTE0LiBGXN1,(ksSq^.+)+M(j#RD4#2b5rp"'5QW@nGGo:> %_,rN2`f8@'BYjoD%7p^JnZWk5pe`;oV^qg4((>sQ=CW&O/f5!K-4KJinc"Y:oH+t?(k>LM.RE',#^coO,0U6:TNfnP(!#X:WA*p* %9E\kp"\k'qS+7?e"SG7u"LLq^aiOHn!K[(Dhp<(a&Zd0MZC%)RdDCH^E5OBF*_cuiJ.N(tKn]^u@>4tGiCO,d!R@A,'=^:%J9rPr %'VI+<)A,1A',60ag&j)C%:ae'^e(aqOoYaf$^SVj1$fG?!#cG-UA]%_U#'2,MI7)D@WAH\g<^4N(8]&nh\\&@6c2J6]sq>'t!HaTOTO5Q5'U#7VN!@R!&P^KV$*q&]?#p@#U+"3t#Rb!f$!6Y`pGkSf9eb-l,`p.Yaf@L$_2?'#XrE^`Z)+*>`ZG!lR>nRD*>Qm4Wo$ %No:!PnV#s0C^%ZA'E8IV")K\9C;oX,,T9@pLmV_FU;-n@(f4J<-qF[H$U,J*#&SdQ!b+pCn[=)_Y+iH/#nUNCGZGVFK:*phK*N)* %([[/p$Gp+]':>ds~> %AI9_PrivateDataEnd \ No newline at end of file diff --git a/doc/arm/isc-logo.pdf b/doc/arm/isc-logo.pdf index 71d3fdd..f6b9de5 100644 Binary files a/doc/arm/isc-logo.pdf and b/doc/arm/isc-logo.pdf differ diff --git a/doc/arm/man.dig.html b/doc/arm/man.dig.html index bf39f83..87701d1 100644 --- a/doc/arm/man.dig.html +++ b/doc/arm/man.dig.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.dnssec-dsfromkey.html b/doc/arm/man.dnssec-dsfromkey.html index be8c749..cdbc3ad 100644 --- a/doc/arm/man.dnssec-dsfromkey.html +++ b/doc/arm/man.dnssec-dsfromkey.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.dnssec-keyfromlabel.html b/doc/arm/man.dnssec-keyfromlabel.html index 849528e..1c250e9 100644 --- a/doc/arm/man.dnssec-keyfromlabel.html +++ b/doc/arm/man.dnssec-keyfromlabel.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.dnssec-keygen.html b/doc/arm/man.dnssec-keygen.html index 8c00bec..0e19917 100644 --- a/doc/arm/man.dnssec-keygen.html +++ b/doc/arm/man.dnssec-keygen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.dnssec-signzone.html b/doc/arm/man.dnssec-signzone.html index 5ecf0b8..a811df3 100644 --- a/doc/arm/man.dnssec-signzone.html +++ b/doc/arm/man.dnssec-signzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.host.html b/doc/arm/man.host.html index 7f9eeb9..26c019b 100644 --- a/doc/arm/man.host.html +++ b/doc/arm/man.host.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.named-checkconf.html b/doc/arm/man.named-checkconf.html index 9d4c0ed..1eef86e 100644 --- a/doc/arm/man.named-checkconf.html +++ b/doc/arm/man.named-checkconf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.named-checkzone.html b/doc/arm/man.named-checkzone.html index a44e59f..756d865 100644 --- a/doc/arm/man.named-checkzone.html +++ b/doc/arm/man.named-checkzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.named.html b/doc/arm/man.named.html index c3ba7fb..2e23b83 100644 --- a/doc/arm/man.named.html +++ b/doc/arm/man.named.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.nsupdate.html b/doc/arm/man.nsupdate.html index 9ba954b..6b05a4a 100644 --- a/doc/arm/man.nsupdate.html +++ b/doc/arm/man.nsupdate.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.rndc-confgen.html b/doc/arm/man.rndc-confgen.html index 853b250..13ec6d1 100644 --- a/doc/arm/man.rndc-confgen.html +++ b/doc/arm/man.rndc-confgen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.rndc.conf.html b/doc/arm/man.rndc.conf.html index 66dbe934..cefa45e 100644 --- a/doc/arm/man.rndc.conf.html +++ b/doc/arm/man.rndc.conf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/doc/arm/man.rndc.html b/doc/arm/man.rndc.html index 0bb3085..59e645b 100644 --- a/doc/arm/man.rndc.html +++ b/doc/arm/man.rndc.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 7056215..28121a7 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: adb.c,v 1.243.42.4 2009/02/03 22:34:28 jinmei Exp $ */ +/* $Id: adb.c,v 1.243.42.4.24.2 2010/08/12 23:46:24 tbox Exp $ */ /*! \file * @@ -118,7 +118,6 @@ struct dns_adb { isc_taskmgr_t *taskmgr; isc_task_t *task; - isc_boolean_t overmem; isc_interval_t tick_interval; int next_cleanbucket; @@ -294,8 +293,8 @@ static inline void inc_adb_irefcnt(dns_adb_t *); static inline void inc_adb_erefcnt(dns_adb_t *); static inline void inc_entry_refcnt(dns_adb_t *, dns_adbentry_t *, isc_boolean_t); -static inline isc_boolean_t dec_entry_refcnt(dns_adb_t *, dns_adbentry_t *, - isc_boolean_t); +static inline isc_boolean_t dec_entry_refcnt(dns_adb_t *, isc_boolean_t, + dns_adbentry_t *, isc_boolean_t); static inline void violate_locking_hierarchy(isc_mutex_t *, isc_mutex_t *); static isc_boolean_t clean_namehooks(dns_adb_t *, dns_adbnamehooklist_t *); static void clean_target(dns_adb_t *, dns_name_t *); @@ -777,7 +776,7 @@ link_entry(dns_adb_t *adb, int bucket, dns_adbentry_t *entry) { int i; dns_adbentry_t *e; - if (adb->overmem) { + if (isc_mem_isovermem(adb->mctx)) { for (i = 0; i < 2; i++) { e = ISC_LIST_TAIL(adb->entries[bucket]); if (e == NULL) @@ -943,6 +942,7 @@ clean_namehooks(dns_adb_t *adb, dns_adbnamehooklist_t *namehooks) { dns_adbnamehook_t *namehook; int addr_bucket; isc_boolean_t result = ISC_FALSE; + isc_boolean_t overmem = isc_mem_isovermem(adb->mctx); addr_bucket = DNS_ADB_INVALIDBUCKET; namehook = ISC_LIST_HEAD(*namehooks); @@ -963,7 +963,8 @@ clean_namehooks(dns_adb_t *adb, dns_adbnamehooklist_t *namehooks) { LOCK(&adb->entrylocks[addr_bucket]); } - result = dec_entry_refcnt(adb, entry, ISC_FALSE); + result = dec_entry_refcnt(adb, overmem, entry, + ISC_FALSE); } /* @@ -1235,7 +1236,9 @@ inc_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) { } static inline isc_boolean_t -dec_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) { +dec_entry_refcnt(dns_adb_t *adb, isc_boolean_t overmem, dns_adbentry_t *entry, + isc_boolean_t lock) +{ int bucket; isc_boolean_t destroy_entry; isc_boolean_t result = ISC_FALSE; @@ -1250,7 +1253,7 @@ dec_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) { destroy_entry = ISC_FALSE; if (entry->refcnt == 0 && - (adb->entry_sd[bucket] || entry->expires == 0 || adb->overmem || + (adb->entry_sd[bucket] || entry->expires == 0 || overmem || (entry->flags & ENTRY_IS_DEAD) != 0)) { destroy_entry = ISC_TRUE; result = unlink_entry(adb, entry); @@ -1852,7 +1855,7 @@ check_stale_name(dns_adb_t *adb, int bucket, isc_stdtime_t now) { int victims, max_victims; isc_boolean_t result; dns_adbname_t *victim, *next_victim; - isc_boolean_t overmem = adb->overmem; + isc_boolean_t overmem = isc_mem_isovermem(adb->mctx); int scans = 0; INSIST(bucket != DNS_ADB_INVALIDBUCKET); @@ -2049,7 +2052,6 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr, adb, NULL, NULL); adb->cevent_sent = ISC_FALSE; adb->shutting_down = ISC_FALSE; - adb->overmem = ISC_FALSE; ISC_LIST_INIT(adb->whenshutdown); isc_mem_attach(mem, &adb->mctx); @@ -2616,6 +2618,7 @@ dns_adb_destroyfind(dns_adbfind_t **findp) { dns_adbaddrinfo_t *ai; int bucket; dns_adb_t *adb; + isc_boolean_t overmem; REQUIRE(findp != NULL && DNS_ADBFIND_VALID(*findp)); find = *findp; @@ -2640,13 +2643,14 @@ dns_adb_destroyfind(dns_adbfind_t **findp) { * Return the find to the memory pool, and decrement the adb's * reference count. */ + overmem = isc_mem_isovermem(adb->mctx); ai = ISC_LIST_HEAD(find->list); while (ai != NULL) { ISC_LIST_UNLINK(find->list, ai, publink); entry = ai->entry; ai->entry = NULL; INSIST(DNS_ADBENTRY_VALID(entry)); - RUNTIME_CHECK(dec_entry_refcnt(adb, entry, ISC_TRUE) == + RUNTIME_CHECK(dec_entry_refcnt(adb, overmem, entry, ISC_TRUE) == ISC_FALSE); free_adbaddrinfo(adb, &ai); ai = ISC_LIST_HEAD(find->list); @@ -3509,6 +3513,7 @@ dns_adb_freeaddrinfo(dns_adb_t *adb, dns_adbaddrinfo_t **addrp) { int bucket; isc_stdtime_t now; isc_boolean_t want_check_exit = ISC_FALSE; + isc_boolean_t overmem; REQUIRE(DNS_ADB_VALID(adb)); REQUIRE(addrp != NULL); @@ -3520,13 +3525,14 @@ dns_adb_freeaddrinfo(dns_adb_t *adb, dns_adbaddrinfo_t **addrp) { isc_stdtime_get(&now); *addrp = NULL; + overmem = isc_mem_isovermem(adb->mctx); bucket = addr->entry->lock_bucket; LOCK(&adb->entrylocks[bucket]); entry->expires = now + ADB_ENTRY_WINDOW; - want_check_exit = dec_entry_refcnt(adb, entry, ISC_FALSE); + want_check_exit = dec_entry_refcnt(adb, overmem, entry, ISC_FALSE); UNLOCK(&adb->entrylocks[bucket]); @@ -3591,6 +3597,14 @@ dns_adb_flushname(dns_adb_t *adb, dns_name_t *name) { static void water(void *arg, int mark) { + /* + * We're going to change the way to handle overmem condition: use + * isc_mem_isovermem() instead of storing the state via this callback, + * since the latter way tends to cause race conditions. + * To minimize the change, and in case we re-enable the callback + * approach, however, keep this function at the moment. + */ + dns_adb_t *adb = arg; isc_boolean_t overmem = ISC_TF(mark == ISC_MEM_HIWATER); @@ -3598,17 +3612,6 @@ water(void *arg, int mark) { DP(ISC_LOG_DEBUG(1), "adb reached %s water mark", overmem ? "high" : "low"); - - /* - * We can't use adb->lock as there is potential for water - * to be called when adb->lock is held. - */ - LOCK(&adb->overmemlock); - if (adb->overmem != overmem) { - adb->overmem = overmem; - isc_mem_waterack(adb->mctx, mark); - } - UNLOCK(&adb->overmemlock); } void diff --git a/lib/dns/api b/lib/dns/api index e9df7db..b1adf784 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 56 -LIBREVISION = 1 -LIBAGE = 1 +LIBINTERFACE = 57 +LIBREVISION = 0 +LIBAGE = 2 diff --git a/lib/dns/include/dns/diff.h b/lib/dns/include/dns/diff.h index a13b678..32886c5 100644 --- a/lib/dns/include/dns/diff.h +++ b/lib/dns/include/dns/diff.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: diff.h,v 1.15.120.2 2009/01/18 23:47:41 tbox Exp $ */ +/* $Id: diff.h,v 1.15.120.2.24.2 2010/06/04 23:49:23 tbox Exp $ */ #ifndef DNS_DIFF_H #define DNS_DIFF_H 1 @@ -70,7 +70,7 @@ typedef enum { DNS_DIFFOP_DEL = 1, /*%< Delete an RR. */ DNS_DIFFOP_EXISTS = 2, /*%< Assert RR existence. */ DNS_DIFFOP_ADDRESIGN = 4, /*%< ADD + RESIGN. */ - DNS_DIFFOP_DELRESIGN = 5, /*%< DEL + RESIGN. */ + DNS_DIFFOP_DELRESIGN = 5 /*%< DEL + RESIGN. */ } dns_diffop_t; typedef struct dns_difftuple dns_difftuple_t; diff --git a/lib/dns/include/dns/ncache.h b/lib/dns/include/dns/ncache.h index 0677211..00f22a7 100644 --- a/lib/dns/include/dns/ncache.h +++ b/lib/dns/include/dns/ncache.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.h,v 1.25.48.2 2009/12/30 23:47:31 tbox Exp $ */ +/* $Id: ncache.h,v 1.25.48.2.10.2 2010/05/14 23:48:44 tbox Exp $ */ #ifndef DNS_NCACHE_H #define DNS_NCACHE_H 1 @@ -161,6 +161,13 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, * */ +isc_result_t +dns_ncache_getsigrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, + dns_rdatatype_t covers, dns_rdataset_t *rdataset); +/*%< + * Similar to dns_ncache_getrdataset() but get the rrsig that matches. + */ + void dns_ncache_current(dns_rdataset_t *ncacherdataset, dns_name_t *found, dns_rdataset_t *rdataset); diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h index d435ed0..8104b50 100644 --- a/lib/dns/include/dns/rdataset.h +++ b/lib/dns/include/dns/rdataset.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataset.h,v 1.65.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: rdataset.h,v 1.65.50.2.24.1 2010/03/03 22:06:39 marka Exp $ */ #ifndef DNS_RDATASET_H #define DNS_RDATASET_H 1 diff --git a/lib/dns/include/dns/resolver.h b/lib/dns/include/dns/resolver.h index 8c7ad72..537bf0f 100644 --- a/lib/dns/include/dns/resolver.h +++ b/lib/dns/include/dns/resolver.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.h,v 1.60.56.3.22.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: resolver.h,v 1.60.56.3.24.1 2010/03/03 22:06:39 marka Exp $ */ #ifndef DNS_RESOLVER_H #define DNS_RESOLVER_H 1 diff --git a/lib/dns/include/dns/result.h b/lib/dns/include/dns/result.h index a1e7f53..fae43e3 100644 --- a/lib/dns/include/dns/result.h +++ b/lib/dns/include/dns/result.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: result.h,v 1.116.226.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: result.h,v 1.116.228.1 2010/03/03 22:06:39 marka Exp $ */ #ifndef DNS_RESULT_H #define DNS_RESULT_H 1 diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h index 10ce229..3fe8378 100644 --- a/lib/dns/include/dns/types.h +++ b/lib/dns/include/dns/types.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: types.h,v 1.130.50.5 2009/12/30 08:34:30 jinmei Exp $ */ +/* $Id: types.h,v 1.130.50.5.10.2 2010/05/14 23:48:44 tbox Exp $ */ #ifndef DNS_TYPES_H #define DNS_TYPES_H 1 @@ -304,6 +304,7 @@ enum { #define DNS_TRUST_ADDITIONAL(x) ((x) == dns_trust_additional || \ (x) == dns_trust_pending_additional) #define DNS_TRUST_GLUE(x) ((x) == dns_trust_glue) +#define DNS_TRUST_ANSWER(x) ((x) == dns_trust_answer) /*% diff --git a/lib/dns/include/dns/validator.h b/lib/dns/include/dns/validator.h index 1da4e0c..1f9ec74 100644 --- a/lib/dns/include/dns/validator.h +++ b/lib/dns/include/dns/validator.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.h,v 1.41.48.3.22.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: validator.h,v 1.41.48.3.24.1 2010/03/03 22:06:39 marka Exp $ */ #ifndef DNS_VALIDATOR_H #define DNS_VALIDATOR_H 1 diff --git a/lib/dns/ncache.c b/lib/dns/ncache.c index 733d138..a194084 100644 --- a/lib/dns/ncache.c +++ b/lib/dns/ncache.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.c,v 1.43.334.2 2010/02/25 10:57:11 tbox Exp $ */ +/* $Id: ncache.c,v 1.43.336.5 2010/05/19 09:56:44 marka Exp $ */ /*! \file */ @@ -40,6 +40,7 @@ * * owner name * type + * trust * rdata count * rdata length These two occur 'rdata count' * rdata times. @@ -189,6 +190,8 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache, return (ISC_R_NOSPACE); isc_buffer_putuint16(&buffer, rdataset->type); + isc_buffer_putuint8(&buffer, + (unsigned char)rdataset->trust); /* * Copy the rdataset into the buffer. */ @@ -245,10 +248,9 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache, * Copy the type and a zero rdata count to the buffer. */ isc_buffer_availableregion(&buffer, &r); - if (r.length < 4) + if (r.length < 5) return (ISC_R_NOSPACE); - isc_buffer_putuint16(&buffer, 0); - isc_buffer_putuint16(&buffer, 0); + isc_buffer_putuint16(&buffer, 0); /* type */ /* * RFC2308, section 5, says that negative answers without * SOAs should not be cached. @@ -266,6 +268,9 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache, trust = dns_trust_authauthority; } else trust = dns_trust_additional; + isc_buffer_putuint8(&buffer, (unsigned char)trust); /* trust */ + isc_buffer_putuint16(&buffer, 0); /* count */ + /* * Now add it to the cache. */ @@ -335,8 +340,9 @@ dns_ncache_towire(dns_rdataset_t *rdataset, dns_compress_t *cctx, isc_buffer_forward(&source, name.length); remaining.length -= name.length; - INSIST(remaining.length >= 4); + INSIST(remaining.length >= 5); type = isc_buffer_getuint16(&source); + isc_buffer_forward(&source, 1); rcount = isc_buffer_getuint16(&source); for (i = 0; i < rcount; i++) { @@ -506,6 +512,13 @@ rdataset_count(dns_rdataset_t *rdataset) { return (count); } +static void +rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) { + unsigned char *raw = rdataset->private3; + + raw[-1] = (unsigned char)trust; +} + static dns_rdatasetmethods_t rdataset_methods = { rdataset_disassociate, rdataset_first, @@ -520,7 +533,7 @@ static dns_rdatasetmethods_t rdataset_methods = { NULL, NULL, NULL, - NULL, + rdataset_settrust, NULL }; @@ -534,6 +547,8 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, isc_buffer_t source; dns_name_t tname; dns_rdatatype_t ttype; + dns_trust_t trust = dns_trust_none; + dns_rdataset_t clone; REQUIRE(ncacherdataset != NULL); REQUIRE(ncacherdataset->type == 0); @@ -541,9 +556,11 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, REQUIRE(!dns_rdataset_isassociated(rdataset)); REQUIRE(type != dns_rdatatype_rrsig); - result = dns_rdataset_first(ncacherdataset); + dns_rdataset_init(&clone); + dns_rdataset_clone(ncacherdataset, &clone); + result = dns_rdataset_first(&clone); while (result == ISC_R_SUCCESS) { - dns_rdataset_current(ncacherdataset, &rdata); + dns_rdataset_current(&clone, &rdata); isc_buffer_init(&source, rdata.data, rdata.length); isc_buffer_add(&source, rdata.length); dns_name_init(&tname, NULL); @@ -553,16 +570,19 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, isc_buffer_forward(&source, tname.length); remaining.length -= tname.length; - INSIST(remaining.length >= 4); + INSIST(remaining.length >= 3); ttype = isc_buffer_getuint16(&source); if (ttype == type && dns_name_equal(&tname, name)) { + trust = isc_buffer_getuint8(&source); + INSIST(trust <= dns_trust_ultimate); isc_buffer_remainingregion(&source, &remaining); break; } - result = dns_rdataset_next(ncacherdataset); + result = dns_rdataset_next(&clone); dns_rdata_reset(&rdata); } + dns_rdataset_disassociate(&clone); if (result == ISC_R_NOMORE) return (ISC_R_NOTFOUND); if (result != ISC_R_SUCCESS) @@ -575,7 +595,108 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, rdataset->type = type; rdataset->covers = 0; rdataset->ttl = ncacherdataset->ttl; - rdataset->trust = ncacherdataset->trust; + rdataset->trust = trust; + rdataset->private1 = NULL; + rdataset->private2 = NULL; + + rdataset->private3 = remaining.base; + + /* + * Reset iterator state. + */ + rdataset->privateuint4 = 0; + rdataset->private5 = NULL; + rdataset->private6 = NULL; + return (ISC_R_SUCCESS); +} + +isc_result_t +dns_ncache_getsigrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name, + dns_rdatatype_t covers, dns_rdataset_t *rdataset) +{ + dns_name_t tname; + dns_rdata_rrsig_t rrsig; + dns_rdata_t rdata = DNS_RDATA_INIT; + dns_rdataset_t clone; + dns_rdatatype_t type; + dns_trust_t trust = dns_trust_none; + isc_buffer_t source; + isc_region_t remaining, sigregion; + isc_result_t result; + unsigned char *raw; + unsigned int count; + + REQUIRE(ncacherdataset != NULL); + REQUIRE(ncacherdataset->type == 0); + REQUIRE(name != NULL); + REQUIRE(!dns_rdataset_isassociated(rdataset)); + + dns_rdataset_init(&clone); + dns_rdataset_clone(ncacherdataset, &clone); + result = dns_rdataset_first(&clone); + while (result == ISC_R_SUCCESS) { + dns_rdataset_current(&clone, &rdata); + isc_buffer_init(&source, rdata.data, rdata.length); + isc_buffer_add(&source, rdata.length); + dns_name_init(&tname, NULL); + isc_buffer_remainingregion(&source, &remaining); + dns_name_fromregion(&tname, &remaining); + INSIST(remaining.length >= tname.length); + isc_buffer_forward(&source, tname.length); + remaining.length -= tname.length; + remaining.base += tname.length; + + INSIST(remaining.length >= 2); + type = isc_buffer_getuint16(&source); + remaining.length -= 2; + remaining.base += 2; + + if (type != dns_rdatatype_rrsig || + !dns_name_equal(&tname, name)) { + result = dns_rdataset_next(&clone); + dns_rdata_reset(&rdata); + continue; + } + + INSIST(remaining.length >= 1); + trust = isc_buffer_getuint8(&source); + INSIST(trust <= dns_trust_ultimate); + remaining.length -= 1; + remaining.base += 1; + + raw = remaining.base; + count = raw[0] * 256 + raw[1]; + INSIST(count > 0); + raw += 2; + sigregion.length = raw[0] * 256 + raw[1]; + raw += 2; + sigregion.base = raw; + dns_rdata_reset(&rdata); + dns_rdata_fromregion(&rdata, rdataset->rdclass, + dns_rdatatype_rrsig, &sigregion); + (void)dns_rdata_tostruct(&rdata, &rrsig, NULL); + if (rrsig.covered == covers) { + isc_buffer_remainingregion(&source, &remaining); + break; + } + + result = dns_rdataset_next(&clone); + dns_rdata_reset(&rdata); + } + dns_rdataset_disassociate(&clone); + if (result == ISC_R_NOMORE) + return (ISC_R_NOTFOUND); + if (result != ISC_R_SUCCESS) + return (result); + + INSIST(remaining.length != 0); + + rdataset->methods = &rdataset_methods; + rdataset->rdclass = ncacherdataset->rdclass; + rdataset->type = dns_rdatatype_rrsig; + rdataset->covers = covers; + rdataset->ttl = ncacherdataset->ttl; + rdataset->trust = trust; rdataset->private1 = NULL; rdataset->private2 = NULL; @@ -595,6 +716,7 @@ dns_ncache_current(dns_rdataset_t *ncacherdataset, dns_name_t *found, dns_rdataset_t *rdataset) { dns_rdata_t rdata = DNS_RDATA_INIT; + dns_trust_t trust; isc_region_t remaining, sigregion; isc_buffer_t source; dns_name_t tname; @@ -619,8 +741,10 @@ dns_ncache_current(dns_rdataset_t *ncacherdataset, dns_name_t *found, isc_buffer_forward(&source, found->length); remaining.length -= found->length; - INSIST(remaining.length >= 4); + INSIST(remaining.length >= 5); type = isc_buffer_getuint16(&source); + trust = isc_buffer_getuint8(&source); + INSIST(trust <= dns_trust_ultimate); isc_buffer_remainingregion(&source, &remaining); rdataset->methods = &rdataset_methods; @@ -645,7 +769,7 @@ dns_ncache_current(dns_rdataset_t *ncacherdataset, dns_name_t *found, } else rdataset->covers = 0; rdataset->ttl = ncacherdataset->ttl; - rdataset->trust = ncacherdataset->trust; + rdataset->trust = trust; rdataset->private1 = NULL; rdataset->private2 = NULL; diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index df3a5f4..538c228 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.16.8.3 2010/02/26 00:24:39 marka Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.16.10.3 2010/08/13 07:25:21 marka Exp $ */ /*! \file */ @@ -411,7 +411,6 @@ typedef struct { rbtdb_version_t * current_version; rbtdb_version_t * future_version; rbtdb_versionlist_t open_versions; - isc_boolean_t overmem; isc_task_t * task; dns_dbnode_t *soanode; dns_dbnode_t *nsnode; @@ -3209,6 +3208,9 @@ matchparams(rdatasetheader_t *header, rbtdb_search_t *search) return (ISC_FALSE); } +/* + * Find node of the NSEC/NSEC3 record that is 'name'. + */ static inline isc_result_t find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset, @@ -4928,7 +4930,7 @@ expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { if (now == 0) isc_stdtime_get(&now); - if (rbtdb->overmem) { + if (isc_mem_isovermem(rbtdb->common.mctx)) { isc_uint32_t val; isc_random_get(&val); @@ -4938,8 +4940,8 @@ expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { force_expire = ISC_TF(rbtnode->down == NULL && val % 4 == 0); /* - * Note that 'log' can be true IFF rbtdb->overmem is also true. - * rbtdb->overmem can currently only be true for cache + * Note that 'log' can be true IFF overmem is also true. + * overmem can currently only be true for cache * databases -- hence all of the "overmem cache" log strings. */ log = ISC_TF(isc_log_wouldlog(dns_lctx, level)); @@ -4984,7 +4986,7 @@ expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { "reprieve by RETAIN() %s", printname); } - } else if (rbtdb->overmem && log) + } else if (isc_mem_isovermem(rbtdb->common.mctx) && log) isc_log_write(dns_lctx, category, module, level, "overmem cache: saved %s", printname); @@ -4996,10 +4998,12 @@ expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { static void overmem(dns_db_t *db, isc_boolean_t overmem) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + /* This is an empty callback. See adb.c:water() */ - if (IS_CACHE(rbtdb)) - rbtdb->overmem = overmem; + UNUSED(db); + UNUSED(overmem); + + return; } static void @@ -5943,6 +5947,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, isc_result_t result; isc_boolean_t delegating; isc_boolean_t tree_locked = ISC_FALSE; + isc_boolean_t cache_is_overmem = ISC_FALSE; REQUIRE(VALID_RBTDB(rbtdb)); @@ -6030,12 +6035,14 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, * the lock does not necessarily have to be acquired but it will help * purge stale entries more effectively. */ - if (delegating || (IS_CACHE(rbtdb) && rbtdb->overmem)) { + if (IS_CACHE(rbtdb) && isc_mem_isovermem(rbtdb->common.mctx)) + cache_is_overmem = ISC_TRUE; + if (delegating || cache_is_overmem) { tree_locked = ISC_TRUE; RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); } - if (IS_CACHE(rbtdb) && rbtdb->overmem) + if (cache_is_overmem) overmem_purge(rbtdb, rbtnode->locknum, now, tree_locked); NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, @@ -7098,7 +7105,6 @@ dns_rbtdb_create return (result); } rbtdb->attributes = 0; - rbtdb->overmem = ISC_FALSE; rbtdb->task = NULL; /* diff --git a/lib/dns/rdatalist.c b/lib/dns/rdatalist.c index d072619..97cef94 100644 --- a/lib/dns/rdatalist.c +++ b/lib/dns/rdatalist.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdatalist.c,v 1.36.336.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: rdatalist.c,v 1.36.338.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index 946ec9a..4361913 100644 --- a/lib/dns/rdataset.c +++ b/lib/dns/rdataset.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataset.c,v 1.82.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: rdataset.c,v 1.82.50.2.24.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/dns/rdataslab.c b/lib/dns/rdataslab.c index 4eadff9..8d12eb8 100644 --- a/lib/dns/rdataslab.c +++ b/lib/dns/rdataslab.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataslab.c,v 1.48.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: rdataslab.c,v 1.48.50.2.24.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 244718f..8803a05 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.384.14.20.8.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: resolver.c,v 1.384.14.20.10.3 2010/06/23 23:46:25 tbox Exp $ */ /*! \file */ @@ -5815,13 +5815,40 @@ answer_response(fetchctx_t *fctx) { return (result); } +static isc_boolean_t +fctx_decreference(fetchctx_t *fctx) { + isc_boolean_t bucket_empty = ISC_FALSE; + + INSIST(fctx->references > 0); + fctx->references--; + if (fctx->references == 0) { + /* + * No one cares about the result of this fetch anymore. + */ + if (fctx->pending == 0 && fctx->nqueries == 0 && + ISC_LIST_EMPTY(fctx->validators) && SHUTTINGDOWN(fctx)) { + /* + * This fctx is already shutdown; we were just + * waiting for the last reference to go away. + */ + bucket_empty = fctx_destroy(fctx); + } else { + /* + * Initiate shutdown. + */ + fctx_shutdown(fctx); + } + } + return (bucket_empty); +} + static void resume_dslookup(isc_task_t *task, isc_event_t *event) { dns_fetchevent_t *fevent; dns_resolver_t *res; fetchctx_t *fctx; isc_result_t result; - isc_boolean_t bucket_empty = ISC_FALSE; + isc_boolean_t bucket_empty; isc_boolean_t locked = ISC_FALSE; unsigned int bucketnum; dns_rdataset_t nameservers; @@ -5925,9 +5952,7 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) { isc_event_free(&event); if (!locked) LOCK(&res->buckets[bucketnum].lock); - fctx->references--; - if (fctx->references == 0) - bucket_empty = fctx_destroy(fctx); + bucket_empty = fctx_decreference(fctx); UNLOCK(&res->buckets[bucketnum].lock); if (bucket_empty) empty_bucket(res); @@ -6752,12 +6777,14 @@ resquery_response(isc_task_t *task, isc_event_t *event) { &fctx->nsfetch); if (result != ISC_R_SUCCESS) fctx_done(fctx, result, __LINE__); - LOCK(&fctx->res->buckets[fctx->bucketnum].lock); - fctx->references++; - UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock); - result = fctx_stopidletimer(fctx); - if (result != ISC_R_SUCCESS) - fctx_done(fctx, result, __LINE__); + else { + LOCK(&fctx->res->buckets[fctx->bucketnum].lock); + fctx->references++; + UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock); + result = fctx_stopidletimer(fctx); + if (result != ISC_R_SUCCESS) + fctx_done(fctx, result, __LINE__); + } } else { /* * We're done. @@ -7602,7 +7629,7 @@ dns_resolver_destroyfetch(dns_fetch_t **fetchp) { dns_fetchevent_t *event, *next_event; fetchctx_t *fctx; unsigned int bucketnum; - isc_boolean_t bucket_empty = ISC_FALSE; + isc_boolean_t bucket_empty; REQUIRE(fetchp != NULL); fetch = *fetchp; @@ -7630,27 +7657,7 @@ dns_resolver_destroyfetch(dns_fetch_t **fetchp) { } } - INSIST(fctx->references > 0); - fctx->references--; - if (fctx->references == 0) { - /* - * No one cares about the result of this fetch anymore. - */ - if (fctx->pending == 0 && fctx->nqueries == 0 && - ISC_LIST_EMPTY(fctx->validators) && - SHUTTINGDOWN(fctx)) { - /* - * This fctx is already shutdown; we were just - * waiting for the last reference to go away. - */ - bucket_empty = fctx_destroy(fctx); - } else { - /* - * Initiate shutdown. - */ - fctx_shutdown(fctx); - } - } + bucket_empty = fctx_decreference(fctx); UNLOCK(&res->buckets[bucketnum].lock); diff --git a/lib/dns/result.c b/lib/dns/result.c index e336197..f241ded 100644 --- a/lib/dns/result.c +++ b/lib/dns/result.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: result.c,v 1.125.122.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: result.c,v 1.125.124.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c index e0c8786..6ec6209 100644 --- a/lib/dns/sdb.c +++ b/lib/dns/sdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.c,v 1.66.48.3.8.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: sdb.c,v 1.66.48.3.10.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/dns/sdlz.c b/lib/dns/sdlz.c index caf71b5..f2f7786 100644 --- a/lib/dns/sdlz.c +++ b/lib/dns/sdlz.c @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdlz.c,v 1.18.50.3.8.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: sdlz.c,v 1.18.50.3.10.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 7144ae2..90c18bc 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.11.8.3 2010/04/21 04:29:01 marka Exp $ */ +/* $Id: validator.c,v 1.164.12.11.10.6 2010/09/03 02:55:18 marka Exp $ */ #include @@ -120,6 +120,11 @@ #define NEEDNOQNAME(val) ((val->attributes & VALATTR_NEEDNOQNAME) != 0) #define NEEDNOWILDCARD(val) ((val->attributes & VALATTR_NEEDNOWILDCARD) != 0) #define DLVTRIED(val) ((val->attributes & VALATTR_DLVTRIED) != 0) +#define FOUNDNODATA(val) ((val->attributes & VALATTR_FOUNDNODATA) != 0) +#define FOUNDNOQNAME(val) ((val->attributes & VALATTR_FOUNDNOQNAME) != 0) +#define FOUNDNOWILDCARD(val) ((val->attributes & VALATTR_FOUNDNOWILDCARD) != 0) +#define FOUNDCLOSEST(val) ((val->attributes & VALATTR_FOUNDCLOSEST) != 0) +#define FOUNDOPTOUT(val) ((val->attributes & VALATTR_FOUNDOPTOUT) != 0) #define SHUTDOWN(v) (((v)->attributes & VALATTR_SHUTDOWN) != 0) #define CANCELED(v) (((v)->attributes & VALATTR_CANCELED) != 0) @@ -174,8 +179,8 @@ startfinddlvsep(dns_validator_t *val, dns_name_t *unsecure); * Mark the RRsets as a answer. */ static inline void -markanswer(dns_validator_t *val) { - validator_log(val, ISC_LOG_DEBUG(3), "marking as answer"); +markanswer(dns_validator_t *val, const char *where) { + validator_log(val, ISC_LOG_DEBUG(3), "marking as answer (%s)", where); if (val->event->rdataset != NULL) dns_rdataset_settrust(val->event->rdataset, dns_trust_answer); if (val->event->sigrdataset != NULL) @@ -186,7 +191,8 @@ markanswer(dns_validator_t *val) { static inline void marksecure(dns_validatorevent_t *event) { dns_rdataset_settrust(event->rdataset, dns_trust_secure); - dns_rdataset_settrust(event->sigrdataset, dns_trust_secure); + if (event->sigrdataset != NULL) + dns_rdataset_settrust(event->sigrdataset, dns_trust_secure); } static void @@ -563,7 +569,7 @@ dsfetched2(isc_task_t *task, isc_event_t *event) { "must be secure failure"); validator_done(val, DNS_R_MUSTBESECURE); } else if (val->view->dlv == NULL || DLVTRIED(val)) { - markanswer(val); + markanswer(val, "dsfetched2"); validator_done(val, ISC_R_SUCCESS); } else { result = startfinddlvsep(val, tname); @@ -689,11 +695,32 @@ dsvalidated(isc_task_t *task, isc_event_t *event) { if (CANCELED(val)) { validator_done(val, ISC_R_CANCELED); } else if (eresult == ISC_R_SUCCESS) { + isc_boolean_t have_dsset; + dns_name_t *name; validator_log(val, ISC_LOG_DEBUG(3), - "dsset with trust %d", val->frdataset.trust); - if ((val->attributes & VALATTR_INSECURITY) != 0) - result = proveunsecure(val, ISC_TRUE, ISC_TRUE); - else + "%s with trust %d", + val->frdataset.type == dns_rdatatype_ds ? + "dsset" : "ds non-existance", + val->frdataset.trust); + have_dsset = ISC_TF(val->frdataset.type == dns_rdatatype_ds); + name = dns_fixedname_name(&val->fname); + if ((val->attributes & VALATTR_INSECURITY) != 0 && + val->frdataset.covers == dns_rdatatype_ds && + val->frdataset.type == 0 && + isdelegation(name, &val->frdataset, DNS_R_NCACHENXRRSET)) { + if (val->mustbesecure) { + validator_log(val, ISC_LOG_WARNING, + "must be secure failure, no DS " + "and this is a delegation"); + result = DNS_R_MUSTBESECURE; + } else if (val->view->dlv == NULL || DLVTRIED(val)) { + markanswer(val, "dsvalidated"); + result = ISC_R_SUCCESS;; + } else + result = startfinddlvsep(val, name); + } else if ((val->attributes & VALATTR_INSECURITY) != 0) { + result = proveunsecure(val, have_dsset, ISC_TRUE); + } else result = validatezonekey(val); if (result != DNS_R_WAIT) validator_done(val, result); @@ -1138,29 +1165,7 @@ nsec3noexistnodata(dns_validator_t *val, dns_name_t* name, dns_name_copy(qname, nearest, NULL); *setnearest = ISC_TRUE; } -#if 0 - /* - * The closest encloser may be the zone name. - */ - if (closest != NULL && - dns_name_countlabels(closest) == 0 && - !dns_nsec3_typepresent(&rdata, dns_rdatatype_ds) && - !dns_nsec3_typepresent(&rdata, dns_rdatatype_dname) && - (dns_nsec3_typepresent(&rdata, dns_rdatatype_soa) || - !dns_nsec3_typepresent(&rdata, dns_rdatatype_ns))) - { - char namebuf[DNS_NAME_FORMATSIZE]; - dns_name_format(zone, namebuf, - sizeof(namebuf)); - validator_log(val, ISC_LOG_DEBUG(3), - "NSEC3 potential closest " - "encloser from zone name: '%s'", - namebuf); - dns_name_copy(zone, closest, NULL); - *setclosest = ISC_TRUE; - } -#endif *exists = ISC_FALSE; *data = ISC_FALSE; if (optout != NULL) { @@ -1236,10 +1241,8 @@ authvalidated(isc_task_t *task, isc_event_t *event) { if (rdataset->type == dns_rdatatype_nsec && rdataset->trust == dns_trust_secure && - ((val->attributes & VALATTR_NEEDNODATA) != 0 || - (val->attributes & VALATTR_NEEDNOQNAME) != 0) && - (val->attributes & VALATTR_FOUNDNODATA) == 0 && - (val->attributes & VALATTR_FOUNDNOQNAME) == 0 && + (NEEDNODATA(val) || NEEDNOQNAME(val)) && + !FOUNDNODATA(val) && !FOUNDNOQNAME(val) && nsecnoexistnodata(val, val->event->name, devent->name, rdataset, &exists, &data, wild) == ISC_R_SUCCESS) @@ -1643,11 +1646,14 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { * We have an rrset for the given keyname. */ val->keyset = &val->frdataset; - if (DNS_TRUST_PENDING(val->frdataset.trust) && + if ((DNS_TRUST_PENDING(val->frdataset.trust) || + DNS_TRUST_ANSWER(val->frdataset.trust)) && dns_rdataset_isassociated(&val->fsigrdataset)) { /* - * We know the key but haven't validated it yet. + * We know the key but haven't validated it yet or + * we have a key of trust answer but a DS/DLV + * record for the zone may have been added. */ result = create_validator(val, &siginfo->signer, dns_rdatatype_dnskey, @@ -1890,7 +1896,7 @@ validate(dns_validator_t *val, isc_boolean_t resume) { "must be secure failure"); return (DNS_R_MUSTBESECURE); } - markanswer(val); + markanswer(val, "validate"); return (ISC_R_SUCCESS); } @@ -1947,7 +1953,7 @@ validate(dns_validator_t *val, isc_boolean_t resume) { } } val->key = NULL; - if ((val->attributes & VALATTR_NEEDNOQNAME) != 0) { + if (NEEDNOQNAME(val)) { if (val->event->message == NULL) { validator_log(val, ISC_LOG_DEBUG(3), "no message available for noqname proof"); @@ -2144,7 +2150,7 @@ dlv_validatezonekey(dns_validator_t *val) { } validator_log(val, ISC_LOG_DEBUG(3), "no supported algorithm/digest (dlv)"); - markanswer(val); + markanswer(val, "dlv_validatezonekey (2)"); return (ISC_R_SUCCESS); } else return (DNS_R_NOVALIDSIG); @@ -2197,8 +2203,12 @@ validatezonekey(dns_validator_t *val) { result == ISC_R_SUCCESS; result = dns_rdataset_next(val->event->sigrdataset)) { - dns_keynode_t *keynode = NULL, *nextnode = NULL; + dns_keynode_t *keynode = NULL; + dns_fixedname_t fixed; + dns_name_t *found; + dns_fixedname_init(&fixed); + found = dns_fixedname_name(&fixed); dns_rdata_reset(&sigrdata); dns_rdataset_current(val->event->sigrdataset, &sigrdata); @@ -2213,10 +2223,28 @@ validatezonekey(dns_validator_t *val) { sig.algorithm, sig.keyid, &keynode); + if (result == ISC_R_NOTFOUND && + dns_keytable_finddeepestmatch(val->keytable, + val->event->name, found) != ISC_R_SUCCESS) { + if (val->mustbesecure) { + validator_log(val, ISC_LOG_WARNING, + "must be secure failure, " + "not beneath secure root"); + return (DNS_R_MUSTBESECURE); + } else + validator_log(val, ISC_LOG_DEBUG(3), + "not beneath secure root"); + if (val->view->dlv == NULL || DLVTRIED(val)) { + markanswer(val, "validatezonekey (1)"); + return (ISC_R_SUCCESS); + } + return (startfinddlvsep(val, dns_rootname)); + } if (result == DNS_R_PARTIALMATCH || result == ISC_R_SUCCESS) atsep = ISC_TRUE; while (result == ISC_R_SUCCESS) { + dns_keynode_t *nextnode = NULL; dstkey = dns_keynode_key(keynode); result = verify(val, dstkey, &sigrdata, sig.keyid); @@ -2281,7 +2309,8 @@ validatezonekey(dns_validator_t *val) { * We have DS records. */ val->dsset = &val->frdataset; - if (DNS_TRUST_PENDING(val->frdataset.trust) && + if ((DNS_TRUST_PENDING(val->frdataset.trust) || + DNS_TRUST_ANSWER(val->frdataset.trust)) && dns_rdataset_isassociated(&val->fsigrdataset)) { result = create_validator(val, @@ -2344,7 +2373,7 @@ validatezonekey(dns_validator_t *val) { "must be secure failure"); return (DNS_R_MUSTBESECURE); } - markanswer(val); + markanswer(val, "validatezonekey (2)"); return (ISC_R_SUCCESS); } @@ -2490,7 +2519,7 @@ validatezonekey(dns_validator_t *val) { } validator_log(val, ISC_LOG_DEBUG(3), "no supported algorithm/digest (DS)"); - markanswer(val); + markanswer(val, "validatezonekey (3)"); return (ISC_R_SUCCESS); } else return (DNS_R_NOVALIDSIG); @@ -2517,6 +2546,80 @@ start_positive_validation(dns_validator_t *val) { } /*% + * val_rdataset_first and val_rdataset_next provide iteration methods + * that hide whether we are iterating across a message or a negative + * cache rdataset. + */ +static isc_result_t +val_rdataset_first(dns_validator_t *val, dns_name_t **namep, + dns_rdataset_t **rdatasetp) +{ + dns_message_t *message = val->event->message; + isc_result_t result; + + REQUIRE(rdatasetp != NULL); + REQUIRE(namep != NULL); + if (message == NULL) { + REQUIRE(*rdatasetp != NULL); + REQUIRE(*namep != NULL); + } else { + REQUIRE(*rdatasetp == NULL); + REQUIRE(*namep == NULL); + } + + if (message != NULL) { + result = dns_message_firstname(message, DNS_SECTION_AUTHORITY); + if (result != ISC_R_SUCCESS) + return (result); + dns_message_currentname(message, DNS_SECTION_AUTHORITY, namep); + *rdatasetp = ISC_LIST_HEAD((*namep)->list); + INSIST(*rdatasetp != NULL); + } else { + result = dns_rdataset_first(val->event->rdataset); + if (result == ISC_R_SUCCESS) + dns_ncache_current(val->event->rdataset, *namep, + *rdatasetp); + } + return (result); +} + +static isc_result_t +val_rdataset_next(dns_validator_t *val, dns_name_t **namep, + dns_rdataset_t **rdatasetp) +{ + dns_message_t *message = val->event->message; + isc_result_t result = ISC_R_SUCCESS; + + REQUIRE(rdatasetp != NULL && *rdatasetp != NULL); + REQUIRE(namep != NULL && *namep != NULL); + + if (message != NULL) { + dns_rdataset_t *rdataset = *rdatasetp; + rdataset = ISC_LIST_NEXT(rdataset, link); + if (rdataset == NULL) { + *namep = NULL; + result = dns_message_nextname(message, + DNS_SECTION_AUTHORITY); + if (result == ISC_R_SUCCESS) { + dns_message_currentname(message, + DNS_SECTION_AUTHORITY, + namep); + rdataset = ISC_LIST_HEAD((*namep)->list); + INSIST(rdataset != NULL); + } + } + *rdatasetp = rdataset; + } else { + dns_rdataset_disassociate(*rdatasetp); + result = dns_rdataset_next(val->event->rdataset); + if (result == ISC_R_SUCCESS) + dns_ncache_current(val->event->rdataset, *namep, + *rdatasetp); + } + return (result); +} + +/*% * Look for NODATA at the wildcard and NOWILDCARD proofs in the * previously validated NSEC records. As these proofs are mutually * exclusive we stop when one is found. @@ -2527,12 +2630,14 @@ start_positive_validation(dns_validator_t *val) { static isc_result_t checkwildcard(dns_validator_t *val, dns_rdatatype_t type, dns_name_t *zonename) { - dns_name_t *name, *wild; - dns_message_t *message = val->event->message; + dns_name_t *name, *wild, tname; isc_result_t result; isc_boolean_t exists, data; char namebuf[DNS_NAME_FORMATSIZE]; + dns_rdataset_t *rdataset, trdataset; + dns_name_init(&tname, NULL); + dns_rdataset_init(&trdataset); wild = dns_fixedname_name(&val->wild); if (dns_name_countlabels(wild) == 0) { @@ -2544,103 +2649,91 @@ checkwildcard(dns_validator_t *val, dns_rdatatype_t type, dns_name_t *zonename) dns_name_format(wild, namebuf, sizeof(namebuf)); validator_log(val, ISC_LOG_DEBUG(3), "in checkwildcard: %s", namebuf); - for (result = dns_message_firstname(message, DNS_SECTION_AUTHORITY); + if (val->event->message == NULL) { + name = &tname; + rdataset = &trdataset; + } else { + name = NULL; + rdataset = NULL; + } + + for (result = val_rdataset_first(val, &name, &rdataset); result == ISC_R_SUCCESS; - result = dns_message_nextname(message, DNS_SECTION_AUTHORITY)) + result = val_rdataset_next(val, &name, &rdataset)) { - dns_rdataset_t *rdataset = NULL, *sigrdataset = NULL; - - name = NULL; - dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name); + if (rdataset->type != type || + rdataset->trust != dns_trust_secure) + continue; - for (rdataset = ISC_LIST_HEAD(name->list); - rdataset != NULL; - rdataset = ISC_LIST_NEXT(rdataset, link)) + if (rdataset->type == dns_rdatatype_nsec && + (NEEDNODATA(val) || NEEDNOWILDCARD(val)) && + !FOUNDNODATA(val) && !FOUNDNOWILDCARD(val) && + nsecnoexistnodata(val, wild, name, rdataset, + &exists, &data, NULL) + == ISC_R_SUCCESS) { - if (rdataset->type != type) - continue; - - for (sigrdataset = ISC_LIST_HEAD(name->list); - sigrdataset != NULL; - sigrdataset = ISC_LIST_NEXT(sigrdataset, link)) - { - if (sigrdataset->type == dns_rdatatype_rrsig && - sigrdataset->covers == rdataset->type) - break; - } - if (sigrdataset == NULL) - continue; - - if (rdataset->trust != dns_trust_secure) - continue; - - if (rdataset->type == dns_rdatatype_nsec && - ((val->attributes & VALATTR_NEEDNODATA) != 0 || - (val->attributes & VALATTR_NEEDNOWILDCARD) != 0) && - (val->attributes & VALATTR_FOUNDNODATA) == 0 && - (val->attributes & VALATTR_FOUNDNOWILDCARD) == 0 && - nsecnoexistnodata(val, wild, name, rdataset, - &exists, &data, NULL) - == ISC_R_SUCCESS) - { - dns_name_t **proofs = val->event->proofs; - if (exists && !data) - val->attributes |= VALATTR_FOUNDNODATA; - if (exists && !data && NEEDNODATA(val)) - proofs[DNS_VALIDATOR_NODATAPROOF] = - name; - if (!exists) - val->attributes |= - VALATTR_FOUNDNOWILDCARD; - if (!exists && NEEDNOQNAME(val)) - proofs[DNS_VALIDATOR_NOWILDCARDPROOF] = - name; - return (ISC_R_SUCCESS); - } + dns_name_t **proofs = val->event->proofs; + if (exists && !data) + val->attributes |= VALATTR_FOUNDNODATA; + if (exists && !data && NEEDNODATA(val)) + proofs[DNS_VALIDATOR_NODATAPROOF] = + name; + if (!exists) + val->attributes |= + VALATTR_FOUNDNOWILDCARD; + if (!exists && NEEDNOQNAME(val)) + proofs[DNS_VALIDATOR_NOWILDCARDPROOF] = + name; + if (dns_rdataset_isassociated(&trdataset)) + dns_rdataset_disassociate(&trdataset); + return (ISC_R_SUCCESS); + } - if (rdataset->type == dns_rdatatype_nsec3 && - ((val->attributes & VALATTR_NEEDNODATA) != 0 || - (val->attributes & VALATTR_NEEDNOWILDCARD) != 0) && - (val->attributes & VALATTR_FOUNDNODATA) == 0 && - (val->attributes & VALATTR_FOUNDNOWILDCARD) == 0 && - nsec3noexistnodata(val, wild, name, rdataset, - zonename, &exists, &data, - NULL, NULL, NULL, NULL, NULL, - NULL) == ISC_R_SUCCESS) - { - dns_name_t **proofs = val->event->proofs; - if (exists && !data) - val->attributes |= VALATTR_FOUNDNODATA; - if (exists && !data && NEEDNODATA(val)) - proofs[DNS_VALIDATOR_NODATAPROOF] = - name; - if (!exists) - val->attributes |= - VALATTR_FOUNDNOWILDCARD; - if (!exists && NEEDNOQNAME(val)) - proofs[DNS_VALIDATOR_NOWILDCARDPROOF] = - name; - return (ISC_R_SUCCESS); - } + if (rdataset->type == dns_rdatatype_nsec3 && + (NEEDNODATA(val) || NEEDNOWILDCARD(val)) && + !FOUNDNODATA(val) && !FOUNDNOWILDCARD(val) && + nsec3noexistnodata(val, wild, name, rdataset, + zonename, &exists, &data, + NULL, NULL, NULL, NULL, NULL, + NULL) == ISC_R_SUCCESS) + { + dns_name_t **proofs = val->event->proofs; + if (exists && !data) + val->attributes |= VALATTR_FOUNDNODATA; + if (exists && !data && NEEDNODATA(val)) + proofs[DNS_VALIDATOR_NODATAPROOF] = + name; + if (!exists) + val->attributes |= + VALATTR_FOUNDNOWILDCARD; + if (!exists && NEEDNOQNAME(val)) + proofs[DNS_VALIDATOR_NOWILDCARDPROOF] = + name; + if (dns_rdataset_isassociated(&trdataset)) + dns_rdataset_disassociate(&trdataset); + return (ISC_R_SUCCESS); } } if (result == ISC_R_NOMORE) result = ISC_R_SUCCESS; + if (dns_rdataset_isassociated(&trdataset)) + dns_rdataset_disassociate(&trdataset); return (result); } - static isc_result_t findnsec3proofs(dns_validator_t *val) { - dns_name_t *name; - dns_message_t *message = val->event->message; + dns_name_t *name, tname; isc_result_t result; isc_boolean_t exists, data, optout, unknown; isc_boolean_t setclosest, setnearest; dns_fixedname_t fclosest, fnearest, fzonename; dns_name_t *closest, *nearest, *zonename; dns_name_t **proofs = val->event->proofs; + dns_rdataset_t *rdataset, trdataset; + dns_name_init(&tname, NULL); + dns_rdataset_init(&trdataset); dns_fixedname_init(&fclosest); dns_fixedname_init(&fnearest); dns_fixedname_init(&fzonename); @@ -2648,43 +2741,31 @@ findnsec3proofs(dns_validator_t *val) { nearest = dns_fixedname_name(&fnearest); zonename = dns_fixedname_name(&fzonename); - for (result = dns_message_firstname(message, DNS_SECTION_AUTHORITY); - result == ISC_R_SUCCESS; - result = dns_message_nextname(message, DNS_SECTION_AUTHORITY)) - { - dns_rdataset_t *rdataset = NULL, *sigrdataset = NULL; - + if (val->event->message == NULL) { + name = &tname; + rdataset = &trdataset; + } else { name = NULL; - dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name); - - for (rdataset = ISC_LIST_HEAD(name->list); - rdataset != NULL; - rdataset = ISC_LIST_NEXT(rdataset, link)) - { - if (rdataset->type != dns_rdatatype_nsec3) - continue; - - for (sigrdataset = ISC_LIST_HEAD(name->list); - sigrdataset != NULL; - sigrdataset = ISC_LIST_NEXT(sigrdataset, link)) - { - if (sigrdataset->type == dns_rdatatype_rrsig && - sigrdataset->covers == dns_rdatatype_nsec3) - break; - } - if (sigrdataset == NULL) - continue; + rdataset = NULL; + } - if (rdataset->trust != dns_trust_secure) - continue; + for (result = val_rdataset_first(val, &name, &rdataset); + result == ISC_R_SUCCESS; + result = val_rdataset_next(val, &name, &rdataset)) + { + if (rdataset->type != dns_rdatatype_nsec3 || + rdataset->trust != dns_trust_secure) + continue; - result = nsec3noexistnodata(val, val->event->name, - name, rdataset, - zonename, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, - NULL); - if (result != ISC_R_IGNORE && result != ISC_R_SUCCESS) - return (result); + result = nsec3noexistnodata(val, val->event->name, + name, rdataset, + zonename, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL); + if (result != ISC_R_IGNORE && result != ISC_R_SUCCESS) { + if (dns_rdataset_isassociated(&trdataset)) + dns_rdataset_disassociate(&trdataset); + return (result); } } if (result != ISC_R_NOMORE) @@ -2693,68 +2774,43 @@ findnsec3proofs(dns_validator_t *val) { if (dns_name_countlabels(zonename) == 0) return (ISC_R_SUCCESS); - for (result = dns_message_firstname(message, DNS_SECTION_AUTHORITY); + for (result = val_rdataset_first(val, &name, &rdataset); result == ISC_R_SUCCESS; - result = dns_message_nextname(message, DNS_SECTION_AUTHORITY)) + result = val_rdataset_next(val, &name, &rdataset)) { - dns_rdataset_t *rdataset = NULL, *sigrdataset = NULL; - - name = NULL; - dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name); - - for (rdataset = ISC_LIST_HEAD(name->list); - rdataset != NULL; - rdataset = ISC_LIST_NEXT(rdataset, link)) - { - if (rdataset->type != dns_rdatatype_nsec3) - continue; - - for (sigrdataset = ISC_LIST_HEAD(name->list); - sigrdataset != NULL; - sigrdataset = ISC_LIST_NEXT(sigrdataset, link)) - { - if (sigrdataset->type == dns_rdatatype_rrsig && - sigrdataset->covers == dns_rdatatype_nsec3) - break; - } - if (sigrdataset == NULL) - continue; - - if (rdataset->trust != dns_trust_secure) - continue; + if (rdataset->type != dns_rdatatype_nsec3 || + rdataset->trust != dns_trust_secure) + continue; - /* - * We process all NSEC3 records to find the closest - * encloser and nearest name to the closest encloser. - */ - setclosest = setnearest = ISC_FALSE; - optout = ISC_FALSE; - unknown = ISC_FALSE; - result = nsec3noexistnodata(val, val->event->name, - name, rdataset, - zonename, &exists, - &data, &optout, &unknown, - &setclosest, &setnearest, - closest, nearest); - if (setclosest) - proofs[DNS_VALIDATOR_CLOSESTENCLOSER] = name; - if (unknown) - val->attributes |= VALATTR_FOUNDUNKNOWN; - if (result != ISC_R_SUCCESS) - continue; - if (exists && !data && NEEDNODATA(val)) { - val->attributes |= VALATTR_FOUNDNODATA; - proofs[DNS_VALIDATOR_NODATAPROOF] = name; - } - if (!exists && setnearest) { - val->attributes |= VALATTR_FOUNDNOQNAME; - proofs[DNS_VALIDATOR_NOQNAMEPROOF] = name; - if (optout) - val->attributes |= VALATTR_FOUNDOPTOUT; - } + /* + * We process all NSEC3 records to find the closest + * encloser and nearest name to the closest encloser. + */ + setclosest = setnearest = ISC_FALSE; + optout = ISC_FALSE; + unknown = ISC_FALSE; + (void)nsec3noexistnodata(val, val->event->name, name, rdataset, + zonename, &exists, &data, &optout, + &unknown, &setclosest, &setnearest, + closest, nearest); + if (setclosest) + proofs[DNS_VALIDATOR_CLOSESTENCLOSER] = name; + if (unknown) + val->attributes |= VALATTR_FOUNDUNKNOWN; + if (result != ISC_R_SUCCESS) + continue; + if (exists && !data && NEEDNODATA(val)) { + val->attributes |= VALATTR_FOUNDNODATA; + proofs[DNS_VALIDATOR_NODATAPROOF] = name; + } + if (!exists && setnearest) { + val->attributes |= VALATTR_FOUNDNOQNAME; + proofs[DNS_VALIDATOR_NOQNAMEPROOF] = name; + if (optout) + val->attributes |= VALATTR_FOUNDOPTOUT; } } - if (result != ISC_R_NOMORE) + if (result == ISC_R_NOMORE) result = ISC_R_SUCCESS; /* @@ -2781,11 +2837,8 @@ findnsec3proofs(dns_validator_t *val) { /* * Do we need to check for the wildcard? */ - if ((val->attributes & VALATTR_FOUNDNOQNAME) != 0 && - (val->attributes & VALATTR_FOUNDCLOSEST) != 0 && - (((val->attributes & VALATTR_NEEDNODATA) != 0 && - (val->attributes & VALATTR_FOUNDNODATA) == 0) || - (val->attributes & VALATTR_NEEDNOWILDCARD) != 0)) { + if (FOUNDNOQNAME(val) && FOUNDCLOSEST(val) && + ((NEEDNODATA(val) && !FOUNDNODATA(val)) || NEEDNOWILDCARD(val))) { result = checkwildcard(val, dns_rdatatype_nsec3, zonename); if (result != ISC_R_SUCCESS) return (result); @@ -2794,29 +2847,18 @@ findnsec3proofs(dns_validator_t *val) { } /*% - * Prove a negative answer is good or that there is a NOQNAME when the - * answer is from a wildcard. - * - * Loop through the authority section looking for NODATA, NOWILDCARD - * and NOQNAME proofs in the NSEC records by calling authvalidated(). - * - * If the required proofs are found we are done. - * - * If the proofs are not found attempt to prove this is a unsecure - * response. + * Validate the authority section records. */ static isc_result_t -nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { +validate_authority(dns_validator_t *val, isc_boolean_t resume) { dns_name_t *name; dns_message_t *message = val->event->message; isc_result_t result; if (!resume) result = dns_message_firstname(message, DNS_SECTION_AUTHORITY); - else { + else result = ISC_R_SUCCESS; - validator_log(val, ISC_LOG_DEBUG(3), "resuming nsecvalidate"); - } for (; result == ISC_R_SUCCESS; @@ -2879,16 +2921,121 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { result = create_validator(val, name, rdataset->type, rdataset, sigrdataset, authvalidated, - "nsecvalidate"); + "validate_authority"); if (result != ISC_R_SUCCESS) return (result); val->authcount++; return (DNS_R_WAIT); + } + } + if (result == ISC_R_NOMORE) + result = ISC_R_SUCCESS; + return (result); +} +/*% + * Validate the ncache elements. + */ +static isc_result_t +validate_ncache(dns_validator_t *val, isc_boolean_t resume) { + dns_name_t *name; + isc_result_t result; + + if (!resume) + result = dns_rdataset_first(val->event->rdataset); + else + result = dns_rdataset_next(val->event->rdataset); + + for (; + result == ISC_R_SUCCESS; + result = dns_rdataset_next(val->event->rdataset)) + { + dns_rdataset_t *rdataset, *sigrdataset = NULL; + + if (dns_rdataset_isassociated(&val->frdataset)) + dns_rdataset_disassociate(&val->frdataset); + if (dns_rdataset_isassociated(&val->fsigrdataset)) + dns_rdataset_disassociate(&val->fsigrdataset); + + dns_fixedname_init(&val->fname); + name = dns_fixedname_name(&val->fname); + rdataset = &val->frdataset; + dns_ncache_current(val->event->rdataset, name, rdataset); + + if (val->frdataset.type == dns_rdatatype_rrsig) + continue; + + result = dns_ncache_getsigrdataset(val->event->rdataset, name, + rdataset->type, + &val->fsigrdataset); + if (result == ISC_R_SUCCESS) + sigrdataset = &val->fsigrdataset; + + /* + * If a signed zone is missing the zone key, bad + * things could happen. A query for data in the zone + * would lead to a query for the zone key, which + * would return a negative answer, which would contain + * an SOA and an NSEC signed by the missing key, which + * would trigger another query for the DNSKEY (since + * the first one is still in progress), and go into an + * infinite loop. Avoid that. + */ + if (val->event->type == dns_rdatatype_dnskey && + dns_name_equal(name, val->event->name)) + { + dns_rdata_t nsec = DNS_RDATA_INIT; + + if (rdataset->type != dns_rdatatype_nsec) + continue; + + result = dns_rdataset_first(rdataset); + if (result != ISC_R_SUCCESS) + return (result); + dns_rdataset_current(rdataset, &nsec); + if (dns_nsec_typepresent(&nsec, + dns_rdatatype_soa)) + continue; } + val->currentset = rdataset; + result = create_validator(val, name, rdataset->type, + rdataset, sigrdataset, + authvalidated, + "validate_ncache"); + if (result != ISC_R_SUCCESS) + return (result); + val->authcount++; + return (DNS_R_WAIT); } if (result == ISC_R_NOMORE) result = ISC_R_SUCCESS; + return (result); +} + +/*% + * Prove a negative answer is good or that there is a NOQNAME when the + * answer is from a wildcard. + * + * Loop through the authority section looking for NODATA, NOWILDCARD + * and NOQNAME proofs in the NSEC records by calling authvalidated(). + * + * If the required proofs are found we are done. + * + * If the proofs are not found attempt to prove this is a unsecure + * response. + */ +static isc_result_t +nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { + isc_result_t result; + + if (resume) + validator_log(val, ISC_LOG_DEBUG(3), "resuming nsecvalidate"); + + if (val->event->message == NULL) + result = validate_ncache(val, resume); + else + result = validate_authority(val, resume); + if (result != ISC_R_SUCCESS) return (result); @@ -2896,31 +3043,28 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { * Do we only need to check for NOQNAME? To get here we must have * had a secure wildcard answer. */ - if ((val->attributes & VALATTR_NEEDNODATA) == 0 && - (val->attributes & VALATTR_NEEDNOWILDCARD) == 0 && - (val->attributes & VALATTR_NEEDNOQNAME) != 0) { - if ((val->attributes & VALATTR_FOUNDNOQNAME) == 0) + if (!NEEDNODATA(val) && !NEEDNOWILDCARD(val) && NEEDNOQNAME(val)) { + if (!FOUNDNOQNAME(val)) findnsec3proofs(val); - if ((val->attributes & VALATTR_FOUNDNOQNAME) != 0 && - (val->attributes & VALATTR_FOUNDCLOSEST) != 0) { + if (FOUNDNOQNAME(val) && FOUNDCLOSEST(val)) { validator_log(val, ISC_LOG_DEBUG(3), "noqname proof found"); validator_log(val, ISC_LOG_DEBUG(3), "marking as secure"); marksecure(val->event); return (ISC_R_SUCCESS); - } else if ((val->attributes & VALATTR_FOUNDOPTOUT) != 0 && + } else if (FOUNDOPTOUT(val) && dns_name_countlabels(dns_fixedname_name(&val->wild)) != 0) { validator_log(val, ISC_LOG_DEBUG(3), "optout proof found"); val->event->optout = ISC_TRUE; - markanswer(val); + markanswer(val, "nsecvalidate (1)"); return (ISC_R_SUCCESS); } else if ((val->attributes & VALATTR_FOUNDUNKNOWN) != 0) { validator_log(val, ISC_LOG_DEBUG(3), "unknown NSEC3 hash algorithm found"); - markanswer(val); + markanswer(val, "nsecvalidate (2)"); return (ISC_R_SUCCESS); } validator_log(val, ISC_LOG_DEBUG(3), @@ -2928,35 +3072,29 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { return (DNS_R_NOVALIDNSEC); } - if ((val->attributes & VALATTR_FOUNDNOQNAME) == 0 && - (val->attributes & VALATTR_FOUNDNODATA) == 0) + if (!FOUNDNOQNAME(val) && !FOUNDNODATA(val)) findnsec3proofs(val); /* * Do we need to check for the wildcard? */ - if ((val->attributes & VALATTR_FOUNDNOQNAME) != 0 && - (val->attributes & VALATTR_FOUNDCLOSEST) != 0 && - (((val->attributes & VALATTR_NEEDNODATA) != 0 && - (val->attributes & VALATTR_FOUNDNODATA) == 0) || - (val->attributes & VALATTR_NEEDNOWILDCARD) != 0)) { + if (FOUNDNOQNAME(val) && FOUNDCLOSEST(val) && + ((NEEDNODATA(val) && !FOUNDNODATA(val)) || NEEDNOWILDCARD(val))) { result = checkwildcard(val, dns_rdatatype_nsec, NULL); if (result != ISC_R_SUCCESS) return (result); } - if (((val->attributes & VALATTR_NEEDNODATA) != 0 && - ((val->attributes & VALATTR_FOUNDNODATA) != 0 || - (val->attributes & VALATTR_FOUNDOPTOUT) != 0)) || - ((val->attributes & VALATTR_NEEDNOQNAME) != 0 && - (val->attributes & VALATTR_FOUNDNOQNAME) != 0 && - (val->attributes & VALATTR_NEEDNOWILDCARD) != 0 && - (val->attributes & VALATTR_FOUNDNOWILDCARD) != 0 && - (val->attributes & VALATTR_FOUNDCLOSEST) != 0)) { + if ((NEEDNODATA(val) && (FOUNDNODATA(val) || FOUNDOPTOUT(val))) || + (NEEDNOQNAME(val) && FOUNDNOQNAME(val) && + NEEDNOWILDCARD(val) && FOUNDNOWILDCARD(val) && + FOUNDCLOSEST(val))) { if ((val->attributes & VALATTR_FOUNDOPTOUT) != 0) val->event->optout = ISC_TRUE; validator_log(val, ISC_LOG_DEBUG(3), "nonexistence proof(s) found"); + if (val->event->message == NULL) + marksecure(val->event); return (ISC_R_SUCCESS); } findnsec3proofs(val); @@ -3025,7 +3163,7 @@ dlvvalidated(isc_task_t *task, isc_event_t *event) { if (dlv_algorithm_supported(val)) dlv_validator_start(val); else { - markanswer(val); + markanswer(val, "dlvvalidated"); validator_done(val, ISC_R_SUCCESS); } } else { @@ -3094,7 +3232,7 @@ dlvfetched(isc_task_t *task, isc_event_t *event) { validator_log(val, ISC_LOG_DEBUG(3), "DLV %s found with no supported algorithms", namebuf); - markanswer(val); + markanswer(val, "dlvfetched (1)"); validator_done(val, ISC_R_SUCCESS); } } else if (eresult == DNS_R_NXRRSET || @@ -3113,12 +3251,12 @@ dlvfetched(isc_task_t *task, isc_event_t *event) { validator_log(val, ISC_LOG_DEBUG(3), "DLV %s found with no supported " "algorithms", namebuf); - markanswer(val); + markanswer(val, "dlvfetched (2)"); validator_done(val, ISC_R_SUCCESS); } } else if (result == ISC_R_NOTFOUND) { validator_log(val, ISC_LOG_DEBUG(3), "DLV not found"); - markanswer(val); + markanswer(val, "dlvfetched (3)"); validator_done(val, ISC_R_SUCCESS); } else { validator_log(val, ISC_LOG_DEBUG(3), "DLV lookup: %s", @@ -3168,7 +3306,7 @@ startfinddlvsep(dns_validator_t *val, dns_name_t *unsecure) { result = finddlvsep(val, ISC_FALSE); if (result == ISC_R_NOTFOUND) { validator_log(val, ISC_LOG_DEBUG(3), "DLV not found"); - markanswer(val); + markanswer(val, "startfinddlvsep (1)"); return (ISC_R_SUCCESS); } if (result != ISC_R_SUCCESS) { @@ -3185,7 +3323,7 @@ startfinddlvsep(dns_validator_t *val, dns_name_t *unsecure) { } validator_log(val, ISC_LOG_DEBUG(3), "DLV %s found with no supported " "algorithms", namebuf); - markanswer(val); + markanswer(val, "startfinddlvsep (2)"); validator_done(val, ISC_R_SUCCESS); return (ISC_R_SUCCESS); } @@ -3374,7 +3512,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) goto out; } if (val->view->dlv == NULL || DLVTRIED(val)) { - markanswer(val); + markanswer(val, "proveunsecure (1)"); return (ISC_R_SUCCESS); } return (startfinddlvsep(val, dns_rootname)); @@ -3412,7 +3550,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) "no supported algorithm/digest (%s/DS)", namebuf); if (val->view->dlv == NULL || DLVTRIED(val)) { - markanswer(val); + markanswer(val, "proveunsecure (2)"); result = ISC_R_SUCCESS; goto out; } @@ -3442,18 +3580,23 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) namebuf); result = view_find(val, tname, dns_rdatatype_ds); - if (result == DNS_R_NXRRSET || result == DNS_R_NCACHENXRRSET) { /* * There is no DS. If this is a delegation, * we maybe done. */ - if (DNS_TRUST_PENDING(val->frdataset.trust)) { - result = create_fetch(val, tname, - dns_rdatatype_ds, - dsfetched2, - "proveunsecure"); - if (result != ISC_R_SUCCESS) + /* + * If we have "trust == answer" then this namespace + * has switched from insecure to should be secure. + */ + if (DNS_TRUST_PENDING(val->frdataset.trust) || + DNS_TRUST_ANSWER(val->frdataset.trust)) { + result = create_validator(val, tname, + dns_rdatatype_ds, + &val->frdataset, + NULL, dsvalidated, + "proveunsecure"); + if (result != ISC_R_SUCCESS) goto out; return (DNS_R_WAIT); } @@ -3474,7 +3617,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) return (DNS_R_MUSTBESECURE); } if (val->view->dlv == NULL || DLVTRIED(val)) { - markanswer(val); + markanswer(val, "proveunsecure (3)"); return (ISC_R_SUCCESS); } return (startfinddlvsep(val, tname)); @@ -3496,7 +3639,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) return (DNS_R_MUSTBESECURE); } if (val->view->dlv == NULL || DLVTRIED(val)) { - markanswer(val); + markanswer(val, "proveunsecure (4)"); return (ISC_R_SUCCESS); } return (startfinddlvsep(val, tname)); @@ -3521,7 +3664,8 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) } if (val->view->dlv == NULL || DLVTRIED(val)) { - markanswer(val); + markanswer(val, + "proveunsecure (5)"); result = ISC_R_SUCCESS; goto out; } @@ -3535,6 +3679,9 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) result = DNS_R_NOVALIDSIG; goto out; } + /* + * Validate / re-validate answer. + */ result = create_validator(val, tname, dns_rdatatype_ds, &val->frdataset, &val->fsigrdataset, @@ -3580,14 +3727,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) return (result); } -/* - if ((val->attributes & VALATTR_NEEDOPTOUT) == 0 && - val->event->message != NULL) { - val->attributes |= VALATTR_NEEDOPTOUT; - return (nsecvalidate(val, ISC_FALSE)); - } -*/ - + /* Couldn't complete insecurity proof */ validator_log(val, ISC_LOG_DEBUG(3), "insecurity proof failed"); return (DNS_R_NOTINSECURE); /* Couldn't complete insecurity proof */ @@ -3682,7 +3822,8 @@ validator_start(isc_task_t *task, isc_event_t *event) { if (result == DNS_R_NOTINSECURE) result = saved_result; } - } else if (val->event->rdataset != NULL) { + } else if (val->event->rdataset != NULL && + val->event->rdataset->type != 0) { /* * This is either an unsecure subdomain or a response from * a broken server. @@ -3708,6 +3849,21 @@ validator_start(isc_task_t *task, isc_event_t *event) { } else val->attributes |= VALATTR_NEEDNODATA; result = nsecvalidate(val, ISC_FALSE); + } else if (val->event->rdataset != NULL && + val->event->rdataset->type == 0) + { + /* + * This is a nonexistence validation. + */ + validator_log(val, ISC_LOG_DEBUG(3), + "attempting negative response validation"); + + if (val->event->rdataset->covers == dns_rdatatype_any) { + val->attributes |= VALATTR_NEEDNOQNAME; + val->attributes |= VALATTR_NEEDNOWILDCARD; + } else + val->attributes |= VALATTR_NEEDNODATA; + result = nsecvalidate(val, ISC_FALSE); } else { /* * This shouldn't happen. diff --git a/lib/dns/view.c b/lib/dns/view.c index 72163b4..3726eef 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.150.84.3.8.2 2010/02/25 10:57:12 tbox Exp $ */ +/* $Id: view.c,v 1.150.84.3.10.1 2010/03/03 22:06:39 marka Exp $ */ /*! \file */ diff --git a/lib/isc/api b/lib/isc/api index e55996b..823f692 100644 --- a/lib/isc/api +++ b/lib/isc/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 52 -LIBREVISION = 1 -LIBAGE = 2 +LIBINTERFACE = 53 +LIBREVISION = 0 +LIBAGE = 3 diff --git a/lib/isc/include/isc/mem.h b/lib/isc/include/isc/mem.h index 480a934..b49d440 100644 --- a/lib/isc/include/isc/mem.h +++ b/lib/isc/include/isc/mem.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1997-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: mem.h,v 1.78.120.3 2009/02/11 03:07:01 jinmei Exp $ */ +/* $Id: mem.h,v 1.78.120.3.24.2 2010/08/12 23:46:25 tbox Exp $ */ #ifndef ISC_MEM_H #define ISC_MEM_H 1 @@ -334,6 +334,14 @@ isc_mem_inuse(isc_mem_t *mctx); * allocated from the system but not yet used. */ +isc_boolean_t +isc_mem_isovermem(isc_mem_t *mctx); +/*%< + * Return true iff the memory context is in "over memory" state, i.e., + * a hiwater mark has been set and the used amount of memory has exceeds + * the mark. + */ + void isc_mem_setwater(isc_mem_t *mctx, isc_mem_water_t water, void *water_arg, size_t hiwater, size_t lowater); diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 9c37d74..59f5924 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1997-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: mem.c,v 1.145.120.4 2009/02/16 03:17:05 marka Exp $ */ +/* $Id: mem.c,v 1.145.120.4.24.2 2010/08/12 23:46:25 tbox Exp $ */ /*! \file */ @@ -141,6 +141,7 @@ struct isc_mem { size_t hi_water; size_t lo_water; isc_boolean_t hi_called; + isc_boolean_t is_overmem; isc_mem_water_t water; void * water_arg; ISC_LIST(isc_mempool_t) pools; @@ -764,6 +765,7 @@ isc_mem_createx2(size_t init_max_size, size_t target_size, ctx->hi_water = 0; ctx->lo_water = 0; ctx->hi_called = ISC_FALSE; + ctx->is_overmem = ISC_FALSE; ctx->water = NULL; ctx->water_arg = NULL; ctx->magic = MEM_MAGIC; @@ -1102,6 +1104,10 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) { } ADD_TRACE(ctx, ptr, size, file, line); + if (ctx->hi_water != 0U && ctx->inuse > ctx->hi_water && + !ctx->is_overmem) { + ctx->is_overmem = ISC_TRUE; + } if (ctx->hi_water != 0U && !ctx->hi_called && ctx->inuse > ctx->hi_water) { call_water = ISC_TRUE; @@ -1159,6 +1165,10 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG) * when the context was pushed over hi_water but then had * isc_mem_setwater() called with 0 for hi_water and lo_water. */ + if (ctx->is_overmem && + (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { + ctx->is_overmem = ISC_FALSE; + } if (ctx->hi_called && (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { if (ctx->water != NULL) @@ -1345,6 +1355,11 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) { #if ISC_MEM_TRACKLINES ADD_TRACE(ctx, si, si[-1].u.size, file, line); #endif + if (ctx->hi_water != 0U && ctx->inuse > ctx->hi_water && + !ctx->is_overmem) { + ctx->is_overmem = ISC_TRUE; + } + if (ctx->hi_water != 0U && !ctx->hi_called && ctx->inuse > ctx->hi_water) { ctx->hi_called = ISC_TRUE; @@ -1433,6 +1448,11 @@ isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) { * when the context was pushed over hi_water but then had * isc_mem_setwater() called with 0 for hi_water and lo_water. */ + if (ctx->is_overmem && + (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { + ctx->is_overmem = ISC_FALSE; + } + if (ctx->hi_called && (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { ctx->hi_called = ISC_FALSE; @@ -1559,6 +1579,18 @@ isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg, (oldwater)(oldwater_arg, ISC_MEM_LOWATER); } +isc_boolean_t +isc_mem_isovermem(isc_mem_t *ctx) { + REQUIRE(VALID_CONTEXT(ctx)); + + /* + * We don't bother to lock the context because 100% accuracy isn't + * necessary (and even if we locked the context the returned value + * could be different from the actual state when it's used anyway) + */ + return (ctx->is_overmem); +} + void isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag) { REQUIRE(VALID_CONTEXT(ctx)); diff --git a/lib/lwres/man/lwres.html b/lib/lwres/man/lwres.html index 465b876..f7f3a9f 100644 --- a/lib/lwres/man/lwres.html +++ b/lib/lwres/man/lwres.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_buffer.html b/lib/lwres/man/lwres_buffer.html index 80fd383..042e158 100644 --- a/lib/lwres/man/lwres_buffer.html +++ b/lib/lwres/man/lwres_buffer.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_config.html b/lib/lwres/man/lwres_config.html index 055ae91..aad6768 100644 --- a/lib/lwres/man/lwres_config.html +++ b/lib/lwres/man/lwres_config.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_context.html b/lib/lwres/man/lwres_context.html index d86e508..3635b9c 100644 --- a/lib/lwres/man/lwres_context.html +++ b/lib/lwres/man/lwres_context.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_gabn.html b/lib/lwres/man/lwres_gabn.html index 91734dd..2b6ba85 100644 --- a/lib/lwres/man/lwres_gabn.html +++ b/lib/lwres/man/lwres_gabn.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_gai_strerror.html b/lib/lwres/man/lwres_gai_strerror.html index 03b67b8..393efeb 100644 --- a/lib/lwres/man/lwres_gai_strerror.html +++ b/lib/lwres/man/lwres_gai_strerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_getaddrinfo.html b/lib/lwres/man/lwres_getaddrinfo.html index 5d02f4b..ef5cd40 100644 --- a/lib/lwres/man/lwres_getaddrinfo.html +++ b/lib/lwres/man/lwres_getaddrinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_gethostent.html b/lib/lwres/man/lwres_gethostent.html index 576c8d9..7f6a6ad 100644 --- a/lib/lwres/man/lwres_gethostent.html +++ b/lib/lwres/man/lwres_gethostent.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_getipnode.html b/lib/lwres/man/lwres_getipnode.html index 9acc616..f20240e 100644 --- a/lib/lwres/man/lwres_getipnode.html +++ b/lib/lwres/man/lwres_getipnode.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_getnameinfo.html b/lib/lwres/man/lwres_getnameinfo.html index 8b84397..88215dd 100644 --- a/lib/lwres/man/lwres_getnameinfo.html +++ b/lib/lwres/man/lwres_getnameinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_getrrsetbyname.html b/lib/lwres/man/lwres_getrrsetbyname.html index 14f1e65..8715e5f 100644 --- a/lib/lwres/man/lwres_getrrsetbyname.html +++ b/lib/lwres/man/lwres_getrrsetbyname.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_gnba.html b/lib/lwres/man/lwres_gnba.html index 368a848..476fd1f 100644 --- a/lib/lwres/man/lwres_gnba.html +++ b/lib/lwres/man/lwres_gnba.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_hstrerror.html b/lib/lwres/man/lwres_hstrerror.html index 1ca798d..2e77451 100644 --- a/lib/lwres/man/lwres_hstrerror.html +++ b/lib/lwres/man/lwres_hstrerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_inetntop.html b/lib/lwres/man/lwres_inetntop.html index 9535c35..4358c1b 100644 --- a/lib/lwres/man/lwres_inetntop.html +++ b/lib/lwres/man/lwres_inetntop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_noop.html b/lib/lwres/man/lwres_noop.html index 43539ad..62aa19a 100644 --- a/lib/lwres/man/lwres_noop.html +++ b/lib/lwres/man/lwres_noop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_packet.html b/lib/lwres/man/lwres_packet.html index 985e5f6..7f2f67b 100644 --- a/lib/lwres/man/lwres_packet.html +++ b/lib/lwres/man/lwres_packet.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/lib/lwres/man/lwres_resutil.html b/lib/lwres/man/lwres_resutil.html index e11aa6f..e649965 100644 --- a/lib/lwres/man/lwres_resutil.html +++ b/lib/lwres/man/lwres_resutil.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/version b/version index d9367f8..a16a96f 100644 --- a/version +++ b/version @@ -1,10 +1,10 @@ -# $Id: version,v 1.43.12.8.2.4 2010/05/10 02:07:03 marka Exp $ +# $Id: version,v 1.43.12.8.4.3 2010/09/03 02:57:11 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. # MAJORVER=9 MINORVER=6 -PATCHVER=2 -RELEASETYPE=-P -RELEASEVER=2 +PATCHVER= +RELEASETYPE=-ESV +RELEASEVER=-R2 -- cgit v1.1 From 94e5505da619159032deac31ce95e6677cb94508 Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 21 Nov 2010 22:45:18 +0000 Subject: Import OpenSSL 0.9.8p. --- CHANGES | 45 +++++ Configure | 4 +- FAQ | 29 ++- Makefile | 2 +- NEWS | 12 ++ PROBLEMS | 4 +- README | 2 +- apps/apps.c | 17 +- apps/dh.c | 5 +- apps/dhparam.c | 5 +- apps/dsaparam.c | 9 +- apps/ec.c | 5 +- apps/ecparam.c | 5 +- apps/enc.c | 5 +- apps/gendh.c | 5 +- apps/gendsa.c | 5 +- apps/genrsa.c | 5 +- apps/pkcs7.c | 5 +- apps/rand.c | 5 +- apps/s_server.c | 7 +- apps/s_socket.c | 7 +- apps/speed.c | 12 +- apps/x509.c | 2 - crypto/aes/aes_wrap.c | 12 +- crypto/aes/asm/aes-x86_64.pl | 38 ++-- crypto/asn1/a_int.c | 3 +- crypto/asn1/n_pkey.c | 3 +- crypto/asn1/t_crl.c | 3 +- crypto/asn1/tasn_dec.c | 3 +- crypto/asn1/x_x509.c | 4 +- crypto/bio/b_sock.c | 7 + crypto/bio/bf_nbio.c | 2 - crypto/bio/bio_lib.c | 4 +- crypto/bio/bss_acpt.c | 5 +- crypto/bio/bss_sock.c | 13 -- crypto/bn/bn_exp2.c | 3 +- crypto/bn/bn_mul.c | 9 +- crypto/cms/cms_asn1.c | 4 +- crypto/conf/conf_def.c | 17 +- crypto/des/rpc_des.h | 4 +- crypto/dsa/dsa_gen.c | 3 +- crypto/dsa/dsa_ossl.c | 3 +- crypto/ec/ec2_mult.c | 13 +- crypto/ec/ec_mult.c | 6 +- crypto/ecdh/ech_lib.c | 6 - crypto/ecdsa/ecs_lib.c | 2 - crypto/engine/eng_list.c | 1 + crypto/err/err_prn.c | 10 +- crypto/evp/bio_b64.c | 77 ++++--- crypto/evp/enc_min.c | 1 + crypto/evp/encode.c | 3 +- crypto/evp/evp_pbe.c | 49 ++++- crypto/hmac/hmac.c | 3 - crypto/md32_common.h | 2 +- crypto/o_init.c | 5 + crypto/ocsp/ocsp_ht.c | 12 +- crypto/ocsp/ocsp_prn.c | 2 - crypto/opensslv.h | 6 +- crypto/pem/pem_lib.c | 2 - crypto/pkcs12/p12_key.c | 38 ++-- crypto/pkcs12/p12_npas.c | 17 +- crypto/pkcs7/pk7_doit.c | 3 - crypto/pkcs7/pk7_lib.c | 2 - crypto/pkcs7/pk7_mime.c | 3 - crypto/pqueue/pqueue.c | 12 +- crypto/rand/rand_nw.c | 4 +- crypto/rand/randfile.c | 4 +- crypto/rsa/rsa_eay.c | 2 +- crypto/x509/x509.h | 1 + crypto/x509/x509_vfy.c | 7 +- crypto/x509/x_all.c | 1 + crypto/x509v3/v3_ncons.c | 1 - crypto/x509v3/v3_pci.c | 28 ++- doc/apps/smime.pod | 8 +- doc/crypto/ASN1_OBJECT_new.pod | 2 + doc/crypto/ASN1_STRING_length.pod | 2 + doc/crypto/ASN1_STRING_new.pod | 2 + doc/crypto/ASN1_generate_nconf.pod | 2 + doc/crypto/BIO_f_buffer.pod | 9 +- doc/crypto/BIO_should_retry.pod | 2 +- doc/crypto/CRYPTO_set_ex_data.pod | 2 + doc/crypto/OBJ_nid2obj.pod | 2 + doc/crypto/PKCS7_decrypt.pod | 4 +- doc/crypto/PKCS7_encrypt.pod | 4 +- doc/crypto/PKCS7_sign.pod | 4 +- doc/crypto/PKCS7_verify.pod | 6 +- doc/crypto/SMIME_read_PKCS7.pod | 4 +- doc/crypto/SMIME_write_PKCS7.pod | 4 +- doc/crypto/X509_NAME_ENTRY_get_object.pod | 16 +- doc/crypto/X509_NAME_add_entry_by_txt.pod | 12 +- doc/crypto/X509_NAME_get_index_by_NID.pod | 14 +- doc/crypto/X509_new.pod | 2 + doc/crypto/bn_internal.pod | 2 + doc/crypto/ui_compat.pod | 2 + doc/ssl/SSL_library_init.pod | 16 +- e_os.h | 1 - engines/e_chil.c | 56 ++---- engines/e_cswift.c | 2 - engines/e_ubsec.c | 2 - fips/mkfipsscr.pl | 37 +++- openssl.spec | 2 +- ssl/d1_both.c | 320 ++++++++++++++++++++++-------- ssl/d1_clnt.c | 3 +- ssl/d1_enc.c | 6 +- ssl/d1_lib.c | 10 + ssl/d1_pkt.c | 60 +++--- ssl/dtls1.h | 1 + ssl/s23_clnt.c | 5 +- ssl/s23_lib.c | 8 +- ssl/s2_srvr.c | 2 - ssl/s3_both.c | 2 + ssl/s3_clnt.c | 4 +- ssl/s3_enc.c | 3 +- ssl/ssl_algs.c | 8 + ssl/ssl_asn1.c | 3 +- ssl/ssl_cert.c | 2 + ssl/ssl_ciph.c | 6 +- ssl/ssl_lib.c | 6 +- ssl/ssltest.c | 3 - ssl/t1_enc.c | 18 +- ssl/t1_lib.c | 27 ++- test/cms-test.pl | 19 +- tools/c_rehash | 1 + tools/c_rehash.in | 1 + util/libeay.num | 2 +- util/mkdef.pl | 2 + util/pl/VC-32.pl | 4 +- 127 files changed, 877 insertions(+), 535 deletions(-) diff --git a/CHANGES b/CHANGES index b350da7..58fd57c 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,51 @@ OpenSSL CHANGES _______________ + Changes between 0.9.8o and 0.9.8p [16 Nov 2010] + + *) Fix extension code to avoid race conditions which can result in a buffer + overrun vulnerability: resumed sessions must not be modified as they can + be shared by multiple threads. CVE-2010-3864 + [Steve Henson] + + *) Fix for double free bug in ssl/s3_clnt.c CVE-2010-2939 + [Steve Henson] + + *) Don't reencode certificate when calculating signature: cache and use + the original encoding instead. This makes signature verification of + some broken encodings work correctly. + [Steve Henson] + + *) ec2_GF2m_simple_mul bugfix: compute correct result if the output EC_POINT + is also one of the inputs. + [Emilia Käsper (Google)] + + *) Don't repeatedly append PBE algorithms to table if they already exist. + Sort table on each new add. This effectively makes the table read only + after all algorithms are added and subsequent calls to PKCS12_pbe_add + etc are non-op. + [Steve Henson] + + Changes between 0.9.8n and 0.9.8o [01 Jun 2010] + + [NB: OpenSSL 0.9.8o and later 0.9.8 patch levels were released after + OpenSSL 1.0.0.] + + *) Correct a typo in the CMS ASN1 module which can result in invalid memory + access or freeing data twice (CVE-2010-0742) + [Steve Henson, Ronald Moesbergen ] + + *) Add SHA2 algorithms to SSL_library_init(). SHA2 is becoming far more + common in certificates and some applications which only call + SSL_library_init and not OpenSSL_add_all_algorithms() will fail. + [Steve Henson] + + *) VMS fixes: + Reduce copying into .apps and .test in makevms.com + Don't try to use blank CA certificate in CA.com + Allow use of C files from original directories in maketests.com + [Steven M. Schweda" ] + Changes between 0.9.8m and 0.9.8n [24 Mar 2010] *) When rejecting SSL/TLS records due to an incorrect version number, never diff --git a/Configure b/Configure index 32e154b..e94f7f0 100755 --- a/Configure +++ b/Configure @@ -1812,11 +1812,11 @@ EOF (system $make_command.$make_targets) == 0 or exit $? if $make_targets ne ""; if ( $perl =~ m@^/@) { - &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";'); + &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";'); &dofile("apps/CA.pl",$perl,'^#!/', '#!%s'); } else { # No path for Perl known ... - &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";'); + &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";'); &dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s'); } if ($depflags ne $default_depflags && !$make_depend) { diff --git a/FAQ b/FAQ index f7aaede..f7bdc88 100644 --- a/FAQ +++ b/FAQ @@ -70,6 +70,7 @@ OpenSSL - Frequently Asked Questions * I think I've detected a memory leak, is this a bug? * Why does Valgrind complain about the use of uninitialized data? * Why doesn't a memory BIO work when a file does? +* Where are the declarations and implementations of d2i_X509() etc? =============================================================================== @@ -78,7 +79,7 @@ OpenSSL - Frequently Asked Questions * Which is the current version of OpenSSL? The current version is available from . -OpenSSL 0.9.8n was released on Mar 24th, 2010. +OpenSSL 1.0.0b was released on Nov 16th, 2010. In addition to the current stable release, you can also access daily snapshots of the OpenSSL development version at . +. Note that the online documents refer +to the very latest development versions of OpenSSL and may include features +not present in released versions. If in doubt refer to the documentation +that came with the version of OpenSSL you are using. For information on parts of libcrypto that are not yet documented, you might want to read Ariel Glenn's documentation on SSLeay 0.9, OpenSSL's @@ -717,8 +721,10 @@ file. Multi-threaded applications must provide two callback functions to OpenSSL by calling CRYPTO_set_locking_callback() and -CRYPTO_set_id_callback(). This is described in the threads(3) -manpage. +CRYPTO_set_id_callback(), for all versions of OpenSSL up to and +including 0.9.8[abc...]. As of version 1.0.0, CRYPTO_set_id_callback() +and associated APIs are deprecated by CRYPTO_THREADID_set_callback() +and friends. This is described in the threads(3) manpage. * I've compiled a program under Windows and it crashes: why? @@ -962,4 +968,15 @@ is needed. This must be done by calling: See the manual pages for more details. +* Where are the declarations and implementations of d2i_X509() etc? + +These are defined and implemented by macros of the form: + + + DECLARE_ASN1_FUNCTIONS(X509) and IMPLEMENT_ASN1_FUNCTIONS(X509) + +The implementation passes an ASN1 "template" defining the structure into an +ASN1 interpreter using generalised functions such as ASN1_item_d2i(). + + =============================================================================== diff --git a/Makefile b/Makefile index 7f48abd..f5e8546 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ ## Makefile for OpenSSL ## -VERSION=0.9.8n +VERSION=0.9.8p MAJOR=0 MINOR=9.8 SHLIB_VERSION_NUMBER=0.9.8 diff --git a/NEWS b/NEWS index a00d06a..65f4ef2 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,18 @@ This file gives a brief overview of the major changes between each OpenSSL release. For more details please read the CHANGES file. + Major changes between OpenSSL 0.9.8o and OpenSSL 0.9.8p: + + o Fix for security issue CVE-2010-3864. + + Major changes between OpenSSL 0.9.8n and OpenSSL 0.9.8o: + + o Fix for security issue CVE-2010-0742. + o Various DTLS fixes. + o Recognise SHA2 certificates if only SSL algorithms added. + o Fix for no-rc4 compilation. + o Chil ENGINE unload workaround. + Major changes between OpenSSL 0.9.8m and OpenSSL 0.9.8n: o CFB cipher definition fixes. diff --git a/PROBLEMS b/PROBLEMS index ed3c174..d247470 100644 --- a/PROBLEMS +++ b/PROBLEMS @@ -36,7 +36,9 @@ may differ on your machine. As long as Apple doesn't fix the problem with ld, this problem building -OpenSSL will remain as is. +OpenSSL will remain as is. Well, the problem was addressed in 0.9.8f by +passing -Wl,-search_paths_first, but it's unknown if the flag was +supported from the initial MacOS X release. * Parallell make leads to errors diff --git a/README b/README index 2a96ba3..36c1d5f 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ - OpenSSL 0.9.8n + OpenSSL 0.9.8p 16 Nov 2010 Copyright (c) 1998-2009 The OpenSSL Project Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson diff --git a/apps/apps.c b/apps/apps.c index 35b62b8..a4b77e1 100644 --- a/apps/apps.c +++ b/apps/apps.c @@ -351,13 +351,12 @@ void program_name(char *in, char *out, int size) int chopup_args(ARGS *arg, char *buf, int *argc, char **argv[]) { - int num,len,i; + int num,i; char *p; *argc=0; *argv=NULL; - len=strlen(buf); i=0; if (arg->count == 0) { @@ -866,10 +865,17 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin, if (format == FORMAT_ENGINE) { if (!e) - BIO_printf(bio_err,"no engine specified\n"); + BIO_printf(err,"no engine specified\n"); else + { pkey = ENGINE_load_private_key(e, file, ui_method, &cb_data); + if (!pkey) + { + BIO_printf(err,"cannot load %s from engine\n",key_descrip); + ERR_print_errors(err); + } + } goto end; } #endif @@ -919,8 +925,11 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin, } end: if (key != NULL) BIO_free(key); - if (pkey == NULL) + if (pkey == NULL) + { BIO_printf(err,"unable to load %s\n", key_descrip); + ERR_print_errors(err); + } return(pkey); } diff --git a/apps/dh.c b/apps/dh.c index c4d891e..7e45bd3 100644 --- a/apps/dh.c +++ b/apps/dh.c @@ -88,9 +88,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif DH *dh=NULL; int i,badops=0,text=0; BIO *in=NULL,*out=NULL; @@ -189,7 +186,7 @@ bad: ERR_load_crypto_strings(); #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif in=BIO_new(BIO_s_file()); diff --git a/apps/dhparam.c b/apps/dhparam.c index 04bd57c..465cdfe 100644 --- a/apps/dhparam.c +++ b/apps/dhparam.c @@ -149,9 +149,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif DH *dh=NULL; int i,badops=0,text=0; #ifndef OPENSSL_NO_DSA @@ -270,7 +267,7 @@ bad: ERR_load_crypto_strings(); #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if (g && !num) diff --git a/apps/dsaparam.c b/apps/dsaparam.c index 4305a73..fe72c1d 100644 --- a/apps/dsaparam.c +++ b/apps/dsaparam.c @@ -111,9 +111,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif DSA *dsa=NULL; int i,badops=0,text=0; BIO *in=NULL,*out=NULL; @@ -278,7 +275,7 @@ bad: } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if (need_rand) @@ -357,12 +354,10 @@ bad: if (C) { unsigned char *data; - int l,len,bits_p,bits_q,bits_g; + int l,len,bits_p; len=BN_num_bytes(dsa->p); bits_p=BN_num_bits(dsa->p); - bits_q=BN_num_bits(dsa->q); - bits_g=BN_num_bits(dsa->g); data=(unsigned char *)OPENSSL_malloc(len+20); if (data == NULL) { diff --git a/apps/ec.c b/apps/ec.c index 771e15f..6b3d3ad 100644 --- a/apps/ec.c +++ b/apps/ec.c @@ -85,9 +85,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif int ret = 1; EC_KEY *eckey = NULL; const EC_GROUP *group; @@ -254,7 +251,7 @@ bad: ERR_load_crypto_strings(); #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) diff --git a/apps/ecparam.c b/apps/ecparam.c index 4e1fc83..2d3fd30 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -129,9 +129,6 @@ int MAIN(int argc, char **argv) char *infile = NULL, *outfile = NULL, *prog; BIO *in = NULL, *out = NULL; int informat, outformat, noout = 0, C = 0, ret = 1; -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif char *engine = NULL; BIGNUM *ec_p = NULL, *ec_a = NULL, *ec_b = NULL, @@ -340,7 +337,7 @@ bad: } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if (list_curves) diff --git a/apps/enc.c b/apps/enc.c index 8f5e5b8..8beb2df 100644 --- a/apps/enc.c +++ b/apps/enc.c @@ -100,9 +100,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif static const char magic[]="Salted__"; char mbuf[sizeof magic-1]; char *strbuf=NULL; @@ -311,7 +308,7 @@ bad: } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if (md && (dgst=EVP_get_digestbyname(md)) == NULL) diff --git a/apps/gendh.c b/apps/gendh.c index 4749786..346ea4a 100644 --- a/apps/gendh.c +++ b/apps/gendh.c @@ -89,9 +89,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { BN_GENCB cb; -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif DH *dh=NULL; int ret=1,num=DEFBITS; int g=2; @@ -163,7 +160,7 @@ bad: } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif out=BIO_new(BIO_s_file()); diff --git a/apps/gendsa.c b/apps/gendsa.c index 22c3962..62ea977 100644 --- a/apps/gendsa.c +++ b/apps/gendsa.c @@ -78,9 +78,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif DSA *dsa=NULL; int ret=1; char *outfile=NULL; @@ -206,7 +203,7 @@ bad: } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if(!app_passwd(bio_err, NULL, passargout, NULL, &passout)) { diff --git a/apps/genrsa.c b/apps/genrsa.c index 5759acb..dfb0139 100644 --- a/apps/genrsa.c +++ b/apps/genrsa.c @@ -89,9 +89,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { BN_GENCB cb; -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif int ret=1; int i,num=DEFBITS; long l; @@ -235,7 +232,7 @@ bad: } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif if (outfile == NULL) diff --git a/apps/pkcs7.c b/apps/pkcs7.c index da4dbe7..bdbb102 100644 --- a/apps/pkcs7.c +++ b/apps/pkcs7.c @@ -82,9 +82,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif PKCS7 *p7=NULL; int i,badops=0; BIO *in=NULL,*out=NULL; @@ -180,7 +177,7 @@ bad: ERR_load_crypto_strings(); #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif in=BIO_new(BIO_s_file()); diff --git a/apps/rand.c b/apps/rand.c index 44a1d46..790e795 100644 --- a/apps/rand.c +++ b/apps/rand.c @@ -77,9 +77,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif int i, r, ret = 1; int badopt; char *outfile = NULL; @@ -178,7 +175,7 @@ int MAIN(int argc, char **argv) } #ifndef OPENSSL_NO_ENGINE - e = setup_engine(bio_err, engine, 0); + setup_engine(bio_err, engine, 0); #endif app_RAND_load_file(NULL, bio_err, (inrand != NULL)); diff --git a/apps/s_server.c b/apps/s_server.c index 88b308c..9ef643e 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -2075,12 +2075,14 @@ static int www_body(char *hostname, int s, unsigned char *context) { char *buf=NULL; int ret=1; - int i,j,k,blank,dot; + int i,j,k,dot; struct stat st_buf; SSL *con; SSL_CIPHER *c; BIO *io,*ssl_bio,*sbio; +#ifdef RENEG long total_bytes; +#endif buf=OPENSSL_malloc(bufsize); if (buf == NULL) return(0); @@ -2151,7 +2153,6 @@ static int www_body(char *hostname, int s, unsigned char *context) SSL_set_msg_callback_arg(con, bio_s_out); } - blank=0; for (;;) { if (hack) @@ -2388,7 +2389,9 @@ static int www_body(char *hostname, int s, unsigned char *context) BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n"); } /* send the file */ +#ifdef RENEG total_bytes=0; +#endif for (;;) { i=BIO_read(file,buf,bufsize); diff --git a/apps/s_socket.c b/apps/s_socket.c index cf82358..6d1d7d7 100644 --- a/apps/s_socket.c +++ b/apps/s_socket.c @@ -329,7 +329,7 @@ static int init_server_long(int *sock, int port, char *ip, int type) { int ret=0; struct sockaddr_in server; - int s= -1,i; + int s= -1; if (!ssl_sock_init()) return(0); @@ -368,7 +368,6 @@ static int init_server_long(int *sock, int port, char *ip, int type) } /* Make it 128 for linux */ if (type==SOCK_STREAM && listen(s,128) == -1) goto err; - i=0; *sock=s; ret=1; err: @@ -386,7 +385,7 @@ static int init_server(int *sock, int port, int type) static int do_accept(int acc_sock, int *sock, char **host) { - int ret,i; + int ret; struct hostent *h1,*h2; static struct sockaddr_in from; int len; @@ -409,6 +408,7 @@ redoit: if (ret == INVALID_SOCKET) { #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) + int i; i=WSAGetLastError(); BIO_printf(bio_err,"accept error %d\n",i); #else @@ -463,7 +463,6 @@ redoit: BIO_printf(bio_err,"gethostbyname failure\n"); return(0); } - i=0; if (h2->h_addrtype != AF_INET) { BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); diff --git a/apps/speed.c b/apps/speed.c index 393a7ba..84ce35d 100644 --- a/apps/speed.c +++ b/apps/speed.c @@ -500,9 +500,6 @@ int MAIN(int, char **); int MAIN(int argc, char **argv) { -#ifndef OPENSSL_NO_ENGINE - ENGINE *e = NULL; -#endif unsigned char *buf=NULL,*buf2=NULL; int mret=1; long count=0,save_count=0; @@ -593,7 +590,6 @@ int MAIN(int argc, char **argv) unsigned char DES_iv[8]; unsigned char iv[2*MAX_BLOCK_SIZE/8]; #ifndef OPENSSL_NO_DES - DES_cblock *buf_as_des_cblock = NULL; static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; @@ -806,9 +802,6 @@ int MAIN(int argc, char **argv) BIO_printf(bio_err,"out of memory\n"); goto end; } -#ifndef OPENSSL_NO_DES - buf_as_des_cblock = (DES_cblock *)buf; -#endif if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL) { BIO_printf(bio_err,"out of memory\n"); @@ -883,7 +876,7 @@ int MAIN(int argc, char **argv) BIO_printf(bio_err,"no engine given\n"); goto end; } - e = setup_engine(bio_err, *argv, 0); + setup_engine(bio_err, *argv, 0); /* j will be increased again further down. We just don't want speed to confuse an engine with an algorithm, especially when none is given (which @@ -1388,7 +1381,8 @@ int MAIN(int argc, char **argv) count*=2; Time_F(START); for (it=count; it; it--) - DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock, + DES_ecb_encrypt((DES_cblock *)buf, + (DES_cblock *)buf, &sch,DES_ENCRYPT); d=Time_F(STOP); } while (d <3); diff --git a/apps/x509.c b/apps/x509.c index b25508a..151d3a91 100644 --- a/apps/x509.c +++ b/apps/x509.c @@ -539,7 +539,6 @@ bad: if (reqfile) { EVP_PKEY *pkey; - X509_CINF *ci; BIO *in; if (!sign_flag && !CA_flag) @@ -607,7 +606,6 @@ bad: print_name(bio_err, "subject=", X509_REQ_get_subject_name(req), nmflag); if ((x=X509_new()) == NULL) goto end; - ci=x->cert_info; if (sno == NULL) { diff --git a/crypto/aes/aes_wrap.c b/crypto/aes/aes_wrap.c index 9feacd6..e2d73d3 100644 --- a/crypto/aes/aes_wrap.c +++ b/crypto/aes/aes_wrap.c @@ -85,9 +85,9 @@ int AES_wrap_key(AES_KEY *key, const unsigned char *iv, A[7] ^= (unsigned char)(t & 0xff); if (t > 0xff) { - A[6] ^= (unsigned char)((t & 0xff) >> 8); - A[5] ^= (unsigned char)((t & 0xff) >> 16); - A[4] ^= (unsigned char)((t & 0xff) >> 24); + A[6] ^= (unsigned char)((t >> 8) & 0xff); + A[5] ^= (unsigned char)((t >> 16) & 0xff); + A[4] ^= (unsigned char)((t >> 24) & 0xff); } memcpy(R, B + 8, 8); } @@ -119,9 +119,9 @@ int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, A[7] ^= (unsigned char)(t & 0xff); if (t > 0xff) { - A[6] ^= (unsigned char)((t & 0xff) >> 8); - A[5] ^= (unsigned char)((t & 0xff) >> 16); - A[4] ^= (unsigned char)((t & 0xff) >> 24); + A[6] ^= (unsigned char)((t >> 8) & 0xff); + A[5] ^= (unsigned char)((t >> 16) & 0xff); + A[4] ^= (unsigned char)((t >> 24) & 0xff); } memcpy(B + 8, R, 8); AES_decrypt(B, B, key); diff --git a/crypto/aes/asm/aes-x86_64.pl b/crypto/aes/asm/aes-x86_64.pl index b008ab5..b510057 100755 --- a/crypto/aes/asm/aes-x86_64.pl +++ b/crypto/aes/asm/aes-x86_64.pl @@ -751,7 +751,19 @@ $code.=<<___; AES_set_encrypt_key: push %rbx push %rbp + sub \$8,%rsp + call _x86_64_AES_set_encrypt_key + + mov 8(%rsp),%rbp + mov 16(%rsp),%rbx + add \$24,%rsp + ret +.size AES_set_encrypt_key,.-AES_set_encrypt_key + +.type _x86_64_AES_set_encrypt_key,\@abi-omnipotent +.align 16 +_x86_64_AES_set_encrypt_key: mov %esi,%ecx # %ecx=bits mov %rdi,%rsi # %rsi=userKey mov %rdx,%rdi # %rdi=key @@ -938,10 +950,8 @@ $code.=<<___; .Lbadpointer: mov \$-1,%rax .Lexit: - pop %rbp - pop %rbx - ret -.size AES_set_encrypt_key,.-AES_set_encrypt_key + .byte 0xf3,0xc3 # rep ret +.size _x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key ___ sub deckey() @@ -973,15 +983,14 @@ $code.=<<___; .type AES_set_decrypt_key,\@function,3 .align 16 AES_set_decrypt_key: - push %rdx - call AES_set_encrypt_key - cmp \$0,%eax - je .Lproceed - lea 24(%rsp),%rsp - ret -.Lproceed: + push %rbx + push %rbp + push %rdx # save key schedule + + call _x86_64_AES_set_encrypt_key mov (%rsp),%r8 # restore key schedule - mov %rbx,(%rsp) + cmp \$0,%eax + jne .Labort mov 240(%r8),%ecx # pull number of rounds xor %rdi,%rdi @@ -1023,7 +1032,10 @@ $code.=<<___; jnz .Lpermute xor %rax,%rax - pop %rbx +.Labort: + mov 8(%rsp),%rbp + mov 16(%rsp),%rbx + add \$24,%rsp ret .size AES_set_decrypt_key,.-AES_set_decrypt_key ___ diff --git a/crypto/asn1/a_int.c b/crypto/asn1/a_int.c index f8d198e..f551bdb 100644 --- a/crypto/asn1/a_int.c +++ b/crypto/asn1/a_int.c @@ -273,7 +273,7 @@ ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, { ASN1_INTEGER *ret=NULL; const unsigned char *p; - unsigned char *to,*s; + unsigned char *s; long len; int inf,tag,xclass; int i; @@ -308,7 +308,6 @@ ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, i=ERR_R_MALLOC_FAILURE; goto err; } - to=s; ret->type=V_ASN1_INTEGER; if(len) { if ((*p == 0) && (len != 1)) diff --git a/crypto/asn1/n_pkey.c b/crypto/asn1/n_pkey.c index 60bc437..e7d0439 100644 --- a/crypto/asn1/n_pkey.c +++ b/crypto/asn1/n_pkey.c @@ -242,7 +242,7 @@ RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, int sgckey) { RSA *ret=NULL; - const unsigned char *p, *kp; + const unsigned char *p; NETSCAPE_ENCRYPTED_PKEY *enckey = NULL; p = *pp; @@ -265,7 +265,6 @@ RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, ASN1err(ASN1_F_D2I_RSA_NET,ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM); goto err; } - kp = enckey->enckey->digest->data; if (cb == NULL) cb=EVP_read_pw_string; if ((ret=d2i_RSA_NET_2(a, enckey->enckey->digest,cb, sgckey)) == NULL) goto err; diff --git a/crypto/asn1/t_crl.c b/crypto/asn1/t_crl.c index bdb244c..ee5a687 100644 --- a/crypto/asn1/t_crl.c +++ b/crypto/asn1/t_crl.c @@ -87,7 +87,7 @@ int X509_CRL_print(BIO *out, X509_CRL *x) STACK_OF(X509_REVOKED) *rev; X509_REVOKED *r; long l; - int i, n; + int i; char *p; BIO_printf(out, "Certificate Revocation List (CRL):\n"); @@ -107,7 +107,6 @@ int X509_CRL_print(BIO *out, X509_CRL *x) else BIO_printf(out,"NONE"); BIO_printf(out,"\n"); - n=X509_CRL_get_ext_count(x); X509V3_extensions_print(out, "CRL extensions", x->crl->extensions, 0, 8); diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 48bc1c0..a228c0d 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -166,7 +166,7 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, int i; int otag; int ret = 0; - ASN1_VALUE *pchval, **pchptr, *ptmpval; + ASN1_VALUE **pchptr, *ptmpval; if (!pval) return 0; if (aux && aux->asn1_cb) @@ -317,7 +317,6 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, goto err; } /* CHOICE type, try each possibility in turn */ - pchval = NULL; p = *in; for (i = 0, tt=it->templates; i < it->tcount; i++, tt++) { diff --git a/crypto/asn1/x_x509.c b/crypto/asn1/x_x509.c index e118696..088d550 100644 --- a/crypto/asn1/x_x509.c +++ b/crypto/asn1/x_x509.c @@ -63,7 +63,7 @@ #include #include -ASN1_SEQUENCE(X509_CINF) = { +ASN1_SEQUENCE_enc(X509_CINF, enc, 0) = { ASN1_EXP_OPT(X509_CINF, version, ASN1_INTEGER, 0), ASN1_SIMPLE(X509_CINF, serialNumber, ASN1_INTEGER), ASN1_SIMPLE(X509_CINF, signature, X509_ALGOR), @@ -74,7 +74,7 @@ ASN1_SEQUENCE(X509_CINF) = { ASN1_IMP_OPT(X509_CINF, issuerUID, ASN1_BIT_STRING, 1), ASN1_IMP_OPT(X509_CINF, subjectUID, ASN1_BIT_STRING, 2), ASN1_EXP_SEQUENCE_OF_OPT(X509_CINF, extensions, X509_EXTENSION, 3) -} ASN1_SEQUENCE_END(X509_CINF) +} ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF) IMPLEMENT_ASN1_FUNCTIONS(X509_CINF) /* X509 top level structure needs a bit of customisation */ diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index ead477d..f0d9cfc 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -659,7 +659,14 @@ again: #ifdef SO_REUSEADDR err_num=get_last_socket_error(); if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && +#ifdef OPENSSL_SYS_WINDOWS + /* Some versions of Windows define EADDRINUSE to + * a dummy value. + */ + (err_num == WSAEADDRINUSE)) +#else (err_num == EADDRINUSE)) +#endif { memcpy((char *)&client,(char *)&server,sizeof(server)); if (strcmp(h,"*") == 0) diff --git a/crypto/bio/bf_nbio.c b/crypto/bio/bf_nbio.c index c72a23c..028616c 100644 --- a/crypto/bio/bf_nbio.c +++ b/crypto/bio/bf_nbio.c @@ -125,7 +125,6 @@ static int nbiof_free(BIO *a) static int nbiof_read(BIO *b, char *out, int outl) { - NBIO_TEST *nt; int ret=0; #if 1 int num; @@ -134,7 +133,6 @@ static int nbiof_read(BIO *b, char *out, int outl) if (out == NULL) return(0); if (b->next_bio == NULL) return(0); - nt=(NBIO_TEST *)b->ptr; BIO_clear_retry_flags(b); #if 1 diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index 3f52ae9..371cdf5 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -110,7 +110,7 @@ int BIO_set(BIO *bio, BIO_METHOD *method) int BIO_free(BIO *a) { - int ret=0,i; + int i; if (a == NULL) return(0); @@ -133,7 +133,7 @@ int BIO_free(BIO *a) CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); - ret=a->method->destroy(a); + a->method->destroy(a); OPENSSL_free(a); return(1); } diff --git a/crypto/bio/bss_acpt.c b/crypto/bio/bss_acpt.c index d090b72..e7fb892 100644 --- a/crypto/bio/bss_acpt.c +++ b/crypto/bio/bss_acpt.c @@ -340,7 +340,6 @@ static int acpt_write(BIO *b, const char *in, int inl) static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) { - BIO *dbio; int *ip; long ret=1; BIO_ACCEPT *data; @@ -437,8 +436,8 @@ static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) ret=(long)data->bind_mode; break; case BIO_CTRL_DUP: - dbio=(BIO *)ptr; -/* if (data->param_port) EAY EAY +/* dbio=(BIO *)ptr; + if (data->param_port) EAY EAY BIO_set_port(dbio,data->param_port); if (data->param_hostname) BIO_set_hostname(dbio,data->param_hostname); diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c index 30c3cea..3df3193 100644 --- a/crypto/bio/bss_sock.c +++ b/crypto/bio/bss_sock.c @@ -172,15 +172,6 @@ static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) switch (cmd) { - case BIO_CTRL_RESET: - num=0; - case BIO_C_FILE_SEEK: - ret=0; - break; - case BIO_C_FILE_TELL: - case BIO_CTRL_INFO: - ret=0; - break; case BIO_C_SET_FD: sock_free(b); b->num= *((int *)ptr); @@ -203,10 +194,6 @@ static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) case BIO_CTRL_SET_CLOSE: b->shutdown=(int)num; break; - case BIO_CTRL_PENDING: - case BIO_CTRL_WPENDING: - ret=0; - break; case BIO_CTRL_DUP: case BIO_CTRL_FLUSH: ret=1; diff --git a/crypto/bn/bn_exp2.c b/crypto/bn/bn_exp2.c index b3f43ce..bd0c34b 100644 --- a/crypto/bn/bn_exp2.c +++ b/crypto/bn/bn_exp2.c @@ -301,7 +301,8 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, r_is_one = 0; } } - BN_from_montgomery(rr,r,mont,ctx); + if (!BN_from_montgomery(rr,r,mont,ctx)) + goto err; ret=1; err: if ((in_mont == NULL) && (mont != NULL)) BN_MONT_CTX_free(mont); diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index a0e9ec3..12e5be8 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -551,7 +551,7 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, int tna, int tnb, BN_ULONG *t) { int i,j,n2=n*2; - int c1,c2,neg,zero; + int c1,c2,neg; BN_ULONG ln,lo,*p; # ifdef BN_COUNT @@ -567,7 +567,7 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, /* r=(a[0]-a[1])*(b[1]-b[0]) */ c1=bn_cmp_part_words(a,&(a[n]),tna,n-tna); c2=bn_cmp_part_words(&(b[n]),b,tnb,tnb-n); - zero=neg=0; + neg=0; switch (c1*3+c2) { case -4: @@ -575,7 +575,6 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, bn_sub_part_words(&(t[n]),b, &(b[n]),tnb,n-tnb); /* - */ break; case -3: - zero=1; /* break; */ case -2: bn_sub_part_words(t, &(a[n]),a, tna,tna-n); /* - */ @@ -585,7 +584,6 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, case -1: case 0: case 1: - zero=1; /* break; */ case 2: bn_sub_part_words(t, a, &(a[n]),tna,n-tna); /* + */ @@ -593,7 +591,6 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, neg=1; break; case 3: - zero=1; /* break; */ case 4: bn_sub_part_words(t, a, &(a[n]),tna,n-tna); @@ -1012,7 +1009,6 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { if (i >= -1 && i <= 1) { - int sav_j =0; /* Find out the power of two lower or equal to the longest of the two numbers */ if (i >= 0) @@ -1023,7 +1019,6 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { j = BN_num_bits_word((BN_ULONG)bl); } - sav_j = j; j = 1<<(j-1); assert(j <= al || j <= bl); k = j+j; diff --git a/crypto/cms/cms_asn1.c b/crypto/cms/cms_asn1.c index 7664921..b253d54 100644 --- a/crypto/cms/cms_asn1.c +++ b/crypto/cms/cms_asn1.c @@ -130,8 +130,8 @@ ASN1_NDEF_SEQUENCE(CMS_SignedData) = { } ASN1_NDEF_SEQUENCE_END(CMS_SignedData) ASN1_SEQUENCE(CMS_OriginatorInfo) = { - ASN1_IMP_SET_OF_OPT(CMS_SignedData, certificates, CMS_CertificateChoices, 0), - ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1) + ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, certificates, CMS_CertificateChoices, 0), + ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, crls, CMS_RevocationInfoChoice, 1) } ASN1_SEQUENCE_END(CMS_OriginatorInfo) ASN1_NDEF_SEQUENCE(CMS_EncryptedContentInfo) = { diff --git a/crypto/conf/conf_def.c b/crypto/conf/conf_def.c index d8bce87..3c58936 100644 --- a/crypto/conf/conf_def.c +++ b/crypto/conf/conf_def.c @@ -213,13 +213,14 @@ static int def_load_bio(CONF *conf, BIO *in, long *line) int bufnum=0,i,ii; BUF_MEM *buff=NULL; char *s,*p,*end; - int again,n; + int again; long eline=0; char btmp[DECIMAL_SIZE(eline)+1]; CONF_VALUE *v=NULL,*tv; CONF_VALUE *sv=NULL; char *section=NULL,*buf; - STACK_OF(CONF_VALUE) *section_sk=NULL,*ts; +/* STACK_OF(CONF_VALUE) *section_sk=NULL;*/ +/* STACK_OF(CONF_VALUE) *ts=NULL;*/ char *start,*psection,*pname; void *h = (void *)(conf->data); @@ -250,7 +251,7 @@ static int def_load_bio(CONF *conf, BIO *in, long *line) CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } - section_sk=(STACK_OF(CONF_VALUE) *)sv->value; +/* section_sk=(STACK_OF(CONF_VALUE) *)sv->value;*/ bufnum=0; again=0; @@ -309,7 +310,6 @@ static int def_load_bio(CONF *conf, BIO *in, long *line) buf=buff->data; clear_comments(conf, buf); - n=strlen(buf); s=eat_ws(conf, buf); if (IS_EOF(conf,*s)) continue; /* blank line */ if (*s == '[') @@ -343,7 +343,7 @@ again: CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } - section_sk=(STACK_OF(CONF_VALUE) *)sv->value; +/* section_sk=(STACK_OF(CONF_VALUE) *)sv->value;*/ continue; } else @@ -406,12 +406,12 @@ again: CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } - ts=(STACK_OF(CONF_VALUE) *)tv->value; +/* ts=(STACK_OF(CONF_VALUE) *)tv->value;*/ } else { tv=sv; - ts=section_sk; +/* ts=section_sk;*/ } #if 1 if (_CONF_add_string(conf, tv, v) == 0) @@ -465,9 +465,6 @@ err: static void clear_comments(CONF *conf, char *p) { - char *to; - - to=p; for (;;) { if (IS_FCOMMENT(conf,*p)) diff --git a/crypto/des/rpc_des.h b/crypto/des/rpc_des.h index 4cbb4d2..41328d7 100644 --- a/crypto/des/rpc_des.h +++ b/crypto/des/rpc_des.h @@ -122,10 +122,10 @@ struct desparams { /* * Encrypt an arbitrary sized buffer */ -#define DESIOCBLOCK _IOWR(d, 6, struct desparams) +#define DESIOCBLOCK _IOWR('d', 6, struct desparams) /* * Encrypt of small amount of data, quickly */ -#define DESIOCQUICK _IOWR(d, 7, struct desparams) +#define DESIOCQUICK _IOWR('d', 7, struct desparams) diff --git a/crypto/dsa/dsa_gen.c b/crypto/dsa/dsa_gen.c index 6f1728e..7a9d188 100644 --- a/crypto/dsa/dsa_gen.c +++ b/crypto/dsa/dsa_gen.c @@ -110,7 +110,7 @@ static int dsa_builtin_paramgen(DSA *ret, int bits, BIGNUM *r0,*W,*X,*c,*test; BIGNUM *g=NULL,*q=NULL,*p=NULL; BN_MONT_CTX *mont=NULL; - int k,n=0,i,b,m=0; + int k,n=0,i,m=0; int counter=0; int r=0; BN_CTX *ctx=NULL; @@ -211,7 +211,6 @@ static int dsa_builtin_paramgen(DSA *ret, int bits, /* "offset = 2" */ n=(bits-1)/160; - b=(bits-1)-n*160; for (;;) { diff --git a/crypto/dsa/dsa_ossl.c b/crypto/dsa/dsa_ossl.c index 412cf1d..1727760 100644 --- a/crypto/dsa/dsa_ossl.c +++ b/crypto/dsa/dsa_ossl.c @@ -178,7 +178,8 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) if (!BN_mod_mul(&xr,dsa->priv_key,r,dsa->q,ctx)) goto err;/* s = xr */ if (!BN_add(s, &xr, &m)) goto err; /* s = m + xr */ if (BN_cmp(s,dsa->q) > 0) - BN_sub(s,s,dsa->q); + if (!BN_sub(s,s,dsa->q)) + goto err; if (!BN_mod_mul(s,s,kinv,dsa->q,ctx)) goto err; ret=DSA_SIG_new(); diff --git a/crypto/ec/ec2_mult.c b/crypto/ec/ec2_mult.c index ff368fd..7dca5e4 100644 --- a/crypto/ec/ec2_mult.c +++ b/crypto/ec/ec2_mult.c @@ -318,6 +318,7 @@ int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, int ret = 0; size_t i; EC_POINT *p=NULL; + EC_POINT *acc = NULL; if (ctx == NULL) { @@ -337,15 +338,16 @@ int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, } if ((p = EC_POINT_new(group)) == NULL) goto err; + if ((acc = EC_POINT_new(group)) == NULL) goto err; - if (!EC_POINT_set_to_infinity(group, r)) goto err; + if (!EC_POINT_set_to_infinity(group, acc)) goto err; if (scalar) { if (!ec_GF2m_montgomery_point_multiply(group, p, scalar, group->generator, ctx)) goto err; - if (BN_is_negative(scalar)) + if (BN_is_negative(scalar)) if (!group->meth->invert(group, p, ctx)) goto err; - if (!group->meth->add(group, r, r, p, ctx)) goto err; + if (!group->meth->add(group, acc, acc, p, ctx)) goto err; } for (i = 0; i < num; i++) @@ -353,13 +355,16 @@ int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, if (!ec_GF2m_montgomery_point_multiply(group, p, scalars[i], points[i], ctx)) goto err; if (BN_is_negative(scalars[i])) if (!group->meth->invert(group, p, ctx)) goto err; - if (!group->meth->add(group, r, r, p, ctx)) goto err; + if (!group->meth->add(group, acc, acc, p, ctx)) goto err; } + if (!EC_POINT_copy(r, acc)) goto err; + ret = 1; err: if (p) EC_POINT_free(p); + if (acc) EC_POINT_free(acc); if (new_ctx != NULL) BN_CTX_free(new_ctx); return ret; diff --git a/crypto/ec/ec_mult.c b/crypto/ec/ec_mult.c index 2ba173e..ee42269 100644 --- a/crypto/ec/ec_mult.c +++ b/crypto/ec/ec_mult.c @@ -169,11 +169,13 @@ static void ec_pre_comp_clear_free(void *pre_) EC_POINT **p; for (p = pre->points; *p != NULL; p++) + { EC_POINT_clear_free(*p); - OPENSSL_cleanse(pre->points, sizeof pre->points); + OPENSSL_cleanse(p, sizeof *p); + } OPENSSL_free(pre->points); } - OPENSSL_cleanse(pre, sizeof pre); + OPENSSL_cleanse(pre, sizeof *pre); OPENSSL_free(pre); } diff --git a/crypto/ecdh/ech_lib.c b/crypto/ecdh/ech_lib.c index e89b1d4..bf22234 100644 --- a/crypto/ecdh/ech_lib.c +++ b/crypto/ecdh/ech_lib.c @@ -96,7 +96,6 @@ const ECDH_METHOD *ECDH_get_default_method(void) int ECDH_set_method(EC_KEY *eckey, const ECDH_METHOD *meth) { - const ECDH_METHOD *mtmp; ECDH_DATA *ecdh; ecdh = ecdh_check(eckey); @@ -104,11 +103,6 @@ int ECDH_set_method(EC_KEY *eckey, const ECDH_METHOD *meth) if (ecdh == NULL) return 0; - mtmp = ecdh->meth; -#if 0 - if (mtmp->finish) - mtmp->finish(eckey); -#endif #ifndef OPENSSL_NO_ENGINE if (ecdh->engine) { diff --git a/crypto/ecdsa/ecs_lib.c b/crypto/ecdsa/ecs_lib.c index 85e8a3a..2ebae3a 100644 --- a/crypto/ecdsa/ecs_lib.c +++ b/crypto/ecdsa/ecs_lib.c @@ -83,7 +83,6 @@ const ECDSA_METHOD *ECDSA_get_default_method(void) int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth) { - const ECDSA_METHOD *mtmp; ECDSA_DATA *ecdsa; ecdsa = ecdsa_check(eckey); @@ -91,7 +90,6 @@ int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth) if (ecdsa == NULL) return 0; - mtmp = ecdsa->meth; #ifndef OPENSSL_NO_ENGINE if (ecdsa->engine) { diff --git a/crypto/engine/eng_list.c b/crypto/engine/eng_list.c index bd51194..fa2ab97 100644 --- a/crypto/engine/eng_list.c +++ b/crypto/engine/eng_list.c @@ -412,6 +412,7 @@ ENGINE *ENGINE_by_id(const char *id) return iterator; } notfound: + ENGINE_free(iterator); ENGINEerr(ENGINE_F_ENGINE_BY_ID,ENGINE_R_NO_SUCH_ENGINE); ERR_add_error_data(2, "id=", id); return NULL; diff --git a/crypto/err/err_prn.c b/crypto/err/err_prn.c index 4cdf342..1e46f93 100644 --- a/crypto/err/err_prn.c +++ b/crypto/err/err_prn.c @@ -79,14 +79,20 @@ void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), ERR_error_string_n(l, buf, sizeof buf); BIO_snprintf(buf2, sizeof(buf2), "%lu:%s:%s:%d:%s\n", es, buf, file, line, (flags & ERR_TXT_STRING) ? data : ""); - cb(buf2, strlen(buf2), u); + if (cb(buf2, strlen(buf2), u) <= 0) + break; /* abort outputting the error report */ } } #ifndef OPENSSL_NO_FP_API static int print_fp(const char *str, size_t len, void *fp) { - return fwrite(str, 1, len, fp); + BIO bio; + + BIO_set(&bio,BIO_s_file()); + BIO_set_fp(&bio,fp,BIO_NOCLOSE); + + return BIO_printf(&bio, "%s", str); } void ERR_print_errors_fp(FILE *fp) { diff --git a/crypto/evp/bio_b64.c b/crypto/evp/bio_b64.c index fa5cbc7..72a2a67 100644 --- a/crypto/evp/bio_b64.c +++ b/crypto/evp/bio_b64.c @@ -64,7 +64,7 @@ static int b64_write(BIO *h, const char *buf, int num); static int b64_read(BIO *h, char *buf, int size); -/*static int b64_puts(BIO *h, const char *str); */ +static int b64_puts(BIO *h, const char *str); /*static int b64_gets(BIO *h, char *str, int size); */ static long b64_ctrl(BIO *h, int cmd, long arg1, void *arg2); static int b64_new(BIO *h); @@ -96,7 +96,7 @@ static BIO_METHOD methods_b64= BIO_TYPE_BASE64,"base64 encoding", b64_write, b64_read, - NULL, /* b64_puts, */ + b64_puts, NULL, /* b64_gets, */ b64_ctrl, b64_new, @@ -127,6 +127,7 @@ static int b64_new(BIO *bi) bi->init=1; bi->ptr=(char *)ctx; bi->flags=0; + bi->num = 0; return(1); } @@ -151,6 +152,8 @@ static int b64_read(BIO *b, char *out, int outl) if ((ctx == NULL) || (b->next_bio == NULL)) return(0); + BIO_clear_retry_flags(b); + if (ctx->encode != B64_DECODE) { ctx->encode=B64_DECODE; @@ -163,6 +166,7 @@ static int b64_read(BIO *b, char *out, int outl) /* First check if there are bytes decoded/encoded */ if (ctx->buf_len > 0) { + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); i=ctx->buf_len-ctx->buf_off; if (i > outl) i=outl; OPENSSL_assert(ctx->buf_off+i < (int)sizeof(ctx->buf)); @@ -184,7 +188,6 @@ static int b64_read(BIO *b, char *out, int outl) ret_code=0; while (outl > 0) { - if (ctx->cont <= 0) break; @@ -195,7 +198,7 @@ static int b64_read(BIO *b, char *out, int outl) { ret_code=i; - /* Should be continue next time we are called? */ + /* Should we continue next time we are called? */ if (!BIO_should_retry(b->next_bio)) { ctx->cont=i; @@ -285,19 +288,27 @@ static int b64_read(BIO *b, char *out, int outl) continue; } else + { ctx->tmp_len=0; } - /* If buffer isn't full and we can retry then - * restart to read in more data. - */ + } else if ((i < B64_BLOCK_SIZE) && (ctx->cont > 0)) + { + /* If buffer isn't full and we can retry then + * restart to read in more data. + */ continue; + } if (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL) { int z,jj; +#if 0 jj=(i>>2)<<2; +#else + jj = i & ~3; /* process per 4 */ +#endif z=EVP_DecodeBlock((unsigned char *)ctx->buf, (unsigned char *)ctx->tmp,jj); if (jj > 2) @@ -313,18 +324,15 @@ static int b64_read(BIO *b, char *out, int outl) * number consumed */ if (jj != i) { - memcpy((unsigned char *)ctx->tmp, - (unsigned char *)&(ctx->tmp[jj]),i-jj); + memmove(ctx->tmp, &ctx->tmp[jj], i-jj); ctx->tmp_len=i-jj; } ctx->buf_len=0; if (z > 0) { ctx->buf_len=z; - i=1; } - else - i=z; + i=z; } else { @@ -357,14 +365,16 @@ static int b64_read(BIO *b, char *out, int outl) outl-=i; out+=i; } - BIO_clear_retry_flags(b); + /* BIO_clear_retry_flags(b); */ BIO_copy_next_retry(b); return((ret == 0)?ret_code:ret); } static int b64_write(BIO *b, const char *in, int inl) { - int ret=inl,n,i; + int ret=0; + int n; + int i; BIO_B64_CTX *ctx; ctx=(BIO_B64_CTX *)b->ptr; @@ -379,6 +389,9 @@ static int b64_write(BIO *b, const char *in, int inl) EVP_EncodeInit(&(ctx->base64)); } + OPENSSL_assert(ctx->buf_off < (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len <= (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); n=ctx->buf_len-ctx->buf_off; while (n > 0) { @@ -388,7 +401,10 @@ static int b64_write(BIO *b, const char *in, int inl) BIO_copy_next_retry(b); return(i); } + OPENSSL_assert(i <= n); ctx->buf_off+=i; + OPENSSL_assert(ctx->buf_off <= (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); n-=i; } /* at this point all pending data has been written */ @@ -405,18 +421,19 @@ static int b64_write(BIO *b, const char *in, int inl) { if (ctx->tmp_len > 0) { + OPENSSL_assert(ctx->tmp_len <= 3); n=3-ctx->tmp_len; - /* There's a teoretical possibility for this */ + /* There's a theoretical possibility for this */ if (n > inl) n=inl; memcpy(&(ctx->tmp[ctx->tmp_len]),in,n); ctx->tmp_len+=n; + ret += n; if (ctx->tmp_len < 3) break; - ctx->buf_len=EVP_EncodeBlock( - (unsigned char *)ctx->buf, - (unsigned char *)ctx->tmp, - ctx->tmp_len); + ctx->buf_len=EVP_EncodeBlock((unsigned char *)ctx->buf,(unsigned char *)ctx->tmp,ctx->tmp_len); + OPENSSL_assert(ctx->buf_len <= (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); /* Since we're now done using the temporary buffer, the length should be 0'd */ ctx->tmp_len=0; @@ -425,14 +442,16 @@ static int b64_write(BIO *b, const char *in, int inl) { if (n < 3) { - memcpy(&(ctx->tmp[0]),in,n); + memcpy(ctx->tmp,in,n); ctx->tmp_len=n; + ret += n; break; } n-=n%3; - ctx->buf_len=EVP_EncodeBlock( - (unsigned char *)ctx->buf, - (unsigned char *)in,n); + ctx->buf_len=EVP_EncodeBlock((unsigned char *)ctx->buf,(const unsigned char *)in,n); + OPENSSL_assert(ctx->buf_len <= (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); + ret += n; } } else @@ -440,6 +459,9 @@ static int b64_write(BIO *b, const char *in, int inl) EVP_EncodeUpdate(&(ctx->base64), (unsigned char *)ctx->buf,&ctx->buf_len, (unsigned char *)in,n); + OPENSSL_assert(ctx->buf_len <= (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); + ret += n; } inl-=n; in+=n; @@ -454,8 +476,11 @@ static int b64_write(BIO *b, const char *in, int inl) BIO_copy_next_retry(b); return((ret == 0)?i:ret); } + OPENSSL_assert(i <= n); n-=i; ctx->buf_off+=i; + OPENSSL_assert(ctx->buf_off <= (int)sizeof(ctx->buf)); + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); } ctx->buf_len=0; ctx->buf_off=0; @@ -486,6 +511,7 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) ret=BIO_ctrl(b->next_bio,cmd,num,ptr); break; case BIO_CTRL_WPENDING: /* More to write in buffer */ + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); ret=ctx->buf_len-ctx->buf_off; if ((ret == 0) && (ctx->encode != B64_NONE) && (ctx->base64.num != 0)) @@ -494,6 +520,7 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) ret=BIO_ctrl(b->next_bio,cmd,num,ptr); break; case BIO_CTRL_PENDING: /* More to read in buffer */ + OPENSSL_assert(ctx->buf_len >= ctx->buf_off); ret=ctx->buf_len-ctx->buf_off; if (ret <= 0) ret=BIO_ctrl(b->next_bio,cmd,num,ptr); @@ -565,3 +592,7 @@ static long b64_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) return(ret); } +static int b64_puts(BIO *b, const char *str) + { + return b64_write(b,str,strlen(str)); + } diff --git a/crypto/evp/enc_min.c b/crypto/evp/enc_min.c index 7fba38e..a8c176f 100644 --- a/crypto/evp/enc_min.c +++ b/crypto/evp/enc_min.c @@ -279,6 +279,7 @@ skip_to_init: case EVP_CIPH_OFB_MODE: ctx->num = 0; + /* fall-through */ case EVP_CIPH_CBC_MODE: diff --git a/crypto/evp/encode.c b/crypto/evp/encode.c index 5921f0d..e8a5218 100644 --- a/crypto/evp/encode.c +++ b/crypto/evp/encode.c @@ -235,7 +235,7 @@ void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl) { - int seof= -1,eof=0,rv= -1,ret=0,i,v,tmp,n,ln,tmp2,exp_nl; + int seof= -1,eof=0,rv= -1,ret=0,i,v,tmp,n,ln,exp_nl; unsigned char *d; n=ctx->num; @@ -319,7 +319,6 @@ int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, * lines. We process the line and then need to * accept the '\n' */ if ((v != B64_EOF) && (n >= 64)) exp_nl=1; - tmp2=v; if (n > 0) { v=EVP_DecodeBlock(out,d,n); diff --git a/crypto/evp/evp_pbe.c b/crypto/evp/evp_pbe.c index 5e830be..766ea42 100644 --- a/crypto/evp/evp_pbe.c +++ b/crypto/evp/evp_pbe.c @@ -116,17 +116,50 @@ static int pbe_cmp(const char * const *a, const char * const *b) int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, EVP_PBE_KEYGEN *keygen) { - EVP_PBE_CTL *pbe_tmp; - if (!pbe_algs) pbe_algs = sk_new(pbe_cmp); - if (!(pbe_tmp = (EVP_PBE_CTL*) OPENSSL_malloc (sizeof(EVP_PBE_CTL)))) { - EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE); - return 0; - } - pbe_tmp->pbe_nid = nid; + EVP_PBE_CTL *pbe_tmp = NULL, pbelu; + int i; + if (!pbe_algs) + { + pbe_algs = sk_new(pbe_cmp); + if (!pbe_algs) + { + EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE); + return 0; + } + } + else + { + /* Check if already present */ + pbelu.pbe_nid = nid; + i = sk_find(pbe_algs, (char *)&pbelu); + if (i >= 0) + { + pbe_tmp = (EVP_PBE_CTL *)sk_value(pbe_algs, i); + /* If everything identical leave alone */ + if (pbe_tmp->cipher == cipher + && pbe_tmp->md == md + && pbe_tmp->keygen == keygen) + return 1; + } + } + + if (!pbe_tmp) + { + pbe_tmp = OPENSSL_malloc (sizeof(EVP_PBE_CTL)); + if (!pbe_tmp) + { + EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE); + return 0; + } + /* If adding a new PBE, set nid, append and sort */ + pbe_tmp->pbe_nid = nid; + sk_push (pbe_algs, (char *)pbe_tmp); + sk_sort(pbe_algs); + } + pbe_tmp->cipher = cipher; pbe_tmp->md = md; pbe_tmp->keygen = keygen; - sk_push (pbe_algs, (char *)pbe_tmp); return 1; } diff --git a/crypto/hmac/hmac.c b/crypto/hmac/hmac.c index cbc1c76..6899be6 100644 --- a/crypto/hmac/hmac.c +++ b/crypto/hmac/hmac.c @@ -130,12 +130,9 @@ void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len) void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) { - int j; unsigned int i; unsigned char buf[EVP_MAX_MD_SIZE]; - j=EVP_MD_block_size(ctx->md); - EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i); EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx); EVP_DigestUpdate(&ctx->md_ctx,buf,i); diff --git a/crypto/md32_common.h b/crypto/md32_common.h index 606aea6..e0deb78 100644 --- a/crypto/md32_common.h +++ b/crypto/md32_common.h @@ -242,7 +242,7 @@ # if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) # if defined(__s390x__) # define HOST_c2l(c,l) ({ asm ("lrv %0,%1" \ - :"=d"(l) :"m"(*(const unsigned int *)(c));\ + :"=d"(l) :"m"(*(const unsigned int *)(c)));\ (c)+=4; (l); }) # define HOST_l2c(l,c) ({ asm ("strv %1,%0" \ :"=m"(*(unsigned int *)(c)) :"d"(l));\ diff --git a/crypto/o_init.c b/crypto/o_init.c index 2a5f5aa..d767a90 100644 --- a/crypto/o_init.c +++ b/crypto/o_init.c @@ -58,11 +58,16 @@ #include #include + /* Internal only functions: only ever used here */ +#ifdef OPENSSL_FIPS extern void int_ERR_lib_init(void); +# ifndef OPENSSL_NO_ENGINE extern void int_EVP_MD_init_engine_callbacks(void ); extern void int_EVP_CIPHER_init_engine_callbacks(void ); extern void int_RAND_init_engine_callbacks(void ); +# endif +#endif /* Perform any essential OpenSSL initialization operations. * Currently only sets FIPS callbacks diff --git a/crypto/ocsp/ocsp_ht.c b/crypto/ocsp/ocsp_ht.c index 6abb30b..92aba08 100644 --- a/crypto/ocsp/ocsp_ht.c +++ b/crypto/ocsp/ocsp_ht.c @@ -371,11 +371,12 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) case OHS_ASN1_HEADER: - /* Now reading ASN1 header: can read at least 6 bytes which - * is more than enough for any valid ASN1 SEQUENCE header + /* Now reading ASN1 header: can read at least 2 bytes which + * is enough for ASN1 SEQUENCE header and either length field + * or at least the length of the length field. */ n = BIO_get_mem_data(rctx->mem, &p); - if (n < 6) + if (n < 2) goto next_io; /* Check it is an ASN1 SEQUENCE */ @@ -388,6 +389,11 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) /* Check out length field */ if (*p & 0x80) { + /* If MSB set on initial length octet we can now + * always read 6 octets: make sure we have them. + */ + if (n < 6) + goto next_io; n = *p & 0x7F; /* Not NDEF or excessive length */ if (!n || (n > 4)) diff --git a/crypto/ocsp/ocsp_prn.c b/crypto/ocsp/ocsp_prn.c index 90dd1aa..b8b7871 100644 --- a/crypto/ocsp/ocsp_prn.c +++ b/crypto/ocsp/ocsp_prn.c @@ -182,7 +182,6 @@ int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) { int i, ret = 0; long l; - unsigned char *p; OCSP_CERTID *cid = NULL; OCSP_BASICRESP *br = NULL; OCSP_RESPID *rid = NULL; @@ -207,7 +206,6 @@ int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) return 1; } - p = ASN1_STRING_data(rb->response); i = ASN1_STRING_length(rb->response); if (!(br = OCSP_response_get1_basic(o))) goto err; rd = br->tbsResponseData; diff --git a/crypto/opensslv.h b/crypto/opensslv.h index 9f3981c..a560e20 100644 --- a/crypto/opensslv.h +++ b/crypto/opensslv.h @@ -25,11 +25,11 @@ * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for * major minor fix final patch/beta) */ -#define OPENSSL_VERSION_NUMBER 0x009080efL +#define OPENSSL_VERSION_NUMBER 0x0090810f #ifdef OPENSSL_FIPS -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8n-fips 24 Mar 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8p-fips 16 Nov 2010" #else -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8n 24 Mar 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8p 16 Nov 2010" #endif #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c index cbafefe..22bb791 100644 --- a/crypto/pem/pem_lib.c +++ b/crypto/pem/pem_lib.c @@ -434,7 +434,6 @@ int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen, int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) { - int o; const EVP_CIPHER *enc=NULL; char *p,c; char **header_pp = &header; @@ -474,7 +473,6 @@ int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) header++; } *header='\0'; - o=OBJ_sn2nid(p); cipher->cipher=enc=EVP_get_cipherbyname(p); *header=c; header++; diff --git a/crypto/pkcs12/p12_key.c b/crypto/pkcs12/p12_key.c index 5cfe727..03cbcd8 100644 --- a/crypto/pkcs12/p12_key.c +++ b/crypto/pkcs12/p12_key.c @@ -110,6 +110,7 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, unsigned char *B, *D, *I, *p, *Ai; int Slen, Plen, Ilen, Ijlen; int i, j, u, v; + int ret = 0; BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */ EVP_MD_CTX ctx; #ifdef DEBUG_KEYGEN @@ -145,10 +146,8 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, I = OPENSSL_malloc (Ilen); Ij = BN_new(); Bpl1 = BN_new(); - if (!D || !Ai || !B || !I || !Ij || !Bpl1) { - PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE); - return 0; - } + if (!D || !Ai || !B || !I || !Ij || !Bpl1) + goto err; for (i = 0; i < v; i++) D[i] = id; p = I; for (i = 0; i < Slen; i++) *p++ = salt[i % saltlen]; @@ -165,28 +164,22 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, } memcpy (out, Ai, min (n, u)); if (u >= n) { - OPENSSL_free (Ai); - OPENSSL_free (B); - OPENSSL_free (D); - OPENSSL_free (I); - BN_free (Ij); - BN_free (Bpl1); - EVP_MD_CTX_cleanup(&ctx); #ifdef DEBUG_KEYGEN fprintf(stderr, "Output KEY (length %d)\n", tmpn); h__dump(tmpout, tmpn); #endif - return 1; + ret = 1; + goto end; } n -= u; out += u; for (j = 0; j < v; j++) B[j] = Ai[j % u]; /* Work out B + 1 first then can use B as tmp space */ - BN_bin2bn (B, v, Bpl1); - BN_add_word (Bpl1, 1); + if (!BN_bin2bn (B, v, Bpl1)) goto err; + if (!BN_add_word (Bpl1, 1)) goto err; for (j = 0; j < Ilen ; j+=v) { - BN_bin2bn (I + j, v, Ij); - BN_add (Ij, Ij, Bpl1); + if (!BN_bin2bn (I + j, v, Ij)) goto err; + if (!BN_add (Ij, Ij, Bpl1)) goto err; BN_bn2bin (Ij, B); Ijlen = BN_num_bytes (Ij); /* If more than 2^(v*8) - 1 cut off MSB */ @@ -202,6 +195,19 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, } else BN_bn2bin (Ij, I + j); } } + +err: + PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE); + +end: + OPENSSL_free (Ai); + OPENSSL_free (B); + OPENSSL_free (D); + OPENSSL_free (I); + BN_free (Ij); + BN_free (Bpl1); + EVP_MD_CTX_cleanup(&ctx); + return ret; } #ifdef DEBUG_KEYGEN void h__dump (unsigned char *p, int len) diff --git a/crypto/pkcs12/p12_npas.c b/crypto/pkcs12/p12_npas.c index 47e5e9c..2f71355 100644 --- a/crypto/pkcs12/p12_npas.c +++ b/crypto/pkcs12/p12_npas.c @@ -120,8 +120,13 @@ static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass) bags = PKCS12_unpack_p7data(p7); } else if (bagnid == NID_pkcs7_encrypted) { bags = PKCS12_unpack_p7encdata(p7, oldpass, -1); - alg_get(p7->d.encrypted->enc_data->algorithm, - &pbe_nid, &pbe_iter, &pbe_saltlen); + if (!alg_get(p7->d.encrypted->enc_data->algorithm, + &pbe_nid, &pbe_iter, &pbe_saltlen)) + { + sk_PKCS12_SAFEBAG_pop_free(bags, + PKCS12_SAFEBAG_free); + bags = NULL; + } } else continue; if (!bags) { sk_PKCS7_pop_free(asafes, PKCS7_free); @@ -193,7 +198,9 @@ static int newpass_bag(PKCS12_SAFEBAG *bag, char *oldpass, char *newpass) if(M_PKCS12_bag_type(bag) != NID_pkcs8ShroudedKeyBag) return 1; if (!(p8 = PKCS8_decrypt(bag->value.shkeybag, oldpass, -1))) return 0; - alg_get(bag->value.shkeybag->algor, &p8_nid, &p8_iter, &p8_saltlen); + if (!alg_get(bag->value.shkeybag->algor, &p8_nid, &p8_iter, + &p8_saltlen)) + return 0; if(!(p8new = PKCS8_encrypt(p8_nid, NULL, newpass, -1, NULL, p8_saltlen, p8_iter, p8))) return 0; X509_SIG_free(bag->value.shkeybag); @@ -208,9 +215,11 @@ static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen) p = alg->parameter->value.sequence->data; pbe = d2i_PBEPARAM(NULL, &p, alg->parameter->value.sequence->length); + if (!pbe) + return 0; *pnid = OBJ_obj2nid(alg->algorithm); *piter = ASN1_INTEGER_get(pbe->iter); *psaltlen = pbe->salt->length; PBEPARAM_free(pbe); - return 0; + return 1; } diff --git a/crypto/pkcs7/pk7_doit.c b/crypto/pkcs7/pk7_doit.c index a03d7eb..c8f1eb1 100644 --- a/crypto/pkcs7/pk7_doit.c +++ b/crypto/pkcs7/pk7_doit.c @@ -342,7 +342,6 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) X509_ALGOR *enc_alg=NULL; STACK_OF(X509_ALGOR) *md_sk=NULL; STACK_OF(PKCS7_RECIP_INFO) *rsk=NULL; - X509_ALGOR *xalg=NULL; PKCS7_RECIP_INFO *ri=NULL; i=OBJ_obj2nid(p7->type); @@ -365,7 +364,6 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CIPHER_TYPE); goto err; } - xalg=p7->d.signed_and_enveloped->enc_data->algorithm; break; case NID_pkcs7_enveloped: rsk=p7->d.enveloped->recipientinfo; @@ -377,7 +375,6 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CIPHER_TYPE); goto err; } - xalg=p7->d.enveloped->enc_data->algorithm; break; default: PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE); diff --git a/crypto/pkcs7/pk7_lib.c b/crypto/pkcs7/pk7_lib.c index f249094..898cdda 100644 --- a/crypto/pkcs7/pk7_lib.c +++ b/crypto/pkcs7/pk7_lib.c @@ -558,7 +558,6 @@ X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si) int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher) { int i; - ASN1_OBJECT *objtmp; PKCS7_ENC_CONTENT *ec; i=OBJ_obj2nid(p7->type); @@ -581,7 +580,6 @@ int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher) PKCS7err(PKCS7_F_PKCS7_SET_CIPHER,PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER); return(0); } - objtmp = OBJ_nid2obj(i); ec->cipher = cipher; return 1; diff --git a/crypto/pkcs7/pk7_mime.c b/crypto/pkcs7/pk7_mime.c index 7762d64..831b47d 100644 --- a/crypto/pkcs7/pk7_mime.c +++ b/crypto/pkcs7/pk7_mime.c @@ -73,7 +73,6 @@ static int pk7_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, { PKCS7 *p7 = (PKCS7 *)val; BIO *tmpbio, *p7bio; - int r = 0; if (!(flags & SMIME_DETACHED)) { @@ -95,8 +94,6 @@ static int pk7_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, if (PKCS7_dataFinal(p7, p7bio) <= 0) goto err; - r = 1; - err: /* Now remove any digests prepended to the BIO */ diff --git a/crypto/pqueue/pqueue.c b/crypto/pqueue/pqueue.c index 6c89f06..8ebba8a 100644 --- a/crypto/pqueue/pqueue.c +++ b/crypto/pqueue/pqueue.c @@ -166,14 +166,13 @@ pqueue_pop(pqueue_s *pq) pitem * pqueue_find(pqueue_s *pq, PQ_64BIT priority) { - pitem *next, *prev = NULL; + pitem *next; pitem *found = NULL; if ( pq->items == NULL) return NULL; - for ( next = pq->items; next->next != NULL; - prev = next, next = next->next) + for ( next = pq->items; next->next != NULL; next = next->next) { if ( pq_64bit_eq(&(next->priority), &priority)) { @@ -189,13 +188,6 @@ pqueue_find(pqueue_s *pq, PQ_64BIT priority) if ( ! found) return NULL; -#if 0 /* find works in peek mode */ - if ( prev == NULL) - pq->items = next->next; - else - prev->next = next->next; -#endif - return found; } diff --git a/crypto/rand/rand_nw.c b/crypto/rand/rand_nw.c index f177ffb..8d5b8d2 100644 --- a/crypto/rand/rand_nw.c +++ b/crypto/rand/rand_nw.c @@ -160,8 +160,8 @@ int RAND_poll(void) rdtsc mov tsc, eax } -#else - asm volatile("rdtsc":"=A" (tsc)); +#elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) + asm volatile("rdtsc":"=a"(tsc)::"edx"); #endif RAND_add(&tsc, sizeof(tsc), 1); diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c index 84276d7..1810568 100644 --- a/crypto/rand/randfile.c +++ b/crypto/rand/randfile.c @@ -265,8 +265,8 @@ err: const char *RAND_file_name(char *buf, size_t size) { char *s=NULL; - int ok = 0; #ifdef __OpenBSD__ + int ok = 0; struct stat sb; #endif @@ -294,7 +294,9 @@ const char *RAND_file_name(char *buf, size_t size) BUF_strlcat(buf,"/",size); #endif BUF_strlcat(buf,RFILE,size); +#ifdef __OpenBSD__ ok = 1; +#endif } else buf[0] = '\0'; /* no file name */ diff --git a/crypto/rsa/rsa_eay.c b/crypto/rsa/rsa_eay.c index 0ac6418..412d0ea 100644 --- a/crypto/rsa/rsa_eay.c +++ b/crypto/rsa/rsa_eay.c @@ -673,7 +673,7 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, rsa->_method_mod_n)) goto err; if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12)) - BN_sub(ret, rsa->n, ret); + if (!BN_sub(ret, rsa->n, ret)) goto err; p=buf; i=BN_bn2bin(ret,p); diff --git a/crypto/x509/x509.h b/crypto/x509/x509.h index 8958e34..c34689a 100644 --- a/crypto/x509/x509.h +++ b/crypto/x509/x509.h @@ -256,6 +256,7 @@ typedef struct x509_cinf_st ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + ASN1_ENCODING enc; } X509_CINF; /* This stuff is certificate "auxiliary info" diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index b85456e..aeb6337 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -97,7 +97,6 @@ static int x509_subject_cmp(X509 **a, X509 **b) int X509_verify_cert(X509_STORE_CTX *ctx) { X509 *x,*xtmp,*chain_ss=NULL; - X509_NAME *xn; int bad_chain = 0; X509_VERIFY_PARAM *param = ctx->param; int depth,i,ok=0; @@ -149,7 +148,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) */ /* If we are self signed, we break */ - xn=X509_get_issuer_name(x); if (ctx->check_issued(ctx, x,x)) break; /* If we were passed a cert chain, use it first */ @@ -186,7 +184,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) i=sk_X509_num(ctx->chain); x=sk_X509_value(ctx->chain,i-1); - xn = X509_get_subject_name(x); if (ctx->check_issued(ctx, x, x)) { /* we have a self signed certificate */ @@ -235,7 +232,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) if (depth < num) break; /* If we are self signed, we break */ - xn=X509_get_issuer_name(x); if (ctx->check_issued(ctx,x,x)) break; ok = ctx->get_issuer(&xtmp, ctx, x); @@ -254,7 +250,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) } /* we now have our chain, lets check it... */ - xn=X509_get_issuer_name(x); /* Is last certificate looked up self signed? */ if (!ctx->check_issued(ctx,x,x)) @@ -1380,7 +1375,7 @@ int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, if (store) ret = X509_VERIFY_PARAM_inherit(ctx->param, store->param); else - ctx->param->flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE; + ctx->param->inh_flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE; if (store) { diff --git a/crypto/x509/x_all.c b/crypto/x509/x_all.c index 9039caa..c7b07f7 100644 --- a/crypto/x509/x_all.c +++ b/crypto/x509/x_all.c @@ -97,6 +97,7 @@ int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r) int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md) { + x->cert_info->enc.modified = 1; return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature, x->sig_alg, x->signature, x->cert_info,pkey,md)); } diff --git a/crypto/x509v3/v3_ncons.c b/crypto/x509v3/v3_ncons.c index 4e706be3..624fe7e 100644 --- a/crypto/x509v3/v3_ncons.c +++ b/crypto/x509v3/v3_ncons.c @@ -182,7 +182,6 @@ static int do_i2r_name_constraints(X509V3_EXT_METHOD *method, print_nc_ipadd(bp, tree->base->d.ip); else GENERAL_NAME_print(bp, tree->base); - tree = sk_GENERAL_SUBTREE_value(trees, i); BIO_puts(bp, "\n"); } return 1; diff --git a/crypto/x509v3/v3_pci.c b/crypto/x509v3/v3_pci.c index 601211f..823e9af 100644 --- a/crypto/x509v3/v3_pci.c +++ b/crypto/x509v3/v3_pci.c @@ -128,7 +128,12 @@ static int process_pci_value(CONF_VALUE *val, unsigned char *tmp_data2 = string_to_hex(val->value + 4, &val_len); - if (!tmp_data2) goto err; + if (!tmp_data2) + { + X509V3err(X509V3_F_PROCESS_PCI_VALUE,X509V3_R_ILLEGAL_HEX_DIGIT); + X509V3_conf_err(val); + goto err; + } tmp_data = OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1); @@ -140,6 +145,17 @@ static int process_pci_value(CONF_VALUE *val, (*policy)->length += val_len; (*policy)->data[(*policy)->length] = '\0'; } + else + { + OPENSSL_free(tmp_data2); + /* realloc failure implies the original data space is b0rked too! */ + (*policy)->data = NULL; + (*policy)->length = 0; + X509V3err(X509V3_F_PROCESS_PCI_VALUE,ERR_R_MALLOC_FAILURE); + X509V3_conf_err(val); + goto err; + } + OPENSSL_free(tmp_data2); } else if (strncmp(val->value, "file:", 5) == 0) { @@ -169,6 +185,7 @@ static int process_pci_value(CONF_VALUE *val, (*policy)->length += n; (*policy)->data[(*policy)->length] = '\0'; } + BIO_free_all(b); if (n < 0) { @@ -190,6 +207,15 @@ static int process_pci_value(CONF_VALUE *val, (*policy)->length += val_len; (*policy)->data[(*policy)->length] = '\0'; } + else + { + /* realloc failure implies the original data space is b0rked too! */ + (*policy)->data = NULL; + (*policy)->length = 0; + X509V3err(X509V3_F_PROCESS_PCI_VALUE,ERR_R_MALLOC_FAILURE); + X509V3_conf_err(val); + goto err; + } } else { diff --git a/doc/apps/smime.pod b/doc/apps/smime.pod index caf2d26..1b0d4f9 100644 --- a/doc/apps/smime.pod +++ b/doc/apps/smime.pod @@ -300,7 +300,7 @@ Create a cleartext signed message: openssl smime -sign -in message.txt -text -out mail.msg \ -signer mycert.pem -Create and opaque signed message +Create and opaque signed message: openssl smime -sign -in message.txt -text -out mail.msg -nodetach \ -signer mycert.pem @@ -349,11 +349,11 @@ it with: -----BEGIN PKCS7----- -----END PKCS7----- -and using the command, +and using the command: openssl smime -verify -inform PEM -in signature.pem -content content.txt -alternatively you can base64 decode the signature and use +Alternatively you can base64 decode the signature and use: openssl smime -verify -inform DER -in signature.der -content content.txt @@ -373,7 +373,7 @@ should be some heuristic that determines the correct encryption certificate. Ideally a database should be maintained of a certificates for each email address. The code doesn't currently take note of the permitted symmetric encryption -algorithms as supplied in the SMIMECapabilities signed attribute. this means the +algorithms as supplied in the SMIMECapabilities signed attribute. This means the user has to manually include the correct encryption algorithm. It should store the list of permitted ciphers in a database and only use those. diff --git a/doc/crypto/ASN1_OBJECT_new.pod b/doc/crypto/ASN1_OBJECT_new.pod index 51679bf..9bae40f 100644 --- a/doc/crypto/ASN1_OBJECT_new.pod +++ b/doc/crypto/ASN1_OBJECT_new.pod @@ -6,6 +6,8 @@ ASN1_OBJECT_new, ASN1_OBJECT_free, - object allocation functions =head1 SYNOPSIS + #include + ASN1_OBJECT *ASN1_OBJECT_new(void); void ASN1_OBJECT_free(ASN1_OBJECT *a); diff --git a/doc/crypto/ASN1_STRING_length.pod b/doc/crypto/ASN1_STRING_length.pod index c4ec693..a08e9a0 100644 --- a/doc/crypto/ASN1_STRING_length.pod +++ b/doc/crypto/ASN1_STRING_length.pod @@ -8,6 +8,8 @@ ASN1_STRING utility functions =head1 SYNOPSIS + #include + int ASN1_STRING_length(ASN1_STRING *x); unsigned char * ASN1_STRING_data(ASN1_STRING *x); diff --git a/doc/crypto/ASN1_STRING_new.pod b/doc/crypto/ASN1_STRING_new.pod index 5b1bbb7..8ac2a03 100644 --- a/doc/crypto/ASN1_STRING_new.pod +++ b/doc/crypto/ASN1_STRING_new.pod @@ -7,6 +7,8 @@ ASN1_STRING allocation functions =head1 SYNOPSIS + #include + ASN1_STRING * ASN1_STRING_new(void); ASN1_STRING * ASN1_STRING_type_new(int type); void ASN1_STRING_free(ASN1_STRING *a); diff --git a/doc/crypto/ASN1_generate_nconf.pod b/doc/crypto/ASN1_generate_nconf.pod index 179132d..ee89159 100644 --- a/doc/crypto/ASN1_generate_nconf.pod +++ b/doc/crypto/ASN1_generate_nconf.pod @@ -6,6 +6,8 @@ ASN1_generate_nconf, ASN1_generate_v3 - ASN1 generation functions =head1 SYNOPSIS + #include + ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); diff --git a/doc/crypto/BIO_f_buffer.pod b/doc/crypto/BIO_f_buffer.pod index c9093c6..c0dccf1 100644 --- a/doc/crypto/BIO_f_buffer.pod +++ b/doc/crypto/BIO_f_buffer.pod @@ -31,7 +31,7 @@ BIO_get_buffer_num_lines() returns the number of lines currently buffered. BIO_set_read_buffer_size(), BIO_set_write_buffer_size() and BIO_set_buffer_size() set the read, write or both read and write buffer sizes to B. The initial -buffer size is DEFAULT_BUFFER_SIZE, currently 1024. Any attempt to reduce the +buffer size is DEFAULT_BUFFER_SIZE, currently 4096. Any attempt to reduce the buffer size below DEFAULT_BUFFER_SIZE is ignored. Any buffered data is cleared when the buffer is resized. @@ -66,4 +66,9 @@ there was an error. =head1 SEE ALSO -TBA +L, +L, +L, +L, +L, +L diff --git a/doc/crypto/BIO_should_retry.pod b/doc/crypto/BIO_should_retry.pod index 539c391..b6d51f7 100644 --- a/doc/crypto/BIO_should_retry.pod +++ b/doc/crypto/BIO_should_retry.pod @@ -45,7 +45,7 @@ needs to read data. BIO_should_io_special() is true if some "special" condition, that is a reason other than reading or writing is the cause of the condition. -BIO_get_retry_reason() returns a mask of the cause of a retry condition +BIO_retry_type() returns a mask of the cause of a retry condition consisting of the values B, B, B though current BIO types will only set one of these. diff --git a/doc/crypto/CRYPTO_set_ex_data.pod b/doc/crypto/CRYPTO_set_ex_data.pod index 1bd5bed..7409c02 100644 --- a/doc/crypto/CRYPTO_set_ex_data.pod +++ b/doc/crypto/CRYPTO_set_ex_data.pod @@ -6,6 +6,8 @@ CRYPTO_set_ex_data, CRYPTO_get_ex_data - internal application specific data func =head1 SYNOPSIS + #include + int CRYPTO_set_ex_data(CRYPTO_EX_DATA *r, int idx, void *arg); void *CRYPTO_get_ex_data(CRYPTO_EX_DATA *r, int idx); diff --git a/doc/crypto/OBJ_nid2obj.pod b/doc/crypto/OBJ_nid2obj.pod index 7dcc079..1e45dd4 100644 --- a/doc/crypto/OBJ_nid2obj.pod +++ b/doc/crypto/OBJ_nid2obj.pod @@ -8,6 +8,8 @@ functions =head1 SYNOPSIS + #include + ASN1_OBJECT * OBJ_nid2obj(int n); const char * OBJ_nid2ln(int n); const char * OBJ_nid2sn(int n); diff --git a/doc/crypto/PKCS7_decrypt.pod b/doc/crypto/PKCS7_decrypt.pod index b0ca067..325699d 100644 --- a/doc/crypto/PKCS7_decrypt.pod +++ b/doc/crypto/PKCS7_decrypt.pod @@ -6,7 +6,9 @@ PKCS7_decrypt - decrypt content from a PKCS#7 envelopedData structure =head1 SYNOPSIS -int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags); + #include + + int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags); =head1 DESCRIPTION diff --git a/doc/crypto/PKCS7_encrypt.pod b/doc/crypto/PKCS7_encrypt.pod index 1a507b2..7e67f95 100644 --- a/doc/crypto/PKCS7_encrypt.pod +++ b/doc/crypto/PKCS7_encrypt.pod @@ -6,7 +6,9 @@ PKCS7_encrypt - create a PKCS#7 envelopedData structure =head1 SYNOPSIS -PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, int flags); + #include + + PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, int flags); =head1 DESCRIPTION diff --git a/doc/crypto/PKCS7_sign.pod b/doc/crypto/PKCS7_sign.pod index ffd0c73..21b1710 100644 --- a/doc/crypto/PKCS7_sign.pod +++ b/doc/crypto/PKCS7_sign.pod @@ -6,7 +6,9 @@ PKCS7_sign - create a PKCS#7 signedData structure =head1 SYNOPSIS -PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, BIO *data, int flags); + #include + + PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, BIO *data, int flags); =head1 DESCRIPTION diff --git a/doc/crypto/PKCS7_verify.pod b/doc/crypto/PKCS7_verify.pod index 3490b5d..7c10a4c 100644 --- a/doc/crypto/PKCS7_verify.pod +++ b/doc/crypto/PKCS7_verify.pod @@ -6,9 +6,11 @@ PKCS7_verify - verify a PKCS#7 signedData structure =head1 SYNOPSIS -int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, BIO *indata, BIO *out, int flags); + #include -STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags); + int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, BIO *indata, BIO *out, int flags); + + STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags); =head1 DESCRIPTION diff --git a/doc/crypto/SMIME_read_PKCS7.pod b/doc/crypto/SMIME_read_PKCS7.pod index ffafa37..9d46715 100644 --- a/doc/crypto/SMIME_read_PKCS7.pod +++ b/doc/crypto/SMIME_read_PKCS7.pod @@ -6,7 +6,9 @@ SMIME_read_PKCS7 - parse S/MIME message. =head1 SYNOPSIS -PKCS7 *SMIME_read_PKCS7(BIO *in, BIO **bcont); + #include + + PKCS7 *SMIME_read_PKCS7(BIO *in, BIO **bcont); =head1 DESCRIPTION diff --git a/doc/crypto/SMIME_write_PKCS7.pod b/doc/crypto/SMIME_write_PKCS7.pod index 61945b3..e20d46b 100644 --- a/doc/crypto/SMIME_write_PKCS7.pod +++ b/doc/crypto/SMIME_write_PKCS7.pod @@ -6,7 +6,9 @@ SMIME_write_PKCS7 - convert PKCS#7 structure to S/MIME format. =head1 SYNOPSIS -int SMIME_write_PKCS7(BIO *out, PKCS7 *p7, BIO *data, int flags); + #include + + int SMIME_write_PKCS7(BIO *out, PKCS7 *p7, BIO *data, int flags); =head1 DESCRIPTION diff --git a/doc/crypto/X509_NAME_ENTRY_get_object.pod b/doc/crypto/X509_NAME_ENTRY_get_object.pod index 11b35f6..41902c0 100644 --- a/doc/crypto/X509_NAME_ENTRY_get_object.pod +++ b/doc/crypto/X509_NAME_ENTRY_get_object.pod @@ -9,15 +9,17 @@ X509_NAME_ENTRY_create_by_OBJ - X509_NAME_ENTRY utility functions =head1 SYNOPSIS -ASN1_OBJECT * X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); -ASN1_STRING * X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); + #include -int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj); -int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, const unsigned char *bytes, int len); + ASN1_OBJECT * X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); + ASN1_STRING * X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); -X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, const char *field, int type, const unsigned char *bytes, int len); -X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, int type,unsigned char *bytes, int len); -X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, ASN1_OBJECT *obj, int type, const unsigned char *bytes, int len); + int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj); + int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, const unsigned char *bytes, int len); + + X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, const char *field, int type, const unsigned char *bytes, int len); + X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, int type,unsigned char *bytes, int len); + X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, ASN1_OBJECT *obj, int type, const unsigned char *bytes, int len); =head1 DESCRIPTION diff --git a/doc/crypto/X509_NAME_add_entry_by_txt.pod b/doc/crypto/X509_NAME_add_entry_by_txt.pod index e2ab4b0..1afd008 100644 --- a/doc/crypto/X509_NAME_add_entry_by_txt.pod +++ b/doc/crypto/X509_NAME_add_entry_by_txt.pod @@ -7,15 +7,17 @@ X509_NAME_add_entry, X509_NAME_delete_entry - X509_NAME modification functions =head1 SYNOPSIS -int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, const unsigned char *bytes, int len, int loc, int set); + #include -int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, unsigned char *bytes, int len, int loc, int set); + int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, const unsigned char *bytes, int len, int loc, int set); -int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, unsigned char *bytes, int len, int loc, int set); + int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, unsigned char *bytes, int len, int loc, int set); -int X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne, int loc, int set); + int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, unsigned char *bytes, int len, int loc, int set); -X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); + int X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne, int loc, int set); + + X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); =head1 DESCRIPTION diff --git a/doc/crypto/X509_NAME_get_index_by_NID.pod b/doc/crypto/X509_NAME_get_index_by_NID.pod index 333323d..3b1f9ff 100644 --- a/doc/crypto/X509_NAME_get_index_by_NID.pod +++ b/doc/crypto/X509_NAME_get_index_by_NID.pod @@ -8,14 +8,16 @@ X509_NAME lookup and enumeration functions =head1 SYNOPSIS -int X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos); -int X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj, int lastpos); + #include -int X509_NAME_entry_count(X509_NAME *name); -X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); + int X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos); + int X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj, int lastpos); -int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf,int len); -int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, char *buf,int len); + int X509_NAME_entry_count(X509_NAME *name); + X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); + + int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf,int len); + int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, char *buf,int len); =head1 DESCRIPTION diff --git a/doc/crypto/X509_new.pod b/doc/crypto/X509_new.pod index fd5fc65..d388723 100644 --- a/doc/crypto/X509_new.pod +++ b/doc/crypto/X509_new.pod @@ -6,6 +6,8 @@ X509_new, X509_free - X509 certificate ASN1 allocation functions =head1 SYNOPSIS + #include + X509 *X509_new(void); void X509_free(X509 *a); diff --git a/doc/crypto/bn_internal.pod b/doc/crypto/bn_internal.pod index d39ce90..91840b0 100644 --- a/doc/crypto/bn_internal.pod +++ b/doc/crypto/bn_internal.pod @@ -13,6 +13,8 @@ library internal functions =head1 SYNOPSIS + #include + BN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w); BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w); diff --git a/doc/crypto/ui_compat.pod b/doc/crypto/ui_compat.pod index 9ab3c69..adf2ae5 100644 --- a/doc/crypto/ui_compat.pod +++ b/doc/crypto/ui_compat.pod @@ -7,6 +7,8 @@ Compatibility user interface functions =head1 SYNOPSIS + #include + int des_read_password(DES_cblock *key,const char *prompt,int verify); int des_read_2passwords(DES_cblock *key1,DES_cblock *key2, const char *prompt,int verify); diff --git a/doc/ssl/SSL_library_init.pod b/doc/ssl/SSL_library_init.pod index ecf3c48..7f1356a 100644 --- a/doc/ssl/SSL_library_init.pod +++ b/doc/ssl/SSL_library_init.pod @@ -15,7 +15,7 @@ SSL_library_init, OpenSSL_add_ssl_algorithms, SSLeay_add_ssl_algorithms =head1 DESCRIPTION -SSL_library_init() registers the available ciphers and digests. +SSL_library_init() registers the available SSL/TLS ciphers and digests. OpenSSL_add_ssl_algorithms() and SSLeay_add_ssl_algorithms() are synonyms for SSL_library_init(). @@ -26,24 +26,28 @@ SSL_library_init() must be called before any other action takes place. =head1 WARNING -SSL_library_init() only registers ciphers. Another important initialization -is the seeding of the PRNG (Pseudo Random Number Generator), which has to -be performed separately. +SSL_library_init() adds ciphers and digests used directly and indirectly by +SSL/TLS. =head1 EXAMPLES A typical TLS/SSL application will start with the library initialization, -will provide readable error messages and will seed the PRNG. +and provide readable error messages. SSL_load_error_strings(); /* readable error messages */ SSL_library_init(); /* initialize library */ - actions_to_seed_PRNG(); =head1 RETURN VALUES SSL_library_init() always returns "1", so it is safe to discard the return value. +=head1 NOTES + +OpenSSL 0.9.8o and 1.0.0a and later added SHA2 algorithms to SSL_library_init(). +Applications which need to use SHA2 in earlier versions of OpenSSL should call +OpenSSL_add_all_algorithms() as well. + =head1 SEE ALSO L, L, diff --git a/e_os.h b/e_os.h index 9c5c6fd..cc90f5e 100644 --- a/e_os.h +++ b/e_os.h @@ -153,7 +153,6 @@ extern "C" { #define clear_socket_error() WSASetLastError(0) #define readsocket(s,b,n) recv((s),(b),(n),0) #define writesocket(s,b,n) send((s),(b),(n),0) -#define EADDRINUSE WSAEADDRINUSE #elif defined(__DJGPP__) #define WATT32 #define get_last_socket_error() errno diff --git a/engines/e_chil.c b/engines/e_chil.c index 3a07076..fca7a9c 100644 --- a/engines/e_chil.c +++ b/engines/e_chil.c @@ -111,11 +111,10 @@ static int hwcrhk_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, #ifndef OPENSSL_NO_RSA /* RSA stuff */ static int hwcrhk_rsa_mod_exp(BIGNUM *r, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); -#endif -#ifndef OPENSSL_NO_RSA /* This function is aliased to mod_exp (with the mont stuff dropped). */ static int hwcrhk_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +static int hwcrhk_rsa_finish(RSA *rsa); #endif #ifndef OPENSSL_NO_DH @@ -135,10 +134,6 @@ static EVP_PKEY *hwcrhk_load_privkey(ENGINE *eng, const char *key_id, UI_METHOD *ui_method, void *callback_data); static EVP_PKEY *hwcrhk_load_pubkey(ENGINE *eng, const char *key_id, UI_METHOD *ui_method, void *callback_data); -#ifndef OPENSSL_NO_RSA -static void hwcrhk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, - int ind,long argl, void *argp); -#endif /* Interaction stuff */ static int hwcrhk_insert_card(const char *prompt_info, @@ -193,7 +188,7 @@ static RSA_METHOD hwcrhk_rsa = hwcrhk_rsa_mod_exp, hwcrhk_mod_exp_mont, NULL, - NULL, + hwcrhk_rsa_finish, 0, NULL, NULL, @@ -603,7 +598,7 @@ static int hwcrhk_init(ENGINE *e) if (hndidx_rsa == -1) hndidx_rsa = RSA_get_ex_new_index(0, "nFast HWCryptoHook RSA key handle", - NULL, NULL, hwcrhk_ex_free); + NULL, NULL, NULL); #endif return 1; err: @@ -1081,6 +1076,21 @@ static int hwcrhk_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, { return hwcrhk_mod_exp(r, a, p, m, ctx); } + +static int hwcrhk_rsa_finish(RSA *rsa) + { + HWCryptoHook_RSAKeyHandle *hptr; + + hptr = RSA_get_ex_data(rsa, hndidx_rsa); + if (hptr) + { + p_hwcrhk_RSAUnloadKey(*hptr, NULL); + OPENSSL_free(hptr); + RSA_set_ex_data(rsa, hndidx_rsa, NULL); + } + return 1; + } + #endif #ifndef OPENSSL_NO_DH @@ -1139,34 +1149,6 @@ static int hwcrhk_rand_status(void) return 1; } -/* This cleans up an RSA KM key, called when ex_data is freed */ -#ifndef OPENSSL_NO_RSA -static void hwcrhk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, - int ind,long argl, void *argp) -{ - char tempbuf[1024]; - HWCryptoHook_ErrMsgBuf rmsg; -#ifndef OPENSSL_NO_RSA - HWCryptoHook_RSAKeyHandle *hptr; -#endif -#if !defined(OPENSSL_NO_RSA) - int ret; -#endif - - rmsg.buf = tempbuf; - rmsg.size = sizeof(tempbuf); - -#ifndef OPENSSL_NO_RSA - hptr = (HWCryptoHook_RSAKeyHandle *) item; - if(hptr) - { - ret = p_hwcrhk_RSAUnloadKey(*hptr, NULL); - OPENSSL_free(hptr); - } -#endif -} -#endif - /* Mutex calls: since the HWCryptoHook model closely follows the POSIX model * these just wrap the POSIX functions and add some logging. */ @@ -1316,6 +1298,8 @@ static int hwcrhk_insert_card(const char *prompt_info, if (wrong_info && *wrong_info) BIO_snprintf(buf, sizeof(buf)-1, "Current card: \"%s\"\n", wrong_info); + else + buf[0] = 0; ok = UI_dup_info_string(ui, buf); if (ok >= 0 && prompt_info) { diff --git a/engines/e_cswift.c b/engines/e_cswift.c index bc65179..2e64ff3 100644 --- a/engines/e_cswift.c +++ b/engines/e_cswift.c @@ -811,7 +811,6 @@ static DSA_SIG *cswift_dsa_sign(const unsigned char *dgst, int dlen, DSA *dsa) SW_PARAM sw_param; SW_STATUS sw_status; SW_LARGENUMBER arg, res; - unsigned char *ptr; BN_CTX *ctx; BIGNUM *dsa_p = NULL; BIGNUM *dsa_q = NULL; @@ -899,7 +898,6 @@ static DSA_SIG *cswift_dsa_sign(const unsigned char *dgst, int dlen, DSA *dsa) goto err; } /* Convert the response */ - ptr = (unsigned char *)result->d; if((to_return = DSA_SIG_new()) == NULL) goto err; to_return->r = BN_bin2bn((unsigned char *)result->d, 20, NULL); diff --git a/engines/e_ubsec.c b/engines/e_ubsec.c index a0f320c..f1c8101 100644 --- a/engines/e_ubsec.c +++ b/engines/e_ubsec.c @@ -631,10 +631,8 @@ static int ubsec_mod_exp_crt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *dq, const BIGNUM *qinv, BN_CTX *ctx) { int y_len, - m_len, fd; - m_len = BN_num_bytes(p) + BN_num_bytes(q) + 1; y_len = BN_num_bits(p) + BN_num_bits(q); /* Check if hardware can't handle this argument. */ diff --git a/fips/mkfipsscr.pl b/fips/mkfipsscr.pl index dc60cdf..361641d 100755 --- a/fips/mkfipsscr.pl +++ b/fips/mkfipsscr.pl @@ -297,12 +297,16 @@ my $filter = ""; my $tvdir; my $tprefix; my $shwrap_prefix; +my $shwrap; +my $rmcmd = "rm -rf"; +my $mkcmd = "mkdir"; my $debug = 0; my $quiet = 0; my $rspdir = "rsp"; my $rspignore = 0; my @bogus = (); # list of unmatched *.rsp files my $bufout = ''; +my $bufdir = ''; my %_programs = (); # list of external programs to check foreach (@ARGV) @@ -331,6 +335,10 @@ foreach (@ARGV) { $rspdir = $1; } + elsif (/--noshwrap$/) + { + $shwrap = ""; + } elsif (/--rspignore$/) { $rspignore = 1; @@ -347,6 +355,14 @@ foreach (@ARGV) { $filter = $1; } + elsif (/--mkdir=(.*)$/) + { + $mkcmd = $1; + } + elsif (/--rm=(.*)$/) + { + $rmcmd = $1; + } elsif (/--outfile=(.*)$/) { $outfile = $1; @@ -396,6 +412,8 @@ else $shwrap_prefix = "../util/" unless defined $shwrap_prefix; } + $shwrap = "${shwrap_prefix}shlib_wrap.sh " unless defined $shwrap; + $bufinit .= < "$rsp" || { echo "$req failure" ; exit 1; } +${shwrap}\${TPREFIX}$tcmd < "$req" > "$rsp" || { echo "$req failure" ; exit 1; } END $_programs{"$tprefix$tcmd"} = 1; } diff --git a/openssl.spec b/openssl.spec index 19a002f..6c659ff 100644 --- a/openssl.spec +++ b/openssl.spec @@ -2,7 +2,7 @@ %define libmaj 0 %define libmin 9 %define librel 8 -%define librev n +%define librev p Release: 1 %define openssldir /var/ssl diff --git a/ssl/d1_both.c b/ssl/d1_both.c index 0a5c08d..920fb1f 100644 --- a/ssl/d1_both.c +++ b/ssl/d1_both.c @@ -123,6 +123,37 @@ #include #include +#define RSMBLY_BITMASK_SIZE(msg_len) (((msg_len) + 7) / 8) + +#define RSMBLY_BITMASK_MARK(bitmask, start, end) { \ + if ((end) - (start) <= 8) { \ + long ii; \ + for (ii = (start); ii < (end); ii++) bitmask[((ii) >> 3)] |= (1 << ((ii) & 7)); \ + } else { \ + long ii; \ + bitmask[((start) >> 3)] |= bitmask_start_values[((start) & 7)]; \ + for (ii = (((start) >> 3) + 1); ii < ((((end) - 1)) >> 3); ii++) bitmask[ii] = 0xff; \ + bitmask[(((end) - 1) >> 3)] |= bitmask_end_values[((end) & 7)]; \ + } } + +#define RSMBLY_BITMASK_IS_COMPLETE(bitmask, msg_len, is_complete) { \ + long ii; \ + OPENSSL_assert((msg_len) > 0); \ + is_complete = 1; \ + if (bitmask[(((msg_len) - 1) >> 3)] != bitmask_end_values[((msg_len) & 7)]) is_complete = 0; \ + if (is_complete) for (ii = (((msg_len) - 1) >> 3) - 1; ii >= 0 ; ii--) \ + if (bitmask[ii] != 0xff) { is_complete = 0; break; } } + +#if 0 +#define RSMBLY_BITMASK_PRINT(bitmask, msg_len) { \ + long ii; \ + printf("bitmask: "); for (ii = 0; ii < (msg_len); ii++) \ + printf("%d ", (bitmask[ii >> 3] & (1 << (ii & 7))) >> (ii & 7)); \ + printf("\n"); } +#endif + +static unsigned char bitmask_start_values[] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80}; +static unsigned char bitmask_end_values[] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f}; /* XDTLS: figure out the right values */ static unsigned int g_probable_mtu[] = {1500 - 28, 512 - 28, 256 - 28}; @@ -140,10 +171,11 @@ static long dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok); static hm_fragment * -dtls1_hm_fragment_new(unsigned long frag_len) +dtls1_hm_fragment_new(unsigned long frag_len, int reassembly) { hm_fragment *frag = NULL; unsigned char *buf = NULL; + unsigned char *bitmask = NULL; frag = (hm_fragment *)OPENSSL_malloc(sizeof(hm_fragment)); if ( frag == NULL) @@ -162,6 +194,21 @@ dtls1_hm_fragment_new(unsigned long frag_len) /* zero length fragment gets zero frag->fragment */ frag->fragment = buf; + /* Initialize reassembly bitmask if necessary */ + if (reassembly) + { + bitmask = (unsigned char *)OPENSSL_malloc(RSMBLY_BITMASK_SIZE(frag_len)); + if (bitmask == NULL) + { + if (buf != NULL) OPENSSL_free(buf); + OPENSSL_free(frag); + return NULL; + } + memset(bitmask, 0, RSMBLY_BITMASK_SIZE(frag_len)); + } + + frag->reassembly = bitmask; + return frag; } @@ -169,6 +216,7 @@ static void dtls1_hm_fragment_free(hm_fragment *frag) { if (frag->fragment) OPENSSL_free(frag->fragment); + if (frag->reassembly) OPENSSL_free(frag->reassembly); OPENSSL_free(frag); } @@ -363,6 +411,8 @@ long dtls1_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) { int i, al; struct hm_header_st *msg_hdr; + unsigned char *p; + unsigned long msg_len; /* s3->tmp is used to store messages that are unexpected, caused * by the absence of an optional handshake message */ @@ -382,76 +432,55 @@ long dtls1_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) } msg_hdr = &s->d1->r_msg_hdr; - do - { - if ( msg_hdr->frag_off == 0) - { - /* s->d1->r_message_header.msg_len = 0; */ - memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); - } + memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); - i = dtls1_get_message_fragment(s, st1, stn, max, ok); - if ( i == DTLS1_HM_BAD_FRAGMENT || - i == DTLS1_HM_FRAGMENT_RETRY) /* bad fragment received */ - continue; - else if ( i <= 0 && !*ok) - return i; +again: + i = dtls1_get_message_fragment(s, st1, stn, max, ok); + if ( i == DTLS1_HM_BAD_FRAGMENT || + i == DTLS1_HM_FRAGMENT_RETRY) /* bad fragment received */ + goto again; + else if ( i <= 0 && !*ok) + return i; - /* Note that s->init_sum is used as a counter summing - * up fragments' lengths: as soon as they sum up to - * handshake packet length, we assume we have got all - * the fragments. Overlapping fragments would cause - * premature termination, so we don't expect overlaps. - * Well, handling overlaps would require something more - * drastic. Indeed, as it is now there is no way to - * tell if out-of-order fragment from the middle was - * the last. '>=' is the best/least we can do to control - * the potential damage caused by malformed overlaps. */ - if ((unsigned int)s->init_num >= msg_hdr->msg_len) - { - unsigned char *p = (unsigned char *)s->init_buf->data; - unsigned long msg_len = msg_hdr->msg_len; - - /* reconstruct message header as if it was - * sent in single fragment */ - *(p++) = msg_hdr->type; - l2n3(msg_len,p); - s2n (msg_hdr->seq,p); - l2n3(0,p); - l2n3(msg_len,p); - if (s->client_version != DTLS1_BAD_VER) - p -= DTLS1_HM_HEADER_LENGTH, - msg_len += DTLS1_HM_HEADER_LENGTH; - - ssl3_finish_mac(s, p, msg_len); - if (s->msg_callback) - s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, - p, msg_len, - s, s->msg_callback_arg); - - memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); - - s->d1->handshake_read_seq++; - /* we just read a handshake message from the other side: - * this means that we don't need to retransmit of the - * buffered messages. - * XDTLS: may be able clear out this - * buffer a little sooner (i.e if an out-of-order - * handshake message/record is received at the record - * layer. - * XDTLS: exception is that the server needs to - * know that change cipher spec and finished messages - * have been received by the client before clearing this - * buffer. this can simply be done by waiting for the - * first data segment, but is there a better way? */ - dtls1_clear_record_buffer(s); - - s->init_msg = s->init_buf->data + DTLS1_HM_HEADER_LENGTH; - return s->init_num; - } - else - msg_hdr->frag_off = i; - } while(1) ; + p = (unsigned char *)s->init_buf->data; + msg_len = msg_hdr->msg_len; + + /* reconstruct message header */ + *(p++) = msg_hdr->type; + l2n3(msg_len,p); + s2n (msg_hdr->seq,p); + l2n3(0,p); + l2n3(msg_len,p); + if (s->version != DTLS1_BAD_VER) { + p -= DTLS1_HM_HEADER_LENGTH; + msg_len += DTLS1_HM_HEADER_LENGTH; + } + + ssl3_finish_mac(s, p, msg_len); + if (s->msg_callback) + s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, + p, msg_len, + s, s->msg_callback_arg); + + memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); + + s->d1->handshake_read_seq++; + /* we just read a handshake message from the other side: + * this means that we don't need to retransmit of the + * buffered messages. + * XDTLS: may be able clear out this + * buffer a little sooner (i.e if an out-of-order + * handshake message/record is received at the record + * layer. + * XDTLS: exception is that the server needs to + * know that change cipher spec and finished messages + * have been received by the client before clearing this + * buffer. this can simply be done by waiting for the + * first data segment, but is there a better way? */ + dtls1_clear_record_buffer(s); + + s->init_msg = s->init_buf->data + DTLS1_HM_HEADER_LENGTH; + return s->init_num; f_err: ssl3_send_alert(s,SSL3_AL_FATAL,al); @@ -527,6 +556,10 @@ dtls1_retrieve_buffered_fragment(SSL *s, long max, int *ok) return 0; frag = (hm_fragment *)item->data; + + /* Don't return if reassembly still in progress */ + if (frag->reassembly != NULL) + return 0; if ( s->d1->handshake_read_seq == frag->msg_header.seq) { @@ -562,6 +595,109 @@ dtls1_retrieve_buffered_fragment(SSL *s, long max, int *ok) static int +dtls1_reassemble_fragment(SSL *s, struct hm_header_st* msg_hdr, int *ok) + { + hm_fragment *frag = NULL; + pitem *item = NULL; + int i = -1, is_complete; + PQ_64BIT seq64; + unsigned long frag_len = msg_hdr->frag_len, max_len; + + if ((msg_hdr->frag_off+frag_len) > msg_hdr->msg_len) + goto err; + + /* Determine maximum allowed message size. Depends on (user set) + * maximum certificate length, but 16k is minimum. + */ + if (DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH < s->max_cert_list) + max_len = s->max_cert_list; + else + max_len = DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH; + + if ((msg_hdr->frag_off+frag_len) > max_len) + goto err; + + /* Try to find item in queue */ + pq_64bit_init(&seq64); + pq_64bit_assign_word(&seq64, msg_hdr->seq); + item = pqueue_find(s->d1->buffered_messages, seq64); + pq_64bit_free(&seq64); + + if (item == NULL) + { + frag = dtls1_hm_fragment_new(msg_hdr->msg_len, 1); + if ( frag == NULL) + goto err; + memcpy(&(frag->msg_header), msg_hdr, sizeof(*msg_hdr)); + frag->msg_header.frag_len = frag->msg_header.msg_len; + frag->msg_header.frag_off = 0; + } + else + frag = (hm_fragment*) item->data; + + /* If message is already reassembled, this must be a + * retransmit and can be dropped. + */ + if (frag->reassembly == NULL) + { + unsigned char devnull [256]; + + while (frag_len) + { + i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, + devnull, + frag_len>sizeof(devnull)?sizeof(devnull):frag_len,0); + if (i<=0) goto err; + frag_len -= i; + } + return DTLS1_HM_FRAGMENT_RETRY; + } + + /* read the body of the fragment (header has already been read */ + i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, + frag->fragment + msg_hdr->frag_off,frag_len,0); + if (i<=0 || (unsigned long)i!=frag_len) + goto err; + + RSMBLY_BITMASK_MARK(frag->reassembly, (long)msg_hdr->frag_off, + (long)(msg_hdr->frag_off + frag_len)); + + RSMBLY_BITMASK_IS_COMPLETE(frag->reassembly, (long)msg_hdr->msg_len, + is_complete); + + if (is_complete) + { + OPENSSL_free(frag->reassembly); + frag->reassembly = NULL; + } + + if (item == NULL) + { + pq_64bit_init(&seq64); + pq_64bit_assign_word(&seq64, msg_hdr->seq); + item = pitem_new(seq64, frag); + pq_64bit_free(&seq64); + + if (item == NULL) + { + goto err; + i = -1; + } + + pqueue_insert(s->d1->buffered_messages, item); + } + + return DTLS1_HM_FRAGMENT_RETRY; + +err: + if (frag != NULL) dtls1_hm_fragment_free(frag); + if (item != NULL) OPENSSL_free(item); + *ok = 0; + return i; + } + + +static int dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) { int i=-1; @@ -578,7 +714,13 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) pq_64bit_assign_word(&seq64, msg_hdr->seq); item = pqueue_find(s->d1->buffered_messages, seq64); pq_64bit_free(&seq64); - + + /* If we already have an entry and this one is a fragment, + * don't discard it and rather try to reassemble it. + */ + if (item != NULL && frag_len < msg_hdr->msg_len) + item = NULL; + /* Discard the message if sequence number was already there, is * too far in the future, already in the queue or if we received * a FINISHED before the SERVER_HELLO, which then must be a stale @@ -599,20 +741,25 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) frag_len -= i; } } + else + { + if (frag_len && frag_len < msg_hdr->msg_len) + return dtls1_reassemble_fragment(s, msg_hdr, ok); - if (frag_len) - { - frag = dtls1_hm_fragment_new(frag_len); + frag = dtls1_hm_fragment_new(frag_len, 0); if ( frag == NULL) goto err; memcpy(&(frag->msg_header), msg_hdr, sizeof(*msg_hdr)); - /* read the body of the fragment (header has already been read) */ - i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, - frag->fragment,frag_len,0); - if (i<=0 || (unsigned long)i!=frag_len) - goto err; + if (frag_len) + { + /* read the body of the fragment (header has already been read) */ + i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, + frag->fragment,frag_len,0); + if (i<=0 || (unsigned long)i!=frag_len) + goto err; + } pq_64bit_init(&seq64); pq_64bit_assign_word(&seq64, msg_hdr->seq); @@ -623,7 +770,7 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) goto err; pqueue_insert(s->d1->buffered_messages, item); - } + } return DTLS1_HM_FRAGMENT_RETRY; @@ -639,14 +786,14 @@ static long dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) { unsigned char wire[DTLS1_HM_HEADER_LENGTH]; - unsigned long l, frag_off, frag_len; + unsigned long len, frag_off, frag_len; int i,al; struct hm_header_st msg_hdr; /* see if we have the required fragment already */ if ((frag_len = dtls1_retrieve_buffered_fragment(s,max,ok)) || *ok) { - if (*ok) s->init_num += frag_len; + if (*ok) s->init_num = frag_len; return frag_len; } @@ -671,10 +818,13 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) if ( msg_hdr.seq != s->d1->handshake_read_seq) return dtls1_process_out_of_seq_message(s, &msg_hdr, ok); - l = msg_hdr.msg_len; + len = msg_hdr.msg_len; frag_off = msg_hdr.frag_off; frag_len = msg_hdr.frag_len; + if (frag_len && frag_len < len) + return dtls1_reassemble_fragment(s, &msg_hdr, ok); + if (!s->server && s->d1->r_msg_hdr.frag_off == 0 && wire[0] == SSL3_MT_HELLO_REQUEST) { @@ -734,7 +884,7 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) * s->init_buf->data, but as a counter summing up fragments' * lengths: as soon as they sum up to handshake packet * length, we assume we have got all the fragments. */ - s->init_num += frag_len; + s->init_num = frag_len; return frag_len; f_err: @@ -888,6 +1038,8 @@ unsigned long dtls1_output_cert_chain(SSL *s, X509 *x) } X509_verify_cert(&xs_ctx); + /* Don't leave errors in the queue */ + ERR_clear_error(); for (i=0; i < sk_X509_num(xs_ctx.chain); i++) { x = sk_X509_value(xs_ctx.chain, i); @@ -1010,7 +1162,7 @@ dtls1_buffer_message(SSL *s, int is_ccs) * been serialized */ OPENSSL_assert(s->init_off == 0); - frag = dtls1_hm_fragment_new(s->init_num); + frag = dtls1_hm_fragment_new(s->init_num, 0); memcpy(frag->fragment, s->init_buf->data, s->init_num); diff --git a/ssl/d1_clnt.c b/ssl/d1_clnt.c index 223d116..0aa77ee 100644 --- a/ssl/d1_clnt.c +++ b/ssl/d1_clnt.c @@ -144,7 +144,7 @@ IMPLEMENT_dtls1_meth_func(DTLSv1_client_method, int dtls1_connect(SSL *s) { BUF_MEM *buf=NULL; - unsigned long Time=(unsigned long)time(NULL),l; + unsigned long Time=(unsigned long)time(NULL); void (*cb)(const SSL *ssl,int type,int val)=NULL; int ret= -1; int new_state,state,skip=0;; @@ -374,7 +374,6 @@ int dtls1_connect(SSL *s) dtls1_start_timer(s); ret=dtls1_send_client_key_exchange(s); if (ret <= 0) goto end; - l=s->s3->tmp.new_cipher->algorithms; /* EAY EAY EAY need to check for DH fix cert * sent back */ /* For TLS, cert_req is set to 2, so a cert chain diff --git a/ssl/d1_enc.c b/ssl/d1_enc.c index 3dfa5ad..4a6c909 100644 --- a/ssl/d1_enc.c +++ b/ssl/d1_enc.c @@ -131,13 +131,11 @@ int dtls1_enc(SSL *s, int send) SSL3_RECORD *rec; EVP_CIPHER_CTX *ds; unsigned long l; - int bs,i,ii,j,k,n=0; + int bs,i,ii,j,k; const EVP_CIPHER *enc; if (send) { - if (s->write_hash != NULL) - n=EVP_MD_size(s->write_hash); ds=s->enc_write_ctx; rec= &(s->s3->wrec); if (s->enc_write_ctx == NULL) @@ -158,8 +156,6 @@ int dtls1_enc(SSL *s, int send) } else { - if (s->read_hash != NULL) - n=EVP_MD_size(s->read_hash); ds=s->enc_read_ctx; rec= &(s->s3->rrec); if (s->enc_read_ctx == NULL) diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c index 63bfbac..54e1640 100644 --- a/ssl/d1_lib.c +++ b/ssl/d1_lib.c @@ -305,6 +305,16 @@ struct timeval* dtls1_get_timeout(SSL *s, struct timeval* timeleft) timeleft->tv_usec += 1000000; } + /* If remaining time is less than 15 ms, set it to 0 + * to prevent issues because of small devergences with + * socket timeouts. + */ + if (timeleft->tv_sec == 0 && timeleft->tv_usec < 15000) + { + memset(timeleft, 0, sizeof(struct timeval)); + } + + return timeleft; } diff --git a/ssl/d1_pkt.c b/ssl/d1_pkt.c index ca2d73f..3f19077 100644 --- a/ssl/d1_pkt.c +++ b/ssl/d1_pkt.c @@ -156,6 +156,9 @@ dtls1_copy_record(SSL *s, pitem *item) s->packet_length = rdata->packet_length; memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER)); memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD)); + + /* Set proper sequence number for mac calculation */ + memcpy(&(s->s3->read_sequence[2]), &(rdata->packet[5]), 6); return(1); } @@ -253,9 +256,6 @@ dtls1_process_buffered_records(SSL *s) item = pqueue_peek(s->d1->unprocessed_rcds.q); if (item) { - DTLS1_RECORD_DATA *rdata; - rdata = (DTLS1_RECORD_DATA *)item->data; - /* Check if epoch is current. */ if (s->d1->unprocessed_rcds.epoch != s->d1->r_epoch) return(1); /* Nothing to do. */ @@ -328,7 +328,7 @@ dtls1_get_buffered_record(SSL *s) static int dtls1_process_record(SSL *s) { - int i,al; + int al; int clear=0; int enc_err; SSL_SESSION *sess; @@ -374,7 +374,7 @@ dtls1_process_record(SSL *s) goto err; /* otherwise enc_err == -1 */ - goto decryption_failed_or_bad_record_mac; + goto err; } #ifdef TLS_DEBUG @@ -400,7 +400,7 @@ if ( (sess == NULL) || SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG); goto f_err; #else - goto decryption_failed_or_bad_record_mac; + goto err; #endif } /* check the MAC for rr->input (it's in mac_size bytes at the tail) */ @@ -411,14 +411,14 @@ if ( (sess == NULL) || SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_LENGTH_TOO_SHORT); goto f_err; #else - goto decryption_failed_or_bad_record_mac; + goto err; #endif } rr->length-=mac_size; - i=s->method->ssl3_enc->mac(s,md,0); + s->method->ssl3_enc->mac(s,md,0); if (memcmp(md,&(rr->data[rr->length]),mac_size) != 0) { - goto decryption_failed_or_bad_record_mac; + goto err; } } @@ -460,14 +460,6 @@ if ( (sess == NULL) || dtls1_record_bitmap_update(s, &(s->d1->bitmap));/* Mark receipt of record. */ return(1); -decryption_failed_or_bad_record_mac: - /* Separate 'decryption_failed' alert was introduced with TLS 1.0, - * SSL 3.0 only has 'bad_record_mac'. But unless a decryption - * failure is directly visible from the ciphertext anyway, - * we should not reveal which kind of error occured -- this - * might become visible to an attacker (e.g. via logfile) */ - al=SSL_AD_BAD_RECORD_MAC; - SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC); f_err: ssl3_send_alert(s,SSL3_AL_FATAL,al); err: @@ -489,19 +481,16 @@ int dtls1_get_record(SSL *s) int ssl_major,ssl_minor; int i,n; SSL3_RECORD *rr; - SSL_SESSION *sess; unsigned char *p = NULL; unsigned short version; DTLS1_BITMAP *bitmap; unsigned int is_next_epoch; rr= &(s->s3->rrec); - sess=s->session; /* The epoch may have changed. If so, process all the * pending records. This is a non-blocking operation. */ - if ( ! dtls1_process_buffered_records(s)) - return 0; + dtls1_process_buffered_records(s); /* if we're renegotiating, then there may be buffered records */ if (dtls1_get_processed_record(s)) @@ -624,21 +613,26 @@ again: /* just read a 0 length packet */ if (rr->length == 0) goto again; - /* If this record is from the next epoch (either HM or ALERT), buffer it - * since it cannot be processed at this time. - * Records from the next epoch are marked as received even though they are - * not processed, so as to prevent any potential resource DoS attack */ - if (is_next_epoch) - { - dtls1_record_bitmap_update(s, bitmap); - dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), &rr->seq_num); - rr->length = 0; + /* If this record is from the next epoch (either HM or ALERT), + * and a handshake is currently in progress, buffer it since it + * cannot be processed at this time. */ + if (is_next_epoch) + { + if (SSL_in_init(s) || s->in_handshake) + { + dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), &rr->seq_num); + } + rr->length = 0; s->packet_length = 0; goto again; } - if ( ! dtls1_process_record(s)) - return(0); + if (!dtls1_process_record(s)) + { + rr->length = 0; + s->packet_length=0; /* dump this record */ + goto again; /* get another record */ + } dtls1_clear_timeouts(s); /* done waiting */ return(1); @@ -766,7 +760,7 @@ start: * buffer the application data for later processing rather * than dropping the connection. */ - dtls1_buffer_record(s, &(s->d1->buffered_app_data), 0); + dtls1_buffer_record(s, &(s->d1->buffered_app_data), &rr->seq_num); rr->length = 0; goto start; } diff --git a/ssl/dtls1.h b/ssl/dtls1.h index a8ce51a..697ff6e 100644 --- a/ssl/dtls1.h +++ b/ssl/dtls1.h @@ -165,6 +165,7 @@ typedef struct hm_fragment_st { struct hm_header_st msg_header; unsigned char *fragment; + unsigned char *reassembly; } hm_fragment; typedef struct dtls1_state_st diff --git a/ssl/s23_clnt.c b/ssl/s23_clnt.c index de02389..c6b9142 100644 --- a/ssl/s23_clnt.c +++ b/ssl/s23_clnt.c @@ -369,7 +369,9 @@ static int ssl23_client_hello(SSL *s) } s2n(i,p); p+=i; - +#ifdef OPENSSL_NO_COMP + *(p++)=1; +#else /* COMPRESSION */ if (s->ctx->comp_methods == NULL) j=0; @@ -381,6 +383,7 @@ static int ssl23_client_hello(SSL *s) comp=sk_SSL_COMP_value(s->ctx->comp_methods,i); *(p++)=comp->id; } +#endif *(p++)=0; /* Add the NULL method */ #ifndef OPENSSL_NO_TLSEXT if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) diff --git a/ssl/s23_lib.c b/ssl/s23_lib.c index fc29813..0b82777 100644 --- a/ssl/s23_lib.c +++ b/ssl/s23_lib.c @@ -97,14 +97,8 @@ SSL_CIPHER *ssl23_get_cipher(unsigned int u) * available */ SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p) { - SSL_CIPHER c,*cp; - unsigned long id; - int n; + SSL_CIPHER *cp; - n=ssl3_num_ciphers(); - id=0x03000000|((unsigned long)p[0]<<16L)| - ((unsigned long)p[1]<<8L)|(unsigned long)p[2]; - c.id=id; cp=ssl3_get_cipher_by_char(p); #ifndef OPENSSL_NO_SSL2 if (cp == NULL) diff --git a/ssl/s2_srvr.c b/ssl/s2_srvr.c index 01d62fa..eeffe25 100644 --- a/ssl/s2_srvr.c +++ b/ssl/s2_srvr.c @@ -697,7 +697,6 @@ static int server_hello(SSL *s) { unsigned char *p,*d; int n,hit; - STACK_OF(SSL_CIPHER) *sk; p=(unsigned char *)s->init_buf->data; if (s->state == SSL2_ST_SEND_SERVER_HELLO_A) @@ -778,7 +777,6 @@ static int server_hello(SSL *s) /* lets send out the ciphers we like in the * prefered order */ - sk= s->session->ciphers; n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d,0); d+=n; s2n(n,p); /* add cipher length */ diff --git a/ssl/s3_both.c b/ssl/s3_both.c index 7f46225..869a25d 100644 --- a/ssl/s3_both.c +++ b/ssl/s3_both.c @@ -354,6 +354,8 @@ unsigned long ssl3_output_cert_chain(SSL *s, X509 *x) return(0); } X509_verify_cert(&xs_ctx); + /* Don't leave errors in the queue */ + ERR_clear_error(); for (i=0; i < sk_X509_num(xs_ctx.chain); i++) { x = sk_X509_value(xs_ctx.chain, i); diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c index e5138b6..f0995b9 100644 --- a/ssl/s3_clnt.c +++ b/ssl/s3_clnt.c @@ -166,7 +166,7 @@ IMPLEMENT_ssl3_meth_func(SSLv3_client_method, int ssl3_connect(SSL *s) { BUF_MEM *buf=NULL; - unsigned long Time=(unsigned long)time(NULL),l; + unsigned long Time=(unsigned long)time(NULL); void (*cb)(const SSL *ssl,int type,int val)=NULL; int ret= -1; int new_state,state,skip=0; @@ -360,7 +360,6 @@ int ssl3_connect(SSL *s) case SSL3_ST_CW_KEY_EXCH_B: ret=ssl3_send_client_key_exchange(s); if (ret <= 0) goto end; - l=s->s3->tmp.new_cipher->algorithms; /* EAY EAY EAY need to check for DH fix cert * sent back */ /* For TLS, cert_req is set to 2, so a cert chain @@ -1377,6 +1376,7 @@ int ssl3_get_key_exchange(SSL *s) s->session->sess_cert->peer_ecdh_tmp=ecdh; ecdh=NULL; BN_CTX_free(bn_ctx); + bn_ctx = NULL; EC_POINT_free(srvr_ecpoint); srvr_ecpoint = NULL; } diff --git a/ssl/s3_enc.c b/ssl/s3_enc.c index 06e5466..1539a4c 100644 --- a/ssl/s3_enc.c +++ b/ssl/s3_enc.c @@ -191,7 +191,7 @@ static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num) int ssl3_change_cipher_state(SSL *s, int which) { - unsigned char *p,*key_block,*mac_secret; + unsigned char *p,*mac_secret; unsigned char exp_key[EVP_MAX_KEY_LENGTH]; unsigned char exp_iv[EVP_MAX_IV_LENGTH]; unsigned char *ms,*key,*iv,*er1,*er2; @@ -214,7 +214,6 @@ int ssl3_change_cipher_state(SSL *s, int which) else comp=s->s3->tmp.new_compression->method; #endif - key_block=s->s3->tmp.key_block; if (which & SSL3_CC_READ) { diff --git a/ssl/ssl_algs.c b/ssl/ssl_algs.c index 2d9077e..6488cdf 100644 --- a/ssl/ssl_algs.c +++ b/ssl/ssl_algs.c @@ -102,6 +102,14 @@ int SSL_library_init(void) EVP_add_digest_alias(SN_sha1,"ssl3-sha1"); EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA); #endif +#ifndef OPENSSL_NO_SHA256 + EVP_add_digest(EVP_sha224()); + EVP_add_digest(EVP_sha256()); +#endif +#ifndef OPENSSL_NO_SHA512 + EVP_add_digest(EVP_sha384()); + EVP_add_digest(EVP_sha512()); +#endif #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_DSA) EVP_add_digest(EVP_dss1()); /* DSA with sha1 */ EVP_add_digest_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2); diff --git a/ssl/ssl_asn1.c b/ssl/ssl_asn1.c index d82e47a..df8ec82 100644 --- a/ssl/ssl_asn1.c +++ b/ssl/ssl_asn1.c @@ -297,7 +297,7 @@ int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, long length) { - int version,ssl_version=0,i; + int ssl_version=0,i; long id; ASN1_INTEGER ai,*aip; ASN1_OCTET_STRING os,*osp; @@ -311,7 +311,6 @@ SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, ai.data=NULL; ai.length=0; M_ASN1_D2I_get_x(ASN1_INTEGER,aip,d2i_ASN1_INTEGER); - version=(int)ASN1_INTEGER_get(aip); if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; } /* we don't care about the version right now :-) */ diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c index 16fda5d..361cd9c 100644 --- a/ssl/ssl_cert.c +++ b/ssl/ssl_cert.c @@ -753,6 +753,8 @@ int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, sk_X509_NAME_push(stack,xn); } + ERR_clear_error(); + if (0) { err: diff --git a/ssl/ssl_ciph.c b/ssl/ssl_ciph.c index 5e2d436..a34680e 100644 --- a/ssl/ssl_ciph.c +++ b/ssl/ssl_ciph.c @@ -777,7 +777,7 @@ static int ssl_cipher_process_rulestr(const char *rule_str, CIPHER_ORDER **tail_p, SSL_CIPHER **ca_list) { unsigned long algorithms, mask, algo_strength, mask_strength; - const char *l, *start, *buf; + const char *l, *buf; int j, multi, found, rule, retval, ok, buflen; unsigned long cipher_id = 0, ssl_version = 0; char ch; @@ -809,7 +809,6 @@ static int ssl_cipher_process_rulestr(const char *rule_str, algorithms = mask = algo_strength = mask_strength = 0; - start=l; for (;;) { ch = *l; @@ -1100,7 +1099,7 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) int is_export,pkl,kl; const char *ver,*exp_str; const char *kx,*au,*enc,*mac; - unsigned long alg,alg2,alg_s; + unsigned long alg,alg2; #ifdef KSSL_DEBUG static const char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s AL=%lx\n"; #else @@ -1108,7 +1107,6 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) #endif /* KSSL_DEBUG */ alg=cipher->algorithms; - alg_s=cipher->algo_strength; alg2=cipher->algorithm2; is_export=SSL_C_IS_EXPORT(cipher); diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index 15650da..b6b8e60 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -1940,15 +1940,13 @@ int check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs) /* THIS NEEDS CLEANING UP */ X509 *ssl_get_server_send_cert(SSL *s) { - unsigned long alg,mask,kalg; + unsigned long alg,kalg; CERT *c; - int i,is_export; + int i; c=s->cert; ssl_set_cert_masks(c, s->s3->tmp.new_cipher); alg=s->s3->tmp.new_cipher->algorithms; - is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher); - mask=is_export?c->export_mask:c->mask; kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK); if (kalg & SSL_kECDH) diff --git a/ssl/ssltest.c b/ssl/ssltest.c index b09c542..310e067 100644 --- a/ssl/ssltest.c +++ b/ssl/ssltest.c @@ -1351,7 +1351,6 @@ int doit(SSL *s_ssl, SSL *c_ssl, long count) BIO *c_bio=NULL; BIO *s_bio=NULL; int c_r,c_w,s_r,s_w; - int c_want,s_want; int i,j; int done=0; int c_write,s_write; @@ -1386,8 +1385,6 @@ int doit(SSL *s_ssl, SSL *c_ssl, long count) c_r=0; s_r=1; c_w=1; s_w=0; - c_want=W_WRITE; - s_want=0; c_write=1,s_write=0; /* We can always do writes */ diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c index dab6e44..3483098 100644 --- a/ssl/t1_enc.c +++ b/ssl/t1_enc.c @@ -125,7 +125,7 @@ static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec, int sec_len, unsigned char *seed, int seed_len, unsigned char *out, int olen) { - int chunk,n; + int chunk; unsigned int j; HMAC_CTX ctx; HMAC_CTX ctx_tmp; @@ -143,7 +143,6 @@ static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec, HMAC_Update(&ctx,seed,seed_len); HMAC_Final(&ctx,A1,&A1_len); - n=0; for (;;) { HMAC_Init_ex(&ctx,NULL,0,NULL,NULL); /* re-init */ @@ -227,14 +226,14 @@ static void tls1_generate_key_block(SSL *s, unsigned char *km, int tls1_change_cipher_state(SSL *s, int which) { static const unsigned char empty[]=""; - unsigned char *p,*key_block,*mac_secret; + unsigned char *p,*mac_secret; unsigned char *exp_label,buf[TLS_MD_MAX_CONST_SIZE+ SSL3_RANDOM_SIZE*2]; unsigned char tmp1[EVP_MAX_KEY_LENGTH]; unsigned char tmp2[EVP_MAX_KEY_LENGTH]; unsigned char iv1[EVP_MAX_IV_LENGTH*2]; unsigned char iv2[EVP_MAX_IV_LENGTH*2]; - unsigned char *ms,*key,*iv,*er1,*er2; + unsigned char *ms,*key,*iv; int client_write; EVP_CIPHER_CTX *dd; const EVP_CIPHER *c; @@ -251,9 +250,10 @@ int tls1_change_cipher_state(SSL *s, int which) #ifndef OPENSSL_NO_COMP comp=s->s3->tmp.new_compression; #endif - key_block=s->s3->tmp.key_block; #ifdef KSSL_DEBUG + key_block=s->s3->tmp.key_block; + printf("tls1_change_cipher_state(which= %d) w/\n", which); printf("\talg= %ld, comp= %p\n", s->s3->tmp.new_cipher->algorithms, (void *)comp); @@ -348,8 +348,6 @@ int tls1_change_cipher_state(SSL *s, int which) cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl; /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */ k=EVP_CIPHER_iv_length(c); - er1= &(s->s3->client_random[0]); - er2= &(s->s3->server_random[0]); if ( (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) || (which == SSL3_CHANGE_CIPHER_SERVER_READ)) { @@ -535,13 +533,11 @@ int tls1_enc(SSL *s, int send) SSL3_RECORD *rec; EVP_CIPHER_CTX *ds; unsigned long l; - int bs,i,ii,j,k,n=0; + int bs,i,ii,j,k; const EVP_CIPHER *enc; if (send) { - if (s->write_hash != NULL) - n=EVP_MD_size(s->write_hash); ds=s->enc_write_ctx; rec= &(s->s3->wrec); if (s->enc_write_ctx == NULL) @@ -551,8 +547,6 @@ int tls1_enc(SSL *s, int send) } else { - if (s->read_hash != NULL) - n=EVP_MD_size(s->read_hash); ds=s->enc_read_ctx; rec= &(s->s3->rrec); if (s->enc_read_ctx == NULL) diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c index 8b53112..0cc8320 100644 --- a/ssl/t1_lib.c +++ b/ssl/t1_lib.c @@ -432,14 +432,23 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in switch (servname_type) { case TLSEXT_NAMETYPE_host_name: - if (s->session->tlsext_hostname == NULL) + if (!s->hit) { - if (len > TLSEXT_MAXLEN_host_name || - ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)) + if(s->session->tlsext_hostname) + { + *al = SSL_AD_DECODE_ERROR; + return 0; + } + if (len > TLSEXT_MAXLEN_host_name) { *al = TLS1_AD_UNRECOGNIZED_NAME; return 0; } + if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL) + { + *al = TLS1_AD_INTERNAL_ERROR; + return 0; + } memcpy(s->session->tlsext_hostname, sdata, len); s->session->tlsext_hostname[len]='\0'; if (strlen(s->session->tlsext_hostname) != len) { @@ -452,7 +461,8 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in } else - s->servername_done = strlen(s->session->tlsext_hostname) == len + s->servername_done = s->session->tlsext_hostname + && strlen(s->session->tlsext_hostname) == len && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0; break; @@ -601,9 +611,9 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al) { + unsigned short length; unsigned short type; unsigned short size; - unsigned short len; unsigned char *data = *p; int tlsext_servername = 0; int renegotiate_seen = 0; @@ -611,7 +621,12 @@ int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in if (data >= (d+n-2)) goto ri_check; - n2s(data,len); + n2s(data,length); + if (data+length != d+n) + { + *al = SSL_AD_DECODE_ERROR; + return 0; + } while(data <= (d+n-4)) { diff --git a/test/cms-test.pl b/test/cms-test.pl index 5c87b3a..9c50dff 100755 --- a/test/cms-test.pl +++ b/test/cms-test.pl @@ -54,12 +54,13 @@ # OpenSSL PKCS#7 and CMS implementations. my $ossl_path; - -if ( -f "../apps/openssl" ) { - $ossl_path = "../util/shlib_wrap.sh ../apps/openssl"; +my $redir = " 2>cms.err 1>cms.out"; +# Make MSYS work +if ( $^O eq "MSWin32" && -f "../apps/openssl.exe" ) { + $ossl_path = "cmd /c ..\\apps\\openssl"; } -elsif ( -f "../apps/openssl.exe" ) { - $ossl_path = "../util/shlib_wrap.sh ../apps/openssl.exe"; +elsif ( -f "../apps/openssl$ENV{EXE_EXT}" ) { + $ossl_path = "../util/shlib_wrap.sh ../apps/openssl"; } elsif ( -f "..\\out32dll\\openssl.exe" ) { $ossl_path = "..\\out32dll\\openssl.exe"; @@ -336,10 +337,6 @@ my @smime_cms_comp_tests = ( ); -print "PKCS#7 <=> PKCS#7 consistency tests\n"; - -run_smime_tests( \$badcmd, \@smime_pkcs7_tests, $pk7cmd, $pk7cmd ); - print "CMS => PKCS#7 compatibility tests\n"; run_smime_tests( \$badcmd, \@smime_pkcs7_tests, $cmscmd, $pk7cmd ); @@ -389,14 +386,14 @@ sub run_smime_tests { $rscmd =~ s/-stream//; $rvcmd =~ s/-stream//; } - system("$scmd$rscmd 2>cms.err 1>cms.out"); + system("$scmd$rscmd$redir"); if ($?) { print "$tnam: generation error\n"; $$rv++; exit 1 if $halt_err; next; } - system("$vcmd$rvcmd 2>cms.err 1>cms.out"); + system("$vcmd$rvcmd$redir"); if ($?) { print "$tnam: verify error\n"; $$rv++; diff --git a/tools/c_rehash b/tools/c_rehash index e614fb5..ba4e394 100644 --- a/tools/c_rehash +++ b/tools/c_rehash @@ -7,6 +7,7 @@ my $openssl; my $dir = "/usr/local/ssl"; +my $prefix = "/usr/local/ssl"; if(defined $ENV{OPENSSL}) { $openssl = $ENV{OPENSSL}; diff --git a/tools/c_rehash.in b/tools/c_rehash.in index 4497cbd..8b6d3f5 100644 --- a/tools/c_rehash.in +++ b/tools/c_rehash.in @@ -7,6 +7,7 @@ my $openssl; my $dir; +my $prefix; if(defined $ENV{OPENSSL}) { $openssl = $ENV{OPENSSL}; diff --git a/util/libeay.num b/util/libeay.num index 21f4a8f..dd4c87e 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -2996,7 +2996,7 @@ STORE_method_get_generate_function 3426 EXIST:!VMS:FUNCTION: STORE_meth_get_generate_fn 3426 EXIST:VMS:FUNCTION: STORE_method_set_list_end_function 3427 EXIST:!VMS:FUNCTION: STORE_meth_set_list_end_fn 3427 EXIST:VMS:FUNCTION: -pqueue_print 3428 EXIST::FUNCTION: +pqueue_print 3428 EXIST:!VMSVAX:FUNCTION: EC_GROUP_have_precompute_mult 3429 EXIST::FUNCTION:EC EC_KEY_print_fp 3430 EXIST::FUNCTION:EC,FP_API BN_GF2m_mod_arr 3431 EXIST::FUNCTION: diff --git a/util/mkdef.pl b/util/mkdef.pl index 93dd251..8533771 100755 --- a/util/mkdef.pl +++ b/util/mkdef.pl @@ -975,6 +975,8 @@ sub do_defs $platform{"SHA512_Final"} = "!VMSVAX"; $platform{"SHA512"} = "!VMSVAX"; + $platform{"pqueue_print"} = "!VMSVAX"; + # Info we know about push @ret, map { $_."\\".&info_string($_,"EXIST", diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl index ed4a3f9..ab14497 100644 --- a/util/pl/VC-32.pl +++ b/util/pl/VC-32.pl @@ -49,7 +49,7 @@ if ($FLAVOR =~ /WIN64/) $base_cflags=' /W3 /Gs0 /GF /Gy /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE'; $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE'; # shut up VC8 $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE'; # shut up VC8 - my $f = $shlib?' /MD':' /MT'; + my $f = $shlib || $fips ?' /MD':' /MT'; $lib_cflag='/Zl' if (!$shlib); # remove /DEFAULTLIBs from static lib $opt_cflags=$f.' /Ox'; $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG'; @@ -128,7 +128,7 @@ $inc_def="inc32"; if ($debug) { - $cflags=$dbg_cflags.$base_cflags; + $cflags=$dbg_cflags.$base_cflags.' /Zi'; $lflags.=" /debug"; $mlflags.=' /debug'; } -- cgit v1.1 From dc1c4b92702120dc06348d91c97ca533d7a27bc6 Mon Sep 17 00:00:00 2001 From: brucec Date: Thu, 2 Dec 2010 22:19:30 +0000 Subject: Disallow passing in a count of zero bytes to the bus_space(9) functions. Passing a count of zero on i386 and amd64 for [I386|AMD64]_BUS_SPACE_MEM causes a crash/hang since the 'loop' instruction decrements the counter before checking if it's zero. PR: kern/80980 Discussed with: jhb --- share/man/man9/bus_space.9 | 3 ++ sys/amd64/include/bus.h | 30 +++++++----- sys/arm/include/bus.h | 67 ++++++++++++++++++++++---- sys/i386/include/bus.h | 36 +++++++++----- sys/ia64/include/bus.h | 55 ++++++++++++---------- sys/mips/include/bus.h | 75 +++++++++++++++++++++++++---- sys/pc98/include/bus.h | 16 ++++--- sys/powerpc/include/bus.h | 80 ++++++++++++++++++++++++++----- sys/sparc64/include/bus.h | 115 +++++++++++++++++++++++---------------------- sys/sun4v/include/bus.h | 115 +++++++++++++++++++++++---------------------- 10 files changed, 398 insertions(+), 194 deletions(-) diff --git a/share/man/man9/bus_space.9 b/share/man/man9/bus_space.9 index 5a18dfb..8c832f2 100644 --- a/share/man/man9/bus_space.9 +++ b/share/man/man9/bus_space.9 @@ -719,6 +719,9 @@ or which return data read from bus space (i.e., functions which do not obviously return an error code) do not fail. They could only fail if given invalid arguments, and in that case their behaviour is undefined. +Functions which take a count of bytes must not pass in a count of zero; +doing so will cause a panic if the kernel was compiled with +.Cd "options INVARIANTS" . .Sh TYPES Several types are defined in .In machine/bus.h diff --git a/sys/amd64/include/bus.h b/sys/amd64/include/bus.h index e25f427..c5a0a69 100644 --- a/sys/amd64/include/bus.h +++ b/sys/amd64/include/bus.h @@ -104,6 +104,9 @@ #ifndef _AMD64_BUS_H_ #define _AMD64_BUS_H_ +#include +#include + #include #include @@ -268,7 +271,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) insb(bsh + offset, addr, count); else { @@ -289,7 +292,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) insw(bsh + offset, addr, count); else { @@ -310,7 +313,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) insl(bsh + offset, addr, count); else { @@ -356,7 +359,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -388,7 +391,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -420,7 +423,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -532,7 +535,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) outsb(bsh + offset, addr, count); else { @@ -553,7 +556,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) outsw(bsh + offset, addr, count); else { @@ -574,7 +577,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) outsl(bsh + offset, addr, count); else { @@ -621,7 +624,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -653,7 +656,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -685,7 +688,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -877,6 +880,7 @@ bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -912,6 +916,7 @@ bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -947,6 +952,7 @@ bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ diff --git a/sys/arm/include/bus.h b/sys/arm/include/bus.h index cabf1f7..4df6103 100644 --- a/sys/arm/include/bus.h +++ b/sys/arm/include/bus.h @@ -66,6 +66,9 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ +#include +#include + #include /* @@ -318,21 +321,29 @@ struct bus_space { * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_1: count == 0")); \ __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c)) @@ -340,21 +351,29 @@ struct bus_space { * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_1: count == 0"));\ __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_2: count == 0"));\ __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_4: count == 0"));\ __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_stream_8 count == 0")); \ __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c)) @@ -376,21 +395,29 @@ struct bus_space { * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_1: count == 0"));\ __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_2: count == 0"));\ __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_4: count == 0"));\ __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_8: count == 0"));\ __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c)) @@ -398,34 +425,50 @@ struct bus_space { * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_1: count == 0")); \ __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ -#define bus_space_set_multi_1(t, h, o, v, c) \ +#define bus_space_set_multi_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ __bs_set(sm,1,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_2(t, h, o, v, c) \ +#define bus_space_set_multi_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ __bs_set(sm,2,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_4(t, h, o, v, c) \ +#define bus_space_set_multi_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ __bs_set(sm,4,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_8(t, h, o, v, c) \ +#define bus_space_set_multi_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ __bs_set(sm,8,(t),(h),(o),(v),(c)) @@ -433,25 +476,33 @@ struct bus_space { * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ __bs_copy(8, t, h1, o1, h2, o2, c) /* diff --git a/sys/i386/include/bus.h b/sys/i386/include/bus.h index bfbc6a7..c8a06be 100644 --- a/sys/i386/include/bus.h +++ b/sys/i386/include/bus.h @@ -104,6 +104,9 @@ #ifndef _I386_BUS_H_ #define _I386_BUS_H_ +#include +#include + #include #include @@ -272,7 +275,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) insb(bsh + offset, addr, count); else { @@ -297,7 +300,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) insw(bsh + offset, addr, count); else { @@ -322,7 +325,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) insl(bsh + offset, addr, count); else { @@ -372,7 +375,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -412,7 +415,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -452,7 +455,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -572,7 +575,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) outsb(bsh + offset, addr, count); else { @@ -597,7 +600,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) outsw(bsh + offset, addr, count); else { @@ -622,7 +625,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) outsl(bsh + offset, addr, count); else { @@ -673,7 +676,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -713,7 +716,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -753,7 +756,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -818,6 +821,7 @@ bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) while (count--) outb(addr, value); @@ -832,6 +836,7 @@ bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) while (count--) outw(addr, value); @@ -846,6 +851,7 @@ bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) while (count--) outl(addr, value); @@ -882,6 +888,7 @@ bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) for (; count != 0; count--, addr++) outb(addr, value); @@ -896,6 +903,7 @@ bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) for (; count != 0; count--, addr += 2) outw(addr, value); @@ -910,6 +918,7 @@ bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) for (; count != 0; count--, addr += 4) outl(addr, value); @@ -953,6 +962,7 @@ bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -988,6 +998,7 @@ bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -1023,6 +1034,7 @@ bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ diff --git a/sys/ia64/include/bus.h b/sys/ia64/include/bus.h index 966a75d3..e974a93 100644 --- a/sys/ia64/include/bus.h +++ b/sys/ia64/include/bus.h @@ -91,6 +91,9 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ +#include +#include + #include #include @@ -298,7 +301,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_1(bsh + ofs, bufp, count); else { @@ -311,7 +314,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_2(bsh + ofs, bufp, count); else { @@ -324,7 +327,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_4(bsh + ofs, bufp, count); else { @@ -337,7 +340,7 @@ static __inline void bus_space_read_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_8(bsh + ofs, bufp, count); else { @@ -361,7 +364,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_1(bsh + ofs, bufp, count); else { @@ -374,7 +377,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_2(bsh + ofs, bufp, count); else { @@ -387,7 +390,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_4(bsh + ofs, bufp, count); else { @@ -400,7 +403,7 @@ static __inline void bus_space_write_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_8(bsh + ofs, bufp, count); else { @@ -425,7 +428,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_1(bsh + ofs, bufp, count); else { @@ -439,7 +442,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_2(bsh + ofs, bufp, count); else { @@ -453,7 +456,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_4(bsh + ofs, bufp, count); else { @@ -467,7 +470,7 @@ static __inline void bus_space_read_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_8(bsh + ofs, bufp, count); else { @@ -493,7 +496,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_1(bsh + ofs, bufp, count); else { @@ -507,7 +510,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_2(bsh + ofs, bufp, count); else { @@ -521,7 +524,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_4(bsh + ofs, bufp, count); else { @@ -535,7 +538,7 @@ static __inline void bus_space_write_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *bufp, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_8(bsh + ofs, bufp, count); else { @@ -555,7 +558,7 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); while (count-- > 0) bus_space_write_1(bst, bsh, ofs, val); } @@ -564,7 +567,7 @@ static __inline void bus_space_set_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); while (count-- > 0) bus_space_write_2(bst, bsh, ofs, val); } @@ -573,7 +576,7 @@ static __inline void bus_space_set_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); while (count-- > 0) bus_space_write_4(bst, bsh, ofs, val); } @@ -582,7 +585,7 @@ static __inline void bus_space_set_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); while (count-- > 0) bus_space_write_8(bst, bsh, ofs, val); } @@ -603,7 +606,7 @@ static __inline void bus_space_set_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_1(bsh + ofs, val, count); else { @@ -617,7 +620,7 @@ static __inline void bus_space_set_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_2(bsh + ofs, val, count); else { @@ -631,7 +634,7 @@ static __inline void bus_space_set_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_4(bsh + ofs, val, count); else { @@ -645,7 +648,7 @@ static __inline void bus_space_set_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t count) { - + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_4(bsh + ofs, val, count); else { @@ -674,6 +677,7 @@ bus_space_copy_region_1(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint8_t *dst, *src; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_1(sbsh + sofs, dbsh + dofs, count); return; @@ -698,6 +702,7 @@ bus_space_copy_region_2(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint16_t *dst, *src; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_2(sbsh + sofs, dbsh + dofs, count); return; @@ -722,6 +727,7 @@ bus_space_copy_region_4(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint32_t *dst, *src; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_4(sbsh + sofs, dbsh + dofs, count); return; @@ -746,6 +752,7 @@ bus_space_copy_region_8(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint64_t *dst, *src; + KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_8(sbsh + sofs, dbsh + dofs, count); return; diff --git a/sys/mips/include/bus.h b/sys/mips/include/bus.h index af83d36..6e47347 100644 --- a/sys/mips/include/bus.h +++ b/sys/mips/include/bus.h @@ -73,6 +73,9 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ +#include +#include + #include struct bus_space { @@ -314,21 +317,29 @@ struct bus_space { * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_1: count == 0")); \ __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c)) @@ -336,21 +347,33 @@ struct bus_space { * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_1: count == 0")); \ __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_2: count == 0")); \ __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_4: count == 0")); \ __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_8: count == 0")); \ __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c)) @@ -372,21 +395,33 @@ struct bus_space { * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_multi_stream_1: count == 0")); \ __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_multi_stream_2: count == 0")); \ __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_multi_stream_4: count == 0")); \ __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_multi_stream_8: count == 0")); \ __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c)) @@ -394,34 +429,50 @@ struct bus_space { * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_1: count == 0")); \ __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ -#define bus_space_set_multi_1(t, h, o, v, c) \ +#define bus_space_set_multi_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ __bs_set(sm,1,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_2(t, h, o, v, c) \ +#define bus_space_set_multi_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ __bs_set(sm,2,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_4(t, h, o, v, c) \ +#define bus_space_set_multi_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ __bs_set(sm,4,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_8(t, h, o, v, c) \ +#define bus_space_set_multi_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ __bs_set(sm,8,(t),(h),(o),(v),(c)) @@ -429,25 +480,33 @@ struct bus_space { * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ __bs_copy(8, t, h1, o1, h2, o2, c) /* diff --git a/sys/pc98/include/bus.h b/sys/pc98/include/bus.h index b12845c..a31590e 100644 --- a/sys/pc98/include/bus.h +++ b/sys/pc98/include/bus.h @@ -78,6 +78,7 @@ #ifndef _PC98_BUS_H_ #define _PC98_BUS_H_ +#include #include #include @@ -378,7 +379,7 @@ bus_space_read_multi_##BWN (tag, bsh, offset, buf, cnt) \ TYPE *buf; \ size_t cnt; \ { \ - \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -407,7 +408,7 @@ bus_space_write_multi_##BWN (tag, bsh, offset, buf, cnt) \ const TYPE *buf; \ size_t cnt; \ { \ - \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -433,10 +434,10 @@ bus_space_read_region_##BWN (tag, bsh, offset, buf, cnt) \ bus_space_tag_t tag; \ bus_space_handle_t bsh; \ bus_size_t offset; \ - TYPE *buf; \ + TYPE *buf; \ size_t cnt; \ { \ - \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -465,7 +466,7 @@ bus_space_write_region_##BWN (tag, bsh, offset, buf, cnt) \ const TYPE *buf; \ size_t cnt; \ { \ - \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -494,7 +495,7 @@ bus_space_set_multi_##BWN (tag, bsh, offset, val, cnt) \ TYPE val; \ size_t cnt; \ { \ - \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%2" \ :"=c" (cnt), \ "=d" (offset) \ @@ -522,7 +523,7 @@ bus_space_set_region_##BWN (tag, bsh, offset, val, cnt) \ TYPE val; \ size_t cnt; \ { \ - \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%2" \ :"=c" (cnt), \ "=d" (offset) \ @@ -555,6 +556,7 @@ bus_space_copy_region_##BWN (tag, sbsh, src, dbsh, dst, cnt) \ if (dbsh->bsh_bam.bs_copy_region_1 != sbsh->bsh_bam.bs_copy_region_1) \ panic("bus_space_copy_region: funcs mismatch (ENOSUPPORT)");\ \ + KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=S" (src), \ diff --git a/sys/powerpc/include/bus.h b/sys/powerpc/include/bus.h index 420d022..a96e7c8 100644 --- a/sys/powerpc/include/bus.h +++ b/sys/powerpc/include/bus.h @@ -73,6 +73,9 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ +#include +#include + #include #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) @@ -311,40 +314,57 @@ extern struct bus_space bs_le_tag; * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1 bus_space_read_multi_1 #define bus_space_read_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle(rm,s_2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle(rm,s_4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle(rm,s_8,(t),(h),(o),(a),(c)) /* * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1 bus_space_read_region_1 -#define bus_space_read_region_stream_2(t, h, o, a, c) \ +#define bus_space_read_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_2: count == 0")); \ __bs_nonsingle(rr,s_2,(t),(h),(o),(a),(c)) -#define bus_space_read_region_stream_4(t, h, o, a, c) \ +#define bus_space_read_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_4: count == 0")); \ __bs_nonsingle(rr,s_4,(t),(h),(o),(a),(c)) -#define bus_space_read_region_stream_8(t, h, o, a, c) \ +#define bus_space_read_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_read_region_stream_8: count == 0")); \ __bs_nonsingle(rr,s_8,(t),(h),(o),(a),(c)) /* @@ -364,101 +384,139 @@ extern struct bus_space bs_le_tag; * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1 bus_space_write_multi_1 #define bus_space_write_multi_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_2: count == 0"));\ __bs_nonsingle(wm,s_2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_4: count == 0"));\ __bs_nonsingle(wm,s_4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_multi_stream_8: count == 0"));\ __bs_nonsingle(wm,s_8,(t),(h),(o),(a),(c)) /* * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) -#define bus_space_write_region_8(t, h, o, a, c) \ +#define bus_space_write_region_8(t, h, o, a, c) \ + KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1 bus_space_write_region_1 #define bus_space_write_region_stream_2(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle(wr,s_2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle(wr,s_4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ + KASSERT(c != 0, \ + ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle(wr,s_8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ #define bus_space_set_multi_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ __bs_set(sm,1,(t),(h),(o),(v),(c)) #define bus_space_set_multi_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ __bs_set(sm,2,(t),(h),(o),(v),(c)) #define bus_space_set_multi_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ __bs_set(sm,4,(t),(h),(o),(v),(c)) #define bus_space_set_multi_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ __bs_set(sm,8,(t),(h),(o),(v),(c)) #define bus_space_set_multi_stream_1 bus_space_set_multi_1 #define bus_space_set_multi_stream_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_stream_2: count == 0")); \ __bs_set(sm,s_2,(t),(h),(o),(v),(c)) #define bus_space_set_multi_stream_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_stream_4: count == 0")); \ __bs_set(sm,s_4,(t),(h),(o),(v),(c)) #define bus_space_set_multi_stream_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_multi_stream_8: count == 0")); \ __bs_set(sm,s_8,(t),(h),(o),(v),(c)) /* * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) #define bus_space_set_region_stream_1 bus_space_set_region_1 #define bus_space_set_region_stream_2(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_stream_2: count == 0")); \ __bs_set(sr,s_2,(t),(h),(o),(v),(c)) #define bus_space_set_region_stream_4(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_stream_4: count == 0")); \ __bs_set(sr,s_4,(t),(h),(o),(v),(c)) #define bus_space_set_region_stream_8(t, h, o, v, c) \ + KASSERT(c != 0, ("bus_space_set_region_stream_8: count == 0")); \ __bs_set(sr,s_8,(t),(h),(o),(v),(c)) #if 0 /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ __bs_copy(8, t, h1, o1, h2, o2, c) #define bus_space_copy_region_stream_1 bus_space_copy_region_1 -#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_stream_2: count == 0")) \ __bs_copy(s_2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_stream_4: count == 0")) \ __bs_copy(s_4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c) \ +#define bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c) \ + KASSERT(c != 0, ("bus_space_copy_region_stream_8: count == 0")) \ __bs_copy(s_8, t, h1, o1, h2, o2, c) #endif diff --git a/sys/sparc64/include/bus.h b/sys/sparc64/include/bus.h index da942b6..3348602 100644 --- a/sys/sparc64/include/bus.h +++ b/sys/sparc64/include/bus.h @@ -75,6 +75,9 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ +#include +#include + #ifdef BUS_SPACE_DEBUG #include #endif @@ -239,7 +242,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_1(t, h, o); } @@ -248,7 +251,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_2(t, h, o); } @@ -257,7 +260,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_4(t, h, o); } @@ -266,7 +269,7 @@ static __inline void bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_8(t, h, o); } @@ -311,7 +314,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_1(t, h, o, *a++); } @@ -320,7 +323,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_2(t, h, o, *a++); } @@ -329,7 +332,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_4(t, h, o, *a++); } @@ -338,7 +341,7 @@ static __inline void bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_8(t, h, o, *a++); } @@ -347,7 +350,7 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_1(t, h, o, v); } @@ -356,7 +359,7 @@ static __inline void bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_2(t, h, o, v); } @@ -365,7 +368,7 @@ static __inline void bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_4(t, h, o, v); } @@ -374,7 +377,7 @@ static __inline void bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_8(t, h, o, v); } @@ -383,7 +386,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) *a = bus_space_read_1(t, h, o); } @@ -392,7 +395,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) *a = bus_space_read_2(t, h, o); } @@ -401,7 +404,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) *a = bus_space_read_4(t, h, o); } @@ -410,7 +413,7 @@ static __inline void bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) *a = bus_space_read_8(t, h, o); } @@ -419,7 +422,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) bus_space_write_1(t, h, o, *a); } @@ -428,7 +431,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) bus_space_write_2(t, h, o, *a); } @@ -437,7 +440,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) bus_space_write_4(t, h, o, *a); } @@ -446,7 +449,7 @@ static __inline void bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) bus_space_write_8(t, h, o, *a); } @@ -455,7 +458,7 @@ static __inline void bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o++) bus_space_write_1(t, h, o, v); } @@ -464,7 +467,7 @@ static __inline void bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 2) bus_space_write_2(t, h, o, v); } @@ -473,7 +476,7 @@ static __inline void bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 4) bus_space_write_4(t, h, o, v); } @@ -482,7 +485,7 @@ static __inline void bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 8) bus_space_write_8(t, h, o, v); } @@ -491,7 +494,7 @@ static __inline void bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1++, o2++) bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); } @@ -500,7 +503,7 @@ static __inline void bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 2, o2 += 2) bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); } @@ -509,7 +512,7 @@ static __inline void bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 4, o2 += 4) bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); } @@ -518,7 +521,7 @@ static __inline void bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 8, o2 += 8) bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } @@ -559,7 +562,7 @@ static __inline void bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_1(t, h, o); } @@ -568,7 +571,7 @@ static __inline void bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_2(t, h, o); } @@ -577,7 +580,7 @@ static __inline void bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_4(t, h, o); } @@ -586,7 +589,7 @@ static __inline void bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_8(t, h, o); } @@ -631,7 +634,7 @@ static __inline void bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_1(t, h, o, *a++); } @@ -640,7 +643,7 @@ static __inline void bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_2(t, h, o, *a++); } @@ -649,7 +652,7 @@ static __inline void bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_4(t, h, o, *a++); } @@ -658,7 +661,7 @@ static __inline void bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_8(t, h, o, *a++); } @@ -667,7 +670,7 @@ static __inline void bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_1(t, h, o, v); } @@ -676,7 +679,7 @@ static __inline void bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_2(t, h, o, v); } @@ -685,7 +688,7 @@ static __inline void bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_4(t, h, o, v); } @@ -694,7 +697,7 @@ static __inline void bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_8(t, h, o, v); } @@ -703,7 +706,7 @@ static __inline void bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) *a = bus_space_read_stream_1(t, h, o); } @@ -712,7 +715,7 @@ static __inline void bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) *a = bus_space_read_stream_2(t, h, o); } @@ -721,7 +724,7 @@ static __inline void bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) *a = bus_space_read_stream_4(t, h, o); } @@ -730,7 +733,7 @@ static __inline void bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) *a = bus_space_read_stream_8(t, h, o); } @@ -739,7 +742,7 @@ static __inline void bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) bus_space_write_stream_1(t, h, o, *a); } @@ -748,7 +751,7 @@ static __inline void bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) bus_space_write_stream_2(t, h, o, *a); } @@ -757,7 +760,7 @@ static __inline void bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) bus_space_write_stream_4(t, h, o, *a); } @@ -766,7 +769,7 @@ static __inline void bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) bus_space_write_stream_8(t, h, o, *a); } @@ -775,7 +778,7 @@ static __inline void bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o++) bus_space_write_stream_1(t, h, o, v); } @@ -784,7 +787,7 @@ static __inline void bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 2) bus_space_write_stream_2(t, h, o, v); } @@ -793,7 +796,7 @@ static __inline void bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 4) bus_space_write_stream_4(t, h, o, v); } @@ -802,7 +805,7 @@ static __inline void bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 8) bus_space_write_stream_8(t, h, o, v); } @@ -811,7 +814,7 @@ static __inline void bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1++, o2++) bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, o2)); @@ -821,7 +824,7 @@ static __inline void bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 2, o2 += 2) bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, o2)); @@ -831,7 +834,7 @@ static __inline void bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 4, o2 += 4) bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, o2)); @@ -841,7 +844,7 @@ static __inline void bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 8, o2 += 8) bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } diff --git a/sys/sun4v/include/bus.h b/sys/sun4v/include/bus.h index 51a7ea5..8fe0731 100644 --- a/sys/sun4v/include/bus.h +++ b/sys/sun4v/include/bus.h @@ -79,6 +79,9 @@ #include #endif +#include +#include + #include #include @@ -239,7 +242,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_1(t, h, o); } @@ -248,7 +251,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_2(t, h, o); } @@ -257,7 +260,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_4(t, h, o); } @@ -266,7 +269,7 @@ static __inline void bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_8(t, h, o); } @@ -311,7 +314,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_1(t, h, o, *a++); } @@ -320,7 +323,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_2(t, h, o, *a++); } @@ -329,7 +332,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_4(t, h, o, *a++); } @@ -338,7 +341,7 @@ static __inline void bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_8(t, h, o, *a++); } @@ -347,7 +350,7 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_1(t, h, o, v); } @@ -356,7 +359,7 @@ static __inline void bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_2(t, h, o, v); } @@ -365,7 +368,7 @@ static __inline void bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_4(t, h, o, v); } @@ -374,7 +377,7 @@ static __inline void bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_8(t, h, o, v); } @@ -383,7 +386,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) *a = bus_space_read_1(t, h, o); } @@ -392,7 +395,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) *a = bus_space_read_2(t, h, o); } @@ -401,7 +404,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) *a = bus_space_read_4(t, h, o); } @@ -410,7 +413,7 @@ static __inline void bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) *a = bus_space_read_8(t, h, o); } @@ -419,7 +422,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) bus_space_write_1(t, h, o, *a); } @@ -428,7 +431,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) bus_space_write_2(t, h, o, *a); } @@ -437,7 +440,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) bus_space_write_4(t, h, o, *a); } @@ -446,7 +449,7 @@ static __inline void bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) bus_space_write_8(t, h, o, *a); } @@ -455,7 +458,7 @@ static __inline void bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o++) bus_space_write_1(t, h, o, v); } @@ -464,7 +467,7 @@ static __inline void bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 2) bus_space_write_2(t, h, o, v); } @@ -473,7 +476,7 @@ static __inline void bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 4) bus_space_write_4(t, h, o, v); } @@ -482,7 +485,7 @@ static __inline void bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 8) bus_space_write_8(t, h, o, v); } @@ -491,7 +494,7 @@ static __inline void bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1++, o2++) bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); } @@ -500,7 +503,7 @@ static __inline void bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 2, o2 += 2) bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); } @@ -509,7 +512,7 @@ static __inline void bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 4, o2 += 4) bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); } @@ -518,7 +521,7 @@ static __inline void bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 8, o2 += 8) bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } @@ -559,7 +562,7 @@ static __inline void bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_1(t, h, o); } @@ -568,7 +571,7 @@ static __inline void bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_2(t, h, o); } @@ -577,7 +580,7 @@ static __inline void bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_4(t, h, o); } @@ -586,7 +589,7 @@ static __inline void bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) *a++ = bus_space_read_stream_8(t, h, o); } @@ -631,7 +634,7 @@ static __inline void bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_1(t, h, o, *a++); } @@ -640,7 +643,7 @@ static __inline void bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_2(t, h, o, *a++); } @@ -649,7 +652,7 @@ static __inline void bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_4(t, h, o, *a++); } @@ -658,7 +661,7 @@ static __inline void bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_8(t, h, o, *a++); } @@ -667,7 +670,7 @@ static __inline void bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_1(t, h, o, v); } @@ -676,7 +679,7 @@ static __inline void bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_2(t, h, o, v); } @@ -685,7 +688,7 @@ static __inline void bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_4(t, h, o, v); } @@ -694,7 +697,7 @@ static __inline void bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); while (c-- > 0) bus_space_write_stream_8(t, h, o, v); } @@ -703,7 +706,7 @@ static __inline void bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) *a = bus_space_read_stream_1(t, h, o); } @@ -712,7 +715,7 @@ static __inline void bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) *a = bus_space_read_stream_2(t, h, o); } @@ -721,7 +724,7 @@ static __inline void bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) *a = bus_space_read_stream_4(t, h, o); } @@ -730,7 +733,7 @@ static __inline void bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) *a = bus_space_read_stream_8(t, h, o); } @@ -739,7 +742,7 @@ static __inline void bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o++) bus_space_write_stream_1(t, h, o, *a); } @@ -748,7 +751,7 @@ static __inline void bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 2) bus_space_write_stream_2(t, h, o, *a); } @@ -757,7 +760,7 @@ static __inline void bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 4) bus_space_write_stream_4(t, h, o, *a); } @@ -766,7 +769,7 @@ static __inline void bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; a++, c--, o += 8) bus_space_write_stream_8(t, h, o, *a); } @@ -775,7 +778,7 @@ static __inline void bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o++) bus_space_write_stream_1(t, h, o, v); } @@ -784,7 +787,7 @@ static __inline void bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 2) bus_space_write_stream_2(t, h, o, v); } @@ -793,7 +796,7 @@ static __inline void bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 4) bus_space_write_stream_4(t, h, o, v); } @@ -802,7 +805,7 @@ static __inline void bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o += 8) bus_space_write_stream_8(t, h, o, v); } @@ -811,7 +814,7 @@ static __inline void bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1++, o2++) bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, o2)); @@ -821,7 +824,7 @@ static __inline void bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 2, o2 += 2) bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, o2)); @@ -831,7 +834,7 @@ static __inline void bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 4, o2 += 4) bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, o2)); @@ -841,7 +844,7 @@ static __inline void bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - + KASSERT(c != 0, ("%s: count == 0", __func__)); for (; c; c--, o1 += 8, o2 += 8) bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } -- cgit v1.1 From ae03beb758270fb19d741c93f7bfde88a6635612 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 2 Dec 2010 22:36:51 +0000 Subject: Import OpenSSL 0.9.8q. --- ACKNOWLEDGMENTS | 25 +++++++++++++++++++ CHANGES | 12 ++++++++++ FAQ | 53 +++++++++++++++++++++++++++++++++++++---- Makefile | 2 +- NEWS | 5 ++++ README | 2 +- crypto/evp/p_sign.c | 2 +- crypto/evp/p_verify.c | 2 +- crypto/jpake/jpake.c | 36 +++++++++++++++++++++++++--- crypto/jpake/jpake.h | 2 ++ crypto/jpake/jpake_err.c | 4 +++- crypto/opensslv.h | 6 ++--- crypto/stack/safestack.h | 2 +- doc/ssl/SSL_CTX_set_options.pod | 13 +--------- openssl.spec | 2 +- ssl/s3_clnt.c | 3 +++ ssl/s3_srvr.c | 5 ++++ 17 files changed, 146 insertions(+), 30 deletions(-) create mode 100644 ACKNOWLEDGMENTS diff --git a/ACKNOWLEDGMENTS b/ACKNOWLEDGMENTS new file mode 100644 index 0000000..fb6dd91 --- /dev/null +++ b/ACKNOWLEDGMENTS @@ -0,0 +1,25 @@ +The OpenSSL project depends on volunteer efforts and financial support from +the end user community. That support comes in the form of donations and paid +sponsorships, software support contracts, paid consulting services +and commissioned software development. + +Since all these activities support the continued development and improvement +of OpenSSL we consider all these clients and customers as sponsors of the +OpenSSL project. + +We would like to identify and thank the following such sponsors for their past +or current significant support of the OpenSSL project: + +Very significant support: + + OpenGear: www.opengear.com + +Significant support: + + PSW Group: www.psw.net + +Please note that we ask permission to identify sponsors and that some sponsors +we consider eligible for inclusion here have requested to remain anonymous. + +Additional sponsorship or financial support is always welcome: for more +information please contact the OpenSSL Software Foundation. diff --git a/CHANGES b/CHANGES index 58fd57c..55820db 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,18 @@ OpenSSL CHANGES _______________ + Changes between 0.9.8p and 0.9.8q [2 Dec 2010] + + *) Disable code workaround for ancient and obsolete Netscape browsers + and servers: an attacker can use it in a ciphersuite downgrade attack. + Thanks to Martin Rex for discovering this bug. CVE-2010-4180 + [Steve Henson] + + *) Fixed J-PAKE implementation error, originally discovered by + Sebastien Martini, further info and confirmation from Stefan + Arentz and Feng Hao. Note that this fix is a security fix. CVE-2010-4252 + [Ben Laurie] + Changes between 0.9.8o and 0.9.8p [16 Nov 2010] *) Fix extension code to avoid race conditions which can result in a buffer diff --git a/FAQ b/FAQ index f7bdc88..50e9314 100644 --- a/FAQ +++ b/FAQ @@ -52,6 +52,9 @@ OpenSSL - Frequently Asked Questions * Why does the OpenSSL test suite fail in sha512t on x86 CPU? * Why does compiler fail to compile sha512.c? * Test suite still fails, what to do? +* I think I've found a bug, what should I do? +* I'm SURE I've found a bug, how do I report it? +* I've found a security issue, how do I report it? [PROG] Questions about programming with OpenSSL @@ -79,7 +82,7 @@ OpenSSL - Frequently Asked Questions * Which is the current version of OpenSSL? The current version is available from . -OpenSSL 1.0.0b was released on Nov 16th, 2010. +OpenSSL 1.0.0c was released on Dec 2nd, 2010. In addition to the current stable release, you can also access daily snapshots of the OpenSSL development version at . Some applications that use OpenSSL are distributed in binary form. When using such an application, you don't need to install OpenSSL @@ -463,7 +466,7 @@ administrators. Other projects do have other policies so you can for example extract the CA bundle used by Mozilla and/or modssl as described in this article: - http://www.mail-archive.com/modssl-users@modssl.org/msg16980.html + [BUILD] ======================================================================= @@ -505,7 +508,7 @@ when you run the test suite (using "make test"). The message returned is "bc: 1 not implemented". The best way to deal with this is to find another implementation of bc -and compile/install it. GNU bc (see http://www.gnu.org/software/software.html +and compile/install it. GNU bc (see for download instructions) can be safely used, for example. @@ -516,7 +519,7 @@ that the OpenSSL bntest throws at it. This gets triggered when you run the test suite (using "make test"). The message returned is "bc: stack empty". The best way to deal with this is to find another implementation of bc -and compile/install it. GNU bc (see http://www.gnu.org/software/software.html +and compile/install it. GNU bc (see for download instructions) can be safely used, for example. @@ -709,6 +712,46 @@ never make sense, and tend to emerge when you least expect them. In order to identify one, drop optimization level, e.g. by editing CFLAG line in top-level Makefile, recompile and re-run the test. +* I think I've found a bug, what should I do? + +If you are a new user then it is quite likely you haven't found a bug and +something is happening you aren't familiar with. Check this FAQ, the associated +documentation and the mailing lists for similar queries. If you are still +unsure whether it is a bug or not submit a query to the openssl-users mailing +list. + + +* I'm SURE I've found a bug, how do I report it? + +Bug reports with no security implications should be sent to the request +tracker. This can be done by mailing the report to (or its +alias ), please note that messages sent to the +request tracker also appear in the public openssl-dev mailing list. + +The report should be in plain text. Any patches should be sent as +plain text attachments because some mailers corrupt patches sent inline. +If your issue affects multiple versions of OpenSSL check any patches apply +cleanly and, if possible include patches to each affected version. + +The report should be given a meaningful subject line briefly summarising the +issue. Just "bug in OpenSSL" or "bug in OpenSSL 0.9.8n" is not very helpful. + +By sending reports to the request tracker the bug can then be given a priority +and assigned to the appropriate maintainer. The history of discussions can be +accessed and if the issue has been addressed or a reason why not. If patches +are only sent to openssl-dev they can be mislaid if a team member has to +wade through months of old messages to review the discussion. + +See also + + +* I've found a security issue, how do I report it? + +If you think your bug has security implications then please send it to +openssl-security@openssl.org if you don't get a prompt reply at least +acknowledging receipt then resend or mail it directly to one of the +more active team members (e.g. Steve). + [PROG] ======================================================================== * Is OpenSSL thread-safe? diff --git a/Makefile b/Makefile index f5e8546..1d0d2a0 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ ## Makefile for OpenSSL ## -VERSION=0.9.8p +VERSION=0.9.8q MAJOR=0 MINOR=9.8 SHLIB_VERSION_NUMBER=0.9.8 diff --git a/NEWS b/NEWS index 65f4ef2..df190f8 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,11 @@ This file gives a brief overview of the major changes between each OpenSSL release. For more details please read the CHANGES file. + Major changes between OpenSSL 0.9.8p and OpenSSL 0.9.8q: + + o Fix for security issue CVE-2010-4180 + o Fix for CVE-2010-4252 + Major changes between OpenSSL 0.9.8o and OpenSSL 0.9.8p: o Fix for security issue CVE-2010-3864. diff --git a/README b/README index 36c1d5f..5b015b6 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ - OpenSSL 0.9.8p 16 Nov 2010 + OpenSSL 0.9.8q 2 Dec 2010 Copyright (c) 1998-2009 The OpenSSL Project Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson diff --git a/crypto/evp/p_sign.c b/crypto/evp/p_sign.c index bf41a0d..782d140 100644 --- a/crypto/evp/p_sign.c +++ b/crypto/evp/p_sign.c @@ -81,7 +81,7 @@ int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, unsigned int *siglen, unsigned char m[EVP_MAX_MD_SIZE]; unsigned int m_len; int i,ok=0,v; - MS_STATIC EVP_MD_CTX tmp_ctx; + EVP_MD_CTX tmp_ctx; *siglen=0; for (i=0; i<4; i++) diff --git a/crypto/evp/p_verify.c b/crypto/evp/p_verify.c index 2d46dff..072c127 100644 --- a/crypto/evp/p_verify.c +++ b/crypto/evp/p_verify.c @@ -68,7 +68,7 @@ int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned char m[EVP_MAX_MD_SIZE]; unsigned int m_len; int i,ok=0,v; - MS_STATIC EVP_MD_CTX tmp_ctx; + EVP_MD_CTX tmp_ctx; for (i=0; i<4; i++) { diff --git a/crypto/jpake/jpake.c b/crypto/jpake/jpake.c index 577b7ef..9736f89 100644 --- a/crypto/jpake/jpake.c +++ b/crypto/jpake/jpake.c @@ -283,23 +283,53 @@ int JPAKE_STEP1_generate(JPAKE_STEP1 *send, JPAKE_CTX *ctx) return 1; } +/* g^x is a legal value */ +static int is_legal(const BIGNUM *gx, const JPAKE_CTX *ctx) + { + BIGNUM *t; + int res; + + if(BN_is_negative(gx) || BN_is_zero(gx) || BN_cmp(gx, ctx->p.p) >= 0) + return 0; + + t = BN_new(); + BN_mod_exp(t, gx, ctx->p.q, ctx->p.p, ctx->ctx); + res = BN_is_one(t); + BN_free(t); + + return res; + } + int JPAKE_STEP1_process(JPAKE_CTX *ctx, const JPAKE_STEP1 *received) { - /* verify their ZKP(xc) */ + if(!is_legal(received->p1.gx, ctx)) + { + JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_G_TO_THE_X3_IS_NOT_LEGAL); + return 0; + } + + if(!is_legal(received->p2.gx, ctx)) + { + JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_G_TO_THE_X4_IS_NOT_LEGAL); + return 0; + } + + + /* verify their ZKP(xc) */ if(!verify_zkp(&received->p1, ctx->p.g, ctx)) { JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_VERIFY_X3_FAILED); return 0; } - /* verify their ZKP(xd) */ + /* verify their ZKP(xd) */ if(!verify_zkp(&received->p2, ctx->p.g, ctx)) { JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_VERIFY_X4_FAILED); return 0; } - /* g^xd != 1 */ + /* g^xd != 1 */ if(BN_is_one(received->p2.gx)) { JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_G_TO_THE_X4_IS_ONE); diff --git a/crypto/jpake/jpake.h b/crypto/jpake/jpake.h index 693ea18..fd143b4 100644 --- a/crypto/jpake/jpake.h +++ b/crypto/jpake/jpake.h @@ -115,6 +115,8 @@ void ERR_load_JPAKE_strings(void); #define JPAKE_F_VERIFY_ZKP 100 /* Reason codes. */ +#define JPAKE_R_G_TO_THE_X3_IS_NOT_LEGAL 108 +#define JPAKE_R_G_TO_THE_X4_IS_NOT_LEGAL 109 #define JPAKE_R_G_TO_THE_X4_IS_ONE 105 #define JPAKE_R_HASH_OF_HASH_OF_KEY_MISMATCH 106 #define JPAKE_R_HASH_OF_KEY_MISMATCH 107 diff --git a/crypto/jpake/jpake_err.c b/crypto/jpake/jpake_err.c index 1b95067..a9a9dee 100644 --- a/crypto/jpake/jpake_err.c +++ b/crypto/jpake/jpake_err.c @@ -1,6 +1,6 @@ /* crypto/jpake/jpake_err.c */ /* ==================================================================== - * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. + * Copyright (c) 1999-2010 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -80,6 +80,8 @@ static ERR_STRING_DATA JPAKE_str_functs[]= static ERR_STRING_DATA JPAKE_str_reasons[]= { +{ERR_REASON(JPAKE_R_G_TO_THE_X3_IS_NOT_LEGAL),"g to the x3 is not legal"}, +{ERR_REASON(JPAKE_R_G_TO_THE_X4_IS_NOT_LEGAL),"g to the x4 is not legal"}, {ERR_REASON(JPAKE_R_G_TO_THE_X4_IS_ONE) ,"g to the x4 is one"}, {ERR_REASON(JPAKE_R_HASH_OF_HASH_OF_KEY_MISMATCH),"hash of hash of key mismatch"}, {ERR_REASON(JPAKE_R_HASH_OF_KEY_MISMATCH),"hash of key mismatch"}, diff --git a/crypto/opensslv.h b/crypto/opensslv.h index a560e20..0da91c2 100644 --- a/crypto/opensslv.h +++ b/crypto/opensslv.h @@ -25,11 +25,11 @@ * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for * major minor fix final patch/beta) */ -#define OPENSSL_VERSION_NUMBER 0x0090810f +#define OPENSSL_VERSION_NUMBER 0x0090811f #ifdef OPENSSL_FIPS -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8p-fips 16 Nov 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8q-fips 2 Dec 2010" #else -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8p 16 Nov 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8q 2 Dec 2010" #endif #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/crypto/stack/safestack.h b/crypto/stack/safestack.h index 78cc485..b59c640 100644 --- a/crypto/stack/safestack.h +++ b/crypto/stack/safestack.h @@ -127,7 +127,7 @@ STACK_OF(type) \ sk_is_sorted(CHECKED_PTR_OF(STACK_OF(type), st)) #define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ - (STACK_OF(type) *)d2i_ASN1_SET(CHECKED_PTR_OF(STACK_OF(type), st), \ + (STACK_OF(type) *)d2i_ASN1_SET(CHECKED_PTR_OF(STACK_OF(type)*, st), \ pp, length, \ CHECKED_D2I_OF(type, d2i_func), \ CHECKED_SK_FREE_FUNC(type, free_func), \ diff --git a/doc/ssl/SSL_CTX_set_options.pod b/doc/ssl/SSL_CTX_set_options.pod index 06025d1..a703ce0 100644 --- a/doc/ssl/SSL_CTX_set_options.pod +++ b/doc/ssl/SSL_CTX_set_options.pod @@ -78,18 +78,7 @@ this breaks this server so 16 bytes is the way to go. =item SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG -ssl3.netscape.com:443, first a connection is established with RC4-MD5. -If it is then resumed, we end up using DES-CBC3-SHA. It should be -RC4-MD5 according to 7.6.1.3, 'cipher_suite'. - -Netscape-Enterprise/2.01 (https://merchant.netscape.com) has this bug. -It only really shows up when connecting via SSLv2/v3 then reconnecting -via SSLv3. The cipher list changes.... - -NEW INFORMATION. Try connecting with a cipher list of just -DES-CBC-SHA:RC4-MD5. For some weird reason, each new connection uses -RC4-MD5, but a re-connect tries to use DES-CBC-SHA. So netscape, when -doing a re-connect, always takes the first cipher in the cipher list. +As of OpenSSL 0.9.8q and 1.0.0c, this option has no effect. =item SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG diff --git a/openssl.spec b/openssl.spec index 6c659ff..e05d73a 100644 --- a/openssl.spec +++ b/openssl.spec @@ -2,7 +2,7 @@ %define libmaj 0 %define libmin 9 %define librel 8 -%define librev p +%define librev q Release: 1 %define openssldir /var/ssl diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c index f0995b9..a7cb7a1 100644 --- a/ssl/s3_clnt.c +++ b/ssl/s3_clnt.c @@ -814,8 +814,11 @@ int ssl3_get_server_hello(SSL *s) s->session->cipher_id = s->session->cipher->id; if (s->hit && (s->session->cipher_id != c->id)) { +/* Workaround is now obsolete */ +#if 0 if (!(s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG)) +#endif { al=SSL_AD_ILLEGAL_PARAMETER; SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED); diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c index e696450..e2d570f 100644 --- a/ssl/s3_srvr.c +++ b/ssl/s3_srvr.c @@ -927,6 +927,10 @@ int ssl3_get_client_hello(SSL *s) break; } } +/* Disabled because it can be used in a ciphersuite downgrade + * attack: CVE-2010-4180. + */ +#if 0 if (j == 0 && (s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1)) { /* Special case as client bug workaround: the previously used cipher may @@ -941,6 +945,7 @@ int ssl3_get_client_hello(SSL *s) j = 1; } } +#endif if (j == 0) { /* we need to have the cipher in the cipher -- cgit v1.1 From c282b1e643737544893794ba6246efd065e2076e Mon Sep 17 00:00:00 2001 From: das Date: Fri, 3 Dec 2010 00:05:49 +0000 Subject: Disable gcc's built-in rint() function when compiling s_nearbyint.c. It results in incorrect optimizations that break nearbyint(). PR: 143358 Reviewed by: bde --- lib/msun/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/msun/Makefile b/lib/msun/Makefile index 87bd954..929af97 100644 --- a/lib/msun/Makefile +++ b/lib/msun/Makefile @@ -113,6 +113,12 @@ COMMON_SRCS:= ${COMMON_SRCS:N${i:R}.c} .endfor .endif +# Some files need certain gcc built-in functions to be disabled, since gcc's +# model of the functions bogusly assumes -fno-trapping-math. +XRINT_CFLAGS= -fno-builtin-rint -fno-builtin-rintf -fno-builtin-rintl +CFLAGS+= ${XRINT_CFLAGS} +XRINT_CFLAGS:= ${.IMPSRC:M*/s_nearbyint.c:C/^.+$/${XRINT_CFLAGS}/:C/^$//} + SRCS= ${COMMON_SRCS} ${ARCH_SRCS} INCS= fenv.h math.h -- cgit v1.1 From f7b9a54cd7b1555f6f80b4ca0b1bb00383da384c Mon Sep 17 00:00:00 2001 From: weongyo Date: Fri, 3 Dec 2010 00:44:07 +0000 Subject: Changes the meaning of each characters '<' and '>' that it could be confused with USB OUT or USB IN packets though it just represents USB submit or done. To know the USB packet direction, the endpoint address should be referred. Requested by: jkim --- usr.sbin/usbdump/usbdump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/usbdump/usbdump.c b/usr.sbin/usbdump/usbdump.c index 93e9f21..c6f9048 100644 --- a/usr.sbin/usbdump/usbdump.c +++ b/usr.sbin/usbdump/usbdump.c @@ -247,7 +247,7 @@ print_apacket(const struct bpf_xhdr *hdr, struct usbpf_pkthdr *up, printf(" usbus%d.%d 0x%02x %s %s", up->up_busunit, up->up_address, up->up_endpoint, xfertype_table[up->up_xfertype], - up->up_type == USBPF_XFERTAP_SUBMIT ? ">" : "<"); + up->up_type == USBPF_XFERTAP_SUBMIT ? "S" : "D"); printf(" (%d/%d)", up->up_frames, up->up_length); if (up->up_type == USBPF_XFERTAP_DONE) printf(" %s", errstr_table[up->up_error]); -- cgit v1.1 From ac1004098041b128225379f3633454cd9add4a87 Mon Sep 17 00:00:00 2001 From: das Date: Fri, 3 Dec 2010 00:44:31 +0000 Subject: Add some basic regression tests for nearbyint(). --- tools/regression/lib/msun/Makefile | 2 +- tools/regression/lib/msun/test-nearbyint.c | 100 +++++++++++++++++++++++++++++ tools/regression/lib/msun/test-nearbyint.t | 10 +++ 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 tools/regression/lib/msun/test-nearbyint.c create mode 100644 tools/regression/lib/msun/test-nearbyint.t diff --git a/tools/regression/lib/msun/Makefile b/tools/regression/lib/msun/Makefile index 4a19dc2..d5f1594 100644 --- a/tools/regression/lib/msun/Makefile +++ b/tools/regression/lib/msun/Makefile @@ -2,7 +2,7 @@ TESTS= test-conj test-csqrt test-exponential test-fenv test-fma \ test-fmaxmin test-ilogb test-invtrig test-lrint \ - test-lround test-nan test-next test-rem test-trig + test-lround test-nan test-nearbyint test-next test-rem test-trig CFLAGS+= -O0 -lm .PHONY: tests diff --git a/tools/regression/lib/msun/test-nearbyint.c b/tools/regression/lib/msun/test-nearbyint.c new file mode 100644 index 0000000..630ddb9 --- /dev/null +++ b/tools/regression/lib/msun/test-nearbyint.c @@ -0,0 +1,100 @@ +/*- + * Copyright (c) 2010 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Tests for nearbyint{,f,l}() + * + * TODO: + * - adapt tests for rint(3) + * - tests for harder values (more mantissa bits than float) + * - tests in other rounding modes + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#define ALL_STD_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \ + FE_OVERFLOW | FE_UNDERFLOW) + +/* + * Compare d1 and d2 using special rules: NaN == NaN and +0 != -0. + * Fail an assertion if they differ. + */ +static int +fpequal(long double d1, long double d2) +{ + + if (d1 != d2) + return (isnan(d1) && isnan(d2)); + return (copysignl(1.0, d1) == copysignl(1.0, d2)); +} + +static void testit(int testnum, float in, float out) +{ + + feclearexcept(ALL_STD_EXCEPT); + assert(fpequal(out, nearbyintf(in))); + assert(fpequal(-out, nearbyintf(-in))); + assert(fetestexcept(ALL_STD_EXCEPT) == 0); + + assert(fpequal(out, nearbyint(in))); + assert(fpequal(-out, nearbyint(-in))); + assert(fetestexcept(ALL_STD_EXCEPT) == 0); + + assert(fpequal(out, nearbyintl(in))); + assert(fpequal(-out, nearbyintl(-in))); + assert(fetestexcept(ALL_STD_EXCEPT) == 0); + + printf("ok %d\t\t# nearbyint(%g)\n", testnum, in); +} + +static const float tests[] = { +/* input output (expected) */ + 0.0, 0.0, + 0.5, 0.0, + M_PI, 3, + 65536.5, 65536, + INFINITY, INFINITY, + NAN, NAN, +}; + +int +main(int argc, char *argv[]) +{ + static const int ntests = sizeof(tests) / sizeof(tests[0]) / 2; + int i; + + printf("1..%d\n", ntests); + for (i = 0; i < ntests; i++) + testit(i + 1, tests[i * 2], tests[i * 2 + 1]); + + return (0); +} diff --git a/tools/regression/lib/msun/test-nearbyint.t b/tools/regression/lib/msun/test-nearbyint.t new file mode 100644 index 0000000..8bdfd03 --- /dev/null +++ b/tools/regression/lib/msun/test-nearbyint.t @@ -0,0 +1,10 @@ +#!/bin/sh +# $FreeBSD$ + +cd `dirname $0` + +executable=`basename $0 .t` + +make $executable 2>&1 > /dev/null + +exec ./$executable -- cgit v1.1 From 77ac3eb10d1ef260697cd97fbf567cf09524d012 Mon Sep 17 00:00:00 2001 From: gordon Date: Fri, 3 Dec 2010 02:07:34 +0000 Subject: Add ability to decompress different format manual pages. Add support for .so directive in manual pages. Approved by: mentor (wes@) --- usr.bin/man/man.sh | 104 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 25 deletions(-) diff --git a/usr.bin/man/man.sh b/usr.bin/man/man.sh index 454a3c3..7b6b928 100755 --- a/usr.bin/man/man.sh +++ b/usr.bin/man/man.sh @@ -94,6 +94,7 @@ check_cat() { if exists "$1"; then use_cat=yes catpage=$found + setup_cattool $catpage decho " Found catpage $catpage" return 0 else @@ -108,12 +109,14 @@ check_man() { if exists "$1"; then # We have a match, check for a cat page manpage=$found + setup_cattool $manpage decho " Found manpage $manpage" if exists "$2" && is_newer $found $manpage; then # cat page found and is newer, use that use_cat=yes catpage=$found + setup_cattool $catpage decho " Using catpage $catpage" else # no cat page or is older @@ -240,6 +243,35 @@ manpath_warnings() { fi } +# Usage: man_check_for_so page path +# Returns: True if able to resolve the file, false if it ended in tears. +# Detects the presence of the .so directive and causes the file to be +# redirected to another source file. +man_check_for_so() { + local IFS line tstr + + unset IFS + + # We need to loop to accommodate multiple .so directives. + while true + do + line=$($cattool $manpage | head -1) + case "$line" in + .so*) trim "${line#.so}" + decho "$manpage includes $tstr" + # Glob and check for the file. + if ! check_man "$path/$tstr*" ""; then + decho " Unable to find $tstr" + return 1 + fi + ;; + *) break ;; + esac + done + + return 0 +} + # Usage: man_display_page # Display either the manpage or catpage depending on the use_cat variable man_display_page() { @@ -258,10 +290,10 @@ man_display_page() { ret=0 else if [ $debug -gt 0 ]; then - decho "Command: $ZCAT $catpage | $PAGER" + decho "Command: $cattool $catpage | $PAGER" ret=0 else - eval "$ZCAT $catpage | $PAGER" + eval "$cattool $catpage | $PAGER" ret=$? fi fi @@ -343,10 +375,10 @@ man_display_page() { fi if [ $debug -gt 0 ]; then - decho "Command: $ZCAT $manpage | $pipeline" + decho "Command: $cattool $manpage | $pipeline" ret=0 else - eval "$ZCAT $manpage | $pipeline" + eval "$cattool $manpage | $pipeline" ret=$? fi } @@ -361,10 +393,13 @@ man_find_and_display() { case "$1" in */*) if [ -f "$1" -a -r "$1" ]; then decho "Found a usable page, displaying that" - found_page=yes unset use_cat manpage="$1" - man_display_page + setup_cattool $manpage + if man_check_for_so $manpage $(dirname $manpage); then + found_page=yes + man_display_page + fi return fi ;; @@ -380,35 +415,41 @@ man_find_and_display() { # Check if there is a MACHINE specific manpath. if find_file $p $sect $MACHINE "$1"; then - found_page=yes - man_display_page - if [ -n "$aflag" ]; then - continue 2 - else - return + if man_check_for_so $manpage $p; then + found_page=yes + man_display_page + if [ -n "$aflag" ]; then + continue 2 + else + return + fi fi fi # Check if there is a MACHINE_ARCH # specific manpath. if find_file $p $sect $MACHINE_ARCH "$1"; then - found_page=yes - man_display_page - if [ -n "$aflag" ]; then - continue 2 - else - return + if man_check_for_so $manpage $p; then + found_page=yes + man_display_page + if [ -n "$aflag" ]; then + continue 2 + else + return + fi fi fi # Check plain old manpath. if find_file $p $sect '' "$1"; then - found_page=yes - man_display_page - if [ -n "$aflag" ]; then - continue 2 - else - return + if man_check_for_so $manpage $p; then + found_page=yes + man_display_page + if [ -n "$aflag" ]; then + continue 2 + else + return + fi fi fi done @@ -749,6 +790,19 @@ search_whatis() { exit $rval } +# Usage: setup_cattool page +# Finds an appropriate decompressor based on extension +setup_cattool() { + case "$1" in + *.bz) cattool='/usr/bin/bzcat' ;; + *.bz2) cattool='/usr/bin/bzcat' ;; + *.gz) cattool='/usr/bin/zcat' ;; + *.lzma) cattool='/usr/bin/lzcat' ;; + *.xz) cattool='/usr/bin/xzcat' ;; + *) cattool='/usr/bin/zcat -f' ;; + esac +} + # Usage: setup_pager # Correctly sets $PAGER setup_pager() { @@ -845,11 +899,11 @@ TBL=/usr/bin/tbl TROFF='/usr/bin/groff -S -man' REFER=/usr/bin/refer VGRIND=/usr/bin/vgrind -ZCAT='/usr/bin/zcat -f' debug=0 man_default_sections='1:1aout:8:2:3:n:4:5:6:7:9:l' man_default_path='/usr/share/man:/usr/share/openssl/man:/usr/local/man' +cattool='/usr/bin/zcat -f' config_global='/etc/man.conf' -- cgit v1.1 From d804a05c38218c9ba8d456766e46875f5ce04c6a Mon Sep 17 00:00:00 2001 From: imp Date: Fri, 3 Dec 2010 04:39:48 +0000 Subject: To make minidumps work properly on mips for memory that's direct mapped and entered via vm_page_setup, keep track of it like we do for amd64. # A separate commit will be made to move this to a capability-based ifdef # rather than arch-based ifdef. Submitted by: alc@ MFC after: 1 week --- sys/vm/vm_page.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 863b842..1208ea0 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -430,11 +430,12 @@ vm_page_startup(vm_offset_t vaddr) */ new_end = vm_reserv_startup(&vaddr, new_end, high_water); #endif -#ifdef __amd64__ +#if defined(__amd64__) || defined(__mips__) /* - * pmap_map on amd64 comes out of the direct-map, not kvm like i386, - * so the pages must be tracked for a crashdump to include this data. - * This includes the vm_page_array and the early UMA bootstrap pages. + * pmap_map on amd64 and mips can come out of the direct-map, not kvm + * like i386, so the pages must be tracked for a crashdump to include + * this data. This includes the vm_page_array and the early UMA + * bootstrap pages. */ for (pa = new_end; pa < phys_avail[biggestone + 1]; pa += PAGE_SIZE) dump_add_page(pa); -- cgit v1.1 From de08b1bcf1ecdb8025e89558c87c0f0e800037cc Mon Sep 17 00:00:00 2001 From: das Date: Fri, 3 Dec 2010 07:01:07 +0000 Subject: Explain some of the reasons that fpsetprec() is unlikely to work as one might expect. (These functions have already been deprecated for many years.) PR: 133583 --- share/man/man3/fpgetround.3 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/share/man/man3/fpgetround.3 b/share/man/man3/fpgetround.3 index 1e93c84..189e252 100644 --- a/share/man/man3/fpgetround.3 +++ b/share/man/man3/fpgetround.3 @@ -32,7 +32,7 @@ .\" @(#)fpgetround.3 1.0 (Berkeley) 9/23/93 .\" $FreeBSD$ .\" -.Dd August 23, 1993 +.Dd December 3, 2010 .Dt FPGETROUND 3 .Os .Sh NAME @@ -164,6 +164,10 @@ and .Fn fpsetprec functions provide functionality unavailable on many platforms. At present, they are implemented only on the i386 and amd64 platforms. +Changing precision isn't a supported feature: +it may be ineffective when code is compiled to take advantage of SSE, +and many library functions and compiler optimizations depend upon the +default precision for correct behavior. .Sh SEE ALSO .Xr fenv 3 , .Xr isnan 3 -- cgit v1.1 From 6e3faf1602bf6c6c348e207557a56e715392a112 Mon Sep 17 00:00:00 2001 From: brucec Date: Fri, 3 Dec 2010 07:09:23 +0000 Subject: Revert r216134. This checkin broke platforms where bus_space are macros: they need to be a single statement, and do { } while (0) doesn't work in this situation so revert until a solution can be devised. --- share/man/man9/bus_space.9 | 3 -- sys/amd64/include/bus.h | 30 +++++------- sys/arm/include/bus.h | 67 ++++---------------------- sys/i386/include/bus.h | 36 +++++--------- sys/ia64/include/bus.h | 55 ++++++++++------------ sys/mips/include/bus.h | 75 ++++------------------------- sys/pc98/include/bus.h | 16 +++---- sys/powerpc/include/bus.h | 80 +++++-------------------------- sys/sparc64/include/bus.h | 115 ++++++++++++++++++++++----------------------- sys/sun4v/include/bus.h | 115 ++++++++++++++++++++++----------------------- 10 files changed, 194 insertions(+), 398 deletions(-) diff --git a/share/man/man9/bus_space.9 b/share/man/man9/bus_space.9 index 8c832f2..5a18dfb 100644 --- a/share/man/man9/bus_space.9 +++ b/share/man/man9/bus_space.9 @@ -719,9 +719,6 @@ or which return data read from bus space (i.e., functions which do not obviously return an error code) do not fail. They could only fail if given invalid arguments, and in that case their behaviour is undefined. -Functions which take a count of bytes must not pass in a count of zero; -doing so will cause a panic if the kernel was compiled with -.Cd "options INVARIANTS" . .Sh TYPES Several types are defined in .In machine/bus.h diff --git a/sys/amd64/include/bus.h b/sys/amd64/include/bus.h index c5a0a69..e25f427 100644 --- a/sys/amd64/include/bus.h +++ b/sys/amd64/include/bus.h @@ -104,9 +104,6 @@ #ifndef _AMD64_BUS_H_ #define _AMD64_BUS_H_ -#include -#include - #include #include @@ -271,7 +268,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) insb(bsh + offset, addr, count); else { @@ -292,7 +289,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) insw(bsh + offset, addr, count); else { @@ -313,7 +310,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) insl(bsh + offset, addr, count); else { @@ -359,7 +356,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -391,7 +388,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -423,7 +420,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -535,7 +532,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) outsb(bsh + offset, addr, count); else { @@ -556,7 +553,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) outsw(bsh + offset, addr, count); else { @@ -577,7 +574,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) outsl(bsh + offset, addr, count); else { @@ -624,7 +621,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -656,7 +653,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -688,7 +685,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == AMD64_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -880,7 +877,6 @@ bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -916,7 +912,6 @@ bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -952,7 +947,6 @@ bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == AMD64_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ diff --git a/sys/arm/include/bus.h b/sys/arm/include/bus.h index 4df6103..cabf1f7 100644 --- a/sys/arm/include/bus.h +++ b/sys/arm/include/bus.h @@ -66,9 +66,6 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ -#include -#include - #include /* @@ -321,29 +318,21 @@ struct bus_space { * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_1: count == 0")); \ __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c)) @@ -351,29 +340,21 @@ struct bus_space { * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_stream_1: count == 0"));\ __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_stream_2: count == 0"));\ __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_stream_4: count == 0"));\ __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_stream_8 count == 0")); \ __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c)) @@ -395,29 +376,21 @@ struct bus_space { * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_1: count == 0"));\ __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_2: count == 0"));\ __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_4: count == 0"));\ __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_8: count == 0"));\ __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c)) @@ -425,50 +398,34 @@ struct bus_space { * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_1: count == 0")); \ __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ -#define bus_space_set_multi_1(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ +#define bus_space_set_multi_1(t, h, o, v, c) \ __bs_set(sm,1,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ +#define bus_space_set_multi_2(t, h, o, v, c) \ __bs_set(sm,2,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ +#define bus_space_set_multi_4(t, h, o, v, c) \ __bs_set(sm,4,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ +#define bus_space_set_multi_8(t, h, o, v, c) \ __bs_set(sm,8,(t),(h),(o),(v),(c)) @@ -476,33 +433,25 @@ struct bus_space { * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ __bs_copy(8, t, h1, o1, h2, o2, c) /* diff --git a/sys/i386/include/bus.h b/sys/i386/include/bus.h index c8a06be..bfbc6a7 100644 --- a/sys/i386/include/bus.h +++ b/sys/i386/include/bus.h @@ -104,9 +104,6 @@ #ifndef _I386_BUS_H_ #define _I386_BUS_H_ -#include -#include - #include #include @@ -275,7 +272,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) insb(bsh + offset, addr, count); else { @@ -300,7 +297,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) insw(bsh + offset, addr, count); else { @@ -325,7 +322,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) insl(bsh + offset, addr, count); else { @@ -375,7 +372,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -415,7 +412,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -455,7 +452,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -575,7 +572,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) outsb(bsh + offset, addr, count); else { @@ -600,7 +597,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) outsw(bsh + offset, addr, count); else { @@ -625,7 +622,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) outsl(bsh + offset, addr, count); else { @@ -676,7 +673,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int8_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -716,7 +713,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int16_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -756,7 +753,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, const u_int32_t *addr, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (tag == I386_BUS_SPACE_IO) { int _port_ = bsh + offset; #ifdef __GNUCLIKE_ASM @@ -821,7 +818,6 @@ bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) while (count--) outb(addr, value); @@ -836,7 +832,6 @@ bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) while (count--) outw(addr, value); @@ -851,7 +846,6 @@ bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) while (count--) outl(addr, value); @@ -888,7 +882,6 @@ bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) for (; count != 0; count--, addr++) outb(addr, value); @@ -903,7 +896,6 @@ bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) for (; count != 0; count--, addr += 2) outw(addr, value); @@ -918,7 +910,6 @@ bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, { bus_space_handle_t addr = bsh + offset; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) for (; count != 0; count--, addr += 4) outl(addr, value); @@ -962,7 +953,6 @@ bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -998,7 +988,6 @@ bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ @@ -1034,7 +1023,6 @@ bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, bus_space_handle_t addr1 = bsh1 + off1; bus_space_handle_t addr2 = bsh2 + off2; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (tag == I386_BUS_SPACE_IO) { if (addr1 >= addr2) { /* src after dest: copy forward */ diff --git a/sys/ia64/include/bus.h b/sys/ia64/include/bus.h index e974a93..966a75d3 100644 --- a/sys/ia64/include/bus.h +++ b/sys/ia64/include/bus.h @@ -91,9 +91,6 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ -#include -#include - #include #include @@ -301,7 +298,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_1(bsh + ofs, bufp, count); else { @@ -314,7 +311,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_2(bsh + ofs, bufp, count); else { @@ -327,7 +324,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_4(bsh + ofs, bufp, count); else { @@ -340,7 +337,7 @@ static __inline void bus_space_read_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_multi_io_8(bsh + ofs, bufp, count); else { @@ -364,7 +361,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_1(bsh + ofs, bufp, count); else { @@ -377,7 +374,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_2(bsh + ofs, bufp, count); else { @@ -390,7 +387,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_4(bsh + ofs, bufp, count); else { @@ -403,7 +400,7 @@ static __inline void bus_space_write_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_multi_io_8(bsh + ofs, bufp, count); else { @@ -428,7 +425,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_1(bsh + ofs, bufp, count); else { @@ -442,7 +439,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_2(bsh + ofs, bufp, count); else { @@ -456,7 +453,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_4(bsh + ofs, bufp, count); else { @@ -470,7 +467,7 @@ static __inline void bus_space_read_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_read_region_io_8(bsh + ofs, bufp, count); else { @@ -496,7 +493,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_1(bsh + ofs, bufp, count); else { @@ -510,7 +507,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_2(bsh + ofs, bufp, count); else { @@ -524,7 +521,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_4(bsh + ofs, bufp, count); else { @@ -538,7 +535,7 @@ static __inline void bus_space_write_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *bufp, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_write_region_io_8(bsh + ofs, bufp, count); else { @@ -558,7 +555,7 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + while (count-- > 0) bus_space_write_1(bst, bsh, ofs, val); } @@ -567,7 +564,7 @@ static __inline void bus_space_set_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + while (count-- > 0) bus_space_write_2(bst, bsh, ofs, val); } @@ -576,7 +573,7 @@ static __inline void bus_space_set_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + while (count-- > 0) bus_space_write_4(bst, bsh, ofs, val); } @@ -585,7 +582,7 @@ static __inline void bus_space_set_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + while (count-- > 0) bus_space_write_8(bst, bsh, ofs, val); } @@ -606,7 +603,7 @@ static __inline void bus_space_set_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_1(bsh + ofs, val, count); else { @@ -620,7 +617,7 @@ static __inline void bus_space_set_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_2(bsh + ofs, val, count); else { @@ -634,7 +631,7 @@ static __inline void bus_space_set_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_4(bsh + ofs, val, count); else { @@ -648,7 +645,7 @@ static __inline void bus_space_set_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t count) { - KASSERT(count != 0, ("%s: count == 0", __func__)); + if (__predict_false(bst == IA64_BUS_SPACE_IO)) bus_space_set_region_io_4(bsh + ofs, val, count); else { @@ -677,7 +674,6 @@ bus_space_copy_region_1(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint8_t *dst, *src; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_1(sbsh + sofs, dbsh + dofs, count); return; @@ -702,7 +698,6 @@ bus_space_copy_region_2(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint16_t *dst, *src; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_2(sbsh + sofs, dbsh + dofs, count); return; @@ -727,7 +722,6 @@ bus_space_copy_region_4(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint32_t *dst, *src; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_4(sbsh + sofs, dbsh + dofs, count); return; @@ -752,7 +746,6 @@ bus_space_copy_region_8(bus_space_tag_t bst, bus_space_handle_t sbsh, { uint64_t *dst, *src; - KASSERT(count != 0, ("%s: count == 0", __func__)); if (__predict_false(bst == IA64_BUS_SPACE_IO)) { bus_space_copy_region_io_8(sbsh + sofs, dbsh + dofs, count); return; diff --git a/sys/mips/include/bus.h b/sys/mips/include/bus.h index 6e47347..af83d36 100644 --- a/sys/mips/include/bus.h +++ b/sys/mips/include/bus.h @@ -73,9 +73,6 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ -#include -#include - #include struct bus_space { @@ -317,29 +314,21 @@ struct bus_space { * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_1: count == 0")); \ __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c)) @@ -347,33 +336,21 @@ struct bus_space { * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_1: count == 0")); \ __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_2: count == 0")); \ __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_4: count == 0")); \ __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_8: count == 0")); \ __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c)) @@ -395,33 +372,21 @@ struct bus_space { * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_multi_stream_1: count == 0")); \ __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_multi_stream_2: count == 0")); \ __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_multi_stream_4: count == 0")); \ __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_multi_stream_8: count == 0")); \ __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c)) @@ -429,50 +394,34 @@ struct bus_space { * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_1: count == 0")); \ __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ -#define bus_space_set_multi_1(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ +#define bus_space_set_multi_1(t, h, o, v, c) \ __bs_set(sm,1,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ +#define bus_space_set_multi_2(t, h, o, v, c) \ __bs_set(sm,2,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ +#define bus_space_set_multi_4(t, h, o, v, c) \ __bs_set(sm,4,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ +#define bus_space_set_multi_8(t, h, o, v, c) \ __bs_set(sm,8,(t),(h),(o),(v),(c)) @@ -480,33 +429,25 @@ struct bus_space { * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ __bs_copy(8, t, h1, o1, h2, o2, c) /* diff --git a/sys/pc98/include/bus.h b/sys/pc98/include/bus.h index a31590e..b12845c 100644 --- a/sys/pc98/include/bus.h +++ b/sys/pc98/include/bus.h @@ -78,7 +78,6 @@ #ifndef _PC98_BUS_H_ #define _PC98_BUS_H_ -#include #include #include @@ -379,7 +378,7 @@ bus_space_read_multi_##BWN (tag, bsh, offset, buf, cnt) \ TYPE *buf; \ size_t cnt; \ { \ - KASSERT(cnt != 0, ("count == 0")); \ + \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -408,7 +407,7 @@ bus_space_write_multi_##BWN (tag, bsh, offset, buf, cnt) \ const TYPE *buf; \ size_t cnt; \ { \ - KASSERT(cnt != 0, ("count == 0")); \ + \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -434,10 +433,10 @@ bus_space_read_region_##BWN (tag, bsh, offset, buf, cnt) \ bus_space_tag_t tag; \ bus_space_handle_t bsh; \ bus_size_t offset; \ - TYPE *buf; \ + TYPE *buf; \ size_t cnt; \ { \ - KASSERT(cnt != 0, ("count == 0")); \ + \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -466,7 +465,7 @@ bus_space_write_region_##BWN (tag, bsh, offset, buf, cnt) \ const TYPE *buf; \ size_t cnt; \ { \ - KASSERT(cnt != 0, ("count == 0")); \ + \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=d" (offset), \ @@ -495,7 +494,7 @@ bus_space_set_multi_##BWN (tag, bsh, offset, val, cnt) \ TYPE val; \ size_t cnt; \ { \ - KASSERT(cnt != 0, ("count == 0")); \ + \ __asm __volatile("call *%2" \ :"=c" (cnt), \ "=d" (offset) \ @@ -523,7 +522,7 @@ bus_space_set_region_##BWN (tag, bsh, offset, val, cnt) \ TYPE val; \ size_t cnt; \ { \ - KASSERT(cnt != 0, ("count == 0")); \ + \ __asm __volatile("call *%2" \ :"=c" (cnt), \ "=d" (offset) \ @@ -556,7 +555,6 @@ bus_space_copy_region_##BWN (tag, sbsh, src, dbsh, dst, cnt) \ if (dbsh->bsh_bam.bs_copy_region_1 != sbsh->bsh_bam.bs_copy_region_1) \ panic("bus_space_copy_region: funcs mismatch (ENOSUPPORT)");\ \ - KASSERT(cnt != 0, ("count == 0")); \ __asm __volatile("call *%3" \ :"=c" (cnt), \ "=S" (src), \ diff --git a/sys/powerpc/include/bus.h b/sys/powerpc/include/bus.h index a96e7c8..420d022 100644 --- a/sys/powerpc/include/bus.h +++ b/sys/powerpc/include/bus.h @@ -73,9 +73,6 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ -#include -#include - #include #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) @@ -314,57 +311,40 @@ extern struct bus_space bs_le_tag; * Bus read multiple operations. */ #define bus_space_read_multi_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_1: count == 0")); \ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) #define bus_space_read_multi_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_2: count == 0")); \ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_4: count == 0")); \ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_8: count == 0")); \ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_1 bus_space_read_multi_1 #define bus_space_read_multi_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_2: count == 0")); \ __bs_nonsingle(rm,s_2,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_4: count == 0")); \ __bs_nonsingle(rm,s_4,(t),(h),(o),(a),(c)) #define bus_space_read_multi_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_multi_stream_8: count == 0")); \ __bs_nonsingle(rm,s_8,(t),(h),(o),(a),(c)) /* * Bus read region operations. */ #define bus_space_read_region_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_1: count == 0")); \ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) #define bus_space_read_region_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_2: count == 0")); \ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) #define bus_space_read_region_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_4: count == 0")); \ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) #define bus_space_read_region_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_read_region_8: count == 0")); \ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) #define bus_space_read_region_stream_1 bus_space_read_region_1 -#define bus_space_read_region_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_2: count == 0")); \ +#define bus_space_read_region_stream_2(t, h, o, a, c) \ __bs_nonsingle(rr,s_2,(t),(h),(o),(a),(c)) -#define bus_space_read_region_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_4: count == 0")); \ +#define bus_space_read_region_stream_4(t, h, o, a, c) \ __bs_nonsingle(rr,s_4,(t),(h),(o),(a),(c)) -#define bus_space_read_region_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_read_region_stream_8: count == 0")); \ +#define bus_space_read_region_stream_8(t, h, o, a, c) \ __bs_nonsingle(rr,s_8,(t),(h),(o),(a),(c)) /* @@ -384,139 +364,101 @@ extern struct bus_space bs_le_tag; * Bus write multiple operations. */ #define bus_space_write_multi_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_1: count == 0")); \ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) #define bus_space_write_multi_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_2: count == 0")); \ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_4: count == 0")); \ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_8: count == 0")); \ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_1 bus_space_write_multi_1 #define bus_space_write_multi_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_2: count == 0"));\ __bs_nonsingle(wm,s_2,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_4: count == 0"));\ __bs_nonsingle(wm,s_4,(t),(h),(o),(a),(c)) #define bus_space_write_multi_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_multi_stream_8: count == 0"));\ __bs_nonsingle(wm,s_8,(t),(h),(o),(a),(c)) /* * Bus write region operations. */ #define bus_space_write_region_1(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_1: count == 0")); \ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) #define bus_space_write_region_2(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_2: count == 0")); \ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) #define bus_space_write_region_4(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_4: count == 0")); \ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) -#define bus_space_write_region_8(t, h, o, a, c) \ - KASSERT(c != 0, ("bus_space_write_region_8: count == 0")); \ +#define bus_space_write_region_8(t, h, o, a, c) \ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_1 bus_space_write_region_1 #define bus_space_write_region_stream_2(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_2: count == 0")); \ __bs_nonsingle(wr,s_2,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_4(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_4: count == 0")); \ __bs_nonsingle(wr,s_4,(t),(h),(o),(a),(c)) #define bus_space_write_region_stream_8(t, h, o, a, c) \ - KASSERT(c != 0, \ - ("bus_space_write_region_stream_8: count == 0")); \ __bs_nonsingle(wr,s_8,(t),(h),(o),(a),(c)) /* * Set multiple operations. */ #define bus_space_set_multi_1(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_1: count == 0")); \ __bs_set(sm,1,(t),(h),(o),(v),(c)) #define bus_space_set_multi_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_2: count == 0")); \ __bs_set(sm,2,(t),(h),(o),(v),(c)) #define bus_space_set_multi_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_4: count == 0")); \ __bs_set(sm,4,(t),(h),(o),(v),(c)) #define bus_space_set_multi_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_8: count == 0")); \ __bs_set(sm,8,(t),(h),(o),(v),(c)) #define bus_space_set_multi_stream_1 bus_space_set_multi_1 #define bus_space_set_multi_stream_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_stream_2: count == 0")); \ __bs_set(sm,s_2,(t),(h),(o),(v),(c)) #define bus_space_set_multi_stream_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_stream_4: count == 0")); \ __bs_set(sm,s_4,(t),(h),(o),(v),(c)) #define bus_space_set_multi_stream_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_multi_stream_8: count == 0")); \ __bs_set(sm,s_8,(t),(h),(o),(v),(c)) /* * Set region operations. */ #define bus_space_set_region_1(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_1: count == 0")); \ __bs_set(sr,1,(t),(h),(o),(v),(c)) #define bus_space_set_region_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_2: count == 0")); \ __bs_set(sr,2,(t),(h),(o),(v),(c)) #define bus_space_set_region_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_4: count == 0")); \ __bs_set(sr,4,(t),(h),(o),(v),(c)) #define bus_space_set_region_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_8: count == 0")); \ __bs_set(sr,8,(t),(h),(o),(v),(c)) #define bus_space_set_region_stream_1 bus_space_set_region_1 #define bus_space_set_region_stream_2(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_stream_2: count == 0")); \ __bs_set(sr,s_2,(t),(h),(o),(v),(c)) #define bus_space_set_region_stream_4(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_stream_4: count == 0")); \ __bs_set(sr,s_4,(t),(h),(o),(v),(c)) #define bus_space_set_region_stream_8(t, h, o, v, c) \ - KASSERT(c != 0, ("bus_space_set_region_stream_8: count == 0")); \ __bs_set(sr,s_8,(t),(h),(o),(v),(c)) #if 0 /* * Copy operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_1: count == 0")); \ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ __bs_copy(1, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_2: count == 0")); \ +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ __bs_copy(2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_4: count == 0")); \ +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ __bs_copy(4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_8: count == 0")); \ +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ __bs_copy(8, t, h1, o1, h2, o2, c) #define bus_space_copy_region_stream_1 bus_space_copy_region_1 -#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_stream_2: count == 0")) \ +#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ __bs_copy(s_2, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_stream_4: count == 0")) \ +#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ __bs_copy(s_4, t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c) \ - KASSERT(c != 0, ("bus_space_copy_region_stream_8: count == 0")) \ +#define bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c) \ __bs_copy(s_8, t, h1, o1, h2, o2, c) #endif diff --git a/sys/sparc64/include/bus.h b/sys/sparc64/include/bus.h index 3348602..da942b6 100644 --- a/sys/sparc64/include/bus.h +++ b/sys/sparc64/include/bus.h @@ -75,9 +75,6 @@ #ifndef _MACHINE_BUS_H_ #define _MACHINE_BUS_H_ -#include -#include - #ifdef BUS_SPACE_DEBUG #include #endif @@ -242,7 +239,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_1(t, h, o); } @@ -251,7 +248,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_2(t, h, o); } @@ -260,7 +257,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_4(t, h, o); } @@ -269,7 +266,7 @@ static __inline void bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_8(t, h, o); } @@ -314,7 +311,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_1(t, h, o, *a++); } @@ -323,7 +320,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_2(t, h, o, *a++); } @@ -332,7 +329,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_4(t, h, o, *a++); } @@ -341,7 +338,7 @@ static __inline void bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_8(t, h, o, *a++); } @@ -350,7 +347,7 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_1(t, h, o, v); } @@ -359,7 +356,7 @@ static __inline void bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_2(t, h, o, v); } @@ -368,7 +365,7 @@ static __inline void bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_4(t, h, o, v); } @@ -377,7 +374,7 @@ static __inline void bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_8(t, h, o, v); } @@ -386,7 +383,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) *a = bus_space_read_1(t, h, o); } @@ -395,7 +392,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) *a = bus_space_read_2(t, h, o); } @@ -404,7 +401,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) *a = bus_space_read_4(t, h, o); } @@ -413,7 +410,7 @@ static __inline void bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) *a = bus_space_read_8(t, h, o); } @@ -422,7 +419,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) bus_space_write_1(t, h, o, *a); } @@ -431,7 +428,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) bus_space_write_2(t, h, o, *a); } @@ -440,7 +437,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) bus_space_write_4(t, h, o, *a); } @@ -449,7 +446,7 @@ static __inline void bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) bus_space_write_8(t, h, o, *a); } @@ -458,7 +455,7 @@ static __inline void bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o++) bus_space_write_1(t, h, o, v); } @@ -467,7 +464,7 @@ static __inline void bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 2) bus_space_write_2(t, h, o, v); } @@ -476,7 +473,7 @@ static __inline void bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 4) bus_space_write_4(t, h, o, v); } @@ -485,7 +482,7 @@ static __inline void bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 8) bus_space_write_8(t, h, o, v); } @@ -494,7 +491,7 @@ static __inline void bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1++, o2++) bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); } @@ -503,7 +500,7 @@ static __inline void bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 2, o2 += 2) bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); } @@ -512,7 +509,7 @@ static __inline void bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 4, o2 += 4) bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); } @@ -521,7 +518,7 @@ static __inline void bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 8, o2 += 8) bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } @@ -562,7 +559,7 @@ static __inline void bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_1(t, h, o); } @@ -571,7 +568,7 @@ static __inline void bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_2(t, h, o); } @@ -580,7 +577,7 @@ static __inline void bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_4(t, h, o); } @@ -589,7 +586,7 @@ static __inline void bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_8(t, h, o); } @@ -634,7 +631,7 @@ static __inline void bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_1(t, h, o, *a++); } @@ -643,7 +640,7 @@ static __inline void bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_2(t, h, o, *a++); } @@ -652,7 +649,7 @@ static __inline void bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_4(t, h, o, *a++); } @@ -661,7 +658,7 @@ static __inline void bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_8(t, h, o, *a++); } @@ -670,7 +667,7 @@ static __inline void bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_1(t, h, o, v); } @@ -679,7 +676,7 @@ static __inline void bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_2(t, h, o, v); } @@ -688,7 +685,7 @@ static __inline void bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_4(t, h, o, v); } @@ -697,7 +694,7 @@ static __inline void bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_8(t, h, o, v); } @@ -706,7 +703,7 @@ static __inline void bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) *a = bus_space_read_stream_1(t, h, o); } @@ -715,7 +712,7 @@ static __inline void bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) *a = bus_space_read_stream_2(t, h, o); } @@ -724,7 +721,7 @@ static __inline void bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) *a = bus_space_read_stream_4(t, h, o); } @@ -733,7 +730,7 @@ static __inline void bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) *a = bus_space_read_stream_8(t, h, o); } @@ -742,7 +739,7 @@ static __inline void bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) bus_space_write_stream_1(t, h, o, *a); } @@ -751,7 +748,7 @@ static __inline void bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) bus_space_write_stream_2(t, h, o, *a); } @@ -760,7 +757,7 @@ static __inline void bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) bus_space_write_stream_4(t, h, o, *a); } @@ -769,7 +766,7 @@ static __inline void bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) bus_space_write_stream_8(t, h, o, *a); } @@ -778,7 +775,7 @@ static __inline void bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o++) bus_space_write_stream_1(t, h, o, v); } @@ -787,7 +784,7 @@ static __inline void bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 2) bus_space_write_stream_2(t, h, o, v); } @@ -796,7 +793,7 @@ static __inline void bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 4) bus_space_write_stream_4(t, h, o, v); } @@ -805,7 +802,7 @@ static __inline void bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 8) bus_space_write_stream_8(t, h, o, v); } @@ -814,7 +811,7 @@ static __inline void bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1++, o2++) bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, o2)); @@ -824,7 +821,7 @@ static __inline void bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 2, o2 += 2) bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, o2)); @@ -834,7 +831,7 @@ static __inline void bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 4, o2 += 4) bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, o2)); @@ -844,7 +841,7 @@ static __inline void bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 8, o2 += 8) bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } diff --git a/sys/sun4v/include/bus.h b/sys/sun4v/include/bus.h index 8fe0731..51a7ea5 100644 --- a/sys/sun4v/include/bus.h +++ b/sys/sun4v/include/bus.h @@ -79,9 +79,6 @@ #include #endif -#include -#include - #include #include @@ -242,7 +239,7 @@ static __inline void bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_1(t, h, o); } @@ -251,7 +248,7 @@ static __inline void bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_2(t, h, o); } @@ -260,7 +257,7 @@ static __inline void bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_4(t, h, o); } @@ -269,7 +266,7 @@ static __inline void bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_8(t, h, o); } @@ -314,7 +311,7 @@ static __inline void bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_1(t, h, o, *a++); } @@ -323,7 +320,7 @@ static __inline void bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_2(t, h, o, *a++); } @@ -332,7 +329,7 @@ static __inline void bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_4(t, h, o, *a++); } @@ -341,7 +338,7 @@ static __inline void bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_8(t, h, o, *a++); } @@ -350,7 +347,7 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_1(t, h, o, v); } @@ -359,7 +356,7 @@ static __inline void bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_2(t, h, o, v); } @@ -368,7 +365,7 @@ static __inline void bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_4(t, h, o, v); } @@ -377,7 +374,7 @@ static __inline void bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_8(t, h, o, v); } @@ -386,7 +383,7 @@ static __inline void bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) *a = bus_space_read_1(t, h, o); } @@ -395,7 +392,7 @@ static __inline void bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) *a = bus_space_read_2(t, h, o); } @@ -404,7 +401,7 @@ static __inline void bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) *a = bus_space_read_4(t, h, o); } @@ -413,7 +410,7 @@ static __inline void bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) *a = bus_space_read_8(t, h, o); } @@ -422,7 +419,7 @@ static __inline void bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) bus_space_write_1(t, h, o, *a); } @@ -431,7 +428,7 @@ static __inline void bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) bus_space_write_2(t, h, o, *a); } @@ -440,7 +437,7 @@ static __inline void bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) bus_space_write_4(t, h, o, *a); } @@ -449,7 +446,7 @@ static __inline void bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) bus_space_write_8(t, h, o, *a); } @@ -458,7 +455,7 @@ static __inline void bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o++) bus_space_write_1(t, h, o, v); } @@ -467,7 +464,7 @@ static __inline void bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 2) bus_space_write_2(t, h, o, v); } @@ -476,7 +473,7 @@ static __inline void bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 4) bus_space_write_4(t, h, o, v); } @@ -485,7 +482,7 @@ static __inline void bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 8) bus_space_write_8(t, h, o, v); } @@ -494,7 +491,7 @@ static __inline void bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1++, o2++) bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); } @@ -503,7 +500,7 @@ static __inline void bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 2, o2 += 2) bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); } @@ -512,7 +509,7 @@ static __inline void bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 4, o2 += 4) bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); } @@ -521,7 +518,7 @@ static __inline void bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 8, o2 += 8) bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } @@ -562,7 +559,7 @@ static __inline void bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_1(t, h, o); } @@ -571,7 +568,7 @@ static __inline void bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_2(t, h, o); } @@ -580,7 +577,7 @@ static __inline void bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_4(t, h, o); } @@ -589,7 +586,7 @@ static __inline void bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) *a++ = bus_space_read_stream_8(t, h, o); } @@ -634,7 +631,7 @@ static __inline void bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_1(t, h, o, *a++); } @@ -643,7 +640,7 @@ static __inline void bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_2(t, h, o, *a++); } @@ -652,7 +649,7 @@ static __inline void bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_4(t, h, o, *a++); } @@ -661,7 +658,7 @@ static __inline void bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_8(t, h, o, *a++); } @@ -670,7 +667,7 @@ static __inline void bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_1(t, h, o, v); } @@ -679,7 +676,7 @@ static __inline void bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_2(t, h, o, v); } @@ -688,7 +685,7 @@ static __inline void bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_4(t, h, o, v); } @@ -697,7 +694,7 @@ static __inline void bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t v, size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + while (c-- > 0) bus_space_write_stream_8(t, h, o, v); } @@ -706,7 +703,7 @@ static __inline void bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) *a = bus_space_read_stream_1(t, h, o); } @@ -715,7 +712,7 @@ static __inline void bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) *a = bus_space_read_stream_2(t, h, o); } @@ -724,7 +721,7 @@ static __inline void bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) *a = bus_space_read_stream_4(t, h, o); } @@ -733,7 +730,7 @@ static __inline void bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) *a = bus_space_read_stream_8(t, h, o); } @@ -742,7 +739,7 @@ static __inline void bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o++) bus_space_write_stream_1(t, h, o, *a); } @@ -751,7 +748,7 @@ static __inline void bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 2) bus_space_write_stream_2(t, h, o, *a); } @@ -760,7 +757,7 @@ static __inline void bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 4) bus_space_write_stream_4(t, h, o, *a); } @@ -769,7 +766,7 @@ static __inline void bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t *a, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; a++, c--, o += 8) bus_space_write_stream_8(t, h, o, *a); } @@ -778,7 +775,7 @@ static __inline void bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint8_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o++) bus_space_write_stream_1(t, h, o, v); } @@ -787,7 +784,7 @@ static __inline void bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint16_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 2) bus_space_write_stream_2(t, h, o, v); } @@ -796,7 +793,7 @@ static __inline void bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint32_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 4) bus_space_write_stream_4(t, h, o, v); } @@ -805,7 +802,7 @@ static __inline void bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const uint64_t v, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o += 8) bus_space_write_stream_8(t, h, o, v); } @@ -814,7 +811,7 @@ static __inline void bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1++, o2++) bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, o2)); @@ -824,7 +821,7 @@ static __inline void bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 2, o2 += 2) bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, o2)); @@ -834,7 +831,7 @@ static __inline void bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 4, o2 += 4) bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, o2)); @@ -844,7 +841,7 @@ static __inline void bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - KASSERT(c != 0, ("%s: count == 0", __func__)); + for (; c; c--, o1 += 8, o2 += 8) bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } -- cgit v1.1 From 52bedd6250006e7be9206e6a05409d119fd07c97 Mon Sep 17 00:00:00 2001 From: imp Date: Fri, 3 Dec 2010 07:33:43 +0000 Subject: _WITHOUT_SRCCONF has too much baggage. Instead, use the simpler SRCCONF=/dev/null. --- tools/tools/nanobsd/nanobsd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tools/nanobsd/nanobsd.sh b/tools/tools/nanobsd/nanobsd.sh index 0ecf847..f6a8a8e 100644 --- a/tools/tools/nanobsd/nanobsd.sh +++ b/tools/tools/nanobsd/nanobsd.sh @@ -182,7 +182,7 @@ make_conf_build ( ) ( echo "${CONF_WORLD}" > ${NANO_MAKE_CONF_BUILD} echo "${CONF_BUILD}" >> ${NANO_MAKE_CONF_BUILD} - echo "_WITHOUT_SRCCONF=t" >> ${NANO_MAKE_CONF_BUILD} + echo "SRCCONF=/dev/null" >> ${NANO_MAKE_CONF_BUILD} ) build_world ( ) ( -- cgit v1.1 From 2314de61b523f357bee34c99c091bd12cee32954 Mon Sep 17 00:00:00 2001 From: imp Date: Fri, 3 Dec 2010 07:39:29 +0000 Subject: o Mount the device async when we're doing the copy. o Create a sparse file instead of a fully zerod one. This trades the possibiltiy of running out of space during the build for the speed gain not having do write all those zeros... Submitted by: n_hibma --- tools/tools/nanobsd/nanobsd.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/tools/nanobsd/nanobsd.sh b/tools/tools/nanobsd/nanobsd.sh index f6a8a8e..ec1fd6b 100644 --- a/tools/tools/nanobsd/nanobsd.sh +++ b/tools/tools/nanobsd/nanobsd.sh @@ -404,7 +404,7 @@ newfs_part ( ) ( lbl=$3 echo newfs ${NANO_NEWFS} ${NANO_LABEL:+-L${NANO_LABEL}${lbl}} ${dev} newfs ${NANO_NEWFS} ${NANO_LABEL:+-L${NANO_LABEL}${lbl}} ${dev} - mount ${dev} ${mnt} + mount -o async ${dev} ${mnt} ) populate_slice ( ) ( @@ -513,8 +513,8 @@ create_i386_diskimage ( ) ( -y ${NANO_HEADS}` else echo "Creating md backing file..." - dd if=/dev/zero of=${IMG} bs=${NANO_SECTS}b \ - count=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}` + rm -f ${IMG} + dd if=/dev/zero of=${IMG} seek=${NANO_MEDIASIZE} count=0 MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} \ -y ${NANO_HEADS}` fi -- cgit v1.1 From 17b7c7e53e0733f13f34e996e315a4da51540480 Mon Sep 17 00:00:00 2001 From: delphij Date: Fri, 3 Dec 2010 10:06:19 +0000 Subject: * Recommend a overwrite of whole geli provider before use. * Correct a typo while I'm there. Reviewed by: pjd MFC after: 2 weeks --- sbin/geom/class/eli/geli.8 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sbin/geom/class/eli/geli.8 b/sbin/geom/class/eli/geli.8 index 67f5ea9..b682d8c 100644 --- a/sbin/geom/class/eli/geli.8 +++ b/sbin/geom/class/eli/geli.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 20, 2010 +.Dd December 3, 2010 .Dt GELI 8 .Os .Sh NAME @@ -842,7 +842,7 @@ Enter passphrase: .Nm supports two encryption modes: .Nm XTS , -which was standarized as +which was standardized as .Nm IEE P1619 and .Nm CBC @@ -873,6 +873,10 @@ changes with the data he owns without notice. In other words .Nm will not protect your data against replay attacks. +.Pp +It is recommended to write the whole provider before the first use, +in order to make sure that all sectors and their corresponding +checksums are properly initialized into a consistent state. .Sh SEE ALSO .Xr crypto 4 , .Xr gbde 4 , -- cgit v1.1 From 5990613c6939be30b7eebbf45ef35f5c830c16b6 Mon Sep 17 00:00:00 2001 From: jchandra Date: Fri, 3 Dec 2010 14:20:20 +0000 Subject: Fixup for r216141, dump_add_page needs to be non-static now. Add it to sys/mips/include/md_var.h, make dump_drop_page non-static too for completeness. --- sys/mips/include/md_var.h | 6 ++++-- sys/mips/mips/minidump_machdep.c | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sys/mips/include/md_var.h b/sys/mips/include/md_var.h index 3cebbdc..3e46ad3 100644 --- a/sys/mips/include/md_var.h +++ b/sys/mips/include/md_var.h @@ -77,6 +77,8 @@ void platform_identify(void); extern int busdma_swi_pending; void busdma_swi(void); -struct dumperinfo; -void minidumpsys(struct dumperinfo *); +struct dumperinfo; +void dump_add_page(vm_paddr_t); +void dump_drop_page(vm_paddr_t); +void minidumpsys(struct dumperinfo *); #endif /* !_MACHINE_MD_VAR_H_ */ diff --git a/sys/mips/mips/minidump_machdep.c b/sys/mips/mips/minidump_machdep.c index 1ac384a..cded3ae 100644 --- a/sys/mips/mips/minidump_machdep.c +++ b/sys/mips/mips/minidump_machdep.c @@ -83,7 +83,7 @@ is_dumpable(vm_paddr_t pa) return (0); } -static void +void dump_add_page(vm_paddr_t pa) { int idx, bit; @@ -94,7 +94,7 @@ dump_add_page(vm_paddr_t pa) atomic_set_int(&vm_page_dump[idx], 1ul << bit); } -static void +void dump_drop_page(vm_paddr_t pa) { int idx, bit; -- cgit v1.1 From ff0f2f76b263109af717dd850f6f5d51c4ad5e49 Mon Sep 17 00:00:00 2001 From: kib Date: Fri, 3 Dec 2010 16:07:50 +0000 Subject: Add SLIST_SWAP() macro. MFC after: 1 week --- sys/sys/queue.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/sys/queue.h b/sys/sys/queue.h index 257679b..f0bae8d 100644 --- a/sys/sys/queue.h +++ b/sys/sys/queue.h @@ -213,6 +213,12 @@ struct { \ SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ } while (0) +#define SLIST_SWAP(head1, head2, type) do { \ + struct type *swap_first = SLIST_FIRST(head1); \ + SLIST_FIRST(head1) = SLIST_FIRST(head2); \ + SLIST_FIRST(head2) = swap_first; \ +} while (0) + /* * Singly-linked Tail queue declarations. */ -- cgit v1.1 From 44fb3ef253ef07efd282244795add8ecf7d10674 Mon Sep 17 00:00:00 2001 From: kib Date: Fri, 3 Dec 2010 16:15:44 +0000 Subject: Reviewed by: jeff, rwatson MFC after: 1 week --- sys/kern/uipc_usrreq.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 63437bc..1c0903a 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -76,6 +76,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -115,6 +116,13 @@ static struct unp_head unp_shead; /* (l) List of stream sockets. */ static struct unp_head unp_dhead; /* (l) List of datagram sockets. */ static struct unp_head unp_sphead; /* (l) List of seqpacket sockets. */ +struct unp_defer { + SLIST_ENTRY(unp_defer) ud_link; + struct file *ud_fp; +}; +static SLIST_HEAD(, unp_defer) unp_defers; +static int unp_defers_count; + static const struct sockaddr sun_noname = { sizeof(sun_noname), AF_LOCAL }; /* @@ -126,6 +134,13 @@ static const struct sockaddr sun_noname = { sizeof(sun_noname), AF_LOCAL }; static struct task unp_gc_task; /* + * The close of unix domain sockets attached as SCM_RIGHTS is + * postponed to the taskqueue, to avoid arbitrary recursion depth. + * The attached sockets might have another sockets attached. + */ +static struct task unp_defer_task; + +/* * Both send and receive buffers are allocated PIPSIZ bytes of buffering for * stream sockets, although the total for sender and receiver is actually * only PIPSIZ. @@ -164,6 +179,9 @@ SYSCTL_ULONG(_net_local_seqpacket, OID_AUTO, recvspace, CTLFLAG_RW, &unpsp_recvspace, 0, "Default seqpacket receive space."); SYSCTL_INT(_net_local, OID_AUTO, inflight, CTLFLAG_RD, &unp_rights, 0, "File descriptors in flight."); +SYSCTL_INT(_net_local, OID_AUTO, deferred, CTLFLAG_RD, + &unp_defers_count, 0, + "File descriptors deferred to taskqueue for close."); /* * Locking and synchronization: @@ -213,6 +231,7 @@ SYSCTL_INT(_net_local, OID_AUTO, inflight, CTLFLAG_RD, &unp_rights, 0, */ static struct rwlock unp_link_rwlock; static struct mtx unp_list_lock; +static struct mtx unp_defers_lock; #define UNP_LINK_LOCK_INIT() rw_init(&unp_link_rwlock, \ "unp_link_rwlock") @@ -234,6 +253,11 @@ static struct mtx unp_list_lock; #define UNP_LIST_LOCK() mtx_lock(&unp_list_lock) #define UNP_LIST_UNLOCK() mtx_unlock(&unp_list_lock) +#define UNP_DEFERRED_LOCK_INIT() mtx_init(&unp_defers_lock, \ + "unp_defer", NULL, MTX_DEF) +#define UNP_DEFERRED_LOCK() mtx_lock(&unp_defers_lock) +#define UNP_DEFERRED_UNLOCK() mtx_unlock(&unp_defers_lock) + #define UNP_PCB_LOCK_INIT(unp) mtx_init(&(unp)->unp_mtx, \ "unp_mtx", "unp_mtx", \ MTX_DUPOK|MTX_DEF|MTX_RECURSE) @@ -259,8 +283,9 @@ static void unp_init(void); static int unp_internalize(struct mbuf **, struct thread *); static void unp_internalize_fp(struct file *); static int unp_externalize(struct mbuf *, struct mbuf **); -static void unp_externalize_fp(struct file *); +static int unp_externalize_fp(struct file *); static struct mbuf *unp_addsockcred(struct thread *, struct mbuf *); +static void unp_process_defers(void * __unused, int); /* * Definitions of protocols supported in the LOCAL domain. @@ -1764,9 +1789,12 @@ unp_init(void) LIST_INIT(&unp_dhead); LIST_INIT(&unp_shead); LIST_INIT(&unp_sphead); + SLIST_INIT(&unp_defers); TASK_INIT(&unp_gc_task, 0, unp_gc, NULL); + TASK_INIT(&unp_defer_task, 0, unp_process_defers, NULL); UNP_LINK_LOCK_INIT(); UNP_LIST_LOCK_INIT(); + UNP_DEFERRED_LOCK_INIT(); } static int @@ -1970,9 +1998,45 @@ fptounp(struct file *fp) static void unp_discard(struct file *fp) { + struct unp_defer *dr; + + if (unp_externalize_fp(fp)) { + dr = malloc(sizeof(*dr), M_TEMP, M_WAITOK); + dr->ud_fp = fp; + UNP_DEFERRED_LOCK(); + SLIST_INSERT_HEAD(&unp_defers, dr, ud_link); + UNP_DEFERRED_UNLOCK(); + atomic_add_int(&unp_defers_count, 1); + taskqueue_enqueue(taskqueue_thread, &unp_defer_task); + } else + (void) closef(fp, (struct thread *)NULL); +} - unp_externalize_fp(fp); - (void) closef(fp, (struct thread *)NULL); +static void +unp_process_defers(void *arg __unused, int pending) +{ + struct unp_defer *dr; + SLIST_HEAD(, unp_defer) drl; + int count; + + SLIST_INIT(&drl); + for (;;) { + UNP_DEFERRED_LOCK(); + if (SLIST_FIRST(&unp_defers) == NULL) { + UNP_DEFERRED_UNLOCK(); + break; + } + SLIST_SWAP(&unp_defers, &drl, unp_defer); + UNP_DEFERRED_UNLOCK(); + count = 0; + while ((dr = SLIST_FIRST(&drl)) != NULL) { + SLIST_REMOVE_HEAD(&drl, ud_link); + closef(dr->ud_fp, NULL); + free(dr, M_TEMP); + count++; + } + atomic_add_int(&unp_defers_count, -count); + } } static void @@ -1990,16 +2054,21 @@ unp_internalize_fp(struct file *fp) UNP_LINK_WUNLOCK(); } -static void +static int unp_externalize_fp(struct file *fp) { struct unpcb *unp; + int ret; UNP_LINK_WLOCK(); - if ((unp = fptounp(fp)) != NULL) + if ((unp = fptounp(fp)) != NULL) { unp->unp_msgcount--; + ret = 1; + } else + ret = 0; unp_rights--; UNP_LINK_WUNLOCK(); + return (ret); } /* -- cgit v1.1 From 38cca03fdd83f5125f633ed3f9b1823d8354e67f Mon Sep 17 00:00:00 2001 From: kib Date: Fri, 3 Dec 2010 16:17:53 +0000 Subject: Extend the unix gc regression test to cover the case of r216150. Requested and reviewed by: rwatson MFC after: 1 week --- tools/regression/sockets/unix_gc/unix_gc.c | 63 +++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/tools/regression/sockets/unix_gc/unix_gc.c b/tools/regression/sockets/unix_gc/unix_gc.c index a60aa85..8cae2d9 100644 --- a/tools/regression/sockets/unix_gc/unix_gc.c +++ b/tools/regression/sockets/unix_gc/unix_gc.c @@ -55,27 +55,36 @@ static char dpath[PATH_MAX]; static const char *test; static int -getopenfiles(void) +getsysctl(const char *name) { size_t len; int i; len = sizeof(i); - if (sysctlbyname("kern.openfiles", &i, &len, NULL, 0) < 0) - err(-1, "kern.openfiles"); + if (sysctlbyname(name, &i, &len, NULL, 0) < 0) + err(-1, "%s", name); return (i); } static int +getopenfiles(void) +{ + + return (getsysctl("kern.openfiles")); +} + +static int getinflight(void) { - size_t len; - int i; - len = sizeof(i); - if (sysctlbyname("net.local.inflight", &i, &len, NULL, 0) < 0) - err(-1, "net.local.inflight"); - return (i); + return (getsysctl("net.local.inflight")); +} + +static int +getdeferred(void) +{ + + return (getsysctl("net.local.deferred")); } static void @@ -707,6 +716,40 @@ listen_connect_drop(void) test_sysctls(inflight, openfiles); } +static void +recursion(void) +{ + int fd[2], ff[2]; + int inflight, openfiles, deferred, deferred1; + + test = "recursion"; + printf("%s\n", test); + save_sysctls(&inflight, &openfiles); + deferred = getdeferred(); + + my_socketpair(fd); + + for (;;) { + if (socketpair(PF_UNIX, SOCK_STREAM, 0, ff) == -1) { + if (errno == EMFILE || errno == ENFILE) + break; + err(-1, "socketpair"); + } + sendfd(ff[0], fd[0]); + sendfd(ff[0], fd[1]); + close2(fd[1], fd[0]); + fd[0] = ff[0]; + fd[1] = ff[1]; + } + close2(fd[0], fd[1]); + sleep(1); + test_sysctls(inflight, openfiles); + deferred1 = getdeferred(); + if (deferred != deferred1) + errx(-1, "recursion: deferred before %d after %d", deferred, + deferred1); +} + #define RMDIR "rm -Rf " int main(int argc, char *argv[]) @@ -757,6 +800,8 @@ main(int argc, char *argv[]) listen_connect_nothing(); listen_connect_drop(); + recursion(); + printf("Finish: inflight %d open %d\n", getinflight(), getopenfiles()); return (0); -- cgit v1.1 From c53b6b87732a26be48886aac7c902ab2cf9980b0 Mon Sep 17 00:00:00 2001 From: nwhitehorn Date: Fri, 3 Dec 2010 16:37:37 +0000 Subject: Provide a simple IOMMU framework on PowerPC, which is required to support PPC hypervisors. --- sys/conf/files.powerpc | 1 + sys/powerpc/include/bus_dma.h | 4 + sys/powerpc/powerpc/busdma_machdep.c | 198 ++++++++++++++++++++--------------- sys/powerpc/powerpc/iommu_if.m | 54 ++++++++++ 4 files changed, 173 insertions(+), 84 deletions(-) create mode 100644 sys/powerpc/powerpc/iommu_if.m diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index d46b39f..83f75c4 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -177,6 +177,7 @@ powerpc/powerpc/fuswintr.c standard powerpc/powerpc/gdb_machdep.c optional gdb powerpc/powerpc/in_cksum.c optional inet powerpc/powerpc/intr_machdep.c standard +powerpc/powerpc/iommu_if.m standard powerpc/powerpc/mem.c optional mem powerpc/powerpc/mmu_if.m standard powerpc/powerpc/mp_machdep.c optional smp diff --git a/sys/powerpc/include/bus_dma.h b/sys/powerpc/include/bus_dma.h index d10a055..e070a94 100644 --- a/sys/powerpc/include/bus_dma.h +++ b/sys/powerpc/include/bus_dma.h @@ -30,4 +30,8 @@ #include +struct device; + +int bus_dma_tag_set_iommu(bus_dma_tag_t, struct device *iommu, void *cookie); + #endif /* _POWERPC_BUS_DMA_H_ */ diff --git a/sys/powerpc/powerpc/busdma_machdep.c b/sys/powerpc/powerpc/busdma_machdep.c index f66413f..84e3bc6 100644 --- a/sys/powerpc/powerpc/busdma_machdep.c +++ b/sys/powerpc/powerpc/busdma_machdep.c @@ -53,7 +53,9 @@ __FBSDID("$FreeBSD$"); #include #include -#define MAX_BPAGES 8192 +#include "iommu_if.h" + +#define MAX_BPAGES MIN(8192, physmem/40) struct bounce_zone; @@ -73,8 +75,9 @@ struct bus_dma_tag { int map_count; bus_dma_lock_t *lockfunc; void *lockfuncarg; - bus_dma_segment_t *segments; struct bounce_zone *bounce_zone; + device_t iommu; + void *iommu_cookie; }; struct bounce_page { @@ -121,6 +124,8 @@ struct bus_dmamap { bus_dma_tag_t dmat; void *buf; /* unmapped buffer pointer */ bus_size_t buflen; /* unmapped buffer length */ + bus_dma_segment_t *segments; + int nsegs; bus_dmamap_callback_t *callback; void *callback_arg; STAILQ_ENTRY(bus_dmamap) links; @@ -128,7 +133,6 @@ struct bus_dmamap { static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; -static struct bus_dmamap nobounce_dmamap; static void init_bounce_pages(void *dummy); static int alloc_bounce_zone(bus_dma_tag_t dmat); @@ -156,10 +160,14 @@ run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) retval = 0; do { - if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) - || ((paddr & (dmat->alignment - 1)) != 0)) - && (dmat->filter == NULL - || (*dmat->filter)(dmat->filterarg, paddr) != 0)) + if (dmat->filter == NULL && dmat->iommu == NULL && + paddr > dmat->lowaddr && paddr <= dmat->highaddr) + retval = 1; + if (dmat->filter == NULL && + (paddr & (dmat->alignment - 1)) != 0) + retval = 1; + if (dmat->filter != NULL && + (*dmat->filter)(dmat->filterarg, paddr) != 0) retval = 1; dmat = dmat->parent; @@ -258,7 +266,6 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, newtag->lockfunc = dflt_lock; newtag->lockfuncarg = NULL; } - newtag->segments = NULL; /* Take into account any restrictions imposed by our parent tag */ if (parent != NULL) { @@ -280,10 +287,14 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, } if (newtag->parent != NULL) atomic_add_int(&parent->ref_count, 1); + newtag->iommu = parent->iommu; + newtag->iommu_cookie = parent->iommu_cookie; } - if (newtag->lowaddr < ptoa((vm_paddr_t)Maxmem) - || newtag->alignment > 1) + if (newtag->lowaddr < ptoa((vm_paddr_t)Maxmem) && newtag->iommu == NULL) + newtag->flags |= BUS_DMA_COULD_BOUNCE; + + if (newtag->alignment > 1) newtag->flags |= BUS_DMA_COULD_BOUNCE; if (((newtag->flags & BUS_DMA_COULD_BOUNCE) != 0) && @@ -343,8 +354,6 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat) parent = dmat->parent; atomic_subtract_int(&dmat->ref_count, 1); if (dmat->ref_count == 0) { - if (dmat->segments != NULL) - free(dmat->segments, M_DEVBUF); free(dmat, M_DEVBUF); /* * Last reference count, so @@ -372,17 +381,15 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) error = 0; - if (dmat->segments == NULL) { - dmat->segments = (bus_dma_segment_t *)malloc( - sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, - M_NOWAIT); - if (dmat->segments == NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, ENOMEM); - return (ENOMEM); - } + *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (*mapp == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); } + /* * Bouncing might be required if the driver asks for an active * exclusion region, a data alignment that is stricter than 1, and/or @@ -400,14 +407,6 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) } bz = dmat->bounce_zone; - *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, - M_NOWAIT | M_ZERO); - if (*mapp == NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, ENOMEM); - return (ENOMEM); - } - /* Initialize the new map */ STAILQ_INIT(&((*mapp)->bpages)); @@ -437,9 +436,18 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) } } bz->map_count++; - } else { - *mapp = NULL; } + + (*mapp)->nsegs = 0; + (*mapp)->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if ((*mapp)->segments == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); + } + if (error == 0) dmat->map_count++; CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", @@ -454,7 +462,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) { - if (map != NULL && map != &nobounce_dmamap) { + if (dmat->flags & BUS_DMA_COULD_BOUNCE) { if (STAILQ_FIRST(&map->bpages) != NULL) { CTR3(KTR_BUSDMA, "%s: tag %p error %d", __func__, dmat, EBUSY); @@ -462,8 +470,9 @@ bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) } if (dmat->bounce_zone) dmat->bounce_zone->map_count--; - free(map, M_DEVBUF); } + free(map->segments, M_DEVBUF); + free(map, M_DEVBUF); dmat->map_count--; CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); return (0); @@ -486,19 +495,8 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, else mflags = M_WAITOK; - /* If we succeed, no mapping/bouncing will be required */ - *mapp = NULL; - - if (dmat->segments == NULL) { - dmat->segments = (bus_dma_segment_t *)malloc( - sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, - mflags); - if (dmat->segments == NULL) { - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, ENOMEM); - return (ENOMEM); - } - } + bus_dmamap_create(dmat, flags, mapp); + if (flags & BUS_DMA_ZERO) mflags |= M_ZERO; @@ -535,7 +533,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, #ifdef NOTYET if (flags & BUS_DMA_NOCACHE) pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, - PAT_UNCACHEABLE); + VM_MEMATTR_UNCACHEABLE); #endif CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, 0); @@ -549,14 +547,10 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) { - /* - * dmamem does not need to be bounced, so the map should be - * NULL - */ - if (map != NULL) - panic("bus_dmamem_free: Invalid map freed\n"); + bus_dmamap_destroy(dmat, map); + #ifdef NOTYET - pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, PAT_WRITE_BACK); + pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, VM_MEMATTR_DEFAULT); #endif if ((dmat->maxsize <= PAGE_SIZE) && (dmat->alignment < dmat->maxsize) && @@ -591,18 +585,13 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_addr_t paddr; int seg; - if (map == NULL) - map = &nobounce_dmamap; - - if ((map != &nobounce_dmamap && map->pagesneeded == 0) - && ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0)) { + if (map->pagesneeded == 0 && ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0)) { vm_offset_t vendaddr; CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " "alignment= %d", dmat->lowaddr, ptoa((vm_paddr_t)Maxmem), dmat->boundary, dmat->alignment); - CTR3(KTR_BUSDMA, "map= %p, nobouncemap= %p, pagesneeded= %d", - map, &nobounce_dmamap, map->pagesneeded); + CTR2(KTR_BUSDMA, "map= %p, pagesneeded= %d", map, map->pagesneeded); /* * Count the number of bounce pages * needed in order to complete this transfer @@ -731,29 +720,36 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int flags) { - bus_addr_t lastaddr = 0; - int error, nsegs = 0; + bus_addr_t lastaddr = 0; + int error; - if (map != NULL) { + if (dmat->flags & BUS_DMA_COULD_BOUNCE) { flags |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } + map->nsegs = 0; error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, - &lastaddr, dmat->segments, &nsegs, 1); + &lastaddr, map->segments, &map->nsegs, 1); + map->nsegs++; CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); + __func__, dmat, dmat->flags, error, map->nsegs); if (error == EINPROGRESS) { return (error); } + if (dmat->iommu != NULL) + IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs, dmat->lowaddr, + dmat->highaddr, dmat->alignment, dmat->boundary, + dmat->iommu_cookie); + if (error) - (*callback)(callback_arg, dmat->segments, 0, error); + (*callback)(callback_arg, map->segments, 0, error); else - (*callback)(callback_arg, dmat->segments, nsegs + 1, 0); + (*callback)(callback_arg, map->segments, map->nsegs, 0); /* * Return ENOMEM to the caller so that it can pass it up the stack. @@ -775,12 +771,12 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { - int nsegs, error; + int error; M_ASSERTPKTHDR(m0); flags |= BUS_DMA_NOWAIT; - nsegs = 0; + map->nsegs = 0; error = 0; if (m0->m_pkthdr.len <= dmat->maxsize) { int first = 1; @@ -792,7 +788,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, NULL, flags, &lastaddr, - dmat->segments, &nsegs, first); + map->segments, &map->nsegs, first); first = 0; } } @@ -800,15 +796,21 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, error = EINVAL; } + map->nsegs++; + if (dmat->iommu != NULL) + IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs, dmat->lowaddr, + dmat->highaddr, dmat->alignment, dmat->boundary, + dmat->iommu_cookie); + if (error) { /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dmat->segments, 0, 0, error); + (*callback)(callback_arg, map->segments, 0, 0, error); } else { - (*callback)(callback_arg, dmat->segments, - nsegs+1, m0->m_pkthdr.len, error); + (*callback)(callback_arg, map->segments, + map->nsegs, m0->m_pkthdr.len, error); } CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); + __func__, dmat, dmat->flags, error, map->nsegs); return (error); } @@ -844,6 +846,15 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, /* XXX FIXME: Having to increment nsegs is really annoying */ ++*nsegs; + + if (dmat->iommu != NULL) + IOMMU_MAP(dmat->iommu, segs, nsegs, dmat->lowaddr, + dmat->highaddr, dmat->alignment, dmat->boundary, + dmat->iommu_cookie); + + map->nsegs = *nsegs; + memcpy(map->segments, segs, map->nsegs*sizeof(segs[0])); + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat->flags, error, *nsegs); return (error); @@ -859,7 +870,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, int flags) { bus_addr_t lastaddr = 0; - int nsegs, error, first, i; + int error, first, i; bus_size_t resid; struct iovec *iov; pmap_t pmap; @@ -875,7 +886,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, } else pmap = NULL; - nsegs = 0; + map->nsegs = 0; error = 0; first = 1; for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { @@ -890,22 +901,28 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, if (minlen > 0) { error = _bus_dmamap_load_buffer(dmat, map, addr, minlen, pmap, flags, &lastaddr, - dmat->segments, &nsegs, first); + map->segments, &map->nsegs, first); first = 0; resid -= minlen; } } + map->nsegs++; + if (dmat->iommu != NULL) + IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs, dmat->lowaddr, + dmat->highaddr, dmat->alignment, dmat->boundary, + dmat->iommu_cookie); + if (error) { /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dmat->segments, 0, 0, error); + (*callback)(callback_arg, map->segments, 0, 0, error); } else { - (*callback)(callback_arg, dmat->segments, - nsegs+1, uio->uio_resid, error); + (*callback)(callback_arg, map->segments, + map->nsegs, uio->uio_resid, error); } CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); + __func__, dmat, dmat->flags, error, map->nsegs); return (error); } @@ -917,6 +934,11 @@ _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { struct bounce_page *bpage; + if (dmat->iommu) { + IOMMU_UNMAP(dmat->iommu, map->segments, map->nsegs, dmat->iommu_cookie); + map->nsegs = 0; + } + while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { STAILQ_REMOVE_HEAD(&map->bpages, links); free_bounce_page(dmat, bpage); @@ -1122,8 +1144,6 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, struct bounce_page *bpage; KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); - KASSERT(map != NULL && map != &nobounce_dmamap, - ("add_bounce_page: bad map %p", map)); bz = dmat->bounce_zone; if (map->pagesneeded == 0) @@ -1210,3 +1230,13 @@ busdma_swi(void) } mtx_unlock(&bounce_lock); } + +int +bus_dma_tag_set_iommu(bus_dma_tag_t tag, struct device *iommu, void *cookie) +{ + tag->iommu = iommu; + tag->iommu_cookie = cookie; + + return (0); +} + diff --git a/sys/powerpc/powerpc/iommu_if.m b/sys/powerpc/powerpc/iommu_if.m new file mode 100644 index 0000000..dec70e3 --- /dev/null +++ b/sys/powerpc/powerpc/iommu_if.m @@ -0,0 +1,54 @@ +#- +# Copyright (c) 2010 Nathan Whitehorn +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# from: src/sys/kern/bus_if.m,v 1.21 2002/04/21 11:16:10 markm Exp +# $FreeBSD$ +# + +#include + +#include +#include + +INTERFACE iommu; + +METHOD int map { + device_t iommu; + bus_dma_segment_t *segs; + int *nsegs; + bus_addr_t lowaddr; + bus_addr_t highaddr; + bus_size_t alignment; + bus_size_t boundary; + void *cookie; +}; + +METHOD int unmap { + device_t iommu; + bus_dma_segment_t *segs; + int nsegs; + void *cookie; +}; + -- cgit v1.1 From 3e854ebf959d26915bc669c5f087303f4ae8c975 Mon Sep 17 00:00:00 2001 From: brucec Date: Fri, 3 Dec 2010 18:30:55 +0000 Subject: Document the fact that passing in a count of zero to the bus_space functions will result in undefined behaviour. Taken from NetBSD's bus_space(9). --- share/man/man9/bus_space.9 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/share/man/man9/bus_space.9 b/share/man/man9/bus_space.9 index 5a18dfb..b3234c4 100644 --- a/share/man/man9/bus_space.9 +++ b/share/man/man9/bus_space.9 @@ -719,6 +719,9 @@ or which return data read from bus space (i.e., functions which do not obviously return an error code) do not fail. They could only fail if given invalid arguments, and in that case their behaviour is undefined. +Functions which take a count of bytes have undefined results if the specified +.Fa count +is zero. .Sh TYPES Several types are defined in .In machine/bus.h -- cgit v1.1 From cbc03d7836d367a26880c77736410bd4af76ebe4 Mon Sep 17 00:00:00 2001 From: jchandra Date: Fri, 3 Dec 2010 19:22:18 +0000 Subject: 1. Fix off by one errors in calls to MIPS_DIRECT_MAPPABLE, reported by alc@ 2. Remove unnecessary #defines from vmparam.h Submitted by: alc (2) Reviewed by: alc (1) --- sys/mips/include/vmparam.h | 6 ------ sys/mips/mips/pmap.c | 23 ++++++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/sys/mips/include/vmparam.h b/sys/mips/include/vmparam.h index 3050a91..b76e065 100644 --- a/sys/mips/include/vmparam.h +++ b/sys/mips/include/vmparam.h @@ -46,11 +46,6 @@ /* * Machine dependent constants mips processors. */ -/* - * USRTEXT is the start of the user text/data space, while USRSTACK - * is the top (end) of the user stack. - */ -#define USRTEXT (1*PAGE_SIZE) /* * Virtual memory related constants, all in bytes @@ -94,7 +89,6 @@ #define VM_MAX_ADDRESS ((vm_offset_t)(intptr_t)(int32_t)0xffffffff) #define VM_MINUSER_ADDRESS ((vm_offset_t)0x00000000) -#define VM_MAX_MMAP_ADDR VM_MAXUSER_ADDRESS #ifdef __mips_n64 #define VM_MAXUSER_ADDRESS (VM_MINUSER_ADDRESS + (NPDEPG * NBSEG)) diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 4e2b34e..69d4e1e 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -196,14 +196,15 @@ static void pmap_update_page_action(void *arg); #ifndef __mips_n64 /* - * This structure is for high memory (memory above 512Meg in 32 bit) - * This memory area does not have direct mapping, so we a mechanism to do - * temporary per-CPU mapping to access these addresses. + * This structure is for high memory (memory above 512Meg in 32 bit) support. + * The highmem area does not have a KSEG0 mapping, and we need a mechanism to + * do temporary per-CPU mappings for pmap_zero_page, pmap_copy_page etc. * - * At bootup we reserve 2 virtual pages per CPU for mapping highmem pages, to - * access a highmem physical address on a CPU, we will disable interrupts and - * add the mapping from the reserved virtual address for the CPU to the physical - * address in the kernel pagetable. + * At bootup, we reserve 2 virtual pages per CPU for mapping highmem pages. To + * access a highmem physical address on a CPU, we map the physical address to + * the reserved virtual address for the CPU in the kernel pagetable. This is + * done with interrupts disabled(although a spinlock and sched_pin would be + * sufficient). */ struct local_sysmaps { vm_offset_t base; @@ -520,11 +521,11 @@ again: } /* - * In 32 bit, we may have memory which cannot be mapped directly - * this memory will need temporary mapping before it can be + * In 32 bit, we may have memory which cannot be mapped directly. + * This memory will need temporary mapping before it can be * accessed. */ - if (!MIPS_DIRECT_MAPPABLE(phys_avail[i - 1])) + if (!MIPS_DIRECT_MAPPABLE(phys_avail[i - 1] - 1)) need_local_mappings = 1; /* @@ -893,7 +894,7 @@ pmap_map(vm_offset_t *virt, vm_offset_t start, vm_offset_t end, int prot) { vm_offset_t va, sva; - if (MIPS_DIRECT_MAPPABLE(end)) + if (MIPS_DIRECT_MAPPABLE(end - 1)) return (MIPS_PHYS_TO_DIRECT(start)); va = sva = *virt; -- cgit v1.1 From 1ffd755b88155bbf5b6a24803f1c24805e37f340 Mon Sep 17 00:00:00 2001 From: kib Date: Fri, 3 Dec 2010 20:39:06 +0000 Subject: Trim whitespaces at the end of lines. Use the commit to record proper log message for r216150. MFC after: 1 week If unix socket has a unix socket attached as the rights that has a unix socket attached as the rights that has a unix socket attached as the rights ... Kernel may overflow the stack on attempt to close such socket. Only close the rights file in the context of the current close if the file is not unix domain socket. Otherwise, postpone the work to taskqueue, preventing unlimited recursion. The pass of the unix domain sockets over the SCM_RIGHTS message control is not widely used, and more, the close of the socket with still attached rights is mostly an application failure. The change should not affect the performance of typical users of SCM_RIGHTS. Reviewed by: jeff, rwatson --- sys/kern/uipc_usrreq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 1c0903a..8920201 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -177,10 +177,10 @@ SYSCTL_ULONG(_net_local_seqpacket, OID_AUTO, maxseqpacket, CTLFLAG_RW, &unpsp_sendspace, 0, "Default seqpacket send space."); SYSCTL_ULONG(_net_local_seqpacket, OID_AUTO, recvspace, CTLFLAG_RW, &unpsp_recvspace, 0, "Default seqpacket receive space."); -SYSCTL_INT(_net_local, OID_AUTO, inflight, CTLFLAG_RD, &unp_rights, 0, +SYSCTL_INT(_net_local, OID_AUTO, inflight, CTLFLAG_RD, &unp_rights, 0, "File descriptors in flight."); SYSCTL_INT(_net_local, OID_AUTO, deferred, CTLFLAG_RD, - &unp_defers_count, 0, + &unp_defers_count, 0, "File descriptors deferred to taskqueue for close."); /* -- cgit v1.1 From 27a9a04e8570c6d0eddb40b6857bbb1376a4a923 Mon Sep 17 00:00:00 2001 From: jkim Date: Fri, 3 Dec 2010 21:06:30 +0000 Subject: Do not change CPU ticker frequency if TSC is P-state invariant. Note this change was meant to be committed with r184102 (and its subsequent MFCs) but it fell off somehow. Pointyhat to: jkim MFC after: 3 days --- sys/amd64/amd64/tsc.c | 3 +++ sys/i386/i386/tsc.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 847c1eb..9ed36eb 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -146,6 +146,9 @@ tsc_levels_changed(void *arg, int unit) int count, error; uint64_t max_freq; + if (tsc_is_invariant) + return; + /* Only use values from the first CPU, assuming all are equal. */ if (unit != 0) return; diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 882b442..185f240 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -174,6 +174,9 @@ tsc_levels_changed(void *arg, int unit) int count, error; uint64_t max_freq; + if (tsc_is_invariant) + return; + /* Only use values from the first CPU, assuming all are equal. */ if (unit != 0) return; -- cgit v1.1 From cb2b11e5ededab1a5c6e1cc592c6d7f5c159583c Mon Sep 17 00:00:00 2001 From: jkim Date: Fri, 3 Dec 2010 21:54:10 +0000 Subject: Explicitly initialize TSC frequency. To calibrate TSC frequency, we use DELAY(9) and it may use TSC in turn if TSC frequency is non-zero. MFC after: 3 days --- sys/amd64/amd64/tsc.c | 2 +- sys/i386/i386/tsc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 9ed36eb..65b0990 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include "cpufreq_if.h" -uint64_t tsc_freq; +uint64_t tsc_freq = 0; int tsc_is_broken; int tsc_is_invariant; static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 185f240..0fb2c9f 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include "cpufreq_if.h" -uint64_t tsc_freq; +uint64_t tsc_freq = 0; int tsc_is_broken; int tsc_is_invariant; u_int tsc_present; -- cgit v1.1 From 477858ee257a6cd5108309ebe5f2cc80ab26c5e1 Mon Sep 17 00:00:00 2001 From: jkim Date: Fri, 3 Dec 2010 22:27:51 +0000 Subject: Revert r216161. It is not necessary because we zero-fill BSS anyway. Requested by: jhb --- sys/amd64/amd64/tsc.c | 2 +- sys/i386/i386/tsc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 65b0990..9ed36eb 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include "cpufreq_if.h" -uint64_t tsc_freq = 0; +uint64_t tsc_freq; int tsc_is_broken; int tsc_is_invariant; static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 0fb2c9f..185f240 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include "cpufreq_if.h" -uint64_t tsc_freq = 0; +uint64_t tsc_freq; int tsc_is_broken; int tsc_is_invariant; u_int tsc_present; -- cgit v1.1 From 9fbb25bbe9a3d351e5026eb5cbaaa7641e6e8688 Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 3 Dec 2010 23:07:45 +0000 Subject: Regenerate manual pages for OpenSSL 0.9.8q. --- secure/lib/libcrypto/Makefile.inc | 4 ++-- secure/lib/libcrypto/man/ASN1_OBJECT_new.3 | 2 +- secure/lib/libcrypto/man/ASN1_STRING_length.3 | 2 +- secure/lib/libcrypto/man/ASN1_STRING_new.3 | 2 +- secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 | 2 +- secure/lib/libcrypto/man/ASN1_generate_nconf.3 | 2 +- secure/lib/libcrypto/man/BIO_ctrl.3 | 2 +- secure/lib/libcrypto/man/BIO_f_base64.3 | 2 +- secure/lib/libcrypto/man/BIO_f_buffer.3 | 2 +- secure/lib/libcrypto/man/BIO_f_cipher.3 | 2 +- secure/lib/libcrypto/man/BIO_f_md.3 | 2 +- secure/lib/libcrypto/man/BIO_f_null.3 | 2 +- secure/lib/libcrypto/man/BIO_f_ssl.3 | 2 +- secure/lib/libcrypto/man/BIO_find_type.3 | 2 +- secure/lib/libcrypto/man/BIO_new.3 | 2 +- secure/lib/libcrypto/man/BIO_push.3 | 2 +- secure/lib/libcrypto/man/BIO_read.3 | 2 +- secure/lib/libcrypto/man/BIO_s_accept.3 | 2 +- secure/lib/libcrypto/man/BIO_s_bio.3 | 2 +- secure/lib/libcrypto/man/BIO_s_connect.3 | 2 +- secure/lib/libcrypto/man/BIO_s_fd.3 | 2 +- secure/lib/libcrypto/man/BIO_s_file.3 | 2 +- secure/lib/libcrypto/man/BIO_s_mem.3 | 2 +- secure/lib/libcrypto/man/BIO_s_null.3 | 2 +- secure/lib/libcrypto/man/BIO_s_socket.3 | 2 +- secure/lib/libcrypto/man/BIO_set_callback.3 | 2 +- secure/lib/libcrypto/man/BIO_should_retry.3 | 2 +- secure/lib/libcrypto/man/BN_BLINDING_new.3 | 2 +- secure/lib/libcrypto/man/BN_CTX_new.3 | 2 +- secure/lib/libcrypto/man/BN_CTX_start.3 | 2 +- secure/lib/libcrypto/man/BN_add.3 | 2 +- secure/lib/libcrypto/man/BN_add_word.3 | 2 +- secure/lib/libcrypto/man/BN_bn2bin.3 | 2 +- secure/lib/libcrypto/man/BN_cmp.3 | 2 +- secure/lib/libcrypto/man/BN_copy.3 | 2 +- secure/lib/libcrypto/man/BN_generate_prime.3 | 2 +- secure/lib/libcrypto/man/BN_mod_inverse.3 | 2 +- secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 | 2 +- secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 | 2 +- secure/lib/libcrypto/man/BN_new.3 | 2 +- secure/lib/libcrypto/man/BN_num_bytes.3 | 2 +- secure/lib/libcrypto/man/BN_rand.3 | 2 +- secure/lib/libcrypto/man/BN_set_bit.3 | 2 +- secure/lib/libcrypto/man/BN_swap.3 | 2 +- secure/lib/libcrypto/man/BN_zero.3 | 2 +- secure/lib/libcrypto/man/CONF_modules_free.3 | 2 +- secure/lib/libcrypto/man/CONF_modules_load_file.3 | 2 +- secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 | 2 +- secure/lib/libcrypto/man/DH_generate_key.3 | 2 +- secure/lib/libcrypto/man/DH_generate_parameters.3 | 2 +- secure/lib/libcrypto/man/DH_get_ex_new_index.3 | 2 +- secure/lib/libcrypto/man/DH_new.3 | 2 +- secure/lib/libcrypto/man/DH_set_method.3 | 2 +- secure/lib/libcrypto/man/DH_size.3 | 2 +- secure/lib/libcrypto/man/DSA_SIG_new.3 | 2 +- secure/lib/libcrypto/man/DSA_do_sign.3 | 2 +- secure/lib/libcrypto/man/DSA_dup_DH.3 | 2 +- secure/lib/libcrypto/man/DSA_generate_key.3 | 2 +- secure/lib/libcrypto/man/DSA_generate_parameters.3 | 2 +- secure/lib/libcrypto/man/DSA_get_ex_new_index.3 | 2 +- secure/lib/libcrypto/man/DSA_new.3 | 2 +- secure/lib/libcrypto/man/DSA_set_method.3 | 2 +- secure/lib/libcrypto/man/DSA_sign.3 | 2 +- secure/lib/libcrypto/man/DSA_size.3 | 2 +- secure/lib/libcrypto/man/ERR_GET_LIB.3 | 2 +- secure/lib/libcrypto/man/ERR_clear_error.3 | 2 +- secure/lib/libcrypto/man/ERR_error_string.3 | 2 +- secure/lib/libcrypto/man/ERR_get_error.3 | 2 +- secure/lib/libcrypto/man/ERR_load_crypto_strings.3 | 2 +- secure/lib/libcrypto/man/ERR_load_strings.3 | 2 +- secure/lib/libcrypto/man/ERR_print_errors.3 | 2 +- secure/lib/libcrypto/man/ERR_put_error.3 | 2 +- secure/lib/libcrypto/man/ERR_remove_state.3 | 2 +- secure/lib/libcrypto/man/ERR_set_mark.3 | 2 +- secure/lib/libcrypto/man/EVP_BytesToKey.3 | 2 +- secure/lib/libcrypto/man/EVP_DigestInit.3 | 2 +- secure/lib/libcrypto/man/EVP_EncryptInit.3 | 2 +- secure/lib/libcrypto/man/EVP_OpenInit.3 | 2 +- secure/lib/libcrypto/man/EVP_PKEY_new.3 | 2 +- secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 | 2 +- secure/lib/libcrypto/man/EVP_SealInit.3 | 2 +- secure/lib/libcrypto/man/EVP_SignInit.3 | 2 +- secure/lib/libcrypto/man/EVP_VerifyInit.3 | 2 +- secure/lib/libcrypto/man/OBJ_nid2obj.3 | 2 +- secure/lib/libcrypto/man/OPENSSL_Applink.3 | 2 +- secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 | 2 +- secure/lib/libcrypto/man/OPENSSL_config.3 | 2 +- secure/lib/libcrypto/man/OPENSSL_ia32cap.3 | 2 +- secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 | 2 +- secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 | 2 +- secure/lib/libcrypto/man/PKCS12_create.3 | 2 +- secure/lib/libcrypto/man/PKCS12_parse.3 | 2 +- secure/lib/libcrypto/man/PKCS7_decrypt.3 | 2 +- secure/lib/libcrypto/man/PKCS7_encrypt.3 | 2 +- secure/lib/libcrypto/man/PKCS7_sign.3 | 2 +- secure/lib/libcrypto/man/PKCS7_verify.3 | 2 +- secure/lib/libcrypto/man/RAND_add.3 | 2 +- secure/lib/libcrypto/man/RAND_bytes.3 | 2 +- secure/lib/libcrypto/man/RAND_cleanup.3 | 2 +- secure/lib/libcrypto/man/RAND_egd.3 | 2 +- secure/lib/libcrypto/man/RAND_load_file.3 | 2 +- secure/lib/libcrypto/man/RAND_set_rand_method.3 | 2 +- secure/lib/libcrypto/man/RSA_blinding_on.3 | 2 +- secure/lib/libcrypto/man/RSA_check_key.3 | 2 +- secure/lib/libcrypto/man/RSA_generate_key.3 | 2 +- secure/lib/libcrypto/man/RSA_get_ex_new_index.3 | 2 +- secure/lib/libcrypto/man/RSA_new.3 | 2 +- secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 | 2 +- secure/lib/libcrypto/man/RSA_print.3 | 2 +- secure/lib/libcrypto/man/RSA_private_encrypt.3 | 2 +- secure/lib/libcrypto/man/RSA_public_encrypt.3 | 2 +- secure/lib/libcrypto/man/RSA_set_method.3 | 2 +- secure/lib/libcrypto/man/RSA_sign.3 | 2 +- secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 | 2 +- secure/lib/libcrypto/man/RSA_size.3 | 2 +- secure/lib/libcrypto/man/SMIME_read_PKCS7.3 | 2 +- secure/lib/libcrypto/man/SMIME_write_PKCS7.3 | 2 +- secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 | 2 +- secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 | 2 +- secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 | 2 +- secure/lib/libcrypto/man/X509_NAME_print_ex.3 | 2 +- secure/lib/libcrypto/man/X509_new.3 | 2 +- secure/lib/libcrypto/man/bio.3 | 2 +- secure/lib/libcrypto/man/blowfish.3 | 2 +- secure/lib/libcrypto/man/bn.3 | 2 +- secure/lib/libcrypto/man/bn_internal.3 | 2 +- secure/lib/libcrypto/man/buffer.3 | 2 +- secure/lib/libcrypto/man/crypto.3 | 2 +- secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 | 2 +- secure/lib/libcrypto/man/d2i_DHparams.3 | 2 +- secure/lib/libcrypto/man/d2i_DSAPublicKey.3 | 2 +- secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 | 2 +- secure/lib/libcrypto/man/d2i_RSAPublicKey.3 | 2 +- secure/lib/libcrypto/man/d2i_X509.3 | 2 +- secure/lib/libcrypto/man/d2i_X509_ALGOR.3 | 2 +- secure/lib/libcrypto/man/d2i_X509_CRL.3 | 2 +- secure/lib/libcrypto/man/d2i_X509_NAME.3 | 2 +- secure/lib/libcrypto/man/d2i_X509_REQ.3 | 2 +- secure/lib/libcrypto/man/d2i_X509_SIG.3 | 2 +- secure/lib/libcrypto/man/des.3 | 2 +- secure/lib/libcrypto/man/dh.3 | 2 +- secure/lib/libcrypto/man/dsa.3 | 2 +- secure/lib/libcrypto/man/ecdsa.3 | 2 +- secure/lib/libcrypto/man/engine.3 | 2 +- secure/lib/libcrypto/man/err.3 | 2 +- secure/lib/libcrypto/man/evp.3 | 2 +- secure/lib/libcrypto/man/hmac.3 | 2 +- secure/lib/libcrypto/man/lh_stats.3 | 2 +- secure/lib/libcrypto/man/lhash.3 | 2 +- secure/lib/libcrypto/man/md5.3 | 2 +- secure/lib/libcrypto/man/mdc2.3 | 2 +- secure/lib/libcrypto/man/pem.3 | 2 +- secure/lib/libcrypto/man/rand.3 | 2 +- secure/lib/libcrypto/man/rc4.3 | 2 +- secure/lib/libcrypto/man/ripemd.3 | 2 +- secure/lib/libcrypto/man/rsa.3 | 2 +- secure/lib/libcrypto/man/sha.3 | 2 +- secure/lib/libcrypto/man/threads.3 | 2 +- secure/lib/libcrypto/man/ui.3 | 2 +- secure/lib/libcrypto/man/ui_compat.3 | 2 +- secure/lib/libcrypto/man/x509.3 | 2 +- secure/lib/libssl/man/SSL_CIPHER_get_name.3 | 2 +- secure/lib/libssl/man/SSL_COMP_add_compression_method.3 | 2 +- secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 | 2 +- secure/lib/libssl/man/SSL_CTX_add_session.3 | 2 +- secure/lib/libssl/man/SSL_CTX_ctrl.3 | 2 +- secure/lib/libssl/man/SSL_CTX_flush_sessions.3 | 2 +- secure/lib/libssl/man/SSL_CTX_free.3 | 2 +- secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 | 2 +- secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 | 2 +- secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 | 2 +- secure/lib/libssl/man/SSL_CTX_new.3 | 2 +- secure/lib/libssl/man/SSL_CTX_sess_number.3 | 2 +- secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 | 2 +- secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 | 2 +- secure/lib/libssl/man/SSL_CTX_sessions.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_cert_store.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_info_callback.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_mode.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_options.3 | 15 ++------------- secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_timeout.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 | 2 +- secure/lib/libssl/man/SSL_CTX_set_verify.3 | 2 +- secure/lib/libssl/man/SSL_CTX_use_certificate.3 | 2 +- secure/lib/libssl/man/SSL_SESSION_free.3 | 2 +- secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 | 2 +- secure/lib/libssl/man/SSL_SESSION_get_time.3 | 2 +- secure/lib/libssl/man/SSL_accept.3 | 2 +- secure/lib/libssl/man/SSL_alert_type_string.3 | 2 +- secure/lib/libssl/man/SSL_clear.3 | 2 +- secure/lib/libssl/man/SSL_connect.3 | 2 +- secure/lib/libssl/man/SSL_do_handshake.3 | 2 +- secure/lib/libssl/man/SSL_free.3 | 2 +- secure/lib/libssl/man/SSL_get_SSL_CTX.3 | 2 +- secure/lib/libssl/man/SSL_get_ciphers.3 | 2 +- secure/lib/libssl/man/SSL_get_client_CA_list.3 | 2 +- secure/lib/libssl/man/SSL_get_current_cipher.3 | 2 +- secure/lib/libssl/man/SSL_get_default_timeout.3 | 2 +- secure/lib/libssl/man/SSL_get_error.3 | 2 +- .../lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 | 2 +- secure/lib/libssl/man/SSL_get_ex_new_index.3 | 2 +- secure/lib/libssl/man/SSL_get_fd.3 | 2 +- secure/lib/libssl/man/SSL_get_peer_cert_chain.3 | 2 +- secure/lib/libssl/man/SSL_get_peer_certificate.3 | 2 +- secure/lib/libssl/man/SSL_get_rbio.3 | 2 +- secure/lib/libssl/man/SSL_get_session.3 | 2 +- secure/lib/libssl/man/SSL_get_verify_result.3 | 2 +- secure/lib/libssl/man/SSL_get_version.3 | 2 +- secure/lib/libssl/man/SSL_library_init.3 | 2 +- secure/lib/libssl/man/SSL_load_client_CA_file.3 | 2 +- secure/lib/libssl/man/SSL_new.3 | 2 +- secure/lib/libssl/man/SSL_pending.3 | 2 +- secure/lib/libssl/man/SSL_read.3 | 2 +- secure/lib/libssl/man/SSL_rstate_string.3 | 2 +- secure/lib/libssl/man/SSL_session_reused.3 | 2 +- secure/lib/libssl/man/SSL_set_bio.3 | 2 +- secure/lib/libssl/man/SSL_set_connect_state.3 | 2 +- secure/lib/libssl/man/SSL_set_fd.3 | 2 +- secure/lib/libssl/man/SSL_set_session.3 | 2 +- secure/lib/libssl/man/SSL_set_shutdown.3 | 2 +- secure/lib/libssl/man/SSL_set_verify_result.3 | 2 +- secure/lib/libssl/man/SSL_shutdown.3 | 2 +- secure/lib/libssl/man/SSL_state_string.3 | 2 +- secure/lib/libssl/man/SSL_want.3 | 2 +- secure/lib/libssl/man/SSL_write.3 | 2 +- secure/lib/libssl/man/d2i_SSL_SESSION.3 | 2 +- secure/lib/libssl/man/ssl.3 | 2 +- secure/usr.bin/openssl/man/CA.pl.1 | 2 +- secure/usr.bin/openssl/man/asn1parse.1 | 2 +- secure/usr.bin/openssl/man/ca.1 | 2 +- secure/usr.bin/openssl/man/ciphers.1 | 2 +- secure/usr.bin/openssl/man/crl.1 | 2 +- secure/usr.bin/openssl/man/crl2pkcs7.1 | 2 +- secure/usr.bin/openssl/man/dgst.1 | 2 +- secure/usr.bin/openssl/man/dhparam.1 | 2 +- secure/usr.bin/openssl/man/dsa.1 | 2 +- secure/usr.bin/openssl/man/dsaparam.1 | 2 +- secure/usr.bin/openssl/man/ec.1 | 2 +- secure/usr.bin/openssl/man/ecparam.1 | 2 +- secure/usr.bin/openssl/man/enc.1 | 2 +- secure/usr.bin/openssl/man/errstr.1 | 2 +- secure/usr.bin/openssl/man/gendsa.1 | 2 +- secure/usr.bin/openssl/man/genrsa.1 | 2 +- secure/usr.bin/openssl/man/nseq.1 | 2 +- secure/usr.bin/openssl/man/ocsp.1 | 2 +- secure/usr.bin/openssl/man/openssl.1 | 2 +- secure/usr.bin/openssl/man/passwd.1 | 2 +- secure/usr.bin/openssl/man/pkcs12.1 | 2 +- secure/usr.bin/openssl/man/pkcs7.1 | 2 +- secure/usr.bin/openssl/man/pkcs8.1 | 2 +- secure/usr.bin/openssl/man/rand.1 | 2 +- secure/usr.bin/openssl/man/req.1 | 2 +- secure/usr.bin/openssl/man/rsa.1 | 2 +- secure/usr.bin/openssl/man/rsautl.1 | 2 +- secure/usr.bin/openssl/man/s_client.1 | 2 +- secure/usr.bin/openssl/man/s_server.1 | 2 +- secure/usr.bin/openssl/man/s_time.1 | 2 +- secure/usr.bin/openssl/man/sess_id.1 | 2 +- secure/usr.bin/openssl/man/smime.1 | 2 +- secure/usr.bin/openssl/man/speed.1 | 2 +- secure/usr.bin/openssl/man/spkac.1 | 2 +- secure/usr.bin/openssl/man/verify.1 | 2 +- secure/usr.bin/openssl/man/version.1 | 2 +- secure/usr.bin/openssl/man/x509.1 | 2 +- secure/usr.bin/openssl/man/x509v3_config.1 | 2 +- 278 files changed, 280 insertions(+), 291 deletions(-) diff --git a/secure/lib/libcrypto/Makefile.inc b/secure/lib/libcrypto/Makefile.inc index 24e4243..24b8d88 100644 --- a/secure/lib/libcrypto/Makefile.inc +++ b/secure/lib/libcrypto/Makefile.inc @@ -3,8 +3,8 @@ .include # OpenSSL version used for manual page generation -OPENSSL_VER= 0.9.8p -OPENSSL_DATE= 2010-11-16 +OPENSSL_VER= 0.9.8q +OPENSSL_DATE= 2010-12-02 LCRYPTO_SRC= ${.CURDIR}/../../../crypto/openssl LCRYPTO_DOC= ${.CURDIR}/../../../crypto/openssl/doc diff --git a/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 b/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 index 7e0877c..a1e248e 100644 --- a/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 +++ b/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_OBJECT_new 3" -.TH ASN1_OBJECT_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ASN1_OBJECT_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_STRING_length.3 b/secure/lib/libcrypto/man/ASN1_STRING_length.3 index b79cb06..5472c30 100644 --- a/secure/lib/libcrypto/man/ASN1_STRING_length.3 +++ b/secure/lib/libcrypto/man/ASN1_STRING_length.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_STRING_length 3" -.TH ASN1_STRING_length 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ASN1_STRING_length 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_STRING_new.3 b/secure/lib/libcrypto/man/ASN1_STRING_new.3 index f9071aa..04b6e8a 100644 --- a/secure/lib/libcrypto/man/ASN1_STRING_new.3 +++ b/secure/lib/libcrypto/man/ASN1_STRING_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_STRING_new 3" -.TH ASN1_STRING_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ASN1_STRING_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 b/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 index 7dbae7d..a56f6aa 100644 --- a/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 +++ b/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_STRING_print_ex 3" -.TH ASN1_STRING_print_ex 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ASN1_STRING_print_ex 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_generate_nconf.3 b/secure/lib/libcrypto/man/ASN1_generate_nconf.3 index f3d3036..6be122a 100644 --- a/secure/lib/libcrypto/man/ASN1_generate_nconf.3 +++ b/secure/lib/libcrypto/man/ASN1_generate_nconf.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_generate_nconf 3" -.TH ASN1_generate_nconf 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ASN1_generate_nconf 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_ctrl.3 b/secure/lib/libcrypto/man/BIO_ctrl.3 index ea0b20f..d58eb62 100644 --- a/secure/lib/libcrypto/man/BIO_ctrl.3 +++ b/secure/lib/libcrypto/man/BIO_ctrl.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_ctrl 3" -.TH BIO_ctrl 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_ctrl 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_base64.3 b/secure/lib/libcrypto/man/BIO_f_base64.3 index 330d123..936ea90 100644 --- a/secure/lib/libcrypto/man/BIO_f_base64.3 +++ b/secure/lib/libcrypto/man/BIO_f_base64.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_base64 3" -.TH BIO_f_base64 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_f_base64 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_buffer.3 b/secure/lib/libcrypto/man/BIO_f_buffer.3 index 1244970..ebc0c16 100644 --- a/secure/lib/libcrypto/man/BIO_f_buffer.3 +++ b/secure/lib/libcrypto/man/BIO_f_buffer.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_buffer 3" -.TH BIO_f_buffer 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_f_buffer 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_cipher.3 b/secure/lib/libcrypto/man/BIO_f_cipher.3 index 1f7bd44..2a7f885 100644 --- a/secure/lib/libcrypto/man/BIO_f_cipher.3 +++ b/secure/lib/libcrypto/man/BIO_f_cipher.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_cipher 3" -.TH BIO_f_cipher 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_f_cipher 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_md.3 b/secure/lib/libcrypto/man/BIO_f_md.3 index d202fd3..0f44132 100644 --- a/secure/lib/libcrypto/man/BIO_f_md.3 +++ b/secure/lib/libcrypto/man/BIO_f_md.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_md 3" -.TH BIO_f_md 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_f_md 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_null.3 b/secure/lib/libcrypto/man/BIO_f_null.3 index 5d3be78..06f6cc7 100644 --- a/secure/lib/libcrypto/man/BIO_f_null.3 +++ b/secure/lib/libcrypto/man/BIO_f_null.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_null 3" -.TH BIO_f_null 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_f_null 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_ssl.3 b/secure/lib/libcrypto/man/BIO_f_ssl.3 index 41928ec..8e95630 100644 --- a/secure/lib/libcrypto/man/BIO_f_ssl.3 +++ b/secure/lib/libcrypto/man/BIO_f_ssl.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_ssl 3" -.TH BIO_f_ssl 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_f_ssl 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_find_type.3 b/secure/lib/libcrypto/man/BIO_find_type.3 index 3ee2466..ff8eb3a 100644 --- a/secure/lib/libcrypto/man/BIO_find_type.3 +++ b/secure/lib/libcrypto/man/BIO_find_type.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_find_type 3" -.TH BIO_find_type 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_find_type 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_new.3 b/secure/lib/libcrypto/man/BIO_new.3 index e02e323..3457bae 100644 --- a/secure/lib/libcrypto/man/BIO_new.3 +++ b/secure/lib/libcrypto/man/BIO_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_new 3" -.TH BIO_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_push.3 b/secure/lib/libcrypto/man/BIO_push.3 index 73f62a1..9d43372 100644 --- a/secure/lib/libcrypto/man/BIO_push.3 +++ b/secure/lib/libcrypto/man/BIO_push.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_push 3" -.TH BIO_push 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_push 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_read.3 b/secure/lib/libcrypto/man/BIO_read.3 index ab91e12..d2d585a 100644 --- a/secure/lib/libcrypto/man/BIO_read.3 +++ b/secure/lib/libcrypto/man/BIO_read.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_read 3" -.TH BIO_read 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_read 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_accept.3 b/secure/lib/libcrypto/man/BIO_s_accept.3 index 455b26b..17426b7 100644 --- a/secure/lib/libcrypto/man/BIO_s_accept.3 +++ b/secure/lib/libcrypto/man/BIO_s_accept.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_accept 3" -.TH BIO_s_accept 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_accept 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_bio.3 b/secure/lib/libcrypto/man/BIO_s_bio.3 index afd3307..f4aa8a1 100644 --- a/secure/lib/libcrypto/man/BIO_s_bio.3 +++ b/secure/lib/libcrypto/man/BIO_s_bio.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_bio 3" -.TH BIO_s_bio 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_bio 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_connect.3 b/secure/lib/libcrypto/man/BIO_s_connect.3 index 8f023d1..e55cd73 100644 --- a/secure/lib/libcrypto/man/BIO_s_connect.3 +++ b/secure/lib/libcrypto/man/BIO_s_connect.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_connect 3" -.TH BIO_s_connect 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_connect 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_fd.3 b/secure/lib/libcrypto/man/BIO_s_fd.3 index 842794d..e710429 100644 --- a/secure/lib/libcrypto/man/BIO_s_fd.3 +++ b/secure/lib/libcrypto/man/BIO_s_fd.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_fd 3" -.TH BIO_s_fd 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_fd 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_file.3 b/secure/lib/libcrypto/man/BIO_s_file.3 index 2dfe5af..fc036dd 100644 --- a/secure/lib/libcrypto/man/BIO_s_file.3 +++ b/secure/lib/libcrypto/man/BIO_s_file.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_file 3" -.TH BIO_s_file 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_file 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_mem.3 b/secure/lib/libcrypto/man/BIO_s_mem.3 index 5fcedf0..c9ec1e3 100644 --- a/secure/lib/libcrypto/man/BIO_s_mem.3 +++ b/secure/lib/libcrypto/man/BIO_s_mem.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_mem 3" -.TH BIO_s_mem 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_mem 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_null.3 b/secure/lib/libcrypto/man/BIO_s_null.3 index 72a3fd7..3f60757 100644 --- a/secure/lib/libcrypto/man/BIO_s_null.3 +++ b/secure/lib/libcrypto/man/BIO_s_null.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_null 3" -.TH BIO_s_null 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_null 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_socket.3 b/secure/lib/libcrypto/man/BIO_s_socket.3 index 4c1248f..1261339 100644 --- a/secure/lib/libcrypto/man/BIO_s_socket.3 +++ b/secure/lib/libcrypto/man/BIO_s_socket.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_socket 3" -.TH BIO_s_socket 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_s_socket 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_set_callback.3 b/secure/lib/libcrypto/man/BIO_set_callback.3 index e73953f..fb85633 100644 --- a/secure/lib/libcrypto/man/BIO_set_callback.3 +++ b/secure/lib/libcrypto/man/BIO_set_callback.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_set_callback 3" -.TH BIO_set_callback 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_set_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_should_retry.3 b/secure/lib/libcrypto/man/BIO_should_retry.3 index 43cc348..22f6049 100644 --- a/secure/lib/libcrypto/man/BIO_should_retry.3 +++ b/secure/lib/libcrypto/man/BIO_should_retry.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_should_retry 3" -.TH BIO_should_retry 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BIO_should_retry 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_BLINDING_new.3 b/secure/lib/libcrypto/man/BN_BLINDING_new.3 index 7353094..a5a4591 100644 --- a/secure/lib/libcrypto/man/BN_BLINDING_new.3 +++ b/secure/lib/libcrypto/man/BN_BLINDING_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_BLINDING_new 3" -.TH BN_BLINDING_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_BLINDING_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_CTX_new.3 b/secure/lib/libcrypto/man/BN_CTX_new.3 index d0873b0..bae185d 100644 --- a/secure/lib/libcrypto/man/BN_CTX_new.3 +++ b/secure/lib/libcrypto/man/BN_CTX_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_CTX_new 3" -.TH BN_CTX_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_CTX_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_CTX_start.3 b/secure/lib/libcrypto/man/BN_CTX_start.3 index 078945a..4eb96a5 100644 --- a/secure/lib/libcrypto/man/BN_CTX_start.3 +++ b/secure/lib/libcrypto/man/BN_CTX_start.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_CTX_start 3" -.TH BN_CTX_start 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_CTX_start 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_add.3 b/secure/lib/libcrypto/man/BN_add.3 index 97eb1d3..7cd7273 100644 --- a/secure/lib/libcrypto/man/BN_add.3 +++ b/secure/lib/libcrypto/man/BN_add.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_add 3" -.TH BN_add 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_add 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_add_word.3 b/secure/lib/libcrypto/man/BN_add_word.3 index 7f2c2b4..486f63e 100644 --- a/secure/lib/libcrypto/man/BN_add_word.3 +++ b/secure/lib/libcrypto/man/BN_add_word.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_add_word 3" -.TH BN_add_word 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_add_word 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_bn2bin.3 b/secure/lib/libcrypto/man/BN_bn2bin.3 index 01f967b..fee9e6d 100644 --- a/secure/lib/libcrypto/man/BN_bn2bin.3 +++ b/secure/lib/libcrypto/man/BN_bn2bin.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_bn2bin 3" -.TH BN_bn2bin 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_bn2bin 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_cmp.3 b/secure/lib/libcrypto/man/BN_cmp.3 index de8f335..484e696 100644 --- a/secure/lib/libcrypto/man/BN_cmp.3 +++ b/secure/lib/libcrypto/man/BN_cmp.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_cmp 3" -.TH BN_cmp 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_cmp 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_copy.3 b/secure/lib/libcrypto/man/BN_copy.3 index 14eb31d..f9cd1c1 100644 --- a/secure/lib/libcrypto/man/BN_copy.3 +++ b/secure/lib/libcrypto/man/BN_copy.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_copy 3" -.TH BN_copy 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_copy 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_generate_prime.3 b/secure/lib/libcrypto/man/BN_generate_prime.3 index 7eea725..18a6d37 100644 --- a/secure/lib/libcrypto/man/BN_generate_prime.3 +++ b/secure/lib/libcrypto/man/BN_generate_prime.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_generate_prime 3" -.TH BN_generate_prime 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_generate_prime 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_mod_inverse.3 b/secure/lib/libcrypto/man/BN_mod_inverse.3 index 0d03735..4a2e642 100644 --- a/secure/lib/libcrypto/man/BN_mod_inverse.3 +++ b/secure/lib/libcrypto/man/BN_mod_inverse.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_mod_inverse 3" -.TH BN_mod_inverse 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_mod_inverse 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 b/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 index 81e884b..90b7d5a 100644 --- a/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 +++ b/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_mod_mul_montgomery 3" -.TH BN_mod_mul_montgomery 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_mod_mul_montgomery 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 b/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 index 93c477d..d846d34 100644 --- a/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 +++ b/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_mod_mul_reciprocal 3" -.TH BN_mod_mul_reciprocal 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_mod_mul_reciprocal 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_new.3 b/secure/lib/libcrypto/man/BN_new.3 index ce78cc4..a6838d7 100644 --- a/secure/lib/libcrypto/man/BN_new.3 +++ b/secure/lib/libcrypto/man/BN_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_new 3" -.TH BN_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_num_bytes.3 b/secure/lib/libcrypto/man/BN_num_bytes.3 index 7378123..e820563 100644 --- a/secure/lib/libcrypto/man/BN_num_bytes.3 +++ b/secure/lib/libcrypto/man/BN_num_bytes.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_num_bytes 3" -.TH BN_num_bytes 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_num_bytes 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_rand.3 b/secure/lib/libcrypto/man/BN_rand.3 index 3ed82ad..7203182 100644 --- a/secure/lib/libcrypto/man/BN_rand.3 +++ b/secure/lib/libcrypto/man/BN_rand.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_rand 3" -.TH BN_rand 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_rand 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_set_bit.3 b/secure/lib/libcrypto/man/BN_set_bit.3 index d873919..a68db1f 100644 --- a/secure/lib/libcrypto/man/BN_set_bit.3 +++ b/secure/lib/libcrypto/man/BN_set_bit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_set_bit 3" -.TH BN_set_bit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_set_bit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_swap.3 b/secure/lib/libcrypto/man/BN_swap.3 index 673f720..eac8113 100644 --- a/secure/lib/libcrypto/man/BN_swap.3 +++ b/secure/lib/libcrypto/man/BN_swap.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_swap 3" -.TH BN_swap 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_swap 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_zero.3 b/secure/lib/libcrypto/man/BN_zero.3 index c96e132..d07fc2f 100644 --- a/secure/lib/libcrypto/man/BN_zero.3 +++ b/secure/lib/libcrypto/man/BN_zero.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_zero 3" -.TH BN_zero 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH BN_zero 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/CONF_modules_free.3 b/secure/lib/libcrypto/man/CONF_modules_free.3 index 1daba20..9fd6d03 100644 --- a/secure/lib/libcrypto/man/CONF_modules_free.3 +++ b/secure/lib/libcrypto/man/CONF_modules_free.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CONF_modules_free 3" -.TH CONF_modules_free 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CONF_modules_free 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/CONF_modules_load_file.3 b/secure/lib/libcrypto/man/CONF_modules_load_file.3 index d77e5fd..b7e6064 100644 --- a/secure/lib/libcrypto/man/CONF_modules_load_file.3 +++ b/secure/lib/libcrypto/man/CONF_modules_load_file.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CONF_modules_load_file 3" -.TH CONF_modules_load_file 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CONF_modules_load_file 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 b/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 index 0d23e32..955b949 100644 --- a/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 +++ b/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CRYPTO_set_ex_data 3" -.TH CRYPTO_set_ex_data 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CRYPTO_set_ex_data 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_generate_key.3 b/secure/lib/libcrypto/man/DH_generate_key.3 index 390c498..cff5300 100644 --- a/secure/lib/libcrypto/man/DH_generate_key.3 +++ b/secure/lib/libcrypto/man/DH_generate_key.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_generate_key 3" -.TH DH_generate_key 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DH_generate_key 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_generate_parameters.3 b/secure/lib/libcrypto/man/DH_generate_parameters.3 index fee07a2..374c05f 100644 --- a/secure/lib/libcrypto/man/DH_generate_parameters.3 +++ b/secure/lib/libcrypto/man/DH_generate_parameters.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_generate_parameters 3" -.TH DH_generate_parameters 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DH_generate_parameters 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_get_ex_new_index.3 b/secure/lib/libcrypto/man/DH_get_ex_new_index.3 index 9f07078..e74c6ce 100644 --- a/secure/lib/libcrypto/man/DH_get_ex_new_index.3 +++ b/secure/lib/libcrypto/man/DH_get_ex_new_index.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_get_ex_new_index 3" -.TH DH_get_ex_new_index 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DH_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_new.3 b/secure/lib/libcrypto/man/DH_new.3 index 3cd7dd4..e169713 100644 --- a/secure/lib/libcrypto/man/DH_new.3 +++ b/secure/lib/libcrypto/man/DH_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_new 3" -.TH DH_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DH_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_set_method.3 b/secure/lib/libcrypto/man/DH_set_method.3 index 08ee367..c5bf32c 100644 --- a/secure/lib/libcrypto/man/DH_set_method.3 +++ b/secure/lib/libcrypto/man/DH_set_method.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_set_method 3" -.TH DH_set_method 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DH_set_method 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_size.3 b/secure/lib/libcrypto/man/DH_size.3 index 48bfc45..5f8c60e 100644 --- a/secure/lib/libcrypto/man/DH_size.3 +++ b/secure/lib/libcrypto/man/DH_size.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_size 3" -.TH DH_size 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DH_size 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_SIG_new.3 b/secure/lib/libcrypto/man/DSA_SIG_new.3 index a488145..4f48912 100644 --- a/secure/lib/libcrypto/man/DSA_SIG_new.3 +++ b/secure/lib/libcrypto/man/DSA_SIG_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_SIG_new 3" -.TH DSA_SIG_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_SIG_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_do_sign.3 b/secure/lib/libcrypto/man/DSA_do_sign.3 index 4a9d3c8..f6da96b 100644 --- a/secure/lib/libcrypto/man/DSA_do_sign.3 +++ b/secure/lib/libcrypto/man/DSA_do_sign.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_do_sign 3" -.TH DSA_do_sign 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_do_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_dup_DH.3 b/secure/lib/libcrypto/man/DSA_dup_DH.3 index fe9e4b5..b13e50ee 100644 --- a/secure/lib/libcrypto/man/DSA_dup_DH.3 +++ b/secure/lib/libcrypto/man/DSA_dup_DH.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_dup_DH 3" -.TH DSA_dup_DH 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_dup_DH 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_generate_key.3 b/secure/lib/libcrypto/man/DSA_generate_key.3 index b251ebd..2777dc8 100644 --- a/secure/lib/libcrypto/man/DSA_generate_key.3 +++ b/secure/lib/libcrypto/man/DSA_generate_key.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_generate_key 3" -.TH DSA_generate_key 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_generate_key 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_generate_parameters.3 b/secure/lib/libcrypto/man/DSA_generate_parameters.3 index 13ee625..e5fcb26 100644 --- a/secure/lib/libcrypto/man/DSA_generate_parameters.3 +++ b/secure/lib/libcrypto/man/DSA_generate_parameters.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_generate_parameters 3" -.TH DSA_generate_parameters 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_generate_parameters 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 b/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 index 3695cea..fd418dd 100644 --- a/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 +++ b/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_get_ex_new_index 3" -.TH DSA_get_ex_new_index 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_new.3 b/secure/lib/libcrypto/man/DSA_new.3 index 80c6d8d..b53c2a4 100644 --- a/secure/lib/libcrypto/man/DSA_new.3 +++ b/secure/lib/libcrypto/man/DSA_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_new 3" -.TH DSA_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_set_method.3 b/secure/lib/libcrypto/man/DSA_set_method.3 index 0c4c6df..9094acd 100644 --- a/secure/lib/libcrypto/man/DSA_set_method.3 +++ b/secure/lib/libcrypto/man/DSA_set_method.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_set_method 3" -.TH DSA_set_method 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_set_method 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_sign.3 b/secure/lib/libcrypto/man/DSA_sign.3 index 1c205b6..5931f9c 100644 --- a/secure/lib/libcrypto/man/DSA_sign.3 +++ b/secure/lib/libcrypto/man/DSA_sign.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_sign 3" -.TH DSA_sign 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_size.3 b/secure/lib/libcrypto/man/DSA_size.3 index d3241da..1aa3962 100644 --- a/secure/lib/libcrypto/man/DSA_size.3 +++ b/secure/lib/libcrypto/man/DSA_size.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_size 3" -.TH DSA_size 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA_size 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_GET_LIB.3 b/secure/lib/libcrypto/man/ERR_GET_LIB.3 index 062f472..694b0e1 100644 --- a/secure/lib/libcrypto/man/ERR_GET_LIB.3 +++ b/secure/lib/libcrypto/man/ERR_GET_LIB.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_GET_LIB 3" -.TH ERR_GET_LIB 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_GET_LIB 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_clear_error.3 b/secure/lib/libcrypto/man/ERR_clear_error.3 index 9b5b424..4b93a2d 100644 --- a/secure/lib/libcrypto/man/ERR_clear_error.3 +++ b/secure/lib/libcrypto/man/ERR_clear_error.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_clear_error 3" -.TH ERR_clear_error 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_clear_error 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_error_string.3 b/secure/lib/libcrypto/man/ERR_error_string.3 index 586e74b..bf66a06 100644 --- a/secure/lib/libcrypto/man/ERR_error_string.3 +++ b/secure/lib/libcrypto/man/ERR_error_string.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_error_string 3" -.TH ERR_error_string 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_error_string 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_get_error.3 b/secure/lib/libcrypto/man/ERR_get_error.3 index 333c21e..b59ee3f 100644 --- a/secure/lib/libcrypto/man/ERR_get_error.3 +++ b/secure/lib/libcrypto/man/ERR_get_error.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_get_error 3" -.TH ERR_get_error 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_get_error 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 b/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 index fc47add..089c5ae 100644 --- a/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 +++ b/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_load_crypto_strings 3" -.TH ERR_load_crypto_strings 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_load_crypto_strings 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_load_strings.3 b/secure/lib/libcrypto/man/ERR_load_strings.3 index b537bd5..47f534b 100644 --- a/secure/lib/libcrypto/man/ERR_load_strings.3 +++ b/secure/lib/libcrypto/man/ERR_load_strings.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_load_strings 3" -.TH ERR_load_strings 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_load_strings 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_print_errors.3 b/secure/lib/libcrypto/man/ERR_print_errors.3 index 6226628..fa7516a 100644 --- a/secure/lib/libcrypto/man/ERR_print_errors.3 +++ b/secure/lib/libcrypto/man/ERR_print_errors.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_print_errors 3" -.TH ERR_print_errors 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_print_errors 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_put_error.3 b/secure/lib/libcrypto/man/ERR_put_error.3 index 9a04492..9c403c9 100644 --- a/secure/lib/libcrypto/man/ERR_put_error.3 +++ b/secure/lib/libcrypto/man/ERR_put_error.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_put_error 3" -.TH ERR_put_error 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_put_error 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_remove_state.3 b/secure/lib/libcrypto/man/ERR_remove_state.3 index 9acf4ef..55e717d 100644 --- a/secure/lib/libcrypto/man/ERR_remove_state.3 +++ b/secure/lib/libcrypto/man/ERR_remove_state.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_remove_state 3" -.TH ERR_remove_state 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_remove_state 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_set_mark.3 b/secure/lib/libcrypto/man/ERR_set_mark.3 index cd1a9e8..72934b8 100644 --- a/secure/lib/libcrypto/man/ERR_set_mark.3 +++ b/secure/lib/libcrypto/man/ERR_set_mark.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_set_mark 3" -.TH ERR_set_mark 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERR_set_mark 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_BytesToKey.3 b/secure/lib/libcrypto/man/EVP_BytesToKey.3 index c844baa..9473bc3 100644 --- a/secure/lib/libcrypto/man/EVP_BytesToKey.3 +++ b/secure/lib/libcrypto/man/EVP_BytesToKey.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_BytesToKey 3" -.TH EVP_BytesToKey 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_BytesToKey 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_DigestInit.3 b/secure/lib/libcrypto/man/EVP_DigestInit.3 index 21376c1..e7c79a4 100644 --- a/secure/lib/libcrypto/man/EVP_DigestInit.3 +++ b/secure/lib/libcrypto/man/EVP_DigestInit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_DigestInit 3" -.TH EVP_DigestInit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_DigestInit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_EncryptInit.3 b/secure/lib/libcrypto/man/EVP_EncryptInit.3 index 8b70c68..15e656a 100644 --- a/secure/lib/libcrypto/man/EVP_EncryptInit.3 +++ b/secure/lib/libcrypto/man/EVP_EncryptInit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_EncryptInit 3" -.TH EVP_EncryptInit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_EncryptInit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_OpenInit.3 b/secure/lib/libcrypto/man/EVP_OpenInit.3 index 7540ef3..0ba61ec 100644 --- a/secure/lib/libcrypto/man/EVP_OpenInit.3 +++ b/secure/lib/libcrypto/man/EVP_OpenInit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_OpenInit 3" -.TH EVP_OpenInit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_OpenInit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_PKEY_new.3 b/secure/lib/libcrypto/man/EVP_PKEY_new.3 index 8b06b98..e8350f4 100644 --- a/secure/lib/libcrypto/man/EVP_PKEY_new.3 +++ b/secure/lib/libcrypto/man/EVP_PKEY_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_PKEY_new 3" -.TH EVP_PKEY_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_PKEY_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 b/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 index f5bfc7f..f9d31f2 100644 --- a/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 +++ b/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_PKEY_set1_RSA 3" -.TH EVP_PKEY_set1_RSA 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_PKEY_set1_RSA 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_SealInit.3 b/secure/lib/libcrypto/man/EVP_SealInit.3 index 89e2b26..1bba814 100644 --- a/secure/lib/libcrypto/man/EVP_SealInit.3 +++ b/secure/lib/libcrypto/man/EVP_SealInit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_SealInit 3" -.TH EVP_SealInit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_SealInit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_SignInit.3 b/secure/lib/libcrypto/man/EVP_SignInit.3 index 8810a98..49ad550 100644 --- a/secure/lib/libcrypto/man/EVP_SignInit.3 +++ b/secure/lib/libcrypto/man/EVP_SignInit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_SignInit 3" -.TH EVP_SignInit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_SignInit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_VerifyInit.3 b/secure/lib/libcrypto/man/EVP_VerifyInit.3 index c8bec9c..a622038 100644 --- a/secure/lib/libcrypto/man/EVP_VerifyInit.3 +++ b/secure/lib/libcrypto/man/EVP_VerifyInit.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_VerifyInit 3" -.TH EVP_VerifyInit 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EVP_VerifyInit 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OBJ_nid2obj.3 b/secure/lib/libcrypto/man/OBJ_nid2obj.3 index 3bfd7e8..cfc733b 100644 --- a/secure/lib/libcrypto/man/OBJ_nid2obj.3 +++ b/secure/lib/libcrypto/man/OBJ_nid2obj.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OBJ_nid2obj 3" -.TH OBJ_nid2obj 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OBJ_nid2obj 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_Applink.3 b/secure/lib/libcrypto/man/OPENSSL_Applink.3 index 19e5847..416d4c3 100644 --- a/secure/lib/libcrypto/man/OPENSSL_Applink.3 +++ b/secure/lib/libcrypto/man/OPENSSL_Applink.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_Applink 3" -.TH OPENSSL_Applink 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OPENSSL_Applink 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 b/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 index dc83d0f..a829260 100644 --- a/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 +++ b/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_VERSION_NUMBER 3" -.TH OPENSSL_VERSION_NUMBER 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OPENSSL_VERSION_NUMBER 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_config.3 b/secure/lib/libcrypto/man/OPENSSL_config.3 index a575c72..87ce97b 100644 --- a/secure/lib/libcrypto/man/OPENSSL_config.3 +++ b/secure/lib/libcrypto/man/OPENSSL_config.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_config 3" -.TH OPENSSL_config 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OPENSSL_config 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 b/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 index a858672..0114c90 100644 --- a/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 +++ b/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_ia32cap 3" -.TH OPENSSL_ia32cap 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OPENSSL_ia32cap 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 b/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 index 8af9b67..2cacde2 100644 --- a/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 +++ b/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_load_builtin_modules 3" -.TH OPENSSL_load_builtin_modules 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OPENSSL_load_builtin_modules 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 b/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 index 619800d..399d2dd 100644 --- a/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 +++ b/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OpenSSL_add_all_algorithms 3" -.TH OpenSSL_add_all_algorithms 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OpenSSL_add_all_algorithms 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS12_create.3 b/secure/lib/libcrypto/man/PKCS12_create.3 index 4e17ec3..8154477 100644 --- a/secure/lib/libcrypto/man/PKCS12_create.3 +++ b/secure/lib/libcrypto/man/PKCS12_create.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS12_create 3" -.TH PKCS12_create 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS12_create 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS12_parse.3 b/secure/lib/libcrypto/man/PKCS12_parse.3 index ed53999..44df001 100644 --- a/secure/lib/libcrypto/man/PKCS12_parse.3 +++ b/secure/lib/libcrypto/man/PKCS12_parse.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS12_parse 3" -.TH PKCS12_parse 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS12_parse 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_decrypt.3 b/secure/lib/libcrypto/man/PKCS7_decrypt.3 index 4cc2f8a..5e81459 100644 --- a/secure/lib/libcrypto/man/PKCS7_decrypt.3 +++ b/secure/lib/libcrypto/man/PKCS7_decrypt.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_decrypt 3" -.TH PKCS7_decrypt 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS7_decrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_encrypt.3 b/secure/lib/libcrypto/man/PKCS7_encrypt.3 index 61022a6..9507930 100644 --- a/secure/lib/libcrypto/man/PKCS7_encrypt.3 +++ b/secure/lib/libcrypto/man/PKCS7_encrypt.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_encrypt 3" -.TH PKCS7_encrypt 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS7_encrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_sign.3 b/secure/lib/libcrypto/man/PKCS7_sign.3 index e9c4021..89a2c17 100644 --- a/secure/lib/libcrypto/man/PKCS7_sign.3 +++ b/secure/lib/libcrypto/man/PKCS7_sign.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_sign 3" -.TH PKCS7_sign 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS7_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_verify.3 b/secure/lib/libcrypto/man/PKCS7_verify.3 index f35cda7..397725f 100644 --- a/secure/lib/libcrypto/man/PKCS7_verify.3 +++ b/secure/lib/libcrypto/man/PKCS7_verify.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_verify 3" -.TH PKCS7_verify 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS7_verify 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_add.3 b/secure/lib/libcrypto/man/RAND_add.3 index 208cecf..23f4d36 100644 --- a/secure/lib/libcrypto/man/RAND_add.3 +++ b/secure/lib/libcrypto/man/RAND_add.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_add 3" -.TH RAND_add 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND_add 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_bytes.3 b/secure/lib/libcrypto/man/RAND_bytes.3 index b97fb38..1da3eb6 100644 --- a/secure/lib/libcrypto/man/RAND_bytes.3 +++ b/secure/lib/libcrypto/man/RAND_bytes.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_bytes 3" -.TH RAND_bytes 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND_bytes 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_cleanup.3 b/secure/lib/libcrypto/man/RAND_cleanup.3 index 4785cd4..13f245f 100644 --- a/secure/lib/libcrypto/man/RAND_cleanup.3 +++ b/secure/lib/libcrypto/man/RAND_cleanup.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_cleanup 3" -.TH RAND_cleanup 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND_cleanup 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_egd.3 b/secure/lib/libcrypto/man/RAND_egd.3 index b7304ba..58784a9 100644 --- a/secure/lib/libcrypto/man/RAND_egd.3 +++ b/secure/lib/libcrypto/man/RAND_egd.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_egd 3" -.TH RAND_egd 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND_egd 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_load_file.3 b/secure/lib/libcrypto/man/RAND_load_file.3 index a6f82b7..b0edd2b 100644 --- a/secure/lib/libcrypto/man/RAND_load_file.3 +++ b/secure/lib/libcrypto/man/RAND_load_file.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_load_file 3" -.TH RAND_load_file 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND_load_file 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_set_rand_method.3 b/secure/lib/libcrypto/man/RAND_set_rand_method.3 index 19e509e..722925d 100644 --- a/secure/lib/libcrypto/man/RAND_set_rand_method.3 +++ b/secure/lib/libcrypto/man/RAND_set_rand_method.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_set_rand_method 3" -.TH RAND_set_rand_method 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND_set_rand_method 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_blinding_on.3 b/secure/lib/libcrypto/man/RSA_blinding_on.3 index 0c269dd..61aabbf 100644 --- a/secure/lib/libcrypto/man/RSA_blinding_on.3 +++ b/secure/lib/libcrypto/man/RSA_blinding_on.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_blinding_on 3" -.TH RSA_blinding_on 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_blinding_on 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_check_key.3 b/secure/lib/libcrypto/man/RSA_check_key.3 index 33c586f..4fba01d 100644 --- a/secure/lib/libcrypto/man/RSA_check_key.3 +++ b/secure/lib/libcrypto/man/RSA_check_key.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_check_key 3" -.TH RSA_check_key 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_check_key 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_generate_key.3 b/secure/lib/libcrypto/man/RSA_generate_key.3 index 026f87d4..d71fe32 100644 --- a/secure/lib/libcrypto/man/RSA_generate_key.3 +++ b/secure/lib/libcrypto/man/RSA_generate_key.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_generate_key 3" -.TH RSA_generate_key 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_generate_key 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 b/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 index efea043..f0ea95a 100644 --- a/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 +++ b/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_get_ex_new_index 3" -.TH RSA_get_ex_new_index 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_new.3 b/secure/lib/libcrypto/man/RSA_new.3 index de3e2eb..331128e 100644 --- a/secure/lib/libcrypto/man/RSA_new.3 +++ b/secure/lib/libcrypto/man/RSA_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_new 3" -.TH RSA_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 b/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 index 7925ab2..86fc5dd 100644 --- a/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 +++ b/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_padding_add_PKCS1_type_1 3" -.TH RSA_padding_add_PKCS1_type_1 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_padding_add_PKCS1_type_1 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_print.3 b/secure/lib/libcrypto/man/RSA_print.3 index e6f0a2f..5337147 100644 --- a/secure/lib/libcrypto/man/RSA_print.3 +++ b/secure/lib/libcrypto/man/RSA_print.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_print 3" -.TH RSA_print 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_print 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_private_encrypt.3 b/secure/lib/libcrypto/man/RSA_private_encrypt.3 index b657f51..94471c6 100644 --- a/secure/lib/libcrypto/man/RSA_private_encrypt.3 +++ b/secure/lib/libcrypto/man/RSA_private_encrypt.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_private_encrypt 3" -.TH RSA_private_encrypt 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_private_encrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_public_encrypt.3 b/secure/lib/libcrypto/man/RSA_public_encrypt.3 index 40e61ca..5edece8 100644 --- a/secure/lib/libcrypto/man/RSA_public_encrypt.3 +++ b/secure/lib/libcrypto/man/RSA_public_encrypt.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_public_encrypt 3" -.TH RSA_public_encrypt 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_public_encrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_set_method.3 b/secure/lib/libcrypto/man/RSA_set_method.3 index fa5e4a4..e746746 100644 --- a/secure/lib/libcrypto/man/RSA_set_method.3 +++ b/secure/lib/libcrypto/man/RSA_set_method.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_set_method 3" -.TH RSA_set_method 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_set_method 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_sign.3 b/secure/lib/libcrypto/man/RSA_sign.3 index 212ab26..fc7f12a 100644 --- a/secure/lib/libcrypto/man/RSA_sign.3 +++ b/secure/lib/libcrypto/man/RSA_sign.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_sign 3" -.TH RSA_sign 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 b/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 index 21b12ad..feb01c7 100644 --- a/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 +++ b/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_sign_ASN1_OCTET_STRING 3" -.TH RSA_sign_ASN1_OCTET_STRING 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_sign_ASN1_OCTET_STRING 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_size.3 b/secure/lib/libcrypto/man/RSA_size.3 index 0d161a8..ab5fcdb 100644 --- a/secure/lib/libcrypto/man/RSA_size.3 +++ b/secure/lib/libcrypto/man/RSA_size.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_size 3" -.TH RSA_size 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA_size 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 b/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 index 1b18c61..530f16e 100644 --- a/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 +++ b/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SMIME_read_PKCS7 3" -.TH SMIME_read_PKCS7 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SMIME_read_PKCS7 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 b/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 index b583498..9f29d92 100644 --- a/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 +++ b/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SMIME_write_PKCS7 3" -.TH SMIME_write_PKCS7 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SMIME_write_PKCS7 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 b/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 index 998f858..0aaaa10 100644 --- a/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 +++ b/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_ENTRY_get_object 3" -.TH X509_NAME_ENTRY_get_object 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509_NAME_ENTRY_get_object 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 b/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 index afc350f..db94069 100644 --- a/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 +++ b/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_add_entry_by_txt 3" -.TH X509_NAME_add_entry_by_txt 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509_NAME_add_entry_by_txt 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 b/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 index 49d9b7f..2e32476 100644 --- a/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 +++ b/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_get_index_by_NID 3" -.TH X509_NAME_get_index_by_NID 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509_NAME_get_index_by_NID 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_print_ex.3 b/secure/lib/libcrypto/man/X509_NAME_print_ex.3 index 3f905ec..0e4f215 100644 --- a/secure/lib/libcrypto/man/X509_NAME_print_ex.3 +++ b/secure/lib/libcrypto/man/X509_NAME_print_ex.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_print_ex 3" -.TH X509_NAME_print_ex 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509_NAME_print_ex 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_new.3 b/secure/lib/libcrypto/man/X509_new.3 index d1b4dc8..72cf6f9 100644 --- a/secure/lib/libcrypto/man/X509_new.3 +++ b/secure/lib/libcrypto/man/X509_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_new 3" -.TH X509_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/bio.3 b/secure/lib/libcrypto/man/bio.3 index a3bf79e..a43fa95 100644 --- a/secure/lib/libcrypto/man/bio.3 +++ b/secure/lib/libcrypto/man/bio.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "bio 3" -.TH bio 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH bio 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/blowfish.3 b/secure/lib/libcrypto/man/blowfish.3 index df506af..8552647 100644 --- a/secure/lib/libcrypto/man/blowfish.3 +++ b/secure/lib/libcrypto/man/blowfish.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "blowfish 3" -.TH blowfish 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH blowfish 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/bn.3 b/secure/lib/libcrypto/man/bn.3 index bd217c8..a22f61f 100644 --- a/secure/lib/libcrypto/man/bn.3 +++ b/secure/lib/libcrypto/man/bn.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "bn 3" -.TH bn 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH bn 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/bn_internal.3 b/secure/lib/libcrypto/man/bn_internal.3 index b8aeb4f..9646e4a 100644 --- a/secure/lib/libcrypto/man/bn_internal.3 +++ b/secure/lib/libcrypto/man/bn_internal.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "bn_internal 3" -.TH bn_internal 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH bn_internal 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/buffer.3 b/secure/lib/libcrypto/man/buffer.3 index 1fb8172..c468cc3 100644 --- a/secure/lib/libcrypto/man/buffer.3 +++ b/secure/lib/libcrypto/man/buffer.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "buffer 3" -.TH buffer 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH buffer 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/crypto.3 b/secure/lib/libcrypto/man/crypto.3 index e13f9d7..8175f2f 100644 --- a/secure/lib/libcrypto/man/crypto.3 +++ b/secure/lib/libcrypto/man/crypto.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "crypto 3" -.TH crypto 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH crypto 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 b/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 index b2548ab..68de02b 100644 --- a/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 +++ b/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_ASN1_OBJECT 3" -.TH d2i_ASN1_OBJECT 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_ASN1_OBJECT 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_DHparams.3 b/secure/lib/libcrypto/man/d2i_DHparams.3 index d77b318..0d8d30f 100644 --- a/secure/lib/libcrypto/man/d2i_DHparams.3 +++ b/secure/lib/libcrypto/man/d2i_DHparams.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_DHparams 3" -.TH d2i_DHparams 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_DHparams 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 b/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 index a00c837..69e8d7e 100644 --- a/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 +++ b/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_DSAPublicKey 3" -.TH d2i_DSAPublicKey 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_DSAPublicKey 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 b/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 index b65a1ed..e658a3e 100644 --- a/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 +++ b/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_PKCS8PrivateKey 3" -.TH d2i_PKCS8PrivateKey 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_PKCS8PrivateKey 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 b/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 index fccaa2b..64f4414 100644 --- a/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 +++ b/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_RSAPublicKey 3" -.TH d2i_RSAPublicKey 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_RSAPublicKey 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509.3 b/secure/lib/libcrypto/man/d2i_X509.3 index e98e687..f0580f1 100644 --- a/secure/lib/libcrypto/man/d2i_X509.3 +++ b/secure/lib/libcrypto/man/d2i_X509.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509 3" -.TH d2i_X509 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_X509 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 b/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 index d12a8c1..4c4e298 100644 --- a/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 +++ b/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_ALGOR 3" -.TH d2i_X509_ALGOR 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_X509_ALGOR 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_CRL.3 b/secure/lib/libcrypto/man/d2i_X509_CRL.3 index dc06175..8b4de84 100644 --- a/secure/lib/libcrypto/man/d2i_X509_CRL.3 +++ b/secure/lib/libcrypto/man/d2i_X509_CRL.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_CRL 3" -.TH d2i_X509_CRL 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_X509_CRL 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_NAME.3 b/secure/lib/libcrypto/man/d2i_X509_NAME.3 index 954eed5..074c144 100644 --- a/secure/lib/libcrypto/man/d2i_X509_NAME.3 +++ b/secure/lib/libcrypto/man/d2i_X509_NAME.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_NAME 3" -.TH d2i_X509_NAME 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_X509_NAME 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_REQ.3 b/secure/lib/libcrypto/man/d2i_X509_REQ.3 index 5f7c636..8cffc57 100644 --- a/secure/lib/libcrypto/man/d2i_X509_REQ.3 +++ b/secure/lib/libcrypto/man/d2i_X509_REQ.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_REQ 3" -.TH d2i_X509_REQ 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_X509_REQ 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_SIG.3 b/secure/lib/libcrypto/man/d2i_X509_SIG.3 index 22e3d8a..f7e20b5 100644 --- a/secure/lib/libcrypto/man/d2i_X509_SIG.3 +++ b/secure/lib/libcrypto/man/d2i_X509_SIG.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_SIG 3" -.TH d2i_X509_SIG 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_X509_SIG 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/des.3 b/secure/lib/libcrypto/man/des.3 index e7b72b3..510fd18 100644 --- a/secure/lib/libcrypto/man/des.3 +++ b/secure/lib/libcrypto/man/des.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "des 3" -.TH des 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH des 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/dh.3 b/secure/lib/libcrypto/man/dh.3 index bdd24a9..19bc676 100644 --- a/secure/lib/libcrypto/man/dh.3 +++ b/secure/lib/libcrypto/man/dh.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "dh 3" -.TH dh 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH dh 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/dsa.3 b/secure/lib/libcrypto/man/dsa.3 index 997d635..80259da 100644 --- a/secure/lib/libcrypto/man/dsa.3 +++ b/secure/lib/libcrypto/man/dsa.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "dsa 3" -.TH dsa 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH dsa 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ecdsa.3 b/secure/lib/libcrypto/man/ecdsa.3 index e0c1eb2..d048a87 100644 --- a/secure/lib/libcrypto/man/ecdsa.3 +++ b/secure/lib/libcrypto/man/ecdsa.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ecdsa 3" -.TH ecdsa 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ecdsa 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/engine.3 b/secure/lib/libcrypto/man/engine.3 index 3c22397..e9ce280 100644 --- a/secure/lib/libcrypto/man/engine.3 +++ b/secure/lib/libcrypto/man/engine.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "engine 3" -.TH engine 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH engine 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/err.3 b/secure/lib/libcrypto/man/err.3 index 77b1130..5e2fc04 100644 --- a/secure/lib/libcrypto/man/err.3 +++ b/secure/lib/libcrypto/man/err.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "err 3" -.TH err 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH err 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/evp.3 b/secure/lib/libcrypto/man/evp.3 index 758cc14..d7a40f5 100644 --- a/secure/lib/libcrypto/man/evp.3 +++ b/secure/lib/libcrypto/man/evp.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "evp 3" -.TH evp 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH evp 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/hmac.3 b/secure/lib/libcrypto/man/hmac.3 index f6eb5c6..7b90627 100644 --- a/secure/lib/libcrypto/man/hmac.3 +++ b/secure/lib/libcrypto/man/hmac.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "hmac 3" -.TH hmac 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH hmac 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/lh_stats.3 b/secure/lib/libcrypto/man/lh_stats.3 index ddf5ff3..aeefa31 100644 --- a/secure/lib/libcrypto/man/lh_stats.3 +++ b/secure/lib/libcrypto/man/lh_stats.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "lh_stats 3" -.TH lh_stats 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH lh_stats 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/lhash.3 b/secure/lib/libcrypto/man/lhash.3 index fd02624..bec634f 100644 --- a/secure/lib/libcrypto/man/lhash.3 +++ b/secure/lib/libcrypto/man/lhash.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "lhash 3" -.TH lhash 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH lhash 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/md5.3 b/secure/lib/libcrypto/man/md5.3 index e91c877..c80bcef 100644 --- a/secure/lib/libcrypto/man/md5.3 +++ b/secure/lib/libcrypto/man/md5.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "md5 3" -.TH md5 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH md5 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/mdc2.3 b/secure/lib/libcrypto/man/mdc2.3 index 8d6449d..13f03fd 100644 --- a/secure/lib/libcrypto/man/mdc2.3 +++ b/secure/lib/libcrypto/man/mdc2.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "mdc2 3" -.TH mdc2 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH mdc2 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/pem.3 b/secure/lib/libcrypto/man/pem.3 index 9eea580..470a74f 100644 --- a/secure/lib/libcrypto/man/pem.3 +++ b/secure/lib/libcrypto/man/pem.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "pem 3" -.TH pem 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH pem 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/rand.3 b/secure/lib/libcrypto/man/rand.3 index 63ec651..c5f654d 100644 --- a/secure/lib/libcrypto/man/rand.3 +++ b/secure/lib/libcrypto/man/rand.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "rand 3" -.TH rand 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH rand 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/rc4.3 b/secure/lib/libcrypto/man/rc4.3 index 04a4d9a..fbcbf3c 100644 --- a/secure/lib/libcrypto/man/rc4.3 +++ b/secure/lib/libcrypto/man/rc4.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "rc4 3" -.TH rc4 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH rc4 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ripemd.3 b/secure/lib/libcrypto/man/ripemd.3 index d1b5c62..abde3f8 100644 --- a/secure/lib/libcrypto/man/ripemd.3 +++ b/secure/lib/libcrypto/man/ripemd.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ripemd 3" -.TH ripemd 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ripemd 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/rsa.3 b/secure/lib/libcrypto/man/rsa.3 index c0e4304..6bc5672 100644 --- a/secure/lib/libcrypto/man/rsa.3 +++ b/secure/lib/libcrypto/man/rsa.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "rsa 3" -.TH rsa 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH rsa 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/sha.3 b/secure/lib/libcrypto/man/sha.3 index 2494f6b..b9120fa 100644 --- a/secure/lib/libcrypto/man/sha.3 +++ b/secure/lib/libcrypto/man/sha.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "sha 3" -.TH sha 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH sha 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/threads.3 b/secure/lib/libcrypto/man/threads.3 index 512d8fe..5907668 100644 --- a/secure/lib/libcrypto/man/threads.3 +++ b/secure/lib/libcrypto/man/threads.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "threads 3" -.TH threads 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH threads 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ui.3 b/secure/lib/libcrypto/man/ui.3 index af5ecfd..a009b9e 100644 --- a/secure/lib/libcrypto/man/ui.3 +++ b/secure/lib/libcrypto/man/ui.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ui 3" -.TH ui 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ui 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ui_compat.3 b/secure/lib/libcrypto/man/ui_compat.3 index e172642..5251803 100644 --- a/secure/lib/libcrypto/man/ui_compat.3 +++ b/secure/lib/libcrypto/man/ui_compat.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ui_compat 3" -.TH ui_compat 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ui_compat 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/x509.3 b/secure/lib/libcrypto/man/x509.3 index e4a41c5..fc20561 100644 --- a/secure/lib/libcrypto/man/x509.3 +++ b/secure/lib/libcrypto/man/x509.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "x509 3" -.TH x509 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH x509 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CIPHER_get_name.3 b/secure/lib/libssl/man/SSL_CIPHER_get_name.3 index 117da98..0a28e0a 100644 --- a/secure/lib/libssl/man/SSL_CIPHER_get_name.3 +++ b/secure/lib/libssl/man/SSL_CIPHER_get_name.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CIPHER_get_name 3" -.TH SSL_CIPHER_get_name 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CIPHER_get_name 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 b/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 index 978a085..2039b1c 100644 --- a/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 +++ b/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_COMP_add_compression_method 3" -.TH SSL_COMP_add_compression_method 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_COMP_add_compression_method 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 b/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 index d57a48b..5c09f4e 100644 --- a/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 +++ b/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_add_extra_chain_cert 3" -.TH SSL_CTX_add_extra_chain_cert 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_add_extra_chain_cert 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_add_session.3 b/secure/lib/libssl/man/SSL_CTX_add_session.3 index 3efbd2f..e74d1c9 100644 --- a/secure/lib/libssl/man/SSL_CTX_add_session.3 +++ b/secure/lib/libssl/man/SSL_CTX_add_session.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_add_session 3" -.TH SSL_CTX_add_session 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_add_session 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_ctrl.3 b/secure/lib/libssl/man/SSL_CTX_ctrl.3 index 5b5555a..5fc2c53 100644 --- a/secure/lib/libssl/man/SSL_CTX_ctrl.3 +++ b/secure/lib/libssl/man/SSL_CTX_ctrl.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_ctrl 3" -.TH SSL_CTX_ctrl 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_ctrl 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 b/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 index f0dba17..e1505be 100644 --- a/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 +++ b/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_flush_sessions 3" -.TH SSL_CTX_flush_sessions 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_flush_sessions 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_free.3 b/secure/lib/libssl/man/SSL_CTX_free.3 index 3e54cb2..2a19b23 100644 --- a/secure/lib/libssl/man/SSL_CTX_free.3 +++ b/secure/lib/libssl/man/SSL_CTX_free.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_free 3" -.TH SSL_CTX_free 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_free 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 b/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 index fd00dbb..45e37ad 100644 --- a/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 +++ b/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_get_ex_new_index 3" -.TH SSL_CTX_get_ex_new_index 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 b/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 index d72d30a..1825011 100644 --- a/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 +++ b/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_get_verify_mode 3" -.TH SSL_CTX_get_verify_mode 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_get_verify_mode 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 b/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 index 79b4db7..9aecb8f 100644 --- a/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 +++ b/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_load_verify_locations 3" -.TH SSL_CTX_load_verify_locations 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_load_verify_locations 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_new.3 b/secure/lib/libssl/man/SSL_CTX_new.3 index 7b54348..c10d335 100644 --- a/secure/lib/libssl/man/SSL_CTX_new.3 +++ b/secure/lib/libssl/man/SSL_CTX_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_new 3" -.TH SSL_CTX_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sess_number.3 b/secure/lib/libssl/man/SSL_CTX_sess_number.3 index 5937c78..45ca9f6 100644 --- a/secure/lib/libssl/man/SSL_CTX_sess_number.3 +++ b/secure/lib/libssl/man/SSL_CTX_sess_number.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sess_number 3" -.TH SSL_CTX_sess_number 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_sess_number 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 b/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 index 6956b71..e9cfa96 100644 --- a/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 +++ b/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sess_set_cache_size 3" -.TH SSL_CTX_sess_set_cache_size 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_sess_set_cache_size 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 b/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 index b356475..5b12c7e 100644 --- a/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 +++ b/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sess_set_get_cb 3" -.TH SSL_CTX_sess_set_get_cb 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_sess_set_get_cb 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sessions.3 b/secure/lib/libssl/man/SSL_CTX_sessions.3 index d7eb624..b8f4666 100644 --- a/secure/lib/libssl/man/SSL_CTX_sessions.3 +++ b/secure/lib/libssl/man/SSL_CTX_sessions.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sessions 3" -.TH SSL_CTX_sessions 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_sessions 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 b/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 index 984f9c7..f53d4bc 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_cert_store 3" -.TH SSL_CTX_set_cert_store 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_cert_store 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 index 8e668c5..57d3f90 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_cert_verify_callback 3" -.TH SSL_CTX_set_cert_verify_callback 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_cert_verify_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 b/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 index 4ad0c22..c6e1de2 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_cipher_list 3" -.TH SSL_CTX_set_cipher_list 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_cipher_list 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 b/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 index 323bbce..6240f79 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_client_CA_list 3" -.TH SSL_CTX_set_client_CA_list 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_client_CA_list 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 b/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 index d0cc2a5..b5df457 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_client_cert_cb 3" -.TH SSL_CTX_set_client_cert_cb 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_client_cert_cb 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 b/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 index 8be19f2..5dc40f5 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_default_passwd_cb 3" -.TH SSL_CTX_set_default_passwd_cb 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_default_passwd_cb 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 b/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 index 8452180..c57f634 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_generate_session_id 3" -.TH SSL_CTX_set_generate_session_id 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_generate_session_id 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 index 62f601e..f01f8e3 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_info_callback 3" -.TH SSL_CTX_set_info_callback 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_info_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 b/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 index 06b8813..d9d5762 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_max_cert_list 3" -.TH SSL_CTX_set_max_cert_list 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_max_cert_list 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_mode.3 b/secure/lib/libssl/man/SSL_CTX_set_mode.3 index feedc14..5418b96 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_mode.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_mode.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_mode 3" -.TH SSL_CTX_set_mode 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_mode 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 index d203f28..1ef26ba 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_msg_callback 3" -.TH SSL_CTX_set_msg_callback 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_msg_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_options.3 b/secure/lib/libssl/man/SSL_CTX_set_options.3 index a9de479..b2e2cb4 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_options.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_options.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_options 3" -.TH SSL_CTX_set_options 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_options 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -200,18 +200,7 @@ when operating in SSLv2/v3 compatibility mode, but as mentioned above, this breaks this server so 16 bytes is the way to go. .IP "\s-1SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG\s0" 4 .IX Item "SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG" -ssl3.netscape.com:443, first a connection is established with \s-1RC4\-MD5\s0. -If it is then resumed, we end up using \s-1DES\-CBC3\-SHA\s0. It should be -\&\s-1RC4\-MD5\s0 according to 7.6.1.3, 'cipher_suite'. -.Sp -Netscape\-Enterprise/2.01 (https://merchant.netscape.com) has this bug. -It only really shows up when connecting via SSLv2/v3 then reconnecting -via SSLv3. The cipher list changes.... -.Sp -\&\s-1NEW\s0 \s-1INFORMATION\s0. Try connecting with a cipher list of just -\&\s-1DES\-CBC\-SHA:RC4\-MD5\s0. For some weird reason, each new connection uses -\&\s-1RC4\-MD5\s0, but a re-connect tries to use DES-CBC-SHA. So netscape, when -doing a re-connect, always takes the first cipher in the cipher list. +As of OpenSSL 0.9.8q and 1.0.0c, this option has no effect. .IP "\s-1SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG\s0" 4 .IX Item "SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG" \&... diff --git a/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 b/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 index 0696a6a..c60e048 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_quiet_shutdown 3" -.TH SSL_CTX_set_quiet_shutdown 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_quiet_shutdown 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 b/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 index a9eeafb..37dfbb0 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_session_cache_mode 3" -.TH SSL_CTX_set_session_cache_mode 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_session_cache_mode 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 b/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 index 1d5cfe0..20348ff 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_session_id_context 3" -.TH SSL_CTX_set_session_id_context 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_session_id_context 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 b/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 index 642092d..e716731 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_ssl_version 3" -.TH SSL_CTX_set_ssl_version 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_ssl_version 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_timeout.3 b/secure/lib/libssl/man/SSL_CTX_set_timeout.3 index bb2cd32..2144d16 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_timeout.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_timeout.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_timeout 3" -.TH SSL_CTX_set_timeout 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_timeout 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 index c7c029c..e11f10b 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_tmp_dh_callback 3" -.TH SSL_CTX_set_tmp_dh_callback 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_tmp_dh_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 index c7d7051..6a1fd71 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_tmp_rsa_callback 3" -.TH SSL_CTX_set_tmp_rsa_callback 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_tmp_rsa_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_verify.3 b/secure/lib/libssl/man/SSL_CTX_set_verify.3 index 7493237..1971e21 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_verify.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_verify.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_verify 3" -.TH SSL_CTX_set_verify 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_set_verify 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_use_certificate.3 b/secure/lib/libssl/man/SSL_CTX_use_certificate.3 index a3a90d7..358dd6c 100644 --- a/secure/lib/libssl/man/SSL_CTX_use_certificate.3 +++ b/secure/lib/libssl/man/SSL_CTX_use_certificate.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_use_certificate 3" -.TH SSL_CTX_use_certificate 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_CTX_use_certificate 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_SESSION_free.3 b/secure/lib/libssl/man/SSL_SESSION_free.3 index f5c1864..64d9b84 100644 --- a/secure/lib/libssl/man/SSL_SESSION_free.3 +++ b/secure/lib/libssl/man/SSL_SESSION_free.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_SESSION_free 3" -.TH SSL_SESSION_free 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_SESSION_free 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 b/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 index a362255..553e43c 100644 --- a/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 +++ b/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_SESSION_get_ex_new_index 3" -.TH SSL_SESSION_get_ex_new_index 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_SESSION_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_SESSION_get_time.3 b/secure/lib/libssl/man/SSL_SESSION_get_time.3 index cefd01a..bdbbb7a 100644 --- a/secure/lib/libssl/man/SSL_SESSION_get_time.3 +++ b/secure/lib/libssl/man/SSL_SESSION_get_time.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_SESSION_get_time 3" -.TH SSL_SESSION_get_time 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_SESSION_get_time 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_accept.3 b/secure/lib/libssl/man/SSL_accept.3 index 29f5647..0c3a6d5 100644 --- a/secure/lib/libssl/man/SSL_accept.3 +++ b/secure/lib/libssl/man/SSL_accept.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_accept 3" -.TH SSL_accept 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_accept 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_alert_type_string.3 b/secure/lib/libssl/man/SSL_alert_type_string.3 index 125ae01..2735e4b 100644 --- a/secure/lib/libssl/man/SSL_alert_type_string.3 +++ b/secure/lib/libssl/man/SSL_alert_type_string.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_alert_type_string 3" -.TH SSL_alert_type_string 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_alert_type_string 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_clear.3 b/secure/lib/libssl/man/SSL_clear.3 index 38d2343..25bca22 100644 --- a/secure/lib/libssl/man/SSL_clear.3 +++ b/secure/lib/libssl/man/SSL_clear.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_clear 3" -.TH SSL_clear 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_clear 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_connect.3 b/secure/lib/libssl/man/SSL_connect.3 index 800cd58..a51b65c 100644 --- a/secure/lib/libssl/man/SSL_connect.3 +++ b/secure/lib/libssl/man/SSL_connect.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_connect 3" -.TH SSL_connect 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_connect 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_do_handshake.3 b/secure/lib/libssl/man/SSL_do_handshake.3 index 95581d3..664c22f 100644 --- a/secure/lib/libssl/man/SSL_do_handshake.3 +++ b/secure/lib/libssl/man/SSL_do_handshake.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_do_handshake 3" -.TH SSL_do_handshake 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_do_handshake 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_free.3 b/secure/lib/libssl/man/SSL_free.3 index 89ea8de..d035365 100644 --- a/secure/lib/libssl/man/SSL_free.3 +++ b/secure/lib/libssl/man/SSL_free.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_free 3" -.TH SSL_free 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_free 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_SSL_CTX.3 b/secure/lib/libssl/man/SSL_get_SSL_CTX.3 index dfba4a2..5f063e1 100644 --- a/secure/lib/libssl/man/SSL_get_SSL_CTX.3 +++ b/secure/lib/libssl/man/SSL_get_SSL_CTX.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_SSL_CTX 3" -.TH SSL_get_SSL_CTX 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_SSL_CTX 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_ciphers.3 b/secure/lib/libssl/man/SSL_get_ciphers.3 index 3635e2e..56ea6e8 100644 --- a/secure/lib/libssl/man/SSL_get_ciphers.3 +++ b/secure/lib/libssl/man/SSL_get_ciphers.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_ciphers 3" -.TH SSL_get_ciphers 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_ciphers 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_client_CA_list.3 b/secure/lib/libssl/man/SSL_get_client_CA_list.3 index 7088e60..3ae3739 100644 --- a/secure/lib/libssl/man/SSL_get_client_CA_list.3 +++ b/secure/lib/libssl/man/SSL_get_client_CA_list.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_client_CA_list 3" -.TH SSL_get_client_CA_list 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_client_CA_list 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_current_cipher.3 b/secure/lib/libssl/man/SSL_get_current_cipher.3 index 1854b4a..d08981e 100644 --- a/secure/lib/libssl/man/SSL_get_current_cipher.3 +++ b/secure/lib/libssl/man/SSL_get_current_cipher.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_current_cipher 3" -.TH SSL_get_current_cipher 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_current_cipher 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_default_timeout.3 b/secure/lib/libssl/man/SSL_get_default_timeout.3 index 3e81a0d..4c1d965 100644 --- a/secure/lib/libssl/man/SSL_get_default_timeout.3 +++ b/secure/lib/libssl/man/SSL_get_default_timeout.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_default_timeout 3" -.TH SSL_get_default_timeout 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_default_timeout 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_error.3 b/secure/lib/libssl/man/SSL_get_error.3 index be41260..1289682 100644 --- a/secure/lib/libssl/man/SSL_get_error.3 +++ b/secure/lib/libssl/man/SSL_get_error.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_error 3" -.TH SSL_get_error 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_error 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 b/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 index e98fa75..a81f4de 100644 --- a/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 +++ b/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_ex_data_X509_STORE_CTX_idx 3" -.TH SSL_get_ex_data_X509_STORE_CTX_idx 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_ex_data_X509_STORE_CTX_idx 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_ex_new_index.3 b/secure/lib/libssl/man/SSL_get_ex_new_index.3 index 1fde9b3..4896c63 100644 --- a/secure/lib/libssl/man/SSL_get_ex_new_index.3 +++ b/secure/lib/libssl/man/SSL_get_ex_new_index.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_ex_new_index 3" -.TH SSL_get_ex_new_index 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_fd.3 b/secure/lib/libssl/man/SSL_get_fd.3 index 9e83cb1..ac7f7ea 100644 --- a/secure/lib/libssl/man/SSL_get_fd.3 +++ b/secure/lib/libssl/man/SSL_get_fd.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_fd 3" -.TH SSL_get_fd 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_fd 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 b/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 index bb3cdd5..8ac8a69 100644 --- a/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 +++ b/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_peer_cert_chain 3" -.TH SSL_get_peer_cert_chain 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_peer_cert_chain 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_peer_certificate.3 b/secure/lib/libssl/man/SSL_get_peer_certificate.3 index 9a505a9..26a51d8 100644 --- a/secure/lib/libssl/man/SSL_get_peer_certificate.3 +++ b/secure/lib/libssl/man/SSL_get_peer_certificate.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_peer_certificate 3" -.TH SSL_get_peer_certificate 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_peer_certificate 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_rbio.3 b/secure/lib/libssl/man/SSL_get_rbio.3 index 9ed5c51..630a26e 100644 --- a/secure/lib/libssl/man/SSL_get_rbio.3 +++ b/secure/lib/libssl/man/SSL_get_rbio.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_rbio 3" -.TH SSL_get_rbio 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_rbio 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_session.3 b/secure/lib/libssl/man/SSL_get_session.3 index 5864145..3e4d913 100644 --- a/secure/lib/libssl/man/SSL_get_session.3 +++ b/secure/lib/libssl/man/SSL_get_session.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_session 3" -.TH SSL_get_session 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_session 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_verify_result.3 b/secure/lib/libssl/man/SSL_get_verify_result.3 index 709d9d2..5ce0d4c 100644 --- a/secure/lib/libssl/man/SSL_get_verify_result.3 +++ b/secure/lib/libssl/man/SSL_get_verify_result.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_verify_result 3" -.TH SSL_get_verify_result 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_verify_result 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_version.3 b/secure/lib/libssl/man/SSL_get_version.3 index 04fc844..b52d556 100644 --- a/secure/lib/libssl/man/SSL_get_version.3 +++ b/secure/lib/libssl/man/SSL_get_version.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_version 3" -.TH SSL_get_version 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_get_version 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_library_init.3 b/secure/lib/libssl/man/SSL_library_init.3 index e870dd2..abed958 100644 --- a/secure/lib/libssl/man/SSL_library_init.3 +++ b/secure/lib/libssl/man/SSL_library_init.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_library_init 3" -.TH SSL_library_init 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_library_init 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_load_client_CA_file.3 b/secure/lib/libssl/man/SSL_load_client_CA_file.3 index 1f7ec03..154b3e7 100644 --- a/secure/lib/libssl/man/SSL_load_client_CA_file.3 +++ b/secure/lib/libssl/man/SSL_load_client_CA_file.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_load_client_CA_file 3" -.TH SSL_load_client_CA_file 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_load_client_CA_file 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_new.3 b/secure/lib/libssl/man/SSL_new.3 index 74f2c88..b20687d 100644 --- a/secure/lib/libssl/man/SSL_new.3 +++ b/secure/lib/libssl/man/SSL_new.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_new 3" -.TH SSL_new 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_new 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_pending.3 b/secure/lib/libssl/man/SSL_pending.3 index 44658b6..fb98f0e 100644 --- a/secure/lib/libssl/man/SSL_pending.3 +++ b/secure/lib/libssl/man/SSL_pending.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_pending 3" -.TH SSL_pending 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_pending 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_read.3 b/secure/lib/libssl/man/SSL_read.3 index 3593bb3..69383c5 100644 --- a/secure/lib/libssl/man/SSL_read.3 +++ b/secure/lib/libssl/man/SSL_read.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_read 3" -.TH SSL_read 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_read 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_rstate_string.3 b/secure/lib/libssl/man/SSL_rstate_string.3 index a166d95..694b38f 100644 --- a/secure/lib/libssl/man/SSL_rstate_string.3 +++ b/secure/lib/libssl/man/SSL_rstate_string.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_rstate_string 3" -.TH SSL_rstate_string 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_rstate_string 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_session_reused.3 b/secure/lib/libssl/man/SSL_session_reused.3 index c749e3c..b6f2b0f 100644 --- a/secure/lib/libssl/man/SSL_session_reused.3 +++ b/secure/lib/libssl/man/SSL_session_reused.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_session_reused 3" -.TH SSL_session_reused 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_session_reused 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_bio.3 b/secure/lib/libssl/man/SSL_set_bio.3 index 9466fb4..57b8d30 100644 --- a/secure/lib/libssl/man/SSL_set_bio.3 +++ b/secure/lib/libssl/man/SSL_set_bio.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_bio 3" -.TH SSL_set_bio 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_set_bio 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_connect_state.3 b/secure/lib/libssl/man/SSL_set_connect_state.3 index 4ff119c..1b681a0 100644 --- a/secure/lib/libssl/man/SSL_set_connect_state.3 +++ b/secure/lib/libssl/man/SSL_set_connect_state.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_connect_state 3" -.TH SSL_set_connect_state 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_set_connect_state 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_fd.3 b/secure/lib/libssl/man/SSL_set_fd.3 index 8b97fe5..3f9fddb 100644 --- a/secure/lib/libssl/man/SSL_set_fd.3 +++ b/secure/lib/libssl/man/SSL_set_fd.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_fd 3" -.TH SSL_set_fd 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_set_fd 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_session.3 b/secure/lib/libssl/man/SSL_set_session.3 index eccb9ab..7e8c70c 100644 --- a/secure/lib/libssl/man/SSL_set_session.3 +++ b/secure/lib/libssl/man/SSL_set_session.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_session 3" -.TH SSL_set_session 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_set_session 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_shutdown.3 b/secure/lib/libssl/man/SSL_set_shutdown.3 index c513c4c..9b211de 100644 --- a/secure/lib/libssl/man/SSL_set_shutdown.3 +++ b/secure/lib/libssl/man/SSL_set_shutdown.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_shutdown 3" -.TH SSL_set_shutdown 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_set_shutdown 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_verify_result.3 b/secure/lib/libssl/man/SSL_set_verify_result.3 index 8b205cd..1cffb23 100644 --- a/secure/lib/libssl/man/SSL_set_verify_result.3 +++ b/secure/lib/libssl/man/SSL_set_verify_result.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_verify_result 3" -.TH SSL_set_verify_result 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_set_verify_result 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_shutdown.3 b/secure/lib/libssl/man/SSL_shutdown.3 index e5e74c8..d794359 100644 --- a/secure/lib/libssl/man/SSL_shutdown.3 +++ b/secure/lib/libssl/man/SSL_shutdown.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_shutdown 3" -.TH SSL_shutdown 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_shutdown 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_state_string.3 b/secure/lib/libssl/man/SSL_state_string.3 index df8ba49..f9e3cf1 100644 --- a/secure/lib/libssl/man/SSL_state_string.3 +++ b/secure/lib/libssl/man/SSL_state_string.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_state_string 3" -.TH SSL_state_string 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_state_string 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_want.3 b/secure/lib/libssl/man/SSL_want.3 index 9b5e449..e61762d 100644 --- a/secure/lib/libssl/man/SSL_want.3 +++ b/secure/lib/libssl/man/SSL_want.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_want 3" -.TH SSL_want 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_want 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_write.3 b/secure/lib/libssl/man/SSL_write.3 index cf6857b..2883ff8 100644 --- a/secure/lib/libssl/man/SSL_write.3 +++ b/secure/lib/libssl/man/SSL_write.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_write 3" -.TH SSL_write 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SSL_write 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/d2i_SSL_SESSION.3 b/secure/lib/libssl/man/d2i_SSL_SESSION.3 index 3e90307..233247b 100644 --- a/secure/lib/libssl/man/d2i_SSL_SESSION.3 +++ b/secure/lib/libssl/man/d2i_SSL_SESSION.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_SSL_SESSION 3" -.TH d2i_SSL_SESSION 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH d2i_SSL_SESSION 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/ssl.3 b/secure/lib/libssl/man/ssl.3 index 7a22abd..61e9bf8 100644 --- a/secure/lib/libssl/man/ssl.3 +++ b/secure/lib/libssl/man/ssl.3 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ssl 3" -.TH ssl 3 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ssl 3 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/CA.pl.1 b/secure/usr.bin/openssl/man/CA.pl.1 index f9b2e48..7c3c4eb 100644 --- a/secure/usr.bin/openssl/man/CA.pl.1 +++ b/secure/usr.bin/openssl/man/CA.pl.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CA.PL 1" -.TH CA.PL 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CA.PL 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/asn1parse.1 b/secure/usr.bin/openssl/man/asn1parse.1 index 78f59c5..3fd727b 100644 --- a/secure/usr.bin/openssl/man/asn1parse.1 +++ b/secure/usr.bin/openssl/man/asn1parse.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1PARSE 1" -.TH ASN1PARSE 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ASN1PARSE 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ca.1 b/secure/usr.bin/openssl/man/ca.1 index e14eede..9de935d 100644 --- a/secure/usr.bin/openssl/man/ca.1 +++ b/secure/usr.bin/openssl/man/ca.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CA 1" -.TH CA 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CA 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ciphers.1 b/secure/usr.bin/openssl/man/ciphers.1 index 0ac0b1e..46f1f97 100644 --- a/secure/usr.bin/openssl/man/ciphers.1 +++ b/secure/usr.bin/openssl/man/ciphers.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CIPHERS 1" -.TH CIPHERS 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CIPHERS 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/crl.1 b/secure/usr.bin/openssl/man/crl.1 index 82f022d..5ed5e4b 100644 --- a/secure/usr.bin/openssl/man/crl.1 +++ b/secure/usr.bin/openssl/man/crl.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CRL 1" -.TH CRL 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CRL 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/crl2pkcs7.1 b/secure/usr.bin/openssl/man/crl2pkcs7.1 index 29dc7e7..55083e1 100644 --- a/secure/usr.bin/openssl/man/crl2pkcs7.1 +++ b/secure/usr.bin/openssl/man/crl2pkcs7.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CRL2PKCS7 1" -.TH CRL2PKCS7 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH CRL2PKCS7 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dgst.1 b/secure/usr.bin/openssl/man/dgst.1 index a0373cc..9d33fdf 100644 --- a/secure/usr.bin/openssl/man/dgst.1 +++ b/secure/usr.bin/openssl/man/dgst.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DGST 1" -.TH DGST 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DGST 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dhparam.1 b/secure/usr.bin/openssl/man/dhparam.1 index e93899a..0a61289 100644 --- a/secure/usr.bin/openssl/man/dhparam.1 +++ b/secure/usr.bin/openssl/man/dhparam.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DHPARAM 1" -.TH DHPARAM 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DHPARAM 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dsa.1 b/secure/usr.bin/openssl/man/dsa.1 index 1879eab..e93e28a 100644 --- a/secure/usr.bin/openssl/man/dsa.1 +++ b/secure/usr.bin/openssl/man/dsa.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA 1" -.TH DSA 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSA 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dsaparam.1 b/secure/usr.bin/openssl/man/dsaparam.1 index 9979766..b37bf6d 100644 --- a/secure/usr.bin/openssl/man/dsaparam.1 +++ b/secure/usr.bin/openssl/man/dsaparam.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSAPARAM 1" -.TH DSAPARAM 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH DSAPARAM 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ec.1 b/secure/usr.bin/openssl/man/ec.1 index 66ee41e..56c0b7a 100644 --- a/secure/usr.bin/openssl/man/ec.1 +++ b/secure/usr.bin/openssl/man/ec.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EC 1" -.TH EC 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH EC 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ecparam.1 b/secure/usr.bin/openssl/man/ecparam.1 index ec79e7a..eb5332d 100644 --- a/secure/usr.bin/openssl/man/ecparam.1 +++ b/secure/usr.bin/openssl/man/ecparam.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ECPARAM 1" -.TH ECPARAM 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ECPARAM 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/enc.1 b/secure/usr.bin/openssl/man/enc.1 index f5e9c20..8330813 100644 --- a/secure/usr.bin/openssl/man/enc.1 +++ b/secure/usr.bin/openssl/man/enc.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ENC 1" -.TH ENC 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ENC 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/errstr.1 b/secure/usr.bin/openssl/man/errstr.1 index d579aa0..b498d2f 100644 --- a/secure/usr.bin/openssl/man/errstr.1 +++ b/secure/usr.bin/openssl/man/errstr.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERRSTR 1" -.TH ERRSTR 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH ERRSTR 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/gendsa.1 b/secure/usr.bin/openssl/man/gendsa.1 index 1a584a7..e271817 100644 --- a/secure/usr.bin/openssl/man/gendsa.1 +++ b/secure/usr.bin/openssl/man/gendsa.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "GENDSA 1" -.TH GENDSA 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH GENDSA 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/genrsa.1 b/secure/usr.bin/openssl/man/genrsa.1 index 9b28efa..56d5dec 100644 --- a/secure/usr.bin/openssl/man/genrsa.1 +++ b/secure/usr.bin/openssl/man/genrsa.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "GENRSA 1" -.TH GENRSA 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH GENRSA 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/nseq.1 b/secure/usr.bin/openssl/man/nseq.1 index 8e74ba1..e212c0c 100644 --- a/secure/usr.bin/openssl/man/nseq.1 +++ b/secure/usr.bin/openssl/man/nseq.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "NSEQ 1" -.TH NSEQ 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH NSEQ 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ocsp.1 b/secure/usr.bin/openssl/man/ocsp.1 index 8080acf..be1011b 100644 --- a/secure/usr.bin/openssl/man/ocsp.1 +++ b/secure/usr.bin/openssl/man/ocsp.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OCSP 1" -.TH OCSP 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OCSP 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/openssl.1 b/secure/usr.bin/openssl/man/openssl.1 index 0cf9d61..8f6a7c3 100644 --- a/secure/usr.bin/openssl/man/openssl.1 +++ b/secure/usr.bin/openssl/man/openssl.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL 1" -.TH OPENSSL 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH OPENSSL 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/passwd.1 b/secure/usr.bin/openssl/man/passwd.1 index 405c605..e88cebe 100644 --- a/secure/usr.bin/openssl/man/passwd.1 +++ b/secure/usr.bin/openssl/man/passwd.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PASSWD 1" -.TH PASSWD 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PASSWD 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/pkcs12.1 b/secure/usr.bin/openssl/man/pkcs12.1 index 9eeb47c..805d58c 100644 --- a/secure/usr.bin/openssl/man/pkcs12.1 +++ b/secure/usr.bin/openssl/man/pkcs12.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS12 1" -.TH PKCS12 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS12 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/pkcs7.1 b/secure/usr.bin/openssl/man/pkcs7.1 index 40bf064..1f2619a 100644 --- a/secure/usr.bin/openssl/man/pkcs7.1 +++ b/secure/usr.bin/openssl/man/pkcs7.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7 1" -.TH PKCS7 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS7 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/pkcs8.1 b/secure/usr.bin/openssl/man/pkcs8.1 index 4cc0a68..36535de 100644 --- a/secure/usr.bin/openssl/man/pkcs8.1 +++ b/secure/usr.bin/openssl/man/pkcs8.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS8 1" -.TH PKCS8 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH PKCS8 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/rand.1 b/secure/usr.bin/openssl/man/rand.1 index 115a453..9e501d0 100644 --- a/secure/usr.bin/openssl/man/rand.1 +++ b/secure/usr.bin/openssl/man/rand.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND 1" -.TH RAND 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RAND 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/req.1 b/secure/usr.bin/openssl/man/req.1 index 8f5dd2b..8267f35 100644 --- a/secure/usr.bin/openssl/man/req.1 +++ b/secure/usr.bin/openssl/man/req.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "REQ 1" -.TH REQ 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH REQ 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/rsa.1 b/secure/usr.bin/openssl/man/rsa.1 index b504453..60b4dc8 100644 --- a/secure/usr.bin/openssl/man/rsa.1 +++ b/secure/usr.bin/openssl/man/rsa.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA 1" -.TH RSA 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSA 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/rsautl.1 b/secure/usr.bin/openssl/man/rsautl.1 index a2ad8e6..be70710 100644 --- a/secure/usr.bin/openssl/man/rsautl.1 +++ b/secure/usr.bin/openssl/man/rsautl.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSAUTL 1" -.TH RSAUTL 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH RSAUTL 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/s_client.1 b/secure/usr.bin/openssl/man/s_client.1 index 931189f..8605365 100644 --- a/secure/usr.bin/openssl/man/s_client.1 +++ b/secure/usr.bin/openssl/man/s_client.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "S_CLIENT 1" -.TH S_CLIENT 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH S_CLIENT 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/s_server.1 b/secure/usr.bin/openssl/man/s_server.1 index e51e6f4..0e9eb14 100644 --- a/secure/usr.bin/openssl/man/s_server.1 +++ b/secure/usr.bin/openssl/man/s_server.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "S_SERVER 1" -.TH S_SERVER 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH S_SERVER 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/s_time.1 b/secure/usr.bin/openssl/man/s_time.1 index e769409..3838925 100644 --- a/secure/usr.bin/openssl/man/s_time.1 +++ b/secure/usr.bin/openssl/man/s_time.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "S_TIME 1" -.TH S_TIME 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH S_TIME 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/sess_id.1 b/secure/usr.bin/openssl/man/sess_id.1 index 3d59b8c..8ab621b 100644 --- a/secure/usr.bin/openssl/man/sess_id.1 +++ b/secure/usr.bin/openssl/man/sess_id.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SESS_ID 1" -.TH SESS_ID 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SESS_ID 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/smime.1 b/secure/usr.bin/openssl/man/smime.1 index e6cab4c..1abe463 100644 --- a/secure/usr.bin/openssl/man/smime.1 +++ b/secure/usr.bin/openssl/man/smime.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SMIME 1" -.TH SMIME 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SMIME 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/speed.1 b/secure/usr.bin/openssl/man/speed.1 index c6849b8..99dc0cd 100644 --- a/secure/usr.bin/openssl/man/speed.1 +++ b/secure/usr.bin/openssl/man/speed.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SPEED 1" -.TH SPEED 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SPEED 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/spkac.1 b/secure/usr.bin/openssl/man/spkac.1 index d0760c1..28ebfa5 100644 --- a/secure/usr.bin/openssl/man/spkac.1 +++ b/secure/usr.bin/openssl/man/spkac.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SPKAC 1" -.TH SPKAC 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH SPKAC 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/verify.1 b/secure/usr.bin/openssl/man/verify.1 index 34338d2..9e81860 100644 --- a/secure/usr.bin/openssl/man/verify.1 +++ b/secure/usr.bin/openssl/man/verify.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "VERIFY 1" -.TH VERIFY 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH VERIFY 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/version.1 b/secure/usr.bin/openssl/man/version.1 index 529043d..0ea1798 100644 --- a/secure/usr.bin/openssl/man/version.1 +++ b/secure/usr.bin/openssl/man/version.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "VERSION 1" -.TH VERSION 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH VERSION 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/x509.1 b/secure/usr.bin/openssl/man/x509.1 index 34ea002..e3708b2 100644 --- a/secure/usr.bin/openssl/man/x509.1 +++ b/secure/usr.bin/openssl/man/x509.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509 1" -.TH X509 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/x509v3_config.1 b/secure/usr.bin/openssl/man/x509v3_config.1 index ae7e180..e9935c1 100644 --- a/secure/usr.bin/openssl/man/x509v3_config.1 +++ b/secure/usr.bin/openssl/man/x509v3_config.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509V3_CONFIG 1" -.TH X509V3_CONFIG 1 "2010-11-16" "0.9.8p" "OpenSSL" +.TH X509V3_CONFIG 1 "2010-12-02" "0.9.8q" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l -- cgit v1.1 From c042df181c1d57a6c9892c4f6724b9cd21518aac Mon Sep 17 00:00:00 2001 From: jilles Date: Fri, 3 Dec 2010 23:24:27 +0000 Subject: sh(1): Clean up documentation of built-in commands. Make sure all built-in commands are in the subsection named such, except exp, let and wordexp which are deliberately undocumented. The text said only built-ins that really need to be a built-in were documented there but in fact almost all of them were already documented. --- bin/sh/sh.1 | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 16f431e..a6fd7be 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -32,7 +32,7 @@ .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" $FreeBSD$ .\" -.Dd December 1, 2010 +.Dd December 3, 2010 .Dt SH 1 .Os .Sh NAME @@ -1593,12 +1593,7 @@ To include a .Ql - , make it the first or last character listed. .Ss Built-in Commands -This section lists the commands which -are built-in because they need to perform some operation -that cannot be performed by a separate process. -In addition to -these, built-in versions of essential utilities -are provided for efficiency. +This section lists the built-in commands. .Bl -tag -width indent .It Ic \&: A null command that returns a 0 (true) exit value. @@ -1649,15 +1644,19 @@ subsection. Continue the specified jobs (or the current job if no jobs are given) in the background. +.It Ic bind Oo Fl aeklrsv Oc Oo Ar key Oo Ar command Oc Oc +List or alter key bindings for the line editor. +This command is documented in +.Xr editrc 5 . +.It Ic break Op Ar num +See the +.Sx Flow-Control Constructs +subsection. .It Ic builtin Ar cmd Op Ar arg ... Execute the specified built-in command, .Ar cmd . This is useful when the user wishes to override a shell function with the same name as a built-in command. -.It Ic bind Oo Fl aeklrsv Oc Oo Ar key Oo Ar command Oc Oc -List or alter key bindings for the line editor. -This command is documented in -.Xr editrc 5 . .It Ic cd Oo Fl L | P Oc Op Ar directory Switch to the specified .Ar directory , @@ -1759,6 +1758,10 @@ a shell keyword or an alias for .Ar value . +.It Ic continue Op Ar num +See the +.Sx Flow-Control Constructs +subsection. .It Ic echo Oo Fl e | n Oc Op Ar string ... Print a space-separated list of the arguments to the standard output and append a newline character. -- cgit v1.1 From d2262df647cb68b7a55a79623696e646c546774e Mon Sep 17 00:00:00 2001 From: dougb Date: Sat, 4 Dec 2010 00:42:21 +0000 Subject: Vendor import of BIND 9.6-ESV-R3 --- CHANGES | 52 ++++++++++ RELEASE-NOTES-BIND-9.6-ESV.html | 225 ++++++++++++++++++++++++++++++++++++++++ RELEASE-NOTES-BIND-9.6-ESV.pdf | Bin 0 -> 53051 bytes RELEASE-NOTES-BIND-9.6-ESV.txt | 133 ++++++++++++++++++++++++ bin/check/check-tool.c | 31 +++++- bin/check/check-tool.h | 9 +- bin/check/named-checkconf.c | 12 ++- bin/check/named-checkzone.c | 11 +- bin/dig/host.c | 10 +- bin/named/client.c | 8 +- bin/named/include/named/query.h | 6 +- bin/named/query.c | 25 ++--- bin/named/server.c | 41 ++++---- lib/dns/api | 4 +- lib/dns/include/dns/view.h | 6 +- lib/dns/journal.c | 21 ++-- lib/dns/rbtdb.c | 65 +++++++++--- lib/dns/validator.c | 58 +++++++++-- lib/dns/view.c | 8 +- lib/isc/api | 2 +- lib/isc/print.c | 6 +- release-notes.css | 60 +++++++++++ version | 4 +- 23 files changed, 706 insertions(+), 91 deletions(-) create mode 100644 RELEASE-NOTES-BIND-9.6-ESV.html create mode 100644 RELEASE-NOTES-BIND-9.6-ESV.pdf create mode 100644 RELEASE-NOTES-BIND-9.6-ESV.txt create mode 100644 release-notes.css diff --git a/CHANGES b/CHANGES index cb2581a..a44c804 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,55 @@ + + --- 9.6-ESV-R3 released --- + +2972. [bug] win32: address windows socket errors. [RT #21906] + +2971. [bug] Fixed a bug that caused journal files not to be + compacted on Windows systems as a result of + non-POSIX-compliant rename() semantics. [RT #22434] + +2970. [security] Adding a NO DATA negative cache entry failed to clear + any matching RRSIG records. A subsequent lookup of + of NO DATA cache entry could trigger a INSIST when the + unexpected RRSIG was also returned with the NO DATA + cache entry. + + CVE-2010-3613, VU#706148. [RT #22288] + +2969. [security] Fix acl type processing so that allow-query works + in options and view statements. Also add a new + set of tests to verify proper functioning. + + CVE-2010-3615, VU#510208. [RT #22418] + +2968. [security] Named could fail to prove a data set was insecure + before marking it as insecure. One set of conditions + that can trigger this occurs naturally when rolling + DNSKEY algorithms. + + CVE-2010-3614, VU#837744. [RT #22309] + +2967. [bug] 'host -D' now turns on debugging messages earlier. + [RT #22361] + +2966. [bug] isc_print_vsnprintf() failed to check if there was + space available in the buffer when adding a left + justified character with a non zero width, + (e.g. "%-1c"). [RT #22270] + +2964. [bug] view->queryacl was being overloaded. Seperate the + usage into view->queryacl, view->cacheacl and + view->queryonacl. [RT #22114] + +2962. [port] win32: add more dependencies to BINDBuild.dsw. + [RT #22062] + +2952. [port] win32: named-checkzone and named-checkconf failed + to initialise winsock. [RT #21932] + +2951. [bug] named failed to generate a correct signed response + in a optout, delegation only zone with no secure + delegations. [RT #22007] + --- 9.6-ESV-R2 released --- 2939. [func] Check that named successfully skips NSEC3 records diff --git a/RELEASE-NOTES-BIND-9.6-ESV.html b/RELEASE-NOTES-BIND-9.6-ESV.html new file mode 100644 index 0000000..946330d --- /dev/null +++ b/RELEASE-NOTES-BIND-9.6-ESV.html @@ -0,0 +1,225 @@ + + + + + + +


+ +

Introduction

+ +

+ BIND 9.6-ESV-R3 is a maintenance release for BIND 9.6-ESV. +

+

+ This document summarizes changes from BIND 9.6-ESV-R1 to BIND 9.6-ESV-R3. + Please see the CHANGES file in the source code release for a + complete list of all changes. +

+
+ +

Download

+ +

+ The latest release of BIND 9 software can always be found + on our web site at + http://www.isc.org/software/bind. + There you will find additional information about each release, + source code, and some pre-compiled versions for certain operating + systems. +

+
+ +

Support

+ +

Product support information is available on + http://www.isc.org/services/support + for paid support options. Free support is provided by our user + community via a mailing list. Information on all public email + lists is available at + https://lists.isc.org/mailman/listinfo. +

+
+ +

New Features

+ +

9.6-ESV-R2

+ +

None.

+
+

9.6-ESV-R3

+ +

None.

+
+
+ +

Feature Changes

+ +

9.6-ESV-R2

+ +

None.

+
+

9.6-ESV-R3

+ +

None.

+
+
+ +

Security Fixes

+ +

9.6-ESV-R2

+ +

None.

+
+

9.6-ESV-R3

+ +
  • + Adding a NO DATA signed negative response to cache failed to clear + any matching RRSIG records already in cache. A subsequent lookup + of the cached NO DATA entry could crash named (INSIST) when the + unexpected RRSIG was also returned with the NO DATA cache entry. + [RT #22288] [CVE-2010-3613] [VU#706148] +
  • + BIND, acting as a DNSSEC validator, was determining if the NS RRset + is insecure based on a value that could mean either that the RRset + is actually insecure or that there wasn't a matching key for the RRSIG + in the DNSKEY RRset when resuming from validating the DNSKEY RRset. + This can happen when in the middle of a DNSKEY algorithm rollover, + when two different algorithms were used to sign a zone but only the + new set of keys are in the zone DNSKEY RRset. + [RT #22309] [CVE-2010-3614] [VU#837744] +
+
+
+ +

Bug Fixes

+ +

9.6-ESV-R2

+ +
  • + Check that named successfully skips NSEC3 records + that fail to match the NSEC3PARAM record currently + in use. + [RT #21868] +
  • + Worked around a race condition in the cache database memory + handling. Without this fix a DNS cache DB or ADB could + incorrectly stay in an over memory state, effectively refusing + further caching, which subsequently made a BIND 9 caching + server unworkable. + [RT #21818] +
  • + BIND did not properly handle non-cacheable negative responses + from insecure zones. This caused several non-protocol-compliant + zones to become unresolvable. BIND is now more accepting of + responses it receives from less strict servers. + [RT #21555] +
  • + The resolver could attempt to destroy a fetch context too + soon, resulting in a crash. + [RT #19878] +
  • + The placeholder negative caching element was not + properly constructed triggering a crash (INSIST) in + dns_ncache_towire(). + [RT #21346] +
  • + Handle the introduction of new trusted-keys and + DS, DLV RRsets better. + [RT #21097] +
  • + Fix arguments to dns_keytable_findnextkeynode() call. + [RT #20877] +
+
+

9.6-ESV-R3

+ +
  • + Microsoft changed the behavior of sockets between NT/XP based + stacks vs Vista/windows7 stacks. Server 2003/2008 have the older + behavior, 2008r2 has the new behavior. With the change, different + error results are possible, so ISC adapted BIND to handle the new + error results. + This resolves an issue where sockets would shut down on + Windows servers causing named to stop responding to queries. + [RT #21906] +
  • + Windows has non-POSIX compliant behavior in its rename() and unlink() + calls. This caused journal compaction to fail on Windows BIND servers + with the log error: "dns_journal_compact failed: failure". + [RT #22434] +
  • + 'host -D' now turns on debugging messages earlier. + [RT #22361] +
  • + isc_print_vsnprintf() failed to check if there was + space available in the buffer when adding a left + justified character with a non zero width, + (e.g. "%-1c"). + [RT #22270] +
  • + view->queryacl was being overloaded. Seperate the + usage into view->queryacl, view->cacheacl and + view->queryonacl. + [RT #22114] +
  • + win32: add more dependencies to BINDBuild.dsw. + [RT #22062] +
  • + win32: named-checkzone and named-checkconf failed + to initialise winsock. + [RT #21932] +
  • + named failed to generate a correct signed response + in a optout, delegation only zone with no secure + delegations. + [RT #22007] +
+
+
+ +

Known issues in this release

+ +
  • +

    + "make test" will fail on OSX and possibly other operating systems. + The failure occurs in a new test to check for allow-query ACLs. + The failure is caused because the source address is not specified on + the dig commands issued in the test. +

    +

    + If running "make test" is part of your usual acceptance process, + please edit the file bin/tests/system/allow_query/test.sh + and add +

    + -b 10.53.0.2 +

    + to the DIGOPTS line. +

    +
+
+ +

Thank You

+ +

+ Thank you to everyone who assisted us in making this release possible. + If you would like to contribute to ISC to assist us in continuing to make + quality open source software, please visit our donations page at + http://www.isc.org/supportisc. +

+
+
diff --git a/RELEASE-NOTES-BIND-9.6-ESV.pdf b/RELEASE-NOTES-BIND-9.6-ESV.pdf new file mode 100644 index 0000000..60fa9fa Binary files /dev/null and b/RELEASE-NOTES-BIND-9.6-ESV.pdf differ diff --git a/RELEASE-NOTES-BIND-9.6-ESV.txt b/RELEASE-NOTES-BIND-9.6-ESV.txt new file mode 100644 index 0000000..028c16d --- /dev/null +++ b/RELEASE-NOTES-BIND-9.6-ESV.txt @@ -0,0 +1,133 @@ + __________________________________________________________________ + +Introduction + + BIND 9.6-ESV-R3 is a maintenance release for BIND 9.6-ESV. + + This document summarizes changes from BIND 9.6-ESV-R1 to BIND + 9.6-ESV-R3. Please see the CHANGES file in the source code release for + a complete list of all changes. + +Download + + The latest release of BIND 9 software can always be found on our web + site at http://www.isc.org/software/bind. There you will find + additional information about each release, source code, and some + pre-compiled versions for certain operating systems. + +Support + + Product support information is available on + http://www.isc.org/services/support for paid support options. Free + support is provided by our user community via a mailing list. + Information on all public email lists is available at + https://lists.isc.org/mailman/listinfo. + +New Features + +9.6-ESV-R2 + + None. + +9.6-ESV-R3 + + None. + +Feature Changes + +9.6-ESV-R2 + + None. + +9.6-ESV-R3 + + None. + +Security Fixes + +9.6-ESV-R2 + + None. + +9.6-ESV-R3 + + * Adding a NO DATA signed negative response to cache failed to clear + any matching RRSIG records already in cache. A subsequent lookup of + the cached NO DATA entry could crash named (INSIST) when the + unexpected RRSIG was also returned with the NO DATA cache entry. + [RT #22288] [CVE-2010-3613] [VU#706148] + * BIND, acting as a DNSSEC validator, was determining if the NS RRset + is insecure based on a value that could mean either that the RRset + is actually insecure or that there wasn't a matching key for the + RRSIG in the DNSKEY RRset when resuming from validating the DNSKEY + RRset. This can happen when in the middle of a DNSKEY algorithm + rollover, when two different algorithms were used to sign a zone + but only the new set of keys are in the zone DNSKEY RRset. [RT + #22309] [CVE-2010-3614] [VU#837744] + +Bug Fixes + +9.6-ESV-R2 + + * Check that named successfully skips NSEC3 records that fail to + match the NSEC3PARAM record currently in use. [RT #21868] + * Worked around a race condition in the cache database memory + handling. Without this fix a DNS cache DB or ADB could incorrectly + stay in an over memory state, effectively refusing further caching, + which subsequently made a BIND 9 caching server unworkable. [RT + #21818] + * BIND did not properly handle non-cacheable negative responses from + insecure zones. This caused several non-protocol-compliant zones to + become unresolvable. BIND is now more accepting of responses it + receives from less strict servers. [RT #21555] + * The resolver could attempt to destroy a fetch context too soon, + resulting in a crash. [RT #19878] + * The placeholder negative caching element was not properly + constructed triggering a crash (INSIST) in dns_ncache_towire(). [RT + #21346] + * Handle the introduction of new trusted-keys and DS, DLV RRsets + better. [RT #21097] + * Fix arguments to dns_keytable_findnextkeynode() call. [RT #20877] + +9.6-ESV-R3 + + * Microsoft changed the behavior of sockets between NT/XP based + stacks vs Vista/windows7 stacks. Server 2003/2008 have the older + behavior, 2008r2 has the new behavior. With the change, different + error results are possible, so ISC adapted BIND to handle the new + error results. This resolves an issue where sockets would shut down + on Windows servers causing named to stop responding to queries. [RT + #21906] + * Windows has non-POSIX compliant behavior in its rename() and + unlink() calls. This caused journal compaction to fail on Windows + BIND servers with the log error: "dns_journal_compact failed: + failure". [RT #22434] + * 'host -D' now turns on debugging messages earlier. [RT #22361] + * isc_print_vsnprintf() failed to check if there was space available + in the buffer when adding a left justified character with a non + zero width, (e.g. "%-1c"). [RT #22270] + * view->queryacl was being overloaded. Seperate the usage into + view->queryacl, view->cacheacl and view->queryonacl. [RT #22114] + * win32: add more dependencies to BINDBuild.dsw. [RT #22062] + * win32: named-checkzone and named-checkconf failed to initialise + winsock. [RT #21932] + * named failed to generate a correct signed response in a optout, + delegation only zone with no secure delegations. [RT #22007] + +Known issues in this release + + * "make test" will fail on OSX and possibly other operating systems. + The failure occurs in a new test to check for allow-query ACLs. The + failure is caused because the source address is not specified on + the dig commands issued in the test. + If running "make test" is part of your usual acceptance process, + please edit the file bin/tests/system/allow_query/test.sh and add + -b 10.53.0.2 + to the DIGOPTS line. + +Thank You + + Thank you to everyone who assisted us in making this release possible. + If you would like to contribute to ISC to assist us in continuing to + make quality open source software, please visit our donations page at + http://www.isc.org/supportisc. diff --git a/bin/check/check-tool.c b/bin/check/check-tool.c index e0a7208..396f105 100644 --- a/bin/check/check-tool.c +++ b/bin/check/check-tool.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: check-tool.c,v 1.35.36.3 2009/01/20 02:03:18 marka Exp $ */ +/* $Id: check-tool.c,v 1.35.36.3.24.2 2010/09/07 23:46:25 tbox Exp $ */ /*! \file */ @@ -23,6 +23,10 @@ #include +#ifdef _WIN32 +#include +#endif + #include "check-tool.h" #include #include @@ -662,3 +666,26 @@ dump_zone(const char *zonename, dns_zone_t *zone, const char *filename, return (result); } + +#ifdef _WIN32 +void +InitSockets(void) { + WORD wVersionRequested; + WSADATA wsaData; + int err; + + wVersionRequested = MAKEWORD(2, 0); + + err = WSAStartup( wVersionRequested, &wsaData ); + if (err != 0) { + fprintf(stderr, "WSAStartup() failed: %d\n", err); + exit(1); + } +} + +void +DestroySockets(void) { + WSACleanup(); +} +#endif + diff --git a/bin/check/check-tool.h b/bin/check/check-tool.h index b0ba7e0..0128926 100644 --- a/bin/check/check-tool.h +++ b/bin/check/check-tool.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: check-tool.h,v 1.14 2007/06/18 23:47:17 tbox Exp $ */ +/* $Id: check-tool.h,v 1.14.628.2 2010/09/07 23:46:26 tbox Exp $ */ #ifndef CHECK_TOOL_H #define CHECK_TOOL_H @@ -43,6 +43,11 @@ isc_result_t dump_zone(const char *zonename, dns_zone_t *zone, const char *filename, dns_masterformat_t fileformat, const dns_master_style_t *style); +#ifdef _WIN32 +void InitSockets(void); +void DestroySockets(void); +#endif + extern int debug; extern isc_boolean_t nomerge; extern isc_boolean_t docheckmx; diff --git a/bin/check/named-checkconf.c b/bin/check/named-checkconf.c index eba0d93..7ed1043 100644 --- a/bin/check/named-checkconf.c +++ b/bin/check/named-checkconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named-checkconf.c,v 1.46.222.2 2009/02/16 23:47:15 tbox Exp $ */ +/* $Id: named-checkconf.c,v 1.46.222.2.24.2 2010/09/07 23:46:26 tbox Exp $ */ /*! \file */ @@ -453,6 +453,10 @@ main(int argc, char **argv) { if (conffile == NULL || conffile[0] == '\0') conffile = NAMED_CONFFILE; +#ifdef _WIN32 + InitSockets(); +#endif + RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); RUNTIME_CHECK(setup_logging(mctx, stdout, &logc) == ISC_R_SUCCESS); @@ -494,5 +498,9 @@ main(int argc, char **argv) { isc_mem_destroy(&mctx); +#ifdef _WIN32 + DestroySockets(); +#endif + return (exit_status); } diff --git a/bin/check/named-checkzone.c b/bin/check/named-checkzone.c index 0b49b51..1fa015a 100644 --- a/bin/check/named-checkzone.c +++ b/bin/check/named-checkzone.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named-checkzone.c,v 1.51.34.4 2009/11/10 20:01:41 each Exp $ */ +/* $Id: named-checkzone.c,v 1.51.34.4.10.2 2010/09/07 23:46:26 tbox Exp $ */ /*! \file */ @@ -419,6 +419,10 @@ main(int argc, char **argv) { if (isc_commandline_index + 2 != argc) usage(); +#ifdef _WIN32 + InitSockets(); +#endif + RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); if (!quiet) RUNTIME_CHECK(setup_logging(mctx, errout, &lctx) @@ -453,5 +457,8 @@ main(int argc, char **argv) { isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); +#ifdef _WIN32 + DestroySockets(); +#endif return ((result == ISC_R_SUCCESS) ? 0 : 1); } diff --git a/bin/dig/host.c b/bin/dig/host.c index 8cd5b3d..1a7d174 100644 --- a/bin/dig/host.c +++ b/bin/dig/host.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: host.c,v 1.116.216.3 2009/09/08 23:28:20 marka Exp $ */ +/* $Id: host.c,v 1.116.216.3.10.2 2010/10/19 23:46:25 tbox Exp $ */ /*! \file */ @@ -625,7 +625,9 @@ pre_parse_args(int argc, char **argv) { case 'v': break; case 'w': break; case 'C': break; - case 'D': break; + case 'D': + debugging = ISC_TRUE; + break; case 'N': break; case 'R': break; case 'T': break; @@ -792,7 +794,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) { ndots = atoi(isc_commandline_argument); break; case 'D': - debugging = ISC_TRUE; + /* Handled by pre_parse_args(). */ break; case '4': if (have_ipv4) { diff --git a/bin/named/client.c b/bin/named/client.c index ae5386c..a0e034a 100644 --- a/bin/named/client.c +++ b/bin/named/client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: client.c,v 1.259.12.3 2009/01/29 22:40:33 jinmei Exp $ */ +/* $Id: client.c,v 1.259.12.3.24.2 2010/09/29 23:46:31 tbox Exp $ */ #include @@ -1859,13 +1859,13 @@ client_request(isc_task_t *task, isc_event_t *event) { client->view->recursionacl, ISC_TRUE) == ISC_R_SUCCESS && ns_client_checkaclsilent(client, NULL, - client->view->queryacl, + client->view->cacheacl, ISC_TRUE) == ISC_R_SUCCESS && ns_client_checkaclsilent(client, &client->interface->addr, client->view->recursiononacl, ISC_TRUE) == ISC_R_SUCCESS && ns_client_checkaclsilent(client, &client->interface->addr, - client->view->queryonacl, + client->view->cacheonacl, ISC_TRUE) == ISC_R_SUCCESS) ra = ISC_TRUE; diff --git a/bin/named/include/named/query.h b/bin/named/include/named/query.h index 500b577..3f019a3 100644 --- a/bin/named/include/named/query.h +++ b/bin/named/include/named/query.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.h,v 1.40 2007/06/19 23:46:59 tbox Exp $ */ +/* $Id: query.h,v 1.40.626.2 2010/09/29 23:46:31 tbox Exp $ */ #ifndef NAMED_QUERY_H #define NAMED_QUERY_H 1 @@ -71,6 +71,8 @@ struct ns_query { #define NS_QUERYATTR_SECURE 0x0200 #define NS_QUERYATTR_NOAUTHORITY 0x0400 #define NS_QUERYATTR_NOADDITIONAL 0x0800 +#define NS_QUERYATTR_CACHEACLOKVALID 0x1000 +#define NS_QUERYATTR_CACHEACLOK 0x2000 isc_result_t ns_query_init(ns_client_t *client); diff --git a/bin/named/query.c b/bin/named/query.c index 73ed1a6..0ba708b 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.313.20.16.10.2 2010/06/26 23:46:14 tbox Exp $ */ +/* $Id: query.c,v 1.313.20.16.10.3 2010/09/29 00:03:32 marka Exp $ */ /*! \file */ @@ -820,17 +820,15 @@ query_getcachedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype, return (DNS_R_REFUSED); dns_db_attach(client->view->cachedb, &db); - if ((client->query.attributes & - NS_QUERYATTR_QUERYOKVALID) != 0) { + if ((client->query.attributes & NS_QUERYATTR_CACHEACLOKVALID) != 0) { /* - * We've evaluated the view's queryacl already. If - * NS_QUERYATTR_QUERYOK is set, then the client is + * We've evaluated the view's cacheacl already. If + * NS_QUERYATTR_CACHEACLOK is set, then the client is * allowed to make queries, otherwise the query should * be refused. */ check_acl = ISC_FALSE; - if ((client->query.attributes & - NS_QUERYATTR_QUERYOK) == 0) + if ((client->query.attributes & NS_QUERYATTR_CACHEACLOK) == 0) goto refuse; } else { /* @@ -844,16 +842,15 @@ query_getcachedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype, char msg[NS_CLIENT_ACLMSGSIZE("query (cache)")]; result = ns_client_checkaclsilent(client, NULL, - client->view->queryacl, + client->view->cacheacl, ISC_TRUE); if (result == ISC_R_SUCCESS) { /* - * We were allowed by the default - * "allow-query" ACL. Remember this so we - * don't have to check again. + * We were allowed by the "allow-query-cache" ACL. + * Remember this so we don't have to check again. */ client->query.attributes |= - NS_QUERYATTR_QUERYOK; + NS_QUERYATTR_CACHEACLOK; if (log && isc_log_wouldlog(ns_g_lctx, ISC_LOG_DEBUG(3))) { @@ -876,9 +873,9 @@ query_getcachedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype, } /* * We've now evaluated the view's query ACL, and - * the NS_QUERYATTR_QUERYOK attribute is now valid. + * the NS_QUERYATTR_CACHEACLOKVALID attribute is now valid. */ - client->query.attributes |= NS_QUERYATTR_QUERYOKVALID; + client->query.attributes |= NS_QUERYATTR_CACHEACLOKVALID; if (result != ISC_R_SUCCESS) goto refuse; diff --git a/bin/named/server.c b/bin/named/server.c index 8f67786..5fbe043 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.520.12.11.10.1 2010/03/03 22:06:36 marka Exp $ */ +/* $Id: server.c,v 1.520.12.11.10.4 2010/11/16 22:42:03 marka Exp $ */ /*! \file */ @@ -1132,6 +1132,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, dns_acache_setcachesize(view->acache, max_acache_size); } + CHECK(configure_view_acl(vconfig, config, "allow-query", actx, + ns_g_mctx, &view->queryacl)); + + if (view->queryacl == NULL) { + CHECK(configure_view_acl(NULL, ns_g_config, "allow-query", actx, + ns_g_mctx, &view->queryacl)); + } + /* * Configure the zones. */ @@ -1606,13 +1614,13 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, * configured in named.conf. */ CHECK(configure_view_acl(vconfig, config, "allow-query-cache", - actx, ns_g_mctx, &view->queryacl)); + actx, ns_g_mctx, &view->cacheacl)); CHECK(configure_view_acl(vconfig, config, "allow-query-cache-on", - actx, ns_g_mctx, &view->queryonacl)); - if (view->queryonacl == NULL) + actx, ns_g_mctx, &view->cacheonacl)); + if (view->cacheonacl == NULL) CHECK(configure_view_acl(NULL, ns_g_config, "allow-query-cache-on", actx, - ns_g_mctx, &view->queryonacl)); + ns_g_mctx, &view->cacheonacl)); if (strcmp(view->name, "_bind") != 0) { CHECK(configure_view_acl(vconfig, config, "allow-recursion", actx, ns_g_mctx, @@ -1628,14 +1636,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, * "allow-recursion" inherits from "allow-query-cache" if set, * otherwise from "allow-query" if set. */ - if (view->queryacl == NULL && view->recursionacl != NULL) - dns_acl_attach(view->recursionacl, &view->queryacl); - if (view->queryacl == NULL && view->recursion) + if (view->cacheacl == NULL && view->recursionacl != NULL) + dns_acl_attach(view->recursionacl, &view->cacheacl); + if (view->cacheacl == NULL && view->recursion) CHECK(configure_view_acl(vconfig, config, "allow-query", - actx, ns_g_mctx, &view->queryacl)); + actx, ns_g_mctx, &view->cacheacl)); if (view->recursion && - view->recursionacl == NULL && view->queryacl != NULL) - dns_acl_attach(view->queryacl, &view->recursionacl); + view->recursionacl == NULL && view->cacheacl != NULL) + dns_acl_attach(view->cacheacl, &view->recursionacl); /* * Set default "allow-recursion", "allow-recursion-on" and @@ -1651,16 +1659,13 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, "allow-recursion-on", actx, ns_g_mctx, &view->recursiononacl)); - if (view->queryacl == NULL) { + if (view->cacheacl == NULL) { if (view->recursion) CHECK(configure_view_acl(NULL, ns_g_config, "allow-query-cache", actx, - ns_g_mctx, &view->queryacl)); - else { - if (view->queryacl != NULL) - dns_acl_detach(&view->queryacl); - CHECK(dns_acl_none(ns_g_mctx, &view->queryacl)); - } + ns_g_mctx, &view->cacheacl)); + else + CHECK(dns_acl_none(ns_g_mctx, &view->cacheacl)); } /* diff --git a/lib/dns/api b/lib/dns/api index b1adf784..82e6786 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 57 +LIBINTERFACE = 58 LIBREVISION = 0 -LIBAGE = 2 +LIBAGE = 0 diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h index 5b53c16..0b4dedc 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.h,v 1.111.88.4 2009/01/29 22:40:35 jinmei Exp $ */ +/* $Id: view.h,v 1.111.88.4.24.2 2010/09/29 23:46:31 tbox Exp $ */ #ifndef DNS_VIEW_H #define DNS_VIEW_H 1 @@ -118,6 +118,8 @@ struct dns_view { isc_boolean_t enablevalidation; isc_boolean_t acceptexpired; dns_transfer_format_t transfer_format; + dns_acl_t * cacheacl; + dns_acl_t * cacheonacl; dns_acl_t * queryacl; dns_acl_t * queryonacl; dns_acl_t * recursionacl; diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 638e647..933576f 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: journal.c,v 1.103.48.6 2009/11/04 23:47:25 tbox Exp $ */ +/* $Id: journal.c,v 1.103.48.6.10.2 2010/11/17 23:46:16 tbox Exp $ */ #include @@ -2173,6 +2173,12 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, isc_uint32_t serial, indexend = new->header.end.offset; } + + /* + * Close both journals before trying to rename files (this is + * necessary on WIN32). + */ + dns_journal_destroy(&j); dns_journal_destroy(&new); /* @@ -2180,12 +2186,14 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, isc_uint32_t serial, * Any IXFR outs will just continue and the old journal will be * removed on final close. * - * With MSDOS / NTFS we need to do a two stage rename triggered - * bu EEXISTS. Hopefully all IXFR's that were active at the last - * rename are now complete. + * With MSDOS / NTFS we need to do a two stage rename, triggered + * by EEXIST. (If any IXFR's are running in other threads, however, + * this will fail, and the journal will not be compacted. But + * if so, hopefully they'll be finished by the next time we + * compact.) */ if (rename(newname, filename) == -1) { - if (errno == EACCES && !is_backup) { + if (errno == EEXIST && !is_backup) { result = isc_file_remove(backup); if (result != ISC_R_SUCCESS && result != ISC_R_FILENOTFOUND) @@ -2202,7 +2210,6 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, isc_uint32_t serial, } } - dns_journal_destroy(&j); result = ISC_R_SUCCESS; failure: diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 538c228..f61b83b 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.16.10.3 2010/08/13 07:25:21 marka Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.16.10.6 2010/11/16 07:46:23 marka Exp $ */ /*! \file */ @@ -5421,14 +5421,14 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, dns_rdataset_t *addedrdataset, isc_stdtime_t now) { rbtdb_changed_t *changed = NULL; - rdatasetheader_t *topheader, *topheader_prev, *header; + rdatasetheader_t *topheader, *topheader_prev, *header, *sigheader; unsigned char *merged; isc_result_t result; isc_boolean_t header_nx; isc_boolean_t newheader_nx; isc_boolean_t merge; dns_rdatatype_t rdtype, covers; - rbtdb_rdatatype_t negtype; + rbtdb_rdatatype_t negtype, sigtype; dns_trust_t trust; int idx; @@ -5466,7 +5466,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE; topheader_prev = NULL; - + sigheader = NULL; negtype = 0; if (rbtversion == NULL && !newheader_nx) { rdtype = RBTDB_RDATATYPE_BASE(newheader->type); @@ -5475,26 +5475,34 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, * We're adding a negative cache entry. */ covers = RBTDB_RDATATYPE_EXT(newheader->type); - if (covers == dns_rdatatype_any) { + sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, + covers); + for (topheader = rbtnode->data; + topheader != NULL; + topheader = topheader->next) { /* - * We're adding an negative cache entry + * If we're adding an negative cache entry * which covers all types (NXDOMAIN, * NODATA(QTYPE=ANY)). * * We make all other data stale so that the * only rdataset that can be found at this * node is the negative cache entry. + * + * Otherwise look for any RRSIGs of the + * given type so they can be marked stale + * later. */ - for (topheader = rbtnode->data; - topheader != NULL; - topheader = topheader->next) { + if (covers == dns_rdatatype_any) { set_ttl(rbtdb, topheader, 0); topheader->attributes |= RDATASET_ATTR_STALE; - } - rbtnode->dirty = 1; - goto find_header; + rbtnode->dirty = 1; + } else if (topheader->type == sigtype) + sigheader = topheader; } + if (covers == dns_rdatatype_any) + goto find_header; negtype = RBTDB_RDATATYPE_VALUE(covers, 0); } else { /* @@ -5732,6 +5740,11 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, if (rbtversion == NULL) { set_ttl(rbtdb, header, 0); header->attributes |= RDATASET_ATTR_STALE; + if (sigheader != NULL) { + set_ttl(rbtdb, sigheader, 0); + sigheader->attributes |= + RDATASET_ATTR_STALE; + } } idx = newheader->node->locknum; if (IS_CACHE(rbtdb)) { @@ -7071,6 +7084,8 @@ dns_rbtdb_create * change. */ if (!IS_CACHE(rbtdb)) { + dns_rbtnode_t *nsec3node; + rbtdb->origin_node = NULL; result = dns_rbt_addnode(rbtdb->tree, &rbtdb->common.origin, &rbtdb->origin_node); @@ -7094,6 +7109,32 @@ dns_rbtdb_create dns_name_hash(&name, ISC_TRUE) % rbtdb->node_lock_count; #endif + /* + * Add an apex node to the NSEC3 tree so that NSEC3 searches + * return partial matches when there is only a single NSEC3 + * record in the tree. + */ + nsec3node = NULL; + result = dns_rbt_addnode(rbtdb->nsec3, &rbtdb->common.origin, + &nsec3node); + if (result != ISC_R_SUCCESS) { + INSIST(result != ISC_R_EXISTS); + free_rbtdb(rbtdb, ISC_FALSE, NULL); + return (result); + } + nsec3node->nsec3 = 1; + /* + * We need to give the nsec3 origin node the right locknum. + */ + dns_name_init(&name, NULL); + dns_rbt_namefromnode(nsec3node, &name); +#ifdef DNS_RBT_USEHASH + nsec3node->locknum = nsec3node->hashval % + rbtdb->node_lock_count; +#else + nsec3node->locknum = dns_name_hash(&name, ISC_TRUE) % + rbtdb->node_lock_count; +#endif } /* diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 90c18bc..fc6f454 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.11.10.6 2010/09/03 02:55:18 marka Exp $ */ +/* $Id: validator.c,v 1.164.12.11.10.7 2010/11/16 01:48:32 marka Exp $ */ #include @@ -393,6 +393,7 @@ fetch_callback_validator(isc_task_t *task, isc_event_t *event) { isc_boolean_t want_destroy; isc_result_t result; isc_result_t eresult; + isc_result_t saved_result; UNUSED(task); INSIST(event->ev_type == DNS_EVENT_FETCHDONE); @@ -429,6 +430,17 @@ fetch_callback_validator(isc_task_t *task, isc_event_t *event) { val->keyset = &val->frdataset; } result = validate(val, ISC_TRUE); + if (result == DNS_R_NOVALIDSIG && + (val->attributes & VALATTR_TRIEDVERIFY) == 0) + { + saved_result = result; + validator_log(val, ISC_LOG_DEBUG(3), + "falling back to insecurity proof"); + val->attributes |= VALATTR_INSECURITY; + result = proveunsecure(val, ISC_FALSE, ISC_FALSE); + if (result == DNS_R_NOTINSECURE) + result = saved_result; + } if (result != DNS_R_WAIT) validator_done(val, result); } else { @@ -619,6 +631,7 @@ keyvalidated(isc_task_t *task, isc_event_t *event) { isc_boolean_t want_destroy; isc_result_t result; isc_result_t eresult; + isc_result_t saved_result; UNUSED(task); INSIST(event->ev_type == DNS_EVENT_VALIDATORDONE); @@ -645,6 +658,17 @@ keyvalidated(isc_task_t *task, isc_event_t *event) { if (val->frdataset.trust >= dns_trust_secure) (void) get_dst_key(val, val->siginfo, &val->frdataset); result = validate(val, ISC_TRUE); + if (result == DNS_R_NOVALIDSIG && + (val->attributes & VALATTR_TRIEDVERIFY) == 0) + { + saved_result = result; + validator_log(val, ISC_LOG_DEBUG(3), + "falling back to insecurity proof"); + val->attributes |= VALATTR_INSECURITY; + result = proveunsecure(val, ISC_FALSE, ISC_FALSE); + if (result == DNS_R_NOTINSECURE) + result = saved_result; + } if (result != DNS_R_WAIT) validator_done(val, result); } else { @@ -1875,9 +1899,11 @@ validate(dns_validator_t *val, isc_boolean_t resume) { * was known and "sufficiently good". */ if (!dns_resolver_algorithm_supported(val->view->resolver, - event->name, - val->siginfo->algorithm)) + event->name, + val->siginfo->algorithm)) { + resume = ISC_FALSE; continue; + } if (!resume) { result = get_key(val, val->siginfo); @@ -1888,16 +1914,12 @@ validate(dns_validator_t *val, isc_boolean_t resume) { } /* - * The key is insecure, so mark the data as insecure also. + * There isn't a secure DNSKEY for this signature so move + * onto the next RRSIG. */ if (val->key == NULL) { - if (val->mustbesecure) { - validator_log(val, ISC_LOG_WARNING, - "must be secure failure"); - return (DNS_R_MUSTBESECURE); - } - markanswer(val, "validate"); - return (ISC_R_SUCCESS); + resume = ISC_FALSE; + continue; } do { @@ -3703,6 +3725,20 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) */ result = DNS_R_NOVALIDNSEC; goto out; + } else if (DNS_TRUST_PENDING(val->frdataset.trust) || + DNS_TRUST_ANSWER(val->frdataset.trust)) { + /* + * If we have "trust == answer" then this namespace + * has switched from insecure to should be secure. + */ + result = create_validator(val, tname, + dns_rdatatype_ds, + &val->frdataset, + NULL, dsvalidated, + "proveunsecure"); + if (result != ISC_R_SUCCESS) + goto out; + return (DNS_R_WAIT); } else if (val->frdataset.trust < dns_trust_secure) { /* * This shouldn't happen, since the negative diff --git a/lib/dns/view.c b/lib/dns/view.c index 3726eef..54f0d26 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.150.84.3.10.1 2010/03/03 22:06:39 marka Exp $ */ +/* $Id: view.c,v 1.150.84.3.10.2 2010/09/29 00:03:32 marka Exp $ */ /*! \file */ @@ -168,6 +168,8 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, view->acceptexpired = ISC_FALSE; view->minimalresponses = ISC_FALSE; view->transfer_format = dns_one_answer; + view->cacheacl = NULL; + view->cacheonacl = NULL; view->queryacl = NULL; view->queryonacl = NULL; view->recursionacl = NULL; @@ -294,6 +296,10 @@ destroy(dns_view_t *view) { dns_acl_detach(&view->matchclients); if (view->matchdestinations != NULL) dns_acl_detach(&view->matchdestinations); + if (view->cacheacl != NULL) + dns_acl_detach(&view->cacheacl); + if (view->cacheonacl != NULL) + dns_acl_detach(&view->cacheonacl); if (view->queryacl != NULL) dns_acl_detach(&view->queryacl); if (view->queryonacl != NULL) diff --git a/lib/isc/api b/lib/isc/api index 823f692..b765f45 100644 --- a/lib/isc/api +++ b/lib/isc/api @@ -1,3 +1,3 @@ LIBINTERFACE = 53 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 3 diff --git a/lib/isc/print.c b/lib/isc/print.c index b892e3a..6b98195 100644 --- a/lib/isc/print.c +++ b/lib/isc/print.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: print.c,v 1.35 2008/02/18 23:46:59 tbox Exp $ */ +/* $Id: print.c,v 1.35.418.2 2010/10/18 23:46:34 tbox Exp $ */ /*! \file */ @@ -468,7 +468,7 @@ isc_print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { if (width > 0) { count += width; width--; - if (left) { + if (left && size > 1) { *str++ = c; size--; } diff --git a/release-notes.css b/release-notes.css new file mode 100644 index 0000000..411eb8b --- /dev/null +++ b/release-notes.css @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: release-notes.css,v 1.1.4.3 2010/11/29 01:16:39 tbox Exp $ */ + +body { + background-color: #ffffff; + color: #333333; + font-family: "Helvetica Neue", "ArialMT", "Verdana", "Arial", "Helvetica", sans-serif; + font-size: 14px; + line-height: 18px; + margin: 2em auto; + width: 700px; +} + +.command { + font-family: "Courier New", "Courier", monospace; + font-weight: normal; +} + +.note { + background-color: #ddeedd; + border: 1px solid #aaccaa; + margin: 1em 0 1em 0; + padding: 0.5em 1em 0.5em 1em; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +.screen { + background-color: #ffffee; + border: 1px solid #ddddaa; + padding: 0.25em 1em 0.25em 1em; + margin: 1em 0 1em 0; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +.section.title { + font-size: 150%; + font-weight: bold; +} + +.section.section.title { + font-size: 130%; + font-weight: bold; +} diff --git a/version b/version index a16a96f..d736ecf 100644 --- a/version +++ b/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.8.4.3 2010/09/03 02:57:11 marka Exp $ +# $Id: version,v 1.43.12.8.4.4 2010/11/18 23:37:13 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -7,4 +7,4 @@ MAJORVER=9 MINORVER=6 PATCHVER= RELEASETYPE=-ESV -RELEASEVER=-R2 +RELEASEVER=-R3 -- cgit v1.1 From 0aa625fd3eabc94d04a6f62212d07b95cbbb1fc4 Mon Sep 17 00:00:00 2001 From: jfv Date: Sat, 4 Dec 2010 01:43:38 +0000 Subject: This small little change is a bug that drove me nuts finding. The test to compare the mbuf m_len against a fixed value and then returning needs to be removed. When using VLANS and doing HW_TAGGING, and IPV6, the ICMP6 packets actually fail this condition, the constant assumes that the tag is IN the frame, and its not, so the length is actually tiny. Furthermore, I'm not sure what the point was to just return?? MFC after: 3 days --- sys/dev/ixgbe/ixgbe.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index 338172a..e246bf3 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -46,7 +46,7 @@ int ixgbe_display_debug_stats = 0; /********************************************************************* * Driver version *********************************************************************/ -char ixgbe_driver_version[] = "2.3.6"; +char ixgbe_driver_version[] = "2.3.7"; /********************************************************************* * PCI Device ID Table @@ -3023,16 +3023,12 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) case ETHERTYPE_IP: ip = (struct ip *)(mp->m_data + ehdrlen); ip_hlen = ip->ip_hl << 2; - if (mp->m_len < ehdrlen + ip_hlen) - return (FALSE); ipproto = ip->ip_p; type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; break; case ETHERTYPE_IPV6: ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen); ip_hlen = sizeof(struct ip6_hdr); - if (mp->m_len < ehdrlen + ip_hlen) - return (FALSE); ipproto = ip6->ip6_nxt; type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6; break; -- cgit v1.1 From 48a970ffdb4ed5c9babeba6cf49cc9ed74aac7a9 Mon Sep 17 00:00:00 2001 From: jfv Date: Sat, 4 Dec 2010 01:59:58 +0000 Subject: Small cut and paste bug in flow control string fixed. Second, correct the discard/refresh_mbufs code to behave more like igb, there have been panics due to discards and this should fix them. MFC after: 3 days --- sys/dev/e1000/if_em.c | 68 ++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 6728a98..03e0e04 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -525,7 +525,7 @@ em_attach(device_t dev) /* Sysctl for setting the interface flow control */ em_set_flow_cntrl(adapter, "flow_control", - "max number of rx packets to process", + "configure flow control", &adapter->fc_setting, em_fc_setting); /* @@ -3751,46 +3751,43 @@ em_refresh_mbufs(struct rx_ring *rxr, int limit) cleaned = -1; while (i != limit) { rxbuf = &rxr->rx_buffers[i]; - /* - ** Just skip entries with a buffer, - ** they can only be due to an error - ** and are to be reused. - */ - if (rxbuf->m_head != NULL) - goto reuse; - m = m_getjcl(M_DONTWAIT, MT_DATA, - M_PKTHDR, adapter->rx_mbuf_sz); - /* - ** If we have a temporary resource shortage - ** that causes a failure, just abort refresh - ** for now, we will return to this point when - ** reinvoked from em_rxeof. - */ - if (m == NULL) - goto update; + if (rxbuf->m_head == NULL) { + m = m_getjcl(M_DONTWAIT, MT_DATA, + M_PKTHDR, adapter->rx_mbuf_sz); + /* + ** If we have a temporary resource shortage + ** that causes a failure, just abort refresh + ** for now, we will return to this point when + ** reinvoked from em_rxeof. + */ + if (m == NULL) + goto update; + } else + m = rxbuf->m_head; + m->m_len = m->m_pkthdr.len = adapter->rx_mbuf_sz; + m->m_flags |= M_PKTHDR; + m->m_data = m->m_ext.ext_buf; /* Use bus_dma machinery to setup the memory mapping */ error = bus_dmamap_load_mbuf_sg(rxr->rxtag, rxbuf->map, m, segs, &nsegs, BUS_DMA_NOWAIT); if (error != 0) { + printf("Refresh mbufs: hdr dmamap load" + " failure - %d\n", error); m_free(m); + rxbuf->m_head = NULL; goto update; } - - /* If nsegs is wrong then the stack is corrupt. */ - KASSERT(nsegs == 1, ("Too many segments returned!")); - + rxbuf->m_head = m; bus_dmamap_sync(rxr->rxtag, rxbuf->map, BUS_DMASYNC_PREREAD); - rxbuf->m_head = m; rxr->rx_base[i].buffer_addr = htole64(segs[0].ds_addr); -reuse: + cleaned = i; /* Calculate next index */ if (++i == adapter->num_rx_desc) i = 0; - /* This is the work marker for refresh */ rxr->next_to_refresh = i; } update: @@ -4208,8 +4205,8 @@ em_rxeof(struct rx_ring *rxr, int count, int *done) len = le16toh(cur->length); eop = (status & E1000_RXD_STAT_EOP) != 0; - if ((rxr->discard == TRUE) || (cur->errors & - E1000_RXD_ERR_FRAME_ERR_MASK)) { + if ((cur->errors & E1000_RXD_ERR_FRAME_ERR_MASK) || + (rxr->discard == TRUE)) { ifp->if_ierrors++; ++rxr->rx_discarded; if (!eop) /* Catch subsequent segs */ @@ -4308,7 +4305,6 @@ em_rx_discard(struct rx_ring *rxr, int i) { struct adapter *adapter = rxr->adapter; struct em_buffer *rbuf; - struct mbuf *m; rbuf = &rxr->rx_buffers[i]; /* Free any previous pieces */ @@ -4318,14 +4314,14 @@ em_rx_discard(struct rx_ring *rxr, int i) rxr->fmp = NULL; rxr->lmp = NULL; } - - /* Reset state, keep loaded DMA map and reuse */ - m = rbuf->m_head; - m->m_len = m->m_pkthdr.len = adapter->rx_mbuf_sz; - m->m_flags |= M_PKTHDR; - m->m_data = m->m_ext.ext_buf; - m->m_next = NULL; - + /* + ** Free buffer and allow em_refresh_mbufs() + ** to clean up and recharge buffer. + */ + if (rbuf->m_head) { + m_free(rbuf->m_head); + rbuf->m_head = NULL; + } return; } -- cgit v1.1 From dbee1ed36918498ee50d9c27654275342f9e465d Mon Sep 17 00:00:00 2001 From: jfv Date: Sat, 4 Dec 2010 02:04:02 +0000 Subject: Remove the bogus test in the TX context setup for IPV6, the size can be smaller than the constant when you are doing HW TAGGING, and you still need to process this packet in a normal way. I'm not sure where the notion to just return came from, but its wrong. MFC after: 3 days --- sys/dev/e1000/if_igb.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c index 14ccede..ff3c2cf 100644 --- a/sys/dev/e1000/if_igb.c +++ b/sys/dev/e1000/if_igb.c @@ -3429,8 +3429,6 @@ igb_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) case ETHERTYPE_IPV6: ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen); ip_hlen = sizeof(struct ip6_hdr); - if (mp->m_len < ehdrlen + ip_hlen) - return (FALSE); ipproto = ip6->ip6_nxt; type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_IPV6; break; -- cgit v1.1 From 0ff0fd520ddd39c32c55398023b24fe199cbc02b Mon Sep 17 00:00:00 2001 From: nwhitehorn Date: Sat, 4 Dec 2010 02:42:52 +0000 Subject: Add an abstraction layer to the 64-bit AIM MMU's page table manipulation logic to support modifying the page table through a hypervisor. This uses KOBJ inheritance to provide subclasses of the base 64-bit AIM MMU class with additional methods for page table manipulation. Many thanks to Peter Grehan for suggesting this design and implementing the MMU KOBJ inheritance mechanism. --- sys/conf/files.powerpc | 2 + sys/powerpc/aim/mmu_oea.c | 18 - sys/powerpc/aim/mmu_oea64.c | 780 ++++++++-------------------------------- sys/powerpc/aim/mmu_oea64.h | 77 ++++ sys/powerpc/aim/moea64_if.m | 115 ++++++ sys/powerpc/aim/moea64_native.c | 637 ++++++++++++++++++++++++++++++++ sys/powerpc/include/pmap.h | 19 + 7 files changed, 1004 insertions(+), 644 deletions(-) create mode 100644 sys/powerpc/aim/mmu_oea64.h create mode 100644 sys/powerpc/aim/moea64_if.m create mode 100644 sys/powerpc/aim/moea64_native.c diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index 83f75c4..4856715 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -83,6 +83,8 @@ powerpc/aim/locore.S optional aim no-obj powerpc/aim/machdep.c optional aim powerpc/aim/mmu_oea.c optional aim powerpc powerpc/aim/mmu_oea64.c optional aim +powerpc/aim/moea64_if.m optional aim +powerpc/aim/moea64_native.c optional aim powerpc/aim/mp_cpudep.c optional aim smp powerpc/aim/nexus.c optional aim powerpc/aim/ofwmagic.S optional aim diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index 7bd07e1..6f99081 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -161,24 +161,6 @@ __FBSDID("$FreeBSD$"); #define VSID_TO_SR(vsid) ((vsid) & 0xf) #define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff) -#define PVO_PTEGIDX_MASK 0x007 /* which PTEG slot */ -#define PVO_PTEGIDX_VALID 0x008 /* slot is valid */ -#define PVO_WIRED 0x010 /* PVO entry is wired */ -#define PVO_MANAGED 0x020 /* PVO entry is managed */ -#define PVO_EXECUTABLE 0x040 /* PVO entry is executable */ -#define PVO_BOOTSTRAP 0x080 /* PVO entry allocated during - bootstrap */ -#define PVO_FAKE 0x100 /* fictitious phys page */ -#define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) -#define PVO_ISEXECUTABLE(pvo) ((pvo)->pvo_vaddr & PVO_EXECUTABLE) -#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) -#define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) -#define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) -#define PVO_PTEGIDX_CLR(pvo) \ - ((void)((pvo)->pvo_vaddr &= ~(PVO_PTEGIDX_VALID|PVO_PTEGIDX_MASK))) -#define PVO_PTEGIDX_SET(pvo, i) \ - ((void)((pvo)->pvo_vaddr |= (i)|PVO_PTEGIDX_VALID)) - #define MOEA_PVO_CHECK(pvo) struct ofw_map { diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c index 506676f..cd791f8 100644 --- a/sys/powerpc/aim/mmu_oea64.c +++ b/sys/powerpc/aim/mmu_oea64.c @@ -155,79 +155,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include "mmu_oea64.h" #include "mmu_if.h" +#include "moea64_if.h" -#define MOEA_DEBUG - -#define TODO panic("%s: not implemented", __func__); void moea64_release_vsid(uint64_t vsid); uintptr_t moea64_get_unique_vsid(void); -static __inline register_t -cntlzd(volatile register_t a) { - register_t b; - __asm ("cntlzd %0, %1" : "=r"(b) : "r"(a)); - return b; -} - -#define PTESYNC() __asm __volatile("ptesync"); -#define TLBSYNC() __asm __volatile("tlbsync; ptesync"); -#define SYNC() __asm __volatile("sync"); -#define EIEIO() __asm __volatile("eieio"); - -/* - * The tlbie instruction must be executed in 64-bit mode - * so we have to twiddle MSR[SF] around every invocation. - * Just to add to the fun, exceptions must be off as well - * so that we can't trap in 64-bit mode. What a pain. - */ -struct mtx tlbie_mutex; - -static __inline void -TLBIE(uint64_t vpn) { -#ifndef __powerpc64__ - register_t vpn_hi, vpn_lo; - register_t msr; - register_t scratch; -#endif - - vpn <<= ADDR_PIDX_SHFT; - vpn &= ~(0xffffULL << 48); - - mtx_lock_spin(&tlbie_mutex); -#ifdef __powerpc64__ - __asm __volatile("\ - ptesync; \ - tlbie %0; \ - eieio; \ - tlbsync; \ - ptesync;" - :: "r"(vpn) : "memory"); -#else - vpn_hi = (uint32_t)(vpn >> 32); - vpn_lo = (uint32_t)vpn; - - __asm __volatile("\ - mfmsr %0; \ - mr %1, %0; \ - insrdi %1,%5,1,0; \ - mtmsrd %1; isync; \ - ptesync; \ - \ - sld %1,%2,%4; \ - or %1,%1,%3; \ - tlbie %1; \ - \ - mtmsrd %0; isync; \ - eieio; \ - tlbsync; \ - ptesync;" - : "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1) - : "memory"); -#endif - mtx_unlock_spin(&tlbie_mutex); -} - #define DISABLE_TRANS(msr) msr = mfmsr(); mtmsr(msr & ~PSL_DR); isync() #define ENABLE_TRANS(msr) mtmsr(msr); isync() @@ -235,24 +169,6 @@ TLBIE(uint64_t vpn) { #define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff) #define VSID_HASH_MASK 0x0000007fffffffffULL -#define PVO_PTEGIDX_MASK 0x007UL /* which PTEG slot */ -#define PVO_PTEGIDX_VALID 0x008UL /* slot is valid */ -#define PVO_WIRED 0x010UL /* PVO entry is wired */ -#define PVO_MANAGED 0x020UL /* PVO entry is managed */ -#define PVO_BOOTSTRAP 0x080UL /* PVO entry allocated during - bootstrap */ -#define PVO_FAKE 0x100UL /* fictitious phys page */ -#define PVO_LARGE 0x200UL /* large page */ -#define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) -#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) -#define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) -#define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) -#define PVO_PTEGIDX_CLR(pvo) \ - ((void)((pvo)->pvo_vaddr &= ~(PVO_PTEGIDX_VALID|PVO_PTEGIDX_MASK))) -#define PVO_PTEGIDX_SET(pvo, i) \ - ((void)((pvo)->pvo_vaddr |= (i)|PVO_PTEGIDX_VALID)) -#define PVO_VSID(pvo) ((pvo)->pvo_vpn >> 16) - #define MOEA_PVO_CHECK(pvo) #define LOCK_TABLE() mtx_lock(&moea64_table_mutex) @@ -277,7 +193,6 @@ static int regions_sz, pregions_sz; extern void bs_remap_earlyboot(void); - /* * Lock for the pteg and pvo tables. */ @@ -287,7 +202,6 @@ struct mtx moea64_slb_mutex; /* * PTEG data. */ -static struct lpteg *moea64_pteg_table; u_int moea64_pteg_count; u_int moea64_pteg_mask; @@ -337,8 +251,8 @@ SYSCTL_INT(_machdep, OID_AUTO, moea64_pvo_remove_calls, CTLFLAG_RD, &moea64_pvo_remove_calls, 0, ""); vm_offset_t moea64_scratchpage_va[2]; -uint64_t moea64_scratchpage_vpn[2]; -struct lpte *moea64_scratchpage_pte[2]; +struct pvo_entry *moea64_scratchpage_pvo[2]; +uintptr_t moea64_scratchpage_pte[2]; struct mtx moea64_scratchpage_mtx; uint64_t moea64_large_page_mask = 0; @@ -346,41 +260,23 @@ int moea64_large_page_size = 0; int moea64_large_page_shift = 0; /* - * Allocate physical memory for use in moea64_bootstrap. - */ -static vm_offset_t moea64_bootstrap_alloc(vm_size_t, u_int); - -/* - * PTE calls. - */ -static int moea64_pte_insert(u_int, struct lpte *); - -/* * PVO calls. */ -static int moea64_pvo_enter(pmap_t, uma_zone_t, struct pvo_head *, +static int moea64_pvo_enter(mmu_t, pmap_t, uma_zone_t, struct pvo_head *, vm_offset_t, vm_offset_t, uint64_t, int); -static void moea64_pvo_remove(struct pvo_entry *); +static void moea64_pvo_remove(mmu_t, struct pvo_entry *); static struct pvo_entry *moea64_pvo_find_va(pmap_t, vm_offset_t); -static struct lpte *moea64_pvo_to_pte(const struct pvo_entry *); /* * Utility routines. */ -static void moea64_bootstrap(mmu_t mmup, - vm_offset_t kernelstart, vm_offset_t kernelend); -static void moea64_cpu_bootstrap(mmu_t, int ap); -static void moea64_enter_locked(pmap_t, vm_offset_t, vm_page_t, - vm_prot_t, boolean_t); -static boolean_t moea64_query_bit(vm_page_t, u_int64_t); -static u_int moea64_clear_bit(vm_page_t, u_int64_t); +static void moea64_enter_locked(mmu_t, pmap_t, vm_offset_t, + vm_page_t, vm_prot_t, boolean_t); +static boolean_t moea64_query_bit(mmu_t, vm_page_t, u_int64_t); +static u_int moea64_clear_bit(mmu_t, vm_page_t, u_int64_t); static void moea64_kremove(mmu_t, vm_offset_t); -static void moea64_syncicache(pmap_t pmap, vm_offset_t va, +static void moea64_syncicache(mmu_t, pmap_t pmap, vm_offset_t va, vm_offset_t pa, vm_size_t sz); -static void tlbia(void); -#ifdef __powerpc64__ -static void slbia(void); -#endif /* * Kernel MMU interface @@ -463,8 +359,6 @@ static mmu_method_t moea64_methods[] = { MMUMETHOD(mmu_page_set_memattr, moea64_page_set_memattr), /* Internal interfaces */ - MMUMETHOD(mmu_bootstrap, moea64_bootstrap), - MMUMETHOD(mmu_cpu_bootstrap, moea64_cpu_bootstrap), MMUMETHOD(mmu_mapdev, moea64_mapdev), MMUMETHOD(mmu_mapdev_attr, moea64_mapdev_attr), MMUMETHOD(mmu_unmapdev, moea64_unmapdev), @@ -476,7 +370,7 @@ static mmu_method_t moea64_methods[] = { { 0, 0 } }; -MMU_DEF(oea64_mmu, MMU_TYPE_G5, moea64_methods, 0); +MMU_DEF(oea64_mmu, "mmu_oea64_base", moea64_methods, 0); static __inline u_int va_to_pteg(uint64_t vsid, vm_offset_t addr, int large) @@ -542,81 +436,6 @@ moea64_pte_create(struct lpte *pt, uint64_t vsid, vm_offset_t va, pt->pte_lo = pte_lo; } -static __inline void -moea64_pte_synch(struct lpte *pt, struct lpte *pvo_pt) -{ - - ASSERT_TABLE_LOCK(); - - pvo_pt->pte_lo |= pt->pte_lo & (LPTE_REF | LPTE_CHG); -} - -static __inline void -moea64_pte_clear(struct lpte *pt, uint64_t vpn, u_int64_t ptebit) -{ - ASSERT_TABLE_LOCK(); - - /* - * As shown in Section 7.6.3.2.3 - */ - pt->pte_lo &= ~ptebit; - TLBIE(vpn); -} - -static __inline void -moea64_pte_set(struct lpte *pt, struct lpte *pvo_pt) -{ - - ASSERT_TABLE_LOCK(); - pvo_pt->pte_hi |= LPTE_VALID; - - /* - * Update the PTE as defined in section 7.6.3.1. - * Note that the REF/CHG bits are from pvo_pt and thus should have - * been saved so this routine can restore them (if desired). - */ - pt->pte_lo = pvo_pt->pte_lo; - EIEIO(); - pt->pte_hi = pvo_pt->pte_hi; - PTESYNC(); - moea64_pte_valid++; -} - -static __inline void -moea64_pte_unset(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) -{ - ASSERT_TABLE_LOCK(); - pvo_pt->pte_hi &= ~LPTE_VALID; - - /* - * Force the reg & chg bits back into the PTEs. - */ - SYNC(); - - /* - * Invalidate the pte. - */ - pt->pte_hi &= ~LPTE_VALID; - TLBIE(vpn); - - /* - * Save the reg & chg bits. - */ - moea64_pte_synch(pt, pvo_pt); - moea64_pte_valid--; -} - -static __inline void -moea64_pte_change(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) -{ - - /* - * Invalidate the PTE - */ - moea64_pte_unset(pt, pvo_pt, vpn); - moea64_pte_set(pt, pvo_pt); -} - static __inline uint64_t moea64_calc_wimg(vm_offset_t pa, vm_memattr_t ma) { @@ -696,49 +515,6 @@ om_cmp(const void *a, const void *b) } static void -moea64_cpu_bootstrap(mmu_t mmup, int ap) -{ - int i = 0; - #ifdef __powerpc64__ - struct slb *slb = PCPU_GET(slb); - #endif - - /* - * Initialize segment registers and MMU - */ - - mtmsr(mfmsr() & ~PSL_DR & ~PSL_IR); isync(); - - /* - * Install kernel SLB entries - */ - - #ifdef __powerpc64__ - slbia(); - - for (i = 0; i < 64; i++) { - if (!(slb[i].slbe & SLBE_VALID)) - continue; - - __asm __volatile ("slbmte %0, %1" :: - "r"(slb[i].slbv), "r"(slb[i].slbe)); - } - #else - for (i = 0; i < 16; i++) - mtsrin(i << ADDR_SR_SHFT, kernel_pmap->pm_sr[i]); - #endif - - /* - * Install page table - */ - - __asm __volatile ("ptesync; mtsdr1 %0; isync" - :: "r"((uintptr_t)moea64_pteg_table - | (64 - cntlzd(moea64_pteg_mask >> 11)))); - tlbia(); -} - -static void moea64_add_ofw_mappings(mmu_t mmup, phandle_t mmu, size_t sz) { struct ofw_map translations[sz/sizeof(struct ofw_map)]; @@ -874,7 +650,7 @@ moea64_setup_direct_map(mmu_t mmup, vm_offset_t kernelstart, pregions[i].mr_start + pregions[i].mr_size) pte_lo |= LPTE_G; - moea64_pvo_enter(kernel_pmap, moea64_upvo_zone, + moea64_pvo_enter(mmup, kernel_pmap, moea64_upvo_zone, &moea64_pvo_kunmanaged, pa, pa, pte_lo, PVO_WIRED | PVO_LARGE | VM_PROT_EXECUTE); @@ -882,10 +658,6 @@ moea64_setup_direct_map(mmu_t mmup, vm_offset_t kernelstart, } PMAP_UNLOCK(kernel_pmap); } else { - size = moea64_pteg_count * sizeof(struct lpteg); - off = (vm_offset_t)(moea64_pteg_table); - for (pa = off; pa < off + size; pa += PAGE_SIZE) - moea64_kenter(mmup, pa, pa); size = sizeof(struct pvo_head) * moea64_pteg_count; off = (vm_offset_t)(moea64_pvo_table); for (pa = off; pa < off + size; pa += PAGE_SIZE) @@ -911,18 +683,11 @@ moea64_setup_direct_map(mmu_t mmup, vm_offset_t kernelstart, ENABLE_TRANS(msr); } -static void -moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) +void +moea64_early_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) { - ihandle_t mmui; - phandle_t chosen; - phandle_t mmu; - size_t sz; int i, j; - vm_size_t size, physsz, hwphyssz; - vm_offset_t pa, va; - register_t msr; - void *dpcpu; + vm_size_t physsz, hwphyssz; #ifndef __powerpc64__ /* We don't have a direct map since there is no BAT */ @@ -1009,9 +774,6 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) physmem = btoc(physsz); - /* - * Allocate PTEG table. - */ #ifdef PTEGCOUNT moea64_pteg_count = PTEGCOUNT; #else @@ -1022,27 +784,20 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) moea64_pteg_count >>= 1; #endif /* PTEGCOUNT */ +} - size = moea64_pteg_count * sizeof(struct lpteg); - CTR2(KTR_PMAP, "moea64_bootstrap: %d PTEGs, %d bytes", - moea64_pteg_count, size); +void +moea64_mid_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) +{ + vm_size_t size; + register_t msr; + int i; /* - * We now need to allocate memory. This memory, to be allocated, - * has to reside in a page table. The page table we are about to - * allocate. We don't have BAT. So drop to data real mode for a minute - * as a measure of last resort. We do this a couple times. + * Set PTEG mask */ - - moea64_pteg_table = (struct lpteg *)moea64_bootstrap_alloc(size, size); - DISABLE_TRANS(msr); - bzero((void *)moea64_pteg_table, moea64_pteg_count * sizeof(struct lpteg)); - ENABLE_TRANS(msr); - moea64_pteg_mask = moea64_pteg_count - 1; - CTR1(KTR_PMAP, "moea64_bootstrap: PTEG table at %p", moea64_pteg_table); - /* * Allocate pv/overflow lists. */ @@ -1066,11 +821,6 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) mtx_init(&moea64_slb_mutex, "SLB table", NULL, MTX_DEF); /* - * Initialize the TLBIE lock. TLBIE can only be executed by one CPU. - */ - mtx_init(&tlbie_mutex, "tlbie mutex", NULL, MTX_SPIN); - - /* * Initialise the unmanaged pvo pool. */ moea64_bpvo_pool = (struct pvo_entry *)moea64_bootstrap_alloc( @@ -1109,6 +859,18 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) */ moea64_setup_direct_map(mmup, kernelstart, kernelend); +} + +void +moea64_late_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) +{ + ihandle_t mmui; + phandle_t chosen; + phandle_t mmu; + size_t sz; + int i; + vm_offset_t pa, va; + void *dpcpu; /* * Set up the Open Firmware pmap and add its mappings if not in real @@ -1137,7 +899,7 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) /* * Initialize MMU and remap early physical mappings */ - moea64_cpu_bootstrap(mmup,0); + MMU_CPU_BOOTSTRAP(mmup,0); mtmsr(mfmsr() | PSL_DR | PSL_IR); isync(); pmap_bootstrapped++; bs_remap_earlyboot(); @@ -1173,47 +935,6 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) #endif /* - * Allocate some things for page zeroing. We put this directly - * in the page table, marked with LPTE_LOCKED, to avoid any - * of the PVO book-keeping or other parts of the VM system - * from even knowing that this hack exists. - */ - - if (!hw_direct_map) { - mtx_init(&moea64_scratchpage_mtx, "pvo zero page", NULL, - MTX_DEF); - for (i = 0; i < 2; i++) { - struct lpte pt; - uint64_t vsid; - int pteidx, ptegidx; - - moea64_scratchpage_va[i] = (virtual_end+1) - PAGE_SIZE; - virtual_end -= PAGE_SIZE; - - LOCK_TABLE(); - - vsid = va_to_vsid(kernel_pmap, - moea64_scratchpage_va[i]); - moea64_pte_create(&pt, vsid, moea64_scratchpage_va[i], - LPTE_NOEXEC, 0); - pt.pte_hi |= LPTE_LOCKED; - - moea64_scratchpage_vpn[i] = (vsid << 16) | - ((moea64_scratchpage_va[i] & ADDR_PIDX) >> - ADDR_PIDX_SHFT); - ptegidx = va_to_pteg(vsid, moea64_scratchpage_va[i], 0); - pteidx = moea64_pte_insert(ptegidx, &pt); - if (pt.pte_hi & LPTE_HID) - ptegidx ^= moea64_pteg_mask; - - moea64_scratchpage_pte[i] = - &moea64_pteg_table[ptegidx].pt[pteidx]; - - UNLOCK_TABLE(); - } - } - - /* * Allocate a kernel stack with a guard page for thread0 and map it * into the kernel page map. */ @@ -1255,6 +976,36 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) va += PAGE_SIZE; } dpcpu_init(dpcpu, 0); + + /* + * Allocate some things for page zeroing. We put this directly + * in the page table, marked with LPTE_LOCKED, to avoid any + * of the PVO book-keeping or other parts of the VM system + * from even knowing that this hack exists. + */ + + if (!hw_direct_map) { + mtx_init(&moea64_scratchpage_mtx, "pvo zero page", NULL, + MTX_DEF); + for (i = 0; i < 2; i++) { + moea64_scratchpage_va[i] = (virtual_end+1) - PAGE_SIZE; + virtual_end -= PAGE_SIZE; + + moea64_kenter(mmup, moea64_scratchpage_va[i], 0); + + moea64_scratchpage_pvo[i] = moea64_pvo_find_va( + kernel_pmap, (vm_offset_t)moea64_scratchpage_va[i]); + LOCK_TABLE(); + moea64_scratchpage_pte[i] = MOEA64_PVO_TO_PTE( + mmup, moea64_scratchpage_pvo[i]); + moea64_scratchpage_pvo[i]->pvo_pte.lpte.pte_hi + |= LPTE_LOCKED; + MOEA64_PTE_CHANGE(mmup, moea64_scratchpage_pte[i], + &moea64_scratchpage_pvo[i]->pvo_pte.lpte, + moea64_scratchpage_pvo[i]->pvo_vpn); + UNLOCK_TABLE(); + } + } } /* @@ -1294,7 +1045,7 @@ void moea64_change_wiring(mmu_t mmu, pmap_t pm, vm_offset_t va, boolean_t wired) { struct pvo_entry *pvo; - struct lpte *pt; + uintptr_t pt; uint64_t vsid; int i, ptegidx; @@ -1303,7 +1054,7 @@ moea64_change_wiring(mmu_t mmu, pmap_t pm, vm_offset_t va, boolean_t wired) if (pvo != NULL) { LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); if (wired) { if ((pvo->pvo_vaddr & PVO_WIRED) == 0) @@ -1317,9 +1068,9 @@ moea64_change_wiring(mmu_t mmu, pmap_t pm, vm_offset_t va, boolean_t wired) pvo->pvo_pte.lpte.pte_hi &= ~LPTE_WIRED; } - if (pt != NULL) { + if (pt != -1) { /* Update wiring flag in page table. */ - moea64_pte_change(pt, &pvo->pvo_pte.lpte, + MOEA64_PTE_CHANGE(mmu, pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); } else if (wired) { /* @@ -1330,7 +1081,8 @@ moea64_change_wiring(mmu_t mmu, pmap_t pm, vm_offset_t va, boolean_t wired) ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo), pvo->pvo_vaddr & PVO_LARGE); - i = moea64_pte_insert(ptegidx, &pvo->pvo_pte.lpte); + i = MOEA64_PTE_INSERT(mmu, ptegidx, &pvo->pvo_pte.lpte); + if (i >= 0) { PVO_PTEGIDX_CLR(pvo); PVO_PTEGIDX_SET(pvo, i); @@ -1350,22 +1102,18 @@ moea64_change_wiring(mmu_t mmu, pmap_t pm, vm_offset_t va, boolean_t wired) */ static __inline -void moea64_set_scratchpage_pa(int which, vm_offset_t pa) { +void moea64_set_scratchpage_pa(mmu_t mmup, int which, vm_offset_t pa) { KASSERT(!hw_direct_map, ("Using OEA64 scratchpage with a direct map!")); mtx_assert(&moea64_scratchpage_mtx, MA_OWNED); - moea64_scratchpage_pte[which]->pte_hi &= ~LPTE_VALID; - TLBIE(moea64_scratchpage_vpn[which]); - - moea64_scratchpage_pte[which]->pte_lo &= + moea64_scratchpage_pvo[which]->pvo_pte.lpte.pte_lo &= ~(LPTE_WIMG | LPTE_RPGN); - moea64_scratchpage_pte[which]->pte_lo |= + moea64_scratchpage_pvo[which]->pvo_pte.lpte.pte_lo |= moea64_calc_wimg(pa, VM_MEMATTR_DEFAULT) | (uint64_t)pa; - EIEIO(); - - moea64_scratchpage_pte[which]->pte_hi |= LPTE_VALID; - PTESYNC(); isync(); + MOEA64_PTE_CHANGE(mmup, moea64_scratchpage_pte[which], + &moea64_scratchpage_pvo[which]->pvo_pte.lpte, + moea64_scratchpage_pvo[which]->pvo_vpn); } void @@ -1382,8 +1130,8 @@ moea64_copy_page(mmu_t mmu, vm_page_t msrc, vm_page_t mdst) } else { mtx_lock(&moea64_scratchpage_mtx); - moea64_set_scratchpage_pa(0,src); - moea64_set_scratchpage_pa(1,dst); + moea64_set_scratchpage_pa(mmu, 0, src); + moea64_set_scratchpage_pa(mmu, 1, dst); kcopy((void *)moea64_scratchpage_va[0], (void *)moea64_scratchpage_va[1], PAGE_SIZE); @@ -1406,7 +1154,7 @@ moea64_zero_page_area(mmu_t mmu, vm_page_t m, int off, int size) bzero((caddr_t)pa + off, size); } else { mtx_lock(&moea64_scratchpage_mtx); - moea64_set_scratchpage_pa(0,pa); + moea64_set_scratchpage_pa(mmu, 0, pa); bzero((caddr_t)moea64_scratchpage_va[0] + off, size); mtx_unlock(&moea64_scratchpage_mtx); } @@ -1427,7 +1175,7 @@ moea64_zero_page(mmu_t mmu, vm_page_t m) if (!hw_direct_map) { mtx_lock(&moea64_scratchpage_mtx); - moea64_set_scratchpage_pa(0,pa); + moea64_set_scratchpage_pa(mmu, 0, pa); va = moea64_scratchpage_va[0]; } else { va = pa; @@ -1459,7 +1207,7 @@ moea64_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_lock_queues(); PMAP_LOCK(pmap); - moea64_enter_locked(pmap, va, m, prot, wired); + moea64_enter_locked(mmu, pmap, va, m, prot, wired); vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } @@ -1473,8 +1221,8 @@ moea64_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, */ static void -moea64_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, - boolean_t wired) +moea64_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_prot_t prot, boolean_t wired) { struct pvo_head *pvo_head; uma_zone_t zone; @@ -1528,20 +1276,20 @@ moea64_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, if ((m->flags & PG_FICTITIOUS) != 0) pvo_flags |= PVO_FAKE; - error = moea64_pvo_enter(pmap, zone, pvo_head, va, VM_PAGE_TO_PHYS(m), - pte_lo, pvo_flags); + error = moea64_pvo_enter(mmu, pmap, zone, pvo_head, va, + VM_PAGE_TO_PHYS(m), pte_lo, pvo_flags); /* * Flush the page from the instruction cache if this page is * mapped executable and cacheable. */ - if ((pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) { - moea64_syncicache(pmap, va, VM_PAGE_TO_PHYS(m), PAGE_SIZE); - } + if ((pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) + moea64_syncicache(mmu, pmap, va, VM_PAGE_TO_PHYS(m), PAGE_SIZE); } static void -moea64_syncicache(pmap_t pmap, vm_offset_t va, vm_offset_t pa, vm_size_t sz) +moea64_syncicache(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_offset_t pa, + vm_size_t sz) { /* @@ -1568,7 +1316,7 @@ moea64_syncicache(pmap_t pmap, vm_offset_t va, vm_offset_t pa, vm_size_t sz) mtx_lock(&moea64_scratchpage_mtx); - moea64_set_scratchpage_pa(1,pa & ~ADDR_POFF); + moea64_set_scratchpage_pa(mmu, 1, pa & ~ADDR_POFF); __syncicache((void *)(moea64_scratchpage_va[1] + (va & ADDR_POFF)), sz); @@ -1600,7 +1348,7 @@ moea64_enter_object(mmu_t mmu, pmap_t pm, vm_offset_t start, vm_offset_t end, vm_page_lock_queues(); PMAP_LOCK(pm); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { - moea64_enter_locked(pm, start + ptoa(diff), m, prot & + moea64_enter_locked(mmu, pm, start + ptoa(diff), m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); m = TAILQ_NEXT(m, listq); } @@ -1615,8 +1363,8 @@ moea64_enter_quick(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_page_t m, vm_page_lock_queues(); PMAP_LOCK(pm); - moea64_enter_locked(pm, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), - FALSE); + moea64_enter_locked(mmu, pm, va, m, + prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); vm_page_unlock_queues(); PMAP_UNLOCK(pm); } @@ -1669,6 +1417,8 @@ retry: return (m); } +static mmu_t installed_mmu; + static void * moea64_uma_page_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) { @@ -1709,7 +1459,7 @@ moea64_uma_page_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) va = VM_PAGE_TO_PHYS(m); - moea64_pvo_enter(kernel_pmap, moea64_upvo_zone, + moea64_pvo_enter(installed_mmu, kernel_pmap, moea64_upvo_zone, &moea64_pvo_kunmanaged, va, VM_PAGE_TO_PHYS(m), LPTE_M, PVO_WIRED | PVO_BOOTSTRAP); @@ -1736,6 +1486,7 @@ moea64_init(mmu_t mmu) UMA_ZONE_VM | UMA_ZONE_NOFREE); if (!hw_direct_map) { + installed_mmu = mmu; uma_zone_set_allocf(moea64_upvo_zone,moea64_uma_page_alloc); uma_zone_set_allocf(moea64_mpvo_zone,moea64_uma_page_alloc); } @@ -1749,7 +1500,7 @@ moea64_is_referenced(mmu_t mmu, vm_page_t m) KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, ("moea64_is_referenced: page %p is not managed", m)); - return (moea64_query_bit(m, PTE_REF)); + return (moea64_query_bit(mmu, m, PTE_REF)); } boolean_t @@ -1768,7 +1519,7 @@ moea64_is_modified(mmu_t mmu, vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) return (FALSE); - return (moea64_query_bit(m, LPTE_CHG)); + return (moea64_query_bit(mmu, m, LPTE_CHG)); } boolean_t @@ -1790,7 +1541,7 @@ moea64_clear_reference(mmu_t mmu, vm_page_t m) KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, ("moea64_clear_reference: page %p is not managed", m)); - moea64_clear_bit(m, LPTE_REF); + moea64_clear_bit(mmu, m, LPTE_REF); } void @@ -1810,7 +1561,7 @@ moea64_clear_modify(mmu_t mmu, vm_page_t m) */ if ((m->flags & PG_WRITEABLE) == 0) return; - moea64_clear_bit(m, LPTE_CHG); + moea64_clear_bit(mmu, m, LPTE_CHG); } /* @@ -1820,7 +1571,7 @@ void moea64_remove_write(mmu_t mmu, vm_page_t m) { struct pvo_entry *pvo; - struct lpte *pt; + uintptr_t pt; pmap_t pmap; uint64_t lo; @@ -1838,21 +1589,21 @@ moea64_remove_write(mmu_t mmu, vm_page_t m) return; vm_page_lock_queues(); lo = moea64_attr_fetch(m); - SYNC(); + powerpc_sync(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { pmap = pvo->pvo_pmap; PMAP_LOCK(pmap); LOCK_TABLE(); if ((pvo->pvo_pte.lpte.pte_lo & LPTE_PP) != LPTE_BR) { - pt = moea64_pvo_to_pte(pvo); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); pvo->pvo_pte.lpte.pte_lo &= ~LPTE_PP; pvo->pvo_pte.lpte.pte_lo |= LPTE_BR; - if (pt != NULL) { - moea64_pte_synch(pt, &pvo->pvo_pte.lpte); + if (pt != -1) { + MOEA64_PTE_SYNCH(mmu, pt, &pvo->pvo_pte.lpte); lo |= pvo->pvo_pte.lpte.pte_lo; pvo->pvo_pte.lpte.pte_lo &= ~LPTE_CHG; - moea64_pte_change(pt, &pvo->pvo_pte.lpte, - pvo->pvo_vpn); + MOEA64_PTE_CHANGE(mmu, pt, + &pvo->pvo_pte.lpte, pvo->pvo_vpn); if (pvo->pvo_pmap == kernel_pmap) isync(); } @@ -1886,7 +1637,7 @@ moea64_ts_referenced(mmu_t mmu, vm_page_t m) KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, ("moea64_ts_referenced: page %p is not managed", m)); - return (moea64_clear_bit(m, LPTE_REF)); + return (moea64_clear_bit(mmu, m, LPTE_REF)); } /* @@ -1897,7 +1648,7 @@ moea64_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma) { struct pvo_entry *pvo; struct pvo_head *pvo_head; - struct lpte *pt; + uintptr_t pt; pmap_t pmap; uint64_t lo; @@ -1913,11 +1664,11 @@ moea64_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma) pmap = pvo->pvo_pmap; PMAP_LOCK(pmap); LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); pvo->pvo_pte.lpte.pte_lo &= ~LPTE_WIMG; pvo->pvo_pte.lpte.pte_lo |= lo; - if (pt != NULL) { - moea64_pte_change(pt, &pvo->pvo_pte.lpte, + if (pt != -1) { + MOEA64_PTE_CHANGE(mmu, pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); if (pvo->pvo_pmap == kernel_pmap) isync(); @@ -1941,7 +1692,7 @@ moea64_kenter_attr(mmu_t mmu, vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) pte_lo = moea64_calc_wimg(pa, ma); PMAP_LOCK(kernel_pmap); - error = moea64_pvo_enter(kernel_pmap, moea64_upvo_zone, + error = moea64_pvo_enter(mmu, kernel_pmap, moea64_upvo_zone, &moea64_pvo_kunmanaged, va, pa, pte_lo, PVO_WIRED | VM_PROT_EXECUTE); @@ -1952,9 +1703,8 @@ moea64_kenter_attr(mmu_t mmu, vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) /* * Flush the memory from the instruction cache. */ - if ((pte_lo & (LPTE_I | LPTE_G)) == 0) { + if ((pte_lo & (LPTE_I | LPTE_G)) == 0) __syncicache((void *)va, PAGE_SIZE); - } PMAP_UNLOCK(kernel_pmap); } @@ -2183,7 +1933,7 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) { struct pvo_entry *pvo; - struct lpte *pt; + uintptr_t pt; CTR4(KTR_PMAP, "moea64_protect: pm=%p sva=%#x eva=%#x prot=%#x", pm, sva, eva, prot); @@ -2209,7 +1959,7 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, * copy. */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); /* * Change the protection of the page. @@ -2223,11 +1973,12 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, /* * If the PVO is in the page table, update that pte as well. */ - if (pt != NULL) { - moea64_pte_change(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); + if (pt != -1) { + MOEA64_PTE_CHANGE(mmu, pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); if ((pvo->pvo_pte.lpte.pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) { - moea64_syncicache(pm, sva, + moea64_syncicache(mmu, pm, sva, pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN, PAGE_SIZE); } @@ -2314,7 +2065,7 @@ moea64_remove(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva) for (; sva < eva; sva += PAGE_SIZE) { pvo = moea64_pvo_find_va(pm, sva); if (pvo != NULL) - moea64_pvo_remove(pvo); + moea64_pvo_remove(mmu, pvo); } vm_page_unlock_queues(); PMAP_UNLOCK(pm); @@ -2339,7 +2090,7 @@ moea64_remove_all(mmu_t mmu, vm_page_t m) MOEA_PVO_CHECK(pvo); /* sanity check */ pmap = pvo->pvo_pmap; PMAP_LOCK(pmap); - moea64_pvo_remove(pvo); + moea64_pvo_remove(mmu, pvo); PMAP_UNLOCK(pmap); } if ((m->flags & PG_WRITEABLE) && moea64_is_modified(mmu, m)) { @@ -2355,7 +2106,7 @@ moea64_remove_all(mmu_t mmu, vm_page_t m) * Can only be called from moea64_bootstrap before avail start and end are * calculated. */ -static vm_offset_t +vm_offset_t moea64_bootstrap_alloc(vm_size_t size, u_int align) { vm_offset_t s, e; @@ -2396,53 +2147,10 @@ moea64_bootstrap_alloc(vm_size_t size, u_int align) panic("moea64_bootstrap_alloc: could not allocate memory"); } -static void -tlbia(void) -{ - vm_offset_t i; - #ifndef __powerpc64__ - register_t msr, scratch; - #endif - - TLBSYNC(); - - for (i = 0; i < 0xFF000; i += 0x00001000) { - #ifdef __powerpc64__ - __asm __volatile("tlbiel %0" :: "r"(i)); - #else - __asm __volatile("\ - mfmsr %0; \ - mr %1, %0; \ - insrdi %1,%3,1,0; \ - mtmsrd %1; \ - isync; \ - \ - tlbiel %2; \ - \ - mtmsrd %0; \ - isync;" - : "=r"(msr), "=r"(scratch) : "r"(i), "r"(1)); - #endif - } - - EIEIO(); - TLBSYNC(); -} - -#ifdef __powerpc64__ -static void -slbia(void) -{ - register_t seg0; - - __asm __volatile ("slbia"); - __asm __volatile ("slbmfee %0,%1; slbie %0;" : "=r"(seg0) : "r"(0)); -} -#endif - static int -moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, - vm_offset_t va, vm_offset_t pa, uint64_t pte_lo, int flags) +moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t zone, + struct pvo_head *pvo_head, vm_offset_t va, vm_offset_t pa, + uint64_t pte_lo, int flags) { struct pvo_entry *pvo; uint64_t vsid; @@ -2488,7 +2196,7 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, (pte_lo & LPTE_PP)) { if (!(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID)) { /* Re-insert if spilled */ - i = moea64_pte_insert(ptegidx, + i = MOEA64_PTE_INSERT(mmu, ptegidx, &pvo->pvo_pte.lpte); if (i >= 0) PVO_PTEGIDX_SET(pvo, i); @@ -2497,7 +2205,7 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, UNLOCK_TABLE(); return (0); } - moea64_pvo_remove(pvo); + moea64_pvo_remove(mmu, pvo); break; } } @@ -2572,7 +2280,7 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, /* * We hope this succeeds but it isn't required. */ - i = moea64_pte_insert(ptegidx, &pvo->pvo_pte.lpte); + i = MOEA64_PTE_INSERT(mmu, ptegidx, &pvo->pvo_pte.lpte); if (i >= 0) { PVO_PTEGIDX_SET(pvo, i); } else { @@ -2598,18 +2306,18 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, } static void -moea64_pvo_remove(struct pvo_entry *pvo) +moea64_pvo_remove(mmu_t mmu, struct pvo_entry *pvo) { - struct lpte *pt; + uintptr_t pt; /* * If there is an active pte entry, we need to deactivate it (and * save the ref & cfg bits). */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); - if (pt != NULL) { - moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); + if (pt != -1) { + MOEA64_PTE_UNSET(mmu, pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); PVO_PTEGIDX_CLR(pvo); } else { moea64_pte_overflow--; @@ -2698,192 +2406,11 @@ moea64_pvo_find_va(pmap_t pm, vm_offset_t va) return (pvo); } -static struct lpte * -moea64_pvo_to_pte(const struct pvo_entry *pvo) -{ - struct lpte *pt; - int pteidx, ptegidx; - uint64_t vsid; - - ASSERT_TABLE_LOCK(); - - /* If the PTEG index is not set, then there is no page table entry */ - if (!PVO_PTEGIDX_ISSET(pvo)) - return (NULL); - - /* - * Calculate the ptegidx - */ - vsid = PVO_VSID(pvo); - ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo), - pvo->pvo_vaddr & PVO_LARGE); - - /* - * We can find the actual pte entry without searching by grabbing - * the PTEG index from 3 unused bits in pvo_vaddr and by - * noticing the HID bit. - */ - if (pvo->pvo_pte.lpte.pte_hi & LPTE_HID) - ptegidx ^= moea64_pteg_mask; - - pteidx = (ptegidx << 3) | PVO_PTEGIDX_GET(pvo); - - if ((pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) && - !PVO_PTEGIDX_ISSET(pvo)) { - panic("moea64_pvo_to_pte: pvo %p has valid pte in pvo but no " - "valid pte index", pvo); - } - - if ((pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) == 0 && - PVO_PTEGIDX_ISSET(pvo)) { - panic("moea64_pvo_to_pte: pvo %p has valid pte index in pvo " - "pvo but no valid pte", pvo); - } - - pt = &moea64_pteg_table[pteidx >> 3].pt[pteidx & 7]; - if ((pt->pte_hi ^ (pvo->pvo_pte.lpte.pte_hi & ~LPTE_VALID)) == - LPTE_VALID) { - if ((pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) == 0) { - panic("moea64_pvo_to_pte: pvo %p has valid pte in " - "moea64_pteg_table %p but invalid in pvo", pvo, pt); - } - - if (((pt->pte_lo ^ pvo->pvo_pte.lpte.pte_lo) & - ~(LPTE_M|LPTE_CHG|LPTE_REF)) != 0) { - panic("moea64_pvo_to_pte: pvo %p pte does not match " - "pte %p in moea64_pteg_table difference is %#x", - pvo, pt, - (uint32_t)(pt->pte_lo ^ pvo->pvo_pte.lpte.pte_lo)); - } - - return (pt); - } - - if (pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) { - panic("moea64_pvo_to_pte: pvo %p has invalid pte %p in " - "moea64_pteg_table but valid in pvo", pvo, pt); - } - - return (NULL); -} - -static __inline int -moea64_pte_spillable_ident(u_int ptegidx) -{ - struct lpte *pt; - int i, j, k; - - /* Start at a random slot */ - i = mftb() % 8; - k = -1; - for (j = 0; j < 8; j++) { - pt = &moea64_pteg_table[ptegidx].pt[(i + j) % 8]; - if (pt->pte_hi & (LPTE_LOCKED | LPTE_WIRED)) - continue; - - /* This is a candidate, so remember it */ - k = (i + j) % 8; - - /* Try to get a page that has not been used lately */ - if (!(pt->pte_lo & LPTE_REF)) - return (k); - } - - return (k); -} - -static int -moea64_pte_insert(u_int ptegidx, struct lpte *pvo_pt) -{ - struct lpte *pt; - struct pvo_entry *pvo; - u_int pteg_bktidx; - int i; - - ASSERT_TABLE_LOCK(); - - /* - * First try primary hash. - */ - pteg_bktidx = ptegidx; - for (pt = moea64_pteg_table[pteg_bktidx].pt, i = 0; i < 8; i++, pt++) { - if ((pt->pte_hi & (LPTE_VALID | LPTE_LOCKED)) == 0) { - pvo_pt->pte_hi &= ~LPTE_HID; - moea64_pte_set(pt, pvo_pt); - return (i); - } - } - - /* - * Now try secondary hash. - */ - pteg_bktidx ^= moea64_pteg_mask; - for (pt = moea64_pteg_table[pteg_bktidx].pt, i = 0; i < 8; i++, pt++) { - if ((pt->pte_hi & (LPTE_VALID | LPTE_LOCKED)) == 0) { - pvo_pt->pte_hi |= LPTE_HID; - moea64_pte_set(pt, pvo_pt); - return (i); - } - } - - /* - * Out of luck. Find a PTE to sacrifice. - */ - pteg_bktidx = ptegidx; - i = moea64_pte_spillable_ident(pteg_bktidx); - if (i < 0) { - pteg_bktidx ^= moea64_pteg_mask; - i = moea64_pte_spillable_ident(pteg_bktidx); - } - - if (i < 0) { - /* No freeable slots in either PTEG? We're hosed. */ - panic("moea64_pte_insert: overflow"); - return (-1); - } - - if (pteg_bktidx == ptegidx) - pvo_pt->pte_hi &= ~LPTE_HID; - else - pvo_pt->pte_hi |= LPTE_HID; - - /* - * Synchronize the sacrifice PTE with its PVO, then mark both - * invalid. The PVO will be reused when/if the VM system comes - * here after a fault. - */ - pt = &moea64_pteg_table[pteg_bktidx].pt[i]; - - if (pt->pte_hi & LPTE_HID) - pteg_bktidx ^= moea64_pteg_mask; /* PTEs indexed by primary */ - - LIST_FOREACH(pvo, &moea64_pvo_table[pteg_bktidx], pvo_olink) { - if (pvo->pvo_pte.lpte.pte_hi == pt->pte_hi) { - KASSERT(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID, - ("Invalid PVO for valid PTE!")); - moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); - PVO_PTEGIDX_CLR(pvo); - moea64_pte_overflow++; - break; - } - } - - KASSERT(pvo->pvo_pte.lpte.pte_hi == pt->pte_hi, - ("Unable to find PVO for spilled PTE")); - - /* - * Set the new PTE. - */ - moea64_pte_set(pt, pvo_pt); - - return (i); -} - static boolean_t -moea64_query_bit(vm_page_t m, u_int64_t ptebit) +moea64_query_bit(mmu_t mmu, vm_page_t m, u_int64_t ptebit) { struct pvo_entry *pvo; - struct lpte *pt; + uintptr_t pt; if (moea64_attr_fetch(m) & ptebit) return (TRUE); @@ -2910,7 +2437,7 @@ moea64_query_bit(vm_page_t m, u_int64_t ptebit) * themselves. Sync so that any pending REF/CHG bits are flushed to * the PTEs. */ - SYNC(); + powerpc_sync(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ @@ -2920,9 +2447,9 @@ moea64_query_bit(vm_page_t m, u_int64_t ptebit) * ptebit is set, cache it and return success. */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); - if (pt != NULL) { - moea64_pte_synch(pt, &pvo->pvo_pte.lpte); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); + if (pt != -1) { + MOEA64_PTE_SYNCH(mmu, pt, &pvo->pvo_pte.lpte); if (pvo->pvo_pte.lpte.pte_lo & ptebit) { UNLOCK_TABLE(); @@ -2940,11 +2467,11 @@ moea64_query_bit(vm_page_t m, u_int64_t ptebit) } static u_int -moea64_clear_bit(vm_page_t m, u_int64_t ptebit) +moea64_clear_bit(mmu_t mmu, vm_page_t m, u_int64_t ptebit) { u_int count; struct pvo_entry *pvo; - struct lpte *pt; + uintptr_t pt; vm_page_lock_queues(); @@ -2960,7 +2487,7 @@ moea64_clear_bit(vm_page_t m, u_int64_t ptebit) * table, we don't have to worry about further accesses setting the * REF/CHG bits. */ - SYNC(); + powerpc_sync(); /* * For each pvo entry, clear the pvo's ptebit. If this pvo has a @@ -2971,12 +2498,13 @@ moea64_clear_bit(vm_page_t m, u_int64_t ptebit) MOEA_PVO_CHECK(pvo); /* sanity check */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); - if (pt != NULL) { - moea64_pte_synch(pt, &pvo->pvo_pte.lpte); + pt = MOEA64_PVO_TO_PTE(mmu, pvo); + if (pt != -1) { + MOEA64_PTE_SYNCH(mmu, pt, &pvo->pvo_pte.lpte); if (pvo->pvo_pte.lpte.pte_lo & ptebit) { count++; - moea64_pte_clear(pt, pvo->pvo_vpn, ptebit); + MOEA64_PTE_CLEAR(mmu, pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn, ptebit); } } pvo->pvo_pte.lpte.pte_lo &= ~ptebit; @@ -3058,7 +2586,7 @@ moea64_unmapdev(mmu_t mmu, vm_offset_t va, vm_size_t size) kmem_free(kernel_map, base, size); } -static void +void moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) { struct pvo_entry *pvo; @@ -3074,7 +2602,7 @@ moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) if (pvo != NULL) { pa = (pvo->pvo_pte.pte.pte_lo & LPTE_RPGN) | (va & ADDR_POFF); - moea64_syncicache(pm, va, pa, len); + moea64_syncicache(mmu, pm, va, pa, len); } va += len; sz -= len; diff --git a/sys/powerpc/aim/mmu_oea64.h b/sys/powerpc/aim/mmu_oea64.h new file mode 100644 index 0000000..101181d --- /dev/null +++ b/sys/powerpc/aim/mmu_oea64.h @@ -0,0 +1,77 @@ +/*- + * Copyright (C) 2010 Nathan Whitehorn + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _POWERPC_AIM_MMU_OEA64_H +#define _POWERPC_AIM_MMU_OEA64_H + +#include + +extern mmu_def_t oea64_mmu; + +/* + * Helper routines + */ + +/* Allocate physical memory for use in moea64_bootstrap. */ +vm_offset_t moea64_bootstrap_alloc(vm_size_t, u_int); + +/* + * Bootstrap subroutines + * + * An MMU_BOOTSTRAP() implementation looks like this: + * moea64_early_bootstrap(); + * Allocate Page Table + * moea64_mid_bootstrap(); + * Add mappings for MMU resources + * moea64_late_bootstrap(); + */ + +void moea64_early_bootstrap(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend); +void moea64_mid_bootstrap(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend); +void moea64_late_bootstrap(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend); + +/* + * Statistics + */ + +extern u_int moea64_pte_valid; +extern u_int moea64_pte_overflow; + +/* + * State variables + */ + +extern struct pvo_head *moea64_pvo_table; +extern int moea64_large_page_shift; +extern u_int moea64_pteg_count; +extern u_int moea64_pteg_mask; + +#endif /* _POWERPC_AIM_MMU_OEA64_H */ + diff --git a/sys/powerpc/aim/moea64_if.m b/sys/powerpc/aim/moea64_if.m new file mode 100644 index 0000000..f041838 --- /dev/null +++ b/sys/powerpc/aim/moea64_if.m @@ -0,0 +1,115 @@ +#- +# Copyright (c) 2010 Nathan Whitehorn +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + + +#include +#include +#include +#include + +#include +#include + +#include + +/** + * MOEA64 kobj methods for 64-bit Book-S page table + * manipulation routines used, for example, by hypervisors. + */ + +INTERFACE moea64; + + +/** + * Copy ref/changed bits from PTE referenced by _pt_cookie to _pvo_pt. + */ +METHOD void pte_synch { + mmu_t _mmu; + uintptr_t _pt_cookie; + struct lpte *_pvo_pt; +}; + +/** + * Clear bits ptebit (a mask) from the low word of the PTE referenced by + * _pt_cookie. Note that _pvo_pt is for reference use only -- the bit should + * NOT be cleared there. + */ +METHOD void pte_clear { + mmu_t _mmu; + uintptr_t _pt_cookie; + struct lpte *_pvo_pt; + uint64_t _vpn; + uint64_t _ptebit; +}; + +/** + * Invalidate the PTE referenced by _pt_cookie, synchronizing its validity + * and ref/changed bits after completion. + */ +METHOD void pte_unset { + mmu_t _mmu; + uintptr_t _pt_cookie; + struct lpte *_pvo_pt; + uint64_t _vpn; +}; + +/** + * Update the PTE referenced by _pt_cookie with the values in _pvo_pt, + * making sure that the values of ref/changed bits are preserved and + * synchronized back to _pvo_pt. + */ +METHOD void pte_change { + mmu_t _mmu; + uintptr_t _pt_cookie; + struct lpte *_pvo_pt; + uint64_t _vpn; +}; + + +/** + * Insert the PTE _pvo_pt into the PTEG group _ptegidx, returning the index + * of the PTE in its group at completion, or -1 if no slots were free. Must + * not replace PTEs marked LPTE_WIRED or LPTE_LOCKED, and must set LPTE_HID + * and LPTE_VALID appropriately in _pvo_pt. + */ +METHOD int pte_insert { + mmu_t _mmu; + u_int _ptegidx; + struct lpte *_pvo_pt; +}; + +/** + * Return the page table reference cookie corresponding to _pvo, or -1 if + * the _pvo is not currently in the page table. + */ +METHOD uintptr_t pvo_to_pte { + mmu_t _mmu; + const struct pvo_entry *_pvo; +}; + + diff --git a/sys/powerpc/aim/moea64_native.c b/sys/powerpc/aim/moea64_native.c new file mode 100644 index 0000000..a386b93 --- /dev/null +++ b/sys/powerpc/aim/moea64_native.c @@ -0,0 +1,637 @@ +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Matt Thomas of Allegro Networks, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +/*- + * Copyright (C) 1995, 1996 Wolfgang Solfrank. + * Copyright (C) 1995, 1996 TooLs GmbH. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by TooLs GmbH. + * 4. The name of TooLs GmbH may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $NetBSD: pmap.c,v 1.28 2000/03/26 20:42:36 kleink Exp $ + */ +/*- + * Copyright (C) 2001 Benno Rice. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Native 64-bit page table operations for running without a hypervisor. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "mmu_oea64.h" +#include "mmu_if.h" +#include "moea64_if.h" + +#define PTESYNC() __asm __volatile("ptesync"); +#define TLBSYNC() __asm __volatile("tlbsync; ptesync"); +#define SYNC() __asm __volatile("sync"); +#define EIEIO() __asm __volatile("eieio"); + +#define VSID_HASH_MASK 0x0000007fffffffffULL + +/* + * The tlbie instruction must be executed in 64-bit mode + * so we have to twiddle MSR[SF] around every invocation. + * Just to add to the fun, exceptions must be off as well + * so that we can't trap in 64-bit mode. What a pain. + */ +struct mtx tlbie_mutex; + +static __inline void +TLBIE(uint64_t vpn) { +#ifndef __powerpc64__ + register_t vpn_hi, vpn_lo; + register_t msr; + register_t scratch; +#endif + + vpn <<= ADDR_PIDX_SHFT; + vpn &= ~(0xffffULL << 48); + + mtx_lock_spin(&tlbie_mutex); +#ifdef __powerpc64__ + __asm __volatile("\ + ptesync; \ + tlbie %0; \ + eieio; \ + tlbsync; \ + ptesync;" + :: "r"(vpn) : "memory"); +#else + vpn_hi = (uint32_t)(vpn >> 32); + vpn_lo = (uint32_t)vpn; + + __asm __volatile("\ + mfmsr %0; \ + mr %1, %0; \ + insrdi %1,%5,1,0; \ + mtmsrd %1; isync; \ + ptesync; \ + \ + sld %1,%2,%4; \ + or %1,%1,%3; \ + tlbie %1; \ + \ + mtmsrd %0; isync; \ + eieio; \ + tlbsync; \ + ptesync;" + : "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1) + : "memory"); +#endif + mtx_unlock_spin(&tlbie_mutex); +} + +#define DISABLE_TRANS(msr) msr = mfmsr(); mtmsr(msr & ~PSL_DR); isync() +#define ENABLE_TRANS(msr) mtmsr(msr); isync() + +/* + * PTEG data. + */ +static struct lpteg *moea64_pteg_table; + +/* + * PTE calls. + */ +static int moea64_pte_insert_native(mmu_t, u_int, struct lpte *); +static uintptr_t moea64_pvo_to_pte_native(mmu_t, const struct pvo_entry *); +static void moea64_pte_synch_native(mmu_t, uintptr_t pt, + struct lpte *pvo_pt); +static void moea64_pte_clear_native(mmu_t, uintptr_t pt, + struct lpte *pvo_pt, uint64_t vpn, uint64_t ptebit); +static void moea64_pte_change_native(mmu_t, uintptr_t pt, + struct lpte *pvo_pt, uint64_t vpn); +static void moea64_pte_unset_native(mmu_t mmu, uintptr_t pt, + struct lpte *pvo_pt, uint64_t vpn); + +/* + * Utility routines. + */ +static void moea64_bootstrap_native(mmu_t mmup, + vm_offset_t kernelstart, vm_offset_t kernelend); +static void moea64_cpu_bootstrap_native(mmu_t, int ap); +static void tlbia(void); + +static mmu_method_t moea64_native_methods[] = { + /* Internal interfaces */ + MMUMETHOD(mmu_bootstrap, moea64_bootstrap_native), + MMUMETHOD(mmu_cpu_bootstrap, moea64_cpu_bootstrap_native), + + MMUMETHOD(moea64_pte_synch, moea64_pte_synch_native), + MMUMETHOD(moea64_pte_clear, moea64_pte_clear_native), + MMUMETHOD(moea64_pte_unset, moea64_pte_unset_native), + MMUMETHOD(moea64_pte_change, moea64_pte_change_native), + MMUMETHOD(moea64_pte_insert, moea64_pte_insert_native), + MMUMETHOD(moea64_pvo_to_pte, moea64_pvo_to_pte_native), + + { 0, 0 } +}; + +MMU_DEF_INHERIT(oea64_mmu_native, MMU_TYPE_G5, moea64_native_methods, + 0, oea64_mmu); + +static __inline u_int +va_to_pteg(uint64_t vsid, vm_offset_t addr, int large) +{ + uint64_t hash; + int shift; + + shift = large ? moea64_large_page_shift : ADDR_PIDX_SHFT; + hash = (vsid & VSID_HASH_MASK) ^ (((uint64_t)addr & ADDR_PIDX) >> + shift); + return (hash & moea64_pteg_mask); +} + +static void +moea64_pte_synch_native(mmu_t mmu, uintptr_t pt_cookie, struct lpte *pvo_pt) +{ + struct lpte *pt = (struct lpte *)pt_cookie; + + pvo_pt->pte_lo |= pt->pte_lo & (LPTE_REF | LPTE_CHG); +} + +static void +moea64_pte_clear_native(mmu_t mmu, uintptr_t pt_cookie, struct lpte *pvo_pt, + uint64_t vpn, uint64_t ptebit) +{ + struct lpte *pt = (struct lpte *)pt_cookie; + + /* + * As shown in Section 7.6.3.2.3 + */ + pt->pte_lo &= ~ptebit; + TLBIE(vpn); +} + +static void +moea64_pte_set_native(struct lpte *pt, struct lpte *pvo_pt) +{ + + pvo_pt->pte_hi |= LPTE_VALID; + + /* + * Update the PTE as defined in section 7.6.3.1. + * Note that the REF/CHG bits are from pvo_pt and thus should have + * been saved so this routine can restore them (if desired). + */ + pt->pte_lo = pvo_pt->pte_lo; + EIEIO(); + pt->pte_hi = pvo_pt->pte_hi; + PTESYNC(); + moea64_pte_valid++; +} + +static void +moea64_pte_unset_native(mmu_t mmu, uintptr_t pt_cookie, struct lpte *pvo_pt, + uint64_t vpn) +{ + struct lpte *pt = (struct lpte *)pt_cookie; + + pvo_pt->pte_hi &= ~LPTE_VALID; + + /* + * Force the reg & chg bits back into the PTEs. + */ + SYNC(); + + /* + * Invalidate the pte. + */ + pt->pte_hi &= ~LPTE_VALID; + TLBIE(vpn); + + /* + * Save the reg & chg bits. + */ + moea64_pte_synch_native(mmu, pt_cookie, pvo_pt); + moea64_pte_valid--; +} + +static void +moea64_pte_change_native(mmu_t mmu, uintptr_t pt, struct lpte *pvo_pt, + uint64_t vpn) +{ + + /* + * Invalidate the PTE + */ + moea64_pte_unset_native(mmu, pt, pvo_pt, vpn); + moea64_pte_set_native((struct lpte *)pt, pvo_pt); +} + +static void +moea64_cpu_bootstrap_native(mmu_t mmup, int ap) +{ + int i = 0; + #ifdef __powerpc64__ + struct slb *slb = PCPU_GET(slb); + register_t seg0; + #endif + + /* + * Initialize segment registers and MMU + */ + + mtmsr(mfmsr() & ~PSL_DR & ~PSL_IR); isync(); + + /* + * Install kernel SLB entries + */ + + #ifdef __powerpc64__ + __asm __volatile ("slbia"); + __asm __volatile ("slbmfee %0,%1; slbie %0;" : "=r"(seg0) : + "r"(0)); + + for (i = 0; i < 64; i++) { + if (!(slb[i].slbe & SLBE_VALID)) + continue; + + __asm __volatile ("slbmte %0, %1" :: + "r"(slb[i].slbv), "r"(slb[i].slbe)); + } + #else + for (i = 0; i < 16; i++) + mtsrin(i << ADDR_SR_SHFT, kernel_pmap->pm_sr[i]); + #endif + + /* + * Install page table + */ + + __asm __volatile ("ptesync; mtsdr1 %0; isync" + :: "r"((uintptr_t)moea64_pteg_table + | (uintptr_t)(flsl(moea64_pteg_mask >> 11)))); + tlbia(); +} + +static void +moea64_bootstrap_native(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend) +{ + vm_size_t size; + vm_offset_t off; + vm_paddr_t pa; + register_t msr; + + moea64_early_bootstrap(mmup, kernelstart, kernelend); + + /* + * Allocate PTEG table. + */ + + size = moea64_pteg_count * sizeof(struct lpteg); + CTR2(KTR_PMAP, "moea64_bootstrap: %d PTEGs, %d bytes", + moea64_pteg_count, size); + + /* + * We now need to allocate memory. This memory, to be allocated, + * has to reside in a page table. The page table we are about to + * allocate. We don't have BAT. So drop to data real mode for a minute + * as a measure of last resort. We do this a couple times. + */ + + moea64_pteg_table = (struct lpteg *)moea64_bootstrap_alloc(size, size); + DISABLE_TRANS(msr); + bzero((void *)moea64_pteg_table, moea64_pteg_count * sizeof(struct lpteg)); + ENABLE_TRANS(msr); + + CTR1(KTR_PMAP, "moea64_bootstrap: PTEG table at %p", moea64_pteg_table); + + /* + * Initialize the TLBIE lock. TLBIE can only be executed by one CPU. + */ + mtx_init(&tlbie_mutex, "tlbie mutex", NULL, MTX_SPIN); + + moea64_mid_bootstrap(mmup, kernelstart, kernelend); + + /* + * Add a mapping for the page table itself if there is no direct map. + */ + if (!hw_direct_map) { + size = moea64_pteg_count * sizeof(struct lpteg); + off = (vm_offset_t)(moea64_pteg_table); + DISABLE_TRANS(msr); + for (pa = off; pa < off + size; pa += PAGE_SIZE) + pmap_kenter(pa, pa); + ENABLE_TRANS(msr); + } + + /* Bring up virtual memory */ + moea64_late_bootstrap(mmup, kernelstart, kernelend); +} + +static void +tlbia(void) +{ + vm_offset_t i; + #ifndef __powerpc64__ + register_t msr, scratch; + #endif + + TLBSYNC(); + + for (i = 0; i < 0xFF000; i += 0x00001000) { + #ifdef __powerpc64__ + __asm __volatile("tlbiel %0" :: "r"(i)); + #else + __asm __volatile("\ + mfmsr %0; \ + mr %1, %0; \ + insrdi %1,%3,1,0; \ + mtmsrd %1; \ + isync; \ + \ + tlbiel %2; \ + \ + mtmsrd %0; \ + isync;" + : "=r"(msr), "=r"(scratch) : "r"(i), "r"(1)); + #endif + } + + EIEIO(); + TLBSYNC(); +} + +static uintptr_t +moea64_pvo_to_pte_native(mmu_t mmu, const struct pvo_entry *pvo) +{ + struct lpte *pt; + int pteidx, ptegidx; + uint64_t vsid; + + /* If the PTEG index is not set, then there is no page table entry */ + if (!PVO_PTEGIDX_ISSET(pvo)) + return (-1); + + /* + * Calculate the ptegidx + */ + vsid = PVO_VSID(pvo); + ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo), + pvo->pvo_vaddr & PVO_LARGE); + + /* + * We can find the actual pte entry without searching by grabbing + * the PTEG index from 3 unused bits in pvo_vaddr and by + * noticing the HID bit. + */ + if (pvo->pvo_pte.lpte.pte_hi & LPTE_HID) + ptegidx ^= moea64_pteg_mask; + + pteidx = (ptegidx << 3) | PVO_PTEGIDX_GET(pvo); + + if ((pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) && + !PVO_PTEGIDX_ISSET(pvo)) { + panic("moea64_pvo_to_pte: pvo %p has valid pte in pvo but no " + "valid pte index", pvo); + } + + if ((pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) == 0 && + PVO_PTEGIDX_ISSET(pvo)) { + panic("moea64_pvo_to_pte: pvo %p has valid pte index in pvo " + "pvo but no valid pte", pvo); + } + + pt = &moea64_pteg_table[pteidx >> 3].pt[pteidx & 7]; + if ((pt->pte_hi ^ (pvo->pvo_pte.lpte.pte_hi & ~LPTE_VALID)) == + LPTE_VALID) { + if ((pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) == 0) { + panic("moea64_pvo_to_pte: pvo %p has valid pte in " + "moea64_pteg_table %p but invalid in pvo", pvo, pt); + } + + if (((pt->pte_lo ^ pvo->pvo_pte.lpte.pte_lo) & + ~(LPTE_M|LPTE_CHG|LPTE_REF)) != 0) { + panic("moea64_pvo_to_pte: pvo %p pte does not match " + "pte %p in moea64_pteg_table difference is %#x", + pvo, pt, + (uint32_t)(pt->pte_lo ^ pvo->pvo_pte.lpte.pte_lo)); + } + + return ((uintptr_t)pt); + } + + if (pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) { + panic("moea64_pvo_to_pte: pvo %p has invalid pte %p in " + "moea64_pteg_table but valid in pvo", pvo, pt); + } + + return (-1); +} + +static __inline int +moea64_pte_spillable_ident(u_int ptegidx) +{ + struct lpte *pt; + int i, j, k; + + /* Start at a random slot */ + i = mftb() % 8; + k = -1; + for (j = 0; j < 8; j++) { + pt = &moea64_pteg_table[ptegidx].pt[(i + j) % 8]; + if (pt->pte_hi & (LPTE_LOCKED | LPTE_WIRED)) + continue; + + /* This is a candidate, so remember it */ + k = (i + j) % 8; + + /* Try to get a page that has not been used lately */ + if (!(pt->pte_lo & LPTE_REF)) + return (k); + } + + return (k); +} + +static int +moea64_pte_insert_native(mmu_t mmu, u_int ptegidx, struct lpte *pvo_pt) +{ + struct lpte *pt; + struct pvo_entry *pvo; + u_int pteg_bktidx; + int i; + + /* + * First try primary hash. + */ + pteg_bktidx = ptegidx; + for (pt = moea64_pteg_table[pteg_bktidx].pt, i = 0; i < 8; i++, pt++) { + if ((pt->pte_hi & (LPTE_VALID | LPTE_LOCKED)) == 0) { + pvo_pt->pte_hi &= ~LPTE_HID; + moea64_pte_set_native(pt, pvo_pt); + return (i); + } + } + + /* + * Now try secondary hash. + */ + pteg_bktidx ^= moea64_pteg_mask; + for (pt = moea64_pteg_table[pteg_bktidx].pt, i = 0; i < 8; i++, pt++) { + if ((pt->pte_hi & (LPTE_VALID | LPTE_LOCKED)) == 0) { + pvo_pt->pte_hi |= LPTE_HID; + moea64_pte_set_native(pt, pvo_pt); + return (i); + } + } + + /* + * Out of luck. Find a PTE to sacrifice. + */ + pteg_bktidx = ptegidx; + i = moea64_pte_spillable_ident(pteg_bktidx); + if (i < 0) { + pteg_bktidx ^= moea64_pteg_mask; + i = moea64_pte_spillable_ident(pteg_bktidx); + } + + if (i < 0) { + /* No freeable slots in either PTEG? We're hosed. */ + panic("moea64_pte_insert: overflow"); + return (-1); + } + + if (pteg_bktidx == ptegidx) + pvo_pt->pte_hi &= ~LPTE_HID; + else + pvo_pt->pte_hi |= LPTE_HID; + + /* + * Synchronize the sacrifice PTE with its PVO, then mark both + * invalid. The PVO will be reused when/if the VM system comes + * here after a fault. + */ + pt = &moea64_pteg_table[pteg_bktidx].pt[i]; + + if (pt->pte_hi & LPTE_HID) + pteg_bktidx ^= moea64_pteg_mask; /* PTEs indexed by primary */ + + LIST_FOREACH(pvo, &moea64_pvo_table[pteg_bktidx], pvo_olink) { + if (pvo->pvo_pte.lpte.pte_hi == pt->pte_hi) { + KASSERT(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID, + ("Invalid PVO for valid PTE!")); + moea64_pte_unset_native(mmu, (uintptr_t)pt, + &pvo->pvo_pte.lpte, pvo->pvo_vpn); + PVO_PTEGIDX_CLR(pvo); + moea64_pte_overflow++; + break; + } + } + + KASSERT(pvo->pvo_pte.lpte.pte_hi == pt->pte_hi, + ("Unable to find PVO for spilled PTE")); + + /* + * Set the new PTE. + */ + moea64_pte_set_native(pt, pvo_pt); + + return (i); +} + diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h index c030416..2b26185 100644 --- a/sys/powerpc/include/pmap.h +++ b/sys/powerpc/include/pmap.h @@ -121,6 +121,25 @@ struct pvo_entry { }; LIST_HEAD(pvo_head, pvo_entry); +#define PVO_PTEGIDX_MASK 0x007UL /* which PTEG slot */ +#define PVO_PTEGIDX_VALID 0x008UL /* slot is valid */ +#define PVO_WIRED 0x010UL /* PVO entry is wired */ +#define PVO_MANAGED 0x020UL /* PVO entry is managed */ +#define PVO_EXECUTABLE 0x040UL /* PVO entry is executable */ +#define PVO_BOOTSTRAP 0x080UL /* PVO entry allocated during + bootstrap */ +#define PVO_FAKE 0x100UL /* fictitious phys page */ +#define PVO_LARGE 0x200UL /* large page */ +#define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) +#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) +#define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) +#define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) +#define PVO_PTEGIDX_CLR(pvo) \ + ((void)((pvo)->pvo_vaddr &= ~(PVO_PTEGIDX_VALID|PVO_PTEGIDX_MASK))) +#define PVO_PTEGIDX_SET(pvo, i) \ + ((void)((pvo)->pvo_vaddr |= (i)|PVO_PTEGIDX_VALID)) +#define PVO_VSID(pvo) ((pvo)->pvo_vpn >> 16) + struct md_page { u_int64_t mdpg_attrs; vm_memattr_t mdpg_cache_attrs; -- cgit v1.1 From 26b7c17855a285727782905a55ed02d1e51f5a6b Mon Sep 17 00:00:00 2001 From: jfv Date: Sat, 4 Dec 2010 06:38:21 +0000 Subject: Correct build error. --- sys/dev/e1000/if_em.c | 1 - 1 file changed, 1 deletion(-) diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 03e0e04..4cfda7f 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -4303,7 +4303,6 @@ next_desc: static __inline void em_rx_discard(struct rx_ring *rxr, int i) { - struct adapter *adapter = rxr->adapter; struct em_buffer *rbuf; rbuf = &rxr->rx_buffers[i]; -- cgit v1.1 From 06cd6f2bc1f94f941b57ef92ed6445529822669b Mon Sep 17 00:00:00 2001 From: jh Date: Sat, 4 Dec 2010 08:44:56 +0000 Subject: Remove stale link. PR: 151252 --- lib/libgeom/libgeom.3 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/libgeom/libgeom.3 b/lib/libgeom/libgeom.3 index 04cf2fc..b897fad 100644 --- a/lib/libgeom/libgeom.3 +++ b/lib/libgeom/libgeom.3 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 16, 2010 +.Dd December 4, 2010 .Dt LIBGEOM 3 .Os .Sh NAME @@ -382,8 +382,6 @@ if (errstr != NULL) err(1, "could not destroy ccd: %s", errstr); gctl_free(H); .Ed -.Sh SEE ALSO -.Pa http://ezine.daemonnews.org/200308/blueprints.html .Sh HISTORY The .Nm geom -- cgit v1.1 From 9242c645f81d22058934688725f1fff0bc88cb64 Mon Sep 17 00:00:00 2001 From: uqs Date: Sat, 4 Dec 2010 10:11:20 +0000 Subject: Move most of the remaining USD/PSD/SMM papers into share/doc --- bin/csh/USD.doc/csh.1 | 1012 --------- bin/csh/USD.doc/csh.2 | 1304 ----------- bin/csh/USD.doc/csh.3 | 649 ------ bin/csh/USD.doc/csh.4 | 176 -- bin/csh/USD.doc/csh.a | 93 - bin/csh/USD.doc/csh.g | 1719 -------------- bin/csh/USD.doc/tabs | 32 - lib/libc/rpc/PSD.doc/nfs.rfc.ms | 1374 ------------ lib/libc/rpc/PSD.doc/rpc.prog.ms | 2686 ---------------------- lib/libc/rpc/PSD.doc/rpc.rfc.ms | 1304 ----------- lib/libc/rpc/PSD.doc/rpcgen.ms | 1301 ----------- lib/libc/rpc/PSD.doc/stubs | 3 - lib/libc/rpc/PSD.doc/xdr.nts.ms | 1968 ---------------- lib/libc/rpc/PSD.doc/xdr.rfc.ms | 1060 --------- sbin/fsck_ffs/SMM.doc/0.t | 147 -- sbin/fsck_ffs/SMM.doc/1.t | 80 - sbin/fsck_ffs/SMM.doc/2.t | 262 --- sbin/fsck_ffs/SMM.doc/3.t | 449 ---- sbin/fsck_ffs/SMM.doc/4.t | 1421 ------------ sbin/fsck_ffs/SMM.doc/Makefile | 8 - share/doc/psd/12.make/Makefile | 1 - share/doc/psd/12.make/stubs | 9 + share/doc/psd/12.make/tutorial.ms | 3747 +++++++++++++++++++++++++++++++ share/doc/psd/18.gprof/Makefile | 1 - share/doc/psd/18.gprof/abstract.me | 66 + share/doc/psd/18.gprof/gathering.me | 231 ++ share/doc/psd/18.gprof/header.me | 38 + share/doc/psd/18.gprof/intro.me | 81 + share/doc/psd/18.gprof/postp.me | 190 ++ share/doc/psd/18.gprof/postp1.pic | 54 + share/doc/psd/18.gprof/postp2.pic | 56 + share/doc/psd/18.gprof/postp3.pic | 51 + share/doc/psd/18.gprof/pres1.pic | 56 + share/doc/psd/18.gprof/pres2.pic | 52 + share/doc/psd/18.gprof/present.me | 306 +++ share/doc/psd/18.gprof/profiling.me | 115 + share/doc/psd/18.gprof/refs.me | 63 + share/doc/psd/22.rpcgen/Makefile | 1 - share/doc/psd/22.rpcgen/rpcgen.ms | 1301 +++++++++++ share/doc/psd/22.rpcgen/stubs | 3 + share/doc/psd/23.rpc/Makefile | 1 - share/doc/psd/23.rpc/rpc.prog.ms | 2686 ++++++++++++++++++++++ share/doc/psd/23.rpc/stubs | 3 + share/doc/psd/24.xdr/Makefile | 1 - share/doc/psd/24.xdr/stubs | 3 + share/doc/psd/24.xdr/xdr.nts.ms | 1968 ++++++++++++++++ share/doc/psd/25.xdrrfc/Makefile | 1 - share/doc/psd/25.xdrrfc/stubs | 3 + share/doc/psd/25.xdrrfc/xdr.rfc.ms | 1060 +++++++++ share/doc/psd/26.rpcrfc/Makefile | 1 - share/doc/psd/26.rpcrfc/rpc.rfc.ms | 1304 +++++++++++ share/doc/psd/26.rpcrfc/stubs | 3 + share/doc/psd/27.nfsrpc/Makefile | 1 - share/doc/psd/27.nfsrpc/nfs.rfc.ms | 1374 ++++++++++++ share/doc/psd/27.nfsrpc/stubs | 3 + share/doc/smm/02.config/0.t | 88 + share/doc/smm/02.config/1.t | 61 + share/doc/smm/02.config/2.t | 188 ++ share/doc/smm/02.config/3.t | 299 +++ share/doc/smm/02.config/4.t | 442 ++++ share/doc/smm/02.config/5.t | 271 +++ share/doc/smm/02.config/6.t | 233 ++ share/doc/smm/02.config/Makefile | 1 - share/doc/smm/02.config/a.t | 162 ++ share/doc/smm/02.config/b.t | 137 ++ share/doc/smm/02.config/c.t | 109 + share/doc/smm/02.config/d.t | 272 +++ share/doc/smm/02.config/e.t | 114 + share/doc/smm/02.config/spell.ok | 305 +++ share/doc/smm/03.fsck/0.t | 147 ++ share/doc/smm/03.fsck/1.t | 80 + share/doc/smm/03.fsck/2.t | 262 +++ share/doc/smm/03.fsck/3.t | 449 ++++ share/doc/smm/03.fsck/4.t | 1421 ++++++++++++ share/doc/smm/03.fsck/Makefile | 1 - share/doc/smm/07.lpr/0.t | 68 + share/doc/smm/07.lpr/1.t | 77 + share/doc/smm/07.lpr/2.t | 141 ++ share/doc/smm/07.lpr/3.t | 73 + share/doc/smm/07.lpr/4.t | 206 ++ share/doc/smm/07.lpr/5.t | 116 + share/doc/smm/07.lpr/6.t | 94 + share/doc/smm/07.lpr/7.t | 226 ++ share/doc/smm/07.lpr/Makefile | 9 + share/doc/smm/07.lpr/spell.ok | 70 + share/doc/smm/11.timedop/Makefile | 1 - share/doc/smm/11.timedop/timed.ms | 279 +++ share/doc/smm/12.timed/Makefile | 1 - share/doc/smm/12.timed/date | 53 + share/doc/smm/12.timed/loop | 54 + share/doc/smm/12.timed/spell.ok | 34 + share/doc/smm/12.timed/time | 53 + share/doc/smm/12.timed/timed.ms | 462 ++++ share/doc/smm/12.timed/unused | 53 + share/doc/usd/04.csh/Makefile | 1 - share/doc/usd/04.csh/csh.1 | 1012 +++++++++ share/doc/usd/04.csh/csh.2 | 1304 +++++++++++ share/doc/usd/04.csh/csh.3 | 649 ++++++ share/doc/usd/04.csh/csh.4 | 176 ++ share/doc/usd/04.csh/csh.a | 93 + share/doc/usd/04.csh/csh.g | 1719 ++++++++++++++ share/doc/usd/04.csh/tabs | 32 + share/doc/usd/05.dc/Makefile | 1 - share/doc/usd/05.dc/dc | 753 +++++++ share/doc/usd/06.bc/Makefile | 1 - share/doc/usd/06.bc/bc | 1241 ++++++++++ share/doc/usd/07.mail/Makefile | 1 - share/doc/usd/07.mail/mail0.nr | 72 + share/doc/usd/07.mail/mail1.nr | 92 + share/doc/usd/07.mail/mail2.nr | 617 +++++ share/doc/usd/07.mail/mail3.nr | 133 ++ share/doc/usd/07.mail/mail4.nr | 437 ++++ share/doc/usd/07.mail/mail5.nr | 1042 +++++++++ share/doc/usd/07.mail/mail6.nr | 125 ++ share/doc/usd/07.mail/mail7.nr | 107 + share/doc/usd/07.mail/mail8.nr | 75 + share/doc/usd/07.mail/mail9.nr | 203 ++ share/doc/usd/07.mail/maila.nr | 33 + usr.bin/bc/USD.doc/bc | 1241 ---------- usr.bin/dc/USD.doc/dc | 753 ------- usr.bin/gprof/PSD.doc/abstract.me | 66 - usr.bin/gprof/PSD.doc/gathering.me | 231 -- usr.bin/gprof/PSD.doc/header.me | 38 - usr.bin/gprof/PSD.doc/intro.me | 81 - usr.bin/gprof/PSD.doc/postp.me | 190 -- usr.bin/gprof/PSD.doc/postp1.pic | 54 - usr.bin/gprof/PSD.doc/postp2.pic | 56 - usr.bin/gprof/PSD.doc/postp3.pic | 51 - usr.bin/gprof/PSD.doc/pres1.pic | 56 - usr.bin/gprof/PSD.doc/pres2.pic | 52 - usr.bin/gprof/PSD.doc/present.me | 306 --- usr.bin/gprof/PSD.doc/profiling.me | 115 - usr.bin/gprof/PSD.doc/refs.me | 63 - usr.bin/mail/USD.doc/mail0.nr | 72 - usr.bin/mail/USD.doc/mail1.nr | 92 - usr.bin/mail/USD.doc/mail2.nr | 617 ----- usr.bin/mail/USD.doc/mail3.nr | 133 -- usr.bin/mail/USD.doc/mail4.nr | 437 ---- usr.bin/mail/USD.doc/mail5.nr | 1042 --------- usr.bin/mail/USD.doc/mail6.nr | 125 -- usr.bin/mail/USD.doc/mail7.nr | 107 - usr.bin/mail/USD.doc/mail8.nr | 75 - usr.bin/mail/USD.doc/mail9.nr | 203 -- usr.bin/mail/USD.doc/maila.nr | 33 - usr.bin/make/PSD.doc/stubs | 9 - usr.bin/make/PSD.doc/tutorial.ms | 3747 ------------------------------- usr.sbin/config/SMM.doc/0.t | 88 - usr.sbin/config/SMM.doc/1.t | 61 - usr.sbin/config/SMM.doc/2.t | 188 -- usr.sbin/config/SMM.doc/3.t | 299 --- usr.sbin/config/SMM.doc/4.t | 442 ---- usr.sbin/config/SMM.doc/5.t | 271 --- usr.sbin/config/SMM.doc/6.t | 233 -- usr.sbin/config/SMM.doc/a.t | 162 -- usr.sbin/config/SMM.doc/b.t | 137 -- usr.sbin/config/SMM.doc/c.t | 109 - usr.sbin/config/SMM.doc/d.t | 272 --- usr.sbin/config/SMM.doc/e.t | 114 - usr.sbin/config/SMM.doc/spell.ok | 305 --- usr.sbin/lpr/Makefile | 2 +- usr.sbin/lpr/SMM.doc/0.t | 68 - usr.sbin/lpr/SMM.doc/1.t | 77 - usr.sbin/lpr/SMM.doc/2.t | 141 -- usr.sbin/lpr/SMM.doc/3.t | 73 - usr.sbin/lpr/SMM.doc/4.t | 206 -- usr.sbin/lpr/SMM.doc/5.t | 116 - usr.sbin/lpr/SMM.doc/6.t | 94 - usr.sbin/lpr/SMM.doc/7.t | 226 -- usr.sbin/lpr/SMM.doc/Makefile | 12 - usr.sbin/lpr/SMM.doc/spell.ok | 70 - usr.sbin/timed/SMM.doc/timed/Makefile | 12 - usr.sbin/timed/SMM.doc/timed/date | 53 - usr.sbin/timed/SMM.doc/timed/loop | 54 - usr.sbin/timed/SMM.doc/timed/spell.ok | 34 - usr.sbin/timed/SMM.doc/timed/time | 53 - usr.sbin/timed/SMM.doc/timed/timed.ms | 462 ---- usr.sbin/timed/SMM.doc/timed/unused | 53 - usr.sbin/timed/SMM.doc/timedop/Makefile | 8 - usr.sbin/timed/SMM.doc/timedop/timed.ms | 279 --- 179 files changed, 31850 insertions(+), 31882 deletions(-) delete mode 100644 bin/csh/USD.doc/csh.1 delete mode 100644 bin/csh/USD.doc/csh.2 delete mode 100644 bin/csh/USD.doc/csh.3 delete mode 100644 bin/csh/USD.doc/csh.4 delete mode 100644 bin/csh/USD.doc/csh.a delete mode 100644 bin/csh/USD.doc/csh.g delete mode 100644 bin/csh/USD.doc/tabs delete mode 100644 lib/libc/rpc/PSD.doc/nfs.rfc.ms delete mode 100644 lib/libc/rpc/PSD.doc/rpc.prog.ms delete mode 100644 lib/libc/rpc/PSD.doc/rpc.rfc.ms delete mode 100644 lib/libc/rpc/PSD.doc/rpcgen.ms delete mode 100644 lib/libc/rpc/PSD.doc/stubs delete mode 100644 lib/libc/rpc/PSD.doc/xdr.nts.ms delete mode 100644 lib/libc/rpc/PSD.doc/xdr.rfc.ms delete mode 100644 sbin/fsck_ffs/SMM.doc/0.t delete mode 100644 sbin/fsck_ffs/SMM.doc/1.t delete mode 100644 sbin/fsck_ffs/SMM.doc/2.t delete mode 100644 sbin/fsck_ffs/SMM.doc/3.t delete mode 100644 sbin/fsck_ffs/SMM.doc/4.t delete mode 100644 sbin/fsck_ffs/SMM.doc/Makefile create mode 100644 share/doc/psd/12.make/stubs create mode 100644 share/doc/psd/12.make/tutorial.ms create mode 100644 share/doc/psd/18.gprof/abstract.me create mode 100644 share/doc/psd/18.gprof/gathering.me create mode 100644 share/doc/psd/18.gprof/header.me create mode 100644 share/doc/psd/18.gprof/intro.me create mode 100644 share/doc/psd/18.gprof/postp.me create mode 100644 share/doc/psd/18.gprof/postp1.pic create mode 100644 share/doc/psd/18.gprof/postp2.pic create mode 100644 share/doc/psd/18.gprof/postp3.pic create mode 100644 share/doc/psd/18.gprof/pres1.pic create mode 100644 share/doc/psd/18.gprof/pres2.pic create mode 100644 share/doc/psd/18.gprof/present.me create mode 100644 share/doc/psd/18.gprof/profiling.me create mode 100644 share/doc/psd/18.gprof/refs.me create mode 100644 share/doc/psd/22.rpcgen/rpcgen.ms create mode 100644 share/doc/psd/22.rpcgen/stubs create mode 100644 share/doc/psd/23.rpc/rpc.prog.ms create mode 100644 share/doc/psd/23.rpc/stubs create mode 100644 share/doc/psd/24.xdr/stubs create mode 100644 share/doc/psd/24.xdr/xdr.nts.ms create mode 100644 share/doc/psd/25.xdrrfc/stubs create mode 100644 share/doc/psd/25.xdrrfc/xdr.rfc.ms create mode 100644 share/doc/psd/26.rpcrfc/rpc.rfc.ms create mode 100644 share/doc/psd/26.rpcrfc/stubs create mode 100644 share/doc/psd/27.nfsrpc/nfs.rfc.ms create mode 100644 share/doc/psd/27.nfsrpc/stubs create mode 100644 share/doc/smm/02.config/0.t create mode 100644 share/doc/smm/02.config/1.t create mode 100644 share/doc/smm/02.config/2.t create mode 100644 share/doc/smm/02.config/3.t create mode 100644 share/doc/smm/02.config/4.t create mode 100644 share/doc/smm/02.config/5.t create mode 100644 share/doc/smm/02.config/6.t create mode 100644 share/doc/smm/02.config/a.t create mode 100644 share/doc/smm/02.config/b.t create mode 100644 share/doc/smm/02.config/c.t create mode 100644 share/doc/smm/02.config/d.t create mode 100644 share/doc/smm/02.config/e.t create mode 100644 share/doc/smm/02.config/spell.ok create mode 100644 share/doc/smm/03.fsck/0.t create mode 100644 share/doc/smm/03.fsck/1.t create mode 100644 share/doc/smm/03.fsck/2.t create mode 100644 share/doc/smm/03.fsck/3.t create mode 100644 share/doc/smm/03.fsck/4.t create mode 100644 share/doc/smm/07.lpr/0.t create mode 100644 share/doc/smm/07.lpr/1.t create mode 100644 share/doc/smm/07.lpr/2.t create mode 100644 share/doc/smm/07.lpr/3.t create mode 100644 share/doc/smm/07.lpr/4.t create mode 100644 share/doc/smm/07.lpr/5.t create mode 100644 share/doc/smm/07.lpr/6.t create mode 100644 share/doc/smm/07.lpr/7.t create mode 100644 share/doc/smm/07.lpr/Makefile create mode 100644 share/doc/smm/07.lpr/spell.ok create mode 100644 share/doc/smm/11.timedop/timed.ms create mode 100644 share/doc/smm/12.timed/date create mode 100644 share/doc/smm/12.timed/loop create mode 100644 share/doc/smm/12.timed/spell.ok create mode 100644 share/doc/smm/12.timed/time create mode 100644 share/doc/smm/12.timed/timed.ms create mode 100644 share/doc/smm/12.timed/unused create mode 100644 share/doc/usd/04.csh/csh.1 create mode 100644 share/doc/usd/04.csh/csh.2 create mode 100644 share/doc/usd/04.csh/csh.3 create mode 100644 share/doc/usd/04.csh/csh.4 create mode 100644 share/doc/usd/04.csh/csh.a create mode 100644 share/doc/usd/04.csh/csh.g create mode 100644 share/doc/usd/04.csh/tabs create mode 100644 share/doc/usd/05.dc/dc create mode 100644 share/doc/usd/06.bc/bc create mode 100644 share/doc/usd/07.mail/mail0.nr create mode 100644 share/doc/usd/07.mail/mail1.nr create mode 100644 share/doc/usd/07.mail/mail2.nr create mode 100644 share/doc/usd/07.mail/mail3.nr create mode 100644 share/doc/usd/07.mail/mail4.nr create mode 100644 share/doc/usd/07.mail/mail5.nr create mode 100644 share/doc/usd/07.mail/mail6.nr create mode 100644 share/doc/usd/07.mail/mail7.nr create mode 100644 share/doc/usd/07.mail/mail8.nr create mode 100644 share/doc/usd/07.mail/mail9.nr create mode 100644 share/doc/usd/07.mail/maila.nr delete mode 100644 usr.bin/bc/USD.doc/bc delete mode 100644 usr.bin/dc/USD.doc/dc delete mode 100644 usr.bin/gprof/PSD.doc/abstract.me delete mode 100644 usr.bin/gprof/PSD.doc/gathering.me delete mode 100644 usr.bin/gprof/PSD.doc/header.me delete mode 100644 usr.bin/gprof/PSD.doc/intro.me delete mode 100644 usr.bin/gprof/PSD.doc/postp.me delete mode 100644 usr.bin/gprof/PSD.doc/postp1.pic delete mode 100644 usr.bin/gprof/PSD.doc/postp2.pic delete mode 100644 usr.bin/gprof/PSD.doc/postp3.pic delete mode 100644 usr.bin/gprof/PSD.doc/pres1.pic delete mode 100644 usr.bin/gprof/PSD.doc/pres2.pic delete mode 100644 usr.bin/gprof/PSD.doc/present.me delete mode 100644 usr.bin/gprof/PSD.doc/profiling.me delete mode 100644 usr.bin/gprof/PSD.doc/refs.me delete mode 100644 usr.bin/mail/USD.doc/mail0.nr delete mode 100644 usr.bin/mail/USD.doc/mail1.nr delete mode 100644 usr.bin/mail/USD.doc/mail2.nr delete mode 100644 usr.bin/mail/USD.doc/mail3.nr delete mode 100644 usr.bin/mail/USD.doc/mail4.nr delete mode 100644 usr.bin/mail/USD.doc/mail5.nr delete mode 100644 usr.bin/mail/USD.doc/mail6.nr delete mode 100644 usr.bin/mail/USD.doc/mail7.nr delete mode 100644 usr.bin/mail/USD.doc/mail8.nr delete mode 100644 usr.bin/mail/USD.doc/mail9.nr delete mode 100644 usr.bin/mail/USD.doc/maila.nr delete mode 100644 usr.bin/make/PSD.doc/stubs delete mode 100644 usr.bin/make/PSD.doc/tutorial.ms delete mode 100644 usr.sbin/config/SMM.doc/0.t delete mode 100644 usr.sbin/config/SMM.doc/1.t delete mode 100644 usr.sbin/config/SMM.doc/2.t delete mode 100644 usr.sbin/config/SMM.doc/3.t delete mode 100644 usr.sbin/config/SMM.doc/4.t delete mode 100644 usr.sbin/config/SMM.doc/5.t delete mode 100644 usr.sbin/config/SMM.doc/6.t delete mode 100644 usr.sbin/config/SMM.doc/a.t delete mode 100644 usr.sbin/config/SMM.doc/b.t delete mode 100644 usr.sbin/config/SMM.doc/c.t delete mode 100644 usr.sbin/config/SMM.doc/d.t delete mode 100644 usr.sbin/config/SMM.doc/e.t delete mode 100644 usr.sbin/config/SMM.doc/spell.ok delete mode 100644 usr.sbin/lpr/SMM.doc/0.t delete mode 100644 usr.sbin/lpr/SMM.doc/1.t delete mode 100644 usr.sbin/lpr/SMM.doc/2.t delete mode 100644 usr.sbin/lpr/SMM.doc/3.t delete mode 100644 usr.sbin/lpr/SMM.doc/4.t delete mode 100644 usr.sbin/lpr/SMM.doc/5.t delete mode 100644 usr.sbin/lpr/SMM.doc/6.t delete mode 100644 usr.sbin/lpr/SMM.doc/7.t delete mode 100644 usr.sbin/lpr/SMM.doc/Makefile delete mode 100644 usr.sbin/lpr/SMM.doc/spell.ok delete mode 100644 usr.sbin/timed/SMM.doc/timed/Makefile delete mode 100644 usr.sbin/timed/SMM.doc/timed/date delete mode 100644 usr.sbin/timed/SMM.doc/timed/loop delete mode 100644 usr.sbin/timed/SMM.doc/timed/spell.ok delete mode 100644 usr.sbin/timed/SMM.doc/timed/time delete mode 100644 usr.sbin/timed/SMM.doc/timed/timed.ms delete mode 100644 usr.sbin/timed/SMM.doc/timed/unused delete mode 100644 usr.sbin/timed/SMM.doc/timedop/Makefile delete mode 100644 usr.sbin/timed/SMM.doc/timedop/timed.ms diff --git a/bin/csh/USD.doc/csh.1 b/bin/csh/USD.doc/csh.1 deleted file mode 100644 index 915cb23..0000000 --- a/bin/csh/USD.doc/csh.1 +++ /dev/null @@ -1,1012 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)csh.1 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.EH 'USD:4-%''An Introduction to the C shell' -.OH 'An Introduction to the C shell''USD:4-%' -.\".RP -.TL -An Introduction to the C shell -.AU -William Joy -(revised for 4.3BSD by Mark Seiden) -.AI -Computer Science Division -.br -Department of Electrical Engineering and Computer Science -.br -University of California, Berkeley -.br -Berkeley, California 94720 -.AB -.I Csh -is a new command language interpreter for -.UX -systems. -It incorporates good features of other shells and a -.I history -mechanism similar to the -.I redo -of \s-2INTERLISP\s0. -While incorporating many features of other shells which make -writing shell programs (shell scripts) easier, -most of the features unique to -.I csh -are designed more for the interactive \s-2UNIX\s0 user. -.PP -\s-2UNIX\s0 -users who have read a general introduction to the system -will find a valuable basic explanation of the shell here. -Simple terminal interaction with -.I csh -is possible after reading just the first section of this document. -The second section describes the shell's capabilities which you can -explore after you have begun to become acquainted with the shell. -Later sections introduce features which are useful, but not necessary -for all users of the shell. -.PP -Additional information includes an appendix listing special characters of the shell -and a glossary of terms and commands introduced in this manual. -.AE -.SH -.if n .ND -Introduction -.PP -A -.I shell -is a command language interpreter. -.I Csh -is the name of one particular command interpreter on -\s-2UNIX\s0. -The primary purpose of -.I csh -is to translate command lines typed at a terminal into -system actions, such as invocation of other programs. -.I Csh -is a user program just like any you might write. -Hopefully, -.I csh -will be a very useful program for you -in interacting with the \s-2UNIX\s0 system. -.PP -In addition to this document, you will want to refer to a copy -of the \s-2UNIX\s0 User Reference Manual. -The -.I csh -documentation in section 1 of the manual provides a full description of all -features of the shell and is the definitive reference for questions -about the shell. -.PP -Many words in this document are shown in -.I italics. -These are important words; -names of commands, and words which have special meaning in discussing -the shell and \s-2UNIX\s0. -Many of the words are defined in a glossary at the end of this document. -If you don't know what is meant by a word, you should look -for it in the glossary. -.SH -Acknowledgements -.PP -Numerous people have provided good input about previous versions -of -.I csh -and aided in its debugging and in the debugging of its documentation. -I would especially like to thank Michael Ubell -who made the crucial observation that history commands could be -done well over the word structure of input text, and implemented -a prototype history mechanism in an older version of the shell. -Eric Allman has also provided a large number of useful comments on the -shell, helping to unify those concepts which are present and to identify -and eliminate useless and marginally useful features. -Mike O'Brien suggested the pathname hashing -mechanism which speeds command execution. -Jim Kulp added the job control and directory stack primitives and -added their documentation to this introduction. -.br -.bp -.NH -Terminal usage of the shell -.NH 2 -The basic notion of commands -.PP -A -.I shell -in -\s-2UNIX\s0 -acts mostly as a medium through which other -.I programs -are invoked. -While it has a set of -.I builtin -functions which it performs directly, -most commands cause execution of programs that are, in fact, -external to the shell. -The shell is thus distinguished from the command interpreters of other -systems both by the fact that it is just a user program, and by the fact -that it is used almost exclusively as a mechanism for invoking other programs. -.PP -.I Commands -in the \s-2UNIX\s0 system consist of a list of strings or -.I words -interpreted as a -.I "command name" -followed by -.I arguments. -Thus the command -.DS -mail bill -.DE -consists of two words. -The first word -.I mail -names the command to be executed, in this case the -mail program which sends messages to other users. -The shell uses the name of the command in attempting to execute it for you. -It will look in a number of -.I directories -for a file with the name -.I mail -which is expected to contain the mail program. -.PP -The rest of the words of the command are given as -.I arguments -to the command itself when it is executed. -In this case we specified also the argument -.I bill -which is interpreted by the -.I mail -program to be the name of a user to whom mail is to be sent. -In normal terminal usage we might use the -.I mail -command as follows. -.DS -% mail bill -I have a question about the csh documentation. -My document seems to be missing page 5. -Does a page five exist? - Bill -EOT -% -.DE -.PP -Here we typed a message to send to -.I bill -and ended this message with a ^D which sent an end-of-file to -the mail program. -(Here and throughout this document, the notation ``^\fIx\fR'' -is to be read ``control-\fIx\fR'' and represents the striking of the \fIx\fR -key while the control key is held down.) -The mail program -then echoed the characters `EOT' and transmitted our message. -The characters `% ' were printed before and after the mail command -by the shell to indicate that input was needed. -.PP -After typing the `% ' prompt the shell was reading command input from -our terminal. -We typed a complete command `mail bill'. -The shell then executed the -.I mail -program with argument -.I bill -and went dormant waiting for it to complete. -The mail program then read input from our terminal until we signalled -an end-of-file via typing a ^D after which the shell noticed -that mail had completed -and signaled us that it was ready to read from the terminal again by -printing another `% ' prompt. -.PP -This is the essential pattern of all interaction with \s-2UNIX\s0 -through the shell. -A complete command is typed at the terminal, the shell executes -the command and when this execution completes, it prompts for a new command. -If you run the editor for an hour, the shell will patiently wait for -you to finish editing and obediently prompt you again whenever you finish -editing. -.PP -An example of a useful command you can execute now is the -.I tset -command, which sets the default -.I erase -and -.I kill -characters on your terminal \- the erase character erases the last -character you typed and the kill character erases the entire line you -have entered so far. -By default, the erase character is the delete key (equivalent to `^?') -and the kill character is `^U'. Some people prefer to make the erase character -the backspace key (equivalent to `^H'). -You can make this be true by typing -.DS -tset \-e -.DE -which tells the program -.I tset -to set the erase character to tset's default setting for this character -(a backspace). -.NH 2 -Flag arguments -.PP -A useful notion in \s-2UNIX\s0 is that of a -.I flag -argument. -While many arguments to commands specify file names or user names, -some arguments rather specify an optional capability of the command -which you wish to invoke. -By convention, such arguments begin with the character `\-' (hyphen). -Thus the command -.DS -ls -.DE -will produce a list of the files in the current -.I "working directory" . -The option -.I \-s -is the size option, and -.DS -ls \-s -.DE -causes -.I ls -to also give, for each file the size of the file in blocks of 512 -characters. -The manual section for each command in the \s-2UNIX\s0 reference manual -gives the available options for each command. -The -.I ls -command has a large number of useful and interesting options. -Most other commands have either no options or only one or two options. -It is hard to remember options of commands which are not used very -frequently, so most \s-2UNIX\s0 utilities perform only one or two functions -rather than having a large number of hard to remember options. -.NH 2 -Output to files -.PP -Commands that normally read input or write output on the terminal -can also be executed with this input and/or output done to -a file. -.PP -Thus suppose we wish to save the current date in a file called `now'. -The command -.DS -date -.DE -will print the current date on our terminal. -This is because our terminal is the default -.I "standard output" -for the date command and the date command prints the date on its -standard output. -The shell lets us -.I redirect -the -.I "standard output" -of a command through a -notation using the -.I metacharacter -`>' and the name of the file where output is to be placed. -Thus the command -.DS -date > now -.DE -runs the -.I date -command such that its standard output is -the file `now' rather than the terminal. -Thus this command places the current date and time into the file `now'. -It is important to know that the -.I date -command was unaware that its output was going to a file rather than -to the terminal. -The shell performed this -.I redirection -before the command began executing. -.PP -One other thing to note here is that the file `now' -need not have existed before the -.I date -command was executed; the shell would have created the file if it did -not exist. -And if the file did exist? -If it had existed previously these previous contents would have been discarded! -A shell option -.I noclobber -exists to prevent this from happening accidentally; -it is discussed in section 2.2. -.PP -The system normally keeps files which you create with `>' and all other files. -Thus the default is for files to be permanent. If you wish to create a file -which will be removed automatically, you can begin its name with a `#' -character, this `scratch' character denotes the fact that the file will -be a scratch file.* -.FS -*Note that if your erase character is a `#', you will have to precede the -`#' with a `\e'. The fact that the `#' character is the old (pre-\s-2CRT\s0) -standard erase character means that it seldom appears in a file name, and -allows this convention to be used for scratch files. If you are using a -\s-2CRT\s0, your erase character should be a ^H, as we demonstrated -in section 1.1 how this could be set up. -.FE -The system will remove such files after a couple of days, -or sooner if file space becomes very tight. -Thus, in running the -.I date -command above, we don't really want to save the output forever, so we -would more likely do -.DS -date > #now -.DE -.NH 2 -Metacharacters in the shell -.PP -The shell has a large number of -special characters (like `>') -which indicate special functions. -We say that these notations have -.I syntactic -and -.I semantic -meaning to the shell. -In general, most characters which are neither letters nor digits -have special meaning to the shell. -We shall shortly learn a means of -.I quotation -which allows us to use -.I metacharacters -without the shell treating them in any special way. -.PP -Metacharacters normally have effect only when the shell is reading -our input. -We need not worry about placing shell metacharacters in a letter -we are sending via -.I mail, -or when we are typing in text or data to some other program. -Note that the shell is only reading input when it has prompted with -`% ' (although we can type our input even before it prompts). -.NH 2 -Input from files; pipelines -.PP -We learned above how to -.I redirect -the -.I "standard output" -of a command -to a file. -It is also possible to redirect the -.I "standard input" -of a command from a file. -This is not often necessary since most commands will read from -a file whose name is given as an argument. -We can give the command -.DS -sort < data -.DE -to run the -.I sort -command with standard input, where the command normally -reads its input, from the file -`data'. -We would more likely say -.DS -sort data -.DE -letting the -.I sort -command open the file -`data' -for input itself since this is less to type. -.PP -We should note that if we just typed -.DS -sort -.DE -then the sort program would sort lines from its -.I "standard input." -Since we did not -.I redirect -the standard input, it would sort lines as we typed them on the terminal -until we typed a ^D to indicate an end-of-file. -.PP -A most useful capability is the ability to combine the standard output -of one command with the standard input of another, i.e. to run the -commands in a sequence known as a -.I pipeline. -For instance the command -.DS -ls \-s -.DE -normally produces a list of the files in our directory with the size -of each in blocks of 512 characters. -If we are interested in learning which of our files is largest we -may wish to have this sorted by size rather than by name, which is -the default way in which -.I ls -sorts. -We could look at the many options of -.I ls -to see if there was an option to do this but would eventually discover -that there is not. -Instead we can use a couple of simple options of the -.I sort -command, combining it with -.I ls -to get what we want. -.PP -The -.I \-n -option of sort specifies a numeric sort rather than an alphabetic sort. -Thus -.DS -ls \-s | sort \-n -.DE -specifies that the output of the -.I ls -command run with the option -.I \-s -is to be -.I piped -to the command -.I sort -run with the numeric sort option. -This would give us a sorted list of our files by size, but with the -smallest first. -We could then use the -.I \-r -reverse sort option and the -.I head -command in combination with the previous command doing -.DS -ls \-s | sort \-n \-r | head \-5 -.DE -Here we have taken a list of our files sorted alphabetically, -each with the size in blocks. -We have run this to the standard input of the -.I sort -command asking it to sort numerically in reverse order (largest first). -This output has then been run into the command -.I head -which gives us the first few lines. -In this case we have asked -.I head -for the first 5 lines. -Thus this command gives us the names and sizes of our 5 largest files. -.PP -The notation introduced above is called the -.I pipe -mechanism. -Commands separated by `\||\|' characters are connected together by the -shell and the standard output of each is run into the standard input of the -next. -The leftmost command in a pipeline will normally take its standard -input from the terminal and the rightmost will place its standard -output on the terminal. -Other examples of pipelines will be given later when we discuss the -history mechanism; -one important use of pipes which is illustrated there is in the -routing of information to the line printer. -.NH 2 -Filenames -.PP -Many commands to be executed will need the names of files as arguments. -\s-2UNIX\s0 -.I pathnames -consist of a number of -.I components -separated by `/'. -Each component except the last names a directory in which the next -component resides, in effect specifying the -.I path -of directories to follow to reach the file. -Thus the pathname -.DS -/etc/motd -.DE -specifies a file in the directory -`etc' -which is a subdirectory of the -.I root -directory `/'. -Within this directory the file named is `motd' which stands -for `message of the day'. -A -.I pathname -that begins with a slash is said to be an -.I absolute -pathname since it is specified from the absolute top of the entire -directory hierarchy of the system (the -.I root ). -.I Pathnames -which do not begin with `/' are interpreted as starting in the current -.I "working directory" , -which is, by default, your -.I home -directory and can be changed dynamically by the -.I cd -change directory command. -Such pathnames are said to be -.I relative -to the working directory since they are found by starting -in the working directory and descending to lower levels of directories -for each -.I component -of the pathname. If the pathname contains no slashes at all then the -file is contained in the working directory itself and the pathname is merely -the name of the file in this directory. -Absolute pathnames have no relation -to the working directory. -.PP -Most filenames consist of a number of alphanumeric characters and -`.'s (periods). -In fact, all printing characters except `/' (slash) may appear in filenames. -It is inconvenient to have most non-alphabetic characters in filenames -because many of these have special meaning to the shell. -The character `.' (period) is not a shell-metacharacter and is often used -to separate the -.I extension -of a file name from the base of the name. -Thus -.DS -prog.c prog.o prog.errs prog.output -.DE -are four related files. -They share a -.I base -portion of a name -(a base portion being that part of the name that is left when a trailing -`.' and following characters which are not `.' are stripped off). -The file -`prog.c' -might be the source for a C program, -the file `prog.o' the corresponding object file, -the file -`prog.errs' the errors resulting from a compilation of the program -and the file -`prog.output' the output of a run of the program. -.PP -If we wished to refer to all four of these files in a command, we could -use the notation -.DS -prog.* -.DE -This expression is expanded by the shell, before the command to which it is -an argument is executed, into a list of names which begin with `prog.'. -The character `*' here matches any sequence (including the empty sequence) -of characters in a file name. -The names which match are alphabetically sorted and placed in the -.I "argument list" -of the command. -Thus the command -.DS -echo prog.* -.DE -will echo the names -.DS -prog.c prog.errs prog.o prog.output -.DE -Note that the names are in sorted order here, and a different -order than we listed them above. -The -.I echo -command receives four words as arguments, even though we only typed -one word as an argument directly. -The four words were generated by -.I "filename expansion" -of the one input word. -.PP -Other notations for -.I "filename expansion" -are also available. -The character `?' matches any single character in a filename. -Thus -.DS -echo ? \|?? \|??? -.DE -will echo a line of filenames; first those with one character names, -then those with two character names, and finally those with three -character names. -The names of each length will be independently sorted. -.PP -Another mechanism consists of a sequence of characters between `[' and `]'. -This metasequence matches any single character from the enclosed set. -Thus -.DS -prog.[co] -.DE -will match -.DS -prog.c prog.o -.DE -in the example above. -We can also place two characters around a `\-' in this notation to denote -a range. -Thus -.DS -chap.[1\-5] -.DE -might match files -.DS -chap.1 chap.2 chap.3 chap.4 chap.5 -.DE -if they existed. -This is shorthand for -.DS -chap.[12345] -.DE -and otherwise equivalent. -.PP -An important point to note is that if a list of argument words to -a command (an -.I "argument list)" -contains filename expansion syntax, and if this filename expansion syntax -fails to match any existing file names, then the shell considers this -to be an error and prints a diagnostic -.DS -No match. -.DE -and does not execute the command. -.PP -Another very important point is that files with the character `.' at the -beginning are treated specially. -Neither `*' or `?' or the `[' `]' mechanism will match it. -This prevents accidental matching of the filenames `.' and `..' -in the working directory which have special meaning to the system, -as well as other files such as -.I \&.cshrc -which are not normally -visible. -We will discuss the special role of the file -.I \&.cshrc -later. -.PP -Another filename expansion mechanism gives access to the pathname of -the -.I home -directory of other users. -This notation consists of the character `~' (tilde) followed by another user's -login name. -For instance the word `~bill' would map to the pathname `/usr/bill' -if the home directory for `bill' was `/usr/bill'. -Since, on large systems, users may have login directories scattered over -many different disk volumes with different prefix directory names, -this notation provides a convenient way of accessing the files -of other users. -.PP -A special case of this notation consists of a `~' alone, e.g. `~/mbox'. -This notation is expanded by the shell into the file `mbox' in your -.I home -directory, i.e. into `/usr/bill/mbox' for me on Ernie Co-vax, the UCB -Computer Science Department VAX machine, where this document was prepared. -This can be very useful if you have used -.I cd -to change to another directory and have found a file you wish to -copy using -.I cp. -If I give the command -.DS -cp thatfile ~ -.DE -the shell will expand this command to -.DS -cp thatfile /usr/bill -.DE -since my home directory is /usr/bill. -.PP -There also exists a mechanism using the characters `{' and `}' for -abbreviating a set of words which have common parts but cannot -be abbreviated by the above mechanisms because they are not files, -are the names of files which do not yet exist, -are not thus conveniently described. -This mechanism will be described much later, -in section 4.2, -as it is used less frequently. -.NH 2 -Quotation -.PP -We have already seen a number of metacharacters used by the shell. -These metacharacters pose a problem in that we cannot use them directly -as parts of words. -Thus the command -.DS -echo * -.DE -will not echo the character `*'. -It will either echo a sorted list of filenames in the -current -.I "working directory," -or print the message `No match' if there are -no files in the working directory. -.PP -The recommended mechanism for placing characters which are neither numbers, -digits, `/', `.' or `\-' in an argument word to a command is to enclose -it with single quotation characters `\'', i.e. -.DS -echo \'*\' -.DE -There is one special character `!' which is used by the -.I history -mechanism of the shell and which cannot be -.I escaped -by placing it within `\'' characters. -It and the character `\'' itself can be preceded by a single `\e' -to prevent their special meaning. -Thus -.DS -echo \e\'\e! -.DE -prints -.DS -\'! -.DE -These two mechanisms suffice to place any printing character into a word -which is an argument to a shell command. They can be combined, as in -.DS -echo \e\'\'*\' -.DE -which prints -.DS -\'* -.DE -since the first `\e' escaped the first `\'' and the `*' was enclosed -between `\'' characters. -.NH 2 -Terminating commands -.PP -When you are executing a command and the shell is -waiting for it to complete there are several ways -to force it to stop. -For instance if you type the command -.DS -cat /etc/passwd -.DE -the system will print a copy of a list of all users of the system -on your terminal. -This is likely to continue for several minutes unless you stop it. -You can send an -\s-2INTERRUPT\s0 -.I signal -to the -.I cat -command by typing ^C on your terminal.* -.FS -*On some older Unix systems the \s-2DEL\s0 or \s-2RUBOUT\s0 key -has the same effect. "stty all" will tell you the INTR key value. -.FE -Since -.I cat -does not take any precautions to avoid or otherwise handle this signal -the -\s-2INTERRUPT\s0 -will cause it to terminate. -The shell notices that -.I cat -has terminated and prompts you again with `% '. -If you hit \s-2INTERRUPT\s0 again, the shell will just -repeat its prompt since it handles \s-2INTERRUPT\s0 signals -and chooses to continue to execute commands rather than terminating -like -.I cat -did, which would have the effect of logging you out. -.PP -Another way in which many programs terminate is when they get an end-of-file -from their standard input. -Thus the -.I mail -program in the first example above was terminated when we typed a ^D -which generates an end-of-file from the standard input. -The shell also terminates when it gets an end-of-file printing `logout'; -\s-2UNIX\s0 then logs you off the system. -Since this means that typing too many ^D's can accidentally log us off, -the shell has a mechanism for preventing this. -This -.I ignoreeof -option will be discussed in section 2.2. -.PP -If a command has its standard input redirected from a file, then it will -normally terminate when it reaches the end of this file. -Thus if we execute -.DS -mail bill < prepared.text -.DE -the mail command will terminate without our typing a ^D. -This is because it read to the end-of-file of our file -`prepared.text' in which we placed a message for `bill' with an editor program. -We could also have done -.DS -cat prepared.text \||\| mail bill -.DE -since the -.I cat -command would then have written the text through the pipe to the -standard input of the mail command. -When the -.I cat -command completed it would have terminated, -closing down the pipeline -and the -.I mail -command would have received an end-of-file from it and terminated. -Using a pipe here is more complicated than redirecting input -so we would more likely use the first form. -These commands could also have been stopped by sending an \s-2INTERRUPT\s0. -.PP -Another possibility for stopping a command is to suspend its execution -temporarily, with the possibility of continuing execution later. This is -done by sending a \s-2STOP\s0 signal via typing a ^Z. -This signal causes all commands running on the terminal -(usually one but more if a pipeline is executing) to become suspended. -The shell notices that the command(s) have been suspended, types -`Stopped' and then prompts for a new command. -The previously executing command has been suspended, but otherwise -unaffected by the \s-2STOP\s0 signal. Any other commands can be executed -while the original command remains suspended. The suspended command can -be continued using the -.I fg -command with no arguments. The shell will then retype the command -to remind you which command is being continued, and cause the command -to resume execution. Unless any input files in use by the suspended -command have been changed in the meantime, the suspension has no effect -whatsoever on the execution of the command. This feature can be very useful -during editing, when you need to look at another file before continuing. -An -example of command suspension follows. -.DS -% mail harold -Someone just copied a big file into my directory and its name is -^Z -Stopped -% ls -funnyfile -prog.c -prog.o -% jobs -.ta 1.75i -[1] + Stopped mail harold -% fg -mail harold -funnyfile. Do you know who did it? -EOT -% -.so tabs -.DE -In this example someone was sending a message to Harold and forgot the -name of the file he wanted to mention. The mail command was suspended -by typing ^Z. When the shell noticed that the mail program was -suspended, it typed `Stopped' and prompted for a new command. Then the -.I ls -command was typed to find out the name of the file. The -.I jobs -command was run to find out which command was suspended. -At this time the -.I fg -command was typed to continue execution of the mail program. Input -to the mail program was then continued and ended with a ^D -which indicated the end of the message at which time the mail -program typed EOT. The -.I jobs -command will show which commands are suspended. -The ^Z should only be typed at the beginning of a line since -everything typed on the current line is discarded when a signal is sent -from the keyboard. This also happens on \s-2INTERRUPT\s0, and \s-2QUIT\s0 -signals. More information on -suspending jobs and controlling them is given in -section 2.6. -.PP -If you write or run programs which are not fully debugged then it may -be necessary to stop them somewhat ungracefully. -This can be done by sending them a \s-2QUIT\s0 -signal, sent by typing a ^\e. -This will usually provoke the shell to produce a message like: -.DS -Quit (Core dumped) -.DE -indicating that a file -`core' has been created containing information about the running program's -state when it terminated due to the \s-2QUIT\s0 signal. -You can examine this file yourself, or forward information to the -maintainer of the program telling him/her where the -.I "core file" -is. -.PP -If you run background commands (as explained in section 2.6) then these -commands will ignore \s-2INTERRUPT\s0 and \s-2QUIT\s0 signals at the -terminal. To stop them you must use the -.I kill -command. See section 2.6 for an example. -.PP -If you want to examine the output of a command without having it move -off the screen as the output of the -.DS -cat /etc/passwd -.DE -command will, you can use the command -.DS -more /etc/passwd -.DE -The -.I more -program pauses after each complete screenful and types `\-\-More\-\-' -at which point you can hit a space to get another screenful, a return -to get another line, a `?' to get some help on other commands, or a `q' to end the -.I more -program. You can also use more as a filter, i.e. -.DS -cat /etc/passwd | more -.DE -works just like the more simple more command above. -.PP -For stopping output of commands not involving -.I more -you can use the -^S key to stop the typeout. The typeout will resume when you -hit ^Q or any other key, but ^Q is normally used because -it only restarts the output and does not become input to the program -which is running. This works well on low-speed terminals, but at 9600 -baud it is hard to type ^S and ^Q fast enough to paginate -the output nicely, and a program like -.I more -is usually used. -.PP -An additional possibility is to use the ^O flush output -character; when this character is typed, all output from the current -command is thrown away (quickly) until the next input read occurs -or until the next shell prompt. This can be used to allow a command -to complete without having to suffer through the output on a slow -terminal; ^O is a toggle, so flushing can be turned off by -typing ^O again while output is being flushed. -.NH 2 -What now? -.PP -We have so far seen a number of mechanisms of the shell and learned a lot -about the way in which it operates. -The remaining sections will go yet further into the internals of the -shell, but you will surely want to try using the -shell before you go any further. -To try it you can log in to \s-2UNIX\s0 and type the following -command to the system: -.DS -chsh myname /bin/csh -.DE -Here `myname' should be replaced by the name you typed to -the system prompt of `login:' to get onto the system. -Thus I would use `chsh bill /bin/csh'. -.B -You only have to do this once; it takes effect at next login. -.R -You are now ready to try using -.I csh. -.PP -Before you do the `chsh' command, the shell you are using when -you log into the system is `/bin/sh'. -In fact, much of the above discussion is applicable to `/bin/sh'. -The next section will introduce many features particular to -.I csh -so you should change your shell to -.I csh -before you begin reading it. -.bp diff --git a/bin/csh/USD.doc/csh.2 b/bin/csh/USD.doc/csh.2 deleted file mode 100644 index 5fbf43c..0000000 --- a/bin/csh/USD.doc/csh.2 +++ /dev/null @@ -1,1304 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)csh.2 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.nr H1 1 -.NH -Details on the shell for terminal users -.NH 2 -Shell startup and termination -.PP -When you login, the shell is started by the system in your -.I home -directory and begins by reading commands from a file -.I \&.cshrc -in this directory. -All shells which you may start during your terminal session will -read from this file. -We will later see what kinds of commands are usefully placed there. -For now we need not have this file and the shell does not complain about -its absence. -.PP -A -.I "login shell" , -executed after you login to the system, -will, after it reads commands from -.I \&.cshrc, -read commands from a file -.I \&.login -also in your home directory. -This file contains commands which you wish to do each time you login -to the \s-2UNIX\s0 system. -My -.I \&.login -file looks something like: -.DS -set ignoreeof -set mail=(/usr/spool/mail/bill) -echo "${prompt}users" ; users -alias ts \e - \'set noglob ; eval \`tset \-s \-m dialup:c100rv4pna \-m plugboard:?hp2621nl \!*\`\'; -ts; stty intr ^C kill ^U crt -set time=15 history=10 -msgs \-f -if (\-e $mail) then - echo "${prompt}mail" - mail -endif -.DE -.PP -This file contains several commands to be executed by \s-2UNIX\s0 -each time I login. -The first is a -.I set -command which is interpreted directly by the shell. It sets the shell -variable -.I ignoreeof -which causes the shell to not log me off if I hit ^D. Rather, -I use the -.I logout -command to log off of the system. -By setting the -.I mail -variable, I ask the shell to watch for incoming mail to me. Every 5 minutes -the shell looks for this file and tells me if more mail has arrived there. -An alternative to this is to put the command -.DS -biff y -.DE -in place of this -.I set; -this will cause me to be notified immediately when mail arrives, and to -be shown the first few lines of the new message. -.PP -Next I set the shell variable `time' to `15' causing the shell to automatically -print out statistics lines for commands which execute for at least 15 seconds -of \s-2CPU\s+2 time. The variable `history' is set to 10 indicating that -I want the shell to remember the last 10 commands I type in its -.I "history list" , -(described later). -.PP -I create an -.I alias -``ts'' which executes a -\fItset\fR\|(1) command setting up the modes of the terminal. -The parameters to -.I tset -indicate the kinds of terminal which I usually use when not on a hardwired -port. I then execute ``ts'' and also use the -.I stty -command to change the interrupt character to ^C and the line kill -character to ^U. -.PP -I then run the `msgs' program, which provides me with any -system messages which I have not seen before; the `\-f' option here prevents -it from telling me anything if there are no new messages. -Finally, if my mailbox file exists, then I run the `mail' program to -process my mail. -.PP -When the `mail' and `msgs' programs finish, the shell will finish -processing my -.I \&.login -file and begin reading commands from the terminal, prompting for each with -`% '. -When I log off (by giving the -.I logout -command) the shell -will print `logout' and execute commands from the file `.logout' -if it exists in my home directory. -After that the shell will terminate and \s-2UNIX\s0 will log -me off the system. -If the system is not going down, I will receive a new login message. -In any case, after the `logout' message the shell is committed to terminating -and will take no further input from my terminal. -.NH 2 -Shell variables -.PP -The shell maintains a set of -.I variables. -We saw above the variables -.I history -and -.I time -which had values `10' and `15'. -In fact, each shell variable has as value an array of -zero or more -.I strings. -Shell variables may be assigned values by the set command. It has -several forms, the most useful of which was given above and is -.DS -set name=value -.DE -.PP -Shell variables may be used to store values which are to -be used in commands later through a substitution mechanism. -The shell variables most commonly referenced are, however, those which the -shell itself refers to. -By changing the values of these variables one can directly affect the -behavior of the shell. -.PP -One of the most important variables is the variable -.I path. -This variable contains a sequence of directory names where the shell -searches for commands. -The -.I set -command with no arguments -shows the value of all variables currently defined (we usually say -.I set) -in the shell. -The default value for path will be shown by -.I set -to be -.DS -% set -.ta .75i -argv () -cwd /usr/bill -home /usr/bill -path (. /usr/ucb /bin /usr/bin) -prompt % -shell /bin/csh -status 0 -term c100rv4pna -user bill -% -.so tabs -.DE -This output indicates that the variable path points to the current -directory `.' and then `/usr/ucb', `/bin' and `/usr/bin'. -Commands which you may write might be in `.' (usually one of -your directories). -Commands developed at Berkeley, live in `/usr/ucb' -while commands developed at Bell Laboratories live in `/bin' and `/usr/bin'. -.PP -A number of locally developed programs on the system live in the directory -`/usr/local'. -If we wish that all shells which we invoke to have -access to these new programs we can place the command -.DS -set path=(. /usr/ucb /bin /usr/bin /usr/local) -.DE -in our file -.I \&.cshrc -in our home directory. -Try doing this and then logging out and back in and do -.DS -set -.DE -again to see that the value assigned to -.I path -has changed. -.FS \(dg -Another directory that might interest you is /usr/new, which contains -many useful user-contributed programs provided with Berkeley Unix. -.FE -.PP -One thing you should be aware of is that the shell examines each directory -which you insert into your path and determines which commands are contained -there. Except for the current directory `.', which the shell treats specially, -this means that if commands are added to a directory in your search path after -you have started the shell, they will not necessarily be found by the shell. -If you wish to use a command which has been added in this way, you should -give the command -.DS -rehash -.DE -to the shell, which will cause it to recompute its internal table of command -locations, so that it will find the newly added command. -Since the shell has to look in the current directory `.' on each command, -placing it at the end of the path specification usually works equivalently -and reduces overhead. -.PP -Other useful built in variables are the variable -.I home -which shows your home directory, -.I cwd -which contains your current working directory, -the variable -.I ignoreeof -which can be set in your -.I \&.login -file to tell the shell not to exit when it receives an end-of-file from -a terminal (as described above). -The variable `ignoreeof' -is one of several variables which the shell does not care about the -value of, only whether they are -.I set -or -.I unset. -Thus to set this variable you simply do -.DS -set ignoreeof -.DE -and to unset it do -.DS -unset ignoreeof -.DE -These give the variable `ignoreeof' no value, but none is desired or required. -.PP -Finally, some other built-in shell variables of use are the -variables -.I noclobber -and -.I mail. -The metasyntax -.DS -> filename -.DE -which redirects the standard output of a command -will overwrite and destroy the previous contents of the named file. -In this way you may accidentally overwrite a file which is valuable. -If you would prefer that the shell not overwrite files in this -way you can -.DS -set noclobber -.DE -in your -.I \&.login -file. -Then trying to do -.DS -date > now -.DE -would cause a diagnostic if `now' existed already. -You could type -.DS -date >! now -.DE -if you really wanted to overwrite the contents of `now'. -The `>!' is a special metasyntax indicating that clobbering the -file is ok.\(dg -.FS -\(dgThe space between the `!' and the word `now' is critical here, as `!now' -would be an invocation of the -.I history -mechanism, and have a totally different effect. -.FE -.NH 2 -The shell's history list -.PP -The shell can maintain a -.I "history list" -into which it places the words -of previous commands. -It is possible to use a notation to reuse commands or words -from commands in forming new commands. -This mechanism can be used to repeat previous commands or to -correct minor typing mistakes in commands. -.PP -The following figure gives a sample session involving typical usage of the -history mechanism of the shell. -.KF -.DS -% cat bug.c -main() - -{ - printf("hello); -} -% cc !$ -cc bug.c -"bug.c", line 4: newline in string or char constant -"bug.c", line 5: syntax error -% ed !$ -ed bug.c -29 -4s/);/"&/p - printf("hello"); -w -30 -q -% !c -cc bug.c -% a.out -hello% !e -ed bug.c -30 -4s/lo/lo\e\en/p - printf("hello\en"); -w -32 -q -% !c \-o bug -cc bug.c \-o bug -% size a.out bug -a.out: 2784+364+1028 = 4176b = 0x1050b -bug: 2784+364+1028 = 4176b = 0x1050b -% ls \-l !* -ls \-l a.out bug -\(mirwxr\(mixr\(mix 1 bill 3932 Dec 19 09:41 a.out -\(mirwxr\(mixr\(mix 1 bill 3932 Dec 19 09:42 bug -% bug -hello -% num bug.c | spp -spp: Command not found. -% ^spp^ssp -num bug.c | ssp - 1 main() - 3 { - 4 printf("hello\en"); - 5 } -% !! | lpr -num bug.c | ssp | lpr -% -.DE -.KE -In this example we have a very simple C program which has a bug (or two) -in it in the file `bug.c', which we `cat' out on our terminal. We then -try to run the C compiler on it, referring to the file again as `!$', -meaning the last argument to the previous command. Here the `!' is the -history mechanism invocation metacharacter, and the `$' stands for the last -argument, by analogy to `$' in the editor which stands for the end of the line. -The shell echoed the command, as it would have been typed without use of -the history mechanism, and then executed it. -The compilation yielded error diagnostics so we now run the editor on the -file we were trying to compile, fix the bug, and run the C compiler again, -this time referring to this command simply as `!c', which repeats the last -command which started with the letter `c'. If there were other -commands starting with `c' done recently we could have said `!cc' or even -`!cc:p' which would have printed the last command starting with `cc' -without executing it. -.PP -After this recompilation, we ran the resulting `a.out' file, and then -noting that there still was a bug, ran the editor again. After fixing -the program we ran the C compiler again, but tacked onto the command -an extra `\-o bug' telling the compiler to place the resultant binary in -the file `bug' rather than `a.out'. In general, the history mechanisms -may be used anywhere in the formation of new commands and other characters -may be placed before and after the substituted commands. -.PP -We then ran the `size' command to see how large the binary program images -we have created were, and then an `ls \-l' command with the same argument -list, denoting the argument list `\!*'. -Finally we ran the program `bug' to see that its output is indeed correct. -.PP -To make a numbered listing of the program we ran the `num' command on the file `bug.c'. -In order to compress out blank lines in the output of `num' we ran the -output through the filter `ssp', but misspelled it as spp. To correct this -we used a shell substitute, placing the old text and new text between `^' -characters. This is similar to the substitute command in the editor. -Finally, we repeated the same command with `!!', but sent its output to the -line printer. -.PP -There are other mechanisms available for repeating commands. The -.I history -command prints out a number of previous commands with numbers by which -they can be referenced. There is a way to refer to a previous command -by searching for a string which appeared in it, and there are other, -less useful, ways to select arguments to include in a new command. -A complete description of all these mechanisms -is given in the C shell manual pages in the \s-2UNIX\s0 Programmer's Manual. -.NH 2 -Aliases -.PP -The shell has an -.I alias -mechanism which can be used to make transformations on input commands. -This mechanism can be used to simplify the commands you type, -to supply default arguments to commands, -or to perform transformations on commands and their arguments. -The alias facility is similar to a macro facility. -Some of the features obtained by aliasing can be obtained also -using shell command files, but these take place in another instance -of the shell and cannot directly affect the current shells environment -or involve commands such as -.I cd -which must be done in the current shell. -.PP -As an example, suppose that there is a new version of the mail program -on the system called `newmail' -you wish to use, rather than the standard mail program which is called -`mail'. -If you place the shell command -.DS -alias mail newmail -.DE -in your -.I \&.cshrc -file, the shell will transform an input line of the form -.DS -mail bill -.DE -into a call on `newmail'. -More generally, suppose we wish the command `ls' to always show -sizes of files, that is to always do `\-s'. -We can do -.DS -alias ls ls \-s -.DE -or even -.DS -alias dir ls \-s -.DE -creating a new command syntax `dir' -which does an `ls \-s'. -If we say -.DS -dir ~bill -.DE -then the shell will translate this to -.DS -ls \-s /mnt/bill -.DE -.PP -Thus the -.I alias -mechanism can be used to provide short names for commands, -to provide default arguments, -and to define new short commands in terms of other commands. -It is also possible to define aliases which contain multiple -commands or pipelines, showing where the arguments to the original -command are to be substituted using the facilities of the -history mechanism. -Thus the definition -.DS -alias cd \'cd \e!* ; ls \' -.DE -would do an -.I ls -command after each change directory -.I cd -command. -We enclosed the entire alias definition in `\'' characters to prevent -most substitutions from occurring and the character `;' from being -recognized as a metacharacter. -The `!' here is escaped with a `\e' to prevent it from being interpreted -when the alias command is typed in. -The `\e!*' here substitutes the entire argument list to the pre-aliasing -.I cd -command, without giving an error if there were no arguments. -The `;' separating commands is used here -to indicate that one command is to be done and then the next. -Similarly the definition -.DS -alias whois \'grep \e!^ /etc/passwd\' -.DE -defines a command which looks up its first argument in the password file. -.PP -.B Warning: -The shell currently reads the -.I \&.cshrc -file each time it starts up. If you place a large number of commands -there, shells will tend to start slowly. A mechanism for saving the shell -environment after reading the \fI\&.cshrc\fR file and quickly restoring it is -under development, but for now you should try to limit the number of -aliases you have to a reasonable number... 10 or 15 is reasonable, -50 or 60 will cause a noticeable delay in starting up shells, and make -the system seem sluggish when you execute commands from within the editor -and other programs. -.NH 2 -More redirection; >> and >& -.PP -There are a few more notations useful to the terminal user -which have not been introduced yet. -.PP -In addition to the standard output, commands also have a -.I "diagnostic output" -which is normally directed to the terminal even when the standard output -is redirected to a file or a pipe. -It is occasionally desirable to direct the diagnostic output along with -the standard output. -For instance if you want to redirect the output of a long running command -into a file and wish to have a record of any error diagnostic it produces -you can do -.DS -command >& file -.DE -The `>&' here tells the shell to route both the diagnostic output and the -standard output into `file'. -Similarly you can give the command -.DS -command |\|& lpr -.DE -to route both standard and diagnostic output through the pipe -to the line printer daemon -.I lpr.\(dd -.FS -\(dd A command of the form -.br -.ti +5 -command >&! file -.br -exists, and is used when -.I noclobber -is set and -.I file -already exists. -.FE -.PP -Finally, it is possible to use the form -.DS -command >> file -.DE -to place output at the end of an existing file.\(dg -.FS -\(dg If -.I noclobber -is set, then an error will result if -.I file -does not exist, otherwise the shell will create -.I file -if it doesn't exist. -A form -.br -.ti +5 -command >>! file -.br -makes it not be an error for file to not exist when -.I noclobber -is set. -.FE -.NH 2 -Jobs; Background, Foreground, or Suspended -.PP -When one or more commands -are typed together as a pipeline or as a sequence of commands separated by -semicolons, a single -.I job -is created by the shell consisting of these commands together as a unit. -Single commands without pipes or semicolons create the simplest jobs. -Usually, every line typed to the shell creates a job. -Some lines that create jobs (one per line) are -.DS -sort < data -ls \-s | sort \-n | head \-5 -mail harold -.DE -.PP -If the metacharacter `&' is typed -at the end of the commands, then the job is started as a -.I background -job. This means that the shell does not wait for it to complete but -immediately prompts and is ready for another command. The job runs -.I "in the background" -at the same time that normal jobs, called -.I foreground -jobs, continue to be read and executed by the shell one at a time. -Thus -.DS -du > usage & -.DE -would run the -.I du -program, which reports on the disk usage of your working directory (as well as -any directories below it), put the output into the file `usage' and return -immediately with a prompt for the next command without out waiting for -.I du -to finish. The -.I du -program would continue executing in the background -until it finished, even though you can type and execute more commands in the -mean time. -When a background -job terminates, a message is typed by the shell just before the next prompt -telling you that the job has completed. -In the following example the -.I du -job finishes sometime during the -execution of the -.I mail -command and its completion is reported just before -the prompt after the -.I mail -job is finished. -.DS -% du > usage & -[1] 503 -% mail bill -How do you know when a background job is finished? -EOT -.ta 1.75i -[1] \- Done du > usage -% -.so tabs -.DE -If the job did not terminate normally the `Done' message might say -something else like `Killed'. -If you want the -terminations of background jobs to be reported at the time they occur -(possibly interrupting the output of other foreground jobs), you can set -the -.I notify -variable. In the previous example this would mean that the -`Done' message might have come right in the middle of the message to -Bill. -Background jobs are unaffected by any signals from the keyboard like -the \s-2STOP\s0, \s-2INTERRUPT\s0, or \s-2QUIT\s0 signals mentioned earlier. -.PP -Jobs are recorded in a table inside the shell until they terminate. -In this table, the shell remembers the command names, arguments and the -.I "process numbers" -of all commands in the job as well as the working directory where the job was -started. -Each job in the table is either running -.I "in the foreground" -with the shell waiting for it to terminate, running -.I "in the background," -or -.I suspended. -Only one job can be running in the foreground at one time, but several -jobs can be suspended or running in the background at once. As each job -is started, it is assigned a small identifying -number called the -.I "job number" -which can be used later to refer to the job in the commands described below. -Job numbers remain -the same until the job terminates and then are re-used. -.PP -When a job is started in the background using `&', its number, as well -as the process numbers of all its (top level) commands, is typed by the shell -before prompting you for another command. -For example, -.DS -% ls \-s | sort \-n > usage & -[2] 2034 2035 -% -.DE -runs the `ls' program with the `\-s' options, pipes this output into -the `sort' program with the `\-n' option which puts its output into the -file `usage'. -Since the `&' was at the end of the line, these two programs were started -together as a background job. After starting the job, the shell prints -the job number in brackets (2 in this case) followed by the process number -of each program started in the job. Then the shell immediates prompts for -a new command, leaving the job running simultaneously. -.PP -As mentioned in section 1.8, foreground jobs become -.I suspended -by typing ^Z -which sends a \s-2STOP\s0 signal to the currently running -foreground job. A background job can become suspended by using the -.I stop -command described below. When jobs are suspended they merely stop -any further progress until started again, either in the foreground -or the background. The shell notices when a job becomes stopped and -reports this fact, much like it reports the termination of background jobs. -For foreground jobs this looks like -.DS -% du > usage -^Z -Stopped -% -.DE -`Stopped' message is typed by the shell when it notices that the -.I du -program stopped. -For background jobs, using the -.I stop -command, it is -.DS -% sort usage & -[1] 2345 -% stop %1 -.ta 1.75i -[1] + Stopped (signal) sort usage -% -.so tabs -.DE -Suspending foreground jobs can be very useful when you need to temporarily -change what you are doing (execute other commands) and then return to -the suspended job. Also, foreground jobs can be suspended and then -continued as background jobs using the -.I bg -command, allowing you to continue other work and -stop waiting for the foreground job to finish. Thus -.DS -% du > usage -^Z -Stopped -% bg -[1] du > usage & -% -.DE -starts `du' in the foreground, stops it before it finishes, then continues -it in the background allowing more foreground commands to be executed. -This is especially helpful -when a foreground job ends up taking longer than you expected and you -wish you had started it in the background in the beginning. -.PP -All -.I "job control" -commands can take an argument that identifies a particular -job. -All job name arguments begin with the character `%', since some of the -job control commands also accept process numbers (printed by the -.I ps -command.) -The default job (when no argument is given) is called the -.I current -job and is identified by a `+' in the output of the -.I jobs -command, which shows you which jobs you have. -When only one job is stopped or running in the background (the usual case) -it is always the current job thus no argument is needed. -If a job is stopped while running in the foreground it becomes the -.I current -job and the existing current job becomes the -.I previous -job \- identified by a `\-' in the output of -.I jobs. -When the current job terminates, the previous job becomes the current job. -When given, the argument is either `%\-' (indicating -the previous job); `%#', where # is the job number; -`%pref' where pref is some unique prefix of the command name -and arguments of one of the jobs; or `%?' followed by some string found -in only one of the jobs. -.PP -The -.I jobs -command types the table of jobs, giving the job number, -commands and status (`Stopped' or `Running') of each background or -suspended job. With the `\-l' option the process numbers are also -typed. -.DS -% du > usage & -[1] 3398 -% ls \-s | sort \-n > myfile & -[2] 3405 -% mail bill -^Z -Stopped -% jobs -.ta 1.75i -[1] \(mi Running du > usage -[2] Running ls \-s | sort \-n > myfile -[3] \(pl Stopped mail bill -% fg %ls -ls \-s | sort \-n > myfile -% more myfile -.so tabs -.DE -.PP -The -.I fg -command runs a suspended or background job in the foreground. It is -used to restart a previously suspended job or change a background job -to run in the foreground (allowing signals or input from the terminal). -In the above example we used -.I fg -to change the `ls' job from the -background to the foreground since we wanted to wait for it to -finish before looking at its output file. -The -.I bg -command runs a suspended job in the background. It is usually used -after stopping the currently running foreground job with the -\s-2STOP\s0 signal. The combination of the \s-2STOP\s0 signal and the -.I bg -command changes a foreground job into a background job. -The -.I stop -command suspends a background job. -.PP -The -.I kill -command terminates a background or suspended job immediately. -In addition to jobs, it may be given process numbers as arguments, -as printed by -.I ps. -Thus, in the example above, the running -.I du -command could have been terminated by the command -.DS -% kill %1 -.ta 1.75i -[1] Terminated du > usage -% -.so tabs -.DE -.PP -The -.I notify -command (not the variable mentioned earlier) indicates that the termination -of a specific job should be -reported at the time it finishes instead of waiting for the next prompt. -.PP -If a job running in the background tries to read input from the terminal -it is automatically stopped. When such a job is then run in the -foreground, input can be given to the job. If desired, the job can -be run in the background again until it requests input again. -This is illustrated in the following sequence where the `s' command in the -text editor might take a long time. -.ID -.nf -% ed bigfile -120000 -1,$s/thisword/thatword/ -^Z -Stopped -% bg -[1] ed bigfile & -% - . . . some foreground commands -.ta 1.75i -[1] Stopped (tty input) ed bigfile -% fg -ed bigfile -w -120000 -q -% -.so tabs -.DE -So after the `s' command was issued, the `ed' job was stopped with ^Z -and then put in the background using -.I bg. -Some time later when the `s' command was finished, -.I ed -tried to read another command and was stopped because jobs -in the background cannot read from the terminal. The -.I fg -command returned the `ed' job to the foreground where it could once again -accept commands from the terminal. -.PP -The command -.DS -stty tostop -.DE -causes all background jobs run on your terminal to stop -when they are about to -write output to the terminal. This prevents messages from background -jobs from interrupting foreground job output and allows you to run -a job in the background without losing terminal output. It also -can be used for interactive programs that sometimes have long -periods without interaction. Thus each time it outputs a prompt for more -input it will stop before the prompt. It can then be run in the -foreground using -.I fg, -more input can be given and, if necessary stopped and returned to -the background. This -.I stty -command might be a good thing to put in your -.I \&.login -file if you do not like output from background jobs interrupting -your work. It also can reduce the need for redirecting the output -of background jobs if the output is not very big: -.DS -% stty tostop -% wc hugefile & -[1] 10387 -% ed text -\&. . . some time later -q -.ta 1.75i -[1] Stopped (tty output) wc hugefile -% fg wc -wc hugefile - 13371 30123 302577 -% stty \-tostop -.so tabs -.DE -Thus after some time the `wc' command, which counts the lines, words -and characters in a file, had one line of output. When it tried to -write this to the terminal it stopped. By restarting it in the -foreground we allowed it to write on the terminal exactly when we were -ready to look at its output. -Programs which attempt to change the mode of the terminal will also -block, whether or not -.I tostop -is set, when they are not in the foreground, as -it would be very unpleasant to have a background job change the state -of the terminal. -.PP -Since the -.I jobs -command only prints jobs started in the currently executing shell, -it knows nothing about background jobs started in other login sessions -or within shell files. The -.I ps -can be used in this case to find out about background jobs not started -in the current shell. -.NH 2 -Working Directories -.PP -As mentioned in section 1.6, the shell is always in a particular -.I "working directory." -The `change directory' command -.I chdir -(its -short form -.I cd -may also be used) -changes the working directory of the shell, -that is, changes the directory you -are located in. -.PP -It is useful to make a directory for each project you wish to work on -and to place all files related to that project in that directory. -The `make directory' command, -.I mkdir, -creates a new directory. -The -.I pwd -(`print working directory') command -reports the absolute pathname of the working directory of the shell, -that is, the directory you are -located in. -Thus in the example below: -.DS -% pwd -/usr/bill -% mkdir newpaper -% chdir newpaper -% pwd -/usr/bill/newpaper -% -.DE -the user has created and moved to the -directory -.I newpaper. -where, for example, he might -place a group of related files. -.PP -No matter where you have moved to in a directory hierarchy, -you can return to your `home' login directory by doing just -.DS -cd -.DE -with no arguments. -The name `..' always means the directory above the current one in -the hierarchy, thus -.DS -cd .. -.DE -changes the shell's working directory to the one directly above the -current one. -The name `..' can be used in any -pathname, thus, -.DS -cd ../programs -.DE -means -change to the directory `programs' contained in the directory -above the current one. -If you have several directories for different -projects under, say, your home directory, -this shorthand notation -permits you to switch easily between them. -.PP -The shell always remembers the pathname of its current working directory in -the variable -.I cwd. -The shell can also be requested to remember the previous directory when -you change to a new working directory. If the `push directory' command -.I pushd -is used in place of the -.I cd -command, the shell saves the name of the current working directory -on a -.I "directory stack" -before changing to the new one. -You can see this list at any time by typing the `directories' -command -.I dirs. -.ID -.nf -% pushd newpaper/references -~/newpaper/references ~ -% pushd /usr/lib/tmac -/usr/lib/tmac ~/newpaper/references ~ -% dirs -/usr/lib/tmac ~/newpaper/references ~ -% popd -~/newpaper/references ~ -% popd -~ -% -.DE -The list is printed in a horizontal line, reading left to right, -with a tilde (~) as -shorthand for your home directory\(emin this case `/usr/bill'. -The directory stack is printed whenever there is more than one -entry on it and it changes. -It is also printed by a -.I dirs -command. -.I Dirs -is usually faster and more informative than -.I pwd -since it shows the current working directory as well as any -other directories remembered in the stack. -.PP -The -.I pushd -command with no argument -alternates the current directory with the first directory in the -list. -The `pop directory' -.I popd -command without an argument returns you to the directory you were in prior to -the current one, discarding the previous current directory from the -stack (forgetting it). -Typing -.I popd -several times in a series takes you backward through the directories -you had been in (changed to) by -.I pushd -command. -There are other options to -.I pushd -and -.I popd -to manipulate the contents of the directory stack and to change -to directories not at the top of the stack; see the -.I csh -manual page for details. -.PP -Since the shell remembers the working directory in which each job -was started, it warns you when you might be confused by restarting -a job in the foreground which has a different working directory than the -current working directory of the shell. Thus if you start a background -job, then change the shell's working directory and then cause the -background job to run in the foreground, the shell warns you that the -working directory of the currently running foreground job is different -from that of the shell. -.DS -% dirs \-l -/mnt/bill -% cd myproject -% dirs -~/myproject -% ed prog.c -1143 -^Z -Stopped -% cd .. -% ls -myproject -textfile -% fg -ed prog.c (wd: ~/myproject) -.DE -This way the shell warns you when there -is an implied change of working directory, even though no cd command was -issued. In the above example the `ed' job was still in `/mnt/bill/project' -even though the shell had changed to `/mnt/bill'. -A similar warning is given when such a foreground job -terminates or is suspended (using the \s-2STOP\s0 signal) since -the return to the shell again implies a change of working directory. -.DS -% fg -ed prog.c (wd: ~/myproject) - . . . after some editing -q -(wd now: ~) -% -.DE -These messages are sometimes confusing if you use programs that change -their own working directories, since the shell only remembers which -directory a job is started in, and assumes it stays there. -The `\-l' option of -.I jobs -will type the working directory -of suspended or background jobs when it is different -from the current working directory of the shell. -.NH 2 -Useful built-in commands -.PP -We now give a few of the useful built-in commands of the shell describing -how they are used. -.PP -The -.I alias -command described above is used to assign new aliases and to show the -existing aliases. -With no arguments it prints the current aliases. -It may also be given only one argument such as -.DS -alias ls -.DE -to show the current alias for, e.g., `ls'. -.PP -The -.I echo -command prints its arguments. -It is often used in -.I "shell scripts" -or as an interactive command -to see what filename expansions will produce. -.PP -The -.I history -command will show the contents of the history list. -The numbers given with the history events can be used to reference -previous events which are difficult to reference using the -contextual mechanisms introduced above. -There is also a shell variable called -.I prompt. -By placing a `!' character in its value the shell will there substitute -the number of the current command in the history list. -You can use this number to refer to this command in a history substitution. -Thus you could -.DS -set prompt=\'\e! % \' -.DE -Note that the `!' character had to be -.I escaped -here even within `\'' characters. -.PP -The -.I limit -command is used to restrict use of resources. -With no arguments it prints the current limitations: -.DS -.ta 1i -cputime unlimited -filesize unlimited -datasize 5616 kbytes -stacksize 512 kbytes -coredumpsize unlimited -.so tabs -.DE -Limits can be set, e.g.: -.DS -limit coredumpsize 128k -.DE -Most reasonable units abbreviations will work; see the -.I csh -manual page for more details. -.PP -The -.I logout -command can be used to terminate a login shell which has -.I ignoreeof -set. -.PP -The -.I rehash -command causes the shell to recompute a table of where commands are -located. This is necessary if you add a command to a directory -in the current shell's search path and wish the shell to find it, -since otherwise the hashing algorithm may tell the shell that the -command wasn't in that directory when the hash table was computed. -.PP -The -.I repeat -command can be used to repeat a command several times. -Thus to make 5 copies of the file -.I one -in the file -.I five -you could do -.DS -repeat 5 cat one >> five -.DE -.PP -The -.I setenv -command can be used -to set variables in the environment. -Thus -.DS -setenv TERM adm3a -.DE -will set the value of the environment variable \s-2TERM\s0 -to -`adm3a'. -A user program -.I printenv -exists which will print out the environment. -It might then show: -.DS -% printenv -HOME=/usr/bill -SHELL=/bin/csh -PATH=:/usr/ucb:/bin:/usr/bin:/usr/local -TERM=adm3a -USER=bill -% -.DE -.PP -The -.I source -command can be used to force the current shell to read commands from -a file. -Thus -.DS -source .cshrc -.DE -can be used after editing in a change to the -.I \&.cshrc -file which you wish to take effect right away. -.PP -The -.I time -command can be used to cause a command to be timed no matter how much -\s-2CPU\s0 time it takes. -Thus -.DS -% time cp /etc/rc /usr/bill/rc -0.0u 0.1s 0:01 8% 2+1k 3+2io 1pf+0w -% time wc /etc/rc /usr/bill/rc - 52 178 1347 /etc/rc - 52 178 1347 /usr/bill/rc - 104 356 2694 total -0.1u 0.1s 0:00 13% 3+3k 5+3io 7pf+0w -% -.DE -indicates that the -.I cp -command used a negligible amount of user time (u) -and about 1/10th of a system time (s); the elapsed time was 1 second (0:01), -there was an average memory usage of 2k bytes of program space and 1k -bytes of data space over the cpu time involved (2+1k); the program -did three disk reads and two disk writes (3+2io), and took one page fault -and was not swapped (1pf+0w). -The word count command -.I wc -on the other hand used 0.1 seconds of user time and 0.1 seconds of system -time in less than a second of elapsed time. -The percentage `13%' indicates that over the period when it was active -the command `wc' used an average of 13 percent of the available \s-2CPU\s0 -cycles of the machine. -.PP -The -.I unalias -and -.I unset -commands can be used -to remove aliases and variable definitions from the shell, and -.I unsetenv -removes variables from the environment. -.NH 2 -What else? -.PP -This concludes the basic discussion of the shell for terminal users. -There are more features of the shell to be discussed here, and all -features of the shell are discussed in its manual pages. -One useful feature which is discussed later is the -.I foreach -built-in command which can be used to run the same command -sequence with a number of different arguments. -.PP -If you intend to use \s-2UNIX\s0 a lot you should look through -the rest of this document and the csh manual pages (section1) to become familiar -with the other facilities which are available to you. -.bp diff --git a/bin/csh/USD.doc/csh.3 b/bin/csh/USD.doc/csh.3 deleted file mode 100644 index 76ee1eb..0000000 --- a/bin/csh/USD.doc/csh.3 +++ /dev/null @@ -1,649 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)csh.3 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.nr H1 2 -.NH -Shell control structures and command scripts -.NH 2 -Introduction -.PP -It is possible to place commands in files and to cause shells to be -invoked to read and execute commands from these files, -which are called -.I "shell scripts." -We here detail those features of the shell useful to the writers of such -scripts. -.NH 2 -Make -.PP -It is important to first note what shell scripts are -.I not -useful for. -There is a program called -.I make -which is very useful for maintaining a group of related files -or performing sets of operations on related files. -For instance a large program consisting of one or more files -can have its dependencies described in a -.I makefile -which contains definitions of the commands used to create these -different files when changes occur. -Definitions of the means for printing listings, cleaning up the directory -in which the files reside, and installing the resultant programs -are easily, and most appropriately placed in this -.I makefile. -This format is superior and preferable to maintaining a group of shell -procedures to maintain these files. -.PP -Similarly when working on a document a -.I makefile -may be created which defines how different versions of the document -are to be created and which options of -.I nroff -or -.I troff -are appropriate. -.NH 2 -Invocation and the argv variable -.PP -A -.I csh -command script may be interpreted by saying -.DS -% csh script ... -.DE -where -.I script -is the name of the file containing a group of -.I csh -commands and -`\&...' is replaced by a sequence of arguments. -The shell places these arguments in the variable -.I argv -and then begins to read commands from the script. -These parameters are then available through the same mechanisms -which are used to reference any other shell variables. -.PP -If you make the file -`script' -executable by doing -.DS -chmod 755 script -.DE -and place a shell comment at the beginning of the shell script -(i.e. begin the file with a `#' character) -then a `/bin/csh' will automatically be invoked to execute `script' when -you type -.DS -script -.DE -If the file does not begin with a `#' then the standard shell -`/bin/sh' will be used to execute it. -This allows you to convert your older shell scripts to use -.I csh -at your convenience. -.NH 2 -Variable substitution -.PP -After each input line is broken into words and history substitutions -are done on it, the input line is parsed into distinct commands. -Before each command is executed a mechanism know as -.I "variable substitution" -is done on these words. -Keyed by the character `$' this substitution replaces the names -of variables by their values. -Thus -.DS -echo $argv -.DE -when placed in a command script would cause the current value of the -variable -.I argv -to be echoed to the output of the shell script. -It is an error for -.I argv -to be unset at this point. -.PP -A number of notations are provided for accessing components and attributes -of variables. -The notation -.DS -$?name -.DE -expands to `1' if name is -.I set -or to `0' -if name is not -.I set. -It is the fundamental mechanism used for checking whether particular -variables have been assigned values. -All other forms of reference to undefined variables cause errors. -.PP -The notation -.DS -$#name -.DE -expands to the number of elements in the variable -.I name. -Thus -.DS -% set argv=(a b c) -% echo $?argv -1 -% echo $#argv -3 -% unset argv -% echo $?argv -0 -% echo $argv -Undefined variable: argv. -% -.DE -.PP -It is also possible to access the components of a variable -which has several values. -Thus -.DS -$argv[1] -.DE -gives the first component of -.I argv -or in the example above `a'. -Similarly -.DS -$argv[$#argv] -.DE -would give `c', -and -.DS -$argv[1\-2] -.DE -would give `a b'. Other notations useful in shell scripts are -.DS -$\fIn\fR -.DE -where -.I n -is an integer as a shorthand for -.DS -$argv[\fIn\fR\|] -.DE -the -.I n\|th -parameter and -.DS -$* -.DE -which is a shorthand for -.DS -$argv -.DE -The form -.DS -$$ -.DE -expands to the process number of the current shell. -Since this process number is unique in the system it can -be used in generation of unique temporary file names. -The form -.DS -$< -.DE -is quite special and is replaced by the next line of input read from -the shell's standard input (not the script it is reading). This is -useful for writing shell scripts that are interactive, reading -commands from the terminal, or even writing a shell script that -acts as a filter, reading lines from its input file. -Thus the sequence -.DS -echo 'yes or no?\ec' -set a=($<) -.DE -would write out the prompt `yes or no?' without a newline and then -read the answer into the variable `a'. In this case `$#a' would be -`0' if either a blank line or end-of-file (^D) was typed. -.PP -One minor difference between `$\fIn\fR\|' and `$argv[\fIn\fR\|]' -should be noted here. -The form -`$argv[\fIn\fR\|]' -will yield an error if -.I n -is not in the range -`1\-$#argv' -while `$n' -will never yield an out of range subscript error. -This is for compatibility with the way older shells handled parameters. -.PP -Another important point is that it is never an error to give a subrange -of the form `n\-'; if there are less than -.I n -components of the given variable then no words are substituted. -A range of the form `m\-n' likewise returns an empty vector without giving -an error when \fIm\fR exceeds the number of elements of the given variable, -provided the subscript \fIn\fR is in range. -.NH 2 -Expressions -.PP -In order for interesting shell scripts to be constructed it -must be possible to evaluate expressions in the shell based on the -values of variables. -In fact, all the arithmetic operations of the language C are available -in the shell -with the same precedence that they have in C. -In particular, the operations `==' and `!=' compare strings -and the operators `&&' and `|\|\||' implement the boolean and/or operations. -The special operators `=~' and `!~' are similar to `==' and `!=' except -that the string on the right side can have pattern matching characters -(like *, ? or []) and the test is whether the string on the left matches -the pattern on the right. -.PP -The shell also allows file enquiries of the form -.DS -\-? filename -.DE -where `?' is replace by a number of single characters. -For instance the expression primitive -.DS -\-e filename -.DE -tell whether the file -`filename' -exists. -Other primitives test for read, write and execute access to the file, -whether it is a directory, or has non-zero length. -.PP -It is possible to test whether a command terminates normally, -by a primitive of the -form `{ command }' which returns true, i.e. `1' if the command -succeeds exiting normally with exit status 0, or `0' if the command -terminates abnormally or with exit status non-zero. -If more detailed information about the execution status of a command -is required, it can be executed and the variable `$status' examined -in the next command. -Since `$status' is set by every command, it is very transient. -It can be saved if it is inconvenient to use it only in the single -immediately following command. -.PP -For a full list of expression components available see the manual -section for the shell. -.NH 2 -Sample shell script -.PP -A sample shell script which makes use of the expression mechanism -of the shell and some of its control structure follows: -.DS -% cat copyc -# -# Copyc copies those C programs in the specified list -# to the directory ~/backup if they differ from the files -# already in ~/backup -# -set noglob -foreach i ($argv) - - if ($i !~ *.c) continue # not a .c file so do nothing - - if (! \-r ~/backup/$i:t) then - echo $i:t not in backup... not cp\e\'ed - continue - endif - - cmp \-s $i ~/backup/$i:t # to set $status - - if ($status != 0) then - echo new backup of $i - cp $i ~/backup/$i:t - endif -end -.DE -.PP -This script makes use of the -.I foreach -command, which causes the shell to execute the commands between the -.I foreach -and the matching -.I end -for each of the values given between `(' and `)' with the named -variable, in this case `i' set to successive values in the list. -Within this loop we may use the command -.I break -to stop executing the loop -and -.I continue -to prematurely terminate one iteration -and begin the next. -After the -.I foreach -loop the iteration variable -(\fIi\fR in this case) -has the value at the last iteration. -.PP -We set the variable -.I noglob -here to prevent filename expansion of the members of -.I argv. -This is a good idea, in general, if the arguments to a shell script -are filenames which have already been expanded or if the arguments -may contain filename expansion metacharacters. -It is also possible to quote each use of a `$' variable expansion, -but this is harder and less reliable. -.PP -The other control construct used here is a statement of the form -.DS -\fBif\fR ( expression ) \fBthen\fR - command - ... -\fBendif\fR -.DE -The placement of the keywords here is -.B not -flexible due to the current implementation of the shell.\(dg -.FS -\(dgThe following two formats are not currently acceptable to the shell: -.sp -.in +5 -.nf -\fBif\fR ( expression ) # \fBWon't work!\fR -\fBthen\fR - command - ... -\fBendif\fR -.fi -.in -5 -.sp -and -.sp -.in +5 -.nf -\fBif\fR ( expression ) \fBthen\fR command \fBendif\fR # \fBWon't work\fR -.in -5 -.fi -.FE -.PP -The shell does have another form of the if statement of the form -.DS -\fBif\fR ( expression ) \fBcommand\fR -.DE -which can be written -.DS -\fBif\fR ( expression ) \e - command -.DE -Here we have escaped the newline for the sake of appearance. -The command must not involve `\||\|', `&' or `;' -and must not be another control command. -The second form requires the final `\e' to -.B immediately -precede the end-of-line. -.PP -The more general -.I if -statements above also admit a sequence of -.I else\-if -pairs followed by a single -.I else -and an -.I endif, -e.g.: -.DS -\fBif\fR ( expression ) \fBthen\fR - commands -\fBelse\fR \fBif\fR (expression ) \fBthen\fR - commands -\&... - -\fBelse\fR - commands -\fBendif\fR -.DE -.PP -Another important mechanism used in shell scripts is the `:' modifier. -We can use the modifier `:r' here to extract a root of a filename or -`:e' to extract the -.I extension. -Thus if the variable -.I i -has the value -`/mnt/foo.bar' -then -.sp -.in +5 -.nf -% echo $i $i:r $i:e -/mnt/foo.bar /mnt/foo bar -% -.sp -.in -5 -.fi -shows how the `:r' modifier strips off the trailing `.bar' and the -the `:e' modifier leaves only the `bar'. -Other modifiers will take off the last component of a pathname leaving -the head `:h' or all but the last component of a pathname leaving the -tail `:t'. -These modifiers are fully described in the -.I csh -manual pages in the User's Reference Manual. -It is also possible to use the -.I "command substitution" -mechanism described in the next major section to perform modifications -on strings to then reenter the shell's environment. -Since each usage of this mechanism involves the creation of a new process, -it is much more expensive to use than the `:' modification mechanism.\(dd -.FS -\(dd It is also important to note that -the current implementation of the shell limits the number of `:' modifiers -on a `$' substitution to 1. -Thus -.sp -.nf -.in +5 -% echo $i $i:h:t -/a/b/c /a/b:t -% -.in -5 -.fi -.sp -does not do what one would expect. -.FE -Finally, we note that the character `#' lexically introduces a shell -comment in shell scripts (but not from the terminal). -All subsequent characters on the input line after a `#' are discarded -by the shell. -This character can be quoted using `\'' or `\e' to place it in -an argument word. -.NH 2 -Other control structures -.PP -The shell also has control structures -.I while -and -.I switch -similar to those of C. -These take the forms -.DS -\fBwhile\fR ( expression ) - commands -\fBend\fR -.DE -and -.DS -\fBswitch\fR ( word ) - -\fBcase\fR str1: - commands - \fBbreaksw\fR - -\& ... - -\fBcase\fR strn: - commands - \fBbreaksw\fR - -\fBdefault:\fR - commands - \fBbreaksw\fR - -\fBendsw\fR -.DE -For details see the manual section for -.I csh. -C programmers should note that we use -.I breaksw -to exit from a -.I switch -while -.I break -exits a -.I while -or -.I foreach -loop. -A common mistake to make in -.I csh -scripts is to use -.I break -rather than -.I breaksw -in switches. -.PP -Finally, -.I csh -allows a -.I goto -statement, with labels looking like they do in C, i.e.: -.DS -loop: - commands - \fBgoto\fR loop -.DE -.NH 2 -Supplying input to commands -.PP -Commands run from shell scripts receive by default the standard -input of the shell which is running the script. -This is different from previous shells running -under \s-2UNIX\s0. It allows shell scripts to fully participate -in pipelines, but mandates extra notation for commands which are to take -inline data. -.PP -Thus we need a metanotation for supplying inline data to commands in -shell scripts. -As an example, consider this script which runs the editor to -delete leading blanks from the lines in each argument file: -.DS -% cat deblank -# deblank \-\- remove leading blanks -foreach i ($argv) -ed \- $i << \'EOF\' -1,$s/^[ ]*// -w -q -\&\'EOF\' -end -% -.DE -The notation `<< \'EOF\'' -means that the standard input for the -.I ed -command is to come from the text in the shell script file -up to the next line consisting of exactly `\'EOF\''. -The fact that the `EOF' is enclosed in `\'' characters, i.e. quoted, -causes the shell to not perform variable substitution on the -intervening lines. -In general, if any part of the word following the `<<' which the -shell uses to terminate the text to be given to the command is quoted -then these substitutions will not be performed. -In this case since we used the form `1,$' in our editor script -we needed to insure that this `$' was not variable substituted. -We could also have insured this by preceding the `$' here with a `\e', -i.e.: -.DS -1,\e$s/^[ ]*// -.DE -but quoting the `EOF' terminator is a more reliable way of achieving the -same thing. -.NH 2 -Catching interrupts -.PP -If our shell script creates temporary files, we may wish to catch -interruptions of the shell script so that we can clean up -these files. -We can then do -.DS -onintr label -.DE -where -.I label -is a label in our program. -If an interrupt is received the shell will do a -`goto label' -and we can remove the temporary files and then do an -.I exit -command (which is built in to the shell) -to exit from the shell script. -If we wish to exit with a non-zero status we can do -.DS -exit(1) -.DE -e.g. to exit with status `1'. -.NH 2 -What else? -.PP -There are other features of the shell useful to writers of shell -procedures. -The -.I verbose -and -.I echo -options and the related -.I \-v -and -.I \-x -command line options can be used to help trace the actions of the shell. -The -.I \-n -option causes the shell only to read commands and not to execute -them and may sometimes be of use. -.PP -One other thing to note is that -.I csh -will not execute shell scripts which do not begin with the -character `#', that is shell scripts that do not begin with a comment. -Similarly, the `/bin/sh' on your system may well defer to `csh' -to interpret shell scripts which begin with `#'. -This allows shell scripts for both shells to live in harmony. -.PP -There is also another quotation mechanism using `"' which allows -only some of the expansion mechanisms we have so far discussed to occur -on the quoted string and serves to make this string into a single word -as `\'' does. -.bp diff --git a/bin/csh/USD.doc/csh.4 b/bin/csh/USD.doc/csh.4 deleted file mode 100644 index 7ef24dc..0000000 --- a/bin/csh/USD.doc/csh.4 +++ /dev/null @@ -1,176 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)csh.4 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.nr H1 3 -.NH -Other, less commonly used, shell features -.NH 2 -Loops at the terminal; variables as vectors -.PP -It is occasionally useful to use the -.I foreach -control structure at the terminal to aid in performing a number -of similar commands. -For instance, there were at one point three shells in use on the Cory \s-2UNIX\s0 -system at Cory Hall, -`/bin/sh', -`/bin/nsh', -and -`/bin/csh'. -To count the number of persons using each shell one could have issued -the commands -.DS -% grep \-c csh$ /etc/passwd -27 -% grep \-c nsh$ /etc/passwd -128 -% grep \-c \-v sh$ /etc/passwd -430 -% -.DE -Since these commands are very similar we can use -.I foreach -to do this more easily. -.DS -% foreach i (\'sh$\' \'csh$\' \'\-v sh$\') -? grep \-c $i /etc/passwd -? end -27 -128 -430 -% -.DE -Note here that the shell prompts for -input with `? ' when reading the body of the loop. -.PP -Very useful with loops are variables which contain lists of filenames -or other words. -You can, for example, do -.DS -% set a=(\`ls\`) -% echo $a -csh.n csh.rm -% ls -csh.n -csh.rm -% echo $#a -2 -% -.DE -The -.I set -command here gave the variable -.I a -a list of all the filenames in the current directory as value. -We can then iterate over these names to perform any chosen function. -.PP -The output of a command within `\`' characters is converted by -the shell to a list of words. -You can also place the `\`' quoted string within `"' characters -to take each (non-empty) line as a component of the variable; -preventing the lines from being split into words at blanks and tabs. -A modifier `:x' exists which can be used later to expand each component -of the variable into another variable splitting it into separate words -at embedded blanks and tabs. -.NH 2 -Braces { ... } in argument expansion -.PP -Another form of filename expansion, alluded -to before involves the characters `{' and `}'. -These characters specify that the contained strings, separated by `,' -are to be consecutively substituted into the containing characters -and the results expanded left to right. -Thus -.DS -A{str1,str2,...strn}B -.DE -expands to -.DS -Astr1B Astr2B ... AstrnB -.DE -This expansion occurs before the other filename expansions, and may -be applied recursively (i.e. nested). -The results of each expanded string are sorted separately, left -to right order being preserved. -The resulting filenames are not required to exist if no other expansion -mechanisms are used. -This means that this mechanism can be used to generate arguments which are -not filenames, but which have common parts. -.PP -A typical use of this would be -.DS -mkdir ~/{hdrs,retrofit,csh} -.DE -to make subdirectories `hdrs', `retrofit' and `csh' -in your home directory. -This mechanism is most useful when the common prefix is longer -than in this example, i.e. -.DS -chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}} -.DE -.NH 2 -Command substitution -.PP -A command enclosed in `\`' characters is replaced, just before -filenames are expanded, by the output from that command. -Thus it is possible to do -.DS -set pwd=\`pwd\` -.DE -to save the current directory in the variable -.I pwd -or to do -.DS -ex \`grep \-l TRACE *.c\` -.DE -to run the editor -.I ex -supplying as arguments those files whose names end in `.c' -which have the string `TRACE' in them.* -.FS -*Command expansion also occurs in input redirected with `<<' -and within `"' quotations. -Refer to the shell manual section for full details. -.FE -.NH 2 -Other details not covered here -.PP -In particular circumstances it may be necessary to know the exact -nature and order of different substitutions performed by the shell. -The exact meaning of certain combinations of quotations is also -occasionally important. -These are detailed fully in its manual section. -.PP -The shell has a number of command line option flags mostly of use -in writing \s-2UNIX\s0 programs, -and debugging shell scripts. -See the csh(1) manual section for a list of these options. -.bp diff --git a/bin/csh/USD.doc/csh.a b/bin/csh/USD.doc/csh.a deleted file mode 100644 index 22c8f76..0000000 --- a/bin/csh/USD.doc/csh.a +++ /dev/null @@ -1,93 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)csh.a 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.SH -Appendix \- Special characters -.LP -The following table lists the special characters of -.I csh -and the \s-2UNIX\s0 system, giving for each the section(s) in which it -is discussed. -A number of these characters also have special meaning in expressions. -See the -.I csh -manual section -for a complete list. -.ta .75i 1.5i 2.25i -.LP -Syntactic metacharacters -.DS -; 2.4 separates commands to be executed sequentially -| 1.5 separates commands in a pipeline -( ) 2.2,3.6 brackets expressions and variable values -& 2.5 follows commands to be executed without waiting for completion -.DE -.LP -Filename metacharacters -.DS -/ 1.6 separates components of a file's pathname -\&. 1.6 separates root parts of a file name from extensions -? 1.6 expansion character matching any single character -* 1.6 expansion character matching any sequence of characters -[ ] 1.6 expansion sequence matching any single character from a set -~ 1.6 used at the beginning of a filename to indicate home directories -{ } 4.2 used to specify groups of arguments with common parts -.DE -.LP -Quotation metacharacters -.DS -\e 1.7 prevents meta-meaning of following single character -\' 1.7 prevents meta-meaning of a group of characters -" 4.3 like \', but allows variable and command expansion -.DE -.LP -Input/output metacharacters -.DS -< 1.5 indicates redirected input -> 1.3 indicates redirected output -.DE -.LP -Expansion/substitution metacharacters -.DS -$ 3.4 indicates variable substitution -! 2.3 indicates history substitution -: 3.6 precedes substitution modifiers -^ 2.3 used in special forms of history substitution -\` 4.3 indicates command substitution -.DE -.LP -Other metacharacters -.DS -# 1.3,3.6 begins scratch file names; indicates shell comments -\- 1.2 prefixes option (flag) arguments to commands -% 2.6 prefixes job name specifications -.DE -.bp diff --git a/bin/csh/USD.doc/csh.g b/bin/csh/USD.doc/csh.g deleted file mode 100644 index ba1b161..0000000 --- a/bin/csh/USD.doc/csh.g +++ /dev/null @@ -1,1719 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)csh.g 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.SH -Glossary -.PP -This glossary lists the most important terms introduced in the -introduction to the -shell and gives references to sections of the shell -document for further information about them. -References of the form -`pr (1)' -indicate that the command -.I pr -is in the \s-2UNIX\s0 User Reference manual in section 1. -You can look at an online copy of its manual page by doing -.DS -man 1 pr -.DE -References of the form (2.5) -indicate that more information can be found in section 2.5 of this -manual. -.IP \&\fB.\fR 15n -Your current directory has the name `.' as well as the name printed -by the command -.I pwd; -see also -.I dirs. -The current directory `.' is usually the first -.I component -of the search path contained in the variable -.I path , -thus commands which are in `.' are found first (2.2). -The character `.' is also used in separating -.I components -of filenames -(1.6). -The character `.' at the beginning of a -.I component -of a -.I pathname -is treated specially and not matched by the -.I "filename expansion" -metacharacters `?', `*', and `[' `]' pairs (1.6). -.IP \&\fB..\fR -Each directory has a file `..' in it which is a reference to its -parent directory. -After changing into the directory with -.I chdir , -i.e. -.DS -chdir paper -.DE -you can return to the parent directory by doing -.DS -chdir .. -.DE -The current directory is printed by -.I pwd -(2.7). -.IP a.out -Compilers which create executable images create them, by default, in the -file -.I a.out. -for historical reasons (2.3). -.IP "absolute pathname" -.br -A -.I pathname -which begins with a `/' is -.I absolute -since it specifies the -.I path -of directories from the beginning -of the entire directory system \- called the -.I root -directory. -.I Pathname s -which are not -.I absolute -are called -.I relative -(see definition of -.I "relative pathname" ) -(1.6). -.IP alias -An -.I alias -specifies a shorter or different name for a \s-2UNIX\s0 -command, or a transformation on a command to be performed in -the shell. -The shell has a command -.I alias -which establishes -.I aliases -and can print their current values. -The command -.I unalias -is used to remove -.I aliases -(2.4). -.IP argument -Commands in \s-2UNIX\s0 receive a list of -.I argument -words. -Thus the command -.DS -echo a b c -.DE -consists of the -.I "command name" -`echo' and three -.I argument -words `a', `b' and `c'. -The set of -.I arguments -after the -.I "command name" -is said to be the -.I "argument list" -of the command (1.1). -.IP argv -The list of arguments to a command written in the shell language -(a shell script or shell procedure) is stored in a variable called -.I argv -within the shell. -This name is taken from the conventional name in the -C programming language (3.4). -.IP background -Commands started without waiting for them to complete are called -.I background -commands (2.6). -.IP base -A filename is sometimes thought of as consisting of a -.I base -part, before any `.' character, and an -.I extension -\- the part after -the `.'. See -.I filename -and -.I extension -(1.6) and basename (1). -.IP bg -The -.I bg -command causes a -.I suspended -job to continue execution in the -.I background -(2.6). -.IP bin -A directory containing binaries of programs and shell scripts to be -executed is typically called a -.I bin -directory. -The standard system -.I bin -directories are `/bin' containing the most -heavily used commands and `/usr/bin' which contains most other user -programs. -Programs developed at UC Berkeley live in `/usr/ucb', while locally -written programs live in `/usr/local'. Games are kept in the directory -`/usr/games'. -You can place binaries in any directory. -If you wish to execute them often, the name of the directories -should be a -.I component -of the variable -.I path . -.IP break -.I Break -is a builtin command used to exit from loops within the control -structure of the shell (3.7). -.IP breaksw -The -.I breaksw -builtin command is used to exit from a -.I switch -control structure, like a -.I break -exits from loops (3.7). -.IP builtin -A command executed directly by the shell is called a -.I builtin -command. -Most commands in \s-2UNIX\s0 are not built into the shell, -but rather exist as files in -.I bin -directories. -These commands are accessible because the directories in which -they reside are named in the -.I path -variable. -.IP case -A -.I case -command is used as a label in a -.I switch -statement in the shell's control structure, similar to that of the -language C. -Details are given in the shell documentation `csh (1)' (3.7). -.IP cat -The -.I cat -program catenates a list of specified files on the -.I "standard output" . -It is usually used to look at the contents of a single file on the terminal, -to `cat a file' (1.8, 2.3). -.IP cd -The -.I cd -command is used to change the -.I "working directory" . -With no arguments, -.I cd -changes your -.I "working directory" -to be your -.I home -directory (2.4, 2.7). -.IP chdir -The -.I chdir -command is a synonym for -.I cd . -.I Cd -is usually used because it is easier to type. -.IP chsh -The -.I chsh -command is used to change the shell which you use on \s-2UNIX\s0. -By default, you use a different version of the shell -which resides in `/bin/sh'. -You can change your shell to `/bin/csh' by doing -.DS -chsh your-login-name /bin/csh -.DE -Thus I would do -.DS -chsh bill /bin/csh -.DE -It is only necessary to do this once. -The next time you log in to \s-2UNIX\s0 after doing this command, -you will be using -.I csh -rather than the shell in `/bin/sh' (1.9). -.IP cmp -.I Cmp -is a program which compares files. -It is usually used on binary files, or to see if two files are identical (3.6). -For comparing text files the program -.I diff , -described in `diff (1)' is used. -.IP command -A function performed by the system, either by the shell -(a builtin -.I command ) -or by a program residing in a file in -a directory within the \s-2UNIX\s0 system, is called a -.I command -(1.1). -.IP "command name" -.br -When a command is issued, it consists of a -.I "command name" , -which is the first word of the command, -followed by arguments. -The convention on \s-2UNIX\s0 is that the first word of a -command names the function to be performed (1.1). -.IP "command substitution" -.br -The replacement of a command enclosed in `\`' characters -by the text output by that command -is called -.I "command substitution" -(4.3). -.IP component -A part of a -.I pathname -between `/' characters is called a -.I component -of that -.I pathname . -A variable -which has multiple strings as value is said to have -several -.I component s; -each string is a -.I component -of the variable. -.IP continue -A builtin command which causes execution of the enclosing -.I foreach -or -.I while -loop to cycle prematurely. -Similar to the -.I continue -command in the programming language C (3.6). -.IP control- -Certain special characters, called -.I control -characters, are produced by holding down the \s-2CONTROL\s0 key -on your terminal and simultaneously pressing another character, much like -the \s-2SHIFT\s0 key is used to produce upper case characters. Thus -.I control- c -is produced by holding down the \s-2CONTROL\s0 key while pressing the -`c' key. Usually \s-2UNIX\s0 prints a caret (^) followed by the -corresponding letter when you type a -.I control -character (e.g. `^C' for -.I control- c -(1.8). -.IP "core\ dump" -When a program terminates abnormally, the system places an image -of its current state in a file named `core'. -This -.I "core dump" -can be examined with the system debugger `adb (1)' -or `sdb (1)' in order to determine what went wrong with the program (1.8). -If the shell produces a message of the form -.DS -Illegal instruction (core dumped) -.DE -(where `Illegal instruction' is only one of several possible -messages), you should report this to the author of the program -or a system administrator, -saving the `core' file. -.IP cp -The -.I cp -(copy) program is used to copy the contents of one file into another -file. -It is one of the most commonly used \s-2UNIX\s0 commands (1.6). -.IP csh -The name of the shell -program that this document describes. -.IP \&.cshrc -The file -.I \&.cshrc -in your -.I home -directory is read by each shell as it begins execution. -It is usually used to change the setting of the variable -.I path -and to set -.I alias -parameters which are to take effect globally (2.1). -.IP cwd -The -.I cwd -variable in the shell holds the -.I "absolute pathname" -of the current -.I "working directory" \&. -It is changed by the shell whenever your current -.I "working directory" -changes and should not be changed otherwise (2.2). -.IP date -The -.I date -command prints the current date and time (1.3). -.IP debugging -.I Debugging -is the process of correcting mistakes in programs and shell scripts. -The shell has several options and variables which may be used -to aid in shell -.I debugging -(4.4). -.IP default: -The label -.I default: -is used within shell -.I switch -statements, as it is in the C language -to label the code to be executed if none of the -.I case -labels matches the value switched on (3.7). -.IP \s-2DELETE\s0 -The -\s-2DELETE\s0 -or -\s-2RUBOUT\s0 -key on the terminal normally causes an interrupt to be sent to the current job. -Many users change the interrupt character to be ^C. -.IP detached -A command that continues running in the -.I background -after you logout is said to be -.I detached . -.IP diagnostic -An error message produced by a program is often referred to as a -.I diagnostic . -Most error messages are not written to the -.I "standard output" , -since that is often directed away from the terminal (1.3, 1.5). -Error messsages are instead written to the -.I "diagnostic output" -which may be directed away from the terminal, but usually is not. -Thus -.I diagnostics -will usually appear on the terminal (2.5). -.IP directory -A structure which contains files. -At any time you are in one particular -.I directory -whose names can be printed by the command -.I pwd . -The -.I chdir -command will change you to another -.I directory , -and make the files -in that -.I directory -visible. The -.I directory -in which you are when you first login is your -.I home -directory (1.1, 2.7). -.IP "directory\ stack" -The shell saves the names of previous -.I "working directories" -in the -.I "directory stack" -when you change your current -.I "working directory" -via the -.I pushd -command. The -.I "directory stack" -can be printed by using the -.I dirs -command, which includes your current -.I "working directory" -as the first directory name on the left (2.7). -.IP dirs -The -.I dirs -command prints the shell's -.I "directory stack" -(2.7). -.IP du -The -.I du -command is a program (described in `du (1)') which -prints the number of disk blocks is all directories below -and including your current -.I "working directory" -(2.6). -.IP echo -The -.I echo -command prints its arguments (1.6, 3.6). -.IP else -The -.I else -command is part of the `if-then-else-endif' control -command construct (3.6). -.IP endif -If an -.I if -statement is ended with the word -.I then , -all lines following the -.I if -up to a line starting with the word -.I endif -or -.I else -are executed if the condition between parentheses after the -.I if -is true (3.6). -.IP \s-2EOF\s0 -An -.I "end\f1-\fPof\f1-\fPfile" -is generated by the terminal by a control-d, -and whenever a command reads to the end of a file which -it has been given as input. -Commands receiving input from a -.I pipe -receive an -.I "end\f1-\fPof\f1-\fPfile" -when the command sending them input completes. -Most commands terminate when they receive an -.I "end\f1-\fPof\f1-\fPfile" . -The shell has an option to ignore -.I "end\f1-\fPof\f1-\fPfile" -from a terminal -input which may help you keep from logging out accidentally -by typing too many control-d's (1.1, 1.8, 3.8). -.IP escape -A character `\e' used to prevent the special meaning of a metacharacter -is said to -.I escape -the character from its special meaning. -Thus -.DS -echo \e* -.DE -will echo the character `*' while just -.DS -echo * -.DE -will echo the names of the file in the current directory. -In this example, \e -.I escape s -`*' (1.7). -There is also a non-printing character called -.I escape , -usually labelled -\s-2ESC\s0 -or -\s-2ALTMODE\s0 -on terminal keyboards. -Some older \s-2UNIX\s0 systems use this character to indicate that -output is to be -.I suspended . -Most systems use control-s to stop the output and control-q to start it. -.IP /etc/passwd -This file contains information about the accounts currently on the -system. -It consists of a line for each account with fields separated by -`:' characters (1.8). -You can look at this file by saying -.DS -cat /etc/passwd -.DE -The commands -.I finger -and -.I grep -are often used to search for information in this file. -See `finger (1)', `passwd(5)', and `grep (1)' for more details. -.IP exit -The -.I exit -command is used to force termination of a shell script, -and is built into the shell (3.9). -.IP "exit\ status" -A command which discovers a problem may reflect this back to the command -(such as a shell) which invoked (executed) it. -It does this by returning a non-zero number as its -.I "exit status" , -a status of zero being considered -`normal termination'. -The -.I exit -command can be used to force a shell command script to give a non-zero -.I "exit status" -(3.6). -.IP expansion -The replacement of strings in the shell input which contain metacharacters -by other strings is referred to as the process of -.I expansion . -Thus the replacement of the word `*' by a sorted list of files -in the current directory is a `filename expansion'. -Similarly the replacement of the characters `!!' by the text of -the last command is a `history expansion'. -.I Expansions -are also referred to as -.I substitutions -(1.6, 3.4, 4.2). -.IP expressions -.I Expressions -are used in the shell -to control the conditional structures used in the writing of shell -scripts and in calculating values for these scripts. -The operators available in shell -.I expressions -are those of the language -C (3.5). -.IP extension -Filenames often consist of a -.I base -name and an -.I extension -separated by the character `.'. -By convention, groups of related files often share the same -.I root -name. -Thus if `prog.c' were a C program, then the object file for this -program would be stored in `prog.o'. -Similarly a paper written with the -`\-me' -nroff macro package might be stored in -`paper.me' -while a formatted version of this paper might be kept in -`paper.out' and a list of spelling errors in -`paper.errs' (1.6). -.IP fg -The -.I "job control" -command -.I fg -is used to run a -.I background -or -.I suspended -job in the -.I foreground -(1.8, 2.6). -.IP filename -Each file in \s-2UNIX\s0 has a name consisting of up to 14 characters -and not including the character `/' which is used in -.I pathname -building. Most -.I filenames -do not begin with the character `.', and contain -only letters and digits with perhaps a `.' separating the -.I base -portion of the -.I filename -from an -.I extension -(1.6). -.IP "filename expansion" -.br -.I "Filename expansion" -uses the metacharacters `*', `?' and `[' and `]' -to provide a convenient mechanism for naming files. -Using -.I "filename expansion" -it is easy to name all the files in -the current directory, or all files which have a common -.I root -name. Other -.I "filename expansion" -mechanisms use the metacharacter `~' and allow -files in other users' directories to be named easily (1.6, 4.2). -.IP flag -Many \s-2UNIX\s0 commands accept arguments which are not the names -of files or other users but are used to modify the action of the commands. -These are referred to as -.I flag -options, and by convention consist of one or more letters preceded by -the character `\-' (1.2). -Thus the -.I ls -(list files) command has an option -`\-s' to list the sizes of files. -This is specified -.DS -ls \-s -.DE -.IP foreach -The -.I foreach -command is used in shell scripts and at the terminal to specify -repetition of a sequence of commands while the value of a certain -shell variable ranges through a specified list (3.6, 4.1). -.IP foreground -When commands are executing in the normal way such that the -shell is waiting for them to finish before prompting for another -command they are said to be -.I "foreground jobs" -or -.I "running in the foreground" \&. -This is as opposed to -.I background . -.I Foreground -jobs can be stopped by signals -from the terminal caused by typing different -control characters at the keyboard (1.8, 2.6). -.IP goto -The shell has a command -.I goto -used in shell scripts to transfer control to a given label (3.7). -.IP grep -The -.I grep -command searches through a list of argument files for a specified string. -Thus -.DS -grep bill /etc/passwd -.DE -will print each line in the file -.I "/etc/passwd" -which contains the string `bill'. -Actually, -.I grep -scans for -.I "regular expressions" -in the sense of the editors -`ed (1)' and `ex (1)'. -.I Grep -stands for -`globally find -.I "regular expression" -and print' (2.4). -.IP head -The -.I head -command prints the first few lines of one or more files. -If you have a bunch of files containing text which you are wondering -about it is sometimes useful to run -.I head -with these files as arguments. -This will usually show enough of what is in these files to let you decide -which you are interested in (1.5). -.br -.I Head -is also used to describe the part of a -.I pathname -before and including the last `/' character. The -.I tail -of a -.I pathname -is the part after the last `/'. The `:h' and `:t' modifiers allow the -.I head -or -.I tail -of a -.I pathname -stored in a shell variable to be used (3.6). -.IP history -The -.I history -mechanism of the shell allows previous commands to be repeated, -possibly after modification to correct typing mistakes or to change -the meaning of the command. -The shell has a -.I "history list" -where these commands are kept, and a -.I history -variable which controls how large this list is (2.3). -.IP "home\ directory" -.br -Each user has a -.I "home directory" , -which is given in your entry -in the password file, -.I /etc/passwd . -This is the directory which you are placed in when you first login. -The -.I cd -or -.I chdir -command with no arguments takes you back to this directory, whose -name is recorded in the shell variable -.I home . -You can also access the -.I "home directories" -of other users in forming -filenames using a -.I "filename expansion" -notation and the character `~' (1.6). -.IP if -A conditional command within the shell, the -.I if -command is used in shell command scripts to make decisions -about what course of action to take next (3.6). -.IP ignoreeof -Normally, your shell will exit, printing -`logout' -if you type a control-d at a prompt of `% '. -This is the way you usually log off the system. -You can -.I set -the -.I ignoreeof -variable if you wish in your -.I \&.login -file and then use the command -.I logout -to logout. -This is useful if you sometimes accidentally type too many control-d -characters, logging yourself off -(2.2). -.IP input -Many commands on \s-2UNIX\s0 take information from the terminal or from -files which they then act on. -This information is called -.I input . -Commands normally read for -.I input -from their -.I "standard input" -which is, by default, the terminal. -This -.I "standard input" -can be redirected from a file using a shell metanotation -with the character `<'. -Many commands will also read from a file specified as argument. -Commands placed in -.I pipelines -will read from the output of the previous -command in the -.I pipeline . -The leftmost command in a -.I pipeline -reads from the terminal if -you neither redirect its -.I input -nor give it a filename to use as -.I "standard input" . -Special mechanisms exist for supplying input to commands in shell -scripts (1.5, 3.8). -.IP interrupt -An -.I interrupt -is a signal to a program that is generated by typing ^C. (On older versions -of UNIX the \s-2RUBOUT\s0 or \s-2DELETE\s0 key were used for this purpose.) -It causes most programs to stop execution. -Certain programs, such as the shell and the editors, -handle an -.I interrupt -in special ways, usually by stopping what they -are doing and prompting for another command. -While the shell is executing another command and waiting for it -to finish, the shell does not listen to -.I interrupts. -The shell often wakes up when you hit -.I interrupt -because many commands -die when they receive an -.I interrupt -(1.8, 3.9). -.IP job -One or more commands -typed on the same input line separated by `|' or `;' characters -are run together and are called a -.I job \&. -Simple commands run by themselves without any `|' or `;' characters -are the simplest -.I jobs. -.I Jobs -are classified as -.I foreground , -.I background , -or -.I suspended -(2.6). -.IP "job\ control" -The builtin functions that control the execution of -jobs are called -.I "job control" -commands. These are -.I "bg, fg, stop, kill" -(2.6). -.IP "job\ number" -When each job -is started it is assigned a small number called a -.I "job number" -which is printed next to the job in the output of the -.I jobs -command. This number, preceded by a `%' character, can be used as an argument -to -.I "job control" -commands to indicate -a specific job (2.6). -.IP jobs -The -.I jobs -command prints a table showing -jobs that are either running in the -.I background -or are -.I suspended -(2.6). -.IP kill -A command which sends a -signal -to a job causing it to terminate (2.6). -.IP \&.login -The file -.I \&.login -in your -.I home -directory is read by the shell each time you login to \s-2UNIX\s0 -and the commands there are executed. -There are a number of commands which are usefully placed here, -especially -.I set -commands to the shell itself (2.1). -.IP "login\ shell" -The shell that is started on your terminal when you login is called -your -.I "login shell" . -It is different from other shells which you may run (e.g. on -shell scripts) -in that it reads the -.I \&.login -file before reading commands from the terminal and it reads the -.I \&.logout -file after you logout -(2.1). -.IP logout -The -.I logout -command causes a login shell to exit. -Normally, a login shell will exit when you hit control-d -generating an -.I end\f1-\fPof\f1-\fPfile, -but if you have set -.I ignoreeof -in you -.I \&.login -file then this will not work and you must use -.I logout -to log off the \s-2UNIX\s0 system (2.8). -.IP \&.logout -When you log off of \s-2UNIX\s0 the shell will execute commands from -the file -.I \&.logout -in your -.I home -directory after it prints `logout'. -.IP lpr -The command -.I lpr -is the line printer daemon. -The standard input of -.I lpr -spooled and printed on the \s-2UNIX\s0 line printer. -You can also give -.I lpr -a list of filenames as arguments to be printed. -It is most common to use -.I lpr -as the last component of a -.I pipeline -(2.3). -.IP ls -The -.I ls -(list files) command is one of the most commonly used \s-2UNIX\s0 -commands. -With no argument filenames it prints the names of the files in the -current directory. -It has a number of useful -.I flag -arguments, and can also be given the names of directories -as arguments, in which case it lists the names of the files in these -directories (1.2). -.IP mail -The -.I mail -program is used to send and receive messages from other \s-2UNIX\s0 -users (1.1, 2.1), whether they are logged on or not. -.IP make -The -.I make -command is used to maintain one or more related files and to -organize functions to be performed on these files. -In many ways -.I make -is easier to use, and more helpful than -shell command scripts (3.2). -.IP makefile -The file containing commands for -.I make -is called -.I makefile -or -.I Makefile -(3.2). -.IP manual -The -.I manual -often referred to is the -`\s-2UNIX\s0 manual'. -It contains 8 numbered sections with a description of each \s-2UNIX\s0 -program (section 1), system call (section 2), subroutine (section 3), -device (section 4), special data structure (section 5), game (section 6), -miscellaneous item (section 7) and system administration program (section 8). -There are also supplementary documents (tutorials and reference guides) -for individual programs which require explanation in more detail. -An online version of the -.I manual -is accessible through the -.I man -command. -Its documentation can be obtained online via -.DS -man man -.DE -If you can't decide what manual page to look in, try the -.I apropos (1) -command. -The supplementary documents are in subdirectories of /usr/doc. -.IP metacharacter -.br -Many characters which are neither letters nor digits have special meaning -either to the shell or to \s-2UNIX\s0. -These characters are called -.I metacharacters . -If it is necessary to place these characters in arguments to commands -without them having their special meaning then they must be -.I quoted . -An example of a -.I metacharacter -is the character `>' which is used -to indicate placement of output into a file. -For the purposes of the -.I history -mechanism, -most unquoted -.I metacharacters -form separate words (1.4). -The appendix to this user's manual lists the -.I metacharacters -in groups by their function. -.IP mkdir -The -.I mkdir -command is used to create a new directory. -.IP modifier -Substitutions with the -.I history -mechanism, keyed by the character `!' -or of variables using the metacharacter `$', are often subjected -to modifications, indicated by placing the character `:' after the -substitution and following this with the -.I modifier -itself. -The -.I "command substitution" -mechanism can also be used to perform modification in a similar way, -but this notation is less clear (3.6). -.IP more -The program -.I more -writes a file on your terminal allowing you to control how much text -is displayed at a time. -.I More -can move through the file screenful by screenful, line by line, -search forward for a string, or start again at the beginning of the file. -It is generally the easiest way of viewing a file (1.8). -.IP noclobber -The shell has a variable -.I noclobber -which may be set in the file -.I \&.login -to prevent accidental destruction of files by the `>' output redirection -metasyntax of the shell (2.2, 2.5). -.IP noglob -The shell variable -.I noglob -is set to suppress the -.I "filename expansion" -of arguments containing the metacharacters `~', `*', `?', `[' and `]' (3.6). -.IP notify -The -.I notify -command tells the shell to report on the termination of a specific -.I "background job" -at the exact time it occurs as opposed to waiting -until just before the next prompt to report the termination. -The -.I notify -variable, if set, causes the shell to always report the termination -of -.I background -jobs exactly when they occur (2.6). -.IP onintr -The -.I onintr -command is built into the shell and is used to control the action -of a shell command script when an -.I interrupt -signal is received (3.9). -.IP output -Many commands in \s-2UNIX\s0 result in some lines of text which are -called their -.I output. -This -.I output -is usually placed on what is known as the -.I "standard output" -which is normally connected to the user's terminal. -The shell has a syntax using the metacharacter `>' for redirecting -the -.I "standard output" -of a command to a file (1.3). -Using the -.I pipe -mechanism and the metacharacter `|' it is also possible for -the -.I "standard output" -of one command to become the -.I "standard input" -of another command (1.5). -Certain commands such as the line printer daemon -.I p -do not place their results on the -.I "standard output" -but rather in more -useful places such as on the line printer (2.3). -Similarly the -.I write -command places its output on another user's terminal rather than its -.I "standard output" -(2.3). -Commands also have a -.I "diagnostic output" -where they write their error messages. -Normally these go to the terminal even if the -.I "standard output" -has been sent to a file or another command, but it is possible -to direct error diagnostics along with -.I "standard output" -using a special metanotation (2.5). -.IP path -The shell has a variable -.I path -which gives the names of the directories in which it searches for -the commands which it is given. -It always checks first to see if the command it is given is -built into the shell. -If it is, then it need not search for the command as it can do it internally. -If the command is not builtin, then the shell searches for a file -with the name given in each of the directories in the -.I path -variable, left to right. -Since the normal definition of the -.I path -variable is -.DS -path (. /usr/ucb /bin /usr/bin) -.DE -the shell normally looks in the current directory, and then in -the standard system directories `/usr/ucb', `/bin' and `/usr/bin' for the named -command (2.2). -If the command cannot be found the shell will print an error diagnostic. -Scripts of shell commands will be executed using another shell to interpret -them if they have `execute' permission set. -This is normally true because a command of the form -.DS -chmod 755 script -.DE -was executed to turn this execute permission on (3.3). -If you add new commands to a directory in the -.I path , -you should issue -the command -.I rehash -(2.2). -.IP pathname -A list of names, separated by `/' characters, forms a -.I pathname. -Each -.I component, -between successive `/' characters, names a directory -in which the next -.I component -file resides. -.I Pathnames -which begin with the character `/' are interpreted relative -to the -.I root -directory in the file system. -Other -.I pathnames -are interpreted relative to the current directory -as reported by -.I pwd. -The last component of a -.I pathname -may name a directory, but -usually names a file. -.IP pipeline -A group of commands which are connected together, the -.I "standard output" -of each connected to the -.I "standard input" -of the next, -is called a -.I pipeline. -The -.I pipe -mechanism used to connect these commands is indicated by -the shell metacharacter `|' (1.5, 2.3). -.IP popd -The -.I popd -command changes the shell's -.I "working directory" -to the directory you most recently left using the -.I pushd -command. It returns to the directory without having to type its name, -forgetting the name of the current -.I "working directory" -before doing so (2.7). -.IP port -The part of a computer system to which each terminal is -connected is called a -.I port . -Usually the system has a fixed number of -.I ports , -some of which are connected to telephone lines -for dial-up access, and some of which are permanently -wired directly to specific terminals. -.IP pr -The -.I pr -command is used to prepare listings of the contents of files -with headers giving the name of the file and the date and -time at which the file was last modified (2.3). -.IP printenv -The -.I printenv -command is used -to print the current setting of variables in the environment -(2.8). -.IP process -An instance of a running program is called a -.I process -(2.6). -\s-2UNIX\s0 assigns each -.I process -a unique number when it is -started \- called the -.I "process number" . -.I "Process numbers" -can be used to stop individual -.I processes -using the -.I kill -or -.I stop -commands when the -.I processes -are part of a detached -.I background -job. -.IP program -Usually synonymous with -.I command ; -a binary file or shell command script -which performs a useful function is often -called a -.I program . -.IP prompt -Many programs will print a -.I prompt -on the terminal when they expect input. -Thus the editor -`ex (1)' will print a `:' when it expects input. -The shell -.I prompts -for input with `% ' and occasionally with `? ' when -reading commands from the terminal (1.1). -The shell has a variable -.I prompt -which may be set to a different value to change the shell's main -.I prompt . -This is mostly used when debugging the shell (2.8). -.IP pushd -The -.I pushd -command, which means `push directory', changes the shell's -.I "working directory" -and also remembers the current -.I "working directory" -before the change is made, allowing you to return to the same -directory via the -.I popd -command later without retyping its name (2.7). -.IP ps -The -.I ps -command is used to show the processes you are currently running. -Each process is shown with its unique process number, -an indication of the terminal name it is attached to, -an indication of the state of the process (whether it is running, -stopped, awaiting some event (sleeping), and whether it is swapped out), -and the amount of \s-2CPU\s0 time it has used so far. -The command is identified by printing some of the words used -when it was invoked (2.6). -Shells, such as the -.I csh -you use to run the -.I ps -command, are not normally shown in the output. -.IP pwd -The -.I pwd -command prints the full -.I pathname -of the current -.I "working directory" \&. -The -.I dirs -builtin command is usually a better and faster choice. -.IP quit -The -.I quit -signal, generated by a control-\e, -is used to terminate programs which are behaving unreasonably. -It normally produces a core image file (1.8). -.IP quotation -The process by which metacharacters are prevented their special -meaning, usually by using the character `\' in pairs, or by -using the character `\e', is referred to as -.I quotation -(1.7). -.IP redirection -The routing of input or output from or to a file is known -as -.I redirection -of input or output (1.3). -.IP rehash -The -.I rehash -command tells the shell to rebuild its internal table of which commands -are found in which directories in your -.I path . -This is necessary when a new program is installed in one of these -directories (2.8). -.IP "relative pathname" -.br -A -.I pathname -which does not begin with a `/' is called a -.I "relative pathname" -since it is interpreted -.I relative -to the current -.I "working directory" . -The first -.I component -of such a -.I pathname -refers to some file or directory in the -.I "working directory" , -and subsequent -.I components -between `/' characters refer to directories below the -.I "working directory" . -.I Pathnames -that are not -.I relative -are called -.I "absolute pathnames" -(1.6). -.IP repeat -The -.I repeat -command iterates another command a specified number of times. -.IP root -The directory -that is at the top of the entire directory structure is called the -.I root -directory since it is the `root' of the entire tree structure of -directories. The name used in -.I pathnames -to indicate the -.I root -is `/'. -.I Pathnames -starting with `/' are said to be -.I absolute -since they start at the -.I root -directory. -.I Root -is also used as the part of a -.I pathname -that is left after removing -the -.I extension . -See -.I filename -for a further explanation (1.6). -.IP \s-2RUBOUT\s0 -The \s-2RUBOUT\s0 or \s-2DELETE\s0 -key is often used to erase the previously typed character; some users -prefer the \s-2BACKSPACE\s0 for this purpose. On older versions of \s-2UNIX\s0 -this key served as the \s-2INTR\s0 character. -.IP "scratch file" -Files whose names begin with a `#' are referred to as -.I "scratch files" , -since they are automatically removed by the system after a couple of -days of non-use, or more frequently if disk space becomes tight (1.3). -.IP script -Sequences of shell commands placed in a file are called shell command -.I scripts . -It is often possible to perform simple tasks using these -.I scripts -without writing a program in a language such as C, by -using the shell to selectively run other programs (3.3, 3.10). -.IP set -The builtin -.I set -command is used to assign new values to shell variables -and to show the values of the current variables. -Many shell variables have special meaning to the shell itself. -Thus by using the -.I set -command the behavior of the shell can be affected (2.1). -.IP setenv -Variables in the environment `environ (5)' -can be changed by using the -.I setenv -builtin command (2.8). -The -.I printenv -command can be used to print the value of the variables in the environment. -.IP shell -A -.I shell -is a command language interpreter. -It is possible to write and run your own -.I shell , -as -.I shells -are no different than any other programs as far as the -system is concerned. -This manual deals with the details of one particular -.I shell , -called -.I csh. -.IP "shell script" -See -.I script -(3.3, 3.10). -.IP signal -A -.I signal -in \s-2UNIX\s0 is a short message that is sent to a running program -which causes something to happen to that process. -.I Signals -are sent either by typing special -.I control -characters on the keyboard or by using the -.I kill -or -.I stop -commands (1.8, 2.6). -.IP sort -The -.I sort -program sorts a sequence of lines in ways that can be controlled -by argument -.I flags -(1.5). -.IP source -The -.I source -command causes the shell to read commands from a specified file. -It is most useful for reading files such as -.I \&.cshrc -after changing them (2.8). -.IP "special character" -.br -See -.I metacharacters -and the -appendix to this manual. -.IP standard -We refer often to the -.I "standard input" -and -.I "standard output" -of commands. -See -.I input -and -.I output -(1.3, 3.8). -.IP status -A command normally returns a -.I status -when it finishes. -By convention a -.I status -of zero indicates that the command succeeded. -Commands may return non-zero -.I status -to indicate that some abnormal event has occurred. -The shell variable -.I status -is set to the -.I status -returned by the last command. -It is most useful in shell commmand scripts (3.6). -.IP stop -The -.I stop -command causes a -.I background -job to become -.I suspended -(2.6). -.IP string -A sequential group of characters taken together is called a -.I string \&. -.I Strings -can contain any printable characters (2.2). -.IP stty -The -.I stty -program changes certain parameters inside \s-2UNIX\s0 which determine -how your terminal is handled. See `stty (1)' for a complete description (2.6). -.IP substitution -The shell implements a number of -.I substitutions -where sequences indicated by metacharacters are replaced by other sequences. -Notable examples of this are history -.I substitution -keyed by the -metacharacter `!' and variable -.I substitution -indicated by `$'. -We also refer to -.I substitutions -as -.I expansions -(3.4). -.IP suspended -A job becomes -.I suspended -after a \s-2STOP\s0 signal is sent to it, either by typing a -.I control -z -at the terminal (for -.I foreground -jobs) or by using the -.I stop -command (for -.I background -jobs). When -.I suspended , -a job temporarily stops running until it is restarted by either the -.I fg -or -.I bg -command (2.6). -.IP switch -The -.I switch -command of the shell allows the shell -to select one of a number of sequences of commands based on an -argument string. -It is similar to the -.I switch -statement in the language C (3.7). -.IP termination -When a command which is being executed finishes we say it undergoes -.I termination -or -.I terminates. -Commands normally terminate when they read an -.I end\f1-\fPof\f1-\fPfile -from their -.I "standard input" . -It is also possible to terminate commands by sending them -an -.I interrupt -or -.I quit -signal (1.8). -The -.I kill -program terminates specified jobs (2.6). -.IP then -The -.I then -command is part of the shell's -`if-then-else-endif' control construct used in command scripts (3.6). -.IP time -The -.I time -command can be used to measure the amount of \s-2CPU\s0 -and real time consumed by a specified command as well -as the amount of disk i/o, memory utilized, and number -of page faults and swaps taken by the command (2.1, 2.8). -.IP tset -The -.I tset -program is used to set standard erase and kill characters -and to tell the system what kind of terminal you are using. -It is often invoked in a -.I \&.login -file (2.1). -.IP tty -The word -.I tty -is a historical abbreviation for `teletype' which is frequently used -in \s-2UNIX\s0 to indicate the -.I port -to which a given terminal is connected. The -.I tty -command will print the name of the -.I tty -or -.I port -to which your terminal is presently connected. -.IP unalias -The -.I unalias -command removes aliases (2.8). -.IP \s-2UNIX\s0 -\s-2UNIX\s0 is an operating system on which -.I csh -runs. -\s-2UNIX\s0 provides facilities which allow -.I csh -to invoke other programs such as editors and text formatters which -you may wish to use. -.IP unset -The -.I unset -command removes the definitions of shell variables (2.2, 2.8). -.IP "variable expansion" -.br -See -.I variables -and -.I expansion -(2.2, 3.4). -.IP variables -.I Variables -in -.I csh -hold one or more strings as value. -The most common use of -.I variables -is in controlling the behavior -of the shell. -See -.I path , -.I noclobber , -and -.I ignoreeof -for examples. -.I Variables -such as -.I argv -are also used in writing shell programs (shell command scripts) -(2.2). -.IP verbose -The -.I verbose -shell variable can be set to cause commands to be echoed -after they are history expanded. -This is often useful in debugging shell scripts. -The -.I verbose -variable is set by the shell's -.I \-v -command line option (3.10). -.IP wc -The -.I wc -program calculates the number of characters, words, and lines in the -files whose names are given as arguments (2.6). -.IP while -The -.I while -builtin control construct is used in shell command scripts (3.7). -.IP word -A sequence of characters which forms an argument to a command is called -a -.I word . -Many characters which are neither letters, digits, `\-', `.' nor `/' -form -.I words -all by themselves even if they are not surrounded -by blanks. -Any sequence of characters may be made into a -.I word -by surrounding it -with `\'' characters -except for the characters `\'' and `!' which require special treatment -(1.1). -This process of placing special characters in -.I words -without their special meaning is called -.I quoting . -.IP "working directory" -.br -At any given time you are in one particular directory, called -your -.I "working directory" . -This directory's name is printed by the -.I pwd -command and the files listed by -.I ls -are the ones in this directory. -You can change -.I "working directories" -using -.I chdir . -.IP write -The -.I write -command is an obsolete way of communicating with other users who are logged in to -\s-2UNIX\s0 (you have to take turns typing). If you are both using display -terminals, use \fItalk\fP(1), which is much more pleasant. diff --git a/bin/csh/USD.doc/tabs b/bin/csh/USD.doc/tabs deleted file mode 100644 index 196d437..0000000 --- a/bin/csh/USD.doc/tabs +++ /dev/null @@ -1,32 +0,0 @@ -.\"- -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)tabs 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n diff --git a/lib/libc/rpc/PSD.doc/nfs.rfc.ms b/lib/libc/rpc/PSD.doc/nfs.rfc.ms deleted file mode 100644 index 13d7619..0000000 --- a/lib/libc/rpc/PSD.doc/nfs.rfc.ms +++ /dev/null @@ -1,1374 +0,0 @@ -.\" -.\" Must use -- tbl -- with this one -.\" -.\" @(#)nfs.rfc.ms 2.2 88/08/05 4.0 RPCSRC -.\" $FreeBSD$ -.\" -.de BT -.if \\n%=1 .tl ''- % -'' -.. -.ND -.\" prevent excess underlining in nroff -.if n .fp 2 R -.OH 'Network File System: Version 2 Protocol Specification''Page %' -.EH 'Page %''Network File System: Version 2 Protocol Specification' -.if \n%=1 .bp -.SH -\&Network File System: Version 2 Protocol Specification -.IX NFS "" "" "" PAGE MAJOR -.IX "Network File System" "" "" "" PAGE MAJOR -.IX NFS "version-2 protocol specification" -.IX "Network File System" "version-2 protocol specification" -.LP -.NH 0 -\&Status of this Standard -.LP -Note: This document specifies a protocol that Sun Microsystems, Inc., -and others are using. It specifies it in standard ARPA RFC form. -.NH 1 -\&Introduction -.IX NFS introduction -.LP -The Sun Network Filesystem (NFS) protocol provides transparent remote -access to shared filesystems over local area networks. The NFS -protocol is designed to be machine, operating system, network architecture, -and transport protocol independent. This independence is -achieved through the use of Remote Procedure Call (RPC) primitives -built on top of an External Data Representation (XDR). Implementations -exist for a variety of machines, from personal computers to -supercomputers. -.LP -The supporting mount protocol allows the server to hand out remote -access privileges to a restricted set of clients. It performs the -operating system-specific functions that allow, for example, to -attach remote directory trees to some local file system. -.NH 2 -\&Remote Procedure Call -.IX "Remote Procedure Call" -.LP -Sun's remote procedure call specification provides a procedure- -oriented interface to remote services. Each server supplies a -program that is a set of procedures. NFS is one such "program". -The combination of host address, program number, and procedure -number specifies one remote service procedure. RPC does not depend -on services provided by specific protocols, so it can be used with -any underlying transport protocol. See the -.I "Remote Procedure Calls: Protocol Specification" -chapter of this manual. -.NH 2 -\&External Data Representation -.IX "External Data Representation" -.LP -The External Data Representation (XDR) standard provides a common -way of representing a set of data types over a network. -The NFS -Protocol Specification is written using the RPC data description -language. -For more information, see the -.I " External Data Representation Standard: Protocol Specification." -Sun provides implementations of XDR and -RPC, but NFS does not require their use. Any software that -provides equivalent functionality can be used, and if the encoding -is exactly the same it can interoperate with other implementations -of NFS. -.NH 2 -\&Stateless Servers -.IX "stateless servers" -.IX servers stateless -.LP -The NFS protocol is stateless. That is, a server does not need to -maintain any extra state information about any of its clients in -order to function correctly. Stateless servers have a distinct -advantage over stateful servers in the event of a failure. With -stateless servers, a client need only retry a request until the -server responds; it does not even need to know that the server has -crashed, or the network temporarily went down. The client of a -stateful server, on the other hand, needs to either detect a server -crash and rebuild the server's state when it comes back up, or -cause client operations to fail. -.LP -This may not sound like an important issue, but it affects the -protocol in some unexpected ways. We feel that it is worth a bit -of extra complexity in the protocol to be able to write very simple -servers that do not require fancy crash recovery. -.LP -On the other hand, NFS deals with objects such as files and -directories that inherently have state -- what good would a file be -if it did not keep its contents intact? The goal is to not -introduce any extra state in the protocol itself. Another way to -simplify recovery is by making operations "idempotent" whenever -possible (so that they can potentially be repeated). -.NH 1 -\&NFS Protocol Definition -.IX NFS "protocol definition" -.IX NFS protocol -.LP -Servers have been known to change over time, and so can the -protocol that they use. So RPC provides a version number with each -RPC request. This RFC describes version two of the NFS protocol. -Even in the second version, there are various obsolete procedures -and parameters, which will be removed in later versions. An RFC -for version three of the NFS protocol is currently under -preparation. -.NH 2 -\&File System Model -.IX filesystem model -.LP -NFS assumes a file system that is hierarchical, with directories as -all but the bottom-level files. Each entry in a directory (file, -directory, device, etc.) has a string name. Different operating -systems may have restrictions on the depth of the tree or the names -used, as well as using different syntax to represent the "pathname", -which is the concatenation of all the "components" (directory and -file names) in the name. A "file system" is a tree on a single -server (usually a single disk or physical partition) with a specified -"root". Some operating systems provide a "mount" operation to make -all file systems appear as a single tree, while others maintain a -"forest" of file systems. Files are unstructured streams of -uninterpreted bytes. Version 3 of NFS uses a slightly more general -file system model. -.LP -NFS looks up one component of a pathname at a time. It may not be -obvious why it does not just take the whole pathname, traipse down -the directories, and return a file handle when it is done. There are -several good reasons not to do this. First, pathnames need -separators between the directory components, and different operating -systems use different separators. We could define a Network Standard -Pathname Representation, but then every pathname would have to be -parsed and converted at each end. Other issues are discussed in -\fINFS Implementation Issues\fP below. -.LP -Although files and directories are similar objects in many ways, -different procedures are used to read directories and files. This -provides a network standard format for representing directories. The -same argument as above could have been used to justify a procedure -that returns only one directory entry per call. The problem is -efficiency. Directories can contain many entries, and a remote call -to return each would be just too slow. -.NH 2 -\&RPC Information -.IX NFS "RPC information" -.IP \fIAuthentication\fP -The NFS service uses -.I AUTH_UNIX , -.I AUTH_DES , -or -.I AUTH_SHORT -style -authentication, except in the NULL procedure where -.I AUTH_NONE -is also allowed. -.IP "\fITransport Protocols\fP" -NFS currently is supported on UDP/IP only. -.IP "\fIPort Number\fP" -The NFS protocol currently uses the UDP port number 2049. This is -not an officially assigned port, so later versions of the protocol -use the \*QPortmapping\*U facility of RPC. -.NH 2 -\&Sizes of XDR Structures -.IX "XDR structure sizes" -.LP -These are the sizes, given in decimal bytes, of various XDR -structures used in the protocol: -.DS -/* \fIThe maximum number of bytes of data in a READ or WRITE request\fP */ -const MAXDATA = 8192; - -/* \fIThe maximum number of bytes in a pathname argument\fP */ -const MAXPATHLEN = 1024; - -/* \fIThe maximum number of bytes in a file name argument\fP */ -const MAXNAMLEN = 255; - -/* \fIThe size in bytes of the opaque "cookie" passed by READDIR\fP */ -const COOKIESIZE = 4; - -/* \fIThe size in bytes of the opaque file handle\fP */ -const FHSIZE = 32; -.DE -.NH 2 -\&Basic Data Types -.IX "NFS data types" -.IX NFS "basic data types" -.LP -The following XDR definitions are basic structures and types used -in other structures described further on. -.KS -.NH 3 -\&stat -.IX "NFS data types" stat "" \fIstat\fP -.DS -enum stat { - NFS_OK = 0, - NFSERR_PERM=1, - NFSERR_NOENT=2, - NFSERR_IO=5, - NFSERR_NXIO=6, - NFSERR_ACCES=13, - NFSERR_EXIST=17, - NFSERR_NODEV=19, - NFSERR_NOTDIR=20, - NFSERR_ISDIR=21, - NFSERR_FBIG=27, - NFSERR_NOSPC=28, - NFSERR_ROFS=30, - NFSERR_NAMETOOLONG=63, - NFSERR_NOTEMPTY=66, - NFSERR_DQUOT=69, - NFSERR_STALE=70, - NFSERR_WFLUSH=99 -}; -.DE -.KE -.LP -The -.I stat -type is returned with every procedure's results. A -value of -.I NFS_OK -indicates that the call completed successfully and -the results are valid. The other values indicate some kind of -error occurred on the server side during the servicing of the -procedure. The error values are derived from UNIX error numbers. -.IP \fBNFSERR_PERM\fP: -Not owner. The caller does not have correct ownership -to perform the requested operation. -.IP \fBNFSERR_NOENT\fP: -No such file or directory. The file or directory -specified does not exist. -.IP \fBNFSERR_IO\fP: -Some sort of hard error occurred when the operation was -in progress. This could be a disk error, for example. -.IP \fBNFSERR_NXIO\fP: -No such device or address. -.IP \fBNFSERR_ACCES\fP: -Permission denied. The caller does not have the -correct permission to perform the requested operation. -.IP \fBNFSERR_EXIST\fP: -File exists. The file specified already exists. -.IP \fBNFSERR_NODEV\fP: -No such device. -.IP \fBNFSERR_NOTDIR\fP: -Not a directory. The caller specified a -non-directory in a directory operation. -.IP \fBNFSERR_ISDIR\fP: -Is a directory. The caller specified a directory in -a non- directory operation. -.IP \fBNFSERR_FBIG\fP: -File too large. The operation caused a file to grow -beyond the server's limit. -.IP \fBNFSERR_NOSPC\fP: -No space left on device. The operation caused the -server's filesystem to reach its limit. -.IP \fBNFSERR_ROFS\fP: -Read-only filesystem. Write attempted on a read-only filesystem. -.IP \fBNFSERR_NAMETOOLONG\fP: -File name too long. The file name in an operation was too long. -.IP \fBNFSERR_NOTEMPTY\fP: -Directory not empty. Attempted to remove a -directory that was not empty. -.IP \fBNFSERR_DQUOT\fP: -Disk quota exceeded. The client's disk quota on the -server has been exceeded. -.IP \fBNFSERR_STALE\fP: -The "fhandle" given in the arguments was invalid. -That is, the file referred to by that file handle no longer exists, -or access to it has been revoked. -.IP \fBNFSERR_WFLUSH\fP: -The server's write cache used in the -.I WRITECACHE -call got flushed to disk. -.LP -.KS -.NH 3 -\&ftype -.IX "NFS data types" ftype "" \fIftype\fP -.DS -enum ftype { - NFNON = 0, - NFREG = 1, - NFDIR = 2, - NFBLK = 3, - NFCHR = 4, - NFLNK = 5 -}; -.DE -.KE -The enumeration -.I ftype -gives the type of a file. The type -.I NFNON -indicates a non-file, -.I NFREG -is a regular file, -.I NFDIR -is a directory, -.I NFBLK -is a block-special device, -.I NFCHR -is a character-special device, and -.I NFLNK -is a symbolic link. -.KS -.NH 3 -\&fhandle -.IX "NFS data types" fhandle "" \fIfhandle\fP -.DS -typedef opaque fhandle[FHSIZE]; -.DE -.KE -The -.I fhandle -is the file handle passed between the server and the client. -All file operations are done using file handles to refer to a file or -directory. The file handle can contain whatever information the server -needs to distinguish an individual file. -.KS -.NH 3 -\&timeval -.IX "NFS data types" timeval "" \fItimeval\fP -.DS -struct timeval { - unsigned int seconds; - unsigned int useconds; -}; -.DE -.KE -The -.I timeval -structure is the number of seconds and microseconds -since midnight January 1, 1970, Greenwich Mean Time. It is used to -pass time and date information. -.KS -.NH 3 -\&fattr -.IX "NFS data types" fattr "" \fIfattr\fP -.DS -struct fattr { - ftype type; - unsigned int mode; - unsigned int nlink; - unsigned int uid; - unsigned int gid; - unsigned int size; - unsigned int blocksize; - unsigned int rdev; - unsigned int blocks; - unsigned int fsid; - unsigned int fileid; - timeval atime; - timeval mtime; - timeval ctime; -}; -.DE -.KE -The -.I fattr -structure contains the attributes of a file; "type" is the type of -the file; "nlink" is the number of hard links to the file (the number -of different names for the same file); "uid" is the user -identification number of the owner of the file; "gid" is the group -identification number of the group of the file; "size" is the size in -bytes of the file; "blocksize" is the size in bytes of a block of the -file; "rdev" is the device number of the file if it is type -.I NFCHR -or -.I NFBLK ; -"blocks" is the number of blocks the file takes up on disk; "fsid" is -the file system identifier for the filesystem containing the file; -"fileid" is a number that uniquely identifies the file within its -filesystem; "atime" is the time when the file was last accessed for -either read or write; "mtime" is the time when the file data was last -modified (written); and "ctime" is the time when the status of the -file was last changed. Writing to the file also changes "ctime" if -the size of the file changes. -.LP -"mode" is the access mode encoded as a set of bits. Notice that the -file type is specified both in the mode bits and in the file type. -This is really a bug in the protocol and will be fixed in future -versions. The descriptions given below specify the bit positions -using octal numbers. -.TS -box tab (&) ; -cfI cfI -lfL l . -Bit&Description -_ -0040000&This is a directory; "type" field should be NFDIR. -0020000&This is a character special file; "type" field should be NFCHR. -0060000&This is a block special file; "type" field should be NFBLK. -0100000&This is a regular file; "type" field should be NFREG. -0120000&This is a symbolic link file; "type" field should be NFLNK. -0140000&This is a named socket; "type" field should be NFNON. -0004000&Set user id on execution. -0002000&Set group id on execution. -0001000&Save swapped text even after use. -0000400&Read permission for owner. -0000200&Write permission for owner. -0000100&Execute and search permission for owner. -0000040&Read permission for group. -0000020&Write permission for group. -0000010&Execute and search permission for group. -0000004&Read permission for others. -0000002&Write permission for others. -0000001&Execute and search permission for others. -.TE -.KS -Notes: -.IP -The bits are the same as the mode bits returned by the -.I stat(2) -system call in the UNIX system. The file type is specified both in -the mode bits and in the file type. This is fixed in future -versions. -.IP -The "rdev" field in the attributes structure is an operating system -specific device specifier. It will be removed and generalized in -the next revision of the protocol. -.KE -.LP -.KS -.NH 3 -\&sattr -.IX "NFS data types" sattr "" \fIsattr\fP -.DS -struct sattr { - unsigned int mode; - unsigned int uid; - unsigned int gid; - unsigned int size; - timeval atime; - timeval mtime; -}; -.DE -.KE -The -.I sattr -structure contains the file attributes which can be set -from the client. The fields are the same as for -.I fattr -above. A "size" of zero means the file should be truncated. -A value of -1 indicates a field that should be ignored. -.LP -.KS -.NH 3 -\&filename -.IX "NFS data types" filename "" \fIfilename\fP -.DS -typedef string filename; -.DE -.KE -The type -.I filename -is used for passing file names or pathname components. -.LP -.KS -.NH 3 -\&path -.IX "NFS data types" path "" \fIpath\fP -.DS -typedef string path; -.DE -.KE -The type -.I path -is a pathname. The server considers it as a string -with no internal structure, but to the client it is the name of a -node in a filesystem tree. -.LP -.KS -.NH 3 -\&attrstat -.IX "NFS data types" attrstat "" \fIattrstat\fP -.DS -union attrstat switch (stat status) { - case NFS_OK: - fattr attributes; - default: - void; -}; -.DE -.KE -The -.I attrstat -structure is a common procedure result. It contains -a "status" and, if the call succeeded, it also contains the -attributes of the file on which the operation was done. -.LP -.KS -.NH 3 -\&diropargs -.IX "NFS data types" diropargs "" \fIdiropargs\fP -.DS -struct diropargs { - fhandle dir; - filename name; -}; -.DE -.KE -The -.I diropargs -structure is used in directory operations. The -"fhandle" "dir" is the directory in which to find the file "name". -A directory operation is one in which the directory is affected. -.LP -.KS -.NH 3 -\&diropres -.IX "NFS data types" diropres "" \fIdiropres\fP -.DS -union diropres switch (stat status) { - case NFS_OK: - struct { - fhandle file; - fattr attributes; - } diropok; - default: - void; -}; -.DE -.KE -The results of a directory operation are returned in a -.I diropres -structure. If the call succeeded, a new file handle "file" and the -"attributes" associated with that file are returned along with the -"status". -.NH 2 -\&Server Procedures -.IX "NFS server procedures" "" "" "" PAGE MAJOR -.LP -The protocol definition is given as a set of procedures with -arguments and results defined using the RPC language. A brief -description of the function of each procedure should provide enough -information to allow implementation. -.LP -All of the procedures in the NFS protocol are assumed to be -synchronous. When a procedure returns to the client, the client -can assume that the operation has completed and any data associated -with the request is now on stable storage. For example, a client -.I WRITE -request may cause the server to update data blocks, -filesystem information blocks (such as indirect blocks), and file -attribute information (size and modify times). When the -.I WRITE -returns to the client, it can assume that the write is safe, even -in case of a server crash, and it can discard the data written. -This is a very important part of the statelessness of the server. -If the server waited to flush data from remote requests, the client -would have to save those requests so that it could resend them in -case of a server crash. -.ie t .DS -.el .DS L - -.ft I -/* -* Remote file service routines -*/ -.ft CW -program NFS_PROGRAM { - version NFS_VERSION { - void NFSPROC_NULL(void) = 0; - attrstat NFSPROC_GETATTR(fhandle) = 1; - attrstat NFSPROC_SETATTR(sattrargs) = 2; - void NFSPROC_ROOT(void) = 3; - diropres NFSPROC_LOOKUP(diropargs) = 4; - readlinkres NFSPROC_READLINK(fhandle) = 5; - readres NFSPROC_READ(readargs) = 6; - void NFSPROC_WRITECACHE(void) = 7; - attrstat NFSPROC_WRITE(writeargs) = 8; - diropres NFSPROC_CREATE(createargs) = 9; - stat NFSPROC_REMOVE(diropargs) = 10; - stat NFSPROC_RENAME(renameargs) = 11; - stat NFSPROC_LINK(linkargs) = 12; - stat NFSPROC_SYMLINK(symlinkargs) = 13; - diropres NFSPROC_MKDIR(createargs) = 14; - stat NFSPROC_RMDIR(diropargs) = 15; - readdirres NFSPROC_READDIR(readdirargs) = 16; - statfsres NFSPROC_STATFS(fhandle) = 17; - } = 2; -} = 100003; -.DE -.KS -.NH 3 -\&Do Nothing -.IX "NFS server procedures" NFSPROC_NULL() "" \fINFSPROC_NULL()\fP -.DS -void -NFSPROC_NULL(void) = 0; -.DE -.KE -This procedure does no work. It is made available in all RPC -services to allow server response testing and timing. -.KS -.NH 3 -\&Get File Attributes -.IX "NFS server procedures" NFSPROC_GETATTR() "" \fINFSPROC_GETATTR()\fP -.DS -attrstat -NFSPROC_GETATTR (fhandle) = 1; -.DE -.KE -If the reply status is -.I NFS_OK , -then the reply attributes contains -the attributes for the file given by the input fhandle. -.KS -.NH 3 -\&Set File Attributes -.IX "NFS server procedures" NFSPROC_SETATTR() "" \fINFSPROC_SETATTR()\fP -.DS -struct sattrargs { - fhandle file; - sattr attributes; - }; - -attrstat -NFSPROC_SETATTR (sattrargs) = 2; -.DE -.KE -The "attributes" argument contains fields which are either -1 or -are the new value for the attributes of "file". If the reply -status is -.I NFS_OK , -then the reply attributes have the attributes of -the file after the "SETATTR" operation has completed. -.LP -Note: The use of -1 to indicate an unused field in "attributes" is -changed in the next version of the protocol. -.KS -.NH 3 -\&Get Filesystem Root -.IX "NFS server procedures" NFSPROC_ROOT "" \fINFSPROC_ROOT\fP -.DS -void -NFSPROC_ROOT(void) = 3; -.DE -.KE -Obsolete. This procedure is no longer used because finding the -root file handle of a filesystem requires moving pathnames between -client and server. To do this right we would have to define a -network standard representation of pathnames. Instead, the -function of looking up the root file handle is done by the -.I MNTPROC_MNT() -procedure. (See the -.I "Mount Protocol Definition" -later in this chapter for details). -.KS -.NH 3 -\&Look Up File Name -.IX "NFS server procedures" NFSPROC_LOOKUP() "" \fINFSPROC_LOOKUP()\fP -.DS -diropres -NFSPROC_LOOKUP(diropargs) = 4; -.DE -.KE -If the reply "status" is -.I NFS_OK , -then the reply "file" and reply -"attributes" are the file handle and attributes for the file "name" -in the directory given by "dir" in the argument. -.KS -.NH 3 -\&Read From Symbolic Link -.IX "NFS server procedures" NFSPROC_READLINK() "" \fINFSPROC_READLINK()\fP -.DS -union readlinkres switch (stat status) { - case NFS_OK: - path data; - default: - void; -}; - -readlinkres -NFSPROC_READLINK(fhandle) = 5; -.DE -.KE -If "status" has the value -.I NFS_OK , -then the reply "data" is the data in -the symbolic link given by the file referred to by the fhandle argument. -.LP -Note: since NFS always parses pathnames on the client, the -pathname in a symbolic link may mean something different (or be -meaningless) on a different client or on the server if a different -pathname syntax is used. -.KS -.NH 3 -\&Read From File -.IX "NFS server procedures" NFSPROC_READ "" \fINFSPROC_READ\fP -.DS -struct readargs { - fhandle file; - unsigned offset; - unsigned count; - unsigned totalcount; -}; - -union readres switch (stat status) { - case NFS_OK: - fattr attributes; - opaque data; - default: - void; -}; - -readres -NFSPROC_READ(readargs) = 6; -.DE -.KE -Returns up to "count" bytes of "data" from the file given by -"file", starting at "offset" bytes from the beginning of the file. -The first byte of the file is at offset zero. The file attributes -after the read takes place are returned in "attributes". -.LP -Note: The argument "totalcount" is unused, and is removed in the -next protocol revision. -.KS -.NH 3 -\&Write to Cache -.IX "NFS server procedures" NFSPROC_WRITECACHE() "" \fINFSPROC_WRITECACHE()\fP -.DS -void -NFSPROC_WRITECACHE(void) = 7; -.DE -.KE -To be used in the next protocol revision. -.KS -.NH 3 -\&Write to File -.IX "NFS server procedures" NFSPROC_WRITE() "" \fINFSPROC_WRITE()\fP -.DS -struct writeargs { - fhandle file; - unsigned beginoffset; - unsigned offset; - unsigned totalcount; - opaque data; -}; - -attrstat -NFSPROC_WRITE(writeargs) = 8; -.DE -.KE -Writes "data" beginning "offset" bytes from the beginning of -"file". The first byte of the file is at offset zero. If the -reply "status" is NFS_OK, then the reply "attributes" contains the -attributes of the file after the write has completed. The write -operation is atomic. Data from this call to -.I WRITE -will not be mixed with data from another client's calls. -.LP -Note: The arguments "beginoffset" and "totalcount" are ignored and -are removed in the next protocol revision. -.KS -.NH 3 -\&Create File -.IX "NFS server procedures" NFSPROC_CREATE() "" \fINFSPROC_CREATE()\fP -.DS -struct createargs { - diropargs where; - sattr attributes; -}; - -diropres -NFSPROC_CREATE(createargs) = 9; -.DE -.KE -The file "name" is created in the directory given by "dir". The -initial attributes of the new file are given by "attributes". A -reply "status" of NFS_OK indicates that the file was created, and -reply "file" and reply "attributes" are its file handle and -attributes. Any other reply "status" means that the operation -failed and no file was created. -.LP -Note: This routine should pass an exclusive create flag, meaning -"create the file only if it is not already there". -.KS -.NH 3 -\&Remove File -.IX "NFS server procedures" NFSPROC_REMOVE() "" \fINFSPROC_REMOVE()\fP -.DS -stat -NFSPROC_REMOVE(diropargs) = 10; -.DE -.KE -The file "name" is removed from the directory given by "dir". A -reply of NFS_OK means the directory entry was removed. -.LP -Note: possibly non-idempotent operation. -.KS -.NH 3 -\&Rename File -.IX "NFS server procedures" NFSPROC_RENAME() "" \fINFSPROC_RENAME()\fP -.DS -struct renameargs { - diropargs from; - diropargs to; -}; - -stat -NFSPROC_RENAME(renameargs) = 11; -.DE -.KE -The existing file "from.name" in the directory given by "from.dir" -is renamed to "to.name" in the directory given by "to.dir". If the -reply is -.I NFS_OK , -the file was renamed. The -RENAME -operation is -atomic on the server; it cannot be interrupted in the middle. -.LP -Note: possibly non-idempotent operation. -.KS -.NH 3 -\&Create Link to File -.IX "NFS server procedures" NFSPROC_LINK() "" \fINFSPROC_LINK()\fP -.DS -struct linkargs { - fhandle from; - diropargs to; -}; - -stat -NFSPROC_LINK(linkargs) = 12; -.DE -.KE -Creates the file "to.name" in the directory given by "to.dir", -which is a hard link to the existing file given by "from". If the -return value is -.I NFS_OK , -a link was created. Any other return value -indicates an error, and the link was not created. -.LP -A hard link should have the property that changes to either of the -linked files are reflected in both files. When a hard link is made -to a file, the attributes for the file should have a value for -"nlink" that is one greater than the value before the link. -.LP -Note: possibly non-idempotent operation. -.KS -.NH 3 -\&Create Symbolic Link -.IX "NFS server procedures" NFSPROC_SYMLINK() "" \fINFSPROC_SYMLINK()\fP -.DS -struct symlinkargs { - diropargs from; - path to; - sattr attributes; -}; - -stat -NFSPROC_SYMLINK(symlinkargs) = 13; -.DE -.KE -Creates the file "from.name" with ftype -.I NFLNK -in the directory -given by "from.dir". The new file contains the pathname "to" and -has initial attributes given by "attributes". If the return value -is -.I NFS_OK , -a link was created. Any other return value indicates an -error, and the link was not created. -.LP -A symbolic link is a pointer to another file. The name given in -"to" is not interpreted by the server, only stored in the newly -created file. When the client references a file that is a symbolic -link, the contents of the symbolic link are normally transparently -reinterpreted as a pathname to substitute. A -.I READLINK -operation returns the data to the client for interpretation. -.LP -Note: On UNIX servers the attributes are never used, since -symbolic links always have mode 0777. -.KS -.NH 3 -\&Create Directory -.IX "NFS server procedures" NFSPROC_MKDIR() "" \fINFSPROC_MKDIR()\fP -.DS -diropres -NFSPROC_MKDIR (createargs) = 14; -.DE -.KE -The new directory "where.name" is created in the directory given by -"where.dir". The initial attributes of the new directory are given -by "attributes". A reply "status" of NFS_OK indicates that the new -directory was created, and reply "file" and reply "attributes" are -its file handle and attributes. Any other reply "status" means -that the operation failed and no directory was created. -.LP -Note: possibly non-idempotent operation. -.KS -.NH 3 -\&Remove Directory -.IX "NFS server procedures" NFSPROC_RMDIR() "" \fINFSPROC_RMDIR()\fP -.DS -stat -NFSPROC_RMDIR(diropargs) = 15; -.DE -.KE -The existing empty directory "name" in the directory given by "dir" -is removed. If the reply is -.I NFS_OK , -the directory was removed. -.LP -Note: possibly non-idempotent operation. -.KS -.NH 3 -\&Read From Directory -.IX "NFS server procedures" NFSPROC_READDIR() "" \fINFSPROC_READDIR()\fP -.DS -struct readdirargs { - fhandle dir; - nfscookie cookie; - unsigned count; -}; - -struct entry { - unsigned fileid; - filename name; - nfscookie cookie; - entry *nextentry; -}; - -union readdirres switch (stat status) { - case NFS_OK: - struct { - entry *entries; - bool eof; - } readdirok; - default: - void; -}; - -readdirres -NFSPROC_READDIR (readdirargs) = 16; -.DE -.KE -Returns a variable number of directory entries, with a total size -of up to "count" bytes, from the directory given by "dir". If the -returned value of "status" is -.I NFS_OK , -then it is followed by a -variable number of "entry"s. Each "entry" contains a "fileid" -which consists of a unique number to identify the file within a -filesystem, the "name" of the file, and a "cookie" which is an -opaque pointer to the next entry in the directory. The cookie is -used in the next -.I READDIR -call to get more entries starting at a -given point in the directory. The special cookie zero (all bits -zero) can be used to get the entries starting at the beginning of -the directory. The "fileid" field should be the same number as the -"fileid" in the the attributes of the file. (See the -.I "Basic Data Types" -section.) -The "eof" flag has a value of -.I TRUE -if there are no more entries in the directory. -.KS -.NH 3 -\&Get Filesystem Attributes -.IX "NFS server procedures" NFSPROC_STATFS() "" \fINFSPROC_STATFS()\fP -.DS -union statfsres (stat status) { - case NFS_OK: - struct { - unsigned tsize; - unsigned bsize; - unsigned blocks; - unsigned bfree; - unsigned bavail; - } info; - default: - void; -}; - -statfsres -NFSPROC_STATFS(fhandle) = 17; -.DE -.KE -If the reply "status" is -.I NFS_OK , -then the reply "info" gives the -attributes for the filesystem that contains file referred to by the -input fhandle. The attribute fields contain the following values: -.IP tsize: -The optimum transfer size of the server in bytes. This is -the number of bytes the server would like to have in the -data part of READ and WRITE requests. -.IP bsize: -The block size in bytes of the filesystem. -.IP blocks: -The total number of "bsize" blocks on the filesystem. -.IP bfree: -The number of free "bsize" blocks on the filesystem. -.IP bavail: -The number of "bsize" blocks available to non-privileged users. -.LP -Note: This call does not work well if a filesystem has variable -size blocks. -.NH 1 -\&NFS Implementation Issues -.IX NFS implementation -.LP -The NFS protocol is designed to be operating system independent, but -since this version was designed in a UNIX environment, many -operations have semantics similar to the operations of the UNIX file -system. This section discusses some of the implementation-specific -semantic issues. -.NH 2 -\&Server/Client Relationship -.IX NFS "server/client relationship" -.LP -The NFS protocol is designed to allow servers to be as simple and -general as possible. Sometimes the simplicity of the server can be a -problem, if the client wants to implement complicated filesystem -semantics. -.LP -For example, some operating systems allow removal of open files. A -process can open a file and, while it is open, remove it from the -directory. The file can be read and written as long as the process -keeps it open, even though the file has no name in the filesystem. -It is impossible for a stateless server to implement these semantics. -The client can do some tricks such as renaming the file on remove, -and only removing it on close. We believe that the server provides -enough functionality to implement most file system semantics on the -client. -.LP -Every NFS client can also potentially be a server, and remote and -local mounted filesystems can be freely intermixed. This leads to -some interesting problems when a client travels down the directory -tree of a remote filesystem and reaches the mount point on the server -for another remote filesystem. Allowing the server to follow the -second remote mount would require loop detection, server lookup, and -user revalidation. Instead, we decided not to let clients cross a -server's mount point. When a client does a LOOKUP on a directory on -which the server has mounted a filesystem, the client sees the -underlying directory instead of the mounted directory. A client can -do remote mounts that match the server's mount points to maintain the -server's view. -.LP -.NH 2 -\&Pathname Interpretation -.IX NFS "pathname interpretation" -.LP -There are a few complications to the rule that pathnames are always -parsed on the client. For example, symbolic links could have -different interpretations on different clients. Another common -problem for non-UNIX implementations is the special interpretation of -the pathname ".." to mean the parent of a given directory. The next -revision of the protocol uses an explicit flag to indicate the parent -instead. -.NH 2 -\&Permission Issues -.IX NFS "permission issues" -.LP -The NFS protocol, strictly speaking, does not define the permission -checking used by servers. However, it is expected that a server -will do normal operating system permission checking using -.I AUTH_UNIX -style authentication as the basis of its protection mechanism. The -server gets the client's effective "uid", effective "gid", and groups -on each call and uses them to check permission. There are various -problems with this method that can been resolved in interesting ways. -.LP -Using "uid" and "gid" implies that the client and server share the -same "uid" list. Every server and client pair must have the same -mapping from user to "uid" and from group to "gid". Since every -client can also be a server, this tends to imply that the whole -network shares the same "uid/gid" space. -.I AUTH_DES -(and the next -revision of the NFS protocol) uses string names instead of numbers, -but there are still complex problems to be solved. -.LP -Another problem arises due to the usually stateful open operation. -Most operating systems check permission at open time, and then check -that the file is open on each read and write request. With stateless -servers, the server has no idea that the file is open and must do -permission checking on each read and write call. On a local -filesystem, a user can open a file and then change the permissions so -that no one is allowed to touch it, but will still be able to write -to the file because it is open. On a remote filesystem, by contrast, -the write would fail. To get around this problem, the server's -permission checking algorithm should allow the owner of a file to -access it regardless of the permission setting. -.LP -A similar problem has to do with paging in from a file over the -network. The operating system usually checks for execute permission -before opening a file for demand paging, and then reads blocks from -the open file. The file may not have read permission, but after it -is opened it doesn't matter. An NFS server can not tell the -difference between a normal file read and a demand page-in read. To -make this work, the server allows reading of files if the "uid" given -in the call has execute or read permission on the file. -.LP -In most operating systems, a particular user (on the user ID zero) -has access to all files no matter what permission and ownership they -have. This "super-user" permission may not be allowed on the server, -since anyone who can become super-user on their workstation could -gain access to all remote files. The UNIX server by default maps -user id 0 to -2 before doing its access checking. This works except -for NFS root filesystems, where super-user access cannot be avoided. -.NH 2 -\&Setting RPC Parameters -.IX NFS "setting RPC parameters" -.LP -Various file system parameters and options should be set at mount -time. The mount protocol is described in the appendix below. For -example, "Soft" mounts as well as "Hard" mounts are usually both -provided. Soft mounted file systems return errors when RPC -operations fail (after a given number of optional retransmissions), -while hard mounted file systems continue to retransmit forever. -Clients and servers may need to keep caches of recent operations to -help avoid problems with non-idempotent operations. -.NH 1 -\&Mount Protocol Definition -.IX "mount protocol" "" "" "" PAGE MAJOR -.sp 1 -.NH 2 -\&Introduction -.IX "mount protocol" introduction -.LP -The mount protocol is separate from, but related to, the NFS -protocol. It provides operating system specific services to get the -NFS off the ground -- looking up server path names, validating user -identity, and checking access permissions. Clients use the mount -protocol to get the first file handle, which allows them entry into a -remote filesystem. -.LP -The mount protocol is kept separate from the NFS protocol to make it -easy to plug in new access checking and validation methods without -changing the NFS server protocol. -.LP -Notice that the protocol definition implies stateful servers because -the server maintains a list of client's mount requests. The mount -list information is not critical for the correct functioning of -either the client or the server. It is intended for advisory use -only, for example, to warn possible clients when a server is going -down. -.LP -Version one of the mount protocol is used with version two of the NFS -protocol. The only connecting point is the -.I fhandle -structure, which is the same for both protocols. -.NH 2 -\&RPC Information -.IX "mount protocol" "RPC information" -.IP \fIAuthentication\fP -The mount service uses -.I AUTH_UNIX -and -.I AUTH_DES -style authentication only. -.IP "\fITransport Protocols\fP" -The mount service is currently supported on UDP/IP only. -.IP "\fIPort Number\fP" -Consult the server's portmapper, described in the chapter -.I "Remote Procedure Calls: Protocol Specification", -to find the port number on which the mount service is registered. -.NH 2 -\&Sizes of XDR Structures -.IX "mount protocol" "XDR structure sizes" -.LP -These are the sizes, given in decimal bytes, of various XDR -structures used in the protocol: -.DS -/* \fIThe maximum number of bytes in a pathname argument\fP */ -const MNTPATHLEN = 1024; - -/* \fIThe maximum number of bytes in a name argument\fP */ -const MNTNAMLEN = 255; - -/* \fIThe size in bytes of the opaque file handle\fP */ -const FHSIZE = 32; -.DE -.NH 2 -\&Basic Data Types -.IX "mount protocol" "basic data types" -.IX "mount data types" -.LP -This section presents the data types used by the mount protocol. -In many cases they are similar to the types used in NFS. -.KS -.NH 3 -\&fhandle -.IX "mount data types" fhandle "" \fIfhandle\fP -.DS -typedef opaque fhandle[FHSIZE]; -.DE -.KE -The type -.I fhandle -is the file handle that the server passes to the -client. All file operations are done using file handles to refer -to a file or directory. The file handle can contain whatever -information the server needs to distinguish an individual file. -.LP -This is the same as the "fhandle" XDR definition in version 2 of -the NFS protocol; see -.I "Basic Data Types" -in the definition of the NFS protocol, above. -.KS -.NH 3 -\&fhstatus -.IX "mount data types" fhstatus "" \fIfhstatus\fP -.DS -union fhstatus switch (unsigned status) { - case 0: - fhandle directory; - default: - void; -}; -.DE -.KE -The type -.I fhstatus -is a union. If a "status" of zero is returned, -the call completed successfully, and a file handle for the -"directory" follows. A non-zero status indicates some sort of -error. In this case the status is a UNIX error number. -.KS -.NH 3 -\&dirpath -.IX "mount data types" dirpath "" \fIdirpath\fP -.DS -typedef string dirpath; -.DE -.KE -The type -.I dirpath -is a server pathname of a directory. -.KS -.NH 3 -\&name -.IX "mount data types" name "" \fIname\fP -.DS -typedef string name; -.DE -.KE -The type -.I name -is an arbitrary string used for various names. -.NH 2 -\&Server Procedures -.IX "mount server procedures" -.LP -The following sections define the RPC procedures supplied by a -mount server. -.ie t .DS -.el .DS L -.ft I -/* -* Protocol description for the mount program -*/ -.ft CW - -program MOUNTPROG { -.ft I -/* -* Version 1 of the mount protocol used with -* version 2 of the NFS protocol. -*/ -.ft CW - version MOUNTVERS { - void MOUNTPROC_NULL(void) = 0; - fhstatus MOUNTPROC_MNT(dirpath) = 1; - mountlist MOUNTPROC_DUMP(void) = 2; - void MOUNTPROC_UMNT(dirpath) = 3; - void MOUNTPROC_UMNTALL(void) = 4; - exportlist MOUNTPROC_EXPORT(void) = 5; - } = 1; -} = 100005; -.DE -.KS -.NH 3 -\&Do Nothing -.IX "mount server procedures" MNTPROC_NULL() "" \fIMNTPROC_NULL()\fP -.DS -void -MNTPROC_NULL(void) = 0; -.DE -.KE -This procedure does no work. It is made available in all RPC -services to allow server response testing and timing. -.KS -.NH 3 -\&Add Mount Entry -.IX "mount server procedures" MNTPROC_MNT() "" \fIMNTPROC_MNT()\fP -.DS -fhstatus -MNTPROC_MNT(dirpath) = 1; -.DE -.KE -If the reply "status" is 0, then the reply "directory" contains the -file handle for the directory "dirname". This file handle may be -used in the NFS protocol. This procedure also adds a new entry to -the mount list for this client mounting "dirname". -.KS -.NH 3 -\&Return Mount Entries -.IX "mount server procedures" MNTPROC_DUMP() "" \fIMNTPROC_DUMP()\fP -.DS -struct *mountlist { - name hostname; - dirpath directory; - mountlist nextentry; -}; - -mountlist -MNTPROC_DUMP(void) = 2; -.DE -.KE -Returns the list of remote mounted filesystems. The "mountlist" -contains one entry for each "hostname" and "directory" pair. -.KS -.NH 3 -\&Remove Mount Entry -.IX "mount server procedures" MNTPROC_UMNT() "" \fIMNTPROC_UMNT()\fP -.DS -void -MNTPROC_UMNT(dirpath) = 3; -.DE -.KE -Removes the mount list entry for the input "dirpath". -.KS -.NH 3 -\&Remove All Mount Entries -.IX "mount server procedures" MNTPROC_UMNTALL() "" \fIMNTPROC_UMNTALL()\fP -.DS -void -MNTPROC_UMNTALL(void) = 4; -.DE -.KE -Removes all of the mount list entries for this client. -.KS -.NH 3 -\&Return Export List -.IX "mount server procedures" MNTPROC_EXPORT() "" \fIMNTPROC_EXPORT()\fP -.DS -struct *groups { - name grname; - groups grnext; -}; - -struct *exportlist { - dirpath filesys; - groups groups; - exportlist next; -}; - -exportlist -MNTPROC_EXPORT(void) = 5; -.DE -.KE -Returns a variable number of export list entries. Each entry -contains a filesystem name and a list of groups that are allowed to -import it. The filesystem name is in "filesys", and the group name -is in the list "groups". -.LP -Note: The exportlist should contain -more information about the status of the filesystem, such as a -read-only flag. diff --git a/lib/libc/rpc/PSD.doc/rpc.prog.ms b/lib/libc/rpc/PSD.doc/rpc.prog.ms deleted file mode 100644 index 8b79130..0000000 --- a/lib/libc/rpc/PSD.doc/rpc.prog.ms +++ /dev/null @@ -1,2686 +0,0 @@ -.\" -.\" Must use -- tbl and pic -- with this one -.\" -.\" @(#)rpc.prog.ms 2.3 88/08/11 4.0 RPCSRC -.\" $FreeBSD$ -.\" -.de BT -.if \\n%=1 .tl ''- % -'' -.. -.nr OF 0 -.ND -.\" prevent excess underlining in nroff -.if n .fp 2 R -.OH 'Remote Procedure Call Programming Guide''Page %' -.EH 'Page %''Remote Procedure Call Programming Guide' -.SH -\&Remote Procedure Call Programming Guide -.nr OF 1 -.IX "Network Programming" "" "" "" PAGE MAJOR -.IX "RPC Programming Guide" -.LP -This document assumes a working knowledge of network theory. It is -intended for programmers who wish to write network applications using -remote procedure calls (explained below), and who want to understand -the RPC mechanisms usually hidden by the -.I rpcgen(1) -protocol compiler. -.I rpcgen -is described in detail in the previous chapter, the -.I "\fBrpcgen\fP \fIProgramming Guide\fP". -.SH -Note: -.I -.IX rpcgen "" \fIrpcgen\fP -Before attempting to write a network application, or to convert an -existing non-network application to run over the network, you may want to -understand the material in this chapter. However, for most applications, -you can circumvent the need to cope with the details presented here by using -.I rpcgen . -The -.I "Generating XDR Routines" -section of that chapter contains the complete source for a working RPC -service\(ema remote directory listing service which uses -.I rpcgen -to generate XDR routines as well as client and server stubs. -.LP -.LP -What are remote procedure calls? Simply put, they are the high-level -communications paradigm used in the operating system. -RPC presumes the existence of -low-level networking mechanisms (such as TCP/IP and UDP/IP), and upon them -it implements a logical client to server communications system designed -specifically for the support of network applications. With RPC, the client -makes a procedure call to send a data packet to the server. When the -packet arrives, the server calls a dispatch routine, performs whatever -service is requested, sends back the reply, and the procedure call returns -to the client. -.NH 0 -\&Layers of RPC -.IX "layers of RPC" -.IX "RPC" "layers" -.LP -The RPC interface can be seen as being divided into three layers.\** -.FS -For a complete specification of the routines in the remote procedure -call Library, see the -.I rpc(3N) -manual page. -.FE -.LP -.I "The Highest Layer:" -.IX RPC "The Highest Layer" -The highest layer is totally transparent to the operating system, -machine and network upon which is is run. It's probably best to -think of this level as a way of -.I using -RPC, rather than as -a \fIpart of\fP RPC proper. Programmers who write RPC routines -should (almost) always make this layer available to others by way -of a simple C front end that entirely hides the networking. -.LP -To illustrate, at this level a program can simply make a call to -.I rnusers (), -a C routine which returns the number of users on a remote machine. -The user is not explicitly aware of using RPC \(em they simply -call a procedure, just as they would call -.I malloc() . -.LP -.I "The Middle Layer:" -.IX RPC "The Middle Layer" -The middle layer is really \*QRPC proper.\*U Here, the user doesn't -need to consider details about sockets, the UNIX system, or other low-level -implementation mechanisms. They simply make remote procedure calls -to routines on other machines. The selling point here is simplicity. -It's this layer that allows RPC to pass the \*Qhello world\*U test \(em -simple things should be simple. The middle-layer routines are used -for most applications. -.LP -RPC calls are made with the system routines -.I registerrpc() -.I callrpc() -and -.I svc_run (). -The first two of these are the most fundamental: -.I registerrpc() -obtains a unique system-wide procedure-identification number, and -.I callrpc() -actually executes a remote procedure call. At the middle level, a -call to -.I rnusers() -is implemented by way of these two routines. -.LP -The middle layer is unfortunately rarely used in serious programming -due to its inflexibility (simplicity). It does not allow timeout -specifications or the choice of transport. It allows no UNIX -process control or flexibility in case of errors. It doesn't support -multiple kinds of call authentication. The programmer rarely needs -all these kinds of control, but one or two of them is often necessary. -.LP -.I "The Lowest Layer:" -.IX RPC "The Lowest Layer" -The lowest layer does allow these details to be controlled by the -programmer, and for that reason it is often necessary. Programs -written at this level are also most efficient, but this is rarely a -real issue \(em since RPC clients and servers rarely generate -heavy network loads. -.LP -Although this document only discusses the interface to C, -remote procedure calls can be made from any language. -Even though this document discusses RPC -when it is used to communicate -between processes on different machines, -it works just as well for communication -between different processes on the same machine. -.br -.KS -.NH 2 -\&The RPC Paradigm -.IX RPC paradigm -.LP -Here is a diagram of the RPC paradigm: -.LP -\fBFigure 1-1\fI Network Communication with the Remote Reocedure Call\fR -.LP -.PS -L1: arrow down 1i "client " rjust "program " rjust -L2: line right 1.5i "\fIcallrpc\fP" "function" -move up 1.5i; line dotted down 6i; move up 4.5i -arrow right 1i -L3: arrow down 1i "invoke " rjust "service " rjust -L4: arrow right 1.5i "call" "service" -L5: arrow down 1i " service" ljust " executes" ljust -L6: arrow left 1.5i "\fIreturn\fP" "answer" -L7: arrow down 1i "request " rjust "completed " rjust -L8: line left 1i -arrow left 1.5i "\fIreturn\fP" "reply" -L9: arrow down 1i "program " rjust "continues " rjust -line dashed down from L2 to L9 -line dashed down from L4 to L7 -line dashed up 1i from L3 "service " rjust "daemon " rjust -arrow dashed down 1i from L8 -move right 1i from L3 -box invis "Machine B" -move left 1.2i from L2; move down -box invis "Machine A" -.PE -.KE -.KS -.NH 1 -\&Higher Layers of RPC -.NH 2 -\&Highest Layer -.IX "highest layer of RPC" -.IX RPC "highest layer" -.LP -Imagine you're writing a program that needs to know -how many users are logged into a remote machine. -You can do this by calling the RPC library routine -.I rnusers() -as illustrated below: -.ie t .DS -.el .DS L -.ft CW -#include - -main(argc, argv) - int argc; - char **argv; -{ - int num; - - if (argc != 2) { - fprintf(stderr, "usage: rnusers hostname\en"); - exit(1); - } - if ((num = rnusers(argv[1])) < 0) { - fprintf(stderr, "error: rnusers\en"); - exit(-1); - } - printf("%d users on %s\en", num, argv[1]); - exit(0); -} -.DE -.KE -RPC library routines such as -.I rnusers() -are in the RPC services library -.I librpcsvc.a -Thus, the program above should be compiled with -.DS -.ft CW -% cc \fIprogram.c -lrpcsvc\fP -.DE -.I rnusers (), -like the other RPC library routines, is documented in section 3R -of the -.I "System Interface Manual for the Sun Workstation" , -the same section which documents the standard Sun RPC services. -.IX "RPC Services" -See the -.I intro(3R) -manual page for an explanation of the documentation strategy -for these services and their RPC protocols. -.LP -Here are some of the RPC service library routines available to the -C programmer: -.LP -\fBTable 3-3\fI RPC Service Library Routines\fR -.TS -box tab (&) ; -cfI cfI -lfL l . -Routine&Description -_ -.sp .5 -rnusers&Return number of users on remote machine -rusers&Return information about users on remote machine -havedisk&Determine if remote machine has disk -rstats&Get performance data from remote kernel -rwall&Write to specified remote machines -yppasswd&Update user password in Yellow Pages -.TE -.LP -Other RPC services \(em for example -.I ether() -.I mount -.I rquota() -and -.I spray -\(em are not available to the C programmer as library routines. -They do, however, -have RPC program numbers so they can be invoked with -.I callrpc() -which will be discussed in the next section. Most of them also -have compilable -.I rpcgen(1) -protocol description files. (The -.I rpcgen -protocol compiler radically simplifies the process of developing -network applications. -See the \fBrpcgen\fI Programming Guide\fR -for detailed information about -.I rpcgen -and -.I rpcgen -protocol description files). -.KS -.NH 2 -\&Intermediate Layer -.IX "intermediate layer of RPC" -.IX "RPC" "intermediate layer" -.LP -The simplest interface, which explicitly makes RPC calls, uses the -functions -.I callrpc() -and -.I registerrpc() -Using this method, the number of remote users can be gotten as follows: -.ie t .DS -.el .DS L -#include -#include -#include -#include - -main(argc, argv) - int argc; - char **argv; -{ - unsigned long nusers; - int stat; - - if (argc != 2) { - fprintf(stderr, "usage: nusers hostname\en"); - exit(-1); - } - if (stat = callrpc(argv[1], - RUSERSPROG, RUSERSVERS, RUSERSPROC_NUM, - xdr_void, 0, xdr_u_long, &nusers) != 0) { - clnt_perrno(stat); - exit(1); - } - printf("%d users on %s\en", nusers, argv[1]); - exit(0); -} -.DE -.KE -Each RPC procedure is uniquely defined by a program number, -version number, and procedure number. The program number -specifies a group of related remote procedures, each of -which has a different procedure number. Each program also -has a version number, so when a minor change is made to a -remote service (adding a new procedure, for example), a new -program number doesn't have to be assigned. When you want -to call a procedure to find the number of remote users, you -look up the appropriate program, version and procedure numbers -in a manual, just as you look up the name of a memory allocator -when you want to allocate memory. -.LP -The simplest way of making remote procedure calls is with the the RPC -library routine -.I callrpc() -It has eight parameters. The first is the name of the remote server -machine. The next three parameters are the program, version, and procedure -numbers\(emtogether they identify the procedure to be called. -The fifth and sixth parameters are an XDR filter and an argument to -be encoded and passed to the remote procedure. -The final two parameters are a filter for decoding the results -returned by the remote procedure and a pointer to the place where -the procedure's results are to be stored. Multiple arguments and -results are handled by embedding them in structures. If -.I callrpc() -completes successfully, it returns zero; else it returns a nonzero -value. The return codes (of type -.IX "enum clnt_stat (in RPC programming)" "" "\fIenum clnt_stat\fP (in RPC programming)" -cast into an integer) are found in -.I . -.LP -Since data types may be represented differently on different machines, -.I callrpc() -needs both the type of the RPC argument, as well as -a pointer to the argument itself (and similarly for the result). For -.I RUSERSPROC_NUM , -the return value is an -.I "unsigned long" -so -.I callrpc() -has -.I xdr_u_long() -as its first return parameter, which says -that the result is of type -.I "unsigned long" -and -.I &nusers -as its second return parameter, -which is a pointer to where the long result will be placed. Since -.I RUSERSPROC_NUM -takes no argument, the argument parameter of -.I callrpc() -is -.I xdr_void (). -.LP -After trying several times to deliver a message, if -.I callrpc() -gets no answer, it returns with an error code. -The delivery mechanism is UDP, -which stands for User Datagram Protocol. -Methods for adjusting the number of retries -or for using a different protocol require you to use the lower -layer of the RPC library, discussed later in this document. -The remote server procedure -corresponding to the above might look like this: -.ie t .DS -.el .DS L -.ft CW -.ft CW -char * -nuser(indata) - char *indata; -{ - unsigned long nusers; - -.ft I - /* - * Code here to compute the number of users - * and place result in variable \fInusers\fP. - */ -.ft CW - return((char *)&nusers); -} -.DE -.LP -It takes one argument, which is a pointer to the input -of the remote procedure call (ignored in our example), -and it returns a pointer to the result. -In the current version of C, -character pointers are the generic pointers, -so both the input argument and the return value are cast to -.I "char *" . -.LP -Normally, a server registers all of the RPC calls it plans -to handle, and then goes into an infinite loop waiting to service requests. -In this example, there is only a single procedure -to register, so the main body of the server would look like this: -.ie t .DS -.el .DS L -.ft CW -#include -#include -#include -#include - -char *nuser(); - -main() -{ - registerrpc(RUSERSPROG, RUSERSVERS, RUSERSPROC_NUM, - nuser, xdr_void, xdr_u_long); - svc_run(); /* \fINever returns\fP */ - fprintf(stderr, "Error: svc_run returned!\en"); - exit(1); -} -.DE -.LP -The -.I registerrpc() -routine registers a C procedure as corresponding to a -given RPC procedure number. The first three parameters, -.I RUSERPROG , -.I RUSERSVERS , -and -.I RUSERSPROC_NUM -are the program, version, and procedure numbers -of the remote procedure to be registered; -.I nuser() -is the name of the local procedure that implements the remote -procedure; and -.I xdr_void() -and -.I xdr_u_long() -are the XDR filters for the remote procedure's arguments and -results, respectively. (Multiple arguments or multiple results -are passed as structures). -.LP -Only the UDP transport mechanism can use -.I registerrpc() -thus, it is always safe in conjunction with calls generated by -.I callrpc() . -.SH -.IX "UDP 8K warning" -Warning: the UDP transport mechanism can only deal with -arguments and results less than 8K bytes in length. -.LP -.LP -After registering the local procedure, the server program's -main procedure calls -.I svc_run (), -the RPC library's remote procedure dispatcher. It is this -function that calls the remote procedures in response to RPC -call messages. Note that the dispatcher takes care of decoding -remote procedure arguments and encoding results, using the XDR -filters specified when the remote procedure was registered. -.NH 2 -\&Assigning Program Numbers -.IX "program number assignment" -.IX "assigning program numbers" -.LP -Program numbers are assigned in groups of -.I 0x20000000 -according to the following chart: -.DS -.ft CW - 0x0 - 0x1fffffff \fRDefined by Sun\fP -0x20000000 - 0x3fffffff \fRDefined by user\fP -0x40000000 - 0x5fffffff \fRTransient\fP -0x60000000 - 0x7fffffff \fRReserved\fP -0x80000000 - 0x9fffffff \fRReserved\fP -0xa0000000 - 0xbfffffff \fRReserved\fP -0xc0000000 - 0xdfffffff \fRReserved\fP -0xe0000000 - 0xffffffff \fRReserved\fP -.ft R -.DE -Sun Microsystems administers the first group of numbers, which -should be identical for all Sun customers. If a customer -develops an application that might be of general interest, that -application should be given an assigned number in the first -range. The second group of numbers is reserved for specific -customer applications. This range is intended primarily for -debugging new programs. The third group is reserved for -applications that generate program numbers dynamically. The -final groups are reserved for future use, and should not be -used. -.LP -To register a protocol specification, send a request by network -mail to -.I rpc@sun -or write to: -.DS -RPC Administrator -Sun Microsystems -2550 Garcia Ave. -Mountain View, CA 94043 -.DE -Please include a compilable -.I rpcgen -\*Q.x\*U file describing your protocol. -You will be given a unique program number in return. -.IX RPC administration -.IX administration "of RPC" -.LP -The RPC program numbers and protocol specifications -of standard Sun RPC services can be -found in the include files in -.I "/usr/include/rpcsvc" . -These services, however, constitute only a small subset -of those which have been registered. The complete list of -registered programs, as of the time when this manual was -printed, is: -.LP -\fBTable 3-2\fI RPC Registered Programs\fR -.TS H -box tab (&) ; -lfBI lfBI lfBI -lfL lfL lfI . -RPC Number&Program&Description -_ -.TH -.sp .5 -100000&PMAPPROG&portmapper -100001&RSTATPROG&remote stats -100002&RUSERSPROG&remote users -100003&NFSPROG&nfs -100004&YPPROG&Yellow Pages -100005&MOUNTPROG&mount daemon -100006&DBXPROG&remote dbx -100007&YPBINDPROG&yp binder -100008&WALLPROG&shutdown msg -100009&YPPASSWDPROG&yppasswd server -100010ÐERSTATPROGðer stats -100011&RQUOTAPROG&disk quotas -100012&SPRAYPROG&spray packets -100013&IBM3270PROG&3270 mapper -100014&IBMRJEPROG&RJE mapper -100015&SELNSVCPROG&selection service -100016&RDATABASEPROG&remote database access -100017&REXECPROG&remote execution -100018&ALICEPROG&Alice Office Automation -100019&SCHEDPROG&scheduling service -100020&LOCKPROG&local lock manager -100021&NETLOCKPROG&network lock manager -100022&X25PROG&x.25 inr protocol -100023&STATMON1PROG&status monitor 1 -100024&STATMON2PROG&status monitor 2 -100025&SELNLIBPROG&selection library -100026&BOOTPARAMPROG&boot parameters service -100027&MAZEPROG&mazewars game -100028&YPUPDATEPROG&yp update -100029&KEYSERVEPROG&key server -100030&SECURECMDPROG&secure login -100031&NETFWDIPROG&nfs net forwarder init -100032&NETFWDTPROG&nfs net forwarder trans -100033&SUNLINKMAP_PROG&sunlink MAP -100034&NETMONPROG&network monitor -100035&DBASEPROG&lightweight database -100036&PWDAUTHPROG&password authorization -100037&TFSPROG&translucent file svc -100038&NSEPROG&nse server -100039&NSE_ACTIVATE_PROG&nse activate daemon -.sp .2i -150001&PCNFSDPROG&pc passwd authorization -.sp .2i -200000&PYRAMIDLOCKINGPROG&Pyramid-locking -200001&PYRAMIDSYS5&Pyramid-sys5 -200002&CADDS_IMAGE&CV cadds_image -.sp .2i -300001&ADT_RFLOCKPROG&ADT file locking -.TE -.NH 2 -\&Passing Arbitrary Data Types -.IX "arbitrary data types" -.LP -In the previous example, the RPC call passes a single -.I "unsigned long" -RPC can handle arbitrary data structures, regardless of -different machines' byte orders or structure layout conventions, -by always converting them to a network standard called -.I "External Data Representation" -(XDR) before -sending them over the wire. -The process of converting from a particular machine representation -to XDR format is called -.I serializing , -and the reverse process is called -.I deserializing . -The type field parameters of -.I callrpc() -and -.I registerrpc() -can be a built-in procedure like -.I xdr_u_long() -in the previous example, or a user supplied one. -XDR has these built-in type routines: -.IX RPC "built-in routines" -.DS -.ft CW -xdr_int() xdr_u_int() xdr_enum() -xdr_long() xdr_u_long() xdr_bool() -xdr_short() xdr_u_short() xdr_wrapstring() -xdr_char() xdr_u_char() -.DE -Note that the routine -.I xdr_string() -exists, but cannot be used with -.I callrpc() -and -.I registerrpc (), -which only pass two parameters to their XDR routines. -.I xdr_wrapstring() -has only two parameters, and is thus OK. It calls -.I xdr_string (). -.LP -As an example of a user-defined type routine, -if you wanted to send the structure -.DS -.ft CW -struct simple { - int a; - short b; -} simple; -.DE -then you would call -.I callrpc() -as -.DS -.ft CW -callrpc(hostname, PROGNUM, VERSNUM, PROCNUM, - xdr_simple, &simple ...); -.DE -where -.I xdr_simple() -is written as: -.ie t .DS -.el .DS L -.ft CW -#include - -xdr_simple(xdrsp, simplep) - XDR *xdrsp; - struct simple *simplep; -{ - if (!xdr_int(xdrsp, &simplep->a)) - return (0); - if (!xdr_short(xdrsp, &simplep->b)) - return (0); - return (1); -} -.DE -.LP -An XDR routine returns nonzero (true in the sense of C) if it -completes successfully, and zero otherwise. -A complete description of XDR is in the -.I "XDR Protocol Specification" -section of this manual, only few implementation examples are -given here. -.LP -In addition to the built-in primitives, -there are also the prefabricated building blocks: -.DS -.ft CW -xdr_array() xdr_bytes() xdr_reference() -xdr_vector() xdr_union() xdr_pointer() -xdr_string() xdr_opaque() -.DE -To send a variable array of integers, -you might package them up as a structure like this -.DS -.ft CW -struct varintarr { - int *data; - int arrlnth; -} arr; -.DE -and make an RPC call such as -.DS -.ft CW -callrpc(hostname, PROGNUM, VERSNUM, PROCNUM, - xdr_varintarr, &arr...); -.DE -with -.I xdr_varintarr() -defined as: -.ie t .DS -.el .DS L -.ft CW -xdr_varintarr(xdrsp, arrp) - XDR *xdrsp; - struct varintarr *arrp; -{ - return (xdr_array(xdrsp, &arrp->data, &arrp->arrlnth, - MAXLEN, sizeof(int), xdr_int)); -} -.DE -This routine takes as parameters the XDR handle, -a pointer to the array, a pointer to the size of the array, -the maximum allowable array size, -the size of each array element, -and an XDR routine for handling each array element. -.KS -.LP -If the size of the array is known in advance, one can use -.I xdr_vector (), -which serializes fixed-length arrays. -.ie t .DS -.el .DS L -.ft CW -int intarr[SIZE]; - -xdr_intarr(xdrsp, intarr) - XDR *xdrsp; - int intarr[]; -{ - int i; - - return (xdr_vector(xdrsp, intarr, SIZE, sizeof(int), - xdr_int)); -} -.DE -.KE -.LP -XDR always converts quantities to 4-byte multiples when serializing. -Thus, if either of the examples above involved characters -instead of integers, each character would occupy 32 bits. -That is the reason for the XDR routine -.I xdr_bytes() -which is like -.I xdr_array() -except that it packs characters; -.I xdr_bytes() -has four parameters, similar to the first four parameters of -.I xdr_array (). -For null-terminated strings, there is also the -.I xdr_string() -routine, which is the same as -.I xdr_bytes() -without the length parameter. -On serializing it gets the string length from -.I strlen (), -and on deserializing it creates a null-terminated string. -.LP -Here is a final example that calls the previously written -.I xdr_simple() -as well as the built-in functions -.I xdr_string() -and -.I xdr_reference (), -which chases pointers: -.ie t .DS -.el .DS L -.ft CW -struct finalexample { - char *string; - struct simple *simplep; -} finalexample; - -xdr_finalexample(xdrsp, finalp) - XDR *xdrsp; - struct finalexample *finalp; -{ - - if (!xdr_string(xdrsp, &finalp->string, MAXSTRLEN)) - return (0); - if (!xdr_reference(xdrsp, &finalp->simplep, - sizeof(struct simple), xdr_simple); - return (0); - return (1); -} -.DE -Note that we could as easily call -.I xdr_simple() -here instead of -.I xdr_reference (). -.NH 1 -\&Lowest Layer of RPC -.IX "lowest layer of RPC" -.IX "RPC" "lowest layer" -.LP -In the examples given so far, -RPC takes care of many details automatically for you. -In this section, we'll show you how you can change the defaults -by using lower layers of the RPC library. -It is assumed that you are familiar with sockets -and the system calls for dealing with them. -.LP -There are several occasions when you may need to use lower layers of -RPC. First, you may need to use TCP, since the higher layer uses UDP, -which restricts RPC calls to 8K bytes of data. Using TCP permits calls -to send long streams of data. -For an example, see the -.I TCP -section below. Second, you may want to allocate and free memory -while serializing or deserializing with XDR routines. -There is no call at the higher level to let -you free memory explicitly. -For more explanation, see the -.I "Memory Allocation with XDR" -section below. -Third, you may need to perform authentication -on either the client or server side, by supplying -credentials or verifying them. -See the explanation in the -.I Authentication -section below. -.NH 2 -\&More on the Server Side -.IX RPC "server side" -.LP -The server for the -.I nusers() -program shown below does the same thing as the one using -.I registerrpc() -above, but is written using a lower layer of the RPC package: -.ie t .DS -.el .DS L -.ft CW -#include -#include -#include -#include - -main() -{ - SVCXPRT *transp; - int nuser(); - - transp = svcudp_create(RPC_ANYSOCK); - if (transp == NULL){ - fprintf(stderr, "can't create an RPC server\en"); - exit(1); - } - pmap_unset(RUSERSPROG, RUSERSVERS); - if (!svc_register(transp, RUSERSPROG, RUSERSVERS, - nuser, IPPROTO_UDP)) { - fprintf(stderr, "can't register RUSER service\en"); - exit(1); - } - svc_run(); /* \fINever returns\fP */ - fprintf(stderr, "should never reach this point\en"); -} - -nuser(rqstp, transp) - struct svc_req *rqstp; - SVCXPRT *transp; -{ - unsigned long nusers; - - switch (rqstp->rq_proc) { - case NULLPROC: - if (!svc_sendreply(transp, xdr_void, 0)) - fprintf(stderr, "can't reply to RPC call\en"); - return; - case RUSERSPROC_NUM: -.ft I - /* - * Code here to compute the number of users - * and assign it to the variable \fInusers\fP - */ -.ft CW - if (!svc_sendreply(transp, xdr_u_long, &nusers)) - fprintf(stderr, "can't reply to RPC call\en"); - return; - default: - svcerr_noproc(transp); - return; - } -} -.DE -.LP -First, the server gets a transport handle, which is used -for receiving and replying to RPC messages. -.I registerrpc() -uses -.I svcudp_create() -to get a UDP handle. -If you require a more reliable protocol, call -.I svctcp_create() -instead. -If the argument to -.I svcudp_create() -is -.I RPC_ANYSOCK -the RPC library creates a socket -on which to receive and reply to RPC calls. Otherwise, -.I svcudp_create() -expects its argument to be a valid socket number. -If you specify your own socket, it can be bound or unbound. -If it is bound to a port by the user, the port numbers of -.I svcudp_create() -and -.I clnttcp_create() -(the low-level client routine) must match. -.LP -If the user specifies the -.I RPC_ANYSOCK -argument, the RPC library routines will open sockets. -Otherwise they will expect the user to do so. The routines -.I svcudp_create() -and -.I clntudp_create() -will cause the RPC library routines to -.I bind() -their socket if it is not bound already. -.LP -A service may choose to register its port number with the -local portmapper service. This is done is done by specifying -a non-zero protocol number in -.I svc_register (). -Incidently, a client can discover the server's port number by -consulting the portmapper on their server's machine. This can -be done automatically by specifying a zero port number in -.I clntudp_create() -or -.I clnttcp_create (). -.LP -After creating an -.I SVCXPRT , -the next step is to call -.I pmap_unset() -so that if the -.I nusers() -server crashed earlier, -any previous trace of it is erased before restarting. -More precisely, -.I pmap_unset() -erases the entry for -.I RUSERSPROG -from the port mapper's tables. -.LP -Finally, we associate the program number for -.I nusers() -with the procedure -.I nuser (). -The final argument to -.I svc_register() -is normally the protocol being used, -which, in this case, is -.I IPPROTO_UDP -Notice that unlike -.I registerrpc (), -there are no XDR routines involved -in the registration process. -Also, registration is done on the program, -rather than procedure, level. -.LP -The user routine -.I nuser() -must call and dispatch the appropriate XDR routines -based on the procedure number. -Note that -two things are handled by -.I nuser() -that -.I registerrpc() -handles automatically. -The first is that procedure -.I NULLPROC -(currently zero) returns with no results. -This can be used as a simple test -for detecting if a remote program is running. -Second, there is a check for invalid procedure numbers. -If one is detected, -.I svcerr_noproc() -is called to handle the error. -.KS -.LP -The user service routine serializes the results and returns -them to the RPC caller via -.I svc_sendreply() -Its first parameter is the -.I SVCXPRT -handle, the second is the XDR routine, -and the third is a pointer to the data to be returned. -Not illustrated above is how a server -handles an RPC program that receives data. -As an example, we can add a procedure -.I RUSERSPROC_BOOL -which has an argument -.I nusers (), -and returns -.I TRUE -or -.I FALSE -depending on whether there are nusers logged on. -It would look like this: -.ie t .DS -.el .DS L -.ft CW -case RUSERSPROC_BOOL: { - int bool; - unsigned nuserquery; - - if (!svc_getargs(transp, xdr_u_int, &nuserquery) { - svcerr_decode(transp); - return; - } -.ft I - /* - * Code to set \fInusers\fP = number of users - */ -.ft CW - if (nuserquery == nusers) - bool = TRUE; - else - bool = FALSE; - if (!svc_sendreply(transp, xdr_bool, &bool)) { - fprintf(stderr, "can't reply to RPC call\en"); - return (1); - } - return; -} -.DE -.KE -.LP -The relevant routine is -.I svc_getargs() -which takes an -.I SVCXPRT -handle, the XDR routine, -and a pointer to where the input is to be placed as arguments. -.NH 2 -\&Memory Allocation with XDR -.IX "memory allocation with XDR" -.IX XDR "memory allocation" -.LP -XDR routines not only do input and output, -they also do memory allocation. -This is why the second parameter of -.I xdr_array() -is a pointer to an array, rather than the array itself. -If it is -.I NULL , -then -.I xdr_array() -allocates space for the array and returns a pointer to it, -putting the size of the array in the third argument. -As an example, consider the following XDR routine -.I xdr_chararr1() -which deals with a fixed array of bytes with length -.I SIZE . -.ie t .DS -.el .DS L -.ft CW -xdr_chararr1(xdrsp, chararr) - XDR *xdrsp; - char chararr[]; -{ - char *p; - int len; - - p = chararr; - len = SIZE; - return (xdr_bytes(xdrsp, &p, &len, SIZE)); -} -.DE -If space has already been allocated in -.I chararr , -it can be called from a server like this: -.ie t .DS -.el .DS L -.ft CW -char chararr[SIZE]; - -svc_getargs(transp, xdr_chararr1, chararr); -.DE -If you want XDR to do the allocation, -you would have to rewrite this routine in the following way: -.ie t .DS -.el .DS L -.ft CW -xdr_chararr2(xdrsp, chararrp) - XDR *xdrsp; - char **chararrp; -{ - int len; - - len = SIZE; - return (xdr_bytes(xdrsp, charrarrp, &len, SIZE)); -} -.DE -Then the RPC call might look like this: -.ie t .DS -.el .DS L -.ft CW -char *arrptr; - -arrptr = NULL; -svc_getargs(transp, xdr_chararr2, &arrptr); -.ft I -/* - * Use the result here - */ -.ft CW -svc_freeargs(transp, xdr_chararr2, &arrptr); -.DE -Note that, after being used, the character array can be freed with -.I svc_freeargs() -.I svc_freeargs() -will not attempt to free any memory if the variable indicating it -is NULL. For example, in the the routine -.I xdr_finalexample (), -given earlier, if -.I finalp->string -was NULL, then it would not be freed. The same is true for -.I finalp->simplep . -.LP -To summarize, each XDR routine is responsible -for serializing, deserializing, and freeing memory. -When an XDR routine is called from -.I callrpc() -the serializing part is used. -When called from -.I svc_getargs() -the deserializer is used. -And when called from -.I svc_freeargs() -the memory deallocator is used. When building simple examples like those -in this section, a user doesn't have to worry -about the three modes. -See the -.I "External Data Representation: Sun Technical Notes" -for examples of more sophisticated XDR routines that determine -which of the three modes they are in and adjust their behavior accordingly. -.KS -.NH 2 -\&The Calling Side -.IX RPC "calling side" -.LP -When you use -.I callrpc() -you have no control over the RPC delivery -mechanism or the socket used to transport the data. -To illustrate the layer of RPC that lets you adjust these -parameters, consider the following code to call the -.I nusers -service: -.ie t .DS -.el .DS L -.ft CW -.vs 11 -#include -#include -#include -#include -#include -#include -#include - -main(argc, argv) - int argc; - char **argv; -{ - struct hostent *hp; - struct timeval pertry_timeout, total_timeout; - struct sockaddr_in server_addr; - int sock = RPC_ANYSOCK; - register CLIENT *client; - enum clnt_stat clnt_stat; - unsigned long nusers; - - if (argc != 2) { - fprintf(stderr, "usage: nusers hostname\en"); - exit(-1); - } - if ((hp = gethostbyname(argv[1])) == NULL) { - fprintf(stderr, "can't get addr for %s\en",argv[1]); - exit(-1); - } - pertry_timeout.tv_sec = 3; - pertry_timeout.tv_usec = 0; - bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, - hp->h_length); - server_addr.sin_family = AF_INET; - server_addr.sin_port = 0; - if ((client = clntudp_create(&server_addr, RUSERSPROG, - RUSERSVERS, pertry_timeout, &sock)) == NULL) { - clnt_pcreateerror("clntudp_create"); - exit(-1); - } - total_timeout.tv_sec = 20; - total_timeout.tv_usec = 0; - clnt_stat = clnt_call(client, RUSERSPROC_NUM, xdr_void, - 0, xdr_u_long, &nusers, total_timeout); - if (clnt_stat != RPC_SUCCESS) { - clnt_perror(client, "rpc"); - exit(-1); - } - clnt_destroy(client); - close(sock); - exit(0); -} -.vs -.DE -.KE -The low-level version of -.I callrpc() -is -.I clnt_call() -which takes a -.I CLIENT -pointer rather than a host name. The parameters to -.I clnt_call() -are a -.I CLIENT -pointer, the procedure number, -the XDR routine for serializing the argument, -a pointer to the argument, -the XDR routine for deserializing the return value, -a pointer to where the return value will be placed, -and the time in seconds to wait for a reply. -.LP -The -.I CLIENT -pointer is encoded with the transport mechanism. -.I callrpc() -uses UDP, thus it calls -.I clntudp_create() -to get a -.I CLIENT -pointer. To get TCP (Transmission Control Protocol), you would use -.I clnttcp_create() . -.LP -The parameters to -.I clntudp_create() -are the server address, the program number, the version number, -a timeout value (between tries), and a pointer to a socket. -The final argument to -.I clnt_call() -is the total time to wait for a response. -Thus, the number of tries is the -.I clnt_call() -timeout divided by the -.I clntudp_create() -timeout. -.LP -Note that the -.I clnt_destroy() -call -always deallocates the space associated with the -.I CLIENT -handle. It closes the socket associated with the -.I CLIENT -handle, however, only if the RPC library opened it. It the -socket was opened by the user, it stays open. This makes it -possible, in cases where there are multiple client handles -using the same socket, to destroy one handle without closing -the socket that other handles are using. -.LP -To make a stream connection, the call to -.I clntudp_create() -is replaced with a call to -.I clnttcp_create() . -.DS -.ft CW -clnttcp_create(&server_addr, prognum, versnum, &sock, - inputsize, outputsize); -.DE -There is no timeout argument; instead, the receive and send buffer -sizes must be specified. When the -.I clnttcp_create() -call is made, a TCP connection is established. -All RPC calls using that -.I CLIENT -handle would use this connection. -The server side of an RPC call using TCP has -.I svcudp_create() -replaced by -.I svctcp_create() . -.DS -.ft CW -transp = svctcp_create(RPC_ANYSOCK, 0, 0); -.DE -The last two arguments to -.I svctcp_create() -are send and receive sizes respectively. If `0' is specified for -either of these, the system chooses a reasonable default. -.KS -.NH 1 -\&Other RPC Features -.IX "RPC" "miscellaneous features" -.IX "miscellaneous RPC features" -.LP -This section discusses some other aspects of RPC -that are occasionally useful. -.NH 2 -\&Select on the Server Side -.IX RPC select() RPC \fIselect()\fP -.IX select() "" \fIselect()\fP "on the server side" -.LP -Suppose a process is processing RPC requests -while performing some other activity. -If the other activity involves periodically updating a data structure, -the process can set an alarm signal before calling -.I svc_run() -But if the other activity -involves waiting on a file descriptor, the -.I svc_run() -call won't work. -The code for -.I svc_run() -is as follows: -.ie t .DS -.el .DS L -.ft CW -.vs 11 -void -svc_run() -{ - fd_set readfds; - int dtbsz = getdtablesize(); - - for (;;) { - readfds = svc_fds; - switch (select(dtbsz, &readfds, NULL,NULL,NULL)) { - - case -1: - if (errno == EINTR) - continue; - perror("select"); - return; - case 0: - break; - default: - svc_getreqset(&readfds); - } - } -} -.vs -.DE -.KE -.LP -You can bypass -.I svc_run() -and call -.I svc_getreqset() -yourself. -All you need to know are the file descriptors -of the socket(s) associated with the programs you are waiting on. -Thus you can have your own -.I select() -.IX select() "" \fIselect()\fP -that waits on both the RPC socket, -and your own descriptors. Note that -.I svc_fds() -is a bit mask of all the file descriptors that RPC is using for -services. It can change everytime that -.I any -RPC library routine is called, because descriptors are constantly -being opened and closed, for example for TCP connections. -.NH 2 -\&Broadcast RPC -.IX "broadcast RPC" -.IX RPC "broadcast" -.LP -The -.I portmapper -is a daemon that converts RPC program numbers -into DARPA protocol port numbers; see the -.I portmap -man page. You can't do broadcast RPC without the portmapper. -Here are the main differences between -broadcast RPC and normal RPC calls: -.IP 1. -Normal RPC expects one answer, whereas -broadcast RPC expects many answers -(one or more answer from each responding machine). -.IP 2. -Broadcast RPC can only be supported by packet-oriented (connectionless) -transport protocols like UPD/IP. -.IP 3. -The implementation of broadcast RPC -treats all unsuccessful responses as garbage by filtering them out. -Thus, if there is a version mismatch between the -broadcaster and a remote service, -the user of broadcast RPC never knows. -.IP 4. -All broadcast messages are sent to the portmap port. -Thus, only services that register themselves with their portmapper -are accessible via the broadcast RPC mechanism. -.IP 5. -Broadcast requests are limited in size to the MTU (Maximum Transfer -Unit) of the local network. For Ethernet, the MTU is 1500 bytes. -.KS -.NH 3 -\&Broadcast RPC Synopsis -.IX "broadcast RPC" synopsis -.IX "RPC" "broadcast synopsis" -.ie t .DS -.el .DS L -.ft CW -#include - . . . -enum clnt_stat clnt_stat; - . . . -clnt_stat = clnt_broadcast(prognum, versnum, procnum, - inproc, in, outproc, out, eachresult) - u_long prognum; /* \fIprogram number\fP */ - u_long versnum; /* \fIversion number\fP */ - u_long procnum; /* \fIprocedure number\fP */ - xdrproc_t inproc; /* \fIxdr routine for args\fP */ - caddr_t in; /* \fIpointer to args\fP */ - xdrproc_t outproc; /* \fIxdr routine for results\fP */ - caddr_t out; /* \fIpointer to results\fP */ - bool_t (*eachresult)();/* \fIcall with each result gotten\fP */ -.DE -.KE -The procedure -.I eachresult() -is called each time a valid result is obtained. -It returns a boolean that indicates -whether or not the user wants more responses. -.ie t .DS -.el .DS L -.ft CW -bool_t done; - . . . -done = eachresult(resultsp, raddr) - caddr_t resultsp; - struct sockaddr_in *raddr; /* \fIAddr of responding machine\fP */ -.DE -If -.I done -is -.I TRUE , -then broadcasting stops and -.I clnt_broadcast() -returns successfully. -Otherwise, the routine waits for another response. -The request is rebroadcast -after a few seconds of waiting. -If no responses come back, -the routine returns with -.I RPC_TIMEDOUT . -.NH 2 -\&Batching -.IX "batching" -.IX RPC "batching" -.LP -The RPC architecture is designed so that clients send a call message, -and wait for servers to reply that the call succeeded. -This implies that clients do not compute -while servers are processing a call. -This is inefficient if the client does not want or need -an acknowledgement for every message sent. -It is possible for clients to continue computing -while waiting for a response, -using RPC batch facilities. -.LP -RPC messages can be placed in a \*Qpipeline\*U of calls -to a desired server; this is called batching. -Batching assumes that: -1) each RPC call in the pipeline requires no response from the server, -and the server does not send a response message; and -2) the pipeline of calls is transported on a reliable -byte stream transport such as TCP/IP. -Since the server does not respond to every call, -the client can generate new calls in parallel -with the server executing previous calls. -Furthermore, the TCP/IP implementation can buffer up -many call messages, and send them to the server in one -.I write() -system call. This overlapped execution -greatly decreases the interprocess communication overhead of -the client and server processes, -and the total elapsed time of a series of calls. -.LP -Since the batched calls are buffered, -the client should eventually do a nonbatched call -in order to flush the pipeline. -.LP -A contrived example of batching follows. -Assume a string rendering service (like a window system) -has two similar calls: one renders a string and returns void results, -while the other renders a string and remains silent. -The service (using the TCP/IP transport) may look like: -.ie t .DS -.el .DS L -.ft CW -#include -#include -#include - -void windowdispatch(); - -main() -{ - SVCXPRT *transp; - - transp = svctcp_create(RPC_ANYSOCK, 0, 0); - if (transp == NULL){ - fprintf(stderr, "can't create an RPC server\en"); - exit(1); - } - pmap_unset(WINDOWPROG, WINDOWVERS); - if (!svc_register(transp, WINDOWPROG, WINDOWVERS, - windowdispatch, IPPROTO_TCP)) { - fprintf(stderr, "can't register WINDOW service\en"); - exit(1); - } - svc_run(); /* \fINever returns\fP */ - fprintf(stderr, "should never reach this point\en"); -} - -void -windowdispatch(rqstp, transp) - struct svc_req *rqstp; - SVCXPRT *transp; -{ - char *s = NULL; - - switch (rqstp->rq_proc) { - case NULLPROC: - if (!svc_sendreply(transp, xdr_void, 0)) - fprintf(stderr, "can't reply to RPC call\en"); - return; - case RENDERSTRING: - if (!svc_getargs(transp, xdr_wrapstring, &s)) { - fprintf(stderr, "can't decode arguments\en"); -.ft I - /* - * Tell caller he screwed up - */ -.ft CW - svcerr_decode(transp); - break; - } -.ft I - /* - * Code here to render the string \fIs\fP - */ -.ft CW - if (!svc_sendreply(transp, xdr_void, NULL)) - fprintf(stderr, "can't reply to RPC call\en"); - break; - case RENDERSTRING_BATCHED: - if (!svc_getargs(transp, xdr_wrapstring, &s)) { - fprintf(stderr, "can't decode arguments\en"); -.ft I - /* - * We are silent in the face of protocol errors - */ -.ft CW - break; - } -.ft I - /* - * Code here to render string s, but send no reply! - */ -.ft CW - break; - default: - svcerr_noproc(transp); - return; - } -.ft I - /* - * Now free string allocated while decoding arguments - */ -.ft CW - svc_freeargs(transp, xdr_wrapstring, &s); -} -.DE -Of course the service could have one procedure -that takes the string and a boolean -to indicate whether or not the procedure should respond. -.LP -In order for a client to take advantage of batching, -the client must perform RPC calls on a TCP-based transport -and the actual calls must have the following attributes: -1) the result's XDR routine must be zero -.I NULL ), -and 2) the RPC call's timeout must be zero. -.KS -.LP -Here is an example of a client that uses batching to render a -bunch of strings; the batching is flushed when the client gets -a null string (EOF): -.ie t .DS -.el .DS L -.ft CW -.vs 11 -#include -#include -#include -#include -#include -#include - -main(argc, argv) - int argc; - char **argv; -{ - struct hostent *hp; - struct timeval pertry_timeout, total_timeout; - struct sockaddr_in server_addr; - int sock = RPC_ANYSOCK; - register CLIENT *client; - enum clnt_stat clnt_stat; - char buf[1000], *s = buf; - - if ((client = clnttcp_create(&server_addr, - WINDOWPROG, WINDOWVERS, &sock, 0, 0)) == NULL) { - perror("clnttcp_create"); - exit(-1); - } - total_timeout.tv_sec = 0; - total_timeout.tv_usec = 0; - while (scanf("%s", s) != EOF) { - clnt_stat = clnt_call(client, RENDERSTRING_BATCHED, - xdr_wrapstring, &s, NULL, NULL, total_timeout); - if (clnt_stat != RPC_SUCCESS) { - clnt_perror(client, "batched rpc"); - exit(-1); - } - } - - /* \fINow flush the pipeline\fP */ - - total_timeout.tv_sec = 20; - clnt_stat = clnt_call(client, NULLPROC, xdr_void, NULL, - xdr_void, NULL, total_timeout); - if (clnt_stat != RPC_SUCCESS) { - clnt_perror(client, "rpc"); - exit(-1); - } - clnt_destroy(client); - exit(0); -} -.vs -.DE -.KE -Since the server sends no message, -the clients cannot be notified of any of the failures that may occur. -Therefore, clients are on their own when it comes to handling errors. -.LP -The above example was completed to render -all of the (2000) lines in the file -.I /etc/termcap . -The rendering service did nothing but throw the lines away. -The example was run in the following four configurations: -1) machine to itself, regular RPC; -2) machine to itself, batched RPC; -3) machine to another, regular RPC; and -4) machine to another, batched RPC. -The results are as follows: -1) 50 seconds; -2) 16 seconds; -3) 52 seconds; -4) 10 seconds. -Running -.I fscanf() -on -.I /etc/termcap -only requires six seconds. -These timings show the advantage of protocols -that allow for overlapped execution, -though these protocols are often hard to design. -.NH 2 -\&Authentication -.IX "authentication" -.IX "RPC" "authentication" -.LP -In the examples presented so far, -the caller never identified itself to the server, -and the server never required an ID from the caller. -Clearly, some network services, such as a network filesystem, -require stronger security than what has been presented so far. -.LP -In reality, every RPC call is authenticated by -the RPC package on the server, and similarly, -the RPC client package generates and sends authentication parameters. -Just as different transports (TCP/IP or UDP/IP) -can be used when creating RPC clients and servers, -different forms of authentication can be associated with RPC clients; -the default authentication type used as a default is type -.I none . -.LP -The authentication subsystem of the RPC package is open ended. -That is, numerous types of authentication are easy to support. -.NH 3 -\&UNIX Authentication -.IX "UNIX Authentication" -.IP "\fIThe Client Side\fP" -.LP -When a caller creates a new RPC client handle as in: -.DS -.ft CW -clnt = clntudp_create(address, prognum, versnum, - wait, sockp) -.DE -the appropriate transport instance defaults -the associate authentication handle to be -.DS -.ft CW -clnt->cl_auth = authnone_create(); -.DE -The RPC client can choose to use -.I UNIX -style authentication by setting -.I clnt\->cl_auth -after creating the RPC client handle: -.DS -.ft CW -clnt->cl_auth = authunix_create_default(); -.DE -This causes each RPC call associated with -.I clnt -to carry with it the following authentication credentials structure: -.ie t .DS -.el .DS L -.ft I -/* - * UNIX style credentials. - */ -.ft CW -struct authunix_parms { - u_long aup_time; /* \fIcredentials creation time\fP */ - char *aup_machname; /* \fIhost name where client is\fP */ - int aup_uid; /* \fIclient's UNIX effective uid\fP */ - int aup_gid; /* \fIclient's current group id\fP */ - u_int aup_len; /* \fIelement length of aup_gids\fP */ - int *aup_gids; /* \fIarray of groups user is in\fP */ -}; -.DE -These fields are set by -.I authunix_create_default() -by invoking the appropriate system calls. -Since the RPC user created this new style of authentication, -the user is responsible for destroying it with: -.DS -.ft CW -auth_destroy(clnt->cl_auth); -.DE -This should be done in all cases, to conserve memory. -.sp -.IP "\fIThe Server Side\fP" -.LP -Service implementors have a harder time dealing with authentication issues -since the RPC package passes the service dispatch routine a request -that has an arbitrary authentication style associated with it. -Consider the fields of a request handle passed to a service dispatch routine: -.ie t .DS -.el .DS L -.ft I -/* - * An RPC Service request - */ -.ft CW -struct svc_req { - u_long rq_prog; /* \fIservice program number\fP */ - u_long rq_vers; /* \fIservice protocol vers num\fP */ - u_long rq_proc; /* \fIdesired procedure number\fP */ - struct opaque_auth rq_cred; /* \fIraw credentials from wire\fP */ - caddr_t rq_clntcred; /* \fIcredentials (read only)\fP */ -}; -.DE -The -.I rq_cred -is mostly opaque, except for one field of interest: -the style or flavor of authentication credentials: -.ie t .DS -.el .DS L -.ft I -/* - * Authentication info. Mostly opaque to the programmer. - */ -.ft CW -struct opaque_auth { - enum_t oa_flavor; /* \fIstyle of credentials\fP */ - caddr_t oa_base; /* \fIaddress of more auth stuff\fP */ - u_int oa_length; /* \fInot to exceed \fIMAX_AUTH_BYTES */ -}; -.DE -.IX RPC guarantees -The RPC package guarantees the following -to the service dispatch routine: -.IP 1. -That the request's -.I rq_cred -is well formed. Thus the service implementor may inspect the request's -.I rq_cred.oa_flavor -to determine which style of authentication the caller used. -The service implementor may also wish to inspect the other fields of -.I rq_cred -if the style is not one of the styles supported by the RPC package. -.IP 2. -That the request's -.I rq_clntcred -field is either -.I NULL -or points to a well formed structure -that corresponds to a supported style of authentication credentials. -Remember that only -.I unix -style is currently supported, so (currently) -.I rq_clntcred -could be cast to a pointer to an -.I authunix_parms -structure. If -.I rq_clntcred -is -.I NULL , -the service implementor may wish to inspect the other (opaque) fields of -.I rq_cred -in case the service knows about a new type of authentication -that the RPC package does not know about. -.LP -Our remote users service example can be extended so that -it computes results for all users except UID 16: -.ie t .DS -.el .DS L -.ft CW -.vs 11 -nuser(rqstp, transp) - struct svc_req *rqstp; - SVCXPRT *transp; -{ - struct authunix_parms *unix_cred; - int uid; - unsigned long nusers; - -.ft I - /* - * we don't care about authentication for null proc - */ -.ft CW - if (rqstp->rq_proc == NULLPROC) { - if (!svc_sendreply(transp, xdr_void, 0)) { - fprintf(stderr, "can't reply to RPC call\en"); - return (1); - } - return; - } -.ft I - /* - * now get the uid - */ -.ft CW - switch (rqstp->rq_cred.oa_flavor) { - case AUTH_UNIX: - unix_cred = - (struct authunix_parms *)rqstp->rq_clntcred; - uid = unix_cred->aup_uid; - break; - case AUTH_NULL: - default: - svcerr_weakauth(transp); - return; - } - switch (rqstp->rq_proc) { - case RUSERSPROC_NUM: -.ft I - /* - * make sure caller is allowed to call this proc - */ -.ft CW - if (uid == 16) { - svcerr_systemerr(transp); - return; - } -.ft I - /* - * Code here to compute the number of users - * and assign it to the variable \fInusers\fP - */ -.ft CW - if (!svc_sendreply(transp, xdr_u_long, &nusers)) { - fprintf(stderr, "can't reply to RPC call\en"); - return (1); - } - return; - default: - svcerr_noproc(transp); - return; - } -} -.vs -.DE -A few things should be noted here. -First, it is customary not to check -the authentication parameters associated with the -.I NULLPROC -(procedure number zero). -Second, if the authentication parameter's type is not suitable -for your service, you should call -.I svcerr_weakauth() . -And finally, the service protocol itself should return status -for access denied; in the case of our example, the protocol -does not have such a status, so we call the service primitive -.I svcerr_systemerr() -instead. -.LP -The last point underscores the relation between -the RPC authentication package and the services; -RPC deals only with -.I authentication -and not with individual services' -.I "access control" . -The services themselves must implement their own access control policies -and reflect these policies as return statuses in their protocols. -.NH 2 -\&DES Authentication -.IX RPC DES -.IX RPC authentication -.LP -UNIX authentication is quite easy to defeat. Instead of using -.I authunix_create_default (), -one can call -.I authunix_create() -and then modify the RPC authentication handle it returns by filling in -whatever user ID and hostname they wish the server to think they have. -DES authentication is thus recommended for people who want more security -than UNIX authentication offers. -.LP -The details of the DES authentication protocol are complicated and -are not explained here. -See -.I "Remote Procedure Calls: Protocol Specification" -for the details. -.LP -In order for DES authentication to work, the -.I keyserv(8c) -daemon must be running on both the server and client machines. The -users on these machines need public keys assigned by the network -administrator in the -.I publickey(5) -database. And, they need to have decrypted their secret keys -using their login password. This automatically happens when one -logs in using -.I login(1) , -or can be done manually using -.I keylogin(1) . -The -.I "Network Services" -chapter -.\" XXX -explains more how to setup secure networking. -.sp -.IP "\fIClient Side\fP" -.LP -If a client wishes to use DES authentication, it must set its -authentication handle appropriately. Here is an example: -.DS -cl->cl_auth = - authdes_create(servername, 60, &server_addr, NULL); -.DE -The first argument is the network name or \*Qnetname\*U of the owner of -the server process. Typically, server processes are root processes -and their netname can be derived using the following call: -.DS -char servername[MAXNETNAMELEN]; - -host2netname(servername, rhostname, NULL); -.DE -Here, -.I rhostname -is the hostname of the machine the server process is running on. -.I host2netname() -fills in -.I servername -to contain this root process's netname. If the -server process was run by a regular user, one could use the call -.I user2netname() -instead. Here is an example for a server process with the same user -ID as the client: -.DS -char servername[MAXNETNAMELEN]; - -user2netname(servername, getuid(), NULL); -.DE -The last argument to both of these calls, -.I user2netname() -and -.I host2netname (), -is the name of the naming domain where the server is located. The -.I NULL -used here means \*Quse the local domain name.\*U -.LP -The second argument to -.I authdes_create() -is a lifetime for the credential. Here it is set to sixty -seconds. What that means is that the credential will expire 60 -seconds from now. If some mischievous user tries to reuse the -credential, the server RPC subsystem will recognize that it has -expired and not grant any requests. If the same mischievous user -tries to reuse the credential within the sixty second lifetime, -he will still be rejected because the server RPC subsystem -remembers which credentials it has already seen in the near past, -and will not grant requests to duplicates. -.LP -The third argument to -.I authdes_create() -is the address of the host to synchronize with. In order for DES -authentication to work, the server and client must agree upon the -time. Here we pass the address of the server itself, so the -client and server will both be using the same time: the server's -time. The argument can be -.I NULL , -which means \*Qdon't bother synchronizing.\*U You should only do this -if you are sure the client and server are already synchronized. -.LP -The final argument to -.I authdes_create() -is the address of a DES encryption key to use for encrypting -timestamps and data. If this argument is -.I NULL , -as it is in this example, a random key will be chosen. The client -may find out the encryption key being used by consulting the -.I ah_key -field of the authentication handle. -.sp -.IP "\fIServer Side\fP" -.LP -The server side is a lot simpler than the client side. Here is the -previous example rewritten to use -.I AUTH_DES -instead of -.I AUTH_UNIX : -.ie t .DS -.el .DS L -.ft CW -.vs 11 -#include -#include - . . . - . . . -nuser(rqstp, transp) - struct svc_req *rqstp; - SVCXPRT *transp; -{ - struct authdes_cred *des_cred; - int uid; - int gid; - int gidlen; - int gidlist[10]; -.ft I - /* - * we don't care about authentication for null proc - */ -.ft CW - - if (rqstp->rq_proc == NULLPROC) { - /* \fIsame as before\fP */ - } - -.ft I - /* - * now get the uid - */ -.ft CW - switch (rqstp->rq_cred.oa_flavor) { - case AUTH_DES: - des_cred = - (struct authdes_cred *) rqstp->rq_clntcred; - if (! netname2user(des_cred->adc_fullname.name, - &uid, &gid, &gidlen, gidlist)) - { - fprintf(stderr, "unknown user: %s\en", - des_cred->adc_fullname.name); - svcerr_systemerr(transp); - return; - } - break; - case AUTH_NULL: - default: - svcerr_weakauth(transp); - return; - } - -.ft I - /* - * The rest is the same as before - */ -.ft CW -.vs -.DE -Note the use of the routine -.I netname2user (), -the inverse of -.I user2netname (): -it takes a network ID and converts to a unix ID. -.I netname2user () -also supplies the group IDs which we don't use in this example, -but which may be useful to other UNIX programs. -.NH 2 -\&Using Inetd -.IX inetd "" "using \fIinetd\fP" -.LP -An RPC server can be started from -.I inetd -The only difference from the usual code is that the service -creation routine should be called in the following form: -.ie t .DS -.el .DS L -.ft CW -transp = svcudp_create(0); /* \fIFor UDP\fP */ -transp = svctcp_create(0,0,0); /* \fIFor listener TCP sockets\fP */ -transp = svcfd_create(0,0,0); /* \fIFor connected TCP sockets\fP */ -.DE -since -.I inet -passes a socket as file descriptor 0. -Also, -.I svc_register() -should be called as -.ie t .DS -.el .DS L -.ft CW -svc_register(transp, PROGNUM, VERSNUM, service, 0); -.DE -with the final flag as 0, -since the program would already be registered by -.I inetd -Remember that if you want to exit -from the server process and return control to -.I inet -you need to explicitly exit, since -.I svc_run() -never returns. -.LP -The format of entries in -.I /etc/inetd.conf -for RPC services is in one of the following two forms: -.ie t .DS -.el .DS L -.ft CW -p_name/version dgram rpc/udp wait/nowait user server args -p_name/version stream rpc/tcp wait/nowait user server args -.DE -where -.I p_name -is the symbolic name of the program as it appears in -.I rpc(5) , -.I server -is the program implementing the server, -and -.I program -and -.I version -are the program and version numbers of the service. -For more information, see -.I inetd.conf(5) . -.LP -If the same program handles multiple versions, -then the version number can be a range, -as in this example: -.ie t .DS -.el .DS L -.ft CW -rstatd/1-2 dgram rpc/udp wait root /usr/etc/rpc.rstatd -.DE -.NH 1 -\&More Examples -.sp 1 -.NH 2 -\&Versions -.IX "versions" -.IX "RPC" "versions" -.LP -By convention, the first version number of program -.I PROG -is -.I PROGVERS_ORIG -and the most recent version is -.I PROGVERS -Suppose there is a new version of the -.I user -program that returns an -.I "unsigned short" -rather than a -.I long . -If we name this version -.I RUSERSVERS_SHORT -then a server that wants to support both versions -would do a double register. -.ie t .DS -.el .DS L -.ft CW -if (!svc_register(transp, RUSERSPROG, RUSERSVERS_ORIG, - nuser, IPPROTO_TCP)) { - fprintf(stderr, "can't register RUSER service\en"); - exit(1); -} -if (!svc_register(transp, RUSERSPROG, RUSERSVERS_SHORT, - nuser, IPPROTO_TCP)) { - fprintf(stderr, "can't register RUSER service\en"); - exit(1); -} -.DE -Both versions can be handled by the same C procedure: -.ie t .DS -.el .DS L -.ft CW -.vs 11 -nuser(rqstp, transp) - struct svc_req *rqstp; - SVCXPRT *transp; -{ - unsigned long nusers; - unsigned short nusers2; - - switch (rqstp->rq_proc) { - case NULLPROC: - if (!svc_sendreply(transp, xdr_void, 0)) { - fprintf(stderr, "can't reply to RPC call\en"); - return (1); - } - return; - case RUSERSPROC_NUM: -.ft I - /* - * Code here to compute the number of users - * and assign it to the variable \fInusers\fP - */ -.ft CW - nusers2 = nusers; - switch (rqstp->rq_vers) { - case RUSERSVERS_ORIG: - if (!svc_sendreply(transp, xdr_u_long, - &nusers)) { - fprintf(stderr,"can't reply to RPC call\en"); - } - break; - case RUSERSVERS_SHORT: - if (!svc_sendreply(transp, xdr_u_short, - &nusers2)) { - fprintf(stderr,"can't reply to RPC call\en"); - } - break; - } - default: - svcerr_noproc(transp); - return; - } -} -.vs -.DE -.KS -.NH 2 -\&TCP -.IX "TCP" -.LP -Here is an example that is essentially -.I rcp. -The initiator of the RPC -.I snd -call takes its standard input and sends it to the server -.I rcv -which prints it on standard output. -The RPC call uses TCP. -This also illustrates an XDR procedure that behaves differently -on serialization than on deserialization. -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * The xdr routine: - * on decode, read from wire, write onto fp - * on encode, read from fp, write onto wire - */ -.ft CW -#include -#include - -xdr_rcp(xdrs, fp) - XDR *xdrs; - FILE *fp; -{ - unsigned long size; - char buf[BUFSIZ], *p; - - if (xdrs->x_op == XDR_FREE)/* nothing to free */ - return 1; - while (1) { - if (xdrs->x_op == XDR_ENCODE) { - if ((size = fread(buf, sizeof(char), BUFSIZ, - fp)) == 0 && ferror(fp)) { - fprintf(stderr, "can't fread\en"); - return (1); - } - } - p = buf; - if (!xdr_bytes(xdrs, &p, &size, BUFSIZ)) - return 0; - if (size == 0) - return 1; - if (xdrs->x_op == XDR_DECODE) { - if (fwrite(buf, sizeof(char), size, - fp) != size) { - fprintf(stderr, "can't fwrite\en"); - return (1); - } - } - } -} -.vs -.DE -.KE -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * The sender routines - */ -.ft CW -#include -#include -#include -#include -#include - -main(argc, argv) - int argc; - char **argv; -{ - int xdr_rcp(); - int err; - - if (argc < 2) { - fprintf(stderr, "usage: %s servername\en", argv[0]); - exit(-1); - } - if ((err = callrpctcp(argv[1], RCPPROG, RCPPROC, - RCPVERS, xdr_rcp, stdin, xdr_void, 0) != 0)) { - clnt_perrno(err); - fprintf(stderr, "can't make RPC call\en"); - exit(1); - } - exit(0); -} - -callrpctcp(host, prognum, procnum, versnum, - inproc, in, outproc, out) - char *host, *in, *out; - xdrproc_t inproc, outproc; -{ - struct sockaddr_in server_addr; - int socket = RPC_ANYSOCK; - enum clnt_stat clnt_stat; - struct hostent *hp; - register CLIENT *client; - struct timeval total_timeout; - - if ((hp = gethostbyname(host)) == NULL) { - fprintf(stderr, "can't get addr for '%s'\en", host); - return (-1); - } - bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, - hp->h_length); - server_addr.sin_family = AF_INET; - server_addr.sin_port = 0; - if ((client = clnttcp_create(&server_addr, prognum, - versnum, &socket, BUFSIZ, BUFSIZ)) == NULL) { - perror("rpctcp_create"); - return (-1); - } - total_timeout.tv_sec = 20; - total_timeout.tv_usec = 0; - clnt_stat = clnt_call(client, procnum, - inproc, in, outproc, out, total_timeout); - clnt_destroy(client); - return (int)clnt_stat; -} -.vs -.DE -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * The receiving routines - */ -.ft CW -#include -#include - -main() -{ - register SVCXPRT *transp; - int rcp_service(), xdr_rcp(); - - if ((transp = svctcp_create(RPC_ANYSOCK, - BUFSIZ, BUFSIZ)) == NULL) { - fprintf("svctcp_create: error\en"); - exit(1); - } - pmap_unset(RCPPROG, RCPVERS); - if (!svc_register(transp, - RCPPROG, RCPVERS, rcp_service, IPPROTO_TCP)) { - fprintf(stderr, "svc_register: error\en"); - exit(1); - } - svc_run(); /* \fInever returns\fP */ - fprintf(stderr, "svc_run should never return\en"); -} - -rcp_service(rqstp, transp) - register struct svc_req *rqstp; - register SVCXPRT *transp; -{ - switch (rqstp->rq_proc) { - case NULLPROC: - if (svc_sendreply(transp, xdr_void, 0) == 0) { - fprintf(stderr, "err: rcp_service"); - return (1); - } - return; - case RCPPROC_FP: - if (!svc_getargs(transp, xdr_rcp, stdout)) { - svcerr_decode(transp); - return; - } - if (!svc_sendreply(transp, xdr_void, 0)) { - fprintf(stderr, "can't reply\en"); - return; - } - return (0); - default: - svcerr_noproc(transp); - return; - } -} -.vs -.DE -.NH 2 -\&Callback Procedures -.IX RPC "callback procedures" -.LP -Occasionally, it is useful to have a server become a client, -and make an RPC call back to the process which is its client. -An example is remote debugging, -where the client is a window system program, -and the server is a debugger running on the remote machine. -Most of the time, -the user clicks a mouse button at the debugging window, -which converts this to a debugger command, -and then makes an RPC call to the server -(where the debugger is actually running), -telling it to execute that command. -However, when the debugger hits a breakpoint, the roles are reversed, -and the debugger wants to make an rpc call to the window program, -so that it can inform the user that a breakpoint has been reached. -.LP -In order to do an RPC callback, -you need a program number to make the RPC call on. -Since this will be a dynamically generated program number, -it should be in the transient range, -.I "0x40000000 - 0x5fffffff" . -The routine -.I gettransient() -returns a valid program number in the transient range, -and registers it with the portmapper. -It only talks to the portmapper running on the same machine as the -.I gettransient() -routine itself. The call to -.I pmap_set() -is a test and set operation, -in that it indivisibly tests whether a program number -has already been registered, -and if it has not, then reserves it. On return, the -.I sockp -argument will contain a socket that can be used -as the argument to an -.I svcudp_create() -or -.I svctcp_create() -call. -.ie t .DS -.el .DS L -.ft CW -.vs 11 -#include -#include -#include - -gettransient(proto, vers, sockp) - int proto, vers, *sockp; -{ - static int prognum = 0x40000000; - int s, len, socktype; - struct sockaddr_in addr; - - switch(proto) { - case IPPROTO_UDP: - socktype = SOCK_DGRAM; - break; - case IPPROTO_TCP: - socktype = SOCK_STREAM; - break; - default: - fprintf(stderr, "unknown protocol type\en"); - return 0; - } - if (*sockp == RPC_ANYSOCK) { - if ((s = socket(AF_INET, socktype, 0)) < 0) { - perror("socket"); - return (0); - } - *sockp = s; - } - else - s = *sockp; - addr.sin_addr.s_addr = 0; - addr.sin_family = AF_INET; - addr.sin_port = 0; - len = sizeof(addr); -.ft I - /* - * may be already bound, so don't check for error - */ -.ft CW - bind(s, &addr, len); - if (getsockname(s, &addr, &len)< 0) { - perror("getsockname"); - return (0); - } - while (!pmap_set(prognum++, vers, proto, - ntohs(addr.sin_port))) continue; - return (prognum-1); -} -.vs -.DE -.SH -Note: -.I -The call to -.I ntohs() -is necessary to ensure that the port number in -.I "addr.sin_port" , -which is in -.I network -byte order, is passed in -.I host -byte order (as -.I pmap_set() -expects). See the -.I byteorder(3N) -man page for more details on the conversion of network -addresses from network to host byte order. -.KS -.LP -The following pair of programs illustrate how to use the -.I gettransient() -routine. -The client makes an RPC call to the server, -passing it a transient program number. -Then the client waits around to receive a callback -from the server at that program number. -The server registers the program -.I EXAMPLEPROG -so that it can receive the RPC call -informing it of the callback program number. -Then at some random time (on receiving an -.I ALRM -signal in this example), it sends a callback RPC call, -using the program number it received earlier. -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * client - */ -.ft CW -#include -#include - -int callback(); -char hostname[256]; - -main() -{ - int x, ans, s; - SVCXPRT *xprt; - - gethostname(hostname, sizeof(hostname)); - s = RPC_ANYSOCK; - x = gettransient(IPPROTO_UDP, 1, &s); - fprintf(stderr, "client gets prognum %d\en", x); - if ((xprt = svcudp_create(s)) == NULL) { - fprintf(stderr, "rpc_server: svcudp_create\en"); - exit(1); - } -.ft I - /* protocol is 0 - gettransient does registering - */ -.ft CW - (void)svc_register(xprt, x, 1, callback, 0); - ans = callrpc(hostname, EXAMPLEPROG, EXAMPLEVERS, - EXAMPLEPROC_CALLBACK, xdr_int, &x, xdr_void, 0); - if ((enum clnt_stat) ans != RPC_SUCCESS) { - fprintf(stderr, "call: "); - clnt_perrno(ans); - fprintf(stderr, "\en"); - } - svc_run(); - fprintf(stderr, "Error: svc_run shouldn't return\en"); -} - -callback(rqstp, transp) - register struct svc_req *rqstp; - register SVCXPRT *transp; -{ - switch (rqstp->rq_proc) { - case 0: - if (!svc_sendreply(transp, xdr_void, 0)) { - fprintf(stderr, "err: exampleprog\en"); - return (1); - } - return (0); - case 1: - if (!svc_getargs(transp, xdr_void, 0)) { - svcerr_decode(transp); - return (1); - } - fprintf(stderr, "client got callback\en"); - if (!svc_sendreply(transp, xdr_void, 0)) { - fprintf(stderr, "err: exampleprog"); - return (1); - } - } -} -.vs -.DE -.KE -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * server - */ -.ft CW -#include -#include -#include - -char *getnewprog(); -char hostname[256]; -int docallback(); -int pnum; /* \fIprogram number for callback routine\fP */ - -main() -{ - gethostname(hostname, sizeof(hostname)); - registerrpc(EXAMPLEPROG, EXAMPLEVERS, - EXAMPLEPROC_CALLBACK, getnewprog, xdr_int, xdr_void); - fprintf(stderr, "server going into svc_run\en"); - signal(SIGALRM, docallback); - alarm(10); - svc_run(); - fprintf(stderr, "Error: svc_run shouldn't return\en"); -} - -char * -getnewprog(pnump) - char *pnump; -{ - pnum = *(int *)pnump; - return NULL; -} - -docallback() -{ - int ans; - - ans = callrpc(hostname, pnum, 1, 1, xdr_void, 0, - xdr_void, 0); - if (ans != 0) { - fprintf(stderr, "server: "); - clnt_perrno(ans); - fprintf(stderr, "\en"); - } -} -.vs -.DE diff --git a/lib/libc/rpc/PSD.doc/rpc.rfc.ms b/lib/libc/rpc/PSD.doc/rpc.rfc.ms deleted file mode 100644 index 9a948bd..0000000 --- a/lib/libc/rpc/PSD.doc/rpc.rfc.ms +++ /dev/null @@ -1,1304 +0,0 @@ -.\" -.\" Must use -- tbl -- with this one -.\" -.\" @(#)rpc.rfc.ms 2.2 88/08/05 4.0 RPCSRC -.\" $FreeBSD$ -.\" -.de BT -.if \\n%=1 .tl ''- % -'' -.. -.ND -.\" prevent excess underlining in nroff -.if n .fp 2 R -.OH 'Remote Procedure Calls: Protocol Specification''Page %' -.EH 'Page %''Remote Procedure Calls: Protocol Specification' -.if \n%=1 .bp -.SH -\&Remote Procedure Calls: Protocol Specification -.LP -.NH 0 -\&Status of this Memo -.LP -Note: This chapter specifies a protocol that Sun Microsystems, Inc., -and others are using. -It has been designated RFC1050 by the ARPA Network -Information Center. -.LP -.NH 1 -\&Introduction -.LP -This chapter specifies a message protocol used in implementing -Sun's Remote Procedure Call (RPC) package. (The message protocol is -specified with the External Data Representation (XDR) language. -See the -.I "External Data Representation Standard: Protocol Specification" -for the details. Here, we assume that the reader is familiar -with XDR and do not attempt to justify it or its uses). The paper -by Birrell and Nelson [1] is recommended as an excellent background -to and justification of RPC. -.NH 2 -\&Terminology -.LP -This chapter discusses servers, services, programs, procedures, -clients, and versions. A server is a piece of software where network -services are implemented. A network service is a collection of one -or more remote programs. A remote program implements one or more -remote procedures; the procedures, their parameters, and results are -documented in the specific program's protocol specification (see the -\fIPort Mapper Program Protocol\fP\, below, for an example). Network -clients are pieces of software that initiate remote procedure calls -to services. A server may support more than one version of a remote -program in order to be forward compatible with changing protocols. -.LP -For example, a network file service may be composed of two programs. -One program may deal with high-level applications such as file system -access control and locking. The other may deal with low-level file -IO and have procedures like "read" and "write". A client machine of -the network file service would call the procedures associated with -the two programs of the service on behalf of some user on the client -machine. -.NH 2 -\&The RPC Model -.LP -The remote procedure call model is similar to the local procedure -call model. In the local case, the caller places arguments to a -procedure in some well-specified location (such as a result -register). It then transfers control to the procedure, and -eventually gains back control. At that point, the results of the -procedure are extracted from the well-specified location, and the -caller continues execution. -.LP -The remote procedure call is similar, in that one thread of control -logically winds through two processes\(emone is the caller's process, -the other is a server's process. That is, the caller process sends a -call message to the server process and waits (blocks) for a reply -message. The call message contains the procedure's parameters, among -other things. The reply message contains the procedure's results, -among other things. Once the reply message is received, the results -of the procedure are extracted, and caller's execution is resumed. -.LP -On the server side, a process is dormant awaiting the arrival of a -call message. When one arrives, the server process extracts the -procedure's parameters, computes the results, sends a reply message, -and then awaits the next call message. -.LP -Note that in this model, only one of the two processes is active at -any given time. However, this model is only given as an example. -The RPC protocol makes no restrictions on the concurrency model -implemented, and others are possible. For example, an implementation -may choose to have RPC calls be asynchronous, so that the client may -do useful work while waiting for the reply from the server. Another -possibility is to have the server create a task to process an -incoming request, so that the server can be free to receive other -requests. -.NH 2 -\&Transports and Semantics -.LP -The RPC protocol is independent of transport protocols. That is, RPC -does not care how a message is passed from one process to another. -The protocol deals only with specification and interpretation of -messages. -.LP -It is important to point out that RPC does not try to implement any -kind of reliability and that the application must be aware of the -type of transport protocol underneath RPC. If it knows it is running -on top of a reliable transport such as TCP/IP[6], then most of the -work is already done for it. On the other hand, if it is running on -top of an unreliable transport such as UDP/IP[7], it must implement -is own retransmission and time-out policy as the RPC layer does not -provide this service. -.LP -Because of transport independence, the RPC protocol does not attach -specific semantics to the remote procedures or their execution. -Semantics can be inferred from (but should be explicitly specified -by) the underlying transport protocol. For example, consider RPC -running on top of an unreliable transport such as UDP/IP. If an -application retransmits RPC messages after short time-outs, the only -thing it can infer if it receives no reply is that the procedure was -executed zero or more times. If it does receive a reply, then it can -infer that the procedure was executed at least once. -.LP -A server may wish to remember previously granted requests from a -client and not regrant them in order to insure some degree of -execute-at-most-once semantics. A server can do this by taking -advantage of the transaction ID that is packaged with every RPC -request. The main use of this transaction is by the client RPC layer -in matching replies to requests. However, a client application may -choose to reuse its previous transaction ID when retransmitting a -request. The server application, knowing this fact, may choose to -remember this ID after granting a request and not regrant requests -with the same ID in order to achieve some degree of -execute-at-most-once semantics. The server is not allowed to examine -this ID in any other way except as a test for equality. -.LP -On the other hand, if using a reliable transport such as TCP/IP, the -application can infer from a reply message that the procedure was -executed exactly once, but if it receives no reply message, it cannot -assume the remote procedure was not executed. Note that even if a -connection-oriented protocol like TCP is used, an application still -needs time-outs and reconnection to handle server crashes. -.LP -There are other possibilities for transports besides datagram- or -connection-oriented protocols. For example, a request-reply protocol -such as VMTP[2] is perhaps the most natural transport for RPC. -.SH -.I -NOTE: At Sun, RPC is currently implemented on top of both TCP/IP -and UDP/IP transports. -.LP -.NH 2 -\&Binding and Rendezvous Independence -.LP -The act of binding a client to a service is NOT part of the remote -procedure call specification. This important and necessary function -is left up to some higher-level software. (The software may use RPC -itself\(emsee the \fIPort Mapper Program Protocol\fP\, below). -.LP -Implementors should think of the RPC protocol as the jump-subroutine -instruction ("JSR") of a network; the loader (binder) makes JSR -useful, and the loader itself uses JSR to accomplish its task. -Likewise, the network makes RPC useful, using RPC to accomplish this -task. -.NH 2 -\&Authentication -.LP -The RPC protocol provides the fields necessary for a client to -identify itself to a service and vice-versa. Security and access -control mechanisms can be built on top of the message authentication. -Several different authentication protocols can be supported. A field -in the RPC header indicates which protocol is being used. More -information on specific authentication protocols can be found in the -\fIAuthentication Protocols\fP\, -below. -.KS -.NH 1 -\&RPC Protocol Requirements -.LP -The RPC protocol must provide for the following: -.IP 1. -Unique specification of a procedure to be called. -.IP 2. -Provisions for matching response messages to request messages. -.KE -.IP 3. -Provisions for authenticating the caller to service and vice-versa. -.LP -Besides these requirements, features that detect the following are -worth supporting because of protocol roll-over errors, implementation -bugs, user error, and network administration: -.IP 1. -RPC protocol mismatches. -.IP 2. -Remote program protocol version mismatches. -.IP 3. -Protocol errors (such as misspecification of a procedure's parameters). -.IP 4. -Reasons why remote authentication failed. -.IP 5. -Any other reasons why the desired procedure was not called. -.NH 2 -\&Programs and Procedures -.LP -The RPC call message has three unsigned fields: remote program -number, remote program version number, and remote procedure number. -The three fields uniquely identify the procedure to be called. -Program numbers are administered by some central authority (like -Sun). Once an implementor has a program number, he can implement his -remote program; the first implementation would most likely have the -version number of 1. Because most new protocols evolve into better, -stable, and mature protocols, a version field of the call message -identifies which version of the protocol the caller is using. -Version numbers make speaking old and new protocols through the same -server process possible. -.LP -The procedure number identifies the procedure to be called. These -numbers are documented in the specific program's protocol -specification. For example, a file service's protocol specification -may state that its procedure number 5 is "read" and procedure number -12 is "write". -.LP -Just as remote program protocols may change over several versions, -the actual RPC message protocol could also change. Therefore, the -call message also has in it the RPC version number, which is always -equal to two for the version of RPC described here. -.LP -The reply message to a request message has enough information to -distinguish the following error conditions: -.IP 1. -The remote implementation of RPC does speak protocol version 2. -The lowest and highest supported RPC version numbers are returned. -.IP 2. -The remote program is not available on the remote system. -.IP 3. -The remote program does not support the requested version number. -The lowest and highest supported remote program version numbers are -returned. -.IP 4. -The requested procedure number does not exist. (This is usually a -caller side protocol or programming error.) -.IP 5. -The parameters to the remote procedure appear to be garbage from the -server's point of view. (Again, this is usually caused by a -disagreement about the protocol between client and service.) -.NH 2 -\&Authentication -.LP -Provisions for authentication of caller to service and vice-versa are -provided as a part of the RPC protocol. The call message has two -authentication fields, the credentials and verifier. The reply -message has one authentication field, the response verifier. The RPC -protocol specification defines all three fields to be the following -opaque type: -.DS -.ft CW -.vs 11 -enum auth_flavor { - AUTH_NULL = 0, - AUTH_UNIX = 1, - AUTH_SHORT = 2, - AUTH_DES = 3 - /* \fIand more to be defined\fP */ -}; - -struct opaque_auth { - auth_flavor flavor; - opaque body<400>; -}; -.DE -.LP -In simple English, any -.I opaque_auth -structure is an -.I auth_flavor -enumeration followed by bytes which are opaque to the RPC protocol -implementation. -.LP -The interpretation and semantics of the data contained within the -authentication fields is specified by individual, independent -authentication protocol specifications. (See -\fIAuthentication Protocols\fP\, -below, for definitions of the various authentication protocols.) -.LP -If authentication parameters were rejected, the response message -contains information stating why they were rejected. -.NH 2 -\&Program Number Assignment -.LP -Program numbers are given out in groups of -.I 0x20000000 -(decimal 536870912) according to the following chart: -.TS -box tab (&) ; -lfI lfI -rfL cfI . -Program Numbers&Description -_ -.sp .5 -0 - 1fffffff&Defined by Sun -20000000 - 3fffffff&Defined by user -40000000 - 5fffffff&Transient -60000000 - 7fffffff&Reserved -80000000 - 9fffffff&Reserved -a0000000 - bfffffff&Reserved -c0000000 - dfffffff&Reserved -e0000000 - ffffffff&Reserved -.TE -.LP -The first group is a range of numbers administered by Sun -Microsystems and should be identical for all sites. The second range -is for applications peculiar to a particular site. This range is -intended primarily for debugging new programs. When a site develops -an application that might be of general interest, that application -should be given an assigned number in the first range. The third -group is for applications that generate program numbers dynamically. -The final groups are reserved for future use, and should not be used. -.NH 2 -\&Other Uses of the RPC Protocol -.LP -The intended use of this protocol is for calling remote procedures. -That is, each call message is matched with a response message. -However, the protocol itself is a message-passing protocol with which -other (non-RPC) protocols can be implemented. Sun currently uses, or -perhaps abuses, the RPC message protocol for the following two -(non-RPC) protocols: batching (or pipelining) and broadcast RPC. -These two protocols are discussed but not defined below. -.NH 3 -\&Batching -.LP -Batching allows a client to send an arbitrarily large sequence of -call messages to a server; batching typically uses reliable byte -stream protocols (like TCP/IP) for its transport. In the case of -batching, the client never waits for a reply from the server, and the -server does not send replies to batch requests. A sequence of batch -calls is usually terminated by a legitimate RPC in order to flush the -pipeline (with positive acknowledgement). -.NH 3 -\&Broadcast RPC -.LP -In broadcast RPC-based protocols, the client sends a broadcast packet -to the network and waits for numerous replies. Broadcast RPC uses -unreliable, packet-based protocols (like UDP/IP) as its transports. -Servers that support broadcast protocols only respond when the -request is successfully processed, and are silent in the face of -errors. Broadcast RPC uses the Port Mapper RPC service to achieve -its semantics. See the \fIPort Mapper Program Protocol\fP\, below, -for more information. -.KS -.NH 1 -\&The RPC Message Protocol -.LP -This section defines the RPC message protocol in the XDR data -description language. The message is defined in a top-down style. -.ie t .DS -.el .DS L -.ft CW -enum msg_type { - CALL = 0, - REPLY = 1 -}; - -.ft I -/* -* A reply to a call message can take on two forms: -* The message was either accepted or rejected. -*/ -.ft CW -enum reply_stat { - MSG_ACCEPTED = 0, - MSG_DENIED = 1 -}; - -.ft I -/* -* Given that a call message was accepted, the following is the -* status of an attempt to call a remote procedure. -*/ -.ft CW -enum accept_stat { - SUCCESS = 0, /* \fIRPC executed successfully \fP*/ - PROG_UNAVAIL = 1, /* \fIremote hasn't exported program \fP*/ - PROG_MISMATCH = 2, /* \fIremote can't support version # \fP*/ - PROC_UNAVAIL = 3, /* \fIprogram can't support procedure \fP*/ - GARBAGE_ARGS = 4 /* \fIprocedure can't decode params \fP*/ -}; -.DE -.ie t .DS -.el .DS L -.ft I -/* -* Reasons why a call message was rejected: -*/ -.ft CW -enum reject_stat { - RPC_MISMATCH = 0, /* \fIRPC version number != 2 \fP*/ - AUTH_ERROR = 1 /* \fIremote can't authenticate caller \fP*/ -}; - -.ft I -/* -* Why authentication failed: -*/ -.ft CW -enum auth_stat { - AUTH_BADCRED = 1, /* \fIbad credentials \fP*/ - AUTH_REJECTEDCRED = 2, /* \fIclient must begin new session \fP*/ - AUTH_BADVERF = 3, /* \fIbad verifier \fP*/ - AUTH_REJECTEDVERF = 4, /* \fIverifier expired or replayed \fP*/ - AUTH_TOOWEAK = 5 /* \fIrejected for security reasons \fP*/ -}; -.DE -.KE -.ie t .DS -.el .DS L -.ft I -/* -* The RPC message: -* All messages start with a transaction identifier, xid, -* followed by a two-armed discriminated union. The union's -* discriminant is a msg_type which switches to one of the two -* types of the message. The xid of a \fIREPLY\fP message always -* matches that of the initiating \fICALL\fP message. NB: The xid -* field is only used for clients matching reply messages with -* call messages or for servers detecting retransmissions; the -* service side cannot treat this id as any type of sequence -* number. -*/ -.ft CW -struct rpc_msg { - unsigned int xid; - union switch (msg_type mtype) { - case CALL: - call_body cbody; - case REPLY: - reply_body rbody; - } body; -}; -.DE -.ie t .DS -.el .DS L -.ft I -/* -* Body of an RPC request call: -* In version 2 of the RPC protocol specification, rpcvers must -* be equal to 2. The fields prog, vers, and proc specify the -* remote program, its version number, and the procedure within -* the remote program to be called. After these fields are two -* authentication parameters: cred (authentication credentials) -* and verf (authentication verifier). The two authentication -* parameters are followed by the parameters to the remote -* procedure, which are specified by the specific program -* protocol. -*/ -.ft CW -struct call_body { - unsigned int rpcvers; /* \fImust be equal to two (2) \fP*/ - unsigned int prog; - unsigned int vers; - unsigned int proc; - opaque_auth cred; - opaque_auth verf; - /* \fIprocedure specific parameters start here \fP*/ -}; -.DE -.ie t .DS -.el .DS L -.ft I -/* -* Body of a reply to an RPC request: -* The call message was either accepted or rejected. -*/ -.ft CW -union reply_body switch (reply_stat stat) { - case MSG_ACCEPTED: - accepted_reply areply; - case MSG_DENIED: - rejected_reply rreply; -} reply; -.DE -.ie t .DS -.el .DS L -.ft I -/* -* Reply to an RPC request that was accepted by the server: -* there could be an error even though the request was accepted. -* The first field is an authentication verifier that the server -* generates in order to validate itself to the caller. It is -* followed by a union whose discriminant is an enum -* accept_stat. The \fISUCCESS\fP arm of the union is protocol -* specific. The \fIPROG_UNAVAIL\fP, \fIPROC_UNAVAIL\fP, and \fIGARBAGE_ARGP\fP -* arms of the union are void. The \fIPROG_MISMATCH\fP arm specifies -* the lowest and highest version numbers of the remote program -* supported by the server. -*/ -.ft CW -struct accepted_reply { - opaque_auth verf; - union switch (accept_stat stat) { - case SUCCESS: - opaque results[0]; - /* \fIprocedure-specific results start here\fP */ - case PROG_MISMATCH: - struct { - unsigned int low; - unsigned int high; - } mismatch_info; - default: -.ft I - /* - * Void. Cases include \fIPROG_UNAVAIL, PROC_UNAVAIL\fP, - * and \fIGARBAGE_ARGS\fP. - */ -.ft CW - void; - } reply_data; -}; -.DE -.ie t .DS -.el .DS L -.ft I -/* -* Reply to an RPC request that was rejected by the server: -* The request can be rejected for two reasons: either the -* server is not running a compatible version of the RPC -* protocol (\fIRPC_MISMATCH\fP), or the server refuses to -* authenticate the caller (\fIAUTH_ERROR\fP). In case of an RPC -* version mismatch, the server returns the lowest and highest -* supported RPC version numbers. In case of refused -* authentication, failure status is returned. -*/ -.ft CW -union rejected_reply switch (reject_stat stat) { - case RPC_MISMATCH: - struct { - unsigned int low; - unsigned int high; - } mismatch_info; - case AUTH_ERROR: - auth_stat stat; -}; -.DE -.NH 1 -\&Authentication Protocols -.LP -As previously stated, authentication parameters are opaque, but -open-ended to the rest of the RPC protocol. This section defines -some "flavors" of authentication implemented at (and supported by) -Sun. Other sites are free to invent new authentication types, with -the same rules of flavor number assignment as there is for program -number assignment. -.NH 2 -\&Null Authentication -.LP -Often calls must be made where the caller does not know who he is or -the server does not care who the caller is. In this case, the flavor -value (the discriminant of the \fIopaque_auth\fP's union) of the RPC -message's credentials, verifier, and response verifier is -.I AUTH_NULL . -The bytes of the opaque_auth's body are undefined. -It is recommended that the opaque length be zero. -.NH 2 -\&UNIX Authentication -.LP -The caller of a remote procedure may wish to identify himself as he -is identified on a UNIX system. The value of the credential's -discriminant of an RPC call message is -.I AUTH_UNIX . -The bytes of -the credential's opaque body encode the following structure: -.DS -.ft CW -struct auth_unix { - unsigned int stamp; - string machinename<255>; - unsigned int uid; - unsigned int gid; - unsigned int gids<10>; -}; -.DE -The -.I stamp -is an arbitrary ID which the caller machine may -generate. The -.I machinename -is the name of the caller's machine (like "krypton"). The -.I uid -is the caller's effective user ID. The -.I gid -is the caller's effective group ID. The -.I gids -is a -counted array of groups which contain the caller as a member. The -verifier accompanying the credentials should be of -.I AUTH_NULL -(defined above). -.LP -The value of the discriminant of the response verifier received in -the reply message from the server may be -.I AUTH_NULL -or -.I AUTH_SHORT . -In the case of -.I AUTH_SHORT , -the bytes of the response verifier's string encode an opaque -structure. This new opaque structure may now be passed to the server -instead of the original -.I AUTH_UNIX -flavor credentials. The server keeps a cache which maps shorthand -opaque structures (passed back by way of an -.I AUTH_SHORT -style response verifier) to the original credentials of the caller. -The caller can save network bandwidth and server cpu cycles by using -the new credentials. -.LP -The server may flush the shorthand opaque structure at any time. If -this happens, the remote procedure call message will be rejected due -to an authentication error. The reason for the failure will be -.I AUTH_REJECTEDCRED . -At this point, the caller may wish to try the original -.I AUTH_UNIX -style of credentials. -.KS -.NH 2 -\&DES Authentication -.LP -UNIX authentication suffers from two major problems: -.IP 1. -The naming is too UNIX-system oriented. -.IP 2. -There is no verifier, so credentials can easily be faked. -.LP -DES authentication attempts to fix these two problems. -.KE -.NH 3 -\&Naming -.LP -The first problem is handled by addressing the caller by a simple -string of characters instead of by an operating system specific -integer. This string of characters is known as the "netname" or -network name of the caller. The server is not allowed to interpret -the contents of the caller's name in any other way except to -identify the caller. Thus, netnames should be unique for every -caller in the internet. -.LP -It is up to each operating system's implementation of DES -authentication to generate netnames for its users that insure this -uniqueness when they call upon remote servers. Operating systems -already know how to distinguish users local to their systems. It is -usually a simple matter to extend this mechanism to the network. -For example, a UNIX user at Sun with a user ID of 515 might be -assigned the following netname: "unix.515@sun.com". This netname -contains three items that serve to insure it is unique. Going -backwards, there is only one naming domain called "sun.com" in the -internet. Within this domain, there is only one UNIX user with -user ID 515. However, there may be another user on another -operating system, for example VMS, within the same naming domain -that, by coincidence, happens to have the same user ID. To insure -that these two users can be distinguished we add the operating -system name. So one user is "unix.515@sun.com" and the other is -"vms.515@sun.com". -.LP -The first field is actually a naming method rather than an -operating system name. It just happens that today there is almost -a one-to-one correspondence between naming methods and operating -systems. If the world could agree on a naming standard, the first -field could be the name of that standard, instead of an operating -system name. -.LP -.NH 3 -\&DES Authentication Verifiers -.LP -Unlike UNIX authentication, DES authentication does have a verifier -so the server can validate the client's credential (and -vice-versa). The contents of this verifier is primarily an -encrypted timestamp. The server can decrypt this timestamp, and if -it is close to what the real time is, then the client must have -encrypted it correctly. The only way the client could encrypt it -correctly is to know the "conversation key" of the RPC session. And -if the client knows the conversation key, then it must be the real -client. -.LP -The conversation key is a DES [5] key which the client generates -and notifies the server of in its first RPC call. The conversation -key is encrypted using a public key scheme in this first -transaction. The particular public key scheme used in DES -authentication is Diffie-Hellman [3] with 192-bit keys. The -details of this encryption method are described later. -.LP -The client and the server need the same notion of the current time -in order for all of this to work. If network time synchronization -cannot be guaranteed, then client can synchronize with the server -before beginning the conversation, perhaps by consulting the -Internet Time Server (TIME[4]). -.LP -The way a server determines if a client timestamp is valid is -somewhat complicated. For any other transaction but the first, the -server just checks for two things: -.IP 1. -the timestamp is greater than the one previously seen from the -same client. -.IP 2. -the timestamp has not expired. -.LP -A timestamp is expired if the server's time is later than the sum -of the client's timestamp plus what is known as the client's -"window". The "window" is a number the client passes (encrypted) -to the server in its first transaction. You can think of it as a -lifetime for the credential. -.LP -This explains everything but the first transaction. In the first -transaction, the server checks only that the timestamp has not -expired. If this was all that was done though, then it would be -quite easy for the client to send random data in place of the -timestamp with a fairly good chance of succeeding. As an added -check, the client sends an encrypted item in the first transaction -known as the "window verifier" which must be equal to the window -minus 1, or the server will reject the credential. -.LP -The client too must check the verifier returned from the server to -be sure it is legitimate. The server sends back to the client the -encrypted timestamp it received from the client, minus one second. -If the client gets anything different than this, it will reject it. -.LP -.NH 3 -\&Nicknames and Clock Synchronization -.LP -After the first transaction, the server's DES authentication -subsystem returns in its verifier to the client an integer -"nickname" which the client may use in its further transactions -instead of passing its netname, encrypted DES key and window every -time. The nickname is most likely an index into a table on the -server which stores for each client its netname, decrypted DES key -and window. -.LP -Though they originally were synchronized, the client's and server's -clocks can get out of sync again. When this happens the client RPC -subsystem most likely will get back -.I RPC_AUTHERROR -at which point it should resynchronize. -.LP -A client may still get the -.I RPC_AUTHERROR -error even though it is -synchronized with the server. The reason is that the server's -nickname table is a limited size, and it may flush entries whenever -it wants. A client should resend its original credential in this -case and the server will give it a new nickname. If a server -crashes, the entire nickname table gets flushed, and all clients -will have to resend their original credentials. -.KS -.NH 3 -\&DES Authentication Protocol (in XDR language) -.ie t .DS -.el .DS L -.ft I -/* -* There are two kinds of credentials: one in which the client uses -* its full network name, and one in which it uses its "nickname" -* (just an unsigned integer) given to it by the server. The -* client must use its fullname in its first transaction with the -* server, in which the server will return to the client its -* nickname. The client may use its nickname in all further -* transactions with the server. There is no requirement to use the -* nickname, but it is wise to use it for performance reasons. -*/ -.ft CW -enum authdes_namekind { - ADN_FULLNAME = 0, - ADN_NICKNAME = 1 -}; - -.ft I -/* -* A 64-bit block of encrypted DES data -*/ -.ft CW -typedef opaque des_block[8]; - -.ft I -/* -* Maximum length of a network user's name -*/ -.ft CW -const MAXNETNAMELEN = 255; - -.ft I -/* -* A fullname contains the network name of the client, an encrypted -* conversation key and the window. The window is actually a -* lifetime for the credential. If the time indicated in the -* verifier timestamp plus the window has past, then the server -* should expire the request and not grant it. To insure that -* requests are not replayed, the server should insist that -* timestamps are greater than the previous one seen, unless it is -* the first transaction. In the first transaction, the server -* checks instead that the window verifier is one less than the -* window. -*/ -.ft CW -struct authdes_fullname { -string name; /* \fIname of client \f(CW*/ -des_block key; /* \fIPK encrypted conversation key \f(CW*/ -unsigned int window; /* \fIencrypted window \f(CW*/ -}; - -.ft I -/* -* A credential is either a fullname or a nickname -*/ -.ft CW -union authdes_cred switch (authdes_namekind adc_namekind) { - case ADN_FULLNAME: - authdes_fullname adc_fullname; - case ADN_NICKNAME: - unsigned int adc_nickname; -}; - -.ft I -/* -* A timestamp encodes the time since midnight, January 1, 1970. -*/ -.ft CW -struct timestamp { - unsigned int seconds; /* \fIseconds \fP*/ - unsigned int useconds; /* \fIand microseconds \fP*/ -}; - -.ft I -/* -* Verifier: client variety -* The window verifier is only used in the first transaction. In -* conjunction with a fullname credential, these items are packed -* into the following structure before being encrypted: -* -* \f(CWstruct {\fP -* \f(CWadv_timestamp; \fP-- one DES block -* \f(CWadc_fullname.window; \fP-- one half DES block -* \f(CWadv_winverf; \fP-- one half DES block -* \f(CW}\fP -* This structure is encrypted using CBC mode encryption with an -* input vector of zero. All other encryptions of timestamps use -* ECB mode encryption. -*/ -.ft CW -struct authdes_verf_clnt { - timestamp adv_timestamp; /* \fIencrypted timestamp \fP*/ - unsigned int adv_winverf; /* \fIencrypted window verifier \fP*/ -}; - -.ft I -/* -* Verifier: server variety -* The server returns (encrypted) the same timestamp the client -* gave it minus one second. It also tells the client its nickname -* to be used in future transactions (unencrypted). -*/ -.ft CW -struct authdes_verf_svr { -timestamp adv_timeverf; /* \fIencrypted verifier \fP*/ -unsigned int adv_nickname; /* \fInew nickname for client \fP*/ -}; -.DE -.KE -.NH 3 -\&Diffie-Hellman Encryption -.LP -In this scheme, there are two constants, -.I BASE -and -.I MODULUS . -The -particular values Sun has chosen for these for the DES -authentication protocol are: -.ie t .DS -.el .DS L -.ft CW -const BASE = 3; -const MODULUS = - "d4a0ba0250b6fd2ec626e7efd637df76c716e22d0944b88b"; /* \fIhex \fP*/ -.DE -.ft R -The way this scheme works is best explained by an example. Suppose -there are two people "A" and "B" who want to send encrypted -messages to each other. So, A and B both generate "secret" keys at -random which they do not reveal to anyone. Let these keys be -represented as SK(A) and SK(B). They also publish in a public -directory their "public" keys. These keys are computed as follows: -.ie t .DS -.el .DS L -.ft CW -PK(A) = ( BASE ** SK(A) ) mod MODULUS -PK(B) = ( BASE ** SK(B) ) mod MODULUS -.DE -.ft R -The "**" notation is used here to represent exponentiation. Now, -both A and B can arrive at the "common" key between them, -represented here as CK(A, B), without revealing their secret keys. -.LP -A computes: -.ie t .DS -.el .DS L -.ft CW -CK(A, B) = ( PK(B) ** SK(A)) mod MODULUS -.DE -.ft R -while B computes: -.ie t .DS -.el .DS L -.ft CW -CK(A, B) = ( PK(A) ** SK(B)) mod MODULUS -.DE -.ft R -These two can be shown to be equivalent: -.ie t .DS -.el .DS L -.ft CW -(PK(B) ** SK(A)) mod MODULUS = (PK(A) ** SK(B)) mod MODULUS -.DE -.ft R -We drop the "mod MODULUS" parts and assume modulo arithmetic to -simplify things: -.ie t .DS -.el .DS L -.ft CW -PK(B) ** SK(A) = PK(A) ** SK(B) -.DE -.ft R -Then, replace PK(B) by what B computed earlier and likewise for -PK(A). -.ie t .DS -.el .DS L -.ft CW -((BASE ** SK(B)) ** SK(A) = (BASE ** SK(A)) ** SK(B) -.DE -.ft R -which leads to: -.ie t .DS -.el .DS L -.ft CW -BASE ** (SK(A) * SK(B)) = BASE ** (SK(A) * SK(B)) -.DE -.ft R -This common key CK(A, B) is not used to encrypt the timestamps used -in the protocol. Rather, it is used only to encrypt a conversation -key which is then used to encrypt the timestamps. The reason for -doing this is to use the common key as little as possible, for fear -that it could be broken. Breaking the conversation key is a far -less serious offense, since conversations are relatively -short-lived. -.LP -The conversation key is encrypted using 56-bit DES keys, yet the -common key is 192 bits. To reduce the number of bits, 56 bits are -selected from the common key as follows. The middle-most 8-bytes -are selected from the common key, and then parity is added to the -lower order bit of each byte, producing a 56-bit key with 8 bits of -parity. -.KS -.NH 1 -\&Record Marking Standard -.LP -When RPC messages are passed on top of a byte stream protocol (like -TCP/IP), it is necessary, or at least desirable, to delimit one -message from another in order to detect and possibly recover from -user protocol errors. This is called record marking (RM). Sun uses -this RM/TCP/IP transport for passing RPC messages on TCP streams. -One RPC message fits into one RM record. -.LP -A record is composed of one or more record fragments. A record -fragment is a four-byte header followed by 0 to (2**31) - 1 bytes of -fragment data. The bytes encode an unsigned binary number; as with -XDR integers, the byte order is from highest to lowest. The number -encodes two values\(ema boolean which indicates whether the fragment -is the last fragment of the record (bit value 1 implies the fragment -is the last fragment) and a 31-bit unsigned binary value which is the -length in bytes of the fragment's data. The boolean value is the -highest-order bit of the header; the length is the 31 low-order bits. -(Note that this record specification is NOT in XDR standard form!) -.KE -.KS -.NH 1 -\&The RPC Language -.LP -Just as there was a need to describe the XDR data-types in a formal -language, there is also need to describe the procedures that operate -on these XDR data-types in a formal language as well. We use the RPC -Language for this purpose. It is an extension to the XDR language. -The following example is used to describe the essence of the -language. -.NH 2 -\&An Example Service Described in the RPC Language -.LP -Here is an example of the specification of a simple ping program. -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* -* Simple ping program -*/ -.ft CW -program PING_PROG { - /* \fILatest and greatest version\fP */ - version PING_VERS_PINGBACK { - void - PINGPROC_NULL(void) = 0; - -.ft I - /* - * Ping the caller, return the round-trip time - * (in microseconds). Returns -1 if the operation - * timed out. - */ -.ft CW - int - PINGPROC_PINGBACK(void) = 1; -} = 2; - -.ft I -/* -* Original version -*/ -.ft CW -version PING_VERS_ORIG { - void - PINGPROC_NULL(void) = 0; - } = 1; -} = 1; - -const PING_VERS = 2; /* \fIlatest version \fP*/ -.vs -.DE -.KE -.LP -The first version described is -.I PING_VERS_PINGBACK -with two procedures, -.I PINGPROC_NULL -and -.I PINGPROC_PINGBACK . -.I PINGPROC_NULL -takes no arguments and returns no results, but it is useful for -computing round-trip times from the client to the server and back -again. By convention, procedure 0 of any RPC protocol should have -the same semantics, and never require any kind of authentication. -The second procedure is used for the client to have the server do a -reverse ping operation back to the client, and it returns the amount -of time (in microseconds) that the operation used. The next version, -.I PING_VERS_ORIG , -is the original version of the protocol -and it does not contain -.I PINGPROC_PINGBACK -procedure. It is useful -for compatibility with old client programs, and as this program -matures it may be dropped from the protocol entirely. -.KS -.NH 2 -\&The RPC Language Specification -.LP -The RPC language is identical to the XDR language, except for the -added definition of a -.I program-def -described below. -.DS -.ft CW -program-def: - "program" identifier "{" - version-def - version-def * - "}" "=" constant ";" - -version-def: - "version" identifier "{" - procedure-def - procedure-def * - "}" "=" constant ";" - -procedure-def: - type-specifier identifier "(" type-specifier ")" - "=" constant ";" -.DE -.KE -.NH 2 -\&Syntax Notes -.IP 1. -The following keywords are added and cannot be used as -identifiers: "program" and "version"; -.IP 2. -A version name cannot occur more than once within the scope of -a program definition. Nor can a version number occur more than once -within the scope of a program definition. -.IP 3. -A procedure name cannot occur more than once within the scope -of a version definition. Nor can a procedure number occur more than -once within the scope of version definition. -.IP 4. -Program identifiers are in the same name space as constant and -type identifiers. -.IP 5. -Only unsigned constants can be assigned to programs, versions -and procedures. -.NH 1 -\&Port Mapper Program Protocol -.LP -The port mapper program maps RPC program and version numbers to -transport-specific port numbers. This program makes dynamic binding -of remote programs possible. -.LP -This is desirable because the range of reserved port numbers is very -small and the number of potential remote programs is very large. By -running only the port mapper on a reserved port, the port numbers of -other remote programs can be ascertained by querying the port mapper. -.LP -The port mapper also aids in broadcast RPC. A given RPC program will -usually have different port number bindings on different machines, so -there is no way to directly broadcast to all of these programs. The -port mapper, however, does have a fixed port number. So, to -broadcast to a given program, the client actually sends its message -to the port mapper located at the broadcast address. Each port -mapper that picks up the broadcast then calls the local service -specified by the client. When the port mapper gets the reply from -the local service, it sends the reply on back to the client. -.KS -.NH 2 -\&Port Mapper Protocol Specification (in RPC Language) -.ie t .DS -.el .DS L -.ft CW -.vs 11 -const PMAP_PORT = 111; /* \fIportmapper port number \fP*/ - -.ft I -/* -* A mapping of (program, version, protocol) to port number -*/ -.ft CW -struct mapping { - unsigned int prog; - unsigned int vers; - unsigned int prot; - unsigned int port; -}; - -.ft I -/* -* Supported values for the "prot" field -*/ -.ft CW -const IPPROTO_TCP = 6; /* \fIprotocol number for TCP/IP \fP*/ -const IPPROTO_UDP = 17; /* \fIprotocol number for UDP/IP \fP*/ - -.ft I -/* -* A list of mappings -*/ -.ft CW -struct *pmaplist { - mapping map; - pmaplist next; -}; -.vs -.DE -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* -* Arguments to callit -*/ -.ft CW -struct call_args { - unsigned int prog; - unsigned int vers; - unsigned int proc; - opaque args<>; -}; - -.ft I -/* -* Results of callit -*/ -.ft CW -struct call_result { - unsigned int port; - opaque res<>; -}; -.vs -.DE -.KE -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* -* Port mapper procedures -*/ -.ft CW -program PMAP_PROG { - version PMAP_VERS { - void - PMAPPROC_NULL(void) = 0; - - bool - PMAPPROC_SET(mapping) = 1; - - bool - PMAPPROC_UNSET(mapping) = 2; - - unsigned int - PMAPPROC_GETPORT(mapping) = 3; - - pmaplist - PMAPPROC_DUMP(void) = 4; - - call_result - PMAPPROC_CALLIT(call_args) = 5; - } = 2; -} = 100000; -.vs -.DE -.NH 2 -\&Port Mapper Operation -.LP -The portmapper program currently supports two protocols (UDP/IP and -TCP/IP). The portmapper is contacted by talking to it on assigned -port number 111 (SUNRPC [8]) on either of these protocols. The -following is a description of each of the portmapper procedures: -.IP \fBPMAPPROC_NULL:\fP -This procedure does no work. By convention, procedure zero of any -protocol takes no parameters and returns no results. -.IP \fBPMAPPROC_SET:\fP -When a program first becomes available on a machine, it registers -itself with the port mapper program on the same machine. The program -passes its program number "prog", version number "vers", transport -protocol number "prot", and the port "port" on which it awaits -service request. The procedure returns a boolean response whose -value is -.I TRUE -if the procedure successfully established the mapping and -.I FALSE -otherwise. The procedure refuses to establish -a mapping if one already exists for the tuple "(prog, vers, prot)". -.IP \fBPMAPPROC_UNSET:\fP -When a program becomes unavailable, it should unregister itself with -the port mapper program on the same machine. The parameters and -results have meanings identical to those of -.I PMAPPROC_SET . -The protocol and port number fields of the argument are ignored. -.IP \fBPMAPPROC_GETPORT:\fP -Given a program number "prog", version number "vers", and transport -protocol number "prot", this procedure returns the port number on -which the program is awaiting call requests. A port value of zeros -means the program has not been registered. The "port" field of the -argument is ignored. -.IP \fBPMAPPROC_DUMP:\fP -This procedure enumerates all entries in the port mapper's database. -The procedure takes no parameters and returns a list of program, -version, protocol, and port values. -.IP \fBPMAPPROC_CALLIT:\fP -This procedure allows a caller to call another remote procedure on -the same machine without knowing the remote procedure's port number. -It is intended for supporting broadcasts to arbitrary remote programs -via the well-known port mapper's port. The parameters "prog", -"vers", "proc", and the bytes of "args" are the program number, -version number, procedure number, and parameters of the remote -procedure. -.LP -.B Note: -.RS -.IP 1. -This procedure only sends a response if the procedure was -successfully executed and is silent (no response) otherwise. -.IP 2. -The port mapper communicates with the remote program using UDP/IP -only. -.RE -.LP -The procedure returns the remote program's port number, and the bytes -of results are the results of the remote procedure. -.bp -.NH 1 -\&References -.LP -[1] Birrell, Andrew D. & Nelson, Bruce Jay; "Implementing Remote -Procedure Calls"; XEROX CSL-83-7, October 1983. -.LP -[2] Cheriton, D.; "VMTP: Versatile Message Transaction Protocol", -Preliminary Version 0.3; Stanford University, January 1987. -.LP -[3] Diffie & Hellman; "New Directions in Cryptography"; IEEE -Transactions on Information Theory IT-22, November 1976. -.LP -[4] Harrenstien, K.; "Time Server", RFC 738; Information Sciences -Institute, October 1977. -.LP -[5] National Bureau of Standards; "Data Encryption Standard"; Federal -Information Processing Standards Publication 46, January 1977. -.LP -[6] Postel, J.; "Transmission Control Protocol - DARPA Internet -Program Protocol Specification", RFC 793; Information Sciences -Institute, September 1981. -.LP -[7] Postel, J.; "User Datagram Protocol", RFC 768; Information Sciences -Institute, August 1980. -.LP -[8] Reynolds, J. & Postel, J.; "Assigned Numbers", RFC 923; Information -Sciences Institute, October 1984. diff --git a/lib/libc/rpc/PSD.doc/rpcgen.ms b/lib/libc/rpc/PSD.doc/rpcgen.ms deleted file mode 100644 index e663e7f..0000000 --- a/lib/libc/rpc/PSD.doc/rpcgen.ms +++ /dev/null @@ -1,1301 +0,0 @@ -.\" -.\" Must use -- tbl -- for this one -.\" -.\" @(#)rpcgen.ms 2.2 88/08/04 4.0 RPCSRC -.\" $FreeBSD$ -.\" -.de BT -.if \\n%=1 .tl ''- % -'' -.. -.ND -.\" prevent excess underlining in nroff -.if n .fp 2 R -.OH '\fBrpcgen\fP Programming Guide''Page %' -.EH 'Page %''\fBrpcgen\fP Programming Guide' -.if \n%=1 .bp -.SH -\&\fBrpcgen\fP Programming Guide -.NH 0 -\&The \fBrpcgen\fP Protocol Compiler -.IX rpcgen "" \fIrpcgen\fP "" PAGE MAJOR -.LP -.IX RPC "" "" \fIrpcgen\fP -The details of programming applications to use Remote Procedure Calls -can be overwhelming. Perhaps most daunting is the writing of the XDR -routines necessary to convert procedure arguments and results into -their network format and vice-versa. -.LP -Fortunately, -.I rpcgen(1) -exists to help programmers write RPC applications simply and directly. -.I rpcgen -does most of the dirty work, allowing programmers to debug -the main features of their application, instead of requiring them to -spend most of their time debugging their network interface code. -.LP -.I rpcgen -is a compiler. It accepts a remote program interface definition written -in a language, called RPC Language, which is similar to C. It produces a C -language output which includes stub versions of the client routines, a -server skeleton, XDR filter routines for both parameters and results, and a -header file that contains common definitions. The client stubs interface -with the RPC library and effectively hide the network from their callers. -The server stub similarly hides the network from the server procedures that -are to be invoked by remote clients. -.I rpcgen 's -output files can be compiled and linked in the usual way. The developer -writes server procedures\(emin any language that observes Sun calling -conventions\(emand links them with the server skeleton produced by -.I rpcgen -to get an executable server program. To use a remote program, a programmer -writes an ordinary main program that makes local procedure calls to the -client stubs produced by -.I rpcgen . -Linking this program with -.I rpcgen 's -stubs creates an executable program. (At present the main program must be -written in C). -.I rpcgen -options can be used to suppress stub generation and to specify the transport -to be used by the server stub. -.LP -Like all compilers, -.I rpcgen -reduces development time -that would otherwise be spent coding and debugging low-level routines. -All compilers, including -.I rpcgen , -do this at a small cost in efficiency -and flexibility. However, many compilers allow escape hatches for -programmers to mix low-level code with high-level code. -.I rpcgen -is no exception. In speed-critical applications, hand-written routines -can be linked with the -.I rpcgen -output without any difficulty. Also, one may proceed by using -.I rpcgen -output as a starting point, and then rewriting it as necessary. -(If you need a discussion of RPC programming without -.I rpcgen , -see the -.I "Remote Procedure Call Programming Guide)\. -.NH 1 -\&Converting Local Procedures into Remote Procedures -.IX rpcgen "local procedures" \fIrpcgen\fP -.IX rpcgen "remote procedures" \fIrpcgen\fP -.LP -Assume an application that runs on a single machine, one which we want -to convert to run over the network. Here we will demonstrate such a -conversion by way of a simple example\(ema program that prints a -message to the console: -.ie t .DS -.el .DS L -.ft I -/* - * printmsg.c: print a message on the console - */ -.ft CW -#include - -main(argc, argv) - int argc; - char *argv[]; -{ - char *message; - - if (argc < 2) { - fprintf(stderr, "usage: %s \en", argv[0]); - exit(1); - } - message = argv[1]; - - if (!printmessage(message)) { - fprintf(stderr, "%s: couldn't print your message\en", - argv[0]); - exit(1); - } - printf("Message Delivered!\en"); - exit(0); -} -.ft I -/* - * Print a message to the console. - * Return a boolean indicating whether the message was actually printed. - */ -.ft CW -printmessage(msg) - char *msg; -{ - FILE *f; - - f = fopen("/dev/console", "w"); - if (f == NULL) { - return (0); - } - fprintf(f, "%s\en", msg); - fclose(f); - return(1); -} -.DE -.LP -And then, of course: -.ie t .DS -.el .DS L -.ft CW -example% \fBcc printmsg.c -o printmsg\fP -example% \fBprintmsg "Hello, there."\fP -Message delivered! -example% -.DE -.LP -If -.I printmessage() -was turned into a remote procedure, -then it could be called from anywhere in the network. -Ideally, one would just like to stick a keyword like -.I remote -in front of a -procedure to turn it into a remote procedure. Unfortunately, -we have to live within the constraints of the C language, since -it existed long before RPC did. But even without language -support, it's not very difficult to make a procedure remote. -.LP -In general, it's necessary to figure out what the types are for -all procedure inputs and outputs. In this case, we have a -procedure -.I printmessage() -which takes a string as input, and returns an integer -as output. Knowing this, we can write a protocol specification in RPC -language that describes the remote version of -.I printmessage (). -Here it is: -.ie t .DS -.el .DS L -.ft I -/* - * msg.x: Remote message printing protocol - */ -.ft CW - -program MESSAGEPROG { - version MESSAGEVERS { - int PRINTMESSAGE(string) = 1; - } = 1; -} = 99; -.DE -.LP -Remote procedures are part of remote programs, so we actually declared -an entire remote program here which contains the single procedure -.I PRINTMESSAGE . -This procedure was declared to be in version 1 of the -remote program. No null procedure (procedure 0) is necessary because -.I rpcgen -generates it automatically. -.LP -Notice that everything is declared with all capital letters. This is -not required, but is a good convention to follow. -.LP -Notice also that the argument type is \*Qstring\*U and not \*Qchar *\*U. This -is because a \*Qchar *\*U in C is ambiguous. Programmers usually intend it -to mean a null-terminated string of characters, but it could also -represent a pointer to a single character or a pointer to an array of -characters. In RPC language, a null-terminated string is -unambiguously called a \*Qstring\*U. -.LP -There are just two more things to write. First, there is the remote -procedure itself. Here's the definition of a remote procedure -to implement the -.I PRINTMESSAGE -procedure we declared above: -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * msg_proc.c: implementation of the remote procedure "printmessage" - */ -.ft CW - -#include -#include /* \fIalways needed\fP */ -#include "msg.h" /* \fIneed this too: msg.h will be generated by rpcgen\fP */ - -.ft I -/* - * Remote verson of "printmessage" - */ -.ft CW -int * -printmessage_1(msg) - char **msg; -{ - static int result; /* \fImust be static!\fP */ - FILE *f; - - f = fopen("/dev/console", "w"); - if (f == NULL) { - result = 0; - return (&result); - } - fprintf(f, "%s\en", *msg); - fclose(f); - result = 1; - return (&result); -} -.vs -.DE -.LP -Notice here that the declaration of the remote procedure -.I printmessage_1() -differs from that of the local procedure -.I printmessage() -in three ways: -.IP 1. -It takes a pointer to a string instead of a string itself. This -is true of all remote procedures: they always take pointers to their -arguments rather than the arguments themselves. -.IP 2. -It returns a pointer to an integer instead of an integer itself. This is -also generally true of remote procedures: they always return a pointer -to their results. -.IP 3. -It has an \*Q_1\*U appended to its name. In general, all remote -procedures called by -.I rpcgen -are named by the following rule: the name in the program definition -(here -.I PRINTMESSAGE ) -is converted to all -lower-case letters, an underbar (\*Q_\*U) is appended to it, and -finally the version number (here 1) is appended. -.LP -The last thing to do is declare the main client program that will call -the remote procedure. Here it is: -.ie t .DS -.el .DS L -.ft I -/* - * rprintmsg.c: remote version of "printmsg.c" - */ -.ft CW -#include -#include /* \fIalways needed\fP */ -#include "msg.h" /* \fIneed this too: msg.h will be generated by rpcgen\fP */ - -main(argc, argv) - int argc; - char *argv[]; -{ - CLIENT *cl; - int *result; - char *server; - char *message; - - if (argc < 3) { - fprintf(stderr, "usage: %s host message\en", argv[0]); - exit(1); - } - -.ft I - /* - * Save values of command line arguments - */ -.ft CW - server = argv[1]; - message = argv[2]; - -.ft I - /* - * Create client "handle" used for calling \fIMESSAGEPROG\fP on the - * server designated on the command line. We tell the RPC package - * to use the "tcp" protocol when contacting the server. - */ -.ft CW - cl = clnt_create(server, MESSAGEPROG, MESSAGEVERS, "tcp"); - if (cl == NULL) { -.ft I - /* - * Couldn't establish connection with server. - * Print error message and die. - */ -.ft CW - clnt_pcreateerror(server); - exit(1); - } - -.ft I - /* - * Call the remote procedure "printmessage" on the server - */ -.ft CW - result = printmessage_1(&message, cl); - if (result == NULL) { -.ft I - /* - * An error occurred while calling the server. - * Print error message and die. - */ -.ft CW - clnt_perror(cl, server); - exit(1); - } - -.ft I - /* - * Okay, we successfully called the remote procedure. - */ -.ft CW - if (*result == 0) { -.ft I - /* - * Server was unable to print our message. - * Print error message and die. - */ -.ft CW - fprintf(stderr, "%s: %s couldn't print your message\en", - argv[0], server); - exit(1); - } - -.ft I - /* - * The message got printed on the server's console - */ -.ft CW - printf("Message delivered to %s!\en", server); -} -.DE -There are two things to note here: -.IP 1. -.IX "client handle, used by rpcgen" "" "client handle, used by \fIrpcgen\fP" -First a client \*Qhandle\*U is created using the RPC library routine -.I clnt_create (). -This client handle will be passed to the stub routines -which call the remote procedure. -.IP 2. -The remote procedure -.I printmessage_1() -is called exactly the same way as it is declared in -.I msg_proc.c -except for the inserted client handle as the first argument. -.LP -Here's how to put all of the pieces together: -.ie t .DS -.el .DS L -.ft CW -example% \fBrpcgen msg.x\fP -example% \fBcc rprintmsg.c msg_clnt.c -o rprintmsg\fP -example% \fBcc msg_proc.c msg_svc.c -o msg_server\fP -.DE -Two programs were compiled here: the client program -.I rprintmsg -and the server program -.I msg_server . -Before doing this though, -.I rpcgen -was used to fill in the missing pieces. -.LP -Here is what -.I rpcgen -did with the input file -.I msg.x : -.IP 1. -It created a header file called -.I msg.h -that contained -.I #define 's -for -.I MESSAGEPROG , -.I MESSAGEVERS -and -.I PRINTMESSAGE -for use in the other modules. -.IP 2. -It created client \*Qstub\*U routines in the -.I msg_clnt.c -file. In this case there is only one, the -.I printmessage_1() -that was referred to from the -.I printmsg -client program. The name of the output file for -client stub routines is always formed in this way: if the name of the -input file is -.I FOO.x , -the client stubs output file is called -.I FOO_clnt.c . -.IP 3. -It created the server program which calls -.I printmessage_1() -in -.I msg_proc.c . -This server program is named -.I msg_svc.c . -The rule for naming the server output file is similar to the -previous one: for an input file called -.I FOO.x , -the output server file is named -.I FOO_svc.c . -.LP -Now we're ready to have some fun. First, copy the server to a -remote machine and run it. For this example, the -machine is called \*Qmoon\*U. Server processes are run in the -background, because they never exit. -.ie t .DS -.el .DS L -.ft CW -moon% \fBmsg_server &\fP -.DE -Then on our local machine (\*Qsun\*U) we can print a message on \*Qmoon\*Us -console. -.ie t .DS -.el .DS L -.ft CW -sun% \fBprintmsg moon "Hello, moon."\fP -.DE -The message will get printed to \*Qmoon\*Us console. You can print a -message on anybody's console (including your own) with this program if -you are able to copy the server to their machine and run it. -.NH 1 -\&Generating XDR Routines -.IX RPC "generating XDR routines" -.LP -The previous example only demonstrated the automatic generation of -client and server RPC code. -.I rpcgen -may also be used to generate XDR routines, that is, the routines -necessary to convert local data -structures into network format and vice-versa. This example presents -a complete RPC service\(ema remote directory listing service, which uses -.I rpcgen -not only to generate stub routines, but also to generate the XDR -routines. Here is the protocol description file: -.ie t .DS -.el .DS L -.ft I -/* - * dir.x: Remote directory listing protocol - */ -.ft CW -const MAXNAMELEN = 255; /* \fImaximum length of a directory entry\fP */ - -typedef string nametype; /* \fIa directory entry\fP */ - -typedef struct namenode *namelist; /* \fIa link in the listing\fP */ - -.ft I -/* - * A node in the directory listing - */ -.ft CW -struct namenode { - nametype name; /* \fIname of directory entry\fP */ - namelist next; /* \fInext entry\fP */ -}; - -.ft I -/* - * The result of a READDIR operation. - */ -.ft CW -union readdir_res switch (int errno) { -case 0: - namelist list; /* \fIno error: return directory listing\fP */ -default: - void; /* \fIerror occurred: nothing else to return\fP */ -}; - -.ft I -/* - * The directory program definition - */ -.ft CW -program DIRPROG { - version DIRVERS { - readdir_res - READDIR(nametype) = 1; - } = 1; -} = 76; -.DE -.SH -Note: -.I -Types (like -.I readdir_res -in the example above) can be defined using -the \*Qstruct\*U, \*Qunion\*U and \*Qenum\*U keywords, but those keywords -should not be used in subsequent declarations of variables of those types. -For example, if you define a union \*Qfoo\*U, you should declare using -only \*Qfoo\*U and not \*Qunion foo\*U. In fact, -.I rpcgen -compiles -RPC unions into C structures and it is an error to declare them using the -\*Qunion\*U keyword. -.LP -Running -.I rpcgen -on -.I dir.x -creates four output files. Three are the same as before: header file, -client stub routines and server skeleton. The fourth are the XDR routines -necessary for converting the data types we declared into XDR format and -vice-versa. These are output in the file -.I dir_xdr.c . -.LP -Here is the implementation of the -.I READDIR -procedure. -.ie t .DS -.el .DS L -.vs 11 -.ft I -/* - * dir_proc.c: remote readdir implementation - */ -.ft CW -#include -#include -#include "dir.h" - -extern int errno; -extern char *malloc(); -extern char *strdup(); - -readdir_res * -readdir_1(dirname) - nametype *dirname; -{ - DIR *dirp; - struct direct *d; - namelist nl; - namelist *nlp; - static readdir_res res; /* \fImust be static\fP! */ - -.ft I - /* - * Open directory - */ -.ft CW - dirp = opendir(*dirname); - if (dirp == NULL) { - res.errno = errno; - return (&res); - } - -.ft I - /* - * Free previous result - */ -.ft CW - xdr_free(xdr_readdir_res, &res); - -.ft I - /* - * Collect directory entries. - * Memory allocated here will be freed by \fIxdr_free\fP - * next time \fIreaddir_1\fP is called - */ -.ft CW - nlp = &res.readdir_res_u.list; - while (d = readdir(dirp)) { - nl = *nlp = (namenode *) malloc(sizeof(namenode)); - nl->name = strdup(d->d_name); - nlp = &nl->next; - } - *nlp = NULL; - -.ft I - /* - * Return the result - */ -.ft CW - res.errno = 0; - closedir(dirp); - return (&res); -} -.vs -.DE -Finally, there is the client side program to call the server: -.ie t .DS -.el .DS L -.ft I -/* - * rls.c: Remote directory listing client - */ -.ft CW -#include -#include /* \fIalways need this\fP */ -#include "dir.h" /* \fIwill be generated by rpcgen\fP */ - -extern int errno; - -main(argc, argv) - int argc; - char *argv[]; -{ - CLIENT *cl; - char *server; - char *dir; - readdir_res *result; - namelist nl; - - - if (argc != 3) { - fprintf(stderr, "usage: %s host directory\en", - argv[0]); - exit(1); - } - -.ft I - /* - * Remember what our command line arguments refer to - */ -.ft CW - server = argv[1]; - dir = argv[2]; - -.ft I - /* - * Create client "handle" used for calling \fIMESSAGEPROG\fP on the - * server designated on the command line. We tell the RPC package - * to use the "tcp" protocol when contacting the server. - */ -.ft CW - cl = clnt_create(server, DIRPROG, DIRVERS, "tcp"); - if (cl == NULL) { -.ft I - /* - * Couldn't establish connection with server. - * Print error message and die. - */ -.ft CW - clnt_pcreateerror(server); - exit(1); - } - -.ft I - /* - * Call the remote procedure \fIreaddir\fP on the server - */ -.ft CW - result = readdir_1(&dir, cl); - if (result == NULL) { -.ft I - /* - * An error occurred while calling the server. - * Print error message and die. - */ -.ft CW - clnt_perror(cl, server); - exit(1); - } - -.ft I - /* - * Okay, we successfully called the remote procedure. - */ -.ft CW - if (result->errno != 0) { -.ft I - /* - * A remote system error occurred. - * Print error message and die. - */ -.ft CW - errno = result->errno; - perror(dir); - exit(1); - } - -.ft I - /* - * Successfully got a directory listing. - * Print it out. - */ -.ft CW - for (nl = result->readdir_res_u.list; nl != NULL; - nl = nl->next) { - printf("%s\en", nl->name); - } - exit(0); -} -.DE -Compile everything, and run. -.DS -.ft CW -sun% \fBrpcgen dir.x\fP -sun% \fBcc rls.c dir_clnt.c dir_xdr.c -o rls\fP -sun% \fBcc dir_svc.c dir_proc.c dir_xdr.c -o dir_svc\fP - -sun% \fBdir_svc &\fP - -moon% \fBrls sun /usr/pub\fP -\&. -\&.. -ascii -eqnchar -greek -kbd -marg8 -tabclr -tabs -tabs4 -moon% -.DE -.LP -.IX "debugging with rpcgen" "" "debugging with \fIrpcgen\fP" -A final note about -.I rpcgen : -The client program and the server procedure can be tested together -as a single program by simply linking them with each other rather -than with the client and server stubs. The procedure calls will be -executed as ordinary local procedure calls and the program can be -debugged with a local debugger such as -.I dbx . -When the program is working, the client program can be linked to -the client stub produced by -.I rpcgen -and the server procedures can be linked to the server stub produced -by -.I rpcgen . -.SH -.I NOTE : -\fIIf you do this, you may want to comment out calls to RPC library -routines, and have client-side routines call server routines -directly.\fP -.LP -.NH 1 -\&The C-Preprocessor -.IX rpcgen "C-preprocessor" \fIrpcgen\fP -.LP -The C-preprocessor is run on all input files before they are -compiled, so all the preprocessor directives are legal within a \*Q.x\*U -file. Four symbols may be defined, depending upon which output file is -getting generated. The symbols are: -.TS -box tab (&); -lfI lfI -lfL l . -Symbol&Usage -_ -RPC_HDR&for header-file output -RPC_XDR&for XDR routine output -RPC_SVC&for server-skeleton output -RPC_CLNT&for client stub output -.TE -.LP -Also, -.I rpcgen -does a little preprocessing of its own. Any line that -begins with a percent sign is passed directly into the output file, -without any interpretation of the line. Here is a simple example that -demonstrates the preprocessing features. -.ie t .DS -.el .DS L -.ft I -/* - * time.x: Remote time protocol - */ -.ft CW -program TIMEPROG { - version TIMEVERS { - unsigned int TIMEGET(void) = 1; - } = 1; -} = 44; - -#ifdef RPC_SVC -%int * -%timeget_1() -%{ -% static int thetime; -% -% thetime = time(0); -% return (&thetime); -%} -#endif -.DE -The '%' feature is not generally recommended, as there is no guarantee -that the compiler will stick the output where you intended. -.NH 1 -\&\fBrpcgen\fP Programming Notes -.IX rpcgen "other operations" \fIrpcgen\fP -.sp -.NH 2 -\&Timeout Changes -.IX rpcgen "timeout changes" \fIrpcgen\fP -.LP -RPC sets a default timeout of 25 seconds for RPC calls when -.I clnt_create() -is used. This timeout may be changed using -.I clnt_control() -Here is a small code fragment to demonstrate use of -.I clnt_control (): -.ID -struct timeval tv; -CLIENT *cl; -.sp .5 -cl = clnt_create("somehost", SOMEPROG, SOMEVERS, "tcp"); -if (cl == NULL) { - exit(1); -} -tv.tv_sec = 60; /* \fIchange timeout to 1 minute\fP */ -tv.tv_usec = 0; -clnt_control(cl, CLSET_TIMEOUT, &tv); -.DE -.NH 2 -\&Handling Broadcast on the Server Side -.IX "broadcast RPC" -.IX rpcgen "broadcast RPC" \fIrpcgen\fP -.LP -When a procedure is known to be called via broadcast RPC, -it is usually wise for the server to not reply unless it can provide -some useful information to the client. This prevents the network -from getting flooded by useless replies. -.LP -To prevent the server from replying, a remote procedure can -return NULL as its result, and the server code generated by -.I rpcgen -will detect this and not send out a reply. -.LP -Here is an example of a procedure that replies only if it -thinks it is an NFS server: -.ID -void * -reply_if_nfsserver() -{ - char notnull; /* \fIjust here so we can use its address\fP */ -.sp .5 - if (access("/etc/exports", F_OK) < 0) { - return (NULL); /* \fIprevent RPC from replying\fP */ - } -.ft I - /* - * return non-null pointer so RPC will send out a reply - */ -.ft L - return ((void *)¬null); -} -.DE -Note that if procedure returns type \*Qvoid *\*U, they must return a non-NULL -pointer if they want RPC to reply for them. -.NH 2 -\&Other Information Passed to Server Procedures -.LP -Server procedures will often want to know more about an RPC call -than just its arguments. For example, getting authentication information -is important to procedures that want to implement some level of security. -This extra information is actually supplied to the server procedure as a -second argument. Here is an example to demonstrate its use. What we've -done here is rewrite the previous -.I printmessage_1() -procedure to only allow root users to print a message to the console. -.ID -int * -printmessage_1(msg, rq) - char **msg; - struct svc_req *rq; -{ - static in result; /* \fIMust be static\fP */ - FILE *f; - struct suthunix_parms *aup; -.sp .5 - aup = (struct authunix_parms *)rq->rq_clntcred; - if (aup->aup_uid != 0) { - result = 0; - return (&result); - } -.sp -.ft I - /* - * Same code as before. - */ -.ft L -} -.DE -.NH 1 -\&RPC Language -.IX RPCL -.IX rpcgen "RPC Language" \fIrpcgen\fP -.LP -RPC language is an extension of XDR language. The sole extension is -the addition of the -.I program -type. For a complete description of the XDR language syntax, see the -.I "External Data Representation Standard: Protocol Specification" -chapter. For a description of the RPC extensions to the XDR language, -see the -.I "Remote Procedure Calls: Protocol Specification" -chapter. -.LP -However, XDR language is so close to C that if you know C, you know most -of it already. We describe here the syntax of the RPC language, -showing a few examples along the way. We also show how the various -RPC and XDR type definitions get compiled into C type definitions in -the output header file. -.KS -.NH 2 -Definitions -\& -.IX rpcgen definitions \fIrpcgen\fP -.LP -An RPC language file consists of a series of definitions. -.DS L -.ft CW - definition-list: - definition ";" - definition ";" definition-list -.DE -.KE -It recognizes five types of definitions. -.DS L -.ft CW - definition: - enum-definition - struct-definition - union-definition - typedef-definition - const-definition - program-definition -.DE -.NH 2 -Structures -\& -.IX rpcgen structures \fIrpcgen\fP -.LP -An XDR struct is declared almost exactly like its C counterpart. It -looks like the following: -.DS L -.ft CW - struct-definition: - "struct" struct-ident "{" - declaration-list - "}" - - declaration-list: - declaration ";" - declaration ";" declaration-list -.DE -As an example, here is an XDR structure to a two-dimensional -coordinate, and the C structure that it gets compiled into in the -output header file. -.DS -.ft CW - struct coord { struct coord { - int x; --> int x; - int y; int y; - }; }; - typedef struct coord coord; -.DE -The output is identical to the input, except for the added -.I typedef -at the end of the output. This allows one to use \*Qcoord\*U instead of -\*Qstruct coord\*U when declaring items. -.NH 2 -Unions -\& -.IX rpcgen unions \fIrpcgen\fP -.LP -XDR unions are discriminated unions, and look quite different from C -unions. They are more analogous to Pascal variant records than they -are to C unions. -.DS L -.ft CW - union-definition: - "union" union-ident "switch" "(" declaration ")" "{" - case-list - "}" - - case-list: - "case" value ":" declaration ";" - "default" ":" declaration ";" - "case" value ":" declaration ";" case-list -.DE -Here is an example of a type that might be returned as the result of a -\*Qread data\*U operation. If there is no error, return a block of data. -Otherwise, don't return anything. -.DS L -.ft CW - union read_result switch (int errno) { - case 0: - opaque data[1024]; - default: - void; - }; -.DE -It gets compiled into the following: -.DS L -.ft CW - struct read_result { - int errno; - union { - char data[1024]; - } read_result_u; - }; - typedef struct read_result read_result; -.DE -Notice that the union component of the output struct has the name as -the type name, except for the trailing \*Q_u\*U. -.NH 2 -Enumerations -\& -.IX rpcgen enumerations \fIrpcgen\fP -.LP -XDR enumerations have the same syntax as C enumerations. -.DS L -.ft CW - enum-definition: - "enum" enum-ident "{" - enum-value-list - "}" - - enum-value-list: - enum-value - enum-value "," enum-value-list - - enum-value: - enum-value-ident - enum-value-ident "=" value -.DE -Here is a short example of an XDR enum, and the C enum that it gets -compiled into. -.DS L -.ft CW - enum colortype { enum colortype { - RED = 0, RED = 0, - GREEN = 1, --> GREEN = 1, - BLUE = 2 BLUE = 2, - }; }; - typedef enum colortype colortype; -.DE -.NH 2 -Typedef -\& -.IX rpcgen typedef \fIrpcgen\fP -.LP -XDR typedefs have the same syntax as C typedefs. -.DS L -.ft CW - typedef-definition: - "typedef" declaration -.DE -Here is an example that defines a -.I fname_type -used for declaring -file name strings that have a maximum length of 255 characters. -.DS L -.ft CW -typedef string fname_type<255>; --> typedef char *fname_type; -.DE -.NH 2 -Constants -\& -.IX rpcgen constants \fIrpcgen\fP -.LP -XDR constants symbolic constants that may be used wherever a -integer constant is used, for example, in array size specifications. -.DS L -.ft CW - const-definition: - "const" const-ident "=" integer -.DE -For example, the following defines a constant -.I DOZEN -equal to 12. -.DS L -.ft CW - const DOZEN = 12; --> #define DOZEN 12 -.DE -.NH 2 -Programs -\& -.IX rpcgen programs \fIrpcgen\fP -.LP -RPC programs are declared using the following syntax: -.DS L -.ft CW - program-definition: - "program" program-ident "{" - version-list - "}" "=" value - - version-list: - version ";" - version ";" version-list - - version: - "version" version-ident "{" - procedure-list - "}" "=" value - - procedure-list: - procedure ";" - procedure ";" procedure-list - - procedure: - type-ident procedure-ident "(" type-ident ")" "=" value -.DE -For example, here is the time protocol, revisited: -.ie t .DS -.el .DS L -.ft I -/* - * time.x: Get or set the time. Time is represented as number of seconds - * since 0:00, January 1, 1970. - */ -.ft CW -program TIMEPROG { - version TIMEVERS { - unsigned int TIMEGET(void) = 1; - void TIMESET(unsigned) = 2; - } = 1; -} = 44; -.DE -This file compiles into #defines in the output header file: -.ie t .DS -.el .DS L -.ft CW -#define TIMEPROG 44 -#define TIMEVERS 1 -#define TIMEGET 1 -#define TIMESET 2 -.DE -.NH 2 -Declarations -\& -.IX rpcgen declarations \fIrpcgen\fP -.LP -In XDR, there are only four kinds of declarations. -.DS L -.ft CW - declaration: - simple-declaration - fixed-array-declaration - variable-array-declaration - pointer-declaration -.DE -\fB1) Simple declarations\fP are just like simple C declarations. -.DS L -.ft CW - simple-declaration: - type-ident variable-ident -.DE -Example: -.DS L -.ft CW - colortype color; --> colortype color; -.DE -\fB2) Fixed-length Array Declarations\fP are just like C array declarations: -.DS L -.ft CW - fixed-array-declaration: - type-ident variable-ident "[" value "]" -.DE -Example: -.DS L -.ft CW - colortype palette[8]; --> colortype palette[8]; -.DE -\fB3) Variable-Length Array Declarations\fP have no explicit syntax -in C, so XDR invents its own using angle-brackets. -.DS L -.ft CW -variable-array-declaration: - type-ident variable-ident "<" value ">" - type-ident variable-ident "<" ">" -.DE -The maximum size is specified between the angle brackets. The size may -be omitted, indicating that the array may be of any size. -.DS L -.ft CW - int heights<12>; /* \fIat most 12 items\fP */ - int widths<>; /* \fIany number of items\fP */ -.DE -Since variable-length arrays have no explicit syntax in C, these -declarations are actually compiled into \*Qstruct\*Us. For example, the -\*Qheights\*U declaration gets compiled into the following struct: -.DS L -.ft CW - struct { - u_int heights_len; /* \fI# of items in array\fP */ - int *heights_val; /* \fIpointer to array\fP */ - } heights; -.DE -Note that the number of items in the array is stored in the \*Q_len\*U -component and the pointer to the array is stored in the \*Q_val\*U -component. The first part of each of these component's names is the -same as the name of the declared XDR variable. -.LP -\fB4) Pointer Declarations\fP are made in -XDR exactly as they are in C. You can't -really send pointers over the network, but you can use XDR pointers -for sending recursive data types such as lists and trees. The type is -actually called \*Qoptional-data\*U, not \*Qpointer\*U, in XDR language. -.DS L -.ft CW - pointer-declaration: - type-ident "*" variable-ident -.DE -Example: -.DS L -.ft CW - listitem *next; --> listitem *next; -.DE -.NH 2 -\&Special Cases -.IX rpcgen "special cases" \fIrpcgen\fP -.LP -There are a few exceptions to the rules described above. -.LP -.B Booleans: -C has no built-in boolean type. However, the RPC library does a -boolean type called -.I bool_t -that is either -.I TRUE -or -.I FALSE . -Things declared as type -.I bool -in XDR language are compiled into -.I bool_t -in the output header file. -.LP -Example: -.DS L -.ft CW - bool married; --> bool_t married; -.DE -.B Strings: -C has no built-in string type, but instead uses the null-terminated -\*Qchar *\*U convention. In XDR language, strings are declared using the -\*Qstring\*U keyword, and compiled into \*Qchar *\*Us in the output header -file. The maximum size contained in the angle brackets specifies the -maximum number of characters allowed in the strings (not counting the -.I NULL -character). The maximum size may be left off, indicating a string -of arbitrary length. -.LP -Examples: -.DS L -.ft CW - string name<32>; --> char *name; - string longname<>; --> char *longname; -.DE -.B "Opaque Data:" -Opaque data is used in RPC and XDR to describe untyped data, that is, -just sequences of arbitrary bytes. It may be declared either as a -fixed or variable length array. -.DS L -Examples: -.ft CW - opaque diskblock[512]; --> char diskblock[512]; - - opaque filedata<1024>; --> struct { - u_int filedata_len; - char *filedata_val; - } filedata; -.DE -.B Voids: -In a void declaration, the variable is not named. The declaration is -just \*Qvoid\*U and nothing else. Void declarations can only occur in two -places: union definitions and program definitions (as the argument or -result of a remote procedure). diff --git a/lib/libc/rpc/PSD.doc/stubs b/lib/libc/rpc/PSD.doc/stubs deleted file mode 100644 index 78b0a2c..0000000 --- a/lib/libc/rpc/PSD.doc/stubs +++ /dev/null @@ -1,3 +0,0 @@ -.\" $FreeBSD$ -.\" -.if t .ftr L CR diff --git a/lib/libc/rpc/PSD.doc/xdr.nts.ms b/lib/libc/rpc/PSD.doc/xdr.nts.ms deleted file mode 100644 index 260c7f3..0000000 --- a/lib/libc/rpc/PSD.doc/xdr.nts.ms +++ /dev/null @@ -1,1968 +0,0 @@ -.\" -.\" Must use -- eqn -- with this one -.\" -.\" @(#)xdr.nts.ms 2.2 88/08/05 4.0 RPCSRC -.\" $FreeBSD$ -.\" -.EQ -delim $$ -.EN -.de BT -.if \\n%=1 .tl ''- % -'' -.. -.ND -.\" prevent excess underlining in nroff -.if n .fp 2 R -.OH 'External Data Representation: Sun Technical Notes''Page %' -.EH 'Page %''External Data Representation: Sun Technical Notes' -.if \n%=1 .bp -.SH -\&External Data Representation: Sun Technical Notes -.IX XDR "Sun technical notes" -.LP -This chapter contains technical notes on Sun's implementation of the -External Data Representation (XDR) standard, a set of library routines -that allow a C programmer to describe arbitrary data structures in a -machinex-independent fashion. -For a formal specification of the XDR -standard, see the -.I "External Data Representation Standard: Protocol Specification". -XDR is the backbone of Sun's Remote Procedure Call package, in the -sense that data for remote procedure calls is transmitted using the -standard. XDR library routines should be used to transmit data -that is accessed (read or written) by more than one type of machine.\** -.FS -.IX XDR "system routines" -For a compete specification of the system External Data Representation -routines, see the -.I xdr(3N) -manual page. -.FE -.LP -This chapter contains a short tutorial overview of the XDR library -routines, a guide to accessing currently available XDR streams, and -information on defining new streams and data types. XDR was designed -to work across different languages, operating systems, and machine -architectures. Most users (particularly RPC users) will only need -the information in the -.I "Number Filters", -.I "Floating Point Filters", -and -.I "Enumeration Filters" -sections. -Programmers wishing to implement RPC and XDR on new machines -will be interested in the rest of the chapter, as well as the -.I "External Data Representaiton Standard: Protocol Specification", -which will be their primary reference. -.SH -Note: -.I -.I rpcgen -can be used to write XDR routines even in cases where no RPC calls are -being made. -.LP -On Sun systems, -C programs that want to use XDR routines -must include the file -.I , -which contains all the necessary interfaces to the XDR system. -Since the C library -.I libc.a -contains all the XDR routines, -compile as normal. -.DS -example% \fBcc\0\fIprogram\fP.c\fI -.DE -.ne 3i -.NH 0 -\&Justification -.IX XDR justification -.LP -Consider the following two programs, -.I writer : -.ie t .DS -.el .DS L -.ft CW -#include -.sp .5 -main() /* \fIwriter.c\fP */ -{ - long i; -.sp .5 - for (i = 0; i < 8; i++) { - if (fwrite((char *)&i, sizeof(i), 1, stdout) != 1) { - fprintf(stderr, "failed!\en"); - exit(1); - } - } - exit(0); -} -.DE -and -.I reader : -.ie t .DS -.el .DS L -.ft CW -#include -.sp .5 -main() /* \fIreader.c\fP */ -{ - long i, j; -.sp .5 - for (j = 0; j < 8; j++) { - if (fread((char *)&i, sizeof (i), 1, stdin) != 1) { - fprintf(stderr, "failed!\en"); - exit(1); - } - printf("%ld ", i); - } - printf("\en"); - exit(0); -} -.DE -The two programs appear to be portable, because (a) they pass -.I lint -checking, and (b) they exhibit the same behavior when executed -on two different hardware architectures, a Sun and a VAX. -.LP -Piping the output of the -.I writer -program to the -.I reader -program gives identical results on a Sun or a VAX. -.DS -.ft CW -sun% \fBwriter | reader\fP -0 1 2 3 4 5 6 7 -sun% - - -vax% \fBwriter | reader\fP -0 1 2 3 4 5 6 7 -vax% -.DE -With the advent of local area networks and 4.2BSD came the concept -of \*Qnetwork pipes\*U \(em a process produces data on one machine, -and a second process consumes data on another machine. -A network pipe can be constructed with -.I writer -and -.I reader . -Here are the results if the first produces data on a Sun, -and the second consumes data on a VAX. -.DS -.ft CW -sun% \fBwriter | rsh vax reader\fP -0 16777216 33554432 50331648 67108864 83886080 100663296 -117440512 -sun% -.DE -Identical results can be obtained by executing -.I writer -on the VAX and -.I reader -on the Sun. These results occur because the byte ordering -of long integers differs between the VAX and the Sun, -even though word size is the same. -Note that $16777216$ is $2 sup 24$ \(em -when four bytes are reversed, the 1 winds up in the 24th bit. -.LP -Whenever data is shared by two or more machine types, there is -a need for portable data. Programs can be made data-portable by -replacing the -.I read() -and -.I write() -calls with calls to an XDR library routine -.I xdr_long() , -a filter that knows the standard representation -of a long integer in its external form. -Here are the revised versions of -.I writer : -.ie t .DS -.el .DS L -.ft CW -#include -#include /* \fIxdr is a sub-library of rpc\fP */ -.sp .5 -main() /* \fIwriter.c\fP */ -{ - XDR xdrs; - long i; -.sp .5 - xdrstdio_create(&xdrs, stdout, XDR_ENCODE); - for (i = 0; i < 8; i++) { - if (!xdr_long(&xdrs, &i)) { - fprintf(stderr, "failed!\en"); - exit(1); - } - } - exit(0); -} -.DE -and -.I reader : -.ie t .DS -.el .DS L -.ft CW -#include -#include /* \fIxdr is a sub-library of rpc\fP */ -.sp .5 -main() /* \fIreader.c\fP */ -{ - XDR xdrs; - long i, j; -.sp .5 - xdrstdio_create(&xdrs, stdin, XDR_DECODE); - for (j = 0; j < 8; j++) { - if (!xdr_long(&xdrs, &i)) { - fprintf(stderr, "failed!\en"); - exit(1); - } - printf("%ld ", i); - } - printf("\en"); - exit(0); -} -.DE -The new programs were executed on a Sun, -on a VAX, and from a Sun to a VAX; -the results are shown below. -.DS -.ft CW -sun% \fBwriter | reader\fP -0 1 2 3 4 5 6 7 -sun% - -vax% \fBwriter | reader\fP -0 1 2 3 4 5 6 7 -vax% - -sun% \fBwriter | rsh vax reader\fP -0 1 2 3 4 5 6 7 -sun% -.DE -.SH -Note: -.I -.IX XDR "portable data" -Integers are just the tip of the portable-data iceberg. Arbitrary -data structures present portability problems, particularly with -respect to alignment and pointers. Alignment on word boundaries -may cause the size of a structure to vary from machine to machine. -And pointers, which are very convenient to use, have no meaning -outside the machine where they are defined. -.LP -.NH 1 -\&A Canonical Standard -.IX XDR "canonical standard" -.LP -XDR's approach to standardizing data representations is -.I canonical . -That is, XDR defines a single byte order (Big Endian), a single -floating-point representation (IEEE), and so on. Any program running on -any machine can use XDR to create portable data by translating its -local representation to the XDR standard representations; similarly, any -program running on any machine can read portable data by translating the -XDR standard representaions to its local equivalents. The single standard -completely decouples programs that create or send portable data from those -that use or receive portable data. The advent of a new machine or a new -language has no effect upon the community of existing portable data creators -and users. A new machine joins this community by being \*Qtaught\*U how to -convert the standard representations and its local representations; the -local representations of other machines are irrelevant. Conversely, to -existing programs running on other machines, the local representations of -the new machine are also irrelevant; such programs can immediately read -portable data produced by the new machine because such data conforms to the -canonical standards that they already understand. -.LP -There are strong precedents for XDR's canonical approach. For example, -TCP/IP, UDP/IP, XNS, Ethernet, and, indeed, all protocols below layer five -of the ISO model, are canonical protocols. The advantage of any canonical -approach is simplicity; in the case of XDR, a single set of conversion -routines is written once and is never touched again. The canonical approach -has a disadvantage, but it is unimportant in real-world data transfer -applications. Suppose two Little-Endian machines are transferring integers -according to the XDR standard. The sending machine converts the integers -from Little-Endian byte order to XDR (Big-Endian) byte order; the receiving -machine performs the reverse conversion. Because both machines observe the -same byte order, their conversions are unnecessary. The point, however, is -not necessity, but cost as compared to the alternative. -.LP -The time spent converting to and from a canonical representation is -insignificant, especially in networking applications. Most of the time -required to prepare a data structure for transfer is not spent in conversion -but in traversing the elements of the data structure. To transmit a tree, -for example, each leaf must be visited and each element in a leaf record must -be copied to a buffer and aligned there; storage for the leaf may have to be -deallocated as well. Similarly, to receive a tree, storage must be -allocated for each leaf, data must be moved from the buffer to the leaf and -properly aligned, and pointers must be constructed to link the leaves -together. Every machine pays the cost of traversing and copying data -structures whether or not conversion is required. In networking -applications, communications overhead\(emthe time required to move the data -down through the sender's protocol layers, across the network and up through -the receiver's protocol layers\(emdwarfs conversion overhead. -.NH 1 -\&The XDR Library -.IX "XDR" "library" -.LP -The XDR library not only solves data portability problems, it also -allows you to write and read arbitrary C constructs in a consistent, -specified, well-documented manner. Thus, it can make sense to use the -library even when the data is not shared among machines on a network. -.LP -The XDR library has filter routines for -strings (null-terminated arrays of bytes), -structures, unions, and arrays, to name a few. -Using more primitive routines, -you can write your own specific XDR routines -to describe arbitrary data structures, -including elements of arrays, arms of unions, -or objects pointed at from other structures. -The structures themselves may contain arrays of arbitrary elements, -or pointers to other structures. -.LP -Let's examine the two programs more closely. -There is a family of XDR stream creation routines -in which each member treats the stream of bits differently. -In our example, data is manipulated using standard I/O routines, -so we use -.I xdrstdio_create (). -.IX xdrstdio_create() "" "\fIxdrstdio_create()\fP" -The parameters to XDR stream creation routines -vary according to their function. -In our example, -.I xdrstdio_create() -takes a pointer to an XDR structure that it initializes, -a pointer to a -.I FILE -that the input or output is performed on, and the operation. -The operation may be -.I XDR_ENCODE -for serializing in the -.I writer -program, or -.I XDR_DECODE -for deserializing in the -.I reader -program. -.LP -Note: RPC users never need to create XDR streams; -the RPC system itself creates these streams, -which are then passed to the users. -.LP -The -.I xdr_long() -.IX xdr_long() "" "\fIxdr_long()\fP" -primitive is characteristic of most XDR library -primitives and all client XDR routines. -First, the routine returns -.I FALSE -(0) if it fails, and -.I TRUE -(1) if it succeeds. -Second, for each data type, -.I xxx , -there is an associated XDR routine of the form: -.DS -.ft CW -xdr_xxx(xdrs, xp) - XDR *xdrs; - xxx *xp; -{ -} -.DE -In our case, -.I xxx -is long, and the corresponding XDR routine is -a primitive, -.I xdr_long() . -The client could also define an arbitrary structure -.I xxx -in which case the client would also supply the routine -.I xdr_xxx (), -describing each field by calling XDR routines -of the appropriate type. -In all cases the first parameter, -.I xdrs -can be treated as an opaque handle, -and passed to the primitive routines. -.LP -XDR routines are direction independent; -that is, the same routines are called to serialize or deserialize data. -This feature is critical to software engineering of portable data. -The idea is to call the same routine for either operation \(em -this almost guarantees that serialized data can also be deserialized. -One routine is used by both producer and consumer of networked data. -This is implemented by always passing the address -of an object rather than the object itself \(em -only in the case of deserialization is the object modified. -This feature is not shown in our trivial example, -but its value becomes obvious when nontrivial data structures -are passed among machines. -If needed, the user can obtain the -direction of the XDR operation. -See the -.I "XDR Operation Directions" -section below for details. -.LP -Let's look at a slightly more complicated example. -Assume that a person's gross assets and liabilities -are to be exchanged among processes. -Also assume that these values are important enough -to warrant their own data type: -.ie t .DS -.el .DS L -.ft CW -struct gnumbers { - long g_assets; - long g_liabilities; -}; -.DE -The corresponding XDR routine describing this structure would be: -.ie t .DS -.el .DS L -.ft CW -bool_t /* \fITRUE is success, FALSE is failure\fP */ -xdr_gnumbers(xdrs, gp) - XDR *xdrs; - struct gnumbers *gp; -{ - if (xdr_long(xdrs, &gp->g_assets) && - xdr_long(xdrs, &gp->g_liabilities)) - return(TRUE); - return(FALSE); -} -.DE -Note that the parameter -.I xdrs -is never inspected or modified; -it is only passed on to the subcomponent routines. -It is imperative to inspect the return value of each XDR routine call, -and to give up immediately and return -.I FALSE -if the subroutine fails. -.LP -This example also shows that the type -.I bool_t -is declared as an integer whose only values are -.I TRUE -(1) and -.I FALSE -(0). This document uses the following definitions: -.ie t .DS -.el .DS L -.ft CW -#define bool_t int -#define TRUE 1 -#define FALSE 0 -.DE -.LP -Keeping these conventions in mind, -.I xdr_gnumbers() -can be rewritten as follows: -.ie t .DS -.el .DS L -.ft CW -xdr_gnumbers(xdrs, gp) - XDR *xdrs; - struct gnumbers *gp; -{ - return(xdr_long(xdrs, &gp->g_assets) && - xdr_long(xdrs, &gp->g_liabilities)); -} -.DE -This document uses both coding styles. -.NH 1 -\&XDR Library Primitives -.IX "library primitives for XDR" -.IX XDR "library primitives" -.LP -This section gives a synopsis of each XDR primitive. -It starts with basic data types and moves on to constructed data types. -Finally, XDR utilities are discussed. -The interface to these primitives -and utilities is defined in the include file -.I , -automatically included by -.I . -.NH 2 -\&Number Filters -.IX "XDR library" "number filters" -.LP -The XDR library provides primitives to translate between numbers -and their corresponding external representations. -Primitives cover the set of numbers in: -.DS -.ft CW -[signed, unsigned] * [short, int, long] -.DE -.ne 2i -Specifically, the eight primitives are: -.DS -.ft CW -bool_t xdr_char(xdrs, cp) - XDR *xdrs; - char *cp; -.sp .5 -bool_t xdr_u_char(xdrs, ucp) - XDR *xdrs; - unsigned char *ucp; -.sp .5 -bool_t xdr_int(xdrs, ip) - XDR *xdrs; - int *ip; -.sp .5 -bool_t xdr_u_int(xdrs, up) - XDR *xdrs; - unsigned *up; -.sp .5 -bool_t xdr_long(xdrs, lip) - XDR *xdrs; - long *lip; -.sp .5 -bool_t xdr_u_long(xdrs, lup) - XDR *xdrs; - u_long *lup; -.sp .5 -bool_t xdr_short(xdrs, sip) - XDR *xdrs; - short *sip; -.sp .5 -bool_t xdr_u_short(xdrs, sup) - XDR *xdrs; - u_short *sup; -.DE -The first parameter, -.I xdrs , -is an XDR stream handle. -The second parameter is the address of the number -that provides data to the stream or receives data from it. -All routines return -.I TRUE -if they complete successfully, and -.I FALSE -otherwise. -.NH 2 -\&Floating Point Filters -.IX "XDR library" "floating point filters" -.LP -The XDR library also provides primitive routines -for C's floating point types: -.DS -.ft CW -bool_t xdr_float(xdrs, fp) - XDR *xdrs; - float *fp; -.sp .5 -bool_t xdr_double(xdrs, dp) - XDR *xdrs; - double *dp; -.DE -The first parameter, -.I xdrs -is an XDR stream handle. -The second parameter is the address -of the floating point number that provides data to the stream -or receives data from it. -Both routines return -.I TRUE -if they complete successfully, and -.I FALSE -otherwise. -.LP -Note: Since the numbers are represented in IEEE floating point, -routines may fail when decoding a valid IEEE representation -into a machine-specific representation, or vice-versa. -.NH 2 -\&Enumeration Filters -.IX "XDR library" "enumeration filters" -.LP -The XDR library provides a primitive for generic enumerations. -The primitive assumes that a C -.I enum -has the same representation inside the machine as a C integer. -The boolean type is an important instance of the -.I enum . -The external representation of a boolean is always -.I TRUE -(1) or -.I FALSE -(0). -.DS -.ft CW -#define bool_t int -#define FALSE 0 -#define TRUE 1 -.sp .5 -#define enum_t int -.sp .5 -bool_t xdr_enum(xdrs, ep) - XDR *xdrs; - enum_t *ep; -.sp .5 -bool_t xdr_bool(xdrs, bp) - XDR *xdrs; - bool_t *bp; -.DE -The second parameters -.I ep -and -.I bp -are addresses of the associated type that provides data to, or -receives data from, the stream -.I xdrs . -.NH 2 -\&No Data -.IX "XDR library" "no data" -.LP -Occasionally, an XDR routine must be supplied to the RPC system, -even when no data is passed or required. -The library provides such a routine: -.DS -.ft CW -bool_t xdr_void(); /* \fIalways returns TRUE\fP */ -.DE -.NH 2 -\&Constructed Data Type Filters -.IX "XDR library" "constructed data type filters" -.LP -Constructed or compound data type primitives -require more parameters and perform more complicated functions -then the primitives discussed above. -This section includes primitives for -strings, arrays, unions, and pointers to structures. -.LP -Constructed data type primitives may use memory management. -In many cases, memory is allocated when deserializing data with -.I XDR_DECODE -Therefore, the XDR package must provide means to deallocate memory. -This is done by an XDR operation, -.I XDR_FREE -To review, the three XDR directional operations are -.I XDR_ENCODE , -.I XDR_DECODE -and -.I XDR_FREE . -.NH 3 -\&Strings -.IX "XDR library" "strings" -.LP -In C, a string is defined as a sequence of bytes -terminated by a null byte, -which is not considered when calculating string length. -However, when a string is passed or manipulated, -a pointer to it is employed. -Therefore, the XDR library defines a string to be a -.I "char *" -and not a sequence of characters. -The external representation of a string is drastically different -from its internal representation. -Externally, strings are represented as -sequences of ASCII characters, -while internally, they are represented with character pointers. -Conversion between the two representations -is accomplished with the routine -.I xdr_string (): -.IX xdr_string() "" \fIxdr_string()\fP -.DS -.ft CW -bool_t xdr_string(xdrs, sp, maxlength) - XDR *xdrs; - char **sp; - u_int maxlength; -.DE -The first parameter -.I xdrs -is the XDR stream handle. -The second parameter -.I sp -is a pointer to a string (type -.I "char **" . -The third parameter -.I maxlength -specifies the maximum number of bytes allowed during encoding or decoding. -its value is usually specified by a protocol. For example, a protocol -specification may say that a file name may be no longer than 255 characters. -.LP -The routine returns -.I FALSE -if the number of characters exceeds -.I maxlength , -and -.I TRUE -if it doesn't. -.SH -Keep -.I maxlength -small. If it is too big you can blow the heap, since -.I xdr_string() -will call -.I malloc() -for space. -.LP -The behavior of -.I xdr_string() -.IX xdr_string() "" \fIxdr_string()\fP -is similar to the behavior of other routines -discussed in this section. The direction -.I XDR_ENCODE -is easiest to understand. The parameter -.I sp -points to a string of a certain length; -if the string does not exceed -.I maxlength , -the bytes are serialized. -.LP -The effect of deserializing a string is subtle. -First the length of the incoming string is determined; -it must not exceed -.I maxlength . -Next -.I sp -is dereferenced; if the the value is -.I NULL , -then a string of the appropriate length is allocated and -.I *sp -is set to this string. -If the original value of -.I *sp -is non-null, then the XDR package assumes -that a target area has been allocated, -which can hold strings no longer than -.I maxlength . -In either case, the string is decoded into the target area. -The routine then appends a null character to the string. -.LP -In the -.I XDR_FREE -operation, the string is obtained by dereferencing -.I sp . -If the string is not -.I NULL , -it is freed and -.I *sp -is set to -.I NULL . -In this operation, -.I xdr_string() -ignores the -.I maxlength -parameter. -.NH 3 -\&Byte Arrays -.IX "XDR library" "byte arrays" -.LP -Often variable-length arrays of bytes are preferable to strings. -Byte arrays differ from strings in the following three ways: -1) the length of the array (the byte count) is explicitly -located in an unsigned integer, -2) the byte sequence is not terminated by a null character, and -3) the external representation of the bytes is the same as their -internal representation. -The primitive -.I xdr_bytes() -.IX xdr_bytes() "" \fIxdr_bytes()\fP -converts between the internal and external -representations of byte arrays: -.DS -.ft CW -bool_t xdr_bytes(xdrs, bpp, lp, maxlength) - XDR *xdrs; - char **bpp; - u_int *lp; - u_int maxlength; -.DE -The usage of the first, second and fourth parameters -are identical to the first, second and third parameters of -.I xdr_string (), -respectively. -The length of the byte area is obtained by dereferencing -.I lp -when serializing; -.I *lp -is set to the byte length when deserializing. -.NH 3 -\&Arrays -.IX "XDR library" "arrays" -.LP -The XDR library package provides a primitive -for handling arrays of arbitrary elements. -The -.I xdr_bytes() -routine treats a subset of generic arrays, -in which the size of array elements is known to be 1, -and the external description of each element is built-in. -The generic array primitive, -.I xdr_array() , -.IX xdr_array() "" \fIxdr_array()\fP -requires parameters identical to those of -.I xdr_bytes() -plus two more: -the size of array elements, -and an XDR routine to handle each of the elements. -This routine is called to encode or decode -each element of the array. -.DS -.ft CW -bool_t -xdr_array(xdrs, ap, lp, maxlength, elementsiz, xdr_element) - XDR *xdrs; - char **ap; - u_int *lp; - u_int maxlength; - u_int elementsiz; - bool_t (*xdr_element)(); -.DE -The parameter -.I ap -is the address of the pointer to the array. -If -.I *ap -is -.I NULL -when the array is being deserialized, -XDR allocates an array of the appropriate size and sets -.I *ap -to that array. -The element count of the array is obtained from -.I *lp -when the array is serialized; -.I *lp -is set to the array length when the array is deserialized. -The parameter -.I maxlength -is the maximum number of elements that the array is allowed to have; -.I elementsiz -is the byte size of each element of the array -(the C function -.I sizeof() -can be used to obtain this value). -The -.I xdr_element() -.IX xdr_element() "" \fIxdr_element()\fP -routine is called to serialize, deserialize, or free -each element of the array. -.br -.LP -Before defining more constructed data types, it is appropriate to -present three examples. -.LP -.I "Example A:" -.br -A user on a networked machine can be identified by -(a) the machine name, such as -.I krypton : -see the -.I gethostname -man page; (b) the user's UID: see the -.I geteuid -man page; and (c) the group numbers to which the user belongs: -see the -.I getgroups -man page. A structure with this information and its associated -XDR routine could be coded like this: -.ie t .DS -.el .DS L -.ft CW -struct netuser { - char *nu_machinename; - int nu_uid; - u_int nu_glen; - int *nu_gids; -}; -#define NLEN 255 /* \fImachine names < 256 chars\fP */ -#define NGRPS 20 /* \fIuser can't be in > 20 groups\fP */ -.sp .5 -bool_t -xdr_netuser(xdrs, nup) - XDR *xdrs; - struct netuser *nup; -{ - return(xdr_string(xdrs, &nup->nu_machinename, NLEN) && - xdr_int(xdrs, &nup->nu_uid) && - xdr_array(xdrs, &nup->nu_gids, &nup->nu_glen, - NGRPS, sizeof (int), xdr_int)); -} -.DE -.LP -.I "Example B:" -.br -A party of network users could be implemented -as an array of -.I netuser -structure. -The declaration and its associated XDR routines -are as follows: -.ie t .DS -.el .DS L -.ft CW -struct party { - u_int p_len; - struct netuser *p_nusers; -}; -#define PLEN 500 /* \fImax number of users in a party\fP */ -.sp .5 -bool_t -xdr_party(xdrs, pp) - XDR *xdrs; - struct party *pp; -{ - return(xdr_array(xdrs, &pp->p_nusers, &pp->p_len, PLEN, - sizeof (struct netuser), xdr_netuser)); -} -.DE -.LP -.I "Example C:" -.br -The well-known parameters to -.I main , -.I argc -and -.I argv -can be combined into a structure. -An array of these structures can make up a history of commands. -The declarations and XDR routines might look like: -.ie t .DS -.el .DS L -.ft CW -struct cmd { - u_int c_argc; - char **c_argv; -}; -#define ALEN 1000 /* \fIargs cannot be > 1000 chars\fP */ -#define NARGC 100 /* \fIcommands cannot have > 100 args\fP */ - -struct history { - u_int h_len; - struct cmd *h_cmds; -}; -#define NCMDS 75 /* \fIhistory is no more than 75 commands\fP */ - -bool_t -xdr_wrap_string(xdrs, sp) - XDR *xdrs; - char **sp; -{ - return(xdr_string(xdrs, sp, ALEN)); -} -.DE -.ie t .DS -.el .DS L -.ft CW -bool_t -xdr_cmd(xdrs, cp) - XDR *xdrs; - struct cmd *cp; -{ - return(xdr_array(xdrs, &cp->c_argv, &cp->c_argc, NARGC, - sizeof (char *), xdr_wrap_string)); -} -.DE -.ie t .DS -.el .DS L -.ft CW -bool_t -xdr_history(xdrs, hp) - XDR *xdrs; - struct history *hp; -{ - return(xdr_array(xdrs, &hp->h_cmds, &hp->h_len, NCMDS, - sizeof (struct cmd), xdr_cmd)); -} -.DE -The most confusing part of this example is that the routine -.I xdr_wrap_string() -is needed to package the -.I xdr_string() -routine, because the implementation of -.I xdr_array() -only passes two parameters to the array element description routine; -.I xdr_wrap_string() -supplies the third parameter to -.I xdr_string (). -.LP -By now the recursive nature of the XDR library should be obvious. -Let's continue with more constructed data types. -.NH 3 -\&Opaque Data -.IX "XDR library" "opaque data" -.LP -In some protocols, handles are passed from a server to client. -The client passes the handle back to the server at some later time. -Handles are never inspected by clients; -they are obtained and submitted. -That is to say, handles are opaque. -The -.I xdr_opaque() -.IX xdr_opaque() "" \fIxdr_opaque()\fP -primitive is used for describing fixed sized, opaque bytes. -.DS -.ft CW -bool_t xdr_opaque(xdrs, p, len) - XDR *xdrs; - char *p; - u_int len; -.DE -The parameter -.I p -is the location of the bytes; -.I len -is the number of bytes in the opaque object. -By definition, the actual data -contained in the opaque object are not machine portable. -.NH 3 -\&Fixed Sized Arrays -.IX "XDR library" "fixed sized arrays" -.LP -The XDR library provides a primitive, -.I xdr_vector (), -for fixed-length arrays. -.ie t .DS -.el .DS L -.ft CW -#define NLEN 255 /* \fImachine names must be < 256 chars\fP */ -#define NGRPS 20 /* \fIuser belongs to exactly 20 groups\fP */ -.sp .5 -struct netuser { - char *nu_machinename; - int nu_uid; - int nu_gids[NGRPS]; -}; -.sp .5 -bool_t -xdr_netuser(xdrs, nup) - XDR *xdrs; - struct netuser *nup; -{ - int i; -.sp .5 - if (!xdr_string(xdrs, &nup->nu_machinename, NLEN)) - return(FALSE); - if (!xdr_int(xdrs, &nup->nu_uid)) - return(FALSE); - if (!xdr_vector(xdrs, nup->nu_gids, NGRPS, sizeof(int), - xdr_int)) { - return(FALSE); - } - return(TRUE); -} -.DE -.NH 3 -\&Discriminated Unions -.IX "XDR library" "discriminated unions" -.LP -The XDR library supports discriminated unions. -A discriminated union is a C union and an -.I enum_t -value that selects an \*Qarm\*U of the union. -.DS -.ft CW -struct xdr_discrim { - enum_t value; - bool_t (*proc)(); -}; -.sp .5 -bool_t xdr_union(xdrs, dscmp, unp, arms, defaultarm) - XDR *xdrs; - enum_t *dscmp; - char *unp; - struct xdr_discrim *arms; - bool_t (*defaultarm)(); /* \fImay equal NULL\fP */ -.DE -First the routine translates the discriminant of the union located at -.I *dscmp . -The discriminant is always an -.I enum_t . -Next the union located at -.I *unp -is translated. -The parameter -.I arms -is a pointer to an array of -.I xdr_discrim -structures. -Each structure contains an ordered pair of -.I [value,proc] . -If the union's discriminant is equal to the associated -.I value , -then the -.I proc -is called to translate the union. -The end of the -.I xdr_discrim -structure array is denoted by a routine of value -.I NULL -(0). If the discriminant is not found in the -.I arms -array, then the -.I defaultarm -procedure is called if it is non-null; -otherwise the routine returns -.I FALSE . -.LP -.I "Example D:" -Suppose the type of a union may be integer, -character pointer (a string), or a -.I gnumbers -structure. -Also, assume the union and its current type -are declared in a structure. -The declaration is: -.ie t .DS -.el .DS L -.ft CW -enum utype { INTEGER=1, STRING=2, GNUMBERS=3 }; -.sp .5 -struct u_tag { - enum utype utype; /* \fIthe union's discriminant\fP */ - union { - int ival; - char *pval; - struct gnumbers gn; - } uval; -}; -.DE -The following constructs and XDR procedure (de)serialize -the discriminated union: -.ie t .DS -.el .DS L -.ft CW -struct xdr_discrim u_tag_arms[4] = { - { INTEGER, xdr_int }, - { GNUMBERS, xdr_gnumbers } - { STRING, xdr_wrap_string }, - { __dontcare__, NULL } - /* \fIalways terminate arms with a NULL xdr_proc\fP */ -} -.sp .5 -bool_t -xdr_u_tag(xdrs, utp) - XDR *xdrs; - struct u_tag *utp; -{ - return(xdr_union(xdrs, &utp->utype, &utp->uval, - u_tag_arms, NULL)); -} -.DE -The routine -.I xdr_gnumbers() -was presented above in -.I "The XDR Library" -section. -.I xdr_wrap_string() -was presented in example C. -The default -.I arm -parameter to -.I xdr_union() -(the last parameter) is -.I NULL -in this example. Therefore the value of the union's discriminant -may legally take on only values listed in the -.I u_tag_arms -array. This example also demonstrates that -the elements of the arm's array do not need to be sorted. -.LP -It is worth pointing out that the values of the discriminant -may be sparse, though in this example they are not. -It is always good -practice to assign explicitly integer values to each element of the -discriminant's type. -This practice both documents the external -representation of the discriminant and guarantees that different -C compilers emit identical discriminant values. -.LP -Exercise: Implement -.I xdr_union() -using the other primitives in this section. -.NH 3 -\&Pointers -.IX "XDR library" "pointers" -.LP -In C it is often convenient to put pointers -to another structure within a structure. -The -.I xdr_reference() -.IX xdr_reference() "" \fIxdr_reference()\fP -primitive makes it easy to serialize, deserialize, and free -these referenced structures. -.DS -.ft CW -bool_t xdr_reference(xdrs, pp, size, proc) - XDR *xdrs; - char **pp; - u_int ssize; - bool_t (*proc)(); -.DE -.LP -Parameter -.I pp -is the address of -the pointer to the structure; -parameter -.I ssize -is the size in bytes of the structure (use the C function -.I sizeof() -to obtain this value); and -.I proc -is the XDR routine that describes the structure. -When decoding data, storage is allocated if -.I *pp -is -.I NULL . -.LP -There is no need for a primitive -.I xdr_struct() -to describe structures within structures, -because pointers are always sufficient. -.LP -Exercise: Implement -.I xdr_reference() -using -.I xdr_array (). -Warning: -.I xdr_reference() -and -.I xdr_array() -are NOT interchangeable external representations of data. -.LP -.I "Example E:" -Suppose there is a structure containing a person's name -and a pointer to a -.I gnumbers -structure containing the person's gross assets and liabilities. -The construct is: -.DS -.ft CW -struct pgn { - char *name; - struct gnumbers *gnp; -}; -.DE -The corresponding XDR routine for this structure is: -.DS -.ft CW -bool_t -xdr_pgn(xdrs, pp) - XDR *xdrs; - struct pgn *pp; -{ - if (xdr_string(xdrs, &pp->name, NLEN) && - xdr_reference(xdrs, &pp->gnp, - sizeof(struct gnumbers), xdr_gnumbers)) - return(TRUE); - return(FALSE); -} -.DE -.IX "pointer semantics and XDR" -.I "Pointer Semantics and XDR" -.LP -In many applications, C programmers attach double meaning to -the values of a pointer. Typically the value -.I NULL -(or zero) means data is not needed, -yet some application-specific interpretation applies. -In essence, the C programmer is encoding -a discriminated union efficiently -by overloading the interpretation of the value of a pointer. -For instance, in example E a -.I NULL -pointer value for -.I gnp -could indicate that -the person's assets and liabilities are unknown. -That is, the pointer value encodes two things: -whether or not the data is known; -and if it is known, where it is located in memory. -Linked lists are an extreme example of the use -of application-specific pointer interpretation. -.LP -The primitive -.I xdr_reference() -.IX xdr_reference() "" \fIxdr_reference()\fP -cannot and does not attach any special -meaning to a null-value pointer during serialization. -That is, passing an address of a pointer whose value is -.I NULL -to -.I xdr_reference() -when serialing data will most likely cause a memory fault and, on the UNIX -system, a core dump. -.LP -.I xdr_pointer() -correctly handles -.I NULL -pointers. For more information about its use, see -the -.I "Linked Lists" -topics below. -.LP -.I Exercise: -After reading the section on -.I "Linked Lists" , -return here and extend example E so that -it can correctly deal with -.I NULL -pointer values. -.LP -.I Exercise: -Using the -.I xdr_union (), -.I xdr_reference() -and -.I xdr_void() -primitives, implement a generic pointer handling primitive -that implicitly deals with -.I NULL -pointers. That is, implement -.I xdr_pointer (). -.NH 2 -\&Non-filter Primitives -.IX "XDR" "non-filter primitives" -.LP -XDR streams can be manipulated with -the primitives discussed in this section. -.DS -.ft CW -u_int xdr_getpos(xdrs) - XDR *xdrs; -.sp .5 -bool_t xdr_setpos(xdrs, pos) - XDR *xdrs; - u_int pos; -.sp .5 -xdr_destroy(xdrs) - XDR *xdrs; -.DE -The routine -.I xdr_getpos() -.IX xdr_getpos() "" \fIxdr_getpos()\fP -returns an unsigned integer -that describes the current position in the data stream. -Warning: In some XDR streams, the returned value of -.I xdr_getpos() -is meaningless; -the routine returns a \-1 in this case -(though \-1 should be a legitimate value). -.LP -The routine -.I xdr_setpos() -.IX xdr_setpos() "" \fIxdr_setpos()\fP -sets a stream position to -.I pos . -Warning: In some XDR streams, setting a position is impossible; -in such cases, -.I xdr_setpos() -will return -.I FALSE . -This routine will also fail if the requested position is out-of-bounds. -The definition of bounds varies from stream to stream. -.LP -The -.I xdr_destroy() -.IX xdr_destroy() "" \fIxdr_destroy()\fP -primitive destroys the XDR stream. -Usage of the stream -after calling this routine is undefined. -.NH 2 -\&XDR Operation Directions -.IX XDR "operation directions" -.IX "direction of XDR operations" -.LP -At times you may wish to optimize XDR routines by taking -advantage of the direction of the operation \(em -.I XDR_ENCODE -.I XDR_DECODE -or -.I XDR_FREE -The value -.I xdrs->x_op -always contains the direction of the XDR operation. -Programmers are not encouraged to take advantage of this information. -Therefore, no example is presented here. However, an example in the -.I "Linked Lists" -topic below, demonstrates the usefulness of the -.I xdrs->x_op -field. -.NH 2 -\&XDR Stream Access -.IX "XDR" "stream access" -.LP -An XDR stream is obtained by calling the appropriate creation routine. -These creation routines take arguments that are tailored to the -specific properties of the stream. -.LP -Streams currently exist for (de)serialization of data to or from -standard I/O -.I FILE -streams, TCP/IP connections and UNIX files, and memory. -.NH 3 -\&Standard I/O Streams -.IX "XDR" "standard I/O streams" -.LP -XDR streams can be interfaced to standard I/O using the -.I xdrstdio_create() -.IX xdrstdio_create() "" \fIxdrstdio_create()\fP -routine as follows: -.DS -.ft CW -#include -#include /* \fIxdr streams part of rpc\fP */ -.sp .5 -void -xdrstdio_create(xdrs, fp, x_op) - XDR *xdrs; - FILE *fp; - enum xdr_op x_op; -.DE -The routine -.I xdrstdio_create() -initializes an XDR stream pointed to by -.I xdrs . -The XDR stream interfaces to the standard I/O library. -Parameter -.I fp -is an open file, and -.I x_op -is an XDR direction. -.NH 3 -\&Memory Streams -.IX "XDR" "memory streams" -.LP -Memory streams allow the streaming of data into or out of -a specified area of memory: -.DS -.ft CW -#include -.sp .5 -void -xdrmem_create(xdrs, addr, len, x_op) - XDR *xdrs; - char *addr; - u_int len; - enum xdr_op x_op; -.DE -The routine -.I xdrmem_create() -.IX xdrmem_create() "" \fIxdrmem_create()\fP -initializes an XDR stream in local memory. -The memory is pointed to by parameter -.I addr ; -parameter -.I len -is the length in bytes of the memory. -The parameters -.I xdrs -and -.I x_op -are identical to the corresponding parameters of -.I xdrstdio_create (). -Currently, the UDP/IP implementation of RPC uses -.I xdrmem_create (). -Complete call or result messages are built in memory before calling the -.I sendto() -system routine. -.NH 3 -\&Record (TCP/IP) Streams -.IX "XDR" "record (TCP/IP) streams" -.LP -A record stream is an XDR stream built on top of -a record marking standard that is built on top of the -UNIX file or 4.2 BSD connection interface. -.DS -.ft CW -#include /* \fIxdr streams part of rpc\fP */ -.sp .5 -xdrrec_create(xdrs, - sendsize, recvsize, iohandle, readproc, writeproc) - XDR *xdrs; - u_int sendsize, recvsize; - char *iohandle; - int (*readproc)(), (*writeproc)(); -.DE -The routine -.I xdrrec_create() -provides an XDR stream interface that allows for a bidirectional, -arbitrarily long sequence of records. -The contents of the records are meant to be data in XDR form. -The stream's primary use is for interfacing RPC to TCP connections. -However, it can be used to stream data into or out of normal -UNIX files. -.LP -The parameter -.I xdrs -is similar to the corresponding parameter described above. -The stream does its own data buffering similar to that of standard I/O. -The parameters -.I sendsize -and -.I recvsize -determine the size in bytes of the output and input buffers, respectively; -if their values are zero (0), then predetermined defaults are used. -When a buffer needs to be filled or flushed, the routine -.I readproc() -or -.I writeproc() -is called, respectively. -The usage and behavior of these -routines are similar to the UNIX system calls -.I read() -and -.I write (). -However, -the first parameter to each of these routines is the opaque parameter -.I iohandle . -The other two parameters -.I buf "" -and -.I nbytes ) -and the results -(byte count) are identical to the system routines. -If -.I xxx -is -.I readproc() -or -.I writeproc (), -then it has the following form: -.DS -.ft CW -.ft I -/* - * returns the actual number of bytes transferred. - * -1 is an error - */ -.ft CW -int -xxx(iohandle, buf, len) - char *iohandle; - char *buf; - int nbytes; -.DE -The XDR stream provides means for delimiting records in the byte stream. -The implementation details of delimiting records in a stream are -discussed in the -.I "Advanced Topics" -topic below. -The primitives that are specific to record streams are as follows: -.DS -.ft CW -bool_t -xdrrec_endofrecord(xdrs, flushnow) - XDR *xdrs; - bool_t flushnow; -.sp .5 -bool_t -xdrrec_skiprecord(xdrs) - XDR *xdrs; -.sp .5 -bool_t -xdrrec_eof(xdrs) - XDR *xdrs; -.DE -The routine -.I xdrrec_endofrecord() -.IX xdrrec_endofrecord() "" \fIxdrrec_endofrecord()\fP -causes the current outgoing data to be marked as a record. -If the parameter -.I flushnow -is -.I TRUE , -then the stream's -.I writeproc -will be called; otherwise, -.I writeproc -will be called when the output buffer has been filled. -.LP -The routine -.I xdrrec_skiprecord() -.IX xdrrec_skiprecord() "" \fIxdrrec_skiprecord()\fP -causes an input stream's position to be moved past -the current record boundary and onto the -beginning of the next record in the stream. -.LP -If there is no more data in the stream's input buffer, -then the routine -.I xdrrec_eof() -.IX xdrrec_eof() "" \fIxdrrec_eof()\fP -returns -.I TRUE . -That is not to say that there is no more data -in the underlying file descriptor. -.NH 2 -\&XDR Stream Implementation -.IX "XDR" "stream implementation" -.IX "stream implementation in XDR" -.LP -This section provides the abstract data types needed -to implement new instances of XDR streams. -.NH 3 -\&The XDR Object -.IX "XDR" "object" -.LP -The following structure defines the interface to an XDR stream: -.ie t .DS -.el .DS L -.ft CW -enum xdr_op { XDR_ENCODE=0, XDR_DECODE=1, XDR_FREE=2 }; -.sp .5 -typedef struct { - enum xdr_op x_op; /* \fIoperation; fast added param\fP */ - struct xdr_ops { - bool_t (*x_getlong)(); /* \fIget long from stream\fP */ - bool_t (*x_putlong)(); /* \fIput long to stream\fP */ - bool_t (*x_getbytes)(); /* \fIget bytes from stream\fP */ - bool_t (*x_putbytes)(); /* \fIput bytes to stream\fP */ - u_int (*x_getpostn)(); /* \fIreturn stream offset\fP */ - bool_t (*x_setpostn)(); /* \fIreposition offset\fP */ - caddr_t (*x_inline)(); /* \fIptr to buffered data\fP */ - VOID (*x_destroy)(); /* \fIfree private area\fP */ - } *x_ops; - caddr_t x_public; /* \fIusers' data\fP */ - caddr_t x_private; /* \fIpointer to private data\fP */ - caddr_t x_base; /* \fIprivate for position info\fP */ - int x_handy; /* \fIextra private word\fP */ -} XDR; -.DE -The -.I x_op -field is the current operation being performed on the stream. -This field is important to the XDR primitives, -but should not affect a stream's implementation. -That is, a stream's implementation should not depend -on this value. -The fields -.I x_private , -.I x_base , -and -.I x_handy -are private to the particular -stream's implementation. -The field -.I x_public -is for the XDR client and should never be used by -the XDR stream implementations or the XDR primitives. -.I x_getpostn() , -.I x_setpostn() -and -.I x_destroy() -are macros for accessing operations. The operation -.I x_inline() -takes two parameters: -an XDR *, and an unsigned integer, which is a byte count. -The routine returns a pointer to a piece of -the stream's internal buffer. -The caller can then use the buffer segment for any purpose. -From the stream's point of view, the bytes in the -buffer segment have been consumed or put. -The routine may return -.I NULL -if it cannot return a buffer segment of the requested size. -(The -.I x_inline() -routine is for cycle squeezers. -Use of the resulting buffer is not data-portable. -Users are encouraged not to use this feature.) -.LP -The operations -.I x_getbytes() -and -.I x_putbytes() -blindly get and put sequences of bytes -from or to the underlying stream; -they return -.I TRUE -if they are successful, and -.I FALSE -otherwise. The routines have identical parameters (replace -.I xxx ): -.DS -.ft CW -bool_t -xxxbytes(xdrs, buf, bytecount) - XDR *xdrs; - char *buf; - u_int bytecount; -.DE -The operations -.I x_getlong() -and -.I x_putlong() -receive and put -long numbers from and to the data stream. -It is the responsibility of these routines -to translate the numbers between the machine representation -and the (standard) external representation. -The UNIX primitives -.I htonl() -and -.I ntohl() -can be helpful in accomplishing this. -The higher-level XDR implementation assumes that -signed and unsigned long integers contain the same number of bits, -and that nonnegative integers -have the same bit representations as unsigned integers. -The routines return -.I TRUE -if they succeed, and -.I FALSE -otherwise. They have identical parameters: -.DS -.ft CW -bool_t -xxxlong(xdrs, lp) - XDR *xdrs; - long *lp; -.DE -Implementors of new XDR streams must make an XDR structure -(with new operation routines) available to clients, -using some kind of create routine. -.NH 1 -\&Advanced Topics -.IX XDR "advanced topics" -.LP -This section describes techniques for passing data structures that -are not covered in the preceding sections. Such structures include -linked lists (of arbitrary lengths). Unlike the simpler examples -covered in the earlier sections, the following examples are written -using both the XDR C library routines and the XDR data description -language. -The -.I "External Data Representation Standard: Protocol Specification" -describes this -language in complete detail. -.NH 2 -\&Linked Lists -.IX XDR "linked lists" -.LP -The last example in the -.I Pointers -topic earlier in this chapter -presented a C data structure and its associated XDR -routines for an individual's gross assets and liabilities. -The example is duplicated below: -.ie t .DS -.el .DS L -.ft CW -struct gnumbers { - long g_assets; - long g_liabilities; -}; -.sp .5 -bool_t -xdr_gnumbers(xdrs, gp) - XDR *xdrs; - struct gnumbers *gp; -{ - if (xdr_long(xdrs, &(gp->g_assets))) - return(xdr_long(xdrs, &(gp->g_liabilities))); - return(FALSE); -} -.DE -.LP -Now assume that we wish to implement a linked list of such information. -A data structure could be constructed as follows: -.ie t .DS -.el .DS L -.ft CW -struct gnumbers_node { - struct gnumbers gn_numbers; - struct gnumbers_node *gn_next; -}; -.sp .5 -typedef struct gnumbers_node *gnumbers_list; -.DE -.LP -The head of the linked list can be thought of as the data object; -that is, the head is not merely a convenient shorthand for a -structure. Similarly the -.I gn_next -field is used to indicate whether or not the object has terminated. -Unfortunately, if the object continues, the -.I gn_next -field is also the address of where it continues. The link addresses -carry no useful information when the object is serialized. -.LP -The XDR data description of this linked list is described by the -recursive declaration of -.I gnumbers_list : -.ie t .DS -.el .DS L -.ft CW -struct gnumbers { - int g_assets; - int g_liabilities; -}; -.sp .5 -struct gnumbers_node { - gnumbers gn_numbers; - gnumbers_node *gn_next; -}; -.DE -.LP -In this description, the boolean indicates whether there is more data -following it. If the boolean is -.I FALSE , -then it is the last data field of the structure. If it is -.I TRUE , -then it is followed by a gnumbers structure and (recursively) by a -.I gnumbers_list . -Note that the C declaration has no boolean explicitly declared in it -(though the -.I gn_next -field implicitly carries the information), while the XDR data -description has no pointer explicitly declared in it. -.LP -Hints for writing the XDR routines for a -.I gnumbers_list -follow easily from the XDR description above. Note how the primitive -.I xdr_pointer() -is used to implement the XDR union above. -.ie t .DS -.el .DS L -.ft CW -bool_t -xdr_gnumbers_node(xdrs, gn) - XDR *xdrs; - gnumbers_node *gn; -{ - return(xdr_gnumbers(xdrs, &gn->gn_numbers) && - xdr_gnumbers_list(xdrs, &gp->gn_next)); -} -.sp .5 -bool_t -xdr_gnumbers_list(xdrs, gnp) - XDR *xdrs; - gnumbers_list *gnp; -{ - return(xdr_pointer(xdrs, gnp, - sizeof(struct gnumbers_node), - xdr_gnumbers_node)); -} -.DE -.LP -The unfortunate side effect of XDR'ing a list with these routines -is that the C stack grows linearly with respect to the number of -node in the list. This is due to the recursion. The following -routine collapses the above two mutually recursive into a single, -non-recursive one. -.ie t .DS -.el .DS L -.ft CW -bool_t -xdr_gnumbers_list(xdrs, gnp) - XDR *xdrs; - gnumbers_list *gnp; -{ - bool_t more_data; - gnumbers_list *nextp; -.sp .5 - for (;;) { - more_data = (*gnp != NULL); - if (!xdr_bool(xdrs, &more_data)) { - return(FALSE); - } - if (! more_data) { - break; - } - if (xdrs->x_op == XDR_FREE) { - nextp = &(*gnp)->gn_next; - } - if (!xdr_reference(xdrs, gnp, - sizeof(struct gnumbers_node), xdr_gnumbers)) { - - return(FALSE); - } - gnp = (xdrs->x_op == XDR_FREE) ? - nextp : &(*gnp)->gn_next; - } - *gnp = NULL; - return(TRUE); -} -.DE -.LP -The first task is to find out whether there is more data or not, -so that this boolean information can be serialized. Notice that -this statement is unnecessary in the -.I XDR_DECODE -case, since the value of more_data is not known until we -deserialize it in the next statement. -.LP -The next statement XDR's the more_data field of the XDR union. -Then if there is truly no more data, we set this last pointer to -.I NULL -to indicate the end of the list, and return -.I TRUE -because we are done. Note that setting the pointer to -.I NULL -is only important in the -.I XDR_DECODE -case, since it is already -.I NULL -in the -.I XDR_ENCODE -and -XDR_FREE -cases. -.LP -Next, if the direction is -.I XDR_FREE , -the value of -.I nextp -is set to indicate the location of the next pointer in the list. -We do this now because we need to dereference gnp to find the -location of the next item in the list, and after the next -statement the storage pointed to by -.I gnp -will be freed up and no be longer valid. We can't do this for all -directions though, because in the -.I XDR_DECODE -direction the value of -.I gnp -won't be set until the next statement. -.LP -Next, we XDR the data in the node using the primitive -.I xdr_reference (). -.I xdr_reference() -is like -.I xdr_pointer() -which we used before, but it does not -send over the boolean indicating whether there is more data. -We use it instead of -.I xdr_pointer() -because we have already XDR'd this information ourselves. Notice -that the xdr routine passed is not the same type as an element -in the list. The routine passed is -.I xdr_gnumbers (), -for XDR'ing gnumbers, but each element in the list is actually of -type -.I gnumbers_node . -We don't pass -.I xdr_gnumbers_node() -because it is recursive, and instead use -.I xdr_gnumbers() -which XDR's all of the non-recursive part. Note that this trick -will work only if the -.I gn_numbers -field is the first item in each element, so that their addresses -are identical when passed to -.I xdr_reference (). -.LP -Finally, we update -.I gnp -to point to the next item in the list. If the direction is -.I XDR_FREE , -we set it to the previously saved value, otherwise we can -dereference -.I gnp -to get the proper value. Though harder to understand than the -recursive version, this non-recursive routine is far less likely -to blow the C stack. It will also run more efficiently since -a lot of procedure call overhead has been removed. Most lists -are small though (in the hundreds of items or less) and the -recursive version should be sufficient for them. -.EQ -delim off -.EN diff --git a/lib/libc/rpc/PSD.doc/xdr.rfc.ms b/lib/libc/rpc/PSD.doc/xdr.rfc.ms deleted file mode 100644 index 480a339..0000000 --- a/lib/libc/rpc/PSD.doc/xdr.rfc.ms +++ /dev/null @@ -1,1060 +0,0 @@ -.\" -.\" Must use -- tbl -- with this one -.\" -.\" @(#)xdr.rfc.ms 2.2 88/08/05 4.0 RPCSRC -.\" $FreeBSD$ -.\" -.de BT -.if \\n%=1 .tl ''- % -'' -.. -.ND -.\" prevent excess underlining in nroff -.if n .fp 2 R -.OH 'External Data Representation Standard''Page %' -.EH 'Page %''External Data Representation Standard' -.if \n%=1 .bp -.SH -\&External Data Representation Standard: Protocol Specification -.IX "External Data Representation" -.IX XDR RFC -.IX XDR "protocol specification" -.LP -.NH 0 -\&Status of this Standard -.nr OF 1 -.IX XDR "RFC status" -.LP -Note: This chapter specifies a protocol that Sun Microsystems, Inc., and -others are using. It has been designated RFC1014 by the ARPA Network -Information Center. -.NH 1 -Introduction -\& -.LP -XDR is a standard for the description and encoding of data. It is -useful for transferring data between different computer -architectures, and has been used to communicate data between such -diverse machines as the Sun Workstation, VAX, IBM-PC, and Cray. -XDR fits into the ISO presentation layer, and is roughly analogous in -purpose to X.409, ISO Abstract Syntax Notation. The major difference -between these two is that XDR uses implicit typing, while X.409 uses -explicit typing. -.LP -XDR uses a language to describe data formats. The language can only -be used only to describe data; it is not a programming language. -This language allows one to describe intricate data formats in a -concise manner. The alternative of using graphical representations -(itself an informal language) quickly becomes incomprehensible when -faced with complexity. The XDR language itself is similar to the C -language [1], just as Courier [4] is similar to Mesa. Protocols such -as Sun RPC (Remote Procedure Call) and the NFS (Network File System) -use XDR to describe the format of their data. -.LP -The XDR standard makes the following assumption: that bytes (or -octets) are portable, where a byte is defined to be 8 bits of data. -A given hardware device should encode the bytes onto the various -media in such a way that other hardware devices may decode the bytes -without loss of meaning. For example, the Ethernet standard -suggests that bytes be encoded in "little-endian" style [2], or least -significant bit first. -.NH 2 -\&Basic Block Size -.IX XDR "basic block size" -.IX XDR "block size" -.LP -The representation of all items requires a multiple of four bytes (or -32 bits) of data. The bytes are numbered 0 through n-1. The bytes -are read or written to some byte stream such that byte m always -precedes byte m+1. If the n bytes needed to contain the data are not -a multiple of four, then the n bytes are followed by enough (0 to 3) -residual zero bytes, r, to make the total byte count a multiple of 4. -.LP -We include the familiar graphic box notation for illustration and -comparison. In most illustrations, each box (delimited by a plus -sign at the 4 corners and vertical bars and dashes) depicts a byte. -Ellipses (...) between boxes show zero or more additional bytes where -required. -.ie t .DS -.el .DS L -\fIA Block\fP - -\f(CW+--------+--------+...+--------+--------+...+--------+ -| byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | -+--------+--------+...+--------+--------+...+--------+ -|<-----------n bytes---------->|<------r bytes------>| -|<-----------n+r (where (n+r) mod 4 = 0)>----------->|\fP - -.DE -.NH 1 -\&XDR Data Types -.IX XDR "data types" -.IX "XDR data types" -.LP -Each of the sections that follow describes a data type defined in the -XDR standard, shows how it is declared in the language, and includes -a graphic illustration of its encoding. -.LP -For each data type in the language we show a general paradigm -declaration. Note that angle brackets (< and >) denote -variable length sequences of data and square brackets ([ and ]) denote -fixed-length sequences of data. "n", "m" and "r" denote integers. -For the full language specification and more formal definitions of -terms such as "identifier" and "declaration", refer to -.I "The XDR Language Specification" , -below. -.LP -For some data types, more specific examples are included. -A more extensive example of a data description is in -.I "An Example of an XDR Data Description" -below. -.NH 2 -\&Integer -.IX XDR integer -.LP -An XDR signed integer is a 32-bit datum that encodes an integer in -the range [-2147483648,2147483647]. The integer is represented in -two's complement notation. The most and least significant bytes are -0 and 3, respectively. Integers are declared as follows: -.ie t .DS -.el .DS L -\fIInteger\fP - -\f(CW(MSB) (LSB) -+-------+-------+-------+-------+ -|byte 0 |byte 1 |byte 2 |byte 3 | -+-------+-------+-------+-------+ -<------------32 bits------------>\fP -.DE -.NH 2 -\&Unsigned Integer -.IX XDR "unsigned integer" -.IX XDR "integer, unsigned" -.LP -An XDR unsigned integer is a 32-bit datum that encodes a nonnegative -integer in the range [0,4294967295]. It is represented by an -unsigned binary number whose most and least significant bytes are 0 -and 3, respectively. An unsigned integer is declared as follows: -.ie t .DS -.el .DS L -\fIUnsigned Integer\fP - -\f(CW(MSB) (LSB) -+-------+-------+-------+-------+ -|byte 0 |byte 1 |byte 2 |byte 3 | -+-------+-------+-------+-------+ -<------------32 bits------------>\fP -.DE -.NH 2 -\&Enumeration -.IX XDR enumeration -.LP -Enumerations have the same representation as signed integers. -Enumerations are handy for describing subsets of the integers. -Enumerated data is declared as follows: -.ft CW -.DS -enum { name-identifier = constant, ... } identifier; -.DE -For example, the three colors red, yellow, and blue could be -described by an enumerated type: -.DS -.ft CW -enum { RED = 2, YELLOW = 3, BLUE = 5 } colors; -.DE -It is an error to encode as an enum any other integer than those that -have been given assignments in the enum declaration. -.NH 2 -\&Boolean -.IX XDR boolean -.LP -Booleans are important enough and occur frequently enough to warrant -their own explicit type in the standard. Booleans are declared as -follows: -.DS -.ft CW -bool identifier; -.DE -This is equivalent to: -.DS -.ft CW -enum { FALSE = 0, TRUE = 1 } identifier; -.DE -.NH 2 -\&Hyper Integer and Unsigned Hyper Integer -.IX XDR "hyper integer" -.IX XDR "integer, hyper" -.LP -The standard also defines 64-bit (8-byte) numbers called hyper -integer and unsigned hyper integer. Their representations are the -obvious extensions of integer and unsigned integer defined above. -They are represented in two's complement notation. The most and -least significant bytes are 0 and 7, respectively. Their -declarations: -.ie t .DS -.el .DS L -\fIHyper Integer\fP -\fIUnsigned Hyper Integer\fP - -\f(CW(MSB) (LSB) -+-------+-------+-------+-------+-------+-------+-------+-------+ -|byte 0 |byte 1 |byte 2 |byte 3 |byte 4 |byte 5 |byte 6 |byte 7 | -+-------+-------+-------+-------+-------+-------+-------+-------+ -<----------------------------64 bits---------------------------->\fP -.DE -.NH 2 -\&Floating-point -.IX XDR "integer, floating point" -.IX XDR "floating-point integer" -.LP -The standard defines the floating-point data type "float" (32 bits or -4 bytes). The encoding used is the IEEE standard for normalized -single-precision floating-point numbers [3]. The following three -fields describe the single-precision floating-point number: -.RS -.IP \fBS\fP: -The sign of the number. Values 0 and 1 represent positive and -negative, respectively. One bit. -.IP \fBE\fP: -The exponent of the number, base 2. 8 bits are devoted to this -field. The exponent is biased by 127. -.IP \fBF\fP: -The fractional part of the number's mantissa, base 2. 23 bits -are devoted to this field. -.RE -.LP -Therefore, the floating-point number is described by: -.DS -(-1)**S * 2**(E-Bias) * 1.F -.DE -It is declared as follows: -.ie t .DS -.el .DS L -\fISingle-Precision Floating-Point\fP - -\f(CW+-------+-------+-------+-------+ -|byte 0 |byte 1 |byte 2 |byte 3 | -S| E | F | -+-------+-------+-------+-------+ -1|<- 8 ->|<-------23 bits------>| -<------------32 bits------------>\fP -.DE -Just as the most and least significant bytes of a number are 0 and 3, -the most and least significant bits of a single-precision floating- -point number are 0 and 31. The beginning bit (and most significant -bit) offsets of S, E, and F are 0, 1, and 9, respectively. Note that -these numbers refer to the mathematical positions of the bits, and -NOT to their actual physical locations (which vary from medium to -medium). -.LP -The IEEE specifications should be consulted concerning the encoding -for signed zero, signed infinity (overflow), and denormalized numbers -(underflow) [3]. According to IEEE specifications, the "NaN" (not a -number) is system dependent and should not be used externally. -.NH 2 -\&Double-precision Floating-point -.IX XDR "integer, double-precision floating point" -.IX XDR "double-precision floating-point integer" -.LP -The standard defines the encoding for the double-precision floating- -point data type "double" (64 bits or 8 bytes). The encoding used is -the IEEE standard for normalized double-precision floating-point -numbers [3]. The standard encodes the following three fields, which -describe the double-precision floating-point number: -.RS -.IP \fBS\fP: -The sign of the number. Values 0 and 1 represent positive and -negative, respectively. One bit. -.IP \fBE\fP: -The exponent of the number, base 2. 11 bits are devoted to this -field. The exponent is biased by 1023. -.IP \fBF\fP: -The fractional part of the number's mantissa, base 2. 52 bits -are devoted to this field. -.RE -.LP -Therefore, the floating-point number is described by: -.DS -(-1)**S * 2**(E-Bias) * 1.F -.DE -It is declared as follows: -.ie t .DS -.el .DS L -\fIDouble-Precision Floating-Point\fP - -\f(CW+------+------+------+------+------+------+------+------+ -|byte 0|byte 1|byte 2|byte 3|byte 4|byte 5|byte 6|byte 7| -S| E | F | -+------+------+------+------+------+------+------+------+ -1|<--11-->|<-----------------52 bits------------------->| -<-----------------------64 bits------------------------->\fP -.DE -Just as the most and least significant bytes of a number are 0 and 3, -the most and least significant bits of a double-precision floating- -point number are 0 and 63. The beginning bit (and most significant -bit) offsets of S, E , and F are 0, 1, and 12, respectively. Note -that these numbers refer to the mathematical positions of the bits, -and NOT to their actual physical locations (which vary from medium to -medium). -.LP -The IEEE specifications should be consulted concerning the encoding -for signed zero, signed infinity (overflow), and denormalized numbers -(underflow) [3]. According to IEEE specifications, the "NaN" (not a -number) is system dependent and should not be used externally. -.NH 2 -\&Fixed-length Opaque Data -.IX XDR "fixed-length opaque data" -.IX XDR "opaque data, fixed length" -.LP -At times, fixed-length uninterpreted data needs to be passed among -machines. This data is called "opaque" and is declared as follows: -.DS -.ft CW -opaque identifier[n]; -.DE -where the constant n is the (static) number of bytes necessary to -contain the opaque data. If n is not a multiple of four, then the n -bytes are followed by enough (0 to 3) residual zero bytes, r, to make -the total byte count of the opaque object a multiple of four. -.ie t .DS -.el .DS L -\fIFixed-Length Opaque\fP - -\f(CW0 1 ... -+--------+--------+...+--------+--------+...+--------+ -| byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | -+--------+--------+...+--------+--------+...+--------+ -|<-----------n bytes---------->|<------r bytes------>| -|<-----------n+r (where (n+r) mod 4 = 0)------------>|\fP -.DE -.NH 2 -\&Variable-length Opaque Data -.IX XDR "variable-length opaque data" -.IX XDR "opaque data, variable length" -.LP -The standard also provides for variable-length (counted) opaque data, -defined as a sequence of n (numbered 0 through n-1) arbitrary bytes -to be the number n encoded as an unsigned integer (as described -below), and followed by the n bytes of the sequence. -.LP -Byte m of the sequence always precedes byte m+1 of the sequence, and -byte 0 of the sequence always follows the sequence's length (count). -enough (0 to 3) residual zero bytes, r, to make the total byte count -a multiple of four. Variable-length opaque data is declared in the -following way: -.DS -.ft CW -opaque identifier; -.DE -or -.DS -.ft CW -opaque identifier<>; -.DE -The constant m denotes an upper bound of the number of bytes that the -sequence may contain. If m is not specified, as in the second -declaration, it is assumed to be (2**32) - 1, the maximum length. -The constant m would normally be found in a protocol specification. -For example, a filing protocol may state that the maximum data -transfer size is 8192 bytes, as follows: -.DS -.ft CW -opaque filedata<8192>; -.DE -This can be illustrated as follows: -.ie t .DS -.el .DS L -\fIVariable-Length Opaque\fP - -\f(CW0 1 2 3 4 5 ... -+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ -| length n |byte0|byte1|...| n-1 | 0 |...| 0 | -+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ -|<-------4 bytes------->|<------n bytes------>|<---r bytes--->| -|<----n+r (where (n+r) mod 4 = 0)---->|\fP -.DE -.LP -It is an error to encode a length greater than the maximum -described in the specification. -.NH 2 -\&String -.IX XDR string -.LP -The standard defines a string of n (numbered 0 through n-1) ASCII -bytes to be the number n encoded as an unsigned integer (as described -above), and followed by the n bytes of the string. Byte m of the -string always precedes byte m+1 of the string, and byte 0 of the -string always follows the string's length. If n is not a multiple of -four, then the n bytes are followed by enough (0 to 3) residual zero -bytes, r, to make the total byte count a multiple of four. Counted -byte strings are declared as follows: -.DS -.ft CW -string object; -.DE -or -.DS -.ft CW -string object<>; -.DE -The constant m denotes an upper bound of the number of bytes that a -string may contain. If m is not specified, as in the second -declaration, it is assumed to be (2**32) - 1, the maximum length. -The constant m would normally be found in a protocol specification. -For example, a filing protocol may state that a file name can be no -longer than 255 bytes, as follows: -.DS -.ft CW -string filename<255>; -.DE -Which can be illustrated as: -.ie t .DS -.el .DS L -\fIA String\fP - -\f(CW0 1 2 3 4 5 ... -+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ -| length n |byte0|byte1|...| n-1 | 0 |...| 0 | -+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ -|<-------4 bytes------->|<------n bytes------>|<---r bytes--->| -|<----n+r (where (n+r) mod 4 = 0)---->|\fP -.DE -.LP -It is an error to encode a length greater than the maximum -described in the specification. -.NH 2 -\&Fixed-length Array -.IX XDR "fixed-length array" -.IX XDR "array, fixed length" -.LP -Declarations for fixed-length arrays of homogeneous elements are in -the following form: -.DS -.ft CW -type-name identifier[n]; -.DE -Fixed-length arrays of elements numbered 0 through n-1 are encoded by -individually encoding the elements of the array in their natural -order, 0 through n-1. Each element's size is a multiple of four -bytes. Though all elements are of the same type, the elements may -have different sizes. For example, in a fixed-length array of -strings, all elements are of type "string", yet each element will -vary in its length. -.ie t .DS -.el .DS L -\fIFixed-Length Array\fP - -\f(CW+---+---+---+---+---+---+---+---+...+---+---+---+---+ -| element 0 | element 1 |...| element n-1 | -+---+---+---+---+---+---+---+---+...+---+---+---+---+ -|<--------------------n elements------------------->|\fP -.DE -.NH 2 -\&Variable-length Array -.IX XDR "variable-length array" -.IX XDR "array, variable length" -.LP -Counted arrays provide the ability to encode variable-length arrays -of homogeneous elements. The array is encoded as the element count n -(an unsigned integer) followed by the encoding of each of the array's -elements, starting with element 0 and progressing through element n- -1. The declaration for variable-length arrays follows this form: -.DS -.ft CW -type-name identifier; -.DE -or -.DS -.ft CW -type-name identifier<>; -.DE -The constant m specifies the maximum acceptable element count of an -array; if m is not specified, as in the second declaration, it is -assumed to be (2**32) - 1. -.ie t .DS -.el .DS L -\fICounted Array\fP - -\f(CW0 1 2 3 -+--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+ -| n | element 0 | element 1 |...|element n-1| -+--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+ -|<-4 bytes->|<--------------n elements------------->|\fP -.DE -It is an error to encode a value of n that is greater than the -maximum described in the specification. -.NH 2 -\&Structure -.IX XDR structure -.LP -Structures are declared as follows: -.DS -.ft CW -struct { - component-declaration-A; - component-declaration-B; - \&... -} identifier; -.DE -The components of the structure are encoded in the order of their -declaration in the structure. Each component's size is a multiple of -four bytes, though the components may be different sizes. -.ie t .DS -.el .DS L -\fIStructure\fP - -\f(CW+-------------+-------------+... -| component A | component B |... -+-------------+-------------+...\fP -.DE -.NH 2 -\&Discriminated Union -.IX XDR "discriminated union" -.IX XDR union discriminated -.LP -A discriminated union is a type composed of a discriminant followed -by a type selected from a set of prearranged types according to the -value of the discriminant. The type of discriminant is either "int", -"unsigned int", or an enumerated type, such as "bool". The component -types are called "arms" of the union, and are preceded by the value -of the discriminant which implies their encoding. Discriminated -unions are declared as follows: -.DS -.ft CW -union switch (discriminant-declaration) { - case discriminant-value-A: - arm-declaration-A; - case discriminant-value-B: - arm-declaration-B; - \&... - default: default-declaration; -} identifier; -.DE -Each "case" keyword is followed by a legal value of the discriminant. -The default arm is optional. If it is not specified, then a valid -encoding of the union cannot take on unspecified discriminant values. -The size of the implied arm is always a multiple of four bytes. -.LP -The discriminated union is encoded as its discriminant followed by -the encoding of the implied arm. -.ie t .DS -.el .DS L -\fIDiscriminated Union\fP - -\f(CW0 1 2 3 -+---+---+---+---+---+---+---+---+ -| discriminant | implied arm | -+---+---+---+---+---+---+---+---+ -|<---4 bytes--->|\fP -.DE -.NH 2 -\&Void -.IX XDR void -.LP -An XDR void is a 0-byte quantity. Voids are useful for describing -operations that take no data as input or no data as output. They are -also useful in unions, where some arms may contain data and others do -not. The declaration is simply as follows: -.DS -.ft CW -void; -.DE -Voids are illustrated as follows: -.ie t .DS -.el .DS L -\fIVoid\fP - -\f(CW ++ - || - ++ ---><-- 0 bytes\fP -.DE -.NH 2 -\&Constant -.IX XDR constant -.LP -The data declaration for a constant follows this form: -.DS -.ft CW -const name-identifier = n; -.DE -"const" is used to define a symbolic name for a constant; it does not -declare any data. The symbolic constant may be used anywhere a -regular constant may be used. For example, the following defines a -symbolic constant DOZEN, equal to 12. -.DS -.ft CW -const DOZEN = 12; -.DE -.NH 2 -\&Typedef -.IX XDR typedef -.LP -"typedef" does not declare any data either, but serves to define new -identifiers for declaring data. The syntax is: -.DS -.ft CW -typedef declaration; -.DE -The new type name is actually the variable name in the declaration -part of the typedef. For example, the following defines a new type -called "eggbox" using an existing type called "egg": -.DS -.ft CW -typedef egg eggbox[DOZEN]; -.DE -Variables declared using the new type name have the same type as the -new type name would have in the typedef, if it was considered a -variable. For example, the following two declarations are equivalent -in declaring the variable "fresheggs": -.DS -.ft CW -eggbox fresheggs; -egg fresheggs[DOZEN]; -.DE -When a typedef involves a struct, enum, or union definition, there is -another (preferred) syntax that may be used to define the same type. -In general, a typedef of the following form: -.DS -.ft CW -typedef <> identifier; -.DE -may be converted to the alternative form by removing the "typedef" -part and placing the identifier after the "struct", "union", or -"enum" keyword, instead of at the end. For example, here are the two -ways to define the type "bool": -.DS -.ft CW -typedef enum { /* \fIusing typedef\fP */ - FALSE = 0, - TRUE = 1 - } bool; - -enum bool { /* \fIpreferred alternative\fP */ - FALSE = 0, - TRUE = 1 - }; -.DE -The reason this syntax is preferred is one does not have to wait -until the end of a declaration to figure out the name of the new -type. -.NH 2 -\&Optional-data -.IX XDR "optional data" -.IX XDR "data, optional" -.LP -Optional-data is one kind of union that occurs so frequently that we -give it a special syntax of its own for declaring it. It is declared -as follows: -.DS -.ft CW -type-name *identifier; -.DE -This is equivalent to the following union: -.DS -.ft CW -union switch (bool opted) { - case TRUE: - type-name element; - case FALSE: - void; -} identifier; -.DE -It is also equivalent to the following variable-length array -declaration, since the boolean "opted" can be interpreted as the -length of the array: -.DS -.ft CW -type-name identifier<1>; -.DE -Optional-data is not so interesting in itself, but it is very useful -for describing recursive data-structures such as linked-lists and -trees. For example, the following defines a type "stringlist" that -encodes lists of arbitrary length strings: -.DS -.ft CW -struct *stringlist { - string item<>; - stringlist next; -}; -.DE -It could have been equivalently declared as the following union: -.DS -.ft CW -union stringlist switch (bool opted) { - case TRUE: - struct { - string item<>; - stringlist next; - } element; - case FALSE: - void; -}; -.DE -or as a variable-length array: -.DS -.ft CW -struct stringlist<1> { - string item<>; - stringlist next; -}; -.DE -Both of these declarations obscure the intention of the stringlist -type, so the optional-data declaration is preferred over both of -them. The optional-data type also has a close correlation to how -recursive data structures are represented in high-level languages -such as Pascal or C by use of pointers. In fact, the syntax is the -same as that of the C language for pointers. -.NH 2 -\&Areas for Future Enhancement -.IX XDR futures -.LP -The XDR standard lacks representations for bit fields and bitmaps, -since the standard is based on bytes. Also missing are packed (or -binary-coded) decimals. -.LP -The intent of the XDR standard was not to describe every kind of data -that people have ever sent or will ever want to send from machine to -machine. Rather, it only describes the most commonly used data-types -of high-level languages such as Pascal or C so that applications -written in these languages will be able to communicate easily over -some medium. -.LP -One could imagine extensions to XDR that would let it describe almost -any existing protocol, such as TCP. The minimum necessary for this -are support for different block sizes and byte-orders. The XDR -discussed here could then be considered the 4-byte big-endian member -of a larger XDR family. -.NH 1 -\&Discussion -.sp 2 -.NH 2 -\&Why a Language for Describing Data? -.IX XDR language -.LP -There are many advantages in using a data-description language such -as XDR versus using diagrams. Languages are more formal than -diagrams and lead to less ambiguous descriptions of data. -Languages are also easier to understand and allow one to think of -other issues instead of the low-level details of bit-encoding. -Also, there is a close analogy between the types of XDR and a -high-level language such as C or Pascal. This makes the -implementation of XDR encoding and decoding modules an easier task. -Finally, the language specification itself is an ASCII string that -can be passed from machine to machine to perform on-the-fly data -interpretation. -.NH 2 -\&Why Only one Byte-Order for an XDR Unit? -.IX XDR "byte order" -.LP -Supporting two byte-orderings requires a higher level protocol for -determining in which byte-order the data is encoded. Since XDR is -not a protocol, this can't be done. The advantage of this, though, -is that data in XDR format can be written to a magnetic tape, for -example, and any machine will be able to interpret it, since no -higher level protocol is necessary for determining the byte-order. -.NH 2 -\&Why does XDR use Big-Endian Byte-Order? -.LP -Yes, it is unfair, but having only one byte-order means you have to -be unfair to somebody. Many architectures, such as the Motorola -68000 and IBM 370, support the big-endian byte-order. -.NH 2 -\&Why is the XDR Unit Four Bytes Wide? -.LP -There is a tradeoff in choosing the XDR unit size. Choosing a small -size such as two makes the encoded data small, but causes alignment -problems for machines that aren't aligned on these boundaries. A -large size such as eight means the data will be aligned on virtually -every machine, but causes the encoded data to grow too big. We chose -four as a compromise. Four is big enough to support most -architectures efficiently, except for rare machines such as the -eight-byte aligned Cray. Four is also small enough to keep the -encoded data restricted to a reasonable size. -.NH 2 -\&Why must Variable-Length Data be Padded with Zeros? -.IX XDR "variable-length data" -.LP -It is desirable that the same data encode into the same thing on all -machines, so that encoded data can be meaningfully compared or -checksummed. Forcing the padded bytes to be zero ensures this. -.NH 2 -\&Why is there No Explicit Data-Typing? -.LP -Data-typing has a relatively high cost for what small advantages it -may have. One cost is the expansion of data due to the inserted type -fields. Another is the added cost of interpreting these type fields -and acting accordingly. And most protocols already know what type -they expect, so data-typing supplies only redundant information. -However, one can still get the benefits of data-typing using XDR. One -way is to encode two things: first a string which is the XDR data -description of the encoded data, and then the encoded data itself. -Another way is to assign a value to all the types in XDR, and then -define a universal type which takes this value as its discriminant -and for each value, describes the corresponding data type. -.NH 1 -\&The XDR Language Specification -.IX XDR language -.sp 1 -.NH 2 -\&Notational Conventions -.IX "XDR language" notation -.LP -This specification uses an extended Backus-Naur Form notation for -describing the XDR language. Here is a brief description of the -notation: -.IP 1. -The characters -.I | , -.I ( , -.I ) , -.I [ , -.I ] , -.I " , -and -.I * -are special. -.IP 2. -Terminal symbols are strings of any characters surrounded by -double quotes. -.IP 3. -Non-terminal symbols are strings of non-special characters. -.IP 4. -Alternative items are separated by a vertical bar ("\fI|\fP"). -.IP 5. -Optional items are enclosed in brackets. -.IP 6. -Items are grouped together by enclosing them in parentheses. -.IP 7. -A -.I * -following an item means 0 or more occurrences of that item. -.LP -For example, consider the following pattern: -.DS L -"a " "very" (", " " very")* [" cold " "and"] " rainy " ("day" | "night") -.DE -.LP -An infinite number of strings match this pattern. A few of them -are: -.DS -"a very rainy day" -"a very, very rainy day" -"a very cold and rainy day" -"a very, very, very cold and rainy night" -.DE -.NH 2 -\&Lexical Notes -.IP 1. -Comments begin with '/*' and terminate with '*/'. -.IP 2. -White space serves to separate items and is otherwise ignored. -.IP 3. -An identifier is a letter followed by an optional sequence of -letters, digits or underbar ('_'). The case of identifiers is -not ignored. -.IP 4. -A constant is a sequence of one or more decimal digits, -optionally preceded by a minus-sign ('-'). -.NH 2 -\&Syntax Information -.IX "XDR language" syntax -.DS -.ft CW -declaration: - type-specifier identifier - | type-specifier identifier "[" value "]" - | type-specifier identifier "<" [ value ] ">" - | "opaque" identifier "[" value "]" - | "opaque" identifier "<" [ value ] ">" - | "string" identifier "<" [ value ] ">" - | type-specifier "*" identifier - | "void" -.DE -.DS -.ft CW -value: - constant - | identifier - -type-specifier: - [ "unsigned" ] "int" - | [ "unsigned" ] "hyper" - | "float" - | "double" - | "bool" - | enum-type-spec - | struct-type-spec - | union-type-spec - | identifier -.DE -.DS -.ft CW -enum-type-spec: - "enum" enum-body - -enum-body: - "{" - ( identifier "=" value ) - ( "," identifier "=" value )* - "}" -.DE -.DS -.ft CW -struct-type-spec: - "struct" struct-body - -struct-body: - "{" - ( declaration ";" ) - ( declaration ";" )* - "}" -.DE -.DS -.ft CW -union-type-spec: - "union" union-body - -union-body: - "switch" "(" declaration ")" "{" - ( "case" value ":" declaration ";" ) - ( "case" value ":" declaration ";" )* - [ "default" ":" declaration ";" ] - "}" - -constant-def: - "const" identifier "=" constant ";" -.DE -.DS -.ft CW -type-def: - "typedef" declaration ";" - | "enum" identifier enum-body ";" - | "struct" identifier struct-body ";" - | "union" identifier union-body ";" - -definition: - type-def - | constant-def - -specification: - definition * -.DE -.NH 3 -\&Syntax Notes -.IX "XDR language" syntax -.LP -.IP 1. -The following are keywords and cannot be used as identifiers: -"bool", "case", "const", "default", "double", "enum", "float", -"hyper", "opaque", "string", "struct", "switch", "typedef", "union", -"unsigned" and "void". -.IP 2. -Only unsigned constants may be used as size specifications for -arrays. If an identifier is used, it must have been declared -previously as an unsigned constant in a "const" definition. -.IP 3. -Constant and type identifiers within the scope of a specification -are in the same name space and must be declared uniquely within this -scope. -.IP 4. -Similarly, variable names must be unique within the scope of -struct and union declarations. Nested struct and union declarations -create new scopes. -.IP 5. -The discriminant of a union must be of a type that evaluates to -an integer. That is, "int", "unsigned int", "bool", an enumerated -type or any typedefed type that evaluates to one of these is legal. -Also, the case values must be one of the legal values of the -discriminant. Finally, a case value may not be specified more than -once within the scope of a union declaration. -.NH 1 -\&An Example of an XDR Data Description -.LP -Here is a short XDR data description of a thing called a "file", -which might be used to transfer files from one machine to another. -.ie t .DS -.el .DS L -.ft CW - -const MAXUSERNAME = 32; /*\fI max length of a user name \fP*/ -const MAXFILELEN = 65535; /*\fI max length of a file \fP*/ -const MAXNAMELEN = 255; /*\fI max length of a file name \fP*/ - -.ft I -/* - * Types of files: - */ -.ft CW - -enum filekind { - TEXT = 0, /*\fI ascii data \fP*/ - DATA = 1, /*\fI raw data \fP*/ - EXEC = 2 /*\fI executable \fP*/ -}; - -.ft I -/* - * File information, per kind of file: - */ -.ft CW - -union filetype switch (filekind kind) { - case TEXT: - void; /*\fI no extra information \fP*/ - case DATA: - string creator; /*\fI data creator \fP*/ - case EXEC: - string interpretor; /*\fI program interpretor \fP*/ -}; - -.ft I -/* - * A complete file: - */ -.ft CW - -struct file { - string filename; /*\fI name of file \fP*/ - filetype type; /*\fI info about file \fP*/ - string owner; /*\fI owner of file \fP*/ - opaque data; /*\fI file data \fP*/ -}; -.DE -.LP -Suppose now that there is a user named "john" who wants to store -his lisp program "sillyprog" that contains just the data "(quit)". -His file would be encoded as follows: -.TS -box tab (&) ; -lfI lfI lfI lfI -rfL rfL rfL l . -Offset&Hex Bytes&ASCII&Description -_ -0&00 00 00 09&....&Length of filename = 9 -4&73 69 6c 6c&sill&Filename characters -8&79 70 72 6f&ypro& ... and more characters ... -12&67 00 00 00&g...& ... and 3 zero-bytes of fill -16&00 00 00 02&....&Filekind is EXEC = 2 -20&00 00 00 04&....&Length of interpretor = 4 -24&6c 69 73 70&lisp&Interpretor characters -28&00 00 00 04&....&Length of owner = 4 -32&6a 6f 68 6e&john&Owner characters -36&00 00 00 06&....&Length of file data = 6 -40&28 71 75 69&(qui&File data bytes ... -44&74 29 00 00&t)..& ... and 2 zero-bytes of fill -.TE -.NH 1 -\&References -.LP -[1] Brian W. Kernighan & Dennis M. Ritchie, "The C Programming -Language", Bell Laboratories, Murray Hill, New Jersey, 1978. -.LP -[2] Danny Cohen, "On Holy Wars and a Plea for Peace", IEEE Computer, -October 1981. -.LP -[3] "IEEE Standard for Binary Floating-Point Arithmetic", ANSI/IEEE -Standard 754-1985, Institute of Electrical and Electronics -Engineers, August 1985. -.LP -[4] "Courier: The Remote Procedure Call Protocol", XEROX -Corporation, XSIS 038112, December 1981. diff --git a/sbin/fsck_ffs/SMM.doc/0.t b/sbin/fsck_ffs/SMM.doc/0.t deleted file mode 100644 index 5fe189d..0000000 --- a/sbin/fsck_ffs/SMM.doc/0.t +++ /dev/null @@ -1,147 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" @(#)0.t 8.1 (Berkeley) 6/8/93 -.\" -.if n .ND -.TL -Fsck_ffs \- The UNIX\(dg File System Check Program -.EH 'SMM:3-%''The \s-2UNIX\s+2 File System Check Program' -.OH 'The \s-2UNIX\s+2 File System Check Program''SMM:3-%' -.AU -Marshall Kirk McKusick -.AI -Computer Systems Research Group -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, CA 94720 -.AU -T. J. Kowalski -.AI -Bell Laboratories -Murray Hill, New Jersey 07974 -.AB -.FS -\(dgUNIX is a trademark of Bell Laboratories. -.FE -.FS -This work was done under grants from -the National Science Foundation under grant MCS80-05144, -and the Defense Advance Research Projects Agency (DoD) under -Arpa Order No. 4031 monitored by Naval Electronic System Command under -Contract No. N00039-82-C-0235. -.FE -This document reflects the use of -.I fsck_ffs -with the 4.2BSD and 4.3BSD file system organization. This -is a revision of the -original paper written by -T. J. Kowalski. -.PP -File System Check Program (\fIfsck_ffs\fR) -is an interactive file system check and repair program. -.I Fsck_ffs -uses the redundant structural information in the -UNIX file system to perform several consistency checks. -If an inconsistency is detected, it is reported -to the operator, who may elect to fix or ignore -each inconsistency. -These inconsistencies result from the permanent interruption -of the file system updates, which are performed every -time a file is modified. -Unless there has been a hardware failure, -.I fsck_ffs -is able to repair corrupted file systems -using procedures based upon the order in which UNIX honors -these file system update requests. -.PP -The purpose of this document is to describe the normal updating -of the file system, -to discuss the possible causes of file system corruption, -and to present the corrective actions implemented -by -.I fsck_ffs. -Both the program and the interaction between the -program and the operator are described. -.sp 2 -.LP -Revised October 7, 1996 -.AE -.LP -.bp -.ce -.B "TABLE OF CONTENTS" -.LP -.sp 1 -.nf -.B "1. Introduction" -.LP -.sp .5v -.nf -.B "2. Overview of the file system -2.1. Superblock -2.2. Summary Information -2.3. Cylinder groups -2.4. Fragments -2.5. Updates to the file system -.LP -.sp .5v -.nf -.B "3. Fixing corrupted file systems -3.1. Detecting and correcting corruption -3.2. Super block checking -3.3. Free block checking -3.4. Checking the inode state -3.5. Inode links -3.6. Inode data size -3.7. Checking the data associated with an inode -3.8. File system connectivity -.LP -.sp .5v -.nf -.B Acknowledgements -.LP -.sp .5v -.nf -.B References -.LP -.sp .5v -.nf -.B "4. Appendix A -4.1. Conventions -4.2. Initialization -4.3. Phase 1 - Check Blocks and Sizes -4.4. Phase 1b - Rescan for more Dups -4.5. Phase 2 - Check Pathnames -4.6. Phase 3 - Check Connectivity -4.7. Phase 4 - Check Reference Counts -4.8. Phase 5 - Check Cyl groups -4.9. Cleanup -.ds RH Introduction -.bp diff --git a/sbin/fsck_ffs/SMM.doc/1.t b/sbin/fsck_ffs/SMM.doc/1.t deleted file mode 100644 index 3098b49..0000000 --- a/sbin/fsck_ffs/SMM.doc/1.t +++ /dev/null @@ -1,80 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" @(#)1.t 8.1 (Berkeley) 6/5/93 -.\" -.ds RH Introduction -.NH -Introduction -.PP -This document reflects the use of -.I fsck_ffs -with the 4.2BSD and 4.3BSD file system organization. This -is a revision of the -original paper written by -T. J. Kowalski. -.PP -When a UNIX -operating system is brought up, a consistency -check of the file systems should always be performed. -This precautionary measure helps to insure -a reliable environment for file storage on disk. -If an inconsistency is discovered, -corrective action must be taken. -.I Fsck_ffs -runs in two modes. -Normally it is run non-interactively by the system after -a normal boot. -When running in this mode, -it will only make changes to the file system that are known -to always be correct. -If an unexpected inconsistency is found -.I fsck_ffs -will exit with a non-zero exit status, -leaving the system running single-user. -Typically the operator then runs -.I fsck_ffs -interactively. -When running in this mode, -each problem is listed followed by a suggested corrective action. -The operator must decide whether or not the suggested correction -should be made. -.PP -The purpose of this memo is to dispel the -mystique surrounding -file system inconsistencies. -It first describes the updating of the file system -(the calm before the storm) and -then describes file system corruption (the storm). -Finally, -the set of deterministic corrective actions -used by -.I fsck_ffs -(the Coast Guard -to the rescue) is presented. -.ds RH Overview of the File System diff --git a/sbin/fsck_ffs/SMM.doc/2.t b/sbin/fsck_ffs/SMM.doc/2.t deleted file mode 100644 index b294a6a..0000000 --- a/sbin/fsck_ffs/SMM.doc/2.t +++ /dev/null @@ -1,262 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" @(#)2.t 8.1 (Berkeley) 6/5/93 -.\" -.ds RH Overview of the file system -.NH -Overview of the file system -.PP -The file system is discussed in detail in [Mckusick84]; -this section gives a brief overview. -.NH 2 -Superblock -.PP -A file system is described by its -.I "super-block" . -The super-block is built when the file system is created (\c -.I newfs (8)) -and never changes. -The super-block -contains the basic parameters of the file system, -such as the number of data blocks it contains -and a count of the maximum number of files. -Because the super-block contains critical data, -.I newfs -replicates it to protect against catastrophic loss. -The -.I "default super block" -always resides at a fixed offset from the beginning -of the file system's disk partition. -The -.I "redundant super blocks" -are not referenced unless a head crash -or other hard disk error causes the default super-block -to be unusable. -The redundant blocks are sprinkled throughout the disk partition. -.PP -Within the file system are files. -Certain files are distinguished as directories and contain collections -of pointers to files that may themselves be directories. -Every file has a descriptor associated with it called an -.I "inode". -The inode contains information describing ownership of the file, -time stamps indicating modification and access times for the file, -and an array of indices pointing to the data blocks for the file. -In this section, -we assume that the first 12 blocks -of the file are directly referenced by values stored -in the inode structure itself\(dg. -.FS -\(dgThe actual number may vary from system to system, but is usually in -the range 5-13. -.FE -The inode structure may also contain references to indirect blocks -containing further data block indices. -In a file system with a 4096 byte block size, a singly indirect -block contains 1024 further block addresses, -a doubly indirect block contains 1024 addresses of further single indirect -blocks, -and a triply indirect block contains 1024 addresses of further doubly indirect -blocks (the triple indirect block is never needed in practice). -.PP -In order to create files with up to -2\(ua32 bytes, -using only two levels of indirection, -the minimum size of a file system block is 4096 bytes. -The size of file system blocks can be any power of two -greater than or equal to 4096. -The block size of the file system is maintained in the super-block, -so it is possible for file systems of different block sizes -to be accessible simultaneously on the same system. -The block size must be decided when -.I newfs -creates the file system; -the block size cannot be subsequently -changed without rebuilding the file system. -.NH 2 -Summary information -.PP -Associated with the super block is non replicated -.I "summary information" . -The summary information changes -as the file system is modified. -The summary information contains -the number of blocks, fragments, inodes and directories in the file system. -.NH 2 -Cylinder groups -.PP -The file system partitions the disk into one or more areas called -.I "cylinder groups". -A cylinder group is comprised of one or more consecutive -cylinders on a disk. -Each cylinder group includes inode slots for files, a -.I "block map" -describing available blocks in the cylinder group, -and summary information describing the usage of data blocks -within the cylinder group. -A fixed number of inodes is allocated for each cylinder group -when the file system is created. -The current policy is to allocate one inode for each 2048 -bytes of disk space; -this is expected to be far more inodes than will ever be needed. -.PP -All the cylinder group bookkeeping information could be -placed at the beginning of each cylinder group. -However if this approach were used, -all the redundant information would be on the top platter. -A single hardware failure that destroyed the top platter -could cause the loss of all copies of the redundant super-blocks. -Thus the cylinder group bookkeeping information -begins at a floating offset from the beginning of the cylinder group. -The offset for -the -.I "i+1" st -cylinder group is about one track further -from the beginning of the cylinder group -than it was for the -.I "i" th -cylinder group. -In this way, -the redundant -information spirals down into the pack; -any single track, cylinder, -or platter can be lost without losing all copies of the super-blocks. -Except for the first cylinder group, -the space between the beginning of the cylinder group -and the beginning of the cylinder group information stores data. -.NH 2 -Fragments -.PP -To avoid waste in storing small files, -the file system space allocator divides a single -file system block into one or more -.I "fragments". -The fragmentation of the file system is specified -when the file system is created; -each file system block can be optionally broken into -2, 4, or 8 addressable fragments. -The lower bound on the size of these fragments is constrained -by the disk sector size; -typically 512 bytes is the lower bound on fragment size. -The block map associated with each cylinder group -records the space availability at the fragment level. -Aligned fragments are examined -to determine block availability. -.PP -On a file system with a block size of 4096 bytes -and a fragment size of 1024 bytes, -a file is represented by zero or more 4096 byte blocks of data, -and possibly a single fragmented block. -If a file system block must be fragmented to obtain -space for a small amount of data, -the remainder of the block is made available for allocation -to other files. -For example, -consider an 11000 byte file stored on -a 4096/1024 byte file system. -This file uses two full size blocks and a 3072 byte fragment. -If no fragments with at least 3072 bytes -are available when the file is created, -a full size block is split yielding the necessary 3072 byte -fragment and an unused 1024 byte fragment. -This remaining fragment can be allocated to another file, as needed. -.NH 2 -Updates to the file system -.PP -Every working day hundreds of files -are created, modified, and removed. -Every time a file is modified, -the operating system performs a -series of file system updates. -These updates, when written on disk, yield a consistent file system. -The file system stages -all modifications of critical information; -modification can -either be completed or cleanly backed out after a crash. -Knowing the information that is first written to the file system, -deterministic procedures can be developed to -repair a corrupted file system. -To understand this process, -the order that the update -requests were being honored must first be understood. -.PP -When a user program does an operation to change the file system, -such as a -.I write , -the data to be written is copied into an internal -.I "in-core" -buffer in the kernel. -Normally, the disk update is handled asynchronously; -the user process is allowed to proceed even though -the data has not yet been written to the disk. -The data, -along with the inode information reflecting the change, -is eventually written out to disk. -The real disk write may not happen until long after the -.I write -system call has returned. -Thus at any given time, the file system, -as it resides on the disk, -lags the state of the file system represented by the in-core information. -.PP -The disk information is updated to reflect the in-core information -when the buffer is required for another use, -when a -.I sync (2) -is done (at 30 second intervals) by -.I "/etc/update" "(8)," -or by manual operator intervention with the -.I sync (8) -command. -If the system is halted without writing out the in-core information, -the file system on the disk will be in an inconsistent state. -.PP -If all updates are done asynchronously, several serious -inconsistencies can arise. -One inconsistency is that a block may be claimed by two inodes. -Such an inconsistency can occur when the system is halted before -the pointer to the block in the old inode has been cleared -in the copy of the old inode on the disk, -and after the pointer to the block in the new inode has been written out -to the copy of the new inode on the disk. -Here, -there is no deterministic method for deciding -which inode should really claim the block. -A similar problem can arise with a multiply claimed inode. -.PP -The problem with asynchronous inode updates -can be avoided by doing all inode deallocations synchronously. -Consequently, -inodes and indirect blocks are written to the disk synchronously -(\fIi.e.\fP the process blocks until the information is -really written to disk) -when they are being deallocated. -Similarly inodes are kept consistent by synchronously -deleting, adding, or changing directory entries. -.ds RH Fixing corrupted file systems diff --git a/sbin/fsck_ffs/SMM.doc/3.t b/sbin/fsck_ffs/SMM.doc/3.t deleted file mode 100644 index 522a222..0000000 --- a/sbin/fsck_ffs/SMM.doc/3.t +++ /dev/null @@ -1,449 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" @(#)3.t 8.1 (Berkeley) 6/5/93 -.\" -.ds RH Fixing corrupted file systems -.NH -Fixing corrupted file systems -.PP -A file system -can become corrupted in several ways. -The most common of these ways are -improper shutdown procedures -and hardware failures. -.PP -File systems may become corrupted during an -.I "unclean halt" . -This happens when proper shutdown -procedures are not observed, -physically write-protecting a mounted file system, -or a mounted file system is taken off-line. -The most common operator procedural failure is forgetting to -.I sync -the system before halting the CPU. -.PP -File systems may become further corrupted if proper startup -procedures are not observed, e.g., -not checking a file system for inconsistencies, -and not repairing inconsistencies. -Allowing a corrupted file system to be used (and, thus, to be modified -further) can be disastrous. -.PP -Any piece of hardware can fail at any time. -Failures -can be as subtle as a bad block -on a disk pack, or as blatant as a non-functional disk-controller. -.NH 2 -Detecting and correcting corruption -.PP -Normally -.I fsck_ffs -is run non-interactively. -In this mode it will only fix -corruptions that are expected to occur from an unclean halt. -These actions are a proper subset of the actions that -.I fsck_ffs -will take when it is running interactively. -Throughout this paper we assume that -.I fsck_ffs -is being run interactively, -and all possible errors can be encountered. -When an inconsistency is discovered in this mode, -.I fsck_ffs -reports the inconsistency for the operator to -chose a corrective action. -.PP -A quiescent\(dd -.FS -\(dd I.e., unmounted and not being written on. -.FE -file system may be checked for structural integrity -by performing consistency checks on the -redundant data intrinsic to a file system. -The redundant data is either read from -the file system, -or computed from other known values. -The file system -.B must -be in a quiescent state when -.I fsck_ffs -is run, -since -.I fsck_ffs -is a multi-pass program. -.PP -In the following sections, -we discuss methods to discover inconsistencies -and possible corrective actions -for the cylinder group blocks, the inodes, the indirect blocks, and -the data blocks containing directory entries. -.NH 2 -Super-block checking -.PP -The most commonly corrupted item in a file system -is the summary information -associated with the super-block. -The summary information is prone to corruption -because it is modified with every change to the file -system's blocks or inodes, -and is usually corrupted -after an unclean halt. -.PP -The super-block is checked for inconsistencies -involving file-system size, number of inodes, -free-block count, and the free-inode count. -The file-system size must be larger than the -number of blocks used by the super-block -and the number of blocks used by the list of inodes. -The file-system size and layout information -are the most critical pieces of information for -.I fsck_ffs . -While there is no way to actually check these sizes, -since they are statically determined by -.I newfs , -.I fsck_ffs -can check that these sizes are within reasonable bounds. -All other file system checks require that these sizes be correct. -If -.I fsck_ffs -detects corruption in the static parameters of the default super-block, -.I fsck_ffs -requests the operator to specify the location of an alternate super-block. -.NH 2 -Free block checking -.PP -.I Fsck_ffs -checks that all the blocks -marked as free in the cylinder group block maps -are not claimed by any files. -When all the blocks have been initially accounted for, -.I fsck_ffs -checks that -the number of free blocks -plus the number of blocks claimed by the inodes -equals the total number of blocks in the file system. -.PP -If anything is wrong with the block allocation maps, -.I fsck_ffs -will rebuild them, -based on the list it has computed of allocated blocks. -.PP -The summary information associated with the super-block -counts the total number of free blocks within the file system. -.I Fsck_ffs -compares this count to the -number of free blocks it found within the file system. -If the two counts do not agree, then -.I fsck_ffs -replaces the incorrect count in the summary information -by the actual free-block count. -.PP -The summary information -counts the total number of free inodes within the file system. -.I Fsck_ffs -compares this count to the number -of free inodes it found within the file system. -If the two counts do not agree, then -.I fsck_ffs -replaces the incorrect count in the -summary information by the actual free-inode count. -.NH 2 -Checking the inode state -.PP -An individual inode is not as likely to be corrupted as -the allocation information. -However, because of the great number of active inodes, -a few of the inodes are usually corrupted. -.PP -The list of inodes in the file system -is checked sequentially starting with inode 2 -(inode 0 marks unused inodes; -inode 1 is saved for future generations) -and progressing through the last inode in the file system. -The state of each inode is checked for -inconsistencies involving format and type, -link count, -duplicate blocks, -bad blocks, -and inode size. -.PP -Each inode contains a mode word. -This mode word describes the type and state of the inode. -Inodes must be one of six types: -regular inode, directory inode, symbolic link inode, -special block inode, special character inode, or socket inode. -Inodes may be found in one of three allocation states: -unallocated, allocated, and neither unallocated nor allocated. -This last state suggests an incorrectly formated inode. -An inode can get in this state if -bad data is written into the inode list. -The only possible corrective action is for -.I fsck_ffs -is to clear the inode. -.NH 2 -Inode links -.PP -Each inode counts the -total number of directory entries -linked to the inode. -.I Fsck_ffs -verifies the link count of each inode -by starting at the root of the file system, -and descending through the directory structure. -The actual link count for each inode -is calculated during the descent. -.PP -If the stored link count is non-zero and the actual -link count is zero, -then no directory entry appears for the inode. -If this happens, -.I fsck_ffs -will place the disconnected file in the -.I lost+found -directory. -If the stored and actual link counts are non-zero and unequal, -a directory entry may have been added or removed without the inode being -updated. -If this happens, -.I fsck_ffs -replaces the incorrect stored link count by the actual link count. -.PP -Each inode contains a list, -or pointers to -lists (indirect blocks), -of all the blocks claimed by the inode. -Since indirect blocks are owned by an inode, -inconsistencies in indirect blocks directly -affect the inode that owns it. -.PP -.I Fsck_ffs -compares each block number claimed by an inode -against a list of already allocated blocks. -If another inode already claims a block number, -then the block number is added to a list of -.I "duplicate blocks" . -Otherwise, the list of allocated blocks -is updated to include the block number. -.PP -If there are any duplicate blocks, -.I fsck_ffs -will perform a partial second -pass over the inode list -to find the inode of the duplicated block. -The second pass is needed, -since without examining the files associated with -these inodes for correct content, -not enough information is available -to determine which inode is corrupted and should be cleared. -If this condition does arise -(only hardware failure will cause it), -then the inode with the earliest -modify time is usually incorrect, -and should be cleared. -If this happens, -.I fsck_ffs -prompts the operator to clear both inodes. -The operator must decide which one should be kept -and which one should be cleared. -.PP -.I Fsck_ffs -checks the range of each block number claimed by an inode. -If the block number is -lower than the first data block in the file system, -or greater than the last data block, -then the block number is a -.I "bad block number" . -Many bad blocks in an inode are usually caused by -an indirect block that was not written to the file system, -a condition which can only occur if there has been a hardware failure. -If an inode contains bad block numbers, -.I fsck_ffs -prompts the operator to clear it. -.NH 2 -Inode data size -.PP -Each inode contains a count of the number of data blocks -that it contains. -The number of actual data blocks -is the sum of the allocated data blocks -and the indirect blocks. -.I Fsck_ffs -computes the actual number of data blocks -and compares that block count against -the actual number of blocks the inode claims. -If an inode contains an incorrect count -.I fsck_ffs -prompts the operator to fix it. -.PP -Each inode contains a thirty-two bit size field. -The size is the number of data bytes -in the file associated with the inode. -The consistency of the byte size field is roughly checked -by computing from the size field the maximum number of blocks -that should be associated with the inode, -and comparing that expected block count against -the actual number of blocks the inode claims. -.NH 2 -Checking the data associated with an inode -.PP -An inode can directly or indirectly -reference three kinds of data blocks. -All referenced blocks must be the same kind. -The three types of data blocks are: -plain data blocks, symbolic link data blocks, and directory data blocks. -Plain data blocks -contain the information stored in a file; -symbolic link data blocks -contain the path name stored in a link. -Directory data blocks contain directory entries. -.I Fsck_ffs -can only check the validity of directory data blocks. -.PP -Each directory data block is checked for -several types of inconsistencies. -These inconsistencies include -directory inode numbers pointing to unallocated inodes, -directory inode numbers that are greater than -the number of inodes in the file system, -incorrect directory inode numbers for ``\fB.\fP'' and ``\fB..\fP'', -and directories that are not attached to the file system. -If the inode number in a directory data block -references an unallocated inode, -then -.I fsck_ffs -will remove that directory entry. -Again, -this condition can only arise when there has been a hardware failure. -.PP -.I Fsck_ffs -also checks for directories with unallocated blocks (holes). -Such directories should never be created. -When found, -.I fsck_ffs -will prompt the user to adjust the length of the offending directory -which is done by shortening the size of the directory to the end of the -last allocated block preceding the hole. -Unfortunately, this means that another Phase 1 run has to be done. -.I Fsck_ffs -will remind the user to rerun fsck_ffs after repairing a -directory containing an unallocated block. -.PP -If a directory entry inode number references -outside the inode list, then -.I fsck_ffs -will remove that directory entry. -This condition occurs if bad data is written into a directory data block. -.PP -The directory inode number entry for ``\fB.\fP'' -must be the first entry in the directory data block. -The inode number for ``\fB.\fP'' -must reference itself; -e.g., it must equal the inode number -for the directory data block. -The directory inode number entry -for ``\fB..\fP'' must be -the second entry in the directory data block. -Its value must equal the inode number for the -parent of the directory entry -(or the inode number of the directory -data block if the directory is the -root directory). -If the directory inode numbers are -incorrect, -.I fsck_ffs -will replace them with the correct values. -If there are multiple hard links to a directory, -the first one encountered is considered the real parent -to which ``\fB..\fP'' should point; -\fIfsck_ffs\fP recommends deletion for the subsequently discovered names. -.NH 2 -File system connectivity -.PP -.I Fsck_ffs -checks the general connectivity of the file system. -If directories are not linked into the file system, then -.I fsck_ffs -links the directory back into the file system in the -.I lost+found -directory. -This condition only occurs when there has been a hardware failure. -.ds RH "References" -.SH -\s+2Acknowledgements\s0 -.PP -I thank Bill Joy, Sam Leffler, Robert Elz and Dennis Ritchie -for their suggestions and help in implementing the new file system. -Thanks also to Robert Henry for his editorial input to -get this document together. -Finally we thank our sponsors, -the National Science Foundation under grant MCS80-05144, -and the Defense Advance Research Projects Agency (DoD) under -Arpa Order No. 4031 monitored by Naval Electronic System Command under -Contract No. N00039-82-C-0235. (Kirk McKusick, July 1983) -.PP -I would like to thank Larry A. Wehr for advice that lead -to the first version of -.I fsck_ffs -and Rick B. Brandt for adapting -.I fsck_ffs -to -UNIX/TS. (T. Kowalski, July 1979) -.sp 2 -.SH -\s+2References\s0 -.LP -.IP [Dolotta78] 20 -Dolotta, T. A., and Olsson, S. B. eds., -.I "UNIX User's Manual, Edition 1.1\^" , -January 1978. -.IP [Joy83] 20 -Joy, W., Cooper, E., Fabry, R., Leffler, S., McKusick, M., and Mosher, D. -4.2BSD System Manual, -.I "University of California at Berkeley" , -.I "Computer Systems Research Group Technical Report" -#4, 1982. -.IP [McKusick84] 20 -McKusick, M., Joy, W., Leffler, S., and Fabry, R. -A Fast File System for UNIX, -\fIACM Transactions on Computer Systems 2\fP, 3. -pp. 181-197, August 1984. -.IP [Ritchie78] 20 -Ritchie, D. M., and Thompson, K., -The UNIX Time-Sharing System, -.I "The Bell System Technical Journal" -.B 57 , -6 (July-August 1978, Part 2), pp. 1905-29. -.IP [Thompson78] 20 -Thompson, K., -UNIX Implementation, -.I "The Bell System Technical Journal\^" -.B 57 , -6 (July-August 1978, Part 2), pp. 1931-46. -.ds RH Appendix A \- Fsck_ffs Error Conditions -.bp diff --git a/sbin/fsck_ffs/SMM.doc/4.t b/sbin/fsck_ffs/SMM.doc/4.t deleted file mode 100644 index 353fab3..0000000 --- a/sbin/fsck_ffs/SMM.doc/4.t +++ /dev/null @@ -1,1421 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" @(#)4.t 8.1 (Berkeley) 6/5/93 -.\" -.ds RH Appendix A \- Fsck_ffs Error Conditions -.NH -Appendix A \- Fsck_ffs Error Conditions -.NH 2 -Conventions -.PP -.I Fsck_ffs -is -a multi-pass file system check program. -Each file system pass invokes a different Phase of the -.I fsck_ffs -program. -After the initial setup, -.I fsck_ffs -performs successive Phases over each file system, -checking blocks and sizes, -path-names, -connectivity, -reference counts, -and the map of free blocks, -(possibly rebuilding it), -and performs some cleanup. -.LP -Normally -.I fsck_ffs -is run non-interactively to -.I preen -the file systems after an unclean halt. -While preen'ing a file system, -it will only fix corruptions that are expected -to occur from an unclean halt. -These actions are a proper subset of the actions that -.I fsck_ffs -will take when it is running interactively. -Throughout this appendix many errors have several options -that the operator can take. -When an inconsistency is detected, -.I fsck_ffs -reports the error condition to the operator. -If a response is required, -.I fsck_ffs -prints a prompt message and -waits for a response. -When preen'ing most errors are fatal. -For those that are expected, -the response taken is noted. -This appendix explains the meaning of each error condition, -the possible responses, and the related error conditions. -.LP -The error conditions are organized by the -.I Phase -of the -.I fsck_ffs -program in which they can occur. -The error conditions that may occur -in more than one Phase -will be discussed in initialization. -.NH 2 -Initialization -.PP -Before a file system check can be performed, certain -tables have to be set up and certain files opened. -This section concerns itself with the opening of files and -the initialization of tables. -This section lists error conditions resulting from -command line options, -memory requests, -opening of files, -status of files, -file system size checks, -and creation of the scratch file. -All the initialization errors are fatal -when the file system is being preen'ed. -.sp -.LP -.B "\fIC\fP option?" -.br -\fIC\fP is not a legal option to -.I fsck_ffs ; -legal options are \-b, \-c, \-y, \-n, and \-p. -.I Fsck_ffs -terminates on this error condition. -See the -.I fsck_ffs (8) -manual entry for further detail. -.sp -.LP -.B "cannot alloc NNN bytes for blockmap" -.br -.B "cannot alloc NNN bytes for freemap" -.br -.B "cannot alloc NNN bytes for statemap" -.br -.B "cannot alloc NNN bytes for lncntp" -.br -.I Fsck_ffs 's -request for memory for its virtual -memory tables failed. -This should never happen. -.I Fsck_ffs -terminates on this error condition. -See a guru. -.sp -.LP -.B "Can't open checklist file: \fIF\fP" -.br -The file system checklist file -\fIF\fP (usually -.I /etc/fstab ) -can not be opened for reading. -.I Fsck_ffs -terminates on this error condition. -Check access modes of \fIF\fP. -.sp -.LP -.B "Can't stat root" -.br -.I Fsck_ffs 's -request for statistics about the root directory ``/'' failed. -This should never happen. -.I Fsck_ffs -terminates on this error condition. -See a guru. -.sp -.LP -.B "Can't stat \fIF\fP" -.br -.B "Can't make sense out of name \fIF\fP" -.br -.I Fsck_ffs 's -request for statistics about the file system \fIF\fP failed. -When running manually, -it ignores this file system -and continues checking the next file system given. -Check access modes of \fIF\fP. -.sp -.LP -.B "Can't open \fIF\fP" -.br -.I Fsck_ffs 's -request attempt to open the file system \fIF\fP failed. -When running manually, it ignores this file system -and continues checking the next file system given. -Check access modes of \fIF\fP. -.sp -.LP -.B "\fIF\fP: (NO WRITE)" -.br -Either the \-n flag was specified or -.I fsck_ffs 's -attempt to open the file system \fIF\fP for writing failed. -When running manually, -all the diagnostics are printed out, -but no modifications are attempted to fix them. -.sp -.LP -.B "file is not a block or character device; OK" -.br -You have given -.I fsck_ffs -a regular file name by mistake. -Check the type of the file specified. -.LP -Possible responses to the OK prompt are: -.IP YES -ignore this error condition. -.IP NO -ignore this file system and continues checking -the next file system given. -.sp -.LP -.B "UNDEFINED OPTIMIZATION IN SUPERBLOCK (SET TO DEFAULT)" -.br -The superblock optimization parameter is neither OPT_TIME -nor OPT_SPACE. -.LP -Possible responses to the SET TO DEFAULT prompt are: -.IP YES -The superblock is set to request optimization to minimize -running time of the system. -(If optimization to minimize disk space utilization is -desired, it can be set using \fItunefs\fP(8).) -.IP NO -ignore this error condition. -.sp -.LP -.B "IMPOSSIBLE MINFREE=\fID\fP IN SUPERBLOCK (SET TO DEFAULT)" -.br -The superblock minimum space percentage is greater than 99% -or less then 0%. -.LP -Possible responses to the SET TO DEFAULT prompt are: -.IP YES -The minfree parameter is set to 10%. -(If some other percentage is desired, -it can be set using \fItunefs\fP(8).) -.IP NO -ignore this error condition. -.sp -.LP -.B "IMPOSSIBLE INTERLEAVE=\fID\fP IN SUPERBLOCK (SET TO DEFAULT)" -.br -The file system interleave is less than or equal to zero. -.LP -Possible responses to the SET TO DEFAULT prompt are: -.IP YES -The interleave parameter is set to 1. -.IP NO -ignore this error condition. -.sp -.LP -.B "IMPOSSIBLE NPSECT=\fID\fP IN SUPERBLOCK (SET TO DEFAULT)" -.br -The number of physical sectors per track is less than the number -of usable sectors per track. -.LP -Possible responses to the SET TO DEFAULT prompt are: -.IP YES -The npsect parameter is set to the number of usable sectors per track. -.IP NO -ignore this error condition. -.sp -.LP -One of the following messages will appear: -.br -.B "MAGIC NUMBER WRONG" -.br -.B "NCG OUT OF RANGE" -.br -.B "CPG OUT OF RANGE" -.br -.B "NCYL DOES NOT JIVE WITH NCG*CPG" -.br -.B "SIZE PREPOSTEROUSLY LARGE" -.br -.B "TRASHED VALUES IN SUPER BLOCK" -.br -and will be followed by the message: -.br -.B "\fIF\fP: BAD SUPER BLOCK: \fIB\fP" -.br -.B "USE -b OPTION TO FSCK_FFS TO SPECIFY LOCATION OF AN ALTERNATE" -.br -.B "SUPER-BLOCK TO SUPPLY NEEDED INFORMATION; SEE fsck_ffs(8)." -.br -The super block has been corrupted. -An alternative super block must be selected from among those -listed by -.I newfs -(8) when the file system was created. -For file systems with a blocksize less than 32K, -specifying \-b 32 is a good first choice. -.sp -.LP -.B "INTERNAL INCONSISTENCY: \fIM\fP" -.br -.I Fsck_ffs 's -has had an internal panic, whose message is specified as \fIM\fP. -This should never happen. -See a guru. -.sp -.LP -.B "CAN NOT SEEK: BLK \fIB\fP (CONTINUE)" -.br -.I Fsck_ffs 's -request for moving to a specified block number \fIB\fP in -the file system failed. -This should never happen. -See a guru. -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -attempt to continue to run the file system check. -Often, -however the problem will persist. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -If the block was part of the virtual memory buffer -cache, -.I fsck_ffs -will terminate with the message ``Fatal I/O error''. -.IP NO -terminate the program. -.sp -.LP -.B "CAN NOT READ: BLK \fIB\fP (CONTINUE)" -.br -.I Fsck_ffs 's -request for reading a specified block number \fIB\fP in -the file system failed. -This should never happen. -See a guru. -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -attempt to continue to run the file system check. -It will retry the read and print out the message: -.br -.B "THE FOLLOWING SECTORS COULD NOT BE READ: \fIN\fP" -.br -where \fIN\fP indicates the sectors that could not be read. -If -.I fsck_ffs -ever tries to write back one of the blocks on which the read failed -it will print the message: -.br -.B "WRITING ZERO'ED BLOCK \fIN\fP TO DISK" -.br -where \fIN\fP indicates the sector that was written with zero's. -If the disk is experiencing hardware problems, the problem will persist. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -If the block was part of the virtual memory buffer -cache, -.I fsck_ffs -will terminate with the message ``Fatal I/O error''. -.IP NO -terminate the program. -.sp -.LP -.B "CAN NOT WRITE: BLK \fIB\fP (CONTINUE)" -.br -.I Fsck_ffs 's -request for writing a specified block number \fIB\fP -in the file system failed. -The disk is write-protected; -check the write protect lock on the drive. -If that is not the problem, see a guru. -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -attempt to continue to run the file system check. -The write operation will be retried with the failed blocks -indicated by the message: -.br -.B "THE FOLLOWING SECTORS COULD NOT BE WRITTEN: \fIN\fP" -.br -where \fIN\fP indicates the sectors that could not be written. -If the disk is experiencing hardware problems, the problem will persist. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -If the block was part of the virtual memory buffer -cache, -.I fsck_ffs -will terminate with the message ``Fatal I/O error''. -.IP NO -terminate the program. -.sp -.LP -.B "bad inode number DDD to ginode" -.br -An internal error has attempted to read non-existent inode \fIDDD\fP. -This error causes -.I fsck_ffs -to exit. -See a guru. -.NH 2 -Phase 1 \- Check Blocks and Sizes -.PP -This phase concerns itself with -the inode list. -This section lists error conditions resulting from -checking inode types, -setting up the zero-link-count table, -examining inode block numbers for bad or duplicate blocks, -checking inode size, -and checking inode format. -All errors in this phase except -.B "INCORRECT BLOCK COUNT" -and -.B "PARTIALLY TRUNCATED INODE" -are fatal if the file system is being preen'ed. -.sp -.LP -.B "UNKNOWN FILE TYPE I=\fII\fP (CLEAR)" -.br -The mode word of the inode \fII\fP indicates that the inode is not a -special block inode, special character inode, socket inode, regular inode, -symbolic link, or directory inode. -.LP -Possible responses to the CLEAR prompt are: -.IP YES -de-allocate inode \fII\fP by zeroing its contents. -This will always invoke the UNALLOCATED error condition in Phase 2 -for each directory entry pointing to this inode. -.IP NO -ignore this error condition. -.sp -.LP -.B "PARTIALLY TRUNCATED INODE I=\fII\fP (SALVAGE)" -.br -.I Fsck_ffs -has found inode \fII\fP whose size is shorter than the number of -blocks allocated to it. -This condition should only occur if the system crashes while in the -midst of truncating a file. -When preen'ing the file system, -.I fsck_ffs -completes the truncation to the specified size. -.LP -Possible responses to SALVAGE are: -.IP YES -complete the truncation to the size specified in the inode. -.IP NO -ignore this error condition. -.sp -.LP -.B "LINK COUNT TABLE OVERFLOW (CONTINUE)" -.br -An internal table for -.I fsck_ffs -containing allocated inodes with a link count of -zero cannot allocate more memory. -Increase the virtual memory for -.I fsck_ffs . -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -continue with the program. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -If another allocated inode with a zero link count is found, -this error condition is repeated. -.IP NO -terminate the program. -.sp -.LP -.B "\fIB\fP BAD I=\fII\fP" -.br -Inode \fII\fP contains block number \fIB\fP with a number -lower than the number of the first data block in the file system or -greater than the number of the last block -in the file system. -This error condition may invoke the -.B "EXCESSIVE BAD BLKS" -error condition in Phase 1 (see next paragraph) if -inode \fII\fP has too many block numbers outside the file system range. -This error condition will always invoke the -.B "BAD/DUP" -error condition in Phase 2 and Phase 4. -.sp -.LP -.B "EXCESSIVE BAD BLKS I=\fII\fP (CONTINUE)" -.br -There is more than a tolerable number (usually 10) of blocks with a number -lower than the number of the first data block in the file system or greater than -the number of last block in the file system associated with inode \fII\fP. -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -ignore the rest of the blocks in this inode -and continue checking with the next inode in the file system. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -.IP NO -terminate the program. -.sp -.LP -.B "BAD STATE DDD TO BLKERR" -.br -An internal error has scrambled -.I fsck_ffs 's -state map to have the impossible value \fIDDD\fP. -.I Fsck_ffs -exits immediately. -See a guru. -.sp -.LP -.B "\fIB\fP DUP I=\fII\fP" -.br -Inode \fII\fP contains block number \fIB\fP that is already claimed by -another inode. -This error condition may invoke the -.B "EXCESSIVE DUP BLKS" -error condition in Phase 1 if -inode \fII\fP has too many block numbers claimed by other inodes. -This error condition will always invoke Phase 1b and the -.B "BAD/DUP" -error condition in Phase 2 and Phase 4. -.sp -.LP -.B "EXCESSIVE DUP BLKS I=\fII\fP (CONTINUE)" -.br -There is more than a tolerable number (usually 10) of blocks claimed by other -inodes. -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -ignore the rest of the blocks in this inode -and continue checking with the next inode in the file system. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -.IP NO -terminate the program. -.sp -.LP -.B "DUP TABLE OVERFLOW (CONTINUE)" -.br -An internal table in -.I fsck_ffs -containing duplicate block numbers cannot allocate any more space. -Increase the amount of virtual memory available to -.I fsck_ffs . -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -continue with the program. -This error condition will not allow a complete check of the file system. -A second run of -.I fsck_ffs -should be made to re-check this file system. -If another duplicate block is found, this error condition will repeat. -.IP NO -terminate the program. -.sp -.LP -.B "PARTIALLY ALLOCATED INODE I=\fII\fP (CLEAR)" -.br -Inode \fII\fP is neither allocated nor unallocated. -.LP -Possible responses to the CLEAR prompt are: -.IP YES -de-allocate inode \fII\fP by zeroing its contents. -.IP NO -ignore this error condition. -.sp -.LP -.B "INCORRECT BLOCK COUNT I=\fII\fP (\fIX\fP should be \fIY\fP) (CORRECT)" -.br -The block count for inode \fII\fP is \fIX\fP blocks, -but should be \fIY\fP blocks. -When preen'ing the count is corrected. -.LP -Possible responses to the CORRECT prompt are: -.IP YES -replace the block count of inode \fII\fP with \fIY\fP. -.IP NO -ignore this error condition. -.NH 2 -Phase 1B: Rescan for More Dups -.PP -When a duplicate block is found in the file system, the file system is -rescanned to find the inode that previously claimed that block. -This section lists the error condition when the duplicate block is found. -.sp -.LP -.B "\fIB\fP DUP I=\fII\fP" -.br -Inode \fII\fP contains block number \fIB\fP that -is already claimed by another inode. -This error condition will always invoke the -.B "BAD/DUP" -error condition in Phase 2. -You can determine which inodes have overlapping blocks by examining -this error condition and the DUP error condition in Phase 1. -.NH 2 -Phase 2 \- Check Pathnames -.PP -This phase concerns itself with removing directory entries -pointing to -error conditioned inodes -from Phase 1 and Phase 1b. -This section lists error conditions resulting from -root inode mode and status, -directory inode pointers in range, -and directory entries pointing to bad inodes, -and directory integrity checks. -All errors in this phase are fatal if the file system is being preen'ed, -except for directories not being a multiple of the blocks size -and extraneous hard links. -.sp -.LP -.B "ROOT INODE UNALLOCATED (ALLOCATE)" -.br -The root inode (usually inode number 2) has no allocate mode bits. -This should never happen. -.LP -Possible responses to the ALLOCATE prompt are: -.IP YES -allocate inode 2 as the root inode. -The files and directories usually found in the root will be recovered -in Phase 3 and put into -.I lost+found . -If the attempt to allocate the root fails, -.I fsck_ffs -will exit with the message: -.br -.B "CANNOT ALLOCATE ROOT INODE" . -.IP NO -.I fsck_ffs -will exit. -.sp -.LP -.B "ROOT INODE NOT DIRECTORY (REALLOCATE)" -.br -The root inode (usually inode number 2) -is not directory inode type. -.LP -Possible responses to the REALLOCATE prompt are: -.IP YES -clear the existing contents of the root inode -and reallocate it. -The files and directories usually found in the root will be recovered -in Phase 3 and put into -.I lost+found . -If the attempt to allocate the root fails, -.I fsck_ffs -will exit with the message: -.br -.B "CANNOT ALLOCATE ROOT INODE" . -.IP NO -.I fsck_ffs -will then prompt with -.B "FIX" -.LP -Possible responses to the FIX prompt are: -.IP YES -replace the root inode's type to be a directory. -If the root inode's data blocks are not directory blocks, -many error conditions will be produced. -.IP NO -terminate the program. -.sp -.LP -.B "DUPS/BAD IN ROOT INODE (REALLOCATE)" -.br -Phase 1 or Phase 1b have found duplicate blocks -or bad blocks in the root inode (usually inode number 2) for the file system. -.LP -Possible responses to the REALLOCATE prompt are: -.IP YES -clear the existing contents of the root inode -and reallocate it. -The files and directories usually found in the root will be recovered -in Phase 3 and put into -.I lost+found . -If the attempt to allocate the root fails, -.I fsck_ffs -will exit with the message: -.br -.B "CANNOT ALLOCATE ROOT INODE" . -.IP NO -.I fsck_ffs -will then prompt with -.B "CONTINUE" . -.LP -Possible responses to the CONTINUE prompt are: -.IP YES -ignore the -.B "DUPS/BAD" -error condition in the root inode and -attempt to continue to run the file system check. -If the root inode is not correct, -then this may result in many other error conditions. -.IP NO -terminate the program. -.sp -.LP -.B "NAME TOO LONG \fIF\fP" -.br -An excessively long path name has been found. -This usually indicates loops in the file system name space. -This can occur if the super user has made circular links to directories. -The offending links must be removed (by a guru). -.sp -.LP -.B "I OUT OF RANGE I=\fII\fP NAME=\fIF\fP (REMOVE)" -.br -A directory entry \fIF\fP has an inode number \fII\fP that is greater than -the end of the inode list. -.LP -Possible responses to the REMOVE prompt are: -.IP YES -the directory entry \fIF\fP is removed. -.IP NO -ignore this error condition. -.sp -.LP -.B "UNALLOCATED I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP \fItype\fP=\fIF\fP (REMOVE)" -.br -A directory or file entry \fIF\fP points to an unallocated inode \fII\fP. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, -and name \fIF\fP are printed. -.LP -Possible responses to the REMOVE prompt are: -.IP YES -the directory entry \fIF\fP is removed. -.IP NO -ignore this error condition. -.sp -.LP -.B "DUP/BAD I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP \fItype\fP=\fIF\fP (REMOVE)" -.br -Phase 1 or Phase 1b have found duplicate blocks or bad blocks -associated with directory or file entry \fIF\fP, inode \fII\fP. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, -and directory name \fIF\fP are printed. -.LP -Possible responses to the REMOVE prompt are: -.IP YES -the directory entry \fIF\fP is removed. -.IP NO -ignore this error condition. -.sp -.LP -.B "ZERO LENGTH DIRECTORY I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (REMOVE)" -.br -A directory entry \fIF\fP has a size \fIS\fP that is zero. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, -and directory name \fIF\fP are printed. -.LP -Possible responses to the REMOVE prompt are: -.IP YES -the directory entry \fIF\fP is removed; -this will always invoke the BAD/DUP error condition in Phase 4. -.IP NO -ignore this error condition. -.sp -.LP -.B "DIRECTORY TOO SHORT I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fIF\fP has been found whose size \fIS\fP -is less than the minimum size directory. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, -and directory name \fIF\fP are printed. -.LP -Possible responses to the FIX prompt are: -.IP YES -increase the size of the directory to the minimum directory size. -.IP NO -ignore this directory. -.sp -.LP -.B "DIRECTORY \fIF\fP LENGTH \fIS\fP NOT MULTIPLE OF \fIB\fP (ADJUST) -.br -A directory \fIF\fP has been found with size \fIS\fP that is not -a multiple of the directory blocksize \fIB\fP. -.LP -Possible responses to the ADJUST prompt are: -.IP YES -the length is rounded up to the appropriate block size. -This error can occur on 4.2BSD file systems. -Thus when preen'ing the file system only a warning is printed -and the directory is adjusted. -.IP NO -ignore the error condition. -.sp -.LP -.B "DIRECTORY CORRUPTED I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (SALVAGE)" -.br -A directory with an inconsistent internal state has been found. -.LP -Possible responses to the FIX prompt are: -.IP YES -throw away all entries up to the next directory boundary (usually 512-byte) -boundary. -This drastic action can throw away up to 42 entries, -and should be taken only after other recovery efforts have failed. -.IP NO -skip up to the next directory boundary and resume reading, -but do not modify the directory. -.sp -.LP -.B "BAD INODE NUMBER FOR `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fII\fP has been found whose inode number for `.' does -does not equal \fII\fP. -.LP -Possible responses to the FIX prompt are: -.IP YES -change the inode number for `.' to be equal to \fII\fP. -.IP NO -leave the inode number for `.' unchanged. -.sp -.LP -.B "MISSING `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fII\fP has been found whose first entry is unallocated. -.LP -Possible responses to the FIX prompt are: -.IP YES -build an entry for `.' with inode number equal to \fII\fP. -.IP NO -leave the directory unchanged. -.sp -.LP -.B "MISSING `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" -.br -.B "CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS \fIF\fP" -.br -A directory \fII\fP has been found whose first entry is \fIF\fP. -.I Fsck_ffs -cannot resolve this problem. -The file system should be mounted and the offending entry \fIF\fP -moved elsewhere. -The file system should then be unmounted and -.I fsck_ffs -should be run again. -.sp -.LP -.B "MISSING `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" -.br -.B "CANNOT FIX, INSUFFICIENT SPACE TO ADD `.'" -.br -A directory \fII\fP has been found whose first entry is not `.'. -.I Fsck_ffs -cannot resolve this problem as it should never happen. -See a guru. -.sp -.LP -.B "EXTRA `.' ENTRY I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fII\fP has been found that has more than one entry for `.'. -.LP -Possible responses to the FIX prompt are: -.IP YES -remove the extra entry for `.'. -.IP NO -leave the directory unchanged. -.sp -.LP -.B "BAD INODE NUMBER FOR `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fII\fP has been found whose inode number for `..' does -does not equal the parent of \fII\fP. -.LP -Possible responses to the FIX prompt are: -.IP YES -change the inode number for `..' to be equal to the parent of \fII\fP -(``\fB..\fP'' in the root inode points to itself). -.IP NO -leave the inode number for `..' unchanged. -.sp -.LP -.B "MISSING `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fII\fP has been found whose second entry is unallocated. -.LP -Possible responses to the FIX prompt are: -.IP YES -build an entry for `..' with inode number equal to the parent of \fII\fP -(``\fB..\fP'' in the root inode points to itself). -.IP NO -leave the directory unchanged. -.sp -.LP -.B "MISSING `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" -.br -.B "CANNOT FIX, SECOND ENTRY IN DIRECTORY CONTAINS \fIF\fP" -.br -A directory \fII\fP has been found whose second entry is \fIF\fP. -.I Fsck_ffs -cannot resolve this problem. -The file system should be mounted and the offending entry \fIF\fP -moved elsewhere. -The file system should then be unmounted and -.I fsck_ffs -should be run again. -.sp -.LP -.B "MISSING `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" -.br -.B "CANNOT FIX, INSUFFICIENT SPACE TO ADD `..'" -.br -A directory \fII\fP has been found whose second entry is not `..'. -.I Fsck_ffs -cannot resolve this problem. -The file system should be mounted and the second entry in the directory -moved elsewhere. -The file system should then be unmounted and -.I fsck_ffs -should be run again. -.sp -.LP -.B "EXTRA `..' ENTRY I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" -.br -A directory \fII\fP has been found that has more than one entry for `..'. -.LP -Possible responses to the FIX prompt are: -.IP YES -remove the extra entry for `..'. -.IP NO -leave the directory unchanged. -.sp -.LP -.B "\fIN\fP IS AN EXTRANEOUS HARD LINK TO A DIRECTORY \fID\fP (REMOVE) -.br -.I Fsck_ffs -has found a hard link, \fIN\fP, to a directory, \fID\fP. -When preen'ing the extraneous links are ignored. -.LP -Possible responses to the REMOVE prompt are: -.IP YES -delete the extraneous entry, \fIN\fP. -.IP NO -ignore the error condition. -.sp -.LP -.B "BAD INODE \fIS\fP TO DESCEND" -.br -An internal error has caused an impossible state \fIS\fP to be passed to the -routine that descends the file system directory structure. -.I Fsck_ffs -exits. -See a guru. -.sp -.LP -.B "BAD RETURN STATE \fIS\fP FROM DESCEND" -.br -An internal error has caused an impossible state \fIS\fP to be returned -from the routine that descends the file system directory structure. -.I Fsck_ffs -exits. -See a guru. -.sp -.LP -.B "BAD STATE \fIS\fP FOR ROOT INODE" -.br -An internal error has caused an impossible state \fIS\fP to be assigned -to the root inode. -.I Fsck_ffs -exits. -See a guru. -.NH 2 -Phase 3 \- Check Connectivity -.PP -This phase concerns itself with the directory connectivity seen in -Phase 2. -This section lists error conditions resulting from -unreferenced directories, -and missing or full -.I lost+found -directories. -.sp -.LP -.B "UNREF DIR I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (RECONNECT)" -.br -The directory inode \fII\fP was not connected to a directory entry -when the file system was traversed. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, and -modify time \fIT\fP of directory inode \fII\fP are printed. -When preen'ing, the directory is reconnected if its size is non-zero, -otherwise it is cleared. -.LP -Possible responses to the RECONNECT prompt are: -.IP YES -reconnect directory inode \fII\fP to the file system in the -directory for lost files (usually \fIlost+found\fP). -This may invoke the -.I lost+found -error condition in Phase 3 -if there are problems connecting directory inode \fII\fP to \fIlost+found\fP. -This may also invoke the CONNECTED error condition in Phase 3 if the link -was successful. -.IP NO -ignore this error condition. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "NO lost+found DIRECTORY (CREATE)" -.br -There is no -.I lost+found -directory in the root directory of the file system; -When preen'ing -.I fsck_ffs -tries to create a \fIlost+found\fP directory. -.LP -Possible responses to the CREATE prompt are: -.IP YES -create a \fIlost+found\fP directory in the root of the file system. -This may raise the message: -.br -.B "NO SPACE LEFT IN / (EXPAND)" -.br -See below for the possible responses. -Inability to create a \fIlost+found\fP directory generates the message: -.br -.B "SORRY. CANNOT CREATE lost+found DIRECTORY" -.br -and aborts the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.IP NO -abort the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "lost+found IS NOT A DIRECTORY (REALLOCATE)" -.br -The entry for -.I lost+found -is not a directory. -.LP -Possible responses to the REALLOCATE prompt are: -.IP YES -allocate a directory inode, and change \fIlost+found\fP to reference it. -The previous inode reference by the \fIlost+found\fP name is not cleared. -Thus it will either be reclaimed as an UNREF'ed inode or have its -link count ADJUST'ed later in this Phase. -Inability to create a \fIlost+found\fP directory generates the message: -.br -.B "SORRY. CANNOT CREATE lost+found DIRECTORY" -.br -and aborts the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.IP NO -abort the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "NO SPACE LEFT IN /lost+found (EXPAND)" -.br -There is no space to add another entry to the -.I lost+found -directory in the root directory -of the file system. -When preen'ing the -.I lost+found -directory is expanded. -.LP -Possible responses to the EXPAND prompt are: -.IP YES -the -.I lost+found -directory is expanded to make room for the new entry. -If the attempted expansion fails -.I fsck_ffs -prints the message: -.br -.B "SORRY. NO SPACE IN lost+found DIRECTORY" -.br -and aborts the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -Clean out unnecessary entries in -.I lost+found . -This error is fatal if the file system is being preen'ed. -.IP NO -abort the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "DIR I=\fII1\fP CONNECTED. PARENT WAS I=\fII2\fP" -.br -This is an advisory message indicating a directory inode \fII1\fP was -successfully connected to the -.I lost+found -directory. -The parent inode \fII2\fP of the directory inode \fII1\fP is -replaced by the inode number of the -.I lost+found -directory. -.sp -.LP -.B "DIRECTORY \fIF\fP LENGTH \fIS\fP NOT MULTIPLE OF \fIB\fP (ADJUST) -.br -A directory \fIF\fP has been found with size \fIS\fP that is not -a multiple of the directory blocksize \fIB\fP -(this can reoccur in Phase 3 if it is not adjusted in Phase 2). -.LP -Possible responses to the ADJUST prompt are: -.IP YES -the length is rounded up to the appropriate block size. -This error can occur on 4.2BSD file systems. -Thus when preen'ing the file system only a warning is printed -and the directory is adjusted. -.IP NO -ignore the error condition. -.sp -.LP -.B "BAD INODE \fIS\fP TO DESCEND" -.br -An internal error has caused an impossible state \fIS\fP to be passed to the -routine that descends the file system directory structure. -.I Fsck_ffs -exits. -See a guru. -.NH 2 -Phase 4 \- Check Reference Counts -.PP -This phase concerns itself with the link count information -seen in Phase 2 and Phase 3. -This section lists error conditions resulting from -unreferenced files, -missing or full -.I lost+found -directory, -incorrect link counts for files, directories, symbolic links, or special files, -unreferenced files, symbolic links, and directories, -and bad or duplicate blocks in files, symbolic links, and directories. -All errors in this phase are correctable if the file system is being preen'ed -except running out of space in the \fIlost+found\fP directory. -.sp -.LP -.B "UNREF FILE I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (RECONNECT)" -.br -Inode \fII\fP was not connected to a directory entry -when the file system was traversed. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, and -modify time \fIT\fP of inode \fII\fP are printed. -When preen'ing the file is cleared if either its size or its -link count is zero, -otherwise it is reconnected. -.LP -Possible responses to the RECONNECT prompt are: -.IP YES -reconnect inode \fII\fP to the file system in the directory for -lost files (usually \fIlost+found\fP). -This may invoke the -.I lost+found -error condition in Phase 4 -if there are problems connecting inode \fII\fP to -.I lost+found . -.IP NO -ignore this error condition. -This will always invoke the CLEAR error condition in Phase 4. -.sp -.LP -.B "(CLEAR)" -.br -The inode mentioned in the immediately previous error condition can not be -reconnected. -This cannot occur if the file system is being preen'ed, -since lack of space to reconnect files is a fatal error. -.LP -Possible responses to the CLEAR prompt are: -.IP YES -de-allocate the inode mentioned in the immediately previous error condition by zeroing its contents. -.IP NO -ignore this error condition. -.sp -.LP -.B "NO lost+found DIRECTORY (CREATE)" -.br -There is no -.I lost+found -directory in the root directory of the file system; -When preen'ing -.I fsck_ffs -tries to create a \fIlost+found\fP directory. -.LP -Possible responses to the CREATE prompt are: -.IP YES -create a \fIlost+found\fP directory in the root of the file system. -This may raise the message: -.br -.B "NO SPACE LEFT IN / (EXPAND)" -.br -See below for the possible responses. -Inability to create a \fIlost+found\fP directory generates the message: -.br -.B "SORRY. CANNOT CREATE lost+found DIRECTORY" -.br -and aborts the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.IP NO -abort the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "lost+found IS NOT A DIRECTORY (REALLOCATE)" -.br -The entry for -.I lost+found -is not a directory. -.LP -Possible responses to the REALLOCATE prompt are: -.IP YES -allocate a directory inode, and change \fIlost+found\fP to reference it. -The previous inode reference by the \fIlost+found\fP name is not cleared. -Thus it will either be reclaimed as an UNREF'ed inode or have its -link count ADJUST'ed later in this Phase. -Inability to create a \fIlost+found\fP directory generates the message: -.br -.B "SORRY. CANNOT CREATE lost+found DIRECTORY" -.br -and aborts the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.IP NO -abort the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "NO SPACE LEFT IN /lost+found (EXPAND)" -.br -There is no space to add another entry to the -.I lost+found -directory in the root directory -of the file system. -When preen'ing the -.I lost+found -directory is expanded. -.LP -Possible responses to the EXPAND prompt are: -.IP YES -the -.I lost+found -directory is expanded to make room for the new entry. -If the attempted expansion fails -.I fsck_ffs -prints the message: -.br -.B "SORRY. NO SPACE IN lost+found DIRECTORY" -.br -and aborts the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -Clean out unnecessary entries in -.I lost+found . -This error is fatal if the file system is being preen'ed. -.IP NO -abort the attempt to linkup the lost inode. -This will always invoke the UNREF error condition in Phase 4. -.sp -.LP -.B "LINK COUNT \fItype\fP I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP COUNT=\fIX\fP SHOULD BE \fIY\fP (ADJUST)" -.br -The link count for inode \fII\fP, -is \fIX\fP but should be \fIY\fP. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, and modify time \fIT\fP -are printed. -When preen'ing the link count is adjusted unless the number of references -is increasing, a condition that should never occur unless precipitated -by a hardware failure. -When the number of references is increasing under preen mode, -.I fsck_ffs -exits with the message: -.br -.B "LINK COUNT INCREASING" -.LP -Possible responses to the ADJUST prompt are: -.IP YES -replace the link count of file inode \fII\fP with \fIY\fP. -.IP NO -ignore this error condition. -.sp -.LP -.B "UNREF \fItype\fP I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (CLEAR)" -.br -Inode \fII\fP, was not connected to a directory entry when the -file system was traversed. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, -and modify time \fIT\fP of inode \fII\fP -are printed. -When preen'ing, -this is a file that was not connected because its size or link count was zero, -hence it is cleared. -.LP -Possible responses to the CLEAR prompt are: -.IP YES -de-allocate inode \fII\fP by zeroing its contents. -.IP NO -ignore this error condition. -.sp -.LP -.B "BAD/DUP \fItype\fP I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (CLEAR)" -.br -Phase 1 or Phase 1b have found duplicate blocks -or bad blocks associated with -inode \fII\fP. -The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, -and modify time \fIT\fP of inode \fII\fP -are printed. -This error cannot arise when the file system is being preen'ed, -as it would have caused a fatal error earlier. -.LP -Possible responses to the CLEAR prompt are: -.IP YES -de-allocate inode \fII\fP by zeroing its contents. -.IP NO -ignore this error condition. -.NH 2 -Phase 5 - Check Cyl groups -.PP -This phase concerns itself with the free-block and used-inode maps. -This section lists error conditions resulting from -allocated blocks in the free-block maps, -free blocks missing from free-block maps, -and the total free-block count incorrect. -It also lists error conditions resulting from -free inodes in the used-inode maps, -allocated inodes missing from used-inode maps, -and the total used-inode count incorrect. -.sp -.LP -.B "CG \fIC\fP: BAD MAGIC NUMBER" -.br -The magic number of cylinder group \fIC\fP is wrong. -This usually indicates that the cylinder group maps have been destroyed. -When running manually the cylinder group is marked as needing -to be reconstructed. -This error is fatal if the file system is being preen'ed. -.sp -.LP -.B "BLK(S) MISSING IN BIT MAPS (SALVAGE)" -.br -A cylinder group block map is missing some free blocks. -During preen'ing the maps are reconstructed. -.LP -Possible responses to the SALVAGE prompt are: -.IP YES -reconstruct the free block map. -.IP NO -ignore this error condition. -.sp -.LP -.B "SUMMARY INFORMATION BAD (SALVAGE)" -.br -The summary information was found to be incorrect. -When preen'ing, -the summary information is recomputed. -.LP -Possible responses to the SALVAGE prompt are: -.IP YES -reconstruct the summary information. -.IP NO -ignore this error condition. -.sp -.LP -.B "FREE BLK COUNT(S) WRONG IN SUPERBLOCK (SALVAGE)" -.br -The superblock free block information was found to be incorrect. -When preen'ing, -the superblock free block information is recomputed. -.LP -Possible responses to the SALVAGE prompt are: -.IP YES -reconstruct the superblock free block information. -.IP NO -ignore this error condition. -.NH 2 -Cleanup -.PP -Once a file system has been checked, a few cleanup functions are performed. -This section lists advisory messages about -the file system -and modify status of the file system. -.sp -.LP -.B "\fIV\fP files, \fIW\fP used, \fIX\fP free (\fIY\fP frags, \fIZ\fP blocks)" -.br -This is an advisory message indicating that -the file system checked contained -\fIV\fP files using -\fIW\fP fragment sized blocks leaving -\fIX\fP fragment sized blocks free in the file system. -The numbers in parenthesis breaks the free count down into -\fIY\fP free fragments and -\fIZ\fP free full sized blocks. -.sp -.LP -.B "***** REBOOT UNIX *****" -.br -This is an advisory message indicating that -the root file system has been modified by -.I fsck_ffs. -If UNIX is not rebooted immediately, -the work done by -.I fsck_ffs -may be undone by the in-core copies of tables -UNIX keeps. -When preen'ing, -.I fsck_ffs -will exit with a code of 4. -The standard auto-reboot script distributed with 4.3BSD -interprets an exit code of 4 by issuing a reboot system call. -.sp -.LP -.B "***** FILE SYSTEM WAS MODIFIED *****" -.br -This is an advisory message indicating that -the current file system was modified by -.I fsck_ffs. -If this file system is mounted or is the current root file system, -.I fsck_ffs -should be halted and UNIX rebooted. -If UNIX is not rebooted immediately, -the work done by -.I fsck_ffs -may be undone by the in-core copies of tables -UNIX keeps. diff --git a/sbin/fsck_ffs/SMM.doc/Makefile b/sbin/fsck_ffs/SMM.doc/Makefile deleted file mode 100644 index 9ddc06f..0000000 --- a/sbin/fsck_ffs/SMM.doc/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ -# @(#)Makefile 8.1 (Berkeley) 6/8/93 - -DIR= smm/03.fsck_ffs -SRCS= 0.t 1.t 2.t 3.t 4.t -MACROS= -ms - -.include diff --git a/share/doc/psd/12.make/Makefile b/share/doc/psd/12.make/Makefile index fdc38a7..b365683 100644 --- a/share/doc/psd/12.make/Makefile +++ b/share/doc/psd/12.make/Makefile @@ -4,6 +4,5 @@ VOLUME= psd/12.make SRCS= stubs tutorial.ms MACROS= -ms -SRCDIR= ${.CURDIR}/../../../../usr.bin/make/PSD.doc .include diff --git a/share/doc/psd/12.make/stubs b/share/doc/psd/12.make/stubs new file mode 100644 index 0000000..39d8def --- /dev/null +++ b/share/doc/psd/12.make/stubs @@ -0,0 +1,9 @@ +.\" $FreeBSD$ +.\" +.de Ix +.. +.de Rd +.. +.de Rm +.. +.if n .ftr CR R diff --git a/share/doc/psd/12.make/tutorial.ms b/share/doc/psd/12.make/tutorial.ms new file mode 100644 index 0000000..320d5df --- /dev/null +++ b/share/doc/psd/12.make/tutorial.ms @@ -0,0 +1,3747 @@ +.\" Copyright (c) 1988, 1989 by Adam de Boor +.\" Copyright (c) 1989 by Berkeley Softworks +.\" Copyright (c) 1988, 1989, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Adam de Boor. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)tutorial.ms 8.1 (Berkeley) 8/18/93 +.\" $FreeBSD$ +.\" +.EH 'PSD:12-%''PMake \*- A Tutorial' +.OH 'PMake \*- A Tutorial''PSD:12-%' +.\" xH is a macro to provide numbered headers that are automatically stuffed +.\" into a table-of-contents, properly indented, etc. If the first argument +.\" is numeric, it is taken as the depth for numbering (as for .NH), else +.\" the default (1) is assumed. +.\" +.\" @P The initial paragraph distance. +.\" @Q The piece of section number to increment (or 0 if none given) +.\" @R Section header. +.\" @S Indent for toc entry +.\" @T Argument to NH (can't use @Q b/c giving 0 to NH resets the counter) +.de xH +.NH \\$1 +\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 +.nr PD .1v +.XS \\n% +.ta 0.6i +\\*(SN \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 +.XE +.nr PD .3v +.. +.ig +.\" CW is used to place a string in fixed-width or switch to a +.\" fixed-width font. +.\" C is a typewriter font for a laserwriter. Use something else if +.\" you don't have one... +.de CW +.ie !\\n(.$ .ft S +.el \&\\$3\fS\\$1\fP\\$2 +.. +.\" Anything I put in a display I want to be in fixed-width +.am DS +.CW +.. +.\" The stuff in .No produces a little stop sign in the left margin +.\" that says NOTE in it. Unfortunately, it does cause a break, but +.\" hey. Can't have everything. In case you're wondering how I came +.\" up with such weird commands, they came from running grn on a +.\" gremlin file... +.de No +.br +.ne 0.5i +.po -0.5i +.br +.mk +.nr g3 \\n(.f +.nr g4 \\n(.s +.ig ft +.sp -1 +.\" .st cf +\D's -1u'\D't 5u' +.sp -1 +\h'50u'\D'l 71u 0u'\D'l 50u 50u'\D'l 0u 71u'\D'l -50u 50u'\D'l -71u 0u'\D'l -50u -50u'\D'l 0u -71u'\D'l 50u -50u' +.sp -1 +\D't 3u' +.sp -1 +.sp 7u +\h'53u'\D'p 14 68u 0u 46u 46u 0u 68u -46u 46u -68u 0u -47u -46u 0u -68u 47u -46u' +.sp -1 +.ft R +.ps 6 +.nr g8 \\n(.d +.ds g9 "NOTE +.sp 74u +\h'85u'\v'0.85n'\h-\w\\*(g9u/2u\&\\*(g9 +.sp |\\n(g8u +.sp 166u +.ig br +\D't 3u'\D's -1u' +.br +.po +.rt +.ft \\n(g3 +.ps \\n(g4 +.. +.de Bp +.ie !\\n(.$ .IP \(bu 2 +.el .IP "\&" 2 +.. +.po +.3i +.TL +PMake \*- A Tutorial +.AU +Adam de Boor +.AI +Berkeley Softworks +2150 Shattuck Ave, Penthouse +Berkeley, CA 94704 +adam@bsw.uu.net +\&...!uunet!bsw!adam +.FS +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies. +The University of California, Berkeley Softworks, and Adam de Boor make no +representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. +.FE +.PP +.xH 1 Introduction +.LP +PMake is a program for creating other programs, or anything else you +can think of for it to do. The basic idea behind PMake is that, for +any given system, be it a program or a document or whatever, there +will be some files that depend on the state of other files (on when +they were last modified). PMake takes these dependencies, which you +must specify, and uses them to build whatever it is you want it to +build. +.LP +PMake is almost fully-compatible with Make, with which you may already +be familiar. PMake's most important feature is its ability to run +several different jobs at once, making the creation of systems +considerably faster. It also has a great deal more functionality than +Make. Throughout the text, whenever something is mentioned that is an +important difference between PMake and Make (i.e. something that will +cause a makefile to fail if you don't do something about it), or is +simply important, it will be flagged with a little sign in the left +margin, like this: +.No +.LP +This tutorial is divided into three main sections corresponding to basic, +intermediate and advanced PMake usage. If you already know Make well, +you will only need to skim chapter 2 (there are some aspects of +PMake that I consider basic to its use that didn't exist in Make). +Things in chapter 3 make life much easier, while those in chapter 4 +are strictly for those who know what they are doing. Chapter 5 has +definitions for the jargon I use and chapter 6 contains possible +solutions to the problems presented throughout the tutorial. +.xH 1 The Basics of PMake +.LP +PMake takes as input a file that tells a) which files depend on which +other files to be complete and b) what to do about files that are +``out-of-date.'' This file is known as a ``makefile'' and is usually +.Ix 0 def makefile +kept in the top-most directory of the system to be built. While you +can call the makefile anything you want, PMake will look for +.CW Makefile +and +.CW makefile +(in that order) in the current directory if you don't tell it +otherwise. +.Ix 0 def makefile default +To specify a different makefile, use the +.B \-f +flag (e.g. +.CW "pmake -f program.mk" ''). `` +.Ix 0 ref flags -f +.Ix 0 ref makefile other +.LP +A makefile has four different types of lines in it: +.RS +.IP \(bu 2 +File dependency specifications +.IP \(bu 2 +Creation commands +.IP \(bu 2 +Variable assignments +.IP \(bu 2 +Comments, include statements and conditional directives +.RE +.LP +Any line may be continued over multiple lines by ending it with a +backslash. +.Ix 0 def "continuation line" +The backslash, following newline and any initial whitespace +on the following line are compressed into a single space before the +input line is examined by PMake. +.xH 2 Dependency Lines +.LP +As mentioned in the introduction, in any system, there are +dependencies between the files that make up the system. For instance, +in a program made up of several C source files and one header file, +the C files will need to be re-compiled should the header file be +changed. For a document of several chapters and one macro file, the +chapters will need to be reprocessed if any of the macros changes. +.Ix 0 def "dependency" +These are dependencies and are specified by means of dependency lines in +the makefile. +.LP +.Ix 0 def "dependency line" +On a dependency line, there are targets and sources, separated by a +one- or two-character operator. +The targets ``depend'' on the sources and are usually created from +them. +.Ix 0 def target +.Ix 0 def source +.Ix 0 ref operator +Any number of targets and sources may be specified on a dependency line. +All the targets in the line are made to depend on all the sources. +Targets and sources need not be actual files, but every source must be +either an actual file or another target in the makefile. +If you run out of room, use a backslash at the end of the line to continue onto +the next one. +.LP +Any file may be a target and any file may be a source, but the +relationship between the two (or however many) is determined by the +``operator'' that separates them. +.Ix 0 def operator +Three types of operators exist: one specifies that the datedness of a +target is determined by the state of its sources, while another +specifies other files (the sources) that need to be dealt with before +the target can be re-created. The third operator is very similar to +the first, with the additional condition that the target is +out-of-date if it has no sources. These operations are represented by +the colon, the exclamation point and the double-colon, respectively, and are +mutually exclusive. Their exact semantics are as follows: +.IP ":" +.Ix 0 def operator colon +.Ix 0 def : +If a colon is used, a target on the line is considered to be +``out-of-date'' (and in need of creation) if +.RS +.IP \(bu 2 +any of the sources has been modified more recently than the target, or +.IP \(bu 2 +the target doesn't exist. +.RE +.Ix 0 def out-of-date +.IP "\&" +Under this operation, steps will be taken to re-create the target only +if it is found to be out-of-date by using these two rules. +.IP "!" +.Ix 0 def operator force +.Ix 0 def ! +If an exclamation point is used, the target will always be re-created, +but this will not happen until all of its sources have been examined +and re-created, if necessary. +.IP "::" +.Ix 0 def operator double-colon +.Ix 0 def :: +If a double-colon is used, a target is out-of-date if: +.RS +.IP \(bu 2 +any of the sources has been modified more recently than the target, or +.IP \(bu 2 +the target doesn't exist, or +.IP \(bu 2 +the target has no sources. +.RE +.IP "\&" +If the target is out-of-date according to these rules, it will be re-created. +This operator also does something else to the targets, but I'll go +into that in the next section (``Shell Commands''). +.LP +Enough words, now for an example. Take that C program I mentioned +earlier. Say there are three C files +.CW a.c , ( +.CW b.c +and +.CW c.c ) +each of which +includes the file +.CW defs.h . +The dependencies between the files could then be expressed as follows: +.DS +program : a.o b.o c.o +a.o b.o c.o : defs.h +a.o : a.c +b.o : b.c +c.o : c.c +.DE +.LP +You may be wondering at this point, where +.CW a.o , +.CW b.o +and +.CW c.o +came in and why +.I they +depend on +.CW defs.h +and the C files don't. The reason is quite simple: +.CW program +cannot be made by linking together .c files \*- it must be +made from .o files. Likewise, if you change +.CW defs.h , +it isn't the .c files that need to be re-created, it's the .o files. +If you think of dependencies in these terms \*- which files (targets) +need to be created from which files (sources) \*- you should have no problems. +.LP +An important thing to notice about the above example, is that all the +\&.o files appear as targets on more than one line. This is perfectly +all right: the target is made to depend on all the sources mentioned +on all the dependency lines. E.g. +.CW a.o +depends on both +.CW defs.h +and +.CW a.c . +.Ix 0 ref dependency +.No +.LP +The order of the dependency lines in the makefile is +important: the first target on the first dependency line in the +makefile will be the one that gets made if you don't say otherwise. +That's why +.CW program +comes first in the example makefile, above. +.LP +Both targets and sources may contain the standard C-Shell wildcard +characters +.CW { , ( +.CW } , +.CW * , +.CW ? , +.CW [ , +and +.CW ] ), +but the non-curly-brace ones may only appear in the final component +(the file portion) of the target or source. The characters mean the +following things: +.IP \fB{}\fP +These enclose a comma-separated list of options and cause the pattern +to be expanded once for each element of the list. Each expansion +contains a different element. For example, +.CW src/{whiffle,beep,fish}.c +expands to the three words +.CW src/whiffle.c , +.CW src/beep.c , +and +.CW src/fish.c . +These braces may be nested and, unlike the other wildcard characters, +the resulting words need not be actual files. All other wildcard +characters are expanded using the files that exist when PMake is +started. +.IP \fB*\fP +This matches zero or more characters of any sort. +.CW src/*.c +will expand to the same three words as above as long as +.CW src +contains those three files (and no other files that end in +.CW .c ). +.IP \fB?\fP +Matches any single character. +.IP \fB[]\fP +This is known as a character class and contains either a list of +single characters, or a series of character ranges +.CW a-z , ( +for example means all characters between a and z), or both. It matches +any single character contained in the list. E.g. +.CW [A-Za-z] +will match all letters, while +.CW [0123456789] +will match all numbers. +.xH 2 Shell Commands +.LP +``Isn't that nice,'' you say to yourself, ``but how are files +actually `re-created,' as he likes to spell it?'' +The re-creation is accomplished by commands you place in the makefile. +These commands are passed to the Bourne shell (better known as +``/bin/sh'') to be executed and are +.Ix 0 ref shell +.Ix 0 ref re-creation +.Ix 0 ref update +expected to do what's necessary to update the target file (PMake +doesn't actually check to see if the target was created. It just +assumes it's there). +.Ix 0 ref target +.LP +Shell commands in a makefile look a lot like shell commands you would +type at a terminal, with one important exception: each command in a +makefile +.I must +be preceded by at least one tab. +.LP +Each target has associated with it a shell script made up of +one or more of these shell commands. The creation script for a target +should immediately follow the dependency line for that target. While +any given target may appear on more than one dependency line, only one +of these dependency lines may be followed by a creation script, unless +the `::' operator was used on the dependency line. +.Ix 0 ref operator double-colon +.Ix 0 ref :: +.No +.LP +If the double-colon was used, each dependency line for the target +may be followed by a shell script. That script will only be executed +if the target on the associated dependency line is out-of-date with +respect to the sources on that line, according to the rules I gave +earlier. +I'll give you a good example of this later on. +.LP +To expand on the earlier makefile, you might add commands as follows: +.DS +program : a.o b.o c.o + cc a.o b.o c.o \-o program +a.o b.o c.o : defs.h +a.o : a.c + cc \-c a.c +b.o : b.c + cc \-c b.c +c.o : c.c + cc \-c c.c +.DE +.LP +Something you should remember when writing a makefile is, the +commands will be executed if the +.I target +on the dependency line is out-of-date, not the sources. +.Ix 0 ref target +.Ix 0 ref source +.Ix 0 ref out-of-date +In this example, the command +.CW "cc \-c a.c" '' `` +will be executed if +.CW a.o +is out-of-date. Because of the `:' operator, +.Ix 0 ref : +.Ix 0 ref operator colon +this means that should +.CW a.c +.I or +.CW defs.h +have been modified more recently than +.CW a.o , +the command will be executed +.CW a.o "\&" ( +will be considered out-of-date). +.Ix 0 ref out-of-date +.LP +Remember how I said the only difference between a makefile shell +command and a regular shell command was the leading tab? I lied. There +is another way in which makefile commands differ from regular ones. +The first two characters after the initial whitespace are treated +specially. +If they are any combination of `@' and `\-', they cause PMake to do +different things. +.LP +In most cases, shell commands are printed before they're +actually executed. This is to keep you informed of what's going on. If +an `@' appears, however, this echoing is suppressed. In the case of an +.CW echo +command, say +.CW "echo Linking index" ,'' `` +it would be +rather silly to see +.DS +echo Linking index +Linking index +.DE +.LP +so PMake allows you to place an `@' before the command +.CW "@echo Linking index" '') (`` +to prevent the command from being printed. +.LP +The other special character is the `\-'. In case you didn't know, +shell commands finish with a certain ``exit status.'' This status is +made available by the operating system to whatever program invoked the +command. Normally this status will be 0 if everything went ok and +non-zero if something went wrong. For this reason, PMake will consider +an error to have occurred if one of the shells it invokes returns a non-zero +status. When it detects an error, PMake's usual action is to abort +whatever it's doing and exit with a non-zero status itself (any other +targets that were being created will continue being made, but nothing +new will be started. PMake will exit after the last job finishes). +This behavior can be altered, however, by placing a `\-' at the front +of a command +.CW "\-mv index index.old" ''), (`` +certain command-line arguments, +or doing other things, to be detailed later. In such +a case, the non-zero status is simply ignored and PMake keeps chugging +along. +.No +.LP +Because all the commands are given to a single shell to execute, such +things as setting shell variables, changing directories, etc., last +beyond the command in which they are found. This also allows shell +compound commands (like +.CW for +loops) to be entered in a natural manner. +Since this could cause problems for some makefiles that depend on +each command being executed by a single shell, PMake has a +.B \-B +.Ix 0 ref compatibility +.Ix 0 ref flags -B +flag (it stands for backwards-compatible) that forces each command to +be given to a separate shell. It also does several other things, all +of which I discourage since they are now old-fashioned.\|.\|.\|. +.No +.LP +A target's shell script is fed to the shell on its (the shell's) input stream. +This means that any commands, such as +.CW ci +that need to get input from the terminal won't work right \*- they'll +get the shell's input, something they probably won't find to their +liking. A simple way around this is to give a command like this: +.DS +ci $(SRCS) < /dev/tty +.DE +This would force the program's input to come from the terminal. If you +can't do this for some reason, your only other alternative is to use +PMake in its fullest compatibility mode. See +.B Compatibility +in chapter 4. +.Ix 0 ref compatibility +.LP +.xH 2 Variables +.LP +PMake, like Make before it, has the ability to save text in variables +to be recalled later at your convenience. Variables in PMake are used +much like variables in the shell and, by tradition, consist of +all upper-case letters (you don't +.I have +to use all upper-case letters. +In fact there's nothing to stop you from calling a variable +.CW @^&$%$ . +Just tradition). Variables are assigned-to using lines of the form +.Ix 0 def variable assignment +.DS +VARIABLE = value +.DE +.Ix 0 def variable assignment +appended-to by +.DS +VARIABLE += value +.DE +.Ix 0 def variable appending +.Ix 0 def variable assignment appended +.Ix 0 def += +conditionally assigned-to (if the variable isn't already defined) by +.DS +VARIABLE ?= value +.DE +.Ix 0 def variable assignment conditional +.Ix 0 def ?= +and assigned-to with expansion (i.e. the value is expanded (see below) +before being assigned to the variable\*-useful for placing a value at +the beginning of a variable, or other things) by +.DS +VARIABLE := value +.DE +.Ix 0 def variable assignment expanded +.Ix 0 def := +.LP +Any whitespace before +.I value +is stripped off. When appending, a space is placed between the old +value and the stuff being appended. +.LP +The final way a variable may be assigned to is using +.DS +VARIABLE != shell-command +.DE +.Ix 0 def variable assignment shell-output +.Ix 0 def != +In this case, +.I shell-command +has all its variables expanded (see below) and is passed off to a +shell to execute. The output of the shell is then placed in the +variable. Any newlines (other than the final one) are replaced by +spaces before the assignment is made. This is typically used to find +the current directory via a line like: +.DS +CWD != pwd +.DE +.LP +.B Note: +this is intended to be used to execute commands that produce small amounts +of output (e.g. ``pwd''). The implementation is less than intelligent and will +likely freeze if you execute something that produces thousands of +bytes of output (8 Kb is the limit on many UNIX systems). +.LP +The value of a variable may be retrieved by enclosing the variable +name in parentheses or curly braces and preceding the whole thing +with a dollar sign. +.LP +For example, to set the variable CFLAGS to the string +.CW "\-I/sprite/src/lib/libc \-O" ,'' `` +you would place a line +.DS +CFLAGS = \-I/sprite/src/lib/libc \-O +.DE +in the makefile and use the word +.CW "$(CFLAGS)" +wherever you would like the string +.CW "\-I/sprite/src/lib/libc \-O" +to appear. This is called variable expansion. +.Ix 0 def variable expansion +.No +.LP +Unlike Make, PMake will not expand a variable unless it knows +the variable exists. E.g. if you have a +.CW "${i}" +in a shell command and you have not assigned a value to the variable +.CW i +(the empty string is considered a value, by the way), where Make would have +substituted the empty string, PMake will leave the +.CW "${i}" +alone. +To keep PMake from substituting for a variable it knows, precede the +dollar sign with another dollar sign. +(e.g. to pass +.CW "${HOME}" +to the shell, use +.CW "$${HOME}" ). +This causes PMake, in effect, to expand the +.CW $ +macro, which expands to a single +.CW $ . +For compatibility, Make's style of variable expansion will be used +if you invoke PMake with any of the compatibility flags (\c +.B \-V , +.B \-B +or +.B \-M . +The +.B \-V +flag alters just the variable expansion). +.Ix 0 ref flags -V +.Ix 0 ref flags -B +.Ix 0 ref flags -M +.Ix 0 ref compatibility +.LP +.Ix 0 ref variable expansion +There are two different times at which variable expansion occurs: +When parsing a dependency line, the expansion occurs immediately +upon reading the line. If any variable used on a dependency line is +undefined, PMake will print a message and exit. +Variables in shell commands are expanded when the command is +executed. +Variables used inside another variable are expanded whenever the outer +variable is expanded (the expansion of an inner variable has no effect +on the outer variable. I.e. if the outer variable is used on a dependency +line and in a shell command, and the inner variable changes value +between when the dependency line is read and the shell command is +executed, two different values will be substituted for the outer +variable). +.Ix 0 def variable types +.LP +Variables come in four flavors, though they are all expanded the same +and all look about the same. They are (in order of expanding scope): +.RS +.IP \(bu 2 +Local variables. +.Ix 0 ref variable local +.IP \(bu 2 +Command-line variables. +.Ix 0 ref variable command-line +.IP \(bu 2 +Global variables. +.Ix 0 ref variable global +.IP \(bu 2 +Environment variables. +.Ix 0 ref variable environment +.RE +.LP +The classification of variables doesn't matter much, except that the +classes are searched from the top (local) to the bottom (environment) +when looking up a variable. The first one found wins. +.xH 3 Local Variables +.LP +.Ix 0 def variable local +Each target can have as many as seven local variables. These are +variables that are only ``visible'' within that target's shell script +and contain such things as the target's name, all of its sources (from +all its dependency lines), those sources that were out-of-date, etc. +Four local variables are defined for all targets. They are: +.RS +.IP ".TARGET" +.Ix 0 def variable local .TARGET +.Ix 0 def .TARGET +The name of the target. +.IP ".OODATE" +.Ix 0 def variable local .OODATE +.Ix 0 def .OODATE +The list of the sources for the target that were considered out-of-date. +The order in the list is not guaranteed to be the same as the order in +which the dependencies were given. +.IP ".ALLSRC" +.Ix 0 def variable local .ALLSRC +.Ix 0 def .ALLSRC +The list of all sources for this target in the order in which they +were given. +.IP ".PREFIX" +.Ix 0 def variable local .PREFIX +.Ix 0 def .PREFIX +The target without its suffix and without any leading path. E.g. for +the target +.CW ../../lib/compat/fsRead.c , +this variable would contain +.CW fsRead . +.RE +.LP +Three other local variables are set only for certain targets under +special circumstances. These are the ``.IMPSRC,'' +.Ix 0 ref variable local .IMPSRC +.Ix 0 ref .IMPSRC +``.ARCHIVE,'' +.Ix 0 ref variable local .ARCHIVE +.Ix 0 ref .ARCHIVE +and ``.MEMBER'' +.Ix 0 ref variable local .MEMBER +.Ix 0 ref .MEMBER +variables. When they are set and how they are used is described later. +.LP +Four of these variables may be used in sources as well as in shell +scripts. +.Ix 0 def "dynamic source" +.Ix 0 def source dynamic +These are ``.TARGET'', ``.PREFIX'', ``.ARCHIVE'' and ``.MEMBER''. The +variables in the sources are expanded once for each target on the +dependency line, providing what is known as a ``dynamic source,'' +.Rd 0 +allowing you to specify several dependency lines at once. For example, +.DS +$(OBJS) : $(.PREFIX).c +.DE +will create a dependency between each object file and its +corresponding C source file. +.xH 3 Command-line Variables +.LP +.Ix 0 def variable command-line +Command-line variables are set when PMake is first invoked by giving a +variable assignment as one of the arguments. For example, +.DS +pmake "CFLAGS = -I/sprite/src/lib/libc -O" +.DE +would make +.CW CFLAGS +be a command-line variable with the given value. Any assignments to +.CW CFLAGS +in the makefile will have no effect, because once it +is set, there is (almost) nothing you can do to change a command-line +variable (the search order, you see). Command-line variables may be +set using any of the four assignment operators, though only +.CW = +and +.CW ?= +behave as you would expect them to, mostly because assignments to +command-line variables are performed before the makefile is read, thus +the values set in the makefile are unavailable at the time. +.CW += +.Ix 0 ref += +.Ix 0 ref variable assignment appended +is the same as +.CW = , +because the old value of the variable is sought only in the scope in +which the assignment is taking place (for reasons of efficiency that I +won't get into here). +.CW := +and +.CW ?= +.Ix 0 ref := +.Ix 0 ref ?= +.Ix 0 ref variable assignment expanded +.Ix 0 ref variable assignment conditional +will work if the only variables used are in the environment. +.CW != +is sort of pointless to use from the command line, since the same +effect can no doubt be accomplished using the shell's own command +substitution mechanisms (backquotes and all that). +.xH 3 Global Variables +.LP +.Ix 0 def variable global +Global variables are those set or appended-to in the makefile. +There are two classes of global variables: those you set and those PMake sets. +As I said before, the ones you set can have any name you want them to have, +except they may not contain a colon or an exclamation point. +The variables PMake sets (almost) always begin with a +period and always contain upper-case letters, only. The variables are +as follows: +.RS +.IP .PMAKE +.Ix 0 def variable global .PMAKE +.Ix 0 def .PMAKE +.Ix 0 def variable global MAKE +.Ix 0 def MAKE +The name by which PMake was invoked is stored in this variable. For +compatibility, the name is also stored in the MAKE variable. +.IP .MAKEFLAGS +.Ix 0 def variable global .MAKEFLAGS +.Ix 0 def .MAKEFLAGS variable +.Ix 0 def variable global MFLAGS +.Ix 0 def MFLAGS +All the relevant flags with which PMake was invoked. This does not +include such things as +.B \-f +or variable assignments. Again for compatibility, this value is stored +in the MFLAGS variable as well. +.RE +.LP +Two other variables, ``.INCLUDES'' and ``.LIBS,'' are covered in the +section on special targets in chapter 3. +.Ix 0 ref variable global .INCLUDES +.Ix 0 ref variable global .LIBS +.LP +Global variables may be deleted using lines of the form: +.Ix 0 def #undef +.Ix 0 def variable deletion +.DS +#undef \fIvariable\fP +.DE +The +.CW # ' ` +must be the first character on the line. Note that this may only be +done on global variables. +.xH 3 Environment Variables +.LP +.Ix 0 def variable environment +Environment variables are passed by the shell that invoked PMake and +are given by PMake to each shell it invokes. They are expanded like +any other variable, but they cannot be altered in any way. +.LP +One special environment variable, +.CW PMAKE , +.Ix 0 def variable environment PMAKE +is examined by PMake for command-line flags, variable assignments, +etc., it should always use. This variable is examined before the +actual arguments to PMake are. In addition, all flags given to PMake, +either through the +.CW PMAKE +variable or on the command line, are placed in this environment +variable and exported to each shell PMake executes. Thus recursive +invocations of PMake automatically receive the same flags as the +top-most one. +.LP +Using all these variables, you can compress the sample makefile even more: +.DS +OBJS = a.o b.o c.o +program : $(OBJS) + cc $(.ALLSRC) \-o $(.TARGET) +$(OBJS) : defs.h +a.o : a.c + cc \-c a.c +b.o : b.c + cc \-c b.c +c.o : c.c + cc \-c c.c +.DE +.Ix 0 ref variable local .ALLSRC +.Ix 0 ref .ALLSRC +.Ix 0 ref variable local .TARGET +.Ix 0 ref .TARGET +.Rd 3 +.xH 2 Comments +.LP +.Ix 0 def comments +Comments in a makefile start with a `#' character and extend to the +end of the line. They may appear +anywhere you want them, except in a shell command (though the shell +will treat it as a comment, too). If, for some reason, you need to use the `#' +in a variable or on a dependency line, put a backslash in front of it. +PMake will compress the two into a single `#' (Note: this isn't true +if PMake is operating in full-compatibility mode). +.Ix 0 ref flags -M +.Ix 0 ref compatibility +.xH 2 Parallelism +.No +.LP +PMake was specifically designed to re-create several targets at once, +when possible. You do not have to do anything special to cause this to +happen (unless PMake was configured to not act in parallel, in which +case you will have to make use of the +.B \-L +and +.B \-J +flags (see below)), +.Ix 0 ref flags -L +.Ix 0 ref flags -J +but you do have to be careful at times. +.LP +There are several problems you are likely to encounter. One is +that some makefiles (and programs) are written in such a way that it is +impossible for two targets to be made at once. The program +.CW xstr , +for example, +always modifies the files +.CW strings +and +.CW x.c . +There is no way to change it. Thus you cannot run two of them at once +without something being trashed. Similarly, if you have commands +in the makefile that always send output to the same file, you will not +be able to make more than one target at once unless you change the +file you use. You can, for instance, add a +.CW $$$$ +to the end of the file name to tack on the process ID of the shell +executing the command (each +.CW $$ +expands to a single +.CW $ , +thus giving you the shell variable +.CW $$ ). +Since only one shell is used for all the +commands, you'll get the same file name for each command in the +script. +.LP +The other problem comes from improperly-specified dependencies that +worked in Make because of its sequential, depth-first way of examining +them. While I don't want to go into depth on how PMake +works (look in chapter 4 if you're interested), I will warn you that +files in two different ``levels'' of the dependency tree may be +examined in a different order in PMake than they were in Make. For +example, given the makefile +.DS +a : b c +b : d +.DE +PMake will examine the targets in the order +.CW c , +.CW d , +.CW b , +.CW a . +If the makefile's author expected PMake to abort before making +.CW c +if an error occurred while making +.CW b , +or if +.CW b +needed to exist before +.CW c +was made, +s/he will be sorely disappointed. The dependencies are +incomplete, since in both these cases, +.CW c +would depend on +.CW b . +So watch out. +.LP +Another problem you may face is that, while PMake is set up to handle the +output from multiple jobs in a graceful fashion, the same is not so for input. +It has no way to regulate input to different jobs, +so if you use the redirection from +.CW /dev/tty +I mentioned earlier, you must be careful not to run two of the jobs at once. +.xH 2 Writing and Debugging a Makefile +.LP +Now you know most of what's in a makefile, what do you do next? There +are two choices: (1) use one of the uncommonly-available makefile +generators or (2) write your own makefile (I leave out the third choice of +ignoring PMake and doing everything by hand as being beyond the bounds +of common sense). +.LP +When faced with the writing of a makefile, it is usually best to start +from first principles: just what +.I are +you trying to do? What do you want the makefile finally to produce? +.LP +To begin with a somewhat traditional example, let's say you need to +write a makefile to create a program, +.CW expr , +that takes standard infix expressions and converts them to prefix form (for +no readily apparent reason). You've got three source files, in C, that +make up the program: +.CW main.c , +.CW parse.c , +and +.CW output.c . +Harking back to my pithy advice about dependency lines, you write the +first line of the file: +.DS +expr : main.o parse.o output.o +.DE +because you remember +.CW expr +is made from +.CW .o +files, not +.CW .c +files. Similarly for the +.CW .o +files you produce the lines: +.DS +main.o : main.c +parse.o : parse.c +output.o : output.c +main.o parse.o output.o : defs.h +.DE +.LP +Great. You've now got the dependencies specified. What you need now is +commands. These commands, remember, must produce the target on the +dependency line, usually by using the sources you've listed. +You remember about local variables? Good, so it should come +to you as no surprise when you write +.DS +expr : main.o parse.o output.o + cc -o $(.TARGET) $(.ALLSRC) +.DE +Why use the variables? If your program grows to produce postfix +expressions too (which, of course, requires a name change or two), it +is one fewer place you have to change the file. You cannot do this for +the object files, however, because they depend on their corresponding +source files +.I and +.CW defs.h , +thus if you said +.DS + cc -c $(.ALLSRC) +.DE +you'd get (for +.CW main.o ): +.DS + cc -c main.c defs.h +.DE +which is wrong. So you round out the makefile with these lines: +.DS +main.o : main.c + cc -c main.c +parse.o : parse.c + cc -c parse.c +output.o : output.c + cc -c output.c +.DE +.LP +The makefile is now complete and will, in fact, create the program you +want it to without unnecessary compilations or excessive typing on +your part. There are two things wrong with it, however (aside from it +being altogether too long, something I'll address in chapter 3): +.IP 1) +The string +.CW "main.o parse.o output.o" '' `` +is repeated twice, necessitating two changes when you add postfix +(you were planning on that, weren't you?). This is in direct violation +of de Boor's First Rule of writing makefiles: +.QP +.I +Anything that needs to be written more than once +should be placed in a variable. +.IP "\&" +I cannot emphasize this enough as being very important to the +maintenance of a makefile and its program. +.IP 2) +There is no way to alter the way compilations are performed short of +editing the makefile and making the change in all places. This is evil +and violates de Boor's Second Rule, which follows directly from the +first: +.QP +.I +Any flags or programs used inside a makefile should be placed in a variable so +they may be changed, temporarily or permanently, with the greatest ease. +.LP +The makefile should more properly read: +.DS +OBJS = main.o parse.o output.o +expr : $(OBJS) + $(CC) $(CFLAGS) -o $(.TARGET) $(.ALLSRC) +main.o : main.c + $(CC) $(CFLAGS) -c main.c +parse.o : parse.c + $(CC) $(CFLAGS) -c parse.c +output.o : output.c + $(CC) $(CFLAGS) -c output.c +$(OBJS) : defs.h +.DE +Alternatively, if you like the idea of dynamic sources mentioned in +section 2.3.1, +.Rm 0 2.3.1 +.Rd 4 +.Ix 0 ref "dynamic source" +.Ix 0 ref source dynamic +you could write it like this: +.DS +OBJS = main.o parse.o output.o +expr : $(OBJS) + $(CC) $(CFLAGS) -o $(.TARGET) $(.ALLSRC) +$(OBJS) : $(.PREFIX).c defs.h + $(CC) $(CFLAGS) -c $(.PREFIX).c +.DE +These two rules and examples lead to de Boor's First Corollary: +.QP +.I +Variables are your friends. +.LP +Once you've written the makefile comes the sometimes-difficult task of +.Ix 0 ref debugging +making sure the darn thing works. Your most helpful tool to make sure +the makefile is at least syntactically correct is the +.B \-n +.Ix 0 ref flags -n +flag, which allows you to see if PMake will choke on the makefile. The +second thing the +.B \-n +flag lets you do is see what PMake would do without it actually doing +it, thus you can make sure the right commands would be executed were +you to give PMake its head. +.LP +When you find your makefile isn't behaving as you hoped, the first +question that comes to mind (after ``What time is it, anyway?'') is +``Why not?'' In answering this, two flags will serve you well: +.CW "-d m" '' `` +.Ix 0 ref flags -d +and +.CW "-p 2" .'' `` +.Ix 0 ref flags -p +The first causes PMake to tell you as it examines each target in the +makefile and indicate why it is deciding whatever it is deciding. You +can then use the information printed for other targets to see where +you went wrong. The +.CW "-p 2" '' `` +flag makes PMake print out its internal state when it is done, +allowing you to see that you forgot to make that one chapter depend on +that file of macros you just got a new version of. The output from +.CW "-p 2" '' `` +is intended to resemble closely a real makefile, but with additional +information provided and with variables expanded in those commands +PMake actually printed or executed. +.LP +Something to be especially careful about is circular dependencies. +.Ix 0 def dependency circular +E.g. +.DS +a : b +b : c d +d : a +.DE +In this case, because of how PMake works, +.CW c +is the only thing PMake will examine, because +.CW d +and +.CW a +will effectively fall off the edge of the universe, making it +impossible to examine +.CW b +(or them, for that matter). +PMake will tell you (if run in its normal mode) all the targets +involved in any cycle it looked at (i.e. if you have two cycles in the +graph (naughty, naughty), but only try to make a target in one of +them, PMake will only tell you about that one. You'll have to try to +make the other to find the second cycle). When run as Make, it will +only print the first target in the cycle. +.xH 2 Invoking PMake +.LP +.Ix 0 ref flags +.Ix 0 ref arguments +.Ix 0 ref usage +PMake comes with a wide variety of flags to choose from. +They may appear in any order, interspersed with command-line variable +assignments and targets to create. +The flags are as follows: +.IP "\fB\-d\fP \fIwhat\fP" +.Ix 0 def flags -d +.Ix 0 ref debugging +This causes PMake to spew out debugging information that +may prove useful to you. If you can't +figure out why PMake is doing what it's doing, you might try using +this flag. The +.I what +parameter is a string of single characters that tell PMake what +aspects you are interested in. Most of what I describe will make +little sense to you, unless you've dealt with Make before. Just +remember where this table is and come back to it as you read on. +The characters and the information they produce are as follows: +.RS +.IP a +Archive searching and caching. +.IP c +Conditional evaluation. +.IP d +The searching and caching of directories. +.IP j +Various snippets of information related to the running of the multiple +shells. Not particularly interesting. +.IP m +The making of each target: what target is being examined; when it was +last modified; whether it is out-of-date; etc. +.IP p +Makefile parsing. +.IP r +Remote execution. +.IP s +The application of suffix-transformation rules. (See chapter 3) +.IP t +The maintenance of the list of targets. +.IP v +Variable assignment. +.RE +.IP "\&" +Of these all, the +.CW m +and +.CW s +letters will be most useful to you. +If the +.B \-d +is the final argument or the argument from which it would get these +key letters (see below for a note about which argument would be used) +begins with a +.B \- , +all of these debugging flags will be set, resulting in massive amounts +of output. +.IP "\fB\-f\fP \fImakefile\fP" +.Ix 0 def flags -f +Specify a makefile to read different from the standard makefiles +.CW Makefile "\&" ( +or +.CW makefile ). +.Ix 0 ref makefile default +.Ix 0 ref makefile other +If +.I makefile +is ``\-'', PMake uses the standard input. This is useful for making +quick and dirty makefiles.\|.\|. +.Ix 0 ref makefile "quick and dirty" +.IP \fB\-h\fP +.Ix 0 def flags -h +Prints out a summary of the various flags PMake accepts. It can also +be used to find out what level of concurrency was compiled into the +version of PMake you are using (look at +.B \-J +and +.B \-L ) +and various other information on how PMake was configured. +.Ix 0 ref configuration +.Ix 0 ref makefilesystem +.IP \fB\-i\fP +.Ix 0 def flags -i +If you give this flag, PMake will ignore non-zero status returned +by any of its shells. It's like placing a `\-' before all the commands +in the makefile. +.IP \fB\-k\fP +.Ix 0 def flags -k +This is similar to +.B \-i +in that it allows PMake to continue when it sees an error, but unlike +.B \-i , +where PMake continues blithely as if nothing went wrong, +.B \-k +causes it to recognize the error and only continue work on those +things that don't depend on the target, either directly or indirectly (through +depending on something that depends on it), whose creation returned the error. +The `k' is for ``keep going''.\|.\|. +.Ix 0 ref target +.IP \fB\-l\fP +.Ix 0 def flags -l +PMake has the ability to lock a directory against other +people executing it in the same directory (by means of a file called +``LOCK.make'' that it creates and checks for in the directory). This +is a Good Thing because two people doing the same thing in the same place +can be disastrous for the final product (too many cooks and all that). +Whether this locking is the default is up to your system +administrator. If locking is on, +.B \-l +will turn it off, and vice versa. Note that this locking will not +prevent \fIyou\fP from invoking PMake twice in the same place \*- if +you own the lock file, PMake will warn you about it but continue to execute. +.IP "\fB\-m\fP \fIdirectory\fP" +.Ix 0 def flags -m +Tells PMake another place to search for included makefiles via the <...> +style. Several +.B \-m +options can be given to form a search path. If this construct is used the +default system makefile search path is completely overridden. +To be explained in chapter 3, section 3.2. +.Rm 2 3.2 +.IP \fB\-n\fP +.Ix 0 def flags -n +This flag tells PMake not to execute the commands needed to update the +out-of-date targets in the makefile. Rather, PMake will simply print +the commands it would have executed and exit. This is particularly +useful for checking the correctness of a makefile. If PMake doesn't do +what you expect it to, it's a good chance the makefile is wrong. +.IP "\fB\-p\fP \fInumber\fP" +.Ix 0 def flags -p +.Ix 0 ref debugging +This causes PMake to print its input in a reasonable form, though +not necessarily one that would make immediate sense to anyone but me. The +.I number +is a bitwise-or of 1 and 2 where 1 means it should print the input +before doing any processing and 2 says it should print it after +everything has been re-created. Thus +.CW "\-p 3" +would print it twice\*-once before processing and once after (you +might find the difference between the two interesting). This is mostly +useful to me, but you may find it informative in some bizarre circumstances. +.IP \fB\-q\fP +.Ix 0 def flags -q +If you give PMake this flag, it will not try to re-create anything. It +will just see if anything is out-of-date and exit non-zero if so. +.IP \fB\-r\fP +.Ix 0 def flags -r +When PMake starts up, it reads a default makefile that tells it what +sort of system it's on and gives it some idea of what to do if you +don't tell it anything. I'll tell you about it in chapter 3. If you +give this flag, PMake won't read the default makefile. +.IP \fB\-s\fP +.Ix 0 def flags -s +This causes PMake to not print commands before they're executed. It +is the equivalent of putting an `@' before every command in the +makefile. +.IP \fB\-t\fP +.Ix 0 def flags -t +Rather than try to re-create a target, PMake will simply ``touch'' it +so as to make it appear up-to-date. If the target didn't exist before, +it will when PMake finishes, but if the target did exist, it will +appear to have been updated. +.IP \fB\-v\fP +.Ix 0 def flags -v +This is a mixed-compatibility flag intended to mimic the System V +version of Make. It is the same as giving +.B \-B , +and +.B \-V +as well as turning off directory locking. Targets can still be created +in parallel, however. This is the mode PMake will enter if it is +invoked either as +.CW smake '' `` +or +.CW vmake ''. `` +.IP \fB\-x\fP +.Ix 0 def flags -x +This tells PMake it's ok to export jobs to other machines, if they're +available. It is used when running in Make mode, as exporting in this +mode tends to make things run slower than if the commands were just +executed locally. +.IP \fB\-B\fP +.Ix 0 ref compatibility +.Ix 0 def flags -B +Forces PMake to be as backwards-compatible with Make as possible while +still being itself. +This includes: +.RS +.IP \(bu 2 +Executing one shell per shell command +.IP \(bu 2 +Expanding anything that looks even vaguely like a variable, with the +empty string replacing any variable PMake doesn't know. +.IP \(bu 2 +Refusing to allow you to escape a `#' with a backslash. +.IP \(bu 2 +Permitting undefined variables on dependency lines and conditionals +(see below). Normally this causes PMake to abort. +.RE +.IP \fB\-C\fP +.Ix 0 def flags -C +This nullifies any and all compatibility mode flags you may have given +or implied up to the time the +.B \-C +is encountered. It is useful mostly in a makefile that you wrote for PMake +to avoid bad things happening when someone runs PMake as +.CW make '' `` +or has things set in the environment that tell it to be compatible. +.B \-C +is +.I not +placed in the +.CW PMAKE +environment variable or the +.CW .MAKEFLAGS +or +.CW MFLAGS +global variables. +.Ix 0 ref variable environment PMAKE +.Ix 0 ref variable global .MAKEFLAGS +.Ix 0 ref variable global MFLAGS +.Ix 0 ref .MAKEFLAGS variable +.Ix 0 ref MFLAGS +.IP "\fB\-D\fP \fIvariable\fP" +.Ix 0 def flags -D +Allows you to define a variable to have +.CW 1 '' `` +as its value. The variable is a global variable, not a command-line +variable. This is useful mostly for people who are used to the C +compiler arguments and those using conditionals, which I'll get into +in section 4.3 +.Rm 1 4.3 +.IP "\fB\-I\fP \fIdirectory\fP" +.Ix 0 def flags -I +Tells PMake another place to search for included makefiles. Yet +another thing to be explained in chapter 3 (section 3.2, to be +precise). +.Rm 2 3.2 +.IP "\fB\-J\fP \fInumber\fP" +.Ix 0 def flags -J +Gives the absolute maximum number of targets to create at once on both +local and remote machines. +.IP "\fB\-L\fP \fInumber\fP" +.Ix 0 def flags -L +This specifies the maximum number of targets to create on the local +machine at once. This may be 0, though you should be wary of doing +this, as PMake may hang until a remote machine becomes available, if +one is not available when it is started. +.IP \fB\-M\fP +.Ix 0 ref compatibility +.Ix 0 def flags -M +This is the flag that provides absolute, complete, full compatibility +with Make. It still allows you to use all but a few of the features of +PMake, but it is non-parallel. This is the mode PMake enters if you +call it +.CW make .'' `` +.IP \fB\-P\fP +.Ix 0 def flags -P +.Ix 0 ref "output control" +When creating targets in parallel, several shells are executing at +once, each wanting to write its own two cent's-worth to the screen. +This output must be captured by PMake in some way in order to prevent +the screen from being filled with garbage even more indecipherable +than you usually see. PMake has two ways of doing this, one of which +provides for much cleaner output and a clear separation between the +output of different jobs, the other of which provides a more immediate +response so one can tell what is really happening. The former is done +by notifying you when the creation of a target starts, capturing the +output and transferring it to the screen all at once when the job +finishes. The latter is done by catching the output of the shell (and +its children) and buffering it until an entire line is received, then +printing that line preceded by an indication of which job produced +the output. Since I prefer this second method, it is the one used by +default. The first method will be used if you give the +.B \-P +flag to PMake. +.IP \fB\-V\fP +.Ix 0 def flags -V +As mentioned before, the +.B \-V +flag tells PMake to use Make's style of expanding variables, +substituting the empty string for any variable it doesn't know. +.IP \fB\-W\fP +.Ix 0 def flags -W +There are several times when PMake will print a message at you that is +only a warning, i.e. it can continue to work in spite of your having +done something silly (such as forgotten a leading tab for a shell +command). Sometimes you are well aware of silly things you have done +and would like PMake to stop bothering you. This flag tells it to shut +up about anything non-fatal. +.IP \fB\-X\fP +.Ix 0 def flags -X +This flag causes PMake to not attempt to export any jobs to another +machine. +.LP +Several flags may follow a single `\-'. Those flags that require +arguments take them from successive parameters. E.g. +.DS +pmake -fDnI server.mk DEBUG /chip2/X/server/include +.DE +will cause PMake to read +.CW server.mk +as the input makefile, define the variable +.CW DEBUG +as a global variable and look for included makefiles in the directory +.CW /chip2/X/server/include . +.xH 2 Summary +.LP +A makefile is made of four types of lines: +.RS +.IP \(bu 2 +Dependency lines +.IP \(bu 2 +Creation commands +.IP \(bu 2 +Variable assignments +.IP \(bu 2 +Comments, include statements and conditional directives +.RE +.LP +A dependency line is a list of one or more targets, an operator +.CW : ', (` +.CW :: ', ` +or +.CW ! '), ` +and a list of zero or more sources. Sources may contain wildcards and +certain local variables. +.LP +A creation command is a regular shell command preceded by a tab. In +addition, if the first two characters after the tab (and other +whitespace) are a combination of +.CW @ ' ` +or +.CW - ', ` +PMake will cause the command to not be printed (if the character is +.CW @ ') ` +or errors from it to be ignored (if +.CW - '). ` +A blank line, dependency line or variable assignment terminates a +creation script. There may be only one creation script for each target +with a +.CW : ' ` +or +.CW ! ' ` +operator. +.LP +Variables are places to store text. They may be unconditionally +assigned-to using the +.CW = ' ` +.Ix 0 ref = +.Ix 0 ref variable assignment +operator, appended-to using the +.CW += ' ` +.Ix 0 ref += +.Ix 0 ref variable assignment appended +operator, conditionally (if the variable is undefined) assigned-to +with the +.CW ?= ' ` +.Ix 0 ref ?= +.Ix 0 ref variable assignment conditional +operator, and assigned-to with variable expansion with the +.CW := ' ` +.Ix 0 ref := +.Ix 0 ref variable assignment expanded +operator. The output of a shell command may be assigned to a variable +using the +.CW != ' ` +.Ix 0 ref != +.Ix 0 ref variable assignment shell-output +operator. Variables may be expanded (their value inserted) by enclosing +their name in parentheses or curly braces, preceded by a dollar sign. +A dollar sign may be escaped with another dollar sign. Variables are +not expanded if PMake doesn't know about them. There are seven local +variables: +.CW .TARGET , +.CW .ALLSRC , +.CW .OODATE , +.CW .PREFIX , +.CW .IMPSRC , +.CW .ARCHIVE , +and +.CW .MEMBER . +Four of them +.CW .TARGET , ( +.CW .PREFIX , +.CW .ARCHIVE , +and +.CW .MEMBER ) +may be used to specify ``dynamic sources.'' +.Ix 0 ref "dynamic source" +.Ix 0 ref source dynamic +Variables are good. Know them. Love them. Live them. +.LP +Debugging of makefiles is best accomplished using the +.B \-n , +.B "\-d m" , +and +.B "\-p 2" +flags. +.xH 2 Exercises +.ce +\s+4\fBTBA\fP\s0 +.xH 1 Short-cuts and Other Nice Things +.LP +Based on what I've told you so far, you may have gotten the impression +that PMake is just a way of storing away commands and making sure you +don't forget to compile something. Good. That's just what it is. +However, the ways I've described have been inelegant, at best, and +painful, at worst. +This chapter contains things that make the +writing of makefiles easier and the makefiles themselves shorter and +easier to modify (and, occasionally, simpler). In this chapter, I +assume you are somewhat more +familiar with Sprite (or UNIX, if that's what you're using) than I did +in chapter 2, just so you're on your toes. +So without further ado... +.xH 2 Transformation Rules +.LP +As you know, a file's name consists of two parts: a base name, which +gives some hint as to the contents of the file, and a suffix, which +usually indicates the format of the file. +Over the years, as +.UX +has developed, +naming conventions, with regard to suffixes, have also developed that have +become almost as incontrovertible as Law. E.g. a file ending in +.CW .c +is assumed to contain C source code; one with a +.CW .o +suffix is assumed to be a compiled, relocatable object file that may +be linked into any program; a file with a +.CW .ms +suffix is usually a text file to be processed by Troff with the \-ms +macro package, and so on. +One of the best aspects of both Make and PMake comes from their +understanding of how the suffix of a file pertains to its contents and +their ability to do things with a file based solely on its suffix. This +ability comes from something known as a transformation rule. A +transformation rule specifies how to change a file with one suffix +into a file with another suffix. +.LP +A transformation rule looks much like a dependency line, except the +target is made of two known suffixes stuck together. Suffixes are made +known to PMake by placing them as sources on a dependency line whose +target is the special target +.CW .SUFFIXES . +E.g. +.DS +\&.SUFFIXES : .o .c +\&.c.o : + $(CC) $(CFLAGS) -c $(.IMPSRC) +.DE +The creation script attached to the target is used to transform a file with +the first suffix (in this case, +.CW .c ) +into a file with the second suffix (here, +.CW .o ). +In addition, the target inherits whatever attributes have been applied +to the transformation rule. +The simple rule given above says that to transform a C source file +into an object file, you compile it using +.CW cc +with the +.CW \-c +flag. +This rule is taken straight from the system makefile. Many +transformation rules (and suffixes) are defined there, and I refer you +to it for more examples (type +.CW "pmake -h" '' `` +to find out where it is). +.LP +There are several things to note about the transformation rule given +above: +.RS +.IP 1) +The +.CW .IMPSRC +variable. +.Ix 0 def variable local .IMPSRC +.Ix 0 def .IMPSRC +This variable is set to the ``implied source'' (the file from which +the target is being created; the one with the first suffix), which, in this +case, is the .c file. +.IP 2) +The +.CW CFLAGS +variable. Almost all of the transformation rules in the system +makefile are set up using variables that you can alter in your +makefile to tailor the rule to your needs. In this case, if you want +all your C files to be compiled with the +.B \-g +flag, to provide information for +.CW dbx , +you would set the +.CW CFLAGS +variable to contain +.CW -g +.CW "CFLAGS = -g" '') (`` +and PMake would take care of the rest. +.RE +.LP +To give you a quick example, the makefile in 2.3.4 +.Rm 3 2.3.4 +could be changed to this: +.DS +OBJS = a.o b.o c.o +program : $(OBJS) + $(CC) -o $(.TARGET) $(.ALLSRC) +$(OBJS) : defs.h +.DE +The transformation rule I gave above takes the place of the 6 lines\** +.FS +This is also somewhat cleaner, I think, than the dynamic source +solution presented in 2.6 +.FE +.Rm 4 2.6 +.DS +a.o : a.c + cc -c a.c +b.o : b.c + cc -c b.c +c.o : c.c + cc -c c.c +.DE +.LP +Now you may be wondering about the dependency between the +.CW .o +and +.CW .c +files \*- it's not mentioned anywhere in the new makefile. This is +because it isn't needed: one of the effects of applying a +transformation rule is the target comes to depend on the implied +source. That's why it's called the implied +.I source . +.LP +For a more detailed example. Say you have a makefile like this: +.DS +a.out : a.o b.o + $(CC) $(.ALLSRC) +.DE +and a directory set up like this: +.DS +total 4 +-rw-rw-r-- 1 deboor 34 Sep 7 00:43 Makefile +-rw-rw-r-- 1 deboor 119 Oct 3 19:39 a.c +-rw-rw-r-- 1 deboor 201 Sep 7 00:43 a.o +-rw-rw-r-- 1 deboor 69 Sep 7 00:43 b.c +.DE +While just typing +.CW pmake '' `` +will do the right thing, it's much more informative to type +.CW "pmake -d s" ''. `` +This will show you what PMake is up to as it processes the files. In +this case, PMake prints the following: +.DS +Suff_FindDeps (a.out) + using existing source a.o + applying .o -> .out to "a.o" +Suff_FindDeps (a.o) + trying a.c...got it + applying .c -> .o to "a.c" +Suff_FindDeps (b.o) + trying b.c...got it + applying .c -> .o to "b.c" +Suff_FindDeps (a.c) + trying a.y...not there + trying a.l...not there + trying a.c,v...not there + trying a.y,v...not there + trying a.l,v...not there +Suff_FindDeps (b.c) + trying b.y...not there + trying b.l...not there + trying b.c,v...not there + trying b.y,v...not there + trying b.l,v...not there +--- a.o --- +cc -c a.c +--- b.o --- +cc -c b.c +--- a.out --- +cc a.o b.o +.DE +.LP +.CW Suff_FindDeps +is the name of a function in PMake that is called to check for implied +sources for a target using transformation rules. +The transformations it tries are, naturally +enough, limited to the ones that have been defined (a transformation +may be defined multiple times, by the way, but only the most recent +one will be used). You will notice, however, that there is a definite +order to the suffixes that are tried. This order is set by the +relative positions of the suffixes on the +.CW .SUFFIXES +line \*- the earlier a suffix appears, the earlier it is checked as +the source of a transformation. Once a suffix has been defined, the +only way to change its position in the pecking order is to remove all +the suffixes (by having a +.CW .SUFFIXES +dependency line with no sources) and redefine them in the order you +want. (Previously-defined transformation rules will be automatically +redefined as the suffixes they involve are re-entered.) +.LP +Another way to affect the search order is to make the dependency +explicit. In the above example, +.CW a.out +depends on +.CW a.o +and +.CW b.o . +Since a transformation exists from +.CW .o +to +.CW .out , +PMake uses that, as indicated by the +.CW "using existing source a.o" '' `` +message. +.LP +The search for a transformation starts from the suffix of the target +and continues through all the defined transformations, in the order +dictated by the suffix ranking, until an existing file with the same +base (the target name minus the suffix and any leading directories) is +found. At that point, one or more transformation rules will have been +found to change the one existing file into the target. +.LP +For example, ignoring what's in the system makefile for now, say you +have a makefile like this: +.DS +\&.SUFFIXES : .out .o .c .y .l +\&.l.c : + lex $(.IMPSRC) + mv lex.yy.c $(.TARGET) +\&.y.c : + yacc $(.IMPSRC) + mv y.tab.c $(.TARGET) +\&.c.o : + cc -c $(.IMPSRC) +\&.o.out : + cc -o $(.TARGET) $(.IMPSRC) +.DE +and the single file +.CW jive.l . +If you were to type +.CW "pmake -rd ms jive.out" ,'' `` +you would get the following output for +.CW jive.out : +.DS +Suff_FindDeps (jive.out) + trying jive.o...not there + trying jive.c...not there + trying jive.y...not there + trying jive.l...got it + applying .l -> .c to "jive.l" + applying .c -> .o to "jive.c" + applying .o -> .out to "jive.o" +.DE +and this is why: PMake starts with the target +.CW jive.out , +figures out its suffix +.CW .out ) ( +and looks for things it can transform to a +.CW .out +file. In this case, it only finds +.CW .o , +so it looks for the file +.CW jive.o . +It fails to find it, so it looks for transformations into a +.CW .o +file. Again it has only one choice: +.CW .c . +So it looks for +.CW jive.c +and, as you know, fails to find it. At this point it has two choices: +it can create the +.CW .c +file from either a +.CW .y +file or a +.CW .l +file. Since +.CW .y +came first on the +.CW .SUFFIXES +line, it checks for +.CW jive.y +first, but can't find it, so it looks for +.CW jive.l +and, lo and behold, there it is. +At this point, it has defined a transformation path as follows: +.CW .l +\(-> +.CW .c +\(-> +.CW .o +\(-> +.CW .out +and applies the transformation rules accordingly. For completeness, +and to give you a better idea of what PMake actually did with this +three-step transformation, this is what PMake printed for the rest of +the process: +.DS +Suff_FindDeps (jive.o) + using existing source jive.c + applying .c -> .o to "jive.c" +Suff_FindDeps (jive.c) + using existing source jive.l + applying .l -> .c to "jive.l" +Suff_FindDeps (jive.l) +Examining jive.l...modified 17:16:01 Oct 4, 1987...up-to-date +Examining jive.c...non-existent...out-of-date +--- jive.c --- +lex jive.l +\&.\|.\|. meaningless lex output deleted .\|.\|. +mv lex.yy.c jive.c +Examining jive.o...non-existent...out-of-date +--- jive.o --- +cc -c jive.c +Examining jive.out...non-existent...out-of-date +--- jive.out --- +cc -o jive.out jive.o +.DE +.LP +One final question remains: what does PMake do with targets that have +no known suffix? PMake simply pretends it actually has a known suffix +and searches for transformations accordingly. +The suffix it chooses is the source for the +.CW .NULL +.Ix 0 ref .NULL +target mentioned later. In the system makefile, +.CW .out +is chosen as the ``null suffix'' +.Ix 0 def suffix null +.Ix 0 def "null suffix" +because most people use PMake to create programs. You are, however, +free and welcome to change it to a suffix of your own choosing. +The null suffix is ignored, however, when PMake is in compatibility +mode (see chapter 4). +.xH 2 Including Other Makefiles +.Ix 0 def makefile inclusion +.Rd 2 +.LP +Just as for programs, it is often useful to extract certain parts of a +makefile into another file and just include it in other makefiles +somehow. Many compilers allow you say something like +.DS +#include "defs.h" +.DE +to include the contents of +.CW defs.h +in the source file. PMake allows you to do the same thing for +makefiles, with the added ability to use variables in the filenames. +An include directive in a makefile looks either like this: +.DS +#include +.DE +or this +.DS +#include "file" +.DE +The difference between the two is where PMake searches for the file: +the first way, PMake will look for +the file only in the system makefile directory (or directories) +(to find out what that directory is, give PMake the +.B \-h +flag). +.Ix 0 ref flags -h +The system makefile directory search path can be overridden via the +.B \-m +option. +.Ix 0 ref flags -m +For files in double-quotes, the search is more complex: +.RS +.IP 1) +The directory of the makefile that's including the file. +.IP 2) +The current directory (the one in which you invoked PMake). +.IP 3) +The directories given by you using +.B \-I +flags, in the order in which you gave them. +.IP 4) +Directories given by +.CW .PATH +dependency lines (see chapter 4). +.IP 5) +The system makefile directory. +.RE +.LP +in that order. +.LP +You are free to use PMake variables in the filename\*-PMake will +expand them before searching for the file. You must specify the +searching method with either angle brackets or double-quotes +.I outside +of a variable expansion. I.e. the following +.DS +SYSTEM = + +#include $(SYSTEM) +.DE +won't work. +.xH 2 Saving Commands +.LP +.Ix 0 def ... +There may come a time when you will want to save certain commands to +be executed when everything else is done. For instance: you're +making several different libraries at one time and you want to create the +members in parallel. Problem is, +.CW ranlib +is another one of those programs that can't be run more than once in +the same directory at the same time (each one creates a file called +.CW __.SYMDEF +into which it stuffs information for the linker to use. Two of them +running at once will overwrite each other's file and the result will +be garbage for both parties). You might want a way to save the ranlib +commands til the end so they can be run one after the other, thus +keeping them from trashing each other's file. PMake allows you to do +this by inserting an ellipsis (``.\|.\|.'') as a command between +commands to be run at once and those to be run later. +.LP +So for the +.CW ranlib +case above, you might do this: +.Rd 5 +.DS +lib1.a : $(LIB1OBJS) + rm -f $(.TARGET) + ar cr $(.TARGET) $(.ALLSRC) + ... + ranlib $(.TARGET) + +lib2.a : $(LIB2OBJS) + rm -f $(.TARGET) + ar cr $(.TARGET) $(.ALLSRC) + ... + ranlib $(.TARGET) +.DE +.Ix 0 ref variable local .TARGET +.Ix 0 ref variable local .ALLSRC +This would save both +.DS +ranlib $(.TARGET) +.DE +commands until the end, when they would run one after the other +(using the correct value for the +.CW .TARGET +variable, of course). +.LP +Commands saved in this manner are only executed if PMake manages to +re-create everything without an error. +.xH 2 Target Attributes +.LP +PMake allows you to give attributes to targets by means of special +sources. Like everything else PMake uses, these sources begin with a +period and are made up of all upper-case letters. There are various +reasons for using them, and I will try to give examples for most of +them. Others you'll have to find uses for yourself. Think of it as ``an +exercise for the reader.'' By placing one (or more) of these as a source on a +dependency line, you are ``marking the target(s) with that +attribute.'' That's just the way I phrase it, so you know. +.LP +Any attributes given as sources for a transformation rule are applied +to the target of the transformation rule when the rule is applied. +.Ix 0 def attributes +.Ix 0 ref source +.Ix 0 ref target +.nr pw 12 +.IP .DONTCARE \n(pw +.Ix 0 def attributes .DONTCARE +.Ix 0 def .DONTCARE +If a target is marked with this attribute and PMake can't figure out +how to create it, it will ignore this fact and assume the file isn't +really needed or actually exists and PMake just can't find it. This may prove +wrong, but the error will be noted later on, not when PMake tries to create +the target so marked. This attribute also prevents PMake from +attempting to touch the target if it is given the +.B \-t +flag. +.Ix 0 ref flags -t +.IP .EXEC \n(pw +.Ix 0 def attributes .EXEC +.Ix 0 def .EXEC +This attribute causes its shell script to be executed while having no +effect on targets that depend on it. This makes the target into a sort +of subroutine. An example. Say you have some LISP files that need to +be compiled and loaded into a LISP process. To do this, you echo LISP +commands into a file and execute a LISP with this file as its input +when everything's done. Say also that you have to load other files +from another system before you can compile your files and further, +that you don't want to go through the loading and dumping unless one +of +.I your +files has changed. Your makefile might look a little bit +like this (remember, this is an educational example, and don't worry +about the +.CW COMPILE +rule, all will soon become clear, grasshopper): +.DS +system : init a.fasl b.fasl c.fasl + for i in $(.ALLSRC); + do + echo -n '(load "' >> input + echo -n ${i} >> input + echo '")' >> input + done + echo '(dump "$(.TARGET)")' >> input + lisp < input + +a.fasl : a.l init COMPILE +b.fasl : b.l init COMPILE +c.fasl : c.l init COMPILE +COMPILE : .USE + echo '(compile "$(.ALLSRC)")' >> input +init : .EXEC + echo '(load-system)' > input +.DE +.Ix 0 ref .USE +.Ix 0 ref attributes .USE +.Ix 0 ref variable local .ALLSRC +.IP "\&" +.CW .EXEC +sources, don't appear in the local variables of targets that depend on +them (nor are they touched if PMake is given the +.B \-t +flag). +.Ix 0 ref flags -t +Note that all the rules, not just that for +.CW system , +include +.CW init +as a source. This is because none of the other targets can be made +until +.CW init +has been made, thus they depend on it. +.IP .EXPORT \n(pw +.Ix 0 def attributes .EXPORT +.Ix 0 def .EXPORT +This is used to mark those targets whose creation should be sent to +another machine if at all possible. This may be used by some +exportation schemes if the exportation is expensive. You should ask +your system administrator if it is necessary. +.IP .EXPORTSAME \n(pw +.Ix 0 def attributes .EXPORTSAME +.Ix 0 def .EXPORTSAME +Tells the export system that the job should be exported to a machine +of the same architecture as the current one. Certain operations (e.g. +running text through +.CW nroff ) +can be performed the same on any architecture (CPU and +operating system type), while others (e.g. compiling a program with +.CW cc ) +must be performed on a machine with the same architecture. Not all +export systems will support this attribute. +.IP .IGNORE \n(pw +.Ix 0 def attributes .IGNORE +.Ix 0 def .IGNORE attribute +Giving a target the +.CW .IGNORE +attribute causes PMake to ignore errors from any of the target's commands, as +if they all had `\-' before them. +.IP .INVISIBLE \n(pw +.Ix 0 def attributes .INVISIBLE +.Ix 0 def .INVISIBLE +This allows you to specify one target as a source for another without +the one affecting the other's local variables. Useful if, say, you +have a makefile that creates two programs, one of which is used to +create the other, so it must exist before the other is created. You +could say +.DS +prog1 : $(PROG1OBJS) prog2 MAKEINSTALL +prog2 : $(PROG2OBJS) .INVISIBLE MAKEINSTALL +.DE +where +.CW MAKEINSTALL +is some complex .USE rule (see below) that depends on the +.Ix 0 ref .USE +.CW .ALLSRC +variable containing the right things. Without the +.CW .INVISIBLE +attribute for +.CW prog2 , +the +.CW MAKEINSTALL +rule couldn't be applied. This is not as useful as it should be, and +the semantics may change (or the whole thing go away) in the +not-too-distant future. +.IP .JOIN \n(pw +.Ix 0 def attributes .JOIN +.Ix 0 def .JOIN +This is another way to avoid performing some operations in parallel +while permitting everything else to be done so. Specifically it +forces the target's shell script to be executed only if one or more of the +sources was out-of-date. In addition, the target's name, +in both its +.CW .TARGET +variable and all the local variables of any target that depends on it, +is replaced by the value of its +.CW .ALLSRC +variable. +As an example, suppose you have a program that has four libraries that +compile in the same directory along with, and at the same time as, the +program. You again have the problem with +.CW ranlib +that I mentioned earlier, only this time it's more severe: you +can't just put the ranlib off to the end since the program +will need those libraries before it can be re-created. You can do +something like this: +.DS +program : $(OBJS) libraries + cc -o $(.TARGET) $(.ALLSRC) + +libraries : lib1.a lib2.a lib3.a lib4.a .JOIN + ranlib $(.OODATE) +.DE +.Ix 0 ref variable local .TARGET +.Ix 0 ref variable local .ALLSRC +.Ix 0 ref variable local .OODATE +.Ix 0 ref .TARGET +.Ix 0 ref .ALLSRC +.Ix 0 ref .OODATE +In this case, PMake will re-create the +.CW $(OBJS) +as necessary, along with +.CW lib1.a , +.CW lib2.a , +.CW lib3.a +and +.CW lib4.a . +It will then execute +.CW ranlib +on any library that was changed and set +.CW program 's +.CW .ALLSRC +variable to contain what's in +.CW $(OBJS) +followed by +.CW "lib1.a lib2.a lib3.a lib4.a" .'' `` +In case you're wondering, it's called +.CW .JOIN +because it joins together different threads of the ``input graph'' at +the target marked with the attribute. +Another aspect of the .JOIN attribute is it keeps the target from +being created if the +.B \-t +flag was given. +.Ix 0 ref flags -t +.IP .MAKE \n(pw +.Ix 0 def attributes .MAKE +.Ix 0 def .MAKE +The +.CW .MAKE +attribute marks its target as being a recursive invocation of PMake. +This forces PMake to execute the script associated with the target (if +it's out-of-date) even if you gave the +.B \-n +or +.B \-t +flag. By doing this, you can start at the top of a system and type +.DS +pmake -n +.DE +and have it descend the directory tree (if your makefiles are set up +correctly), printing what it would have executed if you hadn't +included the +.B \-n +flag. +.IP .NOEXPORT \n(pw +.Ix 0 def attributes .NOEXPORT +.Ix 0 def .NOEXPORT attribute +If possible, PMake will attempt to export the creation of all targets to +another machine (this depends on how PMake was configured). Sometimes, +the creation is so simple, it is pointless to send it to another +machine. If you give the target the +.CW .NOEXPORT +attribute, it will be run locally, even if you've given PMake the +.B "\-L 0" +flag. +.IP .NOTMAIN \n(pw +.Ix 0 def attributes .NOTMAIN +.Ix 0 def .NOTMAIN +Normally, if you do not specify a target to make in any other way, +PMake will take the first target on the first dependency line of a +makefile as the target to create. That target is known as the ``Main +Target'' and is labeled as such if you print the dependencies out +using the +.B \-p +flag. +.Ix 0 ref flags -p +Giving a target this attribute tells PMake that the target is +definitely +.I not +the Main Target. +This allows you to place targets in an included makefile and +have PMake create something else by default. +.IP .PRECIOUS \n(pw +.Ix 0 def attributes .PRECIOUS +.Ix 0 def .PRECIOUS attribute +When PMake is interrupted (you type control-C at the keyboard), it +will attempt to clean up after itself by removing any half-made +targets. If a target has the +.CW .PRECIOUS +attribute, however, PMake will leave it alone. An additional side +effect of the `::' operator is to mark the targets as +.CW .PRECIOUS . +.Ix 0 ref operator double-colon +.Ix 0 ref :: +.IP .SILENT \n(pw +.Ix 0 def attributes .SILENT +.Ix 0 def .SILENT attribute +Marking a target with this attribute keeps its commands from being +printed when they're executed, just as if they had an `@' in front of them. +.IP .USE \n(pw +.Ix 0 def attributes .USE +.Ix 0 def .USE +By giving a target this attribute, you turn it into PMake's equivalent +of a macro. When the target is used as a source for another target, +the other target acquires the commands, sources and attributes (except +.CW .USE ) +of the source. +If the target already has commands, the +.CW .USE +target's commands are added to the end. If more than one .USE-marked +source is given to a target, the rules are applied sequentially. +.IP "\&" \n(pw +The typical .USE rule (as I call them) will use the sources of the +target to which it is applied (as stored in the +.CW .ALLSRC +variable for the target) as its ``arguments,'' if you will. +For example, you probably noticed that the commands for creating +.CW lib1.a +and +.CW lib2.a +in the example in section 3.3 +.Rm 5 3.3 +were exactly the same. You can use the +.CW .USE +attribute to eliminate the repetition, like so: +.DS +lib1.a : $(LIB1OBJS) MAKELIB +lib2.a : $(LIB2OBJS) MAKELIB + +MAKELIB : .USE + rm -f $(.TARGET) + ar cr $(.TARGET) $(.ALLSRC) + ... + ranlib $(.TARGET) +.DE +.Ix 0 ref variable local .TARGET +.Ix 0 ref variable local .ALLSRC +.IP "\&" \n(pw +Several system makefiles (not to be confused with The System Makefile) +make use of these .USE rules to make your +life easier (they're in the default, system makefile directory...take a look). +Note that the .USE rule source itself +.CW MAKELIB ) ( +does not appear in any of the targets's local variables. +There is no limit to the number of times I could use the +.CW MAKELIB +rule. If there were more libraries, I could continue with +.CW "lib3.a : $(LIB3OBJS) MAKELIB" '' `` +and so on and so forth. +.xH 2 Special Targets +.LP +As there were in Make, so there are certain targets that have special +meaning to PMake. When you use one on a dependency line, it is the +only target that may appear on the left-hand-side of the operator. +.Ix 0 ref target +.Ix 0 ref operator +As for the attributes and variables, all the special targets +begin with a period and consist of upper-case letters only. +I won't describe them all in detail because some of them are rather +complex and I'll describe them in more detail than you'll want in +chapter 4. +The targets are as follows: +.nr pw 10 +.IP .BEGIN \n(pw +.Ix 0 def .BEGIN +Any commands attached to this target are executed before anything else +is done. You can use it for any initialization that needs doing. +.IP .DEFAULT \n(pw +.Ix 0 def .DEFAULT +This is sort of a .USE rule for any target (that was used only as a +source) that PMake can't figure out any other way to create. It's only +``sort of'' a .USE rule because only the shell script attached to the +.CW .DEFAULT +target is used. The +.CW .IMPSRC +variable of a target that inherits +.CW .DEFAULT 's +commands is set to the target's own name. +.Ix 0 ref .IMPSRC +.Ix 0 ref variable local .IMPSRC +.IP .END \n(pw +.Ix 0 def .END +This serves a function similar to +.CW .BEGIN , +in that commands attached to it are executed once everything has been +re-created (so long as no errors occurred). It also serves the extra +function of being a place on which PMake can hang commands you put off +to the end. Thus the script for this target will be executed before +any of the commands you save with the ``.\|.\|.''. +.Ix 0 ref ... +.IP .EXPORT \n(pw +The sources for this target are passed to the exportation system compiled +into PMake. Some systems will use these sources to configure +themselves. You should ask your system administrator about this. +.IP .IGNORE \n(pw +.Ix 0 def .IGNORE target +.Ix 0 ref .IGNORE attribute +.Ix 0 ref attributes .IGNORE +This target marks each of its sources with the +.CW .IGNORE +attribute. If you don't give it any sources, then it is like +giving the +.B \-i +flag when you invoke PMake \*- errors are ignored for all commands. +.Ix 0 ref flags -i +.IP .INCLUDES \n(pw +.Ix 0 def .INCLUDES target +.Ix 0 def variable global .INCLUDES +.Ix 0 def .INCLUDES variable +The sources for this target are taken to be suffixes that indicate a +file that can be included in a program source file. +The suffix must have already been declared with +.CW .SUFFIXES +(see below). +Any suffix so marked will have the directories on its search path +(see +.CW .PATH , +below) placed in the +.CW .INCLUDES +variable, each preceded by a +.B \-I +flag. This variable can then be used as an argument for the compiler +in the normal fashion. The +.CW .h +suffix is already marked in this way in the system makefile. +.Ix 0 ref makefilesystem +E.g. if you have +.DS +\&.SUFFIXES : .bitmap +\&.PATH.bitmap : /usr/local/X/lib/bitmaps +\&.INCLUDES : .bitmap +.DE +PMake will place +.CW "-I/usr/local/X/lib/bitmaps" '' `` +in the +.CW .INCLUDES +variable and you can then say +.DS +cc $(.INCLUDES) -c xprogram.c +.DE +(Note: the +.CW .INCLUDES +variable is not actually filled in until the entire makefile has been read.) +.IP .INTERRUPT \n(pw +.Ix 0 def .INTERRUPT +When PMake is interrupted, +it will execute the commands in the script for this target, if it +exists. +.IP .LIBS \n(pw +.Ix 0 def .LIBS target +.Ix 0 def .LIBS variable +.Ix 0 def variable global .LIBS +This does for libraries what +.CW .INCLUDES +does for include files, except the flag used is +.B \-L , +as required by those linkers that allow you to tell them where to find +libraries. The variable used is +.CW .LIBS . +Be forewarned that PMake may not have been compiled to do this if the +linker on your system doesn't accept the +.B \-L +flag, though the +.CW .LIBS +variable will always be defined once the makefile has been read. +.IP .MAIN \n(pw +.Ix 0 def .MAIN +If you didn't give a target (or targets) to create when you invoked +PMake, it will take the sources of this target as the targets to +create. +.IP .MAKEFLAGS \n(pw +.Ix 0 def .MAKEFLAGS target +This target provides a way for you to always specify flags for PMake +when the makefile is used. The flags are just as they would be typed +to the shell (except you can't use shell variables unless they're in +the environment), +though the +.B \-f +and +.B \-r +flags have no effect. +.IP .NULL \n(pw +.Ix 0 def .NULL +.Ix 0 ref suffix null +.Ix 0 ref "null suffix" +This allows you to specify what suffix PMake should pretend a file has +if, in fact, it has no known suffix. Only one suffix may be so +designated. The last source on the dependency line is the suffix that +is used (you should, however, only give one suffix.\|.\|.). +.IP .PATH \n(pw +.Ix 0 def .PATH +If you give sources for this target, PMake will take them as +directories in which to search for files it cannot find in the current +directory. If you give no sources, it will clear out any directories +added to the search path before. Since the effects of this all get +very complex, I'll leave it til chapter four to give you a complete +explanation. +.IP .PATH\fIsuffix\fP \n(pw +.Ix 0 ref .PATH +This does a similar thing to +.CW .PATH , +but it does it only for files with the given suffix. The suffix must +have been defined already. Look at +.B "Search Paths" +(section 4.1) +.Rm 6 4.1 +for more information. +.IP .PRECIOUS \n(pw +.Ix 0 def .PRECIOUS target +.Ix 0 ref .PRECIOUS attribute +.Ix 0 ref attributes .PRECIOUS +Similar to +.CW .IGNORE , +this gives the +.CW .PRECIOUS +attribute to each source on the dependency line, unless there are no +sources, in which case the +.CW .PRECIOUS +attribute is given to every target in the file. +.IP .RECURSIVE \n(pw +.Ix 0 def .RECURSIVE +.Ix 0 ref attributes .MAKE +.Ix 0 ref .MAKE +This target applies the +.CW .MAKE +attribute to all its sources. It does nothing if you don't give it any sources. +.IP .SHELL \n(pw +.Ix 0 def .SHELL +PMake is not constrained to only using the Bourne shell to execute +the commands you put in the makefile. You can tell it some other shell +to use with this target. Check out +.B "A Shell is a Shell is a Shell" +(section 4.4) +.Rm 7 4.4 +for more information. +.IP .SILENT \n(pw +.Ix 0 def .SILENT target +.Ix 0 ref .SILENT attribute +.Ix 0 ref attributes .SILENT +When you use +.CW .SILENT +as a target, it applies the +.CW .SILENT +attribute to each of its sources. If there are no sources on the +dependency line, then it is as if you gave PMake the +.B \-s +flag and no commands will be echoed. +.IP .SUFFIXES \n(pw +.Ix 0 def .SUFFIXES +This is used to give new file suffixes for PMake to handle. Each +source is a suffix PMake should recognize. If you give a +.CW .SUFFIXES +dependency line with no sources, PMake will forget about all the +suffixes it knew (this also nukes the null suffix). +For those targets that need to have suffixes defined, this is how you do it. +.LP +In addition to these targets, a line of the form +.DS +\fIattribute\fP : \fIsources\fP +.DE +applies the +.I attribute +to all the targets listed as +.I sources . +.xH 2 Modifying Variable Expansion +.LP +.Ix 0 def variable expansion modified +.Ix 0 ref variable expansion +.Ix 0 def variable modifiers +Variables need not always be expanded verbatim. PMake defines several +modifiers that may be applied to a variable's value before it is +expanded. You apply a modifier by placing it after the variable name +with a colon between the two, like so: +.DS +${\fIVARIABLE\fP:\fImodifier\fP} +.DE +Each modifier is a single character followed by something specific to +the modifier itself. +You may apply as many modifiers as you want \*- each one is applied to +the result of the previous and is separated from the previous by +another colon. +.LP +There are seven ways to modify a variable's expansion, most of which +come from the C shell variable modification characters: +.RS +.IP "M\fIpattern\fP" +.Ix 0 def :M +.Ix 0 def modifier match +This is used to select only those words (a word is a series of +characters that are neither spaces nor tabs) that match the given +.I pattern . +The pattern is a wildcard pattern like that used by the shell, where +.CW * +means 0 or more characters of any sort; +.CW ? +is any single character; +.CW [abcd] +matches any single character that is either `a', `b', `c' or `d' +(there may be any number of characters between the brackets); +.CW [0-9] +matches any single character that is between `0' and `9' (i.e. any +digit. This form may be freely mixed with the other bracket form), and +`\\' is used to escape any of the characters `*', `?', `[' or `:', +leaving them as regular characters to match themselves in a word. +For example, the system makefile +.CW +uses +.CW "$(CFLAGS:M-[ID]*)" '' `` +to extract all the +.CW \-I +and +.CW \-D +flags that would be passed to the C compiler. This allows it to +properly locate include files and generate the correct dependencies. +.IP "N\fIpattern\fP" +.Ix 0 def :N +.Ix 0 def modifier nomatch +This is identical to +.CW :M +except it substitutes all words that don't match the given pattern. +.IP "S/\fIsearch-string\fP/\fIreplacement-string\fP/[g]" +.Ix 0 def :S +.Ix 0 def modifier substitute +Causes the first occurrence of +.I search-string +in the variable to be replaced by +.I replacement-string , +unless the +.CW g +flag is given at the end, in which case all occurrences of the string +are replaced. The substitution is performed on each word in the +variable in turn. If +.I search-string +begins with a +.CW ^ , +the string must match starting at the beginning of the word. If +.I search-string +ends with a +.CW $ , +the string must match to the end of the word (these two may be +combined to force an exact match). If a backslash precedes these two +characters, however, they lose their special meaning. Variable +expansion also occurs in the normal fashion inside both the +.I search-string +and the +.I replacement-string , +.B except +that a backslash is used to prevent the expansion of a +.CW $ , +not another dollar sign, as is usual. +Note that +.I search-string +is just a string, not a pattern, so none of the usual +regular-expression/wildcard characters have any special meaning save +.CW ^ +and +.CW $ . +In the replacement string, +the +.CW & +character is replaced by the +.I search-string +unless it is preceded by a backslash. +You are allowed to use any character except +colon or exclamation point to separate the two strings. This so-called +delimiter character may be placed in either string by preceding it +with a backslash. +.IP T +.Ix 0 def :T +.Ix 0 def modifier tail +Replaces each word in the variable expansion by its last +component (its ``tail''). For example, given +.DS +OBJS = ../lib/a.o b /usr/lib/libm.a +TAILS = $(OBJS:T) +.DE +the variable +.CW TAILS +would expand to +.CW "a.o b libm.a" .'' `` +.IP H +.Ix 0 def :H +.Ix 0 def modifier head +This is similar to +.CW :T , +except that every word is replaced by everything but the tail (the +``head''). Using the same definition of +.CW OBJS , +the string +.CW "$(OBJS:H)" '' `` +would expand to +.CW "../lib /usr/lib" .'' `` +Note that the final slash on the heads is removed and +anything without a head is replaced by the empty string. +.IP E +.Ix 0 def :E +.Ix 0 def modifier extension +.Ix 0 def modifier suffix +.Ix 0 ref suffix "variable modifier" +.CW :E +replaces each word by its suffix (``extension''). So +.CW "$(OBJS:E)" '' `` +would give you +.CW ".o .a" .'' `` +.IP R +.Ix 0 def :R +.Ix 0 def modifier root +.Ix 0 def modifier base +This replaces each word by everything but the suffix (the ``root'' of +the word). +.CW "$(OBJS:R)" '' `` +expands to `` +.CW "../lib/a b /usr/lib/libm" .'' +.RE +.LP +In addition, the System V style of substitution is also supported. +This looks like: +.DS +$(\fIVARIABLE\fP:\fIsearch-string\fP=\fIreplacement\fP) +.DE +It must be the last modifier in the chain. The search is anchored at +the end of each word, so only suffixes or whole words may be replaced. +.xH 2 More on Debugging +.xH 2 More Exercises +.IP (3.1) +You've got a set programs, each of which is created from its own +assembly-language source file (suffix +.CW .asm ). +Each program can be assembled into two versions, one with error-checking +code assembled in and one without. You could assemble them into files +with different suffixes +.CW .eobj \& ( +and +.CW .obj , +for instance), but your linker only understands files that end in +.CW .obj . +To top it all off, the final executables +.I must +have the suffix +.CW .exe . +How can you still use transformation rules to make your life easier +(Hint: assume the error-checking versions have +.CW ec +tacked onto their prefix)? +.IP (3.2) +Assume, for a moment or two, you want to perform a sort of +``indirection'' by placing the name of a variable into another one, +then you want to get the value of the first by expanding the second +somehow. Unfortunately, PMake doesn't allow constructs like +.DS I +$($(FOO)) +.DE +What do you do? Hint: no further variable expansion is performed after +modifiers are applied, thus if you cause a $ to occur in the +expansion, that's what will be in the result. +.xH 1 PMake for Gods +.LP +This chapter is devoted to those facilities in PMake that allow you to +do a great deal in a makefile with very little work, as well as do +some things you couldn't do in Make without a great deal of work (and +perhaps the use of other programs). The problem with these features, +is they must be handled with care, or you will end up with a mess. +.LP +Once more, I assume a greater familiarity with +.UX +or Sprite than I did in the previous two chapters. +.xH 2 Search Paths +.Rd 6 +.LP +PMake supports the dispersal of files into multiple directories by +allowing you to specify places to look for sources with +.CW .PATH +targets in the makefile. The directories you give as sources for these +targets make up a ``search path.'' Only those files used exclusively +as sources are actually sought on a search path, the assumption being +that anything listed as a target in the makefile can be created by the +makefile and thus should be in the current directory. +.LP +There are two types of search paths +in PMake: one is used for all types of files (including included +makefiles) and is specified with a plain +.CW .PATH +target (e.g. +.CW ".PATH : RCS" ''), `` +while the other is specific to a certain type of file, as indicated by +the file's suffix. A specific search path is indicated by immediately following +the +.CW .PATH +with the suffix of the file. For instance +.DS +\&.PATH.h : /sprite/lib/include /sprite/att/lib/include +.DE +would tell PMake to look in the directories +.CW /sprite/lib/include +and +.CW /sprite/att/lib/include +for any files whose suffix is +.CW .h . +.LP +The current directory is always consulted first to see if a file +exists. Only if it cannot be found there are the directories in the +specific search path, followed by those in the general search path, +consulted. +.LP +A search path is also used when expanding wildcard characters. If the +pattern has a recognizable suffix on it, the path for that suffix will +be used for the expansion. Otherwise the default search path is employed. +.LP +When a file is found in some directory other than the current one, all +local variables that would have contained the target's name +.CW .ALLSRC , ( +and +.CW .IMPSRC ) +will instead contain the path to the file, as found by PMake. +Thus if you have a file +.CW ../lib/mumble.c +and a makefile +.DS +\&.PATH.c : ../lib +mumble : mumble.c + $(CC) -o $(.TARGET) $(.ALLSRC) +.DE +the command executed to create +.CW mumble +would be +.CW "cc -o mumble ../lib/mumble.c" .'' `` +(As an aside, the command in this case isn't strictly necessary, since +it will be found using transformation rules if it isn't given. This is because +.CW .out +is the null suffix by default and a transformation exists from +.CW .c +to +.CW .out . +Just thought I'd throw that in.) +.LP +If a file exists in two directories on the same search path, the file +in the first directory on the path will be the one PMake uses. So if +you have a large system spread over many directories, it would behoove +you to follow a naming convention that avoids such conflicts. +.LP +Something you should know about the way search paths are implemented +is that each directory is read, and its contents cached, exactly once +\&\*- when it is first encountered \*- so any changes to the +directories while PMake is running will not be noted when searching +for implicit sources, nor will they be found when PMake attempts to +discover when the file was last modified, unless the file was created in the +current directory. While people have suggested that PMake should read +the directories each time, my experience suggests that the caching seldom +causes problems. In addition, not caching the directories slows things +down enormously because of PMake's attempts to apply transformation +rules through non-existent files \*- the number of extra file-system +searches is truly staggering, especially if many files without +suffixes are used and the null suffix isn't changed from +.CW .out . +.xH 2 Archives and Libraries +.LP +.UX +and Sprite allow you to merge files into an archive using the +.CW ar +command. Further, if the files are relocatable object files, you can +run +.CW ranlib +on the archive and get yourself a library that you can link into any +program you want. The main problem with archives is they double the +space you need to store the archived files, since there's one copy in +the archive and one copy out by itself. The problem with libraries is +you usually think of them as +.CW -lm +rather than +.CW /usr/lib/libm.a +and the linker thinks they're out-of-date if you so much as look at +them. +.LP +PMake solves the problem with archives by allowing you to tell it to +examine the files in the archives (so you can remove the individual +files without having to regenerate them later). To handle the problem +with libraries, PMake adds an additional way of deciding if a library +is out-of-date: +.IP \(bu 2 +If the table of contents is older than the library, or is missing, the +library is out-of-date. +.LP +A library is any target that looks like +.CW \-l name'' `` +or that ends in a suffix that was marked as a library using the +.CW .LIBS +target. +.CW .a +is so marked in the system makefile. +.LP +Members of an archive are specified as +``\fIarchive\fP(\fImember\fP[ \fImember\fP...])''. +Thus +.CW libdix.a(window.o) '' ``' +specifies the file +.CW window.o +in the archive +.CW libdix.a . +You may also use wildcards to specify the members of the archive. Just +remember that most the wildcard characters will only find +.I existing +files. +.LP +A file that is a member of an archive is treated specially. If the +file doesn't exist, but it is in the archive, the modification time +recorded in the archive is used for the file when determining if the +file is out-of-date. When figuring out how to make an archived member target +(not the file itself, but the file in the archive \*- the +\fIarchive\fP(\fImember\fP) target), special care is +taken with the transformation rules, as follows: +.IP \(bu 2 +\&\fIarchive\fP(\fImember\fP) is made to depend on \fImember\fP. +.IP \(bu 2 +The transformation from the \fImember\fP's suffix to the +\fIarchive\fP's suffix is applied to the \fIarchive\fP(\fImember\fP) target. +.IP \(bu 2 +The \fIarchive\fP(\fImember\fP)'s +.CW .TARGET +variable is set to the name of the \fImember\fP if \fImember\fP is +actually a target, or the path to the member file if \fImember\fP is +only a source. +.IP \(bu 2 +The +.CW .ARCHIVE +variable for the \fIarchive\fP(\fImember\fP) target is set to the name +of the \fIarchive\fP. +.Ix 0 def variable local .ARCHIVE +.Ix 0 def .ARCHIVE +.IP \(bu 2 +The +.CW .MEMBER +variable is set to the actual string inside the parentheses. In most +cases, this will be the same as the +.CW .TARGET +variable. +.Ix 0 def variable local .MEMBER +.Ix 0 def .MEMBER +.IP \(bu 2 +The \fIarchive\fP(\fImember\fP)'s place in the local variables of the +targets that depend on it is taken by the value of its +.CW .TARGET +variable. +.LP +Thus, a program library could be created with the following makefile: +.DS +\&.o.a : + ... + rm -f $(.TARGET:T) +OBJS = obj1.o obj2.o obj3.o +libprog.a : libprog.a($(OBJS)) + ar cru $(.TARGET) $(.OODATE) + ranlib $(.TARGET) +.DE +This will cause the three object files to be compiled (if the +corresponding source files were modified after the object file or, if +that doesn't exist, the archived object file), the out-of-date ones +archived in +.CW libprog.a , +a table of contents placed in the archive and the newly-archived +object files to be removed. +.LP +All this is used in the +.CW makelib.mk +system makefile to create a single library with ease. This makefile +looks like this: +.DS +.SM +# +# Rules for making libraries. The object files that make up the library +# are removed once they are archived. +# +# To make several libraries in parallel, you should define the variable +# "many_libraries". This will serialize the invocations of ranlib. +# +# To use, do something like this: +# +# OBJECTS = +# +# fish.a: fish.a($(OBJECTS)) MAKELIB +# +# + +#ifndef _MAKELIB_MK +_MAKELIB_MK = + +#include + +\&.po.a .o.a : + ... + rm -f $(.MEMBER) + +ARFLAGS ?= crl + +# +# Re-archive the out-of-date members and recreate the library's table of +# contents using ranlib. If many_libraries is defined, put the ranlib +# off til the end so many libraries can be made at once. +# +MAKELIB : .USE .PRECIOUS + ar $(ARFLAGS) $(.TARGET) $(.OODATE) +#ifndef no_ranlib +# ifdef many_libraries + ... +# endif many_libraries + ranlib $(.TARGET) +#endif no_ranlib + +#endif _MAKELIB_MK +.DE +.xH 2 On the Condition... +.Rd 1 +.LP +Like the C compiler before it, PMake allows you to configure the makefile, +based on the current environment, using conditional statements. A +conditional looks like this: +.DS +#if \fIboolean expression\fP +\fIlines\fP +#elif \fIanother boolean expression\fP +\fImore lines\fP +#else +\fIstill more lines\fP +#endif +.DE +They may be nested to a maximum depth of 30 and may occur anywhere +(except in a comment, of course). The +.CW # '' `` +must the very first character on the line. +.LP +Each +.I "boolean expression" +is made up of terms that look like function calls, the standard C +boolean operators +.CW && , +.CW || , +and +.CW ! , +and the standard relational operators +.CW == , +.CW != , +.CW > , +.CW >= , +.CW < , +and +.CW <= , +with +.CW == +and +.CW != +being overloaded to allow string comparisons as well. +.CW && +represents logical AND; +.CW || +is logical OR and +.CW ! +is logical NOT. The arithmetic and string operators take precedence +over all three of these operators, while NOT takes precedence over +AND, which takes precedence over OR. This precedence may be +overridden with parentheses, and an expression may be parenthesized to +your heart's content. Each term looks like a call on one of four +functions: +.nr pw 9 +.Ix 0 def make +.Ix 0 def conditional make +.Ix 0 def if make +.IP make \n(pw +The syntax is +.CW make( \fItarget\fP\c +.CW ) +where +.I target +is a target in the makefile. This is true if the given target was +specified on the command line, or as the source for a +.CW .MAIN +target (note that the sources for +.CW .MAIN +are only used if no targets were given on the command line). +.IP defined \n(pw +.Ix 0 def defined +.Ix 0 def conditional defined +.Ix 0 def if defined +The syntax is +.CW defined( \fIvariable\fP\c +.CW ) +and is true if +.I variable +is defined. Certain variables are defined in the system makefile that +identify the system on which PMake is being run. +.IP exists \n(pw +.Ix 0 def exists +.Ix 0 def conditional exists +.Ix 0 def if exists +The syntax is +.CW exists( \fIfile\fP\c +.CW ) +and is true if the file can be found on the global search path (i.e. +that defined by +.CW .PATH +targets, not by +.CW .PATH \fIsuffix\fP +targets). +.IP empty \n(pw +.Ix 0 def empty +.Ix 0 def conditional empty +.Ix 0 def if empty +This syntax is much like the others, except the string inside the +parentheses is of the same form as you would put between parentheses +when expanding a variable, complete with modifiers and everything. The +function returns true if the resulting string is empty (NOTE: an undefined +variable in this context will cause at the very least a warning +message about a malformed conditional, and at the worst will cause the +process to stop once it has read the makefile. If you want to check +for a variable being defined or empty, use the expression +.CW !defined( \fIvar\fP\c `` +.CW ") || empty(" \fIvar\fP\c +.CW ) '' +as the definition of +.CW || +will prevent the +.CW empty() +from being evaluated and causing an error, if the variable is +undefined). This can be used to see if a variable contains a given +word, for example: +.DS +#if !empty(\fIvar\fP:M\fIword\fP) +.DE +.LP +The arithmetic and string operators may only be used to test the value +of a variable. The lefthand side must contain the variable expansion, +while the righthand side contains either a string, enclosed in +double-quotes, or a number. The standard C numeric conventions (except +for specifying an octal number) apply to both sides. E.g. +.DS +#if $(OS) == 4.3 + +#if $(MACHINE) == "sun3" + +#if $(LOAD_ADDR) < 0xc000 +.DE +are all valid conditionals. In addition, the numeric value of a +variable can be tested as a boolean as follows: +.DS +#if $(LOAD) +.DE +would see if +.CW LOAD +contains a non-zero value and +.DS +#if !$(LOAD) +.DE +would test if +.CW LOAD +contains a zero value. +.LP +In addition to the bare +.CW #if ,'' `` +there are other forms that apply one of the first two functions to each +term. They are as follows: +.DS + ifdef \fRdefined\fP + ifndef \fR!defined\fP + ifmake \fRmake\fP + ifnmake \fR!make\fP +.DE +There are also the ``else if'' forms: +.CW elif , +.CW elifdef , +.CW elifndef , +.CW elifmake , +and +.CW elifnmake . +.LP +For instance, if you wish to create two versions of a program, one of which +is optimized (the production version) and the other of which is for debugging +(has symbols for dbx), you have two choices: you can create two +makefiles, one of which uses the +.CW \-g +flag for the compilation, while the other uses the +.CW \-O +flag, or you can use another target (call it +.CW debug ) +to create the debug version. The construct below will take care of +this for you. I have also made it so defining the variable +.CW DEBUG +(say with +.CW "pmake -D DEBUG" ) +will also cause the debug version to be made. +.DS +#if defined(DEBUG) || make(debug) +CFLAGS += -g +#else +CFLAGS += -O +#endif +.DE +There are, of course, problems with this approach. The most glaring +annoyance is that if you want to go from making a debug version to +making a production version, you have to remove all the object files, +or you will get some optimized and some debug versions in the same +program. Another annoyance is you have to be careful not to make two +targets that ``conflict'' because of some conditionals in the +makefile. For instance +.DS +#if make(print) +FORMATTER = ditroff -Plaser_printer +#endif +#if make(draft) +FORMATTER = nroff -Pdot_matrix_printer +#endif +.DE +would wreak havoc if you tried +.CW "pmake draft print" '' `` +since you would use the same formatter for each target. As I said, +this all gets somewhat complicated. +.xH 2 A Shell is a Shell is a Shell +.Rd 7 +.LP +In normal operation, the Bourne Shell (better known as +.CW sh '') `` +is used to execute the commands to re-create targets. PMake also allows you +to specify a different shell for it to use when executing these +commands. There are several things PMake must know about the shell you +wish to use. These things are specified as the sources for the +.CW .SHELL +.Ix 0 ref .SHELL +.Ix 0 ref target .SHELL +target by keyword, as follows: +.IP "\fBpath=\fP\fIpath\fP" +PMake needs to know where the shell actually resides, so it can +execute it. If you specify this and nothing else, PMake will use the +last component of the path and look in its table of the shells it +knows and use the specification it finds, if any. Use this if you just +want to use a different version of the Bourne or C Shell (yes, PMake knows +how to use the C Shell too). +.IP "\fBname=\fP\fIname\fP" +This is the name by which the shell is to be known. It is a single +word and, if no other keywords are specified (other than +.B path ), +it is the name by which PMake attempts to find a specification for +it (as mentioned above). You can use this if you would just rather use +the C Shell than the Bourne Shell +.CW ".SHELL: name=csh" '' (`` +will do it). +.IP "\fBquiet=\fP\fIecho-off command\fP" +As mentioned before, PMake actually controls whether commands are +printed by introducing commands into the shell's input stream. This +keyword, and the next two, control what those commands are. The +.B quiet +keyword is the command used to turn echoing off. Once it is turned +off, echoing is expected to remain off until the echo-on command is given. +.IP "\fBecho=\fP\fIecho-on command\fP" +The command PMake should give to turn echoing back on again. +.IP "\fBfilter=\fP\fIprinted echo-off command\fP" +Many shells will echo the echo-off command when it is given. This +keyword tells PMake in what format the shell actually prints the +echo-off command. Wherever PMake sees this string in the shell's +output, it will delete it and any following whitespace, up to and +including the next newline. See the example at the end of this section +for more details. +.IP "\fBechoFlag=\fP\fIflag to turn echoing on\fP" +Unless a target has been marked +.CW .SILENT , +PMake wants to start the shell running with echoing on. To do this, it +passes this flag to the shell as one of its arguments. If either this +or the next flag begins with a `\-', the flags will be passed to the +shell as separate arguments. Otherwise, the two will be concatenated +(if they are used at the same time, of course). +.IP "\fBerrFlag=\fP\fIflag to turn error checking on\fP" +Likewise, unless a target is marked +.CW .IGNORE , +PMake wishes error-checking to be on from the very start. To this end, +it will pass this flag to the shell as an argument. The same rules for +an initial `\-' apply as for the +.B echoFlag . +.IP "\fBcheck=\fP\fIcommand to turn error checking on\fP" +Just as for echo-control, error-control is achieved by inserting +commands into the shell's input stream. This is the command to make +the shell check for errors. It also serves another purpose if the +shell doesn't have error-control as commands, but I'll get into that +in a minute. Again, once error checking has been turned on, it is +expected to remain on until it is turned off again. +.IP "\fBignore=\fP\fIcommand to turn error checking off\fP" +This is the command PMake uses to turn error checking off. It has +another use if the shell doesn't do error-control, but I'll tell you +about that.\|.\|.\|now. +.IP "\fBhasErrCtl=\fP\fIyes or no\fP" +This takes a value that is either +.B yes +or +.B no . +Now you might think that the existence of the +.B check +and +.B ignore +keywords would be enough to tell PMake if the shell can do +error-control, but you'd be wrong. If +.B hasErrCtl +is +.B yes , +PMake uses the check and ignore commands in a straight-forward manner. +If this is +.B no , +however, their use is rather different. In this case, the check +command is used as a template, in which the string +.B %s +is replaced by the command that's about to be executed, to produce a +command for the shell that will echo the command to be executed. The +ignore command is also used as a template, again with +.B %s +replaced by the command to be executed, to produce a command that will +execute the command to be executed and ignore any error it returns. +When these strings are used as templates, you must provide newline(s) +.CW \en '') (`` +in the appropriate place(s). +.LP +The strings that follow these keywords may be enclosed in single or +double quotes (the quotes will be stripped off) and may contain the +usual C backslash-characters (\en is newline, \er is return, \eb is +backspace, \e' escapes a single-quote inside single-quotes, \e" +escapes a double-quote inside double-quotes). Now for an example. +.LP +This is actually the contents of the +.CW +system makefile, and causes PMake to use the Bourne Shell in such a +way that each command is printed as it is executed. That is, if more +than one command is given on a line, each will be printed separately. +Similarly, each time the body of a loop is executed, the commands +within that loop will be printed, etc. The specification runs like +this: +.DS +# +# This is a shell specification to have the Bourne shell echo +# the commands just before executing them, rather than when it reads +# them. Useful if you want to see how variables are being expanded, etc. +# +\&.SHELL : path=/bin/sh \e + quiet="set -" \e + echo="set -x" \e + filter="+ set - " \e + echoFlag=x \e + errFlag=e \e + hasErrCtl=yes \e + check="set -e" \e + ignore="set +e" +.DE +.LP +It tells PMake the following: +.Bp +The shell is located in the file +.CW /bin/sh . +It need not tell PMake that the name of the shell is +.CW sh +as PMake can figure that out for itself (it's the last component of +the path). +.Bp +The command to stop echoing is +.CW "set -" . +.Bp +The command to start echoing is +.CW "set -x" . +.Bp +When the echo off command is executed, the shell will print +.CW "+ set - " +(The `+' comes from using the +.CW \-x +flag (rather than the +.CW \-v +flag PMake usually uses)). PMake will remove all occurrences of this +string from the output, so you don't notice extra commands you didn't +put there. +.Bp +The flag the Bourne Shell will take to start echoing in this way is +the +.CW \-x +flag. The Bourne Shell will only take its flag arguments concatenated +as its first argument, so neither this nor the +.B errFlag +specification begins with a \-. +.Bp +The flag to use to turn error-checking on from the start is +.CW \-e . +.Bp +The shell can turn error-checking on and off, and the commands to do +so are +.CW "set +e" +and +.CW "set -e" , +respectively. +.LP +I should note that this specification is for Bourne Shells that are +not part of Berkeley +.UX , +as shells from Berkeley don't do error control. You can get a similar +effect, however, by changing the last three lines to be: +.DS + hasErrCtl=no \e + check="echo \e"+ %s\e"\en" \e + ignore="sh -c '%s || exit 0\en" +.DE +.LP +This will cause PMake to execute the two commands +.DS +echo "+ \fIcmd\fP" +sh -c '\fIcmd\fP || true' +.DE +for each command for which errors are to be ignored. (In case you are +wondering, the thing for +.CW ignore +tells the shell to execute another shell without error checking on and +always exit 0, since the +.B || +causes the +.CW "exit 0" +to be executed only if the first command exited non-zero, and if the +first command exited zero, the shell will also exit zero, since that's +the last command it executed). +.xH 2 Compatibility +.Ix 0 ref compatibility +.LP +There are three (well, 3 \(12) levels of backwards-compatibility built +into PMake. Most makefiles will need none at all. Some may need a +little bit of work to operate correctly when run in parallel. Each +level encompasses the previous levels (e.g. +.B \-B +(one shell per command) implies +.B \-V ) +The three levels are described in the following three sections. +.xH 3 DEFCON 3 \*- Variable Expansion +.Ix 0 ref compatibility +.LP +As noted before, PMake will not expand a variable unless it knows of a +value for it. This can cause problems for makefiles that expect to +leave variables undefined except in special circumstances (e.g. if +more flags need to be passed to the C compiler or the output from a +text processor should be sent to a different printer). If the +variables are enclosed in curly braces +.CW ${PRINTER} ''), (`` +the shell will let them pass. If they are enclosed in parentheses, +however, the shell will declare a syntax error and the make will come +to a grinding halt. +.LP +You have two choices: change the makefile to define the variables +(their values can be overridden on the command line, since that's +where they would have been set if you used Make, anyway) or always give the +.B \-V +flag (this can be done with the +.CW .MAKEFLAGS +target, if you want). +.xH 3 DEFCON 2 \*- The Number of the Beast +.Ix 0 ref compatibility +.LP +Then there are the makefiles that expect certain commands, such as +changing to a different directory, to not affect other commands in a +target's creation script. You can solve this is either by going +back to executing one shell per command (which is what the +.B \-B +flag forces PMake to do), which slows the process down a good bit and +requires you to use semicolons and escaped newlines for shell constructs, or +by changing the makefile to execute the offending command(s) in a subshell +(by placing the line inside parentheses), like so: +.DS +install :: .MAKE + (cd src; $(.PMAKE) install) + (cd lib; $(.PMAKE) install) + (cd man; $(.PMAKE) install) +.DE +.Ix 0 ref operator double-colon +.Ix 0 ref variable global .PMAKE +.Ix 0 ref .PMAKE +.Ix 0 ref .MAKE +.Ix 0 ref attribute .MAKE +This will always execute the three makes (even if the +.B \-n +flag was given) because of the combination of the ``::'' operator and +the +.CW .MAKE +attribute. Each command will change to the proper directory to perform +the install, leaving the main shell in the directory in which it started. +.xH 3 "DEFCON 1 \*- Imitation is the Not the Highest Form of Flattery" +.Ix 0 ref compatibility +.LP +The final category of makefile is the one where every command requires +input, the dependencies are incompletely specified, or you simply +cannot create more than one target at a time, as mentioned earlier. In +addition, you may not have the time or desire to upgrade the makefile +to run smoothly with PMake. If you are the conservative sort, this is +the compatibility mode for you. It is entered either by giving PMake +the +.B \-M +flag (for Make), or by executing PMake as +.CW make .'' `` +In either case, PMake performs things exactly like Make (while still +supporting most of the nice new features PMake provides). This +includes: +.IP \(bu 2 +No parallel execution. +.IP \(bu 2 +Targets are made in the exact order specified by the makefile. The +sources for each target are made in strict left-to-right order, etc. +.IP \(bu 2 +A single Bourne shell is used to execute each command, thus the +shell's +.CW $$ +variable is useless, changing directories doesn't work across command +lines, etc. +.IP \(bu 2 +If no special characters exist in a command line, PMake will break the +command into words itself and execute the command directly, without +executing a shell first. The characters that cause PMake to execute a +shell are: +.CW # , +.CW = , +.CW | , +.CW ^ , +.CW ( , +.CW ) , +.CW { , +.CW } , +.CW ; , +.CW & , +.CW < , +.CW > , +.CW * , +.CW ? , +.CW [ , +.CW ] , +.CW : , +.CW $ , +.CW ` , +and +.CW \e . +You should notice that these are all the characters that are given +special meaning by the shell (except +.CW ' +and +.CW " , +which PMake deals with all by its lonesome). +.IP \(bu 2 +The use of the null suffix is turned off. +.Ix 0 ref "null suffix" +.Ix 0 ref suffix null +.xH 2 The Way Things Work +.LP +When PMake reads the makefile, it parses sources and targets into +nodes in a graph. The graph is directed only in the sense that PMake +knows which way is up. Each node contains not only links to all its +parents and children (the nodes that depend on it and those on which +it depends, respectively), but also a count of the number of its +children that have already been processed. +.LP +The most important thing to know about how PMake uses this graph is +that the traversal is breadth-first and occurs in two passes. +.LP +After PMake has parsed the makefile, it begins with the nodes the user +has told it to make (either on the command line, or via a +.CW .MAIN +target, or by the target being the first in the file not labeled with +the +.CW .NOTMAIN +attribute) placed in a queue. It continues to take the node off the +front of the queue, mark it as something that needs to be made, pass +the node to +.CW Suff_FindDeps +(mentioned earlier) to find any implicit sources for the node, and +place all the node's children that have yet to be marked at the end of +the queue. If any of the children is a +.CW .USE +rule, its attributes are applied to the parent, then its commands are +appended to the parent's list of commands and its children are linked +to its parent. The parent's unmade children counter is then decremented +(since the +.CW .USE +node has been processed). You will note that this allows a +.CW .USE +node to have children that are +.CW .USE +nodes and the rules will be applied in sequence. +If the node has no children, it is placed at the end of +another queue to be examined in the second pass. This process +continues until the first queue is empty. +.LP +At this point, all the leaves of the graph are in the examination +queue. PMake removes the node at the head of the queue and sees if it +is out-of-date. If it is, it is passed to a function that will execute +the commands for the node asynchronously. When the commands have +completed, all the node's parents have their unmade children counter +decremented and, if the counter is then 0, they are placed on the +examination queue. Likewise, if the node is up-to-date. Only those +parents that were marked on the downward pass are processed in this +way. Thus PMake traverses the graph back up to the nodes the user +instructed it to create. When the examination queue is empty and no +shells are running to create a target, PMake is finished. +.LP +Once all targets have been processed, PMake executes the commands +attached to the +.CW .END +target, either explicitly or through the use of an ellipsis in a shell +script. If there were no errors during the entire process but there +are still some targets unmade (PMake keeps a running count of how many +targets are left to be made), there is a cycle in the graph. PMake does +a depth-first traversal of the graph to find all the targets that +weren't made and prints them out one by one. +.xH 1 Answers to Exercises +.IP (3.1) +This is something of a trick question, for which I apologize. The +trick comes from the UNIX definition of a suffix, which PMake doesn't +necessarily share. You will have noticed that all the suffixes used in +this tutorial (and in UNIX in general) begin with a period +.CW .ms , ( +.CW .c , +etc.). Now, PMake's idea of a suffix is more like English's: it's the +characters at the end of a word. With this in mind, one possible +.Ix 0 def suffix +solution to this problem goes as follows: +.DS I +\&.SUFFIXES : ec.exe .exe ec.obj .obj .asm +ec.objec.exe .obj.exe : + link -o $(.TARGET) $(.IMPSRC) +\&.asmec.obj : + asm -o $(.TARGET) -DDO_ERROR_CHECKING $(.IMPSRC) +\&.asm.obj : + asm -o $(.TARGET) $(.IMPSRC) +.DE +.IP (3.2) +The trick to this one lies in the ``:='' variable-assignment operator +and the ``:S'' variable-expansion modifier. +.Ix 0 ref variable assignment expanded +.Ix 0 ref variable expansion modified +.Ix 0 ref modifier substitute +.Ix 0 ref :S +.Ix 0 ref := +Basically what you want is to take the pointer variable, so to speak, +and transform it into an invocation of the variable at which it +points. You might try something like +.DS I +$(PTR:S/^/\e$(/:S/$/)) +.DE +which places +.CW $( '' `` +at the front of the variable name and +.CW ) '' `` +at the end, thus transforming +.CW VAR ,'' `` +for example, into +.CW $(VAR) ,'' `` +which is just what we want. Unfortunately (as you know if you've tried +it), since, as it says in the hint, PMake does no further substitution +on the result of a modified expansion, that's \fIall\fP you get. The +solution is to make use of ``:='' to place that string into yet +another variable, then invoke the other variable directly: +.DS I +*PTR := $(PTR:S/^/\e$(/:S/$/)/) +.DE +You can then use +.CW $(*PTR) '' `` +to your heart's content. +.de Gp +.XP +\&\fB\\$1:\fP +.. +.xH 1 Glossary of Jargon +.Gp "attribute" +A property given to a target that causes PMake to treat it differently. +.Gp "command script" +The lines immediately following a dependency line that specify +commands to execute to create each of the targets on the dependency +line. Each line in the command script must begin with a tab. +.Gp "command-line variable" +A variable defined in an argument when PMake is first executed. +Overrides all assignments to the same variable name in the makefile. +.Gp "conditional" +A construct much like that used in C that allows a makefile to be +configured on the fly based on the local environment, or on what is being +made by that invocation of PMake. +.Gp "creation script" +Commands used to create a target. See ``command script.'' +.Gp "dependency" +The relationship between a source and a target. This comes in three +flavors, as indicated by the operator between the target and the +source. `:' gives a straight time-wise dependency (if the target is +older than the source, the target is out-of-date), while `!' provides +simply an ordering and always considers the target out-of-date. `::' +is much like `:', save it creates multiple instances of a target each +of which depends on its own list of sources. +.Gp "dynamic source" +This refers to a source that has a local variable invocation in it. It +allows a single dependency line to specify a different source for each +target on the line. +.Gp "global variable" +Any variable defined in a makefile. Takes precedence over variables +defined in the environment, but not over command-line or local variables. +.Gp "input graph" +What PMake constructs from a makefile. Consists of nodes made of the +targets in the makefile, and the links between them (the +dependencies). The links are directed (from source to target) and +there may not be any cycles (loops) in the graph. +.Gp "local variable" +A variable defined by PMake visible only in a target's shell script. +There are seven local variables, not all of which are defined for +every target: +.CW .TARGET , +.CW .ALLSRC , +.CW .OODATE , +.CW .PREFIX , +.CW .IMPSRC , +.CW .ARCHIVE , +and +.CW .MEMBER . +.CW .TARGET , +.CW .PREFIX , +.CW .ARCHIVE , +and +.CW .MEMBER +may be used on dependency lines to create ``dynamic sources.'' +.Gp "makefile" +A file that describes how a system is built. If you don't know what it +is after reading this tutorial.\|.\|.\|. +.Gp "modifier" +A letter, following a colon, used to alter how a variable is expanded. +It has no effect on the variable itself. +.Gp "operator" +What separates a source from a target (on a dependency line) and specifies +the relationship between the two. There are three: +.CW : ', ` +.CW :: ', ` +and +.CW ! '. ` +.Gp "search path" +A list of directories in which a file should be sought. PMake's view +of the contents of directories in a search path does not change once +the makefile has been read. A file is sought on a search path only if +it is exclusively a source. +.Gp "shell" +A program to which commands are passed in order to create targets. +.Gp "source" +Anything to the right of an operator on a dependency line. Targets on +the dependency line are usually created from the sources. +.Gp "special target" +A target that causes PMake to do special things when it's encountered. +.Gp "suffix" +The tail end of a file name. Usually begins with a period, +.CW .c +or +.CW .ms , +e.g. +.Gp "target" +A word to the left of the operator on a dependency line. More +generally, any file that PMake might create. A file may be (and often +is) both a target and a source (what it is depends on how PMake is +looking at it at the time \*- sort of like the wave/particle duality +of light, you know). +.Gp "transformation rule" +A special construct in a makefile that specifies how to create a file +of one type from a file of another, as indicated by their suffixes. +.Gp "variable expansion" +The process of substituting the value of a variable for a reference to +it. Expansion may be altered by means of modifiers. +.Gp "variable" +A place in which to store text that may be retrieved later. Also used +to define the local environment. Conditionals exist that test whether +a variable is defined or not. +.bp +.\" Output table of contents last, with an entry for the index, making +.\" sure to save and restore the last real page number for the index... +.nr @n \n(PN+1 +.\" We are not generating an index +.\" .XS \n(@n +.\" Index +.\" .XE +.nr %% \n% +.PX +.nr % \n(%% diff --git a/share/doc/psd/18.gprof/Makefile b/share/doc/psd/18.gprof/Makefile index 1097072..2a5bed1 100644 --- a/share/doc/psd/18.gprof/Makefile +++ b/share/doc/psd/18.gprof/Makefile @@ -10,6 +10,5 @@ USE_SOELIM= USE_PIC= USE_TBL= USE_EQN= -SRCDIR= ${.CURDIR}/../../../../usr.bin/gprof/PSD.doc .include diff --git a/share/doc/psd/18.gprof/abstract.me b/share/doc/psd/18.gprof/abstract.me new file mode 100644 index 0000000..28e8066 --- /dev/null +++ b/share/doc/psd/18.gprof/abstract.me @@ -0,0 +1,66 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)abstract.me 8.1 (Berkeley) 6/8/93 +.\" +.sp 1 +\fB\s+2gprof: a Call Graph Execution Profiler\s-2\fP\** +.(f +\**This work was supported by grant MCS80-05144 +from the National Science Foundation. +.)f +.sp 1 +by +\fISusan L. Graham\fP +\fIPeter B. Kessler\fP +\fIMarshall K. McKusick\fP +.sp 1 +Computer Science Division +Electrical Engineering and Computer Science Department +University of California, Berkeley +Berkeley, California 94720 +.ce 0 +.sp 1 +.sp 0.5i +.sh 0 "Abstract" +.pp +Large complex programs are composed of many small routines +that implement abstractions for the routines that call them. +To be useful, an execution profiler must attribute +execution time in a way that is significant for the +logical structure of a program +as well as for its textual decomposition. +This data must then be displayed to the user +in a convenient and informative way. +The \fBgprof\fP profiler +accounts for the running time of called routines +in the running time of the routines that call them. +The design and use of this profiler is described. diff --git a/share/doc/psd/18.gprof/gathering.me b/share/doc/psd/18.gprof/gathering.me new file mode 100644 index 0000000..17130c3 --- /dev/null +++ b/share/doc/psd/18.gprof/gathering.me @@ -0,0 +1,231 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)gathering.me 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "Gathering Profile Data" +.pp +Routine calls or statement executions can be measured by having a +compiler augment the code at strategic points. +The additions can be inline increments to counters [Knuth71] +[Satterthwaite72] [Joy79] or calls to +monitoring routines [Unix]. +The counter increment overhead is low, and is suitable for +profiling statements. +A call of the monitoring routine has an overhead comparable with a +call of a regular routine, and is therefore only suited +to profiling on a routine by routine basis. +However, the monitoring routine solution has certain advantages. +Whatever counters are needed by the monitoring routine can be +managed by the monitoring routine itself, rather than being +distributed around the code. +In particular, a monitoring routine can easily be called from separately +compiled programs. +In addition, different monitoring routines can be linked into the +program +being measured +to assemble different profiling data without having to +change the compiler or recompile the program. +We have exploited this approach; +our compilers for C, Fortran77, and Pascal can insert calls to a +monitoring routine in the prologue for each routine. +Use of the monitoring routine requires no planning on part of a +programmer other than to request that augmented routine +prologues be produced during compilation. +.pp +We are interested in gathering three pieces of information during +program execution: call counts and execution times for +each profiled routine, and the arcs of the dynamic call graph +traversed by this execution of the program. +By post-processing of this data we can build the dynamic call +graph for this execution of the program and propagate times along +the edges of this graph to attribute times for routines to the +routines that invoke them. +.pp +Gathering of the profiling information should not greatly +interfere with the running of the program. +Thus, the monitoring routine must not produce trace output each +time it is invoked. +The volume of data thus produced would be unmanageably large, +and the time required to record it would overwhelm the running +time of most programs. +Similarly, the monitoring routine can not do the analysis of +the profiling data (e.g. assembling the call graph, propagating +times around it, discovering cycles, etc.) during program +execution. +Our solution is to gather profiling data in memory during program +execution and to condense it to a file as the profiled +program exits. +This file is then processed by a separate program to produce the +listing of the profile data. +An advantage of this approach is that the profile data for +several executions of a program can be combined by the +post-processing to provide a profile of many +executions. +.pp +The execution time monitoring consists of three parts. +The first part allocates and initializes the runtime monitoring data +structures before the program begins execution. +The second part is the monitoring routine invoked from the +prologue of each profiled routine. +The third part condenses the data structures and writes them +to a file as the program terminates. +The monitoring routine is discussed in detail in the following sections. +.sh 2 "Execution Counts" +.pp +The \fBgprof\fP monitoring routine counts the number of times +each profiled routine is called. +The monitoring routine also records the arc in the call graph +that activated the profiled routine. +The count is associated with the arc in the call graph +rather than with the routine. +Call counts for routines can then be determined by summing the counts +on arcs directed into that routine. +In a machine-dependent fashion, the monitoring routine notes its +own return address. +This address is in the prologue of some profiled routine that is +the destination of an arc in the dynamic call graph. +The monitoring routine also discovers the return address for that +routine, thus identifying the call site, or source of the arc. +The source of the arc is in the \fIcaller\fP, and the destination is in +the \fIcallee\fP. +For example, if a routine A calls a routine B, A is the caller, +and B is the callee. +The prologue of B will include a call to the monitoring routine +that will note the arc from A to B and either initialize or +increment a counter for that arc. +.pp +One can not afford to have the monitoring routine output tracing +information as each arc is identified. +Therefore, the monitoring routine maintains a table of all the +arcs discovered, with counts of the numbers of times each is +traversed during execution. +This table is accessed once per routine call. +Access to it +must be as fast as possible so as not to overwhelm the time +required to execute the program. +.pp +Our solution is to access the table through a hash table. +We use the call site as the primary key with the callee +address being the secondary key. +Since each call site typically calls only one callee, we can +reduce (usually to one) the number of minor lookups based on the callee. +Another alternative would use the callee as the primary key and the +call site as the secondary key. +Such an organization has the advantage of associating callers with +callees, at the expense of longer lookups in the monitoring +routine. +We are fortunate to be running in a virtual memory environment, +and (for the sake of speed) were able to allocate enough space +for the primary hash table to allow a one-to-one mapping from +call site addresses to the primary hash table. +Thus our hash function is trivial to calculate and collisions +occur only for call sites that call multiple +destinations (e.g. functional parameters and functional variables). +A one level hash function using both call site and callee would +result in an unreasonably large hash table. +Further, the number of dynamic call sites and callees is not known during +execution of the profiled program. +.pp +Not all callers and callees can be identified by the monitoring +routine. +Routines that were compiled without the profiling augmentations +will not call the monitoring routine as part of their prologue, +and thus no arcs will be recorded whose destinations are in these +routines. +One need not profile all the routines in a program. +Routines that are not profiled run at full speed. +Certain routines, notably exception handlers, are invoked by +non-standard calling sequences. +Thus the monitoring routine may know the destination of an arc +(the callee), +but find it difficult or +impossible to determine the source of the arc (the caller). +Often in these cases the apparent source of the arc is not a call +site at all. +Such anomalous invocations are declared ``spontaneous''. +.sh 2 "Execution Times" +.pp +The execution times for routines can be gathered in at least two +ways. +One method measures the execution time of a routine by measuring +the elapsed time from routine entry to routine exit. +Unfortunately, time measurement is complicated on time-sharing +systems by the time-slicing of the program. +A second method samples the value of the program counter at some +interval, and infers execution time from the distribution of the +samples within the program. +This technique is particularly suited to time-sharing systems, +where the time-slicing can serve as the basis for sampling +the program counter. +Notice that, whereas the first method could provide exact timings, +the second is inherently a statistical approximation. +.pp +The sampling method need not require support from the operating +system: all that is needed is the ability to set and respond to +``alarm clock'' interrupts that run relative to program time. +It is imperative that the intervals be uniform since the +sampling of the program counter rather than the duration of the +interval is the basis of the distribution. +If sampling is done too often, the interruptions to sample the +program counter will overwhelm the running of the profiled program. +On the other hand, the program must run for enough sampled +intervals that the distribution of the samples accurately +represents the distribution of time for the execution of the +program. +As with routine call tracing, the monitoring routine can not +afford to output information for each program counter +sample. +In our computing environment, the operating system can provide a +histogram of the location of the program counter at the end of +each clock tick (1/60th of a second) in which a program runs. +The histogram is assembled in memory as the program runs. +This facility is enabled by our monitoring routine. +We have adjusted the granularity of the histogram so that +program counter values map one-to-one onto the histogram. +We make the simplifying assumption that all calls to a specific +routine require the same amount of time to execute. +This assumption may disguise that some calls +(or worse, some call sites) always invoke a routine +such that its execution is faster (or slower) +than the average time for that routine. +.pp +When the profiled program terminates, +the arc table and the histogram of +program counter samples is written to a file. +The arc table is condensed to consist of the source and destination +addresses of the arc and the count of the number of times the arc +was traversed by this execution of the program. +The recorded histogram consists of counters of the number of +times the program counter was found to be in each of the ranges covered +by the histogram. +The ranges themselves are summarized as a +lower and upper bound and a step size. diff --git a/share/doc/psd/18.gprof/header.me b/share/doc/psd/18.gprof/header.me new file mode 100644 index 0000000..aef606d --- /dev/null +++ b/share/doc/psd/18.gprof/header.me @@ -0,0 +1,38 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)header.me 8.1 (Berkeley) 8/14/93 +.\" +.\"he 'gprof''Graham, Kessler, McKusick' +.\"fo 'Draft of \*(td''%' +.\"ls 2 +.eh 'PSD:18-%''gprof \*- a Call Graph Execution Profiler' +.oh 'gprof \*- A Call Graph Execution Profiler''PSD:18-%' diff --git a/share/doc/psd/18.gprof/intro.me b/share/doc/psd/18.gprof/intro.me new file mode 100644 index 0000000..3a872b2 --- /dev/null +++ b/share/doc/psd/18.gprof/intro.me @@ -0,0 +1,81 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)intro.me 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "Programs to be Profiled" +.pp +Software research environments +normally include many large programs +both for production use and for experimental investigation. +These programs are typically modular, +in accordance with generally accepted principles +of good program design. +Often they consist of numerous small routines +that implement various abstractions. +Sometimes such large programs are written +by one programmer +who has understood the requirements for +these abstractions, and has programmed them +appropriately. +More frequently the program has +had multiple authors and has +evolved over time, changing the demands placed +on the implementation of the abstractions without +changing the implementation itself. +Finally, the program may be assembled from a library +of abstraction implementations +unexamined by the programmer. +.pp +Once a large program is executable, +it is often desirable to increase its speed, +especially if small portions of the program +are found to dominate its execution time. +The purpose of the \fBgprof\fP profiling tool is to +help the user evaluate alternative implementations +of abstractions. +We developed this tool in response to our efforts +to improve a code generator we were writing [Graham82]. +.pp +The \fBgprof\fP design takes advantage of the fact that the programs +to be measured are large, structured and hierarchical. +We provide a profile in which the execution time +for a set of routines that implement an +abstraction is collected and charged +to that abstraction. +The profile can be used to compare and assess the costs of +various implementations. +.pp +The profiler can be linked into a program without +special planning by the programmer. +The overhead for using \fBgprof\fP is low; +both in terms of added execution time and in the +volume of profiling information recorded. diff --git a/share/doc/psd/18.gprof/postp.me b/share/doc/psd/18.gprof/postp.me new file mode 100644 index 0000000..d71fefb --- /dev/null +++ b/share/doc/psd/18.gprof/postp.me @@ -0,0 +1,190 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)postp.me 8.1 (Berkeley) 6/8/93 +.\" +.EQ +delim $$ +gsize 11 +.EN +.sh 1 "Post Processing" +.pp +Having gathered the arcs of the call graph and timing information +for an execution of the program, +we are interested in attributing the time for each routine to the +routines that call it. +We build a dynamic call graph with arcs from caller to callee, +and propagate time from descendants to ancestors +by topologically sorting the call graph. +Time propagation is performed from the leaves of the +call graph toward the roots, according to the order +assigned by a topological numbering algorithm. +The topological numbering ensures that +all edges in the graph go from higher numbered nodes to lower +numbered nodes. +An example is given in Figure 1. +If we propagate time from nodes in the +order assigned by the algorithm, +execution time can be propagated from descendants to ancestors +after a single traversal of each arc in the call graph. +Each parent receives some fraction of a child's time. +Thus time is charged to the +caller in addition to being charged to the callee. +.(z +.so postp1.pic +.ce 2 +Topological ordering +Figure 1. +.ce 0 +.)z +.pp +Let $C sub e$ be the number of calls to some routine, +$e$, and $C sub e sup r$ be the number of +calls from a caller $r$ to a callee $e$. +Since we are assuming each call to a routine takes the +average amount of time for all calls to that routine, +the caller is accountable for +$C sub e sup r / C sub e$ +of the time spent by the callee. +Let the $S sub e$ be the $selftime$ of a routine, $e$. +The selftime of a routine can be determined from the +timing information gathered during profiled program execution. +The total time, $T sub r$, we wish to account to a routine +$r$, is then given by the recurrence equation: +.EQ +T sub r ~ = ~ {S sub r} ~ + ~ + sum from {r ~ roman CALLS ~ e} + {T sub e times {{C sub e sup r} over {C sub e}}} +.EN +where $r ~ roman CALLS ~ e$ is a relation showing all routines +$e$ called by a routine $r$. +This relation is easily available from the call graph. +.pp +However, if the execution contains recursive calls, +the call graph has cycles that +cannot be topologically sorted. +In these cases, we discover strongly-connected +components in the call graph, +treat each such component as a single node, +and then sort the resulting graph. +We use a variation of Tarjan's strongly-connected +components algorithm +that discovers strongly-connected components as it is assigning +topological order numbers [Tarjan72]. +.pp +Time propagation within strongly connected +components is a problem. +For example, a self-recursive routine +(a trivial cycle in the call graph) +is accountable for all the time it +uses in all its recursive instantiations. +In our scheme, this time should be +shared among its call graph parents. +The arcs from a routine to itself are of interest, +but do not participate in time propagation. +Thus the simple equation for time propagation +does not work within strongly connected components. +Time is not propagated from one member of a cycle to another, +since, by definition, this involves propagating time from a routine +to itself. +In addition, children of one member of a cycle +must be considered children of all members of the cycle. +Similarly, parents of one member of the cycle must inherit +all members of the cycle as descendants. +It is for these reasons that we collapse connected components. +Our solution collects all members of a cycle together, +summing the time and call counts for all members. +All calls into the cycle are made to share the total +time of the cycle, and all descendants of the cycle +propagate time into the cycle as a whole. +Calls among the members of the cycle +do not propagate any time, +though they are listed in the call graph profile. +.pp +Figure 2 shows a modified version of the call graph of Figure 1, +in which the nodes labelled 3 and 7 in Figure 1 are mutually +recursive. +The topologically sorted graph after the cycle is collapsed is +given in Figure 3. +.(z +.so postp2.pic +.ce 2 +Cycle to be collapsed. +Figure 2. +.ce 0 +.)z +.(z +.so postp3.pic +.ce 2 +Topological numbering after cycle collapsing. +Figure 3. +.ce 0 +.)z +.pp +Since the technique described above only collects the +dynamic call graph, +and the program typically does not call every routine +on each execution, +different executions can introduce different cycles in the +dynamic call graph. +Since cycles often have a significant effect on time propagation, +it is desirable to incorporate the static call graph so that cycles +will have the same members regardless of how the program runs. +.pp +The static call graph can be constructed from the source text +of the program. +However, discovering the static call graph from the source text +would require two moderately difficult steps: +finding the source text for the program +(which may not be available), +and scanning and parsing that text, +which may be in any one of several languages. +.pp +In our programming system, +the static calling information is also contained in the +executable version of the program, +which we already have available, +and which is in language-independent form. +One can examine the instructions +in the object program, +looking for calls to routines, and note which +routines can be called. +This technique allows us to add arcs to those already in the +dynamic call graph. +If a statically discovered arc already exists in the dynamic call +graph, no action is required. +Statically discovered arcs that do not exist in the dynamic call +graph are added to the graph with a traversal count of zero. +Thus they are never responsible for any time propagation. +However, they may affect the structure of the graph. +Since they may complete strongly connected components, +the static call graph construction is +done before topological ordering. diff --git a/share/doc/psd/18.gprof/postp1.pic b/share/doc/psd/18.gprof/postp1.pic new file mode 100644 index 0000000..1446092 --- /dev/null +++ b/share/doc/psd/18.gprof/postp1.pic @@ -0,0 +1,54 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)postp1.pic 8.1 (Berkeley) 6/8/93 +.\" +.PS +circle diam .3i "8" +circle diam .3i "9" at 1st circle + (2i,0i) +circle diam .3i "3" at 1st circle + (0.5i,-0.5i) +circle diam .3i "7" at 2nd circle - (0.5i, 0.5i) +circle diam .3i "2" at 1st circle - (0i,1i) +circle diam .3i "5" at 5th circle + (1i,0i) +circle diam .3i "6" at 2nd circle - (0i,1i) +circle diam .3i "1" at 3rd circle - (0i,1i) +circle diam .3i "4" at 4th circle - (0i,1i) +arrow from 1st circle to 3rd circle chop .15i chop .15i +arrow from 1st circle to 4th circle chop .15i chop .15i +arrow from 2nd circle to 4th circle chop .15i chop .15i +arrow from 3rd circle to 5th circle chop .15i chop .15i +arrow from 4th circle to 5th circle chop .15i chop .15i +arrow from 4th circle to 6th circle chop .15i chop .15i +arrow from 4th circle to 7th circle chop .15i chop .15i +arrow from 5th circle to 8th circle chop .15i chop .15i +arrow from 6th circle to 8th circle chop .15i chop .15i +arrow from 6th circle to 9th circle chop .15i chop .15i +.PE diff --git a/share/doc/psd/18.gprof/postp2.pic b/share/doc/psd/18.gprof/postp2.pic new file mode 100644 index 0000000..3b31736 --- /dev/null +++ b/share/doc/psd/18.gprof/postp2.pic @@ -0,0 +1,56 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)postp2.pic 8.1 (Berkeley) 6/8/93 +.\" +.PS +circle diam .3i "\(ci" +circle diam .3i "\(ci" at 1st circle + (2i,0i) +circle diam .3i "\(bu" at 1st circle + (0.5i,-0.5i) +circle diam .3i "\(bu" at 2nd circle - (0.5i, 0.5i) +circle diam .3i "\(ci" at 1st circle - (0i,1i) +circle diam .3i "\(ci" at 5th circle + (1i,0i) +circle diam .3i "\(ci" at 2nd circle - (0i,1i) +circle diam .3i "\(ci" at 3rd circle - (0i,1i) +circle diam .3i "\(ci" at 4th circle - (0i,1i) +arrow from 1st circle to 3rd circle chop .15i chop .15i +arrow from 1st circle to 4th circle chop .15i chop .15i +arrow from 2nd circle to 4th circle chop .15i chop .15i +spline -> from 3rd circle right .5i up .075i then right .5i down .075i chop .15i chop .15i +spline -> from 4th circle left .5i down .075i then left .5i up .075i chop .15i chop .15i +arrow from 3rd circle to 5th circle chop .15i chop .15i +arrow from 4th circle to 5th circle chop .15i chop .15i +arrow from 4th circle to 6th circle chop .15i chop .15i +arrow from 4th circle to 7th circle chop .15i chop .15i +arrow from 5th circle to 8th circle chop .15i chop .15i +arrow from 6th circle to 8th circle chop .15i chop .15i +arrow from 6th circle to 9th circle chop .15i chop .15i +.PE diff --git a/share/doc/psd/18.gprof/postp3.pic b/share/doc/psd/18.gprof/postp3.pic new file mode 100644 index 0000000..65eb2a7 --- /dev/null +++ b/share/doc/psd/18.gprof/postp3.pic @@ -0,0 +1,51 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)postp3.pic 8.1 (Berkeley) 6/8/93 +.\" +.PS +circle diam .3i "7" +circle diam .3i "8" at 1st circle + (2i,0i) +EL: ellipse wid 1i ht .3i "\fB6\fR\h'.7i'\fB6\fR" at 1st circle + (1i,-0.5i) +circle diam .3i "2" at 1st circle - (0i,1i) +circle diam .3i "4" at 3th circle + (1i,0i) +circle diam .3i "5" at 2nd circle - (0i,1i) +circle diam .3i "1" at 3rd circle + (0.5i,-0.5i) +circle diam .3i "3" at 5th circle - (0.5i,0.5i) +arrow from 1st circle to EL.nw chop .15i chop 0i +arrow from 2nd circle to EL.ne chop .15i chop 0i +arrow from EL.sw to 3rd circle chop 0i chop .15i +arrow from EL.s to 4th circle chop 0i chop .15i +arrow from EL.se to 5th circle chop 0i chop .15i +arrow from 3rd circle to 6th circle chop .15i chop .15i +arrow from 4th circle to 6th circle chop .15i chop .15i +arrow from 4th circle to 7th circle chop .15i chop .15i +.PE diff --git a/share/doc/psd/18.gprof/pres1.pic b/share/doc/psd/18.gprof/pres1.pic new file mode 100644 index 0000000..0c311a1 --- /dev/null +++ b/share/doc/psd/18.gprof/pres1.pic @@ -0,0 +1,56 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)pres1.pic 8.1 (Berkeley) 6/8/93 +.\" +.PS +ellipse ht .3i wid .75i "\s-1CALLER1\s+1" +ellipse ht .3i wid .75i "\s-1CALLER2\s+1" at 1st ellipse + (2i,0i) +ellipse ht .3i wid .8i "\s-1EXAMPLE\s+1" at 1st ellipse + (1i,-.5i) +ellipse ht .3i wid .5i "\s-1SUB1\s+1" at 1st ellipse - (0i,1i) +ellipse ht .3i wid .5i "\s-1SUB2\s+1" at 3rd ellipse - (0i,.5i) +ellipse ht .3i wid .5i "\s-1SUB3\s+1" at 2nd ellipse - (0i,1i) +line <- from 1st ellipse up .5i left .5i chop .1875i +line <- from 1st ellipse up .5i right .5i chop .1875i +line <- from 2nd ellipse up .5i left .5i chop .1875i +line <- from 2nd ellipse up .5i right .5i chop .1875i +arrow from 1st ellipse to 3rd ellipse chop +arrow from 2nd ellipse to 3rd ellipse chop +arrow from 3rd ellipse to 4th ellipse chop +arrow from 3rd ellipse to 5th ellipse chop .15i chop .15i +arrow from 3rd ellipse to 6th ellipse chop +arrow from 4th ellipse down .5i left .5i chop .1875i +arrow from 4th ellipse down .5i right .5i chop .1875i +arrow from 5th ellipse down .5i left .5i chop .1875i +arrow from 5th ellipse down .5i right .5i chop .1875i +arrow from 6th ellipse down .5i left .5i chop .1875i +arrow from 6th ellipse down .5i right .5i chop .1875i +.PE diff --git a/share/doc/psd/18.gprof/pres2.pic b/share/doc/psd/18.gprof/pres2.pic new file mode 100644 index 0000000..c3a4ea0 --- /dev/null +++ b/share/doc/psd/18.gprof/pres2.pic @@ -0,0 +1,52 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)pres2.pic 8.1 (Berkeley) 6/8/93 +.\" +.PS +ellipse ht .3i wid .6i "\s-1CALC1\s+1" +ellipse ht .3i wid .6i "\s-1CALC2\s+1" at 1st ellipse + (.75i,0i) +ellipse ht .3i wid .6i "\s-1CALC3\s+1" at 1st ellipse + (1.5i,0i) +ellipse ht .3i wid .8i "\s-1FORMAT1\s+1" at 1st ellipse - (0i,.5i) +ellipse ht .3i wid .8i "\s-1FORMAT2\s+1" at 3rd ellipse - (0i,.5i) +ellipse ht .3i wid .75i "\s-1\"WRITE\"\s+1" at 5th ellipse - (.75i,.5i) +line <- from 1st ellipse up .5i left .4i chop .1825i +line <- from 1st ellipse up .5i right .4i chop .1825i +line <- from 2nd ellipse up .5i left .4i chop .1825i +line <- from 2nd ellipse up .5i right .4i chop .1825i +line <- from 3rd ellipse up .5i left .4i chop .1825i +line <- from 3rd ellipse up .5i right .4i chop .1825i +arrow from 1st ellipse to 4th ellipse chop .15i +arrow from 2nd ellipse to 5th ellipse chop +arrow from 3rd ellipse to 5th ellipse chop .15i +arrow from 4th ellipse to 6th ellipse chop +arrow from 5th ellipse to 6th ellipse chop +.PE diff --git a/share/doc/psd/18.gprof/present.me b/share/doc/psd/18.gprof/present.me new file mode 100644 index 0000000..1dd7f62 --- /dev/null +++ b/share/doc/psd/18.gprof/present.me @@ -0,0 +1,306 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)present.me 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "Data Presentation" +.pp +The data is presented to the user in two different formats. +The first presentation simply lists the routines +without regard to the amount of time their descendants use. +The second presentation incorporates the call graph of the +program. +.sh 2 "The Flat Profile +.pp +The flat profile consists of a list of all the routines +that are called during execution of the program, +with the count of the number of times they are called +and the number of seconds of execution time for which they +are themselves accountable. +The routines are listed in decreasing order of execution time. +A list of the routines that are never called during execution of +the program is also available +to verify that nothing important is omitted by +this execution. +The flat profile gives a quick overview of the routines that are used, +and shows the routines that are themselves responsible +for large fractions of the execution time. +In practice, +this profile usually shows that no single function +is overwhelmingly responsible for +the total time of the program. +Notice that for this profile, +the individual times sum to the total execution time. +.sh 2 "The Call Graph Profile" +.sz 10 +.(z +.TS +box center; +c c c c c l l +c c c c c l l +c c c c c l l +l n n n c l l. + called/total \ \ parents +index %time self descendants called+self name index + called/total \ \ children +_ + 0.20 1.20 4/10 \ \ \s-1CALLER1\s+1 [7] + 0.30 1.80 6/10 \ \ \s-1CALLER2\s+1 [1] +[2] 41.5 0.50 3.00 10+4 \s-1EXAMPLE\s+1 [2] + 1.50 1.00 20/40 \ \ \s-1SUB1\s+1 [4] + 0.00 0.50 1/5 \ \ \s-1SUB2\s+1 [9] + 0.00 0.00 0/5 \ \ \s-1SUB3\s+1 [11] +.TE +.ce 2 +Profile entry for \s-1EXAMPLE\s+1. +Figure 4. +.)z +.pp +Ideally, we would like to print the call graph of the program, +but we are limited by the two-dimensional nature of our output +devices. +We cannot assume that a call graph is planar, +and even if it is, that we can print a planar version of it. +Instead, we choose to list each routine, +together with information about +the routines that are its direct parents and children. +This listing presents a window into the call graph. +Based on our experience, +both parent information and child information +is important, +and should be available without searching +through the output. +.pp +The major entries of the call graph profile are the entries from the +flat profile, augmented by the time propagated to each +routine from its descendants. +This profile is sorted by the sum of the time for the routine +itself plus the time inherited from its descendants. +The profile shows which of the higher level routines +spend large portions of the total execution time +in the routines that they call. +For each routine, we show the amount of time passed by each child +to the routine, which includes time for the child itself +and for the descendants of the child +(and thus the descendants of the routine). +We also show the percentage these times represent of the total time +accounted to the child. +Similarly, the parents of each routine are listed, +along with time, +and percentage of total routine time, +propagated to each one. +.pp +Cycles are handled as single entities. +The cycle as a whole is shown as though it were a single routine, +except that members of the cycle are listed in place of the children. +Although the number of calls of each member +from within the cycle are shown, +they do not affect time propagation. +When a child is a member of a cycle, +the time shown is the appropriate fraction of the time +for the whole cycle. +Self-recursive routines have their calls broken +down into calls from the outside and self-recursive calls. +Only the outside calls affect the propagation of time. +.pp +The following example is a typical fragment of a call graph. +.(b +.so pres1.pic +.)b +The entry in the call graph profile listing for this example is +shown in Figure 4. +.pp +The entry is for routine \s-1EXAMPLE\s+1, which has +the Caller routines as its parents, +and the Sub routines as its children. +The reader should keep in mind that all information +is given \fIwith respect to \s-1EXAMPLE\s+1\fP. +The index in the first column shows that \s-1EXAMPLE\s+1 +is the second entry in the profile listing. +The \s-1EXAMPLE\s+1 routine is called ten times, four times by \s-1CALLER1\s+1, +and six times by \s-1CALLER2\s+1. +Consequently 40% of \s-1EXAMPLE\s+1's time is propagated to \s-1CALLER1\s+1, +and 60% of \s-1EXAMPLE\s+1's time is propagated to \s-1CALLER2\s+1. +The self and descendant fields of the parents +show the amount of self and descendant time \s-1EXAMPLE\s+1 +propagates to them (but not the time used by +the parents directly). +Note that \s-1EXAMPLE\s+1 calls itself recursively four times. +The routine \s-1EXAMPLE\s+1 calls routine \s-1SUB1\s+1 twenty times, \s-1SUB2\s+1 once, +and never calls \s-1SUB3\s+1. +Since \s-1SUB2\s+1 is called a total of five times, +20% of its self and descendant time is propagated to \s-1EXAMPLE\s+1's +descendant time field. +Because \s-1SUB1\s+1 is a member of \fIcycle 1\fR, +the self and descendant times +and call count fraction +are those for the cycle as a whole. +Since cycle 1 is called a total of forty times +(not counting calls among members of the cycle), +it propagates 50% of the cycle's self and descendant +time to \s-1EXAMPLE\s+1's descendant time field. +Finally each name is followed by an index that shows +where on the listing to find the entry for that routine. +.sh 1 "Using the Profiles" +.pp +The profiler is a useful tool for improving +a set of routines that implement an abstraction. +It can be helpful in identifying poorly coded routines, +and in evaluating the new algorithms and code that replace them. +Taking full advantage of the profiler +requires a careful examination of the call graph profile, +and a thorough knowledge of the abstractions underlying +the program. +.pp +The easiest optimization that can be performed +is a small change +to a control construct or data structure that improves the +running time of the program. +An obvious starting point +is a routine that is called many times. +For example, suppose an output +routine is the only parent +of a routine that formats the data. +If this format routine is expanded inline in the +output routine, the overhead of a function call and +return can be saved for each datum that needs to be formatted. +.pp +The drawback to inline expansion is that the data abstractions +in the program may become less parameterized, +hence less clearly defined. +The profiling will also become less useful since the loss of +routines will make its output more granular. +For example, +if the symbol table functions ``lookup'', ``insert'', and ``delete'' +are all merged into a single parameterized routine, +it will be impossible to determine the costs +of any one of these individual functions from the profile. +.pp +Further potential for optimization lies in routines that +implement data abstractions whose total execution +time is long. +For example, a lookup routine might be called only a few +times, but use an inefficient linear search algorithm, +that might be replaced with a binary search. +Alternately, the discovery that a rehashing function is being +called excessively, can lead to a different +hash function or a larger hash table. +If the data abstraction function cannot easily be speeded up, +it may be advantageous to cache its results, +and eliminate the need to rerun +it for identical inputs. +These and other ideas for program improvement are discussed in +[Bentley81]. +.pp +This tool is best used in an iterative approach: +profiling the program, +eliminating one bottleneck, +then finding some other part of the program +that begins to dominate execution time. +For instance, we have used \fBgprof\fR on itself; +eliminating, rewriting, and inline expanding routines, +until reading +data files (hardly a target for optimization!) +represents the dominating factor in its execution time. +.pp +Certain types of programs are not easily analyzed by \fBgprof\fR. +They are typified by programs that exhibit a large degree of +recursion, such as recursive descent compilers. +The problem is that most of the major routines are grouped +into a single monolithic cycle. +As in the symbol table abstraction that is placed +in one routine, +it is impossible to distinguish which members of the cycle are +responsible for the execution time. +Unfortunately there are no easy modifications to these programs that +make them amenable to analysis. +.pp +A completely different use of the profiler is to analyze the control +flow of an unfamiliar program. +If you receive a program from another user that you need to modify +in some small way, +it is often unclear where the changes need to be made. +By running the program on an example and then using \fBgprof\fR, +you can get a view of the structure of the program. +.pp +Consider an example in which you need to change the output format +of the program. +For purposes of this example suppose that the call graph +of the output portion of the program has the following structure: +.(b +.so pres2.pic +.)b +Initially you look through the \fBgprof\fR +output for the system call ``\s-1WRITE\s+1''. +The format routine you will need to change is probably +among the parents of the ``\s-1WRITE\s+1'' procedure. +The next step is to look at the profile entry for each +of parents of ``\s-1WRITE\s+1'', +in this example either ``\s-1FORMAT1\s+1'' or ``\s-1FORMAT2\s+1'', +to determine which one to change. +Each format routine will have one or more parents, +in this example ``\s-1CALC1\s+1'', ``\s-1CALC2\s+1'', and ``\s-1CALC3\s+1''. +By inspecting the source code for each of these routines +you can determine which format routine generates the output that +you wish to modify. +Since the \fBgprof\fR entry shows all the +potential calls to the format routine you intend to change, +you can determine if your modifications will affect output that +should be left alone. +If you desire to change the output of ``\s-1CALC2\s+1'', but not ``\s-1CALC3\s+1'', +then formatting routine ``\s-1FORMAT2\s+1'' needs to be split +into two separate routines, +one of which implements the new format. +You can then retarget just the call by ``\s-1CALC2\s+1'' +that needs the new format. +It should be noted that the static call information is particularly +useful here since the test case you run probably will not +exercise the entire program. +.sh 1 "Conclusions" +.pp +We have created a profiler that aids in the evaluation +of modular programs. +For each routine in the program, +the profile shows the extent to which that routine +helps support various abstractions, +and how that routine uses other abstractions. +The profile accurately assesses the cost of routines +at all levels of the program decomposition. +The profiler is easily used, +and can be compiled into the program without any prior planning by +the programmer. +It adds only five to thirty percent execution overhead to the program +being profiled, +produces no additional output until after the program finishes, +and allows the program to be measured in its actual environment. +Finally, the profiler runs on a time-sharing system +using only the normal services provided by the operating system +and compilers. diff --git a/share/doc/psd/18.gprof/profiling.me b/share/doc/psd/18.gprof/profiling.me new file mode 100644 index 0000000..227aedf --- /dev/null +++ b/share/doc/psd/18.gprof/profiling.me @@ -0,0 +1,115 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)profiling.me 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "Types of Profiling" +.pp +There are several different uses for program profiles, +and each may require different information from the profiles, +or different presentation of the information. +We distinguish two broad categories of profiles: +those that present counts of statement or routine invocations, +and those that display timing information about statements +or routines. +Counts are typically presented in tabular form, +often in parallel with a listing of the source code. +Timing information could be similarly presented; +but more than one measure of time might be associated with each +statement or routine. +For example, +in the framework used by \fBgprof\fP +each profiled segment would display two times: +one for the time used by the segment itself, and another for the +time inherited from code segments it invokes. +.pp +Execution counts are used in many different contexts. +The exact number of times a routine or statement is activated +can be used to determine if an algorithm is performing as +expected. +Cursory inspection of such counters may show algorithms whose +complexity is unsuited to the task at hand. +Careful interpretation of counters can often suggest +improvements to acceptable algorithms. +Precise examination can uncover subtle errors in an +algorithm. +At this level, profiling counters are similar to +debugging statements whose purpose is to show the number of times +a piece of code is executed. +Another view of such counters is as boolean values. +One may be interested that a portion of code has executed at +all, for exhaustive testing, or to check that one implementation +of an abstraction completely replaces a previous one. +.pp +Execution counts are not necessarily proportional to the amount +of time required to execute the routine or statement. +Further, the execution time of a routine will not be the same for +all calls on the routine. +The criteria for establishing execution time +must be decided. +If a routine implements an abstraction by invoking other abstractions, +the time spent in the routine will not accurately reflect the +time required by the abstraction it implements. +Similarly, if an abstraction is implemented by several +routines the time required by the abstraction will be distributed +across those routines. +.pp +Given the execution time of individual routines, +\fBgprof\fP accounts to each routine the time spent +for it by the routines it invokes. +This accounting is done by assembling a \fIcall graph\fP with nodes that +are the routines of the program and directed arcs that represent +calls from call sites to routines. +We distinguish among three different call graphs for a program. +The \fIcomplete call graph\fP incorporates all routines and all +potential arcs, +including arcs that represent calls to functional parameters +or functional variables. +This graph contains the other two graphs as subgraphs. +The \fIstatic call graph\fP includes all routines and all possible arcs +that are not calls to functional parameters or variables. +The \fIdynamic call graph\fP includes only those routines and +arcs traversed by the profiled execution of the program. +This graph need not include all routines, nor need it include all +potential arcs between the routines it covers. +It may, however, include arcs to functional parameters or +variables that the static call graph may omit. +The static call graph can be determined from the (static) program text. +The dynamic call graph is determined only by profiling an +execution of the program. +The complete call graph for a monolithic program could be determined +by data flow analysis techniques. +The complete call graph for programs that change +during execution, by modifying themselves or dynamically loading +or overlaying code, may never be determinable. +Both the static call graph and the dynamic call graph are used +by \fBgprof\fP, but it does not search for the complete call +graph. diff --git a/share/doc/psd/18.gprof/refs.me b/share/doc/psd/18.gprof/refs.me new file mode 100644 index 0000000..580d080 --- /dev/null +++ b/share/doc/psd/18.gprof/refs.me @@ -0,0 +1,63 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)refs.me 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "References" +.ls 1 +.ip [Bentley81] +Bentley, J. L., +``Writing Efficient Code'', +Department of Computer Science, +Carnegie-Mellon University, +Pittsburgh, Pennsylvania, +CMU-CS-81-116, 1981. +.ip [Graham82] +Graham, S. L., Henry, R. R., Schulman, R. A., +``An Experiment in Table Driven Code Generation'', +SIGPLAN '82 Symposium on Compiler Construction, +June, 1982. +.ip [Joy79] +Joy, W. N., Graham, S. L., Haley, C. B. ``Berkeley Pascal User's Manual'', +Version 1.1, Computer Science Division +University of California, Berkeley, CA. April 1979. +.ip [Knuth71] +Knuth, D. E. ``An empirical study of FORTRAN programs'', +Software - Practice and Experience, 1, 105-133. 1971 +.ip [Satterthwaite72] +Satterthwaite, E. ``Debugging Tools for High Level Languages'', +Software - Practice and Experience, 2, 197-217, 1972 +.ip [Tarjan72] +Tarjan, R. E., ``Depth first search and linear graph algorithm,'' +\fISIAM J. Computing\fP \fB1\fP:2, 146-160, 1972. +.ip [Unix] +Unix Programmer's Manual, ``\fBprof\fR command'', section 1, +Bell Laboratories, Murray Hill, NJ. January 1979. diff --git a/share/doc/psd/22.rpcgen/Makefile b/share/doc/psd/22.rpcgen/Makefile index 4c38add..04d4e9e 100644 --- a/share/doc/psd/22.rpcgen/Makefile +++ b/share/doc/psd/22.rpcgen/Makefile @@ -4,6 +4,5 @@ VOLUME= psd/22.rpcgen SRCS= stubs rpcgen.ms MACROS= -ms USE_TBL= -SRCDIR= ${.CURDIR}/../../../../lib/libc/rpc/PSD.doc .include diff --git a/share/doc/psd/22.rpcgen/rpcgen.ms b/share/doc/psd/22.rpcgen/rpcgen.ms new file mode 100644 index 0000000..e663e7f --- /dev/null +++ b/share/doc/psd/22.rpcgen/rpcgen.ms @@ -0,0 +1,1301 @@ +.\" +.\" Must use -- tbl -- for this one +.\" +.\" @(#)rpcgen.ms 2.2 88/08/04 4.0 RPCSRC +.\" $FreeBSD$ +.\" +.de BT +.if \\n%=1 .tl ''- % -'' +.. +.ND +.\" prevent excess underlining in nroff +.if n .fp 2 R +.OH '\fBrpcgen\fP Programming Guide''Page %' +.EH 'Page %''\fBrpcgen\fP Programming Guide' +.if \n%=1 .bp +.SH +\&\fBrpcgen\fP Programming Guide +.NH 0 +\&The \fBrpcgen\fP Protocol Compiler +.IX rpcgen "" \fIrpcgen\fP "" PAGE MAJOR +.LP +.IX RPC "" "" \fIrpcgen\fP +The details of programming applications to use Remote Procedure Calls +can be overwhelming. Perhaps most daunting is the writing of the XDR +routines necessary to convert procedure arguments and results into +their network format and vice-versa. +.LP +Fortunately, +.I rpcgen(1) +exists to help programmers write RPC applications simply and directly. +.I rpcgen +does most of the dirty work, allowing programmers to debug +the main features of their application, instead of requiring them to +spend most of their time debugging their network interface code. +.LP +.I rpcgen +is a compiler. It accepts a remote program interface definition written +in a language, called RPC Language, which is similar to C. It produces a C +language output which includes stub versions of the client routines, a +server skeleton, XDR filter routines for both parameters and results, and a +header file that contains common definitions. The client stubs interface +with the RPC library and effectively hide the network from their callers. +The server stub similarly hides the network from the server procedures that +are to be invoked by remote clients. +.I rpcgen 's +output files can be compiled and linked in the usual way. The developer +writes server procedures\(emin any language that observes Sun calling +conventions\(emand links them with the server skeleton produced by +.I rpcgen +to get an executable server program. To use a remote program, a programmer +writes an ordinary main program that makes local procedure calls to the +client stubs produced by +.I rpcgen . +Linking this program with +.I rpcgen 's +stubs creates an executable program. (At present the main program must be +written in C). +.I rpcgen +options can be used to suppress stub generation and to specify the transport +to be used by the server stub. +.LP +Like all compilers, +.I rpcgen +reduces development time +that would otherwise be spent coding and debugging low-level routines. +All compilers, including +.I rpcgen , +do this at a small cost in efficiency +and flexibility. However, many compilers allow escape hatches for +programmers to mix low-level code with high-level code. +.I rpcgen +is no exception. In speed-critical applications, hand-written routines +can be linked with the +.I rpcgen +output without any difficulty. Also, one may proceed by using +.I rpcgen +output as a starting point, and then rewriting it as necessary. +(If you need a discussion of RPC programming without +.I rpcgen , +see the +.I "Remote Procedure Call Programming Guide)\. +.NH 1 +\&Converting Local Procedures into Remote Procedures +.IX rpcgen "local procedures" \fIrpcgen\fP +.IX rpcgen "remote procedures" \fIrpcgen\fP +.LP +Assume an application that runs on a single machine, one which we want +to convert to run over the network. Here we will demonstrate such a +conversion by way of a simple example\(ema program that prints a +message to the console: +.ie t .DS +.el .DS L +.ft I +/* + * printmsg.c: print a message on the console + */ +.ft CW +#include + +main(argc, argv) + int argc; + char *argv[]; +{ + char *message; + + if (argc < 2) { + fprintf(stderr, "usage: %s \en", argv[0]); + exit(1); + } + message = argv[1]; + + if (!printmessage(message)) { + fprintf(stderr, "%s: couldn't print your message\en", + argv[0]); + exit(1); + } + printf("Message Delivered!\en"); + exit(0); +} +.ft I +/* + * Print a message to the console. + * Return a boolean indicating whether the message was actually printed. + */ +.ft CW +printmessage(msg) + char *msg; +{ + FILE *f; + + f = fopen("/dev/console", "w"); + if (f == NULL) { + return (0); + } + fprintf(f, "%s\en", msg); + fclose(f); + return(1); +} +.DE +.LP +And then, of course: +.ie t .DS +.el .DS L +.ft CW +example% \fBcc printmsg.c -o printmsg\fP +example% \fBprintmsg "Hello, there."\fP +Message delivered! +example% +.DE +.LP +If +.I printmessage() +was turned into a remote procedure, +then it could be called from anywhere in the network. +Ideally, one would just like to stick a keyword like +.I remote +in front of a +procedure to turn it into a remote procedure. Unfortunately, +we have to live within the constraints of the C language, since +it existed long before RPC did. But even without language +support, it's not very difficult to make a procedure remote. +.LP +In general, it's necessary to figure out what the types are for +all procedure inputs and outputs. In this case, we have a +procedure +.I printmessage() +which takes a string as input, and returns an integer +as output. Knowing this, we can write a protocol specification in RPC +language that describes the remote version of +.I printmessage (). +Here it is: +.ie t .DS +.el .DS L +.ft I +/* + * msg.x: Remote message printing protocol + */ +.ft CW + +program MESSAGEPROG { + version MESSAGEVERS { + int PRINTMESSAGE(string) = 1; + } = 1; +} = 99; +.DE +.LP +Remote procedures are part of remote programs, so we actually declared +an entire remote program here which contains the single procedure +.I PRINTMESSAGE . +This procedure was declared to be in version 1 of the +remote program. No null procedure (procedure 0) is necessary because +.I rpcgen +generates it automatically. +.LP +Notice that everything is declared with all capital letters. This is +not required, but is a good convention to follow. +.LP +Notice also that the argument type is \*Qstring\*U and not \*Qchar *\*U. This +is because a \*Qchar *\*U in C is ambiguous. Programmers usually intend it +to mean a null-terminated string of characters, but it could also +represent a pointer to a single character or a pointer to an array of +characters. In RPC language, a null-terminated string is +unambiguously called a \*Qstring\*U. +.LP +There are just two more things to write. First, there is the remote +procedure itself. Here's the definition of a remote procedure +to implement the +.I PRINTMESSAGE +procedure we declared above: +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * msg_proc.c: implementation of the remote procedure "printmessage" + */ +.ft CW + +#include +#include /* \fIalways needed\fP */ +#include "msg.h" /* \fIneed this too: msg.h will be generated by rpcgen\fP */ + +.ft I +/* + * Remote verson of "printmessage" + */ +.ft CW +int * +printmessage_1(msg) + char **msg; +{ + static int result; /* \fImust be static!\fP */ + FILE *f; + + f = fopen("/dev/console", "w"); + if (f == NULL) { + result = 0; + return (&result); + } + fprintf(f, "%s\en", *msg); + fclose(f); + result = 1; + return (&result); +} +.vs +.DE +.LP +Notice here that the declaration of the remote procedure +.I printmessage_1() +differs from that of the local procedure +.I printmessage() +in three ways: +.IP 1. +It takes a pointer to a string instead of a string itself. This +is true of all remote procedures: they always take pointers to their +arguments rather than the arguments themselves. +.IP 2. +It returns a pointer to an integer instead of an integer itself. This is +also generally true of remote procedures: they always return a pointer +to their results. +.IP 3. +It has an \*Q_1\*U appended to its name. In general, all remote +procedures called by +.I rpcgen +are named by the following rule: the name in the program definition +(here +.I PRINTMESSAGE ) +is converted to all +lower-case letters, an underbar (\*Q_\*U) is appended to it, and +finally the version number (here 1) is appended. +.LP +The last thing to do is declare the main client program that will call +the remote procedure. Here it is: +.ie t .DS +.el .DS L +.ft I +/* + * rprintmsg.c: remote version of "printmsg.c" + */ +.ft CW +#include +#include /* \fIalways needed\fP */ +#include "msg.h" /* \fIneed this too: msg.h will be generated by rpcgen\fP */ + +main(argc, argv) + int argc; + char *argv[]; +{ + CLIENT *cl; + int *result; + char *server; + char *message; + + if (argc < 3) { + fprintf(stderr, "usage: %s host message\en", argv[0]); + exit(1); + } + +.ft I + /* + * Save values of command line arguments + */ +.ft CW + server = argv[1]; + message = argv[2]; + +.ft I + /* + * Create client "handle" used for calling \fIMESSAGEPROG\fP on the + * server designated on the command line. We tell the RPC package + * to use the "tcp" protocol when contacting the server. + */ +.ft CW + cl = clnt_create(server, MESSAGEPROG, MESSAGEVERS, "tcp"); + if (cl == NULL) { +.ft I + /* + * Couldn't establish connection with server. + * Print error message and die. + */ +.ft CW + clnt_pcreateerror(server); + exit(1); + } + +.ft I + /* + * Call the remote procedure "printmessage" on the server + */ +.ft CW + result = printmessage_1(&message, cl); + if (result == NULL) { +.ft I + /* + * An error occurred while calling the server. + * Print error message and die. + */ +.ft CW + clnt_perror(cl, server); + exit(1); + } + +.ft I + /* + * Okay, we successfully called the remote procedure. + */ +.ft CW + if (*result == 0) { +.ft I + /* + * Server was unable to print our message. + * Print error message and die. + */ +.ft CW + fprintf(stderr, "%s: %s couldn't print your message\en", + argv[0], server); + exit(1); + } + +.ft I + /* + * The message got printed on the server's console + */ +.ft CW + printf("Message delivered to %s!\en", server); +} +.DE +There are two things to note here: +.IP 1. +.IX "client handle, used by rpcgen" "" "client handle, used by \fIrpcgen\fP" +First a client \*Qhandle\*U is created using the RPC library routine +.I clnt_create (). +This client handle will be passed to the stub routines +which call the remote procedure. +.IP 2. +The remote procedure +.I printmessage_1() +is called exactly the same way as it is declared in +.I msg_proc.c +except for the inserted client handle as the first argument. +.LP +Here's how to put all of the pieces together: +.ie t .DS +.el .DS L +.ft CW +example% \fBrpcgen msg.x\fP +example% \fBcc rprintmsg.c msg_clnt.c -o rprintmsg\fP +example% \fBcc msg_proc.c msg_svc.c -o msg_server\fP +.DE +Two programs were compiled here: the client program +.I rprintmsg +and the server program +.I msg_server . +Before doing this though, +.I rpcgen +was used to fill in the missing pieces. +.LP +Here is what +.I rpcgen +did with the input file +.I msg.x : +.IP 1. +It created a header file called +.I msg.h +that contained +.I #define 's +for +.I MESSAGEPROG , +.I MESSAGEVERS +and +.I PRINTMESSAGE +for use in the other modules. +.IP 2. +It created client \*Qstub\*U routines in the +.I msg_clnt.c +file. In this case there is only one, the +.I printmessage_1() +that was referred to from the +.I printmsg +client program. The name of the output file for +client stub routines is always formed in this way: if the name of the +input file is +.I FOO.x , +the client stubs output file is called +.I FOO_clnt.c . +.IP 3. +It created the server program which calls +.I printmessage_1() +in +.I msg_proc.c . +This server program is named +.I msg_svc.c . +The rule for naming the server output file is similar to the +previous one: for an input file called +.I FOO.x , +the output server file is named +.I FOO_svc.c . +.LP +Now we're ready to have some fun. First, copy the server to a +remote machine and run it. For this example, the +machine is called \*Qmoon\*U. Server processes are run in the +background, because they never exit. +.ie t .DS +.el .DS L +.ft CW +moon% \fBmsg_server &\fP +.DE +Then on our local machine (\*Qsun\*U) we can print a message on \*Qmoon\*Us +console. +.ie t .DS +.el .DS L +.ft CW +sun% \fBprintmsg moon "Hello, moon."\fP +.DE +The message will get printed to \*Qmoon\*Us console. You can print a +message on anybody's console (including your own) with this program if +you are able to copy the server to their machine and run it. +.NH 1 +\&Generating XDR Routines +.IX RPC "generating XDR routines" +.LP +The previous example only demonstrated the automatic generation of +client and server RPC code. +.I rpcgen +may also be used to generate XDR routines, that is, the routines +necessary to convert local data +structures into network format and vice-versa. This example presents +a complete RPC service\(ema remote directory listing service, which uses +.I rpcgen +not only to generate stub routines, but also to generate the XDR +routines. Here is the protocol description file: +.ie t .DS +.el .DS L +.ft I +/* + * dir.x: Remote directory listing protocol + */ +.ft CW +const MAXNAMELEN = 255; /* \fImaximum length of a directory entry\fP */ + +typedef string nametype; /* \fIa directory entry\fP */ + +typedef struct namenode *namelist; /* \fIa link in the listing\fP */ + +.ft I +/* + * A node in the directory listing + */ +.ft CW +struct namenode { + nametype name; /* \fIname of directory entry\fP */ + namelist next; /* \fInext entry\fP */ +}; + +.ft I +/* + * The result of a READDIR operation. + */ +.ft CW +union readdir_res switch (int errno) { +case 0: + namelist list; /* \fIno error: return directory listing\fP */ +default: + void; /* \fIerror occurred: nothing else to return\fP */ +}; + +.ft I +/* + * The directory program definition + */ +.ft CW +program DIRPROG { + version DIRVERS { + readdir_res + READDIR(nametype) = 1; + } = 1; +} = 76; +.DE +.SH +Note: +.I +Types (like +.I readdir_res +in the example above) can be defined using +the \*Qstruct\*U, \*Qunion\*U and \*Qenum\*U keywords, but those keywords +should not be used in subsequent declarations of variables of those types. +For example, if you define a union \*Qfoo\*U, you should declare using +only \*Qfoo\*U and not \*Qunion foo\*U. In fact, +.I rpcgen +compiles +RPC unions into C structures and it is an error to declare them using the +\*Qunion\*U keyword. +.LP +Running +.I rpcgen +on +.I dir.x +creates four output files. Three are the same as before: header file, +client stub routines and server skeleton. The fourth are the XDR routines +necessary for converting the data types we declared into XDR format and +vice-versa. These are output in the file +.I dir_xdr.c . +.LP +Here is the implementation of the +.I READDIR +procedure. +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * dir_proc.c: remote readdir implementation + */ +.ft CW +#include +#include +#include "dir.h" + +extern int errno; +extern char *malloc(); +extern char *strdup(); + +readdir_res * +readdir_1(dirname) + nametype *dirname; +{ + DIR *dirp; + struct direct *d; + namelist nl; + namelist *nlp; + static readdir_res res; /* \fImust be static\fP! */ + +.ft I + /* + * Open directory + */ +.ft CW + dirp = opendir(*dirname); + if (dirp == NULL) { + res.errno = errno; + return (&res); + } + +.ft I + /* + * Free previous result + */ +.ft CW + xdr_free(xdr_readdir_res, &res); + +.ft I + /* + * Collect directory entries. + * Memory allocated here will be freed by \fIxdr_free\fP + * next time \fIreaddir_1\fP is called + */ +.ft CW + nlp = &res.readdir_res_u.list; + while (d = readdir(dirp)) { + nl = *nlp = (namenode *) malloc(sizeof(namenode)); + nl->name = strdup(d->d_name); + nlp = &nl->next; + } + *nlp = NULL; + +.ft I + /* + * Return the result + */ +.ft CW + res.errno = 0; + closedir(dirp); + return (&res); +} +.vs +.DE +Finally, there is the client side program to call the server: +.ie t .DS +.el .DS L +.ft I +/* + * rls.c: Remote directory listing client + */ +.ft CW +#include +#include /* \fIalways need this\fP */ +#include "dir.h" /* \fIwill be generated by rpcgen\fP */ + +extern int errno; + +main(argc, argv) + int argc; + char *argv[]; +{ + CLIENT *cl; + char *server; + char *dir; + readdir_res *result; + namelist nl; + + + if (argc != 3) { + fprintf(stderr, "usage: %s host directory\en", + argv[0]); + exit(1); + } + +.ft I + /* + * Remember what our command line arguments refer to + */ +.ft CW + server = argv[1]; + dir = argv[2]; + +.ft I + /* + * Create client "handle" used for calling \fIMESSAGEPROG\fP on the + * server designated on the command line. We tell the RPC package + * to use the "tcp" protocol when contacting the server. + */ +.ft CW + cl = clnt_create(server, DIRPROG, DIRVERS, "tcp"); + if (cl == NULL) { +.ft I + /* + * Couldn't establish connection with server. + * Print error message and die. + */ +.ft CW + clnt_pcreateerror(server); + exit(1); + } + +.ft I + /* + * Call the remote procedure \fIreaddir\fP on the server + */ +.ft CW + result = readdir_1(&dir, cl); + if (result == NULL) { +.ft I + /* + * An error occurred while calling the server. + * Print error message and die. + */ +.ft CW + clnt_perror(cl, server); + exit(1); + } + +.ft I + /* + * Okay, we successfully called the remote procedure. + */ +.ft CW + if (result->errno != 0) { +.ft I + /* + * A remote system error occurred. + * Print error message and die. + */ +.ft CW + errno = result->errno; + perror(dir); + exit(1); + } + +.ft I + /* + * Successfully got a directory listing. + * Print it out. + */ +.ft CW + for (nl = result->readdir_res_u.list; nl != NULL; + nl = nl->next) { + printf("%s\en", nl->name); + } + exit(0); +} +.DE +Compile everything, and run. +.DS +.ft CW +sun% \fBrpcgen dir.x\fP +sun% \fBcc rls.c dir_clnt.c dir_xdr.c -o rls\fP +sun% \fBcc dir_svc.c dir_proc.c dir_xdr.c -o dir_svc\fP + +sun% \fBdir_svc &\fP + +moon% \fBrls sun /usr/pub\fP +\&. +\&.. +ascii +eqnchar +greek +kbd +marg8 +tabclr +tabs +tabs4 +moon% +.DE +.LP +.IX "debugging with rpcgen" "" "debugging with \fIrpcgen\fP" +A final note about +.I rpcgen : +The client program and the server procedure can be tested together +as a single program by simply linking them with each other rather +than with the client and server stubs. The procedure calls will be +executed as ordinary local procedure calls and the program can be +debugged with a local debugger such as +.I dbx . +When the program is working, the client program can be linked to +the client stub produced by +.I rpcgen +and the server procedures can be linked to the server stub produced +by +.I rpcgen . +.SH +.I NOTE : +\fIIf you do this, you may want to comment out calls to RPC library +routines, and have client-side routines call server routines +directly.\fP +.LP +.NH 1 +\&The C-Preprocessor +.IX rpcgen "C-preprocessor" \fIrpcgen\fP +.LP +The C-preprocessor is run on all input files before they are +compiled, so all the preprocessor directives are legal within a \*Q.x\*U +file. Four symbols may be defined, depending upon which output file is +getting generated. The symbols are: +.TS +box tab (&); +lfI lfI +lfL l . +Symbol&Usage +_ +RPC_HDR&for header-file output +RPC_XDR&for XDR routine output +RPC_SVC&for server-skeleton output +RPC_CLNT&for client stub output +.TE +.LP +Also, +.I rpcgen +does a little preprocessing of its own. Any line that +begins with a percent sign is passed directly into the output file, +without any interpretation of the line. Here is a simple example that +demonstrates the preprocessing features. +.ie t .DS +.el .DS L +.ft I +/* + * time.x: Remote time protocol + */ +.ft CW +program TIMEPROG { + version TIMEVERS { + unsigned int TIMEGET(void) = 1; + } = 1; +} = 44; + +#ifdef RPC_SVC +%int * +%timeget_1() +%{ +% static int thetime; +% +% thetime = time(0); +% return (&thetime); +%} +#endif +.DE +The '%' feature is not generally recommended, as there is no guarantee +that the compiler will stick the output where you intended. +.NH 1 +\&\fBrpcgen\fP Programming Notes +.IX rpcgen "other operations" \fIrpcgen\fP +.sp +.NH 2 +\&Timeout Changes +.IX rpcgen "timeout changes" \fIrpcgen\fP +.LP +RPC sets a default timeout of 25 seconds for RPC calls when +.I clnt_create() +is used. This timeout may be changed using +.I clnt_control() +Here is a small code fragment to demonstrate use of +.I clnt_control (): +.ID +struct timeval tv; +CLIENT *cl; +.sp .5 +cl = clnt_create("somehost", SOMEPROG, SOMEVERS, "tcp"); +if (cl == NULL) { + exit(1); +} +tv.tv_sec = 60; /* \fIchange timeout to 1 minute\fP */ +tv.tv_usec = 0; +clnt_control(cl, CLSET_TIMEOUT, &tv); +.DE +.NH 2 +\&Handling Broadcast on the Server Side +.IX "broadcast RPC" +.IX rpcgen "broadcast RPC" \fIrpcgen\fP +.LP +When a procedure is known to be called via broadcast RPC, +it is usually wise for the server to not reply unless it can provide +some useful information to the client. This prevents the network +from getting flooded by useless replies. +.LP +To prevent the server from replying, a remote procedure can +return NULL as its result, and the server code generated by +.I rpcgen +will detect this and not send out a reply. +.LP +Here is an example of a procedure that replies only if it +thinks it is an NFS server: +.ID +void * +reply_if_nfsserver() +{ + char notnull; /* \fIjust here so we can use its address\fP */ +.sp .5 + if (access("/etc/exports", F_OK) < 0) { + return (NULL); /* \fIprevent RPC from replying\fP */ + } +.ft I + /* + * return non-null pointer so RPC will send out a reply + */ +.ft L + return ((void *)¬null); +} +.DE +Note that if procedure returns type \*Qvoid *\*U, they must return a non-NULL +pointer if they want RPC to reply for them. +.NH 2 +\&Other Information Passed to Server Procedures +.LP +Server procedures will often want to know more about an RPC call +than just its arguments. For example, getting authentication information +is important to procedures that want to implement some level of security. +This extra information is actually supplied to the server procedure as a +second argument. Here is an example to demonstrate its use. What we've +done here is rewrite the previous +.I printmessage_1() +procedure to only allow root users to print a message to the console. +.ID +int * +printmessage_1(msg, rq) + char **msg; + struct svc_req *rq; +{ + static in result; /* \fIMust be static\fP */ + FILE *f; + struct suthunix_parms *aup; +.sp .5 + aup = (struct authunix_parms *)rq->rq_clntcred; + if (aup->aup_uid != 0) { + result = 0; + return (&result); + } +.sp +.ft I + /* + * Same code as before. + */ +.ft L +} +.DE +.NH 1 +\&RPC Language +.IX RPCL +.IX rpcgen "RPC Language" \fIrpcgen\fP +.LP +RPC language is an extension of XDR language. The sole extension is +the addition of the +.I program +type. For a complete description of the XDR language syntax, see the +.I "External Data Representation Standard: Protocol Specification" +chapter. For a description of the RPC extensions to the XDR language, +see the +.I "Remote Procedure Calls: Protocol Specification" +chapter. +.LP +However, XDR language is so close to C that if you know C, you know most +of it already. We describe here the syntax of the RPC language, +showing a few examples along the way. We also show how the various +RPC and XDR type definitions get compiled into C type definitions in +the output header file. +.KS +.NH 2 +Definitions +\& +.IX rpcgen definitions \fIrpcgen\fP +.LP +An RPC language file consists of a series of definitions. +.DS L +.ft CW + definition-list: + definition ";" + definition ";" definition-list +.DE +.KE +It recognizes five types of definitions. +.DS L +.ft CW + definition: + enum-definition + struct-definition + union-definition + typedef-definition + const-definition + program-definition +.DE +.NH 2 +Structures +\& +.IX rpcgen structures \fIrpcgen\fP +.LP +An XDR struct is declared almost exactly like its C counterpart. It +looks like the following: +.DS L +.ft CW + struct-definition: + "struct" struct-ident "{" + declaration-list + "}" + + declaration-list: + declaration ";" + declaration ";" declaration-list +.DE +As an example, here is an XDR structure to a two-dimensional +coordinate, and the C structure that it gets compiled into in the +output header file. +.DS +.ft CW + struct coord { struct coord { + int x; --> int x; + int y; int y; + }; }; + typedef struct coord coord; +.DE +The output is identical to the input, except for the added +.I typedef +at the end of the output. This allows one to use \*Qcoord\*U instead of +\*Qstruct coord\*U when declaring items. +.NH 2 +Unions +\& +.IX rpcgen unions \fIrpcgen\fP +.LP +XDR unions are discriminated unions, and look quite different from C +unions. They are more analogous to Pascal variant records than they +are to C unions. +.DS L +.ft CW + union-definition: + "union" union-ident "switch" "(" declaration ")" "{" + case-list + "}" + + case-list: + "case" value ":" declaration ";" + "default" ":" declaration ";" + "case" value ":" declaration ";" case-list +.DE +Here is an example of a type that might be returned as the result of a +\*Qread data\*U operation. If there is no error, return a block of data. +Otherwise, don't return anything. +.DS L +.ft CW + union read_result switch (int errno) { + case 0: + opaque data[1024]; + default: + void; + }; +.DE +It gets compiled into the following: +.DS L +.ft CW + struct read_result { + int errno; + union { + char data[1024]; + } read_result_u; + }; + typedef struct read_result read_result; +.DE +Notice that the union component of the output struct has the name as +the type name, except for the trailing \*Q_u\*U. +.NH 2 +Enumerations +\& +.IX rpcgen enumerations \fIrpcgen\fP +.LP +XDR enumerations have the same syntax as C enumerations. +.DS L +.ft CW + enum-definition: + "enum" enum-ident "{" + enum-value-list + "}" + + enum-value-list: + enum-value + enum-value "," enum-value-list + + enum-value: + enum-value-ident + enum-value-ident "=" value +.DE +Here is a short example of an XDR enum, and the C enum that it gets +compiled into. +.DS L +.ft CW + enum colortype { enum colortype { + RED = 0, RED = 0, + GREEN = 1, --> GREEN = 1, + BLUE = 2 BLUE = 2, + }; }; + typedef enum colortype colortype; +.DE +.NH 2 +Typedef +\& +.IX rpcgen typedef \fIrpcgen\fP +.LP +XDR typedefs have the same syntax as C typedefs. +.DS L +.ft CW + typedef-definition: + "typedef" declaration +.DE +Here is an example that defines a +.I fname_type +used for declaring +file name strings that have a maximum length of 255 characters. +.DS L +.ft CW +typedef string fname_type<255>; --> typedef char *fname_type; +.DE +.NH 2 +Constants +\& +.IX rpcgen constants \fIrpcgen\fP +.LP +XDR constants symbolic constants that may be used wherever a +integer constant is used, for example, in array size specifications. +.DS L +.ft CW + const-definition: + "const" const-ident "=" integer +.DE +For example, the following defines a constant +.I DOZEN +equal to 12. +.DS L +.ft CW + const DOZEN = 12; --> #define DOZEN 12 +.DE +.NH 2 +Programs +\& +.IX rpcgen programs \fIrpcgen\fP +.LP +RPC programs are declared using the following syntax: +.DS L +.ft CW + program-definition: + "program" program-ident "{" + version-list + "}" "=" value + + version-list: + version ";" + version ";" version-list + + version: + "version" version-ident "{" + procedure-list + "}" "=" value + + procedure-list: + procedure ";" + procedure ";" procedure-list + + procedure: + type-ident procedure-ident "(" type-ident ")" "=" value +.DE +For example, here is the time protocol, revisited: +.ie t .DS +.el .DS L +.ft I +/* + * time.x: Get or set the time. Time is represented as number of seconds + * since 0:00, January 1, 1970. + */ +.ft CW +program TIMEPROG { + version TIMEVERS { + unsigned int TIMEGET(void) = 1; + void TIMESET(unsigned) = 2; + } = 1; +} = 44; +.DE +This file compiles into #defines in the output header file: +.ie t .DS +.el .DS L +.ft CW +#define TIMEPROG 44 +#define TIMEVERS 1 +#define TIMEGET 1 +#define TIMESET 2 +.DE +.NH 2 +Declarations +\& +.IX rpcgen declarations \fIrpcgen\fP +.LP +In XDR, there are only four kinds of declarations. +.DS L +.ft CW + declaration: + simple-declaration + fixed-array-declaration + variable-array-declaration + pointer-declaration +.DE +\fB1) Simple declarations\fP are just like simple C declarations. +.DS L +.ft CW + simple-declaration: + type-ident variable-ident +.DE +Example: +.DS L +.ft CW + colortype color; --> colortype color; +.DE +\fB2) Fixed-length Array Declarations\fP are just like C array declarations: +.DS L +.ft CW + fixed-array-declaration: + type-ident variable-ident "[" value "]" +.DE +Example: +.DS L +.ft CW + colortype palette[8]; --> colortype palette[8]; +.DE +\fB3) Variable-Length Array Declarations\fP have no explicit syntax +in C, so XDR invents its own using angle-brackets. +.DS L +.ft CW +variable-array-declaration: + type-ident variable-ident "<" value ">" + type-ident variable-ident "<" ">" +.DE +The maximum size is specified between the angle brackets. The size may +be omitted, indicating that the array may be of any size. +.DS L +.ft CW + int heights<12>; /* \fIat most 12 items\fP */ + int widths<>; /* \fIany number of items\fP */ +.DE +Since variable-length arrays have no explicit syntax in C, these +declarations are actually compiled into \*Qstruct\*Us. For example, the +\*Qheights\*U declaration gets compiled into the following struct: +.DS L +.ft CW + struct { + u_int heights_len; /* \fI# of items in array\fP */ + int *heights_val; /* \fIpointer to array\fP */ + } heights; +.DE +Note that the number of items in the array is stored in the \*Q_len\*U +component and the pointer to the array is stored in the \*Q_val\*U +component. The first part of each of these component's names is the +same as the name of the declared XDR variable. +.LP +\fB4) Pointer Declarations\fP are made in +XDR exactly as they are in C. You can't +really send pointers over the network, but you can use XDR pointers +for sending recursive data types such as lists and trees. The type is +actually called \*Qoptional-data\*U, not \*Qpointer\*U, in XDR language. +.DS L +.ft CW + pointer-declaration: + type-ident "*" variable-ident +.DE +Example: +.DS L +.ft CW + listitem *next; --> listitem *next; +.DE +.NH 2 +\&Special Cases +.IX rpcgen "special cases" \fIrpcgen\fP +.LP +There are a few exceptions to the rules described above. +.LP +.B Booleans: +C has no built-in boolean type. However, the RPC library does a +boolean type called +.I bool_t +that is either +.I TRUE +or +.I FALSE . +Things declared as type +.I bool +in XDR language are compiled into +.I bool_t +in the output header file. +.LP +Example: +.DS L +.ft CW + bool married; --> bool_t married; +.DE +.B Strings: +C has no built-in string type, but instead uses the null-terminated +\*Qchar *\*U convention. In XDR language, strings are declared using the +\*Qstring\*U keyword, and compiled into \*Qchar *\*Us in the output header +file. The maximum size contained in the angle brackets specifies the +maximum number of characters allowed in the strings (not counting the +.I NULL +character). The maximum size may be left off, indicating a string +of arbitrary length. +.LP +Examples: +.DS L +.ft CW + string name<32>; --> char *name; + string longname<>; --> char *longname; +.DE +.B "Opaque Data:" +Opaque data is used in RPC and XDR to describe untyped data, that is, +just sequences of arbitrary bytes. It may be declared either as a +fixed or variable length array. +.DS L +Examples: +.ft CW + opaque diskblock[512]; --> char diskblock[512]; + + opaque filedata<1024>; --> struct { + u_int filedata_len; + char *filedata_val; + } filedata; +.DE +.B Voids: +In a void declaration, the variable is not named. The declaration is +just \*Qvoid\*U and nothing else. Void declarations can only occur in two +places: union definitions and program definitions (as the argument or +result of a remote procedure). diff --git a/share/doc/psd/22.rpcgen/stubs b/share/doc/psd/22.rpcgen/stubs new file mode 100644 index 0000000..78b0a2c --- /dev/null +++ b/share/doc/psd/22.rpcgen/stubs @@ -0,0 +1,3 @@ +.\" $FreeBSD$ +.\" +.if t .ftr L CR diff --git a/share/doc/psd/23.rpc/Makefile b/share/doc/psd/23.rpc/Makefile index 77849b6..930c677 100644 --- a/share/doc/psd/23.rpc/Makefile +++ b/share/doc/psd/23.rpc/Makefile @@ -5,6 +5,5 @@ SRCS= stubs rpc.prog.ms MACROS= -ms USE_TBL= USE_PIC= -SRCDIR= ${.CURDIR}/../../../../lib/libc/rpc/PSD.doc .include diff --git a/share/doc/psd/23.rpc/rpc.prog.ms b/share/doc/psd/23.rpc/rpc.prog.ms new file mode 100644 index 0000000..8b79130 --- /dev/null +++ b/share/doc/psd/23.rpc/rpc.prog.ms @@ -0,0 +1,2686 @@ +.\" +.\" Must use -- tbl and pic -- with this one +.\" +.\" @(#)rpc.prog.ms 2.3 88/08/11 4.0 RPCSRC +.\" $FreeBSD$ +.\" +.de BT +.if \\n%=1 .tl ''- % -'' +.. +.nr OF 0 +.ND +.\" prevent excess underlining in nroff +.if n .fp 2 R +.OH 'Remote Procedure Call Programming Guide''Page %' +.EH 'Page %''Remote Procedure Call Programming Guide' +.SH +\&Remote Procedure Call Programming Guide +.nr OF 1 +.IX "Network Programming" "" "" "" PAGE MAJOR +.IX "RPC Programming Guide" +.LP +This document assumes a working knowledge of network theory. It is +intended for programmers who wish to write network applications using +remote procedure calls (explained below), and who want to understand +the RPC mechanisms usually hidden by the +.I rpcgen(1) +protocol compiler. +.I rpcgen +is described in detail in the previous chapter, the +.I "\fBrpcgen\fP \fIProgramming Guide\fP". +.SH +Note: +.I +.IX rpcgen "" \fIrpcgen\fP +Before attempting to write a network application, or to convert an +existing non-network application to run over the network, you may want to +understand the material in this chapter. However, for most applications, +you can circumvent the need to cope with the details presented here by using +.I rpcgen . +The +.I "Generating XDR Routines" +section of that chapter contains the complete source for a working RPC +service\(ema remote directory listing service which uses +.I rpcgen +to generate XDR routines as well as client and server stubs. +.LP +.LP +What are remote procedure calls? Simply put, they are the high-level +communications paradigm used in the operating system. +RPC presumes the existence of +low-level networking mechanisms (such as TCP/IP and UDP/IP), and upon them +it implements a logical client to server communications system designed +specifically for the support of network applications. With RPC, the client +makes a procedure call to send a data packet to the server. When the +packet arrives, the server calls a dispatch routine, performs whatever +service is requested, sends back the reply, and the procedure call returns +to the client. +.NH 0 +\&Layers of RPC +.IX "layers of RPC" +.IX "RPC" "layers" +.LP +The RPC interface can be seen as being divided into three layers.\** +.FS +For a complete specification of the routines in the remote procedure +call Library, see the +.I rpc(3N) +manual page. +.FE +.LP +.I "The Highest Layer:" +.IX RPC "The Highest Layer" +The highest layer is totally transparent to the operating system, +machine and network upon which is is run. It's probably best to +think of this level as a way of +.I using +RPC, rather than as +a \fIpart of\fP RPC proper. Programmers who write RPC routines +should (almost) always make this layer available to others by way +of a simple C front end that entirely hides the networking. +.LP +To illustrate, at this level a program can simply make a call to +.I rnusers (), +a C routine which returns the number of users on a remote machine. +The user is not explicitly aware of using RPC \(em they simply +call a procedure, just as they would call +.I malloc() . +.LP +.I "The Middle Layer:" +.IX RPC "The Middle Layer" +The middle layer is really \*QRPC proper.\*U Here, the user doesn't +need to consider details about sockets, the UNIX system, or other low-level +implementation mechanisms. They simply make remote procedure calls +to routines on other machines. The selling point here is simplicity. +It's this layer that allows RPC to pass the \*Qhello world\*U test \(em +simple things should be simple. The middle-layer routines are used +for most applications. +.LP +RPC calls are made with the system routines +.I registerrpc() +.I callrpc() +and +.I svc_run (). +The first two of these are the most fundamental: +.I registerrpc() +obtains a unique system-wide procedure-identification number, and +.I callrpc() +actually executes a remote procedure call. At the middle level, a +call to +.I rnusers() +is implemented by way of these two routines. +.LP +The middle layer is unfortunately rarely used in serious programming +due to its inflexibility (simplicity). It does not allow timeout +specifications or the choice of transport. It allows no UNIX +process control or flexibility in case of errors. It doesn't support +multiple kinds of call authentication. The programmer rarely needs +all these kinds of control, but one or two of them is often necessary. +.LP +.I "The Lowest Layer:" +.IX RPC "The Lowest Layer" +The lowest layer does allow these details to be controlled by the +programmer, and for that reason it is often necessary. Programs +written at this level are also most efficient, but this is rarely a +real issue \(em since RPC clients and servers rarely generate +heavy network loads. +.LP +Although this document only discusses the interface to C, +remote procedure calls can be made from any language. +Even though this document discusses RPC +when it is used to communicate +between processes on different machines, +it works just as well for communication +between different processes on the same machine. +.br +.KS +.NH 2 +\&The RPC Paradigm +.IX RPC paradigm +.LP +Here is a diagram of the RPC paradigm: +.LP +\fBFigure 1-1\fI Network Communication with the Remote Reocedure Call\fR +.LP +.PS +L1: arrow down 1i "client " rjust "program " rjust +L2: line right 1.5i "\fIcallrpc\fP" "function" +move up 1.5i; line dotted down 6i; move up 4.5i +arrow right 1i +L3: arrow down 1i "invoke " rjust "service " rjust +L4: arrow right 1.5i "call" "service" +L5: arrow down 1i " service" ljust " executes" ljust +L6: arrow left 1.5i "\fIreturn\fP" "answer" +L7: arrow down 1i "request " rjust "completed " rjust +L8: line left 1i +arrow left 1.5i "\fIreturn\fP" "reply" +L9: arrow down 1i "program " rjust "continues " rjust +line dashed down from L2 to L9 +line dashed down from L4 to L7 +line dashed up 1i from L3 "service " rjust "daemon " rjust +arrow dashed down 1i from L8 +move right 1i from L3 +box invis "Machine B" +move left 1.2i from L2; move down +box invis "Machine A" +.PE +.KE +.KS +.NH 1 +\&Higher Layers of RPC +.NH 2 +\&Highest Layer +.IX "highest layer of RPC" +.IX RPC "highest layer" +.LP +Imagine you're writing a program that needs to know +how many users are logged into a remote machine. +You can do this by calling the RPC library routine +.I rnusers() +as illustrated below: +.ie t .DS +.el .DS L +.ft CW +#include + +main(argc, argv) + int argc; + char **argv; +{ + int num; + + if (argc != 2) { + fprintf(stderr, "usage: rnusers hostname\en"); + exit(1); + } + if ((num = rnusers(argv[1])) < 0) { + fprintf(stderr, "error: rnusers\en"); + exit(-1); + } + printf("%d users on %s\en", num, argv[1]); + exit(0); +} +.DE +.KE +RPC library routines such as +.I rnusers() +are in the RPC services library +.I librpcsvc.a +Thus, the program above should be compiled with +.DS +.ft CW +% cc \fIprogram.c -lrpcsvc\fP +.DE +.I rnusers (), +like the other RPC library routines, is documented in section 3R +of the +.I "System Interface Manual for the Sun Workstation" , +the same section which documents the standard Sun RPC services. +.IX "RPC Services" +See the +.I intro(3R) +manual page for an explanation of the documentation strategy +for these services and their RPC protocols. +.LP +Here are some of the RPC service library routines available to the +C programmer: +.LP +\fBTable 3-3\fI RPC Service Library Routines\fR +.TS +box tab (&) ; +cfI cfI +lfL l . +Routine&Description +_ +.sp .5 +rnusers&Return number of users on remote machine +rusers&Return information about users on remote machine +havedisk&Determine if remote machine has disk +rstats&Get performance data from remote kernel +rwall&Write to specified remote machines +yppasswd&Update user password in Yellow Pages +.TE +.LP +Other RPC services \(em for example +.I ether() +.I mount +.I rquota() +and +.I spray +\(em are not available to the C programmer as library routines. +They do, however, +have RPC program numbers so they can be invoked with +.I callrpc() +which will be discussed in the next section. Most of them also +have compilable +.I rpcgen(1) +protocol description files. (The +.I rpcgen +protocol compiler radically simplifies the process of developing +network applications. +See the \fBrpcgen\fI Programming Guide\fR +for detailed information about +.I rpcgen +and +.I rpcgen +protocol description files). +.KS +.NH 2 +\&Intermediate Layer +.IX "intermediate layer of RPC" +.IX "RPC" "intermediate layer" +.LP +The simplest interface, which explicitly makes RPC calls, uses the +functions +.I callrpc() +and +.I registerrpc() +Using this method, the number of remote users can be gotten as follows: +.ie t .DS +.el .DS L +#include +#include +#include +#include + +main(argc, argv) + int argc; + char **argv; +{ + unsigned long nusers; + int stat; + + if (argc != 2) { + fprintf(stderr, "usage: nusers hostname\en"); + exit(-1); + } + if (stat = callrpc(argv[1], + RUSERSPROG, RUSERSVERS, RUSERSPROC_NUM, + xdr_void, 0, xdr_u_long, &nusers) != 0) { + clnt_perrno(stat); + exit(1); + } + printf("%d users on %s\en", nusers, argv[1]); + exit(0); +} +.DE +.KE +Each RPC procedure is uniquely defined by a program number, +version number, and procedure number. The program number +specifies a group of related remote procedures, each of +which has a different procedure number. Each program also +has a version number, so when a minor change is made to a +remote service (adding a new procedure, for example), a new +program number doesn't have to be assigned. When you want +to call a procedure to find the number of remote users, you +look up the appropriate program, version and procedure numbers +in a manual, just as you look up the name of a memory allocator +when you want to allocate memory. +.LP +The simplest way of making remote procedure calls is with the the RPC +library routine +.I callrpc() +It has eight parameters. The first is the name of the remote server +machine. The next three parameters are the program, version, and procedure +numbers\(emtogether they identify the procedure to be called. +The fifth and sixth parameters are an XDR filter and an argument to +be encoded and passed to the remote procedure. +The final two parameters are a filter for decoding the results +returned by the remote procedure and a pointer to the place where +the procedure's results are to be stored. Multiple arguments and +results are handled by embedding them in structures. If +.I callrpc() +completes successfully, it returns zero; else it returns a nonzero +value. The return codes (of type +.IX "enum clnt_stat (in RPC programming)" "" "\fIenum clnt_stat\fP (in RPC programming)" +cast into an integer) are found in +.I . +.LP +Since data types may be represented differently on different machines, +.I callrpc() +needs both the type of the RPC argument, as well as +a pointer to the argument itself (and similarly for the result). For +.I RUSERSPROC_NUM , +the return value is an +.I "unsigned long" +so +.I callrpc() +has +.I xdr_u_long() +as its first return parameter, which says +that the result is of type +.I "unsigned long" +and +.I &nusers +as its second return parameter, +which is a pointer to where the long result will be placed. Since +.I RUSERSPROC_NUM +takes no argument, the argument parameter of +.I callrpc() +is +.I xdr_void (). +.LP +After trying several times to deliver a message, if +.I callrpc() +gets no answer, it returns with an error code. +The delivery mechanism is UDP, +which stands for User Datagram Protocol. +Methods for adjusting the number of retries +or for using a different protocol require you to use the lower +layer of the RPC library, discussed later in this document. +The remote server procedure +corresponding to the above might look like this: +.ie t .DS +.el .DS L +.ft CW +.ft CW +char * +nuser(indata) + char *indata; +{ + unsigned long nusers; + +.ft I + /* + * Code here to compute the number of users + * and place result in variable \fInusers\fP. + */ +.ft CW + return((char *)&nusers); +} +.DE +.LP +It takes one argument, which is a pointer to the input +of the remote procedure call (ignored in our example), +and it returns a pointer to the result. +In the current version of C, +character pointers are the generic pointers, +so both the input argument and the return value are cast to +.I "char *" . +.LP +Normally, a server registers all of the RPC calls it plans +to handle, and then goes into an infinite loop waiting to service requests. +In this example, there is only a single procedure +to register, so the main body of the server would look like this: +.ie t .DS +.el .DS L +.ft CW +#include +#include +#include +#include + +char *nuser(); + +main() +{ + registerrpc(RUSERSPROG, RUSERSVERS, RUSERSPROC_NUM, + nuser, xdr_void, xdr_u_long); + svc_run(); /* \fINever returns\fP */ + fprintf(stderr, "Error: svc_run returned!\en"); + exit(1); +} +.DE +.LP +The +.I registerrpc() +routine registers a C procedure as corresponding to a +given RPC procedure number. The first three parameters, +.I RUSERPROG , +.I RUSERSVERS , +and +.I RUSERSPROC_NUM +are the program, version, and procedure numbers +of the remote procedure to be registered; +.I nuser() +is the name of the local procedure that implements the remote +procedure; and +.I xdr_void() +and +.I xdr_u_long() +are the XDR filters for the remote procedure's arguments and +results, respectively. (Multiple arguments or multiple results +are passed as structures). +.LP +Only the UDP transport mechanism can use +.I registerrpc() +thus, it is always safe in conjunction with calls generated by +.I callrpc() . +.SH +.IX "UDP 8K warning" +Warning: the UDP transport mechanism can only deal with +arguments and results less than 8K bytes in length. +.LP +.LP +After registering the local procedure, the server program's +main procedure calls +.I svc_run (), +the RPC library's remote procedure dispatcher. It is this +function that calls the remote procedures in response to RPC +call messages. Note that the dispatcher takes care of decoding +remote procedure arguments and encoding results, using the XDR +filters specified when the remote procedure was registered. +.NH 2 +\&Assigning Program Numbers +.IX "program number assignment" +.IX "assigning program numbers" +.LP +Program numbers are assigned in groups of +.I 0x20000000 +according to the following chart: +.DS +.ft CW + 0x0 - 0x1fffffff \fRDefined by Sun\fP +0x20000000 - 0x3fffffff \fRDefined by user\fP +0x40000000 - 0x5fffffff \fRTransient\fP +0x60000000 - 0x7fffffff \fRReserved\fP +0x80000000 - 0x9fffffff \fRReserved\fP +0xa0000000 - 0xbfffffff \fRReserved\fP +0xc0000000 - 0xdfffffff \fRReserved\fP +0xe0000000 - 0xffffffff \fRReserved\fP +.ft R +.DE +Sun Microsystems administers the first group of numbers, which +should be identical for all Sun customers. If a customer +develops an application that might be of general interest, that +application should be given an assigned number in the first +range. The second group of numbers is reserved for specific +customer applications. This range is intended primarily for +debugging new programs. The third group is reserved for +applications that generate program numbers dynamically. The +final groups are reserved for future use, and should not be +used. +.LP +To register a protocol specification, send a request by network +mail to +.I rpc@sun +or write to: +.DS +RPC Administrator +Sun Microsystems +2550 Garcia Ave. +Mountain View, CA 94043 +.DE +Please include a compilable +.I rpcgen +\*Q.x\*U file describing your protocol. +You will be given a unique program number in return. +.IX RPC administration +.IX administration "of RPC" +.LP +The RPC program numbers and protocol specifications +of standard Sun RPC services can be +found in the include files in +.I "/usr/include/rpcsvc" . +These services, however, constitute only a small subset +of those which have been registered. The complete list of +registered programs, as of the time when this manual was +printed, is: +.LP +\fBTable 3-2\fI RPC Registered Programs\fR +.TS H +box tab (&) ; +lfBI lfBI lfBI +lfL lfL lfI . +RPC Number&Program&Description +_ +.TH +.sp .5 +100000&PMAPPROG&portmapper +100001&RSTATPROG&remote stats +100002&RUSERSPROG&remote users +100003&NFSPROG&nfs +100004&YPPROG&Yellow Pages +100005&MOUNTPROG&mount daemon +100006&DBXPROG&remote dbx +100007&YPBINDPROG&yp binder +100008&WALLPROG&shutdown msg +100009&YPPASSWDPROG&yppasswd server +100010ÐERSTATPROGðer stats +100011&RQUOTAPROG&disk quotas +100012&SPRAYPROG&spray packets +100013&IBM3270PROG&3270 mapper +100014&IBMRJEPROG&RJE mapper +100015&SELNSVCPROG&selection service +100016&RDATABASEPROG&remote database access +100017&REXECPROG&remote execution +100018&ALICEPROG&Alice Office Automation +100019&SCHEDPROG&scheduling service +100020&LOCKPROG&local lock manager +100021&NETLOCKPROG&network lock manager +100022&X25PROG&x.25 inr protocol +100023&STATMON1PROG&status monitor 1 +100024&STATMON2PROG&status monitor 2 +100025&SELNLIBPROG&selection library +100026&BOOTPARAMPROG&boot parameters service +100027&MAZEPROG&mazewars game +100028&YPUPDATEPROG&yp update +100029&KEYSERVEPROG&key server +100030&SECURECMDPROG&secure login +100031&NETFWDIPROG&nfs net forwarder init +100032&NETFWDTPROG&nfs net forwarder trans +100033&SUNLINKMAP_PROG&sunlink MAP +100034&NETMONPROG&network monitor +100035&DBASEPROG&lightweight database +100036&PWDAUTHPROG&password authorization +100037&TFSPROG&translucent file svc +100038&NSEPROG&nse server +100039&NSE_ACTIVATE_PROG&nse activate daemon +.sp .2i +150001&PCNFSDPROG&pc passwd authorization +.sp .2i +200000&PYRAMIDLOCKINGPROG&Pyramid-locking +200001&PYRAMIDSYS5&Pyramid-sys5 +200002&CADDS_IMAGE&CV cadds_image +.sp .2i +300001&ADT_RFLOCKPROG&ADT file locking +.TE +.NH 2 +\&Passing Arbitrary Data Types +.IX "arbitrary data types" +.LP +In the previous example, the RPC call passes a single +.I "unsigned long" +RPC can handle arbitrary data structures, regardless of +different machines' byte orders or structure layout conventions, +by always converting them to a network standard called +.I "External Data Representation" +(XDR) before +sending them over the wire. +The process of converting from a particular machine representation +to XDR format is called +.I serializing , +and the reverse process is called +.I deserializing . +The type field parameters of +.I callrpc() +and +.I registerrpc() +can be a built-in procedure like +.I xdr_u_long() +in the previous example, or a user supplied one. +XDR has these built-in type routines: +.IX RPC "built-in routines" +.DS +.ft CW +xdr_int() xdr_u_int() xdr_enum() +xdr_long() xdr_u_long() xdr_bool() +xdr_short() xdr_u_short() xdr_wrapstring() +xdr_char() xdr_u_char() +.DE +Note that the routine +.I xdr_string() +exists, but cannot be used with +.I callrpc() +and +.I registerrpc (), +which only pass two parameters to their XDR routines. +.I xdr_wrapstring() +has only two parameters, and is thus OK. It calls +.I xdr_string (). +.LP +As an example of a user-defined type routine, +if you wanted to send the structure +.DS +.ft CW +struct simple { + int a; + short b; +} simple; +.DE +then you would call +.I callrpc() +as +.DS +.ft CW +callrpc(hostname, PROGNUM, VERSNUM, PROCNUM, + xdr_simple, &simple ...); +.DE +where +.I xdr_simple() +is written as: +.ie t .DS +.el .DS L +.ft CW +#include + +xdr_simple(xdrsp, simplep) + XDR *xdrsp; + struct simple *simplep; +{ + if (!xdr_int(xdrsp, &simplep->a)) + return (0); + if (!xdr_short(xdrsp, &simplep->b)) + return (0); + return (1); +} +.DE +.LP +An XDR routine returns nonzero (true in the sense of C) if it +completes successfully, and zero otherwise. +A complete description of XDR is in the +.I "XDR Protocol Specification" +section of this manual, only few implementation examples are +given here. +.LP +In addition to the built-in primitives, +there are also the prefabricated building blocks: +.DS +.ft CW +xdr_array() xdr_bytes() xdr_reference() +xdr_vector() xdr_union() xdr_pointer() +xdr_string() xdr_opaque() +.DE +To send a variable array of integers, +you might package them up as a structure like this +.DS +.ft CW +struct varintarr { + int *data; + int arrlnth; +} arr; +.DE +and make an RPC call such as +.DS +.ft CW +callrpc(hostname, PROGNUM, VERSNUM, PROCNUM, + xdr_varintarr, &arr...); +.DE +with +.I xdr_varintarr() +defined as: +.ie t .DS +.el .DS L +.ft CW +xdr_varintarr(xdrsp, arrp) + XDR *xdrsp; + struct varintarr *arrp; +{ + return (xdr_array(xdrsp, &arrp->data, &arrp->arrlnth, + MAXLEN, sizeof(int), xdr_int)); +} +.DE +This routine takes as parameters the XDR handle, +a pointer to the array, a pointer to the size of the array, +the maximum allowable array size, +the size of each array element, +and an XDR routine for handling each array element. +.KS +.LP +If the size of the array is known in advance, one can use +.I xdr_vector (), +which serializes fixed-length arrays. +.ie t .DS +.el .DS L +.ft CW +int intarr[SIZE]; + +xdr_intarr(xdrsp, intarr) + XDR *xdrsp; + int intarr[]; +{ + int i; + + return (xdr_vector(xdrsp, intarr, SIZE, sizeof(int), + xdr_int)); +} +.DE +.KE +.LP +XDR always converts quantities to 4-byte multiples when serializing. +Thus, if either of the examples above involved characters +instead of integers, each character would occupy 32 bits. +That is the reason for the XDR routine +.I xdr_bytes() +which is like +.I xdr_array() +except that it packs characters; +.I xdr_bytes() +has four parameters, similar to the first four parameters of +.I xdr_array (). +For null-terminated strings, there is also the +.I xdr_string() +routine, which is the same as +.I xdr_bytes() +without the length parameter. +On serializing it gets the string length from +.I strlen (), +and on deserializing it creates a null-terminated string. +.LP +Here is a final example that calls the previously written +.I xdr_simple() +as well as the built-in functions +.I xdr_string() +and +.I xdr_reference (), +which chases pointers: +.ie t .DS +.el .DS L +.ft CW +struct finalexample { + char *string; + struct simple *simplep; +} finalexample; + +xdr_finalexample(xdrsp, finalp) + XDR *xdrsp; + struct finalexample *finalp; +{ + + if (!xdr_string(xdrsp, &finalp->string, MAXSTRLEN)) + return (0); + if (!xdr_reference(xdrsp, &finalp->simplep, + sizeof(struct simple), xdr_simple); + return (0); + return (1); +} +.DE +Note that we could as easily call +.I xdr_simple() +here instead of +.I xdr_reference (). +.NH 1 +\&Lowest Layer of RPC +.IX "lowest layer of RPC" +.IX "RPC" "lowest layer" +.LP +In the examples given so far, +RPC takes care of many details automatically for you. +In this section, we'll show you how you can change the defaults +by using lower layers of the RPC library. +It is assumed that you are familiar with sockets +and the system calls for dealing with them. +.LP +There are several occasions when you may need to use lower layers of +RPC. First, you may need to use TCP, since the higher layer uses UDP, +which restricts RPC calls to 8K bytes of data. Using TCP permits calls +to send long streams of data. +For an example, see the +.I TCP +section below. Second, you may want to allocate and free memory +while serializing or deserializing with XDR routines. +There is no call at the higher level to let +you free memory explicitly. +For more explanation, see the +.I "Memory Allocation with XDR" +section below. +Third, you may need to perform authentication +on either the client or server side, by supplying +credentials or verifying them. +See the explanation in the +.I Authentication +section below. +.NH 2 +\&More on the Server Side +.IX RPC "server side" +.LP +The server for the +.I nusers() +program shown below does the same thing as the one using +.I registerrpc() +above, but is written using a lower layer of the RPC package: +.ie t .DS +.el .DS L +.ft CW +#include +#include +#include +#include + +main() +{ + SVCXPRT *transp; + int nuser(); + + transp = svcudp_create(RPC_ANYSOCK); + if (transp == NULL){ + fprintf(stderr, "can't create an RPC server\en"); + exit(1); + } + pmap_unset(RUSERSPROG, RUSERSVERS); + if (!svc_register(transp, RUSERSPROG, RUSERSVERS, + nuser, IPPROTO_UDP)) { + fprintf(stderr, "can't register RUSER service\en"); + exit(1); + } + svc_run(); /* \fINever returns\fP */ + fprintf(stderr, "should never reach this point\en"); +} + +nuser(rqstp, transp) + struct svc_req *rqstp; + SVCXPRT *transp; +{ + unsigned long nusers; + + switch (rqstp->rq_proc) { + case NULLPROC: + if (!svc_sendreply(transp, xdr_void, 0)) + fprintf(stderr, "can't reply to RPC call\en"); + return; + case RUSERSPROC_NUM: +.ft I + /* + * Code here to compute the number of users + * and assign it to the variable \fInusers\fP + */ +.ft CW + if (!svc_sendreply(transp, xdr_u_long, &nusers)) + fprintf(stderr, "can't reply to RPC call\en"); + return; + default: + svcerr_noproc(transp); + return; + } +} +.DE +.LP +First, the server gets a transport handle, which is used +for receiving and replying to RPC messages. +.I registerrpc() +uses +.I svcudp_create() +to get a UDP handle. +If you require a more reliable protocol, call +.I svctcp_create() +instead. +If the argument to +.I svcudp_create() +is +.I RPC_ANYSOCK +the RPC library creates a socket +on which to receive and reply to RPC calls. Otherwise, +.I svcudp_create() +expects its argument to be a valid socket number. +If you specify your own socket, it can be bound or unbound. +If it is bound to a port by the user, the port numbers of +.I svcudp_create() +and +.I clnttcp_create() +(the low-level client routine) must match. +.LP +If the user specifies the +.I RPC_ANYSOCK +argument, the RPC library routines will open sockets. +Otherwise they will expect the user to do so. The routines +.I svcudp_create() +and +.I clntudp_create() +will cause the RPC library routines to +.I bind() +their socket if it is not bound already. +.LP +A service may choose to register its port number with the +local portmapper service. This is done is done by specifying +a non-zero protocol number in +.I svc_register (). +Incidently, a client can discover the server's port number by +consulting the portmapper on their server's machine. This can +be done automatically by specifying a zero port number in +.I clntudp_create() +or +.I clnttcp_create (). +.LP +After creating an +.I SVCXPRT , +the next step is to call +.I pmap_unset() +so that if the +.I nusers() +server crashed earlier, +any previous trace of it is erased before restarting. +More precisely, +.I pmap_unset() +erases the entry for +.I RUSERSPROG +from the port mapper's tables. +.LP +Finally, we associate the program number for +.I nusers() +with the procedure +.I nuser (). +The final argument to +.I svc_register() +is normally the protocol being used, +which, in this case, is +.I IPPROTO_UDP +Notice that unlike +.I registerrpc (), +there are no XDR routines involved +in the registration process. +Also, registration is done on the program, +rather than procedure, level. +.LP +The user routine +.I nuser() +must call and dispatch the appropriate XDR routines +based on the procedure number. +Note that +two things are handled by +.I nuser() +that +.I registerrpc() +handles automatically. +The first is that procedure +.I NULLPROC +(currently zero) returns with no results. +This can be used as a simple test +for detecting if a remote program is running. +Second, there is a check for invalid procedure numbers. +If one is detected, +.I svcerr_noproc() +is called to handle the error. +.KS +.LP +The user service routine serializes the results and returns +them to the RPC caller via +.I svc_sendreply() +Its first parameter is the +.I SVCXPRT +handle, the second is the XDR routine, +and the third is a pointer to the data to be returned. +Not illustrated above is how a server +handles an RPC program that receives data. +As an example, we can add a procedure +.I RUSERSPROC_BOOL +which has an argument +.I nusers (), +and returns +.I TRUE +or +.I FALSE +depending on whether there are nusers logged on. +It would look like this: +.ie t .DS +.el .DS L +.ft CW +case RUSERSPROC_BOOL: { + int bool; + unsigned nuserquery; + + if (!svc_getargs(transp, xdr_u_int, &nuserquery) { + svcerr_decode(transp); + return; + } +.ft I + /* + * Code to set \fInusers\fP = number of users + */ +.ft CW + if (nuserquery == nusers) + bool = TRUE; + else + bool = FALSE; + if (!svc_sendreply(transp, xdr_bool, &bool)) { + fprintf(stderr, "can't reply to RPC call\en"); + return (1); + } + return; +} +.DE +.KE +.LP +The relevant routine is +.I svc_getargs() +which takes an +.I SVCXPRT +handle, the XDR routine, +and a pointer to where the input is to be placed as arguments. +.NH 2 +\&Memory Allocation with XDR +.IX "memory allocation with XDR" +.IX XDR "memory allocation" +.LP +XDR routines not only do input and output, +they also do memory allocation. +This is why the second parameter of +.I xdr_array() +is a pointer to an array, rather than the array itself. +If it is +.I NULL , +then +.I xdr_array() +allocates space for the array and returns a pointer to it, +putting the size of the array in the third argument. +As an example, consider the following XDR routine +.I xdr_chararr1() +which deals with a fixed array of bytes with length +.I SIZE . +.ie t .DS +.el .DS L +.ft CW +xdr_chararr1(xdrsp, chararr) + XDR *xdrsp; + char chararr[]; +{ + char *p; + int len; + + p = chararr; + len = SIZE; + return (xdr_bytes(xdrsp, &p, &len, SIZE)); +} +.DE +If space has already been allocated in +.I chararr , +it can be called from a server like this: +.ie t .DS +.el .DS L +.ft CW +char chararr[SIZE]; + +svc_getargs(transp, xdr_chararr1, chararr); +.DE +If you want XDR to do the allocation, +you would have to rewrite this routine in the following way: +.ie t .DS +.el .DS L +.ft CW +xdr_chararr2(xdrsp, chararrp) + XDR *xdrsp; + char **chararrp; +{ + int len; + + len = SIZE; + return (xdr_bytes(xdrsp, charrarrp, &len, SIZE)); +} +.DE +Then the RPC call might look like this: +.ie t .DS +.el .DS L +.ft CW +char *arrptr; + +arrptr = NULL; +svc_getargs(transp, xdr_chararr2, &arrptr); +.ft I +/* + * Use the result here + */ +.ft CW +svc_freeargs(transp, xdr_chararr2, &arrptr); +.DE +Note that, after being used, the character array can be freed with +.I svc_freeargs() +.I svc_freeargs() +will not attempt to free any memory if the variable indicating it +is NULL. For example, in the the routine +.I xdr_finalexample (), +given earlier, if +.I finalp->string +was NULL, then it would not be freed. The same is true for +.I finalp->simplep . +.LP +To summarize, each XDR routine is responsible +for serializing, deserializing, and freeing memory. +When an XDR routine is called from +.I callrpc() +the serializing part is used. +When called from +.I svc_getargs() +the deserializer is used. +And when called from +.I svc_freeargs() +the memory deallocator is used. When building simple examples like those +in this section, a user doesn't have to worry +about the three modes. +See the +.I "External Data Representation: Sun Technical Notes" +for examples of more sophisticated XDR routines that determine +which of the three modes they are in and adjust their behavior accordingly. +.KS +.NH 2 +\&The Calling Side +.IX RPC "calling side" +.LP +When you use +.I callrpc() +you have no control over the RPC delivery +mechanism or the socket used to transport the data. +To illustrate the layer of RPC that lets you adjust these +parameters, consider the following code to call the +.I nusers +service: +.ie t .DS +.el .DS L +.ft CW +.vs 11 +#include +#include +#include +#include +#include +#include +#include + +main(argc, argv) + int argc; + char **argv; +{ + struct hostent *hp; + struct timeval pertry_timeout, total_timeout; + struct sockaddr_in server_addr; + int sock = RPC_ANYSOCK; + register CLIENT *client; + enum clnt_stat clnt_stat; + unsigned long nusers; + + if (argc != 2) { + fprintf(stderr, "usage: nusers hostname\en"); + exit(-1); + } + if ((hp = gethostbyname(argv[1])) == NULL) { + fprintf(stderr, "can't get addr for %s\en",argv[1]); + exit(-1); + } + pertry_timeout.tv_sec = 3; + pertry_timeout.tv_usec = 0; + bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, + hp->h_length); + server_addr.sin_family = AF_INET; + server_addr.sin_port = 0; + if ((client = clntudp_create(&server_addr, RUSERSPROG, + RUSERSVERS, pertry_timeout, &sock)) == NULL) { + clnt_pcreateerror("clntudp_create"); + exit(-1); + } + total_timeout.tv_sec = 20; + total_timeout.tv_usec = 0; + clnt_stat = clnt_call(client, RUSERSPROC_NUM, xdr_void, + 0, xdr_u_long, &nusers, total_timeout); + if (clnt_stat != RPC_SUCCESS) { + clnt_perror(client, "rpc"); + exit(-1); + } + clnt_destroy(client); + close(sock); + exit(0); +} +.vs +.DE +.KE +The low-level version of +.I callrpc() +is +.I clnt_call() +which takes a +.I CLIENT +pointer rather than a host name. The parameters to +.I clnt_call() +are a +.I CLIENT +pointer, the procedure number, +the XDR routine for serializing the argument, +a pointer to the argument, +the XDR routine for deserializing the return value, +a pointer to where the return value will be placed, +and the time in seconds to wait for a reply. +.LP +The +.I CLIENT +pointer is encoded with the transport mechanism. +.I callrpc() +uses UDP, thus it calls +.I clntudp_create() +to get a +.I CLIENT +pointer. To get TCP (Transmission Control Protocol), you would use +.I clnttcp_create() . +.LP +The parameters to +.I clntudp_create() +are the server address, the program number, the version number, +a timeout value (between tries), and a pointer to a socket. +The final argument to +.I clnt_call() +is the total time to wait for a response. +Thus, the number of tries is the +.I clnt_call() +timeout divided by the +.I clntudp_create() +timeout. +.LP +Note that the +.I clnt_destroy() +call +always deallocates the space associated with the +.I CLIENT +handle. It closes the socket associated with the +.I CLIENT +handle, however, only if the RPC library opened it. It the +socket was opened by the user, it stays open. This makes it +possible, in cases where there are multiple client handles +using the same socket, to destroy one handle without closing +the socket that other handles are using. +.LP +To make a stream connection, the call to +.I clntudp_create() +is replaced with a call to +.I clnttcp_create() . +.DS +.ft CW +clnttcp_create(&server_addr, prognum, versnum, &sock, + inputsize, outputsize); +.DE +There is no timeout argument; instead, the receive and send buffer +sizes must be specified. When the +.I clnttcp_create() +call is made, a TCP connection is established. +All RPC calls using that +.I CLIENT +handle would use this connection. +The server side of an RPC call using TCP has +.I svcudp_create() +replaced by +.I svctcp_create() . +.DS +.ft CW +transp = svctcp_create(RPC_ANYSOCK, 0, 0); +.DE +The last two arguments to +.I svctcp_create() +are send and receive sizes respectively. If `0' is specified for +either of these, the system chooses a reasonable default. +.KS +.NH 1 +\&Other RPC Features +.IX "RPC" "miscellaneous features" +.IX "miscellaneous RPC features" +.LP +This section discusses some other aspects of RPC +that are occasionally useful. +.NH 2 +\&Select on the Server Side +.IX RPC select() RPC \fIselect()\fP +.IX select() "" \fIselect()\fP "on the server side" +.LP +Suppose a process is processing RPC requests +while performing some other activity. +If the other activity involves periodically updating a data structure, +the process can set an alarm signal before calling +.I svc_run() +But if the other activity +involves waiting on a file descriptor, the +.I svc_run() +call won't work. +The code for +.I svc_run() +is as follows: +.ie t .DS +.el .DS L +.ft CW +.vs 11 +void +svc_run() +{ + fd_set readfds; + int dtbsz = getdtablesize(); + + for (;;) { + readfds = svc_fds; + switch (select(dtbsz, &readfds, NULL,NULL,NULL)) { + + case -1: + if (errno == EINTR) + continue; + perror("select"); + return; + case 0: + break; + default: + svc_getreqset(&readfds); + } + } +} +.vs +.DE +.KE +.LP +You can bypass +.I svc_run() +and call +.I svc_getreqset() +yourself. +All you need to know are the file descriptors +of the socket(s) associated with the programs you are waiting on. +Thus you can have your own +.I select() +.IX select() "" \fIselect()\fP +that waits on both the RPC socket, +and your own descriptors. Note that +.I svc_fds() +is a bit mask of all the file descriptors that RPC is using for +services. It can change everytime that +.I any +RPC library routine is called, because descriptors are constantly +being opened and closed, for example for TCP connections. +.NH 2 +\&Broadcast RPC +.IX "broadcast RPC" +.IX RPC "broadcast" +.LP +The +.I portmapper +is a daemon that converts RPC program numbers +into DARPA protocol port numbers; see the +.I portmap +man page. You can't do broadcast RPC without the portmapper. +Here are the main differences between +broadcast RPC and normal RPC calls: +.IP 1. +Normal RPC expects one answer, whereas +broadcast RPC expects many answers +(one or more answer from each responding machine). +.IP 2. +Broadcast RPC can only be supported by packet-oriented (connectionless) +transport protocols like UPD/IP. +.IP 3. +The implementation of broadcast RPC +treats all unsuccessful responses as garbage by filtering them out. +Thus, if there is a version mismatch between the +broadcaster and a remote service, +the user of broadcast RPC never knows. +.IP 4. +All broadcast messages are sent to the portmap port. +Thus, only services that register themselves with their portmapper +are accessible via the broadcast RPC mechanism. +.IP 5. +Broadcast requests are limited in size to the MTU (Maximum Transfer +Unit) of the local network. For Ethernet, the MTU is 1500 bytes. +.KS +.NH 3 +\&Broadcast RPC Synopsis +.IX "broadcast RPC" synopsis +.IX "RPC" "broadcast synopsis" +.ie t .DS +.el .DS L +.ft CW +#include + . . . +enum clnt_stat clnt_stat; + . . . +clnt_stat = clnt_broadcast(prognum, versnum, procnum, + inproc, in, outproc, out, eachresult) + u_long prognum; /* \fIprogram number\fP */ + u_long versnum; /* \fIversion number\fP */ + u_long procnum; /* \fIprocedure number\fP */ + xdrproc_t inproc; /* \fIxdr routine for args\fP */ + caddr_t in; /* \fIpointer to args\fP */ + xdrproc_t outproc; /* \fIxdr routine for results\fP */ + caddr_t out; /* \fIpointer to results\fP */ + bool_t (*eachresult)();/* \fIcall with each result gotten\fP */ +.DE +.KE +The procedure +.I eachresult() +is called each time a valid result is obtained. +It returns a boolean that indicates +whether or not the user wants more responses. +.ie t .DS +.el .DS L +.ft CW +bool_t done; + . . . +done = eachresult(resultsp, raddr) + caddr_t resultsp; + struct sockaddr_in *raddr; /* \fIAddr of responding machine\fP */ +.DE +If +.I done +is +.I TRUE , +then broadcasting stops and +.I clnt_broadcast() +returns successfully. +Otherwise, the routine waits for another response. +The request is rebroadcast +after a few seconds of waiting. +If no responses come back, +the routine returns with +.I RPC_TIMEDOUT . +.NH 2 +\&Batching +.IX "batching" +.IX RPC "batching" +.LP +The RPC architecture is designed so that clients send a call message, +and wait for servers to reply that the call succeeded. +This implies that clients do not compute +while servers are processing a call. +This is inefficient if the client does not want or need +an acknowledgement for every message sent. +It is possible for clients to continue computing +while waiting for a response, +using RPC batch facilities. +.LP +RPC messages can be placed in a \*Qpipeline\*U of calls +to a desired server; this is called batching. +Batching assumes that: +1) each RPC call in the pipeline requires no response from the server, +and the server does not send a response message; and +2) the pipeline of calls is transported on a reliable +byte stream transport such as TCP/IP. +Since the server does not respond to every call, +the client can generate new calls in parallel +with the server executing previous calls. +Furthermore, the TCP/IP implementation can buffer up +many call messages, and send them to the server in one +.I write() +system call. This overlapped execution +greatly decreases the interprocess communication overhead of +the client and server processes, +and the total elapsed time of a series of calls. +.LP +Since the batched calls are buffered, +the client should eventually do a nonbatched call +in order to flush the pipeline. +.LP +A contrived example of batching follows. +Assume a string rendering service (like a window system) +has two similar calls: one renders a string and returns void results, +while the other renders a string and remains silent. +The service (using the TCP/IP transport) may look like: +.ie t .DS +.el .DS L +.ft CW +#include +#include +#include + +void windowdispatch(); + +main() +{ + SVCXPRT *transp; + + transp = svctcp_create(RPC_ANYSOCK, 0, 0); + if (transp == NULL){ + fprintf(stderr, "can't create an RPC server\en"); + exit(1); + } + pmap_unset(WINDOWPROG, WINDOWVERS); + if (!svc_register(transp, WINDOWPROG, WINDOWVERS, + windowdispatch, IPPROTO_TCP)) { + fprintf(stderr, "can't register WINDOW service\en"); + exit(1); + } + svc_run(); /* \fINever returns\fP */ + fprintf(stderr, "should never reach this point\en"); +} + +void +windowdispatch(rqstp, transp) + struct svc_req *rqstp; + SVCXPRT *transp; +{ + char *s = NULL; + + switch (rqstp->rq_proc) { + case NULLPROC: + if (!svc_sendreply(transp, xdr_void, 0)) + fprintf(stderr, "can't reply to RPC call\en"); + return; + case RENDERSTRING: + if (!svc_getargs(transp, xdr_wrapstring, &s)) { + fprintf(stderr, "can't decode arguments\en"); +.ft I + /* + * Tell caller he screwed up + */ +.ft CW + svcerr_decode(transp); + break; + } +.ft I + /* + * Code here to render the string \fIs\fP + */ +.ft CW + if (!svc_sendreply(transp, xdr_void, NULL)) + fprintf(stderr, "can't reply to RPC call\en"); + break; + case RENDERSTRING_BATCHED: + if (!svc_getargs(transp, xdr_wrapstring, &s)) { + fprintf(stderr, "can't decode arguments\en"); +.ft I + /* + * We are silent in the face of protocol errors + */ +.ft CW + break; + } +.ft I + /* + * Code here to render string s, but send no reply! + */ +.ft CW + break; + default: + svcerr_noproc(transp); + return; + } +.ft I + /* + * Now free string allocated while decoding arguments + */ +.ft CW + svc_freeargs(transp, xdr_wrapstring, &s); +} +.DE +Of course the service could have one procedure +that takes the string and a boolean +to indicate whether or not the procedure should respond. +.LP +In order for a client to take advantage of batching, +the client must perform RPC calls on a TCP-based transport +and the actual calls must have the following attributes: +1) the result's XDR routine must be zero +.I NULL ), +and 2) the RPC call's timeout must be zero. +.KS +.LP +Here is an example of a client that uses batching to render a +bunch of strings; the batching is flushed when the client gets +a null string (EOF): +.ie t .DS +.el .DS L +.ft CW +.vs 11 +#include +#include +#include +#include +#include +#include + +main(argc, argv) + int argc; + char **argv; +{ + struct hostent *hp; + struct timeval pertry_timeout, total_timeout; + struct sockaddr_in server_addr; + int sock = RPC_ANYSOCK; + register CLIENT *client; + enum clnt_stat clnt_stat; + char buf[1000], *s = buf; + + if ((client = clnttcp_create(&server_addr, + WINDOWPROG, WINDOWVERS, &sock, 0, 0)) == NULL) { + perror("clnttcp_create"); + exit(-1); + } + total_timeout.tv_sec = 0; + total_timeout.tv_usec = 0; + while (scanf("%s", s) != EOF) { + clnt_stat = clnt_call(client, RENDERSTRING_BATCHED, + xdr_wrapstring, &s, NULL, NULL, total_timeout); + if (clnt_stat != RPC_SUCCESS) { + clnt_perror(client, "batched rpc"); + exit(-1); + } + } + + /* \fINow flush the pipeline\fP */ + + total_timeout.tv_sec = 20; + clnt_stat = clnt_call(client, NULLPROC, xdr_void, NULL, + xdr_void, NULL, total_timeout); + if (clnt_stat != RPC_SUCCESS) { + clnt_perror(client, "rpc"); + exit(-1); + } + clnt_destroy(client); + exit(0); +} +.vs +.DE +.KE +Since the server sends no message, +the clients cannot be notified of any of the failures that may occur. +Therefore, clients are on their own when it comes to handling errors. +.LP +The above example was completed to render +all of the (2000) lines in the file +.I /etc/termcap . +The rendering service did nothing but throw the lines away. +The example was run in the following four configurations: +1) machine to itself, regular RPC; +2) machine to itself, batched RPC; +3) machine to another, regular RPC; and +4) machine to another, batched RPC. +The results are as follows: +1) 50 seconds; +2) 16 seconds; +3) 52 seconds; +4) 10 seconds. +Running +.I fscanf() +on +.I /etc/termcap +only requires six seconds. +These timings show the advantage of protocols +that allow for overlapped execution, +though these protocols are often hard to design. +.NH 2 +\&Authentication +.IX "authentication" +.IX "RPC" "authentication" +.LP +In the examples presented so far, +the caller never identified itself to the server, +and the server never required an ID from the caller. +Clearly, some network services, such as a network filesystem, +require stronger security than what has been presented so far. +.LP +In reality, every RPC call is authenticated by +the RPC package on the server, and similarly, +the RPC client package generates and sends authentication parameters. +Just as different transports (TCP/IP or UDP/IP) +can be used when creating RPC clients and servers, +different forms of authentication can be associated with RPC clients; +the default authentication type used as a default is type +.I none . +.LP +The authentication subsystem of the RPC package is open ended. +That is, numerous types of authentication are easy to support. +.NH 3 +\&UNIX Authentication +.IX "UNIX Authentication" +.IP "\fIThe Client Side\fP" +.LP +When a caller creates a new RPC client handle as in: +.DS +.ft CW +clnt = clntudp_create(address, prognum, versnum, + wait, sockp) +.DE +the appropriate transport instance defaults +the associate authentication handle to be +.DS +.ft CW +clnt->cl_auth = authnone_create(); +.DE +The RPC client can choose to use +.I UNIX +style authentication by setting +.I clnt\->cl_auth +after creating the RPC client handle: +.DS +.ft CW +clnt->cl_auth = authunix_create_default(); +.DE +This causes each RPC call associated with +.I clnt +to carry with it the following authentication credentials structure: +.ie t .DS +.el .DS L +.ft I +/* + * UNIX style credentials. + */ +.ft CW +struct authunix_parms { + u_long aup_time; /* \fIcredentials creation time\fP */ + char *aup_machname; /* \fIhost name where client is\fP */ + int aup_uid; /* \fIclient's UNIX effective uid\fP */ + int aup_gid; /* \fIclient's current group id\fP */ + u_int aup_len; /* \fIelement length of aup_gids\fP */ + int *aup_gids; /* \fIarray of groups user is in\fP */ +}; +.DE +These fields are set by +.I authunix_create_default() +by invoking the appropriate system calls. +Since the RPC user created this new style of authentication, +the user is responsible for destroying it with: +.DS +.ft CW +auth_destroy(clnt->cl_auth); +.DE +This should be done in all cases, to conserve memory. +.sp +.IP "\fIThe Server Side\fP" +.LP +Service implementors have a harder time dealing with authentication issues +since the RPC package passes the service dispatch routine a request +that has an arbitrary authentication style associated with it. +Consider the fields of a request handle passed to a service dispatch routine: +.ie t .DS +.el .DS L +.ft I +/* + * An RPC Service request + */ +.ft CW +struct svc_req { + u_long rq_prog; /* \fIservice program number\fP */ + u_long rq_vers; /* \fIservice protocol vers num\fP */ + u_long rq_proc; /* \fIdesired procedure number\fP */ + struct opaque_auth rq_cred; /* \fIraw credentials from wire\fP */ + caddr_t rq_clntcred; /* \fIcredentials (read only)\fP */ +}; +.DE +The +.I rq_cred +is mostly opaque, except for one field of interest: +the style or flavor of authentication credentials: +.ie t .DS +.el .DS L +.ft I +/* + * Authentication info. Mostly opaque to the programmer. + */ +.ft CW +struct opaque_auth { + enum_t oa_flavor; /* \fIstyle of credentials\fP */ + caddr_t oa_base; /* \fIaddress of more auth stuff\fP */ + u_int oa_length; /* \fInot to exceed \fIMAX_AUTH_BYTES */ +}; +.DE +.IX RPC guarantees +The RPC package guarantees the following +to the service dispatch routine: +.IP 1. +That the request's +.I rq_cred +is well formed. Thus the service implementor may inspect the request's +.I rq_cred.oa_flavor +to determine which style of authentication the caller used. +The service implementor may also wish to inspect the other fields of +.I rq_cred +if the style is not one of the styles supported by the RPC package. +.IP 2. +That the request's +.I rq_clntcred +field is either +.I NULL +or points to a well formed structure +that corresponds to a supported style of authentication credentials. +Remember that only +.I unix +style is currently supported, so (currently) +.I rq_clntcred +could be cast to a pointer to an +.I authunix_parms +structure. If +.I rq_clntcred +is +.I NULL , +the service implementor may wish to inspect the other (opaque) fields of +.I rq_cred +in case the service knows about a new type of authentication +that the RPC package does not know about. +.LP +Our remote users service example can be extended so that +it computes results for all users except UID 16: +.ie t .DS +.el .DS L +.ft CW +.vs 11 +nuser(rqstp, transp) + struct svc_req *rqstp; + SVCXPRT *transp; +{ + struct authunix_parms *unix_cred; + int uid; + unsigned long nusers; + +.ft I + /* + * we don't care about authentication for null proc + */ +.ft CW + if (rqstp->rq_proc == NULLPROC) { + if (!svc_sendreply(transp, xdr_void, 0)) { + fprintf(stderr, "can't reply to RPC call\en"); + return (1); + } + return; + } +.ft I + /* + * now get the uid + */ +.ft CW + switch (rqstp->rq_cred.oa_flavor) { + case AUTH_UNIX: + unix_cred = + (struct authunix_parms *)rqstp->rq_clntcred; + uid = unix_cred->aup_uid; + break; + case AUTH_NULL: + default: + svcerr_weakauth(transp); + return; + } + switch (rqstp->rq_proc) { + case RUSERSPROC_NUM: +.ft I + /* + * make sure caller is allowed to call this proc + */ +.ft CW + if (uid == 16) { + svcerr_systemerr(transp); + return; + } +.ft I + /* + * Code here to compute the number of users + * and assign it to the variable \fInusers\fP + */ +.ft CW + if (!svc_sendreply(transp, xdr_u_long, &nusers)) { + fprintf(stderr, "can't reply to RPC call\en"); + return (1); + } + return; + default: + svcerr_noproc(transp); + return; + } +} +.vs +.DE +A few things should be noted here. +First, it is customary not to check +the authentication parameters associated with the +.I NULLPROC +(procedure number zero). +Second, if the authentication parameter's type is not suitable +for your service, you should call +.I svcerr_weakauth() . +And finally, the service protocol itself should return status +for access denied; in the case of our example, the protocol +does not have such a status, so we call the service primitive +.I svcerr_systemerr() +instead. +.LP +The last point underscores the relation between +the RPC authentication package and the services; +RPC deals only with +.I authentication +and not with individual services' +.I "access control" . +The services themselves must implement their own access control policies +and reflect these policies as return statuses in their protocols. +.NH 2 +\&DES Authentication +.IX RPC DES +.IX RPC authentication +.LP +UNIX authentication is quite easy to defeat. Instead of using +.I authunix_create_default (), +one can call +.I authunix_create() +and then modify the RPC authentication handle it returns by filling in +whatever user ID and hostname they wish the server to think they have. +DES authentication is thus recommended for people who want more security +than UNIX authentication offers. +.LP +The details of the DES authentication protocol are complicated and +are not explained here. +See +.I "Remote Procedure Calls: Protocol Specification" +for the details. +.LP +In order for DES authentication to work, the +.I keyserv(8c) +daemon must be running on both the server and client machines. The +users on these machines need public keys assigned by the network +administrator in the +.I publickey(5) +database. And, they need to have decrypted their secret keys +using their login password. This automatically happens when one +logs in using +.I login(1) , +or can be done manually using +.I keylogin(1) . +The +.I "Network Services" +chapter +.\" XXX +explains more how to setup secure networking. +.sp +.IP "\fIClient Side\fP" +.LP +If a client wishes to use DES authentication, it must set its +authentication handle appropriately. Here is an example: +.DS +cl->cl_auth = + authdes_create(servername, 60, &server_addr, NULL); +.DE +The first argument is the network name or \*Qnetname\*U of the owner of +the server process. Typically, server processes are root processes +and their netname can be derived using the following call: +.DS +char servername[MAXNETNAMELEN]; + +host2netname(servername, rhostname, NULL); +.DE +Here, +.I rhostname +is the hostname of the machine the server process is running on. +.I host2netname() +fills in +.I servername +to contain this root process's netname. If the +server process was run by a regular user, one could use the call +.I user2netname() +instead. Here is an example for a server process with the same user +ID as the client: +.DS +char servername[MAXNETNAMELEN]; + +user2netname(servername, getuid(), NULL); +.DE +The last argument to both of these calls, +.I user2netname() +and +.I host2netname (), +is the name of the naming domain where the server is located. The +.I NULL +used here means \*Quse the local domain name.\*U +.LP +The second argument to +.I authdes_create() +is a lifetime for the credential. Here it is set to sixty +seconds. What that means is that the credential will expire 60 +seconds from now. If some mischievous user tries to reuse the +credential, the server RPC subsystem will recognize that it has +expired and not grant any requests. If the same mischievous user +tries to reuse the credential within the sixty second lifetime, +he will still be rejected because the server RPC subsystem +remembers which credentials it has already seen in the near past, +and will not grant requests to duplicates. +.LP +The third argument to +.I authdes_create() +is the address of the host to synchronize with. In order for DES +authentication to work, the server and client must agree upon the +time. Here we pass the address of the server itself, so the +client and server will both be using the same time: the server's +time. The argument can be +.I NULL , +which means \*Qdon't bother synchronizing.\*U You should only do this +if you are sure the client and server are already synchronized. +.LP +The final argument to +.I authdes_create() +is the address of a DES encryption key to use for encrypting +timestamps and data. If this argument is +.I NULL , +as it is in this example, a random key will be chosen. The client +may find out the encryption key being used by consulting the +.I ah_key +field of the authentication handle. +.sp +.IP "\fIServer Side\fP" +.LP +The server side is a lot simpler than the client side. Here is the +previous example rewritten to use +.I AUTH_DES +instead of +.I AUTH_UNIX : +.ie t .DS +.el .DS L +.ft CW +.vs 11 +#include +#include + . . . + . . . +nuser(rqstp, transp) + struct svc_req *rqstp; + SVCXPRT *transp; +{ + struct authdes_cred *des_cred; + int uid; + int gid; + int gidlen; + int gidlist[10]; +.ft I + /* + * we don't care about authentication for null proc + */ +.ft CW + + if (rqstp->rq_proc == NULLPROC) { + /* \fIsame as before\fP */ + } + +.ft I + /* + * now get the uid + */ +.ft CW + switch (rqstp->rq_cred.oa_flavor) { + case AUTH_DES: + des_cred = + (struct authdes_cred *) rqstp->rq_clntcred; + if (! netname2user(des_cred->adc_fullname.name, + &uid, &gid, &gidlen, gidlist)) + { + fprintf(stderr, "unknown user: %s\en", + des_cred->adc_fullname.name); + svcerr_systemerr(transp); + return; + } + break; + case AUTH_NULL: + default: + svcerr_weakauth(transp); + return; + } + +.ft I + /* + * The rest is the same as before + */ +.ft CW +.vs +.DE +Note the use of the routine +.I netname2user (), +the inverse of +.I user2netname (): +it takes a network ID and converts to a unix ID. +.I netname2user () +also supplies the group IDs which we don't use in this example, +but which may be useful to other UNIX programs. +.NH 2 +\&Using Inetd +.IX inetd "" "using \fIinetd\fP" +.LP +An RPC server can be started from +.I inetd +The only difference from the usual code is that the service +creation routine should be called in the following form: +.ie t .DS +.el .DS L +.ft CW +transp = svcudp_create(0); /* \fIFor UDP\fP */ +transp = svctcp_create(0,0,0); /* \fIFor listener TCP sockets\fP */ +transp = svcfd_create(0,0,0); /* \fIFor connected TCP sockets\fP */ +.DE +since +.I inet +passes a socket as file descriptor 0. +Also, +.I svc_register() +should be called as +.ie t .DS +.el .DS L +.ft CW +svc_register(transp, PROGNUM, VERSNUM, service, 0); +.DE +with the final flag as 0, +since the program would already be registered by +.I inetd +Remember that if you want to exit +from the server process and return control to +.I inet +you need to explicitly exit, since +.I svc_run() +never returns. +.LP +The format of entries in +.I /etc/inetd.conf +for RPC services is in one of the following two forms: +.ie t .DS +.el .DS L +.ft CW +p_name/version dgram rpc/udp wait/nowait user server args +p_name/version stream rpc/tcp wait/nowait user server args +.DE +where +.I p_name +is the symbolic name of the program as it appears in +.I rpc(5) , +.I server +is the program implementing the server, +and +.I program +and +.I version +are the program and version numbers of the service. +For more information, see +.I inetd.conf(5) . +.LP +If the same program handles multiple versions, +then the version number can be a range, +as in this example: +.ie t .DS +.el .DS L +.ft CW +rstatd/1-2 dgram rpc/udp wait root /usr/etc/rpc.rstatd +.DE +.NH 1 +\&More Examples +.sp 1 +.NH 2 +\&Versions +.IX "versions" +.IX "RPC" "versions" +.LP +By convention, the first version number of program +.I PROG +is +.I PROGVERS_ORIG +and the most recent version is +.I PROGVERS +Suppose there is a new version of the +.I user +program that returns an +.I "unsigned short" +rather than a +.I long . +If we name this version +.I RUSERSVERS_SHORT +then a server that wants to support both versions +would do a double register. +.ie t .DS +.el .DS L +.ft CW +if (!svc_register(transp, RUSERSPROG, RUSERSVERS_ORIG, + nuser, IPPROTO_TCP)) { + fprintf(stderr, "can't register RUSER service\en"); + exit(1); +} +if (!svc_register(transp, RUSERSPROG, RUSERSVERS_SHORT, + nuser, IPPROTO_TCP)) { + fprintf(stderr, "can't register RUSER service\en"); + exit(1); +} +.DE +Both versions can be handled by the same C procedure: +.ie t .DS +.el .DS L +.ft CW +.vs 11 +nuser(rqstp, transp) + struct svc_req *rqstp; + SVCXPRT *transp; +{ + unsigned long nusers; + unsigned short nusers2; + + switch (rqstp->rq_proc) { + case NULLPROC: + if (!svc_sendreply(transp, xdr_void, 0)) { + fprintf(stderr, "can't reply to RPC call\en"); + return (1); + } + return; + case RUSERSPROC_NUM: +.ft I + /* + * Code here to compute the number of users + * and assign it to the variable \fInusers\fP + */ +.ft CW + nusers2 = nusers; + switch (rqstp->rq_vers) { + case RUSERSVERS_ORIG: + if (!svc_sendreply(transp, xdr_u_long, + &nusers)) { + fprintf(stderr,"can't reply to RPC call\en"); + } + break; + case RUSERSVERS_SHORT: + if (!svc_sendreply(transp, xdr_u_short, + &nusers2)) { + fprintf(stderr,"can't reply to RPC call\en"); + } + break; + } + default: + svcerr_noproc(transp); + return; + } +} +.vs +.DE +.KS +.NH 2 +\&TCP +.IX "TCP" +.LP +Here is an example that is essentially +.I rcp. +The initiator of the RPC +.I snd +call takes its standard input and sends it to the server +.I rcv +which prints it on standard output. +The RPC call uses TCP. +This also illustrates an XDR procedure that behaves differently +on serialization than on deserialization. +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * The xdr routine: + * on decode, read from wire, write onto fp + * on encode, read from fp, write onto wire + */ +.ft CW +#include +#include + +xdr_rcp(xdrs, fp) + XDR *xdrs; + FILE *fp; +{ + unsigned long size; + char buf[BUFSIZ], *p; + + if (xdrs->x_op == XDR_FREE)/* nothing to free */ + return 1; + while (1) { + if (xdrs->x_op == XDR_ENCODE) { + if ((size = fread(buf, sizeof(char), BUFSIZ, + fp)) == 0 && ferror(fp)) { + fprintf(stderr, "can't fread\en"); + return (1); + } + } + p = buf; + if (!xdr_bytes(xdrs, &p, &size, BUFSIZ)) + return 0; + if (size == 0) + return 1; + if (xdrs->x_op == XDR_DECODE) { + if (fwrite(buf, sizeof(char), size, + fp) != size) { + fprintf(stderr, "can't fwrite\en"); + return (1); + } + } + } +} +.vs +.DE +.KE +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * The sender routines + */ +.ft CW +#include +#include +#include +#include +#include + +main(argc, argv) + int argc; + char **argv; +{ + int xdr_rcp(); + int err; + + if (argc < 2) { + fprintf(stderr, "usage: %s servername\en", argv[0]); + exit(-1); + } + if ((err = callrpctcp(argv[1], RCPPROG, RCPPROC, + RCPVERS, xdr_rcp, stdin, xdr_void, 0) != 0)) { + clnt_perrno(err); + fprintf(stderr, "can't make RPC call\en"); + exit(1); + } + exit(0); +} + +callrpctcp(host, prognum, procnum, versnum, + inproc, in, outproc, out) + char *host, *in, *out; + xdrproc_t inproc, outproc; +{ + struct sockaddr_in server_addr; + int socket = RPC_ANYSOCK; + enum clnt_stat clnt_stat; + struct hostent *hp; + register CLIENT *client; + struct timeval total_timeout; + + if ((hp = gethostbyname(host)) == NULL) { + fprintf(stderr, "can't get addr for '%s'\en", host); + return (-1); + } + bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, + hp->h_length); + server_addr.sin_family = AF_INET; + server_addr.sin_port = 0; + if ((client = clnttcp_create(&server_addr, prognum, + versnum, &socket, BUFSIZ, BUFSIZ)) == NULL) { + perror("rpctcp_create"); + return (-1); + } + total_timeout.tv_sec = 20; + total_timeout.tv_usec = 0; + clnt_stat = clnt_call(client, procnum, + inproc, in, outproc, out, total_timeout); + clnt_destroy(client); + return (int)clnt_stat; +} +.vs +.DE +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * The receiving routines + */ +.ft CW +#include +#include + +main() +{ + register SVCXPRT *transp; + int rcp_service(), xdr_rcp(); + + if ((transp = svctcp_create(RPC_ANYSOCK, + BUFSIZ, BUFSIZ)) == NULL) { + fprintf("svctcp_create: error\en"); + exit(1); + } + pmap_unset(RCPPROG, RCPVERS); + if (!svc_register(transp, + RCPPROG, RCPVERS, rcp_service, IPPROTO_TCP)) { + fprintf(stderr, "svc_register: error\en"); + exit(1); + } + svc_run(); /* \fInever returns\fP */ + fprintf(stderr, "svc_run should never return\en"); +} + +rcp_service(rqstp, transp) + register struct svc_req *rqstp; + register SVCXPRT *transp; +{ + switch (rqstp->rq_proc) { + case NULLPROC: + if (svc_sendreply(transp, xdr_void, 0) == 0) { + fprintf(stderr, "err: rcp_service"); + return (1); + } + return; + case RCPPROC_FP: + if (!svc_getargs(transp, xdr_rcp, stdout)) { + svcerr_decode(transp); + return; + } + if (!svc_sendreply(transp, xdr_void, 0)) { + fprintf(stderr, "can't reply\en"); + return; + } + return (0); + default: + svcerr_noproc(transp); + return; + } +} +.vs +.DE +.NH 2 +\&Callback Procedures +.IX RPC "callback procedures" +.LP +Occasionally, it is useful to have a server become a client, +and make an RPC call back to the process which is its client. +An example is remote debugging, +where the client is a window system program, +and the server is a debugger running on the remote machine. +Most of the time, +the user clicks a mouse button at the debugging window, +which converts this to a debugger command, +and then makes an RPC call to the server +(where the debugger is actually running), +telling it to execute that command. +However, when the debugger hits a breakpoint, the roles are reversed, +and the debugger wants to make an rpc call to the window program, +so that it can inform the user that a breakpoint has been reached. +.LP +In order to do an RPC callback, +you need a program number to make the RPC call on. +Since this will be a dynamically generated program number, +it should be in the transient range, +.I "0x40000000 - 0x5fffffff" . +The routine +.I gettransient() +returns a valid program number in the transient range, +and registers it with the portmapper. +It only talks to the portmapper running on the same machine as the +.I gettransient() +routine itself. The call to +.I pmap_set() +is a test and set operation, +in that it indivisibly tests whether a program number +has already been registered, +and if it has not, then reserves it. On return, the +.I sockp +argument will contain a socket that can be used +as the argument to an +.I svcudp_create() +or +.I svctcp_create() +call. +.ie t .DS +.el .DS L +.ft CW +.vs 11 +#include +#include +#include + +gettransient(proto, vers, sockp) + int proto, vers, *sockp; +{ + static int prognum = 0x40000000; + int s, len, socktype; + struct sockaddr_in addr; + + switch(proto) { + case IPPROTO_UDP: + socktype = SOCK_DGRAM; + break; + case IPPROTO_TCP: + socktype = SOCK_STREAM; + break; + default: + fprintf(stderr, "unknown protocol type\en"); + return 0; + } + if (*sockp == RPC_ANYSOCK) { + if ((s = socket(AF_INET, socktype, 0)) < 0) { + perror("socket"); + return (0); + } + *sockp = s; + } + else + s = *sockp; + addr.sin_addr.s_addr = 0; + addr.sin_family = AF_INET; + addr.sin_port = 0; + len = sizeof(addr); +.ft I + /* + * may be already bound, so don't check for error + */ +.ft CW + bind(s, &addr, len); + if (getsockname(s, &addr, &len)< 0) { + perror("getsockname"); + return (0); + } + while (!pmap_set(prognum++, vers, proto, + ntohs(addr.sin_port))) continue; + return (prognum-1); +} +.vs +.DE +.SH +Note: +.I +The call to +.I ntohs() +is necessary to ensure that the port number in +.I "addr.sin_port" , +which is in +.I network +byte order, is passed in +.I host +byte order (as +.I pmap_set() +expects). See the +.I byteorder(3N) +man page for more details on the conversion of network +addresses from network to host byte order. +.KS +.LP +The following pair of programs illustrate how to use the +.I gettransient() +routine. +The client makes an RPC call to the server, +passing it a transient program number. +Then the client waits around to receive a callback +from the server at that program number. +The server registers the program +.I EXAMPLEPROG +so that it can receive the RPC call +informing it of the callback program number. +Then at some random time (on receiving an +.I ALRM +signal in this example), it sends a callback RPC call, +using the program number it received earlier. +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * client + */ +.ft CW +#include +#include + +int callback(); +char hostname[256]; + +main() +{ + int x, ans, s; + SVCXPRT *xprt; + + gethostname(hostname, sizeof(hostname)); + s = RPC_ANYSOCK; + x = gettransient(IPPROTO_UDP, 1, &s); + fprintf(stderr, "client gets prognum %d\en", x); + if ((xprt = svcudp_create(s)) == NULL) { + fprintf(stderr, "rpc_server: svcudp_create\en"); + exit(1); + } +.ft I + /* protocol is 0 - gettransient does registering + */ +.ft CW + (void)svc_register(xprt, x, 1, callback, 0); + ans = callrpc(hostname, EXAMPLEPROG, EXAMPLEVERS, + EXAMPLEPROC_CALLBACK, xdr_int, &x, xdr_void, 0); + if ((enum clnt_stat) ans != RPC_SUCCESS) { + fprintf(stderr, "call: "); + clnt_perrno(ans); + fprintf(stderr, "\en"); + } + svc_run(); + fprintf(stderr, "Error: svc_run shouldn't return\en"); +} + +callback(rqstp, transp) + register struct svc_req *rqstp; + register SVCXPRT *transp; +{ + switch (rqstp->rq_proc) { + case 0: + if (!svc_sendreply(transp, xdr_void, 0)) { + fprintf(stderr, "err: exampleprog\en"); + return (1); + } + return (0); + case 1: + if (!svc_getargs(transp, xdr_void, 0)) { + svcerr_decode(transp); + return (1); + } + fprintf(stderr, "client got callback\en"); + if (!svc_sendreply(transp, xdr_void, 0)) { + fprintf(stderr, "err: exampleprog"); + return (1); + } + } +} +.vs +.DE +.KE +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* + * server + */ +.ft CW +#include +#include +#include + +char *getnewprog(); +char hostname[256]; +int docallback(); +int pnum; /* \fIprogram number for callback routine\fP */ + +main() +{ + gethostname(hostname, sizeof(hostname)); + registerrpc(EXAMPLEPROG, EXAMPLEVERS, + EXAMPLEPROC_CALLBACK, getnewprog, xdr_int, xdr_void); + fprintf(stderr, "server going into svc_run\en"); + signal(SIGALRM, docallback); + alarm(10); + svc_run(); + fprintf(stderr, "Error: svc_run shouldn't return\en"); +} + +char * +getnewprog(pnump) + char *pnump; +{ + pnum = *(int *)pnump; + return NULL; +} + +docallback() +{ + int ans; + + ans = callrpc(hostname, pnum, 1, 1, xdr_void, 0, + xdr_void, 0); + if (ans != 0) { + fprintf(stderr, "server: "); + clnt_perrno(ans); + fprintf(stderr, "\en"); + } +} +.vs +.DE diff --git a/share/doc/psd/23.rpc/stubs b/share/doc/psd/23.rpc/stubs new file mode 100644 index 0000000..78b0a2c --- /dev/null +++ b/share/doc/psd/23.rpc/stubs @@ -0,0 +1,3 @@ +.\" $FreeBSD$ +.\" +.if t .ftr L CR diff --git a/share/doc/psd/24.xdr/Makefile b/share/doc/psd/24.xdr/Makefile index 878dca1..8e30711 100644 --- a/share/doc/psd/24.xdr/Makefile +++ b/share/doc/psd/24.xdr/Makefile @@ -4,6 +4,5 @@ VOLUME= psd/24.xdr SRCS= stubs xdr.nts.ms MACROS= -ms USE_EQN= -SRCDIR= ${.CURDIR}/../../../../lib/libc/rpc/PSD.doc .include diff --git a/share/doc/psd/24.xdr/stubs b/share/doc/psd/24.xdr/stubs new file mode 100644 index 0000000..78b0a2c --- /dev/null +++ b/share/doc/psd/24.xdr/stubs @@ -0,0 +1,3 @@ +.\" $FreeBSD$ +.\" +.if t .ftr L CR diff --git a/share/doc/psd/24.xdr/xdr.nts.ms b/share/doc/psd/24.xdr/xdr.nts.ms new file mode 100644 index 0000000..260c7f3 --- /dev/null +++ b/share/doc/psd/24.xdr/xdr.nts.ms @@ -0,0 +1,1968 @@ +.\" +.\" Must use -- eqn -- with this one +.\" +.\" @(#)xdr.nts.ms 2.2 88/08/05 4.0 RPCSRC +.\" $FreeBSD$ +.\" +.EQ +delim $$ +.EN +.de BT +.if \\n%=1 .tl ''- % -'' +.. +.ND +.\" prevent excess underlining in nroff +.if n .fp 2 R +.OH 'External Data Representation: Sun Technical Notes''Page %' +.EH 'Page %''External Data Representation: Sun Technical Notes' +.if \n%=1 .bp +.SH +\&External Data Representation: Sun Technical Notes +.IX XDR "Sun technical notes" +.LP +This chapter contains technical notes on Sun's implementation of the +External Data Representation (XDR) standard, a set of library routines +that allow a C programmer to describe arbitrary data structures in a +machinex-independent fashion. +For a formal specification of the XDR +standard, see the +.I "External Data Representation Standard: Protocol Specification". +XDR is the backbone of Sun's Remote Procedure Call package, in the +sense that data for remote procedure calls is transmitted using the +standard. XDR library routines should be used to transmit data +that is accessed (read or written) by more than one type of machine.\** +.FS +.IX XDR "system routines" +For a compete specification of the system External Data Representation +routines, see the +.I xdr(3N) +manual page. +.FE +.LP +This chapter contains a short tutorial overview of the XDR library +routines, a guide to accessing currently available XDR streams, and +information on defining new streams and data types. XDR was designed +to work across different languages, operating systems, and machine +architectures. Most users (particularly RPC users) will only need +the information in the +.I "Number Filters", +.I "Floating Point Filters", +and +.I "Enumeration Filters" +sections. +Programmers wishing to implement RPC and XDR on new machines +will be interested in the rest of the chapter, as well as the +.I "External Data Representaiton Standard: Protocol Specification", +which will be their primary reference. +.SH +Note: +.I +.I rpcgen +can be used to write XDR routines even in cases where no RPC calls are +being made. +.LP +On Sun systems, +C programs that want to use XDR routines +must include the file +.I , +which contains all the necessary interfaces to the XDR system. +Since the C library +.I libc.a +contains all the XDR routines, +compile as normal. +.DS +example% \fBcc\0\fIprogram\fP.c\fI +.DE +.ne 3i +.NH 0 +\&Justification +.IX XDR justification +.LP +Consider the following two programs, +.I writer : +.ie t .DS +.el .DS L +.ft CW +#include +.sp .5 +main() /* \fIwriter.c\fP */ +{ + long i; +.sp .5 + for (i = 0; i < 8; i++) { + if (fwrite((char *)&i, sizeof(i), 1, stdout) != 1) { + fprintf(stderr, "failed!\en"); + exit(1); + } + } + exit(0); +} +.DE +and +.I reader : +.ie t .DS +.el .DS L +.ft CW +#include +.sp .5 +main() /* \fIreader.c\fP */ +{ + long i, j; +.sp .5 + for (j = 0; j < 8; j++) { + if (fread((char *)&i, sizeof (i), 1, stdin) != 1) { + fprintf(stderr, "failed!\en"); + exit(1); + } + printf("%ld ", i); + } + printf("\en"); + exit(0); +} +.DE +The two programs appear to be portable, because (a) they pass +.I lint +checking, and (b) they exhibit the same behavior when executed +on two different hardware architectures, a Sun and a VAX. +.LP +Piping the output of the +.I writer +program to the +.I reader +program gives identical results on a Sun or a VAX. +.DS +.ft CW +sun% \fBwriter | reader\fP +0 1 2 3 4 5 6 7 +sun% + + +vax% \fBwriter | reader\fP +0 1 2 3 4 5 6 7 +vax% +.DE +With the advent of local area networks and 4.2BSD came the concept +of \*Qnetwork pipes\*U \(em a process produces data on one machine, +and a second process consumes data on another machine. +A network pipe can be constructed with +.I writer +and +.I reader . +Here are the results if the first produces data on a Sun, +and the second consumes data on a VAX. +.DS +.ft CW +sun% \fBwriter | rsh vax reader\fP +0 16777216 33554432 50331648 67108864 83886080 100663296 +117440512 +sun% +.DE +Identical results can be obtained by executing +.I writer +on the VAX and +.I reader +on the Sun. These results occur because the byte ordering +of long integers differs between the VAX and the Sun, +even though word size is the same. +Note that $16777216$ is $2 sup 24$ \(em +when four bytes are reversed, the 1 winds up in the 24th bit. +.LP +Whenever data is shared by two or more machine types, there is +a need for portable data. Programs can be made data-portable by +replacing the +.I read() +and +.I write() +calls with calls to an XDR library routine +.I xdr_long() , +a filter that knows the standard representation +of a long integer in its external form. +Here are the revised versions of +.I writer : +.ie t .DS +.el .DS L +.ft CW +#include +#include /* \fIxdr is a sub-library of rpc\fP */ +.sp .5 +main() /* \fIwriter.c\fP */ +{ + XDR xdrs; + long i; +.sp .5 + xdrstdio_create(&xdrs, stdout, XDR_ENCODE); + for (i = 0; i < 8; i++) { + if (!xdr_long(&xdrs, &i)) { + fprintf(stderr, "failed!\en"); + exit(1); + } + } + exit(0); +} +.DE +and +.I reader : +.ie t .DS +.el .DS L +.ft CW +#include +#include /* \fIxdr is a sub-library of rpc\fP */ +.sp .5 +main() /* \fIreader.c\fP */ +{ + XDR xdrs; + long i, j; +.sp .5 + xdrstdio_create(&xdrs, stdin, XDR_DECODE); + for (j = 0; j < 8; j++) { + if (!xdr_long(&xdrs, &i)) { + fprintf(stderr, "failed!\en"); + exit(1); + } + printf("%ld ", i); + } + printf("\en"); + exit(0); +} +.DE +The new programs were executed on a Sun, +on a VAX, and from a Sun to a VAX; +the results are shown below. +.DS +.ft CW +sun% \fBwriter | reader\fP +0 1 2 3 4 5 6 7 +sun% + +vax% \fBwriter | reader\fP +0 1 2 3 4 5 6 7 +vax% + +sun% \fBwriter | rsh vax reader\fP +0 1 2 3 4 5 6 7 +sun% +.DE +.SH +Note: +.I +.IX XDR "portable data" +Integers are just the tip of the portable-data iceberg. Arbitrary +data structures present portability problems, particularly with +respect to alignment and pointers. Alignment on word boundaries +may cause the size of a structure to vary from machine to machine. +And pointers, which are very convenient to use, have no meaning +outside the machine where they are defined. +.LP +.NH 1 +\&A Canonical Standard +.IX XDR "canonical standard" +.LP +XDR's approach to standardizing data representations is +.I canonical . +That is, XDR defines a single byte order (Big Endian), a single +floating-point representation (IEEE), and so on. Any program running on +any machine can use XDR to create portable data by translating its +local representation to the XDR standard representations; similarly, any +program running on any machine can read portable data by translating the +XDR standard representaions to its local equivalents. The single standard +completely decouples programs that create or send portable data from those +that use or receive portable data. The advent of a new machine or a new +language has no effect upon the community of existing portable data creators +and users. A new machine joins this community by being \*Qtaught\*U how to +convert the standard representations and its local representations; the +local representations of other machines are irrelevant. Conversely, to +existing programs running on other machines, the local representations of +the new machine are also irrelevant; such programs can immediately read +portable data produced by the new machine because such data conforms to the +canonical standards that they already understand. +.LP +There are strong precedents for XDR's canonical approach. For example, +TCP/IP, UDP/IP, XNS, Ethernet, and, indeed, all protocols below layer five +of the ISO model, are canonical protocols. The advantage of any canonical +approach is simplicity; in the case of XDR, a single set of conversion +routines is written once and is never touched again. The canonical approach +has a disadvantage, but it is unimportant in real-world data transfer +applications. Suppose two Little-Endian machines are transferring integers +according to the XDR standard. The sending machine converts the integers +from Little-Endian byte order to XDR (Big-Endian) byte order; the receiving +machine performs the reverse conversion. Because both machines observe the +same byte order, their conversions are unnecessary. The point, however, is +not necessity, but cost as compared to the alternative. +.LP +The time spent converting to and from a canonical representation is +insignificant, especially in networking applications. Most of the time +required to prepare a data structure for transfer is not spent in conversion +but in traversing the elements of the data structure. To transmit a tree, +for example, each leaf must be visited and each element in a leaf record must +be copied to a buffer and aligned there; storage for the leaf may have to be +deallocated as well. Similarly, to receive a tree, storage must be +allocated for each leaf, data must be moved from the buffer to the leaf and +properly aligned, and pointers must be constructed to link the leaves +together. Every machine pays the cost of traversing and copying data +structures whether or not conversion is required. In networking +applications, communications overhead\(emthe time required to move the data +down through the sender's protocol layers, across the network and up through +the receiver's protocol layers\(emdwarfs conversion overhead. +.NH 1 +\&The XDR Library +.IX "XDR" "library" +.LP +The XDR library not only solves data portability problems, it also +allows you to write and read arbitrary C constructs in a consistent, +specified, well-documented manner. Thus, it can make sense to use the +library even when the data is not shared among machines on a network. +.LP +The XDR library has filter routines for +strings (null-terminated arrays of bytes), +structures, unions, and arrays, to name a few. +Using more primitive routines, +you can write your own specific XDR routines +to describe arbitrary data structures, +including elements of arrays, arms of unions, +or objects pointed at from other structures. +The structures themselves may contain arrays of arbitrary elements, +or pointers to other structures. +.LP +Let's examine the two programs more closely. +There is a family of XDR stream creation routines +in which each member treats the stream of bits differently. +In our example, data is manipulated using standard I/O routines, +so we use +.I xdrstdio_create (). +.IX xdrstdio_create() "" "\fIxdrstdio_create()\fP" +The parameters to XDR stream creation routines +vary according to their function. +In our example, +.I xdrstdio_create() +takes a pointer to an XDR structure that it initializes, +a pointer to a +.I FILE +that the input or output is performed on, and the operation. +The operation may be +.I XDR_ENCODE +for serializing in the +.I writer +program, or +.I XDR_DECODE +for deserializing in the +.I reader +program. +.LP +Note: RPC users never need to create XDR streams; +the RPC system itself creates these streams, +which are then passed to the users. +.LP +The +.I xdr_long() +.IX xdr_long() "" "\fIxdr_long()\fP" +primitive is characteristic of most XDR library +primitives and all client XDR routines. +First, the routine returns +.I FALSE +(0) if it fails, and +.I TRUE +(1) if it succeeds. +Second, for each data type, +.I xxx , +there is an associated XDR routine of the form: +.DS +.ft CW +xdr_xxx(xdrs, xp) + XDR *xdrs; + xxx *xp; +{ +} +.DE +In our case, +.I xxx +is long, and the corresponding XDR routine is +a primitive, +.I xdr_long() . +The client could also define an arbitrary structure +.I xxx +in which case the client would also supply the routine +.I xdr_xxx (), +describing each field by calling XDR routines +of the appropriate type. +In all cases the first parameter, +.I xdrs +can be treated as an opaque handle, +and passed to the primitive routines. +.LP +XDR routines are direction independent; +that is, the same routines are called to serialize or deserialize data. +This feature is critical to software engineering of portable data. +The idea is to call the same routine for either operation \(em +this almost guarantees that serialized data can also be deserialized. +One routine is used by both producer and consumer of networked data. +This is implemented by always passing the address +of an object rather than the object itself \(em +only in the case of deserialization is the object modified. +This feature is not shown in our trivial example, +but its value becomes obvious when nontrivial data structures +are passed among machines. +If needed, the user can obtain the +direction of the XDR operation. +See the +.I "XDR Operation Directions" +section below for details. +.LP +Let's look at a slightly more complicated example. +Assume that a person's gross assets and liabilities +are to be exchanged among processes. +Also assume that these values are important enough +to warrant their own data type: +.ie t .DS +.el .DS L +.ft CW +struct gnumbers { + long g_assets; + long g_liabilities; +}; +.DE +The corresponding XDR routine describing this structure would be: +.ie t .DS +.el .DS L +.ft CW +bool_t /* \fITRUE is success, FALSE is failure\fP */ +xdr_gnumbers(xdrs, gp) + XDR *xdrs; + struct gnumbers *gp; +{ + if (xdr_long(xdrs, &gp->g_assets) && + xdr_long(xdrs, &gp->g_liabilities)) + return(TRUE); + return(FALSE); +} +.DE +Note that the parameter +.I xdrs +is never inspected or modified; +it is only passed on to the subcomponent routines. +It is imperative to inspect the return value of each XDR routine call, +and to give up immediately and return +.I FALSE +if the subroutine fails. +.LP +This example also shows that the type +.I bool_t +is declared as an integer whose only values are +.I TRUE +(1) and +.I FALSE +(0). This document uses the following definitions: +.ie t .DS +.el .DS L +.ft CW +#define bool_t int +#define TRUE 1 +#define FALSE 0 +.DE +.LP +Keeping these conventions in mind, +.I xdr_gnumbers() +can be rewritten as follows: +.ie t .DS +.el .DS L +.ft CW +xdr_gnumbers(xdrs, gp) + XDR *xdrs; + struct gnumbers *gp; +{ + return(xdr_long(xdrs, &gp->g_assets) && + xdr_long(xdrs, &gp->g_liabilities)); +} +.DE +This document uses both coding styles. +.NH 1 +\&XDR Library Primitives +.IX "library primitives for XDR" +.IX XDR "library primitives" +.LP +This section gives a synopsis of each XDR primitive. +It starts with basic data types and moves on to constructed data types. +Finally, XDR utilities are discussed. +The interface to these primitives +and utilities is defined in the include file +.I , +automatically included by +.I . +.NH 2 +\&Number Filters +.IX "XDR library" "number filters" +.LP +The XDR library provides primitives to translate between numbers +and their corresponding external representations. +Primitives cover the set of numbers in: +.DS +.ft CW +[signed, unsigned] * [short, int, long] +.DE +.ne 2i +Specifically, the eight primitives are: +.DS +.ft CW +bool_t xdr_char(xdrs, cp) + XDR *xdrs; + char *cp; +.sp .5 +bool_t xdr_u_char(xdrs, ucp) + XDR *xdrs; + unsigned char *ucp; +.sp .5 +bool_t xdr_int(xdrs, ip) + XDR *xdrs; + int *ip; +.sp .5 +bool_t xdr_u_int(xdrs, up) + XDR *xdrs; + unsigned *up; +.sp .5 +bool_t xdr_long(xdrs, lip) + XDR *xdrs; + long *lip; +.sp .5 +bool_t xdr_u_long(xdrs, lup) + XDR *xdrs; + u_long *lup; +.sp .5 +bool_t xdr_short(xdrs, sip) + XDR *xdrs; + short *sip; +.sp .5 +bool_t xdr_u_short(xdrs, sup) + XDR *xdrs; + u_short *sup; +.DE +The first parameter, +.I xdrs , +is an XDR stream handle. +The second parameter is the address of the number +that provides data to the stream or receives data from it. +All routines return +.I TRUE +if they complete successfully, and +.I FALSE +otherwise. +.NH 2 +\&Floating Point Filters +.IX "XDR library" "floating point filters" +.LP +The XDR library also provides primitive routines +for C's floating point types: +.DS +.ft CW +bool_t xdr_float(xdrs, fp) + XDR *xdrs; + float *fp; +.sp .5 +bool_t xdr_double(xdrs, dp) + XDR *xdrs; + double *dp; +.DE +The first parameter, +.I xdrs +is an XDR stream handle. +The second parameter is the address +of the floating point number that provides data to the stream +or receives data from it. +Both routines return +.I TRUE +if they complete successfully, and +.I FALSE +otherwise. +.LP +Note: Since the numbers are represented in IEEE floating point, +routines may fail when decoding a valid IEEE representation +into a machine-specific representation, or vice-versa. +.NH 2 +\&Enumeration Filters +.IX "XDR library" "enumeration filters" +.LP +The XDR library provides a primitive for generic enumerations. +The primitive assumes that a C +.I enum +has the same representation inside the machine as a C integer. +The boolean type is an important instance of the +.I enum . +The external representation of a boolean is always +.I TRUE +(1) or +.I FALSE +(0). +.DS +.ft CW +#define bool_t int +#define FALSE 0 +#define TRUE 1 +.sp .5 +#define enum_t int +.sp .5 +bool_t xdr_enum(xdrs, ep) + XDR *xdrs; + enum_t *ep; +.sp .5 +bool_t xdr_bool(xdrs, bp) + XDR *xdrs; + bool_t *bp; +.DE +The second parameters +.I ep +and +.I bp +are addresses of the associated type that provides data to, or +receives data from, the stream +.I xdrs . +.NH 2 +\&No Data +.IX "XDR library" "no data" +.LP +Occasionally, an XDR routine must be supplied to the RPC system, +even when no data is passed or required. +The library provides such a routine: +.DS +.ft CW +bool_t xdr_void(); /* \fIalways returns TRUE\fP */ +.DE +.NH 2 +\&Constructed Data Type Filters +.IX "XDR library" "constructed data type filters" +.LP +Constructed or compound data type primitives +require more parameters and perform more complicated functions +then the primitives discussed above. +This section includes primitives for +strings, arrays, unions, and pointers to structures. +.LP +Constructed data type primitives may use memory management. +In many cases, memory is allocated when deserializing data with +.I XDR_DECODE +Therefore, the XDR package must provide means to deallocate memory. +This is done by an XDR operation, +.I XDR_FREE +To review, the three XDR directional operations are +.I XDR_ENCODE , +.I XDR_DECODE +and +.I XDR_FREE . +.NH 3 +\&Strings +.IX "XDR library" "strings" +.LP +In C, a string is defined as a sequence of bytes +terminated by a null byte, +which is not considered when calculating string length. +However, when a string is passed or manipulated, +a pointer to it is employed. +Therefore, the XDR library defines a string to be a +.I "char *" +and not a sequence of characters. +The external representation of a string is drastically different +from its internal representation. +Externally, strings are represented as +sequences of ASCII characters, +while internally, they are represented with character pointers. +Conversion between the two representations +is accomplished with the routine +.I xdr_string (): +.IX xdr_string() "" \fIxdr_string()\fP +.DS +.ft CW +bool_t xdr_string(xdrs, sp, maxlength) + XDR *xdrs; + char **sp; + u_int maxlength; +.DE +The first parameter +.I xdrs +is the XDR stream handle. +The second parameter +.I sp +is a pointer to a string (type +.I "char **" . +The third parameter +.I maxlength +specifies the maximum number of bytes allowed during encoding or decoding. +its value is usually specified by a protocol. For example, a protocol +specification may say that a file name may be no longer than 255 characters. +.LP +The routine returns +.I FALSE +if the number of characters exceeds +.I maxlength , +and +.I TRUE +if it doesn't. +.SH +Keep +.I maxlength +small. If it is too big you can blow the heap, since +.I xdr_string() +will call +.I malloc() +for space. +.LP +The behavior of +.I xdr_string() +.IX xdr_string() "" \fIxdr_string()\fP +is similar to the behavior of other routines +discussed in this section. The direction +.I XDR_ENCODE +is easiest to understand. The parameter +.I sp +points to a string of a certain length; +if the string does not exceed +.I maxlength , +the bytes are serialized. +.LP +The effect of deserializing a string is subtle. +First the length of the incoming string is determined; +it must not exceed +.I maxlength . +Next +.I sp +is dereferenced; if the the value is +.I NULL , +then a string of the appropriate length is allocated and +.I *sp +is set to this string. +If the original value of +.I *sp +is non-null, then the XDR package assumes +that a target area has been allocated, +which can hold strings no longer than +.I maxlength . +In either case, the string is decoded into the target area. +The routine then appends a null character to the string. +.LP +In the +.I XDR_FREE +operation, the string is obtained by dereferencing +.I sp . +If the string is not +.I NULL , +it is freed and +.I *sp +is set to +.I NULL . +In this operation, +.I xdr_string() +ignores the +.I maxlength +parameter. +.NH 3 +\&Byte Arrays +.IX "XDR library" "byte arrays" +.LP +Often variable-length arrays of bytes are preferable to strings. +Byte arrays differ from strings in the following three ways: +1) the length of the array (the byte count) is explicitly +located in an unsigned integer, +2) the byte sequence is not terminated by a null character, and +3) the external representation of the bytes is the same as their +internal representation. +The primitive +.I xdr_bytes() +.IX xdr_bytes() "" \fIxdr_bytes()\fP +converts between the internal and external +representations of byte arrays: +.DS +.ft CW +bool_t xdr_bytes(xdrs, bpp, lp, maxlength) + XDR *xdrs; + char **bpp; + u_int *lp; + u_int maxlength; +.DE +The usage of the first, second and fourth parameters +are identical to the first, second and third parameters of +.I xdr_string (), +respectively. +The length of the byte area is obtained by dereferencing +.I lp +when serializing; +.I *lp +is set to the byte length when deserializing. +.NH 3 +\&Arrays +.IX "XDR library" "arrays" +.LP +The XDR library package provides a primitive +for handling arrays of arbitrary elements. +The +.I xdr_bytes() +routine treats a subset of generic arrays, +in which the size of array elements is known to be 1, +and the external description of each element is built-in. +The generic array primitive, +.I xdr_array() , +.IX xdr_array() "" \fIxdr_array()\fP +requires parameters identical to those of +.I xdr_bytes() +plus two more: +the size of array elements, +and an XDR routine to handle each of the elements. +This routine is called to encode or decode +each element of the array. +.DS +.ft CW +bool_t +xdr_array(xdrs, ap, lp, maxlength, elementsiz, xdr_element) + XDR *xdrs; + char **ap; + u_int *lp; + u_int maxlength; + u_int elementsiz; + bool_t (*xdr_element)(); +.DE +The parameter +.I ap +is the address of the pointer to the array. +If +.I *ap +is +.I NULL +when the array is being deserialized, +XDR allocates an array of the appropriate size and sets +.I *ap +to that array. +The element count of the array is obtained from +.I *lp +when the array is serialized; +.I *lp +is set to the array length when the array is deserialized. +The parameter +.I maxlength +is the maximum number of elements that the array is allowed to have; +.I elementsiz +is the byte size of each element of the array +(the C function +.I sizeof() +can be used to obtain this value). +The +.I xdr_element() +.IX xdr_element() "" \fIxdr_element()\fP +routine is called to serialize, deserialize, or free +each element of the array. +.br +.LP +Before defining more constructed data types, it is appropriate to +present three examples. +.LP +.I "Example A:" +.br +A user on a networked machine can be identified by +(a) the machine name, such as +.I krypton : +see the +.I gethostname +man page; (b) the user's UID: see the +.I geteuid +man page; and (c) the group numbers to which the user belongs: +see the +.I getgroups +man page. A structure with this information and its associated +XDR routine could be coded like this: +.ie t .DS +.el .DS L +.ft CW +struct netuser { + char *nu_machinename; + int nu_uid; + u_int nu_glen; + int *nu_gids; +}; +#define NLEN 255 /* \fImachine names < 256 chars\fP */ +#define NGRPS 20 /* \fIuser can't be in > 20 groups\fP */ +.sp .5 +bool_t +xdr_netuser(xdrs, nup) + XDR *xdrs; + struct netuser *nup; +{ + return(xdr_string(xdrs, &nup->nu_machinename, NLEN) && + xdr_int(xdrs, &nup->nu_uid) && + xdr_array(xdrs, &nup->nu_gids, &nup->nu_glen, + NGRPS, sizeof (int), xdr_int)); +} +.DE +.LP +.I "Example B:" +.br +A party of network users could be implemented +as an array of +.I netuser +structure. +The declaration and its associated XDR routines +are as follows: +.ie t .DS +.el .DS L +.ft CW +struct party { + u_int p_len; + struct netuser *p_nusers; +}; +#define PLEN 500 /* \fImax number of users in a party\fP */ +.sp .5 +bool_t +xdr_party(xdrs, pp) + XDR *xdrs; + struct party *pp; +{ + return(xdr_array(xdrs, &pp->p_nusers, &pp->p_len, PLEN, + sizeof (struct netuser), xdr_netuser)); +} +.DE +.LP +.I "Example C:" +.br +The well-known parameters to +.I main , +.I argc +and +.I argv +can be combined into a structure. +An array of these structures can make up a history of commands. +The declarations and XDR routines might look like: +.ie t .DS +.el .DS L +.ft CW +struct cmd { + u_int c_argc; + char **c_argv; +}; +#define ALEN 1000 /* \fIargs cannot be > 1000 chars\fP */ +#define NARGC 100 /* \fIcommands cannot have > 100 args\fP */ + +struct history { + u_int h_len; + struct cmd *h_cmds; +}; +#define NCMDS 75 /* \fIhistory is no more than 75 commands\fP */ + +bool_t +xdr_wrap_string(xdrs, sp) + XDR *xdrs; + char **sp; +{ + return(xdr_string(xdrs, sp, ALEN)); +} +.DE +.ie t .DS +.el .DS L +.ft CW +bool_t +xdr_cmd(xdrs, cp) + XDR *xdrs; + struct cmd *cp; +{ + return(xdr_array(xdrs, &cp->c_argv, &cp->c_argc, NARGC, + sizeof (char *), xdr_wrap_string)); +} +.DE +.ie t .DS +.el .DS L +.ft CW +bool_t +xdr_history(xdrs, hp) + XDR *xdrs; + struct history *hp; +{ + return(xdr_array(xdrs, &hp->h_cmds, &hp->h_len, NCMDS, + sizeof (struct cmd), xdr_cmd)); +} +.DE +The most confusing part of this example is that the routine +.I xdr_wrap_string() +is needed to package the +.I xdr_string() +routine, because the implementation of +.I xdr_array() +only passes two parameters to the array element description routine; +.I xdr_wrap_string() +supplies the third parameter to +.I xdr_string (). +.LP +By now the recursive nature of the XDR library should be obvious. +Let's continue with more constructed data types. +.NH 3 +\&Opaque Data +.IX "XDR library" "opaque data" +.LP +In some protocols, handles are passed from a server to client. +The client passes the handle back to the server at some later time. +Handles are never inspected by clients; +they are obtained and submitted. +That is to say, handles are opaque. +The +.I xdr_opaque() +.IX xdr_opaque() "" \fIxdr_opaque()\fP +primitive is used for describing fixed sized, opaque bytes. +.DS +.ft CW +bool_t xdr_opaque(xdrs, p, len) + XDR *xdrs; + char *p; + u_int len; +.DE +The parameter +.I p +is the location of the bytes; +.I len +is the number of bytes in the opaque object. +By definition, the actual data +contained in the opaque object are not machine portable. +.NH 3 +\&Fixed Sized Arrays +.IX "XDR library" "fixed sized arrays" +.LP +The XDR library provides a primitive, +.I xdr_vector (), +for fixed-length arrays. +.ie t .DS +.el .DS L +.ft CW +#define NLEN 255 /* \fImachine names must be < 256 chars\fP */ +#define NGRPS 20 /* \fIuser belongs to exactly 20 groups\fP */ +.sp .5 +struct netuser { + char *nu_machinename; + int nu_uid; + int nu_gids[NGRPS]; +}; +.sp .5 +bool_t +xdr_netuser(xdrs, nup) + XDR *xdrs; + struct netuser *nup; +{ + int i; +.sp .5 + if (!xdr_string(xdrs, &nup->nu_machinename, NLEN)) + return(FALSE); + if (!xdr_int(xdrs, &nup->nu_uid)) + return(FALSE); + if (!xdr_vector(xdrs, nup->nu_gids, NGRPS, sizeof(int), + xdr_int)) { + return(FALSE); + } + return(TRUE); +} +.DE +.NH 3 +\&Discriminated Unions +.IX "XDR library" "discriminated unions" +.LP +The XDR library supports discriminated unions. +A discriminated union is a C union and an +.I enum_t +value that selects an \*Qarm\*U of the union. +.DS +.ft CW +struct xdr_discrim { + enum_t value; + bool_t (*proc)(); +}; +.sp .5 +bool_t xdr_union(xdrs, dscmp, unp, arms, defaultarm) + XDR *xdrs; + enum_t *dscmp; + char *unp; + struct xdr_discrim *arms; + bool_t (*defaultarm)(); /* \fImay equal NULL\fP */ +.DE +First the routine translates the discriminant of the union located at +.I *dscmp . +The discriminant is always an +.I enum_t . +Next the union located at +.I *unp +is translated. +The parameter +.I arms +is a pointer to an array of +.I xdr_discrim +structures. +Each structure contains an ordered pair of +.I [value,proc] . +If the union's discriminant is equal to the associated +.I value , +then the +.I proc +is called to translate the union. +The end of the +.I xdr_discrim +structure array is denoted by a routine of value +.I NULL +(0). If the discriminant is not found in the +.I arms +array, then the +.I defaultarm +procedure is called if it is non-null; +otherwise the routine returns +.I FALSE . +.LP +.I "Example D:" +Suppose the type of a union may be integer, +character pointer (a string), or a +.I gnumbers +structure. +Also, assume the union and its current type +are declared in a structure. +The declaration is: +.ie t .DS +.el .DS L +.ft CW +enum utype { INTEGER=1, STRING=2, GNUMBERS=3 }; +.sp .5 +struct u_tag { + enum utype utype; /* \fIthe union's discriminant\fP */ + union { + int ival; + char *pval; + struct gnumbers gn; + } uval; +}; +.DE +The following constructs and XDR procedure (de)serialize +the discriminated union: +.ie t .DS +.el .DS L +.ft CW +struct xdr_discrim u_tag_arms[4] = { + { INTEGER, xdr_int }, + { GNUMBERS, xdr_gnumbers } + { STRING, xdr_wrap_string }, + { __dontcare__, NULL } + /* \fIalways terminate arms with a NULL xdr_proc\fP */ +} +.sp .5 +bool_t +xdr_u_tag(xdrs, utp) + XDR *xdrs; + struct u_tag *utp; +{ + return(xdr_union(xdrs, &utp->utype, &utp->uval, + u_tag_arms, NULL)); +} +.DE +The routine +.I xdr_gnumbers() +was presented above in +.I "The XDR Library" +section. +.I xdr_wrap_string() +was presented in example C. +The default +.I arm +parameter to +.I xdr_union() +(the last parameter) is +.I NULL +in this example. Therefore the value of the union's discriminant +may legally take on only values listed in the +.I u_tag_arms +array. This example also demonstrates that +the elements of the arm's array do not need to be sorted. +.LP +It is worth pointing out that the values of the discriminant +may be sparse, though in this example they are not. +It is always good +practice to assign explicitly integer values to each element of the +discriminant's type. +This practice both documents the external +representation of the discriminant and guarantees that different +C compilers emit identical discriminant values. +.LP +Exercise: Implement +.I xdr_union() +using the other primitives in this section. +.NH 3 +\&Pointers +.IX "XDR library" "pointers" +.LP +In C it is often convenient to put pointers +to another structure within a structure. +The +.I xdr_reference() +.IX xdr_reference() "" \fIxdr_reference()\fP +primitive makes it easy to serialize, deserialize, and free +these referenced structures. +.DS +.ft CW +bool_t xdr_reference(xdrs, pp, size, proc) + XDR *xdrs; + char **pp; + u_int ssize; + bool_t (*proc)(); +.DE +.LP +Parameter +.I pp +is the address of +the pointer to the structure; +parameter +.I ssize +is the size in bytes of the structure (use the C function +.I sizeof() +to obtain this value); and +.I proc +is the XDR routine that describes the structure. +When decoding data, storage is allocated if +.I *pp +is +.I NULL . +.LP +There is no need for a primitive +.I xdr_struct() +to describe structures within structures, +because pointers are always sufficient. +.LP +Exercise: Implement +.I xdr_reference() +using +.I xdr_array (). +Warning: +.I xdr_reference() +and +.I xdr_array() +are NOT interchangeable external representations of data. +.LP +.I "Example E:" +Suppose there is a structure containing a person's name +and a pointer to a +.I gnumbers +structure containing the person's gross assets and liabilities. +The construct is: +.DS +.ft CW +struct pgn { + char *name; + struct gnumbers *gnp; +}; +.DE +The corresponding XDR routine for this structure is: +.DS +.ft CW +bool_t +xdr_pgn(xdrs, pp) + XDR *xdrs; + struct pgn *pp; +{ + if (xdr_string(xdrs, &pp->name, NLEN) && + xdr_reference(xdrs, &pp->gnp, + sizeof(struct gnumbers), xdr_gnumbers)) + return(TRUE); + return(FALSE); +} +.DE +.IX "pointer semantics and XDR" +.I "Pointer Semantics and XDR" +.LP +In many applications, C programmers attach double meaning to +the values of a pointer. Typically the value +.I NULL +(or zero) means data is not needed, +yet some application-specific interpretation applies. +In essence, the C programmer is encoding +a discriminated union efficiently +by overloading the interpretation of the value of a pointer. +For instance, in example E a +.I NULL +pointer value for +.I gnp +could indicate that +the person's assets and liabilities are unknown. +That is, the pointer value encodes two things: +whether or not the data is known; +and if it is known, where it is located in memory. +Linked lists are an extreme example of the use +of application-specific pointer interpretation. +.LP +The primitive +.I xdr_reference() +.IX xdr_reference() "" \fIxdr_reference()\fP +cannot and does not attach any special +meaning to a null-value pointer during serialization. +That is, passing an address of a pointer whose value is +.I NULL +to +.I xdr_reference() +when serialing data will most likely cause a memory fault and, on the UNIX +system, a core dump. +.LP +.I xdr_pointer() +correctly handles +.I NULL +pointers. For more information about its use, see +the +.I "Linked Lists" +topics below. +.LP +.I Exercise: +After reading the section on +.I "Linked Lists" , +return here and extend example E so that +it can correctly deal with +.I NULL +pointer values. +.LP +.I Exercise: +Using the +.I xdr_union (), +.I xdr_reference() +and +.I xdr_void() +primitives, implement a generic pointer handling primitive +that implicitly deals with +.I NULL +pointers. That is, implement +.I xdr_pointer (). +.NH 2 +\&Non-filter Primitives +.IX "XDR" "non-filter primitives" +.LP +XDR streams can be manipulated with +the primitives discussed in this section. +.DS +.ft CW +u_int xdr_getpos(xdrs) + XDR *xdrs; +.sp .5 +bool_t xdr_setpos(xdrs, pos) + XDR *xdrs; + u_int pos; +.sp .5 +xdr_destroy(xdrs) + XDR *xdrs; +.DE +The routine +.I xdr_getpos() +.IX xdr_getpos() "" \fIxdr_getpos()\fP +returns an unsigned integer +that describes the current position in the data stream. +Warning: In some XDR streams, the returned value of +.I xdr_getpos() +is meaningless; +the routine returns a \-1 in this case +(though \-1 should be a legitimate value). +.LP +The routine +.I xdr_setpos() +.IX xdr_setpos() "" \fIxdr_setpos()\fP +sets a stream position to +.I pos . +Warning: In some XDR streams, setting a position is impossible; +in such cases, +.I xdr_setpos() +will return +.I FALSE . +This routine will also fail if the requested position is out-of-bounds. +The definition of bounds varies from stream to stream. +.LP +The +.I xdr_destroy() +.IX xdr_destroy() "" \fIxdr_destroy()\fP +primitive destroys the XDR stream. +Usage of the stream +after calling this routine is undefined. +.NH 2 +\&XDR Operation Directions +.IX XDR "operation directions" +.IX "direction of XDR operations" +.LP +At times you may wish to optimize XDR routines by taking +advantage of the direction of the operation \(em +.I XDR_ENCODE +.I XDR_DECODE +or +.I XDR_FREE +The value +.I xdrs->x_op +always contains the direction of the XDR operation. +Programmers are not encouraged to take advantage of this information. +Therefore, no example is presented here. However, an example in the +.I "Linked Lists" +topic below, demonstrates the usefulness of the +.I xdrs->x_op +field. +.NH 2 +\&XDR Stream Access +.IX "XDR" "stream access" +.LP +An XDR stream is obtained by calling the appropriate creation routine. +These creation routines take arguments that are tailored to the +specific properties of the stream. +.LP +Streams currently exist for (de)serialization of data to or from +standard I/O +.I FILE +streams, TCP/IP connections and UNIX files, and memory. +.NH 3 +\&Standard I/O Streams +.IX "XDR" "standard I/O streams" +.LP +XDR streams can be interfaced to standard I/O using the +.I xdrstdio_create() +.IX xdrstdio_create() "" \fIxdrstdio_create()\fP +routine as follows: +.DS +.ft CW +#include +#include /* \fIxdr streams part of rpc\fP */ +.sp .5 +void +xdrstdio_create(xdrs, fp, x_op) + XDR *xdrs; + FILE *fp; + enum xdr_op x_op; +.DE +The routine +.I xdrstdio_create() +initializes an XDR stream pointed to by +.I xdrs . +The XDR stream interfaces to the standard I/O library. +Parameter +.I fp +is an open file, and +.I x_op +is an XDR direction. +.NH 3 +\&Memory Streams +.IX "XDR" "memory streams" +.LP +Memory streams allow the streaming of data into or out of +a specified area of memory: +.DS +.ft CW +#include +.sp .5 +void +xdrmem_create(xdrs, addr, len, x_op) + XDR *xdrs; + char *addr; + u_int len; + enum xdr_op x_op; +.DE +The routine +.I xdrmem_create() +.IX xdrmem_create() "" \fIxdrmem_create()\fP +initializes an XDR stream in local memory. +The memory is pointed to by parameter +.I addr ; +parameter +.I len +is the length in bytes of the memory. +The parameters +.I xdrs +and +.I x_op +are identical to the corresponding parameters of +.I xdrstdio_create (). +Currently, the UDP/IP implementation of RPC uses +.I xdrmem_create (). +Complete call or result messages are built in memory before calling the +.I sendto() +system routine. +.NH 3 +\&Record (TCP/IP) Streams +.IX "XDR" "record (TCP/IP) streams" +.LP +A record stream is an XDR stream built on top of +a record marking standard that is built on top of the +UNIX file or 4.2 BSD connection interface. +.DS +.ft CW +#include /* \fIxdr streams part of rpc\fP */ +.sp .5 +xdrrec_create(xdrs, + sendsize, recvsize, iohandle, readproc, writeproc) + XDR *xdrs; + u_int sendsize, recvsize; + char *iohandle; + int (*readproc)(), (*writeproc)(); +.DE +The routine +.I xdrrec_create() +provides an XDR stream interface that allows for a bidirectional, +arbitrarily long sequence of records. +The contents of the records are meant to be data in XDR form. +The stream's primary use is for interfacing RPC to TCP connections. +However, it can be used to stream data into or out of normal +UNIX files. +.LP +The parameter +.I xdrs +is similar to the corresponding parameter described above. +The stream does its own data buffering similar to that of standard I/O. +The parameters +.I sendsize +and +.I recvsize +determine the size in bytes of the output and input buffers, respectively; +if their values are zero (0), then predetermined defaults are used. +When a buffer needs to be filled or flushed, the routine +.I readproc() +or +.I writeproc() +is called, respectively. +The usage and behavior of these +routines are similar to the UNIX system calls +.I read() +and +.I write (). +However, +the first parameter to each of these routines is the opaque parameter +.I iohandle . +The other two parameters +.I buf "" +and +.I nbytes ) +and the results +(byte count) are identical to the system routines. +If +.I xxx +is +.I readproc() +or +.I writeproc (), +then it has the following form: +.DS +.ft CW +.ft I +/* + * returns the actual number of bytes transferred. + * -1 is an error + */ +.ft CW +int +xxx(iohandle, buf, len) + char *iohandle; + char *buf; + int nbytes; +.DE +The XDR stream provides means for delimiting records in the byte stream. +The implementation details of delimiting records in a stream are +discussed in the +.I "Advanced Topics" +topic below. +The primitives that are specific to record streams are as follows: +.DS +.ft CW +bool_t +xdrrec_endofrecord(xdrs, flushnow) + XDR *xdrs; + bool_t flushnow; +.sp .5 +bool_t +xdrrec_skiprecord(xdrs) + XDR *xdrs; +.sp .5 +bool_t +xdrrec_eof(xdrs) + XDR *xdrs; +.DE +The routine +.I xdrrec_endofrecord() +.IX xdrrec_endofrecord() "" \fIxdrrec_endofrecord()\fP +causes the current outgoing data to be marked as a record. +If the parameter +.I flushnow +is +.I TRUE , +then the stream's +.I writeproc +will be called; otherwise, +.I writeproc +will be called when the output buffer has been filled. +.LP +The routine +.I xdrrec_skiprecord() +.IX xdrrec_skiprecord() "" \fIxdrrec_skiprecord()\fP +causes an input stream's position to be moved past +the current record boundary and onto the +beginning of the next record in the stream. +.LP +If there is no more data in the stream's input buffer, +then the routine +.I xdrrec_eof() +.IX xdrrec_eof() "" \fIxdrrec_eof()\fP +returns +.I TRUE . +That is not to say that there is no more data +in the underlying file descriptor. +.NH 2 +\&XDR Stream Implementation +.IX "XDR" "stream implementation" +.IX "stream implementation in XDR" +.LP +This section provides the abstract data types needed +to implement new instances of XDR streams. +.NH 3 +\&The XDR Object +.IX "XDR" "object" +.LP +The following structure defines the interface to an XDR stream: +.ie t .DS +.el .DS L +.ft CW +enum xdr_op { XDR_ENCODE=0, XDR_DECODE=1, XDR_FREE=2 }; +.sp .5 +typedef struct { + enum xdr_op x_op; /* \fIoperation; fast added param\fP */ + struct xdr_ops { + bool_t (*x_getlong)(); /* \fIget long from stream\fP */ + bool_t (*x_putlong)(); /* \fIput long to stream\fP */ + bool_t (*x_getbytes)(); /* \fIget bytes from stream\fP */ + bool_t (*x_putbytes)(); /* \fIput bytes to stream\fP */ + u_int (*x_getpostn)(); /* \fIreturn stream offset\fP */ + bool_t (*x_setpostn)(); /* \fIreposition offset\fP */ + caddr_t (*x_inline)(); /* \fIptr to buffered data\fP */ + VOID (*x_destroy)(); /* \fIfree private area\fP */ + } *x_ops; + caddr_t x_public; /* \fIusers' data\fP */ + caddr_t x_private; /* \fIpointer to private data\fP */ + caddr_t x_base; /* \fIprivate for position info\fP */ + int x_handy; /* \fIextra private word\fP */ +} XDR; +.DE +The +.I x_op +field is the current operation being performed on the stream. +This field is important to the XDR primitives, +but should not affect a stream's implementation. +That is, a stream's implementation should not depend +on this value. +The fields +.I x_private , +.I x_base , +and +.I x_handy +are private to the particular +stream's implementation. +The field +.I x_public +is for the XDR client and should never be used by +the XDR stream implementations or the XDR primitives. +.I x_getpostn() , +.I x_setpostn() +and +.I x_destroy() +are macros for accessing operations. The operation +.I x_inline() +takes two parameters: +an XDR *, and an unsigned integer, which is a byte count. +The routine returns a pointer to a piece of +the stream's internal buffer. +The caller can then use the buffer segment for any purpose. +From the stream's point of view, the bytes in the +buffer segment have been consumed or put. +The routine may return +.I NULL +if it cannot return a buffer segment of the requested size. +(The +.I x_inline() +routine is for cycle squeezers. +Use of the resulting buffer is not data-portable. +Users are encouraged not to use this feature.) +.LP +The operations +.I x_getbytes() +and +.I x_putbytes() +blindly get and put sequences of bytes +from or to the underlying stream; +they return +.I TRUE +if they are successful, and +.I FALSE +otherwise. The routines have identical parameters (replace +.I xxx ): +.DS +.ft CW +bool_t +xxxbytes(xdrs, buf, bytecount) + XDR *xdrs; + char *buf; + u_int bytecount; +.DE +The operations +.I x_getlong() +and +.I x_putlong() +receive and put +long numbers from and to the data stream. +It is the responsibility of these routines +to translate the numbers between the machine representation +and the (standard) external representation. +The UNIX primitives +.I htonl() +and +.I ntohl() +can be helpful in accomplishing this. +The higher-level XDR implementation assumes that +signed and unsigned long integers contain the same number of bits, +and that nonnegative integers +have the same bit representations as unsigned integers. +The routines return +.I TRUE +if they succeed, and +.I FALSE +otherwise. They have identical parameters: +.DS +.ft CW +bool_t +xxxlong(xdrs, lp) + XDR *xdrs; + long *lp; +.DE +Implementors of new XDR streams must make an XDR structure +(with new operation routines) available to clients, +using some kind of create routine. +.NH 1 +\&Advanced Topics +.IX XDR "advanced topics" +.LP +This section describes techniques for passing data structures that +are not covered in the preceding sections. Such structures include +linked lists (of arbitrary lengths). Unlike the simpler examples +covered in the earlier sections, the following examples are written +using both the XDR C library routines and the XDR data description +language. +The +.I "External Data Representation Standard: Protocol Specification" +describes this +language in complete detail. +.NH 2 +\&Linked Lists +.IX XDR "linked lists" +.LP +The last example in the +.I Pointers +topic earlier in this chapter +presented a C data structure and its associated XDR +routines for an individual's gross assets and liabilities. +The example is duplicated below: +.ie t .DS +.el .DS L +.ft CW +struct gnumbers { + long g_assets; + long g_liabilities; +}; +.sp .5 +bool_t +xdr_gnumbers(xdrs, gp) + XDR *xdrs; + struct gnumbers *gp; +{ + if (xdr_long(xdrs, &(gp->g_assets))) + return(xdr_long(xdrs, &(gp->g_liabilities))); + return(FALSE); +} +.DE +.LP +Now assume that we wish to implement a linked list of such information. +A data structure could be constructed as follows: +.ie t .DS +.el .DS L +.ft CW +struct gnumbers_node { + struct gnumbers gn_numbers; + struct gnumbers_node *gn_next; +}; +.sp .5 +typedef struct gnumbers_node *gnumbers_list; +.DE +.LP +The head of the linked list can be thought of as the data object; +that is, the head is not merely a convenient shorthand for a +structure. Similarly the +.I gn_next +field is used to indicate whether or not the object has terminated. +Unfortunately, if the object continues, the +.I gn_next +field is also the address of where it continues. The link addresses +carry no useful information when the object is serialized. +.LP +The XDR data description of this linked list is described by the +recursive declaration of +.I gnumbers_list : +.ie t .DS +.el .DS L +.ft CW +struct gnumbers { + int g_assets; + int g_liabilities; +}; +.sp .5 +struct gnumbers_node { + gnumbers gn_numbers; + gnumbers_node *gn_next; +}; +.DE +.LP +In this description, the boolean indicates whether there is more data +following it. If the boolean is +.I FALSE , +then it is the last data field of the structure. If it is +.I TRUE , +then it is followed by a gnumbers structure and (recursively) by a +.I gnumbers_list . +Note that the C declaration has no boolean explicitly declared in it +(though the +.I gn_next +field implicitly carries the information), while the XDR data +description has no pointer explicitly declared in it. +.LP +Hints for writing the XDR routines for a +.I gnumbers_list +follow easily from the XDR description above. Note how the primitive +.I xdr_pointer() +is used to implement the XDR union above. +.ie t .DS +.el .DS L +.ft CW +bool_t +xdr_gnumbers_node(xdrs, gn) + XDR *xdrs; + gnumbers_node *gn; +{ + return(xdr_gnumbers(xdrs, &gn->gn_numbers) && + xdr_gnumbers_list(xdrs, &gp->gn_next)); +} +.sp .5 +bool_t +xdr_gnumbers_list(xdrs, gnp) + XDR *xdrs; + gnumbers_list *gnp; +{ + return(xdr_pointer(xdrs, gnp, + sizeof(struct gnumbers_node), + xdr_gnumbers_node)); +} +.DE +.LP +The unfortunate side effect of XDR'ing a list with these routines +is that the C stack grows linearly with respect to the number of +node in the list. This is due to the recursion. The following +routine collapses the above two mutually recursive into a single, +non-recursive one. +.ie t .DS +.el .DS L +.ft CW +bool_t +xdr_gnumbers_list(xdrs, gnp) + XDR *xdrs; + gnumbers_list *gnp; +{ + bool_t more_data; + gnumbers_list *nextp; +.sp .5 + for (;;) { + more_data = (*gnp != NULL); + if (!xdr_bool(xdrs, &more_data)) { + return(FALSE); + } + if (! more_data) { + break; + } + if (xdrs->x_op == XDR_FREE) { + nextp = &(*gnp)->gn_next; + } + if (!xdr_reference(xdrs, gnp, + sizeof(struct gnumbers_node), xdr_gnumbers)) { + + return(FALSE); + } + gnp = (xdrs->x_op == XDR_FREE) ? + nextp : &(*gnp)->gn_next; + } + *gnp = NULL; + return(TRUE); +} +.DE +.LP +The first task is to find out whether there is more data or not, +so that this boolean information can be serialized. Notice that +this statement is unnecessary in the +.I XDR_DECODE +case, since the value of more_data is not known until we +deserialize it in the next statement. +.LP +The next statement XDR's the more_data field of the XDR union. +Then if there is truly no more data, we set this last pointer to +.I NULL +to indicate the end of the list, and return +.I TRUE +because we are done. Note that setting the pointer to +.I NULL +is only important in the +.I XDR_DECODE +case, since it is already +.I NULL +in the +.I XDR_ENCODE +and +XDR_FREE +cases. +.LP +Next, if the direction is +.I XDR_FREE , +the value of +.I nextp +is set to indicate the location of the next pointer in the list. +We do this now because we need to dereference gnp to find the +location of the next item in the list, and after the next +statement the storage pointed to by +.I gnp +will be freed up and no be longer valid. We can't do this for all +directions though, because in the +.I XDR_DECODE +direction the value of +.I gnp +won't be set until the next statement. +.LP +Next, we XDR the data in the node using the primitive +.I xdr_reference (). +.I xdr_reference() +is like +.I xdr_pointer() +which we used before, but it does not +send over the boolean indicating whether there is more data. +We use it instead of +.I xdr_pointer() +because we have already XDR'd this information ourselves. Notice +that the xdr routine passed is not the same type as an element +in the list. The routine passed is +.I xdr_gnumbers (), +for XDR'ing gnumbers, but each element in the list is actually of +type +.I gnumbers_node . +We don't pass +.I xdr_gnumbers_node() +because it is recursive, and instead use +.I xdr_gnumbers() +which XDR's all of the non-recursive part. Note that this trick +will work only if the +.I gn_numbers +field is the first item in each element, so that their addresses +are identical when passed to +.I xdr_reference (). +.LP +Finally, we update +.I gnp +to point to the next item in the list. If the direction is +.I XDR_FREE , +we set it to the previously saved value, otherwise we can +dereference +.I gnp +to get the proper value. Though harder to understand than the +recursive version, this non-recursive routine is far less likely +to blow the C stack. It will also run more efficiently since +a lot of procedure call overhead has been removed. Most lists +are small though (in the hundreds of items or less) and the +recursive version should be sufficient for them. +.EQ +delim off +.EN diff --git a/share/doc/psd/25.xdrrfc/Makefile b/share/doc/psd/25.xdrrfc/Makefile index 105135e..7045d45 100644 --- a/share/doc/psd/25.xdrrfc/Makefile +++ b/share/doc/psd/25.xdrrfc/Makefile @@ -4,6 +4,5 @@ VOLUME= psd/25.xdrrfc SRCS= stubs xdr.rfc.ms MACROS= -ms USE_TBL= -SRCDIR= ${.CURDIR}/../../../../lib/libc/rpc/PSD.doc .include diff --git a/share/doc/psd/25.xdrrfc/stubs b/share/doc/psd/25.xdrrfc/stubs new file mode 100644 index 0000000..78b0a2c --- /dev/null +++ b/share/doc/psd/25.xdrrfc/stubs @@ -0,0 +1,3 @@ +.\" $FreeBSD$ +.\" +.if t .ftr L CR diff --git a/share/doc/psd/25.xdrrfc/xdr.rfc.ms b/share/doc/psd/25.xdrrfc/xdr.rfc.ms new file mode 100644 index 0000000..480a339 --- /dev/null +++ b/share/doc/psd/25.xdrrfc/xdr.rfc.ms @@ -0,0 +1,1060 @@ +.\" +.\" Must use -- tbl -- with this one +.\" +.\" @(#)xdr.rfc.ms 2.2 88/08/05 4.0 RPCSRC +.\" $FreeBSD$ +.\" +.de BT +.if \\n%=1 .tl ''- % -'' +.. +.ND +.\" prevent excess underlining in nroff +.if n .fp 2 R +.OH 'External Data Representation Standard''Page %' +.EH 'Page %''External Data Representation Standard' +.if \n%=1 .bp +.SH +\&External Data Representation Standard: Protocol Specification +.IX "External Data Representation" +.IX XDR RFC +.IX XDR "protocol specification" +.LP +.NH 0 +\&Status of this Standard +.nr OF 1 +.IX XDR "RFC status" +.LP +Note: This chapter specifies a protocol that Sun Microsystems, Inc., and +others are using. It has been designated RFC1014 by the ARPA Network +Information Center. +.NH 1 +Introduction +\& +.LP +XDR is a standard for the description and encoding of data. It is +useful for transferring data between different computer +architectures, and has been used to communicate data between such +diverse machines as the Sun Workstation, VAX, IBM-PC, and Cray. +XDR fits into the ISO presentation layer, and is roughly analogous in +purpose to X.409, ISO Abstract Syntax Notation. The major difference +between these two is that XDR uses implicit typing, while X.409 uses +explicit typing. +.LP +XDR uses a language to describe data formats. The language can only +be used only to describe data; it is not a programming language. +This language allows one to describe intricate data formats in a +concise manner. The alternative of using graphical representations +(itself an informal language) quickly becomes incomprehensible when +faced with complexity. The XDR language itself is similar to the C +language [1], just as Courier [4] is similar to Mesa. Protocols such +as Sun RPC (Remote Procedure Call) and the NFS (Network File System) +use XDR to describe the format of their data. +.LP +The XDR standard makes the following assumption: that bytes (or +octets) are portable, where a byte is defined to be 8 bits of data. +A given hardware device should encode the bytes onto the various +media in such a way that other hardware devices may decode the bytes +without loss of meaning. For example, the Ethernet standard +suggests that bytes be encoded in "little-endian" style [2], or least +significant bit first. +.NH 2 +\&Basic Block Size +.IX XDR "basic block size" +.IX XDR "block size" +.LP +The representation of all items requires a multiple of four bytes (or +32 bits) of data. The bytes are numbered 0 through n-1. The bytes +are read or written to some byte stream such that byte m always +precedes byte m+1. If the n bytes needed to contain the data are not +a multiple of four, then the n bytes are followed by enough (0 to 3) +residual zero bytes, r, to make the total byte count a multiple of 4. +.LP +We include the familiar graphic box notation for illustration and +comparison. In most illustrations, each box (delimited by a plus +sign at the 4 corners and vertical bars and dashes) depicts a byte. +Ellipses (...) between boxes show zero or more additional bytes where +required. +.ie t .DS +.el .DS L +\fIA Block\fP + +\f(CW+--------+--------+...+--------+--------+...+--------+ +| byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | ++--------+--------+...+--------+--------+...+--------+ +|<-----------n bytes---------->|<------r bytes------>| +|<-----------n+r (where (n+r) mod 4 = 0)>----------->|\fP + +.DE +.NH 1 +\&XDR Data Types +.IX XDR "data types" +.IX "XDR data types" +.LP +Each of the sections that follow describes a data type defined in the +XDR standard, shows how it is declared in the language, and includes +a graphic illustration of its encoding. +.LP +For each data type in the language we show a general paradigm +declaration. Note that angle brackets (< and >) denote +variable length sequences of data and square brackets ([ and ]) denote +fixed-length sequences of data. "n", "m" and "r" denote integers. +For the full language specification and more formal definitions of +terms such as "identifier" and "declaration", refer to +.I "The XDR Language Specification" , +below. +.LP +For some data types, more specific examples are included. +A more extensive example of a data description is in +.I "An Example of an XDR Data Description" +below. +.NH 2 +\&Integer +.IX XDR integer +.LP +An XDR signed integer is a 32-bit datum that encodes an integer in +the range [-2147483648,2147483647]. The integer is represented in +two's complement notation. The most and least significant bytes are +0 and 3, respectively. Integers are declared as follows: +.ie t .DS +.el .DS L +\fIInteger\fP + +\f(CW(MSB) (LSB) ++-------+-------+-------+-------+ +|byte 0 |byte 1 |byte 2 |byte 3 | ++-------+-------+-------+-------+ +<------------32 bits------------>\fP +.DE +.NH 2 +\&Unsigned Integer +.IX XDR "unsigned integer" +.IX XDR "integer, unsigned" +.LP +An XDR unsigned integer is a 32-bit datum that encodes a nonnegative +integer in the range [0,4294967295]. It is represented by an +unsigned binary number whose most and least significant bytes are 0 +and 3, respectively. An unsigned integer is declared as follows: +.ie t .DS +.el .DS L +\fIUnsigned Integer\fP + +\f(CW(MSB) (LSB) ++-------+-------+-------+-------+ +|byte 0 |byte 1 |byte 2 |byte 3 | ++-------+-------+-------+-------+ +<------------32 bits------------>\fP +.DE +.NH 2 +\&Enumeration +.IX XDR enumeration +.LP +Enumerations have the same representation as signed integers. +Enumerations are handy for describing subsets of the integers. +Enumerated data is declared as follows: +.ft CW +.DS +enum { name-identifier = constant, ... } identifier; +.DE +For example, the three colors red, yellow, and blue could be +described by an enumerated type: +.DS +.ft CW +enum { RED = 2, YELLOW = 3, BLUE = 5 } colors; +.DE +It is an error to encode as an enum any other integer than those that +have been given assignments in the enum declaration. +.NH 2 +\&Boolean +.IX XDR boolean +.LP +Booleans are important enough and occur frequently enough to warrant +their own explicit type in the standard. Booleans are declared as +follows: +.DS +.ft CW +bool identifier; +.DE +This is equivalent to: +.DS +.ft CW +enum { FALSE = 0, TRUE = 1 } identifier; +.DE +.NH 2 +\&Hyper Integer and Unsigned Hyper Integer +.IX XDR "hyper integer" +.IX XDR "integer, hyper" +.LP +The standard also defines 64-bit (8-byte) numbers called hyper +integer and unsigned hyper integer. Their representations are the +obvious extensions of integer and unsigned integer defined above. +They are represented in two's complement notation. The most and +least significant bytes are 0 and 7, respectively. Their +declarations: +.ie t .DS +.el .DS L +\fIHyper Integer\fP +\fIUnsigned Hyper Integer\fP + +\f(CW(MSB) (LSB) ++-------+-------+-------+-------+-------+-------+-------+-------+ +|byte 0 |byte 1 |byte 2 |byte 3 |byte 4 |byte 5 |byte 6 |byte 7 | ++-------+-------+-------+-------+-------+-------+-------+-------+ +<----------------------------64 bits---------------------------->\fP +.DE +.NH 2 +\&Floating-point +.IX XDR "integer, floating point" +.IX XDR "floating-point integer" +.LP +The standard defines the floating-point data type "float" (32 bits or +4 bytes). The encoding used is the IEEE standard for normalized +single-precision floating-point numbers [3]. The following three +fields describe the single-precision floating-point number: +.RS +.IP \fBS\fP: +The sign of the number. Values 0 and 1 represent positive and +negative, respectively. One bit. +.IP \fBE\fP: +The exponent of the number, base 2. 8 bits are devoted to this +field. The exponent is biased by 127. +.IP \fBF\fP: +The fractional part of the number's mantissa, base 2. 23 bits +are devoted to this field. +.RE +.LP +Therefore, the floating-point number is described by: +.DS +(-1)**S * 2**(E-Bias) * 1.F +.DE +It is declared as follows: +.ie t .DS +.el .DS L +\fISingle-Precision Floating-Point\fP + +\f(CW+-------+-------+-------+-------+ +|byte 0 |byte 1 |byte 2 |byte 3 | +S| E | F | ++-------+-------+-------+-------+ +1|<- 8 ->|<-------23 bits------>| +<------------32 bits------------>\fP +.DE +Just as the most and least significant bytes of a number are 0 and 3, +the most and least significant bits of a single-precision floating- +point number are 0 and 31. The beginning bit (and most significant +bit) offsets of S, E, and F are 0, 1, and 9, respectively. Note that +these numbers refer to the mathematical positions of the bits, and +NOT to their actual physical locations (which vary from medium to +medium). +.LP +The IEEE specifications should be consulted concerning the encoding +for signed zero, signed infinity (overflow), and denormalized numbers +(underflow) [3]. According to IEEE specifications, the "NaN" (not a +number) is system dependent and should not be used externally. +.NH 2 +\&Double-precision Floating-point +.IX XDR "integer, double-precision floating point" +.IX XDR "double-precision floating-point integer" +.LP +The standard defines the encoding for the double-precision floating- +point data type "double" (64 bits or 8 bytes). The encoding used is +the IEEE standard for normalized double-precision floating-point +numbers [3]. The standard encodes the following three fields, which +describe the double-precision floating-point number: +.RS +.IP \fBS\fP: +The sign of the number. Values 0 and 1 represent positive and +negative, respectively. One bit. +.IP \fBE\fP: +The exponent of the number, base 2. 11 bits are devoted to this +field. The exponent is biased by 1023. +.IP \fBF\fP: +The fractional part of the number's mantissa, base 2. 52 bits +are devoted to this field. +.RE +.LP +Therefore, the floating-point number is described by: +.DS +(-1)**S * 2**(E-Bias) * 1.F +.DE +It is declared as follows: +.ie t .DS +.el .DS L +\fIDouble-Precision Floating-Point\fP + +\f(CW+------+------+------+------+------+------+------+------+ +|byte 0|byte 1|byte 2|byte 3|byte 4|byte 5|byte 6|byte 7| +S| E | F | ++------+------+------+------+------+------+------+------+ +1|<--11-->|<-----------------52 bits------------------->| +<-----------------------64 bits------------------------->\fP +.DE +Just as the most and least significant bytes of a number are 0 and 3, +the most and least significant bits of a double-precision floating- +point number are 0 and 63. The beginning bit (and most significant +bit) offsets of S, E , and F are 0, 1, and 12, respectively. Note +that these numbers refer to the mathematical positions of the bits, +and NOT to their actual physical locations (which vary from medium to +medium). +.LP +The IEEE specifications should be consulted concerning the encoding +for signed zero, signed infinity (overflow), and denormalized numbers +(underflow) [3]. According to IEEE specifications, the "NaN" (not a +number) is system dependent and should not be used externally. +.NH 2 +\&Fixed-length Opaque Data +.IX XDR "fixed-length opaque data" +.IX XDR "opaque data, fixed length" +.LP +At times, fixed-length uninterpreted data needs to be passed among +machines. This data is called "opaque" and is declared as follows: +.DS +.ft CW +opaque identifier[n]; +.DE +where the constant n is the (static) number of bytes necessary to +contain the opaque data. If n is not a multiple of four, then the n +bytes are followed by enough (0 to 3) residual zero bytes, r, to make +the total byte count of the opaque object a multiple of four. +.ie t .DS +.el .DS L +\fIFixed-Length Opaque\fP + +\f(CW0 1 ... ++--------+--------+...+--------+--------+...+--------+ +| byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | ++--------+--------+...+--------+--------+...+--------+ +|<-----------n bytes---------->|<------r bytes------>| +|<-----------n+r (where (n+r) mod 4 = 0)------------>|\fP +.DE +.NH 2 +\&Variable-length Opaque Data +.IX XDR "variable-length opaque data" +.IX XDR "opaque data, variable length" +.LP +The standard also provides for variable-length (counted) opaque data, +defined as a sequence of n (numbered 0 through n-1) arbitrary bytes +to be the number n encoded as an unsigned integer (as described +below), and followed by the n bytes of the sequence. +.LP +Byte m of the sequence always precedes byte m+1 of the sequence, and +byte 0 of the sequence always follows the sequence's length (count). +enough (0 to 3) residual zero bytes, r, to make the total byte count +a multiple of four. Variable-length opaque data is declared in the +following way: +.DS +.ft CW +opaque identifier; +.DE +or +.DS +.ft CW +opaque identifier<>; +.DE +The constant m denotes an upper bound of the number of bytes that the +sequence may contain. If m is not specified, as in the second +declaration, it is assumed to be (2**32) - 1, the maximum length. +The constant m would normally be found in a protocol specification. +For example, a filing protocol may state that the maximum data +transfer size is 8192 bytes, as follows: +.DS +.ft CW +opaque filedata<8192>; +.DE +This can be illustrated as follows: +.ie t .DS +.el .DS L +\fIVariable-Length Opaque\fP + +\f(CW0 1 2 3 4 5 ... ++-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ +| length n |byte0|byte1|...| n-1 | 0 |...| 0 | ++-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ +|<-------4 bytes------->|<------n bytes------>|<---r bytes--->| +|<----n+r (where (n+r) mod 4 = 0)---->|\fP +.DE +.LP +It is an error to encode a length greater than the maximum +described in the specification. +.NH 2 +\&String +.IX XDR string +.LP +The standard defines a string of n (numbered 0 through n-1) ASCII +bytes to be the number n encoded as an unsigned integer (as described +above), and followed by the n bytes of the string. Byte m of the +string always precedes byte m+1 of the string, and byte 0 of the +string always follows the string's length. If n is not a multiple of +four, then the n bytes are followed by enough (0 to 3) residual zero +bytes, r, to make the total byte count a multiple of four. Counted +byte strings are declared as follows: +.DS +.ft CW +string object; +.DE +or +.DS +.ft CW +string object<>; +.DE +The constant m denotes an upper bound of the number of bytes that a +string may contain. If m is not specified, as in the second +declaration, it is assumed to be (2**32) - 1, the maximum length. +The constant m would normally be found in a protocol specification. +For example, a filing protocol may state that a file name can be no +longer than 255 bytes, as follows: +.DS +.ft CW +string filename<255>; +.DE +Which can be illustrated as: +.ie t .DS +.el .DS L +\fIA String\fP + +\f(CW0 1 2 3 4 5 ... ++-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ +| length n |byte0|byte1|...| n-1 | 0 |...| 0 | ++-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+ +|<-------4 bytes------->|<------n bytes------>|<---r bytes--->| +|<----n+r (where (n+r) mod 4 = 0)---->|\fP +.DE +.LP +It is an error to encode a length greater than the maximum +described in the specification. +.NH 2 +\&Fixed-length Array +.IX XDR "fixed-length array" +.IX XDR "array, fixed length" +.LP +Declarations for fixed-length arrays of homogeneous elements are in +the following form: +.DS +.ft CW +type-name identifier[n]; +.DE +Fixed-length arrays of elements numbered 0 through n-1 are encoded by +individually encoding the elements of the array in their natural +order, 0 through n-1. Each element's size is a multiple of four +bytes. Though all elements are of the same type, the elements may +have different sizes. For example, in a fixed-length array of +strings, all elements are of type "string", yet each element will +vary in its length. +.ie t .DS +.el .DS L +\fIFixed-Length Array\fP + +\f(CW+---+---+---+---+---+---+---+---+...+---+---+---+---+ +| element 0 | element 1 |...| element n-1 | ++---+---+---+---+---+---+---+---+...+---+---+---+---+ +|<--------------------n elements------------------->|\fP +.DE +.NH 2 +\&Variable-length Array +.IX XDR "variable-length array" +.IX XDR "array, variable length" +.LP +Counted arrays provide the ability to encode variable-length arrays +of homogeneous elements. The array is encoded as the element count n +(an unsigned integer) followed by the encoding of each of the array's +elements, starting with element 0 and progressing through element n- +1. The declaration for variable-length arrays follows this form: +.DS +.ft CW +type-name identifier; +.DE +or +.DS +.ft CW +type-name identifier<>; +.DE +The constant m specifies the maximum acceptable element count of an +array; if m is not specified, as in the second declaration, it is +assumed to be (2**32) - 1. +.ie t .DS +.el .DS L +\fICounted Array\fP + +\f(CW0 1 2 3 ++--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+ +| n | element 0 | element 1 |...|element n-1| ++--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+ +|<-4 bytes->|<--------------n elements------------->|\fP +.DE +It is an error to encode a value of n that is greater than the +maximum described in the specification. +.NH 2 +\&Structure +.IX XDR structure +.LP +Structures are declared as follows: +.DS +.ft CW +struct { + component-declaration-A; + component-declaration-B; + \&... +} identifier; +.DE +The components of the structure are encoded in the order of their +declaration in the structure. Each component's size is a multiple of +four bytes, though the components may be different sizes. +.ie t .DS +.el .DS L +\fIStructure\fP + +\f(CW+-------------+-------------+... +| component A | component B |... ++-------------+-------------+...\fP +.DE +.NH 2 +\&Discriminated Union +.IX XDR "discriminated union" +.IX XDR union discriminated +.LP +A discriminated union is a type composed of a discriminant followed +by a type selected from a set of prearranged types according to the +value of the discriminant. The type of discriminant is either "int", +"unsigned int", or an enumerated type, such as "bool". The component +types are called "arms" of the union, and are preceded by the value +of the discriminant which implies their encoding. Discriminated +unions are declared as follows: +.DS +.ft CW +union switch (discriminant-declaration) { + case discriminant-value-A: + arm-declaration-A; + case discriminant-value-B: + arm-declaration-B; + \&... + default: default-declaration; +} identifier; +.DE +Each "case" keyword is followed by a legal value of the discriminant. +The default arm is optional. If it is not specified, then a valid +encoding of the union cannot take on unspecified discriminant values. +The size of the implied arm is always a multiple of four bytes. +.LP +The discriminated union is encoded as its discriminant followed by +the encoding of the implied arm. +.ie t .DS +.el .DS L +\fIDiscriminated Union\fP + +\f(CW0 1 2 3 ++---+---+---+---+---+---+---+---+ +| discriminant | implied arm | ++---+---+---+---+---+---+---+---+ +|<---4 bytes--->|\fP +.DE +.NH 2 +\&Void +.IX XDR void +.LP +An XDR void is a 0-byte quantity. Voids are useful for describing +operations that take no data as input or no data as output. They are +also useful in unions, where some arms may contain data and others do +not. The declaration is simply as follows: +.DS +.ft CW +void; +.DE +Voids are illustrated as follows: +.ie t .DS +.el .DS L +\fIVoid\fP + +\f(CW ++ + || + ++ +--><-- 0 bytes\fP +.DE +.NH 2 +\&Constant +.IX XDR constant +.LP +The data declaration for a constant follows this form: +.DS +.ft CW +const name-identifier = n; +.DE +"const" is used to define a symbolic name for a constant; it does not +declare any data. The symbolic constant may be used anywhere a +regular constant may be used. For example, the following defines a +symbolic constant DOZEN, equal to 12. +.DS +.ft CW +const DOZEN = 12; +.DE +.NH 2 +\&Typedef +.IX XDR typedef +.LP +"typedef" does not declare any data either, but serves to define new +identifiers for declaring data. The syntax is: +.DS +.ft CW +typedef declaration; +.DE +The new type name is actually the variable name in the declaration +part of the typedef. For example, the following defines a new type +called "eggbox" using an existing type called "egg": +.DS +.ft CW +typedef egg eggbox[DOZEN]; +.DE +Variables declared using the new type name have the same type as the +new type name would have in the typedef, if it was considered a +variable. For example, the following two declarations are equivalent +in declaring the variable "fresheggs": +.DS +.ft CW +eggbox fresheggs; +egg fresheggs[DOZEN]; +.DE +When a typedef involves a struct, enum, or union definition, there is +another (preferred) syntax that may be used to define the same type. +In general, a typedef of the following form: +.DS +.ft CW +typedef <> identifier; +.DE +may be converted to the alternative form by removing the "typedef" +part and placing the identifier after the "struct", "union", or +"enum" keyword, instead of at the end. For example, here are the two +ways to define the type "bool": +.DS +.ft CW +typedef enum { /* \fIusing typedef\fP */ + FALSE = 0, + TRUE = 1 + } bool; + +enum bool { /* \fIpreferred alternative\fP */ + FALSE = 0, + TRUE = 1 + }; +.DE +The reason this syntax is preferred is one does not have to wait +until the end of a declaration to figure out the name of the new +type. +.NH 2 +\&Optional-data +.IX XDR "optional data" +.IX XDR "data, optional" +.LP +Optional-data is one kind of union that occurs so frequently that we +give it a special syntax of its own for declaring it. It is declared +as follows: +.DS +.ft CW +type-name *identifier; +.DE +This is equivalent to the following union: +.DS +.ft CW +union switch (bool opted) { + case TRUE: + type-name element; + case FALSE: + void; +} identifier; +.DE +It is also equivalent to the following variable-length array +declaration, since the boolean "opted" can be interpreted as the +length of the array: +.DS +.ft CW +type-name identifier<1>; +.DE +Optional-data is not so interesting in itself, but it is very useful +for describing recursive data-structures such as linked-lists and +trees. For example, the following defines a type "stringlist" that +encodes lists of arbitrary length strings: +.DS +.ft CW +struct *stringlist { + string item<>; + stringlist next; +}; +.DE +It could have been equivalently declared as the following union: +.DS +.ft CW +union stringlist switch (bool opted) { + case TRUE: + struct { + string item<>; + stringlist next; + } element; + case FALSE: + void; +}; +.DE +or as a variable-length array: +.DS +.ft CW +struct stringlist<1> { + string item<>; + stringlist next; +}; +.DE +Both of these declarations obscure the intention of the stringlist +type, so the optional-data declaration is preferred over both of +them. The optional-data type also has a close correlation to how +recursive data structures are represented in high-level languages +such as Pascal or C by use of pointers. In fact, the syntax is the +same as that of the C language for pointers. +.NH 2 +\&Areas for Future Enhancement +.IX XDR futures +.LP +The XDR standard lacks representations for bit fields and bitmaps, +since the standard is based on bytes. Also missing are packed (or +binary-coded) decimals. +.LP +The intent of the XDR standard was not to describe every kind of data +that people have ever sent or will ever want to send from machine to +machine. Rather, it only describes the most commonly used data-types +of high-level languages such as Pascal or C so that applications +written in these languages will be able to communicate easily over +some medium. +.LP +One could imagine extensions to XDR that would let it describe almost +any existing protocol, such as TCP. The minimum necessary for this +are support for different block sizes and byte-orders. The XDR +discussed here could then be considered the 4-byte big-endian member +of a larger XDR family. +.NH 1 +\&Discussion +.sp 2 +.NH 2 +\&Why a Language for Describing Data? +.IX XDR language +.LP +There are many advantages in using a data-description language such +as XDR versus using diagrams. Languages are more formal than +diagrams and lead to less ambiguous descriptions of data. +Languages are also easier to understand and allow one to think of +other issues instead of the low-level details of bit-encoding. +Also, there is a close analogy between the types of XDR and a +high-level language such as C or Pascal. This makes the +implementation of XDR encoding and decoding modules an easier task. +Finally, the language specification itself is an ASCII string that +can be passed from machine to machine to perform on-the-fly data +interpretation. +.NH 2 +\&Why Only one Byte-Order for an XDR Unit? +.IX XDR "byte order" +.LP +Supporting two byte-orderings requires a higher level protocol for +determining in which byte-order the data is encoded. Since XDR is +not a protocol, this can't be done. The advantage of this, though, +is that data in XDR format can be written to a magnetic tape, for +example, and any machine will be able to interpret it, since no +higher level protocol is necessary for determining the byte-order. +.NH 2 +\&Why does XDR use Big-Endian Byte-Order? +.LP +Yes, it is unfair, but having only one byte-order means you have to +be unfair to somebody. Many architectures, such as the Motorola +68000 and IBM 370, support the big-endian byte-order. +.NH 2 +\&Why is the XDR Unit Four Bytes Wide? +.LP +There is a tradeoff in choosing the XDR unit size. Choosing a small +size such as two makes the encoded data small, but causes alignment +problems for machines that aren't aligned on these boundaries. A +large size such as eight means the data will be aligned on virtually +every machine, but causes the encoded data to grow too big. We chose +four as a compromise. Four is big enough to support most +architectures efficiently, except for rare machines such as the +eight-byte aligned Cray. Four is also small enough to keep the +encoded data restricted to a reasonable size. +.NH 2 +\&Why must Variable-Length Data be Padded with Zeros? +.IX XDR "variable-length data" +.LP +It is desirable that the same data encode into the same thing on all +machines, so that encoded data can be meaningfully compared or +checksummed. Forcing the padded bytes to be zero ensures this. +.NH 2 +\&Why is there No Explicit Data-Typing? +.LP +Data-typing has a relatively high cost for what small advantages it +may have. One cost is the expansion of data due to the inserted type +fields. Another is the added cost of interpreting these type fields +and acting accordingly. And most protocols already know what type +they expect, so data-typing supplies only redundant information. +However, one can still get the benefits of data-typing using XDR. One +way is to encode two things: first a string which is the XDR data +description of the encoded data, and then the encoded data itself. +Another way is to assign a value to all the types in XDR, and then +define a universal type which takes this value as its discriminant +and for each value, describes the corresponding data type. +.NH 1 +\&The XDR Language Specification +.IX XDR language +.sp 1 +.NH 2 +\&Notational Conventions +.IX "XDR language" notation +.LP +This specification uses an extended Backus-Naur Form notation for +describing the XDR language. Here is a brief description of the +notation: +.IP 1. +The characters +.I | , +.I ( , +.I ) , +.I [ , +.I ] , +.I " , +and +.I * +are special. +.IP 2. +Terminal symbols are strings of any characters surrounded by +double quotes. +.IP 3. +Non-terminal symbols are strings of non-special characters. +.IP 4. +Alternative items are separated by a vertical bar ("\fI|\fP"). +.IP 5. +Optional items are enclosed in brackets. +.IP 6. +Items are grouped together by enclosing them in parentheses. +.IP 7. +A +.I * +following an item means 0 or more occurrences of that item. +.LP +For example, consider the following pattern: +.DS L +"a " "very" (", " " very")* [" cold " "and"] " rainy " ("day" | "night") +.DE +.LP +An infinite number of strings match this pattern. A few of them +are: +.DS +"a very rainy day" +"a very, very rainy day" +"a very cold and rainy day" +"a very, very, very cold and rainy night" +.DE +.NH 2 +\&Lexical Notes +.IP 1. +Comments begin with '/*' and terminate with '*/'. +.IP 2. +White space serves to separate items and is otherwise ignored. +.IP 3. +An identifier is a letter followed by an optional sequence of +letters, digits or underbar ('_'). The case of identifiers is +not ignored. +.IP 4. +A constant is a sequence of one or more decimal digits, +optionally preceded by a minus-sign ('-'). +.NH 2 +\&Syntax Information +.IX "XDR language" syntax +.DS +.ft CW +declaration: + type-specifier identifier + | type-specifier identifier "[" value "]" + | type-specifier identifier "<" [ value ] ">" + | "opaque" identifier "[" value "]" + | "opaque" identifier "<" [ value ] ">" + | "string" identifier "<" [ value ] ">" + | type-specifier "*" identifier + | "void" +.DE +.DS +.ft CW +value: + constant + | identifier + +type-specifier: + [ "unsigned" ] "int" + | [ "unsigned" ] "hyper" + | "float" + | "double" + | "bool" + | enum-type-spec + | struct-type-spec + | union-type-spec + | identifier +.DE +.DS +.ft CW +enum-type-spec: + "enum" enum-body + +enum-body: + "{" + ( identifier "=" value ) + ( "," identifier "=" value )* + "}" +.DE +.DS +.ft CW +struct-type-spec: + "struct" struct-body + +struct-body: + "{" + ( declaration ";" ) + ( declaration ";" )* + "}" +.DE +.DS +.ft CW +union-type-spec: + "union" union-body + +union-body: + "switch" "(" declaration ")" "{" + ( "case" value ":" declaration ";" ) + ( "case" value ":" declaration ";" )* + [ "default" ":" declaration ";" ] + "}" + +constant-def: + "const" identifier "=" constant ";" +.DE +.DS +.ft CW +type-def: + "typedef" declaration ";" + | "enum" identifier enum-body ";" + | "struct" identifier struct-body ";" + | "union" identifier union-body ";" + +definition: + type-def + | constant-def + +specification: + definition * +.DE +.NH 3 +\&Syntax Notes +.IX "XDR language" syntax +.LP +.IP 1. +The following are keywords and cannot be used as identifiers: +"bool", "case", "const", "default", "double", "enum", "float", +"hyper", "opaque", "string", "struct", "switch", "typedef", "union", +"unsigned" and "void". +.IP 2. +Only unsigned constants may be used as size specifications for +arrays. If an identifier is used, it must have been declared +previously as an unsigned constant in a "const" definition. +.IP 3. +Constant and type identifiers within the scope of a specification +are in the same name space and must be declared uniquely within this +scope. +.IP 4. +Similarly, variable names must be unique within the scope of +struct and union declarations. Nested struct and union declarations +create new scopes. +.IP 5. +The discriminant of a union must be of a type that evaluates to +an integer. That is, "int", "unsigned int", "bool", an enumerated +type or any typedefed type that evaluates to one of these is legal. +Also, the case values must be one of the legal values of the +discriminant. Finally, a case value may not be specified more than +once within the scope of a union declaration. +.NH 1 +\&An Example of an XDR Data Description +.LP +Here is a short XDR data description of a thing called a "file", +which might be used to transfer files from one machine to another. +.ie t .DS +.el .DS L +.ft CW + +const MAXUSERNAME = 32; /*\fI max length of a user name \fP*/ +const MAXFILELEN = 65535; /*\fI max length of a file \fP*/ +const MAXNAMELEN = 255; /*\fI max length of a file name \fP*/ + +.ft I +/* + * Types of files: + */ +.ft CW + +enum filekind { + TEXT = 0, /*\fI ascii data \fP*/ + DATA = 1, /*\fI raw data \fP*/ + EXEC = 2 /*\fI executable \fP*/ +}; + +.ft I +/* + * File information, per kind of file: + */ +.ft CW + +union filetype switch (filekind kind) { + case TEXT: + void; /*\fI no extra information \fP*/ + case DATA: + string creator; /*\fI data creator \fP*/ + case EXEC: + string interpretor; /*\fI program interpretor \fP*/ +}; + +.ft I +/* + * A complete file: + */ +.ft CW + +struct file { + string filename; /*\fI name of file \fP*/ + filetype type; /*\fI info about file \fP*/ + string owner; /*\fI owner of file \fP*/ + opaque data; /*\fI file data \fP*/ +}; +.DE +.LP +Suppose now that there is a user named "john" who wants to store +his lisp program "sillyprog" that contains just the data "(quit)". +His file would be encoded as follows: +.TS +box tab (&) ; +lfI lfI lfI lfI +rfL rfL rfL l . +Offset&Hex Bytes&ASCII&Description +_ +0&00 00 00 09&....&Length of filename = 9 +4&73 69 6c 6c&sill&Filename characters +8&79 70 72 6f&ypro& ... and more characters ... +12&67 00 00 00&g...& ... and 3 zero-bytes of fill +16&00 00 00 02&....&Filekind is EXEC = 2 +20&00 00 00 04&....&Length of interpretor = 4 +24&6c 69 73 70&lisp&Interpretor characters +28&00 00 00 04&....&Length of owner = 4 +32&6a 6f 68 6e&john&Owner characters +36&00 00 00 06&....&Length of file data = 6 +40&28 71 75 69&(qui&File data bytes ... +44&74 29 00 00&t)..& ... and 2 zero-bytes of fill +.TE +.NH 1 +\&References +.LP +[1] Brian W. Kernighan & Dennis M. Ritchie, "The C Programming +Language", Bell Laboratories, Murray Hill, New Jersey, 1978. +.LP +[2] Danny Cohen, "On Holy Wars and a Plea for Peace", IEEE Computer, +October 1981. +.LP +[3] "IEEE Standard for Binary Floating-Point Arithmetic", ANSI/IEEE +Standard 754-1985, Institute of Electrical and Electronics +Engineers, August 1985. +.LP +[4] "Courier: The Remote Procedure Call Protocol", XEROX +Corporation, XSIS 038112, December 1981. diff --git a/share/doc/psd/26.rpcrfc/Makefile b/share/doc/psd/26.rpcrfc/Makefile index 79214f1..3ffdc27 100644 --- a/share/doc/psd/26.rpcrfc/Makefile +++ b/share/doc/psd/26.rpcrfc/Makefile @@ -4,6 +4,5 @@ VOLUME= psd/26.rpcrfc SRCS= stubs rpc.rfc.ms MACROS= -ms USE_TBL= -SRCDIR= ${.CURDIR}/../../../../lib/libc/rpc/PSD.doc .include diff --git a/share/doc/psd/26.rpcrfc/rpc.rfc.ms b/share/doc/psd/26.rpcrfc/rpc.rfc.ms new file mode 100644 index 0000000..9a948bd --- /dev/null +++ b/share/doc/psd/26.rpcrfc/rpc.rfc.ms @@ -0,0 +1,1304 @@ +.\" +.\" Must use -- tbl -- with this one +.\" +.\" @(#)rpc.rfc.ms 2.2 88/08/05 4.0 RPCSRC +.\" $FreeBSD$ +.\" +.de BT +.if \\n%=1 .tl ''- % -'' +.. +.ND +.\" prevent excess underlining in nroff +.if n .fp 2 R +.OH 'Remote Procedure Calls: Protocol Specification''Page %' +.EH 'Page %''Remote Procedure Calls: Protocol Specification' +.if \n%=1 .bp +.SH +\&Remote Procedure Calls: Protocol Specification +.LP +.NH 0 +\&Status of this Memo +.LP +Note: This chapter specifies a protocol that Sun Microsystems, Inc., +and others are using. +It has been designated RFC1050 by the ARPA Network +Information Center. +.LP +.NH 1 +\&Introduction +.LP +This chapter specifies a message protocol used in implementing +Sun's Remote Procedure Call (RPC) package. (The message protocol is +specified with the External Data Representation (XDR) language. +See the +.I "External Data Representation Standard: Protocol Specification" +for the details. Here, we assume that the reader is familiar +with XDR and do not attempt to justify it or its uses). The paper +by Birrell and Nelson [1] is recommended as an excellent background +to and justification of RPC. +.NH 2 +\&Terminology +.LP +This chapter discusses servers, services, programs, procedures, +clients, and versions. A server is a piece of software where network +services are implemented. A network service is a collection of one +or more remote programs. A remote program implements one or more +remote procedures; the procedures, their parameters, and results are +documented in the specific program's protocol specification (see the +\fIPort Mapper Program Protocol\fP\, below, for an example). Network +clients are pieces of software that initiate remote procedure calls +to services. A server may support more than one version of a remote +program in order to be forward compatible with changing protocols. +.LP +For example, a network file service may be composed of two programs. +One program may deal with high-level applications such as file system +access control and locking. The other may deal with low-level file +IO and have procedures like "read" and "write". A client machine of +the network file service would call the procedures associated with +the two programs of the service on behalf of some user on the client +machine. +.NH 2 +\&The RPC Model +.LP +The remote procedure call model is similar to the local procedure +call model. In the local case, the caller places arguments to a +procedure in some well-specified location (such as a result +register). It then transfers control to the procedure, and +eventually gains back control. At that point, the results of the +procedure are extracted from the well-specified location, and the +caller continues execution. +.LP +The remote procedure call is similar, in that one thread of control +logically winds through two processes\(emone is the caller's process, +the other is a server's process. That is, the caller process sends a +call message to the server process and waits (blocks) for a reply +message. The call message contains the procedure's parameters, among +other things. The reply message contains the procedure's results, +among other things. Once the reply message is received, the results +of the procedure are extracted, and caller's execution is resumed. +.LP +On the server side, a process is dormant awaiting the arrival of a +call message. When one arrives, the server process extracts the +procedure's parameters, computes the results, sends a reply message, +and then awaits the next call message. +.LP +Note that in this model, only one of the two processes is active at +any given time. However, this model is only given as an example. +The RPC protocol makes no restrictions on the concurrency model +implemented, and others are possible. For example, an implementation +may choose to have RPC calls be asynchronous, so that the client may +do useful work while waiting for the reply from the server. Another +possibility is to have the server create a task to process an +incoming request, so that the server can be free to receive other +requests. +.NH 2 +\&Transports and Semantics +.LP +The RPC protocol is independent of transport protocols. That is, RPC +does not care how a message is passed from one process to another. +The protocol deals only with specification and interpretation of +messages. +.LP +It is important to point out that RPC does not try to implement any +kind of reliability and that the application must be aware of the +type of transport protocol underneath RPC. If it knows it is running +on top of a reliable transport such as TCP/IP[6], then most of the +work is already done for it. On the other hand, if it is running on +top of an unreliable transport such as UDP/IP[7], it must implement +is own retransmission and time-out policy as the RPC layer does not +provide this service. +.LP +Because of transport independence, the RPC protocol does not attach +specific semantics to the remote procedures or their execution. +Semantics can be inferred from (but should be explicitly specified +by) the underlying transport protocol. For example, consider RPC +running on top of an unreliable transport such as UDP/IP. If an +application retransmits RPC messages after short time-outs, the only +thing it can infer if it receives no reply is that the procedure was +executed zero or more times. If it does receive a reply, then it can +infer that the procedure was executed at least once. +.LP +A server may wish to remember previously granted requests from a +client and not regrant them in order to insure some degree of +execute-at-most-once semantics. A server can do this by taking +advantage of the transaction ID that is packaged with every RPC +request. The main use of this transaction is by the client RPC layer +in matching replies to requests. However, a client application may +choose to reuse its previous transaction ID when retransmitting a +request. The server application, knowing this fact, may choose to +remember this ID after granting a request and not regrant requests +with the same ID in order to achieve some degree of +execute-at-most-once semantics. The server is not allowed to examine +this ID in any other way except as a test for equality. +.LP +On the other hand, if using a reliable transport such as TCP/IP, the +application can infer from a reply message that the procedure was +executed exactly once, but if it receives no reply message, it cannot +assume the remote procedure was not executed. Note that even if a +connection-oriented protocol like TCP is used, an application still +needs time-outs and reconnection to handle server crashes. +.LP +There are other possibilities for transports besides datagram- or +connection-oriented protocols. For example, a request-reply protocol +such as VMTP[2] is perhaps the most natural transport for RPC. +.SH +.I +NOTE: At Sun, RPC is currently implemented on top of both TCP/IP +and UDP/IP transports. +.LP +.NH 2 +\&Binding and Rendezvous Independence +.LP +The act of binding a client to a service is NOT part of the remote +procedure call specification. This important and necessary function +is left up to some higher-level software. (The software may use RPC +itself\(emsee the \fIPort Mapper Program Protocol\fP\, below). +.LP +Implementors should think of the RPC protocol as the jump-subroutine +instruction ("JSR") of a network; the loader (binder) makes JSR +useful, and the loader itself uses JSR to accomplish its task. +Likewise, the network makes RPC useful, using RPC to accomplish this +task. +.NH 2 +\&Authentication +.LP +The RPC protocol provides the fields necessary for a client to +identify itself to a service and vice-versa. Security and access +control mechanisms can be built on top of the message authentication. +Several different authentication protocols can be supported. A field +in the RPC header indicates which protocol is being used. More +information on specific authentication protocols can be found in the +\fIAuthentication Protocols\fP\, +below. +.KS +.NH 1 +\&RPC Protocol Requirements +.LP +The RPC protocol must provide for the following: +.IP 1. +Unique specification of a procedure to be called. +.IP 2. +Provisions for matching response messages to request messages. +.KE +.IP 3. +Provisions for authenticating the caller to service and vice-versa. +.LP +Besides these requirements, features that detect the following are +worth supporting because of protocol roll-over errors, implementation +bugs, user error, and network administration: +.IP 1. +RPC protocol mismatches. +.IP 2. +Remote program protocol version mismatches. +.IP 3. +Protocol errors (such as misspecification of a procedure's parameters). +.IP 4. +Reasons why remote authentication failed. +.IP 5. +Any other reasons why the desired procedure was not called. +.NH 2 +\&Programs and Procedures +.LP +The RPC call message has three unsigned fields: remote program +number, remote program version number, and remote procedure number. +The three fields uniquely identify the procedure to be called. +Program numbers are administered by some central authority (like +Sun). Once an implementor has a program number, he can implement his +remote program; the first implementation would most likely have the +version number of 1. Because most new protocols evolve into better, +stable, and mature protocols, a version field of the call message +identifies which version of the protocol the caller is using. +Version numbers make speaking old and new protocols through the same +server process possible. +.LP +The procedure number identifies the procedure to be called. These +numbers are documented in the specific program's protocol +specification. For example, a file service's protocol specification +may state that its procedure number 5 is "read" and procedure number +12 is "write". +.LP +Just as remote program protocols may change over several versions, +the actual RPC message protocol could also change. Therefore, the +call message also has in it the RPC version number, which is always +equal to two for the version of RPC described here. +.LP +The reply message to a request message has enough information to +distinguish the following error conditions: +.IP 1. +The remote implementation of RPC does speak protocol version 2. +The lowest and highest supported RPC version numbers are returned. +.IP 2. +The remote program is not available on the remote system. +.IP 3. +The remote program does not support the requested version number. +The lowest and highest supported remote program version numbers are +returned. +.IP 4. +The requested procedure number does not exist. (This is usually a +caller side protocol or programming error.) +.IP 5. +The parameters to the remote procedure appear to be garbage from the +server's point of view. (Again, this is usually caused by a +disagreement about the protocol between client and service.) +.NH 2 +\&Authentication +.LP +Provisions for authentication of caller to service and vice-versa are +provided as a part of the RPC protocol. The call message has two +authentication fields, the credentials and verifier. The reply +message has one authentication field, the response verifier. The RPC +protocol specification defines all three fields to be the following +opaque type: +.DS +.ft CW +.vs 11 +enum auth_flavor { + AUTH_NULL = 0, + AUTH_UNIX = 1, + AUTH_SHORT = 2, + AUTH_DES = 3 + /* \fIand more to be defined\fP */ +}; + +struct opaque_auth { + auth_flavor flavor; + opaque body<400>; +}; +.DE +.LP +In simple English, any +.I opaque_auth +structure is an +.I auth_flavor +enumeration followed by bytes which are opaque to the RPC protocol +implementation. +.LP +The interpretation and semantics of the data contained within the +authentication fields is specified by individual, independent +authentication protocol specifications. (See +\fIAuthentication Protocols\fP\, +below, for definitions of the various authentication protocols.) +.LP +If authentication parameters were rejected, the response message +contains information stating why they were rejected. +.NH 2 +\&Program Number Assignment +.LP +Program numbers are given out in groups of +.I 0x20000000 +(decimal 536870912) according to the following chart: +.TS +box tab (&) ; +lfI lfI +rfL cfI . +Program Numbers&Description +_ +.sp .5 +0 - 1fffffff&Defined by Sun +20000000 - 3fffffff&Defined by user +40000000 - 5fffffff&Transient +60000000 - 7fffffff&Reserved +80000000 - 9fffffff&Reserved +a0000000 - bfffffff&Reserved +c0000000 - dfffffff&Reserved +e0000000 - ffffffff&Reserved +.TE +.LP +The first group is a range of numbers administered by Sun +Microsystems and should be identical for all sites. The second range +is for applications peculiar to a particular site. This range is +intended primarily for debugging new programs. When a site develops +an application that might be of general interest, that application +should be given an assigned number in the first range. The third +group is for applications that generate program numbers dynamically. +The final groups are reserved for future use, and should not be used. +.NH 2 +\&Other Uses of the RPC Protocol +.LP +The intended use of this protocol is for calling remote procedures. +That is, each call message is matched with a response message. +However, the protocol itself is a message-passing protocol with which +other (non-RPC) protocols can be implemented. Sun currently uses, or +perhaps abuses, the RPC message protocol for the following two +(non-RPC) protocols: batching (or pipelining) and broadcast RPC. +These two protocols are discussed but not defined below. +.NH 3 +\&Batching +.LP +Batching allows a client to send an arbitrarily large sequence of +call messages to a server; batching typically uses reliable byte +stream protocols (like TCP/IP) for its transport. In the case of +batching, the client never waits for a reply from the server, and the +server does not send replies to batch requests. A sequence of batch +calls is usually terminated by a legitimate RPC in order to flush the +pipeline (with positive acknowledgement). +.NH 3 +\&Broadcast RPC +.LP +In broadcast RPC-based protocols, the client sends a broadcast packet +to the network and waits for numerous replies. Broadcast RPC uses +unreliable, packet-based protocols (like UDP/IP) as its transports. +Servers that support broadcast protocols only respond when the +request is successfully processed, and are silent in the face of +errors. Broadcast RPC uses the Port Mapper RPC service to achieve +its semantics. See the \fIPort Mapper Program Protocol\fP\, below, +for more information. +.KS +.NH 1 +\&The RPC Message Protocol +.LP +This section defines the RPC message protocol in the XDR data +description language. The message is defined in a top-down style. +.ie t .DS +.el .DS L +.ft CW +enum msg_type { + CALL = 0, + REPLY = 1 +}; + +.ft I +/* +* A reply to a call message can take on two forms: +* The message was either accepted or rejected. +*/ +.ft CW +enum reply_stat { + MSG_ACCEPTED = 0, + MSG_DENIED = 1 +}; + +.ft I +/* +* Given that a call message was accepted, the following is the +* status of an attempt to call a remote procedure. +*/ +.ft CW +enum accept_stat { + SUCCESS = 0, /* \fIRPC executed successfully \fP*/ + PROG_UNAVAIL = 1, /* \fIremote hasn't exported program \fP*/ + PROG_MISMATCH = 2, /* \fIremote can't support version # \fP*/ + PROC_UNAVAIL = 3, /* \fIprogram can't support procedure \fP*/ + GARBAGE_ARGS = 4 /* \fIprocedure can't decode params \fP*/ +}; +.DE +.ie t .DS +.el .DS L +.ft I +/* +* Reasons why a call message was rejected: +*/ +.ft CW +enum reject_stat { + RPC_MISMATCH = 0, /* \fIRPC version number != 2 \fP*/ + AUTH_ERROR = 1 /* \fIremote can't authenticate caller \fP*/ +}; + +.ft I +/* +* Why authentication failed: +*/ +.ft CW +enum auth_stat { + AUTH_BADCRED = 1, /* \fIbad credentials \fP*/ + AUTH_REJECTEDCRED = 2, /* \fIclient must begin new session \fP*/ + AUTH_BADVERF = 3, /* \fIbad verifier \fP*/ + AUTH_REJECTEDVERF = 4, /* \fIverifier expired or replayed \fP*/ + AUTH_TOOWEAK = 5 /* \fIrejected for security reasons \fP*/ +}; +.DE +.KE +.ie t .DS +.el .DS L +.ft I +/* +* The RPC message: +* All messages start with a transaction identifier, xid, +* followed by a two-armed discriminated union. The union's +* discriminant is a msg_type which switches to one of the two +* types of the message. The xid of a \fIREPLY\fP message always +* matches that of the initiating \fICALL\fP message. NB: The xid +* field is only used for clients matching reply messages with +* call messages or for servers detecting retransmissions; the +* service side cannot treat this id as any type of sequence +* number. +*/ +.ft CW +struct rpc_msg { + unsigned int xid; + union switch (msg_type mtype) { + case CALL: + call_body cbody; + case REPLY: + reply_body rbody; + } body; +}; +.DE +.ie t .DS +.el .DS L +.ft I +/* +* Body of an RPC request call: +* In version 2 of the RPC protocol specification, rpcvers must +* be equal to 2. The fields prog, vers, and proc specify the +* remote program, its version number, and the procedure within +* the remote program to be called. After these fields are two +* authentication parameters: cred (authentication credentials) +* and verf (authentication verifier). The two authentication +* parameters are followed by the parameters to the remote +* procedure, which are specified by the specific program +* protocol. +*/ +.ft CW +struct call_body { + unsigned int rpcvers; /* \fImust be equal to two (2) \fP*/ + unsigned int prog; + unsigned int vers; + unsigned int proc; + opaque_auth cred; + opaque_auth verf; + /* \fIprocedure specific parameters start here \fP*/ +}; +.DE +.ie t .DS +.el .DS L +.ft I +/* +* Body of a reply to an RPC request: +* The call message was either accepted or rejected. +*/ +.ft CW +union reply_body switch (reply_stat stat) { + case MSG_ACCEPTED: + accepted_reply areply; + case MSG_DENIED: + rejected_reply rreply; +} reply; +.DE +.ie t .DS +.el .DS L +.ft I +/* +* Reply to an RPC request that was accepted by the server: +* there could be an error even though the request was accepted. +* The first field is an authentication verifier that the server +* generates in order to validate itself to the caller. It is +* followed by a union whose discriminant is an enum +* accept_stat. The \fISUCCESS\fP arm of the union is protocol +* specific. The \fIPROG_UNAVAIL\fP, \fIPROC_UNAVAIL\fP, and \fIGARBAGE_ARGP\fP +* arms of the union are void. The \fIPROG_MISMATCH\fP arm specifies +* the lowest and highest version numbers of the remote program +* supported by the server. +*/ +.ft CW +struct accepted_reply { + opaque_auth verf; + union switch (accept_stat stat) { + case SUCCESS: + opaque results[0]; + /* \fIprocedure-specific results start here\fP */ + case PROG_MISMATCH: + struct { + unsigned int low; + unsigned int high; + } mismatch_info; + default: +.ft I + /* + * Void. Cases include \fIPROG_UNAVAIL, PROC_UNAVAIL\fP, + * and \fIGARBAGE_ARGS\fP. + */ +.ft CW + void; + } reply_data; +}; +.DE +.ie t .DS +.el .DS L +.ft I +/* +* Reply to an RPC request that was rejected by the server: +* The request can be rejected for two reasons: either the +* server is not running a compatible version of the RPC +* protocol (\fIRPC_MISMATCH\fP), or the server refuses to +* authenticate the caller (\fIAUTH_ERROR\fP). In case of an RPC +* version mismatch, the server returns the lowest and highest +* supported RPC version numbers. In case of refused +* authentication, failure status is returned. +*/ +.ft CW +union rejected_reply switch (reject_stat stat) { + case RPC_MISMATCH: + struct { + unsigned int low; + unsigned int high; + } mismatch_info; + case AUTH_ERROR: + auth_stat stat; +}; +.DE +.NH 1 +\&Authentication Protocols +.LP +As previously stated, authentication parameters are opaque, but +open-ended to the rest of the RPC protocol. This section defines +some "flavors" of authentication implemented at (and supported by) +Sun. Other sites are free to invent new authentication types, with +the same rules of flavor number assignment as there is for program +number assignment. +.NH 2 +\&Null Authentication +.LP +Often calls must be made where the caller does not know who he is or +the server does not care who the caller is. In this case, the flavor +value (the discriminant of the \fIopaque_auth\fP's union) of the RPC +message's credentials, verifier, and response verifier is +.I AUTH_NULL . +The bytes of the opaque_auth's body are undefined. +It is recommended that the opaque length be zero. +.NH 2 +\&UNIX Authentication +.LP +The caller of a remote procedure may wish to identify himself as he +is identified on a UNIX system. The value of the credential's +discriminant of an RPC call message is +.I AUTH_UNIX . +The bytes of +the credential's opaque body encode the following structure: +.DS +.ft CW +struct auth_unix { + unsigned int stamp; + string machinename<255>; + unsigned int uid; + unsigned int gid; + unsigned int gids<10>; +}; +.DE +The +.I stamp +is an arbitrary ID which the caller machine may +generate. The +.I machinename +is the name of the caller's machine (like "krypton"). The +.I uid +is the caller's effective user ID. The +.I gid +is the caller's effective group ID. The +.I gids +is a +counted array of groups which contain the caller as a member. The +verifier accompanying the credentials should be of +.I AUTH_NULL +(defined above). +.LP +The value of the discriminant of the response verifier received in +the reply message from the server may be +.I AUTH_NULL +or +.I AUTH_SHORT . +In the case of +.I AUTH_SHORT , +the bytes of the response verifier's string encode an opaque +structure. This new opaque structure may now be passed to the server +instead of the original +.I AUTH_UNIX +flavor credentials. The server keeps a cache which maps shorthand +opaque structures (passed back by way of an +.I AUTH_SHORT +style response verifier) to the original credentials of the caller. +The caller can save network bandwidth and server cpu cycles by using +the new credentials. +.LP +The server may flush the shorthand opaque structure at any time. If +this happens, the remote procedure call message will be rejected due +to an authentication error. The reason for the failure will be +.I AUTH_REJECTEDCRED . +At this point, the caller may wish to try the original +.I AUTH_UNIX +style of credentials. +.KS +.NH 2 +\&DES Authentication +.LP +UNIX authentication suffers from two major problems: +.IP 1. +The naming is too UNIX-system oriented. +.IP 2. +There is no verifier, so credentials can easily be faked. +.LP +DES authentication attempts to fix these two problems. +.KE +.NH 3 +\&Naming +.LP +The first problem is handled by addressing the caller by a simple +string of characters instead of by an operating system specific +integer. This string of characters is known as the "netname" or +network name of the caller. The server is not allowed to interpret +the contents of the caller's name in any other way except to +identify the caller. Thus, netnames should be unique for every +caller in the internet. +.LP +It is up to each operating system's implementation of DES +authentication to generate netnames for its users that insure this +uniqueness when they call upon remote servers. Operating systems +already know how to distinguish users local to their systems. It is +usually a simple matter to extend this mechanism to the network. +For example, a UNIX user at Sun with a user ID of 515 might be +assigned the following netname: "unix.515@sun.com". This netname +contains three items that serve to insure it is unique. Going +backwards, there is only one naming domain called "sun.com" in the +internet. Within this domain, there is only one UNIX user with +user ID 515. However, there may be another user on another +operating system, for example VMS, within the same naming domain +that, by coincidence, happens to have the same user ID. To insure +that these two users can be distinguished we add the operating +system name. So one user is "unix.515@sun.com" and the other is +"vms.515@sun.com". +.LP +The first field is actually a naming method rather than an +operating system name. It just happens that today there is almost +a one-to-one correspondence between naming methods and operating +systems. If the world could agree on a naming standard, the first +field could be the name of that standard, instead of an operating +system name. +.LP +.NH 3 +\&DES Authentication Verifiers +.LP +Unlike UNIX authentication, DES authentication does have a verifier +so the server can validate the client's credential (and +vice-versa). The contents of this verifier is primarily an +encrypted timestamp. The server can decrypt this timestamp, and if +it is close to what the real time is, then the client must have +encrypted it correctly. The only way the client could encrypt it +correctly is to know the "conversation key" of the RPC session. And +if the client knows the conversation key, then it must be the real +client. +.LP +The conversation key is a DES [5] key which the client generates +and notifies the server of in its first RPC call. The conversation +key is encrypted using a public key scheme in this first +transaction. The particular public key scheme used in DES +authentication is Diffie-Hellman [3] with 192-bit keys. The +details of this encryption method are described later. +.LP +The client and the server need the same notion of the current time +in order for all of this to work. If network time synchronization +cannot be guaranteed, then client can synchronize with the server +before beginning the conversation, perhaps by consulting the +Internet Time Server (TIME[4]). +.LP +The way a server determines if a client timestamp is valid is +somewhat complicated. For any other transaction but the first, the +server just checks for two things: +.IP 1. +the timestamp is greater than the one previously seen from the +same client. +.IP 2. +the timestamp has not expired. +.LP +A timestamp is expired if the server's time is later than the sum +of the client's timestamp plus what is known as the client's +"window". The "window" is a number the client passes (encrypted) +to the server in its first transaction. You can think of it as a +lifetime for the credential. +.LP +This explains everything but the first transaction. In the first +transaction, the server checks only that the timestamp has not +expired. If this was all that was done though, then it would be +quite easy for the client to send random data in place of the +timestamp with a fairly good chance of succeeding. As an added +check, the client sends an encrypted item in the first transaction +known as the "window verifier" which must be equal to the window +minus 1, or the server will reject the credential. +.LP +The client too must check the verifier returned from the server to +be sure it is legitimate. The server sends back to the client the +encrypted timestamp it received from the client, minus one second. +If the client gets anything different than this, it will reject it. +.LP +.NH 3 +\&Nicknames and Clock Synchronization +.LP +After the first transaction, the server's DES authentication +subsystem returns in its verifier to the client an integer +"nickname" which the client may use in its further transactions +instead of passing its netname, encrypted DES key and window every +time. The nickname is most likely an index into a table on the +server which stores for each client its netname, decrypted DES key +and window. +.LP +Though they originally were synchronized, the client's and server's +clocks can get out of sync again. When this happens the client RPC +subsystem most likely will get back +.I RPC_AUTHERROR +at which point it should resynchronize. +.LP +A client may still get the +.I RPC_AUTHERROR +error even though it is +synchronized with the server. The reason is that the server's +nickname table is a limited size, and it may flush entries whenever +it wants. A client should resend its original credential in this +case and the server will give it a new nickname. If a server +crashes, the entire nickname table gets flushed, and all clients +will have to resend their original credentials. +.KS +.NH 3 +\&DES Authentication Protocol (in XDR language) +.ie t .DS +.el .DS L +.ft I +/* +* There are two kinds of credentials: one in which the client uses +* its full network name, and one in which it uses its "nickname" +* (just an unsigned integer) given to it by the server. The +* client must use its fullname in its first transaction with the +* server, in which the server will return to the client its +* nickname. The client may use its nickname in all further +* transactions with the server. There is no requirement to use the +* nickname, but it is wise to use it for performance reasons. +*/ +.ft CW +enum authdes_namekind { + ADN_FULLNAME = 0, + ADN_NICKNAME = 1 +}; + +.ft I +/* +* A 64-bit block of encrypted DES data +*/ +.ft CW +typedef opaque des_block[8]; + +.ft I +/* +* Maximum length of a network user's name +*/ +.ft CW +const MAXNETNAMELEN = 255; + +.ft I +/* +* A fullname contains the network name of the client, an encrypted +* conversation key and the window. The window is actually a +* lifetime for the credential. If the time indicated in the +* verifier timestamp plus the window has past, then the server +* should expire the request and not grant it. To insure that +* requests are not replayed, the server should insist that +* timestamps are greater than the previous one seen, unless it is +* the first transaction. In the first transaction, the server +* checks instead that the window verifier is one less than the +* window. +*/ +.ft CW +struct authdes_fullname { +string name; /* \fIname of client \f(CW*/ +des_block key; /* \fIPK encrypted conversation key \f(CW*/ +unsigned int window; /* \fIencrypted window \f(CW*/ +}; + +.ft I +/* +* A credential is either a fullname or a nickname +*/ +.ft CW +union authdes_cred switch (authdes_namekind adc_namekind) { + case ADN_FULLNAME: + authdes_fullname adc_fullname; + case ADN_NICKNAME: + unsigned int adc_nickname; +}; + +.ft I +/* +* A timestamp encodes the time since midnight, January 1, 1970. +*/ +.ft CW +struct timestamp { + unsigned int seconds; /* \fIseconds \fP*/ + unsigned int useconds; /* \fIand microseconds \fP*/ +}; + +.ft I +/* +* Verifier: client variety +* The window verifier is only used in the first transaction. In +* conjunction with a fullname credential, these items are packed +* into the following structure before being encrypted: +* +* \f(CWstruct {\fP +* \f(CWadv_timestamp; \fP-- one DES block +* \f(CWadc_fullname.window; \fP-- one half DES block +* \f(CWadv_winverf; \fP-- one half DES block +* \f(CW}\fP +* This structure is encrypted using CBC mode encryption with an +* input vector of zero. All other encryptions of timestamps use +* ECB mode encryption. +*/ +.ft CW +struct authdes_verf_clnt { + timestamp adv_timestamp; /* \fIencrypted timestamp \fP*/ + unsigned int adv_winverf; /* \fIencrypted window verifier \fP*/ +}; + +.ft I +/* +* Verifier: server variety +* The server returns (encrypted) the same timestamp the client +* gave it minus one second. It also tells the client its nickname +* to be used in future transactions (unencrypted). +*/ +.ft CW +struct authdes_verf_svr { +timestamp adv_timeverf; /* \fIencrypted verifier \fP*/ +unsigned int adv_nickname; /* \fInew nickname for client \fP*/ +}; +.DE +.KE +.NH 3 +\&Diffie-Hellman Encryption +.LP +In this scheme, there are two constants, +.I BASE +and +.I MODULUS . +The +particular values Sun has chosen for these for the DES +authentication protocol are: +.ie t .DS +.el .DS L +.ft CW +const BASE = 3; +const MODULUS = + "d4a0ba0250b6fd2ec626e7efd637df76c716e22d0944b88b"; /* \fIhex \fP*/ +.DE +.ft R +The way this scheme works is best explained by an example. Suppose +there are two people "A" and "B" who want to send encrypted +messages to each other. So, A and B both generate "secret" keys at +random which they do not reveal to anyone. Let these keys be +represented as SK(A) and SK(B). They also publish in a public +directory their "public" keys. These keys are computed as follows: +.ie t .DS +.el .DS L +.ft CW +PK(A) = ( BASE ** SK(A) ) mod MODULUS +PK(B) = ( BASE ** SK(B) ) mod MODULUS +.DE +.ft R +The "**" notation is used here to represent exponentiation. Now, +both A and B can arrive at the "common" key between them, +represented here as CK(A, B), without revealing their secret keys. +.LP +A computes: +.ie t .DS +.el .DS L +.ft CW +CK(A, B) = ( PK(B) ** SK(A)) mod MODULUS +.DE +.ft R +while B computes: +.ie t .DS +.el .DS L +.ft CW +CK(A, B) = ( PK(A) ** SK(B)) mod MODULUS +.DE +.ft R +These two can be shown to be equivalent: +.ie t .DS +.el .DS L +.ft CW +(PK(B) ** SK(A)) mod MODULUS = (PK(A) ** SK(B)) mod MODULUS +.DE +.ft R +We drop the "mod MODULUS" parts and assume modulo arithmetic to +simplify things: +.ie t .DS +.el .DS L +.ft CW +PK(B) ** SK(A) = PK(A) ** SK(B) +.DE +.ft R +Then, replace PK(B) by what B computed earlier and likewise for +PK(A). +.ie t .DS +.el .DS L +.ft CW +((BASE ** SK(B)) ** SK(A) = (BASE ** SK(A)) ** SK(B) +.DE +.ft R +which leads to: +.ie t .DS +.el .DS L +.ft CW +BASE ** (SK(A) * SK(B)) = BASE ** (SK(A) * SK(B)) +.DE +.ft R +This common key CK(A, B) is not used to encrypt the timestamps used +in the protocol. Rather, it is used only to encrypt a conversation +key which is then used to encrypt the timestamps. The reason for +doing this is to use the common key as little as possible, for fear +that it could be broken. Breaking the conversation key is a far +less serious offense, since conversations are relatively +short-lived. +.LP +The conversation key is encrypted using 56-bit DES keys, yet the +common key is 192 bits. To reduce the number of bits, 56 bits are +selected from the common key as follows. The middle-most 8-bytes +are selected from the common key, and then parity is added to the +lower order bit of each byte, producing a 56-bit key with 8 bits of +parity. +.KS +.NH 1 +\&Record Marking Standard +.LP +When RPC messages are passed on top of a byte stream protocol (like +TCP/IP), it is necessary, or at least desirable, to delimit one +message from another in order to detect and possibly recover from +user protocol errors. This is called record marking (RM). Sun uses +this RM/TCP/IP transport for passing RPC messages on TCP streams. +One RPC message fits into one RM record. +.LP +A record is composed of one or more record fragments. A record +fragment is a four-byte header followed by 0 to (2**31) - 1 bytes of +fragment data. The bytes encode an unsigned binary number; as with +XDR integers, the byte order is from highest to lowest. The number +encodes two values\(ema boolean which indicates whether the fragment +is the last fragment of the record (bit value 1 implies the fragment +is the last fragment) and a 31-bit unsigned binary value which is the +length in bytes of the fragment's data. The boolean value is the +highest-order bit of the header; the length is the 31 low-order bits. +(Note that this record specification is NOT in XDR standard form!) +.KE +.KS +.NH 1 +\&The RPC Language +.LP +Just as there was a need to describe the XDR data-types in a formal +language, there is also need to describe the procedures that operate +on these XDR data-types in a formal language as well. We use the RPC +Language for this purpose. It is an extension to the XDR language. +The following example is used to describe the essence of the +language. +.NH 2 +\&An Example Service Described in the RPC Language +.LP +Here is an example of the specification of a simple ping program. +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* +* Simple ping program +*/ +.ft CW +program PING_PROG { + /* \fILatest and greatest version\fP */ + version PING_VERS_PINGBACK { + void + PINGPROC_NULL(void) = 0; + +.ft I + /* + * Ping the caller, return the round-trip time + * (in microseconds). Returns -1 if the operation + * timed out. + */ +.ft CW + int + PINGPROC_PINGBACK(void) = 1; +} = 2; + +.ft I +/* +* Original version +*/ +.ft CW +version PING_VERS_ORIG { + void + PINGPROC_NULL(void) = 0; + } = 1; +} = 1; + +const PING_VERS = 2; /* \fIlatest version \fP*/ +.vs +.DE +.KE +.LP +The first version described is +.I PING_VERS_PINGBACK +with two procedures, +.I PINGPROC_NULL +and +.I PINGPROC_PINGBACK . +.I PINGPROC_NULL +takes no arguments and returns no results, but it is useful for +computing round-trip times from the client to the server and back +again. By convention, procedure 0 of any RPC protocol should have +the same semantics, and never require any kind of authentication. +The second procedure is used for the client to have the server do a +reverse ping operation back to the client, and it returns the amount +of time (in microseconds) that the operation used. The next version, +.I PING_VERS_ORIG , +is the original version of the protocol +and it does not contain +.I PINGPROC_PINGBACK +procedure. It is useful +for compatibility with old client programs, and as this program +matures it may be dropped from the protocol entirely. +.KS +.NH 2 +\&The RPC Language Specification +.LP +The RPC language is identical to the XDR language, except for the +added definition of a +.I program-def +described below. +.DS +.ft CW +program-def: + "program" identifier "{" + version-def + version-def * + "}" "=" constant ";" + +version-def: + "version" identifier "{" + procedure-def + procedure-def * + "}" "=" constant ";" + +procedure-def: + type-specifier identifier "(" type-specifier ")" + "=" constant ";" +.DE +.KE +.NH 2 +\&Syntax Notes +.IP 1. +The following keywords are added and cannot be used as +identifiers: "program" and "version"; +.IP 2. +A version name cannot occur more than once within the scope of +a program definition. Nor can a version number occur more than once +within the scope of a program definition. +.IP 3. +A procedure name cannot occur more than once within the scope +of a version definition. Nor can a procedure number occur more than +once within the scope of version definition. +.IP 4. +Program identifiers are in the same name space as constant and +type identifiers. +.IP 5. +Only unsigned constants can be assigned to programs, versions +and procedures. +.NH 1 +\&Port Mapper Program Protocol +.LP +The port mapper program maps RPC program and version numbers to +transport-specific port numbers. This program makes dynamic binding +of remote programs possible. +.LP +This is desirable because the range of reserved port numbers is very +small and the number of potential remote programs is very large. By +running only the port mapper on a reserved port, the port numbers of +other remote programs can be ascertained by querying the port mapper. +.LP +The port mapper also aids in broadcast RPC. A given RPC program will +usually have different port number bindings on different machines, so +there is no way to directly broadcast to all of these programs. The +port mapper, however, does have a fixed port number. So, to +broadcast to a given program, the client actually sends its message +to the port mapper located at the broadcast address. Each port +mapper that picks up the broadcast then calls the local service +specified by the client. When the port mapper gets the reply from +the local service, it sends the reply on back to the client. +.KS +.NH 2 +\&Port Mapper Protocol Specification (in RPC Language) +.ie t .DS +.el .DS L +.ft CW +.vs 11 +const PMAP_PORT = 111; /* \fIportmapper port number \fP*/ + +.ft I +/* +* A mapping of (program, version, protocol) to port number +*/ +.ft CW +struct mapping { + unsigned int prog; + unsigned int vers; + unsigned int prot; + unsigned int port; +}; + +.ft I +/* +* Supported values for the "prot" field +*/ +.ft CW +const IPPROTO_TCP = 6; /* \fIprotocol number for TCP/IP \fP*/ +const IPPROTO_UDP = 17; /* \fIprotocol number for UDP/IP \fP*/ + +.ft I +/* +* A list of mappings +*/ +.ft CW +struct *pmaplist { + mapping map; + pmaplist next; +}; +.vs +.DE +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* +* Arguments to callit +*/ +.ft CW +struct call_args { + unsigned int prog; + unsigned int vers; + unsigned int proc; + opaque args<>; +}; + +.ft I +/* +* Results of callit +*/ +.ft CW +struct call_result { + unsigned int port; + opaque res<>; +}; +.vs +.DE +.KE +.ie t .DS +.el .DS L +.vs 11 +.ft I +/* +* Port mapper procedures +*/ +.ft CW +program PMAP_PROG { + version PMAP_VERS { + void + PMAPPROC_NULL(void) = 0; + + bool + PMAPPROC_SET(mapping) = 1; + + bool + PMAPPROC_UNSET(mapping) = 2; + + unsigned int + PMAPPROC_GETPORT(mapping) = 3; + + pmaplist + PMAPPROC_DUMP(void) = 4; + + call_result + PMAPPROC_CALLIT(call_args) = 5; + } = 2; +} = 100000; +.vs +.DE +.NH 2 +\&Port Mapper Operation +.LP +The portmapper program currently supports two protocols (UDP/IP and +TCP/IP). The portmapper is contacted by talking to it on assigned +port number 111 (SUNRPC [8]) on either of these protocols. The +following is a description of each of the portmapper procedures: +.IP \fBPMAPPROC_NULL:\fP +This procedure does no work. By convention, procedure zero of any +protocol takes no parameters and returns no results. +.IP \fBPMAPPROC_SET:\fP +When a program first becomes available on a machine, it registers +itself with the port mapper program on the same machine. The program +passes its program number "prog", version number "vers", transport +protocol number "prot", and the port "port" on which it awaits +service request. The procedure returns a boolean response whose +value is +.I TRUE +if the procedure successfully established the mapping and +.I FALSE +otherwise. The procedure refuses to establish +a mapping if one already exists for the tuple "(prog, vers, prot)". +.IP \fBPMAPPROC_UNSET:\fP +When a program becomes unavailable, it should unregister itself with +the port mapper program on the same machine. The parameters and +results have meanings identical to those of +.I PMAPPROC_SET . +The protocol and port number fields of the argument are ignored. +.IP \fBPMAPPROC_GETPORT:\fP +Given a program number "prog", version number "vers", and transport +protocol number "prot", this procedure returns the port number on +which the program is awaiting call requests. A port value of zeros +means the program has not been registered. The "port" field of the +argument is ignored. +.IP \fBPMAPPROC_DUMP:\fP +This procedure enumerates all entries in the port mapper's database. +The procedure takes no parameters and returns a list of program, +version, protocol, and port values. +.IP \fBPMAPPROC_CALLIT:\fP +This procedure allows a caller to call another remote procedure on +the same machine without knowing the remote procedure's port number. +It is intended for supporting broadcasts to arbitrary remote programs +via the well-known port mapper's port. The parameters "prog", +"vers", "proc", and the bytes of "args" are the program number, +version number, procedure number, and parameters of the remote +procedure. +.LP +.B Note: +.RS +.IP 1. +This procedure only sends a response if the procedure was +successfully executed and is silent (no response) otherwise. +.IP 2. +The port mapper communicates with the remote program using UDP/IP +only. +.RE +.LP +The procedure returns the remote program's port number, and the bytes +of results are the results of the remote procedure. +.bp +.NH 1 +\&References +.LP +[1] Birrell, Andrew D. & Nelson, Bruce Jay; "Implementing Remote +Procedure Calls"; XEROX CSL-83-7, October 1983. +.LP +[2] Cheriton, D.; "VMTP: Versatile Message Transaction Protocol", +Preliminary Version 0.3; Stanford University, January 1987. +.LP +[3] Diffie & Hellman; "New Directions in Cryptography"; IEEE +Transactions on Information Theory IT-22, November 1976. +.LP +[4] Harrenstien, K.; "Time Server", RFC 738; Information Sciences +Institute, October 1977. +.LP +[5] National Bureau of Standards; "Data Encryption Standard"; Federal +Information Processing Standards Publication 46, January 1977. +.LP +[6] Postel, J.; "Transmission Control Protocol - DARPA Internet +Program Protocol Specification", RFC 793; Information Sciences +Institute, September 1981. +.LP +[7] Postel, J.; "User Datagram Protocol", RFC 768; Information Sciences +Institute, August 1980. +.LP +[8] Reynolds, J. & Postel, J.; "Assigned Numbers", RFC 923; Information +Sciences Institute, October 1984. diff --git a/share/doc/psd/26.rpcrfc/stubs b/share/doc/psd/26.rpcrfc/stubs new file mode 100644 index 0000000..78b0a2c --- /dev/null +++ b/share/doc/psd/26.rpcrfc/stubs @@ -0,0 +1,3 @@ +.\" $FreeBSD$ +.\" +.if t .ftr L CR diff --git a/share/doc/psd/27.nfsrpc/Makefile b/share/doc/psd/27.nfsrpc/Makefile index 5904787..c9d4f23 100644 --- a/share/doc/psd/27.nfsrpc/Makefile +++ b/share/doc/psd/27.nfsrpc/Makefile @@ -4,6 +4,5 @@ VOLUME= psd/27.nfsrfc SRCS= stubs nfs.rfc.ms MACROS= -ms USE_TBL= -SRCDIR= ${.CURDIR}/../../../../lib/libc/rpc/PSD.doc .include diff --git a/share/doc/psd/27.nfsrpc/nfs.rfc.ms b/share/doc/psd/27.nfsrpc/nfs.rfc.ms new file mode 100644 index 0000000..13d7619 --- /dev/null +++ b/share/doc/psd/27.nfsrpc/nfs.rfc.ms @@ -0,0 +1,1374 @@ +.\" +.\" Must use -- tbl -- with this one +.\" +.\" @(#)nfs.rfc.ms 2.2 88/08/05 4.0 RPCSRC +.\" $FreeBSD$ +.\" +.de BT +.if \\n%=1 .tl ''- % -'' +.. +.ND +.\" prevent excess underlining in nroff +.if n .fp 2 R +.OH 'Network File System: Version 2 Protocol Specification''Page %' +.EH 'Page %''Network File System: Version 2 Protocol Specification' +.if \n%=1 .bp +.SH +\&Network File System: Version 2 Protocol Specification +.IX NFS "" "" "" PAGE MAJOR +.IX "Network File System" "" "" "" PAGE MAJOR +.IX NFS "version-2 protocol specification" +.IX "Network File System" "version-2 protocol specification" +.LP +.NH 0 +\&Status of this Standard +.LP +Note: This document specifies a protocol that Sun Microsystems, Inc., +and others are using. It specifies it in standard ARPA RFC form. +.NH 1 +\&Introduction +.IX NFS introduction +.LP +The Sun Network Filesystem (NFS) protocol provides transparent remote +access to shared filesystems over local area networks. The NFS +protocol is designed to be machine, operating system, network architecture, +and transport protocol independent. This independence is +achieved through the use of Remote Procedure Call (RPC) primitives +built on top of an External Data Representation (XDR). Implementations +exist for a variety of machines, from personal computers to +supercomputers. +.LP +The supporting mount protocol allows the server to hand out remote +access privileges to a restricted set of clients. It performs the +operating system-specific functions that allow, for example, to +attach remote directory trees to some local file system. +.NH 2 +\&Remote Procedure Call +.IX "Remote Procedure Call" +.LP +Sun's remote procedure call specification provides a procedure- +oriented interface to remote services. Each server supplies a +program that is a set of procedures. NFS is one such "program". +The combination of host address, program number, and procedure +number specifies one remote service procedure. RPC does not depend +on services provided by specific protocols, so it can be used with +any underlying transport protocol. See the +.I "Remote Procedure Calls: Protocol Specification" +chapter of this manual. +.NH 2 +\&External Data Representation +.IX "External Data Representation" +.LP +The External Data Representation (XDR) standard provides a common +way of representing a set of data types over a network. +The NFS +Protocol Specification is written using the RPC data description +language. +For more information, see the +.I " External Data Representation Standard: Protocol Specification." +Sun provides implementations of XDR and +RPC, but NFS does not require their use. Any software that +provides equivalent functionality can be used, and if the encoding +is exactly the same it can interoperate with other implementations +of NFS. +.NH 2 +\&Stateless Servers +.IX "stateless servers" +.IX servers stateless +.LP +The NFS protocol is stateless. That is, a server does not need to +maintain any extra state information about any of its clients in +order to function correctly. Stateless servers have a distinct +advantage over stateful servers in the event of a failure. With +stateless servers, a client need only retry a request until the +server responds; it does not even need to know that the server has +crashed, or the network temporarily went down. The client of a +stateful server, on the other hand, needs to either detect a server +crash and rebuild the server's state when it comes back up, or +cause client operations to fail. +.LP +This may not sound like an important issue, but it affects the +protocol in some unexpected ways. We feel that it is worth a bit +of extra complexity in the protocol to be able to write very simple +servers that do not require fancy crash recovery. +.LP +On the other hand, NFS deals with objects such as files and +directories that inherently have state -- what good would a file be +if it did not keep its contents intact? The goal is to not +introduce any extra state in the protocol itself. Another way to +simplify recovery is by making operations "idempotent" whenever +possible (so that they can potentially be repeated). +.NH 1 +\&NFS Protocol Definition +.IX NFS "protocol definition" +.IX NFS protocol +.LP +Servers have been known to change over time, and so can the +protocol that they use. So RPC provides a version number with each +RPC request. This RFC describes version two of the NFS protocol. +Even in the second version, there are various obsolete procedures +and parameters, which will be removed in later versions. An RFC +for version three of the NFS protocol is currently under +preparation. +.NH 2 +\&File System Model +.IX filesystem model +.LP +NFS assumes a file system that is hierarchical, with directories as +all but the bottom-level files. Each entry in a directory (file, +directory, device, etc.) has a string name. Different operating +systems may have restrictions on the depth of the tree or the names +used, as well as using different syntax to represent the "pathname", +which is the concatenation of all the "components" (directory and +file names) in the name. A "file system" is a tree on a single +server (usually a single disk or physical partition) with a specified +"root". Some operating systems provide a "mount" operation to make +all file systems appear as a single tree, while others maintain a +"forest" of file systems. Files are unstructured streams of +uninterpreted bytes. Version 3 of NFS uses a slightly more general +file system model. +.LP +NFS looks up one component of a pathname at a time. It may not be +obvious why it does not just take the whole pathname, traipse down +the directories, and return a file handle when it is done. There are +several good reasons not to do this. First, pathnames need +separators between the directory components, and different operating +systems use different separators. We could define a Network Standard +Pathname Representation, but then every pathname would have to be +parsed and converted at each end. Other issues are discussed in +\fINFS Implementation Issues\fP below. +.LP +Although files and directories are similar objects in many ways, +different procedures are used to read directories and files. This +provides a network standard format for representing directories. The +same argument as above could have been used to justify a procedure +that returns only one directory entry per call. The problem is +efficiency. Directories can contain many entries, and a remote call +to return each would be just too slow. +.NH 2 +\&RPC Information +.IX NFS "RPC information" +.IP \fIAuthentication\fP +The NFS service uses +.I AUTH_UNIX , +.I AUTH_DES , +or +.I AUTH_SHORT +style +authentication, except in the NULL procedure where +.I AUTH_NONE +is also allowed. +.IP "\fITransport Protocols\fP" +NFS currently is supported on UDP/IP only. +.IP "\fIPort Number\fP" +The NFS protocol currently uses the UDP port number 2049. This is +not an officially assigned port, so later versions of the protocol +use the \*QPortmapping\*U facility of RPC. +.NH 2 +\&Sizes of XDR Structures +.IX "XDR structure sizes" +.LP +These are the sizes, given in decimal bytes, of various XDR +structures used in the protocol: +.DS +/* \fIThe maximum number of bytes of data in a READ or WRITE request\fP */ +const MAXDATA = 8192; + +/* \fIThe maximum number of bytes in a pathname argument\fP */ +const MAXPATHLEN = 1024; + +/* \fIThe maximum number of bytes in a file name argument\fP */ +const MAXNAMLEN = 255; + +/* \fIThe size in bytes of the opaque "cookie" passed by READDIR\fP */ +const COOKIESIZE = 4; + +/* \fIThe size in bytes of the opaque file handle\fP */ +const FHSIZE = 32; +.DE +.NH 2 +\&Basic Data Types +.IX "NFS data types" +.IX NFS "basic data types" +.LP +The following XDR definitions are basic structures and types used +in other structures described further on. +.KS +.NH 3 +\&stat +.IX "NFS data types" stat "" \fIstat\fP +.DS +enum stat { + NFS_OK = 0, + NFSERR_PERM=1, + NFSERR_NOENT=2, + NFSERR_IO=5, + NFSERR_NXIO=6, + NFSERR_ACCES=13, + NFSERR_EXIST=17, + NFSERR_NODEV=19, + NFSERR_NOTDIR=20, + NFSERR_ISDIR=21, + NFSERR_FBIG=27, + NFSERR_NOSPC=28, + NFSERR_ROFS=30, + NFSERR_NAMETOOLONG=63, + NFSERR_NOTEMPTY=66, + NFSERR_DQUOT=69, + NFSERR_STALE=70, + NFSERR_WFLUSH=99 +}; +.DE +.KE +.LP +The +.I stat +type is returned with every procedure's results. A +value of +.I NFS_OK +indicates that the call completed successfully and +the results are valid. The other values indicate some kind of +error occurred on the server side during the servicing of the +procedure. The error values are derived from UNIX error numbers. +.IP \fBNFSERR_PERM\fP: +Not owner. The caller does not have correct ownership +to perform the requested operation. +.IP \fBNFSERR_NOENT\fP: +No such file or directory. The file or directory +specified does not exist. +.IP \fBNFSERR_IO\fP: +Some sort of hard error occurred when the operation was +in progress. This could be a disk error, for example. +.IP \fBNFSERR_NXIO\fP: +No such device or address. +.IP \fBNFSERR_ACCES\fP: +Permission denied. The caller does not have the +correct permission to perform the requested operation. +.IP \fBNFSERR_EXIST\fP: +File exists. The file specified already exists. +.IP \fBNFSERR_NODEV\fP: +No such device. +.IP \fBNFSERR_NOTDIR\fP: +Not a directory. The caller specified a +non-directory in a directory operation. +.IP \fBNFSERR_ISDIR\fP: +Is a directory. The caller specified a directory in +a non- directory operation. +.IP \fBNFSERR_FBIG\fP: +File too large. The operation caused a file to grow +beyond the server's limit. +.IP \fBNFSERR_NOSPC\fP: +No space left on device. The operation caused the +server's filesystem to reach its limit. +.IP \fBNFSERR_ROFS\fP: +Read-only filesystem. Write attempted on a read-only filesystem. +.IP \fBNFSERR_NAMETOOLONG\fP: +File name too long. The file name in an operation was too long. +.IP \fBNFSERR_NOTEMPTY\fP: +Directory not empty. Attempted to remove a +directory that was not empty. +.IP \fBNFSERR_DQUOT\fP: +Disk quota exceeded. The client's disk quota on the +server has been exceeded. +.IP \fBNFSERR_STALE\fP: +The "fhandle" given in the arguments was invalid. +That is, the file referred to by that file handle no longer exists, +or access to it has been revoked. +.IP \fBNFSERR_WFLUSH\fP: +The server's write cache used in the +.I WRITECACHE +call got flushed to disk. +.LP +.KS +.NH 3 +\&ftype +.IX "NFS data types" ftype "" \fIftype\fP +.DS +enum ftype { + NFNON = 0, + NFREG = 1, + NFDIR = 2, + NFBLK = 3, + NFCHR = 4, + NFLNK = 5 +}; +.DE +.KE +The enumeration +.I ftype +gives the type of a file. The type +.I NFNON +indicates a non-file, +.I NFREG +is a regular file, +.I NFDIR +is a directory, +.I NFBLK +is a block-special device, +.I NFCHR +is a character-special device, and +.I NFLNK +is a symbolic link. +.KS +.NH 3 +\&fhandle +.IX "NFS data types" fhandle "" \fIfhandle\fP +.DS +typedef opaque fhandle[FHSIZE]; +.DE +.KE +The +.I fhandle +is the file handle passed between the server and the client. +All file operations are done using file handles to refer to a file or +directory. The file handle can contain whatever information the server +needs to distinguish an individual file. +.KS +.NH 3 +\&timeval +.IX "NFS data types" timeval "" \fItimeval\fP +.DS +struct timeval { + unsigned int seconds; + unsigned int useconds; +}; +.DE +.KE +The +.I timeval +structure is the number of seconds and microseconds +since midnight January 1, 1970, Greenwich Mean Time. It is used to +pass time and date information. +.KS +.NH 3 +\&fattr +.IX "NFS data types" fattr "" \fIfattr\fP +.DS +struct fattr { + ftype type; + unsigned int mode; + unsigned int nlink; + unsigned int uid; + unsigned int gid; + unsigned int size; + unsigned int blocksize; + unsigned int rdev; + unsigned int blocks; + unsigned int fsid; + unsigned int fileid; + timeval atime; + timeval mtime; + timeval ctime; +}; +.DE +.KE +The +.I fattr +structure contains the attributes of a file; "type" is the type of +the file; "nlink" is the number of hard links to the file (the number +of different names for the same file); "uid" is the user +identification number of the owner of the file; "gid" is the group +identification number of the group of the file; "size" is the size in +bytes of the file; "blocksize" is the size in bytes of a block of the +file; "rdev" is the device number of the file if it is type +.I NFCHR +or +.I NFBLK ; +"blocks" is the number of blocks the file takes up on disk; "fsid" is +the file system identifier for the filesystem containing the file; +"fileid" is a number that uniquely identifies the file within its +filesystem; "atime" is the time when the file was last accessed for +either read or write; "mtime" is the time when the file data was last +modified (written); and "ctime" is the time when the status of the +file was last changed. Writing to the file also changes "ctime" if +the size of the file changes. +.LP +"mode" is the access mode encoded as a set of bits. Notice that the +file type is specified both in the mode bits and in the file type. +This is really a bug in the protocol and will be fixed in future +versions. The descriptions given below specify the bit positions +using octal numbers. +.TS +box tab (&) ; +cfI cfI +lfL l . +Bit&Description +_ +0040000&This is a directory; "type" field should be NFDIR. +0020000&This is a character special file; "type" field should be NFCHR. +0060000&This is a block special file; "type" field should be NFBLK. +0100000&This is a regular file; "type" field should be NFREG. +0120000&This is a symbolic link file; "type" field should be NFLNK. +0140000&This is a named socket; "type" field should be NFNON. +0004000&Set user id on execution. +0002000&Set group id on execution. +0001000&Save swapped text even after use. +0000400&Read permission for owner. +0000200&Write permission for owner. +0000100&Execute and search permission for owner. +0000040&Read permission for group. +0000020&Write permission for group. +0000010&Execute and search permission for group. +0000004&Read permission for others. +0000002&Write permission for others. +0000001&Execute and search permission for others. +.TE +.KS +Notes: +.IP +The bits are the same as the mode bits returned by the +.I stat(2) +system call in the UNIX system. The file type is specified both in +the mode bits and in the file type. This is fixed in future +versions. +.IP +The "rdev" field in the attributes structure is an operating system +specific device specifier. It will be removed and generalized in +the next revision of the protocol. +.KE +.LP +.KS +.NH 3 +\&sattr +.IX "NFS data types" sattr "" \fIsattr\fP +.DS +struct sattr { + unsigned int mode; + unsigned int uid; + unsigned int gid; + unsigned int size; + timeval atime; + timeval mtime; +}; +.DE +.KE +The +.I sattr +structure contains the file attributes which can be set +from the client. The fields are the same as for +.I fattr +above. A "size" of zero means the file should be truncated. +A value of -1 indicates a field that should be ignored. +.LP +.KS +.NH 3 +\&filename +.IX "NFS data types" filename "" \fIfilename\fP +.DS +typedef string filename; +.DE +.KE +The type +.I filename +is used for passing file names or pathname components. +.LP +.KS +.NH 3 +\&path +.IX "NFS data types" path "" \fIpath\fP +.DS +typedef string path; +.DE +.KE +The type +.I path +is a pathname. The server considers it as a string +with no internal structure, but to the client it is the name of a +node in a filesystem tree. +.LP +.KS +.NH 3 +\&attrstat +.IX "NFS data types" attrstat "" \fIattrstat\fP +.DS +union attrstat switch (stat status) { + case NFS_OK: + fattr attributes; + default: + void; +}; +.DE +.KE +The +.I attrstat +structure is a common procedure result. It contains +a "status" and, if the call succeeded, it also contains the +attributes of the file on which the operation was done. +.LP +.KS +.NH 3 +\&diropargs +.IX "NFS data types" diropargs "" \fIdiropargs\fP +.DS +struct diropargs { + fhandle dir; + filename name; +}; +.DE +.KE +The +.I diropargs +structure is used in directory operations. The +"fhandle" "dir" is the directory in which to find the file "name". +A directory operation is one in which the directory is affected. +.LP +.KS +.NH 3 +\&diropres +.IX "NFS data types" diropres "" \fIdiropres\fP +.DS +union diropres switch (stat status) { + case NFS_OK: + struct { + fhandle file; + fattr attributes; + } diropok; + default: + void; +}; +.DE +.KE +The results of a directory operation are returned in a +.I diropres +structure. If the call succeeded, a new file handle "file" and the +"attributes" associated with that file are returned along with the +"status". +.NH 2 +\&Server Procedures +.IX "NFS server procedures" "" "" "" PAGE MAJOR +.LP +The protocol definition is given as a set of procedures with +arguments and results defined using the RPC language. A brief +description of the function of each procedure should provide enough +information to allow implementation. +.LP +All of the procedures in the NFS protocol are assumed to be +synchronous. When a procedure returns to the client, the client +can assume that the operation has completed and any data associated +with the request is now on stable storage. For example, a client +.I WRITE +request may cause the server to update data blocks, +filesystem information blocks (such as indirect blocks), and file +attribute information (size and modify times). When the +.I WRITE +returns to the client, it can assume that the write is safe, even +in case of a server crash, and it can discard the data written. +This is a very important part of the statelessness of the server. +If the server waited to flush data from remote requests, the client +would have to save those requests so that it could resend them in +case of a server crash. +.ie t .DS +.el .DS L + +.ft I +/* +* Remote file service routines +*/ +.ft CW +program NFS_PROGRAM { + version NFS_VERSION { + void NFSPROC_NULL(void) = 0; + attrstat NFSPROC_GETATTR(fhandle) = 1; + attrstat NFSPROC_SETATTR(sattrargs) = 2; + void NFSPROC_ROOT(void) = 3; + diropres NFSPROC_LOOKUP(diropargs) = 4; + readlinkres NFSPROC_READLINK(fhandle) = 5; + readres NFSPROC_READ(readargs) = 6; + void NFSPROC_WRITECACHE(void) = 7; + attrstat NFSPROC_WRITE(writeargs) = 8; + diropres NFSPROC_CREATE(createargs) = 9; + stat NFSPROC_REMOVE(diropargs) = 10; + stat NFSPROC_RENAME(renameargs) = 11; + stat NFSPROC_LINK(linkargs) = 12; + stat NFSPROC_SYMLINK(symlinkargs) = 13; + diropres NFSPROC_MKDIR(createargs) = 14; + stat NFSPROC_RMDIR(diropargs) = 15; + readdirres NFSPROC_READDIR(readdirargs) = 16; + statfsres NFSPROC_STATFS(fhandle) = 17; + } = 2; +} = 100003; +.DE +.KS +.NH 3 +\&Do Nothing +.IX "NFS server procedures" NFSPROC_NULL() "" \fINFSPROC_NULL()\fP +.DS +void +NFSPROC_NULL(void) = 0; +.DE +.KE +This procedure does no work. It is made available in all RPC +services to allow server response testing and timing. +.KS +.NH 3 +\&Get File Attributes +.IX "NFS server procedures" NFSPROC_GETATTR() "" \fINFSPROC_GETATTR()\fP +.DS +attrstat +NFSPROC_GETATTR (fhandle) = 1; +.DE +.KE +If the reply status is +.I NFS_OK , +then the reply attributes contains +the attributes for the file given by the input fhandle. +.KS +.NH 3 +\&Set File Attributes +.IX "NFS server procedures" NFSPROC_SETATTR() "" \fINFSPROC_SETATTR()\fP +.DS +struct sattrargs { + fhandle file; + sattr attributes; + }; + +attrstat +NFSPROC_SETATTR (sattrargs) = 2; +.DE +.KE +The "attributes" argument contains fields which are either -1 or +are the new value for the attributes of "file". If the reply +status is +.I NFS_OK , +then the reply attributes have the attributes of +the file after the "SETATTR" operation has completed. +.LP +Note: The use of -1 to indicate an unused field in "attributes" is +changed in the next version of the protocol. +.KS +.NH 3 +\&Get Filesystem Root +.IX "NFS server procedures" NFSPROC_ROOT "" \fINFSPROC_ROOT\fP +.DS +void +NFSPROC_ROOT(void) = 3; +.DE +.KE +Obsolete. This procedure is no longer used because finding the +root file handle of a filesystem requires moving pathnames between +client and server. To do this right we would have to define a +network standard representation of pathnames. Instead, the +function of looking up the root file handle is done by the +.I MNTPROC_MNT() +procedure. (See the +.I "Mount Protocol Definition" +later in this chapter for details). +.KS +.NH 3 +\&Look Up File Name +.IX "NFS server procedures" NFSPROC_LOOKUP() "" \fINFSPROC_LOOKUP()\fP +.DS +diropres +NFSPROC_LOOKUP(diropargs) = 4; +.DE +.KE +If the reply "status" is +.I NFS_OK , +then the reply "file" and reply +"attributes" are the file handle and attributes for the file "name" +in the directory given by "dir" in the argument. +.KS +.NH 3 +\&Read From Symbolic Link +.IX "NFS server procedures" NFSPROC_READLINK() "" \fINFSPROC_READLINK()\fP +.DS +union readlinkres switch (stat status) { + case NFS_OK: + path data; + default: + void; +}; + +readlinkres +NFSPROC_READLINK(fhandle) = 5; +.DE +.KE +If "status" has the value +.I NFS_OK , +then the reply "data" is the data in +the symbolic link given by the file referred to by the fhandle argument. +.LP +Note: since NFS always parses pathnames on the client, the +pathname in a symbolic link may mean something different (or be +meaningless) on a different client or on the server if a different +pathname syntax is used. +.KS +.NH 3 +\&Read From File +.IX "NFS server procedures" NFSPROC_READ "" \fINFSPROC_READ\fP +.DS +struct readargs { + fhandle file; + unsigned offset; + unsigned count; + unsigned totalcount; +}; + +union readres switch (stat status) { + case NFS_OK: + fattr attributes; + opaque data; + default: + void; +}; + +readres +NFSPROC_READ(readargs) = 6; +.DE +.KE +Returns up to "count" bytes of "data" from the file given by +"file", starting at "offset" bytes from the beginning of the file. +The first byte of the file is at offset zero. The file attributes +after the read takes place are returned in "attributes". +.LP +Note: The argument "totalcount" is unused, and is removed in the +next protocol revision. +.KS +.NH 3 +\&Write to Cache +.IX "NFS server procedures" NFSPROC_WRITECACHE() "" \fINFSPROC_WRITECACHE()\fP +.DS +void +NFSPROC_WRITECACHE(void) = 7; +.DE +.KE +To be used in the next protocol revision. +.KS +.NH 3 +\&Write to File +.IX "NFS server procedures" NFSPROC_WRITE() "" \fINFSPROC_WRITE()\fP +.DS +struct writeargs { + fhandle file; + unsigned beginoffset; + unsigned offset; + unsigned totalcount; + opaque data; +}; + +attrstat +NFSPROC_WRITE(writeargs) = 8; +.DE +.KE +Writes "data" beginning "offset" bytes from the beginning of +"file". The first byte of the file is at offset zero. If the +reply "status" is NFS_OK, then the reply "attributes" contains the +attributes of the file after the write has completed. The write +operation is atomic. Data from this call to +.I WRITE +will not be mixed with data from another client's calls. +.LP +Note: The arguments "beginoffset" and "totalcount" are ignored and +are removed in the next protocol revision. +.KS +.NH 3 +\&Create File +.IX "NFS server procedures" NFSPROC_CREATE() "" \fINFSPROC_CREATE()\fP +.DS +struct createargs { + diropargs where; + sattr attributes; +}; + +diropres +NFSPROC_CREATE(createargs) = 9; +.DE +.KE +The file "name" is created in the directory given by "dir". The +initial attributes of the new file are given by "attributes". A +reply "status" of NFS_OK indicates that the file was created, and +reply "file" and reply "attributes" are its file handle and +attributes. Any other reply "status" means that the operation +failed and no file was created. +.LP +Note: This routine should pass an exclusive create flag, meaning +"create the file only if it is not already there". +.KS +.NH 3 +\&Remove File +.IX "NFS server procedures" NFSPROC_REMOVE() "" \fINFSPROC_REMOVE()\fP +.DS +stat +NFSPROC_REMOVE(diropargs) = 10; +.DE +.KE +The file "name" is removed from the directory given by "dir". A +reply of NFS_OK means the directory entry was removed. +.LP +Note: possibly non-idempotent operation. +.KS +.NH 3 +\&Rename File +.IX "NFS server procedures" NFSPROC_RENAME() "" \fINFSPROC_RENAME()\fP +.DS +struct renameargs { + diropargs from; + diropargs to; +}; + +stat +NFSPROC_RENAME(renameargs) = 11; +.DE +.KE +The existing file "from.name" in the directory given by "from.dir" +is renamed to "to.name" in the directory given by "to.dir". If the +reply is +.I NFS_OK , +the file was renamed. The +RENAME +operation is +atomic on the server; it cannot be interrupted in the middle. +.LP +Note: possibly non-idempotent operation. +.KS +.NH 3 +\&Create Link to File +.IX "NFS server procedures" NFSPROC_LINK() "" \fINFSPROC_LINK()\fP +.DS +struct linkargs { + fhandle from; + diropargs to; +}; + +stat +NFSPROC_LINK(linkargs) = 12; +.DE +.KE +Creates the file "to.name" in the directory given by "to.dir", +which is a hard link to the existing file given by "from". If the +return value is +.I NFS_OK , +a link was created. Any other return value +indicates an error, and the link was not created. +.LP +A hard link should have the property that changes to either of the +linked files are reflected in both files. When a hard link is made +to a file, the attributes for the file should have a value for +"nlink" that is one greater than the value before the link. +.LP +Note: possibly non-idempotent operation. +.KS +.NH 3 +\&Create Symbolic Link +.IX "NFS server procedures" NFSPROC_SYMLINK() "" \fINFSPROC_SYMLINK()\fP +.DS +struct symlinkargs { + diropargs from; + path to; + sattr attributes; +}; + +stat +NFSPROC_SYMLINK(symlinkargs) = 13; +.DE +.KE +Creates the file "from.name" with ftype +.I NFLNK +in the directory +given by "from.dir". The new file contains the pathname "to" and +has initial attributes given by "attributes". If the return value +is +.I NFS_OK , +a link was created. Any other return value indicates an +error, and the link was not created. +.LP +A symbolic link is a pointer to another file. The name given in +"to" is not interpreted by the server, only stored in the newly +created file. When the client references a file that is a symbolic +link, the contents of the symbolic link are normally transparently +reinterpreted as a pathname to substitute. A +.I READLINK +operation returns the data to the client for interpretation. +.LP +Note: On UNIX servers the attributes are never used, since +symbolic links always have mode 0777. +.KS +.NH 3 +\&Create Directory +.IX "NFS server procedures" NFSPROC_MKDIR() "" \fINFSPROC_MKDIR()\fP +.DS +diropres +NFSPROC_MKDIR (createargs) = 14; +.DE +.KE +The new directory "where.name" is created in the directory given by +"where.dir". The initial attributes of the new directory are given +by "attributes". A reply "status" of NFS_OK indicates that the new +directory was created, and reply "file" and reply "attributes" are +its file handle and attributes. Any other reply "status" means +that the operation failed and no directory was created. +.LP +Note: possibly non-idempotent operation. +.KS +.NH 3 +\&Remove Directory +.IX "NFS server procedures" NFSPROC_RMDIR() "" \fINFSPROC_RMDIR()\fP +.DS +stat +NFSPROC_RMDIR(diropargs) = 15; +.DE +.KE +The existing empty directory "name" in the directory given by "dir" +is removed. If the reply is +.I NFS_OK , +the directory was removed. +.LP +Note: possibly non-idempotent operation. +.KS +.NH 3 +\&Read From Directory +.IX "NFS server procedures" NFSPROC_READDIR() "" \fINFSPROC_READDIR()\fP +.DS +struct readdirargs { + fhandle dir; + nfscookie cookie; + unsigned count; +}; + +struct entry { + unsigned fileid; + filename name; + nfscookie cookie; + entry *nextentry; +}; + +union readdirres switch (stat status) { + case NFS_OK: + struct { + entry *entries; + bool eof; + } readdirok; + default: + void; +}; + +readdirres +NFSPROC_READDIR (readdirargs) = 16; +.DE +.KE +Returns a variable number of directory entries, with a total size +of up to "count" bytes, from the directory given by "dir". If the +returned value of "status" is +.I NFS_OK , +then it is followed by a +variable number of "entry"s. Each "entry" contains a "fileid" +which consists of a unique number to identify the file within a +filesystem, the "name" of the file, and a "cookie" which is an +opaque pointer to the next entry in the directory. The cookie is +used in the next +.I READDIR +call to get more entries starting at a +given point in the directory. The special cookie zero (all bits +zero) can be used to get the entries starting at the beginning of +the directory. The "fileid" field should be the same number as the +"fileid" in the the attributes of the file. (See the +.I "Basic Data Types" +section.) +The "eof" flag has a value of +.I TRUE +if there are no more entries in the directory. +.KS +.NH 3 +\&Get Filesystem Attributes +.IX "NFS server procedures" NFSPROC_STATFS() "" \fINFSPROC_STATFS()\fP +.DS +union statfsres (stat status) { + case NFS_OK: + struct { + unsigned tsize; + unsigned bsize; + unsigned blocks; + unsigned bfree; + unsigned bavail; + } info; + default: + void; +}; + +statfsres +NFSPROC_STATFS(fhandle) = 17; +.DE +.KE +If the reply "status" is +.I NFS_OK , +then the reply "info" gives the +attributes for the filesystem that contains file referred to by the +input fhandle. The attribute fields contain the following values: +.IP tsize: +The optimum transfer size of the server in bytes. This is +the number of bytes the server would like to have in the +data part of READ and WRITE requests. +.IP bsize: +The block size in bytes of the filesystem. +.IP blocks: +The total number of "bsize" blocks on the filesystem. +.IP bfree: +The number of free "bsize" blocks on the filesystem. +.IP bavail: +The number of "bsize" blocks available to non-privileged users. +.LP +Note: This call does not work well if a filesystem has variable +size blocks. +.NH 1 +\&NFS Implementation Issues +.IX NFS implementation +.LP +The NFS protocol is designed to be operating system independent, but +since this version was designed in a UNIX environment, many +operations have semantics similar to the operations of the UNIX file +system. This section discusses some of the implementation-specific +semantic issues. +.NH 2 +\&Server/Client Relationship +.IX NFS "server/client relationship" +.LP +The NFS protocol is designed to allow servers to be as simple and +general as possible. Sometimes the simplicity of the server can be a +problem, if the client wants to implement complicated filesystem +semantics. +.LP +For example, some operating systems allow removal of open files. A +process can open a file and, while it is open, remove it from the +directory. The file can be read and written as long as the process +keeps it open, even though the file has no name in the filesystem. +It is impossible for a stateless server to implement these semantics. +The client can do some tricks such as renaming the file on remove, +and only removing it on close. We believe that the server provides +enough functionality to implement most file system semantics on the +client. +.LP +Every NFS client can also potentially be a server, and remote and +local mounted filesystems can be freely intermixed. This leads to +some interesting problems when a client travels down the directory +tree of a remote filesystem and reaches the mount point on the server +for another remote filesystem. Allowing the server to follow the +second remote mount would require loop detection, server lookup, and +user revalidation. Instead, we decided not to let clients cross a +server's mount point. When a client does a LOOKUP on a directory on +which the server has mounted a filesystem, the client sees the +underlying directory instead of the mounted directory. A client can +do remote mounts that match the server's mount points to maintain the +server's view. +.LP +.NH 2 +\&Pathname Interpretation +.IX NFS "pathname interpretation" +.LP +There are a few complications to the rule that pathnames are always +parsed on the client. For example, symbolic links could have +different interpretations on different clients. Another common +problem for non-UNIX implementations is the special interpretation of +the pathname ".." to mean the parent of a given directory. The next +revision of the protocol uses an explicit flag to indicate the parent +instead. +.NH 2 +\&Permission Issues +.IX NFS "permission issues" +.LP +The NFS protocol, strictly speaking, does not define the permission +checking used by servers. However, it is expected that a server +will do normal operating system permission checking using +.I AUTH_UNIX +style authentication as the basis of its protection mechanism. The +server gets the client's effective "uid", effective "gid", and groups +on each call and uses them to check permission. There are various +problems with this method that can been resolved in interesting ways. +.LP +Using "uid" and "gid" implies that the client and server share the +same "uid" list. Every server and client pair must have the same +mapping from user to "uid" and from group to "gid". Since every +client can also be a server, this tends to imply that the whole +network shares the same "uid/gid" space. +.I AUTH_DES +(and the next +revision of the NFS protocol) uses string names instead of numbers, +but there are still complex problems to be solved. +.LP +Another problem arises due to the usually stateful open operation. +Most operating systems check permission at open time, and then check +that the file is open on each read and write request. With stateless +servers, the server has no idea that the file is open and must do +permission checking on each read and write call. On a local +filesystem, a user can open a file and then change the permissions so +that no one is allowed to touch it, but will still be able to write +to the file because it is open. On a remote filesystem, by contrast, +the write would fail. To get around this problem, the server's +permission checking algorithm should allow the owner of a file to +access it regardless of the permission setting. +.LP +A similar problem has to do with paging in from a file over the +network. The operating system usually checks for execute permission +before opening a file for demand paging, and then reads blocks from +the open file. The file may not have read permission, but after it +is opened it doesn't matter. An NFS server can not tell the +difference between a normal file read and a demand page-in read. To +make this work, the server allows reading of files if the "uid" given +in the call has execute or read permission on the file. +.LP +In most operating systems, a particular user (on the user ID zero) +has access to all files no matter what permission and ownership they +have. This "super-user" permission may not be allowed on the server, +since anyone who can become super-user on their workstation could +gain access to all remote files. The UNIX server by default maps +user id 0 to -2 before doing its access checking. This works except +for NFS root filesystems, where super-user access cannot be avoided. +.NH 2 +\&Setting RPC Parameters +.IX NFS "setting RPC parameters" +.LP +Various file system parameters and options should be set at mount +time. The mount protocol is described in the appendix below. For +example, "Soft" mounts as well as "Hard" mounts are usually both +provided. Soft mounted file systems return errors when RPC +operations fail (after a given number of optional retransmissions), +while hard mounted file systems continue to retransmit forever. +Clients and servers may need to keep caches of recent operations to +help avoid problems with non-idempotent operations. +.NH 1 +\&Mount Protocol Definition +.IX "mount protocol" "" "" "" PAGE MAJOR +.sp 1 +.NH 2 +\&Introduction +.IX "mount protocol" introduction +.LP +The mount protocol is separate from, but related to, the NFS +protocol. It provides operating system specific services to get the +NFS off the ground -- looking up server path names, validating user +identity, and checking access permissions. Clients use the mount +protocol to get the first file handle, which allows them entry into a +remote filesystem. +.LP +The mount protocol is kept separate from the NFS protocol to make it +easy to plug in new access checking and validation methods without +changing the NFS server protocol. +.LP +Notice that the protocol definition implies stateful servers because +the server maintains a list of client's mount requests. The mount +list information is not critical for the correct functioning of +either the client or the server. It is intended for advisory use +only, for example, to warn possible clients when a server is going +down. +.LP +Version one of the mount protocol is used with version two of the NFS +protocol. The only connecting point is the +.I fhandle +structure, which is the same for both protocols. +.NH 2 +\&RPC Information +.IX "mount protocol" "RPC information" +.IP \fIAuthentication\fP +The mount service uses +.I AUTH_UNIX +and +.I AUTH_DES +style authentication only. +.IP "\fITransport Protocols\fP" +The mount service is currently supported on UDP/IP only. +.IP "\fIPort Number\fP" +Consult the server's portmapper, described in the chapter +.I "Remote Procedure Calls: Protocol Specification", +to find the port number on which the mount service is registered. +.NH 2 +\&Sizes of XDR Structures +.IX "mount protocol" "XDR structure sizes" +.LP +These are the sizes, given in decimal bytes, of various XDR +structures used in the protocol: +.DS +/* \fIThe maximum number of bytes in a pathname argument\fP */ +const MNTPATHLEN = 1024; + +/* \fIThe maximum number of bytes in a name argument\fP */ +const MNTNAMLEN = 255; + +/* \fIThe size in bytes of the opaque file handle\fP */ +const FHSIZE = 32; +.DE +.NH 2 +\&Basic Data Types +.IX "mount protocol" "basic data types" +.IX "mount data types" +.LP +This section presents the data types used by the mount protocol. +In many cases they are similar to the types used in NFS. +.KS +.NH 3 +\&fhandle +.IX "mount data types" fhandle "" \fIfhandle\fP +.DS +typedef opaque fhandle[FHSIZE]; +.DE +.KE +The type +.I fhandle +is the file handle that the server passes to the +client. All file operations are done using file handles to refer +to a file or directory. The file handle can contain whatever +information the server needs to distinguish an individual file. +.LP +This is the same as the "fhandle" XDR definition in version 2 of +the NFS protocol; see +.I "Basic Data Types" +in the definition of the NFS protocol, above. +.KS +.NH 3 +\&fhstatus +.IX "mount data types" fhstatus "" \fIfhstatus\fP +.DS +union fhstatus switch (unsigned status) { + case 0: + fhandle directory; + default: + void; +}; +.DE +.KE +The type +.I fhstatus +is a union. If a "status" of zero is returned, +the call completed successfully, and a file handle for the +"directory" follows. A non-zero status indicates some sort of +error. In this case the status is a UNIX error number. +.KS +.NH 3 +\&dirpath +.IX "mount data types" dirpath "" \fIdirpath\fP +.DS +typedef string dirpath; +.DE +.KE +The type +.I dirpath +is a server pathname of a directory. +.KS +.NH 3 +\&name +.IX "mount data types" name "" \fIname\fP +.DS +typedef string name; +.DE +.KE +The type +.I name +is an arbitrary string used for various names. +.NH 2 +\&Server Procedures +.IX "mount server procedures" +.LP +The following sections define the RPC procedures supplied by a +mount server. +.ie t .DS +.el .DS L +.ft I +/* +* Protocol description for the mount program +*/ +.ft CW + +program MOUNTPROG { +.ft I +/* +* Version 1 of the mount protocol used with +* version 2 of the NFS protocol. +*/ +.ft CW + version MOUNTVERS { + void MOUNTPROC_NULL(void) = 0; + fhstatus MOUNTPROC_MNT(dirpath) = 1; + mountlist MOUNTPROC_DUMP(void) = 2; + void MOUNTPROC_UMNT(dirpath) = 3; + void MOUNTPROC_UMNTALL(void) = 4; + exportlist MOUNTPROC_EXPORT(void) = 5; + } = 1; +} = 100005; +.DE +.KS +.NH 3 +\&Do Nothing +.IX "mount server procedures" MNTPROC_NULL() "" \fIMNTPROC_NULL()\fP +.DS +void +MNTPROC_NULL(void) = 0; +.DE +.KE +This procedure does no work. It is made available in all RPC +services to allow server response testing and timing. +.KS +.NH 3 +\&Add Mount Entry +.IX "mount server procedures" MNTPROC_MNT() "" \fIMNTPROC_MNT()\fP +.DS +fhstatus +MNTPROC_MNT(dirpath) = 1; +.DE +.KE +If the reply "status" is 0, then the reply "directory" contains the +file handle for the directory "dirname". This file handle may be +used in the NFS protocol. This procedure also adds a new entry to +the mount list for this client mounting "dirname". +.KS +.NH 3 +\&Return Mount Entries +.IX "mount server procedures" MNTPROC_DUMP() "" \fIMNTPROC_DUMP()\fP +.DS +struct *mountlist { + name hostname; + dirpath directory; + mountlist nextentry; +}; + +mountlist +MNTPROC_DUMP(void) = 2; +.DE +.KE +Returns the list of remote mounted filesystems. The "mountlist" +contains one entry for each "hostname" and "directory" pair. +.KS +.NH 3 +\&Remove Mount Entry +.IX "mount server procedures" MNTPROC_UMNT() "" \fIMNTPROC_UMNT()\fP +.DS +void +MNTPROC_UMNT(dirpath) = 3; +.DE +.KE +Removes the mount list entry for the input "dirpath". +.KS +.NH 3 +\&Remove All Mount Entries +.IX "mount server procedures" MNTPROC_UMNTALL() "" \fIMNTPROC_UMNTALL()\fP +.DS +void +MNTPROC_UMNTALL(void) = 4; +.DE +.KE +Removes all of the mount list entries for this client. +.KS +.NH 3 +\&Return Export List +.IX "mount server procedures" MNTPROC_EXPORT() "" \fIMNTPROC_EXPORT()\fP +.DS +struct *groups { + name grname; + groups grnext; +}; + +struct *exportlist { + dirpath filesys; + groups groups; + exportlist next; +}; + +exportlist +MNTPROC_EXPORT(void) = 5; +.DE +.KE +Returns a variable number of export list entries. Each entry +contains a filesystem name and a list of groups that are allowed to +import it. The filesystem name is in "filesys", and the group name +is in the list "groups". +.LP +Note: The exportlist should contain +more information about the status of the filesystem, such as a +read-only flag. diff --git a/share/doc/psd/27.nfsrpc/stubs b/share/doc/psd/27.nfsrpc/stubs new file mode 100644 index 0000000..78b0a2c --- /dev/null +++ b/share/doc/psd/27.nfsrpc/stubs @@ -0,0 +1,3 @@ +.\" $FreeBSD$ +.\" +.if t .ftr L CR diff --git a/share/doc/smm/02.config/0.t b/share/doc/smm/02.config/0.t new file mode 100644 index 0000000..ae5bf77 --- /dev/null +++ b/share/doc/smm/02.config/0.t @@ -0,0 +1,88 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)0.t 8.1 (Berkeley) 7/5/93 +.\" +.bd S B 3 +.de UX +.ie \\n(GA>0 \\$2UNIX\\$1 +.el \{\ +.if n \\$2UNIX\\$1* +.if t \\$2UNIX\\$1\\f1\(dg\\fP +.FS +.if n *UNIX +.if t \(dgUNIX +.ie \\$3=1 is a Footnote of Bell Laboratories. +.el is a Trademark of Bell Laboratories. +.FE +.nr GA 1\} +.. +.de BR +\fB\\$1\fP\\$2 +.. +.TL +Building 4.4BSD Kernels with Config +.AU +Samuel J. Leffler and Michael J. Karels +.AI +Computer Systems Research Group +Department of Electrical Engineering and Computer Science +University of California, Berkeley +Berkeley, California 94720 +.de IR +\fI\\$1\fP\\$2 +.. +.de DT +.TA 8 16 24 32 40 48 56 64 72 80 +.. +.AB +.PP +This document describes the use of +\fIconfig\fP\|(8) to configure and create bootable +4.4BSD system images. +It discusses the structure of system +configuration files and how to configure +systems with non-standard hardware configurations. +Sections describing the preferred way to +add new code to the system and how the system's autoconfiguration +process operates are included. An appendix +contains a summary of the rules used by the system +in calculating the size of system data structures, +and also indicates some of the standard system size +limitations (and how to change them). +Other configuration options are also listed. +.sp +.LP +Revised July 5, 1993 +.AE +.LP +.OH 'Building 4.4BSD Kernels with Config''SMM:2-%' +.EH 'SMM:2-%''Building 4.4BSD Kernels with Config' diff --git a/share/doc/smm/02.config/1.t b/share/doc/smm/02.config/1.t new file mode 100644 index 0000000..453041b --- /dev/null +++ b/share/doc/smm/02.config/1.t @@ -0,0 +1,61 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)1.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH Introduction +.ne 2i +.sp 3 +.NH +INTRODUCTION +.PP +.I Config +is a tool used in building 4.4BSD system images (the UNIX kernel). +It takes a file describing a system's tunable parameters and +hardware support, and generates a collection +of files which are then used to build a copy of UNIX appropriate +to that configuration. +.I Config +simplifies system maintenance by isolating system dependencies +in a single, easy to understand, file. +.PP +This document describes the content and +format of system configuration +files and the rules which must be followed when creating +these files. Example configuration files are constructed +and discussed. +.PP +Later sections suggest guidelines to be used in modifying +system source and explain some of the inner workings of the +autoconfiguration process. Appendix D summarizes the rules +used in calculating the most important system data structures +and indicates some inherent system data structure size +limitations (and how to go about modifying them). diff --git a/share/doc/smm/02.config/2.t b/share/doc/smm/02.config/2.t new file mode 100644 index 0000000..34e6b63 --- /dev/null +++ b/share/doc/smm/02.config/2.t @@ -0,0 +1,188 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)2.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Configuration File Contents +.ne 2i +.NH +CONFIGURATION FILE CONTENTS +.PP +A system configuration must include at least the following +pieces of information: +.IP \(bu 3 +machine type +.IP \(bu 3 +cpu type +.IP \(bu 3 +system identification +.IP \(bu 3 +timezone +.IP \(bu 3 +maximum number of users +.IP \(bu 3 +location of the root file system +.IP \(bu 3 +available hardware +.PP +.I Config +allows multiple system images to be generated from a single +configuration description. Each system image is configured +for identical hardware, but may have different locations for the root +file system and, possibly, other system devices. +.NH 2 +Machine type +.PP +The +.I "machine type" +indicates if the system is going to operate on a DEC VAX-11\(dg computer, +.FS +\(dg DEC, VAX, UNIBUS, MASSBUS and MicroVAX are trademarks of Digital +Equipment Corporation. +.FE +or some other machine on which 4.4BSD operates. The machine type +is used to locate certain data files which are machine specific, and +also to select rules used in constructing the resultant +configuration files. +.NH 2 +Cpu type +.PP +The +.I "cpu type" +indicates which, of possibly many, cpu's the system is to operate on. +For example, if the system is being configured for a VAX-11, it could +be running on a VAX 8600, VAX-11/780, VAX-11/750, VAX-11/730 or MicroVAX II. +(Other VAX cpu types, including the 8650, 785 and 725, are configured using +the cpu designation for compatible machines introduced earlier.) +Specifying +more than one cpu type implies that the system should be configured to run +on any of the cpu's specified. For some types of machines this is not +possible and +.I config +will print a diagnostic indicating such. +.NH 2 +System identification +.PP +The +.I "system identification" +is a moniker attached to the system, and often the machine on which the +system is to run. For example, at Berkeley we have machines named Ernie +(Co-VAX), Kim (No-VAX), and so on. The system identifier selected is used to +create a global C ``#define'' which may be used to isolate system dependent +pieces of code in the kernel. For example, Ernie's Varian driver used +to be special cased because its interrupt vectors were wired together. The +code in the driver which understood how to handle this non-standard hardware +configuration was conditionally compiled in only if the system +was for Ernie. +.PP +The system identifier ``GENERIC'' is given to a system which +will run on any cpu of a particular machine type; it should not +otherwise be used for a system identifier. +.NH 2 +Timezone +.PP +The timezone in which the system is to run is used to define the +information returned by the \fIgettimeofday\fP\|(2) +system call. This value is specified as the number of hours east +or west of GMT. Negative numbers indicate a value east of GMT. +The timezone specification may also indicate the +type of daylight savings time rules to be applied. +.NH 2 +Maximum number of users +.PP +The system allocates many system data structures at boot time +based on the maximum number of users the system will support. +This number is normally between 8 and 40, depending +on the hardware and expected job mix. The rules +used to calculate system data structures are discussed in +Appendix D. +.NH 2 +Root file system location +.PP +When the system boots it must know the location of +the root of the file system +tree. This location and the part(s) of the disk(s) to be used +for paging and swapping must be specified in order to create +a complete configuration description. +.I Config +uses many rules to calculate default locations for these items; +these are described in Appendix B. +.PP +When a generic system is configured, the root file system is left +undefined until the system is booted. In this case, the root file +system need not be specified, only that the system is a generic system. +.NH 2 +Hardware devices +.PP +When the system boots it goes through an +.I autoconfiguration +phase. During this period, the system searches for all +those hardware devices +which the system builder has indicated might be present. This probing +sequence requires certain pieces of information such as register +addresses, bus interconnects, etc. A system's hardware may be configured +in a very flexible manner or be specified without any flexibility +whatsoever. Most people do not configure hardware devices into the +system unless they are currently present on the machine, expect +them to be present in the near future, or are simply guarding +against a hardware +failure somewhere else at the site (it is often wise to configure in +extra disks in case an emergency requires moving one off a machine which +has hardware problems). +.PP +The specification of hardware devices usually occupies the majority of +the configuration file. As such, a large portion of this document will +be spent understanding it. Section 6.3 contains a description of +the autoconfiguration process, as it applies to those planning to +write, or modify existing, device drivers. +.NH 2 +Pseudo devices +.PP +Several system facilities are configured in a manner like that used +for hardware devices although they are not associated with specific hardware. +These system options are configured as +.IR pseudo-devices . +Some pseudo devices allow an optional parameter that sets the limit +on the number of instances of the device that are active simultaneously. +.NH 2 +System options +.PP +Other than the mandatory pieces of information described above, it +is also possible to include various optional system facilities +or to modify system behavior and/or limits. +For example, 4.4BSD can be configured to support binary compatibility for +programs built under 4.3BSD. Also, optional support is provided +for disk quotas and tracing the performance of the virtual memory +subsystem. Any optional facilities to be configured into +the system are specified in the configuration file. The resultant +files generated by +.I config +will automatically include the necessary pieces of the system. diff --git a/share/doc/smm/02.config/3.t b/share/doc/smm/02.config/3.t new file mode 100644 index 0000000..e0b6234 --- /dev/null +++ b/share/doc/smm/02.config/3.t @@ -0,0 +1,299 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)3.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "System Building Process +.ne 2i +.NH +SYSTEM BUILDING PROCESS +.PP +In this section we consider the steps necessary to build a bootable system +image. We assume the system source is located in the ``/sys'' directory +and that, initially, the system is being configured from source code. +.PP +Under normal circumstances there are 5 steps in building a system. +.IP 1) 3 +Create a configuration file for the system. +.IP 2) 3 +Make a directory for the system to be constructed in. +.IP 3) 3 +Run +.I config +on the configuration file to generate the files required +to compile and load the system image. +.IP 4) +Construct the source code interdependency rules for the +configured system with +.I make depend +using +.IR make (1). +.IP 5) +Compile and load the system with +.IR make . +.PP +Steps 1 and 2 are usually done only once. When a system configuration +changes it usually suffices to just run +.I config +on the modified configuration file, rebuild the source code dependencies, +and remake the system. Sometimes, +however, configuration dependencies may not be noticed in which case +it is necessary to clean out the relocatable object files saved +in the system's directory; this will be discussed later. +.NH 2 +Creating a configuration file +.PP +Configuration files normally reside in the directory ``/sys/conf''. +A configuration file is most easily constructed by copying an +existing configuration file and modifying it. The 4.4BSD distribution +contains a number of configuration files for machines at Berkeley; +one may be suitable or, in worst case, a copy +of the generic configuration file may be edited. +.PP +The configuration file must have the same name as the directory in +which the configured system is to be built. +Further, +.I config +assumes this directory is located in the parent directory of +the directory in which it +is run. For example, the generic +system has a configuration file ``/sys/conf/GENERIC'' and an accompanying +directory named ``/sys/GENERIC''. +Although it is not required that the system sources and configuration +files reside in ``/sys,'' the configuration and compilation procedure +depends on the relative locations of directories within that hierarchy, +as most of the system code and the files created by +.I config +use pathnames of the form ``../''. +If the system files are not located in ``/sys,'' +it is desirable to make a symbolic link there for use in installation +of other parts of the system that share files with the kernel. +.PP +When building the configuration file, be sure to include the items +described in section 2. In particular, the machine type, +cpu type, timezone, system identifier, maximum users, and root device +must be specified. The specification of the hardware present may take +a bit of work; particularly if your hardware is configured at non-standard +places (e.g. device registers located at funny places or devices not +supported by the system). Section 4 of this document +gives a detailed description of the configuration file syntax, +section 5 explains some sample configuration files, and +section 6 discusses how to add new devices to +the system. If the devices to be configured are not already +described in one of the existing configuration files you should check +the manual pages in section 4 of the UNIX Programmers Manual. For each +supported device, the manual page synopsis entry gives a +sample configuration line. +.PP +Once the configuration file is complete, run it through +.I config +and look for any errors. Never try and use a system which +.I config +has complained about; the results are unpredictable. +For the most part, +.IR config 's +error diagnostics are self explanatory. It may be the case that +the line numbers given with the error messages are off by one. +.PP +A successful run of +.I config +on your configuration file will generate a number of files in +the configuration directory. These files are: +.IP \(bu 3 +A file to be used by \fImake\fP\|(1) +in compiling and loading the system, +.IR Makefile . +.IP \(bu 3 +One file for each possible system image for this machine, +.IR swapxxx.c , +where +.I xxx +is the name of the system image, +which describes where swapping, the root file system, and other +miscellaneous system devices are located. +.IP \(bu 3 +A collection of header files, one per possible device the +system supports, which define the hardware configured. +.IP \(bu 3 +A file containing the I/O configuration tables used by the system +during its +.I autoconfiguration +phase, +.IR ioconf.c . +.IP \(bu 3 +An assembly language file of interrupt vectors which +connect interrupts from the machine's external buses to the main +system path for handling interrupts, +and a file that contains counters and names for the interrupt vectors. +.PP +Unless you have reason to doubt +.IR config , +or are curious how the system's autoconfiguration scheme +works, you should never have to look at any of these files. +.NH 2 +Constructing source code dependencies +.PP +When +.I config +is done generating the files needed to compile and link your system it +will terminate with a message of the form ``Don't forget to run make depend''. +This is a reminder that you should change over to the configuration +directory for the system just configured and type ``make depend'' +to build the rules used by +.I make +to recognize interdependencies in the system source code. +This will insure that any changes to a piece of the system +source code will result in the proper modules being recompiled +the next time +.I make +is run. +.PP +This step is particularly important if your site makes changes +to the system include files. The rules generated specify which source code +files are dependent on which include files. Without these rules, +.I make +will not recognize when it must rebuild modules +due to the modification of a system header file. +The dependency rules are generated by a pass of the C preprocessor +and reflect the global system options. +This step must be repeated when the configuration file is changed +and +.I config +is used to regenerate the system makefile. +.NH 2 +Building the system +.PP +The makefile constructed by +.I config +should allow a new system to be rebuilt by simply typing ``make image-name''. +For example, if you have named your bootable system image ``kernel'', +then ``make kernel'' +will generate a bootable image named ``kernel''. Alternate system image names +are used when the root file system location and/or swapping configuration +is done in more than one way. The makefile which +.I config +creates has entry points for each system image defined in +the configuration file. +Thus, if you have configured ``kernel'' to be a system with the root file +system on an ``hp'' device and ``hkkernel'' to be a system with the root +file system on an ``hk'' device, then ``make kernel hkkernel'' will generate +binary images for each. +As the system will generally use the disk from which it is loaded +as the root filesystem, separate system images are only required +to support different swap configurations. +.PP +Note that the name of a bootable image is different from the system +identifier. All bootable images are configured for the same system; +only the information about the root file system and paging devices differ. +(This is described in more detail in section 4.) +.PP +The last step in the system building process is to rearrange certain commonly +used symbols in the symbol table of the system image; the makefile +generated by +.I config +does this automatically for you. +This is advantageous for programs such as +\fInetstat\fP\|(1) and \fIvmstat\fP\|(1), +which run much faster when the symbols they need are located at +the front of the symbol table. +Remember also that many programs expect +the currently executing system to be named ``/kernel''. If you install +a new system and name it something other than ``/kernel'', many programs +are likely to give strange results. +.NH 2 +Sharing object modules +.PP +If you have many systems which are all built on a single machine +there are at least two approaches to saving time in building system +images. The best way is to have a single system image which is run on +all machines. This is attractive since it minimizes disk space used +and time required to rebuild systems after making changes. However, +it is often the case that one or more systems will require a separately +configured system image. This may be due to limited memory (building +a system with many unused device drivers can be expensive), or to +configuration requirements (one machine may be a development machine +where disk quotas are not needed, while another is a production machine +where they are), etc. In these cases it is possible +for common systems to share relocatable object modules which are not +configuration dependent; most of the modules in the directory ``/sys/sys'' +are of this sort. +.PP +To share object modules, a generic system should be built. Then, for +each system configure the system as before, but before recompiling and +linking the system, type ``make links'' in the system compilation directory. +This will cause the system +to be searched for source modules which are safe to share between systems +and generate symbolic links in the current directory to the appropriate +object modules in the directory ``../GENERIC''. A shell script, +``makelinks'' is generated with this request and may be checked for +correctness. The file ``/sys/conf/defines'' contains a list of symbols +which we believe are safe to ignore when checking the source code +for modules which may be shared. Note that this list includes the definitions +used to conditionally compile in the virtual memory tracing facilities, and +the trace point support used only rarely (even at Berkeley). +It may be necessary +to modify this file to reflect local needs. Note further that +interdependencies which are not directly visible +in the source code are not caught. This means that if you place +per-system dependencies in an include file, they will not be recognized +and the shared code may be selected in an unexpected fashion. +.NH 2 +Building profiled systems +.PP +It is simple to configure a system which will automatically +collect profiling information as it operates. The profiling data +may be collected with \fIkgmon\fP\|(8) and processed with +\fIgprof\fP\|(1) +to obtain information regarding the system's operation. Profiled +systems maintain histograms of the program counter as well as the +number of invocations of each routine. The \fIgprof\fP +command will also generate a dynamic call graph of the executing +system and propagate time spent in each routine along the arcs +of the call graph (consult the \fIgprof\fP documentation for elaboration). +The program counter sampling can be driven by the system clock, or +if you have an alternate real time clock, this can be used. The +latter is highly recommended, as use of the system clock will result +in statistical anomalies, and time spent in the clock routine will +not be accurately attributed. +.PP +To configure a profiled system, the +.B \-p +option should be supplied to \fIconfig\fP. +A profiled system is about 5-10% larger in its text space due to +the calls to count the subroutine invocations. When the system +executes, the profiling data is stored in a buffer which is 1.2 +times the size of the text space. The overhead for running a +profiled system varies; under normal load we see anywhere from 5-25% +of the system time spent in the profiling code. +.PP +Note that systems configured for profiling should not be shared as +described above unless all the other shared systems are also to be +profiled. diff --git a/share/doc/smm/02.config/4.t b/share/doc/smm/02.config/4.t new file mode 100644 index 0000000..7498185 --- /dev/null +++ b/share/doc/smm/02.config/4.t @@ -0,0 +1,442 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)4.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Configuration File Syntax +.ne 2i +.NH +CONFIGURATION FILE SYNTAX +.PP +In this section we consider the specific rules used in writing +a configuration file. A complete grammar for the input language +can be found in Appendix A and may be of use if you should have +problems with syntax errors. +.PP +A configuration file is broken up into three logical pieces: +.IP \(bu 3 +configuration parameters global to all system images +specified in the configuration file, +.IP \(bu 3 +parameters specific to each +system image to be generated, and +.IP \(bu 3 +device specifications. +.NH 2 +Global configuration parameters +.PP +The global configuration parameters are the type of machine, +cpu types, options, timezone, system identifier, and maximum users. +Each is specified with a separate line in the configuration file. +.IP "\fBmachine\fP \fItype\fP" +.br +The system is to run on the machine type specified. No more than +one machine type can appear in the configuration file. Legal values +are +.B vax +and +\fBsun\fP. +.IP "\fBcpu\fP ``\fItype\fP''" +.br +This system is to run on the cpu type specified. +More than one cpu type specification +can appear in a configuration file. +Legal types for a +.B vax +machine are +\fBVAX8600\fP, \fBVAX780\fP, \fBVAX750\fP, +\fBVAX730\fP +and +\fBVAX630\fP (MicroVAX II). +The 8650 is listed as an 8600, the 785 as a 780, and a 725 as a 730. +.IP "\fBoptions\fP \fIoptionlist\fP" +.br +Compile the listed optional code into the system. +Options in this list are separated by commas. +Possible options are listed at the top of the generic makefile. +A line of the form ``options FUNNY,HAHA'' generates global ``#define''s +\-DFUNNY \-DHAHA in the resultant makefile. +An option may be given a value by following its name with ``\fB=\fP'', +then the value enclosed in (double) quotes. +The following are major options are currently in use: +COMPAT (include code for compatibility with 4.1BSD binaries), +INET (Internet communication protocols), +NS (Xerox NS communication protocols), +and +QUOTA (enable disk quotas). +Other kernel options controlling system sizes and limits +are listed in Appendix D; +options for the network are found in Appendix E. +There are additional options which are associated with certain +peripheral devices; those are listed in the Synopsis section +of the manual page for the device. +.IP "\fBmakeoptions\fP \fIoptionlist\fP" +.br +Options that are used within the system makefile +and evaluated by +.I make +are listed as +.IR makeoptions . +Options are listed with their values with the form +``makeoptions name=value,name2=value2.'' +The values must be enclosed in double quotes if they include numerals +or begin with a dash. +.IP "\fBtimezone\fP \fInumber\fP [ \fBdst\fP [ \fInumber\fP ] ]" +.br +Specifies the timezone used by the system. This is measured in the +number of hours your timezone is west of GMT. +EST is 5 hours west of GMT, PST is 8. Negative numbers +indicate hours east of GMT. If you specify +\fBdst\fP, the system will operate under daylight savings time. +An optional integer or floating point number may be included +to specify a particular daylight saving time correction algorithm; +the default value is 1, indicating the United States. +Other values are: 2 (Australian style), 3 (Western European), +4 (Middle European), and 5 (Eastern European). See +\fIgettimeofday\fP\|(2) and \fIctime\fP\|(3) for more information. +.IP "\fBident\fP \fIname\fP" +.br +This system is to be known as +.IR name . +This is usually a cute name like ERNIE (short for Ernie Co-Vax) or +VAXWELL (for Vaxwell Smart). +This value is defined for use in conditional compilation, +and is also used to locate an optional list of source files specific +to this system. +.IP "\fBmaxusers\fP \fInumber\fP" +.br +The maximum expected number of simultaneously active user on this system is +.IR number . +This number is used to size several system data structures. +.NH 2 +System image parameters +.PP +Multiple bootable images may be specified in a single configuration +file. The systems will have the same global configuration parameters +and devices, but the location of the root file system and other +system specific devices may be different. A system image is specified +with a ``config'' line: +.IP +\fBconfig\fP\ \fIsysname\fP\ \fIconfig-clauses\fP +.LP +The +.I sysname +field is the name given to the loaded system image; almost everyone +names their standard system image ``kernel''. The configuration clauses +are one or more specifications indicating where the root file system +is located and the number and location of paging devices. +The device used by the system to process argument lists during +.IR execve (2) +calls may also be specified, though in practice this is almost +always selected by +.I config +using one of its rules for selecting default locations for +system devices. +.PP +A configuration clause is one of the following +.IP +.nf +\fBroot\fP [ \fBon\fP ] \fIroot-device\fP +\fBswap\fP [ \fBon\fP ] \fIswap-device\fP [ \fBand\fP \fIswap-device\fP ] ... +\fBdumps\fP [ \fBon\fP ] \fIdump-device\fP +\fBargs\fP [ \fBon\fP ] \fIarg-device\fP +.LP +(the ``on'' is optional.) Multiple configuration clauses +are separated by white space; +.I config +allows specifications to be continued across multiple lines +by beginning the continuation line with a tab character. +The ``root'' clause specifies where the root file system +is located, the ``swap'' clause indicates swapping and paging +area(s), the ``dumps'' clause can be used to force system dumps +to be taken on a particular device, and the ``args'' clause +can be used to specify that argument list processing for +.I execve +should be done on a particular device. +.PP +The device names supplied in the clauses may be fully specified +as a device, unit, and file system partition; or underspecified +in which case +.I config +will use builtin rules to select default unit numbers and file +system partitions. The defaulting rules are a bit complicated +as they are dependent on the overall system configuration. +For example, the swap area need not be specified at all if +the root device is specified; in this case the swap area is +placed in the ``b'' partition of the same disk where the root +file system is located. Appendix B contains a complete list +of the defaulting rules used in selecting system configuration +devices. +.PP +The device names are translated to the +appropriate major and minor device +numbers on a per-machine basis. A file, +``/sys/conf/devices.machine'' (where ``machine'' +is the machine type specified in the configuration file), +is used to map a device name to its major block device number. +The minor device number is calculated using the standard +disk partitioning rules: on unit 0, partition ``a'' is minor device +0, partition ``b'' is minor device 1, and so on; for units +other than 0, add 8 times the unit number to get the minor +device. +.PP +If the default mapping of device name to major/minor device +number is incorrect for your configuration, it can be replaced +by an explicit specification of the major/minor device. +This is done by substituting +.IP +\fBmajor\fP \fIx\fP \fBminor\fP \fIy\fP +.LP +where the device name would normally be found. For example, +.IP +.nf +\fBconfig\fP kernel \fBroot\fP \fBon\fP \fBmajor\fP 99 \fBminor\fP 1 +.fi +.PP +Normally, the areas configured for swap space are sized by the system +at boot time. If a non-standard size is to be used for one +or more swap areas (less than the full partition), +this can also be specified. To do this, the +device name specified for a swap area should have a ``size'' +specification appended. For example, +.IP +.nf +\fBconfig\fP kernel \fBroot\fP \fBon\fP hp0 \fBswap\fP \fBon\fP hp0b \fBsize\fP 1200 +.fi +.LP +would force swapping to be done in partition ``b'' of ``hp0'' and +the swap partition size would be set to 1200 sectors. A swap area +sized larger than the associated disk partition is trimmed to the +partition size. +.PP +To create a generic configuration, only the clause ``swap generic'' +should be specified; any extra clauses will cause an error. +.NH 2 +Device specifications +.PP +Each device attached to a machine must be specified +to +.I config +so that the system generated will know to probe for it during +the autoconfiguration process carried out at boot time. Hardware +specified in the configuration need not actually be present on +the machine where the generated system is to be run. Only the +hardware actually found at boot time will be used by the system. +.PP +The specification of hardware devices in the configuration file +parallels the interconnection hierarchy of the machine to be +configured. On the VAX, this means that a configuration file must +indicate what MASSBUS and UNIBUS adapters are present, and to +which \fInexi\fP they might be connected.* +.FS +* While VAX-11/750's and VAX-11/730 do not actually have +nexi, the system treats them as having +.I "simulated nexi" +to simplify device configuration. +.FE +Similarly, devices +and controllers must be indicated as possibly being connected +to one or more adapters. A device description may provide a +complete definition of the possible configuration parameters +or it may leave certain parameters undefined and make the system +probe for all the possible values. The latter allows a single +device configuration list to match many possible physical +configurations. For example, a disk may be indicated as present +at UNIBUS adapter 0, or at any UNIBUS adapter which the system +locates at boot time. The latter scheme, termed +.IR wildcarding , +allows more flexibility in the physical configuration of a system; +if a disk must be moved around for some reason, the system will +still locate it at the alternate location. +.PP +A device specification takes one of the following forms: +.IP +.nf +\fBmaster\fP \fIdevice-name\fP \fIdevice-info\fP +\fBcontroller\fP \fIdevice-name\fP \fIdevice-info\fP [ \fIinterrupt-spec\fP ] +\fBdevice\fP \fIdevice-name\fP \fIdevice-info\fP \fIinterrupt-spec\fP +\fBdisk\fP \fIdevice-name\fP \fIdevice-info\fP +\fBtape\fP \fIdevice-name\fP \fIdevice-info\fP +.fi +.LP +A ``master'' is a MASSBUS tape controller; a ``controller'' is a +disk controller, a UNIBUS tape controller, a MASSBUS adapter, or +a UNIBUS adapter. A ``device'' is an autonomous device which +connects directly to a UNIBUS adapter (as opposed to something +like a disk which connects through a disk controller). ``Disk'' +and ``tape'' identify disk drives and tape drives connected to +a ``controller'' or ``master.'' +.PP +The +.I device-name +is one of the standard device names, as +indicated in section 4 of the UNIX Programmers Manual, +concatenated with the +.I logical +unit number to be assigned the device (the +.I logical +unit number may be different than the +.I physical +unit number indicated on the front of something +like a disk; the +.I logical +unit number is used to refer to the UNIX device, not +the physical unit number). For example, ``hp0'' is logical +unit 0 of a MASSBUS storage device, even though it might +be physical unit 3 on MASSBUS adapter 1. +.PP +The +.I device-info +clause specifies how the hardware is +connected in the interconnection hierarchy. On the VAX, +UNIBUS and MASSBUS adapters are connected to the internal +system bus through +a \fInexus\fP. +Thus, one of the following +specifications would be used: +.IP +.ta 1.5i 2.5i 4.0i +.nf +\fBcontroller\fP mba0 \fBat\fP \fBnexus\fP \fIx\fP +\fBcontroller\fP uba0 \fBat\fP \fBnexus\fP \fIx\fP +.fi +.LP +To tie a controller to a specific nexus, ``x'' would be supplied +as the number of that nexus; otherwise ``x'' may be specified as +``?'', in which +case the system will probe all nexi present looking +for the specified controller. +.PP +The remaining interconnections on the VAX are: +.IP \(bu 3 +a controller +may be connected to another controller (e.g. a disk controller attached +to a UNIBUS adapter), +.IP \(bu 3 +a master is always attached to a controller (a MASSBUS adapter), +.IP \(bu 3 +a tape is always attached to a master (for MASSBUS +tape drives), +.IP \(bu 3 +a disk is always attached to a controller, and +.IP \(bu 3 +devices +are always attached to controllers (e.g. UNIBUS controllers attached +to UNIBUS adapters). +.LP +The following lines give an example of each of these interconnections: +.IP +.ta 1.5i 2.5i 4.0i +.nf +\fBcontroller\fP hk0 \fBat\fP uba0 ... +\fBmaster\fP ht0 \fBat\fP mba0 ... +\fBdisk\fP hp0 \fBat\fP mba0 ... +\fBtape\fP tu0 \fBat\fP ht0 ... +\fBdisk\fP rk1 \fBat\fP hk0 ... +\fBdevice\fP dz0 \fBat\fP uba0 ... +.fi +.LP +Any piece of hardware which may be connected to a specific +controller may also be wildcarded across multiple controllers. +.PP +The final piece of information needed by the system to configure +devices is some indication of where or how a device will interrupt. +For tapes and disks, simply specifying the \fIslave\fP or \fIdrive\fP +number is sufficient to locate the control status register for the +device. +\fIDrive\fP numbers may be wildcarded +on MASSBUS devices, but not on disks on a UNIBUS controller. +For controllers, the control status register must be +given explicitly, as well the number of interrupt vectors used and +the names of the routines to which they should be bound. +Thus the example lines given above might be completed as: +.IP +.ta 1.5i 2.5i 4.0i +.nf +\fBcontroller\fP hk0 \fBat\fP uba0 \fBcsr\fP 0177440 \fBvector\fP rkintr +\fBmaster\fP ht0 \fBat\fP mba0 \fBdrive\fP 0 +\fBdisk\fP hp0 \fBat\fP mba0 \fBdrive\fP ? +\fBtape\fP tu0 \fBat\fP ht0 \fBslave\fP 0 +\fBdisk\fP rk1 \fBat\fP hk0 \fBdrive\fP 1 +\fBdevice\fP dz0 \fBat\fP uba0 \fBcsr\fP 0160100 \fBvector\fP dzrint dzxint +.fi +.PP +Certain device drivers require extra information passed to them +at boot time to tailor their operation to the actual hardware present. +The line printer driver, for example, needs to know how many columns +are present on each non-standard line printer (i.e. a line printer +with other than 80 columns). The drivers for the terminal multiplexors +need to know which lines are attached to modem lines so that no one will +be allowed to use them unless a connection is present. For this reason, +one last parameter may be specified to a +.IR device , +a +.I flags +field. It has the syntax +.IP +\fBflags\fP \fInumber\fP +.LP +and is usually placed after the +.I csr +specification. The +.I number +is passed directly to the associated driver. The manual pages +in section 4 should be consulted to determine how each driver +uses this value (if at all). +Communications interface drivers commonly use the flags +to indicate whether modem control signals are in use. +.PP +The exact syntax for each specific device is given in the Synopsis +section of its manual page in section 4 of the manual. +.NH 2 +Pseudo-devices +.PP +A number of drivers and software subsystems +are treated like device drivers without any associated hardware. +To include any of these pieces, a ``pseudo-device'' specification +must be used. A specification for a pseudo device takes the form +.IP +.DT +.nf +\fBpseudo-device\fP \fIdevice-name\fP [ \fIhowmany\fP ] +.fi +.PP +Examples of pseudo devices are +\fBpty\fP, the pseudo terminal driver (where the optional +.I howmany +value indicates the number of pseudo terminals to configure, 32 default), +and \fBloop\fP, the software loopback network pseudo-interface. +Other pseudo devices for the network include +\fBimp\fP (required when a CSS or ACC imp is configured) +and \fBether\fP (used by the Address Resolution Protocol +on 10 Mb/sec Ethernets). +More information on configuring each of these can also be found +in section 4 of the manual. diff --git a/share/doc/smm/02.config/5.t b/share/doc/smm/02.config/5.t new file mode 100644 index 0000000..81f2a52 --- /dev/null +++ b/share/doc/smm/02.config/5.t @@ -0,0 +1,271 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)5.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Sample Configuration Files +.ne 2i +.NH +SAMPLE CONFIGURATION FILES +.PP +In this section we will consider how to configure a +sample VAX-11/780 system on which the hardware can be +reconfigured to guard against various hardware mishaps. +We then study the rules needed to configure a VAX-11/750 +to run in a networking environment. +.NH 2 +VAX-11/780 System +.PP +Our VAX-11/780 is configured with hardware +recommended in the document ``Hints on Configuring a VAX for 4.2BSD'' +(this is one of the high-end configurations). +Table 1 lists the pertinent hardware to be configured. +.DS B +.TS +box; +l | l | l | l | l +l | l | l | l | l. +Item Vendor Connection Name Reference +_ +cpu DEC VAX780 +MASSBUS controller Emulex nexus ? mba0 hp(4) +disk Fujitsu mba0 hp0 +disk Fujitsu mba0 hp1 +MASSBUS controller Emulex nexus ? mba1 +disk Fujitsu mba1 hp2 +disk Fujitsu mba1 hp3 +UNIBUS adapter DEC nexus ? +tape controller Emulex uba0 tm0 tm(4) +tape drive Kennedy tm0 te0 +tape drive Kennedy tm0 te1 +terminal multiplexor Emulex uba0 dh0 dh(4) +terminal multiplexor Emulex uba0 dh1 +terminal multiplexor Emulex uba0 dh2 +.TE +.DE +.ce +Table 1. VAX-11/780 Hardware support. +.LP +We will call this machine ANSEL and construct a configuration +file one step at a time. +.PP +The first step is to fill in the global configuration parameters. +The machine is a VAX, so the +.I "machine type" +is ``vax''. We will assume this system will +run only on this one processor, so the +.I "cpu type" +is ``VAX780''. The options are empty since this is going to +be a ``vanilla'' VAX. The system identifier, as mentioned before, +is ``ANSEL,'' and the maximum number of users we plan to support is +about 40. Thus the beginning of the configuration file looks like +this: +.DS +.ta 1.5i 2.5i 4.0i +# +# ANSEL VAX (a picture perfect machine) +# +machine vax +cpu VAX780 +timezone 8 dst +ident ANSEL +maxusers 40 +.DE +.PP +To this we must then add the specifications for three +system images. The first will be our standard system with the +root on ``hp0'' and swapping on the same drive as the root. +The second will have the root file system in the same location, +but swap space interleaved among drives on each controller. +Finally, the third will be a generic system, +to allow us to boot off any of the four disk drives. +.DS +.ta 1.5i 2.5i +config kernel root on hp0 +config hpkernel root on hp0 swap on hp0 and hp2 +config genkernel swap generic +.DE +.PP +Finally, the hardware must be specified. Let us first just try +transcribing the information from Table 1. +.DS +.ta 1.5i 2.5i 4.0i +controller mba0 at nexus ? +disk hp0 at mba0 disk 0 +disk hp1 at mba0 disk 1 +controller mba1 at nexus ? +disk hp2 at mba1 disk 2 +disk hp3 at mba1 disk 3 +controller uba0 at nexus ? +controller tm0 at uba0 csr 0172520 vector tmintr +tape te0 at tm0 drive 0 +tape te1 at tm0 drive 1 +device dh0 at uba0 csr 0160020 vector dhrint dhxint +device dm0 at uba0 csr 0170500 vector dmintr +device dh1 at uba0 csr 0160040 vector dhrint dhxint +device dh2 at uba0 csr 0160060 vector dhrint dhxint +.DE +.LP +(Oh, I forgot to mention one panel of the terminal multiplexor +has modem control, thus the ``dm0'' device.) +.PP +This will suffice, but leaves us with little flexibility. Suppose +our first disk controller were to break. We would like to recable the +drives normally on the second controller so that all our disks could +still be used without reconfiguring the system. To do this we wildcard +the MASSBUS adapter connections and also the slave numbers. Further, +we wildcard the UNIBUS adapter connections in case we decide some time +in the future to purchase another adapter to offload the single UNIBUS +we currently have. The revised device specifications would then be: +.DS +.ta 1.5i 2.5i 4.0i +controller mba0 at nexus ? +disk hp0 at mba? disk ? +disk hp1 at mba? disk ? +controller mba1 at nexus ? +disk hp2 at mba? disk ? +disk hp3 at mba? disk ? +controller uba0 at nexus ? +controller tm0 at uba? csr 0172520 vector tmintr +tape te0 at tm0 drive 0 +tape te1 at tm0 drive 1 +device dh0 at uba? csr 0160020 vector dhrint dhxint +device dm0 at uba? csr 0170500 vector dmintr +device dh1 at uba? csr 0160040 vector dhrint dhxint +device dh2 at uba? csr 0160060 vector dhrint dhxint +.DE +.LP +The completed configuration file for ANSEL is shown in Appendix C. +.NH 2 +VAX-11/750 with network support +.PP +Our VAX-11/750 system will be located on two 10Mb/s Ethernet +local area networks and also the DARPA Internet. The system +will have a MASSBUS drive for the root file system and two +UNIBUS drives. Paging is interleaved among all three drives. +We have sold our standard DEC terminal multiplexors since this +machine will be accessed solely through the network. This +machine is not intended to have a large user community, it +does not have a great deal of memory. First the global parameters: +.DS +.ta 1.5i 2.5i 4.0i +# +# UCBVAX (Gateway to the world) +# +machine vax +cpu "VAX780" +cpu "VAX750" +ident UCBVAX +timezone 8 dst +maxusers 32 +options INET +options NS +.DE +.PP +The multiple cpu types allow us to replace UCBVAX with a +more powerful cpu without reconfiguring the system. The +value of 32 given for the maximum number of users is done to +force the system data structures to be over-allocated. That +is desirable on this machine because, while it is not expected +to support many users, it is expected to perform a great deal +of work. +The ``INET'' indicates that we plan to use the +DARPA standard Internet protocols on this machine, +and ``NS'' also includes support for Xerox NS protocols. +Note that unlike 4.2BSD configuration files, +the network protocol options do not require corresponding pseudo devices. +.PP +The system images and disks are configured next. +.DS +.ta 1.5i 2.5i 4.0i +config kernel root on hp swap on hp and rk0 and rk1 +config upkernel root on up +config hkkernel root on hk swap on rk0 and rk1 + +controller mba0 at nexus ? +controller uba0 at nexus ? +disk hp0 at mba? drive 0 +disk hp1 at mba? drive 1 +controller sc0 at uba? csr 0176700 vector upintr +disk up0 at sc0 drive 0 +disk up1 at sc0 drive 1 +controller hk0 at uba? csr 0177440 vector rkintr +disk rk0 at hk0 drive 0 +disk rk1 at hk0 drive 1 +.DE +.PP +UCBVAX requires heavy interleaving of its paging area to keep up +with all the mail traffic it handles. The limiting factor on this +system's performance is usually the number of disk arms, as opposed +to memory or cpu cycles. The extra UNIBUS controller, ``sc0'', +is in case the MASSBUS controller breaks and a spare controller +must be installed (most of our old UNIBUS controllers have been +replaced with the newer MASSBUS controllers, so we have a number +of these around as spares). +.PP +Finally, we add in the network devices. +Pseudo terminals are needed to allow users to +log in across the network (remember the only hardwired terminal +is the console). +The software loopback device is used for on-machine communications. +The connection to the Internet is through +an IMP, this requires yet another +.I pseudo-device +(in addition to the actual hardware device used by the +IMP software). And, finally, there are the two Ethernet devices. +These use a special protocol, the Address Resolution Protocol (ARP), +to map between Internet and Ethernet addresses. Thus, yet another +.I pseudo-device +is needed. The additional device specifications are show below. +.DS +.ta 1.5i 2.5i 4.0i +pseudo-device pty +pseudo-device loop +pseudo-device imp +device acc0 at uba? csr 0167600 vector accrint accxint +pseudo-device ether +device ec0 at uba? csr 0164330 vector ecrint eccollide ecxint +device il0 at uba? csr 0164000 vector ilrint ilcint +.DE +.LP +The completed configuration file for UCBVAX is shown in Appendix C. +.NH 2 +Miscellaneous comments +.PP +It should be noted in these examples that neither system was +configured to use disk quotas or the 4.1BSD compatibility mode. +To use these optional facilities, and others, we would probably +clean out our current configuration, reconfigure the system, then +recompile and relink the system image(s). This could, of course, +be avoided by figuring out which relocatable object files are +affected by the reconfiguration, then reconfiguring and recompiling +only those files affected by the configuration change. This technique +should be used carefully. diff --git a/share/doc/smm/02.config/6.t b/share/doc/smm/02.config/6.t new file mode 100644 index 0000000..49f6e91 --- /dev/null +++ b/share/doc/smm/02.config/6.t @@ -0,0 +1,233 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)6.t 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.\".ds RH "Adding New Devices +.ne 2i +.NH +ADDING NEW SYSTEM SOFTWARE +.PP +This section is not for the novice, it describes +some of the inner workings of the configuration process as +well as the pertinent parts of the system autoconfiguration process. +It is intended to give +those people who intend to install new device drivers and/or +other system facilities sufficient information to do so in the +manner which will allow others to easily share the changes. +.PP +This section is broken into four parts: +.IP \(bu 3 +general guidelines to be followed in modifying system code, +.IP \(bu 3 +how to add non-standard system facilities to 4.4BSD, +.IP \(bu 3 +how to add a device driver to 4.4BSD, and +.NH 2 +Modifying system code +.PP +If you wish to make site-specific modifications to the system +it is best to bracket them with +.DS +#ifdef SITENAME +\&... +#endif +.DE +to allow your source to be easily distributed to others, and +also to simplify \fIdiff\fP\|(1) listings. If you choose not +to use a source code control system (e.g. SCCS, RCS), and +perhaps even if you do, it is +recommended that you save the old code with something +of the form: +.DS +#ifndef SITENAME +\&... +#endif +.DE +We try to isolate our site-dependent code in individual files +which may be configured with pseudo-device specifications. +.PP +Indicate machine-specific code with ``#ifdef vax'' (or other machine, +as appropriate). +4.4BSD underwent extensive work to make it extremely portable to +machines with similar architectures\- you may someday find +yourself trying to use a single copy of the source code on +multiple machines. +.NH 2 +Adding non-standard system facilities +.PP +This section considers the work needed to augment +.IR config 's +data base files for non-standard system facilities. +.I Config +uses a set of files that list the source modules that may be required +when building a system. +The data bases are taken from the directory in which +.I config +is run, normally /sys/conf. +Three such files may be used: +.IR files , +.IR files .machine, +and +.IR files .ident. +The first is common to all systems, +the second contains files unique to a single machine type, +and the third is an optional list of modules for use on a specific machine. +This last file may override specifications in the first two. +The format of the +.I files +file has grown somewhat complex over time. Entries are normally of +the form +.IP +.nf +.DT +\fIdir/source.c\fP \fItype\fP \fIoption-list\fP \fImodifiers\fP +.LP +for example, +.IP +.nf +.DT +\fIvaxuba/foo.c\fP \fBoptional\fP foo \fBdevice-driver\fP +.LP +The +.I type +is one of +.B standard +or +.BR optional . +Files marked as standard are included in all system configurations. +Optional file specifications include a list of one or more system +options that together require the inclusion of this module. +The options in the list may be either names of devices that may +be in the configuration file, +or the names of system options that may be defined. +An optional file may be listed multiple times with different options; +if all of the options for any of the entries are satisfied, +the module is included. +.PP +If a file is specified as a +.IR device-driver , +any special compilation options for device drivers will be invoked. +On the VAX this results in the use of the +.B \-i +option for the C optimizer. This is required when pointer references +are made to memory locations in the VAX I/O address space. +.PP +Two other optional keywords modify the usage of the file. +.I Config +understands that certain files are used especially for +kernel profiling. These files are indicated in the +.I files +files with a +.I profiling-routine +keyword. For example, the current profiling subroutines +are sequestered off in a separate file with the following +entry: +.IP +.nf +.DT +\fIsys/subr_mcount.c\fP \fBoptional\fP \fBprofiling-routine\fP +.fi +.LP +The +.I profiling-routine +keyword forces +.I config +not to compile the source file with the +.B \-pg +option. +.PP +The second keyword which can be of use is the +.I config-dependent +keyword. This causes +.I config +to compile the indicated module with the global configuration +parameters. This allows certain modules, such as +.I machdep.c +to size system data structures based on the maximum number +of users configured for the system. +.NH 2 +Adding device drivers to 4.4BSD +.PP +The I/O system and +.I config +have been designed to easily allow new device support to be added. +The system source directories are organized as follows: +.DS +.TS +lw(1.0i) l. +/sys/h machine independent include files +/sys/sys machine-independent system source files +/sys/conf site configuration files and basic templates +/sys/net network-protocol-independent, but network-related code +/sys/netinet DARPA Internet code +/sys/netimp IMP support code +/sys/netns Xerox NS code +/sys/vax VAX-specific mainline code +/sys/vaxif VAX network interface code +/sys/vaxmba VAX MASSBUS device drivers and related code +/sys/vaxuba VAX UNIBUS device drivers and related code +.TE +.DE +.PP +Existing block and character device drivers for the VAX +reside in ``/sys/vax'', ``/sys/vaxmba'', and ``/sys/vaxuba''. Network +interface drivers reside in ``/sys/vaxif''. Any new device +drivers should be placed in the appropriate source code directory +and named so as not to conflict with existing devices. +Normally, definitions for things like device registers are placed in +a separate file in the same directory. For example, the ``dh'' +device driver is named ``dh.c'' and its associated include file is +named ``dhreg.h''. +.PP +Once the source for the device driver has been placed in a directory, +the file ``/sys/conf/files.machine'', and possibly +``/sys/conf/devices.machine'' should be modified. The +.I files +files in the conf directory contain a line for each C source or binary-only +file in the system. Those files which are machine independent are +located in ``/sys/conf/files,'' while machine specific files +are in ``/sys/conf/files.machine.'' The ``devices.machine'' file +is used to map device names to major block device numbers. If the device +driver being added provides support for a new disk +you will want to modify this file (the format is obvious). +.PP +In addition to including the driver in the +.I files +file, it must also be added to the device configuration tables. These +are located in ``/sys/vax/conf.c'', or similar for machines other than +the VAX. If you don't understand what to add to this file, you should +study an entry for an existing driver. +Remember that the position in the +device table specifies the major device number. +The block major number is needed in the ``devices.machine'' file +if the device is a disk. diff --git a/share/doc/smm/02.config/Makefile b/share/doc/smm/02.config/Makefile index 26ed70a..716eeda 100644 --- a/share/doc/smm/02.config/Makefile +++ b/share/doc/smm/02.config/Makefile @@ -5,6 +5,5 @@ VOLUME= smm/02.config SRCS= 0.t 1.t 2.t 3.t 4.t 5.t 6.t a.t b.t c.t d.t e.t MACROS= -ms USE_TBL= -SRCDIR= ${.CURDIR}/../../../../usr.sbin/config/SMM.doc .include diff --git a/share/doc/smm/02.config/a.t b/share/doc/smm/02.config/a.t new file mode 100644 index 0000000..dfcb954 --- /dev/null +++ b/share/doc/smm/02.config/a.t @@ -0,0 +1,162 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)a.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Configuration File Grammar +.bp +.LG +.B +.ce +APPENDIX A. CONFIGURATION FILE GRAMMAR +.sp +.R +.NL +.PP +The following grammar is a compressed form of the actual +\fIyacc\fP\|(1) grammar used by +.I config +to parse configuration files. +Terminal symbols are shown all in upper case, literals +are emboldened; optional clauses are enclosed in brackets, ``['' +and ``]''; zero or more instantiations are denoted with ``*''. +.sp +.nf +.DT +Configuration ::= [ Spec \fB;\fP ]* + +Spec ::= Config_spec + | Device_spec + | \fBtrace\fP + | /* lambda */ + +/* configuration specifications */ + +Config_spec ::= \fBmachine\fP ID + | \fBcpu\fP ID + | \fBoptions\fP Opt_list + | \fBident\fP ID + | System_spec + | \fBtimezone\fP [ \fB\-\fP ] NUMBER [ \fBdst\fP [ NUMBER ] ] + | \fBtimezone\fP [ \fB\-\fP ] FPNUMBER [ \fBdst\fP [ NUMBER ] ] + | \fBmaxusers\fP NUMBER + +/* system configuration specifications */ + +System_spec ::= \fBconfig\fP ID System_parameter [ System_parameter ]* + +System_parameter ::= swap_spec | root_spec | dump_spec | arg_spec + +swap_spec ::= \fBswap\fP [ \fBon\fP ] swap_dev [ \fBand\fP swap_dev ]* + +swap_dev ::= dev_spec [ \fBsize\fP NUMBER ] + +root_spec ::= \fBroot\fP [ \fBon\fP ] dev_spec + +dump_spec ::= \fBdumps\fP [ \fBon\fP ] dev_spec + +arg_spec ::= \fBargs\fP [ \fBon\fP ] dev_spec + +dev_spec ::= dev_name | major_minor + +major_minor ::= \fBmajor\fP NUMBER \fBminor\fP NUMBER + +dev_name ::= ID [ NUMBER [ ID ] ] + +/* option specifications */ + +Opt_list ::= Option [ \fB,\fP Option ]* + +Option ::= ID [ \fB=\fP Opt_value ] + +Opt_value ::= ID | NUMBER + +Mkopt_list ::= Mkoption [ \fB,\fP Mkoption ]* + +Mkoption ::= ID \fB=\fP Opt_value + +/* device specifications */ + +Device_spec ::= \fBdevice\fP Dev_name Dev_info Int_spec + | \fBmaster\fP Dev_name Dev_info + | \fBdisk\fP Dev_name Dev_info + | \fBtape\fP Dev_name Dev_info + | \fBcontroller\fP Dev_name Dev_info [ Int_spec ] + | \fBpseudo-device\fP Dev [ NUMBER ] + +Dev_name ::= Dev NUMBER + +Dev ::= \fBuba\fP | \fBmba\fP | ID + +Dev_info ::= Con_info [ Info ]* + +Con_info ::= \fBat\fP Dev NUMBER + | \fBat\fP \fBnexus\fP NUMBER + +Info ::= \fBcsr\fP NUMBER + | \fBdrive\fP NUMBER + | \fBslave\fP NUMBER + | \fBflags\fP NUMBER + +Int_spec ::= \fBvector\fP ID [ ID ]* + | \fBpriority\fP NUMBER +.fi +.sp +.SH +Lexical Conventions +.LP +The terminal symbols are loosely defined as: +.IP ID +.br +One or more alphabetics, either upper or lower case, and underscore, +``_''. +.IP NUMBER +.br +Approximately the C language specification for an integer number. +That is, a leading ``0x'' indicates a hexadecimal value, +a leading ``0'' indicates an octal value, otherwise the number is +expected to be a decimal value. Hexadecimal numbers may use either +upper or lower case alphabetics. +.IP FPNUMBER +.br +A floating point number without exponent. That is a number of the +form ``nnn.ddd'', where the fractional component is optional. +.LP +In special instances a question mark, ``?'', can be substituted for +a ``NUMBER'' token. This is used to effect wildcarding in device +interconnection specifications. +.LP +Comments in configuration files are indicated by a ``#'' character +at the beginning of the line; the remainder of the line is discarded. +.LP +A specification +is interpreted as a continuation of the previous line +if the first character of the line is tab. diff --git a/share/doc/smm/02.config/b.t b/share/doc/smm/02.config/b.t new file mode 100644 index 0000000..901a009 --- /dev/null +++ b/share/doc/smm/02.config/b.t @@ -0,0 +1,137 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)b.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Device Defaulting Rules +.bp +.LG +.B +.ce +APPENDIX B. RULES FOR DEFAULTING SYSTEM DEVICES +.sp +.R +.NL +.PP +When \fIconfig\fP processes a ``config'' rule which does +not fully specify the location of the root file system, +paging area(s), device for system dumps, and device for +argument list processing it applies a set of rules to +define those values left unspecified. The following list +of rules are used in defaulting system devices. +.IP 1) 3 +If a root device is not specified, the swap +specification must indicate a ``generic'' system is to be built. +.IP 2) 3 +If the root device does not specify a unit number, it +defaults to unit 0. +.IP 3) 3 +If the root device does not include a partition specification, +it defaults to the ``a'' partition. +.IP 4) 3 +If no swap area is specified, it defaults to the ``b'' +partition of the root device. +.IP 5) 3 +If no device is specified for processing argument lists, the +first swap partition is selected. +.IP 6) 3 +If no device is chosen for system dumps, the first swap +partition is selected (see below to find out where dumps are +placed within the partition). +.PP +The following table summarizes the default partitions selected +when a device specification is incomplete, e.g. ``hp0''. +.DS +.TS +l l. +Type Partition +_ +root ``a'' +swap ``b'' +args ``b'' +dumps ``b'' +.TE +.DE +.SH +Multiple swap/paging areas +.PP +When multiple swap partitions are specified, the system treats the +first specified as a ``primary'' swap area which is always used. +The remaining partitions are then interleaved into the paging +system at the time a +.IR swapon (2) +system call is made. This is normally done at boot time with +a call to +.IR swapon (8) +from the /etc/rc file. +.SH +System dumps +.PP +System dumps are automatically taken after a system crash, +provided the device driver for the ``dumps'' device supports +this. The dump contains the contents of memory, but not +the swap areas. Normally the dump device is a disk in +which case the information is copied to a location at the +back of the partition. The dump is placed in the back of the +partition because the primary swap and dump device are commonly +the same device and this allows the system to be rebooted without +immediately overwriting the saved information. When a dump has +occurred, the system variable \fIdumpsize\fP +is set to a non-zero value indicating the size (in bytes) of +the dump. The \fIsavecore\fP\|(8) +program then copies the information from the dump partition to +a file in a ``crash'' directory and also makes a copy of the +system which was running at the time of the crash (usually +``/kernel''). The offset to the system dump is defined in the +system variable \fIdumplo\fP (a sector offset from +the front of the dump partition). The +.I savecore +program operates by reading the contents of \fIdumplo\fP, \fIdumpdev\fP, +and \fIdumpmagic\fP from /dev/kmem, then comparing the value +of \fIdumpmagic\fP read from /dev/kmem to that located in +corresponding location in the dump area of the dump partition. +If a match is found, +.I savecore +assumes a crash occurred and reads \fIdumpsize\fP from the dump area +of the dump partition. This value is then used in copying the +system dump. Refer to +\fIsavecore\fP\|(8) +for more information about its operation. +.PP +The value \fIdumplo\fP is calculated to be +.DS +\fIdumpdev-size\fP \- \fImemsize\fP +.DE +where \fIdumpdev-size\fP is the size of the disk partition +where system dumps are to be placed, and +\fImemsize\fP is the size of physical memory. +If the disk partition is not large enough to hold a full +dump, \fIdumplo\fP is set to 0 (the start of the partition). diff --git a/share/doc/smm/02.config/c.t b/share/doc/smm/02.config/c.t new file mode 100644 index 0000000..67b63ec --- /dev/null +++ b/share/doc/smm/02.config/c.t @@ -0,0 +1,109 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)c.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Sample Config Files +.bp +.LG +.B +.ce +APPENDIX C. SAMPLE CONFIGURATION FILES +.sp +.R +.NL +.PP +The following configuration files are developed in section 5; +they are included here for completeness. +.sp 2 +.nf +.ta 1.5i 2.5i 4.0i +# +# ANSEL VAX (a picture perfect machine) +# +machine vax +cpu VAX780 +timezone 8 dst +ident ANSEL +maxusers 40 + +config kernel root on hp0 +config hpkernel root on hp0 swap on hp0 and hp2 +config genkernel swap generic + +controller mba0 at nexus ? +disk hp0 at mba? disk ? +disk hp1 at mba? disk ? +controller mba1 at nexus ? +disk hp2 at mba? disk ? +disk hp3 at mba? disk ? +controller uba0 at nexus ? +controller tm0 at uba? csr 0172520 vector tmintr +tape te0 at tm0 drive 0 +tape te1 at tm0 drive 1 +device dh0 at uba? csr 0160020 vector dhrint dhxint +device dm0 at uba? csr 0170500 vector dmintr +device dh1 at uba? csr 0160040 vector dhrint dhxint +device dh2 at uba? csr 0160060 vector dhrint dhxint +.bp +# +# UCBVAX - Gateway to the world +# +machine vax +cpu "VAX780" +cpu "VAX750" +ident UCBVAX +timezone 8 dst +maxusers 32 +options INET +options NS + +config kernel root on hp swap on hp and rk0 and rk1 +config upkernel root on up +config hkkernel root on hk swap on rk0 and rk1 + +controller mba0 at nexus ? +controller uba0 at nexus ? +disk hp0 at mba? drive 0 +disk hp1 at mba? drive 1 +controller sc0 at uba? csr 0176700 vector upintr +disk up0 at sc0 drive 0 +disk up1 at sc0 drive 1 +controller hk0 at uba? csr 0177440 vector rkintr +disk rk0 at hk0 drive 0 +disk rk1 at hk0 drive 1 +pseudo-device pty +pseudo-device loop +pseudo-device imp +device acc0 at uba? csr 0167600 vector accrint accxint +pseudo-device ether +device ec0 at uba? csr 0164330 vector ecrint eccollide ecxint +device il0 at uba? csr 0164000 vector ilrint ilcint diff --git a/share/doc/smm/02.config/d.t b/share/doc/smm/02.config/d.t new file mode 100644 index 0000000..db9ab80 --- /dev/null +++ b/share/doc/smm/02.config/d.t @@ -0,0 +1,272 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)d.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Data Structure Sizing Rules +.bp +.LG +.B +.ce +APPENDIX D. VAX KERNEL DATA STRUCTURE SIZING RULES +.sp +.R +.NL +.PP +Certain system data structures are sized at compile time +according to the maximum number of simultaneous users expected, +while others are calculated at boot time based on the +physical resources present, e.g. memory. This appendix lists +both sets of rules and also includes some hints on changing +built-in limitations on certain data structures. +.SH +Compile time rules +.PP +The file \fI/sys/conf\|/param.c\fP contains the definitions of +almost all data structures sized at compile time. This file +is copied into the directory of each configured system to allow +configuration-dependent rules and values to be maintained. +(Each copy normally depends on the copy in /sys/conf, +and global modifications cause the file to be recopied unless +the makefile is modified.) +The rules implied by its contents are summarized below (here +MAXUSERS refers to the value defined in the configuration file +in the ``maxusers'' rule). +Most limits are computed at compile time and stored in global variables +for use by other modules; they may generally be patched in the system +binary image before rebooting to test new values. +.IP \fBnproc\fP +.br +The maximum number of processes which may be running at any time. +It is referred to in other calculations as NPROC and is defined to be +.DS +20 + 8 * MAXUSERS +.DE +.IP \fBntext\fP +.br +The maximum number of active shared text segments. +The constant is intended to allow for network servers and common commands +that remain in the table. +It is defined as +.DS +36 + MAXUSERS. +.DE +.IP \fBninode\fP +.br +The maximum number of files in the file system which may be +active at any time. This includes files in use by users, as +well as directory files being read or written by the system +and files associated with bound sockets in the UNIX IPC domain. +It is defined as +.DS +(NPROC + 16 + MAXUSERS) + 32 +.DE +.IP \fBnfile\fP +.br +The number of ``file table'' structures. One file +table structure is used for each open, unshared, file descriptor. +Multiple file descriptors may reference a single file table +entry when they are created through a \fIdup\fP call, or as the +result of a \fIfork\fP. This is defined to be +.DS +16 * (NPROC + 16 + MAXUSERS) / 10 + 32 +.DE +.IP \fBncallout\fP +.br +The number of ``callout'' structures. One callout +structure is used per internal system event handled with +a timeout. Timeouts are used for terminal delays, +watchdog routines in device drivers, protocol timeout processing, etc. +This is defined as +.DS +16 + NPROC +.DE +.IP \fBnclist\fP +.br +The number of ``c-list'' structures. C-list structures are +used in terminal I/O, and currently each holds 60 characters. +Their number is defined as +.DS +60 + 12 * MAXUSERS +.DE +.IP \fBnmbclusters\fP +.br +The maximum number of pages which may be allocated by the network. +This is defined as 256 (a quarter megabyte of memory) in /sys/h/mbuf.h. +In practice, the network rarely uses this much memory. It starts off +by allocating 8 kilobytes of memory, then requesting more as +required. This value represents an upper bound. +.IP \fBnquota\fP +.br +The number of ``quota'' structures allocated. Quota structures +are present only when disc quotas are configured in the system. One +quota structure is kept per user. This is defined to be +.DS +(MAXUSERS * 9) / 7 + 3 +.DE +.IP \fBndquot\fP +.br +The number of ``dquot'' structures allocated. Dquot structures +are present only when disc quotas are configured in the system. +One dquot structure is required per user, per active file system quota. +That is, when a user manipulates a file on a file system on which +quotas are enabled, the information regarding the user's quotas on +that file system must be in-core. This information is cached, so +that not all information must be present in-core all the time. +This is defined as +.DS +NINODE + (MAXUSERS * NMOUNT) / 4 +.DE +where NMOUNT is the maximum number of mountable file systems. +.LP +In addition to the above values, the system page tables (used to +map virtual memory in the kernel's address space) are sized at +compile time by the SYSPTSIZE definition in the file /sys/vax/vmparam.h. +This is defined to be +.DS +20 + MAXUSERS +.DE +pages of page tables. +Its definition affects +the size of many data structures allocated at boot time because +it constrains the amount of virtual memory which may be addressed +by the running system. This is often the limiting factor +in the size of the buffer cache, in which case a message is printed +when the system configures at boot time. +.SH +Run-time calculations +.PP +The most important data structures sized at run-time are those used in +the buffer cache. Allocation is done by allocating physical memory +(and system virtual memory) immediately after the system +has been started up; look in the file /sys/vax/machdep.c. +The amount of physical memory which may be allocated to the buffer +cache is constrained by the size of the system page tables, among +other things. While the system may calculate +a large amount of memory to be allocated to the buffer cache, +if the system page +table is too small to map this physical +memory into the virtual address space +of the system, only as much as can be mapped will be used. +.PP +The buffer cache is comprised of a number of ``buffer headers'' +and a pool of pages attached to these headers. Buffer headers +are divided into two categories: those used for swapping and +paging, and those used for normal file I/O. The system tries +to allocate 10% of the first two megabytes and 5% of the remaining +available physical memory for the buffer +cache (where \fIavailable\fP does not count that space occupied by +the system's text and data segments). If this results in fewer +than 16 pages of memory allocated, then 16 pages are allocated. +This value is kept in the initialized variable \fIbufpages\fP +so that it may be patched in the binary image (to allow tuning +without recompiling the system), +or the default may be overridden with a configuration-file option. +For example, the option \fBoptions BUFPAGES="3200"\fP +causes 3200 pages (3.2M bytes) to be used by the buffer cache. +A sufficient number of file I/O buffer headers are then allocated +to allow each to hold 2 pages each. +Each buffer maps 8K bytes. +If the number of buffer pages is larger than can be mapped +by the buffer headers, the number of pages is reduced. +The number of buffer headers allocated +is stored in the global variable \fInbuf\fP, +which may be patched before the system is booted. +The system option \fBoptions NBUF="1000"\fP forces the allocation +of 1000 buffer headers. +Half as many swap I/O buffer headers as file I/O buffers +are allocated, +but no more than 256. +.SH +System size limitations +.PP +As distributed, the sum of the virtual sizes of the core-resident +processes is limited to 256M bytes. The size of the text +segment of a single process is currently limited to 6M bytes. +It may be increased to no greater than the data segment size limit +(see below) by redefining MAXTSIZ. +This may be done with a configuration file option, +e.g. \fBoptions MAXTSIZ="(10*1024*1024)"\fP +to set the limit to 10 million bytes. +Other per-process limits discussed here may be changed with similar options +with names given in parentheses. +Soft, user-changeable limits are set to 512K bytes for stack (DFLSSIZ) +and 6M bytes for the data segment (DFLDSIZ) by default; +these may be increased up to the hard limit +with the \fIsetrlimit\fP\|(2) system call. +The data and stack segment size hard limits are set by a system configuration +option to one of 17M, 33M or 64M bytes. +One of these sizes is chosen based on the definition of MAXDSIZ; +with no option, the limit is 17M bytes; with an option +\fBoptions MAXDSIZ="(32*1024*1024)"\fP (or any value between 17M and 33M), +the limit is increased to 33M bytes, and values larger than 33M +result in a limit of 64M bytes. +You must be careful in doing this that you have adequate paging space. +As normally configured , the system has 16M or 32M bytes per paging area, +depending on disk size. +The best way to get more space is to provide multiple, thereby +interleaved, paging areas. +Increasing the virtual memory limits results in interleaving of +swap space in larger sections (from 500K bytes to 1M or 2M bytes). +.PP +By default, the virtual memory system allocates enough memory +for system page tables mapping user page tables +to allow 256 megabytes of simultaneous active virtual memory. +That is, the sum of the virtual memory sizes of all (completely- or partially-) +resident processes can not exceed this limit. +If the limit is exceeded, some process(es) must be swapped out. +To increase the amount of resident virtual space possible, +you can alter the constant USRPTSIZE (in +/sys/vax/vmparam.h). +Each page of system page tables allows 8 megabytes of user virtual memory. +.PP +Because the file system block numbers are stored in +page table \fIpg_blkno\fP +entries, the maximum size of a file system is limited to +2^24 1024 byte blocks. Thus no file system can be larger than 8 gigabytes. +.PP +The number of mountable file systems is set at 20 by the definition +of NMOUNT in /sys/h/param.h. +This should be sufficient; if not, the value can be increased up to 255. +If you have many disks, it makes sense to make some of +them single file systems, and the paging areas don't count in this total. +.PP +The limit to the number of files that a process may have open simultaneously +is set to 64. +This limit is set by the NOFILE definition in /sys/h/param.h. +It may be increased arbitrarily, with the caveat that the user structure +expands by 5 bytes for each file, and thus UPAGES (/sys/vax/machparam.h) +must be increased accordingly. +.PP +The amount of physical memory is currently limited to 64 Mb +by the size of the index fields in the core-map (/sys/h/cmap.h). +The limit may be increased by following instructions in that file +to enlarge those fields. diff --git a/share/doc/smm/02.config/e.t b/share/doc/smm/02.config/e.t new file mode 100644 index 0000000..0a9505b --- /dev/null +++ b/share/doc/smm/02.config/e.t @@ -0,0 +1,114 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)e.t 8.1 (Berkeley) 6/8/93 +.\" +.\".ds RH "Network configuration options +.bp +.LG +.B +.ce +APPENDIX E. NETWORK CONFIGURATION OPTIONS +.sp +.R +.NL +.PP +The network support in the kernel is self-configuring +according to the protocol support options (INET and NS) and the network +hardware discovered during autoconfiguration. +There are several changes that may be made to customize network behavior +due to local restrictions. +Within the Internet protocol routines, the following options +set in the system configuration file are supported: +.IP \fBGATEWAY\fP +.br +The machine is to be used as a gateway. +This option currently makes only minor changes. +First, the size of the network routing hash table is increased. +Secondly, machines that have only a single hardware network interface +will not forward IP packets; without this option, they will also refrain +from sending any error indication to the source of unforwardable packets. +Gateways with only a single interface are assumed to have missing +or broken interfaces, and will return ICMP unreachable errors to hosts +sending them packets to be forwarded. +.IP \fBTCP_COMPAT_42\fP +.br +This option forces the system to limit its initial TCP sequence numbers +to positive numbers. +Without this option, 4.4BSD systems may have problems with TCP connections +to 4.2BSD systems that connect but never transfer data. +The problem is a bug in the 4.2BSD TCP. +.IP \fBIPFORWARDING\fP +.br +Normally, 4.4BSD machines with multiple network interfaces +will forward IP packets received that should be resent to another host. +If the line ``options IPFORWARDING="0"'' is in the system configuration +file, IP packet forwarding will be disabled. +.IP \fBIPSENDREDIRECTS\fP +.br +When forwarding IP packets, 4.4BSD IP will note when a packet is forwarded +using the same interface on which it arrived. +When this is noted, if the source machine is on the directly-attached +network, an ICMP redirect is sent to the source host. +If the packet was forwarded using a route to a host or to a subnet, +a host redirect is sent, otherwise a network redirect is sent. +The generation of redirects may be inhibited with the configuration +option ``options IPSENDREDIRECTS="0".'' +.br +.IP \fBSUBNETSARELOCAL\fP +TCP calculates a maximum segment size to use for each connection, +and sends no datagrams larger than that size. +This size will be no larger than that supported on the outgoing +interface. +Furthermore, if the destination is not on the local network, +the size will be no larger than 576 bytes. +For this test, other subnets of a directly-connected subnetted +network are considered to be local unless the line +``options SUBNETSARELOCAL="0"'' is used in the system configuration file. +.LP +The following options are supported by the Xerox NS protocols: +.IP \fBNSIP\fP +.br +This option allows NS IDP datagrams to be encapsulated in Internet IP +packets for transmission to a collaborating NSIP host. +This may be used to pass IDP packets through IP-only link layer networks. +See +.IR nsip (4P) +for details. +.IP \fBTHREEWAYSHAKE\fP +.br +The NS Sequenced Packet Protocol does not require a three-way handshake +before considering a connection to be in the established state. +(A three-way handshake consists of a connection request, an acknowledgement +of the request along with a symmetrical opening indication, +and then an acknowledgement of the reciprocal opening packet.) +This option forces a three-way handshake before data may be transmitted +on Sequenced Packet sockets. diff --git a/share/doc/smm/02.config/spell.ok b/share/doc/smm/02.config/spell.ok new file mode 100644 index 0000000..dfc5df1 --- /dev/null +++ b/share/doc/smm/02.config/spell.ok @@ -0,0 +1,305 @@ +# $FreeBSD$ +ACC +ANSEL +ARP +Autoconfiguration +BUFPAGES +CANTWAIT +CH +COMPAT +CSS +Co +Config +Config''SMM:2 +DCLR +DFLDSIZ +DFLSSIZ +DFUNNY +DHAHA +DMA +Dev +Dquot +ECC +EMULEX +Emulex +Ethernet +FPNUMBER +FUNNY,HAHA +HAVEBDP +ICMP +IDP +IE +INET +IP +IPC +IPFORWARDING +IPL +IPSENDREDIRECTS +Info +Karels +LH +Leffler +MASSBUS +MAXDSIZ +MAXTSIZ +Makefile +Mb +MicroVAX +Mkopt +Mkoption +NBUF +NEED16 +NEEDBDP +NINODE +NMOUNT +NOFILE +NPROC +NS +NSC +NSIP +NUP +PST +RCS +RDY +RH +RK07 +RK611 +SCCS +SITENAME +SMM:2 +SUBNETSARELOCAL +SYSPTSIZE +TCP +THREEWAYSHAKE +Timezone +UCBVAX +UDP +UNIBUS +UPAGES +UPCS2 +USRPTSIZE +VAX +VAX630 +VAX730 +VAX750 +VAX780 +VAX8600 +VAXWELL +VAXen +Vax +Vaxwell +acc0 +accrint +accxint +addr +arg +args +assym.s +autoconfiguration +autoconfigure +autoconfigured +backpointer +badaddr +blkno +br +br5 +buf +bufpages +buses +caddr +callout +catchall +cmap.h +cmd +conf +conf.c +config +csr +ct.c +ctlr +cvec +datagrams +define''s +dev +devices.machine +dgo +dh.c +dh0 +dh1 +dh2 +dhreg.h +dhrint +dhxint +dinfo +dk +dk.h +dm0 +dmintr +dname +dquot +dst +dumpdev +dumplo +dumpmagic +dumpsize +dz.c +dz0 +dzrint +dzxint +ec0 +eccollide +ecrint +ecxint +endif +es +files.machine +filesystem +foo +foo.c +genkernel +gettimeofday +gigabytes +gprof +hardwired +hd +hk +hk0 +hkkernel +howmany +hp0 +hp0b +hp1 +hp2 +hp3 +hpkernel +ht0 +hz +ident +ifdef +ifndef +il0 +ilcint +ilrint +info +intr +ioconf.c +kgmon +linterrs +loopback +machdep.c +machparam.h +makefile +makelinks +makeoptions +maxusers +mba +mba0 +mba1 +mbuf.h +mcount.c +memsize +minfo +mname +moniker +mspw +nbuf +ncallout +nclist +ndquot +ndrive +netimp +netinet +netns +netstat +nexi +nexus +nfile +ninode +nmbclusters +nnn.ddd +nproc +nquota +nsip +ntext +optionlist +param.c +param.h +pathnames +pg +physaddr +pty +rc +reg +rk.c +rk0 +rk1 +rkintr +savecore +sc +sc0 +sc1 +scdriver +setrlimit +sizeof +softc +source.c +subr +swapxxx.c +sysname +te0 +te1 +timezone +tm0 +tmintr +tu0 +uba +uba.c +uba0 +ubago +uballoc +ubamem +ubanum +ubareg.h +ubarelse +ubavar.h +ubglue.s +ubinfo +ud +ui +um +up.c +up0 +up1 +up2 +upaddr +upattach +upba +upcs1 +upcs2 +updevice +updgo +updinfo +updtab +upintr +upip +upmaptype +upminfo +upprobe +upslave +upstd +upkernel +upwatch +upwstart +value,name2 +value2 +vax +vaxif +vaxmba +vaxuba +vmparam.h +kernel +wildcard +wildcarded +wildcarding +xclu +xxx diff --git a/share/doc/smm/03.fsck/0.t b/share/doc/smm/03.fsck/0.t new file mode 100644 index 0000000..5fe189d --- /dev/null +++ b/share/doc/smm/03.fsck/0.t @@ -0,0 +1,147 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" @(#)0.t 8.1 (Berkeley) 6/8/93 +.\" +.if n .ND +.TL +Fsck_ffs \- The UNIX\(dg File System Check Program +.EH 'SMM:3-%''The \s-2UNIX\s+2 File System Check Program' +.OH 'The \s-2UNIX\s+2 File System Check Program''SMM:3-%' +.AU +Marshall Kirk McKusick +.AI +Computer Systems Research Group +Computer Science Division +Department of Electrical Engineering and Computer Science +University of California, Berkeley +Berkeley, CA 94720 +.AU +T. J. Kowalski +.AI +Bell Laboratories +Murray Hill, New Jersey 07974 +.AB +.FS +\(dgUNIX is a trademark of Bell Laboratories. +.FE +.FS +This work was done under grants from +the National Science Foundation under grant MCS80-05144, +and the Defense Advance Research Projects Agency (DoD) under +Arpa Order No. 4031 monitored by Naval Electronic System Command under +Contract No. N00039-82-C-0235. +.FE +This document reflects the use of +.I fsck_ffs +with the 4.2BSD and 4.3BSD file system organization. This +is a revision of the +original paper written by +T. J. Kowalski. +.PP +File System Check Program (\fIfsck_ffs\fR) +is an interactive file system check and repair program. +.I Fsck_ffs +uses the redundant structural information in the +UNIX file system to perform several consistency checks. +If an inconsistency is detected, it is reported +to the operator, who may elect to fix or ignore +each inconsistency. +These inconsistencies result from the permanent interruption +of the file system updates, which are performed every +time a file is modified. +Unless there has been a hardware failure, +.I fsck_ffs +is able to repair corrupted file systems +using procedures based upon the order in which UNIX honors +these file system update requests. +.PP +The purpose of this document is to describe the normal updating +of the file system, +to discuss the possible causes of file system corruption, +and to present the corrective actions implemented +by +.I fsck_ffs. +Both the program and the interaction between the +program and the operator are described. +.sp 2 +.LP +Revised October 7, 1996 +.AE +.LP +.bp +.ce +.B "TABLE OF CONTENTS" +.LP +.sp 1 +.nf +.B "1. Introduction" +.LP +.sp .5v +.nf +.B "2. Overview of the file system +2.1. Superblock +2.2. Summary Information +2.3. Cylinder groups +2.4. Fragments +2.5. Updates to the file system +.LP +.sp .5v +.nf +.B "3. Fixing corrupted file systems +3.1. Detecting and correcting corruption +3.2. Super block checking +3.3. Free block checking +3.4. Checking the inode state +3.5. Inode links +3.6. Inode data size +3.7. Checking the data associated with an inode +3.8. File system connectivity +.LP +.sp .5v +.nf +.B Acknowledgements +.LP +.sp .5v +.nf +.B References +.LP +.sp .5v +.nf +.B "4. Appendix A +4.1. Conventions +4.2. Initialization +4.3. Phase 1 - Check Blocks and Sizes +4.4. Phase 1b - Rescan for more Dups +4.5. Phase 2 - Check Pathnames +4.6. Phase 3 - Check Connectivity +4.7. Phase 4 - Check Reference Counts +4.8. Phase 5 - Check Cyl groups +4.9. Cleanup +.ds RH Introduction +.bp diff --git a/share/doc/smm/03.fsck/1.t b/share/doc/smm/03.fsck/1.t new file mode 100644 index 0000000..3098b49 --- /dev/null +++ b/share/doc/smm/03.fsck/1.t @@ -0,0 +1,80 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" @(#)1.t 8.1 (Berkeley) 6/5/93 +.\" +.ds RH Introduction +.NH +Introduction +.PP +This document reflects the use of +.I fsck_ffs +with the 4.2BSD and 4.3BSD file system organization. This +is a revision of the +original paper written by +T. J. Kowalski. +.PP +When a UNIX +operating system is brought up, a consistency +check of the file systems should always be performed. +This precautionary measure helps to insure +a reliable environment for file storage on disk. +If an inconsistency is discovered, +corrective action must be taken. +.I Fsck_ffs +runs in two modes. +Normally it is run non-interactively by the system after +a normal boot. +When running in this mode, +it will only make changes to the file system that are known +to always be correct. +If an unexpected inconsistency is found +.I fsck_ffs +will exit with a non-zero exit status, +leaving the system running single-user. +Typically the operator then runs +.I fsck_ffs +interactively. +When running in this mode, +each problem is listed followed by a suggested corrective action. +The operator must decide whether or not the suggested correction +should be made. +.PP +The purpose of this memo is to dispel the +mystique surrounding +file system inconsistencies. +It first describes the updating of the file system +(the calm before the storm) and +then describes file system corruption (the storm). +Finally, +the set of deterministic corrective actions +used by +.I fsck_ffs +(the Coast Guard +to the rescue) is presented. +.ds RH Overview of the File System diff --git a/share/doc/smm/03.fsck/2.t b/share/doc/smm/03.fsck/2.t new file mode 100644 index 0000000..b294a6a --- /dev/null +++ b/share/doc/smm/03.fsck/2.t @@ -0,0 +1,262 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" @(#)2.t 8.1 (Berkeley) 6/5/93 +.\" +.ds RH Overview of the file system +.NH +Overview of the file system +.PP +The file system is discussed in detail in [Mckusick84]; +this section gives a brief overview. +.NH 2 +Superblock +.PP +A file system is described by its +.I "super-block" . +The super-block is built when the file system is created (\c +.I newfs (8)) +and never changes. +The super-block +contains the basic parameters of the file system, +such as the number of data blocks it contains +and a count of the maximum number of files. +Because the super-block contains critical data, +.I newfs +replicates it to protect against catastrophic loss. +The +.I "default super block" +always resides at a fixed offset from the beginning +of the file system's disk partition. +The +.I "redundant super blocks" +are not referenced unless a head crash +or other hard disk error causes the default super-block +to be unusable. +The redundant blocks are sprinkled throughout the disk partition. +.PP +Within the file system are files. +Certain files are distinguished as directories and contain collections +of pointers to files that may themselves be directories. +Every file has a descriptor associated with it called an +.I "inode". +The inode contains information describing ownership of the file, +time stamps indicating modification and access times for the file, +and an array of indices pointing to the data blocks for the file. +In this section, +we assume that the first 12 blocks +of the file are directly referenced by values stored +in the inode structure itself\(dg. +.FS +\(dgThe actual number may vary from system to system, but is usually in +the range 5-13. +.FE +The inode structure may also contain references to indirect blocks +containing further data block indices. +In a file system with a 4096 byte block size, a singly indirect +block contains 1024 further block addresses, +a doubly indirect block contains 1024 addresses of further single indirect +blocks, +and a triply indirect block contains 1024 addresses of further doubly indirect +blocks (the triple indirect block is never needed in practice). +.PP +In order to create files with up to +2\(ua32 bytes, +using only two levels of indirection, +the minimum size of a file system block is 4096 bytes. +The size of file system blocks can be any power of two +greater than or equal to 4096. +The block size of the file system is maintained in the super-block, +so it is possible for file systems of different block sizes +to be accessible simultaneously on the same system. +The block size must be decided when +.I newfs +creates the file system; +the block size cannot be subsequently +changed without rebuilding the file system. +.NH 2 +Summary information +.PP +Associated with the super block is non replicated +.I "summary information" . +The summary information changes +as the file system is modified. +The summary information contains +the number of blocks, fragments, inodes and directories in the file system. +.NH 2 +Cylinder groups +.PP +The file system partitions the disk into one or more areas called +.I "cylinder groups". +A cylinder group is comprised of one or more consecutive +cylinders on a disk. +Each cylinder group includes inode slots for files, a +.I "block map" +describing available blocks in the cylinder group, +and summary information describing the usage of data blocks +within the cylinder group. +A fixed number of inodes is allocated for each cylinder group +when the file system is created. +The current policy is to allocate one inode for each 2048 +bytes of disk space; +this is expected to be far more inodes than will ever be needed. +.PP +All the cylinder group bookkeeping information could be +placed at the beginning of each cylinder group. +However if this approach were used, +all the redundant information would be on the top platter. +A single hardware failure that destroyed the top platter +could cause the loss of all copies of the redundant super-blocks. +Thus the cylinder group bookkeeping information +begins at a floating offset from the beginning of the cylinder group. +The offset for +the +.I "i+1" st +cylinder group is about one track further +from the beginning of the cylinder group +than it was for the +.I "i" th +cylinder group. +In this way, +the redundant +information spirals down into the pack; +any single track, cylinder, +or platter can be lost without losing all copies of the super-blocks. +Except for the first cylinder group, +the space between the beginning of the cylinder group +and the beginning of the cylinder group information stores data. +.NH 2 +Fragments +.PP +To avoid waste in storing small files, +the file system space allocator divides a single +file system block into one or more +.I "fragments". +The fragmentation of the file system is specified +when the file system is created; +each file system block can be optionally broken into +2, 4, or 8 addressable fragments. +The lower bound on the size of these fragments is constrained +by the disk sector size; +typically 512 bytes is the lower bound on fragment size. +The block map associated with each cylinder group +records the space availability at the fragment level. +Aligned fragments are examined +to determine block availability. +.PP +On a file system with a block size of 4096 bytes +and a fragment size of 1024 bytes, +a file is represented by zero or more 4096 byte blocks of data, +and possibly a single fragmented block. +If a file system block must be fragmented to obtain +space for a small amount of data, +the remainder of the block is made available for allocation +to other files. +For example, +consider an 11000 byte file stored on +a 4096/1024 byte file system. +This file uses two full size blocks and a 3072 byte fragment. +If no fragments with at least 3072 bytes +are available when the file is created, +a full size block is split yielding the necessary 3072 byte +fragment and an unused 1024 byte fragment. +This remaining fragment can be allocated to another file, as needed. +.NH 2 +Updates to the file system +.PP +Every working day hundreds of files +are created, modified, and removed. +Every time a file is modified, +the operating system performs a +series of file system updates. +These updates, when written on disk, yield a consistent file system. +The file system stages +all modifications of critical information; +modification can +either be completed or cleanly backed out after a crash. +Knowing the information that is first written to the file system, +deterministic procedures can be developed to +repair a corrupted file system. +To understand this process, +the order that the update +requests were being honored must first be understood. +.PP +When a user program does an operation to change the file system, +such as a +.I write , +the data to be written is copied into an internal +.I "in-core" +buffer in the kernel. +Normally, the disk update is handled asynchronously; +the user process is allowed to proceed even though +the data has not yet been written to the disk. +The data, +along with the inode information reflecting the change, +is eventually written out to disk. +The real disk write may not happen until long after the +.I write +system call has returned. +Thus at any given time, the file system, +as it resides on the disk, +lags the state of the file system represented by the in-core information. +.PP +The disk information is updated to reflect the in-core information +when the buffer is required for another use, +when a +.I sync (2) +is done (at 30 second intervals) by +.I "/etc/update" "(8)," +or by manual operator intervention with the +.I sync (8) +command. +If the system is halted without writing out the in-core information, +the file system on the disk will be in an inconsistent state. +.PP +If all updates are done asynchronously, several serious +inconsistencies can arise. +One inconsistency is that a block may be claimed by two inodes. +Such an inconsistency can occur when the system is halted before +the pointer to the block in the old inode has been cleared +in the copy of the old inode on the disk, +and after the pointer to the block in the new inode has been written out +to the copy of the new inode on the disk. +Here, +there is no deterministic method for deciding +which inode should really claim the block. +A similar problem can arise with a multiply claimed inode. +.PP +The problem with asynchronous inode updates +can be avoided by doing all inode deallocations synchronously. +Consequently, +inodes and indirect blocks are written to the disk synchronously +(\fIi.e.\fP the process blocks until the information is +really written to disk) +when they are being deallocated. +Similarly inodes are kept consistent by synchronously +deleting, adding, or changing directory entries. +.ds RH Fixing corrupted file systems diff --git a/share/doc/smm/03.fsck/3.t b/share/doc/smm/03.fsck/3.t new file mode 100644 index 0000000..522a222 --- /dev/null +++ b/share/doc/smm/03.fsck/3.t @@ -0,0 +1,449 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" @(#)3.t 8.1 (Berkeley) 6/5/93 +.\" +.ds RH Fixing corrupted file systems +.NH +Fixing corrupted file systems +.PP +A file system +can become corrupted in several ways. +The most common of these ways are +improper shutdown procedures +and hardware failures. +.PP +File systems may become corrupted during an +.I "unclean halt" . +This happens when proper shutdown +procedures are not observed, +physically write-protecting a mounted file system, +or a mounted file system is taken off-line. +The most common operator procedural failure is forgetting to +.I sync +the system before halting the CPU. +.PP +File systems may become further corrupted if proper startup +procedures are not observed, e.g., +not checking a file system for inconsistencies, +and not repairing inconsistencies. +Allowing a corrupted file system to be used (and, thus, to be modified +further) can be disastrous. +.PP +Any piece of hardware can fail at any time. +Failures +can be as subtle as a bad block +on a disk pack, or as blatant as a non-functional disk-controller. +.NH 2 +Detecting and correcting corruption +.PP +Normally +.I fsck_ffs +is run non-interactively. +In this mode it will only fix +corruptions that are expected to occur from an unclean halt. +These actions are a proper subset of the actions that +.I fsck_ffs +will take when it is running interactively. +Throughout this paper we assume that +.I fsck_ffs +is being run interactively, +and all possible errors can be encountered. +When an inconsistency is discovered in this mode, +.I fsck_ffs +reports the inconsistency for the operator to +chose a corrective action. +.PP +A quiescent\(dd +.FS +\(dd I.e., unmounted and not being written on. +.FE +file system may be checked for structural integrity +by performing consistency checks on the +redundant data intrinsic to a file system. +The redundant data is either read from +the file system, +or computed from other known values. +The file system +.B must +be in a quiescent state when +.I fsck_ffs +is run, +since +.I fsck_ffs +is a multi-pass program. +.PP +In the following sections, +we discuss methods to discover inconsistencies +and possible corrective actions +for the cylinder group blocks, the inodes, the indirect blocks, and +the data blocks containing directory entries. +.NH 2 +Super-block checking +.PP +The most commonly corrupted item in a file system +is the summary information +associated with the super-block. +The summary information is prone to corruption +because it is modified with every change to the file +system's blocks or inodes, +and is usually corrupted +after an unclean halt. +.PP +The super-block is checked for inconsistencies +involving file-system size, number of inodes, +free-block count, and the free-inode count. +The file-system size must be larger than the +number of blocks used by the super-block +and the number of blocks used by the list of inodes. +The file-system size and layout information +are the most critical pieces of information for +.I fsck_ffs . +While there is no way to actually check these sizes, +since they are statically determined by +.I newfs , +.I fsck_ffs +can check that these sizes are within reasonable bounds. +All other file system checks require that these sizes be correct. +If +.I fsck_ffs +detects corruption in the static parameters of the default super-block, +.I fsck_ffs +requests the operator to specify the location of an alternate super-block. +.NH 2 +Free block checking +.PP +.I Fsck_ffs +checks that all the blocks +marked as free in the cylinder group block maps +are not claimed by any files. +When all the blocks have been initially accounted for, +.I fsck_ffs +checks that +the number of free blocks +plus the number of blocks claimed by the inodes +equals the total number of blocks in the file system. +.PP +If anything is wrong with the block allocation maps, +.I fsck_ffs +will rebuild them, +based on the list it has computed of allocated blocks. +.PP +The summary information associated with the super-block +counts the total number of free blocks within the file system. +.I Fsck_ffs +compares this count to the +number of free blocks it found within the file system. +If the two counts do not agree, then +.I fsck_ffs +replaces the incorrect count in the summary information +by the actual free-block count. +.PP +The summary information +counts the total number of free inodes within the file system. +.I Fsck_ffs +compares this count to the number +of free inodes it found within the file system. +If the two counts do not agree, then +.I fsck_ffs +replaces the incorrect count in the +summary information by the actual free-inode count. +.NH 2 +Checking the inode state +.PP +An individual inode is not as likely to be corrupted as +the allocation information. +However, because of the great number of active inodes, +a few of the inodes are usually corrupted. +.PP +The list of inodes in the file system +is checked sequentially starting with inode 2 +(inode 0 marks unused inodes; +inode 1 is saved for future generations) +and progressing through the last inode in the file system. +The state of each inode is checked for +inconsistencies involving format and type, +link count, +duplicate blocks, +bad blocks, +and inode size. +.PP +Each inode contains a mode word. +This mode word describes the type and state of the inode. +Inodes must be one of six types: +regular inode, directory inode, symbolic link inode, +special block inode, special character inode, or socket inode. +Inodes may be found in one of three allocation states: +unallocated, allocated, and neither unallocated nor allocated. +This last state suggests an incorrectly formated inode. +An inode can get in this state if +bad data is written into the inode list. +The only possible corrective action is for +.I fsck_ffs +is to clear the inode. +.NH 2 +Inode links +.PP +Each inode counts the +total number of directory entries +linked to the inode. +.I Fsck_ffs +verifies the link count of each inode +by starting at the root of the file system, +and descending through the directory structure. +The actual link count for each inode +is calculated during the descent. +.PP +If the stored link count is non-zero and the actual +link count is zero, +then no directory entry appears for the inode. +If this happens, +.I fsck_ffs +will place the disconnected file in the +.I lost+found +directory. +If the stored and actual link counts are non-zero and unequal, +a directory entry may have been added or removed without the inode being +updated. +If this happens, +.I fsck_ffs +replaces the incorrect stored link count by the actual link count. +.PP +Each inode contains a list, +or pointers to +lists (indirect blocks), +of all the blocks claimed by the inode. +Since indirect blocks are owned by an inode, +inconsistencies in indirect blocks directly +affect the inode that owns it. +.PP +.I Fsck_ffs +compares each block number claimed by an inode +against a list of already allocated blocks. +If another inode already claims a block number, +then the block number is added to a list of +.I "duplicate blocks" . +Otherwise, the list of allocated blocks +is updated to include the block number. +.PP +If there are any duplicate blocks, +.I fsck_ffs +will perform a partial second +pass over the inode list +to find the inode of the duplicated block. +The second pass is needed, +since without examining the files associated with +these inodes for correct content, +not enough information is available +to determine which inode is corrupted and should be cleared. +If this condition does arise +(only hardware failure will cause it), +then the inode with the earliest +modify time is usually incorrect, +and should be cleared. +If this happens, +.I fsck_ffs +prompts the operator to clear both inodes. +The operator must decide which one should be kept +and which one should be cleared. +.PP +.I Fsck_ffs +checks the range of each block number claimed by an inode. +If the block number is +lower than the first data block in the file system, +or greater than the last data block, +then the block number is a +.I "bad block number" . +Many bad blocks in an inode are usually caused by +an indirect block that was not written to the file system, +a condition which can only occur if there has been a hardware failure. +If an inode contains bad block numbers, +.I fsck_ffs +prompts the operator to clear it. +.NH 2 +Inode data size +.PP +Each inode contains a count of the number of data blocks +that it contains. +The number of actual data blocks +is the sum of the allocated data blocks +and the indirect blocks. +.I Fsck_ffs +computes the actual number of data blocks +and compares that block count against +the actual number of blocks the inode claims. +If an inode contains an incorrect count +.I fsck_ffs +prompts the operator to fix it. +.PP +Each inode contains a thirty-two bit size field. +The size is the number of data bytes +in the file associated with the inode. +The consistency of the byte size field is roughly checked +by computing from the size field the maximum number of blocks +that should be associated with the inode, +and comparing that expected block count against +the actual number of blocks the inode claims. +.NH 2 +Checking the data associated with an inode +.PP +An inode can directly or indirectly +reference three kinds of data blocks. +All referenced blocks must be the same kind. +The three types of data blocks are: +plain data blocks, symbolic link data blocks, and directory data blocks. +Plain data blocks +contain the information stored in a file; +symbolic link data blocks +contain the path name stored in a link. +Directory data blocks contain directory entries. +.I Fsck_ffs +can only check the validity of directory data blocks. +.PP +Each directory data block is checked for +several types of inconsistencies. +These inconsistencies include +directory inode numbers pointing to unallocated inodes, +directory inode numbers that are greater than +the number of inodes in the file system, +incorrect directory inode numbers for ``\fB.\fP'' and ``\fB..\fP'', +and directories that are not attached to the file system. +If the inode number in a directory data block +references an unallocated inode, +then +.I fsck_ffs +will remove that directory entry. +Again, +this condition can only arise when there has been a hardware failure. +.PP +.I Fsck_ffs +also checks for directories with unallocated blocks (holes). +Such directories should never be created. +When found, +.I fsck_ffs +will prompt the user to adjust the length of the offending directory +which is done by shortening the size of the directory to the end of the +last allocated block preceding the hole. +Unfortunately, this means that another Phase 1 run has to be done. +.I Fsck_ffs +will remind the user to rerun fsck_ffs after repairing a +directory containing an unallocated block. +.PP +If a directory entry inode number references +outside the inode list, then +.I fsck_ffs +will remove that directory entry. +This condition occurs if bad data is written into a directory data block. +.PP +The directory inode number entry for ``\fB.\fP'' +must be the first entry in the directory data block. +The inode number for ``\fB.\fP'' +must reference itself; +e.g., it must equal the inode number +for the directory data block. +The directory inode number entry +for ``\fB..\fP'' must be +the second entry in the directory data block. +Its value must equal the inode number for the +parent of the directory entry +(or the inode number of the directory +data block if the directory is the +root directory). +If the directory inode numbers are +incorrect, +.I fsck_ffs +will replace them with the correct values. +If there are multiple hard links to a directory, +the first one encountered is considered the real parent +to which ``\fB..\fP'' should point; +\fIfsck_ffs\fP recommends deletion for the subsequently discovered names. +.NH 2 +File system connectivity +.PP +.I Fsck_ffs +checks the general connectivity of the file system. +If directories are not linked into the file system, then +.I fsck_ffs +links the directory back into the file system in the +.I lost+found +directory. +This condition only occurs when there has been a hardware failure. +.ds RH "References" +.SH +\s+2Acknowledgements\s0 +.PP +I thank Bill Joy, Sam Leffler, Robert Elz and Dennis Ritchie +for their suggestions and help in implementing the new file system. +Thanks also to Robert Henry for his editorial input to +get this document together. +Finally we thank our sponsors, +the National Science Foundation under grant MCS80-05144, +and the Defense Advance Research Projects Agency (DoD) under +Arpa Order No. 4031 monitored by Naval Electronic System Command under +Contract No. N00039-82-C-0235. (Kirk McKusick, July 1983) +.PP +I would like to thank Larry A. Wehr for advice that lead +to the first version of +.I fsck_ffs +and Rick B. Brandt for adapting +.I fsck_ffs +to +UNIX/TS. (T. Kowalski, July 1979) +.sp 2 +.SH +\s+2References\s0 +.LP +.IP [Dolotta78] 20 +Dolotta, T. A., and Olsson, S. B. eds., +.I "UNIX User's Manual, Edition 1.1\^" , +January 1978. +.IP [Joy83] 20 +Joy, W., Cooper, E., Fabry, R., Leffler, S., McKusick, M., and Mosher, D. +4.2BSD System Manual, +.I "University of California at Berkeley" , +.I "Computer Systems Research Group Technical Report" +#4, 1982. +.IP [McKusick84] 20 +McKusick, M., Joy, W., Leffler, S., and Fabry, R. +A Fast File System for UNIX, +\fIACM Transactions on Computer Systems 2\fP, 3. +pp. 181-197, August 1984. +.IP [Ritchie78] 20 +Ritchie, D. M., and Thompson, K., +The UNIX Time-Sharing System, +.I "The Bell System Technical Journal" +.B 57 , +6 (July-August 1978, Part 2), pp. 1905-29. +.IP [Thompson78] 20 +Thompson, K., +UNIX Implementation, +.I "The Bell System Technical Journal\^" +.B 57 , +6 (July-August 1978, Part 2), pp. 1931-46. +.ds RH Appendix A \- Fsck_ffs Error Conditions +.bp diff --git a/share/doc/smm/03.fsck/4.t b/share/doc/smm/03.fsck/4.t new file mode 100644 index 0000000..353fab3 --- /dev/null +++ b/share/doc/smm/03.fsck/4.t @@ -0,0 +1,1421 @@ +.\" Copyright (c) 1982, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" @(#)4.t 8.1 (Berkeley) 6/5/93 +.\" +.ds RH Appendix A \- Fsck_ffs Error Conditions +.NH +Appendix A \- Fsck_ffs Error Conditions +.NH 2 +Conventions +.PP +.I Fsck_ffs +is +a multi-pass file system check program. +Each file system pass invokes a different Phase of the +.I fsck_ffs +program. +After the initial setup, +.I fsck_ffs +performs successive Phases over each file system, +checking blocks and sizes, +path-names, +connectivity, +reference counts, +and the map of free blocks, +(possibly rebuilding it), +and performs some cleanup. +.LP +Normally +.I fsck_ffs +is run non-interactively to +.I preen +the file systems after an unclean halt. +While preen'ing a file system, +it will only fix corruptions that are expected +to occur from an unclean halt. +These actions are a proper subset of the actions that +.I fsck_ffs +will take when it is running interactively. +Throughout this appendix many errors have several options +that the operator can take. +When an inconsistency is detected, +.I fsck_ffs +reports the error condition to the operator. +If a response is required, +.I fsck_ffs +prints a prompt message and +waits for a response. +When preen'ing most errors are fatal. +For those that are expected, +the response taken is noted. +This appendix explains the meaning of each error condition, +the possible responses, and the related error conditions. +.LP +The error conditions are organized by the +.I Phase +of the +.I fsck_ffs +program in which they can occur. +The error conditions that may occur +in more than one Phase +will be discussed in initialization. +.NH 2 +Initialization +.PP +Before a file system check can be performed, certain +tables have to be set up and certain files opened. +This section concerns itself with the opening of files and +the initialization of tables. +This section lists error conditions resulting from +command line options, +memory requests, +opening of files, +status of files, +file system size checks, +and creation of the scratch file. +All the initialization errors are fatal +when the file system is being preen'ed. +.sp +.LP +.B "\fIC\fP option?" +.br +\fIC\fP is not a legal option to +.I fsck_ffs ; +legal options are \-b, \-c, \-y, \-n, and \-p. +.I Fsck_ffs +terminates on this error condition. +See the +.I fsck_ffs (8) +manual entry for further detail. +.sp +.LP +.B "cannot alloc NNN bytes for blockmap" +.br +.B "cannot alloc NNN bytes for freemap" +.br +.B "cannot alloc NNN bytes for statemap" +.br +.B "cannot alloc NNN bytes for lncntp" +.br +.I Fsck_ffs 's +request for memory for its virtual +memory tables failed. +This should never happen. +.I Fsck_ffs +terminates on this error condition. +See a guru. +.sp +.LP +.B "Can't open checklist file: \fIF\fP" +.br +The file system checklist file +\fIF\fP (usually +.I /etc/fstab ) +can not be opened for reading. +.I Fsck_ffs +terminates on this error condition. +Check access modes of \fIF\fP. +.sp +.LP +.B "Can't stat root" +.br +.I Fsck_ffs 's +request for statistics about the root directory ``/'' failed. +This should never happen. +.I Fsck_ffs +terminates on this error condition. +See a guru. +.sp +.LP +.B "Can't stat \fIF\fP" +.br +.B "Can't make sense out of name \fIF\fP" +.br +.I Fsck_ffs 's +request for statistics about the file system \fIF\fP failed. +When running manually, +it ignores this file system +and continues checking the next file system given. +Check access modes of \fIF\fP. +.sp +.LP +.B "Can't open \fIF\fP" +.br +.I Fsck_ffs 's +request attempt to open the file system \fIF\fP failed. +When running manually, it ignores this file system +and continues checking the next file system given. +Check access modes of \fIF\fP. +.sp +.LP +.B "\fIF\fP: (NO WRITE)" +.br +Either the \-n flag was specified or +.I fsck_ffs 's +attempt to open the file system \fIF\fP for writing failed. +When running manually, +all the diagnostics are printed out, +but no modifications are attempted to fix them. +.sp +.LP +.B "file is not a block or character device; OK" +.br +You have given +.I fsck_ffs +a regular file name by mistake. +Check the type of the file specified. +.LP +Possible responses to the OK prompt are: +.IP YES +ignore this error condition. +.IP NO +ignore this file system and continues checking +the next file system given. +.sp +.LP +.B "UNDEFINED OPTIMIZATION IN SUPERBLOCK (SET TO DEFAULT)" +.br +The superblock optimization parameter is neither OPT_TIME +nor OPT_SPACE. +.LP +Possible responses to the SET TO DEFAULT prompt are: +.IP YES +The superblock is set to request optimization to minimize +running time of the system. +(If optimization to minimize disk space utilization is +desired, it can be set using \fItunefs\fP(8).) +.IP NO +ignore this error condition. +.sp +.LP +.B "IMPOSSIBLE MINFREE=\fID\fP IN SUPERBLOCK (SET TO DEFAULT)" +.br +The superblock minimum space percentage is greater than 99% +or less then 0%. +.LP +Possible responses to the SET TO DEFAULT prompt are: +.IP YES +The minfree parameter is set to 10%. +(If some other percentage is desired, +it can be set using \fItunefs\fP(8).) +.IP NO +ignore this error condition. +.sp +.LP +.B "IMPOSSIBLE INTERLEAVE=\fID\fP IN SUPERBLOCK (SET TO DEFAULT)" +.br +The file system interleave is less than or equal to zero. +.LP +Possible responses to the SET TO DEFAULT prompt are: +.IP YES +The interleave parameter is set to 1. +.IP NO +ignore this error condition. +.sp +.LP +.B "IMPOSSIBLE NPSECT=\fID\fP IN SUPERBLOCK (SET TO DEFAULT)" +.br +The number of physical sectors per track is less than the number +of usable sectors per track. +.LP +Possible responses to the SET TO DEFAULT prompt are: +.IP YES +The npsect parameter is set to the number of usable sectors per track. +.IP NO +ignore this error condition. +.sp +.LP +One of the following messages will appear: +.br +.B "MAGIC NUMBER WRONG" +.br +.B "NCG OUT OF RANGE" +.br +.B "CPG OUT OF RANGE" +.br +.B "NCYL DOES NOT JIVE WITH NCG*CPG" +.br +.B "SIZE PREPOSTEROUSLY LARGE" +.br +.B "TRASHED VALUES IN SUPER BLOCK" +.br +and will be followed by the message: +.br +.B "\fIF\fP: BAD SUPER BLOCK: \fIB\fP" +.br +.B "USE -b OPTION TO FSCK_FFS TO SPECIFY LOCATION OF AN ALTERNATE" +.br +.B "SUPER-BLOCK TO SUPPLY NEEDED INFORMATION; SEE fsck_ffs(8)." +.br +The super block has been corrupted. +An alternative super block must be selected from among those +listed by +.I newfs +(8) when the file system was created. +For file systems with a blocksize less than 32K, +specifying \-b 32 is a good first choice. +.sp +.LP +.B "INTERNAL INCONSISTENCY: \fIM\fP" +.br +.I Fsck_ffs 's +has had an internal panic, whose message is specified as \fIM\fP. +This should never happen. +See a guru. +.sp +.LP +.B "CAN NOT SEEK: BLK \fIB\fP (CONTINUE)" +.br +.I Fsck_ffs 's +request for moving to a specified block number \fIB\fP in +the file system failed. +This should never happen. +See a guru. +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +attempt to continue to run the file system check. +Often, +however the problem will persist. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +If the block was part of the virtual memory buffer +cache, +.I fsck_ffs +will terminate with the message ``Fatal I/O error''. +.IP NO +terminate the program. +.sp +.LP +.B "CAN NOT READ: BLK \fIB\fP (CONTINUE)" +.br +.I Fsck_ffs 's +request for reading a specified block number \fIB\fP in +the file system failed. +This should never happen. +See a guru. +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +attempt to continue to run the file system check. +It will retry the read and print out the message: +.br +.B "THE FOLLOWING SECTORS COULD NOT BE READ: \fIN\fP" +.br +where \fIN\fP indicates the sectors that could not be read. +If +.I fsck_ffs +ever tries to write back one of the blocks on which the read failed +it will print the message: +.br +.B "WRITING ZERO'ED BLOCK \fIN\fP TO DISK" +.br +where \fIN\fP indicates the sector that was written with zero's. +If the disk is experiencing hardware problems, the problem will persist. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +If the block was part of the virtual memory buffer +cache, +.I fsck_ffs +will terminate with the message ``Fatal I/O error''. +.IP NO +terminate the program. +.sp +.LP +.B "CAN NOT WRITE: BLK \fIB\fP (CONTINUE)" +.br +.I Fsck_ffs 's +request for writing a specified block number \fIB\fP +in the file system failed. +The disk is write-protected; +check the write protect lock on the drive. +If that is not the problem, see a guru. +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +attempt to continue to run the file system check. +The write operation will be retried with the failed blocks +indicated by the message: +.br +.B "THE FOLLOWING SECTORS COULD NOT BE WRITTEN: \fIN\fP" +.br +where \fIN\fP indicates the sectors that could not be written. +If the disk is experiencing hardware problems, the problem will persist. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +If the block was part of the virtual memory buffer +cache, +.I fsck_ffs +will terminate with the message ``Fatal I/O error''. +.IP NO +terminate the program. +.sp +.LP +.B "bad inode number DDD to ginode" +.br +An internal error has attempted to read non-existent inode \fIDDD\fP. +This error causes +.I fsck_ffs +to exit. +See a guru. +.NH 2 +Phase 1 \- Check Blocks and Sizes +.PP +This phase concerns itself with +the inode list. +This section lists error conditions resulting from +checking inode types, +setting up the zero-link-count table, +examining inode block numbers for bad or duplicate blocks, +checking inode size, +and checking inode format. +All errors in this phase except +.B "INCORRECT BLOCK COUNT" +and +.B "PARTIALLY TRUNCATED INODE" +are fatal if the file system is being preen'ed. +.sp +.LP +.B "UNKNOWN FILE TYPE I=\fII\fP (CLEAR)" +.br +The mode word of the inode \fII\fP indicates that the inode is not a +special block inode, special character inode, socket inode, regular inode, +symbolic link, or directory inode. +.LP +Possible responses to the CLEAR prompt are: +.IP YES +de-allocate inode \fII\fP by zeroing its contents. +This will always invoke the UNALLOCATED error condition in Phase 2 +for each directory entry pointing to this inode. +.IP NO +ignore this error condition. +.sp +.LP +.B "PARTIALLY TRUNCATED INODE I=\fII\fP (SALVAGE)" +.br +.I Fsck_ffs +has found inode \fII\fP whose size is shorter than the number of +blocks allocated to it. +This condition should only occur if the system crashes while in the +midst of truncating a file. +When preen'ing the file system, +.I fsck_ffs +completes the truncation to the specified size. +.LP +Possible responses to SALVAGE are: +.IP YES +complete the truncation to the size specified in the inode. +.IP NO +ignore this error condition. +.sp +.LP +.B "LINK COUNT TABLE OVERFLOW (CONTINUE)" +.br +An internal table for +.I fsck_ffs +containing allocated inodes with a link count of +zero cannot allocate more memory. +Increase the virtual memory for +.I fsck_ffs . +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +continue with the program. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +If another allocated inode with a zero link count is found, +this error condition is repeated. +.IP NO +terminate the program. +.sp +.LP +.B "\fIB\fP BAD I=\fII\fP" +.br +Inode \fII\fP contains block number \fIB\fP with a number +lower than the number of the first data block in the file system or +greater than the number of the last block +in the file system. +This error condition may invoke the +.B "EXCESSIVE BAD BLKS" +error condition in Phase 1 (see next paragraph) if +inode \fII\fP has too many block numbers outside the file system range. +This error condition will always invoke the +.B "BAD/DUP" +error condition in Phase 2 and Phase 4. +.sp +.LP +.B "EXCESSIVE BAD BLKS I=\fII\fP (CONTINUE)" +.br +There is more than a tolerable number (usually 10) of blocks with a number +lower than the number of the first data block in the file system or greater than +the number of last block in the file system associated with inode \fII\fP. +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +ignore the rest of the blocks in this inode +and continue checking with the next inode in the file system. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +.IP NO +terminate the program. +.sp +.LP +.B "BAD STATE DDD TO BLKERR" +.br +An internal error has scrambled +.I fsck_ffs 's +state map to have the impossible value \fIDDD\fP. +.I Fsck_ffs +exits immediately. +See a guru. +.sp +.LP +.B "\fIB\fP DUP I=\fII\fP" +.br +Inode \fII\fP contains block number \fIB\fP that is already claimed by +another inode. +This error condition may invoke the +.B "EXCESSIVE DUP BLKS" +error condition in Phase 1 if +inode \fII\fP has too many block numbers claimed by other inodes. +This error condition will always invoke Phase 1b and the +.B "BAD/DUP" +error condition in Phase 2 and Phase 4. +.sp +.LP +.B "EXCESSIVE DUP BLKS I=\fII\fP (CONTINUE)" +.br +There is more than a tolerable number (usually 10) of blocks claimed by other +inodes. +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +ignore the rest of the blocks in this inode +and continue checking with the next inode in the file system. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +.IP NO +terminate the program. +.sp +.LP +.B "DUP TABLE OVERFLOW (CONTINUE)" +.br +An internal table in +.I fsck_ffs +containing duplicate block numbers cannot allocate any more space. +Increase the amount of virtual memory available to +.I fsck_ffs . +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +continue with the program. +This error condition will not allow a complete check of the file system. +A second run of +.I fsck_ffs +should be made to re-check this file system. +If another duplicate block is found, this error condition will repeat. +.IP NO +terminate the program. +.sp +.LP +.B "PARTIALLY ALLOCATED INODE I=\fII\fP (CLEAR)" +.br +Inode \fII\fP is neither allocated nor unallocated. +.LP +Possible responses to the CLEAR prompt are: +.IP YES +de-allocate inode \fII\fP by zeroing its contents. +.IP NO +ignore this error condition. +.sp +.LP +.B "INCORRECT BLOCK COUNT I=\fII\fP (\fIX\fP should be \fIY\fP) (CORRECT)" +.br +The block count for inode \fII\fP is \fIX\fP blocks, +but should be \fIY\fP blocks. +When preen'ing the count is corrected. +.LP +Possible responses to the CORRECT prompt are: +.IP YES +replace the block count of inode \fII\fP with \fIY\fP. +.IP NO +ignore this error condition. +.NH 2 +Phase 1B: Rescan for More Dups +.PP +When a duplicate block is found in the file system, the file system is +rescanned to find the inode that previously claimed that block. +This section lists the error condition when the duplicate block is found. +.sp +.LP +.B "\fIB\fP DUP I=\fII\fP" +.br +Inode \fII\fP contains block number \fIB\fP that +is already claimed by another inode. +This error condition will always invoke the +.B "BAD/DUP" +error condition in Phase 2. +You can determine which inodes have overlapping blocks by examining +this error condition and the DUP error condition in Phase 1. +.NH 2 +Phase 2 \- Check Pathnames +.PP +This phase concerns itself with removing directory entries +pointing to +error conditioned inodes +from Phase 1 and Phase 1b. +This section lists error conditions resulting from +root inode mode and status, +directory inode pointers in range, +and directory entries pointing to bad inodes, +and directory integrity checks. +All errors in this phase are fatal if the file system is being preen'ed, +except for directories not being a multiple of the blocks size +and extraneous hard links. +.sp +.LP +.B "ROOT INODE UNALLOCATED (ALLOCATE)" +.br +The root inode (usually inode number 2) has no allocate mode bits. +This should never happen. +.LP +Possible responses to the ALLOCATE prompt are: +.IP YES +allocate inode 2 as the root inode. +The files and directories usually found in the root will be recovered +in Phase 3 and put into +.I lost+found . +If the attempt to allocate the root fails, +.I fsck_ffs +will exit with the message: +.br +.B "CANNOT ALLOCATE ROOT INODE" . +.IP NO +.I fsck_ffs +will exit. +.sp +.LP +.B "ROOT INODE NOT DIRECTORY (REALLOCATE)" +.br +The root inode (usually inode number 2) +is not directory inode type. +.LP +Possible responses to the REALLOCATE prompt are: +.IP YES +clear the existing contents of the root inode +and reallocate it. +The files and directories usually found in the root will be recovered +in Phase 3 and put into +.I lost+found . +If the attempt to allocate the root fails, +.I fsck_ffs +will exit with the message: +.br +.B "CANNOT ALLOCATE ROOT INODE" . +.IP NO +.I fsck_ffs +will then prompt with +.B "FIX" +.LP +Possible responses to the FIX prompt are: +.IP YES +replace the root inode's type to be a directory. +If the root inode's data blocks are not directory blocks, +many error conditions will be produced. +.IP NO +terminate the program. +.sp +.LP +.B "DUPS/BAD IN ROOT INODE (REALLOCATE)" +.br +Phase 1 or Phase 1b have found duplicate blocks +or bad blocks in the root inode (usually inode number 2) for the file system. +.LP +Possible responses to the REALLOCATE prompt are: +.IP YES +clear the existing contents of the root inode +and reallocate it. +The files and directories usually found in the root will be recovered +in Phase 3 and put into +.I lost+found . +If the attempt to allocate the root fails, +.I fsck_ffs +will exit with the message: +.br +.B "CANNOT ALLOCATE ROOT INODE" . +.IP NO +.I fsck_ffs +will then prompt with +.B "CONTINUE" . +.LP +Possible responses to the CONTINUE prompt are: +.IP YES +ignore the +.B "DUPS/BAD" +error condition in the root inode and +attempt to continue to run the file system check. +If the root inode is not correct, +then this may result in many other error conditions. +.IP NO +terminate the program. +.sp +.LP +.B "NAME TOO LONG \fIF\fP" +.br +An excessively long path name has been found. +This usually indicates loops in the file system name space. +This can occur if the super user has made circular links to directories. +The offending links must be removed (by a guru). +.sp +.LP +.B "I OUT OF RANGE I=\fII\fP NAME=\fIF\fP (REMOVE)" +.br +A directory entry \fIF\fP has an inode number \fII\fP that is greater than +the end of the inode list. +.LP +Possible responses to the REMOVE prompt are: +.IP YES +the directory entry \fIF\fP is removed. +.IP NO +ignore this error condition. +.sp +.LP +.B "UNALLOCATED I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP \fItype\fP=\fIF\fP (REMOVE)" +.br +A directory or file entry \fIF\fP points to an unallocated inode \fII\fP. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, +and name \fIF\fP are printed. +.LP +Possible responses to the REMOVE prompt are: +.IP YES +the directory entry \fIF\fP is removed. +.IP NO +ignore this error condition. +.sp +.LP +.B "DUP/BAD I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP \fItype\fP=\fIF\fP (REMOVE)" +.br +Phase 1 or Phase 1b have found duplicate blocks or bad blocks +associated with directory or file entry \fIF\fP, inode \fII\fP. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, +and directory name \fIF\fP are printed. +.LP +Possible responses to the REMOVE prompt are: +.IP YES +the directory entry \fIF\fP is removed. +.IP NO +ignore this error condition. +.sp +.LP +.B "ZERO LENGTH DIRECTORY I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (REMOVE)" +.br +A directory entry \fIF\fP has a size \fIS\fP that is zero. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, +and directory name \fIF\fP are printed. +.LP +Possible responses to the REMOVE prompt are: +.IP YES +the directory entry \fIF\fP is removed; +this will always invoke the BAD/DUP error condition in Phase 4. +.IP NO +ignore this error condition. +.sp +.LP +.B "DIRECTORY TOO SHORT I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fIF\fP has been found whose size \fIS\fP +is less than the minimum size directory. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, modify time \fIT\fP, +and directory name \fIF\fP are printed. +.LP +Possible responses to the FIX prompt are: +.IP YES +increase the size of the directory to the minimum directory size. +.IP NO +ignore this directory. +.sp +.LP +.B "DIRECTORY \fIF\fP LENGTH \fIS\fP NOT MULTIPLE OF \fIB\fP (ADJUST) +.br +A directory \fIF\fP has been found with size \fIS\fP that is not +a multiple of the directory blocksize \fIB\fP. +.LP +Possible responses to the ADJUST prompt are: +.IP YES +the length is rounded up to the appropriate block size. +This error can occur on 4.2BSD file systems. +Thus when preen'ing the file system only a warning is printed +and the directory is adjusted. +.IP NO +ignore the error condition. +.sp +.LP +.B "DIRECTORY CORRUPTED I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (SALVAGE)" +.br +A directory with an inconsistent internal state has been found. +.LP +Possible responses to the FIX prompt are: +.IP YES +throw away all entries up to the next directory boundary (usually 512-byte) +boundary. +This drastic action can throw away up to 42 entries, +and should be taken only after other recovery efforts have failed. +.IP NO +skip up to the next directory boundary and resume reading, +but do not modify the directory. +.sp +.LP +.B "BAD INODE NUMBER FOR `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fII\fP has been found whose inode number for `.' does +does not equal \fII\fP. +.LP +Possible responses to the FIX prompt are: +.IP YES +change the inode number for `.' to be equal to \fII\fP. +.IP NO +leave the inode number for `.' unchanged. +.sp +.LP +.B "MISSING `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fII\fP has been found whose first entry is unallocated. +.LP +Possible responses to the FIX prompt are: +.IP YES +build an entry for `.' with inode number equal to \fII\fP. +.IP NO +leave the directory unchanged. +.sp +.LP +.B "MISSING `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" +.br +.B "CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS \fIF\fP" +.br +A directory \fII\fP has been found whose first entry is \fIF\fP. +.I Fsck_ffs +cannot resolve this problem. +The file system should be mounted and the offending entry \fIF\fP +moved elsewhere. +The file system should then be unmounted and +.I fsck_ffs +should be run again. +.sp +.LP +.B "MISSING `.' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" +.br +.B "CANNOT FIX, INSUFFICIENT SPACE TO ADD `.'" +.br +A directory \fII\fP has been found whose first entry is not `.'. +.I Fsck_ffs +cannot resolve this problem as it should never happen. +See a guru. +.sp +.LP +.B "EXTRA `.' ENTRY I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fII\fP has been found that has more than one entry for `.'. +.LP +Possible responses to the FIX prompt are: +.IP YES +remove the extra entry for `.'. +.IP NO +leave the directory unchanged. +.sp +.LP +.B "BAD INODE NUMBER FOR `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fII\fP has been found whose inode number for `..' does +does not equal the parent of \fII\fP. +.LP +Possible responses to the FIX prompt are: +.IP YES +change the inode number for `..' to be equal to the parent of \fII\fP +(``\fB..\fP'' in the root inode points to itself). +.IP NO +leave the inode number for `..' unchanged. +.sp +.LP +.B "MISSING `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fII\fP has been found whose second entry is unallocated. +.LP +Possible responses to the FIX prompt are: +.IP YES +build an entry for `..' with inode number equal to the parent of \fII\fP +(``\fB..\fP'' in the root inode points to itself). +.IP NO +leave the directory unchanged. +.sp +.LP +.B "MISSING `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" +.br +.B "CANNOT FIX, SECOND ENTRY IN DIRECTORY CONTAINS \fIF\fP" +.br +A directory \fII\fP has been found whose second entry is \fIF\fP. +.I Fsck_ffs +cannot resolve this problem. +The file system should be mounted and the offending entry \fIF\fP +moved elsewhere. +The file system should then be unmounted and +.I fsck_ffs +should be run again. +.sp +.LP +.B "MISSING `..' I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP" +.br +.B "CANNOT FIX, INSUFFICIENT SPACE TO ADD `..'" +.br +A directory \fII\fP has been found whose second entry is not `..'. +.I Fsck_ffs +cannot resolve this problem. +The file system should be mounted and the second entry in the directory +moved elsewhere. +The file system should then be unmounted and +.I fsck_ffs +should be run again. +.sp +.LP +.B "EXTRA `..' ENTRY I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP DIR=\fIF\fP (FIX)" +.br +A directory \fII\fP has been found that has more than one entry for `..'. +.LP +Possible responses to the FIX prompt are: +.IP YES +remove the extra entry for `..'. +.IP NO +leave the directory unchanged. +.sp +.LP +.B "\fIN\fP IS AN EXTRANEOUS HARD LINK TO A DIRECTORY \fID\fP (REMOVE) +.br +.I Fsck_ffs +has found a hard link, \fIN\fP, to a directory, \fID\fP. +When preen'ing the extraneous links are ignored. +.LP +Possible responses to the REMOVE prompt are: +.IP YES +delete the extraneous entry, \fIN\fP. +.IP NO +ignore the error condition. +.sp +.LP +.B "BAD INODE \fIS\fP TO DESCEND" +.br +An internal error has caused an impossible state \fIS\fP to be passed to the +routine that descends the file system directory structure. +.I Fsck_ffs +exits. +See a guru. +.sp +.LP +.B "BAD RETURN STATE \fIS\fP FROM DESCEND" +.br +An internal error has caused an impossible state \fIS\fP to be returned +from the routine that descends the file system directory structure. +.I Fsck_ffs +exits. +See a guru. +.sp +.LP +.B "BAD STATE \fIS\fP FOR ROOT INODE" +.br +An internal error has caused an impossible state \fIS\fP to be assigned +to the root inode. +.I Fsck_ffs +exits. +See a guru. +.NH 2 +Phase 3 \- Check Connectivity +.PP +This phase concerns itself with the directory connectivity seen in +Phase 2. +This section lists error conditions resulting from +unreferenced directories, +and missing or full +.I lost+found +directories. +.sp +.LP +.B "UNREF DIR I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (RECONNECT)" +.br +The directory inode \fII\fP was not connected to a directory entry +when the file system was traversed. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, and +modify time \fIT\fP of directory inode \fII\fP are printed. +When preen'ing, the directory is reconnected if its size is non-zero, +otherwise it is cleared. +.LP +Possible responses to the RECONNECT prompt are: +.IP YES +reconnect directory inode \fII\fP to the file system in the +directory for lost files (usually \fIlost+found\fP). +This may invoke the +.I lost+found +error condition in Phase 3 +if there are problems connecting directory inode \fII\fP to \fIlost+found\fP. +This may also invoke the CONNECTED error condition in Phase 3 if the link +was successful. +.IP NO +ignore this error condition. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "NO lost+found DIRECTORY (CREATE)" +.br +There is no +.I lost+found +directory in the root directory of the file system; +When preen'ing +.I fsck_ffs +tries to create a \fIlost+found\fP directory. +.LP +Possible responses to the CREATE prompt are: +.IP YES +create a \fIlost+found\fP directory in the root of the file system. +This may raise the message: +.br +.B "NO SPACE LEFT IN / (EXPAND)" +.br +See below for the possible responses. +Inability to create a \fIlost+found\fP directory generates the message: +.br +.B "SORRY. CANNOT CREATE lost+found DIRECTORY" +.br +and aborts the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.IP NO +abort the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "lost+found IS NOT A DIRECTORY (REALLOCATE)" +.br +The entry for +.I lost+found +is not a directory. +.LP +Possible responses to the REALLOCATE prompt are: +.IP YES +allocate a directory inode, and change \fIlost+found\fP to reference it. +The previous inode reference by the \fIlost+found\fP name is not cleared. +Thus it will either be reclaimed as an UNREF'ed inode or have its +link count ADJUST'ed later in this Phase. +Inability to create a \fIlost+found\fP directory generates the message: +.br +.B "SORRY. CANNOT CREATE lost+found DIRECTORY" +.br +and aborts the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.IP NO +abort the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "NO SPACE LEFT IN /lost+found (EXPAND)" +.br +There is no space to add another entry to the +.I lost+found +directory in the root directory +of the file system. +When preen'ing the +.I lost+found +directory is expanded. +.LP +Possible responses to the EXPAND prompt are: +.IP YES +the +.I lost+found +directory is expanded to make room for the new entry. +If the attempted expansion fails +.I fsck_ffs +prints the message: +.br +.B "SORRY. NO SPACE IN lost+found DIRECTORY" +.br +and aborts the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +Clean out unnecessary entries in +.I lost+found . +This error is fatal if the file system is being preen'ed. +.IP NO +abort the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "DIR I=\fII1\fP CONNECTED. PARENT WAS I=\fII2\fP" +.br +This is an advisory message indicating a directory inode \fII1\fP was +successfully connected to the +.I lost+found +directory. +The parent inode \fII2\fP of the directory inode \fII1\fP is +replaced by the inode number of the +.I lost+found +directory. +.sp +.LP +.B "DIRECTORY \fIF\fP LENGTH \fIS\fP NOT MULTIPLE OF \fIB\fP (ADJUST) +.br +A directory \fIF\fP has been found with size \fIS\fP that is not +a multiple of the directory blocksize \fIB\fP +(this can reoccur in Phase 3 if it is not adjusted in Phase 2). +.LP +Possible responses to the ADJUST prompt are: +.IP YES +the length is rounded up to the appropriate block size. +This error can occur on 4.2BSD file systems. +Thus when preen'ing the file system only a warning is printed +and the directory is adjusted. +.IP NO +ignore the error condition. +.sp +.LP +.B "BAD INODE \fIS\fP TO DESCEND" +.br +An internal error has caused an impossible state \fIS\fP to be passed to the +routine that descends the file system directory structure. +.I Fsck_ffs +exits. +See a guru. +.NH 2 +Phase 4 \- Check Reference Counts +.PP +This phase concerns itself with the link count information +seen in Phase 2 and Phase 3. +This section lists error conditions resulting from +unreferenced files, +missing or full +.I lost+found +directory, +incorrect link counts for files, directories, symbolic links, or special files, +unreferenced files, symbolic links, and directories, +and bad or duplicate blocks in files, symbolic links, and directories. +All errors in this phase are correctable if the file system is being preen'ed +except running out of space in the \fIlost+found\fP directory. +.sp +.LP +.B "UNREF FILE I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (RECONNECT)" +.br +Inode \fII\fP was not connected to a directory entry +when the file system was traversed. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, and +modify time \fIT\fP of inode \fII\fP are printed. +When preen'ing the file is cleared if either its size or its +link count is zero, +otherwise it is reconnected. +.LP +Possible responses to the RECONNECT prompt are: +.IP YES +reconnect inode \fII\fP to the file system in the directory for +lost files (usually \fIlost+found\fP). +This may invoke the +.I lost+found +error condition in Phase 4 +if there are problems connecting inode \fII\fP to +.I lost+found . +.IP NO +ignore this error condition. +This will always invoke the CLEAR error condition in Phase 4. +.sp +.LP +.B "(CLEAR)" +.br +The inode mentioned in the immediately previous error condition can not be +reconnected. +This cannot occur if the file system is being preen'ed, +since lack of space to reconnect files is a fatal error. +.LP +Possible responses to the CLEAR prompt are: +.IP YES +de-allocate the inode mentioned in the immediately previous error condition by zeroing its contents. +.IP NO +ignore this error condition. +.sp +.LP +.B "NO lost+found DIRECTORY (CREATE)" +.br +There is no +.I lost+found +directory in the root directory of the file system; +When preen'ing +.I fsck_ffs +tries to create a \fIlost+found\fP directory. +.LP +Possible responses to the CREATE prompt are: +.IP YES +create a \fIlost+found\fP directory in the root of the file system. +This may raise the message: +.br +.B "NO SPACE LEFT IN / (EXPAND)" +.br +See below for the possible responses. +Inability to create a \fIlost+found\fP directory generates the message: +.br +.B "SORRY. CANNOT CREATE lost+found DIRECTORY" +.br +and aborts the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.IP NO +abort the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "lost+found IS NOT A DIRECTORY (REALLOCATE)" +.br +The entry for +.I lost+found +is not a directory. +.LP +Possible responses to the REALLOCATE prompt are: +.IP YES +allocate a directory inode, and change \fIlost+found\fP to reference it. +The previous inode reference by the \fIlost+found\fP name is not cleared. +Thus it will either be reclaimed as an UNREF'ed inode or have its +link count ADJUST'ed later in this Phase. +Inability to create a \fIlost+found\fP directory generates the message: +.br +.B "SORRY. CANNOT CREATE lost+found DIRECTORY" +.br +and aborts the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.IP NO +abort the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "NO SPACE LEFT IN /lost+found (EXPAND)" +.br +There is no space to add another entry to the +.I lost+found +directory in the root directory +of the file system. +When preen'ing the +.I lost+found +directory is expanded. +.LP +Possible responses to the EXPAND prompt are: +.IP YES +the +.I lost+found +directory is expanded to make room for the new entry. +If the attempted expansion fails +.I fsck_ffs +prints the message: +.br +.B "SORRY. NO SPACE IN lost+found DIRECTORY" +.br +and aborts the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +Clean out unnecessary entries in +.I lost+found . +This error is fatal if the file system is being preen'ed. +.IP NO +abort the attempt to linkup the lost inode. +This will always invoke the UNREF error condition in Phase 4. +.sp +.LP +.B "LINK COUNT \fItype\fP I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP COUNT=\fIX\fP SHOULD BE \fIY\fP (ADJUST)" +.br +The link count for inode \fII\fP, +is \fIX\fP but should be \fIY\fP. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, and modify time \fIT\fP +are printed. +When preen'ing the link count is adjusted unless the number of references +is increasing, a condition that should never occur unless precipitated +by a hardware failure. +When the number of references is increasing under preen mode, +.I fsck_ffs +exits with the message: +.br +.B "LINK COUNT INCREASING" +.LP +Possible responses to the ADJUST prompt are: +.IP YES +replace the link count of file inode \fII\fP with \fIY\fP. +.IP NO +ignore this error condition. +.sp +.LP +.B "UNREF \fItype\fP I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (CLEAR)" +.br +Inode \fII\fP, was not connected to a directory entry when the +file system was traversed. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, +and modify time \fIT\fP of inode \fII\fP +are printed. +When preen'ing, +this is a file that was not connected because its size or link count was zero, +hence it is cleared. +.LP +Possible responses to the CLEAR prompt are: +.IP YES +de-allocate inode \fII\fP by zeroing its contents. +.IP NO +ignore this error condition. +.sp +.LP +.B "BAD/DUP \fItype\fP I=\fII\fP OWNER=\fIO\fP MODE=\fIM\fP SIZE=\fIS\fP MTIME=\fIT\fP (CLEAR)" +.br +Phase 1 or Phase 1b have found duplicate blocks +or bad blocks associated with +inode \fII\fP. +The owner \fIO\fP, mode \fIM\fP, size \fIS\fP, +and modify time \fIT\fP of inode \fII\fP +are printed. +This error cannot arise when the file system is being preen'ed, +as it would have caused a fatal error earlier. +.LP +Possible responses to the CLEAR prompt are: +.IP YES +de-allocate inode \fII\fP by zeroing its contents. +.IP NO +ignore this error condition. +.NH 2 +Phase 5 - Check Cyl groups +.PP +This phase concerns itself with the free-block and used-inode maps. +This section lists error conditions resulting from +allocated blocks in the free-block maps, +free blocks missing from free-block maps, +and the total free-block count incorrect. +It also lists error conditions resulting from +free inodes in the used-inode maps, +allocated inodes missing from used-inode maps, +and the total used-inode count incorrect. +.sp +.LP +.B "CG \fIC\fP: BAD MAGIC NUMBER" +.br +The magic number of cylinder group \fIC\fP is wrong. +This usually indicates that the cylinder group maps have been destroyed. +When running manually the cylinder group is marked as needing +to be reconstructed. +This error is fatal if the file system is being preen'ed. +.sp +.LP +.B "BLK(S) MISSING IN BIT MAPS (SALVAGE)" +.br +A cylinder group block map is missing some free blocks. +During preen'ing the maps are reconstructed. +.LP +Possible responses to the SALVAGE prompt are: +.IP YES +reconstruct the free block map. +.IP NO +ignore this error condition. +.sp +.LP +.B "SUMMARY INFORMATION BAD (SALVAGE)" +.br +The summary information was found to be incorrect. +When preen'ing, +the summary information is recomputed. +.LP +Possible responses to the SALVAGE prompt are: +.IP YES +reconstruct the summary information. +.IP NO +ignore this error condition. +.sp +.LP +.B "FREE BLK COUNT(S) WRONG IN SUPERBLOCK (SALVAGE)" +.br +The superblock free block information was found to be incorrect. +When preen'ing, +the superblock free block information is recomputed. +.LP +Possible responses to the SALVAGE prompt are: +.IP YES +reconstruct the superblock free block information. +.IP NO +ignore this error condition. +.NH 2 +Cleanup +.PP +Once a file system has been checked, a few cleanup functions are performed. +This section lists advisory messages about +the file system +and modify status of the file system. +.sp +.LP +.B "\fIV\fP files, \fIW\fP used, \fIX\fP free (\fIY\fP frags, \fIZ\fP blocks)" +.br +This is an advisory message indicating that +the file system checked contained +\fIV\fP files using +\fIW\fP fragment sized blocks leaving +\fIX\fP fragment sized blocks free in the file system. +The numbers in parenthesis breaks the free count down into +\fIY\fP free fragments and +\fIZ\fP free full sized blocks. +.sp +.LP +.B "***** REBOOT UNIX *****" +.br +This is an advisory message indicating that +the root file system has been modified by +.I fsck_ffs. +If UNIX is not rebooted immediately, +the work done by +.I fsck_ffs +may be undone by the in-core copies of tables +UNIX keeps. +When preen'ing, +.I fsck_ffs +will exit with a code of 4. +The standard auto-reboot script distributed with 4.3BSD +interprets an exit code of 4 by issuing a reboot system call. +.sp +.LP +.B "***** FILE SYSTEM WAS MODIFIED *****" +.br +This is an advisory message indicating that +the current file system was modified by +.I fsck_ffs. +If this file system is mounted or is the current root file system, +.I fsck_ffs +should be halted and UNIX rebooted. +If UNIX is not rebooted immediately, +the work done by +.I fsck_ffs +may be undone by the in-core copies of tables +UNIX keeps. diff --git a/share/doc/smm/03.fsck/Makefile b/share/doc/smm/03.fsck/Makefile index fbdc009..88d1ec3 100644 --- a/share/doc/smm/03.fsck/Makefile +++ b/share/doc/smm/03.fsck/Makefile @@ -4,6 +4,5 @@ VOLUME= smm/03.fsck SRCS= 0.t 1.t 2.t 3.t 4.t MACROS= -ms -SRCDIR= ${.CURDIR}/../../../../sbin/fsck_ffs/SMM.doc .include diff --git a/share/doc/smm/07.lpr/0.t b/share/doc/smm/07.lpr/0.t new file mode 100644 index 0000000..65ecd4e --- /dev/null +++ b/share/doc/smm/07.lpr/0.t @@ -0,0 +1,68 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)0.t 8.1 (Berkeley) 6/8/93 +.\" +.if n .ND +.TL +4.3BSD Line Printer Spooler Manual +.EH 'SMM:7-%''4.3BSD Line Printer Spooler Manual' +.OH '4.3BSD Line Printer Spooler Manual''SMM:7-%' +.AU +Ralph Campbell +.AI +Computer Systems Research Group +Computer Science Division +Department of Electrical Engineering and Computer Science +University of California, Berkeley +Berkeley, CA 94720 +.AB +.FS +* UNIX is a trademark of Bell Laboratories. +.FE +This document describes the structure and installation procedure +for the line printer spooling system +developed for the 4.3BSD version +of the UNIX* operating system. +.de D? +.ie \\n(.$>1 Revised \\$1 \\$2 \\$3 +.el DRAFT of \n(mo/\n(dy/\n(yr +.. +.sp 2 +.LP +.D? June 8, 1993 +.AE +.de IR +\fI\\$1\fP\\$2 +.. +.de DT +.TA 8 16 24 32 40 48 56 64 72 80 +.. diff --git a/share/doc/smm/07.lpr/1.t b/share/doc/smm/07.lpr/1.t new file mode 100644 index 0000000..1d34e9e --- /dev/null +++ b/share/doc/smm/07.lpr/1.t @@ -0,0 +1,77 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)1.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Overview +.PP +The line printer system supports: +.IP \(bu 3 +multiple printers, +.IP \(bu 3 +multiple spooling queues, +.IP \(bu 3 +both local and remote +printers, and +.IP \(bu 3 +printers attached via serial lines that require +line initialization such as the baud rate. +.LP +Raster output devices +such as a Varian or Versatec, and laser printers such as an Imagen, +are also supported by the line printer system. +.PP +The line printer system consists mainly of the +following files and commands: +.DS +.TS +l l. +/etc/printcap printer configuration and capability data base +/usr/lib/lpd line printer daemon, does all the real work +/usr/ucb/lpr program to enter a job in a printer queue +/usr/ucb/lpq spooling queue examination program +/usr/ucb/lprm program to delete jobs from a queue +/etc/lpc program to administer printers and spooling queues +/dev/printer socket on which lpd listens +.TE +.DE +The file /etc/printcap is a master data base describing line +printers directly attached to a machine and, also, printers +accessible across a network. The manual page entry +.IR printcap (5) +provides the authoritative definition of +the format of this data base, as well as +specifying default values for important items +such as the directory in which spooling is performed. +This document introduces some of the +information that may be placed +.IR printcap . diff --git a/share/doc/smm/07.lpr/2.t b/share/doc/smm/07.lpr/2.t new file mode 100644 index 0000000..9da2ae2 --- /dev/null +++ b/share/doc/smm/07.lpr/2.t @@ -0,0 +1,141 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)2.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Commands +.NH 2 +lpd \- line printer daemon +.PP +The program +.IR lpd (8), +usually invoked at boot time from the /etc/rc file, acts as +a master server for coordinating and controlling +the spooling queues configured in the printcap file. +When +.I lpd +is started it makes a single pass through the +.I printcap +database restarting any printers that have jobs. +In normal operation +.I lpd +listens for service requests on multiple sockets, +one in the UNIX domain (named ``/dev/printer'') for +local requests, and one in the Internet domain +(under the ``printer'' service specification) +for requests for printer access from off machine; +see \fIsocket\fP\|(2) and \fIservices\fP\|(5) +for more information on sockets and service +specifications, respectively. +.I Lpd +spawns a copy of itself to process the request; the master daemon +continues to listen for new requests. +.PP +Clients communicate with +.I lpd +using a simple transaction oriented protocol. +Authentication of remote clients is done based +on the ``privilege port'' scheme employed by +\fIrshd\fP\|(8C) and \fIrcmd\fP\|(3X). +The following table shows the requests +understood by +.IR lpd . +In each request the first byte indicates the +``meaning'' of the request, followed by the name +of the printer to which it should be applied. Additional +qualifiers may follow, depending on the request. +.DS +.TS +l l. +Request Interpretation +_ +^Aprinter\en check the queue for jobs and print any found +^Bprinter\en receive and queue a job from another machine +^Cprinter [users ...] [jobs ...]\en return short list of current queue state +^Dprinter [users ...] [jobs ...]\en return long list of current queue state +^Eprinter person [users ...] [jobs ...]\en remove jobs from a queue +.TE +.DE +.PP +The \fIlpr\fP\|(1) command +is used by users to enter a print job in a local queue and to notify +the local +.I lpd +that there are new jobs in the spooling area. +.I Lpd +either schedules the job to be printed locally, or if +printing remotely, attempts to forward +the job to the appropriate machine. +If the printer cannot be opened or the destination +machine is unreachable, the job will remain queued until it is +possible to complete the work. +.NH 2 +lpq \- show line printer queue +.PP +The \fIlpq\fP\|(1) +program works recursively backwards displaying the queue of the machine with +the printer and then the queue(s) of the machine(s) that lead to it. +.I Lpq +has two forms of output: in the default, short, format it +gives a single line of output per queued job; in the long +format it shows the list of files, and their sizes, that +comprise a job. +.NH 2 +lprm \- remove jobs from a queue +.PP +The \fIlprm\fP\|(1) command deletes jobs from a spooling +queue. If necessary, \fIlprm\fP will first kill off a +running daemon that is servicing the queue and restart +it after the required files are removed. When removing +jobs destined for a remote printer, \fIlprm\fP acts +similarly to \fIlpq\fP except it first checks locally +for jobs to remove and then +tries to remove files in queues off-machine. +.NH 2 +lpc \- line printer control program +.PP +The +.IR lpc (8) +program is used by the system administrator to control the +operation of the line printer system. +For each line printer configured in /etc/printcap, +.I lpc +may be used to: +.IP \(bu +disable or enable a printer, +.IP \(bu +disable or enable a printer's spooling queue, +.IP \(bu +rearrange the order of jobs in a spooling queue, +.IP \(bu +find the status of printers, and their associated +spooling queues and printer daemons. diff --git a/share/doc/smm/07.lpr/3.t b/share/doc/smm/07.lpr/3.t new file mode 100644 index 0000000..8c950a9 --- /dev/null +++ b/share/doc/smm/07.lpr/3.t @@ -0,0 +1,73 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)3.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Access control +.PP +The printer system maintains protected spooling areas so that +users cannot circumvent printer accounting or +remove files other than their own. +The strategy used to maintain protected +spooling areas is as follows: +.IP \(bu 3 +The spooling area is writable only by a \fIdaemon\fP user +and \fIdaemon\fP group. +.IP \(bu 3 +The \fIlpr\fP program runs set-user-id to \fIroot\fP and +set-group-id to group \fIdaemon\fP. The \fIroot\fP access permits +reading any file required. Accessibility is verified +with an \fIaccess\fP\|(2) call. The group ID +is used in setting up proper ownership of files +in the spooling area for \fIlprm\fP. +.IP \(bu 3 +Control files in a spooling area are made with \fIdaemon\fP +ownership and group ownership \fIdaemon\fP. Their mode is 0660. +This insures control files are not modified by a user +and that no user can remove files except through \fIlprm\fP. +.IP \(bu 3 +The spooling programs, +\fIlpd\fP, \fIlpq\fP, and \fIlprm\fP run set-user-id to \fIroot\fP +and set-group-id to group \fIdaemon\fP to access spool files and printers. +.IP \(bu 3 +The printer server, \fIlpd\fP, +uses the same verification procedures as \fIrshd\fP\|(8C) +in authenticating remote clients. The host on which a client +resides must be present in the file /etc/hosts.equiv or /etc/hosts.lpd and +the request message must come from a reserved port number. +.PP +In practice, none of \fIlpd\fP, \fIlpq\fP, or +\fIlprm\fP would have to run as user \fIroot\fP if remote +spooling were not supported. In previous incarnations of +the printer system \fIlpd\fP ran set-user-id to \fIdaemon\fP, +set-group-id to group \fIspooling\fP, and \fIlpq\fP and \fIlprm\fP ran +set-group-id to group \fIspooling\fP. diff --git a/share/doc/smm/07.lpr/4.t b/share/doc/smm/07.lpr/4.t new file mode 100644 index 0000000..8800bc0 --- /dev/null +++ b/share/doc/smm/07.lpr/4.t @@ -0,0 +1,206 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)4.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Setting up +.PP +The 4.3BSD release comes with the necessary programs +installed and with the default line printer queue +created. If the system must be modified, the +makefile in the directory /usr/src/usr.lib/lpr +should be used in recompiling and reinstalling +the necessary programs. +.PP +The real work in setting up is to create the +.I printcap +file and any printer filters for printers not supported +in the distribution system. +.NH 2 +Creating a printcap file +.PP +The +.I printcap +database contains one or more entries per printer. +A printer should have a separate spooling directory; +otherwise, jobs will be printed on +different printers depending on which printer daemon starts first. +This section describes how to create entries for printers that do not +conform to the default printer description (an LP-11 style interface to a +standard, band printer). +.NH 3 +Printers on serial lines +.PP +When a printer is connected via a serial communication line +it must have the proper baud rate and terminal modes set. +The following example is for a DecWriter III printer connected +locally via a 1200 baud serial line. +.DS +.DT +lp|LA-180 DecWriter III:\e + :lp=/dev/lp:br#1200:fs#06320:\e + :tr=\ef:of=/usr/lib/lpf:lf=/usr/adm/lpd-errs: +.DE +The +.B lp +entry specifies the file name to open for output. Here it could +be left out since ``/dev/lp'' is the default. +The +.B br +entry sets the baud rate for the tty line and the +.B fs +entry sets CRMOD, no parity, and XTABS (see \fItty\fP\|(4)). +The +.B tr +entry indicates that a form-feed should be printed when the queue +empties so the paper can be torn off without turning the printer off-line and +pressing form feed. +The +.B of +entry specifies the filter program +.I lpf +should be used for printing the files; +more will be said about filters later. +The last entry causes errors +to be written to the file ``/usr/adm/lpd-errs'' +instead of the console. Most errors from \fIlpd\fP are logged using +\fIsyslogd\fP\|(8) and will not be logged in the specified file. The +filters should use \fIsyslogd\fP to report errors; only those that +write to standard error output will end up with errors in the \fBlf\fP file. +(Occasionally errors sent to standard error output have not appeared +in the log file; the use of \fIsyslogd\fP is highly recommended.) +.NH 3 +Remote printers +.PP +Printers that reside on remote hosts should have an empty +.B lp +entry. +For example, the following printcap entry would send output to the printer +named ``lp'' on the machine ``ucbvax''. +.DS +.DT +lp|default line printer:\e + :lp=:rm=ucbvax:rp=lp:sd=/usr/spool/vaxlpd: +.DE +The +.B rm +entry is the name of the remote machine to connect to; this name must +be a known host name for a machine on the network. +The +.B rp +capability indicates +the name of the printer on the remote machine is ``lp''; +here it could be left out since this is the default value. +The +.B sd +entry specifies ``/usr/spool/vaxlpd'' +as the spooling directory instead of the +default value of ``/usr/spool/lpd''. +.NH 2 +Output filters +.PP +Filters are used to handle device dependencies and to +do accounting functions. The output filtering of +.B of +is used when accounting is +not being done or when all text data must be passed through a filter. +It is not intended to do accounting since it is started only once, +all text files are filtered through it, and no provision is made for passing +owners' login name, identifying the beginning and ending of jobs, etc. +The other filters (if specified) are started for each file +printed and do accounting if there is an +.B af +entry. +If entries for both +.B of +and other filters are specified, +the output filter is used only to print the banner page; +it is then stopped to allow other filters access to the printer. +An example of a printer that requires output filters +is the Benson-Varian. +.DS +.DT +va|varian|Benson-Varian:\e + :lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf:\e + :tf=/usr/lib/rvcat:mx#2000:pl#58:px=2112:py=1700:tr=\ef: +.DE +The +.B tf +entry specifies ``/usr/lib/rvcat'' as the filter to be +used in printing \fItroff\fP\|(1) output. +This filter is needed to set the device into print mode +for text, and plot mode for printing +.I troff +files and raster images (see \fIva\fP\|(4V)). +Note that the page length is set to 58 lines by the +.B pl +entry for 8.5" by 11" fan-fold paper. +To enable accounting, the varian entry would be +augmented with an +.B af +filter as shown below. +.DS +.DT +va|varian|Benson-Varian:\e + :lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf:\e + :if=/usr/lib/vpf:tf=/usr/lib/rvcat:af=/usr/adm/vaacct:\e + :mx#2000:pl#58:px=2112:py=1700:tr=\ef: +.DE +.NH 2 +Access Control +.PP +Local access to printer queues is controlled with the +.B rg +printcap entry. +.DS + :rg=lprgroup: +.DE +Users must be in the group +.I lprgroup +to submit jobs to the specified printer. +The default is to allow all users access. +Note that once the files are in the local queue, they can be printed +locally or forwarded to another host depending on the configuration. +.PP +Remote access is controlled by listing the hosts in either the file +/etc/hosts.equiv or /etc/hosts.lpd, one host per line. Note that +.IR rsh (1) +and +.IR rlogin (1) +use /etc/hosts.equiv to determine which hosts are equivalent for allowing logins +without passwords. The file /etc/hosts.lpd is only used to control +which hosts have line printer access. +Remote access can be further restricted to only allow remote users with accounts +on the local host to print jobs by using the \fBrs\fP printcap entry. +.DS + :rs: +.DE diff --git a/share/doc/smm/07.lpr/5.t b/share/doc/smm/07.lpr/5.t new file mode 100644 index 0000000..137a342 --- /dev/null +++ b/share/doc/smm/07.lpr/5.t @@ -0,0 +1,116 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)5.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Output filter specifications +.PP +The filters supplied with 4.3BSD +handle printing and accounting for most common +line printers, the Benson-Varian, the wide (36") and +narrow (11") Versatec printer/plotters. For other devices or accounting +methods, it may be necessary to create a new filter. +.PP +Filters are spawned by \fIlpd\fP +with their standard input the data to be printed, and standard output +the printer. The standard error is attached to the +.B lf +file for logging errors or \fIsyslogd\fP may be used for logging errors. +A filter must return a 0 exit +code if there were no errors, 1 if the job should be reprinted, +and 2 if the job should be thrown away. +When \fIlprm\fP +sends a kill signal to the \fIlpd\fP process controlling +printing, it sends a SIGINT signal +to all filters and descendents of filters. +This signal can be trapped by filters that need +to do cleanup operations such as +deleting temporary files. +.PP +Arguments passed to a filter depend on its type. +The +.B of +filter is called with the following arguments. +.DS +\fIfilter\fP \fB\-w\fPwidth \fB\-l\fPlength +.DE +The \fIwidth\fP and \fIlength\fP values come from the +.B pw +and +.B pl +entries in the printcap database. +The +.B if +filter is passed the following parameters. +.DS +\fIfilter\fP [\|\fB\-c\fP\|] \fB\-w\fPwidth \fB\-l\fPlength \fB\-i\fPindent \fB\-n\fP login \fB\-h\fP host accounting_file +.DE +The +.B \-c +flag is optional, and only supplied when control characters +are to be passed uninterpreted to the printer (when using the +.B \-l +option of +.I lpr +to print the file). +The +.B \-w +and +.B \-l +parameters are the same as for the +.B of +filter. +The +.B \-n +and +.B \-h +parameters specify the login name and host name of the job owner. +The last argument is the name of the accounting file from +.IR printcap . +.PP +All other filters are called with the following arguments: +.DS +\fIfilter\fP \fB\-x\fPwidth \fB\-y\fPlength \fB\-n\fP login \fB\-h\fP host accounting_file +.DE +The +.B \-x +and +.B \-y +options specify the horizontal and vertical page +size in pixels (from the +.B px +and +.B py +entries in the printcap file). +The rest of the arguments are the same as for the +.B if +filter. diff --git a/share/doc/smm/07.lpr/6.t b/share/doc/smm/07.lpr/6.t new file mode 100644 index 0000000..7087790 --- /dev/null +++ b/share/doc/smm/07.lpr/6.t @@ -0,0 +1,94 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)6.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Line printer Administration +.PP +The +.I lpc +program provides local control over line printer activity. +The major commands and their intended use will be described. +The command format and remaining commands are described in +.IR lpc (8). +.LP +\fBabort\fP and \fBstart\fP +.IP +.I Abort +terminates an active spooling daemon on the local host immediately and +then disables printing (preventing new daemons from being started by +.IR lpr ). +This is normally used to forcibly restart a hung line printer daemon +(i.e., \fIlpq\fP reports that there is a daemon present but nothing is +happening). It does not remove any jobs from the queue +(use the \fIlprm\fP command instead). +.I Start +enables printing and requests \fIlpd\fP to start printing jobs. +.LP +\fBenable\fP and \fBdisable\fP +.IP +\fIEnable\fP and \fIdisable\fP allow spooling in the local queue to be +turned on/off. +This will allow/prevent +.I lpr +from putting new jobs in the spool queue. It is frequently convenient +to turn spooling off while testing new line printer filters since the +.I root +user can still use +.I lpr +to put jobs in the queue but no one else can. +The other main use is to prevent users from putting jobs in the queue +when the printer is expected to be unavailable for a long time. +.LP +\fBrestart\fP +.IP +.I Restart +allows ordinary users to restart printer daemons when +.I lpq +reports that there is no daemon present. +.LP +\fBstop\fP +.IP +.I Stop +halts a spooling daemon after the current job completes; +this also disables printing. This is a clean way to shutdown a +printer to do maintenance, etc. Note that users can still enter jobs in a +spool queue while a printer is +.IR stopped . +.LP +\fBtopq\fP +.IP +.I Topq +places jobs at the top of a printer queue. This can be used +to reorder high priority jobs since +.I lpr +only provides first-come-first-serve ordering of jobs. diff --git a/share/doc/smm/07.lpr/7.t b/share/doc/smm/07.lpr/7.t new file mode 100644 index 0000000..a6f6bea --- /dev/null +++ b/share/doc/smm/07.lpr/7.t @@ -0,0 +1,226 @@ +.\" Copyright (c) 1983, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)7.t 8.1 (Berkeley) 6/8/93 +.\" +.NH 1 +Troubleshooting +.PP +There are several messages that may be generated by the +the line printer system. This section +categorizes the most common and explains the cause +for their generation. Where the message implies a failure, +directions are given to remedy the problem. +.PP +In the examples below, the name +.I printer +is the name of the printer from the +.I printcap +database. +.NH 2 +LPR +.SH +lpr: \fIprinter\fP\|: unknown printer +.IP +The +.I printer +was not found in the +.I printcap +database. Usually this is a typing mistake; however, it may indicate +a missing or incorrect entry in the /etc/printcap file. +.SH +lpr: \fIprinter\fP\|: jobs queued, but cannot start daemon. +.IP +The connection to +.I lpd +on the local machine failed. +This usually means the printer server started at +boot time has died or is hung. Check the local socket +/dev/printer to be sure it still exists (if it does not exist, +there is no +.I lpd +process running). +Usually it is enough to get a super-user to type the following to +restart +.IR lpd . +.DS +% /usr/lib/lpd +.DE +You can also check the state of the master printer daemon with the following. +.DS +% ps l`cat /usr/spool/lpd.lock` +.DE +.IP +Another possibility is that the +.I lpr +program is not set-user-id to \fIroot\fP, set-group-id to group \fIdaemon\fP. +This can be checked with +.DS +% ls \-lg /usr/ucb/lpr +.DE +.SH +lpr: \fIprinter\fP\|: printer queue is disabled +.IP +This means the queue was turned off with +.DS +% lpc disable \fIprinter\fP +.DE +to prevent +.I lpr +from putting files in the queue. This is normally +done by the system manager when a printer is +going to be down for a long time. The +printer can be turned back on by a super-user with +.IR lpc . +.NH 2 +LPQ +.SH +waiting for \fIprinter\fP to become ready (offline ?) +.IP +The printer device could not be opened by the daemon. +This can happen for several reasons, +the most common is that the printer is turned off-line. +This message can also be generated if the printer is out +of paper, the paper is jammed, etc. +The actual reason is dependent on the meaning +of error codes returned by system device driver. +Not all printers supply enough information +to distinguish when a printer is off-line or having +trouble (e.g. a printer connected through a serial line). +Another possible cause of this message is +some other process, such as an output filter, +has an exclusive open on the device. Your only recourse +here is to kill off the offending program(s) and +restart the printer with +.IR lpc . +.SH +\fIprinter\fP is ready and printing +.IP +The +.I lpq +program checks to see if a daemon process exists for +.I printer +and prints the file \fIstatus\fP located in the spooling directory. +If the daemon is hung, a super user can use +.I lpc +to abort the current daemon and start a new one. +.SH +waiting for \fIhost\fP to come up +.IP +This implies there is a daemon trying to connect to the remote +machine named +.I host +to send the files in the local queue. +If the remote machine is up, +.I lpd +on the remote machine is probably dead or +hung and should be restarted as mentioned for +.IR lpr . +.SH +sending to \fIhost\fP +.IP +The files should be in the process of being transferred to the remote +.IR host . +If not, the local daemon should be aborted and started with +.IR lpc . +.SH +Warning: \fIprinter\fP is down +.IP +The printer has been marked as being unavailable with +.IR lpc . +.SH +Warning: no daemon present +.IP +The \fIlpd\fP process overseeing +the spooling queue, as specified in the ``lock'' file +in that directory, does not exist. This normally occurs +only when the daemon has unexpectedly died. +The error log file for the printer and the \fIsyslogd\fP logs +should be checked for a +diagnostic from the deceased process. +To restart an \fIlpd\fP, use +.DS +% lpc restart \fIprinter\fP +.DE +.SH +no space on remote; waiting for queue to drain +.IP +This implies that there is insufficient disk space on the remote. +If the file is large enough, there will never be enough space on +the remote (even after the queue on the remote is empty). The solution here +is to move the spooling queue or make more free space on the remote. +.NH 2 +LPRM +.SH +lprm: \fIprinter\fP\|: cannot restart printer daemon +.IP +This case is the same as when +.I lpr +prints that the daemon cannot be started. +.NH 2 +LPD +.PP +The +.I lpd +program can log many different messages using \fIsyslogd\fP\|(8). +Most of these messages are about files that can not +be opened and usually imply that the +.I printcap +file or the protection modes of the files are +incorrect. Files may also be inaccessible if people +manually manipulate the line printer system (i.e. they +bypass the +.I lpr +program). +.PP +In addition to messages generated by +.IR lpd , +any of the filters that +.I lpd +spawns may log messages using \fIsyslogd\fP or to the error log file +(the file specified in the \fBlf\fP entry in \fIprintcap\fP\|). +.NH 2 +LPC +.PP +.SH +couldn't start printer +.IP +This case is the same as when +.I lpr +reports that the daemon cannot be started. +.SH +cannot examine spool directory +.IP +Error messages beginning with ``cannot ...'' are usually because of +incorrect ownership or protection mode of the lock file, spooling +directory or the +.I lpc +program. diff --git a/share/doc/smm/07.lpr/Makefile b/share/doc/smm/07.lpr/Makefile new file mode 100644 index 0000000..20455e1 --- /dev/null +++ b/share/doc/smm/07.lpr/Makefile @@ -0,0 +1,9 @@ +# From: @(#)Makefile 8.1 (Berkeley) 6/8/93 +# $FreeBSD$ + +VOLUME= smm/07.lpd +SRCS= 0.t 1.t 2.t 3.t 4.t 5.t 6.t 7.t +MACROS= -ms +USE_TBL= + +.include diff --git a/share/doc/smm/07.lpr/spell.ok b/share/doc/smm/07.lpr/spell.ok new file mode 100644 index 0000000..bf31319 --- /dev/null +++ b/share/doc/smm/07.lpr/spell.ok @@ -0,0 +1,70 @@ +Aprinter +Bprinter +CRMOD +Cprinter +DecWriter +Dprinter +Eprinter +LPC +LPD +Lpd +Manual''SMM:5 +SIGINT +SMM:5 +Topq +XTABS +adm +af +br +daemon +daemons +dev +f:of +fs +hosts.equiv +hosts.lpd +lf +lg +lib +lp:br +lp:sd +lpc +lpd +lpd.lock +lpf +lpf:lf +lprgroup +makefile +mx +offline +pl +printcap +pw +py +rc +rcmd +rg +rlogin +rp +rs +rsh +rshd +rvcat +rvcat:af +rvcat:mx +sd +src +syslogd +tf +topq +ucb +ucbvax +ucbvax:rp +usr.lib +va0:sd +vaacct +vad:of +varian +vaxlpd +vpf +vpf:tf diff --git a/share/doc/smm/11.timedop/Makefile b/share/doc/smm/11.timedop/Makefile index ad09e78..aec9918 100644 --- a/share/doc/smm/11.timedop/Makefile +++ b/share/doc/smm/11.timedop/Makefile @@ -4,6 +4,5 @@ VOLUME= smm/11.timedop SRCS= timed.ms MACROS= -ms -SRCDIR= ${.CURDIR}/../../../../usr.sbin/timed/SMM.doc/timedop .include diff --git a/share/doc/smm/11.timedop/timed.ms b/share/doc/smm/11.timedop/timed.ms new file mode 100644 index 0000000..feea0b5 --- /dev/null +++ b/share/doc/smm/11.timedop/timed.ms @@ -0,0 +1,279 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)timed.ms 8.1 (Berkeley) 6/8/93 +.\" +.TL +Timed Installation and Operation Guide +.AU +Riccardo Gusella, Stefano Zatti, James M. Bloom +.AI +Computer Systems Research Group +Computer Science Division +Department of Electrical Engineering and Computer Science +University of California, Berkeley +Berkeley, CA 94720 +.AU +Kirk Smith +.AI +Engineering Computer Network +Department of Electrical Engineering +Purdue University +West Lafayette, IN 47906 +.FS +This work was sponsored by the Defense Advanced Research Projects Agency +(DoD), monitored by the Naval Electronics Systems +Command under contract No. N00039-84-C-0089, and by the CSELT +Corporation of Italy. +The views and conclusions contained in this document are those of the +authors and should not be interpreted as representing official policies, +either expressed or implied, of the Defense Research Projects Agency, +of the US Government, or of CSELT. +.FE +.LP +.EH 'SMM:11-%''Timed Installation and Operation' +.OH 'Timed Installation and Operation''SMM:11-%' +.SH +Introduction +.PP +The clock synchronization service for +the UNIX 4.3BSD operating system is composed of a collection of +time daemons (\fItimed\fP) running on the machines in a local +area network. +The algorithms implemented by the service is based on a master-slave scheme. +The time daemons communicate with each other using the +\fITime Synchronization Protocol\fP (TSP) which +is built on the DARPA UDP protocol and described in detail in [4]. +.PP +A time daemon has a twofold function. +First, it supports the synchronization of the clocks +of the various hosts in a local area network. +Second, it starts (or takes part in) the election that occurs +among slave time daemons when, for any reason, the master disappears. +The synchronization mechanism and the election procedure +employed by the program \fItimed\fP are described +in other documents [1,2,3]. +The next paragraphs are a brief overview of how the time daemon works. +This document is mainly concerned with the administrative and technical +issues of running \fItimed\fP at a particular site. +.PP +A \fImaster time daemon\fP measures the time +differences between the clock of the machine on which it +is running and those of all other machines. +The master computes the \fInetwork time\fP as the average of the +times provided by nonfaulty clocks.\** +.FS +A clock is considered to be faulty when its value +is more than a small specified +interval apart from the majority of the clocks +of the other machines [1,2]. +.FE +It then sends to each \fIslave time daemon\fP the +correction that should be performed on the clock of its machine. +This process is repeated periodically. +Since the correction is expressed as a time difference rather than an +absolute time, transmission delays do not interfere with +the accuracy of the synchronization. +When a machine comes up and joins the network, +it starts a slave time daemon which +will ask the master for the correct time and will reset the machine's clock +before any user activity can begin. +The time daemons are able to maintain a single network time in spite of +the drift of clocks away from each other. +The present implementation keeps processor clocks synchronized +within 20 milliseconds. +.PP +To ensure that the service provided is continuous and reliable, +it is necessary to implement an election algorithm to elect a +new master should the machine running the current master crash, the master +terminate (for example, because of a run-time error), or +the network be partitioned. +Under our algorithm, slaves are able to realize when the master has +stopped functioning and to elect a new master from among themselves. +It is important to note that, since the failure of the master results +only in a gradual divergence of clock values, the election +need not occur immediately. +.PP +The machines that are gateways between distinct local area +networks require particular care. +A time daemon on such machines may act as a \fIsubmaster\fP. +This artifact depends on the current inability of +transmission protocols to broadcast a message on a network +other than the one to which the broadcasting machine is connected. +The submaster appears as a slave on one network, and as a master +on one or more of the other networks to which it is connected. +.PP +A submaster classifies each network as one of three types. +A \fIslave network\fP is a network on which the submaster acts as a slave. +There can only be one slave network. +A \fImaster network\fP is a network on which the submaster acts as a master. +An \fIignored network\fP is any other network which already has a valid master. +The submaster tries periodically to become master on an ignored +network, but gives up immediately if a master already exists. +.SH +Guidelines +.PP +While the synchronization algorithm is quite general, the election +one, requiring a broadcast mechanism, puts constraints on +the kind of network on which time daemons can run. +The time daemon will only work on networks with broadcast capability +augmented with point-to-point links. +Machines that are only connected to point-to-point, +non-broadcast networks may not use the time daemon. +.PP +If we exclude submasters, there will normally be, at most, one master time +daemon in a local area internetwork. +During an election, only one of the slave time daemons +will become the new master. +However, because of the characteristics of its machine, +a slave can be prevented from becoming the master. +Therefore, a subset of machines must be designated as potential +master time daemons. +A master time daemon will require CPU resources +proportional to the number of slaves, in general, more than +a slave time daemon, so it may be advisable to limit master time +daemons to machines with more powerful processors or lighter loads. +Also, machines with inaccurate clocks should not be used as masters. +This is a purely administrative decision: an organization may +well allow all of its machines to run master time daemons. +.PP +At the administrative level, a time daemon on a machine +with multiple network interfaces, may be told to ignore all +but one network or to ignore one network. +This is done with the \fI\-n network\fP and \fI\-i network\fP +options respectively at start-up time. +Typically, the time daemon would be instructed to ignore all but +the networks belonging to the local administrative control. +.PP +There are some limitations to the current +implementation of the time daemon. +It is expected that these limitations will be removed in future releases. +The constant NHOSTS in /usr/src/etc/timed/globals.h limits the +maximum number of machines that may be directly controlled by one +master time daemon. +The current maximum is 29 (NHOSTS \- 1). +The constant must be changed and the program recompiled if a site wishes to +run \fItimed\fP on a larger (inter)network. +.PP +In addition, there is a \fIpathological situation\fP to +be avoided at all costs, that might occur when +time daemons run on multiply-connected local area networks. +In this case, as we have seen, time daemons running on gateway machines +will be submasters and they will act on some of those +networks as master time daemons. +Consider machines A and B that are both gateways between +networks X and Y. +If time daemons were started on both A and B without constraints, it would be +possible for submaster time daemon A to be a slave on network X +and the master on network Y, while submaster time daemon B is a slave on +network Y and the master on network X. +This \fIloop\fP of master time daemons will not function properly +or guarantee a unique time on both networks, and will cause +the submasters to use large amounts of system resources in the form +of network bandwidth and CPU time. +In fact, this kind of \fIloop\fP can also be generated with more +than two master time daemons, +when several local area networks are interconnected. +.SH +Installation +.PP +In order to start the time daemon on a given machine, +the following lines should be +added to the \fIlocal daemons\fP section in the file \fI/etc/rc.local\fP: +.sp 2 +.in 1i +.nf +if [ -f /etc/timed ]; then + /etc/timed \fIflags\fP & echo -n ' timed' >/dev/console +fi +.fi +.in -1i +.sp +.LP +In any case, they must appear after the network +is configured via ifconfig(8). +.PP +Also, the file \fI/etc/services\fP should contain the following +line: +.sp 2 +.ti 1i +timed 525/udp timeserver +.sp +.LP +The \fIflags\fP are: +.IP "-n network" 13 +to consider the named network. +.IP "-i network" +to ignore the named network. +.IP -t +to place tracing information in \fI/usr/adm/timed.log\fP. +.IP -M +to allow this time daemon to become a master. +A time daemon run without this option will be forced in the state of +slave during an election. +.SH +Daily Operation +.PP +\fITimedc(8)\fP is used to control the operation of the time daemon. +It may be used to: +.IP \(bu +measure the differences between machines' clocks, +.IP \(bu +find the location where the master \fItimed\fP is running, +.IP \(bu +cause election timers on several machines to expire at the same time, +.IP \(bu +enable or disable tracing of messages received by \fItimed\fP. +.LP +See the manual page on \fItimed\fP\|(8) and \fItimedc\fP\|(8) +for more detailed information. +.PP +The \fIdate(1)\fP command can be used to set the network date. +In order to set the time on a single machine, the \fI-n\fP flag +can be given to date(1). +.bp +.SH +References +.IP 1. +R. Gusella and S. Zatti, +\fITEMPO: A Network Time Controller for Distributed Berkeley UNIX System\fP, +USENIX Summer Conference Proceedings, Salt Lake City, June 1984. +.IP 2. +R. Gusella and S. Zatti, \fIClock Synchronization in a Local Area Network\fP, +University of California, Berkeley, Technical Report, \fIto appear\fP. +.IP 3. +R. Gusella and S. Zatti, +\fIAn Election Algorithm for a Distributed Clock Synchronization Program\fP, +University of California, Berkeley, CS Technical Report #275, Dec. 1985. +.IP 4. +R. Gusella and S. Zatti, +\fIThe Berkeley UNIX 4.3BSD Time Synchronization Protocol\fP, +UNIX Programmer's Manual, 4.3 Berkeley Software Distribution, Volume 2c. diff --git a/share/doc/smm/12.timed/Makefile b/share/doc/smm/12.timed/Makefile index 1d9ed5c..f844568 100644 --- a/share/doc/smm/12.timed/Makefile +++ b/share/doc/smm/12.timed/Makefile @@ -7,6 +7,5 @@ EXTRA= date loop time unused MACROS= -ms USE_SOELIM= USE_TBL= -SRCDIR= ${.CURDIR}/../../../../usr.sbin/timed/SMM.doc/timed .include diff --git a/share/doc/smm/12.timed/date b/share/doc/smm/12.timed/date new file mode 100644 index 0000000..e4e4d58 --- /dev/null +++ b/share/doc/smm/12.timed/date @@ -0,0 +1,53 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)date 8.1 (Berkeley) 6/8/93 +.\" +.ft B +.TS +center; +ce | ce | ce | ce +| c | c | c | s | +| c s s s |. +Byte 1 Byte 2 Byte 3 Byte 4 += +Type Version No. Sequence No. +_ +Seconds of Time to Set +_ +Microseconds of Time to Set +_ +Machine Name +_ +\&. . . +_ +.TE +.ft R diff --git a/share/doc/smm/12.timed/loop b/share/doc/smm/12.timed/loop new file mode 100644 index 0000000..11ccb4d --- /dev/null +++ b/share/doc/smm/12.timed/loop @@ -0,0 +1,54 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)loop 8.1 (Berkeley) 6/8/93 +.\" +.ft B +.TS +center; +ce | ce | ce | ce +| c | c | c | s | +| c | c s s | +| c s s s |. +Byte 1 Byte 2 Byte 3 Byte 4 += +Type Version No. Sequence No. +_ +Hop Count ( unused ) +_ +( unused ) +_ +Machine Name +_ +\&. . . +_ +.TE +.ft R diff --git a/share/doc/smm/12.timed/spell.ok b/share/doc/smm/12.timed/spell.ok new file mode 100644 index 0000000..8ecfe15 --- /dev/null +++ b/share/doc/smm/12.timed/spell.ok @@ -0,0 +1,34 @@ +ACK +ADJTIME +Adjtime +CS +CSELT +Candidature +DATEACK +DoD +Gusella +MASTERACK +MASTERREQ +MASTERUP +MSITE +MSITEREQ +Protocol''SMM:22 +Riccardo +SETDATE +SETDATEREQ +SETTIME +SLAVEUP +SMM:22 +Stefano +TRACEOFF +TRACEON +TSP +Timedc +UDP +USENIX +Zatti +candidature +ce +daemon +daemons +timedc diff --git a/share/doc/smm/12.timed/time b/share/doc/smm/12.timed/time new file mode 100644 index 0000000..619d171 --- /dev/null +++ b/share/doc/smm/12.timed/time @@ -0,0 +1,53 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)time 8.1 (Berkeley) 6/8/93 +.\" +.ft B +.TS +center; +ce | ce | ce | ce +| c | c | c | s | +| c s s s |. +Byte 1 Byte 2 Byte 3 Byte 4 += +Type Version No. Sequence No. +_ +Seconds of Adjustment +_ +Microseconds of Adjustment +_ +Machine Name +_ +\&. . . +_ +.TE +.ft R diff --git a/share/doc/smm/12.timed/timed.ms b/share/doc/smm/12.timed/timed.ms new file mode 100644 index 0000000..412399a --- /dev/null +++ b/share/doc/smm/12.timed/timed.ms @@ -0,0 +1,462 @@ +.\" $FreeBSD$ +.\" +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)timed.ms 8.1 (Berkeley) 6/8/93 +.\" +.TL +The Berkeley +.UX +.br +Time Synchronization Protocol +.AU +Riccardo Gusella, Stefano Zatti, and James M. Bloom +.AI +Computer Systems Research Group +Computer Science Division +Department of Electrical Engineering and Computer Science +University of California, Berkeley +Berkeley, CA 94720 +.FS +This work was sponsored by the Defense Advanced Research Projects Agency +(DoD), monitored by the Naval Electronics Systems +Command under contract No. N00039-84-C-0089, and by the Italian CSELT +Corporation. +The views and conclusions contained in this document are those of the +authors and should not be interpreted as representing official policies, +either expressed or implied, of the Defense Research Projects Agency, +of the US Government, or of CSELT. +.FE +.LP +.OH 'The Berkeley UNIX Time Synchronization Protocol''SMM:12-%' +.EH 'SMM:12-%''The Berkeley UNIX Time Synchronization Protocol' +.SH +Introduction +.PP +The Time Synchronization Protocol (TSP) +has been designed for specific use by the program \fItimed\fP, +a local area network clock synchronizer for +the UNIX 4.3BSD operating +system. +Timed is built on the DARPA UDP protocol [4] and +is based on a master slave scheme. +.PP +TSP serves a dual purpose. +First, it supports messages for the synchronization of the clocks +of the various hosts in a local area network. +Second, it supports messages for the election that occurs +among slave time daemons when, for any reason, the master disappears. +The synchronization mechanism and the election procedure +employed by the program timed are described +in other documents [1,2,3]. +.PP +Briefly, the synchronization software, which works in a +local area network, consists of a collection of \fItime daemons\fP +(one per machine) and is based on a master-slave +structure. +The present implementation keeps processor clocks synchronized +within 20 milliseconds. +A \fImaster time daemon\fP measures the time +difference between the clock of the machine on which it +is running and those of all other machines. The current implementation +uses ICMP \fITime Stamp Requests\fP [5] to measure the clock difference +between machines. +The master computes the \fInetwork time\fP as the average of the +times provided by nonfaulty clocks.\** +.FS +A clock is considered to be faulty when its value +is more than a small specified +interval apart from the majority of the clocks +of the machines on the same network. +See [1,2] for more details. +.FE +It then sends to each \fIslave time daemon\fP the +correction that should be performed on the clock of its machine. +This process is repeated periodically. +Since the correction is expressed as a time difference rather than an +absolute time, transmission delays do not interfere with synchronization. +When a machine comes up and joins the network, +it starts a slave time daemon, which +will ask the master for the correct time and will reset the machine's clock +before any user activity can begin. +The time daemons therefore maintain a single network time in spite of +the drift of clocks away from each other. +.PP +Additionally, a time daemon on gateway machines may run as +a \fIsubmaster\fP. +A submaster time daemon functions as a slave on one network that +already has a master and as master on other networks. +In addition, a submaster is responsible for propagating broadcast +packets from one network to the other. +.PP +To ensure that service provided is continuous and reliable, +it is necessary to implement an election algorithm that will elect a +new master should the machine running the current master crash, the master +terminate (for example, because of a run-time error), or the network be +partitioned. +Under our algorithm, slaves are able to realize when the master has +stopped functioning and to elect a new master from among themselves. +It is important to note that since the failure of the master results +only in a gradual divergence of clock values, the election +need not occur immediately. +.PP +All the communication occurring among time daemons uses the TSP +protocol. +While some messages need not be sent in a reliable way, +most communication in TSP requires reliability not provided by the underlying +protocol. +Reliability is achieved by the use of acknowledgements, sequence numbers, and +retransmission when message losses occur. +When a message that requires acknowledgment is not acknowledged after +multiple attempts, +the time daemon that has sent the message will assume that the +addressee is down. +This document will not describe the details of how reliability is +implemented, but will only point out when +a message type requires a reliable transport mechanism. +.PP +The message format in TSP is the same for all message types; +however, in some instances, one or more fields are not used. +The next section describes the message format. +The following sections describe +in detail the different message types, their use and the contents +of each field. NOTE: The message format is likely to change in +future versions of timed. +.sp 2 +.SH +Message Format +.PP +All fields are based upon 8-bit bytes. Fields should be sent in +network byte order if they are more than one byte long. +The structure of a TSP message is the following: +.IP 1) +A one byte message type. +.IP 2) +A one byte version number, specifying the protocol version which the +message uses. +.IP 3) +A two byte sequence number to be used for recognizing duplicate messages +that occur when messages are retransmitted. +.IP 4) +Eight bytes of packet specific data. This field contains two 4 byte time +values, a one byte hop count, or may be unused depending on the type +of the packet. +.IP 5) +A zero-terminated string of up to 256 \s-2ASCII\s+2 characters with the name of +the machine sending the message. +.PP +The following charts describe the message types, +show their fields, and explain their usages. +For the purpose of the following discussion, a time daemon can +be considered to be in +one of three states: slave, master, or candidate for election to master. +Also, the term \fIbroadcast\fP refers to +the sending of a message to all active time daemons. +.sp 1 +.SH +Adjtime Message +.so time +.LP +Type: TSP_ADJTIME (1) +.sp 1 +.PP +The master sends this message to a slave to communicate +the difference between +the clock of the slave and +the network time the master has just computed. +The slave will accordingly +adjust the time of its machine. +This message requires an acknowledgment. +.sp 1 +.SH +Acknowledgment Message +.so unused +.LP +Type: TSP_ACK (2) +.sp 1 +.PP +Both the master and the slaves use this message for +acknowledgment only. +It is used in several different contexts, for example +in reply to an Adjtime message. +.sp 1 +.SH +Master Request Message +.so unused +.LP +Type: TSP_MASTERREQ (3) +.sp 1 +.PP +A newly-started time daemon broadcasts this message to +locate a master. No other action is implied by this packet. +It requires a Master Acknowledgment. +.sp 1 +.SH +Master Acknowledgement +.so unused +.LP +Type: TSP_MASTERACK (4) +.sp 1 +.PP +The master sends this message to acknowledge the Master Request message +and the Conflict Resolution Message. +.sp 1 +.SH +Set Network Time Message +.so date +.LP +Type: TSP_SETTIME (5) +.sp 1 +.PP +The master sends this message to slave time daemons to set their time. +This packet is sent to newly started time daemons and when the network +date is changed. +It contains the master's time as an approximation of the network time. +It requires an acknowledgment. +The next +synchronization round will eliminate the small time difference +caused by the random delay in the communication channel. +.sp 1 +.SH +Master Active Message +.so unused +.LP +Type: TSP_MASTERUP (6) +.sp 1 +.PP +The master broadcasts this message to +solicit the names of the active slaves. +Slaves will reply with a Slave Active message. +.sp 1 +.SH +Slave Active Message +.so unused +.LP +Type: TSP_SLAVEUP (7) +.sp 1 +.PP +A slave sends this message to the master in answer to a Master Active message. +This message is also sent when a new slave starts up to inform the master that +it wants to be synchronized. +.sp 1 +.SH +Master Candidature Message +.so unused +.LP +Type: TSP_ELECTION (8) +.sp 1 +.PP +A slave eligible to become a master broadcasts this message when its election +timer expires. +The message declares that the slave wishes to become the new master. +.sp 1 +.SH +Candidature Acceptance Message +.so unused +.LP +Type: TSP_ACCEPT (9) +.sp 1 +.PP +A slave sends this message to accept the candidature of the time daemon +that has broadcast an Election message. +The candidate will add the slave's name to the list of machines that it +will control should it become the master. +.sp 1 +.SH +Candidature Rejection Message +.so unused +.LP +Type: TSP_REFUSE (10) +.sp 1 +.PP +After a slave accepts the candidature of a time daemon, it will reply +to any election messages from other slaves +with this message. +This rejects any candidature other than the first received. +.sp 1 +.SH +Multiple Master Notification Message +.so unused +.LP +Type: TSP_CONFLICT (11) +.sp 1 +.PP +When two or more masters reply to a Master Request message, the slave +uses this message to inform one of them that more than one master exists. +.sp 1 +.SH +Conflict Resolution Message +.so unused +.LP +Type: TSP_RESOLVE (12) +.sp 1 +.PP +A master which has been informed of the existence of other masters +broadcasts this message to determine who the other masters are. +.sp 1 +.SH +Quit Message +.so unused +.LP +Type: TSP_QUIT (13) +.sp 1 +.PP +This message is sent by the master in three different contexts: +1) to a candidate that broadcasts a Master Candidature message, +2) to another master when notified of its existence, +3) to another master if a loop is detected. +In all cases, the recipient time daemon will become a slave. +This message requires an acknowledgement. +.sp 1 +.SH +Set Date Message +.so date +.LP +Type: TSP_SETDATE (22) +.sp 1 +.PP +The program \fIdate\fP\|(1) sends this message to the local time daemon +when a super-user wants to set the network date. +If the local time daemon is the master, it will set the date; +if it is a slave, it will communicate the desired date to the master. +.sp 1 +.SH +Set Date Request Message +.so date +.LP +Type: TSP_SETDATEREQ (23) +.sp 1 +.PP +A slave that has received a Set Date message will communicate the +desired date to the master using this message. +.sp 1 +.SH +Set Date Acknowledgment Message +.so unused +.LP +Type: TSP_DATEACK (16) +.sp 1 +.PP +The master sends this message to a slave in acknowledgment of a +Set Date Request Message. +The same message is sent by the local time daemon to the program +\fIdate(1)\fP to confirm that the network date has been set by the +master. +.sp 1 +.SH +Start Tracing Message +.so unused +.LP +Type: TSP_TRACEON (17) +.sp 1 +.PP +The controlling program \fItimedc\fP sends this message to the local +time daemon to start the recording in a system file of +all messages received. +.sp 1 +.SH +Stop Tracing Message +.so unused +.LP +Type: TSP_TRACEOFF (18) +.sp 1 +.PP +\fITimedc\fP sends this message to the local +time daemon to stop the recording of +messages received. +.sp 1 +.SH +Master Site Message +.so unused +.LP +Type: TSP_MSITE (19) +.sp 1 +.PP +\fITimedc\fP sends this message to the local time daemon to find out +where the master is running. +.sp 1 +.SH +Remote Master Site Message +.so unused +.LP +Type: TSP_MSITEREQ (20) +.sp 1 +.PP +A local time daemon broadcasts this message to find the location +of the master. +It then uses the Acknowledgement message to +communicate this location to \fItimedc\fP. +.sp 1 +.SH +Test Message +.so unused +.LP +Type: TSP_TEST (21) +.sp 1 +.PP +For testing purposes, \fItimedc\fP sends this message to a slave +to cause its election timer to expire. NOTE: \fItimed\fP +is not normally compiled to support this. +.sp 1 +.SH +.SH +Loop Detection Message +.so loop +.LP +Type: TSP_LOOP (24) +.sp 1 +.PP +This packet is initiated by all masters occasionally to attempt to detect loops. +All submasters forward this packet onto the networks over which they are master. +If a master receives a packet it sent out initially, +it knows that a loop exists and tries to correct the problem. +.SH +References +.IP 1. +R. Gusella and S. Zatti, +\fITEMPO: A Network Time Controller for Distributed Berkeley UNIX System\fP, +USENIX Summer Conference Proceedings, Salt Lake City, June 1984. +.IP 2. +R. Gusella and S. Zatti, \fIClock Synchronization in a Local Area Network\fP, +University of California, Berkeley, Technical Report, \fIto appear\fP. +.IP 3. +R. Gusella and S. Zatti, +\fIAn Election Algorithm for a Distributed Clock Synchronization Program\fP, +University of California, Berkeley, CS Technical Report #275, Dec. 1985. +.IP 4. +Postel, J., \fIUser Datagram Protocol\fP, RFC 768. +Network Information Center, SRI International, Menlo Park, California, +August 1980. +.IP 5. +Postel, J., \fIInternet Control Message Protocol\fP, RFC 792. +Network Information Center, SRI International, Menlo Park, California, +September 1981. diff --git a/share/doc/smm/12.timed/unused b/share/doc/smm/12.timed/unused new file mode 100644 index 0000000..adadfc3 --- /dev/null +++ b/share/doc/smm/12.timed/unused @@ -0,0 +1,53 @@ +.\" Copyright (c) 1986, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)unused 8.1 (Berkeley) 6/8/93 +.\" +.ft B +.TS +center; +ce | ce | ce | ce +| c | c | c | s | +| c s s s |. +Byte 1 Byte 2 Byte 3 Byte 4 += +Type Version No. Sequence No. +_ +( unused ) +_ +( unused ) +_ +Machine Name +_ +\&. . . +_ +.TE +.ft R diff --git a/share/doc/usd/04.csh/Makefile b/share/doc/usd/04.csh/Makefile index d22a7b9..5606b8f 100644 --- a/share/doc/usd/04.csh/Makefile +++ b/share/doc/usd/04.csh/Makefile @@ -5,6 +5,5 @@ VOLUME= usd/04.csh SRCS= tabs csh.1 csh.2 csh.3 csh.4 csh.a csh.g MACROS= -ms USE_SOELIM= -SRCDIR= ${.CURDIR}/../../../../bin/csh/USD.doc .include diff --git a/share/doc/usd/04.csh/csh.1 b/share/doc/usd/04.csh/csh.1 new file mode 100644 index 0000000..915cb23 --- /dev/null +++ b/share/doc/usd/04.csh/csh.1 @@ -0,0 +1,1012 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)csh.1 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.EH 'USD:4-%''An Introduction to the C shell' +.OH 'An Introduction to the C shell''USD:4-%' +.\".RP +.TL +An Introduction to the C shell +.AU +William Joy +(revised for 4.3BSD by Mark Seiden) +.AI +Computer Science Division +.br +Department of Electrical Engineering and Computer Science +.br +University of California, Berkeley +.br +Berkeley, California 94720 +.AB +.I Csh +is a new command language interpreter for +.UX +systems. +It incorporates good features of other shells and a +.I history +mechanism similar to the +.I redo +of \s-2INTERLISP\s0. +While incorporating many features of other shells which make +writing shell programs (shell scripts) easier, +most of the features unique to +.I csh +are designed more for the interactive \s-2UNIX\s0 user. +.PP +\s-2UNIX\s0 +users who have read a general introduction to the system +will find a valuable basic explanation of the shell here. +Simple terminal interaction with +.I csh +is possible after reading just the first section of this document. +The second section describes the shell's capabilities which you can +explore after you have begun to become acquainted with the shell. +Later sections introduce features which are useful, but not necessary +for all users of the shell. +.PP +Additional information includes an appendix listing special characters of the shell +and a glossary of terms and commands introduced in this manual. +.AE +.SH +.if n .ND +Introduction +.PP +A +.I shell +is a command language interpreter. +.I Csh +is the name of one particular command interpreter on +\s-2UNIX\s0. +The primary purpose of +.I csh +is to translate command lines typed at a terminal into +system actions, such as invocation of other programs. +.I Csh +is a user program just like any you might write. +Hopefully, +.I csh +will be a very useful program for you +in interacting with the \s-2UNIX\s0 system. +.PP +In addition to this document, you will want to refer to a copy +of the \s-2UNIX\s0 User Reference Manual. +The +.I csh +documentation in section 1 of the manual provides a full description of all +features of the shell and is the definitive reference for questions +about the shell. +.PP +Many words in this document are shown in +.I italics. +These are important words; +names of commands, and words which have special meaning in discussing +the shell and \s-2UNIX\s0. +Many of the words are defined in a glossary at the end of this document. +If you don't know what is meant by a word, you should look +for it in the glossary. +.SH +Acknowledgements +.PP +Numerous people have provided good input about previous versions +of +.I csh +and aided in its debugging and in the debugging of its documentation. +I would especially like to thank Michael Ubell +who made the crucial observation that history commands could be +done well over the word structure of input text, and implemented +a prototype history mechanism in an older version of the shell. +Eric Allman has also provided a large number of useful comments on the +shell, helping to unify those concepts which are present and to identify +and eliminate useless and marginally useful features. +Mike O'Brien suggested the pathname hashing +mechanism which speeds command execution. +Jim Kulp added the job control and directory stack primitives and +added their documentation to this introduction. +.br +.bp +.NH +Terminal usage of the shell +.NH 2 +The basic notion of commands +.PP +A +.I shell +in +\s-2UNIX\s0 +acts mostly as a medium through which other +.I programs +are invoked. +While it has a set of +.I builtin +functions which it performs directly, +most commands cause execution of programs that are, in fact, +external to the shell. +The shell is thus distinguished from the command interpreters of other +systems both by the fact that it is just a user program, and by the fact +that it is used almost exclusively as a mechanism for invoking other programs. +.PP +.I Commands +in the \s-2UNIX\s0 system consist of a list of strings or +.I words +interpreted as a +.I "command name" +followed by +.I arguments. +Thus the command +.DS +mail bill +.DE +consists of two words. +The first word +.I mail +names the command to be executed, in this case the +mail program which sends messages to other users. +The shell uses the name of the command in attempting to execute it for you. +It will look in a number of +.I directories +for a file with the name +.I mail +which is expected to contain the mail program. +.PP +The rest of the words of the command are given as +.I arguments +to the command itself when it is executed. +In this case we specified also the argument +.I bill +which is interpreted by the +.I mail +program to be the name of a user to whom mail is to be sent. +In normal terminal usage we might use the +.I mail +command as follows. +.DS +% mail bill +I have a question about the csh documentation. +My document seems to be missing page 5. +Does a page five exist? + Bill +EOT +% +.DE +.PP +Here we typed a message to send to +.I bill +and ended this message with a ^D which sent an end-of-file to +the mail program. +(Here and throughout this document, the notation ``^\fIx\fR'' +is to be read ``control-\fIx\fR'' and represents the striking of the \fIx\fR +key while the control key is held down.) +The mail program +then echoed the characters `EOT' and transmitted our message. +The characters `% ' were printed before and after the mail command +by the shell to indicate that input was needed. +.PP +After typing the `% ' prompt the shell was reading command input from +our terminal. +We typed a complete command `mail bill'. +The shell then executed the +.I mail +program with argument +.I bill +and went dormant waiting for it to complete. +The mail program then read input from our terminal until we signalled +an end-of-file via typing a ^D after which the shell noticed +that mail had completed +and signaled us that it was ready to read from the terminal again by +printing another `% ' prompt. +.PP +This is the essential pattern of all interaction with \s-2UNIX\s0 +through the shell. +A complete command is typed at the terminal, the shell executes +the command and when this execution completes, it prompts for a new command. +If you run the editor for an hour, the shell will patiently wait for +you to finish editing and obediently prompt you again whenever you finish +editing. +.PP +An example of a useful command you can execute now is the +.I tset +command, which sets the default +.I erase +and +.I kill +characters on your terminal \- the erase character erases the last +character you typed and the kill character erases the entire line you +have entered so far. +By default, the erase character is the delete key (equivalent to `^?') +and the kill character is `^U'. Some people prefer to make the erase character +the backspace key (equivalent to `^H'). +You can make this be true by typing +.DS +tset \-e +.DE +which tells the program +.I tset +to set the erase character to tset's default setting for this character +(a backspace). +.NH 2 +Flag arguments +.PP +A useful notion in \s-2UNIX\s0 is that of a +.I flag +argument. +While many arguments to commands specify file names or user names, +some arguments rather specify an optional capability of the command +which you wish to invoke. +By convention, such arguments begin with the character `\-' (hyphen). +Thus the command +.DS +ls +.DE +will produce a list of the files in the current +.I "working directory" . +The option +.I \-s +is the size option, and +.DS +ls \-s +.DE +causes +.I ls +to also give, for each file the size of the file in blocks of 512 +characters. +The manual section for each command in the \s-2UNIX\s0 reference manual +gives the available options for each command. +The +.I ls +command has a large number of useful and interesting options. +Most other commands have either no options or only one or two options. +It is hard to remember options of commands which are not used very +frequently, so most \s-2UNIX\s0 utilities perform only one or two functions +rather than having a large number of hard to remember options. +.NH 2 +Output to files +.PP +Commands that normally read input or write output on the terminal +can also be executed with this input and/or output done to +a file. +.PP +Thus suppose we wish to save the current date in a file called `now'. +The command +.DS +date +.DE +will print the current date on our terminal. +This is because our terminal is the default +.I "standard output" +for the date command and the date command prints the date on its +standard output. +The shell lets us +.I redirect +the +.I "standard output" +of a command through a +notation using the +.I metacharacter +`>' and the name of the file where output is to be placed. +Thus the command +.DS +date > now +.DE +runs the +.I date +command such that its standard output is +the file `now' rather than the terminal. +Thus this command places the current date and time into the file `now'. +It is important to know that the +.I date +command was unaware that its output was going to a file rather than +to the terminal. +The shell performed this +.I redirection +before the command began executing. +.PP +One other thing to note here is that the file `now' +need not have existed before the +.I date +command was executed; the shell would have created the file if it did +not exist. +And if the file did exist? +If it had existed previously these previous contents would have been discarded! +A shell option +.I noclobber +exists to prevent this from happening accidentally; +it is discussed in section 2.2. +.PP +The system normally keeps files which you create with `>' and all other files. +Thus the default is for files to be permanent. If you wish to create a file +which will be removed automatically, you can begin its name with a `#' +character, this `scratch' character denotes the fact that the file will +be a scratch file.* +.FS +*Note that if your erase character is a `#', you will have to precede the +`#' with a `\e'. The fact that the `#' character is the old (pre-\s-2CRT\s0) +standard erase character means that it seldom appears in a file name, and +allows this convention to be used for scratch files. If you are using a +\s-2CRT\s0, your erase character should be a ^H, as we demonstrated +in section 1.1 how this could be set up. +.FE +The system will remove such files after a couple of days, +or sooner if file space becomes very tight. +Thus, in running the +.I date +command above, we don't really want to save the output forever, so we +would more likely do +.DS +date > #now +.DE +.NH 2 +Metacharacters in the shell +.PP +The shell has a large number of +special characters (like `>') +which indicate special functions. +We say that these notations have +.I syntactic +and +.I semantic +meaning to the shell. +In general, most characters which are neither letters nor digits +have special meaning to the shell. +We shall shortly learn a means of +.I quotation +which allows us to use +.I metacharacters +without the shell treating them in any special way. +.PP +Metacharacters normally have effect only when the shell is reading +our input. +We need not worry about placing shell metacharacters in a letter +we are sending via +.I mail, +or when we are typing in text or data to some other program. +Note that the shell is only reading input when it has prompted with +`% ' (although we can type our input even before it prompts). +.NH 2 +Input from files; pipelines +.PP +We learned above how to +.I redirect +the +.I "standard output" +of a command +to a file. +It is also possible to redirect the +.I "standard input" +of a command from a file. +This is not often necessary since most commands will read from +a file whose name is given as an argument. +We can give the command +.DS +sort < data +.DE +to run the +.I sort +command with standard input, where the command normally +reads its input, from the file +`data'. +We would more likely say +.DS +sort data +.DE +letting the +.I sort +command open the file +`data' +for input itself since this is less to type. +.PP +We should note that if we just typed +.DS +sort +.DE +then the sort program would sort lines from its +.I "standard input." +Since we did not +.I redirect +the standard input, it would sort lines as we typed them on the terminal +until we typed a ^D to indicate an end-of-file. +.PP +A most useful capability is the ability to combine the standard output +of one command with the standard input of another, i.e. to run the +commands in a sequence known as a +.I pipeline. +For instance the command +.DS +ls \-s +.DE +normally produces a list of the files in our directory with the size +of each in blocks of 512 characters. +If we are interested in learning which of our files is largest we +may wish to have this sorted by size rather than by name, which is +the default way in which +.I ls +sorts. +We could look at the many options of +.I ls +to see if there was an option to do this but would eventually discover +that there is not. +Instead we can use a couple of simple options of the +.I sort +command, combining it with +.I ls +to get what we want. +.PP +The +.I \-n +option of sort specifies a numeric sort rather than an alphabetic sort. +Thus +.DS +ls \-s | sort \-n +.DE +specifies that the output of the +.I ls +command run with the option +.I \-s +is to be +.I piped +to the command +.I sort +run with the numeric sort option. +This would give us a sorted list of our files by size, but with the +smallest first. +We could then use the +.I \-r +reverse sort option and the +.I head +command in combination with the previous command doing +.DS +ls \-s | sort \-n \-r | head \-5 +.DE +Here we have taken a list of our files sorted alphabetically, +each with the size in blocks. +We have run this to the standard input of the +.I sort +command asking it to sort numerically in reverse order (largest first). +This output has then been run into the command +.I head +which gives us the first few lines. +In this case we have asked +.I head +for the first 5 lines. +Thus this command gives us the names and sizes of our 5 largest files. +.PP +The notation introduced above is called the +.I pipe +mechanism. +Commands separated by `\||\|' characters are connected together by the +shell and the standard output of each is run into the standard input of the +next. +The leftmost command in a pipeline will normally take its standard +input from the terminal and the rightmost will place its standard +output on the terminal. +Other examples of pipelines will be given later when we discuss the +history mechanism; +one important use of pipes which is illustrated there is in the +routing of information to the line printer. +.NH 2 +Filenames +.PP +Many commands to be executed will need the names of files as arguments. +\s-2UNIX\s0 +.I pathnames +consist of a number of +.I components +separated by `/'. +Each component except the last names a directory in which the next +component resides, in effect specifying the +.I path +of directories to follow to reach the file. +Thus the pathname +.DS +/etc/motd +.DE +specifies a file in the directory +`etc' +which is a subdirectory of the +.I root +directory `/'. +Within this directory the file named is `motd' which stands +for `message of the day'. +A +.I pathname +that begins with a slash is said to be an +.I absolute +pathname since it is specified from the absolute top of the entire +directory hierarchy of the system (the +.I root ). +.I Pathnames +which do not begin with `/' are interpreted as starting in the current +.I "working directory" , +which is, by default, your +.I home +directory and can be changed dynamically by the +.I cd +change directory command. +Such pathnames are said to be +.I relative +to the working directory since they are found by starting +in the working directory and descending to lower levels of directories +for each +.I component +of the pathname. If the pathname contains no slashes at all then the +file is contained in the working directory itself and the pathname is merely +the name of the file in this directory. +Absolute pathnames have no relation +to the working directory. +.PP +Most filenames consist of a number of alphanumeric characters and +`.'s (periods). +In fact, all printing characters except `/' (slash) may appear in filenames. +It is inconvenient to have most non-alphabetic characters in filenames +because many of these have special meaning to the shell. +The character `.' (period) is not a shell-metacharacter and is often used +to separate the +.I extension +of a file name from the base of the name. +Thus +.DS +prog.c prog.o prog.errs prog.output +.DE +are four related files. +They share a +.I base +portion of a name +(a base portion being that part of the name that is left when a trailing +`.' and following characters which are not `.' are stripped off). +The file +`prog.c' +might be the source for a C program, +the file `prog.o' the corresponding object file, +the file +`prog.errs' the errors resulting from a compilation of the program +and the file +`prog.output' the output of a run of the program. +.PP +If we wished to refer to all four of these files in a command, we could +use the notation +.DS +prog.* +.DE +This expression is expanded by the shell, before the command to which it is +an argument is executed, into a list of names which begin with `prog.'. +The character `*' here matches any sequence (including the empty sequence) +of characters in a file name. +The names which match are alphabetically sorted and placed in the +.I "argument list" +of the command. +Thus the command +.DS +echo prog.* +.DE +will echo the names +.DS +prog.c prog.errs prog.o prog.output +.DE +Note that the names are in sorted order here, and a different +order than we listed them above. +The +.I echo +command receives four words as arguments, even though we only typed +one word as an argument directly. +The four words were generated by +.I "filename expansion" +of the one input word. +.PP +Other notations for +.I "filename expansion" +are also available. +The character `?' matches any single character in a filename. +Thus +.DS +echo ? \|?? \|??? +.DE +will echo a line of filenames; first those with one character names, +then those with two character names, and finally those with three +character names. +The names of each length will be independently sorted. +.PP +Another mechanism consists of a sequence of characters between `[' and `]'. +This metasequence matches any single character from the enclosed set. +Thus +.DS +prog.[co] +.DE +will match +.DS +prog.c prog.o +.DE +in the example above. +We can also place two characters around a `\-' in this notation to denote +a range. +Thus +.DS +chap.[1\-5] +.DE +might match files +.DS +chap.1 chap.2 chap.3 chap.4 chap.5 +.DE +if they existed. +This is shorthand for +.DS +chap.[12345] +.DE +and otherwise equivalent. +.PP +An important point to note is that if a list of argument words to +a command (an +.I "argument list)" +contains filename expansion syntax, and if this filename expansion syntax +fails to match any existing file names, then the shell considers this +to be an error and prints a diagnostic +.DS +No match. +.DE +and does not execute the command. +.PP +Another very important point is that files with the character `.' at the +beginning are treated specially. +Neither `*' or `?' or the `[' `]' mechanism will match it. +This prevents accidental matching of the filenames `.' and `..' +in the working directory which have special meaning to the system, +as well as other files such as +.I \&.cshrc +which are not normally +visible. +We will discuss the special role of the file +.I \&.cshrc +later. +.PP +Another filename expansion mechanism gives access to the pathname of +the +.I home +directory of other users. +This notation consists of the character `~' (tilde) followed by another user's +login name. +For instance the word `~bill' would map to the pathname `/usr/bill' +if the home directory for `bill' was `/usr/bill'. +Since, on large systems, users may have login directories scattered over +many different disk volumes with different prefix directory names, +this notation provides a convenient way of accessing the files +of other users. +.PP +A special case of this notation consists of a `~' alone, e.g. `~/mbox'. +This notation is expanded by the shell into the file `mbox' in your +.I home +directory, i.e. into `/usr/bill/mbox' for me on Ernie Co-vax, the UCB +Computer Science Department VAX machine, where this document was prepared. +This can be very useful if you have used +.I cd +to change to another directory and have found a file you wish to +copy using +.I cp. +If I give the command +.DS +cp thatfile ~ +.DE +the shell will expand this command to +.DS +cp thatfile /usr/bill +.DE +since my home directory is /usr/bill. +.PP +There also exists a mechanism using the characters `{' and `}' for +abbreviating a set of words which have common parts but cannot +be abbreviated by the above mechanisms because they are not files, +are the names of files which do not yet exist, +are not thus conveniently described. +This mechanism will be described much later, +in section 4.2, +as it is used less frequently. +.NH 2 +Quotation +.PP +We have already seen a number of metacharacters used by the shell. +These metacharacters pose a problem in that we cannot use them directly +as parts of words. +Thus the command +.DS +echo * +.DE +will not echo the character `*'. +It will either echo a sorted list of filenames in the +current +.I "working directory," +or print the message `No match' if there are +no files in the working directory. +.PP +The recommended mechanism for placing characters which are neither numbers, +digits, `/', `.' or `\-' in an argument word to a command is to enclose +it with single quotation characters `\'', i.e. +.DS +echo \'*\' +.DE +There is one special character `!' which is used by the +.I history +mechanism of the shell and which cannot be +.I escaped +by placing it within `\'' characters. +It and the character `\'' itself can be preceded by a single `\e' +to prevent their special meaning. +Thus +.DS +echo \e\'\e! +.DE +prints +.DS +\'! +.DE +These two mechanisms suffice to place any printing character into a word +which is an argument to a shell command. They can be combined, as in +.DS +echo \e\'\'*\' +.DE +which prints +.DS +\'* +.DE +since the first `\e' escaped the first `\'' and the `*' was enclosed +between `\'' characters. +.NH 2 +Terminating commands +.PP +When you are executing a command and the shell is +waiting for it to complete there are several ways +to force it to stop. +For instance if you type the command +.DS +cat /etc/passwd +.DE +the system will print a copy of a list of all users of the system +on your terminal. +This is likely to continue for several minutes unless you stop it. +You can send an +\s-2INTERRUPT\s0 +.I signal +to the +.I cat +command by typing ^C on your terminal.* +.FS +*On some older Unix systems the \s-2DEL\s0 or \s-2RUBOUT\s0 key +has the same effect. "stty all" will tell you the INTR key value. +.FE +Since +.I cat +does not take any precautions to avoid or otherwise handle this signal +the +\s-2INTERRUPT\s0 +will cause it to terminate. +The shell notices that +.I cat +has terminated and prompts you again with `% '. +If you hit \s-2INTERRUPT\s0 again, the shell will just +repeat its prompt since it handles \s-2INTERRUPT\s0 signals +and chooses to continue to execute commands rather than terminating +like +.I cat +did, which would have the effect of logging you out. +.PP +Another way in which many programs terminate is when they get an end-of-file +from their standard input. +Thus the +.I mail +program in the first example above was terminated when we typed a ^D +which generates an end-of-file from the standard input. +The shell also terminates when it gets an end-of-file printing `logout'; +\s-2UNIX\s0 then logs you off the system. +Since this means that typing too many ^D's can accidentally log us off, +the shell has a mechanism for preventing this. +This +.I ignoreeof +option will be discussed in section 2.2. +.PP +If a command has its standard input redirected from a file, then it will +normally terminate when it reaches the end of this file. +Thus if we execute +.DS +mail bill < prepared.text +.DE +the mail command will terminate without our typing a ^D. +This is because it read to the end-of-file of our file +`prepared.text' in which we placed a message for `bill' with an editor program. +We could also have done +.DS +cat prepared.text \||\| mail bill +.DE +since the +.I cat +command would then have written the text through the pipe to the +standard input of the mail command. +When the +.I cat +command completed it would have terminated, +closing down the pipeline +and the +.I mail +command would have received an end-of-file from it and terminated. +Using a pipe here is more complicated than redirecting input +so we would more likely use the first form. +These commands could also have been stopped by sending an \s-2INTERRUPT\s0. +.PP +Another possibility for stopping a command is to suspend its execution +temporarily, with the possibility of continuing execution later. This is +done by sending a \s-2STOP\s0 signal via typing a ^Z. +This signal causes all commands running on the terminal +(usually one but more if a pipeline is executing) to become suspended. +The shell notices that the command(s) have been suspended, types +`Stopped' and then prompts for a new command. +The previously executing command has been suspended, but otherwise +unaffected by the \s-2STOP\s0 signal. Any other commands can be executed +while the original command remains suspended. The suspended command can +be continued using the +.I fg +command with no arguments. The shell will then retype the command +to remind you which command is being continued, and cause the command +to resume execution. Unless any input files in use by the suspended +command have been changed in the meantime, the suspension has no effect +whatsoever on the execution of the command. This feature can be very useful +during editing, when you need to look at another file before continuing. +An +example of command suspension follows. +.DS +% mail harold +Someone just copied a big file into my directory and its name is +^Z +Stopped +% ls +funnyfile +prog.c +prog.o +% jobs +.ta 1.75i +[1] + Stopped mail harold +% fg +mail harold +funnyfile. Do you know who did it? +EOT +% +.so tabs +.DE +In this example someone was sending a message to Harold and forgot the +name of the file he wanted to mention. The mail command was suspended +by typing ^Z. When the shell noticed that the mail program was +suspended, it typed `Stopped' and prompted for a new command. Then the +.I ls +command was typed to find out the name of the file. The +.I jobs +command was run to find out which command was suspended. +At this time the +.I fg +command was typed to continue execution of the mail program. Input +to the mail program was then continued and ended with a ^D +which indicated the end of the message at which time the mail +program typed EOT. The +.I jobs +command will show which commands are suspended. +The ^Z should only be typed at the beginning of a line since +everything typed on the current line is discarded when a signal is sent +from the keyboard. This also happens on \s-2INTERRUPT\s0, and \s-2QUIT\s0 +signals. More information on +suspending jobs and controlling them is given in +section 2.6. +.PP +If you write or run programs which are not fully debugged then it may +be necessary to stop them somewhat ungracefully. +This can be done by sending them a \s-2QUIT\s0 +signal, sent by typing a ^\e. +This will usually provoke the shell to produce a message like: +.DS +Quit (Core dumped) +.DE +indicating that a file +`core' has been created containing information about the running program's +state when it terminated due to the \s-2QUIT\s0 signal. +You can examine this file yourself, or forward information to the +maintainer of the program telling him/her where the +.I "core file" +is. +.PP +If you run background commands (as explained in section 2.6) then these +commands will ignore \s-2INTERRUPT\s0 and \s-2QUIT\s0 signals at the +terminal. To stop them you must use the +.I kill +command. See section 2.6 for an example. +.PP +If you want to examine the output of a command without having it move +off the screen as the output of the +.DS +cat /etc/passwd +.DE +command will, you can use the command +.DS +more /etc/passwd +.DE +The +.I more +program pauses after each complete screenful and types `\-\-More\-\-' +at which point you can hit a space to get another screenful, a return +to get another line, a `?' to get some help on other commands, or a `q' to end the +.I more +program. You can also use more as a filter, i.e. +.DS +cat /etc/passwd | more +.DE +works just like the more simple more command above. +.PP +For stopping output of commands not involving +.I more +you can use the +^S key to stop the typeout. The typeout will resume when you +hit ^Q or any other key, but ^Q is normally used because +it only restarts the output and does not become input to the program +which is running. This works well on low-speed terminals, but at 9600 +baud it is hard to type ^S and ^Q fast enough to paginate +the output nicely, and a program like +.I more +is usually used. +.PP +An additional possibility is to use the ^O flush output +character; when this character is typed, all output from the current +command is thrown away (quickly) until the next input read occurs +or until the next shell prompt. This can be used to allow a command +to complete without having to suffer through the output on a slow +terminal; ^O is a toggle, so flushing can be turned off by +typing ^O again while output is being flushed. +.NH 2 +What now? +.PP +We have so far seen a number of mechanisms of the shell and learned a lot +about the way in which it operates. +The remaining sections will go yet further into the internals of the +shell, but you will surely want to try using the +shell before you go any further. +To try it you can log in to \s-2UNIX\s0 and type the following +command to the system: +.DS +chsh myname /bin/csh +.DE +Here `myname' should be replaced by the name you typed to +the system prompt of `login:' to get onto the system. +Thus I would use `chsh bill /bin/csh'. +.B +You only have to do this once; it takes effect at next login. +.R +You are now ready to try using +.I csh. +.PP +Before you do the `chsh' command, the shell you are using when +you log into the system is `/bin/sh'. +In fact, much of the above discussion is applicable to `/bin/sh'. +The next section will introduce many features particular to +.I csh +so you should change your shell to +.I csh +before you begin reading it. +.bp diff --git a/share/doc/usd/04.csh/csh.2 b/share/doc/usd/04.csh/csh.2 new file mode 100644 index 0000000..5fbf43c --- /dev/null +++ b/share/doc/usd/04.csh/csh.2 @@ -0,0 +1,1304 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)csh.2 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.nr H1 1 +.NH +Details on the shell for terminal users +.NH 2 +Shell startup and termination +.PP +When you login, the shell is started by the system in your +.I home +directory and begins by reading commands from a file +.I \&.cshrc +in this directory. +All shells which you may start during your terminal session will +read from this file. +We will later see what kinds of commands are usefully placed there. +For now we need not have this file and the shell does not complain about +its absence. +.PP +A +.I "login shell" , +executed after you login to the system, +will, after it reads commands from +.I \&.cshrc, +read commands from a file +.I \&.login +also in your home directory. +This file contains commands which you wish to do each time you login +to the \s-2UNIX\s0 system. +My +.I \&.login +file looks something like: +.DS +set ignoreeof +set mail=(/usr/spool/mail/bill) +echo "${prompt}users" ; users +alias ts \e + \'set noglob ; eval \`tset \-s \-m dialup:c100rv4pna \-m plugboard:?hp2621nl \!*\`\'; +ts; stty intr ^C kill ^U crt +set time=15 history=10 +msgs \-f +if (\-e $mail) then + echo "${prompt}mail" + mail +endif +.DE +.PP +This file contains several commands to be executed by \s-2UNIX\s0 +each time I login. +The first is a +.I set +command which is interpreted directly by the shell. It sets the shell +variable +.I ignoreeof +which causes the shell to not log me off if I hit ^D. Rather, +I use the +.I logout +command to log off of the system. +By setting the +.I mail +variable, I ask the shell to watch for incoming mail to me. Every 5 minutes +the shell looks for this file and tells me if more mail has arrived there. +An alternative to this is to put the command +.DS +biff y +.DE +in place of this +.I set; +this will cause me to be notified immediately when mail arrives, and to +be shown the first few lines of the new message. +.PP +Next I set the shell variable `time' to `15' causing the shell to automatically +print out statistics lines for commands which execute for at least 15 seconds +of \s-2CPU\s+2 time. The variable `history' is set to 10 indicating that +I want the shell to remember the last 10 commands I type in its +.I "history list" , +(described later). +.PP +I create an +.I alias +``ts'' which executes a +\fItset\fR\|(1) command setting up the modes of the terminal. +The parameters to +.I tset +indicate the kinds of terminal which I usually use when not on a hardwired +port. I then execute ``ts'' and also use the +.I stty +command to change the interrupt character to ^C and the line kill +character to ^U. +.PP +I then run the `msgs' program, which provides me with any +system messages which I have not seen before; the `\-f' option here prevents +it from telling me anything if there are no new messages. +Finally, if my mailbox file exists, then I run the `mail' program to +process my mail. +.PP +When the `mail' and `msgs' programs finish, the shell will finish +processing my +.I \&.login +file and begin reading commands from the terminal, prompting for each with +`% '. +When I log off (by giving the +.I logout +command) the shell +will print `logout' and execute commands from the file `.logout' +if it exists in my home directory. +After that the shell will terminate and \s-2UNIX\s0 will log +me off the system. +If the system is not going down, I will receive a new login message. +In any case, after the `logout' message the shell is committed to terminating +and will take no further input from my terminal. +.NH 2 +Shell variables +.PP +The shell maintains a set of +.I variables. +We saw above the variables +.I history +and +.I time +which had values `10' and `15'. +In fact, each shell variable has as value an array of +zero or more +.I strings. +Shell variables may be assigned values by the set command. It has +several forms, the most useful of which was given above and is +.DS +set name=value +.DE +.PP +Shell variables may be used to store values which are to +be used in commands later through a substitution mechanism. +The shell variables most commonly referenced are, however, those which the +shell itself refers to. +By changing the values of these variables one can directly affect the +behavior of the shell. +.PP +One of the most important variables is the variable +.I path. +This variable contains a sequence of directory names where the shell +searches for commands. +The +.I set +command with no arguments +shows the value of all variables currently defined (we usually say +.I set) +in the shell. +The default value for path will be shown by +.I set +to be +.DS +% set +.ta .75i +argv () +cwd /usr/bill +home /usr/bill +path (. /usr/ucb /bin /usr/bin) +prompt % +shell /bin/csh +status 0 +term c100rv4pna +user bill +% +.so tabs +.DE +This output indicates that the variable path points to the current +directory `.' and then `/usr/ucb', `/bin' and `/usr/bin'. +Commands which you may write might be in `.' (usually one of +your directories). +Commands developed at Berkeley, live in `/usr/ucb' +while commands developed at Bell Laboratories live in `/bin' and `/usr/bin'. +.PP +A number of locally developed programs on the system live in the directory +`/usr/local'. +If we wish that all shells which we invoke to have +access to these new programs we can place the command +.DS +set path=(. /usr/ucb /bin /usr/bin /usr/local) +.DE +in our file +.I \&.cshrc +in our home directory. +Try doing this and then logging out and back in and do +.DS +set +.DE +again to see that the value assigned to +.I path +has changed. +.FS \(dg +Another directory that might interest you is /usr/new, which contains +many useful user-contributed programs provided with Berkeley Unix. +.FE +.PP +One thing you should be aware of is that the shell examines each directory +which you insert into your path and determines which commands are contained +there. Except for the current directory `.', which the shell treats specially, +this means that if commands are added to a directory in your search path after +you have started the shell, they will not necessarily be found by the shell. +If you wish to use a command which has been added in this way, you should +give the command +.DS +rehash +.DE +to the shell, which will cause it to recompute its internal table of command +locations, so that it will find the newly added command. +Since the shell has to look in the current directory `.' on each command, +placing it at the end of the path specification usually works equivalently +and reduces overhead. +.PP +Other useful built in variables are the variable +.I home +which shows your home directory, +.I cwd +which contains your current working directory, +the variable +.I ignoreeof +which can be set in your +.I \&.login +file to tell the shell not to exit when it receives an end-of-file from +a terminal (as described above). +The variable `ignoreeof' +is one of several variables which the shell does not care about the +value of, only whether they are +.I set +or +.I unset. +Thus to set this variable you simply do +.DS +set ignoreeof +.DE +and to unset it do +.DS +unset ignoreeof +.DE +These give the variable `ignoreeof' no value, but none is desired or required. +.PP +Finally, some other built-in shell variables of use are the +variables +.I noclobber +and +.I mail. +The metasyntax +.DS +> filename +.DE +which redirects the standard output of a command +will overwrite and destroy the previous contents of the named file. +In this way you may accidentally overwrite a file which is valuable. +If you would prefer that the shell not overwrite files in this +way you can +.DS +set noclobber +.DE +in your +.I \&.login +file. +Then trying to do +.DS +date > now +.DE +would cause a diagnostic if `now' existed already. +You could type +.DS +date >! now +.DE +if you really wanted to overwrite the contents of `now'. +The `>!' is a special metasyntax indicating that clobbering the +file is ok.\(dg +.FS +\(dgThe space between the `!' and the word `now' is critical here, as `!now' +would be an invocation of the +.I history +mechanism, and have a totally different effect. +.FE +.NH 2 +The shell's history list +.PP +The shell can maintain a +.I "history list" +into which it places the words +of previous commands. +It is possible to use a notation to reuse commands or words +from commands in forming new commands. +This mechanism can be used to repeat previous commands or to +correct minor typing mistakes in commands. +.PP +The following figure gives a sample session involving typical usage of the +history mechanism of the shell. +.KF +.DS +% cat bug.c +main() + +{ + printf("hello); +} +% cc !$ +cc bug.c +"bug.c", line 4: newline in string or char constant +"bug.c", line 5: syntax error +% ed !$ +ed bug.c +29 +4s/);/"&/p + printf("hello"); +w +30 +q +% !c +cc bug.c +% a.out +hello% !e +ed bug.c +30 +4s/lo/lo\e\en/p + printf("hello\en"); +w +32 +q +% !c \-o bug +cc bug.c \-o bug +% size a.out bug +a.out: 2784+364+1028 = 4176b = 0x1050b +bug: 2784+364+1028 = 4176b = 0x1050b +% ls \-l !* +ls \-l a.out bug +\(mirwxr\(mixr\(mix 1 bill 3932 Dec 19 09:41 a.out +\(mirwxr\(mixr\(mix 1 bill 3932 Dec 19 09:42 bug +% bug +hello +% num bug.c | spp +spp: Command not found. +% ^spp^ssp +num bug.c | ssp + 1 main() + 3 { + 4 printf("hello\en"); + 5 } +% !! | lpr +num bug.c | ssp | lpr +% +.DE +.KE +In this example we have a very simple C program which has a bug (or two) +in it in the file `bug.c', which we `cat' out on our terminal. We then +try to run the C compiler on it, referring to the file again as `!$', +meaning the last argument to the previous command. Here the `!' is the +history mechanism invocation metacharacter, and the `$' stands for the last +argument, by analogy to `$' in the editor which stands for the end of the line. +The shell echoed the command, as it would have been typed without use of +the history mechanism, and then executed it. +The compilation yielded error diagnostics so we now run the editor on the +file we were trying to compile, fix the bug, and run the C compiler again, +this time referring to this command simply as `!c', which repeats the last +command which started with the letter `c'. If there were other +commands starting with `c' done recently we could have said `!cc' or even +`!cc:p' which would have printed the last command starting with `cc' +without executing it. +.PP +After this recompilation, we ran the resulting `a.out' file, and then +noting that there still was a bug, ran the editor again. After fixing +the program we ran the C compiler again, but tacked onto the command +an extra `\-o bug' telling the compiler to place the resultant binary in +the file `bug' rather than `a.out'. In general, the history mechanisms +may be used anywhere in the formation of new commands and other characters +may be placed before and after the substituted commands. +.PP +We then ran the `size' command to see how large the binary program images +we have created were, and then an `ls \-l' command with the same argument +list, denoting the argument list `\!*'. +Finally we ran the program `bug' to see that its output is indeed correct. +.PP +To make a numbered listing of the program we ran the `num' command on the file `bug.c'. +In order to compress out blank lines in the output of `num' we ran the +output through the filter `ssp', but misspelled it as spp. To correct this +we used a shell substitute, placing the old text and new text between `^' +characters. This is similar to the substitute command in the editor. +Finally, we repeated the same command with `!!', but sent its output to the +line printer. +.PP +There are other mechanisms available for repeating commands. The +.I history +command prints out a number of previous commands with numbers by which +they can be referenced. There is a way to refer to a previous command +by searching for a string which appeared in it, and there are other, +less useful, ways to select arguments to include in a new command. +A complete description of all these mechanisms +is given in the C shell manual pages in the \s-2UNIX\s0 Programmer's Manual. +.NH 2 +Aliases +.PP +The shell has an +.I alias +mechanism which can be used to make transformations on input commands. +This mechanism can be used to simplify the commands you type, +to supply default arguments to commands, +or to perform transformations on commands and their arguments. +The alias facility is similar to a macro facility. +Some of the features obtained by aliasing can be obtained also +using shell command files, but these take place in another instance +of the shell and cannot directly affect the current shells environment +or involve commands such as +.I cd +which must be done in the current shell. +.PP +As an example, suppose that there is a new version of the mail program +on the system called `newmail' +you wish to use, rather than the standard mail program which is called +`mail'. +If you place the shell command +.DS +alias mail newmail +.DE +in your +.I \&.cshrc +file, the shell will transform an input line of the form +.DS +mail bill +.DE +into a call on `newmail'. +More generally, suppose we wish the command `ls' to always show +sizes of files, that is to always do `\-s'. +We can do +.DS +alias ls ls \-s +.DE +or even +.DS +alias dir ls \-s +.DE +creating a new command syntax `dir' +which does an `ls \-s'. +If we say +.DS +dir ~bill +.DE +then the shell will translate this to +.DS +ls \-s /mnt/bill +.DE +.PP +Thus the +.I alias +mechanism can be used to provide short names for commands, +to provide default arguments, +and to define new short commands in terms of other commands. +It is also possible to define aliases which contain multiple +commands or pipelines, showing where the arguments to the original +command are to be substituted using the facilities of the +history mechanism. +Thus the definition +.DS +alias cd \'cd \e!* ; ls \' +.DE +would do an +.I ls +command after each change directory +.I cd +command. +We enclosed the entire alias definition in `\'' characters to prevent +most substitutions from occurring and the character `;' from being +recognized as a metacharacter. +The `!' here is escaped with a `\e' to prevent it from being interpreted +when the alias command is typed in. +The `\e!*' here substitutes the entire argument list to the pre-aliasing +.I cd +command, without giving an error if there were no arguments. +The `;' separating commands is used here +to indicate that one command is to be done and then the next. +Similarly the definition +.DS +alias whois \'grep \e!^ /etc/passwd\' +.DE +defines a command which looks up its first argument in the password file. +.PP +.B Warning: +The shell currently reads the +.I \&.cshrc +file each time it starts up. If you place a large number of commands +there, shells will tend to start slowly. A mechanism for saving the shell +environment after reading the \fI\&.cshrc\fR file and quickly restoring it is +under development, but for now you should try to limit the number of +aliases you have to a reasonable number... 10 or 15 is reasonable, +50 or 60 will cause a noticeable delay in starting up shells, and make +the system seem sluggish when you execute commands from within the editor +and other programs. +.NH 2 +More redirection; >> and >& +.PP +There are a few more notations useful to the terminal user +which have not been introduced yet. +.PP +In addition to the standard output, commands also have a +.I "diagnostic output" +which is normally directed to the terminal even when the standard output +is redirected to a file or a pipe. +It is occasionally desirable to direct the diagnostic output along with +the standard output. +For instance if you want to redirect the output of a long running command +into a file and wish to have a record of any error diagnostic it produces +you can do +.DS +command >& file +.DE +The `>&' here tells the shell to route both the diagnostic output and the +standard output into `file'. +Similarly you can give the command +.DS +command |\|& lpr +.DE +to route both standard and diagnostic output through the pipe +to the line printer daemon +.I lpr.\(dd +.FS +\(dd A command of the form +.br +.ti +5 +command >&! file +.br +exists, and is used when +.I noclobber +is set and +.I file +already exists. +.FE +.PP +Finally, it is possible to use the form +.DS +command >> file +.DE +to place output at the end of an existing file.\(dg +.FS +\(dg If +.I noclobber +is set, then an error will result if +.I file +does not exist, otherwise the shell will create +.I file +if it doesn't exist. +A form +.br +.ti +5 +command >>! file +.br +makes it not be an error for file to not exist when +.I noclobber +is set. +.FE +.NH 2 +Jobs; Background, Foreground, or Suspended +.PP +When one or more commands +are typed together as a pipeline or as a sequence of commands separated by +semicolons, a single +.I job +is created by the shell consisting of these commands together as a unit. +Single commands without pipes or semicolons create the simplest jobs. +Usually, every line typed to the shell creates a job. +Some lines that create jobs (one per line) are +.DS +sort < data +ls \-s | sort \-n | head \-5 +mail harold +.DE +.PP +If the metacharacter `&' is typed +at the end of the commands, then the job is started as a +.I background +job. This means that the shell does not wait for it to complete but +immediately prompts and is ready for another command. The job runs +.I "in the background" +at the same time that normal jobs, called +.I foreground +jobs, continue to be read and executed by the shell one at a time. +Thus +.DS +du > usage & +.DE +would run the +.I du +program, which reports on the disk usage of your working directory (as well as +any directories below it), put the output into the file `usage' and return +immediately with a prompt for the next command without out waiting for +.I du +to finish. The +.I du +program would continue executing in the background +until it finished, even though you can type and execute more commands in the +mean time. +When a background +job terminates, a message is typed by the shell just before the next prompt +telling you that the job has completed. +In the following example the +.I du +job finishes sometime during the +execution of the +.I mail +command and its completion is reported just before +the prompt after the +.I mail +job is finished. +.DS +% du > usage & +[1] 503 +% mail bill +How do you know when a background job is finished? +EOT +.ta 1.75i +[1] \- Done du > usage +% +.so tabs +.DE +If the job did not terminate normally the `Done' message might say +something else like `Killed'. +If you want the +terminations of background jobs to be reported at the time they occur +(possibly interrupting the output of other foreground jobs), you can set +the +.I notify +variable. In the previous example this would mean that the +`Done' message might have come right in the middle of the message to +Bill. +Background jobs are unaffected by any signals from the keyboard like +the \s-2STOP\s0, \s-2INTERRUPT\s0, or \s-2QUIT\s0 signals mentioned earlier. +.PP +Jobs are recorded in a table inside the shell until they terminate. +In this table, the shell remembers the command names, arguments and the +.I "process numbers" +of all commands in the job as well as the working directory where the job was +started. +Each job in the table is either running +.I "in the foreground" +with the shell waiting for it to terminate, running +.I "in the background," +or +.I suspended. +Only one job can be running in the foreground at one time, but several +jobs can be suspended or running in the background at once. As each job +is started, it is assigned a small identifying +number called the +.I "job number" +which can be used later to refer to the job in the commands described below. +Job numbers remain +the same until the job terminates and then are re-used. +.PP +When a job is started in the background using `&', its number, as well +as the process numbers of all its (top level) commands, is typed by the shell +before prompting you for another command. +For example, +.DS +% ls \-s | sort \-n > usage & +[2] 2034 2035 +% +.DE +runs the `ls' program with the `\-s' options, pipes this output into +the `sort' program with the `\-n' option which puts its output into the +file `usage'. +Since the `&' was at the end of the line, these two programs were started +together as a background job. After starting the job, the shell prints +the job number in brackets (2 in this case) followed by the process number +of each program started in the job. Then the shell immediates prompts for +a new command, leaving the job running simultaneously. +.PP +As mentioned in section 1.8, foreground jobs become +.I suspended +by typing ^Z +which sends a \s-2STOP\s0 signal to the currently running +foreground job. A background job can become suspended by using the +.I stop +command described below. When jobs are suspended they merely stop +any further progress until started again, either in the foreground +or the background. The shell notices when a job becomes stopped and +reports this fact, much like it reports the termination of background jobs. +For foreground jobs this looks like +.DS +% du > usage +^Z +Stopped +% +.DE +`Stopped' message is typed by the shell when it notices that the +.I du +program stopped. +For background jobs, using the +.I stop +command, it is +.DS +% sort usage & +[1] 2345 +% stop %1 +.ta 1.75i +[1] + Stopped (signal) sort usage +% +.so tabs +.DE +Suspending foreground jobs can be very useful when you need to temporarily +change what you are doing (execute other commands) and then return to +the suspended job. Also, foreground jobs can be suspended and then +continued as background jobs using the +.I bg +command, allowing you to continue other work and +stop waiting for the foreground job to finish. Thus +.DS +% du > usage +^Z +Stopped +% bg +[1] du > usage & +% +.DE +starts `du' in the foreground, stops it before it finishes, then continues +it in the background allowing more foreground commands to be executed. +This is especially helpful +when a foreground job ends up taking longer than you expected and you +wish you had started it in the background in the beginning. +.PP +All +.I "job control" +commands can take an argument that identifies a particular +job. +All job name arguments begin with the character `%', since some of the +job control commands also accept process numbers (printed by the +.I ps +command.) +The default job (when no argument is given) is called the +.I current +job and is identified by a `+' in the output of the +.I jobs +command, which shows you which jobs you have. +When only one job is stopped or running in the background (the usual case) +it is always the current job thus no argument is needed. +If a job is stopped while running in the foreground it becomes the +.I current +job and the existing current job becomes the +.I previous +job \- identified by a `\-' in the output of +.I jobs. +When the current job terminates, the previous job becomes the current job. +When given, the argument is either `%\-' (indicating +the previous job); `%#', where # is the job number; +`%pref' where pref is some unique prefix of the command name +and arguments of one of the jobs; or `%?' followed by some string found +in only one of the jobs. +.PP +The +.I jobs +command types the table of jobs, giving the job number, +commands and status (`Stopped' or `Running') of each background or +suspended job. With the `\-l' option the process numbers are also +typed. +.DS +% du > usage & +[1] 3398 +% ls \-s | sort \-n > myfile & +[2] 3405 +% mail bill +^Z +Stopped +% jobs +.ta 1.75i +[1] \(mi Running du > usage +[2] Running ls \-s | sort \-n > myfile +[3] \(pl Stopped mail bill +% fg %ls +ls \-s | sort \-n > myfile +% more myfile +.so tabs +.DE +.PP +The +.I fg +command runs a suspended or background job in the foreground. It is +used to restart a previously suspended job or change a background job +to run in the foreground (allowing signals or input from the terminal). +In the above example we used +.I fg +to change the `ls' job from the +background to the foreground since we wanted to wait for it to +finish before looking at its output file. +The +.I bg +command runs a suspended job in the background. It is usually used +after stopping the currently running foreground job with the +\s-2STOP\s0 signal. The combination of the \s-2STOP\s0 signal and the +.I bg +command changes a foreground job into a background job. +The +.I stop +command suspends a background job. +.PP +The +.I kill +command terminates a background or suspended job immediately. +In addition to jobs, it may be given process numbers as arguments, +as printed by +.I ps. +Thus, in the example above, the running +.I du +command could have been terminated by the command +.DS +% kill %1 +.ta 1.75i +[1] Terminated du > usage +% +.so tabs +.DE +.PP +The +.I notify +command (not the variable mentioned earlier) indicates that the termination +of a specific job should be +reported at the time it finishes instead of waiting for the next prompt. +.PP +If a job running in the background tries to read input from the terminal +it is automatically stopped. When such a job is then run in the +foreground, input can be given to the job. If desired, the job can +be run in the background again until it requests input again. +This is illustrated in the following sequence where the `s' command in the +text editor might take a long time. +.ID +.nf +% ed bigfile +120000 +1,$s/thisword/thatword/ +^Z +Stopped +% bg +[1] ed bigfile & +% + . . . some foreground commands +.ta 1.75i +[1] Stopped (tty input) ed bigfile +% fg +ed bigfile +w +120000 +q +% +.so tabs +.DE +So after the `s' command was issued, the `ed' job was stopped with ^Z +and then put in the background using +.I bg. +Some time later when the `s' command was finished, +.I ed +tried to read another command and was stopped because jobs +in the background cannot read from the terminal. The +.I fg +command returned the `ed' job to the foreground where it could once again +accept commands from the terminal. +.PP +The command +.DS +stty tostop +.DE +causes all background jobs run on your terminal to stop +when they are about to +write output to the terminal. This prevents messages from background +jobs from interrupting foreground job output and allows you to run +a job in the background without losing terminal output. It also +can be used for interactive programs that sometimes have long +periods without interaction. Thus each time it outputs a prompt for more +input it will stop before the prompt. It can then be run in the +foreground using +.I fg, +more input can be given and, if necessary stopped and returned to +the background. This +.I stty +command might be a good thing to put in your +.I \&.login +file if you do not like output from background jobs interrupting +your work. It also can reduce the need for redirecting the output +of background jobs if the output is not very big: +.DS +% stty tostop +% wc hugefile & +[1] 10387 +% ed text +\&. . . some time later +q +.ta 1.75i +[1] Stopped (tty output) wc hugefile +% fg wc +wc hugefile + 13371 30123 302577 +% stty \-tostop +.so tabs +.DE +Thus after some time the `wc' command, which counts the lines, words +and characters in a file, had one line of output. When it tried to +write this to the terminal it stopped. By restarting it in the +foreground we allowed it to write on the terminal exactly when we were +ready to look at its output. +Programs which attempt to change the mode of the terminal will also +block, whether or not +.I tostop +is set, when they are not in the foreground, as +it would be very unpleasant to have a background job change the state +of the terminal. +.PP +Since the +.I jobs +command only prints jobs started in the currently executing shell, +it knows nothing about background jobs started in other login sessions +or within shell files. The +.I ps +can be used in this case to find out about background jobs not started +in the current shell. +.NH 2 +Working Directories +.PP +As mentioned in section 1.6, the shell is always in a particular +.I "working directory." +The `change directory' command +.I chdir +(its +short form +.I cd +may also be used) +changes the working directory of the shell, +that is, changes the directory you +are located in. +.PP +It is useful to make a directory for each project you wish to work on +and to place all files related to that project in that directory. +The `make directory' command, +.I mkdir, +creates a new directory. +The +.I pwd +(`print working directory') command +reports the absolute pathname of the working directory of the shell, +that is, the directory you are +located in. +Thus in the example below: +.DS +% pwd +/usr/bill +% mkdir newpaper +% chdir newpaper +% pwd +/usr/bill/newpaper +% +.DE +the user has created and moved to the +directory +.I newpaper. +where, for example, he might +place a group of related files. +.PP +No matter where you have moved to in a directory hierarchy, +you can return to your `home' login directory by doing just +.DS +cd +.DE +with no arguments. +The name `..' always means the directory above the current one in +the hierarchy, thus +.DS +cd .. +.DE +changes the shell's working directory to the one directly above the +current one. +The name `..' can be used in any +pathname, thus, +.DS +cd ../programs +.DE +means +change to the directory `programs' contained in the directory +above the current one. +If you have several directories for different +projects under, say, your home directory, +this shorthand notation +permits you to switch easily between them. +.PP +The shell always remembers the pathname of its current working directory in +the variable +.I cwd. +The shell can also be requested to remember the previous directory when +you change to a new working directory. If the `push directory' command +.I pushd +is used in place of the +.I cd +command, the shell saves the name of the current working directory +on a +.I "directory stack" +before changing to the new one. +You can see this list at any time by typing the `directories' +command +.I dirs. +.ID +.nf +% pushd newpaper/references +~/newpaper/references ~ +% pushd /usr/lib/tmac +/usr/lib/tmac ~/newpaper/references ~ +% dirs +/usr/lib/tmac ~/newpaper/references ~ +% popd +~/newpaper/references ~ +% popd +~ +% +.DE +The list is printed in a horizontal line, reading left to right, +with a tilde (~) as +shorthand for your home directory\(emin this case `/usr/bill'. +The directory stack is printed whenever there is more than one +entry on it and it changes. +It is also printed by a +.I dirs +command. +.I Dirs +is usually faster and more informative than +.I pwd +since it shows the current working directory as well as any +other directories remembered in the stack. +.PP +The +.I pushd +command with no argument +alternates the current directory with the first directory in the +list. +The `pop directory' +.I popd +command without an argument returns you to the directory you were in prior to +the current one, discarding the previous current directory from the +stack (forgetting it). +Typing +.I popd +several times in a series takes you backward through the directories +you had been in (changed to) by +.I pushd +command. +There are other options to +.I pushd +and +.I popd +to manipulate the contents of the directory stack and to change +to directories not at the top of the stack; see the +.I csh +manual page for details. +.PP +Since the shell remembers the working directory in which each job +was started, it warns you when you might be confused by restarting +a job in the foreground which has a different working directory than the +current working directory of the shell. Thus if you start a background +job, then change the shell's working directory and then cause the +background job to run in the foreground, the shell warns you that the +working directory of the currently running foreground job is different +from that of the shell. +.DS +% dirs \-l +/mnt/bill +% cd myproject +% dirs +~/myproject +% ed prog.c +1143 +^Z +Stopped +% cd .. +% ls +myproject +textfile +% fg +ed prog.c (wd: ~/myproject) +.DE +This way the shell warns you when there +is an implied change of working directory, even though no cd command was +issued. In the above example the `ed' job was still in `/mnt/bill/project' +even though the shell had changed to `/mnt/bill'. +A similar warning is given when such a foreground job +terminates or is suspended (using the \s-2STOP\s0 signal) since +the return to the shell again implies a change of working directory. +.DS +% fg +ed prog.c (wd: ~/myproject) + . . . after some editing +q +(wd now: ~) +% +.DE +These messages are sometimes confusing if you use programs that change +their own working directories, since the shell only remembers which +directory a job is started in, and assumes it stays there. +The `\-l' option of +.I jobs +will type the working directory +of suspended or background jobs when it is different +from the current working directory of the shell. +.NH 2 +Useful built-in commands +.PP +We now give a few of the useful built-in commands of the shell describing +how they are used. +.PP +The +.I alias +command described above is used to assign new aliases and to show the +existing aliases. +With no arguments it prints the current aliases. +It may also be given only one argument such as +.DS +alias ls +.DE +to show the current alias for, e.g., `ls'. +.PP +The +.I echo +command prints its arguments. +It is often used in +.I "shell scripts" +or as an interactive command +to see what filename expansions will produce. +.PP +The +.I history +command will show the contents of the history list. +The numbers given with the history events can be used to reference +previous events which are difficult to reference using the +contextual mechanisms introduced above. +There is also a shell variable called +.I prompt. +By placing a `!' character in its value the shell will there substitute +the number of the current command in the history list. +You can use this number to refer to this command in a history substitution. +Thus you could +.DS +set prompt=\'\e! % \' +.DE +Note that the `!' character had to be +.I escaped +here even within `\'' characters. +.PP +The +.I limit +command is used to restrict use of resources. +With no arguments it prints the current limitations: +.DS +.ta 1i +cputime unlimited +filesize unlimited +datasize 5616 kbytes +stacksize 512 kbytes +coredumpsize unlimited +.so tabs +.DE +Limits can be set, e.g.: +.DS +limit coredumpsize 128k +.DE +Most reasonable units abbreviations will work; see the +.I csh +manual page for more details. +.PP +The +.I logout +command can be used to terminate a login shell which has +.I ignoreeof +set. +.PP +The +.I rehash +command causes the shell to recompute a table of where commands are +located. This is necessary if you add a command to a directory +in the current shell's search path and wish the shell to find it, +since otherwise the hashing algorithm may tell the shell that the +command wasn't in that directory when the hash table was computed. +.PP +The +.I repeat +command can be used to repeat a command several times. +Thus to make 5 copies of the file +.I one +in the file +.I five +you could do +.DS +repeat 5 cat one >> five +.DE +.PP +The +.I setenv +command can be used +to set variables in the environment. +Thus +.DS +setenv TERM adm3a +.DE +will set the value of the environment variable \s-2TERM\s0 +to +`adm3a'. +A user program +.I printenv +exists which will print out the environment. +It might then show: +.DS +% printenv +HOME=/usr/bill +SHELL=/bin/csh +PATH=:/usr/ucb:/bin:/usr/bin:/usr/local +TERM=adm3a +USER=bill +% +.DE +.PP +The +.I source +command can be used to force the current shell to read commands from +a file. +Thus +.DS +source .cshrc +.DE +can be used after editing in a change to the +.I \&.cshrc +file which you wish to take effect right away. +.PP +The +.I time +command can be used to cause a command to be timed no matter how much +\s-2CPU\s0 time it takes. +Thus +.DS +% time cp /etc/rc /usr/bill/rc +0.0u 0.1s 0:01 8% 2+1k 3+2io 1pf+0w +% time wc /etc/rc /usr/bill/rc + 52 178 1347 /etc/rc + 52 178 1347 /usr/bill/rc + 104 356 2694 total +0.1u 0.1s 0:00 13% 3+3k 5+3io 7pf+0w +% +.DE +indicates that the +.I cp +command used a negligible amount of user time (u) +and about 1/10th of a system time (s); the elapsed time was 1 second (0:01), +there was an average memory usage of 2k bytes of program space and 1k +bytes of data space over the cpu time involved (2+1k); the program +did three disk reads and two disk writes (3+2io), and took one page fault +and was not swapped (1pf+0w). +The word count command +.I wc +on the other hand used 0.1 seconds of user time and 0.1 seconds of system +time in less than a second of elapsed time. +The percentage `13%' indicates that over the period when it was active +the command `wc' used an average of 13 percent of the available \s-2CPU\s0 +cycles of the machine. +.PP +The +.I unalias +and +.I unset +commands can be used +to remove aliases and variable definitions from the shell, and +.I unsetenv +removes variables from the environment. +.NH 2 +What else? +.PP +This concludes the basic discussion of the shell for terminal users. +There are more features of the shell to be discussed here, and all +features of the shell are discussed in its manual pages. +One useful feature which is discussed later is the +.I foreach +built-in command which can be used to run the same command +sequence with a number of different arguments. +.PP +If you intend to use \s-2UNIX\s0 a lot you should look through +the rest of this document and the csh manual pages (section1) to become familiar +with the other facilities which are available to you. +.bp diff --git a/share/doc/usd/04.csh/csh.3 b/share/doc/usd/04.csh/csh.3 new file mode 100644 index 0000000..76ee1eb --- /dev/null +++ b/share/doc/usd/04.csh/csh.3 @@ -0,0 +1,649 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)csh.3 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.nr H1 2 +.NH +Shell control structures and command scripts +.NH 2 +Introduction +.PP +It is possible to place commands in files and to cause shells to be +invoked to read and execute commands from these files, +which are called +.I "shell scripts." +We here detail those features of the shell useful to the writers of such +scripts. +.NH 2 +Make +.PP +It is important to first note what shell scripts are +.I not +useful for. +There is a program called +.I make +which is very useful for maintaining a group of related files +or performing sets of operations on related files. +For instance a large program consisting of one or more files +can have its dependencies described in a +.I makefile +which contains definitions of the commands used to create these +different files when changes occur. +Definitions of the means for printing listings, cleaning up the directory +in which the files reside, and installing the resultant programs +are easily, and most appropriately placed in this +.I makefile. +This format is superior and preferable to maintaining a group of shell +procedures to maintain these files. +.PP +Similarly when working on a document a +.I makefile +may be created which defines how different versions of the document +are to be created and which options of +.I nroff +or +.I troff +are appropriate. +.NH 2 +Invocation and the argv variable +.PP +A +.I csh +command script may be interpreted by saying +.DS +% csh script ... +.DE +where +.I script +is the name of the file containing a group of +.I csh +commands and +`\&...' is replaced by a sequence of arguments. +The shell places these arguments in the variable +.I argv +and then begins to read commands from the script. +These parameters are then available through the same mechanisms +which are used to reference any other shell variables. +.PP +If you make the file +`script' +executable by doing +.DS +chmod 755 script +.DE +and place a shell comment at the beginning of the shell script +(i.e. begin the file with a `#' character) +then a `/bin/csh' will automatically be invoked to execute `script' when +you type +.DS +script +.DE +If the file does not begin with a `#' then the standard shell +`/bin/sh' will be used to execute it. +This allows you to convert your older shell scripts to use +.I csh +at your convenience. +.NH 2 +Variable substitution +.PP +After each input line is broken into words and history substitutions +are done on it, the input line is parsed into distinct commands. +Before each command is executed a mechanism know as +.I "variable substitution" +is done on these words. +Keyed by the character `$' this substitution replaces the names +of variables by their values. +Thus +.DS +echo $argv +.DE +when placed in a command script would cause the current value of the +variable +.I argv +to be echoed to the output of the shell script. +It is an error for +.I argv +to be unset at this point. +.PP +A number of notations are provided for accessing components and attributes +of variables. +The notation +.DS +$?name +.DE +expands to `1' if name is +.I set +or to `0' +if name is not +.I set. +It is the fundamental mechanism used for checking whether particular +variables have been assigned values. +All other forms of reference to undefined variables cause errors. +.PP +The notation +.DS +$#name +.DE +expands to the number of elements in the variable +.I name. +Thus +.DS +% set argv=(a b c) +% echo $?argv +1 +% echo $#argv +3 +% unset argv +% echo $?argv +0 +% echo $argv +Undefined variable: argv. +% +.DE +.PP +It is also possible to access the components of a variable +which has several values. +Thus +.DS +$argv[1] +.DE +gives the first component of +.I argv +or in the example above `a'. +Similarly +.DS +$argv[$#argv] +.DE +would give `c', +and +.DS +$argv[1\-2] +.DE +would give `a b'. Other notations useful in shell scripts are +.DS +$\fIn\fR +.DE +where +.I n +is an integer as a shorthand for +.DS +$argv[\fIn\fR\|] +.DE +the +.I n\|th +parameter and +.DS +$* +.DE +which is a shorthand for +.DS +$argv +.DE +The form +.DS +$$ +.DE +expands to the process number of the current shell. +Since this process number is unique in the system it can +be used in generation of unique temporary file names. +The form +.DS +$< +.DE +is quite special and is replaced by the next line of input read from +the shell's standard input (not the script it is reading). This is +useful for writing shell scripts that are interactive, reading +commands from the terminal, or even writing a shell script that +acts as a filter, reading lines from its input file. +Thus the sequence +.DS +echo 'yes or no?\ec' +set a=($<) +.DE +would write out the prompt `yes or no?' without a newline and then +read the answer into the variable `a'. In this case `$#a' would be +`0' if either a blank line or end-of-file (^D) was typed. +.PP +One minor difference between `$\fIn\fR\|' and `$argv[\fIn\fR\|]' +should be noted here. +The form +`$argv[\fIn\fR\|]' +will yield an error if +.I n +is not in the range +`1\-$#argv' +while `$n' +will never yield an out of range subscript error. +This is for compatibility with the way older shells handled parameters. +.PP +Another important point is that it is never an error to give a subrange +of the form `n\-'; if there are less than +.I n +components of the given variable then no words are substituted. +A range of the form `m\-n' likewise returns an empty vector without giving +an error when \fIm\fR exceeds the number of elements of the given variable, +provided the subscript \fIn\fR is in range. +.NH 2 +Expressions +.PP +In order for interesting shell scripts to be constructed it +must be possible to evaluate expressions in the shell based on the +values of variables. +In fact, all the arithmetic operations of the language C are available +in the shell +with the same precedence that they have in C. +In particular, the operations `==' and `!=' compare strings +and the operators `&&' and `|\|\||' implement the boolean and/or operations. +The special operators `=~' and `!~' are similar to `==' and `!=' except +that the string on the right side can have pattern matching characters +(like *, ? or []) and the test is whether the string on the left matches +the pattern on the right. +.PP +The shell also allows file enquiries of the form +.DS +\-? filename +.DE +where `?' is replace by a number of single characters. +For instance the expression primitive +.DS +\-e filename +.DE +tell whether the file +`filename' +exists. +Other primitives test for read, write and execute access to the file, +whether it is a directory, or has non-zero length. +.PP +It is possible to test whether a command terminates normally, +by a primitive of the +form `{ command }' which returns true, i.e. `1' if the command +succeeds exiting normally with exit status 0, or `0' if the command +terminates abnormally or with exit status non-zero. +If more detailed information about the execution status of a command +is required, it can be executed and the variable `$status' examined +in the next command. +Since `$status' is set by every command, it is very transient. +It can be saved if it is inconvenient to use it only in the single +immediately following command. +.PP +For a full list of expression components available see the manual +section for the shell. +.NH 2 +Sample shell script +.PP +A sample shell script which makes use of the expression mechanism +of the shell and some of its control structure follows: +.DS +% cat copyc +# +# Copyc copies those C programs in the specified list +# to the directory ~/backup if they differ from the files +# already in ~/backup +# +set noglob +foreach i ($argv) + + if ($i !~ *.c) continue # not a .c file so do nothing + + if (! \-r ~/backup/$i:t) then + echo $i:t not in backup... not cp\e\'ed + continue + endif + + cmp \-s $i ~/backup/$i:t # to set $status + + if ($status != 0) then + echo new backup of $i + cp $i ~/backup/$i:t + endif +end +.DE +.PP +This script makes use of the +.I foreach +command, which causes the shell to execute the commands between the +.I foreach +and the matching +.I end +for each of the values given between `(' and `)' with the named +variable, in this case `i' set to successive values in the list. +Within this loop we may use the command +.I break +to stop executing the loop +and +.I continue +to prematurely terminate one iteration +and begin the next. +After the +.I foreach +loop the iteration variable +(\fIi\fR in this case) +has the value at the last iteration. +.PP +We set the variable +.I noglob +here to prevent filename expansion of the members of +.I argv. +This is a good idea, in general, if the arguments to a shell script +are filenames which have already been expanded or if the arguments +may contain filename expansion metacharacters. +It is also possible to quote each use of a `$' variable expansion, +but this is harder and less reliable. +.PP +The other control construct used here is a statement of the form +.DS +\fBif\fR ( expression ) \fBthen\fR + command + ... +\fBendif\fR +.DE +The placement of the keywords here is +.B not +flexible due to the current implementation of the shell.\(dg +.FS +\(dgThe following two formats are not currently acceptable to the shell: +.sp +.in +5 +.nf +\fBif\fR ( expression ) # \fBWon't work!\fR +\fBthen\fR + command + ... +\fBendif\fR +.fi +.in -5 +.sp +and +.sp +.in +5 +.nf +\fBif\fR ( expression ) \fBthen\fR command \fBendif\fR # \fBWon't work\fR +.in -5 +.fi +.FE +.PP +The shell does have another form of the if statement of the form +.DS +\fBif\fR ( expression ) \fBcommand\fR +.DE +which can be written +.DS +\fBif\fR ( expression ) \e + command +.DE +Here we have escaped the newline for the sake of appearance. +The command must not involve `\||\|', `&' or `;' +and must not be another control command. +The second form requires the final `\e' to +.B immediately +precede the end-of-line. +.PP +The more general +.I if +statements above also admit a sequence of +.I else\-if +pairs followed by a single +.I else +and an +.I endif, +e.g.: +.DS +\fBif\fR ( expression ) \fBthen\fR + commands +\fBelse\fR \fBif\fR (expression ) \fBthen\fR + commands +\&... + +\fBelse\fR + commands +\fBendif\fR +.DE +.PP +Another important mechanism used in shell scripts is the `:' modifier. +We can use the modifier `:r' here to extract a root of a filename or +`:e' to extract the +.I extension. +Thus if the variable +.I i +has the value +`/mnt/foo.bar' +then +.sp +.in +5 +.nf +% echo $i $i:r $i:e +/mnt/foo.bar /mnt/foo bar +% +.sp +.in -5 +.fi +shows how the `:r' modifier strips off the trailing `.bar' and the +the `:e' modifier leaves only the `bar'. +Other modifiers will take off the last component of a pathname leaving +the head `:h' or all but the last component of a pathname leaving the +tail `:t'. +These modifiers are fully described in the +.I csh +manual pages in the User's Reference Manual. +It is also possible to use the +.I "command substitution" +mechanism described in the next major section to perform modifications +on strings to then reenter the shell's environment. +Since each usage of this mechanism involves the creation of a new process, +it is much more expensive to use than the `:' modification mechanism.\(dd +.FS +\(dd It is also important to note that +the current implementation of the shell limits the number of `:' modifiers +on a `$' substitution to 1. +Thus +.sp +.nf +.in +5 +% echo $i $i:h:t +/a/b/c /a/b:t +% +.in -5 +.fi +.sp +does not do what one would expect. +.FE +Finally, we note that the character `#' lexically introduces a shell +comment in shell scripts (but not from the terminal). +All subsequent characters on the input line after a `#' are discarded +by the shell. +This character can be quoted using `\'' or `\e' to place it in +an argument word. +.NH 2 +Other control structures +.PP +The shell also has control structures +.I while +and +.I switch +similar to those of C. +These take the forms +.DS +\fBwhile\fR ( expression ) + commands +\fBend\fR +.DE +and +.DS +\fBswitch\fR ( word ) + +\fBcase\fR str1: + commands + \fBbreaksw\fR + +\& ... + +\fBcase\fR strn: + commands + \fBbreaksw\fR + +\fBdefault:\fR + commands + \fBbreaksw\fR + +\fBendsw\fR +.DE +For details see the manual section for +.I csh. +C programmers should note that we use +.I breaksw +to exit from a +.I switch +while +.I break +exits a +.I while +or +.I foreach +loop. +A common mistake to make in +.I csh +scripts is to use +.I break +rather than +.I breaksw +in switches. +.PP +Finally, +.I csh +allows a +.I goto +statement, with labels looking like they do in C, i.e.: +.DS +loop: + commands + \fBgoto\fR loop +.DE +.NH 2 +Supplying input to commands +.PP +Commands run from shell scripts receive by default the standard +input of the shell which is running the script. +This is different from previous shells running +under \s-2UNIX\s0. It allows shell scripts to fully participate +in pipelines, but mandates extra notation for commands which are to take +inline data. +.PP +Thus we need a metanotation for supplying inline data to commands in +shell scripts. +As an example, consider this script which runs the editor to +delete leading blanks from the lines in each argument file: +.DS +% cat deblank +# deblank \-\- remove leading blanks +foreach i ($argv) +ed \- $i << \'EOF\' +1,$s/^[ ]*// +w +q +\&\'EOF\' +end +% +.DE +The notation `<< \'EOF\'' +means that the standard input for the +.I ed +command is to come from the text in the shell script file +up to the next line consisting of exactly `\'EOF\''. +The fact that the `EOF' is enclosed in `\'' characters, i.e. quoted, +causes the shell to not perform variable substitution on the +intervening lines. +In general, if any part of the word following the `<<' which the +shell uses to terminate the text to be given to the command is quoted +then these substitutions will not be performed. +In this case since we used the form `1,$' in our editor script +we needed to insure that this `$' was not variable substituted. +We could also have insured this by preceding the `$' here with a `\e', +i.e.: +.DS +1,\e$s/^[ ]*// +.DE +but quoting the `EOF' terminator is a more reliable way of achieving the +same thing. +.NH 2 +Catching interrupts +.PP +If our shell script creates temporary files, we may wish to catch +interruptions of the shell script so that we can clean up +these files. +We can then do +.DS +onintr label +.DE +where +.I label +is a label in our program. +If an interrupt is received the shell will do a +`goto label' +and we can remove the temporary files and then do an +.I exit +command (which is built in to the shell) +to exit from the shell script. +If we wish to exit with a non-zero status we can do +.DS +exit(1) +.DE +e.g. to exit with status `1'. +.NH 2 +What else? +.PP +There are other features of the shell useful to writers of shell +procedures. +The +.I verbose +and +.I echo +options and the related +.I \-v +and +.I \-x +command line options can be used to help trace the actions of the shell. +The +.I \-n +option causes the shell only to read commands and not to execute +them and may sometimes be of use. +.PP +One other thing to note is that +.I csh +will not execute shell scripts which do not begin with the +character `#', that is shell scripts that do not begin with a comment. +Similarly, the `/bin/sh' on your system may well defer to `csh' +to interpret shell scripts which begin with `#'. +This allows shell scripts for both shells to live in harmony. +.PP +There is also another quotation mechanism using `"' which allows +only some of the expansion mechanisms we have so far discussed to occur +on the quoted string and serves to make this string into a single word +as `\'' does. +.bp diff --git a/share/doc/usd/04.csh/csh.4 b/share/doc/usd/04.csh/csh.4 new file mode 100644 index 0000000..7ef24dc --- /dev/null +++ b/share/doc/usd/04.csh/csh.4 @@ -0,0 +1,176 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)csh.4 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.nr H1 3 +.NH +Other, less commonly used, shell features +.NH 2 +Loops at the terminal; variables as vectors +.PP +It is occasionally useful to use the +.I foreach +control structure at the terminal to aid in performing a number +of similar commands. +For instance, there were at one point three shells in use on the Cory \s-2UNIX\s0 +system at Cory Hall, +`/bin/sh', +`/bin/nsh', +and +`/bin/csh'. +To count the number of persons using each shell one could have issued +the commands +.DS +% grep \-c csh$ /etc/passwd +27 +% grep \-c nsh$ /etc/passwd +128 +% grep \-c \-v sh$ /etc/passwd +430 +% +.DE +Since these commands are very similar we can use +.I foreach +to do this more easily. +.DS +% foreach i (\'sh$\' \'csh$\' \'\-v sh$\') +? grep \-c $i /etc/passwd +? end +27 +128 +430 +% +.DE +Note here that the shell prompts for +input with `? ' when reading the body of the loop. +.PP +Very useful with loops are variables which contain lists of filenames +or other words. +You can, for example, do +.DS +% set a=(\`ls\`) +% echo $a +csh.n csh.rm +% ls +csh.n +csh.rm +% echo $#a +2 +% +.DE +The +.I set +command here gave the variable +.I a +a list of all the filenames in the current directory as value. +We can then iterate over these names to perform any chosen function. +.PP +The output of a command within `\`' characters is converted by +the shell to a list of words. +You can also place the `\`' quoted string within `"' characters +to take each (non-empty) line as a component of the variable; +preventing the lines from being split into words at blanks and tabs. +A modifier `:x' exists which can be used later to expand each component +of the variable into another variable splitting it into separate words +at embedded blanks and tabs. +.NH 2 +Braces { ... } in argument expansion +.PP +Another form of filename expansion, alluded +to before involves the characters `{' and `}'. +These characters specify that the contained strings, separated by `,' +are to be consecutively substituted into the containing characters +and the results expanded left to right. +Thus +.DS +A{str1,str2,...strn}B +.DE +expands to +.DS +Astr1B Astr2B ... AstrnB +.DE +This expansion occurs before the other filename expansions, and may +be applied recursively (i.e. nested). +The results of each expanded string are sorted separately, left +to right order being preserved. +The resulting filenames are not required to exist if no other expansion +mechanisms are used. +This means that this mechanism can be used to generate arguments which are +not filenames, but which have common parts. +.PP +A typical use of this would be +.DS +mkdir ~/{hdrs,retrofit,csh} +.DE +to make subdirectories `hdrs', `retrofit' and `csh' +in your home directory. +This mechanism is most useful when the common prefix is longer +than in this example, i.e. +.DS +chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}} +.DE +.NH 2 +Command substitution +.PP +A command enclosed in `\`' characters is replaced, just before +filenames are expanded, by the output from that command. +Thus it is possible to do +.DS +set pwd=\`pwd\` +.DE +to save the current directory in the variable +.I pwd +or to do +.DS +ex \`grep \-l TRACE *.c\` +.DE +to run the editor +.I ex +supplying as arguments those files whose names end in `.c' +which have the string `TRACE' in them.* +.FS +*Command expansion also occurs in input redirected with `<<' +and within `"' quotations. +Refer to the shell manual section for full details. +.FE +.NH 2 +Other details not covered here +.PP +In particular circumstances it may be necessary to know the exact +nature and order of different substitutions performed by the shell. +The exact meaning of certain combinations of quotations is also +occasionally important. +These are detailed fully in its manual section. +.PP +The shell has a number of command line option flags mostly of use +in writing \s-2UNIX\s0 programs, +and debugging shell scripts. +See the csh(1) manual section for a list of these options. +.bp diff --git a/share/doc/usd/04.csh/csh.a b/share/doc/usd/04.csh/csh.a new file mode 100644 index 0000000..22c8f76 --- /dev/null +++ b/share/doc/usd/04.csh/csh.a @@ -0,0 +1,93 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)csh.a 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.SH +Appendix \- Special characters +.LP +The following table lists the special characters of +.I csh +and the \s-2UNIX\s0 system, giving for each the section(s) in which it +is discussed. +A number of these characters also have special meaning in expressions. +See the +.I csh +manual section +for a complete list. +.ta .75i 1.5i 2.25i +.LP +Syntactic metacharacters +.DS +; 2.4 separates commands to be executed sequentially +| 1.5 separates commands in a pipeline +( ) 2.2,3.6 brackets expressions and variable values +& 2.5 follows commands to be executed without waiting for completion +.DE +.LP +Filename metacharacters +.DS +/ 1.6 separates components of a file's pathname +\&. 1.6 separates root parts of a file name from extensions +? 1.6 expansion character matching any single character +* 1.6 expansion character matching any sequence of characters +[ ] 1.6 expansion sequence matching any single character from a set +~ 1.6 used at the beginning of a filename to indicate home directories +{ } 4.2 used to specify groups of arguments with common parts +.DE +.LP +Quotation metacharacters +.DS +\e 1.7 prevents meta-meaning of following single character +\' 1.7 prevents meta-meaning of a group of characters +" 4.3 like \', but allows variable and command expansion +.DE +.LP +Input/output metacharacters +.DS +< 1.5 indicates redirected input +> 1.3 indicates redirected output +.DE +.LP +Expansion/substitution metacharacters +.DS +$ 3.4 indicates variable substitution +! 2.3 indicates history substitution +: 3.6 precedes substitution modifiers +^ 2.3 used in special forms of history substitution +\` 4.3 indicates command substitution +.DE +.LP +Other metacharacters +.DS +# 1.3,3.6 begins scratch file names; indicates shell comments +\- 1.2 prefixes option (flag) arguments to commands +% 2.6 prefixes job name specifications +.DE +.bp diff --git a/share/doc/usd/04.csh/csh.g b/share/doc/usd/04.csh/csh.g new file mode 100644 index 0000000..ba1b161 --- /dev/null +++ b/share/doc/usd/04.csh/csh.g @@ -0,0 +1,1719 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)csh.g 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.SH +Glossary +.PP +This glossary lists the most important terms introduced in the +introduction to the +shell and gives references to sections of the shell +document for further information about them. +References of the form +`pr (1)' +indicate that the command +.I pr +is in the \s-2UNIX\s0 User Reference manual in section 1. +You can look at an online copy of its manual page by doing +.DS +man 1 pr +.DE +References of the form (2.5) +indicate that more information can be found in section 2.5 of this +manual. +.IP \&\fB.\fR 15n +Your current directory has the name `.' as well as the name printed +by the command +.I pwd; +see also +.I dirs. +The current directory `.' is usually the first +.I component +of the search path contained in the variable +.I path , +thus commands which are in `.' are found first (2.2). +The character `.' is also used in separating +.I components +of filenames +(1.6). +The character `.' at the beginning of a +.I component +of a +.I pathname +is treated specially and not matched by the +.I "filename expansion" +metacharacters `?', `*', and `[' `]' pairs (1.6). +.IP \&\fB..\fR +Each directory has a file `..' in it which is a reference to its +parent directory. +After changing into the directory with +.I chdir , +i.e. +.DS +chdir paper +.DE +you can return to the parent directory by doing +.DS +chdir .. +.DE +The current directory is printed by +.I pwd +(2.7). +.IP a.out +Compilers which create executable images create them, by default, in the +file +.I a.out. +for historical reasons (2.3). +.IP "absolute pathname" +.br +A +.I pathname +which begins with a `/' is +.I absolute +since it specifies the +.I path +of directories from the beginning +of the entire directory system \- called the +.I root +directory. +.I Pathname s +which are not +.I absolute +are called +.I relative +(see definition of +.I "relative pathname" ) +(1.6). +.IP alias +An +.I alias +specifies a shorter or different name for a \s-2UNIX\s0 +command, or a transformation on a command to be performed in +the shell. +The shell has a command +.I alias +which establishes +.I aliases +and can print their current values. +The command +.I unalias +is used to remove +.I aliases +(2.4). +.IP argument +Commands in \s-2UNIX\s0 receive a list of +.I argument +words. +Thus the command +.DS +echo a b c +.DE +consists of the +.I "command name" +`echo' and three +.I argument +words `a', `b' and `c'. +The set of +.I arguments +after the +.I "command name" +is said to be the +.I "argument list" +of the command (1.1). +.IP argv +The list of arguments to a command written in the shell language +(a shell script or shell procedure) is stored in a variable called +.I argv +within the shell. +This name is taken from the conventional name in the +C programming language (3.4). +.IP background +Commands started without waiting for them to complete are called +.I background +commands (2.6). +.IP base +A filename is sometimes thought of as consisting of a +.I base +part, before any `.' character, and an +.I extension +\- the part after +the `.'. See +.I filename +and +.I extension +(1.6) and basename (1). +.IP bg +The +.I bg +command causes a +.I suspended +job to continue execution in the +.I background +(2.6). +.IP bin +A directory containing binaries of programs and shell scripts to be +executed is typically called a +.I bin +directory. +The standard system +.I bin +directories are `/bin' containing the most +heavily used commands and `/usr/bin' which contains most other user +programs. +Programs developed at UC Berkeley live in `/usr/ucb', while locally +written programs live in `/usr/local'. Games are kept in the directory +`/usr/games'. +You can place binaries in any directory. +If you wish to execute them often, the name of the directories +should be a +.I component +of the variable +.I path . +.IP break +.I Break +is a builtin command used to exit from loops within the control +structure of the shell (3.7). +.IP breaksw +The +.I breaksw +builtin command is used to exit from a +.I switch +control structure, like a +.I break +exits from loops (3.7). +.IP builtin +A command executed directly by the shell is called a +.I builtin +command. +Most commands in \s-2UNIX\s0 are not built into the shell, +but rather exist as files in +.I bin +directories. +These commands are accessible because the directories in which +they reside are named in the +.I path +variable. +.IP case +A +.I case +command is used as a label in a +.I switch +statement in the shell's control structure, similar to that of the +language C. +Details are given in the shell documentation `csh (1)' (3.7). +.IP cat +The +.I cat +program catenates a list of specified files on the +.I "standard output" . +It is usually used to look at the contents of a single file on the terminal, +to `cat a file' (1.8, 2.3). +.IP cd +The +.I cd +command is used to change the +.I "working directory" . +With no arguments, +.I cd +changes your +.I "working directory" +to be your +.I home +directory (2.4, 2.7). +.IP chdir +The +.I chdir +command is a synonym for +.I cd . +.I Cd +is usually used because it is easier to type. +.IP chsh +The +.I chsh +command is used to change the shell which you use on \s-2UNIX\s0. +By default, you use a different version of the shell +which resides in `/bin/sh'. +You can change your shell to `/bin/csh' by doing +.DS +chsh your-login-name /bin/csh +.DE +Thus I would do +.DS +chsh bill /bin/csh +.DE +It is only necessary to do this once. +The next time you log in to \s-2UNIX\s0 after doing this command, +you will be using +.I csh +rather than the shell in `/bin/sh' (1.9). +.IP cmp +.I Cmp +is a program which compares files. +It is usually used on binary files, or to see if two files are identical (3.6). +For comparing text files the program +.I diff , +described in `diff (1)' is used. +.IP command +A function performed by the system, either by the shell +(a builtin +.I command ) +or by a program residing in a file in +a directory within the \s-2UNIX\s0 system, is called a +.I command +(1.1). +.IP "command name" +.br +When a command is issued, it consists of a +.I "command name" , +which is the first word of the command, +followed by arguments. +The convention on \s-2UNIX\s0 is that the first word of a +command names the function to be performed (1.1). +.IP "command substitution" +.br +The replacement of a command enclosed in `\`' characters +by the text output by that command +is called +.I "command substitution" +(4.3). +.IP component +A part of a +.I pathname +between `/' characters is called a +.I component +of that +.I pathname . +A variable +which has multiple strings as value is said to have +several +.I component s; +each string is a +.I component +of the variable. +.IP continue +A builtin command which causes execution of the enclosing +.I foreach +or +.I while +loop to cycle prematurely. +Similar to the +.I continue +command in the programming language C (3.6). +.IP control- +Certain special characters, called +.I control +characters, are produced by holding down the \s-2CONTROL\s0 key +on your terminal and simultaneously pressing another character, much like +the \s-2SHIFT\s0 key is used to produce upper case characters. Thus +.I control- c +is produced by holding down the \s-2CONTROL\s0 key while pressing the +`c' key. Usually \s-2UNIX\s0 prints a caret (^) followed by the +corresponding letter when you type a +.I control +character (e.g. `^C' for +.I control- c +(1.8). +.IP "core\ dump" +When a program terminates abnormally, the system places an image +of its current state in a file named `core'. +This +.I "core dump" +can be examined with the system debugger `adb (1)' +or `sdb (1)' in order to determine what went wrong with the program (1.8). +If the shell produces a message of the form +.DS +Illegal instruction (core dumped) +.DE +(where `Illegal instruction' is only one of several possible +messages), you should report this to the author of the program +or a system administrator, +saving the `core' file. +.IP cp +The +.I cp +(copy) program is used to copy the contents of one file into another +file. +It is one of the most commonly used \s-2UNIX\s0 commands (1.6). +.IP csh +The name of the shell +program that this document describes. +.IP \&.cshrc +The file +.I \&.cshrc +in your +.I home +directory is read by each shell as it begins execution. +It is usually used to change the setting of the variable +.I path +and to set +.I alias +parameters which are to take effect globally (2.1). +.IP cwd +The +.I cwd +variable in the shell holds the +.I "absolute pathname" +of the current +.I "working directory" \&. +It is changed by the shell whenever your current +.I "working directory" +changes and should not be changed otherwise (2.2). +.IP date +The +.I date +command prints the current date and time (1.3). +.IP debugging +.I Debugging +is the process of correcting mistakes in programs and shell scripts. +The shell has several options and variables which may be used +to aid in shell +.I debugging +(4.4). +.IP default: +The label +.I default: +is used within shell +.I switch +statements, as it is in the C language +to label the code to be executed if none of the +.I case +labels matches the value switched on (3.7). +.IP \s-2DELETE\s0 +The +\s-2DELETE\s0 +or +\s-2RUBOUT\s0 +key on the terminal normally causes an interrupt to be sent to the current job. +Many users change the interrupt character to be ^C. +.IP detached +A command that continues running in the +.I background +after you logout is said to be +.I detached . +.IP diagnostic +An error message produced by a program is often referred to as a +.I diagnostic . +Most error messages are not written to the +.I "standard output" , +since that is often directed away from the terminal (1.3, 1.5). +Error messsages are instead written to the +.I "diagnostic output" +which may be directed away from the terminal, but usually is not. +Thus +.I diagnostics +will usually appear on the terminal (2.5). +.IP directory +A structure which contains files. +At any time you are in one particular +.I directory +whose names can be printed by the command +.I pwd . +The +.I chdir +command will change you to another +.I directory , +and make the files +in that +.I directory +visible. The +.I directory +in which you are when you first login is your +.I home +directory (1.1, 2.7). +.IP "directory\ stack" +The shell saves the names of previous +.I "working directories" +in the +.I "directory stack" +when you change your current +.I "working directory" +via the +.I pushd +command. The +.I "directory stack" +can be printed by using the +.I dirs +command, which includes your current +.I "working directory" +as the first directory name on the left (2.7). +.IP dirs +The +.I dirs +command prints the shell's +.I "directory stack" +(2.7). +.IP du +The +.I du +command is a program (described in `du (1)') which +prints the number of disk blocks is all directories below +and including your current +.I "working directory" +(2.6). +.IP echo +The +.I echo +command prints its arguments (1.6, 3.6). +.IP else +The +.I else +command is part of the `if-then-else-endif' control +command construct (3.6). +.IP endif +If an +.I if +statement is ended with the word +.I then , +all lines following the +.I if +up to a line starting with the word +.I endif +or +.I else +are executed if the condition between parentheses after the +.I if +is true (3.6). +.IP \s-2EOF\s0 +An +.I "end\f1-\fPof\f1-\fPfile" +is generated by the terminal by a control-d, +and whenever a command reads to the end of a file which +it has been given as input. +Commands receiving input from a +.I pipe +receive an +.I "end\f1-\fPof\f1-\fPfile" +when the command sending them input completes. +Most commands terminate when they receive an +.I "end\f1-\fPof\f1-\fPfile" . +The shell has an option to ignore +.I "end\f1-\fPof\f1-\fPfile" +from a terminal +input which may help you keep from logging out accidentally +by typing too many control-d's (1.1, 1.8, 3.8). +.IP escape +A character `\e' used to prevent the special meaning of a metacharacter +is said to +.I escape +the character from its special meaning. +Thus +.DS +echo \e* +.DE +will echo the character `*' while just +.DS +echo * +.DE +will echo the names of the file in the current directory. +In this example, \e +.I escape s +`*' (1.7). +There is also a non-printing character called +.I escape , +usually labelled +\s-2ESC\s0 +or +\s-2ALTMODE\s0 +on terminal keyboards. +Some older \s-2UNIX\s0 systems use this character to indicate that +output is to be +.I suspended . +Most systems use control-s to stop the output and control-q to start it. +.IP /etc/passwd +This file contains information about the accounts currently on the +system. +It consists of a line for each account with fields separated by +`:' characters (1.8). +You can look at this file by saying +.DS +cat /etc/passwd +.DE +The commands +.I finger +and +.I grep +are often used to search for information in this file. +See `finger (1)', `passwd(5)', and `grep (1)' for more details. +.IP exit +The +.I exit +command is used to force termination of a shell script, +and is built into the shell (3.9). +.IP "exit\ status" +A command which discovers a problem may reflect this back to the command +(such as a shell) which invoked (executed) it. +It does this by returning a non-zero number as its +.I "exit status" , +a status of zero being considered +`normal termination'. +The +.I exit +command can be used to force a shell command script to give a non-zero +.I "exit status" +(3.6). +.IP expansion +The replacement of strings in the shell input which contain metacharacters +by other strings is referred to as the process of +.I expansion . +Thus the replacement of the word `*' by a sorted list of files +in the current directory is a `filename expansion'. +Similarly the replacement of the characters `!!' by the text of +the last command is a `history expansion'. +.I Expansions +are also referred to as +.I substitutions +(1.6, 3.4, 4.2). +.IP expressions +.I Expressions +are used in the shell +to control the conditional structures used in the writing of shell +scripts and in calculating values for these scripts. +The operators available in shell +.I expressions +are those of the language +C (3.5). +.IP extension +Filenames often consist of a +.I base +name and an +.I extension +separated by the character `.'. +By convention, groups of related files often share the same +.I root +name. +Thus if `prog.c' were a C program, then the object file for this +program would be stored in `prog.o'. +Similarly a paper written with the +`\-me' +nroff macro package might be stored in +`paper.me' +while a formatted version of this paper might be kept in +`paper.out' and a list of spelling errors in +`paper.errs' (1.6). +.IP fg +The +.I "job control" +command +.I fg +is used to run a +.I background +or +.I suspended +job in the +.I foreground +(1.8, 2.6). +.IP filename +Each file in \s-2UNIX\s0 has a name consisting of up to 14 characters +and not including the character `/' which is used in +.I pathname +building. Most +.I filenames +do not begin with the character `.', and contain +only letters and digits with perhaps a `.' separating the +.I base +portion of the +.I filename +from an +.I extension +(1.6). +.IP "filename expansion" +.br +.I "Filename expansion" +uses the metacharacters `*', `?' and `[' and `]' +to provide a convenient mechanism for naming files. +Using +.I "filename expansion" +it is easy to name all the files in +the current directory, or all files which have a common +.I root +name. Other +.I "filename expansion" +mechanisms use the metacharacter `~' and allow +files in other users' directories to be named easily (1.6, 4.2). +.IP flag +Many \s-2UNIX\s0 commands accept arguments which are not the names +of files or other users but are used to modify the action of the commands. +These are referred to as +.I flag +options, and by convention consist of one or more letters preceded by +the character `\-' (1.2). +Thus the +.I ls +(list files) command has an option +`\-s' to list the sizes of files. +This is specified +.DS +ls \-s +.DE +.IP foreach +The +.I foreach +command is used in shell scripts and at the terminal to specify +repetition of a sequence of commands while the value of a certain +shell variable ranges through a specified list (3.6, 4.1). +.IP foreground +When commands are executing in the normal way such that the +shell is waiting for them to finish before prompting for another +command they are said to be +.I "foreground jobs" +or +.I "running in the foreground" \&. +This is as opposed to +.I background . +.I Foreground +jobs can be stopped by signals +from the terminal caused by typing different +control characters at the keyboard (1.8, 2.6). +.IP goto +The shell has a command +.I goto +used in shell scripts to transfer control to a given label (3.7). +.IP grep +The +.I grep +command searches through a list of argument files for a specified string. +Thus +.DS +grep bill /etc/passwd +.DE +will print each line in the file +.I "/etc/passwd" +which contains the string `bill'. +Actually, +.I grep +scans for +.I "regular expressions" +in the sense of the editors +`ed (1)' and `ex (1)'. +.I Grep +stands for +`globally find +.I "regular expression" +and print' (2.4). +.IP head +The +.I head +command prints the first few lines of one or more files. +If you have a bunch of files containing text which you are wondering +about it is sometimes useful to run +.I head +with these files as arguments. +This will usually show enough of what is in these files to let you decide +which you are interested in (1.5). +.br +.I Head +is also used to describe the part of a +.I pathname +before and including the last `/' character. The +.I tail +of a +.I pathname +is the part after the last `/'. The `:h' and `:t' modifiers allow the +.I head +or +.I tail +of a +.I pathname +stored in a shell variable to be used (3.6). +.IP history +The +.I history +mechanism of the shell allows previous commands to be repeated, +possibly after modification to correct typing mistakes or to change +the meaning of the command. +The shell has a +.I "history list" +where these commands are kept, and a +.I history +variable which controls how large this list is (2.3). +.IP "home\ directory" +.br +Each user has a +.I "home directory" , +which is given in your entry +in the password file, +.I /etc/passwd . +This is the directory which you are placed in when you first login. +The +.I cd +or +.I chdir +command with no arguments takes you back to this directory, whose +name is recorded in the shell variable +.I home . +You can also access the +.I "home directories" +of other users in forming +filenames using a +.I "filename expansion" +notation and the character `~' (1.6). +.IP if +A conditional command within the shell, the +.I if +command is used in shell command scripts to make decisions +about what course of action to take next (3.6). +.IP ignoreeof +Normally, your shell will exit, printing +`logout' +if you type a control-d at a prompt of `% '. +This is the way you usually log off the system. +You can +.I set +the +.I ignoreeof +variable if you wish in your +.I \&.login +file and then use the command +.I logout +to logout. +This is useful if you sometimes accidentally type too many control-d +characters, logging yourself off +(2.2). +.IP input +Many commands on \s-2UNIX\s0 take information from the terminal or from +files which they then act on. +This information is called +.I input . +Commands normally read for +.I input +from their +.I "standard input" +which is, by default, the terminal. +This +.I "standard input" +can be redirected from a file using a shell metanotation +with the character `<'. +Many commands will also read from a file specified as argument. +Commands placed in +.I pipelines +will read from the output of the previous +command in the +.I pipeline . +The leftmost command in a +.I pipeline +reads from the terminal if +you neither redirect its +.I input +nor give it a filename to use as +.I "standard input" . +Special mechanisms exist for supplying input to commands in shell +scripts (1.5, 3.8). +.IP interrupt +An +.I interrupt +is a signal to a program that is generated by typing ^C. (On older versions +of UNIX the \s-2RUBOUT\s0 or \s-2DELETE\s0 key were used for this purpose.) +It causes most programs to stop execution. +Certain programs, such as the shell and the editors, +handle an +.I interrupt +in special ways, usually by stopping what they +are doing and prompting for another command. +While the shell is executing another command and waiting for it +to finish, the shell does not listen to +.I interrupts. +The shell often wakes up when you hit +.I interrupt +because many commands +die when they receive an +.I interrupt +(1.8, 3.9). +.IP job +One or more commands +typed on the same input line separated by `|' or `;' characters +are run together and are called a +.I job \&. +Simple commands run by themselves without any `|' or `;' characters +are the simplest +.I jobs. +.I Jobs +are classified as +.I foreground , +.I background , +or +.I suspended +(2.6). +.IP "job\ control" +The builtin functions that control the execution of +jobs are called +.I "job control" +commands. These are +.I "bg, fg, stop, kill" +(2.6). +.IP "job\ number" +When each job +is started it is assigned a small number called a +.I "job number" +which is printed next to the job in the output of the +.I jobs +command. This number, preceded by a `%' character, can be used as an argument +to +.I "job control" +commands to indicate +a specific job (2.6). +.IP jobs +The +.I jobs +command prints a table showing +jobs that are either running in the +.I background +or are +.I suspended +(2.6). +.IP kill +A command which sends a +signal +to a job causing it to terminate (2.6). +.IP \&.login +The file +.I \&.login +in your +.I home +directory is read by the shell each time you login to \s-2UNIX\s0 +and the commands there are executed. +There are a number of commands which are usefully placed here, +especially +.I set +commands to the shell itself (2.1). +.IP "login\ shell" +The shell that is started on your terminal when you login is called +your +.I "login shell" . +It is different from other shells which you may run (e.g. on +shell scripts) +in that it reads the +.I \&.login +file before reading commands from the terminal and it reads the +.I \&.logout +file after you logout +(2.1). +.IP logout +The +.I logout +command causes a login shell to exit. +Normally, a login shell will exit when you hit control-d +generating an +.I end\f1-\fPof\f1-\fPfile, +but if you have set +.I ignoreeof +in you +.I \&.login +file then this will not work and you must use +.I logout +to log off the \s-2UNIX\s0 system (2.8). +.IP \&.logout +When you log off of \s-2UNIX\s0 the shell will execute commands from +the file +.I \&.logout +in your +.I home +directory after it prints `logout'. +.IP lpr +The command +.I lpr +is the line printer daemon. +The standard input of +.I lpr +spooled and printed on the \s-2UNIX\s0 line printer. +You can also give +.I lpr +a list of filenames as arguments to be printed. +It is most common to use +.I lpr +as the last component of a +.I pipeline +(2.3). +.IP ls +The +.I ls +(list files) command is one of the most commonly used \s-2UNIX\s0 +commands. +With no argument filenames it prints the names of the files in the +current directory. +It has a number of useful +.I flag +arguments, and can also be given the names of directories +as arguments, in which case it lists the names of the files in these +directories (1.2). +.IP mail +The +.I mail +program is used to send and receive messages from other \s-2UNIX\s0 +users (1.1, 2.1), whether they are logged on or not. +.IP make +The +.I make +command is used to maintain one or more related files and to +organize functions to be performed on these files. +In many ways +.I make +is easier to use, and more helpful than +shell command scripts (3.2). +.IP makefile +The file containing commands for +.I make +is called +.I makefile +or +.I Makefile +(3.2). +.IP manual +The +.I manual +often referred to is the +`\s-2UNIX\s0 manual'. +It contains 8 numbered sections with a description of each \s-2UNIX\s0 +program (section 1), system call (section 2), subroutine (section 3), +device (section 4), special data structure (section 5), game (section 6), +miscellaneous item (section 7) and system administration program (section 8). +There are also supplementary documents (tutorials and reference guides) +for individual programs which require explanation in more detail. +An online version of the +.I manual +is accessible through the +.I man +command. +Its documentation can be obtained online via +.DS +man man +.DE +If you can't decide what manual page to look in, try the +.I apropos (1) +command. +The supplementary documents are in subdirectories of /usr/doc. +.IP metacharacter +.br +Many characters which are neither letters nor digits have special meaning +either to the shell or to \s-2UNIX\s0. +These characters are called +.I metacharacters . +If it is necessary to place these characters in arguments to commands +without them having their special meaning then they must be +.I quoted . +An example of a +.I metacharacter +is the character `>' which is used +to indicate placement of output into a file. +For the purposes of the +.I history +mechanism, +most unquoted +.I metacharacters +form separate words (1.4). +The appendix to this user's manual lists the +.I metacharacters +in groups by their function. +.IP mkdir +The +.I mkdir +command is used to create a new directory. +.IP modifier +Substitutions with the +.I history +mechanism, keyed by the character `!' +or of variables using the metacharacter `$', are often subjected +to modifications, indicated by placing the character `:' after the +substitution and following this with the +.I modifier +itself. +The +.I "command substitution" +mechanism can also be used to perform modification in a similar way, +but this notation is less clear (3.6). +.IP more +The program +.I more +writes a file on your terminal allowing you to control how much text +is displayed at a time. +.I More +can move through the file screenful by screenful, line by line, +search forward for a string, or start again at the beginning of the file. +It is generally the easiest way of viewing a file (1.8). +.IP noclobber +The shell has a variable +.I noclobber +which may be set in the file +.I \&.login +to prevent accidental destruction of files by the `>' output redirection +metasyntax of the shell (2.2, 2.5). +.IP noglob +The shell variable +.I noglob +is set to suppress the +.I "filename expansion" +of arguments containing the metacharacters `~', `*', `?', `[' and `]' (3.6). +.IP notify +The +.I notify +command tells the shell to report on the termination of a specific +.I "background job" +at the exact time it occurs as opposed to waiting +until just before the next prompt to report the termination. +The +.I notify +variable, if set, causes the shell to always report the termination +of +.I background +jobs exactly when they occur (2.6). +.IP onintr +The +.I onintr +command is built into the shell and is used to control the action +of a shell command script when an +.I interrupt +signal is received (3.9). +.IP output +Many commands in \s-2UNIX\s0 result in some lines of text which are +called their +.I output. +This +.I output +is usually placed on what is known as the +.I "standard output" +which is normally connected to the user's terminal. +The shell has a syntax using the metacharacter `>' for redirecting +the +.I "standard output" +of a command to a file (1.3). +Using the +.I pipe +mechanism and the metacharacter `|' it is also possible for +the +.I "standard output" +of one command to become the +.I "standard input" +of another command (1.5). +Certain commands such as the line printer daemon +.I p +do not place their results on the +.I "standard output" +but rather in more +useful places such as on the line printer (2.3). +Similarly the +.I write +command places its output on another user's terminal rather than its +.I "standard output" +(2.3). +Commands also have a +.I "diagnostic output" +where they write their error messages. +Normally these go to the terminal even if the +.I "standard output" +has been sent to a file or another command, but it is possible +to direct error diagnostics along with +.I "standard output" +using a special metanotation (2.5). +.IP path +The shell has a variable +.I path +which gives the names of the directories in which it searches for +the commands which it is given. +It always checks first to see if the command it is given is +built into the shell. +If it is, then it need not search for the command as it can do it internally. +If the command is not builtin, then the shell searches for a file +with the name given in each of the directories in the +.I path +variable, left to right. +Since the normal definition of the +.I path +variable is +.DS +path (. /usr/ucb /bin /usr/bin) +.DE +the shell normally looks in the current directory, and then in +the standard system directories `/usr/ucb', `/bin' and `/usr/bin' for the named +command (2.2). +If the command cannot be found the shell will print an error diagnostic. +Scripts of shell commands will be executed using another shell to interpret +them if they have `execute' permission set. +This is normally true because a command of the form +.DS +chmod 755 script +.DE +was executed to turn this execute permission on (3.3). +If you add new commands to a directory in the +.I path , +you should issue +the command +.I rehash +(2.2). +.IP pathname +A list of names, separated by `/' characters, forms a +.I pathname. +Each +.I component, +between successive `/' characters, names a directory +in which the next +.I component +file resides. +.I Pathnames +which begin with the character `/' are interpreted relative +to the +.I root +directory in the file system. +Other +.I pathnames +are interpreted relative to the current directory +as reported by +.I pwd. +The last component of a +.I pathname +may name a directory, but +usually names a file. +.IP pipeline +A group of commands which are connected together, the +.I "standard output" +of each connected to the +.I "standard input" +of the next, +is called a +.I pipeline. +The +.I pipe +mechanism used to connect these commands is indicated by +the shell metacharacter `|' (1.5, 2.3). +.IP popd +The +.I popd +command changes the shell's +.I "working directory" +to the directory you most recently left using the +.I pushd +command. It returns to the directory without having to type its name, +forgetting the name of the current +.I "working directory" +before doing so (2.7). +.IP port +The part of a computer system to which each terminal is +connected is called a +.I port . +Usually the system has a fixed number of +.I ports , +some of which are connected to telephone lines +for dial-up access, and some of which are permanently +wired directly to specific terminals. +.IP pr +The +.I pr +command is used to prepare listings of the contents of files +with headers giving the name of the file and the date and +time at which the file was last modified (2.3). +.IP printenv +The +.I printenv +command is used +to print the current setting of variables in the environment +(2.8). +.IP process +An instance of a running program is called a +.I process +(2.6). +\s-2UNIX\s0 assigns each +.I process +a unique number when it is +started \- called the +.I "process number" . +.I "Process numbers" +can be used to stop individual +.I processes +using the +.I kill +or +.I stop +commands when the +.I processes +are part of a detached +.I background +job. +.IP program +Usually synonymous with +.I command ; +a binary file or shell command script +which performs a useful function is often +called a +.I program . +.IP prompt +Many programs will print a +.I prompt +on the terminal when they expect input. +Thus the editor +`ex (1)' will print a `:' when it expects input. +The shell +.I prompts +for input with `% ' and occasionally with `? ' when +reading commands from the terminal (1.1). +The shell has a variable +.I prompt +which may be set to a different value to change the shell's main +.I prompt . +This is mostly used when debugging the shell (2.8). +.IP pushd +The +.I pushd +command, which means `push directory', changes the shell's +.I "working directory" +and also remembers the current +.I "working directory" +before the change is made, allowing you to return to the same +directory via the +.I popd +command later without retyping its name (2.7). +.IP ps +The +.I ps +command is used to show the processes you are currently running. +Each process is shown with its unique process number, +an indication of the terminal name it is attached to, +an indication of the state of the process (whether it is running, +stopped, awaiting some event (sleeping), and whether it is swapped out), +and the amount of \s-2CPU\s0 time it has used so far. +The command is identified by printing some of the words used +when it was invoked (2.6). +Shells, such as the +.I csh +you use to run the +.I ps +command, are not normally shown in the output. +.IP pwd +The +.I pwd +command prints the full +.I pathname +of the current +.I "working directory" \&. +The +.I dirs +builtin command is usually a better and faster choice. +.IP quit +The +.I quit +signal, generated by a control-\e, +is used to terminate programs which are behaving unreasonably. +It normally produces a core image file (1.8). +.IP quotation +The process by which metacharacters are prevented their special +meaning, usually by using the character `\' in pairs, or by +using the character `\e', is referred to as +.I quotation +(1.7). +.IP redirection +The routing of input or output from or to a file is known +as +.I redirection +of input or output (1.3). +.IP rehash +The +.I rehash +command tells the shell to rebuild its internal table of which commands +are found in which directories in your +.I path . +This is necessary when a new program is installed in one of these +directories (2.8). +.IP "relative pathname" +.br +A +.I pathname +which does not begin with a `/' is called a +.I "relative pathname" +since it is interpreted +.I relative +to the current +.I "working directory" . +The first +.I component +of such a +.I pathname +refers to some file or directory in the +.I "working directory" , +and subsequent +.I components +between `/' characters refer to directories below the +.I "working directory" . +.I Pathnames +that are not +.I relative +are called +.I "absolute pathnames" +(1.6). +.IP repeat +The +.I repeat +command iterates another command a specified number of times. +.IP root +The directory +that is at the top of the entire directory structure is called the +.I root +directory since it is the `root' of the entire tree structure of +directories. The name used in +.I pathnames +to indicate the +.I root +is `/'. +.I Pathnames +starting with `/' are said to be +.I absolute +since they start at the +.I root +directory. +.I Root +is also used as the part of a +.I pathname +that is left after removing +the +.I extension . +See +.I filename +for a further explanation (1.6). +.IP \s-2RUBOUT\s0 +The \s-2RUBOUT\s0 or \s-2DELETE\s0 +key is often used to erase the previously typed character; some users +prefer the \s-2BACKSPACE\s0 for this purpose. On older versions of \s-2UNIX\s0 +this key served as the \s-2INTR\s0 character. +.IP "scratch file" +Files whose names begin with a `#' are referred to as +.I "scratch files" , +since they are automatically removed by the system after a couple of +days of non-use, or more frequently if disk space becomes tight (1.3). +.IP script +Sequences of shell commands placed in a file are called shell command +.I scripts . +It is often possible to perform simple tasks using these +.I scripts +without writing a program in a language such as C, by +using the shell to selectively run other programs (3.3, 3.10). +.IP set +The builtin +.I set +command is used to assign new values to shell variables +and to show the values of the current variables. +Many shell variables have special meaning to the shell itself. +Thus by using the +.I set +command the behavior of the shell can be affected (2.1). +.IP setenv +Variables in the environment `environ (5)' +can be changed by using the +.I setenv +builtin command (2.8). +The +.I printenv +command can be used to print the value of the variables in the environment. +.IP shell +A +.I shell +is a command language interpreter. +It is possible to write and run your own +.I shell , +as +.I shells +are no different than any other programs as far as the +system is concerned. +This manual deals with the details of one particular +.I shell , +called +.I csh. +.IP "shell script" +See +.I script +(3.3, 3.10). +.IP signal +A +.I signal +in \s-2UNIX\s0 is a short message that is sent to a running program +which causes something to happen to that process. +.I Signals +are sent either by typing special +.I control +characters on the keyboard or by using the +.I kill +or +.I stop +commands (1.8, 2.6). +.IP sort +The +.I sort +program sorts a sequence of lines in ways that can be controlled +by argument +.I flags +(1.5). +.IP source +The +.I source +command causes the shell to read commands from a specified file. +It is most useful for reading files such as +.I \&.cshrc +after changing them (2.8). +.IP "special character" +.br +See +.I metacharacters +and the +appendix to this manual. +.IP standard +We refer often to the +.I "standard input" +and +.I "standard output" +of commands. +See +.I input +and +.I output +(1.3, 3.8). +.IP status +A command normally returns a +.I status +when it finishes. +By convention a +.I status +of zero indicates that the command succeeded. +Commands may return non-zero +.I status +to indicate that some abnormal event has occurred. +The shell variable +.I status +is set to the +.I status +returned by the last command. +It is most useful in shell commmand scripts (3.6). +.IP stop +The +.I stop +command causes a +.I background +job to become +.I suspended +(2.6). +.IP string +A sequential group of characters taken together is called a +.I string \&. +.I Strings +can contain any printable characters (2.2). +.IP stty +The +.I stty +program changes certain parameters inside \s-2UNIX\s0 which determine +how your terminal is handled. See `stty (1)' for a complete description (2.6). +.IP substitution +The shell implements a number of +.I substitutions +where sequences indicated by metacharacters are replaced by other sequences. +Notable examples of this are history +.I substitution +keyed by the +metacharacter `!' and variable +.I substitution +indicated by `$'. +We also refer to +.I substitutions +as +.I expansions +(3.4). +.IP suspended +A job becomes +.I suspended +after a \s-2STOP\s0 signal is sent to it, either by typing a +.I control -z +at the terminal (for +.I foreground +jobs) or by using the +.I stop +command (for +.I background +jobs). When +.I suspended , +a job temporarily stops running until it is restarted by either the +.I fg +or +.I bg +command (2.6). +.IP switch +The +.I switch +command of the shell allows the shell +to select one of a number of sequences of commands based on an +argument string. +It is similar to the +.I switch +statement in the language C (3.7). +.IP termination +When a command which is being executed finishes we say it undergoes +.I termination +or +.I terminates. +Commands normally terminate when they read an +.I end\f1-\fPof\f1-\fPfile +from their +.I "standard input" . +It is also possible to terminate commands by sending them +an +.I interrupt +or +.I quit +signal (1.8). +The +.I kill +program terminates specified jobs (2.6). +.IP then +The +.I then +command is part of the shell's +`if-then-else-endif' control construct used in command scripts (3.6). +.IP time +The +.I time +command can be used to measure the amount of \s-2CPU\s0 +and real time consumed by a specified command as well +as the amount of disk i/o, memory utilized, and number +of page faults and swaps taken by the command (2.1, 2.8). +.IP tset +The +.I tset +program is used to set standard erase and kill characters +and to tell the system what kind of terminal you are using. +It is often invoked in a +.I \&.login +file (2.1). +.IP tty +The word +.I tty +is a historical abbreviation for `teletype' which is frequently used +in \s-2UNIX\s0 to indicate the +.I port +to which a given terminal is connected. The +.I tty +command will print the name of the +.I tty +or +.I port +to which your terminal is presently connected. +.IP unalias +The +.I unalias +command removes aliases (2.8). +.IP \s-2UNIX\s0 +\s-2UNIX\s0 is an operating system on which +.I csh +runs. +\s-2UNIX\s0 provides facilities which allow +.I csh +to invoke other programs such as editors and text formatters which +you may wish to use. +.IP unset +The +.I unset +command removes the definitions of shell variables (2.2, 2.8). +.IP "variable expansion" +.br +See +.I variables +and +.I expansion +(2.2, 3.4). +.IP variables +.I Variables +in +.I csh +hold one or more strings as value. +The most common use of +.I variables +is in controlling the behavior +of the shell. +See +.I path , +.I noclobber , +and +.I ignoreeof +for examples. +.I Variables +such as +.I argv +are also used in writing shell programs (shell command scripts) +(2.2). +.IP verbose +The +.I verbose +shell variable can be set to cause commands to be echoed +after they are history expanded. +This is often useful in debugging shell scripts. +The +.I verbose +variable is set by the shell's +.I \-v +command line option (3.10). +.IP wc +The +.I wc +program calculates the number of characters, words, and lines in the +files whose names are given as arguments (2.6). +.IP while +The +.I while +builtin control construct is used in shell command scripts (3.7). +.IP word +A sequence of characters which forms an argument to a command is called +a +.I word . +Many characters which are neither letters, digits, `\-', `.' nor `/' +form +.I words +all by themselves even if they are not surrounded +by blanks. +Any sequence of characters may be made into a +.I word +by surrounding it +with `\'' characters +except for the characters `\'' and `!' which require special treatment +(1.1). +This process of placing special characters in +.I words +without their special meaning is called +.I quoting . +.IP "working directory" +.br +At any given time you are in one particular directory, called +your +.I "working directory" . +This directory's name is printed by the +.I pwd +command and the files listed by +.I ls +are the ones in this directory. +You can change +.I "working directories" +using +.I chdir . +.IP write +The +.I write +command is an obsolete way of communicating with other users who are logged in to +\s-2UNIX\s0 (you have to take turns typing). If you are both using display +terminals, use \fItalk\fP(1), which is much more pleasant. diff --git a/share/doc/usd/04.csh/tabs b/share/doc/usd/04.csh/tabs new file mode 100644 index 0000000..196d437 --- /dev/null +++ b/share/doc/usd/04.csh/tabs @@ -0,0 +1,32 @@ +.\"- +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)tabs 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n diff --git a/share/doc/usd/05.dc/Makefile b/share/doc/usd/05.dc/Makefile index 2b01e0c..fd1cffc 100644 --- a/share/doc/usd/05.dc/Makefile +++ b/share/doc/usd/05.dc/Makefile @@ -4,6 +4,5 @@ VOLUME= usd/05.dc SRCS= dc MACROS= -ms -SRCDIR= ${.CURDIR}/../../../../usr.bin/dc/USD.doc .include diff --git a/share/doc/usd/05.dc/dc b/share/doc/usd/05.dc/dc new file mode 100644 index 0000000..4caa0f4 --- /dev/null +++ b/share/doc/usd/05.dc/dc @@ -0,0 +1,753 @@ +.\" $FreeBSD$ +.\" $OpenBSD: dc,v 1.2 2003/09/22 19:08:27 otto Exp $ +.\" +.\" Copyright (C) Caldera International Inc. 2001-2002. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code and documentation must retain the above +.\" copyright notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed or owned by Caldera +.\" International, Inc. +.\" 4. Neither the name of Caldera International, Inc. nor the names of other +.\" contributors may be used to endorse or promote products derived from +.\" this software without specific prior written permission. +.\" +.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA +.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, +.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.\" @(#)dc 8.1 (Berkeley) 6/8/93 +.\" +.EH 'USD:5-%''DC \- An Interactive Desk Calculator' +.OH 'DC \- An Interactive Desk Calculator''USD:5-%' +.\".RP +.\" ....TM 75-1271-8 39199 39199-11 +.ND +.TL +DC \- An Interactive Desk Calculator +.AU "MH 2C-524" 3878 +Robert Morris +.AU +Lorinda Cherry +.AI +.\" .MH +.AB +DC is an interactive desk calculator program implemented +on the +.UX +time-sharing system to do arbitrary-precision +integer arithmetic. +It has provision for manipulating scaled fixed-point numbers and +for input and output in bases other than decimal. +.PP +The size of numbers that can be manipulated is limited +only by available core storage. +On typical implementations of +.UX , +the size of numbers that +can be handled varies from several hundred digits on the smallest +systems to several thousand on the largest. +.AE +.PP +.SH +.PP +.ft I +Editor's note: the description of the implementation details of DC in this +paper is only valid for the original version of DC. +The current version of DC uses a different approach. +.ft +.PP +DC is an arbitrary precision arithmetic package implemented +on the +.UX +time-sharing system +in the form of an interactive desk calculator. +It works like a stacking calculator using reverse Polish notation. +Ordinarily DC operates on decimal integers, but one may +specify an input base, output base, and a number of fractional +digits to be maintained. +.PP +A language called BC [1] has been developed which accepts +programs written in the familiar style of higher-level +programming languages and compiles output which is +interpreted by DC. +Some of the commands described below were designed +for the compiler interface and are not easy for a human user +to manipulate. +.PP +Numbers that are typed into DC are put on a push-down +stack. +DC commands work by taking the top number or two +off the stack, performing the desired operation, and pushing the result +on the stack. +If an argument is given, +input is taken from that file until its end, +then from the standard input. +.SH +SYNOPTIC DESCRIPTION +.PP +Here we describe the DC commands that are intended +for use by people. The additional commands that are +intended to be invoked by compiled output are +described in the detailed description. +.PP +Any number of commands are permitted on a line. +Blanks and new-line characters are ignored except within numbers +and in places where a register name is expected. +.PP +The following constructions are recognized: +.SH +number +.IP +The value of the number is pushed onto the main stack. +A number is an unbroken string of the digits 0-9 +and the capital letters A\-F which are treated as digits +with values 10\-15 respectively. +The number may be preceded by an underscore _ to input a +negative number. +Numbers may contain decimal points. +.SH ++ \- * % ^ +.IP +The +top two values on the stack are added +(\fB+\fP), +subtracted +(\fB\-\fP), +multiplied (\fB*\fP), +divided (\fB/\fP), +remaindered (\fB%\fP), +or exponentiated (^). +The two entries are popped off the stack; +the result is pushed on the stack in their place. +The result of a division is an integer truncated toward zero. +See the detailed description below for the treatment of +numbers with decimal points. +An exponent must not have any digits after the decimal point. +.SH +s\fIx\fP +.IP +The +top of the main stack is popped and stored into +a register named \fIx\fP, where \fIx\fP may be any character. +If +the +.ft B +s +.ft +is capitalized, +.ft I +x +.ft +is treated as a stack and the value is pushed onto it. +Any character, even blank or new-line, is a valid register name. +.SH +l\fIx\fP +.IP +The +value in register +.ft I +x +.ft +is pushed onto the stack. +The register +.ft I +x +.ft +is not altered. +If the +.ft B +l +.ft +is capitalized, +register +.ft I +x +.ft +is treated as a stack and its top value is popped onto the main stack. +.LP +All registers start with empty value which is treated as a zero +by the command \fBl\fP and is treated as an error by the command \fBL\fP. +.SH +d +.IP +The +top value on the stack is duplicated. +.SH +p +.IP +The top value on the stack is printed. +The top value remains unchanged. +.SH +f +.IP +All values on the stack and in registers are printed. +.SH +x +.IP +treats the top element of the stack as a character string, +removes it from the stack, and +executes it as a string of DC commands. +.SH +[ ... ] +.IP +puts the bracketed character string onto the top of the stack. +.SH +q +.IP +exits the program. +If executing a string, the recursion level is +popped by two. +If +.ft B +q +.ft +is capitalized, +the top value on the stack is popped and the string execution level is popped +by that value. +.SH +<\fIx\fP >\fIx\fP =\fIx\fP !<\fIx\fP !>\fIx\fP !=\fIx\fP +.IP +The +top two elements of the stack are popped and compared. +Register +.ft I +x +.ft +is executed if they obey the stated +relation. +Exclamation point is negation. +.SH +v +.IP +replaces the top element on the stack by its square root. +The square root of an integer is truncated to an integer. +For the treatment of numbers with decimal points, see +the detailed description below. +.SH +! +.IP +interprets the rest of the line as a +.UX +command. +Control returns to DC when the +.UX +command terminates. +.SH +c +.IP +All values on the stack are popped; the stack becomes empty. +.SH +i +.IP +The top value on the stack is popped and used as the +number radix for further input. +If \fBi\fP is capitalized, the value of +the input base is pushed onto the stack. +No mechanism has been provided for the input of arbitrary +numbers in bases less than 1 or greater than 16. +.SH +o +.IP +The top value on the stack is popped and used as the +number radix for further output. +If \fBo\fP is capitalized, the value of the output +base is pushed onto the stack. +.SH +k +.IP +The top of the stack is popped, and that value is used as +a scale factor +that influences the number of decimal places +that are maintained during multiplication, division, and exponentiation. +The scale factor must be greater than or equal to zero and +less than 100. +If \fBk\fP is capitalized, the value of the scale factor +is pushed onto the stack. +.SH +z +.IP +The value of the stack level is pushed onto the stack. +.SH +? +.IP +A line of input is taken from the input source (usually the console) +and executed. +.SH +DETAILED DESCRIPTION +.SH +Internal Representation of Numbers +.PP +Numbers are stored internally using a dynamic storage allocator. +Numbers are kept in the form of a string +of digits to the base 100 stored one digit per byte +(centennial digits). +The string is stored with the low-order digit at the +beginning of the string. +For example, the representation of 157 +is 57,1. +After any arithmetic operation on a number, care is taken +that all digits are in the range 0\-99 and that +the number has no leading zeros. +The number zero is represented by the empty string. +.PP +Negative numbers are represented in the 100's complement +notation, which is analogous to two's complement notation for binary +numbers. +The high order digit of a negative number is always \-1 +and all other digits are in the range 0\-99. +The digit preceding the high order \-1 digit is never a 99. +The representation of \-157 is 43,98,\-1. +We shall call this the canonical form of a number. +The advantage of this kind of representation of negative +numbers is ease of addition. When addition is performed digit +by digit, the result is formally correct. The result need only +be modified, if necessary, to put it into canonical form. +.PP +Because the largest valid digit is 99 and the byte can +hold numbers twice that large, addition can be carried out +and the handling of carries done later when +that is convenient, as it sometimes is. +.PP +An additional byte is stored with each number beyond +the high order digit to indicate the number of +assumed decimal digits after the decimal point. The representation +of .001 is 1,\fI3\fP +where the scale has been italicized to emphasize the fact that it +is not the high order digit. +The value of this extra byte is called the +.ft B +scale factor +.ft +of the number. +.SH +The Allocator +.PP +DC uses a dynamic string storage allocator +for all of its internal storage. +All reading and writing of numbers internally is done through +the allocator. +Associated with each string in the allocator is a four-word header containing pointers +to the beginning of the string, the end of the string, +the next place to write, and the next place to read. +Communication between the allocator and DC +is done via pointers to these headers. +.PP +The allocator initially has one large string on a list +of free strings. All headers except the one pointing +to this string are on a list of free headers. +Requests for strings are made by size. +The size of the string actually supplied is the next higher +power of 2. +When a request for a string is made, the allocator +first checks the free list to see if there is +a string of the desired size. +If none is found, the allocator finds the next larger free string and splits it repeatedly until +it has a string of the right size. +Left-over strings are put on the free list. +If there are no larger strings, +the allocator tries to coalesce smaller free strings into +larger ones. +Since all strings are the result +of splitting large strings, +each string has a neighbor that is next to it in core +and, if free, can be combined with it to make a string twice as long. +This is an implementation of the `buddy system' of allocation +described in [2]. +.PP +Failing to find a string of the proper length after coalescing, +the allocator asks the system for more space. +The amount of space on the system is the only limitation +on the size and number of strings in DC. +If at any time in the process of trying to allocate a string, the allocator runs out of +headers, it also asks the system for more space. +.PP +There are routines in the allocator for reading, writing, copying, rewinding, +forward-spacing, and backspacing strings. +All string manipulation is done using these routines. +.PP +The reading and writing routines +increment the read pointer or write pointer so that +the characters of a string are read or written in +succession by a series of read or write calls. +The write pointer is interpreted as the end of the +information-containing portion of a string and a call +to read beyond that point returns an end-of-string indication. +An attempt to write beyond the end of a string +causes the allocator to +allocate a larger space and then copy +the old string into the larger block. +.SH +Internal Arithmetic +.PP +All arithmetic operations are done on integers. +The operands (or operand) needed for the operation are popped +from the main stack and their scale factors stripped off. +Zeros are added or digits removed as necessary to get +a properly scaled result from the internal arithmetic routine. +For example, if the scale of the operands is different and decimal +alignment is required, as it is for +addition, zeros are appended to the operand with the smaller +scale. +After performing the required arithmetic operation, +the proper scale factor is appended to the end of the number before +it is pushed on the stack. +.PP +A register called \fBscale\fP plays a part +in the results of most arithmetic operations. +\fBscale\fP is the bound on the number of decimal places retained in +arithmetic computations. +\fBscale\fP may be set to the number on the top of the stack +truncated to an integer with the \fBk\fP command. +\fBK\fP may be used to push the value of \fBscale\fP on the stack. +\fBscale\fP must be greater than or equal to 0 and less than 100. +The descriptions of the individual arithmetic operations will +include the exact effect of \fBscale\fP on the computations. +.SH +Addition and Subtraction +.PP +The scales of the two numbers are compared and trailing +zeros are supplied to the number with the lower scale to give both +numbers the same scale. The number with the smaller scale is +multiplied by 10 if the difference of the scales is odd. +The scale of the result is then set to the larger of the scales +of the two operands. +.PP +Subtraction is performed by negating the number +to be subtracted and proceeding as in addition. +.PP +Finally, the addition is performed digit by digit from the +low order end of the number. The carries are propagated +in the usual way. +The resulting number is brought into canonical form, which may +require stripping of leading zeros, or for negative numbers +replacing the high-order configuration 99,\-1 by the digit \-1. +In any case, digits which are not in the range 0\-99 must +be brought into that range, propagating any carries or borrows +that result. +.SH +Multiplication +.PP +The scales are removed from the two operands and saved. +The operands are both made positive. +Then multiplication is performed in +a digit by digit manner that exactly mimics the hand method +of multiplying. +The first number is multiplied by each digit of the second +number, beginning with its low order digit. The intermediate +products are accumulated into a partial sum which becomes the +final product. +The product is put into the canonical form and its sign is +computed from the signs of the original operands. +.PP +The scale of the result is set equal to the sum +of the scales of the two operands. +If that scale is larger than the internal register +.ft B +scale +.ft +and also larger than both of the scales of the two operands, +then the scale of the result is set equal to the largest +of these three last quantities. +.SH +Division +.PP +The scales are removed from the two operands. +Zeros are appended or digits removed from the dividend to make +the scale of the result of the integer division equal to +the internal quantity +\fBscale\fP. +The signs are removed and saved. +.PP +Division is performed much as it would be done by hand. +The difference of the lengths of the two numbers +is computed. +If the divisor is longer than the dividend, +zero is returned. +Otherwise the top digit of the divisor is divided into the top +two digits of the dividend. +The result is used as the first (high-order) digit of the +quotient. +It may turn out be one unit too low, but if it is, the next +trial quotient will be larger than 99 and this will be +adjusted at the end of the process. +The trial digit is multiplied by the divisor and the result subtracted +from the dividend and the process is repeated to get +additional quotient digits until the remaining +dividend is smaller than the divisor. +At the end, the digits of the quotient are put into +the canonical form, with propagation of carry as needed. +The sign is set from the sign of the operands. +.SH +Remainder +.PP +The division routine is called and division is performed +exactly as described. The quantity returned is the remains of the +dividend at the end of the divide process. +Since division truncates toward zero, remainders have the same +sign as the dividend. +The scale of the remainder is set to +the maximum of the scale of the dividend and +the scale of the quotient plus the scale of the divisor. +.SH +Square Root +.PP +The scale is stripped from the operand. +Zeros are added if necessary to make the +integer result have a scale that is the larger of +the internal quantity +\fBscale\fP +and the scale of the operand. +.PP +The method used to compute sqrt(y) is Newton's method +with successive approximations by the rule +.EQ +x sub {n+1} ~=~ half ( x sub n + y over x sub n ) +.EN +The initial guess is found by taking the integer square root +of the top two digits. +.SH +Exponentiation +.PP +Only exponents with zero scale factor are handled. If the exponent is +zero, then the result is 1. If the exponent is negative, then +it is made positive and the base is divided into one. The scale +of the base is removed. +.PP +The integer exponent is viewed as a binary number. +The base is repeatedly squared and the result is +obtained as a product of those powers of the base that +correspond to the positions of the one-bits in the binary +representation of the exponent. +Enough digits of the result +are removed to make the scale of the result the same as if the +indicated multiplication had been performed. +.SH +Input Conversion and Base +.PP +Numbers are converted to the internal representation as they are read +in. +The scale stored with a number is simply the number of fractional digits input. +Negative numbers are indicated by preceding the number with a \fB\_\fP (an +underscore). +The hexadecimal digits A\-F correspond to the numbers 10\-15 regardless of input base. +The \fBi\fP command can be used to change the base of the input numbers. +This command pops the stack, truncates the resulting number to an integer, +and uses it as the input base for all further input. +The input base is initialized to 10 but may, for example be changed to +8 or 16 to do octal or hexadecimal to decimal conversions. +The command \fBI\fP will push the value of the input base on the stack. +.SH +Output Commands +.PP +The command \fBp\fP causes the top of the stack to be printed. +It does not remove the top of the stack. +All of the stack and internal registers can be output +by typing the command \fBf\fP. +The \fBo\fP command can be used to change the output base. +This command uses the top of the stack, truncated to an integer as +the base for all further output. +The output base in initialized to 10. +It will work correctly for any base. +The command \fBO\fP pushes the value of the output base on the stack. +.SH +Output Format and Base +.PP +The input and output bases only affect +the interpretation of numbers on input and output; they have no +effect on arithmetic computations. +Large numbers are output with 70 characters per line; +a \\ indicates a continued line. +All choices of input and output bases work correctly, although not all are +useful. +A particularly useful output base is 100000, which has the effect of +grouping digits in fives. +Bases of 8 and 16 can be used for decimal-octal or decimal-hexadecimal +conversions. +.SH +Internal Registers +.PP +Numbers or strings may be stored in internal registers or loaded on the stack +from registers with the commands \fBs\fP and \fBl\fP. +The command \fBs\fIx\fR pops the top of the stack and +stores the result in register \fBx\fP. +\fIx\fP can be any character. +\fBl\fIx\fR puts the contents of register \fBx\fP on the top of the stack. +The \fBl\fP command has no effect on the contents of register \fIx\fP. +The \fBs\fP command, however, is destructive. +.SH +Stack Commands +.PP +The command \fBc\fP clears the stack. +The command \fBd\fP pushes a duplicate of the number on the top of the stack +on the stack. +The command \fBz\fP pushes the stack size on the stack. +The command \fBX\fP replaces the number on the top of the stack +with its scale factor. +The command \fBZ\fP replaces the top of the stack +with its length. +.SH +Subroutine Definitions and Calls +.PP +Enclosing a string in \fB[ ]\fP pushes the ascii string on the stack. +The \fBq\fP command quits or in executing a string, pops the recursion levels by two. +.SH +Internal Registers \- Programming DC +.PP +The load and store +commands together with \fB[ ]\fP to store strings, \fBx\fP to execute +and the testing commands `<', `>', `=', `!<', `!>', `!=' can be used to program +DC. +The \fBx\fP command assumes the top of the stack is an string of DC commands +and executes it. +The testing commands compare the top two elements on the stack and if the relation holds, execute the register +that follows the relation. +For example, to print the numbers 0-9, +.DS +[lip1+ si li10>a]sa +0si lax +.DE +.SH +Push-Down Registers and Arrays +.PP +These commands were designed for used by a compiler, not by +people. +They involve push-down registers and arrays. +In addition to the stack that commands work on, DC can be thought +of as having individual stacks for each register. +These registers are operated on by the commands \fBS\fP and \fBL\fP. +\fBS\fIx\fR pushes the top value of the main stack onto the stack for +the register \fIx\fP. +\fBL\fIx\fR pops the stack for register \fIx\fP and puts the result on the main +stack. +The commands \fBs\fP and \fBl\fP also work on registers but not as push-down +stacks. +\fBl\fP doesn't effect the top of the +register stack, and \fBs\fP destroys what was there before. +.PP +The commands to work on arrays are \fB:\fP and \fB;\fP. +\fB:\fIx\fR pops the stack and uses this value as an index into +the array \fIx\fP. +The next element on the stack is stored at this index in \fIx\fP. +An index must be greater than or equal to 0 and +less than 2048. +\fB;\fIx\fR is the command to load the main stack from the array \fIx\fP. +The value on the top of the stack is the index +into the array \fIx\fP of the value to be loaded. +.SH +Miscellaneous Commands +.PP +The command \fB!\fP interprets the rest of the line as a +.UX +command and passes it to +.UX +to execute. +One other compiler command is \fBQ\fP. +This command uses the top of the stack as the number of levels of recursion to skip. +.SH +DESIGN CHOICES +.PP +The real reason for the use of a dynamic storage allocator was +that a general purpose program could be (and in fact has been) +used for a variety of other tasks. +The allocator has some value for input and for compiling (i.e. +the bracket [...] commands) where it cannot be known in advance +how long a string will be. +The result was that at a modest +cost in execution time, all considerations of string allocation +and sizes of strings were removed from the remainder of the program +and debugging was made easier. The allocation method +used wastes approximately 25% of available space. +.PP +The choice of 100 as a base for internal arithmetic +seemingly has no compelling advantage. Yet the base cannot +exceed 127 because of hardware limitations and at the cost +of 5% in space, debugging was made a great deal easier and +decimal output was made much faster. +.PP +The reason for a stack-type arithmetic design was +to permit all DC commands from addition to subroutine execution +to be implemented in essentially the same way. The result +was a considerable degree of logical separation of the final +program into modules with very little communication between +modules. +.PP +The rationale for the lack of interaction between the scale and the bases +was to provide an understandable means of proceeding after +a change of base or scale when numbers had already been entered. +An earlier implementation which had global notions of +scale and base did not work out well. +If the value of +.ft B +scale +.ft +were to be interpreted in the current +input or output base, +then a change of base or scale in the midst of a +computation would cause great confusion in the interpretation +of the results. +The current scheme has the advantage that the value of +the input and output bases +are only used for input and output, respectively, and they +are ignored in all other operations. +The value of +scale +is not used for any essential purpose by any part of the program +and it is used only to prevent the number of +decimal places resulting from the arithmetic operations from +growing beyond all bounds. +.PP +The design rationale for the choices for the scales of +the results of arithmetic were that in no case should +any significant digits be thrown away if, on appearances, the +user actually wanted them. Thus, if the user wants +to add the numbers 1.5 and 3.517, it seemed reasonable to give +him the result 5.017 without requiring him to unnecessarily +specify his rather obvious requirements for precision. +.PP +On the other hand, multiplication and exponentiation produce +results with many more digits than their operands and it +seemed reasonable to give as a minimum the number of decimal +places in the operands but not to give more than that +number of digits +unless the user asked for them by specifying a value for \fBscale\fP. +Square root can be handled in just the same way as multiplication. +The operation of division gives arbitrarily many decimal places +and there is simply no way to guess how many places the user +wants. +In this case only, the user must +specify a \fBscale\fP to get any decimal places at all. +.PP +The scale of remainder was chosen to make it possible +to recreate the dividend from the quotient and remainder. +This is easy to implement; no digits are thrown away. +.SH +References +.IP [1] +L. L. Cherry, R. Morris, +.ft I +BC \- An Arbitrary Precision Desk-Calculator Language. +.ft +.IP [2] +K. C. Knowlton, +.ft I +A Fast Storage Allocator, +.ft +Comm. ACM \fB8\fP, pp. 623-625 (Oct. 1965). diff --git a/share/doc/usd/06.bc/Makefile b/share/doc/usd/06.bc/Makefile index 12dfedd..b4f340c 100644 --- a/share/doc/usd/06.bc/Makefile +++ b/share/doc/usd/06.bc/Makefile @@ -4,6 +4,5 @@ VOLUME= usd/06.bc SRCS= bc MACROS= -ms -SRCDIR= ${.CURDIR}/../../../../usr.bin/bc/USD.doc .include diff --git a/share/doc/usd/06.bc/bc b/share/doc/usd/06.bc/bc new file mode 100644 index 0000000..c4e68c6 --- /dev/null +++ b/share/doc/usd/06.bc/bc @@ -0,0 +1,1241 @@ +.\" $FreeBSD$ +.\" $OpenBSD: bc,v 1.9 2004/07/09 10:23:05 jmc Exp $ +.\" +.\" Copyright (C) Caldera International Inc. 2001-2002. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code and documentation must retain the above +.\" copyright notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed or owned by Caldera +.\" International, Inc. +.\" 4. Neither the name of Caldera International, Inc. nor the names of other +.\" contributors may be used to endorse or promote products derived from +.\" this software without specific prior written permission. +.\" +.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA +.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, +.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.\" @(#)bc 6.2 (Berkeley) 4/17/91 +.\" +.if n \{\ +.po 5n +.ll 70n +.\} +.EH 'USD:6-%''BC \- An Arbitrary Precision Desk-Calculator Language' +.OH 'BC \- An Arbitrary Precision Desk-Calculator Language''USD:6-%' +.\".RP +.TL +BC \- An Arbitrary Precision Desk-Calculator Language +.AU +Lorinda Cherry +.AU +Robert Morris +.AI +.\" .MH +.AB +BC is a language and a compiler for doing arbitrary precision arithmetic +on the PDP-11 under the +.UX +time-sharing +system. The output of the compiler is interpreted and executed by +a collection of routines which can input, output, and do +arithmetic on indefinitely large integers and on scaled fixed-point +numbers. +.PP +These routines are themselves based on a dynamic storage allocator. +Overflow does not occur until all available core storage +is exhausted. +.PP +The language has a complete control structure as well as immediate-mode +operation. Functions can be defined and saved for later execution. +.PP +Two five hundred-digit numbers can be multiplied to give a +thousand digit result in about ten seconds. +.PP +A small collection of library functions is also available, +including sin, cos, arctan, log, exponential, and Bessel functions of +integer order. +.PP +Some of the uses of this compiler are +.IP \- +to do computation with large integers, +.IP \- +to do computation accurate to many decimal places, +.IP \- +conversion of numbers from one base to another base. +.AE +.PP +.SH +Introduction +.PP +BC is a language and a compiler for doing arbitrary precision +arithmetic on the +.UX +time-sharing system [1]. +The compiler was written to make conveniently available a +collection of routines (called DC [5]) which are capable of doing +arithmetic on integers of arbitrary size. The compiler +is by no means intended to provide a complete programming +language. +It is a minimal language facility. +.PP +There is a scaling provision that permits the +use of decimal point notation. +Provision is made for input and output in bases other than +decimal. Numbers can be converted from decimal to octal by +simply setting the output base to equal 8. +.PP +The actual limit on the number of digits that can +be handled depends on the amount of storage available on the machine. +Manipulation of numbers with many hundreds of digits +is possible even on the smallest versions of +.UX . +.PP +The syntax of BC has been deliberately selected to agree +substantially with the C language [2]. Those who +are familiar with C will find few surprises in this language. +.SH +Simple Computations with Integers +.PP +The simplest kind of statement is an arithmetic expression +on a line by itself. +For instance, if you type in the line: +.DS +.ft B +142857 + 285714 +.ft P +.DE +the program responds immediately with the line +.DS +.ft B +428571 +.ft P +.DE +The operators \-, *, /, %, and ^ can also be used; they +indicate subtraction, multiplication, division, remaindering, and +exponentiation, respectively. Division of integers produces an +integer result truncated toward zero. +Division by zero produces an error +comment. +.PP +Any term in an expression may be prefixed by a minus sign to +indicate that it is to be negated (the `unary' minus sign). +The expression +.DS +.ft B +7+\-3 +.ft P +.DE +is interpreted to mean that \-3 is to be added to 7. +.PP +More complex expressions with several operators and with +parentheses are interpreted just as in +Fortran, with ^ having the greatest binding +power, then * and % and /, and finally + and \-. +Contents of parentheses are evaluated before material +outside the parentheses. +Exponentiations are +performed from right to left and the other operators +from left to right. +The two expressions +.DS +.ft B +a^b^c and a^(b^c) +.ft P +.DE +are equivalent, as are the two expressions +.DS +.ft B +a*b*c and (a*b)*c +.ft P +.DE +BC shares with Fortran and C the undesirable convention that +.DS +\fBa/b*c\fP is equivalent to \fB(a/b)*c\fP +.ft P +.DE +.PP +Internal storage registers to hold numbers have single lower-case +letter names. The value of an expression can be assigned to +a register in the usual way. The statement +.DS +.ft B +x = x + 3 +.ft P +.DE +has the effect of increasing by three the value of the contents of the +register named x. +When, as in this case, the outermost operator is an =, the +assignment is performed but the result is not printed. +Only 26 of these named storage registers are available. +.PP +There is a built-in square root function whose +result is truncated to an integer (but see scaling below). +The lines +.DS +.ft B +x = sqrt(191) +x +.ft P +.DE +produce the printed result +.DS +.ft B +13 +.ft P +.DE +.SH +Bases +.PP +There are special internal quantities, called `ibase' and `obase'. +The contents of `ibase', initially set to 10, +determines the base used for interpreting numbers read in. +For example, the lines +.DS +.ft B +ibase = 8 +11 +.ft P +.DE +will produce the output line +.DS +.ft B +9 +.ft P +.DE +and you are all set up to do octal to decimal conversions. +Beware, however of trying to change the input base back +to decimal by typing +.DS +.ft B +ibase = 10 +.ft P +.DE +Because the number 10 is interpreted as octal, this statement will +have no effect. +For those who deal in hexadecimal notation, +the characters A\-F are permitted in numbers +(no matter what base is in effect) +and are +interpreted as digits having values 10\-15 respectively. +The statement +.DS +.ft B +ibase = A +.ft P +.DE +will change you back to decimal input base no matter what the +current input base is. +Negative and large positive input bases are +permitted but useless. +No mechanism has been provided for the input of arbitrary +numbers in bases less than 1 and greater than 16. +.PP +The contents of `obase', initially set to 10, are used as the base for output +numbers. The lines +.DS +.ft B +obase = 16 +1000 +.ft P +.DE +will produce the output line +.DS +.ft B +3E8 +.ft P +.DE +which is to be interpreted as a 3-digit hexadecimal number. +Very large output bases are permitted, and they are sometimes useful. +For example, large numbers can be output in groups of five digits +by setting `obase' to 100000. +Strange (i.e. 1, 0, or negative) output bases are +handled appropriately. +.PP +Very large numbers are split across lines with 70 characters per line. +Lines which are continued end with \\. +Decimal output conversion is practically instantaneous, but output +of very large numbers (i.e., more than 100 digits) with other bases +is rather slow. +Non-decimal output conversion of +a one hundred digit number takes about +three seconds. +.PP +It is best to remember that `ibase' and `obase' have no effect +whatever on the course of internal computation or +on the evaluation of expressions, but only affect input and +output conversion, respectively. +.SH +Scaling +.PP +A third special internal quantity called `scale' is +used to determine the scale of calculated +quantities. +Numbers may have +up to a specific number of decimal digits after the decimal point. +This fractional part is retained in further computations. +We refer to the number of digits after the decimal point of +a number as its scale. +The current implementation allows scales to be as large as can be +represented by a 32-bit unsigned number minus one. +This is a non-portable extension. +The original implementation allowed for a maximum scale of 99. +.PP +When two scaled numbers are combined by +means of one of the arithmetic operations, the result +has a scale determined by the following rules. For +addition and subtraction, the scale of the result is the larger +of the scales of the two operands. In this case, +there is never any truncation of the result. +For multiplications, the scale of the result is never +less than the maximum of the two scales of the operands, +never more than the sum of the scales of the operands +and, subject to those two restrictions, +the scale of the result is set equal to the contents of the internal +quantity `scale'. +The scale of a quotient is the contents of the internal +quantity `scale'. The scale of a remainder is +the sum of the scales of the quotient and the divisor. +The result of an exponentiation is scaled as if +the implied multiplications were performed. +An exponent must be an integer. +The scale of a square root is set to the maximum of the scale +of the argument and the contents of `scale'. +.PP +All of the internal operations are actually carried out in terms +of integers, with digits being discarded when necessary. +In every case where digits are discarded, truncation and +not rounding is performed. +.PP +The contents of +`scale' must be no greater than +4294967294 and no less than 0. It is initially set to 0. +.PP +The internal quantities `scale', `ibase', and `obase' can be +used in expressions just like other variables. +The line +.DS +.ft B +scale = scale + 1 +.ft P +.DE +increases the value of `scale' by one, and the line +.DS +.ft B +scale +.ft P +.DE +causes the current value of `scale' to be printed. +.PP +The value of `scale' retains its meaning as a +number of decimal digits to be retained in internal +computation even when `ibase' or `obase' are not equal to 10. +The internal computations (which are still conducted in decimal, +regardless of the bases) are performed to the specified number +of decimal digits, never hexadecimal or octal or any +other kind of digits. +.SH +Functions +.PP +The name of a function is a single lower-case letter. +Function names are permitted to collide with simple +variable names. +Twenty-six different defined functions are permitted +in addition to the twenty-six variable names. +The line +.DS +.ft B + define a(x){ +.ft P +.DE +begins the definition of a function with one argument. +This line must be followed by one or more statements, +which make up the body of the function, ending +with a right brace }. +Return of control from a function occurs when a return +statement is executed or when the end of the function is reached. +The return statement can take either +of the two forms +.DS +.ft B +return +return(x) +.ft P +.DE +In the first case, the value of the function is 0, and in +the second, the value of the expression in parentheses. +.PP +Variables used in the function can be declared as automatic +by a statement of the form +.DS +.ft B +auto x,y,z +.ft P +.DE +There can be only one `auto' statement in a function and it must +be the first statement in the definition. +These automatic variables are allocated space and initialized +to zero on entry to the function and thrown away on return. The +values of any variables with the same names outside the function +are not disturbed. +Functions may be called recursively and the automatic variables +at each level of call are protected. +The parameters named in a function definition are treated in +the same way as the automatic variables of that function +with the single exception that they are given a value +on entry to the function. +An example of a function definition is +.DS +.ft B + define a(x,y){ + auto z + z = x*y + return(z) + } +.ft P +.DE +The value of this function, when called, will be the +product of its +two arguments. +.PP +A function is called by the appearance of its name +followed by a string of arguments enclosed in +parentheses and separated by commas. +The result +is unpredictable if the wrong number of arguments is used. +.PP +Functions with no arguments are defined and called using +parentheses with nothing between them: b(). +.PP +If the function +.ft I +a +.ft +above has been defined, then the line +.DS +.ft B +a(7,3.14) +.ft P +.DE +would cause the result 21.98 to be printed and the line +.DS +.ft B +x = a(a(3,4),5) +.ft P +.DE +would cause the value of x to become 60. +.SH +Subscripted Variables +.PP +A single lower-case letter variable name +followed by an expression in brackets is called a subscripted +variable (an array element). +The variable name is called the array name and the expression +in brackets is called the subscript. +Only one-dimensional arrays are +permitted. The names of arrays are permitted to +collide with the names of simple variables and function names. +Any fractional +part of a subscript is discarded before use. +Subscripts must be greater than or equal to zero and +less than or equal to 2047. +.PP +Subscripted variables may be freely used in expressions, in +function calls, and in return statements. +.PP +An array name may be used as an argument to a function, +or may be declared as automatic in +a function definition by the use of empty brackets: +.DS +.ft B +f(a[\|]) +define f(a[\|]) +auto a[\|] +.ft P +.DE +When an array name is so used, the whole contents of the array +are copied for the use of the function, and thrown away on exit +from the function. +Array names which refer to whole arrays cannot be used +in any other contexts. +.SH +Control Statements +.PP +The `if', the `while', and the `for' statements +may be used to alter the flow within programs or to cause iteration. +The range of each of them is a statement or +a compound statement consisting of a collection of +statements enclosed in braces. +They are written in the following way +.DS +.ft B +if(relation) statement +if(relation) statement else statement +while(relation) statement +for(expression1; relation; expression2) statement +.ft P +.DE +or +.DS +.ft B +if(relation) {statements} +if(relation) {statements} else {statements} +while(relation) {statements} +for(expression1; relation; expression2) {statements} +.ft P +.DE +.PP +A relation in one of the control statements is an expression of the form +.DS +.ft B +x>y +.ft P +.DE +where two expressions are related by one of the six relational +operators `<', `>', `<=', `>=', `==', or `!='. +The relation `==' +stands for `equal to' and `!=' stands for `not equal to'. +The meaning of the remaining relational operators is +clear. +.PP +BEWARE of using `=' instead of `==' in a relational. Unfortunately, +both of them are legal, so you will not get a diagnostic +message, but `=' really will not do a comparison. +.PP +The `if' statement causes execution of its range +if and only if the relation is true. +Then control passes to the next statement in sequence. +If an `else' branch is present, the statements in this branch are +executed if the relation is false. +The `else' keyword is a non-portable extension. +.PP +The `while' statement causes execution of its range +repeatedly as long as the relation +is true. The relation is tested before each execution +of its range and if the relation +is false, control passes to the next statement beyond the range +of the while. +.PP +The `for' statement begins +by executing `expression1'. Then the relation is tested +and, if true, the statements in the range of the `for' are executed. +Then `expression2' is executed. The relation is tested, and so on. +The typical use of the `for' statement is for a controlled iteration, +as in the statement +.DS +.ft B +for(i=1; i<=10; i=i+1) i +.ft P +.DE +which will print the integers from 1 to 10. +Here are some examples of the use of the control statements. +.DS +.ft B +define f(n){ +auto i, x +x=1 +for(i=1; i<=n; i=i+1) x=x*i +return(x) +} +.ft P +.DE +The line +.DS +.ft B + f(a) +.ft P +.DE +will print +.ft I +a +.ft +factorial if +.ft I +a +.ft +is a positive integer. +Here is the definition of a function which will +compute values of the binomial coefficient +(m and n are assumed to be positive integers). +.DS +.ft B +define b(n,m){ +auto x, j +x=1 +for(j=1; j<=m; j=j+1) x=x*(n\-j+1)/j +return(x) +} +.ft P +.DE +The following function computes values of the exponential function +by summing the appropriate series +without regard for possible truncation errors: +.DS +.ft B +scale = 20 +define e(x){ + auto a, b, c, d, n + a = 1 + b = 1 + c = 1 + d = 0 + n = 1 + while(1==1){ + a = a*x + b = b*n + c = c + a/b + n = n + 1 + if(c==d) return(c) + d = c + } +} +.ft P +.DE +.SH +Some Details +.PP +There are some language features that every user should know +about even if he will not use them. +.PP +Normally statements are typed one to a line. It is also permissible +to type several statements on a line separated by semicolons. +.PP +If an assignment statement is parenthesized, it then has +a value and it can be used anywhere that an expression can. +For example, the line +.DS +.ft B +(x=y+17) +.ft P +.DE +not only makes the indicated assignment, but also prints the +resulting value. +.PP +Here is an example of a use of the value of an +assignment statement even when it is not parenthesized. +.DS +.ft B +x = a[i=i+1] +.ft P +.DE +causes a value to be assigned to x and also increments i +before it is used as a subscript. +.PP +The following constructs work in BC in exactly the same manner +as they do in the C language. Consult the appendix or the +C manuals [2] for their exact workings. +.DS +.ft B +.ta 2i +x=y=z is the same as x=(y=z) +x += y x = x+y +x \-= y x = x\-y +x *= y x = x*y +x /= y x = x/y +x %= y x = x%y +x ^= y x = x^y +x++ (x=x+1)\-1 +x\-\- (x=x\-1)+1 +++x x = x+1 +\-\-x x = x\-1 +.ft P +.DE +Even if you don't intend to use the constructs, +if you type one inadvertently, something correct but unexpected +may happen. +.SH +Three Important Things +.PP +1. To exit a BC program, type `quit'. +.PP +2. There is a comment convention identical to that of C and +of PL/I. Comments begin with `/*' and end with `*/'. +As a non-portable extension, comments may also start with a `#' and end with +a newline. +The newline is not part of the comment. +.PP +3. There is a library of math functions which may be obtained by +typing at command level +.DS +.ft B +bc \-l +.ft P +.DE +This command will load a set of library functions +which, at the time of writing, consists of sine (named `s'), +cosine (`c'), arctangent (`a'), natural logarithm (`l'), +exponential (`e') and Bessel functions of integer order (`j(n,x)'). Doubtless more functions will be added +in time. +The library sets the scale to 20. You can reset it to something +else if you like. +The design of these mathematical library routines +is discussed elsewhere [3]. +.PP +If you type +.DS +.ft B +bc file ... +.ft P +.DE +BC will read and execute the named file or files before accepting +commands from the keyboard. In this way, you may load your +favorite programs and function definitions. +.SH +Acknowledgement +.PP +The compiler is written in YACC [4]; its original +version was written by S. C. Johnson. +.SH +References +.IP [1] +K. Thompson and D. M. Ritchie, +.ft I +UNIX Programmer's Manual, +.ft +Bell Laboratories, +1978. +.IP [2] +B. W. Kernighan and +D. M. Ritchie, +.ft I +The C Programming Language, +.ft +Prentice-Hall, 1978. +.IP [3] +R. Morris, +.ft I +A Library of Reference Standard Mathematical Subroutines, +.ft +Bell Laboratories internal memorandum, 1975. +.IP [4] +S. C. Johnson, +.ft I +YACC \(em Yet Another Compiler-Compiler. +.ft +Bell Laboratories Computing Science Technical Report #32, 1978. +.IP [5] +R. Morris and L. L. Cherry, +.ft I +DC \- An Interactive Desk Calculator. +.ft +.LP +.bp +.ft B +.DS C +Appendix +.DE +.ft +.NH +Notation +.PP +In the following pages syntactic categories are in \fIitalics\fP; +literals are in \fBbold\fP; material in brackets [\|] is optional. +.NH +Tokens +.PP +Tokens consist of keywords, identifiers, constants, operators, +and separators. +Token separators may be blanks, tabs or comments. +Newline characters or semicolons separate statements. +.NH 2 +Comments +.PP +Comments are introduced by the characters /* and terminated by +*/. +As a non-portable extension, comments may also start with a # and +end with a newline. +The newline is not part of the comment. +.NH 2 +Identifiers +.PP +There are three kinds of identifiers \- ordinary identifiers, array identifiers +and function identifiers. +All three types consist of single lower-case letters. +Array identifiers are followed by square brackets, possibly +enclosing an expression describing a subscript. +Arrays are singly dimensioned and may contain up to 2048 +elements. +Indexing begins at zero so an array may be indexed from 0 to 2047. +Subscripts are truncated to integers. +Function identifiers are followed by parentheses, possibly enclosing arguments. +The three types of identifiers do not conflict; +a program can have a variable named \fBx\fP, +an array named \fBx\fP and a function named \fBx\fP, all of which are separate and +distinct. +.NH 2 +Keywords +.PP +The following are reserved keywords: +.ft B +.ta .5i 1.0i +.nf + ibase if + obase break + scale define + sqrt auto + length return + while quit + for continue + else last + print +.fi +.ft +.NH 2 +Constants +.PP +Constants consist of arbitrarily long numbers +with an optional decimal point. +The hexadecimal digits \fBA\fP\-\fBF\fP are also recognized as digits with +values 10\-15, respectively. +.NH 1 +Expressions +.PP +The value of an expression is printed unless the main +operator is an assignment. +The value printed is assigned to the special variable \fBlast\fP. +A single dot may be used as a synonym for \fBlast\fP. +This is a non-portable extension. +Precedence is the same as the order +of presentation here, with highest appearing first. +Left or right associativity, where applicable, is +discussed with each operator. +.bp +.NH 2 +Primitive expressions +.NH 3 +Named expressions +.PP +Named expressions are +places where values are stored. +Simply stated, +named expressions are legal on the left +side of an assignment. +The value of a named expression is the value stored in the place named. +.NH 4 +\fIidentifiers\fR +.PP +Simple identifiers are named expressions. +They have an initial value of zero. +.NH 4 +\fIarray-name\fP\|[\|\fIexpression\fP\|] +.PP +Array elements are named expressions. +They have an initial value of zero. +.NH 4 +\fBscale\fR, \fBibase\fR and \fBobase\fR +.PP +The internal registers +\fBscale\fP, \fBibase\fP and \fBobase\fP are all named expressions. +\fBscale\fP is the number of digits after the decimal point to be +retained in arithmetic operations. +\fBscale\fR has an initial value of zero. +\fBibase\fP and \fBobase\fP are the input and output number +radix respectively. +Both \fBibase\fR and \fBobase\fR have initial values of 10. +.NH 3 +Function calls +.NH 4 +\fIfunction-name\fB\|(\fR[\fIexpression\fR\|[\fB,\|\fIexpression\|\fR.\|.\|.\|]\|]\fB) +.PP +A function call consists of a function name followed by parentheses +containing a comma-separated list of +expressions, which are the function arguments. +A whole array passed as an argument is specified by the +array name followed by empty square brackets. +All function arguments are passed by +value. +As a result, changes made to the formal parameters have +no effect on the actual arguments. +If the function terminates by executing a return +statement, the value of the function is +the value of the expression in the parentheses of the return +statement or is zero if no expression is provided +or if there is no return statement. +.NH 4 +sqrt\|(\|\fIexpression\fP\|) +.PP +The result is the square root of the expression. +The result is truncated in the least significant decimal place. +The scale of the result is +the scale of the expression or the +value of +.ft B +scale, +.ft +whichever is larger. +.NH 4 +length\|(\|\fIexpression\fP\|) +.PP +The result is the total number of significant decimal digits in the expression. +The scale of the result is zero. +.NH 4 +scale\|(\|\fIexpression\fP\|) +.PP +The result is the scale of the expression. +The scale of the result is zero. +.NH 3 +Constants +.PP +Constants are primitive expressions. +.NH 3 +Parentheses +.PP +An expression surrounded by parentheses is +a primitive expression. +The parentheses are used to alter the +normal precedence. +.NH 2 +Unary operators +.PP +The unary operators +bind right to left. +.NH 3 +\-\|\fIexpression\fP +.PP +The result is the negative of the expression. +.NH 3 +++\|\fInamed-expression\fP +.PP +The named expression is +incremented by one. +The result is the value of the named expression after +incrementing. +.NH 3 +\-\-\|\fInamed-expression\fP +.PP +The named expression is +decremented by one. +The result is the value of the named expression after +decrementing. +.NH 3 +\fInamed-expression\fP\|++ +.PP +The named expression is +incremented by one. +The result is the value of the named expression before +incrementing. +.NH 3 +\fInamed-expression\fP\|\-\- +.PP +The named expression is +decremented by one. +The result is the value of the named expression before +decrementing. +.NH 2 +Exponentiation operator +.PP +The exponentiation operator binds right to left. +.NH 3 +\fIexpression\fP ^ \fIexpression\fP +.PP +The result is the first +expression raised to the power of the +second expression. +The second expression must be an integer. +If \fIa\fP +is the scale of the left expression +and \fIb\fP is the absolute value +of the right expression, +then the scale of the result is: +.PP +min\|(\|\fIa\(mub\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP\|)\|) +.NH 2 +Multiplicative operators +.PP +The operators *, /, % bind left to right. +.NH 3 +\fIexpression\fP * \fIexpression\fP +.PP +The result is the product +of the two expressions. +If \fIa\fP and \fIb\fP are the +scales of the two expressions, +then the scale of the result is: +.PP +min\|(\|\fIa+b\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP,\|\fIb\fP\|)\|) +.NH 3 +\fIexpression\fP / \fIexpression\fP +.PP +The result is the quotient of the two expressions. +The scale of the result is the value of \fBscale\fR. +.NH 3 +\fIexpression\fP % \fIexpression\fP +.PP +The % operator produces the remainder of the division +of the two expressions. +More precisely, +\fIa\fP%\fIb\fP is \fIa\fP\-\fIa\fP/\fIb\fP*\fIb\fP. +.PP +The scale of the result is the sum of the scale of +the divisor and the value of +.ft B +scale +.ft +.NH 2 +Additive operators +.PP +The additive operators bind left to right. +.NH 3 +\fIexpression\fP + \fIexpression\fP +.PP +The result is the sum of the two expressions. +The scale of the result is +the maximum of the scales of the expressions. +.NH 3 +\fIexpression\fP \- \fIexpression\fP +.PP +The result is the difference of the two expressions. +The scale of the result is the +maximum of the scales of the expressions. +.NH 2 +assignment operators +.PP +The assignment operators bind right to left. +.NH 3 +\fInamed-expression\fP = \fIexpression\fP +.PP +This expression results in assigning the value of the expression +on the right +to the named expression on the left. +.NH 3 +\fInamed-expression\fP += \fIexpression\fP +.NH 3 +\fInamed-expression\fP \-= \fIexpression\fP +.NH 3 +\fInamed-expression\fP *= \fIexpression\fP +.NH 3 +\fInamed-expression\fP /= \fIexpression\fP +.NH 3 +\fInamed-expression\fP %= \fIexpression\fP +.NH 3 +\fInamed-expression\fP ^= \fIexpression\fP +.PP +The result of the above expressions is equivalent +to ``named expression = named expression OP expression'', +where OP is the operator after the = sign. +.NH 1 +Relations +.PP +Unlike all other operators, the relational operators +are only valid as the object of an \fBif\fP, \fBwhile\fP, +or inside a \fBfor\fP statement. +.NH 2 +\fIexpression\fP < \fIexpression\fP +.NH 2 +\fIexpression\fP > \fIexpression\fP +.NH 2 +\fIexpression\fP <= \fIexpression\fP +.NH 2 +\fIexpression\fP >= \fIexpression\fP +.NH 2 +\fIexpression\fP == \fIexpression\fP +.NH 2 +\fIexpression\fP != \fIexpression\fP +.NH 1 +Storage classes +.PP +There are only two storage classes in BC, global and automatic +(local). +Only identifiers that are to be local to a function need be +declared with the \fBauto\fP command. +The arguments to a function +are local to the function. +All other identifiers are assumed to be global +and available to all functions. +All identifiers, global and local, have initial values +of zero. +Identifiers declared as \fBauto\fP are allocated on entry to the function +and released on returning from the function. +They therefore do not retain values between function calls. +\fBauto\fP arrays are specified by the array name followed by empty square brackets. +.PP +Automatic variables in BC do not work in exactly the same way +as in either C or PL/I. On entry to a function, the old values of +the names that appear as parameters and as automatic +variables are pushed onto a stack. +Until return is made from the function, reference to these +names refers only to the new values. +.NH 1 +Statements +.PP +Statements must be separated by semicolon or newline. +Except where altered by control statements, execution +is sequential. +.NH 2 +Expression statements +.PP +When a statement is an expression, unless +the main operator is an assignment, the value +of the expression is printed, followed by a newline character. +.NH 2 +Compound statements +.PP +Statements may be grouped together and used when one statement is expected +by surrounding them with { }. +.NH 2 +Quoted string statements +.PP +"any string" +.sp .5 +This statement prints the string inside the quotes. +.NH 2 +If statements +.sp .5 +\fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fR +.PP +The substatement is executed if the relation is true. +.NH 2 +If-else statements +.sp .5 +\fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fB\|else\|\fIstatement\fR +.PP +The first substatement is executed if the relation is true, the second +substatement if the relation is false. +The \fBif-else\fR statement is a non-portable extension. +.NH 2 +While statements +.sp .5 +\fBwhile\|(\|\fIrelation\fB\|)\|\fIstatement\fR +.PP +The statement is executed while the relation +is true. +The test occurs before each execution of the statement. +.NH 2 +For statements +.sp .5 +\fBfor\|(\|\fIexpression\fB; \fIrelation\fB; \fIexpression\fB\|)\|\fIstatement\fR +.PP +The \fBfor\fR statement is the same as +.nf +.ft I + first-expression + \fBwhile\|(\fPrelation\|\fB) {\fP + statement + last-expression + } +.ft R +.fi +.PP +All three expressions may be left out. +This is a non-portable extension. +.NH 2 +Break statements +.sp .5 +\fBbreak\fP +.PP +\fBbreak\fP causes termination of a \fBfor\fP or \fBwhile\fP statement. +.NH 2 +Continue statements +.sp .5 +\fBcontinue\fP +.PP +\fBcontinue\fP causes the next iteration of a \fBfor\fP or \fBwhile\fP +statement to start, skipping the remainder of the loop. +For a \fBwhile\fP statement, execution continues with the evaluation +of the condition. +For a \fBfor\fP statement, execution continues with evaluation of +the last-expression. +The \fBcontinue\fP statement is a non-portable extension. +.NH 2 +Auto statements +.sp .5 +\fBauto \fIidentifier\fR\|[\|\fB,\fIidentifier\fR\|] +.PP +The \fBauto\fR statement causes the values of the identifiers to be pushed down. +The identifiers can be ordinary identifiers or array identifiers. +Array identifiers are specified by following the array name by empty square +brackets. +The auto statement must be the first statement +in a function definition. +.NH 2 +Define statements +.sp .5 +.nf +\fBdefine(\|\fR[\fIparameter\|\fR[\fB\|,\|\fIparameter\|.\|.\|.\|\fR]\|]\|\fB)\|{\fI + statements\|\fB}\fR +.fi +.PP +The \fBdefine\fR statement defines a function. +The parameters may +be ordinary identifiers or array names. +Array names must be followed by empty square brackets. +As a non-portable extension, the opening brace may also appear on the +next line. +.NH 2 +Return statements +.sp .5 +\fBreturn\fP +.sp .5 +\fBreturn(\fI\|expression\|\fB)\fR +.PP +The \fBreturn\fR statement causes termination of a function, +popping of its auto variables, and +specifies the result of the function. +The first form is equivalent to \fBreturn(0)\fR. +The result of the function is the result of the expression +in parentheses. +Leaving out the expression between parentheses is equivalent to +\fBreturn(0)\fR. +As a non-portable extension, the parentheses may be left out. +.NH 2 +Print +.PP +The \fBprint\fR statement takes a list of comma-separated expressions. +Each expression in the list is evaluated and the computed +value is printed and assigned to the variable `last'. +No trailing newline is printed. +The expression may also be a string enclosed in double quotes. +Within these strings the following escape sequences may be used: +\ea +for bell (alert), +`\eb' +for backspace, +`\ef' +for formfeed, +`\en' +for newline, +`\er' +for carriage return, +`\et' +`for tab, +`\eq' +for double quote and +`\e\e' +for backslash. +Any other character following a backslash will be ignored. +Strings will not be assigned to `last'. +The \fBprint\fR statement is a non-portable extension. +.NH 2 +Quit +.PP +The \fBquit\fR statement stops execution of a BC program and returns +control to UNIX when it is first encountered. +Because it is not treated as an executable statement, +it cannot be used +in a function definition or in an +.ft B +if, for, +.ft +or +.ft B +while +.ft +statement. diff --git a/share/doc/usd/07.mail/Makefile b/share/doc/usd/07.mail/Makefile index d5a6d3c..790aa96 100644 --- a/share/doc/usd/07.mail/Makefile +++ b/share/doc/usd/07.mail/Makefile @@ -6,6 +6,5 @@ SRCS= mail0.nr mail1.nr mail2.nr mail3.nr mail4.nr mail5.nr mail6.nr \ mail7.nr mail8.nr mail9.nr maila.nr MACROS= -me USE_TBL= -SRCDIR= ${.CURDIR}/../../../../usr.bin/mail/USD.doc .include diff --git a/share/doc/usd/07.mail/mail0.nr b/share/doc/usd/07.mail/mail0.nr new file mode 100644 index 0000000..e569a5f --- /dev/null +++ b/share/doc/usd/07.mail/mail0.nr @@ -0,0 +1,72 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail0.nr 8.1 (Berkeley) 6/8/93 +.\" +.\" $FreeBSD$ +.\" +.eh 'USD:7-%''Mail Reference Manual' +.oh 'Mail Reference Manual''USD:7-%' +.if n \ +.nr fs .5v +.\".he 'Mail Reference Manual'\n(mo/\n(dy/\n(yr'%' +.tp +.sp 1.0i +.sz 12 +.rb +.(l C +MAIL REFERENCE MANUAL +.)l +.sz 10 +.sp 2 +.i +.(l C +Kurt Shoens +.)l +.r +.(l C +Revised by +.)l +.(l C +.i +Craig Leres\ \c +.r +and\ \c +.i +Mark Andrews +.)l +.r +.(l C +Version 5.5 + + +.)l +.pn 2 diff --git a/share/doc/usd/07.mail/mail1.nr b/share/doc/usd/07.mail/mail1.nr new file mode 100644 index 0000000..50e7883 --- /dev/null +++ b/share/doc/usd/07.mail/mail1.nr @@ -0,0 +1,92 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail1.nr 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 Introduction +.pp +.i Mail +provides a simple and friendly environment for sending and receiving mail. +It divides incoming mail into +its constituent messages and allows the user to deal with them +in any order. In addition, it provides a set of +.i ed -\c +like commands for manipulating messages and sending mail. +.i Mail +offers the user simple editing capabilities to ease the composition +of outgoing messages, as well as providing the ability to define and send +to names which address groups of users. Finally, +.i Mail +is able to send and receive messages across such networks as the +ARPANET, UUCP, and Berkeley network. +.pp +This document describes how to use the +.i Mail +program to send and receive messages. The reader is not assumed to +be familiar with other message handling systems, but should be +familiar with the \s-2UNIX\s0\** +.(f +\** \s-1UNIX\s0 is a trademark of Bell Laboratories. +.)f +shell, the text editor, and some of the common \s-2UNIX\s0 commands. +.q "The \s-2UNIX\s0 Programmer's Manual," +.q "An Introduction to Csh," +and +.q "Text Editing with Ex and Vi" +can be consulted for more information on these topics. +.pp +Here is how messages are handled: +the mail system accepts incoming +.i messages +for you from other people +and collects them in a file, called your +.i "system mailbox" . +When you login, the system notifies you if there are any messages +waiting in your system mailbox. If you are a +.i csh +user, you will be notified when new mail arrives if you inform +the shell of the location of your mailbox. On version 7 systems, +your system mailbox is located in the directory /var/mail +in a file with your login name. If your login name is +.q sam, +then you can make +.i csh +notify you of new mail by including the following line in your .cshrc +file: +.(l +set mail=/var/mail/sam +.)l +When you read your mail using +.i Mail , +it reads your system mailbox and separates that file into the +individual messages that have been sent to you. You can then +read, reply to, delete, or save these messages. +Each message is marked with its author and the date they sent it. diff --git a/share/doc/usd/07.mail/mail2.nr b/share/doc/usd/07.mail/mail2.nr new file mode 100644 index 0000000..0419859 --- /dev/null +++ b/share/doc/usd/07.mail/mail2.nr @@ -0,0 +1,617 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail2.nr 8.1 (Berkeley) 6/8/93 +.\" +.bp +.sh 1 "Common usage" +.pp +The +.i Mail +command has two distinct usages, according to whether one +wants to send or receive mail. Sending mail is simple: to send a +message to a user whose login name is, say, +\*(lqroot,\*(rq +use the shell +command: +.(l +% Mail root +.)l +then type your message. When you reach the end of the message, type +an EOT (control\-d) at the beginning of a line, which will cause +.i Mail +to echo \*(lqEOT\*(rq and return you to the Shell. When the user you sent mail +to next logs in, he will receive the message: +.(l +You have mail. +.)l +to alert him to the existence of your message. +.pp +If, while you are composing the message +you decide that you do not wish to send it after all, you can +abort the letter with a \s-2RUBOUT\s0. Typing a single \s-2RUBOUT\s0 +causes +.i Mail +to print +.(l +(Interrupt -- one more to kill letter) +.)l +Typing a second +\s-2RUBOUT\s0 causes +.i Mail +to save your partial letter on the file +.q dead.letter +in your home directory and abort the letter. +Once you have +sent mail to someone, there is no way to undo the act, so be +careful. +.pp +The message your recipient reads will consist of the message you +typed, preceded by a line telling who sent the message (your login name) +and the date and time it +was sent. +.pp +If you want to send the same message to several other people, you can list +their login names on the command line. +Thus, +.(l +% Mail sam bob john +Tuition fees are due next Friday. Don't forget!! + +EOT +% +.)l +will send the reminder to sam, bob, and john. +.pp +If, when you log in, you see the message, +.(l +You have mail. +.)l +you can read the mail by typing simply: +.(l +% Mail +.)l +.i Mail +will respond by typing its version number and date and then listing +the messages you have waiting. Then it will type a prompt and await +your command. The messages are assigned numbers starting with 1 \*- you +refer to the messages with these numbers. +.i Mail +keeps track of which messages are +.i new +(have been sent since you last read your mail) and +.i read +(have been read by you). New messages have an +.b N +next to them in the header listing and old, but unread messages have +a +.b U +next to them. +.i Mail +keeps track of new/old and read/unread messages by putting a +header field called +.q Status +into your messages. +.pp +To look at a specific message, use the +.b type +command, which may be abbreviated to simply +.b t . +For example, if you had the following messages: +.(l +N 1 root Wed Sep 21 09:21 "Tuition fees" +N 2 sam Tue Sep 20 22:55 +.)l +you could examine the first message by giving the command: +.(l +type 1 +.)l +which might cause +.i Mail +to respond with, for example: +.(l +Message 1: +From root Wed Sep 21 09:21:45 1978 +Subject: Tuition fees +Status: R + +Tuition fees are due next Wednesday. Don't forget!! + +.)l +Many +.i Mail +commands that operate on messages take a message number as an +argument like the +.b type +command. For these commands, there is a notion of a current +message. When you enter the +.i Mail +program, the current message is initially the first one. Thus, +you can often omit the message number and use, for example, +.(l +t +.)l +to type the current message. As a further shorthand, you can type a message +by simply giving its message number. Hence, +.(l +1 +.)l +would type the first message. +.pp +Frequently, it is useful to read the messages in your mailbox in order, +one after another. You can read the next message in +.i Mail +by simply typing a newline. As a special case, you can type a newline +as your first command to +.i Mail +to type the first message. +.pp +If, after typing a message, you wish to immediately send a reply, +you can do so with the +.b reply +command. +.b Reply , +like +.b type , +takes a message number as an argument. +.i Mail +then begins a message addressed to the user who sent you the message. +You may then type in your letter in reply, followed by a +at the beginning of a line, as before. +.i Mail +will type EOT, then type the ampersand prompt to indicate its readiness +to accept another command. In our example, if, after typing the +first message, you wished to reply to it, you might give the command: +.(l +reply +.)l +.i Mail +responds by typing: +.(l +To: root +Subject: Re: Tuition fees +.)l +and waiting for you to enter your letter. +You are now in the message collection mode described at the beginning +of this section and +.i Mail +will gather up your message up to a control\-d. +Note that it copies the subject +header from the original message. This is useful in that correspondence +about a particular matter will tend to retain the same subject heading, +making it easy to recognize. If there are other header fields in +the message, the information found will also be used. +For example, if the letter had a +.q "To:" +header listing several recipients, +.i Mail +would arrange to send your replay to the same people as well. +Similarly, if the original message contained a +.q "Cc:" +(carbon copies to) field, +.i Mail +would send your reply to +.i those +users, too. +.i Mail +is careful, though, not too send the message to +.i you , +even if you appear in the +.q "To:" +or +.q "Cc:" +field, unless you ask to be included explicitly. See section 4 for more +details. +.pp +After typing in your letter, the dialog with +.i Mail +might look like the following: +.(l +reply +To: root +Subject: Tuition fees + +Thanks for the reminder +EOT +& +.)l +.pp +The +.b reply +command is especially useful for sustaining extended conversations +over the message system, with other +.q listening +users receiving copies of the conversation. The +.b reply +command can be abbreviated to +.b r . +.pp +Sometimes you will receive a message that has been sent to +several people and wish to reply +.i only +to the person who sent it. +.b Reply +with a capital +.b R +replies to a message, but sends a copy to the sender only. +.pp +If you wish, while reading your mail, to send a message to someone, +but not as a reply to one of your messages, you can send the message +directly with the +.b mail +command, which takes as arguments the names of the recipients you wish +to send to. For example, to send a message to +.q frank, +you would do: +.(l +mail frank +This is to confirm our meeting next Friday at 4. +EOT +& +.)l +The +.b mail +command can be abbreviated to +.b m . +.pp +Normally, each message you receive is saved in the file +.i mbox +in your login directory at the time you leave +.i Mail . +Often, +however, you will not want to save a particular message you +have received because it is only of passing interest. To avoid +saving a message in +.i mbox +you can delete it using the +.b delete +command. In our example, +.(l +delete 1 +.)l +will prevent +.i Mail +from saving message 1 (from root) in +.i mbox . +In addition to not saving deleted messages, +.i Mail +will not let +you type them, either. The effect is to make the message disappear +altogether, along with its number. The +.b delete +command can be abbreviated to simply +.b d . +.pp +Many features of +.i Mail +can be tailored to your liking with the +.b set +command. The +.b set +command has two forms, depending on whether you are setting +a +.i binary +option or a +.i valued +option. +Binary options are either on or off. For example, the +.q ask +option informs +.i Mail +that each time you send a message, you want it to prompt you for +a subject header, to be included in the message. +To set the +.q ask +option, you would type +.(l +set ask +.)l +.pp +Another useful +.i Mail +option is +.q hold. +Unless told otherwise, +.i Mail +moves the messages from your system mailbox to the file +.i mbox +in your home directory when you leave +.i Mail . +If you want +.i Mail +to keep your letters in the system mailbox instead, you can set the +.q hold +option. +.pp +Valued options are values which +.i Mail +uses to adapt to your tastes. For example, the +.q SHELL +option tells +.i Mail +which shell you like to use, and is specified by +.(l +set SHELL=/bin/csh +.)l +for example. Note that no spaces are allowed in +.q "SHELL=/bin/csh." +A complete list of the +.i Mail +options appears in section 5. +.pp +Another important valued option is +.q crt. +If you use a fast video terminal, you will find that when you +print long messages, they fly by too quickly for you to read them. +With the +.q crt +option, you can make +.i Mail +print any message larger than a given number of lines by sending +it through a paging program. This program is specified by the +valued option \fBPAGER\fP. +If \fBPAGER\fP is not set, a default paginator is used. +For example, most CRT users with 24-line screens should do: +.(l +set crt=24 +.)l +to paginate messages that will not fit on their screens. +In the default state, \fImore\fP (default paginator) prints a screenful of +information, then types --More--. Type a space to see the next screenful. +.pp +Another adaptation to user needs that +.i Mail +provides is that of +.i aliases . +An alias is simply a name which stands for one or more +real user names. +.i Mail +sent to an alias is really sent to the list of real users +associated with it. For example, an alias can be defined for the +members of a project, so that you can send mail to the whole project +by sending mail to just a single name. The +.b alias +command in +.i Mail +defines an alias. Suppose that the users in a project are +named Sam, Sally, Steve, and Susan. To define an alias called +.q project +for them, you would use the +.i Mail +command: +.(l +alias project sam sally steve susan +.)l +The +.b alias +command can also be used to provide a convenient name for someone +whose user name is inconvenient. For example, if a user named +.q "Bob Anderson" +had the login name +.q anderson," +you might want to use: +.(l +alias bob anderson +.)l +so that you could send mail to the shorter name, +.q bob. +.pp +While the +.b alias +and +.b set +commands allow you to customize +.i Mail , +they have the drawback that they must be retyped each time you enter +.i Mail . +To make them more convenient to use, +.i Mail +always looks for two files when it is invoked. It first reads +a system wide file +.q /etc/mail.rc, +then a user specific file, +.q .mailrc, +which is found in the user's home directory. +The system wide file +is maintained by the system administrator and +contains +.b set +commands that are applicable to all users of the system. +The +.q .mailrc +file is usually used by each user to set options the way he likes +and define individual aliases. +For example, my .mailrc file looks like this: +.(l +set ask nosave SHELL=/bin/csh +.)l +As you can see, it is possible to set many options in the +same +.b set +command. The +.q nosave +option is described in section 5. +.pp +Mail aliasing is implemented +at the system-wide level +by the mail delivery +system +.i sendmail . +These aliases are stored in the file /usr/lib/aliases and are +accessible to all users of the system. +The lines in /usr/lib/aliases are of +the form: +.(l +alias: name\*<1\*>, name\*<2\*>, name\*<3\*> +.)l +where +.i alias +is the mailing list name and the +.i name\* +are the members of the list. Long lists can be continued onto the next +line by starting the next line with a space or tab. Remember that you +must execute the shell command +.i newaliases +after editing /usr/lib/aliases since the delivery system +uses an indexed file created by +.i newaliases . +.pp +We have seen that +.i Mail +can be invoked with command line arguments which are people +to send the message to, or with no arguments to read mail. +Specifying the +.rb \-f +flag on the command line causes +.i Mail +to read messages from a file other than your system mailbox. +For example, if you have a collection of messages in +the file +.q letters +you can use +.i Mail +to read them with: +.(l +% Mail \-f letters +.)l +You can use all +the +.i Mail +commands described in this document to examine, modify, or delete +messages from your +.q letters +file, which will be rewritten when you leave +.i Mail +with the +.b quit +command described below. +.pp +Since mail that you read is saved in the file +.i mbox +in your home directory by default, you can read +.i mbox +in your home directory by using simply +.(l +% Mail \-f +.)l +.pp +Normally, messages that you examine using the +.b type +command are saved in the file +.q mbox +in your home directory if you leave +.i Mail +with the +.b quit +command described below. +If you wish to retain a message in your system mailbox +you can use the +.b preserve +command to tell +.i Mail +to leave it there. +The +.b preserve +command accepts a list of message numbers, just like +.b type +and may be abbreviated to +.b pre . +.pp +Messages in your system mailbox that you do not examine are +normally retained in your system mailbox automatically. +If you wish to have such a message saved in +.i mbox +without reading it, you may use the +.b mbox +command to have them so saved. For example, +.(l +mbox 2 +.)l +in our example would cause the second message (from sam) +to be saved in +.i mbox +when the +.b quit +command is executed. +.b Mbox +is also the way to direct messages to your +.i mbox +file if you have set the +.q hold +option described above. +.b Mbox +can be abbreviated to +.b mb . +.pp +When you have perused all the messages of interest, you can leave +.i Mail +with the +.b quit +command, which saves the messages you have typed but not +deleted in the file +.i mbox +in your login directory. Deleted messages are discarded irretrievably, +and messages left untouched are preserved in your system mailbox so +that you will see them the next time you type: +.(l +% Mail +.)l +The +.b quit +command can be abbreviated to simply +.b q . +.pp +If you wish for some reason to leave +.i Mail +quickly without altering either your system mailbox or +.i mbox , +you can type the +.b x +command (short for +.b exit ), +which will immediately return you to the Shell without changing anything. +.pp +If, instead, you want to execute a Shell command without leaving +.i Mail , +you +can type the command preceded by an exclamation point, just as in the +text editor. Thus, for instance: +.(l +!date +.)l +will print the current date without leaving +.i Mail . +.pp +Finally, the +.b help +command is available to print out a brief summary of the +.i Mail +commands, using only the single character command abbreviations. diff --git a/share/doc/usd/07.mail/mail3.nr b/share/doc/usd/07.mail/mail3.nr new file mode 100644 index 0000000..8b133ef --- /dev/null +++ b/share/doc/usd/07.mail/mail3.nr @@ -0,0 +1,133 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail3.nr 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "Maintaining folders" +.pp +.i Mail +includes a simple facility for maintaining groups of messages together +in folders. This section describes this facility. +.pp +To use the folder facility, you must tell +.i Mail +where you wish to keep your folders. Each folder of messages will +be a single file. For convenience, all of your folders are kept in +a single directory of your choosing. To tell +.i Mail +where your folder directory is, put a line of the form +.(l +set folder=letters +.)l +in your +.i .mailrc +file. If, as in the example above, your folder directory does not +begin with a `/,' +.i Mail +will assume that your folder directory is to be found starting from +your home directory. Thus, if your home directory is +.b /home/person +the above example told +.i Mail +to find your folder directory in +.b /home/person/letters . +.pp +Anywhere a file name is expected, you can use a folder name, preceded +with `+.' For example, to put a message into a folder with the +.b save +command, you can use: +.(l +save +classwork +.)l +to save the current message in the +.i classwork +folder. If the +.i classwork +folder does not yet exist, it will be created. Note that messages +which are saved with the +.b save +command are automatically removed from your system mailbox. +.pp +In order to make a copy of a message in a folder without causing +that message to be removed from your system mailbox, use the +.b copy +command, which is identical in all other respects to the +.b save +command. For example, +.(l +copy +classwork +.)l +copies the current message into the +.i classwork +folder and leaves a copy in your system mailbox. +.pp +The +.b folder +command +can be used to direct +.i Mail +to the contents of a different folder. +For example, +.(l +folder +classwork +.)l +directs +.i Mail +to read the contents of the +.i classwork +folder. All of the commands that you can use on your system +mailbox are also applicable to folders, including +.b type , +.b delete , +and +.b reply . +To inquire which folder you are currently editing, use simply: +.(l +folder +.)l +.pp +To list your current set of folders, use the +.b folders +command. +.pp +To start +.i Mail +reading one of your folders, you can use the +.b \-f +option described in section 2. For example: +.(l +% Mail \-f +classwork +.)l +will cause +.i Mail +to read your +.i classwork +folder without looking at your system mailbox. diff --git a/share/doc/usd/07.mail/mail4.nr b/share/doc/usd/07.mail/mail4.nr new file mode 100644 index 0000000..1a1e046 --- /dev/null +++ b/share/doc/usd/07.mail/mail4.nr @@ -0,0 +1,437 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail4.nr 8.1 (Berkeley) 6/8/93 +.\" +.bp +.sh 1 "More about sending mail" +.sh 2 "Tilde escapes" +.pp +While typing in a message to be sent to others, it is often +useful to be able to invoke the text editor on the partial message, +print the message, execute a shell command, or do some other +auxiliary function. +.i Mail +provides these capabilities through +.i "tilde escapes" , +which consist of a tilde (~) at the beginning of a line, followed by +a single character which indicates the function to be performed. For +example, to print the text of the message so far, use: +.(l +~p +.)l +which will print a line of dashes, the recipients of your message, and +the text of the message so far. +Since +.i Mail +requires two consecutive \s-2RUBOUT\s0's to abort a letter, you +can use a single \s-2RUBOUT\s0 to abort the output of ~p or any other +~ escape without killing your letter. +.pp +If you are dissatisfied with the message as +it stands, you can invoke the text editor on it using the escape +.(l +~e +.)l +which causes the message to be copied into a temporary file and an +instance of the editor to be spawned. After modifying the message to +your satisfaction, write it out and quit the editor. +.i Mail +will respond +by typing +.(l +(continue) +.)l +after which you may continue typing text which will be appended to your +message, or type to end the message. +A standard text editor is provided by +.i Mail . +You can override this default by setting the valued option +.q EDITOR +to something else. For example, you might prefer: +.(l +set EDITOR=/usr/bin/ex +.)l +.pp +Many systems offer a screen editor as an alternative to the standard +text editor, such as the +.i vi +editor from UC Berkeley. +To use the screen, or +.i visual +editor, on your current message, you can use the escape, +.(l +~v +.)l +~v works like ~e, except that the screen editor is invoked instead. +A default screen editor is defined by +.i Mail . +If it does not suit you, you can set the valued option +.q VISUAL +to the path name of a different editor. +.pp +It is often useful to be able to include the contents of some +file in your message; the escape +.(l +~r filename +.)l +is provided for this purpose, and causes the named file to be appended +to your current message. +.i Mail +complains if the file doesn't exist +or can't be read. If the read is successful, the number of lines and +characters appended to your message is printed, after which you may continue +appending text. The filename may contain shell metacharacters like * and ? +which are expanded according to the conventions of your shell. +.pp +As a special case of ~r, the escape +.(l +~d +.)l +reads in the file +.q dead.letter +in your home directory. This is often useful since +.i Mail +copies the text +of your message there when you abort a message with \s-2RUBOUT\s0. +.pp +To save the current text of your message on a file you may use the +.(l +~w filename +.)l +escape. +.i Mail +will print out the number of lines and characters written +to the file, after which you may continue appending text to your message. +Shell metacharacters may be used in the filename, as in ~r and are expanded +with the conventions of your shell. +.pp +If you are sending mail from within +.i Mail's +command mode +you can read a message sent to you into the message +you are constructing with the escape: +.(l +~m 4 +.)l +which will read message 4 into the current message, shifted right by +one tab stop. You can name any non-deleted message, or list of messages. +Messages can also be forwarded without shifting by a tab stop with ~f. +This is the usual way to forward a message. +.pp +If, in the process of composing a message, you decide to add additional +people to the list of message recipients, you can do so with the escape +.(l +~t name1 name2 ... +.)l +You may name as few or many additional recipients as you wish. Note +that the users originally on the recipient list will still receive +the message; you cannot remove someone from the recipient +list with ~t. +.pp +If you wish, you can associate a subject with your message by using the +escape +.(l +~s Arbitrary string of text +.)l +which replaces any previous subject with +.q "Arbitrary string of text." +The subject, if given, is sent near the +top of the message prefixed with +.q "Subject:" +You can see what the message will look like by using ~p. +.pp +For political reasons, one occasionally prefers to list certain +people as recipients of carbon copies of a message rather than +direct recipients. The escape +.(l +~c name1 name2 ... +.)l +adds the named people to the +.q "Cc:" +list, similar to ~t. +Again, you can execute ~p to see what the message will look like. +.pp +The escape +.(l +~b name1 name2 ... +.)l +adds the named people to the +.q "Cc:" +list, but does not make the names visible in the +.q "Cc:" +line ("blind" carbon copy). +.pp +The recipients of the message together constitute the +.q "To:" +field, the subject the +.q "Subject:" +field, and the carbon copies the +.q "Cc:" +field. If you wish to edit these in ways impossible with the ~t, ~s, ~c +and ~b escapes, you can use the escape +.(l +~h +.)l +which prints +.q "To:" +followed by the current list of recipients and leaves the cursor +(or printhead) at the end of the line. If you type in ordinary +characters, they are appended to the end of the current list of +recipients. You can also use your erase character to erase back into +the list of recipients, or your kill character to erase them altogether. +Thus, for example, if your erase and kill characters are the standard +(on printing terminals) # and @ symbols, +.(l +~h +To: root kurt####bill +.)l +would change the initial recipients +.q "root kurt" +to +.q "root bill." +When you type a newline, +.i Mail +advances to the +.q "Subject:" +field, where the same rules apply. Another newline brings you to +the +.q "Cc:" +field, which may be edited in the same fashion. Another newline +brings you to the +.q "Bcc:" +("blind" carbon copy) field, which follows the same rules as the "Cc:" +field. Another newline +leaves you appending text to the end of your message. You can use +~p to print the current text of the header fields and the body +of the message. +.pp +To effect a temporary escape to the shell, the escape +.(l +~!command +.)l +is used, which executes +.i command +and returns you to mailing mode without altering the text of +your message. If you wish, instead, to filter the body of your +message through a shell command, then you can use +.(l +~|command +.)l +which pipes your message through the command and uses the output +as the new text of your message. If the command produces no output, +.i Mail +assumes that something is amiss and retains the old version +of your message. A frequently-used filter is the command +.i fmt , +designed to format outgoing mail. +.pp +To effect a temporary escape to +.i Mail +command mode instead, you can use the +.(l +~:\fIMail command\fP +.)l +escape. This is especially useful for retyping the message you are +replying to, using, for example: +.(l +~:t +.)l +It is also useful for setting options and modifying aliases. +.pp +If you wish abort the current message, you can use the escape +.(l +~q +.)l +This will terminate the current message and return you to the +shell (or \fIMail\fP if you were using the \fBmail\fP command). +If the \fBsave\fP option is set, the message will be copied +to the file +.q dead.letter +in your home directory. +.pp +If you wish (for some reason) to send a message that contains +a line beginning with a tilde, you must double it. Thus, for example, +.(l +~~This line begins with a tilde. +.)l +sends the line +.(l +~This line begins with a tilde. +.)l +.pp +Finally, the escape +.(l +~? +.)l +prints out a brief summary of the available tilde escapes. +.pp +On some terminals (particularly ones with no lower case) +tilde's are difficult to type. +.i Mail +allows you to change the escape character with the +.q escape +option. For example, I set +.(l +set escape=] +.)l +and use a right bracket instead of a tilde. If I ever need to +send a line beginning with right bracket, I double it, just as for ~. +Changing the escape character removes the special meaning of ~. +.sh 2 "Network access" +.pp +This section describes how to send mail to people on other machines. +Recall that sending to a plain login name sends mail to that person +on your machine. If your machine is directly (or sometimes, even, +indirectly) connected to the Arpanet, you can send messages to people +on the Arpanet using a name of the form +.(l +name@host.domain +.)l +where +.i name +is the login name of the person you're trying to reach, +.i host +is the name of the machine on the Arpanet, +and +.i domain +is the higher-level scope within which the hostname is known, e.g. EDU (for educational +institutions), COM (for commercial entities), GOV (for governmental agencies), +ARPA for many other things, BITNET or CSNET for those networks. +.pp +If your recipient logs in on a machine connected to yours by +UUCP (the Bell Laboratories supplied network that communicates +over telephone lines), sending mail can be a bit more complicated. +You must know the list of machines through which your message must +travel to arrive at his site. So, if his machine is directly connected +to yours, you can send mail to him using the syntax: +.(l +host!name +.)l +where, again, +.i host +is the name of the machine and +.i name +is the login name. +If your message must go through an intermediary machine first, you +must use the syntax: +.(l +intermediary!host!name +.)l +and so on. It is actually a feature of UUCP that the map of all +the systems in the network is not known anywhere (except where people +decide to write it down for convenience). Talk to your system administrator +about good ways to get places; the +.i uuname +command will tell you systems whose names are recognized, but not which +ones are frequently called or well-connected. +.pp +When you use the +.b reply +command to respond to a letter, there is a problem of figuring out the +names of the users in the +.q "To:" +and +.q "Cc:" +lists +.i "relative to the current machine" . +If the original letter was sent to you by someone on the local machine, +then this problem does not exist, but if the message came from a remote +machine, the problem must be dealt with. +.i Mail +uses a heuristic to build the correct name for each user relative +to the local machine. So, when you +.b reply +to remote mail, the names in the +.q "To:" +and +.q "Cc:" +lists may change somewhat. +.sh 2 "Special recipients" +.pp +As described previously, you can send mail to either user names or +.b alias +names. It is also possible to send messages directly to files or to +programs, using special conventions. If a recipient name has a +`/' in it or begins with a `+', it is assumed to be the +path name of a file into which +to send the message. If the file already exists, the message is +appended to the end of the file. If you want to name a file in +your current directory (ie, one for which a `/' would not usually +be needed) you can precede the name with `./' +So, to send mail to the file +.q memo +in the current directory, you can give the command: +.(l +% Mail ./memo +.)l +If the name begins with a `+,' it is expanded into the full path name +of the folder name in your folder directory. +This ability to send mail to files can be used for a variety of +purposes, such as maintaining a journal and keeping a record of +mail sent to a certain group of users. The second example can be +done automatically by including the full pathname of the record +file in the +.b alias +command for the group. Using our previous +.b alias +example, you might give the command: +.(l +alias project sam sally steve susan /usr/project/mail_record +.)l +Then, all mail sent to "project" would be saved on the file +.q /usr/project/mail_record +as well as being sent to the members of the project. This file +can be examined using +.i "Mail \-f" . +.pp +It is sometimes useful to send mail directly to a program, for +example one might write a project billboard program and want to access +it using +.i Mail . +To send messages to the billboard program, one can send mail +to the special name `|billboard' for example. +.i Mail +treats recipient names that begin with a `|' as a program to send +the mail to. An +.b alias +can be set up to reference a `|' prefaced name if desired. +.i Caveats : +the shell treats `|' specially, so it must be quoted on the command +line. Also, the `| program' must be presented as a single argument to +mail. The safest course is to surround the entire name with double +quotes. This also applies to usage in the +.b alias +command. For example, if we wanted to alias `rmsgs' to `rmsgs \-s' +we would need to say: +.(l +alias rmsgs "| rmsgs -s" +.)l diff --git a/share/doc/usd/07.mail/mail5.nr b/share/doc/usd/07.mail/mail5.nr new file mode 100644 index 0000000..10e707c --- /dev/null +++ b/share/doc/usd/07.mail/mail5.nr @@ -0,0 +1,1042 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail5.nr 8.1 (Berkeley) 6/8/93 +.\" $FreeBSD$ +.\" +.bp +.sh 1 "Additional features" +.pp +This section describes some additional commands useful for +reading your mail, setting options, and handling lists of messages. +.sh 2 "Message lists" +.pp +Several +.i Mail +commands accept a list of messages as an argument. +Along with +.b type +and +.b delete , +described in section 2, +there is the +.b from +command, which prints the message headers associated with the +message list passed to it. +The +.b from +command is particularly useful in conjunction with some of the +message list features described below. +.pp +A +.i "message list" +consists of a list of message numbers, ranges, and names, +separated by spaces or tabs. Message numbers may be either +decimal numbers, which directly specify messages, or one of the +special characters +.q \(ua +.q "." +or +.q "$" +to specify the first relevant, current, or last +relevant message, respectively. +.i Relevant +here means, for most commands +.q "not deleted" +and +.q "deleted" +for the +.b undelete +command. +.pp +A range of messages consists of two message numbers (of the form +described in the previous paragraph) separated by a dash. +Thus, to print the first four messages, use +.(l +type 1\-4 +.)l +and to print all the messages from the current message to the last +message, use +.(l +type .\-$ +.)l +.pp +A +.i name +is a user name. The user names given in the message list are +collected together and each message selected by other means +is checked to make sure it was sent by one of the named users. +If the message consists entirely of user names, then every +message sent by one of those users that is +.i relevant +(in the sense described earlier) +is selected. Thus, to print every message sent to you by +.q root, +do +.(l +type root +.)l +.pp +As a shorthand notation, you can specify simply +.q * +to get every +.i relevant +(same sense) +message. Thus, +.(l +type * +.)l +prints all undeleted messages, +.(l +delete * +.)l +deletes all undeleted messages, and +.(l +undelete * +.)l +undeletes all deleted messages. +.pp +You can search for the presence of a word in subject lines with +.b / . +For example, to print the headers of all messages that contain the +word +.q PASCAL, +do: +.(l +from /pascal +.)l +Note that subject searching ignores upper/lower case differences. +.sh 2 "List of commands" +.pp +This section describes all the +.i Mail +commands available when +receiving mail. +.ip "\fB\-\fP\ \ " +The +.rb \- +command goes to the previous message and prints it. The +.rb \- +command may be given a decimal number +.i n +as an argument, in which case the +.i n th +previous message is gone to and printed. +.ip "\fB?\fP\ \ " +Prints a brief summary of commands. +.ip "\fB!\fP\ \ " +Used to preface a command to be executed by the shell. +.ip "\fBPrint\fP\ \ " +Like +.b print , +but also print out ignored header fields. See also +\fBprint\fP, \fBignore\fP and \fBretain\fP. +\fBPrint\fP can be abbreviated to \fBP\fP. +.ip "\fBReply\fP or \fBRespond\fP\ \ " +Note the capital \fBR\fP in the name. +Frame a reply to a one or more messages. +The reply (or replies if you are using this on multiple messages) +will be sent ONLY to the person who sent you the message +(respectively, the set of people who sent the messages you are +replying to). +You can +add people using the \fB~t\fP, \fB~c\fP and \fB~b\fP +tilde escapes. The subject in your reply is formed by prefacing the +subject in the original message with +.q "Re:" +unless it already began thus. +If the original message included a +.q "reply-to" +header field, the reply will go +.i only +to the recipient named by +.q "reply-to." +You type in your message using the same conventions available to you +through the +.b mail +command. +The +.b Reply +command is especially useful for replying to messages that were sent +to enormous distribution groups when you really just want to +send a message to the originator. Use it often. +\fBReply\fP (and \fBRespond\fP) can be abbreviated to \fBR\fP. +.ip "\fBType\fP\ \ " +Identical to the +.b Print +command. +\fBType\fP can be abbreviated to \fBT\fP. +.ip "\fBalias\fP\ \ " +Define a name to stand for a set of other names. +This is used when you want to send messages to a certain +group of people and want to avoid retyping their names. +For example +.(l +alias project john sue willie kathryn +.)l +creates an alias +.i project +which expands to the four people John, Sue, Willie, and Kathryn. +If no arguments are given, all currently-defined aliases are printed. +If one argument is given, that alias is printed (if it exists). +\fBAlias\fP can be abbreviated to \fBa\fP. +.ip "\fBalternates\fP\ \ " +If you have accounts on several machines, you may find it convenient +to use the /usr/lib/aliases on all the machines except one to direct +your mail to a single account. +The +.b alternates +command is used to inform +.i Mail +that each of these other addresses is really +.i you . +.i Alternates +takes a list of user names and remembers that they are all actually you. +When you +.b reply +to messages that were sent to one of these alternate names, +.i Mail +will not bother to send a copy of the message to this other address (which +would simply be directed back to you by the alias mechanism). +If +.i alternates +is given no argument, it lists the current set of alternate names. +.b Alternates +is usually used in the .mailrc file. +\fBAlternates\fP can be abbreviated to \fBalt\fP. +.ip "\fBchdir\fP\ \ " +The +.b chdir +command allows you to change your current directory. +.b Chdir +takes a single argument, which is taken to be the pathname of +the directory to change to. If no argument is given, +.b chdir +changes to your home directory. +\fBChdir\fP can be abbreviated to \fBc\fP. +.ip "\fBcopy\fP\ \ " +The +.b copy +command does the same thing that +.b save +does, except that it does not mark the messages it is used on +for deletion when you quit. +\fBCopy\fP can be abbreviated to \fBco\fP. +.ip "\fBdelete\fP\ \ " +Deletes a list of messages. Deleted messages can be reclaimed +with the +.b undelete +command. +\fBDelete\fP can be abbreviated to \fBd\fP. +.ip "\fBdp\fP or \fBdt\fP\ \ " +These +commands delete the current message and print the next message. +They are useful for quickly reading and disposing of mail. +If there is no next message, \fImail\fP says ``at EOF.'' +.ip "\fBedit\fP\ \ " +To edit individual messages using the text editor, the +.b edit +command is provided. The +.b edit +command takes a list of messages as described under the +.b type +command and processes each by writing it into the file +Message\c +.i x +where +.i x +is the message number being edited and executing the text editor on it. +When you have edited the message to your satisfaction, write the message +out and quit, upon which +.i Mail +will read the message back and remove the file. +.b Edit +can be abbreviated to +.b e . +.ip "\fBelse\fP\ \ " +Marks the end of the then-part of an +.b if +statement and the beginning of the +part to take effect if the condition of the +.b if +statement is false. +.ip "\fBendif\fP\ \ " +Marks the end of an +.b if +statement. +.ip "\fBexit\fP or \fBxit\fP\ \ " +Leave +.i Mail +without updating the system mailbox or the file your were reading. +Thus, if you accidentally delete several messages, you can use +.b exit +to avoid scrambling your mailbox. +\fBExit\fP can be abbreviated to \fBex\fP or \fBx\fP. +.ip "\fBfile\fP\ \ " +The same as +.b folder . +\fBFile\fP can be abbreviated to \fBfi\fP. +.ip "\fBfolders\fP\ \ " +List the names of the folders in your folder directory. +.ip "\fBfolder\fP\ \ " +The +.b folder +command switches to a new mail file or folder. With no arguments, it +tells you which file you are currently reading. If you give +it an argument, it will write out changes (such as deletions) +you have made in the current file and read the new file. +Some special conventions are recognized for the name: +.(b +.TS +center; +c c +l a. +Name Meaning +_ +# Previous file read +% Your system mailbox +%name \fIName\fP's system mailbox +& Your ~/mbox file ++folder A file in your folder directory +.TE +.)b +\fBFolder\fP can be abbreviated to \fBfo\fP. +.ip "\fBfrom\fP\ \ " +The +.b from +command takes a list of messages and prints out the header lines for each one; +hence +.(l +from joe +.)l +is the easy way to display all the message headers from \*(lqjoe.\*(rq +\fBFrom\fP can be abbreviated to \fBf\fP. +.ip "\fBheaders\fP\ \ " +When you start up +.i Mail +to read your mail, it lists the message headers that you have. +These headers tell you who each message is from, when they were +received, how many lines and characters each message is, and the +.q "Subject:" +header field of each message, if present. In addition, +.i Mail +tags the message header of each message that has been the object +of the +.b preserve +command with a +.q P. +Messages that have been +.b saved +or +.b written +are flagged with a +.q *. +Finally, +.b deleted +messages are not printed at all. If you wish to reprint the current +list of message headers, you can do so with the +.b headers +command. The +.b headers +command (and thus the initial header listing) +only lists the first so many message headers. +The number of headers listed depends on the speed of your +terminal. +This can be overridden by specifying the number of headers you +want with the +.i window +option. +.i Mail +maintains a notion of the current +.q window +into your messages for the purposes of printing headers. +Use the +.b z +command to move forward and back a window. +You can move +.i Mail's +notion of the current window directly to a particular message by +using, for example, +.(l +headers 40 +.)l +to move +.i Mail's +attention to the messages around message 40. +If a ``+'' argument is given, then the next screenful of message headers is +printed, and if a ``\-'' argument is given, the previous screenful of message +headers is printed. +\fBHeaders\fP can be abbreviated to \fBh\fP. +.ip "\fBhelp\fP\ \ " +Print a brief and usually out of date help message about the commands +in +.i Mail . +The +.i man +page for +.i mail +is usually more up-to-date than either the help message or this manual. +It is also a synonym for \fB?\fP. +.ip "\fBhold\fP\ \ " +Arrange to hold a list of messages in the system mailbox, instead +of moving them to the file +.i mbox +in your home directory. If you set the binary option +.i hold , +this will happen by default. +It does not override the \fBdelete\fP command. +\fBHold\fP can be abbreviated to \fBho\fP. +.ip "\fBif\fP\ \ " +Commands in your +.q .mailrc +file can be executed conditionally depending on whether you are +sending or receiving mail with the +.b if +command. For example, you can do: +.(l +if receive + \fIcommands\fP... +endif +.)l +An +.b else +form is also available: +.(l +if send + \fIcommands\fP... +else + \fIcommands\fP... +endif +.)l +Note that the only allowed conditions are +.b receive +and +.b send . +.ip "\fBignore\fP \ \ " +.b N.B.: +.i Ignore +has been superseded by +.i retain. +.br +Add the list of header fields named to the +.i "ignore list" . +Header fields in the ignore list are not printed on your +terminal when you print a message. This allows you to suppress +printing of certain machine-generated header fields, such as +.i Via +which are not usually of interest. The +.b Type +and +.b Print +commands can be used to print a message in its entirety, including +ignored fields. +If +.b ignore +is executed with no arguments, it lists the current set of ignored fields. +.ip "\fBlist\fP\ \ " +List the valid +.i Mail +commands. +\fBList\fP can be abbreviated to \fBl\fP. +.\".ip \fBlocal\fP +.\"Define a list of local names for this host. This command is useful +.\"when the host is known by more than one name. Names in the list +.\"may be qualified be the domain of the host. The first name on the local +.\"list is the +.\".i distinguished +.\"name of the host. +.\"The names on the local list are used by +.\".i Mail +.\"to decide which addresses are local to the host. +.\"For example: +.\".(l +.\"local ucbarpa.BERKELEY.ARPA arpa.BERKELEY.ARPA \\ +.\" arpavax.BERKELEY.ARPA r.BERKELEY.ARPA \\ +.\" ucb-arpa.ARPA +.\".)l +.\"From this list we see that +.\".i "fred@ucbarpa.BERKELEY.ARPA", +.\".i "harold@arpa.BERKELEY", +.\"and +.\".i "larry@r" +.\"are all addresses of users on the local host. +.\"The +.\".b local +.\"command is usually not used be general users since it is designed for +.\"local configuration; it is usually found in the file /etc/mail.rc. +.ip "\fBmail\fP\ \ " +Send mail to one or more people. If you have the +.i ask +option set, +.i Mail +will prompt you for a subject to your message. Then you +can type in your message, using tilde escapes as described in +section 4 to edit, print, or modify your message. To signal your +satisfaction with the message and send it, type control-d at the +beginning of a line, or a . alone on a line if you set the option +.i dot . +To abort the message, type two interrupt characters (\s-2RUBOUT\s0 +by default) in a row or use the +.b ~q +escape. +The \fBmail\fP command can be abbreviated to \fBm\fP. +.ip "\fBmbox\fP\ \ " +Indicate that a list of messages be sent to +.i mbox +in your home directory when you quit. This is the default +action for messages if you do +.i not +have the +.i hold +option set. +.ip "\fBnext\fP or \fB+\fP\ \ " +The +.b next +command goes to the next message and types it. If given a message list, +.b next +goes to the first such message and types it. Thus, +.(l +next root +.)l +goes to the next message sent by +.q root +and types it. The +.b next +command can be abbreviated to simply a newline, which means that one +can go to and type a message by simply giving its message number or +one of the magic characters +.q "^" +.q "." +or +.q "$". +Thus, +.(l +\&. +.)l +prints the current message and +.(l +4 +.)l +prints message 4, as described previously. +\fBNext\fP can be abbreviated to \fBn\fP. +.ip "\fBpreserve\fP\ \ " +Same as +.b hold . +Cause a list of messages to be held in your system mailbox when you quit. +\fBPreserve\fP can be abbreviated to \fBpre\fP. +.ip "\fBprint\fP\ \ " +Print the specified messages. If the +.b crt +variable is set, messages longer than the number of lines it indicates +are paged through the command specified by the \fBPAGER\fP variable. +The \fBprint\fP command can be abbreviated to \fBp\fP. +.ip "\fBquit\fP\ \ " +Terminates the session, saving all undeleted, unsaved and unwritten messages +in the user's \fImbox\fP file in their login directory +(messages marked as having been read), preserving all +messages marked with \fBhold\fP or \fBpreserve\fP or never referenced +in their system mailbox. +Any messages that were deleted, saved, written or saved to \fImbox\fP are +removed from their system mailbox. +If new mail has arrived during the session, the message +``You have new mail'' is given. If given while editing a mailbox file +with the \fB\-f\fP flag, then the edit file is rewritten. +A return to the Shell is effected, unless the rewrite of edit file fails, +in which case the user can escape with the \fBexit\fP command. +\fBQuit\fP can be abbreviated to \fBq\fP. +.ip "\fBreply\fP or \fBrespond\fP\ \ " +Frame a reply to a single message. +The reply will be sent to the +person who sent you the message (to which you are replying), plus all +the people who received the original message, except you. You can +add people using the \fB~t\fP, \fB~c\fP and \fB~b\fP +tilde escapes. The subject in your reply is formed by prefacing the +subject in the original message with +.q "Re:" +unless it already began thus. +If the original message included a +.q "reply-to" +header field, the reply will go +.i only +to the recipient named by +.q "reply-to." +You type in your message using the same conventions available to you +through the +.b mail +command. +The \fBreply\fP (and \fBrespond\fP) command can be abbreviated to \fBr\fP. +.ip "\fBretain\fP\ \ " +Add the list of header fields named to the \fIretained list\fP. +Only the header fields in the retain list +are shown on your terminal when you print a message. +All other header fields are suppressed. +The +.b Type +and +.b Print +commands can be used to print a message in its entirety. +If +.b retain +is executed with no arguments, it lists the current set of +retained fields. +.ip "\fBsave\fP\ \ " +It is often useful to be able to save messages on related topics +in a file. The +.b save +command gives you the ability to do this. The +.b save +command takes as an argument a list of message numbers, followed by +the name of the file in which to save the messages. The messages +are appended to the named file, thus allowing one to keep several +messages in the file, stored in the order they were put there. +The filename in quotes, followed by the line +count and character count is echoed on the user's terminal. +An example of the +.b save +command relative to our running example is: +.(l +s 1 2 tuitionmail +.)l +.b Saved +messages are not automatically saved in +.i mbox +at quit time, nor are they selected by the +.b next +command described above, unless explicitly specified. +\fBSave\fP can be abbreviated to \fBs\fP. +.ip "\fBset\fP\ \ " +Set an option or give an option a value. Used to customize +.i Mail . +Section 5.3 contains a list of the options. Options can be +.i binary , +in which case they are +.i on +or +.i off , +or +.i valued . +To set a binary option +.i option +.i on , +do +.(l +set option +.)l +To give the valued option +.i option +the value +.i value , +do +.(l +set option=value +.)l +There must be no space before or after the ``='' sign. +If no arguments are given, all variable values are printed. +Several options can be specified in a single +.b set +command. +\fBSet\fP can be abbreviated to \fBse\fP. +.ip "\fBshell\fP\ \ " +The +.b shell +command allows you to +escape to the shell. +.b Shell +invokes an interactive shell and allows you to type commands to it. +When you leave the shell, you will return to +.i Mail . +The shell used is a default assumed by +.i Mail ; +you can override this default by setting the valued option +.q SHELL, +eg: +.(l +set SHELL=/bin/csh +.)l +\fBShell\fP can be abbreviated to \fBsh\fP. +.ip "\fBsize\fP\ \ " +Takes a message list and prints out the size in characters of each +message. +.ip "\fBsource\fP\ \ " +The +.b source +command reads +.i mail +commands from a file. It is useful when you are trying to fix your +.q .mailrc +file and you need to re-read it. +\fBSource\fP can be abbreviated to \fBso\fP. +.ip "\fBtop\fP\ \ " +The +.b top +command takes a message list and prints the first five lines +of each addressed message. +If you wish, you can change the number of lines that +.b top +prints out by setting the valued option +.q "toplines." +On a CRT terminal, +.(l +set toplines=10 +.)l +might be preferred. +\fBTop\fP can be abbreviated to \fBto\fP. +.ip "\fBtype\fP\ \ " +Same as \fBprint\fP. +Takes a message list and types out each message on the terminal. +The \fBtype\fP command can be abbreviated to \fBt\fP. +.ip "\fBundelete\fP \ \" +Takes a message list and marks each message as \fInot\fP +being deleted. +\fBUndelete\fP can be abbreviated to \fBu\fP. +.ip "\fBunread\fP\ \ " +Takes a message list and marks each message as +.i not +having been read. +\fBUnread\fP can be abbreviated to \fBU\fP. +.ip "\fBunset\fP\ \ " +Takes a list of option names and discards their remembered values; +the inverse of \fBset\fP . +.ip "\fBvisual\fP\ \ " +It is often useful to be able to invoke one of two editors, +based on the type of terminal one is using. To invoke +a display oriented editor, you can use the +.b visual +command. The operation of the +.b visual +command is otherwise identical to that of the +.b edit +command. +.ne 2v+\n(psu +.sp \n(psu +Both the +.b edit +and +.b visual +commands assume some default text editors. These default editors +can be overridden by the valued options +.q EDITOR +and +.q VISUAL +for the standard and screen editors. You might want to do: +.(l +set EDITOR=/usr/bin/ex VISUAL=/usr/bin/vi +.)l +\fBVisual\fP can be abbreviated to \fBv\fP. +.ip "\fBwrite\fP\ \ " +The +.b save +command always writes the entire message, including the headers, +into the file. If you want to write just the message itself, you +can use the +.b write +command. The +.b write +command has the same syntax as the +.b save +command, and can be abbreviated to simply +.b w . +Thus, we could write the second message by doing: +.(l +w 2 file.c +.)l +As suggested by this example, the +.b write +command is useful for such tasks as sending and receiving +source program text over the message system. +The filename in quotes, followed by the line +count and character count is echoed on the user's terminal. +.ip "\fBz\fP\ \ " +.i Mail +presents message headers in windowfuls as described under +the +.b headers +command. +You can move +.i Mail's +attention forward to the next window by giving the +.(l +z+ +.)l +command. Analogously, you can move to the previous window with: +.(l +z\- +.)l +.sh 2 "Custom options" +.pp +Throughout this manual, we have seen examples of binary and valued options. +This section describes each of the options in alphabetical order, including +some that you have not seen yet. +To avoid confusion, please note that the options are either +all lower case letters or all upper case letters. When I start a sentence +such as: +.q "Ask" +causes +.i Mail +to prompt you for a subject header, +I am only capitalizing +.q ask +as a courtesy to English. +.ip "\fBEDITOR\fP\ \ " +The valued option +.q EDITOR +defines the pathname of the text editor to be used in the +.b edit +command and ~e. If not defined, a standard editor is used. +.ip "\fBPAGER\fP\ \ " +Pathname of the program to use for paginating output when +it exceeds \fIcrt\fP lines. +A default paginator is used if this option is not defined. +.ip "\fBSHELL\fP\ \ " +The valued option +.q SHELL +gives the path name of your shell. This shell is used for the +.b ! +command and ~! escape. In addition, this shell expands +file names with shell metacharacters like * and ? in them. +.ip "\fBVISUAL\fP\ \ " +The valued option +.q VISUAL +defines the pathname of the screen editor to be used in the +.b visual +command +and ~v escape. A standard screen editor is used if you do not define one. +.ip "\fBappend\fP\ \ " +The +.q append +option is binary and +causes messages saved in +.i mbox +to be appended to the end rather than prepended. +Normally, \fIMail\fP will put messages in \fImbox\fP +in the same order that the system puts messages in your system mailbox. +By setting +.q append, +you are requesting that +.i mbox +be appended to regardless. It is in any event quicker to append. +.ip "\fBask\fP\ \ " +.q "Ask" +is a binary option which +causes +.i Mail +to prompt you for the subject of each message you send. +If you respond with simply a newline, no subject field will be sent. +.ip "\fBaskcc\fP\ \ " +.q Askcc +is a binary option which +causes you to be prompted for additional carbon copy recipients at the +end of each message. Responding with a newline shows your +satisfaction with the current list. +.ip "\fBautoprint\fP\ \ " +.q Autoprint +is a binary option which +causes the +.b delete +command to behave like +.b dp +\*- thus, after deleting a message, the next one will be typed +automatically. This is useful when quickly scanning and deleting +messages in your mailbox. +.ip "\fBcrt\fP \ \ " +The valued option +.q crt +is used as a threshold to determine how long a message must +be before +.b PAGER +is used to read it. +.ip "\fBdebug\fP \ \ " +The binary option +.q debug +causes debugging information to be displayed. Use of this +option is the same as using the \fB\-d\fP command line flag. +.ip "\fBdot\fP\ \ " +.q Dot +is a binary option which, if set, causes +.i Mail +to interpret a period alone on a line as the terminator +of the message you are sending. +.ip "\fBescape\fP\ \ " +To allow you to change the escape character used when sending +mail, you can set the valued option +.q escape. +Only the first character of the +.q escape +option is used, and it must be doubled if it is to appear as +the first character of a line of your message. If you change your escape +character, then ~ loses all its special meaning, and need no longer be doubled +at the beginning of a line. +.ip "\fBfolder\fP\ \ " +The name of the directory to use for storing folders of messages. +If this name begins with a `/' +.i Mail +considers it to be an absolute pathname; otherwise, the folder directory +is found relative to your home directory. +.ip "\fBhold\fP\ \ " +The binary option +.q hold +causes messages that have been read but not manually dealt with +to be held in the system mailbox. This prevents such messages from +being automatically swept into your \fImbox\fP file. +.ip "\fBignore\fP\ \ " +The binary option +.q ignore +causes \s-2RUBOUT\s0 characters from your terminal to be ignored and echoed +as @'s while you are sending mail. \s-2RUBOUT\s0 characters retain their +original meaning in +.i Mail +command mode. +Setting the +.q ignore +option is equivalent to supplying the +.b \-i +flag on the command line as described in section 6. +.ip "\fBignoreeof\fP\ \ " +An option related to +.q dot +is +.q ignoreeof +which makes +.i Mail +refuse to accept a control\-d as the end of a message. +.q Ignoreeof +also applies to +.i Mail +command mode. +.ip "\fBkeep\fP\ \ " +The +.q keep +option causes +.i Mail +to truncate your system mailbox instead of deleting it when it +is empty. This is useful if you elect to protect your mailbox, which +you would do with the shell command: +.(l +chmod 600 /var/mail/yourname +.)l +where +.i yourname +is your login name. If you do not do this, anyone can probably read +your mail, although people usually don't. +.ip "\fBkeepsave\fP\ \ " +When you +.b save +a message, +.i Mail +usually discards it when you +.b quit . +To retain all saved messages, set the +.q keepsave +option. +.ip "\fBmetoo\fP\ \ " +When sending mail to an alias, +.i Mail +makes sure that if you are included in the alias, that mail will not +be sent to you. This is useful if a single alias is being used by +all members of the group. If however, you wish to receive a copy of +all the messages you send to the alias, you can set the binary option +.q metoo. +.ip "\fBnoheader\fP\ \ " +The binary option +.q noheader +suppresses the printing of the version and headers when +.i Mail +is first invoked. Setting this option is the same as using +.b \-N +on the command line. +.ip "\fBnosave\fP\ \ " +Normally, +when you abort a message with two \s-2RUBOUTs\s0, +.i Mail +copies the partial letter to the file +.q dead.letter +in your home directory. Setting the binary option +.q nosave +prevents this. +.ip "\fBReplyall\fP\ \ " +Reverses the sense of +.i reply +and +.i Reply +commands. +.ip "\fBquiet\fP\ \ " +The binary option +.q quiet +suppresses the printing of the version when +.i Mail +is first invoked, +as well as printing the for example +.q "Message 4:" +from the +.b type +command. +.ip "\fBrecord\fP\ \ " +If you love to keep records, then the +valued option +.q record +can be set to the name of a file to save your outgoing mail. +Each new message you send is appended to the end of the file. +.ip "\fBscreen\fP\ \ " +When +.i Mail +initially prints the message headers, it determines the number to +print by looking at the speed of your terminal. The faster your +terminal, the more it prints. +The valued option +.q screen +overrides this calculation and +specifies how many message headers you want printed. +This number is also used for scrolling with the +.b z +command. +.ip "\fBsendmail\fP\ \ " +To use an alternate mail delivery system, set the +.q sendmail +option to the full pathname of the program to use. Note: this is not +for everyone! Most people should use the default delivery system. +.ip "\fBtoplines\fP\ \ " +The valued option +.q toplines +defines the number of lines that the +.q top +command will print out instead of the default five lines. +.ip "\fBverbose\fP\ \ " +The binary option "verbose" causes +.i Mail +to invoke sendmail with the +.b \-v +flag, which causes it to go into verbose mode and announce expansion +of aliases, etc. Setting the "verbose" option is equivalent to +invoking +.i Mail +with the +.b \-v +flag as described in section 6. diff --git a/share/doc/usd/07.mail/mail6.nr b/share/doc/usd/07.mail/mail6.nr new file mode 100644 index 0000000..0465a94 --- /dev/null +++ b/share/doc/usd/07.mail/mail6.nr @@ -0,0 +1,125 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail6.nr 8.1 (Berkeley) 6/8/93 +.\" +.bp +.sh 1 "Command line options" +.pp +This section describes command line options for +.i Mail +and what they are used for. +.ip \-N +Suppress the initial printing of headers. +.ip \-d +Turn on debugging information. Not of general interest. +.ip "\-f file\ \ " +Show the messages in +.i file +instead of your system mailbox. If +.i file +is omitted, +.i Mail +reads +.i mbox +in your home directory. +.ip \-i +Ignore tty interrupt signals. Useful on noisy phone lines, which +generate spurious RUBOUT or DELETE characters. It's usually +more effective to change your interrupt character to control\-c, +for which see the +.i stty +shell command. +.ip \-n +Inhibit reading of /etc/mail.rc. Not generally useful, since +/etc/mail.rc is usually empty. +.ip "\-s string" +Used for sending mail. +.i String +is used as the subject of the message being composed. If +.i string +contains blanks, you must surround it with quote marks. +.ip "\-u name" +Read +.i names's +mail instead of your own. Unwitting others often neglect to protect +their mailboxes, but discretion is advised. Essentially, +.b "\-u user" +is a shorthand way of doing +.b "\-f /var/mail/user". +.ip "\-v" +Use the +.b \-v +flag when invoking sendmail. This feature may also be enabled +by setting the the option "verbose". +.pp +The following command line flags are also recognized, but are +intended for use by programs invoking +.i Mail +and not for people. +.ip "\-T file" +Arrange to print on +.i file +the contents of the +.i article-id +fields of all messages that were either read or deleted. +.b \-T +is for the +.i readnews +program and should NOT be used for reading your mail. +.ip "\-h number" +Pass on hop count information. +.i Mail +will take the number, increment it, and pass it with +.b \-h +to the mail delivery system. +.b \-h +only has effect when sending mail and is used for network mail +forwarding. +.ip "\-r name" +Used for network mail forwarding: interpret +.i name +as the sender of the message. The +.i name +and +.b \-r +are simply sent along to the mail delivery system. Also, +.i Mail +will wait for the message to be sent and return the exit status. +Also restricts formatting of message. +.pp +Note that +.b \-h +and +.b \-r , +which are for network mail forwarding, are not used in practice +since mail forwarding is now handled separately. They may +disappear soon. diff --git a/share/doc/usd/07.mail/mail7.nr b/share/doc/usd/07.mail/mail7.nr new file mode 100644 index 0000000..0b2590b --- /dev/null +++ b/share/doc/usd/07.mail/mail7.nr @@ -0,0 +1,107 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail7.nr 8.1 (Berkeley) 6/8/93 +.\" +.sh 1 "Format of messages" +.pp +This section describes the format of messages. +Messages begin with a +.i from +line, which consists of the word +.q From +followed by a user name, followed by anything, followed by +a date in the format returned by the +.i ctime +library routine described in section 3 of the Unix Programmer's +Manual. A possible +.i ctime +format date is: +.(l +Tue Dec 1 10:58:23 1981 +.)l +The +.i ctime +date may be optionally followed by a single space and a +time zone indication, which +should be three capital letters, such as PDT. +.pp +Following the +.i from +line are zero or more +.i "header field" +lines. +Each header field line is of the form: +.(l +name: information +.)l +.i Name +can be anything, but only certain header fields are recognized as +having any meaning. The recognized header fields are: +.i article-id , +.i bcc , +.i cc , +.i from , +.i reply-to , +.i sender , +.i subject , +and +.i to . +Other header fields are also significant to other systems; see, +for example, the current Arpanet message standard for much more +information on this topic. +A header field can be continued onto following lines by making the +first character on the following line a space or tab character. +.pp +If any headers are present, they must be followed by a blank line. +The part that follows is called the +.i body +of the message, and must be ASCII text, not containing null characters. +Each line in the message body must be no longer than 512 characters and +terminated with an ASCII newline character. +If binary data must be passed through the mail system, it is suggested +that this data be encoded in a system which encodes six bits into +a printable character (i.e.: uuencode). +For example, one could use the upper and lower case letters, the digits, +and the characters comma and period to make up the 64 characters. +Then, one can send a 16-bit binary number +as three characters. These characters should be packed into lines, +preferably lines about 70 characters long as long lines are transmitted +more efficiently. +.pp +The message delivery system always adds a blank line to the end of +each message. This blank line must not be deleted. +.pp +The UUCP message delivery system sometimes adds a blank line to +the end of a message each time it is forwarded through a machine. +.pp +It should be noted that some network transport protocols enforce +limits to the lengths of messages. diff --git a/share/doc/usd/07.mail/mail8.nr b/share/doc/usd/07.mail/mail8.nr new file mode 100644 index 0000000..b09afbd --- /dev/null +++ b/share/doc/usd/07.mail/mail8.nr @@ -0,0 +1,75 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail8.nr 8.1 (Berkeley) 6/8/93 +.\" +.bp +.sh 1 "Glossary" +.pp +This section contains the definitions of a few phrases +peculiar to +.i Mail . +.ip "\fIalias\fP" +An alternative name for a person or list of people. +.ip "\fIflag\fP" +An option, given on the command line of +.i Mail , +prefaced with a \-. For example, +.b \-f +is a flag. +.ip "\fIheader field\fP" +At the beginning of a message, a line which contains information +that is part of the structure of the message. Popular header fields +include +.i to , +.i cc , +and +.i subject . +.ip "\fImail\ \ \fP" +A collection of messages. Often used in the phrase, +.q "Have you read your mail?" +.ip "\fImailbox\fP" +The place where your mail is stored, typically in the directory +/var/mail. +.ip "\fImessage\fP" +A single letter from someone, initially stored in your +.i mailbox . +.ip "\fImessage list\fP" +A string used in +.i Mail +command mode to describe a sequence of messages. +.ip "\fIoption\fP" +A piece of special purpose information used to tailor +.i Mail +to your taste. +Options are specified with the +.b set +command. diff --git a/share/doc/usd/07.mail/mail9.nr b/share/doc/usd/07.mail/mail9.nr new file mode 100644 index 0000000..271548e --- /dev/null +++ b/share/doc/usd/07.mail/mail9.nr @@ -0,0 +1,203 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mail9.nr 8.1 (Berkeley) 6/8/93 +.\" +.bp +.sh 1 "Summary of commands, options, and escapes" +.pp +This section gives a quick summary of the +.i Mail +commands, binary and valued options, and tilde escapes. +.pp +The following table describes the commands: +.TS +center ; +c ci +lb l. +Command Description +_ ++ Same as \fBnext\fP +- Back up to previous message +? Print brief summary of \fIMail\fP commands +! Single command escape to shell +Print Type message with ignored fields +Reply Reply to author of message only +Respond Same as \fBReply\fP +Type Type message with ignored fields +alias Define an alias as a set of user names +alternates List other names you are known by +chdir Change working directory, home by default +copy Copy a message to a file or folder +delete Delete a list of messages +dp Same as \fBdt\fP +dt Delete current message, type next message +edit Edit a list of messages +else Start of else part of conditional; see \fBif\fP +endif End of conditional statement; see \fBif\fP +exit Leave mail without changing anything +file Interrogate/change current mail file +folder Same as \fBfile\fP +folders List the folders in your folder directory +from List headers of a list of messages +headers List current window of messages +help Same as \fB?\fP +hold Same as \fBpreserve\fP +if Conditional execution of \fIMail\fP commands +ignore Set/examine list of ignored header fields +list List valid \fIMail\fP commands +local List other names for the local host +mail Send mail to specified names +mbox Arrange to save a list of messages in \fImbox\fP +next Go to next message and type it +preserve Arrange to leave list of messages in system mailbox +print Print messages +quit Leave \fIMail\fP; update system mailbox, \fImbox\fP as appropriate +reply Compose a reply to a message +respond Same as \fBreply\fP +retain Supersedes \fBignore\fP +save Append messages, headers included, on a file +set Set binary or valued options +shell Invoke an interactive shell +size Prints out size of message list +source Read \fImail\fP commands from a file +top Print first so many (5 by default) lines of list of messages +type Same as \fBprint\fP +undelete Undelete list of messages +unread Marks list of messages as not been read +unset Undo the operation of a \fBset\fP +visual Invoke visual editor on a list of messages +write Append messages to a file, don't include headers +xit Same as \fBexit\fP +z Scroll to next/previous screenful of headers +.TE +.bp +.(b +.pp +The following table describes the options. Each option is +shown as being either a binary or valued option. +.TS +center; +c ci ci +l ci l. +Option Type Description +_ +EDITOR valued Pathname of editor for ~e and \fBedit\fP +PAGER valued Pathname of paginator for \fBPrint\fP, \fBprint\fP, \fBType\fP and \fBtype\fP +SHELL valued Pathname of shell for \fBshell\fP, ~! and \fB!\fP +VISUAL valued Pathname of screen editor for ~v, \fBvisual\fP +append binary Always append messages to end of \fImbox\fP +ask binary Prompt user for Subject: field when sending +askcc binary Prompt user for additional Cc's at end of message +autoprint binary Print next message after \fBdelete\fP +crt valued Minimum number of lines before using \fBPAGER\fP +debug binary Print out debugging information +dot binary Accept . alone on line to terminate message input +escape valued Escape character to be used instead of\ \ ~ +folder valued Directory to store folders in +hold binary Hold messages in system mailbox by default +ignore binary Ignore \s-2RUBOUT\s0 while sending mail +ignoreeof binary Don't terminate letters/command input with \fB\(uaD\fP +keep binary Don't unlink system mailbox when empty +keepsave binary Don't delete \fBsave\fPd messages by default +metoo binary Include sending user in aliases +noheader binary Suppress initial printing of version and headers +nosave binary Don't save partial letter in \fIdead.letter\fP +quiet binary Suppress printing of \fIMail\fP version and message numbers +record valued File to save all outgoing mail in +screen valued Size of window of message headers for \fBz\fP, etc. +sendmail valued Choose alternate mail delivery system +toplines valued Number of lines to print in \fBtop\fP +verbose binary Invoke sendmail with the \fB\-v\fP flag +.TE +.)b +.(b +.pp +The following table summarizes the tilde escapes available +while sending mail. +.TS +center; +c ci ci +l li l. +Escape Arguments Description +_ +~! command Execute shell command +~b name ... Add names to "blind" Cc: list +~c name ... Add names to Cc: field +~d Read \fIdead.letter\fP into message +~e Invoke text editor on partial message +~f messages Read named messages +~h Edit the header fields +~m messages Read named messages, right shift by tab +~p Print message entered so far +~q Abort entry of letter; like \s-2RUBOUT\s0 +~r filename Read file into message +~s string Set Subject: field to \fIstring\fP +~t name ... Add names to To: field +~v Invoke screen editor on message +~w filename Write message on file +~| command Pipe message through \fIcommand\fP +~: Mail command Execute a \fIMail\fP command +~~ string Quote a ~ in front of \fIstring\fP +.TE +.)b +.(b +.pp +The following table shows the command line flags that +.i Mail +accepts: +.TS +center; +c c +l a. +Flag Description +_ +\-N Suppress the initial printing of headers +\-T \fIfile\fP Article-id's of read/deleted messages to \fIfile\fP +\-d Turn on debugging +\-f \fIfile\fP Show messages in \fIfile\fP or \fI~/mbox\fP +\-h \fInumber\fP Pass on hop count for mail forwarding +\-i Ignore tty interrupt signals +\-n Inhibit reading of /etc/mail.rc +\-r \fIname\fP Pass on \fIname\fP for mail forwarding +\-s \fIstring\fP Use \fIstring\fP as subject in outgoing mail +\-u \fIname\fP Read \fIname's\fP mail instead of your own +\-v Invoke sendmail with the \fB\-v\fP flag +.TE +.)b +.lp +Notes: +.b \-T , +.b \-d , +.b \-h , +and +.b \-r +are not for human use. diff --git a/share/doc/usd/07.mail/maila.nr b/share/doc/usd/07.mail/maila.nr new file mode 100644 index 0000000..84b01fe --- /dev/null +++ b/share/doc/usd/07.mail/maila.nr @@ -0,0 +1,33 @@ +.\" Copyright (c) 1980, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)maila.nr 8.1 (Berkeley) 6/8/93 +.\" diff --git a/usr.bin/bc/USD.doc/bc b/usr.bin/bc/USD.doc/bc deleted file mode 100644 index c4e68c6..0000000 --- a/usr.bin/bc/USD.doc/bc +++ /dev/null @@ -1,1241 +0,0 @@ -.\" $FreeBSD$ -.\" $OpenBSD: bc,v 1.9 2004/07/09 10:23:05 jmc Exp $ -.\" -.\" Copyright (C) Caldera International Inc. 2001-2002. -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code and documentation must retain the above -.\" copyright notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed or owned by Caldera -.\" International, Inc. -.\" 4. Neither the name of Caldera International, Inc. nor the names of other -.\" contributors may be used to endorse or promote products derived from -.\" this software without specific prior written permission. -.\" -.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA -.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, -.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -.\" POSSIBILITY OF SUCH DAMAGE. -.\" -.\" @(#)bc 6.2 (Berkeley) 4/17/91 -.\" -.if n \{\ -.po 5n -.ll 70n -.\} -.EH 'USD:6-%''BC \- An Arbitrary Precision Desk-Calculator Language' -.OH 'BC \- An Arbitrary Precision Desk-Calculator Language''USD:6-%' -.\".RP -.TL -BC \- An Arbitrary Precision Desk-Calculator Language -.AU -Lorinda Cherry -.AU -Robert Morris -.AI -.\" .MH -.AB -BC is a language and a compiler for doing arbitrary precision arithmetic -on the PDP-11 under the -.UX -time-sharing -system. The output of the compiler is interpreted and executed by -a collection of routines which can input, output, and do -arithmetic on indefinitely large integers and on scaled fixed-point -numbers. -.PP -These routines are themselves based on a dynamic storage allocator. -Overflow does not occur until all available core storage -is exhausted. -.PP -The language has a complete control structure as well as immediate-mode -operation. Functions can be defined and saved for later execution. -.PP -Two five hundred-digit numbers can be multiplied to give a -thousand digit result in about ten seconds. -.PP -A small collection of library functions is also available, -including sin, cos, arctan, log, exponential, and Bessel functions of -integer order. -.PP -Some of the uses of this compiler are -.IP \- -to do computation with large integers, -.IP \- -to do computation accurate to many decimal places, -.IP \- -conversion of numbers from one base to another base. -.AE -.PP -.SH -Introduction -.PP -BC is a language and a compiler for doing arbitrary precision -arithmetic on the -.UX -time-sharing system [1]. -The compiler was written to make conveniently available a -collection of routines (called DC [5]) which are capable of doing -arithmetic on integers of arbitrary size. The compiler -is by no means intended to provide a complete programming -language. -It is a minimal language facility. -.PP -There is a scaling provision that permits the -use of decimal point notation. -Provision is made for input and output in bases other than -decimal. Numbers can be converted from decimal to octal by -simply setting the output base to equal 8. -.PP -The actual limit on the number of digits that can -be handled depends on the amount of storage available on the machine. -Manipulation of numbers with many hundreds of digits -is possible even on the smallest versions of -.UX . -.PP -The syntax of BC has been deliberately selected to agree -substantially with the C language [2]. Those who -are familiar with C will find few surprises in this language. -.SH -Simple Computations with Integers -.PP -The simplest kind of statement is an arithmetic expression -on a line by itself. -For instance, if you type in the line: -.DS -.ft B -142857 + 285714 -.ft P -.DE -the program responds immediately with the line -.DS -.ft B -428571 -.ft P -.DE -The operators \-, *, /, %, and ^ can also be used; they -indicate subtraction, multiplication, division, remaindering, and -exponentiation, respectively. Division of integers produces an -integer result truncated toward zero. -Division by zero produces an error -comment. -.PP -Any term in an expression may be prefixed by a minus sign to -indicate that it is to be negated (the `unary' minus sign). -The expression -.DS -.ft B -7+\-3 -.ft P -.DE -is interpreted to mean that \-3 is to be added to 7. -.PP -More complex expressions with several operators and with -parentheses are interpreted just as in -Fortran, with ^ having the greatest binding -power, then * and % and /, and finally + and \-. -Contents of parentheses are evaluated before material -outside the parentheses. -Exponentiations are -performed from right to left and the other operators -from left to right. -The two expressions -.DS -.ft B -a^b^c and a^(b^c) -.ft P -.DE -are equivalent, as are the two expressions -.DS -.ft B -a*b*c and (a*b)*c -.ft P -.DE -BC shares with Fortran and C the undesirable convention that -.DS -\fBa/b*c\fP is equivalent to \fB(a/b)*c\fP -.ft P -.DE -.PP -Internal storage registers to hold numbers have single lower-case -letter names. The value of an expression can be assigned to -a register in the usual way. The statement -.DS -.ft B -x = x + 3 -.ft P -.DE -has the effect of increasing by three the value of the contents of the -register named x. -When, as in this case, the outermost operator is an =, the -assignment is performed but the result is not printed. -Only 26 of these named storage registers are available. -.PP -There is a built-in square root function whose -result is truncated to an integer (but see scaling below). -The lines -.DS -.ft B -x = sqrt(191) -x -.ft P -.DE -produce the printed result -.DS -.ft B -13 -.ft P -.DE -.SH -Bases -.PP -There are special internal quantities, called `ibase' and `obase'. -The contents of `ibase', initially set to 10, -determines the base used for interpreting numbers read in. -For example, the lines -.DS -.ft B -ibase = 8 -11 -.ft P -.DE -will produce the output line -.DS -.ft B -9 -.ft P -.DE -and you are all set up to do octal to decimal conversions. -Beware, however of trying to change the input base back -to decimal by typing -.DS -.ft B -ibase = 10 -.ft P -.DE -Because the number 10 is interpreted as octal, this statement will -have no effect. -For those who deal in hexadecimal notation, -the characters A\-F are permitted in numbers -(no matter what base is in effect) -and are -interpreted as digits having values 10\-15 respectively. -The statement -.DS -.ft B -ibase = A -.ft P -.DE -will change you back to decimal input base no matter what the -current input base is. -Negative and large positive input bases are -permitted but useless. -No mechanism has been provided for the input of arbitrary -numbers in bases less than 1 and greater than 16. -.PP -The contents of `obase', initially set to 10, are used as the base for output -numbers. The lines -.DS -.ft B -obase = 16 -1000 -.ft P -.DE -will produce the output line -.DS -.ft B -3E8 -.ft P -.DE -which is to be interpreted as a 3-digit hexadecimal number. -Very large output bases are permitted, and they are sometimes useful. -For example, large numbers can be output in groups of five digits -by setting `obase' to 100000. -Strange (i.e. 1, 0, or negative) output bases are -handled appropriately. -.PP -Very large numbers are split across lines with 70 characters per line. -Lines which are continued end with \\. -Decimal output conversion is practically instantaneous, but output -of very large numbers (i.e., more than 100 digits) with other bases -is rather slow. -Non-decimal output conversion of -a one hundred digit number takes about -three seconds. -.PP -It is best to remember that `ibase' and `obase' have no effect -whatever on the course of internal computation or -on the evaluation of expressions, but only affect input and -output conversion, respectively. -.SH -Scaling -.PP -A third special internal quantity called `scale' is -used to determine the scale of calculated -quantities. -Numbers may have -up to a specific number of decimal digits after the decimal point. -This fractional part is retained in further computations. -We refer to the number of digits after the decimal point of -a number as its scale. -The current implementation allows scales to be as large as can be -represented by a 32-bit unsigned number minus one. -This is a non-portable extension. -The original implementation allowed for a maximum scale of 99. -.PP -When two scaled numbers are combined by -means of one of the arithmetic operations, the result -has a scale determined by the following rules. For -addition and subtraction, the scale of the result is the larger -of the scales of the two operands. In this case, -there is never any truncation of the result. -For multiplications, the scale of the result is never -less than the maximum of the two scales of the operands, -never more than the sum of the scales of the operands -and, subject to those two restrictions, -the scale of the result is set equal to the contents of the internal -quantity `scale'. -The scale of a quotient is the contents of the internal -quantity `scale'. The scale of a remainder is -the sum of the scales of the quotient and the divisor. -The result of an exponentiation is scaled as if -the implied multiplications were performed. -An exponent must be an integer. -The scale of a square root is set to the maximum of the scale -of the argument and the contents of `scale'. -.PP -All of the internal operations are actually carried out in terms -of integers, with digits being discarded when necessary. -In every case where digits are discarded, truncation and -not rounding is performed. -.PP -The contents of -`scale' must be no greater than -4294967294 and no less than 0. It is initially set to 0. -.PP -The internal quantities `scale', `ibase', and `obase' can be -used in expressions just like other variables. -The line -.DS -.ft B -scale = scale + 1 -.ft P -.DE -increases the value of `scale' by one, and the line -.DS -.ft B -scale -.ft P -.DE -causes the current value of `scale' to be printed. -.PP -The value of `scale' retains its meaning as a -number of decimal digits to be retained in internal -computation even when `ibase' or `obase' are not equal to 10. -The internal computations (which are still conducted in decimal, -regardless of the bases) are performed to the specified number -of decimal digits, never hexadecimal or octal or any -other kind of digits. -.SH -Functions -.PP -The name of a function is a single lower-case letter. -Function names are permitted to collide with simple -variable names. -Twenty-six different defined functions are permitted -in addition to the twenty-six variable names. -The line -.DS -.ft B - define a(x){ -.ft P -.DE -begins the definition of a function with one argument. -This line must be followed by one or more statements, -which make up the body of the function, ending -with a right brace }. -Return of control from a function occurs when a return -statement is executed or when the end of the function is reached. -The return statement can take either -of the two forms -.DS -.ft B -return -return(x) -.ft P -.DE -In the first case, the value of the function is 0, and in -the second, the value of the expression in parentheses. -.PP -Variables used in the function can be declared as automatic -by a statement of the form -.DS -.ft B -auto x,y,z -.ft P -.DE -There can be only one `auto' statement in a function and it must -be the first statement in the definition. -These automatic variables are allocated space and initialized -to zero on entry to the function and thrown away on return. The -values of any variables with the same names outside the function -are not disturbed. -Functions may be called recursively and the automatic variables -at each level of call are protected. -The parameters named in a function definition are treated in -the same way as the automatic variables of that function -with the single exception that they are given a value -on entry to the function. -An example of a function definition is -.DS -.ft B - define a(x,y){ - auto z - z = x*y - return(z) - } -.ft P -.DE -The value of this function, when called, will be the -product of its -two arguments. -.PP -A function is called by the appearance of its name -followed by a string of arguments enclosed in -parentheses and separated by commas. -The result -is unpredictable if the wrong number of arguments is used. -.PP -Functions with no arguments are defined and called using -parentheses with nothing between them: b(). -.PP -If the function -.ft I -a -.ft -above has been defined, then the line -.DS -.ft B -a(7,3.14) -.ft P -.DE -would cause the result 21.98 to be printed and the line -.DS -.ft B -x = a(a(3,4),5) -.ft P -.DE -would cause the value of x to become 60. -.SH -Subscripted Variables -.PP -A single lower-case letter variable name -followed by an expression in brackets is called a subscripted -variable (an array element). -The variable name is called the array name and the expression -in brackets is called the subscript. -Only one-dimensional arrays are -permitted. The names of arrays are permitted to -collide with the names of simple variables and function names. -Any fractional -part of a subscript is discarded before use. -Subscripts must be greater than or equal to zero and -less than or equal to 2047. -.PP -Subscripted variables may be freely used in expressions, in -function calls, and in return statements. -.PP -An array name may be used as an argument to a function, -or may be declared as automatic in -a function definition by the use of empty brackets: -.DS -.ft B -f(a[\|]) -define f(a[\|]) -auto a[\|] -.ft P -.DE -When an array name is so used, the whole contents of the array -are copied for the use of the function, and thrown away on exit -from the function. -Array names which refer to whole arrays cannot be used -in any other contexts. -.SH -Control Statements -.PP -The `if', the `while', and the `for' statements -may be used to alter the flow within programs or to cause iteration. -The range of each of them is a statement or -a compound statement consisting of a collection of -statements enclosed in braces. -They are written in the following way -.DS -.ft B -if(relation) statement -if(relation) statement else statement -while(relation) statement -for(expression1; relation; expression2) statement -.ft P -.DE -or -.DS -.ft B -if(relation) {statements} -if(relation) {statements} else {statements} -while(relation) {statements} -for(expression1; relation; expression2) {statements} -.ft P -.DE -.PP -A relation in one of the control statements is an expression of the form -.DS -.ft B -x>y -.ft P -.DE -where two expressions are related by one of the six relational -operators `<', `>', `<=', `>=', `==', or `!='. -The relation `==' -stands for `equal to' and `!=' stands for `not equal to'. -The meaning of the remaining relational operators is -clear. -.PP -BEWARE of using `=' instead of `==' in a relational. Unfortunately, -both of them are legal, so you will not get a diagnostic -message, but `=' really will not do a comparison. -.PP -The `if' statement causes execution of its range -if and only if the relation is true. -Then control passes to the next statement in sequence. -If an `else' branch is present, the statements in this branch are -executed if the relation is false. -The `else' keyword is a non-portable extension. -.PP -The `while' statement causes execution of its range -repeatedly as long as the relation -is true. The relation is tested before each execution -of its range and if the relation -is false, control passes to the next statement beyond the range -of the while. -.PP -The `for' statement begins -by executing `expression1'. Then the relation is tested -and, if true, the statements in the range of the `for' are executed. -Then `expression2' is executed. The relation is tested, and so on. -The typical use of the `for' statement is for a controlled iteration, -as in the statement -.DS -.ft B -for(i=1; i<=10; i=i+1) i -.ft P -.DE -which will print the integers from 1 to 10. -Here are some examples of the use of the control statements. -.DS -.ft B -define f(n){ -auto i, x -x=1 -for(i=1; i<=n; i=i+1) x=x*i -return(x) -} -.ft P -.DE -The line -.DS -.ft B - f(a) -.ft P -.DE -will print -.ft I -a -.ft -factorial if -.ft I -a -.ft -is a positive integer. -Here is the definition of a function which will -compute values of the binomial coefficient -(m and n are assumed to be positive integers). -.DS -.ft B -define b(n,m){ -auto x, j -x=1 -for(j=1; j<=m; j=j+1) x=x*(n\-j+1)/j -return(x) -} -.ft P -.DE -The following function computes values of the exponential function -by summing the appropriate series -without regard for possible truncation errors: -.DS -.ft B -scale = 20 -define e(x){ - auto a, b, c, d, n - a = 1 - b = 1 - c = 1 - d = 0 - n = 1 - while(1==1){ - a = a*x - b = b*n - c = c + a/b - n = n + 1 - if(c==d) return(c) - d = c - } -} -.ft P -.DE -.SH -Some Details -.PP -There are some language features that every user should know -about even if he will not use them. -.PP -Normally statements are typed one to a line. It is also permissible -to type several statements on a line separated by semicolons. -.PP -If an assignment statement is parenthesized, it then has -a value and it can be used anywhere that an expression can. -For example, the line -.DS -.ft B -(x=y+17) -.ft P -.DE -not only makes the indicated assignment, but also prints the -resulting value. -.PP -Here is an example of a use of the value of an -assignment statement even when it is not parenthesized. -.DS -.ft B -x = a[i=i+1] -.ft P -.DE -causes a value to be assigned to x and also increments i -before it is used as a subscript. -.PP -The following constructs work in BC in exactly the same manner -as they do in the C language. Consult the appendix or the -C manuals [2] for their exact workings. -.DS -.ft B -.ta 2i -x=y=z is the same as x=(y=z) -x += y x = x+y -x \-= y x = x\-y -x *= y x = x*y -x /= y x = x/y -x %= y x = x%y -x ^= y x = x^y -x++ (x=x+1)\-1 -x\-\- (x=x\-1)+1 -++x x = x+1 -\-\-x x = x\-1 -.ft P -.DE -Even if you don't intend to use the constructs, -if you type one inadvertently, something correct but unexpected -may happen. -.SH -Three Important Things -.PP -1. To exit a BC program, type `quit'. -.PP -2. There is a comment convention identical to that of C and -of PL/I. Comments begin with `/*' and end with `*/'. -As a non-portable extension, comments may also start with a `#' and end with -a newline. -The newline is not part of the comment. -.PP -3. There is a library of math functions which may be obtained by -typing at command level -.DS -.ft B -bc \-l -.ft P -.DE -This command will load a set of library functions -which, at the time of writing, consists of sine (named `s'), -cosine (`c'), arctangent (`a'), natural logarithm (`l'), -exponential (`e') and Bessel functions of integer order (`j(n,x)'). Doubtless more functions will be added -in time. -The library sets the scale to 20. You can reset it to something -else if you like. -The design of these mathematical library routines -is discussed elsewhere [3]. -.PP -If you type -.DS -.ft B -bc file ... -.ft P -.DE -BC will read and execute the named file or files before accepting -commands from the keyboard. In this way, you may load your -favorite programs and function definitions. -.SH -Acknowledgement -.PP -The compiler is written in YACC [4]; its original -version was written by S. C. Johnson. -.SH -References -.IP [1] -K. Thompson and D. M. Ritchie, -.ft I -UNIX Programmer's Manual, -.ft -Bell Laboratories, -1978. -.IP [2] -B. W. Kernighan and -D. M. Ritchie, -.ft I -The C Programming Language, -.ft -Prentice-Hall, 1978. -.IP [3] -R. Morris, -.ft I -A Library of Reference Standard Mathematical Subroutines, -.ft -Bell Laboratories internal memorandum, 1975. -.IP [4] -S. C. Johnson, -.ft I -YACC \(em Yet Another Compiler-Compiler. -.ft -Bell Laboratories Computing Science Technical Report #32, 1978. -.IP [5] -R. Morris and L. L. Cherry, -.ft I -DC \- An Interactive Desk Calculator. -.ft -.LP -.bp -.ft B -.DS C -Appendix -.DE -.ft -.NH -Notation -.PP -In the following pages syntactic categories are in \fIitalics\fP; -literals are in \fBbold\fP; material in brackets [\|] is optional. -.NH -Tokens -.PP -Tokens consist of keywords, identifiers, constants, operators, -and separators. -Token separators may be blanks, tabs or comments. -Newline characters or semicolons separate statements. -.NH 2 -Comments -.PP -Comments are introduced by the characters /* and terminated by -*/. -As a non-portable extension, comments may also start with a # and -end with a newline. -The newline is not part of the comment. -.NH 2 -Identifiers -.PP -There are three kinds of identifiers \- ordinary identifiers, array identifiers -and function identifiers. -All three types consist of single lower-case letters. -Array identifiers are followed by square brackets, possibly -enclosing an expression describing a subscript. -Arrays are singly dimensioned and may contain up to 2048 -elements. -Indexing begins at zero so an array may be indexed from 0 to 2047. -Subscripts are truncated to integers. -Function identifiers are followed by parentheses, possibly enclosing arguments. -The three types of identifiers do not conflict; -a program can have a variable named \fBx\fP, -an array named \fBx\fP and a function named \fBx\fP, all of which are separate and -distinct. -.NH 2 -Keywords -.PP -The following are reserved keywords: -.ft B -.ta .5i 1.0i -.nf - ibase if - obase break - scale define - sqrt auto - length return - while quit - for continue - else last - print -.fi -.ft -.NH 2 -Constants -.PP -Constants consist of arbitrarily long numbers -with an optional decimal point. -The hexadecimal digits \fBA\fP\-\fBF\fP are also recognized as digits with -values 10\-15, respectively. -.NH 1 -Expressions -.PP -The value of an expression is printed unless the main -operator is an assignment. -The value printed is assigned to the special variable \fBlast\fP. -A single dot may be used as a synonym for \fBlast\fP. -This is a non-portable extension. -Precedence is the same as the order -of presentation here, with highest appearing first. -Left or right associativity, where applicable, is -discussed with each operator. -.bp -.NH 2 -Primitive expressions -.NH 3 -Named expressions -.PP -Named expressions are -places where values are stored. -Simply stated, -named expressions are legal on the left -side of an assignment. -The value of a named expression is the value stored in the place named. -.NH 4 -\fIidentifiers\fR -.PP -Simple identifiers are named expressions. -They have an initial value of zero. -.NH 4 -\fIarray-name\fP\|[\|\fIexpression\fP\|] -.PP -Array elements are named expressions. -They have an initial value of zero. -.NH 4 -\fBscale\fR, \fBibase\fR and \fBobase\fR -.PP -The internal registers -\fBscale\fP, \fBibase\fP and \fBobase\fP are all named expressions. -\fBscale\fP is the number of digits after the decimal point to be -retained in arithmetic operations. -\fBscale\fR has an initial value of zero. -\fBibase\fP and \fBobase\fP are the input and output number -radix respectively. -Both \fBibase\fR and \fBobase\fR have initial values of 10. -.NH 3 -Function calls -.NH 4 -\fIfunction-name\fB\|(\fR[\fIexpression\fR\|[\fB,\|\fIexpression\|\fR.\|.\|.\|]\|]\fB) -.PP -A function call consists of a function name followed by parentheses -containing a comma-separated list of -expressions, which are the function arguments. -A whole array passed as an argument is specified by the -array name followed by empty square brackets. -All function arguments are passed by -value. -As a result, changes made to the formal parameters have -no effect on the actual arguments. -If the function terminates by executing a return -statement, the value of the function is -the value of the expression in the parentheses of the return -statement or is zero if no expression is provided -or if there is no return statement. -.NH 4 -sqrt\|(\|\fIexpression\fP\|) -.PP -The result is the square root of the expression. -The result is truncated in the least significant decimal place. -The scale of the result is -the scale of the expression or the -value of -.ft B -scale, -.ft -whichever is larger. -.NH 4 -length\|(\|\fIexpression\fP\|) -.PP -The result is the total number of significant decimal digits in the expression. -The scale of the result is zero. -.NH 4 -scale\|(\|\fIexpression\fP\|) -.PP -The result is the scale of the expression. -The scale of the result is zero. -.NH 3 -Constants -.PP -Constants are primitive expressions. -.NH 3 -Parentheses -.PP -An expression surrounded by parentheses is -a primitive expression. -The parentheses are used to alter the -normal precedence. -.NH 2 -Unary operators -.PP -The unary operators -bind right to left. -.NH 3 -\-\|\fIexpression\fP -.PP -The result is the negative of the expression. -.NH 3 -++\|\fInamed-expression\fP -.PP -The named expression is -incremented by one. -The result is the value of the named expression after -incrementing. -.NH 3 -\-\-\|\fInamed-expression\fP -.PP -The named expression is -decremented by one. -The result is the value of the named expression after -decrementing. -.NH 3 -\fInamed-expression\fP\|++ -.PP -The named expression is -incremented by one. -The result is the value of the named expression before -incrementing. -.NH 3 -\fInamed-expression\fP\|\-\- -.PP -The named expression is -decremented by one. -The result is the value of the named expression before -decrementing. -.NH 2 -Exponentiation operator -.PP -The exponentiation operator binds right to left. -.NH 3 -\fIexpression\fP ^ \fIexpression\fP -.PP -The result is the first -expression raised to the power of the -second expression. -The second expression must be an integer. -If \fIa\fP -is the scale of the left expression -and \fIb\fP is the absolute value -of the right expression, -then the scale of the result is: -.PP -min\|(\|\fIa\(mub\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP\|)\|) -.NH 2 -Multiplicative operators -.PP -The operators *, /, % bind left to right. -.NH 3 -\fIexpression\fP * \fIexpression\fP -.PP -The result is the product -of the two expressions. -If \fIa\fP and \fIb\fP are the -scales of the two expressions, -then the scale of the result is: -.PP -min\|(\|\fIa+b\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP,\|\fIb\fP\|)\|) -.NH 3 -\fIexpression\fP / \fIexpression\fP -.PP -The result is the quotient of the two expressions. -The scale of the result is the value of \fBscale\fR. -.NH 3 -\fIexpression\fP % \fIexpression\fP -.PP -The % operator produces the remainder of the division -of the two expressions. -More precisely, -\fIa\fP%\fIb\fP is \fIa\fP\-\fIa\fP/\fIb\fP*\fIb\fP. -.PP -The scale of the result is the sum of the scale of -the divisor and the value of -.ft B -scale -.ft -.NH 2 -Additive operators -.PP -The additive operators bind left to right. -.NH 3 -\fIexpression\fP + \fIexpression\fP -.PP -The result is the sum of the two expressions. -The scale of the result is -the maximum of the scales of the expressions. -.NH 3 -\fIexpression\fP \- \fIexpression\fP -.PP -The result is the difference of the two expressions. -The scale of the result is the -maximum of the scales of the expressions. -.NH 2 -assignment operators -.PP -The assignment operators bind right to left. -.NH 3 -\fInamed-expression\fP = \fIexpression\fP -.PP -This expression results in assigning the value of the expression -on the right -to the named expression on the left. -.NH 3 -\fInamed-expression\fP += \fIexpression\fP -.NH 3 -\fInamed-expression\fP \-= \fIexpression\fP -.NH 3 -\fInamed-expression\fP *= \fIexpression\fP -.NH 3 -\fInamed-expression\fP /= \fIexpression\fP -.NH 3 -\fInamed-expression\fP %= \fIexpression\fP -.NH 3 -\fInamed-expression\fP ^= \fIexpression\fP -.PP -The result of the above expressions is equivalent -to ``named expression = named expression OP expression'', -where OP is the operator after the = sign. -.NH 1 -Relations -.PP -Unlike all other operators, the relational operators -are only valid as the object of an \fBif\fP, \fBwhile\fP, -or inside a \fBfor\fP statement. -.NH 2 -\fIexpression\fP < \fIexpression\fP -.NH 2 -\fIexpression\fP > \fIexpression\fP -.NH 2 -\fIexpression\fP <= \fIexpression\fP -.NH 2 -\fIexpression\fP >= \fIexpression\fP -.NH 2 -\fIexpression\fP == \fIexpression\fP -.NH 2 -\fIexpression\fP != \fIexpression\fP -.NH 1 -Storage classes -.PP -There are only two storage classes in BC, global and automatic -(local). -Only identifiers that are to be local to a function need be -declared with the \fBauto\fP command. -The arguments to a function -are local to the function. -All other identifiers are assumed to be global -and available to all functions. -All identifiers, global and local, have initial values -of zero. -Identifiers declared as \fBauto\fP are allocated on entry to the function -and released on returning from the function. -They therefore do not retain values between function calls. -\fBauto\fP arrays are specified by the array name followed by empty square brackets. -.PP -Automatic variables in BC do not work in exactly the same way -as in either C or PL/I. On entry to a function, the old values of -the names that appear as parameters and as automatic -variables are pushed onto a stack. -Until return is made from the function, reference to these -names refers only to the new values. -.NH 1 -Statements -.PP -Statements must be separated by semicolon or newline. -Except where altered by control statements, execution -is sequential. -.NH 2 -Expression statements -.PP -When a statement is an expression, unless -the main operator is an assignment, the value -of the expression is printed, followed by a newline character. -.NH 2 -Compound statements -.PP -Statements may be grouped together and used when one statement is expected -by surrounding them with { }. -.NH 2 -Quoted string statements -.PP -"any string" -.sp .5 -This statement prints the string inside the quotes. -.NH 2 -If statements -.sp .5 -\fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fR -.PP -The substatement is executed if the relation is true. -.NH 2 -If-else statements -.sp .5 -\fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fB\|else\|\fIstatement\fR -.PP -The first substatement is executed if the relation is true, the second -substatement if the relation is false. -The \fBif-else\fR statement is a non-portable extension. -.NH 2 -While statements -.sp .5 -\fBwhile\|(\|\fIrelation\fB\|)\|\fIstatement\fR -.PP -The statement is executed while the relation -is true. -The test occurs before each execution of the statement. -.NH 2 -For statements -.sp .5 -\fBfor\|(\|\fIexpression\fB; \fIrelation\fB; \fIexpression\fB\|)\|\fIstatement\fR -.PP -The \fBfor\fR statement is the same as -.nf -.ft I - first-expression - \fBwhile\|(\fPrelation\|\fB) {\fP - statement - last-expression - } -.ft R -.fi -.PP -All three expressions may be left out. -This is a non-portable extension. -.NH 2 -Break statements -.sp .5 -\fBbreak\fP -.PP -\fBbreak\fP causes termination of a \fBfor\fP or \fBwhile\fP statement. -.NH 2 -Continue statements -.sp .5 -\fBcontinue\fP -.PP -\fBcontinue\fP causes the next iteration of a \fBfor\fP or \fBwhile\fP -statement to start, skipping the remainder of the loop. -For a \fBwhile\fP statement, execution continues with the evaluation -of the condition. -For a \fBfor\fP statement, execution continues with evaluation of -the last-expression. -The \fBcontinue\fP statement is a non-portable extension. -.NH 2 -Auto statements -.sp .5 -\fBauto \fIidentifier\fR\|[\|\fB,\fIidentifier\fR\|] -.PP -The \fBauto\fR statement causes the values of the identifiers to be pushed down. -The identifiers can be ordinary identifiers or array identifiers. -Array identifiers are specified by following the array name by empty square -brackets. -The auto statement must be the first statement -in a function definition. -.NH 2 -Define statements -.sp .5 -.nf -\fBdefine(\|\fR[\fIparameter\|\fR[\fB\|,\|\fIparameter\|.\|.\|.\|\fR]\|]\|\fB)\|{\fI - statements\|\fB}\fR -.fi -.PP -The \fBdefine\fR statement defines a function. -The parameters may -be ordinary identifiers or array names. -Array names must be followed by empty square brackets. -As a non-portable extension, the opening brace may also appear on the -next line. -.NH 2 -Return statements -.sp .5 -\fBreturn\fP -.sp .5 -\fBreturn(\fI\|expression\|\fB)\fR -.PP -The \fBreturn\fR statement causes termination of a function, -popping of its auto variables, and -specifies the result of the function. -The first form is equivalent to \fBreturn(0)\fR. -The result of the function is the result of the expression -in parentheses. -Leaving out the expression between parentheses is equivalent to -\fBreturn(0)\fR. -As a non-portable extension, the parentheses may be left out. -.NH 2 -Print -.PP -The \fBprint\fR statement takes a list of comma-separated expressions. -Each expression in the list is evaluated and the computed -value is printed and assigned to the variable `last'. -No trailing newline is printed. -The expression may also be a string enclosed in double quotes. -Within these strings the following escape sequences may be used: -\ea -for bell (alert), -`\eb' -for backspace, -`\ef' -for formfeed, -`\en' -for newline, -`\er' -for carriage return, -`\et' -`for tab, -`\eq' -for double quote and -`\e\e' -for backslash. -Any other character following a backslash will be ignored. -Strings will not be assigned to `last'. -The \fBprint\fR statement is a non-portable extension. -.NH 2 -Quit -.PP -The \fBquit\fR statement stops execution of a BC program and returns -control to UNIX when it is first encountered. -Because it is not treated as an executable statement, -it cannot be used -in a function definition or in an -.ft B -if, for, -.ft -or -.ft B -while -.ft -statement. diff --git a/usr.bin/dc/USD.doc/dc b/usr.bin/dc/USD.doc/dc deleted file mode 100644 index 4caa0f4..0000000 --- a/usr.bin/dc/USD.doc/dc +++ /dev/null @@ -1,753 +0,0 @@ -.\" $FreeBSD$ -.\" $OpenBSD: dc,v 1.2 2003/09/22 19:08:27 otto Exp $ -.\" -.\" Copyright (C) Caldera International Inc. 2001-2002. -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code and documentation must retain the above -.\" copyright notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed or owned by Caldera -.\" International, Inc. -.\" 4. Neither the name of Caldera International, Inc. nor the names of other -.\" contributors may be used to endorse or promote products derived from -.\" this software without specific prior written permission. -.\" -.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA -.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, -.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -.\" POSSIBILITY OF SUCH DAMAGE. -.\" -.\" @(#)dc 8.1 (Berkeley) 6/8/93 -.\" -.EH 'USD:5-%''DC \- An Interactive Desk Calculator' -.OH 'DC \- An Interactive Desk Calculator''USD:5-%' -.\".RP -.\" ....TM 75-1271-8 39199 39199-11 -.ND -.TL -DC \- An Interactive Desk Calculator -.AU "MH 2C-524" 3878 -Robert Morris -.AU -Lorinda Cherry -.AI -.\" .MH -.AB -DC is an interactive desk calculator program implemented -on the -.UX -time-sharing system to do arbitrary-precision -integer arithmetic. -It has provision for manipulating scaled fixed-point numbers and -for input and output in bases other than decimal. -.PP -The size of numbers that can be manipulated is limited -only by available core storage. -On typical implementations of -.UX , -the size of numbers that -can be handled varies from several hundred digits on the smallest -systems to several thousand on the largest. -.AE -.PP -.SH -.PP -.ft I -Editor's note: the description of the implementation details of DC in this -paper is only valid for the original version of DC. -The current version of DC uses a different approach. -.ft -.PP -DC is an arbitrary precision arithmetic package implemented -on the -.UX -time-sharing system -in the form of an interactive desk calculator. -It works like a stacking calculator using reverse Polish notation. -Ordinarily DC operates on decimal integers, but one may -specify an input base, output base, and a number of fractional -digits to be maintained. -.PP -A language called BC [1] has been developed which accepts -programs written in the familiar style of higher-level -programming languages and compiles output which is -interpreted by DC. -Some of the commands described below were designed -for the compiler interface and are not easy for a human user -to manipulate. -.PP -Numbers that are typed into DC are put on a push-down -stack. -DC commands work by taking the top number or two -off the stack, performing the desired operation, and pushing the result -on the stack. -If an argument is given, -input is taken from that file until its end, -then from the standard input. -.SH -SYNOPTIC DESCRIPTION -.PP -Here we describe the DC commands that are intended -for use by people. The additional commands that are -intended to be invoked by compiled output are -described in the detailed description. -.PP -Any number of commands are permitted on a line. -Blanks and new-line characters are ignored except within numbers -and in places where a register name is expected. -.PP -The following constructions are recognized: -.SH -number -.IP -The value of the number is pushed onto the main stack. -A number is an unbroken string of the digits 0-9 -and the capital letters A\-F which are treated as digits -with values 10\-15 respectively. -The number may be preceded by an underscore _ to input a -negative number. -Numbers may contain decimal points. -.SH -+ \- * % ^ -.IP -The -top two values on the stack are added -(\fB+\fP), -subtracted -(\fB\-\fP), -multiplied (\fB*\fP), -divided (\fB/\fP), -remaindered (\fB%\fP), -or exponentiated (^). -The two entries are popped off the stack; -the result is pushed on the stack in their place. -The result of a division is an integer truncated toward zero. -See the detailed description below for the treatment of -numbers with decimal points. -An exponent must not have any digits after the decimal point. -.SH -s\fIx\fP -.IP -The -top of the main stack is popped and stored into -a register named \fIx\fP, where \fIx\fP may be any character. -If -the -.ft B -s -.ft -is capitalized, -.ft I -x -.ft -is treated as a stack and the value is pushed onto it. -Any character, even blank or new-line, is a valid register name. -.SH -l\fIx\fP -.IP -The -value in register -.ft I -x -.ft -is pushed onto the stack. -The register -.ft I -x -.ft -is not altered. -If the -.ft B -l -.ft -is capitalized, -register -.ft I -x -.ft -is treated as a stack and its top value is popped onto the main stack. -.LP -All registers start with empty value which is treated as a zero -by the command \fBl\fP and is treated as an error by the command \fBL\fP. -.SH -d -.IP -The -top value on the stack is duplicated. -.SH -p -.IP -The top value on the stack is printed. -The top value remains unchanged. -.SH -f -.IP -All values on the stack and in registers are printed. -.SH -x -.IP -treats the top element of the stack as a character string, -removes it from the stack, and -executes it as a string of DC commands. -.SH -[ ... ] -.IP -puts the bracketed character string onto the top of the stack. -.SH -q -.IP -exits the program. -If executing a string, the recursion level is -popped by two. -If -.ft B -q -.ft -is capitalized, -the top value on the stack is popped and the string execution level is popped -by that value. -.SH -<\fIx\fP >\fIx\fP =\fIx\fP !<\fIx\fP !>\fIx\fP !=\fIx\fP -.IP -The -top two elements of the stack are popped and compared. -Register -.ft I -x -.ft -is executed if they obey the stated -relation. -Exclamation point is negation. -.SH -v -.IP -replaces the top element on the stack by its square root. -The square root of an integer is truncated to an integer. -For the treatment of numbers with decimal points, see -the detailed description below. -.SH -! -.IP -interprets the rest of the line as a -.UX -command. -Control returns to DC when the -.UX -command terminates. -.SH -c -.IP -All values on the stack are popped; the stack becomes empty. -.SH -i -.IP -The top value on the stack is popped and used as the -number radix for further input. -If \fBi\fP is capitalized, the value of -the input base is pushed onto the stack. -No mechanism has been provided for the input of arbitrary -numbers in bases less than 1 or greater than 16. -.SH -o -.IP -The top value on the stack is popped and used as the -number radix for further output. -If \fBo\fP is capitalized, the value of the output -base is pushed onto the stack. -.SH -k -.IP -The top of the stack is popped, and that value is used as -a scale factor -that influences the number of decimal places -that are maintained during multiplication, division, and exponentiation. -The scale factor must be greater than or equal to zero and -less than 100. -If \fBk\fP is capitalized, the value of the scale factor -is pushed onto the stack. -.SH -z -.IP -The value of the stack level is pushed onto the stack. -.SH -? -.IP -A line of input is taken from the input source (usually the console) -and executed. -.SH -DETAILED DESCRIPTION -.SH -Internal Representation of Numbers -.PP -Numbers are stored internally using a dynamic storage allocator. -Numbers are kept in the form of a string -of digits to the base 100 stored one digit per byte -(centennial digits). -The string is stored with the low-order digit at the -beginning of the string. -For example, the representation of 157 -is 57,1. -After any arithmetic operation on a number, care is taken -that all digits are in the range 0\-99 and that -the number has no leading zeros. -The number zero is represented by the empty string. -.PP -Negative numbers are represented in the 100's complement -notation, which is analogous to two's complement notation for binary -numbers. -The high order digit of a negative number is always \-1 -and all other digits are in the range 0\-99. -The digit preceding the high order \-1 digit is never a 99. -The representation of \-157 is 43,98,\-1. -We shall call this the canonical form of a number. -The advantage of this kind of representation of negative -numbers is ease of addition. When addition is performed digit -by digit, the result is formally correct. The result need only -be modified, if necessary, to put it into canonical form. -.PP -Because the largest valid digit is 99 and the byte can -hold numbers twice that large, addition can be carried out -and the handling of carries done later when -that is convenient, as it sometimes is. -.PP -An additional byte is stored with each number beyond -the high order digit to indicate the number of -assumed decimal digits after the decimal point. The representation -of .001 is 1,\fI3\fP -where the scale has been italicized to emphasize the fact that it -is not the high order digit. -The value of this extra byte is called the -.ft B -scale factor -.ft -of the number. -.SH -The Allocator -.PP -DC uses a dynamic string storage allocator -for all of its internal storage. -All reading and writing of numbers internally is done through -the allocator. -Associated with each string in the allocator is a four-word header containing pointers -to the beginning of the string, the end of the string, -the next place to write, and the next place to read. -Communication between the allocator and DC -is done via pointers to these headers. -.PP -The allocator initially has one large string on a list -of free strings. All headers except the one pointing -to this string are on a list of free headers. -Requests for strings are made by size. -The size of the string actually supplied is the next higher -power of 2. -When a request for a string is made, the allocator -first checks the free list to see if there is -a string of the desired size. -If none is found, the allocator finds the next larger free string and splits it repeatedly until -it has a string of the right size. -Left-over strings are put on the free list. -If there are no larger strings, -the allocator tries to coalesce smaller free strings into -larger ones. -Since all strings are the result -of splitting large strings, -each string has a neighbor that is next to it in core -and, if free, can be combined with it to make a string twice as long. -This is an implementation of the `buddy system' of allocation -described in [2]. -.PP -Failing to find a string of the proper length after coalescing, -the allocator asks the system for more space. -The amount of space on the system is the only limitation -on the size and number of strings in DC. -If at any time in the process of trying to allocate a string, the allocator runs out of -headers, it also asks the system for more space. -.PP -There are routines in the allocator for reading, writing, copying, rewinding, -forward-spacing, and backspacing strings. -All string manipulation is done using these routines. -.PP -The reading and writing routines -increment the read pointer or write pointer so that -the characters of a string are read or written in -succession by a series of read or write calls. -The write pointer is interpreted as the end of the -information-containing portion of a string and a call -to read beyond that point returns an end-of-string indication. -An attempt to write beyond the end of a string -causes the allocator to -allocate a larger space and then copy -the old string into the larger block. -.SH -Internal Arithmetic -.PP -All arithmetic operations are done on integers. -The operands (or operand) needed for the operation are popped -from the main stack and their scale factors stripped off. -Zeros are added or digits removed as necessary to get -a properly scaled result from the internal arithmetic routine. -For example, if the scale of the operands is different and decimal -alignment is required, as it is for -addition, zeros are appended to the operand with the smaller -scale. -After performing the required arithmetic operation, -the proper scale factor is appended to the end of the number before -it is pushed on the stack. -.PP -A register called \fBscale\fP plays a part -in the results of most arithmetic operations. -\fBscale\fP is the bound on the number of decimal places retained in -arithmetic computations. -\fBscale\fP may be set to the number on the top of the stack -truncated to an integer with the \fBk\fP command. -\fBK\fP may be used to push the value of \fBscale\fP on the stack. -\fBscale\fP must be greater than or equal to 0 and less than 100. -The descriptions of the individual arithmetic operations will -include the exact effect of \fBscale\fP on the computations. -.SH -Addition and Subtraction -.PP -The scales of the two numbers are compared and trailing -zeros are supplied to the number with the lower scale to give both -numbers the same scale. The number with the smaller scale is -multiplied by 10 if the difference of the scales is odd. -The scale of the result is then set to the larger of the scales -of the two operands. -.PP -Subtraction is performed by negating the number -to be subtracted and proceeding as in addition. -.PP -Finally, the addition is performed digit by digit from the -low order end of the number. The carries are propagated -in the usual way. -The resulting number is brought into canonical form, which may -require stripping of leading zeros, or for negative numbers -replacing the high-order configuration 99,\-1 by the digit \-1. -In any case, digits which are not in the range 0\-99 must -be brought into that range, propagating any carries or borrows -that result. -.SH -Multiplication -.PP -The scales are removed from the two operands and saved. -The operands are both made positive. -Then multiplication is performed in -a digit by digit manner that exactly mimics the hand method -of multiplying. -The first number is multiplied by each digit of the second -number, beginning with its low order digit. The intermediate -products are accumulated into a partial sum which becomes the -final product. -The product is put into the canonical form and its sign is -computed from the signs of the original operands. -.PP -The scale of the result is set equal to the sum -of the scales of the two operands. -If that scale is larger than the internal register -.ft B -scale -.ft -and also larger than both of the scales of the two operands, -then the scale of the result is set equal to the largest -of these three last quantities. -.SH -Division -.PP -The scales are removed from the two operands. -Zeros are appended or digits removed from the dividend to make -the scale of the result of the integer division equal to -the internal quantity -\fBscale\fP. -The signs are removed and saved. -.PP -Division is performed much as it would be done by hand. -The difference of the lengths of the two numbers -is computed. -If the divisor is longer than the dividend, -zero is returned. -Otherwise the top digit of the divisor is divided into the top -two digits of the dividend. -The result is used as the first (high-order) digit of the -quotient. -It may turn out be one unit too low, but if it is, the next -trial quotient will be larger than 99 and this will be -adjusted at the end of the process. -The trial digit is multiplied by the divisor and the result subtracted -from the dividend and the process is repeated to get -additional quotient digits until the remaining -dividend is smaller than the divisor. -At the end, the digits of the quotient are put into -the canonical form, with propagation of carry as needed. -The sign is set from the sign of the operands. -.SH -Remainder -.PP -The division routine is called and division is performed -exactly as described. The quantity returned is the remains of the -dividend at the end of the divide process. -Since division truncates toward zero, remainders have the same -sign as the dividend. -The scale of the remainder is set to -the maximum of the scale of the dividend and -the scale of the quotient plus the scale of the divisor. -.SH -Square Root -.PP -The scale is stripped from the operand. -Zeros are added if necessary to make the -integer result have a scale that is the larger of -the internal quantity -\fBscale\fP -and the scale of the operand. -.PP -The method used to compute sqrt(y) is Newton's method -with successive approximations by the rule -.EQ -x sub {n+1} ~=~ half ( x sub n + y over x sub n ) -.EN -The initial guess is found by taking the integer square root -of the top two digits. -.SH -Exponentiation -.PP -Only exponents with zero scale factor are handled. If the exponent is -zero, then the result is 1. If the exponent is negative, then -it is made positive and the base is divided into one. The scale -of the base is removed. -.PP -The integer exponent is viewed as a binary number. -The base is repeatedly squared and the result is -obtained as a product of those powers of the base that -correspond to the positions of the one-bits in the binary -representation of the exponent. -Enough digits of the result -are removed to make the scale of the result the same as if the -indicated multiplication had been performed. -.SH -Input Conversion and Base -.PP -Numbers are converted to the internal representation as they are read -in. -The scale stored with a number is simply the number of fractional digits input. -Negative numbers are indicated by preceding the number with a \fB\_\fP (an -underscore). -The hexadecimal digits A\-F correspond to the numbers 10\-15 regardless of input base. -The \fBi\fP command can be used to change the base of the input numbers. -This command pops the stack, truncates the resulting number to an integer, -and uses it as the input base for all further input. -The input base is initialized to 10 but may, for example be changed to -8 or 16 to do octal or hexadecimal to decimal conversions. -The command \fBI\fP will push the value of the input base on the stack. -.SH -Output Commands -.PP -The command \fBp\fP causes the top of the stack to be printed. -It does not remove the top of the stack. -All of the stack and internal registers can be output -by typing the command \fBf\fP. -The \fBo\fP command can be used to change the output base. -This command uses the top of the stack, truncated to an integer as -the base for all further output. -The output base in initialized to 10. -It will work correctly for any base. -The command \fBO\fP pushes the value of the output base on the stack. -.SH -Output Format and Base -.PP -The input and output bases only affect -the interpretation of numbers on input and output; they have no -effect on arithmetic computations. -Large numbers are output with 70 characters per line; -a \\ indicates a continued line. -All choices of input and output bases work correctly, although not all are -useful. -A particularly useful output base is 100000, which has the effect of -grouping digits in fives. -Bases of 8 and 16 can be used for decimal-octal or decimal-hexadecimal -conversions. -.SH -Internal Registers -.PP -Numbers or strings may be stored in internal registers or loaded on the stack -from registers with the commands \fBs\fP and \fBl\fP. -The command \fBs\fIx\fR pops the top of the stack and -stores the result in register \fBx\fP. -\fIx\fP can be any character. -\fBl\fIx\fR puts the contents of register \fBx\fP on the top of the stack. -The \fBl\fP command has no effect on the contents of register \fIx\fP. -The \fBs\fP command, however, is destructive. -.SH -Stack Commands -.PP -The command \fBc\fP clears the stack. -The command \fBd\fP pushes a duplicate of the number on the top of the stack -on the stack. -The command \fBz\fP pushes the stack size on the stack. -The command \fBX\fP replaces the number on the top of the stack -with its scale factor. -The command \fBZ\fP replaces the top of the stack -with its length. -.SH -Subroutine Definitions and Calls -.PP -Enclosing a string in \fB[ ]\fP pushes the ascii string on the stack. -The \fBq\fP command quits or in executing a string, pops the recursion levels by two. -.SH -Internal Registers \- Programming DC -.PP -The load and store -commands together with \fB[ ]\fP to store strings, \fBx\fP to execute -and the testing commands `<', `>', `=', `!<', `!>', `!=' can be used to program -DC. -The \fBx\fP command assumes the top of the stack is an string of DC commands -and executes it. -The testing commands compare the top two elements on the stack and if the relation holds, execute the register -that follows the relation. -For example, to print the numbers 0-9, -.DS -[lip1+ si li10>a]sa -0si lax -.DE -.SH -Push-Down Registers and Arrays -.PP -These commands were designed for used by a compiler, not by -people. -They involve push-down registers and arrays. -In addition to the stack that commands work on, DC can be thought -of as having individual stacks for each register. -These registers are operated on by the commands \fBS\fP and \fBL\fP. -\fBS\fIx\fR pushes the top value of the main stack onto the stack for -the register \fIx\fP. -\fBL\fIx\fR pops the stack for register \fIx\fP and puts the result on the main -stack. -The commands \fBs\fP and \fBl\fP also work on registers but not as push-down -stacks. -\fBl\fP doesn't effect the top of the -register stack, and \fBs\fP destroys what was there before. -.PP -The commands to work on arrays are \fB:\fP and \fB;\fP. -\fB:\fIx\fR pops the stack and uses this value as an index into -the array \fIx\fP. -The next element on the stack is stored at this index in \fIx\fP. -An index must be greater than or equal to 0 and -less than 2048. -\fB;\fIx\fR is the command to load the main stack from the array \fIx\fP. -The value on the top of the stack is the index -into the array \fIx\fP of the value to be loaded. -.SH -Miscellaneous Commands -.PP -The command \fB!\fP interprets the rest of the line as a -.UX -command and passes it to -.UX -to execute. -One other compiler command is \fBQ\fP. -This command uses the top of the stack as the number of levels of recursion to skip. -.SH -DESIGN CHOICES -.PP -The real reason for the use of a dynamic storage allocator was -that a general purpose program could be (and in fact has been) -used for a variety of other tasks. -The allocator has some value for input and for compiling (i.e. -the bracket [...] commands) where it cannot be known in advance -how long a string will be. -The result was that at a modest -cost in execution time, all considerations of string allocation -and sizes of strings were removed from the remainder of the program -and debugging was made easier. The allocation method -used wastes approximately 25% of available space. -.PP -The choice of 100 as a base for internal arithmetic -seemingly has no compelling advantage. Yet the base cannot -exceed 127 because of hardware limitations and at the cost -of 5% in space, debugging was made a great deal easier and -decimal output was made much faster. -.PP -The reason for a stack-type arithmetic design was -to permit all DC commands from addition to subroutine execution -to be implemented in essentially the same way. The result -was a considerable degree of logical separation of the final -program into modules with very little communication between -modules. -.PP -The rationale for the lack of interaction between the scale and the bases -was to provide an understandable means of proceeding after -a change of base or scale when numbers had already been entered. -An earlier implementation which had global notions of -scale and base did not work out well. -If the value of -.ft B -scale -.ft -were to be interpreted in the current -input or output base, -then a change of base or scale in the midst of a -computation would cause great confusion in the interpretation -of the results. -The current scheme has the advantage that the value of -the input and output bases -are only used for input and output, respectively, and they -are ignored in all other operations. -The value of -scale -is not used for any essential purpose by any part of the program -and it is used only to prevent the number of -decimal places resulting from the arithmetic operations from -growing beyond all bounds. -.PP -The design rationale for the choices for the scales of -the results of arithmetic were that in no case should -any significant digits be thrown away if, on appearances, the -user actually wanted them. Thus, if the user wants -to add the numbers 1.5 and 3.517, it seemed reasonable to give -him the result 5.017 without requiring him to unnecessarily -specify his rather obvious requirements for precision. -.PP -On the other hand, multiplication and exponentiation produce -results with many more digits than their operands and it -seemed reasonable to give as a minimum the number of decimal -places in the operands but not to give more than that -number of digits -unless the user asked for them by specifying a value for \fBscale\fP. -Square root can be handled in just the same way as multiplication. -The operation of division gives arbitrarily many decimal places -and there is simply no way to guess how many places the user -wants. -In this case only, the user must -specify a \fBscale\fP to get any decimal places at all. -.PP -The scale of remainder was chosen to make it possible -to recreate the dividend from the quotient and remainder. -This is easy to implement; no digits are thrown away. -.SH -References -.IP [1] -L. L. Cherry, R. Morris, -.ft I -BC \- An Arbitrary Precision Desk-Calculator Language. -.ft -.IP [2] -K. C. Knowlton, -.ft I -A Fast Storage Allocator, -.ft -Comm. ACM \fB8\fP, pp. 623-625 (Oct. 1965). diff --git a/usr.bin/gprof/PSD.doc/abstract.me b/usr.bin/gprof/PSD.doc/abstract.me deleted file mode 100644 index 28e8066..0000000 --- a/usr.bin/gprof/PSD.doc/abstract.me +++ /dev/null @@ -1,66 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)abstract.me 8.1 (Berkeley) 6/8/93 -.\" -.sp 1 -\fB\s+2gprof: a Call Graph Execution Profiler\s-2\fP\** -.(f -\**This work was supported by grant MCS80-05144 -from the National Science Foundation. -.)f -.sp 1 -by -\fISusan L. Graham\fP -\fIPeter B. Kessler\fP -\fIMarshall K. McKusick\fP -.sp 1 -Computer Science Division -Electrical Engineering and Computer Science Department -University of California, Berkeley -Berkeley, California 94720 -.ce 0 -.sp 1 -.sp 0.5i -.sh 0 "Abstract" -.pp -Large complex programs are composed of many small routines -that implement abstractions for the routines that call them. -To be useful, an execution profiler must attribute -execution time in a way that is significant for the -logical structure of a program -as well as for its textual decomposition. -This data must then be displayed to the user -in a convenient and informative way. -The \fBgprof\fP profiler -accounts for the running time of called routines -in the running time of the routines that call them. -The design and use of this profiler is described. diff --git a/usr.bin/gprof/PSD.doc/gathering.me b/usr.bin/gprof/PSD.doc/gathering.me deleted file mode 100644 index 17130c3..0000000 --- a/usr.bin/gprof/PSD.doc/gathering.me +++ /dev/null @@ -1,231 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)gathering.me 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "Gathering Profile Data" -.pp -Routine calls or statement executions can be measured by having a -compiler augment the code at strategic points. -The additions can be inline increments to counters [Knuth71] -[Satterthwaite72] [Joy79] or calls to -monitoring routines [Unix]. -The counter increment overhead is low, and is suitable for -profiling statements. -A call of the monitoring routine has an overhead comparable with a -call of a regular routine, and is therefore only suited -to profiling on a routine by routine basis. -However, the monitoring routine solution has certain advantages. -Whatever counters are needed by the monitoring routine can be -managed by the monitoring routine itself, rather than being -distributed around the code. -In particular, a monitoring routine can easily be called from separately -compiled programs. -In addition, different monitoring routines can be linked into the -program -being measured -to assemble different profiling data without having to -change the compiler or recompile the program. -We have exploited this approach; -our compilers for C, Fortran77, and Pascal can insert calls to a -monitoring routine in the prologue for each routine. -Use of the monitoring routine requires no planning on part of a -programmer other than to request that augmented routine -prologues be produced during compilation. -.pp -We are interested in gathering three pieces of information during -program execution: call counts and execution times for -each profiled routine, and the arcs of the dynamic call graph -traversed by this execution of the program. -By post-processing of this data we can build the dynamic call -graph for this execution of the program and propagate times along -the edges of this graph to attribute times for routines to the -routines that invoke them. -.pp -Gathering of the profiling information should not greatly -interfere with the running of the program. -Thus, the monitoring routine must not produce trace output each -time it is invoked. -The volume of data thus produced would be unmanageably large, -and the time required to record it would overwhelm the running -time of most programs. -Similarly, the monitoring routine can not do the analysis of -the profiling data (e.g. assembling the call graph, propagating -times around it, discovering cycles, etc.) during program -execution. -Our solution is to gather profiling data in memory during program -execution and to condense it to a file as the profiled -program exits. -This file is then processed by a separate program to produce the -listing of the profile data. -An advantage of this approach is that the profile data for -several executions of a program can be combined by the -post-processing to provide a profile of many -executions. -.pp -The execution time monitoring consists of three parts. -The first part allocates and initializes the runtime monitoring data -structures before the program begins execution. -The second part is the monitoring routine invoked from the -prologue of each profiled routine. -The third part condenses the data structures and writes them -to a file as the program terminates. -The monitoring routine is discussed in detail in the following sections. -.sh 2 "Execution Counts" -.pp -The \fBgprof\fP monitoring routine counts the number of times -each profiled routine is called. -The monitoring routine also records the arc in the call graph -that activated the profiled routine. -The count is associated with the arc in the call graph -rather than with the routine. -Call counts for routines can then be determined by summing the counts -on arcs directed into that routine. -In a machine-dependent fashion, the monitoring routine notes its -own return address. -This address is in the prologue of some profiled routine that is -the destination of an arc in the dynamic call graph. -The monitoring routine also discovers the return address for that -routine, thus identifying the call site, or source of the arc. -The source of the arc is in the \fIcaller\fP, and the destination is in -the \fIcallee\fP. -For example, if a routine A calls a routine B, A is the caller, -and B is the callee. -The prologue of B will include a call to the monitoring routine -that will note the arc from A to B and either initialize or -increment a counter for that arc. -.pp -One can not afford to have the monitoring routine output tracing -information as each arc is identified. -Therefore, the monitoring routine maintains a table of all the -arcs discovered, with counts of the numbers of times each is -traversed during execution. -This table is accessed once per routine call. -Access to it -must be as fast as possible so as not to overwhelm the time -required to execute the program. -.pp -Our solution is to access the table through a hash table. -We use the call site as the primary key with the callee -address being the secondary key. -Since each call site typically calls only one callee, we can -reduce (usually to one) the number of minor lookups based on the callee. -Another alternative would use the callee as the primary key and the -call site as the secondary key. -Such an organization has the advantage of associating callers with -callees, at the expense of longer lookups in the monitoring -routine. -We are fortunate to be running in a virtual memory environment, -and (for the sake of speed) were able to allocate enough space -for the primary hash table to allow a one-to-one mapping from -call site addresses to the primary hash table. -Thus our hash function is trivial to calculate and collisions -occur only for call sites that call multiple -destinations (e.g. functional parameters and functional variables). -A one level hash function using both call site and callee would -result in an unreasonably large hash table. -Further, the number of dynamic call sites and callees is not known during -execution of the profiled program. -.pp -Not all callers and callees can be identified by the monitoring -routine. -Routines that were compiled without the profiling augmentations -will not call the monitoring routine as part of their prologue, -and thus no arcs will be recorded whose destinations are in these -routines. -One need not profile all the routines in a program. -Routines that are not profiled run at full speed. -Certain routines, notably exception handlers, are invoked by -non-standard calling sequences. -Thus the monitoring routine may know the destination of an arc -(the callee), -but find it difficult or -impossible to determine the source of the arc (the caller). -Often in these cases the apparent source of the arc is not a call -site at all. -Such anomalous invocations are declared ``spontaneous''. -.sh 2 "Execution Times" -.pp -The execution times for routines can be gathered in at least two -ways. -One method measures the execution time of a routine by measuring -the elapsed time from routine entry to routine exit. -Unfortunately, time measurement is complicated on time-sharing -systems by the time-slicing of the program. -A second method samples the value of the program counter at some -interval, and infers execution time from the distribution of the -samples within the program. -This technique is particularly suited to time-sharing systems, -where the time-slicing can serve as the basis for sampling -the program counter. -Notice that, whereas the first method could provide exact timings, -the second is inherently a statistical approximation. -.pp -The sampling method need not require support from the operating -system: all that is needed is the ability to set and respond to -``alarm clock'' interrupts that run relative to program time. -It is imperative that the intervals be uniform since the -sampling of the program counter rather than the duration of the -interval is the basis of the distribution. -If sampling is done too often, the interruptions to sample the -program counter will overwhelm the running of the profiled program. -On the other hand, the program must run for enough sampled -intervals that the distribution of the samples accurately -represents the distribution of time for the execution of the -program. -As with routine call tracing, the monitoring routine can not -afford to output information for each program counter -sample. -In our computing environment, the operating system can provide a -histogram of the location of the program counter at the end of -each clock tick (1/60th of a second) in which a program runs. -The histogram is assembled in memory as the program runs. -This facility is enabled by our monitoring routine. -We have adjusted the granularity of the histogram so that -program counter values map one-to-one onto the histogram. -We make the simplifying assumption that all calls to a specific -routine require the same amount of time to execute. -This assumption may disguise that some calls -(or worse, some call sites) always invoke a routine -such that its execution is faster (or slower) -than the average time for that routine. -.pp -When the profiled program terminates, -the arc table and the histogram of -program counter samples is written to a file. -The arc table is condensed to consist of the source and destination -addresses of the arc and the count of the number of times the arc -was traversed by this execution of the program. -The recorded histogram consists of counters of the number of -times the program counter was found to be in each of the ranges covered -by the histogram. -The ranges themselves are summarized as a -lower and upper bound and a step size. diff --git a/usr.bin/gprof/PSD.doc/header.me b/usr.bin/gprof/PSD.doc/header.me deleted file mode 100644 index aef606d..0000000 --- a/usr.bin/gprof/PSD.doc/header.me +++ /dev/null @@ -1,38 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)header.me 8.1 (Berkeley) 8/14/93 -.\" -.\"he 'gprof''Graham, Kessler, McKusick' -.\"fo 'Draft of \*(td''%' -.\"ls 2 -.eh 'PSD:18-%''gprof \*- a Call Graph Execution Profiler' -.oh 'gprof \*- A Call Graph Execution Profiler''PSD:18-%' diff --git a/usr.bin/gprof/PSD.doc/intro.me b/usr.bin/gprof/PSD.doc/intro.me deleted file mode 100644 index 3a872b2..0000000 --- a/usr.bin/gprof/PSD.doc/intro.me +++ /dev/null @@ -1,81 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.me 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "Programs to be Profiled" -.pp -Software research environments -normally include many large programs -both for production use and for experimental investigation. -These programs are typically modular, -in accordance with generally accepted principles -of good program design. -Often they consist of numerous small routines -that implement various abstractions. -Sometimes such large programs are written -by one programmer -who has understood the requirements for -these abstractions, and has programmed them -appropriately. -More frequently the program has -had multiple authors and has -evolved over time, changing the demands placed -on the implementation of the abstractions without -changing the implementation itself. -Finally, the program may be assembled from a library -of abstraction implementations -unexamined by the programmer. -.pp -Once a large program is executable, -it is often desirable to increase its speed, -especially if small portions of the program -are found to dominate its execution time. -The purpose of the \fBgprof\fP profiling tool is to -help the user evaluate alternative implementations -of abstractions. -We developed this tool in response to our efforts -to improve a code generator we were writing [Graham82]. -.pp -The \fBgprof\fP design takes advantage of the fact that the programs -to be measured are large, structured and hierarchical. -We provide a profile in which the execution time -for a set of routines that implement an -abstraction is collected and charged -to that abstraction. -The profile can be used to compare and assess the costs of -various implementations. -.pp -The profiler can be linked into a program without -special planning by the programmer. -The overhead for using \fBgprof\fP is low; -both in terms of added execution time and in the -volume of profiling information recorded. diff --git a/usr.bin/gprof/PSD.doc/postp.me b/usr.bin/gprof/PSD.doc/postp.me deleted file mode 100644 index d71fefb..0000000 --- a/usr.bin/gprof/PSD.doc/postp.me +++ /dev/null @@ -1,190 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)postp.me 8.1 (Berkeley) 6/8/93 -.\" -.EQ -delim $$ -gsize 11 -.EN -.sh 1 "Post Processing" -.pp -Having gathered the arcs of the call graph and timing information -for an execution of the program, -we are interested in attributing the time for each routine to the -routines that call it. -We build a dynamic call graph with arcs from caller to callee, -and propagate time from descendants to ancestors -by topologically sorting the call graph. -Time propagation is performed from the leaves of the -call graph toward the roots, according to the order -assigned by a topological numbering algorithm. -The topological numbering ensures that -all edges in the graph go from higher numbered nodes to lower -numbered nodes. -An example is given in Figure 1. -If we propagate time from nodes in the -order assigned by the algorithm, -execution time can be propagated from descendants to ancestors -after a single traversal of each arc in the call graph. -Each parent receives some fraction of a child's time. -Thus time is charged to the -caller in addition to being charged to the callee. -.(z -.so postp1.pic -.ce 2 -Topological ordering -Figure 1. -.ce 0 -.)z -.pp -Let $C sub e$ be the number of calls to some routine, -$e$, and $C sub e sup r$ be the number of -calls from a caller $r$ to a callee $e$. -Since we are assuming each call to a routine takes the -average amount of time for all calls to that routine, -the caller is accountable for -$C sub e sup r / C sub e$ -of the time spent by the callee. -Let the $S sub e$ be the $selftime$ of a routine, $e$. -The selftime of a routine can be determined from the -timing information gathered during profiled program execution. -The total time, $T sub r$, we wish to account to a routine -$r$, is then given by the recurrence equation: -.EQ -T sub r ~ = ~ {S sub r} ~ + ~ - sum from {r ~ roman CALLS ~ e} - {T sub e times {{C sub e sup r} over {C sub e}}} -.EN -where $r ~ roman CALLS ~ e$ is a relation showing all routines -$e$ called by a routine $r$. -This relation is easily available from the call graph. -.pp -However, if the execution contains recursive calls, -the call graph has cycles that -cannot be topologically sorted. -In these cases, we discover strongly-connected -components in the call graph, -treat each such component as a single node, -and then sort the resulting graph. -We use a variation of Tarjan's strongly-connected -components algorithm -that discovers strongly-connected components as it is assigning -topological order numbers [Tarjan72]. -.pp -Time propagation within strongly connected -components is a problem. -For example, a self-recursive routine -(a trivial cycle in the call graph) -is accountable for all the time it -uses in all its recursive instantiations. -In our scheme, this time should be -shared among its call graph parents. -The arcs from a routine to itself are of interest, -but do not participate in time propagation. -Thus the simple equation for time propagation -does not work within strongly connected components. -Time is not propagated from one member of a cycle to another, -since, by definition, this involves propagating time from a routine -to itself. -In addition, children of one member of a cycle -must be considered children of all members of the cycle. -Similarly, parents of one member of the cycle must inherit -all members of the cycle as descendants. -It is for these reasons that we collapse connected components. -Our solution collects all members of a cycle together, -summing the time and call counts for all members. -All calls into the cycle are made to share the total -time of the cycle, and all descendants of the cycle -propagate time into the cycle as a whole. -Calls among the members of the cycle -do not propagate any time, -though they are listed in the call graph profile. -.pp -Figure 2 shows a modified version of the call graph of Figure 1, -in which the nodes labelled 3 and 7 in Figure 1 are mutually -recursive. -The topologically sorted graph after the cycle is collapsed is -given in Figure 3. -.(z -.so postp2.pic -.ce 2 -Cycle to be collapsed. -Figure 2. -.ce 0 -.)z -.(z -.so postp3.pic -.ce 2 -Topological numbering after cycle collapsing. -Figure 3. -.ce 0 -.)z -.pp -Since the technique described above only collects the -dynamic call graph, -and the program typically does not call every routine -on each execution, -different executions can introduce different cycles in the -dynamic call graph. -Since cycles often have a significant effect on time propagation, -it is desirable to incorporate the static call graph so that cycles -will have the same members regardless of how the program runs. -.pp -The static call graph can be constructed from the source text -of the program. -However, discovering the static call graph from the source text -would require two moderately difficult steps: -finding the source text for the program -(which may not be available), -and scanning and parsing that text, -which may be in any one of several languages. -.pp -In our programming system, -the static calling information is also contained in the -executable version of the program, -which we already have available, -and which is in language-independent form. -One can examine the instructions -in the object program, -looking for calls to routines, and note which -routines can be called. -This technique allows us to add arcs to those already in the -dynamic call graph. -If a statically discovered arc already exists in the dynamic call -graph, no action is required. -Statically discovered arcs that do not exist in the dynamic call -graph are added to the graph with a traversal count of zero. -Thus they are never responsible for any time propagation. -However, they may affect the structure of the graph. -Since they may complete strongly connected components, -the static call graph construction is -done before topological ordering. diff --git a/usr.bin/gprof/PSD.doc/postp1.pic b/usr.bin/gprof/PSD.doc/postp1.pic deleted file mode 100644 index 1446092..0000000 --- a/usr.bin/gprof/PSD.doc/postp1.pic +++ /dev/null @@ -1,54 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)postp1.pic 8.1 (Berkeley) 6/8/93 -.\" -.PS -circle diam .3i "8" -circle diam .3i "9" at 1st circle + (2i,0i) -circle diam .3i "3" at 1st circle + (0.5i,-0.5i) -circle diam .3i "7" at 2nd circle - (0.5i, 0.5i) -circle diam .3i "2" at 1st circle - (0i,1i) -circle diam .3i "5" at 5th circle + (1i,0i) -circle diam .3i "6" at 2nd circle - (0i,1i) -circle diam .3i "1" at 3rd circle - (0i,1i) -circle diam .3i "4" at 4th circle - (0i,1i) -arrow from 1st circle to 3rd circle chop .15i chop .15i -arrow from 1st circle to 4th circle chop .15i chop .15i -arrow from 2nd circle to 4th circle chop .15i chop .15i -arrow from 3rd circle to 5th circle chop .15i chop .15i -arrow from 4th circle to 5th circle chop .15i chop .15i -arrow from 4th circle to 6th circle chop .15i chop .15i -arrow from 4th circle to 7th circle chop .15i chop .15i -arrow from 5th circle to 8th circle chop .15i chop .15i -arrow from 6th circle to 8th circle chop .15i chop .15i -arrow from 6th circle to 9th circle chop .15i chop .15i -.PE diff --git a/usr.bin/gprof/PSD.doc/postp2.pic b/usr.bin/gprof/PSD.doc/postp2.pic deleted file mode 100644 index 3b31736..0000000 --- a/usr.bin/gprof/PSD.doc/postp2.pic +++ /dev/null @@ -1,56 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)postp2.pic 8.1 (Berkeley) 6/8/93 -.\" -.PS -circle diam .3i "\(ci" -circle diam .3i "\(ci" at 1st circle + (2i,0i) -circle diam .3i "\(bu" at 1st circle + (0.5i,-0.5i) -circle diam .3i "\(bu" at 2nd circle - (0.5i, 0.5i) -circle diam .3i "\(ci" at 1st circle - (0i,1i) -circle diam .3i "\(ci" at 5th circle + (1i,0i) -circle diam .3i "\(ci" at 2nd circle - (0i,1i) -circle diam .3i "\(ci" at 3rd circle - (0i,1i) -circle diam .3i "\(ci" at 4th circle - (0i,1i) -arrow from 1st circle to 3rd circle chop .15i chop .15i -arrow from 1st circle to 4th circle chop .15i chop .15i -arrow from 2nd circle to 4th circle chop .15i chop .15i -spline -> from 3rd circle right .5i up .075i then right .5i down .075i chop .15i chop .15i -spline -> from 4th circle left .5i down .075i then left .5i up .075i chop .15i chop .15i -arrow from 3rd circle to 5th circle chop .15i chop .15i -arrow from 4th circle to 5th circle chop .15i chop .15i -arrow from 4th circle to 6th circle chop .15i chop .15i -arrow from 4th circle to 7th circle chop .15i chop .15i -arrow from 5th circle to 8th circle chop .15i chop .15i -arrow from 6th circle to 8th circle chop .15i chop .15i -arrow from 6th circle to 9th circle chop .15i chop .15i -.PE diff --git a/usr.bin/gprof/PSD.doc/postp3.pic b/usr.bin/gprof/PSD.doc/postp3.pic deleted file mode 100644 index 65eb2a7..0000000 --- a/usr.bin/gprof/PSD.doc/postp3.pic +++ /dev/null @@ -1,51 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)postp3.pic 8.1 (Berkeley) 6/8/93 -.\" -.PS -circle diam .3i "7" -circle diam .3i "8" at 1st circle + (2i,0i) -EL: ellipse wid 1i ht .3i "\fB6\fR\h'.7i'\fB6\fR" at 1st circle + (1i,-0.5i) -circle diam .3i "2" at 1st circle - (0i,1i) -circle diam .3i "4" at 3th circle + (1i,0i) -circle diam .3i "5" at 2nd circle - (0i,1i) -circle diam .3i "1" at 3rd circle + (0.5i,-0.5i) -circle diam .3i "3" at 5th circle - (0.5i,0.5i) -arrow from 1st circle to EL.nw chop .15i chop 0i -arrow from 2nd circle to EL.ne chop .15i chop 0i -arrow from EL.sw to 3rd circle chop 0i chop .15i -arrow from EL.s to 4th circle chop 0i chop .15i -arrow from EL.se to 5th circle chop 0i chop .15i -arrow from 3rd circle to 6th circle chop .15i chop .15i -arrow from 4th circle to 6th circle chop .15i chop .15i -arrow from 4th circle to 7th circle chop .15i chop .15i -.PE diff --git a/usr.bin/gprof/PSD.doc/pres1.pic b/usr.bin/gprof/PSD.doc/pres1.pic deleted file mode 100644 index 0c311a1..0000000 --- a/usr.bin/gprof/PSD.doc/pres1.pic +++ /dev/null @@ -1,56 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)pres1.pic 8.1 (Berkeley) 6/8/93 -.\" -.PS -ellipse ht .3i wid .75i "\s-1CALLER1\s+1" -ellipse ht .3i wid .75i "\s-1CALLER2\s+1" at 1st ellipse + (2i,0i) -ellipse ht .3i wid .8i "\s-1EXAMPLE\s+1" at 1st ellipse + (1i,-.5i) -ellipse ht .3i wid .5i "\s-1SUB1\s+1" at 1st ellipse - (0i,1i) -ellipse ht .3i wid .5i "\s-1SUB2\s+1" at 3rd ellipse - (0i,.5i) -ellipse ht .3i wid .5i "\s-1SUB3\s+1" at 2nd ellipse - (0i,1i) -line <- from 1st ellipse up .5i left .5i chop .1875i -line <- from 1st ellipse up .5i right .5i chop .1875i -line <- from 2nd ellipse up .5i left .5i chop .1875i -line <- from 2nd ellipse up .5i right .5i chop .1875i -arrow from 1st ellipse to 3rd ellipse chop -arrow from 2nd ellipse to 3rd ellipse chop -arrow from 3rd ellipse to 4th ellipse chop -arrow from 3rd ellipse to 5th ellipse chop .15i chop .15i -arrow from 3rd ellipse to 6th ellipse chop -arrow from 4th ellipse down .5i left .5i chop .1875i -arrow from 4th ellipse down .5i right .5i chop .1875i -arrow from 5th ellipse down .5i left .5i chop .1875i -arrow from 5th ellipse down .5i right .5i chop .1875i -arrow from 6th ellipse down .5i left .5i chop .1875i -arrow from 6th ellipse down .5i right .5i chop .1875i -.PE diff --git a/usr.bin/gprof/PSD.doc/pres2.pic b/usr.bin/gprof/PSD.doc/pres2.pic deleted file mode 100644 index c3a4ea0..0000000 --- a/usr.bin/gprof/PSD.doc/pres2.pic +++ /dev/null @@ -1,52 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)pres2.pic 8.1 (Berkeley) 6/8/93 -.\" -.PS -ellipse ht .3i wid .6i "\s-1CALC1\s+1" -ellipse ht .3i wid .6i "\s-1CALC2\s+1" at 1st ellipse + (.75i,0i) -ellipse ht .3i wid .6i "\s-1CALC3\s+1" at 1st ellipse + (1.5i,0i) -ellipse ht .3i wid .8i "\s-1FORMAT1\s+1" at 1st ellipse - (0i,.5i) -ellipse ht .3i wid .8i "\s-1FORMAT2\s+1" at 3rd ellipse - (0i,.5i) -ellipse ht .3i wid .75i "\s-1\"WRITE\"\s+1" at 5th ellipse - (.75i,.5i) -line <- from 1st ellipse up .5i left .4i chop .1825i -line <- from 1st ellipse up .5i right .4i chop .1825i -line <- from 2nd ellipse up .5i left .4i chop .1825i -line <- from 2nd ellipse up .5i right .4i chop .1825i -line <- from 3rd ellipse up .5i left .4i chop .1825i -line <- from 3rd ellipse up .5i right .4i chop .1825i -arrow from 1st ellipse to 4th ellipse chop .15i -arrow from 2nd ellipse to 5th ellipse chop -arrow from 3rd ellipse to 5th ellipse chop .15i -arrow from 4th ellipse to 6th ellipse chop -arrow from 5th ellipse to 6th ellipse chop -.PE diff --git a/usr.bin/gprof/PSD.doc/present.me b/usr.bin/gprof/PSD.doc/present.me deleted file mode 100644 index 1dd7f62..0000000 --- a/usr.bin/gprof/PSD.doc/present.me +++ /dev/null @@ -1,306 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)present.me 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "Data Presentation" -.pp -The data is presented to the user in two different formats. -The first presentation simply lists the routines -without regard to the amount of time their descendants use. -The second presentation incorporates the call graph of the -program. -.sh 2 "The Flat Profile -.pp -The flat profile consists of a list of all the routines -that are called during execution of the program, -with the count of the number of times they are called -and the number of seconds of execution time for which they -are themselves accountable. -The routines are listed in decreasing order of execution time. -A list of the routines that are never called during execution of -the program is also available -to verify that nothing important is omitted by -this execution. -The flat profile gives a quick overview of the routines that are used, -and shows the routines that are themselves responsible -for large fractions of the execution time. -In practice, -this profile usually shows that no single function -is overwhelmingly responsible for -the total time of the program. -Notice that for this profile, -the individual times sum to the total execution time. -.sh 2 "The Call Graph Profile" -.sz 10 -.(z -.TS -box center; -c c c c c l l -c c c c c l l -c c c c c l l -l n n n c l l. - called/total \ \ parents -index %time self descendants called+self name index - called/total \ \ children -_ - 0.20 1.20 4/10 \ \ \s-1CALLER1\s+1 [7] - 0.30 1.80 6/10 \ \ \s-1CALLER2\s+1 [1] -[2] 41.5 0.50 3.00 10+4 \s-1EXAMPLE\s+1 [2] - 1.50 1.00 20/40 \ \ \s-1SUB1\s+1 [4] - 0.00 0.50 1/5 \ \ \s-1SUB2\s+1 [9] - 0.00 0.00 0/5 \ \ \s-1SUB3\s+1 [11] -.TE -.ce 2 -Profile entry for \s-1EXAMPLE\s+1. -Figure 4. -.)z -.pp -Ideally, we would like to print the call graph of the program, -but we are limited by the two-dimensional nature of our output -devices. -We cannot assume that a call graph is planar, -and even if it is, that we can print a planar version of it. -Instead, we choose to list each routine, -together with information about -the routines that are its direct parents and children. -This listing presents a window into the call graph. -Based on our experience, -both parent information and child information -is important, -and should be available without searching -through the output. -.pp -The major entries of the call graph profile are the entries from the -flat profile, augmented by the time propagated to each -routine from its descendants. -This profile is sorted by the sum of the time for the routine -itself plus the time inherited from its descendants. -The profile shows which of the higher level routines -spend large portions of the total execution time -in the routines that they call. -For each routine, we show the amount of time passed by each child -to the routine, which includes time for the child itself -and for the descendants of the child -(and thus the descendants of the routine). -We also show the percentage these times represent of the total time -accounted to the child. -Similarly, the parents of each routine are listed, -along with time, -and percentage of total routine time, -propagated to each one. -.pp -Cycles are handled as single entities. -The cycle as a whole is shown as though it were a single routine, -except that members of the cycle are listed in place of the children. -Although the number of calls of each member -from within the cycle are shown, -they do not affect time propagation. -When a child is a member of a cycle, -the time shown is the appropriate fraction of the time -for the whole cycle. -Self-recursive routines have their calls broken -down into calls from the outside and self-recursive calls. -Only the outside calls affect the propagation of time. -.pp -The following example is a typical fragment of a call graph. -.(b -.so pres1.pic -.)b -The entry in the call graph profile listing for this example is -shown in Figure 4. -.pp -The entry is for routine \s-1EXAMPLE\s+1, which has -the Caller routines as its parents, -and the Sub routines as its children. -The reader should keep in mind that all information -is given \fIwith respect to \s-1EXAMPLE\s+1\fP. -The index in the first column shows that \s-1EXAMPLE\s+1 -is the second entry in the profile listing. -The \s-1EXAMPLE\s+1 routine is called ten times, four times by \s-1CALLER1\s+1, -and six times by \s-1CALLER2\s+1. -Consequently 40% of \s-1EXAMPLE\s+1's time is propagated to \s-1CALLER1\s+1, -and 60% of \s-1EXAMPLE\s+1's time is propagated to \s-1CALLER2\s+1. -The self and descendant fields of the parents -show the amount of self and descendant time \s-1EXAMPLE\s+1 -propagates to them (but not the time used by -the parents directly). -Note that \s-1EXAMPLE\s+1 calls itself recursively four times. -The routine \s-1EXAMPLE\s+1 calls routine \s-1SUB1\s+1 twenty times, \s-1SUB2\s+1 once, -and never calls \s-1SUB3\s+1. -Since \s-1SUB2\s+1 is called a total of five times, -20% of its self and descendant time is propagated to \s-1EXAMPLE\s+1's -descendant time field. -Because \s-1SUB1\s+1 is a member of \fIcycle 1\fR, -the self and descendant times -and call count fraction -are those for the cycle as a whole. -Since cycle 1 is called a total of forty times -(not counting calls among members of the cycle), -it propagates 50% of the cycle's self and descendant -time to \s-1EXAMPLE\s+1's descendant time field. -Finally each name is followed by an index that shows -where on the listing to find the entry for that routine. -.sh 1 "Using the Profiles" -.pp -The profiler is a useful tool for improving -a set of routines that implement an abstraction. -It can be helpful in identifying poorly coded routines, -and in evaluating the new algorithms and code that replace them. -Taking full advantage of the profiler -requires a careful examination of the call graph profile, -and a thorough knowledge of the abstractions underlying -the program. -.pp -The easiest optimization that can be performed -is a small change -to a control construct or data structure that improves the -running time of the program. -An obvious starting point -is a routine that is called many times. -For example, suppose an output -routine is the only parent -of a routine that formats the data. -If this format routine is expanded inline in the -output routine, the overhead of a function call and -return can be saved for each datum that needs to be formatted. -.pp -The drawback to inline expansion is that the data abstractions -in the program may become less parameterized, -hence less clearly defined. -The profiling will also become less useful since the loss of -routines will make its output more granular. -For example, -if the symbol table functions ``lookup'', ``insert'', and ``delete'' -are all merged into a single parameterized routine, -it will be impossible to determine the costs -of any one of these individual functions from the profile. -.pp -Further potential for optimization lies in routines that -implement data abstractions whose total execution -time is long. -For example, a lookup routine might be called only a few -times, but use an inefficient linear search algorithm, -that might be replaced with a binary search. -Alternately, the discovery that a rehashing function is being -called excessively, can lead to a different -hash function or a larger hash table. -If the data abstraction function cannot easily be speeded up, -it may be advantageous to cache its results, -and eliminate the need to rerun -it for identical inputs. -These and other ideas for program improvement are discussed in -[Bentley81]. -.pp -This tool is best used in an iterative approach: -profiling the program, -eliminating one bottleneck, -then finding some other part of the program -that begins to dominate execution time. -For instance, we have used \fBgprof\fR on itself; -eliminating, rewriting, and inline expanding routines, -until reading -data files (hardly a target for optimization!) -represents the dominating factor in its execution time. -.pp -Certain types of programs are not easily analyzed by \fBgprof\fR. -They are typified by programs that exhibit a large degree of -recursion, such as recursive descent compilers. -The problem is that most of the major routines are grouped -into a single monolithic cycle. -As in the symbol table abstraction that is placed -in one routine, -it is impossible to distinguish which members of the cycle are -responsible for the execution time. -Unfortunately there are no easy modifications to these programs that -make them amenable to analysis. -.pp -A completely different use of the profiler is to analyze the control -flow of an unfamiliar program. -If you receive a program from another user that you need to modify -in some small way, -it is often unclear where the changes need to be made. -By running the program on an example and then using \fBgprof\fR, -you can get a view of the structure of the program. -.pp -Consider an example in which you need to change the output format -of the program. -For purposes of this example suppose that the call graph -of the output portion of the program has the following structure: -.(b -.so pres2.pic -.)b -Initially you look through the \fBgprof\fR -output for the system call ``\s-1WRITE\s+1''. -The format routine you will need to change is probably -among the parents of the ``\s-1WRITE\s+1'' procedure. -The next step is to look at the profile entry for each -of parents of ``\s-1WRITE\s+1'', -in this example either ``\s-1FORMAT1\s+1'' or ``\s-1FORMAT2\s+1'', -to determine which one to change. -Each format routine will have one or more parents, -in this example ``\s-1CALC1\s+1'', ``\s-1CALC2\s+1'', and ``\s-1CALC3\s+1''. -By inspecting the source code for each of these routines -you can determine which format routine generates the output that -you wish to modify. -Since the \fBgprof\fR entry shows all the -potential calls to the format routine you intend to change, -you can determine if your modifications will affect output that -should be left alone. -If you desire to change the output of ``\s-1CALC2\s+1'', but not ``\s-1CALC3\s+1'', -then formatting routine ``\s-1FORMAT2\s+1'' needs to be split -into two separate routines, -one of which implements the new format. -You can then retarget just the call by ``\s-1CALC2\s+1'' -that needs the new format. -It should be noted that the static call information is particularly -useful here since the test case you run probably will not -exercise the entire program. -.sh 1 "Conclusions" -.pp -We have created a profiler that aids in the evaluation -of modular programs. -For each routine in the program, -the profile shows the extent to which that routine -helps support various abstractions, -and how that routine uses other abstractions. -The profile accurately assesses the cost of routines -at all levels of the program decomposition. -The profiler is easily used, -and can be compiled into the program without any prior planning by -the programmer. -It adds only five to thirty percent execution overhead to the program -being profiled, -produces no additional output until after the program finishes, -and allows the program to be measured in its actual environment. -Finally, the profiler runs on a time-sharing system -using only the normal services provided by the operating system -and compilers. diff --git a/usr.bin/gprof/PSD.doc/profiling.me b/usr.bin/gprof/PSD.doc/profiling.me deleted file mode 100644 index 227aedf..0000000 --- a/usr.bin/gprof/PSD.doc/profiling.me +++ /dev/null @@ -1,115 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)profiling.me 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "Types of Profiling" -.pp -There are several different uses for program profiles, -and each may require different information from the profiles, -or different presentation of the information. -We distinguish two broad categories of profiles: -those that present counts of statement or routine invocations, -and those that display timing information about statements -or routines. -Counts are typically presented in tabular form, -often in parallel with a listing of the source code. -Timing information could be similarly presented; -but more than one measure of time might be associated with each -statement or routine. -For example, -in the framework used by \fBgprof\fP -each profiled segment would display two times: -one for the time used by the segment itself, and another for the -time inherited from code segments it invokes. -.pp -Execution counts are used in many different contexts. -The exact number of times a routine or statement is activated -can be used to determine if an algorithm is performing as -expected. -Cursory inspection of such counters may show algorithms whose -complexity is unsuited to the task at hand. -Careful interpretation of counters can often suggest -improvements to acceptable algorithms. -Precise examination can uncover subtle errors in an -algorithm. -At this level, profiling counters are similar to -debugging statements whose purpose is to show the number of times -a piece of code is executed. -Another view of such counters is as boolean values. -One may be interested that a portion of code has executed at -all, for exhaustive testing, or to check that one implementation -of an abstraction completely replaces a previous one. -.pp -Execution counts are not necessarily proportional to the amount -of time required to execute the routine or statement. -Further, the execution time of a routine will not be the same for -all calls on the routine. -The criteria for establishing execution time -must be decided. -If a routine implements an abstraction by invoking other abstractions, -the time spent in the routine will not accurately reflect the -time required by the abstraction it implements. -Similarly, if an abstraction is implemented by several -routines the time required by the abstraction will be distributed -across those routines. -.pp -Given the execution time of individual routines, -\fBgprof\fP accounts to each routine the time spent -for it by the routines it invokes. -This accounting is done by assembling a \fIcall graph\fP with nodes that -are the routines of the program and directed arcs that represent -calls from call sites to routines. -We distinguish among three different call graphs for a program. -The \fIcomplete call graph\fP incorporates all routines and all -potential arcs, -including arcs that represent calls to functional parameters -or functional variables. -This graph contains the other two graphs as subgraphs. -The \fIstatic call graph\fP includes all routines and all possible arcs -that are not calls to functional parameters or variables. -The \fIdynamic call graph\fP includes only those routines and -arcs traversed by the profiled execution of the program. -This graph need not include all routines, nor need it include all -potential arcs between the routines it covers. -It may, however, include arcs to functional parameters or -variables that the static call graph may omit. -The static call graph can be determined from the (static) program text. -The dynamic call graph is determined only by profiling an -execution of the program. -The complete call graph for a monolithic program could be determined -by data flow analysis techniques. -The complete call graph for programs that change -during execution, by modifying themselves or dynamically loading -or overlaying code, may never be determinable. -Both the static call graph and the dynamic call graph are used -by \fBgprof\fP, but it does not search for the complete call -graph. diff --git a/usr.bin/gprof/PSD.doc/refs.me b/usr.bin/gprof/PSD.doc/refs.me deleted file mode 100644 index 580d080..0000000 --- a/usr.bin/gprof/PSD.doc/refs.me +++ /dev/null @@ -1,63 +0,0 @@ -.\" Copyright (c) 1982, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)refs.me 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "References" -.ls 1 -.ip [Bentley81] -Bentley, J. L., -``Writing Efficient Code'', -Department of Computer Science, -Carnegie-Mellon University, -Pittsburgh, Pennsylvania, -CMU-CS-81-116, 1981. -.ip [Graham82] -Graham, S. L., Henry, R. R., Schulman, R. A., -``An Experiment in Table Driven Code Generation'', -SIGPLAN '82 Symposium on Compiler Construction, -June, 1982. -.ip [Joy79] -Joy, W. N., Graham, S. L., Haley, C. B. ``Berkeley Pascal User's Manual'', -Version 1.1, Computer Science Division -University of California, Berkeley, CA. April 1979. -.ip [Knuth71] -Knuth, D. E. ``An empirical study of FORTRAN programs'', -Software - Practice and Experience, 1, 105-133. 1971 -.ip [Satterthwaite72] -Satterthwaite, E. ``Debugging Tools for High Level Languages'', -Software - Practice and Experience, 2, 197-217, 1972 -.ip [Tarjan72] -Tarjan, R. E., ``Depth first search and linear graph algorithm,'' -\fISIAM J. Computing\fP \fB1\fP:2, 146-160, 1972. -.ip [Unix] -Unix Programmer's Manual, ``\fBprof\fR command'', section 1, -Bell Laboratories, Murray Hill, NJ. January 1979. diff --git a/usr.bin/mail/USD.doc/mail0.nr b/usr.bin/mail/USD.doc/mail0.nr deleted file mode 100644 index e569a5f..0000000 --- a/usr.bin/mail/USD.doc/mail0.nr +++ /dev/null @@ -1,72 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail0.nr 8.1 (Berkeley) 6/8/93 -.\" -.\" $FreeBSD$ -.\" -.eh 'USD:7-%''Mail Reference Manual' -.oh 'Mail Reference Manual''USD:7-%' -.if n \ -.nr fs .5v -.\".he 'Mail Reference Manual'\n(mo/\n(dy/\n(yr'%' -.tp -.sp 1.0i -.sz 12 -.rb -.(l C -MAIL REFERENCE MANUAL -.)l -.sz 10 -.sp 2 -.i -.(l C -Kurt Shoens -.)l -.r -.(l C -Revised by -.)l -.(l C -.i -Craig Leres\ \c -.r -and\ \c -.i -Mark Andrews -.)l -.r -.(l C -Version 5.5 - - -.)l -.pn 2 diff --git a/usr.bin/mail/USD.doc/mail1.nr b/usr.bin/mail/USD.doc/mail1.nr deleted file mode 100644 index 50e7883..0000000 --- a/usr.bin/mail/USD.doc/mail1.nr +++ /dev/null @@ -1,92 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail1.nr 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 Introduction -.pp -.i Mail -provides a simple and friendly environment for sending and receiving mail. -It divides incoming mail into -its constituent messages and allows the user to deal with them -in any order. In addition, it provides a set of -.i ed -\c -like commands for manipulating messages and sending mail. -.i Mail -offers the user simple editing capabilities to ease the composition -of outgoing messages, as well as providing the ability to define and send -to names which address groups of users. Finally, -.i Mail -is able to send and receive messages across such networks as the -ARPANET, UUCP, and Berkeley network. -.pp -This document describes how to use the -.i Mail -program to send and receive messages. The reader is not assumed to -be familiar with other message handling systems, but should be -familiar with the \s-2UNIX\s0\** -.(f -\** \s-1UNIX\s0 is a trademark of Bell Laboratories. -.)f -shell, the text editor, and some of the common \s-2UNIX\s0 commands. -.q "The \s-2UNIX\s0 Programmer's Manual," -.q "An Introduction to Csh," -and -.q "Text Editing with Ex and Vi" -can be consulted for more information on these topics. -.pp -Here is how messages are handled: -the mail system accepts incoming -.i messages -for you from other people -and collects them in a file, called your -.i "system mailbox" . -When you login, the system notifies you if there are any messages -waiting in your system mailbox. If you are a -.i csh -user, you will be notified when new mail arrives if you inform -the shell of the location of your mailbox. On version 7 systems, -your system mailbox is located in the directory /var/mail -in a file with your login name. If your login name is -.q sam, -then you can make -.i csh -notify you of new mail by including the following line in your .cshrc -file: -.(l -set mail=/var/mail/sam -.)l -When you read your mail using -.i Mail , -it reads your system mailbox and separates that file into the -individual messages that have been sent to you. You can then -read, reply to, delete, or save these messages. -Each message is marked with its author and the date they sent it. diff --git a/usr.bin/mail/USD.doc/mail2.nr b/usr.bin/mail/USD.doc/mail2.nr deleted file mode 100644 index 0419859..0000000 --- a/usr.bin/mail/USD.doc/mail2.nr +++ /dev/null @@ -1,617 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail2.nr 8.1 (Berkeley) 6/8/93 -.\" -.bp -.sh 1 "Common usage" -.pp -The -.i Mail -command has two distinct usages, according to whether one -wants to send or receive mail. Sending mail is simple: to send a -message to a user whose login name is, say, -\*(lqroot,\*(rq -use the shell -command: -.(l -% Mail root -.)l -then type your message. When you reach the end of the message, type -an EOT (control\-d) at the beginning of a line, which will cause -.i Mail -to echo \*(lqEOT\*(rq and return you to the Shell. When the user you sent mail -to next logs in, he will receive the message: -.(l -You have mail. -.)l -to alert him to the existence of your message. -.pp -If, while you are composing the message -you decide that you do not wish to send it after all, you can -abort the letter with a \s-2RUBOUT\s0. Typing a single \s-2RUBOUT\s0 -causes -.i Mail -to print -.(l -(Interrupt -- one more to kill letter) -.)l -Typing a second -\s-2RUBOUT\s0 causes -.i Mail -to save your partial letter on the file -.q dead.letter -in your home directory and abort the letter. -Once you have -sent mail to someone, there is no way to undo the act, so be -careful. -.pp -The message your recipient reads will consist of the message you -typed, preceded by a line telling who sent the message (your login name) -and the date and time it -was sent. -.pp -If you want to send the same message to several other people, you can list -their login names on the command line. -Thus, -.(l -% Mail sam bob john -Tuition fees are due next Friday. Don't forget!! - -EOT -% -.)l -will send the reminder to sam, bob, and john. -.pp -If, when you log in, you see the message, -.(l -You have mail. -.)l -you can read the mail by typing simply: -.(l -% Mail -.)l -.i Mail -will respond by typing its version number and date and then listing -the messages you have waiting. Then it will type a prompt and await -your command. The messages are assigned numbers starting with 1 \*- you -refer to the messages with these numbers. -.i Mail -keeps track of which messages are -.i new -(have been sent since you last read your mail) and -.i read -(have been read by you). New messages have an -.b N -next to them in the header listing and old, but unread messages have -a -.b U -next to them. -.i Mail -keeps track of new/old and read/unread messages by putting a -header field called -.q Status -into your messages. -.pp -To look at a specific message, use the -.b type -command, which may be abbreviated to simply -.b t . -For example, if you had the following messages: -.(l -N 1 root Wed Sep 21 09:21 "Tuition fees" -N 2 sam Tue Sep 20 22:55 -.)l -you could examine the first message by giving the command: -.(l -type 1 -.)l -which might cause -.i Mail -to respond with, for example: -.(l -Message 1: -From root Wed Sep 21 09:21:45 1978 -Subject: Tuition fees -Status: R - -Tuition fees are due next Wednesday. Don't forget!! - -.)l -Many -.i Mail -commands that operate on messages take a message number as an -argument like the -.b type -command. For these commands, there is a notion of a current -message. When you enter the -.i Mail -program, the current message is initially the first one. Thus, -you can often omit the message number and use, for example, -.(l -t -.)l -to type the current message. As a further shorthand, you can type a message -by simply giving its message number. Hence, -.(l -1 -.)l -would type the first message. -.pp -Frequently, it is useful to read the messages in your mailbox in order, -one after another. You can read the next message in -.i Mail -by simply typing a newline. As a special case, you can type a newline -as your first command to -.i Mail -to type the first message. -.pp -If, after typing a message, you wish to immediately send a reply, -you can do so with the -.b reply -command. -.b Reply , -like -.b type , -takes a message number as an argument. -.i Mail -then begins a message addressed to the user who sent you the message. -You may then type in your letter in reply, followed by a -at the beginning of a line, as before. -.i Mail -will type EOT, then type the ampersand prompt to indicate its readiness -to accept another command. In our example, if, after typing the -first message, you wished to reply to it, you might give the command: -.(l -reply -.)l -.i Mail -responds by typing: -.(l -To: root -Subject: Re: Tuition fees -.)l -and waiting for you to enter your letter. -You are now in the message collection mode described at the beginning -of this section and -.i Mail -will gather up your message up to a control\-d. -Note that it copies the subject -header from the original message. This is useful in that correspondence -about a particular matter will tend to retain the same subject heading, -making it easy to recognize. If there are other header fields in -the message, the information found will also be used. -For example, if the letter had a -.q "To:" -header listing several recipients, -.i Mail -would arrange to send your replay to the same people as well. -Similarly, if the original message contained a -.q "Cc:" -(carbon copies to) field, -.i Mail -would send your reply to -.i those -users, too. -.i Mail -is careful, though, not too send the message to -.i you , -even if you appear in the -.q "To:" -or -.q "Cc:" -field, unless you ask to be included explicitly. See section 4 for more -details. -.pp -After typing in your letter, the dialog with -.i Mail -might look like the following: -.(l -reply -To: root -Subject: Tuition fees - -Thanks for the reminder -EOT -& -.)l -.pp -The -.b reply -command is especially useful for sustaining extended conversations -over the message system, with other -.q listening -users receiving copies of the conversation. The -.b reply -command can be abbreviated to -.b r . -.pp -Sometimes you will receive a message that has been sent to -several people and wish to reply -.i only -to the person who sent it. -.b Reply -with a capital -.b R -replies to a message, but sends a copy to the sender only. -.pp -If you wish, while reading your mail, to send a message to someone, -but not as a reply to one of your messages, you can send the message -directly with the -.b mail -command, which takes as arguments the names of the recipients you wish -to send to. For example, to send a message to -.q frank, -you would do: -.(l -mail frank -This is to confirm our meeting next Friday at 4. -EOT -& -.)l -The -.b mail -command can be abbreviated to -.b m . -.pp -Normally, each message you receive is saved in the file -.i mbox -in your login directory at the time you leave -.i Mail . -Often, -however, you will not want to save a particular message you -have received because it is only of passing interest. To avoid -saving a message in -.i mbox -you can delete it using the -.b delete -command. In our example, -.(l -delete 1 -.)l -will prevent -.i Mail -from saving message 1 (from root) in -.i mbox . -In addition to not saving deleted messages, -.i Mail -will not let -you type them, either. The effect is to make the message disappear -altogether, along with its number. The -.b delete -command can be abbreviated to simply -.b d . -.pp -Many features of -.i Mail -can be tailored to your liking with the -.b set -command. The -.b set -command has two forms, depending on whether you are setting -a -.i binary -option or a -.i valued -option. -Binary options are either on or off. For example, the -.q ask -option informs -.i Mail -that each time you send a message, you want it to prompt you for -a subject header, to be included in the message. -To set the -.q ask -option, you would type -.(l -set ask -.)l -.pp -Another useful -.i Mail -option is -.q hold. -Unless told otherwise, -.i Mail -moves the messages from your system mailbox to the file -.i mbox -in your home directory when you leave -.i Mail . -If you want -.i Mail -to keep your letters in the system mailbox instead, you can set the -.q hold -option. -.pp -Valued options are values which -.i Mail -uses to adapt to your tastes. For example, the -.q SHELL -option tells -.i Mail -which shell you like to use, and is specified by -.(l -set SHELL=/bin/csh -.)l -for example. Note that no spaces are allowed in -.q "SHELL=/bin/csh." -A complete list of the -.i Mail -options appears in section 5. -.pp -Another important valued option is -.q crt. -If you use a fast video terminal, you will find that when you -print long messages, they fly by too quickly for you to read them. -With the -.q crt -option, you can make -.i Mail -print any message larger than a given number of lines by sending -it through a paging program. This program is specified by the -valued option \fBPAGER\fP. -If \fBPAGER\fP is not set, a default paginator is used. -For example, most CRT users with 24-line screens should do: -.(l -set crt=24 -.)l -to paginate messages that will not fit on their screens. -In the default state, \fImore\fP (default paginator) prints a screenful of -information, then types --More--. Type a space to see the next screenful. -.pp -Another adaptation to user needs that -.i Mail -provides is that of -.i aliases . -An alias is simply a name which stands for one or more -real user names. -.i Mail -sent to an alias is really sent to the list of real users -associated with it. For example, an alias can be defined for the -members of a project, so that you can send mail to the whole project -by sending mail to just a single name. The -.b alias -command in -.i Mail -defines an alias. Suppose that the users in a project are -named Sam, Sally, Steve, and Susan. To define an alias called -.q project -for them, you would use the -.i Mail -command: -.(l -alias project sam sally steve susan -.)l -The -.b alias -command can also be used to provide a convenient name for someone -whose user name is inconvenient. For example, if a user named -.q "Bob Anderson" -had the login name -.q anderson," -you might want to use: -.(l -alias bob anderson -.)l -so that you could send mail to the shorter name, -.q bob. -.pp -While the -.b alias -and -.b set -commands allow you to customize -.i Mail , -they have the drawback that they must be retyped each time you enter -.i Mail . -To make them more convenient to use, -.i Mail -always looks for two files when it is invoked. It first reads -a system wide file -.q /etc/mail.rc, -then a user specific file, -.q .mailrc, -which is found in the user's home directory. -The system wide file -is maintained by the system administrator and -contains -.b set -commands that are applicable to all users of the system. -The -.q .mailrc -file is usually used by each user to set options the way he likes -and define individual aliases. -For example, my .mailrc file looks like this: -.(l -set ask nosave SHELL=/bin/csh -.)l -As you can see, it is possible to set many options in the -same -.b set -command. The -.q nosave -option is described in section 5. -.pp -Mail aliasing is implemented -at the system-wide level -by the mail delivery -system -.i sendmail . -These aliases are stored in the file /usr/lib/aliases and are -accessible to all users of the system. -The lines in /usr/lib/aliases are of -the form: -.(l -alias: name\*<1\*>, name\*<2\*>, name\*<3\*> -.)l -where -.i alias -is the mailing list name and the -.i name\* -are the members of the list. Long lists can be continued onto the next -line by starting the next line with a space or tab. Remember that you -must execute the shell command -.i newaliases -after editing /usr/lib/aliases since the delivery system -uses an indexed file created by -.i newaliases . -.pp -We have seen that -.i Mail -can be invoked with command line arguments which are people -to send the message to, or with no arguments to read mail. -Specifying the -.rb \-f -flag on the command line causes -.i Mail -to read messages from a file other than your system mailbox. -For example, if you have a collection of messages in -the file -.q letters -you can use -.i Mail -to read them with: -.(l -% Mail \-f letters -.)l -You can use all -the -.i Mail -commands described in this document to examine, modify, or delete -messages from your -.q letters -file, which will be rewritten when you leave -.i Mail -with the -.b quit -command described below. -.pp -Since mail that you read is saved in the file -.i mbox -in your home directory by default, you can read -.i mbox -in your home directory by using simply -.(l -% Mail \-f -.)l -.pp -Normally, messages that you examine using the -.b type -command are saved in the file -.q mbox -in your home directory if you leave -.i Mail -with the -.b quit -command described below. -If you wish to retain a message in your system mailbox -you can use the -.b preserve -command to tell -.i Mail -to leave it there. -The -.b preserve -command accepts a list of message numbers, just like -.b type -and may be abbreviated to -.b pre . -.pp -Messages in your system mailbox that you do not examine are -normally retained in your system mailbox automatically. -If you wish to have such a message saved in -.i mbox -without reading it, you may use the -.b mbox -command to have them so saved. For example, -.(l -mbox 2 -.)l -in our example would cause the second message (from sam) -to be saved in -.i mbox -when the -.b quit -command is executed. -.b Mbox -is also the way to direct messages to your -.i mbox -file if you have set the -.q hold -option described above. -.b Mbox -can be abbreviated to -.b mb . -.pp -When you have perused all the messages of interest, you can leave -.i Mail -with the -.b quit -command, which saves the messages you have typed but not -deleted in the file -.i mbox -in your login directory. Deleted messages are discarded irretrievably, -and messages left untouched are preserved in your system mailbox so -that you will see them the next time you type: -.(l -% Mail -.)l -The -.b quit -command can be abbreviated to simply -.b q . -.pp -If you wish for some reason to leave -.i Mail -quickly without altering either your system mailbox or -.i mbox , -you can type the -.b x -command (short for -.b exit ), -which will immediately return you to the Shell without changing anything. -.pp -If, instead, you want to execute a Shell command without leaving -.i Mail , -you -can type the command preceded by an exclamation point, just as in the -text editor. Thus, for instance: -.(l -!date -.)l -will print the current date without leaving -.i Mail . -.pp -Finally, the -.b help -command is available to print out a brief summary of the -.i Mail -commands, using only the single character command abbreviations. diff --git a/usr.bin/mail/USD.doc/mail3.nr b/usr.bin/mail/USD.doc/mail3.nr deleted file mode 100644 index 8b133ef..0000000 --- a/usr.bin/mail/USD.doc/mail3.nr +++ /dev/null @@ -1,133 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail3.nr 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "Maintaining folders" -.pp -.i Mail -includes a simple facility for maintaining groups of messages together -in folders. This section describes this facility. -.pp -To use the folder facility, you must tell -.i Mail -where you wish to keep your folders. Each folder of messages will -be a single file. For convenience, all of your folders are kept in -a single directory of your choosing. To tell -.i Mail -where your folder directory is, put a line of the form -.(l -set folder=letters -.)l -in your -.i .mailrc -file. If, as in the example above, your folder directory does not -begin with a `/,' -.i Mail -will assume that your folder directory is to be found starting from -your home directory. Thus, if your home directory is -.b /home/person -the above example told -.i Mail -to find your folder directory in -.b /home/person/letters . -.pp -Anywhere a file name is expected, you can use a folder name, preceded -with `+.' For example, to put a message into a folder with the -.b save -command, you can use: -.(l -save +classwork -.)l -to save the current message in the -.i classwork -folder. If the -.i classwork -folder does not yet exist, it will be created. Note that messages -which are saved with the -.b save -command are automatically removed from your system mailbox. -.pp -In order to make a copy of a message in a folder without causing -that message to be removed from your system mailbox, use the -.b copy -command, which is identical in all other respects to the -.b save -command. For example, -.(l -copy +classwork -.)l -copies the current message into the -.i classwork -folder and leaves a copy in your system mailbox. -.pp -The -.b folder -command -can be used to direct -.i Mail -to the contents of a different folder. -For example, -.(l -folder +classwork -.)l -directs -.i Mail -to read the contents of the -.i classwork -folder. All of the commands that you can use on your system -mailbox are also applicable to folders, including -.b type , -.b delete , -and -.b reply . -To inquire which folder you are currently editing, use simply: -.(l -folder -.)l -.pp -To list your current set of folders, use the -.b folders -command. -.pp -To start -.i Mail -reading one of your folders, you can use the -.b \-f -option described in section 2. For example: -.(l -% Mail \-f +classwork -.)l -will cause -.i Mail -to read your -.i classwork -folder without looking at your system mailbox. diff --git a/usr.bin/mail/USD.doc/mail4.nr b/usr.bin/mail/USD.doc/mail4.nr deleted file mode 100644 index 1a1e046..0000000 --- a/usr.bin/mail/USD.doc/mail4.nr +++ /dev/null @@ -1,437 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail4.nr 8.1 (Berkeley) 6/8/93 -.\" -.bp -.sh 1 "More about sending mail" -.sh 2 "Tilde escapes" -.pp -While typing in a message to be sent to others, it is often -useful to be able to invoke the text editor on the partial message, -print the message, execute a shell command, or do some other -auxiliary function. -.i Mail -provides these capabilities through -.i "tilde escapes" , -which consist of a tilde (~) at the beginning of a line, followed by -a single character which indicates the function to be performed. For -example, to print the text of the message so far, use: -.(l -~p -.)l -which will print a line of dashes, the recipients of your message, and -the text of the message so far. -Since -.i Mail -requires two consecutive \s-2RUBOUT\s0's to abort a letter, you -can use a single \s-2RUBOUT\s0 to abort the output of ~p or any other -~ escape without killing your letter. -.pp -If you are dissatisfied with the message as -it stands, you can invoke the text editor on it using the escape -.(l -~e -.)l -which causes the message to be copied into a temporary file and an -instance of the editor to be spawned. After modifying the message to -your satisfaction, write it out and quit the editor. -.i Mail -will respond -by typing -.(l -(continue) -.)l -after which you may continue typing text which will be appended to your -message, or type to end the message. -A standard text editor is provided by -.i Mail . -You can override this default by setting the valued option -.q EDITOR -to something else. For example, you might prefer: -.(l -set EDITOR=/usr/bin/ex -.)l -.pp -Many systems offer a screen editor as an alternative to the standard -text editor, such as the -.i vi -editor from UC Berkeley. -To use the screen, or -.i visual -editor, on your current message, you can use the escape, -.(l -~v -.)l -~v works like ~e, except that the screen editor is invoked instead. -A default screen editor is defined by -.i Mail . -If it does not suit you, you can set the valued option -.q VISUAL -to the path name of a different editor. -.pp -It is often useful to be able to include the contents of some -file in your message; the escape -.(l -~r filename -.)l -is provided for this purpose, and causes the named file to be appended -to your current message. -.i Mail -complains if the file doesn't exist -or can't be read. If the read is successful, the number of lines and -characters appended to your message is printed, after which you may continue -appending text. The filename may contain shell metacharacters like * and ? -which are expanded according to the conventions of your shell. -.pp -As a special case of ~r, the escape -.(l -~d -.)l -reads in the file -.q dead.letter -in your home directory. This is often useful since -.i Mail -copies the text -of your message there when you abort a message with \s-2RUBOUT\s0. -.pp -To save the current text of your message on a file you may use the -.(l -~w filename -.)l -escape. -.i Mail -will print out the number of lines and characters written -to the file, after which you may continue appending text to your message. -Shell metacharacters may be used in the filename, as in ~r and are expanded -with the conventions of your shell. -.pp -If you are sending mail from within -.i Mail's -command mode -you can read a message sent to you into the message -you are constructing with the escape: -.(l -~m 4 -.)l -which will read message 4 into the current message, shifted right by -one tab stop. You can name any non-deleted message, or list of messages. -Messages can also be forwarded without shifting by a tab stop with ~f. -This is the usual way to forward a message. -.pp -If, in the process of composing a message, you decide to add additional -people to the list of message recipients, you can do so with the escape -.(l -~t name1 name2 ... -.)l -You may name as few or many additional recipients as you wish. Note -that the users originally on the recipient list will still receive -the message; you cannot remove someone from the recipient -list with ~t. -.pp -If you wish, you can associate a subject with your message by using the -escape -.(l -~s Arbitrary string of text -.)l -which replaces any previous subject with -.q "Arbitrary string of text." -The subject, if given, is sent near the -top of the message prefixed with -.q "Subject:" -You can see what the message will look like by using ~p. -.pp -For political reasons, one occasionally prefers to list certain -people as recipients of carbon copies of a message rather than -direct recipients. The escape -.(l -~c name1 name2 ... -.)l -adds the named people to the -.q "Cc:" -list, similar to ~t. -Again, you can execute ~p to see what the message will look like. -.pp -The escape -.(l -~b name1 name2 ... -.)l -adds the named people to the -.q "Cc:" -list, but does not make the names visible in the -.q "Cc:" -line ("blind" carbon copy). -.pp -The recipients of the message together constitute the -.q "To:" -field, the subject the -.q "Subject:" -field, and the carbon copies the -.q "Cc:" -field. If you wish to edit these in ways impossible with the ~t, ~s, ~c -and ~b escapes, you can use the escape -.(l -~h -.)l -which prints -.q "To:" -followed by the current list of recipients and leaves the cursor -(or printhead) at the end of the line. If you type in ordinary -characters, they are appended to the end of the current list of -recipients. You can also use your erase character to erase back into -the list of recipients, or your kill character to erase them altogether. -Thus, for example, if your erase and kill characters are the standard -(on printing terminals) # and @ symbols, -.(l -~h -To: root kurt####bill -.)l -would change the initial recipients -.q "root kurt" -to -.q "root bill." -When you type a newline, -.i Mail -advances to the -.q "Subject:" -field, where the same rules apply. Another newline brings you to -the -.q "Cc:" -field, which may be edited in the same fashion. Another newline -brings you to the -.q "Bcc:" -("blind" carbon copy) field, which follows the same rules as the "Cc:" -field. Another newline -leaves you appending text to the end of your message. You can use -~p to print the current text of the header fields and the body -of the message. -.pp -To effect a temporary escape to the shell, the escape -.(l -~!command -.)l -is used, which executes -.i command -and returns you to mailing mode without altering the text of -your message. If you wish, instead, to filter the body of your -message through a shell command, then you can use -.(l -~|command -.)l -which pipes your message through the command and uses the output -as the new text of your message. If the command produces no output, -.i Mail -assumes that something is amiss and retains the old version -of your message. A frequently-used filter is the command -.i fmt , -designed to format outgoing mail. -.pp -To effect a temporary escape to -.i Mail -command mode instead, you can use the -.(l -~:\fIMail command\fP -.)l -escape. This is especially useful for retyping the message you are -replying to, using, for example: -.(l -~:t -.)l -It is also useful for setting options and modifying aliases. -.pp -If you wish abort the current message, you can use the escape -.(l -~q -.)l -This will terminate the current message and return you to the -shell (or \fIMail\fP if you were using the \fBmail\fP command). -If the \fBsave\fP option is set, the message will be copied -to the file -.q dead.letter -in your home directory. -.pp -If you wish (for some reason) to send a message that contains -a line beginning with a tilde, you must double it. Thus, for example, -.(l -~~This line begins with a tilde. -.)l -sends the line -.(l -~This line begins with a tilde. -.)l -.pp -Finally, the escape -.(l -~? -.)l -prints out a brief summary of the available tilde escapes. -.pp -On some terminals (particularly ones with no lower case) -tilde's are difficult to type. -.i Mail -allows you to change the escape character with the -.q escape -option. For example, I set -.(l -set escape=] -.)l -and use a right bracket instead of a tilde. If I ever need to -send a line beginning with right bracket, I double it, just as for ~. -Changing the escape character removes the special meaning of ~. -.sh 2 "Network access" -.pp -This section describes how to send mail to people on other machines. -Recall that sending to a plain login name sends mail to that person -on your machine. If your machine is directly (or sometimes, even, -indirectly) connected to the Arpanet, you can send messages to people -on the Arpanet using a name of the form -.(l -name@host.domain -.)l -where -.i name -is the login name of the person you're trying to reach, -.i host -is the name of the machine on the Arpanet, -and -.i domain -is the higher-level scope within which the hostname is known, e.g. EDU (for educational -institutions), COM (for commercial entities), GOV (for governmental agencies), -ARPA for many other things, BITNET or CSNET for those networks. -.pp -If your recipient logs in on a machine connected to yours by -UUCP (the Bell Laboratories supplied network that communicates -over telephone lines), sending mail can be a bit more complicated. -You must know the list of machines through which your message must -travel to arrive at his site. So, if his machine is directly connected -to yours, you can send mail to him using the syntax: -.(l -host!name -.)l -where, again, -.i host -is the name of the machine and -.i name -is the login name. -If your message must go through an intermediary machine first, you -must use the syntax: -.(l -intermediary!host!name -.)l -and so on. It is actually a feature of UUCP that the map of all -the systems in the network is not known anywhere (except where people -decide to write it down for convenience). Talk to your system administrator -about good ways to get places; the -.i uuname -command will tell you systems whose names are recognized, but not which -ones are frequently called or well-connected. -.pp -When you use the -.b reply -command to respond to a letter, there is a problem of figuring out the -names of the users in the -.q "To:" -and -.q "Cc:" -lists -.i "relative to the current machine" . -If the original letter was sent to you by someone on the local machine, -then this problem does not exist, but if the message came from a remote -machine, the problem must be dealt with. -.i Mail -uses a heuristic to build the correct name for each user relative -to the local machine. So, when you -.b reply -to remote mail, the names in the -.q "To:" -and -.q "Cc:" -lists may change somewhat. -.sh 2 "Special recipients" -.pp -As described previously, you can send mail to either user names or -.b alias -names. It is also possible to send messages directly to files or to -programs, using special conventions. If a recipient name has a -`/' in it or begins with a `+', it is assumed to be the -path name of a file into which -to send the message. If the file already exists, the message is -appended to the end of the file. If you want to name a file in -your current directory (ie, one for which a `/' would not usually -be needed) you can precede the name with `./' -So, to send mail to the file -.q memo -in the current directory, you can give the command: -.(l -% Mail ./memo -.)l -If the name begins with a `+,' it is expanded into the full path name -of the folder name in your folder directory. -This ability to send mail to files can be used for a variety of -purposes, such as maintaining a journal and keeping a record of -mail sent to a certain group of users. The second example can be -done automatically by including the full pathname of the record -file in the -.b alias -command for the group. Using our previous -.b alias -example, you might give the command: -.(l -alias project sam sally steve susan /usr/project/mail_record -.)l -Then, all mail sent to "project" would be saved on the file -.q /usr/project/mail_record -as well as being sent to the members of the project. This file -can be examined using -.i "Mail \-f" . -.pp -It is sometimes useful to send mail directly to a program, for -example one might write a project billboard program and want to access -it using -.i Mail . -To send messages to the billboard program, one can send mail -to the special name `|billboard' for example. -.i Mail -treats recipient names that begin with a `|' as a program to send -the mail to. An -.b alias -can be set up to reference a `|' prefaced name if desired. -.i Caveats : -the shell treats `|' specially, so it must be quoted on the command -line. Also, the `| program' must be presented as a single argument to -mail. The safest course is to surround the entire name with double -quotes. This also applies to usage in the -.b alias -command. For example, if we wanted to alias `rmsgs' to `rmsgs \-s' -we would need to say: -.(l -alias rmsgs "| rmsgs -s" -.)l diff --git a/usr.bin/mail/USD.doc/mail5.nr b/usr.bin/mail/USD.doc/mail5.nr deleted file mode 100644 index 10e707c..0000000 --- a/usr.bin/mail/USD.doc/mail5.nr +++ /dev/null @@ -1,1042 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail5.nr 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.bp -.sh 1 "Additional features" -.pp -This section describes some additional commands useful for -reading your mail, setting options, and handling lists of messages. -.sh 2 "Message lists" -.pp -Several -.i Mail -commands accept a list of messages as an argument. -Along with -.b type -and -.b delete , -described in section 2, -there is the -.b from -command, which prints the message headers associated with the -message list passed to it. -The -.b from -command is particularly useful in conjunction with some of the -message list features described below. -.pp -A -.i "message list" -consists of a list of message numbers, ranges, and names, -separated by spaces or tabs. Message numbers may be either -decimal numbers, which directly specify messages, or one of the -special characters -.q \(ua -.q "." -or -.q "$" -to specify the first relevant, current, or last -relevant message, respectively. -.i Relevant -here means, for most commands -.q "not deleted" -and -.q "deleted" -for the -.b undelete -command. -.pp -A range of messages consists of two message numbers (of the form -described in the previous paragraph) separated by a dash. -Thus, to print the first four messages, use -.(l -type 1\-4 -.)l -and to print all the messages from the current message to the last -message, use -.(l -type .\-$ -.)l -.pp -A -.i name -is a user name. The user names given in the message list are -collected together and each message selected by other means -is checked to make sure it was sent by one of the named users. -If the message consists entirely of user names, then every -message sent by one of those users that is -.i relevant -(in the sense described earlier) -is selected. Thus, to print every message sent to you by -.q root, -do -.(l -type root -.)l -.pp -As a shorthand notation, you can specify simply -.q * -to get every -.i relevant -(same sense) -message. Thus, -.(l -type * -.)l -prints all undeleted messages, -.(l -delete * -.)l -deletes all undeleted messages, and -.(l -undelete * -.)l -undeletes all deleted messages. -.pp -You can search for the presence of a word in subject lines with -.b / . -For example, to print the headers of all messages that contain the -word -.q PASCAL, -do: -.(l -from /pascal -.)l -Note that subject searching ignores upper/lower case differences. -.sh 2 "List of commands" -.pp -This section describes all the -.i Mail -commands available when -receiving mail. -.ip "\fB\-\fP\ \ " -The -.rb \- -command goes to the previous message and prints it. The -.rb \- -command may be given a decimal number -.i n -as an argument, in which case the -.i n th -previous message is gone to and printed. -.ip "\fB?\fP\ \ " -Prints a brief summary of commands. -.ip "\fB!\fP\ \ " -Used to preface a command to be executed by the shell. -.ip "\fBPrint\fP\ \ " -Like -.b print , -but also print out ignored header fields. See also -\fBprint\fP, \fBignore\fP and \fBretain\fP. -\fBPrint\fP can be abbreviated to \fBP\fP. -.ip "\fBReply\fP or \fBRespond\fP\ \ " -Note the capital \fBR\fP in the name. -Frame a reply to a one or more messages. -The reply (or replies if you are using this on multiple messages) -will be sent ONLY to the person who sent you the message -(respectively, the set of people who sent the messages you are -replying to). -You can -add people using the \fB~t\fP, \fB~c\fP and \fB~b\fP -tilde escapes. The subject in your reply is formed by prefacing the -subject in the original message with -.q "Re:" -unless it already began thus. -If the original message included a -.q "reply-to" -header field, the reply will go -.i only -to the recipient named by -.q "reply-to." -You type in your message using the same conventions available to you -through the -.b mail -command. -The -.b Reply -command is especially useful for replying to messages that were sent -to enormous distribution groups when you really just want to -send a message to the originator. Use it often. -\fBReply\fP (and \fBRespond\fP) can be abbreviated to \fBR\fP. -.ip "\fBType\fP\ \ " -Identical to the -.b Print -command. -\fBType\fP can be abbreviated to \fBT\fP. -.ip "\fBalias\fP\ \ " -Define a name to stand for a set of other names. -This is used when you want to send messages to a certain -group of people and want to avoid retyping their names. -For example -.(l -alias project john sue willie kathryn -.)l -creates an alias -.i project -which expands to the four people John, Sue, Willie, and Kathryn. -If no arguments are given, all currently-defined aliases are printed. -If one argument is given, that alias is printed (if it exists). -\fBAlias\fP can be abbreviated to \fBa\fP. -.ip "\fBalternates\fP\ \ " -If you have accounts on several machines, you may find it convenient -to use the /usr/lib/aliases on all the machines except one to direct -your mail to a single account. -The -.b alternates -command is used to inform -.i Mail -that each of these other addresses is really -.i you . -.i Alternates -takes a list of user names and remembers that they are all actually you. -When you -.b reply -to messages that were sent to one of these alternate names, -.i Mail -will not bother to send a copy of the message to this other address (which -would simply be directed back to you by the alias mechanism). -If -.i alternates -is given no argument, it lists the current set of alternate names. -.b Alternates -is usually used in the .mailrc file. -\fBAlternates\fP can be abbreviated to \fBalt\fP. -.ip "\fBchdir\fP\ \ " -The -.b chdir -command allows you to change your current directory. -.b Chdir -takes a single argument, which is taken to be the pathname of -the directory to change to. If no argument is given, -.b chdir -changes to your home directory. -\fBChdir\fP can be abbreviated to \fBc\fP. -.ip "\fBcopy\fP\ \ " -The -.b copy -command does the same thing that -.b save -does, except that it does not mark the messages it is used on -for deletion when you quit. -\fBCopy\fP can be abbreviated to \fBco\fP. -.ip "\fBdelete\fP\ \ " -Deletes a list of messages. Deleted messages can be reclaimed -with the -.b undelete -command. -\fBDelete\fP can be abbreviated to \fBd\fP. -.ip "\fBdp\fP or \fBdt\fP\ \ " -These -commands delete the current message and print the next message. -They are useful for quickly reading and disposing of mail. -If there is no next message, \fImail\fP says ``at EOF.'' -.ip "\fBedit\fP\ \ " -To edit individual messages using the text editor, the -.b edit -command is provided. The -.b edit -command takes a list of messages as described under the -.b type -command and processes each by writing it into the file -Message\c -.i x -where -.i x -is the message number being edited and executing the text editor on it. -When you have edited the message to your satisfaction, write the message -out and quit, upon which -.i Mail -will read the message back and remove the file. -.b Edit -can be abbreviated to -.b e . -.ip "\fBelse\fP\ \ " -Marks the end of the then-part of an -.b if -statement and the beginning of the -part to take effect if the condition of the -.b if -statement is false. -.ip "\fBendif\fP\ \ " -Marks the end of an -.b if -statement. -.ip "\fBexit\fP or \fBxit\fP\ \ " -Leave -.i Mail -without updating the system mailbox or the file your were reading. -Thus, if you accidentally delete several messages, you can use -.b exit -to avoid scrambling your mailbox. -\fBExit\fP can be abbreviated to \fBex\fP or \fBx\fP. -.ip "\fBfile\fP\ \ " -The same as -.b folder . -\fBFile\fP can be abbreviated to \fBfi\fP. -.ip "\fBfolders\fP\ \ " -List the names of the folders in your folder directory. -.ip "\fBfolder\fP\ \ " -The -.b folder -command switches to a new mail file or folder. With no arguments, it -tells you which file you are currently reading. If you give -it an argument, it will write out changes (such as deletions) -you have made in the current file and read the new file. -Some special conventions are recognized for the name: -.(b -.TS -center; -c c -l a. -Name Meaning -_ -# Previous file read -% Your system mailbox -%name \fIName\fP's system mailbox -& Your ~/mbox file -+folder A file in your folder directory -.TE -.)b -\fBFolder\fP can be abbreviated to \fBfo\fP. -.ip "\fBfrom\fP\ \ " -The -.b from -command takes a list of messages and prints out the header lines for each one; -hence -.(l -from joe -.)l -is the easy way to display all the message headers from \*(lqjoe.\*(rq -\fBFrom\fP can be abbreviated to \fBf\fP. -.ip "\fBheaders\fP\ \ " -When you start up -.i Mail -to read your mail, it lists the message headers that you have. -These headers tell you who each message is from, when they were -received, how many lines and characters each message is, and the -.q "Subject:" -header field of each message, if present. In addition, -.i Mail -tags the message header of each message that has been the object -of the -.b preserve -command with a -.q P. -Messages that have been -.b saved -or -.b written -are flagged with a -.q *. -Finally, -.b deleted -messages are not printed at all. If you wish to reprint the current -list of message headers, you can do so with the -.b headers -command. The -.b headers -command (and thus the initial header listing) -only lists the first so many message headers. -The number of headers listed depends on the speed of your -terminal. -This can be overridden by specifying the number of headers you -want with the -.i window -option. -.i Mail -maintains a notion of the current -.q window -into your messages for the purposes of printing headers. -Use the -.b z -command to move forward and back a window. -You can move -.i Mail's -notion of the current window directly to a particular message by -using, for example, -.(l -headers 40 -.)l -to move -.i Mail's -attention to the messages around message 40. -If a ``+'' argument is given, then the next screenful of message headers is -printed, and if a ``\-'' argument is given, the previous screenful of message -headers is printed. -\fBHeaders\fP can be abbreviated to \fBh\fP. -.ip "\fBhelp\fP\ \ " -Print a brief and usually out of date help message about the commands -in -.i Mail . -The -.i man -page for -.i mail -is usually more up-to-date than either the help message or this manual. -It is also a synonym for \fB?\fP. -.ip "\fBhold\fP\ \ " -Arrange to hold a list of messages in the system mailbox, instead -of moving them to the file -.i mbox -in your home directory. If you set the binary option -.i hold , -this will happen by default. -It does not override the \fBdelete\fP command. -\fBHold\fP can be abbreviated to \fBho\fP. -.ip "\fBif\fP\ \ " -Commands in your -.q .mailrc -file can be executed conditionally depending on whether you are -sending or receiving mail with the -.b if -command. For example, you can do: -.(l -if receive - \fIcommands\fP... -endif -.)l -An -.b else -form is also available: -.(l -if send - \fIcommands\fP... -else - \fIcommands\fP... -endif -.)l -Note that the only allowed conditions are -.b receive -and -.b send . -.ip "\fBignore\fP \ \ " -.b N.B.: -.i Ignore -has been superseded by -.i retain. -.br -Add the list of header fields named to the -.i "ignore list" . -Header fields in the ignore list are not printed on your -terminal when you print a message. This allows you to suppress -printing of certain machine-generated header fields, such as -.i Via -which are not usually of interest. The -.b Type -and -.b Print -commands can be used to print a message in its entirety, including -ignored fields. -If -.b ignore -is executed with no arguments, it lists the current set of ignored fields. -.ip "\fBlist\fP\ \ " -List the valid -.i Mail -commands. -\fBList\fP can be abbreviated to \fBl\fP. -.\".ip \fBlocal\fP -.\"Define a list of local names for this host. This command is useful -.\"when the host is known by more than one name. Names in the list -.\"may be qualified be the domain of the host. The first name on the local -.\"list is the -.\".i distinguished -.\"name of the host. -.\"The names on the local list are used by -.\".i Mail -.\"to decide which addresses are local to the host. -.\"For example: -.\".(l -.\"local ucbarpa.BERKELEY.ARPA arpa.BERKELEY.ARPA \\ -.\" arpavax.BERKELEY.ARPA r.BERKELEY.ARPA \\ -.\" ucb-arpa.ARPA -.\".)l -.\"From this list we see that -.\".i "fred@ucbarpa.BERKELEY.ARPA", -.\".i "harold@arpa.BERKELEY", -.\"and -.\".i "larry@r" -.\"are all addresses of users on the local host. -.\"The -.\".b local -.\"command is usually not used be general users since it is designed for -.\"local configuration; it is usually found in the file /etc/mail.rc. -.ip "\fBmail\fP\ \ " -Send mail to one or more people. If you have the -.i ask -option set, -.i Mail -will prompt you for a subject to your message. Then you -can type in your message, using tilde escapes as described in -section 4 to edit, print, or modify your message. To signal your -satisfaction with the message and send it, type control-d at the -beginning of a line, or a . alone on a line if you set the option -.i dot . -To abort the message, type two interrupt characters (\s-2RUBOUT\s0 -by default) in a row or use the -.b ~q -escape. -The \fBmail\fP command can be abbreviated to \fBm\fP. -.ip "\fBmbox\fP\ \ " -Indicate that a list of messages be sent to -.i mbox -in your home directory when you quit. This is the default -action for messages if you do -.i not -have the -.i hold -option set. -.ip "\fBnext\fP or \fB+\fP\ \ " -The -.b next -command goes to the next message and types it. If given a message list, -.b next -goes to the first such message and types it. Thus, -.(l -next root -.)l -goes to the next message sent by -.q root -and types it. The -.b next -command can be abbreviated to simply a newline, which means that one -can go to and type a message by simply giving its message number or -one of the magic characters -.q "^" -.q "." -or -.q "$". -Thus, -.(l -\&. -.)l -prints the current message and -.(l -4 -.)l -prints message 4, as described previously. -\fBNext\fP can be abbreviated to \fBn\fP. -.ip "\fBpreserve\fP\ \ " -Same as -.b hold . -Cause a list of messages to be held in your system mailbox when you quit. -\fBPreserve\fP can be abbreviated to \fBpre\fP. -.ip "\fBprint\fP\ \ " -Print the specified messages. If the -.b crt -variable is set, messages longer than the number of lines it indicates -are paged through the command specified by the \fBPAGER\fP variable. -The \fBprint\fP command can be abbreviated to \fBp\fP. -.ip "\fBquit\fP\ \ " -Terminates the session, saving all undeleted, unsaved and unwritten messages -in the user's \fImbox\fP file in their login directory -(messages marked as having been read), preserving all -messages marked with \fBhold\fP or \fBpreserve\fP or never referenced -in their system mailbox. -Any messages that were deleted, saved, written or saved to \fImbox\fP are -removed from their system mailbox. -If new mail has arrived during the session, the message -``You have new mail'' is given. If given while editing a mailbox file -with the \fB\-f\fP flag, then the edit file is rewritten. -A return to the Shell is effected, unless the rewrite of edit file fails, -in which case the user can escape with the \fBexit\fP command. -\fBQuit\fP can be abbreviated to \fBq\fP. -.ip "\fBreply\fP or \fBrespond\fP\ \ " -Frame a reply to a single message. -The reply will be sent to the -person who sent you the message (to which you are replying), plus all -the people who received the original message, except you. You can -add people using the \fB~t\fP, \fB~c\fP and \fB~b\fP -tilde escapes. The subject in your reply is formed by prefacing the -subject in the original message with -.q "Re:" -unless it already began thus. -If the original message included a -.q "reply-to" -header field, the reply will go -.i only -to the recipient named by -.q "reply-to." -You type in your message using the same conventions available to you -through the -.b mail -command. -The \fBreply\fP (and \fBrespond\fP) command can be abbreviated to \fBr\fP. -.ip "\fBretain\fP\ \ " -Add the list of header fields named to the \fIretained list\fP. -Only the header fields in the retain list -are shown on your terminal when you print a message. -All other header fields are suppressed. -The -.b Type -and -.b Print -commands can be used to print a message in its entirety. -If -.b retain -is executed with no arguments, it lists the current set of -retained fields. -.ip "\fBsave\fP\ \ " -It is often useful to be able to save messages on related topics -in a file. The -.b save -command gives you the ability to do this. The -.b save -command takes as an argument a list of message numbers, followed by -the name of the file in which to save the messages. The messages -are appended to the named file, thus allowing one to keep several -messages in the file, stored in the order they were put there. -The filename in quotes, followed by the line -count and character count is echoed on the user's terminal. -An example of the -.b save -command relative to our running example is: -.(l -s 1 2 tuitionmail -.)l -.b Saved -messages are not automatically saved in -.i mbox -at quit time, nor are they selected by the -.b next -command described above, unless explicitly specified. -\fBSave\fP can be abbreviated to \fBs\fP. -.ip "\fBset\fP\ \ " -Set an option or give an option a value. Used to customize -.i Mail . -Section 5.3 contains a list of the options. Options can be -.i binary , -in which case they are -.i on -or -.i off , -or -.i valued . -To set a binary option -.i option -.i on , -do -.(l -set option -.)l -To give the valued option -.i option -the value -.i value , -do -.(l -set option=value -.)l -There must be no space before or after the ``='' sign. -If no arguments are given, all variable values are printed. -Several options can be specified in a single -.b set -command. -\fBSet\fP can be abbreviated to \fBse\fP. -.ip "\fBshell\fP\ \ " -The -.b shell -command allows you to -escape to the shell. -.b Shell -invokes an interactive shell and allows you to type commands to it. -When you leave the shell, you will return to -.i Mail . -The shell used is a default assumed by -.i Mail ; -you can override this default by setting the valued option -.q SHELL, -eg: -.(l -set SHELL=/bin/csh -.)l -\fBShell\fP can be abbreviated to \fBsh\fP. -.ip "\fBsize\fP\ \ " -Takes a message list and prints out the size in characters of each -message. -.ip "\fBsource\fP\ \ " -The -.b source -command reads -.i mail -commands from a file. It is useful when you are trying to fix your -.q .mailrc -file and you need to re-read it. -\fBSource\fP can be abbreviated to \fBso\fP. -.ip "\fBtop\fP\ \ " -The -.b top -command takes a message list and prints the first five lines -of each addressed message. -If you wish, you can change the number of lines that -.b top -prints out by setting the valued option -.q "toplines." -On a CRT terminal, -.(l -set toplines=10 -.)l -might be preferred. -\fBTop\fP can be abbreviated to \fBto\fP. -.ip "\fBtype\fP\ \ " -Same as \fBprint\fP. -Takes a message list and types out each message on the terminal. -The \fBtype\fP command can be abbreviated to \fBt\fP. -.ip "\fBundelete\fP \ \" -Takes a message list and marks each message as \fInot\fP -being deleted. -\fBUndelete\fP can be abbreviated to \fBu\fP. -.ip "\fBunread\fP\ \ " -Takes a message list and marks each message as -.i not -having been read. -\fBUnread\fP can be abbreviated to \fBU\fP. -.ip "\fBunset\fP\ \ " -Takes a list of option names and discards their remembered values; -the inverse of \fBset\fP . -.ip "\fBvisual\fP\ \ " -It is often useful to be able to invoke one of two editors, -based on the type of terminal one is using. To invoke -a display oriented editor, you can use the -.b visual -command. The operation of the -.b visual -command is otherwise identical to that of the -.b edit -command. -.ne 2v+\n(psu -.sp \n(psu -Both the -.b edit -and -.b visual -commands assume some default text editors. These default editors -can be overridden by the valued options -.q EDITOR -and -.q VISUAL -for the standard and screen editors. You might want to do: -.(l -set EDITOR=/usr/bin/ex VISUAL=/usr/bin/vi -.)l -\fBVisual\fP can be abbreviated to \fBv\fP. -.ip "\fBwrite\fP\ \ " -The -.b save -command always writes the entire message, including the headers, -into the file. If you want to write just the message itself, you -can use the -.b write -command. The -.b write -command has the same syntax as the -.b save -command, and can be abbreviated to simply -.b w . -Thus, we could write the second message by doing: -.(l -w 2 file.c -.)l -As suggested by this example, the -.b write -command is useful for such tasks as sending and receiving -source program text over the message system. -The filename in quotes, followed by the line -count and character count is echoed on the user's terminal. -.ip "\fBz\fP\ \ " -.i Mail -presents message headers in windowfuls as described under -the -.b headers -command. -You can move -.i Mail's -attention forward to the next window by giving the -.(l -z+ -.)l -command. Analogously, you can move to the previous window with: -.(l -z\- -.)l -.sh 2 "Custom options" -.pp -Throughout this manual, we have seen examples of binary and valued options. -This section describes each of the options in alphabetical order, including -some that you have not seen yet. -To avoid confusion, please note that the options are either -all lower case letters or all upper case letters. When I start a sentence -such as: -.q "Ask" -causes -.i Mail -to prompt you for a subject header, -I am only capitalizing -.q ask -as a courtesy to English. -.ip "\fBEDITOR\fP\ \ " -The valued option -.q EDITOR -defines the pathname of the text editor to be used in the -.b edit -command and ~e. If not defined, a standard editor is used. -.ip "\fBPAGER\fP\ \ " -Pathname of the program to use for paginating output when -it exceeds \fIcrt\fP lines. -A default paginator is used if this option is not defined. -.ip "\fBSHELL\fP\ \ " -The valued option -.q SHELL -gives the path name of your shell. This shell is used for the -.b ! -command and ~! escape. In addition, this shell expands -file names with shell metacharacters like * and ? in them. -.ip "\fBVISUAL\fP\ \ " -The valued option -.q VISUAL -defines the pathname of the screen editor to be used in the -.b visual -command -and ~v escape. A standard screen editor is used if you do not define one. -.ip "\fBappend\fP\ \ " -The -.q append -option is binary and -causes messages saved in -.i mbox -to be appended to the end rather than prepended. -Normally, \fIMail\fP will put messages in \fImbox\fP -in the same order that the system puts messages in your system mailbox. -By setting -.q append, -you are requesting that -.i mbox -be appended to regardless. It is in any event quicker to append. -.ip "\fBask\fP\ \ " -.q "Ask" -is a binary option which -causes -.i Mail -to prompt you for the subject of each message you send. -If you respond with simply a newline, no subject field will be sent. -.ip "\fBaskcc\fP\ \ " -.q Askcc -is a binary option which -causes you to be prompted for additional carbon copy recipients at the -end of each message. Responding with a newline shows your -satisfaction with the current list. -.ip "\fBautoprint\fP\ \ " -.q Autoprint -is a binary option which -causes the -.b delete -command to behave like -.b dp -\*- thus, after deleting a message, the next one will be typed -automatically. This is useful when quickly scanning and deleting -messages in your mailbox. -.ip "\fBcrt\fP \ \ " -The valued option -.q crt -is used as a threshold to determine how long a message must -be before -.b PAGER -is used to read it. -.ip "\fBdebug\fP \ \ " -The binary option -.q debug -causes debugging information to be displayed. Use of this -option is the same as using the \fB\-d\fP command line flag. -.ip "\fBdot\fP\ \ " -.q Dot -is a binary option which, if set, causes -.i Mail -to interpret a period alone on a line as the terminator -of the message you are sending. -.ip "\fBescape\fP\ \ " -To allow you to change the escape character used when sending -mail, you can set the valued option -.q escape. -Only the first character of the -.q escape -option is used, and it must be doubled if it is to appear as -the first character of a line of your message. If you change your escape -character, then ~ loses all its special meaning, and need no longer be doubled -at the beginning of a line. -.ip "\fBfolder\fP\ \ " -The name of the directory to use for storing folders of messages. -If this name begins with a `/' -.i Mail -considers it to be an absolute pathname; otherwise, the folder directory -is found relative to your home directory. -.ip "\fBhold\fP\ \ " -The binary option -.q hold -causes messages that have been read but not manually dealt with -to be held in the system mailbox. This prevents such messages from -being automatically swept into your \fImbox\fP file. -.ip "\fBignore\fP\ \ " -The binary option -.q ignore -causes \s-2RUBOUT\s0 characters from your terminal to be ignored and echoed -as @'s while you are sending mail. \s-2RUBOUT\s0 characters retain their -original meaning in -.i Mail -command mode. -Setting the -.q ignore -option is equivalent to supplying the -.b \-i -flag on the command line as described in section 6. -.ip "\fBignoreeof\fP\ \ " -An option related to -.q dot -is -.q ignoreeof -which makes -.i Mail -refuse to accept a control\-d as the end of a message. -.q Ignoreeof -also applies to -.i Mail -command mode. -.ip "\fBkeep\fP\ \ " -The -.q keep -option causes -.i Mail -to truncate your system mailbox instead of deleting it when it -is empty. This is useful if you elect to protect your mailbox, which -you would do with the shell command: -.(l -chmod 600 /var/mail/yourname -.)l -where -.i yourname -is your login name. If you do not do this, anyone can probably read -your mail, although people usually don't. -.ip "\fBkeepsave\fP\ \ " -When you -.b save -a message, -.i Mail -usually discards it when you -.b quit . -To retain all saved messages, set the -.q keepsave -option. -.ip "\fBmetoo\fP\ \ " -When sending mail to an alias, -.i Mail -makes sure that if you are included in the alias, that mail will not -be sent to you. This is useful if a single alias is being used by -all members of the group. If however, you wish to receive a copy of -all the messages you send to the alias, you can set the binary option -.q metoo. -.ip "\fBnoheader\fP\ \ " -The binary option -.q noheader -suppresses the printing of the version and headers when -.i Mail -is first invoked. Setting this option is the same as using -.b \-N -on the command line. -.ip "\fBnosave\fP\ \ " -Normally, -when you abort a message with two \s-2RUBOUTs\s0, -.i Mail -copies the partial letter to the file -.q dead.letter -in your home directory. Setting the binary option -.q nosave -prevents this. -.ip "\fBReplyall\fP\ \ " -Reverses the sense of -.i reply -and -.i Reply -commands. -.ip "\fBquiet\fP\ \ " -The binary option -.q quiet -suppresses the printing of the version when -.i Mail -is first invoked, -as well as printing the for example -.q "Message 4:" -from the -.b type -command. -.ip "\fBrecord\fP\ \ " -If you love to keep records, then the -valued option -.q record -can be set to the name of a file to save your outgoing mail. -Each new message you send is appended to the end of the file. -.ip "\fBscreen\fP\ \ " -When -.i Mail -initially prints the message headers, it determines the number to -print by looking at the speed of your terminal. The faster your -terminal, the more it prints. -The valued option -.q screen -overrides this calculation and -specifies how many message headers you want printed. -This number is also used for scrolling with the -.b z -command. -.ip "\fBsendmail\fP\ \ " -To use an alternate mail delivery system, set the -.q sendmail -option to the full pathname of the program to use. Note: this is not -for everyone! Most people should use the default delivery system. -.ip "\fBtoplines\fP\ \ " -The valued option -.q toplines -defines the number of lines that the -.q top -command will print out instead of the default five lines. -.ip "\fBverbose\fP\ \ " -The binary option "verbose" causes -.i Mail -to invoke sendmail with the -.b \-v -flag, which causes it to go into verbose mode and announce expansion -of aliases, etc. Setting the "verbose" option is equivalent to -invoking -.i Mail -with the -.b \-v -flag as described in section 6. diff --git a/usr.bin/mail/USD.doc/mail6.nr b/usr.bin/mail/USD.doc/mail6.nr deleted file mode 100644 index 0465a94..0000000 --- a/usr.bin/mail/USD.doc/mail6.nr +++ /dev/null @@ -1,125 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail6.nr 8.1 (Berkeley) 6/8/93 -.\" -.bp -.sh 1 "Command line options" -.pp -This section describes command line options for -.i Mail -and what they are used for. -.ip \-N -Suppress the initial printing of headers. -.ip \-d -Turn on debugging information. Not of general interest. -.ip "\-f file\ \ " -Show the messages in -.i file -instead of your system mailbox. If -.i file -is omitted, -.i Mail -reads -.i mbox -in your home directory. -.ip \-i -Ignore tty interrupt signals. Useful on noisy phone lines, which -generate spurious RUBOUT or DELETE characters. It's usually -more effective to change your interrupt character to control\-c, -for which see the -.i stty -shell command. -.ip \-n -Inhibit reading of /etc/mail.rc. Not generally useful, since -/etc/mail.rc is usually empty. -.ip "\-s string" -Used for sending mail. -.i String -is used as the subject of the message being composed. If -.i string -contains blanks, you must surround it with quote marks. -.ip "\-u name" -Read -.i names's -mail instead of your own. Unwitting others often neglect to protect -their mailboxes, but discretion is advised. Essentially, -.b "\-u user" -is a shorthand way of doing -.b "\-f /var/mail/user". -.ip "\-v" -Use the -.b \-v -flag when invoking sendmail. This feature may also be enabled -by setting the the option "verbose". -.pp -The following command line flags are also recognized, but are -intended for use by programs invoking -.i Mail -and not for people. -.ip "\-T file" -Arrange to print on -.i file -the contents of the -.i article-id -fields of all messages that were either read or deleted. -.b \-T -is for the -.i readnews -program and should NOT be used for reading your mail. -.ip "\-h number" -Pass on hop count information. -.i Mail -will take the number, increment it, and pass it with -.b \-h -to the mail delivery system. -.b \-h -only has effect when sending mail and is used for network mail -forwarding. -.ip "\-r name" -Used for network mail forwarding: interpret -.i name -as the sender of the message. The -.i name -and -.b \-r -are simply sent along to the mail delivery system. Also, -.i Mail -will wait for the message to be sent and return the exit status. -Also restricts formatting of message. -.pp -Note that -.b \-h -and -.b \-r , -which are for network mail forwarding, are not used in practice -since mail forwarding is now handled separately. They may -disappear soon. diff --git a/usr.bin/mail/USD.doc/mail7.nr b/usr.bin/mail/USD.doc/mail7.nr deleted file mode 100644 index 0b2590b..0000000 --- a/usr.bin/mail/USD.doc/mail7.nr +++ /dev/null @@ -1,107 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail7.nr 8.1 (Berkeley) 6/8/93 -.\" -.sh 1 "Format of messages" -.pp -This section describes the format of messages. -Messages begin with a -.i from -line, which consists of the word -.q From -followed by a user name, followed by anything, followed by -a date in the format returned by the -.i ctime -library routine described in section 3 of the Unix Programmer's -Manual. A possible -.i ctime -format date is: -.(l -Tue Dec 1 10:58:23 1981 -.)l -The -.i ctime -date may be optionally followed by a single space and a -time zone indication, which -should be three capital letters, such as PDT. -.pp -Following the -.i from -line are zero or more -.i "header field" -lines. -Each header field line is of the form: -.(l -name: information -.)l -.i Name -can be anything, but only certain header fields are recognized as -having any meaning. The recognized header fields are: -.i article-id , -.i bcc , -.i cc , -.i from , -.i reply-to , -.i sender , -.i subject , -and -.i to . -Other header fields are also significant to other systems; see, -for example, the current Arpanet message standard for much more -information on this topic. -A header field can be continued onto following lines by making the -first character on the following line a space or tab character. -.pp -If any headers are present, they must be followed by a blank line. -The part that follows is called the -.i body -of the message, and must be ASCII text, not containing null characters. -Each line in the message body must be no longer than 512 characters and -terminated with an ASCII newline character. -If binary data must be passed through the mail system, it is suggested -that this data be encoded in a system which encodes six bits into -a printable character (i.e.: uuencode). -For example, one could use the upper and lower case letters, the digits, -and the characters comma and period to make up the 64 characters. -Then, one can send a 16-bit binary number -as three characters. These characters should be packed into lines, -preferably lines about 70 characters long as long lines are transmitted -more efficiently. -.pp -The message delivery system always adds a blank line to the end of -each message. This blank line must not be deleted. -.pp -The UUCP message delivery system sometimes adds a blank line to -the end of a message each time it is forwarded through a machine. -.pp -It should be noted that some network transport protocols enforce -limits to the lengths of messages. diff --git a/usr.bin/mail/USD.doc/mail8.nr b/usr.bin/mail/USD.doc/mail8.nr deleted file mode 100644 index b09afbd..0000000 --- a/usr.bin/mail/USD.doc/mail8.nr +++ /dev/null @@ -1,75 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail8.nr 8.1 (Berkeley) 6/8/93 -.\" -.bp -.sh 1 "Glossary" -.pp -This section contains the definitions of a few phrases -peculiar to -.i Mail . -.ip "\fIalias\fP" -An alternative name for a person or list of people. -.ip "\fIflag\fP" -An option, given on the command line of -.i Mail , -prefaced with a \-. For example, -.b \-f -is a flag. -.ip "\fIheader field\fP" -At the beginning of a message, a line which contains information -that is part of the structure of the message. Popular header fields -include -.i to , -.i cc , -and -.i subject . -.ip "\fImail\ \ \fP" -A collection of messages. Often used in the phrase, -.q "Have you read your mail?" -.ip "\fImailbox\fP" -The place where your mail is stored, typically in the directory -/var/mail. -.ip "\fImessage\fP" -A single letter from someone, initially stored in your -.i mailbox . -.ip "\fImessage list\fP" -A string used in -.i Mail -command mode to describe a sequence of messages. -.ip "\fIoption\fP" -A piece of special purpose information used to tailor -.i Mail -to your taste. -Options are specified with the -.b set -command. diff --git a/usr.bin/mail/USD.doc/mail9.nr b/usr.bin/mail/USD.doc/mail9.nr deleted file mode 100644 index 271548e..0000000 --- a/usr.bin/mail/USD.doc/mail9.nr +++ /dev/null @@ -1,203 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)mail9.nr 8.1 (Berkeley) 6/8/93 -.\" -.bp -.sh 1 "Summary of commands, options, and escapes" -.pp -This section gives a quick summary of the -.i Mail -commands, binary and valued options, and tilde escapes. -.pp -The following table describes the commands: -.TS -center ; -c ci -lb l. -Command Description -_ -+ Same as \fBnext\fP -- Back up to previous message -? Print brief summary of \fIMail\fP commands -! Single command escape to shell -Print Type message with ignored fields -Reply Reply to author of message only -Respond Same as \fBReply\fP -Type Type message with ignored fields -alias Define an alias as a set of user names -alternates List other names you are known by -chdir Change working directory, home by default -copy Copy a message to a file or folder -delete Delete a list of messages -dp Same as \fBdt\fP -dt Delete current message, type next message -edit Edit a list of messages -else Start of else part of conditional; see \fBif\fP -endif End of conditional statement; see \fBif\fP -exit Leave mail without changing anything -file Interrogate/change current mail file -folder Same as \fBfile\fP -folders List the folders in your folder directory -from List headers of a list of messages -headers List current window of messages -help Same as \fB?\fP -hold Same as \fBpreserve\fP -if Conditional execution of \fIMail\fP commands -ignore Set/examine list of ignored header fields -list List valid \fIMail\fP commands -local List other names for the local host -mail Send mail to specified names -mbox Arrange to save a list of messages in \fImbox\fP -next Go to next message and type it -preserve Arrange to leave list of messages in system mailbox -print Print messages -quit Leave \fIMail\fP; update system mailbox, \fImbox\fP as appropriate -reply Compose a reply to a message -respond Same as \fBreply\fP -retain Supersedes \fBignore\fP -save Append messages, headers included, on a file -set Set binary or valued options -shell Invoke an interactive shell -size Prints out size of message list -source Read \fImail\fP commands from a file -top Print first so many (5 by default) lines of list of messages -type Same as \fBprint\fP -undelete Undelete list of messages -unread Marks list of messages as not been read -unset Undo the operation of a \fBset\fP -visual Invoke visual editor on a list of messages -write Append messages to a file, don't include headers -xit Same as \fBexit\fP -z Scroll to next/previous screenful of headers -.TE -.bp -.(b -.pp -The following table describes the options. Each option is -shown as being either a binary or valued option. -.TS -center; -c ci ci -l ci l. -Option Type Description -_ -EDITOR valued Pathname of editor for ~e and \fBedit\fP -PAGER valued Pathname of paginator for \fBPrint\fP, \fBprint\fP, \fBType\fP and \fBtype\fP -SHELL valued Pathname of shell for \fBshell\fP, ~! and \fB!\fP -VISUAL valued Pathname of screen editor for ~v, \fBvisual\fP -append binary Always append messages to end of \fImbox\fP -ask binary Prompt user for Subject: field when sending -askcc binary Prompt user for additional Cc's at end of message -autoprint binary Print next message after \fBdelete\fP -crt valued Minimum number of lines before using \fBPAGER\fP -debug binary Print out debugging information -dot binary Accept . alone on line to terminate message input -escape valued Escape character to be used instead of\ \ ~ -folder valued Directory to store folders in -hold binary Hold messages in system mailbox by default -ignore binary Ignore \s-2RUBOUT\s0 while sending mail -ignoreeof binary Don't terminate letters/command input with \fB\(uaD\fP -keep binary Don't unlink system mailbox when empty -keepsave binary Don't delete \fBsave\fPd messages by default -metoo binary Include sending user in aliases -noheader binary Suppress initial printing of version and headers -nosave binary Don't save partial letter in \fIdead.letter\fP -quiet binary Suppress printing of \fIMail\fP version and message numbers -record valued File to save all outgoing mail in -screen valued Size of window of message headers for \fBz\fP, etc. -sendmail valued Choose alternate mail delivery system -toplines valued Number of lines to print in \fBtop\fP -verbose binary Invoke sendmail with the \fB\-v\fP flag -.TE -.)b -.(b -.pp -The following table summarizes the tilde escapes available -while sending mail. -.TS -center; -c ci ci -l li l. -Escape Arguments Description -_ -~! command Execute shell command -~b name ... Add names to "blind" Cc: list -~c name ... Add names to Cc: field -~d Read \fIdead.letter\fP into message -~e Invoke text editor on partial message -~f messages Read named messages -~h Edit the header fields -~m messages Read named messages, right shift by tab -~p Print message entered so far -~q Abort entry of letter; like \s-2RUBOUT\s0 -~r filename Read file into message -~s string Set Subject: field to \fIstring\fP -~t name ... Add names to To: field -~v Invoke screen editor on message -~w filename Write message on file -~| command Pipe message through \fIcommand\fP -~: Mail command Execute a \fIMail\fP command -~~ string Quote a ~ in front of \fIstring\fP -.TE -.)b -.(b -.pp -The following table shows the command line flags that -.i Mail -accepts: -.TS -center; -c c -l a. -Flag Description -_ -\-N Suppress the initial printing of headers -\-T \fIfile\fP Article-id's of read/deleted messages to \fIfile\fP -\-d Turn on debugging -\-f \fIfile\fP Show messages in \fIfile\fP or \fI~/mbox\fP -\-h \fInumber\fP Pass on hop count for mail forwarding -\-i Ignore tty interrupt signals -\-n Inhibit reading of /etc/mail.rc -\-r \fIname\fP Pass on \fIname\fP for mail forwarding -\-s \fIstring\fP Use \fIstring\fP as subject in outgoing mail -\-u \fIname\fP Read \fIname's\fP mail instead of your own -\-v Invoke sendmail with the \fB\-v\fP flag -.TE -.)b -.lp -Notes: -.b \-T , -.b \-d , -.b \-h , -and -.b \-r -are not for human use. diff --git a/usr.bin/mail/USD.doc/maila.nr b/usr.bin/mail/USD.doc/maila.nr deleted file mode 100644 index 84b01fe..0000000 --- a/usr.bin/mail/USD.doc/maila.nr +++ /dev/null @@ -1,33 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)maila.nr 8.1 (Berkeley) 6/8/93 -.\" diff --git a/usr.bin/make/PSD.doc/stubs b/usr.bin/make/PSD.doc/stubs deleted file mode 100644 index 39d8def..0000000 --- a/usr.bin/make/PSD.doc/stubs +++ /dev/null @@ -1,9 +0,0 @@ -.\" $FreeBSD$ -.\" -.de Ix -.. -.de Rd -.. -.de Rm -.. -.if n .ftr CR R diff --git a/usr.bin/make/PSD.doc/tutorial.ms b/usr.bin/make/PSD.doc/tutorial.ms deleted file mode 100644 index 320d5df..0000000 --- a/usr.bin/make/PSD.doc/tutorial.ms +++ /dev/null @@ -1,3747 +0,0 @@ -.\" Copyright (c) 1988, 1989 by Adam de Boor -.\" Copyright (c) 1989 by Berkeley Softworks -.\" Copyright (c) 1988, 1989, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" This code is derived from software contributed to Berkeley by -.\" Adam de Boor. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)tutorial.ms 8.1 (Berkeley) 8/18/93 -.\" $FreeBSD$ -.\" -.EH 'PSD:12-%''PMake \*- A Tutorial' -.OH 'PMake \*- A Tutorial''PSD:12-%' -.\" xH is a macro to provide numbered headers that are automatically stuffed -.\" into a table-of-contents, properly indented, etc. If the first argument -.\" is numeric, it is taken as the depth for numbering (as for .NH), else -.\" the default (1) is assumed. -.\" -.\" @P The initial paragraph distance. -.\" @Q The piece of section number to increment (or 0 if none given) -.\" @R Section header. -.\" @S Indent for toc entry -.\" @T Argument to NH (can't use @Q b/c giving 0 to NH resets the counter) -.de xH -.NH \\$1 -\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 -.nr PD .1v -.XS \\n% -.ta 0.6i -\\*(SN \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 -.XE -.nr PD .3v -.. -.ig -.\" CW is used to place a string in fixed-width or switch to a -.\" fixed-width font. -.\" C is a typewriter font for a laserwriter. Use something else if -.\" you don't have one... -.de CW -.ie !\\n(.$ .ft S -.el \&\\$3\fS\\$1\fP\\$2 -.. -.\" Anything I put in a display I want to be in fixed-width -.am DS -.CW -.. -.\" The stuff in .No produces a little stop sign in the left margin -.\" that says NOTE in it. Unfortunately, it does cause a break, but -.\" hey. Can't have everything. In case you're wondering how I came -.\" up with such weird commands, they came from running grn on a -.\" gremlin file... -.de No -.br -.ne 0.5i -.po -0.5i -.br -.mk -.nr g3 \\n(.f -.nr g4 \\n(.s -.ig ft -.sp -1 -.\" .st cf -\D's -1u'\D't 5u' -.sp -1 -\h'50u'\D'l 71u 0u'\D'l 50u 50u'\D'l 0u 71u'\D'l -50u 50u'\D'l -71u 0u'\D'l -50u -50u'\D'l 0u -71u'\D'l 50u -50u' -.sp -1 -\D't 3u' -.sp -1 -.sp 7u -\h'53u'\D'p 14 68u 0u 46u 46u 0u 68u -46u 46u -68u 0u -47u -46u 0u -68u 47u -46u' -.sp -1 -.ft R -.ps 6 -.nr g8 \\n(.d -.ds g9 "NOTE -.sp 74u -\h'85u'\v'0.85n'\h-\w\\*(g9u/2u\&\\*(g9 -.sp |\\n(g8u -.sp 166u -.ig br -\D't 3u'\D's -1u' -.br -.po -.rt -.ft \\n(g3 -.ps \\n(g4 -.. -.de Bp -.ie !\\n(.$ .IP \(bu 2 -.el .IP "\&" 2 -.. -.po +.3i -.TL -PMake \*- A Tutorial -.AU -Adam de Boor -.AI -Berkeley Softworks -2150 Shattuck Ave, Penthouse -Berkeley, CA 94704 -adam@bsw.uu.net -\&...!uunet!bsw!adam -.FS -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appears in all copies. -The University of California, Berkeley Softworks, and Adam de Boor make no -representations about the suitability of this software for any -purpose. It is provided "as is" without express or implied warranty. -.FE -.PP -.xH 1 Introduction -.LP -PMake is a program for creating other programs, or anything else you -can think of for it to do. The basic idea behind PMake is that, for -any given system, be it a program or a document or whatever, there -will be some files that depend on the state of other files (on when -they were last modified). PMake takes these dependencies, which you -must specify, and uses them to build whatever it is you want it to -build. -.LP -PMake is almost fully-compatible with Make, with which you may already -be familiar. PMake's most important feature is its ability to run -several different jobs at once, making the creation of systems -considerably faster. It also has a great deal more functionality than -Make. Throughout the text, whenever something is mentioned that is an -important difference between PMake and Make (i.e. something that will -cause a makefile to fail if you don't do something about it), or is -simply important, it will be flagged with a little sign in the left -margin, like this: -.No -.LP -This tutorial is divided into three main sections corresponding to basic, -intermediate and advanced PMake usage. If you already know Make well, -you will only need to skim chapter 2 (there are some aspects of -PMake that I consider basic to its use that didn't exist in Make). -Things in chapter 3 make life much easier, while those in chapter 4 -are strictly for those who know what they are doing. Chapter 5 has -definitions for the jargon I use and chapter 6 contains possible -solutions to the problems presented throughout the tutorial. -.xH 1 The Basics of PMake -.LP -PMake takes as input a file that tells a) which files depend on which -other files to be complete and b) what to do about files that are -``out-of-date.'' This file is known as a ``makefile'' and is usually -.Ix 0 def makefile -kept in the top-most directory of the system to be built. While you -can call the makefile anything you want, PMake will look for -.CW Makefile -and -.CW makefile -(in that order) in the current directory if you don't tell it -otherwise. -.Ix 0 def makefile default -To specify a different makefile, use the -.B \-f -flag (e.g. -.CW "pmake -f program.mk" ''). `` -.Ix 0 ref flags -f -.Ix 0 ref makefile other -.LP -A makefile has four different types of lines in it: -.RS -.IP \(bu 2 -File dependency specifications -.IP \(bu 2 -Creation commands -.IP \(bu 2 -Variable assignments -.IP \(bu 2 -Comments, include statements and conditional directives -.RE -.LP -Any line may be continued over multiple lines by ending it with a -backslash. -.Ix 0 def "continuation line" -The backslash, following newline and any initial whitespace -on the following line are compressed into a single space before the -input line is examined by PMake. -.xH 2 Dependency Lines -.LP -As mentioned in the introduction, in any system, there are -dependencies between the files that make up the system. For instance, -in a program made up of several C source files and one header file, -the C files will need to be re-compiled should the header file be -changed. For a document of several chapters and one macro file, the -chapters will need to be reprocessed if any of the macros changes. -.Ix 0 def "dependency" -These are dependencies and are specified by means of dependency lines in -the makefile. -.LP -.Ix 0 def "dependency line" -On a dependency line, there are targets and sources, separated by a -one- or two-character operator. -The targets ``depend'' on the sources and are usually created from -them. -.Ix 0 def target -.Ix 0 def source -.Ix 0 ref operator -Any number of targets and sources may be specified on a dependency line. -All the targets in the line are made to depend on all the sources. -Targets and sources need not be actual files, but every source must be -either an actual file or another target in the makefile. -If you run out of room, use a backslash at the end of the line to continue onto -the next one. -.LP -Any file may be a target and any file may be a source, but the -relationship between the two (or however many) is determined by the -``operator'' that separates them. -.Ix 0 def operator -Three types of operators exist: one specifies that the datedness of a -target is determined by the state of its sources, while another -specifies other files (the sources) that need to be dealt with before -the target can be re-created. The third operator is very similar to -the first, with the additional condition that the target is -out-of-date if it has no sources. These operations are represented by -the colon, the exclamation point and the double-colon, respectively, and are -mutually exclusive. Their exact semantics are as follows: -.IP ":" -.Ix 0 def operator colon -.Ix 0 def : -If a colon is used, a target on the line is considered to be -``out-of-date'' (and in need of creation) if -.RS -.IP \(bu 2 -any of the sources has been modified more recently than the target, or -.IP \(bu 2 -the target doesn't exist. -.RE -.Ix 0 def out-of-date -.IP "\&" -Under this operation, steps will be taken to re-create the target only -if it is found to be out-of-date by using these two rules. -.IP "!" -.Ix 0 def operator force -.Ix 0 def ! -If an exclamation point is used, the target will always be re-created, -but this will not happen until all of its sources have been examined -and re-created, if necessary. -.IP "::" -.Ix 0 def operator double-colon -.Ix 0 def :: -If a double-colon is used, a target is out-of-date if: -.RS -.IP \(bu 2 -any of the sources has been modified more recently than the target, or -.IP \(bu 2 -the target doesn't exist, or -.IP \(bu 2 -the target has no sources. -.RE -.IP "\&" -If the target is out-of-date according to these rules, it will be re-created. -This operator also does something else to the targets, but I'll go -into that in the next section (``Shell Commands''). -.LP -Enough words, now for an example. Take that C program I mentioned -earlier. Say there are three C files -.CW a.c , ( -.CW b.c -and -.CW c.c ) -each of which -includes the file -.CW defs.h . -The dependencies between the files could then be expressed as follows: -.DS -program : a.o b.o c.o -a.o b.o c.o : defs.h -a.o : a.c -b.o : b.c -c.o : c.c -.DE -.LP -You may be wondering at this point, where -.CW a.o , -.CW b.o -and -.CW c.o -came in and why -.I they -depend on -.CW defs.h -and the C files don't. The reason is quite simple: -.CW program -cannot be made by linking together .c files \*- it must be -made from .o files. Likewise, if you change -.CW defs.h , -it isn't the .c files that need to be re-created, it's the .o files. -If you think of dependencies in these terms \*- which files (targets) -need to be created from which files (sources) \*- you should have no problems. -.LP -An important thing to notice about the above example, is that all the -\&.o files appear as targets on more than one line. This is perfectly -all right: the target is made to depend on all the sources mentioned -on all the dependency lines. E.g. -.CW a.o -depends on both -.CW defs.h -and -.CW a.c . -.Ix 0 ref dependency -.No -.LP -The order of the dependency lines in the makefile is -important: the first target on the first dependency line in the -makefile will be the one that gets made if you don't say otherwise. -That's why -.CW program -comes first in the example makefile, above. -.LP -Both targets and sources may contain the standard C-Shell wildcard -characters -.CW { , ( -.CW } , -.CW * , -.CW ? , -.CW [ , -and -.CW ] ), -but the non-curly-brace ones may only appear in the final component -(the file portion) of the target or source. The characters mean the -following things: -.IP \fB{}\fP -These enclose a comma-separated list of options and cause the pattern -to be expanded once for each element of the list. Each expansion -contains a different element. For example, -.CW src/{whiffle,beep,fish}.c -expands to the three words -.CW src/whiffle.c , -.CW src/beep.c , -and -.CW src/fish.c . -These braces may be nested and, unlike the other wildcard characters, -the resulting words need not be actual files. All other wildcard -characters are expanded using the files that exist when PMake is -started. -.IP \fB*\fP -This matches zero or more characters of any sort. -.CW src/*.c -will expand to the same three words as above as long as -.CW src -contains those three files (and no other files that end in -.CW .c ). -.IP \fB?\fP -Matches any single character. -.IP \fB[]\fP -This is known as a character class and contains either a list of -single characters, or a series of character ranges -.CW a-z , ( -for example means all characters between a and z), or both. It matches -any single character contained in the list. E.g. -.CW [A-Za-z] -will match all letters, while -.CW [0123456789] -will match all numbers. -.xH 2 Shell Commands -.LP -``Isn't that nice,'' you say to yourself, ``but how are files -actually `re-created,' as he likes to spell it?'' -The re-creation is accomplished by commands you place in the makefile. -These commands are passed to the Bourne shell (better known as -``/bin/sh'') to be executed and are -.Ix 0 ref shell -.Ix 0 ref re-creation -.Ix 0 ref update -expected to do what's necessary to update the target file (PMake -doesn't actually check to see if the target was created. It just -assumes it's there). -.Ix 0 ref target -.LP -Shell commands in a makefile look a lot like shell commands you would -type at a terminal, with one important exception: each command in a -makefile -.I must -be preceded by at least one tab. -.LP -Each target has associated with it a shell script made up of -one or more of these shell commands. The creation script for a target -should immediately follow the dependency line for that target. While -any given target may appear on more than one dependency line, only one -of these dependency lines may be followed by a creation script, unless -the `::' operator was used on the dependency line. -.Ix 0 ref operator double-colon -.Ix 0 ref :: -.No -.LP -If the double-colon was used, each dependency line for the target -may be followed by a shell script. That script will only be executed -if the target on the associated dependency line is out-of-date with -respect to the sources on that line, according to the rules I gave -earlier. -I'll give you a good example of this later on. -.LP -To expand on the earlier makefile, you might add commands as follows: -.DS -program : a.o b.o c.o - cc a.o b.o c.o \-o program -a.o b.o c.o : defs.h -a.o : a.c - cc \-c a.c -b.o : b.c - cc \-c b.c -c.o : c.c - cc \-c c.c -.DE -.LP -Something you should remember when writing a makefile is, the -commands will be executed if the -.I target -on the dependency line is out-of-date, not the sources. -.Ix 0 ref target -.Ix 0 ref source -.Ix 0 ref out-of-date -In this example, the command -.CW "cc \-c a.c" '' `` -will be executed if -.CW a.o -is out-of-date. Because of the `:' operator, -.Ix 0 ref : -.Ix 0 ref operator colon -this means that should -.CW a.c -.I or -.CW defs.h -have been modified more recently than -.CW a.o , -the command will be executed -.CW a.o "\&" ( -will be considered out-of-date). -.Ix 0 ref out-of-date -.LP -Remember how I said the only difference between a makefile shell -command and a regular shell command was the leading tab? I lied. There -is another way in which makefile commands differ from regular ones. -The first two characters after the initial whitespace are treated -specially. -If they are any combination of `@' and `\-', they cause PMake to do -different things. -.LP -In most cases, shell commands are printed before they're -actually executed. This is to keep you informed of what's going on. If -an `@' appears, however, this echoing is suppressed. In the case of an -.CW echo -command, say -.CW "echo Linking index" ,'' `` -it would be -rather silly to see -.DS -echo Linking index -Linking index -.DE -.LP -so PMake allows you to place an `@' before the command -.CW "@echo Linking index" '') (`` -to prevent the command from being printed. -.LP -The other special character is the `\-'. In case you didn't know, -shell commands finish with a certain ``exit status.'' This status is -made available by the operating system to whatever program invoked the -command. Normally this status will be 0 if everything went ok and -non-zero if something went wrong. For this reason, PMake will consider -an error to have occurred if one of the shells it invokes returns a non-zero -status. When it detects an error, PMake's usual action is to abort -whatever it's doing and exit with a non-zero status itself (any other -targets that were being created will continue being made, but nothing -new will be started. PMake will exit after the last job finishes). -This behavior can be altered, however, by placing a `\-' at the front -of a command -.CW "\-mv index index.old" ''), (`` -certain command-line arguments, -or doing other things, to be detailed later. In such -a case, the non-zero status is simply ignored and PMake keeps chugging -along. -.No -.LP -Because all the commands are given to a single shell to execute, such -things as setting shell variables, changing directories, etc., last -beyond the command in which they are found. This also allows shell -compound commands (like -.CW for -loops) to be entered in a natural manner. -Since this could cause problems for some makefiles that depend on -each command being executed by a single shell, PMake has a -.B \-B -.Ix 0 ref compatibility -.Ix 0 ref flags -B -flag (it stands for backwards-compatible) that forces each command to -be given to a separate shell. It also does several other things, all -of which I discourage since they are now old-fashioned.\|.\|.\|. -.No -.LP -A target's shell script is fed to the shell on its (the shell's) input stream. -This means that any commands, such as -.CW ci -that need to get input from the terminal won't work right \*- they'll -get the shell's input, something they probably won't find to their -liking. A simple way around this is to give a command like this: -.DS -ci $(SRCS) < /dev/tty -.DE -This would force the program's input to come from the terminal. If you -can't do this for some reason, your only other alternative is to use -PMake in its fullest compatibility mode. See -.B Compatibility -in chapter 4. -.Ix 0 ref compatibility -.LP -.xH 2 Variables -.LP -PMake, like Make before it, has the ability to save text in variables -to be recalled later at your convenience. Variables in PMake are used -much like variables in the shell and, by tradition, consist of -all upper-case letters (you don't -.I have -to use all upper-case letters. -In fact there's nothing to stop you from calling a variable -.CW @^&$%$ . -Just tradition). Variables are assigned-to using lines of the form -.Ix 0 def variable assignment -.DS -VARIABLE = value -.DE -.Ix 0 def variable assignment -appended-to by -.DS -VARIABLE += value -.DE -.Ix 0 def variable appending -.Ix 0 def variable assignment appended -.Ix 0 def += -conditionally assigned-to (if the variable isn't already defined) by -.DS -VARIABLE ?= value -.DE -.Ix 0 def variable assignment conditional -.Ix 0 def ?= -and assigned-to with expansion (i.e. the value is expanded (see below) -before being assigned to the variable\*-useful for placing a value at -the beginning of a variable, or other things) by -.DS -VARIABLE := value -.DE -.Ix 0 def variable assignment expanded -.Ix 0 def := -.LP -Any whitespace before -.I value -is stripped off. When appending, a space is placed between the old -value and the stuff being appended. -.LP -The final way a variable may be assigned to is using -.DS -VARIABLE != shell-command -.DE -.Ix 0 def variable assignment shell-output -.Ix 0 def != -In this case, -.I shell-command -has all its variables expanded (see below) and is passed off to a -shell to execute. The output of the shell is then placed in the -variable. Any newlines (other than the final one) are replaced by -spaces before the assignment is made. This is typically used to find -the current directory via a line like: -.DS -CWD != pwd -.DE -.LP -.B Note: -this is intended to be used to execute commands that produce small amounts -of output (e.g. ``pwd''). The implementation is less than intelligent and will -likely freeze if you execute something that produces thousands of -bytes of output (8 Kb is the limit on many UNIX systems). -.LP -The value of a variable may be retrieved by enclosing the variable -name in parentheses or curly braces and preceding the whole thing -with a dollar sign. -.LP -For example, to set the variable CFLAGS to the string -.CW "\-I/sprite/src/lib/libc \-O" ,'' `` -you would place a line -.DS -CFLAGS = \-I/sprite/src/lib/libc \-O -.DE -in the makefile and use the word -.CW "$(CFLAGS)" -wherever you would like the string -.CW "\-I/sprite/src/lib/libc \-O" -to appear. This is called variable expansion. -.Ix 0 def variable expansion -.No -.LP -Unlike Make, PMake will not expand a variable unless it knows -the variable exists. E.g. if you have a -.CW "${i}" -in a shell command and you have not assigned a value to the variable -.CW i -(the empty string is considered a value, by the way), where Make would have -substituted the empty string, PMake will leave the -.CW "${i}" -alone. -To keep PMake from substituting for a variable it knows, precede the -dollar sign with another dollar sign. -(e.g. to pass -.CW "${HOME}" -to the shell, use -.CW "$${HOME}" ). -This causes PMake, in effect, to expand the -.CW $ -macro, which expands to a single -.CW $ . -For compatibility, Make's style of variable expansion will be used -if you invoke PMake with any of the compatibility flags (\c -.B \-V , -.B \-B -or -.B \-M . -The -.B \-V -flag alters just the variable expansion). -.Ix 0 ref flags -V -.Ix 0 ref flags -B -.Ix 0 ref flags -M -.Ix 0 ref compatibility -.LP -.Ix 0 ref variable expansion -There are two different times at which variable expansion occurs: -When parsing a dependency line, the expansion occurs immediately -upon reading the line. If any variable used on a dependency line is -undefined, PMake will print a message and exit. -Variables in shell commands are expanded when the command is -executed. -Variables used inside another variable are expanded whenever the outer -variable is expanded (the expansion of an inner variable has no effect -on the outer variable. I.e. if the outer variable is used on a dependency -line and in a shell command, and the inner variable changes value -between when the dependency line is read and the shell command is -executed, two different values will be substituted for the outer -variable). -.Ix 0 def variable types -.LP -Variables come in four flavors, though they are all expanded the same -and all look about the same. They are (in order of expanding scope): -.RS -.IP \(bu 2 -Local variables. -.Ix 0 ref variable local -.IP \(bu 2 -Command-line variables. -.Ix 0 ref variable command-line -.IP \(bu 2 -Global variables. -.Ix 0 ref variable global -.IP \(bu 2 -Environment variables. -.Ix 0 ref variable environment -.RE -.LP -The classification of variables doesn't matter much, except that the -classes are searched from the top (local) to the bottom (environment) -when looking up a variable. The first one found wins. -.xH 3 Local Variables -.LP -.Ix 0 def variable local -Each target can have as many as seven local variables. These are -variables that are only ``visible'' within that target's shell script -and contain such things as the target's name, all of its sources (from -all its dependency lines), those sources that were out-of-date, etc. -Four local variables are defined for all targets. They are: -.RS -.IP ".TARGET" -.Ix 0 def variable local .TARGET -.Ix 0 def .TARGET -The name of the target. -.IP ".OODATE" -.Ix 0 def variable local .OODATE -.Ix 0 def .OODATE -The list of the sources for the target that were considered out-of-date. -The order in the list is not guaranteed to be the same as the order in -which the dependencies were given. -.IP ".ALLSRC" -.Ix 0 def variable local .ALLSRC -.Ix 0 def .ALLSRC -The list of all sources for this target in the order in which they -were given. -.IP ".PREFIX" -.Ix 0 def variable local .PREFIX -.Ix 0 def .PREFIX -The target without its suffix and without any leading path. E.g. for -the target -.CW ../../lib/compat/fsRead.c , -this variable would contain -.CW fsRead . -.RE -.LP -Three other local variables are set only for certain targets under -special circumstances. These are the ``.IMPSRC,'' -.Ix 0 ref variable local .IMPSRC -.Ix 0 ref .IMPSRC -``.ARCHIVE,'' -.Ix 0 ref variable local .ARCHIVE -.Ix 0 ref .ARCHIVE -and ``.MEMBER'' -.Ix 0 ref variable local .MEMBER -.Ix 0 ref .MEMBER -variables. When they are set and how they are used is described later. -.LP -Four of these variables may be used in sources as well as in shell -scripts. -.Ix 0 def "dynamic source" -.Ix 0 def source dynamic -These are ``.TARGET'', ``.PREFIX'', ``.ARCHIVE'' and ``.MEMBER''. The -variables in the sources are expanded once for each target on the -dependency line, providing what is known as a ``dynamic source,'' -.Rd 0 -allowing you to specify several dependency lines at once. For example, -.DS -$(OBJS) : $(.PREFIX).c -.DE -will create a dependency between each object file and its -corresponding C source file. -.xH 3 Command-line Variables -.LP -.Ix 0 def variable command-line -Command-line variables are set when PMake is first invoked by giving a -variable assignment as one of the arguments. For example, -.DS -pmake "CFLAGS = -I/sprite/src/lib/libc -O" -.DE -would make -.CW CFLAGS -be a command-line variable with the given value. Any assignments to -.CW CFLAGS -in the makefile will have no effect, because once it -is set, there is (almost) nothing you can do to change a command-line -variable (the search order, you see). Command-line variables may be -set using any of the four assignment operators, though only -.CW = -and -.CW ?= -behave as you would expect them to, mostly because assignments to -command-line variables are performed before the makefile is read, thus -the values set in the makefile are unavailable at the time. -.CW += -.Ix 0 ref += -.Ix 0 ref variable assignment appended -is the same as -.CW = , -because the old value of the variable is sought only in the scope in -which the assignment is taking place (for reasons of efficiency that I -won't get into here). -.CW := -and -.CW ?= -.Ix 0 ref := -.Ix 0 ref ?= -.Ix 0 ref variable assignment expanded -.Ix 0 ref variable assignment conditional -will work if the only variables used are in the environment. -.CW != -is sort of pointless to use from the command line, since the same -effect can no doubt be accomplished using the shell's own command -substitution mechanisms (backquotes and all that). -.xH 3 Global Variables -.LP -.Ix 0 def variable global -Global variables are those set or appended-to in the makefile. -There are two classes of global variables: those you set and those PMake sets. -As I said before, the ones you set can have any name you want them to have, -except they may not contain a colon or an exclamation point. -The variables PMake sets (almost) always begin with a -period and always contain upper-case letters, only. The variables are -as follows: -.RS -.IP .PMAKE -.Ix 0 def variable global .PMAKE -.Ix 0 def .PMAKE -.Ix 0 def variable global MAKE -.Ix 0 def MAKE -The name by which PMake was invoked is stored in this variable. For -compatibility, the name is also stored in the MAKE variable. -.IP .MAKEFLAGS -.Ix 0 def variable global .MAKEFLAGS -.Ix 0 def .MAKEFLAGS variable -.Ix 0 def variable global MFLAGS -.Ix 0 def MFLAGS -All the relevant flags with which PMake was invoked. This does not -include such things as -.B \-f -or variable assignments. Again for compatibility, this value is stored -in the MFLAGS variable as well. -.RE -.LP -Two other variables, ``.INCLUDES'' and ``.LIBS,'' are covered in the -section on special targets in chapter 3. -.Ix 0 ref variable global .INCLUDES -.Ix 0 ref variable global .LIBS -.LP -Global variables may be deleted using lines of the form: -.Ix 0 def #undef -.Ix 0 def variable deletion -.DS -#undef \fIvariable\fP -.DE -The -.CW # ' ` -must be the first character on the line. Note that this may only be -done on global variables. -.xH 3 Environment Variables -.LP -.Ix 0 def variable environment -Environment variables are passed by the shell that invoked PMake and -are given by PMake to each shell it invokes. They are expanded like -any other variable, but they cannot be altered in any way. -.LP -One special environment variable, -.CW PMAKE , -.Ix 0 def variable environment PMAKE -is examined by PMake for command-line flags, variable assignments, -etc., it should always use. This variable is examined before the -actual arguments to PMake are. In addition, all flags given to PMake, -either through the -.CW PMAKE -variable or on the command line, are placed in this environment -variable and exported to each shell PMake executes. Thus recursive -invocations of PMake automatically receive the same flags as the -top-most one. -.LP -Using all these variables, you can compress the sample makefile even more: -.DS -OBJS = a.o b.o c.o -program : $(OBJS) - cc $(.ALLSRC) \-o $(.TARGET) -$(OBJS) : defs.h -a.o : a.c - cc \-c a.c -b.o : b.c - cc \-c b.c -c.o : c.c - cc \-c c.c -.DE -.Ix 0 ref variable local .ALLSRC -.Ix 0 ref .ALLSRC -.Ix 0 ref variable local .TARGET -.Ix 0 ref .TARGET -.Rd 3 -.xH 2 Comments -.LP -.Ix 0 def comments -Comments in a makefile start with a `#' character and extend to the -end of the line. They may appear -anywhere you want them, except in a shell command (though the shell -will treat it as a comment, too). If, for some reason, you need to use the `#' -in a variable or on a dependency line, put a backslash in front of it. -PMake will compress the two into a single `#' (Note: this isn't true -if PMake is operating in full-compatibility mode). -.Ix 0 ref flags -M -.Ix 0 ref compatibility -.xH 2 Parallelism -.No -.LP -PMake was specifically designed to re-create several targets at once, -when possible. You do not have to do anything special to cause this to -happen (unless PMake was configured to not act in parallel, in which -case you will have to make use of the -.B \-L -and -.B \-J -flags (see below)), -.Ix 0 ref flags -L -.Ix 0 ref flags -J -but you do have to be careful at times. -.LP -There are several problems you are likely to encounter. One is -that some makefiles (and programs) are written in such a way that it is -impossible for two targets to be made at once. The program -.CW xstr , -for example, -always modifies the files -.CW strings -and -.CW x.c . -There is no way to change it. Thus you cannot run two of them at once -without something being trashed. Similarly, if you have commands -in the makefile that always send output to the same file, you will not -be able to make more than one target at once unless you change the -file you use. You can, for instance, add a -.CW $$$$ -to the end of the file name to tack on the process ID of the shell -executing the command (each -.CW $$ -expands to a single -.CW $ , -thus giving you the shell variable -.CW $$ ). -Since only one shell is used for all the -commands, you'll get the same file name for each command in the -script. -.LP -The other problem comes from improperly-specified dependencies that -worked in Make because of its sequential, depth-first way of examining -them. While I don't want to go into depth on how PMake -works (look in chapter 4 if you're interested), I will warn you that -files in two different ``levels'' of the dependency tree may be -examined in a different order in PMake than they were in Make. For -example, given the makefile -.DS -a : b c -b : d -.DE -PMake will examine the targets in the order -.CW c , -.CW d , -.CW b , -.CW a . -If the makefile's author expected PMake to abort before making -.CW c -if an error occurred while making -.CW b , -or if -.CW b -needed to exist before -.CW c -was made, -s/he will be sorely disappointed. The dependencies are -incomplete, since in both these cases, -.CW c -would depend on -.CW b . -So watch out. -.LP -Another problem you may face is that, while PMake is set up to handle the -output from multiple jobs in a graceful fashion, the same is not so for input. -It has no way to regulate input to different jobs, -so if you use the redirection from -.CW /dev/tty -I mentioned earlier, you must be careful not to run two of the jobs at once. -.xH 2 Writing and Debugging a Makefile -.LP -Now you know most of what's in a makefile, what do you do next? There -are two choices: (1) use one of the uncommonly-available makefile -generators or (2) write your own makefile (I leave out the third choice of -ignoring PMake and doing everything by hand as being beyond the bounds -of common sense). -.LP -When faced with the writing of a makefile, it is usually best to start -from first principles: just what -.I are -you trying to do? What do you want the makefile finally to produce? -.LP -To begin with a somewhat traditional example, let's say you need to -write a makefile to create a program, -.CW expr , -that takes standard infix expressions and converts them to prefix form (for -no readily apparent reason). You've got three source files, in C, that -make up the program: -.CW main.c , -.CW parse.c , -and -.CW output.c . -Harking back to my pithy advice about dependency lines, you write the -first line of the file: -.DS -expr : main.o parse.o output.o -.DE -because you remember -.CW expr -is made from -.CW .o -files, not -.CW .c -files. Similarly for the -.CW .o -files you produce the lines: -.DS -main.o : main.c -parse.o : parse.c -output.o : output.c -main.o parse.o output.o : defs.h -.DE -.LP -Great. You've now got the dependencies specified. What you need now is -commands. These commands, remember, must produce the target on the -dependency line, usually by using the sources you've listed. -You remember about local variables? Good, so it should come -to you as no surprise when you write -.DS -expr : main.o parse.o output.o - cc -o $(.TARGET) $(.ALLSRC) -.DE -Why use the variables? If your program grows to produce postfix -expressions too (which, of course, requires a name change or two), it -is one fewer place you have to change the file. You cannot do this for -the object files, however, because they depend on their corresponding -source files -.I and -.CW defs.h , -thus if you said -.DS - cc -c $(.ALLSRC) -.DE -you'd get (for -.CW main.o ): -.DS - cc -c main.c defs.h -.DE -which is wrong. So you round out the makefile with these lines: -.DS -main.o : main.c - cc -c main.c -parse.o : parse.c - cc -c parse.c -output.o : output.c - cc -c output.c -.DE -.LP -The makefile is now complete and will, in fact, create the program you -want it to without unnecessary compilations or excessive typing on -your part. There are two things wrong with it, however (aside from it -being altogether too long, something I'll address in chapter 3): -.IP 1) -The string -.CW "main.o parse.o output.o" '' `` -is repeated twice, necessitating two changes when you add postfix -(you were planning on that, weren't you?). This is in direct violation -of de Boor's First Rule of writing makefiles: -.QP -.I -Anything that needs to be written more than once -should be placed in a variable. -.IP "\&" -I cannot emphasize this enough as being very important to the -maintenance of a makefile and its program. -.IP 2) -There is no way to alter the way compilations are performed short of -editing the makefile and making the change in all places. This is evil -and violates de Boor's Second Rule, which follows directly from the -first: -.QP -.I -Any flags or programs used inside a makefile should be placed in a variable so -they may be changed, temporarily or permanently, with the greatest ease. -.LP -The makefile should more properly read: -.DS -OBJS = main.o parse.o output.o -expr : $(OBJS) - $(CC) $(CFLAGS) -o $(.TARGET) $(.ALLSRC) -main.o : main.c - $(CC) $(CFLAGS) -c main.c -parse.o : parse.c - $(CC) $(CFLAGS) -c parse.c -output.o : output.c - $(CC) $(CFLAGS) -c output.c -$(OBJS) : defs.h -.DE -Alternatively, if you like the idea of dynamic sources mentioned in -section 2.3.1, -.Rm 0 2.3.1 -.Rd 4 -.Ix 0 ref "dynamic source" -.Ix 0 ref source dynamic -you could write it like this: -.DS -OBJS = main.o parse.o output.o -expr : $(OBJS) - $(CC) $(CFLAGS) -o $(.TARGET) $(.ALLSRC) -$(OBJS) : $(.PREFIX).c defs.h - $(CC) $(CFLAGS) -c $(.PREFIX).c -.DE -These two rules and examples lead to de Boor's First Corollary: -.QP -.I -Variables are your friends. -.LP -Once you've written the makefile comes the sometimes-difficult task of -.Ix 0 ref debugging -making sure the darn thing works. Your most helpful tool to make sure -the makefile is at least syntactically correct is the -.B \-n -.Ix 0 ref flags -n -flag, which allows you to see if PMake will choke on the makefile. The -second thing the -.B \-n -flag lets you do is see what PMake would do without it actually doing -it, thus you can make sure the right commands would be executed were -you to give PMake its head. -.LP -When you find your makefile isn't behaving as you hoped, the first -question that comes to mind (after ``What time is it, anyway?'') is -``Why not?'' In answering this, two flags will serve you well: -.CW "-d m" '' `` -.Ix 0 ref flags -d -and -.CW "-p 2" .'' `` -.Ix 0 ref flags -p -The first causes PMake to tell you as it examines each target in the -makefile and indicate why it is deciding whatever it is deciding. You -can then use the information printed for other targets to see where -you went wrong. The -.CW "-p 2" '' `` -flag makes PMake print out its internal state when it is done, -allowing you to see that you forgot to make that one chapter depend on -that file of macros you just got a new version of. The output from -.CW "-p 2" '' `` -is intended to resemble closely a real makefile, but with additional -information provided and with variables expanded in those commands -PMake actually printed or executed. -.LP -Something to be especially careful about is circular dependencies. -.Ix 0 def dependency circular -E.g. -.DS -a : b -b : c d -d : a -.DE -In this case, because of how PMake works, -.CW c -is the only thing PMake will examine, because -.CW d -and -.CW a -will effectively fall off the edge of the universe, making it -impossible to examine -.CW b -(or them, for that matter). -PMake will tell you (if run in its normal mode) all the targets -involved in any cycle it looked at (i.e. if you have two cycles in the -graph (naughty, naughty), but only try to make a target in one of -them, PMake will only tell you about that one. You'll have to try to -make the other to find the second cycle). When run as Make, it will -only print the first target in the cycle. -.xH 2 Invoking PMake -.LP -.Ix 0 ref flags -.Ix 0 ref arguments -.Ix 0 ref usage -PMake comes with a wide variety of flags to choose from. -They may appear in any order, interspersed with command-line variable -assignments and targets to create. -The flags are as follows: -.IP "\fB\-d\fP \fIwhat\fP" -.Ix 0 def flags -d -.Ix 0 ref debugging -This causes PMake to spew out debugging information that -may prove useful to you. If you can't -figure out why PMake is doing what it's doing, you might try using -this flag. The -.I what -parameter is a string of single characters that tell PMake what -aspects you are interested in. Most of what I describe will make -little sense to you, unless you've dealt with Make before. Just -remember where this table is and come back to it as you read on. -The characters and the information they produce are as follows: -.RS -.IP a -Archive searching and caching. -.IP c -Conditional evaluation. -.IP d -The searching and caching of directories. -.IP j -Various snippets of information related to the running of the multiple -shells. Not particularly interesting. -.IP m -The making of each target: what target is being examined; when it was -last modified; whether it is out-of-date; etc. -.IP p -Makefile parsing. -.IP r -Remote execution. -.IP s -The application of suffix-transformation rules. (See chapter 3) -.IP t -The maintenance of the list of targets. -.IP v -Variable assignment. -.RE -.IP "\&" -Of these all, the -.CW m -and -.CW s -letters will be most useful to you. -If the -.B \-d -is the final argument or the argument from which it would get these -key letters (see below for a note about which argument would be used) -begins with a -.B \- , -all of these debugging flags will be set, resulting in massive amounts -of output. -.IP "\fB\-f\fP \fImakefile\fP" -.Ix 0 def flags -f -Specify a makefile to read different from the standard makefiles -.CW Makefile "\&" ( -or -.CW makefile ). -.Ix 0 ref makefile default -.Ix 0 ref makefile other -If -.I makefile -is ``\-'', PMake uses the standard input. This is useful for making -quick and dirty makefiles.\|.\|. -.Ix 0 ref makefile "quick and dirty" -.IP \fB\-h\fP -.Ix 0 def flags -h -Prints out a summary of the various flags PMake accepts. It can also -be used to find out what level of concurrency was compiled into the -version of PMake you are using (look at -.B \-J -and -.B \-L ) -and various other information on how PMake was configured. -.Ix 0 ref configuration -.Ix 0 ref makefilesystem -.IP \fB\-i\fP -.Ix 0 def flags -i -If you give this flag, PMake will ignore non-zero status returned -by any of its shells. It's like placing a `\-' before all the commands -in the makefile. -.IP \fB\-k\fP -.Ix 0 def flags -k -This is similar to -.B \-i -in that it allows PMake to continue when it sees an error, but unlike -.B \-i , -where PMake continues blithely as if nothing went wrong, -.B \-k -causes it to recognize the error and only continue work on those -things that don't depend on the target, either directly or indirectly (through -depending on something that depends on it), whose creation returned the error. -The `k' is for ``keep going''.\|.\|. -.Ix 0 ref target -.IP \fB\-l\fP -.Ix 0 def flags -l -PMake has the ability to lock a directory against other -people executing it in the same directory (by means of a file called -``LOCK.make'' that it creates and checks for in the directory). This -is a Good Thing because two people doing the same thing in the same place -can be disastrous for the final product (too many cooks and all that). -Whether this locking is the default is up to your system -administrator. If locking is on, -.B \-l -will turn it off, and vice versa. Note that this locking will not -prevent \fIyou\fP from invoking PMake twice in the same place \*- if -you own the lock file, PMake will warn you about it but continue to execute. -.IP "\fB\-m\fP \fIdirectory\fP" -.Ix 0 def flags -m -Tells PMake another place to search for included makefiles via the <...> -style. Several -.B \-m -options can be given to form a search path. If this construct is used the -default system makefile search path is completely overridden. -To be explained in chapter 3, section 3.2. -.Rm 2 3.2 -.IP \fB\-n\fP -.Ix 0 def flags -n -This flag tells PMake not to execute the commands needed to update the -out-of-date targets in the makefile. Rather, PMake will simply print -the commands it would have executed and exit. This is particularly -useful for checking the correctness of a makefile. If PMake doesn't do -what you expect it to, it's a good chance the makefile is wrong. -.IP "\fB\-p\fP \fInumber\fP" -.Ix 0 def flags -p -.Ix 0 ref debugging -This causes PMake to print its input in a reasonable form, though -not necessarily one that would make immediate sense to anyone but me. The -.I number -is a bitwise-or of 1 and 2 where 1 means it should print the input -before doing any processing and 2 says it should print it after -everything has been re-created. Thus -.CW "\-p 3" -would print it twice\*-once before processing and once after (you -might find the difference between the two interesting). This is mostly -useful to me, but you may find it informative in some bizarre circumstances. -.IP \fB\-q\fP -.Ix 0 def flags -q -If you give PMake this flag, it will not try to re-create anything. It -will just see if anything is out-of-date and exit non-zero if so. -.IP \fB\-r\fP -.Ix 0 def flags -r -When PMake starts up, it reads a default makefile that tells it what -sort of system it's on and gives it some idea of what to do if you -don't tell it anything. I'll tell you about it in chapter 3. If you -give this flag, PMake won't read the default makefile. -.IP \fB\-s\fP -.Ix 0 def flags -s -This causes PMake to not print commands before they're executed. It -is the equivalent of putting an `@' before every command in the -makefile. -.IP \fB\-t\fP -.Ix 0 def flags -t -Rather than try to re-create a target, PMake will simply ``touch'' it -so as to make it appear up-to-date. If the target didn't exist before, -it will when PMake finishes, but if the target did exist, it will -appear to have been updated. -.IP \fB\-v\fP -.Ix 0 def flags -v -This is a mixed-compatibility flag intended to mimic the System V -version of Make. It is the same as giving -.B \-B , -and -.B \-V -as well as turning off directory locking. Targets can still be created -in parallel, however. This is the mode PMake will enter if it is -invoked either as -.CW smake '' `` -or -.CW vmake ''. `` -.IP \fB\-x\fP -.Ix 0 def flags -x -This tells PMake it's ok to export jobs to other machines, if they're -available. It is used when running in Make mode, as exporting in this -mode tends to make things run slower than if the commands were just -executed locally. -.IP \fB\-B\fP -.Ix 0 ref compatibility -.Ix 0 def flags -B -Forces PMake to be as backwards-compatible with Make as possible while -still being itself. -This includes: -.RS -.IP \(bu 2 -Executing one shell per shell command -.IP \(bu 2 -Expanding anything that looks even vaguely like a variable, with the -empty string replacing any variable PMake doesn't know. -.IP \(bu 2 -Refusing to allow you to escape a `#' with a backslash. -.IP \(bu 2 -Permitting undefined variables on dependency lines and conditionals -(see below). Normally this causes PMake to abort. -.RE -.IP \fB\-C\fP -.Ix 0 def flags -C -This nullifies any and all compatibility mode flags you may have given -or implied up to the time the -.B \-C -is encountered. It is useful mostly in a makefile that you wrote for PMake -to avoid bad things happening when someone runs PMake as -.CW make '' `` -or has things set in the environment that tell it to be compatible. -.B \-C -is -.I not -placed in the -.CW PMAKE -environment variable or the -.CW .MAKEFLAGS -or -.CW MFLAGS -global variables. -.Ix 0 ref variable environment PMAKE -.Ix 0 ref variable global .MAKEFLAGS -.Ix 0 ref variable global MFLAGS -.Ix 0 ref .MAKEFLAGS variable -.Ix 0 ref MFLAGS -.IP "\fB\-D\fP \fIvariable\fP" -.Ix 0 def flags -D -Allows you to define a variable to have -.CW 1 '' `` -as its value. The variable is a global variable, not a command-line -variable. This is useful mostly for people who are used to the C -compiler arguments and those using conditionals, which I'll get into -in section 4.3 -.Rm 1 4.3 -.IP "\fB\-I\fP \fIdirectory\fP" -.Ix 0 def flags -I -Tells PMake another place to search for included makefiles. Yet -another thing to be explained in chapter 3 (section 3.2, to be -precise). -.Rm 2 3.2 -.IP "\fB\-J\fP \fInumber\fP" -.Ix 0 def flags -J -Gives the absolute maximum number of targets to create at once on both -local and remote machines. -.IP "\fB\-L\fP \fInumber\fP" -.Ix 0 def flags -L -This specifies the maximum number of targets to create on the local -machine at once. This may be 0, though you should be wary of doing -this, as PMake may hang until a remote machine becomes available, if -one is not available when it is started. -.IP \fB\-M\fP -.Ix 0 ref compatibility -.Ix 0 def flags -M -This is the flag that provides absolute, complete, full compatibility -with Make. It still allows you to use all but a few of the features of -PMake, but it is non-parallel. This is the mode PMake enters if you -call it -.CW make .'' `` -.IP \fB\-P\fP -.Ix 0 def flags -P -.Ix 0 ref "output control" -When creating targets in parallel, several shells are executing at -once, each wanting to write its own two cent's-worth to the screen. -This output must be captured by PMake in some way in order to prevent -the screen from being filled with garbage even more indecipherable -than you usually see. PMake has two ways of doing this, one of which -provides for much cleaner output and a clear separation between the -output of different jobs, the other of which provides a more immediate -response so one can tell what is really happening. The former is done -by notifying you when the creation of a target starts, capturing the -output and transferring it to the screen all at once when the job -finishes. The latter is done by catching the output of the shell (and -its children) and buffering it until an entire line is received, then -printing that line preceded by an indication of which job produced -the output. Since I prefer this second method, it is the one used by -default. The first method will be used if you give the -.B \-P -flag to PMake. -.IP \fB\-V\fP -.Ix 0 def flags -V -As mentioned before, the -.B \-V -flag tells PMake to use Make's style of expanding variables, -substituting the empty string for any variable it doesn't know. -.IP \fB\-W\fP -.Ix 0 def flags -W -There are several times when PMake will print a message at you that is -only a warning, i.e. it can continue to work in spite of your having -done something silly (such as forgotten a leading tab for a shell -command). Sometimes you are well aware of silly things you have done -and would like PMake to stop bothering you. This flag tells it to shut -up about anything non-fatal. -.IP \fB\-X\fP -.Ix 0 def flags -X -This flag causes PMake to not attempt to export any jobs to another -machine. -.LP -Several flags may follow a single `\-'. Those flags that require -arguments take them from successive parameters. E.g. -.DS -pmake -fDnI server.mk DEBUG /chip2/X/server/include -.DE -will cause PMake to read -.CW server.mk -as the input makefile, define the variable -.CW DEBUG -as a global variable and look for included makefiles in the directory -.CW /chip2/X/server/include . -.xH 2 Summary -.LP -A makefile is made of four types of lines: -.RS -.IP \(bu 2 -Dependency lines -.IP \(bu 2 -Creation commands -.IP \(bu 2 -Variable assignments -.IP \(bu 2 -Comments, include statements and conditional directives -.RE -.LP -A dependency line is a list of one or more targets, an operator -.CW : ', (` -.CW :: ', ` -or -.CW ! '), ` -and a list of zero or more sources. Sources may contain wildcards and -certain local variables. -.LP -A creation command is a regular shell command preceded by a tab. In -addition, if the first two characters after the tab (and other -whitespace) are a combination of -.CW @ ' ` -or -.CW - ', ` -PMake will cause the command to not be printed (if the character is -.CW @ ') ` -or errors from it to be ignored (if -.CW - '). ` -A blank line, dependency line or variable assignment terminates a -creation script. There may be only one creation script for each target -with a -.CW : ' ` -or -.CW ! ' ` -operator. -.LP -Variables are places to store text. They may be unconditionally -assigned-to using the -.CW = ' ` -.Ix 0 ref = -.Ix 0 ref variable assignment -operator, appended-to using the -.CW += ' ` -.Ix 0 ref += -.Ix 0 ref variable assignment appended -operator, conditionally (if the variable is undefined) assigned-to -with the -.CW ?= ' ` -.Ix 0 ref ?= -.Ix 0 ref variable assignment conditional -operator, and assigned-to with variable expansion with the -.CW := ' ` -.Ix 0 ref := -.Ix 0 ref variable assignment expanded -operator. The output of a shell command may be assigned to a variable -using the -.CW != ' ` -.Ix 0 ref != -.Ix 0 ref variable assignment shell-output -operator. Variables may be expanded (their value inserted) by enclosing -their name in parentheses or curly braces, preceded by a dollar sign. -A dollar sign may be escaped with another dollar sign. Variables are -not expanded if PMake doesn't know about them. There are seven local -variables: -.CW .TARGET , -.CW .ALLSRC , -.CW .OODATE , -.CW .PREFIX , -.CW .IMPSRC , -.CW .ARCHIVE , -and -.CW .MEMBER . -Four of them -.CW .TARGET , ( -.CW .PREFIX , -.CW .ARCHIVE , -and -.CW .MEMBER ) -may be used to specify ``dynamic sources.'' -.Ix 0 ref "dynamic source" -.Ix 0 ref source dynamic -Variables are good. Know them. Love them. Live them. -.LP -Debugging of makefiles is best accomplished using the -.B \-n , -.B "\-d m" , -and -.B "\-p 2" -flags. -.xH 2 Exercises -.ce -\s+4\fBTBA\fP\s0 -.xH 1 Short-cuts and Other Nice Things -.LP -Based on what I've told you so far, you may have gotten the impression -that PMake is just a way of storing away commands and making sure you -don't forget to compile something. Good. That's just what it is. -However, the ways I've described have been inelegant, at best, and -painful, at worst. -This chapter contains things that make the -writing of makefiles easier and the makefiles themselves shorter and -easier to modify (and, occasionally, simpler). In this chapter, I -assume you are somewhat more -familiar with Sprite (or UNIX, if that's what you're using) than I did -in chapter 2, just so you're on your toes. -So without further ado... -.xH 2 Transformation Rules -.LP -As you know, a file's name consists of two parts: a base name, which -gives some hint as to the contents of the file, and a suffix, which -usually indicates the format of the file. -Over the years, as -.UX -has developed, -naming conventions, with regard to suffixes, have also developed that have -become almost as incontrovertible as Law. E.g. a file ending in -.CW .c -is assumed to contain C source code; one with a -.CW .o -suffix is assumed to be a compiled, relocatable object file that may -be linked into any program; a file with a -.CW .ms -suffix is usually a text file to be processed by Troff with the \-ms -macro package, and so on. -One of the best aspects of both Make and PMake comes from their -understanding of how the suffix of a file pertains to its contents and -their ability to do things with a file based solely on its suffix. This -ability comes from something known as a transformation rule. A -transformation rule specifies how to change a file with one suffix -into a file with another suffix. -.LP -A transformation rule looks much like a dependency line, except the -target is made of two known suffixes stuck together. Suffixes are made -known to PMake by placing them as sources on a dependency line whose -target is the special target -.CW .SUFFIXES . -E.g. -.DS -\&.SUFFIXES : .o .c -\&.c.o : - $(CC) $(CFLAGS) -c $(.IMPSRC) -.DE -The creation script attached to the target is used to transform a file with -the first suffix (in this case, -.CW .c ) -into a file with the second suffix (here, -.CW .o ). -In addition, the target inherits whatever attributes have been applied -to the transformation rule. -The simple rule given above says that to transform a C source file -into an object file, you compile it using -.CW cc -with the -.CW \-c -flag. -This rule is taken straight from the system makefile. Many -transformation rules (and suffixes) are defined there, and I refer you -to it for more examples (type -.CW "pmake -h" '' `` -to find out where it is). -.LP -There are several things to note about the transformation rule given -above: -.RS -.IP 1) -The -.CW .IMPSRC -variable. -.Ix 0 def variable local .IMPSRC -.Ix 0 def .IMPSRC -This variable is set to the ``implied source'' (the file from which -the target is being created; the one with the first suffix), which, in this -case, is the .c file. -.IP 2) -The -.CW CFLAGS -variable. Almost all of the transformation rules in the system -makefile are set up using variables that you can alter in your -makefile to tailor the rule to your needs. In this case, if you want -all your C files to be compiled with the -.B \-g -flag, to provide information for -.CW dbx , -you would set the -.CW CFLAGS -variable to contain -.CW -g -.CW "CFLAGS = -g" '') (`` -and PMake would take care of the rest. -.RE -.LP -To give you a quick example, the makefile in 2.3.4 -.Rm 3 2.3.4 -could be changed to this: -.DS -OBJS = a.o b.o c.o -program : $(OBJS) - $(CC) -o $(.TARGET) $(.ALLSRC) -$(OBJS) : defs.h -.DE -The transformation rule I gave above takes the place of the 6 lines\** -.FS -This is also somewhat cleaner, I think, than the dynamic source -solution presented in 2.6 -.FE -.Rm 4 2.6 -.DS -a.o : a.c - cc -c a.c -b.o : b.c - cc -c b.c -c.o : c.c - cc -c c.c -.DE -.LP -Now you may be wondering about the dependency between the -.CW .o -and -.CW .c -files \*- it's not mentioned anywhere in the new makefile. This is -because it isn't needed: one of the effects of applying a -transformation rule is the target comes to depend on the implied -source. That's why it's called the implied -.I source . -.LP -For a more detailed example. Say you have a makefile like this: -.DS -a.out : a.o b.o - $(CC) $(.ALLSRC) -.DE -and a directory set up like this: -.DS -total 4 --rw-rw-r-- 1 deboor 34 Sep 7 00:43 Makefile --rw-rw-r-- 1 deboor 119 Oct 3 19:39 a.c --rw-rw-r-- 1 deboor 201 Sep 7 00:43 a.o --rw-rw-r-- 1 deboor 69 Sep 7 00:43 b.c -.DE -While just typing -.CW pmake '' `` -will do the right thing, it's much more informative to type -.CW "pmake -d s" ''. `` -This will show you what PMake is up to as it processes the files. In -this case, PMake prints the following: -.DS -Suff_FindDeps (a.out) - using existing source a.o - applying .o -> .out to "a.o" -Suff_FindDeps (a.o) - trying a.c...got it - applying .c -> .o to "a.c" -Suff_FindDeps (b.o) - trying b.c...got it - applying .c -> .o to "b.c" -Suff_FindDeps (a.c) - trying a.y...not there - trying a.l...not there - trying a.c,v...not there - trying a.y,v...not there - trying a.l,v...not there -Suff_FindDeps (b.c) - trying b.y...not there - trying b.l...not there - trying b.c,v...not there - trying b.y,v...not there - trying b.l,v...not there ---- a.o --- -cc -c a.c ---- b.o --- -cc -c b.c ---- a.out --- -cc a.o b.o -.DE -.LP -.CW Suff_FindDeps -is the name of a function in PMake that is called to check for implied -sources for a target using transformation rules. -The transformations it tries are, naturally -enough, limited to the ones that have been defined (a transformation -may be defined multiple times, by the way, but only the most recent -one will be used). You will notice, however, that there is a definite -order to the suffixes that are tried. This order is set by the -relative positions of the suffixes on the -.CW .SUFFIXES -line \*- the earlier a suffix appears, the earlier it is checked as -the source of a transformation. Once a suffix has been defined, the -only way to change its position in the pecking order is to remove all -the suffixes (by having a -.CW .SUFFIXES -dependency line with no sources) and redefine them in the order you -want. (Previously-defined transformation rules will be automatically -redefined as the suffixes they involve are re-entered.) -.LP -Another way to affect the search order is to make the dependency -explicit. In the above example, -.CW a.out -depends on -.CW a.o -and -.CW b.o . -Since a transformation exists from -.CW .o -to -.CW .out , -PMake uses that, as indicated by the -.CW "using existing source a.o" '' `` -message. -.LP -The search for a transformation starts from the suffix of the target -and continues through all the defined transformations, in the order -dictated by the suffix ranking, until an existing file with the same -base (the target name minus the suffix and any leading directories) is -found. At that point, one or more transformation rules will have been -found to change the one existing file into the target. -.LP -For example, ignoring what's in the system makefile for now, say you -have a makefile like this: -.DS -\&.SUFFIXES : .out .o .c .y .l -\&.l.c : - lex $(.IMPSRC) - mv lex.yy.c $(.TARGET) -\&.y.c : - yacc $(.IMPSRC) - mv y.tab.c $(.TARGET) -\&.c.o : - cc -c $(.IMPSRC) -\&.o.out : - cc -o $(.TARGET) $(.IMPSRC) -.DE -and the single file -.CW jive.l . -If you were to type -.CW "pmake -rd ms jive.out" ,'' `` -you would get the following output for -.CW jive.out : -.DS -Suff_FindDeps (jive.out) - trying jive.o...not there - trying jive.c...not there - trying jive.y...not there - trying jive.l...got it - applying .l -> .c to "jive.l" - applying .c -> .o to "jive.c" - applying .o -> .out to "jive.o" -.DE -and this is why: PMake starts with the target -.CW jive.out , -figures out its suffix -.CW .out ) ( -and looks for things it can transform to a -.CW .out -file. In this case, it only finds -.CW .o , -so it looks for the file -.CW jive.o . -It fails to find it, so it looks for transformations into a -.CW .o -file. Again it has only one choice: -.CW .c . -So it looks for -.CW jive.c -and, as you know, fails to find it. At this point it has two choices: -it can create the -.CW .c -file from either a -.CW .y -file or a -.CW .l -file. Since -.CW .y -came first on the -.CW .SUFFIXES -line, it checks for -.CW jive.y -first, but can't find it, so it looks for -.CW jive.l -and, lo and behold, there it is. -At this point, it has defined a transformation path as follows: -.CW .l -\(-> -.CW .c -\(-> -.CW .o -\(-> -.CW .out -and applies the transformation rules accordingly. For completeness, -and to give you a better idea of what PMake actually did with this -three-step transformation, this is what PMake printed for the rest of -the process: -.DS -Suff_FindDeps (jive.o) - using existing source jive.c - applying .c -> .o to "jive.c" -Suff_FindDeps (jive.c) - using existing source jive.l - applying .l -> .c to "jive.l" -Suff_FindDeps (jive.l) -Examining jive.l...modified 17:16:01 Oct 4, 1987...up-to-date -Examining jive.c...non-existent...out-of-date ---- jive.c --- -lex jive.l -\&.\|.\|. meaningless lex output deleted .\|.\|. -mv lex.yy.c jive.c -Examining jive.o...non-existent...out-of-date ---- jive.o --- -cc -c jive.c -Examining jive.out...non-existent...out-of-date ---- jive.out --- -cc -o jive.out jive.o -.DE -.LP -One final question remains: what does PMake do with targets that have -no known suffix? PMake simply pretends it actually has a known suffix -and searches for transformations accordingly. -The suffix it chooses is the source for the -.CW .NULL -.Ix 0 ref .NULL -target mentioned later. In the system makefile, -.CW .out -is chosen as the ``null suffix'' -.Ix 0 def suffix null -.Ix 0 def "null suffix" -because most people use PMake to create programs. You are, however, -free and welcome to change it to a suffix of your own choosing. -The null suffix is ignored, however, when PMake is in compatibility -mode (see chapter 4). -.xH 2 Including Other Makefiles -.Ix 0 def makefile inclusion -.Rd 2 -.LP -Just as for programs, it is often useful to extract certain parts of a -makefile into another file and just include it in other makefiles -somehow. Many compilers allow you say something like -.DS -#include "defs.h" -.DE -to include the contents of -.CW defs.h -in the source file. PMake allows you to do the same thing for -makefiles, with the added ability to use variables in the filenames. -An include directive in a makefile looks either like this: -.DS -#include -.DE -or this -.DS -#include "file" -.DE -The difference between the two is where PMake searches for the file: -the first way, PMake will look for -the file only in the system makefile directory (or directories) -(to find out what that directory is, give PMake the -.B \-h -flag). -.Ix 0 ref flags -h -The system makefile directory search path can be overridden via the -.B \-m -option. -.Ix 0 ref flags -m -For files in double-quotes, the search is more complex: -.RS -.IP 1) -The directory of the makefile that's including the file. -.IP 2) -The current directory (the one in which you invoked PMake). -.IP 3) -The directories given by you using -.B \-I -flags, in the order in which you gave them. -.IP 4) -Directories given by -.CW .PATH -dependency lines (see chapter 4). -.IP 5) -The system makefile directory. -.RE -.LP -in that order. -.LP -You are free to use PMake variables in the filename\*-PMake will -expand them before searching for the file. You must specify the -searching method with either angle brackets or double-quotes -.I outside -of a variable expansion. I.e. the following -.DS -SYSTEM = - -#include $(SYSTEM) -.DE -won't work. -.xH 2 Saving Commands -.LP -.Ix 0 def ... -There may come a time when you will want to save certain commands to -be executed when everything else is done. For instance: you're -making several different libraries at one time and you want to create the -members in parallel. Problem is, -.CW ranlib -is another one of those programs that can't be run more than once in -the same directory at the same time (each one creates a file called -.CW __.SYMDEF -into which it stuffs information for the linker to use. Two of them -running at once will overwrite each other's file and the result will -be garbage for both parties). You might want a way to save the ranlib -commands til the end so they can be run one after the other, thus -keeping them from trashing each other's file. PMake allows you to do -this by inserting an ellipsis (``.\|.\|.'') as a command between -commands to be run at once and those to be run later. -.LP -So for the -.CW ranlib -case above, you might do this: -.Rd 5 -.DS -lib1.a : $(LIB1OBJS) - rm -f $(.TARGET) - ar cr $(.TARGET) $(.ALLSRC) - ... - ranlib $(.TARGET) - -lib2.a : $(LIB2OBJS) - rm -f $(.TARGET) - ar cr $(.TARGET) $(.ALLSRC) - ... - ranlib $(.TARGET) -.DE -.Ix 0 ref variable local .TARGET -.Ix 0 ref variable local .ALLSRC -This would save both -.DS -ranlib $(.TARGET) -.DE -commands until the end, when they would run one after the other -(using the correct value for the -.CW .TARGET -variable, of course). -.LP -Commands saved in this manner are only executed if PMake manages to -re-create everything without an error. -.xH 2 Target Attributes -.LP -PMake allows you to give attributes to targets by means of special -sources. Like everything else PMake uses, these sources begin with a -period and are made up of all upper-case letters. There are various -reasons for using them, and I will try to give examples for most of -them. Others you'll have to find uses for yourself. Think of it as ``an -exercise for the reader.'' By placing one (or more) of these as a source on a -dependency line, you are ``marking the target(s) with that -attribute.'' That's just the way I phrase it, so you know. -.LP -Any attributes given as sources for a transformation rule are applied -to the target of the transformation rule when the rule is applied. -.Ix 0 def attributes -.Ix 0 ref source -.Ix 0 ref target -.nr pw 12 -.IP .DONTCARE \n(pw -.Ix 0 def attributes .DONTCARE -.Ix 0 def .DONTCARE -If a target is marked with this attribute and PMake can't figure out -how to create it, it will ignore this fact and assume the file isn't -really needed or actually exists and PMake just can't find it. This may prove -wrong, but the error will be noted later on, not when PMake tries to create -the target so marked. This attribute also prevents PMake from -attempting to touch the target if it is given the -.B \-t -flag. -.Ix 0 ref flags -t -.IP .EXEC \n(pw -.Ix 0 def attributes .EXEC -.Ix 0 def .EXEC -This attribute causes its shell script to be executed while having no -effect on targets that depend on it. This makes the target into a sort -of subroutine. An example. Say you have some LISP files that need to -be compiled and loaded into a LISP process. To do this, you echo LISP -commands into a file and execute a LISP with this file as its input -when everything's done. Say also that you have to load other files -from another system before you can compile your files and further, -that you don't want to go through the loading and dumping unless one -of -.I your -files has changed. Your makefile might look a little bit -like this (remember, this is an educational example, and don't worry -about the -.CW COMPILE -rule, all will soon become clear, grasshopper): -.DS -system : init a.fasl b.fasl c.fasl - for i in $(.ALLSRC); - do - echo -n '(load "' >> input - echo -n ${i} >> input - echo '")' >> input - done - echo '(dump "$(.TARGET)")' >> input - lisp < input - -a.fasl : a.l init COMPILE -b.fasl : b.l init COMPILE -c.fasl : c.l init COMPILE -COMPILE : .USE - echo '(compile "$(.ALLSRC)")' >> input -init : .EXEC - echo '(load-system)' > input -.DE -.Ix 0 ref .USE -.Ix 0 ref attributes .USE -.Ix 0 ref variable local .ALLSRC -.IP "\&" -.CW .EXEC -sources, don't appear in the local variables of targets that depend on -them (nor are they touched if PMake is given the -.B \-t -flag). -.Ix 0 ref flags -t -Note that all the rules, not just that for -.CW system , -include -.CW init -as a source. This is because none of the other targets can be made -until -.CW init -has been made, thus they depend on it. -.IP .EXPORT \n(pw -.Ix 0 def attributes .EXPORT -.Ix 0 def .EXPORT -This is used to mark those targets whose creation should be sent to -another machine if at all possible. This may be used by some -exportation schemes if the exportation is expensive. You should ask -your system administrator if it is necessary. -.IP .EXPORTSAME \n(pw -.Ix 0 def attributes .EXPORTSAME -.Ix 0 def .EXPORTSAME -Tells the export system that the job should be exported to a machine -of the same architecture as the current one. Certain operations (e.g. -running text through -.CW nroff ) -can be performed the same on any architecture (CPU and -operating system type), while others (e.g. compiling a program with -.CW cc ) -must be performed on a machine with the same architecture. Not all -export systems will support this attribute. -.IP .IGNORE \n(pw -.Ix 0 def attributes .IGNORE -.Ix 0 def .IGNORE attribute -Giving a target the -.CW .IGNORE -attribute causes PMake to ignore errors from any of the target's commands, as -if they all had `\-' before them. -.IP .INVISIBLE \n(pw -.Ix 0 def attributes .INVISIBLE -.Ix 0 def .INVISIBLE -This allows you to specify one target as a source for another without -the one affecting the other's local variables. Useful if, say, you -have a makefile that creates two programs, one of which is used to -create the other, so it must exist before the other is created. You -could say -.DS -prog1 : $(PROG1OBJS) prog2 MAKEINSTALL -prog2 : $(PROG2OBJS) .INVISIBLE MAKEINSTALL -.DE -where -.CW MAKEINSTALL -is some complex .USE rule (see below) that depends on the -.Ix 0 ref .USE -.CW .ALLSRC -variable containing the right things. Without the -.CW .INVISIBLE -attribute for -.CW prog2 , -the -.CW MAKEINSTALL -rule couldn't be applied. This is not as useful as it should be, and -the semantics may change (or the whole thing go away) in the -not-too-distant future. -.IP .JOIN \n(pw -.Ix 0 def attributes .JOIN -.Ix 0 def .JOIN -This is another way to avoid performing some operations in parallel -while permitting everything else to be done so. Specifically it -forces the target's shell script to be executed only if one or more of the -sources was out-of-date. In addition, the target's name, -in both its -.CW .TARGET -variable and all the local variables of any target that depends on it, -is replaced by the value of its -.CW .ALLSRC -variable. -As an example, suppose you have a program that has four libraries that -compile in the same directory along with, and at the same time as, the -program. You again have the problem with -.CW ranlib -that I mentioned earlier, only this time it's more severe: you -can't just put the ranlib off to the end since the program -will need those libraries before it can be re-created. You can do -something like this: -.DS -program : $(OBJS) libraries - cc -o $(.TARGET) $(.ALLSRC) - -libraries : lib1.a lib2.a lib3.a lib4.a .JOIN - ranlib $(.OODATE) -.DE -.Ix 0 ref variable local .TARGET -.Ix 0 ref variable local .ALLSRC -.Ix 0 ref variable local .OODATE -.Ix 0 ref .TARGET -.Ix 0 ref .ALLSRC -.Ix 0 ref .OODATE -In this case, PMake will re-create the -.CW $(OBJS) -as necessary, along with -.CW lib1.a , -.CW lib2.a , -.CW lib3.a -and -.CW lib4.a . -It will then execute -.CW ranlib -on any library that was changed and set -.CW program 's -.CW .ALLSRC -variable to contain what's in -.CW $(OBJS) -followed by -.CW "lib1.a lib2.a lib3.a lib4.a" .'' `` -In case you're wondering, it's called -.CW .JOIN -because it joins together different threads of the ``input graph'' at -the target marked with the attribute. -Another aspect of the .JOIN attribute is it keeps the target from -being created if the -.B \-t -flag was given. -.Ix 0 ref flags -t -.IP .MAKE \n(pw -.Ix 0 def attributes .MAKE -.Ix 0 def .MAKE -The -.CW .MAKE -attribute marks its target as being a recursive invocation of PMake. -This forces PMake to execute the script associated with the target (if -it's out-of-date) even if you gave the -.B \-n -or -.B \-t -flag. By doing this, you can start at the top of a system and type -.DS -pmake -n -.DE -and have it descend the directory tree (if your makefiles are set up -correctly), printing what it would have executed if you hadn't -included the -.B \-n -flag. -.IP .NOEXPORT \n(pw -.Ix 0 def attributes .NOEXPORT -.Ix 0 def .NOEXPORT attribute -If possible, PMake will attempt to export the creation of all targets to -another machine (this depends on how PMake was configured). Sometimes, -the creation is so simple, it is pointless to send it to another -machine. If you give the target the -.CW .NOEXPORT -attribute, it will be run locally, even if you've given PMake the -.B "\-L 0" -flag. -.IP .NOTMAIN \n(pw -.Ix 0 def attributes .NOTMAIN -.Ix 0 def .NOTMAIN -Normally, if you do not specify a target to make in any other way, -PMake will take the first target on the first dependency line of a -makefile as the target to create. That target is known as the ``Main -Target'' and is labeled as such if you print the dependencies out -using the -.B \-p -flag. -.Ix 0 ref flags -p -Giving a target this attribute tells PMake that the target is -definitely -.I not -the Main Target. -This allows you to place targets in an included makefile and -have PMake create something else by default. -.IP .PRECIOUS \n(pw -.Ix 0 def attributes .PRECIOUS -.Ix 0 def .PRECIOUS attribute -When PMake is interrupted (you type control-C at the keyboard), it -will attempt to clean up after itself by removing any half-made -targets. If a target has the -.CW .PRECIOUS -attribute, however, PMake will leave it alone. An additional side -effect of the `::' operator is to mark the targets as -.CW .PRECIOUS . -.Ix 0 ref operator double-colon -.Ix 0 ref :: -.IP .SILENT \n(pw -.Ix 0 def attributes .SILENT -.Ix 0 def .SILENT attribute -Marking a target with this attribute keeps its commands from being -printed when they're executed, just as if they had an `@' in front of them. -.IP .USE \n(pw -.Ix 0 def attributes .USE -.Ix 0 def .USE -By giving a target this attribute, you turn it into PMake's equivalent -of a macro. When the target is used as a source for another target, -the other target acquires the commands, sources and attributes (except -.CW .USE ) -of the source. -If the target already has commands, the -.CW .USE -target's commands are added to the end. If more than one .USE-marked -source is given to a target, the rules are applied sequentially. -.IP "\&" \n(pw -The typical .USE rule (as I call them) will use the sources of the -target to which it is applied (as stored in the -.CW .ALLSRC -variable for the target) as its ``arguments,'' if you will. -For example, you probably noticed that the commands for creating -.CW lib1.a -and -.CW lib2.a -in the example in section 3.3 -.Rm 5 3.3 -were exactly the same. You can use the -.CW .USE -attribute to eliminate the repetition, like so: -.DS -lib1.a : $(LIB1OBJS) MAKELIB -lib2.a : $(LIB2OBJS) MAKELIB - -MAKELIB : .USE - rm -f $(.TARGET) - ar cr $(.TARGET) $(.ALLSRC) - ... - ranlib $(.TARGET) -.DE -.Ix 0 ref variable local .TARGET -.Ix 0 ref variable local .ALLSRC -.IP "\&" \n(pw -Several system makefiles (not to be confused with The System Makefile) -make use of these .USE rules to make your -life easier (they're in the default, system makefile directory...take a look). -Note that the .USE rule source itself -.CW MAKELIB ) ( -does not appear in any of the targets's local variables. -There is no limit to the number of times I could use the -.CW MAKELIB -rule. If there were more libraries, I could continue with -.CW "lib3.a : $(LIB3OBJS) MAKELIB" '' `` -and so on and so forth. -.xH 2 Special Targets -.LP -As there were in Make, so there are certain targets that have special -meaning to PMake. When you use one on a dependency line, it is the -only target that may appear on the left-hand-side of the operator. -.Ix 0 ref target -.Ix 0 ref operator -As for the attributes and variables, all the special targets -begin with a period and consist of upper-case letters only. -I won't describe them all in detail because some of them are rather -complex and I'll describe them in more detail than you'll want in -chapter 4. -The targets are as follows: -.nr pw 10 -.IP .BEGIN \n(pw -.Ix 0 def .BEGIN -Any commands attached to this target are executed before anything else -is done. You can use it for any initialization that needs doing. -.IP .DEFAULT \n(pw -.Ix 0 def .DEFAULT -This is sort of a .USE rule for any target (that was used only as a -source) that PMake can't figure out any other way to create. It's only -``sort of'' a .USE rule because only the shell script attached to the -.CW .DEFAULT -target is used. The -.CW .IMPSRC -variable of a target that inherits -.CW .DEFAULT 's -commands is set to the target's own name. -.Ix 0 ref .IMPSRC -.Ix 0 ref variable local .IMPSRC -.IP .END \n(pw -.Ix 0 def .END -This serves a function similar to -.CW .BEGIN , -in that commands attached to it are executed once everything has been -re-created (so long as no errors occurred). It also serves the extra -function of being a place on which PMake can hang commands you put off -to the end. Thus the script for this target will be executed before -any of the commands you save with the ``.\|.\|.''. -.Ix 0 ref ... -.IP .EXPORT \n(pw -The sources for this target are passed to the exportation system compiled -into PMake. Some systems will use these sources to configure -themselves. You should ask your system administrator about this. -.IP .IGNORE \n(pw -.Ix 0 def .IGNORE target -.Ix 0 ref .IGNORE attribute -.Ix 0 ref attributes .IGNORE -This target marks each of its sources with the -.CW .IGNORE -attribute. If you don't give it any sources, then it is like -giving the -.B \-i -flag when you invoke PMake \*- errors are ignored for all commands. -.Ix 0 ref flags -i -.IP .INCLUDES \n(pw -.Ix 0 def .INCLUDES target -.Ix 0 def variable global .INCLUDES -.Ix 0 def .INCLUDES variable -The sources for this target are taken to be suffixes that indicate a -file that can be included in a program source file. -The suffix must have already been declared with -.CW .SUFFIXES -(see below). -Any suffix so marked will have the directories on its search path -(see -.CW .PATH , -below) placed in the -.CW .INCLUDES -variable, each preceded by a -.B \-I -flag. This variable can then be used as an argument for the compiler -in the normal fashion. The -.CW .h -suffix is already marked in this way in the system makefile. -.Ix 0 ref makefilesystem -E.g. if you have -.DS -\&.SUFFIXES : .bitmap -\&.PATH.bitmap : /usr/local/X/lib/bitmaps -\&.INCLUDES : .bitmap -.DE -PMake will place -.CW "-I/usr/local/X/lib/bitmaps" '' `` -in the -.CW .INCLUDES -variable and you can then say -.DS -cc $(.INCLUDES) -c xprogram.c -.DE -(Note: the -.CW .INCLUDES -variable is not actually filled in until the entire makefile has been read.) -.IP .INTERRUPT \n(pw -.Ix 0 def .INTERRUPT -When PMake is interrupted, -it will execute the commands in the script for this target, if it -exists. -.IP .LIBS \n(pw -.Ix 0 def .LIBS target -.Ix 0 def .LIBS variable -.Ix 0 def variable global .LIBS -This does for libraries what -.CW .INCLUDES -does for include files, except the flag used is -.B \-L , -as required by those linkers that allow you to tell them where to find -libraries. The variable used is -.CW .LIBS . -Be forewarned that PMake may not have been compiled to do this if the -linker on your system doesn't accept the -.B \-L -flag, though the -.CW .LIBS -variable will always be defined once the makefile has been read. -.IP .MAIN \n(pw -.Ix 0 def .MAIN -If you didn't give a target (or targets) to create when you invoked -PMake, it will take the sources of this target as the targets to -create. -.IP .MAKEFLAGS \n(pw -.Ix 0 def .MAKEFLAGS target -This target provides a way for you to always specify flags for PMake -when the makefile is used. The flags are just as they would be typed -to the shell (except you can't use shell variables unless they're in -the environment), -though the -.B \-f -and -.B \-r -flags have no effect. -.IP .NULL \n(pw -.Ix 0 def .NULL -.Ix 0 ref suffix null -.Ix 0 ref "null suffix" -This allows you to specify what suffix PMake should pretend a file has -if, in fact, it has no known suffix. Only one suffix may be so -designated. The last source on the dependency line is the suffix that -is used (you should, however, only give one suffix.\|.\|.). -.IP .PATH \n(pw -.Ix 0 def .PATH -If you give sources for this target, PMake will take them as -directories in which to search for files it cannot find in the current -directory. If you give no sources, it will clear out any directories -added to the search path before. Since the effects of this all get -very complex, I'll leave it til chapter four to give you a complete -explanation. -.IP .PATH\fIsuffix\fP \n(pw -.Ix 0 ref .PATH -This does a similar thing to -.CW .PATH , -but it does it only for files with the given suffix. The suffix must -have been defined already. Look at -.B "Search Paths" -(section 4.1) -.Rm 6 4.1 -for more information. -.IP .PRECIOUS \n(pw -.Ix 0 def .PRECIOUS target -.Ix 0 ref .PRECIOUS attribute -.Ix 0 ref attributes .PRECIOUS -Similar to -.CW .IGNORE , -this gives the -.CW .PRECIOUS -attribute to each source on the dependency line, unless there are no -sources, in which case the -.CW .PRECIOUS -attribute is given to every target in the file. -.IP .RECURSIVE \n(pw -.Ix 0 def .RECURSIVE -.Ix 0 ref attributes .MAKE -.Ix 0 ref .MAKE -This target applies the -.CW .MAKE -attribute to all its sources. It does nothing if you don't give it any sources. -.IP .SHELL \n(pw -.Ix 0 def .SHELL -PMake is not constrained to only using the Bourne shell to execute -the commands you put in the makefile. You can tell it some other shell -to use with this target. Check out -.B "A Shell is a Shell is a Shell" -(section 4.4) -.Rm 7 4.4 -for more information. -.IP .SILENT \n(pw -.Ix 0 def .SILENT target -.Ix 0 ref .SILENT attribute -.Ix 0 ref attributes .SILENT -When you use -.CW .SILENT -as a target, it applies the -.CW .SILENT -attribute to each of its sources. If there are no sources on the -dependency line, then it is as if you gave PMake the -.B \-s -flag and no commands will be echoed. -.IP .SUFFIXES \n(pw -.Ix 0 def .SUFFIXES -This is used to give new file suffixes for PMake to handle. Each -source is a suffix PMake should recognize. If you give a -.CW .SUFFIXES -dependency line with no sources, PMake will forget about all the -suffixes it knew (this also nukes the null suffix). -For those targets that need to have suffixes defined, this is how you do it. -.LP -In addition to these targets, a line of the form -.DS -\fIattribute\fP : \fIsources\fP -.DE -applies the -.I attribute -to all the targets listed as -.I sources . -.xH 2 Modifying Variable Expansion -.LP -.Ix 0 def variable expansion modified -.Ix 0 ref variable expansion -.Ix 0 def variable modifiers -Variables need not always be expanded verbatim. PMake defines several -modifiers that may be applied to a variable's value before it is -expanded. You apply a modifier by placing it after the variable name -with a colon between the two, like so: -.DS -${\fIVARIABLE\fP:\fImodifier\fP} -.DE -Each modifier is a single character followed by something specific to -the modifier itself. -You may apply as many modifiers as you want \*- each one is applied to -the result of the previous and is separated from the previous by -another colon. -.LP -There are seven ways to modify a variable's expansion, most of which -come from the C shell variable modification characters: -.RS -.IP "M\fIpattern\fP" -.Ix 0 def :M -.Ix 0 def modifier match -This is used to select only those words (a word is a series of -characters that are neither spaces nor tabs) that match the given -.I pattern . -The pattern is a wildcard pattern like that used by the shell, where -.CW * -means 0 or more characters of any sort; -.CW ? -is any single character; -.CW [abcd] -matches any single character that is either `a', `b', `c' or `d' -(there may be any number of characters between the brackets); -.CW [0-9] -matches any single character that is between `0' and `9' (i.e. any -digit. This form may be freely mixed with the other bracket form), and -`\\' is used to escape any of the characters `*', `?', `[' or `:', -leaving them as regular characters to match themselves in a word. -For example, the system makefile -.CW -uses -.CW "$(CFLAGS:M-[ID]*)" '' `` -to extract all the -.CW \-I -and -.CW \-D -flags that would be passed to the C compiler. This allows it to -properly locate include files and generate the correct dependencies. -.IP "N\fIpattern\fP" -.Ix 0 def :N -.Ix 0 def modifier nomatch -This is identical to -.CW :M -except it substitutes all words that don't match the given pattern. -.IP "S/\fIsearch-string\fP/\fIreplacement-string\fP/[g]" -.Ix 0 def :S -.Ix 0 def modifier substitute -Causes the first occurrence of -.I search-string -in the variable to be replaced by -.I replacement-string , -unless the -.CW g -flag is given at the end, in which case all occurrences of the string -are replaced. The substitution is performed on each word in the -variable in turn. If -.I search-string -begins with a -.CW ^ , -the string must match starting at the beginning of the word. If -.I search-string -ends with a -.CW $ , -the string must match to the end of the word (these two may be -combined to force an exact match). If a backslash precedes these two -characters, however, they lose their special meaning. Variable -expansion also occurs in the normal fashion inside both the -.I search-string -and the -.I replacement-string , -.B except -that a backslash is used to prevent the expansion of a -.CW $ , -not another dollar sign, as is usual. -Note that -.I search-string -is just a string, not a pattern, so none of the usual -regular-expression/wildcard characters have any special meaning save -.CW ^ -and -.CW $ . -In the replacement string, -the -.CW & -character is replaced by the -.I search-string -unless it is preceded by a backslash. -You are allowed to use any character except -colon or exclamation point to separate the two strings. This so-called -delimiter character may be placed in either string by preceding it -with a backslash. -.IP T -.Ix 0 def :T -.Ix 0 def modifier tail -Replaces each word in the variable expansion by its last -component (its ``tail''). For example, given -.DS -OBJS = ../lib/a.o b /usr/lib/libm.a -TAILS = $(OBJS:T) -.DE -the variable -.CW TAILS -would expand to -.CW "a.o b libm.a" .'' `` -.IP H -.Ix 0 def :H -.Ix 0 def modifier head -This is similar to -.CW :T , -except that every word is replaced by everything but the tail (the -``head''). Using the same definition of -.CW OBJS , -the string -.CW "$(OBJS:H)" '' `` -would expand to -.CW "../lib /usr/lib" .'' `` -Note that the final slash on the heads is removed and -anything without a head is replaced by the empty string. -.IP E -.Ix 0 def :E -.Ix 0 def modifier extension -.Ix 0 def modifier suffix -.Ix 0 ref suffix "variable modifier" -.CW :E -replaces each word by its suffix (``extension''). So -.CW "$(OBJS:E)" '' `` -would give you -.CW ".o .a" .'' `` -.IP R -.Ix 0 def :R -.Ix 0 def modifier root -.Ix 0 def modifier base -This replaces each word by everything but the suffix (the ``root'' of -the word). -.CW "$(OBJS:R)" '' `` -expands to `` -.CW "../lib/a b /usr/lib/libm" .'' -.RE -.LP -In addition, the System V style of substitution is also supported. -This looks like: -.DS -$(\fIVARIABLE\fP:\fIsearch-string\fP=\fIreplacement\fP) -.DE -It must be the last modifier in the chain. The search is anchored at -the end of each word, so only suffixes or whole words may be replaced. -.xH 2 More on Debugging -.xH 2 More Exercises -.IP (3.1) -You've got a set programs, each of which is created from its own -assembly-language source file (suffix -.CW .asm ). -Each program can be assembled into two versions, one with error-checking -code assembled in and one without. You could assemble them into files -with different suffixes -.CW .eobj \& ( -and -.CW .obj , -for instance), but your linker only understands files that end in -.CW .obj . -To top it all off, the final executables -.I must -have the suffix -.CW .exe . -How can you still use transformation rules to make your life easier -(Hint: assume the error-checking versions have -.CW ec -tacked onto their prefix)? -.IP (3.2) -Assume, for a moment or two, you want to perform a sort of -``indirection'' by placing the name of a variable into another one, -then you want to get the value of the first by expanding the second -somehow. Unfortunately, PMake doesn't allow constructs like -.DS I -$($(FOO)) -.DE -What do you do? Hint: no further variable expansion is performed after -modifiers are applied, thus if you cause a $ to occur in the -expansion, that's what will be in the result. -.xH 1 PMake for Gods -.LP -This chapter is devoted to those facilities in PMake that allow you to -do a great deal in a makefile with very little work, as well as do -some things you couldn't do in Make without a great deal of work (and -perhaps the use of other programs). The problem with these features, -is they must be handled with care, or you will end up with a mess. -.LP -Once more, I assume a greater familiarity with -.UX -or Sprite than I did in the previous two chapters. -.xH 2 Search Paths -.Rd 6 -.LP -PMake supports the dispersal of files into multiple directories by -allowing you to specify places to look for sources with -.CW .PATH -targets in the makefile. The directories you give as sources for these -targets make up a ``search path.'' Only those files used exclusively -as sources are actually sought on a search path, the assumption being -that anything listed as a target in the makefile can be created by the -makefile and thus should be in the current directory. -.LP -There are two types of search paths -in PMake: one is used for all types of files (including included -makefiles) and is specified with a plain -.CW .PATH -target (e.g. -.CW ".PATH : RCS" ''), `` -while the other is specific to a certain type of file, as indicated by -the file's suffix. A specific search path is indicated by immediately following -the -.CW .PATH -with the suffix of the file. For instance -.DS -\&.PATH.h : /sprite/lib/include /sprite/att/lib/include -.DE -would tell PMake to look in the directories -.CW /sprite/lib/include -and -.CW /sprite/att/lib/include -for any files whose suffix is -.CW .h . -.LP -The current directory is always consulted first to see if a file -exists. Only if it cannot be found there are the directories in the -specific search path, followed by those in the general search path, -consulted. -.LP -A search path is also used when expanding wildcard characters. If the -pattern has a recognizable suffix on it, the path for that suffix will -be used for the expansion. Otherwise the default search path is employed. -.LP -When a file is found in some directory other than the current one, all -local variables that would have contained the target's name -.CW .ALLSRC , ( -and -.CW .IMPSRC ) -will instead contain the path to the file, as found by PMake. -Thus if you have a file -.CW ../lib/mumble.c -and a makefile -.DS -\&.PATH.c : ../lib -mumble : mumble.c - $(CC) -o $(.TARGET) $(.ALLSRC) -.DE -the command executed to create -.CW mumble -would be -.CW "cc -o mumble ../lib/mumble.c" .'' `` -(As an aside, the command in this case isn't strictly necessary, since -it will be found using transformation rules if it isn't given. This is because -.CW .out -is the null suffix by default and a transformation exists from -.CW .c -to -.CW .out . -Just thought I'd throw that in.) -.LP -If a file exists in two directories on the same search path, the file -in the first directory on the path will be the one PMake uses. So if -you have a large system spread over many directories, it would behoove -you to follow a naming convention that avoids such conflicts. -.LP -Something you should know about the way search paths are implemented -is that each directory is read, and its contents cached, exactly once -\&\*- when it is first encountered \*- so any changes to the -directories while PMake is running will not be noted when searching -for implicit sources, nor will they be found when PMake attempts to -discover when the file was last modified, unless the file was created in the -current directory. While people have suggested that PMake should read -the directories each time, my experience suggests that the caching seldom -causes problems. In addition, not caching the directories slows things -down enormously because of PMake's attempts to apply transformation -rules through non-existent files \*- the number of extra file-system -searches is truly staggering, especially if many files without -suffixes are used and the null suffix isn't changed from -.CW .out . -.xH 2 Archives and Libraries -.LP -.UX -and Sprite allow you to merge files into an archive using the -.CW ar -command. Further, if the files are relocatable object files, you can -run -.CW ranlib -on the archive and get yourself a library that you can link into any -program you want. The main problem with archives is they double the -space you need to store the archived files, since there's one copy in -the archive and one copy out by itself. The problem with libraries is -you usually think of them as -.CW -lm -rather than -.CW /usr/lib/libm.a -and the linker thinks they're out-of-date if you so much as look at -them. -.LP -PMake solves the problem with archives by allowing you to tell it to -examine the files in the archives (so you can remove the individual -files without having to regenerate them later). To handle the problem -with libraries, PMake adds an additional way of deciding if a library -is out-of-date: -.IP \(bu 2 -If the table of contents is older than the library, or is missing, the -library is out-of-date. -.LP -A library is any target that looks like -.CW \-l name'' `` -or that ends in a suffix that was marked as a library using the -.CW .LIBS -target. -.CW .a -is so marked in the system makefile. -.LP -Members of an archive are specified as -``\fIarchive\fP(\fImember\fP[ \fImember\fP...])''. -Thus -.CW libdix.a(window.o) '' ``' -specifies the file -.CW window.o -in the archive -.CW libdix.a . -You may also use wildcards to specify the members of the archive. Just -remember that most the wildcard characters will only find -.I existing -files. -.LP -A file that is a member of an archive is treated specially. If the -file doesn't exist, but it is in the archive, the modification time -recorded in the archive is used for the file when determining if the -file is out-of-date. When figuring out how to make an archived member target -(not the file itself, but the file in the archive \*- the -\fIarchive\fP(\fImember\fP) target), special care is -taken with the transformation rules, as follows: -.IP \(bu 2 -\&\fIarchive\fP(\fImember\fP) is made to depend on \fImember\fP. -.IP \(bu 2 -The transformation from the \fImember\fP's suffix to the -\fIarchive\fP's suffix is applied to the \fIarchive\fP(\fImember\fP) target. -.IP \(bu 2 -The \fIarchive\fP(\fImember\fP)'s -.CW .TARGET -variable is set to the name of the \fImember\fP if \fImember\fP is -actually a target, or the path to the member file if \fImember\fP is -only a source. -.IP \(bu 2 -The -.CW .ARCHIVE -variable for the \fIarchive\fP(\fImember\fP) target is set to the name -of the \fIarchive\fP. -.Ix 0 def variable local .ARCHIVE -.Ix 0 def .ARCHIVE -.IP \(bu 2 -The -.CW .MEMBER -variable is set to the actual string inside the parentheses. In most -cases, this will be the same as the -.CW .TARGET -variable. -.Ix 0 def variable local .MEMBER -.Ix 0 def .MEMBER -.IP \(bu 2 -The \fIarchive\fP(\fImember\fP)'s place in the local variables of the -targets that depend on it is taken by the value of its -.CW .TARGET -variable. -.LP -Thus, a program library could be created with the following makefile: -.DS -\&.o.a : - ... - rm -f $(.TARGET:T) -OBJS = obj1.o obj2.o obj3.o -libprog.a : libprog.a($(OBJS)) - ar cru $(.TARGET) $(.OODATE) - ranlib $(.TARGET) -.DE -This will cause the three object files to be compiled (if the -corresponding source files were modified after the object file or, if -that doesn't exist, the archived object file), the out-of-date ones -archived in -.CW libprog.a , -a table of contents placed in the archive and the newly-archived -object files to be removed. -.LP -All this is used in the -.CW makelib.mk -system makefile to create a single library with ease. This makefile -looks like this: -.DS -.SM -# -# Rules for making libraries. The object files that make up the library -# are removed once they are archived. -# -# To make several libraries in parallel, you should define the variable -# "many_libraries". This will serialize the invocations of ranlib. -# -# To use, do something like this: -# -# OBJECTS = -# -# fish.a: fish.a($(OBJECTS)) MAKELIB -# -# - -#ifndef _MAKELIB_MK -_MAKELIB_MK = - -#include - -\&.po.a .o.a : - ... - rm -f $(.MEMBER) - -ARFLAGS ?= crl - -# -# Re-archive the out-of-date members and recreate the library's table of -# contents using ranlib. If many_libraries is defined, put the ranlib -# off til the end so many libraries can be made at once. -# -MAKELIB : .USE .PRECIOUS - ar $(ARFLAGS) $(.TARGET) $(.OODATE) -#ifndef no_ranlib -# ifdef many_libraries - ... -# endif many_libraries - ranlib $(.TARGET) -#endif no_ranlib - -#endif _MAKELIB_MK -.DE -.xH 2 On the Condition... -.Rd 1 -.LP -Like the C compiler before it, PMake allows you to configure the makefile, -based on the current environment, using conditional statements. A -conditional looks like this: -.DS -#if \fIboolean expression\fP -\fIlines\fP -#elif \fIanother boolean expression\fP -\fImore lines\fP -#else -\fIstill more lines\fP -#endif -.DE -They may be nested to a maximum depth of 30 and may occur anywhere -(except in a comment, of course). The -.CW # '' `` -must the very first character on the line. -.LP -Each -.I "boolean expression" -is made up of terms that look like function calls, the standard C -boolean operators -.CW && , -.CW || , -and -.CW ! , -and the standard relational operators -.CW == , -.CW != , -.CW > , -.CW >= , -.CW < , -and -.CW <= , -with -.CW == -and -.CW != -being overloaded to allow string comparisons as well. -.CW && -represents logical AND; -.CW || -is logical OR and -.CW ! -is logical NOT. The arithmetic and string operators take precedence -over all three of these operators, while NOT takes precedence over -AND, which takes precedence over OR. This precedence may be -overridden with parentheses, and an expression may be parenthesized to -your heart's content. Each term looks like a call on one of four -functions: -.nr pw 9 -.Ix 0 def make -.Ix 0 def conditional make -.Ix 0 def if make -.IP make \n(pw -The syntax is -.CW make( \fItarget\fP\c -.CW ) -where -.I target -is a target in the makefile. This is true if the given target was -specified on the command line, or as the source for a -.CW .MAIN -target (note that the sources for -.CW .MAIN -are only used if no targets were given on the command line). -.IP defined \n(pw -.Ix 0 def defined -.Ix 0 def conditional defined -.Ix 0 def if defined -The syntax is -.CW defined( \fIvariable\fP\c -.CW ) -and is true if -.I variable -is defined. Certain variables are defined in the system makefile that -identify the system on which PMake is being run. -.IP exists \n(pw -.Ix 0 def exists -.Ix 0 def conditional exists -.Ix 0 def if exists -The syntax is -.CW exists( \fIfile\fP\c -.CW ) -and is true if the file can be found on the global search path (i.e. -that defined by -.CW .PATH -targets, not by -.CW .PATH \fIsuffix\fP -targets). -.IP empty \n(pw -.Ix 0 def empty -.Ix 0 def conditional empty -.Ix 0 def if empty -This syntax is much like the others, except the string inside the -parentheses is of the same form as you would put between parentheses -when expanding a variable, complete with modifiers and everything. The -function returns true if the resulting string is empty (NOTE: an undefined -variable in this context will cause at the very least a warning -message about a malformed conditional, and at the worst will cause the -process to stop once it has read the makefile. If you want to check -for a variable being defined or empty, use the expression -.CW !defined( \fIvar\fP\c `` -.CW ") || empty(" \fIvar\fP\c -.CW ) '' -as the definition of -.CW || -will prevent the -.CW empty() -from being evaluated and causing an error, if the variable is -undefined). This can be used to see if a variable contains a given -word, for example: -.DS -#if !empty(\fIvar\fP:M\fIword\fP) -.DE -.LP -The arithmetic and string operators may only be used to test the value -of a variable. The lefthand side must contain the variable expansion, -while the righthand side contains either a string, enclosed in -double-quotes, or a number. The standard C numeric conventions (except -for specifying an octal number) apply to both sides. E.g. -.DS -#if $(OS) == 4.3 - -#if $(MACHINE) == "sun3" - -#if $(LOAD_ADDR) < 0xc000 -.DE -are all valid conditionals. In addition, the numeric value of a -variable can be tested as a boolean as follows: -.DS -#if $(LOAD) -.DE -would see if -.CW LOAD -contains a non-zero value and -.DS -#if !$(LOAD) -.DE -would test if -.CW LOAD -contains a zero value. -.LP -In addition to the bare -.CW #if ,'' `` -there are other forms that apply one of the first two functions to each -term. They are as follows: -.DS - ifdef \fRdefined\fP - ifndef \fR!defined\fP - ifmake \fRmake\fP - ifnmake \fR!make\fP -.DE -There are also the ``else if'' forms: -.CW elif , -.CW elifdef , -.CW elifndef , -.CW elifmake , -and -.CW elifnmake . -.LP -For instance, if you wish to create two versions of a program, one of which -is optimized (the production version) and the other of which is for debugging -(has symbols for dbx), you have two choices: you can create two -makefiles, one of which uses the -.CW \-g -flag for the compilation, while the other uses the -.CW \-O -flag, or you can use another target (call it -.CW debug ) -to create the debug version. The construct below will take care of -this for you. I have also made it so defining the variable -.CW DEBUG -(say with -.CW "pmake -D DEBUG" ) -will also cause the debug version to be made. -.DS -#if defined(DEBUG) || make(debug) -CFLAGS += -g -#else -CFLAGS += -O -#endif -.DE -There are, of course, problems with this approach. The most glaring -annoyance is that if you want to go from making a debug version to -making a production version, you have to remove all the object files, -or you will get some optimized and some debug versions in the same -program. Another annoyance is you have to be careful not to make two -targets that ``conflict'' because of some conditionals in the -makefile. For instance -.DS -#if make(print) -FORMATTER = ditroff -Plaser_printer -#endif -#if make(draft) -FORMATTER = nroff -Pdot_matrix_printer -#endif -.DE -would wreak havoc if you tried -.CW "pmake draft print" '' `` -since you would use the same formatter for each target. As I said, -this all gets somewhat complicated. -.xH 2 A Shell is a Shell is a Shell -.Rd 7 -.LP -In normal operation, the Bourne Shell (better known as -.CW sh '') `` -is used to execute the commands to re-create targets. PMake also allows you -to specify a different shell for it to use when executing these -commands. There are several things PMake must know about the shell you -wish to use. These things are specified as the sources for the -.CW .SHELL -.Ix 0 ref .SHELL -.Ix 0 ref target .SHELL -target by keyword, as follows: -.IP "\fBpath=\fP\fIpath\fP" -PMake needs to know where the shell actually resides, so it can -execute it. If you specify this and nothing else, PMake will use the -last component of the path and look in its table of the shells it -knows and use the specification it finds, if any. Use this if you just -want to use a different version of the Bourne or C Shell (yes, PMake knows -how to use the C Shell too). -.IP "\fBname=\fP\fIname\fP" -This is the name by which the shell is to be known. It is a single -word and, if no other keywords are specified (other than -.B path ), -it is the name by which PMake attempts to find a specification for -it (as mentioned above). You can use this if you would just rather use -the C Shell than the Bourne Shell -.CW ".SHELL: name=csh" '' (`` -will do it). -.IP "\fBquiet=\fP\fIecho-off command\fP" -As mentioned before, PMake actually controls whether commands are -printed by introducing commands into the shell's input stream. This -keyword, and the next two, control what those commands are. The -.B quiet -keyword is the command used to turn echoing off. Once it is turned -off, echoing is expected to remain off until the echo-on command is given. -.IP "\fBecho=\fP\fIecho-on command\fP" -The command PMake should give to turn echoing back on again. -.IP "\fBfilter=\fP\fIprinted echo-off command\fP" -Many shells will echo the echo-off command when it is given. This -keyword tells PMake in what format the shell actually prints the -echo-off command. Wherever PMake sees this string in the shell's -output, it will delete it and any following whitespace, up to and -including the next newline. See the example at the end of this section -for more details. -.IP "\fBechoFlag=\fP\fIflag to turn echoing on\fP" -Unless a target has been marked -.CW .SILENT , -PMake wants to start the shell running with echoing on. To do this, it -passes this flag to the shell as one of its arguments. If either this -or the next flag begins with a `\-', the flags will be passed to the -shell as separate arguments. Otherwise, the two will be concatenated -(if they are used at the same time, of course). -.IP "\fBerrFlag=\fP\fIflag to turn error checking on\fP" -Likewise, unless a target is marked -.CW .IGNORE , -PMake wishes error-checking to be on from the very start. To this end, -it will pass this flag to the shell as an argument. The same rules for -an initial `\-' apply as for the -.B echoFlag . -.IP "\fBcheck=\fP\fIcommand to turn error checking on\fP" -Just as for echo-control, error-control is achieved by inserting -commands into the shell's input stream. This is the command to make -the shell check for errors. It also serves another purpose if the -shell doesn't have error-control as commands, but I'll get into that -in a minute. Again, once error checking has been turned on, it is -expected to remain on until it is turned off again. -.IP "\fBignore=\fP\fIcommand to turn error checking off\fP" -This is the command PMake uses to turn error checking off. It has -another use if the shell doesn't do error-control, but I'll tell you -about that.\|.\|.\|now. -.IP "\fBhasErrCtl=\fP\fIyes or no\fP" -This takes a value that is either -.B yes -or -.B no . -Now you might think that the existence of the -.B check -and -.B ignore -keywords would be enough to tell PMake if the shell can do -error-control, but you'd be wrong. If -.B hasErrCtl -is -.B yes , -PMake uses the check and ignore commands in a straight-forward manner. -If this is -.B no , -however, their use is rather different. In this case, the check -command is used as a template, in which the string -.B %s -is replaced by the command that's about to be executed, to produce a -command for the shell that will echo the command to be executed. The -ignore command is also used as a template, again with -.B %s -replaced by the command to be executed, to produce a command that will -execute the command to be executed and ignore any error it returns. -When these strings are used as templates, you must provide newline(s) -.CW \en '') (`` -in the appropriate place(s). -.LP -The strings that follow these keywords may be enclosed in single or -double quotes (the quotes will be stripped off) and may contain the -usual C backslash-characters (\en is newline, \er is return, \eb is -backspace, \e' escapes a single-quote inside single-quotes, \e" -escapes a double-quote inside double-quotes). Now for an example. -.LP -This is actually the contents of the -.CW -system makefile, and causes PMake to use the Bourne Shell in such a -way that each command is printed as it is executed. That is, if more -than one command is given on a line, each will be printed separately. -Similarly, each time the body of a loop is executed, the commands -within that loop will be printed, etc. The specification runs like -this: -.DS -# -# This is a shell specification to have the Bourne shell echo -# the commands just before executing them, rather than when it reads -# them. Useful if you want to see how variables are being expanded, etc. -# -\&.SHELL : path=/bin/sh \e - quiet="set -" \e - echo="set -x" \e - filter="+ set - " \e - echoFlag=x \e - errFlag=e \e - hasErrCtl=yes \e - check="set -e" \e - ignore="set +e" -.DE -.LP -It tells PMake the following: -.Bp -The shell is located in the file -.CW /bin/sh . -It need not tell PMake that the name of the shell is -.CW sh -as PMake can figure that out for itself (it's the last component of -the path). -.Bp -The command to stop echoing is -.CW "set -" . -.Bp -The command to start echoing is -.CW "set -x" . -.Bp -When the echo off command is executed, the shell will print -.CW "+ set - " -(The `+' comes from using the -.CW \-x -flag (rather than the -.CW \-v -flag PMake usually uses)). PMake will remove all occurrences of this -string from the output, so you don't notice extra commands you didn't -put there. -.Bp -The flag the Bourne Shell will take to start echoing in this way is -the -.CW \-x -flag. The Bourne Shell will only take its flag arguments concatenated -as its first argument, so neither this nor the -.B errFlag -specification begins with a \-. -.Bp -The flag to use to turn error-checking on from the start is -.CW \-e . -.Bp -The shell can turn error-checking on and off, and the commands to do -so are -.CW "set +e" -and -.CW "set -e" , -respectively. -.LP -I should note that this specification is for Bourne Shells that are -not part of Berkeley -.UX , -as shells from Berkeley don't do error control. You can get a similar -effect, however, by changing the last three lines to be: -.DS - hasErrCtl=no \e - check="echo \e"+ %s\e"\en" \e - ignore="sh -c '%s || exit 0\en" -.DE -.LP -This will cause PMake to execute the two commands -.DS -echo "+ \fIcmd\fP" -sh -c '\fIcmd\fP || true' -.DE -for each command for which errors are to be ignored. (In case you are -wondering, the thing for -.CW ignore -tells the shell to execute another shell without error checking on and -always exit 0, since the -.B || -causes the -.CW "exit 0" -to be executed only if the first command exited non-zero, and if the -first command exited zero, the shell will also exit zero, since that's -the last command it executed). -.xH 2 Compatibility -.Ix 0 ref compatibility -.LP -There are three (well, 3 \(12) levels of backwards-compatibility built -into PMake. Most makefiles will need none at all. Some may need a -little bit of work to operate correctly when run in parallel. Each -level encompasses the previous levels (e.g. -.B \-B -(one shell per command) implies -.B \-V ) -The three levels are described in the following three sections. -.xH 3 DEFCON 3 \*- Variable Expansion -.Ix 0 ref compatibility -.LP -As noted before, PMake will not expand a variable unless it knows of a -value for it. This can cause problems for makefiles that expect to -leave variables undefined except in special circumstances (e.g. if -more flags need to be passed to the C compiler or the output from a -text processor should be sent to a different printer). If the -variables are enclosed in curly braces -.CW ${PRINTER} ''), (`` -the shell will let them pass. If they are enclosed in parentheses, -however, the shell will declare a syntax error and the make will come -to a grinding halt. -.LP -You have two choices: change the makefile to define the variables -(their values can be overridden on the command line, since that's -where they would have been set if you used Make, anyway) or always give the -.B \-V -flag (this can be done with the -.CW .MAKEFLAGS -target, if you want). -.xH 3 DEFCON 2 \*- The Number of the Beast -.Ix 0 ref compatibility -.LP -Then there are the makefiles that expect certain commands, such as -changing to a different directory, to not affect other commands in a -target's creation script. You can solve this is either by going -back to executing one shell per command (which is what the -.B \-B -flag forces PMake to do), which slows the process down a good bit and -requires you to use semicolons and escaped newlines for shell constructs, or -by changing the makefile to execute the offending command(s) in a subshell -(by placing the line inside parentheses), like so: -.DS -install :: .MAKE - (cd src; $(.PMAKE) install) - (cd lib; $(.PMAKE) install) - (cd man; $(.PMAKE) install) -.DE -.Ix 0 ref operator double-colon -.Ix 0 ref variable global .PMAKE -.Ix 0 ref .PMAKE -.Ix 0 ref .MAKE -.Ix 0 ref attribute .MAKE -This will always execute the three makes (even if the -.B \-n -flag was given) because of the combination of the ``::'' operator and -the -.CW .MAKE -attribute. Each command will change to the proper directory to perform -the install, leaving the main shell in the directory in which it started. -.xH 3 "DEFCON 1 \*- Imitation is the Not the Highest Form of Flattery" -.Ix 0 ref compatibility -.LP -The final category of makefile is the one where every command requires -input, the dependencies are incompletely specified, or you simply -cannot create more than one target at a time, as mentioned earlier. In -addition, you may not have the time or desire to upgrade the makefile -to run smoothly with PMake. If you are the conservative sort, this is -the compatibility mode for you. It is entered either by giving PMake -the -.B \-M -flag (for Make), or by executing PMake as -.CW make .'' `` -In either case, PMake performs things exactly like Make (while still -supporting most of the nice new features PMake provides). This -includes: -.IP \(bu 2 -No parallel execution. -.IP \(bu 2 -Targets are made in the exact order specified by the makefile. The -sources for each target are made in strict left-to-right order, etc. -.IP \(bu 2 -A single Bourne shell is used to execute each command, thus the -shell's -.CW $$ -variable is useless, changing directories doesn't work across command -lines, etc. -.IP \(bu 2 -If no special characters exist in a command line, PMake will break the -command into words itself and execute the command directly, without -executing a shell first. The characters that cause PMake to execute a -shell are: -.CW # , -.CW = , -.CW | , -.CW ^ , -.CW ( , -.CW ) , -.CW { , -.CW } , -.CW ; , -.CW & , -.CW < , -.CW > , -.CW * , -.CW ? , -.CW [ , -.CW ] , -.CW : , -.CW $ , -.CW ` , -and -.CW \e . -You should notice that these are all the characters that are given -special meaning by the shell (except -.CW ' -and -.CW " , -which PMake deals with all by its lonesome). -.IP \(bu 2 -The use of the null suffix is turned off. -.Ix 0 ref "null suffix" -.Ix 0 ref suffix null -.xH 2 The Way Things Work -.LP -When PMake reads the makefile, it parses sources and targets into -nodes in a graph. The graph is directed only in the sense that PMake -knows which way is up. Each node contains not only links to all its -parents and children (the nodes that depend on it and those on which -it depends, respectively), but also a count of the number of its -children that have already been processed. -.LP -The most important thing to know about how PMake uses this graph is -that the traversal is breadth-first and occurs in two passes. -.LP -After PMake has parsed the makefile, it begins with the nodes the user -has told it to make (either on the command line, or via a -.CW .MAIN -target, or by the target being the first in the file not labeled with -the -.CW .NOTMAIN -attribute) placed in a queue. It continues to take the node off the -front of the queue, mark it as something that needs to be made, pass -the node to -.CW Suff_FindDeps -(mentioned earlier) to find any implicit sources for the node, and -place all the node's children that have yet to be marked at the end of -the queue. If any of the children is a -.CW .USE -rule, its attributes are applied to the parent, then its commands are -appended to the parent's list of commands and its children are linked -to its parent. The parent's unmade children counter is then decremented -(since the -.CW .USE -node has been processed). You will note that this allows a -.CW .USE -node to have children that are -.CW .USE -nodes and the rules will be applied in sequence. -If the node has no children, it is placed at the end of -another queue to be examined in the second pass. This process -continues until the first queue is empty. -.LP -At this point, all the leaves of the graph are in the examination -queue. PMake removes the node at the head of the queue and sees if it -is out-of-date. If it is, it is passed to a function that will execute -the commands for the node asynchronously. When the commands have -completed, all the node's parents have their unmade children counter -decremented and, if the counter is then 0, they are placed on the -examination queue. Likewise, if the node is up-to-date. Only those -parents that were marked on the downward pass are processed in this -way. Thus PMake traverses the graph back up to the nodes the user -instructed it to create. When the examination queue is empty and no -shells are running to create a target, PMake is finished. -.LP -Once all targets have been processed, PMake executes the commands -attached to the -.CW .END -target, either explicitly or through the use of an ellipsis in a shell -script. If there were no errors during the entire process but there -are still some targets unmade (PMake keeps a running count of how many -targets are left to be made), there is a cycle in the graph. PMake does -a depth-first traversal of the graph to find all the targets that -weren't made and prints them out one by one. -.xH 1 Answers to Exercises -.IP (3.1) -This is something of a trick question, for which I apologize. The -trick comes from the UNIX definition of a suffix, which PMake doesn't -necessarily share. You will have noticed that all the suffixes used in -this tutorial (and in UNIX in general) begin with a period -.CW .ms , ( -.CW .c , -etc.). Now, PMake's idea of a suffix is more like English's: it's the -characters at the end of a word. With this in mind, one possible -.Ix 0 def suffix -solution to this problem goes as follows: -.DS I -\&.SUFFIXES : ec.exe .exe ec.obj .obj .asm -ec.objec.exe .obj.exe : - link -o $(.TARGET) $(.IMPSRC) -\&.asmec.obj : - asm -o $(.TARGET) -DDO_ERROR_CHECKING $(.IMPSRC) -\&.asm.obj : - asm -o $(.TARGET) $(.IMPSRC) -.DE -.IP (3.2) -The trick to this one lies in the ``:='' variable-assignment operator -and the ``:S'' variable-expansion modifier. -.Ix 0 ref variable assignment expanded -.Ix 0 ref variable expansion modified -.Ix 0 ref modifier substitute -.Ix 0 ref :S -.Ix 0 ref := -Basically what you want is to take the pointer variable, so to speak, -and transform it into an invocation of the variable at which it -points. You might try something like -.DS I -$(PTR:S/^/\e$(/:S/$/)) -.DE -which places -.CW $( '' `` -at the front of the variable name and -.CW ) '' `` -at the end, thus transforming -.CW VAR ,'' `` -for example, into -.CW $(VAR) ,'' `` -which is just what we want. Unfortunately (as you know if you've tried -it), since, as it says in the hint, PMake does no further substitution -on the result of a modified expansion, that's \fIall\fP you get. The -solution is to make use of ``:='' to place that string into yet -another variable, then invoke the other variable directly: -.DS I -*PTR := $(PTR:S/^/\e$(/:S/$/)/) -.DE -You can then use -.CW $(*PTR) '' `` -to your heart's content. -.de Gp -.XP -\&\fB\\$1:\fP -.. -.xH 1 Glossary of Jargon -.Gp "attribute" -A property given to a target that causes PMake to treat it differently. -.Gp "command script" -The lines immediately following a dependency line that specify -commands to execute to create each of the targets on the dependency -line. Each line in the command script must begin with a tab. -.Gp "command-line variable" -A variable defined in an argument when PMake is first executed. -Overrides all assignments to the same variable name in the makefile. -.Gp "conditional" -A construct much like that used in C that allows a makefile to be -configured on the fly based on the local environment, or on what is being -made by that invocation of PMake. -.Gp "creation script" -Commands used to create a target. See ``command script.'' -.Gp "dependency" -The relationship between a source and a target. This comes in three -flavors, as indicated by the operator between the target and the -source. `:' gives a straight time-wise dependency (if the target is -older than the source, the target is out-of-date), while `!' provides -simply an ordering and always considers the target out-of-date. `::' -is much like `:', save it creates multiple instances of a target each -of which depends on its own list of sources. -.Gp "dynamic source" -This refers to a source that has a local variable invocation in it. It -allows a single dependency line to specify a different source for each -target on the line. -.Gp "global variable" -Any variable defined in a makefile. Takes precedence over variables -defined in the environment, but not over command-line or local variables. -.Gp "input graph" -What PMake constructs from a makefile. Consists of nodes made of the -targets in the makefile, and the links between them (the -dependencies). The links are directed (from source to target) and -there may not be any cycles (loops) in the graph. -.Gp "local variable" -A variable defined by PMake visible only in a target's shell script. -There are seven local variables, not all of which are defined for -every target: -.CW .TARGET , -.CW .ALLSRC , -.CW .OODATE , -.CW .PREFIX , -.CW .IMPSRC , -.CW .ARCHIVE , -and -.CW .MEMBER . -.CW .TARGET , -.CW .PREFIX , -.CW .ARCHIVE , -and -.CW .MEMBER -may be used on dependency lines to create ``dynamic sources.'' -.Gp "makefile" -A file that describes how a system is built. If you don't know what it -is after reading this tutorial.\|.\|.\|. -.Gp "modifier" -A letter, following a colon, used to alter how a variable is expanded. -It has no effect on the variable itself. -.Gp "operator" -What separates a source from a target (on a dependency line) and specifies -the relationship between the two. There are three: -.CW : ', ` -.CW :: ', ` -and -.CW ! '. ` -.Gp "search path" -A list of directories in which a file should be sought. PMake's view -of the contents of directories in a search path does not change once -the makefile has been read. A file is sought on a search path only if -it is exclusively a source. -.Gp "shell" -A program to which commands are passed in order to create targets. -.Gp "source" -Anything to the right of an operator on a dependency line. Targets on -the dependency line are usually created from the sources. -.Gp "special target" -A target that causes PMake to do special things when it's encountered. -.Gp "suffix" -The tail end of a file name. Usually begins with a period, -.CW .c -or -.CW .ms , -e.g. -.Gp "target" -A word to the left of the operator on a dependency line. More -generally, any file that PMake might create. A file may be (and often -is) both a target and a source (what it is depends on how PMake is -looking at it at the time \*- sort of like the wave/particle duality -of light, you know). -.Gp "transformation rule" -A special construct in a makefile that specifies how to create a file -of one type from a file of another, as indicated by their suffixes. -.Gp "variable expansion" -The process of substituting the value of a variable for a reference to -it. Expansion may be altered by means of modifiers. -.Gp "variable" -A place in which to store text that may be retrieved later. Also used -to define the local environment. Conditionals exist that test whether -a variable is defined or not. -.bp -.\" Output table of contents last, with an entry for the index, making -.\" sure to save and restore the last real page number for the index... -.nr @n \n(PN+1 -.\" We are not generating an index -.\" .XS \n(@n -.\" Index -.\" .XE -.nr %% \n% -.PX -.nr % \n(%% diff --git a/usr.sbin/config/SMM.doc/0.t b/usr.sbin/config/SMM.doc/0.t deleted file mode 100644 index ae5bf77..0000000 --- a/usr.sbin/config/SMM.doc/0.t +++ /dev/null @@ -1,88 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)0.t 8.1 (Berkeley) 7/5/93 -.\" -.bd S B 3 -.de UX -.ie \\n(GA>0 \\$2UNIX\\$1 -.el \{\ -.if n \\$2UNIX\\$1* -.if t \\$2UNIX\\$1\\f1\(dg\\fP -.FS -.if n *UNIX -.if t \(dgUNIX -.ie \\$3=1 is a Footnote of Bell Laboratories. -.el is a Trademark of Bell Laboratories. -.FE -.nr GA 1\} -.. -.de BR -\fB\\$1\fP\\$2 -.. -.TL -Building 4.4BSD Kernels with Config -.AU -Samuel J. Leffler and Michael J. Karels -.AI -Computer Systems Research Group -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, California 94720 -.de IR -\fI\\$1\fP\\$2 -.. -.de DT -.TA 8 16 24 32 40 48 56 64 72 80 -.. -.AB -.PP -This document describes the use of -\fIconfig\fP\|(8) to configure and create bootable -4.4BSD system images. -It discusses the structure of system -configuration files and how to configure -systems with non-standard hardware configurations. -Sections describing the preferred way to -add new code to the system and how the system's autoconfiguration -process operates are included. An appendix -contains a summary of the rules used by the system -in calculating the size of system data structures, -and also indicates some of the standard system size -limitations (and how to change them). -Other configuration options are also listed. -.sp -.LP -Revised July 5, 1993 -.AE -.LP -.OH 'Building 4.4BSD Kernels with Config''SMM:2-%' -.EH 'SMM:2-%''Building 4.4BSD Kernels with Config' diff --git a/usr.sbin/config/SMM.doc/1.t b/usr.sbin/config/SMM.doc/1.t deleted file mode 100644 index 453041b..0000000 --- a/usr.sbin/config/SMM.doc/1.t +++ /dev/null @@ -1,61 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)1.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH Introduction -.ne 2i -.sp 3 -.NH -INTRODUCTION -.PP -.I Config -is a tool used in building 4.4BSD system images (the UNIX kernel). -It takes a file describing a system's tunable parameters and -hardware support, and generates a collection -of files which are then used to build a copy of UNIX appropriate -to that configuration. -.I Config -simplifies system maintenance by isolating system dependencies -in a single, easy to understand, file. -.PP -This document describes the content and -format of system configuration -files and the rules which must be followed when creating -these files. Example configuration files are constructed -and discussed. -.PP -Later sections suggest guidelines to be used in modifying -system source and explain some of the inner workings of the -autoconfiguration process. Appendix D summarizes the rules -used in calculating the most important system data structures -and indicates some inherent system data structure size -limitations (and how to go about modifying them). diff --git a/usr.sbin/config/SMM.doc/2.t b/usr.sbin/config/SMM.doc/2.t deleted file mode 100644 index 34e6b63..0000000 --- a/usr.sbin/config/SMM.doc/2.t +++ /dev/null @@ -1,188 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)2.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Configuration File Contents -.ne 2i -.NH -CONFIGURATION FILE CONTENTS -.PP -A system configuration must include at least the following -pieces of information: -.IP \(bu 3 -machine type -.IP \(bu 3 -cpu type -.IP \(bu 3 -system identification -.IP \(bu 3 -timezone -.IP \(bu 3 -maximum number of users -.IP \(bu 3 -location of the root file system -.IP \(bu 3 -available hardware -.PP -.I Config -allows multiple system images to be generated from a single -configuration description. Each system image is configured -for identical hardware, but may have different locations for the root -file system and, possibly, other system devices. -.NH 2 -Machine type -.PP -The -.I "machine type" -indicates if the system is going to operate on a DEC VAX-11\(dg computer, -.FS -\(dg DEC, VAX, UNIBUS, MASSBUS and MicroVAX are trademarks of Digital -Equipment Corporation. -.FE -or some other machine on which 4.4BSD operates. The machine type -is used to locate certain data files which are machine specific, and -also to select rules used in constructing the resultant -configuration files. -.NH 2 -Cpu type -.PP -The -.I "cpu type" -indicates which, of possibly many, cpu's the system is to operate on. -For example, if the system is being configured for a VAX-11, it could -be running on a VAX 8600, VAX-11/780, VAX-11/750, VAX-11/730 or MicroVAX II. -(Other VAX cpu types, including the 8650, 785 and 725, are configured using -the cpu designation for compatible machines introduced earlier.) -Specifying -more than one cpu type implies that the system should be configured to run -on any of the cpu's specified. For some types of machines this is not -possible and -.I config -will print a diagnostic indicating such. -.NH 2 -System identification -.PP -The -.I "system identification" -is a moniker attached to the system, and often the machine on which the -system is to run. For example, at Berkeley we have machines named Ernie -(Co-VAX), Kim (No-VAX), and so on. The system identifier selected is used to -create a global C ``#define'' which may be used to isolate system dependent -pieces of code in the kernel. For example, Ernie's Varian driver used -to be special cased because its interrupt vectors were wired together. The -code in the driver which understood how to handle this non-standard hardware -configuration was conditionally compiled in only if the system -was for Ernie. -.PP -The system identifier ``GENERIC'' is given to a system which -will run on any cpu of a particular machine type; it should not -otherwise be used for a system identifier. -.NH 2 -Timezone -.PP -The timezone in which the system is to run is used to define the -information returned by the \fIgettimeofday\fP\|(2) -system call. This value is specified as the number of hours east -or west of GMT. Negative numbers indicate a value east of GMT. -The timezone specification may also indicate the -type of daylight savings time rules to be applied. -.NH 2 -Maximum number of users -.PP -The system allocates many system data structures at boot time -based on the maximum number of users the system will support. -This number is normally between 8 and 40, depending -on the hardware and expected job mix. The rules -used to calculate system data structures are discussed in -Appendix D. -.NH 2 -Root file system location -.PP -When the system boots it must know the location of -the root of the file system -tree. This location and the part(s) of the disk(s) to be used -for paging and swapping must be specified in order to create -a complete configuration description. -.I Config -uses many rules to calculate default locations for these items; -these are described in Appendix B. -.PP -When a generic system is configured, the root file system is left -undefined until the system is booted. In this case, the root file -system need not be specified, only that the system is a generic system. -.NH 2 -Hardware devices -.PP -When the system boots it goes through an -.I autoconfiguration -phase. During this period, the system searches for all -those hardware devices -which the system builder has indicated might be present. This probing -sequence requires certain pieces of information such as register -addresses, bus interconnects, etc. A system's hardware may be configured -in a very flexible manner or be specified without any flexibility -whatsoever. Most people do not configure hardware devices into the -system unless they are currently present on the machine, expect -them to be present in the near future, or are simply guarding -against a hardware -failure somewhere else at the site (it is often wise to configure in -extra disks in case an emergency requires moving one off a machine which -has hardware problems). -.PP -The specification of hardware devices usually occupies the majority of -the configuration file. As such, a large portion of this document will -be spent understanding it. Section 6.3 contains a description of -the autoconfiguration process, as it applies to those planning to -write, or modify existing, device drivers. -.NH 2 -Pseudo devices -.PP -Several system facilities are configured in a manner like that used -for hardware devices although they are not associated with specific hardware. -These system options are configured as -.IR pseudo-devices . -Some pseudo devices allow an optional parameter that sets the limit -on the number of instances of the device that are active simultaneously. -.NH 2 -System options -.PP -Other than the mandatory pieces of information described above, it -is also possible to include various optional system facilities -or to modify system behavior and/or limits. -For example, 4.4BSD can be configured to support binary compatibility for -programs built under 4.3BSD. Also, optional support is provided -for disk quotas and tracing the performance of the virtual memory -subsystem. Any optional facilities to be configured into -the system are specified in the configuration file. The resultant -files generated by -.I config -will automatically include the necessary pieces of the system. diff --git a/usr.sbin/config/SMM.doc/3.t b/usr.sbin/config/SMM.doc/3.t deleted file mode 100644 index e0b6234..0000000 --- a/usr.sbin/config/SMM.doc/3.t +++ /dev/null @@ -1,299 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)3.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "System Building Process -.ne 2i -.NH -SYSTEM BUILDING PROCESS -.PP -In this section we consider the steps necessary to build a bootable system -image. We assume the system source is located in the ``/sys'' directory -and that, initially, the system is being configured from source code. -.PP -Under normal circumstances there are 5 steps in building a system. -.IP 1) 3 -Create a configuration file for the system. -.IP 2) 3 -Make a directory for the system to be constructed in. -.IP 3) 3 -Run -.I config -on the configuration file to generate the files required -to compile and load the system image. -.IP 4) -Construct the source code interdependency rules for the -configured system with -.I make depend -using -.IR make (1). -.IP 5) -Compile and load the system with -.IR make . -.PP -Steps 1 and 2 are usually done only once. When a system configuration -changes it usually suffices to just run -.I config -on the modified configuration file, rebuild the source code dependencies, -and remake the system. Sometimes, -however, configuration dependencies may not be noticed in which case -it is necessary to clean out the relocatable object files saved -in the system's directory; this will be discussed later. -.NH 2 -Creating a configuration file -.PP -Configuration files normally reside in the directory ``/sys/conf''. -A configuration file is most easily constructed by copying an -existing configuration file and modifying it. The 4.4BSD distribution -contains a number of configuration files for machines at Berkeley; -one may be suitable or, in worst case, a copy -of the generic configuration file may be edited. -.PP -The configuration file must have the same name as the directory in -which the configured system is to be built. -Further, -.I config -assumes this directory is located in the parent directory of -the directory in which it -is run. For example, the generic -system has a configuration file ``/sys/conf/GENERIC'' and an accompanying -directory named ``/sys/GENERIC''. -Although it is not required that the system sources and configuration -files reside in ``/sys,'' the configuration and compilation procedure -depends on the relative locations of directories within that hierarchy, -as most of the system code and the files created by -.I config -use pathnames of the form ``../''. -If the system files are not located in ``/sys,'' -it is desirable to make a symbolic link there for use in installation -of other parts of the system that share files with the kernel. -.PP -When building the configuration file, be sure to include the items -described in section 2. In particular, the machine type, -cpu type, timezone, system identifier, maximum users, and root device -must be specified. The specification of the hardware present may take -a bit of work; particularly if your hardware is configured at non-standard -places (e.g. device registers located at funny places or devices not -supported by the system). Section 4 of this document -gives a detailed description of the configuration file syntax, -section 5 explains some sample configuration files, and -section 6 discusses how to add new devices to -the system. If the devices to be configured are not already -described in one of the existing configuration files you should check -the manual pages in section 4 of the UNIX Programmers Manual. For each -supported device, the manual page synopsis entry gives a -sample configuration line. -.PP -Once the configuration file is complete, run it through -.I config -and look for any errors. Never try and use a system which -.I config -has complained about; the results are unpredictable. -For the most part, -.IR config 's -error diagnostics are self explanatory. It may be the case that -the line numbers given with the error messages are off by one. -.PP -A successful run of -.I config -on your configuration file will generate a number of files in -the configuration directory. These files are: -.IP \(bu 3 -A file to be used by \fImake\fP\|(1) -in compiling and loading the system, -.IR Makefile . -.IP \(bu 3 -One file for each possible system image for this machine, -.IR swapxxx.c , -where -.I xxx -is the name of the system image, -which describes where swapping, the root file system, and other -miscellaneous system devices are located. -.IP \(bu 3 -A collection of header files, one per possible device the -system supports, which define the hardware configured. -.IP \(bu 3 -A file containing the I/O configuration tables used by the system -during its -.I autoconfiguration -phase, -.IR ioconf.c . -.IP \(bu 3 -An assembly language file of interrupt vectors which -connect interrupts from the machine's external buses to the main -system path for handling interrupts, -and a file that contains counters and names for the interrupt vectors. -.PP -Unless you have reason to doubt -.IR config , -or are curious how the system's autoconfiguration scheme -works, you should never have to look at any of these files. -.NH 2 -Constructing source code dependencies -.PP -When -.I config -is done generating the files needed to compile and link your system it -will terminate with a message of the form ``Don't forget to run make depend''. -This is a reminder that you should change over to the configuration -directory for the system just configured and type ``make depend'' -to build the rules used by -.I make -to recognize interdependencies in the system source code. -This will insure that any changes to a piece of the system -source code will result in the proper modules being recompiled -the next time -.I make -is run. -.PP -This step is particularly important if your site makes changes -to the system include files. The rules generated specify which source code -files are dependent on which include files. Without these rules, -.I make -will not recognize when it must rebuild modules -due to the modification of a system header file. -The dependency rules are generated by a pass of the C preprocessor -and reflect the global system options. -This step must be repeated when the configuration file is changed -and -.I config -is used to regenerate the system makefile. -.NH 2 -Building the system -.PP -The makefile constructed by -.I config -should allow a new system to be rebuilt by simply typing ``make image-name''. -For example, if you have named your bootable system image ``kernel'', -then ``make kernel'' -will generate a bootable image named ``kernel''. Alternate system image names -are used when the root file system location and/or swapping configuration -is done in more than one way. The makefile which -.I config -creates has entry points for each system image defined in -the configuration file. -Thus, if you have configured ``kernel'' to be a system with the root file -system on an ``hp'' device and ``hkkernel'' to be a system with the root -file system on an ``hk'' device, then ``make kernel hkkernel'' will generate -binary images for each. -As the system will generally use the disk from which it is loaded -as the root filesystem, separate system images are only required -to support different swap configurations. -.PP -Note that the name of a bootable image is different from the system -identifier. All bootable images are configured for the same system; -only the information about the root file system and paging devices differ. -(This is described in more detail in section 4.) -.PP -The last step in the system building process is to rearrange certain commonly -used symbols in the symbol table of the system image; the makefile -generated by -.I config -does this automatically for you. -This is advantageous for programs such as -\fInetstat\fP\|(1) and \fIvmstat\fP\|(1), -which run much faster when the symbols they need are located at -the front of the symbol table. -Remember also that many programs expect -the currently executing system to be named ``/kernel''. If you install -a new system and name it something other than ``/kernel'', many programs -are likely to give strange results. -.NH 2 -Sharing object modules -.PP -If you have many systems which are all built on a single machine -there are at least two approaches to saving time in building system -images. The best way is to have a single system image which is run on -all machines. This is attractive since it minimizes disk space used -and time required to rebuild systems after making changes. However, -it is often the case that one or more systems will require a separately -configured system image. This may be due to limited memory (building -a system with many unused device drivers can be expensive), or to -configuration requirements (one machine may be a development machine -where disk quotas are not needed, while another is a production machine -where they are), etc. In these cases it is possible -for common systems to share relocatable object modules which are not -configuration dependent; most of the modules in the directory ``/sys/sys'' -are of this sort. -.PP -To share object modules, a generic system should be built. Then, for -each system configure the system as before, but before recompiling and -linking the system, type ``make links'' in the system compilation directory. -This will cause the system -to be searched for source modules which are safe to share between systems -and generate symbolic links in the current directory to the appropriate -object modules in the directory ``../GENERIC''. A shell script, -``makelinks'' is generated with this request and may be checked for -correctness. The file ``/sys/conf/defines'' contains a list of symbols -which we believe are safe to ignore when checking the source code -for modules which may be shared. Note that this list includes the definitions -used to conditionally compile in the virtual memory tracing facilities, and -the trace point support used only rarely (even at Berkeley). -It may be necessary -to modify this file to reflect local needs. Note further that -interdependencies which are not directly visible -in the source code are not caught. This means that if you place -per-system dependencies in an include file, they will not be recognized -and the shared code may be selected in an unexpected fashion. -.NH 2 -Building profiled systems -.PP -It is simple to configure a system which will automatically -collect profiling information as it operates. The profiling data -may be collected with \fIkgmon\fP\|(8) and processed with -\fIgprof\fP\|(1) -to obtain information regarding the system's operation. Profiled -systems maintain histograms of the program counter as well as the -number of invocations of each routine. The \fIgprof\fP -command will also generate a dynamic call graph of the executing -system and propagate time spent in each routine along the arcs -of the call graph (consult the \fIgprof\fP documentation for elaboration). -The program counter sampling can be driven by the system clock, or -if you have an alternate real time clock, this can be used. The -latter is highly recommended, as use of the system clock will result -in statistical anomalies, and time spent in the clock routine will -not be accurately attributed. -.PP -To configure a profiled system, the -.B \-p -option should be supplied to \fIconfig\fP. -A profiled system is about 5-10% larger in its text space due to -the calls to count the subroutine invocations. When the system -executes, the profiling data is stored in a buffer which is 1.2 -times the size of the text space. The overhead for running a -profiled system varies; under normal load we see anywhere from 5-25% -of the system time spent in the profiling code. -.PP -Note that systems configured for profiling should not be shared as -described above unless all the other shared systems are also to be -profiled. diff --git a/usr.sbin/config/SMM.doc/4.t b/usr.sbin/config/SMM.doc/4.t deleted file mode 100644 index 7498185..0000000 --- a/usr.sbin/config/SMM.doc/4.t +++ /dev/null @@ -1,442 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)4.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Configuration File Syntax -.ne 2i -.NH -CONFIGURATION FILE SYNTAX -.PP -In this section we consider the specific rules used in writing -a configuration file. A complete grammar for the input language -can be found in Appendix A and may be of use if you should have -problems with syntax errors. -.PP -A configuration file is broken up into three logical pieces: -.IP \(bu 3 -configuration parameters global to all system images -specified in the configuration file, -.IP \(bu 3 -parameters specific to each -system image to be generated, and -.IP \(bu 3 -device specifications. -.NH 2 -Global configuration parameters -.PP -The global configuration parameters are the type of machine, -cpu types, options, timezone, system identifier, and maximum users. -Each is specified with a separate line in the configuration file. -.IP "\fBmachine\fP \fItype\fP" -.br -The system is to run on the machine type specified. No more than -one machine type can appear in the configuration file. Legal values -are -.B vax -and -\fBsun\fP. -.IP "\fBcpu\fP ``\fItype\fP''" -.br -This system is to run on the cpu type specified. -More than one cpu type specification -can appear in a configuration file. -Legal types for a -.B vax -machine are -\fBVAX8600\fP, \fBVAX780\fP, \fBVAX750\fP, -\fBVAX730\fP -and -\fBVAX630\fP (MicroVAX II). -The 8650 is listed as an 8600, the 785 as a 780, and a 725 as a 730. -.IP "\fBoptions\fP \fIoptionlist\fP" -.br -Compile the listed optional code into the system. -Options in this list are separated by commas. -Possible options are listed at the top of the generic makefile. -A line of the form ``options FUNNY,HAHA'' generates global ``#define''s -\-DFUNNY \-DHAHA in the resultant makefile. -An option may be given a value by following its name with ``\fB=\fP'', -then the value enclosed in (double) quotes. -The following are major options are currently in use: -COMPAT (include code for compatibility with 4.1BSD binaries), -INET (Internet communication protocols), -NS (Xerox NS communication protocols), -and -QUOTA (enable disk quotas). -Other kernel options controlling system sizes and limits -are listed in Appendix D; -options for the network are found in Appendix E. -There are additional options which are associated with certain -peripheral devices; those are listed in the Synopsis section -of the manual page for the device. -.IP "\fBmakeoptions\fP \fIoptionlist\fP" -.br -Options that are used within the system makefile -and evaluated by -.I make -are listed as -.IR makeoptions . -Options are listed with their values with the form -``makeoptions name=value,name2=value2.'' -The values must be enclosed in double quotes if they include numerals -or begin with a dash. -.IP "\fBtimezone\fP \fInumber\fP [ \fBdst\fP [ \fInumber\fP ] ]" -.br -Specifies the timezone used by the system. This is measured in the -number of hours your timezone is west of GMT. -EST is 5 hours west of GMT, PST is 8. Negative numbers -indicate hours east of GMT. If you specify -\fBdst\fP, the system will operate under daylight savings time. -An optional integer or floating point number may be included -to specify a particular daylight saving time correction algorithm; -the default value is 1, indicating the United States. -Other values are: 2 (Australian style), 3 (Western European), -4 (Middle European), and 5 (Eastern European). See -\fIgettimeofday\fP\|(2) and \fIctime\fP\|(3) for more information. -.IP "\fBident\fP \fIname\fP" -.br -This system is to be known as -.IR name . -This is usually a cute name like ERNIE (short for Ernie Co-Vax) or -VAXWELL (for Vaxwell Smart). -This value is defined for use in conditional compilation, -and is also used to locate an optional list of source files specific -to this system. -.IP "\fBmaxusers\fP \fInumber\fP" -.br -The maximum expected number of simultaneously active user on this system is -.IR number . -This number is used to size several system data structures. -.NH 2 -System image parameters -.PP -Multiple bootable images may be specified in a single configuration -file. The systems will have the same global configuration parameters -and devices, but the location of the root file system and other -system specific devices may be different. A system image is specified -with a ``config'' line: -.IP -\fBconfig\fP\ \fIsysname\fP\ \fIconfig-clauses\fP -.LP -The -.I sysname -field is the name given to the loaded system image; almost everyone -names their standard system image ``kernel''. The configuration clauses -are one or more specifications indicating where the root file system -is located and the number and location of paging devices. -The device used by the system to process argument lists during -.IR execve (2) -calls may also be specified, though in practice this is almost -always selected by -.I config -using one of its rules for selecting default locations for -system devices. -.PP -A configuration clause is one of the following -.IP -.nf -\fBroot\fP [ \fBon\fP ] \fIroot-device\fP -\fBswap\fP [ \fBon\fP ] \fIswap-device\fP [ \fBand\fP \fIswap-device\fP ] ... -\fBdumps\fP [ \fBon\fP ] \fIdump-device\fP -\fBargs\fP [ \fBon\fP ] \fIarg-device\fP -.LP -(the ``on'' is optional.) Multiple configuration clauses -are separated by white space; -.I config -allows specifications to be continued across multiple lines -by beginning the continuation line with a tab character. -The ``root'' clause specifies where the root file system -is located, the ``swap'' clause indicates swapping and paging -area(s), the ``dumps'' clause can be used to force system dumps -to be taken on a particular device, and the ``args'' clause -can be used to specify that argument list processing for -.I execve -should be done on a particular device. -.PP -The device names supplied in the clauses may be fully specified -as a device, unit, and file system partition; or underspecified -in which case -.I config -will use builtin rules to select default unit numbers and file -system partitions. The defaulting rules are a bit complicated -as they are dependent on the overall system configuration. -For example, the swap area need not be specified at all if -the root device is specified; in this case the swap area is -placed in the ``b'' partition of the same disk where the root -file system is located. Appendix B contains a complete list -of the defaulting rules used in selecting system configuration -devices. -.PP -The device names are translated to the -appropriate major and minor device -numbers on a per-machine basis. A file, -``/sys/conf/devices.machine'' (where ``machine'' -is the machine type specified in the configuration file), -is used to map a device name to its major block device number. -The minor device number is calculated using the standard -disk partitioning rules: on unit 0, partition ``a'' is minor device -0, partition ``b'' is minor device 1, and so on; for units -other than 0, add 8 times the unit number to get the minor -device. -.PP -If the default mapping of device name to major/minor device -number is incorrect for your configuration, it can be replaced -by an explicit specification of the major/minor device. -This is done by substituting -.IP -\fBmajor\fP \fIx\fP \fBminor\fP \fIy\fP -.LP -where the device name would normally be found. For example, -.IP -.nf -\fBconfig\fP kernel \fBroot\fP \fBon\fP \fBmajor\fP 99 \fBminor\fP 1 -.fi -.PP -Normally, the areas configured for swap space are sized by the system -at boot time. If a non-standard size is to be used for one -or more swap areas (less than the full partition), -this can also be specified. To do this, the -device name specified for a swap area should have a ``size'' -specification appended. For example, -.IP -.nf -\fBconfig\fP kernel \fBroot\fP \fBon\fP hp0 \fBswap\fP \fBon\fP hp0b \fBsize\fP 1200 -.fi -.LP -would force swapping to be done in partition ``b'' of ``hp0'' and -the swap partition size would be set to 1200 sectors. A swap area -sized larger than the associated disk partition is trimmed to the -partition size. -.PP -To create a generic configuration, only the clause ``swap generic'' -should be specified; any extra clauses will cause an error. -.NH 2 -Device specifications -.PP -Each device attached to a machine must be specified -to -.I config -so that the system generated will know to probe for it during -the autoconfiguration process carried out at boot time. Hardware -specified in the configuration need not actually be present on -the machine where the generated system is to be run. Only the -hardware actually found at boot time will be used by the system. -.PP -The specification of hardware devices in the configuration file -parallels the interconnection hierarchy of the machine to be -configured. On the VAX, this means that a configuration file must -indicate what MASSBUS and UNIBUS adapters are present, and to -which \fInexi\fP they might be connected.* -.FS -* While VAX-11/750's and VAX-11/730 do not actually have -nexi, the system treats them as having -.I "simulated nexi" -to simplify device configuration. -.FE -Similarly, devices -and controllers must be indicated as possibly being connected -to one or more adapters. A device description may provide a -complete definition of the possible configuration parameters -or it may leave certain parameters undefined and make the system -probe for all the possible values. The latter allows a single -device configuration list to match many possible physical -configurations. For example, a disk may be indicated as present -at UNIBUS adapter 0, or at any UNIBUS adapter which the system -locates at boot time. The latter scheme, termed -.IR wildcarding , -allows more flexibility in the physical configuration of a system; -if a disk must be moved around for some reason, the system will -still locate it at the alternate location. -.PP -A device specification takes one of the following forms: -.IP -.nf -\fBmaster\fP \fIdevice-name\fP \fIdevice-info\fP -\fBcontroller\fP \fIdevice-name\fP \fIdevice-info\fP [ \fIinterrupt-spec\fP ] -\fBdevice\fP \fIdevice-name\fP \fIdevice-info\fP \fIinterrupt-spec\fP -\fBdisk\fP \fIdevice-name\fP \fIdevice-info\fP -\fBtape\fP \fIdevice-name\fP \fIdevice-info\fP -.fi -.LP -A ``master'' is a MASSBUS tape controller; a ``controller'' is a -disk controller, a UNIBUS tape controller, a MASSBUS adapter, or -a UNIBUS adapter. A ``device'' is an autonomous device which -connects directly to a UNIBUS adapter (as opposed to something -like a disk which connects through a disk controller). ``Disk'' -and ``tape'' identify disk drives and tape drives connected to -a ``controller'' or ``master.'' -.PP -The -.I device-name -is one of the standard device names, as -indicated in section 4 of the UNIX Programmers Manual, -concatenated with the -.I logical -unit number to be assigned the device (the -.I logical -unit number may be different than the -.I physical -unit number indicated on the front of something -like a disk; the -.I logical -unit number is used to refer to the UNIX device, not -the physical unit number). For example, ``hp0'' is logical -unit 0 of a MASSBUS storage device, even though it might -be physical unit 3 on MASSBUS adapter 1. -.PP -The -.I device-info -clause specifies how the hardware is -connected in the interconnection hierarchy. On the VAX, -UNIBUS and MASSBUS adapters are connected to the internal -system bus through -a \fInexus\fP. -Thus, one of the following -specifications would be used: -.IP -.ta 1.5i 2.5i 4.0i -.nf -\fBcontroller\fP mba0 \fBat\fP \fBnexus\fP \fIx\fP -\fBcontroller\fP uba0 \fBat\fP \fBnexus\fP \fIx\fP -.fi -.LP -To tie a controller to a specific nexus, ``x'' would be supplied -as the number of that nexus; otherwise ``x'' may be specified as -``?'', in which -case the system will probe all nexi present looking -for the specified controller. -.PP -The remaining interconnections on the VAX are: -.IP \(bu 3 -a controller -may be connected to another controller (e.g. a disk controller attached -to a UNIBUS adapter), -.IP \(bu 3 -a master is always attached to a controller (a MASSBUS adapter), -.IP \(bu 3 -a tape is always attached to a master (for MASSBUS -tape drives), -.IP \(bu 3 -a disk is always attached to a controller, and -.IP \(bu 3 -devices -are always attached to controllers (e.g. UNIBUS controllers attached -to UNIBUS adapters). -.LP -The following lines give an example of each of these interconnections: -.IP -.ta 1.5i 2.5i 4.0i -.nf -\fBcontroller\fP hk0 \fBat\fP uba0 ... -\fBmaster\fP ht0 \fBat\fP mba0 ... -\fBdisk\fP hp0 \fBat\fP mba0 ... -\fBtape\fP tu0 \fBat\fP ht0 ... -\fBdisk\fP rk1 \fBat\fP hk0 ... -\fBdevice\fP dz0 \fBat\fP uba0 ... -.fi -.LP -Any piece of hardware which may be connected to a specific -controller may also be wildcarded across multiple controllers. -.PP -The final piece of information needed by the system to configure -devices is some indication of where or how a device will interrupt. -For tapes and disks, simply specifying the \fIslave\fP or \fIdrive\fP -number is sufficient to locate the control status register for the -device. -\fIDrive\fP numbers may be wildcarded -on MASSBUS devices, but not on disks on a UNIBUS controller. -For controllers, the control status register must be -given explicitly, as well the number of interrupt vectors used and -the names of the routines to which they should be bound. -Thus the example lines given above might be completed as: -.IP -.ta 1.5i 2.5i 4.0i -.nf -\fBcontroller\fP hk0 \fBat\fP uba0 \fBcsr\fP 0177440 \fBvector\fP rkintr -\fBmaster\fP ht0 \fBat\fP mba0 \fBdrive\fP 0 -\fBdisk\fP hp0 \fBat\fP mba0 \fBdrive\fP ? -\fBtape\fP tu0 \fBat\fP ht0 \fBslave\fP 0 -\fBdisk\fP rk1 \fBat\fP hk0 \fBdrive\fP 1 -\fBdevice\fP dz0 \fBat\fP uba0 \fBcsr\fP 0160100 \fBvector\fP dzrint dzxint -.fi -.PP -Certain device drivers require extra information passed to them -at boot time to tailor their operation to the actual hardware present. -The line printer driver, for example, needs to know how many columns -are present on each non-standard line printer (i.e. a line printer -with other than 80 columns). The drivers for the terminal multiplexors -need to know which lines are attached to modem lines so that no one will -be allowed to use them unless a connection is present. For this reason, -one last parameter may be specified to a -.IR device , -a -.I flags -field. It has the syntax -.IP -\fBflags\fP \fInumber\fP -.LP -and is usually placed after the -.I csr -specification. The -.I number -is passed directly to the associated driver. The manual pages -in section 4 should be consulted to determine how each driver -uses this value (if at all). -Communications interface drivers commonly use the flags -to indicate whether modem control signals are in use. -.PP -The exact syntax for each specific device is given in the Synopsis -section of its manual page in section 4 of the manual. -.NH 2 -Pseudo-devices -.PP -A number of drivers and software subsystems -are treated like device drivers without any associated hardware. -To include any of these pieces, a ``pseudo-device'' specification -must be used. A specification for a pseudo device takes the form -.IP -.DT -.nf -\fBpseudo-device\fP \fIdevice-name\fP [ \fIhowmany\fP ] -.fi -.PP -Examples of pseudo devices are -\fBpty\fP, the pseudo terminal driver (where the optional -.I howmany -value indicates the number of pseudo terminals to configure, 32 default), -and \fBloop\fP, the software loopback network pseudo-interface. -Other pseudo devices for the network include -\fBimp\fP (required when a CSS or ACC imp is configured) -and \fBether\fP (used by the Address Resolution Protocol -on 10 Mb/sec Ethernets). -More information on configuring each of these can also be found -in section 4 of the manual. diff --git a/usr.sbin/config/SMM.doc/5.t b/usr.sbin/config/SMM.doc/5.t deleted file mode 100644 index 81f2a52..0000000 --- a/usr.sbin/config/SMM.doc/5.t +++ /dev/null @@ -1,271 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)5.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Sample Configuration Files -.ne 2i -.NH -SAMPLE CONFIGURATION FILES -.PP -In this section we will consider how to configure a -sample VAX-11/780 system on which the hardware can be -reconfigured to guard against various hardware mishaps. -We then study the rules needed to configure a VAX-11/750 -to run in a networking environment. -.NH 2 -VAX-11/780 System -.PP -Our VAX-11/780 is configured with hardware -recommended in the document ``Hints on Configuring a VAX for 4.2BSD'' -(this is one of the high-end configurations). -Table 1 lists the pertinent hardware to be configured. -.DS B -.TS -box; -l | l | l | l | l -l | l | l | l | l. -Item Vendor Connection Name Reference -_ -cpu DEC VAX780 -MASSBUS controller Emulex nexus ? mba0 hp(4) -disk Fujitsu mba0 hp0 -disk Fujitsu mba0 hp1 -MASSBUS controller Emulex nexus ? mba1 -disk Fujitsu mba1 hp2 -disk Fujitsu mba1 hp3 -UNIBUS adapter DEC nexus ? -tape controller Emulex uba0 tm0 tm(4) -tape drive Kennedy tm0 te0 -tape drive Kennedy tm0 te1 -terminal multiplexor Emulex uba0 dh0 dh(4) -terminal multiplexor Emulex uba0 dh1 -terminal multiplexor Emulex uba0 dh2 -.TE -.DE -.ce -Table 1. VAX-11/780 Hardware support. -.LP -We will call this machine ANSEL and construct a configuration -file one step at a time. -.PP -The first step is to fill in the global configuration parameters. -The machine is a VAX, so the -.I "machine type" -is ``vax''. We will assume this system will -run only on this one processor, so the -.I "cpu type" -is ``VAX780''. The options are empty since this is going to -be a ``vanilla'' VAX. The system identifier, as mentioned before, -is ``ANSEL,'' and the maximum number of users we plan to support is -about 40. Thus the beginning of the configuration file looks like -this: -.DS -.ta 1.5i 2.5i 4.0i -# -# ANSEL VAX (a picture perfect machine) -# -machine vax -cpu VAX780 -timezone 8 dst -ident ANSEL -maxusers 40 -.DE -.PP -To this we must then add the specifications for three -system images. The first will be our standard system with the -root on ``hp0'' and swapping on the same drive as the root. -The second will have the root file system in the same location, -but swap space interleaved among drives on each controller. -Finally, the third will be a generic system, -to allow us to boot off any of the four disk drives. -.DS -.ta 1.5i 2.5i -config kernel root on hp0 -config hpkernel root on hp0 swap on hp0 and hp2 -config genkernel swap generic -.DE -.PP -Finally, the hardware must be specified. Let us first just try -transcribing the information from Table 1. -.DS -.ta 1.5i 2.5i 4.0i -controller mba0 at nexus ? -disk hp0 at mba0 disk 0 -disk hp1 at mba0 disk 1 -controller mba1 at nexus ? -disk hp2 at mba1 disk 2 -disk hp3 at mba1 disk 3 -controller uba0 at nexus ? -controller tm0 at uba0 csr 0172520 vector tmintr -tape te0 at tm0 drive 0 -tape te1 at tm0 drive 1 -device dh0 at uba0 csr 0160020 vector dhrint dhxint -device dm0 at uba0 csr 0170500 vector dmintr -device dh1 at uba0 csr 0160040 vector dhrint dhxint -device dh2 at uba0 csr 0160060 vector dhrint dhxint -.DE -.LP -(Oh, I forgot to mention one panel of the terminal multiplexor -has modem control, thus the ``dm0'' device.) -.PP -This will suffice, but leaves us with little flexibility. Suppose -our first disk controller were to break. We would like to recable the -drives normally on the second controller so that all our disks could -still be used without reconfiguring the system. To do this we wildcard -the MASSBUS adapter connections and also the slave numbers. Further, -we wildcard the UNIBUS adapter connections in case we decide some time -in the future to purchase another adapter to offload the single UNIBUS -we currently have. The revised device specifications would then be: -.DS -.ta 1.5i 2.5i 4.0i -controller mba0 at nexus ? -disk hp0 at mba? disk ? -disk hp1 at mba? disk ? -controller mba1 at nexus ? -disk hp2 at mba? disk ? -disk hp3 at mba? disk ? -controller uba0 at nexus ? -controller tm0 at uba? csr 0172520 vector tmintr -tape te0 at tm0 drive 0 -tape te1 at tm0 drive 1 -device dh0 at uba? csr 0160020 vector dhrint dhxint -device dm0 at uba? csr 0170500 vector dmintr -device dh1 at uba? csr 0160040 vector dhrint dhxint -device dh2 at uba? csr 0160060 vector dhrint dhxint -.DE -.LP -The completed configuration file for ANSEL is shown in Appendix C. -.NH 2 -VAX-11/750 with network support -.PP -Our VAX-11/750 system will be located on two 10Mb/s Ethernet -local area networks and also the DARPA Internet. The system -will have a MASSBUS drive for the root file system and two -UNIBUS drives. Paging is interleaved among all three drives. -We have sold our standard DEC terminal multiplexors since this -machine will be accessed solely through the network. This -machine is not intended to have a large user community, it -does not have a great deal of memory. First the global parameters: -.DS -.ta 1.5i 2.5i 4.0i -# -# UCBVAX (Gateway to the world) -# -machine vax -cpu "VAX780" -cpu "VAX750" -ident UCBVAX -timezone 8 dst -maxusers 32 -options INET -options NS -.DE -.PP -The multiple cpu types allow us to replace UCBVAX with a -more powerful cpu without reconfiguring the system. The -value of 32 given for the maximum number of users is done to -force the system data structures to be over-allocated. That -is desirable on this machine because, while it is not expected -to support many users, it is expected to perform a great deal -of work. -The ``INET'' indicates that we plan to use the -DARPA standard Internet protocols on this machine, -and ``NS'' also includes support for Xerox NS protocols. -Note that unlike 4.2BSD configuration files, -the network protocol options do not require corresponding pseudo devices. -.PP -The system images and disks are configured next. -.DS -.ta 1.5i 2.5i 4.0i -config kernel root on hp swap on hp and rk0 and rk1 -config upkernel root on up -config hkkernel root on hk swap on rk0 and rk1 - -controller mba0 at nexus ? -controller uba0 at nexus ? -disk hp0 at mba? drive 0 -disk hp1 at mba? drive 1 -controller sc0 at uba? csr 0176700 vector upintr -disk up0 at sc0 drive 0 -disk up1 at sc0 drive 1 -controller hk0 at uba? csr 0177440 vector rkintr -disk rk0 at hk0 drive 0 -disk rk1 at hk0 drive 1 -.DE -.PP -UCBVAX requires heavy interleaving of its paging area to keep up -with all the mail traffic it handles. The limiting factor on this -system's performance is usually the number of disk arms, as opposed -to memory or cpu cycles. The extra UNIBUS controller, ``sc0'', -is in case the MASSBUS controller breaks and a spare controller -must be installed (most of our old UNIBUS controllers have been -replaced with the newer MASSBUS controllers, so we have a number -of these around as spares). -.PP -Finally, we add in the network devices. -Pseudo terminals are needed to allow users to -log in across the network (remember the only hardwired terminal -is the console). -The software loopback device is used for on-machine communications. -The connection to the Internet is through -an IMP, this requires yet another -.I pseudo-device -(in addition to the actual hardware device used by the -IMP software). And, finally, there are the two Ethernet devices. -These use a special protocol, the Address Resolution Protocol (ARP), -to map between Internet and Ethernet addresses. Thus, yet another -.I pseudo-device -is needed. The additional device specifications are show below. -.DS -.ta 1.5i 2.5i 4.0i -pseudo-device pty -pseudo-device loop -pseudo-device imp -device acc0 at uba? csr 0167600 vector accrint accxint -pseudo-device ether -device ec0 at uba? csr 0164330 vector ecrint eccollide ecxint -device il0 at uba? csr 0164000 vector ilrint ilcint -.DE -.LP -The completed configuration file for UCBVAX is shown in Appendix C. -.NH 2 -Miscellaneous comments -.PP -It should be noted in these examples that neither system was -configured to use disk quotas or the 4.1BSD compatibility mode. -To use these optional facilities, and others, we would probably -clean out our current configuration, reconfigure the system, then -recompile and relink the system image(s). This could, of course, -be avoided by figuring out which relocatable object files are -affected by the reconfiguration, then reconfiguring and recompiling -only those files affected by the configuration change. This technique -should be used carefully. diff --git a/usr.sbin/config/SMM.doc/6.t b/usr.sbin/config/SMM.doc/6.t deleted file mode 100644 index 49f6e91..0000000 --- a/usr.sbin/config/SMM.doc/6.t +++ /dev/null @@ -1,233 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)6.t 8.1 (Berkeley) 6/8/93 -.\" $FreeBSD$ -.\" -.\".ds RH "Adding New Devices -.ne 2i -.NH -ADDING NEW SYSTEM SOFTWARE -.PP -This section is not for the novice, it describes -some of the inner workings of the configuration process as -well as the pertinent parts of the system autoconfiguration process. -It is intended to give -those people who intend to install new device drivers and/or -other system facilities sufficient information to do so in the -manner which will allow others to easily share the changes. -.PP -This section is broken into four parts: -.IP \(bu 3 -general guidelines to be followed in modifying system code, -.IP \(bu 3 -how to add non-standard system facilities to 4.4BSD, -.IP \(bu 3 -how to add a device driver to 4.4BSD, and -.NH 2 -Modifying system code -.PP -If you wish to make site-specific modifications to the system -it is best to bracket them with -.DS -#ifdef SITENAME -\&... -#endif -.DE -to allow your source to be easily distributed to others, and -also to simplify \fIdiff\fP\|(1) listings. If you choose not -to use a source code control system (e.g. SCCS, RCS), and -perhaps even if you do, it is -recommended that you save the old code with something -of the form: -.DS -#ifndef SITENAME -\&... -#endif -.DE -We try to isolate our site-dependent code in individual files -which may be configured with pseudo-device specifications. -.PP -Indicate machine-specific code with ``#ifdef vax'' (or other machine, -as appropriate). -4.4BSD underwent extensive work to make it extremely portable to -machines with similar architectures\- you may someday find -yourself trying to use a single copy of the source code on -multiple machines. -.NH 2 -Adding non-standard system facilities -.PP -This section considers the work needed to augment -.IR config 's -data base files for non-standard system facilities. -.I Config -uses a set of files that list the source modules that may be required -when building a system. -The data bases are taken from the directory in which -.I config -is run, normally /sys/conf. -Three such files may be used: -.IR files , -.IR files .machine, -and -.IR files .ident. -The first is common to all systems, -the second contains files unique to a single machine type, -and the third is an optional list of modules for use on a specific machine. -This last file may override specifications in the first two. -The format of the -.I files -file has grown somewhat complex over time. Entries are normally of -the form -.IP -.nf -.DT -\fIdir/source.c\fP \fItype\fP \fIoption-list\fP \fImodifiers\fP -.LP -for example, -.IP -.nf -.DT -\fIvaxuba/foo.c\fP \fBoptional\fP foo \fBdevice-driver\fP -.LP -The -.I type -is one of -.B standard -or -.BR optional . -Files marked as standard are included in all system configurations. -Optional file specifications include a list of one or more system -options that together require the inclusion of this module. -The options in the list may be either names of devices that may -be in the configuration file, -or the names of system options that may be defined. -An optional file may be listed multiple times with different options; -if all of the options for any of the entries are satisfied, -the module is included. -.PP -If a file is specified as a -.IR device-driver , -any special compilation options for device drivers will be invoked. -On the VAX this results in the use of the -.B \-i -option for the C optimizer. This is required when pointer references -are made to memory locations in the VAX I/O address space. -.PP -Two other optional keywords modify the usage of the file. -.I Config -understands that certain files are used especially for -kernel profiling. These files are indicated in the -.I files -files with a -.I profiling-routine -keyword. For example, the current profiling subroutines -are sequestered off in a separate file with the following -entry: -.IP -.nf -.DT -\fIsys/subr_mcount.c\fP \fBoptional\fP \fBprofiling-routine\fP -.fi -.LP -The -.I profiling-routine -keyword forces -.I config -not to compile the source file with the -.B \-pg -option. -.PP -The second keyword which can be of use is the -.I config-dependent -keyword. This causes -.I config -to compile the indicated module with the global configuration -parameters. This allows certain modules, such as -.I machdep.c -to size system data structures based on the maximum number -of users configured for the system. -.NH 2 -Adding device drivers to 4.4BSD -.PP -The I/O system and -.I config -have been designed to easily allow new device support to be added. -The system source directories are organized as follows: -.DS -.TS -lw(1.0i) l. -/sys/h machine independent include files -/sys/sys machine-independent system source files -/sys/conf site configuration files and basic templates -/sys/net network-protocol-independent, but network-related code -/sys/netinet DARPA Internet code -/sys/netimp IMP support code -/sys/netns Xerox NS code -/sys/vax VAX-specific mainline code -/sys/vaxif VAX network interface code -/sys/vaxmba VAX MASSBUS device drivers and related code -/sys/vaxuba VAX UNIBUS device drivers and related code -.TE -.DE -.PP -Existing block and character device drivers for the VAX -reside in ``/sys/vax'', ``/sys/vaxmba'', and ``/sys/vaxuba''. Network -interface drivers reside in ``/sys/vaxif''. Any new device -drivers should be placed in the appropriate source code directory -and named so as not to conflict with existing devices. -Normally, definitions for things like device registers are placed in -a separate file in the same directory. For example, the ``dh'' -device driver is named ``dh.c'' and its associated include file is -named ``dhreg.h''. -.PP -Once the source for the device driver has been placed in a directory, -the file ``/sys/conf/files.machine'', and possibly -``/sys/conf/devices.machine'' should be modified. The -.I files -files in the conf directory contain a line for each C source or binary-only -file in the system. Those files which are machine independent are -located in ``/sys/conf/files,'' while machine specific files -are in ``/sys/conf/files.machine.'' The ``devices.machine'' file -is used to map device names to major block device numbers. If the device -driver being added provides support for a new disk -you will want to modify this file (the format is obvious). -.PP -In addition to including the driver in the -.I files -file, it must also be added to the device configuration tables. These -are located in ``/sys/vax/conf.c'', or similar for machines other than -the VAX. If you don't understand what to add to this file, you should -study an entry for an existing driver. -Remember that the position in the -device table specifies the major device number. -The block major number is needed in the ``devices.machine'' file -if the device is a disk. diff --git a/usr.sbin/config/SMM.doc/a.t b/usr.sbin/config/SMM.doc/a.t deleted file mode 100644 index dfcb954..0000000 --- a/usr.sbin/config/SMM.doc/a.t +++ /dev/null @@ -1,162 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)a.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Configuration File Grammar -.bp -.LG -.B -.ce -APPENDIX A. CONFIGURATION FILE GRAMMAR -.sp -.R -.NL -.PP -The following grammar is a compressed form of the actual -\fIyacc\fP\|(1) grammar used by -.I config -to parse configuration files. -Terminal symbols are shown all in upper case, literals -are emboldened; optional clauses are enclosed in brackets, ``['' -and ``]''; zero or more instantiations are denoted with ``*''. -.sp -.nf -.DT -Configuration ::= [ Spec \fB;\fP ]* - -Spec ::= Config_spec - | Device_spec - | \fBtrace\fP - | /* lambda */ - -/* configuration specifications */ - -Config_spec ::= \fBmachine\fP ID - | \fBcpu\fP ID - | \fBoptions\fP Opt_list - | \fBident\fP ID - | System_spec - | \fBtimezone\fP [ \fB\-\fP ] NUMBER [ \fBdst\fP [ NUMBER ] ] - | \fBtimezone\fP [ \fB\-\fP ] FPNUMBER [ \fBdst\fP [ NUMBER ] ] - | \fBmaxusers\fP NUMBER - -/* system configuration specifications */ - -System_spec ::= \fBconfig\fP ID System_parameter [ System_parameter ]* - -System_parameter ::= swap_spec | root_spec | dump_spec | arg_spec - -swap_spec ::= \fBswap\fP [ \fBon\fP ] swap_dev [ \fBand\fP swap_dev ]* - -swap_dev ::= dev_spec [ \fBsize\fP NUMBER ] - -root_spec ::= \fBroot\fP [ \fBon\fP ] dev_spec - -dump_spec ::= \fBdumps\fP [ \fBon\fP ] dev_spec - -arg_spec ::= \fBargs\fP [ \fBon\fP ] dev_spec - -dev_spec ::= dev_name | major_minor - -major_minor ::= \fBmajor\fP NUMBER \fBminor\fP NUMBER - -dev_name ::= ID [ NUMBER [ ID ] ] - -/* option specifications */ - -Opt_list ::= Option [ \fB,\fP Option ]* - -Option ::= ID [ \fB=\fP Opt_value ] - -Opt_value ::= ID | NUMBER - -Mkopt_list ::= Mkoption [ \fB,\fP Mkoption ]* - -Mkoption ::= ID \fB=\fP Opt_value - -/* device specifications */ - -Device_spec ::= \fBdevice\fP Dev_name Dev_info Int_spec - | \fBmaster\fP Dev_name Dev_info - | \fBdisk\fP Dev_name Dev_info - | \fBtape\fP Dev_name Dev_info - | \fBcontroller\fP Dev_name Dev_info [ Int_spec ] - | \fBpseudo-device\fP Dev [ NUMBER ] - -Dev_name ::= Dev NUMBER - -Dev ::= \fBuba\fP | \fBmba\fP | ID - -Dev_info ::= Con_info [ Info ]* - -Con_info ::= \fBat\fP Dev NUMBER - | \fBat\fP \fBnexus\fP NUMBER - -Info ::= \fBcsr\fP NUMBER - | \fBdrive\fP NUMBER - | \fBslave\fP NUMBER - | \fBflags\fP NUMBER - -Int_spec ::= \fBvector\fP ID [ ID ]* - | \fBpriority\fP NUMBER -.fi -.sp -.SH -Lexical Conventions -.LP -The terminal symbols are loosely defined as: -.IP ID -.br -One or more alphabetics, either upper or lower case, and underscore, -``_''. -.IP NUMBER -.br -Approximately the C language specification for an integer number. -That is, a leading ``0x'' indicates a hexadecimal value, -a leading ``0'' indicates an octal value, otherwise the number is -expected to be a decimal value. Hexadecimal numbers may use either -upper or lower case alphabetics. -.IP FPNUMBER -.br -A floating point number without exponent. That is a number of the -form ``nnn.ddd'', where the fractional component is optional. -.LP -In special instances a question mark, ``?'', can be substituted for -a ``NUMBER'' token. This is used to effect wildcarding in device -interconnection specifications. -.LP -Comments in configuration files are indicated by a ``#'' character -at the beginning of the line; the remainder of the line is discarded. -.LP -A specification -is interpreted as a continuation of the previous line -if the first character of the line is tab. diff --git a/usr.sbin/config/SMM.doc/b.t b/usr.sbin/config/SMM.doc/b.t deleted file mode 100644 index 901a009..0000000 --- a/usr.sbin/config/SMM.doc/b.t +++ /dev/null @@ -1,137 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)b.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Device Defaulting Rules -.bp -.LG -.B -.ce -APPENDIX B. RULES FOR DEFAULTING SYSTEM DEVICES -.sp -.R -.NL -.PP -When \fIconfig\fP processes a ``config'' rule which does -not fully specify the location of the root file system, -paging area(s), device for system dumps, and device for -argument list processing it applies a set of rules to -define those values left unspecified. The following list -of rules are used in defaulting system devices. -.IP 1) 3 -If a root device is not specified, the swap -specification must indicate a ``generic'' system is to be built. -.IP 2) 3 -If the root device does not specify a unit number, it -defaults to unit 0. -.IP 3) 3 -If the root device does not include a partition specification, -it defaults to the ``a'' partition. -.IP 4) 3 -If no swap area is specified, it defaults to the ``b'' -partition of the root device. -.IP 5) 3 -If no device is specified for processing argument lists, the -first swap partition is selected. -.IP 6) 3 -If no device is chosen for system dumps, the first swap -partition is selected (see below to find out where dumps are -placed within the partition). -.PP -The following table summarizes the default partitions selected -when a device specification is incomplete, e.g. ``hp0''. -.DS -.TS -l l. -Type Partition -_ -root ``a'' -swap ``b'' -args ``b'' -dumps ``b'' -.TE -.DE -.SH -Multiple swap/paging areas -.PP -When multiple swap partitions are specified, the system treats the -first specified as a ``primary'' swap area which is always used. -The remaining partitions are then interleaved into the paging -system at the time a -.IR swapon (2) -system call is made. This is normally done at boot time with -a call to -.IR swapon (8) -from the /etc/rc file. -.SH -System dumps -.PP -System dumps are automatically taken after a system crash, -provided the device driver for the ``dumps'' device supports -this. The dump contains the contents of memory, but not -the swap areas. Normally the dump device is a disk in -which case the information is copied to a location at the -back of the partition. The dump is placed in the back of the -partition because the primary swap and dump device are commonly -the same device and this allows the system to be rebooted without -immediately overwriting the saved information. When a dump has -occurred, the system variable \fIdumpsize\fP -is set to a non-zero value indicating the size (in bytes) of -the dump. The \fIsavecore\fP\|(8) -program then copies the information from the dump partition to -a file in a ``crash'' directory and also makes a copy of the -system which was running at the time of the crash (usually -``/kernel''). The offset to the system dump is defined in the -system variable \fIdumplo\fP (a sector offset from -the front of the dump partition). The -.I savecore -program operates by reading the contents of \fIdumplo\fP, \fIdumpdev\fP, -and \fIdumpmagic\fP from /dev/kmem, then comparing the value -of \fIdumpmagic\fP read from /dev/kmem to that located in -corresponding location in the dump area of the dump partition. -If a match is found, -.I savecore -assumes a crash occurred and reads \fIdumpsize\fP from the dump area -of the dump partition. This value is then used in copying the -system dump. Refer to -\fIsavecore\fP\|(8) -for more information about its operation. -.PP -The value \fIdumplo\fP is calculated to be -.DS -\fIdumpdev-size\fP \- \fImemsize\fP -.DE -where \fIdumpdev-size\fP is the size of the disk partition -where system dumps are to be placed, and -\fImemsize\fP is the size of physical memory. -If the disk partition is not large enough to hold a full -dump, \fIdumplo\fP is set to 0 (the start of the partition). diff --git a/usr.sbin/config/SMM.doc/c.t b/usr.sbin/config/SMM.doc/c.t deleted file mode 100644 index 67b63ec..0000000 --- a/usr.sbin/config/SMM.doc/c.t +++ /dev/null @@ -1,109 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)c.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Sample Config Files -.bp -.LG -.B -.ce -APPENDIX C. SAMPLE CONFIGURATION FILES -.sp -.R -.NL -.PP -The following configuration files are developed in section 5; -they are included here for completeness. -.sp 2 -.nf -.ta 1.5i 2.5i 4.0i -# -# ANSEL VAX (a picture perfect machine) -# -machine vax -cpu VAX780 -timezone 8 dst -ident ANSEL -maxusers 40 - -config kernel root on hp0 -config hpkernel root on hp0 swap on hp0 and hp2 -config genkernel swap generic - -controller mba0 at nexus ? -disk hp0 at mba? disk ? -disk hp1 at mba? disk ? -controller mba1 at nexus ? -disk hp2 at mba? disk ? -disk hp3 at mba? disk ? -controller uba0 at nexus ? -controller tm0 at uba? csr 0172520 vector tmintr -tape te0 at tm0 drive 0 -tape te1 at tm0 drive 1 -device dh0 at uba? csr 0160020 vector dhrint dhxint -device dm0 at uba? csr 0170500 vector dmintr -device dh1 at uba? csr 0160040 vector dhrint dhxint -device dh2 at uba? csr 0160060 vector dhrint dhxint -.bp -# -# UCBVAX - Gateway to the world -# -machine vax -cpu "VAX780" -cpu "VAX750" -ident UCBVAX -timezone 8 dst -maxusers 32 -options INET -options NS - -config kernel root on hp swap on hp and rk0 and rk1 -config upkernel root on up -config hkkernel root on hk swap on rk0 and rk1 - -controller mba0 at nexus ? -controller uba0 at nexus ? -disk hp0 at mba? drive 0 -disk hp1 at mba? drive 1 -controller sc0 at uba? csr 0176700 vector upintr -disk up0 at sc0 drive 0 -disk up1 at sc0 drive 1 -controller hk0 at uba? csr 0177440 vector rkintr -disk rk0 at hk0 drive 0 -disk rk1 at hk0 drive 1 -pseudo-device pty -pseudo-device loop -pseudo-device imp -device acc0 at uba? csr 0167600 vector accrint accxint -pseudo-device ether -device ec0 at uba? csr 0164330 vector ecrint eccollide ecxint -device il0 at uba? csr 0164000 vector ilrint ilcint diff --git a/usr.sbin/config/SMM.doc/d.t b/usr.sbin/config/SMM.doc/d.t deleted file mode 100644 index db9ab80..0000000 --- a/usr.sbin/config/SMM.doc/d.t +++ /dev/null @@ -1,272 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)d.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Data Structure Sizing Rules -.bp -.LG -.B -.ce -APPENDIX D. VAX KERNEL DATA STRUCTURE SIZING RULES -.sp -.R -.NL -.PP -Certain system data structures are sized at compile time -according to the maximum number of simultaneous users expected, -while others are calculated at boot time based on the -physical resources present, e.g. memory. This appendix lists -both sets of rules and also includes some hints on changing -built-in limitations on certain data structures. -.SH -Compile time rules -.PP -The file \fI/sys/conf\|/param.c\fP contains the definitions of -almost all data structures sized at compile time. This file -is copied into the directory of each configured system to allow -configuration-dependent rules and values to be maintained. -(Each copy normally depends on the copy in /sys/conf, -and global modifications cause the file to be recopied unless -the makefile is modified.) -The rules implied by its contents are summarized below (here -MAXUSERS refers to the value defined in the configuration file -in the ``maxusers'' rule). -Most limits are computed at compile time and stored in global variables -for use by other modules; they may generally be patched in the system -binary image before rebooting to test new values. -.IP \fBnproc\fP -.br -The maximum number of processes which may be running at any time. -It is referred to in other calculations as NPROC and is defined to be -.DS -20 + 8 * MAXUSERS -.DE -.IP \fBntext\fP -.br -The maximum number of active shared text segments. -The constant is intended to allow for network servers and common commands -that remain in the table. -It is defined as -.DS -36 + MAXUSERS. -.DE -.IP \fBninode\fP -.br -The maximum number of files in the file system which may be -active at any time. This includes files in use by users, as -well as directory files being read or written by the system -and files associated with bound sockets in the UNIX IPC domain. -It is defined as -.DS -(NPROC + 16 + MAXUSERS) + 32 -.DE -.IP \fBnfile\fP -.br -The number of ``file table'' structures. One file -table structure is used for each open, unshared, file descriptor. -Multiple file descriptors may reference a single file table -entry when they are created through a \fIdup\fP call, or as the -result of a \fIfork\fP. This is defined to be -.DS -16 * (NPROC + 16 + MAXUSERS) / 10 + 32 -.DE -.IP \fBncallout\fP -.br -The number of ``callout'' structures. One callout -structure is used per internal system event handled with -a timeout. Timeouts are used for terminal delays, -watchdog routines in device drivers, protocol timeout processing, etc. -This is defined as -.DS -16 + NPROC -.DE -.IP \fBnclist\fP -.br -The number of ``c-list'' structures. C-list structures are -used in terminal I/O, and currently each holds 60 characters. -Their number is defined as -.DS -60 + 12 * MAXUSERS -.DE -.IP \fBnmbclusters\fP -.br -The maximum number of pages which may be allocated by the network. -This is defined as 256 (a quarter megabyte of memory) in /sys/h/mbuf.h. -In practice, the network rarely uses this much memory. It starts off -by allocating 8 kilobytes of memory, then requesting more as -required. This value represents an upper bound. -.IP \fBnquota\fP -.br -The number of ``quota'' structures allocated. Quota structures -are present only when disc quotas are configured in the system. One -quota structure is kept per user. This is defined to be -.DS -(MAXUSERS * 9) / 7 + 3 -.DE -.IP \fBndquot\fP -.br -The number of ``dquot'' structures allocated. Dquot structures -are present only when disc quotas are configured in the system. -One dquot structure is required per user, per active file system quota. -That is, when a user manipulates a file on a file system on which -quotas are enabled, the information regarding the user's quotas on -that file system must be in-core. This information is cached, so -that not all information must be present in-core all the time. -This is defined as -.DS -NINODE + (MAXUSERS * NMOUNT) / 4 -.DE -where NMOUNT is the maximum number of mountable file systems. -.LP -In addition to the above values, the system page tables (used to -map virtual memory in the kernel's address space) are sized at -compile time by the SYSPTSIZE definition in the file /sys/vax/vmparam.h. -This is defined to be -.DS -20 + MAXUSERS -.DE -pages of page tables. -Its definition affects -the size of many data structures allocated at boot time because -it constrains the amount of virtual memory which may be addressed -by the running system. This is often the limiting factor -in the size of the buffer cache, in which case a message is printed -when the system configures at boot time. -.SH -Run-time calculations -.PP -The most important data structures sized at run-time are those used in -the buffer cache. Allocation is done by allocating physical memory -(and system virtual memory) immediately after the system -has been started up; look in the file /sys/vax/machdep.c. -The amount of physical memory which may be allocated to the buffer -cache is constrained by the size of the system page tables, among -other things. While the system may calculate -a large amount of memory to be allocated to the buffer cache, -if the system page -table is too small to map this physical -memory into the virtual address space -of the system, only as much as can be mapped will be used. -.PP -The buffer cache is comprised of a number of ``buffer headers'' -and a pool of pages attached to these headers. Buffer headers -are divided into two categories: those used for swapping and -paging, and those used for normal file I/O. The system tries -to allocate 10% of the first two megabytes and 5% of the remaining -available physical memory for the buffer -cache (where \fIavailable\fP does not count that space occupied by -the system's text and data segments). If this results in fewer -than 16 pages of memory allocated, then 16 pages are allocated. -This value is kept in the initialized variable \fIbufpages\fP -so that it may be patched in the binary image (to allow tuning -without recompiling the system), -or the default may be overridden with a configuration-file option. -For example, the option \fBoptions BUFPAGES="3200"\fP -causes 3200 pages (3.2M bytes) to be used by the buffer cache. -A sufficient number of file I/O buffer headers are then allocated -to allow each to hold 2 pages each. -Each buffer maps 8K bytes. -If the number of buffer pages is larger than can be mapped -by the buffer headers, the number of pages is reduced. -The number of buffer headers allocated -is stored in the global variable \fInbuf\fP, -which may be patched before the system is booted. -The system option \fBoptions NBUF="1000"\fP forces the allocation -of 1000 buffer headers. -Half as many swap I/O buffer headers as file I/O buffers -are allocated, -but no more than 256. -.SH -System size limitations -.PP -As distributed, the sum of the virtual sizes of the core-resident -processes is limited to 256M bytes. The size of the text -segment of a single process is currently limited to 6M bytes. -It may be increased to no greater than the data segment size limit -(see below) by redefining MAXTSIZ. -This may be done with a configuration file option, -e.g. \fBoptions MAXTSIZ="(10*1024*1024)"\fP -to set the limit to 10 million bytes. -Other per-process limits discussed here may be changed with similar options -with names given in parentheses. -Soft, user-changeable limits are set to 512K bytes for stack (DFLSSIZ) -and 6M bytes for the data segment (DFLDSIZ) by default; -these may be increased up to the hard limit -with the \fIsetrlimit\fP\|(2) system call. -The data and stack segment size hard limits are set by a system configuration -option to one of 17M, 33M or 64M bytes. -One of these sizes is chosen based on the definition of MAXDSIZ; -with no option, the limit is 17M bytes; with an option -\fBoptions MAXDSIZ="(32*1024*1024)"\fP (or any value between 17M and 33M), -the limit is increased to 33M bytes, and values larger than 33M -result in a limit of 64M bytes. -You must be careful in doing this that you have adequate paging space. -As normally configured , the system has 16M or 32M bytes per paging area, -depending on disk size. -The best way to get more space is to provide multiple, thereby -interleaved, paging areas. -Increasing the virtual memory limits results in interleaving of -swap space in larger sections (from 500K bytes to 1M or 2M bytes). -.PP -By default, the virtual memory system allocates enough memory -for system page tables mapping user page tables -to allow 256 megabytes of simultaneous active virtual memory. -That is, the sum of the virtual memory sizes of all (completely- or partially-) -resident processes can not exceed this limit. -If the limit is exceeded, some process(es) must be swapped out. -To increase the amount of resident virtual space possible, -you can alter the constant USRPTSIZE (in -/sys/vax/vmparam.h). -Each page of system page tables allows 8 megabytes of user virtual memory. -.PP -Because the file system block numbers are stored in -page table \fIpg_blkno\fP -entries, the maximum size of a file system is limited to -2^24 1024 byte blocks. Thus no file system can be larger than 8 gigabytes. -.PP -The number of mountable file systems is set at 20 by the definition -of NMOUNT in /sys/h/param.h. -This should be sufficient; if not, the value can be increased up to 255. -If you have many disks, it makes sense to make some of -them single file systems, and the paging areas don't count in this total. -.PP -The limit to the number of files that a process may have open simultaneously -is set to 64. -This limit is set by the NOFILE definition in /sys/h/param.h. -It may be increased arbitrarily, with the caveat that the user structure -expands by 5 bytes for each file, and thus UPAGES (/sys/vax/machparam.h) -must be increased accordingly. -.PP -The amount of physical memory is currently limited to 64 Mb -by the size of the index fields in the core-map (/sys/h/cmap.h). -The limit may be increased by following instructions in that file -to enlarge those fields. diff --git a/usr.sbin/config/SMM.doc/e.t b/usr.sbin/config/SMM.doc/e.t deleted file mode 100644 index 0a9505b..0000000 --- a/usr.sbin/config/SMM.doc/e.t +++ /dev/null @@ -1,114 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)e.t 8.1 (Berkeley) 6/8/93 -.\" -.\".ds RH "Network configuration options -.bp -.LG -.B -.ce -APPENDIX E. NETWORK CONFIGURATION OPTIONS -.sp -.R -.NL -.PP -The network support in the kernel is self-configuring -according to the protocol support options (INET and NS) and the network -hardware discovered during autoconfiguration. -There are several changes that may be made to customize network behavior -due to local restrictions. -Within the Internet protocol routines, the following options -set in the system configuration file are supported: -.IP \fBGATEWAY\fP -.br -The machine is to be used as a gateway. -This option currently makes only minor changes. -First, the size of the network routing hash table is increased. -Secondly, machines that have only a single hardware network interface -will not forward IP packets; without this option, they will also refrain -from sending any error indication to the source of unforwardable packets. -Gateways with only a single interface are assumed to have missing -or broken interfaces, and will return ICMP unreachable errors to hosts -sending them packets to be forwarded. -.IP \fBTCP_COMPAT_42\fP -.br -This option forces the system to limit its initial TCP sequence numbers -to positive numbers. -Without this option, 4.4BSD systems may have problems with TCP connections -to 4.2BSD systems that connect but never transfer data. -The problem is a bug in the 4.2BSD TCP. -.IP \fBIPFORWARDING\fP -.br -Normally, 4.4BSD machines with multiple network interfaces -will forward IP packets received that should be resent to another host. -If the line ``options IPFORWARDING="0"'' is in the system configuration -file, IP packet forwarding will be disabled. -.IP \fBIPSENDREDIRECTS\fP -.br -When forwarding IP packets, 4.4BSD IP will note when a packet is forwarded -using the same interface on which it arrived. -When this is noted, if the source machine is on the directly-attached -network, an ICMP redirect is sent to the source host. -If the packet was forwarded using a route to a host or to a subnet, -a host redirect is sent, otherwise a network redirect is sent. -The generation of redirects may be inhibited with the configuration -option ``options IPSENDREDIRECTS="0".'' -.br -.IP \fBSUBNETSARELOCAL\fP -TCP calculates a maximum segment size to use for each connection, -and sends no datagrams larger than that size. -This size will be no larger than that supported on the outgoing -interface. -Furthermore, if the destination is not on the local network, -the size will be no larger than 576 bytes. -For this test, other subnets of a directly-connected subnetted -network are considered to be local unless the line -``options SUBNETSARELOCAL="0"'' is used in the system configuration file. -.LP -The following options are supported by the Xerox NS protocols: -.IP \fBNSIP\fP -.br -This option allows NS IDP datagrams to be encapsulated in Internet IP -packets for transmission to a collaborating NSIP host. -This may be used to pass IDP packets through IP-only link layer networks. -See -.IR nsip (4P) -for details. -.IP \fBTHREEWAYSHAKE\fP -.br -The NS Sequenced Packet Protocol does not require a three-way handshake -before considering a connection to be in the established state. -(A three-way handshake consists of a connection request, an acknowledgement -of the request along with a symmetrical opening indication, -and then an acknowledgement of the reciprocal opening packet.) -This option forces a three-way handshake before data may be transmitted -on Sequenced Packet sockets. diff --git a/usr.sbin/config/SMM.doc/spell.ok b/usr.sbin/config/SMM.doc/spell.ok deleted file mode 100644 index dfc5df1..0000000 --- a/usr.sbin/config/SMM.doc/spell.ok +++ /dev/null @@ -1,305 +0,0 @@ -# $FreeBSD$ -ACC -ANSEL -ARP -Autoconfiguration -BUFPAGES -CANTWAIT -CH -COMPAT -CSS -Co -Config -Config''SMM:2 -DCLR -DFLDSIZ -DFLSSIZ -DFUNNY -DHAHA -DMA -Dev -Dquot -ECC -EMULEX -Emulex -Ethernet -FPNUMBER -FUNNY,HAHA -HAVEBDP -ICMP -IDP -IE -INET -IP -IPC -IPFORWARDING -IPL -IPSENDREDIRECTS -Info -Karels -LH -Leffler -MASSBUS -MAXDSIZ -MAXTSIZ -Makefile -Mb -MicroVAX -Mkopt -Mkoption -NBUF -NEED16 -NEEDBDP -NINODE -NMOUNT -NOFILE -NPROC -NS -NSC -NSIP -NUP -PST -RCS -RDY -RH -RK07 -RK611 -SCCS -SITENAME -SMM:2 -SUBNETSARELOCAL -SYSPTSIZE -TCP -THREEWAYSHAKE -Timezone -UCBVAX -UDP -UNIBUS -UPAGES -UPCS2 -USRPTSIZE -VAX -VAX630 -VAX730 -VAX750 -VAX780 -VAX8600 -VAXWELL -VAXen -Vax -Vaxwell -acc0 -accrint -accxint -addr -arg -args -assym.s -autoconfiguration -autoconfigure -autoconfigured -backpointer -badaddr -blkno -br -br5 -buf -bufpages -buses -caddr -callout -catchall -cmap.h -cmd -conf -conf.c -config -csr -ct.c -ctlr -cvec -datagrams -define''s -dev -devices.machine -dgo -dh.c -dh0 -dh1 -dh2 -dhreg.h -dhrint -dhxint -dinfo -dk -dk.h -dm0 -dmintr -dname -dquot -dst -dumpdev -dumplo -dumpmagic -dumpsize -dz.c -dz0 -dzrint -dzxint -ec0 -eccollide -ecrint -ecxint -endif -es -files.machine -filesystem -foo -foo.c -genkernel -gettimeofday -gigabytes -gprof -hardwired -hd -hk -hk0 -hkkernel -howmany -hp0 -hp0b -hp1 -hp2 -hp3 -hpkernel -ht0 -hz -ident -ifdef -ifndef -il0 -ilcint -ilrint -info -intr -ioconf.c -kgmon -linterrs -loopback -machdep.c -machparam.h -makefile -makelinks -makeoptions -maxusers -mba -mba0 -mba1 -mbuf.h -mcount.c -memsize -minfo -mname -moniker -mspw -nbuf -ncallout -nclist -ndquot -ndrive -netimp -netinet -netns -netstat -nexi -nexus -nfile -ninode -nmbclusters -nnn.ddd -nproc -nquota -nsip -ntext -optionlist -param.c -param.h -pathnames -pg -physaddr -pty -rc -reg -rk.c -rk0 -rk1 -rkintr -savecore -sc -sc0 -sc1 -scdriver -setrlimit -sizeof -softc -source.c -subr -swapxxx.c -sysname -te0 -te1 -timezone -tm0 -tmintr -tu0 -uba -uba.c -uba0 -ubago -uballoc -ubamem -ubanum -ubareg.h -ubarelse -ubavar.h -ubglue.s -ubinfo -ud -ui -um -up.c -up0 -up1 -up2 -upaddr -upattach -upba -upcs1 -upcs2 -updevice -updgo -updinfo -updtab -upintr -upip -upmaptype -upminfo -upprobe -upslave -upstd -upkernel -upwatch -upwstart -value,name2 -value2 -vax -vaxif -vaxmba -vaxuba -vmparam.h -kernel -wildcard -wildcarded -wildcarding -xclu -xxx diff --git a/usr.sbin/lpr/Makefile b/usr.sbin/lpr/Makefile index 3cd0eb6..043ed8b 100644 --- a/usr.sbin/lpr/Makefile +++ b/usr.sbin/lpr/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ SUBDIR= common_source chkprintcap lp lpc lpd lpq lpr lprm lptest pac \ - filters filters.ru SMM.doc + filters filters.ru # Questions/ideas for lpr & friends could also be sent to: # freebsd-print@bostonradio.org diff --git a/usr.sbin/lpr/SMM.doc/0.t b/usr.sbin/lpr/SMM.doc/0.t deleted file mode 100644 index 65ecd4e..0000000 --- a/usr.sbin/lpr/SMM.doc/0.t +++ /dev/null @@ -1,68 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)0.t 8.1 (Berkeley) 6/8/93 -.\" -.if n .ND -.TL -4.3BSD Line Printer Spooler Manual -.EH 'SMM:7-%''4.3BSD Line Printer Spooler Manual' -.OH '4.3BSD Line Printer Spooler Manual''SMM:7-%' -.AU -Ralph Campbell -.AI -Computer Systems Research Group -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, CA 94720 -.AB -.FS -* UNIX is a trademark of Bell Laboratories. -.FE -This document describes the structure and installation procedure -for the line printer spooling system -developed for the 4.3BSD version -of the UNIX* operating system. -.de D? -.ie \\n(.$>1 Revised \\$1 \\$2 \\$3 -.el DRAFT of \n(mo/\n(dy/\n(yr -.. -.sp 2 -.LP -.D? June 8, 1993 -.AE -.de IR -\fI\\$1\fP\\$2 -.. -.de DT -.TA 8 16 24 32 40 48 56 64 72 80 -.. diff --git a/usr.sbin/lpr/SMM.doc/1.t b/usr.sbin/lpr/SMM.doc/1.t deleted file mode 100644 index 1d34e9e..0000000 --- a/usr.sbin/lpr/SMM.doc/1.t +++ /dev/null @@ -1,77 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)1.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Overview -.PP -The line printer system supports: -.IP \(bu 3 -multiple printers, -.IP \(bu 3 -multiple spooling queues, -.IP \(bu 3 -both local and remote -printers, and -.IP \(bu 3 -printers attached via serial lines that require -line initialization such as the baud rate. -.LP -Raster output devices -such as a Varian or Versatec, and laser printers such as an Imagen, -are also supported by the line printer system. -.PP -The line printer system consists mainly of the -following files and commands: -.DS -.TS -l l. -/etc/printcap printer configuration and capability data base -/usr/lib/lpd line printer daemon, does all the real work -/usr/ucb/lpr program to enter a job in a printer queue -/usr/ucb/lpq spooling queue examination program -/usr/ucb/lprm program to delete jobs from a queue -/etc/lpc program to administer printers and spooling queues -/dev/printer socket on which lpd listens -.TE -.DE -The file /etc/printcap is a master data base describing line -printers directly attached to a machine and, also, printers -accessible across a network. The manual page entry -.IR printcap (5) -provides the authoritative definition of -the format of this data base, as well as -specifying default values for important items -such as the directory in which spooling is performed. -This document introduces some of the -information that may be placed -.IR printcap . diff --git a/usr.sbin/lpr/SMM.doc/2.t b/usr.sbin/lpr/SMM.doc/2.t deleted file mode 100644 index 9da2ae2..0000000 --- a/usr.sbin/lpr/SMM.doc/2.t +++ /dev/null @@ -1,141 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)2.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Commands -.NH 2 -lpd \- line printer daemon -.PP -The program -.IR lpd (8), -usually invoked at boot time from the /etc/rc file, acts as -a master server for coordinating and controlling -the spooling queues configured in the printcap file. -When -.I lpd -is started it makes a single pass through the -.I printcap -database restarting any printers that have jobs. -In normal operation -.I lpd -listens for service requests on multiple sockets, -one in the UNIX domain (named ``/dev/printer'') for -local requests, and one in the Internet domain -(under the ``printer'' service specification) -for requests for printer access from off machine; -see \fIsocket\fP\|(2) and \fIservices\fP\|(5) -for more information on sockets and service -specifications, respectively. -.I Lpd -spawns a copy of itself to process the request; the master daemon -continues to listen for new requests. -.PP -Clients communicate with -.I lpd -using a simple transaction oriented protocol. -Authentication of remote clients is done based -on the ``privilege port'' scheme employed by -\fIrshd\fP\|(8C) and \fIrcmd\fP\|(3X). -The following table shows the requests -understood by -.IR lpd . -In each request the first byte indicates the -``meaning'' of the request, followed by the name -of the printer to which it should be applied. Additional -qualifiers may follow, depending on the request. -.DS -.TS -l l. -Request Interpretation -_ -^Aprinter\en check the queue for jobs and print any found -^Bprinter\en receive and queue a job from another machine -^Cprinter [users ...] [jobs ...]\en return short list of current queue state -^Dprinter [users ...] [jobs ...]\en return long list of current queue state -^Eprinter person [users ...] [jobs ...]\en remove jobs from a queue -.TE -.DE -.PP -The \fIlpr\fP\|(1) command -is used by users to enter a print job in a local queue and to notify -the local -.I lpd -that there are new jobs in the spooling area. -.I Lpd -either schedules the job to be printed locally, or if -printing remotely, attempts to forward -the job to the appropriate machine. -If the printer cannot be opened or the destination -machine is unreachable, the job will remain queued until it is -possible to complete the work. -.NH 2 -lpq \- show line printer queue -.PP -The \fIlpq\fP\|(1) -program works recursively backwards displaying the queue of the machine with -the printer and then the queue(s) of the machine(s) that lead to it. -.I Lpq -has two forms of output: in the default, short, format it -gives a single line of output per queued job; in the long -format it shows the list of files, and their sizes, that -comprise a job. -.NH 2 -lprm \- remove jobs from a queue -.PP -The \fIlprm\fP\|(1) command deletes jobs from a spooling -queue. If necessary, \fIlprm\fP will first kill off a -running daemon that is servicing the queue and restart -it after the required files are removed. When removing -jobs destined for a remote printer, \fIlprm\fP acts -similarly to \fIlpq\fP except it first checks locally -for jobs to remove and then -tries to remove files in queues off-machine. -.NH 2 -lpc \- line printer control program -.PP -The -.IR lpc (8) -program is used by the system administrator to control the -operation of the line printer system. -For each line printer configured in /etc/printcap, -.I lpc -may be used to: -.IP \(bu -disable or enable a printer, -.IP \(bu -disable or enable a printer's spooling queue, -.IP \(bu -rearrange the order of jobs in a spooling queue, -.IP \(bu -find the status of printers, and their associated -spooling queues and printer daemons. diff --git a/usr.sbin/lpr/SMM.doc/3.t b/usr.sbin/lpr/SMM.doc/3.t deleted file mode 100644 index 8c950a9..0000000 --- a/usr.sbin/lpr/SMM.doc/3.t +++ /dev/null @@ -1,73 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)3.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Access control -.PP -The printer system maintains protected spooling areas so that -users cannot circumvent printer accounting or -remove files other than their own. -The strategy used to maintain protected -spooling areas is as follows: -.IP \(bu 3 -The spooling area is writable only by a \fIdaemon\fP user -and \fIdaemon\fP group. -.IP \(bu 3 -The \fIlpr\fP program runs set-user-id to \fIroot\fP and -set-group-id to group \fIdaemon\fP. The \fIroot\fP access permits -reading any file required. Accessibility is verified -with an \fIaccess\fP\|(2) call. The group ID -is used in setting up proper ownership of files -in the spooling area for \fIlprm\fP. -.IP \(bu 3 -Control files in a spooling area are made with \fIdaemon\fP -ownership and group ownership \fIdaemon\fP. Their mode is 0660. -This insures control files are not modified by a user -and that no user can remove files except through \fIlprm\fP. -.IP \(bu 3 -The spooling programs, -\fIlpd\fP, \fIlpq\fP, and \fIlprm\fP run set-user-id to \fIroot\fP -and set-group-id to group \fIdaemon\fP to access spool files and printers. -.IP \(bu 3 -The printer server, \fIlpd\fP, -uses the same verification procedures as \fIrshd\fP\|(8C) -in authenticating remote clients. The host on which a client -resides must be present in the file /etc/hosts.equiv or /etc/hosts.lpd and -the request message must come from a reserved port number. -.PP -In practice, none of \fIlpd\fP, \fIlpq\fP, or -\fIlprm\fP would have to run as user \fIroot\fP if remote -spooling were not supported. In previous incarnations of -the printer system \fIlpd\fP ran set-user-id to \fIdaemon\fP, -set-group-id to group \fIspooling\fP, and \fIlpq\fP and \fIlprm\fP ran -set-group-id to group \fIspooling\fP. diff --git a/usr.sbin/lpr/SMM.doc/4.t b/usr.sbin/lpr/SMM.doc/4.t deleted file mode 100644 index 8800bc0..0000000 --- a/usr.sbin/lpr/SMM.doc/4.t +++ /dev/null @@ -1,206 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)4.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Setting up -.PP -The 4.3BSD release comes with the necessary programs -installed and with the default line printer queue -created. If the system must be modified, the -makefile in the directory /usr/src/usr.lib/lpr -should be used in recompiling and reinstalling -the necessary programs. -.PP -The real work in setting up is to create the -.I printcap -file and any printer filters for printers not supported -in the distribution system. -.NH 2 -Creating a printcap file -.PP -The -.I printcap -database contains one or more entries per printer. -A printer should have a separate spooling directory; -otherwise, jobs will be printed on -different printers depending on which printer daemon starts first. -This section describes how to create entries for printers that do not -conform to the default printer description (an LP-11 style interface to a -standard, band printer). -.NH 3 -Printers on serial lines -.PP -When a printer is connected via a serial communication line -it must have the proper baud rate and terminal modes set. -The following example is for a DecWriter III printer connected -locally via a 1200 baud serial line. -.DS -.DT -lp|LA-180 DecWriter III:\e - :lp=/dev/lp:br#1200:fs#06320:\e - :tr=\ef:of=/usr/lib/lpf:lf=/usr/adm/lpd-errs: -.DE -The -.B lp -entry specifies the file name to open for output. Here it could -be left out since ``/dev/lp'' is the default. -The -.B br -entry sets the baud rate for the tty line and the -.B fs -entry sets CRMOD, no parity, and XTABS (see \fItty\fP\|(4)). -The -.B tr -entry indicates that a form-feed should be printed when the queue -empties so the paper can be torn off without turning the printer off-line and -pressing form feed. -The -.B of -entry specifies the filter program -.I lpf -should be used for printing the files; -more will be said about filters later. -The last entry causes errors -to be written to the file ``/usr/adm/lpd-errs'' -instead of the console. Most errors from \fIlpd\fP are logged using -\fIsyslogd\fP\|(8) and will not be logged in the specified file. The -filters should use \fIsyslogd\fP to report errors; only those that -write to standard error output will end up with errors in the \fBlf\fP file. -(Occasionally errors sent to standard error output have not appeared -in the log file; the use of \fIsyslogd\fP is highly recommended.) -.NH 3 -Remote printers -.PP -Printers that reside on remote hosts should have an empty -.B lp -entry. -For example, the following printcap entry would send output to the printer -named ``lp'' on the machine ``ucbvax''. -.DS -.DT -lp|default line printer:\e - :lp=:rm=ucbvax:rp=lp:sd=/usr/spool/vaxlpd: -.DE -The -.B rm -entry is the name of the remote machine to connect to; this name must -be a known host name for a machine on the network. -The -.B rp -capability indicates -the name of the printer on the remote machine is ``lp''; -here it could be left out since this is the default value. -The -.B sd -entry specifies ``/usr/spool/vaxlpd'' -as the spooling directory instead of the -default value of ``/usr/spool/lpd''. -.NH 2 -Output filters -.PP -Filters are used to handle device dependencies and to -do accounting functions. The output filtering of -.B of -is used when accounting is -not being done or when all text data must be passed through a filter. -It is not intended to do accounting since it is started only once, -all text files are filtered through it, and no provision is made for passing -owners' login name, identifying the beginning and ending of jobs, etc. -The other filters (if specified) are started for each file -printed and do accounting if there is an -.B af -entry. -If entries for both -.B of -and other filters are specified, -the output filter is used only to print the banner page; -it is then stopped to allow other filters access to the printer. -An example of a printer that requires output filters -is the Benson-Varian. -.DS -.DT -va|varian|Benson-Varian:\e - :lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf:\e - :tf=/usr/lib/rvcat:mx#2000:pl#58:px=2112:py=1700:tr=\ef: -.DE -The -.B tf -entry specifies ``/usr/lib/rvcat'' as the filter to be -used in printing \fItroff\fP\|(1) output. -This filter is needed to set the device into print mode -for text, and plot mode for printing -.I troff -files and raster images (see \fIva\fP\|(4V)). -Note that the page length is set to 58 lines by the -.B pl -entry for 8.5" by 11" fan-fold paper. -To enable accounting, the varian entry would be -augmented with an -.B af -filter as shown below. -.DS -.DT -va|varian|Benson-Varian:\e - :lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf:\e - :if=/usr/lib/vpf:tf=/usr/lib/rvcat:af=/usr/adm/vaacct:\e - :mx#2000:pl#58:px=2112:py=1700:tr=\ef: -.DE -.NH 2 -Access Control -.PP -Local access to printer queues is controlled with the -.B rg -printcap entry. -.DS - :rg=lprgroup: -.DE -Users must be in the group -.I lprgroup -to submit jobs to the specified printer. -The default is to allow all users access. -Note that once the files are in the local queue, they can be printed -locally or forwarded to another host depending on the configuration. -.PP -Remote access is controlled by listing the hosts in either the file -/etc/hosts.equiv or /etc/hosts.lpd, one host per line. Note that -.IR rsh (1) -and -.IR rlogin (1) -use /etc/hosts.equiv to determine which hosts are equivalent for allowing logins -without passwords. The file /etc/hosts.lpd is only used to control -which hosts have line printer access. -Remote access can be further restricted to only allow remote users with accounts -on the local host to print jobs by using the \fBrs\fP printcap entry. -.DS - :rs: -.DE diff --git a/usr.sbin/lpr/SMM.doc/5.t b/usr.sbin/lpr/SMM.doc/5.t deleted file mode 100644 index 137a342..0000000 --- a/usr.sbin/lpr/SMM.doc/5.t +++ /dev/null @@ -1,116 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)5.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Output filter specifications -.PP -The filters supplied with 4.3BSD -handle printing and accounting for most common -line printers, the Benson-Varian, the wide (36") and -narrow (11") Versatec printer/plotters. For other devices or accounting -methods, it may be necessary to create a new filter. -.PP -Filters are spawned by \fIlpd\fP -with their standard input the data to be printed, and standard output -the printer. The standard error is attached to the -.B lf -file for logging errors or \fIsyslogd\fP may be used for logging errors. -A filter must return a 0 exit -code if there were no errors, 1 if the job should be reprinted, -and 2 if the job should be thrown away. -When \fIlprm\fP -sends a kill signal to the \fIlpd\fP process controlling -printing, it sends a SIGINT signal -to all filters and descendents of filters. -This signal can be trapped by filters that need -to do cleanup operations such as -deleting temporary files. -.PP -Arguments passed to a filter depend on its type. -The -.B of -filter is called with the following arguments. -.DS -\fIfilter\fP \fB\-w\fPwidth \fB\-l\fPlength -.DE -The \fIwidth\fP and \fIlength\fP values come from the -.B pw -and -.B pl -entries in the printcap database. -The -.B if -filter is passed the following parameters. -.DS -\fIfilter\fP [\|\fB\-c\fP\|] \fB\-w\fPwidth \fB\-l\fPlength \fB\-i\fPindent \fB\-n\fP login \fB\-h\fP host accounting_file -.DE -The -.B \-c -flag is optional, and only supplied when control characters -are to be passed uninterpreted to the printer (when using the -.B \-l -option of -.I lpr -to print the file). -The -.B \-w -and -.B \-l -parameters are the same as for the -.B of -filter. -The -.B \-n -and -.B \-h -parameters specify the login name and host name of the job owner. -The last argument is the name of the accounting file from -.IR printcap . -.PP -All other filters are called with the following arguments: -.DS -\fIfilter\fP \fB\-x\fPwidth \fB\-y\fPlength \fB\-n\fP login \fB\-h\fP host accounting_file -.DE -The -.B \-x -and -.B \-y -options specify the horizontal and vertical page -size in pixels (from the -.B px -and -.B py -entries in the printcap file). -The rest of the arguments are the same as for the -.B if -filter. diff --git a/usr.sbin/lpr/SMM.doc/6.t b/usr.sbin/lpr/SMM.doc/6.t deleted file mode 100644 index 7087790..0000000 --- a/usr.sbin/lpr/SMM.doc/6.t +++ /dev/null @@ -1,94 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)6.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Line printer Administration -.PP -The -.I lpc -program provides local control over line printer activity. -The major commands and their intended use will be described. -The command format and remaining commands are described in -.IR lpc (8). -.LP -\fBabort\fP and \fBstart\fP -.IP -.I Abort -terminates an active spooling daemon on the local host immediately and -then disables printing (preventing new daemons from being started by -.IR lpr ). -This is normally used to forcibly restart a hung line printer daemon -(i.e., \fIlpq\fP reports that there is a daemon present but nothing is -happening). It does not remove any jobs from the queue -(use the \fIlprm\fP command instead). -.I Start -enables printing and requests \fIlpd\fP to start printing jobs. -.LP -\fBenable\fP and \fBdisable\fP -.IP -\fIEnable\fP and \fIdisable\fP allow spooling in the local queue to be -turned on/off. -This will allow/prevent -.I lpr -from putting new jobs in the spool queue. It is frequently convenient -to turn spooling off while testing new line printer filters since the -.I root -user can still use -.I lpr -to put jobs in the queue but no one else can. -The other main use is to prevent users from putting jobs in the queue -when the printer is expected to be unavailable for a long time. -.LP -\fBrestart\fP -.IP -.I Restart -allows ordinary users to restart printer daemons when -.I lpq -reports that there is no daemon present. -.LP -\fBstop\fP -.IP -.I Stop -halts a spooling daemon after the current job completes; -this also disables printing. This is a clean way to shutdown a -printer to do maintenance, etc. Note that users can still enter jobs in a -spool queue while a printer is -.IR stopped . -.LP -\fBtopq\fP -.IP -.I Topq -places jobs at the top of a printer queue. This can be used -to reorder high priority jobs since -.I lpr -only provides first-come-first-serve ordering of jobs. diff --git a/usr.sbin/lpr/SMM.doc/7.t b/usr.sbin/lpr/SMM.doc/7.t deleted file mode 100644 index a6f6bea..0000000 --- a/usr.sbin/lpr/SMM.doc/7.t +++ /dev/null @@ -1,226 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)7.t 8.1 (Berkeley) 6/8/93 -.\" -.NH 1 -Troubleshooting -.PP -There are several messages that may be generated by the -the line printer system. This section -categorizes the most common and explains the cause -for their generation. Where the message implies a failure, -directions are given to remedy the problem. -.PP -In the examples below, the name -.I printer -is the name of the printer from the -.I printcap -database. -.NH 2 -LPR -.SH -lpr: \fIprinter\fP\|: unknown printer -.IP -The -.I printer -was not found in the -.I printcap -database. Usually this is a typing mistake; however, it may indicate -a missing or incorrect entry in the /etc/printcap file. -.SH -lpr: \fIprinter\fP\|: jobs queued, but cannot start daemon. -.IP -The connection to -.I lpd -on the local machine failed. -This usually means the printer server started at -boot time has died or is hung. Check the local socket -/dev/printer to be sure it still exists (if it does not exist, -there is no -.I lpd -process running). -Usually it is enough to get a super-user to type the following to -restart -.IR lpd . -.DS -% /usr/lib/lpd -.DE -You can also check the state of the master printer daemon with the following. -.DS -% ps l`cat /usr/spool/lpd.lock` -.DE -.IP -Another possibility is that the -.I lpr -program is not set-user-id to \fIroot\fP, set-group-id to group \fIdaemon\fP. -This can be checked with -.DS -% ls \-lg /usr/ucb/lpr -.DE -.SH -lpr: \fIprinter\fP\|: printer queue is disabled -.IP -This means the queue was turned off with -.DS -% lpc disable \fIprinter\fP -.DE -to prevent -.I lpr -from putting files in the queue. This is normally -done by the system manager when a printer is -going to be down for a long time. The -printer can be turned back on by a super-user with -.IR lpc . -.NH 2 -LPQ -.SH -waiting for \fIprinter\fP to become ready (offline ?) -.IP -The printer device could not be opened by the daemon. -This can happen for several reasons, -the most common is that the printer is turned off-line. -This message can also be generated if the printer is out -of paper, the paper is jammed, etc. -The actual reason is dependent on the meaning -of error codes returned by system device driver. -Not all printers supply enough information -to distinguish when a printer is off-line or having -trouble (e.g. a printer connected through a serial line). -Another possible cause of this message is -some other process, such as an output filter, -has an exclusive open on the device. Your only recourse -here is to kill off the offending program(s) and -restart the printer with -.IR lpc . -.SH -\fIprinter\fP is ready and printing -.IP -The -.I lpq -program checks to see if a daemon process exists for -.I printer -and prints the file \fIstatus\fP located in the spooling directory. -If the daemon is hung, a super user can use -.I lpc -to abort the current daemon and start a new one. -.SH -waiting for \fIhost\fP to come up -.IP -This implies there is a daemon trying to connect to the remote -machine named -.I host -to send the files in the local queue. -If the remote machine is up, -.I lpd -on the remote machine is probably dead or -hung and should be restarted as mentioned for -.IR lpr . -.SH -sending to \fIhost\fP -.IP -The files should be in the process of being transferred to the remote -.IR host . -If not, the local daemon should be aborted and started with -.IR lpc . -.SH -Warning: \fIprinter\fP is down -.IP -The printer has been marked as being unavailable with -.IR lpc . -.SH -Warning: no daemon present -.IP -The \fIlpd\fP process overseeing -the spooling queue, as specified in the ``lock'' file -in that directory, does not exist. This normally occurs -only when the daemon has unexpectedly died. -The error log file for the printer and the \fIsyslogd\fP logs -should be checked for a -diagnostic from the deceased process. -To restart an \fIlpd\fP, use -.DS -% lpc restart \fIprinter\fP -.DE -.SH -no space on remote; waiting for queue to drain -.IP -This implies that there is insufficient disk space on the remote. -If the file is large enough, there will never be enough space on -the remote (even after the queue on the remote is empty). The solution here -is to move the spooling queue or make more free space on the remote. -.NH 2 -LPRM -.SH -lprm: \fIprinter\fP\|: cannot restart printer daemon -.IP -This case is the same as when -.I lpr -prints that the daemon cannot be started. -.NH 2 -LPD -.PP -The -.I lpd -program can log many different messages using \fIsyslogd\fP\|(8). -Most of these messages are about files that can not -be opened and usually imply that the -.I printcap -file or the protection modes of the files are -incorrect. Files may also be inaccessible if people -manually manipulate the line printer system (i.e. they -bypass the -.I lpr -program). -.PP -In addition to messages generated by -.IR lpd , -any of the filters that -.I lpd -spawns may log messages using \fIsyslogd\fP or to the error log file -(the file specified in the \fBlf\fP entry in \fIprintcap\fP\|). -.NH 2 -LPC -.PP -.SH -couldn't start printer -.IP -This case is the same as when -.I lpr -reports that the daemon cannot be started. -.SH -cannot examine spool directory -.IP -Error messages beginning with ``cannot ...'' are usually because of -incorrect ownership or protection mode of the lock file, spooling -directory or the -.I lpc -program. diff --git a/usr.sbin/lpr/SMM.doc/Makefile b/usr.sbin/lpr/SMM.doc/Makefile deleted file mode 100644 index d80c8ce..0000000 --- a/usr.sbin/lpr/SMM.doc/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# From: @(#)Makefile 8.1 (Berkeley) 6/8/93 -# $FreeBSD$ - -BINDIR= /usr/share/doc -VOLUME= smm/07.lpd -SRCS= 0.t 1.t 2.t 3.t 4.t 5.t 6.t 7.t -MACROS= -ms - -USE_TBL= -SRCDIR= ${.CURDIR} - -.include diff --git a/usr.sbin/lpr/SMM.doc/spell.ok b/usr.sbin/lpr/SMM.doc/spell.ok deleted file mode 100644 index bf31319..0000000 --- a/usr.sbin/lpr/SMM.doc/spell.ok +++ /dev/null @@ -1,70 +0,0 @@ -Aprinter -Bprinter -CRMOD -Cprinter -DecWriter -Dprinter -Eprinter -LPC -LPD -Lpd -Manual''SMM:5 -SIGINT -SMM:5 -Topq -XTABS -adm -af -br -daemon -daemons -dev -f:of -fs -hosts.equiv -hosts.lpd -lf -lg -lib -lp:br -lp:sd -lpc -lpd -lpd.lock -lpf -lpf:lf -lprgroup -makefile -mx -offline -pl -printcap -pw -py -rc -rcmd -rg -rlogin -rp -rs -rsh -rshd -rvcat -rvcat:af -rvcat:mx -sd -src -syslogd -tf -topq -ucb -ucbvax -ucbvax:rp -usr.lib -va0:sd -vaacct -vad:of -varian -vaxlpd -vpf -vpf:tf diff --git a/usr.sbin/timed/SMM.doc/timed/Makefile b/usr.sbin/timed/SMM.doc/timed/Makefile deleted file mode 100644 index 9afa6c6..0000000 --- a/usr.sbin/timed/SMM.doc/timed/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 6/8/93 -# $FreeBSD$ - -DIR= smm/12.timed -SRCS= timed.ms -MACROS= -ms -PRINTER=Pdp - -paper.${PRINTER}: ${SRCS} - ${SOELIM} ${SRCS} | ${TBL} | ${ROFF} > ${.TARGET} - -.include diff --git a/usr.sbin/timed/SMM.doc/timed/date b/usr.sbin/timed/SMM.doc/timed/date deleted file mode 100644 index e4e4d58..0000000 --- a/usr.sbin/timed/SMM.doc/timed/date +++ /dev/null @@ -1,53 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)date 8.1 (Berkeley) 6/8/93 -.\" -.ft B -.TS -center; -ce | ce | ce | ce -| c | c | c | s | -| c s s s |. -Byte 1 Byte 2 Byte 3 Byte 4 -= -Type Version No. Sequence No. -_ -Seconds of Time to Set -_ -Microseconds of Time to Set -_ -Machine Name -_ -\&. . . -_ -.TE -.ft R diff --git a/usr.sbin/timed/SMM.doc/timed/loop b/usr.sbin/timed/SMM.doc/timed/loop deleted file mode 100644 index 11ccb4d..0000000 --- a/usr.sbin/timed/SMM.doc/timed/loop +++ /dev/null @@ -1,54 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)loop 8.1 (Berkeley) 6/8/93 -.\" -.ft B -.TS -center; -ce | ce | ce | ce -| c | c | c | s | -| c | c s s | -| c s s s |. -Byte 1 Byte 2 Byte 3 Byte 4 -= -Type Version No. Sequence No. -_ -Hop Count ( unused ) -_ -( unused ) -_ -Machine Name -_ -\&. . . -_ -.TE -.ft R diff --git a/usr.sbin/timed/SMM.doc/timed/spell.ok b/usr.sbin/timed/SMM.doc/timed/spell.ok deleted file mode 100644 index 8ecfe15..0000000 --- a/usr.sbin/timed/SMM.doc/timed/spell.ok +++ /dev/null @@ -1,34 +0,0 @@ -ACK -ADJTIME -Adjtime -CS -CSELT -Candidature -DATEACK -DoD -Gusella -MASTERACK -MASTERREQ -MASTERUP -MSITE -MSITEREQ -Protocol''SMM:22 -Riccardo -SETDATE -SETDATEREQ -SETTIME -SLAVEUP -SMM:22 -Stefano -TRACEOFF -TRACEON -TSP -Timedc -UDP -USENIX -Zatti -candidature -ce -daemon -daemons -timedc diff --git a/usr.sbin/timed/SMM.doc/timed/time b/usr.sbin/timed/SMM.doc/timed/time deleted file mode 100644 index 619d171..0000000 --- a/usr.sbin/timed/SMM.doc/timed/time +++ /dev/null @@ -1,53 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)time 8.1 (Berkeley) 6/8/93 -.\" -.ft B -.TS -center; -ce | ce | ce | ce -| c | c | c | s | -| c s s s |. -Byte 1 Byte 2 Byte 3 Byte 4 -= -Type Version No. Sequence No. -_ -Seconds of Adjustment -_ -Microseconds of Adjustment -_ -Machine Name -_ -\&. . . -_ -.TE -.ft R diff --git a/usr.sbin/timed/SMM.doc/timed/timed.ms b/usr.sbin/timed/SMM.doc/timed/timed.ms deleted file mode 100644 index 412399a..0000000 --- a/usr.sbin/timed/SMM.doc/timed/timed.ms +++ /dev/null @@ -1,462 +0,0 @@ -.\" $FreeBSD$ -.\" -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)timed.ms 8.1 (Berkeley) 6/8/93 -.\" -.TL -The Berkeley -.UX -.br -Time Synchronization Protocol -.AU -Riccardo Gusella, Stefano Zatti, and James M. Bloom -.AI -Computer Systems Research Group -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, CA 94720 -.FS -This work was sponsored by the Defense Advanced Research Projects Agency -(DoD), monitored by the Naval Electronics Systems -Command under contract No. N00039-84-C-0089, and by the Italian CSELT -Corporation. -The views and conclusions contained in this document are those of the -authors and should not be interpreted as representing official policies, -either expressed or implied, of the Defense Research Projects Agency, -of the US Government, or of CSELT. -.FE -.LP -.OH 'The Berkeley UNIX Time Synchronization Protocol''SMM:12-%' -.EH 'SMM:12-%''The Berkeley UNIX Time Synchronization Protocol' -.SH -Introduction -.PP -The Time Synchronization Protocol (TSP) -has been designed for specific use by the program \fItimed\fP, -a local area network clock synchronizer for -the UNIX 4.3BSD operating -system. -Timed is built on the DARPA UDP protocol [4] and -is based on a master slave scheme. -.PP -TSP serves a dual purpose. -First, it supports messages for the synchronization of the clocks -of the various hosts in a local area network. -Second, it supports messages for the election that occurs -among slave time daemons when, for any reason, the master disappears. -The synchronization mechanism and the election procedure -employed by the program timed are described -in other documents [1,2,3]. -.PP -Briefly, the synchronization software, which works in a -local area network, consists of a collection of \fItime daemons\fP -(one per machine) and is based on a master-slave -structure. -The present implementation keeps processor clocks synchronized -within 20 milliseconds. -A \fImaster time daemon\fP measures the time -difference between the clock of the machine on which it -is running and those of all other machines. The current implementation -uses ICMP \fITime Stamp Requests\fP [5] to measure the clock difference -between machines. -The master computes the \fInetwork time\fP as the average of the -times provided by nonfaulty clocks.\** -.FS -A clock is considered to be faulty when its value -is more than a small specified -interval apart from the majority of the clocks -of the machines on the same network. -See [1,2] for more details. -.FE -It then sends to each \fIslave time daemon\fP the -correction that should be performed on the clock of its machine. -This process is repeated periodically. -Since the correction is expressed as a time difference rather than an -absolute time, transmission delays do not interfere with synchronization. -When a machine comes up and joins the network, -it starts a slave time daemon, which -will ask the master for the correct time and will reset the machine's clock -before any user activity can begin. -The time daemons therefore maintain a single network time in spite of -the drift of clocks away from each other. -.PP -Additionally, a time daemon on gateway machines may run as -a \fIsubmaster\fP. -A submaster time daemon functions as a slave on one network that -already has a master and as master on other networks. -In addition, a submaster is responsible for propagating broadcast -packets from one network to the other. -.PP -To ensure that service provided is continuous and reliable, -it is necessary to implement an election algorithm that will elect a -new master should the machine running the current master crash, the master -terminate (for example, because of a run-time error), or the network be -partitioned. -Under our algorithm, slaves are able to realize when the master has -stopped functioning and to elect a new master from among themselves. -It is important to note that since the failure of the master results -only in a gradual divergence of clock values, the election -need not occur immediately. -.PP -All the communication occurring among time daemons uses the TSP -protocol. -While some messages need not be sent in a reliable way, -most communication in TSP requires reliability not provided by the underlying -protocol. -Reliability is achieved by the use of acknowledgements, sequence numbers, and -retransmission when message losses occur. -When a message that requires acknowledgment is not acknowledged after -multiple attempts, -the time daemon that has sent the message will assume that the -addressee is down. -This document will not describe the details of how reliability is -implemented, but will only point out when -a message type requires a reliable transport mechanism. -.PP -The message format in TSP is the same for all message types; -however, in some instances, one or more fields are not used. -The next section describes the message format. -The following sections describe -in detail the different message types, their use and the contents -of each field. NOTE: The message format is likely to change in -future versions of timed. -.sp 2 -.SH -Message Format -.PP -All fields are based upon 8-bit bytes. Fields should be sent in -network byte order if they are more than one byte long. -The structure of a TSP message is the following: -.IP 1) -A one byte message type. -.IP 2) -A one byte version number, specifying the protocol version which the -message uses. -.IP 3) -A two byte sequence number to be used for recognizing duplicate messages -that occur when messages are retransmitted. -.IP 4) -Eight bytes of packet specific data. This field contains two 4 byte time -values, a one byte hop count, or may be unused depending on the type -of the packet. -.IP 5) -A zero-terminated string of up to 256 \s-2ASCII\s+2 characters with the name of -the machine sending the message. -.PP -The following charts describe the message types, -show their fields, and explain their usages. -For the purpose of the following discussion, a time daemon can -be considered to be in -one of three states: slave, master, or candidate for election to master. -Also, the term \fIbroadcast\fP refers to -the sending of a message to all active time daemons. -.sp 1 -.SH -Adjtime Message -.so time -.LP -Type: TSP_ADJTIME (1) -.sp 1 -.PP -The master sends this message to a slave to communicate -the difference between -the clock of the slave and -the network time the master has just computed. -The slave will accordingly -adjust the time of its machine. -This message requires an acknowledgment. -.sp 1 -.SH -Acknowledgment Message -.so unused -.LP -Type: TSP_ACK (2) -.sp 1 -.PP -Both the master and the slaves use this message for -acknowledgment only. -It is used in several different contexts, for example -in reply to an Adjtime message. -.sp 1 -.SH -Master Request Message -.so unused -.LP -Type: TSP_MASTERREQ (3) -.sp 1 -.PP -A newly-started time daemon broadcasts this message to -locate a master. No other action is implied by this packet. -It requires a Master Acknowledgment. -.sp 1 -.SH -Master Acknowledgement -.so unused -.LP -Type: TSP_MASTERACK (4) -.sp 1 -.PP -The master sends this message to acknowledge the Master Request message -and the Conflict Resolution Message. -.sp 1 -.SH -Set Network Time Message -.so date -.LP -Type: TSP_SETTIME (5) -.sp 1 -.PP -The master sends this message to slave time daemons to set their time. -This packet is sent to newly started time daemons and when the network -date is changed. -It contains the master's time as an approximation of the network time. -It requires an acknowledgment. -The next -synchronization round will eliminate the small time difference -caused by the random delay in the communication channel. -.sp 1 -.SH -Master Active Message -.so unused -.LP -Type: TSP_MASTERUP (6) -.sp 1 -.PP -The master broadcasts this message to -solicit the names of the active slaves. -Slaves will reply with a Slave Active message. -.sp 1 -.SH -Slave Active Message -.so unused -.LP -Type: TSP_SLAVEUP (7) -.sp 1 -.PP -A slave sends this message to the master in answer to a Master Active message. -This message is also sent when a new slave starts up to inform the master that -it wants to be synchronized. -.sp 1 -.SH -Master Candidature Message -.so unused -.LP -Type: TSP_ELECTION (8) -.sp 1 -.PP -A slave eligible to become a master broadcasts this message when its election -timer expires. -The message declares that the slave wishes to become the new master. -.sp 1 -.SH -Candidature Acceptance Message -.so unused -.LP -Type: TSP_ACCEPT (9) -.sp 1 -.PP -A slave sends this message to accept the candidature of the time daemon -that has broadcast an Election message. -The candidate will add the slave's name to the list of machines that it -will control should it become the master. -.sp 1 -.SH -Candidature Rejection Message -.so unused -.LP -Type: TSP_REFUSE (10) -.sp 1 -.PP -After a slave accepts the candidature of a time daemon, it will reply -to any election messages from other slaves -with this message. -This rejects any candidature other than the first received. -.sp 1 -.SH -Multiple Master Notification Message -.so unused -.LP -Type: TSP_CONFLICT (11) -.sp 1 -.PP -When two or more masters reply to a Master Request message, the slave -uses this message to inform one of them that more than one master exists. -.sp 1 -.SH -Conflict Resolution Message -.so unused -.LP -Type: TSP_RESOLVE (12) -.sp 1 -.PP -A master which has been informed of the existence of other masters -broadcasts this message to determine who the other masters are. -.sp 1 -.SH -Quit Message -.so unused -.LP -Type: TSP_QUIT (13) -.sp 1 -.PP -This message is sent by the master in three different contexts: -1) to a candidate that broadcasts a Master Candidature message, -2) to another master when notified of its existence, -3) to another master if a loop is detected. -In all cases, the recipient time daemon will become a slave. -This message requires an acknowledgement. -.sp 1 -.SH -Set Date Message -.so date -.LP -Type: TSP_SETDATE (22) -.sp 1 -.PP -The program \fIdate\fP\|(1) sends this message to the local time daemon -when a super-user wants to set the network date. -If the local time daemon is the master, it will set the date; -if it is a slave, it will communicate the desired date to the master. -.sp 1 -.SH -Set Date Request Message -.so date -.LP -Type: TSP_SETDATEREQ (23) -.sp 1 -.PP -A slave that has received a Set Date message will communicate the -desired date to the master using this message. -.sp 1 -.SH -Set Date Acknowledgment Message -.so unused -.LP -Type: TSP_DATEACK (16) -.sp 1 -.PP -The master sends this message to a slave in acknowledgment of a -Set Date Request Message. -The same message is sent by the local time daemon to the program -\fIdate(1)\fP to confirm that the network date has been set by the -master. -.sp 1 -.SH -Start Tracing Message -.so unused -.LP -Type: TSP_TRACEON (17) -.sp 1 -.PP -The controlling program \fItimedc\fP sends this message to the local -time daemon to start the recording in a system file of -all messages received. -.sp 1 -.SH -Stop Tracing Message -.so unused -.LP -Type: TSP_TRACEOFF (18) -.sp 1 -.PP -\fITimedc\fP sends this message to the local -time daemon to stop the recording of -messages received. -.sp 1 -.SH -Master Site Message -.so unused -.LP -Type: TSP_MSITE (19) -.sp 1 -.PP -\fITimedc\fP sends this message to the local time daemon to find out -where the master is running. -.sp 1 -.SH -Remote Master Site Message -.so unused -.LP -Type: TSP_MSITEREQ (20) -.sp 1 -.PP -A local time daemon broadcasts this message to find the location -of the master. -It then uses the Acknowledgement message to -communicate this location to \fItimedc\fP. -.sp 1 -.SH -Test Message -.so unused -.LP -Type: TSP_TEST (21) -.sp 1 -.PP -For testing purposes, \fItimedc\fP sends this message to a slave -to cause its election timer to expire. NOTE: \fItimed\fP -is not normally compiled to support this. -.sp 1 -.SH -.SH -Loop Detection Message -.so loop -.LP -Type: TSP_LOOP (24) -.sp 1 -.PP -This packet is initiated by all masters occasionally to attempt to detect loops. -All submasters forward this packet onto the networks over which they are master. -If a master receives a packet it sent out initially, -it knows that a loop exists and tries to correct the problem. -.SH -References -.IP 1. -R. Gusella and S. Zatti, -\fITEMPO: A Network Time Controller for Distributed Berkeley UNIX System\fP, -USENIX Summer Conference Proceedings, Salt Lake City, June 1984. -.IP 2. -R. Gusella and S. Zatti, \fIClock Synchronization in a Local Area Network\fP, -University of California, Berkeley, Technical Report, \fIto appear\fP. -.IP 3. -R. Gusella and S. Zatti, -\fIAn Election Algorithm for a Distributed Clock Synchronization Program\fP, -University of California, Berkeley, CS Technical Report #275, Dec. 1985. -.IP 4. -Postel, J., \fIUser Datagram Protocol\fP, RFC 768. -Network Information Center, SRI International, Menlo Park, California, -August 1980. -.IP 5. -Postel, J., \fIInternet Control Message Protocol\fP, RFC 792. -Network Information Center, SRI International, Menlo Park, California, -September 1981. diff --git a/usr.sbin/timed/SMM.doc/timed/unused b/usr.sbin/timed/SMM.doc/timed/unused deleted file mode 100644 index adadfc3..0000000 --- a/usr.sbin/timed/SMM.doc/timed/unused +++ /dev/null @@ -1,53 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)unused 8.1 (Berkeley) 6/8/93 -.\" -.ft B -.TS -center; -ce | ce | ce | ce -| c | c | c | s | -| c s s s |. -Byte 1 Byte 2 Byte 3 Byte 4 -= -Type Version No. Sequence No. -_ -( unused ) -_ -( unused ) -_ -Machine Name -_ -\&. . . -_ -.TE -.ft R diff --git a/usr.sbin/timed/SMM.doc/timedop/Makefile b/usr.sbin/timed/SMM.doc/timedop/Makefile deleted file mode 100644 index 7d52a32..0000000 --- a/usr.sbin/timed/SMM.doc/timedop/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 6/8/93 -# $FreeBSD$ - -DIR= smm/11.timedop -SRCS= timed.ms -MACROS= -ms - -.include diff --git a/usr.sbin/timed/SMM.doc/timedop/timed.ms b/usr.sbin/timed/SMM.doc/timedop/timed.ms deleted file mode 100644 index feea0b5..0000000 --- a/usr.sbin/timed/SMM.doc/timedop/timed.ms +++ /dev/null @@ -1,279 +0,0 @@ -.\" Copyright (c) 1986, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)timed.ms 8.1 (Berkeley) 6/8/93 -.\" -.TL -Timed Installation and Operation Guide -.AU -Riccardo Gusella, Stefano Zatti, James M. Bloom -.AI -Computer Systems Research Group -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, CA 94720 -.AU -Kirk Smith -.AI -Engineering Computer Network -Department of Electrical Engineering -Purdue University -West Lafayette, IN 47906 -.FS -This work was sponsored by the Defense Advanced Research Projects Agency -(DoD), monitored by the Naval Electronics Systems -Command under contract No. N00039-84-C-0089, and by the CSELT -Corporation of Italy. -The views and conclusions contained in this document are those of the -authors and should not be interpreted as representing official policies, -either expressed or implied, of the Defense Research Projects Agency, -of the US Government, or of CSELT. -.FE -.LP -.EH 'SMM:11-%''Timed Installation and Operation' -.OH 'Timed Installation and Operation''SMM:11-%' -.SH -Introduction -.PP -The clock synchronization service for -the UNIX 4.3BSD operating system is composed of a collection of -time daemons (\fItimed\fP) running on the machines in a local -area network. -The algorithms implemented by the service is based on a master-slave scheme. -The time daemons communicate with each other using the -\fITime Synchronization Protocol\fP (TSP) which -is built on the DARPA UDP protocol and described in detail in [4]. -.PP -A time daemon has a twofold function. -First, it supports the synchronization of the clocks -of the various hosts in a local area network. -Second, it starts (or takes part in) the election that occurs -among slave time daemons when, for any reason, the master disappears. -The synchronization mechanism and the election procedure -employed by the program \fItimed\fP are described -in other documents [1,2,3]. -The next paragraphs are a brief overview of how the time daemon works. -This document is mainly concerned with the administrative and technical -issues of running \fItimed\fP at a particular site. -.PP -A \fImaster time daemon\fP measures the time -differences between the clock of the machine on which it -is running and those of all other machines. -The master computes the \fInetwork time\fP as the average of the -times provided by nonfaulty clocks.\** -.FS -A clock is considered to be faulty when its value -is more than a small specified -interval apart from the majority of the clocks -of the other machines [1,2]. -.FE -It then sends to each \fIslave time daemon\fP the -correction that should be performed on the clock of its machine. -This process is repeated periodically. -Since the correction is expressed as a time difference rather than an -absolute time, transmission delays do not interfere with -the accuracy of the synchronization. -When a machine comes up and joins the network, -it starts a slave time daemon which -will ask the master for the correct time and will reset the machine's clock -before any user activity can begin. -The time daemons are able to maintain a single network time in spite of -the drift of clocks away from each other. -The present implementation keeps processor clocks synchronized -within 20 milliseconds. -.PP -To ensure that the service provided is continuous and reliable, -it is necessary to implement an election algorithm to elect a -new master should the machine running the current master crash, the master -terminate (for example, because of a run-time error), or -the network be partitioned. -Under our algorithm, slaves are able to realize when the master has -stopped functioning and to elect a new master from among themselves. -It is important to note that, since the failure of the master results -only in a gradual divergence of clock values, the election -need not occur immediately. -.PP -The machines that are gateways between distinct local area -networks require particular care. -A time daemon on such machines may act as a \fIsubmaster\fP. -This artifact depends on the current inability of -transmission protocols to broadcast a message on a network -other than the one to which the broadcasting machine is connected. -The submaster appears as a slave on one network, and as a master -on one or more of the other networks to which it is connected. -.PP -A submaster classifies each network as one of three types. -A \fIslave network\fP is a network on which the submaster acts as a slave. -There can only be one slave network. -A \fImaster network\fP is a network on which the submaster acts as a master. -An \fIignored network\fP is any other network which already has a valid master. -The submaster tries periodically to become master on an ignored -network, but gives up immediately if a master already exists. -.SH -Guidelines -.PP -While the synchronization algorithm is quite general, the election -one, requiring a broadcast mechanism, puts constraints on -the kind of network on which time daemons can run. -The time daemon will only work on networks with broadcast capability -augmented with point-to-point links. -Machines that are only connected to point-to-point, -non-broadcast networks may not use the time daemon. -.PP -If we exclude submasters, there will normally be, at most, one master time -daemon in a local area internetwork. -During an election, only one of the slave time daemons -will become the new master. -However, because of the characteristics of its machine, -a slave can be prevented from becoming the master. -Therefore, a subset of machines must be designated as potential -master time daemons. -A master time daemon will require CPU resources -proportional to the number of slaves, in general, more than -a slave time daemon, so it may be advisable to limit master time -daemons to machines with more powerful processors or lighter loads. -Also, machines with inaccurate clocks should not be used as masters. -This is a purely administrative decision: an organization may -well allow all of its machines to run master time daemons. -.PP -At the administrative level, a time daemon on a machine -with multiple network interfaces, may be told to ignore all -but one network or to ignore one network. -This is done with the \fI\-n network\fP and \fI\-i network\fP -options respectively at start-up time. -Typically, the time daemon would be instructed to ignore all but -the networks belonging to the local administrative control. -.PP -There are some limitations to the current -implementation of the time daemon. -It is expected that these limitations will be removed in future releases. -The constant NHOSTS in /usr/src/etc/timed/globals.h limits the -maximum number of machines that may be directly controlled by one -master time daemon. -The current maximum is 29 (NHOSTS \- 1). -The constant must be changed and the program recompiled if a site wishes to -run \fItimed\fP on a larger (inter)network. -.PP -In addition, there is a \fIpathological situation\fP to -be avoided at all costs, that might occur when -time daemons run on multiply-connected local area networks. -In this case, as we have seen, time daemons running on gateway machines -will be submasters and they will act on some of those -networks as master time daemons. -Consider machines A and B that are both gateways between -networks X and Y. -If time daemons were started on both A and B without constraints, it would be -possible for submaster time daemon A to be a slave on network X -and the master on network Y, while submaster time daemon B is a slave on -network Y and the master on network X. -This \fIloop\fP of master time daemons will not function properly -or guarantee a unique time on both networks, and will cause -the submasters to use large amounts of system resources in the form -of network bandwidth and CPU time. -In fact, this kind of \fIloop\fP can also be generated with more -than two master time daemons, -when several local area networks are interconnected. -.SH -Installation -.PP -In order to start the time daemon on a given machine, -the following lines should be -added to the \fIlocal daemons\fP section in the file \fI/etc/rc.local\fP: -.sp 2 -.in 1i -.nf -if [ -f /etc/timed ]; then - /etc/timed \fIflags\fP & echo -n ' timed' >/dev/console -fi -.fi -.in -1i -.sp -.LP -In any case, they must appear after the network -is configured via ifconfig(8). -.PP -Also, the file \fI/etc/services\fP should contain the following -line: -.sp 2 -.ti 1i -timed 525/udp timeserver -.sp -.LP -The \fIflags\fP are: -.IP "-n network" 13 -to consider the named network. -.IP "-i network" -to ignore the named network. -.IP -t -to place tracing information in \fI/usr/adm/timed.log\fP. -.IP -M -to allow this time daemon to become a master. -A time daemon run without this option will be forced in the state of -slave during an election. -.SH -Daily Operation -.PP -\fITimedc(8)\fP is used to control the operation of the time daemon. -It may be used to: -.IP \(bu -measure the differences between machines' clocks, -.IP \(bu -find the location where the master \fItimed\fP is running, -.IP \(bu -cause election timers on several machines to expire at the same time, -.IP \(bu -enable or disable tracing of messages received by \fItimed\fP. -.LP -See the manual page on \fItimed\fP\|(8) and \fItimedc\fP\|(8) -for more detailed information. -.PP -The \fIdate(1)\fP command can be used to set the network date. -In order to set the time on a single machine, the \fI-n\fP flag -can be given to date(1). -.bp -.SH -References -.IP 1. -R. Gusella and S. Zatti, -\fITEMPO: A Network Time Controller for Distributed Berkeley UNIX System\fP, -USENIX Summer Conference Proceedings, Salt Lake City, June 1984. -.IP 2. -R. Gusella and S. Zatti, \fIClock Synchronization in a Local Area Network\fP, -University of California, Berkeley, Technical Report, \fIto appear\fP. -.IP 3. -R. Gusella and S. Zatti, -\fIAn Election Algorithm for a Distributed Clock Synchronization Program\fP, -University of California, Berkeley, CS Technical Report #275, Dec. 1985. -.IP 4. -R. Gusella and S. Zatti, -\fIThe Berkeley UNIX 4.3BSD Time Synchronization Protocol\fP, -UNIX Programmer's Manual, 4.3 Berkeley Software Distribution, Volume 2c. -- cgit v1.1 From 27a502627f86e73e105457ee9aa6fe3a603b7e97 Mon Sep 17 00:00:00 2001 From: uqs Date: Sat, 4 Dec 2010 11:40:40 +0000 Subject: Document two more ways to find duplicates in the obsolete file list. Remove the only duplicate found by the optional files check. Fix typos, while here. Suggested by: netchild --- ObsoleteFiles.inc | 19 +++++++++++++++++-- tools/build/mk/OptionalObsoleteFiles.inc | 1 - 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 0756547..e406532 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -22,16 +22,31 @@ # grep '+=' /usr/src/tools/build/mk/OptionalObsoleteFiles.inc | sort -u) | \ # sort | uniq -d # +# To find regular duplicates not dependant on optional components, you can +# also use something that will not give you false positives, e.g.: +# for t in `make -V TARGETS universe`; do +# __MAKE_CONF=/dev/null make -f Makefile.inc1 TARGET=$t \ +# -V OLD_FILES -V OLD_LIBS -V OLD_DIRS check-old | \ +# xargs -n1 | sort | uniq -d; +# done +# +# For optional components, you can use the following to see if some entries +# in OptionalObsoleteFiles.inc have been obsoleted by ObsoleteFiles.inc +# for o in tools/build/options/WITH*; do +# __MAKE_CONF=/dev/null make -f Makefile.inc1 -D${o##*/} \ +# -V OLD_FILES -V OLD_LIBS -V OLD_DIRS check-old | \ +# xargs -n1 | sort | uniq -d; +# done # 20101112: vgonel(9) has gone to private API a while ago OLD_FILES+=usr/share/man/man9/vgonel.9.gz # 20101112: removed gasp.info OLD_FILES+=usr/share/info/gasp.info.gz -# 20101109: headers moved to machine/ to x86/ +# 20101109: headers moved from machine/ to x86/ .if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386" OLD_FILES+=usr/include/machine/mptable.h .endif -# 20101101: headers moved to machine/ to x86/ +# 20101101: headers moved from machine/ to x86/ .if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386" OLD_FILES+=usr/include/machine/apicreg.h OLD_FILES+=usr/include/machine/mca.h diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index 02a4ce3..db8251c 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -1869,7 +1869,6 @@ OLD_FILES+=usr/lib/libfl_p.a OLD_FILES+=usr/lib/libform_p.a OLD_FILES+=usr/lib/libformw_p.a OLD_FILES+=usr/lib/libftpio_p.a -OLD_FILES+=usr/lib/libg2c_p.a OLD_FILES+=usr/lib/libgcc_p.a OLD_FILES+=usr/lib/libgeom_p.a OLD_FILES+=usr/lib/libgnuregex_p.a -- cgit v1.1 From 1651f4683006c28c940e31292274f20ff6fafc35 Mon Sep 17 00:00:00 2001 From: uqs Date: Sat, 4 Dec 2010 14:19:27 +0000 Subject: traceroute(8): make WARNS=3 clean Also fixes an operator precedence bug for TCP tracerouting --- contrib/traceroute/as.c | 3 ++- contrib/traceroute/as.h | 2 +- contrib/traceroute/ifaddrlist.c | 8 ++++---- contrib/traceroute/traceroute.c | 13 +++++-------- usr.sbin/traceroute/Makefile | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/contrib/traceroute/as.c b/contrib/traceroute/as.c index ed2c440..fd2f961 100644 --- a/contrib/traceroute/as.c +++ b/contrib/traceroute/as.c @@ -56,13 +56,14 @@ struct aslookup { }; void * -as_setup(char *server) +as_setup(const char *server) { struct aslookup *asn; struct addrinfo hints, *res0, *res; FILE *f; int s, error; + s = -1; if (server == NULL) server = getenv("RA_SERVER"); if (server == NULL) diff --git a/contrib/traceroute/as.h b/contrib/traceroute/as.h index f0e66da..ce10b4b 100644 --- a/contrib/traceroute/as.h +++ b/contrib/traceroute/as.h @@ -30,6 +30,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ -void *as_setup(char *); +void *as_setup(const char *); unsigned int as_lookup(void *, char *, sa_family_t); void as_shutdown(void *); diff --git a/contrib/traceroute/ifaddrlist.c b/contrib/traceroute/ifaddrlist.c index 99c5fc1..b1d41d3 100644 --- a/contrib/traceroute/ifaddrlist.c +++ b/contrib/traceroute/ifaddrlist.c @@ -71,14 +71,14 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf) { register int fd, nipaddr; #ifdef HAVE_SOCKADDR_SA_LEN - register int n; + size_t n; #endif register struct ifreq *ifrp, *ifend, *ifnext, *mp; register struct sockaddr_in *sin; register struct ifaddrlist *al; struct ifconf ifc; struct ifreq ibuf[(32 * 1024) / sizeof(struct ifreq)], ifr; -#define MAX_IPADDR (sizeof(ibuf) / sizeof(ibuf[0])) +#define MAX_IPADDR ((int)(sizeof(ibuf) / sizeof(ibuf[0]))) static struct ifaddrlist ifaddrlist[MAX_IPADDR]; char device[sizeof(ifr.ifr_name) + 1]; @@ -91,10 +91,10 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf) ifc.ifc_buf = (caddr_t)ibuf; if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 || - ifc.ifc_len < sizeof(struct ifreq)) { + ifc.ifc_len < (int)sizeof(struct ifreq)) { if (errno == EINVAL) (void)sprintf(errbuf, - "SIOCGIFCONF: ifreq struct too small (%d bytes)", + "SIOCGIFCONF: ifreq struct too small (%zu bytes)", sizeof(ibuf)); else (void)sprintf(errbuf, "SIOCGIFCONF: %s", diff --git a/contrib/traceroute/traceroute.c b/contrib/traceroute/traceroute.c index e910d1b..db4d075 100644 --- a/contrib/traceroute/traceroute.c +++ b/contrib/traceroute/traceroute.c @@ -220,7 +220,6 @@ static const char rcsid[] = #include #include #include -#include #include #include @@ -1424,7 +1423,7 @@ tcp_check(const u_char *data, int seq) return (ntohs(tcp->th_sport) == ident && ntohs(tcp->th_dport) == port + (fixedPort ? 0 : seq)) - && tcp->th_seq == (ident << 16) | (port + seq); + && tcp->th_seq == (((tcp_seq)ident << 16) | (port + seq)); } void @@ -1497,19 +1496,17 @@ u_short p_cksum(struct ip *ip, u_short *data, int len) { static struct ipovly ipo; - u_short sumh, sumd; - u_long sumt; + u_short sum[2]; ipo.ih_pr = ip->ip_p; ipo.ih_len = htons(len); ipo.ih_src = ip->ip_src; ipo.ih_dst = ip->ip_dst; - sumh = in_cksum((u_short*)&ipo, sizeof(ipo)); /* pseudo ip hdr cksum */ - sumd = in_cksum((u_short*)data, len); /* payload data cksum */ - sumt = (sumh << 16) | (sumd); + sum[1] = in_cksum((u_short*)&ipo, sizeof(ipo)); /* pseudo ip hdr cksum */ + sum[0] = in_cksum(data, len); /* payload data cksum */ - return ~in_cksum((u_short*)&sumt, sizeof(sumt)); + return ~in_cksum(sum, sizeof(sum)); } /* diff --git a/usr.sbin/traceroute/Makefile b/usr.sbin/traceroute/Makefile index c77244f..103d206 100644 --- a/usr.sbin/traceroute/Makefile +++ b/usr.sbin/traceroute/Makefile @@ -31,7 +31,7 @@ LDADD= -lipsec CFLAGS+= -I${TRACEROUTE_DISTDIR} -WARNS?= 0 +WARNS?= 3 version.c: ${TRACEROUTE_DISTDIR}/VERSION @rm -f ${.TARGET} -- cgit v1.1 From 0114bdf52f64f9eaf589d9f88706c9519479deab Mon Sep 17 00:00:00 2001 From: uqs Date: Sat, 4 Dec 2010 14:19:35 +0000 Subject: traceroute6(8): make WARNS=3 clean --- usr.sbin/traceroute6/Makefile | 2 +- usr.sbin/traceroute6/traceroute6.c | 27 +++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/usr.sbin/traceroute6/Makefile b/usr.sbin/traceroute6/Makefile index e0b72a1..4428d5b 100644 --- a/usr.sbin/traceroute6/Makefile +++ b/usr.sbin/traceroute6/Makefile @@ -25,7 +25,7 @@ BINMODE= 4555 CFLAGS+= -DIPSEC -DUSE_RFC2292BIS -DHAVE_POLL CFLAGS+= -I${.CURDIR} -I${TRACEROUTE_DISTDIR} -I. -WARNS?= 1 +WARNS?= 3 DPADD= ${LIBIPSEC} LDADD= -lipsec diff --git a/usr.sbin/traceroute6/traceroute6.c b/usr.sbin/traceroute6/traceroute6.c index 699af68..1a67173 100644 --- a/usr.sbin/traceroute6/traceroute6.c +++ b/usr.sbin/traceroute6/traceroute6.c @@ -66,7 +66,7 @@ */ #ifndef lint -static char copyright[] = +static const char copyright[] = "@(#) Copyright (c) 1990, 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ @@ -322,7 +322,7 @@ void send_probe(int, u_long); void *get_uphdr(struct ip6_hdr *, u_char *); int get_hoplim(struct msghdr *); double deltaT(struct timeval *, struct timeval *); -char *pr_type(int); +const char *pr_type(int); int packet_ok(struct msghdr *, int, int); void print(struct msghdr *, int); const char *inetname(struct sockaddr *); @@ -372,12 +372,12 @@ main(argc, argv) { int mib[4] = { CTL_NET, PF_INET6, IPPROTO_IPV6, IPV6CTL_DEFHLIM }; char hbuf[NI_MAXHOST], src0[NI_MAXHOST], *ep; - int ch, i, on = 1, seq, rcvcmsglen, error, minlen; + int ch, i, on = 1, seq, rcvcmsglen, error; struct addrinfo hints, *res; static u_char *rcvcmsgbuf; u_long probe, hops, lport; struct hostent *hp; - size_t size; + size_t size, minlen; uid_t uid; /* @@ -671,11 +671,11 @@ main(argc, argv) datalen = minlen; else if (datalen >= MAXPACKET) { fprintf(stderr, - "traceroute6: packet size must be %d <= s < %ld.\n", - minlen, (long)MAXPACKET); + "traceroute6: packet size must be %zu <= s < %d.\n", + minlen, MAXPACKET); exit(1); } - outpacket = (struct opacket *)malloc((unsigned)datalen); + outpacket = malloc(datalen); if (!outpacket) { perror("malloc"); exit(1); @@ -913,7 +913,7 @@ main(argc, argv) for (hops = first_hop; hops <= max_hops; ++hops) { struct in6_addr lastaddr; int got_there = 0; - int unreachable = 0; + unsigned unreachable = 0; printf("%2lu ", hops); bzero(&lastaddr, sizeof(lastaddr)); @@ -1089,7 +1089,7 @@ send_probe(seq, hops) i = sendto(sndsock, (char *)outpacket, datalen, 0, (struct sockaddr *)&Dst, Dst.sin6_len); - if (i < 0 || i != datalen) { + if (i < 0 || (u_long)i != datalen) { if (i < 0) perror("sendto"); printf("traceroute6: wrote %s %lu chars, ret=%d\n", @@ -1129,12 +1129,11 @@ deltaT(t1p, t2p) /* * Convert an ICMP "type" field to a printable string. */ -char * -pr_type(t0) - int t0; +const char * +pr_type(int t0) { u_char t = t0 & 0xff; - char *cp; + const char *cp; switch (t) { case ICMP6_DST_UNREACH: @@ -1221,7 +1220,7 @@ packet_ok(mhdr, cc, seq) cc -= hlen; icp = (struct icmp6_hdr *)(buf + hlen); #else - if (cc < sizeof(struct icmp6_hdr)) { + if (cc < (int)sizeof(struct icmp6_hdr)) { if (verbose) { if (getnameinfo((struct sockaddr *)from, from->sin6_len, hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) != 0) -- cgit v1.1 From b2b2bfee2e21d61fa8262a3b75ad50a59f356f05 Mon Sep 17 00:00:00 2001 From: trasz Date: Sat, 4 Dec 2010 17:41:58 +0000 Subject: Fix comment intentation. --- sys/vm/vm_mmap.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index f2dba2c..a73e03a 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -276,14 +276,14 @@ mmap(td, uap) if (addr + size < addr) return (EINVAL); } else { - /* - * XXX for non-fixed mappings where no hint is provided or - * the hint would fall in the potential heap space, - * place it after the end of the largest possible heap. - * - * There should really be a pmap call to determine a reasonable - * location. - */ + /* + * XXX for non-fixed mappings where no hint is provided or + * the hint would fall in the potential heap space, + * place it after the end of the largest possible heap. + * + * There should really be a pmap call to determine a reasonable + * location. + */ PROC_LOCK(td->td_proc); if (addr == 0 || (addr >= round_page((vm_offset_t)vms->vm_taddr) && -- cgit v1.1 From 6be4268752ec68e69d971e179dbcddaea6447efe Mon Sep 17 00:00:00 2001 From: dougb Date: Sat, 4 Dec 2010 18:52:05 +0000 Subject: Add MAKEDEV.8 Submitted by: Alex Kozlov --- ObsoleteFiles.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index e406532..5828a52 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,8 @@ # xargs -n1 | sort | uniq -d; # done +# 20101114: Remove long-obsolete MAKEDEV.8 +OLD_FILES+=usr/share/man/man8/MAKEDEV.8.gz # 20101112: vgonel(9) has gone to private API a while ago OLD_FILES+=usr/share/man/man9/vgonel.9.gz # 20101112: removed gasp.info -- cgit v1.1 From bd095c3b8e295574bc54157b0e4b32347301701e Mon Sep 17 00:00:00 2001 From: tuexen Date: Sat, 4 Dec 2010 19:29:49 +0000 Subject: Fix a bug where also the number of non-renegable gap reports was considered to be potentially renegable. MFC after: 1 day. --- sys/netinet/sctp_indata.c | 69 +++++++++++++++------------------------------- sys/netinet/sctp_input.c | 2 ++ sys/netinet/sctp_structs.h | 1 + 3 files changed, 25 insertions(+), 47 deletions(-) diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c index 05b40f7..bd484a7 100644 --- a/sys/netinet/sctp_indata.c +++ b/sys/netinet/sctp_indata.c @@ -3081,14 +3081,17 @@ sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct int num_frs = 0; int chunk_freed; int non_revocable; - uint16_t frag_strt, frag_end; - uint32_t last_frag_high; + uint16_t frag_strt, frag_end, prev_frag_end; - tp1 = NULL; - last_frag_high = 0; + tp1 = TAILQ_FIRST(&asoc->sent_queue); + prev_frag_end = 0; chunk_freed = 0; for (i = 0; i < (num_seg + num_nr_seg); i++) { + if (i == num_seg) { + prev_frag_end = 0; + tp1 = TAILQ_FIRST(&asoc->sent_queue); + } frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset, sizeof(struct sctp_gap_ack_block), (uint8_t *) & block); *offset += sizeof(block); @@ -3097,58 +3100,29 @@ sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct } frag_strt = ntohs(frag->start); frag_end = ntohs(frag->end); - /* some sanity checks on the fragment offsets */ + if (frag_strt > frag_end) { - /* this one is malformed, skip */ + /* This gap report is malformed, skip it. */ continue; } - if (compare_with_wrap((frag_end + last_tsn), *biggest_tsn_acked, - MAX_TSN)) - *biggest_tsn_acked = frag_end + last_tsn; - - /* mark acked dgs and find out the highestTSN being acked */ - if (tp1 == NULL) { + if (frag_strt <= prev_frag_end) { + /* This gap report is not in order, so restart. */ tp1 = TAILQ_FIRST(&asoc->sent_queue); - /* save the locations of the last frags */ - last_frag_high = frag_end + last_tsn; - } else { - /* - * now lets see if we need to reset the queue due to - * a out-of-order SACK fragment - */ - if (compare_with_wrap(frag_strt + last_tsn, - last_frag_high, MAX_TSN)) { - /* - * if the new frag starts after the last TSN - * frag covered, we are ok and this one is - * beyond the last one - */ - ; - } else { - /* - * ok, they have reset us, so we need to - * reset the queue this will cause extra - * hunting but hey, they chose the - * performance hit when they failed to order - * their gaps - */ - tp1 = TAILQ_FIRST(&asoc->sent_queue); - } - last_frag_high = frag_end + last_tsn; + } + if (compare_with_wrap((last_tsn + frag_end), *biggest_tsn_acked, MAX_TSN)) { + *biggest_tsn_acked = last_tsn + frag_end; } if (i < num_seg) { non_revocable = 0; } else { non_revocable = 1; } - if (i == num_seg) { - tp1 = NULL; - } if (sctp_process_segment_range(stcb, &tp1, last_tsn, frag_strt, frag_end, non_revocable, &num_frs, biggest_newly_acked_tsn, this_sack_lowest_newack, ecn_seg_sums)) { chunk_freed = 1; } + prev_frag_end = frag_end; } if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { if (num_frs) @@ -4817,7 +4791,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, } } /********************************************/ - /* drop the acked chunks from the sendqueue */ + /* drop the acked chunks from the sentqueue */ /********************************************/ asoc->last_acked_seq = cum_ack; @@ -4925,9 +4899,10 @@ done_with_it: * we had some before and now we have NONE. */ - if (num_seg) + if (num_seg) { sctp_check_for_revoked(stcb, asoc, cum_ack, biggest_tsn_acked); - else if (asoc->saw_sack_with_frags) { + asoc->saw_sack_with_frags = 1; + } else if (asoc->saw_sack_with_frags) { int cnt_revoked = 0; tp1 = TAILQ_FIRST(&asoc->sent_queue); @@ -4963,10 +4938,10 @@ done_with_it: } asoc->saw_sack_with_frags = 0; } - if (num_seg || num_nr_seg) - asoc->saw_sack_with_frags = 1; + if (num_nr_seg > 0) + asoc->saw_sack_with_nr_frags = 1; else - asoc->saw_sack_with_frags = 0; + asoc->saw_sack_with_nr_frags = 0; /* JRS - Use the congestion control given in the CC module */ asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, accum_moved, reneged_all, will_exit_fast_recovery); diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index ad4209f..88d67a3 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -4644,6 +4644,7 @@ process_control_chunks: ((compare_with_wrap(cum_ack, stcb->asoc.last_acked_seq, MAX_TSN)) || (cum_ack == stcb->asoc.last_acked_seq)) && (stcb->asoc.saw_sack_with_frags == 0) && + (stcb->asoc.saw_sack_with_nr_frags == 0) && (!TAILQ_EMPTY(&stcb->asoc.sent_queue)) ) { /* @@ -4737,6 +4738,7 @@ process_control_chunks: ((compare_with_wrap(cum_ack, stcb->asoc.last_acked_seq, MAX_TSN)) || (cum_ack == stcb->asoc.last_acked_seq)) && (stcb->asoc.saw_sack_with_frags == 0) && + (stcb->asoc.saw_sack_with_nr_frags == 0) && (!TAILQ_EMPTY(&stcb->asoc.sent_queue))) { /* * We have a SIMPLE sack having no diff --git a/sys/netinet/sctp_structs.h b/sys/netinet/sctp_structs.h index 56f4946..94d0395 100644 --- a/sys/netinet/sctp_structs.h +++ b/sys/netinet/sctp_structs.h @@ -1058,6 +1058,7 @@ struct sctp_association { uint8_t delayed_connection; uint8_t ifp_had_enobuf; uint8_t saw_sack_with_frags; + uint8_t saw_sack_with_nr_frags; uint8_t in_asocid_hash; uint8_t assoc_up_sent; uint8_t adaptation_needed; -- cgit v1.1 From 60171665b4d6f56b9f73c8c97d7707553cf4b31a Mon Sep 17 00:00:00 2001 From: uqs Date: Sat, 4 Dec 2010 21:54:23 +0000 Subject: De-orbit usbdevs(8) which hasn't worked with the new USB stack for a long time now. usbconfig(8) should be an adequate replacement. --- usr.sbin/usbdevs/Makefile | 7 -- usr.sbin/usbdevs/usbdevs.8 | 70 -------------- usr.sbin/usbdevs/usbdevs.c | 233 --------------------------------------------- 3 files changed, 310 deletions(-) delete mode 100644 usr.sbin/usbdevs/Makefile delete mode 100644 usr.sbin/usbdevs/usbdevs.8 delete mode 100644 usr.sbin/usbdevs/usbdevs.c diff --git a/usr.sbin/usbdevs/Makefile b/usr.sbin/usbdevs/Makefile deleted file mode 100644 index 3cfc8ef..0000000 --- a/usr.sbin/usbdevs/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# $NetBSD: Makefile,v 1.2 1998/07/12 20:40:45 augustss Exp $ -# FreeBSD $FreeBSD$ - -PROG= usbdevs -MAN= usbdevs.8 - -.include diff --git a/usr.sbin/usbdevs/usbdevs.8 b/usr.sbin/usbdevs/usbdevs.8 deleted file mode 100644 index dd56fc8..0000000 --- a/usr.sbin/usbdevs/usbdevs.8 +++ /dev/null @@ -1,70 +0,0 @@ -.\" $NetBSD: usbdevs.8,v 1.5 2000/10/15 12:44:11 bjh21 Exp $ -.\" Copyright (c) 1999 The NetBSD Foundation, Inc. -.\" All rights reserved. -.\" -.\" Author: Lennart Augustsson -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS -.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS -.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -.\" POSSIBILITY OF SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd May 24, 2004 -.Dt USBDEVS 8 -.Os -.Sh NAME -.Nm usbdevs -.Nd show USB devices connected to the system -.Sh SYNOPSIS -.Nm -.Op Fl a Ar addr -.Op Fl d -.Op Fl f Ar dev -.Op Fl o -.Op Fl v -.Sh DESCRIPTION -The -.Nm -utility prints a listing of all USB devices connected to the system -with some information about each device. -The indentation of each line indicates its distance from the root. -.Pp -The options are as follows: -.Bl -tag -width ".Fl a Ar addr" -.It Fl a Ar addr -only print information about the device at the given address. -.It Fl d -Show the device drivers associated with each device. -.It Fl f Ar dev -only print information for the given USB controller. -.It Fl o -One-line output (only useful in combination with -.Fl d ) . -.It Fl v -Be verbose. -.El -.Sh SEE ALSO -.Xr usb 4 -.Sh HISTORY -The -.Nm -utility appeared in -.Nx 1.4 . diff --git a/usr.sbin/usbdevs/usbdevs.c b/usr.sbin/usbdevs/usbdevs.c deleted file mode 100644 index b51e3c5..0000000 --- a/usr.sbin/usbdevs/usbdevs.c +++ /dev/null @@ -1,233 +0,0 @@ -/* $NetBSD: usbdevs.c,v 1.22 2003/11/12 13:31:08 grant Exp $ */ -/* $FreeBSD$ */ - -/* - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Lennart Augustsson (augustss@NetBSD.org). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(__FreeBSD__) -#include -#endif - -#define USBDEV "/dev/usb" - -int verbose = 0; -int showdevs = 0; -int oneline = 0; - -void usage(void); -void usbdev(int f, int a, int rec); -void usbdump(int f); -void dumpone(char *name, int f, int addr); -int main(int, char **); - -void -usage() -{ - fprintf(stderr, "usage: %s [-a addr] [-d] [-f dev] [-o] [-v]\n", - getprogname()); - exit(1); -} - -char done[USB_MAX_DEVICES]; -int indent; - -void -usbdev(int f, int a, int rec) -{ - struct usb_device_info di; - int e, p, i; - - di.udi_addr = a; - e = ioctl(f, USB_DEVICEINFO, &di); - if (e) { - if (errno != ENXIO) - printf("addr %d: I/O error\n", a); - return; - } - printf("addr %d: ", a); - done[a] = 1; - if (verbose) { - switch (di.udi_speed) { - case USB_SPEED_LOW: printf("low speed, "); break; - case USB_SPEED_FULL: printf("full speed, "); break; - case USB_SPEED_HIGH: printf("high speed, "); break; - default: break; - } - if (di.udi_power) - printf("power %d mA, ", di.udi_power); - else - printf("self powered, "); - if (di.udi_config) - printf("config %d, ", di.udi_config); - else - printf("unconfigured, "); - } - if (verbose) { - printf("%s(0x%04x), %s(0x%04x), rev %s", - di.udi_product, di.udi_productNo, - di.udi_vendor, di.udi_vendorNo, di.udi_release); - } else - printf("%s, %s", di.udi_product, di.udi_vendor); - if (!oneline) - printf("\n"); - if (showdevs) { - for (i = 0; i < USB_MAX_DEVNAMES; i++) { - if (di.udi_devnames[i][0]) { - if (oneline) - printf(", device %s", - di.udi_devnames[i]); - else - printf("%*s %s\n", indent, "", - di.udi_devnames[i]); - } - } - } - if (oneline) - printf("\n"); - if (!rec) - return; - for (p = 0; p < di.udi_nports; p++) { - int s = di.udi_ports[p]; - if (s >= USB_MAX_DEVICES) { - if (verbose) { - printf("%*sport %d %s\n", indent+1, "", p+1, - s == USB_PORT_ENABLED ? "enabled" : - s == USB_PORT_SUSPENDED ? "suspended" : - s == USB_PORT_POWERED ? "powered" : - s == USB_PORT_DISABLED ? "disabled" : - "???"); - - } - continue; - } - indent++; - printf("%*s", indent, ""); - if (verbose) - printf("port %d ", p+1); - if (s == 0) - printf("addr 0 should never happen!\n"); - else - usbdev(f, s, 1); - indent--; - } -} - -void -usbdump(int f) -{ - int a; - - for (a = 1; a < USB_MAX_DEVICES; a++) { - if (!done[a]) - usbdev(f, a, 1); - } -} - -void -dumpone(char *name, int f, int addr) -{ - if (verbose) - printf("Controller %s:\n", name); - indent = 0; - memset(done, 0, sizeof done); - if (addr) - usbdev(f, addr, 0); - else - usbdump(f); -} - -int -main(int argc, char **argv) -{ - int ch, i, f; - char buf[50]; - char *dev = 0; - int addr = 0; - int ncont; - - while ((ch = getopt(argc, argv, "a:df:ov?")) != -1) { - switch(ch) { - case 'a': - addr = atoi(optarg); - break; - case 'd': - showdevs++; - break; - case 'f': - dev = optarg; - break; - case 'o': - oneline++; - break; - case 'v': - verbose = 1; - break; - case '?': - default: - usage(); - } - } - argc -= optind; - argv += optind; - - if (dev == 0) { - for (ncont = 0, i = 0; i < 10; i++) { - snprintf(buf, sizeof(buf), "%s%d", USBDEV, i); - f = open(buf, O_RDONLY); - if (f >= 0) { - dumpone(buf, f, addr); - close(f); - } else { - if (errno == ENOENT || errno == ENXIO) - continue; - warn("%s", buf); - } - ncont++; - } - if (verbose && ncont == 0) - printf("%s: no USB controllers found\n", - getprogname()); - } else { - f = open(dev, O_RDONLY); - if (f >= 0) - dumpone(dev, f, addr); - else - err(1, "%s", dev); - } - exit(0); -} -- cgit v1.1 From 0d724a429b3a29a9a88e672ea298d8a48083b5bf Mon Sep 17 00:00:00 2001 From: cperciva Date: Sat, 4 Dec 2010 23:24:35 +0000 Subject: Remove unnecessary #includes which seem to have been accidentally added as part of CVS r1.76 (in January 2006). --- sys/i386/i386/busdma_machdep.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index 45ab8b3..6656a5b 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -28,9 +28,6 @@ __FBSDID("$FreeBSD$"); #include -#include -#include -#include #include #include #include -- cgit v1.1 From 6499e1e754af70ad3a4a9519bc372ce4ef0c4984 Mon Sep 17 00:00:00 2001 From: cperciva Date: Sat, 4 Dec 2010 23:36:40 +0000 Subject: Remove gratuitous i386/amd64 inconsistency in favour of the less verbose version of declaring a variable initialized to zero. --- sys/i386/i386/busdma_machdep.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index 6656a5b..93e93c5 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -858,7 +858,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { - bus_addr_t lastaddr; + bus_addr_t lastaddr = 0; int nsegs, error, first, i; bus_size_t resid; struct iovec *iov; @@ -878,7 +878,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, nsegs = 0; error = 0; first = 1; - lastaddr = (bus_addr_t) 0; for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { /* * Now at the first iovec to load. Load each iovec -- cgit v1.1 From 62b524634f7ab5c60a750d132e194101f89b8d31 Mon Sep 17 00:00:00 2001 From: bz Date: Sun, 5 Dec 2010 01:09:48 +0000 Subject: Use correct field to track statistics counting error as bad header length. This assimilates the code to what ip_input has been doing since r1.1 in this case. Submitted by: Rozhuk Ivan (rozhuk.im gmail.com) MFC after: 4 days --- sys/netinet/ip_fastfwd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/netinet/ip_fastfwd.c b/sys/netinet/ip_fastfwd.c index 0399393..a1adb85 100644 --- a/sys/netinet/ip_fastfwd.c +++ b/sys/netinet/ip_fastfwd.c @@ -218,7 +218,7 @@ ip_fastforward(struct mbuf *m) */ hlen = ip->ip_hl << 2; if (hlen < sizeof(struct ip)) { /* minimum header length */ - IPSTAT_INC(ips_badlen); + IPSTAT_INC(ips_badhlen); goto drop; } if (hlen > m->m_len) { -- cgit v1.1 From 40fdbfec5396f42691ddbded360cb9e7051859ab Mon Sep 17 00:00:00 2001 From: nwhitehorn Date: Sun, 5 Dec 2010 01:17:53 +0000 Subject: Switch which software-reserved bit is used to designate a locked PTE to correspond to the definition used by the PAPR spec so that its PTE insertion algorithm will properly respect it. --- sys/powerpc/include/pte.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/powerpc/include/pte.h b/sys/powerpc/include/pte.h index 6c4eb93..8b9dd4e 100644 --- a/sys/powerpc/include/pte.h +++ b/sys/powerpc/include/pte.h @@ -95,8 +95,8 @@ struct lpteg { /* High quadword: */ #define LPTE_VSID_SHIFT 12 #define LPTE_API 0x0000000000000F80ULL -#define LPTE_WIRED 0x0000000000000010ULL -#define LPTE_LOCKED 0x0000000000000008ULL +#define LPTE_LOCKED 0x0000000000000040ULL +#define LPTE_WIRED 0x0000000000000008ULL #define LPTE_BIG 0x0000000000000004ULL /* 4kb/16Mb page */ #define LPTE_HID 0x0000000000000002ULL #define LPTE_VALID 0x0000000000000001ULL -- cgit v1.1 From 0476c48e6fa398d544c1426156d9eb0def70aeb2 Mon Sep 17 00:00:00 2001 From: cperciva Date: Sun, 5 Dec 2010 03:20:55 +0000 Subject: MFamd64 r204214: Enforce stronger alignment semantics (require that the end of segments be aligned, not just the start of segments) in order to allow Xen's blkfront driver to operate correctly. PR: kern/152818 MFC after: 3 days --- sys/i386/i386/busdma_machdep.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index 93e93c5..5c1ec92 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -246,8 +246,7 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, newtag->alignment = alignment; newtag->boundary = boundary; newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); - newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + - (PAGE_SIZE - 1); + newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + (PAGE_SIZE - 1); newtag->filter = filter; newtag->filterarg = filterarg; newtag->maxsize = maxsize; @@ -594,15 +593,19 @@ _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, vendaddr = (vm_offset_t)buf + buflen; while (vaddr < vendaddr) { + bus_size_t sg_len; + + sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); if (pmap) paddr = pmap_extract(pmap, vaddr); else paddr = pmap_kextract(vaddr); if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && run_filter(dmat, paddr) != 0) { + sg_len = roundup2(sg_len, dmat->alignment); map->pagesneeded++; } - vaddr += (PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK)); + vaddr += sg_len; } CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded); } @@ -669,6 +672,8 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bmask = ~(dmat->boundary - 1); for (seg = *segp; buflen > 0 ; ) { + bus_size_t max_sgsize; + /* * Get the physical address for this segment. */ @@ -680,11 +685,16 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, /* * Compute the segment size, and adjust counts. */ - sgsize = PAGE_SIZE - ((u_long)curaddr & PAGE_MASK); - if (sgsize > dmat->maxsegsz) - sgsize = dmat->maxsegsz; - if (buflen < sgsize) - sgsize = buflen; + max_sgsize = MIN(buflen, dmat->maxsegsz); + sgsize = PAGE_SIZE - ((vm_offset_t)curaddr & PAGE_MASK); + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + map->pagesneeded != 0 && run_filter(dmat, curaddr)) { + sgsize = roundup2(sgsize, dmat->alignment); + sgsize = MIN(sgsize, max_sgsize); + curaddr = add_bounce_page(dmat, map, vaddr, sgsize); + } else { + sgsize = MIN(sgsize, max_sgsize); + } /* * Make sure we don't cross any boundaries. @@ -695,10 +705,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, sgsize = (baddr - curaddr); } - if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && - map->pagesneeded != 0 && run_filter(dmat, curaddr)) - curaddr = add_bounce_page(dmat, map, vaddr, sgsize); - /* * Insert chunk into a segment, coalescing with * previous segment if possible. -- cgit v1.1 From f8b10ad3cb44297f92afff49601c5f48044d5e91 Mon Sep 17 00:00:00 2001 From: bschmidt Date: Sun, 5 Dec 2010 09:00:32 +0000 Subject: For 6000 series and newer devices the DC calibration results are no longer requested of the boot firmware. Instead of sending those results to the runtime firmware the firmware is told to do the DC calibration itself. MFC after: 1 week --- sys/dev/iwn/if_iwn.c | 37 ++++++++++++++++++++++++++++--------- sys/dev/iwn/if_iwnvar.h | 1 + 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index 1d58ef8..6dff9da 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -223,7 +223,7 @@ static int iwn5000_save_calib_result(struct iwn_softc *, struct iwn_phy_calib *, int, int); static void iwn5000_free_calib_results(struct iwn_softc *); static int iwn5000_chrystal_calib(struct iwn_softc *); -static int iwn5000_send_calib_query(struct iwn_softc *); +static int iwn5000_send_calib_query(struct iwn_softc *, uint32_t); static int iwn5000_rx_calib_result(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static int iwn5000_send_wimax_coex(struct iwn_softc *); @@ -756,6 +756,7 @@ iwn_hal_attach(struct iwn_softc *sc) default: sc->txchainmask = IWN_ANT_ABC; sc->rxchainmask = IWN_ANT_ABC; + sc->calib_runtime = IWN_CALIB_DC; break; } sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | @@ -767,8 +768,9 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn6050fw"; sc->txchainmask = IWN_ANT_AB; sc->rxchainmask = IWN_ANT_AB; - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_DC | IWN_CALIB_LO | + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; + sc->calib_runtime = IWN_CALIB_DC; break; case IWN_HW_REV_TYPE_6005: sc->sc_hal = &iwn5000_hal; @@ -778,6 +780,7 @@ iwn_hal_attach(struct iwn_softc *sc) sc->rxchainmask = IWN_ANT_AB; sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; + sc->calib_runtime = IWN_CALIB_DC; break; default: device_printf(sc->sc_dev, "adapter type %d not supported\n", @@ -5316,7 +5319,7 @@ iwn5000_chrystal_calib(struct iwn_softc *sc) * only once at first boot. */ static int -iwn5000_send_calib_query(struct iwn_softc *sc) +iwn5000_send_calib_query(struct iwn_softc *sc, uint32_t cfg) { #define CALIB_INIT_CFG 0xffffffff; struct iwn5000_calib_config cmd; @@ -5324,12 +5327,15 @@ iwn5000_send_calib_query(struct iwn_softc *sc) memset(&cmd, 0, sizeof cmd); cmd.ucode.once.enable = CALIB_INIT_CFG; - cmd.ucode.once.start = CALIB_INIT_CFG; - cmd.ucode.once.send = CALIB_INIT_CFG; - cmd.ucode.flags = CALIB_INIT_CFG; + if (cfg == 0) { + cmd.ucode.once.start = CALIB_INIT_CFG; + cmd.ucode.once.send = CALIB_INIT_CFG; + cmd.ucode.flags = CALIB_INIT_CFG; + } else + cmd.ucode.once.start = cfg; - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: query calibration results\n", - __func__); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "%s: query calibration results, cfg %x\n", __func__, cfg); error = iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof cmd, 0); if (error != 0) @@ -5559,7 +5565,7 @@ iwn5000_post_alive(struct iwn_softc *sc) * Query other calibration results from the initialization * firmware. */ - error = iwn5000_send_calib_query(sc); + error = iwn5000_send_calib_query(sc, 0); if (error != 0) { device_printf(sc->sc_dev, "%s: could not query calibration, error=%d\n", @@ -5579,6 +5585,19 @@ iwn5000_post_alive(struct iwn_softc *sc) * firmware to the runtime firmware. */ error = iwn5000_send_calib_results(sc); + + /* + * Tell the runtime firmware to do certain calibration types. + */ + if (sc->calib_runtime != 0) { + error = iwn5000_send_calib_query(sc, sc->calib_runtime); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not send query calibration, " + "error=%d, cfg=%x\n", __func__, error, + sc->calib_runtime); + } + } } return error; } diff --git a/sys/dev/iwn/if_iwnvar.h b/sys/dev/iwn/if_iwnvar.h index f8b45b6..deb0be7 100644 --- a/sys/dev/iwn/if_iwnvar.h +++ b/sys/dev/iwn/if_iwnvar.h @@ -264,6 +264,7 @@ struct iwn_softc { int calib_cnt; struct iwn_calib_state calib; u_int calib_init; + u_int calib_runtime; #define IWN_CALIB_XTAL (1 << IWN_CALIB_IDX_XTAL) #define IWN_CALIB_DC (1 << IWN_CALIB_IDX_DC) #define IWN_CALIB_LO (1 << IWN_CALIB_IDX_LO) -- cgit v1.1 From 4bc6f6479f031b4131c03bf9ed4c18837fda8307 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 09:33:04 +0000 Subject: Bring in the change from NetBSD 1.18: "If using stat (the -L flag) and it fails, fall back to lstat(). It may be the case that we're examining a broken symlink, and anything is better than nothing." The changes in 1.14 through 1.17 were not relevant to us. Obtained from: atatat@NetBSD.org --- usr.bin/stat/stat.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index 1ab10ea..63c242b 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -30,7 +30,7 @@ #include #if 0 #ifndef lint -__RCSID("$NetBSD: stat.c,v 1.13 2003/07/25 03:21:17 atatat Exp $"); +__RCSID("$NetBSD: stat.c,v 1.18 2004/05/28 04:48:31 atatat Exp $"); #endif #endif @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -313,8 +314,17 @@ main(int argc, char *argv[]) rc = fstat(STDIN_FILENO, &st); } else { file = argv[0]; - if (usestat) - rc = stat(file, &st); + if (usestat) { + /* + * Try stat() and if it fails, fall back to + * lstat() just in case we're examining a + * broken symlink. + */ + if ((rc = stat(file, &st)) == -1 && + errno == ENOENT && + (rc = lstat(file, &st)) == -1) + errno = ENOENT; + } else rc = lstat(file, &st); } -- cgit v1.1 From 1fc00c1bd7e0da3183e7e3bbede72568201b7cbe Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 09:35:07 +0000 Subject: Add my own documentation for the change in our r216196, aka NetBSD's 1.18 For -L if stat(2) fails, fall back to lstat(2). .Dd purposely not bumped because more changes are coming. --- usr.bin/stat/stat.1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index 8bbdda4..0ae0b7c 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -107,6 +107,10 @@ will refer to the target of if file is a symbolic link, and not to .Ar file itself. +If the link is broken or the target does not exist, +fall back on +.Xr lstat 2 +and report information about the link. .It Fl n Do not force a newline to appear at the end of each piece of output. .It Fl q -- cgit v1.1 From fb1c48789ea475d4f325412db997363968b23e92 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 5 Dec 2010 10:15:23 +0000 Subject: Use proper bounds checking on VPA. We must check against tp->t_cursor.tp_row, not row, to figure out whether we must clamp the cursor position. Submitted by: luigi MFC after: 3 weeks --- sys/teken/teken_subr.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sys/teken/teken_subr.h b/sys/teken/teken_subr.h index c84679a..2934bcc 100644 --- a/sys/teken/teken_subr.h +++ b/sys/teken/teken_subr.h @@ -1299,10 +1299,9 @@ teken_subr_vertical_position_absolute(teken_t *t, unsigned int row) { t->t_cursor.tp_row = t->t_originreg.ts_begin + row - 1; - if (row >= t->t_originreg.ts_end) + if (t->t_cursor.tp_row >= t->t_originreg.ts_end) t->t_cursor.tp_row = t->t_originreg.ts_end - 1; - t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } -- cgit v1.1 From 81a44f4bf1c74bad4c91a4770d559ca650697a01 Mon Sep 17 00:00:00 2001 From: jilles Date: Sun, 5 Dec 2010 16:09:03 +0000 Subject: sh: jobs -p: Do not ask the kernel for the pgid. The getpgid() call will fail if the first process in the job has already terminated, resulting in output of "-1". The pgid of a job is always the pid of the first process in the job and other code already relies on this. --- bin/sh/jobs.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 8722f67..1b7a6d4 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -308,7 +308,6 @@ showjob(struct job *jp, pid_t pid, int mode) struct procstat *ps; struct job *j; int col, curr, i, jobno, prev, procno; - pid_t ppid; char c; procno = (mode == SHOWJOBS_PGIDS) ? 1 : jp->nprocs; @@ -323,9 +322,7 @@ showjob(struct job *jp, pid_t pid, int mode) #endif for (ps = jp->ps ; ; ps++) { /* for each process */ if (mode == SHOWJOBS_PIDS || mode == SHOWJOBS_PGIDS) { - ppid = (mode == SHOWJOBS_PIDS) ? ps->pid : - getpgid(ps->pid); - out1fmt("%d\n", (int)ppid); + out1fmt("%d\n", (int)ps->pid); goto skip; } if (mode != SHOWJOBS_VERBOSE && ps != jp->ps && pid == 0) -- cgit v1.1 From b8335044695f5ce150a5f1cbf223f4e75e51b296 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 20:47:53 +0000 Subject: Bring in the change from NetBSD 1.22: "Fix a trivial truncation case, and eliminate a corner case that might print a nul character." I am purposely bypassing the following versions: 1.19 A build infrastructure change that does not apply to us 1.20 A feature I am not interested in, but don't object if someone else wants to pick it up 1.21 A build infrastructure change that does not apply to us Obtained from: atatat@NetBSD.org --- usr.bin/stat/stat.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index 63c242b..a56927e 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -30,7 +30,7 @@ #include #if 0 #ifndef lint -__RCSID("$NetBSD: stat.c,v 1.18 2004/05/28 04:48:31 atatat Exp $"); +__RCSID("$NetBSD: stat.c,v 1.22 2005/04/22 03:36:48 atatat Exp $"); #endif #endif @@ -381,7 +381,7 @@ output(const struct stat *st, const char *file, const char *statfmt, int fn, int nonl, int quiet) { int flags, size, prec, ofmt, hilo, what; - char buf[PATH_MAX]; + char buf[PATH_MAX + 4 + 1]; const char *subfmt; int nl, t, i; @@ -550,7 +550,7 @@ output(const struct stat *st, const char *file, buf, sizeof(buf), flags, size, prec, ofmt, hilo, what); - for (i = 0; i < t && i < sizeof(buf); i++) + for (i = 0; i < t && i < sizeof(buf) - 1; i++) addchar(stdout, buf[i], &nl); continue; -- cgit v1.1 From 392be70ea51a44fe9de58fd2c1fb80b8e62d1919 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 21:11:45 +0000 Subject: Bring in a new feature, adding a -f option to readlink to print the path of the target, similar to realpath(1). See the discussion at: http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=34662 This brings in the following changes: 1.24 "PR/34662: martijnb at atlas dot ipv6 dot stack dot nl: readlink doesn't grok -f, and there's no alternative (+fix) Patch applied with minor tweak (%y -> %R, as it was already taken) plus some nits from myself. Thanks!" Obtained from: elad@NetBSD.org 1.25 "Fix a segfault when doing 'stat -f %R' on the stdin file handle, instead fake the filename '(stdin)' like the %N format." Obtained from: mlelstv@NetBSD.org 1.27 "The ofmt variable is actually a bit mask (not the character that was in the format string) so that we can "or" it with the bits in the formats variable. This fixes the missing " -> " in front of the real path (when you use %SR). Also, the ?: needs another space." Obtained from: atatat@NetBSD.org I am purposely omitting the following changes: 1.23 A humanize_number(3) clone that should better be implemented by actually using humanize_number(3) 1.26 This is the removal of license clause 3 and 4, already handled by imp in r203971 --- usr.bin/stat/stat.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index a56927e..2b1eebc 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -30,7 +30,7 @@ #include #if 0 #ifndef lint -__RCSID("$NetBSD: stat.c,v 1.22 2005/04/22 03:36:48 atatat Exp $"); +__RCSID("$NetBSD: stat.c,v 1.27 2008/05/16 17:58:33 atatat Exp $"); #endif #endif @@ -153,6 +153,7 @@ __FBSDID("$FreeBSD$"); #define MIDDLE_PIECE 'M' #define LOW_PIECE 'L' +#define SHOW_realpath 'R' #define SHOW_st_dev 'd' #define SHOW_st_ino 'i' #define SHOW_st_mode 'p' @@ -218,8 +219,8 @@ main(int argc, char *argv[]) if (strcmp(getprogname(), "readlink") == 0) { am_readlink = 1; - options = "n"; - synopsis = "[-n] [file ...]"; + options = "fn"; + synopsis = "[-fn] [file ...]"; statfmt = "%Y"; fmtchar = 'f'; quiet = 1; @@ -243,6 +244,10 @@ main(int argc, char *argv[]) quiet = 1; break; case 'f': + if (am_readlink) { + statfmt = "%R"; + break; + } statfmt = optarg; /* FALLTHROUGH */ case 'l': @@ -518,6 +523,7 @@ output(const struct stat *st, const char *file, } switch (*statfmt) { + fmtcase(what, SHOW_realpath); fmtcase(what, SHOW_st_dev); fmtcase(what, SHOW_st_ino); fmtcase(what, SHOW_st_mode); @@ -776,6 +782,26 @@ format1(const struct stat *st, ofmt = FMTF_UNSIGNED; break; #endif /* HAVE_STRUCT_STAT_ST_GEN */ + case SHOW_realpath: + small = 0; + data = 0; + if (file == NULL) { + (void)strncpy(path, "(stdin)", sizeof(path)); + sdata = path; + } else { + snprintf(path, sizeof(path), " -> "); + if (realpath(file, path + 4) == NULL) { + linkfail = 1; + l = 0; + path[0] = '\0'; + } + sdata = path + (ofmt == FMTF_STRING ? 0 : 4); + } + + formats = FMTF_STRING; + if (ofmt == 0) + ofmt = FMTF_STRING; + break; case SHOW_symlink: small = 0; data = 0; -- cgit v1.1 From 6d976ebbc4460b57f3c57ac699488addc0550bc1 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 21:17:02 +0000 Subject: Bring in the update from NetBSD 1.19, the documentation of readlink -f "PR/34662: martijnb at atlas dot ipv6 dot stack dot nl: readlink doesn't grok -f, and there's no alternative (+fix) Patch applied with minor tweak (%y -> %R, as it was already taken) plus some nits from myself. Thanks!" Obtained from: elad@NetBSD.org --- usr.bin/stat/stat.1 | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index 0ae0b7c..aeff9ba 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: stat.1,v 1.11 2003/05/08 13:07:10 wiz Exp $ +.\" $NetBSD: stat.1,v 1.19 2006/10/07 10:41:50 elad Exp $ .\" .\" Copyright (c) 2002 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -43,7 +43,7 @@ .Op Fl t Ar timefmt .Op Ar .Nm readlink -.Op Fl n +.Op Fl fn .Op Ar .Sh DESCRIPTION The @@ -60,9 +60,20 @@ displays information about the file descriptor for standard input. When invoked as .Nm readlink , only the target of the symbolic link is printed. -If the given argument is not a symbolic link, +If the given argument is not a symbolic link and the +.Fl f +option is not specified, .Nm readlink will print nothing and exit with an error. +If the +.Fl f +option is specified, the output is canonicalized by following every symlink +in every component of the given path recursively. +.Nm readlink +will resolve both absolute and relative paths, and return the absolute pathname +corresponding to +.Ar file . +In this case, the argument does not need to be a symbolic link. .Pp The information displayed is obtained by calling .Xr lstat 2 @@ -374,13 +385,15 @@ User defined flags for Inode generation number. .El .Pp -The following four field specifiers are not drawn directly from the +The following five field specifiers are not drawn directly from the data in .Vt "struct stat" , but are: .Bl -tag -width indent .It Cm N The name of the file. +.It Cm R +The absolute pathname corresponding to the file. .It Cm T The file type, either as in .Nm ls Fl F -- cgit v1.1 From 788f8e9291c1dda4877320699e4a71c5f5e2553c Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 21:29:20 +0000 Subject: Bring in the update from NetBSD 1.28: "Fix WARNS=4 issues (-Wcast-qual -Wsign-compare)" Because of code differences I had to hand-apply parts of the patch, so responsibility for errors goes to me. Obtained from: lukem@NetBSD.org --- usr.bin/stat/stat.c | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index 2b1eebc..8f7a55e 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -30,7 +30,7 @@ #include #if 0 #ifndef lint -__RCSID("$NetBSD: stat.c,v 1.27 2008/05/16 17:58:33 atatat Exp $"); +__RCSID("$NetBSD: stat.c,v 1.28 2009/04/13 23:02:36 lukem Exp $"); #endif #endif @@ -188,7 +188,7 @@ int format1(const struct stat *, /* stat info */ char *xfflagstostr(unsigned long); #endif -char *timefmt; +const char *timefmt; int linkfail; #define addchar(s, c, nl) \ @@ -203,7 +203,7 @@ main(int argc, char *argv[]) struct stat st; int ch, rc, errs, am_readlink; int lsF, fmtchar, usestat, fn, nonl, quiet; - char *statfmt, *options, *synopsis; + const char *statfmt, *options, *synopsis; char dname[sizeof _PATH_DEV + SPECNAMELEN] = _PATH_DEV; const char *file; @@ -556,7 +556,7 @@ output(const struct stat *st, const char *file, buf, sizeof(buf), flags, size, prec, ofmt, hilo, what); - for (i = 0; i < t && i < sizeof(buf) - 1; i++) + for (i = 0; i < t && i < (int)(sizeof(buf) - 1); i++) addchar(stdout, buf[i], &nl); continue; @@ -583,7 +583,8 @@ format1(const struct stat *st, int hilo, int what) { u_int64_t data; - char *sdata, lfmt[24], tmp[20]; + char *stmp, lfmt[24], tmp[20]; + const char *sdata; char smode[12], sid[12], path[PATH_MAX + 4]; struct passwd *pw; struct group *gr; @@ -644,28 +645,29 @@ format1(const struct stat *st, small = (sizeof(st->st_mode) == 4); data = st->st_mode; strmode(st->st_mode, smode); - sdata = smode; - l = strlen(sdata); - if (sdata[l - 1] == ' ') - sdata[--l] = '\0'; + stmp = smode; + l = strlen(stmp); + if (stmp[l - 1] == ' ') + stmp[--l] = '\0'; if (hilo == HIGH_PIECE) { data >>= 12; - sdata += 1; - sdata[3] = '\0'; + stmp += 1; + stmp[3] = '\0'; hilo = 0; } else if (hilo == MIDDLE_PIECE) { data = (data >> 9) & 07; - sdata += 4; - sdata[3] = '\0'; + stmp += 4; + stmp[3] = '\0'; hilo = 0; } else if (hilo == LOW_PIECE) { data &= 0777; - sdata += 7; - sdata[3] = '\0'; + stmp += 7; + stmp[3] = '\0'; hilo = 0; } + sdata = stmp; formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX | FMTF_STRING; if (ofmt == 0) @@ -827,24 +829,23 @@ format1(const struct stat *st, case SHOW_filetype: small = 0; data = 0; - sdata = smode; - sdata[0] = '\0'; + sdata = ""; if (hilo == 0 || hilo == LOW_PIECE) { switch (st->st_mode & S_IFMT) { - case S_IFIFO: (void)strcat(sdata, "|"); break; - case S_IFDIR: (void)strcat(sdata, "/"); break; + case S_IFIFO: sdata = "|"; break; + case S_IFDIR: sdata = "/"; break; case S_IFREG: if (st->st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) - (void)strcat(sdata, "*"); + sdata = "*"; break; - case S_IFLNK: (void)strcat(sdata, "@"); break; - case S_IFSOCK: (void)strcat(sdata, "="); break; + case S_IFLNK: sdata = "@"; break; + case S_IFSOCK: sdata = "="; break; #ifdef S_IFWHT - case S_IFWHT: (void)strcat(sdata, "%"); break; + case S_IFWHT: sdata = "%"; break; #endif /* S_IFWHT */ #ifdef S_IFDOOR - case S_IFDOOR: (void)strcat(sdata, ">"); break; + case S_IFDOOR: sdata = ">"; break; #endif /* S_IFDOOR */ } hilo = 0; @@ -1001,7 +1002,7 @@ format1(const struct stat *st, * might be required to make up the requested precision. */ l = snprintf(buf, blen, lfmt, ts.tv_sec, ts.tv_nsec); - for (; prec > 9 && l < blen; prec--, l++) + for (; prec > 9 && l < (int)blen; prec--, l++) (void)strcat(buf, "0"); return (l); } -- cgit v1.1 From 63f9f899b55036c51e44150e289a18f454cb65b0 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 21:33:05 +0000 Subject: Fix an "unused variable" error that gets us all the way to WARNS=6 --- usr.bin/stat/Makefile | 1 - usr.bin/stat/stat.c | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/usr.bin/stat/Makefile b/usr.bin/stat/Makefile index 808c41e..1a54979 100644 --- a/usr.bin/stat/Makefile +++ b/usr.bin/stat/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG= stat -WARNS?= 2 LINKS= ${BINDIR}/stat ${BINDIR}/readlink MLINKS= stat.1 readlink.1 diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index 8f7a55e..e3e8c33 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -177,7 +177,7 @@ __FBSDID("$FreeBSD$"); void usage(const char *); void output(const struct stat *, const char *, - const char *, int, int, int); + const char *, int, int); int format1(const struct stat *, /* stat info */ const char *, /* the file name */ const char *, int, /* the format string itself */ @@ -341,7 +341,7 @@ main(int argc, char *argv[]) warn("%s: stat", file); } else - output(&st, file, statfmt, fn, nonl, quiet); + output(&st, file, statfmt, fn, nonl); argv++; argc--; @@ -383,7 +383,7 @@ usage(const char *synopsis) */ void output(const struct stat *st, const char *file, - const char *statfmt, int fn, int nonl, int quiet) + const char *statfmt, int fn, int nonl) { int flags, size, prec, ofmt, hilo, what; char buf[PATH_MAX + 4 + 1]; -- cgit v1.1 From d790f3335ba7fdfe00e3759b7750c1a775de5c47 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 21:53:12 +0000 Subject: Bring in the following changes from NetBSD. See the discussion at: http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=44128 1.29 "Don't printf time_t with %d; fixes PR 44128 from yamt. With this change it successfully prints mtimes after 2038." 1.30 "Improve previous with comments." Obtained from: dholland@NetBSD.org (both) --- usr.bin/stat/stat.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index e3e8c33..950c76a 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -30,7 +30,7 @@ #include #if 0 #ifndef lint -__RCSID("$NetBSD: stat.c,v 1.28 2009/04/13 23:02:36 lukem Exp $"); +__RCSID("$NetBSD: stat.c,v 1.30 2010/11/25 04:33:30 dholland Exp $"); #endif #endif @@ -728,7 +728,6 @@ format1(const struct stat *st, ts = *tsp; /* copy so we can muck with it */ small = (sizeof(ts.tv_sec) == 4); data = ts.tv_sec; - small = 1; tm = localtime(&ts.tv_sec); (void)strftime(path, sizeof(path), timefmt, tm); sdata = path; @@ -951,8 +950,9 @@ format1(const struct stat *st, (void)snprintf(tmp, sizeof(tmp), "%d", size); (void)strcat(lfmt, tmp); } - (void)strcat(lfmt, "d"); - return (snprintf(buf, blen, lfmt, ts.tv_sec)); + (void)strcat(lfmt, "lld"); + return (snprintf(buf, blen, lfmt, + (long long)ts.tv_sec)); } /* @@ -975,7 +975,8 @@ format1(const struct stat *st, (void)snprintf(tmp, sizeof(tmp), "%d", size); (void)strcat(lfmt, tmp); } - (void)strcat(lfmt, "d"); + /* Seconds: time_t cast to long long. */ + (void)strcat(lfmt, "lld"); /* * The stuff after the decimal point always needs zero @@ -986,8 +987,10 @@ format1(const struct stat *st, /* * We can "print" at most nine digits of precision. The * rest we will pad on at the end. + * + * Nanoseconds: long. */ - (void)snprintf(tmp, sizeof(tmp), "%dd", prec > 9 ? 9 : prec); + (void)snprintf(tmp, sizeof(tmp), "%dld", prec > 9 ? 9 : prec); (void)strcat(lfmt, tmp); /* @@ -1001,7 +1004,7 @@ format1(const struct stat *st, * Use the format, and then tack on any zeroes that * might be required to make up the requested precision. */ - l = snprintf(buf, blen, lfmt, ts.tv_sec, ts.tv_nsec); + l = snprintf(buf, blen, lfmt, (long long)ts.tv_sec, ts.tv_nsec); for (; prec > 9 && l < (int)blen; prec--, l++) (void)strcat(buf, "0"); return (l); -- cgit v1.1 From 506e81b852532c0c9a46364645396675b03e2c38 Mon Sep 17 00:00:00 2001 From: jilles Date: Sun, 5 Dec 2010 21:53:29 +0000 Subject: sh: Avoid marking a job as done before it is fully created. In r208489, I added code to reap zombies when forking new processes, to limit the amount of zombies. However, this can lead to marking a job as done or stopped if it consists of multiple processes and the first process ends very quickly. Fix this by only checking for zombies before forking the first process of a job and not marking any jobs without processes as done or stopped. --- bin/sh/jobs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 1b7a6d4..994c064 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -766,7 +766,7 @@ forkshell(struct job *jp, union node *n, int mode) TRACE(("forkshell(%%%td, %p, %d) called\n", jp - jobtab, (void *)n, mode)); INTOFF; - if (mode == FORK_BG) + if (mode == FORK_BG && (jp == NULL || jp->nprocs == 0)) checkzombies(); flushall(); pid = fork(); @@ -980,7 +980,7 @@ dowait(int block, struct job *job) INTOFF; thisjob = NULL; for (jp = jobtab ; jp < jobtab + njobs ; jp++) { - if (jp->used) { + if (jp->used && jp->nprocs > 0) { done = 1; stopped = 1; for (sp = jp->ps ; sp < jp->ps + jp->nprocs ; sp++) { -- cgit v1.1 From cec2e8182c77939ee3d4ff9ae865a9f36d437c57 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 22:01:01 +0000 Subject: Bring in the change from NetBSD 1.12: "document default format." Obtained from: yamt@NetBSD.org --- usr.bin/stat/stat.1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index aeff9ba..33e1196 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -438,6 +438,13 @@ which default to .Sh EXIT STATUS .Ex -std stat readlink .Sh EXAMPLES +If no options are specified, default format is +"%d %i %Sp %l %Su %Sg %r %z \\"%Sa\\" \\"%Sm\\" \\"%Sc\\" \\"%SB\\" %k %b %#Xf %N". +.Bd -literal -offset indent +\*[Gt] stat /tmp/bar +0 78852 -rw-r--r-- 1 root wheel 0 0 "Jul 8 10:26:03 2004" "Jul 8 10:26:03 2004" "Jul 8 10:28:13 2004" "Jan 1 09:00:00 1970" 16384 0 0 /tmp/bar +.Ed +.Pp Given a symbolic link .Pa foo that points from -- cgit v1.1 From 225ceb18e8a1729edd452bb883adfdb72d75c769 Mon Sep 17 00:00:00 2001 From: das Date: Sun, 5 Dec 2010 22:11:03 +0000 Subject: Add a "kernel" log function, based on e_log.c, which is useful for implementing accurate logarithms in different bases. This is based on an approach bde coded up years ago. This function should always be inlined; it will be used in only a few places, and rudimentary tests show a 40% performance improvement in implementations of log2() and log10() on amd64. The kernel takes a reduced argument x and returns the same polynomial approximation as e_log.c, but omitting the low-order term. The low-order term is much larger than the rest of the approximation, so the caller of the kernel function can scale it to the appropriate base in extra precision and obtain a much more accurate answer than by using log(x)/log(b). --- lib/msun/src/k_log.h | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/msun/src/k_logf.h | 55 ++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 lib/msun/src/k_log.h create mode 100644 lib/msun/src/k_logf.h diff --git a/lib/msun/src/k_log.h b/lib/msun/src/k_log.h new file mode 100644 index 0000000..206355c --- /dev/null +++ b/lib/msun/src/k_log.h @@ -0,0 +1,116 @@ + +/* @(#)e_log.c 1.3 95/01/18 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#include +__FBSDID("$FreeBSD$"); + +/* __kernel_log(x) + * Return log(x) - (x-1) for x in ~[sqrt(2)/2, sqrt(2)]. + * + * The following describes the overall strategy for computing + * logarithms in base e. The argument reduction and adding the final + * term of the polynomial are done by the caller for increased accuracy + * when different bases are used. + * + * Method : + * 1. Argument Reduction: find k and f such that + * x = 2^k * (1+f), + * where sqrt(2)/2 < 1+f < sqrt(2) . + * + * 2. Approximation of log(1+f). + * Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) + * = 2s + 2/3 s**3 + 2/5 s**5 + ....., + * = 2s + s*R + * We use a special Reme algorithm on [0,0.1716] to generate + * a polynomial of degree 14 to approximate R The maximum error + * of this polynomial approximation is bounded by 2**-58.45. In + * other words, + * 2 4 6 8 10 12 14 + * R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s + * (the values of Lg1 to Lg7 are listed in the program) + * and + * | 2 14 | -58.45 + * | Lg1*s +...+Lg7*s - R(z) | <= 2 + * | | + * Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. + * In order to guarantee error in log below 1ulp, we compute log + * by + * log(1+f) = f - s*(f - R) (if f is not too large) + * log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy) + * + * 3. Finally, log(x) = k*ln2 + log(1+f). + * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) + * Here ln2 is split into two floating point number: + * ln2_hi + ln2_lo, + * where n*ln2_hi is always exact for |n| < 2000. + * + * Special cases: + * log(x) is NaN with signal if x < 0 (including -INF) ; + * log(+INF) is +INF; log(0) is -INF with signal; + * log(NaN) is that NaN with no signal. + * + * Accuracy: + * according to an error analysis, the error is always less than + * 1 ulp (unit in the last place). + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +static const double +Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ +Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ +Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ +Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ +Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ +Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ +Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ + +/* + * We always inline __kernel_log(), since doing so produces a + * substantial performance improvement (~40% on amd64). + */ +static inline double +__kernel_log(double x) +{ + double hfsq,f,s,z,R,w,t1,t2; + int32_t hx,i,j; + u_int32_t lx; + + EXTRACT_WORDS(hx,lx,x); + + f = x-1.0; + if((0x000fffff&(2+hx))<3) { /* -2**-20 <= f < 2**-20 */ + if(f==0.0) return 0.0; + return f*f*(0.33333333333333333*f-0.5); + } + s = f/(2.0+f); + z = s*s; + hx &= 0x000fffff; + i = hx-0x6147a; + w = z*z; + j = 0x6b851-hx; + t1= w*(Lg2+w*(Lg4+w*Lg6)); + t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); + i |= j; + R = t2+t1; + if (i>0) { + hfsq=0.5*f*f; + return s*(hfsq+R) - hfsq; + } else { + return s*(R-f); + } +} diff --git a/lib/msun/src/k_logf.h b/lib/msun/src/k_logf.h new file mode 100644 index 0000000..d11a563 --- /dev/null +++ b/lib/msun/src/k_logf.h @@ -0,0 +1,55 @@ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#include +__FBSDID("$FreeBSD$"); + +/* __kernel_logf(x) + * Return log(x) - (x-1) for x in ~[sqrt(2)/2, sqrt(2)]. + */ + +static const float +/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */ +Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */ +Lg2 = 0xccce13.0p-25, /* 0.40000972152 */ +Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */ +Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */ + +static inline float +__kernel_logf(float x) +{ + float hfsq,f,s,z,R,w,t1,t2; + int32_t ix,i,j; + + GET_FLOAT_WORD(ix,x); + + f = x-(float)1.0; + if((0x007fffff&(0x8000+ix))<0xc000) { /* -2**-9 <= f < 2**-9 */ + if(f==0.0) return 0.0; + return f*f*((float)0.33333333333333333*f-(float)0.5); + } + s = f/((float)2.0+f); + z = s*s; + ix &= 0x007fffff; + i = ix-(0x6147a<<3); + w = z*z; + j = (0x6b851<<3)-ix; + t1= w*(Lg2+w*Lg4); + t2= z*(Lg1+w*Lg3); + i |= j; + R = t2+t1; + if(i>0) { + hfsq=(float)0.5*f*f; + return s*(hfsq+R) - hfsq; + } else { + return s*(R-f); + } +} -- cgit v1.1 From 82b52495adf6738472755dbfcbe69c392a3edde2 Mon Sep 17 00:00:00 2001 From: das Date: Sun, 5 Dec 2010 22:11:22 +0000 Subject: Add log2() and log2f(). --- lib/msun/Makefile | 5 ++-- lib/msun/Symbol.map | 2 ++ lib/msun/man/log.3 | 18 ++++++++++++-- lib/msun/man/math.3 | 18 ++++++++------ lib/msun/src/e_log2.c | 60 +++++++++++++++++++++++++++++++++++++++++++++ lib/msun/src/e_log2f.c | 54 ++++++++++++++++++++++++++++++++++++++++ lib/msun/src/math.h | 2 ++ lib/msun/src/math_private.h | 2 ++ 8 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 lib/msun/src/e_log2.c create mode 100644 lib/msun/src/e_log2f.c diff --git a/lib/msun/Makefile b/lib/msun/Makefile index 929af97..0048e25 100644 --- a/lib/msun/Makefile +++ b/lib/msun/Makefile @@ -45,7 +45,8 @@ COMMON_SRCS= b_exp.c b_log.c b_tgamma.c \ e_expf.c e_fmod.c e_fmodf.c e_gamma.c e_gamma_r.c e_gammaf.c \ e_gammaf_r.c e_hypot.c e_hypotf.c e_j0.c e_j0f.c e_j1.c e_j1f.c \ e_jn.c e_jnf.c e_lgamma.c e_lgamma_r.c e_lgammaf.c e_lgammaf_r.c \ - e_log.c e_log10.c e_log10f.c e_logf.c e_pow.c e_powf.c e_rem_pio2.c \ + e_log.c e_log10.c e_log10f.c e_log2.c e_log2f.c e_logf.c \ + e_pow.c e_powf.c e_rem_pio2.c \ e_rem_pio2f.c e_remainder.c e_remainderf.c e_scalb.c e_scalbf.c \ e_sinh.c e_sinhf.c e_sqrt.c e_sqrtf.c fenv.c \ k_cos.c k_cosf.c k_rem_pio2.c k_sin.c k_sinf.c \ @@ -175,7 +176,7 @@ MLINKS+=j0.3 j1.3 j0.3 jn.3 j0.3 y0.3 j0.3 y1.3 j0.3 y1f.3 j0.3 yn.3 MLINKS+=j0.3 j0f.3 j0.3 j1f.3 j0.3 jnf.3 j0.3 y0f.3 j0.3 ynf.3 MLINKS+=lgamma.3 gamma.3 lgamma.3 gammaf.3 lgamma.3 lgammaf.3 \ lgamma.3 tgamma.3 lgamma.3 tgammaf.3 -MLINKS+=log.3 log10.3 log.3 log10f.3 log.3 log1p.3 log.3 log1pf.3 log.3 logf.3 +MLINKS+=log.3 log10.3 log.3 log10f.3 log.3 log1p.3 log.3 log1pf.3 log.3 logf.3 log.3 log2.3 log.3 log2f.3 MLINKS+=lrint.3 llrint.3 lrint.3 llrintf.3 lrint.3 llrintl.3 \ lrint.3 lrintf.3 lrint.3 lrintl.3 MLINKS+=lround.3 llround.3 lround.3 llroundf.3 lround.3 llroundl.3 \ diff --git a/lib/msun/Symbol.map b/lib/msun/Symbol.map index 429a76f..69618e6 100644 --- a/lib/msun/Symbol.map +++ b/lib/msun/Symbol.map @@ -222,4 +222,6 @@ FBSD_1.1 { /* First added in 9.0-CURRENT */ FBSD_1.2 { __isnanf; + log2; + log2f; }; diff --git a/lib/msun/man/log.3 b/lib/msun/man/log.3 index 1934473..b9fd83c 100644 --- a/lib/msun/man/log.3 +++ b/lib/msun/man/log.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2008 David Schultz +.\" Copyright (c) 2008-2010 David Schultz .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 17, 2008 +.Dd December 5, 2010 .Dt LOG 3 .Os .Sh NAME @@ -33,6 +33,8 @@ .Nm logl , .Nm log10 , .Nm log10f , +.Nm log2 , +.Nm log2f , .Nm log1p , .Nm log1pf .Nd logarithm functions @@ -49,6 +51,10 @@ .Ft float .Fn log10f "float x" .Ft double +.Fn log2 "double x" +.Ft float +.Fn log2f "float x" +.Ft double .Fn log1p "double x" .Ft float .Fn log1pf "float x" @@ -65,6 +71,12 @@ The and .Fn log10f functions compute the logarithm base 10 of +.Fa x , +while +.Fn log2 +and +.Fn log2f +compute the logarithm base 2 of .Fa x . .Pp The @@ -97,6 +109,8 @@ The .Fn logf , .Fn log10 , .Fn log10f , +.Fn log2 , +.Fn log2f , .Fn log1p , and .Fn log1pf diff --git a/lib/msun/man/math.3 b/lib/msun/man/math.3 index 4690a9a..8e79ce5 100644 --- a/lib/msun/man/math.3 +++ b/lib/msun/man/math.3 @@ -28,7 +28,7 @@ .\" from: @(#)math.3 6.10 (Berkeley) 5/6/91 .\" $FreeBSD$ .\" -.Dd December 16, 2007 +.Dd December 5, 2010 .Dt MATH 3 .Os .Sh NAME @@ -182,7 +182,7 @@ lgamma log gamma function log natural logarithm log10 logarithm to base 10 log1p log(1+x) -.\" log2 base 2 logarithm +log2 base 2 logarithm pow exponential x**y sin trigonometric function sinh hyperbolic function @@ -194,7 +194,7 @@ y1 Bessel function of the second kind of the order 1 yn Bessel function of the second kind of the order n .El .Pp -Unlike the algebraic functions listed earlier, the routines +The routines in this section may not produce a result that is correctly rounded, so reproducible results cannot be guaranteed across platforms. For most of these functions, however, incorrect rounding occurs @@ -221,18 +221,20 @@ and values, were written for or imported into subsequent versions of FreeBSD. .Sh BUGS The -.Fn log2 -function is missing, and many functions are not available in their +.Fn cbrt +function and many of the transcendental functions +are not available in their .Vt "long double" variants. .Pp Many of the routines to compute transcendental functions produce inaccurate results in other than the default rounding mode. .Pp -On some architectures, trigonometric argument reduction is not -performed accurately, resulting in errors greater than 1 +On the i386 platform, trigonometric argument reduction is not +performed accurately for very large arguments, resulting in errors +greater than 1 .Em ulp -for large arguments to +for such arguments to .Fn cos , .Fn sin , and diff --git a/lib/msun/src/e_log2.c b/lib/msun/src/e_log2.c new file mode 100644 index 0000000..8a729d5 --- /dev/null +++ b/lib/msun/src/e_log2.c @@ -0,0 +1,60 @@ + +/* @(#)e_log10.c 1.3 95/01/18 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#include +__FBSDID("$FreeBSD$"); + +/* log2(x) + * Return the base 2 logarithm of x. + */ + +#include "math.h" +#include "math_private.h" +#include "k_log.h" + +static const double +two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ +ivln2hi = 0x1.71547652000p+0, +ivln2lo = 0x1.705fc2eefa2p-33; + +static const double zero = 0.0; + +double +__ieee754_log2(double x) +{ + double f,hi,lo; + int32_t i,k,hx; + u_int32_t lx; + + EXTRACT_WORDS(hx,lx,x); + + k=0; + if (hx < 0x00100000) { /* x < 2**-1022 */ + if (((hx&0x7fffffff)|lx)==0) + return -two54/zero; /* log(+-0)=-inf */ + if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + k -= 54; x *= two54; /* subnormal number, scale up x */ + GET_HIGH_WORD(hx,x); + } + if (hx >= 0x7ff00000) return x+x; + k += (hx>>20)-1023; + hx &= 0x000fffff; + i = (hx+0x95f64)&0x100000; + SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */ + k += (i>>20); + f = __kernel_log(x); + hi = x = x - 1; + SET_LOW_WORD(hi,0); + lo = x - hi; + return (x+f)*ivln2lo + (lo+f)*ivln2hi + hi*ivln2hi + k; +} diff --git a/lib/msun/src/e_log2f.c b/lib/msun/src/e_log2f.c new file mode 100644 index 0000000..6b2b966 --- /dev/null +++ b/lib/msun/src/e_log2f.c @@ -0,0 +1,54 @@ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "math.h" +#include "math_private.h" +#include "k_logf.h" + +static const float +two25 = 3.3554432000e+07, /* 0x4c000000 */ +ivln2hi = 0x1.716p+0f, +ivln2lo = -0x1.7135a8fa03d11p-13; + +static const float zero = 0.0; + +float +__ieee754_log2f(float x) +{ + float f,hi,lo; + int32_t i,k,hx; + + GET_FLOAT_WORD(hx,x); + + k=0; + if (hx < 0x00800000) { /* x < 2**-126 */ + if ((hx&0x7fffffff)==0) + return -two25/zero; /* log(+-0)=-inf */ + if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + k -= 25; x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD(hx,x); + } + if (hx >= 0x7f800000) return x+x; + k += (hx>>23)-127; + hx &= 0x007fffff; + i = (hx+(0x4afb0d))&0x800000; + SET_FLOAT_WORD(x,hx|(i^0x3f800000)); /* normalize x or x/2 */ + k += (i>>23); + f = __kernel_logf(x); + x = x - 1; + GET_FLOAT_WORD(hx,x); + SET_FLOAT_WORD(hi,hx&0xfffff000); + lo = x - hi; + return (x+f)*ivln2lo + (lo+f)*ivln2hi + hi*ivln2hi + k; +} diff --git a/lib/msun/src/math.h b/lib/msun/src/math.h index 9109727..9aa2484 100644 --- a/lib/msun/src/math.h +++ b/lib/msun/src/math.h @@ -236,6 +236,7 @@ double lgamma(double); long long llrint(double); long long llround(double); double log1p(double); +double log2(double); double logb(double); long lrint(double); long lround(double); @@ -319,6 +320,7 @@ int ilogbf(float) __pure2; float ldexpf(float, int); float log10f(float); float log1pf(float); +float log2f(float); float logf(float); float modff(float, float *); /* fundamentally !__pure2 */ diff --git a/lib/msun/src/math_private.h b/lib/msun/src/math_private.h index 10c92f4..d79f808 100644 --- a/lib/msun/src/math_private.h +++ b/lib/msun/src/math_private.h @@ -292,6 +292,7 @@ irint(double x) #define __ieee754_acos acos #define __ieee754_acosh acosh #define __ieee754_log log +#define __ieee754_log2 log2 #define __ieee754_atanh atanh #define __ieee754_asin asin #define __ieee754_atan2 atan2 @@ -330,6 +331,7 @@ irint(double x) #define __ieee754_lgammaf_r lgammaf_r #define __ieee754_gammaf_r gammaf_r #define __ieee754_log10f log10f +#define __ieee754_log2f log2f #define __ieee754_sinhf sinhf #define __ieee754_hypotf hypotf #define __ieee754_j0f j0f -- cgit v1.1 From 993f365f0c9a0a2a66787e4c24f4f1be2a9759b5 Mon Sep 17 00:00:00 2001 From: das Date: Sun, 5 Dec 2010 22:12:07 +0000 Subject: Bump __FreeBSD_version for the addition of log2(). This is mainly for the benefit of ports such as opencity and inkscape that have workarounds for the lack of a log2() in the base system. --- sys/sys/param.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/sys/param.h b/sys/sys/param.h index 257d272..3c796e2 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900026 /* Master, propagated to newvers */ +#define __FreeBSD_version 900027 /* Master, propagated to newvers */ #ifdef _KERNEL #define P_OSREL_SIGSEGV 700004 -- cgit v1.1 From 69988c6faf026289092abcde09b2f8d1b06eab65 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 22:16:51 +0000 Subject: Bring in the changes from NetBSD 1.13 that we did not already have, with some differences. "Sort options. Use more mdoc macros. Some nit fixes. Bump date." Obtained from: wiz@NetBSD.org --- usr.bin/stat/stat.1 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index 33e1196..a94c305 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -50,7 +50,7 @@ The .Nm utility displays information about the file pointed to by .Ar file . -Read, write or execute permissions of the named file are not required, but +Read, write, or execute permissions of the named file are not required, but all directories listed in the path name leading to the file must be searchable. If no argument is given, @@ -122,6 +122,10 @@ If the link is broken or the target does not exist, fall back on .Xr lstat 2 and report information about the link. +.It Fl l +Display output in +.Ic ls Fl lT +format. .It Fl n Do not force a newline to appear at the end of each piece of output. .It Fl q @@ -151,7 +155,8 @@ display the raw, numerical value (for example, times in seconds since the epoch, etc.). .It Fl s Display information in -.Dq "shell output" , +.Dq shell output +format, suitable for initializing variables. .It Fl x Display information in a more verbose way as known from some @@ -438,7 +443,7 @@ which default to .Sh EXIT STATUS .Ex -std stat readlink .Sh EXAMPLES -If no options are specified, default format is +If no options are specified, the default format is "%d %i %Sp %l %Su %Sg %r %z \\"%Sa\\" \\"%Sm\\" \\"%Sc\\" \\"%SB\\" %k %b %#Xf %N". .Bd -literal -offset indent \*[Gt] stat /tmp/bar @@ -446,7 +451,7 @@ If no options are specified, default format is .Ed .Pp Given a symbolic link -.Pa foo +.Dq foo that points from .Pa /tmp/foo to -- cgit v1.1 From e63325a777edc296ed63c10ce22e0ca9005c1a71 Mon Sep 17 00:00:00 2001 From: das Date: Sun, 5 Dec 2010 22:18:35 +0000 Subject: Add regression tests for logarithmic functions in the math library. --- tools/regression/lib/msun/Makefile | 2 +- tools/regression/lib/msun/test-logarithm.c | 158 +++++++++++++++++++++++++++++ tools/regression/lib/msun/test-logarithm.t | 10 ++ 3 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 tools/regression/lib/msun/test-logarithm.c create mode 100644 tools/regression/lib/msun/test-logarithm.t diff --git a/tools/regression/lib/msun/Makefile b/tools/regression/lib/msun/Makefile index d5f1594..eb9a6ae 100644 --- a/tools/regression/lib/msun/Makefile +++ b/tools/regression/lib/msun/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ TESTS= test-conj test-csqrt test-exponential test-fenv test-fma \ - test-fmaxmin test-ilogb test-invtrig test-lrint \ + test-fmaxmin test-ilogb test-invtrig test-logarithm test-lrint \ test-lround test-nan test-nearbyint test-next test-rem test-trig CFLAGS+= -O0 -lm diff --git a/tools/regression/lib/msun/test-logarithm.c b/tools/regression/lib/msun/test-logarithm.c new file mode 100644 index 0000000..e1c0f25 --- /dev/null +++ b/tools/regression/lib/msun/test-logarithm.c @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 2008-2010 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Tests for corner cases in log*(). + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#ifdef __i386__ +#include +#endif + +#define ALL_STD_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \ + FE_OVERFLOW | FE_UNDERFLOW) + +#pragma STDC FENV_ACCESS ON + +/* + * Test that a function returns the correct value and sets the + * exception flags correctly. The exceptmask specifies which + * exceptions we should check. We need to be lenient for several + * reasoons, but mainly because on some architectures it's impossible + * to raise FE_OVERFLOW without raising FE_INEXACT. + * + * These are macros instead of functions so that assert provides more + * meaningful error messages. + * + * XXX The volatile here is to avoid gcc's bogus constant folding and work + * around the lack of support for the FENV_ACCESS pragma. + */ +#define test(func, x, result, exceptmask, excepts) do { \ + volatile long double _d = x; \ + assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ + assert(fpequal((func)(_d), (result))); \ + assert(((func), fetestexcept(exceptmask) == (excepts))); \ +} while (0) + +/* Test all the functions that compute log(x). */ +#define testall0(x, result, exceptmask, excepts) do { \ + test(log, x, result, exceptmask, excepts); \ + test(logf, x, result, exceptmask, excepts); \ + test(log2, x, result, exceptmask, excepts); \ + test(log2f, x, result, exceptmask, excepts); \ + test(log10, x, result, exceptmask, excepts); \ + test(log10f, x, result, exceptmask, excepts); \ +} while (0) + +/* Test all the functions that compute log(1+x). */ +#define testall1(x, result, exceptmask, excepts) do { \ + test(log1p, x, result, exceptmask, excepts); \ + test(log1pf, x, result, exceptmask, excepts); \ +} while (0) + +/* + * Determine whether x and y are equal, with two special rules: + * +0.0 != -0.0 + * NaN == NaN + */ +int +fpequal(long double x, long double y) +{ + return ((x == y && signbit(x) == signbit(y)) || isnan(x) && isnan(y)); +} + +void +run_generic_tests(void) +{ + + /* exp(1) == 0, no exceptions raised */ + testall0(1.0, 0.0, ALL_STD_EXCEPT, 0); + testall1(0.0, 0.0, ALL_STD_EXCEPT, 0); + testall1(-0.0, -0.0, ALL_STD_EXCEPT, 0); + + /* log(NaN) == NaN, no exceptions raised */ + testall0(NAN, NAN, ALL_STD_EXCEPT, 0); + testall1(NAN, NAN, ALL_STD_EXCEPT, 0); + + /* log(Inf) == Inf, no exceptions raised */ + testall0(INFINITY, INFINITY, ALL_STD_EXCEPT, 0); + testall1(INFINITY, INFINITY, ALL_STD_EXCEPT, 0); + + /* log(x) == NaN for x < 0, invalid exception raised */ + testall0(-INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); + testall1(-INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); + testall0(-1.0, NAN, ALL_STD_EXCEPT, FE_INVALID); + testall1(-1.5, NAN, ALL_STD_EXCEPT, FE_INVALID); + + /* log(0) == -Inf, divide-by-zero exception */ + testall0(0.0, -INFINITY, ALL_STD_EXCEPT & ~FE_INEXACT, FE_DIVBYZERO); + testall0(-0.0, -INFINITY, ALL_STD_EXCEPT & ~FE_INEXACT, FE_DIVBYZERO); + testall1(-1.0, -INFINITY, ALL_STD_EXCEPT & ~FE_INEXACT, FE_DIVBYZERO); +} + +void +run_log2_tests(void) +{ + int i; + + /* + * We should insist that log2() return exactly the correct + * result and not raise an inexact exception for powers of 2. + */ + feclearexcept(FE_ALL_EXCEPT); + for (i = FLT_MIN_EXP - FLT_MANT_DIG; i < FLT_MAX_EXP; i++) { + assert(log2f(ldexpf(1.0, i)) == i); + assert(fetestexcept(ALL_STD_EXCEPT) == 0); + } + for (i = DBL_MIN_EXP - DBL_MANT_DIG; i < DBL_MAX_EXP; i++) { + assert(log2(ldexp(1.0, i)) == i); + assert(fetestexcept(ALL_STD_EXCEPT) == 0); + } +} + +int +main(int argc, char *argv[]) +{ + + printf("1..2\n"); + + run_generic_tests(); + printf("ok 1 - logarithm\n"); + + run_log2_tests(); + printf("ok 2 - logarithm\n"); + + return (0); +} diff --git a/tools/regression/lib/msun/test-logarithm.t b/tools/regression/lib/msun/test-logarithm.t new file mode 100644 index 0000000..8bdfd03 --- /dev/null +++ b/tools/regression/lib/msun/test-logarithm.t @@ -0,0 +1,10 @@ +#!/bin/sh +# $FreeBSD$ + +cd `dirname $0` + +executable=`basename $0 .t` + +make $executable 2>&1 > /dev/null + +exec ./$executable -- cgit v1.1 From 8675a57d57db7096e72b2e3922ffaf6599bb4744 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 22:20:08 +0000 Subject: Bring in the changes from NetBSD 1.16 that we did not already have. "Some fixes from jmc@openbsd." Obtained from: wiz@NetBSD.org --- usr.bin/stat/stat.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index a94c305..dbb0baa 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -51,7 +51,7 @@ The utility displays information about the file pointed to by .Ar file . Read, write, or execute permissions of the named file are not required, but -all directories listed in the path name leading to the file must be +all directories listed in the pathname leading to the file must be searchable. If no argument is given, .Nm @@ -372,7 +372,7 @@ Device number for character and block device special files. .It Cm a , m , c , B The time .Ar file -was last accessed or modified, of when the inode was last changed, or +was last accessed or modified, or when the inode was last changed, or the birth time of the inode. .It Cm z The size of -- cgit v1.1 From 8186346ebb40a05ee911488b3b48056f2d9e69b0 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 22:24:34 +0000 Subject: Bring in the change from NetBSD 1.20: "Make sentence easier to parse. From jsing@openbsd via jmc@openbsd." Obtained from: wiz@NetBSD.org --- usr.bin/stat/stat.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index dbb0baa..2c800e7 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -428,12 +428,12 @@ as an output form, with the exception of .Cm p which defaults to -.Cm O , +.Cm O ; .Cm a , m , and .Cm c which default to -.Cm D , +.Cm D ; and .Cm Y , T , and -- cgit v1.1 From 91e61ea9fc5a14b27d49a05b90e2732126f1a86c Mon Sep 17 00:00:00 2001 From: jilles Date: Sun, 5 Dec 2010 22:37:01 +0000 Subject: sh: Improve jobs output of pipelines. If describing the status of a pipeline, write all elements of the pipeline and show the status of the last process (which would also end up in $?). Only write one report per job, not one for every process that exits. To keep some earlier behaviour, if any process started by the shell in a foreground job terminates because of a signal, write a message about the signal (at most one message per job, however). Also, do not write messages about signals in the wait builtin in non-interactive shells. Only true foreground jobs now write such messages (for example, "Terminated"). --- bin/sh/jobs.c | 149 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 66 deletions(-) diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 994c064..60f9795 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -100,7 +100,8 @@ static void setcurjob(struct job *); static void deljob(struct job *); static struct job *getcurjob(struct job *); #endif -static void showjob(struct job *, pid_t, int); +static void printjobcmd(struct job *); +static void showjob(struct job *, int); /* @@ -205,8 +206,7 @@ fgcmd(int argc __unused, char **argv) jp = getjob(argv[1]); if (jp->jobctl == 0) error("job not created under job control"); - out1str(jp->ps[0].cmd); - out1c('\n'); + printjobcmd(jp); flushout(&output); pgrp = jp->ps[0].pid; tcsetpgrp(ttyfd, pgrp); @@ -235,8 +235,7 @@ bgcmd(int argc, char **argv) jp->foreground = 0; fmtstr(s, 64, "[%td] ", jp - jobtab + 1); out1str(s); - out1str(jp->ps[0].cmd); - out1c('\n'); + printjobcmd(jp); } while (--argc > 1); return 0; } @@ -296,15 +295,30 @@ jobscmd(int argc, char *argv[]) showjobs(0, mode); else while ((id = *argv++) != NULL) - showjob(getjob(id), 0, mode); + showjob(getjob(id), mode); return (0); } static void -showjob(struct job *jp, pid_t pid, int mode) +printjobcmd(struct job *jp) +{ + struct procstat *ps; + int i; + + for (ps = jp->ps, i = jp->nprocs ; --i >= 0 ; ps++) { + out1str(ps->cmd); + if (i > 0) + out1str(" | "); + } + out1c('\n'); +} + +static void +showjob(struct job *jp, int mode) { char s[64]; + char statestr[64]; struct procstat *ps; struct job *j; int col, curr, i, jobno, prev, procno; @@ -320,14 +334,44 @@ showjob(struct job *jp, pid_t pid, int mode) prev = j - jobtab + 1; } #endif + ps = jp->ps + jp->nprocs - 1; + if (jp->state == 0) { + strcpy(statestr, "Running"); +#if JOBS + } else if (jp->state == JOBSTOPPED) { + while (!WIFSTOPPED(ps->status) && ps > jp->ps) + ps--; + if (WIFSTOPPED(ps->status)) + i = WSTOPSIG(ps->status); + else + i = -1; + if (i > 0 && i < sys_nsig && sys_siglist[i]) + strcpy(statestr, sys_siglist[i]); + else + strcpy(statestr, "Suspended"); +#endif + } else if (WIFEXITED(ps->status)) { + if (WEXITSTATUS(ps->status) == 0) + strcpy(statestr, "Done"); + else + fmtstr(statestr, 64, "Done (%d)", + WEXITSTATUS(ps->status)); + } else { + i = WTERMSIG(ps->status); + if (i > 0 && i < sys_nsig && sys_siglist[i]) + strcpy(statestr, sys_siglist[i]); + else + fmtstr(statestr, 64, "Signal %d", i); + if (WCOREDUMP(ps->status)) + strcat(statestr, " (core dumped)"); + } + for (ps = jp->ps ; ; ps++) { /* for each process */ if (mode == SHOWJOBS_PIDS || mode == SHOWJOBS_PGIDS) { out1fmt("%d\n", (int)ps->pid); goto skip; } - if (mode != SHOWJOBS_VERBOSE && ps != jp->ps && pid == 0) - goto skip; - if (pid != 0 && pid != ps->pid) + if (mode != SHOWJOBS_VERBOSE && ps != jp->ps) goto skip; if (jobno == curr && ps == jp->ps) c = '+'; @@ -346,39 +390,19 @@ showjob(struct job *jp, pid_t pid, int mode) out1str(s); col += strlen(s); } - s[0] = '\0'; - if (ps != jp->ps) { - *s = '\0'; - } else if (ps->status == -1) { - strcpy(s, "Running"); - } else if (WIFEXITED(ps->status)) { - if (WEXITSTATUS(ps->status) == 0) - strcpy(s, "Done"); - else - fmtstr(s, 64, "Done (%d)", - WEXITSTATUS(ps->status)); - } else { -#if JOBS - if (WIFSTOPPED(ps->status)) - i = WSTOPSIG(ps->status); - else -#endif - i = WTERMSIG(ps->status); - if ((i & 0x7F) < sys_nsig && sys_siglist[i & 0x7F]) - scopy(sys_siglist[i & 0x7F], s); - else - fmtstr(s, 64, "Signal %d", i & 0x7F); - if (WCOREDUMP(ps->status)) - strcat(s, " (core dumped)"); + if (ps == jp->ps) { + out1str(statestr); + col += strlen(statestr); } - out1str(s); - col += strlen(s); do { out1c(' '); col++; } while (col < 30); - out1str(ps->cmd); - out1c('\n'); + if (mode == SHOWJOBS_VERBOSE) { + out1str(ps->cmd); + out1c('\n'); + } else + printjobcmd(jp); skip: if (--procno <= 0) break; } @@ -410,7 +434,7 @@ showjobs(int change, int mode) } if (change && ! jp->changed) continue; - showjob(jp, 0, mode); + showjob(jp, mode); jp->changed = 0; /* Hack: discard jobs for which $! has not been referenced * in interactive mode when they terminate. @@ -958,7 +982,7 @@ dowait(int block, struct job *job) int done; int stopped; int sig; - int i; + int coredump; in_dowait++; TRACE(("dowait(%d) called\n", block)); @@ -1017,36 +1041,29 @@ dowait(int block, struct job *job) } } INTON; - if (! rootshell || ! iflag || (job && thisjob == job)) { -#if JOBS - if (WIFSTOPPED(status)) - sig = WSTOPSIG(status); - else -#endif - { - if (WIFEXITED(status)) - sig = 0; + if (!thisjob || thisjob->state == 0) + ; + else if ((!rootshell || !iflag || thisjob == job) && + thisjob->foreground && thisjob->state != JOBSTOPPED) { + sig = 0; + coredump = 0; + for (sp = thisjob->ps; sp < thisjob->ps + thisjob->nprocs; sp++) + if (WIFSIGNALED(sp->status)) { + sig = WTERMSIG(sp->status); + coredump = WCOREDUMP(sp->status); + } + if (sig > 0 && sig != SIGINT && sig != SIGPIPE) { + if (sig < sys_nsig && sys_siglist[sig]) + out1str(sys_siglist[sig]); else - sig = WTERMSIG(status); - } - if (sig != 0 && sig != SIGINT && sig != SIGPIPE) { - if (!mflag || - (thisjob->foreground && !WIFSTOPPED(status))) { - i = WTERMSIG(status); - if ((i & 0x7F) < sys_nsig && sys_siglist[i & 0x7F]) - out1str(sys_siglist[i & 0x7F]); - else - out1fmt("Signal %d", i & 0x7F); - if (WCOREDUMP(status)) - out1str(" (core dumped)"); - out1c('\n'); - } else - showjob(thisjob, pid, SHOWJOBS_DEFAULT); + out1fmt("Signal %d", sig); + if (coredump) + out1str(" (core dumped)"); + out1c('\n'); } } else { TRACE(("Not printing status, rootshell=%d, job=%p\n", rootshell, job)); - if (thisjob) - thisjob->changed = 1; + thisjob->changed = 1; } return pid; } -- cgit v1.1 From 0758a1dee9d38ddc5f360845c2e6901da3d0d322 Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 22:41:58 +0000 Subject: Bring in the following changes from NetBSD: 1.21 "Document the flags displayed by the default format, and mention their short names. From espie@openbsd via jmc@openbsd." 1.24 "Fix three variable names. From Todd T. Fries via Jason McIntyre." Obtained from: wiz@NetBSD.org (previous 2) 1.25 "Be consistent: document the birthtime field of struct stat for the "B" field specifier." Obtained from: reed@NetBSD.org 1.26 "Drop trailing space." Obtained from: wiz@NetBSD.org 1.27 "Since we have st_birthtime in struct stat, it is in default display." Obtained from: enami@NetBSD.org Purposely skipping the following revisions: 1.22 NetBSD-specific change 1.23 Removal of license clauses 3 and 4, already handled by imp in our r203971 --- usr.bin/stat/stat.1 | 55 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index 2c800e7..4b51431 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: stat.1,v 1.19 2006/10/07 10:41:50 elad Exp $ +.\" $NetBSD: stat.1,v 1.27 2010/03/11 21:37:01 enami Exp $ .\" .\" Copyright (c) 2002 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -68,7 +68,7 @@ will print nothing and exit with an error. If the .Fl f option is specified, the output is canonicalized by following every symlink -in every component of the given path recursively. +in every component of the given path recursively. .Nm readlink will resolve both absolute and relative paths, and return the absolute pathname corresponding to @@ -78,6 +78,24 @@ In this case, the argument does not need to be a symbolic link. The information displayed is obtained by calling .Xr lstat 2 with the given argument and evaluating the returned structure. +The default format displays the +.Fa st_dev , +.Fa st_ino , +.Fa st_mode , +.Fa st_nlink , +.Fa st_uid , +.Fa st_gid , +.Fa st_rdev , +.Fa st_size , +.Fa st_atime , +.Fa st_mtime , +.Fa st_ctime , +.Fa st_birthtime , +.Fa st_blksize , +.Fa st_blocks , +and +.Fa st_flags +fields, in that order. .Pp The options are as follows: .Bl -tag -width indent @@ -354,40 +372,51 @@ A required field specifier, being one of the following: .It Cm d Device upon which .Ar file -resides. +resides +.Pq Fa st_dev . .It Cm i .Ar file Ns 's -inode number. +inode number +.Pq Fa st_ino . .It Cm p -File type and permissions. +File type and permissions +.Pq Fa st_mode . .It Cm l Number of hard links to -.Ar file . +.Ar file +.Pq Fa st_nlink . .It Cm u , g User ID and group ID of .Ar file Ns 's -owner. +owner +.Pq Fa st_uid , st_gid . .It Cm r -Device number for character and block device special files. +Device number for character and block device special files +.Pq Fa st_rdev . .It Cm a , m , c , B The time .Ar file was last accessed or modified, or when the inode was last changed, or -the birth time of the inode. +the birth time of the inode +.Pq Fa st_atime , st_mtime , st_ctime , st_birthtime . .It Cm z The size of .Ar file -in bytes. +in bytes +.Pq Fa st_size . .It Cm b Number of blocks allocated for -.Ar file . +.Ar file +.Pq Fa st_blocks . .It Cm k -Optimal file system I/O operation block size. +Optimal file system I/O operation block size +.Pq Fa st_blksize . .It Cm f User defined flags for .Ar file . .It Cm v -Inode generation number. +Inode generation number +.Pq Fa st_gen . .El .Pp The following five field specifiers are not drawn directly from the -- cgit v1.1 From 6d438ef9eb57ad56c1b1e5f1f8c78825e3a4797c Mon Sep 17 00:00:00 2001 From: dougb Date: Sun, 5 Dec 2010 22:47:08 +0000 Subject: Bring in the change from NetBSD 1.28: "\\ -> \e" Obtained from: joerg@NetBSD.org Bump .Dd because we're now up to date with the latest NetBSD version --- usr.bin/stat/stat.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index 4b51431..92a8515 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: stat.1,v 1.27 2010/03/11 21:37:01 enami Exp $ +.\" $NetBSD: stat.1,v 1.28 2010/04/05 21:25:01 joerg Exp $ .\" .\" Copyright (c) 2002 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 24, 2010 +.Dd December 5, 2010 .Dt STAT 1 .Os .Sh NAME @@ -473,7 +473,7 @@ which default to .Ex -std stat readlink .Sh EXAMPLES If no options are specified, the default format is -"%d %i %Sp %l %Su %Sg %r %z \\"%Sa\\" \\"%Sm\\" \\"%Sc\\" \\"%SB\\" %k %b %#Xf %N". +"%d %i %Sp %l %Su %Sg %r %z \e"%Sa\e" \e"%Sm\e" \e"%Sc\e" \e"%SB\e" %k %b %#Xf %N". .Bd -literal -offset indent \*[Gt] stat /tmp/bar 0 78852 -rw-r--r-- 1 root wheel 0 0 "Jul 8 10:26:03 2004" "Jul 8 10:26:03 2004" "Jul 8 10:28:13 2004" "Jan 1 09:00:00 1970" 16384 0 0 /tmp/bar -- cgit v1.1 From 0c87a741dcb662392e300caa455767e563990ee7 Mon Sep 17 00:00:00 2001 From: jilles Date: Sun, 5 Dec 2010 22:56:46 +0000 Subject: sh: POSIX says there should not be a space between Done and (exitstatus). (On the other hand, (core dumped) does need a space and so does [1] +.) --- bin/sh/jobs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 60f9795..a761f28 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -354,7 +354,7 @@ showjob(struct job *jp, int mode) if (WEXITSTATUS(ps->status) == 0) strcpy(statestr, "Done"); else - fmtstr(statestr, 64, "Done (%d)", + fmtstr(statestr, 64, "Done(%d)", WEXITSTATUS(ps->status)); } else { i = WTERMSIG(ps->status); -- cgit v1.1 From c1efcc0baa107ce6321d774db5245e77ed64cf14 Mon Sep 17 00:00:00 2001 From: das Date: Sun, 5 Dec 2010 23:50:49 +0000 Subject: Fix some warnings. --- tools/regression/lib/msun/test-fmaxmin.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/regression/lib/msun/test-fmaxmin.c b/tools/regression/lib/msun/test-fmaxmin.c index f1e0a7e..4734186 100644 --- a/tools/regression/lib/msun/test-fmaxmin.c +++ b/tools/regression/lib/msun/test-fmaxmin.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); * fpequal(NaN, NaN) is true * fpequal(+0.0, -0.0) is false */ -inline int +static inline int fpequal(long double x, long double y) { @@ -63,7 +63,7 @@ fpequal(long double x, long double y) feclearexcept(ALL_STD_EXCEPT); \ long double __result = func((__x), (__y)); \ if (fetestexcept(ALL_STD_EXCEPT)) { \ - fprintf(stderr, #func "(%L.20g, %L.20g) raised 0x%x\n", \ + fprintf(stderr, #func "(%.20Lg, %.20Lg) raised 0x%x\n", \ (x), (y), fetestexcept(FE_ALL_EXCEPT)); \ ok = 0; \ } \ @@ -104,7 +104,7 @@ testall_r(long double big, long double small) * in all rounding modes and with the arguments in different orders. * The input 'big' must be >= 'small'. */ -int +void testall(int testnum, long double big, long double small) { static const int rmodes[] = { -- cgit v1.1 From 812571675e8fd17c6affd8cc80f0bde3cbb19d01 Mon Sep 17 00:00:00 2001 From: das Date: Mon, 6 Dec 2010 00:02:49 +0000 Subject: signbit() returns nonzero for negative arguments, but we shouldn't assume that it always returns the same nonzero value. --- tools/regression/lib/msun/test-exponential.c | 2 +- tools/regression/lib/msun/test-fma.c | 3 ++- tools/regression/lib/msun/test-fmaxmin.c | 3 ++- tools/regression/lib/msun/test-invtrig.c | 2 +- tools/regression/lib/msun/test-logarithm.c | 2 +- tools/regression/lib/msun/test-trig.c | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/regression/lib/msun/test-exponential.c b/tools/regression/lib/msun/test-exponential.c index 6111e96..53a6116 100644 --- a/tools/regression/lib/msun/test-exponential.c +++ b/tools/regression/lib/msun/test-exponential.c @@ -89,7 +89,7 @@ __FBSDID("$FreeBSD$"); int fpequal(long double x, long double y) { - return ((x == y && signbit(x) == signbit(y)) || isnan(x) && isnan(y)); + return ((x == y && !signbit(x) == !signbit(y)) || isnan(x) && isnan(y)); } void diff --git a/tools/regression/lib/msun/test-fma.c b/tools/regression/lib/msun/test-fma.c index 5511eb3..00620f8 100644 --- a/tools/regression/lib/msun/test-fma.c +++ b/tools/regression/lib/msun/test-fma.c @@ -85,7 +85,8 @@ int fpequal(long double x, long double y) { - return ((x == y && signbit(x) == signbit(y)) || (isnan(x) && isnan(y))); + return ((x == y && !signbit(x) == !signbit(y)) + || (isnan(x) && isnan(y))); } static void diff --git a/tools/regression/lib/msun/test-fmaxmin.c b/tools/regression/lib/msun/test-fmaxmin.c index 4734186..fdba529 100644 --- a/tools/regression/lib/msun/test-fmaxmin.c +++ b/tools/regression/lib/msun/test-fmaxmin.c @@ -50,7 +50,8 @@ static inline int fpequal(long double x, long double y) { - return ((x == y && signbit(x) == signbit(y)) || (isnan(x) && isnan(y))); + return ((x == y && !signbit(x) == !signbit(y)) + || (isnan(x) && isnan(y))); } /* diff --git a/tools/regression/lib/msun/test-invtrig.c b/tools/regression/lib/msun/test-invtrig.c index 5900f5b..05d310f 100644 --- a/tools/regression/lib/msun/test-invtrig.c +++ b/tools/regression/lib/msun/test-invtrig.c @@ -118,7 +118,7 @@ fpequal(long double x, long double y, long double tol) if (isnan(x) && isnan(y)) return (1); - if (signbit(x) != signbit(y)) + if (!signbit(x) != !signbit(y)) return (0); if (x == y) return (1); diff --git a/tools/regression/lib/msun/test-logarithm.c b/tools/regression/lib/msun/test-logarithm.c index e1c0f25..52f562c 100644 --- a/tools/regression/lib/msun/test-logarithm.c +++ b/tools/regression/lib/msun/test-logarithm.c @@ -90,7 +90,7 @@ __FBSDID("$FreeBSD$"); int fpequal(long double x, long double y) { - return ((x == y && signbit(x) == signbit(y)) || isnan(x) && isnan(y)); + return ((x == y && !signbit(x) == !signbit(y)) || isnan(x) && isnan(y)); } void diff --git a/tools/regression/lib/msun/test-trig.c b/tools/regression/lib/msun/test-trig.c index e08c4a7..1ac7873 100644 --- a/tools/regression/lib/msun/test-trig.c +++ b/tools/regression/lib/msun/test-trig.c @@ -90,7 +90,7 @@ __FBSDID("$FreeBSD$"); int fpequal(long double x, long double y) { - return ((x == y && signbit(x) == signbit(y)) || isnan(x) && isnan(y)); + return ((x == y && !signbit(x) == !signbit(y)) || isnan(x) && isnan(y)); } /* -- cgit v1.1 From c0634c210540e4d95655c2c05ebae344ec03bb54 Mon Sep 17 00:00:00 2001 From: das Date: Mon, 6 Dec 2010 00:19:56 +0000 Subject: Work around gcc constant folding bugs. --- tools/regression/lib/msun/test-lrint.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/regression/lib/msun/test-lrint.c b/tools/regression/lib/msun/test-lrint.c index 1693a34a..ba099aa 100644 --- a/tools/regression/lib/msun/test-lrint.c +++ b/tools/regression/lib/msun/test-lrint.c @@ -41,9 +41,14 @@ __FBSDID("$FreeBSD$"); #include #endif +/* + * XXX The volatile here is to avoid gcc's bogus constant folding and work + * around the lack of support for the FENV_ACCESS pragma. + */ #define test(func, x, result, excepts) do { \ + volatile double _d = x; \ assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert((func)(x) == (result) || fetestexcept(FE_INVALID)); \ + assert((func)(_d) == (result) || fetestexcept(FE_INVALID)); \ assert(fetestexcept(FE_ALL_EXCEPT) == (excepts)); \ } while (0) -- cgit v1.1 From 6664a6800aec6986163dafe4b247d1a781065579 Mon Sep 17 00:00:00 2001 From: jh Date: Mon, 6 Dec 2010 09:18:11 +0000 Subject: Don't write the terminating NUL past end of buffer. PR: bin/152345 Submitted by: Mateusz Guzik --- usr.bin/truss/syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c index 7ef8e19..f19553d2 100644 --- a/usr.bin/truss/syscalls.c +++ b/usr.bin/truss/syscalls.c @@ -518,7 +518,7 @@ get_string(pid_t pid, void *offset, int max) buf = realloc(buf, totalsize); size = BLOCKSIZE; } else { - buf[totalsize] = '\0'; + buf[totalsize - 1] = '\0'; return (buf); } } -- cgit v1.1 From 4d4fc1fa3d63b3be90d7373c28a9f0a18be949ae Mon Sep 17 00:00:00 2001 From: glebius Date: Mon, 6 Dec 2010 09:37:56 +0000 Subject: Catch up with kernel using time_uptime to drive ARP timeouts. Noticed by: jilles --- usr.sbin/rarpd/rarpd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/usr.sbin/rarpd/rarpd.c b/usr.sbin/rarpd/rarpd.c index a500dd5..66055f3 100644 --- a/usr.sbin/rarpd/rarpd.c +++ b/usr.sbin/rarpd/rarpd.c @@ -666,6 +666,7 @@ struct { static void update_arptab(u_char *ep, in_addr_t ipaddr) { + struct timespec tp; int cc; struct sockaddr_inarp *ar, *ar2; struct sockaddr_dl *ll, *ll2; @@ -731,7 +732,8 @@ update_arptab(u_char *ep, in_addr_t ipaddr) rt->rtm_version = RTM_VERSION; rt->rtm_addrs = RTA_DST | RTA_GATEWAY; rt->rtm_inits = RTV_EXPIRE; - rt->rtm_rmx.rmx_expire = time(0) + ARPSECS; + clock_gettime(CLOCK_MONOTONIC, &tp); + rt->rtm_rmx.rmx_expire = tp.tv_sec + ARPSECS; rt->rtm_flags = RTF_HOST | RTF_STATIC; rt->rtm_type = RTM_ADD; rt->rtm_seq = ++seq; -- cgit v1.1 From f2bb89e063b90afc60f9711fb7e86c220e354b40 Mon Sep 17 00:00:00 2001 From: glebius Date: Mon, 6 Dec 2010 09:39:36 +0000 Subject: Catch up with kernel using time_uptime to drive ARP timeouts. Noticed by: jilles --- libexec/bootpd/rtmsg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libexec/bootpd/rtmsg.c b/libexec/bootpd/rtmsg.c index b691edc..8b81dab 100644 --- a/libexec/bootpd/rtmsg.c +++ b/libexec/bootpd/rtmsg.c @@ -126,7 +126,7 @@ int bsd_arp_set(ia, eaddr, len) register struct sockaddr_dl *sdl; register struct rt_msghdr *rtm = &(m_rtmsg.m_rtm); u_char *ea; - struct timeval time; + struct timespec tp; int op = RTM_ADD; getsocket(); @@ -140,8 +140,8 @@ int bsd_arp_set(ia, eaddr, len) doing_proxy = flags = export_only = expire_time = 0; /* make arp entry temporary */ - gettimeofday(&time, 0); - expire_time = time.tv_sec + 20 * 60; + clock_gettime(CLOCK_MONOTONIC, &tp); + expire_time = tp.tv_sec + 20 * 60; tryagain: if (rtmsg(RTM_GET) < 0) { -- cgit v1.1 From 92646cacc6dce04db13c04ea2f6e943f5242ca41 Mon Sep 17 00:00:00 2001 From: kevlo Date: Mon, 6 Dec 2010 10:24:06 +0000 Subject: Fix double ;; --- libexec/mknetid/parse_group.c | 2 +- sys/arm/at91/at91_pmc.c | 2 +- sys/dev/bwn/if_bwn.c | 4 ++-- sys/dev/mps/mps.c | 2 +- sys/dev/siba/siba_bwn.c | 2 +- sys/dev/sis/if_sisreg.h | 2 +- sys/mips/mips/mp_machdep.c | 2 +- usr.sbin/ac/ac.c | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libexec/mknetid/parse_group.c b/libexec/mknetid/parse_group.c index b34ee11..84cb991 100644 --- a/libexec/mknetid/parse_group.c +++ b/libexec/mknetid/parse_group.c @@ -126,7 +126,7 @@ grscan(int search, int gid) if (_gr_group.gr_name[0] == '+') continue; if ((_gr_group.gr_passwd = strsep(&bp, ":\n")) == NULL) - break;; + break; if (!(cp = strsep(&bp, ":\n"))) continue; _gr_group.gr_gid = atoi(cp); diff --git a/sys/arm/at91/at91_pmc.c b/sys/arm/at91/at91_pmc.c index 03a7a6e..bbd0ac9 100644 --- a/sys/arm/at91/at91_pmc.c +++ b/sys/arm/at91/at91_pmc.c @@ -325,7 +325,7 @@ at91_pmc_clock_disable(struct at91_pmc_clock *clk) static int at91_pmc_pll_rate(struct at91_pmc_clock *clk, uint32_t reg) { - uint32_t mul, div, freq;; + uint32_t mul, div, freq; freq = clk->parent->hz; div = (reg >> clk->pll_div_shift) & clk->pll_div_mask; diff --git a/sys/dev/bwn/if_bwn.c b/sys/dev/bwn/if_bwn.c index 587b734..b2f72f5 100644 --- a/sys/dev/bwn/if_bwn.c +++ b/sys/dev/bwn/if_bwn.c @@ -2882,7 +2882,7 @@ bwn_set_channel(struct ieee80211com *ic) error = bwn_switch_band(sc, ic->ic_curchan); if (error) - goto fail;; + goto fail; bwn_mac_suspend(mac); bwn_set_txretry(mac, BWN_RETRY_SHORT, BWN_RETRY_LONG); chan = ieee80211_chan2ieee(ic, ic->ic_curchan); @@ -8260,7 +8260,7 @@ bwn_switch_band(struct bwn_softc *sc, struct ieee80211_channel *chan) device_printf(sc->sc_dev, "switching to %s-GHz band\n", IEEE80211_IS_CHAN_2GHZ(chan) ? "2" : "5"); - down_dev = sc->sc_curmac;; + down_dev = sc->sc_curmac; status = down_dev->mac_status; if (status >= BWN_MAC_STATUS_STARTED) bwn_core_stop(down_dev); diff --git a/sys/dev/mps/mps.c b/sys/dev/mps/mps.c index 1fb37e2..61cbaa6 100644 --- a/sys/dev/mps/mps.c +++ b/sys/dev/mps/mps.c @@ -1282,7 +1282,7 @@ mps_dispatch_event(struct mps_softc *sc, uintptr_t data, MPI2_EVENT_NOTIFICATION_REPLY *reply) { struct mps_event_handle *eh; - int event, handled = 0;; + int event, handled = 0; event = reply->Event; TAILQ_FOREACH(eh, &sc->event_list, eh_list) { diff --git a/sys/dev/siba/siba_bwn.c b/sys/dev/siba/siba_bwn.c index b335484..1e0ba0d 100644 --- a/sys/dev/siba/siba_bwn.c +++ b/sys/dev/siba/siba_bwn.c @@ -326,7 +326,7 @@ static int siba_bwn_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) { struct siba_dev_softc *sd; - struct siba_softc *siba;; + struct siba_softc *siba; sd = device_get_ivars(child); siba = sd->sd_bus; diff --git a/sys/dev/sis/if_sisreg.h b/sys/dev/sis/if_sisreg.h index 28d4390..058d9e7 100644 --- a/sys/dev/sis/if_sisreg.h +++ b/sys/dev/sis/if_sisreg.h @@ -497,7 +497,7 @@ struct sis_softc { int sis_tx_prod; int sis_tx_cons; int sis_tx_cnt; - int sis_rx_cons;; + int sis_rx_cons; bus_addr_t sis_rx_paddr; bus_addr_t sis_tx_paddr; struct callout sis_stat_ch; diff --git a/sys/mips/mips/mp_machdep.c b/sys/mips/mips/mp_machdep.c index 2b993cb..41de5fb 100644 --- a/sys/mips/mips/mp_machdep.c +++ b/sys/mips/mips/mp_machdep.c @@ -164,7 +164,7 @@ mips_ipi_handler(void *arg) break; case IPI_HARDCLOCK: CTR1(KTR_SMP, "%s: IPI_HARDCLOCK", __func__); - hardclockintr();; + hardclockintr(); break; default: panic("Unknown IPI 0x%0x on cpu %d", ipi, curcpu); diff --git a/usr.sbin/ac/ac.c b/usr.sbin/ac/ac.c index c584cd4..5dc8271 100644 --- a/usr.sbin/ac/ac.c +++ b/usr.sbin/ac/ac.c @@ -584,7 +584,7 @@ ac(const char *file) if (!(Flags & AC_W)) usht.ut_tv.tv_sec = time(NULL); else - usht.ut_tv.tv_sec = ut_timecopy;; + usht.ut_tv.tv_sec = ut_timecopy; usht.ut_type = SHUTDOWN_TIME; if (Flags & AC_D) { -- cgit v1.1 From 49fb72e297bb1e730b57e70bcaa86a0b69151b66 Mon Sep 17 00:00:00 2001 From: brucec Date: Mon, 6 Dec 2010 11:37:24 +0000 Subject: Revert r209469: it causes the rest of the function to be bypassed. Reported by: ae --- usr.sbin/boot0cfg/boot0cfg.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/usr.sbin/boot0cfg/boot0cfg.c b/usr.sbin/boot0cfg/boot0cfg.c index fe2c755..cd3bfe2 100644 --- a/usr.sbin/boot0cfg/boot0cfg.c +++ b/usr.sbin/boot0cfg/boot0cfg.c @@ -356,8 +356,6 @@ write_mbr(const char *fname, int flags, u_int8_t *mbr, int mbr_size) if (n != mbr_size) errx(1, "%s: short write", fname); return; - } else { - err(1, "write_mbr: %s", fname); } /* -- cgit v1.1 From e41ab538e48407fa736557b719bbee57f1425175 Mon Sep 17 00:00:00 2001 From: ivoras Date: Mon, 6 Dec 2010 12:18:02 +0000 Subject: Use GEOM stripesize field when calculating ashift. This will enable correct alignment on drives with large sector sizes (e.g. 4 KiB) but the implementation might need to be revisited if devices with large stripesizes appear (e.g. if RAID controllers or flash drives start using the field), probably by introducing a physsectorsize field in GEOM providers. Discussed with: mav, mostly silence on freebsd-geom@ and freebsd-fs@ --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c index d0d5137..36550a5 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c @@ -496,7 +496,10 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) /* * Determine the device's minimum transfer size. */ - *ashift = highbit(MAX(pp->sectorsize, SPA_MINBLOCKSIZE)) - 1; + if (pp->stripesize > pp->sectorsize) + *ashift = highbit(MIN(pp->stripesize, SPA_MAXBLOCKSIZE)) - 1; + else + *ashift = highbit(MAX(pp->sectorsize, SPA_MINBLOCKSIZE)) - 1; /* * Clear the nowritecache bit, so that on a vdev_reopen() we will -- cgit v1.1 From fdaa38b44c6a347f4aba9f7c6324649fcfe3b135 Mon Sep 17 00:00:00 2001 From: kib Date: Mon, 6 Dec 2010 15:15:27 +0000 Subject: Do not leak %rdx value in the previous image to the new image after execve(2). Note that ia32 binaries already handle this properly, since ia32_setregs() resets td_retval[1], but not exec_setregs(). We still do not conform to the amd64 ABI specification, since %rsp on the image startup is not aligned to 16 bytes. PR: amd64/124134 Discussed with: Petr Salinger (who convinced me that there is indeed several bugs) MFC after: 1 week --- sys/amd64/amd64/machdep.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 584473d..1cc9a4a 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -876,6 +876,7 @@ exec_setregs(struct thread *td, struct image_params *imgp, u_long stack) regs->tf_fs = _ufssel; regs->tf_gs = _ugssel; regs->tf_flags = TF_HASSEGS; + td->td_retval[1] = 0; /* * Reset the hardware debug registers if they were in use. -- cgit v1.1 From 621c1b35621db940786d14932f1a8227114b3fc7 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 6 Dec 2010 15:19:03 +0000 Subject: Add a manpage for SYSINIT() and SYSUNINIT(). PR: docs/132884 Submitted by: pluknet, hmp --- share/man/man9/Makefile | 2 + share/man/man9/SYSINIT.9 | 163 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 share/man/man9/SYSINIT.9 diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index d757682..663466f 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -244,6 +244,7 @@ MAN= accept_filter.9 \ sysctl.9 \ sysctl_add_oid.9 \ sysctl_ctx_init.9 \ + SYSINIT.9 \ taskqueue.9 \ thread_exit.9 \ time.9 \ @@ -1211,6 +1212,7 @@ MLINKS+=sysctl_ctx_init.9 sysctl_ctx_entry_add.9 \ sysctl_ctx_init.9 sysctl_ctx_entry_del.9 \ sysctl_ctx_init.9 sysctl_ctx_entry_find.9 \ sysctl_ctx_init.9 sysctl_ctx_free.9 +MLINKS+=SYSINIT.9 SYSUNINIT.9 MLINKS+=taskqueue.9 TASK_INIT.9 \ taskqueue.9 taskqueue_cancel.9 \ taskqueue.9 taskqueue_create.9 \ diff --git a/share/man/man9/SYSINIT.9 b/share/man/man9/SYSINIT.9 new file mode 100644 index 0000000..9140dd8 --- /dev/null +++ b/share/man/man9/SYSINIT.9 @@ -0,0 +1,163 @@ +.\" Copyright (c) 2003 Hiten M. Pandya +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd December 1, 2010 +.Dt SYSINIT 9 +.Os +.Sh NAME +.Nm SYSINIT , +.Nm SYSUNINIT +.Nd a framework for dynamic kernel initialization +.Sh SYNOPSIS +.In sys/param.h +.In sys/kernel.h +.Fn SYSINIT "uniquifier" "enum sysinit_sub_id subsystem" "enum sysinit_elem_order order" "sysinit_cfunc_t func" "const void *ident" +.Fn SYSUNINIT "uniquifier" "enum sysinit_sub_id subsystem" "enum sysinit_elem_order order" "sysinit_cfunc_t func" "const void *ident" +.Sh DESCRIPTION +.Nm +is a mechanism for scheduling the execution of initialization and teardown +routines. +This is similar to init and fini routines with the addition of explicit +ordering metadata. +It allows runtime ordering of subsystem initialization in the kernel as well +as kernel modules (KLDs). +.Pp +The +.Fn SYSINIT +macro creates a +.Vt struct sysinit +and stores it in a startup linker set. +The +.Vt struct sysinit +type as well as the subsystem identifier constants +.Pq Dv SI_SUB_* +and initialization ordering constants +.Pq Dv SI_ORDER_* +are defined in +.In sys/kernel.h : +.Bd -literal +struct sysinit { + enum sysinit_sub_id subsystem; /* subsystem identifier*/ + enum sysinit_elem_order order; /* init order within subsystem*/ + sysinit_cfunc_t func; /* function */ + const void *udata; /* multiplexer/argument */ +}; +.Ed +.Pp +The +.Fn SYSINIT +macro takes a +.Fa uniquifier +argument to identify the particular function dispatch data, +the +.Fa subsystem +type of startup interface, the subsystem element +.Fa order +of initialization within the subsystem, the +.Fa func +function to call, +and the data specified in +.Fa ident +argument to pass the function. +.Pp +The +.Fn SYSUNINIT +macro behaves similarly to the +.Fn SYSINIT +macro except that it adds the data to a shutdown linker set. +.Pp +The startup linker set for the kernel is scanned during boot to build a +sorted list of initialization routines. +The initialization routines are then executed in the sorted order. +The +.Fa subsystem +is used as the primary key and is sorted in ascending order. +The +.Fa order +is used as the secondary key and is sorted in ascending order. +The relative order of two routines that have the same +.Fa subsystem +and +.Fa order +is undefined. +.Pp +The startup linker sets for modules that are loaded together with the kernel +by the boot loader are scanned during the +.Dv SI_SUB_KLD +subsystem initialization. +These modules' initialization routines are sorted and merged into the kernel's +list of startup routines and are executed during boot along with the kernel's +initialization routines. +Note that this has the effect that any initialization routines in a kernel +module that are scheduled earlier than +.Dv SI_SUB_KLD +are not executed until after +.Dv SI_SUB_KLD +during boot. +.Pp +The startup linker set for a kernel module loaded at runtime via +.Xr kldload 2 +is scanned, sorted, and executed when the module is loaded. +.Pp +The shutdown linker set for a kernel module is scanned, sorted, and executed +when a kernel module is unloaded. +The teardown routines are sorted in the reverse order of the initialization +routines. +The teardown routines of the kernel and any loaded modules are +.Sy not +executed during shutdown. +.Sh EXAMPLES +This example shows the SYSINIT which displays the copyright notice during boot: +.Bd -literal -offset indent +static void +print_caddr_t(void *data) +{ + printf("%s", (char *)data); +} +SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, + copyright); +.Ed +.Sh SEE ALSO +.Xr kld 4 , +.Xr DECLARE_MODULE 9 , +.Xr DEV_MODULE 9 , +.Xr DRIVER_MODULE 9 , +.Xr MTX_SYSINIT 9 , +.Xr SYSCALL_MODULE 9 +.Sh HISTORY +The +.Nm +framework first appeared in +.Fx 2.2 . +.Sh AUTHORS +.An -nosplit +The +.Nm +framework was written by +.An Terrence Lambert Aq terry@FreeBSD.org . +.Pp +This manual page was written by +.An Hiten Pandya Aq hmp@FreeBSD.org . -- cgit v1.1 From 690f1210e99f96254a903db8fa8240e91955f2a6 Mon Sep 17 00:00:00 2001 From: trasz Date: Mon, 6 Dec 2010 16:39:18 +0000 Subject: Improve readability by factoring out the !RFPROC case. While here, turn K&R function definitions into ANSI. No functional changes. Reviewed by: kib@ --- sys/kern/kern_fork.c | 116 +++++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 59 deletions(-) diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 126c668..7d080c2 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -97,9 +97,7 @@ struct fork_args { /* ARGSUSED */ int -fork(td, uap) - struct thread *td; - struct fork_args *uap; +fork(struct thread *td, struct fork_args *uap) { int error; struct proc *p2; @@ -135,9 +133,7 @@ vfork(td, uap) } int -rfork(td, uap) - struct thread *td; - struct rfork_args *uap; +rfork(struct thread *td, struct rfork_args *uap) { struct proc *p2; int error; @@ -197,12 +193,57 @@ sysctl_kern_randompid(SYSCTL_HANDLER_ARGS) SYSCTL_PROC(_kern, OID_AUTO, randompid, CTLTYPE_INT|CTLFLAG_RW, 0, 0, sysctl_kern_randompid, "I", "Random PID modulus"); +static int +fork_norfproc(struct thread *td, int flags, struct proc **procp) +{ + int error; + struct proc *p1; + + p1 = td->td_proc; + + if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) && + (flags & (RFCFDG | RFFDG))) { + PROC_LOCK(p1); + if (thread_single(SINGLE_BOUNDARY)) { + PROC_UNLOCK(p1); + return (ERESTART); + } + PROC_UNLOCK(p1); + } + + error = vm_forkproc(td, NULL, NULL, NULL, flags); + if (error) + goto fail; + + /* + * Close all file descriptors. + */ + if (flags & RFCFDG) { + struct filedesc *fdtmp; + fdtmp = fdinit(td->td_proc->p_fd); + fdfree(td); + p1->p_fd = fdtmp; + } + + /* + * Unshare file descriptors (from parent). + */ + if (flags & RFFDG) + fdunshare(p1, td); + +fail: + if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) && + (flags & (RFCFDG | RFFDG))) { + PROC_LOCK(p1); + thread_single_end(); + PROC_UNLOCK(p1); + } + *procp = NULL; + return (error); +} + int -fork1(td, flags, pages, procp) - struct thread *td; - int flags; - int pages; - struct proc **procp; +fork1(struct thread *td, int flags, int pages, struct proc **procp) { struct proc *p1, *p2, *pptr; struct proc *newproc; @@ -227,47 +268,8 @@ fork1(td, flags, pages, procp) * Here we don't create a new process, but we divorce * certain parts of a process from itself. */ - if ((flags & RFPROC) == 0) { - if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) && - (flags & (RFCFDG | RFFDG))) { - PROC_LOCK(p1); - if (thread_single(SINGLE_BOUNDARY)) { - PROC_UNLOCK(p1); - return (ERESTART); - } - PROC_UNLOCK(p1); - } - - error = vm_forkproc(td, NULL, NULL, NULL, flags); - if (error) - goto norfproc_fail; - - /* - * Close all file descriptors. - */ - if (flags & RFCFDG) { - struct filedesc *fdtmp; - fdtmp = fdinit(td->td_proc->p_fd); - fdfree(td); - p1->p_fd = fdtmp; - } - - /* - * Unshare file descriptors (from parent). - */ - if (flags & RFFDG) - fdunshare(p1, td); - -norfproc_fail: - if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) && - (flags & (RFCFDG | RFFDG))) { - PROC_LOCK(p1); - thread_single_end(); - PROC_UNLOCK(p1); - } - *procp = NULL; - return (error); - } + if ((flags & RFPROC) == 0) + return (fork_norfproc(td, flags, procp)); /* * XXX @@ -798,10 +800,8 @@ fail1: * is called from the MD fork_trampoline() entry point. */ void -fork_exit(callout, arg, frame) - void (*callout)(void *, struct trapframe *); - void *arg; - struct trapframe *frame; +fork_exit(void (*callout)(void *, struct trapframe *), void *arg, + struct trapframe *frame) { struct proc *p; struct thread *td; @@ -855,9 +855,7 @@ fork_exit(callout, arg, frame) * first parameter and is called when returning to a new userland process. */ void -fork_return(td, frame) - struct thread *td; - struct trapframe *frame; +fork_return(struct thread *td, struct trapframe *frame) { userret(td, frame); -- cgit v1.1 From 0a2fe19d79630ac3f3b6b9741e2d6569a6feaa90 Mon Sep 17 00:00:00 2001 From: trasz Date: Mon, 6 Dec 2010 16:45:36 +0000 Subject: Fix style bug introduced by previous commit. --- sys/kern/kern_fork.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 7d080c2..e4b7378 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -233,7 +233,7 @@ fork_norfproc(struct thread *td, int flags, struct proc **procp) fail: if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) && - (flags & (RFCFDG | RFFDG))) { + (flags & (RFCFDG | RFFDG))) { PROC_LOCK(p1); thread_single_end(); PROC_UNLOCK(p1); -- cgit v1.1 From 6f75fc3cc25018370d65fcd1aa98666c736b3e68 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 6 Dec 2010 17:02:56 +0000 Subject: When masking direct and processor devices during an inquiry, properly preserve the upper bits of the first data byte. While here, shorten a few nearby lines. PR: kern/152768 Reported by: Sascha Wildner saw of online.de Reviewed by: scottl MFC after: 1 week --- sys/dev/mfi/mfi_cam.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/dev/mfi/mfi_cam.c b/sys/dev/mfi/mfi_cam.c index fe1ffe5..5137c36 100644 --- a/sys/dev/mfi/mfi_cam.c +++ b/sys/dev/mfi/mfi_cam.c @@ -340,14 +340,14 @@ mfip_done(struct mfi_command *cm) ccbh->status = CAM_REQ_CMP; csio->scsi_status = pt->header.scsi_status; if (ccbh->flags & CAM_CDB_POINTER) - command = ccb->csio.cdb_io.cdb_ptr[0]; + command = csio->cdb_io.cdb_ptr[0]; else - command = ccb->csio.cdb_io.cdb_bytes[0]; + command = csio->cdb_io.cdb_bytes[0]; if (command == INQUIRY) { - device = ccb->csio.data_ptr[0] & 0x1f; + device = csio->data_ptr[0] & 0x1f; if ((device == T_DIRECT) || (device == T_PROCESSOR)) csio->data_ptr[0] = - (device & 0xe0) | T_NODEVICE; + (csio->data_ptr[0] & 0xe0) | T_NODEVICE; } break; } -- cgit v1.1 From 7305ca595952d5837102e6741fcb92791566434f Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 6 Dec 2010 17:06:21 +0000 Subject: When masking direct and processor devices during an inquiry, properly preserve the upper bits of the first data byte. Reviewed by: scottl MFC after: 1 week --- sys/dev/aac/aac_cam.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/dev/aac/aac_cam.c b/sys/dev/aac/aac_cam.c index 44f4e19..130cd20 100644 --- a/sys/dev/aac/aac_cam.c +++ b/sys/dev/aac/aac_cam.c @@ -587,7 +587,8 @@ aac_cam_complete(struct aac_command *cm) (device == T_PROCESSOR) || (sc->flags & AAC_FLAGS_CAM_PASSONLY)) ccb->csio.data_ptr[0] = - ((device & 0xe0) | T_NODEVICE); + ((ccb->csio.data_ptr[0] & 0xe0) | + T_NODEVICE); } else if (ccb->ccb_h.status == CAM_SEL_TIMEOUT && ccb->ccb_h.target_lun != 0) { /* fix for INQUIRYs on Lun>0 */ -- cgit v1.1 From 80d6042924d0209b35eeab9c93b06b3d8bb44c35 Mon Sep 17 00:00:00 2001 From: bschmidt Date: Mon, 6 Dec 2010 18:28:39 +0000 Subject: Fixes for monitor mode: - Do not call iwn_calib_reset() for monitor mode. We do not want to query information and do runtime calibration while in monitor mode. Poking the firmware with adjustments for calibration results in firmware asserts. This could happened on RUN -> RUN transition only. - Adjust blink rate for monitor mode. It's supposed to not freak out and turn off after a while. - While here, remove one useless assignment of calib.state, it gets overwritten later in the function. Submitted by: Brandon Gooch MFC after: 1 week --- sys/dev/iwn/if_iwn.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index 6dff9da..a59d8fd 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -1983,7 +1983,8 @@ iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) /* * RUN -> RUN transition; Just restart the timers. */ - if (vap->iv_state == IEEE80211_S_RUN) { + if (vap->iv_state == IEEE80211_S_RUN && + vap->iv_opmode != IEEE80211_M_MONITOR) { iwn_calib_reset(sc); break; } @@ -4851,11 +4852,9 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) struct iwn_node_info node; int error; - sc->calib.state = IWN_CALIB_STATE_INIT; - if (ic->ic_opmode == IEEE80211_M_MONITOR) { /* Link LED blinks while monitoring. */ - iwn_set_led(sc, IWN_LED_LINK, 5, 5); + iwn_set_led(sc, IWN_LED_LINK, 20, 20); return 0; } error = iwn_set_timing(sc, ni); -- cgit v1.1 From 1620fca5f4940c286bfd68e28578b6e9f6ef2977 Mon Sep 17 00:00:00 2001 From: bschmidt Date: Mon, 6 Dec 2010 19:05:44 +0000 Subject: Fix scanning after loosing a connection. The firmware assumes that as long as an association ID is set any scan is supposed to be a background scan. This implies that the firmware will switch back to the associated channel after a certain threshold, though, we are not notified about that. We currently catch this case by a timer which will reset the firmware after a 'scan timeout', though, upper layers are not notified about that and will simply hang until manual intervention. Fix this by resetting the firmware's knowledge about any association on RUN -> ASSOC and !INIT -> SCAN transitions. Tested by: Zhihao Yuan MFC after: 1 week --- sys/dev/wpi/if_wpi.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c index f6edc91..72d5910 100644 --- a/sys/dev/wpi/if_wpi.c +++ b/sys/dev/wpi/if_wpi.c @@ -1248,8 +1248,25 @@ wpi_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) IEEE80211_UNLOCK(ic); WPI_LOCK(sc); - if (nstate == IEEE80211_S_AUTH) { - /* The node must be registered in the firmware before auth */ + if (nstate == IEEE80211_S_SCAN && vap->iv_state != IEEE80211_S_INIT) { + /* + * On !INIT -> SCAN transitions, we need to clear any possible + * knowledge about associations. + */ + error = wpi_config(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: device config failed, error %d\n", + __func__, error); + } + } + if (nstate == IEEE80211_S_AUTH || + (nstate == IEEE80211_S_ASSOC && vap->iv_state == IEEE80211_S_RUN)) { + /* + * The node must be registered in the firmware before auth. + * Also the associd must be cleared on RUN -> ASSOC + * transitions. + */ error = wpi_auth(sc, vap); if (error != 0) { device_printf(sc->sc_dev, -- cgit v1.1 From e166421f4d8c003c78e787275ce850f880bbfc62 Mon Sep 17 00:00:00 2001 From: uqs Date: Mon, 6 Dec 2010 19:12:51 +0000 Subject: Drop advertising clause in manpages. It was done a long time ago for the source code. Discussed with: core --- games/bcd/bcd.6 | 6 +----- games/caesar/caesar.6 | 6 +----- games/caesar/rot13.sh | 8 ++------ games/factor/factor.6 | 6 +----- games/morse/morse.6 | 6 +----- games/number/number.6 | 6 +----- games/pom/pom.6 | 6 +----- games/random/random.6 | 6 +----- 8 files changed, 9 insertions(+), 41 deletions(-) diff --git a/games/bcd/bcd.6 b/games/bcd/bcd.6 index dc64317..e9343fe 100644 --- a/games/bcd/bcd.6 +++ b/games/bcd/bcd.6 @@ -9,11 +9,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/games/caesar/caesar.6 b/games/caesar/caesar.6 index 28ffe86..91e9af8 100644 --- a/games/caesar/caesar.6 +++ b/games/caesar/caesar.6 @@ -9,11 +9,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/games/caesar/rot13.sh b/games/caesar/rot13.sh index 1b88b63..853205b 100644 --- a/games/caesar/rot13.sh +++ b/games/caesar/rot13.sh @@ -11,11 +11,7 @@ # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by the University of -# California, Berkeley and its contributors. -# 4. Neither the name of the University nor the names of its contributors +# 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # @@ -32,6 +28,6 @@ # SUCH DAMAGE. # # @(#)rot13.sh 8.1 (Berkeley) 5/31/93 -# +# $FreeBSD$ exec /usr/games/caesar 13 "$@" diff --git a/games/factor/factor.6 b/games/factor/factor.6 index 07fc7b9..a4d35e9 100644 --- a/games/factor/factor.6 +++ b/games/factor/factor.6 @@ -12,11 +12,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/games/morse/morse.6 b/games/morse/morse.6 index f26d9db..f0d30d7 100644 --- a/games/morse/morse.6 +++ b/games/morse/morse.6 @@ -10,11 +10,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/games/number/number.6 b/games/number/number.6 index eb7892d..a8be9ff 100644 --- a/games/number/number.6 +++ b/games/number/number.6 @@ -9,11 +9,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/games/pom/pom.6 b/games/pom/pom.6 index 8634928..bb89436 100644 --- a/games/pom/pom.6 +++ b/games/pom/pom.6 @@ -9,11 +9,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/games/random/random.6 b/games/random/random.6 index 33a3511..5481576 100644 --- a/games/random/random.6 +++ b/games/random/random.6 @@ -9,11 +9,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgment: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" -- cgit v1.1 From 1d758da82069bb1c888419a3f4d7c9cb75112b6c Mon Sep 17 00:00:00 2001 From: trasz Date: Mon, 6 Dec 2010 19:15:38 +0000 Subject: Add a KASSERT to make it obvious when fork_norfproc() is to be called, and set *procp to NULL in all cases. Previously, it was not being set in the ERESTART case. This is effectively no-op, since its value is ignored by callers in the error case. Reviewed by: kib@ --- sys/kern/kern_fork.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index e4b7378..19d7d0f 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -199,7 +199,10 @@ fork_norfproc(struct thread *td, int flags, struct proc **procp) int error; struct proc *p1; + KASSERT((flags & RFPROC) == 0, + ("fork_norfproc called with RFPROC set")); p1 = td->td_proc; + *procp = NULL; if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) && (flags & (RFCFDG | RFFDG))) { @@ -238,7 +241,6 @@ fail: thread_single_end(); PROC_UNLOCK(p1); } - *procp = NULL; return (error); } -- cgit v1.1 From a78f502d16b3bff370840e3acc8a0e659f17bb24 Mon Sep 17 00:00:00 2001 From: cperciva Date: Mon, 6 Dec 2010 20:40:15 +0000 Subject: Set correct maximum I/O length. We can only handle I/O of up to max_request_segments * PAGE_SIZE if the I/O is page-aligned; the largest I/O we can guarantee will work is PAGE_SIZE less than that. This unbreaks 'diskinfo -t'. --- sys/dev/xen/blkfront/blkfront.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c index 8ff8757..2e08bb1 100644 --- a/sys/dev/xen/blkfront/blkfront.c +++ b/sys/dev/xen/blkfront/blkfront.c @@ -508,7 +508,7 @@ blkfront_initialize(struct xb_softc *sc) sc->ring_pages = 1; sc->max_requests = BLKIF_MAX_RING_REQUESTS(PAGE_SIZE); sc->max_request_segments = BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK; - sc->max_request_size = sc->max_request_segments * PAGE_SIZE; + sc->max_request_size = (sc->max_request_segments - 1) * PAGE_SIZE; sc->max_request_blocks = BLKIF_SEGS_TO_BLOCKS(sc->max_request_segments); /* -- cgit v1.1 From bd1f37ab1768b85d2f93d751b7151a2f4103c154 Mon Sep 17 00:00:00 2001 From: bschmidt Date: Mon, 6 Dec 2010 20:54:53 +0000 Subject: Implement NdisGetRoutineAddress and MmGetSystemRoutineAddress used in newer Ralink drivers. Submitted by: Paul B Mahol --- sys/compat/ndis/kern_ndis.c | 13 +++++++++++++ sys/compat/ndis/ndis_var.h | 1 + sys/compat/ndis/ntoskrnl_var.h | 1 + sys/compat/ndis/subr_ndis.c | 13 +++++++++++++ sys/compat/ndis/subr_ntoskrnl.c | 12 ++++++++++++ 5 files changed, 40 insertions(+) diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c index 321125b..302573a 100644 --- a/sys/compat/ndis/kern_ndis.c +++ b/sys/compat/ndis/kern_ndis.c @@ -433,6 +433,19 @@ ndis_flush_sysctls(arg) return (0); } +void * +ndis_get_routine_address(functbl, name) + struct image_patch_table *functbl; + char *name; +{ + int i; + + for (i = 0; functbl[i].ipt_name != NULL; i++) + if (strcmp(name, functbl[i].ipt_name) == 0) + return (functbl[i].ipt_wrap); + return (NULL); +} + static void ndis_return(dobj, arg) device_object *dobj; diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h index a66a1d7..2692e54 100644 --- a/sys/compat/ndis/ndis_var.h +++ b/sys/compat/ndis/ndis_var.h @@ -1729,6 +1729,7 @@ extern int ndis_mtop(struct mbuf *, ndis_packet **); extern int ndis_ptom(struct mbuf **, ndis_packet *); extern int ndis_get_info(void *, ndis_oid, void *, int *); extern int ndis_set_info(void *, ndis_oid, void *, int *); +extern void *ndis_get_routine_address(struct image_patch_table *, char *); extern int ndis_get_supported_oids(void *, ndis_oid **, int *); extern int ndis_send_packets(void *, ndis_packet **, int); extern int ndis_send_packet(void *, ndis_packet *); diff --git a/sys/compat/ndis/ntoskrnl_var.h b/sys/compat/ndis/ntoskrnl_var.h index 84c2a7f..2642626 100644 --- a/sys/compat/ndis/ntoskrnl_var.h +++ b/sys/compat/ndis/ntoskrnl_var.h @@ -1466,6 +1466,7 @@ extern uint32_t IoConnectInterrupt(kinterrupt **, void *, void *, kspin_lock *, uint32_t, uint8_t, uint8_t, uint8_t, uint8_t, uint32_t, uint8_t); extern uint8_t MmIsAddressValid(void *); +extern void *MmGetSystemRoutineAddress(unicode_string *); extern void *MmMapIoSpace(uint64_t, uint32_t, uint32_t); extern void MmUnmapIoSpace(void *, size_t); extern void MmBuildMdlForNonPagedPool(mdl *); diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index a5caa88..4bdb6ef 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -197,6 +197,7 @@ static ndis_status NdisMMapIoSpace(void **, ndis_handle, ndis_physaddr, uint32_t); static void NdisMUnmapIoSpace(ndis_handle, void *, uint32_t); static uint32_t NdisGetCacheFillSize(void); +static void *NdisGetRoutineAddress(unicode_string *); static uint32_t NdisMGetDmaAlignment(ndis_handle); static ndis_status NdisMInitializeScatterGatherDma(ndis_handle, uint8_t, uint32_t); @@ -1642,6 +1643,17 @@ NdisGetCacheFillSize(void) return (128); } +static void * +NdisGetRoutineAddress(ustr) + unicode_string *ustr; +{ + ansi_string astr; + + if (RtlUnicodeStringToAnsiString(&astr, ustr, TRUE)) + return (NULL); + return (ndis_get_routine_address(ndis_functbl, astr.as_buf)); +} + static uint32_t NdisMGetDmaAlignment(handle) ndis_handle handle; @@ -3246,6 +3258,7 @@ image_patch_table ndis_functbl[] = { IMPORT_SFUNC(NdisInitializeString, 2), IMPORT_SFUNC(NdisFreeString, 1), IMPORT_SFUNC(NdisGetCurrentSystemTime, 1), + IMPORT_SFUNC(NdisGetRoutineAddress, 1), IMPORT_SFUNC(NdisGetSystemUpTime, 1), IMPORT_SFUNC(NdisGetVersion, 0), IMPORT_SFUNC(NdisMSynchronizeWithInterrupt, 3), diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index c523f8b..17016e0 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -2589,6 +2589,17 @@ MmGetPhysicalAddress(void *base) return (pmap_extract(kernel_map->pmap, (vm_offset_t)base)); } +void * +MmGetSystemRoutineAddress(ustr) + unicode_string *ustr; +{ + ansi_string astr; + + if (RtlUnicodeStringToAnsiString(&astr, ustr, TRUE)) + return (NULL); + return (ndis_get_routine_address(ntoskrnl_functbl, astr.as_buf)); +} + uint8_t MmIsAddressValid(vaddr) void *vaddr; @@ -4382,6 +4393,7 @@ image_patch_table ntoskrnl_functbl[] = { IMPORT_SFUNC(MmUnmapLockedPages, 2), IMPORT_SFUNC(MmBuildMdlForNonPagedPool, 1), IMPORT_SFUNC(MmGetPhysicalAddress, 1), + IMPORT_SFUNC(MmGetSystemRoutineAddress, 1), IMPORT_SFUNC(MmIsAddressValid, 1), IMPORT_SFUNC(MmMapIoSpace, 3 + 1), IMPORT_SFUNC(MmUnmapIoSpace, 2), -- cgit v1.1 From f84e526334bd13cc3772b0d7dbb15aa5b4da51e3 Mon Sep 17 00:00:00 2001 From: brucec Date: Mon, 6 Dec 2010 20:55:14 +0000 Subject: Ignore any failures with the "local" distribution since it's not present on release CDs and so will normally fail. installCommit() returns a DITEM_ value, not a Boolean. distExtractAll() returns a Boolean, not a DITEM_ value. Reported by: kensmith MFC after: 3 days --- usr.sbin/sysinstall/dist.c | 5 ++++- usr.sbin/sysinstall/install.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/usr.sbin/sysinstall/dist.c b/usr.sbin/sysinstall/dist.c index 716a054..8ef8544 100644 --- a/usr.sbin/sysinstall/dist.c +++ b/usr.sbin/sysinstall/dist.c @@ -757,6 +757,9 @@ distExtract(char *parent, Distribution *me) canceled = 1; status = FALSE; + } else { + // ignore any failures with DIST_LOCAL + status = TRUE; } } break; @@ -913,7 +916,7 @@ distExtractAll(dialogMenuItem *self) restorescr(w); if (extract_status == FALSE) - status = DITEM_FAILURE; + status = FALSE; return status; } diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c index db347e2..daacaa6 100644 --- a/usr.sbin/sysinstall/install.c +++ b/usr.sbin/sysinstall/install.c @@ -855,7 +855,7 @@ try_media: i = distExtractAll(self); if (i == FALSE) - return FALSE; + return DITEM_FAILURE; /* When running as init, *now* it's safe to grab the rc.foo vars */ installEnvironment(); -- cgit v1.1 From 83a1280f2b061e260e6471843e4c35fd3ce60c1a Mon Sep 17 00:00:00 2001 From: jilles Date: Mon, 6 Dec 2010 23:49:27 +0000 Subject: sh: Improve internal-representation-to-text code to avoid binary output. The code to translate the internal representation to text did not know about various additions to the internal representation since the original ash and therefore wrote binary stuff to the terminal. The code is used in the jobs command and similar output. Note that the output is far from complete and mostly serves for recognition purposes. --- bin/sh/jobs.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index a761f28..de813c2 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -1314,13 +1314,46 @@ cmdputs(const char *s) if (--cmdnleft > 0) *q++ = '{'; subtype = *p++; + if ((subtype & VSTYPE) == VSLENGTH && --cmdnleft > 0) + *q++ = '#'; } else if (c == '=' && subtype != 0) { - *q++ = "}-+?="[(subtype & VSTYPE) - VSNORMAL]; + *q = "}-+?=##%%\0X"[(subtype & VSTYPE) - VSNORMAL]; + if (*q) + q++; + else + cmdnleft++; + if (((subtype & VSTYPE) == VSTRIMLEFTMAX || + (subtype & VSTYPE) == VSTRIMRIGHTMAX) && + --cmdnleft > 0) + *q = q[-1], q++; subtype = 0; } else if (c == CTLENDVAR) { *q++ = '}'; - } else if (c == CTLBACKQ || c == CTLBACKQ+CTLQUOTE) - cmdnleft++; /* ignore it */ + } else if (c == CTLBACKQ || c == CTLBACKQ+CTLQUOTE) { + cmdnleft -= 5; + if (cmdnleft > 0) { + *q++ = '$'; + *q++ = '('; + *q++ = '.'; + *q++ = '.'; + *q++ = '.'; + *q++ = ')'; + } + } else if (c == CTLARI) { + cmdnleft -= 2; + if (cmdnleft > 0) { + *q++ = '$'; + *q++ = '('; + *q++ = '('; + } + p++; + } else if (c == CTLENDARI) { + if (--cmdnleft > 0) { + *q++ = ')'; + *q++ = ')'; + } + } else if (c == CTLQUOTEMARK || c == CTLQUOTEEND) + cmdnleft++; /* ignore */ else *q++ = c; if (--cmdnleft <= 0) { -- cgit v1.1 From 35838fd0b5f2afbb914ec70c567255b68a6f1a89 Mon Sep 17 00:00:00 2001 From: das Date: Tue, 7 Dec 2010 02:19:15 +0000 Subject: Fix various nits in style and comments that were pointed out by bde. Code changes verified with md5. --- lib/msun/man/math.3 | 7 +++---- lib/msun/src/e_log2.c | 8 ++++---- lib/msun/src/e_log2f.c | 8 ++++++-- lib/msun/src/k_logf.h | 6 +++--- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/msun/man/math.3 b/lib/msun/man/math.3 index 8e79ce5..39aa8ab 100644 --- a/lib/msun/man/math.3 +++ b/lib/msun/man/math.3 @@ -195,7 +195,7 @@ yn Bessel function of the second kind of the order n .El .Pp The routines -in this section may not produce a result that is correctly rounded, +in this section might not produce a result that is correctly rounded, so reproducible results cannot be guaranteed across platforms. For most of these functions, however, incorrect rounding occurs rarely, and then only in very-close-to-halfway cases. @@ -231,9 +231,8 @@ Many of the routines to compute transcendental functions produce inaccurate results in other than the default rounding mode. .Pp On the i386 platform, trigonometric argument reduction is not -performed accurately for very large arguments, resulting in errors -greater than 1 -.Em ulp +performed accurately for huge arguments, resulting in +large errors for such arguments to .Fn cos , .Fn sin , diff --git a/lib/msun/src/e_log2.c b/lib/msun/src/e_log2.c index 8a729d5..6cf3dbc 100644 --- a/lib/msun/src/e_log2.c +++ b/lib/msun/src/e_log2.c @@ -14,8 +14,8 @@ #include __FBSDID("$FreeBSD$"); -/* log2(x) - * Return the base 2 logarithm of x. +/* + * Return the base 2 logarithm of x. See k_log.c for details on the algorithm. */ #include "math.h" @@ -24,8 +24,8 @@ __FBSDID("$FreeBSD$"); static const double two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ -ivln2hi = 0x1.71547652000p+0, -ivln2lo = 0x1.705fc2eefa2p-33; +ivln2hi = 1.44269504072144627571e+00, /* 0x3ff71547, 0x65200000 */ +ivln2lo = 1.67517131648865118353e-10; /* 0x3de705fc, 0x2eefa200 */ static const double zero = 0.0; diff --git a/lib/msun/src/e_log2f.c b/lib/msun/src/e_log2f.c index 6b2b966..7f1963b 100644 --- a/lib/msun/src/e_log2f.c +++ b/lib/msun/src/e_log2f.c @@ -12,14 +12,18 @@ #include __FBSDID("$FreeBSD$"); +/* + * Return the base 2 logarithm of x. See k_log.c for details on the algorithm. + */ + #include "math.h" #include "math_private.h" #include "k_logf.h" static const float two25 = 3.3554432000e+07, /* 0x4c000000 */ -ivln2hi = 0x1.716p+0f, -ivln2lo = -0x1.7135a8fa03d11p-13; +ivln2hi = 1.4428710938e+00, /* 0x3fb8b000 */ +ivln2lo = -1.7605285393e-04; /* 0xb9389ad4 */ static const float zero = 0.0; diff --git a/lib/msun/src/k_logf.h b/lib/msun/src/k_logf.h index d11a563..d9f0f3d 100644 --- a/lib/msun/src/k_logf.h +++ b/lib/msun/src/k_logf.h @@ -12,8 +12,8 @@ #include __FBSDID("$FreeBSD$"); -/* __kernel_logf(x) - * Return log(x) - (x-1) for x in ~[sqrt(2)/2, sqrt(2)]. +/* + * float version of __kernel_log(x). See k_log.c for details. */ static const float @@ -33,7 +33,7 @@ __kernel_logf(float x) f = x-(float)1.0; if((0x007fffff&(0x8000+ix))<0xc000) { /* -2**-9 <= f < 2**-9 */ - if(f==0.0) return 0.0; + if(f==0.0f) return 0.0f; return f*f*((float)0.33333333333333333*f-(float)0.5); } s = f/((float)2.0+f); -- cgit v1.1 From a75fb4f20bed1222d48bb5ad12404479aadaad35 Mon Sep 17 00:00:00 2001 From: das Date: Tue, 7 Dec 2010 03:29:36 +0000 Subject: Another minor nit: Make sure the constant here is a float so the compiler doesn't promote the entire expression to double. --- lib/msun/src/e_log2f.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/msun/src/e_log2f.c b/lib/msun/src/e_log2f.c index 7f1963b..bb308d3 100644 --- a/lib/msun/src/e_log2f.c +++ b/lib/msun/src/e_log2f.c @@ -50,7 +50,7 @@ __ieee754_log2f(float x) SET_FLOAT_WORD(x,hx|(i^0x3f800000)); /* normalize x or x/2 */ k += (i>>23); f = __kernel_logf(x); - x = x - 1; + x = x - (float)1.0; GET_FLOAT_WORD(hx,x); SET_FLOAT_WORD(hi,hx&0xfffff000); lo = x - hi; -- cgit v1.1 From 7b4239469b3f3ef3a4e1b7e86dea9441dce1257f Mon Sep 17 00:00:00 2001 From: hselasky Date: Tue, 7 Dec 2010 08:20:20 +0000 Subject: Re-add a status check which sneaked out during r214804. This change can fix some USB error messages showing up during bootup. MFC after: 3 days Approved by: thompsa (mentor) --- sys/dev/usb/usb_request.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c index 60767388..293c4bf 100644 --- a/sys/dev/usb/usb_request.c +++ b/sys/dev/usb/usb_request.c @@ -793,6 +793,10 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port) if (err) { goto done; } + /* if the device disappeared, just give up */ + if (!(UGETW(ps.wPortStatus) & UPS_CURRENT_CONNECT_STATUS)) { + goto done; + } /* check if reset is complete */ if (UGETW(ps.wPortChange) & UPS_C_PORT_RESET) { break; -- cgit v1.1 From dad6f05965f5a9514b74be303115283773607b77 Mon Sep 17 00:00:00 2001 From: avg Date: Tue, 7 Dec 2010 09:03:17 +0000 Subject: dtrace_gethrtime_init: pin to master while examining other CPUs Also use pc_cpumask to be future-friendly. Reviewed by: jhb MFC after: 2 weeks --- sys/cddl/dev/dtrace/amd64/dtrace_subr.c | 9 +++++---- sys/cddl/dev/dtrace/i386/dtrace_subr.c | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c index b4c7eaf..3b32cef 100644 --- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c @@ -405,6 +405,7 @@ dtrace_gethrtime_init_cpu(void *arg) static void dtrace_gethrtime_init(void *arg) { + struct pcpu *pc; uint64_t tsc_f; cpumask_t map; int i; @@ -437,15 +438,14 @@ dtrace_gethrtime_init(void *arg) nsec_scale = ((uint64_t)NANOSEC << SCALE_SHIFT) / tsc_f; /* The current CPU is the reference one. */ + sched_pin(); tsc_skew[curcpu] = 0; - CPU_FOREACH(i) { if (i == curcpu) continue; - map = 0; - map |= (1 << curcpu); - map |= (1 << i); + pc = pcpu_find(i); + map = PCPU_GET(cpumask) | pc->pc_cpumask; smp_rendezvous_cpus(map, dtrace_gethrtime_init_sync, dtrace_gethrtime_init_cpu, @@ -453,6 +453,7 @@ dtrace_gethrtime_init(void *arg) tsc_skew[i] = tgt_cpu_tsc - hst_cpu_tsc; } + sched_unpin(); } SYSINIT(dtrace_gethrtime_init, SI_SUB_SMP, SI_ORDER_ANY, dtrace_gethrtime_init, NULL); diff --git a/sys/cddl/dev/dtrace/i386/dtrace_subr.c b/sys/cddl/dev/dtrace/i386/dtrace_subr.c index 9d85873..8ac833b 100644 --- a/sys/cddl/dev/dtrace/i386/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/i386/dtrace_subr.c @@ -405,6 +405,7 @@ dtrace_gethrtime_init_cpu(void *arg) static void dtrace_gethrtime_init(void *arg) { + struct pcpu *pc; uint64_t tsc_f; cpumask_t map; int i; @@ -437,15 +438,14 @@ dtrace_gethrtime_init(void *arg) nsec_scale = ((uint64_t)NANOSEC << SCALE_SHIFT) / tsc_f; /* The current CPU is the reference one. */ + sched_pin(); tsc_skew[curcpu] = 0; - CPU_FOREACH(i) { if (i == curcpu) continue; - map = 0; - map |= (1 << curcpu); - map |= (1 << i); + pc = pcpu_find(i); + map = PCPU_GET(cpumask) | pc->pc_cpumask; smp_rendezvous_cpus(map, dtrace_gethrtime_init_sync, dtrace_gethrtime_init_cpu, @@ -453,6 +453,7 @@ dtrace_gethrtime_init(void *arg) tsc_skew[i] = tgt_cpu_tsc - hst_cpu_tsc; } + sched_unpin(); } SYSINIT(dtrace_gethrtime_init, SI_SUB_SMP, SI_ORDER_ANY, dtrace_gethrtime_init, NULL); -- cgit v1.1 From 1bf1cfe9bd971989e311cbdcfddcb91379cff088 Mon Sep 17 00:00:00 2001 From: avg Date: Tue, 7 Dec 2010 09:19:47 +0000 Subject: dtrace_xcall: no need for special handling of curcpu smp_rendezvous_cpus alreadt does the right thing in a very similar fashion, so the code was kind of duplicating that. MFC after: 3 weeks --- sys/cddl/dev/dtrace/amd64/dtrace_subr.c | 19 +++---------------- sys/cddl/dev/dtrace/i386/dtrace_subr.c | 19 +++---------------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c index 3b32cef..f86f535 100644 --- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c @@ -115,26 +115,13 @@ dtrace_xcall(processorid_t cpu, dtrace_xcall_t func, void *arg) { cpumask_t cpus; - critical_enter(); - if (cpu == DTRACE_CPUALL) cpus = all_cpus; else - cpus = (cpumask_t) (1 << cpu); - - /* If the current CPU is in the set, call the function directly: */ - if ((cpus & (1 << curcpu)) != 0) { - (*func)(arg); - - /* Mask the current CPU from the set */ - cpus &= ~(1 << curcpu); - } - - /* If there are any CPUs in the set, cross-call to those CPUs */ - if (cpus != 0) - smp_rendezvous_cpus(cpus, NULL, func, smp_no_rendevous_barrier, arg); + cpus = (cpumask_t)1 << cpu; - critical_exit(); + smp_rendezvous_cpus(cpus, smp_no_rendevous_barrier, func, + smp_no_rendevous_barrier, arg); } static void diff --git a/sys/cddl/dev/dtrace/i386/dtrace_subr.c b/sys/cddl/dev/dtrace/i386/dtrace_subr.c index 8ac833b..be23808 100644 --- a/sys/cddl/dev/dtrace/i386/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/i386/dtrace_subr.c @@ -115,26 +115,13 @@ dtrace_xcall(processorid_t cpu, dtrace_xcall_t func, void *arg) { cpumask_t cpus; - critical_enter(); - if (cpu == DTRACE_CPUALL) cpus = all_cpus; else - cpus = (cpumask_t) (1 << cpu); - - /* If the current CPU is in the set, call the function directly: */ - if ((cpus & (1 << curcpu)) != 0) { - (*func)(arg); - - /* Mask the current CPU from the set */ - cpus &= ~(1 << curcpu); - } - - /* If there are any CPUs in the set, cross-call to those CPUs */ - if (cpus != 0) - smp_rendezvous_cpus(cpus, NULL, func, smp_no_rendevous_barrier, arg); + cpus = (cpumask_t)1 << cpu; - critical_exit(); + smp_rendezvous_cpus(cpus, smp_no_rendevous_barrier, func, + smp_no_rendevous_barrier, arg); } static void -- cgit v1.1 From c652724d35aa333da55977e70fee1869b5526767 Mon Sep 17 00:00:00 2001 From: avg Date: Tue, 7 Dec 2010 12:04:06 +0000 Subject: opensolaris cyclic xcall: no need for special handling of curcpu smp_rendezvous_cpus already properly handles current CPU case and non-SMP case. MFC after: 3 weeks --- sys/cddl/dev/cyclic/i386/cyclic_machdep.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/sys/cddl/dev/cyclic/i386/cyclic_machdep.c b/sys/cddl/dev/cyclic/i386/cyclic_machdep.c index 0b6ab59..1d0864a 100644 --- a/sys/cddl/dev/cyclic/i386/cyclic_machdep.c +++ b/sys/cddl/dev/cyclic/i386/cyclic_machdep.c @@ -121,13 +121,7 @@ static void reprogram(cyb_arg_t arg, hrtime_t exp) static void xcall(cyb_arg_t arg, cpu_t *c, cyc_func_t func, void *param) { - /* - * If the target CPU is the current one, just call the - * function. This covers the non-SMP case. - */ - if (c == &solaris_cpu[curcpu]) - (*func)(param); - else - smp_rendezvous_cpus((cpumask_t) (1 << c->cpuid), NULL, - func, smp_no_rendevous_barrier, param); + + smp_rendezvous_cpus((cpumask_t) (1 << c->cpuid), NULL, + func, smp_no_rendevous_barrier, param); } -- cgit v1.1 From b27fb358388190ef7a664fe27a340d45238b96a5 Mon Sep 17 00:00:00 2001 From: kib Date: Tue, 7 Dec 2010 12:17:43 +0000 Subject: Retire write-only PCB_FULLCTX pcb flag on amd64. Reminded by: Petr Salinger Tested by: pho MFC after: 1 week --- sys/amd64/amd64/exception.S | 1 - sys/amd64/amd64/genassym.c | 1 - sys/amd64/amd64/machdep.c | 3 --- sys/amd64/amd64/vm_machdep.c | 1 - sys/amd64/ia32/ia32_signal.c | 3 +-- sys/amd64/include/pcb.h | 1 - sys/amd64/linux32/linux32_sysvec.c | 2 +- 7 files changed, 2 insertions(+), 10 deletions(-) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 37e89a00..7ffa7a9 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -380,7 +380,6 @@ IDTVEC(fast_syscall) movq %rsp,%rdi call syscall movq PCPU(CURPCB),%rax - andq $~PCB_FULLCTX,PCB_FLAGS(%rax) MEXITCOUNT jmp doreti diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c index 613bce5..bc30174 100644 --- a/sys/amd64/amd64/genassym.c +++ b/sys/amd64/amd64/genassym.c @@ -161,7 +161,6 @@ ASSYM(PCB_SIZE, sizeof(struct pcb)); ASSYM(PCB_DBREGS, PCB_DBREGS); ASSYM(PCB_32BIT, PCB_32BIT); ASSYM(PCB_GS32BIT, PCB_GS32BIT); -ASSYM(PCB_FULLCTX, PCB_FULLCTX); ASSYM(COMMON_TSS_RSP0, offsetof(struct amd64tss, tss_rsp0)); diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 1cc9a4a..d09ae4a 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -492,7 +492,6 @@ sigreturn(td, uap) #endif kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); - td->td_pcb->pcb_flags |= PCB_FULLCTX; td->td_pcb->pcb_full_iret = 1; return (EJUSTRETURN); } @@ -1908,7 +1907,6 @@ set_regs(struct thread *td, struct reg *regs) tp->tf_gs = regs->r_gs; tp->tf_flags = TF_HASSEGS; } - td->td_pcb->pcb_flags |= PCB_FULLCTX; return (0); } @@ -2095,7 +2093,6 @@ set_mcontext(struct thread *td, const mcontext_t *mcp) td->td_pcb->pcb_fsbase = mcp->mc_fsbase; td->td_pcb->pcb_gsbase = mcp->mc_gsbase; } - td->td_pcb->pcb_flags |= PCB_FULLCTX; td->td_pcb->pcb_full_iret = 1; return (0); } diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c index dafd376..2a93bc1 100644 --- a/sys/amd64/amd64/vm_machdep.c +++ b/sys/amd64/amd64/vm_machdep.c @@ -347,7 +347,6 @@ cpu_set_syscall_retval(struct thread *td, int error) */ td->td_frame->tf_rip -= td->td_frame->tf_err; td->td_frame->tf_r10 = td->td_frame->tf_rcx; - td->td_pcb->pcb_flags |= PCB_FULLCTX; break; case EJUSTRETURN: diff --git a/sys/amd64/ia32/ia32_signal.c b/sys/amd64/ia32/ia32_signal.c index aefe9f0..e0f30e2 100644 --- a/sys/amd64/ia32/ia32_signal.c +++ b/sys/amd64/ia32/ia32_signal.c @@ -207,7 +207,6 @@ ia32_set_mcontext(struct thread *td, const struct ia32_mcontext *mcp) tp->tf_rflags = rflags; tp->tf_rsp = mcp->mc_esp; tp->tf_ss = mcp->mc_ss; - td->td_pcb->pcb_flags |= PCB_FULLCTX; td->td_pcb->pcb_full_iret = 1; return (0); } @@ -743,7 +742,7 @@ ia32_setregs(struct thread *td, struct image_params *imgp, u_long stack) fpstate_drop(td); /* Return via doreti so that we can change to a different %cs */ - pcb->pcb_flags |= PCB_FULLCTX | PCB_32BIT; + pcb->pcb_flags |= PCB_32BIT; pcb->pcb_flags &= ~PCB_GS32BIT; td->td_pcb->pcb_full_iret = 1; td->td_retval[1] = 0; diff --git a/sys/amd64/include/pcb.h b/sys/amd64/include/pcb.h index 1f4ff22..e226379 100644 --- a/sys/amd64/include/pcb.h +++ b/sys/amd64/include/pcb.h @@ -73,7 +73,6 @@ struct pcb { #define PCB_USERFPUINITDONE 0x10 /* fpu user state is initialized */ #define PCB_GS32BIT 0x20 /* linux gs switch */ #define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */ -#define PCB_FULLCTX 0x80 /* full context restore on sysret */ uint16_t pcb_initial_fpucw; diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c index f8719c4..0dbcef4 100644 --- a/sys/amd64/linux32/linux32_sysvec.c +++ b/sys/amd64/linux32/linux32_sysvec.c @@ -870,7 +870,7 @@ exec_linux_setregs(struct thread *td, struct image_params *imgp, u_long stack) fpstate_drop(td); /* Return via doreti so that we can change to a different %cs */ - pcb->pcb_flags |= PCB_FULLCTX | PCB_32BIT; + pcb->pcb_flags |= PCB_32BIT; pcb->pcb_flags &= ~PCB_GS32BIT; td->td_retval[1] = 0; } -- cgit v1.1 From 8e959769425068c451d277df30a2fa8546698671 Mon Sep 17 00:00:00 2001 From: avg Date: Tue, 7 Dec 2010 12:25:26 +0000 Subject: opensolaris cyclic: fix deadlock and make a little bit closer to upstream The dealock was caused in the following way: - thread T1 on CPU C1 holds a spin mutex, IPIs CPU C2 and waits for the IPI to be handled - C2 executes timer interrupt filter, thus has interrupts disabled, and gets blocked on the spin mutex held by T1 The problem seems to have been introduced by simplifications made to OpenSolaris code during porting. The problem is fixed by reorganizing the code to more closely resemble the upstream version. Interrupt filter (cyclic_fire) now doesn't acquire any locks, all per-CPU data accesses are performed on a target CPU with preemption and interrupts disabled thus precluding concurrent access to the data. cyp_mtx spin mutex is used to disable preemtion and interrupts; it's not used for classical mutual exclusion, because xcall already serializes calls to a CPU. It's an emulation of OpenSolaris cyb_set_level(CY_HIGH_LEVEL) call, the spin mutexes could probably be reduced to just a spinlock_enter()/_exit() pair. Diff with upstream version is now reduced by ~500 lines, however it still remains quite large - many things that are not needed (at the moment) or are irrelevant on FreeBSD were simply ripped out during porting. Examples of such things: - support for CPU onlining/offlining - support for suspend/resume - support for running callouts at soft interrupt levels - support for callout rebinding from CPU to CPU - support for CPU partitions Tested by: Artem Belevich MFC after: 3 weeks X-MFC with: r216252 --- sys/cddl/compat/opensolaris/sys/cyclic_impl.h | 9 +- sys/cddl/dev/cyclic/cyclic.c | 339 +++++++++++++------------- 2 files changed, 172 insertions(+), 176 deletions(-) diff --git a/sys/cddl/compat/opensolaris/sys/cyclic_impl.h b/sys/cddl/compat/opensolaris/sys/cyclic_impl.h index a195251..57bb167 100644 --- a/sys/cddl/compat/opensolaris/sys/cyclic_impl.h +++ b/sys/cddl/compat/opensolaris/sys/cyclic_impl.h @@ -288,7 +288,14 @@ typedef struct cyc_id { typedef struct cyc_xcallarg { cyc_cpu_t *cyx_cpu; - hrtime_t cyx_exp; + cyc_handler_t *cyx_hdlr; + cyc_time_t *cyx_when; + cyc_index_t cyx_ndx; + cyc_index_t *cyx_heap; + cyclic_t *cyx_cyclics; + cyc_index_t cyx_size; + uint16_t cyx_flags; + int cyx_wait; } cyc_xcallarg_t; #define CY_DEFAULT_PERCPU 1 diff --git a/sys/cddl/dev/cyclic/cyclic.c b/sys/cddl/dev/cyclic/cyclic.c index df0de6b..b9a6979 100644 --- a/sys/cddl/dev/cyclic/cyclic.c +++ b/sys/cddl/dev/cyclic/cyclic.c @@ -473,73 +473,6 @@ cyclic_expire(cyc_cpu_t *cpu, cyc_index_t ndx, cyclic_t *cyclic) (*handler)(arg); } -static void -cyclic_enable_xcall(void *v) -{ - cyc_xcallarg_t *argp = v; - cyc_cpu_t *cpu = argp->cyx_cpu; - cyc_backend_t *be = cpu->cyp_backend; - - be->cyb_enable(be->cyb_arg); -} - -static void -cyclic_enable(cyc_cpu_t *cpu) -{ - cyc_backend_t *be = cpu->cyp_backend; - cyc_xcallarg_t arg; - - arg.cyx_cpu = cpu; - - /* Cross call to the target CPU */ - be->cyb_xcall(be->cyb_arg, cpu->cyp_cpu, cyclic_enable_xcall, &arg); -} - -static void -cyclic_disable_xcall(void *v) -{ - cyc_xcallarg_t *argp = v; - cyc_cpu_t *cpu = argp->cyx_cpu; - cyc_backend_t *be = cpu->cyp_backend; - - be->cyb_disable(be->cyb_arg); -} - -static void -cyclic_disable(cyc_cpu_t *cpu) -{ - cyc_backend_t *be = cpu->cyp_backend; - cyc_xcallarg_t arg; - - arg.cyx_cpu = cpu; - - /* Cross call to the target CPU */ - be->cyb_xcall(be->cyb_arg, cpu->cyp_cpu, cyclic_disable_xcall, &arg); -} - -static void -cyclic_reprogram_xcall(void *v) -{ - cyc_xcallarg_t *argp = v; - cyc_cpu_t *cpu = argp->cyx_cpu; - cyc_backend_t *be = cpu->cyp_backend; - - be->cyb_reprogram(be->cyb_arg, argp->cyx_exp); -} - -static void -cyclic_reprogram(cyc_cpu_t *cpu, hrtime_t exp) -{ - cyc_backend_t *be = cpu->cyp_backend; - cyc_xcallarg_t arg; - - arg.cyx_cpu = cpu; - arg.cyx_exp = exp; - - /* Cross call to the target CPU */ - be->cyb_xcall(be->cyb_arg, cpu->cyp_cpu, cyclic_reprogram_xcall, &arg); -} - /* * cyclic_fire(cpu_t *) * @@ -570,17 +503,15 @@ static void cyclic_fire(cpu_t *c) { cyc_cpu_t *cpu = c->cpu_cyclic; - - mtx_lock_spin(&cpu->cyp_mtx); - + cyc_backend_t *be = cpu->cyp_backend; cyc_index_t *heap = cpu->cyp_heap; cyclic_t *cyclic, *cyclics = cpu->cyp_cyclics; + void *arg = be->cyb_arg; hrtime_t now = gethrtime(); hrtime_t exp; if (cpu->cyp_nelems == 0) { /* This is a spurious fire. */ - mtx_unlock_spin(&cpu->cyp_mtx); return; } @@ -631,8 +562,45 @@ cyclic_fire(cpu_t *c) * Now we have a cyclic in the root slot which isn't in the past; * reprogram the interrupt source. */ - cyclic_reprogram(cpu, exp); + be->cyb_reprogram(arg, exp); +} + +static void +cyclic_expand_xcall(cyc_xcallarg_t *arg) +{ + cyc_cpu_t *cpu = arg->cyx_cpu; + cyc_index_t new_size = arg->cyx_size, size = cpu->cyp_size, i; + cyc_index_t *new_heap = arg->cyx_heap; + cyclic_t *cyclics = cpu->cyp_cyclics, *new_cyclics = arg->cyx_cyclics; + + /* Disable preemption and interrupts. */ + mtx_lock_spin(&cpu->cyp_mtx); + + /* + * Assert that the new size is a power of 2. + */ + ASSERT((new_size & (new_size - 1)) == 0); + ASSERT(new_size == (size << 1)); + ASSERT(cpu->cyp_heap != NULL && cpu->cyp_cyclics != NULL); + + bcopy(cpu->cyp_heap, new_heap, sizeof (cyc_index_t) * size); + bcopy(cyclics, new_cyclics, sizeof (cyclic_t) * size); + + /* + * Set up the free list, and set all of the new cyclics to be CYF_FREE. + */ + for (i = size; i < new_size; i++) { + new_heap[i] = i; + new_cyclics[i].cy_flags = CYF_FREE; + } + /* + * We can go ahead and plow the value of cyp_heap and cyp_cyclics; + * cyclic_expand() has kept a copy. + */ + cpu->cyp_heap = new_heap; + cpu->cyp_cyclics = new_cyclics; + cpu->cyp_size = new_size; mtx_unlock_spin(&cpu->cyp_mtx); } @@ -643,102 +611,70 @@ cyclic_fire(cpu_t *c) static void cyclic_expand(cyc_cpu_t *cpu) { - cyc_index_t new_size, old_size, i; + cyc_index_t new_size, old_size; cyc_index_t *new_heap, *old_heap; cyclic_t *new_cyclics, *old_cyclics; + cyc_xcallarg_t arg; + cyc_backend_t *be = cpu->cyp_backend; ASSERT(MUTEX_HELD(&cpu_lock)); - if ((new_size = ((old_size = cpu->cyp_size) << 1)) == 0) + old_heap = cpu->cyp_heap; + old_cyclics = cpu->cyp_cyclics; + + if ((new_size = ((old_size = cpu->cyp_size) << 1)) == 0) { new_size = CY_DEFAULT_PERCPU; + ASSERT(old_heap == NULL && old_cyclics == NULL); + } /* * Check that the new_size is a power of 2. */ ASSERT(((new_size - 1) & new_size) == 0); - /* Unlock the mutex while allocating memory so we can wait... */ - mtx_unlock_spin(&cpu->cyp_mtx); - new_heap = malloc(sizeof(cyc_index_t) * new_size, M_CYCLIC, M_WAITOK); new_cyclics = malloc(sizeof(cyclic_t) * new_size, M_CYCLIC, M_ZERO | M_WAITOK); - /* Grab the lock again now we've got the memory... */ - mtx_lock_spin(&cpu->cyp_mtx); - - /* Check if another thread beat us while the mutex was unlocked. */ - if (old_size != cpu->cyp_size) { - /* Oh well, he won. */ - mtx_unlock_spin(&cpu->cyp_mtx); - - free(new_heap, M_CYCLIC); - free(new_cyclics, M_CYCLIC); - - mtx_lock_spin(&cpu->cyp_mtx); - return; - } - - old_heap = cpu->cyp_heap; - old_cyclics = cpu->cyp_cyclics; - - bcopy(cpu->cyp_heap, new_heap, sizeof (cyc_index_t) * old_size); - bcopy(old_cyclics, new_cyclics, sizeof (cyclic_t) * old_size); - - /* - * Set up the free list, and set all of the new cyclics to be CYF_FREE. - */ - for (i = old_size; i < new_size; i++) { - new_heap[i] = i; - new_cyclics[i].cy_flags = CYF_FREE; - } + arg.cyx_cpu = cpu; + arg.cyx_heap = new_heap; + arg.cyx_cyclics = new_cyclics; + arg.cyx_size = new_size; - /* - * We can go ahead and plow the value of cyp_heap and cyp_cyclics; - * cyclic_expand() has kept a copy. - */ - cpu->cyp_heap = new_heap; - cpu->cyp_cyclics = new_cyclics; - cpu->cyp_size = new_size; + be->cyb_xcall(be->cyb_arg, cpu->cyp_cpu, + (cyc_func_t)cyclic_expand_xcall, &arg); if (old_cyclics != NULL) { ASSERT(old_heap != NULL); ASSERT(old_size != 0); - mtx_unlock_spin(&cpu->cyp_mtx); - free(old_cyclics, M_CYCLIC); free(old_heap, M_CYCLIC); - - mtx_lock_spin(&cpu->cyp_mtx); } } -static cyc_index_t -cyclic_add_here(cyc_cpu_t *cpu, cyc_handler_t *hdlr, - cyc_time_t *when, uint16_t flags) +static void +cyclic_add_xcall(cyc_xcallarg_t *arg) { + cyc_cpu_t *cpu = arg->cyx_cpu; + cyc_handler_t *hdlr = arg->cyx_hdlr; + cyc_time_t *when = arg->cyx_when; + cyc_backend_t *be = cpu->cyp_backend; cyc_index_t ndx, nelems; + cyb_arg_t bar = be->cyb_arg; cyclic_t *cyclic; - ASSERT(MUTEX_HELD(&cpu_lock)); - - mtx_lock_spin(&cpu->cyp_mtx); - - ASSERT(!(cpu->cyp_cpu->cpu_flags & CPU_OFFLINE)); - ASSERT(when->cyt_when >= 0 && when->cyt_interval > 0); - - while (cpu->cyp_nelems == cpu->cyp_size) - cyclic_expand(cpu); - ASSERT(cpu->cyp_nelems < cpu->cyp_size); + /* Disable preemption and interrupts. */ + mtx_lock_spin(&cpu->cyp_mtx); nelems = cpu->cyp_nelems++; - if (nelems == 0) + if (nelems == 0) { /* * If this is the first element, we need to enable the * backend on this CPU. */ - cyclic_enable(cpu); + be->cyb_enable(bar); + } ndx = cpu->cyp_heap[nelems]; cyclic = &cpu->cyp_cyclics[ndx]; @@ -746,14 +682,20 @@ cyclic_add_here(cyc_cpu_t *cpu, cyc_handler_t *hdlr, ASSERT(cyclic->cy_flags == CYF_FREE); cyclic->cy_interval = when->cyt_interval; - if (when->cyt_when == 0) - cyclic->cy_expire = gethrtime() + cyclic->cy_interval; - else + if (when->cyt_when == 0) { + /* + * If a start time hasn't been explicitly specified, we'll + * start on the next interval boundary. + */ + cyclic->cy_expire = (gethrtime() / cyclic->cy_interval + 1) * + cyclic->cy_interval; + } else { cyclic->cy_expire = when->cyt_when; + } cyclic->cy_handler = hdlr->cyh_func; cyclic->cy_arg = hdlr->cyh_arg; - cyclic->cy_flags = flags; + cyclic->cy_flags = arg->cyx_flags; if (cyclic_upheap(cpu, nelems)) { hrtime_t exp = cyclic->cy_expire; @@ -762,31 +704,63 @@ cyclic_add_here(cyc_cpu_t *cpu, cyc_handler_t *hdlr, * If our upheap propagated to the root, we need to * reprogram the interrupt source. */ - cyclic_reprogram(cpu, exp); + be->cyb_reprogram(bar, exp); } - mtx_unlock_spin(&cpu->cyp_mtx); - return (ndx); + arg->cyx_ndx = ndx; } - -static int -cyclic_remove_here(cyc_cpu_t *cpu, cyc_index_t ndx, cyc_time_t *when, int wait) +static cyc_index_t +cyclic_add_here(cyc_cpu_t *cpu, cyc_handler_t *hdlr, + cyc_time_t *when, uint16_t flags) { - cyc_index_t nelems, i; - cyclic_t *cyclic; - cyc_index_t *heap, last; + cyc_backend_t *be = cpu->cyp_backend; + cyb_arg_t bar = be->cyb_arg; + cyc_xcallarg_t arg; ASSERT(MUTEX_HELD(&cpu_lock)); - ASSERT(wait == CY_WAIT || wait == CY_NOWAIT); + ASSERT(!(cpu->cyp_cpu->cpu_flags & CPU_OFFLINE)); + ASSERT(when->cyt_when >= 0 && when->cyt_interval > 0); - mtx_lock_spin(&cpu->cyp_mtx); + if (cpu->cyp_nelems == cpu->cyp_size) { + /* + * This is expensive; it will cross call onto the other + * CPU to perform the expansion. + */ + cyclic_expand(cpu); + ASSERT(cpu->cyp_nelems < cpu->cyp_size); + } - heap = cpu->cyp_heap; + /* + * By now, we know that we're going to be able to successfully + * perform the add. Now cross call over to the CPU of interest to + * actually add our cyclic. + */ + arg.cyx_cpu = cpu; + arg.cyx_hdlr = hdlr; + arg.cyx_when = when; + arg.cyx_flags = flags; + + be->cyb_xcall(bar, cpu->cyp_cpu, (cyc_func_t)cyclic_add_xcall, &arg); + + return (arg.cyx_ndx); +} + +static void +cyclic_remove_xcall(cyc_xcallarg_t *arg) +{ + cyc_cpu_t *cpu = arg->cyx_cpu; + cyc_backend_t *be = cpu->cyp_backend; + cyb_arg_t bar = be->cyb_arg; + cyc_index_t ndx = arg->cyx_ndx, nelems = cpu->cyp_nelems, i; + cyc_index_t *heap = cpu->cyp_heap, last; + cyclic_t *cyclic; - nelems = cpu->cyp_nelems; + ASSERT(nelems > 0); + /* Disable preemption and interrupts. */ + mtx_lock_spin(&cpu->cyp_mtx); cyclic = &cpu->cyp_cyclics[ndx]; /* @@ -794,11 +768,17 @@ cyclic_remove_here(cyc_cpu_t *cpu, cyc_index_t ndx, cyc_time_t *when, int wait) * removed as part of a juggling operation, the expiration time * will be used when the cyclic is added to the new CPU. */ - if (when != NULL) { - when->cyt_when = cyclic->cy_expire; - when->cyt_interval = cyclic->cy_interval; + if (arg->cyx_when != NULL) { + arg->cyx_when->cyt_when = cyclic->cy_expire; + arg->cyx_when->cyt_interval = cyclic->cy_interval; } + /* + * Now set the flags to CYF_FREE. We don't need a membar_enter() + * between zeroing pend and setting the flags because we're at + * CY_HIGH_LEVEL (that is, the zeroing of pend and the setting + * of cy_flags appear atomic to softints). + */ cyclic->cy_flags = CYF_FREE; for (i = 0; i < nelems; i++) { @@ -811,19 +791,21 @@ cyclic_remove_here(cyc_cpu_t *cpu, cyc_index_t ndx, cyc_time_t *when, int wait) cpu->cyp_nelems = --nelems; - if (nelems == 0) + if (nelems == 0) { /* * If we just removed the last element, then we need to * disable the backend on this CPU. */ - cyclic_disable(cpu); + be->cyb_disable(bar); + } - if (i == nelems) + if (i == nelems) { /* * If we just removed the last element of the heap, then * we don't have to downheap. */ - goto done; + goto out; + } /* * Swap the last element of the heap with the one we want to @@ -833,17 +815,18 @@ cyclic_remove_here(cyc_cpu_t *cpu, cyc_index_t ndx, cyc_time_t *when, int wait) heap[i] = (last = heap[nelems]); heap[nelems] = ndx; - if (i == 0) + if (i == 0) { cyclic_downheap(cpu, 0); - else { + } else { if (cyclic_upheap(cpu, i) == 0) { /* * The upheap didn't propagate to the root; if it * didn't propagate at all, we need to downheap. */ - if (heap[i] == last) + if (heap[i] == last) { cyclic_downheap(cpu, i); - goto done; + } + goto out; } } @@ -854,10 +837,27 @@ cyclic_remove_here(cyc_cpu_t *cpu, cyc_index_t ndx, cyc_time_t *when, int wait) cyclic = &cpu->cyp_cyclics[heap[0]]; ASSERT(nelems != 0); - cyclic_reprogram(cpu, cyclic->cy_expire); - -done: + be->cyb_reprogram(bar, cyclic->cy_expire); +out: mtx_unlock_spin(&cpu->cyp_mtx); +} + +static int +cyclic_remove_here(cyc_cpu_t *cpu, cyc_index_t ndx, cyc_time_t *when, int wait) +{ + cyc_backend_t *be = cpu->cyp_backend; + cyc_xcallarg_t arg; + + ASSERT(MUTEX_HELD(&cpu_lock)); + ASSERT(wait == CY_WAIT || wait == CY_NOWAIT); + + arg.cyx_ndx = ndx; + arg.cyx_cpu = cpu; + arg.cyx_when = when; + arg.cyx_wait = wait; + + be->cyb_xcall(be->cyb_arg, cpu->cyp_cpu, + (cyc_func_t)cyclic_remove_xcall, &arg); return (1); } @@ -1214,15 +1214,10 @@ cyclic_add_omni(cyc_omni_handler_t *omni) idp->cyi_omni_hdlr = *omni; - for (i = 0; i < MAXCPU; i++) { - if (pcpu_find(i) == NULL) - continue; - + CPU_FOREACH(i) { c = &solaris_cpu[i]; - if ((cpu = c->cpu_cyclic) == NULL) continue; - cyclic_omni_start(idp, cpu); } @@ -1325,12 +1320,8 @@ cyclic_mp_init(void) mutex_enter(&cpu_lock); - for (i = 0; i <= mp_maxid; i++) { - if (pcpu_find(i) == NULL) - continue; - + CPU_FOREACH(i) { c = &solaris_cpu[i]; - if (c->cpu_cyclic == NULL) cyclic_configure(c); } @@ -1346,10 +1337,8 @@ cyclic_uninit(void) CPU_FOREACH(id) { c = &solaris_cpu[id]; - if (c->cpu_cyclic == NULL) continue; - cyclic_unconfigure(c); } -- cgit v1.1 From 2c234bfed65d90a8d6c58495d0819be4eaf52fc5 Mon Sep 17 00:00:00 2001 From: kib Date: Tue, 7 Dec 2010 12:44:33 +0000 Subject: Update some comments related to use of amd64 full context switch. In exec_linux_setregs(), use locally cached pointer to pcb to set pcb_full_iret. In set_regs(), note that full return is needed when code that sets segment registers is enabled. MFC after: 1 week --- sys/amd64/amd64/machdep.c | 1 + sys/amd64/amd64/vm_machdep.c | 5 ++--- sys/amd64/linux32/linux32_sysvec.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index d09ae4a..fe4deb7 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -1906,6 +1906,7 @@ set_regs(struct thread *td, struct reg *regs) tp->tf_fs = regs->r_fs; tp->tf_gs = regs->r_gs; tp->tf_flags = TF_HASSEGS; + td->td_pcb->pcb_full_iret = 1; } return (0); } diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c index 2a93bc1..b966393 100644 --- a/sys/amd64/amd64/vm_machdep.c +++ b/sys/amd64/amd64/vm_machdep.c @@ -339,10 +339,9 @@ cpu_set_syscall_retval(struct thread *td, int error) * Reconstruct pc, we know that 'syscall' is 2 bytes, * lcall $X,y is 7 bytes, int 0x80 is 2 bytes. * We saved this in tf_err. - * We have to do a full context restore so that %r10 - * (which was holding the value of %rcx) is restored + * %r10 (which was holding the value of %rcx) is restored * for the next iteration. - * r10 restore is only required for freebsd/amd64 processes, + * %r10 restore is only required for freebsd/amd64 processes, * but shall be innocent for any ia32 ABI. */ td->td_frame->tf_rip -= td->td_frame->tf_err; diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c index 0dbcef4..3ebb980 100644 --- a/sys/amd64/linux32/linux32_sysvec.c +++ b/sys/amd64/linux32/linux32_sysvec.c @@ -865,13 +865,13 @@ exec_linux_setregs(struct thread *td, struct image_params *imgp, u_long stack) regs->tf_flags = TF_HASSEGS; regs->tf_cs = _ucode32sel; regs->tf_rbx = imgp->ps_strings; - td->td_pcb->pcb_full_iret = 1; load_cr0(rcr0() | CR0_MP | CR0_TS); fpstate_drop(td); - /* Return via doreti so that we can change to a different %cs */ + /* Do full restore on return so that we can change to a different %cs */ pcb->pcb_flags |= PCB_32BIT; pcb->pcb_flags &= ~PCB_GS32BIT; + pcb->pcb_full_iret = 1; td->td_retval[1] = 0; } -- cgit v1.1 From 936441dc0734e8fabe90edc75b0a85c0112000ac Mon Sep 17 00:00:00 2001 From: ivoras Date: Tue, 7 Dec 2010 15:24:08 +0000 Subject: Undo r216230: the interaction between saved ashift in metadata and detected ashift does not support this. With this change, pools created while stripesize=512 could not be imported when stripesize becomes larger (on the same drive). Noticed by: pjd --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c index 36550a5..d0d5137 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c @@ -496,10 +496,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) /* * Determine the device's minimum transfer size. */ - if (pp->stripesize > pp->sectorsize) - *ashift = highbit(MIN(pp->stripesize, SPA_MAXBLOCKSIZE)) - 1; - else - *ashift = highbit(MAX(pp->sectorsize, SPA_MINBLOCKSIZE)) - 1; + *ashift = highbit(MAX(pp->sectorsize, SPA_MINBLOCKSIZE)) - 1; /* * Clear the nowritecache bit, so that on a vdev_reopen() we will -- cgit v1.1 From bda3b883cdac9ecfd7bebcd783d32f31cf3c4463 Mon Sep 17 00:00:00 2001 From: phk Date: Tue, 7 Dec 2010 16:30:52 +0000 Subject: Use a "push" strategy to get data through libz, rather than a "pull" strategy. --- usr.sbin/fifolog/lib/fifolog_write.h | 6 +- usr.sbin/fifolog/lib/fifolog_write_poll.c | 290 ++++++++++++++---------------- 2 files changed, 140 insertions(+), 156 deletions(-) diff --git a/usr.sbin/fifolog/lib/fifolog_write.h b/usr.sbin/fifolog/lib/fifolog_write.h index 06b3233..22a307d 100644 --- a/usr.sbin/fifolog/lib/fifolog_write.h +++ b/usr.sbin/fifolog/lib/fifolog_write.h @@ -44,8 +44,6 @@ struct fifolog_writer { unsigned syncrate; unsigned compression; - unsigned writes_since_sync; - int cleanup; intmax_t cnt[FIFOLOG_NPOINT]; @@ -55,9 +53,11 @@ struct fifolog_writer { int flag; time_t last; + u_int obufsize; + u_char *obuf; + u_int ibufsize; u_char *ibuf; - u_char *iptr; time_t starttime; time_t lastwrite; diff --git a/usr.sbin/fifolog/lib/fifolog_write_poll.c b/usr.sbin/fifolog/lib/fifolog_write_poll.c index 4fc5204..abb015b 100644 --- a/usr.sbin/fifolog/lib/fifolog_write_poll.c +++ b/usr.sbin/fifolog/lib/fifolog_write_poll.c @@ -33,6 +33,9 @@ #include #include #include +#if 0 +#include +#endif #include @@ -65,9 +68,8 @@ fifolog_write_assert(const struct fifolog_writer *f) { CHECK_OBJ_NOTNULL(f, FIFOLOG_WRITER_MAGIC); - assert(f->iptr == f->ff->zs->next_in + f->ff->zs->avail_in); assert(f->ff->zs->next_out + f->ff->zs->avail_out == \ - f->ff->recbuf + f->ff->recsize); + f->obuf + f->obufsize); } struct fifolog_writer * @@ -75,8 +77,8 @@ fifolog_write_new(void) { struct fifolog_writer *f; - ALLOC(&f, sizeof *f); - f->magic = FIFOLOG_WRITER_MAGIC; + ALLOC_OBJ(f, FIFOLOG_WRITER_MAGIC); + assert(f != NULL); return (f); } @@ -94,36 +96,11 @@ fifolog_write_close(struct fifolog_writer *f) CHECK_OBJ_NOTNULL(f, FIFOLOG_WRITER_MAGIC); fifolog_int_close(&f->ff); free(f->ff); - if (f->ibuf != NULL) - free(f->ibuf); + if (f->obuf != NULL) + free(f->obuf); free(f); } -static void -fifo_prepobuf(struct fifolog_writer *f, time_t now, int flag) -{ - - memset(f->ff->recbuf, 0, f->ff->recsize); - f->ff->zs->next_out = f->ff->recbuf + 5; - f->ff->zs->avail_out = f->ff->recsize - 5; - if (f->recno == 0 && f->seq == 0) { - srandomdev(); - do { - f->seq = random(); - } while (f->seq == 0); - } - be32enc(f->ff->recbuf, f->seq++); - f->ff->recbuf[4] = f->flag; - f->flag = 0; - if (flag) { - f->ff->recbuf[4] |= FIFOLOG_FLG_SYNC; - be32enc(f->ff->recbuf + 5, (u_int)now); - f->ff->zs->next_out += 4; - f->ff->zs->avail_out -= 4; - } - fifolog_write_assert(f); -} - const char * fifolog_write_open(struct fifolog_writer *f, const char *fn, unsigned writerate, unsigned syncrate, int compression) { @@ -164,144 +141,154 @@ fifolog_write_open(struct fifolog_writer *f, const char *fn, unsigned writerate, f->seq++; } - f->ibufsize = 32768; - ALLOC(&f->ibuf, f->ibufsize); - f->iptr = f->ibuf; - f->ff->zs->next_in = f->iptr; + f->obufsize = f->ff->recsize; + ALLOC(&f->obuf, f->obufsize); + i = deflateInit(f->ff->zs, (int)f->compression); assert(i == Z_OK); f->flag |= FIFOLOG_FLG_RESTART; + f->flag |= FIFOLOG_FLG_SYNC; + f->ff->zs->next_out = f->obuf + 9; + f->ff->zs->avail_out = f->obufsize - 9; time(&now); - fifo_prepobuf(f, now, 1); f->starttime = now; + f->lastsync = now; + f->lastwrite = now; fifolog_write_assert(f); return (NULL); } -static void -fifo_writerec(struct fifolog_writer *f) +static int +fifolog_write_output(struct fifolog_writer *f, int fl, time_t now) { - int i; - time_t t; + long h, l = f->ff->zs->next_out - f->obuf; + int i, w; + + h = 4; /* seq */ + be32enc(f->obuf, f->seq); + f->obuf[h] = f->flag; + h += 1; /* flag */ + if (f->flag & FIFOLOG_FLG_SYNC) { + be32enc(f->obuf + h, now); + h += 4; /* timestamp */ + } - fifolog_write_assert(f); - f->writes_since_sync++; - - assert(f->recno < f->ff->logsize); - f->cnt[FIFOLOG_PT_BYTES_POST] += f->ff->recsize - f->ff->zs->avail_out; - if (f->ff->zs->avail_out == 0) { - /* nothing */ - } else if (f->ff->zs->avail_out <= 255) { - f->ff->recbuf[f->ff->recsize - 1] = - (u_char)f->ff->zs->avail_out; - f->ff->recbuf[4] |= FIFOLOG_FLG_1BYTE; - } else { - be32enc(f->ff->recbuf + f->ff->recsize - 4, - f->ff->zs->avail_out); - f->ff->recbuf[4] |= FIFOLOG_FLG_4BYTE; + assert(l <= (long)f->ff->recsize); + assert(l >= h); + if (l == h) + return (0); + + + if (h + l < (long)f->ff->recsize && fl == Z_NO_FLUSH) + return (0); + + w = f->ff->recsize - l; + if (w > 255) { + be32enc(f->obuf + f->ff->recsize - 4, w); + f->obuf[4] |= FIFOLOG_FLG_4BYTE; + } else if (w > 0) { + f->obuf[f->ff->recsize - 1] = w; + f->obuf[4] |= FIFOLOG_FLG_1BYTE; } - i = pwrite(f->ff->fd, f->ff->recbuf, f->ff->recsize, - (f->recno + 1) * f->ff->recsize); - assert (i == (int)f->ff->recsize); - if (++f->recno == f->ff->logsize) - f->recno = 0; + + f->cnt[FIFOLOG_PT_BYTES_POST] += w; + +#ifdef DBG +fprintf(stderr, "W: fl=%d h=%ld l=%ld w=%d recno=%jd fx %02x\n", + fl, h, l, w, f->recno, f->obuf[4]); +#endif + + i = pwrite(f->ff->fd, f->obuf, f->ff->recsize, + (f->recno + 1) * f->ff->recsize); + assert(i == (int)f->ff->recsize); + f->cnt[FIFOLOG_PT_WRITES]++; - time(&t); - f->cnt[FIFOLOG_PT_RUNTIME] = t - f->starttime; /*lint !e776 */ - fifolog_write_assert(f); + + f->lastwrite = now; + f->seq++; + f->recno++; +#ifdef DBG +if (f->flag) +fprintf(stderr, "SYNC- %d\n", __LINE__); +#endif + f->flag = 0; + + memset(f->obuf, 0, f->obufsize); + f->ff->zs->next_out = f->obuf + 5; + f->ff->zs->avail_out = f->obufsize - 5; + return (1); } -int -fifolog_write_poll(struct fifolog_writer *f, time_t now) +static void +fifolog_write_gzip(struct fifolog_writer *f, const void *p, int len, time_t now, int fin) { - int i, fl, bo, bf; + int i, fl; - if (now == 0) - time(&now); + f->cnt[FIFOLOG_PT_BYTES_PRE] += len; - fifolog_write_assert(f); - if (f->cleanup || now >= (int)(f->lastsync + f->syncrate)) { - /* - * We always check the sync timer, otherwise a flood of data - * would not get any sync records at all - */ + if (fin == 0) + fl = Z_NO_FLUSH; + else if (f->cleanup || now >= (int)(f->lastsync + f->syncrate)) { f->cleanup = 0; fl = Z_FINISH; - f->lastsync = now; - f->lastwrite = now; f->cnt[FIFOLOG_PT_SYNC]++; - } else if (f->ff->zs->avail_in == 0 && - now >= (int)(f->lastwrite + f->writerate)) { - /* - * We only check for writerate timeouts when the input - * buffer is empty. It would be silly to force a write if - * pending input could cause it to happen on its own. - */ + } else if (now >= (int)(f->lastwrite + f->writerate)) { fl = Z_SYNC_FLUSH; - f->lastwrite = now; f->cnt[FIFOLOG_PT_FLUSH]++; - } else if (f->ff->zs->avail_in == 0) - return (0); /* nothing to do */ + } else if (p == NULL) + return; else fl = Z_NO_FLUSH; - for (;;) { - assert(f->ff->zs->avail_out > 0); - - bf = f->ff->zs->avail_out; - + f->ff->zs->avail_in = len; + f->ff->zs->next_in = (void*)(uintptr_t)p; +#ifdef DBG +if (fl != Z_NO_FLUSH) +fprintf(stderr, "Z len %3d fin %d now %ld fl %d ai %u ao %u\n", + len, fin, now, fl, + f->ff->zs->avail_in, + f->ff->zs->avail_out); +#endif + + while (1) { i = deflate(f->ff->zs, fl); - assert (i == Z_OK || i == Z_BUF_ERROR || i == Z_STREAM_END); - bo = f->ff->zs->avail_out; +#ifdef DBG +if (i || f->ff->zs->avail_in) +fprintf(stderr, "fl = %d, i = %d ai = %u ao = %u fx=%02x\n", fl, i, + f->ff->zs->avail_in, + f->ff->zs->avail_out, f->flag); +#endif - /* If we have output space and not in a hurry.. */ - if (bo > 0 && fl == Z_NO_FLUSH) - break; - - /* Write output buffer, if anything in it */ - if (bo != bf) - fifo_writerec(f); - - /* If the buffer were full, we need to check again */ - if (bo == 0) { - fifo_prepobuf(f, now, 0); - continue; - } + assert(i == Z_OK || i == Z_BUF_ERROR || i == Z_STREAM_END); + assert(f->ff->zs->avail_in == 0); - if (fl == Z_FINISH) { - /* Make next record a SYNC record */ - fifo_prepobuf(f, now, 1); - /* And reset the zlib engine */ - i = deflateReset(f->ff->zs); - assert(i == Z_OK); - f->writes_since_sync = 0; - } else { - fifo_prepobuf(f, now, 0); - } - break; + if (!fifolog_write_output(f, fl, now)) + break; } - - if (f->ff->zs->avail_in == 0) { - /* Reset input buffer when empty */ - f->iptr = f->ibuf; - f->ff->zs->next_in = f->iptr; + assert(f->ff->zs->avail_in == 0); + if (fl == Z_FINISH) { + f->flag |= FIFOLOG_FLG_SYNC; + f->ff->zs->next_out = f->obuf + 9; + f->ff->zs->avail_out = f->obufsize - 9; + f->lastsync = now; +#ifdef DBG +fprintf(stderr, "SYNC %d\n", __LINE__); +#endif + assert(Z_OK == deflateReset(f->ff->zs)); } - - fifolog_write_assert(f); - return (1); } -static void -fifolog_acct(struct fifolog_writer *f, unsigned bytes) +int +fifolog_write_poll(struct fifolog_writer *f, time_t now) { - - f->ff->zs->avail_in += bytes; - f->iptr += bytes; - f->cnt[FIFOLOG_PT_BYTES_PRE] += bytes; + if (now == 0) + time(&now); + fifolog_write_gzip(f, NULL, 0, now, 1); + return (0); } /* @@ -312,8 +299,8 @@ fifolog_acct(struct fifolog_writer *f, unsigned bytes) int fifolog_write_bytes(struct fifolog_writer *f, uint32_t id, time_t now, const void *ptr, unsigned len) { - u_int l; const unsigned char *p; + uint8_t buf[4]; fifolog_write_assert(f); assert(!(id & (FIFOLOG_TIMESTAMP|FIFOLOG_LENGTH))); @@ -322,46 +309,45 @@ fifolog_write_bytes(struct fifolog_writer *f, uint32_t id, time_t now, const voi p = ptr; if (len == 0) { len = strlen(ptr) + 1; - l = 4 + len; /* id */ } else { assert(len <= 255); id |= FIFOLOG_LENGTH; - l = 5 + len; /* id + len */ } - l += 4; /* A timestamp may be necessary */ - /* Now do timestamp, if needed */ if (now == 0) time(&now); - assert(l < f->ibufsize); - - /* Return if there is not enough space */ - if (f->iptr + l > f->ibuf + f->ibufsize) - return (0); - if (now != f->last) { id |= FIFOLOG_TIMESTAMP; f->last = now; } - /* Emit instance+flag and length */ - be32enc(f->iptr, id); - fifolog_acct(f, 4); + /* Emit instance+flag */ + be32enc(buf, id); + fifolog_write_gzip(f, buf, 4, now, 0); if (id & FIFOLOG_TIMESTAMP) { - be32enc(f->iptr, (uint32_t)f->last); - fifolog_acct(f, 4); + be32enc(buf, (uint32_t)f->last); + fifolog_write_gzip(f, buf, 4, now, 0); } if (id & FIFOLOG_LENGTH) { - f->iptr[0] = (u_char)len; - fifolog_acct(f, 1); + buf[0] = (u_char)len; + fifolog_write_gzip(f, buf, 1, now, 0); } assert (len > 0); - memcpy(f->iptr, p, len); - fifolog_acct(f, len); +#if 1 + if (len > f->ibufsize) { + free(f->ibuf); + f->ibufsize = len; + ALLOC(&f->ibuf, f->ibufsize); + } + memcpy(f->ibuf, p, len); + fifolog_write_gzip(f, f->ibuf, len, now, 1); +#else + fifolog_write_gzip(f, p, len, now, 1); +#endif fifolog_write_assert(f); return (1); } @@ -384,7 +370,6 @@ fifolog_write_bytes_poll(struct fifolog_writer *f, uint32_t id, time_t now, cons if (len == 0) { while (!fifolog_write_bytes(f, id, now, ptr, len)) { - (void)fifolog_write_poll(f, now); (void)usleep(10000); } } else { @@ -394,7 +379,6 @@ fifolog_write_bytes_poll(struct fifolog_writer *f, uint32_t id, time_t now, cons if (l > 255) l = 255; while (!fifolog_write_bytes(f, id, now, p, l)) { - (void)fifolog_write_poll(f, now); (void)usleep(10000); } } -- cgit v1.1 From 7aa4e35a24d07cbf7ef35c26ef7ac092a2f54e5e Mon Sep 17 00:00:00 2001 From: kientzle Date: Tue, 7 Dec 2010 16:48:01 +0000 Subject: Don't write data into an empty "file." In particular, this check avoids a warning when extracting directory entries from certain GNU tar archives that store directory contents. MFC after: 3 days --- lib/libarchive/archive_read_extract.c | 3 ++- lib/libarchive/test/Makefile | 17 +++++------------ lib/libarchive/test/test_acl_freebsd.c | 5 +++++ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/libarchive/archive_read_extract.c b/lib/libarchive/archive_read_extract.c index 86b378b..8ae5dec 100644 --- a/lib/libarchive/archive_read_extract.c +++ b/lib/libarchive/archive_read_extract.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #endif #include "archive.h" +#include "archive_entry.h" #include "archive_private.h" #include "archive_read_private.h" #include "archive_write_disk_private.h" @@ -107,7 +108,7 @@ archive_read_extract2(struct archive *_a, struct archive_entry *entry, if (r != ARCHIVE_OK) /* If _write_header failed, copy the error. */ archive_copy_error(&a->archive, ad); - else + else if (archive_entry_size(entry) > 0) /* Otherwise, pour data into the entry. */ r = copy_data(_a, ad); r2 = archive_write_finish_entry(ad); diff --git a/lib/libarchive/test/Makefile b/lib/libarchive/test/Makefile index c721f57..f9fead9 100644 --- a/lib/libarchive/test/Makefile +++ b/lib/libarchive/test/Makefile @@ -2,10 +2,6 @@ # Where to find the libarchive sources LA_SRCDIR=${.CURDIR}/.. -.PATH: ${LA_SRCDIR} - -# Get a list of all libarchive source files -LA_SRCS!=make -f ${LA_SRCDIR}/Makefile -V SRCS TESTS= \ test_acl_basic.c \ @@ -113,8 +109,8 @@ TESTS= \ test_write_open_memory.c -# Build the test program using all libarchive sources + the test sources. -SRCS= ${LA_SRCS} \ +# Build the test program. +SRCS= \ ${TESTS} \ list.h \ main.c \ @@ -125,14 +121,11 @@ NO_MAN=yes PROG=libarchive_test INTERNALPROG=yes # Don't install this; it's just for testing DPADD=${LIBBZ2} ${LIBZ} ${LIBMD} ${LIBCRYPTO} ${LIBBSDXML} -CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" -LDADD= -lz -lbz2 -lmd -lcrypto -lbsdxml +LDADD= -L ${.OBJDIR}/.. -larchive +LDADD+= -lz -lbz2 -llzma -lmd -lcrypto -lbsdxml CFLAGS+= -g CFLAGS+= -I${LA_SRCDIR} -I. - -# Uncomment to build and test lzma and xz support via liblzma -#CFLAGS+= -I/usr/local/include -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1 -#LDADD+= -L/usr/local/lib -llzma +CFLAGS+= -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1 # Uncomment to link against dmalloc #LDADD+= -L/usr/local/lib -ldmalloc diff --git a/lib/libarchive/test/test_acl_freebsd.c b/lib/libarchive/test/test_acl_freebsd.c index 88efb19..fbb744d 100644 --- a/lib/libarchive/test/test_acl_freebsd.c +++ b/lib/libarchive/test/test_acl_freebsd.c @@ -220,6 +220,11 @@ DEFINE_TEST(test_acl_freebsd) skipping("ACL tests require that ACL support be enabled on the filesystem"); return; } + if (n != 0 && errno == EINVAL) { + close(fd); + skipping("POSIX.1e ACL tests require that POSIX.1e ACL support be enabled on the filesystem"); + return; + } failure("acl_set_fd(): errno = %d (%s)", errno, strerror(errno)); assertEqualInt(0, n); -- cgit v1.1 From 37fc67e5bad45bc2ccc28a4e5323143fdf61384a Mon Sep 17 00:00:00 2001 From: jhb Date: Tue, 7 Dec 2010 18:49:11 +0000 Subject: Use proper resource ID's for HPET IRQ resources. This mostly consists of looking to see if there is an existing IRQ resource for a given IRQ provided by the BIOS and using that RID if so. Otherwise, allocate a new RID for the new IRQ. Reviewed by: mav (a while ago) --- sys/dev/acpica/acpi_hpet.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/sys/dev/acpica/acpi_hpet.c b/sys/dev/acpica/acpi_hpet.c index efe5747..97fe991 100644 --- a/sys/dev/acpica/acpi_hpet.c +++ b/sys/dev/acpica/acpi_hpet.c @@ -303,6 +303,23 @@ hpet_find(ACPI_HANDLE handle, UINT32 level, void *context, return (AE_OK); } +/* + * Find an existing IRQ resource that matches the requested IRQ range + * and return its RID. If one is not found, use a new RID. + */ +static int +hpet_find_irq_rid(device_t dev, u_long start, u_long end) +{ + u_long irq; + int error, rid; + + for (rid = 0;; rid++) { + error = bus_get_resource(dev, SYS_RES_IRQ, rid, &irq, NULL); + if (error != 0 || (start <= irq && irq <= end)) + return (rid); + } +} + /* Discover the HPET via the ACPI table of the same name. */ static void hpet_identify(driver_t *driver, device_t parent) @@ -540,6 +557,7 @@ hpet_attach(device_t dev) dvectors &= ~(1 << t->irq); } if (t->irq >= 0) { + t->intr_rid = hpet_find_irq_rid(dev, t->irq, t->irq); if (!(t->intr_res = bus_alloc_resource(dev, SYS_RES_IRQ, &t->intr_rid, t->irq, t->irq, 1, RF_ACTIVE))) { @@ -590,12 +608,12 @@ hpet_attach(device_t dev) } bus_write_4(sc->mem_res, HPET_ISR, 0xffffffff); sc->irq = -1; - sc->intr_rid = -1; /* If at least one timer needs legacy IRQ - set it up. */ if (sc->useirq) { j = i = fls(cvectors) - 1; while (j > 0 && (cvectors & (1 << (j - 1))) != 0) j--; + sc->intr_rid = hpet_find_irq_rid(dev, j, i); if (!(sc->intr_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->intr_rid, j, i, 1, RF_SHAREABLE | RF_ACTIVE))) device_printf(dev,"Can't map interrupt.\n"); -- cgit v1.1 From ffba45505b9102f1fc072ac9f76dfd17e2a0324c Mon Sep 17 00:00:00 2001 From: emaste Date: Tue, 7 Dec 2010 19:18:00 +0000 Subject: Add a comment to clarify that some BIOSes may clear the hw watchdog indicator bit, preventing us from reporting in that case. X-MFC-with: r215868 --- sys/dev/ichwd/ichwd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sys/dev/ichwd/ichwd.c b/sys/dev/ichwd/ichwd.c index 9ddec20..83ce5a7 100644 --- a/sys/dev/ichwd/ichwd.c +++ b/sys/dev/ichwd/ichwd.c @@ -520,8 +520,9 @@ ichwd_attach(device_t dev) device_get_desc(dev), sc->ich_version); /* - * Determine if we are coming up after a watchdog-induced reset. - * This bit is cleared in ichwd_sts_reset(). + * Determine if we are coming up after a watchdog-induced reset. Some + * BIOSes may clear this bit at bootup, preventing us from reporting + * this case on such systems. We clear this bit in ichwd_sts_reset(). */ if ((ichwd_read_tco_2(sc, TCO2_STS) & TCO_SECOND_TO_STS) != 0) device_printf(dev, -- cgit v1.1 From 33417874f42d859e6925c0cad02eb4a0ade247ca Mon Sep 17 00:00:00 2001 From: weongyo Date: Tue, 7 Dec 2010 20:23:47 +0000 Subject: Introduces IFF_CANTCONFIG interface flag to point that the interface isn't configurable in a meaningful way. This is for ifconfig(8) or other tools not to change code whenever IFT_USB-like interfaces are registered at the interface list. Reviewed by: brooks No objections: gavin, jkim --- sbin/ifconfig/ifconfig.c | 4 ++-- sys/dev/usb/usb_pf.c | 1 + sys/net/if.h | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index e4292da..7c5d351 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -295,8 +295,6 @@ main(int argc, char *argv[]) sdl = (const struct sockaddr_dl *) ifa->ifa_addr; else sdl = NULL; - if (sdl != NULL && sdl->sdl_type == IFT_USB) - continue; if (cp != NULL && strcmp(cp, ifa->ifa_name) == 0 && !namesonly) continue; iflen = strlcpy(name, ifa->ifa_name, sizeof(name)); @@ -307,6 +305,8 @@ main(int argc, char *argv[]) } cp = ifa->ifa_name; + if ((ifa->ifa_flags & IFF_CANTCONFIG) != 0) + continue; if (downonly && (ifa->ifa_flags & IFF_UP) != 0) continue; if (uponly && (ifa->ifa_flags & IFF_UP) == 0) diff --git a/sys/dev/usb/usb_pf.c b/sys/dev/usb/usb_pf.c index 4ac0eeb..2658907 100644 --- a/sys/dev/usb/usb_pf.c +++ b/sys/dev/usb/usb_pf.c @@ -64,6 +64,7 @@ usbpf_attach(struct usb_bus *ubus) ifp = ubus->ifp = if_alloc(IFT_USB); if_initname(ifp, "usbus", device_get_unit(ubus->bdev)); + ifp->if_flags = IFF_CANTCONFIG; if_attach(ifp); if_up(ifp); diff --git a/sys/net/if.h b/sys/net/if.h index a99b4a7..8cfa448 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -145,7 +145,7 @@ struct if_data { #define IFF_LINK2 0x4000 /* per link layer defined bit */ #define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ #define IFF_MULTICAST 0x8000 /* (i) supports multicast */ -/* 0x10000 */ +#define IFF_CANTCONFIG 0x10000 /* (i) unconfigurable using ioctl(2) */ #define IFF_PPROMISC 0x20000 /* (n) user-requested promisc mode */ #define IFF_MONITOR 0x40000 /* (n) user-requested monitor mode */ #define IFF_STATICARP 0x80000 /* (n) static ARP */ -- cgit v1.1 From 6dc48cb05c2ff1b9db74aafddb1a26eb6ce7633c Mon Sep 17 00:00:00 2001 From: weongyo Date: Tue, 7 Dec 2010 20:31:04 +0000 Subject: Adds IFF_CANTCONFIG to IFF_CANTCHANGE that it shouldn't happen through ioctl(2). --- sys/net/if.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/net/if.h b/sys/net/if.h index 8cfa448..d291da8 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -165,7 +165,7 @@ struct if_data { #define IFF_CANTCHANGE \ (IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\ IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_SMART|IFF_PROMISC|\ - IFF_DYING) + IFF_DYING|IFF_CANTCONFIG) /* * Values for if_link_state. -- cgit v1.1 From 3ced539f504883c86768d27367bc5e0f3e46f1b6 Mon Sep 17 00:00:00 2001 From: brucec Date: Tue, 7 Dec 2010 20:46:11 +0000 Subject: Don't warn if a partition appears not to be aligned on a track boundary. Modern disks use LBA and create a fake CHS geometry that doesn't have any relation to the on-disk layout of data. --- sys/geom/part/g_part_mbr.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/sys/geom/part/g_part_mbr.c b/sys/geom/part/g_part_mbr.c index 454c759..f9d3d0d 100644 --- a/sys/geom/part/g_part_mbr.c +++ b/sys/geom/part/g_part_mbr.c @@ -449,12 +449,6 @@ g_part_mbr_read(struct g_part_table *basetable, struct g_consumer *cp) basetable->gpt_heads = heads; } } - if ((ent.dp_start % basetable->gpt_sectors) != 0) - printf("GEOM: %s: partition %d does not start on a " - "track boundary.\n", pp->name, index + 1); - if ((ent.dp_size % basetable->gpt_sectors) != 0) - printf("GEOM: %s: partition %d does not end on a " - "track boundary.\n", pp->name, index + 1); entry = (struct g_part_mbr_entry *)g_part_new_entry(basetable, index + 1, ent.dp_start, ent.dp_start + ent.dp_size - 1); -- cgit v1.1 From 479bdd44dfdca13ecd0c4f71304be23abeb4729f Mon Sep 17 00:00:00 2001 From: jkim Date: Tue, 7 Dec 2010 22:12:02 +0000 Subject: Probe P-state invariant TSC from rightful place. --- sys/amd64/amd64/identcpu.c | 22 ---------------------- sys/amd64/amd64/tsc.c | 23 +++++++++++++++++++++++ sys/i386/i386/identcpu.c | 22 ---------------------- sys/i386/i386/tsc.c | 23 +++++++++++++++++++++++ 4 files changed, 46 insertions(+), 44 deletions(-) diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index 7e4319e..9c9d74a 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -392,28 +392,6 @@ printcpuinfo(void) * If this CPU supports P-state invariant TSC then * mention the capability. */ - switch (cpu_vendor_id) { - case CPU_VENDOR_AMD: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - CPUID_TO_FAMILY(cpu_id) >= 0x10 || - cpu_id == 0x60fb2) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_INTEL: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xe) || - (CPUID_TO_FAMILY(cpu_id) == 0xf && - CPUID_TO_MODEL(cpu_id) >= 0x3)) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_CENTAUR: - if (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xf && - (rdmsr(0x1203) & 0x100000000ULL) == 0) - tsc_is_invariant = 1; - break; - } if (tsc_is_invariant) printf("\n TSC: P-state invariant"); diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 9ed36eb..86c5390 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -94,6 +95,28 @@ init_TSC(void) if (bootverbose) printf("TSC clock: %lu Hz\n", tsc_freq); + switch (cpu_vendor_id) { + case CPU_VENDOR_AMD: + if ((amd_pminfo & AMDPM_TSC_INVARIANT) || + CPUID_TO_FAMILY(cpu_id) >= 0x10 || cpu_id == 0x60fb2) + tsc_is_invariant = 1; + break; + case CPU_VENDOR_INTEL: + if ((amd_pminfo & AMDPM_TSC_INVARIANT) || + (CPUID_TO_FAMILY(cpu_id) == 0x6 && + CPUID_TO_MODEL(cpu_id) >= 0xe) || + (CPUID_TO_FAMILY(cpu_id) == 0xf && + CPUID_TO_MODEL(cpu_id) >= 0x3)) + tsc_is_invariant = 1; + break; + case CPU_VENDOR_CENTAUR: + if (CPUID_TO_FAMILY(cpu_id) == 0x6 && + CPUID_TO_MODEL(cpu_id) >= 0xf && + (rdmsr(0x1203) & 0x100000000ULL) == 0) + tsc_is_invariant = 1; + break; + } + /* * Inform CPU accounting about our boot-time clock rate. Once the * system is finished booting, we will get the real max clock rate diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c index afdedc2..4fd6273 100644 --- a/sys/i386/i386/identcpu.c +++ b/sys/i386/i386/identcpu.c @@ -856,28 +856,6 @@ printcpuinfo(void) * If this CPU supports P-state invariant TSC then * mention the capability. */ - switch (cpu_vendor_id) { - case CPU_VENDOR_AMD: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - CPUID_TO_FAMILY(cpu_id) >= 0x10 || - cpu_id == 0x60fb2) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_INTEL: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xe) || - (CPUID_TO_FAMILY(cpu_id) == 0xf && - CPUID_TO_MODEL(cpu_id) >= 0x3)) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_CENTAUR: - if (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xf && - (rdmsr(0x1203) & 0x100000000ULL) == 0) - tsc_is_invariant = 1; - break; - } if (tsc_is_invariant) printf("\n TSC: P-state invariant"); diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 185f240..61dabd3 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -103,6 +104,28 @@ init_TSC(void) if (bootverbose) printf("TSC clock: %ju Hz\n", (intmax_t)tsc_freq); + switch (cpu_vendor_id) { + case CPU_VENDOR_AMD: + if ((amd_pminfo & AMDPM_TSC_INVARIANT) || + CPUID_TO_FAMILY(cpu_id) >= 0x10 || cpu_id == 0x60fb2) + tsc_is_invariant = 1; + break; + case CPU_VENDOR_INTEL: + if ((amd_pminfo & AMDPM_TSC_INVARIANT) || + (CPUID_TO_FAMILY(cpu_id) == 0x6 && + CPUID_TO_MODEL(cpu_id) >= 0xe) || + (CPUID_TO_FAMILY(cpu_id) == 0xf && + CPUID_TO_MODEL(cpu_id) >= 0x3)) + tsc_is_invariant = 1; + break; + case CPU_VENDOR_CENTAUR: + if (CPUID_TO_FAMILY(cpu_id) == 0x6 && + CPUID_TO_MODEL(cpu_id) >= 0xf && + (rdmsr(0x1203) & 0x100000000ULL) == 0) + tsc_is_invariant = 1; + break; + } + /* * Inform CPU accounting about our boot-time clock rate. Once the * system is finished booting, we will get the real max clock rate -- cgit v1.1 From 41f234df801566b9b5408eae9ed3990d349adb72 Mon Sep 17 00:00:00 2001 From: jkim Date: Tue, 7 Dec 2010 22:23:26 +0000 Subject: Now the P-state invariant TSC is probed early enough, do not register event handlers for CPU freqency changes when it is found P-state invariant. Adjust a comment about non-existent tsc_freq_max() while I am here. --- sys/amd64/amd64/tsc.c | 18 ++++++++---------- sys/i386/i386/tsc.c | 18 ++++++++---------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 86c5390..ea05bb4 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -118,13 +118,15 @@ init_TSC(void) } /* - * Inform CPU accounting about our boot-time clock rate. Once the - * system is finished booting, we will get the real max clock rate - * via tsc_freq_max(). This also will be updated if someone loads - * a cpufreq driver after boot that discovers a new max frequency. + * Inform CPU accounting about our boot-time clock rate. This will + * be updated if someone loads a cpufreq driver after boot that + * discovers a new max frequency. */ set_cputicker(rdtsc, tsc_freq, 1); + if (tsc_is_invariant) + return; + /* Register to find out about changes in CPU frequency. */ tsc_pre_tag = EVENTHANDLER_REGISTER(cpufreq_pre_change, tsc_freq_changing, NULL, EVENTHANDLER_PRI_FIRST); @@ -169,9 +171,6 @@ tsc_levels_changed(void *arg, int unit) int count, error; uint64_t max_freq; - if (tsc_is_invariant) - return; - /* Only use values from the first CPU, assuming all are equal. */ if (unit != 0) return; @@ -205,8 +204,7 @@ static void tsc_freq_changing(void *arg, const struct cf_level *level, int *status) { - if (*status != 0 || timecounter != &tsc_timecounter || - tsc_is_invariant) + if (*status != 0 || timecounter != &tsc_timecounter) return; printf("timecounter TSC must not be in use when " @@ -222,7 +220,7 @@ tsc_freq_changed(void *arg, const struct cf_level *level, int status) * If there was an error during the transition or * TSC is P-state invariant, don't do anything. */ - if (status != 0 || tsc_is_invariant) + if (status != 0) return; /* Total setting for this level gives the new frequency in MHz. */ diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 61dabd3..2b8d8a3 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -127,13 +127,15 @@ init_TSC(void) } /* - * Inform CPU accounting about our boot-time clock rate. Once the - * system is finished booting, we will get the real max clock rate - * via tsc_freq_max(). This also will be updated if someone loads - * a cpufreq driver after boot that discovers a new max frequency. + * Inform CPU accounting about our boot-time clock rate. This will + * be updated if someone loads a cpufreq driver after boot that + * discovers a new max frequency. */ set_cputicker(rdtsc, tsc_freq, 1); + if (tsc_is_invariant) + return; + /* Register to find out about changes in CPU frequency. */ tsc_pre_tag = EVENTHANDLER_REGISTER(cpufreq_pre_change, tsc_freq_changing, NULL, EVENTHANDLER_PRI_FIRST); @@ -197,9 +199,6 @@ tsc_levels_changed(void *arg, int unit) int count, error; uint64_t max_freq; - if (tsc_is_invariant) - return; - /* Only use values from the first CPU, assuming all are equal. */ if (unit != 0) return; @@ -233,8 +232,7 @@ static void tsc_freq_changing(void *arg, const struct cf_level *level, int *status) { - if (*status != 0 || timecounter != &tsc_timecounter || - tsc_is_invariant) + if (*status != 0 || timecounter != &tsc_timecounter) return; printf("timecounter TSC must not be in use when " @@ -250,7 +248,7 @@ tsc_freq_changed(void *arg, const struct cf_level *level, int status) * If there was an error during the transition or * TSC is P-state invariant, don't do anything. */ - if (status != 0 || tsc_is_invariant) + if (status != 0) return; /* Total setting for this level gives the new frequency in MHz. */ -- cgit v1.1 From 4a4318379431bade4c6e2e5193a115ac448551ba Mon Sep 17 00:00:00 2001 From: jkim Date: Tue, 7 Dec 2010 22:34:51 +0000 Subject: Do not register a event handler for CPU freqency changes when it is found P-state invariant. This is continuation of r216274. --- sys/amd64/amd64/identcpu.c | 20 ++++++++++++++++---- sys/i386/i386/identcpu.c | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index 9c9d74a..820d530 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -109,6 +109,8 @@ static int hw_clockrate; SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD, &hw_clockrate, 0, "CPU instruction clock rate"); +static eventhandler_tag tsc_post_tag; + static char cpu_brand[48]; static struct { @@ -433,21 +435,31 @@ panicifcpuunsupported(void) /* Update TSC freq with the value indicated by the caller. */ static void -tsc_freq_changed(void *arg, const struct cf_level *level, int status) +tsc_freq_changed(void *arg __unused, const struct cf_level *level, int status) { /* * If there was an error during the transition or * TSC is P-state invariant, don't do anything. */ - if (status != 0 || tsc_is_invariant) + if (status != 0) return; /* Total setting for this level gives the new frequency in MHz. */ hw_clockrate = level->total_set.freq; } -EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL, - EVENTHANDLER_PRI_ANY); +static void +hook_tsc_freq(void *arg __unused) +{ + + if (tsc_is_invariant) + return; + + tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change, + tsc_freq_changed, NULL, EVENTHANDLER_PRI_ANY); +} + +SYSINIT(hook_tsc_freq, SI_SUB_CONFIGURE, SI_ORDER_ANY, hook_tsc_freq, NULL); /* * Final stage of CPU identification. diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c index 4fd6273..eff9017 100644 --- a/sys/i386/i386/identcpu.c +++ b/sys/i386/i386/identcpu.c @@ -100,6 +100,8 @@ static int hw_clockrate; SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD, &hw_clockrate, 0, "CPU instruction clock rate"); +static eventhandler_tag tsc_post_tag; + static char cpu_brand[48]; #define MAX_BRAND_INDEX 8 @@ -1049,21 +1051,31 @@ identifycyrix(void) /* Update TSC freq with the value indicated by the caller. */ static void -tsc_freq_changed(void *arg, const struct cf_level *level, int status) +tsc_freq_changed(void *arg __unused, const struct cf_level *level, int status) { /* * If there was an error during the transition or * TSC is P-state invariant, don't do anything. */ - if (status != 0 || tsc_is_invariant) + if (status != 0) return; /* Total setting for this level gives the new frequency in MHz. */ hw_clockrate = level->total_set.freq; } -EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL, - EVENTHANDLER_PRI_ANY); +static void +hook_tsc_freq(void *arg __unused) +{ + + if (tsc_is_invariant) + return; + + tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change, + tsc_freq_changed, NULL, EVENTHANDLER_PRI_ANY); +} + +SYSINIT(hook_tsc_freq, SI_SUB_CONFIGURE, SI_ORDER_ANY, hook_tsc_freq, NULL); /* * Final stage of CPU identification. -- Should I check TI? -- cgit v1.1 From e7f25080c7da6b77fa0b44eb71069aabea240967 Mon Sep 17 00:00:00 2001 From: jkim Date: Tue, 7 Dec 2010 22:43:25 +0000 Subject: Remove stale comments about P-state invariant TSC and fix style(9) nits. --- sys/amd64/amd64/identcpu.c | 6 ++---- sys/amd64/amd64/tsc.c | 6 ++---- sys/i386/i386/identcpu.c | 6 ++---- sys/i386/i386/tsc.c | 6 ++---- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index 820d530..cd28d59 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -437,10 +437,8 @@ panicifcpuunsupported(void) static void tsc_freq_changed(void *arg __unused, const struct cf_level *level, int status) { - /* - * If there was an error during the transition or - * TSC is P-state invariant, don't do anything. - */ + + /* If there was an error during the transition, don't do anything. */ if (status != 0) return; diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index ea05bb4..9915c12 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -216,10 +216,8 @@ tsc_freq_changing(void *arg, const struct cf_level *level, int *status) static void tsc_freq_changed(void *arg, const struct cf_level *level, int status) { - /* - * If there was an error during the transition or - * TSC is P-state invariant, don't do anything. - */ + + /* If there was an error during the transition, don't do anything. */ if (status != 0) return; diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c index eff9017..3bcc416 100644 --- a/sys/i386/i386/identcpu.c +++ b/sys/i386/i386/identcpu.c @@ -1053,10 +1053,8 @@ identifycyrix(void) static void tsc_freq_changed(void *arg __unused, const struct cf_level *level, int status) { - /* - * If there was an error during the transition or - * TSC is P-state invariant, don't do anything. - */ + + /* If there was an error during the transition, don't do anything. */ if (status != 0) return; diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 2b8d8a3..3ddc455 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -244,10 +244,8 @@ tsc_freq_changing(void *arg, const struct cf_level *level, int *status) static void tsc_freq_changed(void *arg, const struct cf_level *level, int status) { - /* - * If there was an error during the transition or - * TSC is P-state invariant, don't do anything. - */ + + /* If there was an error during the transition, don't do anything. */ if (status != 0) return; -- cgit v1.1 From ac70658e77480153bbfd07032a10cc94e1c4a064 Mon Sep 17 00:00:00 2001 From: bz Date: Tue, 7 Dec 2010 22:43:29 +0000 Subject: Loosen the locking in nd6-free() again after r216022 to avoid a LOR and a recursed lock. Reported by: delphij Tested by: delphij PR: kern/148857 MFC After: 3 days --- sys/netinet6/nd6.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index c4ff308..fe8bada 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1053,15 +1053,6 @@ nd6_free(struct llentry *ln, int gc) return (next); } - if (ln->ln_router || dr) { - /* - * rt6_flush must be called whether or not the neighbor - * is in the Default Router List. - * See a corresponding comment in nd6_na_input(). - */ - rt6_flush(&L3_ADDR_SIN6(ln)->sin6_addr, ifp); - } - if (dr) { /* * Unreachablity of a router might affect the default @@ -1077,8 +1068,28 @@ nd6_free(struct llentry *ln, int gc) * or the entry itself will be deleted. */ ln->ln_state = ND6_LLINFO_INCOMPLETE; + } + + if (ln->ln_router || dr) { /* + * We need to unlock to avoid a LOR with rt6_flush() with the + * rnh and for the calls to pfxlist_onlink_check() and + * defrouter_select() in the block further down for calls + * into nd6_lookup(). We still hold a ref. + */ + LLE_WUNLOCK(ln); + + /* + * rt6_flush must be called whether or not the neighbor + * is in the Default Router List. + * See a corresponding comment in nd6_na_input(). + */ + rt6_flush(&L3_ADDR_SIN6(ln)->sin6_addr, ifp); + } + + if (dr) { + /* * Since defrouter_select() does not affect the * on-link determination and MIP6 needs the check * before the default router selection, we perform @@ -1087,13 +1098,13 @@ nd6_free(struct llentry *ln, int gc) pfxlist_onlink_check(); /* - * Refresh default router list. Have to unlock as - * it calls into nd6_lookup(), still holding a ref. + * Refresh default router list. */ - LLE_WUNLOCK(ln); defrouter_select(); - LLE_WLOCK(ln); } + + if (ln->ln_router || dr) + LLE_WLOCK(ln); } /* -- cgit v1.1 From 04af779f2fdf96c891a9faa278e0281a7d987ed7 Mon Sep 17 00:00:00 2001 From: jkim Date: Tue, 7 Dec 2010 23:19:49 +0000 Subject: Use int for 'tsc_present' instead of u_int. It is just a boolean. --- sys/i386/i386/tsc.c | 2 +- sys/i386/include/cpu.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 3ddc455..ae2cba4 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$"); uint64_t tsc_freq; int tsc_is_broken; int tsc_is_invariant; -u_int tsc_present; +int tsc_present; static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; SYSCTL_INT(_kern_timecounter, OID_AUTO, invariant_tsc, CTLFLAG_RDTUN, diff --git a/sys/i386/include/cpu.h b/sys/i386/include/cpu.h index 83defe2..75fc0c6 100644 --- a/sys/i386/include/cpu.h +++ b/sys/i386/include/cpu.h @@ -56,7 +56,7 @@ #ifdef _KERNEL extern char btext[]; extern char etext[]; -extern u_int tsc_present; +extern int tsc_present; void cpu_halt(void); void cpu_reset(void); -- cgit v1.1 From 920e8e92e0abb0e76b2eafec67ff234cbd15c697 Mon Sep 17 00:00:00 2001 From: cperciva Date: Tue, 7 Dec 2010 23:33:20 +0000 Subject: Postpone the unmasking of event channels (aka. interrupts) until after the interrupt handlers have been registered. NULL isn't a very good interrupt handler. --- sys/xen/evtchn/evtchn.c | 53 ++++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/sys/xen/evtchn/evtchn.c b/sys/xen/evtchn/evtchn.c index 3832277..3ad2e2c 100644 --- a/sys/xen/evtchn/evtchn.c +++ b/sys/xen/evtchn/evtchn.c @@ -256,7 +256,7 @@ find_unbound_irq(void) } static int -bind_caller_port_to_irq(unsigned int caller_port) +bind_caller_port_to_irq(unsigned int caller_port, int * port) { int irq; @@ -271,7 +271,7 @@ bind_caller_port_to_irq(unsigned int caller_port) } irq_bindcount[irq]++; - unmask_evtchn(caller_port); + *port = caller_port; out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -279,7 +279,7 @@ bind_caller_port_to_irq(unsigned int caller_port) } static int -bind_local_port_to_irq(unsigned int local_port) +bind_local_port_to_irq(unsigned int local_port, int * port) { int irq; @@ -298,7 +298,7 @@ bind_local_port_to_irq(unsigned int local_port) evtchn_to_irq[local_port] = irq; irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port); irq_bindcount[irq]++; - unmask_evtchn(local_port); + *port = local_port; out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -306,7 +306,7 @@ bind_local_port_to_irq(unsigned int local_port) } static int -bind_listening_port_to_irq(unsigned int remote_domain) +bind_listening_port_to_irq(unsigned int remote_domain, int * port) { struct evtchn_alloc_unbound alloc_unbound; int err; @@ -317,12 +317,12 @@ bind_listening_port_to_irq(unsigned int remote_domain) err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &alloc_unbound); - return err ? : bind_local_port_to_irq(alloc_unbound.port); + return err ? : bind_local_port_to_irq(alloc_unbound.port, port); } static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain, - unsigned int remote_port) + unsigned int remote_port, int * port) { struct evtchn_bind_interdomain bind_interdomain; int err; @@ -333,11 +333,11 @@ bind_interdomain_evtchn_to_irq(unsigned int remote_domain, err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &bind_interdomain); - return err ? : bind_local_port_to_irq(bind_interdomain.local_port); + return err ? : bind_local_port_to_irq(bind_interdomain.local_port, port); } static int -bind_virq_to_irq(unsigned int virq, unsigned int cpu) +bind_virq_to_irq(unsigned int virq, unsigned int cpu, int * port) { struct evtchn_bind_virq bind_virq; int evtchn = 0, irq; @@ -363,7 +363,7 @@ bind_virq_to_irq(unsigned int virq, unsigned int cpu) } irq_bindcount[irq]++; - unmask_evtchn(evtchn); + *port = evtchn; out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -371,10 +371,8 @@ out: } -extern int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu); - -int -bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) +static int +bind_ipi_to_irq(unsigned int ipi, unsigned int cpu, int * port) { struct evtchn_bind_ipi bind_ipi; int irq; @@ -398,7 +396,7 @@ bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) bind_evtchn_to_cpu(evtchn, cpu); } irq_bindcount[irq]++; - unmask_evtchn(evtchn); + *port = evtchn; out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -449,9 +447,10 @@ bind_caller_port_to_irqhandler(unsigned int caller_port, unsigned long irqflags, unsigned int *irqp) { unsigned int irq; + int port = -1; int error; - irq = bind_caller_port_to_irq(caller_port); + irq = bind_caller_port_to_irq(caller_port, &port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); error = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, &xp->xp_pins[irq].xp_cookie); @@ -460,6 +459,8 @@ bind_caller_port_to_irqhandler(unsigned int caller_port, unbind_from_irq(irq); return (error); } + if (port != -1) + unmask_evtchn(port); if (irqp) *irqp = irq; @@ -473,9 +474,10 @@ bind_listening_port_to_irqhandler(unsigned int remote_domain, unsigned long irqflags, unsigned int *irqp) { unsigned int irq; + int port = -1; int error; - irq = bind_listening_port_to_irq(remote_domain); + irq = bind_listening_port_to_irq(remote_domain, &port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); error = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, &xp->xp_pins[irq].xp_cookie); @@ -483,6 +485,8 @@ bind_listening_port_to_irqhandler(unsigned int remote_domain, unbind_from_irq(irq); return (error); } + if (port != -1) + unmask_evtchn(port); if (irqp) *irqp = irq; @@ -496,9 +500,10 @@ bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain, unsigned int *irqp) { unsigned int irq; + int port = -1; int error; - irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port); + irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port, &port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); error = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, &xp->xp_pins[irq].xp_cookie); @@ -506,6 +511,8 @@ bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain, unbind_from_irq(irq); return (error); } + if (port != -1) + unmask_evtchn(port); if (irqp) *irqp = irq; @@ -518,9 +525,10 @@ bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu, void *arg, unsigned long irqflags, unsigned int *irqp) { unsigned int irq; + int port = -1; int error; - irq = bind_virq_to_irq(virq, cpu); + irq = bind_virq_to_irq(virq, cpu, &port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); error = intr_add_handler(devname, irq, filter, handler, arg, irqflags, &xp->xp_pins[irq].xp_cookie); @@ -528,6 +536,8 @@ bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu, unbind_from_irq(irq); return (error); } + if (port != -1) + unmask_evtchn(port); if (irqp) *irqp = irq; @@ -540,9 +550,10 @@ bind_ipi_to_irqhandler(unsigned int ipi, unsigned int cpu, unsigned long irqflags, unsigned int *irqp) { unsigned int irq; + int port = -1; int error; - irq = bind_ipi_to_irq(ipi, cpu); + irq = bind_ipi_to_irq(ipi, cpu, &port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); error = intr_add_handler(devname, irq, filter, NULL, NULL, irqflags, &xp->xp_pins[irq].xp_cookie); @@ -550,6 +561,8 @@ bind_ipi_to_irqhandler(unsigned int ipi, unsigned int cpu, unbind_from_irq(irq); return (error); } + if (port != -1) + unmask_evtchn(port); if (irqp) *irqp = irq; -- cgit v1.1 From 69595fcf74fb1f5587ef4d8a1d370dabc13d6a78 Mon Sep 17 00:00:00 2001 From: flo Date: Tue, 7 Dec 2010 23:56:51 +0000 Subject: Add myself to calendar.freebsd and committers-ports.dot Approved by: fjoe (mentor) --- share/misc/committers-ports.dot | 3 +++ usr.bin/calendar/calendars/calendar.freebsd | 1 + 2 files changed, 4 insertions(+) diff --git a/share/misc/committers-ports.dot b/share/misc/committers-ports.dot index 9ecdf0b..3067c9e 100644 --- a/share/misc/committers-ports.dot +++ b/share/misc/committers-ports.dot @@ -80,6 +80,7 @@ eik [label="Oliver Eikemeier\neik@FreeBSD.org\n2003/11/12"] erwin [label="Erwin Lansing\nerwin@FreeBSD.org\n2003/06/04"] farrokhi [label="Babak Farrokhi\nfarrokhi@FreeBSD.org\n2006/11/07"] fjoe [label="Max Khon\nfjoe@FreeBSD.org\n2001/08/06"] +flo [label="Florian Smeets\nflo@FreeBSD.org\n2010/12/07"] fluffy [label="Dima Panov\nfluffy@FreeBSD.org\n2009/08/10"] flz [label="Florent Thoumie\nflz@FreeBSD.org\n2005/03/01"] gabor [label="Gabor Kovesdan\ngabor@FreeBSD.org\n2006/12/05"] @@ -230,6 +231,7 @@ erwin -> lth erwin -> simon fjoe -> danfe +fjoe -> flo fjoe -> krion fjoe -> osa @@ -262,6 +264,7 @@ itetcu -> dryice itetcu -> sahil jadawin -> bapt +jadawin -> flo joerg -> netchild diff --git a/usr.bin/calendar/calendars/calendar.freebsd b/usr.bin/calendar/calendars/calendar.freebsd index e5118da..ef88394 100644 --- a/usr.bin/calendar/calendars/calendar.freebsd +++ b/usr.bin/calendar/calendars/calendar.freebsd @@ -159,6 +159,7 @@ 05/25 Tom Rhodes born in Ellwood City, Pennsylvania, United States, 1981 05/25 Roman Divacky born in Brno, Czech Republic, 1983 05/26 Jim Pirzyk born in Chicago, Illinois, United States, 1968 +05/26 Florian Smeets born in Schwerte, Nordrhein-Westfalen, Germany, 1982 05/27 Ollivier Robert born in Paris, France, 1967 05/29 Wilko Bulte born in Arnhem, the Netherlands, 1965 05/29 Seigo Tanimura born in Kitakyushu, Fukuoka, Japan, 1976 -- cgit v1.1 From 340a707cd635a1d76ddfcae04ea7b0ed4226f02c Mon Sep 17 00:00:00 2001 From: jkim Date: Wed, 8 Dec 2010 00:09:24 +0000 Subject: Merge sys/amd64/amd64/tsc.c and sys/i386/i386/tsc.c and move to sys/x86/x86. Discussed with: avg --- sys/amd64/amd64/tsc.c | 253 ------------------------------------------- sys/amd64/include/cpu.h | 1 + sys/conf/files.amd64 | 2 +- sys/conf/files.i386 | 2 +- sys/conf/files.pc98 | 2 +- sys/i386/i386/tsc.c | 281 ------------------------------------------------ sys/x86/x86/tsc.c | 281 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 285 insertions(+), 537 deletions(-) delete mode 100644 sys/amd64/amd64/tsc.c delete mode 100644 sys/i386/i386/tsc.c create mode 100644 sys/x86/x86/tsc.c diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c deleted file mode 100644 index 9915c12..0000000 --- a/sys/amd64/amd64/tsc.c +++ /dev/null @@ -1,253 +0,0 @@ -/*- - * Copyright (c) 1998-2003 Poul-Henning Kamp - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "opt_clock.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cpufreq_if.h" - -uint64_t tsc_freq; -int tsc_is_broken; -int tsc_is_invariant; -static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; - -SYSCTL_INT(_kern_timecounter, OID_AUTO, invariant_tsc, CTLFLAG_RDTUN, - &tsc_is_invariant, 0, "Indicates whether the TSC is P-state invariant"); -TUNABLE_INT("kern.timecounter.invariant_tsc", &tsc_is_invariant); - -#ifdef SMP -static int smp_tsc; -SYSCTL_INT(_kern_timecounter, OID_AUTO, smp_tsc, CTLFLAG_RDTUN, &smp_tsc, 0, - "Indicates whether the TSC is safe to use in SMP mode"); -TUNABLE_INT("kern.timecounter.smp_tsc", &smp_tsc); -#endif - -static void tsc_freq_changed(void *arg, const struct cf_level *level, - int status); -static void tsc_freq_changing(void *arg, const struct cf_level *level, - int *status); -static unsigned tsc_get_timecount(struct timecounter *tc); -static void tsc_levels_changed(void *arg, int unit); - -static struct timecounter tsc_timecounter = { - tsc_get_timecount, /* get_timecount */ - 0, /* no poll_pps */ - ~0u, /* counter_mask */ - 0, /* frequency */ - "TSC", /* name */ - 800, /* quality (adjusted in code) */ -}; - -void -init_TSC(void) -{ - u_int64_t tscval[2]; - - if (bootverbose) - printf("Calibrating TSC clock ... "); - - tscval[0] = rdtsc(); - DELAY(1000000); - tscval[1] = rdtsc(); - - tsc_freq = tscval[1] - tscval[0]; - if (bootverbose) - printf("TSC clock: %lu Hz\n", tsc_freq); - - switch (cpu_vendor_id) { - case CPU_VENDOR_AMD: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - CPUID_TO_FAMILY(cpu_id) >= 0x10 || cpu_id == 0x60fb2) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_INTEL: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xe) || - (CPUID_TO_FAMILY(cpu_id) == 0xf && - CPUID_TO_MODEL(cpu_id) >= 0x3)) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_CENTAUR: - if (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xf && - (rdmsr(0x1203) & 0x100000000ULL) == 0) - tsc_is_invariant = 1; - break; - } - - /* - * Inform CPU accounting about our boot-time clock rate. This will - * be updated if someone loads a cpufreq driver after boot that - * discovers a new max frequency. - */ - set_cputicker(rdtsc, tsc_freq, 1); - - if (tsc_is_invariant) - return; - - /* Register to find out about changes in CPU frequency. */ - tsc_pre_tag = EVENTHANDLER_REGISTER(cpufreq_pre_change, - tsc_freq_changing, NULL, EVENTHANDLER_PRI_FIRST); - tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change, - tsc_freq_changed, NULL, EVENTHANDLER_PRI_FIRST); - tsc_levels_tag = EVENTHANDLER_REGISTER(cpufreq_levels_changed, - tsc_levels_changed, NULL, EVENTHANDLER_PRI_ANY); -} - -void -init_TSC_tc(void) -{ - -#ifdef SMP - /* - * We can not use the TSC in SMP mode unless the TSCs on all CPUs - * are somehow synchronized. Some hardware configurations do - * this, but we have no way of determining whether this is the - * case, so we do not use the TSC in multi-processor systems - * unless the user indicated (by setting kern.timecounter.smp_tsc - * to 1) that he believes that his TSCs are synchronized. - */ - if (mp_ncpus > 1 && !smp_tsc) - tsc_timecounter.tc_quality = -100; -#endif - - if (tsc_freq != 0 && !tsc_is_broken) { - tsc_timecounter.tc_frequency = tsc_freq; - tc_init(&tsc_timecounter); - } -} - -/* - * When cpufreq levels change, find out about the (new) max frequency. We - * use this to update CPU accounting in case it got a lower estimate at boot. - */ -static void -tsc_levels_changed(void *arg, int unit) -{ - device_t cf_dev; - struct cf_level *levels; - int count, error; - uint64_t max_freq; - - /* Only use values from the first CPU, assuming all are equal. */ - if (unit != 0) - return; - - /* Find the appropriate cpufreq device instance. */ - cf_dev = devclass_get_device(devclass_find("cpufreq"), unit); - if (cf_dev == NULL) { - printf("tsc_levels_changed() called but no cpufreq device?\n"); - return; - } - - /* Get settings from the device and find the max frequency. */ - count = 64; - levels = malloc(count * sizeof(*levels), M_TEMP, M_NOWAIT); - if (levels == NULL) - return; - error = CPUFREQ_LEVELS(cf_dev, levels, &count); - if (error == 0 && count != 0) { - max_freq = (uint64_t)levels[0].total_set.freq * 1000000; - set_cputicker(rdtsc, max_freq, 1); - } else - printf("tsc_levels_changed: no max freq found\n"); - free(levels, M_TEMP); -} - -/* - * If the TSC timecounter is in use, veto the pending change. It may be - * possible in the future to handle a dynamically-changing timecounter rate. - */ -static void -tsc_freq_changing(void *arg, const struct cf_level *level, int *status) -{ - - if (*status != 0 || timecounter != &tsc_timecounter) - return; - - printf("timecounter TSC must not be in use when " - "changing frequencies; change denied\n"); - *status = EBUSY; -} - -/* Update TSC freq with the value indicated by the caller. */ -static void -tsc_freq_changed(void *arg, const struct cf_level *level, int status) -{ - - /* If there was an error during the transition, don't do anything. */ - if (status != 0) - return; - - /* Total setting for this level gives the new frequency in MHz. */ - tsc_freq = (uint64_t)level->total_set.freq * 1000000; - tsc_timecounter.tc_frequency = tsc_freq; -} - -static int -sysctl_machdep_tsc_freq(SYSCTL_HANDLER_ARGS) -{ - int error; - uint64_t freq; - - if (tsc_timecounter.tc_frequency == 0) - return (EOPNOTSUPP); - freq = tsc_freq; - error = sysctl_handle_quad(oidp, &freq, 0, req); - if (error == 0 && req->newptr != NULL) { - tsc_freq = freq; - tsc_timecounter.tc_frequency = tsc_freq; - } - return (error); -} - -SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_QUAD | CTLFLAG_RW, - 0, 0, sysctl_machdep_tsc_freq, "QU", ""); - -static unsigned -tsc_get_timecount(struct timecounter *tc) -{ - return (rdtsc()); -} diff --git a/sys/amd64/include/cpu.h b/sys/amd64/include/cpu.h index 1c2871f..3cc4af7 100644 --- a/sys/amd64/include/cpu.h +++ b/sys/amd64/include/cpu.h @@ -56,6 +56,7 @@ #ifdef _KERNEL extern char btext[]; extern char etext[]; +extern int tsc_present; void cpu_halt(void); void cpu_reset(void); diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index 470aca5..66abeb8 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -126,7 +126,6 @@ amd64/amd64/stack_machdep.c optional ddb | stack amd64/amd64/support.S standard amd64/amd64/sys_machdep.c standard amd64/amd64/trap.c standard -amd64/amd64/tsc.c standard amd64/amd64/uio_machdep.c standard amd64/amd64/uma_machdep.c standard amd64/amd64/vm_machdep.c standard @@ -326,3 +325,4 @@ x86/x86/mptable.c optional mptable x86/x86/mptable_pci.c optional mptable pci x86/x86/msi.c optional pci x86/x86/nexus.c standard +x86/x86/tsc.c standard diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index c6a3260..2c39d58 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -312,7 +312,6 @@ i386/i386/support.s standard i386/i386/swtch.s standard i386/i386/sys_machdep.c standard i386/i386/trap.c standard -i386/i386/tsc.c standard i386/i386/uio_machdep.c standard i386/i386/vm86.c standard i386/i386/vm_machdep.c standard @@ -415,3 +414,4 @@ x86/x86/mptable.c optional apic native x86/x86/mptable_pci.c optional apic pci x86/x86/msi.c optional apic pci x86/x86/nexus.c standard +x86/x86/tsc.c standard diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98 index ab88e22..a9c73da 100644 --- a/sys/conf/files.pc98 +++ b/sys/conf/files.pc98 @@ -164,7 +164,6 @@ i386/i386/support.s standard i386/i386/swtch.s standard i386/i386/sys_machdep.c standard i386/i386/trap.c standard -i386/i386/tsc.c standard i386/i386/uio_machdep.c standard i386/i386/vm86.c standard i386/i386/vm_machdep.c standard @@ -259,3 +258,4 @@ x86/x86/mptable.c optional apic x86/x86/mptable_pci.c optional apic pci x86/x86/msi.c optional apic pci x86/x86/nexus.c standard +x86/x86/tsc.c standard diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c deleted file mode 100644 index ae2cba4..0000000 --- a/sys/i386/i386/tsc.c +++ /dev/null @@ -1,281 +0,0 @@ -/*- - * Copyright (c) 1998-2003 Poul-Henning Kamp - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "opt_clock.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cpufreq_if.h" - -uint64_t tsc_freq; -int tsc_is_broken; -int tsc_is_invariant; -int tsc_present; -static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; - -SYSCTL_INT(_kern_timecounter, OID_AUTO, invariant_tsc, CTLFLAG_RDTUN, - &tsc_is_invariant, 0, "Indicates whether the TSC is P-state invariant"); -TUNABLE_INT("kern.timecounter.invariant_tsc", &tsc_is_invariant); - -#ifdef SMP -static int smp_tsc; -SYSCTL_INT(_kern_timecounter, OID_AUTO, smp_tsc, CTLFLAG_RDTUN, &smp_tsc, 0, - "Indicates whether the TSC is safe to use in SMP mode"); -TUNABLE_INT("kern.timecounter.smp_tsc", &smp_tsc); -#endif - -static void tsc_freq_changed(void *arg, const struct cf_level *level, - int status); -static void tsc_freq_changing(void *arg, const struct cf_level *level, - int *status); -static unsigned tsc_get_timecount(struct timecounter *tc); -static void tsc_levels_changed(void *arg, int unit); - -static struct timecounter tsc_timecounter = { - tsc_get_timecount, /* get_timecount */ - 0, /* no poll_pps */ - ~0u, /* counter_mask */ - 0, /* frequency */ - "TSC", /* name */ - 800, /* quality (adjusted in code) */ -}; - -void -init_TSC(void) -{ - u_int64_t tscval[2]; - - if (cpu_feature & CPUID_TSC) - tsc_present = 1; - else - tsc_present = 0; - - if (!tsc_present) - return; - - if (bootverbose) - printf("Calibrating TSC clock ... "); - - tscval[0] = rdtsc(); - DELAY(1000000); - tscval[1] = rdtsc(); - - tsc_freq = tscval[1] - tscval[0]; - if (bootverbose) - printf("TSC clock: %ju Hz\n", (intmax_t)tsc_freq); - - switch (cpu_vendor_id) { - case CPU_VENDOR_AMD: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - CPUID_TO_FAMILY(cpu_id) >= 0x10 || cpu_id == 0x60fb2) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_INTEL: - if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xe) || - (CPUID_TO_FAMILY(cpu_id) == 0xf && - CPUID_TO_MODEL(cpu_id) >= 0x3)) - tsc_is_invariant = 1; - break; - case CPU_VENDOR_CENTAUR: - if (CPUID_TO_FAMILY(cpu_id) == 0x6 && - CPUID_TO_MODEL(cpu_id) >= 0xf && - (rdmsr(0x1203) & 0x100000000ULL) == 0) - tsc_is_invariant = 1; - break; - } - - /* - * Inform CPU accounting about our boot-time clock rate. This will - * be updated if someone loads a cpufreq driver after boot that - * discovers a new max frequency. - */ - set_cputicker(rdtsc, tsc_freq, 1); - - if (tsc_is_invariant) - return; - - /* Register to find out about changes in CPU frequency. */ - tsc_pre_tag = EVENTHANDLER_REGISTER(cpufreq_pre_change, - tsc_freq_changing, NULL, EVENTHANDLER_PRI_FIRST); - tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change, - tsc_freq_changed, NULL, EVENTHANDLER_PRI_FIRST); - tsc_levels_tag = EVENTHANDLER_REGISTER(cpufreq_levels_changed, - tsc_levels_changed, NULL, EVENTHANDLER_PRI_ANY); -} - -void -init_TSC_tc(void) -{ - - if (!tsc_present) - return; - - /* - * We can not use the TSC if we support APM. Precise timekeeping - * on an APM'ed machine is at best a fools pursuit, since - * any and all of the time spent in various SMM code can't - * be reliably accounted for. Reading the RTC is your only - * source of reliable time info. The i8254 loses too, of course, - * but we need to have some kind of time... - * We don't know at this point whether APM is going to be used - * or not, nor when it might be activated. Play it safe. - */ - if (power_pm_get_type() == POWER_PM_TYPE_APM) { - tsc_timecounter.tc_quality = -1000; - if (bootverbose) - printf("TSC timecounter disabled: APM enabled.\n"); - } - -#ifdef SMP - /* - * We can not use the TSC in SMP mode unless the TSCs on all CPUs - * are somehow synchronized. Some hardware configurations do - * this, but we have no way of determining whether this is the - * case, so we do not use the TSC in multi-processor systems - * unless the user indicated (by setting kern.timecounter.smp_tsc - * to 1) that he believes that his TSCs are synchronized. - */ - if (mp_ncpus > 1 && !smp_tsc) - tsc_timecounter.tc_quality = -100; -#endif - - if (tsc_freq != 0 && !tsc_is_broken) { - tsc_timecounter.tc_frequency = tsc_freq; - tc_init(&tsc_timecounter); - } -} - -/* - * When cpufreq levels change, find out about the (new) max frequency. We - * use this to update CPU accounting in case it got a lower estimate at boot. - */ -static void -tsc_levels_changed(void *arg, int unit) -{ - device_t cf_dev; - struct cf_level *levels; - int count, error; - uint64_t max_freq; - - /* Only use values from the first CPU, assuming all are equal. */ - if (unit != 0) - return; - - /* Find the appropriate cpufreq device instance. */ - cf_dev = devclass_get_device(devclass_find("cpufreq"), unit); - if (cf_dev == NULL) { - printf("tsc_levels_changed() called but no cpufreq device?\n"); - return; - } - - /* Get settings from the device and find the max frequency. */ - count = 64; - levels = malloc(count * sizeof(*levels), M_TEMP, M_NOWAIT); - if (levels == NULL) - return; - error = CPUFREQ_LEVELS(cf_dev, levels, &count); - if (error == 0 && count != 0) { - max_freq = (uint64_t)levels[0].total_set.freq * 1000000; - set_cputicker(rdtsc, max_freq, 1); - } else - printf("tsc_levels_changed: no max freq found\n"); - free(levels, M_TEMP); -} - -/* - * If the TSC timecounter is in use, veto the pending change. It may be - * possible in the future to handle a dynamically-changing timecounter rate. - */ -static void -tsc_freq_changing(void *arg, const struct cf_level *level, int *status) -{ - - if (*status != 0 || timecounter != &tsc_timecounter) - return; - - printf("timecounter TSC must not be in use when " - "changing frequencies; change denied\n"); - *status = EBUSY; -} - -/* Update TSC freq with the value indicated by the caller. */ -static void -tsc_freq_changed(void *arg, const struct cf_level *level, int status) -{ - - /* If there was an error during the transition, don't do anything. */ - if (status != 0) - return; - - /* Total setting for this level gives the new frequency in MHz. */ - tsc_freq = (uint64_t)level->total_set.freq * 1000000; - tsc_timecounter.tc_frequency = tsc_freq; -} - -static int -sysctl_machdep_tsc_freq(SYSCTL_HANDLER_ARGS) -{ - int error; - uint64_t freq; - - if (tsc_timecounter.tc_frequency == 0) - return (EOPNOTSUPP); - freq = tsc_freq; - error = sysctl_handle_quad(oidp, &freq, 0, req); - if (error == 0 && req->newptr != NULL) { - tsc_freq = freq; - tsc_timecounter.tc_frequency = tsc_freq; - } - return (error); -} - -SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_QUAD | CTLFLAG_RW, - 0, 0, sysctl_machdep_tsc_freq, "QU", ""); - -static unsigned -tsc_get_timecount(struct timecounter *tc) -{ - return (rdtsc()); -} diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c new file mode 100644 index 0000000..ae2cba4 --- /dev/null +++ b/sys/x86/x86/tsc.c @@ -0,0 +1,281 @@ +/*- + * Copyright (c) 1998-2003 Poul-Henning Kamp + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_clock.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cpufreq_if.h" + +uint64_t tsc_freq; +int tsc_is_broken; +int tsc_is_invariant; +int tsc_present; +static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; + +SYSCTL_INT(_kern_timecounter, OID_AUTO, invariant_tsc, CTLFLAG_RDTUN, + &tsc_is_invariant, 0, "Indicates whether the TSC is P-state invariant"); +TUNABLE_INT("kern.timecounter.invariant_tsc", &tsc_is_invariant); + +#ifdef SMP +static int smp_tsc; +SYSCTL_INT(_kern_timecounter, OID_AUTO, smp_tsc, CTLFLAG_RDTUN, &smp_tsc, 0, + "Indicates whether the TSC is safe to use in SMP mode"); +TUNABLE_INT("kern.timecounter.smp_tsc", &smp_tsc); +#endif + +static void tsc_freq_changed(void *arg, const struct cf_level *level, + int status); +static void tsc_freq_changing(void *arg, const struct cf_level *level, + int *status); +static unsigned tsc_get_timecount(struct timecounter *tc); +static void tsc_levels_changed(void *arg, int unit); + +static struct timecounter tsc_timecounter = { + tsc_get_timecount, /* get_timecount */ + 0, /* no poll_pps */ + ~0u, /* counter_mask */ + 0, /* frequency */ + "TSC", /* name */ + 800, /* quality (adjusted in code) */ +}; + +void +init_TSC(void) +{ + u_int64_t tscval[2]; + + if (cpu_feature & CPUID_TSC) + tsc_present = 1; + else + tsc_present = 0; + + if (!tsc_present) + return; + + if (bootverbose) + printf("Calibrating TSC clock ... "); + + tscval[0] = rdtsc(); + DELAY(1000000); + tscval[1] = rdtsc(); + + tsc_freq = tscval[1] - tscval[0]; + if (bootverbose) + printf("TSC clock: %ju Hz\n", (intmax_t)tsc_freq); + + switch (cpu_vendor_id) { + case CPU_VENDOR_AMD: + if ((amd_pminfo & AMDPM_TSC_INVARIANT) || + CPUID_TO_FAMILY(cpu_id) >= 0x10 || cpu_id == 0x60fb2) + tsc_is_invariant = 1; + break; + case CPU_VENDOR_INTEL: + if ((amd_pminfo & AMDPM_TSC_INVARIANT) || + (CPUID_TO_FAMILY(cpu_id) == 0x6 && + CPUID_TO_MODEL(cpu_id) >= 0xe) || + (CPUID_TO_FAMILY(cpu_id) == 0xf && + CPUID_TO_MODEL(cpu_id) >= 0x3)) + tsc_is_invariant = 1; + break; + case CPU_VENDOR_CENTAUR: + if (CPUID_TO_FAMILY(cpu_id) == 0x6 && + CPUID_TO_MODEL(cpu_id) >= 0xf && + (rdmsr(0x1203) & 0x100000000ULL) == 0) + tsc_is_invariant = 1; + break; + } + + /* + * Inform CPU accounting about our boot-time clock rate. This will + * be updated if someone loads a cpufreq driver after boot that + * discovers a new max frequency. + */ + set_cputicker(rdtsc, tsc_freq, 1); + + if (tsc_is_invariant) + return; + + /* Register to find out about changes in CPU frequency. */ + tsc_pre_tag = EVENTHANDLER_REGISTER(cpufreq_pre_change, + tsc_freq_changing, NULL, EVENTHANDLER_PRI_FIRST); + tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change, + tsc_freq_changed, NULL, EVENTHANDLER_PRI_FIRST); + tsc_levels_tag = EVENTHANDLER_REGISTER(cpufreq_levels_changed, + tsc_levels_changed, NULL, EVENTHANDLER_PRI_ANY); +} + +void +init_TSC_tc(void) +{ + + if (!tsc_present) + return; + + /* + * We can not use the TSC if we support APM. Precise timekeeping + * on an APM'ed machine is at best a fools pursuit, since + * any and all of the time spent in various SMM code can't + * be reliably accounted for. Reading the RTC is your only + * source of reliable time info. The i8254 loses too, of course, + * but we need to have some kind of time... + * We don't know at this point whether APM is going to be used + * or not, nor when it might be activated. Play it safe. + */ + if (power_pm_get_type() == POWER_PM_TYPE_APM) { + tsc_timecounter.tc_quality = -1000; + if (bootverbose) + printf("TSC timecounter disabled: APM enabled.\n"); + } + +#ifdef SMP + /* + * We can not use the TSC in SMP mode unless the TSCs on all CPUs + * are somehow synchronized. Some hardware configurations do + * this, but we have no way of determining whether this is the + * case, so we do not use the TSC in multi-processor systems + * unless the user indicated (by setting kern.timecounter.smp_tsc + * to 1) that he believes that his TSCs are synchronized. + */ + if (mp_ncpus > 1 && !smp_tsc) + tsc_timecounter.tc_quality = -100; +#endif + + if (tsc_freq != 0 && !tsc_is_broken) { + tsc_timecounter.tc_frequency = tsc_freq; + tc_init(&tsc_timecounter); + } +} + +/* + * When cpufreq levels change, find out about the (new) max frequency. We + * use this to update CPU accounting in case it got a lower estimate at boot. + */ +static void +tsc_levels_changed(void *arg, int unit) +{ + device_t cf_dev; + struct cf_level *levels; + int count, error; + uint64_t max_freq; + + /* Only use values from the first CPU, assuming all are equal. */ + if (unit != 0) + return; + + /* Find the appropriate cpufreq device instance. */ + cf_dev = devclass_get_device(devclass_find("cpufreq"), unit); + if (cf_dev == NULL) { + printf("tsc_levels_changed() called but no cpufreq device?\n"); + return; + } + + /* Get settings from the device and find the max frequency. */ + count = 64; + levels = malloc(count * sizeof(*levels), M_TEMP, M_NOWAIT); + if (levels == NULL) + return; + error = CPUFREQ_LEVELS(cf_dev, levels, &count); + if (error == 0 && count != 0) { + max_freq = (uint64_t)levels[0].total_set.freq * 1000000; + set_cputicker(rdtsc, max_freq, 1); + } else + printf("tsc_levels_changed: no max freq found\n"); + free(levels, M_TEMP); +} + +/* + * If the TSC timecounter is in use, veto the pending change. It may be + * possible in the future to handle a dynamically-changing timecounter rate. + */ +static void +tsc_freq_changing(void *arg, const struct cf_level *level, int *status) +{ + + if (*status != 0 || timecounter != &tsc_timecounter) + return; + + printf("timecounter TSC must not be in use when " + "changing frequencies; change denied\n"); + *status = EBUSY; +} + +/* Update TSC freq with the value indicated by the caller. */ +static void +tsc_freq_changed(void *arg, const struct cf_level *level, int status) +{ + + /* If there was an error during the transition, don't do anything. */ + if (status != 0) + return; + + /* Total setting for this level gives the new frequency in MHz. */ + tsc_freq = (uint64_t)level->total_set.freq * 1000000; + tsc_timecounter.tc_frequency = tsc_freq; +} + +static int +sysctl_machdep_tsc_freq(SYSCTL_HANDLER_ARGS) +{ + int error; + uint64_t freq; + + if (tsc_timecounter.tc_frequency == 0) + return (EOPNOTSUPP); + freq = tsc_freq; + error = sysctl_handle_quad(oidp, &freq, 0, req); + if (error == 0 && req->newptr != NULL) { + tsc_freq = freq; + tsc_timecounter.tc_frequency = tsc_freq; + } + return (error); +} + +SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_QUAD | CTLFLAG_RW, + 0, 0, sysctl_machdep_tsc_freq, "QU", ""); + +static unsigned +tsc_get_timecount(struct timecounter *tc) +{ + return (rdtsc()); +} -- cgit v1.1 From 1618e3b4d5e6e429c540f28a3ab073035fbe77ae Mon Sep 17 00:00:00 2001 From: yongari Date: Wed, 8 Dec 2010 01:24:05 +0000 Subject: r184610 changed the way how TX frames are handled on AX88178 and AX88772 controllers. ASIX added a new feature for AX88178/AX88772 controllers which allows combining multiple TX frames into a single big frame. This was to overcome one of USB limitation where it can't generate more than 8k interrupts/sec which in turn means USB ethernet controllers can not send more than 8k packets per second. Using ASIX's feature greatly enhanced TX performance(more than 3~4 times) compared to 7.x driver. However it seems r184610 removed boundary checking for buffered frames which in turn caused instability issues under certain conditions. In addition, using ASIX's feature triggered another issue which made USB controller hang under certain conditions. Restarting ethernet controller didn't help under this hang condition and unplugging and replugging the controller was the only solution. I believe there is a silicon bug in TX frame combining feature on AX88178/AX88772 controllers. To address these issues, reintroduce the boundary checking for both AX88178 and AX88772 after copying a frame to USB buffer and do not use ASIX's multiple frame combining feature. Instead, use USB controller's multi-frame transmit capability to enhance TX performance as suggested by Hans[1]. This should fix a long standing axe(4) instability issues reported on AX88772 and AX88178 controllers. While I'm here remove unnecessary TX frame length check since upper stack always guarantee the size of a frame to be less than MCLBYTES. Special thanks to Derrick Brashear who tried numerous patches during last 4 months and waited real fix with patience. Without this enthusiastic support, patience and H/W donation I couldn't fix it since I was not able to trigger the issue on my box. Suggested by: hselasky [1] Tested by: Derrick Brashear (shadow <> gmail dot com> H/W donated by: Derrick Brashear (shadow <> gmail dot com> PR: usb/140883 --- sys/dev/usb/net/if_axe.c | 73 ++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/sys/dev/usb/net/if_axe.c b/sys/dev/usb/net/if_axe.c index 98dac91..8be6fc8 100644 --- a/sys/dev/usb/net/if_axe.c +++ b/sys/dev/usb/net/if_axe.c @@ -200,7 +200,8 @@ static const struct usb_config axe_config[AXE_N_TRANSFER] = { .type = UE_BULK, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, - .bufsize = AXE_BULK_BUF_SIZE, + .frames = 16, + .bufsize = 16 * MCLBYTES, .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, .callback = axe_bulk_write_callback, .timeout = 10000, /* 10 seconds */ @@ -939,7 +940,7 @@ axe_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error) struct ifnet *ifp = uether_getifp(&sc->sc_ue); struct usb_page_cache *pc; struct mbuf *m; - int pos; + int nframes, pos; switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: @@ -956,40 +957,34 @@ tr_setup: */ return; } - pos = 0; - pc = usbd_xfer_get_frame(xfer, 0); - - while (1) { + for (nframes = 0; nframes < 16 && + !IFQ_DRV_IS_EMPTY(&ifp->if_snd); nframes++) { IFQ_DRV_DEQUEUE(&ifp->if_snd, m); - - if (m == NULL) { - if (pos > 0) - break; /* send out data */ - return; - } - if (m->m_pkthdr.len > MCLBYTES) { - m->m_pkthdr.len = MCLBYTES; - } + if (m == NULL) + break; + usbd_xfer_set_frame_offset(xfer, nframes * MCLBYTES, + nframes); + pos = 0; + pc = usbd_xfer_get_frame(xfer, nframes); if (AXE_IS_178_FAMILY(sc)) { - hdr.len = htole16(m->m_pkthdr.len); hdr.ilen = ~hdr.len; - usbd_copy_in(pc, pos, &hdr, sizeof(hdr)); - pos += sizeof(hdr); - - /* - * NOTE: Some drivers force a short packet - * by appending a dummy header with zero - * length at then end of the USB transfer. - * This driver uses the - * USB_FORCE_SHORT_XFER flag instead. - */ + usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); + pos += m->m_pkthdr.len; + if ((pos % 512) == 0) { + hdr.len = 0; + hdr.ilen = 0xffff; + usbd_copy_in(pc, pos, &hdr, + sizeof(hdr)); + pos += sizeof(hdr); + } + } else { + usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); + pos += m->m_pkthdr.len; } - usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); - pos += m->m_pkthdr.len; /* * XXX @@ -1010,22 +1005,16 @@ tr_setup: m_freem(m); - if (AXE_IS_178_FAMILY(sc)) { - if (pos > (AXE_BULK_BUF_SIZE - MCLBYTES - sizeof(hdr))) { - /* send out frame(s) */ - break; - } - } else { - /* send out frame */ - break; - } + /* Set frame length. */ + usbd_xfer_set_frame_len(xfer, nframes, pos); + } + if (nframes != 0) { + usbd_xfer_set_frames(xfer, nframes); + usbd_transfer_submit(xfer); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; } - - usbd_xfer_set_frame_len(xfer, 0, pos); - usbd_transfer_submit(xfer); - ifp->if_drv_flags |= IFF_DRV_OACTIVE; return; - + /* NOTREACHED */ default: /* Error */ DPRINTFN(11, "transfer error, %s\n", usbd_errstr(error)); -- cgit v1.1 From 1512315a5fe190e78dd6b2a2fd25d6783f53d751 Mon Sep 17 00:00:00 2001 From: kevlo Date: Wed, 8 Dec 2010 01:35:19 +0000 Subject: Closing file descriptors when it's done Reviewed by: np --- usr.sbin/cxgbtool/cxgbtool.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/usr.sbin/cxgbtool/cxgbtool.c b/usr.sbin/cxgbtool/cxgbtool.c index b705ff8..f73f1a4 100644 --- a/usr.sbin/cxgbtool/cxgbtool.c +++ b/usr.sbin/cxgbtool/cxgbtool.c @@ -1014,6 +1014,8 @@ load_fw(int argc, char *argv[], int start_arg, const char *iff_name) op.len = len; if (doit(iff_name, CHELSIO_LOAD_FW, &op) < 0) err(1, "load firmware"); + + close(fd); return 0; } @@ -1048,6 +1050,7 @@ load_boot(int argc, char *argv[], int start_arg, const char *iff_name) if (doit(iff_name, CHELSIO_LOAD_BOOT, &op) < 0) err(1, "load boot image"); + close(fd); return 0; } -- cgit v1.1 From ac1ae957345ae3dcbc1a254c812bc7167503fff4 Mon Sep 17 00:00:00 2001 From: hrs Date: Wed, 8 Dec 2010 07:10:25 +0000 Subject: Fix a typo. Submitted by: Garrett Cooper --- share/man/man5/rc.conf.5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5 index 990222f..ec86b43 100644 --- a/share/man/man5/rc.conf.5 +++ b/share/man/man5/rc.conf.5 @@ -1293,7 +1293,7 @@ the default address selection policy table set by will be IPv4-preferred. .Pp This variable is deprecated. Use -.Va ip6addtctl_policy +.Va ip6addrctl_policy instead. .It Va ipv6_activate_all_interfaces If the variable is -- cgit v1.1 From 9bce36c38edb4c76d8a66373ae3ff0d0cc8bd32a Mon Sep 17 00:00:00 2001 From: mm Date: Wed, 8 Dec 2010 08:57:37 +0000 Subject: Do not print OpenSolaris hint to use (non-existing) installgrub(1) command if creating a mirror by attaching a new vdev to a root pool. Reported by: James R. Van Artsdalen (on freebsd-fs@freebsd.org) Approved by: delphij (mentor) MFC after: 3 days --- cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c index d734f2c..fc64b0b 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c @@ -48,11 +48,13 @@ static int read_efi_label(nvlist_t *config, diskaddr_t *sb); +#ifdef sun #if defined(__i386) || defined(__amd64) #define BOOTCMD "installgrub(1M)" #else #define BOOTCMD "installboot(1M)" #endif +#endif /* sun */ /* * ==================================================================== @@ -1888,6 +1890,7 @@ zpool_vdev_attach(zpool_handle_t *zhp, zcmd_free_nvlists(&zc); if (ret == 0) { +#ifdef sun if (rootpool) { /* * XXX - This should be removed once we can @@ -1898,6 +1901,7 @@ zpool_vdev_attach(zpool_handle_t *zhp, "be sure to invoke %s to make '%s' bootable.\n"), BOOTCMD, new_disk); } +#endif /* sun */ return (0); } -- cgit v1.1 From 94551f8622197b7a0cbce550a9d6a732be223df7 Mon Sep 17 00:00:00 2001 From: kevlo Date: Wed, 8 Dec 2010 10:27:07 +0000 Subject: Close fd in initattr() and showattr(). Reviewed by: rwatson --- usr.sbin/extattrctl/extattrctl.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/usr.sbin/extattrctl/extattrctl.c b/usr.sbin/extattrctl/extattrctl.c index 1929f79..377d3ba 100644 --- a/usr.sbin/extattrctl/extattrctl.c +++ b/usr.sbin/extattrctl/extattrctl.c @@ -144,9 +144,11 @@ initattr(int argc, char *argv[]) if (error == -1) { perror(argv[1]); unlink(argv[1]); + close(i); return (-1); } + close(i); return (0); } @@ -168,21 +170,25 @@ showattr(int argc, char *argv[]) i = read(fd, &uef, sizeof(uef)); if (i == -1) { perror(argv[0]); + close(fd); return (-1); } if (i != sizeof(uef)) { fprintf(stderr, "%s: invalid file header\n", argv[0]); + close(fd); return (-1); } if (uef.uef_magic != UFS_EXTATTR_MAGIC) { fprintf(stderr, "%s: bad magic\n", argv[0]); + close(fd); return (-1); } printf("%s: version %d, size %d\n", argv[0], uef.uef_version, uef.uef_size); + close(fd); return (0); } -- cgit v1.1 From 6e855a313aac604a57c7b9d8561a9a4e5c2f6666 Mon Sep 17 00:00:00 2001 From: mm Date: Wed, 8 Dec 2010 13:51:25 +0000 Subject: Print message with information about updating the boot code if a new vdev is attached to a root pool (e.g. when creating a mirrored boot pool). Reviewed by: pav Approved by: delphij (mentor) MFC after: 3 days --- .../opensolaris/lib/libzfs/common/libzfs_pool.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c index fc64b0b..c7edd2e 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c @@ -1890,18 +1890,17 @@ zpool_vdev_attach(zpool_handle_t *zhp, zcmd_free_nvlists(&zc); if (ret == 0) { -#ifdef sun if (rootpool) { - /* - * XXX - This should be removed once we can - * automatically install the bootblocks on the - * newly attached disk. - */ - (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "Please " - "be sure to invoke %s to make '%s' bootable.\n"), - BOOTCMD, new_disk); + (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "If " + "you boot from pool '%s', you may need to update\n" + "boot code on newly attached disk '%s'.\n\n" + "Assuming you use GPT partitioning and 'da0' is " + "your new boot disk\n" + "you may use the following command:\n\n" + "\tgpart bootcode -b /boot/pmbr -p " + "/boot/gptzfsboot -i 1 da0\n\n"), + zhp->zpool_name, new_disk); } -#endif /* sun */ return (0); } -- cgit v1.1 From ed79f703fb1803e10222fccd98100334741138ff Mon Sep 17 00:00:00 2001 From: syrinx Date: Wed, 8 Dec 2010 13:51:38 +0000 Subject: In bsnmpd(1) add support for SNMPv3 message processing model, including message authentication, packet encryption & view-based access control (RFC 3412, 3414, 3415). Sponsored by: The FreeBSD Foundation Reviewed by: philip@ (mostly) Approved by: philip@ --- contrib/bsnmp/lib/asn1.c | 18 +- contrib/bsnmp/lib/asn1.h | 3 +- contrib/bsnmp/lib/bsnmpclient.3 | 91 ++- contrib/bsnmp/lib/bsnmplib.3 | 233 ++++++- contrib/bsnmp/lib/snmp.c | 551 ++++++++++++--- contrib/bsnmp/lib/snmp.h | 145 +++- contrib/bsnmp/lib/snmpagent.c | 58 +- contrib/bsnmp/lib/snmpclient.c | 131 +++- contrib/bsnmp/lib/snmpclient.h | 52 +- contrib/bsnmp/lib/snmppriv.h | 12 +- contrib/bsnmp/snmp_usm/snmp_usm.3 | 132 ++++ contrib/bsnmp/snmp_usm/usm_snmp.c | 614 +++++++++++++++++ contrib/bsnmp/snmp_usm/usm_tree.def | 109 +++ contrib/bsnmp/snmp_vacm/snmp_vacm.3 | 94 +++ contrib/bsnmp/snmp_vacm/vacm_snmp.c | 1026 ++++++++++++++++++++++++++++ contrib/bsnmp/snmp_vacm/vacm_tree.def | 104 +++ contrib/bsnmp/snmpd/BEGEMOT-SNMPD.txt | 3 +- contrib/bsnmp/snmpd/action.c | 175 +++++ contrib/bsnmp/snmpd/bsnmpd.1 | 16 +- contrib/bsnmp/snmpd/config.c | 22 +- contrib/bsnmp/snmpd/export.c | 1 + contrib/bsnmp/snmpd/main.c | 923 ++++++++++++++++++++++++- contrib/bsnmp/snmpd/snmpd.h | 15 +- contrib/bsnmp/snmpd/snmpmod.3 | 102 ++- contrib/bsnmp/snmpd/snmpmod.h | 128 +++- contrib/bsnmp/snmpd/trans_lsock.c | 1 + contrib/bsnmp/snmpd/trans_udp.c | 1 + contrib/bsnmp/snmpd/trap.c | 1 + contrib/bsnmp/snmpd/tree.def | 10 + lib/libbsnmp/libbsnmp/Makefile | 11 +- usr.sbin/bsnmpd/bsnmpd/Makefile | 8 +- usr.sbin/bsnmpd/modules/Makefile | 2 + usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c | 1 + usr.sbin/bsnmpd/modules/snmp_usm/Makefile | 22 + usr.sbin/bsnmpd/modules/snmp_vacm/Makefile | 20 + 35 files changed, 4578 insertions(+), 257 deletions(-) create mode 100755 contrib/bsnmp/snmp_usm/snmp_usm.3 create mode 100755 contrib/bsnmp/snmp_usm/usm_snmp.c create mode 100755 contrib/bsnmp/snmp_usm/usm_tree.def create mode 100755 contrib/bsnmp/snmp_vacm/snmp_vacm.3 create mode 100755 contrib/bsnmp/snmp_vacm/vacm_snmp.c create mode 100755 contrib/bsnmp/snmp_vacm/vacm_tree.def create mode 100755 usr.sbin/bsnmpd/modules/snmp_usm/Makefile create mode 100755 usr.sbin/bsnmpd/modules/snmp_vacm/Makefile diff --git a/contrib/bsnmp/lib/asn1.c b/contrib/bsnmp/lib/asn1.c index 16b523d..4d9704f 100644 --- a/contrib/bsnmp/lib/asn1.c +++ b/contrib/bsnmp/lib/asn1.c @@ -196,7 +196,7 @@ asn_put_temp_header(struct asn_buf *b, u_char type, u_char **ptr) return (ret); } enum asn_err -asn_commit_header(struct asn_buf *b, u_char *ptr) +asn_commit_header(struct asn_buf *b, u_char *ptr, size_t *moved) { asn_len_t len; u_int lenlen, shift; @@ -215,6 +215,8 @@ asn_commit_header(struct asn_buf *b, u_char *ptr) memmove(ptr + 1 + lenlen, ptr + TEMP_LEN, len); b->asn_ptr -= shift; b->asn_len += shift; + if (moved != NULL) + *moved = shift; } return (ASN_ERR_OK); } @@ -913,6 +915,20 @@ asn_skip(struct asn_buf *b, asn_len_t len) } /* + * Add a padding + */ +enum asn_err +asn_pad(struct asn_buf *b, asn_len_t len) +{ + if (b->asn_len < len) + return (ASN_ERR_EOBUF); + b->asn_ptr += len; + b->asn_len -= len; + + return (ASN_ERR_OK); +} + +/* * Compare two OIDs. * * o1 < o2 : -1 diff --git a/contrib/bsnmp/lib/asn1.h b/contrib/bsnmp/lib/asn1.h index 5748b14..cf9a727 100644 --- a/contrib/bsnmp/lib/asn1.h +++ b/contrib/bsnmp/lib/asn1.h @@ -93,7 +93,7 @@ enum asn_err asn_get_header(struct asn_buf *, u_char *, asn_len_t *); enum asn_err asn_put_header(struct asn_buf *, u_char, asn_len_t); enum asn_err asn_put_temp_header(struct asn_buf *, u_char, u_char **); -enum asn_err asn_commit_header(struct asn_buf *, u_char *); +enum asn_err asn_commit_header(struct asn_buf *, u_char *, size_t *); enum asn_err asn_get_integer_raw(struct asn_buf *, asn_len_t, int32_t *); enum asn_err asn_get_integer(struct asn_buf *, int32_t *); @@ -129,6 +129,7 @@ enum asn_err asn_get_timeticks(struct asn_buf *, uint32_t *); enum asn_err asn_put_timeticks(struct asn_buf *, uint32_t); enum asn_err asn_skip(struct asn_buf *, asn_len_t); +enum asn_err asn_pad(struct asn_buf *, asn_len_t); /* * Utility functions for OIDs diff --git a/contrib/bsnmp/lib/bsnmpclient.3 b/contrib/bsnmp/lib/bsnmpclient.3 index 870f546..5fe9a9a 100644 --- a/contrib/bsnmp/lib/bsnmpclient.3 +++ b/contrib/bsnmp/lib/bsnmpclient.3 @@ -31,7 +31,7 @@ .\" .\" $Begemot: bsnmp/lib/bsnmpclient.3,v 1.12 2005/10/04 08:46:50 brandt_h Exp $ .\" -.Dd October 4, 2005 +.Dd September 9, 2010 .Dt BSNMPCLIENT 3 .Os .Sh NAME @@ -52,7 +52,8 @@ .Nm snmp_table_cb_f , .Nm snmp_table_fetch , .Nm snmp_table_fetch_async , -.Nm snmp_dialog +.Nm snmp_dialog , +.Nm snmp_discover_engine .Nd "SNMP client library" .Sh LIBRARY Begemot SNMP library @@ -102,44 +103,56 @@ Begemot SNMP library .Fn snmp_table_fetch_async "const struct snmp_table *descr" "void *list" "snmp_table_cb_f callback" "void *uarg" .Ft int .Fn snmp_dialog "struct snmp_pdu *req" "struct snmp_pdu *resp" +.Ft int +.Fn snmp_discover_engine "void" .Sh DESCRIPTION The SNMP library contains routines to easily build SNMP client applications -that use SNMP versions 1 or 2. +that use SNMP versions 1, 2 or 3. Most of the routines use a .Vt struct snmp_client : .Bd -literal -offset indent struct snmp_client { - enum snmp_version version; - int trans; /* transport type to use */ + enum snmp_version version; + int trans; /* which transport to use */ /* these two are read-only for the application */ - char *cport; /* port number as string */ - char *chost; /* host name or IP address as string */ + char *cport; /* port number as string */ + char *chost; /* host name or IP address as string */ + + char read_community[SNMP_COMMUNITY_MAXLEN + 1]; + char write_community[SNMP_COMMUNITY_MAXLEN + 1]; + + /* SNMPv3 specific fields */ + int32_t identifier; + int32_t security_model; + struct snmp_engine engine; + struct snmp_user user; - char read_community[SNMP_COMMUNITY_MAXLEN + 1]; - char write_community[SNMP_COMMUNITY_MAXLEN + 1]; + /* SNMPv3 Access control - VACM*/ + uint32_t clen; + uint8_t cengine[SNMP_ENGINE_ID_SIZ]; + char cname[SNMP_CONTEXT_NAME_SIZ]; - struct timeval timeout; - u_int retries; + struct timeval timeout; + u_int retries; - int dump_pdus; + int dump_pdus; - size_t txbuflen; - size_t rxbuflen; + size_t txbuflen; + size_t rxbuflen; - int fd; + int fd; - int32_t next_reqid; - int32_t max_reqid; - int32_t min_reqid; + int32_t next_reqid; + int32_t max_reqid; + int32_t min_reqid; - char error[SNMP_STRERROR_LEN]; + char error[SNMP_STRERROR_LEN]; - snmp_timeout_start_f timeout_start; - snmp_timeout_stop_f timeout_stop; + snmp_timeout_start_f timeout_start; + snmp_timeout_stop_f timeout_stop; - /* private */ - char local_path[sizeof(SNMP_LOCAL_PATH)]; + char local_path[sizeof(SNMP_LOCAL_PATH)]; }; .Ed .Pp @@ -194,6 +207,23 @@ The default is The community name to be used for SET requests. The default is .Sq private . +.It Va identifier +The message indentifier value to be used with SNMPv3 PDUs. Incremented with +each transmitted PDU. +.It Va security_model +The security model to be used with SNMPv3 PDUs. Currently only User-Based +Security model specified by RFC 3414 (value 3) is supported. +.It Va engine +The authorative SNMP engine parameters to be used with SNMPv3 PDUs. +.It Va user +The USM SNMP user credentials to be used with SNMPv3 PDUs. +.It Va clen +The length of the context engine id to be used with SNMPv3 PDUs. +.It Va cengine +The context engine id to be used with SNMPv3 PDUs. Default is empty. +.It Va cname +The context name to be used with SNMPv3 PDUs. Default is +.Sq "" . .It Va timeout The maximum time to wait for responses to requests. If the time elapses, the request is resent up to @@ -617,6 +647,21 @@ returns -1. If a response was received 0 is returned. .Pp The function +.Fn snmp_discover_engine +is used to discover the authorative snmpEngineId of a remote SNMPv3 agent. +A request PDU with empty USM user name is sent and the client's engine +parameters are set according to the snmpEngine parameters received in the +response PDU. +If the client is configured to use authentication and/or privacy and the +snmpEngineBoots and/or snmpEngineTime in the response had zero values, an +additional request (possibly encrypted) with the appropriate user credentials +is sent to fetch the missing values. +Note, that the function blocks until the discovery proccess is completed. +If no response could be received after all timeouts and retries, or the +response contained errors the function returns -1. +If the discovery proccess was completed 0 is returned. +.Pp +The function .Fn snmp_parse_server is used to parse an SNMP server specification string and fill in the fields of a diff --git a/contrib/bsnmp/lib/bsnmplib.3 b/contrib/bsnmp/lib/bsnmplib.3 index dfbffc4..af36879 100644 --- a/contrib/bsnmp/lib/bsnmplib.3 +++ b/contrib/bsnmp/lib/bsnmplib.3 @@ -1,4 +1,10 @@ .\" +.\" Copyright (c) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" Portions of this documentation were written by Shteryana Sotirova Shopova +.\" under sponsorship from the FreeBSD Foundation. +.\" .\" Copyright (c) 2004-2005 .\" Hartmut Brandt. .\" All rights reserved. @@ -31,7 +37,7 @@ .\" .\" $Begemot: bsnmp/lib/bsnmplib.3,v 1.9 2005/10/04 08:46:51 brandt_h Exp $ .\" -.Dd October 4, 2005 +.Dd September 9, 2010 .Dt BSNMPLIB 3 .Os .Sh NAME @@ -39,9 +45,15 @@ .Nm snmp_value_parse , .Nm snmp_value_copy , .Nm snmp_pdu_free , -.Nm snmp_code snmp_pdu_decode , -.Nm snmp_code snmp_pdu_encode , +.Nm snmp_pdu_decode , +.Nm snmp_pdu_encode , +.Nm snmp_pdu_decode_header , +.Nm snmp_pdu_decode_scoped , +.Nm snmp_pdu_decode_secmode , .Nm snmp_pdu_dump , +.Nm snmp_passwd_to_keys , +.Nm snmp_get_local_keys , +.Nm snmp_calc_keychange , .Nm TRUTH_MK , .Nm TRUTH_GET , .Nm TRUTH_OK @@ -64,8 +76,20 @@ Begemot SNMP library .Fn snmp_pdu_decode "struct asn_buf *buf" "struct snmp_pdu *pdu" "int32_t *ip" .Ft enum snmp_code .Fn snmp_pdu_encode "struct snmp_pdu *pdu" "struct asn_buf *buf" +.Ft enum snmp_code +.Fn snmp_pdu_decode_header "struct snmp_pdu *pdu" "struct asn_buf *buf" +.Ft enum snmp_code +.Fn snmp_pdu_decode_scoped "struct asn_buf *buf" "struct snmp_pdu *pdu" "int32_t *ip" +.Ft enum snmp_code +.Fn snmp_pdu_decode_secmode "struct asn_buf *buf" "struct snmp_pdu *pdu" .Ft void .Fn snmp_pdu_dump "const struct snmp_pdu *pdu" +.Ft enum snmp_code +.Fn snmp_passwd_to_keys "struct snmp_user *user" "char *passwd" +.Ft enum snmp_code +.Fn snmp_get_local_keys "struct snmp_user *user" "uint8_t *eid" "uint32_t elen" +.Ft enum snmp_code +.Fn snmp_calc_keychange "struct snmp_user *user" "uint8_t *keychange" .Ft int .Fn TRUTH_MK "F" .Ft int @@ -73,8 +97,8 @@ Begemot SNMP library .Ft int .Fn TRUTH_OK "T" .Sh DESCRIPTION -The SNMP library contains routines to handle SNMP version 1 and 2 PDUs. -There are two basic structures used throughout the library: +The SNMP library contains routines to handle SNMP version 1, 2 and 3 PDUs. +There are several basic structures used throughout the library: .Bd -literal -offset indent struct snmp_value { struct asn_oid var; @@ -134,34 +158,126 @@ is not zero, .Fa v.octetstring.octets points to a string allocated by .Xr malloc 3 . +.Pp +.Bd -literal -offset indent +#define SNMP_ENGINE_ID_SIZ 32 + +struct snmp_engine { + uint8_t engine_id[SNMP_ENGINE_ID_SIZ]; + uint32_t engine_len; + int32_t engine_boots; + int32_t engine_time; + int32_t max_msg_size; +}; +.Ed +.Pp +This structure represents an SNMP engine as specified by the SNMP Management +Architecture described in RFC 3411. +.Pp +.Bd -literal -offset indent +#define SNMP_USM_NAME_SIZ (32 + 1) +#define SNMP_AUTH_KEY_SIZ 40 +#define SNMP_PRIV_KEY_SIZ 32 + +struct snmp_user { + char sec_name[SNMP_USM_NAME_SIZ]; + enum snmp_authentication auth_proto; + enum snmp_privacy priv_proto; + uint8_t auth_key[SNMP_AUTH_KEY_SIZ]; + uint8_t priv_key[SNMP_PRIV_KEY_SIZ]; +}; +.Ed +.Pp +This structure represents an SNMPv3 user as specified by the User-based +Security Model (USM) described in RFC 3414. The field +.Fa sec_name +is a human readable string containing the security user name. +.Fa auth_proto +contains the id of the authentication protocol in use by the user and may be one +of: +.Bd -literal -offset indent +enum snmp_authentication { + SNMP_AUTH_NOAUTH = 0, + SNMP_AUTH_HMAC_MD5, + SNMP_AUTH_HMAC_SHA +}; +.Ed +.Fa priv_proto +contains the id of the privacy protocol in use by the user and may be one +of: +.Bd -literal -offset indent +enum snmp_privacy { + SNMP_PRIV_NOPRIV = 0, + SNMP_PRIV_DES = 1, + SNMP_PRIV_AES +}; +.Ed +.Fa auth_key +and +.Fa priv_key +contain the authentication and privacy keys for the user. +.Pp .Bd -literal -offset indent -#define SNMP_COMMUNITY_MAXLEN 128 -#define SNMP_MAX_BINDINGS 100 +#define SNMP_COMMUNITY_MAXLEN 128 +#define SNMP_MAX_BINDINGS 100 +#define SNMP_CONTEXT_NAME_SIZ (32 + 1) +#define SNMP_TIME_WINDOW 150 + +#define SNMP_USM_AUTH_SIZE 12 +#define SNMP_USM_PRIV_SIZE 8 + +#define SNMP_MSG_AUTH_FLAG 0x1 +#define SNMP_MSG_PRIV_FLAG 0x2 +#define SNMP_MSG_REPORT_FLAG 0x4 + +#define SNMP_SECMODEL_USM 3 struct snmp_pdu { - char community[SNMP_COMMUNITY_MAXLEN + 1]; - enum snmp_version version; - u_int type; + char community[SNMP_COMMUNITY_MAXLEN + 1]; + enum snmp_version version; + u_int type; + + /* SNMPv3 PDU header fields */ + int32_t identifier; + uint8_t flags; + int32_t security_model; + struct snmp_engine engine; + + /* Associated USM user parameters */ + struct snmp_user user; + uint8_t msg_digest[SNMP_USM_AUTH_SIZE]; + uint8_t msg_salt[SNMP_USM_PRIV_SIZE]; + + /* View-based Access Model */ + uint32_t context_engine_len; + uint8_t context_engine[SNMP_ENGINE_ID_SIZ]; + char context_name[SNMP_CONTEXT_NAME_SIZ]; /* trap only */ - struct asn_oid enterprise; - u_char agent_addr[4]; - int32_t generic_trap; - int32_t specific_trap; - u_int32_t time_stamp; + struct asn_oid enterprise; + u_char agent_addr[4]; + int32_t generic_trap; + int32_t specific_trap; + uint32_t time_stamp; /* others */ - int32_t request_id; - int32_t error_status; - int32_t error_index; + int32_t request_id; + int32_t error_status; + int32_t error_index; /* fixes for encoding */ - u_char *outer_ptr; - u_char *pdu_ptr; - u_char *vars_ptr; + size_t outer_len; + size_t scoped_len; + u_char *outer_ptr; + u_char *digest_ptr; + u_char *encrypted_ptr; + u_char *scoped_ptr; + u_char *pdu_ptr; + u_char *vars_ptr; + - struct snmp_value bindings[SNMP_MAX_BINDINGS]; - u_int nbindings; + struct snmp_value bindings[SNMP_MAX_BINDINGS]; + u_int nbindings; }; .Ed This structure contains a decoded SNMP PDU. @@ -172,11 +288,15 @@ enum snmp_version { SNMP_Verr = 0, SNMP_V1 = 1, SNMP_V2c, + SNMP_V3 }; .Ed and .Fa type is the type of the PDU. +.Fa security_model +is the security model used for SNMPv3 PDUs. The only supported +value currently is 3 (User-based Security Model). .Pp The function .Fn snmp_value_free @@ -223,15 +343,60 @@ The function .Fn snmp_pdu_encode encodes the PDU .Fa pdu -into the an octetstring in buffer +into the an octetstring in buffer, and if authentication and privacy are used, +calculates a message digest and encrypts the PDU data in the buffer +.Fa buf . +.Pp +The function +.Fn snmp_pdu_decode_header +decodes the header of the PDU pointed to by +.Fa buf . +The uncoded PDU contents remain in the buffer. +.Pp +The function +.Fn snmp_pdu_decode_scoped +decodes the scoped PDU pointed to by .Fa buf . .Pp The function +.Fn snmp_pdu_decode_secmode +verifies the authentication parameter contained in the PDU (if present) and +if the PDU is encrypted, decrypts the PDU contents pointed to by +.Fa buf . +If successfull, a plain text scoped PDU is stored in the buffer. +.Pp +The function .Fn snmp_pdu_dump dumps the PDU in a human readable form by calling .Fn snmp_printf . .Pp The function +.Fn snmp_passwd_to_keys +calculates a binary private authentication key corresponding to a plain text human +readable password string. The calculated key is placed in the +.Fa auth_key +field of the +.Fa user . +.Pp +The function +.Fn snmp_get_local_keys +calculates a localazied authentication and privacy keys for a specified SNMPv3 +engine. The calculateds keys are placed in the +.Fa auth_key +and +.Fa priv_key +fields of the +.Fa user . +.Pp +The function +.Fn snmp_calc_keychange +calculates a binary key change octet string based on the contents of an old and +a new binary localized key. The rezult is placed in the buffer pointer to by +.Fa keychange +and may be used by an SNMPv3 user who wishes to change his/her password +or localized key. +.Pp +The function .Fn TRUTH_MK takes a C truth value (zero or non-zero) and makes an SNMP truth value (2 or 1). The function @@ -281,6 +446,13 @@ A variable binding value was out of the allowed range. The PDU is of an unsupported version. .It Bq Er SNMP_CODE_BADENQ There was an ASN.1 value with an unsupported tag. +.It Bq Er SNMP_CODE_BADSECLEVEL +The requested securityLevel contained in the PDU is not supported. +.It Bq Er SNMP_CODE_BADDIGEST +The PDU authentication parameter received in the PDU did not match the +calculated message digest. +.It Bq Er SNMP_CODE_EDECRYPT +Error occured while trying to decrypt the PDU. .El .Pp .Fn snmp_pdu_encode @@ -297,8 +469,21 @@ Encoding failed. .Xr bsnmpagent 3 , .Xr bsnmpclient 3 , .Xr bsnmplib 3 +.Sh CAVEAT +The SNMPv3 message digests, encryption and decryption, and key routines use +the cryptographic functions from +.Xr crypto 3 . +The library may optionally be built without references to the +.Xr crypto 3 +library. In such case only plain text SNMPv3 PDUs without message digests +may be proccessed correctly. .Sh STANDARDS This implementation conforms to the applicable IETF RFCs and ITU-T recommendations. .Sh AUTHORS +The Begemot SNMP library was originally written by .An Hartmut Brandt Aq harti@FreeBSD.org +.Pp +.An Shteryana Shopova Aq syrinx@FreeBSD.org +added support for the SNMPv3 message proccessing and User-Based +Security model message authentication and privacy. diff --git a/contrib/bsnmp/lib/snmp.c b/contrib/bsnmp/lib/snmp.c index b2700b1..322ac9f 100644 --- a/contrib/bsnmp/lib/snmp.c +++ b/contrib/bsnmp/lib/snmp.c @@ -5,6 +5,12 @@ * * Author: Harti Brandt * + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by Shteryana Sotirova Shopova + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -271,47 +277,310 @@ parse_pdus(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *ip) return (err); } + +static enum asn_err +parse_secparams(struct asn_buf *b, struct snmp_pdu *pdu) +{ + asn_len_t octs_len; + u_char buf[256]; /* XXX: calc max possible size here */ + struct asn_buf tb; + + memset(buf, 0, 256); + tb.asn_ptr = buf; + tb.asn_len = 256; + + if (asn_get_octetstring(b, buf, &tb.asn_len) != ASN_ERR_OK) { + snmp_error("cannot parse usm header"); + return (ASN_ERR_FAILED); + } + + if (asn_get_sequence(&tb, &octs_len) != ASN_ERR_OK) { + snmp_error("cannot decode usm header"); + return (ASN_ERR_FAILED); + } + + octs_len = SNMP_ENGINE_ID_SIZ; + if (asn_get_octetstring(&tb, (u_char *)&pdu->engine.engine_id, + &octs_len) != ASN_ERR_OK) { + snmp_error("cannot decode msg engine id"); + return (ASN_ERR_FAILED); + } + pdu->engine.engine_len = octs_len; + + if (asn_get_integer(&tb, &pdu->engine.engine_boots) != ASN_ERR_OK) { + snmp_error("cannot decode msg engine boots"); + return (ASN_ERR_FAILED); + } + + if (asn_get_integer(&tb, &pdu->engine.engine_time) != ASN_ERR_OK) { + snmp_error("cannot decode msg engine time"); + return (ASN_ERR_FAILED); + } + + octs_len = SNMP_ADM_STR32_SIZ - 1; + if (asn_get_octetstring(&tb, (u_char *)&pdu->user.sec_name, &octs_len) + != ASN_ERR_OK) { + snmp_error("cannot decode msg user name"); + return (ASN_ERR_FAILED); + } + pdu->user.sec_name[octs_len] = '\0'; + + octs_len = sizeof(pdu->msg_digest); + if (asn_get_octetstring(&tb, (u_char *)&pdu->msg_digest, &octs_len) != + ASN_ERR_OK || ((pdu->flags & SNMP_MSG_AUTH_FLAG) != 0 && + octs_len != sizeof(pdu->msg_digest))) { + snmp_error("cannot decode msg authentication param"); + return (ASN_ERR_FAILED); + } + + octs_len = sizeof(pdu->msg_salt); + if (asn_get_octetstring(&tb, (u_char *)&pdu->msg_salt, &octs_len) != + ASN_ERR_OK ||((pdu->flags & SNMP_MSG_PRIV_FLAG) != 0 && + octs_len != sizeof(pdu->msg_salt))) { + snmp_error("cannot decode msg authentication param"); + return (ASN_ERR_FAILED); + } + + if ((pdu->flags & SNMP_MSG_AUTH_FLAG) != 0) { + pdu->digest_ptr = b->asn_ptr - SNMP_USM_AUTH_SIZE; + pdu->digest_ptr -= octs_len + ASN_MAXLENLEN; + } + + return (ASN_ERR_OK); +} + +static enum snmp_code +pdu_encode_secparams(struct asn_buf *b, struct snmp_pdu *pdu) +{ + u_char buf[256], *sptr; + struct asn_buf tb; + size_t auth_off, moved = 0; + + auth_off = 0; + memset(buf, 0, 256); + tb.asn_ptr = buf; + tb.asn_len = 256; + + if (asn_put_temp_header(&tb, (ASN_TYPE_SEQUENCE|ASN_TYPE_CONSTRUCTED), + &sptr) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_octetstring(&tb, (u_char *)pdu->engine.engine_id, + pdu->engine.engine_len) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_integer(&tb, pdu->engine.engine_boots) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_integer(&tb, pdu->engine.engine_time) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_octetstring(&tb, (u_char *)pdu->user.sec_name, + strlen(pdu->user.sec_name)) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if ((pdu->flags & SNMP_MSG_AUTH_FLAG) != 0) { + auth_off = sizeof(buf) - tb.asn_len + ASN_MAXLENLEN; + if (asn_put_octetstring(&tb, (u_char *)pdu->msg_digest, + sizeof(pdu->msg_digest)) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } else { + if (asn_put_octetstring(&tb, (u_char *)pdu->msg_digest, 0) + != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } + + if ((pdu->flags & SNMP_MSG_PRIV_FLAG) != 0) { + if (asn_put_octetstring(&tb, (u_char *)pdu->msg_salt, + sizeof(pdu->msg_salt)) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } else { + if (asn_put_octetstring(&tb, (u_char *)pdu->msg_salt, 0) + != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } + + if (asn_commit_header(&tb, sptr, &moved) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if ((pdu->flags & SNMP_MSG_AUTH_FLAG) != 0) + pdu->digest_ptr = b->asn_ptr + auth_off - moved; + + if (asn_put_octetstring(b, buf, sizeof(buf) - tb.asn_len) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + pdu->digest_ptr += ASN_MAXLENLEN; + + if ((pdu->flags & SNMP_MSG_PRIV_FLAG) != 0 && asn_put_temp_header(b, + ASN_TYPE_OCTETSTRING, &pdu->encrypted_ptr) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + return (SNMP_CODE_OK); +} + /* - * Parse the outer SEQUENCE value. ASN_ERR_TAG means 'bad version'. + * Decode the PDU except for the variable bindings itself. + * If decoding fails because of a bad binding, but the rest can be + * decoded, ip points to the index of the failed variable (errors + * OORANGE, BADLEN or BADVERS). */ -enum asn_err -snmp_parse_message_hdr(struct asn_buf *b, struct snmp_pdu *pdu, asn_len_t *lenp) +enum snmp_code +snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *ip) +{ + enum snmp_code code; + + if ((code = snmp_pdu_decode_header(b, pdu)) != SNMP_CODE_OK) + return (code); + + if (pdu->version == SNMP_V3) { + if (pdu->security_model != SNMP_SECMODEL_USM) + return (SNMP_CODE_FAILED); + if ((code = snmp_pdu_decode_secmode(b, pdu)) != SNMP_CODE_OK) + return (code); + } + + code = snmp_pdu_decode_scoped(b, pdu, ip); + + switch (code) { + case SNMP_CODE_FAILED: + snmp_pdu_free(pdu); + break; + + case SNMP_CODE_BADENC: + if (pdu->version == SNMP_Verr) + return (SNMP_CODE_BADVERS); + + default: + break; + } + + return (code); +} + +enum snmp_code +snmp_pdu_decode_header(struct asn_buf *b, struct snmp_pdu *pdu) { int32_t version; - u_char type; - u_int comm_len; + u_int octs_len; + asn_len_t len; + + pdu->outer_ptr = b->asn_ptr; + pdu->outer_len = b->asn_len; + + if (asn_get_sequence(b, &len) != ASN_ERR_OK) { + snmp_error("cannot decode pdu header"); + return (SNMP_CODE_FAILED); + } + if (b->asn_len < len) { + snmp_error("outer sequence value too short"); + return (SNMP_CODE_FAILED); + } + if (b->asn_len != len) { + snmp_error("ignoring trailing junk in message"); + b->asn_len = len; + } if (asn_get_integer(b, &version) != ASN_ERR_OK) { snmp_error("cannot decode version"); - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); } - if (version == 0) { + if (version == 0) pdu->version = SNMP_V1; - } else if (version == 1) { + else if (version == 1) pdu->version = SNMP_V2c; - } else { + else if (version == 3) + pdu->version = SNMP_V3; + else { pdu->version = SNMP_Verr; snmp_error("unsupported SNMP version"); - return (ASN_ERR_TAG); + return (SNMP_CODE_BADENC); } - comm_len = SNMP_COMMUNITY_MAXLEN; - if (asn_get_octetstring(b, (u_char *)pdu->community, - &comm_len) != ASN_ERR_OK) { - snmp_error("cannot decode community"); - return (ASN_ERR_FAILED); + if (pdu->version == SNMP_V3) { + if (asn_get_sequence(b, &len) != ASN_ERR_OK) { + snmp_error("cannot decode pdu global data header"); + return (SNMP_CODE_FAILED); + } + + if (asn_get_integer(b, &pdu->identifier) != ASN_ERR_OK) { + snmp_error("cannot decode msg indetifier"); + return (SNMP_CODE_FAILED); + } + + if (asn_get_integer(b, &pdu->engine.max_msg_size) + != ASN_ERR_OK) { + snmp_error("cannot decode msg size"); + return (SNMP_CODE_FAILED); + } + + octs_len = 1; + if (asn_get_octetstring(b, (u_char *)&pdu->flags, + &octs_len) != ASN_ERR_OK) { + snmp_error("cannot decode msg flags"); + return (SNMP_CODE_FAILED); + } + + if (asn_get_integer(b, &pdu->security_model) != ASN_ERR_OK) { + snmp_error("cannot decode msg size"); + return (SNMP_CODE_FAILED); + } + + if (pdu->security_model != SNMP_SECMODEL_USM) + return (SNMP_CODE_FAILED); + + if (parse_secparams(b, pdu) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } else { + octs_len = SNMP_COMMUNITY_MAXLEN; + if (asn_get_octetstring(b, (u_char *)pdu->community, + &octs_len) != ASN_ERR_OK) { + snmp_error("cannot decode community"); + return (SNMP_CODE_FAILED); + } + pdu->community[octs_len] = '\0'; + } + + return (SNMP_CODE_OK); +} + +enum snmp_code +snmp_pdu_decode_scoped(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *ip) +{ + u_char type; + asn_len_t len, trailer; + enum asn_err err; + + if (pdu->version == SNMP_V3) { + if (asn_get_sequence(b, &len) != ASN_ERR_OK) { + snmp_error("cannot decode scoped pdu header"); + return (SNMP_CODE_FAILED); + } + + len = SNMP_ENGINE_ID_SIZ; + if (asn_get_octetstring(b, (u_char *)&pdu->context_engine, + &len) != ASN_ERR_OK) { + snmp_error("cannot decode msg context engine"); + return (SNMP_CODE_FAILED); + } + pdu->context_engine_len = len; + + len = SNMP_CONTEXT_NAME_SIZ; + if (asn_get_octetstring(b, (u_char *)&pdu->context_name, + &len) != ASN_ERR_OK) { + snmp_error("cannot decode msg context name"); + return (SNMP_CODE_FAILED); + } + pdu->context_name[len] = '\0'; } - pdu->community[comm_len] = '\0'; - if (asn_get_header(b, &type, lenp) != ASN_ERR_OK) { + if (asn_get_header(b, &type, &len) != ASN_ERR_OK) { snmp_error("cannot get pdu header"); - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); } if ((type & ~ASN_TYPE_MASK) != (ASN_TYPE_CONSTRUCTED | ASN_CLASS_CONTEXT)) { snmp_error("bad pdu header tag"); - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); } pdu->type = type & ASN_TYPE_MASK; @@ -326,7 +595,7 @@ snmp_parse_message_hdr(struct asn_buf *b, struct snmp_pdu *pdu, asn_len_t *lenp) case SNMP_PDU_TRAP: if (pdu->version != SNMP_V1) { snmp_error("bad pdu type %u", pdu->type); - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); } break; @@ -336,99 +605,64 @@ snmp_parse_message_hdr(struct asn_buf *b, struct snmp_pdu *pdu, asn_len_t *lenp) case SNMP_PDU_REPORT: if (pdu->version == SNMP_V1) { snmp_error("bad pdu type %u", pdu->type); - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); } break; default: snmp_error("bad pdu type %u", pdu->type); - return (ASN_ERR_FAILED); - } - - - if (*lenp > b->asn_len) { - snmp_error("pdu length too long"); - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); } - return (ASN_ERR_OK); -} - -static enum asn_err -parse_message(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *ip) -{ - enum asn_err err; - asn_len_t len, trailer; - - err = snmp_parse_message_hdr(b, pdu, &len); - if (ASN_ERR_STOPPED(err)) - return (err); - trailer = b->asn_len - len; b->asn_len = len; err = parse_pdus(b, pdu, ip); if (ASN_ERR_STOPPED(err)) - return (ASN_ERR_FAILED); + return (SNMP_CODE_FAILED); if (b->asn_len != 0) snmp_error("ignoring trailing junk after pdu"); b->asn_len = trailer; - return (err); + return (SNMP_CODE_OK); } -/* - * Decode the PDU except for the variable bindings itself. - * If decoding fails because of a bad binding, but the rest can be - * decoded, ip points to the index of the failed variable (errors - * OORANGE, BADLEN or BADVERS). - */ enum snmp_code -snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *ip) +snmp_pdu_decode_secmode(struct asn_buf *b, struct snmp_pdu *pdu) { - asn_len_t len; + u_char type; + enum snmp_code code; + uint8_t digest[SNMP_USM_AUTH_SIZE]; - memset(pdu, 0, sizeof(*pdu)); + if (pdu->user.auth_proto != SNMP_AUTH_NOAUTH && + (pdu->flags & SNMP_MSG_AUTH_FLAG) == 0) + return (SNMP_CODE_BADSECLEVEL); - if (asn_get_sequence(b, &len) != ASN_ERR_OK) { - snmp_error("cannot decode pdu header"); - return (SNMP_CODE_FAILED); - } - if (b->asn_len < len) { - snmp_error("outer sequence value too short"); + if ((code = snmp_pdu_calc_digest(b, pdu, digest)) != + SNMP_CODE_OK) return (SNMP_CODE_FAILED); - } - if (b->asn_len != len) { - snmp_error("ignoring trailing junk in message"); - b->asn_len = len; - } - - switch (parse_message(b, pdu, ip)) { - case ASN_ERR_OK: - return (SNMP_CODE_OK); + if (pdu->user.auth_proto != SNMP_AUTH_NOAUTH && + memcmp(digest, pdu->msg_digest, sizeof(pdu->msg_digest)) != 0) + return (SNMP_CODE_BADDIGEST); - case ASN_ERR_FAILED: - case ASN_ERR_EOBUF: - snmp_pdu_free(pdu); + if (pdu->user.priv_proto != SNMP_PRIV_NOPRIV && (asn_get_header(b, &type, + &pdu->scoped_len) != ASN_ERR_OK || type != ASN_TYPE_OCTETSTRING)) { + snmp_error("cannot decode encrypted pdu"); return (SNMP_CODE_FAILED); + } + pdu->scoped_ptr = b->asn_ptr; - case ASN_ERR_BADLEN: - return (SNMP_CODE_BADLEN); - - case ASN_ERR_RANGE: - return (SNMP_CODE_OORANGE); + if (pdu->user.priv_proto != SNMP_PRIV_NOPRIV && + (pdu->flags & SNMP_MSG_PRIV_FLAG) == 0) + return (SNMP_CODE_BADSECLEVEL); - case ASN_ERR_TAG: - if (pdu->version == SNMP_Verr) - return (SNMP_CODE_BADVERS); - else - return (SNMP_CODE_BADENC); - } + if ((code = snmp_pdu_decrypt(b, pdu)) != SNMP_CODE_OK) + return (SNMP_CODE_FAILED); - return (SNMP_CODE_OK); + return (code); } /* @@ -500,6 +734,7 @@ enum snmp_code snmp_pdu_encode_header(struct asn_buf *b, struct snmp_pdu *pdu) { enum asn_err err; + u_char *v3_hdr_ptr; if (asn_put_temp_header(b, (ASN_TYPE_SEQUENCE|ASN_TYPE_CONSTRUCTED), &pdu->outer_ptr) != ASN_ERR_OK) @@ -509,14 +744,62 @@ snmp_pdu_encode_header(struct asn_buf *b, struct snmp_pdu *pdu) err = asn_put_integer(b, 0); else if (pdu->version == SNMP_V2c) err = asn_put_integer(b, 1); + else if (pdu->version == SNMP_V3) + err = asn_put_integer(b, 3); else return (SNMP_CODE_BADVERS); if (err != ASN_ERR_OK) return (SNMP_CODE_FAILED); - if (asn_put_octetstring(b, (u_char *)pdu->community, - strlen(pdu->community)) != ASN_ERR_OK) - return (SNMP_CODE_FAILED); + if (pdu->version == SNMP_V3) { + if (asn_put_temp_header(b, (ASN_TYPE_SEQUENCE | + ASN_TYPE_CONSTRUCTED), &v3_hdr_ptr) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_integer(b, pdu->identifier) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_integer(b, pdu->engine.max_msg_size) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (pdu->type != SNMP_PDU_RESPONSE && + pdu->type != SNMP_PDU_TRAP && + pdu->type != SNMP_PDU_REPORT) + pdu->flags |= SNMP_MSG_REPORT_FLAG; + + if (asn_put_octetstring(b, (u_char *)&pdu->flags, 1) + != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_integer(b, pdu->security_model) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_commit_header(b, v3_hdr_ptr, NULL) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (pdu->security_model != SNMP_SECMODEL_USM) + return (SNMP_CODE_FAILED); + + if (pdu_encode_secparams(b, pdu) != SNMP_CODE_OK) + return (SNMP_CODE_FAILED); + + /* View-based Access Conntrol information */ + if (asn_put_temp_header(b, (ASN_TYPE_SEQUENCE | + ASN_TYPE_CONSTRUCTED), &pdu->scoped_ptr) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_octetstring(b, (u_char *)pdu->context_engine, + pdu->context_engine_len) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (asn_put_octetstring(b, (u_char *)pdu->context_name, + strlen(pdu->context_name)) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } else { + if (asn_put_octetstring(b, (u_char *)pdu->community, + strlen(pdu->community)) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } if (asn_put_temp_header(b, (ASN_TYPE_CONSTRUCTED | ASN_CLASS_CONTEXT | pdu->type), &pdu->pdu_ptr) != ASN_ERR_OK) @@ -550,13 +833,66 @@ snmp_pdu_encode_header(struct asn_buf *b, struct snmp_pdu *pdu) return (SNMP_CODE_OK); } +static enum asn_err +snmp_pdu_fix_padd(struct asn_buf *b, struct snmp_pdu *pdu) +{ + asn_len_t padlen; + + if (pdu->user.priv_proto == SNMP_PRIV_DES && pdu->scoped_len % 8 != 0) { + padlen = 8 - (pdu->scoped_len % 8); + if (asn_pad(b, padlen) != ASN_ERR_OK) + return (ASN_ERR_FAILED); + pdu->scoped_len += padlen; + } + + return (ASN_ERR_OK); +} + enum snmp_code -snmp_fix_encoding(struct asn_buf *b, const struct snmp_pdu *pdu) +snmp_fix_encoding(struct asn_buf *b, struct snmp_pdu *pdu) { - if (asn_commit_header(b, pdu->vars_ptr) != ASN_ERR_OK || - asn_commit_header(b, pdu->pdu_ptr) != ASN_ERR_OK || - asn_commit_header(b, pdu->outer_ptr) != ASN_ERR_OK) + size_t moved = 0; + enum snmp_code code; + + if (asn_commit_header(b, pdu->vars_ptr, NULL) != ASN_ERR_OK || + asn_commit_header(b, pdu->pdu_ptr, NULL) != ASN_ERR_OK) return (SNMP_CODE_FAILED); + + if (pdu->version == SNMP_V3) { + if (asn_commit_header(b, pdu->scoped_ptr, NULL) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + pdu->scoped_len = b->asn_ptr - pdu->scoped_ptr; + if ((code = snmp_pdu_fix_padd(b, pdu))!= ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + if (pdu->security_model != SNMP_SECMODEL_USM) + return (SNMP_CODE_FAILED); + + if (snmp_pdu_encrypt(b, pdu) != SNMP_CODE_OK) + return (SNMP_CODE_FAILED); + + if (pdu->user.priv_proto != SNMP_PRIV_NOPRIV && + asn_commit_header(b, pdu->encrypted_ptr, NULL) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + } + + if (asn_commit_header(b, pdu->outer_ptr, &moved) != ASN_ERR_OK) + return (SNMP_CODE_FAILED); + + pdu->outer_len = b->asn_ptr - pdu->outer_ptr; + pdu->digest_ptr -= moved; + + if (pdu->version == SNMP_V3) { + if ((code = snmp_pdu_calc_digest(b, pdu, pdu->msg_digest)) != + SNMP_CODE_OK) + return (SNMP_CODE_FAILED); + + if ((pdu->flags & SNMP_MSG_AUTH_FLAG) != 0) + memcpy(pdu->digest_ptr, pdu->msg_digest, + sizeof(pdu->msg_digest)); + } + return (SNMP_CODE_OK); } @@ -639,7 +975,7 @@ snmp_binding_encode(struct asn_buf *b, const struct snmp_value *binding) return (err); } - err = asn_commit_header(b, ptr); + err = asn_commit_header(b, ptr, NULL); if (err != ASN_ERR_OK) { *b = save; return (err); @@ -775,6 +1111,8 @@ snmp_pdu_dump(const struct snmp_pdu *pdu) vers = "SNMPv1"; else if (pdu->version == SNMP_V2c) vers = "SNMPv2c"; + else if (pdu->version == SNMP_V3) + vers = "SNMPv3"; else vers = "v?"; @@ -838,6 +1176,39 @@ snmp_value_copy(struct snmp_value *to, const struct snmp_value *from) } void +snmp_pdu_init_secparams(struct snmp_pdu *pdu, struct snmp_engine *eng, + struct snmp_user *user) +{ + int32_t rval; + + memcpy(&pdu->engine, eng, sizeof(pdu->engine)); + memcpy(&pdu->user, user, sizeof(pdu->user)); + + if (user->auth_proto != SNMP_AUTH_NOAUTH) + pdu->flags |= SNMP_MSG_AUTH_FLAG; + + switch (user->priv_proto) { + case SNMP_PRIV_DES: + memcpy(pdu->msg_salt, &eng->engine_boots, + sizeof(eng->engine_boots)); + rval = random(); + memcpy(pdu->msg_salt + sizeof(eng->engine_boots), &rval, + sizeof(int32_t)); + pdu->flags |= SNMP_MSG_PRIV_FLAG; + break; + case SNMP_PRIV_AES: + rval = random(); + memcpy(pdu->msg_salt, &rval, sizeof(int32_t)); + rval = random(); + memcpy(pdu->msg_salt + sizeof(int32_t), &rval, sizeof(int32_t)); + pdu->flags |= SNMP_MSG_PRIV_FLAG; + break; + default: + break; + } +} + +void snmp_pdu_free(struct snmp_pdu *pdu) { u_int i; diff --git a/contrib/bsnmp/lib/snmp.h b/contrib/bsnmp/lib/snmp.h index 43af22e..3a6cec7 100644 --- a/contrib/bsnmp/lib/snmp.h +++ b/contrib/bsnmp/lib/snmp.h @@ -5,6 +5,13 @@ * * Author: Harti Brandt * + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by Shteryana Sotirova Shopova + * under sponsorship from the FreeBSD Foundation. + * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -35,8 +42,11 @@ #include -#define SNMP_COMMUNITY_MAXLEN 128 -#define SNMP_MAX_BINDINGS 100 +#define SNMP_COMMUNITY_MAXLEN 128 +#define SNMP_MAX_BINDINGS 100 +#define SNMP_CONTEXT_NAME_SIZ (32 + 1) +#define SNMP_ENGINE_ID_SIZ 32 +#define SNMP_TIME_WINDOW 150 enum snmp_syntax { SNMP_SYNTAX_NULL = 0, @@ -75,33 +85,110 @@ struct snmp_value { enum snmp_version { SNMP_Verr = 0, SNMP_V1 = 1, - SNMP_V2c, + SNMP_V2c = 2, + SNMP_V3, +}; + +#define SNMP_ADM_STR32_SIZ (32 + 1) +#define SNMP_AUTH_KEY_SIZ 40 +#define SNMP_PRIV_KEY_SIZ 32 +#define SNMP_USM_AUTH_SIZE 12 +#define SNMP_USM_PRIV_SIZE 8 +#define SNMP_AUTH_HMACMD5_KEY_SIZ 16 +#define SNMP_AUTH_HMACSHA_KEY_SIZ 20 +#define SNMP_PRIV_AES_KEY_SIZ 16 +#define SNMP_PRIV_DES_KEY_SIZ 8 + + +enum snmp_secmodel { + SNMP_SECMODEL_ANY = 0, + SNMP_SECMODEL_SNMPv1 = 1, + SNMP_SECMODEL_SNMPv2c = 2, + SNMP_SECMODEL_USM = 3, + SNMP_SECMODEL_UNKNOWN +}; + +enum snmp_usm_level { + SNMP_noAuthNoPriv = 1, + SNMP_authNoPriv = 2, + SNMP_authPriv = 3 +}; + +enum snmp_authentication { + SNMP_AUTH_NOAUTH = 0, + SNMP_AUTH_HMAC_MD5, + SNMP_AUTH_HMAC_SHA +}; + +enum snmp_privacy { + SNMP_PRIV_NOPRIV = 0, + SNMP_PRIV_DES = 1, + SNMP_PRIV_AES +}; + +struct snmp_engine { + uint8_t engine_id[SNMP_ENGINE_ID_SIZ]; + uint32_t engine_len; + int32_t engine_boots; + int32_t engine_time; + int32_t max_msg_size; +}; + +struct snmp_user { + char sec_name[SNMP_ADM_STR32_SIZ]; + enum snmp_authentication auth_proto; + enum snmp_privacy priv_proto; + uint8_t auth_key[SNMP_AUTH_KEY_SIZ]; + uint8_t priv_key[SNMP_PRIV_KEY_SIZ]; }; struct snmp_pdu { - char community[SNMP_COMMUNITY_MAXLEN + 1]; - enum snmp_version version; - u_int type; + char community[SNMP_COMMUNITY_MAXLEN + 1]; + enum snmp_version version; + u_int type; + + /* SNMPv3 PDU header fields */ + int32_t identifier; + uint8_t flags; + int32_t security_model; + struct snmp_engine engine; + + /* Associated USM user parameters */ + struct snmp_user user; + uint8_t msg_digest[SNMP_USM_AUTH_SIZE]; + uint8_t msg_salt[SNMP_USM_PRIV_SIZE]; + + /* View-based Access Model */ + /* XXX: put in separate structure - conflicts with struct snmp_context */ + uint32_t context_engine_len; + uint8_t context_engine[SNMP_ENGINE_ID_SIZ]; + char context_name[SNMP_CONTEXT_NAME_SIZ]; /* trap only */ - struct asn_oid enterprise; - u_char agent_addr[4]; - int32_t generic_trap; - int32_t specific_trap; - uint32_t time_stamp; + struct asn_oid enterprise; + u_char agent_addr[4]; + int32_t generic_trap; + int32_t specific_trap; + uint32_t time_stamp; /* others */ - int32_t request_id; - int32_t error_status; - int32_t error_index; + int32_t request_id; + int32_t error_status; + int32_t error_index; /* fixes for encoding */ - u_char *outer_ptr; - u_char *pdu_ptr; - u_char *vars_ptr; + size_t outer_len; + size_t scoped_len; + u_char *outer_ptr; + u_char *digest_ptr; + u_char *encrypted_ptr; + u_char *scoped_ptr; + u_char *pdu_ptr; + u_char *vars_ptr; + - struct snmp_value bindings[SNMP_MAX_BINDINGS]; - u_int nbindings; + struct snmp_value bindings[SNMP_MAX_BINDINGS]; + u_int nbindings; }; #define snmp_v1_pdu snmp_pdu @@ -150,20 +237,38 @@ enum snmp_code { SNMP_CODE_BADLEN, SNMP_CODE_BADENC, SNMP_CODE_OORANGE, + SNMP_CODE_BADSECLEVEL, + SNMP_CODE_NOTINTIME, + SNMP_CODE_BADUSER, + SNMP_CODE_BADENGINE, + SNMP_CODE_BADDIGEST, + SNMP_CODE_EDECRYPT }; +#define SNMP_MSG_AUTH_FLAG 0x1 +#define SNMP_MSG_PRIV_FLAG 0x2 +#define SNMP_MSG_REPORT_FLAG 0x4 +#define SNMP_MSG_AUTODISCOVER 0x80 + void snmp_value_free(struct snmp_value *); int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *); int snmp_value_copy(struct snmp_value *, const struct snmp_value *); void snmp_pdu_free(struct snmp_pdu *); enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *); -enum snmp_code snmp_pdu_encode(struct snmp_pdu *pdu, struct asn_buf *resp_b); +enum snmp_code snmp_pdu_decode_header(struct asn_buf *, struct snmp_pdu *); +enum snmp_code snmp_pdu_decode_scoped(struct asn_buf *, struct snmp_pdu *, int32_t *); +enum snmp_code snmp_pdu_encode(struct snmp_pdu *, struct asn_buf *); +enum snmp_code snmp_pdu_decode_secmode(struct asn_buf *, struct snmp_pdu *); int snmp_pdu_snoop(const struct asn_buf *); void snmp_pdu_dump(const struct snmp_pdu *pdu); +enum snmp_code snmp_passwd_to_keys(struct snmp_user *, char *); +enum snmp_code snmp_get_local_keys(struct snmp_user *, uint8_t *, uint32_t); +enum snmp_code snmp_calc_keychange(struct snmp_user *, uint8_t *); + extern void (*snmp_error)(const char *, ...); extern void (*snmp_printf)(const char *, ...); diff --git a/contrib/bsnmp/lib/snmpagent.c b/contrib/bsnmp/lib/snmpagent.c index ca9ccbd..9cd9676 100644 --- a/contrib/bsnmp/lib/snmpagent.c +++ b/contrib/bsnmp/lib/snmpagent.c @@ -165,6 +165,29 @@ find_subnode(const struct snmp_value *value) return (NULL); } +static void +snmp_pdu_create_response(struct snmp_pdu *pdu, struct snmp_pdu *resp) +{ + memset(resp, 0, sizeof(*resp)); + strcpy(resp->community, pdu->community); + resp->version = pdu->version; + resp->type = SNMP_PDU_RESPONSE; + resp->request_id = pdu->request_id; + resp->version = pdu->version; + + if (resp->version != SNMP_V3) + return; + + snmp_pdu_init_secparams(resp, &pdu->engine, &pdu->user); + resp->identifier = pdu->identifier; + resp->security_model = pdu->security_model; + resp->context_engine_len = pdu->context_engine_len; + memcpy(resp->context_engine, pdu->context_engine, + resp->context_engine_len); + strlcpy(resp->context_name, pdu->context_name, + sizeof(resp->context_name)); +} + /* * Execute a GET operation. The tree is rooted at the global 'root'. * Build the response PDU on the fly. If the return code is SNMP_RET_ERR @@ -184,12 +207,7 @@ snmp_get(struct snmp_pdu *pdu, struct asn_buf *resp_b, memset(&context, 0, sizeof(context)); context.ctx.data = data; - memset(resp, 0, sizeof(*resp)); - strcpy(resp->community, pdu->community); - resp->version = pdu->version; - resp->type = SNMP_PDU_RESPONSE; - resp->request_id = pdu->request_id; - resp->version = pdu->version; + snmp_pdu_create_response(pdu, resp); if (snmp_pdu_encode_header(resp_b, resp) != SNMP_CODE_OK) /* cannot even encode header - very bad */ @@ -384,11 +402,7 @@ snmp_getnext(struct snmp_pdu *pdu, struct asn_buf *resp_b, memset(&context, 0, sizeof(context)); context.ctx.data = data; - memset(resp, 0, sizeof(*resp)); - strcpy(resp->community, pdu->community); - resp->type = SNMP_PDU_RESPONSE; - resp->request_id = pdu->request_id; - resp->version = pdu->version; + snmp_pdu_create_response(pdu, resp); if (snmp_pdu_encode_header(resp_b, resp)) return (SNMP_RET_IGN); @@ -440,12 +454,7 @@ snmp_getbulk(struct snmp_pdu *pdu, struct asn_buf *resp_b, memset(&context, 0, sizeof(context)); context.ctx.data = data; - memset(resp, 0, sizeof(*resp)); - strcpy(resp->community, pdu->community); - resp->version = pdu->version; - resp->type = SNMP_PDU_RESPONSE; - resp->request_id = pdu->request_id; - resp->version = pdu->version; + snmp_pdu_create_response(pdu, resp); if (snmp_pdu_encode_header(resp_b, resp) != SNMP_CODE_OK) /* cannot even encode header - very bad */ @@ -652,11 +661,7 @@ snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b, TAILQ_INIT(&context.dlist); context.ctx.data = data; - memset(resp, 0, sizeof(*resp)); - strcpy(resp->community, pdu->community); - resp->type = SNMP_PDU_RESPONSE; - resp->request_id = pdu->request_id; - resp->version = pdu->version; + snmp_pdu_create_response(pdu, resp); if (snmp_pdu_encode_header(resp_b, resp)) return (SNMP_RET_IGN); @@ -951,16 +956,9 @@ snmp_make_errresp(const struct snmp_pdu *pdu, struct asn_buf *pdu_b, enum snmp_code code; memset(&resp, 0, sizeof(resp)); - - /* Message sequence */ - if (asn_get_sequence(pdu_b, &len) != ASN_ERR_OK) - return (SNMP_RET_IGN); - if (pdu_b->asn_len < len) + if ((code = snmp_pdu_decode_header(pdu_b, &resp)) != SNMP_CODE_OK) return (SNMP_RET_IGN); - err = snmp_parse_message_hdr(pdu_b, &resp, &len); - if (ASN_ERR_STOPPED(err)) - return (SNMP_RET_IGN); if (pdu_b->asn_len < len) return (SNMP_RET_IGN); pdu_b->asn_len = len; diff --git a/contrib/bsnmp/lib/snmpclient.c b/contrib/bsnmp/lib/snmpclient.c index b77543a..103ea69 100644 --- a/contrib/bsnmp/lib/snmpclient.c +++ b/contrib/bsnmp/lib/snmpclient.c @@ -852,6 +852,9 @@ snmp_client_init(struct snmp_client *c) strcpy(c->read_community, "public"); strcpy(c->write_community, "private"); + + c->security_model = SNMP_SECMODEL_USM; + strcpy(c->cname, ""); c->timeout.tv_sec = 3; c->timeout.tv_usec = 0; @@ -864,6 +867,8 @@ snmp_client_init(struct snmp_client *c) c->max_reqid = INT32_MAX; c->min_reqid = 0; c->next_reqid = 0; + + c->engine.max_msg_size = 1500; /* XXX */ } @@ -1132,7 +1137,8 @@ snmp_close(void) void snmp_pdu_create(struct snmp_pdu *pdu, u_int op) { - memset(pdu,0,sizeof(struct snmp_pdu)); + memset(pdu, 0, sizeof(struct snmp_pdu)); + if (op == SNMP_PDU_SET) strlcpy(pdu->community, snmp_client.write_community, sizeof(pdu->community)); @@ -1145,6 +1151,33 @@ snmp_pdu_create(struct snmp_pdu *pdu, u_int op) pdu->error_status = 0; pdu->error_index = 0; pdu->nbindings = 0; + + if (snmp_client.version != SNMP_V3) + return; + + pdu->identifier = ++snmp_client.identifier; + pdu->engine.max_msg_size = snmp_client.engine.max_msg_size; + pdu->flags = 0; + pdu->security_model = snmp_client.security_model; + + if (snmp_client.security_model == SNMP_SECMODEL_USM) + snmp_pdu_init_secparams(pdu, &snmp_client.engine, + &snmp_client.user); + else + seterr(&snmp_client, "unknown security model"); + + if (snmp_client.clen > 0) { + memcpy(pdu->context_engine, snmp_client.cengine, + snmp_client.clen); + pdu->context_engine_len = snmp_client.clen; + } else { + memcpy(pdu->context_engine, snmp_client.engine.engine_id, + snmp_client.engine.engine_len); + pdu->context_engine_len = snmp_client.engine.engine_len; + } + + strlcpy(pdu->context_name, snmp_client.cname, + sizeof(pdu->context_name)); } /* add pairs of (struct asn_oid, enum snmp_syntax) to an existing pdu */ @@ -1406,15 +1439,24 @@ snmp_receive_packet(struct snmp_pdu *pdu, struct timeval *tv) abuf.asn_ptr = buf; abuf.asn_len = ret; + memset(pdu, 0, sizeof(*pdu)); + if (snmp_client.security_model == SNMP_SECMODEL_USM) + snmp_pdu_init_secparams(pdu, &snmp_client.engine, + &snmp_client.user); + if (SNMP_CODE_OK != (ret = snmp_pdu_decode(&abuf, pdu, &ip))) { seterr(&snmp_client, "snmp_decode_pdu: failed %d", ret); free(buf); return (-1); } + free(buf); if (snmp_client.dump_pdus) snmp_pdu_dump(pdu); + snmp_client.engine.engine_time = pdu->engine.engine_time; + snmp_client.engine.engine_boots = pdu->engine.engine_boots; + return (+1); } @@ -1685,6 +1727,93 @@ snmp_dialog(struct snmp_v1_pdu *req, struct snmp_v1_pdu *resp) } int +snmp_discover_engine(char *passwd) +{ + char cname[SNMP_ADM_STR32_SIZ]; + enum snmp_authentication cap; + enum snmp_privacy cpp; + struct snmp_pdu req, resp; + + if (snmp_client.version != SNMP_V3) + seterr(&snmp_client, "wrong version"); + + strlcpy(cname, snmp_client.user.sec_name, sizeof(cname)); + cap = snmp_client.user.auth_proto; + cpp = snmp_client.user.priv_proto; + + snmp_client.engine.engine_len = 0; + snmp_client.engine.engine_boots = 0; + snmp_client.engine.engine_time = 0; + snmp_client.user.auth_proto = SNMP_AUTH_NOAUTH; + snmp_client.user.priv_proto = SNMP_PRIV_NOPRIV; + memset(snmp_client.user.sec_name, 0, sizeof(snmp_client.user.sec_name)); + + snmp_pdu_create(&req, SNMP_PDU_GET); + + if (snmp_dialog(&req, &resp) == -1) + return (-1); + + if (resp.version != req.version) { + seterr(&snmp_client, "wrong version"); + return (-1); + } + + if (resp.error_status != SNMP_ERR_NOERROR) { + seterr(&snmp_client, "Error %d in responce", resp.error_status); + return (-1); + } + + snmp_client.engine.engine_len = resp.engine.engine_len; + snmp_client.engine.max_msg_size = resp.engine.max_msg_size; + memcpy(snmp_client.engine.engine_id, resp.engine.engine_id, + resp.engine.engine_len); + + strlcpy(snmp_client.user.sec_name, cname, + sizeof(snmp_client.user.sec_name)); + snmp_client.user.auth_proto = cap; + snmp_client.user.priv_proto = cpp; + + if (snmp_client.user.auth_proto == SNMP_AUTH_NOAUTH) + return (0); + + if (passwd == NULL || + snmp_passwd_to_keys(&snmp_client.user, passwd) != SNMP_CODE_OK || + snmp_get_local_keys(&snmp_client.user, snmp_client.engine.engine_id, + snmp_client.engine.engine_len) != SNMP_CODE_OK) + return (-1); + + if (resp.engine.engine_boots != 0) + snmp_client.engine.engine_boots = resp.engine.engine_boots; + + if (resp.engine.engine_time != 0) { + snmp_client.engine.engine_time = resp.engine.engine_time; + return (0); + } + + snmp_pdu_create(&req, SNMP_PDU_GET); + req.engine.engine_boots = 0; + req.engine.engine_time = 0; + + if (snmp_dialog(&req, &resp) == -1) + return (-1); + + if (resp.version != req.version) { + seterr(&snmp_client, "wrong version"); + return (-1); + } + + if (resp.error_status != SNMP_ERR_NOERROR) { + seterr(&snmp_client, "Error %d in responce", resp.error_status); + return (-1); + } + + snmp_client.engine.engine_boots = resp.engine.engine_boots; + snmp_client.engine.engine_time = resp.engine.engine_time; + + return (0); +} + +int snmp_client_set_host(struct snmp_client *cl, const char *h) { char *np; diff --git a/contrib/bsnmp/lib/snmpclient.h b/contrib/bsnmp/lib/snmpclient.h index e137b4c..619f726 100644 --- a/contrib/bsnmp/lib/snmpclient.h +++ b/contrib/bsnmp/lib/snmpclient.h @@ -69,36 +69,47 @@ typedef void (*snmp_timeout_stop_f)(void *timeout_id); * Client context. */ struct snmp_client { - enum snmp_version version; - int trans; /* which transport to use */ + enum snmp_version version; + int trans; /* which transport to use */ /* these two are read-only for the application */ - char *cport; /* port number as string */ - char *chost; /* host name or IP address as string */ + char *cport; /* port number as string */ + char *chost; /* host name or IP address as string */ - char read_community[SNMP_COMMUNITY_MAXLEN + 1]; - char write_community[SNMP_COMMUNITY_MAXLEN + 1]; + char read_community[SNMP_COMMUNITY_MAXLEN + 1]; + char write_community[SNMP_COMMUNITY_MAXLEN + 1]; - struct timeval timeout; - u_int retries; + /* SNMPv3 specific fields */ + int32_t identifier; + int32_t security_model; + struct snmp_engine engine; + struct snmp_user user; - int dump_pdus; + /* SNMPv3 Access control - VACM*/ + uint32_t clen; + uint8_t cengine[SNMP_ENGINE_ID_SIZ]; + char cname[SNMP_CONTEXT_NAME_SIZ]; - size_t txbuflen; - size_t rxbuflen; + struct timeval timeout; + u_int retries; - int fd; + int dump_pdus; - int32_t next_reqid; - int32_t max_reqid; - int32_t min_reqid; + size_t txbuflen; + size_t rxbuflen; - char error[SNMP_STRERROR_LEN]; + int fd; - snmp_timeout_start_f timeout_start; - snmp_timeout_stop_f timeout_stop; + int32_t next_reqid; + int32_t max_reqid; + int32_t min_reqid; - char local_path[sizeof(SNMP_LOCAL_PATH)]; + char error[SNMP_STRERROR_LEN]; + + snmp_timeout_start_f timeout_start; + snmp_timeout_stop_f timeout_stop; + + char local_path[sizeof(SNMP_LOCAL_PATH)]; }; /* the global context */ @@ -181,6 +192,9 @@ int snmp_table_fetch_async(const struct snmp_table *, void *, /* send a request and wait for the response */ int snmp_dialog(struct snmp_pdu *_req, struct snmp_pdu *_resp); +/* discover an authorative snmpEngineId */ +int snmp_discover_engine(char *); + /* parse a server specification */ int snmp_parse_server(struct snmp_client *, const char *); diff --git a/contrib/bsnmp/lib/snmppriv.h b/contrib/bsnmp/lib/snmppriv.h index 535e0e9..98ac7e0 100644 --- a/contrib/bsnmp/lib/snmppriv.h +++ b/contrib/bsnmp/lib/snmppriv.h @@ -34,12 +34,18 @@ enum asn_err snmp_binding_encode(struct asn_buf *, const struct snmp_value *); enum snmp_code snmp_pdu_encode_header(struct asn_buf *, struct snmp_pdu *); -enum snmp_code snmp_fix_encoding(struct asn_buf *, const struct snmp_pdu *); -enum asn_err snmp_parse_message_hdr(struct asn_buf *b, struct snmp_pdu *pdu, - asn_len_t *lenp); +enum snmp_code snmp_fix_encoding(struct asn_buf *, struct snmp_pdu *); enum asn_err snmp_parse_pdus_hdr(struct asn_buf *b, struct snmp_pdu *pdu, asn_len_t *lenp); +void snmp_pdu_init_secparams(struct snmp_pdu *, struct snmp_engine *, + struct snmp_user *); + +enum snmp_code snmp_pdu_calc_digest(struct asn_buf *, const struct snmp_pdu *, + uint8_t *); +enum snmp_code snmp_pdu_encrypt(struct asn_buf *, const struct snmp_pdu *); +enum snmp_code snmp_pdu_decrypt(struct asn_buf *, const struct snmp_pdu *); + #define DEFAULT_HOST "localhost" #define DEFAULT_PORT "snmp" #define DEFAULT_LOCAL "/var/run/snmp.sock" diff --git a/contrib/bsnmp/snmp_usm/snmp_usm.3 b/contrib/bsnmp/snmp_usm/snmp_usm.3 new file mode 100755 index 0000000..7fd0817 --- /dev/null +++ b/contrib/bsnmp/snmp_usm/snmp_usm.3 @@ -0,0 +1,132 @@ +.\"- +.\" Copyright (C) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This documentation was written by Shteryana Sotirova Shopova under +.\" sponsorship from the FreeBSD Foundation. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd September 9, 2010 +.Dt SNMP_USM 3 +.Os +.Sh NAME +.Nm snmp_usm +.Nd "user-based security module for +.Xr bsnmpd 1 +.Sh LIBRARY +.Pq begemotSnmpdModulePath."usm" = "/usr/lib/snmp_usm.so" +.Sh DESCRIPTION +The +.Nm snmp_usm +module implements SNMPv3 User-Based Security Model MIB as defined in RFC 3414. +The module is used to manage the internal list of SNMPv3 USM active users in +.Nm bsnmpd . +The module must be loaded for +.Nm bsnmpd +to receive and process SNMPv3 USM PDUs correctly. +.Sh IMPLEMENTATION NOTES +A short description of the objects in the MIB follows. +.Bl -tag -width "XXXXXXXXX" +.It Va usmStats +The subtree contains statistics for the User-based Security Model PDU processing. +The statistics are reset each time the module is loaded. +.It Va usmUserSpinLock +An advisory lock used to coordinate several Command Generator Applications when +altering the SNMP USM users. +.It Va usmUserTable +The table contains all SNMP USM users configured in +.Nm bsnmpd. +The table contains the following objects +.Bl -tag -width ".It Va usmUserEngineID" +.It Va usmUserEngineID +An SNMP engine's administratively-unique identifier. Must be set to the same +Engine ID as +.Nm bsnmpd +so that the user will actually be allowed to communicate with the daemon. +The column is used as entry key and is not accessible for GET or SET operations. +.It Va usmUserName +The USM user name. The second entry key, again not accessible for GET or SET +operations. +.It Va usmUserSecurityName +The column has the exact same value as the +.Va usmUserName +column, however is accessible for GET operations. +.It Va usmUserCloneFrom +A GET on this column will return an empty OID. SET operations are currently not +supported. +.It Va usmUserAuthProtocol +The value of this column contains the OID corresponding to the authentication +protocol used by the USM user. The following protocols and their OIDs are known to +.Nm +module +.Bl -tag -width ".It Va NoAuthProtocol" +.It NoAuthProtocol 1.3.6.1.6.3.10.1.1.1 +.It HMACMD5AuthProtocol 1.3.6.1.6.3.10.1.1.2 +.It HMACSHAAuthProtocol 1.3.6.1.6.3.10.1.1.3 +.El +.It Va usmUserAuthKeyChange , Va usmUserOwnAuthKeyChange +These columns may be used to change the user's authentication key. +.It Va usmUserPrivProtocol +The value of this column contains the OID corresponding to the privacy +protocol used by the USM user. The following protocols and their OIDs are known to +.Nm +module +.Bl -tag -width ".It Va NoPrivProtocol" +.It NoPrivProtocol 1.3.6.1.6.3.10.1.2.1 +.It DESPrivProtoco 1.3.6.1.6.3.10.1.2.2 +.It AesCfb128Protocol 1.3.6.1.6.3.10.1.2.4 +.El +.It Va usmUserPrivKeyChange , Va usmUserOwnPrivKeyChange +These columns may be used to change the user's privacy key. +.It Va usmUserPublic +An arbitrary octet string that may be modified to confirm a SET operation on any +of the columns was successfull. +.It Va usmUserStorageType +This column always has either of two values. Entries created via +.Nm bsnmpd's +configuration file always have this column set to readOnly (5) and +it is not possible to modify those entries. Entries created by Command Generator +Applications always have this column set to volatile(2) and such entries are +lost when the module is restarted. A SET operation on this column is not +allowed. +.It Va usmUserStatus +This column is used to create new USM user entries or delete exsiting ones from +the table. +.El +.EL +.Sh FILES +.Bl -tag -width "XXXXXXXXX" +.It Pa /usr/share/snmp/defs/usm_tree.def +The description of the MIB tree implemented by +.Nm . +.El +.Sh SEE ALSO +.Xr bsnmpd 1 , +.Xr gensnmptree 1 , +.Xr snmpmod 3 +.Sh STANDARDS +IETF RFC 3414 +.Sh AUTHORS +.An Shteryana Shopova Aq syrinx@FreeBSD.org diff --git a/contrib/bsnmp/snmp_usm/usm_snmp.c b/contrib/bsnmp/snmp_usm/usm_snmp.c new file mode 100755 index 0000000..d5350bc --- /dev/null +++ b/contrib/bsnmp/snmp_usm/usm_snmp.c @@ -0,0 +1,614 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Shteryana Sotirova Shopova under + * sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "asn1.h" +#include "snmp.h" +#include "snmpmod.h" + +#include "usm_tree.h" +#include "usm_oid.h" + +static struct lmodule *usm_module; +/* For the registration. */ +static const struct asn_oid oid_usm = OIDX_snmpUsmMIB; + +static const struct asn_oid oid_usmNoAuthProtocol = OIDX_usmNoAuthProtocol; +static const struct asn_oid oid_usmHMACMD5AuthProtocol = \ + OIDX_usmHMACMD5AuthProtocol; +static const struct asn_oid oid_usmHMACSHAAuthProtocol = \ + OIDX_usmHMACSHAAuthProtocol; + +static const struct asn_oid oid_usmNoPrivProtocol = OIDX_usmNoPrivProtocol; +static const struct asn_oid oid_usmDESPrivProtocol = OIDX_usmDESPrivProtocol; +static const struct asn_oid oid_usmAesCfb128Protocol = OIDX_usmAesCfb128Protocol; + +static const struct asn_oid oid_usmUserSecurityName = OIDX_usmUserSecurityName; + +/* The registration. */ +static uint reg_usm; + +static int32_t usm_lock; + +static struct usm_user * usm_get_user(const struct asn_oid *, uint); +static struct usm_user * usm_get_next_user(const struct asn_oid *, uint); +static void usm_append_userindex(struct asn_oid *, uint, + const struct usm_user *); +static int usm_user_index_decode(const struct asn_oid *, uint, uint8_t *, + uint32_t *, char *); + +int +op_usm_stats(struct snmp_context *ctx __unused, struct snmp_value *val, + uint32_t sub __unused, uint32_t iidx __unused, enum snmp_op op) +{ + struct snmpd_usmstat *usmstats; + + if (op == SNMP_OP_SET) + return (SNMP_ERR_NOT_WRITEABLE); + + if ((usmstats = bsnmpd_get_usm_stats()) == NULL) + return (SNMP_ERR_GENERR); + + if (op == SNMP_OP_GET) { + switch (val->var.subs[sub - 1]) { + case LEAF_usmStatsUnsupportedSecLevels: + val->v.uint32 = usmstats->unsupported_seclevels; + break; + case LEAF_usmStatsNotInTimeWindows: + val->v.uint32 = usmstats->not_in_time_windows; + break; + case LEAF_usmStatsUnknownUserNames: + val->v.uint32 = usmstats->unknown_users; + break; + case LEAF_usmStatsUnknownEngineIDs: + val->v.uint32 = usmstats->unknown_engine_ids; + break; + case LEAF_usmStatsWrongDigests: + val->v.uint32 = usmstats->wrong_digests; + break; + case LEAF_usmStatsDecryptionErrors: + val->v.uint32 = usmstats->decrypt_errors; + break; + default: + return (SNMP_ERR_NOSUCHNAME); + } + return (SNMP_ERR_NOERROR); + } + abort(); +} + +int +op_usm_lock(struct snmp_context *ctx __unused, struct snmp_value *val, + uint32_t sub, uint32_t iidx __unused, enum snmp_op op) +{ + if (val->var.subs[sub - 1] != LEAF_usmUserSpinLock) + return (SNMP_ERR_NOSUCHNAME); + + switch (op) { + case SNMP_OP_GET: + if (++usm_lock == INT32_MAX) + usm_lock = 0; + val->v.integer = usm_lock; + break; + case SNMP_OP_GETNEXT: + abort(); + case SNMP_OP_SET: + if (val->v.integer != usm_lock) + return (SNMP_ERR_INCONS_VALUE); + break; + case SNMP_OP_ROLLBACK: + /* FALLTHROUGH */ + case SNMP_OP_COMMIT: + break; + } + + return (SNMP_ERR_NOERROR); +} + +int +op_usm_users(struct snmp_context *ctx, struct snmp_value *val, + uint32_t sub, uint32_t iidx __unused, enum snmp_op op) +{ + uint32_t elen; + struct usm_user *uuser, *clone; + char uname[SNMP_ADM_STR32_SIZ]; + uint8_t eid[SNMP_ENGINE_ID_SIZ]; + + switch (op) { + case SNMP_OP_GET: + if ((uuser = usm_get_user(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + break; + + case SNMP_OP_GETNEXT: + if ((uuser = usm_get_next_user(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + usm_append_userindex(&val->var, sub, uuser); + break; + + case SNMP_OP_SET: + if ((uuser = usm_get_user(&val->var, sub)) == NULL && + val->var.subs[sub - 1] != LEAF_usmUserStatus && + val->var.subs[sub - 1] != LEAF_usmUserCloneFrom) + return (SNMP_ERR_NOSUCHNAME); + + if (community != COMM_INITIALIZE && + uuser->type == StorageType_readOnly) + return (SNMP_ERR_NOT_WRITEABLE); + + switch (val->var.subs[sub - 1]) { + case LEAF_usmUserSecurityName: + return (SNMP_ERR_NOT_WRITEABLE); + + case LEAF_usmUserCloneFrom: + if (uuser != NULL || usm_user_index_decode(&val->var, + sub, eid, &elen, uname) < 0 || + !(asn_is_suboid(&oid_usmUserSecurityName, &val->v.oid))) + return (SNMP_ERR_WRONG_VALUE); + if ((clone = usm_get_user(&val->v.oid, sub)) == NULL) + return (SNMP_ERR_INCONS_VALUE); + if ((uuser = usm_new_user(eid, elen, uname)) == NULL) + return (SNMP_ERR_GENERR); + uuser->status = RowStatus_notReady; + if (community != COMM_INITIALIZE) + uuser->type = StorageType_volatile; + else + uuser->type = StorageType_readOnly; + + uuser->suser.auth_proto = clone->suser.auth_proto; + uuser->suser.priv_proto = clone->suser.priv_proto; + memcpy(uuser->suser.auth_key, clone->suser.auth_key, + sizeof(uuser->suser.auth_key)); + memcpy(uuser->suser.priv_key, clone->suser.priv_key, + sizeof(uuser->suser.priv_key)); + ctx->scratch->int1 = RowStatus_createAndWait; + break; + + case LEAF_usmUserAuthProtocol: + ctx->scratch->int1 = uuser->suser.auth_proto; + if (asn_compare_oid(&oid_usmNoAuthProtocol, + &val->v.oid) == 0) + uuser->suser.auth_proto = SNMP_AUTH_NOAUTH; + else if (asn_compare_oid(&oid_usmHMACMD5AuthProtocol, + &val->v.oid) == 0) + uuser->suser.auth_proto = SNMP_AUTH_HMAC_MD5; + else if (asn_compare_oid(&oid_usmHMACSHAAuthProtocol, + &val->v.oid) == 0) + uuser->suser.auth_proto = SNMP_AUTH_HMAC_SHA; + else + return (SNMP_ERR_WRONG_VALUE); + break; + + case LEAF_usmUserAuthKeyChange: + case LEAF_usmUserOwnAuthKeyChange: + if (val->var.subs[sub - 1] == + LEAF_usmUserOwnAuthKeyChange && + (usm_user == NULL || strcmp(uuser->suser.sec_name, + usm_user->suser.sec_name) != 0)) + return (SNMP_ERR_NO_ACCESS); + if (val->v.octetstring.len > SNMP_AUTH_KEY_SIZ) + return (SNMP_ERR_INCONS_VALUE); + ctx->scratch->ptr1 = malloc(SNMP_AUTH_KEY_SIZ); + if (ctx->scratch->ptr1 == NULL) + return (SNMP_ERR_GENERR); + memcpy(ctx->scratch->ptr1, uuser->suser.auth_key, + SNMP_AUTH_KEY_SIZ); + memcpy(uuser->suser.auth_key, val->v.octetstring.octets, + val->v.octetstring.len); + break; + + case LEAF_usmUserPrivProtocol: + ctx->scratch->int1 = uuser->suser.priv_proto; + if (asn_compare_oid(&oid_usmNoPrivProtocol, + &val->v.oid) == 0) + uuser->suser.priv_proto = SNMP_PRIV_NOPRIV; + else if (asn_compare_oid(&oid_usmDESPrivProtocol, + &val->v.oid) == 0) + uuser->suser.priv_proto = SNMP_PRIV_DES; + else if (asn_compare_oid(&oid_usmAesCfb128Protocol, + &val->v.oid) == 0) + uuser->suser.priv_proto = SNMP_PRIV_AES; + else + return (SNMP_ERR_WRONG_VALUE); + break; + + case LEAF_usmUserPrivKeyChange: + case LEAF_usmUserOwnPrivKeyChange: + if (val->var.subs[sub - 1] == + LEAF_usmUserOwnPrivKeyChange && + (usm_user == NULL || strcmp(uuser->suser.sec_name, + usm_user->suser.sec_name) != 0)) + return (SNMP_ERR_NO_ACCESS); + if (val->v.octetstring.len > SNMP_PRIV_KEY_SIZ) + return (SNMP_ERR_INCONS_VALUE); + ctx->scratch->ptr1 = malloc(SNMP_PRIV_KEY_SIZ); + if (ctx->scratch->ptr1 == NULL) + return (SNMP_ERR_GENERR); + memcpy(ctx->scratch->ptr1, uuser->suser.priv_key, + SNMP_PRIV_KEY_SIZ); + memcpy(uuser->suser.priv_key, val->v.octetstring.octets, + val->v.octetstring.len); + break; + + case LEAF_usmUserPublic: + if (val->v.octetstring.len > SNMP_ADM_STR32_SIZ) + return (SNMP_ERR_INCONS_VALUE); + if (uuser->user_public_len > 0) { + ctx->scratch->ptr2 = + malloc(uuser->user_public_len); + if (ctx->scratch->ptr2 == NULL) + return (SNMP_ERR_GENERR); + memcpy(ctx->scratch->ptr2, uuser->user_public, + uuser->user_public_len); + ctx->scratch->int2 = uuser->user_public_len; + } + if (val->v.octetstring.len > 0) { + memcpy(uuser->user_public, + val->v.octetstring.octets, + val->v.octetstring.len); + uuser->user_public_len = val->v.octetstring.len; + } else { + memset(uuser->user_public, 0, + SNMP_ADM_STR32_SIZ); + uuser->user_public_len = 0; + } + break; + + case LEAF_usmUserStorageType: + return (SNMP_ERR_INCONS_VALUE); + + case LEAF_usmUserStatus: + if (uuser == NULL) { + if (val->v.integer != RowStatus_createAndWait || + usm_user_index_decode(&val->var, sub, eid, + &elen, uname) < 0) + return (SNMP_ERR_INCONS_VALUE); + uuser = usm_new_user(eid, elen, uname); + if (uuser == NULL) + return (SNMP_ERR_GENERR); + uuser->status = RowStatus_notReady; + if (community != COMM_INITIALIZE) + uuser->type = StorageType_volatile; + else + uuser->type = StorageType_readOnly; + } else if (val->v.integer != RowStatus_active && + val->v.integer != RowStatus_destroy) + return (SNMP_ERR_INCONS_VALUE); + + uuser->status = val->v.integer; + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_COMMIT: + switch (val->var.subs[sub - 1]) { + case LEAF_usmUserAuthKeyChange: + case LEAF_usmUserOwnAuthKeyChange: + case LEAF_usmUserPrivKeyChange: + case LEAF_usmUserOwnPrivKeyChange: + free(ctx->scratch->ptr1); + break; + case LEAF_usmUserPublic: + if (ctx->scratch->ptr2 != NULL) + free(ctx->scratch->ptr2); + break; + case LEAF_usmUserStatus: + if (val->v.integer != RowStatus_destroy) + break; + if ((uuser = usm_get_user(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + usm_delete_user(uuser); + break; + default: + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_ROLLBACK: + if ((uuser = usm_get_user(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + switch (val->var.subs[sub - 1]) { + case LEAF_usmUserAuthProtocol: + uuser->suser.auth_proto = ctx->scratch->int1; + break; + case LEAF_usmUserAuthKeyChange: + case LEAF_usmUserOwnAuthKeyChange: + memcpy(uuser->suser.auth_key, ctx->scratch->ptr1, + SNMP_AUTH_KEY_SIZ); + free(ctx->scratch->ptr1); + break; + case LEAF_usmUserPrivProtocol: + uuser->suser.priv_proto = ctx->scratch->int1; + break; + case LEAF_usmUserPrivKeyChange: + case LEAF_usmUserOwnPrivKeyChange: + memcpy(uuser->suser.priv_key, ctx->scratch->ptr1, + SNMP_AUTH_KEY_SIZ); + free(ctx->scratch->ptr1); + break; + case LEAF_usmUserPublic: + if (ctx->scratch->ptr2 != NULL) { + memcpy(uuser->user_public, ctx->scratch->ptr2, + ctx->scratch->int2); + uuser->user_public_len = ctx->scratch->int2; + free(ctx->scratch->ptr2); + } else { + memset(uuser->user_public, 0, + SNMP_ADM_STR32_SIZ); + uuser->user_public_len = 0; + } + break; + case LEAF_usmUserCloneFrom: + case LEAF_usmUserStatus: + if (ctx->scratch->int1 == RowStatus_createAndWait) + usm_delete_user(uuser); + break; + default: + break; + } + return (SNMP_ERR_NOERROR); + + default: + abort(); + } + + switch (val->var.subs[sub - 1]) { + case LEAF_usmUserSecurityName: + return (string_get(val, uuser->suser.sec_name, -1)); + case LEAF_usmUserCloneFrom: + memcpy(&val->v.oid, &oid_zeroDotZero, sizeof(oid_zeroDotZero)); + break; + case LEAF_usmUserAuthProtocol: + switch (uuser->suser.auth_proto) { + case SNMP_AUTH_HMAC_MD5: + memcpy(&val->v.oid, &oid_usmHMACMD5AuthProtocol, + sizeof(oid_usmHMACMD5AuthProtocol)); + break; + case SNMP_AUTH_HMAC_SHA: + memcpy(&val->v.oid, &oid_usmHMACSHAAuthProtocol, + sizeof(oid_usmHMACSHAAuthProtocol)); + break; + default: + memcpy(&val->v.oid, &oid_usmNoAuthProtocol, + sizeof(oid_usmNoAuthProtocol)); + break; + } + break; + case LEAF_usmUserAuthKeyChange: + case LEAF_usmUserOwnAuthKeyChange: + return (string_get(val, (char *)uuser->suser.auth_key, 0)); + case LEAF_usmUserPrivProtocol: + switch (uuser->suser.priv_proto) { + case SNMP_PRIV_DES: + memcpy(&val->v.oid, &oid_usmDESPrivProtocol, + sizeof(oid_usmDESPrivProtocol)); + break; + case SNMP_PRIV_AES: + memcpy(&val->v.oid, &oid_usmAesCfb128Protocol, + sizeof(oid_usmAesCfb128Protocol)); + break; + default: + memcpy(&val->v.oid, &oid_usmNoPrivProtocol, + sizeof(oid_usmNoPrivProtocol)); + break; + } + break; + case LEAF_usmUserPrivKeyChange: + case LEAF_usmUserOwnPrivKeyChange: + return (string_get(val, (char *)uuser->suser.priv_key, 0)); + case LEAF_usmUserPublic: + return (string_get(val, uuser->user_public, + uuser->user_public_len)); + case LEAF_usmUserStorageType: + val->v.integer = uuser->type; + break; + case LEAF_usmUserStatus: + val->v.integer = uuser->status; + break; + } + + return (SNMP_ERR_NOERROR); +} + +static int +usm_user_index_decode(const struct asn_oid *oid, uint sub, uint8_t *engine, + uint32_t *elen, char *uname) +{ + uint32_t i, nlen; + int uname_off; + + if (oid->subs[sub] > SNMP_ENGINE_ID_SIZ) + return (-1); + + for (i = 0; i < oid->subs[sub]; i++) + engine[i] = oid->subs[sub + i + 1]; + *elen = i; + + uname_off = sub + oid->subs[sub] + 1; + if ((nlen = oid->subs[uname_off]) >= SNMP_ADM_STR32_SIZ) + return (-1); + + for (i = 0; i < nlen; i++) + uname[i] = oid->subs[uname_off + i + 1]; + uname[nlen] = '\0'; + + return (0); +} + +static void +usm_append_userindex(struct asn_oid *oid, uint sub, + const struct usm_user *uuser) +{ + uint32_t i; + + oid->len = sub + uuser->user_engine_len + strlen(uuser->suser.sec_name); + oid->len += 2; + oid->subs[sub] = uuser->user_engine_len; + for (i = 1; i < uuser->user_engine_len + 1; i++) + oid->subs[sub + i] = uuser->user_engine_id[i - 1]; + + sub += uuser->user_engine_len + 1; + oid->subs[sub] = strlen(uuser->suser.sec_name); + for (i = 1; i <= oid->subs[sub]; i++) + oid->subs[sub + i] = uuser->suser.sec_name[i - 1]; +} + +static struct usm_user * +usm_get_user(const struct asn_oid *oid, uint sub) +{ + uint32_t enginelen; + char username[SNMP_ADM_STR32_SIZ]; + uint8_t engineid[SNMP_ENGINE_ID_SIZ]; + + if (usm_user_index_decode(oid, sub, engineid, &enginelen, username) < 0) + return (NULL); + + return (usm_find_user(engineid, enginelen, username)); +} + +static struct usm_user * +usm_get_next_user(const struct asn_oid *oid, uint sub) +{ + uint32_t enginelen; + char username[SNMP_ADM_STR32_SIZ]; + uint8_t engineid[SNMP_ENGINE_ID_SIZ]; + struct usm_user *uuser; + + if (oid->len - sub == 0) + return (usm_first_user()); + + if (usm_user_index_decode(oid, sub, engineid, &enginelen, username) < 0) + return (NULL); + + if ((uuser = usm_find_user(engineid, enginelen, username)) != NULL) + return (usm_next_user(uuser)); + + return (NULL); +} + +/* + * USM snmp module initialization hook. + * Returns 0 on success, < 0 on error. + */ +static int +usm_init(struct lmodule * mod, int argc __unused, char *argv[] __unused) +{ + usm_module = mod; + usm_lock = random(); + bsnmpd_reset_usm_stats(); + return (0); +} + +/* + * USM snmp module finalization hook. + */ +static int +usm_fini(void) +{ + usm_flush_users(); + or_unregister(reg_usm); + + return (0); +} + +/* + * USM snmp module start operation. + */ +static void +usm_start(void) +{ + reg_usm = or_register(&oid_usm, + "The MIB module for managing SNMP User-Based Security Model.", + usm_module); +} + +static void +usm_dump(void) +{ + struct usm_user *uuser; + struct snmpd_usmstat *usmstats; + const char *const authstr[] = { + "noauth", + "md5", + "sha", + NULL + }; + const char *const privstr[] = { + "nopriv", + "des", + "aes", + NULL + }; + + if ((usmstats = bsnmpd_get_usm_stats()) != NULL) { + syslog(LOG_ERR, "UnsupportedSecLevels\t\t%u", + usmstats->unsupported_seclevels); + syslog(LOG_ERR, "NotInTimeWindows\t\t%u", + usmstats->not_in_time_windows); + syslog(LOG_ERR, "UnknownUserNames\t\t%u", + usmstats->unknown_users); + syslog(LOG_ERR, "UnknownEngineIDs\t\t%u", + usmstats->unknown_engine_ids); + syslog(LOG_ERR, "WrongDigests\t\t%u", + usmstats->wrong_digests); + syslog(LOG_ERR, "DecryptionErrors\t\t%u", + usmstats->decrypt_errors); + } + + syslog(LOG_ERR, "USM users"); + for (uuser = usm_first_user(); uuser != NULL; + (uuser = usm_next_user(uuser))) + syslog(LOG_ERR, "user %s\t\t%s, %s", uuser->suser.sec_name, + authstr[uuser->suser.auth_proto], + privstr[uuser->suser.priv_proto]); +} + +const char usm_comment[] = \ +"This module implements SNMP User-based Security Model defined in RFC 3414."; + +const struct snmp_module config = { + .comment = usm_comment, + .init = usm_init, + .fini = usm_fini, + .start = usm_start, + .tree = usm_ctree, + .dump = usm_dump, + .tree_size = usm_CTREE_SIZE, +}; diff --git a/contrib/bsnmp/snmp_usm/usm_tree.def b/contrib/bsnmp/snmp_usm/usm_tree.def new file mode 100755 index 0000000..8358d7b --- /dev/null +++ b/contrib/bsnmp/snmp_usm/usm_tree.def @@ -0,0 +1,109 @@ +#- +# Copyright (C) 2010 The FreeBSD Foundation +# All rights reserved. +# +# This software was developed by Shteryana Sotirova Shopova under +# sponsorship from the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +typedef StorageType ENUM ( + 1 other + 2 volatile + 3 nonVolatile + 4 permanent + 5 readOnly +) + +typedef RowStatus ENUM ( + 1 active + 2 notInService + 3 notReady + 4 createAndGo + 5 createAndWait + 6 destroy +) + +(1 internet + (6 snmpV2 + (3 snmpModules + (10 snmpFrameworkMIB + (1 snmpFrameworkAdmin + (1 snmpAuthProtocols + (1 usmNoAuthProtocol + ) + (2 usmHMACMD5AuthProtocol + ) + (3 usmHMACSHAAuthProtocol + ) + ) + (2 snmpPrivProtocols + (1 usmNoPrivProtocol + ) + (2 usmDESPrivProtocol + ) + (4 usmAesCfb128Protocol + ) + ) + ) + ) + (15 snmpUsmMIB + (1 usmMIBObjects + (1 usmStats + (1 usmStatsUnsupportedSecLevels COUNTER op_usm_stats GET) + (2 usmStatsNotInTimeWindows COUNTER op_usm_stats GET) + (3 usmStatsUnknownUserNames COUNTER op_usm_stats GET) + (4 usmStatsUnknownEngineIDs COUNTER op_usm_stats GET) + (5 usmStatsWrongDigests COUNTER op_usm_stats GET) + (6 usmStatsDecryptionErrors COUNTER op_usm_stats GET) + ) + (2 usmUser + (1 usmUserSpinLock INTEGER op_usm_lock GET SET) + (2 usmUserTable + (1 usmUserEntry : OCTETSTRING | SnmpEngineID OCTETSTRING op_usm_users + (1 usmUserEngineID OCTETSTRING | SnmpEngineID) + (2 usmUserName OCTETSTRING) + (3 usmUserSecurityName OCTETSTRING | SnmpAdminString GET) + (4 usmUserCloneFrom OID GET SET) + (5 usmUserAuthProtocol OID GET SET) + (6 usmUserAuthKeyChange OCTETSTRING | KeyChange GET SET) + (7 usmUserOwnAuthKeyChange OCTETSTRING | KeyChange GET SET) + (8 usmUserPrivProtocol OID GET SET) + (9 usmUserPrivKeyChange OCTETSTRING | KeyChange GET SET) + (10 usmUserOwnPrivKeyChange OCTETSTRING | KeyChange GET SET) + (11 usmUserPublic OCTETSTRING GET SET) + (12 usmUserStorageType StorageType GET SET) + (13 usmUserStatus RowStatus GET SET) + ) + ) + ) + ) + ) + (20 snmpUsmAesMIB + ) + ) + ) +) + diff --git a/contrib/bsnmp/snmp_vacm/snmp_vacm.3 b/contrib/bsnmp/snmp_vacm/snmp_vacm.3 new file mode 100755 index 0000000..9ad25be --- /dev/null +++ b/contrib/bsnmp/snmp_vacm/snmp_vacm.3 @@ -0,0 +1,94 @@ +.\"- +.\" Copyright (C) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This documentation was written by Shteryana Sotirova Shopova under +.\" sponsorship from the FreeBSD Foundation. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd October 7, 2010 +.Dt SNMP_VACM 3 +.Os +.Sh NAME +.Nm snmp_vacm +.Nd "View-based Access Control module for +.Xr bsnmpd 1 +.Sh LIBRARY +.Pq begemotSnmpdModulePath."vacm" = "/usr/lib/snmp_vacm.so" +.Sh DESCRIPTION +The +.Nm snmp_vacm +module implements SNMPv3 View-based Access Control Model MIB as defined in +RFC 3415. The module is used to manage the internal lists of SNMPv1, v2c and +v3 user names and groups and their access rights to fetch or modify the values +of the MIB objects maintained by +.Nm bsnmpd +and the modules loaded in the daemon. +The module must be loaded for +.Nm bsnmpd +to implement proper view-based access control. If the module is not loaded, +access is granted to all configured SNMPv1 & SNMPv2c communities and SNMPv3 +USM users. +.Sh IMPLEMENTATION NOTES +An entry in any table implemented by this MIB may be created by setting the +relevant RowStatus column to createAndGo (4) - in fact, any other value for +those columns in a SET operation will cause an error. When an entry is created, +any of its columns that is not used as index, is set to the default value as +specified in the SNMP-VIEW-BASED-ACM-MIB. All entries maintained by the module +are persistent after reboot if created via +.Nm bsnmpd 's +config file, otherwise entries created via SNMP are lost after reboot. +A short description of the objects in the MIB follows. +.Bl -tag -width "XXXXXXXXX" +.It Va vacmContextTable +A read-only table that consists of a list of SNMP contexts available in +.Nm bsnmpd . +.It Va vacmSecurityToGroupTable +The table contains a list of SNMPv1, v2c and v3 user names and the groups +they belong to. +.It Va vacmAccessTable +The table contains a list of SNMP contexts to groups mappings and respectively +the names of the SNMP views under those contexts, to which users in the group +are granted read-only, read-write access or receive notifications for the +objects under the subtree in the relevant view. +.It Va vacmViewTreeFamilyTable +The table contains a list of SNMP views, i.e. entries specifying the OID of a +MIB subtree and whether access to the objects under this subtree is to be +allowed or forbiden. +.El +.Sh FILES +.Bl -tag -width "XXXXXXXXX" +.It Pa /usr/share/snmp/defs/vacm_tree.def +The description of the MIB tree implemented by +.Nm . +.El +.Sh SEE ALSO +.Xr bsnmpd 1 , +.Xr gensnmptree 1 , +.Xr snmpmod 3 +.Sh STANDARDS +IETF RFC 3415 +.Sh AUTHORS +.An Shteryana Shopova Aq syrinx@FreeBSD.org diff --git a/contrib/bsnmp/snmp_vacm/vacm_snmp.c b/contrib/bsnmp/snmp_vacm/vacm_snmp.c new file mode 100755 index 0000000..cdec9f4 --- /dev/null +++ b/contrib/bsnmp/snmp_vacm/vacm_snmp.c @@ -0,0 +1,1026 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Shteryana Sotirova Shopova under + * sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "asn1.h" +#include "snmp.h" +#include "snmpmod.h" + +#include "vacm_tree.h" +#include "vacm_oid.h" + +static struct lmodule *vacm_module; +/* For the registration. */ +static const struct asn_oid oid_vacm = OIDX_snmpVacmMIB; + +static uint reg_vacm; + +static int32_t vacm_lock; + +/* + * Internal datastructures and forward declarations. + */ +static void vacm_append_userindex(struct asn_oid *, + uint, const struct vacm_user *); +static int vacm_user_index_decode(const struct asn_oid *, + uint, int32_t *, char *); +static struct vacm_user *vacm_get_user(const struct asn_oid *, + uint); +static struct vacm_user *vacm_get_next_user(const struct asn_oid *, + uint); +static void vacm_append_access_rule_index(struct asn_oid *, + uint, const struct vacm_access *); +static int vacm_access_rule_index_decode(const struct asn_oid *, + uint, char *, char *, int32_t *, int32_t *); +static struct vacm_access * vacm_get_access_rule(const struct asn_oid *, + uint); +static struct vacm_access * vacm_get_next_access_rule(const struct asn_oid *, + uint); +static int vacm_view_index_decode(const struct asn_oid *, uint, + char *, struct asn_oid *); +static void vacm_append_viewindex(struct asn_oid *, uint, + const struct vacm_view *); +static struct vacm_view *vacm_get_view(const struct asn_oid *, uint); +static struct vacm_view *vacm_get_next_view(const struct asn_oid *, uint); +static struct vacm_view *vacm_get_view_by_name(u_char *, u_int); +static struct vacm_context *vacm_get_context(const struct asn_oid *, uint); +static struct vacm_context *vacm_get_next_context(const struct asn_oid *, + uint); +static void vacm_append_ctxindex(struct asn_oid *, uint, + const struct vacm_context *); + +int +op_vacm_context(struct snmp_context *ctx __unused, struct snmp_value *val, + uint32_t sub, uint32_t iidx __unused, enum snmp_op op) +{ + char cname[SNMP_ADM_STR32_SIZ]; + size_t cnamelen; + struct vacm_context *vacm_ctx; + + if (val->var.subs[sub - 1] != LEAF_vacmContextName) + abort(); + + switch (op) { + case SNMP_OP_GET: + if ((vacm_ctx = vacm_get_context(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + break; + + case SNMP_OP_GETNEXT: + if ((vacm_ctx = vacm_get_next_context(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + vacm_append_ctxindex(&val->var, sub, vacm_ctx); + break; + + case SNMP_OP_SET: + if ((vacm_ctx = vacm_get_context(&val->var, sub)) != NULL) + return (SNMP_ERR_WRONG_VALUE); + if (community != COMM_INITIALIZE) + return (SNMP_ERR_NOT_WRITEABLE); + if (val->var.subs[sub] >= SNMP_ADM_STR32_SIZ) + return (SNMP_ERR_WRONG_VALUE); + if (index_decode(&val->var, sub, iidx, &cname, &cnamelen)) + return (SNMP_ERR_GENERR); + cname[cnamelen] = '\0'; + if ((vacm_ctx = vacm_add_context(cname, reg_vacm)) == NULL) + return (SNMP_ERR_GENERR); + return (SNMP_ERR_NOERROR); + + case SNMP_OP_COMMIT: + /* FALLTHROUGH*/ + case SNMP_OP_ROLLBACK: + return (SNMP_ERR_NOERROR); + default: + abort(); + } + + return (string_get(val, vacm_ctx->ctxname, -1)); +} + +int +op_vacm_security_to_group(struct snmp_context *ctx, struct snmp_value *val, + uint32_t sub, uint32_t iidx __unused, enum snmp_op op) +{ + int32_t smodel; + char uname[SNMP_ADM_STR32_SIZ]; + struct vacm_user *user; + + switch (op) { + case SNMP_OP_GET: + if ((user = vacm_get_user(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + break; + + case SNMP_OP_GETNEXT: + if ((user = vacm_get_next_user(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + vacm_append_userindex(&val->var, sub, user); + break; + + case SNMP_OP_SET: + if ((user = vacm_get_user(&val->var, sub)) == NULL && + val->var.subs[sub - 1] != LEAF_vacmSecurityToGroupStatus) + return (SNMP_ERR_NOSUCHNAME); + + if (user != NULL) { + if (community != COMM_INITIALIZE && + user->type == StorageType_readOnly) + return (SNMP_ERR_NOT_WRITEABLE); + if (user->status == RowStatus_active && + val->v.integer != RowStatus_destroy) + return (SNMP_ERR_INCONS_VALUE); + } + + switch (val->var.subs[sub - 1]) { + case LEAF_vacmGroupName: + ctx->scratch->ptr1 = user->group->groupname; + ctx->scratch->int1 = strlen(user->group->groupname); + return (vacm_user_set_group(user, + val->v.octetstring.octets,val->v.octetstring.len)); + + case LEAF_vacmSecurityToGroupStorageType: + return (SNMP_ERR_INCONS_VALUE); + + case LEAF_vacmSecurityToGroupStatus: + if (user == NULL) { + if (val->v.integer != RowStatus_createAndGo || + vacm_user_index_decode(&val->var, sub, + &smodel, uname) < 0) + return (SNMP_ERR_INCONS_VALUE); + user = vacm_new_user(smodel, uname); + if (user == NULL) + return (SNMP_ERR_GENERR); + user->status = RowStatus_destroy; + if (community != COMM_INITIALIZE) + user->type = StorageType_volatile; + else + user->type = StorageType_readOnly; + } else if (val->v.integer != RowStatus_active && + val->v.integer != RowStatus_destroy) + return (SNMP_ERR_INCONS_VALUE); + ctx->scratch->int1 = user->status; + user->status = val->v.integer; + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_COMMIT: + if (val->var.subs[sub - 1] != LEAF_vacmSecurityToGroupStatus) + return (SNMP_ERR_NOERROR); + if ((user = vacm_get_user(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + switch (val->v.integer) { + case RowStatus_destroy: + return (vacm_delete_user(user)); + + case RowStatus_createAndGo: + user->status = RowStatus_active; + break; + + default: + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_ROLLBACK: + if ((user = vacm_get_user(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + switch (val->var.subs[sub - 1]) { + case LEAF_vacmGroupName: + return (vacm_user_set_group(user, ctx->scratch->ptr1, + ctx->scratch->int1)); + + case LEAF_vacmSecurityToGroupStatus: + if (ctx->scratch->int1 == RowStatus_destroy) + return (vacm_delete_user(user)); + user->status = ctx->scratch->int1; + break; + + default: + break; + } + return (SNMP_ERR_NOERROR); + + default: + abort(); + } + + switch (val->var.subs[sub - 1]) { + case LEAF_vacmGroupName: + return (string_get(val, user->group->groupname, -1)); + case LEAF_vacmSecurityToGroupStorageType: + val->v.integer = user->type; + break; + case LEAF_vacmSecurityToGroupStatus: + val->v.integer = user->status; + break; + default: + abort(); + } + + return (SNMP_ERR_NOERROR); +} + +int +op_vacm_access(struct snmp_context *ctx, struct snmp_value *val, uint32_t sub, + uint32_t iidx __unused, enum snmp_op op) +{ + int32_t smodel, slevel; + char gname[SNMP_ADM_STR32_SIZ], cprefix[SNMP_ADM_STR32_SIZ]; + struct vacm_access *acl; + + switch (op) { + case SNMP_OP_GET: + if ((acl = vacm_get_access_rule(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + break; + + case SNMP_OP_GETNEXT: + if ((acl = vacm_get_next_access_rule(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + vacm_append_access_rule_index(&val->var, sub, acl); + break; + + case SNMP_OP_SET: + if ((acl = vacm_get_access_rule(&val->var, sub)) == NULL && + val->var.subs[sub - 1] != LEAF_vacmAccessStatus) + return (SNMP_ERR_NOSUCHNAME); + if (acl != NULL && community != COMM_INITIALIZE && + acl->type == StorageType_readOnly) + return (SNMP_ERR_NOT_WRITEABLE); + + switch (val->var.subs[sub - 1]) { + case LEAF_vacmAccessContextMatch: + ctx->scratch->int1 = acl->ctx_match; + if (val->v.integer == vacmAccessContextMatch_exact) + acl->ctx_match = 1; + else if (val->v.integer == vacmAccessContextMatch_prefix) + acl->ctx_match = 0; + else + return (SNMP_ERR_WRONG_VALUE); + break; + + case LEAF_vacmAccessReadViewName: + ctx->scratch->ptr1 = acl->read_view; + acl->read_view = vacm_get_view_by_name(val->v.octetstring.octets, val->v.octetstring.len); + if (acl->read_view == NULL) { + acl->read_view = ctx->scratch->ptr1; + return (SNMP_ERR_INCONS_VALUE); + } + return (SNMP_ERR_NOERROR); + + case LEAF_vacmAccessWriteViewName: + ctx->scratch->ptr1 = acl->write_view; + if ((acl->write_view = + vacm_get_view_by_name(val->v.octetstring.octets, + val->v.octetstring.len)) == NULL) { + acl->write_view = ctx->scratch->ptr1; + return (SNMP_ERR_INCONS_VALUE); + } + break; + + case LEAF_vacmAccessNotifyViewName: + ctx->scratch->ptr1 = acl->notify_view; + if ((acl->notify_view = + vacm_get_view_by_name(val->v.octetstring.octets, + val->v.octetstring.len)) == NULL) { + acl->notify_view = ctx->scratch->ptr1; + return (SNMP_ERR_INCONS_VALUE); + } + break; + + case LEAF_vacmAccessStorageType: + return (SNMP_ERR_INCONS_VALUE); + + case LEAF_vacmAccessStatus: + if (acl == NULL) { + if (val->v.integer != RowStatus_createAndGo || + vacm_access_rule_index_decode(&val->var, + sub, gname, cprefix, &smodel, &slevel) < 0) + return (SNMP_ERR_INCONS_VALUE); + if ((acl = vacm_new_access_rule(gname, cprefix, + smodel, slevel)) == NULL) + return (SNMP_ERR_GENERR); + acl->status = RowStatus_destroy; + if (community != COMM_INITIALIZE) + acl->type = StorageType_volatile; + else + acl->type = StorageType_readOnly; + } else if (val->v.integer != RowStatus_active && + val->v.integer != RowStatus_destroy) + return (SNMP_ERR_INCONS_VALUE); + ctx->scratch->int1 = acl->status; + acl->status = val->v.integer; + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_COMMIT: + if (val->var.subs[sub - 1] != LEAF_vacmAccessStatus) + return (SNMP_ERR_NOERROR); + if ((acl = vacm_get_access_rule(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + if (val->v.integer == RowStatus_destroy) + return (vacm_delete_access_rule(acl)); + else + acl->status = RowStatus_active; + return (SNMP_ERR_NOERROR); + + case SNMP_OP_ROLLBACK: + if ((acl = vacm_get_access_rule(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + switch (val->var.subs[sub - 1]) { + case LEAF_vacmAccessContextMatch: + acl->ctx_match = ctx->scratch->int1; + break; + case LEAF_vacmAccessReadViewName: + acl->read_view = ctx->scratch->ptr1; + break; + case LEAF_vacmAccessWriteViewName: + acl->write_view = ctx->scratch->ptr1; + break; + case LEAF_vacmAccessNotifyViewName: + acl->notify_view = ctx->scratch->ptr1; + break; + case LEAF_vacmAccessStatus: + if (ctx->scratch->int1 == RowStatus_destroy) + return (vacm_delete_access_rule(acl)); + default: + break; + } + return (SNMP_ERR_NOERROR); + + default: + abort(); + } + + switch (val->var.subs[sub - 1]) { + case LEAF_vacmAccessContextMatch: + return (string_get(val, acl->ctx_prefix, -1)); + case LEAF_vacmAccessReadViewName: + if (acl->read_view != NULL) + return (string_get(val, acl->read_view->viewname, -1)); + else + return (string_get(val, NULL, 0)); + case LEAF_vacmAccessWriteViewName: + if (acl->write_view != NULL) + return (string_get(val, acl->write_view->viewname, -1)); + else + return (string_get(val, NULL, 0)); + case LEAF_vacmAccessNotifyViewName: + if (acl->notify_view != NULL) + return (string_get(val, acl->notify_view->viewname, -1)); + else + return (string_get(val, NULL, 0)); + case LEAF_vacmAccessStorageType: + val->v.integer = acl->type; + break; + case LEAF_vacmAccessStatus: + val->v.integer = acl->status; + break; + default: + abort(); + } + + return (SNMP_ERR_NOERROR); +} + +int +op_vacm_view_lock(struct snmp_context *ctx __unused, struct snmp_value *val, + uint32_t sub, uint32_t iidx __unused, enum snmp_op op) +{ + if (val->var.subs[sub - 1] != LEAF_vacmViewSpinLock) + return (SNMP_ERR_NOSUCHNAME); + + switch (op) { + case SNMP_OP_GET: + if (++vacm_lock == INT32_MAX) + vacm_lock = 0; + val->v.integer = vacm_lock; + break; + + case SNMP_OP_GETNEXT: + abort(); + + case SNMP_OP_SET: + if (val->v.integer != vacm_lock) + return (SNMP_ERR_INCONS_VALUE); + break; + + case SNMP_OP_ROLLBACK: + /* FALLTHROUGH */ + case SNMP_OP_COMMIT: + break; + } + + return (SNMP_ERR_NOERROR); +} + +int +op_vacm_view(struct snmp_context *ctx, struct snmp_value *val, uint32_t sub, + uint32_t iidx __unused, enum snmp_op op) +{ + char vname[SNMP_ADM_STR32_SIZ]; + struct asn_oid oid; + struct vacm_view *view; + + switch (op) { + case SNMP_OP_GET: + if ((view = vacm_get_view(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + break; + + case SNMP_OP_GETNEXT: + if ((view = vacm_get_next_view(&val->var, sub)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + vacm_append_viewindex(&val->var, sub, view); + break; + + case SNMP_OP_SET: + if ((view = vacm_get_view(&val->var, sub)) == NULL && + val->var.subs[sub - 1] != LEAF_vacmViewTreeFamilyStatus) + return (SNMP_ERR_NOSUCHNAME); + + if (view != NULL) { + if (community != COMM_INITIALIZE && + view->type == StorageType_readOnly) + return (SNMP_ERR_NOT_WRITEABLE); + if (view->status == RowStatus_active && + val->v.integer != RowStatus_destroy) + return (SNMP_ERR_INCONS_VALUE); + } + + switch (val->var.subs[sub - 1]) { + case LEAF_vacmViewTreeFamilyMask: + if (val->v.octetstring.len > sizeof(view->mask)) + ctx->scratch->ptr1 = malloc(sizeof(view->mask)); + if (ctx->scratch->ptr1 == NULL) + return (SNMP_ERR_GENERR); + memset(ctx->scratch->ptr1, 0, sizeof(view->mask)); + memcpy(ctx->scratch->ptr1, view->mask, + sizeof(view->mask)); + memset(view->mask, 0, sizeof(view->mask)); + memcpy(view->mask, val->v.octetstring.octets, + val->v.octetstring.len); + break; + + case LEAF_vacmViewTreeFamilyType: + ctx->scratch->int1 = view->exclude; + if (val->v.integer == vacmViewTreeFamilyType_included) + view->exclude = 0; + else if (val->v.integer == vacmViewTreeFamilyType_excluded) + view->exclude = 1; + else + return (SNMP_ERR_WRONG_VALUE); + break; + + case LEAF_vacmViewTreeFamilyStorageType: + return (SNMP_ERR_INCONS_VALUE); + + case LEAF_vacmViewTreeFamilyStatus: + if (view == NULL) { + if (val->v.integer != RowStatus_createAndGo || + vacm_view_index_decode(&val->var, sub, vname, + &oid) < 0) + return (SNMP_ERR_INCONS_VALUE); + if ((view = vacm_new_view(vname, &oid)) == NULL) + return (SNMP_ERR_GENERR); + view->status = RowStatus_destroy; + if (community != COMM_INITIALIZE) + view->type = StorageType_volatile; + else + view->type = StorageType_readOnly; + } else if (val->v.integer != RowStatus_active && + val->v.integer != RowStatus_destroy) + return (SNMP_ERR_INCONS_VALUE); + ctx->scratch->int1 = view->status; + view->status = val->v.integer; + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_COMMIT: + switch (val->var.subs[sub - 1]) { + case LEAF_vacmViewTreeFamilyMask: + free(ctx->scratch->ptr1); + break; + case LEAF_vacmViewTreeFamilyStatus: + if ((view = vacm_get_view(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + switch (val->v.integer) { + case RowStatus_destroy: + return (vacm_delete_view(view)); + + case RowStatus_createAndGo: + view->status = RowStatus_active; + break; + + default: + /* NOTREACHED*/ + return (SNMP_ERR_GENERR); + } + default: + break; + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_ROLLBACK: + if ((view = vacm_get_view(&val->var, sub)) == NULL) + return (SNMP_ERR_GENERR); + switch (val->var.subs[sub - 1]) { + case LEAF_vacmViewTreeFamilyMask: + memcpy(view->mask, ctx->scratch->ptr1, + sizeof(view->mask)); + free(ctx->scratch->ptr1); + break; + case LEAF_vacmViewTreeFamilyType: + view->exclude = ctx->scratch->int1; + break; + case LEAF_vacmViewTreeFamilyStatus: + if (ctx->scratch->int1 == RowStatus_destroy) + return (vacm_delete_view(view)); + break; + default: + break; + } + return (SNMP_ERR_NOERROR); + + default: + abort(); + } + + switch (val->var.subs[sub - 1]) { + case LEAF_vacmViewTreeFamilyMask: + return (string_get(val, view->mask, sizeof(view->mask))); + case LEAF_vacmViewTreeFamilyType: + if (view->exclude) + val->v.integer = vacmViewTreeFamilyType_excluded; + else + val->v.integer = vacmViewTreeFamilyType_included; + break; + case LEAF_vacmViewTreeFamilyStorageType: + val->v.integer = view->type; + break; + case LEAF_vacmViewTreeFamilyStatus: + val->v.integer = view->status; + break; + default: + abort(); + } + + return (SNMP_ERR_NOERROR); +} + +static void +vacm_append_userindex(struct asn_oid *oid, uint sub, + const struct vacm_user *user) +{ + uint32_t i; + + oid->len = sub + strlen(user->secname) + 2; + oid->subs[sub++] = user->sec_model; + oid->subs[sub] = strlen(user->secname); + for (i = 1; i <= strlen(user->secname); i++) + oid->subs[sub + i] = user->secname[i - 1]; +} + +static int +vacm_user_index_decode(const struct asn_oid *oid, uint sub, + int32_t *smodel, char *uname) +{ + uint32_t i; + + *smodel = oid->subs[sub++]; + + if (oid->subs[sub] >= SNMP_ADM_STR32_SIZ) + return (-1); + + for (i = 0; i < oid->subs[sub]; i++) + uname[i] = oid->subs[sub + i + 1]; + uname[i] = '\0'; + + return (0); +} + +static struct vacm_user * +vacm_get_user(const struct asn_oid *oid, uint sub) +{ + int32_t smodel; + char uname[SNMP_ADM_STR32_SIZ]; + struct vacm_user *user; + + if (vacm_user_index_decode(oid, sub, &smodel, uname) < 0) + return (NULL); + + for (user = vacm_first_user(); user != NULL; user = vacm_next_user(user)) + if (strcmp(uname, user->secname) == 0 && + user->sec_model == smodel) + return (user); + + return (NULL); +} + +static struct vacm_user * +vacm_get_next_user(const struct asn_oid *oid, uint sub) +{ + int32_t smodel; + char uname[SNMP_ADM_STR32_SIZ]; + struct vacm_user *user; + + if (oid->len - sub == 0) + return (vacm_first_user()); + + if (vacm_user_index_decode(oid, sub, &smodel, uname) < 0) + return (NULL); + + for (user = vacm_first_user(); user != NULL; user = vacm_next_user(user)) + if (strcmp(uname, user->secname) == 0 && + user->sec_model == smodel) + return (vacm_next_user(user)); + + return (NULL); +} + +static void +vacm_append_access_rule_index(struct asn_oid *oid, uint sub, + const struct vacm_access *acl) +{ + uint32_t i; + + oid->len = sub + strlen(acl->group->groupname) + + strlen(acl->ctx_prefix) + 4; + + oid->subs[sub] = strlen(acl->group->groupname); + for (i = 1; i <= strlen(acl->group->groupname); i++) + oid->subs[sub + i] = acl->group->groupname[i - 1]; + sub += strlen(acl->group->groupname) + 1; + + oid->subs[sub] = strlen(acl->ctx_prefix); + for (i = 1; i <= strlen(acl->ctx_prefix); i++) + oid->subs[sub + i] = acl->ctx_prefix[i - 1]; + sub += strlen(acl->ctx_prefix) + 1; + oid->subs[sub++] = acl->sec_model; + oid->subs[sub] = acl->sec_level; +} + +static int +vacm_access_rule_index_decode(const struct asn_oid *oid, uint sub, char *gname, + char *cprefix, int32_t *smodel, int32_t *slevel) +{ + uint32_t i; + + if (oid->subs[sub] >= SNMP_ADM_STR32_SIZ) + return (-1); + + for (i = 0; i < oid->subs[sub]; i++) + gname[i] = oid->subs[sub + i + 1]; + gname[i] = '\0'; + sub += strlen(gname) + 1; + + if (oid->subs[sub] >= SNMP_ADM_STR32_SIZ) + return (-1); + + for (i = 0; i < oid->subs[sub]; i++) + cprefix[i] = oid->subs[sub + i + 1]; + cprefix[i] = '\0'; + sub += strlen(cprefix) + 1; + + *smodel = oid->subs[sub++]; + *slevel = oid->subs[sub]; + + return (0); +} + +struct vacm_access * +vacm_get_access_rule(const struct asn_oid *oid, uint sub) +{ + int32_t smodel, slevel; + char gname[SNMP_ADM_STR32_SIZ], prefix[SNMP_ADM_STR32_SIZ]; + struct vacm_access *acl; + + if (vacm_access_rule_index_decode(oid, sub, gname, prefix, &smodel, + &slevel) < 0) + return (NULL); + + for (acl = vacm_first_access_rule(); acl != NULL; + acl = vacm_next_access_rule(acl)) + if (strcmp(gname, acl->group->groupname) == 0 && + strcmp(prefix, acl->ctx_prefix) == 0 && + smodel == acl->sec_model && slevel == acl->sec_level) + return (acl); + + return (NULL); +} + +struct vacm_access * +vacm_get_next_access_rule(const struct asn_oid *oid __unused, uint sub __unused) +{ + int32_t smodel, slevel; + char gname[SNMP_ADM_STR32_SIZ], prefix[SNMP_ADM_STR32_SIZ]; + struct vacm_access *acl; + + if (oid->len - sub == 0) + return (vacm_first_access_rule()); + + if (vacm_access_rule_index_decode(oid, sub, gname, prefix, &smodel, + &slevel) < 0) + return (NULL); + + for (acl = vacm_first_access_rule(); acl != NULL; + acl = vacm_next_access_rule(acl)) + if (strcmp(gname, acl->group->groupname) == 0 && + strcmp(prefix, acl->ctx_prefix) == 0 && + smodel == acl->sec_model && slevel == acl->sec_model) + return (vacm_next_access_rule(acl)); + + return (NULL); +} + +static int +vacm_view_index_decode(const struct asn_oid *oid, uint sub, char *vname, + struct asn_oid *view_oid) +{ + uint32_t i; + int viod_off; + + if (oid->subs[sub] >= SNMP_ADM_STR32_SIZ) + return (-1); + + for (i = 0; i < oid->subs[sub]; i++) + vname[i] = oid->subs[sub + i + 1]; + vname[i] = '\0'; + + viod_off = sub + oid->subs[sub] + 1; + if ((view_oid->len = oid->subs[viod_off]) > ASN_MAXOIDLEN) + return (-1); + + memcpy(&view_oid->subs[0], &oid->subs[viod_off + 1], + view_oid->len * sizeof(view_oid->subs[0])); + + return (0); +} + +static void +vacm_append_viewindex(struct asn_oid *oid, uint sub, const struct vacm_view *view) +{ + uint32_t i; + + oid->len = sub + strlen(view->viewname) + 1; + oid->subs[sub] = strlen(view->viewname); + for (i = 1; i <= strlen(view->viewname); i++) + oid->subs[sub + i] = view->viewname[i - 1]; + + sub += strlen(view->viewname) + 1; + oid->subs[sub] = view->subtree.len; + oid->len++; + asn_append_oid(oid, &view->subtree); +} + +struct vacm_view * +vacm_get_view(const struct asn_oid *oid, uint sub) +{ + char vname[SNMP_ADM_STR32_SIZ]; + struct asn_oid subtree; + struct vacm_view *view; + + if (vacm_view_index_decode(oid, sub, vname, &subtree) < 0) + return (NULL); + + for (view = vacm_first_view(); view != NULL; view = vacm_next_view(view)) + if (strcmp(vname, view->viewname) == 0 && + asn_compare_oid(&subtree, &view->subtree)== 0) + return (view); + + return (NULL); +} + +struct vacm_view * +vacm_get_next_view(const struct asn_oid *oid, uint sub) +{ + char vname[SNMP_ADM_STR32_SIZ]; + struct asn_oid subtree; + struct vacm_view *view; + + if (oid->len - sub == 0) + return (vacm_first_view()); + + if (vacm_view_index_decode(oid, sub, vname, &subtree) < 0) + return (NULL); + + for (view = vacm_first_view(); view != NULL; view = vacm_next_view(view)) + if (strcmp(vname, view->viewname) == 0 && + asn_compare_oid(&subtree, &view->subtree)== 0) + return (vacm_next_view(view)); + + return (NULL); +} + +static struct vacm_view * +vacm_get_view_by_name(u_char *octets, u_int len) +{ + struct vacm_view *view; + + for (view = vacm_first_view(); view != NULL; view = vacm_next_view(view)) + if (strlen(view->viewname) == len && + memcmp(octets, view->viewname, len) == 0) + return (view); + + return (NULL); +} + +static struct vacm_context * +vacm_get_context(const struct asn_oid *oid, uint sub) +{ + char cname[SNMP_ADM_STR32_SIZ]; + size_t cnamelen; + u_int index_count; + struct vacm_context *vacm_ctx; + + if (oid->subs[sub] >= SNMP_ADM_STR32_SIZ) + return (NULL); + + index_count = 0; + index_count = SNMP_INDEX(index_count, 1); + if (index_decode(oid, sub, index_count, &cname, &cnamelen)) + return (NULL); + + for (vacm_ctx = vacm_first_context(); vacm_ctx != NULL; + vacm_ctx = vacm_next_context(vacm_ctx)) + if (strcmp(cname, vacm_ctx->ctxname) == 0) + return (vacm_ctx); + + return (NULL); +} + +static struct vacm_context * +vacm_get_next_context(const struct asn_oid *oid, uint sub) +{ + char cname[SNMP_ADM_STR32_SIZ]; + size_t cnamelen; + u_int index_count; + struct vacm_context *vacm_ctx; + + if (oid->len - sub == 0) + return (vacm_first_context()); + + if (oid->subs[sub] >= SNMP_ADM_STR32_SIZ) + return (NULL); + + index_count = 0; + index_count = SNMP_INDEX(index_count, 1); + if (index_decode(oid, sub, index_count, &cname, &cnamelen)) + return (NULL); + + for (vacm_ctx = vacm_first_context(); vacm_ctx != NULL; + vacm_ctx = vacm_next_context(vacm_ctx)) + if (strcmp(cname, vacm_ctx->ctxname) == 0) + return (vacm_next_context(vacm_ctx)); + + return (NULL); +} + +static void +vacm_append_ctxindex(struct asn_oid *oid, uint sub, + const struct vacm_context *ctx) +{ + uint32_t i; + + oid->len = sub + strlen(ctx->ctxname) + 1; + oid->subs[sub] = strlen(ctx->ctxname); + for (i = 1; i <= strlen(ctx->ctxname); i++) + oid->subs[sub + i] = ctx->ctxname[i - 1]; +} + +/* + * VACM snmp module initialization hook. + * Returns 0 on success, < 0 on error. + */ +static int +vacm_init(struct lmodule *mod, int argc __unused, char *argv[] __unused) +{ + vacm_module = mod; + vacm_lock = random(); + vacm_groups_init(); + + /* XXX: TODO - initialize structures */ + return (0); +} + +/* + * VACM snmp module finalization hook. + */ +static int +vacm_fini(void) +{ + /* XXX: TODO - cleanup */ + vacm_flush_contexts(reg_vacm); + or_unregister(reg_vacm); + + return (0); +} + +/* + * VACM snmp module start operation. + */ +static void +vacm_start(void) +{ + static char dflt_ctx[] = ""; + + reg_vacm = or_register(&oid_vacm, + "The MIB module for managing SNMP View-based Access Control Model.", + vacm_module); + + (void)vacm_add_context(dflt_ctx, reg_vacm); +} + +static void +vacm_dump(void) +{ + struct vacm_context *vacmctx; + struct vacm_user *vuser; + struct vacm_access *vacl; + struct vacm_view *view; + static char oidbuf[ASN_OIDSTRLEN]; + + syslog(LOG_ERR, "\n"); + syslog(LOG_ERR, "Context list:"); + for (vacmctx = vacm_first_context(); vacmctx != NULL; + vacmctx = vacm_next_context(vacmctx)) + syslog(LOG_ERR, "Context \"%s\", module id %d", + vacmctx->ctxname, vacmctx->regid); + + syslog(LOG_ERR, "VACM users:"); + for (vuser = vacm_first_user(); vuser != NULL; + vuser = vacm_next_user(vuser)) + syslog(LOG_ERR, "Uname %s, Group %s, model %d", vuser->secname, + vuser->group!= NULL?vuser->group->groupname:"Unknown", + vuser->sec_model); + + syslog(LOG_ERR, "VACM Access rules:"); + for (vacl = vacm_first_access_rule(); vacl != NULL; + vacl = vacm_next_access_rule(vacl)) + syslog(LOG_ERR, "Group %s, CtxPrefix %s, Model %d, Level %d, " + "RV %s, WR %s, NV %s", vacl->group!=NULL? + vacl->group->groupname:"Unknown", vacl->ctx_prefix, + vacl->sec_model, vacl->sec_level, vacl->read_view!=NULL? + vacl->read_view->viewname:"None", vacl->write_view!=NULL? + vacl->write_view->viewname:"None", vacl->notify_view!=NULL? + vacl->notify_view->viewname:"None"); + + syslog(LOG_ERR, "VACM Views:"); + for (view = vacm_first_view(); view != NULL; view = vacm_next_view(view)) + syslog(LOG_ERR, "View %s, Tree %s - %s", view->viewname, + asn_oid2str_r(&view->subtree, oidbuf), view->exclude? + "excluded":"included"); +} + +const char vacm_comment[] = \ +"This module implements SNMP View-based Access Control Model defined in RFC 3415."; + +const struct snmp_module config = { + .comment = vacm_comment, + .init = vacm_init, + .fini = vacm_fini, + .start = vacm_start, + .tree = vacm_ctree, + .dump = vacm_dump, + .tree_size = vacm_CTREE_SIZE, +}; diff --git a/contrib/bsnmp/snmp_vacm/vacm_tree.def b/contrib/bsnmp/snmp_vacm/vacm_tree.def new file mode 100755 index 0000000..db70f7d --- /dev/null +++ b/contrib/bsnmp/snmp_vacm/vacm_tree.def @@ -0,0 +1,104 @@ +#- +# Copyright (C) 2010 The FreeBSD Foundation +# All rights reserved. +# +# This software was developed by Shteryana Sotirova Shopova under +# sponsorship from the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +typedef StorageType ENUM ( + 1 other + 2 volatile + 3 nonVolatile + 4 permanent + 5 readOnly +) + +typedef RowStatus ENUM ( + 1 active + 2 notInService + 3 notReady + 4 createAndGo + 5 createAndWait + 6 destroy +) + +(1 internet + (6 snmpV2 + (3 snmpModules + (16 snmpVacmMIB + (1 vacmMIBObjects + (1 vacmContextTable + (1 vacmContextEntry : OCTETSTRING op_vacm_context + (1 vacmContextName OCTETSTRING GET) + ) + ) + (2 vacmSecurityToGroupTable + (1 vacmSecurityToGroupEntry : INTEGER OCTETSTRING op_vacm_security_to_group + (1 vacmSecurityModel INTEGER) + (2 vacmSecurityName OCTETSTRING) + (3 vacmGroupName OCTETSTRING GET SET) + (4 vacmSecurityToGroupStorageType StorageType GET SET) + (5 vacmSecurityToGroupStatus RowStatus GET SET) + ) + ) + (4 vacmAccessTable + (1 vacmAccessEntry : OCTETSTRING OCTETSTRING INTEGER ENUM ( 1 noAuthNoPriv 2 authNoPriv 3 authPriv ) op_vacm_access + (1 vacmAccessContextPrefix OCTETSTRING) + (2 vacmAccessSecurityModel INTEGER) + (3 vacmAccessSecurityLevel ENUM ( 1 noAuthNoPriv 2 authNoPriv 3 authPriv )) + (4 vacmAccessContextMatch ENUM ( 1 exact 2 prefix ) GET SET) + (5 vacmAccessReadViewName OCTETSTRING GET SET) + (6 vacmAccessWriteViewName OCTETSTRING GET SET) + (7 vacmAccessNotifyViewName OCTETSTRING GET SET) + (8 vacmAccessStorageType StorageType GET SET) + (9 vacmAccessStatus RowStatus GET SET) + ) + ) + (5 vacmMIBViews + (1 vacmViewSpinLock INTEGER op_vacm_view_lock GET SET) + (2 vacmViewTreeFamilyTable + (1 vacmViewTreeFamilyEntry : OCTETSTRING OID op_vacm_view + (1 vacmViewTreeFamilyViewName OCTETSTRING) + (2 vacmViewTreeFamilySubtree OID) + (3 vacmViewTreeFamilyMask OCTETSTRING GET SET) + (4 vacmViewTreeFamilyType ENUM ( 1 included 2 excluded ) GET SET) + (5 vacmViewTreeFamilyStorageType StorageType GET SET) + (6 vacmViewTreeFamilyStatus RowStatus GET SET) + ) + ) + ) + ) + (2 vacmMIBConformance + (1 vacmMIBCompliances + ) + (2 vacmMIBGroups + ) + ) + ) + ) + ) +) diff --git a/contrib/bsnmp/snmpd/BEGEMOT-SNMPD.txt b/contrib/bsnmp/snmpd/BEGEMOT-SNMPD.txt index 40b2cf0..3262ada 100644 --- a/contrib/bsnmp/snmpd/BEGEMOT-SNMPD.txt +++ b/contrib/bsnmp/snmpd/BEGEMOT-SNMPD.txt @@ -139,7 +139,8 @@ begemotSnmpdVersionEnable OBJECT-TYPE bits are defined: 0x00000001 - SNMPv1 - 0x00000002 - SNMPv2c" + 0x00000002 - SNMPv2c + 0x00000004 - SNMPv3" DEFVAL { 3 } ::= { begemotSnmpdConfig 5 } diff --git a/contrib/bsnmp/snmpd/action.c b/contrib/bsnmp/snmpd/action.c index 3d91ce3..ebba0f5 100644 --- a/contrib/bsnmp/snmpd/action.c +++ b/contrib/bsnmp/snmpd/action.c @@ -34,6 +34,7 @@ * Variable access for SNMPd */ #include +#include #include #include #include @@ -42,6 +43,7 @@ #include #include #include +#include #include #include "snmpmod.h" @@ -162,7 +164,83 @@ init_actvals(void) return (0); } +/* + * Initialize global variables of the snmpEngine group. + */ +int +init_snmpd_engine(void) +{ + char *hostid; + + snmpd_engine.engine_boots = 1; + snmpd_engine.engine_time = 1; + snmpd_engine.max_msg_size = 1500; /* XXX */ + + snmpd_engine.engine_id[0] = ((OID_freeBSD & 0xff000000) >> 24) | 0x80; + snmpd_engine.engine_id[1] = (OID_freeBSD & 0xff0000) >> 16; + snmpd_engine.engine_id[2] = (OID_freeBSD & 0xff00) >> 8; + snmpd_engine.engine_id[3] = OID_freeBSD & 0xff; + snmpd_engine.engine_id[4] = 128; + snmpd_engine.engine_len = 5; + + if ((hostid = act_getkernint(KERN_HOSTID)) == NULL) + return (-1); + + if (strlen(hostid) > SNMP_ENGINE_ID_SIZ - snmpd_engine.engine_len) { + memcpy(snmpd_engine.engine_id + snmpd_engine.engine_len, + hostid, SNMP_ENGINE_ID_SIZ - snmpd_engine.engine_len); + snmpd_engine.engine_len = SNMP_ENGINE_ID_SIZ; + } else { + memcpy(snmpd_engine.engine_id + snmpd_engine.engine_len, + hostid, strlen(hostid)); + snmpd_engine.engine_len += strlen(hostid); + } + + free(hostid); + + return (0); +} + +int +set_snmpd_engine(void) +{ + FILE *fp; + uint32_t i; + uint8_t *cptr, engine[2 * SNMP_ENGINE_ID_SIZ + 2]; + uint8_t myengine[2 * SNMP_ENGINE_ID_SIZ + 2]; + + if (engine_file[0] == '\0') + return (-1); + + cptr = myengine; + for (i = 0; i < snmpd_engine.engine_len; i++) + cptr += sprintf(cptr, "%.2x", snmpd_engine.engine_id[i]); + *cptr++ = '\n'; + *cptr++ = '\0'; + + if ((fp = fopen(engine_file, "r+")) != NULL) { + if (fgets(engine, sizeof(engine) - 1, fp) == NULL || + fscanf(fp, "%u", &snmpd_engine.engine_boots) <= 0) { + fclose(fp); + goto save_boots; + } + fclose(fp); + if (strcmp(myengine, engine) != 0) + snmpd_engine.engine_boots = 1; + else + snmpd_engine.engine_boots++; + } else if (errno != ENOENT) + return (-1); + +save_boots: + if ((fp = fopen(engine_file, "w+")) == NULL) + return (-1); + fprintf(fp, "%s%u\n", myengine, snmpd_engine.engine_boots); + fclose(fp); + + return (0); +} /************************************************************* * @@ -980,6 +1058,103 @@ op_snmp_set(struct snmp_context *ctx __unused, struct snmp_value *value, } /* + * SNMP Engine + */ +int +op_snmp_engine(struct snmp_context *ctx __unused, struct snmp_value *value, + u_int sub, u_int iidx __unused, enum snmp_op op) +{ + asn_subid_t which = value->var.subs[sub - 1]; + + switch (op) { + case SNMP_OP_GETNEXT: + abort(); + + case SNMP_OP_GET: + break; + + case SNMP_OP_SET: + if (community != COMM_INITIALIZE) + return (SNMP_ERR_NOT_WRITEABLE); + switch (which) { + case LEAF_snmpEngineID: + if (value->v.octetstring.len > SNMP_ENGINE_ID_SIZ) + return (SNMP_ERR_WRONG_VALUE); + ctx->scratch->ptr1 = malloc(snmpd_engine.engine_len); + if (ctx->scratch->ptr1 == NULL) + return (SNMP_ERR_GENERR); + memcpy(ctx->scratch->ptr1, snmpd_engine.engine_id, + snmpd_engine.engine_len); + ctx->scratch->int1 = snmpd_engine.engine_len; + snmpd_engine.engine_len = value->v.octetstring.len; + memcpy(snmpd_engine.engine_id, + value->v.octetstring.octets, + value->v.octetstring.len); + break; + + case LEAF_snmpEngineMaxMessageSize: + ctx->scratch->int1 = snmpd_engine.max_msg_size; + snmpd_engine.max_msg_size = value->v.integer; + break; + + default: + return (SNMP_ERR_NOT_WRITEABLE); + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_ROLLBACK: + switch (which) { + case LEAF_snmpEngineID: + snmpd_engine.engine_len = ctx->scratch->int1; + memcpy(snmpd_engine.engine_id, ctx->scratch->ptr1, + snmpd_engine.engine_len); + free(ctx->scratch->ptr1); + break; + + case LEAF_snmpEngineMaxMessageSize: + snmpd_engine.max_msg_size = ctx->scratch->int1; + break; + + default: + abort(); + } + return (SNMP_ERR_NOERROR); + + case SNMP_OP_COMMIT: + if (which == LEAF_snmpEngineID) { + if (set_snmpd_engine() < 0) { + snmpd_engine.engine_len = ctx->scratch->int1; + memcpy(snmpd_engine.engine_id, + ctx->scratch->ptr1, ctx->scratch->int1); + } + free(ctx->scratch->ptr1); + } + return (SNMP_ERR_NOERROR); + } + + + switch (which) { + case LEAF_snmpEngineID: + return (string_get(value, snmpd_engine.engine_id, + snmpd_engine.engine_len)); + case LEAF_snmpEngineBoots: + value->v.integer = snmpd_engine.engine_boots; + break; + case LEAF_snmpEngineTime: + snmpd_engine.engine_time = (get_ticks() - start_tick) / 100ULL; + value->v.integer = snmpd_engine.engine_time; + break; + case LEAF_snmpEngineMaxMessageSize: + value->v.integer = snmpd_engine.max_msg_size; + break; + default: + return (SNMP_ERR_NOSUCHNAME); + } + + return (SNMP_ERR_NOERROR); +} + +/* * Transport table */ int diff --git a/contrib/bsnmp/snmpd/bsnmpd.1 b/contrib/bsnmp/snmpd/bsnmpd.1 index b609efd..76141bc 100644 --- a/contrib/bsnmp/snmpd/bsnmpd.1 +++ b/contrib/bsnmp/snmpd/bsnmpd.1 @@ -31,7 +31,7 @@ .\" .\" $Begemot: bsnmp/snmpd/bsnmpd.1,v 1.12 2006/02/27 09:50:03 brandt_h Exp $ .\" -.Dd October 23, 2010 +.Dd September 9, 2010 .Dt BSNMPD 1 .Os .Sh NAME @@ -42,6 +42,7 @@ .Op Fl dh .Op Fl c Ar file .Op Fl D Ar options +.Op Fl e Ar file .Op Fl I Ar paths .Op Fl l Ar prefix .Op Fl m Ar variable Ns Op = Ns Ar value @@ -68,9 +69,11 @@ Use .Ar file as configuration file instead of the standard one. .It Fl D Ar options -Debugging options are specified as a comma separated string. +Debugging options are specified with a +.Fl o +flag followed by a comma separated string of options. The following options are available. -.Bl -tag -width "trace=level" +.Bl -tag -width ".It Cm trace Ns Cm = Ns Cm level" .It Cm dump Dump all sent and received PDUs to the terminal. .It Cm events @@ -80,8 +83,11 @@ to 10. .It Cm trace Ns Cm = Ns Cm level Set the snmp library trace flag to the specified value. -The value can be specified in the usual C-syntax for numbers. .El +The value can be specified in the usual C-syntax for numbers. +.It Fl e Ar file +Specify an alternate file where the agent's engine id and number of boots +are saved. .It Fl I Ar paths Specify a colon separated list of directories to search for configuration include files. @@ -246,6 +252,8 @@ Default configuration file, where the default .Aq prefix is .Dq snmpd . +.It Pa /var/ Ns Ao Ar prefix Ac Ns \&.engine +Default engine id file. .It Pa /var/run/ Ns Ao Ar prefix Ac Ns \&.pid Default pid file. .It Pa /etc:/usr/etc/:/usr/local/etc diff --git a/contrib/bsnmp/snmpd/config.c b/contrib/bsnmp/snmpd/config.c index 48044ec..c4f1188 100644 --- a/contrib/bsnmp/snmpd/config.c +++ b/contrib/bsnmp/snmpd/config.c @@ -31,6 +31,7 @@ * Parse configuration file. */ #include +#include #include #include #include @@ -810,6 +811,7 @@ parse_oid(const char *varname, struct asn_oid *oid) struct snmp_node *node; u_int i; u_char ip[4]; + struct asn_oid str_oid; for (node = tree; node < &tree[tree_size]; node++) if (strcmp(varname, node->name) == 0) @@ -824,7 +826,19 @@ parse_oid(const char *varname, struct asn_oid *oid) report("subid too large %#"QUADXFMT, numval); if (oid->len == ASN_MAXOIDLEN) report("index too long"); - oid->subs[oid->len++] = numval; + if (gettoken() != ':') + oid->subs[oid->len++] = numval; + else { + str_oid.len = 0; + str_oid.subs[str_oid.len++] = numval; + while (gettoken() == TOK_NUM) { + str_oid.subs[str_oid.len++] = numval; + if (gettoken() != ':') + break; + } + oid->subs[oid->len++] = str_oid.len; + asn_append_oid(oid, &str_oid); + } } else if (token == TOK_STR) { if (strvallen + oid->len + 1 > ASN_MAXOIDLEN) @@ -832,6 +846,7 @@ parse_oid(const char *varname, struct asn_oid *oid) oid->subs[oid->len++] = strvallen; for (i = 0; i < strvallen; i++) oid->subs[oid->len++] = strval[i]; + gettoken(); } else if (token == TOK_HOST) { gethost(strval, ip); @@ -839,10 +854,9 @@ parse_oid(const char *varname, struct asn_oid *oid) report("index too long"); for (i = 0; i < 4; i++) oid->subs[oid->len++] = ip[i]; - + gettoken(); } else report("bad token in index"); - gettoken(); } return (node); @@ -1006,7 +1020,7 @@ parse_assign(const char *varname) node = parse_oid(varname, &vindex); if (token != '=') - report("'=' expected"); + report("'=' expected, got '%c'", token); gettoken(); if (ignore) { diff --git a/contrib/bsnmp/snmpd/export.c b/contrib/bsnmp/snmpd/export.c index 9498361..08fb672 100644 --- a/contrib/bsnmp/snmpd/export.c +++ b/contrib/bsnmp/snmpd/export.c @@ -31,6 +31,7 @@ * Support functions for modules. */ #include +#include #include #include #include diff --git a/contrib/bsnmp/snmpd/main.c b/contrib/bsnmp/snmpd/main.c index e3660c1..e008bf7 100644 --- a/contrib/bsnmp/snmpd/main.c +++ b/contrib/bsnmp/snmpd/main.c @@ -30,6 +30,8 @@ * * SNMPd main stuff. */ + +#include #include #include #include @@ -60,6 +62,7 @@ #define PATH_PID "/var/run/%s.pid" #define PATH_CONFIG "/etc/%s.config" +#define PATH_ENGINE "/var/%s.engine" uint64_t this_tick; /* start of processing of current packet (absolute) */ uint64_t start_tick; /* start of processing */ @@ -87,6 +90,11 @@ struct snmpd snmpd = { }; struct snmpd_stats snmpd_stats; +struct snmpd_usmstat snmpd_usmstats; + +/* snmpEngine */ +struct snmp_engine snmpd_engine; + /* snmpSerialNo */ int32_t snmp_serial_no; @@ -102,6 +110,29 @@ static struct lmodules modules_start = TAILQ_HEAD_INITIALIZER(modules_start); /* list of all known communities */ struct community_list community_list = TAILQ_HEAD_INITIALIZER(community_list); +/* list of all known USM users */ +struct usm_userlist usm_userlist = SLIST_HEAD_INITIALIZER(usm_userlist); + +/* A list of all VACM users configured, including v1, v2c and v3 */ +struct vacm_userlist vacm_userlist = SLIST_HEAD_INITIALIZER(vacm_userlist); + +/* A list of all VACM groups */ +struct vacm_grouplist vacm_grouplist = SLIST_HEAD_INITIALIZER(vacm_grouplist); + +static struct vacm_group vacm_default_group = { + .groupname = "", +}; + +/* The list of configured access entries */ +struct vacm_accesslist vacm_accesslist = TAILQ_HEAD_INITIALIZER(vacm_accesslist); + +/* The list of configured views */ +struct vacm_viewlist vacm_viewlist = SLIST_HEAD_INITIALIZER(vacm_viewlist); + +/* The list of configured contexts */ +struct vacm_contextlist vacm_contextlist = + SLIST_HEAD_INITIALIZER(vacm_contextlist); + /* list of all installed object resources */ struct objres_list objres_list = TAILQ_HEAD_INITIALIZER(objres_list); @@ -128,9 +159,13 @@ static int nprogargs; u_int community; static struct community *comm; +/* current USM user */ +struct usm_user *usm_user; + /* file names */ static char config_file[MAXPATHLEN + 1]; static char pid_file[MAXPATHLEN + 1]; +char engine_file[MAXPATHLEN + 1]; #ifndef USE_LIBBEGEMOT /* event context */ @@ -154,6 +189,12 @@ static const struct asn_oid const struct asn_oid oid_zeroDotZero = { 2, { 0, 0 }}; +const struct asn_oid oid_usmUnknownEngineIDs = + { 11, { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0}}; + +const struct asn_oid oid_usmNotInTimeWindows = + { 11, { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0}}; + /* request id generator for traps */ u_int trap_reqid; @@ -161,13 +202,15 @@ u_int trap_reqid; static const char usgtxt[] = "\ Begemot simple SNMP daemon. Copyright (c) 2001-2002 Fraunhofer Institute for\n\ Open Communication Systems (FhG Fokus). All rights reserved.\n\ -usage: snmpd [-dh] [-c file] [-D options] [-I path] [-l prefix]\n\ - [-m variable=value] [-p file]\n\ +Copyright (c) 2010 The FreeBSD Foundation. All rights reserved.\n\ +usage: snmpd [-dh] [-c file] [-D options] [-e file] [-I path]\n\ + [-l prefix] [-m variable=value] [-p file]\n\ options:\n\ -d don't daemonize\n\ -h print this info\n\ -c file specify configuration file\n\ -D options debugging options\n\ + -e file specify engine id file\n\ -I path system include path\n\ -l prefix default basename for pid and config file\n\ -m var=val define variable\n\ @@ -243,7 +286,191 @@ snmp_output(struct snmp_pdu *pdu, u_char *sndbuf, size_t *sndlen, } /* - * SNMP input. Start: decode the PDU, find the community. + * Check USM PDU header credentials against local SNMP Engine & users. + */ +static enum snmp_code +snmp_pdu_auth_user(struct snmp_pdu *pdu) +{ + uint64_t etime; + usm_user = NULL; + + /* un-authenticated snmpEngineId discovery */ + if (pdu->engine.engine_len == 0 && strlen(pdu->user.sec_name) == 0) { + pdu->engine.engine_len = snmpd_engine.engine_len; + memcpy(pdu->engine.engine_id, snmpd_engine.engine_id, + snmpd_engine.engine_len); + pdu->engine.engine_boots = snmpd_engine.engine_boots; + pdu->engine.engine_time = snmpd_engine.engine_time; + pdu->flags |= SNMP_MSG_AUTODISCOVER; + return (SNMP_CODE_OK); + } + + if ((usm_user = usm_find_user(pdu->engine.engine_id, + pdu->engine.engine_len, pdu->user.sec_name)) == NULL || + usm_user->status != 1 /* active */) + return (SNMP_CODE_BADUSER); + + if (usm_user->user_engine_len != snmpd_engine.engine_len || + memcmp(usm_user->user_engine_id, snmpd_engine.engine_id, + snmpd_engine.engine_len) != 0) + return (SNMP_CODE_BADENGINE); + + pdu->user.priv_proto = usm_user->suser.priv_proto; + memcpy(pdu->user.priv_key, usm_user->suser.priv_key, + sizeof(pdu->user.priv_key)); + + /* authenticated snmpEngineId discovery */ + if ((pdu->flags & SNMP_MSG_AUTH_FLAG) != 0) { + etime = (get_ticks() - start_tick) / 100ULL; + if (etime < INT32_MAX) + snmpd_engine.engine_time = etime; + else { + start_tick = get_ticks(); + set_snmpd_engine(); + snmpd_engine.engine_time = start_tick; + } + + pdu->user.auth_proto = usm_user->suser.auth_proto; + memcpy(pdu->user.auth_key, usm_user->suser.auth_key, + sizeof(pdu->user.auth_key)); + + if (pdu->engine.engine_boots == 0 && + pdu->engine.engine_time == 0) { + pdu->flags |= SNMP_MSG_AUTODISCOVER; + return (SNMP_CODE_OK); + } + + if (pdu->engine.engine_boots != snmpd_engine.engine_boots || + abs(pdu->engine.engine_time - snmpd_engine.engine_time) > + SNMP_TIME_WINDOW) + return (SNMP_CODE_NOTINTIME); + } + + if (((pdu->flags & SNMP_MSG_PRIV_FLAG) != 0 && + (pdu->flags & SNMP_MSG_AUTH_FLAG) == 0) || + ((pdu->flags & SNMP_MSG_AUTH_FLAG) == 0 && + usm_user->suser.auth_proto != SNMP_AUTH_NOAUTH) || + ((pdu->flags & SNMP_MSG_PRIV_FLAG) == 0 && + usm_user->suser.priv_proto != SNMP_PRIV_NOPRIV)) + return (SNMP_CODE_BADSECLEVEL); + + return (SNMP_CODE_OK); +} + +/* + * Check whether access to each of var bindings in the PDU is allowed based + * on the user credentials against the configured User groups & VACM views. + */ +static enum snmp_code +snmp_pdu_auth_access(struct snmp_pdu *pdu, int32_t *ip) +{ + const char *uname; + int32_t suboid, smodel; + uint32_t i; + struct vacm_user *vuser; + struct vacm_access *acl; + struct vacm_context *vacmctx; + struct vacm_view *view; + + /* + * At least a default context exists if the snmpd_vacm(3) module is + * running. + */ + if (SLIST_EMPTY(&vacm_contextlist) || + (pdu->flags & SNMP_MSG_AUTODISCOVER) != 0) + return (SNMP_CODE_OK); + + switch (pdu->version) { + case SNMP_V1: + if ((uname = comm_string(community)) == NULL) + return (SNMP_CODE_FAILED); + smodel = SNMP_SECMODEL_SNMPv1; + break; + + case SNMP_V2c: + if ((uname = comm_string(community)) == NULL) + return (SNMP_CODE_FAILED); + smodel = SNMP_SECMODEL_SNMPv2c; + break; + + case SNMP_V3: + uname = pdu->user.sec_name; + if ((smodel = pdu->security_model) != SNMP_SECMODEL_USM) + return (SNMP_CODE_FAILED); + /* Compare the PDU context engine id against the agent's */ + if (pdu->context_engine_len != snmpd_engine.engine_len || + memcmp(pdu->context_engine, snmpd_engine.engine_id, + snmpd_engine.engine_len) != 0) + return (SNMP_CODE_FAILED); + break; + + default: + abort(); + } + + SLIST_FOREACH(vuser, &vacm_userlist, vvu) + if (strcmp(uname, vuser->secname) == 0 && + vuser->sec_model == smodel) + break; + + if (vuser == NULL || vuser->group == NULL) + return (SNMP_CODE_FAILED); + + /* XXX: shteryana - recheck */ + TAILQ_FOREACH_REVERSE(acl, &vacm_accesslist, vacm_accesslist, vva) { + if (acl->group != vuser->group) + continue; + SLIST_FOREACH(vacmctx, &vacm_contextlist, vcl) + if (memcmp(vacmctx->ctxname, acl->ctx_prefix, + acl->ctx_match) == 0) + goto match; + } + + return (SNMP_CODE_FAILED); + +match: + + switch (pdu->type) { + case SNMP_PDU_GET: + case SNMP_PDU_GETNEXT: + case SNMP_PDU_GETBULK: + if ((view = acl->read_view) == NULL) + return (SNMP_CODE_FAILED); + break; + + case SNMP_PDU_SET: + if ((view = acl->write_view) == NULL) + return (SNMP_CODE_FAILED); + break; + + case SNMP_PDU_TRAP: + case SNMP_PDU_INFORM: + case SNMP_PDU_TRAP2: + case SNMP_PDU_REPORT: + if ((view = acl->notify_view) == NULL) + return (SNMP_CODE_FAILED); + break; + case SNMP_PDU_RESPONSE: + /* NOTREACHED */ + return (SNMP_CODE_FAILED); + default: + abort(); + } + + for (i = 0; i < pdu->nbindings; i++) { + /* XXX - view->mask*/ + suboid = asn_is_suboid(&view->subtree, &pdu->bindings[i].var); + if ((!suboid && !view->exclude) || (suboid && view->exclude)) { + *ip = i + 1; + return (SNMP_CODE_FAILED); + } + } + + return (SNMP_CODE_OK); +} + +/* + * SNMP input. Start: decode the PDU, find the user or community. */ enum snmpd_input_err snmp_input_start(const u_char *buf, size_t len, const char *source, @@ -254,6 +481,9 @@ snmp_input_start(const u_char *buf, size_t len, const char *source, enum snmpd_input_err ret; int sret; + /* update uptime */ + this_tick = get_ticks(); + b.asn_cptr = buf; b.asn_len = len; @@ -269,11 +499,27 @@ snmp_input_start(const u_char *buf, size_t len, const char *source, } b.asn_len = *pdulen = (size_t)sret; - code = snmp_pdu_decode(&b, pdu, ip); + memset(pdu, 0, sizeof(*pdu)); + if ((code = snmp_pdu_decode_header(&b, pdu)) != SNMP_CODE_OK) + goto decoded; - snmpd_stats.inPkts++; + if (pdu->version == SNMP_V3) { + if (pdu->security_model != SNMP_SECMODEL_USM) { + code = SNMP_CODE_FAILED; + goto decoded; + } + if ((code = snmp_pdu_auth_user(pdu)) != SNMP_CODE_OK) + goto decoded; + if ((code = snmp_pdu_decode_secmode(&b, pdu)) != SNMP_CODE_OK) + goto decoded; + } + code = snmp_pdu_decode_scoped(&b, pdu, ip); ret = SNMPD_INPUT_OK; + +decoded: + snmpd_stats.inPkts++; + switch (code) { case SNMP_CODE_FAILED: @@ -300,6 +546,30 @@ snmp_input_start(const u_char *buf, size_t len, const char *source, ret = SNMPD_INPUT_VALBADENC; break; + case SNMP_CODE_BADSECLEVEL: + snmpd_usmstats.unsupported_seclevels++; + return (SNMPD_INPUT_FAILED); + + case SNMP_CODE_NOTINTIME: + snmpd_usmstats.not_in_time_windows++; + return (SNMPD_INPUT_FAILED); + + case SNMP_CODE_BADUSER: + snmpd_usmstats.unknown_users++; + return (SNMPD_INPUT_FAILED); + + case SNMP_CODE_BADENGINE: + snmpd_usmstats.unknown_engine_ids++; + return (SNMPD_INPUT_FAILED); + + case SNMP_CODE_BADDIGEST: + snmpd_usmstats.wrong_digests++; + return (SNMPD_INPUT_FAILED); + + case SNMP_CODE_EDECRYPT: + snmpd_usmstats.decrypt_errors++; + return (SNMPD_INPUT_FAILED); + case SNMP_CODE_OK: switch (pdu->version) { @@ -313,6 +583,11 @@ snmp_input_start(const u_char *buf, size_t len, const char *source, goto bad_vers; break; + case SNMP_V3: + if (!(snmpd.version_enable & VERS_ENABLE_V3)) + goto bad_vers; + break; + case SNMP_Verr: goto bad_vers; } @@ -325,25 +600,47 @@ snmp_input_start(const u_char *buf, size_t len, const char *source, } /* - * Look, whether we know the community + * Look, whether we know the community or user */ - TAILQ_FOREACH(comm, &community_list, link) - if (comm->string != NULL && - strcmp(comm->string, pdu->community) == 0) - break; - if (comm == NULL) { - snmpd_stats.inBadCommunityNames++; - snmp_pdu_free(pdu); - if (snmpd.auth_traps) - snmp_send_trap(&oid_authenticationFailure, - (struct snmp_value *)NULL); - ret = SNMPD_INPUT_BAD_COMM; - } else - community = comm->value; + if (pdu->version != SNMP_V3) { + TAILQ_FOREACH(comm, &community_list, link) + if (comm->string != NULL && + strcmp(comm->string, pdu->community) == 0) + break; - /* update uptime */ - this_tick = get_ticks(); + if (comm == NULL) { + snmpd_stats.inBadCommunityNames++; + snmp_pdu_free(pdu); + if (snmpd.auth_traps) + snmp_send_trap(&oid_authenticationFailure, + (struct snmp_value *)NULL); + ret = SNMPD_INPUT_BAD_COMM; + } else + community = comm->value; + } else if (pdu->nbindings == 0) { + /* RFC 3414 - snmpEngineID Discovery */ + if (strlen(pdu->user.sec_name) == 0) { + asn_append_oid(&(pdu->bindings[pdu->nbindings++].var), + &oid_usmUnknownEngineIDs); + pdu->context_engine_len = snmpd_engine.engine_len; + memcpy(pdu->context_engine, snmpd_engine.engine_id, + snmpd_engine.engine_len); + } else if (pdu->engine.engine_boots == 0 && + pdu->engine.engine_time == 0) { + asn_append_oid(&(pdu->bindings[pdu->nbindings++].var), + &oid_usmNotInTimeWindows); + pdu->engine.engine_boots = snmpd_engine.engine_boots; + pdu->engine.engine_time = snmpd_engine.engine_time; + } + } else if (usm_user->suser.auth_proto != SNMP_AUTH_NOAUTH && + (pdu->engine.engine_boots == 0 || pdu->engine.engine_time == 0)) { + snmpd_usmstats.not_in_time_windows++; + ret = SNMP_CODE_FAILED; + } + + if ((code = snmp_pdu_auth_access(pdu, ip)) != SNMP_CODE_OK) + ret = SNMP_CODE_FAILED; return (ret); } @@ -960,7 +1257,8 @@ snmpd_input(struct port_input *pi, struct tport *tport) * If that is a module community and the module has a proxy function, * the hand it over to the module. */ - if (comm->owner != NULL && comm->owner->config->proxy != NULL) { + if (comm != NULL && comm->owner != NULL && + comm->owner->config->proxy != NULL) { perr = (*comm->owner->config->proxy)(&pdu, tport->transport, &tport->index, pi->peer, pi->peerlen, ierr, vi, !pi->cred || pi->priv); @@ -1016,9 +1314,10 @@ snmpd_input(struct port_input *pi, struct tport *tport) /* * Check community */ - if ((pi->cred && !pi->priv && pdu.type == SNMP_PDU_SET) || + if (pdu.version < SNMP_V3 && + ((pi->cred && !pi->priv && pdu.type == SNMP_PDU_SET) || (community != COMM_WRITE && - (pdu.type == SNMP_PDU_SET || community != COMM_READ))) { + (pdu.type == SNMP_PDU_SET || community != COMM_READ)))) { snmpd_stats.inBadCommunityUses++; snmp_pdu_free(&pdu); snmp_input_consume(pi); @@ -1337,7 +1636,7 @@ main(int argc, char *argv[]) struct tport *p; const char *prefix = "snmpd"; struct lmodule *m; - char *value, *option; + char *value = NULL, *option; /* XXX */ struct transport *t; #define DBG_DUMP 0 @@ -1355,7 +1654,7 @@ main(int argc, char *argv[]) snmp_debug = snmp_debug_func; asn_error = asn_error_func; - while ((opt = getopt(argc, argv, "c:dD:hI:l:m:p:")) != EOF) + while ((opt = getopt(argc, argv, "c:dD:e:hI:l:m:p:")) != EOF) switch (opt) { case 'c': @@ -1401,6 +1700,9 @@ main(int argc, char *argv[]) } break; + case 'e': + strlcpy(engine_file, optarg, sizeof(engine_file)); + break; case 'h': fprintf(stderr, "%s", usgtxt); exit(0); @@ -1471,6 +1773,7 @@ main(int argc, char *argv[]) snprintf(config_file, sizeof(config_file), PATH_CONFIG, prefix); init_actvals(); + init_snmpd_engine(); this_tick = get_ticks(); start_tick = this_tick; @@ -1497,6 +1800,9 @@ main(int argc, char *argv[]) evSetDebug(evctx, 10, stderr); #endif + if (engine_file[0] == '\0') + snprintf(engine_file, sizeof(engine_file), PATH_ENGINE, prefix); + if (read_config(config_file, NULL)) { syslog(LOG_ERR, "error in config file"); exit(1); @@ -1601,7 +1907,7 @@ main(int argc, char *argv[]) } uint64_t -get_ticks() +get_ticks(void) { struct timeval tv; uint64_t ret; @@ -2374,3 +2680,566 @@ or_unregister(u_int idx) return; } } + +/* + * RFC 3414 User-based Security Model support + */ + +struct snmpd_usmstat * +bsnmpd_get_usm_stats(void) +{ + return (&snmpd_usmstats); +} + +void +bsnmpd_reset_usm_stats(void) +{ + memset(&snmpd_usmstats, 0, sizeof(&snmpd_usmstats)); +} + +struct usm_user * +usm_first_user(void) +{ + return (SLIST_FIRST(&usm_userlist)); +} + +struct usm_user * +usm_next_user(struct usm_user *uuser) +{ + if (uuser == NULL) + return (NULL); + + return (SLIST_NEXT(uuser, up)); +} + +struct usm_user * +usm_find_user(uint8_t *engine, uint32_t elen, char *uname) +{ + struct usm_user *uuser; + + SLIST_FOREACH(uuser, &usm_userlist, up) + if (uuser->user_engine_len == elen && + memcmp(uuser->user_engine_id, engine, elen) == 0 && + strlen(uuser->suser.sec_name) == strlen(uname) && + strcmp(uuser->suser.sec_name, uname) == 0) + break; + + return (uuser); +} + +static int +usm_compare_user(struct usm_user *u1, struct usm_user *u2) +{ + uint32_t i; + + if (u1->user_engine_len < u2->user_engine_len) + return (-1); + if (u1->user_engine_len > u2->user_engine_len) + return (1); + + for (i = 0; i < u1->user_engine_len; i++) { + if (u1->user_engine_id[i] < u2->user_engine_id[i]) + return (-1); + if (u1->user_engine_id[i] > u2->user_engine_id[i]) + return (1); + } + + if (strlen(u1->suser.sec_name) < strlen(u2->suser.sec_name)) + return (-1); + if (strlen(u1->suser.sec_name) > strlen(u2->suser.sec_name)) + return (1); + + for (i = 0; i < strlen(u1->suser.sec_name); i++) { + if (u1->suser.sec_name[i] < u2->suser.sec_name[i]) + return (-1); + if (u1->suser.sec_name[i] > u2->suser.sec_name[i]) + return (1); + } + + return (0); +} + +struct usm_user * +usm_new_user(uint8_t *eid, uint32_t elen, char *uname) +{ + int cmp; + struct usm_user *uuser, *temp, *prev; + + for (uuser = usm_first_user(); uuser != NULL; + (uuser = usm_next_user(uuser))) { + if (uuser->user_engine_len == elen && + strlen(uname) == strlen(uuser->suser.sec_name) && + strcmp(uname, uuser->suser.sec_name) == 0 && + memcmp(eid, uuser->user_engine_id, elen) == 0) + return (NULL); + } + + if ((uuser = (struct usm_user *)malloc(sizeof(*uuser))) == NULL) + return (NULL); + + memset(uuser, 0, sizeof(struct usm_user)); + strlcpy(uuser->suser.sec_name, uname, SNMP_ADM_STR32_SIZ); + memcpy(uuser->user_engine_id, eid, elen); + uuser->user_engine_len = elen; + + if ((prev = SLIST_FIRST(&usm_userlist)) == NULL || + usm_compare_user(uuser, prev) < 0) { + SLIST_INSERT_HEAD(&usm_userlist, uuser, up); + return (uuser); + } + + SLIST_FOREACH(temp, &usm_userlist, up) { + if ((cmp = usm_compare_user(uuser, temp)) <= 0) + break; + prev = temp; + } + + if (temp == NULL || cmp < 0) + SLIST_INSERT_AFTER(prev, uuser, up); + else if (cmp > 0) + SLIST_INSERT_AFTER(temp, uuser, up); + else { + syslog(LOG_ERR, "User %s exists", uuser->suser.sec_name); + free(uuser); + return (NULL); + } + + return (uuser); +} + +void +usm_delete_user(struct usm_user *uuser) +{ + SLIST_REMOVE(&usm_userlist, uuser, usm_user, up); + free(uuser); +} + +void +usm_flush_users(void) +{ + struct usm_user *uuser; + + while ((uuser = SLIST_FIRST(&usm_userlist)) != NULL) { + SLIST_REMOVE_HEAD(&usm_userlist, up); + free(uuser); + } + + SLIST_INIT(&usm_userlist); +} + +/* + * RFC 3415 View-based Access Control Model support + */ +struct vacm_user * +vacm_first_user(void) +{ + return (SLIST_FIRST(&vacm_userlist)); +} + +struct vacm_user * +vacm_next_user(struct vacm_user *vuser) +{ + if (vuser == NULL) + return (NULL); + + return (SLIST_NEXT(vuser, vvu)); +} + +static int +vacm_compare_user(struct vacm_user *v1, struct vacm_user *v2) +{ + uint32_t i; + + if (v1->sec_model < v2->sec_model) + return (-1); + if (v1->sec_model > v2->sec_model) + return (1); + + if (strlen(v1->secname) < strlen(v2->secname)) + return (-1); + if (strlen(v1->secname) > strlen(v2->secname)) + return (1); + + for (i = 0; i < strlen(v1->secname); i++) { + if (v1->secname[i] < v2->secname[i]) + return (-1); + if (v1->secname[i] > v2->secname[i]) + return (1); + } + + return (0); +} + +struct vacm_user * +vacm_new_user(int32_t smodel, char *uname) +{ + int cmp; + struct vacm_user *user, *temp, *prev; + + SLIST_FOREACH(user, &vacm_userlist, vvu) + if (strcmp(uname, user->secname) == 0 && + smodel == user->sec_model) + return (NULL); + + if ((user = (struct vacm_user *)malloc(sizeof(*user))) == NULL) + return (NULL); + + memset(user, 0, sizeof(*user)); + user->group = &vacm_default_group; + SLIST_INSERT_HEAD(&vacm_default_group.group_users, user, vvg); + user->sec_model = smodel; + strlcpy(user->secname, uname, sizeof(user->secname)); + + if ((prev = SLIST_FIRST(&vacm_userlist)) == NULL || + vacm_compare_user(user, prev) < 0) { + SLIST_INSERT_HEAD(&vacm_userlist, user, vvu); + return (user); + } + + SLIST_FOREACH(temp, &vacm_userlist, vvu) { + if ((cmp = vacm_compare_user(user, temp)) <= 0) + break; + prev = temp; + } + + if (temp == NULL || cmp < 0) + SLIST_INSERT_AFTER(prev, user, vvu); + else if (cmp > 0) + SLIST_INSERT_AFTER(temp, user, vvu); + else { + syslog(LOG_ERR, "User %s exists", user->secname); + free(user); + return (NULL); + } + + return (user); +} + +int +vacm_delete_user(struct vacm_user *user) +{ + if (user->group != NULL && user->group != &vacm_default_group) { + SLIST_REMOVE(&user->group->group_users, user, vacm_user, vvg); + if (SLIST_EMPTY(&user->group->group_users)) { + SLIST_REMOVE(&vacm_grouplist, user->group, + vacm_group, vge); + free(user->group); + } + } + + SLIST_REMOVE(&vacm_userlist, user, vacm_user, vvu); + free(user); + + return (0); +} + +int +vacm_user_set_group(struct vacm_user *user, u_char *octets, u_int len) +{ + struct vacm_group *group; + + if (len >= SNMP_ADM_STR32_SIZ) + return (-1); + + SLIST_FOREACH(group, &vacm_grouplist, vge) + if (strlen(group->groupname) == len && + memcmp(octets, group->groupname, len) == 0) + break; + + if (group == NULL) { + if ((group = (struct vacm_group *)malloc(sizeof(*group))) == NULL) + return (-1); + memset(group, 0, sizeof(*group)); + memcpy(group->groupname, octets, len); + group->groupname[len] = '\0'; + SLIST_INSERT_HEAD(&vacm_grouplist, group, vge); + } + + SLIST_REMOVE(&user->group->group_users, user, vacm_user, vvg); + SLIST_INSERT_HEAD(&group->group_users, user, vvg); + user->group = group; + + return (0); +} + +void +vacm_groups_init(void) +{ + SLIST_INSERT_HEAD(&vacm_grouplist, &vacm_default_group, vge); +} + +struct vacm_access * +vacm_first_access_rule(void) +{ + return (TAILQ_FIRST(&vacm_accesslist)); +} + +struct vacm_access * +vacm_next_access_rule(struct vacm_access *acl) +{ + if (acl == NULL) + return (NULL); + + return (TAILQ_NEXT(acl, vva)); +} + +static int +vacm_compare_access_rule(struct vacm_access *v1, struct vacm_access *v2) +{ + uint32_t i; + + if (strlen(v1->group->groupname) < strlen(v2->group->groupname)) + return (-1); + if (strlen(v1->group->groupname) > strlen(v2->group->groupname)) + return (1); + + for (i = 0; i < strlen(v1->group->groupname); i++) { + if (v1->group->groupname[i] < v2->group->groupname[i]) + return (-1); + if (v1->group->groupname[i] > v2->group->groupname[i]) + return (1); + } + + if (strlen(v1->ctx_prefix) < strlen(v2->ctx_prefix)) + return (-1); + if (strlen(v1->ctx_prefix) > strlen(v2->ctx_prefix)) + return (1); + + for (i = 0; i < strlen(v1->ctx_prefix); i++) { + if (v1->ctx_prefix[i] < v2->ctx_prefix[i]) + return (-1); + if (v1->ctx_prefix[i] > v2->ctx_prefix[i]) + return (1); + } + + if (v1->sec_model < v2->sec_model) + return (-1); + if (v1->sec_model > v2->sec_model) + return (1); + + if (v1->sec_level < v2->sec_level) + return (-1); + if (v1->sec_level > v2->sec_level) + return (1); + + return (0); +} + +struct vacm_access * +vacm_new_access_rule(char *gname, char *cprefix, int32_t smodel, int32_t slevel) +{ + struct vacm_group *group; + struct vacm_access *acl, *temp; + + TAILQ_FOREACH(acl, &vacm_accesslist, vva) { + if (acl->group == NULL) + continue; + if (strcmp(gname, acl->group->groupname) == 0 && + strcmp(cprefix, acl->ctx_prefix) == 0 && + acl->sec_model == smodel && acl->sec_level == slevel) + return (NULL); + } + + /* Make sure the group exists */ + SLIST_FOREACH(group, &vacm_grouplist, vge) + if (strcmp(gname, group->groupname) == 0) + break; + + if (group == NULL) + return (NULL); + + if ((acl = (struct vacm_access *)malloc(sizeof(*acl))) == NULL) + return (NULL); + + memset(acl, 0, sizeof(*acl)); + acl->group = group; + strlcpy(acl->ctx_prefix, cprefix, sizeof(acl->ctx_prefix)); + acl->sec_model = smodel; + acl->sec_level = slevel; + + if ((temp = TAILQ_FIRST(&vacm_accesslist)) == NULL || + vacm_compare_access_rule(acl, temp) < 0) { + TAILQ_INSERT_HEAD(&vacm_accesslist, acl, vva); + return (acl); + } + + TAILQ_FOREACH(temp, &vacm_accesslist, vva) + if (vacm_compare_access_rule(acl, temp) < 0) { + TAILQ_INSERT_BEFORE(temp, acl, vva); + return (acl); + } + + TAILQ_INSERT_TAIL(&vacm_accesslist, acl, vva); + + return (acl); +} + +int +vacm_delete_access_rule(struct vacm_access *acl) +{ + TAILQ_REMOVE(&vacm_accesslist, acl, vva); + free(acl); + + return (0); +} + +struct vacm_view * +vacm_first_view(void) +{ + return (SLIST_FIRST(&vacm_viewlist)); +} + +struct vacm_view * +vacm_next_view(struct vacm_view *view) +{ + if (view == NULL) + return (NULL); + + return (SLIST_NEXT(view, vvl)); +} + +static int +vacm_compare_view(struct vacm_view *v1, struct vacm_view *v2) +{ + uint32_t i; + + if (strlen(v1->viewname) < strlen(v2->viewname)) + return (-1); + if (strlen(v1->viewname) > strlen(v2->viewname)) + return (1); + + for (i = 0; i < strlen(v1->viewname); i++) { + if (v1->viewname[i] < v2->viewname[i]) + return (-1); + if (v1->viewname[i] > v2->viewname[i]) + return (1); + } + + return (asn_compare_oid(&v1->subtree, &v2->subtree)); +} + +struct vacm_view * +vacm_new_view(char *vname, struct asn_oid *oid) +{ + int cmp; + struct vacm_view *view, *temp, *prev; + + SLIST_FOREACH(view, &vacm_viewlist, vvl) + if (strcmp(vname, view->viewname) == 0) + return (NULL); + + if ((view = (struct vacm_view *)malloc(sizeof(*view))) == NULL) + return (NULL); + + memset(view, 0, sizeof(*view)); + strlcpy(view->viewname, vname, sizeof(view->viewname)); + asn_append_oid(&view->subtree, oid); + + if ((prev = SLIST_FIRST(&vacm_viewlist)) == NULL || + vacm_compare_view(view, prev) < 0) { + SLIST_INSERT_HEAD(&vacm_viewlist, view, vvl); + return (view); + } + + SLIST_FOREACH(temp, &vacm_viewlist, vvl) { + if ((cmp = vacm_compare_view(view, temp)) <= 0) + break; + prev = temp; + } + + if (temp == NULL || cmp < 0) + SLIST_INSERT_AFTER(prev, view, vvl); + else if (cmp > 0) + SLIST_INSERT_AFTER(temp, view, vvl); + else { + syslog(LOG_ERR, "View %s exists", view->viewname); + free(view); + return (NULL); + } + + return (view); +} + +int +vacm_delete_view(struct vacm_view *view) +{ + SLIST_REMOVE(&vacm_viewlist, view, vacm_view, vvl); + free(view); + + return (0); +} + +struct vacm_context * +vacm_first_context(void) +{ + return (SLIST_FIRST(&vacm_contextlist)); +} + +struct vacm_context * +vacm_next_context(struct vacm_context *vacmctx) +{ + if (vacmctx == NULL) + return (NULL); + + return (SLIST_NEXT(vacmctx, vcl)); +} + +struct vacm_context * +vacm_add_context(char *ctxname, int regid) +{ + int cmp; + struct vacm_context *ctx, *temp, *prev; + + SLIST_FOREACH(ctx, &vacm_contextlist, vcl) + if (strcmp(ctxname, ctx->ctxname) == 0) { + syslog(LOG_ERR, "Context %s exists", ctx->ctxname); + return (NULL); + } + + if ((ctx = (struct vacm_context *)malloc(sizeof(*ctx))) == NULL) + return (NULL); + + memset(ctx, 0, sizeof(*ctx)); + strlcpy(ctx->ctxname, ctxname, sizeof(ctx->ctxname)); + ctx->regid = regid; + + if ((prev = SLIST_FIRST(&vacm_contextlist)) == NULL || + strlen(ctx->ctxname) < strlen(prev->ctxname) || + strcmp(ctx->ctxname, prev->ctxname) < 0) { + SLIST_INSERT_HEAD(&vacm_contextlist, ctx, vcl); + return (ctx); + } + + SLIST_FOREACH(temp, &vacm_contextlist, vcl) { + if (strlen(ctx->ctxname) < strlen(temp->ctxname) || + strcmp(ctx->ctxname, temp->ctxname) < 0) { + cmp = -1; + break; + } + prev = temp; + } + + if (temp == NULL || cmp < 0) + SLIST_INSERT_AFTER(prev, ctx, vcl); + else if (cmp > 0) + SLIST_INSERT_AFTER(temp, ctx, vcl); + else { + syslog(LOG_ERR, "Context %s exists", ctx->ctxname); + free(ctx); + return (NULL); + } + + return (ctx); +} + +void +vacm_flush_contexts(int regid) +{ + struct vacm_context *ctx, *temp; + + SLIST_FOREACH_SAFE(ctx, &vacm_contextlist, vcl, temp) + if (ctx->regid == regid) { + SLIST_REMOVE(&vacm_contextlist, ctx, vacm_context, vcl); + free(ctx); + } +} diff --git a/contrib/bsnmp/snmpd/snmpd.h b/contrib/bsnmp/snmpd/snmpd.h index 39d90b7..79fc699 100644 --- a/contrib/bsnmp/snmpd/snmpd.h +++ b/contrib/bsnmp/snmpd/snmpd.h @@ -30,7 +30,7 @@ * * Private SNMPd data and functions. */ -#include + #ifdef USE_LIBBEGEMOT #include #else @@ -247,7 +247,8 @@ extern struct snmpd snmpd; #define VERS_ENABLE_V1 0x00000001 #define VERS_ENABLE_V2C 0x00000002 -#define VERS_ENABLE_ALL 0x00000003 +#define VERS_ENABLE_V3 0x00000004 +#define VERS_ENABLE_ALL (VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3) /* * The debug group @@ -280,6 +281,11 @@ struct snmpd_stats { extern struct snmpd_stats snmpd_stats; /* + * SNMPd Engine + */ +extern struct snmp_engine snmpd_engine; + +/* * OR Table */ struct objres { @@ -322,6 +328,11 @@ extern const char *syspath; extern int32_t snmp_serial_no; int init_actvals(void); + +extern char engine_file[]; +int init_snmpd_engine(void); +int set_snmpd_engine(void); + int read_config(const char *, struct lmodule *); int define_macro(const char *name, const char *value); diff --git a/contrib/bsnmp/snmpd/snmpmod.3 b/contrib/bsnmp/snmpd/snmpmod.3 index 6bea403..a142069 100644 --- a/contrib/bsnmp/snmpd/snmpmod.3 +++ b/contrib/bsnmp/snmpd/snmpmod.3 @@ -31,7 +31,7 @@ .\" .\" $Begemot: bsnmp/snmpd/snmpmod.3,v 1.14 2005/10/04 13:30:35 brandt_h Exp $ .\" -.Dd February 27, 2006 +.Dd September 9, 2010 .Dt SNMPMOD 3 .Os .Sh NAME @@ -60,6 +60,8 @@ .Nm comm_define , .Nm community , .Nm oid_zeroDotZero , +.Nm oid_usmUnknownEngineIDs , +.Nm oid_usmNotInTimeWindows , .Nm reqid_allocate , .Nm reqid_next , .Nm reqid_base , @@ -99,7 +101,16 @@ .Nm index_compare , .Nm index_compare_off , .Nm index_append , -.Nm index_append_off +.Nm index_append_off, +.Nm bsnmpd_get_usm_stats, +.Nm bsnmpd_reset_usm_stats, +.Nm usm_first_user, +.Nm usm_next_user, +.Nm usm_find_user, +.Nm usm_new_user, +.Nm usm_delete_user, +.Nm usm_flush_users, +.Nm usm_user .Nd "SNMP daemon loadable module interface" .Sh LIBRARY Begemot SNMP library @@ -228,6 +239,25 @@ Begemot SNMP library .Fn index_append "struct asn_oid *dst" "u_int sub" "const struct asn_oid *src" .Ft void .Fn index_append_off "struct asn_oid *dst" "u_int sub" "const struct asn_oid *src" "u_int off" +.Ft struct snmpd_usmstat * +.Fn bsnmpd_get_usm_stats "void" +.Ft void +.Fn bsnmpd_reset_usm_stats "void" +.Ft struct usm_user * +.Fn usm_first_user "void" +.Ft struct usm_user * +.Fn usm_next_user "struct usm_user *uuser" +.Ft struct usm_user * +.Fn usm_find_user "uint8_t *engine" "uint32_t elen" "char *uname" +.Ft struct usm_user * +.Fn usm_new_user "uint8_t *engine" "uint32_t elen" "char *uname" +.Ft void +.Fn usm_delete_user "struct usm_user *" +.Ft void +.Fn usm_flush_users "void" +.Vt extern struct usm_user *usm_user; +.Vt extern const struct asn_oid oid_usmUnknownEngineIDs; +.Vt extern const struct asn_oid oid_usmNotInTimeWindows; .Sh DESCRIPTION The .Xr bsnmpd 1 @@ -539,7 +569,7 @@ This is the initial community string. .El .Pp The function returns a globally unique community identifier. -If a PDU is +If a SNMPv1 or SNMPv2 PDU is received who's community string matches, this identifier is set into the global .Va community . .Pp @@ -549,10 +579,76 @@ returns the current community string for the given community. .Pp All communities defined by a module are automatically released when the module is unloaded. +.Ss THE USER-BASED SECURITY GROUP +The scalar statistics of the USM group are held in the global variable +.Va snmpd_usmstats : +.Bd -literal -offset indent +struct snmpd_usmstat { + uint32_t unsupported_seclevels; + uint32_t not_in_time_windows; + uint32_t unknown_users; + uint32_t unknown_engine_ids; + uint32_t wrong_digests; + uint32_t decrypt_errors; +}; +.Ed +.Fn bsnmpd_get_usm_stats +returns a pointer to the global structure containing the statistics. +.Fn bsnmpd_reset_usm_stats +clears the statistics of the USM group. +.Pp +A global list of configured USM users is maintained by the daemon. +.Bd -literal -offset indent +struct usm_user { + struct snmp_user suser; + uint8_t user_engine_id[SNMP_ENGINE_ID_SIZ]; + uint32_t user_engine_len; + char user_public[SNMP_USM_NAME_SIZ]; + uint32_t user_public_len; + int32_t status; + int32_t type; + SLIST_ENTRY(usm_user) up; +}; +.Ed +This structure represents an USM user. The daemon only responds to SNMPv3 PDUs +with user credentials matching an USM user entry in its global list. +If a SNMPv3 PDU is received, whose security model is USM, the global +.Va usm_user +is set to point at the user entry that matches the credentials contained in +the PDU. +However, the daemon does not create or remove USM users, it gives an interface +to external loadable module(s) to manage the list. +.Fn usm_new_user +adds an user entry in the list, and +.Fn usm_delete_user +deletes an existing entry from the list. +.Fn usm_flush_users +is used to remove all configured USM users. +.Fn usm_first_user +will return the first user in the list, or +.Li NULL +if the list is empty. +.Fn usm_next_user +will return the next user of a given entry if one exists, or +.Li NULL . +The list is sorted according to the USM user name and Engine ID. +.Fn usm_find_user +returns the USM user entry matching the given +.Fa engine +and +.Fa uname +or +.Li NULL +if an user with the specified name and engine id is not present in the list. .Ss WELL KNOWN OIDS The global variable .Va oid_zeroDotZero contains the OID 0.0. +The global variables +.Va oid_usmUnknownEngineIDs +.Va oid_usmNotInTimeWindows +contains the OIDs 1.3.6.1.6.3.15.1.1.4.0 and 1.3.6.1.6.3.15.1.1.2.0 used +in the SNMPv3 USM Engine Discovery. .Ss REQUEST ID RANGES For modules that implement SNMP client functions besides SNMP agent functions it may be necessary to identify SNMP requests by their identifier to allow diff --git a/contrib/bsnmp/snmpd/snmpmod.h b/contrib/bsnmp/snmpd/snmpmod.h index 5eba370..379070c 100644 --- a/contrib/bsnmp/snmpd/snmpmod.h +++ b/contrib/bsnmp/snmpd/snmpmod.h @@ -332,11 +332,137 @@ const char * comm_string(u_int); /* community for current packet */ extern u_int community; -/* +/* + * SNMP User-based Security Model data. Modified via the snmp_usm(3) module. + */ +struct snmpd_usmstat { + uint32_t unsupported_seclevels; + uint32_t not_in_time_windows; + uint32_t unknown_users; + uint32_t unknown_engine_ids; + uint32_t wrong_digests; + uint32_t decrypt_errors; +}; + +extern struct snmpd_usmstat snmpd_usmstats; +struct snmpd_usmstat *bsnmpd_get_usm_stats(void); +void bsnmpd_reset_usm_stats(void); + +struct usm_user { + struct snmp_user suser; + uint8_t user_engine_id[SNMP_ENGINE_ID_SIZ]; + uint32_t user_engine_len; + char user_public[SNMP_ADM_STR32_SIZ]; + uint32_t user_public_len; + int32_t status; + int32_t type; + SLIST_ENTRY(usm_user) up; +}; + +SLIST_HEAD(usm_userlist, usm_user); +struct usm_user *usm_first_user(void); +struct usm_user *usm_next_user(struct usm_user *); +struct usm_user *usm_find_user(uint8_t *, uint32_t, char *); +struct usm_user *usm_new_user(uint8_t *, uint32_t, char *); +void usm_delete_user(struct usm_user *); +void usm_flush_users(void); + +/* USM user for current packet */ +extern struct usm_user *usm_user; + +/* + * SNMP View-based Access Control Model data. Modified via the snmp_vacm(3) module. + */ +struct vacm_group; + +struct vacm_user { + /* Security user name from USM */ + char secname[SNMP_ADM_STR32_SIZ]; + int32_t sec_model; + /* Back pointer to user assigned group name */ + struct vacm_group *group; + int32_t type; + int32_t status; + SLIST_ENTRY(vacm_user) vvu; + SLIST_ENTRY(vacm_user) vvg; +}; + +SLIST_HEAD(vacm_userlist, vacm_user); + +struct vacm_group { + char groupname[SNMP_ADM_STR32_SIZ]; + struct vacm_userlist group_users; + SLIST_ENTRY(vacm_group) vge; +}; + +SLIST_HEAD(vacm_grouplist, vacm_group); + +struct vacm_access { + /* The group name is index, not a column in the table */ + struct vacm_group *group; + char ctx_prefix[SNMP_ADM_STR32_SIZ]; + int32_t sec_model; + int32_t sec_level; + int32_t ctx_match; + struct vacm_view *read_view; + struct vacm_view *write_view; + struct vacm_view *notify_view; + int32_t type; + int32_t status; + TAILQ_ENTRY(vacm_access) vva; +}; + +TAILQ_HEAD(vacm_accesslist, vacm_access); + +struct vacm_view { + char viewname[SNMP_ADM_STR32_SIZ]; /* key */ + struct asn_oid subtree; /* key */ + uint8_t mask[16]; + uint8_t exclude; + int32_t type; + int32_t status; + SLIST_ENTRY(vacm_view) vvl; +}; + +SLIST_HEAD(vacm_viewlist, vacm_view); + +struct vacm_context { + /* The ID of the module that registered this context */ + int32_t regid; + char ctxname[SNMP_ADM_STR32_SIZ]; + SLIST_ENTRY(vacm_context) vcl; +}; + +SLIST_HEAD(vacm_contextlist, vacm_context); + +void vacm_groups_init(void); +struct vacm_user *vacm_first_user(void); +struct vacm_user *vacm_next_user(struct vacm_user *); +struct vacm_user *vacm_new_user(int32_t, char *); +int vacm_delete_user(struct vacm_user *); +int vacm_user_set_group(struct vacm_user *, u_char *, u_int); +struct vacm_access *vacm_first_access_rule(void); +struct vacm_access *vacm_next_access_rule(struct vacm_access *); +struct vacm_access *vacm_new_access_rule(char *, char *, int32_t, int32_t); +int vacm_delete_access_rule(struct vacm_access *); +struct vacm_view *vacm_first_view(void); +struct vacm_view *vacm_next_view(struct vacm_view *); +struct vacm_view *vacm_new_view(char *, struct asn_oid *); +int vacm_delete_view(struct vacm_view *); +struct vacm_context *vacm_first_context(void); +struct vacm_context *vacm_next_context(struct vacm_context *); +struct vacm_context *vacm_add_context(char *, int32_t); +void vacm_flush_contexts(int32_t); + +/* * Well known OIDs */ extern const struct asn_oid oid_zeroDotZero; +/* SNMPv3 Engine Discovery */ +extern const struct asn_oid oid_usmUnknownEngineIDs; +extern const struct asn_oid oid_usmNotInTimeWindows; + /* * Request ID ranges. * diff --git a/contrib/bsnmp/snmpd/trans_lsock.c b/contrib/bsnmp/snmpd/trans_lsock.c index 3bcb333..2cddd48 100644 --- a/contrib/bsnmp/snmpd/trans_lsock.c +++ b/contrib/bsnmp/snmpd/trans_lsock.c @@ -31,6 +31,7 @@ * Local domain socket transport */ #include +#include #include #include diff --git a/contrib/bsnmp/snmpd/trans_udp.c b/contrib/bsnmp/snmpd/trans_udp.c index 7e308ee..acab70e 100644 --- a/contrib/bsnmp/snmpd/trans_udp.c +++ b/contrib/bsnmp/snmpd/trans_udp.c @@ -31,6 +31,7 @@ * UDP transport */ #include +#include #include #include diff --git a/contrib/bsnmp/snmpd/trap.c b/contrib/bsnmp/snmpd/trap.c index f37c1c8..18164cf 100644 --- a/contrib/bsnmp/snmpd/trap.c +++ b/contrib/bsnmp/snmpd/trap.c @@ -31,6 +31,7 @@ * TrapSinkTable */ #include +#include #include #include #include diff --git a/contrib/bsnmp/snmpd/tree.def b/contrib/bsnmp/snmpd/tree.def index 613bcde..00672eb 100644 --- a/contrib/bsnmp/snmpd/tree.def +++ b/contrib/bsnmp/snmpd/tree.def @@ -196,5 +196,15 @@ ) ) ) + (10 snmpFrameworkMIB + (2 snmpFrameworkMIBObjects + (1 snmpEngine + (1 snmpEngineID OCTETSTRING | SnmpEngineID op_snmp_engine GET) + (2 snmpEngineBoots INTEGER op_snmp_engine GET) + (3 snmpEngineTime INTEGER op_snmp_engine GET) + (4 snmpEngineMaxMessageSize INTEGER op_snmp_engine GET) + ) + ) + ) )) ) diff --git a/lib/libbsnmp/libbsnmp/Makefile b/lib/libbsnmp/libbsnmp/Makefile index a0ceecd..d33808d 100644 --- a/lib/libbsnmp/libbsnmp/Makefile +++ b/lib/libbsnmp/libbsnmp/Makefile @@ -2,6 +2,8 @@ # # Author: Harti Brandt +.include + CONTRIB= ${.CURDIR}/../../../contrib/bsnmp/lib .PATH: ${CONTRIB} @@ -11,8 +13,13 @@ SHLIBDIR?= /lib CFLAGS+= -I${CONTRIB} -DHAVE_ERR_H -DHAVE_GETADDRINFO -DHAVE_STRLCPY CFLAGS+= -DHAVE_STDINT_H -DHAVE_INTTYPES_H -DQUADFMT='"llu"' -DQUADXFMT='"llx"' -SRCS= asn1.c snmp.c snmpagent.c snmpclient.c support.c -INCS= asn1.h snmp.h snmpagent.h snmpclient.h +.if ${MK_OPENSSL} != "no" +CFLAGS+= -DHAVE_LIBCRYPTO +LDADD+= -lcrypto +.endif + +SRCS= asn1.c snmp.c snmpagent.c snmpclient.c snmpcrypto.c support.c +INCS= asn1.h snmp.h snmpagent.h snmpclient.h MAN= asn1.3 bsnmplib.3 bsnmpclient.3 bsnmpagent.3 .include diff --git a/usr.sbin/bsnmpd/bsnmpd/Makefile b/usr.sbin/bsnmpd/bsnmpd/Makefile index e74f675..f7e9b23 100644 --- a/usr.sbin/bsnmpd/bsnmpd/Makefile +++ b/usr.sbin/bsnmpd/bsnmpd/Makefile @@ -2,6 +2,8 @@ # # Author: Harti Brandt +.include + CONTRIB=${.CURDIR}/../../../contrib/bsnmp .PATH: ${CONTRIB}/snmpd @@ -11,7 +13,7 @@ SRCS+= oid.h tree.c tree.h XSYM= snmpMIB begemotSnmpdModuleTable begemotSnmpd begemotTrapSinkTable \ sysUpTime snmpTrapOID coldStart authenticationFailure \ begemotSnmpdTransUdp begemotSnmpdTransLsock begemotSnmpdLocalPortTable \ - freeBSDVersion + freeBSD freeBSDVersion CLEANFILES= oid.h tree.c tree.h MAN= bsnmpd.1 snmpmod.3 NO_WERROR= @@ -31,6 +33,10 @@ LDADD= -lbegemot -lbsnmp -lwrap LDFLAGS= -export-dynamic +.if ${MK_OPENSSL} != "no" +CFLAGS+= -DHAVE_LIBCRYPTO +.endif + oid.h: tree.def Makefile gensnmptree -e ${XSYM} < ${.ALLSRC:M*.def} > ${.TARGET} diff --git a/usr.sbin/bsnmpd/modules/Makefile b/usr.sbin/bsnmpd/modules/Makefile index c2b7360..f7deb77 100644 --- a/usr.sbin/bsnmpd/modules/Makefile +++ b/usr.sbin/bsnmpd/modules/Makefile @@ -13,6 +13,8 @@ SUBDIR= ${_snmp_atm} \ snmp_hostres \ snmp_mibII \ snmp_pf \ + snmp_usm \ + snmp_vacm \ snmp_wlan .if ${MK_NETGRAPH_SUPPORT} != "no" diff --git a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c index c7178f3..bc4bc35 100644 --- a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c +++ b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c @@ -26,6 +26,7 @@ * $FreeBSD$ */ +#include #include #include diff --git a/usr.sbin/bsnmpd/modules/snmp_usm/Makefile b/usr.sbin/bsnmpd/modules/snmp_usm/Makefile new file mode 100755 index 0000000..4ae818a --- /dev/null +++ b/usr.sbin/bsnmpd/modules/snmp_usm/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ +# +# Author: Shteryana Shopova + +CONTRIB= ${.CURDIR}/../../../../contrib/bsnmp +.PATH: ${CONTRIB}/snmp_usm + +MOD= usm +SRCS= usm_snmp.c +XSYM= snmpUsmMIB usmNoAuthProtocol usmHMACMD5AuthProtocol \ + usmHMACSHAAuthProtocol usmNoPrivProtocol usmDESPrivProtocol \ + usmAesCfb128Protocol usmUserSecurityName + +MAN= snmp_usm.3 + +CFLAGS+= -I${CONTRIB}/lib -I${CONTRIB}/snmpd -DSNMPTREE_TYPES +CFLAGS+= -DHAVE_ERR_H -DHAVE_GETADDRINFO -DHAVE_STRLCPY -DHAVE_SYS_TREE_H + +DEFS= ${MOD}_tree.def +BMIBS= + +.include diff --git a/usr.sbin/bsnmpd/modules/snmp_vacm/Makefile b/usr.sbin/bsnmpd/modules/snmp_vacm/Makefile new file mode 100755 index 0000000..1be8d62 --- /dev/null +++ b/usr.sbin/bsnmpd/modules/snmp_vacm/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ +# +# Author: Shteryana Shopova + +CONTRIB= ${.CURDIR}/../../../../contrib/bsnmp +.PATH: ${CONTRIB}/snmp_vacm + +MOD= vacm +SRCS= vacm_snmp.c +XSYM= snmpVacmMIB + +MAN= snmp_vacm.3 + +CFLAGS+= -I${CONTRIB}/lib -I${CONTRIB}/snmpd -DSNMPTREE_TYPES +CFLAGS+= -DHAVE_ERR_H -DHAVE_GETADDRINFO -DHAVE_STRLCPY -DHAVE_SYS_TREE_H + +DEFS= ${MOD}_tree.def +BMIBS= + +.include -- cgit v1.1 From 9ef714f2e2dd9ccafd17fc4781a095ec9b0265ba Mon Sep 17 00:00:00 2001 From: syrinx Date: Wed, 8 Dec 2010 14:30:25 +0000 Subject: Add bsnmpd(1)'s SNMP client tools (including SNMPv3 support) to the base system. Sponsored by: The FreeBSD Foundation (the SNMPv3 bits), Google Summer of Code 2005 Reviewed by: philip@ (mostly), bz@ (earlier version based on p4 ch124545) Approved by: philip@ --- usr.sbin/bsnmpd/Makefile | 3 +- usr.sbin/bsnmpd/tools/Makefile | 7 + usr.sbin/bsnmpd/tools/Makefile.inc | 13 + usr.sbin/bsnmpd/tools/bsnmptools/Makefile | 28 + usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 | 401 ++++ usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.c | 1275 +++++++++++++ usr.sbin/bsnmpd/tools/libbsnmptools/Makefile | 14 + usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpimport.c | 971 ++++++++++ usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c | 1018 ++++++++++ usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.c | 1287 +++++++++++++ usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.h | 95 + usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.c | 2121 +++++++++++++++++++++ usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.h | 331 ++++ 13 files changed, 7563 insertions(+), 1 deletion(-) create mode 100644 usr.sbin/bsnmpd/tools/Makefile create mode 100644 usr.sbin/bsnmpd/tools/Makefile.inc create mode 100644 usr.sbin/bsnmpd/tools/bsnmptools/Makefile create mode 100644 usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 create mode 100644 usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.c create mode 100644 usr.sbin/bsnmpd/tools/libbsnmptools/Makefile create mode 100644 usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpimport.c create mode 100644 usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c create mode 100644 usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.c create mode 100644 usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.h create mode 100755 usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.c create mode 100644 usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.h diff --git a/usr.sbin/bsnmpd/Makefile b/usr.sbin/bsnmpd/Makefile index c948108..632753d 100644 --- a/usr.sbin/bsnmpd/Makefile +++ b/usr.sbin/bsnmpd/Makefile @@ -2,6 +2,7 @@ SUBDIR= gensnmptree \ bsnmpd \ - modules + modules \ + tools .include diff --git a/usr.sbin/bsnmpd/tools/Makefile b/usr.sbin/bsnmpd/tools/Makefile new file mode 100644 index 0000000..3ffc01e --- /dev/null +++ b/usr.sbin/bsnmpd/tools/Makefile @@ -0,0 +1,7 @@ +# $FreeBSD$ +# Author: Shteryana Shopova + +SUBDIR= libbsnmptools \ + bsnmptools + +.include diff --git a/usr.sbin/bsnmpd/tools/Makefile.inc b/usr.sbin/bsnmpd/tools/Makefile.inc new file mode 100644 index 0000000..e08fe26 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/Makefile.inc @@ -0,0 +1,13 @@ +# $FreeBSD$ +# Author: Shteryana Shopova + +BINDIR?= /usr/bin + +CFLAGS+= -I. -I${.CURDIR} + +.if exists(${.OBJDIR}/../libbsnmptools) +LIBBSNMPTOOLSDIR= ${.OBJDIR}/../libbsnmptools +.else +LIBBSNMPTOOLSDIR= ${.CURDIR}/../libbsnmptools +.endif +LIBBSNMPTOOLS= ${LIBBSNMPTOOLSDIR}/libbsnmptools.a diff --git a/usr.sbin/bsnmpd/tools/bsnmptools/Makefile b/usr.sbin/bsnmpd/tools/bsnmptools/Makefile new file mode 100644 index 0000000..311b1a9 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/bsnmptools/Makefile @@ -0,0 +1,28 @@ +# $FreeBSD$ +# Author: Shteryana Shopova + +.include + +.PATH: ${.CURDIR} + +PROG= bsnmpget + +DPADD+= ${LIBBSNMP} ${LIBBSNMPTOOLS} +LDADD+= -lbsnmp -lbsnmptools +CFLAGS+= -I${.CURDIR}/../libbsnmptools +LDFLAGS+= -L${LIBBSNMPTOOLSDIR} + +.if ${MK_OPENSSL} != "no" +DPADD+= ${LIBCRYPTO} +LDADD+= -lcrypto +.endif + +LINKS= ${DESTDIR}/usr/bin/bsnmpget ${DESTDIR}/usr/bin/bsnmpwalk +LINKS+= ${DESTDIR}/usr/bin/bsnmpget ${DESTDIR}/usr/bin/bsnmpset + +MAN= bsnmpget.1 + +MLINKS= bsnmpget.1 bsnmpwalk.1 +MLINKS+= bsnmpget.1 bsnmpset.1 + +.include diff --git a/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 b/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 new file mode 100644 index 0000000..aa3f911 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 @@ -0,0 +1,401 @@ +.\" +.\" Copyright (c) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" Portions of this documentation were written by Shteryana Sotirova Shopova +.\" under sponsorship from the FreeBSD Foundation. +.\" +.\" Copyright (c) 2005-2007 The FreeBSD Project. +.\" All rights reserved. +.\" +.\" Author: Shteryana Shopova +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd September 17, 2007 +.Dt BSNMPGET 1 +.Os +.Sh NAME +.Nm bsnmpget , +.Nm bsnmpwalk , +.Nm bsnmpset +.Nd "simple tools for querying SNMP agents" +.Sh SYNOPSIS +.Nm +.Op Fl aDdehnK +.Op Fl A Ar options +.Op Fl b Ar buffersize +.Op Fl C Ar options +.Op Fl I Ar options +.Op Fl i Ar filelist +.Op Fl l Ar filename +.Op Fl M Ar max-repetitions +.Op Fl N Ar non-repeaters +.Op Fl o Ar output +.Op Fl P Ar options +.Op Fl p Ar pdu +.Op Fl r Ar retries +.Op Fl s Ar [trans::][community@][server][:port] +.Op Fl t Ar timeout +.Op Fl U Ar options +.Op Fl v Ar version +.Op Ar OID ... +.Pp +.Nm bsnmpwalk +.Op Fl dhnK +.Op Fl A Ar options +.Op Fl b Ar buffersize +.Op Fl C Ar options +.Op Fl I Ar options +.Op Fl i Ar filelist +.Op Fl l Ar filename +.Op Fl o Ar output +.Op Fl P Ar options +.Op Fl r Ar retries +.Op Fl s Ar [trans::][community@][server][:port] +.Op Fl t Ar timeout +.Op Fl U Ar options +.Op Fl v Ar version +.Op Ar OID ... +.Pp +.Nm bsnmpset +.Op Fl adehnK +.Op Fl A Ar options +.Op Fl b Ar buffersize +.Op Fl C Ar options +.Op Fl I Ar options +.Op Fl i Ar filelist +.Op Fl l Ar filename +.Op Fl o Ar output +.Op Fl P Ar options +.Op Fl r Ar retries +.Op Fl s Ar [trans::][community@][server][:port] +.Op Fl t Ar timeout +.Op Fl U Ar options +.Op Fl v Ar version +.Ar OID Ns = Ar syntax Ns : Ns Ar value +.Op Ar OID Ns = Ar syntax Ns : Ns Ar value ... +.Sh DESCRIPTION +.Nm , +.Nm bsnmpwalk +and +.Nm bsnmpset +are simple tools for retrieving management information from and setting +management information to a Simple Network Managment Protocol (SNMP) agent. +.Pp +Depending on the options +.Nm bsnmpget +constructs either a SMNP GetRequest, GetNextRequest +or a GetBulkRequest packet, fills in the object identifiers (OIDs) of the +objects whose values will be retrived, waits for a response and prints it if +received successfully. +.Pp +.Nm Bsnmpwalk +queries an agent with SMNP GetNextRequest packets, +asking for values of OID instances that are a part of the object subtree +rooted at the provided OIDs. +.Pp +.Nm Bsnmpset +constructs a SMNP SetRequest packet, fills in the OIDs (object identifiers), +syntaxes and values of the objects whose values are to be set and waits for a +responce from server. +.Sh OPTIONS +.Pp +The options are as follows (not all apply to all three programs): +.Bl -tag -width ".It Fl D Ar options" +.It Fl A Ar options +Authentication options to use with SNMPv3 PDUs +.Bl -tag -width +.It Cm proto=[md5|sha] +The protocol to use when calculating the PDU message digest. +.It Cm key=authkey +A binary localized authentication key to use when calculating the PDU message +digest. +.El +.Pp +By default SNMPv3 PDUs are sent unauthenticated. +.It Fl a +Skip any sanity checks when adding OIDs to a Protocol Data Unit (PDU): +ingore syntax/access type, allow adding of non-leaf objects for GetPdu and +read-only objects to a SetPDU. +.It Fl b Ar buffersize +Tune the size of buffers used to send and receive packets. +The default size is 10000 bytes which should be enough unless an agent sends +a really large octetstring. +The maximum allowed length is 65535 according to the Structure of Management +Information (SMIv2). +.It Fl C Ar options +The context to query with SNMPv3 PDUs. +.Bl -tag -width +.It Cm context=name +The context name. Default is "" (empty). +.It Cm context-engine=engine-id +The SNMP Engine ID of the context to query with SNMPv3 PDUs, represented as +binary octet string. By default, this is set to the Engine ID of the SNMP agent. +.El +.It Fl D +Perform SNMP USM Engine Discovery, rather than sending a request for the value +of a specific object. +.It Fl d +Turn on debugging. +This option will cause the packets sent and received to be dumped to the +terminal. +.It Fl e +Retry on error. +If an error is returned in the response PDU, resend the request removing the +variable that caused the error until a valid response is received. +This is only usefull for a GetRequest- and a GetNextRequest-PDU. +.It Fl h +Print a short help text with default values for various options. +.It Fl I Ar options +Load each MIB description file from the given list to translate symbolic +object names to their numerical representation and vice versa. +Use the other options to obtain a non-default behaviour: +.Bl -tag -width +.It Cm cut=OID +Specifies the initial OID that was cut by +.Xr gensnmpdef 1 +when producing the MIB description file. +The default value is .iso(1).org(3).dod(6) which is what should have been +used for all the files installed under /usr/share/snmp/defs/ . +Use this only if you generated your own files, providing a '-c' option to +.Xr gensnmpdef 1 . +.It Cm path=filedir +The directory where files in the list will be searched. +The default is +.Pa /usr/share/snmp/defs/ . +.It Cm file=filelist +A comma separated list of files to which the two options above will apply. +.El +.Pp +The file suboption has to come after the other suboptions so that their +non-default values will be applied to the list of files. +The order of the other suboptions before each file suboption can be random. +Suboptions may be separated either by commas or by spaces. +If using spaces make sure the entire option string is one argument, for +example using quotes. +.It Fl i Ar filelist +List of MIB description files produced by +.Xr gensnmpdef 1 which +.Nm bsnmpget , +.Nm bsnmpwalk +or +.Nm bsnmpset +will search to translate numerical OIDs to their symbolic object names. +Multiple files can be provided either giving this option multiple times +or a comma separated list of file names. +If a filename begins with a letter the default directory, +/usr/share/snmp/defs/ , +will be searched. +.It Fl K +Calculate and display the localized authentication and privacy keys +corresponding to a plain text password. The password is obtain via the +environment. Additionally, if one or more OIDs are specified, the calculated +keys are used when processing the SNMPv3 requests. +.It Fl l Ar filename +The path of the posix local (unix domain) socket if local +transport is used. +.It Fl M Ar max-repetitions +The value for the max-repetitions field in a GetBulk PDU. +Default is 1. +.It Fl N Ar non-repeaters +The value for the non-repeaters field in a GetBulk PDU. +Default is 0. +.It Fl n +Only use numerical representations for input and output OIDs and do not +try to resolve symbolic object names. +Note that +.Nm bsnmpget , +.Nm bsnmpwalk +and +.Nm bsnmpset +will print numerical OIDs anyway if the corresponding string representation +is not found in the MIB description files. +.It Fl o Ar [quiet|short|verbose] +The format used to print the received response. +Quiet only prints values, short (default) prints an abbreviated OID +representation and the value. +In addition to the short output verbose prints the type before the value. +.It Fl P Ar options +Privacy options to use with SNMPv3 PDUs +.Bl -tag -width +.It Cm proto=[aes|des] +The protocol to use when encypting/decrypting SNMPv3 PDU data. +.It Cm key=privkey +A binary localized privacy key to use when encypting/decrypting SNMPv3 PDU data. +.El +.Pp +By default plain text SNMPv3 PDUs are sent. +.It Fl p Ar [get|getnext|getbulk] +The PDU type to send by +.Nm bsmpget . +Default is get. +.It Fl r Ar retries +Number of resends of request packets before giving up if the agent does +not respond after the first try. +Default is 3. +.It Fl s Ar [trans::] Ns Ar [community@] Ns Ar [server] Ns Ar [:port] +Each of the server specification components is optional but at least one +has to be provided if '-s' option is used. +The server specification is constructed in the following manner: +.Bl -tag -width +.It Cm trans:: +Transport type may be one of udp, stream or dgram. +If this option is not provided an udp inet/inet6 socket will be used, which +is the most common. +Stream stands for a posix local stream socket and a posix local datagram +socket will be used if dgram is specified. +.It Cm community@ +Specify an SNMP community string to be used when sending packets. +If the option is skipped the default "public" will be used for +.Nm +and +.Nm bsnmpwalk +and the default "private" community string will be used for +.Nm bsnmpset . +.It Cm server +This might be either the IP address or the hostname where the agent is +listening. +The default is 'localhost'. +.It Cm port +The destination port to send the requests to. +This is useful if the SNMP agent listens on a non-default port. +Default is given by the 'snmp' entry in /etc/services, port 161. +.El +.It Fl t Ar timeout +Number of seconds before resending a request packet if the agent does +not respond. +The default value is 3 seconds. +.It Fl U Ar options +User credentials when sending SNMPv3 PDUs. +.Bl -tag -width +.It Cm engine=id +The Engine ID of the SNMP agent represented as a binary octet string. +.It Cm engine-boots=value +The value of the snmpEngineBoots of the SNMP agent. +.It Cm engine-time=value +The value of the snmpEngineTime of the SNMP agent. +.Pp +If any of the above is not specified, SNMP USM Engine Discovery is attempted. +This is also the default behavior. +.It Cm name=username +The USM user name to include in the SNMPv3 PDUs. By default, the user name is +obtain via the environment +.El +.It Fl v Ar version +The SNMP protocol version to use when sending requests. SNMP versions 1, 2 and +3 are supported. +If no version option is provided +.Nm bsnmpget , +.Nm bsnmpwalk +and +.Nm bsnmpset +will use version 2. +Note that GetBulkRequest-PDUs were introduced in SNMPv2 thus setting the +version to 1 is incompatiable with sending a GetBulk PDU. +.It OID +The object identifier whose value to retrive. +At least one OID should be provided for +.Nm bsnmpget +to be able to send a request. +.Pp +For +.Nm bsnmpwalk +this is the root object identifier of the subtree whose values are to be +retrived. +If no OID is provided +.Nm bsnmpwalk +will walk the mib2 subtree rooted +at .iso(1).org(3).dod(6).internet(1).mgmt(2).mib2(1) . +.Pp +Any of the formats used to print a single variable +is valid as input OID: +.Bl -tag -width +.It 1.3.6.1.2.1.25.1.1.0 +.It sysDescr +.It ifPhysAddress.1 +.It ifRcvAddressStatus.2.6.255.255.255.255.255.255 +.It ifRcvAddressType[2,ff:ff:ff:ff:ff:ff] +.It ifRcvAddressStatus[Integer:1,OctetString:ff:ff:ff:ff:ff:ff] +(requires '-o verbose' option) +.El +.Pp +Square brackets are used to denote an entry's indexes. +When used in an input OID, the square brackets may have to be +escaped or the OID has to be quoted to protect it from the shell. +Note there is no difference between ifName.1 and "ifName[1]". +.It OID Ns = Ns Ar [syntax Ns :] Ns Ar value +The object identifier with its syntax type and value that is to be set. +At least one such string OID=[syntax:]value should be provided to +.Nm bsnmpset +to be able to send a request. +.Bl -tag -width +.It Cm OID +OID may be input as a string, a string followed by a random number of integers +(suboids) separated by dots, a sequence of integers separated by dots - that is +if '-n' options is used - and in such case a syntax is required for every value, +or a string followed by square brackets (used to denote an entry's indexes) and +corresponding indexes. +Any of formats used to print a single variable by +.Nm bsnmpset is +valid for inpit OID as well: +.Bl -tag -width +.It 1.3.6.1.2.1.25.1.1.0=TimeTicks:537615486 +.It sysLocation=OctetString:"@ Home" (with '-o verbose' option) +.It sysLocation.0="@ Home" +.It 1.3.6.1.2.1.2.2.1.6.1=OctetString:ffffffffffff +.It ifPhysAddress.1="00:02:b3:1d:1c:a3" +.It ifRcvAddressStatus.1.6.255.255.255.255.255.255=1 +.It "ifRcvAddressStatus[Integer:1,OctetString:ff:ff:ff:ff:ff:ff]=Integer:1" +(with '-o verbose' option) +.El +.It Cm syntax +where syntax string is one of : +Integer, OctetString, OID, IpAddress, Counter32, Gauge, TimeTicks, Counter64. +.It Cm value +The value to be set - IP address in form of u.u.u.u - for example +1.3.1.6.1.2.0=IpAddress:192.168.0.1, strings require inverted-commas if they +contain any special characters or spaces, all other numeric types don't. +.El +.Sh ENVIRONMENT +.Nm , +.Nm bsnmpwalk +and +.Nm bsnmpset +use the following environment variables: +.Bl -tag -width SNMPAUTH +.It Ev SNMPAUTH +Specifies a default SNMP USM authentication protocol. +.It Ev SNMPPRIV +Specifies a default SNMP USM privacy protocol. +.It Ev SNMPUSER +Specifies a default SNMP USM user name. +.It Ev SNMPPASSWD +Specifies the SNMP USM plain text password to use when calculating localized +authentication and privacy keys. If this variable exists in the environment, +SMNPv3 is the default version to use for outgoing requests. +.Sh SEE ALSO +.Xr gensnmpdef 1 +.Sh AUTHORS +.An Shteryana Shopova Aq syrinx@FreeBSD.org diff --git a/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.c b/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.c new file mode 100644 index 0000000..c05a05a --- /dev/null +++ b/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.c @@ -0,0 +1,1275 @@ +/*- + * Copyright (c) 2005-2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Bsnmpget and bsnmpwalk are simple tools for querying SNMP agents, + * bsnmpset can be used to set MIB objects in an agent. + * + * $FreeBSD$ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "bsnmptc.h" +#include "bsnmptools.h" + +static const char *program_name = NULL; +static enum program_e { + BSNMPGET, + BSNMPWALK, + BSNMPSET +} program; + +/* ***************************************************************************** + * Common bsnmptools functions. + */ +static void +usage(void) +{ + fprintf(stderr, +"Usage:\n" +"%s %s [-A options] [-b buffersize] [-C options] [-I options]\n" +"\t[-i filelist] [-l filename]%s [-o output] [-P options]\n" +"\t%s[-r retries] [-s [trans::][community@][server][:port]]\n" +"\t[-t timeout] [-U options] [-v version]%s\n", + program_name, + (program == BSNMPGET) ? "[-aDdehnK]" : + (program == BSNMPWALK) ? "[-dhnK]" : + (program == BSNMPSET) ? "[-adehnK]" : + "", + (program == BSNMPGET) ? " [-M max-repetitions] [-N non-repeaters]" : "", + (program == BSNMPGET) ? "[-p pdu] " : "", + (program == BSNMPGET) ? " OID [OID ...]" : + (program == BSNMPWALK || program == BSNMPSET) ? " [OID ...]" : + "" + ); +} + +static int32_t +parse_max_repetitions(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + uint32_t v; + + assert(opt_arg != NULL); + + v = strtoul(opt_arg, (void *) NULL, 10); + + if (v > SNMP_MAX_BINDINGS) { + warnx("Max repetitions value greater than %d maximum allowed.", + SNMP_MAX_BINDINGS); + return (-1); + } + + SET_MAXREP(snmptoolctx, v); + return (2); +} + +static int32_t +parse_non_repeaters(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + uint32_t v; + + assert(opt_arg != NULL); + + v = strtoul(opt_arg, (void *) NULL, 10); + + if (v > SNMP_MAX_BINDINGS) { + warnx("Non repeaters value greater than %d maximum allowed.", + SNMP_MAX_BINDINGS); + return (-1); + } + + SET_NONREP(snmptoolctx, v); + return (2); +} + +static int32_t +parse_pdu_type(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + assert(opt_arg != NULL); + + if (strcasecmp(opt_arg, "getbulk") == 0) + SET_PDUTYPE(snmptoolctx, SNMP_PDU_GETBULK); + else if (strcasecmp(opt_arg, "getnext") == 0) + SET_PDUTYPE(snmptoolctx, SNMP_PDU_GETNEXT); + else if (strcasecmp(opt_arg, "get") == 0) + SET_PDUTYPE(snmptoolctx, SNMP_PDU_GET); + else { + warnx("PDU type '%s' not supported.", opt_arg); + return (-1); + } + + return (2); +} + +static int32_t +snmptool_parse_options(struct snmp_toolinfo *snmptoolctx, int argc, char **argv) +{ + int32_t count, optnum = 0; + int ch; + const char *opts; + + switch (program) { + case BSNMPWALK: + opts = "dhnKA:b:C:I:i:l:o:P:r:s:t:U:v:"; + break; + case BSNMPGET: + opts = "aDdehnKA:b:C:I:i:l:M:N:o:P:p:r:s:t:U:v:"; + break; + case BSNMPSET: + opts = "adehnKA:b:C:I:i:l:o:P:r:s:t:U:v:"; + break; + default: + return (-1); + } + + while ((ch = getopt(argc, argv, opts)) != EOF) { + switch (ch) { + case 'A': + count = parse_authentication(snmptoolctx, optarg); + break; + case 'a': + count = parse_skip_access(snmptoolctx); + break; + case 'b': + count = parse_buflen(optarg); + break; + case 'D': + count = parse_discovery(snmptoolctx); + break; + case 'd': + count = parse_debug(); + break; + case 'e': + count = parse_errors(snmptoolctx); + break; + case 'h': + usage(); + return (-2); + case 'C': + count = parse_context(snmptoolctx, optarg); + break; + case 'I': + count = parse_include(snmptoolctx, optarg); + break; + case 'i': + count = parse_file(snmptoolctx, optarg); + break; + case 'K': + count = parse_local_key(snmptoolctx); + break; + case 'l': + count = parse_local_path(optarg); + break; + case 'M': + count = parse_max_repetitions(snmptoolctx, optarg); + break; + case 'N': + count = parse_non_repeaters(snmptoolctx, optarg); + break; + case 'n': + count = parse_num_oids(snmptoolctx); + break; + case 'o': + count = parse_output(snmptoolctx, optarg); + break; + case 'P': + count = parse_privacy(snmptoolctx, optarg); + break; + case 'p': + count = parse_pdu_type(snmptoolctx, optarg); + break; + case 'r': + count = parse_retry(optarg); + break; + case 's': + count = parse_server(optarg); + break; + case 't': + count = parse_timeout(optarg); + break; + case 'U': + count = parse_user_security(snmptoolctx, optarg); + break; + case 'v': + count = parse_version(optarg); + break; + case '?': + default: + usage(); + return (-1); + } + if (count < 0) + return (-1); + optnum += count; + } + + return (optnum); +} + +/* + * Read user input OID - one of following formats: + * 1) 1.2.1.1.2.1.0 - that is if option numeric was giveni; + * 2) string - in such case append .0 to the asn_oid subs; + * 3) string.1 - no additional proccessing required in such case. + */ +static char * +snmptools_parse_stroid(struct snmp_toolinfo *snmptoolctx, + struct snmp_object *obj, char *argv) +{ + char string[MAXSTR], *str; + int32_t i = 0; + struct asn_oid in_oid; + + str = argv; + + if (*str == '.') + str++; + + while (isalpha(*str) || *str == '_' || (i != 0 && isdigit(*str))) { + str++; + i++; + } + + if (i <= 0 || i >= MAXSTR) + return (NULL); + + memset(&in_oid, 0, sizeof(struct asn_oid)); + if ((str = snmp_parse_suboid((argv + i), &in_oid)) == NULL) { + warnx("Invalid OID - %s", argv); + return (NULL); + } + + strlcpy(string, argv, i + 1); + if (snmp_lookup_oidall(snmptoolctx, obj, string) < 0) { + warnx("No entry for %s in mapping lists", string); + return (NULL); + } + + /* If OID given on command line append it. */ + if (in_oid.len > 0) + asn_append_oid(&(obj->val.var), &in_oid); + else if (*str == '[') { + if ((str = snmp_parse_index(snmptoolctx, str + 1, obj)) == NULL) + return (NULL); + } else if (obj->val.syntax > 0 && GET_PDUTYPE(snmptoolctx) == + SNMP_PDU_GET) { + if (snmp_suboid_append(&(obj->val.var), (asn_subid_t) 0) < 0) + return (NULL); + } + + return (str); +} + +static int32_t +snmptools_parse_oid(struct snmp_toolinfo *snmptoolctx, + struct snmp_object *obj, char *argv) +{ + if (argv == NULL) + return (-1); + + if (ISSET_NUMERIC(snmptoolctx)) { + if (snmp_parse_numoid(argv, &(obj->val.var)) < 0) + return (-1); + } else { + if (snmptools_parse_stroid(snmptoolctx, obj, argv) == NULL && + snmp_parse_numoid(argv, &(obj->val.var)) < 0) + return (-1); + } + + return (1); +} + +static int32_t +snmptool_add_vbind(struct snmp_pdu *pdu, struct snmp_object *obj) +{ + if (obj->error > 0) + return (0); + + asn_append_oid(&(pdu->bindings[pdu->nbindings].var), &(obj->val.var)); + pdu->nbindings++; + + return (pdu->nbindings); +} + +/* ***************************************************************************** + * bsnmpget private functions. + */ +static int32_t +snmpget_verify_vbind(struct snmp_toolinfo *snmptoolctx, struct snmp_pdu *pdu, + struct snmp_object *obj) +{ + if (pdu->version == SNMP_V1 && obj->val.syntax == + SNMP_SYNTAX_COUNTER64) { + warnx("64-bit counters are not supported in SNMPv1 PDU"); + return (-1); + } + + if (ISSET_NUMERIC(snmptoolctx) || pdu->type == SNMP_PDU_GETNEXT || + pdu->type == SNMP_PDU_GETBULK) + return (1); + + if (pdu->type == SNMP_PDU_GET && obj->val.syntax == SNMP_SYNTAX_NULL) { + warnx("Only leaf object values can be added to GET PDU"); + return (-1); + } + + return (1); +} + +/* + * In case of a getbulk PDU, the error_status and error_index fields are used by + * libbsnmp to hold the values of the non-repeaters and max-repetitions fields + * that are present only in the getbulk - so before sending the PDU make sure + * these have correct values as well. + */ +static void +snmpget_fix_getbulk(struct snmp_pdu *pdu, uint32_t max_rep, uint32_t non_rep) +{ + assert(pdu != NULL); + + if (pdu->nbindings < non_rep) + pdu->error_status = pdu->nbindings; + else + pdu->error_status = non_rep; + + if (max_rep > 0) + pdu->error_index = max_rep; + else + pdu->error_index = 1; +} + +static int +snmptool_get(struct snmp_toolinfo *snmptoolctx) +{ + struct snmp_pdu req, resp; + + snmp_pdu_create(&req, GET_PDUTYPE(snmptoolctx)); + + while ((snmp_pdu_add_bindings(snmptoolctx, snmpget_verify_vbind, + snmptool_add_vbind, &req, SNMP_MAX_BINDINGS)) > 0) { + + if (GET_PDUTYPE(snmptoolctx) == SNMP_PDU_GETBULK) + snmpget_fix_getbulk(&req, GET_MAXREP(snmptoolctx), + GET_NONREP(snmptoolctx)); + + if (snmp_dialog(&req, &resp) == -1) { + warnx("Snmp dialog - %s", strerror(errno)); + break; + } + + if (snmp_parse_resp(&resp, &req) >= 0) { + snmp_output_resp(snmptoolctx, &resp); + break; + } + + snmp_output_err_resp(snmptoolctx, &resp); + if (GET_PDUTYPE(snmptoolctx) == SNMP_PDU_GETBULK || + !ISSET_RETRY(snmptoolctx)) + break; + + /* + * Loop through the object list and set object->error to the + * varbinding that caused the error. + */ + if (snmp_object_seterror(snmptoolctx, + &(resp.bindings[resp.error_index - 1]), + resp.error_status) <= 0) + break; + + fprintf(stderr, "Retrying...\n"); + snmp_pdu_free(&resp); + snmp_pdu_create(&req, GET_PDUTYPE(snmptoolctx)); + } + + snmp_pdu_free(&resp); + + return (0); +} + + +/* ***************************************************************************** + * bsnmpwalk private functions. + */ +/* The default tree to walk. */ +static const struct asn_oid snmp_mibII_OID = { + 6 , { 1, 3, 6, 1, 2, 1 } +}; + +static int32_t +snmpwalk_add_default(struct snmp_toolinfo *snmptoolctx __unused, + struct snmp_object *obj, char *string __unused) +{ + asn_append_oid(&(obj->val.var), &snmp_mibII_OID); + return (1); +} + +/* + * Prepare the next GetNext/Get PDU to send. + */ +static void +snmpwalk_nextpdu_create(uint32_t op, struct asn_oid *var, struct snmp_pdu *pdu) +{ + snmp_pdu_create(pdu, op); + asn_append_oid(&(pdu->bindings[0].var), var); + pdu->nbindings = 1; +} + +static int +snmptool_walk(struct snmp_toolinfo *snmptoolctx) +{ + struct snmp_pdu req, resp; + struct asn_oid root; /* Keep the inital oid. */ + int32_t outputs, rc; + + snmp_pdu_create(&req, SNMP_PDU_GETNEXT); + + while ((rc = snmp_pdu_add_bindings(snmptoolctx, NULL, + snmptool_add_vbind, &req, 1)) > 0) { + + /* Remember the root where the walk started from. */ + memset(&root, 0, sizeof(struct asn_oid)); + asn_append_oid(&root, &(req.bindings[0].var)); + + outputs = 0; + while (snmp_dialog(&req, &resp) >= 0) { + if ((snmp_parse_resp(&resp, &req)) < 0) { + snmp_output_err_resp(snmptoolctx, &resp); + snmp_pdu_free(&resp); + outputs = -1; + break; + } + + if (!(asn_is_suboid(&root, &(resp.bindings[0].var)))) { + snmp_pdu_free(&resp); + break; + } + + if (snmp_output_resp(snmptoolctx, &resp)!= 0) { + snmp_pdu_free(&resp); + outputs = -1; + break; + } + outputs++; + snmp_pdu_free(&resp); + + snmpwalk_nextpdu_create(SNMP_PDU_GETNEXT, + &(resp.bindings[0].var), &req); + } + + /* Just in case our root was a leaf. */ + if (outputs == 0) { + snmpwalk_nextpdu_create(SNMP_PDU_GET, &root, &req); + if (snmp_dialog(&req, &resp) == SNMP_CODE_OK) { + if (snmp_parse_resp(&resp,&req) < 0) + snmp_output_err_resp(snmptoolctx, &resp); + else + snmp_output_resp(snmptoolctx, &(resp)); + + snmp_pdu_free(&resp); + } else + warnx("Snmp dialog - %s", strerror(errno)); + } + + if (snmp_object_remove(snmptoolctx, &root) < 0) { + warnx("snmp_object_remove"); + break; + } + + snmp_pdu_create(&req, SNMP_PDU_GETNEXT); + } + + if (rc == 0) + return (0); + else + return (1); +} + +/* ***************************************************************************** + * bsnmpset private functions. + */ + +static int32_t +parse_oid_numeric(struct snmp_value *value, char *val) +{ + char *endptr; + int32_t saved_errno; + asn_subid_t suboid; + + do { + saved_errno = errno; + errno = 0; + suboid = strtoul(val, &endptr, 10); + if (errno != 0) { + warnx("Value %s not supported - %s", val, + strerror(errno)); + errno = saved_errno; + return (-1); + } + errno = saved_errno; + if ((asn_subid_t) suboid > ASN_MAXID) { + warnx("Suboid %u > ASN_MAXID", suboid); + return (-1); + } + if (snmp_suboid_append(&(value->v.oid), suboid) < 0) + return (-1); + val = endptr + 1; + } while (*endptr == '.'); + + if (*endptr != '\0') + warnx("OID value %s not supported", val); + + value->syntax = SNMP_SYNTAX_OID; + return (0); +} + +/* + * Allow OID leaf in both forms: + * 1) 1.3.6.1.2... -> in such case call directly the function reading raw OIDs; + * 2) begemotSnmpdAgentFreeBSD -> lookup the ASN OID corresponding to that. + */ +static int32_t +parse_oid_string(struct snmp_toolinfo *snmptoolctx, + struct snmp_value *value, char *string) +{ + struct snmp_object obj; + + if (isdigit(string[0])) + return (parse_oid_numeric(value, string)); + + memset(&obj, 0, sizeof(struct snmp_object)); + if (snmp_lookup_enumoid(snmptoolctx, &obj, string) < 0) { + warnx("Unknown OID enum string - %s", string); + return (-1); + } + + asn_append_oid(&(value->v.oid), &(obj.val.var)); + return (1); +} + +static int32_t +parse_ip(struct snmp_value * value, char * val) +{ + uint32_t v; + int32_t i; + char *endptr, *str; + + str = val; + for (i = 0; i < 4; i++) { + v = strtoul(str, &endptr, 10); + if (v > 0xff) + return (-1); + if (*endptr != '.' && *endptr != '\0' && i != 3) + break; + str = endptr + 1; + value->v.ipaddress[i] = (uint8_t) v; + } + + value->syntax = SNMP_SYNTAX_IPADDRESS; + return (0); +} + +static int32_t +parse_int(struct snmp_value *value, char *val) +{ + char *endptr; + int32_t v, saved_errno; + + saved_errno = errno; + errno = 0; + + v = strtol(val, &endptr, 10); + + if (errno != 0) { + warnx("Value %s not supported - %s", val, strerror(errno)); + errno = saved_errno; + return (-1); + } + + value->syntax = SNMP_SYNTAX_INTEGER; + value->v.integer = v; + errno = saved_errno; + + return (0); +} + +static int32_t +parse_int_string(struct snmp_object *object, char *val) +{ + int32_t v; + + if (isdigit(val[0])) + return ((parse_int(&(object->val), val))); + + if (object->info == NULL) { + warnx("Unknown enumerated integer type - %s", val); + return (-1); + } + if ((v = enum_number_lookup(object->info->snmp_enum, val)) < 0) + warnx("Unknown enumerated integer type - %s", val); + + object->val.v.integer = v; + return (1); +} + +/* + * Here syntax may be one of SNMP_SYNTAX_COUNTER, SNMP_SYNTAX_GAUGE, + * SNMP_SYNTAX_TIMETICKS. + */ +static int32_t +parse_uint(struct snmp_value *value, char *val) +{ + char *endptr; + uint32_t v = 0; + int32_t saved_errno; + + saved_errno = errno; + errno = 0; + + v = strtoul(val, &endptr, 10); + + if (errno != 0) { + warnx("Value %s not supported - %s", val, strerror(errno)); + errno = saved_errno; + return (-1); + } + + value->v.uint32 = v; + errno = saved_errno; + + return (0); +} + +static int32_t +parse_ticks(struct snmp_value *value, char *val) +{ + if (parse_uint(value, val) < 0) + return (-1); + + value->syntax = SNMP_SYNTAX_TIMETICKS; + return (0); +} + +static int32_t +parse_gauge(struct snmp_value *value, char *val) +{ + if (parse_uint(value, val) < 0) + return (-1); + + value->syntax = SNMP_SYNTAX_GAUGE; + return (0); +} + +static int32_t +parse_counter(struct snmp_value *value, char *val) +{ + if (parse_uint(value, val) < 0) + return (-1); + + value->syntax = SNMP_SYNTAX_COUNTER; + return (0); +} + +static int32_t +parse_uint64(struct snmp_value *value, char *val) +{ + char *endptr; + int32_t saved_errno; + uint64_t v; + + saved_errno = errno; + errno = 0; + + v = strtoull(val, &endptr, 10); + + if (errno != 0) { + warnx("Value %s not supported - %s", val, strerror(errno)); + errno = saved_errno; + return (-1); + } + + value->syntax = SNMP_SYNTAX_COUNTER64; + value->v.counter64 = v; + errno = saved_errno; + + return (0); +} + +static int32_t +parse_syntax_val(struct snmp_value *value, enum snmp_syntax syntax, char *val) +{ + switch (syntax) { + case SNMP_SYNTAX_INTEGER: + return (parse_int(value, val)); + case SNMP_SYNTAX_IPADDRESS: + return (parse_ip(value, val)); + case SNMP_SYNTAX_COUNTER: + return (parse_counter(value, val)); + case SNMP_SYNTAX_GAUGE: + return (parse_gauge(value, val)); + case SNMP_SYNTAX_TIMETICKS: + return (parse_ticks(value, val)); + case SNMP_SYNTAX_COUNTER64: + return (parse_uint64(value, val)); + case SNMP_SYNTAX_OCTETSTRING: + return (snmp_tc2oct(SNMP_STRING, value, val)); + case SNMP_SYNTAX_OID: + return (parse_oid_numeric(value, val)); + default: + /* NOTREACHED */ + break; + } + + return (-1); +} + +/* + * Parse a command line argument of type OID=syntax:value and fill in whatever + * fields can be derived from the input into snmp_value structure. Reads numeric + * OIDs. + */ +static int32_t +parse_pair_numoid_val(char *str, struct snmp_value *snmp_val) +{ + int32_t cnt; + char *ptr; + enum snmp_syntax syntax; + char oid_str[ASN_OIDSTRLEN]; + + ptr = str; + for (cnt = 0; cnt < ASN_OIDSTRLEN; cnt++) + if (ptr[cnt] == '=') + break; + + if (cnt >= ASN_OIDSTRLEN) { + warnx("OID too long - %s", str); + return (-1); + } + strlcpy(oid_str, ptr, (size_t) (cnt + 1)); + + ptr = str + cnt + 1; + for (cnt = 0; cnt < MAX_CMD_SYNTAX_LEN; cnt++) + if(ptr[cnt] == ':') + break; + + if (cnt >= MAX_CMD_SYNTAX_LEN) { + warnx("Unknown syntax in OID - %s", str); + return (-1); + } + + if ((syntax = parse_syntax(ptr)) <= SNMP_SYNTAX_NULL) { + warnx("Unknown syntax in OID - %s", ptr); + return (-1); + } + + ptr = ptr + cnt + 1; + for (cnt = 0; cnt < MAX_OCTSTRING_LEN; cnt++) + if (ptr[cnt] == '\0') + break; + + if (ptr[cnt] != '\0') { + warnx("Value string too long - %s",ptr); + return (-1); + } + + /* + * Here try parsing the OIDs and syntaxes and then check values - have + * to know syntax to check value boundaries. + */ + if (snmp_parse_numoid(oid_str, &(snmp_val->var)) < 0) { + warnx("Error parsing OID %s",oid_str); + return (-1); + } + + if (parse_syntax_val(snmp_val, syntax, ptr) < 0) + return (-1); + + return (1); +} + +/* XXX-BZ aruments should be swapped. */ +static int32_t +parse_syntax_strval(struct snmp_toolinfo *snmptoolctx, char *str, + struct snmp_object *object) +{ + uint32_t len; + enum snmp_syntax syn; + + /* + * Syntax string here not required - still may be present. + */ + + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) { + for (len = 0 ; *(str + len) != ':'; len++) { + if (*(str + len) == '\0') { + warnx("Syntax missing in value - %s", str); + return (-1); + } + } + if ((syn = parse_syntax(str)) <= SNMP_SYNTAX_NULL) { + warnx("Unknown syntax in - %s", str); + return (-1); + } + if (syn != object->val.syntax) { + if (!ISSET_ERRIGNORE(snmptoolctx)) { + warnx("Bad syntax in - %s", str); + return (-1); + } else + object->val.syntax = syn; + } + len++; + } else + len = 0; + + switch (object->val.syntax) { + case SNMP_SYNTAX_INTEGER: + return (parse_int_string(object, str + len)); + case SNMP_SYNTAX_IPADDRESS: + return (parse_ip(&(object->val), str + len)); + case SNMP_SYNTAX_COUNTER: + return (parse_counter(&(object->val), str + len)); + case SNMP_SYNTAX_GAUGE: + return (parse_gauge(&(object->val), str + len)); + case SNMP_SYNTAX_TIMETICKS: + return (parse_ticks(&(object->val), str + len)); + case SNMP_SYNTAX_COUNTER64: + return (parse_uint64(&(object->val), str + len)); + case SNMP_SYNTAX_OCTETSTRING: + return (snmp_tc2oct(object->info->tc, &(object->val), + str + len)); + case SNMP_SYNTAX_OID: + return (parse_oid_string(snmptoolctx, &(object->val), + str + len)); + default: + /* NOTREACHED */ + break; + } + + return (-1); +} + +static int32_t +parse_pair_stroid_val(struct snmp_toolinfo *snmptoolctx, + struct snmp_object *obj, char *argv) +{ + char *ptr; + + if ((ptr = snmptools_parse_stroid(snmptoolctx, obj, argv)) == NULL) + return (-1); + + if (*ptr != '=') { + warnx("Value to set expected after OID"); + return (-1); + } + + if (parse_syntax_strval(snmptoolctx, ptr + 1, obj) < 0) + return (-1); + + return (1); +} + + +static int32_t +snmpset_parse_oid(struct snmp_toolinfo *snmptoolctx, + struct snmp_object *obj, char *argv) +{ + if (argv == NULL) + return (-1); + + if (ISSET_NUMERIC(snmptoolctx)) { + if (parse_pair_numoid_val(argv, &(obj->val)) < 0) + return (-1); + } else { + if (parse_pair_stroid_val(snmptoolctx, obj, argv) < 0) + return (-1); + } + + return (1); +} + +static int32_t +add_ip_syntax(struct snmp_value *dst, struct snmp_value *src) +{ + int8_t i; + + dst->syntax = SNMP_SYNTAX_IPADDRESS; + for (i = 0; i < 4; i++) + dst->v.ipaddress[i] = src->v.ipaddress[i]; + + return (1); +} + +static int32_t +add_octstring_syntax(struct snmp_value *dst, struct snmp_value *src) +{ + if (src->v.octetstring.len > ASN_MAXOCTETSTRING) { + warnx("OctetString len too big - %u",src->v.octetstring.len); + return (-1); + } + + if ((dst->v.octetstring.octets = malloc(src->v.octetstring.len)) == + NULL) { + syslog(LOG_ERR, "malloc() failed - %s", strerror(errno)); + return (-1); + } + + memcpy(dst->v.octetstring.octets, src->v.octetstring.octets, + src->v.octetstring.len); + dst->syntax = SNMP_SYNTAX_OCTETSTRING; + dst->v.octetstring.len = src->v.octetstring.len; + + return(0); +} + +static int32_t +add_oid_syntax(struct snmp_value *dst, struct snmp_value *src) +{ + asn_append_oid(&(dst->v.oid), &(src->v.oid)); + dst->syntax = SNMP_SYNTAX_OID; + return (0); +} + +/* + * Check syntax - if one of SNMP_SYNTAX_NULL, SNMP_SYNTAX_NOSUCHOBJECT, + * SNMP_SYNTAX_NOSUCHINSTANCE, SNMP_SYNTAX_ENDOFMIBVIEW or anything not known - + * return error. + */ +static int32_t +snmpset_add_value(struct snmp_value *dst, struct snmp_value *src) +{ + if (dst == NULL || src == NULL) + return (-1); + + switch (src->syntax) { + case SNMP_SYNTAX_INTEGER: + dst->v.integer = src->v.integer; + dst->syntax = SNMP_SYNTAX_INTEGER; + break; + case SNMP_SYNTAX_TIMETICKS: + dst->v.uint32 = src->v.uint32; + dst->syntax = SNMP_SYNTAX_TIMETICKS; + break; + case SNMP_SYNTAX_GAUGE: + dst->v.uint32 = src->v.uint32; + dst->syntax = SNMP_SYNTAX_GAUGE; + break; + case SNMP_SYNTAX_COUNTER: + dst->v.uint32 = src->v.uint32; + dst->syntax = SNMP_SYNTAX_COUNTER; + break; + case SNMP_SYNTAX_COUNTER64: + dst->v.counter64 = src->v.counter64; + dst->syntax = SNMP_SYNTAX_COUNTER64; + break; + case SNMP_SYNTAX_IPADDRESS: + add_ip_syntax(dst, src); + break; + case SNMP_SYNTAX_OCTETSTRING: + add_octstring_syntax(dst, src); + break; + case SNMP_SYNTAX_OID: + add_oid_syntax(dst, src); + break; + default: + warnx("Unknown syntax %d", src->syntax); + return (-1); + } + + return (0); +} + +static int32_t +snmpset_verify_vbind(struct snmp_toolinfo *snmptoolctx, struct snmp_pdu *pdu, + struct snmp_object *obj) +{ + if (pdu->version == SNMP_V1 && obj->val.syntax == + SNMP_SYNTAX_COUNTER64) { + warnx("64-bit counters are not supported in SNMPv1 PDU"); + return (-1); + } + + if (ISSET_NUMERIC(snmptoolctx) || ISSET_ERRIGNORE(snmptoolctx)) + return (1); + + if (obj->info->access < SNMP_ACCESS_SET) { + warnx("Object %s not accessible for set - try 'bsnmpset -a'", + obj->info->string); + return (-1); + } + + return (1); +} + +static int32_t +snmpset_add_vbind(struct snmp_pdu *pdu, struct snmp_object *obj) +{ + if (pdu->nbindings > SNMP_MAX_BINDINGS) { + warnx("Too many OIDs for one PDU"); + return (-1); + } + + if (obj->error > 0) + return (0); + + if (snmpset_add_value(&(pdu->bindings[pdu->nbindings]), &(obj->val)) + < 0) + return (-1); + + asn_append_oid(&(pdu->bindings[pdu->nbindings].var), &(obj->val.var)); + pdu->nbindings++; + + return (pdu->nbindings); +} + +static int +snmptool_set(struct snmp_toolinfo *snmptoolctx) +{ + struct snmp_pdu req, resp; + + snmp_pdu_create(&req, SNMP_PDU_SET); + + while ((snmp_pdu_add_bindings(snmptoolctx, snmpset_verify_vbind, + snmpset_add_vbind, &req, SNMP_MAX_BINDINGS)) > 0) { + if (snmp_dialog(&req, &resp)) { + warnx("Snmp dialog - %s", strerror(errno)); + break; + } + + if (snmp_pdu_check(&req, &resp) > 0) { + if (GET_OUTPUT(snmptoolctx) != OUTPUT_QUIET) + snmp_output_resp(snmptoolctx, &resp); + break; + } + + snmp_output_err_resp(snmptoolctx, &resp); + if (!ISSET_RETRY(snmptoolctx)) + break; + + if (snmp_object_seterror(snmptoolctx, + &(resp.bindings[resp.error_index - 1]), + resp.error_status) <= 0) + break; + + fprintf(stderr, "Retrying...\n"); + snmp_pdu_free(&req); + snmp_pdu_free(&resp); + snmp_pdu_create(&req, SNMP_PDU_SET); + } + + snmp_pdu_free(&resp); + + return (0); +} + +/* ***************************************************************************** + * main + */ +/* + * According to command line options prepare SNMP Get | GetNext | GetBulk PDU. + * Wait for a responce and print it. + */ +/* + * Do a 'snmp walk' - according to command line options request for values + * lexicographically subsequent and subrooted at a common node. Send a GetNext + * PDU requesting the value for each next variable and print the responce. Stop + * when a Responce PDU is received that contains the value of a variable not + * subrooted at the variable the walk started. + */ +int +main(int argc, char ** argv) +{ + struct snmp_toolinfo snmptoolctx; + int32_t oid_cnt, last_oid, opt_num; + int rc = 0; + + /* Make sure program_name is set and valid. */ + if (*argv == NULL) + program_name = "snmptool"; + else { + program_name = strrchr(*argv, '/'); + if (program_name != NULL) + program_name++; + else + program_name = *argv; + } + + if (program_name == NULL) { + fprintf(stderr, "Error: No program name?\n"); + exit (1); + } else if (strcmp(program_name, "bsnmpget") == 0) + program = BSNMPGET; + else if (strcmp(program_name, "bsnmpwalk") == 0) + program = BSNMPWALK; + else if (strcmp(program_name, "bsnmpset") == 0) + program = BSNMPSET; + else { + fprintf(stderr, "Unknown snmp tool name '%s'.\n", program_name); + exit (1); + } + + /* Initialize. */ + if (snmptool_init(&snmptoolctx) < 0) + exit (1); + + if ((opt_num = snmptool_parse_options(&snmptoolctx, argc, argv)) < 0) { + snmp_tool_freeall(&snmptoolctx); + /* On -h (help) exit without error. */ + if (opt_num == -2) + exit(0); + else + exit(1); + } + + oid_cnt = argc - opt_num - 1; + if (oid_cnt == 0) { + switch (program) { + case BSNMPGET: + if (!ISSET_EDISCOVER(&snmptoolctx) && + !ISSET_LOCALKEY(&snmptoolctx)) { + fprintf(stderr, "No OID given.\n"); + usage(); + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + break; + + case BSNMPWALK: + if (snmp_object_add(&snmptoolctx, snmpwalk_add_default, + NULL) < 0) { + fprintf(stderr, + "Error setting default subtree.\n"); + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + break; + + case BSNMPSET: + fprintf(stderr, "No OID given.\n"); + usage(); + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + } + + if (snmp_import_all(&snmptoolctx) < 0) { + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + + /* A simple sanity check - can not send GETBULK when using SNMPv1. */ + if (program == BSNMPGET && snmp_client.version == SNMP_V1 && + GET_PDUTYPE(&snmptoolctx) == SNMP_PDU_GETBULK) { + fprintf(stderr, "Cannot send GETBULK PDU with SNMPv1.\n"); + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + + for (last_oid = argc - 1; oid_cnt > 0; last_oid--, oid_cnt--) { + if ((snmp_object_add(&snmptoolctx, (program == BSNMPSET) ? + snmpset_parse_oid : snmptools_parse_oid, + argv[last_oid])) < 0) { + fprintf(stderr, "Error parsing OID string '%s'.\n", + argv[last_oid]); + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + } + + if (snmp_open(NULL, NULL, NULL, NULL)) { + warnx("Failed to open snmp session: %s.", strerror(errno)); + snmp_tool_freeall(&snmptoolctx); + exit(1); + } + + if (snmp_client.version == SNMP_V3 && snmp_client.engine.engine_len == 0) + SET_EDISCOVER(&snmptoolctx); + + if (ISSET_EDISCOVER(&snmptoolctx) && + snmp_discover_engine(snmptoolctx.passwd) < 0) { + warnx("Unknown SNMP Engine ID: %s.", strerror(errno)); + rc = 1; + goto cleanup; + } + + if (GET_OUTPUT(&snmptoolctx) == OUTPUT_VERBOSE || + ISSET_EDISCOVER(&snmptoolctx)) + snmp_output_engine(); + + if (snmp_client.version == SNMP_V3 && ISSET_LOCALKEY(&snmptoolctx) && + !ISSET_EDISCOVER(&snmptoolctx)) { + if (snmp_passwd_to_keys(&snmp_client.user, + snmptoolctx.passwd) != SNMP_CODE_OK || + snmp_get_local_keys(&snmp_client.user, + snmp_client.engine.engine_id, + snmp_client.engine.engine_len) != SNMP_CODE_OK) { + warnx("Failed to get keys: %s.", strerror(errno)); + rc = 1; + goto cleanup; + } + } + + if (GET_OUTPUT(&snmptoolctx) == OUTPUT_VERBOSE || + ISSET_EDISCOVER(&snmptoolctx)) + snmp_output_keys(); + + if (ISSET_EDISCOVER(&snmptoolctx) && snmptoolctx.objects == 0) + goto cleanup; + + switch (program) { + case BSNMPGET: + rc = snmptool_get(&snmptoolctx); + break; + case BSNMPWALK: + rc = snmptool_walk(&snmptoolctx); + break; + case BSNMPSET: + rc = snmptool_set(&snmptoolctx); + break; + } + + +cleanup: + snmp_tool_freeall(&snmptoolctx); + snmp_close(); + + exit(rc); +} diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/Makefile b/usr.sbin/bsnmpd/tools/libbsnmptools/Makefile new file mode 100644 index 0000000..f2b71b6 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/Makefile @@ -0,0 +1,14 @@ +# +# $FreeBSD$ +# + +.PATH: ${.CURDIR} + +LIB= bsnmptools +#INTERNALLIB= +SRCS= bsnmpimport.c bsnmpmap.c bsnmptools.c bsnmptc.c +CFLAGS+= -g -Wall -Werror + +SHLIB_MAJOR= 0 + +.include diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpimport.c b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpimport.c new file mode 100644 index 0000000..b92532f --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpimport.c @@ -0,0 +1,971 @@ +/*- + * Copyright (c) 2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Read file containing table description - reuse magic from gensnmptree.c. + * Hopefully one day most of the code here will be part of libbsnmp and + * this duplication won't be necessary. + * + * Syntax is: + * --------- + * file := top | top file + * + * top := tree | typedef | include + * + * tree := head elements ')' + * + * entry := head ':' index STRING elements ')' + * + * leaf := head type STRING ACCESS ')' + * + * column := head type ACCESS ')' + * + * type := BASETYPE | BASETYPE '|' subtype | enum | bits + * + * subtype := STRING + * + * enum := ENUM '(' value ')' + * + * bits := BITS '(' value ')' + * + * value := INT STRING | INT STRING value + * + * head := '(' INT STRING + * + * elements := EMPTY | elements element + * + * element := tree | leaf | column + * + * index := type | index type + * + * typedef := 'typedef' STRING type + * + * include := 'include' filespec + * + * filespec := '"' STRING '"' | '<' STRING '>' + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include /* SNMP_INDEXES_MAX */ +#include "bsnmptc.h" +#include "bsnmptools.h" + +enum snmp_tbl_entry { + ENTRY_NONE = 0, + ENTRY_INDEX, + ENTRY_DATA +}; + +enum { + FL_GET = 0x01, + FL_SET = 0x02, +}; + +/************************************************************ + * + * Allocate memory and panic just in the case... + */ +static void * +xalloc(size_t size) +{ + void *ptr; + + if ((ptr = malloc(size)) == NULL) + err(1, "allocing %zu bytes", size); + + return (ptr); +} + +static char * +savestr(const char *s) +{ + if (s == NULL) + return (NULL); + + return (strcpy(xalloc(strlen(s) + 1), s)); +} + +/************************************************************ + * + * Input stack + */ +struct input { + FILE *fp; + uint32_t lno; + char *fname; + char *path; + LIST_ENTRY(input) link; +}; + +LIST_HEAD(, input) inputs = LIST_HEAD_INITIALIZER(inputs); +struct input *input = NULL; +int32_t pbchar = -1; + +#define MAX_PATHS 100 + +static const char *paths[MAX_PATHS + 1] = { + "/usr/share/snmp/defs", + "/usr/local/share/snmp/defs", + NULL +}; + +static void +input_new(FILE *fp, const char *path, const char *fname) +{ + struct input *ip; + + ip = xalloc(sizeof(*ip)); + ip->fp = fp; + ip->lno = 1; + ip->fname = savestr(fname); + ip->path = savestr(path); + LIST_INSERT_HEAD(&inputs, ip, link); + + input = ip; +} + +static void +input_close(void) +{ + if (input == NULL) + return; + + fclose(input->fp); + free(input->fname); + free(input->path); + LIST_REMOVE(input, link); + free(input); + + input = LIST_FIRST(&inputs); +} + +static FILE * +tryopen(const char *path, const char *fname) +{ + char *fn; + FILE *fp; + + if (path == NULL) + fn = savestr(fname); + else { + fn = xalloc(strlen(path) + strlen(fname) + 2); + sprintf(fn, "%s/%s", path, fname); + } + fp = fopen(fn, "r"); + free(fn); + return (fp); +} + +static int32_t +input_fopen(const char *fname) +{ + FILE *fp; + u_int p; + + if (fname[0] == '/' || fname[0] == '.' || fname[0] == '~') { + if ((fp = tryopen(NULL, fname)) != NULL) { + input_new(fp, NULL, fname); + return (0); + } + + } else { + + for (p = 0; paths[p] != NULL; p++) + if ((fp = tryopen(paths[p], fname)) != NULL) { + input_new(fp, paths[p], fname); + return (0); + } + } + + warnx("cannot open '%s'", fname); + return (-1); +} + +static int32_t +tgetc(void) +{ + int c; + + if (pbchar != -1) { + c = pbchar; + pbchar = -1; + return (c); + } + + for (;;) { + if (input == NULL) + return (EOF); + + if ((c = getc(input->fp)) != EOF) + return (c); + + input_close(); + } +} + +static int32_t +tungetc(int c) +{ + + if (pbchar != -1) + return (-1); + + pbchar = c; + return (1); +} + +/************************************************************ + * + * Parsing input + */ +enum tok { + TOK_EOF = 0200, /* end-of-file seen */ + TOK_NUM, /* number */ + TOK_STR, /* string */ + TOK_ACCESS, /* access operator */ + TOK_TYPE, /* type operator */ + TOK_ENUM, /* enum token (kind of a type) */ + TOK_TYPEDEF, /* typedef directive */ + TOK_DEFTYPE, /* defined type */ + TOK_INCLUDE, /* include directive */ + TOK_FILENAME, /* filename ("foo.bar" or ) */ + TOK_BITS, /* bits token (kind of a type) */ + TOK_ERR /* unexpected char - exit */ +}; + +static const struct { + const char *str; + enum tok tok; + uint32_t val; +} keywords[] = { + { "GET", TOK_ACCESS, FL_GET }, + { "SET", TOK_ACCESS, FL_SET }, + { "NULL", TOK_TYPE, SNMP_SYNTAX_NULL }, + { "INTEGER", TOK_TYPE, SNMP_SYNTAX_INTEGER }, + { "INTEGER32", TOK_TYPE, SNMP_SYNTAX_INTEGER }, + { "UNSIGNED32", TOK_TYPE, SNMP_SYNTAX_GAUGE }, + { "OCTETSTRING", TOK_TYPE, SNMP_SYNTAX_OCTETSTRING }, + { "IPADDRESS", TOK_TYPE, SNMP_SYNTAX_IPADDRESS }, + { "OID", TOK_TYPE, SNMP_SYNTAX_OID }, + { "TIMETICKS", TOK_TYPE, SNMP_SYNTAX_TIMETICKS }, + { "COUNTER", TOK_TYPE, SNMP_SYNTAX_COUNTER }, + { "GAUGE", TOK_TYPE, SNMP_SYNTAX_GAUGE }, + { "COUNTER64", TOK_TYPE, SNMP_SYNTAX_COUNTER64 }, + { "ENUM", TOK_ENUM, SNMP_SYNTAX_INTEGER }, + { "BITS", TOK_BITS, SNMP_SYNTAX_OCTETSTRING }, + { "typedef", TOK_TYPEDEF, 0 }, + { "include", TOK_INCLUDE, 0 }, + { NULL, 0, 0 } +}; + +struct { + /* Current OID type, regarding table membership. */ + enum snmp_tbl_entry tbl_type; + /* A pointer to a structure in table list to add to its members. */ + struct snmp_index_entry *table_idx; +} table_data; + +struct asn_oid current_oid; +char nexttok[MAXSTR]; +u_long val; /* integer values */ +int32_t all_cond; /* all conditions are true */ +int32_t saved_token = -1; + +/* Prepare the global data before parsing a new file. */ +static void +snmp_import_init(struct asn_oid *append) +{ + memset(&table_data, 0, sizeof(table_data)); + memset(¤t_oid, 0, sizeof(struct asn_oid)); + memset(nexttok, 0, MAXSTR); + + if (append != NULL) + asn_append_oid(¤t_oid, append); + + all_cond = 0; + val = 0; + saved_token = -1; +} + +static int32_t +gettoken(struct snmp_toolinfo *snmptoolctx) +{ + int c; + struct enum_type *t; + + if (saved_token != -1) { + c = saved_token; + saved_token = -1; + return (c); + } + + again: + /* + * Skip any whitespace before the next token. + */ + while ((c = tgetc()) != EOF) { + if (c == '\n') + input->lno++; + if (!isspace(c)) + break; + } + if (c == EOF) + return (TOK_EOF); + + if (!isascii(c)) { + warnx("unexpected character %#2x", (u_int) c); + return (TOK_ERR); + } + + /* + * Skip comments. + */ + if (c == '#') { + while ((c = tgetc()) != EOF) { + if (c == '\n') { + input->lno++; + goto again; + } + } + warnx("unexpected EOF in comment"); + return (TOK_ERR); + } + + /* + * Single character tokens. + */ + if (strchr("():|", c) != NULL) + return (c); + + if (c == '"' || c == '<') { + int32_t end = c; + size_t n = 0; + + val = 1; + if (c == '<') { + val = 0; + end = '>'; + } + + while ((c = tgetc()) != EOF) { + if (c == end) + break; + if (n == sizeof(nexttok) - 1) { + nexttok[n++] = '\0'; + warnx("filename too long '%s...'", nexttok); + return (TOK_ERR); + } + nexttok[n++] = c; + } + nexttok[n++] = '\0'; + return (TOK_FILENAME); + } + + /* + * Sort out numbers. + */ + if (isdigit(c)) { + size_t n = 0; + nexttok[n++] = c; + while ((c = tgetc()) != EOF) { + if (!isdigit(c)) { + if (tungetc(c) < 0) + return (TOK_ERR); + break; + } + if (n == sizeof(nexttok) - 1) { + nexttok[n++] = '\0'; + warnx("number too long '%s...'", nexttok); + return (TOK_ERR); + } + nexttok[n++] = c; + } + nexttok[n++] = '\0'; + sscanf(nexttok, "%lu", &val); + return (TOK_NUM); + } + + /* + * So that has to be a string. + */ + if (isalpha(c) || c == '_' || c == '-') { + size_t n = 0; + nexttok[n++] = c; + while ((c = tgetc()) != EOF) { + if (!isalnum(c) && c != '_' && c != '-') { + if (tungetc (c) < 0) + return (TOK_ERR); + break; + } + if (n == sizeof(nexttok) - 1) { + nexttok[n++] = '\0'; + warnx("string too long '%s...'", nexttok); + return (TOK_ERR); + } + nexttok[n++] = c; + } + nexttok[n++] = '\0'; + + /* + * Keywords. + */ + for (c = 0; keywords[c].str != NULL; c++) + if (strcmp(keywords[c].str, nexttok) == 0) { + val = keywords[c].val; + return (keywords[c].tok); + } + + if ((t = snmp_enumtc_lookup(snmptoolctx, nexttok)) != NULL) { + val = t->syntax; + return (TOK_DEFTYPE); + } + + return (TOK_STR); + } + + if (isprint(c)) + warnx("%u: unexpected character '%c'", input->lno, c); + else + warnx("%u: unexpected character 0x%02x", input->lno, (u_int) c); + + return (TOK_ERR); +} + +/* + * Update table information. + */ +static struct snmp_index_entry * +snmp_import_update_table(enum snmp_tbl_entry te, struct snmp_index_entry *tbl) +{ + switch (te) { + case ENTRY_NONE: + if (table_data.tbl_type == ENTRY_NONE) + return (NULL); + if (table_data.tbl_type == ENTRY_INDEX) + table_data.table_idx = NULL; + table_data.tbl_type--; + return (NULL); + + case ENTRY_INDEX: + if (tbl == NULL) + warnx("No table_index to add!!!"); + table_data.table_idx = tbl; + table_data.tbl_type = ENTRY_INDEX; + return (tbl); + + case ENTRY_DATA: + if (table_data.tbl_type == ENTRY_INDEX) { + table_data.tbl_type = ENTRY_DATA; + return (table_data.table_idx); + } + return (NULL); + + default: + /* NOTREACHED */ + warnx("Unknown table entry type!!!"); + break; + } + + return (NULL); +} + +static int32_t +parse_enum(struct snmp_toolinfo *snmptoolctx, enum tok *tok, + struct enum_pairs *enums) +{ + while ((*tok = gettoken(snmptoolctx)) == TOK_STR) { + if (enum_pair_insert(enums, val, nexttok) < 0) + return (-1); + if ((*tok = gettoken(snmptoolctx)) != TOK_NUM) + break; + } + + if (*tok != ')') { + warnx("')' at end of enums"); + return (-1); + } + + return (1); +} + +static int32_t +parse_subtype(struct snmp_toolinfo *snmptoolctx, enum tok *tok, + enum snmp_tc *tc) +{ + if ((*tok = gettoken(snmptoolctx)) != TOK_STR) { + warnx("subtype expected after '|'"); + return (-1); + } + + *tc = snmp_get_tc(nexttok); + *tok = gettoken(snmptoolctx); + + return (1); +} + +static int32_t +parse_type(struct snmp_toolinfo *snmptoolctx, enum tok *tok, + enum snmp_tc *tc, struct enum_pairs **snmp_enum) +{ + int32_t syntax, mem; + + syntax = val; + *tc = 0; + + if (*tok == TOK_ENUM || *tok == TOK_BITS) { + if (*snmp_enum == NULL) { + if ((*snmp_enum = enum_pairs_init()) == NULL) + return (-1); + mem = 1; + *tc = SNMP_TC_OWN; + } else + mem = 0; + + if (gettoken(snmptoolctx) != '(') { + warnx("'(' expected after ENUM/BITS"); + return (-1); + } + + if ((*tok = gettoken(snmptoolctx)) != TOK_NUM) { + warnx("need value for ENUM//BITS"); + if (mem == 1) { + free(*snmp_enum); + *snmp_enum = NULL; + } + return (-1); + } + + if (parse_enum(snmptoolctx, tok, *snmp_enum) < 0) { + enum_pairs_free(*snmp_enum); + *snmp_enum = NULL; + return (-1); + } + + *tok = gettoken(snmptoolctx); + + } else if (*tok == TOK_DEFTYPE) { + struct enum_type *t; + + *tc = 0; + t = snmp_enumtc_lookup(snmptoolctx, nexttok); + if (t != NULL) + *snmp_enum = t->snmp_enum; + + *tok = gettoken(snmptoolctx); + + } else { + if ((*tok = gettoken(snmptoolctx)) == '|') { + if (parse_subtype(snmptoolctx, tok, tc) < 0) + return (-1); + } + } + + return (syntax); +} + +static int32_t +snmp_import_head(struct snmp_toolinfo *snmptoolctx) +{ + enum tok tok; + + if ((tok = gettoken(snmptoolctx)) == '(') + tok = gettoken(snmptoolctx); + + if (tok != TOK_NUM || val > ASN_MAXID ) { + warnx("Suboid expected - line %d", input->lno); + return (-1); + } + + if (gettoken(snmptoolctx) != TOK_STR) { + warnx("Node name expected at line %d", input->lno); + return (-1); + } + + return (1); +} + +static int32_t +snmp_import_table(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *obj) +{ + int32_t i; + enum snmp_tc tc; + enum tok tok; + struct snmp_index_entry *entry; + + if ((entry = malloc(sizeof(struct snmp_index_entry))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (-1); + } + + memset(entry, 0, sizeof(struct snmp_index_entry)); + STAILQ_INIT(&(entry->index_list)); + + for (i = 0, tok = gettoken(snmptoolctx); i < SNMP_INDEXES_MAX; i++) { + int32_t syntax; + struct enum_pairs *enums = NULL; + + if (tok != TOK_TYPE && tok != TOK_DEFTYPE && tok != TOK_ENUM && + tok != TOK_BITS) + break; + + if ((syntax = parse_type(snmptoolctx, &tok, &tc, &enums)) < 0) { + enum_pairs_free(enums); + snmp_index_listfree(&(entry->index_list)); + free(entry); + return (-1); + } + + if (snmp_syntax_insert(&(entry->index_list), enums, syntax, + tc) < 0) { + snmp_index_listfree(&(entry->index_list)); + enum_pairs_free(enums); + free(entry); + return (-1); + } + } + + if (i == 0 || i > SNMP_INDEXES_MAX) { + warnx("Bad number of indexes at line %d", input->lno); + snmp_index_listfree(&(entry->index_list)); + free(entry); + return (-1); + } + + if (tok != TOK_STR) { + warnx("String expected after indexes at line %d", input->lno); + snmp_index_listfree(&(entry->index_list)); + free(entry); + return (-1); + } + + entry->string = obj->string; + entry->strlen = obj->strlen; + asn_append_oid(&(entry->var), &(obj->var)); + + if ((i = snmp_table_insert(snmptoolctx, entry)) < 0) { + snmp_index_listfree(&(entry->index_list)); + free(entry); + return (-1); + } else if (i == 0) { + /* Same entry already present in lists. */ + free(entry->string); + free(entry); + } + + (void) snmp_import_update_table(ENTRY_INDEX, entry); + + return (1); +} + +/* + * Read everything after the syntax type that is certainly a leaf OID info. + */ +static int32_t +snmp_import_leaf(struct snmp_toolinfo *snmptoolctx, enum tok *tok, + struct snmp_oid2str *oid2str) +{ + int32_t i, syntax; + + if ((syntax = parse_type(snmptoolctx, tok, &(oid2str->tc), &(oid2str->snmp_enum))) + < 0) + return(-1); + + oid2str->syntax = syntax; + /* + * That is the name of the function, corresponding to the entry. + * It is used by bsnmpd, but is not interesting for us. + */ + if (*tok == TOK_STR) + *tok = gettoken(snmptoolctx); + + for (i = 0; i < SNMP_ACCESS_GETSET && *tok == TOK_ACCESS; i++) { + oid2str->access |= (uint32_t) val; + *tok = gettoken(snmptoolctx); + } + + if (*tok != ')') { + warnx("')' expected at end of line %d", input->lno); + return (-1); + } + + oid2str->table_idx = snmp_import_update_table(ENTRY_DATA, NULL); + + if ((i = snmp_leaf_insert(snmptoolctx, oid2str)) < 0) { + warnx("Error adding leaf %s to list", oid2str->string); + return (-1); + } + + /* + * Same entry is already present in the mapping lists and + * the new one was not inserted. + */ + if (i == 0) { + free(oid2str->string); + free(oid2str); + } + + (void) snmp_import_update_table(ENTRY_NONE, NULL); + + return (1); +} + +static int32_t +snmp_import_object(struct snmp_toolinfo *snmptoolctx) +{ + char *string; + int i; + enum tok tok; + struct snmp_oid2str *oid2str; + + if (snmp_import_head(snmptoolctx) < 0) + return (-1); + + if ((oid2str = malloc(sizeof(struct snmp_oid2str))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (-1); + } + + if ((string = malloc(strlen(nexttok) + 1)) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + free(oid2str); + return (-1); + } + + memset(oid2str, 0, sizeof(struct snmp_oid2str)); + strlcpy(string, nexttok, strlen(nexttok) + 1); + oid2str->string = string; + oid2str->strlen = strlen(nexttok); + + asn_append_oid(&(oid2str->var), &(current_oid)); + if (snmp_suboid_append(&(oid2str->var), (asn_subid_t) val) < 0) + goto error; + + /* + * Prepared the entry - now figure out where to insert it. + * After the object we have following options: + * 1) new line, blank, ) - then it is an enum oid -> snmp_enumlist; + * 2) new line , ( - nonleaf oid -> snmp_nodelist; + * 2) ':' - table entry - a variable length SYNTAX_TYPE (one or more) + * may follow and second string must end line -> snmp_tablelist; + * 3) OID , string ) - this is a trap entry or a leaf -> snmp_oidlist; + * 4) SYNTAX_TYPE, string (not always), get/set modifier - always last + * and )- this is definitely a leaf. + */ + + switch (tok = gettoken(snmptoolctx)) { + case ')': + if ((i = snmp_enum_insert(snmptoolctx, oid2str)) < 0) + goto error; + if (i == 0) { + free(oid2str->string); + free(oid2str); + } + return (1); + + case '(': + if (snmp_suboid_append(¤t_oid, (asn_subid_t) val) < 0) + goto error; + + /* + * Ignore the error for nodes since the .def files currently + * contain different strings for 1.3.6.1.2.1 - mibII. Only make + * sure the memory is freed and don't complain. + */ + if ((i = snmp_node_insert(snmptoolctx, oid2str)) <= 0) { + free(string); + free(oid2str); + } + return (snmp_import_object(snmptoolctx)); + + case ':': + if (snmp_suboid_append(¤t_oid, (asn_subid_t) val) < 0) + goto error; + if (snmp_import_table(snmptoolctx, oid2str) < 0) + goto error; + /* + * A different table entry type was malloced and the data is + * contained there. + */ + free(oid2str); + return (1); + + case TOK_TYPE: + /* FALLTHROUGH */ + case TOK_DEFTYPE: + /* FALLTHROUGH */ + case TOK_ENUM: + /* FALLTHROUGH */ + case TOK_BITS: + if (snmp_import_leaf(snmptoolctx, &tok, oid2str) < 0) + goto error; + return (1); + + default: + warnx("Unexpected token at line %d - %s", input->lno, + input->fname); + break; + } + +error: + snmp_mapping_entryfree(oid2str); + + return (-1); +} + +static int32_t +snmp_import_tree(struct snmp_toolinfo *snmptoolctx, enum tok *tok) +{ + while (*tok != TOK_EOF) { + switch (*tok) { + case TOK_ERR: + return (-1); + case '(': + if (snmp_import_object(snmptoolctx) < 0) + return (-1); + break; + case ')': + if (snmp_suboid_pop(¤t_oid) < 0) + return (-1); + (void) snmp_import_update_table(ENTRY_NONE, NULL); + break; + default: + /* Anything else here would be illegal. */ + return (-1); + } + *tok = gettoken(snmptoolctx); + } + + return (0); +} + +static int32_t +snmp_import_top(struct snmp_toolinfo *snmptoolctx, enum tok *tok) +{ + enum snmp_tc tc; + struct enum_type *t; + + if (*tok == '(') + return (snmp_import_tree(snmptoolctx, tok)); + + if (*tok == TOK_TYPEDEF) { + if ((*tok = gettoken(snmptoolctx)) != TOK_STR) { + warnx("type name expected after typedef - %s", + input->fname); + return (-1); + } + + t = snmp_enumtc_init(nexttok); + + *tok = gettoken(snmptoolctx); + t->is_enum = (*tok == TOK_ENUM); + t->is_bits = (*tok == TOK_BITS); + t->syntax = parse_type(snmptoolctx, tok, &tc, &(t->snmp_enum)); + snmp_enumtc_insert(snmptoolctx, t); + + return (1); + } + + if (*tok == TOK_INCLUDE) { + int i; + + *tok = gettoken(snmptoolctx); + if (*tok != TOK_FILENAME) { + warnx("filename expected in include directive - %s", + nexttok); + return (-1); + } + + if (( i = add_filename(snmptoolctx, nexttok, NULL, 1)) == 0) { + *tok = gettoken(snmptoolctx); + return (1); + } + + if (i == -1) + return (-1); + + input_fopen(nexttok); + *tok = gettoken(snmptoolctx); + return (1); + } + + warnx("'(' or 'typedef' expected - %s", nexttok); + return (-1); +} + +static int32_t +snmp_import(struct snmp_toolinfo *snmptoolctx) +{ + int i; + enum tok tok; + + tok = gettoken(snmptoolctx); + + do + i = snmp_import_top(snmptoolctx, &tok); + while (i > 0); + + return (i); +} + +/* + * Read a .def file and import oid<->string mapping. + * Mappings are inserted into a global structure containing list for each OID + * syntax type. + */ +int32_t +snmp_import_file(struct snmp_toolinfo *snmptoolctx, struct fname *file) +{ + int idx; + + snmp_import_init(&(file->cut)); + input_fopen(file->name); + if ((idx = snmp_import(snmptoolctx)) < 0) + warnx("Failed to read mappings from file %s", file->name); + + input_close(); + + return (idx); +} diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c new file mode 100644 index 0000000..a6d14a2 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c @@ -0,0 +1,1018 @@ +/*- + * Copyright (c) 2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "bsnmptc.h" +#include "bsnmptools.h" + +extern int _bsnmptools_debug; +#define DEBUG if (_bsnmptools_debug) fprintf + +/* Allocate memory and initialize list. */ +struct snmp_mappings * +snmp_mapping_init(void) +{ + struct snmp_mappings *m; + + if ((m = malloc(sizeof(struct snmp_mappings))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (NULL); + } + + memset(m, 0, sizeof(struct snmp_mappings)); + return (m); +} + +#define snmp_nodelist mappings->nodelist +#define snmp_intlist mappings->intlist +#define snmp_octlist mappings->octlist +#define snmp_oidlist mappings->oidlist +#define snmp_iplist mappings->iplist +#define snmp_ticklist mappings->ticklist +#define snmp_cntlist mappings->cntlist +#define snmp_gaugelist mappings->gaugelist +#define snmp_cnt64list mappings->cnt64list +#define snmp_enumlist mappings->enumlist +#define snmp_tablelist mappings->tablelist +#define snmp_tclist mappings->tclist + +void +enum_pairs_free(struct enum_pairs *headp) +{ + struct enum_pair *e; + + if (headp == NULL) + return; + + while ((e = STAILQ_FIRST(headp)) != NULL) { + STAILQ_REMOVE_HEAD(headp, link); + + if (e->enum_str) + free(e->enum_str); + free(e); + } + + free(headp); +} + +void +snmp_mapping_entryfree(struct snmp_oid2str *entry) +{ + if (entry->string) + free(entry->string); + + if (entry->tc == SNMP_TC_OWN) + enum_pairs_free(entry->snmp_enum); + + free(entry); +} + +static void +snmp_mapping_listfree(struct snmp_mapping *headp) +{ + struct snmp_oid2str *p; + + while ((p = SLIST_FIRST(headp)) != NULL) { + SLIST_REMOVE_HEAD(headp, link); + + if (p->string) + free(p->string); + + if (p->tc == SNMP_TC_OWN) + enum_pairs_free(p->snmp_enum); + free(p); + } + + SLIST_INIT(headp); +} + +void +snmp_index_listfree(struct snmp_idxlist *headp) +{ + struct index *i; + + while ((i = STAILQ_FIRST(headp)) != NULL) { + STAILQ_REMOVE_HEAD(headp, link); + if (i->tc == SNMP_TC_OWN) + enum_pairs_free(i->snmp_enum); + free(i); + } + + STAILQ_INIT(headp); +} + +static void +snmp_mapping_table_listfree(struct snmp_table_index *headp) +{ + struct snmp_index_entry *t; + + while ((t = SLIST_FIRST(headp)) != NULL) { + SLIST_REMOVE_HEAD(headp, link); + + if (t->string) + free(t->string); + + snmp_index_listfree(&(t->index_list)); + free(t); + } +} + +static void +snmp_enumtc_listfree(struct snmp_enum_tc *headp) +{ + struct enum_type *t; + + while ((t = SLIST_FIRST(headp)) != NULL) { + SLIST_REMOVE_HEAD(headp, link); + + if (t->name) + free(t->name); + enum_pairs_free(t->snmp_enum); + free(t); + } +} + +int +snmp_mapping_free(struct snmp_toolinfo *snmptoolctx) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL) + return (-1); + + snmp_mapping_listfree(&snmptoolctx->snmp_nodelist); + snmp_mapping_listfree(&snmptoolctx->snmp_intlist); + snmp_mapping_listfree(&snmptoolctx->snmp_octlist); + snmp_mapping_listfree(&snmptoolctx->snmp_oidlist); + snmp_mapping_listfree(&snmptoolctx->snmp_iplist); + snmp_mapping_listfree(&snmptoolctx->snmp_ticklist); + snmp_mapping_listfree(&snmptoolctx->snmp_cntlist); + snmp_mapping_listfree(&snmptoolctx->snmp_gaugelist); + snmp_mapping_listfree(&snmptoolctx->snmp_cnt64list); + snmp_mapping_listfree(&snmptoolctx->snmp_enumlist); + snmp_mapping_table_listfree(&snmptoolctx->snmp_tablelist); + snmp_enumtc_listfree(&snmptoolctx->snmp_tclist); + free(snmptoolctx->mappings); + + return (0); +} + +static void +snmp_dump_enumpairs(struct enum_pairs *headp) +{ + struct enum_pair *entry; + + if (headp == NULL) + return; + + fprintf(stderr,"enums: "); + STAILQ_FOREACH(entry, headp, link) + fprintf(stderr,"%d - %s, ", entry->enum_val, + (entry->enum_str == NULL)?"NULL":entry->enum_str); + + fprintf(stderr,"; "); +} + +void +snmp_dump_oid2str(struct snmp_oid2str *entry) +{ + char buf[ASN_OIDSTRLEN]; + + if (entry != NULL) { + memset(buf, 0, sizeof(buf)); + asn_oid2str_r(&(entry->var), buf); + DEBUG(stderr, "%s - %s - %d - %d - %d", buf, entry->string, + entry->syntax, entry->access, entry->strlen); + snmp_dump_enumpairs(entry->snmp_enum); + DEBUG(stderr,"%s \n", (entry->table_idx == NULL)?"No table": + entry->table_idx->string); + } +} + +static void +snmp_dump_indexlist(struct snmp_idxlist *headp) +{ + struct index *entry; + + if (headp == NULL) + return; + + STAILQ_FOREACH(entry, headp, link) { + fprintf(stderr,"%d, ", entry->syntax); + snmp_dump_enumpairs(entry->snmp_enum); + } + + fprintf(stderr,"\n"); +} + +/* Initialize the enum pairs list of a oid2str entry. */ +struct enum_pairs * +enum_pairs_init(void) +{ + struct enum_pairs *snmp_enum; + + if ((snmp_enum = malloc(sizeof(struct enum_pairs))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (NULL); + } + + STAILQ_INIT(snmp_enum); + return (snmp_enum); +} + +/* + * Given a number and string, allocate memory for a (int, string) pair and add + * it to the given oid2str mapping entry's enum pairs list. + */ +int32_t +enum_pair_insert(struct enum_pairs *headp, int32_t enum_val, char *enum_str) +{ + struct enum_pair *e_new; + + if ((e_new = malloc(sizeof(struct enum_pair))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (-1); + } + + memset(e_new, 0, sizeof(struct enum_pair)); + + if ((e_new->enum_str = malloc(strlen(enum_str) + 1)) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + free(e_new); + return (-1); + } + + e_new->enum_val = enum_val; + strlcpy(e_new->enum_str, enum_str, strlen(enum_str) + 1); + STAILQ_INSERT_TAIL(headp, e_new, link); + + return (1); + +} + +/* + * Insert an entry in a list - entries are lexicographicaly order by asn_oid. + * Returns 1 on success, -1 if list is not initialized, 0 if a matching oid already + * exists. Error cheking is left to calling function. + */ +static int +snmp_mapping_insert(struct snmp_mapping *headp, struct snmp_oid2str *entry) +{ + int32_t rc; + struct snmp_oid2str *temp, *prev; + + if (entry == NULL) + return(-1); + + if ((prev = SLIST_FIRST(headp)) == NULL || + asn_compare_oid(&(entry->var), &(prev->var)) < 0) { + SLIST_INSERT_HEAD(headp, entry, link); + return (1); + } else + rc = -1; /* Make the compiler happy. */ + + SLIST_FOREACH(temp, headp, link) { + if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0) + break; + prev = temp; + rc = -1; + } + + switch (rc) { + case 0: + /* Ops, matching OIDs - hope the rest info also matches. */ + if (strncmp(temp->string, entry->string, entry->strlen)) { + syslog(LOG_INFO, "Matching OIDs with different string " + "mappings: old - %s, new - %s", temp->string, + entry->string); + return (-1); + } + /* + * Ok, we have that already. + * As long as the strings match - don't complain. + */ + return (0); + + case 1: + SLIST_INSERT_AFTER(temp, entry, link); + break; + + case -1: + SLIST_INSERT_AFTER(prev, entry, link); + break; + + default: + /* NOTREACHED */ + return (-1); + } + + return (1); +} + +int32_t +snmp_node_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_nodelist,entry)); + + return (-1); +} + +static int32_t +snmp_int_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_intlist,entry)); + + return (-1); +} + +static int32_t +snmp_oct_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_octlist,entry)); + + return (-1); +} + +static int32_t +snmp_oid_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_oidlist,entry)); + + return (-1); +} + +static int32_t +snmp_ip_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_iplist,entry)); + + return (-1); +} + +static int32_t +snmp_tick_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_ticklist,entry)); + + return (-1); +} + +static int32_t +snmp_cnt_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_cntlist,entry)); + + return (-1); +} + +static int32_t +snmp_gauge_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_gaugelist,entry)); + + return (-1); +} + +static int32_t +snmp_cnt64_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_cnt64list,entry)); + + return (-1); +} + +int32_t +snmp_enum_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + if (snmptoolctx != NULL && snmptoolctx->mappings) + return (snmp_mapping_insert(&snmptoolctx->snmp_enumlist,entry)); + + return (-1); +} + +int32_t +snmp_leaf_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry) +{ + switch (entry->syntax) { + case SNMP_SYNTAX_INTEGER: + return (snmp_int_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_OCTETSTRING: + return (snmp_oct_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_OID: + return (snmp_oid_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_IPADDRESS: + return (snmp_ip_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_COUNTER: + return (snmp_cnt_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_GAUGE: + return (snmp_gauge_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_TIMETICKS: + return (snmp_tick_insert(snmptoolctx, entry)); + case SNMP_SYNTAX_COUNTER64: + return (snmp_cnt64_insert(snmptoolctx, entry)); + default: + break; + } + + return (-1); +} + +static int32_t +snmp_index_insert(struct snmp_idxlist *headp, struct index *idx) +{ + if (headp == NULL || index == NULL) + return (-1); + + STAILQ_INSERT_TAIL(headp, idx, link); + return (1); +} + +int32_t +snmp_syntax_insert(struct snmp_idxlist *headp, struct enum_pairs *enums, + enum snmp_syntax syntax, enum snmp_tc tc) +{ + struct index *idx; + + if ((idx = malloc(sizeof(struct index))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (-1); + } + + memset(idx, 0, sizeof(struct index)); + + if (snmp_index_insert(headp, idx) < 0) { + free(idx); + return (-1); + } + + idx->syntax = syntax; + idx->snmp_enum = enums; + idx->tc = tc; + + return (1); +} + +int32_t +snmp_table_insert(struct snmp_toolinfo *snmptoolctx, + struct snmp_index_entry *entry) +{ + int32_t rc; + struct snmp_index_entry *temp, *prev; + + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || + entry == NULL) + return(-1); + + if ((prev = SLIST_FIRST(&snmptoolctx->snmp_tablelist)) == NULL || + asn_compare_oid(&(entry->var), &(prev->var)) < 0) { + SLIST_INSERT_HEAD(&snmptoolctx->snmp_tablelist, entry, link); + return (1); + } else + rc = -1; /* Make the compiler happy. */ + + SLIST_FOREACH(temp, &snmptoolctx->snmp_tablelist, link) { + if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0) + break; + prev = temp; + rc = -1; + } + + switch (rc) { + case 0: + /* Ops, matching OIDs - hope the rest info also matches. */ + if (strncmp(temp->string, entry->string, entry->strlen)) { + syslog(LOG_INFO, "Matching OIDs with different string " + "mapping - old - %s, new - %s", temp->string, + entry->string); + return (-1); + } + return(0); + + case 1: + SLIST_INSERT_AFTER(temp, entry, link); + break; + + case -1: + SLIST_INSERT_AFTER(prev, entry, link); + break; + + default: + /* NOTREACHED */ + return (-1); + } + + return (1); +} + +struct enum_type * +snmp_enumtc_init(char *name) +{ + struct enum_type *enum_tc; + + if ((enum_tc = malloc(sizeof(struct enum_type))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (NULL); + } + + memset(enum_tc, 0, sizeof(struct enum_type)); + if ((enum_tc->name = malloc(strlen(name) + 1)) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + free(enum_tc); + return (NULL); + } + strlcpy(enum_tc->name, name, strlen(name) + 1); + + return (enum_tc); +} + +void +snmp_enumtc_free(struct enum_type *tc) +{ + if (tc->name) + free(tc->name); + if (tc->snmp_enum) + enum_pairs_free(tc->snmp_enum); + free(tc); +} + +void +snmp_enumtc_insert(struct snmp_toolinfo *snmptoolctx, struct enum_type *entry) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL) + return; /* XXX no error handling? */ + + SLIST_INSERT_HEAD(&snmptoolctx->snmp_tclist, entry, link); +} + +struct enum_type * +snmp_enumtc_lookup(struct snmp_toolinfo *snmptoolctx, char *name) +{ + struct enum_type *temp; + + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL) + return (NULL); + + SLIST_FOREACH(temp, &snmptoolctx->snmp_tclist, link) { + if (strcmp(temp->name, name) == 0) + return (temp); + } + return (NULL); +} + +static void +snmp_mapping_dumplist(struct snmp_mapping *headp) +{ + char buf[ASN_OIDSTRLEN]; + struct snmp_oid2str *entry; + + if (headp == NULL) + return; + + SLIST_FOREACH(entry,headp,link) { + memset(buf, 0, sizeof(buf)); + asn_oid2str_r(&(entry->var), buf); + fprintf(stderr, "%s - %s - %d - %d - %d", buf, entry->string, + entry->syntax, entry->access ,entry->strlen); + fprintf(stderr," - %s \n", (entry->table_idx == NULL)? + "No table":entry->table_idx->string); + } +} + +static void +snmp_mapping_dumptable(struct snmp_table_index *headp) +{ + char buf[ASN_OIDSTRLEN]; + struct snmp_index_entry *entry; + + if (headp == NULL) + return; + + SLIST_FOREACH(entry, headp, link) { + memset(buf, 0, sizeof(buf)); + asn_oid2str_r(&(entry->var), buf); + fprintf(stderr,"%s - %s - %d - ", buf, entry->string, + entry->strlen); + snmp_dump_indexlist(&(entry->index_list)); + } +} + +void +snmp_mapping_dump(struct snmp_toolinfo *snmptoolctx /* int bits */) +{ + if (!_bsnmptools_debug) + return; + + if (snmptoolctx == NULL) { + fprintf(stderr,"No snmptool context!\n"); + return; + } + + if (snmptoolctx->mappings == NULL) { + fprintf(stderr,"No mappings!\n"); + return; + } + + fprintf(stderr,"snmp_nodelist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_nodelist); + + fprintf(stderr,"snmp_intlist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_intlist); + + fprintf(stderr,"snmp_octlist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_octlist); + + fprintf(stderr,"snmp_oidlist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_oidlist); + + fprintf(stderr,"snmp_iplist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_iplist); + + fprintf(stderr,"snmp_ticklist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_ticklist); + + fprintf(stderr,"snmp_cntlist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_cntlist); + + fprintf(stderr,"snmp_gaugelist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_gaugelist); + + fprintf(stderr,"snmp_cnt64list:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_cnt64list); + + fprintf(stderr,"snmp_enumlist:\n"); + snmp_mapping_dumplist(&snmptoolctx->snmp_enumlist); + + fprintf(stderr,"snmp_tablelist:\n"); + snmp_mapping_dumptable(&snmptoolctx->snmp_tablelist); +} + +char * +enum_string_lookup(struct enum_pairs *headp, int32_t enum_val) +{ + struct enum_pair *temp; + + if (headp == NULL) + return (NULL); + + STAILQ_FOREACH(temp, headp, link) { + if (temp->enum_val == enum_val) + return (temp->enum_str); + } + + return (NULL); +} + +int32_t +enum_number_lookup(struct enum_pairs *headp, char *e_str) +{ + struct enum_pair *tmp; + + if (headp == NULL) + return (-1); + + STAILQ_FOREACH(tmp, headp, link) + if (strncmp(tmp->enum_str, e_str, strlen(tmp->enum_str)) == 0) + return (tmp->enum_val); + + return (-1); +} + +static int32_t +snmp_lookuplist_string(struct snmp_mapping *headp, struct snmp_object *s) +{ + struct snmp_oid2str *temp; + + if (headp == NULL) + return (-1); + + SLIST_FOREACH(temp, headp, link) + if (asn_compare_oid(&(temp->var), &(s->val.var)) == 0) + break; + + if ((s->info = temp) == NULL) + return (-1); + + return (1); +} + +/* provided an asn_oid find the corresponding string for it */ +static int32_t +snmp_lookup_leaf(struct snmp_mapping *headp, struct snmp_object *s) +{ + struct snmp_oid2str *temp; + + if (headp == NULL) + return (-1); + + SLIST_FOREACH(temp,headp,link) { + if ((asn_compare_oid(&(temp->var), &(s->val.var)) == 0) || + (asn_is_suboid(&(temp->var), &(s->val.var)))) { + s->info = temp; + return (1); + } + } + + return (-1); +} + +int32_t +snmp_lookup_leafstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL) + return (-1); + + switch (s->val.syntax) { + case SNMP_SYNTAX_INTEGER: + return (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s)); + case SNMP_SYNTAX_OCTETSTRING: + return (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s)); + case SNMP_SYNTAX_OID: + return (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s)); + case SNMP_SYNTAX_IPADDRESS: + return (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s)); + case SNMP_SYNTAX_COUNTER: + return (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s)); + case SNMP_SYNTAX_GAUGE: + return (snmp_lookup_leaf( + &snmptoolctx->snmp_gaugelist, s)); + case SNMP_SYNTAX_TIMETICKS: + return (snmp_lookup_leaf( + &snmptoolctx->snmp_ticklist, s)); + case SNMP_SYNTAX_COUNTER64: + return (snmp_lookup_leaf( + &snmptoolctx->snmp_cnt64list, s)); + case SNMP_SYNTAX_NOSUCHOBJECT: + /* FALLTHROUGH */ + case SNMP_SYNTAX_NOSUCHINSTANCE: + /* FALLTHROUGH */ + case SNMP_SYNTAX_ENDOFMIBVIEW: + return (snmp_lookup_allstring(snmptoolctx, s)); + default: + warnx("Unknown syntax - %d", s->val.syntax); + break; + } + + return (-1); +} + +int32_t +snmp_lookup_enumstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL) + return (-1); + + return (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s)); +} + +int32_t +snmp_lookup_oidstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL) + return (-1); + + return (snmp_lookuplist_string(&snmptoolctx->snmp_oidlist, s)); +} + +int32_t +snmp_lookup_nodestring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL) + return (-1); + + return (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s)); +} + +int32_t +snmp_lookup_allstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s) +{ + if (snmptoolctx == NULL || snmptoolctx->mappings == NULL) + return (-1); + + if (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_gaugelist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_ticklist, s) > 0) + return (1); + if (snmp_lookup_leaf(&snmptoolctx->snmp_cnt64list, s) > 0) + return (1); + if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0) + return (1); + if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0) + return (1); + + return (-1); +} + +int32_t +snmp_lookup_nonleaf_string(struct snmp_toolinfo *snmptoolctx, + struct snmp_object *s) +{ + if (snmptoolctx == NULL) + return (-1); + + if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0) + return (1); + if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0) + return (1); + + return (-1); +} + +static int32_t +snmp_lookup_oidlist(struct snmp_mapping *hp, struct snmp_object *s, char *oid) +{ + struct snmp_oid2str *temp; + + if (hp == NULL) + return (-1); + + SLIST_FOREACH(temp, hp, link) { + if (temp->strlen != strlen(oid)) + continue; + + if (strncmp(temp->string, oid, temp->strlen)) + continue; + + s->val.syntax = temp->syntax; + s->info = temp; + asn_append_oid(&(s->val.var), &(temp->var)); + return (1); + } + + return (-1); +} + +static int32_t +snmp_lookup_tablelist(struct snmp_toolinfo *snmptoolctx, + struct snmp_table_index *headp, struct snmp_object *s, char *oid) +{ + struct snmp_index_entry *temp; + + if (snmptoolctx == NULL || headp == NULL) + return (-1); + + SLIST_FOREACH(temp, headp, link) { + if (temp->strlen != strlen(oid)) + continue; + + if (strncmp(temp->string, oid, temp->strlen)) + continue; + + /* + * Another hack here - if we were given a table name + * return the corresponding pointer to it's entry. + * That should not change the reponce we'll get. + */ + s->val.syntax = SNMP_SYNTAX_NULL; + asn_append_oid(&(s->val.var), &(temp->var)); + if (snmp_lookup_leaf(&snmptoolctx->snmp_nodelist, s) > 0) + return (1); + else + return (-1); + } + + return (-1); +} + +int32_t +snmp_lookup_oidall(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s, + char *oid) +{ + if (snmptoolctx == NULL || s == NULL || oid == NULL) + return (-1); + + if (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list, s, oid) > 0) + return (1); + if (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist, s, oid) > 0) + return (1); + if (snmp_lookup_tablelist(snmptoolctx, &snmptoolctx->snmp_tablelist, + s, oid) > 0) + return (1); + + return (-1); +} + +int32_t +snmp_lookup_enumoid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s, + char *oid) +{ + if (snmptoolctx == NULL || s == NULL) + return (-1); + + return (snmp_lookup_oidlist(&snmptoolctx->snmp_enumlist, s, oid)); +} + +int32_t +snmp_lookup_oid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s, + char *oid) +{ + if (snmptoolctx == NULL || s == NULL) + return (-1); + + switch (s->val.syntax) { + case SNMP_SYNTAX_INTEGER: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist, + s, oid)); + case SNMP_SYNTAX_OCTETSTRING: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist, + s, oid)); + case SNMP_SYNTAX_OID: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist, + s, oid)); + case SNMP_SYNTAX_IPADDRESS: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist, + s, oid)); + case SNMP_SYNTAX_COUNTER: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist, + s, oid)); + case SNMP_SYNTAX_GAUGE: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist, + s, oid)); + case SNMP_SYNTAX_TIMETICKS: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist, + s, oid)); + case SNMP_SYNTAX_COUNTER64: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list, + s, oid)); + case SNMP_SYNTAX_NULL: + return (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist, + s, oid)); + default: + warnx("Unknown syntax - %d", s->val.syntax); + break; + } + + return (-1); +} diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.c b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.c new file mode 100644 index 0000000..dc22c69 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.c @@ -0,0 +1,1287 @@ +/*- + * Copyright (c) 2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Textual conventions for OctetStrings + * + * $FreeBSD$ + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include "bsnmptc.h" +#include "bsnmptools.h" + +/* OctetString, DisplayString */ +static char *snmp_oct2str(uint32_t, char *, char *); +static char *snmp_str2asn_oid(char *, struct asn_oid *); +static int parse_octetstring(struct snmp_value *, char *); + +/* DateAndTime */ +static char *snmp_octstr2date(uint32_t, char *, char *); +static char *snmp_date2asn_oid(char * , struct asn_oid *); +static int parse_dateandtime(struct snmp_value *, char *); + +/* PhysAddress */ +static char *snmp_oct2physAddr(uint32_t, char *, char *); +static char *snmp_addr2asn_oid(char *, struct asn_oid *); +static int parse_physaddress(struct snmp_value *, char *); + +/* NTPTimeStamp */ +static char *snmp_oct2ntp_ts(uint32_t, char *, char *); +static char *snmp_ntp_ts2asn_oid(char *, struct asn_oid *); +static int parse_ntp_ts(struct snmp_value *, char *); + +/* BridgeId */ +static char *snmp_oct2bridgeid(uint32_t, char *, char *); +static char *snmp_bridgeid2oct(char *, struct asn_oid *); +static int parse_bridge_id(struct snmp_value *, char *); + +/* BridgePortId */ +static char *snmp_oct2bport_id(uint32_t, char *, char *); +static char *snmp_bport_id2oct(char *, struct asn_oid *); +static int parse_bport_id(struct snmp_value *, char *); + +/* InetAddress */ +static char *snmp_oct2inetaddr(uint32_t len, char *octets, char *buf); +static char *snmp_inetaddr2oct(char *str, struct asn_oid *oid); +static int32_t parse_inetaddr(struct snmp_value *value, char *string); + +static char *snmp_oct2bits(uint32_t len, char *octets, char *buf); +static char *snmp_bits2oct(char *str, struct asn_oid *oid); +static int32_t parse_bits(struct snmp_value *value, char *string); + +struct snmp_text_conv { + enum snmp_tc tc; + const char *tc_str; + int32_t len; + snmp_oct2tc_f oct2tc; + snmp_tc2oid_f tc2oid; + snmp_tc2oct_f tc2oct; +} text_convs[] = { + { SNMP_STRING, "OctetString", SNMP_VAR_STRSZ, + snmp_oct2str, snmp_str2asn_oid, parse_octetstring }, + + { SNMP_DISPLAYSTRING, "DisplayString" , SNMP_VAR_STRSZ, + snmp_oct2str, snmp_str2asn_oid, parse_octetstring }, + + { SNMP_DATEANDTIME, "DateAndTime", SNMP_DATETIME_STRSZ, + snmp_octstr2date, snmp_date2asn_oid, parse_dateandtime }, + + { SNMP_PHYSADDR, "PhysAddress", SNMP_PHYSADDR_STRSZ, + snmp_oct2physAddr, snmp_addr2asn_oid, parse_physaddress }, + + { SNMP_ATMESI, "AtmESI", SNMP_PHYSADDR_STRSZ, + snmp_oct2physAddr, snmp_addr2asn_oid, parse_physaddress }, + + { SNMP_NTP_TIMESTAMP, "NTPTimeStamp", SNMP_NTP_TS_STRSZ, + snmp_oct2ntp_ts, snmp_ntp_ts2asn_oid, parse_ntp_ts }, + + { SNMP_MACADDRESS, "MacAddress", SNMP_PHYSADDR_STRSZ, + snmp_oct2physAddr, snmp_addr2asn_oid, parse_physaddress }, + + { SNMP_BRIDGE_ID, "BridgeId", SNMP_BRIDGEID_STRSZ, + snmp_oct2bridgeid, snmp_bridgeid2oct, parse_bridge_id }, + + { SNMP_BPORT_ID, "BridgePortId", SNMP_BPORT_STRSZ, + snmp_oct2bport_id, snmp_bport_id2oct, parse_bport_id }, + + { SNMP_INETADDRESS, "InetAddress", SNMP_INADDRS_STRSZ, + snmp_oct2inetaddr, snmp_inetaddr2oct, parse_inetaddr }, + + { SNMP_TC_OWN, "BITS", SNMP_VAR_STRSZ, + snmp_oct2bits, snmp_bits2oct, parse_bits }, + + { SNMP_UNKNOWN, "Unknown", SNMP_VAR_STRSZ, snmp_oct2str, + snmp_str2asn_oid, parse_octetstring } /* keep last */ +}; + +/* Common API */ +enum snmp_tc +snmp_get_tc(char *str) +{ + int i; + for (i = 0; i < SNMP_UNKNOWN; i++) { + if (!strncmp(text_convs[i].tc_str, str, + strlen(text_convs[i].tc_str))) + return (text_convs[i].tc); + } + + return (SNMP_STRING); +} + +char * +snmp_oct2tc(enum snmp_tc tc, uint32_t len, char *octets) +{ + uint32_t tc_len; + char * buf; + + if (tc < 0 || tc > SNMP_UNKNOWN) + tc = SNMP_UNKNOWN; + + if (text_convs[tc].len > 0) + tc_len = text_convs[tc].len; + else + tc_len = 2 * len + 3; + + if ((buf = malloc(tc_len)) == NULL ) { + syslog(LOG_ERR, "malloc failed - %s", strerror(errno)); + return (NULL); + } + + memset(buf, 0, tc_len); + if (text_convs[tc].oct2tc(len, octets, buf) == NULL) { + free(buf); + return (NULL); + } + + return (buf); +} + +char * +snmp_tc2oid(enum snmp_tc tc, char *str, struct asn_oid *oid) +{ + if (tc < 0 || tc > SNMP_UNKNOWN) + tc = SNMP_UNKNOWN; + + return (text_convs[tc].tc2oid(str, oid)); +} + +int32_t +snmp_tc2oct(enum snmp_tc tc, struct snmp_value *value, char *string) +{ + if (tc < 0 || tc > SNMP_UNKNOWN) + tc = SNMP_UNKNOWN; + + return (text_convs[tc].tc2oct(value, string)); +} + +/***************************************************** +* Basic OctetString type. +*/ +static char * +snmp_oct2str(uint32_t len, char *octets, char *buf) +{ + uint8_t binary = 0; + uint32_t i; + char *ptr; + + if (len > MAX_OCTSTRING_LEN || octets == NULL || buf == NULL) + return (NULL); + + for (ptr = buf, i = 0; i < len; i++) + if (!isprint(octets[i])) { + binary = 1; + buf += sprintf(buf, "0x"); + break; + } + + for (ptr = buf, i = 0; i < len; i++) + if (!binary) + ptr += sprintf(ptr, "%c", octets[i]); + else + ptr += sprintf(ptr, "%2.2x", (u_char)octets[i]); + + return (buf); +} + +static char * +snmp_str2asn_oid(char *str, struct asn_oid *oid) +{ + uint32_t i, len = 0; + + /* + * OctetStrings are allowed max length of ASN_MAXOCTETSTRING, + * but trying to index an entry with such a long OctetString + * will fail anyway. + */ + for (len = 0; len < ASN_MAXOIDLEN; len++) { + if (strchr(",]", *(str + len)) != NULL) + break; + } + + if (len >= ASN_MAXOIDLEN) + return (NULL); + + if (snmp_suboid_append(oid, (asn_subid_t) len) < 0) + return (NULL); + + for (i = 0; i < len; i++) + if (snmp_suboid_append(oid, (asn_subid_t) *(str + i)) < 0) + return (NULL); + + return (str + len); +} + +static int32_t +parse_octetstring(struct snmp_value *value, char *val) +{ + size_t len; + + if ((len = strlen(val)) >= MAX_OCTSTRING_LEN) { + warnx("Octetstring too long - %d is max allowed", + MAX_OCTSTRING_LEN - 1); + return (-1); + } + + value->v.octetstring.len = len; + + if((value->v.octetstring.octets = malloc(len)) == NULL) { + syslog(LOG_ERR,"malloc failed: %s", strerror(errno)); + return (-1); + } + + memcpy(value->v.octetstring.octets, val, len); + value->syntax = SNMP_SYNTAX_OCTETSTRING; + + return (0); +} + +/************************************************************* + * DateAndTime + ************************************************************* + * rfc 2579 specification: + * DateAndTime ::= TEXTUAL-CONVENTION + * DISPLAY-HINT "2d-1d-1d,1d:1d:1d.1d,1a1d:1d" + * STATUS current + * DESCRIPTION + * "A date-time specification. + * + * field octets contents range + * ----- ------ -------- ----- + * 1 1-2 year* 0..65536 + * 2 3 month 1..12 + * 3 4 day 1..31 + * 4 5 hour 0..23 + * 5 6 minutes 0..59 + * 6 7 seconds 0..60 + * (use 60 for leap-second) + * 7 8 deci-seconds 0..9 + * 8 9 direction from UTC '+' / '-' + * 9 10 hours from UTC* 0..13 + * 10 11 minutes from UTC 0..59 + * + * * Notes: + * - the value of year is in network-byte order + * - daylight saving time in New Zealand is +13 + * + * For example, Tuesday May 26, 1992 at 1:30:15 PM EDT would be + * displayed as: + * + * 1992-5-26,13:30:15.0,-4:0 + */ +static char * +snmp_octstr2date(uint32_t len, char *octets, char *buf) +{ + int year; + char *ptr; + + if (len != SNMP_DATETIME_OCTETS || octets == NULL || buf == NULL) + return (NULL); + + buf[0]= '\0'; + year = (octets[0] << 8); + year += (octets[1]); + + ptr = buf; + ptr += sprintf(ptr, "%4.4d-%.2d-%.2d, ", year, octets[2],octets[3]); + ptr += sprintf(ptr, "%2.2d:%2.2d:%2.2d.%.2d, ", octets[4],octets[5], + octets[6],octets[7]); + ptr += sprintf(ptr, "%c%.2d:%.2d", octets[8],octets[9],octets[10]); + + return (buf); +} + +static char * +snmp_date2asn_oid(char *str, struct asn_oid *oid) +{ + char *endptr, *ptr; + uint32_t v; + int32_t saved_errno; + + if (snmp_suboid_append(oid, (asn_subid_t) SNMP_DATETIME_OCTETS) < 0) + return (NULL); + + /* Read 'YYYY-' and write it in two subs. */ + ptr = str; + saved_errno = errno; + errno = 0; + v = strtoul(ptr, &endptr, 10); + if (v > 0xffff) + goto error; + else + errno = saved_errno; + if (*endptr != '-') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) ((v & 0xff00) >> 8)) < 0) + return (NULL); + if (snmp_suboid_append(oid, (asn_subid_t) (v & 0xff)) < 0) + return (NULL); + + /* 'MM-' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != '-') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'DD,' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != '-') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'HH:' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != ':') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'MM:' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != ':') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'SS.' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != '.') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'M(mseconds),' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != ',') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'UTC' - optional */ + ptr = endptr + 1; + if (*ptr == 'U' && *(ptr + 1) == 'T' && *(ptr + 1) == 'C') + ptr += 3; + + /* '+/-' */ + if (*ptr == '-' || *ptr == '+') { + if (snmp_suboid_append(oid, (asn_subid_t) (*ptr)) < 0) + return (NULL); + } else + goto error1; + + /* 'HH:' */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (*endptr != ':') + goto error1; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + /* 'MM' - last one - ignore endptr here. */ + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0) + goto error; + else + errno = saved_errno; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + return (endptr); + + error: + errno = saved_errno; + error1: + warnx("Date value %s not supported", str); + return (NULL); +} + +/* Read a DateAndTime string eg. 1992-5-26,13:30:15.0,-4:0. */ +static int32_t +parse_dateandtime(struct snmp_value *sv, char *val) +{ + char *endptr; + uint32_t v; + uint8_t date[SNMP_DATETIME_OCTETS]; + + /* 'YYYY-' */ + v = strtoul(val, &endptr, 10); + if (v > 0xffff || *endptr != '-') + goto error; + date[0] = ((v & 0xff00) >> 8); + date[1] = (v & 0xff); + val = endptr + 1; + + /* 'MM-' */ + v = strtoul(val, &endptr, 10); + if (v == 0 || v > 12 || *endptr != '-') + goto error; + date[2] = v; + val = endptr + 1; + + /* 'DD,' */ + v = strtoul(val, &endptr, 10); + if (v == 0 || v > 31 || *endptr != ',') + goto error; + date[3] = v; + val = endptr + 1; + + /* 'HH:' */ + v = strtoul(val, &endptr, 10); + if (v > 23 || *endptr != ':') + goto error; + date[4] = v; + val = endptr + 1; + + /* 'MM:' */ + v = strtoul(val, &endptr, 10); + if (v > 59 || *endptr != ':') + goto error; + date[5] = v; + val = endptr + 1; + + /* 'SS.' */ + v = strtoul(val, &endptr, 10); + if (v > 60 || *endptr != '.') + goto error; + date[6] = v; + val = endptr + 1; + + /* '(deci-)s,' */ + v = strtoul(val, &endptr, 10); + if (v > 9 || *endptr != ',') + goto error; + date[7] = v; + val = endptr + 1; + + /* offset - '+/-' */ + if (*val != '-' && *val != '+') + goto error; + date[8] = (uint8_t) *val; + val = endptr + 1; + + /* 'HH:' - offset from UTC */ + v = strtoul(val, &endptr, 10); + if (v > 13 || *endptr != ':') + goto error; + date[9] = v; + val = endptr + 1; + + /* 'MM'\0'' offset from UTC */ + v = strtoul(val, &endptr, 10); + if (v > 59 || *endptr != '\0') + goto error; + date[10] = v; + + if ((sv->v.octetstring.octets = malloc(SNMP_DATETIME_OCTETS)) == NULL) { + warnx("malloc() failed - %s", strerror(errno)); + return (-1); + } + + sv->v.octetstring.len = SNMP_DATETIME_OCTETS; + memcpy(sv->v.octetstring.octets, date, SNMP_DATETIME_OCTETS); + sv->syntax = SNMP_SYNTAX_OCTETSTRING; + return (1); + + error: + warnx("Date value %s not supported", val); + return (-1); +} + +/************************************************************** + * PhysAddress + */ +static char * +snmp_oct2physAddr(uint32_t len, char *octets, char *buf) +{ + char *ptr; + uint32_t i; + + if (len != SNMP_PHYSADDR_OCTETS || octets == NULL || buf == NULL) + return (NULL); + + buf[0]= '\0'; + + ptr = buf; + ptr += sprintf(ptr, "%2.2x", octets[0]); + for (i = 1; i < 6; i++) + ptr += sprintf(ptr, ":%2.2x", octets[i]); + + return (buf); +} + +static char * +snmp_addr2asn_oid(char *str, struct asn_oid *oid) +{ + char *endptr, *ptr; + uint32_t v, i; + int saved_errno; + + if (snmp_suboid_append(oid, (asn_subid_t) SNMP_PHYSADDR_OCTETS) < 0) + return (NULL); + + ptr = str; + for (i = 0; i < 5; i++) { + saved_errno = errno; + v = strtoul(ptr, &endptr, 16); + errno = saved_errno; + if (v > 0xff) { + warnx("Integer value %s not supported", str); + return (NULL); + } + if (*endptr != ':') { + warnx("Failed adding oid - %s",str); + return (NULL); + } + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + ptr = endptr + 1; + } + + /* The last one - don't check the ending char here. */ + saved_errno = errno; + v = strtoul(ptr, &endptr, 16); + errno = saved_errno; + if (v > 0xff) { + warnx("Integer value %s not supported", str); + return (NULL); + } + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + return (endptr); +} + +static int32_t +parse_physaddress(struct snmp_value *sv, char *val) +{ + char *endptr; + int32_t i; + uint32_t v; + uint8_t phys_addr[SNMP_PHYSADDR_OCTETS]; + + for (i = 0; i < 5; i++) { + v = strtoul(val, &endptr, 16); + if (v > 0xff) { + warnx("Integer value %s not supported", val); + return (-1); + } + if(*endptr != ':') { + warnx("Failed reading octet - %s", val); + return (-1); + } + phys_addr[i] = v; + val = endptr + 1; + } + + /* The last one - don't check the ending char here. */ + v = strtoul(val, &endptr, 16); + if (v > 0xff) { + warnx("Integer value %s not supported", val); + return (-1); + } + phys_addr[5] = v; + + if ((sv->v.octetstring.octets = malloc(SNMP_PHYSADDR_OCTETS)) == NULL) { + syslog(LOG_ERR,"malloc failed: %s", strerror(errno)); + return (-1); + } + + sv->v.octetstring.len = SNMP_PHYSADDR_OCTETS; + memcpy(sv->v.octetstring.octets, phys_addr, SNMP_PHYSADDR_OCTETS); + sv->syntax = SNMP_SYNTAX_OCTETSTRING; + return (1); +} + +/************************************************************** + * NTPTimeStamp + ************************************************************** + * NTP MIB, Revision 0.2, 7/25/97: + * NTPTimeStamp ::= TEXTUAL-CONVENTION + * DISPLAY-HINT "4x.4x" + * STATUS current + * DESCRIPTION + * "" + * SYNTAX OCTET STRING (SIZE(8)) + */ +static char * +snmp_oct2ntp_ts(uint32_t len, char *octets, char *buf) +{ + char *ptr; + uint32_t i; + + if (len != SNMP_NTP_TS_OCTETS || octets == NULL || buf == NULL) + return (NULL); + + buf[0]= '\0'; + + ptr = buf; + i = octets[0] * 1000 + octets[1] * 100 + octets[2] * 10 + octets[3]; + ptr += sprintf(ptr, "%4.4d", i); + i = octets[4] * 1000 + octets[5] * 100 + octets[6] * 10 + octets[7]; + ptr += sprintf(ptr, ".%4.4d", i); + + return (buf); +} + +static char * +snmp_ntp_ts2asn_oid(char *str, struct asn_oid *oid) +{ + char *endptr, *ptr; + uint32_t v, i, d; + struct asn_oid suboid; + int saved_errno; + + if (snmp_suboid_append(oid, (asn_subid_t) SNMP_NTP_TS_OCTETS) < 0) + return (NULL); + + ptr = str; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0 || (v / 1000) > 9) { + warnx("Integer value %s not supported", str); + errno = saved_errno; + return (NULL); + } else + errno = saved_errno; + + if (*endptr != '.') { + warnx("Failed adding oid - %s",str); + return (NULL); + } + + memset(&suboid, 0, sizeof(struct asn_oid)); + suboid.len = SNMP_NTP_TS_OCTETS; + + for (i = 0, d = 1000; i < 4; i++) { + suboid.subs[i] = v / d; + v = v % d; + d = d / 10; + } + + ptr = endptr + 1; + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + if (errno != 0 || (v / 1000) > 9) { + warnx("Integer value %s not supported", str); + errno = saved_errno; + return (NULL); + } else + errno = saved_errno; + + for (i = 0, d = 1000; i < 4; i++) { + suboid.subs[i + 4] = v / d; + v = v % d; + d = d / 10; + } + + asn_append_oid(oid, &suboid); + return (endptr); +} + +static int32_t +parse_ntp_ts(struct snmp_value *sv, char *val) +{ + char *endptr; + int32_t i, d, saved_errno; + uint32_t v; + uint8_t ntp_ts[SNMP_NTP_TS_OCTETS]; + + saved_errno = errno; + v = strtoul(val, &endptr, 10); + if (errno != 0 || (v / 1000) > 9) { + saved_errno = errno; + warnx("Integer value %s not supported", val); + return (-1); + } else + saved_errno = errno; + + if (*endptr != '.') { + warnx("Failed reading octet - %s", val); + return (-1); + } + + for (i = 0, d = 1000; i < 4; i++) { + ntp_ts[i] = v / d; + v = v % d; + d = d / 10; + } + val = endptr + 1; + + saved_errno = errno; + v = strtoul(val, &endptr, 10); + if (errno != 0 || (v / 1000) > 9) { + saved_errno = errno; + warnx("Integer value %s not supported", val); + return (-1); + } else + saved_errno = errno; + + for (i = 0, d = 1000; i < 4; i++) { + ntp_ts[i + 4] = v / d; + v = v % d; + d = d / 10; + } + + if ((sv->v.octetstring.octets = malloc(SNMP_NTP_TS_OCTETS)) == NULL) { + syslog(LOG_ERR,"malloc failed: %s", strerror(errno)); + return (-1); + } + + sv->v.octetstring.len = SNMP_NTP_TS_OCTETS; + memcpy(sv->v.octetstring.octets, ntp_ts, SNMP_NTP_TS_OCTETS); + sv->syntax = SNMP_SYNTAX_OCTETSTRING; + return (1); +} + +/************************************************************** + * BridgeId + ************************************************************** + * BRIDGE-MIB, REVISION "200509190000Z" + * BridgeId ::= TEXTUAL-CONVENTION + * STATUS current + * DESCRIPTION + * "The Bridge-Identifier, as used in the Spanning Tree + * Protocol, to uniquely identify a bridge. Its first two + * octets (in network byte order) contain a priority value, + * and its last 6 octets contain the MAC address used to + * refer to a bridge in a unique fashion (typically, the + * numerically smallest MAC address of all ports on the + * bridge)." + * SYNTAX OCTET STRING (SIZE (8)) + */ +static char * +snmp_oct2bridgeid(uint32_t len, char *octets, char *buf) +{ + char *ptr; + uint32_t i, priority; + + if (len != SNMP_BRIDGEID_OCTETS || octets == NULL || buf == NULL) + return (NULL); + + buf[0]= '\0'; + ptr = buf; + + priority = octets[0] << 8; + priority += octets[1]; + if (priority > SNMP_MAX_BRIDGE_PRIORITY) { + warnx("Invalid bridge priority %d", priority); + return (NULL); + } else + ptr += sprintf(ptr, "%d.", octets[0]); + + ptr += sprintf(ptr, "%2.2x", octets[2]); + + for (i = 1; i < 6; i++) + ptr += sprintf(ptr, ":%2.2x", octets[i + 2]); + + return (buf); +} + +static char * +snmp_bridgeid2oct(char *str, struct asn_oid *oid) +{ + char *endptr, *ptr; + uint32_t v, i; + int32_t saved_errno; + + if (snmp_suboid_append(oid, (asn_subid_t) SNMP_BRIDGEID_OCTETS) < 0) + return (NULL); + + ptr = str; + /* Read the priority. */ + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + errno = 0; + + if (v > SNMP_MAX_BRIDGE_PRIORITY || errno != 0 || *endptr != '.') { + errno = saved_errno; + warnx("Bad bridge priority value %d", v); + return (NULL); + } + + if (snmp_suboid_append(oid, (asn_subid_t) (v & 0xff00)) < 0) + return (NULL); + + if (snmp_suboid_append(oid, (asn_subid_t) (v & 0xff)) < 0) + return (NULL); + + ptr = endptr + 1; + for (i = 0; i < 5; i++) { + saved_errno = errno; + v = strtoul(ptr, &endptr, 16); + errno = saved_errno; + if (v > 0xff) { + warnx("Integer value %s not supported", str); + return (NULL); + } + if (*endptr != ':') { + warnx("Failed adding oid - %s",str); + return (NULL); + } + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + ptr = endptr + 1; + } + + /* The last one - don't check the ending char here. */ + saved_errno = errno; + v = strtoul(ptr, &endptr, 16); + errno = saved_errno; + if (v > 0xff) { + warnx("Integer value %s not supported", str); + return (NULL); + } + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + return (endptr); +} + +static int32_t +parse_bridge_id(struct snmp_value *sv, char *string) +{ + char *ptr, *endptr; + int32_t i, saved_errno; + uint32_t v; + uint8_t bridge_id[SNMP_BRIDGEID_OCTETS]; + + ptr = string; + /* Read the priority. */ + saved_errno = errno; + errno = 0; + v = strtoul(string, &endptr, 10); + errno = saved_errno; + + if (v > SNMP_MAX_BRIDGE_PRIORITY || errno != 0 || *endptr != '.') { + errno = saved_errno; + warnx("Bad bridge priority value %d", v); + return (-1); + } + + bridge_id[0] = (v & 0xff00); + bridge_id[1] = (v & 0xff); + + string = endptr + 1; + + for (i = 0; i < 5; i++) { + v = strtoul(string, &endptr, 16); + if (v > 0xff) { + warnx("Integer value %s not supported", string); + return (-1); + } + if(*endptr != ':') { + warnx("Failed reading octet - %s", string); + return (-1); + } + bridge_id[i + 2] = v; + string = endptr + 1; + } + + /* The last one - don't check the ending char here. */ + v = strtoul(string, &endptr, 16); + if (v > 0xff) { + warnx("Integer value %s not supported", string); + return (-1); + } + bridge_id[7] = v; + + if ((sv->v.octetstring.octets = malloc(SNMP_BRIDGEID_OCTETS)) == NULL) { + syslog(LOG_ERR,"malloc failed: %s", strerror(errno)); + return (-1); + } + + sv->v.octetstring.len = SNMP_BRIDGEID_OCTETS; + memcpy(sv->v.octetstring.octets, bridge_id, SNMP_BRIDGEID_OCTETS); + sv->syntax = SNMP_SYNTAX_OCTETSTRING; + return (1); +} + +/************************************************************** + * BridgePortId + ************************************************************** + * BEGEMOT-BRIDGE-MIB, LAST-UPDATED "200608100000Z" + * BridgePortId ::= TEXTUAL-CONVENTION + * DISPLAY-HINT "1x.1x" + * STATUS current + * DESCRIPTION + * "A port identifier that contains a bridge port's STP priority + * in the first octet and the port number in the second octet." + * SYNTAX OCTET STRING (SIZE(2)) + */ +static char * +snmp_oct2bport_id(uint32_t len, char *octets, char *buf) +{ + char *ptr; + + if (len != SNMP_BPORT_OCTETS || octets == NULL || buf == NULL) + return (NULL); + + buf[0]= '\0'; + ptr = buf; + + ptr += sprintf(ptr, "%d.", octets[0]); + ptr += sprintf(ptr, "%d", octets[1]); + + return (buf); +} + +static char * +snmp_bport_id2oct(char *str, struct asn_oid *oid) +{ + char *endptr, *ptr; + uint32_t v; + int saved_errno; + + if (snmp_suboid_append(oid, (asn_subid_t) SNMP_BPORT_OCTETS) < 0) + return (NULL); + + ptr = str; + /* Read the priority. */ + saved_errno = errno; + v = strtoul(ptr, &endptr, 10); + errno = 0; + + if (v > SNMP_MAX_BPORT_PRIORITY || errno != 0 || *endptr != '.') { + errno = saved_errno; + warnx("Bad bridge port priority value %d", v); + return (NULL); + } + + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + saved_errno = errno; + v = strtoul(ptr, &endptr, 16); + errno = saved_errno; + + if (v > 0xff) { + warnx("Bad port number - %d", v); + return (NULL); + } + + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + return (endptr); +} + +static int32_t +parse_bport_id(struct snmp_value *value, char *string) +{ + char *ptr, *endptr; + int saved_errno; + uint32_t v; + uint8_t bport_id[SNMP_BPORT_OCTETS]; + + ptr = string; + /* Read the priority. */ + saved_errno = errno; + errno = 0; + v = strtoul(string, &endptr, 10); + errno = saved_errno; + + if (v > SNMP_MAX_BPORT_PRIORITY || errno != 0 || *endptr != '.') { + errno = saved_errno; + warnx("Bad bridge port priority value %d", v); + return (-1); + } + + bport_id[0] = v; + + string = endptr + 1; + v = strtoul(string, &endptr, 16); + if (v > 0xff) { + warnx("Bad port number - %d", v); + return (-1); + } + + bport_id[1] = v; + + if ((value->v.octetstring.octets = malloc(SNMP_BPORT_OCTETS)) == NULL) { + syslog(LOG_ERR,"malloc failed: %s", strerror(errno)); + return (-1); + } + + value->v.octetstring.len = SNMP_BPORT_OCTETS; + memcpy(value->v.octetstring.octets, bport_id, SNMP_BPORT_OCTETS); + value->syntax = SNMP_SYNTAX_OCTETSTRING; + return (1); +} +/************************************************************** + * InetAddress + ************************************************************** + * INET-ADDRESS-MIB, REVISION "200502040000Z" + * InetAddress ::= TEXTUAL-CONVENTION + * STATUS current + * DESCRIPTION + * "Denotes a generic Internet address. + * + * An InetAddress value is always interpreted within the context + * of an InetAddressType value. Every usage of the InetAddress + * textual convention is required to specify the InetAddressType + * object that provides the context. It is suggested that the + * InetAddressType object be logically registered before the + * object(s) that use the InetAddress textual convention, if + * they appear in the same logical row. + * + * The value of an InetAddress object must always be + * consistent with the value of the associated InetAddressType + * object. Attempts to set an InetAddress object to a value + * inconsistent with the associated InetAddressType + * must fail with an inconsistentValue error. + * + * When this textual convention is used as the syntax of an + * index object, there may be issues with the limit of 128 + * sub-identifiers specified in SMIv2, STD 58. In this case, + * the object definition MUST include a 'SIZE' clause to + * limit the number of potential instance sub-identifiers; + * otherwise the applicable constraints MUST be stated in + * the appropriate conceptual row DESCRIPTION clauses, or + * in the surrounding documentation if there is no single + * DESCRIPTION clause that is appropriate." + * SYNTAX OCTET STRING (SIZE (0..255)) + ************************************************************** + * TODO: FIXME!!! syrinx: Since we do not support checking the + * consistency of a varbinding based on the value of a previous + * one, try to guess the type of address based on the + * OctetString SIZE - 4 for IPv4, 16 for IPv6, others currently + * not supported. + */ +static char * +snmp_oct2inetaddr(uint32_t len, char *octets, char *buf) +{ + int af; + void *ip; + struct in_addr ipv4; + struct in6_addr ipv6; + + if (len > MAX_OCTSTRING_LEN || octets == NULL || buf == NULL) + return (NULL); + + switch (len) { + /* XXX: FIXME - IPv4*/ + case 4: + memcpy(&ipv4.s_addr, octets, sizeof(ipv4.s_addr)); + af = AF_INET; + ip = &ipv4; + break; + + /* XXX: FIXME - IPv4*/ + case 16: + memcpy(ipv6.s6_addr, octets, sizeof(ipv6.s6_addr)); + af = AF_INET6; + ip = &ipv6; + break; + + default: + return (NULL); + } + + if (inet_ntop(af, ip, buf, SNMP_INADDRS_STRSZ) == NULL) { + warnx("inet_ntop failed - %s", strerror(errno)); + return (NULL); + } + + return (buf); +} + +static char * +snmp_inetaddr2oct(char *str, struct asn_oid *oid) +{ + return (NULL); +} + +static int32_t +parse_inetaddr(struct snmp_value *value, char *string) +{ + return (-1); +} + +/************************************************************** + * SNMP BITS type - XXX: FIXME + **************************************************************/ +static char * +snmp_oct2bits(uint32_t len, char *octets, char *buf) +{ + int i, bits; + uint64_t value; + + if (len > sizeof(value) || octets == NULL || buf == NULL) + return (NULL); + + for (i = len, value = 0, bits = 0; i > 0; i--, bits += 8) + value += octets[i] << bits; + + buf[0]= '\0'; + sprintf(buf, "0x%llx.",(long long unsigned) value); + + return (buf); +} + +static char * +snmp_bits2oct(char *str, struct asn_oid *oid) +{ + char *endptr; + int i, size, bits, saved_errno; + uint64_t v, mask = 0xFF00000000000000; + + saved_errno = errno; + errno = 0; + + v = strtoull(str, &endptr, 16); + if (errno != 0) { + warnx("Bad BITS value %s - %s", str, strerror(errno)); + errno = saved_errno; + return (NULL); + } + + bits = 8; + /* Determine length - up to 8 octets supported so far. */ + for (size = sizeof(v); size > 0; size--) { + if ((v & mask) != 0) + break; + mask = mask >> bits; + } + + if (size == 0) + size = 1; + + if (snmp_suboid_append(oid, (asn_subid_t) size) < 0) + return (NULL); + + for (i = 0, bits = 0; i < size; i++, bits += 8) + if (snmp_suboid_append(oid, + (asn_subid_t)((v & mask) >> bits)) < 0) + return (NULL); + + return (endptr); +} + +static int32_t +parse_bits(struct snmp_value *value, char *string) +{ + char *endptr; + int i, size, bits, saved_errno; + uint64_t v, mask = 0xFF00000000000000; + + saved_errno = errno; + errno = 0; + + v = strtoull(string, &endptr, 16); + + if (errno != 0) { + warnx("Bad BITS value %s - %s", string, strerror(errno)); + errno = saved_errno; + return (-1); + } + + bits = 8; + /* Determine length - up to 8 octets supported so far. */ + for (size = sizeof(v); size > 0; size--) { + if ((v & mask) != 0) + break; + mask = mask >> bits; + } + + if (size == 0) + size = 1; + + if ((value->v.octetstring.octets = malloc(size)) == NULL) { + syslog(LOG_ERR, "malloc failed: %s", strerror(errno)); + return (-1); + } + + value->v.octetstring.len = size; + for (i = 0, bits = 0; i < size; i++, bits += 8) + value->v.octetstring.octets[i] = (v & mask) >> bits; + value->syntax = SNMP_SYNTAX_OCTETSTRING; + return (1); +} diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.h b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.h new file mode 100644 index 0000000..fd06676 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptc.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Textual conventions for snmp + * + * $FreeBSD$ + */ + +#ifndef _BSNMP_TEXT_CONV_H_ +#define _BSNMP_TEXT_CONV_H_ + +/* Variable display length string. */ +#define SNMP_VAR_STRSZ -1 + +/* + * 11 bytes - octets that represent DateAndTime Textual convention + * and the size of string used to diplay that. + */ +#define SNMP_DATETIME_OCTETS 11 +#define SNMP_DATETIME_STRSZ 32 + +/* + * 6 bytes - octets that represent PhysAddress Textual convention + * and the size of string used to diplay that. + */ +#define SNMP_PHYSADDR_OCTETS 6 +#define SNMP_PHYSADDR_STRSZ 19 + +/* NTPTimeStamp. */ +#define SNMP_NTP_TS_OCTETS 8 +#define SNMP_NTP_TS_STRSZ 10 + +/* BridgeId. */ +#define SNMP_BRIDGEID_OCTETS 8 +#define SNMP_BRIDGEID_STRSZ 25 +#define SNMP_MAX_BRIDGE_PRIORITY 65535 + +/* BridgePortId. */ +#define SNMP_BPORT_OCTETS 2 +#define SNMP_BPORT_STRSZ 7 +#define SNMP_MAX_BPORT_PRIORITY 255 + +/* InetAddress. */ +#define SNMP_INADDRS_STRSZ INET6_ADDRSTRLEN + +enum snmp_tc { + SNMP_STRING = 0, + SNMP_DISPLAYSTRING = 1, + SNMP_DATEANDTIME = 2, + SNMP_PHYSADDR = 3, + SNMP_ATMESI = 4, + SNMP_NTP_TIMESTAMP = 5, + SNMP_MACADDRESS = 6, + SNMP_BRIDGE_ID = 7, + SNMP_BPORT_ID = 8, + SNMP_INETADDRESS = 9, + SNMP_TC_OWN = 10, + SNMP_UNKNOWN, /* keep last */ +}; + +typedef char * (*snmp_oct2tc_f) (uint32_t len, char *octs, char *buf); +typedef char * (*snmp_tc2oid_f) (char *str, struct asn_oid *oid); +typedef int32_t (*snmp_tc2oct_f) (struct snmp_value *value, char *string); + +enum snmp_tc snmp_get_tc(char *str); +char *snmp_oct2tc(enum snmp_tc tc, uint32_t len, char *octets); +char *snmp_tc2oid(enum snmp_tc tc, char *str, struct asn_oid *oid); +int32_t snmp_tc2oct(enum snmp_tc tc, struct snmp_value *value, char *string); + +#endif /* _BSNMP_TEXT_CONV_H_ */ diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.c b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.c new file mode 100755 index 0000000..dbaac5b --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.c @@ -0,0 +1,2121 @@ +/*- + * Copyright (c) 2005-2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Helper functions for snmp client tools + * + * $FreeBSD$ + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "bsnmptc.h" +#include "bsnmptools.h" + +/* Internal varibale to turn on library debugging for testing and to + * find bugs. It is not exported via the header file. + * XXX should we cover it by some #ifdef BSNMPTOOLS_DEBUG? */ +int _bsnmptools_debug = 0; + +/* Default files to import mapping from if none explicitly provided. */ +#define bsnmpd_defs "/usr/share/snmp/defs/tree.def" +#define mibII_defs "/usr/share/snmp/defs/mibII_tree.def" + +/* + * The .iso.org.dod oid that has to be prepended to every OID when requesting + * a value. + */ +const struct asn_oid IsoOrgDod_OID = { + 3, { 1, 3, 6 } +}; + + +#define SNMP_ERR_UNKNOWN 0 + +/* + * An array of error strings corresponding to error definitions from libbsnmp. + */ +static const struct { + const char *str; + int32_t error; +} error_strings[] = { + { "Unknown", SNMP_ERR_UNKNOWN }, + { "Too big ", SNMP_ERR_TOOBIG }, + { "No such Name", SNMP_ERR_NOSUCHNAME }, + { "Bad Value", SNMP_ERR_BADVALUE }, + { "Readonly", SNMP_ERR_READONLY }, + { "General error", SNMP_ERR_GENERR }, + { "No access", SNMP_ERR_NO_ACCESS }, + { "Wrong type", SNMP_ERR_WRONG_TYPE }, + { "Wrong lenght", SNMP_ERR_WRONG_LENGTH }, + { "Wrong encoding", SNMP_ERR_WRONG_ENCODING }, + { "Wrong value", SNMP_ERR_WRONG_VALUE }, + { "No creation", SNMP_ERR_NO_CREATION }, + { "Inconsistent value", SNMP_ERR_INCONS_VALUE }, + { "Resource unavailable", SNMP_ERR_RES_UNAVAIL }, + { "Commit failed", SNMP_ERR_COMMIT_FAILED }, + { "Undo failed", SNMP_ERR_UNDO_FAILED }, + { "Authorization error", SNMP_ERR_AUTH_ERR }, + { "Not writable", SNMP_ERR_NOT_WRITEABLE }, + { "Inconsistent name", SNMP_ERR_INCONS_NAME }, + { NULL, 0 } +}; + +/* This one and any following are exceptions. */ +#define SNMP_SYNTAX_UNKNOWN SNMP_SYNTAX_NOSUCHOBJECT + +static const struct { + const char *str; + enum snmp_syntax stx; +} syntax_strings[] = { + { "Null", SNMP_SYNTAX_NULL }, + { "Integer", SNMP_SYNTAX_INTEGER }, + { "OctetString", SNMP_SYNTAX_OCTETSTRING }, + { "OID", SNMP_SYNTAX_OID }, + { "IpAddress", SNMP_SYNTAX_IPADDRESS }, + { "Counter32", SNMP_SYNTAX_COUNTER }, + { "Gauge", SNMP_SYNTAX_GAUGE }, + { "TimeTicks", SNMP_SYNTAX_TIMETICKS }, + { "Counter64", SNMP_SYNTAX_COUNTER64 }, + { "Unknown", SNMP_SYNTAX_UNKNOWN }, +}; + +int +snmptool_init(struct snmp_toolinfo *snmptoolctx) +{ + char *str; + size_t slen; + + memset(snmptoolctx, 0, sizeof(struct snmp_toolinfo)); + snmptoolctx->objects = 0; + snmptoolctx->mappings = NULL; + snmptoolctx->flags = SNMP_PDU_GET; /* XXX */ + SLIST_INIT(&snmptoolctx->filelist); + snmp_client_init(&snmp_client); + + if (add_filename(snmptoolctx, bsnmpd_defs, &IsoOrgDod_OID, 0) < 0) + warnx("Error adding file %s to list", bsnmpd_defs); + + if (add_filename(snmptoolctx, mibII_defs, &IsoOrgDod_OID, 0) < 0) + warnx("Error adding file %s to list", mibII_defs); + + /* Read the environment */ + if ((str = getenv("SNMPAUTH")) != NULL) { + slen = strlen(str); + if (slen == strlen("md5") && strcasecmp(str, "md5") == 0) + snmp_client.user.auth_proto = SNMP_AUTH_HMAC_MD5; + else if (slen == strlen("sha")&& strcasecmp(str, "sha") == 0) + snmp_client.user.auth_proto = SNMP_AUTH_HMAC_SHA; + else if (slen != 0) + warnx("Bad authentication type - %s in SNMPAUTH", str); + } + + if ((str = getenv("SNMPPRIV")) != NULL) { + slen = strlen(str); + if (slen == strlen("des") && strcasecmp(str, "des") == 0) + snmp_client.user.priv_proto = SNMP_PRIV_DES; + else if (slen == strlen("aes")&& strcasecmp(str, "aes") == 0) + snmp_client.user.priv_proto = SNMP_PRIV_AES; + else if (slen != 0) + warnx("Bad privacy type - %s in SNMPPRIV", str); + } + + if ((str = getenv("SNMPUSER")) != NULL) { + if ((slen = strlen(str)) > sizeof(snmp_client.user.sec_name)) { + warnx("Username too long - %s in SNMPUSER", str); + return (-1); + } + if (slen > 0) { + strlcpy(snmp_client.user.sec_name, str, + sizeof(snmp_client.user.sec_name)); + snmp_client.version = SNMP_V3; + } + } + + if ((str = getenv("SNMPPASSWD")) != NULL) { + if ((slen = strlen(str)) > MAXSTR) + slen = MAXSTR - 1; + if ((snmptoolctx->passwd = malloc(slen + 1)) == NULL) { + warnx("malloc() failed - %s", strerror(errno)); + return (-1); + } + if (slen > 0) + strlcpy(snmptoolctx->passwd, str, slen + 1); + } + + return (0); +} + +#define OBJECT_IDX_LIST(o) o->info->table_idx->index_list + +/* + * Walk through the file list and import string<->oid mappings from each file. + */ +int32_t +snmp_import_all(struct snmp_toolinfo *snmptoolctx) +{ + int32_t fc; + struct fname *tmp; + + if (snmptoolctx == NULL) + return (-1); + + if (ISSET_NUMERIC(snmptoolctx)) + return (0); + + if ((snmptoolctx->mappings = snmp_mapping_init()) == NULL) + return (-1); + + fc = 0; + if (SLIST_EMPTY(&snmptoolctx->filelist)) { + warnx("No files to read OID <-> string conversions from"); + return (-1); + } else { + SLIST_FOREACH(tmp, &snmptoolctx->filelist, link) { + if (tmp->done) + continue; + if (snmp_import_file(snmptoolctx, tmp) < 0) { + fc = -1; + break; + } + fc++; + } + } + + snmp_mapping_dump(snmptoolctx); + return (fc); +} + +/* + * Add a filename to the file list - the initail idea of keeping a list with all + * files to read OIDs from was that an application might want to have loaded in + * memory the OIDs from a single file only and when done with them read the OIDs + * from another file. This is not used yet but might be a good idea at some + * point. Size argument is number of bytes in string including trailing '\0', + * not string lenght. + */ +int32_t +add_filename(struct snmp_toolinfo *snmptoolctx, const char *filename, + const struct asn_oid *cut, int32_t done) +{ + char *fstring; + struct fname *entry; + + if (snmptoolctx == NULL) + return (-1); + + /* Make sure file was not in list. */ + SLIST_FOREACH(entry, &snmptoolctx->filelist, link) { + if (strncmp(entry->name, filename, strlen(entry->name)) == 0) + return (0); + } + + if ((fstring = malloc(strlen(filename) + 1)) == NULL) { + warnx("malloc() failed - %s", strerror(errno)); + return (-1); + } + + if ((entry = malloc(sizeof(struct fname))) == NULL) { + warnx("malloc() failed - %s", strerror(errno)); + free(fstring); + return (-1); + } + + memset(entry, 0, sizeof(struct fname)); + + if (cut != NULL) + asn_append_oid(&(entry->cut), cut); + strlcpy(fstring, filename, strlen(filename) + 1); + entry->name = fstring; + entry->done = done; + SLIST_INSERT_HEAD(&snmptoolctx->filelist, entry, link); + + return (1); +} + +void +free_filelist(struct snmp_toolinfo *snmptoolctx) +{ + struct fname *f; + + if (snmptoolctx == NULL) + return; /* XXX error handling */ + + while ((f = SLIST_FIRST(&snmptoolctx->filelist)) != NULL) { + SLIST_REMOVE_HEAD(&snmptoolctx->filelist, link); + if (f->name) + free(f->name); + free(f); + } +} + +static char +isvalid_fchar(char c, int pos) +{ + if (isalpha(c)|| c == '/'|| c == '_' || c == '.' || c == '~' || + (pos != 0 && isdigit(c))){ + return (c); + } + + if (c == '\0') + return (0); + + if (!isascii(c) || !isprint(c)) + warnx("Unexpected character %#2x", (u_int) c); + else + warnx("Illegal character '%c'", c); + + return (-1); +} + +/* + * Re-implement getsubopt from scratch, because the second argument is broken + * and will not compile with WARNS=5. + * Copied from src/contrib/bsnmp/snmpd/main.c. + */ +static int +getsubopt1(char **arg, const char *const *options, char **valp, char **optp) +{ + static const char *const delim = ",\t "; + u_int i; + char *ptr; + + *optp = NULL; + + /* Skip leading junk. */ + for (ptr = *arg; *ptr != '\0'; ptr++) + if (strchr(delim, *ptr) == NULL) + break; + if (*ptr == '\0') { + *arg = ptr; + return (-1); + } + *optp = ptr; + + /* Find the end of the option. */ + while (*++ptr != '\0') + if (strchr(delim, *ptr) != NULL || *ptr == '=') + break; + + if (*ptr != '\0') { + if (*ptr == '=') { + *ptr++ = '\0'; + *valp = ptr; + while (*ptr != '\0' && strchr(delim, *ptr) == NULL) + ptr++; + if (*ptr != '\0') + *ptr++ = '\0'; + } else + *ptr++ = '\0'; + } + + *arg = ptr; + + for (i = 0; *options != NULL; options++, i++) + if (strcmp(*optp, *options) == 0) + return (i); + return (-1); +} + +static int32_t +parse_path(char *value) +{ + int32_t i, len; + + if (value == NULL) + return (-1); + + for (len = 0; len < MAXPATHLEN; len++) { + i = isvalid_fchar(*(value + len), len) ; + + if (i == 0) + break; + else if (i < 0) + return (-1); + } + + if (len >= MAXPATHLEN || value[len] != '\0') { + warnx("Bad pathname - '%s'", value); + return (-1); + } + + return (len); +} + +static int32_t +parse_flist(struct snmp_toolinfo *snmptoolctx, char *value, char *path, + const struct asn_oid *cut) +{ + int32_t namelen; + char filename[MAXPATHLEN + 1]; + + if (value == NULL) + return (-1); + + do { + memset(filename, 0, MAXPATHLEN + 1); + + if (isalpha(*value) && (path == NULL || path[0] == '\0')) { + strlcpy(filename, SNMP_DEFS_DIR, MAXPATHLEN + 1); + namelen = strlen(SNMP_DEFS_DIR); + } else if (path != NULL){ + strlcpy(filename, path, MAXPATHLEN + 1); + namelen = strlen(path); + } else + namelen = 0; + + for ( ; namelen < MAXPATHLEN; value++) { + if (isvalid_fchar(*value, namelen) > 0) { + filename[namelen++] = *value; + continue; + } + + if (*value == ',' ) + value++; + else if (*value == '\0') + ; + else { + if (!isascii(*value) || !isprint(*value)) + warnx("Unexpected character %#2x in" + " filename", (u_int) *value); + else + warnx("Illegal character '%c' in" + " filename", *value); + return (-1); + } + + filename[namelen]='\0'; + break; + } + + if ((namelen == MAXPATHLEN) && (filename[MAXPATHLEN] != '\0')) { + warnx("Filename %s too long", filename); + return (-1); + } + + if (add_filename(snmptoolctx, filename, cut, 0) < 0) { + warnx("Error adding file %s to list", filename); + return (-1); + } + } while (*value != '\0'); + + return(1); +} + +static int32_t +parse_ascii(char *ascii, uint8_t *binstr, size_t binlen) +{ + int32_t alen, count, saved_errno, i; + uint32_t val; + char dptr[3]; + + /* Filter 0x at the beggining */ + if ((alen = strlen(ascii)) > 2 && ascii[0] == '0' && ascii[1] == 'x') + i = 2; + else + i = 0; + + saved_errno = errno; + errno = 0; + for (count = 0; i < alen; i += 2) { + /* XXX: consider strlen(ascii) % 2 != 0 */ + dptr[0] = ascii[i]; + dptr[1] = ascii[i + 1]; + dptr[2] = '\0'; + if ((val = strtoul(dptr, NULL, 16)) > 0xFF || errno != 0) { + errno = saved_errno; + return (-1); + } + binstr[count] = (uint8_t) val; + if (++count >= binlen) { + warnx("Key %s too long - truncating to %zu octest", + ascii, binlen); + break; + } + } + + return (count); +} + +/* + * Functions to parse common input options for client tools and fill in the + * snmp_client structure. + */ +int32_t +parse_authentication(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + int32_t count, subopt; + char *val, *option; + const char *const subopts[] = { + "proto", + "key", + NULL + }; + + assert(opt_arg != NULL); + count = 1; + while ((subopt = getsubopt1(&opt_arg, subopts, &val, &option)) != EOF) { + switch (subopt) { + case 0: + if (val == NULL) { + warnx("Suboption 'proto' requires an argument"); + return (-1); + } + if (strlen(val) != 3) { + warnx("Unknown auth protocol - %s", val); + return (-1); + } + if (strncasecmp("md5", val, strlen("md5")) == 0) + snmp_client.user.auth_proto = + SNMP_AUTH_HMAC_MD5; + else if (strncasecmp("sha", val, strlen("sha")) == 0) + snmp_client.user.auth_proto = + SNMP_AUTH_HMAC_SHA; + else { + warnx("Unknown auth protocol - %s", val); + return (-1); + } + break; + case 1: + if (val == NULL) { + warnx("Suboption 'key' requires an argument"); + return (-1); + } + if (parse_ascii(val, snmp_client.user.auth_key, + SNMP_AUTH_KEY_SIZ) < 0) { + warnx("Bad authentication key- %s", val); + return (-1); + } + break; + default: + warnx("Unknown suboption - '%s'", suboptarg); + return (-1); + } + count += 1; + } + return (2/* count */); +} + +int32_t +parse_privacy(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + int32_t count, subopt; + char *val, *option; + const char *const subopts[] = { + "proto", + "key", + NULL + }; + + assert(opt_arg != NULL); + count = 1; + while ((subopt = getsubopt1(&opt_arg, subopts, &val, &option)) != EOF) { + switch (subopt) { + case 0: + if (val == NULL) { + warnx("Suboption 'proto' requires an argument"); + return (-1); + } + if (strlen(val) != 3) { + warnx("Unknown privacy protocol - %s", val); + return (-1); + } + if (strncasecmp("aes", val, strlen("aes")) == 0) + snmp_client.user.priv_proto = SNMP_PRIV_AES; + else if (strncasecmp("des", val, strlen("des")) == 0) + snmp_client.user.priv_proto = SNMP_PRIV_DES; + else { + warnx("Unknown privacy protocol - %s", val); + return (-1); + } + break; + case 1: + if (val == NULL) { + warnx("Suboption 'key' requires an argument"); + return (-1); + } + if (parse_ascii(val, snmp_client.user.priv_key, + SNMP_PRIV_KEY_SIZ) < 0) { + warnx("Bad privacy key- %s", val); + return (-1); + } + break; + default: + warnx("Unknown suboption - '%s'", suboptarg); + return (-1); + } + count += 1; + } + return (2/* count */); +} + +int32_t +parse_context(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + int32_t count, subopt; + char *val, *option; + const char *const subopts[] = { + "context", + "context-engine", + NULL + }; + + assert(opt_arg != NULL); + count = 1; + while ((subopt = getsubopt1(&opt_arg, subopts, &val, &option)) != EOF) { + switch (subopt) { + case 0: + if (val == NULL) { + warnx("Suboption 'context' - no argument"); + return (-1); + } + strlcpy(snmp_client.cname, val, SNMP_CONTEXT_NAME_SIZ); + break; + case 1: + if (val == NULL) { + warnx("Suboption 'context-engine' - no argument"); + return (-1); + } + if ((snmp_client.clen = parse_ascii(val, + snmp_client.cengine, SNMP_ENGINE_ID_SIZ)) < 0) { + warnx("Bad EngineID - %s", val); + return (-1); + } + break; + default: + warnx("Unknown suboption - '%s'", suboptarg); + return (-1); + } + count += 1; + } + return (2/* count */); +} + +int32_t +parse_user_security(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + int32_t count, subopt, saved_errno; + char *val, *option; + const char *const subopts[] = { + "engine", + "engine-boots", + "engine-time", + "name", + NULL + }; + + assert(opt_arg != NULL); + count = 1; + while ((subopt = getsubopt1(&opt_arg, subopts, &val, &option)) != EOF) { + switch (subopt) { + case 0: + if (val == NULL) { + warnx("Suboption 'engine' - no argument"); + return (-1); + } + snmp_client.engine.engine_len = parse_ascii(val, + snmp_client.engine.engine_id, SNMP_ENGINE_ID_SIZ); + if (snmp_client.engine.engine_len < 0) { + warnx("Bad EngineID - %s", val); + return (-1); + } + break; + case 1: + if (val == NULL) { + warnx("Suboption 'engine-boots' - no argument"); + return (-1); + } + saved_errno = errno; + errno = 0; + snmp_client.engine.engine_boots = strtoul(val, NULL, 10); + if (errno != 0) { + warnx("Bad 'engine-boots' value %s - %s", val, + strerror(errno)); + errno = saved_errno; + return (-1); + } + errno = saved_errno; + break; + case 2: + if (val == NULL) { + warnx("Suboption 'engine-time' - no argument"); + return (-1); + } + saved_errno = errno; + errno = 0; + snmp_client.engine.engine_time = strtoul(val, NULL, 10); + if (errno != 0) { + warnx("Bad 'engine-time' value %s - %s", val, + strerror(errno)); + errno = saved_errno; + return (-1); + } + errno = saved_errno; + break; + case 3: + strlcpy(snmp_client.user.sec_name, val, + SNMP_ADM_STR32_SIZ); + break; + default: + warnx("Unknown suboption - '%s'", suboptarg); + return (-1); + } + count += 1; + } + return (2/* count */); +} + +int32_t +parse_file(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + assert(opt_arg != NULL); + + if (parse_flist(snmptoolctx, opt_arg, NULL, &IsoOrgDod_OID) < 0) + return (-1); + + return (2); +} + +int32_t +parse_include(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + char path[MAXPATHLEN + 1]; + int32_t cut_dflt, len, subopt; + struct asn_oid cut; + char *val, *option; + const char *const subopts[] = { + "cut", + "path", + "file", + NULL + }; + +#define INC_CUT 0 +#define INC_PATH 1 +#define INC_LIST 2 + + assert(opt_arg != NULL); + + /* if (opt == 'i') + free_filelist(snmptoolctx, ); */ + /* + * This function should be called only after getopt(3) - otherwise if + * no previous validation of opt_arg strlen() may not return what is + * expected. + */ + + path[0] = '\0'; + memset(&cut, 0, sizeof(struct asn_oid)); + cut_dflt = -1; + + while ((subopt = getsubopt1(&opt_arg, subopts, &val, &option)) != EOF) { + switch (subopt) { + case INC_CUT: + if (val == NULL) { + warnx("Suboption 'cut' requires an argument"); + return (-1); + } else { + if (snmp_parse_numoid(val, &cut) < 0) + return (-1); + } + cut_dflt = 1; + break; + + case INC_PATH: + if ((len = parse_path(val)) < 0) + return (-1); + strlcpy(path, val, len + 1); + break; + + case INC_LIST: + if (val == NULL) + return (-1); + if (cut_dflt == -1) + len = parse_flist(snmptoolctx, val, path, &IsoOrgDod_OID); + else + len = parse_flist(snmptoolctx, val, path, &cut); + if (len < 0) + return (-1); + break; + + default: + warnx("Unknown suboption - '%s'", suboptarg); + return (-1); + } + } + + /* XXX: Fix me - returning two is wrong here */ + return (2); +} + +int32_t +parse_server(char *opt_arg) +{ + assert(opt_arg != NULL); + + if (snmp_parse_server(&snmp_client, opt_arg) < 0) + return (-1); + + if (snmp_client.trans > SNMP_TRANS_UDP && snmp_client.chost == NULL) { + if ((snmp_client.chost = malloc(strlen(SNMP_DEFAULT_LOCAL + 1))) + == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (-1); + } + strcpy(snmp_client.chost, SNMP_DEFAULT_LOCAL); + } + + return (2); +} + +int32_t +parse_timeout(char *opt_arg) +{ + int32_t v, saved_errno; + + assert(opt_arg != NULL); + + saved_errno = errno; + errno = 0; + + v = strtol(opt_arg, NULL, 10); + if (errno != 0) { + warnx( "Error parsing timeout value - %s", strerror(errno)); + errno = saved_errno; + return (-1); + } + + snmp_client.timeout.tv_sec = v; + errno = saved_errno; + return (2); +} + +int32_t +parse_retry(char *opt_arg) +{ + uint32_t v; + int32_t saved_errno; + + assert(opt_arg != NULL); + + saved_errno = errno; + errno = 0; + + v = strtoul(opt_arg, NULL, 10); + if (errno != 0) { + warnx("Error parsing retries count - %s", strerror(errno)); + errno = saved_errno; + return (-1); + } + + snmp_client.retries = v; + errno = saved_errno; + return (2); +} + +int32_t +parse_version(char *opt_arg) +{ + uint32_t v; + int32_t saved_errno; + + assert(opt_arg != NULL); + + saved_errno = errno; + errno = 0; + + v = strtoul(opt_arg, NULL, 10); + if (errno != 0) { + warnx("Error parsing version - %s", strerror(errno)); + errno = saved_errno; + return (-1); + } + + switch (v) { + case 1: + snmp_client.version = SNMP_V1; + break; + case 2: + snmp_client.version = SNMP_V2c; + break; + case 3: + snmp_client.version = SNMP_V3; + break; + default: + warnx("Unsupported SNMP version - %u", v); + errno = saved_errno; + return (-1); + } + + errno = saved_errno; + return (2); +} + +int32_t +parse_local_path(char *opt_arg) +{ + assert(opt_arg != NULL); + + if (sizeof(opt_arg) > sizeof(SNMP_LOCAL_PATH)) { + warnx("Filename too long - %s", opt_arg); + return (-1); + } + + strlcpy(snmp_client.local_path, opt_arg, sizeof(SNMP_LOCAL_PATH)); + return (2); +} + +int32_t +parse_buflen(char *opt_arg) +{ + uint32_t size; + int32_t saved_errno; + + assert(opt_arg != NULL); + + saved_errno = errno; + errno = 0; + + size = strtoul(opt_arg, NULL, 10); + if (errno != 0) { + warnx("Error parsing buffer size - %s", strerror(errno)); + errno = saved_errno; + return (-1); + } + + if (size > MAX_BUFF_SIZE) { + warnx("Buffer size too big - %d max allowed", MAX_BUFF_SIZE); + errno = saved_errno; + return (-1); + } + + snmp_client.txbuflen = snmp_client.rxbuflen = size; + errno = saved_errno; + return (2); +} + +int32_t +parse_debug(void) +{ + snmp_client.dump_pdus = 1; + return (1); +} + +int32_t +parse_discovery(struct snmp_toolinfo *snmptoolctx) +{ + SET_EDISCOVER(snmptoolctx); + snmp_client.version = SNMP_V3; + return (1); +} + +int32_t +parse_local_key(struct snmp_toolinfo *snmptoolctx) +{ + SET_LOCALKEY(snmptoolctx); + snmp_client.version = SNMP_V3; + return (1); +} + +int32_t +parse_num_oids(struct snmp_toolinfo *snmptoolctx) +{ + SET_NUMERIC(snmptoolctx); + return (1); +} + +int32_t +parse_output(struct snmp_toolinfo *snmptoolctx, char *opt_arg) +{ + assert(opt_arg != NULL); + + if (strlen(opt_arg) > strlen("verbose")) { + warnx( "Invalid output option - %s",opt_arg); + return (-1); + } + + if (strncasecmp(opt_arg, "short", strlen(opt_arg)) == 0) + SET_OUTPUT(snmptoolctx, OUTPUT_SHORT); + else if (strncasecmp(opt_arg, "verbose", strlen(opt_arg)) == 0) + SET_OUTPUT(snmptoolctx, OUTPUT_VERBOSE); + else if (strncasecmp(opt_arg,"tabular", strlen(opt_arg)) == 0) + SET_OUTPUT(snmptoolctx, OUTPUT_TABULAR); + else if (strncasecmp(opt_arg, "quiet", strlen(opt_arg)) == 0) + SET_OUTPUT(snmptoolctx, OUTPUT_QUIET); + else { + warnx( "Invalid output option - %s", opt_arg); + return (-1); + } + + return (2); +} + +int32_t +parse_errors(struct snmp_toolinfo *snmptoolctx) +{ + SET_RETRY(snmptoolctx); + return (1); +} + +int32_t +parse_skip_access(struct snmp_toolinfo *snmptoolctx) +{ + SET_ERRIGNORE(snmptoolctx); + return (1); +} + +char * +snmp_parse_suboid(char *str, struct asn_oid *oid) +{ + char *endptr; + asn_subid_t suboid; + + if (*str == '.') + str++; + + if (*str < '0' || *str > '9') + return (str); + + do { + suboid = strtoul(str, &endptr, 10); + if ((asn_subid_t) suboid > ASN_MAXID) { + warnx("Suboid %u > ASN_MAXID", suboid); + return (NULL); + } + if (snmp_suboid_append(oid, suboid) < 0) + return (NULL); + str = endptr + 1; + } while (*endptr == '.'); + + return (endptr); +} + +static char * +snmp_int2asn_oid(char *str, struct asn_oid *oid) +{ + char *endptr; + int32_t v, saved_errno; + + saved_errno = errno; + errno = 0; + + v = strtol(str, &endptr, 10); + if (errno != 0) { + warnx("Integer value %s not supported - %s", str, + strerror(errno)); + errno = saved_errno; + return (NULL); + } + errno = saved_errno; + + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + return (endptr); +} + +/* It is a bit weird to have a table indexed by OID but still... */ +static char * +snmp_oid2asn_oid(struct snmp_toolinfo *snmptoolctx, char *str, + struct asn_oid *oid) +{ + int32_t i; + char string[MAXSTR], *endptr; + struct snmp_object obj; + + for (i = 0; i < MAXSTR; i++) + if (isalpha (*(str + i)) == 0) + break; + + endptr = str + i; + memset(&obj, 0, sizeof(struct snmp_object)); + if (i == 0) { + if ((endptr = snmp_parse_suboid(str, &(obj.val.var))) == NULL) + return (NULL); + if (snmp_suboid_append(oid, (asn_subid_t) obj.val.var.len) < 0) + return (NULL); + } else { + strlcpy(string, str, i + 1); + string[i] = '\0'; + if (snmp_lookup_enumoid(snmptoolctx, &obj, string) < 0) { + warnx("Unknown string - %s",string); + return (NULL); + } + free(string); + } + + asn_append_oid(oid, &(obj.val.var)); + return (endptr); +} + +static char * +snmp_ip2asn_oid(char *str, struct asn_oid *oid) +{ + uint32_t v; + int32_t i; + char *endptr, *ptr; + + ptr = str; + for (i = 0; i < 4; i++) { + v = strtoul(ptr, &endptr, 10); + if (v > 0xff) + return (NULL); + if (*endptr != '.' && strchr("],\0", *endptr) == NULL && i != 3) + return (NULL); + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + ptr = endptr + 1; + } + + return (endptr); +} + +/* 32-bit counter, gauge, timeticks. */ +static char * +snmp_uint2asn_oid(char *str, struct asn_oid *oid) +{ + char *endptr; + uint32_t v; + int32_t saved_errno; + + saved_errno = errno; + errno = 0; + + v = strtoul(str, &endptr, 10); + if (errno != 0) { + warnx("Integer value %s not supported - %s\n", str, + strerror(errno)); + errno = saved_errno; + return (NULL); + } + errno = saved_errno; + if (snmp_suboid_append(oid, (asn_subid_t) v) < 0) + return (NULL); + + return (endptr); +} + +static char * +snmp_cnt64_2asn_oid(char *str, struct asn_oid *oid) +{ + char *endptr; + uint64_t v; + int32_t saved_errno; + + saved_errno = errno; + errno = 0; + + v = strtoull(str, &endptr, 10); + + if (errno != 0) { + warnx("Integer value %s not supported - %s", str, + strerror(errno)); + errno = saved_errno; + return (NULL); + } + errno = saved_errno; + if (snmp_suboid_append(oid, (asn_subid_t) (v & 0xffffffff)) < 0) + return (NULL); + + if (snmp_suboid_append(oid, (asn_subid_t) (v >> 32)) < 0) + return (NULL); + + return (endptr); +} + +enum snmp_syntax +parse_syntax(char *str) +{ + int32_t i; + + for (i = 0; i < SNMP_SYNTAX_UNKNOWN; i++) { + if (strncmp(syntax_strings[i].str, str, + strlen(syntax_strings[i].str)) == 0) + return (syntax_strings[i].stx); + } + + return (SNMP_SYNTAX_NULL); +} + +static char * +snmp_parse_subindex(struct snmp_toolinfo *snmptoolctx, char *str, + struct index *idx, struct snmp_object *object) +{ + char *ptr; + int32_t i; + enum snmp_syntax stx; + char syntax[MAX_CMD_SYNTAX_LEN]; + + ptr = str; + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) { + for (i = 0; i < MAX_CMD_SYNTAX_LEN ; i++) { + if (*(ptr + i) == ':') + break; + } + + if (i >= MAX_CMD_SYNTAX_LEN) { + warnx("Unknown syntax in OID - %s", str); + return (NULL); + } + /* Expect a syntax string here. */ + if ((stx = parse_syntax(str)) <= SNMP_SYNTAX_NULL) { + warnx("Invalid syntax - %s",syntax); + return (NULL); + } + + if (stx != idx->syntax && !ISSET_ERRIGNORE(snmptoolctx)) { + warnx("Syntax mismatch - %d expected, %d given", + idx->syntax, stx); + return (NULL); + } + /* + * That is where the suboid started + the syntax length + one + * character for ':'. + */ + ptr = str + i + 1; + } else + stx = idx->syntax; + + switch (stx) { + case SNMP_SYNTAX_INTEGER: + return (snmp_int2asn_oid(ptr, &(object->val.var))); + case SNMP_SYNTAX_OID: + return (snmp_oid2asn_oid(snmptoolctx, ptr, + &(object->val.var))); + case SNMP_SYNTAX_IPADDRESS: + return (snmp_ip2asn_oid(ptr, &(object->val.var))); + case SNMP_SYNTAX_COUNTER: + /* FALLTHROUGH */ + case SNMP_SYNTAX_GAUGE: + /* FALLTHROUGH */ + case SNMP_SYNTAX_TIMETICKS: + return (snmp_uint2asn_oid(ptr, &(object->val.var))); + case SNMP_SYNTAX_COUNTER64: + return (snmp_cnt64_2asn_oid(ptr, &(object->val.var))); + case SNMP_SYNTAX_OCTETSTRING: + return (snmp_tc2oid(idx->tc, ptr, &(object->val.var))); + default: + /* NOTREACHED */ + break; + } + + return (NULL); +} + +char * +snmp_parse_index(struct snmp_toolinfo *snmptoolctx, char *str, + struct snmp_object *object) +{ + char *ptr; + struct index *temp; + + if (object->info->table_idx == NULL) + return (NULL); + + ptr = NULL; + STAILQ_FOREACH(temp, &(OBJECT_IDX_LIST(object)), link) { + if ((ptr = snmp_parse_subindex(snmptoolctx, str, temp, object)) + == NULL) + return (NULL); + + if (*ptr != ',' && *ptr != ']') + return (NULL); + str = ptr + 1; + } + + if (ptr == NULL || *ptr != ']') { + warnx("Mismatching index - %s", str); + return (NULL); + } + + return (ptr + 1); +} + +/* + * Fill in the struct asn_oid member of snmp_value with suboids from input. + * If an error occurs - print message on stderr and return (-1). + * If all is ok - return the length of the oid. + */ +int32_t +snmp_parse_numoid(char *argv, struct asn_oid *var) +{ + char *endptr, *str; + asn_subid_t suboid; + + str = argv; + + if (*str == '.') + str++; + + do { + if (var->len == ASN_MAXOIDLEN) { + warnx("Oid too long - %u", var->len); + return (-1); + } + + suboid = strtoul(str, &endptr, 10); + if (suboid > ASN_MAXID) { + warnx("Oid too long - %u", var->len); + return (-1); + } + + var->subs[var->len++] = suboid; + str = endptr + 1; + } while ( *endptr == '.'); + + if (*endptr != '\0') { + warnx("Invalid oid string - %s", argv); + return (-1); + } + + return (var->len); +} + +/* Append a length 1 suboid to an asn_oid structure. */ +int32_t +snmp_suboid_append(struct asn_oid *var, asn_subid_t suboid) +{ + if (var == NULL) + return (-1); + + if (var->len >= ASN_MAXOIDLEN) { + warnx("Oid too long - %u", var->len); + return (-1); + } + + var->subs[var->len++] = suboid; + + return (1); +} + +/* Pop the last suboid from an asn_oid structure. */ +int32_t +snmp_suboid_pop(struct asn_oid *var) +{ + asn_subid_t suboid; + + if (var == NULL) + return (-1); + + if (var->len < 1) + return (-1); + + suboid = var->subs[--(var->len)]; + var->subs[var->len] = 0; + + return (suboid); +} + +/* + * Parse the command-line provided string into an OID - alocate memory for a new + * snmp object, fill in its fields and insert it in the object list. A + * (snmp_verify_inoid_f) function must be provided to validate the input string. + */ +int32_t +snmp_object_add(struct snmp_toolinfo *snmptoolctx, snmp_verify_inoid_f func, + char *string) +{ + struct snmp_object *obj; + + if (snmptoolctx == NULL) + return (-1); + + /* XXX-BZ does that chack make sense? */ + if (snmptoolctx->objects >= SNMP_MAX_BINDINGS) { + warnx("Too many bindings in PDU - %u", snmptoolctx->objects + 1); + return (-1); + } + + if ((obj = malloc(sizeof(struct snmp_object))) == NULL) { + syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); + return (-1); + } + + memset(obj, 0, sizeof(struct snmp_object)); + if (func(snmptoolctx, obj, string) < 0) { + warnx("Invalid OID - %s", string); + free(obj); + return (-1); + } + + snmptoolctx->objects++; + SLIST_INSERT_HEAD(&snmptoolctx->snmp_objectlist, obj, link); + + return (1); +} + +/* Given an OID, find it in the object list and remove it. */ +int32_t +snmp_object_remove(struct snmp_toolinfo *snmptoolctx, struct asn_oid *oid) +{ + struct snmp_object *temp; + + if (SLIST_EMPTY(&snmptoolctx->snmp_objectlist)) { + warnx("Object list already empty"); + return (-1); + } + + + SLIST_FOREACH(temp, &snmptoolctx->snmp_objectlist, link) + if (asn_compare_oid(&(temp->val.var), oid) == 0) + break; + + if (temp == NULL) { + warnx("No such object in list"); + return (-1); + } + + SLIST_REMOVE(&snmptoolctx->snmp_objectlist, temp, snmp_object, link); + if (temp->val.syntax == SNMP_SYNTAX_OCTETSTRING && + temp->val.v.octetstring.octets != NULL) + free(temp->val.v.octetstring.octets); + free(temp); + + return (1); +} + +static void +snmp_object_freeall(struct snmp_toolinfo *snmptoolctx) +{ + struct snmp_object *o; + + while ((o = SLIST_FIRST(&snmptoolctx->snmp_objectlist)) != NULL) { + SLIST_REMOVE_HEAD(&snmptoolctx->snmp_objectlist, link); + + if (o->val.syntax == SNMP_SYNTAX_OCTETSTRING && + o->val.v.octetstring.octets != NULL) + free(o->val.v.octetstring.octets); + free(o); + } +} + +/* Do all possible memory release before exit. */ +void +snmp_tool_freeall(struct snmp_toolinfo *snmptoolctx) +{ + if (snmp_client.chost != NULL) { + free(snmp_client.chost); + snmp_client.chost = NULL; + } + + if (snmp_client.cport != NULL) { + free(snmp_client.cport); + snmp_client.cport = NULL; + } + + snmp_mapping_free(snmptoolctx); + free_filelist(snmptoolctx); + snmp_object_freeall(snmptoolctx); + + if (snmptoolctx->passwd != NULL) { + free(snmptoolctx->passwd); + snmptoolctx->passwd = NULL; + } +} + +/* + * Fill all variables from the object list into a PDU. (snmp_verify_vbind_f) + * function should check whether the variable is consistent in this PDU + * (e.g do not add non-leaf OIDs to a GET PDU, or OIDs with read access only to + * a SET PDU) - might be NULL though. (snmp_add_vbind_f) function is the + * function actually adds the variable to the PDU and must not be NULL. + */ +int32_t +snmp_pdu_add_bindings(struct snmp_toolinfo *snmptoolctx, + snmp_verify_vbind_f vfunc, snmp_add_vbind_f afunc, + struct snmp_pdu *pdu, int32_t maxcount) +{ + int32_t nbindings, abind; + struct snmp_object *obj; + + if (pdu == NULL || afunc == NULL) + return (-1); + + /* Return 0 in case of no more work todo. */ + if (SLIST_EMPTY(&snmptoolctx->snmp_objectlist)) + return (0); + + if (maxcount < 0 || maxcount > SNMP_MAX_BINDINGS) { + warnx("maxcount out of range: <0 || >SNMP_MAX_BINDINGS"); + return (-1); + } + + nbindings = 0; + SLIST_FOREACH(obj, &snmptoolctx->snmp_objectlist, link) { + if ((vfunc != NULL) && (vfunc(snmptoolctx, pdu, obj) < 0)) { + nbindings = -1; + break; + } + if ((abind = afunc(pdu, obj)) < 0) { + nbindings = -1; + break; + } + + if (abind > 0) { + /* Do not put more varbindings than requested. */ + if (++nbindings >= maxcount) + break; + } + } + + return (nbindings); +} + +/* + * Locate an object in the object list and set a corresponding error status. + */ +int32_t +snmp_object_seterror(struct snmp_toolinfo *snmptoolctx, + struct snmp_value *err_value, int32_t error_status) +{ + struct snmp_object *obj; + + if (SLIST_EMPTY(&snmptoolctx->snmp_objectlist) || err_value == NULL) + return (-1); + + SLIST_FOREACH(obj, &snmptoolctx->snmp_objectlist, link) + if (asn_compare_oid(&(err_value->var), &(obj->val.var)) == 0) { + obj->error = error_status; + return (1); + } + + return (0); +} + +/* + * Check a PDU received in responce to a SNMP_PDU_GET/SNMP_PDU_GETBULK request + * but don't compare syntaxes - when sending a request PDU they must be null. + * This is a (almost) complete copy of snmp_pdu_check() - with matching syntaxes + * checks and some other checks skiped. + */ +int32_t +snmp_parse_get_resp(struct snmp_pdu *resp, struct snmp_pdu *req) +{ + uint32_t i; + + for (i = 0; i < req->nbindings; i++) { + if (asn_compare_oid(&req->bindings[i].var, + &resp->bindings[i].var) != 0) { + warnx("Bad OID in response"); + return (-1); + } + + if (snmp_client.version != SNMP_V1 && (resp->bindings[i].syntax + == SNMP_SYNTAX_NOSUCHOBJECT || resp->bindings[i].syntax == + SNMP_SYNTAX_NOSUCHINSTANCE)) + return (0); + } + + return (1); +} + +int32_t +snmp_parse_getbulk_resp(struct snmp_pdu *resp, struct snmp_pdu *req) +{ + int32_t N, R, M, r; + + if (req->error_status > (int32_t) resp->nbindings) { + warnx("Bad number of bindings in response"); + return (-1); + } + + for (N = 0; N < req->error_status; N++) { + if (asn_is_suboid(&req->bindings[N].var, + &resp->bindings[N].var) == 0) + return (0); + if (resp->bindings[N].syntax == SNMP_SYNTAX_ENDOFMIBVIEW) + return (0); + } + + for (R = N , r = N; R < (int32_t) req->nbindings; R++) { + for (M = 0; M < req->error_index && (r + M) < + (int32_t) resp->nbindings; M++) { + if (asn_is_suboid(&req->bindings[R].var, + &resp->bindings[r + M].var) == 0) + return (0); + + if (resp->bindings[r + M].syntax == + SNMP_SYNTAX_ENDOFMIBVIEW) { + M++; + break; + } + } + r += M; + } + + return (0); +} + +int32_t +snmp_parse_getnext_resp(struct snmp_pdu *resp, struct snmp_pdu *req) +{ + uint32_t i; + + for (i = 0; i < req->nbindings; i++) { + if (asn_is_suboid(&req->bindings[i].var, &resp->bindings[i].var) + == 0) + return (0); + + if (resp->version != SNMP_V1 && resp->bindings[i].syntax == + SNMP_SYNTAX_ENDOFMIBVIEW) + return (0); + } + + return (1); +} + +/* + * Should be called to check a responce to get/getnext/getbulk. + */ +int32_t +snmp_parse_resp(struct snmp_pdu *resp, struct snmp_pdu *req) +{ + if (resp == NULL || req == NULL) + return (-2); + + if (resp->version != req->version) { + warnx("Response has wrong version"); + return (-1); + } + + if (resp->error_status == SNMP_ERR_NOSUCHNAME) { + warnx("Error - No Such Name"); + return (0); + } + + if (resp->error_status != SNMP_ERR_NOERROR) { + warnx("Error %d in responce", resp->error_status); + return (-1); + } + + if (resp->nbindings != req->nbindings && req->type != SNMP_PDU_GETBULK){ + warnx("Bad number of bindings in response"); + return (-1); + } + + switch (req->type) { + case SNMP_PDU_GET: + return (snmp_parse_get_resp(resp,req)); + case SNMP_PDU_GETBULK: + return (snmp_parse_getbulk_resp(resp,req)); + case SNMP_PDU_GETNEXT: + return (snmp_parse_getnext_resp(resp,req)); + default: + /* NOTREACHED */ + break; + } + + return (-2); +} + +static void +snmp_output_octetstring(struct snmp_toolinfo *snmptoolctx, enum snmp_tc tc, + uint32_t len, uint8_t *octets) +{ + char *buf; + + if (len == 0 || octets == NULL) + return; + + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", + syntax_strings[SNMP_SYNTAX_OCTETSTRING].str); + + if ((buf = snmp_oct2tc(tc, len, (char *) octets)) != NULL) { + fprintf(stdout, "%s", buf); + free(buf); + } +} + +static void +snmp_output_octetindex(struct snmp_toolinfo *snmptoolctx, enum snmp_tc tc, + struct asn_oid *oid) +{ + uint32_t i; + uint8_t *s; + + if ((s = malloc(oid->subs[0] + 1)) == NULL) + syslog(LOG_ERR, "malloc failed - %s", strerror(errno)); + else { + for (i = 0; i < oid->subs[0]; i++) + s[i] = (u_char) (oid->subs[i + 1]); + + snmp_output_octetstring(snmptoolctx, tc, oid->subs[0], s); + free(s); + } +} + +/* + * Check and output syntax type and value. + */ +static void +snmp_output_oid_value(struct snmp_toolinfo *snmptoolctx, struct asn_oid *oid) +{ + char oid_string[ASN_OIDSTRLEN]; + struct snmp_object obj; + + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", syntax_strings[SNMP_SYNTAX_OID].str); + + if(!ISSET_NUMERIC(snmptoolctx)) { + memset(&obj, 0, sizeof(struct snmp_object)); + asn_append_oid(&(obj.val.var), oid); + + if (snmp_lookup_enumstring(snmptoolctx, &obj) > 0) + fprintf(stdout, "%s" , obj.info->string); + else if (snmp_lookup_oidstring(snmptoolctx, &obj) > 0) + fprintf(stdout, "%s" , obj.info->string); + else if (snmp_lookup_nodestring(snmptoolctx, &obj) > 0) + fprintf(stdout, "%s" , obj.info->string); + else { + (void) asn_oid2str_r(oid, oid_string); + fprintf(stdout, "%s", oid_string); + } + } else { + (void) asn_oid2str_r(oid, oid_string); + fprintf(stdout, "%s", oid_string); + } +} + +static void +snmp_output_int(struct snmp_toolinfo *snmptoolctx, struct enum_pairs *enums, + int32_t int_val) +{ + char *string; + + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", + syntax_strings[SNMP_SYNTAX_INTEGER].str); + + if (enums != NULL && (string = enum_string_lookup(enums, int_val)) + != NULL) + fprintf(stdout, "%s", string); + else + fprintf(stdout, "%d", int_val); +} + +static void +snmp_output_ipaddress(struct snmp_toolinfo *snmptoolctx, uint8_t *ip) +{ + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", + syntax_strings[SNMP_SYNTAX_IPADDRESS].str); + + fprintf(stdout, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]); +} + +static void +snmp_output_counter(struct snmp_toolinfo *snmptoolctx, uint32_t counter) +{ + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", + syntax_strings[SNMP_SYNTAX_COUNTER].str); + + fprintf(stdout, "%u", counter); +} + +static void +snmp_output_gauge(struct snmp_toolinfo *snmptoolctx, uint32_t gauge) +{ + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", syntax_strings[SNMP_SYNTAX_GAUGE].str); + + fprintf(stdout, "%u", gauge); +} + +static void +snmp_output_ticks(struct snmp_toolinfo *snmptoolctx, uint32_t ticks) +{ + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", + syntax_strings[SNMP_SYNTAX_TIMETICKS].str); + + fprintf(stdout, "%u", ticks); +} + +static void +snmp_output_counter64(struct snmp_toolinfo *snmptoolctx, uint64_t counter64) +{ + if (GET_OUTPUT(snmptoolctx) == OUTPUT_VERBOSE) + fprintf(stdout, "%s : ", + syntax_strings[SNMP_SYNTAX_COUNTER64].str); + + fprintf(stdout,"%ju", counter64); +} + +int32_t +snmp_output_numval(struct snmp_toolinfo *snmptoolctx, struct snmp_value *val, + struct snmp_oid2str *entry) +{ + if (val == NULL) + return (-1); + + if (GET_OUTPUT(snmptoolctx) != OUTPUT_QUIET) + fprintf(stdout, " = "); + + switch (val->syntax) { + case SNMP_SYNTAX_INTEGER: + if (entry != NULL) + snmp_output_int(snmptoolctx, entry->snmp_enum, + val->v.integer); + else + snmp_output_int(snmptoolctx, NULL, val->v.integer); + break; + + case SNMP_SYNTAX_OCTETSTRING: + if (entry != NULL) + snmp_output_octetstring(snmptoolctx, entry->tc, + val->v.octetstring.len, val->v.octetstring.octets); + else + snmp_output_octetstring(snmptoolctx, SNMP_STRING, + val->v.octetstring.len, val->v.octetstring.octets); + break; + + case SNMP_SYNTAX_OID: + snmp_output_oid_value(snmptoolctx, &(val->v.oid)); + break; + + case SNMP_SYNTAX_IPADDRESS: + snmp_output_ipaddress(snmptoolctx, val->v.ipaddress); + break; + + case SNMP_SYNTAX_COUNTER: + snmp_output_counter(snmptoolctx, val->v.uint32); + break; + + case SNMP_SYNTAX_GAUGE: + snmp_output_gauge(snmptoolctx, val->v.uint32); + break; + + case SNMP_SYNTAX_TIMETICKS: + snmp_output_ticks(snmptoolctx, val->v.uint32); + break; + + case SNMP_SYNTAX_COUNTER64: + snmp_output_counter64(snmptoolctx, val->v.counter64); + break; + + case SNMP_SYNTAX_NOSUCHOBJECT: + fprintf(stdout, "No Such Object\n"); + return (val->syntax); + + case SNMP_SYNTAX_NOSUCHINSTANCE: + fprintf(stdout, "No Such Instance\n"); + return (val->syntax); + + case SNMP_SYNTAX_ENDOFMIBVIEW: + fprintf(stdout, "End of Mib View\n"); + return (val->syntax); + + case SNMP_SYNTAX_NULL: + /* NOTREACHED */ + fprintf(stdout, "agent returned NULL Syntax\n"); + return (val->syntax); + + default: + /* NOTREACHED - If here - then all went completely wrong. */ + fprintf(stdout, "agent returned unknown syntax\n"); + return (-1); + } + + fprintf(stdout, "\n"); + + return (0); +} + +static int32_t +snmp_fill_object(struct snmp_toolinfo *snmptoolctx, struct snmp_object *obj, + struct snmp_value *val) +{ + int32_t rc; + asn_subid_t suboid; + + if (obj == NULL || val == NULL) + return (-1); + + if ((suboid = snmp_suboid_pop(&(val->var))) > ASN_MAXID) + return (-1); + + memset(obj, 0, sizeof(struct snmp_object)); + asn_append_oid(&(obj->val.var), &(val->var)); + obj->val.syntax = val->syntax; + + if (obj->val.syntax > 0) + rc = snmp_lookup_leafstring(snmptoolctx, obj); + else + rc = snmp_lookup_nonleaf_string(snmptoolctx, obj); + + (void) snmp_suboid_append(&(val->var), suboid); + (void) snmp_suboid_append(&(obj->val.var), suboid); + + return (rc); +} + +static int32_t +snmp_output_index(struct snmp_toolinfo *snmptoolctx, struct index *stx, + struct asn_oid *oid) +{ + uint8_t ip[4]; + uint32_t bytes = 1; + uint64_t cnt64; + struct asn_oid temp, out; + + if (oid->len < bytes) + return (-1); + + memset(&temp, 0, sizeof(struct asn_oid)); + asn_append_oid(&temp, oid); + + switch (stx->syntax) { + case SNMP_SYNTAX_INTEGER: + snmp_output_int(snmptoolctx, stx->snmp_enum, temp.subs[0]); + break; + + case SNMP_SYNTAX_OCTETSTRING: + if ((temp.subs[0] > temp.len -1 ) || (temp.subs[0] > + ASN_MAXOCTETSTRING)) + return (-1); + snmp_output_octetindex(snmptoolctx, stx->tc, &temp); + bytes += temp.subs[0]; + break; + + case SNMP_SYNTAX_OID: + if ((temp.subs[0] > temp.len -1) || (temp.subs[0] > + ASN_MAXOIDLEN)) + return (-1); + + bytes += temp.subs[0]; + memset(&out, 0, sizeof(struct asn_oid)); + asn_slice_oid(&out, &temp, 1, bytes); + snmp_output_oid_value(snmptoolctx, &out); + break; + + case SNMP_SYNTAX_IPADDRESS: + if (temp.len < 4) + return (-1); + for (bytes = 0; bytes < 4; bytes++) + ip[bytes] = temp.subs[bytes]; + + snmp_output_ipaddress(snmptoolctx, ip); + bytes = 4; + break; + + case SNMP_SYNTAX_COUNTER: + snmp_output_counter(snmptoolctx, temp.subs[0]); + break; + + case SNMP_SYNTAX_GAUGE: + snmp_output_gauge(snmptoolctx, temp.subs[0]); + break; + + case SNMP_SYNTAX_TIMETICKS: + snmp_output_ticks(snmptoolctx, temp.subs[0]); + break; + + case SNMP_SYNTAX_COUNTER64: + if (oid->len < 2) + return (-1); + bytes = 2; + memcpy(&cnt64, temp.subs, bytes); + snmp_output_counter64(snmptoolctx, cnt64); + break; + + default: + return (-1); + } + + return (bytes); +} + +static int32_t +snmp_output_object(struct snmp_toolinfo *snmptoolctx, struct snmp_object *o) +{ + int32_t i, first, len; + struct asn_oid oid; + struct index *temp; + + if (ISSET_NUMERIC(snmptoolctx)) + return (-1); + + if (o->info->table_idx == NULL) { + fprintf(stdout,"%s.%d", o->info->string, + o->val.var.subs[o->val.var.len - 1]); + return (1); + } + + fprintf(stdout,"%s[", o->info->string); + memset(&oid, 0, sizeof(struct asn_oid)); + + len = 1; + asn_slice_oid(&oid, &(o->val.var), (o->info->table_idx->var.len + len), + o->val.var.len); + + first = 1; + STAILQ_FOREACH(temp, &(OBJECT_IDX_LIST(o)), link) { + if(first) + first = 0; + else + fprintf(stdout, ", "); + if ((i = snmp_output_index(snmptoolctx, temp, &oid)) < 0) + break; + len += i; + memset(&oid, 0, sizeof(struct asn_oid)); + asn_slice_oid(&oid, &(o->val.var), + (o->info->table_idx->var.len + len), o->val.var.len + 1); + } + + fprintf(stdout,"]"); + return (1); +} + +void +snmp_output_err_resp(struct snmp_toolinfo *snmptoolctx, struct snmp_pdu *pdu) +{ + char buf[ASN_OIDSTRLEN]; + struct snmp_object object; + + if (pdu == NULL || (pdu->error_index > (int32_t) pdu->nbindings)) { + fprintf(stdout,"Invalid error index in PDU\n"); + return; + } + + fprintf(stdout, "Agent %s:%s returned error \n", snmp_client.chost, + snmp_client.cport); + + if (!ISSET_NUMERIC(snmptoolctx) && (snmp_fill_object(snmptoolctx, &object, + &(pdu->bindings[pdu->error_index - 1])) > 0)) + snmp_output_object(snmptoolctx, &object); + else { + asn_oid2str_r(&(pdu->bindings[pdu->error_index - 1].var), buf); + fprintf(stdout,"%s", buf); + } + + fprintf(stdout," caused error - "); + if ((pdu->error_status > 0) && (pdu->error_status <= + SNMP_ERR_INCONS_NAME)) + fprintf(stdout, "%s\n", error_strings[pdu->error_status].str); + else + fprintf(stdout,"%s\n", error_strings[SNMP_ERR_UNKNOWN].str); +} + +int32_t +snmp_output_resp(struct snmp_toolinfo *snmptoolctx, struct snmp_pdu *pdu) +{ + int32_t error; + char p[ASN_OIDSTRLEN]; + uint32_t i; + struct snmp_object object; + + for (i = 0, error = 0; i < pdu->nbindings; i++) { + if (GET_OUTPUT(snmptoolctx) != OUTPUT_QUIET) { + if (!ISSET_NUMERIC(snmptoolctx) && + (snmp_fill_object(snmptoolctx, &object, + &(pdu->bindings[i])) > 0)) + snmp_output_object(snmptoolctx, &object); + else { + asn_oid2str_r(&(pdu->bindings[i].var), p); + fprintf(stdout, "%s", p); + } + } + error |= snmp_output_numval(snmptoolctx, &(pdu->bindings[i]), object.info); + } + + return (error); +} + +void +snmp_output_engine(void) +{ + uint32_t i; + char *cptr, engine[2 * SNMP_ENGINE_ID_SIZ + 2]; + + cptr = engine; + for (i = 0; i < snmp_client.engine.engine_len; i++) + cptr += sprintf(cptr, "%.2x", snmp_client.engine.engine_id[i]); + *cptr++ = '\0'; + + fprintf(stdout, "Engine ID 0x%s\n", engine); + fprintf(stdout, "Boots : %u\t\tTime : %d\n", + snmp_client.engine.engine_boots, + snmp_client.engine.engine_time); +} + +void +snmp_output_keys(void) +{ + uint32_t i, keylen = 0; + char *cptr, extkey[2 * SNMP_AUTH_KEY_SIZ + 2]; + + fprintf(stdout, "Localized keys for %s\n", snmp_client.user.sec_name); + if (snmp_client.user.auth_proto == SNMP_AUTH_HMAC_MD5) { + fprintf(stdout, "MD5 : 0x"); + keylen = SNMP_AUTH_HMACMD5_KEY_SIZ; + } else if (snmp_client.user.auth_proto == SNMP_AUTH_HMAC_SHA) { + fprintf(stdout, "SHA : 0x"); + keylen = SNMP_AUTH_HMACSHA_KEY_SIZ; + } + if (snmp_client.user.auth_proto != SNMP_AUTH_NOAUTH) { + cptr = extkey; + for (i = 0; i < keylen; i++) + cptr += sprintf(cptr, "%.2x", + snmp_client.user.auth_key[i]); + *cptr++ = '\0'; + fprintf(stdout, "%s\n", extkey); + } + + if (snmp_client.user.priv_proto == SNMP_PRIV_DES) { + fprintf(stdout, "DES : 0x"); + keylen = SNMP_PRIV_DES_KEY_SIZ; + } else if (snmp_client.user.priv_proto == SNMP_PRIV_AES) { + fprintf(stdout, "AES : 0x"); + keylen = SNMP_PRIV_AES_KEY_SIZ; + } + if (snmp_client.user.priv_proto != SNMP_PRIV_NOPRIV) { + cptr = extkey; + for (i = 0; i < keylen; i++) + cptr += sprintf(cptr, "%.2x", + snmp_client.user.priv_key[i]); + *cptr++ = '\0'; + fprintf(stdout, "%s\n", extkey); + } +} diff --git a/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.h b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.h new file mode 100644 index 0000000..6e62186 --- /dev/null +++ b/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.h @@ -0,0 +1,331 @@ +/*- + * Copyright (c) 2005-2006 The FreeBSD Project + * All rights reserved. + * + * Author: Shteryana Shopova + * + * Redistribution of this software and documentation and use in source and + * binary forms, with or without modification, are permitted provided that + * the following conditions are met: + * + * 1. Redistributions of source code or documentation must retain the above + * copyright notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Helper functions common for all tools. + * + * $FreeBSD$ + */ + +#ifndef _BSNMP_TOOLS_H_ +#define _BSNMP_TOOLS_H_ + +/* From asn1.h + 1 byte for trailing zero. */ +#define MAX_OCTSTRING_LEN ASN_MAXOCTETSTRING + 1 +#define MAX_CMD_SYNTAX_LEN 12 + +/* Arbitrary upper limit on node names and function names - gensnmptree.c. */ +#define MAXSTR 1000 + +/* Should be enough to fetch the biggest allowed octet string. */ +#define MAX_BUFF_SIZE (ASN_MAXOCTETSTRING + 50) + +#define SNMP_DEFS_DIR "/usr/share/snmp/defs/" +#define SNMP_DEFAULT_LOCAL "/var/run/snmpd.sock" + +enum snmp_access { + SNMP_ACCESS_NONE = 0, + SNMP_ACCESS_GET, + SNMP_ACCESS_SET, + SNMP_ACCESS_GETSET, +}; + +/* A structure for integer-string enumerations. */ +struct enum_pair { + int32_t enum_val; + char *enum_str; + STAILQ_ENTRY(enum_pair) link; +}; + +STAILQ_HEAD(enum_pairs, enum_pair); + +struct enum_type { + char *name; + uint32_t syntax; + int32_t is_enum; + int32_t is_bits; + struct enum_pairs *snmp_enum; + SLIST_ENTRY(enum_type) link; +}; + +SLIST_HEAD(snmp_enum_tc, enum_type); + +struct index { + enum snmp_tc tc; + enum snmp_syntax syntax; + struct enum_pairs *snmp_enum; + STAILQ_ENTRY(index) link; +}; + +STAILQ_HEAD(snmp_idxlist, index); + +struct snmp_index_entry { + char *string; + uint32_t strlen; + struct asn_oid var; + struct snmp_idxlist index_list; + SLIST_ENTRY(snmp_index_entry) link; +}; + +/* Information needed for oid to string conversion. */ +struct snmp_oid2str { + char *string; + uint32_t strlen; + enum snmp_tc tc; + enum snmp_syntax syntax; + enum snmp_access access; + struct asn_oid var; + /* A pointer to a entry from the table list - OK if NULL. */ + struct snmp_index_entry *table_idx; + /* + * A singly-linked tail queue of all (int, string) pairs - + * for INTEGER syntax only. + */ + struct enum_pairs *snmp_enum; + SLIST_ENTRY(snmp_oid2str) link; +}; + +/* A structure to hold each oid input by user. */ +struct snmp_object { + /* Flag - if set, the variable caused error in a previous request. */ + int32_t error; + /* + * A pointer in the mapping lists - not used if OIDs are input as + * numericals. + */ + struct snmp_oid2str *info; + /* A snmp value to hold the actual oid, syntax and value. */ + struct snmp_value val; + SLIST_ENTRY(snmp_object) link; +}; + +struct fname { + char *name; + int32_t done; + struct asn_oid cut; + SLIST_ENTRY(fname) link; +}; + +SLIST_HEAD(snmp_mapping, snmp_oid2str); +SLIST_HEAD(fname_list, fname); +SLIST_HEAD(snmp_table_index, snmp_index_entry); + +/* + * Keep a list for every syntax type. + */ +struct snmp_mappings { + /* The list containing all non-leaf nodes. */ + struct snmp_mapping nodelist; + /* INTEGER/INTEGER32 types. */ + struct snmp_mapping intlist; + /* OCTETSTRING types. */ + struct snmp_mapping octlist; + /* OID types. */ + struct snmp_mapping oidlist; + /* IPADDRESS types. */ + struct snmp_mapping iplist; + /* TIMETICKS types. */ + struct snmp_mapping ticklist; + /* COUNTER types. */ + struct snmp_mapping cntlist; + /* GAUGE types. */ + struct snmp_mapping gaugelist; + /* COUNTER64 types. */ + struct snmp_mapping cnt64list; + /* ENUM values for oid types. */ + struct snmp_mapping enumlist; + /* Description of all table entry types. */ + struct snmp_table_index tablelist; + /* Defined enumerated textual conventions. */ + struct snmp_enum_tc tclist; +}; + +struct snmp_toolinfo { + uint32_t flags; + /* Number of initially input OIDs. */ + int32_t objects; + /* List of all input OIDs. */ + SLIST_HEAD(snmp_objectlist, snmp_object) snmp_objectlist; + /* All known OID to string mapping data. */ + struct snmp_mappings *mappings; + /* A list of .defs filenames to search oid<->string mapping. */ + struct fname_list filelist; + /* SNMPv3 USM user credentials */ + char *passwd; +}; + +/* XXX we might want to get away with this and will need to touch + * XXX the MACROS then too */ +extern struct snmp_toolinfo snmptool; + +/* Definitions for some flags' bits. */ +#define OUTPUT_BITS 0x00000003 /* bits 0-1 for output type */ +#define NUMERIC_BIT 0x00000004 /* bit 2 for numeric oids */ +#define RETRY_BIT 0x00000008 /* bit 3 for retry on error responce */ +#define ERRIGNORE_BIT 0x00000010 /* bit 4 for skip sanity checking */ +#define ERRIGNORE_BIT 0x00000010 /* bit 4 for skip sanity checking */ +#define EDISCOVER_BIT 0x00000020 /* bit 5 for SNMP Engine Discovery */ +#define LOCALKEY_BIT 0x00000040 /* bit 6 for using localized key */ + /* 0x00000080 */ /* bit 7 reserverd */ +#define PDUTYPE_BITS 0x00000f00 /* bits 8-11 for pdu type */ + /* 0x0000f000 */ /* bit 12-15 reserverd */ +#define MAXREP_BITS 0x00ff0000 /* bits 16-23 for max-repetit. value */ +#define NONREP_BITS 0xff000000 /* bits 24-31 for non-repeaters value */ + +#define OUTPUT_SHORT 0x0 +#define OUTPUT_VERBOSE 0x1 +#define OUTPUT_TABULAR 0x2 +#define OUTPUT_QUIET 0x3 + +/* Macros for playing with flags' bits. */ +#define SET_OUTPUT(ctx, type) ((ctx)->flags |= ((type) & OUTPUT_BITS)) +#define GET_OUTPUT(ctx) ((ctx)->flags & OUTPUT_BITS) + +#define SET_NUMERIC(ctx) ((ctx)->flags |= NUMERIC_BIT) +#define ISSET_NUMERIC(ctx) ((ctx)->flags & NUMERIC_BIT) + +#define SET_RETRY(ctx) ((ctx)->flags |= RETRY_BIT) +#define ISSET_RETRY(ctx) ((ctx)->flags & RETRY_BIT) + +#define SET_ERRIGNORE(ctx) ((ctx)->flags |= ERRIGNORE_BIT) +#define ISSET_ERRIGNORE(ctx) ((ctx)->flags & ERRIGNORE_BIT) + +#define SET_EDISCOVER(ctx) ((ctx)->flags |= EDISCOVER_BIT) +#define ISSET_EDISCOVER(ctx) ((ctx)->flags & EDISCOVER_BIT) + +#define SET_LOCALKEY(ctx) ((ctx)->flags |= LOCALKEY_BIT) +#define ISSET_LOCALKEY(ctx) ((ctx)->flags & LOCALKEY_BIT) + +#define SET_PDUTYPE(ctx, type) (((ctx)->flags |= (((type) & 0xf) << 8))) +#define GET_PDUTYPE(ctx) (((ctx)->flags & PDUTYPE_BITS) >> 8) + +#define SET_MAXREP(ctx, i) (((ctx)->flags |= (((i) & 0xff) << 16))) +#define GET_MAXREP(ctx) (((ctx)->flags & MAXREP_BITS) >> 16) + +#define SET_NONREP(ctx, i) (((ctx)->flags |= (((i) & 0xff) << 24))) +#define GET_NONREP(ctx) (((ctx)->flags & NONREP_BITS) >> 24) + + +extern const struct asn_oid IsoOrgDod_OID; + +int snmptool_init(struct snmp_toolinfo *); +int32_t snmp_import_file(struct snmp_toolinfo *, struct fname *); +int32_t snmp_import_all(struct snmp_toolinfo *); +int32_t add_filename(struct snmp_toolinfo *, const char *, + const struct asn_oid *, int32_t); +void free_filelist(struct snmp_toolinfo *); +void snmp_tool_freeall(struct snmp_toolinfo *); +void snmp_import_dump(int); + +/* bsnmpmap.c */ +struct snmp_mappings *snmp_mapping_init(void); +int32_t snmp_mapping_free(struct snmp_toolinfo *); +void snmp_index_listfree(struct snmp_idxlist *); +void snmp_dump_oid2str(struct snmp_oid2str *); +int32_t snmp_node_insert(struct snmp_toolinfo *, struct snmp_oid2str *); +int32_t snmp_leaf_insert(struct snmp_toolinfo *, struct snmp_oid2str *); +int32_t snmp_enum_insert(struct snmp_toolinfo *, struct snmp_oid2str *); +struct enum_pairs *enum_pairs_init(void); +void enum_pairs_free(struct enum_pairs *); +void snmp_mapping_entryfree(struct snmp_oid2str *); +int32_t enum_pair_insert(struct enum_pairs *, int32_t, char *); +char *enum_string_lookup(struct enum_pairs *, int32_t); +int32_t enum_number_lookup(struct enum_pairs *, char *); +int32_t snmp_syntax_insert(struct snmp_idxlist *, struct enum_pairs *, + enum snmp_syntax, enum snmp_tc); +int32_t snmp_table_insert(struct snmp_toolinfo *, struct snmp_index_entry *); + +struct enum_type *snmp_enumtc_init(char *); +void snmp_enumtc_free(struct enum_type *); +void snmp_enumtc_insert(struct snmp_toolinfo *, struct enum_type *); +struct enum_type *snmp_enumtc_lookup(struct snmp_toolinfo *, char *); + +void snmp_mapping_dump(struct snmp_toolinfo *); +int32_t snmp_lookup_leafstring(struct snmp_toolinfo *, struct snmp_object *); +int32_t snmp_lookup_enumstring(struct snmp_toolinfo *, struct snmp_object *); +int32_t snmp_lookup_oidstring(struct snmp_toolinfo *, struct snmp_object *); +int32_t snmp_lookup_nonleaf_string(struct snmp_toolinfo *, struct snmp_object *); +int32_t snmp_lookup_allstring(struct snmp_toolinfo *, struct snmp_object *); +int32_t snmp_lookup_nodestring(struct snmp_toolinfo *, struct snmp_object *); +int32_t snmp_lookup_oidall(struct snmp_toolinfo *, struct snmp_object *, char *); +int32_t snmp_lookup_enumoid(struct snmp_toolinfo *, struct snmp_object *, char *); +int32_t snmp_lookup_oid(struct snmp_toolinfo *, struct snmp_object *, char *); + +/* Functions parsing common options for all tools. */ +int32_t parse_server(char *); +int32_t parse_timeout(char *); +int32_t parse_retry(char *); +int32_t parse_version(char *); +int32_t parse_local_path(char *); +int32_t parse_buflen(char *); +int32_t parse_debug(void); +int32_t parse_discovery(struct snmp_toolinfo *); +int32_t parse_local_key(struct snmp_toolinfo *); +int32_t parse_num_oids(struct snmp_toolinfo *); +int32_t parse_file(struct snmp_toolinfo *, char *); +int32_t parse_include(struct snmp_toolinfo *, char *); +int32_t parse_output(struct snmp_toolinfo *, char *); +int32_t parse_errors(struct snmp_toolinfo *); +int32_t parse_skip_access(struct snmp_toolinfo *); +int32_t parse_authentication(struct snmp_toolinfo *, char *); +int32_t parse_privacy(struct snmp_toolinfo *, char *); +int32_t parse_context(struct snmp_toolinfo *, char *); +int32_t parse_user_security(struct snmp_toolinfo *, char *); + +typedef int32_t (*snmp_verify_inoid_f) (struct snmp_toolinfo *, + struct snmp_object *, char *); +int32_t snmp_object_add(struct snmp_toolinfo *, snmp_verify_inoid_f, char *); +int32_t snmp_object_remove(struct snmp_toolinfo *, struct asn_oid *oid); +int32_t snmp_object_seterror(struct snmp_toolinfo *, struct snmp_value *, + int32_t); + +enum snmp_syntax parse_syntax(char *); +char *snmp_parse_suboid(char *, struct asn_oid *); +char *snmp_parse_index(struct snmp_toolinfo *, char *, struct snmp_object *); +int32_t snmp_parse_numoid(char *, struct asn_oid *); +int32_t snmp_suboid_append(struct asn_oid *, asn_subid_t); +int32_t snmp_suboid_pop(struct asn_oid *); + +typedef int32_t (*snmp_verify_vbind_f) (struct snmp_toolinfo *, + struct snmp_pdu *, struct snmp_object *); +typedef int32_t (*snmp_add_vbind_f) (struct snmp_pdu *, struct snmp_object *); +int32_t snmp_pdu_add_bindings(struct snmp_toolinfo *, snmp_verify_vbind_f, + snmp_add_vbind_f, struct snmp_pdu *, int32_t); + +int32_t snmp_parse_get_resp(struct snmp_pdu *, struct snmp_pdu *); +int32_t snmp_parse_getbulk_resp(struct snmp_pdu *, struct snmp_pdu *); +int32_t snmp_parse_getnext_resp(struct snmp_pdu *, struct snmp_pdu *); +int32_t snmp_parse_resp(struct snmp_pdu *, struct snmp_pdu *); +int32_t snmp_output_numval(struct snmp_toolinfo *, struct snmp_value *, + struct snmp_oid2str *); +void snmp_output_val(struct snmp_value *); +int32_t snmp_output_resp(struct snmp_toolinfo *, struct snmp_pdu *); +void snmp_output_err_resp(struct snmp_toolinfo *, struct snmp_pdu *); +void snmp_output_engine(void); +void snmp_output_keys(void); + +#endif /* _BSNMP_TOOLS_H_ */ -- cgit v1.1 From e3d05d082124749ee3469333490395307a0f16c2 Mon Sep 17 00:00:00 2001 From: glebius Date: Wed, 8 Dec 2010 15:10:27 +0000 Subject: Add RTM_IEEE80211 to array of route message descriptions. PR: 151664 Submitted by: Alexey Illarionov --- sbin/route/route.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sbin/route/route.c b/sbin/route/route.c index f0bb07b..d38eafc 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -1306,6 +1306,7 @@ const char *msgtypes[] = { "RTM_NEWMADDR: new multicast group membership on iface", "RTM_DELMADDR: multicast group membership removed from iface", "RTM_IFANNOUNCE: interface arrival/departure", + "RTM_IEEE80211: IEEE 802.11 wireless event", 0, }; -- cgit v1.1 From 8c8a1240cf3758dcb4b3e2ce20b68150406f0aaa Mon Sep 17 00:00:00 2001 From: glebius Date: Wed, 8 Dec 2010 15:12:37 +0000 Subject: - Fix array bounds checking. [1] - Add message length checking. PR: 151664 [1] Submitted by: Alexey Illarionov [1] Reviewed by: yar --- sbin/route/route.c | 59 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/sbin/route/route.c b/sbin/route/route.c index d38eafc..49d14dd 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -115,11 +115,11 @@ static void mask_addr(void); static void monitor(void); static const char *netname(struct sockaddr *); static void newroute(int, char **); -static void pmsg_addrs(char *, int); -static void pmsg_common(struct rt_msghdr *); +static void pmsg_addrs(char *, int, size_t); +static void pmsg_common(struct rt_msghdr *, size_t); static int prefixlen(const char *); static void print_getmsg(struct rt_msghdr *, int); -static void print_rtmsg(struct rt_msghdr *, int); +static void print_rtmsg(struct rt_msghdr *, size_t); static const char *routename(struct sockaddr *); static int rtmsg(int, int); static void set_metric(char *, int); @@ -1307,7 +1307,6 @@ const char *msgtypes[] = { "RTM_DELMADDR: multicast group membership removed from iface", "RTM_IFANNOUNCE: interface arrival/departure", "RTM_IEEE80211: IEEE 802.11 wireless event", - 0, }; char metricnames[] = @@ -1325,8 +1324,11 @@ char ifnetflags[] = char addrnames[] = "\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD"; +static const char errfmt[] = +"\n%s: truncated route message, only %zu bytes left\n"; + static void -print_rtmsg(struct rt_msghdr *rtm, int msglen __unused) +print_rtmsg(struct rt_msghdr *rtm, size_t msglen) { struct if_msghdr *ifm; struct ifa_msghdr *ifam; @@ -1343,13 +1345,22 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen __unused) rtm->rtm_version); return; } - if (msgtypes[rtm->rtm_type] != NULL) + if (rtm->rtm_type < sizeof(msgtypes) / sizeof(msgtypes[0])) (void)printf("%s: ", msgtypes[rtm->rtm_type]); else - (void)printf("#%d: ", rtm->rtm_type); + (void)printf("unknown type %d: ", rtm->rtm_type); (void)printf("len %d, ", rtm->rtm_msglen); + +#define REQUIRE(x) do { \ + if (msglen < sizeof(x)) \ + goto badlen; \ + else \ + msglen -= sizeof(x); \ + } while (0) + switch (rtm->rtm_type) { case RTM_IFINFO: + REQUIRE(struct if_msghdr); ifm = (struct if_msghdr *)rtm; (void) printf("if# %d, ", ifm->ifm_index); switch (ifm->ifm_data.ifi_link_state) { @@ -1365,23 +1376,26 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen __unused) } (void) printf("link: %s, flags:", state); bprintf(stdout, ifm->ifm_flags, ifnetflags); - pmsg_addrs((char *)(ifm + 1), ifm->ifm_addrs); + pmsg_addrs((char *)(ifm + 1), ifm->ifm_addrs, msglen); break; case RTM_NEWADDR: case RTM_DELADDR: + REQUIRE(struct ifa_msghdr); ifam = (struct ifa_msghdr *)rtm; (void) printf("metric %d, flags:", ifam->ifam_metric); bprintf(stdout, ifam->ifam_flags, routeflags); - pmsg_addrs((char *)(ifam + 1), ifam->ifam_addrs); + pmsg_addrs((char *)(ifam + 1), ifam->ifam_addrs, msglen); break; #ifdef RTM_NEWMADDR case RTM_NEWMADDR: case RTM_DELMADDR: + REQUIRE(struct ifma_msghdr); ifmam = (struct ifma_msghdr *)rtm; - pmsg_addrs((char *)(ifmam + 1), ifmam->ifmam_addrs); + pmsg_addrs((char *)(ifmam + 1), ifmam->ifmam_addrs, msglen); break; #endif case RTM_IFANNOUNCE: + REQUIRE(struct if_announcemsghdr); ifan = (struct if_announcemsghdr *)rtm; (void) printf("if# %d, what: ", ifan->ifan_index); switch (ifan->ifan_what) { @@ -1402,8 +1416,14 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen __unused) (void) printf("pid: %ld, seq %d, errno %d, flags:", (long)rtm->rtm_pid, rtm->rtm_seq, rtm->rtm_errno); bprintf(stdout, rtm->rtm_flags, routeflags); - pmsg_common(rtm); + pmsg_common(rtm, msglen); } + + return; + +badlen: + (void)printf(errfmt, __func__, msglen); +#undef REQUIRE } static void @@ -1491,7 +1511,7 @@ print_getmsg(struct rt_msghdr *rtm, int msglen) #undef msec #define RTA_IGN (RTA_DST|RTA_GATEWAY|RTA_NETMASK|RTA_IFP|RTA_IFA|RTA_BRD) if (verbose) - pmsg_common(rtm); + pmsg_common(rtm, msglen); else if (rtm->rtm_addrs &~ RTA_IGN) { (void) printf("sockaddrs: "); bprintf(stdout, rtm->rtm_addrs, addrnames); @@ -1501,17 +1521,21 @@ print_getmsg(struct rt_msghdr *rtm, int msglen) } static void -pmsg_common(struct rt_msghdr *rtm) +pmsg_common(struct rt_msghdr *rtm, size_t msglen) { (void) printf("\nlocks: "); bprintf(stdout, rtm->rtm_rmx.rmx_locks, metricnames); (void) printf(" inits: "); bprintf(stdout, rtm->rtm_inits, metricnames); - pmsg_addrs(((char *)(rtm + 1)), rtm->rtm_addrs); + if (msglen > sizeof(struct rt_msghdr)) + pmsg_addrs(((char *)(rtm + 1)), rtm->rtm_addrs, + msglen - sizeof(struct rt_msghdr)); + else + (void) fflush(stdout); } static void -pmsg_addrs(char *cp, int addrs) +pmsg_addrs(char *cp, int addrs, size_t len) { struct sockaddr *sa; int i; @@ -1526,7 +1550,12 @@ pmsg_addrs(char *cp, int addrs) for (i = 1; i != 0; i <<= 1) if (i & addrs) { sa = (struct sockaddr *)cp; + if (len == 0 || len < SA_SIZE(sa)) { + (void) printf(errfmt, __func__, len); + break; + } (void) printf(" %s", routename(sa)); + len -= SA_SIZE(sa); cp += SA_SIZE(sa); } (void) putchar('\n'); -- cgit v1.1 From 0da648deac429493c60c6221c407d38603d7a382 Mon Sep 17 00:00:00 2001 From: attilio Date: Wed, 8 Dec 2010 15:32:54 +0000 Subject: Use convenience macro for minimum and maximum value capping when re-arming the watchdog timeout. Sponsored by: Sandvine Incorporated Submitted by: Mark Johnston Reviewed by: des MFC after: 10 days --- sys/dev/ichwd/ichwd.c | 23 ++++++++--------------- sys/dev/ichwd/ichwd.h | 11 +++++++++++ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/sys/dev/ichwd/ichwd.c b/sys/dev/ichwd/ichwd.c index 83ce5a7..c64468a 100644 --- a/sys/dev/ichwd/ichwd.c +++ b/sys/dev/ichwd/ichwd.c @@ -288,30 +288,23 @@ static __inline void ichwd_tmr_set(struct ichwd_softc *sc, unsigned int timeout) { - /* - * If the datasheets are to be believed, the minimum value - * actually varies from chipset to chipset - 4 for ICH5 and 2 for - * all other chipsets. I suspect this is a bug in the ICH5 - * datasheet and that the minimum is uniformly 2, but I'd rather - * err on the side of caution. - */ - if (timeout < 4) - timeout = 4; + if (timeout < TCO_RLD_TMR_MIN) + timeout = TCO_RLD_TMR_MIN; if (sc->ich_version <= 5) { uint8_t tmr_val8 = ichwd_read_tco_1(sc, TCO_TMR1); - tmr_val8 &= 0xc0; - if (timeout > 0x3f) - timeout = 0x3f; + tmr_val8 &= (~TCO_RLD1_TMR_MAX & 0xff); + if (timeout > TCO_RLD1_TMR_MAX) + timeout = TCO_RLD1_TMR_MAX; tmr_val8 |= timeout; ichwd_write_tco_1(sc, TCO_TMR1, tmr_val8); } else { uint16_t tmr_val16 = ichwd_read_tco_2(sc, TCO_TMR2); - tmr_val16 &= 0xfc00; - if (timeout > 0x03ff) - timeout = 0x03ff; + tmr_val16 &= (~TCO_RLD2_TMR_MAX & 0xffff); + if (timeout > TCO_RLD2_TMR_MAX) + timeout = TCO_RLD2_TMR_MAX; tmr_val16 |= timeout; ichwd_write_tco_2(sc, TCO_TMR2, tmr_val16); } diff --git a/sys/dev/ichwd/ichwd.h b/sys/dev/ichwd/ichwd.h index c0a1141..442460b 100644 --- a/sys/dev/ichwd/ichwd.h +++ b/sys/dev/ichwd/ichwd.h @@ -199,6 +199,17 @@ struct ichwd_softc { #define TCO_TMR_HALT 0x0800 /* clear to enable WDT */ #define TCO_CNT_PRESERVE 0x0200 /* preserve these bits */ +/* + * Masks for the TCO timer value field in TCO_RLD. + * If the datasheets are to be believed, the minimum value actually varies + * from chipset to chipset - 4 for ICH5 and 2 for all other chipsets. + * I suspect this is a bug in the ICH5 datasheet and that the minimum is + * uniformly 2, but I'd rather err on the side of caution. + */ +#define TCO_RLD_TMR_MIN 0x0004 +#define TCO_RLD1_TMR_MAX 0x003f +#define TCO_RLD2_TMR_MAX 0x03ff + /* approximate length in nanoseconds of one WDT tick (about 0.6 sec) */ #define ICHWD_TICK 600000000 -- cgit v1.1 From 69401abe0aeeccf7f8c7b47372cd678170307abe Mon Sep 17 00:00:00 2001 From: syrinx Date: Wed, 8 Dec 2010 15:52:06 +0000 Subject: Add a forgotten file from r216294 and unbreak the build. Sponsored by: The FreeBSD Foundation Reviewed by: philip@ (mostly) Approved by: philip@ --- contrib/bsnmp/lib/snmpcrypto.c | 404 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 contrib/bsnmp/lib/snmpcrypto.c diff --git a/contrib/bsnmp/lib/snmpcrypto.c b/contrib/bsnmp/lib/snmpcrypto.c new file mode 100644 index 0000000..81d8eac --- /dev/null +++ b/contrib/bsnmp/lib/snmpcrypto.c @@ -0,0 +1,404 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Shteryana Sotirova Shopova under + * sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STDINT_H +#include +#elif defined(HAVE_INTTYPES_H) +#include +#endif +#include +#include +#include +#include + +#ifdef HAVE_LIBCRYPTO +#include +#endif + +#include "asn1.h" +#include "snmp.h" +#include "snmppriv.h" + +#define SNMP_PRIV_AES_IV_SIZ 16 +#define SNMP_EXTENDED_KEY_SIZ 64 +#define SNMP_AUTH_KEY_LOOPCNT 1048576 +#define SNMP_AUTH_BUF_SIZE 72 + +static const uint8_t ipad = 0x36; +static const uint8_t opad = 0x5c; + +#ifdef HAVE_LIBCRYPTO + +static int32_t +snmp_digest_init(const struct snmp_user *user, EVP_MD_CTX *ctx, + const EVP_MD **dtype, uint32_t *keylen) +{ + if (user->auth_proto == SNMP_AUTH_HMAC_MD5) { + *dtype = EVP_md5(); + *keylen = SNMP_AUTH_HMACMD5_KEY_SIZ; + } else if (user->auth_proto == SNMP_AUTH_HMAC_SHA) { + *dtype = EVP_sha1(); + *keylen = SNMP_AUTH_HMACSHA_KEY_SIZ; + } else if (user->auth_proto == SNMP_AUTH_NOAUTH) + return (0); + else { + snmp_error("unknown authentication option - %d", + user->auth_proto); + return (-1); + } + + if (EVP_DigestInit(ctx, *dtype) != 1) + return (-1); + + return (1); +} + +enum snmp_code +snmp_pdu_calc_digest(struct asn_buf *b, const struct snmp_pdu *pdu, + uint8_t *digest) +{ + uint8_t md[EVP_MAX_MD_SIZE], extkey[SNMP_EXTENDED_KEY_SIZ]; + uint8_t key1[SNMP_EXTENDED_KEY_SIZ], key2[SNMP_EXTENDED_KEY_SIZ]; + uint32_t i, keylen, olen; + int32_t err; + const EVP_MD *dtype; + EVP_MD_CTX ctx; + + err = snmp_digest_init(&pdu->user, &ctx, &dtype, &keylen); + if (err < 0) + return (SNMP_CODE_BADDIGEST); + else if (err == 0) + return (SNMP_CODE_OK); + + memset(pdu->digest_ptr, 0, sizeof(pdu->msg_digest)); + memcpy(extkey, pdu->user.auth_key, keylen); + memset(extkey + keylen, 0, sizeof(extkey) - keylen); + + for (i = 0; i < SNMP_EXTENDED_KEY_SIZ; i++) { + key1[i] = extkey[i] ^ ipad; + key2[i] = extkey[i] ^ opad; + } + + if (EVP_DigestUpdate(&ctx, key1, SNMP_EXTENDED_KEY_SIZ) != 1 || + EVP_DigestUpdate(&ctx, pdu->outer_ptr, pdu->outer_len) != 1 || + EVP_DigestFinal(&ctx, md, &olen) != 1) + goto failed; + + if (EVP_DigestInit(&ctx, dtype) != 1 || + EVP_DigestUpdate(&ctx, key2, SNMP_EXTENDED_KEY_SIZ) != 1 || + EVP_DigestUpdate(&ctx, md, olen) != 1 || + EVP_DigestFinal(&ctx, md, &olen) != 1) + goto failed; + + if (olen < SNMP_USM_AUTH_SIZE) { + snmp_error("bad digest size - %d", olen); + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_BADDIGEST); + } + + memcpy(digest, md, SNMP_USM_AUTH_SIZE); + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_OK); + +failed: + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_BADDIGEST); +} + +static int32_t +snmp_pdu_cipher_init(const struct snmp_pdu *pdu, int32_t len, + EVP_CIPHER_CTX *ctx, const EVP_CIPHER **ctype, uint8_t *piv) +{ + int i; + uint32_t netint; + + if (pdu->user.priv_proto == SNMP_PRIV_DES) { + if (len % 8 != 0) + return (-1); + *ctype = EVP_des_cbc(); + memcpy(piv, pdu->msg_salt, sizeof(pdu->msg_salt)); + for (i = 0; i < 8; i++) + piv[i] = piv[i] ^ pdu->user.priv_key[8 + i]; + } else if (pdu->user.priv_proto == SNMP_PRIV_AES) { + *ctype = EVP_aes_128_cfb128(); + netint = htonl(pdu->engine.engine_boots); + memcpy(piv, &netint, sizeof(netint)); + piv += sizeof(netint); + netint = htonl(pdu->engine.engine_time); + memcpy(piv, &netint, sizeof(netint)); + piv += sizeof(netint); + memcpy(piv, pdu->msg_salt, sizeof(pdu->msg_salt)); + } else if (pdu->user.priv_proto == SNMP_PRIV_NOPRIV) + return (0); + else { + snmp_error("unknown privacy option - %d", pdu->user.priv_proto); + return (-1); + } + + return (1); +} + +enum snmp_code +snmp_pdu_encrypt(struct asn_buf *b, const struct snmp_pdu *pdu) +{ + int32_t err, olen; + uint8_t iv[SNMP_PRIV_AES_IV_SIZ]; + const EVP_CIPHER *ctype; + EVP_CIPHER_CTX ctx; + + err = snmp_pdu_cipher_init(pdu, pdu->scoped_len, &ctx, &ctype, iv); + if (err < 0) + return (SNMP_CODE_EDECRYPT); + else if (err == 0) + return (SNMP_CODE_OK); + + if (EVP_EncryptInit(&ctx, ctype, pdu->user.priv_key, iv) != 1) + return (SNMP_CODE_FAILED); + + if (EVP_EncryptUpdate(&ctx, pdu->scoped_ptr, &olen, pdu->scoped_ptr, + pdu->scoped_len) != 1 || + EVP_EncryptFinal(&ctx, pdu->scoped_ptr + olen, &olen) != 1) { + EVP_CIPHER_CTX_cleanup(&ctx); + return (SNMP_CODE_FAILED); + } + + EVP_CIPHER_CTX_cleanup(&ctx); + return (SNMP_CODE_OK); +} + +enum snmp_code +snmp_pdu_decrypt(struct asn_buf *b, const struct snmp_pdu *pdu) +{ + int32_t err, olen; + uint8_t iv[SNMP_PRIV_AES_IV_SIZ]; + const EVP_CIPHER *ctype; + EVP_CIPHER_CTX ctx; + + err = snmp_pdu_cipher_init(pdu, pdu->scoped_len, &ctx, &ctype, iv); + if (err < 0) + return (SNMP_CODE_EDECRYPT); + else if (err == 0) + return (SNMP_CODE_OK); + + if (EVP_DecryptInit(&ctx, ctype, pdu->user.priv_key, iv) != 1 || + EVP_CIPHER_CTX_set_padding(&ctx, 0) != 1) + return (SNMP_CODE_EDECRYPT); + + if (EVP_DecryptUpdate(&ctx, pdu->scoped_ptr, &olen, pdu->scoped_ptr, + pdu->scoped_len) != 1 || + EVP_DecryptFinal(&ctx, pdu->scoped_ptr + olen, &olen) != 1) { + EVP_CIPHER_CTX_cleanup(&ctx); + return (SNMP_CODE_EDECRYPT); + } + + EVP_CIPHER_CTX_cleanup(&ctx); + return (SNMP_CODE_OK); +} + +/* [RFC 3414] - A.2. Password to Key Algorithm */ +enum snmp_code +snmp_passwd_to_keys(struct snmp_user *user, char *passwd) +{ + int err, loop, i, pwdlen; + uint32_t keylen, olen; + const EVP_MD *dtype; + EVP_MD_CTX ctx; + uint8_t authbuf[SNMP_AUTH_BUF_SIZE]; + + if (passwd == NULL || user == NULL) + return (SNMP_CODE_FAILED); + + err = snmp_digest_init(user, &ctx, &dtype, &keylen); + if (err < 0) + return (SNMP_CODE_BADDIGEST); + else if (err == 0) + return (SNMP_CODE_OK); + + memset(user->auth_key, 0, sizeof(user->auth_key)); + pwdlen = strlen(passwd); + + for (loop = 0; loop < SNMP_AUTH_KEY_LOOPCNT; loop += i) { + for (i = 0; i < SNMP_EXTENDED_KEY_SIZ; i++) + authbuf[i] = passwd[(loop + i) % pwdlen]; + if (EVP_DigestUpdate(&ctx, authbuf, SNMP_EXTENDED_KEY_SIZ) != 1) + goto failed; + } + + if (EVP_DigestFinal(&ctx, user->auth_key, &olen) != 1) + goto failed; + + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_OK); + +failed: + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_BADDIGEST); +} + +/* [RFC 3414] - 2.6. Key Localization Algorithm */ +enum snmp_code +snmp_get_local_keys(struct snmp_user *user, uint8_t *eid, uint32_t elen) +{ + int err; + uint32_t keylen, olen; + const EVP_MD *dtype; + EVP_MD_CTX ctx; + uint8_t authbuf[SNMP_AUTH_BUF_SIZE]; + + if (user == NULL || eid == NULL || elen > SNMP_ENGINE_ID_SIZ) + return (SNMP_CODE_FAILED); + + memset(user->priv_key, 0, sizeof(user->priv_key)); + memset(authbuf, 0, sizeof(authbuf)); + + err = snmp_digest_init(user, &ctx, &dtype, &keylen); + if (err < 0) + return (SNMP_CODE_BADDIGEST); + else if (err == 0) + return (SNMP_CODE_OK); + + memcpy(authbuf, user->auth_key, keylen); + memcpy(authbuf + keylen, eid, elen); + memcpy(authbuf + keylen + elen, user->auth_key, keylen); + + if (EVP_DigestUpdate(&ctx, authbuf, 2 * keylen + elen) != 1 || + EVP_DigestFinal(&ctx, user->auth_key, &olen) != 1) { + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_BADDIGEST); + } + EVP_MD_CTX_cleanup(&ctx); + + if (user->priv_proto != SNMP_PRIV_NOPRIV) + memcpy(user->priv_key, user->auth_key, sizeof(user->priv_key)); + + return (SNMP_CODE_OK); +} + +enum snmp_code +snmp_calc_keychange(struct snmp_user *user, uint8_t *keychange) +{ + int32_t i, err, rvalue[SNMP_AUTH_HMACSHA_KEY_SIZ / 4]; + uint32_t keylen, olen; + const EVP_MD *dtype; + EVP_MD_CTX ctx; + + err = snmp_digest_init(user, &ctx, &dtype, &keylen); + if (err < 0) + return (SNMP_CODE_BADDIGEST); + else if (err == 0) + return (SNMP_CODE_OK); + + for (i = 0; i < keylen / 4; i++) + rvalue[i] = random(); + + memcpy(keychange, user->auth_key, keylen); + memcpy(keychange + keylen, rvalue, keylen); + + if (EVP_DigestUpdate(&ctx, keychange, 2 * keylen) != 1 || + EVP_DigestFinal(&ctx, keychange, &olen) != 1) { + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_BADDIGEST); + } + + EVP_MD_CTX_cleanup(&ctx); + return (SNMP_CODE_OK); +} + +#else /* !HAVE_LIBCRYPTO */ + +enum snmp_code +snmp_pdu_calc_digest(struct asn_buf *b __unused, const struct snmp_pdu *pdu, + uint8_t *digest __unused) +{ + if (pdu->user.auth_proto != SNMP_AUTH_NOAUTH) + return (SNMP_CODE_BADSECLEVEL); + + + return (SNMP_CODE_OK); +} + +enum snmp_code +snmp_pdu_encrypt(struct asn_buf *b __unused, const struct snmp_pdu *pdu) +{ + if (pdu->user.priv_proto != SNMP_PRIV_NOPRIV) + return (SNMP_CODE_BADSECLEVEL); + + return (SNMP_CODE_OK); +} + +enum snmp_code +snmp_pdu_decrypt(struct asn_buf *b __unused, const struct snmp_pdu *pdu) +{ + if (pdu->user.priv_proto != SNMP_PRIV_NOPRIV) + return (SNMP_CODE_BADSECLEVEL); + + return (SNMP_CODE_OK); +} + +int +snmp_passwd_to_keys(struct snmp_user *user, char *passwd __unused) +{ + if (user->auth_proto == SNMP_AUTH_NOAUTH && + user->priv_proto == SNMP_PRIV_NOPRIV) + return (SNMP_CODE_OK); + + errno = EPROTONOSUPPORT; + + return (SNMP_CODE_FAILED); +} + +int +snmp_get_local_keys(struct snmp_user *user, uint8_t *eid __unused, + uint32_t elen __unused) +{ + if (user->auth_proto == SNMP_AUTH_NOAUTH && + user->priv_proto == SNMP_PRIV_NOPRIV) + return (SNMP_CODE_OK); + + errno = EPROTONOSUPPORT; + + return (SNMP_CODE_FAILED); +} + +enum snmp_code +snmp_calc_keychange(struct snmp_user *user __unused, + uint8_t *keychange __unused) +{ + errno = EPROTONOSUPPORT; + return (SNMP_CODE_FAILED); +} + +#endif /* HAVE_LIBCRYPTO */ -- cgit v1.1 From ae67436c3a99cb8c52edb1b9c9be3da5642ac59a Mon Sep 17 00:00:00 2001 From: syrinx Date: Wed, 8 Dec 2010 17:27:59 +0000 Subject: Add (disabled) sample configurations needed to enable the snmp_usm and snmp_vacm modules and minimal user/view configurations needed to for the modules to work properly. Sponsored by: The FreeBSD Foundation Reviewed by: philip@ (mostly) Approved by: philip@ --- etc/snmpd.config | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/etc/snmpd.config b/etc/snmpd.config index b212f24..7e73b5c 100644 --- a/etc/snmpd.config +++ b/etc/snmpd.config @@ -12,6 +12,15 @@ system := 1 # FreeBSD traphost := localhost trapport := 162 +# +# Set the SNMP engine ID. +# +# The snmpEngineID object required from the SNMPv3 Framework. If not explicitly set via +# this configuration file, an ID is assigned based on the value of the +# kern.hostid variable +# engine := 0x80:0x10:0x08:0x10:0x80:0x25 +# snmpEngineID = $(engine) + # Change this! read := "public" # Uncomment begemotSnmpdCommunityString.0.2 below that sets the community @@ -19,6 +28,26 @@ read := "public" write := "geheim" trap := "mytrap" +# Declarations for SNMP-USER-BASED-SM-MIB authentication and privacy options +NoAuthProtocol := 1.3.6.1.6.3.10.1.1.1 +HMACMD5AuthProtocol := 1.3.6.1.6.3.10.1.1.2 +HMACSHAAuthProtocol := 1.3.6.1.6.3.10.1.1.3 +NoPrivProtocol := 1.3.6.1.6.3.10.1.2.1 +DESPrivProtocol := 1.3.6.1.6.3.10.1.2.2 +AesCfb128Protocol := 1.3.6.1.6.3.10.1.2.4 + +# +# SNMPv3 USM User definition +# +# The localized hex password for a user may be obtained by setting SNMPUSER, SNMPPASSWD, +# SNMPAUTH and SNMPPRIV environment variables to the desired parameters and invoking +# 'bsnmpget -v 3 -D -K -o verbose' against the running bsnmpd(1). For other +# usages refer to the bsnmpget(1) manual page. The following lines define a user "bsnmp" +# which a private password "bsnmp", localized for the above engine ID. +# +# user1 := "bsnmp" +# user1passwd := 0x1b:0x6d:0x9e:0x94:0xbe:0x19:0x17:0xfb:0xde:0x60:0x46:0xfe:0x59:0x6f:0x61:0x95:0xf2:0xc9:0x57:0x1f + # # Configuration # @@ -72,6 +101,113 @@ begemotSnmpdModulePath."mibII" = "/usr/lib/snmp_mibII.so" #begemotIfForcePoll = 2000 # +# SNMPv3 User-based security module - must be loaded for SNMPv3 USM +# +#begemotSnmpdModulePath."usm" = "/usr/lib/snmp_usm.so" + +# +# SNMPv3 USM User definition. +# + +#%usm + +# +# The following block creates a user with name "bsnmp" and sets privacy +# and encryption options to SHA256 message digests and AES encryption +# for this user. +# +# usmUserStatus.$(engine).$(user1) = 5 +# usmUserAuthProtocol.$(engine).$(user1) = $(HMACSHAAuthProtocol) +# usmUserAuthKeyChange.$(engine).$(user1) = $(user1passwd) +# usmUserPrivProtocol.$(engine).$(user1) = $(AesCfb128Protocol) +# usmUserPrivKeyChange.$(engine).$(user1) = $(user1passwd) +# usmUserStatus.$(engine).$(user1) = 1 +# + +# +# The following block creates a user with name "public" with no authentication +# or encyption options. +# +# usmUserStatus.$(engine).$(read) = 5 +# usmUserAuthProtocol.$(engine).$(read) = $(NoAuthProtocol) +# usmUserPrivProtocol.$(engine).$(read) = $(NoPrivProtocol) +# usmUserStatus.$(engine).$(read) = 1 +# + +# +# SNMPv3 View-based Access Control module +# +#begemotSnmpdModulePath."vacm" = "/usr/lib/snmp_vacm.so" + +# +# Definition of view-based access control entries. +# +#%vacm + +# Definition of a SNMPv1 group +# vacmSecurityToGroupStatus.1.$(read) = 4 +# vacmGroupName.1.$(read) = $(read) + +# Definition of SNMPv2 group +# vacmSecurityToGroupStatus.2.$(write) = 4 +# vacmGroupName.2.$(write) = $(write) + +# Definition of SNMPv3 group with users "bsnmp" and "public" +# vacmSecurityToGroupStatus.3.$(user1) = 4 +# vacmGroupName.3.$(user1) = $(write) +# vacmSecurityToGroupStatus.3.$(read) = 4 +# vacmGroupName.3.$(read) = $(write) + +# +# The OID of the .iso.org.dod.internet subtree +# +# internetoid := 1.3.6.1 +# internetoidlen := 4 + +# Enumerated values for the privacy options +# noAuthNoPriv := 1 +# authNoPriv := 2 +# authPriv := 3 + +# +# Definitions of two views +# +# vacmViewTreeFamilyStatus."internet".$(internetoidlen).$(internetoid) = 4 +# vacmViewTreeFamilyStatus."restricted".$(internetoidlen).$(internetoid) = 4 + +# +# Access control +# + +# +# Read-only access for SNMPv1 users +# +# vacmAccessStatus.$(read)."".1.1 = 4 +# vacmAccessReadViewName.$(read)."".1.1 = "internet" + +# +# Read-write access for SNMPv2 users +# +# vacmAccessStatus.$(write)."".2.1 = 4 +# vacmAccessReadViewName.$(write)."".2.1 = "internet" +# vacmAccessWriteViewName.$(write)."".2.1 = "internet" + +# +# Read-write-notify access for SNMPv3 USM users with noAuthNoPriv +# +# vacmAccessStatus.$(write)."".3.$(noAuthNoPriv) = 4 +# vacmAccessReadViewName.$(write)."".3.$(noAuthNoPriv) = "internet" +# vacmAccessWriteViewName.$(write)."".3.$(noAuthNoPriv) = "internet" +# vacmAccessNotifyViewName.$(write)."".3.$(noAuthNoPriv) = "internet" + +# +#Read-write-notify access to restricted for SNMPv3 USM users with authPriv +# +# vacmAccessStatus.$(write)."".3.$(authPriv) = 4 +# vacmAccessReadViewName.$(write)."".3.$(authPriv) = "restricted" +# vacmAccessWriteViewName.$(write)."".3.$(authPriv) = "restricted" +# vacmAccessNotifyViewName.$(write)."".3.$(authPriv) = "restricted" + # Netgraph module # #begemotSnmpdModulePath."netgraph" = "/usr/lib/snmp_netgraph.so" -- cgit v1.1 From 0bbf10e816b5e4a34bf55434e3b6e2a712e181d4 Mon Sep 17 00:00:00 2001 From: syrinx Date: Wed, 8 Dec 2010 17:34:07 +0000 Subject: Fix typos. --- etc/snmpd.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/snmpd.config b/etc/snmpd.config index 7e73b5c..d729b37 100644 --- a/etc/snmpd.config +++ b/etc/snmpd.config @@ -43,7 +43,7 @@ AesCfb128Protocol := 1.3.6.1.6.3.10.1.2.4 # SNMPAUTH and SNMPPRIV environment variables to the desired parameters and invoking # 'bsnmpget -v 3 -D -K -o verbose' against the running bsnmpd(1). For other # usages refer to the bsnmpget(1) manual page. The following lines define a user "bsnmp" -# which a private password "bsnmp", localized for the above engine ID. +# with a private password "bsnmp", localized for the above engine ID. # # user1 := "bsnmp" # user1passwd := 0x1b:0x6d:0x9e:0x94:0xbe:0x19:0x17:0xfb:0xde:0x60:0x46:0xfe:0x59:0x6f:0x61:0x95:0xf2:0xc9:0x57:0x1f @@ -126,7 +126,7 @@ begemotSnmpdModulePath."mibII" = "/usr/lib/snmp_mibII.so" # # The following block creates a user with name "public" with no authentication -# or encyption options. +# or encryption options. # # usmUserStatus.$(engine).$(read) = 5 # usmUserAuthProtocol.$(engine).$(read) = $(NoAuthProtocol) -- cgit v1.1 From 218f7f26d18fc22981c415db02e0b9e11189e1ad Mon Sep 17 00:00:00 2001 From: cperciva Date: Wed, 8 Dec 2010 19:42:21 +0000 Subject: MFi386 r1.81, r1.82, r1.84: Reorganize code to reduce cache pressure and branch mispredictions. No objections from: scottl --- sys/amd64/amd64/busdma_machdep.c | 152 ++++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 72 deletions(-) diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index 5a60bc1..0b805b1 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$"); #include #define MAX_BPAGES 8192 +#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 +#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 struct bounce_zone; @@ -135,7 +137,9 @@ static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, bus_size_t size); static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); -static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); +int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); +int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, + void *buf, bus_size_t buflen, int flags); /* * Return true if a match is made. @@ -145,7 +149,7 @@ static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); * If paddr is within the bounds of the dma tag then call the filter callback * to check for a match, if there is no filter callback then assume a match. */ -static __inline int +int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) { int retval; @@ -200,8 +204,6 @@ dflt_lock(void *arg, bus_dma_lock_op_t op) panic("driver error: busdma dflt_lock called"); } -#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 -#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 /* * Allocate a device specific dma_tag. */ @@ -266,6 +268,9 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, else if (parent->boundary != 0) newtag->boundary = MIN(parent->boundary, newtag->boundary); + if ((newtag->filter != NULL) || + ((parent->flags & BUS_DMA_COULD_BOUNCE) != 0)) + newtag->flags |= BUS_DMA_COULD_BOUNCE; if (newtag->filter == NULL) { /* * Short circuit looking at our parent directly @@ -561,36 +566,15 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags); } -/* - * Utility function to load a linear buffer. lastaddrp holds state - * between invocations (for multiple-buffer loads). segp contains - * the starting segment on entrace, and the ending segment on exit. - * first indicates if this is the first invocation of this function. - */ -static __inline int -_bus_dmamap_load_buffer(bus_dma_tag_t dmat, - bus_dmamap_t map, - void *buf, bus_size_t buflen, - pmap_t pmap, - int flags, - bus_addr_t *lastaddrp, - bus_dma_segment_t *segs, - int *segp, - int first) +int +_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, + void *buf, bus_size_t buflen, int flags) { - bus_size_t sgsize; - bus_addr_t curaddr, lastaddr, baddr, bmask; vm_offset_t vaddr; + vm_offset_t vendaddr; bus_addr_t paddr; - int seg; - - if (map == NULL) - map = &nobounce_dmamap; - - if ((map != &nobounce_dmamap && map->pagesneeded == 0) - && ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0)) { - vm_offset_t vendaddr; + if ((map != &nobounce_dmamap && map->pagesneeded == 0)) { CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " "alignment= %d", dmat->lowaddr, ptoa((vm_paddr_t)Maxmem), dmat->boundary, dmat->alignment); @@ -611,7 +595,8 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, paddr = pmap_extract(pmap, vaddr); else paddr = pmap_kextract(vaddr); - if (run_filter(dmat, paddr) != 0) { + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + run_filter(dmat, paddr) != 0) { sg_len = roundup2(sg_len, dmat->alignment); map->pagesneeded++; } @@ -643,6 +628,40 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, mtx_unlock(&bounce_lock); } + return (0); +} + +/* + * Utility function to load a linear buffer. lastaddrp holds state + * between invocations (for multiple-buffer loads). segp contains + * the starting segment on entrace, and the ending segment on exit. + * first indicates if this is the first invocation of this function. + */ +static __inline int +_bus_dmamap_load_buffer(bus_dma_tag_t dmat, + bus_dmamap_t map, + void *buf, bus_size_t buflen, + pmap_t pmap, + int flags, + bus_addr_t *lastaddrp, + bus_dma_segment_t *segs, + int *segp, + int first) +{ + bus_size_t sgsize; + bus_addr_t curaddr, lastaddr, baddr, bmask; + vm_offset_t vaddr; + int seg, error; + + if (map == NULL) + map = &nobounce_dmamap; + + if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) { + error = _bus_dmamap_count_pages(dmat, map, pmap, buf, buflen, flags); + if (error) + return (error); + } + vaddr = (vm_offset_t)buf; lastaddr = *lastaddrp; bmask = ~(dmat->boundary - 1); @@ -663,7 +682,8 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, */ max_sgsize = MIN(buflen, dmat->maxsegsz); sgsize = PAGE_SIZE - ((vm_offset_t)curaddr & PAGE_MASK); - if (map->pagesneeded != 0 && run_filter(dmat, curaddr)) { + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + map->pagesneeded != 0 && run_filter(dmat, curaddr)) { sgsize = roundup2(sgsize, dmat->alignment); sgsize = MIN(sgsize, max_sgsize); curaddr = add_bounce_page(dmat, map, vaddr, sgsize); @@ -762,18 +782,17 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, /* * Like _bus_dmamap_load(), but for mbufs. */ -int -bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, - bus_dmamap_callback2_t *callback, void *callback_arg, - int flags) +static __inline int +_bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, + int flags) { - int nsegs, error; + int error; M_ASSERTPKTHDR(m0); flags |= BUS_DMA_NOWAIT; - nsegs = 0; + *nsegs = 0; error = 0; if (m0->m_pkthdr.len <= dmat->maxsize) { int first = 1; @@ -785,7 +804,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, NULL, flags, &lastaddr, - dmat->segments, &nsegs, first); + segs, nsegs, first); first = 0; } } @@ -793,15 +812,33 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, error = EINVAL; } + /* XXX FIXME: Having to increment nsegs is really annoying */ + ++*nsegs; + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, *nsegs); + return (error); +} + +int +bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, + bus_dmamap_callback2_t *callback, void *callback_arg, + int flags) +{ + int nsegs, error; + + error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, dmat->segments, &nsegs, + flags); + if (error) { /* force "no valid mappings" in callback */ (*callback)(callback_arg, dmat->segments, 0, 0, error); } else { (*callback)(callback_arg, dmat->segments, - nsegs+1, m0->m_pkthdr.len, error); + nsegs, m0->m_pkthdr.len, error); } CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); + __func__, dmat, dmat->flags, error, nsegs); return (error); } @@ -810,36 +847,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, int flags) { - int error; - - M_ASSERTPKTHDR(m0); - - flags |= BUS_DMA_NOWAIT; - *nsegs = 0; - error = 0; - if (m0->m_pkthdr.len <= dmat->maxsize) { - int first = 1; - bus_addr_t lastaddr = 0; - struct mbuf *m; - - for (m = m0; m != NULL && error == 0; m = m->m_next) { - if (m->m_len > 0) { - error = _bus_dmamap_load_buffer(dmat, map, - m->m_data, m->m_len, - NULL, flags, &lastaddr, - segs, nsegs, first); - first = 0; - } - } - } else { - error = EINVAL; - } - - /* XXX FIXME: Having to increment nsegs is really annoying */ - ++*nsegs; - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, *nsegs); - return (error); + return (_bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags)); } /* -- cgit v1.1 From c63a5e764773fa9dbb545968475d109e50a13e14 Mon Sep 17 00:00:00 2001 From: cperciva Date: Wed, 8 Dec 2010 19:52:04 +0000 Subject: MFi386 r1.94: If XEN, make pmap_kextract = pmap_kextract_ma. This is a no-op currently, since FreeBSD/amd64 doesn't have (paravirtualized) Xen support, but if/when that support is ever added we'll want this, and until then it's harmless. --- sys/amd64/amd64/busdma_machdep.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index 0b805b1..d18f5bf 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -141,6 +141,11 @@ int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, void *buf, bus_size_t buflen, int flags); +#ifdef XEN +#undef pmap_kextract +#define pmap_kextract pmap_kextract_ma +#endif + /* * Return true if a match is made. * -- cgit v1.1 From 158bf7934e3441204b253b26a1422aff370a97b3 Mon Sep 17 00:00:00 2001 From: cperciva Date: Wed, 8 Dec 2010 20:20:10 +0000 Subject: On amd64, we have (since r1.72, in December 2005) MAX_BPAGES=8192, while on i386 we have MAX_BPAGES=512. Implement this difference via '#ifdef __i386__'. With this commit, the i386 and amd64 busdma_machdep.c files become identical; they will soon be replaced by a single file under sys/x86. --- sys/amd64/amd64/busdma_machdep.c | 4 ++++ sys/i386/i386/busdma_machdep.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index d18f5bf..feca1a6 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -50,7 +50,11 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef __i386__ +#define MAX_BPAGES 512 +#else #define MAX_BPAGES 8192 +#endif #define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 #define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index 5c1ec92..feca1a6 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -50,7 +50,11 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef __i386__ #define MAX_BPAGES 512 +#else +#define MAX_BPAGES 8192 +#endif #define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 #define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 -- cgit v1.1 From 6c063f9e37d17d062835952a9de633c93ffc7802 Mon Sep 17 00:00:00 2001 From: mav Date: Wed, 8 Dec 2010 20:35:20 +0000 Subject: Add IDs of HighPoint RocketRAID 62x cards (Marvell 88SE9128 chips). PR: kern/152926 Submitted by: Mike Tancsa MFC after: 1 week --- sys/dev/ahci/ahci.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index 4b93d9b..f767215 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -172,6 +172,10 @@ static struct { {0x614511ab, 0x00, "Marvell 88SX6145", AHCI_Q_NOFORCE|AHCI_Q_4CH|AHCI_Q_EDGEIS}, {0x91231b4b, 0x11, "Marvell 88SE912x", AHCI_Q_NOBSYRES}, {0x91231b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_SATA2|AHCI_Q_NOBSYRES}, + {0x06201103, 0x00, "HighPoint RocketRAID 620", AHCI_Q_NOBSYRES}, + {0x06201b4b, 0x00, "HighPoint RocketRAID 620", AHCI_Q_NOBSYRES}, + {0x06221103, 0x00, "HighPoint RocketRAID 622", AHCI_Q_NOBSYRES}, + {0x06221b4b, 0x00, "HighPoint RocketRAID 622", AHCI_Q_NOBSYRES}, {0x044c10de, 0x00, "NVIDIA MCP65", AHCI_Q_NOAA}, {0x044d10de, 0x00, "NVIDIA MCP65", AHCI_Q_NOAA}, {0x044e10de, 0x00, "NVIDIA MCP65", AHCI_Q_NOAA}, -- cgit v1.1 From 885e0c9379440717ddd5be9bd05997b4a21df13b Mon Sep 17 00:00:00 2001 From: jilles Date: Wed, 8 Dec 2010 22:13:27 +0000 Subject: printf: Remove support for building as a csh builtin. The #define BUILTIN was for building as a csh (not tcsh) builtin. Given that csh was replaced by tcsh years ago there is no point in keeping this. The #define SHELL is for building as an sh builtin and is in active use. This commit does not change the /bin/sh and /usr/bin/printf binaries. --- usr.bin/printf/printf.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/usr.bin/printf/printf.c b/usr.bin/printf/printf.c index 4ac23c6..55cfcc8 100644 --- a/usr.bin/printf/printf.c +++ b/usr.bin/printf/printf.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. */ -#if !defined(BUILTIN) && !defined(SHELL) +#ifndef SHELL #ifndef lint static char const copyright[] = "@(#) Copyright (c) 1989, 1993\n\ @@ -69,9 +69,7 @@ static const char rcsid[] = #define warnx3(a, b, c) warnx(a, b, c) #endif -#ifndef BUILTIN #include -#endif #define PF(f, func) do { \ char *b = NULL; \ @@ -105,17 +103,13 @@ static void usage(void); static char **gargv; int -#ifdef BUILTIN -progprintf(int argc, char *argv[]) -#else main(int argc, char *argv[]) -#endif { size_t len; int ch, chopped, end, rval; char *format, *fmt, *start; -#if !defined(BUILTIN) && !defined(SHELL) +#ifndef SHELL (void) setlocale(LC_NUMERIC, ""); #endif #ifdef SHELL -- cgit v1.1 From b69863b7fd8c607add70ec120752fc2385a10b99 Mon Sep 17 00:00:00 2001 From: jilles Date: Wed, 8 Dec 2010 22:54:18 +0000 Subject: printf: Test that the "--" option terminator works. --- tools/regression/usr.bin/printf/regress.m5.out | 1 + tools/regression/usr.bin/printf/regress.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 tools/regression/usr.bin/printf/regress.m5.out diff --git a/tools/regression/usr.bin/printf/regress.m5.out b/tools/regression/usr.bin/printf/regress.m5.out new file mode 100644 index 0000000..2838468 --- /dev/null +++ b/tools/regression/usr.bin/printf/regress.m5.out @@ -0,0 +1 @@ +-d diff --git a/tools/regression/usr.bin/printf/regress.sh b/tools/regression/usr.bin/printf/regress.sh index 86c600f..980fc70 100644 --- a/tools/regression/usr.bin/printf/regress.sh +++ b/tools/regression/usr.bin/printf/regress.sh @@ -2,7 +2,7 @@ REGRESSION_START($1) -echo '1..8' +echo '1..9' REGRESSION_TEST(`b', `printf "abc%b%b" "def\n" "\cghi"') REGRESSION_TEST(`d', `printf "%d,%5d,%.5d,%0*d,%.*d\n" 123 123 123 5 123 5 123') @@ -11,6 +11,7 @@ REGRESSION_TEST(`m1', `printf "%c%%%d\0\045\n" abc \"abc') REGRESSION_TEST(`m2', `printf "abc\n\cdef"') REGRESSION_TEST(`m3', `printf "%%%s\n" abc def ghi jkl') REGRESSION_TEST(`m4', `printf "%d,%f,%c,%s\n"') +REGRESSION_TEST(`m5', `printf -- "-d\n"') REGRESSION_TEST(`s', `printf "%.3s,%-5s\n" abcd abc') REGRESSION_END() -- cgit v1.1 From 9eb44e2a50d42aea2650694312bacb8b83a22cc5 Mon Sep 17 00:00:00 2001 From: jkim Date: Wed, 8 Dec 2010 23:40:41 +0000 Subject: Do not subtract 0.5% from estimated frequency if DELAY(9) is driven by TSC. Remove a confusing comment about converting to MHz as we never did. --- sys/amd64/amd64/machdep.c | 8 +------- sys/i386/i386/machdep.c | 10 +++++++--- sys/pc98/pc98/machdep.c | 10 +++++++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index fe4deb7..55b1ea3 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -563,13 +563,7 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) thread_unlock(curthread); #endif - /* - * Calculate the difference in readings, convert to Mhz, and - * subtract 0.5% of the total. Empirical testing has shown that - * overhead in DELAY() works out to approximately this value. - */ - tsc2 -= tsc1; - *rate = tsc2 * 1000 - tsc2 * 5; + *rate = (tsc2 - tsc1) * 1000; return (0); } diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 49800d9..a04e578 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -1157,12 +1157,16 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) thread_unlock(curthread); #endif + tsc2 -= tsc1; + if (tsc_freq != 0 && !tsc_is_broken) { + *rate = tsc2 * 1000; + return (0); + } + /* - * Calculate the difference in readings, convert to Mhz, and - * subtract 0.5% of the total. Empirical testing has shown that + * Subtract 0.5% of the total. Empirical testing has shown that * overhead in DELAY() works out to approximately this value. */ - tsc2 -= tsc1; *rate = tsc2 * 1000 - tsc2 * 5; return (0); } diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 03933a6..5a27646 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -1092,12 +1092,16 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) thread_unlock(curthread); #endif + tsc2 -= tsc1; + if (tsc_freq != 0 && !tsc_is_broken) { + *rate = tsc2 * 1000; + return (0); + } + /* - * Calculate the difference in readings, convert to Mhz, and - * subtract 0.5% of the total. Empirical testing has shown that + * Subtract 0.5% of the total. Empirical testing has shown that * overhead in DELAY() works out to approximately this value. */ - tsc2 -= tsc1; *rate = tsc2 * 1000 - tsc2 * 5; return (0); } -- cgit v1.1 From 171976dba2208151b69025bbf1a0b5f395ddf742 Mon Sep 17 00:00:00 2001 From: davidxu Date: Thu, 9 Dec 2010 02:42:02 +0000 Subject: MFp4: It is possible a lower priority thread lending priority to higher priority thread, in old code, it is ignored, however the lending should always be recorded, add field td_lend_user_pri to fix the problem, if a thread does not have borrowed priority, its value is PRI_MAX. MFC after: 1 week --- sys/kern/init_main.c | 1 + sys/kern/kern_fork.c | 1 + sys/kern/kern_thread.c | 1 + sys/kern/kern_umtx.c | 16 +++++++++------- sys/kern/sched_4bsd.c | 23 ++++++++++------------- sys/kern/sched_ule.c | 21 +++++++++++---------- sys/sys/proc.h | 3 ++- 7 files changed, 35 insertions(+), 31 deletions(-) diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index b86ea91..80a0907 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -460,6 +460,7 @@ proc0_init(void *dummy __unused) td->td_pri_class = PRI_TIMESHARE; td->td_user_pri = PUSER; td->td_base_user_pri = PUSER; + td->td_lend_user_pri = PRI_MAX; td->td_priority = PVM; td->td_base_pri = PUSER; td->td_oncpu = 0; diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 19d7d0f..61d9531 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -543,6 +543,7 @@ again: td2->td_sigstk = td->td_sigstk; td2->td_sigmask = td->td_sigmask; td2->td_flags = TDF_INMEM; + td2->td_lend_user_pri = PRI_MAX; #ifdef VIMAGE td2->td_vnet = NULL; diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index 5f07590..3e651bb 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -110,6 +110,7 @@ thread_ctor(void *mem, int size, void *arg, int flags) * end of a context switch. */ td->td_critnest = 1; + td->td_lend_user_pri = PRI_MAX; EVENTHANDLER_INVOKE(thread_ctor, td); #ifdef AUDIT audit_thread_alloc(td); diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 43570ce..e7b9b32 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -1407,17 +1407,19 @@ umtx_propagate_priority(struct thread *td) for (;;) { td = pi->pi_owner; - if (td == NULL) + if (td == NULL || td == curthread) return; MPASS(td->td_proc != NULL); MPASS(td->td_proc->p_magic == P_MAGIC); - if (UPRI(td) <= pri) - return; - thread_lock(td); - sched_lend_user_prio(td, pri); + if (td->td_lend_user_pri > pri) + sched_lend_user_prio(td, pri); + else { + thread_unlock(td); + break; + } thread_unlock(td); /* @@ -3587,8 +3589,8 @@ umtx_thread_cleanup(struct thread *td) pi->pi_owner = NULL; TAILQ_REMOVE(&uq->uq_pi_contested, pi, pi_link); } + mtx_unlock_spin(&umtx_lock); thread_lock(td); - td->td_flags &= ~TDF_UBORROWING; + sched_unlend_user_prio(td, PRI_MAX); thread_unlock(td); - mtx_unlock_spin(&umtx_lock); } diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 9face64..6278126 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -879,25 +879,23 @@ sched_prio(struct thread *td, u_char prio) void sched_user_prio(struct thread *td, u_char prio) { - u_char oldprio; THREAD_LOCK_ASSERT(td, MA_OWNED); td->td_base_user_pri = prio; - if (td->td_flags & TDF_UBORROWING && td->td_user_pri <= prio) + if (td->td_lend_user_pri <= prio) return; - oldprio = td->td_user_pri; td->td_user_pri = prio; } void sched_lend_user_prio(struct thread *td, u_char prio) { - u_char oldprio; THREAD_LOCK_ASSERT(td, MA_OWNED); - td->td_flags |= TDF_UBORROWING; - oldprio = td->td_user_pri; - td->td_user_pri = prio; + if (prio < td->td_lend_user_pri) + td->td_lend_user_pri = prio; + if (prio < td->td_user_pri) + td->td_user_pri = prio; } void @@ -907,12 +905,11 @@ sched_unlend_user_prio(struct thread *td, u_char prio) THREAD_LOCK_ASSERT(td, MA_OWNED); base_pri = td->td_base_user_pri; - if (prio >= base_pri) { - td->td_flags &= ~TDF_UBORROWING; - sched_user_prio(td, base_pri); - } else { - sched_lend_user_prio(td, prio); - } + td->td_lend_user_pri = prio; + if (prio > base_pri) + td->td_user_pri = base_pri; + else + td->td_user_pri = prio; } void diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 030c98d..fb30fdb 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -1677,8 +1677,8 @@ sched_user_prio(struct thread *td, u_char prio) { td->td_base_user_pri = prio; - if (td->td_flags & TDF_UBORROWING && td->td_user_pri <= prio) - return; + if (td->td_lend_user_pri <= prio) + return; td->td_user_pri = prio; } @@ -1687,8 +1687,10 @@ sched_lend_user_prio(struct thread *td, u_char prio) { THREAD_LOCK_ASSERT(td, MA_OWNED); - td->td_flags |= TDF_UBORROWING; - td->td_user_pri = prio; + if (prio < td->td_lend_user_pri) + td->td_lend_user_pri = prio; + if (prio < td->td_user_pri) + td->td_user_pri = prio; } void @@ -1698,12 +1700,11 @@ sched_unlend_user_prio(struct thread *td, u_char prio) THREAD_LOCK_ASSERT(td, MA_OWNED); base_pri = td->td_base_user_pri; - if (prio >= base_pri) { - td->td_flags &= ~TDF_UBORROWING; - sched_user_prio(td, base_pri); - } else { - sched_lend_user_prio(td, prio); - } + td->td_lend_user_pri = prio; + if (prio > base_pri) + td->td_user_pri = base_pri; + else + td->td_user_pri = prio; } /* diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 02f228c..48ef012 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -214,6 +214,7 @@ struct thread { lwpid_t td_tid; /* (b) Thread ID. */ sigqueue_t td_sigqueue; /* (c) Sigs arrived, not delivered. */ #define td_siglist td_sigqueue.sq_signals + u_char td_lend_user_pri; /* (t) Lend user pri. */ /* Cleared during fork1() */ #define td_startzero td_flags @@ -343,7 +344,7 @@ do { \ #define TDF_CANSWAP 0x00000040 /* Thread can be swapped. */ #define TDF_SLEEPABORT 0x00000080 /* sleepq_abort was called. */ #define TDF_KTH_SUSP 0x00000100 /* kthread is suspended */ -#define TDF_UBORROWING 0x00000200 /* Thread is borrowing user pri. */ +#define TDF_UNUSED09 0x00000200 /* --available-- */ #define TDF_BOUNDARY 0x00000400 /* Thread suspended at user boundary */ #define TDF_ASTPENDING 0x00000800 /* Thread has some asynchronous events. */ #define TDF_TIMOFAIL 0x00001000 /* Timeout from sleep after we were awake. */ -- cgit v1.1 From f88dac0410229a9c125b7586295dee9ecae57212 Mon Sep 17 00:00:00 2001 From: davidxu Date: Thu, 9 Dec 2010 05:16:20 +0000 Subject: MFp4: The unit number allocator reuses ID too fast, this may hide bugs in other code, add a ring buffer to delay freeing a thread ID. --- sys/kern/kern_thread.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index 3e651bb..7161a99 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -81,15 +81,54 @@ MTX_SYSINIT(zombie_lock, &zombie_lock, "zombie lock", MTX_SPIN); static void thread_zombie(struct thread *); +#define TID_BUFFER_SIZE 1024 + struct mtx tid_lock; static struct unrhdr *tid_unrhdr; - +static lwpid_t tid_buffer[TID_BUFFER_SIZE]; +static int tid_head, tid_tail; static MALLOC_DEFINE(M_TIDHASH, "tidhash", "thread hash"); struct tidhashhead *tidhashtbl; u_long tidhash; struct rwlock tidhash_lock; +static lwpid_t +tid_alloc(void) +{ + lwpid_t tid; + + tid = alloc_unr(tid_unrhdr); + if (tid != -1) + return (tid); + mtx_lock(&tid_lock); + if (tid_head == tid_tail) { + mtx_unlock(&tid_lock); + return (-1); + } + tid = tid_buffer[tid_head++]; + tid_head %= TID_BUFFER_SIZE; + mtx_unlock(&tid_lock); + return (tid); +} + +static void +tid_free(lwpid_t tid) +{ + lwpid_t tmp_tid = -1; + + mtx_lock(&tid_lock); + if ((tid_tail + 1) % TID_BUFFER_SIZE == tid_head) { + tmp_tid = tid_buffer[tid_head++]; + tid_head = (tid_head + 1) % TID_BUFFER_SIZE; + } + tid_buffer[tid_tail++] = tid; + tid_tail %= TID_BUFFER_SIZE; + mtx_unlock(&tid_lock); + if (tmp_tid != -1) + free_unr(tid_unrhdr, tmp_tid); +} + /* * Prepare a thread for use. */ @@ -102,7 +141,7 @@ thread_ctor(void *mem, int size, void *arg, int flags) td->td_state = TDS_INACTIVE; td->td_oncpu = NOCPU; - td->td_tid = alloc_unr(tid_unrhdr); + td->td_tid = tid_alloc(); /* * Note that td_critnest begins life as 1 because the thread is not @@ -156,7 +195,7 @@ thread_dtor(void *mem, int size, void *arg) osd_thread_exit(td); EVENTHANDLER_INVOKE(thread_dtor, td); - free_unr(tid_unrhdr, td->td_tid); + tid_free(td->td_tid); } /* -- cgit v1.1 From 603a66e11639c76d8e0f3b1f21c346cf6a5d93b9 Mon Sep 17 00:00:00 2001 From: jchandra Date: Thu, 9 Dec 2010 06:34:28 +0000 Subject: UMA_MD_SMALL_ALLOC for mips. Implement uma_small_alloc() and uma_small_free() for mips that allocates pages from direct mapped memory. Uses the same mechanism as the page table page allocator, so that we allocate from KSEG0 in 32 bit, and from XKPHYS on 64 bit. Reviewed by: alc, jmallett --- sys/conf/files.mips | 1 + sys/mips/include/pmap.h | 3 ++ sys/mips/include/vmparam.h | 2 ++ sys/mips/mips/pmap.c | 22 ++++++------ sys/mips/mips/uma_machdep.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 12 deletions(-) create mode 100644 sys/mips/mips/uma_machdep.c diff --git a/sys/conf/files.mips b/sys/conf/files.mips index 61a9295..e5949d2 100644 --- a/sys/conf/files.mips +++ b/sys/conf/files.mips @@ -63,6 +63,7 @@ mips/mips/support.S standard mips/mips/sys_machdep.c standard mips/mips/swtch.S standard mips/mips/uio_machdep.c standard +mips/mips/uma_machdep.c standard crypto/blowfish/bf_enc.c optional crypto | ipsec crypto/des/des_enc.c optional crypto | ipsec | netsmb geom/geom_bsd.c optional geom_bsd diff --git a/sys/mips/include/pmap.h b/sys/mips/include/pmap.h index c082abb..cdbf9bc 100644 --- a/sys/mips/include/pmap.h +++ b/sys/mips/include/pmap.h @@ -163,6 +163,9 @@ void pmap_kenter_temporary_free(vm_paddr_t pa); int pmap_compute_pages_to_dump(void); void pmap_flush_pvcache(vm_page_t m); int pmap_emulate_modified(pmap_t pmap, vm_offset_t va); +void pmap_grow_direct_page_cache(void); +vm_page_t pmap_alloc_direct_page(unsigned int index, int req); + #endif /* _KERNEL */ #endif /* !LOCORE */ diff --git a/sys/mips/include/vmparam.h b/sys/mips/include/vmparam.h index b76e065..212a0c3 100644 --- a/sys/mips/include/vmparam.h +++ b/sys/mips/include/vmparam.h @@ -149,6 +149,8 @@ #define VM_INITIAL_PAGEIN 16 #endif +#define UMA_MD_SMALL_ALLOC + /* * max number of non-contig chunks of physical RAM you can have */ diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 69d4e1e..d0cbc73 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -185,8 +185,6 @@ static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags); static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags); static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t); static int init_pte_prot(vm_offset_t va, vm_page_t m, vm_prot_t prot); -static vm_page_t pmap_alloc_pte_page(unsigned int index, int req); -static void pmap_grow_pte_page_cache(void); #ifdef SMP static void pmap_invalidate_page_action(void *arg); @@ -1062,8 +1060,8 @@ pmap_pinit0(pmap_t pmap) bzero(&pmap->pm_stats, sizeof pmap->pm_stats); } -static void -pmap_grow_pte_page_cache() +void +pmap_grow_direct_page_cache() { #ifdef __mips_n64 @@ -1073,8 +1071,8 @@ pmap_grow_pte_page_cache() #endif } -static vm_page_t -pmap_alloc_pte_page(unsigned int index, int req) +vm_page_t +pmap_alloc_direct_page(unsigned int index, int req) { vm_page_t m; @@ -1107,8 +1105,8 @@ pmap_pinit(pmap_t pmap) /* * allocate the page directory page */ - while ((ptdpg = pmap_alloc_pte_page(NUSERPGTBLS, VM_ALLOC_NORMAL)) == NULL) - pmap_grow_pte_page_cache(); + while ((ptdpg = pmap_alloc_direct_page(NUSERPGTBLS, VM_ALLOC_NORMAL)) == NULL) + pmap_grow_direct_page_cache(); ptdva = MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(ptdpg)); pmap->pm_segtab = (pd_entry_t *)ptdva; @@ -1141,11 +1139,11 @@ _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags) /* * Find or fabricate a new pagetable page */ - if ((m = pmap_alloc_pte_page(ptepindex, VM_ALLOC_NORMAL)) == NULL) { + if ((m = pmap_alloc_direct_page(ptepindex, VM_ALLOC_NORMAL)) == NULL) { if (flags & M_WAITOK) { PMAP_UNLOCK(pmap); vm_page_unlock_queues(); - pmap_grow_pte_page_cache(); + pmap_grow_direct_page_cache(); vm_page_lock_queues(); PMAP_LOCK(pmap); } @@ -1313,7 +1311,7 @@ pmap_growkernel(vm_offset_t addr) #ifdef __mips_n64 if (*pdpe == 0) { /* new intermediate page table entry */ - nkpg = pmap_alloc_pte_page(nkpt, VM_ALLOC_INTERRUPT); + nkpg = pmap_alloc_direct_page(nkpt, VM_ALLOC_INTERRUPT); if (nkpg == NULL) panic("pmap_growkernel: no memory to grow kernel"); *pdpe = (pd_entry_t)MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(nkpg)); @@ -1333,7 +1331,7 @@ pmap_growkernel(vm_offset_t addr) /* * This index is bogus, but out of the way */ - nkpg = pmap_alloc_pte_page(nkpt, VM_ALLOC_INTERRUPT); + nkpg = pmap_alloc_direct_page(nkpt, VM_ALLOC_INTERRUPT); if (!nkpg) panic("pmap_growkernel: no memory to grow kernel"); nkpt++; diff --git a/sys/mips/mips/uma_machdep.c b/sys/mips/mips/uma_machdep.c new file mode 100644 index 0000000..690fc23 --- /dev/null +++ b/sys/mips/mips/uma_machdep.c @@ -0,0 +1,87 @@ +/*- + * Copyright (c) 2003 Alan L. Cox + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void * +uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) +{ + static vm_pindex_t color; + vm_paddr_t pa; + vm_page_t m; + int pflags; + void *va; + + *flags = UMA_SLAB_PRIV; + + if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT) + pflags = VM_ALLOC_INTERRUPT; + else + pflags = VM_ALLOC_SYSTEM; + + for (;;) { + m = pmap_alloc_direct_page(color++, pflags); + if (m == NULL) { + if (wait & M_NOWAIT) + return (NULL); + else + pmap_grow_direct_page_cache(); + } else + break; + } + + pa = VM_PAGE_TO_PHYS(m); + va = (void *)MIPS_PHYS_TO_DIRECT(pa); + if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) + bzero(va, PAGE_SIZE); + return (va); +} + +void +uma_small_free(void *mem, int size, u_int8_t flags) +{ + vm_page_t m; + vm_paddr_t pa; + + pa = MIPS_DIRECT_TO_PHYS((vm_offset_t)mem); + m = PHYS_TO_VM_PAGE(pa); + m->wire_count--; + vm_page_free(m); + atomic_subtract_int(&cnt.v_wire_count, 1); +} -- cgit v1.1 From e7d2a75ec65e236cd2644c1c4bcc3bb16c729015 Mon Sep 17 00:00:00 2001 From: cperciva Date: Thu, 9 Dec 2010 06:41:50 +0000 Subject: Replace i386/i386/busdma_machdep.c and amd64/amd64/busdma_machdep.c (which are identical) with a single x86/x86/busdma_machdep.c. --- sys/amd64/amd64/busdma_machdep.c | 1222 -------------------------------------- sys/conf/files.amd64 | 2 +- sys/conf/files.i386 | 2 +- sys/conf/files.pc98 | 2 +- sys/i386/i386/busdma_machdep.c | 1222 -------------------------------------- sys/x86/x86/busdma_machdep.c | 1222 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 1225 insertions(+), 2447 deletions(-) delete mode 100644 sys/amd64/amd64/busdma_machdep.c delete mode 100644 sys/i386/i386/busdma_machdep.c create mode 100644 sys/x86/x86/busdma_machdep.c diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c deleted file mode 100644 index feca1a6..0000000 --- a/sys/amd64/amd64/busdma_machdep.c +++ /dev/null @@ -1,1222 +0,0 @@ -/*- - * Copyright (c) 1997, 1998 Justin T. Gibbs. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#ifdef __i386__ -#define MAX_BPAGES 512 -#else -#define MAX_BPAGES 8192 -#endif -#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 -#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 - -struct bounce_zone; - -struct bus_dma_tag { - bus_dma_tag_t parent; - bus_size_t alignment; - bus_size_t boundary; - bus_addr_t lowaddr; - bus_addr_t highaddr; - bus_dma_filter_t *filter; - void *filterarg; - bus_size_t maxsize; - u_int nsegments; - bus_size_t maxsegsz; - int flags; - int ref_count; - int map_count; - bus_dma_lock_t *lockfunc; - void *lockfuncarg; - bus_dma_segment_t *segments; - struct bounce_zone *bounce_zone; -}; - -struct bounce_page { - vm_offset_t vaddr; /* kva of bounce buffer */ - bus_addr_t busaddr; /* Physical address */ - vm_offset_t datavaddr; /* kva of client data */ - bus_size_t datacount; /* client data count */ - STAILQ_ENTRY(bounce_page) links; -}; - -int busdma_swi_pending; - -struct bounce_zone { - STAILQ_ENTRY(bounce_zone) links; - STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; - int total_bpages; - int free_bpages; - int reserved_bpages; - int active_bpages; - int total_bounced; - int total_deferred; - int map_count; - bus_size_t alignment; - bus_addr_t lowaddr; - char zoneid[8]; - char lowaddrid[20]; - struct sysctl_ctx_list sysctl_tree; - struct sysctl_oid *sysctl_tree_top; -}; - -static struct mtx bounce_lock; -static int total_bpages; -static int busdma_zonecount; -static STAILQ_HEAD(, bounce_zone) bounce_zone_list; - -SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters"); -SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0, - "Total bounce pages"); - -struct bus_dmamap { - struct bp_list bpages; - int pagesneeded; - int pagesreserved; - bus_dma_tag_t dmat; - void *buf; /* unmapped buffer pointer */ - bus_size_t buflen; /* unmapped buffer length */ - bus_dmamap_callback_t *callback; - void *callback_arg; - STAILQ_ENTRY(bus_dmamap) links; -}; - -static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; -static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; -static struct bus_dmamap nobounce_dmamap; - -static void init_bounce_pages(void *dummy); -static int alloc_bounce_zone(bus_dma_tag_t dmat); -static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); -static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, - int commit); -static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, - vm_offset_t vaddr, bus_size_t size); -static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); -int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); -int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, - void *buf, bus_size_t buflen, int flags); - -#ifdef XEN -#undef pmap_kextract -#define pmap_kextract pmap_kextract_ma -#endif - -/* - * Return true if a match is made. - * - * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'. - * - * If paddr is within the bounds of the dma tag then call the filter callback - * to check for a match, if there is no filter callback then assume a match. - */ -int -run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) -{ - int retval; - - retval = 0; - - do { - if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) - || ((paddr & (dmat->alignment - 1)) != 0)) - && (dmat->filter == NULL - || (*dmat->filter)(dmat->filterarg, paddr) != 0)) - retval = 1; - - dmat = dmat->parent; - } while (retval == 0 && dmat != NULL); - return (retval); -} - -/* - * Convenience function for manipulating driver locks from busdma (during - * busdma_swi, for example). Drivers that don't provide their own locks - * should specify &Giant to dmat->lockfuncarg. Drivers that use their own - * non-mutex locking scheme don't have to use this at all. - */ -void -busdma_lock_mutex(void *arg, bus_dma_lock_op_t op) -{ - struct mtx *dmtx; - - dmtx = (struct mtx *)arg; - switch (op) { - case BUS_DMA_LOCK: - mtx_lock(dmtx); - break; - case BUS_DMA_UNLOCK: - mtx_unlock(dmtx); - break; - default: - panic("Unknown operation 0x%x for busdma_lock_mutex!", op); - } -} - -/* - * dflt_lock should never get called. It gets put into the dma tag when - * lockfunc == NULL, which is only valid if the maps that are associated - * with the tag are meant to never be defered. - * XXX Should have a way to identify which driver is responsible here. - */ -static void -dflt_lock(void *arg, bus_dma_lock_op_t op) -{ - panic("driver error: busdma dflt_lock called"); -} - -/* - * Allocate a device specific dma_tag. - */ -int -bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, - bus_size_t boundary, bus_addr_t lowaddr, - bus_addr_t highaddr, bus_dma_filter_t *filter, - void *filterarg, bus_size_t maxsize, int nsegments, - bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc, - void *lockfuncarg, bus_dma_tag_t *dmat) -{ - bus_dma_tag_t newtag; - int error = 0; - - /* Basic sanity checking */ - if (boundary != 0 && boundary < maxsegsz) - maxsegsz = boundary; - - if (maxsegsz == 0) { - return (EINVAL); - } - - /* Return a NULL tag on failure */ - *dmat = NULL; - - newtag = (bus_dma_tag_t)malloc(sizeof(*newtag), M_DEVBUF, - M_ZERO | M_NOWAIT); - if (newtag == NULL) { - CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", - __func__, newtag, 0, error); - return (ENOMEM); - } - - newtag->parent = parent; - newtag->alignment = alignment; - newtag->boundary = boundary; - newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); - newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + (PAGE_SIZE - 1); - newtag->filter = filter; - newtag->filterarg = filterarg; - newtag->maxsize = maxsize; - newtag->nsegments = nsegments; - newtag->maxsegsz = maxsegsz; - newtag->flags = flags; - newtag->ref_count = 1; /* Count ourself */ - newtag->map_count = 0; - if (lockfunc != NULL) { - newtag->lockfunc = lockfunc; - newtag->lockfuncarg = lockfuncarg; - } else { - newtag->lockfunc = dflt_lock; - newtag->lockfuncarg = NULL; - } - newtag->segments = NULL; - - /* Take into account any restrictions imposed by our parent tag */ - if (parent != NULL) { - newtag->lowaddr = MIN(parent->lowaddr, newtag->lowaddr); - newtag->highaddr = MAX(parent->highaddr, newtag->highaddr); - if (newtag->boundary == 0) - newtag->boundary = parent->boundary; - else if (parent->boundary != 0) - newtag->boundary = MIN(parent->boundary, - newtag->boundary); - if ((newtag->filter != NULL) || - ((parent->flags & BUS_DMA_COULD_BOUNCE) != 0)) - newtag->flags |= BUS_DMA_COULD_BOUNCE; - if (newtag->filter == NULL) { - /* - * Short circuit looking at our parent directly - * since we have encapsulated all of its information - */ - newtag->filter = parent->filter; - newtag->filterarg = parent->filterarg; - newtag->parent = parent->parent; - } - if (newtag->parent != NULL) - atomic_add_int(&parent->ref_count, 1); - } - - if (newtag->lowaddr < ptoa((vm_paddr_t)Maxmem) - || newtag->alignment > 1) - newtag->flags |= BUS_DMA_COULD_BOUNCE; - - if (((newtag->flags & BUS_DMA_COULD_BOUNCE) != 0) && - (flags & BUS_DMA_ALLOCNOW) != 0) { - struct bounce_zone *bz; - - /* Must bounce */ - - if ((error = alloc_bounce_zone(newtag)) != 0) { - free(newtag, M_DEVBUF); - return (error); - } - bz = newtag->bounce_zone; - - if (ptoa(bz->total_bpages) < maxsize) { - int pages; - - pages = atop(maxsize) - bz->total_bpages; - - /* Add pages to our bounce pool */ - if (alloc_bounce_pages(newtag, pages) < pages) - error = ENOMEM; - } - /* Performed initial allocation */ - newtag->flags |= BUS_DMA_MIN_ALLOC_COMP; - } - - if (error != 0) { - free(newtag, M_DEVBUF); - } else { - *dmat = newtag; - } - CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", - __func__, newtag, (newtag != NULL ? newtag->flags : 0), error); - return (error); -} - -int -bus_dma_tag_destroy(bus_dma_tag_t dmat) -{ - bus_dma_tag_t dmat_copy; - int error; - - error = 0; - dmat_copy = dmat; - - if (dmat != NULL) { - - if (dmat->map_count != 0) { - error = EBUSY; - goto out; - } - - while (dmat != NULL) { - bus_dma_tag_t parent; - - parent = dmat->parent; - atomic_subtract_int(&dmat->ref_count, 1); - if (dmat->ref_count == 0) { - if (dmat->segments != NULL) - free(dmat->segments, M_DEVBUF); - free(dmat, M_DEVBUF); - /* - * Last reference count, so - * release our reference - * count on our parent. - */ - dmat = parent; - } else - dmat = NULL; - } - } -out: - CTR3(KTR_BUSDMA, "%s tag %p error %d", __func__, dmat_copy, error); - return (error); -} - -/* - * Allocate a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) -{ - int error; - - error = 0; - - if (dmat->segments == NULL) { - dmat->segments = (bus_dma_segment_t *)malloc( - sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, - M_NOWAIT); - if (dmat->segments == NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, ENOMEM); - return (ENOMEM); - } - } - - /* - * Bouncing might be required if the driver asks for an active - * exclusion region, a data alignment that is stricter than 1, and/or - * an active address boundary. - */ - if (dmat->flags & BUS_DMA_COULD_BOUNCE) { - - /* Must bounce */ - struct bounce_zone *bz; - int maxpages; - - if (dmat->bounce_zone == NULL) { - if ((error = alloc_bounce_zone(dmat)) != 0) - return (error); - } - bz = dmat->bounce_zone; - - *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, - M_NOWAIT | M_ZERO); - if (*mapp == NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, ENOMEM); - return (ENOMEM); - } - - /* Initialize the new map */ - STAILQ_INIT(&((*mapp)->bpages)); - - /* - * Attempt to add pages to our pool on a per-instance - * basis up to a sane limit. - */ - if (dmat->alignment > 1) - maxpages = MAX_BPAGES; - else - maxpages = MIN(MAX_BPAGES, Maxmem -atop(dmat->lowaddr)); - if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 - || (bz->map_count > 0 && bz->total_bpages < maxpages)) { - int pages; - - pages = MAX(atop(dmat->maxsize), 1); - pages = MIN(maxpages - bz->total_bpages, pages); - pages = MAX(pages, 1); - if (alloc_bounce_pages(dmat, pages) < pages) - error = ENOMEM; - - if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0) { - if (error == 0) - dmat->flags |= BUS_DMA_MIN_ALLOC_COMP; - } else { - error = 0; - } - } - bz->map_count++; - } else { - *mapp = NULL; - } - if (error == 0) - dmat->map_count++; - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, error); - return (error); -} - -/* - * Destroy a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - if (map != NULL && map != &nobounce_dmamap) { - if (STAILQ_FIRST(&map->bpages) != NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, EBUSY); - return (EBUSY); - } - if (dmat->bounce_zone) - dmat->bounce_zone->map_count--; - free(map, M_DEVBUF); - } - dmat->map_count--; - CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); - return (0); -} - - -/* - * Allocate a piece of memory that can be efficiently mapped into - * bus device space based on the constraints lited in the dma tag. - * A dmamap to for use with dmamap_load is also allocated. - */ -int -bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, - bus_dmamap_t *mapp) -{ - int mflags; - - if (flags & BUS_DMA_NOWAIT) - mflags = M_NOWAIT; - else - mflags = M_WAITOK; - - /* If we succeed, no mapping/bouncing will be required */ - *mapp = NULL; - - if (dmat->segments == NULL) { - dmat->segments = (bus_dma_segment_t *)malloc( - sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, - mflags); - if (dmat->segments == NULL) { - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, ENOMEM); - return (ENOMEM); - } - } - if (flags & BUS_DMA_ZERO) - mflags |= M_ZERO; - - /* - * XXX: - * (dmat->alignment < dmat->maxsize) is just a quick hack; the exact - * alignment guarantees of malloc need to be nailed down, and the - * code below should be rewritten to take that into account. - * - * In the meantime, we'll warn the user if malloc gets it wrong. - */ - if ((dmat->maxsize <= PAGE_SIZE) && - (dmat->alignment < dmat->maxsize) && - dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) { - *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); - } else { - /* - * XXX Use Contigmalloc until it is merged into this facility - * and handles multi-seg allocations. Nobody is doing - * multi-seg allocations yet though. - * XXX Certain AGP hardware does. - */ - *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags, - 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, - dmat->boundary); - } - if (*vaddr == NULL) { - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, ENOMEM); - return (ENOMEM); - } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { - printf("bus_dmamem_alloc failed to align memory properly.\n"); - } - if (flags & BUS_DMA_NOCACHE) - pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, - PAT_UNCACHEABLE); - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, 0); - return (0); -} - -/* - * Free a piece of memory and it's allociated dmamap, that was allocated - * via bus_dmamem_alloc. Make the same choice for free/contigfree. - */ -void -bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) -{ - /* - * dmamem does not need to be bounced, so the map should be - * NULL - */ - if (map != NULL) - panic("bus_dmamem_free: Invalid map freed\n"); - pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, PAT_WRITE_BACK); - if ((dmat->maxsize <= PAGE_SIZE) && - (dmat->alignment < dmat->maxsize) && - dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) - free(vaddr, M_DEVBUF); - else { - contigfree(vaddr, dmat->maxsize, M_DEVBUF); - } - CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags); -} - -int -_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, - void *buf, bus_size_t buflen, int flags) -{ - vm_offset_t vaddr; - vm_offset_t vendaddr; - bus_addr_t paddr; - - if ((map != &nobounce_dmamap && map->pagesneeded == 0)) { - CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " - "alignment= %d", dmat->lowaddr, ptoa((vm_paddr_t)Maxmem), - dmat->boundary, dmat->alignment); - CTR3(KTR_BUSDMA, "map= %p, nobouncemap= %p, pagesneeded= %d", - map, &nobounce_dmamap, map->pagesneeded); - /* - * Count the number of bounce pages - * needed in order to complete this transfer - */ - vaddr = (vm_offset_t)buf; - vendaddr = (vm_offset_t)buf + buflen; - - while (vaddr < vendaddr) { - bus_size_t sg_len; - - sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); - if (pmap) - paddr = pmap_extract(pmap, vaddr); - else - paddr = pmap_kextract(vaddr); - if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && - run_filter(dmat, paddr) != 0) { - sg_len = roundup2(sg_len, dmat->alignment); - map->pagesneeded++; - } - vaddr += sg_len; - } - CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded); - } - - /* Reserve Necessary Bounce Pages */ - if (map->pagesneeded != 0) { - mtx_lock(&bounce_lock); - if (flags & BUS_DMA_NOWAIT) { - if (reserve_bounce_pages(dmat, map, 0) != 0) { - mtx_unlock(&bounce_lock); - return (ENOMEM); - } - } else { - if (reserve_bounce_pages(dmat, map, 1) != 0) { - /* Queue us for resources */ - map->dmat = dmat; - map->buf = buf; - map->buflen = buflen; - STAILQ_INSERT_TAIL(&bounce_map_waitinglist, - map, links); - mtx_unlock(&bounce_lock); - return (EINPROGRESS); - } - } - mtx_unlock(&bounce_lock); - } - - return (0); -} - -/* - * Utility function to load a linear buffer. lastaddrp holds state - * between invocations (for multiple-buffer loads). segp contains - * the starting segment on entrace, and the ending segment on exit. - * first indicates if this is the first invocation of this function. - */ -static __inline int -_bus_dmamap_load_buffer(bus_dma_tag_t dmat, - bus_dmamap_t map, - void *buf, bus_size_t buflen, - pmap_t pmap, - int flags, - bus_addr_t *lastaddrp, - bus_dma_segment_t *segs, - int *segp, - int first) -{ - bus_size_t sgsize; - bus_addr_t curaddr, lastaddr, baddr, bmask; - vm_offset_t vaddr; - int seg, error; - - if (map == NULL) - map = &nobounce_dmamap; - - if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) { - error = _bus_dmamap_count_pages(dmat, map, pmap, buf, buflen, flags); - if (error) - return (error); - } - - vaddr = (vm_offset_t)buf; - lastaddr = *lastaddrp; - bmask = ~(dmat->boundary - 1); - - for (seg = *segp; buflen > 0 ; ) { - bus_size_t max_sgsize; - - /* - * Get the physical address for this segment. - */ - if (pmap) - curaddr = pmap_extract(pmap, vaddr); - else - curaddr = pmap_kextract(vaddr); - - /* - * Compute the segment size, and adjust counts. - */ - max_sgsize = MIN(buflen, dmat->maxsegsz); - sgsize = PAGE_SIZE - ((vm_offset_t)curaddr & PAGE_MASK); - if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && - map->pagesneeded != 0 && run_filter(dmat, curaddr)) { - sgsize = roundup2(sgsize, dmat->alignment); - sgsize = MIN(sgsize, max_sgsize); - curaddr = add_bounce_page(dmat, map, vaddr, sgsize); - } else { - sgsize = MIN(sgsize, max_sgsize); - } - - /* - * Make sure we don't cross any boundaries. - */ - if (dmat->boundary > 0) { - baddr = (curaddr + dmat->boundary) & bmask; - if (sgsize > (baddr - curaddr)) - sgsize = (baddr - curaddr); - } - - /* - * Insert chunk into a segment, coalescing with - * previous segment if possible. - */ - if (first) { - segs[seg].ds_addr = curaddr; - segs[seg].ds_len = sgsize; - first = 0; - } else { - if (curaddr == lastaddr && - (segs[seg].ds_len + sgsize) <= dmat->maxsegsz && - (dmat->boundary == 0 || - (segs[seg].ds_addr & bmask) == (curaddr & bmask))) - segs[seg].ds_len += sgsize; - else { - if (++seg >= dmat->nsegments) - break; - segs[seg].ds_addr = curaddr; - segs[seg].ds_len = sgsize; - } - } - - lastaddr = curaddr + sgsize; - vaddr += sgsize; - buflen -= sgsize; - } - - *segp = seg; - *lastaddrp = lastaddr; - - /* - * Did we fit? - */ - return (buflen != 0 ? EFBIG : 0); /* XXX better return value here? */ -} - -/* - * Map the buffer buf into bus space using the dmamap map. - */ -int -bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, bus_dmamap_callback_t *callback, - void *callback_arg, int flags) -{ - bus_addr_t lastaddr = 0; - int error, nsegs = 0; - - if (map != NULL) { - flags |= BUS_DMA_WAITOK; - map->callback = callback; - map->callback_arg = callback_arg; - } - - error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, - &lastaddr, dmat->segments, &nsegs, 1); - - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); - - if (error == EINPROGRESS) { - return (error); - } - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs + 1, 0); - - /* - * Return ENOMEM to the caller so that it can pass it up the stack. - * This error only happens when NOWAIT is set, so deferal is disabled. - */ - if (error == ENOMEM) - return (error); - - return (0); -} - - -/* - * Like _bus_dmamap_load(), but for mbufs. - */ -static __inline int -_bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, - int flags) -{ - int error; - - M_ASSERTPKTHDR(m0); - - flags |= BUS_DMA_NOWAIT; - *nsegs = 0; - error = 0; - if (m0->m_pkthdr.len <= dmat->maxsize) { - int first = 1; - bus_addr_t lastaddr = 0; - struct mbuf *m; - - for (m = m0; m != NULL && error == 0; m = m->m_next) { - if (m->m_len > 0) { - error = _bus_dmamap_load_buffer(dmat, map, - m->m_data, m->m_len, - NULL, flags, &lastaddr, - segs, nsegs, first); - first = 0; - } - } - } else { - error = EINVAL; - } - - /* XXX FIXME: Having to increment nsegs is really annoying */ - ++*nsegs; - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, *nsegs); - return (error); -} - -int -bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, - bus_dmamap_callback2_t *callback, void *callback_arg, - int flags) -{ - int nsegs, error; - - error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, dmat->segments, &nsegs, - flags); - - if (error) { - /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dmat->segments, 0, 0, error); - } else { - (*callback)(callback_arg, dmat->segments, - nsegs, m0->m_pkthdr.len, error); - } - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs); - return (error); -} - -int -bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, - int flags) -{ - return (_bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags)); -} - -/* - * Like _bus_dmamap_load(), but for uios. - */ -int -bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, - struct uio *uio, - bus_dmamap_callback2_t *callback, void *callback_arg, - int flags) -{ - bus_addr_t lastaddr = 0; - int nsegs, error, first, i; - bus_size_t resid; - struct iovec *iov; - pmap_t pmap; - - flags |= BUS_DMA_NOWAIT; - resid = uio->uio_resid; - iov = uio->uio_iov; - - if (uio->uio_segflg == UIO_USERSPACE) { - KASSERT(uio->uio_td != NULL, - ("bus_dmamap_load_uio: USERSPACE but no proc")); - pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); - } else - pmap = NULL; - - nsegs = 0; - error = 0; - first = 1; - for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { - /* - * Now at the first iovec to load. Load each iovec - * until we have exhausted the residual count. - */ - bus_size_t minlen = - resid < iov[i].iov_len ? resid : iov[i].iov_len; - caddr_t addr = (caddr_t) iov[i].iov_base; - - if (minlen > 0) { - error = _bus_dmamap_load_buffer(dmat, map, - addr, minlen, pmap, flags, &lastaddr, - dmat->segments, &nsegs, first); - first = 0; - - resid -= minlen; - } - } - - if (error) { - /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dmat->segments, 0, 0, error); - } else { - (*callback)(callback_arg, dmat->segments, - nsegs+1, uio->uio_resid, error); - } - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); - return (error); -} - -/* - * Release the mapping held by map. - */ -void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - struct bounce_page *bpage; - - while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { - STAILQ_REMOVE_HEAD(&map->bpages, links); - free_bounce_page(dmat, bpage); - } -} - -void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) -{ - struct bounce_page *bpage; - - if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { - /* - * Handle data bouncing. We might also - * want to add support for invalidating - * the caches on broken hardware - */ - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x " - "performing bounce", __func__, op, dmat, dmat->flags); - - if (op & BUS_DMASYNC_PREWRITE) { - while (bpage != NULL) { - bcopy((void *)bpage->datavaddr, - (void *)bpage->vaddr, - bpage->datacount); - bpage = STAILQ_NEXT(bpage, links); - } - dmat->bounce_zone->total_bounced++; - } - - if (op & BUS_DMASYNC_POSTREAD) { - while (bpage != NULL) { - bcopy((void *)bpage->vaddr, - (void *)bpage->datavaddr, - bpage->datacount); - bpage = STAILQ_NEXT(bpage, links); - } - dmat->bounce_zone->total_bounced++; - } - } -} - -static void -init_bounce_pages(void *dummy __unused) -{ - - total_bpages = 0; - STAILQ_INIT(&bounce_zone_list); - STAILQ_INIT(&bounce_map_waitinglist); - STAILQ_INIT(&bounce_map_callbacklist); - mtx_init(&bounce_lock, "bounce pages lock", NULL, MTX_DEF); -} -SYSINIT(bpages, SI_SUB_LOCK, SI_ORDER_ANY, init_bounce_pages, NULL); - -static struct sysctl_ctx_list * -busdma_sysctl_tree(struct bounce_zone *bz) -{ - return (&bz->sysctl_tree); -} - -static struct sysctl_oid * -busdma_sysctl_tree_top(struct bounce_zone *bz) -{ - return (bz->sysctl_tree_top); -} - -static int -alloc_bounce_zone(bus_dma_tag_t dmat) -{ - struct bounce_zone *bz; - - /* Check to see if we already have a suitable zone */ - STAILQ_FOREACH(bz, &bounce_zone_list, links) { - if ((dmat->alignment <= bz->alignment) - && (dmat->lowaddr >= bz->lowaddr)) { - dmat->bounce_zone = bz; - return (0); - } - } - - if ((bz = (struct bounce_zone *)malloc(sizeof(*bz), M_DEVBUF, - M_NOWAIT | M_ZERO)) == NULL) - return (ENOMEM); - - STAILQ_INIT(&bz->bounce_page_list); - bz->free_bpages = 0; - bz->reserved_bpages = 0; - bz->active_bpages = 0; - bz->lowaddr = dmat->lowaddr; - bz->alignment = MAX(dmat->alignment, PAGE_SIZE); - bz->map_count = 0; - snprintf(bz->zoneid, 8, "zone%d", busdma_zonecount); - busdma_zonecount++; - snprintf(bz->lowaddrid, 18, "%#jx", (uintmax_t)bz->lowaddr); - STAILQ_INSERT_TAIL(&bounce_zone_list, bz, links); - dmat->bounce_zone = bz; - - sysctl_ctx_init(&bz->sysctl_tree); - bz->sysctl_tree_top = SYSCTL_ADD_NODE(&bz->sysctl_tree, - SYSCTL_STATIC_CHILDREN(_hw_busdma), OID_AUTO, bz->zoneid, - CTLFLAG_RD, 0, ""); - if (bz->sysctl_tree_top == NULL) { - sysctl_ctx_free(&bz->sysctl_tree); - return (0); /* XXX error code? */ - } - - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "total_bpages", CTLFLAG_RD, &bz->total_bpages, 0, - "Total bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "free_bpages", CTLFLAG_RD, &bz->free_bpages, 0, - "Free bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "reserved_bpages", CTLFLAG_RD, &bz->reserved_bpages, 0, - "Reserved bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "active_bpages", CTLFLAG_RD, &bz->active_bpages, 0, - "Active bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "total_bounced", CTLFLAG_RD, &bz->total_bounced, 0, - "Total bounce requests"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "total_deferred", CTLFLAG_RD, &bz->total_deferred, 0, - "Total bounce requests that were deferred"); - SYSCTL_ADD_STRING(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "lowaddr", CTLFLAG_RD, bz->lowaddrid, 0, ""); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "alignment", CTLFLAG_RD, &bz->alignment, 0, ""); - - return (0); -} - -static int -alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) -{ - struct bounce_zone *bz; - int count; - - bz = dmat->bounce_zone; - count = 0; - while (numpages > 0) { - struct bounce_page *bpage; - - bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, - M_NOWAIT | M_ZERO); - - if (bpage == NULL) - break; - bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, - M_NOWAIT, 0ul, - bz->lowaddr, - PAGE_SIZE, - 0); - if (bpage->vaddr == 0) { - free(bpage, M_DEVBUF); - break; - } - bpage->busaddr = pmap_kextract(bpage->vaddr); - mtx_lock(&bounce_lock); - STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); - total_bpages++; - bz->total_bpages++; - bz->free_bpages++; - mtx_unlock(&bounce_lock); - count++; - numpages--; - } - return (count); -} - -static int -reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit) -{ - struct bounce_zone *bz; - int pages; - - mtx_assert(&bounce_lock, MA_OWNED); - bz = dmat->bounce_zone; - pages = MIN(bz->free_bpages, map->pagesneeded - map->pagesreserved); - if (commit == 0 && map->pagesneeded > (map->pagesreserved + pages)) - return (map->pagesneeded - (map->pagesreserved + pages)); - bz->free_bpages -= pages; - bz->reserved_bpages += pages; - map->pagesreserved += pages; - pages = map->pagesneeded - map->pagesreserved; - - return (pages); -} - -static bus_addr_t -add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, - bus_size_t size) -{ - struct bounce_zone *bz; - struct bounce_page *bpage; - - KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); - KASSERT(map != NULL && map != &nobounce_dmamap, - ("add_bounce_page: bad map %p", map)); - - bz = dmat->bounce_zone; - if (map->pagesneeded == 0) - panic("add_bounce_page: map doesn't need any pages"); - map->pagesneeded--; - - if (map->pagesreserved == 0) - panic("add_bounce_page: map doesn't need any pages"); - map->pagesreserved--; - - mtx_lock(&bounce_lock); - bpage = STAILQ_FIRST(&bz->bounce_page_list); - if (bpage == NULL) - panic("add_bounce_page: free page list is empty"); - - STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); - bz->reserved_bpages--; - bz->active_bpages++; - mtx_unlock(&bounce_lock); - - if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { - /* Page offset needs to be preserved. */ - bpage->vaddr |= vaddr & PAGE_MASK; - bpage->busaddr |= vaddr & PAGE_MASK; - } - bpage->datavaddr = vaddr; - bpage->datacount = size; - STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); - return (bpage->busaddr); -} - -static void -free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) -{ - struct bus_dmamap *map; - struct bounce_zone *bz; - - bz = dmat->bounce_zone; - bpage->datavaddr = 0; - bpage->datacount = 0; - if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { - /* - * Reset the bounce page to start at offset 0. Other uses - * of this bounce page may need to store a full page of - * data and/or assume it starts on a page boundary. - */ - bpage->vaddr &= ~PAGE_MASK; - bpage->busaddr &= ~PAGE_MASK; - } - - mtx_lock(&bounce_lock); - STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); - bz->free_bpages++; - bz->active_bpages--; - if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) { - if (reserve_bounce_pages(map->dmat, map, 1) == 0) { - STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); - STAILQ_INSERT_TAIL(&bounce_map_callbacklist, - map, links); - busdma_swi_pending = 1; - bz->total_deferred++; - swi_sched(vm_ih, 0); - } - } - mtx_unlock(&bounce_lock); -} - -void -busdma_swi(void) -{ - bus_dma_tag_t dmat; - struct bus_dmamap *map; - - mtx_lock(&bounce_lock); - while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { - STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); - mtx_unlock(&bounce_lock); - dmat = map->dmat; - (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK); - bus_dmamap_load(map->dmat, map, map->buf, map->buflen, - map->callback, map->callback_arg, /*flags*/0); - (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK); - mtx_lock(&bounce_lock); - } - mtx_unlock(&bounce_lock); -} diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index 66abeb8..2b56a15 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -97,7 +97,6 @@ amd64/amd64/atomic.c standard amd64/amd64/autoconf.c standard amd64/amd64/bios.c standard amd64/amd64/bpf_jit_machdep.c optional bpf_jitter -amd64/amd64/busdma_machdep.c standard amd64/amd64/cpu_switch.S standard amd64/amd64/db_disasm.c optional ddb amd64/amd64/db_interface.c optional ddb @@ -317,6 +316,7 @@ x86/isa/isa_dma.c standard x86/isa/nmi.c standard x86/isa/orm.c optional isa x86/pci/qpi.c standard +x86/x86/busdma_machdep.c standard x86/x86/dump_machdep.c standard x86/x86/io_apic.c standard x86/x86/local_apic.c standard diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 2c39d58..179306b 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -272,7 +272,6 @@ i386/i386/autoconf.c standard i386/i386/bios.c optional native i386/i386/bioscall.s optional native i386/i386/bpf_jit_machdep.c optional bpf_jitter -i386/i386/busdma_machdep.c standard i386/i386/db_disasm.c optional ddb i386/i386/db_interface.c optional ddb i386/i386/db_trace.c optional ddb @@ -406,6 +405,7 @@ x86/isa/isa_dma.c optional isa x86/isa/nmi.c standard x86/isa/orm.c optional isa x86/pci/qpi.c standard +x86/x86/busdma_machdep.c standard x86/x86/dump_machdep.c standard x86/x86/io_apic.c optional apic x86/x86/local_apic.c optional apic diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98 index a9c73da..158fbbd 100644 --- a/sys/conf/files.pc98 +++ b/sys/conf/files.pc98 @@ -134,7 +134,6 @@ i386/i386/autoconf.c standard i386/i386/bios.c standard i386/i386/bioscall.s standard i386/i386/bpf_jit_machdep.c optional bpf_jitter -i386/i386/busdma_machdep.c standard i386/i386/db_disasm.c optional ddb i386/i386/db_interface.c optional ddb i386/i386/db_trace.c optional ddb @@ -250,6 +249,7 @@ pc98/pc98/pc98_machdep.c standard x86/isa/atpic.c optional atpic x86/isa/clock.c standard x86/isa/isa.c optional isa +x86/x86/busdma_machdep.c standard x86/x86/dump_machdep.c standard x86/x86/io_apic.c optional apic x86/x86/local_apic.c optional apic diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c deleted file mode 100644 index feca1a6..0000000 --- a/sys/i386/i386/busdma_machdep.c +++ /dev/null @@ -1,1222 +0,0 @@ -/*- - * Copyright (c) 1997, 1998 Justin T. Gibbs. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#ifdef __i386__ -#define MAX_BPAGES 512 -#else -#define MAX_BPAGES 8192 -#endif -#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 -#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 - -struct bounce_zone; - -struct bus_dma_tag { - bus_dma_tag_t parent; - bus_size_t alignment; - bus_size_t boundary; - bus_addr_t lowaddr; - bus_addr_t highaddr; - bus_dma_filter_t *filter; - void *filterarg; - bus_size_t maxsize; - u_int nsegments; - bus_size_t maxsegsz; - int flags; - int ref_count; - int map_count; - bus_dma_lock_t *lockfunc; - void *lockfuncarg; - bus_dma_segment_t *segments; - struct bounce_zone *bounce_zone; -}; - -struct bounce_page { - vm_offset_t vaddr; /* kva of bounce buffer */ - bus_addr_t busaddr; /* Physical address */ - vm_offset_t datavaddr; /* kva of client data */ - bus_size_t datacount; /* client data count */ - STAILQ_ENTRY(bounce_page) links; -}; - -int busdma_swi_pending; - -struct bounce_zone { - STAILQ_ENTRY(bounce_zone) links; - STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; - int total_bpages; - int free_bpages; - int reserved_bpages; - int active_bpages; - int total_bounced; - int total_deferred; - int map_count; - bus_size_t alignment; - bus_addr_t lowaddr; - char zoneid[8]; - char lowaddrid[20]; - struct sysctl_ctx_list sysctl_tree; - struct sysctl_oid *sysctl_tree_top; -}; - -static struct mtx bounce_lock; -static int total_bpages; -static int busdma_zonecount; -static STAILQ_HEAD(, bounce_zone) bounce_zone_list; - -SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters"); -SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0, - "Total bounce pages"); - -struct bus_dmamap { - struct bp_list bpages; - int pagesneeded; - int pagesreserved; - bus_dma_tag_t dmat; - void *buf; /* unmapped buffer pointer */ - bus_size_t buflen; /* unmapped buffer length */ - bus_dmamap_callback_t *callback; - void *callback_arg; - STAILQ_ENTRY(bus_dmamap) links; -}; - -static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; -static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; -static struct bus_dmamap nobounce_dmamap; - -static void init_bounce_pages(void *dummy); -static int alloc_bounce_zone(bus_dma_tag_t dmat); -static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); -static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, - int commit); -static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, - vm_offset_t vaddr, bus_size_t size); -static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); -int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); -int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, - void *buf, bus_size_t buflen, int flags); - -#ifdef XEN -#undef pmap_kextract -#define pmap_kextract pmap_kextract_ma -#endif - -/* - * Return true if a match is made. - * - * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'. - * - * If paddr is within the bounds of the dma tag then call the filter callback - * to check for a match, if there is no filter callback then assume a match. - */ -int -run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) -{ - int retval; - - retval = 0; - - do { - if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) - || ((paddr & (dmat->alignment - 1)) != 0)) - && (dmat->filter == NULL - || (*dmat->filter)(dmat->filterarg, paddr) != 0)) - retval = 1; - - dmat = dmat->parent; - } while (retval == 0 && dmat != NULL); - return (retval); -} - -/* - * Convenience function for manipulating driver locks from busdma (during - * busdma_swi, for example). Drivers that don't provide their own locks - * should specify &Giant to dmat->lockfuncarg. Drivers that use their own - * non-mutex locking scheme don't have to use this at all. - */ -void -busdma_lock_mutex(void *arg, bus_dma_lock_op_t op) -{ - struct mtx *dmtx; - - dmtx = (struct mtx *)arg; - switch (op) { - case BUS_DMA_LOCK: - mtx_lock(dmtx); - break; - case BUS_DMA_UNLOCK: - mtx_unlock(dmtx); - break; - default: - panic("Unknown operation 0x%x for busdma_lock_mutex!", op); - } -} - -/* - * dflt_lock should never get called. It gets put into the dma tag when - * lockfunc == NULL, which is only valid if the maps that are associated - * with the tag are meant to never be defered. - * XXX Should have a way to identify which driver is responsible here. - */ -static void -dflt_lock(void *arg, bus_dma_lock_op_t op) -{ - panic("driver error: busdma dflt_lock called"); -} - -/* - * Allocate a device specific dma_tag. - */ -int -bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, - bus_size_t boundary, bus_addr_t lowaddr, - bus_addr_t highaddr, bus_dma_filter_t *filter, - void *filterarg, bus_size_t maxsize, int nsegments, - bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc, - void *lockfuncarg, bus_dma_tag_t *dmat) -{ - bus_dma_tag_t newtag; - int error = 0; - - /* Basic sanity checking */ - if (boundary != 0 && boundary < maxsegsz) - maxsegsz = boundary; - - if (maxsegsz == 0) { - return (EINVAL); - } - - /* Return a NULL tag on failure */ - *dmat = NULL; - - newtag = (bus_dma_tag_t)malloc(sizeof(*newtag), M_DEVBUF, - M_ZERO | M_NOWAIT); - if (newtag == NULL) { - CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", - __func__, newtag, 0, error); - return (ENOMEM); - } - - newtag->parent = parent; - newtag->alignment = alignment; - newtag->boundary = boundary; - newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); - newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + (PAGE_SIZE - 1); - newtag->filter = filter; - newtag->filterarg = filterarg; - newtag->maxsize = maxsize; - newtag->nsegments = nsegments; - newtag->maxsegsz = maxsegsz; - newtag->flags = flags; - newtag->ref_count = 1; /* Count ourself */ - newtag->map_count = 0; - if (lockfunc != NULL) { - newtag->lockfunc = lockfunc; - newtag->lockfuncarg = lockfuncarg; - } else { - newtag->lockfunc = dflt_lock; - newtag->lockfuncarg = NULL; - } - newtag->segments = NULL; - - /* Take into account any restrictions imposed by our parent tag */ - if (parent != NULL) { - newtag->lowaddr = MIN(parent->lowaddr, newtag->lowaddr); - newtag->highaddr = MAX(parent->highaddr, newtag->highaddr); - if (newtag->boundary == 0) - newtag->boundary = parent->boundary; - else if (parent->boundary != 0) - newtag->boundary = MIN(parent->boundary, - newtag->boundary); - if ((newtag->filter != NULL) || - ((parent->flags & BUS_DMA_COULD_BOUNCE) != 0)) - newtag->flags |= BUS_DMA_COULD_BOUNCE; - if (newtag->filter == NULL) { - /* - * Short circuit looking at our parent directly - * since we have encapsulated all of its information - */ - newtag->filter = parent->filter; - newtag->filterarg = parent->filterarg; - newtag->parent = parent->parent; - } - if (newtag->parent != NULL) - atomic_add_int(&parent->ref_count, 1); - } - - if (newtag->lowaddr < ptoa((vm_paddr_t)Maxmem) - || newtag->alignment > 1) - newtag->flags |= BUS_DMA_COULD_BOUNCE; - - if (((newtag->flags & BUS_DMA_COULD_BOUNCE) != 0) && - (flags & BUS_DMA_ALLOCNOW) != 0) { - struct bounce_zone *bz; - - /* Must bounce */ - - if ((error = alloc_bounce_zone(newtag)) != 0) { - free(newtag, M_DEVBUF); - return (error); - } - bz = newtag->bounce_zone; - - if (ptoa(bz->total_bpages) < maxsize) { - int pages; - - pages = atop(maxsize) - bz->total_bpages; - - /* Add pages to our bounce pool */ - if (alloc_bounce_pages(newtag, pages) < pages) - error = ENOMEM; - } - /* Performed initial allocation */ - newtag->flags |= BUS_DMA_MIN_ALLOC_COMP; - } - - if (error != 0) { - free(newtag, M_DEVBUF); - } else { - *dmat = newtag; - } - CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", - __func__, newtag, (newtag != NULL ? newtag->flags : 0), error); - return (error); -} - -int -bus_dma_tag_destroy(bus_dma_tag_t dmat) -{ - bus_dma_tag_t dmat_copy; - int error; - - error = 0; - dmat_copy = dmat; - - if (dmat != NULL) { - - if (dmat->map_count != 0) { - error = EBUSY; - goto out; - } - - while (dmat != NULL) { - bus_dma_tag_t parent; - - parent = dmat->parent; - atomic_subtract_int(&dmat->ref_count, 1); - if (dmat->ref_count == 0) { - if (dmat->segments != NULL) - free(dmat->segments, M_DEVBUF); - free(dmat, M_DEVBUF); - /* - * Last reference count, so - * release our reference - * count on our parent. - */ - dmat = parent; - } else - dmat = NULL; - } - } -out: - CTR3(KTR_BUSDMA, "%s tag %p error %d", __func__, dmat_copy, error); - return (error); -} - -/* - * Allocate a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) -{ - int error; - - error = 0; - - if (dmat->segments == NULL) { - dmat->segments = (bus_dma_segment_t *)malloc( - sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, - M_NOWAIT); - if (dmat->segments == NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, ENOMEM); - return (ENOMEM); - } - } - - /* - * Bouncing might be required if the driver asks for an active - * exclusion region, a data alignment that is stricter than 1, and/or - * an active address boundary. - */ - if (dmat->flags & BUS_DMA_COULD_BOUNCE) { - - /* Must bounce */ - struct bounce_zone *bz; - int maxpages; - - if (dmat->bounce_zone == NULL) { - if ((error = alloc_bounce_zone(dmat)) != 0) - return (error); - } - bz = dmat->bounce_zone; - - *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, - M_NOWAIT | M_ZERO); - if (*mapp == NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, ENOMEM); - return (ENOMEM); - } - - /* Initialize the new map */ - STAILQ_INIT(&((*mapp)->bpages)); - - /* - * Attempt to add pages to our pool on a per-instance - * basis up to a sane limit. - */ - if (dmat->alignment > 1) - maxpages = MAX_BPAGES; - else - maxpages = MIN(MAX_BPAGES, Maxmem -atop(dmat->lowaddr)); - if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 - || (bz->map_count > 0 && bz->total_bpages < maxpages)) { - int pages; - - pages = MAX(atop(dmat->maxsize), 1); - pages = MIN(maxpages - bz->total_bpages, pages); - pages = MAX(pages, 1); - if (alloc_bounce_pages(dmat, pages) < pages) - error = ENOMEM; - - if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0) { - if (error == 0) - dmat->flags |= BUS_DMA_MIN_ALLOC_COMP; - } else { - error = 0; - } - } - bz->map_count++; - } else { - *mapp = NULL; - } - if (error == 0) - dmat->map_count++; - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, error); - return (error); -} - -/* - * Destroy a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - if (map != NULL && map != &nobounce_dmamap) { - if (STAILQ_FIRST(&map->bpages) != NULL) { - CTR3(KTR_BUSDMA, "%s: tag %p error %d", - __func__, dmat, EBUSY); - return (EBUSY); - } - if (dmat->bounce_zone) - dmat->bounce_zone->map_count--; - free(map, M_DEVBUF); - } - dmat->map_count--; - CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); - return (0); -} - - -/* - * Allocate a piece of memory that can be efficiently mapped into - * bus device space based on the constraints lited in the dma tag. - * A dmamap to for use with dmamap_load is also allocated. - */ -int -bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, - bus_dmamap_t *mapp) -{ - int mflags; - - if (flags & BUS_DMA_NOWAIT) - mflags = M_NOWAIT; - else - mflags = M_WAITOK; - - /* If we succeed, no mapping/bouncing will be required */ - *mapp = NULL; - - if (dmat->segments == NULL) { - dmat->segments = (bus_dma_segment_t *)malloc( - sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, - mflags); - if (dmat->segments == NULL) { - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, ENOMEM); - return (ENOMEM); - } - } - if (flags & BUS_DMA_ZERO) - mflags |= M_ZERO; - - /* - * XXX: - * (dmat->alignment < dmat->maxsize) is just a quick hack; the exact - * alignment guarantees of malloc need to be nailed down, and the - * code below should be rewritten to take that into account. - * - * In the meantime, we'll warn the user if malloc gets it wrong. - */ - if ((dmat->maxsize <= PAGE_SIZE) && - (dmat->alignment < dmat->maxsize) && - dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) { - *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); - } else { - /* - * XXX Use Contigmalloc until it is merged into this facility - * and handles multi-seg allocations. Nobody is doing - * multi-seg allocations yet though. - * XXX Certain AGP hardware does. - */ - *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags, - 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, - dmat->boundary); - } - if (*vaddr == NULL) { - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, ENOMEM); - return (ENOMEM); - } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { - printf("bus_dmamem_alloc failed to align memory properly.\n"); - } - if (flags & BUS_DMA_NOCACHE) - pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, - PAT_UNCACHEABLE); - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", - __func__, dmat, dmat->flags, 0); - return (0); -} - -/* - * Free a piece of memory and it's allociated dmamap, that was allocated - * via bus_dmamem_alloc. Make the same choice for free/contigfree. - */ -void -bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) -{ - /* - * dmamem does not need to be bounced, so the map should be - * NULL - */ - if (map != NULL) - panic("bus_dmamem_free: Invalid map freed\n"); - pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, PAT_WRITE_BACK); - if ((dmat->maxsize <= PAGE_SIZE) && - (dmat->alignment < dmat->maxsize) && - dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) - free(vaddr, M_DEVBUF); - else { - contigfree(vaddr, dmat->maxsize, M_DEVBUF); - } - CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags); -} - -int -_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, - void *buf, bus_size_t buflen, int flags) -{ - vm_offset_t vaddr; - vm_offset_t vendaddr; - bus_addr_t paddr; - - if ((map != &nobounce_dmamap && map->pagesneeded == 0)) { - CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " - "alignment= %d", dmat->lowaddr, ptoa((vm_paddr_t)Maxmem), - dmat->boundary, dmat->alignment); - CTR3(KTR_BUSDMA, "map= %p, nobouncemap= %p, pagesneeded= %d", - map, &nobounce_dmamap, map->pagesneeded); - /* - * Count the number of bounce pages - * needed in order to complete this transfer - */ - vaddr = (vm_offset_t)buf; - vendaddr = (vm_offset_t)buf + buflen; - - while (vaddr < vendaddr) { - bus_size_t sg_len; - - sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); - if (pmap) - paddr = pmap_extract(pmap, vaddr); - else - paddr = pmap_kextract(vaddr); - if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && - run_filter(dmat, paddr) != 0) { - sg_len = roundup2(sg_len, dmat->alignment); - map->pagesneeded++; - } - vaddr += sg_len; - } - CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded); - } - - /* Reserve Necessary Bounce Pages */ - if (map->pagesneeded != 0) { - mtx_lock(&bounce_lock); - if (flags & BUS_DMA_NOWAIT) { - if (reserve_bounce_pages(dmat, map, 0) != 0) { - mtx_unlock(&bounce_lock); - return (ENOMEM); - } - } else { - if (reserve_bounce_pages(dmat, map, 1) != 0) { - /* Queue us for resources */ - map->dmat = dmat; - map->buf = buf; - map->buflen = buflen; - STAILQ_INSERT_TAIL(&bounce_map_waitinglist, - map, links); - mtx_unlock(&bounce_lock); - return (EINPROGRESS); - } - } - mtx_unlock(&bounce_lock); - } - - return (0); -} - -/* - * Utility function to load a linear buffer. lastaddrp holds state - * between invocations (for multiple-buffer loads). segp contains - * the starting segment on entrace, and the ending segment on exit. - * first indicates if this is the first invocation of this function. - */ -static __inline int -_bus_dmamap_load_buffer(bus_dma_tag_t dmat, - bus_dmamap_t map, - void *buf, bus_size_t buflen, - pmap_t pmap, - int flags, - bus_addr_t *lastaddrp, - bus_dma_segment_t *segs, - int *segp, - int first) -{ - bus_size_t sgsize; - bus_addr_t curaddr, lastaddr, baddr, bmask; - vm_offset_t vaddr; - int seg, error; - - if (map == NULL) - map = &nobounce_dmamap; - - if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) { - error = _bus_dmamap_count_pages(dmat, map, pmap, buf, buflen, flags); - if (error) - return (error); - } - - vaddr = (vm_offset_t)buf; - lastaddr = *lastaddrp; - bmask = ~(dmat->boundary - 1); - - for (seg = *segp; buflen > 0 ; ) { - bus_size_t max_sgsize; - - /* - * Get the physical address for this segment. - */ - if (pmap) - curaddr = pmap_extract(pmap, vaddr); - else - curaddr = pmap_kextract(vaddr); - - /* - * Compute the segment size, and adjust counts. - */ - max_sgsize = MIN(buflen, dmat->maxsegsz); - sgsize = PAGE_SIZE - ((vm_offset_t)curaddr & PAGE_MASK); - if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && - map->pagesneeded != 0 && run_filter(dmat, curaddr)) { - sgsize = roundup2(sgsize, dmat->alignment); - sgsize = MIN(sgsize, max_sgsize); - curaddr = add_bounce_page(dmat, map, vaddr, sgsize); - } else { - sgsize = MIN(sgsize, max_sgsize); - } - - /* - * Make sure we don't cross any boundaries. - */ - if (dmat->boundary > 0) { - baddr = (curaddr + dmat->boundary) & bmask; - if (sgsize > (baddr - curaddr)) - sgsize = (baddr - curaddr); - } - - /* - * Insert chunk into a segment, coalescing with - * previous segment if possible. - */ - if (first) { - segs[seg].ds_addr = curaddr; - segs[seg].ds_len = sgsize; - first = 0; - } else { - if (curaddr == lastaddr && - (segs[seg].ds_len + sgsize) <= dmat->maxsegsz && - (dmat->boundary == 0 || - (segs[seg].ds_addr & bmask) == (curaddr & bmask))) - segs[seg].ds_len += sgsize; - else { - if (++seg >= dmat->nsegments) - break; - segs[seg].ds_addr = curaddr; - segs[seg].ds_len = sgsize; - } - } - - lastaddr = curaddr + sgsize; - vaddr += sgsize; - buflen -= sgsize; - } - - *segp = seg; - *lastaddrp = lastaddr; - - /* - * Did we fit? - */ - return (buflen != 0 ? EFBIG : 0); /* XXX better return value here? */ -} - -/* - * Map the buffer buf into bus space using the dmamap map. - */ -int -bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, bus_dmamap_callback_t *callback, - void *callback_arg, int flags) -{ - bus_addr_t lastaddr = 0; - int error, nsegs = 0; - - if (map != NULL) { - flags |= BUS_DMA_WAITOK; - map->callback = callback; - map->callback_arg = callback_arg; - } - - error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, - &lastaddr, dmat->segments, &nsegs, 1); - - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); - - if (error == EINPROGRESS) { - return (error); - } - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs + 1, 0); - - /* - * Return ENOMEM to the caller so that it can pass it up the stack. - * This error only happens when NOWAIT is set, so deferal is disabled. - */ - if (error == ENOMEM) - return (error); - - return (0); -} - - -/* - * Like _bus_dmamap_load(), but for mbufs. - */ -static __inline int -_bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, - int flags) -{ - int error; - - M_ASSERTPKTHDR(m0); - - flags |= BUS_DMA_NOWAIT; - *nsegs = 0; - error = 0; - if (m0->m_pkthdr.len <= dmat->maxsize) { - int first = 1; - bus_addr_t lastaddr = 0; - struct mbuf *m; - - for (m = m0; m != NULL && error == 0; m = m->m_next) { - if (m->m_len > 0) { - error = _bus_dmamap_load_buffer(dmat, map, - m->m_data, m->m_len, - NULL, flags, &lastaddr, - segs, nsegs, first); - first = 0; - } - } - } else { - error = EINVAL; - } - - /* XXX FIXME: Having to increment nsegs is really annoying */ - ++*nsegs; - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, *nsegs); - return (error); -} - -int -bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, - bus_dmamap_callback2_t *callback, void *callback_arg, - int flags) -{ - int nsegs, error; - - error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, dmat->segments, &nsegs, - flags); - - if (error) { - /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dmat->segments, 0, 0, error); - } else { - (*callback)(callback_arg, dmat->segments, - nsegs, m0->m_pkthdr.len, error); - } - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs); - return (error); -} - -int -bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, - struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, - int flags) -{ - return (_bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags)); -} - -/* - * Like _bus_dmamap_load(), but for uios. - */ -int -bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, - struct uio *uio, - bus_dmamap_callback2_t *callback, void *callback_arg, - int flags) -{ - bus_addr_t lastaddr = 0; - int nsegs, error, first, i; - bus_size_t resid; - struct iovec *iov; - pmap_t pmap; - - flags |= BUS_DMA_NOWAIT; - resid = uio->uio_resid; - iov = uio->uio_iov; - - if (uio->uio_segflg == UIO_USERSPACE) { - KASSERT(uio->uio_td != NULL, - ("bus_dmamap_load_uio: USERSPACE but no proc")); - pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); - } else - pmap = NULL; - - nsegs = 0; - error = 0; - first = 1; - for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { - /* - * Now at the first iovec to load. Load each iovec - * until we have exhausted the residual count. - */ - bus_size_t minlen = - resid < iov[i].iov_len ? resid : iov[i].iov_len; - caddr_t addr = (caddr_t) iov[i].iov_base; - - if (minlen > 0) { - error = _bus_dmamap_load_buffer(dmat, map, - addr, minlen, pmap, flags, &lastaddr, - dmat->segments, &nsegs, first); - first = 0; - - resid -= minlen; - } - } - - if (error) { - /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dmat->segments, 0, 0, error); - } else { - (*callback)(callback_arg, dmat->segments, - nsegs+1, uio->uio_resid, error); - } - CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", - __func__, dmat, dmat->flags, error, nsegs + 1); - return (error); -} - -/* - * Release the mapping held by map. - */ -void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - struct bounce_page *bpage; - - while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { - STAILQ_REMOVE_HEAD(&map->bpages, links); - free_bounce_page(dmat, bpage); - } -} - -void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) -{ - struct bounce_page *bpage; - - if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { - /* - * Handle data bouncing. We might also - * want to add support for invalidating - * the caches on broken hardware - */ - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x " - "performing bounce", __func__, op, dmat, dmat->flags); - - if (op & BUS_DMASYNC_PREWRITE) { - while (bpage != NULL) { - bcopy((void *)bpage->datavaddr, - (void *)bpage->vaddr, - bpage->datacount); - bpage = STAILQ_NEXT(bpage, links); - } - dmat->bounce_zone->total_bounced++; - } - - if (op & BUS_DMASYNC_POSTREAD) { - while (bpage != NULL) { - bcopy((void *)bpage->vaddr, - (void *)bpage->datavaddr, - bpage->datacount); - bpage = STAILQ_NEXT(bpage, links); - } - dmat->bounce_zone->total_bounced++; - } - } -} - -static void -init_bounce_pages(void *dummy __unused) -{ - - total_bpages = 0; - STAILQ_INIT(&bounce_zone_list); - STAILQ_INIT(&bounce_map_waitinglist); - STAILQ_INIT(&bounce_map_callbacklist); - mtx_init(&bounce_lock, "bounce pages lock", NULL, MTX_DEF); -} -SYSINIT(bpages, SI_SUB_LOCK, SI_ORDER_ANY, init_bounce_pages, NULL); - -static struct sysctl_ctx_list * -busdma_sysctl_tree(struct bounce_zone *bz) -{ - return (&bz->sysctl_tree); -} - -static struct sysctl_oid * -busdma_sysctl_tree_top(struct bounce_zone *bz) -{ - return (bz->sysctl_tree_top); -} - -static int -alloc_bounce_zone(bus_dma_tag_t dmat) -{ - struct bounce_zone *bz; - - /* Check to see if we already have a suitable zone */ - STAILQ_FOREACH(bz, &bounce_zone_list, links) { - if ((dmat->alignment <= bz->alignment) - && (dmat->lowaddr >= bz->lowaddr)) { - dmat->bounce_zone = bz; - return (0); - } - } - - if ((bz = (struct bounce_zone *)malloc(sizeof(*bz), M_DEVBUF, - M_NOWAIT | M_ZERO)) == NULL) - return (ENOMEM); - - STAILQ_INIT(&bz->bounce_page_list); - bz->free_bpages = 0; - bz->reserved_bpages = 0; - bz->active_bpages = 0; - bz->lowaddr = dmat->lowaddr; - bz->alignment = MAX(dmat->alignment, PAGE_SIZE); - bz->map_count = 0; - snprintf(bz->zoneid, 8, "zone%d", busdma_zonecount); - busdma_zonecount++; - snprintf(bz->lowaddrid, 18, "%#jx", (uintmax_t)bz->lowaddr); - STAILQ_INSERT_TAIL(&bounce_zone_list, bz, links); - dmat->bounce_zone = bz; - - sysctl_ctx_init(&bz->sysctl_tree); - bz->sysctl_tree_top = SYSCTL_ADD_NODE(&bz->sysctl_tree, - SYSCTL_STATIC_CHILDREN(_hw_busdma), OID_AUTO, bz->zoneid, - CTLFLAG_RD, 0, ""); - if (bz->sysctl_tree_top == NULL) { - sysctl_ctx_free(&bz->sysctl_tree); - return (0); /* XXX error code? */ - } - - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "total_bpages", CTLFLAG_RD, &bz->total_bpages, 0, - "Total bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "free_bpages", CTLFLAG_RD, &bz->free_bpages, 0, - "Free bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "reserved_bpages", CTLFLAG_RD, &bz->reserved_bpages, 0, - "Reserved bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "active_bpages", CTLFLAG_RD, &bz->active_bpages, 0, - "Active bounce pages"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "total_bounced", CTLFLAG_RD, &bz->total_bounced, 0, - "Total bounce requests"); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "total_deferred", CTLFLAG_RD, &bz->total_deferred, 0, - "Total bounce requests that were deferred"); - SYSCTL_ADD_STRING(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "lowaddr", CTLFLAG_RD, bz->lowaddrid, 0, ""); - SYSCTL_ADD_INT(busdma_sysctl_tree(bz), - SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "alignment", CTLFLAG_RD, &bz->alignment, 0, ""); - - return (0); -} - -static int -alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) -{ - struct bounce_zone *bz; - int count; - - bz = dmat->bounce_zone; - count = 0; - while (numpages > 0) { - struct bounce_page *bpage; - - bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, - M_NOWAIT | M_ZERO); - - if (bpage == NULL) - break; - bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, - M_NOWAIT, 0ul, - bz->lowaddr, - PAGE_SIZE, - 0); - if (bpage->vaddr == 0) { - free(bpage, M_DEVBUF); - break; - } - bpage->busaddr = pmap_kextract(bpage->vaddr); - mtx_lock(&bounce_lock); - STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); - total_bpages++; - bz->total_bpages++; - bz->free_bpages++; - mtx_unlock(&bounce_lock); - count++; - numpages--; - } - return (count); -} - -static int -reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit) -{ - struct bounce_zone *bz; - int pages; - - mtx_assert(&bounce_lock, MA_OWNED); - bz = dmat->bounce_zone; - pages = MIN(bz->free_bpages, map->pagesneeded - map->pagesreserved); - if (commit == 0 && map->pagesneeded > (map->pagesreserved + pages)) - return (map->pagesneeded - (map->pagesreserved + pages)); - bz->free_bpages -= pages; - bz->reserved_bpages += pages; - map->pagesreserved += pages; - pages = map->pagesneeded - map->pagesreserved; - - return (pages); -} - -static bus_addr_t -add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, - bus_size_t size) -{ - struct bounce_zone *bz; - struct bounce_page *bpage; - - KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); - KASSERT(map != NULL && map != &nobounce_dmamap, - ("add_bounce_page: bad map %p", map)); - - bz = dmat->bounce_zone; - if (map->pagesneeded == 0) - panic("add_bounce_page: map doesn't need any pages"); - map->pagesneeded--; - - if (map->pagesreserved == 0) - panic("add_bounce_page: map doesn't need any pages"); - map->pagesreserved--; - - mtx_lock(&bounce_lock); - bpage = STAILQ_FIRST(&bz->bounce_page_list); - if (bpage == NULL) - panic("add_bounce_page: free page list is empty"); - - STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); - bz->reserved_bpages--; - bz->active_bpages++; - mtx_unlock(&bounce_lock); - - if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { - /* Page offset needs to be preserved. */ - bpage->vaddr |= vaddr & PAGE_MASK; - bpage->busaddr |= vaddr & PAGE_MASK; - } - bpage->datavaddr = vaddr; - bpage->datacount = size; - STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); - return (bpage->busaddr); -} - -static void -free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) -{ - struct bus_dmamap *map; - struct bounce_zone *bz; - - bz = dmat->bounce_zone; - bpage->datavaddr = 0; - bpage->datacount = 0; - if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { - /* - * Reset the bounce page to start at offset 0. Other uses - * of this bounce page may need to store a full page of - * data and/or assume it starts on a page boundary. - */ - bpage->vaddr &= ~PAGE_MASK; - bpage->busaddr &= ~PAGE_MASK; - } - - mtx_lock(&bounce_lock); - STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); - bz->free_bpages++; - bz->active_bpages--; - if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) { - if (reserve_bounce_pages(map->dmat, map, 1) == 0) { - STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); - STAILQ_INSERT_TAIL(&bounce_map_callbacklist, - map, links); - busdma_swi_pending = 1; - bz->total_deferred++; - swi_sched(vm_ih, 0); - } - } - mtx_unlock(&bounce_lock); -} - -void -busdma_swi(void) -{ - bus_dma_tag_t dmat; - struct bus_dmamap *map; - - mtx_lock(&bounce_lock); - while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { - STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); - mtx_unlock(&bounce_lock); - dmat = map->dmat; - (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK); - bus_dmamap_load(map->dmat, map, map->buf, map->buflen, - map->callback, map->callback_arg, /*flags*/0); - (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK); - mtx_lock(&bounce_lock); - } - mtx_unlock(&bounce_lock); -} diff --git a/sys/x86/x86/busdma_machdep.c b/sys/x86/x86/busdma_machdep.c new file mode 100644 index 0000000..feca1a6 --- /dev/null +++ b/sys/x86/x86/busdma_machdep.c @@ -0,0 +1,1222 @@ +/*- + * Copyright (c) 1997, 1998 Justin T. Gibbs. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#ifdef __i386__ +#define MAX_BPAGES 512 +#else +#define MAX_BPAGES 8192 +#endif +#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 +#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 + +struct bounce_zone; + +struct bus_dma_tag { + bus_dma_tag_t parent; + bus_size_t alignment; + bus_size_t boundary; + bus_addr_t lowaddr; + bus_addr_t highaddr; + bus_dma_filter_t *filter; + void *filterarg; + bus_size_t maxsize; + u_int nsegments; + bus_size_t maxsegsz; + int flags; + int ref_count; + int map_count; + bus_dma_lock_t *lockfunc; + void *lockfuncarg; + bus_dma_segment_t *segments; + struct bounce_zone *bounce_zone; +}; + +struct bounce_page { + vm_offset_t vaddr; /* kva of bounce buffer */ + bus_addr_t busaddr; /* Physical address */ + vm_offset_t datavaddr; /* kva of client data */ + bus_size_t datacount; /* client data count */ + STAILQ_ENTRY(bounce_page) links; +}; + +int busdma_swi_pending; + +struct bounce_zone { + STAILQ_ENTRY(bounce_zone) links; + STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; + int total_bpages; + int free_bpages; + int reserved_bpages; + int active_bpages; + int total_bounced; + int total_deferred; + int map_count; + bus_size_t alignment; + bus_addr_t lowaddr; + char zoneid[8]; + char lowaddrid[20]; + struct sysctl_ctx_list sysctl_tree; + struct sysctl_oid *sysctl_tree_top; +}; + +static struct mtx bounce_lock; +static int total_bpages; +static int busdma_zonecount; +static STAILQ_HEAD(, bounce_zone) bounce_zone_list; + +SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters"); +SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0, + "Total bounce pages"); + +struct bus_dmamap { + struct bp_list bpages; + int pagesneeded; + int pagesreserved; + bus_dma_tag_t dmat; + void *buf; /* unmapped buffer pointer */ + bus_size_t buflen; /* unmapped buffer length */ + bus_dmamap_callback_t *callback; + void *callback_arg; + STAILQ_ENTRY(bus_dmamap) links; +}; + +static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; +static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; +static struct bus_dmamap nobounce_dmamap; + +static void init_bounce_pages(void *dummy); +static int alloc_bounce_zone(bus_dma_tag_t dmat); +static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); +static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, + int commit); +static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, + vm_offset_t vaddr, bus_size_t size); +static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); +int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); +int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, + void *buf, bus_size_t buflen, int flags); + +#ifdef XEN +#undef pmap_kextract +#define pmap_kextract pmap_kextract_ma +#endif + +/* + * Return true if a match is made. + * + * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'. + * + * If paddr is within the bounds of the dma tag then call the filter callback + * to check for a match, if there is no filter callback then assume a match. + */ +int +run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) +{ + int retval; + + retval = 0; + + do { + if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) + || ((paddr & (dmat->alignment - 1)) != 0)) + && (dmat->filter == NULL + || (*dmat->filter)(dmat->filterarg, paddr) != 0)) + retval = 1; + + dmat = dmat->parent; + } while (retval == 0 && dmat != NULL); + return (retval); +} + +/* + * Convenience function for manipulating driver locks from busdma (during + * busdma_swi, for example). Drivers that don't provide their own locks + * should specify &Giant to dmat->lockfuncarg. Drivers that use their own + * non-mutex locking scheme don't have to use this at all. + */ +void +busdma_lock_mutex(void *arg, bus_dma_lock_op_t op) +{ + struct mtx *dmtx; + + dmtx = (struct mtx *)arg; + switch (op) { + case BUS_DMA_LOCK: + mtx_lock(dmtx); + break; + case BUS_DMA_UNLOCK: + mtx_unlock(dmtx); + break; + default: + panic("Unknown operation 0x%x for busdma_lock_mutex!", op); + } +} + +/* + * dflt_lock should never get called. It gets put into the dma tag when + * lockfunc == NULL, which is only valid if the maps that are associated + * with the tag are meant to never be defered. + * XXX Should have a way to identify which driver is responsible here. + */ +static void +dflt_lock(void *arg, bus_dma_lock_op_t op) +{ + panic("driver error: busdma dflt_lock called"); +} + +/* + * Allocate a device specific dma_tag. + */ +int +bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, + bus_size_t boundary, bus_addr_t lowaddr, + bus_addr_t highaddr, bus_dma_filter_t *filter, + void *filterarg, bus_size_t maxsize, int nsegments, + bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc, + void *lockfuncarg, bus_dma_tag_t *dmat) +{ + bus_dma_tag_t newtag; + int error = 0; + + /* Basic sanity checking */ + if (boundary != 0 && boundary < maxsegsz) + maxsegsz = boundary; + + if (maxsegsz == 0) { + return (EINVAL); + } + + /* Return a NULL tag on failure */ + *dmat = NULL; + + newtag = (bus_dma_tag_t)malloc(sizeof(*newtag), M_DEVBUF, + M_ZERO | M_NOWAIT); + if (newtag == NULL) { + CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", + __func__, newtag, 0, error); + return (ENOMEM); + } + + newtag->parent = parent; + newtag->alignment = alignment; + newtag->boundary = boundary; + newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); + newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + (PAGE_SIZE - 1); + newtag->filter = filter; + newtag->filterarg = filterarg; + newtag->maxsize = maxsize; + newtag->nsegments = nsegments; + newtag->maxsegsz = maxsegsz; + newtag->flags = flags; + newtag->ref_count = 1; /* Count ourself */ + newtag->map_count = 0; + if (lockfunc != NULL) { + newtag->lockfunc = lockfunc; + newtag->lockfuncarg = lockfuncarg; + } else { + newtag->lockfunc = dflt_lock; + newtag->lockfuncarg = NULL; + } + newtag->segments = NULL; + + /* Take into account any restrictions imposed by our parent tag */ + if (parent != NULL) { + newtag->lowaddr = MIN(parent->lowaddr, newtag->lowaddr); + newtag->highaddr = MAX(parent->highaddr, newtag->highaddr); + if (newtag->boundary == 0) + newtag->boundary = parent->boundary; + else if (parent->boundary != 0) + newtag->boundary = MIN(parent->boundary, + newtag->boundary); + if ((newtag->filter != NULL) || + ((parent->flags & BUS_DMA_COULD_BOUNCE) != 0)) + newtag->flags |= BUS_DMA_COULD_BOUNCE; + if (newtag->filter == NULL) { + /* + * Short circuit looking at our parent directly + * since we have encapsulated all of its information + */ + newtag->filter = parent->filter; + newtag->filterarg = parent->filterarg; + newtag->parent = parent->parent; + } + if (newtag->parent != NULL) + atomic_add_int(&parent->ref_count, 1); + } + + if (newtag->lowaddr < ptoa((vm_paddr_t)Maxmem) + || newtag->alignment > 1) + newtag->flags |= BUS_DMA_COULD_BOUNCE; + + if (((newtag->flags & BUS_DMA_COULD_BOUNCE) != 0) && + (flags & BUS_DMA_ALLOCNOW) != 0) { + struct bounce_zone *bz; + + /* Must bounce */ + + if ((error = alloc_bounce_zone(newtag)) != 0) { + free(newtag, M_DEVBUF); + return (error); + } + bz = newtag->bounce_zone; + + if (ptoa(bz->total_bpages) < maxsize) { + int pages; + + pages = atop(maxsize) - bz->total_bpages; + + /* Add pages to our bounce pool */ + if (alloc_bounce_pages(newtag, pages) < pages) + error = ENOMEM; + } + /* Performed initial allocation */ + newtag->flags |= BUS_DMA_MIN_ALLOC_COMP; + } + + if (error != 0) { + free(newtag, M_DEVBUF); + } else { + *dmat = newtag; + } + CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", + __func__, newtag, (newtag != NULL ? newtag->flags : 0), error); + return (error); +} + +int +bus_dma_tag_destroy(bus_dma_tag_t dmat) +{ + bus_dma_tag_t dmat_copy; + int error; + + error = 0; + dmat_copy = dmat; + + if (dmat != NULL) { + + if (dmat->map_count != 0) { + error = EBUSY; + goto out; + } + + while (dmat != NULL) { + bus_dma_tag_t parent; + + parent = dmat->parent; + atomic_subtract_int(&dmat->ref_count, 1); + if (dmat->ref_count == 0) { + if (dmat->segments != NULL) + free(dmat->segments, M_DEVBUF); + free(dmat, M_DEVBUF); + /* + * Last reference count, so + * release our reference + * count on our parent. + */ + dmat = parent; + } else + dmat = NULL; + } + } +out: + CTR3(KTR_BUSDMA, "%s tag %p error %d", __func__, dmat_copy, error); + return (error); +} + +/* + * Allocate a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +int +bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) +{ + int error; + + error = 0; + + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if (dmat->segments == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); + } + } + + /* + * Bouncing might be required if the driver asks for an active + * exclusion region, a data alignment that is stricter than 1, and/or + * an active address boundary. + */ + if (dmat->flags & BUS_DMA_COULD_BOUNCE) { + + /* Must bounce */ + struct bounce_zone *bz; + int maxpages; + + if (dmat->bounce_zone == NULL) { + if ((error = alloc_bounce_zone(dmat)) != 0) + return (error); + } + bz = dmat->bounce_zone; + + *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (*mapp == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); + } + + /* Initialize the new map */ + STAILQ_INIT(&((*mapp)->bpages)); + + /* + * Attempt to add pages to our pool on a per-instance + * basis up to a sane limit. + */ + if (dmat->alignment > 1) + maxpages = MAX_BPAGES; + else + maxpages = MIN(MAX_BPAGES, Maxmem -atop(dmat->lowaddr)); + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 + || (bz->map_count > 0 && bz->total_bpages < maxpages)) { + int pages; + + pages = MAX(atop(dmat->maxsize), 1); + pages = MIN(maxpages - bz->total_bpages, pages); + pages = MAX(pages, 1); + if (alloc_bounce_pages(dmat, pages) < pages) + error = ENOMEM; + + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0) { + if (error == 0) + dmat->flags |= BUS_DMA_MIN_ALLOC_COMP; + } else { + error = 0; + } + } + bz->map_count++; + } else { + *mapp = NULL; + } + if (error == 0) + dmat->map_count++; + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, error); + return (error); +} + +/* + * Destroy a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +int +bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + if (map != NULL && map != &nobounce_dmamap) { + if (STAILQ_FIRST(&map->bpages) != NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, EBUSY); + return (EBUSY); + } + if (dmat->bounce_zone) + dmat->bounce_zone->map_count--; + free(map, M_DEVBUF); + } + dmat->map_count--; + CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); + return (0); +} + + +/* + * Allocate a piece of memory that can be efficiently mapped into + * bus device space based on the constraints lited in the dma tag. + * A dmamap to for use with dmamap_load is also allocated. + */ +int +bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, + bus_dmamap_t *mapp) +{ + int mflags; + + if (flags & BUS_DMA_NOWAIT) + mflags = M_NOWAIT; + else + mflags = M_WAITOK; + + /* If we succeed, no mapping/bouncing will be required */ + *mapp = NULL; + + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + mflags); + if (dmat->segments == NULL) { + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, ENOMEM); + return (ENOMEM); + } + } + if (flags & BUS_DMA_ZERO) + mflags |= M_ZERO; + + /* + * XXX: + * (dmat->alignment < dmat->maxsize) is just a quick hack; the exact + * alignment guarantees of malloc need to be nailed down, and the + * code below should be rewritten to take that into account. + * + * In the meantime, we'll warn the user if malloc gets it wrong. + */ + if ((dmat->maxsize <= PAGE_SIZE) && + (dmat->alignment < dmat->maxsize) && + dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) { + *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); + } else { + /* + * XXX Use Contigmalloc until it is merged into this facility + * and handles multi-seg allocations. Nobody is doing + * multi-seg allocations yet though. + * XXX Certain AGP hardware does. + */ + *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags, + 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, + dmat->boundary); + } + if (*vaddr == NULL) { + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, ENOMEM); + return (ENOMEM); + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { + printf("bus_dmamem_alloc failed to align memory properly.\n"); + } + if (flags & BUS_DMA_NOCACHE) + pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, + PAT_UNCACHEABLE); + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, 0); + return (0); +} + +/* + * Free a piece of memory and it's allociated dmamap, that was allocated + * via bus_dmamem_alloc. Make the same choice for free/contigfree. + */ +void +bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +{ + /* + * dmamem does not need to be bounced, so the map should be + * NULL + */ + if (map != NULL) + panic("bus_dmamem_free: Invalid map freed\n"); + pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, PAT_WRITE_BACK); + if ((dmat->maxsize <= PAGE_SIZE) && + (dmat->alignment < dmat->maxsize) && + dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) + free(vaddr, M_DEVBUF); + else { + contigfree(vaddr, dmat->maxsize, M_DEVBUF); + } + CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags); +} + +int +_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, + void *buf, bus_size_t buflen, int flags) +{ + vm_offset_t vaddr; + vm_offset_t vendaddr; + bus_addr_t paddr; + + if ((map != &nobounce_dmamap && map->pagesneeded == 0)) { + CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " + "alignment= %d", dmat->lowaddr, ptoa((vm_paddr_t)Maxmem), + dmat->boundary, dmat->alignment); + CTR3(KTR_BUSDMA, "map= %p, nobouncemap= %p, pagesneeded= %d", + map, &nobounce_dmamap, map->pagesneeded); + /* + * Count the number of bounce pages + * needed in order to complete this transfer + */ + vaddr = (vm_offset_t)buf; + vendaddr = (vm_offset_t)buf + buflen; + + while (vaddr < vendaddr) { + bus_size_t sg_len; + + sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); + if (pmap) + paddr = pmap_extract(pmap, vaddr); + else + paddr = pmap_kextract(vaddr); + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + run_filter(dmat, paddr) != 0) { + sg_len = roundup2(sg_len, dmat->alignment); + map->pagesneeded++; + } + vaddr += sg_len; + } + CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded); + } + + /* Reserve Necessary Bounce Pages */ + if (map->pagesneeded != 0) { + mtx_lock(&bounce_lock); + if (flags & BUS_DMA_NOWAIT) { + if (reserve_bounce_pages(dmat, map, 0) != 0) { + mtx_unlock(&bounce_lock); + return (ENOMEM); + } + } else { + if (reserve_bounce_pages(dmat, map, 1) != 0) { + /* Queue us for resources */ + map->dmat = dmat; + map->buf = buf; + map->buflen = buflen; + STAILQ_INSERT_TAIL(&bounce_map_waitinglist, + map, links); + mtx_unlock(&bounce_lock); + return (EINPROGRESS); + } + } + mtx_unlock(&bounce_lock); + } + + return (0); +} + +/* + * Utility function to load a linear buffer. lastaddrp holds state + * between invocations (for multiple-buffer loads). segp contains + * the starting segment on entrace, and the ending segment on exit. + * first indicates if this is the first invocation of this function. + */ +static __inline int +_bus_dmamap_load_buffer(bus_dma_tag_t dmat, + bus_dmamap_t map, + void *buf, bus_size_t buflen, + pmap_t pmap, + int flags, + bus_addr_t *lastaddrp, + bus_dma_segment_t *segs, + int *segp, + int first) +{ + bus_size_t sgsize; + bus_addr_t curaddr, lastaddr, baddr, bmask; + vm_offset_t vaddr; + int seg, error; + + if (map == NULL) + map = &nobounce_dmamap; + + if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) { + error = _bus_dmamap_count_pages(dmat, map, pmap, buf, buflen, flags); + if (error) + return (error); + } + + vaddr = (vm_offset_t)buf; + lastaddr = *lastaddrp; + bmask = ~(dmat->boundary - 1); + + for (seg = *segp; buflen > 0 ; ) { + bus_size_t max_sgsize; + + /* + * Get the physical address for this segment. + */ + if (pmap) + curaddr = pmap_extract(pmap, vaddr); + else + curaddr = pmap_kextract(vaddr); + + /* + * Compute the segment size, and adjust counts. + */ + max_sgsize = MIN(buflen, dmat->maxsegsz); + sgsize = PAGE_SIZE - ((vm_offset_t)curaddr & PAGE_MASK); + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + map->pagesneeded != 0 && run_filter(dmat, curaddr)) { + sgsize = roundup2(sgsize, dmat->alignment); + sgsize = MIN(sgsize, max_sgsize); + curaddr = add_bounce_page(dmat, map, vaddr, sgsize); + } else { + sgsize = MIN(sgsize, max_sgsize); + } + + /* + * Make sure we don't cross any boundaries. + */ + if (dmat->boundary > 0) { + baddr = (curaddr + dmat->boundary) & bmask; + if (sgsize > (baddr - curaddr)) + sgsize = (baddr - curaddr); + } + + /* + * Insert chunk into a segment, coalescing with + * previous segment if possible. + */ + if (first) { + segs[seg].ds_addr = curaddr; + segs[seg].ds_len = sgsize; + first = 0; + } else { + if (curaddr == lastaddr && + (segs[seg].ds_len + sgsize) <= dmat->maxsegsz && + (dmat->boundary == 0 || + (segs[seg].ds_addr & bmask) == (curaddr & bmask))) + segs[seg].ds_len += sgsize; + else { + if (++seg >= dmat->nsegments) + break; + segs[seg].ds_addr = curaddr; + segs[seg].ds_len = sgsize; + } + } + + lastaddr = curaddr + sgsize; + vaddr += sgsize; + buflen -= sgsize; + } + + *segp = seg; + *lastaddrp = lastaddr; + + /* + * Did we fit? + */ + return (buflen != 0 ? EFBIG : 0); /* XXX better return value here? */ +} + +/* + * Map the buffer buf into bus space using the dmamap map. + */ +int +bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, + bus_size_t buflen, bus_dmamap_callback_t *callback, + void *callback_arg, int flags) +{ + bus_addr_t lastaddr = 0; + int error, nsegs = 0; + + if (map != NULL) { + flags |= BUS_DMA_WAITOK; + map->callback = callback; + map->callback_arg = callback_arg; + } + + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, + &lastaddr, dmat->segments, &nsegs, 1); + + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, nsegs + 1); + + if (error == EINPROGRESS) { + return (error); + } + + if (error) + (*callback)(callback_arg, dmat->segments, 0, error); + else + (*callback)(callback_arg, dmat->segments, nsegs + 1, 0); + + /* + * Return ENOMEM to the caller so that it can pass it up the stack. + * This error only happens when NOWAIT is set, so deferal is disabled. + */ + if (error == ENOMEM) + return (error); + + return (0); +} + + +/* + * Like _bus_dmamap_load(), but for mbufs. + */ +static __inline int +_bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, + int flags) +{ + int error; + + M_ASSERTPKTHDR(m0); + + flags |= BUS_DMA_NOWAIT; + *nsegs = 0; + error = 0; + if (m0->m_pkthdr.len <= dmat->maxsize) { + int first = 1; + bus_addr_t lastaddr = 0; + struct mbuf *m; + + for (m = m0; m != NULL && error == 0; m = m->m_next) { + if (m->m_len > 0) { + error = _bus_dmamap_load_buffer(dmat, map, + m->m_data, m->m_len, + NULL, flags, &lastaddr, + segs, nsegs, first); + first = 0; + } + } + } else { + error = EINVAL; + } + + /* XXX FIXME: Having to increment nsegs is really annoying */ + ++*nsegs; + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, *nsegs); + return (error); +} + +int +bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, + bus_dmamap_callback2_t *callback, void *callback_arg, + int flags) +{ + int nsegs, error; + + error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, dmat->segments, &nsegs, + flags); + + if (error) { + /* force "no valid mappings" in callback */ + (*callback)(callback_arg, dmat->segments, 0, 0, error); + } else { + (*callback)(callback_arg, dmat->segments, + nsegs, m0->m_pkthdr.len, error); + } + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, nsegs); + return (error); +} + +int +bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, + int flags) +{ + return (_bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags)); +} + +/* + * Like _bus_dmamap_load(), but for uios. + */ +int +bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, + struct uio *uio, + bus_dmamap_callback2_t *callback, void *callback_arg, + int flags) +{ + bus_addr_t lastaddr = 0; + int nsegs, error, first, i; + bus_size_t resid; + struct iovec *iov; + pmap_t pmap; + + flags |= BUS_DMA_NOWAIT; + resid = uio->uio_resid; + iov = uio->uio_iov; + + if (uio->uio_segflg == UIO_USERSPACE) { + KASSERT(uio->uio_td != NULL, + ("bus_dmamap_load_uio: USERSPACE but no proc")); + pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); + } else + pmap = NULL; + + nsegs = 0; + error = 0; + first = 1; + for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { + /* + * Now at the first iovec to load. Load each iovec + * until we have exhausted the residual count. + */ + bus_size_t minlen = + resid < iov[i].iov_len ? resid : iov[i].iov_len; + caddr_t addr = (caddr_t) iov[i].iov_base; + + if (minlen > 0) { + error = _bus_dmamap_load_buffer(dmat, map, + addr, minlen, pmap, flags, &lastaddr, + dmat->segments, &nsegs, first); + first = 0; + + resid -= minlen; + } + } + + if (error) { + /* force "no valid mappings" in callback */ + (*callback)(callback_arg, dmat->segments, 0, 0, error); + } else { + (*callback)(callback_arg, dmat->segments, + nsegs+1, uio->uio_resid, error); + } + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, nsegs + 1); + return (error); +} + +/* + * Release the mapping held by map. + */ +void +_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + struct bounce_page *bpage; + + while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { + STAILQ_REMOVE_HEAD(&map->bpages, links); + free_bounce_page(dmat, bpage); + } +} + +void +_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +{ + struct bounce_page *bpage; + + if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { + /* + * Handle data bouncing. We might also + * want to add support for invalidating + * the caches on broken hardware + */ + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x " + "performing bounce", __func__, op, dmat, dmat->flags); + + if (op & BUS_DMASYNC_PREWRITE) { + while (bpage != NULL) { + bcopy((void *)bpage->datavaddr, + (void *)bpage->vaddr, + bpage->datacount); + bpage = STAILQ_NEXT(bpage, links); + } + dmat->bounce_zone->total_bounced++; + } + + if (op & BUS_DMASYNC_POSTREAD) { + while (bpage != NULL) { + bcopy((void *)bpage->vaddr, + (void *)bpage->datavaddr, + bpage->datacount); + bpage = STAILQ_NEXT(bpage, links); + } + dmat->bounce_zone->total_bounced++; + } + } +} + +static void +init_bounce_pages(void *dummy __unused) +{ + + total_bpages = 0; + STAILQ_INIT(&bounce_zone_list); + STAILQ_INIT(&bounce_map_waitinglist); + STAILQ_INIT(&bounce_map_callbacklist); + mtx_init(&bounce_lock, "bounce pages lock", NULL, MTX_DEF); +} +SYSINIT(bpages, SI_SUB_LOCK, SI_ORDER_ANY, init_bounce_pages, NULL); + +static struct sysctl_ctx_list * +busdma_sysctl_tree(struct bounce_zone *bz) +{ + return (&bz->sysctl_tree); +} + +static struct sysctl_oid * +busdma_sysctl_tree_top(struct bounce_zone *bz) +{ + return (bz->sysctl_tree_top); +} + +static int +alloc_bounce_zone(bus_dma_tag_t dmat) +{ + struct bounce_zone *bz; + + /* Check to see if we already have a suitable zone */ + STAILQ_FOREACH(bz, &bounce_zone_list, links) { + if ((dmat->alignment <= bz->alignment) + && (dmat->lowaddr >= bz->lowaddr)) { + dmat->bounce_zone = bz; + return (0); + } + } + + if ((bz = (struct bounce_zone *)malloc(sizeof(*bz), M_DEVBUF, + M_NOWAIT | M_ZERO)) == NULL) + return (ENOMEM); + + STAILQ_INIT(&bz->bounce_page_list); + bz->free_bpages = 0; + bz->reserved_bpages = 0; + bz->active_bpages = 0; + bz->lowaddr = dmat->lowaddr; + bz->alignment = MAX(dmat->alignment, PAGE_SIZE); + bz->map_count = 0; + snprintf(bz->zoneid, 8, "zone%d", busdma_zonecount); + busdma_zonecount++; + snprintf(bz->lowaddrid, 18, "%#jx", (uintmax_t)bz->lowaddr); + STAILQ_INSERT_TAIL(&bounce_zone_list, bz, links); + dmat->bounce_zone = bz; + + sysctl_ctx_init(&bz->sysctl_tree); + bz->sysctl_tree_top = SYSCTL_ADD_NODE(&bz->sysctl_tree, + SYSCTL_STATIC_CHILDREN(_hw_busdma), OID_AUTO, bz->zoneid, + CTLFLAG_RD, 0, ""); + if (bz->sysctl_tree_top == NULL) { + sysctl_ctx_free(&bz->sysctl_tree); + return (0); /* XXX error code? */ + } + + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "total_bpages", CTLFLAG_RD, &bz->total_bpages, 0, + "Total bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "free_bpages", CTLFLAG_RD, &bz->free_bpages, 0, + "Free bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "reserved_bpages", CTLFLAG_RD, &bz->reserved_bpages, 0, + "Reserved bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "active_bpages", CTLFLAG_RD, &bz->active_bpages, 0, + "Active bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "total_bounced", CTLFLAG_RD, &bz->total_bounced, 0, + "Total bounce requests"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "total_deferred", CTLFLAG_RD, &bz->total_deferred, 0, + "Total bounce requests that were deferred"); + SYSCTL_ADD_STRING(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "lowaddr", CTLFLAG_RD, bz->lowaddrid, 0, ""); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "alignment", CTLFLAG_RD, &bz->alignment, 0, ""); + + return (0); +} + +static int +alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) +{ + struct bounce_zone *bz; + int count; + + bz = dmat->bounce_zone; + count = 0; + while (numpages > 0) { + struct bounce_page *bpage; + + bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, + M_NOWAIT | M_ZERO); + + if (bpage == NULL) + break; + bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, + M_NOWAIT, 0ul, + bz->lowaddr, + PAGE_SIZE, + 0); + if (bpage->vaddr == 0) { + free(bpage, M_DEVBUF); + break; + } + bpage->busaddr = pmap_kextract(bpage->vaddr); + mtx_lock(&bounce_lock); + STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); + total_bpages++; + bz->total_bpages++; + bz->free_bpages++; + mtx_unlock(&bounce_lock); + count++; + numpages--; + } + return (count); +} + +static int +reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit) +{ + struct bounce_zone *bz; + int pages; + + mtx_assert(&bounce_lock, MA_OWNED); + bz = dmat->bounce_zone; + pages = MIN(bz->free_bpages, map->pagesneeded - map->pagesreserved); + if (commit == 0 && map->pagesneeded > (map->pagesreserved + pages)) + return (map->pagesneeded - (map->pagesreserved + pages)); + bz->free_bpages -= pages; + bz->reserved_bpages += pages; + map->pagesreserved += pages; + pages = map->pagesneeded - map->pagesreserved; + + return (pages); +} + +static bus_addr_t +add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, + bus_size_t size) +{ + struct bounce_zone *bz; + struct bounce_page *bpage; + + KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); + KASSERT(map != NULL && map != &nobounce_dmamap, + ("add_bounce_page: bad map %p", map)); + + bz = dmat->bounce_zone; + if (map->pagesneeded == 0) + panic("add_bounce_page: map doesn't need any pages"); + map->pagesneeded--; + + if (map->pagesreserved == 0) + panic("add_bounce_page: map doesn't need any pages"); + map->pagesreserved--; + + mtx_lock(&bounce_lock); + bpage = STAILQ_FIRST(&bz->bounce_page_list); + if (bpage == NULL) + panic("add_bounce_page: free page list is empty"); + + STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); + bz->reserved_bpages--; + bz->active_bpages++; + mtx_unlock(&bounce_lock); + + if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { + /* Page offset needs to be preserved. */ + bpage->vaddr |= vaddr & PAGE_MASK; + bpage->busaddr |= vaddr & PAGE_MASK; + } + bpage->datavaddr = vaddr; + bpage->datacount = size; + STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); + return (bpage->busaddr); +} + +static void +free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) +{ + struct bus_dmamap *map; + struct bounce_zone *bz; + + bz = dmat->bounce_zone; + bpage->datavaddr = 0; + bpage->datacount = 0; + if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { + /* + * Reset the bounce page to start at offset 0. Other uses + * of this bounce page may need to store a full page of + * data and/or assume it starts on a page boundary. + */ + bpage->vaddr &= ~PAGE_MASK; + bpage->busaddr &= ~PAGE_MASK; + } + + mtx_lock(&bounce_lock); + STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); + bz->free_bpages++; + bz->active_bpages--; + if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) { + if (reserve_bounce_pages(map->dmat, map, 1) == 0) { + STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); + STAILQ_INSERT_TAIL(&bounce_map_callbacklist, + map, links); + busdma_swi_pending = 1; + bz->total_deferred++; + swi_sched(vm_ih, 0); + } + } + mtx_unlock(&bounce_lock); +} + +void +busdma_swi(void) +{ + bus_dma_tag_t dmat; + struct bus_dmamap *map; + + mtx_lock(&bounce_lock); + while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { + STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); + mtx_unlock(&bounce_lock); + dmat = map->dmat; + (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK); + bus_dmamap_load(map->dmat, map, map->buf, map->buflen, + map->callback, map->callback_arg, /*flags*/0); + (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK); + mtx_lock(&bounce_lock); + } + mtx_unlock(&bounce_lock); +} -- cgit v1.1 From 012e7effe8b74bcbabfe1dc56b95ee94e3ca056b Mon Sep 17 00:00:00 2001 From: jchandra Date: Thu, 9 Dec 2010 06:54:06 +0000 Subject: swi_vm() for mips. --- sys/mips/mips/vm_machdep.c | 3 +++ sys/vm/vm_page.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/mips/mips/vm_machdep.c b/sys/mips/mips/vm_machdep.c index 73fab5a..b4059e6 100644 --- a/sys/mips/mips/vm_machdep.c +++ b/sys/mips/mips/vm_machdep.c @@ -538,6 +538,9 @@ sf_buf_free(struct sf_buf *sf) void swi_vm(void *dummy) { + + if (busdma_swi_pending) + busdma_swi(); } int diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 1208ea0..095c997 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -430,7 +430,7 @@ vm_page_startup(vm_offset_t vaddr) */ new_end = vm_reserv_startup(&vaddr, new_end, high_water); #endif -#if defined(__amd64__) || defined(__mips__) +#if defined(__amd64__) /* * pmap_map on amd64 and mips can come out of the direct-map, not kvm * like i386, so the pages must be tracked for a crashdump to include -- cgit v1.1 From 8ae51d5a21a1fc98aff0548e431f4a2892128289 Mon Sep 17 00:00:00 2001 From: gonzo Date: Thu, 9 Dec 2010 07:01:03 +0000 Subject: - Populate dump_avail with proper values from phys_avail --- sys/mips/adm5120/adm5120_machdep.c | 3 +++ sys/mips/alchemy/alchemy_machdep.c | 3 +++ sys/mips/atheros/ar71xx_machdep.c | 3 +++ sys/mips/cavium/octeon_machdep.c | 10 +++++++++- sys/mips/idt/idt_machdep.c | 3 +++ sys/mips/malta/malta_machdep.c | 3 +++ sys/mips/rmi/xlr_machdep.c | 7 +++++++ sys/mips/sentry5/s5_machdep.c | 7 ++++++- sys/mips/sibyte/sb_machdep.c | 7 ++++++- 9 files changed, 43 insertions(+), 3 deletions(-) diff --git a/sys/mips/adm5120/adm5120_machdep.c b/sys/mips/adm5120/adm5120_machdep.c index 90a6b90..39440ff 100644 --- a/sys/mips/adm5120/adm5120_machdep.c +++ b/sys/mips/adm5120/adm5120_machdep.c @@ -97,6 +97,9 @@ mips_init(void) phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1] - phys_avail[0]; + physmem = realmem; init_param1(); diff --git a/sys/mips/alchemy/alchemy_machdep.c b/sys/mips/alchemy/alchemy_machdep.c index a94d995..600926a 100644 --- a/sys/mips/alchemy/alchemy_machdep.c +++ b/sys/mips/alchemy/alchemy_machdep.c @@ -97,6 +97,9 @@ mips_init(void) phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1] - phys_avail[0]; + physmem = realmem; init_param1(); diff --git a/sys/mips/atheros/ar71xx_machdep.c b/sys/mips/atheros/ar71xx_machdep.c index ec355cc..c8abc74 100644 --- a/sys/mips/atheros/ar71xx_machdep.c +++ b/sys/mips/atheros/ar71xx_machdep.c @@ -184,6 +184,9 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused, phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1] - phys_avail[0]; + physmem = realmem; /* diff --git a/sys/mips/cavium/octeon_machdep.c b/sys/mips/cavium/octeon_machdep.c index 886595c..839310a 100644 --- a/sys/mips/cavium/octeon_machdep.c +++ b/sys/mips/cavium/octeon_machdep.c @@ -265,7 +265,7 @@ octeon_memory_init(void) { vm_paddr_t phys_end; int64_t addr; - unsigned i; + unsigned i, j; phys_end = round_page(MIPS_KSEG0_TO_PHYS((vm_offset_t)&end)); @@ -274,6 +274,9 @@ octeon_memory_init(void) phys_avail[0] = phys_end; phys_avail[1] = 96 << 20; + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1] - phys_avail[0]; + realmem = physmem = btoc(phys_avail[1] - phys_avail[0]); return; } @@ -314,6 +317,11 @@ octeon_memory_init(void) i += 2; } + for (j = 0; j < i; j += 2) { + dump_avail[j] = phys_avail[j]; + dump_avail[j+1] = phys_avail[j+1] - phys_avail[j]; + } + realmem = physmem; } diff --git a/sys/mips/idt/idt_machdep.c b/sys/mips/idt/idt_machdep.c index 0dfee66..c7f3878 100644 --- a/sys/mips/idt/idt_machdep.c +++ b/sys/mips/idt/idt_machdep.c @@ -167,6 +167,9 @@ platform_start(__register_t a0, __register_t a1, phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1] - phys_avail[0]; + physmem = realmem; /* diff --git a/sys/mips/malta/malta_machdep.c b/sys/mips/malta/malta_machdep.c index 6cbdcd8..f6257dd 100644 --- a/sys/mips/malta/malta_machdep.c +++ b/sys/mips/malta/malta_machdep.c @@ -181,6 +181,9 @@ mips_init(void) phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1] - phys_avail[0]; + physmem = realmem; init_param1(); diff --git a/sys/mips/rmi/xlr_machdep.c b/sys/mips/rmi/xlr_machdep.c index 8f96633..5cc4fc2 100644 --- a/sys/mips/rmi/xlr_machdep.c +++ b/sys/mips/rmi/xlr_machdep.c @@ -363,6 +363,9 @@ xlr_mem_init(void) (void *)phys_avail[0], (void *)phys_avail[1]); + dump_avail[0] = boot_map->physmem_map[0].addr; + dump_avail[1] = boot_map->physmem_map[0].size; + } else { /* * Can't use this code yet, because most of the fixed allocations happen from @@ -390,6 +393,10 @@ xlr_mem_init(void) (void *)phys_avail[j], (void *)phys_avail[j+1]); } + + dump_avail[j] = boot_map->physmem_map[j].addr; + dump_avail[j+1] = boot_map->physmem_map[j].size; + physsz += boot_map->physmem_map[i].size; } } diff --git a/sys/mips/sentry5/s5_machdep.c b/sys/mips/sentry5/s5_machdep.c index 00e6231..9f6bdff 100644 --- a/sys/mips/sentry5/s5_machdep.c +++ b/sys/mips/sentry5/s5_machdep.c @@ -91,7 +91,7 @@ platform_cpu_init() static void mips_init(void) { - int i; + int i, j; printf("entry: mips_init()\n"); @@ -128,6 +128,11 @@ mips_init(void) realmem = btoc(physmem); #endif + for (j = 0; j < i; j += 2) { + dump_avail[j] = phys_avail[j]; + dump_avail[j+1] = phys_avail[j+1] - phys_avail[j]; + } + physmem = realmem; init_param1(); diff --git a/sys/mips/sibyte/sb_machdep.c b/sys/mips/sibyte/sb_machdep.c index ba4b62e9..edf5009 100644 --- a/sys/mips/sibyte/sb_machdep.c +++ b/sys/mips/sibyte/sb_machdep.c @@ -138,7 +138,7 @@ sb_intr_init(int cpuid) static void mips_init(void) { - int i, cfe_mem_idx, tmp; + int i, j, cfe_mem_idx, tmp; uint64_t maxmem; #ifdef CFE_ENV @@ -225,6 +225,11 @@ mips_init(void) realmem = btoc(physmem); #endif + for (j = 0; j < i; j += 2) { + dump_avail[j] = phys_avail[j]; + dump_avail[j+1] = phys_avail[j+1] - phys_avail[j]; + } + physmem = realmem; init_param1(); -- cgit v1.1 From bfd4abe2ac41a7f0176aeb6a6142a41a6384884a Mon Sep 17 00:00:00 2001 From: jchandra Date: Thu, 9 Dec 2010 07:39:06 +0000 Subject: Revert the vm/vm_page.c change in r216317. This adds back changes in r216141, which was reverted by the above check in. --- sys/vm/vm_page.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 095c997..1208ea0 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -430,7 +430,7 @@ vm_page_startup(vm_offset_t vaddr) */ new_end = vm_reserv_startup(&vaddr, new_end, high_water); #endif -#if defined(__amd64__) +#if defined(__amd64__) || defined(__mips__) /* * pmap_map on amd64 and mips can come out of the direct-map, not kvm * like i386, so the pages must be tracked for a crashdump to include -- cgit v1.1 From f62cda71542930a365fdb33253b1349da40fcec6 Mon Sep 17 00:00:00 2001 From: gonzo Date: Thu, 9 Dec 2010 07:47:40 +0000 Subject: - dump_avail layout should be sequence of [start, end) pairs, not . Spotted by: alc@ --- sys/mips/adm5120/adm5120_machdep.c | 2 +- sys/mips/alchemy/alchemy_machdep.c | 2 +- sys/mips/cavium/octeon_machdep.c | 6 ++---- sys/mips/idt/idt_machdep.c | 2 +- sys/mips/malta/malta_machdep.c | 2 +- sys/mips/rmi/xlr_machdep.c | 8 ++++---- sys/mips/sentry5/s5_machdep.c | 4 +--- sys/mips/sibyte/sb_machdep.c | 4 +--- 8 files changed, 12 insertions(+), 18 deletions(-) diff --git a/sys/mips/adm5120/adm5120_machdep.c b/sys/mips/adm5120/adm5120_machdep.c index 39440ff..bc7b7b0 100644 --- a/sys/mips/adm5120/adm5120_machdep.c +++ b/sys/mips/adm5120/adm5120_machdep.c @@ -98,7 +98,7 @@ mips_init(void) phys_avail[1] = ctob(realmem); dump_avail[0] = phys_avail[0]; - dump_avail[1] = phys_avail[1] - phys_avail[0]; + dump_avail[1] = phys_avail[1]; physmem = realmem; diff --git a/sys/mips/alchemy/alchemy_machdep.c b/sys/mips/alchemy/alchemy_machdep.c index 600926a..047fa42 100644 --- a/sys/mips/alchemy/alchemy_machdep.c +++ b/sys/mips/alchemy/alchemy_machdep.c @@ -98,7 +98,7 @@ mips_init(void) phys_avail[1] = ctob(realmem); dump_avail[0] = phys_avail[0]; - dump_avail[1] = phys_avail[1] - phys_avail[0]; + dump_avail[1] = phys_avail[1]; physmem = realmem; diff --git a/sys/mips/cavium/octeon_machdep.c b/sys/mips/cavium/octeon_machdep.c index 839310a..edb92af 100644 --- a/sys/mips/cavium/octeon_machdep.c +++ b/sys/mips/cavium/octeon_machdep.c @@ -275,7 +275,7 @@ octeon_memory_init(void) phys_avail[1] = 96 << 20; dump_avail[0] = phys_avail[0]; - dump_avail[1] = phys_avail[1] - phys_avail[0]; + dump_avail[1] = phys_avail[1]; realmem = physmem = btoc(phys_avail[1] - phys_avail[0]); return; @@ -317,10 +317,8 @@ octeon_memory_init(void) i += 2; } - for (j = 0; j < i; j += 2) { + for (j = 0; j < i; j++) dump_avail[j] = phys_avail[j]; - dump_avail[j+1] = phys_avail[j+1] - phys_avail[j]; - } realmem = physmem; } diff --git a/sys/mips/idt/idt_machdep.c b/sys/mips/idt/idt_machdep.c index c7f3878..6c76c26 100644 --- a/sys/mips/idt/idt_machdep.c +++ b/sys/mips/idt/idt_machdep.c @@ -168,7 +168,7 @@ platform_start(__register_t a0, __register_t a1, phys_avail[1] = ctob(realmem); dump_avail[0] = phys_avail[0]; - dump_avail[1] = phys_avail[1] - phys_avail[0]; + dump_avail[1] = phys_avail[1]; physmem = realmem; diff --git a/sys/mips/malta/malta_machdep.c b/sys/mips/malta/malta_machdep.c index f6257dd..0ff34cb 100644 --- a/sys/mips/malta/malta_machdep.c +++ b/sys/mips/malta/malta_machdep.c @@ -182,7 +182,7 @@ mips_init(void) phys_avail[1] = ctob(realmem); dump_avail[0] = phys_avail[0]; - dump_avail[1] = phys_avail[1] - phys_avail[0]; + dump_avail[1] = phys_avail[1]; physmem = realmem; diff --git a/sys/mips/rmi/xlr_machdep.c b/sys/mips/rmi/xlr_machdep.c index 5cc4fc2..5a5bb79 100644 --- a/sys/mips/rmi/xlr_machdep.c +++ b/sys/mips/rmi/xlr_machdep.c @@ -363,8 +363,8 @@ xlr_mem_init(void) (void *)phys_avail[0], (void *)phys_avail[1]); - dump_avail[0] = boot_map->physmem_map[0].addr; - dump_avail[1] = boot_map->physmem_map[0].size; + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1]; } else { /* @@ -394,8 +394,8 @@ xlr_mem_init(void) (void *)phys_avail[j+1]); } - dump_avail[j] = boot_map->physmem_map[j].addr; - dump_avail[j+1] = boot_map->physmem_map[j].size; + dump_avail[j] = phys_avail[j]; + dump_avail[j+1] = phys_avail[j+1]; physsz += boot_map->physmem_map[i].size; } diff --git a/sys/mips/sentry5/s5_machdep.c b/sys/mips/sentry5/s5_machdep.c index 9f6bdff..4491b93 100644 --- a/sys/mips/sentry5/s5_machdep.c +++ b/sys/mips/sentry5/s5_machdep.c @@ -128,10 +128,8 @@ mips_init(void) realmem = btoc(physmem); #endif - for (j = 0; j < i; j += 2) { + for (j = 0; j < i; j++) dump_avail[j] = phys_avail[j]; - dump_avail[j+1] = phys_avail[j+1] - phys_avail[j]; - } physmem = realmem; diff --git a/sys/mips/sibyte/sb_machdep.c b/sys/mips/sibyte/sb_machdep.c index edf5009..ac30451 100644 --- a/sys/mips/sibyte/sb_machdep.c +++ b/sys/mips/sibyte/sb_machdep.c @@ -225,10 +225,8 @@ mips_init(void) realmem = btoc(physmem); #endif - for (j = 0; j < i; j += 2) { + for (j = 0; j < i; j++) dump_avail[j] = phys_avail[j]; - dump_avail[j+1] = phys_avail[j+1] - phys_avail[j]; - } physmem = realmem; -- cgit v1.1 From 1ed95baa673569e9bf6a6dbf4b1dad18e3c77e7c Mon Sep 17 00:00:00 2001 From: kevlo Date: Thu, 9 Dec 2010 08:36:23 +0000 Subject: Closing fd when it's done Reviewed by: sbruno --- usr.sbin/fwcontrol/fwcontrol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/usr.sbin/fwcontrol/fwcontrol.c b/usr.sbin/fwcontrol/fwcontrol.c index 509d25d..6aa365a 100644 --- a/usr.sbin/fwcontrol/fwcontrol.c +++ b/usr.sbin/fwcontrol/fwcontrol.c @@ -508,6 +508,7 @@ load_crom(char *filename, u_int32_t *p) p, p+1, p+2, p+3, p+4, p+5, p+6, p+7); p += 8; } + fclose(file); } static void -- cgit v1.1 From b5ba1d8e73a8732bac8b21f55ede6f56dac8fcfa Mon Sep 17 00:00:00 2001 From: brucec Date: Thu, 9 Dec 2010 11:37:40 +0000 Subject: Build sade on amd64 as well as i386 and sparc64. --- usr.sbin/Makefile.amd64 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/usr.sbin/Makefile.amd64 b/usr.sbin/Makefile.amd64 index 61f94c4..232831b 100644 --- a/usr.sbin/Makefile.amd64 +++ b/usr.sbin/Makefile.amd64 @@ -27,4 +27,7 @@ SUBDIR+= ndiscvt .endif SUBDIR+= sicontrol SUBDIR+= spkrtest +.if ${MK_SYSINSTALL} != "no" +SUBDIR+= sade +.endif SUBDIR+= zzz -- cgit v1.1 From a8871388a3e0cd7005c8910d76021acd6e66f939 Mon Sep 17 00:00:00 2001 From: syrinx Date: Thu, 9 Dec 2010 12:25:45 +0000 Subject: Unbreak "make installworld" w/ DESTDIR specified PR : kern/152939 --- usr.sbin/bsnmpd/tools/bsnmptools/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usr.sbin/bsnmpd/tools/bsnmptools/Makefile b/usr.sbin/bsnmpd/tools/bsnmptools/Makefile index 311b1a9..94a1cea 100644 --- a/usr.sbin/bsnmpd/tools/bsnmptools/Makefile +++ b/usr.sbin/bsnmpd/tools/bsnmptools/Makefile @@ -17,8 +17,8 @@ DPADD+= ${LIBCRYPTO} LDADD+= -lcrypto .endif -LINKS= ${DESTDIR}/usr/bin/bsnmpget ${DESTDIR}/usr/bin/bsnmpwalk -LINKS+= ${DESTDIR}/usr/bin/bsnmpget ${DESTDIR}/usr/bin/bsnmpset +LINKS= ${BINDIR}/bsnmpget ${BINDIR}/bsnmpwalk +LINKS+= ${BINDIR}/bsnmpget ${BINDIR}/bsnmpset MAN= bsnmpget.1 -- cgit v1.1 From ac0ae73cc591fb887a0639603b9a2675a9c2f5ea Mon Sep 17 00:00:00 2001 From: jchandra Date: Thu, 9 Dec 2010 12:30:13 +0000 Subject: Fix compilation when DEBUG option is enabled. - remove unused code in mips/rmi/xlr_pci.c - remove unused variable in mips/rmi/dev/nlge/if_nlge.c - fix reference to old function in mips/mips/pmap.c Reported by: Prabhath Raman (prabhath at netlogicmicro com) --- sys/mips/mips/pmap.c | 2 +- sys/mips/rmi/dev/nlge/if_nlge.c | 1 - sys/mips/rmi/xlr_pci.c | 7 ------- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index d0cbc73..7b0d09b 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -3098,7 +3098,7 @@ pads(pmap_t pm) va >= VM_MAXUSER_ADDRESS) continue; ptep = pmap_pte(pm, va); - if (pmap_pte_v(ptep)) + if (pte_test(ptep, PTE_V)) printf("%x:%x ", va, *(int *)ptep); } diff --git a/sys/mips/rmi/dev/nlge/if_nlge.c b/sys/mips/rmi/dev/nlge/if_nlge.c index 9ff88ea..5c3dd2f 100644 --- a/sys/mips/rmi/dev/nlge/if_nlge.c +++ b/sys/mips/rmi/dev/nlge/if_nlge.c @@ -213,7 +213,6 @@ static int send_fmn_msg_tx(struct nlge_softc *, struct msgrng_msg *, //#define DEBUG #ifdef DEBUG static int mac_debug = 1; -static int reg_dump = 0; #undef PDEBUG #define PDEBUG(fmt, args...) \ do {\ diff --git a/sys/mips/rmi/xlr_pci.c b/sys/mips/rmi/xlr_pci.c index 3204691..8cdaede 100644 --- a/sys/mips/rmi/xlr_pci.c +++ b/sys/mips/rmi/xlr_pci.c @@ -105,13 +105,6 @@ __FBSDID("$FreeBSD$"); (MSI_MIPS_DATA_TRGRLVL | MSI_MIPS_DATA_DELFIXED | \ MSI_MIPS_DATA_ASSERT | (irq)) -#define DEBUG -#ifdef DEBUG -#define dbg_devprintf device_printf -#else -#define dbg_devprintf(dev, fmt, ...) -#endif - struct xlr_pcib_softc { bus_dma_tag_t sc_pci_dmat; /* PCI DMA tag pointer */ }; -- cgit v1.1 From 0c8713f91e759286a8d540d02e44e0310785b2e9 Mon Sep 17 00:00:00 2001 From: rmacklem Date: Thu, 9 Dec 2010 19:02:23 +0000 Subject: Disable attempts to establish a callback connection from the experimental NFSv4 server to a NFSv4 client when delegations are not being issued, even if the client advertises a callback path. This avoids a problem where a Linux client advertises a callback path that doesn't work, due to a firewall, and then times out an Open attempt before the FreeBSD server gives up its callback connection attempt. (Suggested by drb at karlov.mff.cuni.cz to fix the Linux client problem that he reported on the fs-stable mailing list.) The server should probably have a 1sec timeout on callback connection attempts when there are no delegations issued to the client, but that patch will require changes to the krpc and this serves as a work around until then. Tested by: drb at karlov.mff.cuni.cz MFC after: 5 days --- sys/fs/nfsserver/nfs_nfsdstate.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c index 908c028..9f657d6 100644 --- a/sys/fs/nfsserver/nfs_nfsdstate.c +++ b/sys/fs/nfsserver/nfs_nfsdstate.c @@ -147,12 +147,20 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp, if (nfsrv_openpluslock > NFSRV_V4STATELIMIT) return (NFSERR_RESOURCE); - if ((nd->nd_flag & ND_GSS) && nfsrv_nogsscallback) + if (nfsrv_issuedelegs == 0 || + ((nd->nd_flag & ND_GSS) != 0 && nfsrv_nogsscallback != 0)) /* - * Don't do callbacks for AUTH_GSS. - * (Since these aren't yet debugged, they might cause the - * server to crap out, if they get past the Init call to - * the client.) + * Don't do callbacks when delegations are disabled or + * for AUTH_GSS unless enabled via nfsrv_nogsscallback. + * If establishing a callback connection is attempted + * when a firewall is blocking the callback path, the + * server may wait too long for the connect attempt to + * succeed during the Open. Some clients, such as Linux, + * may timeout and give up on the Open before the server + * replies. Also, since AUTH_GSS callbacks are not + * yet interoperability tested, they might cause the + * server to crap out, if they get past the Init call to + * the client. */ new_clp->lc_program = 0; -- cgit v1.1 From eca7cac32fe13112feffae89181f0f88bb72b7ee Mon Sep 17 00:00:00 2001 From: alc Date: Thu, 9 Dec 2010 20:16:00 +0000 Subject: When r207410 eliminated the acquisition and release of the page queues lock from pmap_extract_and_hold(), it didn't take into account that pmap_pte_quick() sometimes requires the page queues lock to be held. This change reimplements pmap_extract_and_hold() such that it no longer uses pmap_pte_quick(), and thus never requires the page queues lock. For consistency, adopt the same idiom as used by the new implementation of pmap_extract_and_hold() in pmap_extract() and pmap_mincore(). It also happens to make these functions shorter. Fix a style error in pmap_pte(). Reviewed by: kib@ --- sys/i386/i386/pmap.c | 101 ++++++++++++++++++++------------------------------- 1 file changed, 40 insertions(+), 61 deletions(-) diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 7efa29c..b7d3648 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1213,7 +1213,7 @@ pmap_pte(pmap_t pmap, vm_offset_t va) } return (PADDR2 + (i386_btop(va) & (NPTEPG - 1))); } - return (0); + return (NULL); } /* @@ -1291,21 +1291,19 @@ pmap_pte_quick(pmap_t pmap, vm_offset_t va) vm_paddr_t pmap_extract(pmap_t pmap, vm_offset_t va) { + pt_entry_t pte, *ptep; vm_paddr_t rtval; - pt_entry_t *pte; - pd_entry_t pde; rtval = 0; PMAP_LOCK(pmap); - pde = pmap->pm_pdir[va >> PDRSHIFT]; - if (pde != 0) { - if ((pde & PG_PS) != 0) - rtval = (pde & PG_PS_FRAME) | (va & PDRMASK); - else { - pte = pmap_pte(pmap, va); - rtval = (*pte & PG_FRAME) | (va & PAGE_MASK); - pmap_pte_release(pte); - } + ptep = pmap_pte(pmap, va); + pte = (ptep != NULL) ? *ptep : 0; + pmap_pte_release(ptep); + if ((pte & PG_V) != 0) { + if ((pte & PG_PS) != 0) + rtval = (pte & PG_PS_FRAME) | (va & PDRMASK); + else + rtval = (pte & PG_FRAME) | (va & PAGE_MASK); } PMAP_UNLOCK(pmap); return (rtval); @@ -1321,40 +1319,30 @@ pmap_extract(pmap_t pmap, vm_offset_t va) vm_page_t pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) { - pd_entry_t pde; - pt_entry_t pte; + pt_entry_t pte, *ptep; + vm_paddr_t locked_pa, pa; vm_page_t m; - vm_paddr_t pa; - pa = 0; + locked_pa = 0; m = NULL; PMAP_LOCK(pmap); retry: - pde = *pmap_pde(pmap, va); - if (pde != 0) { - if (pde & PG_PS) { - if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) { - if (vm_page_pa_tryrelock(pmap, (pde & PG_PS_FRAME) | - (va & PDRMASK), &pa)) - goto retry; - m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | - (va & PDRMASK)); - vm_page_hold(m); - } - } else { - sched_pin(); - pte = *pmap_pte_quick(pmap, va); - if (pte != 0 && - ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) { - if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME, &pa)) - goto retry; - m = PHYS_TO_VM_PAGE(pte & PG_FRAME); - vm_page_hold(m); - } - sched_unpin(); - } + ptep = pmap_pte(pmap, va); + pte = (ptep != NULL) ? *ptep : 0; + pmap_pte_release(ptep); + if ((pte & PG_V) != 0 && + ((pte & PG_RW) != 0 || (prot & VM_PROT_WRITE) == 0)) { + if ((pte & PG_PS) != 0) { + /* Compute the physical address of the 4KB page. */ + pa = (pte & PG_PS_FRAME) | (va & PG_FRAME & PDRMASK); + } else + pa = pte & PG_FRAME; + if (vm_page_pa_tryrelock(pmap, pa, &locked_pa)) + goto retry; + m = PHYS_TO_VM_PAGE(pa); + vm_page_hold(m); + PA_UNLOCK(locked_pa); } - PA_UNLOCK_COND(pa); PMAP_UNLOCK(pmap); return (m); } @@ -4991,39 +4979,30 @@ pmap_change_attr(vm_offset_t va, vm_size_t size, int mode) int pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) { - pd_entry_t *pdep; pt_entry_t *ptep, pte; vm_paddr_t pa; int val; PMAP_LOCK(pmap); retry: - pdep = pmap_pde(pmap, addr); - if (*pdep != 0) { - if (*pdep & PG_PS) { - pte = *pdep; + ptep = pmap_pte(pmap, addr); + pte = (ptep != NULL) ? *ptep : 0; + pmap_pte_release(ptep); + if ((pte & PG_V) != 0) { + val = MINCORE_INCORE; + if ((pte & PG_PS) != 0) { + val |= MINCORE_SUPER; /* Compute the physical address of the 4KB page. */ - pa = ((*pdep & PG_PS_FRAME) | (addr & PDRMASK)) & - PG_FRAME; - val = MINCORE_SUPER; - } else { - ptep = pmap_pte(pmap, addr); - pte = *ptep; - pmap_pte_release(ptep); + pa = (pte & PG_PS_FRAME) | (addr & PG_FRAME & PDRMASK); + } else pa = pte & PG_FRAME; - val = 0; - } - } else { - pte = 0; - pa = 0; - val = 0; - } - if ((pte & PG_V) != 0) { - val |= MINCORE_INCORE; if ((pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; if ((pte & PG_A) != 0) val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; + } else { + val = 0; + pa = 0; } if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) != (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && -- cgit v1.1 From c3ffedd66b60efcf18ea15901fee16f8cbd58649 Mon Sep 17 00:00:00 2001 From: jhb Date: Thu, 9 Dec 2010 20:28:30 +0000 Subject: When reopening a stream backed by an open file descriptor, do not close the existing file descriptor. Instead, let dup2() atomically close the old file descriptor when assigning the newly opened file to the same descriptor. This closes a race in a multithreaded application where a concurrent open() could allocate the existing file descriptor in between the calls to close() and dup2(). PR: threads/79887 Submitted by: Dmitrij Tejblum tejblum of yandex-team.ru Reviewed by: davidxu MFC after: 1 week --- lib/libc/stdio/freopen.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c index d718496..be7bc8a 100644 --- a/lib/libc/stdio/freopen.c +++ b/lib/libc/stdio/freopen.c @@ -150,14 +150,6 @@ freopen(file, mode, fp) /* Get a new descriptor to refer to the new file. */ f = _open(file, oflags, DEFFILEMODE); - if (f < 0 && isopen) { - /* If out of fd's close the old one and try again. */ - if (errno == ENFILE || errno == EMFILE) { - (void) (*fp->_close)(fp->_cookie); - isopen = 0; - f = _open(file, oflags, DEFFILEMODE); - } - } sverrno = errno; finish: @@ -165,9 +157,11 @@ finish: * Finish closing fp. Even if the open succeeded above, we cannot * keep fp->_base: it may be the wrong size. This loses the effect * of any setbuffer calls, but stdio has always done this before. + * + * Leave the existing file descriptor open until dup2() is called + * below to avoid races where a concurrent open() in another thread + * could claim the existing descriptor. */ - if (isopen) - (void) (*fp->_close)(fp->_cookie); if (fp->_flags & __SMBF) free((char *)fp->_bf._base); fp->_w = 0; @@ -186,6 +180,8 @@ finish: memset(&fp->_mbstate, 0, sizeof(mbstate_t)); if (f < 0) { /* did not get it after all */ + if (isopen) + (void) (*fp->_close)(fp->_cookie); fp->_flags = 0; /* set it free */ FUNLOCKFILE(fp); errno = sverrno; /* restore in case _close clobbered */ @@ -197,11 +193,12 @@ finish: * to maintain the descriptor. Various C library routines (perror) * assume stderr is always fd STDERR_FILENO, even if being freopen'd. */ - if (wantfd >= 0 && f != wantfd) { + if (wantfd >= 0) { if (_dup2(f, wantfd) >= 0) { (void)_close(f); f = wantfd; - } + } else + (void)_close(fp->_file); } /* -- cgit v1.1 From da2dde653e0b4157a383ca260e51c5bcf85a7414 Mon Sep 17 00:00:00 2001 From: mlaier Date: Thu, 9 Dec 2010 21:02:22 +0000 Subject: Fix a long standing (from the original 4.4BSD lite sources) race between vmspace_fork and vm_map_wire that would lead to "vm_fault_copy_wired: page missing" panics. While faulting in pages for a map entry that is being wired down, mark the containing map as busy. In vmspace_fork wait until the map is unbusy, before we try to copy the entries. Reviewed by: kib MFC after: 5 days Sponsored by: Isilon Systems, Inc. --- sys/vm/vm_map.c | 42 +++++++++++++++++++++++++++++++++++++++++- sys/vm/vm_map.h | 5 +++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 35552a6..1a51af8 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -671,6 +671,41 @@ vm_map_wakeup(vm_map_t map) wakeup(&map->root); } +void +vm_map_busy(vm_map_t map) +{ + + VM_MAP_ASSERT_LOCKED(map); + map->busy++; +} + +void +vm_map_unbusy(vm_map_t map) +{ + + VM_MAP_ASSERT_LOCKED(map); + KASSERT(map->busy, ("vm_map_unbusy: not busy")); + if (--map->busy == 0 && (map->flags & MAP_BUSY_WAKEUP)) { + vm_map_modflags(map, 0, MAP_BUSY_WAKEUP); + wakeup(&map->busy); + } +} + +void +vm_map_wait_busy(vm_map_t map) +{ + + VM_MAP_ASSERT_LOCKED(map); + while (map->busy) { + vm_map_modflags(map, MAP_BUSY_WAKEUP, 0); + if (map->system_map) + msleep(&map->busy, &map->system_mtx, 0, "mbusy", 0); + else + sx_sleep(&map->busy, &map->lock, 0, "mbusy", 0); + } + map->timestamp++; +} + long vmspace_resident_count(struct vmspace *vmspace) { @@ -718,6 +753,7 @@ _vm_map_init(vm_map_t map, pmap_t pmap, vm_offset_t min, vm_offset_t max) map->flags = 0; map->root = NULL; map->timestamp = 0; + map->busy = 0; } void @@ -2382,12 +2418,14 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, entry->object.vm_object->type == OBJT_SG); /* * Release the map lock, relying on the in-transition - * mark. + * mark. Mark the map busy for fork. */ + vm_map_busy(map); vm_map_unlock(map); rv = vm_fault_wire(map, saved_start, saved_end, fictitious); vm_map_lock(map); + vm_map_unbusy(map); if (last_timestamp + 1 != map->timestamp) { /* * Look again for the entry because the map was @@ -2995,6 +3033,8 @@ vmspace_fork(struct vmspace *vm1, vm_ooffset_t *fork_charge) int locked; vm_map_lock(old_map); + if (old_map->busy) + vm_map_wait_busy(old_map); vm2 = vmspace_alloc(old_map->min_offset, old_map->max_offset); if (vm2 == NULL) goto unlock_and_return; diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index f7fc5f5..fecbffe 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -187,12 +187,14 @@ struct vm_map { pmap_t pmap; /* (c) Physical map */ #define min_offset header.start /* (c) */ #define max_offset header.end /* (c) */ + int busy; }; /* * vm_flags_t values */ #define MAP_WIREFUTURE 0x01 /* wire all future pages */ +#define MAP_BUSY_WAKEUP 0x02 #ifdef _KERNEL static __inline vm_offset_t @@ -275,6 +277,9 @@ int _vm_map_lock_upgrade(vm_map_t map, const char *file, int line); void _vm_map_lock_downgrade(vm_map_t map, const char *file, int line); int vm_map_locked(vm_map_t map); void vm_map_wakeup(vm_map_t map); +void vm_map_busy(vm_map_t map); +void vm_map_unbusy(vm_map_t map); +void vm_map_wait_busy(vm_map_t map); #define vm_map_lock(map) _vm_map_lock(map, LOCK_FILE, LOCK_LINE) #define vm_map_unlock(map) _vm_map_unlock(map, LOCK_FILE, LOCK_LINE) -- cgit v1.1 From 3d43bf49cce8a92469a10d65a75094c9292d513d Mon Sep 17 00:00:00 2001 From: jkim Date: Thu, 9 Dec 2010 21:29:36 +0000 Subject: Remove AMD Family 0Fh, Model 6Bh, Stepping 2 from the list of P-state invariant CPUs. I do not believe this model is P-state invariant any more. Maybe cpufreq(4) was broken at the time of commit. :-( --- sys/x86/x86/tsc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c index ae2cba4..e39c4af 100644 --- a/sys/x86/x86/tsc.c +++ b/sys/x86/x86/tsc.c @@ -107,7 +107,7 @@ init_TSC(void) switch (cpu_vendor_id) { case CPU_VENDOR_AMD: if ((amd_pminfo & AMDPM_TSC_INVARIANT) || - CPUID_TO_FAMILY(cpu_id) >= 0x10 || cpu_id == 0x60fb2) + CPUID_TO_FAMILY(cpu_id) >= 0x10) tsc_is_invariant = 1; break; case CPU_VENDOR_INTEL: -- cgit v1.1 From 12dd9eb8e940c48f9fc30dbc137071b4fe5caead Mon Sep 17 00:00:00 2001 From: dim Date: Thu, 9 Dec 2010 21:31:21 +0000 Subject: Let all .c and .S files under lib/csu consistently use the __FBSDID() macro for identification, instead of several different hand-rolled variants (plain .ident, .ascii, etc). --- lib/csu/amd64/crt1.c | 5 +++-- lib/csu/amd64/crti.S | 6 +++--- lib/csu/amd64/crtn.S | 6 +++--- lib/csu/arm/crt1.c | 6 +++--- lib/csu/arm/crtn.S | 1 + lib/csu/i386-elf/crt1_c.c | 3 +++ lib/csu/i386-elf/crt1_s.S | 4 ++-- lib/csu/i386-elf/crti.S | 6 +++--- lib/csu/i386-elf/crtn.S | 6 +++--- lib/csu/ia64/crt1.S | 3 ++- lib/csu/ia64/crti.S | 3 +++ lib/csu/ia64/crtn.S | 3 +++ lib/csu/powerpc/crt1.c | 5 +++-- lib/csu/powerpc/crti.S | 9 ++++----- lib/csu/powerpc/crtn.S | 7 +++---- lib/csu/powerpc64/crt1.c | 5 +++-- lib/csu/powerpc64/crti.S | 8 ++++---- lib/csu/powerpc64/crtn.S | 7 +++---- lib/csu/sparc64/crt1.c | 5 +++-- lib/csu/sparc64/crti.S | 7 +++---- lib/csu/sparc64/crtn.S | 6 +++--- 21 files changed, 61 insertions(+), 50 deletions(-) diff --git a/lib/csu/amd64/crt1.c b/lib/csu/amd64/crt1.c index 3bc4809..998477a 100644 --- a/lib/csu/amd64/crt1.c +++ b/lib/csu/amd64/crt1.c @@ -24,6 +24,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + #ifndef lint #ifndef __GNUC__ #error "GCC is needed to compile this file" @@ -92,5 +95,3 @@ __asm__("eprol:"); _init(); exit( main(argc, argv, env) ); } - -__asm__(".ident\t\"$FreeBSD$\""); diff --git a/lib/csu/amd64/crti.S b/lib/csu/amd64/crti.S index c46f001..37698ba 100644 --- a/lib/csu/amd64/crti.S +++ b/lib/csu/amd64/crti.S @@ -23,6 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits .align 4 .globl _init @@ -36,6 +39,3 @@ _init: .type _fini,@function _fini: subq $8,%rsp - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/amd64/crtn.S b/lib/csu/amd64/crtn.S index d6d09da..eb6d4df 100644 --- a/lib/csu/amd64/crtn.S +++ b/lib/csu/amd64/crtn.S @@ -23,6 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits addq $8,%rsp ret @@ -30,6 +33,3 @@ .section .fini,"ax",@progbits addq $8,%rsp ret - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/arm/crt1.c b/lib/csu/arm/crt1.c index 4319f17..f2d4dbf 100644 --- a/lib/csu/arm/crt1.c +++ b/lib/csu/arm/crt1.c @@ -39,6 +39,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + #ifndef lint #ifndef __GNUC__ #error "GCC is needed to compile this file" @@ -49,7 +52,6 @@ #include "libc_private.h" #include "crtbrand.c" -#include struct Struct_Obj_Entry; struct ps_strings; @@ -136,5 +138,3 @@ __asm__(".text"); __asm__("eprol:"); __asm__(".previous"); #endif - -__asm__(".ident\t\"$FreeBSD$\""); diff --git a/lib/csu/arm/crtn.S b/lib/csu/arm/crtn.S index d148b1e..962f0ed 100644 --- a/lib/csu/arm/crtn.S +++ b/lib/csu/arm/crtn.S @@ -1,5 +1,6 @@ #include __FBSDID("$FreeBSD$"); + .section .init,"ax",%progbits ldmea fp, {fp, sp, pc} mov pc, lr diff --git a/lib/csu/i386-elf/crt1_c.c b/lib/csu/i386-elf/crt1_c.c index c38f267..1eadc7c 100644 --- a/lib/csu/i386-elf/crt1_c.c +++ b/lib/csu/i386-elf/crt1_c.c @@ -26,6 +26,9 @@ * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + #ifndef lint #ifndef __GNUC__ #error "GCC is needed to compile this file" diff --git a/lib/csu/i386-elf/crt1_s.S b/lib/csu/i386-elf/crt1_s.S index 949d164..f8c1d73 100644 --- a/lib/csu/i386-elf/crt1_s.S +++ b/lib/csu/i386-elf/crt1_s.S @@ -25,6 +25,8 @@ * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); .text .align 4 @@ -47,5 +49,3 @@ _start: int3 .cfi_endproc .size _start, . - _start - - .ident "$FreeBSD$" diff --git a/lib/csu/i386-elf/crti.S b/lib/csu/i386-elf/crti.S index bb11f3a..608dc21 100644 --- a/lib/csu/i386-elf/crti.S +++ b/lib/csu/i386-elf/crti.S @@ -23,6 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits .align 4 .globl _init @@ -36,6 +39,3 @@ _init: .type _fini,@function _fini: sub $12,%esp /* re-align stack pointer */ - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/i386-elf/crtn.S b/lib/csu/i386-elf/crtn.S index bc90d31..9ce5bec 100644 --- a/lib/csu/i386-elf/crtn.S +++ b/lib/csu/i386-elf/crtn.S @@ -23,6 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits add $12,%esp ret @@ -30,6 +33,3 @@ .section .fini,"ax",@progbits add $12,%esp ret - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/ia64/crt1.S b/lib/csu/ia64/crt1.S index 10e1a63..6ff9cd9 100644 --- a/lib/csu/ia64/crt1.S +++ b/lib/csu/ia64/crt1.S @@ -24,7 +24,8 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - .ident "$FreeBSD$" +#include +__FBSDID("$FreeBSD$"); .text diff --git a/lib/csu/ia64/crti.S b/lib/csu/ia64/crti.S index 1314cb3..66ef948 100644 --- a/lib/csu/ia64/crti.S +++ b/lib/csu/ia64/crti.S @@ -26,6 +26,9 @@ * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + /* * This file (and its companion crtn.S) form the terminators of the * .init and .fini sections. diff --git a/lib/csu/ia64/crtn.S b/lib/csu/ia64/crtn.S index 26d40d3..681fba3 100644 --- a/lib/csu/ia64/crtn.S +++ b/lib/csu/ia64/crtn.S @@ -26,6 +26,9 @@ * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + .file "crtn.S" .section .init,"ax",@progbits diff --git a/lib/csu/powerpc/crt1.c b/lib/csu/powerpc/crt1.c index 3a2f6dd..67de2f5 100644 --- a/lib/csu/powerpc/crt1.c +++ b/lib/csu/powerpc/crt1.c @@ -39,6 +39,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + #ifndef lint #ifndef __GNUC__ #error "GCC is needed to compile this file" @@ -120,5 +123,3 @@ __asm__(".text"); __asm__("eprol:"); __asm__(".previous"); #endif - -__asm__(".ident\t\"$FreeBSD$\""); diff --git a/lib/csu/powerpc/crti.S b/lib/csu/powerpc/crti.S index 75d4345..544bfa9 100644 --- a/lib/csu/powerpc/crti.S +++ b/lib/csu/powerpc/crti.S @@ -22,7 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - + +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits .align 2 .globl _init @@ -44,7 +47,3 @@ _fini: stw 31,12(1) stw 0,20(1) mr 31,1 - - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/powerpc/crtn.S b/lib/csu/powerpc/crtn.S index 80735cc..d3baa70 100644 --- a/lib/csu/powerpc/crtn.S +++ b/lib/csu/powerpc/crtn.S @@ -23,6 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits lwz 11,0(1) lwz 0,4(11) @@ -39,7 +42,3 @@ lwz 31,-4(11) mr 1,11 blr - - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/powerpc64/crt1.c b/lib/csu/powerpc64/crt1.c index 080691c..080bd4d 100644 --- a/lib/csu/powerpc64/crt1.c +++ b/lib/csu/powerpc64/crt1.c @@ -39,6 +39,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + #ifndef lint #ifndef __GNUC__ #error "GCC is needed to compile this file" @@ -119,5 +122,3 @@ __asm__(".text"); __asm__("eprol:"); __asm__(".previous"); #endif - -__asm__(".ident\t\"$FreeBSD$\""); diff --git a/lib/csu/powerpc64/crti.S b/lib/csu/powerpc64/crti.S index 4118765..edca7ba 100644 --- a/lib/csu/powerpc64/crti.S +++ b/lib/csu/powerpc64/crti.S @@ -22,7 +22,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - + +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits .align 2 .globl _init @@ -56,6 +59,3 @@ _fini: stdu 1,-48(1) mflr 0 std 0,64(1) - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/powerpc64/crtn.S b/lib/csu/powerpc64/crtn.S index 42ca083..c62f913 100644 --- a/lib/csu/powerpc64/crtn.S +++ b/lib/csu/powerpc64/crtn.S @@ -23,6 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .section .init,"ax",@progbits ld %r1,0(%r1) ld 0,16(%r1) @@ -35,7 +38,3 @@ ld 0,16(%r1) mtlr 0 blr - - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/sparc64/crt1.c b/lib/csu/sparc64/crt1.c index f27c59b..3593c95 100644 --- a/lib/csu/sparc64/crt1.c +++ b/lib/csu/sparc64/crt1.c @@ -30,6 +30,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + #ifndef lint #ifndef __GNUC__ #error "GCC is needed to compile this file" @@ -121,5 +124,3 @@ __asm__(".text"); __asm__("eprol:"); __asm__(".previous"); #endif - -__asm__(".ident\t\"$FreeBSD$\""); diff --git a/lib/csu/sparc64/crti.S b/lib/csu/sparc64/crti.S index e3e81af..9e529a5 100644 --- a/lib/csu/sparc64/crti.S +++ b/lib/csu/sparc64/crti.S @@ -26,6 +26,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .file "crti.S" /* The minimum stack frame size (bytes) is: @@ -52,7 +55,3 @@ _init: .align 4 _fini: save %sp,-192,%sp - - - .section .rodata -.ascii "$FreeBSD$\0" diff --git a/lib/csu/sparc64/crtn.S b/lib/csu/sparc64/crtn.S index 7c0d160..5b6d4a7 100644 --- a/lib/csu/sparc64/crtn.S +++ b/lib/csu/sparc64/crtn.S @@ -26,6 +26,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + .file "crtn.S" .section .init,"ax",@progbits @@ -37,6 +40,3 @@ .align 4 ret restore - - .section .rodata -.ascii "$FreeBSD$\0" -- cgit v1.1